diff options
-rw-r--r-- | drivers/net/wireless/ath/ath9k/common.c | 82 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/common.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 76 |
5 files changed, 77 insertions, 88 deletions
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c index 7902d287f671..cf768f2811eb 100644 --- a/drivers/net/wireless/ath/ath9k/common.c +++ b/drivers/net/wireless/ath/ath9k/common.c | |||
@@ -303,88 +303,6 @@ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb) | |||
303 | } | 303 | } |
304 | EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype); | 304 | EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype); |
305 | 305 | ||
306 | /* | ||
307 | * Calculate the RX filter to be set in the HW. | ||
308 | */ | ||
309 | u32 ath9k_cmn_calcrxfilter(struct ieee80211_hw *hw, struct ath_hw *ah, | ||
310 | unsigned int rxfilter) | ||
311 | { | ||
312 | #define RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR) | ||
313 | |||
314 | u32 rfilt; | ||
315 | |||
316 | rfilt = (ath9k_hw_getrxfilter(ah) & RX_FILTER_PRESERVE) | ||
317 | | ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST | ||
318 | | ATH9K_RX_FILTER_MCAST; | ||
319 | |||
320 | /* If not a STA, enable processing of Probe Requests */ | ||
321 | if (ah->opmode != NL80211_IFTYPE_STATION) | ||
322 | rfilt |= ATH9K_RX_FILTER_PROBEREQ; | ||
323 | |||
324 | /* | ||
325 | * Set promiscuous mode when FIF_PROMISC_IN_BSS is enabled for station | ||
326 | * mode interface or when in monitor mode. AP mode does not need this | ||
327 | * since it receives all in-BSS frames anyway. | ||
328 | */ | ||
329 | if (((ah->opmode != NL80211_IFTYPE_AP) && | ||
330 | (rxfilter & FIF_PROMISC_IN_BSS)) || | ||
331 | (ah->opmode == NL80211_IFTYPE_MONITOR)) | ||
332 | rfilt |= ATH9K_RX_FILTER_PROM; | ||
333 | |||
334 | if (rxfilter & FIF_CONTROL) | ||
335 | rfilt |= ATH9K_RX_FILTER_CONTROL; | ||
336 | |||
337 | if ((ah->opmode == NL80211_IFTYPE_STATION) && | ||
338 | !(rxfilter & FIF_BCN_PRBRESP_PROMISC)) | ||
339 | rfilt |= ATH9K_RX_FILTER_MYBEACON; | ||
340 | else | ||
341 | rfilt |= ATH9K_RX_FILTER_BEACON; | ||
342 | |||
343 | if ((AR_SREV_9280_10_OR_LATER(ah) || | ||
344 | AR_SREV_9285_10_OR_LATER(ah)) && | ||
345 | (ah->opmode == NL80211_IFTYPE_AP) && | ||
346 | (rxfilter & FIF_PSPOLL)) | ||
347 | rfilt |= ATH9K_RX_FILTER_PSPOLL; | ||
348 | |||
349 | if (conf_is_ht(&hw->conf)) | ||
350 | rfilt |= ATH9K_RX_FILTER_COMP_BAR; | ||
351 | |||
352 | return rfilt; | ||
353 | |||
354 | #undef RX_FILTER_PRESERVE | ||
355 | } | ||
356 | EXPORT_SYMBOL(ath9k_cmn_calcrxfilter); | ||
357 | |||
358 | /* | ||
359 | * Recv initialization for opmode change. | ||
360 | */ | ||
361 | void ath9k_cmn_opmode_init(struct ieee80211_hw *hw, struct ath_hw *ah, | ||
362 | unsigned int rxfilter) | ||
363 | { | ||
364 | struct ath_common *common = ath9k_hw_common(ah); | ||
365 | |||
366 | u32 rfilt, mfilt[2]; | ||
367 | |||
368 | /* configure rx filter */ | ||
369 | rfilt = ath9k_cmn_calcrxfilter(hw, ah, rxfilter); | ||
370 | ath9k_hw_setrxfilter(ah, rfilt); | ||
371 | |||
372 | /* configure bssid mask */ | ||
373 | if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) | ||
374 | ath_hw_setbssidmask(common); | ||
375 | |||
376 | /* configure operational mode */ | ||
377 | ath9k_hw_setopmode(ah); | ||
378 | |||
379 | /* Handle any link-level address change. */ | ||
380 | ath9k_hw_setmac(ah, common->macaddr); | ||
381 | |||
382 | /* calculate and install multicast filter */ | ||
383 | mfilt[0] = mfilt[1] = ~0; | ||
384 | ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]); | ||
385 | } | ||
386 | EXPORT_SYMBOL(ath9k_cmn_opmode_init); | ||
387 | |||
388 | static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan, | 306 | static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan, |
389 | enum nl80211_channel_type channel_type) | 307 | enum nl80211_channel_type channel_type) |
390 | { | 308 | { |
diff --git a/drivers/net/wireless/ath/ath9k/common.h b/drivers/net/wireless/ath/ath9k/common.h index bbcc57f6eba3..72a835d9e97f 100644 --- a/drivers/net/wireless/ath/ath9k/common.h +++ b/drivers/net/wireless/ath/ath9k/common.h | |||
@@ -128,10 +128,6 @@ void ath9k_cmn_rx_skb_postprocess(struct ath_common *common, | |||
128 | 128 | ||
129 | int ath9k_cmn_padpos(__le16 frame_control); | 129 | int ath9k_cmn_padpos(__le16 frame_control); |
130 | int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb); | 130 | int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb); |
131 | u32 ath9k_cmn_calcrxfilter(struct ieee80211_hw *hw, struct ath_hw *ah, | ||
132 | unsigned int rxfilter); | ||
133 | void ath9k_cmn_opmode_init(struct ieee80211_hw *hw, struct ath_hw *ah, | ||
134 | unsigned int rxfilter); | ||
135 | void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw, | 131 | void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw, |
136 | struct ath9k_channel *ichan); | 132 | struct ath9k_channel *ichan); |
137 | struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw, | 133 | struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 777064945fca..698e6f1a506a 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -415,6 +415,7 @@ int ath9k_rx_init(struct ath9k_htc_priv *priv); | |||
415 | void ath9k_rx_cleanup(struct ath9k_htc_priv *priv); | 415 | void ath9k_rx_cleanup(struct ath9k_htc_priv *priv); |
416 | void ath9k_host_rx_init(struct ath9k_htc_priv *priv); | 416 | void ath9k_host_rx_init(struct ath9k_htc_priv *priv); |
417 | void ath9k_rx_tasklet(unsigned long data); | 417 | void ath9k_rx_tasklet(unsigned long data); |
418 | u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv); | ||
418 | 419 | ||
419 | void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv); | 420 | void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv); |
420 | void ath9k_init_leds(struct ath9k_htc_priv *priv); | 421 | void ath9k_init_leds(struct ath9k_htc_priv *priv); |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 20a2c1341e20..e5f78c7b2b1f 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -1299,7 +1299,7 @@ static void ath9k_htc_configure_filter(struct ieee80211_hw *hw, | |||
1299 | *total_flags &= SUPPORTED_FILTERS; | 1299 | *total_flags &= SUPPORTED_FILTERS; |
1300 | 1300 | ||
1301 | priv->rxfilter = *total_flags; | 1301 | priv->rxfilter = *total_flags; |
1302 | rfilt = ath9k_cmn_calcrxfilter(hw, priv->ah, priv->rxfilter); | 1302 | rfilt = ath9k_htc_calcrxfilter(priv); |
1303 | ath9k_hw_setrxfilter(priv->ah, rfilt); | 1303 | ath9k_hw_setrxfilter(priv->ah, rfilt); |
1304 | 1304 | ||
1305 | ath_print(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG, | 1305 | ath_print(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG, |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index ac66cf0b2d53..94e299fabbb2 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -290,10 +290,84 @@ bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, | |||
290 | /* RX */ | 290 | /* RX */ |
291 | /******/ | 291 | /******/ |
292 | 292 | ||
293 | /* | ||
294 | * Calculate the RX filter to be set in the HW. | ||
295 | */ | ||
296 | u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv) | ||
297 | { | ||
298 | #define RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR) | ||
299 | |||
300 | struct ath_hw *ah = priv->ah; | ||
301 | u32 rfilt; | ||
302 | |||
303 | rfilt = (ath9k_hw_getrxfilter(ah) & RX_FILTER_PRESERVE) | ||
304 | | ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST | ||
305 | | ATH9K_RX_FILTER_MCAST; | ||
306 | |||
307 | /* If not a STA, enable processing of Probe Requests */ | ||
308 | if (ah->opmode != NL80211_IFTYPE_STATION) | ||
309 | rfilt |= ATH9K_RX_FILTER_PROBEREQ; | ||
310 | |||
311 | /* | ||
312 | * Set promiscuous mode when FIF_PROMISC_IN_BSS is enabled for station | ||
313 | * mode interface or when in monitor mode. AP mode does not need this | ||
314 | * since it receives all in-BSS frames anyway. | ||
315 | */ | ||
316 | if (((ah->opmode != NL80211_IFTYPE_AP) && | ||
317 | (priv->rxfilter & FIF_PROMISC_IN_BSS)) || | ||
318 | (ah->opmode == NL80211_IFTYPE_MONITOR)) | ||
319 | rfilt |= ATH9K_RX_FILTER_PROM; | ||
320 | |||
321 | if (priv->rxfilter & FIF_CONTROL) | ||
322 | rfilt |= ATH9K_RX_FILTER_CONTROL; | ||
323 | |||
324 | if ((ah->opmode == NL80211_IFTYPE_STATION) && | ||
325 | !(priv->rxfilter & FIF_BCN_PRBRESP_PROMISC)) | ||
326 | rfilt |= ATH9K_RX_FILTER_MYBEACON; | ||
327 | else | ||
328 | rfilt |= ATH9K_RX_FILTER_BEACON; | ||
329 | |||
330 | if (conf_is_ht(&priv->hw->conf)) | ||
331 | rfilt |= ATH9K_RX_FILTER_COMP_BAR; | ||
332 | |||
333 | return rfilt; | ||
334 | |||
335 | #undef RX_FILTER_PRESERVE | ||
336 | } | ||
337 | |||
338 | /* | ||
339 | * Recv initialization for opmode change. | ||
340 | */ | ||
341 | static void ath9k_htc_opmode_init(struct ath9k_htc_priv *priv) | ||
342 | { | ||
343 | struct ath_hw *ah = priv->ah; | ||
344 | struct ath_common *common = ath9k_hw_common(ah); | ||
345 | |||
346 | u32 rfilt, mfilt[2]; | ||
347 | |||
348 | /* configure rx filter */ | ||
349 | rfilt = ath9k_htc_calcrxfilter(priv); | ||
350 | ath9k_hw_setrxfilter(ah, rfilt); | ||
351 | |||
352 | /* configure bssid mask */ | ||
353 | if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) | ||
354 | ath_hw_setbssidmask(common); | ||
355 | |||
356 | /* configure operational mode */ | ||
357 | ath9k_hw_setopmode(ah); | ||
358 | |||
359 | /* Handle any link-level address change. */ | ||
360 | ath9k_hw_setmac(ah, common->macaddr); | ||
361 | |||
362 | /* calculate and install multicast filter */ | ||
363 | mfilt[0] = mfilt[1] = ~0; | ||
364 | ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]); | ||
365 | } | ||
366 | |||
293 | void ath9k_host_rx_init(struct ath9k_htc_priv *priv) | 367 | void ath9k_host_rx_init(struct ath9k_htc_priv *priv) |
294 | { | 368 | { |
295 | ath9k_hw_rxena(priv->ah); | 369 | ath9k_hw_rxena(priv->ah); |
296 | ath9k_cmn_opmode_init(priv->hw, priv->ah, priv->rxfilter); | 370 | ath9k_htc_opmode_init(priv); |
297 | ath9k_hw_startpcureceive(priv->ah); | 371 | ath9k_hw_startpcureceive(priv->ah); |
298 | priv->rx.last_rssi = ATH_RSSI_DUMMY_MARKER; | 372 | priv->rx.last_rssi = ATH_RSSI_DUMMY_MARKER; |
299 | } | 373 | } |