mac80211: add ieee80211_vif param to tsf functions
TSF can be kept per vif. Add ieee80211_vif param to set/get/reset_tsf, and move the debugfs entries to the per-vif directory. Update all the drivers that implement these callbacks. Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
129321804e
commit
37a41b4aff
@ -1249,7 +1249,8 @@ static int adm8211_hw_reset(struct ieee80211_hw *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 adm8211_get_tsft(struct ieee80211_hw *dev)
|
static u64 adm8211_get_tsft(struct ieee80211_hw *dev,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct adm8211_priv *priv = dev->priv;
|
struct adm8211_priv *priv = dev->priv;
|
||||||
u32 tsftl;
|
u32 tsftl;
|
||||||
|
@ -602,7 +602,7 @@ ath5k_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
|||||||
|
|
||||||
|
|
||||||
static u64
|
static u64
|
||||||
ath5k_get_tsf(struct ieee80211_hw *hw)
|
ath5k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath5k_hw *ah = hw->priv;
|
struct ath5k_hw *ah = hw->priv;
|
||||||
|
|
||||||
@ -611,7 +611,7 @@ ath5k_get_tsf(struct ieee80211_hw *hw)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
ath5k_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u64 tsf)
|
||||||
{
|
{
|
||||||
struct ath5k_hw *ah = hw->priv;
|
struct ath5k_hw *ah = hw->priv;
|
||||||
|
|
||||||
@ -620,7 +620,7 @@ ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ath5k_reset_tsf(struct ieee80211_hw *hw)
|
ath5k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath5k_hw *ah = hw->priv;
|
struct ath5k_hw *ah = hw->priv;
|
||||||
|
|
||||||
|
@ -1563,7 +1563,8 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
|
|||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
|
static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath9k_htc_priv *priv = hw->priv;
|
struct ath9k_htc_priv *priv = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
@ -1577,7 +1578,8 @@ static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
|
|||||||
return tsf;
|
return tsf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
static void ath9k_htc_set_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif, u64 tsf)
|
||||||
{
|
{
|
||||||
struct ath9k_htc_priv *priv = hw->priv;
|
struct ath9k_htc_priv *priv = hw->priv;
|
||||||
|
|
||||||
@ -1588,7 +1590,8 @@ static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
|||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw)
|
static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath9k_htc_priv *priv = hw->priv;
|
struct ath9k_htc_priv *priv = hw->priv;
|
||||||
|
|
||||||
|
@ -2143,7 +2143,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
|
|||||||
ath9k_ps_restore(sc);
|
ath9k_ps_restore(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
|
static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
@ -2157,7 +2157,9 @@ static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
|
|||||||
return tsf;
|
return tsf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
static void ath9k_set_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif,
|
||||||
|
u64 tsf)
|
||||||
{
|
{
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
|
|
||||||
@ -2168,7 +2170,7 @@ static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
|||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath9k_reset_tsf(struct ieee80211_hw *hw)
|
static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
|
|
||||||
|
@ -1078,7 +1078,8 @@ out:
|
|||||||
mutex_unlock(&ar->mutex);
|
mutex_unlock(&ar->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 carl9170_op_get_tsf(struct ieee80211_hw *hw)
|
static u64 carl9170_op_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ar9170 *ar = hw->priv;
|
struct ar9170 *ar = hw->priv;
|
||||||
struct carl9170_tsf_rsp tsf;
|
struct carl9170_tsf_rsp tsf;
|
||||||
|
@ -3599,7 +3599,7 @@ static int b43_op_get_stats(struct ieee80211_hw *hw,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
|
static u64 b43_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||||
struct b43_wldev *dev;
|
struct b43_wldev *dev;
|
||||||
@ -3618,7 +3618,8 @@ static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
|
|||||||
return tsf;
|
return tsf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void b43_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
static void b43_op_set_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif, u64 tsf)
|
||||||
{
|
{
|
||||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||||
struct b43_wldev *dev;
|
struct b43_wldev *dev;
|
||||||
|
@ -2220,7 +2220,8 @@ out:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iwl_legacy_mac_config);
|
EXPORT_SYMBOL(iwl_legacy_mac_config);
|
||||||
|
|
||||||
void iwl_legacy_mac_reset_tsf(struct ieee80211_hw *hw)
|
void iwl_legacy_mac_reset_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct iwl_priv *priv = hw->priv;
|
struct iwl_priv *priv = hw->priv;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -620,7 +620,8 @@ static inline const struct ieee80211_supported_band *iwl_get_hw_mode(
|
|||||||
|
|
||||||
/* mac80211 handlers */
|
/* mac80211 handlers */
|
||||||
int iwl_legacy_mac_config(struct ieee80211_hw *hw, u32 changed);
|
int iwl_legacy_mac_config(struct ieee80211_hw *hw, u32 changed);
|
||||||
void iwl_legacy_mac_reset_tsf(struct ieee80211_hw *hw);
|
void iwl_legacy_mac_reset_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif);
|
||||||
void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw,
|
void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *bss_conf,
|
struct ieee80211_bss_conf *bss_conf,
|
||||||
|
@ -1239,7 +1239,7 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry,
|
|||||||
* call, we must decrease the higher 32bits with 1 to get
|
* call, we must decrease the higher 32bits with 1 to get
|
||||||
* to correct value.
|
* to correct value.
|
||||||
*/
|
*/
|
||||||
tsf = rt2x00dev->ops->hw->get_tsf(rt2x00dev->hw);
|
tsf = rt2x00dev->ops->hw->get_tsf(rt2x00dev->hw, NULL);
|
||||||
rx_low = rt2x00_get_field32(word4, RXD_W4_RX_END_TIME);
|
rx_low = rt2x00_get_field32(word4, RXD_W4_RX_END_TIME);
|
||||||
rx_high = upper_32_bits(tsf);
|
rx_high = upper_32_bits(tsf);
|
||||||
|
|
||||||
@ -1673,7 +1673,8 @@ static int rt2400pci_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rt2400pci_get_tsf(struct ieee80211_hw *hw)
|
static u64 rt2400pci_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
@ -1966,7 +1966,8 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
|
|||||||
/*
|
/*
|
||||||
* IEEE80211 stack callback functions.
|
* IEEE80211 stack callback functions.
|
||||||
*/
|
*/
|
||||||
static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw)
|
static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
@ -4466,7 +4466,7 @@ int rt2800_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rt2800_conf_tx);
|
EXPORT_SYMBOL_GPL(rt2800_conf_tx);
|
||||||
|
|
||||||
u64 rt2800_get_tsf(struct ieee80211_hw *hw)
|
u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
@ -199,7 +199,7 @@ void rt2800_get_tkip_seq(struct ieee80211_hw *hw, u8 hw_key_idx, u32 *iv32,
|
|||||||
int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
|
int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
|
||||||
int rt2800_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
|
int rt2800_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
|
||||||
const struct ieee80211_tx_queue_params *params);
|
const struct ieee80211_tx_queue_params *params);
|
||||||
u64 rt2800_get_tsf(struct ieee80211_hw *hw);
|
u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||||
int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
enum ieee80211_ampdu_mlme_action action,
|
enum ieee80211_ampdu_mlme_action action,
|
||||||
struct ieee80211_sta *sta, u16 tid, u16 *ssn,
|
struct ieee80211_sta *sta, u16 tid, u16 *ssn,
|
||||||
|
@ -2940,7 +2940,7 @@ static int rt61pci_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rt61pci_get_tsf(struct ieee80211_hw *hw)
|
static u64 rt61pci_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
@ -2279,7 +2279,7 @@ static int rt73usb_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rt73usb_get_tsf(struct ieee80211_hw *hw)
|
static u64 rt73usb_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
@ -669,7 +669,8 @@ static void rtl8180_stop(struct ieee80211_hw *dev)
|
|||||||
rtl8180_free_tx_ring(dev, i);
|
rtl8180_free_tx_ring(dev, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rtl8180_get_tsf(struct ieee80211_hw *dev)
|
static u64 rtl8180_get_tsf(struct ieee80211_hw *dev,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rtl8180_priv *priv = dev->priv;
|
struct rtl8180_priv *priv = dev->priv;
|
||||||
|
|
||||||
@ -701,7 +702,7 @@ static void rtl8180_beacon_work(struct work_struct *work)
|
|||||||
* TODO: make hardware update beacon timestamp
|
* TODO: make hardware update beacon timestamp
|
||||||
*/
|
*/
|
||||||
mgmt = (struct ieee80211_mgmt *)skb->data;
|
mgmt = (struct ieee80211_mgmt *)skb->data;
|
||||||
mgmt->u.beacon.timestamp = cpu_to_le64(rtl8180_get_tsf(dev));
|
mgmt->u.beacon.timestamp = cpu_to_le64(rtl8180_get_tsf(dev, vif));
|
||||||
|
|
||||||
/* TODO: use actual beacon queue */
|
/* TODO: use actual beacon queue */
|
||||||
skb_set_queue_mapping(skb, 0);
|
skb_set_queue_mapping(skb, 0);
|
||||||
|
@ -1277,7 +1277,7 @@ static int rtl8187_conf_tx(struct ieee80211_hw *dev, u16 queue,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rtl8187_get_tsf(struct ieee80211_hw *dev)
|
static u64 rtl8187_get_tsf(struct ieee80211_hw *dev, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rtl8187_priv *priv = dev->priv;
|
struct rtl8187_priv *priv = dev->priv;
|
||||||
|
|
||||||
|
@ -775,7 +775,7 @@ out:
|
|||||||
mutex_unlock(&rtlpriv->locks.conf_mutex);
|
mutex_unlock(&rtlpriv->locks.conf_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 rtl_op_get_tsf(struct ieee80211_hw *hw)
|
static u64 rtl_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
@ -784,7 +784,8 @@ static u64 rtl_op_get_tsf(struct ieee80211_hw *hw)
|
|||||||
return tsf;
|
return tsf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
static void rtl_op_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
|
u64 tsf)
|
||||||
{
|
{
|
||||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||||
@ -794,7 +795,8 @@ static void rtl_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
|||||||
rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *) (&bibss));
|
rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *) (&bibss));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl_op_reset_tsf(struct ieee80211_hw *hw)
|
static void rtl_op_reset_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||||
u8 tmp = 0;
|
u8 tmp = 0;
|
||||||
|
@ -3815,7 +3815,8 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
|
static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct wl1271 *wl = hw->priv;
|
struct wl1271 *wl = hw->priv;
|
||||||
|
@ -1332,7 +1332,7 @@ static void zd_op_bss_info_changed(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 zd_op_get_tsf(struct ieee80211_hw *hw)
|
static u64 zd_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct zd_mac *mac = zd_hw_mac(hw);
|
struct zd_mac *mac = zd_hw_mac(hw);
|
||||||
return zd_chip_get_tsf(&mac->chip);
|
return zd_chip_get_tsf(&mac->chip);
|
||||||
|
@ -133,7 +133,8 @@ static int brcms_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
|||||||
bool set);
|
bool set);
|
||||||
static void brcms_ops_sw_scan_start(struct ieee80211_hw *hw);
|
static void brcms_ops_sw_scan_start(struct ieee80211_hw *hw);
|
||||||
static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw);
|
static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw);
|
||||||
static void brcms_ops_set_tsf(struct ieee80211_hw *hw, u64 tsf);
|
static void brcms_ops_set_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif, u64 tsf);
|
||||||
static int brcms_ops_get_stats(struct ieee80211_hw *hw,
|
static int brcms_ops_get_stats(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_low_level_stats *stats);
|
struct ieee80211_low_level_stats *stats);
|
||||||
static void brcms_ops_sta_notify(struct ieee80211_hw *hw,
|
static void brcms_ops_sta_notify(struct ieee80211_hw *hw,
|
||||||
@ -142,7 +143,8 @@ static void brcms_ops_sta_notify(struct ieee80211_hw *hw,
|
|||||||
struct ieee80211_sta *sta);
|
struct ieee80211_sta *sta);
|
||||||
static int brcms_ops_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
static int brcms_ops_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
const struct ieee80211_tx_queue_params *params);
|
const struct ieee80211_tx_queue_params *params);
|
||||||
static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw);
|
static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif);
|
||||||
static int brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
static int brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_sta *sta);
|
struct ieee80211_sta *sta);
|
||||||
static int brcms_ops_sta_remove(struct ieee80211_hw *hw,
|
static int brcms_ops_sta_remove(struct ieee80211_hw *hw,
|
||||||
@ -516,7 +518,8 @@ static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brcms_ops_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
static void brcms_ops_set_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif, u64 tsf)
|
||||||
{
|
{
|
||||||
wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
|
wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
|
||||||
return;
|
return;
|
||||||
@ -565,7 +568,8 @@ brcms_ops_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw)
|
static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
|
wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -277,7 +277,7 @@ static int wbsoft_config(struct ieee80211_hw *dev, u32 changed)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 wbsoft_get_tsf(struct ieee80211_hw *dev)
|
static u64 wbsoft_get_tsf(struct ieee80211_hw *dev, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
printk("wbsoft_get_tsf called\n");
|
printk("wbsoft_get_tsf called\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2000,9 +2000,10 @@ struct ieee80211_ops {
|
|||||||
enum sta_notify_cmd, struct ieee80211_sta *sta);
|
enum sta_notify_cmd, struct ieee80211_sta *sta);
|
||||||
int (*conf_tx)(struct ieee80211_hw *hw, u16 queue,
|
int (*conf_tx)(struct ieee80211_hw *hw, u16 queue,
|
||||||
const struct ieee80211_tx_queue_params *params);
|
const struct ieee80211_tx_queue_params *params);
|
||||||
u64 (*get_tsf)(struct ieee80211_hw *hw);
|
u64 (*get_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||||
void (*set_tsf)(struct ieee80211_hw *hw, u64 tsf);
|
void (*set_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
void (*reset_tsf)(struct ieee80211_hw *hw);
|
u64 tsf);
|
||||||
|
void (*reset_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||||
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
||||||
int (*ampdu_action)(struct ieee80211_hw *hw,
|
int (*ampdu_action)(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
|
@ -78,57 +78,6 @@ DEBUGFS_READONLY_FILE(wep_iv, "%#08x",
|
|||||||
DEBUGFS_READONLY_FILE(rate_ctrl_alg, "%s",
|
DEBUGFS_READONLY_FILE(rate_ctrl_alg, "%s",
|
||||||
local->rate_ctrl ? local->rate_ctrl->ops->name : "hw/driver");
|
local->rate_ctrl ? local->rate_ctrl->ops->name : "hw/driver");
|
||||||
|
|
||||||
static ssize_t tsf_read(struct file *file, char __user *user_buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = file->private_data;
|
|
||||||
u64 tsf;
|
|
||||||
|
|
||||||
tsf = drv_get_tsf(local);
|
|
||||||
|
|
||||||
return mac80211_format_buffer(user_buf, count, ppos, "0x%016llx\n",
|
|
||||||
(unsigned long long) tsf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t tsf_write(struct file *file,
|
|
||||||
const char __user *user_buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = file->private_data;
|
|
||||||
unsigned long long tsf;
|
|
||||||
char buf[100];
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
len = min(count, sizeof(buf) - 1);
|
|
||||||
if (copy_from_user(buf, user_buf, len))
|
|
||||||
return -EFAULT;
|
|
||||||
buf[len] = '\0';
|
|
||||||
|
|
||||||
if (strncmp(buf, "reset", 5) == 0) {
|
|
||||||
if (local->ops->reset_tsf) {
|
|
||||||
drv_reset_tsf(local);
|
|
||||||
wiphy_info(local->hw.wiphy, "debugfs reset TSF\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tsf = simple_strtoul(buf, NULL, 0);
|
|
||||||
if (local->ops->set_tsf) {
|
|
||||||
drv_set_tsf(local, tsf);
|
|
||||||
wiphy_info(local->hw.wiphy,
|
|
||||||
"debugfs set TSF to %#018llx\n", tsf);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct file_operations tsf_ops = {
|
|
||||||
.read = tsf_read,
|
|
||||||
.write = tsf_write,
|
|
||||||
.open = mac80211_open_file_generic,
|
|
||||||
.llseek = default_llseek,
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t reset_write(struct file *file, const char __user *user_buf,
|
static ssize_t reset_write(struct file *file, const char __user *user_buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
@ -447,7 +396,6 @@ void debugfs_hw_add(struct ieee80211_local *local)
|
|||||||
DEBUGFS_ADD(frequency);
|
DEBUGFS_ADD(frequency);
|
||||||
DEBUGFS_ADD(total_ps_buffered);
|
DEBUGFS_ADD(total_ps_buffered);
|
||||||
DEBUGFS_ADD(wep_iv);
|
DEBUGFS_ADD(wep_iv);
|
||||||
DEBUGFS_ADD(tsf);
|
|
||||||
DEBUGFS_ADD(queues);
|
DEBUGFS_ADD(queues);
|
||||||
DEBUGFS_ADD_MODE(reset, 0200);
|
DEBUGFS_ADD_MODE(reset, 0200);
|
||||||
DEBUGFS_ADD(noack);
|
DEBUGFS_ADD(noack);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "rate.h"
|
#include "rate.h"
|
||||||
#include "debugfs.h"
|
#include "debugfs.h"
|
||||||
#include "debugfs_netdev.h"
|
#include "debugfs_netdev.h"
|
||||||
|
#include "driver-ops.h"
|
||||||
|
|
||||||
static ssize_t ieee80211_if_read(
|
static ssize_t ieee80211_if_read(
|
||||||
struct ieee80211_sub_if_data *sdata,
|
struct ieee80211_sub_if_data *sdata,
|
||||||
@ -331,6 +332,46 @@ static ssize_t ieee80211_if_fmt_num_buffered_multicast(
|
|||||||
}
|
}
|
||||||
__IEEE80211_IF_FILE(num_buffered_multicast, NULL);
|
__IEEE80211_IF_FILE(num_buffered_multicast, NULL);
|
||||||
|
|
||||||
|
/* IBSS attributes */
|
||||||
|
static ssize_t ieee80211_if_fmt_tsf(
|
||||||
|
const struct ieee80211_sub_if_data *sdata, char *buf, int buflen)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
u64 tsf;
|
||||||
|
|
||||||
|
tsf = drv_get_tsf(local, (struct ieee80211_sub_if_data *)sdata);
|
||||||
|
|
||||||
|
return scnprintf(buf, buflen, "0x%016llx\n", (unsigned long long) tsf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t ieee80211_if_parse_tsf(
|
||||||
|
struct ieee80211_sub_if_data *sdata, const char *buf, int buflen)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
unsigned long long tsf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (strncmp(buf, "reset", 5) == 0) {
|
||||||
|
if (local->ops->reset_tsf) {
|
||||||
|
drv_reset_tsf(local, sdata);
|
||||||
|
wiphy_info(local->hw.wiphy, "debugfs reset TSF\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = kstrtoull(buf, 10, &tsf);
|
||||||
|
if (ret < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
if (local->ops->set_tsf) {
|
||||||
|
drv_set_tsf(local, sdata, tsf);
|
||||||
|
wiphy_info(local->hw.wiphy,
|
||||||
|
"debugfs set TSF to %#018llx\n", tsf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buflen;
|
||||||
|
}
|
||||||
|
__IEEE80211_IF_FILE_W(tsf);
|
||||||
|
|
||||||
|
|
||||||
/* WDS attributes */
|
/* WDS attributes */
|
||||||
IEEE80211_IF_FILE(peer, u.wds.remote_addr, MAC);
|
IEEE80211_IF_FILE(peer, u.wds.remote_addr, MAC);
|
||||||
|
|
||||||
@ -421,6 +462,11 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata)
|
|||||||
DEBUGFS_ADD_MODE(tkip_mic_test, 0200);
|
DEBUGFS_ADD_MODE(tkip_mic_test, 0200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void add_ibss_files(struct ieee80211_sub_if_data *sdata)
|
||||||
|
{
|
||||||
|
DEBUGFS_ADD_MODE(tsf, 0600);
|
||||||
|
}
|
||||||
|
|
||||||
static void add_wds_files(struct ieee80211_sub_if_data *sdata)
|
static void add_wds_files(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
DEBUGFS_ADD(drop_unencrypted);
|
DEBUGFS_ADD(drop_unencrypted);
|
||||||
@ -515,7 +561,7 @@ static void add_files(struct ieee80211_sub_if_data *sdata)
|
|||||||
add_sta_files(sdata);
|
add_sta_files(sdata);
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_ADHOC:
|
case NL80211_IFTYPE_ADHOC:
|
||||||
/* XXX */
|
add_ibss_files(sdata);
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
add_ap_files(sdata);
|
add_ap_files(sdata);
|
||||||
|
@ -427,36 +427,40 @@ static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u64 drv_get_tsf(struct ieee80211_local *local)
|
static inline u64 drv_get_tsf(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
u64 ret = -1ULL;
|
u64 ret = -1ULL;
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
trace_drv_get_tsf(local);
|
trace_drv_get_tsf(local, sdata);
|
||||||
if (local->ops->get_tsf)
|
if (local->ops->get_tsf)
|
||||||
ret = local->ops->get_tsf(&local->hw);
|
ret = local->ops->get_tsf(&local->hw, &sdata->vif);
|
||||||
trace_drv_return_u64(local, ret);
|
trace_drv_return_u64(local, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf)
|
static inline void drv_set_tsf(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
u64 tsf)
|
||||||
{
|
{
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
trace_drv_set_tsf(local, tsf);
|
trace_drv_set_tsf(local, sdata, tsf);
|
||||||
if (local->ops->set_tsf)
|
if (local->ops->set_tsf)
|
||||||
local->ops->set_tsf(&local->hw, tsf);
|
local->ops->set_tsf(&local->hw, &sdata->vif, tsf);
|
||||||
trace_drv_return_void(local);
|
trace_drv_return_void(local);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void drv_reset_tsf(struct ieee80211_local *local)
|
static inline void drv_reset_tsf(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
trace_drv_reset_tsf(local);
|
trace_drv_reset_tsf(local, sdata);
|
||||||
if (local->ops->reset_tsf)
|
if (local->ops->reset_tsf)
|
||||||
local->ops->reset_tsf(&local->hw);
|
local->ops->reset_tsf(&local->hw, &sdata->vif);
|
||||||
trace_drv_return_void(local);
|
trace_drv_return_void(local);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -726,35 +726,41 @@ TRACE_EVENT(drv_conf_tx,
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
DEFINE_EVENT(local_only_evt, drv_get_tsf,
|
DEFINE_EVENT(local_sdata_evt, drv_get_tsf,
|
||||||
TP_PROTO(struct ieee80211_local *local),
|
TP_PROTO(struct ieee80211_local *local,
|
||||||
TP_ARGS(local)
|
struct ieee80211_sub_if_data *sdata),
|
||||||
|
TP_ARGS(local, sdata)
|
||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(drv_set_tsf,
|
TRACE_EVENT(drv_set_tsf,
|
||||||
TP_PROTO(struct ieee80211_local *local, u64 tsf),
|
TP_PROTO(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
u64 tsf),
|
||||||
|
|
||||||
TP_ARGS(local, tsf),
|
TP_ARGS(local, sdata, tsf),
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
LOCAL_ENTRY
|
LOCAL_ENTRY
|
||||||
|
VIF_ENTRY
|
||||||
__field(u64, tsf)
|
__field(u64, tsf)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
LOCAL_ASSIGN;
|
LOCAL_ASSIGN;
|
||||||
|
VIF_ASSIGN;
|
||||||
__entry->tsf = tsf;
|
__entry->tsf = tsf;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
LOCAL_PR_FMT " tsf:%llu",
|
LOCAL_PR_FMT VIF_PR_FMT " tsf:%llu",
|
||||||
LOCAL_PR_ARG, (unsigned long long)__entry->tsf
|
LOCAL_PR_ARG, VIF_PR_ARG, (unsigned long long)__entry->tsf
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
DEFINE_EVENT(local_only_evt, drv_reset_tsf,
|
DEFINE_EVENT(local_sdata_evt, drv_reset_tsf,
|
||||||
TP_PROTO(struct ieee80211_local *local),
|
TP_PROTO(struct ieee80211_local *local,
|
||||||
TP_ARGS(local)
|
struct ieee80211_sub_if_data *sdata),
|
||||||
|
TP_ARGS(local, sdata)
|
||||||
);
|
);
|
||||||
|
|
||||||
DEFINE_EVENT(local_only_evt, drv_tx_last_beacon,
|
DEFINE_EVENT(local_only_evt, drv_tx_last_beacon,
|
||||||
|
@ -81,7 +81,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
lockdep_assert_held(&ifibss->mtx);
|
lockdep_assert_held(&ifibss->mtx);
|
||||||
|
|
||||||
/* Reset own TSF to allow time synchronization work. */
|
/* Reset own TSF to allow time synchronization work. */
|
||||||
drv_reset_tsf(local);
|
drv_reset_tsf(local, sdata);
|
||||||
|
|
||||||
skb = ifibss->skb;
|
skb = ifibss->skb;
|
||||||
rcu_assign_pointer(ifibss->presp, NULL);
|
rcu_assign_pointer(ifibss->presp, NULL);
|
||||||
@ -382,7 +382,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
|||||||
* second best option: get current TSF
|
* second best option: get current TSF
|
||||||
* (will return -1 if not supported)
|
* (will return -1 if not supported)
|
||||||
*/
|
*/
|
||||||
rx_timestamp = drv_get_tsf(local);
|
rx_timestamp = drv_get_tsf(local, sdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MAC80211_IBSS_DEBUG
|
#ifdef CONFIG_MAC80211_IBSS_DEBUG
|
||||||
|
Loading…
Reference in New Issue
Block a user