• Home
  • Raw
  • Download

Lines Matching refs:sc

41 static void ath_detach(struct ath_softc *sc);
45 static void bus_read_cachesize(struct ath_softc *sc, int *csz) in bus_read_cachesize() argument
49 pci_read_config_byte(sc->pdev, PCI_CACHE_LINE_SIZE, (u8 *)&u8tmp); in bus_read_cachesize()
62 static void ath_setcurmode(struct ath_softc *sc, enum wireless_mode mode) in ath_setcurmode() argument
64 sc->cur_rate_table = sc->hw_rate_table[mode]; in ath_setcurmode()
70 sc->sc_protrix = (mode == ATH9K_MODE_11G ? 1 : 0); in ath_setcurmode()
99 static void ath_update_txpow(struct ath_softc *sc) in ath_update_txpow() argument
101 struct ath_hal *ah = sc->sc_ah; in ath_update_txpow()
104 if (sc->sc_curtxpow != sc->sc_config.txpowlimit) { in ath_update_txpow()
105 ath9k_hw_set_txpowerlimit(ah, sc->sc_config.txpowlimit); in ath_update_txpow()
108 sc->sc_curtxpow = txpow; in ath_update_txpow()
147 static void ath_setup_rates(struct ath_softc *sc, enum ieee80211_band band) in ath_setup_rates() argument
156 rate_table = sc->hw_rate_table[ATH9K_MODE_11G]; in ath_setup_rates()
159 rate_table = sc->hw_rate_table[ATH9K_MODE_11A]; in ath_setup_rates()
168 sband = &sc->sbands[band]; in ath_setup_rates()
169 rate = sc->rates[band]; in ath_setup_rates()
180 DPRINTF(sc, ATH_DBG_CONFIG, "Rate: %2dMbps, ratecode: %2d\n", in ath_setup_rates()
185 static int ath_setup_channels(struct ath_softc *sc) in ath_setup_channels() argument
187 struct ath_hal *ah = sc->sc_ah; in ath_setup_channels()
202 DPRINTF(sc, ATH_DBG_FATAL, in ath_setup_channels()
209 band_2ghz = &sc->sbands[IEEE80211_BAND_2GHZ]; in ath_setup_channels()
210 band_5ghz = &sc->sbands[IEEE80211_BAND_5GHZ]; in ath_setup_channels()
211 chan_2ghz = sc->channels[IEEE80211_BAND_2GHZ]; in ath_setup_channels()
212 chan_5ghz = sc->channels[IEEE80211_BAND_5GHZ]; in ath_setup_channels()
228 DPRINTF(sc, ATH_DBG_CONFIG, "2MHz channel: %d, " in ath_setup_channels()
243 DPRINTF(sc, ATH_DBG_CONFIG, "5MHz channel: %d, " in ath_setup_channels()
257 static int ath_set_channel(struct ath_softc *sc, struct ath9k_channel *hchan) in ath_set_channel() argument
259 struct ath_hal *ah = sc->sc_ah; in ath_set_channel()
262 if (sc->sc_flags & SC_OP_INVALID) in ath_set_channel()
265 if (hchan->channel != sc->sc_ah->ah_curchan->channel || in ath_set_channel()
266 hchan->channelFlags != sc->sc_ah->ah_curchan->channelFlags || in ath_set_channel()
267 (sc->sc_flags & SC_OP_CHAINMASK_UPDATE) || in ath_set_channel()
268 (sc->sc_flags & SC_OP_FULL_RESET)) { in ath_set_channel()
280 ath_draintxq(sc, false); in ath_set_channel()
281 stopped = ath_stoprecv(sc); in ath_set_channel()
287 if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET)) in ath_set_channel()
290 DPRINTF(sc, ATH_DBG_CONFIG, in ath_set_channel()
292 sc->sc_ah->ah_curchan->channel, in ath_set_channel()
293 hchan->channel, hchan->channelFlags, sc->tx_chan_width); in ath_set_channel()
295 spin_lock_bh(&sc->sc_resetlock); in ath_set_channel()
296 if (!ath9k_hw_reset(ah, hchan, sc->tx_chan_width, in ath_set_channel()
297 sc->sc_tx_chainmask, sc->sc_rx_chainmask, in ath_set_channel()
298 sc->sc_ht_extprotspacing, fastcc, &status)) { in ath_set_channel()
299 DPRINTF(sc, ATH_DBG_FATAL, in ath_set_channel()
305 spin_unlock_bh(&sc->sc_resetlock); in ath_set_channel()
308 spin_unlock_bh(&sc->sc_resetlock); in ath_set_channel()
310 sc->sc_flags &= ~SC_OP_CHAINMASK_UPDATE; in ath_set_channel()
311 sc->sc_flags &= ~SC_OP_FULL_RESET; in ath_set_channel()
313 if (ath_startrecv(sc) != 0) { in ath_set_channel()
314 DPRINTF(sc, ATH_DBG_FATAL, in ath_set_channel()
319 ath_setcurmode(sc, ath_chan2mode(hchan)); in ath_set_channel()
320 ath_update_txpow(sc); in ath_set_channel()
321 ath9k_hw_set_interrupts(ah, sc->sc_imask); in ath_set_channel()
335 struct ath_softc *sc; in ath_ani_calibrate() local
343 sc = (struct ath_softc *)data; in ath_ani_calibrate()
344 ah = sc->sc_ah; in ath_ani_calibrate()
350 if (sc->rx.rxfilter & FIF_BCN_PRBRESP_PROMISC) in ath_ani_calibrate()
354 if ((timestamp - sc->sc_ani.sc_longcal_timer) >= ATH_LONG_CALINTERVAL) { in ath_ani_calibrate()
356 DPRINTF(sc, ATH_DBG_ANI, "longcal @%lu\n", jiffies); in ath_ani_calibrate()
357 sc->sc_ani.sc_longcal_timer = timestamp; in ath_ani_calibrate()
361 if (!sc->sc_ani.sc_caldone) { in ath_ani_calibrate()
362 if ((timestamp - sc->sc_ani.sc_shortcal_timer) >= in ath_ani_calibrate()
365 DPRINTF(sc, ATH_DBG_ANI, "shortcal @%lu\n", jiffies); in ath_ani_calibrate()
366 sc->sc_ani.sc_shortcal_timer = timestamp; in ath_ani_calibrate()
367 sc->sc_ani.sc_resetcal_timer = timestamp; in ath_ani_calibrate()
370 if ((timestamp - sc->sc_ani.sc_resetcal_timer) >= in ath_ani_calibrate()
373 &sc->sc_ani.sc_caldone); in ath_ani_calibrate()
374 if (sc->sc_ani.sc_caldone) in ath_ani_calibrate()
375 sc->sc_ani.sc_resetcal_timer = timestamp; in ath_ani_calibrate()
380 if ((timestamp - sc->sc_ani.sc_checkani_timer) >= in ath_ani_calibrate()
383 sc->sc_ani.sc_checkani_timer = timestamp; in ath_ani_calibrate()
390 ath9k_hw_ani_monitor(ah, &sc->sc_halstats, in ath_ani_calibrate()
398 sc->sc_rx_chainmask, longcal, in ath_ani_calibrate()
401 sc->sc_ani.sc_noise_floor = in ath_ani_calibrate()
405 DPRINTF(sc, ATH_DBG_ANI, in ath_ani_calibrate()
409 sc->sc_ani.sc_noise_floor); in ath_ani_calibrate()
411 DPRINTF(sc, ATH_DBG_ANY, in ath_ani_calibrate()
416 sc->sc_ani.sc_caldone = iscaldone; in ath_ani_calibrate()
426 if (sc->sc_ah->ah_config.enable_ani) in ath_ani_calibrate()
428 if (!sc->sc_ani.sc_caldone) in ath_ani_calibrate()
431 mod_timer(&sc->sc_ani.timer, jiffies + msecs_to_jiffies(cal_interval)); in ath_ani_calibrate()
439 static void ath_update_chainmask(struct ath_softc *sc, int is_ht) in ath_update_chainmask() argument
441 sc->sc_flags |= SC_OP_CHAINMASK_UPDATE; in ath_update_chainmask()
443 sc->sc_tx_chainmask = sc->sc_ah->ah_caps.tx_chainmask; in ath_update_chainmask()
444 sc->sc_rx_chainmask = sc->sc_ah->ah_caps.rx_chainmask; in ath_update_chainmask()
446 sc->sc_tx_chainmask = 1; in ath_update_chainmask()
447 sc->sc_rx_chainmask = 1; in ath_update_chainmask()
450 DPRINTF(sc, ATH_DBG_CONFIG, "tx chmask: %d, rx chmask: %d\n", in ath_update_chainmask()
451 sc->sc_tx_chainmask, sc->sc_rx_chainmask); in ath_update_chainmask()
454 static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta) in ath_node_attach() argument
460 if (sc->sc_flags & SC_OP_TXAGGR) in ath_node_attach()
461 ath_tx_node_init(sc, an); in ath_node_attach()
468 static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta) in ath_node_detach() argument
472 if (sc->sc_flags & SC_OP_TXAGGR) in ath_node_detach()
473 ath_tx_node_cleanup(sc, an); in ath_node_detach()
478 struct ath_softc *sc = (struct ath_softc *)data; in ath9k_tasklet() local
479 u32 status = sc->sc_intrstatus; in ath9k_tasklet()
483 ath_reset(sc, false); in ath9k_tasklet()
489 spin_lock_bh(&sc->rx.rxflushlock); in ath9k_tasklet()
490 ath_rx_tasklet(sc, 0); in ath9k_tasklet()
491 spin_unlock_bh(&sc->rx.rxflushlock); in ath9k_tasklet()
495 ath_tx_tasklet(sc); in ath9k_tasklet()
499 ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask); in ath9k_tasklet()
504 struct ath_softc *sc = dev; in ath_isr() local
505 struct ath_hal *ah = sc->sc_ah; in ath_isr()
510 if (sc->sc_flags & SC_OP_INVALID) { in ath_isr()
530 status &= sc->sc_imask; /* discard unasked-for bits */ in ath_isr()
539 sc->sc_intrstatus = status; in ath_isr()
550 tasklet_schedule(&sc->bcon_tasklet); in ath_isr()
586 ath9k_hw_procmibevent(ah, &sc->sc_halstats); in ath_isr()
587 ath9k_hw_set_interrupts(ah, sc->sc_imask); in ath_isr()
601 ath_debug_stat_interrupt(sc, status); in ath_isr()
605 ath9k_hw_set_interrupts(ah, (sc->sc_imask & ATH9K_INT_SWBA)); in ath_isr()
606 tasklet_schedule(&sc->intr_tq); in ath_isr()
612 static int ath_get_channel(struct ath_softc *sc, in ath_get_channel() argument
617 for (i = 0; i < sc->sc_ah->ah_nchan; i++) { in ath_get_channel()
618 if (sc->sc_ah->ah_channels[i].channel == chan->center_freq) in ath_get_channel()
625 static u32 ath_get_extchanmode(struct ath_softc *sc, in ath_get_extchanmode() argument
667 static int ath_keyset(struct ath_softc *sc, u16 keyix, in ath_keyset() argument
672 status = ath9k_hw_set_keycache_entry(sc->sc_ah, in ath_keyset()
678 static int ath_setkey_tkip(struct ath_softc *sc, u16 keyix, const u8 *key, in ath_setkey_tkip() argument
691 return ath_keyset(sc, keyix, hk, addr); in ath_setkey_tkip()
693 if (!sc->sc_splitmic) { in ath_setkey_tkip()
700 return ath_keyset(sc, keyix, hk, addr); in ath_setkey_tkip()
707 if (!ath_keyset(sc, keyix, hk, NULL)) { in ath_setkey_tkip()
709 DPRINTF(sc, ATH_DBG_KEYCACHE, in ath_setkey_tkip()
716 return ath_keyset(sc, keyix + 32, hk, addr); in ath_setkey_tkip()
719 static int ath_reserve_key_cache_slot_tkip(struct ath_softc *sc) in ath_reserve_key_cache_slot_tkip() argument
723 for (i = IEEE80211_WEP_NKID; i < sc->sc_keymax / 2; i++) { in ath_reserve_key_cache_slot_tkip()
724 if (test_bit(i, sc->sc_keymap) || in ath_reserve_key_cache_slot_tkip()
725 test_bit(i + 64, sc->sc_keymap)) in ath_reserve_key_cache_slot_tkip()
727 if (sc->sc_splitmic && in ath_reserve_key_cache_slot_tkip()
728 (test_bit(i + 32, sc->sc_keymap) || in ath_reserve_key_cache_slot_tkip()
729 test_bit(i + 64 + 32, sc->sc_keymap))) in ath_reserve_key_cache_slot_tkip()
738 static int ath_reserve_key_cache_slot(struct ath_softc *sc) in ath_reserve_key_cache_slot() argument
743 if (sc->sc_splitmic) { in ath_reserve_key_cache_slot()
744 for (i = IEEE80211_WEP_NKID; i < sc->sc_keymax / 4; i++) { in ath_reserve_key_cache_slot()
745 if (!test_bit(i, sc->sc_keymap) && in ath_reserve_key_cache_slot()
746 (test_bit(i + 32, sc->sc_keymap) || in ath_reserve_key_cache_slot()
747 test_bit(i + 64, sc->sc_keymap) || in ath_reserve_key_cache_slot()
748 test_bit(i + 64 + 32, sc->sc_keymap))) in ath_reserve_key_cache_slot()
750 if (!test_bit(i + 32, sc->sc_keymap) && in ath_reserve_key_cache_slot()
751 (test_bit(i, sc->sc_keymap) || in ath_reserve_key_cache_slot()
752 test_bit(i + 64, sc->sc_keymap) || in ath_reserve_key_cache_slot()
753 test_bit(i + 64 + 32, sc->sc_keymap))) in ath_reserve_key_cache_slot()
755 if (!test_bit(i + 64, sc->sc_keymap) && in ath_reserve_key_cache_slot()
756 (test_bit(i , sc->sc_keymap) || in ath_reserve_key_cache_slot()
757 test_bit(i + 32, sc->sc_keymap) || in ath_reserve_key_cache_slot()
758 test_bit(i + 64 + 32, sc->sc_keymap))) in ath_reserve_key_cache_slot()
760 if (!test_bit(i + 64 + 32, sc->sc_keymap) && in ath_reserve_key_cache_slot()
761 (test_bit(i, sc->sc_keymap) || in ath_reserve_key_cache_slot()
762 test_bit(i + 32, sc->sc_keymap) || in ath_reserve_key_cache_slot()
763 test_bit(i + 64, sc->sc_keymap))) in ath_reserve_key_cache_slot()
767 for (i = IEEE80211_WEP_NKID; i < sc->sc_keymax / 2; i++) { in ath_reserve_key_cache_slot()
768 if (!test_bit(i, sc->sc_keymap) && in ath_reserve_key_cache_slot()
769 test_bit(i + 64, sc->sc_keymap)) in ath_reserve_key_cache_slot()
771 if (test_bit(i, sc->sc_keymap) && in ath_reserve_key_cache_slot()
772 !test_bit(i + 64, sc->sc_keymap)) in ath_reserve_key_cache_slot()
778 for (i = IEEE80211_WEP_NKID; i < sc->sc_keymax; i++) { in ath_reserve_key_cache_slot()
784 if (sc->sc_splitmic) { in ath_reserve_key_cache_slot()
791 if (!test_bit(i, sc->sc_keymap)) in ath_reserve_key_cache_slot()
799 static int ath_key_config(struct ath_softc *sc, in ath_key_config() argument
835 vif = sc->sc_vaps[0]; in ath_key_config()
845 idx = ath_reserve_key_cache_slot_tkip(sc); in ath_key_config()
847 idx = ath_reserve_key_cache_slot(sc); in ath_key_config()
853 ret = ath_setkey_tkip(sc, idx, key->key, &hk, mac); in ath_key_config()
855 ret = ath_keyset(sc, idx, &hk, mac); in ath_key_config()
860 set_bit(idx, sc->sc_keymap); in ath_key_config()
862 set_bit(idx + 64, sc->sc_keymap); in ath_key_config()
863 if (sc->sc_splitmic) { in ath_key_config()
864 set_bit(idx + 32, sc->sc_keymap); in ath_key_config()
865 set_bit(idx + 64 + 32, sc->sc_keymap); in ath_key_config()
872 static void ath_key_delete(struct ath_softc *sc, struct ieee80211_key_conf *key) in ath_key_delete() argument
874 ath9k_hw_keyreset(sc->sc_ah, key->hw_key_idx); in ath_key_delete()
878 clear_bit(key->hw_key_idx, sc->sc_keymap); in ath_key_delete()
882 clear_bit(key->hw_key_idx + 64, sc->sc_keymap); in ath_key_delete()
883 if (sc->sc_splitmic) { in ath_key_delete()
884 clear_bit(key->hw_key_idx + 32, sc->sc_keymap); in ath_key_delete()
885 clear_bit(key->hw_key_idx + 64 + 32, sc->sc_keymap); in ath_key_delete()
909 static void ath9k_bss_assoc_info(struct ath_softc *sc, in ath9k_bss_assoc_info() argument
916 DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info ASSOC %d, bssid: %pM\n", in ath9k_bss_assoc_info()
917 bss_conf->aid, sc->sc_curbssid); in ath9k_bss_assoc_info()
921 sc->sc_curaid = bss_conf->aid; in ath9k_bss_assoc_info()
922 ath9k_hw_write_associd(sc->sc_ah, sc->sc_curbssid, in ath9k_bss_assoc_info()
923 sc->sc_curaid); in ath9k_bss_assoc_info()
927 ath_beacon_config(sc, 0); in ath9k_bss_assoc_info()
928 sc->sc_flags |= SC_OP_BEACONS; in ath9k_bss_assoc_info()
931 sc->sc_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER; in ath9k_bss_assoc_info()
932 sc->sc_halstats.ns_avgrssi = ATH_RSSI_DUMMY_MARKER; in ath9k_bss_assoc_info()
933 sc->sc_halstats.ns_avgtxrssi = ATH_RSSI_DUMMY_MARKER; in ath9k_bss_assoc_info()
934 sc->sc_halstats.ns_avgtxrate = ATH_RATE_DUMMY_MARKER; in ath9k_bss_assoc_info()
937 mod_timer(&sc->sc_ani.timer, in ath9k_bss_assoc_info()
941 DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info DISSOC\n"); in ath9k_bss_assoc_info()
942 sc->sc_curaid = 0; in ath9k_bss_assoc_info()
954 struct ath_softc *sc = led->sc; in ath_led_brightness() local
960 sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; in ath_led_brightness()
961 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, in ath_led_brightness()
963 !!(sc->sc_flags & SC_OP_LED_ASSOCIATED)); in ath_led_brightness()
967 sc->sc_flags |= SC_OP_LED_ASSOCIATED; in ath_led_brightness()
968 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 0); in ath_led_brightness()
975 static int ath_register_led(struct ath_softc *sc, struct ath_led *led, in ath_register_led() argument
980 led->sc = sc; in ath_register_led()
985 ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->led_cdev); in ath_register_led()
987 DPRINTF(sc, ATH_DBG_FATAL, in ath_register_led()
1002 static void ath_deinit_leds(struct ath_softc *sc) in ath_deinit_leds() argument
1004 ath_unregister_led(&sc->assoc_led); in ath_deinit_leds()
1005 sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; in ath_deinit_leds()
1006 ath_unregister_led(&sc->tx_led); in ath_deinit_leds()
1007 ath_unregister_led(&sc->rx_led); in ath_deinit_leds()
1008 ath_unregister_led(&sc->radio_led); in ath_deinit_leds()
1009 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); in ath_deinit_leds()
1012 static void ath_init_leds(struct ath_softc *sc) in ath_init_leds() argument
1018 ath9k_hw_cfg_output(sc->sc_ah, ATH_LED_PIN, in ath_init_leds()
1021 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); in ath_init_leds()
1023 trigger = ieee80211_get_radio_led_name(sc->hw); in ath_init_leds()
1024 snprintf(sc->radio_led.name, sizeof(sc->radio_led.name), in ath_init_leds()
1025 "ath9k-%s:radio", wiphy_name(sc->hw->wiphy)); in ath_init_leds()
1026 ret = ath_register_led(sc, &sc->radio_led, trigger); in ath_init_leds()
1027 sc->radio_led.led_type = ATH_LED_RADIO; in ath_init_leds()
1031 trigger = ieee80211_get_assoc_led_name(sc->hw); in ath_init_leds()
1032 snprintf(sc->assoc_led.name, sizeof(sc->assoc_led.name), in ath_init_leds()
1033 "ath9k-%s:assoc", wiphy_name(sc->hw->wiphy)); in ath_init_leds()
1034 ret = ath_register_led(sc, &sc->assoc_led, trigger); in ath_init_leds()
1035 sc->assoc_led.led_type = ATH_LED_ASSOC; in ath_init_leds()
1039 trigger = ieee80211_get_tx_led_name(sc->hw); in ath_init_leds()
1040 snprintf(sc->tx_led.name, sizeof(sc->tx_led.name), in ath_init_leds()
1041 "ath9k-%s:tx", wiphy_name(sc->hw->wiphy)); in ath_init_leds()
1042 ret = ath_register_led(sc, &sc->tx_led, trigger); in ath_init_leds()
1043 sc->tx_led.led_type = ATH_LED_TX; in ath_init_leds()
1047 trigger = ieee80211_get_rx_led_name(sc->hw); in ath_init_leds()
1048 snprintf(sc->rx_led.name, sizeof(sc->rx_led.name), in ath_init_leds()
1049 "ath9k-%s:rx", wiphy_name(sc->hw->wiphy)); in ath_init_leds()
1050 ret = ath_register_led(sc, &sc->rx_led, trigger); in ath_init_leds()
1051 sc->rx_led.led_type = ATH_LED_RX; in ath_init_leds()
1058 ath_deinit_leds(sc); in ath_init_leds()
1067 static void ath_radio_enable(struct ath_softc *sc) in ath_radio_enable() argument
1069 struct ath_hal *ah = sc->sc_ah; in ath_radio_enable()
1072 spin_lock_bh(&sc->sc_resetlock); in ath_radio_enable()
1074 sc->tx_chan_width, in ath_radio_enable()
1075 sc->sc_tx_chainmask, in ath_radio_enable()
1076 sc->sc_rx_chainmask, in ath_radio_enable()
1077 sc->sc_ht_extprotspacing, in ath_radio_enable()
1079 DPRINTF(sc, ATH_DBG_FATAL, in ath_radio_enable()
1088 spin_unlock_bh(&sc->sc_resetlock); in ath_radio_enable()
1090 ath_update_txpow(sc); in ath_radio_enable()
1091 if (ath_startrecv(sc) != 0) { in ath_radio_enable()
1092 DPRINTF(sc, ATH_DBG_FATAL, in ath_radio_enable()
1097 if (sc->sc_flags & SC_OP_BEACONS) in ath_radio_enable()
1098 ath_beacon_config(sc, ATH_IF_ID_ANY); /* restart beacons */ in ath_radio_enable()
1101 ath9k_hw_set_interrupts(ah, sc->sc_imask); in ath_radio_enable()
1108 ieee80211_wake_queues(sc->hw); in ath_radio_enable()
1111 static void ath_radio_disable(struct ath_softc *sc) in ath_radio_disable() argument
1113 struct ath_hal *ah = sc->sc_ah; in ath_radio_disable()
1117 ieee80211_stop_queues(sc->hw); in ath_radio_disable()
1126 ath_draintxq(sc, false); /* clear pending tx frames */ in ath_radio_disable()
1127 ath_stoprecv(sc); /* turn off frame recv */ in ath_radio_disable()
1128 ath_flushrecv(sc); /* flush recv queue */ in ath_radio_disable()
1130 spin_lock_bh(&sc->sc_resetlock); in ath_radio_disable()
1132 sc->tx_chan_width, in ath_radio_disable()
1133 sc->sc_tx_chainmask, in ath_radio_disable()
1134 sc->sc_rx_chainmask, in ath_radio_disable()
1135 sc->sc_ht_extprotspacing, in ath_radio_disable()
1137 DPRINTF(sc, ATH_DBG_FATAL, in ath_radio_disable()
1146 spin_unlock_bh(&sc->sc_resetlock); in ath_radio_disable()
1152 static bool ath_is_rfkill_set(struct ath_softc *sc) in ath_is_rfkill_set() argument
1154 struct ath_hal *ah = sc->sc_ah; in ath_is_rfkill_set()
1163 struct ath_softc *sc = container_of(work, struct ath_softc, in ath_rfkill_poll() local
1167 if (sc->sc_flags & SC_OP_INVALID) in ath_rfkill_poll()
1170 radio_on = !ath_is_rfkill_set(sc); in ath_rfkill_poll()
1176 if (radio_on == !!(sc->sc_flags & SC_OP_RFKILL_HW_BLOCKED)) { in ath_rfkill_poll()
1179 if (sc->sc_flags & SC_OP_RFKILL_SW_BLOCKED) { in ath_rfkill_poll()
1183 ath_radio_enable(sc); in ath_rfkill_poll()
1186 ath_radio_disable(sc); in ath_rfkill_poll()
1191 sc->sc_flags |= SC_OP_RFKILL_HW_BLOCKED; in ath_rfkill_poll()
1193 sc->sc_flags &= ~SC_OP_RFKILL_HW_BLOCKED; in ath_rfkill_poll()
1195 rfkill_force_state(sc->rf_kill.rfkill, state); in ath_rfkill_poll()
1198 queue_delayed_work(sc->hw->workqueue, &sc->rf_kill.rfkill_poll, in ath_rfkill_poll()
1205 struct ath_softc *sc = data; in ath_sw_toggle_radio() local
1209 if (!(sc->sc_flags & (SC_OP_RFKILL_HW_BLOCKED | in ath_sw_toggle_radio()
1211 ath_radio_disable(sc); in ath_sw_toggle_radio()
1212 sc->sc_flags |= SC_OP_RFKILL_SW_BLOCKED; in ath_sw_toggle_radio()
1215 if ((sc->sc_flags & SC_OP_RFKILL_SW_BLOCKED)) { in ath_sw_toggle_radio()
1216 sc->sc_flags &= ~SC_OP_RFKILL_SW_BLOCKED; in ath_sw_toggle_radio()
1217 if (sc->sc_flags & SC_OP_RFKILL_HW_BLOCKED) { in ath_sw_toggle_radio()
1218 DPRINTF(sc, ATH_DBG_FATAL, "Can't turn on the" in ath_sw_toggle_radio()
1222 ath_radio_enable(sc); in ath_sw_toggle_radio()
1231 static int ath_init_sw_rfkill(struct ath_softc *sc) in ath_init_sw_rfkill() argument
1233 sc->rf_kill.rfkill = rfkill_allocate(wiphy_dev(sc->hw->wiphy), in ath_init_sw_rfkill()
1235 if (!sc->rf_kill.rfkill) { in ath_init_sw_rfkill()
1236 DPRINTF(sc, ATH_DBG_FATAL, "Failed to allocate rfkill\n"); in ath_init_sw_rfkill()
1240 snprintf(sc->rf_kill.rfkill_name, sizeof(sc->rf_kill.rfkill_name), in ath_init_sw_rfkill()
1241 "ath9k-%s:rfkill", wiphy_name(sc->hw->wiphy)); in ath_init_sw_rfkill()
1242 sc->rf_kill.rfkill->name = sc->rf_kill.rfkill_name; in ath_init_sw_rfkill()
1243 sc->rf_kill.rfkill->data = sc; in ath_init_sw_rfkill()
1244 sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio; in ath_init_sw_rfkill()
1245 sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED; in ath_init_sw_rfkill()
1246 sc->rf_kill.rfkill->user_claim_unsupported = 1; in ath_init_sw_rfkill()
1252 static void ath_deinit_rfkill(struct ath_softc *sc) in ath_deinit_rfkill() argument
1254 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath_deinit_rfkill()
1255 cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); in ath_deinit_rfkill()
1257 if (sc->sc_flags & SC_OP_RFKILL_REGISTERED) { in ath_deinit_rfkill()
1258 rfkill_unregister(sc->rf_kill.rfkill); in ath_deinit_rfkill()
1259 sc->sc_flags &= ~SC_OP_RFKILL_REGISTERED; in ath_deinit_rfkill()
1260 sc->rf_kill.rfkill = NULL; in ath_deinit_rfkill()
1264 static int ath_start_rfkill_poll(struct ath_softc *sc) in ath_start_rfkill_poll() argument
1266 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath_start_rfkill_poll()
1267 queue_delayed_work(sc->hw->workqueue, in ath_start_rfkill_poll()
1268 &sc->rf_kill.rfkill_poll, 0); in ath_start_rfkill_poll()
1270 if (!(sc->sc_flags & SC_OP_RFKILL_REGISTERED)) { in ath_start_rfkill_poll()
1271 if (rfkill_register(sc->rf_kill.rfkill)) { in ath_start_rfkill_poll()
1272 DPRINTF(sc, ATH_DBG_FATAL, in ath_start_rfkill_poll()
1274 rfkill_free(sc->rf_kill.rfkill); in ath_start_rfkill_poll()
1277 ath_detach(sc); in ath_start_rfkill_poll()
1278 if (sc->pdev->irq) in ath_start_rfkill_poll()
1279 free_irq(sc->pdev->irq, sc); in ath_start_rfkill_poll()
1280 pci_iounmap(sc->pdev, sc->mem); in ath_start_rfkill_poll()
1281 pci_release_region(sc->pdev, 0); in ath_start_rfkill_poll()
1282 pci_disable_device(sc->pdev); in ath_start_rfkill_poll()
1283 ieee80211_free_hw(sc->hw); in ath_start_rfkill_poll()
1286 sc->sc_flags |= SC_OP_RFKILL_REGISTERED; in ath_start_rfkill_poll()
1294 static void ath_detach(struct ath_softc *sc) in ath_detach() argument
1296 struct ieee80211_hw *hw = sc->hw; in ath_detach()
1299 DPRINTF(sc, ATH_DBG_CONFIG, "Detach ATH hw\n"); in ath_detach()
1302 ath_deinit_rfkill(sc); in ath_detach()
1304 ath_deinit_leds(sc); in ath_detach()
1307 ath_rx_cleanup(sc); in ath_detach()
1308 ath_tx_cleanup(sc); in ath_detach()
1310 tasklet_kill(&sc->intr_tq); in ath_detach()
1311 tasklet_kill(&sc->bcon_tasklet); in ath_detach()
1313 if (!(sc->sc_flags & SC_OP_INVALID)) in ath_detach()
1314 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); in ath_detach()
1318 if (ATH_TXQ_SETUP(sc, i)) in ath_detach()
1319 ath_tx_cleanupq(sc, &sc->tx.txq[i]); in ath_detach()
1321 ath9k_hw_detach(sc->sc_ah); in ath_detach()
1322 ath9k_exit_debug(sc); in ath_detach()
1325 static int ath_init(u16 devid, struct ath_softc *sc) in ath_init() argument
1333 sc->sc_flags |= SC_OP_INVALID; in ath_init()
1335 if (ath9k_init_debug(sc) < 0) in ath_init()
1338 spin_lock_init(&sc->sc_resetlock); in ath_init()
1339 spin_lock_init(&sc->sc_serial_rw); in ath_init()
1340 mutex_init(&sc->mutex); in ath_init()
1341 tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc); in ath_init()
1342 tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet, in ath_init()
1343 (unsigned long)sc); in ath_init()
1349 bus_read_cachesize(sc, &csz); in ath_init()
1351 sc->sc_cachelsz = csz << 2; /* convert to bytes */ in ath_init()
1353 ah = ath9k_hw_attach(devid, sc, sc->mem, &status); in ath_init()
1355 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1360 sc->sc_ah = ah; in ath_init()
1363 sc->sc_keymax = ah->ah_caps.keycache_size; in ath_init()
1364 if (sc->sc_keymax > ATH_KEYMAX) { in ath_init()
1365 DPRINTF(sc, ATH_DBG_KEYCACHE, in ath_init()
1367 ATH_KEYMAX, sc->sc_keymax); in ath_init()
1368 sc->sc_keymax = ATH_KEYMAX; in ath_init()
1375 for (i = 0; i < sc->sc_keymax; i++) in ath_init()
1380 error = ath_setup_channels(sc); in ath_init()
1385 sc->sc_ah->ah_opmode = NL80211_IFTYPE_MONITOR; in ath_init()
1390 ath_rate_attach(sc); in ath_init()
1391 ath_setup_rates(sc, IEEE80211_BAND_2GHZ); in ath_init()
1392 ath_setup_rates(sc, IEEE80211_BAND_5GHZ); in ath_init()
1400 sc->beacon.beaconq = ath_beaconq_setup(ah); in ath_init()
1401 if (sc->beacon.beaconq == -1) { in ath_init()
1402 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1407 sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); in ath_init()
1408 if (sc->beacon.cabq == NULL) { in ath_init()
1409 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1415 sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME; in ath_init()
1416 ath_cabq_update(sc); in ath_init()
1418 for (i = 0; i < ARRAY_SIZE(sc->tx.hwq_map); i++) in ath_init()
1419 sc->tx.hwq_map[i] = -1; in ath_init()
1423 if (!ath_tx_setup(sc, ATH9K_WME_AC_BK)) { in ath_init()
1424 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1430 if (!ath_tx_setup(sc, ATH9K_WME_AC_BE)) { in ath_init()
1431 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1436 if (!ath_tx_setup(sc, ATH9K_WME_AC_VI)) { in ath_init()
1437 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1442 if (!ath_tx_setup(sc, ATH9K_WME_AC_VO)) { in ath_init()
1443 DPRINTF(sc, ATH_DBG_FATAL, in ath_init()
1452 sc->sc_ani.sc_noise_floor = ATH_DEFAULT_NOISE_FLOOR; in ath_init()
1453 setup_timer(&sc->sc_ani.timer, ath_ani_calibrate, (unsigned long)sc); in ath_init()
1463 ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC, in ath_init()
1479 sc->sc_splitmic = 1; in ath_init()
1486 sc->sc_config.txpowlimit = ATH_TXPOWER_MAX; in ath_init()
1487 sc->sc_config.txpowlimit_override = 0; in ath_init()
1491 sc->sc_flags |= SC_OP_TXAGGR; in ath_init()
1492 sc->sc_flags |= SC_OP_RXAGGR; in ath_init()
1495 sc->sc_tx_chainmask = ah->ah_caps.tx_chainmask; in ath_init()
1496 sc->sc_rx_chainmask = ah->ah_caps.rx_chainmask; in ath_init()
1499 sc->rx.defant = ath9k_hw_getdefantenna(ah); in ath_init()
1501 ath9k_hw_getmac(ah, sc->sc_myaddr); in ath_init()
1503 ath9k_hw_getbssidmask(ah, sc->sc_bssidmask); in ath_init()
1504 ATH_SET_VAP_BSSID_MASK(sc->sc_bssidmask); in ath_init()
1505 ath9k_hw_setbssidmask(ah, sc->sc_bssidmask); in ath_init()
1508 sc->beacon.slottime = ATH9K_SLOT_TIME_9; /* default to short slot time */ in ath_init()
1511 for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) in ath_init()
1512 sc->beacon.bslot[i] = ATH_IF_ID_ANY; in ath_init()
1515 sc->sc_config.swBeaconProcess = 1; in ath_init()
1519 sc->sbands[IEEE80211_BAND_2GHZ].channels = in ath_init()
1520 sc->channels[IEEE80211_BAND_2GHZ]; in ath_init()
1521 sc->sbands[IEEE80211_BAND_2GHZ].bitrates = in ath_init()
1522 sc->rates[IEEE80211_BAND_2GHZ]; in ath_init()
1523 sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ; in ath_init()
1525 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->ah_caps.wireless_modes)) { in ath_init()
1526 sc->sbands[IEEE80211_BAND_5GHZ].channels = in ath_init()
1527 sc->channels[IEEE80211_BAND_5GHZ]; in ath_init()
1528 sc->sbands[IEEE80211_BAND_5GHZ].bitrates = in ath_init()
1529 sc->rates[IEEE80211_BAND_5GHZ]; in ath_init()
1530 sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ; in ath_init()
1537 if (ATH_TXQ_SETUP(sc, i)) in ath_init()
1538 ath_tx_cleanupq(sc, &sc->tx.txq[i]); in ath_init()
1542 ath9k_exit_debug(sc); in ath_init()
1547 static int ath_attach(u16 devid, struct ath_softc *sc) in ath_attach() argument
1549 struct ieee80211_hw *hw = sc->hw; in ath_attach()
1552 DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n"); in ath_attach()
1554 error = ath_init(devid, sc); in ath_attach()
1560 SET_IEEE80211_PERM_ADDR(hw, sc->sc_myaddr); in ath_attach()
1580 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) { in ath_attach()
1581 setup_ht_cap(&sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); in ath_attach()
1582 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->ah_caps.wireless_modes)) in ath_attach()
1583 setup_ht_cap(&sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); in ath_attach()
1586 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &sc->sbands[IEEE80211_BAND_2GHZ]; in ath_attach()
1587 if (test_bit(ATH9K_MODE_11A, sc->sc_ah->ah_caps.wireless_modes)) in ath_attach()
1589 &sc->sbands[IEEE80211_BAND_5GHZ]; in ath_attach()
1592 error = ath_tx_init(sc, ATH_TXBUF); in ath_attach()
1596 error = ath_rx_init(sc, ATH_RXBUF); in ath_attach()
1602 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath_attach()
1603 INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll); in ath_attach()
1606 error = ath_init_sw_rfkill(sc); in ath_attach()
1614 ath_init_leds(sc); in ath_attach()
1621 if (ATH_TXQ_SETUP(sc, i)) in ath_attach()
1622 ath_tx_cleanupq(sc, &sc->tx.txq[i]); in ath_attach()
1624 ath9k_hw_detach(sc->sc_ah); in ath_attach()
1625 ath9k_exit_debug(sc); in ath_attach()
1630 int ath_reset(struct ath_softc *sc, bool retry_tx) in ath_reset() argument
1632 struct ath_hal *ah = sc->sc_ah; in ath_reset()
1637 ath_draintxq(sc, retry_tx); in ath_reset()
1638 ath_stoprecv(sc); in ath_reset()
1639 ath_flushrecv(sc); in ath_reset()
1641 spin_lock_bh(&sc->sc_resetlock); in ath_reset()
1642 if (!ath9k_hw_reset(ah, sc->sc_ah->ah_curchan, in ath_reset()
1643 sc->tx_chan_width, in ath_reset()
1644 sc->sc_tx_chainmask, sc->sc_rx_chainmask, in ath_reset()
1645 sc->sc_ht_extprotspacing, false, &status)) { in ath_reset()
1646 DPRINTF(sc, ATH_DBG_FATAL, in ath_reset()
1650 spin_unlock_bh(&sc->sc_resetlock); in ath_reset()
1652 if (ath_startrecv(sc) != 0) in ath_reset()
1653 DPRINTF(sc, ATH_DBG_FATAL, "Unable to start recv logic\n"); in ath_reset()
1660 ath_setcurmode(sc, ath_chan2mode(sc->sc_ah->ah_curchan)); in ath_reset()
1662 ath_update_txpow(sc); in ath_reset()
1664 if (sc->sc_flags & SC_OP_BEACONS) in ath_reset()
1665 ath_beacon_config(sc, ATH_IF_ID_ANY); /* restart beacons */ in ath_reset()
1667 ath9k_hw_set_interrupts(ah, sc->sc_imask); in ath_reset()
1672 if (ATH_TXQ_SETUP(sc, i)) { in ath_reset()
1673 spin_lock_bh(&sc->tx.txq[i].axq_lock); in ath_reset()
1674 ath_txq_schedule(sc, &sc->tx.txq[i]); in ath_reset()
1675 spin_unlock_bh(&sc->tx.txq[i].axq_lock); in ath_reset()
1688 int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, in ath_descdma_setup() argument
1701 DPRINTF(sc, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n", in ath_descdma_setup()
1706 DPRINTF(sc, ATH_DBG_FATAL, "ath_desc not DWORD aligned\n"); in ath_descdma_setup()
1720 if (!(sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_4KB_SPLITTRANS)) { in ath_descdma_setup()
1734 dd->dd_desc = pci_alloc_consistent(sc->pdev, in ath_descdma_setup()
1742 DPRINTF(sc, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n", in ath_descdma_setup()
1761 if (!(sc->sc_ah->ah_caps.hw_caps & in ath_descdma_setup()
1782 pci_free_consistent(sc->pdev, in ath_descdma_setup()
1792 void ath_descdma_cleanup(struct ath_softc *sc, in ath_descdma_cleanup() argument
1796 pci_free_consistent(sc->pdev, in ath_descdma_cleanup()
1804 int ath_get_hal_qnum(u16 queue, struct ath_softc *sc) in ath_get_hal_qnum() argument
1810 qnum = sc->tx.hwq_map[ATH9K_WME_AC_VO]; in ath_get_hal_qnum()
1813 qnum = sc->tx.hwq_map[ATH9K_WME_AC_VI]; in ath_get_hal_qnum()
1816 qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE]; in ath_get_hal_qnum()
1819 qnum = sc->tx.hwq_map[ATH9K_WME_AC_BK]; in ath_get_hal_qnum()
1822 qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE]; in ath_get_hal_qnum()
1829 int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc) in ath_get_mac80211_qnum() argument
1860 struct ath_softc *sc = hw->priv; in ath9k_start() local
1865 DPRINTF(sc, ATH_DBG_CONFIG, "Starting driver with " in ath9k_start()
1870 pos = ath_get_channel(sc, curchan); in ath9k_start()
1872 DPRINTF(sc, ATH_DBG_FATAL, "Invalid channel: %d\n", curchan->center_freq); in ath9k_start()
1877 sc->tx_chan_width = ATH9K_HT_MACMODE_20; in ath9k_start()
1878 sc->sc_ah->ah_channels[pos].chanmode = in ath9k_start()
1880 init_channel = &sc->sc_ah->ah_channels[pos]; in ath9k_start()
1883 ath9k_hw_configpcipowersave(sc->sc_ah, 0); in ath9k_start()
1892 spin_lock_bh(&sc->sc_resetlock); in ath9k_start()
1893 if (!ath9k_hw_reset(sc->sc_ah, init_channel, in ath9k_start()
1894 sc->tx_chan_width, in ath9k_start()
1895 sc->sc_tx_chainmask, sc->sc_rx_chainmask, in ath9k_start()
1896 sc->sc_ht_extprotspacing, false, &status)) { in ath9k_start()
1897 DPRINTF(sc, ATH_DBG_FATAL, in ath9k_start()
1902 spin_unlock_bh(&sc->sc_resetlock); in ath9k_start()
1905 spin_unlock_bh(&sc->sc_resetlock); in ath9k_start()
1911 ath_update_txpow(sc); in ath9k_start()
1920 if (ath_startrecv(sc) != 0) { in ath9k_start()
1921 DPRINTF(sc, ATH_DBG_FATAL, in ath9k_start()
1928 sc->sc_imask = ATH9K_INT_RX | ATH9K_INT_TX in ath9k_start()
1932 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_GTT) in ath9k_start()
1933 sc->sc_imask |= ATH9K_INT_GTT; in ath9k_start()
1935 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) in ath9k_start()
1936 sc->sc_imask |= ATH9K_INT_CST; in ath9k_start()
1942 if (ath9k_hw_phycounters(sc->sc_ah) && in ath9k_start()
1943 ((sc->sc_ah->ah_opmode == NL80211_IFTYPE_STATION) || in ath9k_start()
1944 (sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC))) in ath9k_start()
1945 sc->sc_imask |= ATH9K_INT_MIB; in ath9k_start()
1952 if ((sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_ENHANCEDPM) && in ath9k_start()
1953 (sc->sc_ah->ah_opmode == NL80211_IFTYPE_STATION) && in ath9k_start()
1954 !sc->sc_config.swBeaconProcess) in ath9k_start()
1955 sc->sc_imask |= ATH9K_INT_TIM; in ath9k_start()
1957 ath_setcurmode(sc, ath_chan2mode(init_channel)); in ath9k_start()
1959 sc->sc_flags &= ~SC_OP_INVALID; in ath9k_start()
1962 sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); in ath9k_start()
1963 ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask); in ath9k_start()
1965 ieee80211_wake_queues(sc->hw); in ath9k_start()
1968 error = ath_start_rfkill_poll(sc); in ath9k_start()
1979 struct ath_softc *sc = hw->priv; in ath9k_tx() local
1993 sc->tx.seq_no += 0x10; in ath9k_tx()
1995 hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); in ath9k_tx()
2010 txctl.txq = ath_test_get_txq(sc, skb); in ath9k_tx()
2014 DPRINTF(sc, ATH_DBG_XMIT, "transmitting packet, skb: %p\n", skb); in ath9k_tx()
2016 if (ath_tx_start(sc, skb, &txctl) != 0) { in ath9k_tx()
2017 DPRINTF(sc, ATH_DBG_XMIT, "TX failed\n"); in ath9k_tx()
2029 struct ath_softc *sc = hw->priv; in ath9k_stop() local
2031 if (sc->sc_flags & SC_OP_INVALID) { in ath9k_stop()
2032 DPRINTF(sc, ATH_DBG_ANY, "Device not present\n"); in ath9k_stop()
2036 DPRINTF(sc, ATH_DBG_CONFIG, "Cleaning up\n"); in ath9k_stop()
2038 ieee80211_stop_queues(sc->hw); in ath9k_stop()
2042 ath9k_hw_set_interrupts(sc->sc_ah, 0); in ath9k_stop()
2044 if (!(sc->sc_flags & SC_OP_INVALID)) { in ath9k_stop()
2045 ath_draintxq(sc, false); in ath9k_stop()
2046 ath_stoprecv(sc); in ath9k_stop()
2047 ath9k_hw_phy_disable(sc->sc_ah); in ath9k_stop()
2049 sc->rx.rxlink = NULL; in ath9k_stop()
2052 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath9k_stop()
2053 cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); in ath9k_stop()
2056 ath9k_hw_disable(sc->sc_ah); in ath9k_stop()
2057 ath9k_hw_configpcipowersave(sc->sc_ah, 1); in ath9k_stop()
2059 sc->sc_flags |= SC_OP_INVALID; in ath9k_stop()
2061 DPRINTF(sc, ATH_DBG_CONFIG, "Driver halt\n"); in ath9k_stop()
2067 struct ath_softc *sc = hw->priv; in ath9k_add_interface() local
2073 if (sc->sc_nvaps) in ath9k_add_interface()
2087 DPRINTF(sc, ATH_DBG_FATAL, in ath9k_add_interface()
2092 DPRINTF(sc, ATH_DBG_CONFIG, "Attach a VAP of type: %d\n", ic_opmode); in ath9k_add_interface()
2099 ath9k_hw_set_tsfadjust(sc->sc_ah, 1); in ath9k_add_interface()
2101 sc->sc_vaps[0] = conf->vif; in ath9k_add_interface()
2102 sc->sc_nvaps++; in ath9k_add_interface()
2105 sc->sc_ah->ah_opmode = ic_opmode; in ath9k_add_interface()
2110 mod_timer(&sc->sc_ani.timer, in ath9k_add_interface()
2120 struct ath_softc *sc = hw->priv; in ath9k_remove_interface() local
2123 DPRINTF(sc, ATH_DBG_CONFIG, "Detach Interface\n"); in ath9k_remove_interface()
2126 del_timer_sync(&sc->sc_ani.timer); in ath9k_remove_interface()
2129 if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP || in ath9k_remove_interface()
2130 sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC) { in ath9k_remove_interface()
2131 ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); in ath9k_remove_interface()
2132 ath_beacon_return(sc, avp); in ath9k_remove_interface()
2135 sc->sc_flags &= ~SC_OP_BEACONS; in ath9k_remove_interface()
2137 sc->sc_vaps[0] = NULL; in ath9k_remove_interface()
2138 sc->sc_nvaps--; in ath9k_remove_interface()
2143 struct ath_softc *sc = hw->priv; in ath9k_config() local
2146 mutex_lock(&sc->mutex); in ath9k_config()
2152 DPRINTF(sc, ATH_DBG_CONFIG, "Set channel: %d MHz\n", in ath9k_config()
2155 pos = ath_get_channel(sc, curchan); in ath9k_config()
2157 DPRINTF(sc, ATH_DBG_FATAL, "Invalid channel: %d\n", in ath9k_config()
2159 mutex_unlock(&sc->mutex); in ath9k_config()
2163 sc->tx_chan_width = ATH9K_HT_MACMODE_20; in ath9k_config()
2164 sc->sc_ah->ah_channels[pos].chanmode = in ath9k_config()
2171 sc->tx_chan_width = ATH9K_HT_MACMODE_2040; in ath9k_config()
2173 sc->sc_ah->ah_channels[pos].chanmode = in ath9k_config()
2174 ath_get_extchanmode(sc, curchan, in ath9k_config()
2178 ath_update_chainmask(sc, conf->ht.enabled); in ath9k_config()
2180 if (ath_set_channel(sc, &sc->sc_ah->ah_channels[pos]) < 0) { in ath9k_config()
2181 DPRINTF(sc, ATH_DBG_FATAL, "Unable to set channel\n"); in ath9k_config()
2182 mutex_unlock(&sc->mutex); in ath9k_config()
2188 sc->sc_config.txpowlimit = 2 * conf->power_level; in ath9k_config()
2190 mutex_unlock(&sc->mutex); in ath9k_config()
2198 struct ath_softc *sc = hw->priv; in ath9k_config_interface() local
2199 struct ath_hal *ah = sc->sc_ah; in ath9k_config_interface()
2210 ath9k_hw_write_associd(ah, sc->sc_myaddr, 0); in ath9k_config_interface()
2212 sc->sc_flags |= SC_OP_FULL_RESET; in ath9k_config_interface()
2221 memcpy(sc->sc_curbssid, conf->bssid, ETH_ALEN); in ath9k_config_interface()
2222 sc->sc_curaid = 0; in ath9k_config_interface()
2223 ath9k_hw_write_associd(sc->sc_ah, sc->sc_curbssid, in ath9k_config_interface()
2224 sc->sc_curaid); in ath9k_config_interface()
2227 sc->sc_config.ath_aggr_prot = 0; in ath9k_config_interface()
2229 DPRINTF(sc, ATH_DBG_CONFIG, in ath9k_config_interface()
2231 rfilt, sc->sc_curbssid, sc->sc_curaid); in ath9k_config_interface()
2234 sc->sc_flags &= ~SC_OP_BEACONS ; in ath9k_config_interface()
2253 ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); in ath9k_config_interface()
2255 error = ath_beacon_alloc(sc, 0); in ath9k_config_interface()
2259 ath_beacon_sync(sc, 0); in ath9k_config_interface()
2265 if (ath9k_hw_keyisvalid(sc->sc_ah, (u16)i)) in ath9k_config_interface()
2266 ath9k_hw_keysetmac(sc->sc_ah, in ath9k_config_interface()
2268 sc->sc_curbssid); in ath9k_config_interface()
2273 ath_update_chainmask(sc, 0); in ath9k_config_interface()
2293 struct ath_softc *sc = hw->priv; in ath9k_configure_filter() local
2299 sc->rx.rxfilter = *total_flags; in ath9k_configure_filter()
2300 rfilt = ath_calcrxfilter(sc); in ath9k_configure_filter()
2301 ath9k_hw_setrxfilter(sc->sc_ah, rfilt); in ath9k_configure_filter()
2305 ath9k_hw_write_associd(sc->sc_ah, ath_bcast_mac, 0); in ath9k_configure_filter()
2308 DPRINTF(sc, ATH_DBG_CONFIG, "Set HW RX filter: 0x%x\n", sc->rx.rxfilter); in ath9k_configure_filter()
2316 struct ath_softc *sc = hw->priv; in ath9k_sta_notify() local
2320 ath_node_attach(sc, sta); in ath9k_sta_notify()
2323 ath_node_detach(sc, sta); in ath9k_sta_notify()
2334 struct ath_softc *sc = hw->priv; in ath9k_conf_tx() local
2345 qnum = ath_get_hal_qnum(queue, sc); in ath9k_conf_tx()
2347 DPRINTF(sc, ATH_DBG_CONFIG, in ath9k_conf_tx()
2353 ret = ath_txq_update(sc, qnum, &qi); in ath9k_conf_tx()
2355 DPRINTF(sc, ATH_DBG_FATAL, "TXQ Update failed\n"); in ath9k_conf_tx()
2366 struct ath_softc *sc = hw->priv; in ath9k_set_key() local
2369 DPRINTF(sc, ATH_DBG_KEYCACHE, "Set HW Key\n"); in ath9k_set_key()
2373 ret = ath_key_config(sc, addr, key); in ath9k_set_key()
2384 ath_key_delete(sc, key); in ath9k_set_key()
2398 struct ath_softc *sc = hw->priv; in ath9k_bss_info_changed() local
2401 DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n", in ath9k_bss_info_changed()
2404 sc->sc_flags |= SC_OP_PREAMBLE_SHORT; in ath9k_bss_info_changed()
2406 sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT; in ath9k_bss_info_changed()
2410 DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n", in ath9k_bss_info_changed()
2414 sc->sc_flags |= SC_OP_PROTECT_ENABLE; in ath9k_bss_info_changed()
2416 sc->sc_flags &= ~SC_OP_PROTECT_ENABLE; in ath9k_bss_info_changed()
2420 DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", in ath9k_bss_info_changed()
2422 ath9k_bss_assoc_info(sc, vif, bss_conf); in ath9k_bss_info_changed()
2429 struct ath_softc *sc = hw->priv; in ath9k_get_tsf() local
2430 struct ath_hal *ah = sc->sc_ah; in ath9k_get_tsf()
2439 struct ath_softc *sc = hw->priv; in ath9k_reset_tsf() local
2440 struct ath_hal *ah = sc->sc_ah; in ath9k_reset_tsf()
2450 struct ath_softc *sc = hw->priv; in ath9k_ampdu_action() local
2455 if (!(sc->sc_flags & SC_OP_RXAGGR)) in ath9k_ampdu_action()
2461 ret = ath_tx_aggr_start(sc, sta, tid, ssn); in ath9k_ampdu_action()
2463 DPRINTF(sc, ATH_DBG_FATAL, in ath9k_ampdu_action()
2469 ret = ath_tx_aggr_stop(sc, sta, tid); in ath9k_ampdu_action()
2471 DPRINTF(sc, ATH_DBG_FATAL, in ath9k_ampdu_action()
2477 ath_tx_aggr_resume(sc, sta, tid); in ath9k_ampdu_action()
2480 DPRINTF(sc, ATH_DBG_FATAL, "Unknown AMPDU action\n"); in ath9k_ampdu_action()
2564 struct ath_softc *sc; in ath_pci_probe() local
2645 sc = hw->priv; in ath_pci_probe()
2646 sc->hw = hw; in ath_pci_probe()
2647 sc->pdev = pdev; in ath_pci_probe()
2648 sc->mem = mem; in ath_pci_probe()
2650 if (ath_attach(id->device, sc) != 0) { in ath_pci_probe()
2657 if (request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath", sc)) { in ath_pci_probe()
2664 ah = sc->sc_ah; in ath_pci_probe()
2677 ath_detach(sc); in ath_pci_probe()
2692 struct ath_softc *sc = hw->priv; in ath_pci_remove() local
2694 ath_detach(sc); in ath_pci_remove()
2696 free_irq(pdev->irq, sc); in ath_pci_remove()
2697 pci_iounmap(pdev, sc->mem); in ath_pci_remove()
2708 struct ath_softc *sc = hw->priv; in ath_pci_suspend() local
2710 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); in ath_pci_suspend()
2713 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath_pci_suspend()
2714 cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); in ath_pci_suspend()
2727 struct ath_softc *sc = hw->priv; in ath_pci_resume() local
2745 ath9k_hw_cfg_output(sc->sc_ah, ATH_LED_PIN, in ath_pci_resume()
2747 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); in ath_pci_resume()
2754 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) in ath_pci_resume()
2755 queue_delayed_work(sc->hw->workqueue, in ath_pci_resume()
2756 &sc->rf_kill.rfkill_poll, 0); in ath_pci_resume()