Lines Matching refs:dev
365 static void b43_wireless_core_exit(struct b43_wldev *dev);
366 static int b43_wireless_core_init(struct b43_wldev *dev);
367 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
368 static int b43_wireless_core_start(struct b43_wldev *dev);
467 static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val) in b43_ram_write() argument
473 macctl = b43_read32(dev, B43_MMIO_MACCTL); in b43_ram_write()
477 b43_write32(dev, B43_MMIO_RAM_CONTROL, offset); in b43_ram_write()
479 b43_write32(dev, B43_MMIO_RAM_DATA, val); in b43_ram_write()
482 static inline void b43_shm_control_word(struct b43_wldev *dev, in b43_shm_control_word() argument
491 b43_write32(dev, B43_MMIO_SHM_CONTROL, control); in b43_shm_control_word()
494 u32 b43_shm_read32(struct b43_wldev *dev, u16 routing, u16 offset) in b43_shm_read32() argument
502 b43_shm_control_word(dev, routing, offset >> 2); in b43_shm_read32()
503 ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED); in b43_shm_read32()
504 b43_shm_control_word(dev, routing, (offset >> 2) + 1); in b43_shm_read32()
505 ret |= ((u32)b43_read16(dev, B43_MMIO_SHM_DATA)) << 16; in b43_shm_read32()
511 b43_shm_control_word(dev, routing, offset); in b43_shm_read32()
512 ret = b43_read32(dev, B43_MMIO_SHM_DATA); in b43_shm_read32()
517 u16 b43_shm_read16(struct b43_wldev *dev, u16 routing, u16 offset) in b43_shm_read16() argument
525 b43_shm_control_word(dev, routing, offset >> 2); in b43_shm_read16()
526 ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED); in b43_shm_read16()
532 b43_shm_control_word(dev, routing, offset); in b43_shm_read16()
533 ret = b43_read16(dev, B43_MMIO_SHM_DATA); in b43_shm_read16()
538 void b43_shm_write32(struct b43_wldev *dev, u16 routing, u16 offset, u32 value) in b43_shm_write32() argument
544 b43_shm_control_word(dev, routing, offset >> 2); in b43_shm_write32()
545 b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED, in b43_shm_write32()
547 b43_shm_control_word(dev, routing, (offset >> 2) + 1); in b43_shm_write32()
548 b43_write16(dev, B43_MMIO_SHM_DATA, in b43_shm_write32()
554 b43_shm_control_word(dev, routing, offset); in b43_shm_write32()
555 b43_write32(dev, B43_MMIO_SHM_DATA, value); in b43_shm_write32()
558 void b43_shm_write16(struct b43_wldev *dev, u16 routing, u16 offset, u16 value) in b43_shm_write16() argument
564 b43_shm_control_word(dev, routing, offset >> 2); in b43_shm_write16()
565 b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED, value); in b43_shm_write16()
570 b43_shm_control_word(dev, routing, offset); in b43_shm_write16()
571 b43_write16(dev, B43_MMIO_SHM_DATA, value); in b43_shm_write16()
575 u64 b43_hf_read(struct b43_wldev *dev) in b43_hf_read() argument
579 ret = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF3); in b43_hf_read()
581 ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF2); in b43_hf_read()
583 ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF1); in b43_hf_read()
589 void b43_hf_write(struct b43_wldev *dev, u64 value) in b43_hf_write() argument
596 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF1, lo); in b43_hf_write()
597 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF2, mi); in b43_hf_write()
598 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF3, hi); in b43_hf_write()
602 static u16 b43_fwcapa_read(struct b43_wldev *dev) in b43_fwcapa_read() argument
604 B43_WARN_ON(!dev->fw.opensource); in b43_fwcapa_read()
605 return b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_FWCAPA); in b43_fwcapa_read()
608 void b43_tsf_read(struct b43_wldev *dev, u64 *tsf) in b43_tsf_read() argument
612 B43_WARN_ON(dev->dev->core_rev < 3); in b43_tsf_read()
616 low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW); in b43_tsf_read()
617 high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH); in b43_tsf_read()
624 static void b43_time_lock(struct b43_wldev *dev) in b43_time_lock() argument
626 b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_TBTTHOLD); in b43_time_lock()
628 b43_read32(dev, B43_MMIO_MACCTL); in b43_time_lock()
631 static void b43_time_unlock(struct b43_wldev *dev) in b43_time_unlock() argument
633 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_TBTTHOLD, 0); in b43_time_unlock()
635 b43_read32(dev, B43_MMIO_MACCTL); in b43_time_unlock()
638 static void b43_tsf_write_locked(struct b43_wldev *dev, u64 tsf) in b43_tsf_write_locked() argument
642 B43_WARN_ON(dev->dev->core_rev < 3); in b43_tsf_write_locked()
648 b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, low); in b43_tsf_write_locked()
650 b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, high); in b43_tsf_write_locked()
654 void b43_tsf_write(struct b43_wldev *dev, u64 tsf) in b43_tsf_write() argument
656 b43_time_lock(dev); in b43_tsf_write()
657 b43_tsf_write_locked(dev, tsf); in b43_tsf_write()
658 b43_time_unlock(dev); in b43_tsf_write()
662 void b43_macfilter_set(struct b43_wldev *dev, u16 offset, const u8 *mac) in b43_macfilter_set() argument
671 b43_write16(dev, B43_MMIO_MACFILTER_CONTROL, offset); in b43_macfilter_set()
675 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data); in b43_macfilter_set()
678 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data); in b43_macfilter_set()
681 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data); in b43_macfilter_set()
684 static void b43_write_mac_bssid_templates(struct b43_wldev *dev) in b43_write_mac_bssid_templates() argument
692 bssid = dev->wl->bssid; in b43_write_mac_bssid_templates()
693 mac = dev->wl->mac_addr; in b43_write_mac_bssid_templates()
695 b43_macfilter_set(dev, B43_MACFILTER_BSSID, bssid); in b43_write_mac_bssid_templates()
706 b43_ram_write(dev, 0x20 + i, tmp); in b43_write_mac_bssid_templates()
710 static void b43_upload_card_macaddress(struct b43_wldev *dev) in b43_upload_card_macaddress() argument
712 b43_write_mac_bssid_templates(dev); in b43_upload_card_macaddress()
713 b43_macfilter_set(dev, B43_MACFILTER_SELF, dev->wl->mac_addr); in b43_upload_card_macaddress()
716 static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time) in b43_set_slot_time() argument
720 if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) in b43_set_slot_time()
722 b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time); in b43_set_slot_time()
732 static void b43_short_slot_timing_enable(struct b43_wldev *dev) in b43_short_slot_timing_enable() argument
734 b43_set_slot_time(dev, 9); in b43_short_slot_timing_enable()
737 static void b43_short_slot_timing_disable(struct b43_wldev *dev) in b43_short_slot_timing_disable() argument
739 b43_set_slot_time(dev, 20); in b43_short_slot_timing_disable()
745 void b43_dummy_transmission(struct b43_wldev *dev, bool ofdm, bool pa_on) in b43_dummy_transmission() argument
747 struct b43_phy *phy = &dev->phy; in b43_dummy_transmission()
767 b43_ram_write(dev, i * 4, buffer[i]); in b43_dummy_transmission()
769 b43_write16(dev, B43_MMIO_XMTSEL, 0x0000); in b43_dummy_transmission()
771 if (dev->dev->core_rev < 11) in b43_dummy_transmission()
772 b43_write16(dev, B43_MMIO_WEPCTL, 0x0000); in b43_dummy_transmission()
774 b43_write16(dev, B43_MMIO_WEPCTL, 0x0100); in b43_dummy_transmission()
777 b43_write16(dev, B43_MMIO_TXE0_PHYCTL, value); in b43_dummy_transmission()
780 b43_write16(dev, B43_MMIO_TXE0_PHYCTL1, 0x1A02); in b43_dummy_transmission()
782 b43_write16(dev, B43_MMIO_TXE0_WM_0, 0x0000); in b43_dummy_transmission()
783 b43_write16(dev, B43_MMIO_TXE0_WM_1, 0x0000); in b43_dummy_transmission()
785 b43_write16(dev, B43_MMIO_XMTTPLATETXPTR, 0x0000); in b43_dummy_transmission()
786 b43_write16(dev, B43_MMIO_XMTTXCNT, 0x0014); in b43_dummy_transmission()
787 b43_write16(dev, B43_MMIO_XMTSEL, 0x0826); in b43_dummy_transmission()
788 b43_write16(dev, B43_MMIO_TXE0_CTL, 0x0000); in b43_dummy_transmission()
796 b43_write16(dev, B43_MMIO_TXE0_AUX, 0x00D0); in b43_dummy_transmission()
799 b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0050); in b43_dummy_transmission()
802 b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0030); in b43_dummy_transmission()
804 b43_read16(dev, B43_MMIO_TXE0_AUX); in b43_dummy_transmission()
807 b43_radio_write16(dev, 0x0051, 0x0017); in b43_dummy_transmission()
809 value = b43_read16(dev, B43_MMIO_TXE0_STATUS); in b43_dummy_transmission()
815 value = b43_read16(dev, B43_MMIO_TXE0_STATUS); in b43_dummy_transmission()
821 value = b43_read16(dev, B43_MMIO_IFSSTAT); in b43_dummy_transmission()
827 b43_radio_write16(dev, 0x0051, 0x0037); in b43_dummy_transmission()
830 static void key_write(struct b43_wldev *dev, in key_write() argument
839 kidx = b43_kidx_to_fw(dev, index); in key_write()
841 b43_shm_write16(dev, B43_SHM_SHARED, in key_write()
845 offset = dev->ktp + (index * B43_SEC_KEYSIZE); in key_write()
849 b43_shm_write16(dev, B43_SHM_SHARED, offset + i, value); in key_write()
853 static void keymac_write(struct b43_wldev *dev, u8 index, const u8 *addr) in keymac_write() argument
858 if (b43_new_kidx_api(dev)) in keymac_write()
880 b43_shm_write32(dev, B43_SHM_RCMTA, in keymac_write()
882 b43_shm_write16(dev, B43_SHM_RCMTA, in keymac_write()
903 static void rx_tkip_phase1_write(struct b43_wldev *dev, u8 index, u32 iv32, in rx_tkip_phase1_write() argument
913 if (b43_new_kidx_api(dev)) in rx_tkip_phase1_write()
925 if (b43_debug(dev, B43_DBG_KEYS)) { in rx_tkip_phase1_write()
926 b43dbg(dev->wl, "rx_tkip_phase1_write : idx 0x%x, iv32 0x%x\n", in rx_tkip_phase1_write()
932 b43_shm_write16(dev, B43_SHM_SHARED, offset + i, in rx_tkip_phase1_write()
935 b43_shm_write16(dev, B43_SHM_SHARED, offset + i, iv32); in rx_tkip_phase1_write()
936 b43_shm_write16(dev, B43_SHM_SHARED, offset + i + 2, iv32 >> 16); in rx_tkip_phase1_write()
946 struct b43_wldev *dev; in b43_op_update_tkip_key() local
955 dev = wl->current_dev; in b43_op_update_tkip_key()
956 B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED); in b43_op_update_tkip_key()
958 keymac_write(dev, index, NULL); /* First zero out mac to avoid race */ in b43_op_update_tkip_key()
960 rx_tkip_phase1_write(dev, index, iv32, phase1key); in b43_op_update_tkip_key()
964 keymac_write(dev, index, sta->addr); in b43_op_update_tkip_key()
967 static void do_key_write(struct b43_wldev *dev, in do_key_write() argument
974 if (b43_new_kidx_api(dev)) in do_key_write()
977 B43_WARN_ON(index >= ARRAY_SIZE(dev->key)); in do_key_write()
981 keymac_write(dev, index, NULL); /* First zero out mac. */ in do_key_write()
992 rx_tkip_phase1_write(dev, index, 0xffffffff, (u16*)buf); in do_key_write()
994 rx_tkip_phase1_write(dev, index, 0, NULL); in do_key_write()
997 key_write(dev, index, algorithm, buf); in do_key_write()
999 keymac_write(dev, index, mac_addr); in do_key_write()
1001 dev->key[index].algorithm = algorithm; in do_key_write()
1004 static int b43_key_write(struct b43_wldev *dev, in b43_key_write() argument
1024 for (i = 0; i < ARRAY_SIZE(dev->key); i++) { in b43_key_write()
1026 B43_WARN_ON(dev->key[i].keyconf == keyconf); in b43_key_write()
1030 if (b43_new_kidx_api(dev)) in b43_key_write()
1037 B43_WARN_ON(i >= ARRAY_SIZE(dev->key)); in b43_key_write()
1038 if (!dev->key[i].keyconf) { in b43_key_write()
1045 b43warn(dev->wl, "Out of hardware key memory\n"); in b43_key_write()
1051 do_key_write(dev, index, algorithm, key, key_len, mac_addr); in b43_key_write()
1052 if ((index <= 3) && !b43_new_kidx_api(dev)) { in b43_key_write()
1055 do_key_write(dev, index + 4, algorithm, key, key_len, NULL); in b43_key_write()
1058 dev->key[index].keyconf = keyconf; in b43_key_write()
1063 static int b43_key_clear(struct b43_wldev *dev, int index) in b43_key_clear() argument
1065 if (B43_WARN_ON((index < 0) || (index >= ARRAY_SIZE(dev->key)))) in b43_key_clear()
1067 do_key_write(dev, index, B43_SEC_ALGO_NONE, in b43_key_clear()
1069 if ((index <= 3) && !b43_new_kidx_api(dev)) { in b43_key_clear()
1070 do_key_write(dev, index + 4, B43_SEC_ALGO_NONE, in b43_key_clear()
1073 dev->key[index].keyconf = NULL; in b43_key_clear()
1078 static void b43_clear_keys(struct b43_wldev *dev) in b43_clear_keys() argument
1082 if (b43_new_kidx_api(dev)) in b43_clear_keys()
1087 b43_key_clear(dev, i); in b43_clear_keys()
1090 static void b43_dump_keymemory(struct b43_wldev *dev) in b43_dump_keymemory() argument
1100 if (!b43_debug(dev, B43_DBG_KEYS)) in b43_dump_keymemory()
1103 hf = b43_hf_read(dev); in b43_dump_keymemory()
1104 b43dbg(dev->wl, "Hardware key memory dump: USEDEFKEYS=%u\n", in b43_dump_keymemory()
1106 if (b43_new_kidx_api(dev)) { in b43_dump_keymemory()
1114 key = &(dev->key[index]); in b43_dump_keymemory()
1117 offset = dev->ktp + (index * B43_SEC_KEYSIZE); in b43_dump_keymemory()
1119 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i); in b43_dump_keymemory()
1123 algo = b43_shm_read16(dev, B43_SHM_SHARED, in b43_dump_keymemory()
1132 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i); in b43_dump_keymemory()
1136 rcmta0 = b43_shm_read32(dev, B43_SHM_RCMTA, in b43_dump_keymemory()
1138 rcmta1 = b43_shm_read16(dev, B43_SHM_RCMTA, in b43_dump_keymemory()
1149 void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags) in b43_power_saving_ctl_bits() argument
1183 macctl = b43_read32(dev, B43_MMIO_MACCTL); in b43_power_saving_ctl_bits()
1192 b43_write32(dev, B43_MMIO_MACCTL, macctl); in b43_power_saving_ctl_bits()
1194 b43_read32(dev, B43_MMIO_MACCTL); in b43_power_saving_ctl_bits()
1195 if (awake && dev->dev->core_rev >= 5) { in b43_power_saving_ctl_bits()
1198 ucstat = b43_shm_read16(dev, B43_SHM_SHARED, in b43_power_saving_ctl_bits()
1208 void b43_wireless_core_phy_pll_reset(struct b43_wldev *dev) in b43_wireless_core_phy_pll_reset() argument
1213 switch (dev->dev->bus_type) { in b43_wireless_core_phy_pll_reset()
1216 bcma_cc = &dev->dev->bdev->bus->drv_cc; in b43_wireless_core_phy_pll_reset()
1226 ssb_cc = &dev->dev->sdev->bus->chipco; in b43_wireless_core_phy_pll_reset()
1238 static void b43_bcma_phy_reset(struct b43_wldev *dev) in b43_bcma_phy_reset() argument
1243 flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_bcma_phy_reset()
1246 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags); in b43_bcma_phy_reset()
1249 b43_phy_take_out_of_reset(dev); in b43_bcma_phy_reset()
1252 static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode) in b43_bcma_wireless_core_reset() argument
1263 b43_device_enable(dev, flags); in b43_bcma_wireless_core_reset()
1265 if (dev->phy.type == B43_PHYTYPE_AC) { in b43_bcma_wireless_core_reset()
1268 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_bcma_wireless_core_reset()
1271 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); in b43_bcma_wireless_core_reset()
1273 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_bcma_wireless_core_reset()
1275 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); in b43_bcma_wireless_core_reset()
1277 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_bcma_wireless_core_reset()
1279 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); in b43_bcma_wireless_core_reset()
1282 bcma_core_set_clockmode(dev->dev->bdev, BCMA_CLKMODE_FAST); in b43_bcma_wireless_core_reset()
1283 b43_bcma_phy_reset(dev); in b43_bcma_wireless_core_reset()
1284 bcma_core_pll_ctl(dev->dev->bdev, req, status, true); in b43_bcma_wireless_core_reset()
1289 static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode) in b43_ssb_wireless_core_reset() argument
1297 if (dev->phy.type == B43_PHYTYPE_N) in b43_ssb_wireless_core_reset()
1299 b43_device_enable(dev, flags); in b43_ssb_wireless_core_reset()
1302 b43_phy_take_out_of_reset(dev); in b43_ssb_wireless_core_reset()
1306 void b43_wireless_core_reset(struct b43_wldev *dev, bool gmode) in b43_wireless_core_reset() argument
1310 switch (dev->dev->bus_type) { in b43_wireless_core_reset()
1313 b43_bcma_wireless_core_reset(dev, gmode); in b43_wireless_core_reset()
1318 b43_ssb_wireless_core_reset(dev, gmode); in b43_wireless_core_reset()
1327 if (dev->phy.ops) in b43_wireless_core_reset()
1328 dev->phy.ops->switch_analog(dev, 1); in b43_wireless_core_reset()
1330 macctl = b43_read32(dev, B43_MMIO_MACCTL); in b43_wireless_core_reset()
1335 b43_write32(dev, B43_MMIO_MACCTL, macctl); in b43_wireless_core_reset()
1338 static void handle_irq_transmit_status(struct b43_wldev *dev) in handle_irq_transmit_status() argument
1345 v0 = b43_read32(dev, B43_MMIO_XMITSTAT_0); in handle_irq_transmit_status()
1348 v1 = b43_read32(dev, B43_MMIO_XMITSTAT_1); in handle_irq_transmit_status()
1362 b43_handle_txstatus(dev, &stat); in handle_irq_transmit_status()
1366 static void drain_txstatus_queue(struct b43_wldev *dev) in drain_txstatus_queue() argument
1370 if (dev->dev->core_rev < 5) in drain_txstatus_queue()
1376 dummy = b43_read32(dev, B43_MMIO_XMITSTAT_0); in drain_txstatus_queue()
1379 dummy = b43_read32(dev, B43_MMIO_XMITSTAT_1); in drain_txstatus_queue()
1383 static u32 b43_jssi_read(struct b43_wldev *dev) in b43_jssi_read() argument
1387 val = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI1); in b43_jssi_read()
1389 val |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI0); in b43_jssi_read()
1394 static void b43_jssi_write(struct b43_wldev *dev, u32 jssi) in b43_jssi_write() argument
1396 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI0, in b43_jssi_write()
1398 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI1, in b43_jssi_write()
1402 static void b43_generate_noise_sample(struct b43_wldev *dev) in b43_generate_noise_sample() argument
1404 b43_jssi_write(dev, 0x7F7F7F7F); in b43_generate_noise_sample()
1405 b43_write32(dev, B43_MMIO_MACCMD, in b43_generate_noise_sample()
1406 b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); in b43_generate_noise_sample()
1409 static void b43_calculate_link_quality(struct b43_wldev *dev) in b43_calculate_link_quality() argument
1413 if (dev->phy.type != B43_PHYTYPE_G) in b43_calculate_link_quality()
1415 if (dev->noisecalc.calculation_running) in b43_calculate_link_quality()
1417 dev->noisecalc.calculation_running = true; in b43_calculate_link_quality()
1418 dev->noisecalc.nr_samples = 0; in b43_calculate_link_quality()
1420 b43_generate_noise_sample(dev); in b43_calculate_link_quality()
1423 static void handle_irq_noise(struct b43_wldev *dev) in handle_irq_noise() argument
1425 struct b43_phy_g *phy = dev->phy.g; in handle_irq_noise()
1433 if (dev->phy.type != B43_PHYTYPE_G) in handle_irq_noise()
1445 B43_WARN_ON(!dev->noisecalc.calculation_running); in handle_irq_noise()
1446 *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); in handle_irq_noise()
1452 B43_WARN_ON(dev->noisecalc.nr_samples >= 8); in handle_irq_noise()
1453 i = dev->noisecalc.nr_samples; in handle_irq_noise()
1458 dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]]; in handle_irq_noise()
1459 dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]]; in handle_irq_noise()
1460 dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]]; in handle_irq_noise()
1461 dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]]; in handle_irq_noise()
1462 dev->noisecalc.nr_samples++; in handle_irq_noise()
1463 if (dev->noisecalc.nr_samples == 8) { in handle_irq_noise()
1468 average += dev->noisecalc.samples[i][j]; in handle_irq_noise()
1474 tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x40C); in handle_irq_noise()
1485 dev->stats.link_noise = average; in handle_irq_noise()
1486 dev->noisecalc.calculation_running = false; in handle_irq_noise()
1490 b43_generate_noise_sample(dev); in handle_irq_noise()
1493 static void handle_irq_tbtt_indication(struct b43_wldev *dev) in handle_irq_tbtt_indication() argument
1495 if (b43_is_mode(dev->wl, NL80211_IFTYPE_AP)) { in handle_irq_tbtt_indication()
1499 b43_power_saving_ctl_bits(dev, 0); in handle_irq_tbtt_indication()
1501 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in handle_irq_tbtt_indication()
1502 dev->dfq_valid = true; in handle_irq_tbtt_indication()
1505 static void handle_irq_atim_end(struct b43_wldev *dev) in handle_irq_atim_end() argument
1507 if (dev->dfq_valid) { in handle_irq_atim_end()
1508 b43_write32(dev, B43_MMIO_MACCMD, in handle_irq_atim_end()
1509 b43_read32(dev, B43_MMIO_MACCMD) in handle_irq_atim_end()
1511 dev->dfq_valid = false; in handle_irq_atim_end()
1515 static void handle_irq_pmq(struct b43_wldev *dev) in handle_irq_pmq() argument
1522 tmp = b43_read32(dev, B43_MMIO_PS_STATUS); in handle_irq_pmq()
1527 b43_write16(dev, B43_MMIO_PS_STATUS, 0x0002); in handle_irq_pmq()
1530 static void b43_write_template_common(struct b43_wldev *dev, in b43_write_template_common() argument
1540 b43_ram_write(dev, ram_offset, le32_to_cpu(plcp.data)); in b43_write_template_common()
1547 b43_ram_write(dev, ram_offset, tmp); in b43_write_template_common()
1557 b43_ram_write(dev, ram_offset + i - 2, tmp); in b43_write_template_common()
1559 b43_shm_write16(dev, B43_SHM_SHARED, shm_size_offset, in b43_write_template_common()
1566 u8 b43_ieee80211_antenna_sanitize(struct b43_wldev *dev, in b43_ieee80211_antenna_sanitize() argument
1577 if (dev->phy.gmode) in b43_ieee80211_antenna_sanitize()
1578 antenna_mask = dev->dev->bus_sprom->ant_available_bg; in b43_ieee80211_antenna_sanitize()
1580 antenna_mask = dev->dev->bus_sprom->ant_available_a; in b43_ieee80211_antenna_sanitize()
1610 static void b43_write_beacon_template(struct b43_wldev *dev, in b43_write_beacon_template() argument
1625 spin_lock_irqsave(&dev->wl->beacon_lock, flags); in b43_write_beacon_template()
1626 info = IEEE80211_SKB_CB(dev->wl->current_beacon); in b43_write_beacon_template()
1627 rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value; in b43_write_beacon_template()
1629 beacon_skb = skb_clone(dev->wl->current_beacon, GFP_ATOMIC); in b43_write_beacon_template()
1630 spin_unlock_irqrestore(&dev->wl->beacon_lock, flags); in b43_write_beacon_template()
1633 b43dbg(dev->wl, "Could not upload beacon. " in b43_write_beacon_template()
1642 b43_write_template_common(dev, (const u8 *)bcn, in b43_write_beacon_template()
1648 ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); in b43_write_beacon_template()
1658 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl); in b43_write_beacon_template()
1688 b43_shm_write16(dev, B43_SHM_SHARED, in b43_write_beacon_template()
1690 b43_shm_write16(dev, B43_SHM_SHARED, in b43_write_beacon_template()
1701 b43_shm_write16(dev, B43_SHM_SHARED, in b43_write_beacon_template()
1704 b43_shm_write16(dev, B43_SHM_SHARED, in b43_write_beacon_template()
1707 b43dbg(dev->wl, "Updated beacon template at 0x%x\n", ram_offset); in b43_write_beacon_template()
1712 static void b43_upload_beacon0(struct b43_wldev *dev) in b43_upload_beacon0() argument
1714 struct b43_wl *wl = dev->wl; in b43_upload_beacon0()
1718 b43_write_beacon_template(dev, B43_SHM_SH_BT_BASE0, B43_SHM_SH_BTL0); in b43_upload_beacon0()
1722 static void b43_upload_beacon1(struct b43_wldev *dev) in b43_upload_beacon1() argument
1724 struct b43_wl *wl = dev->wl; in b43_upload_beacon1()
1728 b43_write_beacon_template(dev, B43_SHM_SH_BT_BASE1, B43_SHM_SH_BTL1); in b43_upload_beacon1()
1732 static void handle_irq_beacon(struct b43_wldev *dev) in handle_irq_beacon() argument
1734 struct b43_wl *wl = dev->wl; in handle_irq_beacon()
1745 dev->irq_mask &= ~B43_IRQ_BEACON; in handle_irq_beacon()
1747 cmd = b43_read32(dev, B43_MMIO_MACCMD); in handle_irq_beacon()
1753 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_BEACON); in handle_irq_beacon()
1754 dev->irq_mask |= B43_IRQ_BEACON; in handle_irq_beacon()
1762 b43_upload_beacon0(dev); in handle_irq_beacon()
1763 b43_upload_beacon1(dev); in handle_irq_beacon()
1764 cmd = b43_read32(dev, B43_MMIO_MACCMD); in handle_irq_beacon()
1766 b43_write32(dev, B43_MMIO_MACCMD, cmd); in handle_irq_beacon()
1769 b43_upload_beacon0(dev); in handle_irq_beacon()
1770 cmd = b43_read32(dev, B43_MMIO_MACCMD); in handle_irq_beacon()
1772 b43_write32(dev, B43_MMIO_MACCMD, cmd); in handle_irq_beacon()
1774 b43_upload_beacon1(dev); in handle_irq_beacon()
1775 cmd = b43_read32(dev, B43_MMIO_MACCMD); in handle_irq_beacon()
1777 b43_write32(dev, B43_MMIO_MACCMD, cmd); in handle_irq_beacon()
1782 static void b43_do_beacon_update_trigger_work(struct b43_wldev *dev) in b43_do_beacon_update_trigger_work() argument
1784 u32 old_irq_mask = dev->irq_mask; in b43_do_beacon_update_trigger_work()
1787 handle_irq_beacon(dev); in b43_do_beacon_update_trigger_work()
1788 if (old_irq_mask != dev->irq_mask) { in b43_do_beacon_update_trigger_work()
1790 B43_WARN_ON(!dev->irq_mask); in b43_do_beacon_update_trigger_work()
1791 if (b43_read32(dev, B43_MMIO_GEN_IRQ_MASK)) { in b43_do_beacon_update_trigger_work()
1792 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43_do_beacon_update_trigger_work()
1807 struct b43_wldev *dev; in b43_beacon_update_trigger_work() local
1810 dev = wl->current_dev; in b43_beacon_update_trigger_work()
1811 if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) { in b43_beacon_update_trigger_work()
1812 if (b43_bus_host_is_sdio(dev->dev)) { in b43_beacon_update_trigger_work()
1814 b43_do_beacon_update_trigger_work(dev); in b43_beacon_update_trigger_work()
1818 b43_do_beacon_update_trigger_work(dev); in b43_beacon_update_trigger_work()
1859 static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int) in b43_set_beacon_int() argument
1861 b43_time_lock(dev); in b43_set_beacon_int()
1862 if (dev->dev->core_rev >= 3) { in b43_set_beacon_int()
1863 b43_write32(dev, B43_MMIO_TSF_CFP_REP, (beacon_int << 16)); in b43_set_beacon_int()
1864 b43_write32(dev, B43_MMIO_TSF_CFP_START, (beacon_int << 10)); in b43_set_beacon_int()
1866 b43_write16(dev, 0x606, (beacon_int >> 6)); in b43_set_beacon_int()
1867 b43_write16(dev, 0x610, beacon_int); in b43_set_beacon_int()
1869 b43_time_unlock(dev); in b43_set_beacon_int()
1870 b43dbg(dev->wl, "Set beacon interval to %u\n", beacon_int); in b43_set_beacon_int()
1873 static void b43_handle_firmware_panic(struct b43_wldev *dev) in b43_handle_firmware_panic() argument
1878 reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_FWPANIC_REASON_REG); in b43_handle_firmware_panic()
1879 b43err(dev->wl, "Whoopsy, firmware panic! Reason: %u\n", reason); in b43_handle_firmware_panic()
1883 b43dbg(dev->wl, "The panic reason is unknown.\n"); in b43_handle_firmware_panic()
1892 b43_controller_restart(dev, "Microcode panic"); in b43_handle_firmware_panic()
1897 static void handle_irq_ucode_debug(struct b43_wldev *dev) in handle_irq_ucode_debug() argument
1904 if (!dev->fw.opensource) in handle_irq_ucode_debug()
1908 reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_DEBUGIRQ_REASON_REG); in handle_irq_ucode_debug()
1912 b43_handle_firmware_panic(dev); in handle_irq_ucode_debug()
1919 b43dbg(dev->wl, "SHM-dump: Failed to allocate memory\n"); in handle_irq_ucode_debug()
1923 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, i); in handle_irq_ucode_debug()
1926 b43info(dev->wl, "Shared memory dump:\n"); in handle_irq_ucode_debug()
1934 b43info(dev->wl, "Microcode register dump:\n"); in handle_irq_ucode_debug()
1936 u16 tmp = b43_shm_read16(dev, B43_SHM_SCRATCH, i); in handle_irq_ucode_debug()
1951 marker_id = b43_shm_read16(dev, B43_SHM_SCRATCH, in handle_irq_ucode_debug()
1953 marker_line = b43_shm_read16(dev, B43_SHM_SCRATCH, in handle_irq_ucode_debug()
1955 b43info(dev->wl, "The firmware just executed the MARKER(%u) " in handle_irq_ucode_debug()
1960 b43dbg(dev->wl, "Debug-IRQ triggered for unknown reason: %u\n", in handle_irq_ucode_debug()
1965 b43_shm_write16(dev, B43_SHM_SCRATCH, in handle_irq_ucode_debug()
1969 static void b43_do_interrupt_thread(struct b43_wldev *dev) in b43_do_interrupt_thread() argument
1972 u32 dma_reason[ARRAY_SIZE(dev->dma_reason)]; in b43_do_interrupt_thread()
1976 if (unlikely(b43_status(dev) != B43_STAT_STARTED)) in b43_do_interrupt_thread()
1979 reason = dev->irq_reason; in b43_do_interrupt_thread()
1981 dma_reason[i] = dev->dma_reason[i]; in b43_do_interrupt_thread()
1986 b43err(dev->wl, "MAC transmission error\n"); in b43_do_interrupt_thread()
1989 b43err(dev->wl, "PHY transmission error\n"); in b43_do_interrupt_thread()
1991 if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) { in b43_do_interrupt_thread()
1992 atomic_set(&dev->phy.txerr_cnt, in b43_do_interrupt_thread()
1994 b43err(dev->wl, "Too many PHY TX errors, " in b43_do_interrupt_thread()
1996 b43_controller_restart(dev, "PHY TX errors"); in b43_do_interrupt_thread()
2001 b43err(dev->wl, in b43_do_interrupt_thread()
2006 b43err(dev->wl, "This device does not support DMA " in b43_do_interrupt_thread()
2009 dev->use_pio = true; in b43_do_interrupt_thread()
2010 b43_controller_restart(dev, "DMA error"); in b43_do_interrupt_thread()
2015 handle_irq_ucode_debug(dev); in b43_do_interrupt_thread()
2017 handle_irq_tbtt_indication(dev); in b43_do_interrupt_thread()
2019 handle_irq_atim_end(dev); in b43_do_interrupt_thread()
2021 handle_irq_beacon(dev); in b43_do_interrupt_thread()
2023 handle_irq_pmq(dev); in b43_do_interrupt_thread()
2027 handle_irq_noise(dev); in b43_do_interrupt_thread()
2032 b43warn(dev->wl, "RX descriptor underrun\n"); in b43_do_interrupt_thread()
2033 b43_dma_handle_rx_overflow(dev->dma.rx_ring); in b43_do_interrupt_thread()
2036 if (b43_using_pio_transfers(dev)) in b43_do_interrupt_thread()
2037 b43_pio_rx(dev->pio.rx_queue); in b43_do_interrupt_thread()
2039 b43_dma_rx(dev->dma.rx_ring); in b43_do_interrupt_thread()
2048 handle_irq_transmit_status(dev); in b43_do_interrupt_thread()
2051 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43_do_interrupt_thread()
2054 if (b43_debug(dev, B43_DBG_VERBOSESTATS)) { in b43_do_interrupt_thread()
2055 dev->irq_count++; in b43_do_interrupt_thread()
2056 for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) { in b43_do_interrupt_thread()
2058 dev->irq_bit_count[i]++; in b43_do_interrupt_thread()
2067 struct b43_wldev *dev = dev_id; in b43_interrupt_thread_handler() local
2069 mutex_lock(&dev->wl->mutex); in b43_interrupt_thread_handler()
2070 b43_do_interrupt_thread(dev); in b43_interrupt_thread_handler()
2072 mutex_unlock(&dev->wl->mutex); in b43_interrupt_thread_handler()
2077 static irqreturn_t b43_do_interrupt(struct b43_wldev *dev) in b43_do_interrupt() argument
2084 reason = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); in b43_do_interrupt()
2087 reason &= dev->irq_mask; in b43_do_interrupt()
2091 dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON) in b43_do_interrupt()
2093 dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON) in b43_do_interrupt()
2095 dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON) in b43_do_interrupt()
2097 dev->dma_reason[3] = b43_read32(dev, B43_MMIO_DMA3_REASON) in b43_do_interrupt()
2099 dev->dma_reason[4] = b43_read32(dev, B43_MMIO_DMA4_REASON) in b43_do_interrupt()
2107 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, reason); in b43_do_interrupt()
2108 b43_write32(dev, B43_MMIO_DMA0_REASON, dev->dma_reason[0]); in b43_do_interrupt()
2109 b43_write32(dev, B43_MMIO_DMA1_REASON, dev->dma_reason[1]); in b43_do_interrupt()
2110 b43_write32(dev, B43_MMIO_DMA2_REASON, dev->dma_reason[2]); in b43_do_interrupt()
2111 b43_write32(dev, B43_MMIO_DMA3_REASON, dev->dma_reason[3]); in b43_do_interrupt()
2112 b43_write32(dev, B43_MMIO_DMA4_REASON, dev->dma_reason[4]); in b43_do_interrupt()
2118 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0); in b43_do_interrupt()
2120 dev->irq_reason = reason; in b43_do_interrupt()
2128 struct b43_wldev *dev = dev_id; in b43_interrupt_handler() local
2131 if (unlikely(b43_status(dev) < B43_STAT_STARTED)) in b43_interrupt_handler()
2134 spin_lock(&dev->wl->hardirq_lock); in b43_interrupt_handler()
2135 ret = b43_do_interrupt(dev); in b43_interrupt_handler()
2137 spin_unlock(&dev->wl->hardirq_lock); in b43_interrupt_handler()
2143 static void b43_sdio_interrupt_handler(struct b43_wldev *dev) in b43_sdio_interrupt_handler() argument
2145 struct b43_wl *wl = dev->wl; in b43_sdio_interrupt_handler()
2150 ret = b43_do_interrupt(dev); in b43_sdio_interrupt_handler()
2152 b43_do_interrupt_thread(dev); in b43_sdio_interrupt_handler()
2164 static void b43_release_firmware(struct b43_wldev *dev) in b43_release_firmware() argument
2166 complete(&dev->fw_load_complete); in b43_release_firmware()
2167 b43_do_release_fw(&dev->fw.ucode); in b43_release_firmware()
2168 b43_do_release_fw(&dev->fw.pcm); in b43_release_firmware()
2169 b43_do_release_fw(&dev->fw.initvals); in b43_release_firmware()
2170 b43_do_release_fw(&dev->fw.initvals_band); in b43_release_firmware()
2192 complete(&ctx->dev->fw_load_complete); in b43_fw_cb()
2239 init_completion(&ctx->dev->fw_load_complete); in b43_do_request_fw()
2241 ctx->dev->dev->dev, GFP_KERNEL, in b43_do_request_fw()
2247 wait_for_completion(&ctx->dev->fw_load_complete); in b43_do_request_fw()
2255 ctx->dev->dev->dev); in b43_do_request_fw()
2306 struct b43_wldev *dev = ctx->dev; in b43_try_request_fw() local
2307 struct b43_firmware *fw = &ctx->dev->fw; in b43_try_request_fw()
2308 struct b43_phy *phy = &dev->phy; in b43_try_request_fw()
2309 const u8 rev = ctx->dev->dev->core_rev; in b43_try_request_fw()
2401 switch (dev->phy.type) { in b43_try_request_fw()
2461 switch (dev->phy.type) { in b43_try_request_fw()
2525 b43err(dev->wl, "The driver does not know which firmware (ucode) " in b43_try_request_fw()
2531 b43err(dev->wl, "The driver does not know which firmware (PCM) " in b43_try_request_fw()
2537 b43err(dev->wl, "The driver does not know which firmware (initvals) " in b43_try_request_fw()
2548 b43_release_firmware(dev); in b43_try_request_fw()
2552 static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl);
2553 static void b43_one_core_detach(struct b43_bus_dev *dev);
2560 struct b43_wldev *dev = wl->current_dev; in b43_request_firmware() local
2569 ctx->dev = dev; in b43_request_firmware()
2591 b43err(dev->wl, "%s", errmsg); in b43_request_firmware()
2593 b43_print_fw_helptext(dev->wl, 1); in b43_request_firmware()
2598 if (!modparam_qos || dev->fw.opensource) in b43_request_firmware()
2613 b43_one_core_detach(dev->dev); in b43_request_firmware()
2619 static int b43_upload_microcode(struct b43_wldev *dev) in b43_upload_microcode() argument
2621 struct wiphy *wiphy = dev->wl->hw->wiphy; in b43_upload_microcode()
2630 macctl = b43_read32(dev, B43_MMIO_MACCTL); in b43_upload_microcode()
2633 b43_write32(dev, B43_MMIO_MACCTL, macctl); in b43_upload_microcode()
2636 b43_shm_write16(dev, B43_SHM_SCRATCH, i, 0); in b43_upload_microcode()
2638 b43_shm_write16(dev, B43_SHM_SHARED, i, 0); in b43_upload_microcode()
2641 data = (__be32 *) (dev->fw.ucode.data->data + hdr_len); in b43_upload_microcode()
2642 len = (dev->fw.ucode.data->size - hdr_len) / sizeof(__be32); in b43_upload_microcode()
2643 b43_shm_control_word(dev, B43_SHM_UCODE | B43_SHM_AUTOINC_W, 0x0000); in b43_upload_microcode()
2645 b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i])); in b43_upload_microcode()
2649 if (dev->fw.pcm.data) { in b43_upload_microcode()
2651 data = (__be32 *) (dev->fw.pcm.data->data + hdr_len); in b43_upload_microcode()
2652 len = (dev->fw.pcm.data->size - hdr_len) / sizeof(__be32); in b43_upload_microcode()
2653 b43_shm_control_word(dev, B43_SHM_HW, 0x01EA); in b43_upload_microcode()
2654 b43_write32(dev, B43_MMIO_SHM_DATA, 0x00004000); in b43_upload_microcode()
2656 b43_shm_control_word(dev, B43_SHM_HW, 0x01EB); in b43_upload_microcode()
2658 b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i])); in b43_upload_microcode()
2663 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_ALL); in b43_upload_microcode()
2666 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_JMP0, in b43_upload_microcode()
2672 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); in b43_upload_microcode()
2677 b43err(dev->wl, "Microcode not responding\n"); in b43_upload_microcode()
2678 b43_print_fw_helptext(dev->wl, 1); in b43_upload_microcode()
2684 b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); /* dummy read */ in b43_upload_microcode()
2687 fwrev = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEREV); in b43_upload_microcode()
2688 fwpatch = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEPATCH); in b43_upload_microcode()
2689 fwdate = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEDATE); in b43_upload_microcode()
2690 fwtime = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODETIME); in b43_upload_microcode()
2693 b43err(dev->wl, "YOUR FIRMWARE IS TOO OLD. Firmware from " in b43_upload_microcode()
2696 b43_print_fw_helptext(dev->wl, 1); in b43_upload_microcode()
2700 dev->fw.rev = fwrev; in b43_upload_microcode()
2701 dev->fw.patch = fwpatch; in b43_upload_microcode()
2702 if (dev->fw.rev >= 598) in b43_upload_microcode()
2703 dev->fw.hdr_format = B43_FW_HDR_598; in b43_upload_microcode()
2704 else if (dev->fw.rev >= 410) in b43_upload_microcode()
2705 dev->fw.hdr_format = B43_FW_HDR_410; in b43_upload_microcode()
2707 dev->fw.hdr_format = B43_FW_HDR_351; in b43_upload_microcode()
2708 WARN_ON(dev->fw.opensource != (fwdate == 0xFFFF)); in b43_upload_microcode()
2710 dev->qos_enabled = dev->wl->hw->queues > 1; in b43_upload_microcode()
2712 dev->hwcrypto_enabled = true; in b43_upload_microcode()
2714 if (dev->fw.opensource) { in b43_upload_microcode()
2718 dev->fw.patch = fwtime; in b43_upload_microcode()
2719 b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n", in b43_upload_microcode()
2720 dev->fw.rev, dev->fw.patch); in b43_upload_microcode()
2722 fwcapa = b43_fwcapa_read(dev); in b43_upload_microcode()
2723 if (!(fwcapa & B43_FWCAPA_HWCRYPTO) || dev->fw.pcm_request_failed) { in b43_upload_microcode()
2724 b43info(dev->wl, "Hardware crypto acceleration not supported by firmware\n"); in b43_upload_microcode()
2726 dev->hwcrypto_enabled = false; in b43_upload_microcode()
2731 b43info(dev->wl, "Loading firmware version %u.%u " in b43_upload_microcode()
2736 if (dev->fw.pcm_request_failed) { in b43_upload_microcode()
2737 b43warn(dev->wl, "No \"pcm5.fw\" firmware file found. " in b43_upload_microcode()
2739 b43_print_fw_helptext(dev->wl, 0); in b43_upload_microcode()
2744 dev->fw.rev, dev->fw.patch); in b43_upload_microcode()
2745 wiphy->hw_version = dev->dev->core_id; in b43_upload_microcode()
2747 if (dev->fw.hdr_format == B43_FW_HDR_351) { in b43_upload_microcode()
2750 b43warn(dev->wl, "You are using an old firmware image. " in b43_upload_microcode()
2753 b43_print_fw_helptext(dev->wl, 0); in b43_upload_microcode()
2760 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN, in b43_upload_microcode()
2766 static int b43_write_initvals(struct b43_wldev *dev, in b43_write_initvals() argument
2795 b43_write32(dev, offset, value); in b43_write_initvals()
2808 b43_write16(dev, offset, value); in b43_write_initvals()
2821 b43err(dev->wl, "Initial Values Firmware file-format error.\n"); in b43_write_initvals()
2822 b43_print_fw_helptext(dev->wl, 1); in b43_write_initvals()
2827 static int b43_upload_initvals(struct b43_wldev *dev) in b43_upload_initvals() argument
2831 struct b43_firmware *fw = &dev->fw; in b43_upload_initvals()
2838 return b43_write_initvals(dev, ivals, count, in b43_upload_initvals()
2842 static int b43_upload_initvals_band(struct b43_wldev *dev) in b43_upload_initvals_band() argument
2846 struct b43_firmware *fw = &dev->fw; in b43_upload_initvals_band()
2856 return b43_write_initvals(dev, ivals, count, in b43_upload_initvals_band()
2865 static struct ssb_device *b43_ssb_gpio_dev(struct b43_wldev *dev) in b43_ssb_gpio_dev() argument
2867 struct ssb_bus *bus = dev->dev->sdev->bus; in b43_ssb_gpio_dev()
2870 return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); in b43_ssb_gpio_dev()
2872 return bus->chipco.dev; in b43_ssb_gpio_dev()
2877 static int b43_gpio_init(struct b43_wldev *dev) in b43_gpio_init() argument
2884 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0); in b43_gpio_init()
2885 b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF); in b43_gpio_init()
2889 if (dev->dev->chip_id == 0x4301) { in b43_gpio_init()
2892 } else if (dev->dev->chip_id == 0x5354) { in b43_gpio_init()
2898 b43_write16(dev, B43_MMIO_GPIO_MASK, in b43_gpio_init()
2899 b43_read16(dev, B43_MMIO_GPIO_MASK) in b43_gpio_init()
2908 if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_PACTRL) { in b43_gpio_init()
2910 b43_write16(dev, B43_MMIO_GPIO_MASK, in b43_gpio_init()
2911 b43_read16(dev, B43_MMIO_GPIO_MASK) in b43_gpio_init()
2917 switch (dev->dev->bus_type) { in b43_gpio_init()
2920 bcma_chipco_gpio_control(&dev->dev->bdev->bus->drv_cc, mask, set); in b43_gpio_init()
2925 gpiodev = b43_ssb_gpio_dev(dev); in b43_gpio_init()
2938 static void b43_gpio_cleanup(struct b43_wldev *dev) in b43_gpio_cleanup() argument
2944 switch (dev->dev->bus_type) { in b43_gpio_cleanup()
2947 bcma_chipco_gpio_control(&dev->dev->bdev->bus->drv_cc, ~0, 0); in b43_gpio_cleanup()
2952 gpiodev = b43_ssb_gpio_dev(dev); in b43_gpio_cleanup()
2961 void b43_mac_enable(struct b43_wldev *dev) in b43_mac_enable() argument
2963 if (b43_debug(dev, B43_DBG_FIRMWARE)) { in b43_mac_enable()
2966 fwstate = b43_shm_read16(dev, B43_SHM_SHARED, in b43_mac_enable()
2970 b43err(dev->wl, "b43_mac_enable(): The firmware " in b43_mac_enable()
2976 dev->mac_suspended--; in b43_mac_enable()
2977 B43_WARN_ON(dev->mac_suspended < 0); in b43_mac_enable()
2978 if (dev->mac_suspended == 0) { in b43_mac_enable()
2979 b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_ENABLED); in b43_mac_enable()
2980 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, in b43_mac_enable()
2983 b43_read32(dev, B43_MMIO_MACCTL); in b43_mac_enable()
2984 b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); in b43_mac_enable()
2985 b43_power_saving_ctl_bits(dev, 0); in b43_mac_enable()
2990 void b43_mac_suspend(struct b43_wldev *dev) in b43_mac_suspend() argument
2996 B43_WARN_ON(dev->mac_suspended < 0); in b43_mac_suspend()
2998 if (dev->mac_suspended == 0) { in b43_mac_suspend()
2999 b43_power_saving_ctl_bits(dev, B43_PS_AWAKE); in b43_mac_suspend()
3000 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_ENABLED, 0); in b43_mac_suspend()
3002 b43_read32(dev, B43_MMIO_MACCTL); in b43_mac_suspend()
3004 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); in b43_mac_suspend()
3011 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); in b43_mac_suspend()
3016 b43err(dev->wl, "MAC suspend failed\n"); in b43_mac_suspend()
3019 dev->mac_suspended++; in b43_mac_suspend()
3023 void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on) in b43_mac_phy_clock_set() argument
3027 switch (dev->dev->bus_type) { in b43_mac_phy_clock_set()
3030 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_mac_phy_clock_set()
3035 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); in b43_mac_phy_clock_set()
3040 tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); in b43_mac_phy_clock_set()
3045 ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); in b43_mac_phy_clock_set()
3052 void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode) in b43_mac_switch_freq() argument
3054 u16 chip_id = dev->dev->chip_id; in b43_mac_switch_freq()
3059 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x1862); in b43_mac_switch_freq()
3060 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x6); in b43_mac_switch_freq()
3063 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x3e70); in b43_mac_switch_freq()
3064 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x6); in b43_mac_switch_freq()
3067 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x6666); in b43_mac_switch_freq()
3068 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x6); in b43_mac_switch_freq()
3080 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x2082); in b43_mac_switch_freq()
3081 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); in b43_mac_switch_freq()
3084 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x5341); in b43_mac_switch_freq()
3085 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); in b43_mac_switch_freq()
3088 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x8889); in b43_mac_switch_freq()
3089 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); in b43_mac_switch_freq()
3092 } else if (dev->phy.type == B43_PHYTYPE_LCN) { in b43_mac_switch_freq()
3095 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x7CE0); in b43_mac_switch_freq()
3096 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); in b43_mac_switch_freq()
3099 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0xCCCD); in b43_mac_switch_freq()
3100 b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); in b43_mac_switch_freq()
3106 static void b43_adjust_opmode(struct b43_wldev *dev) in b43_adjust_opmode() argument
3108 struct b43_wl *wl = dev->wl; in b43_adjust_opmode()
3112 ctl = b43_read32(dev, B43_MMIO_MACCTL); in b43_adjust_opmode()
3140 if (dev->dev->core_rev <= 4) in b43_adjust_opmode()
3143 b43_write32(dev, B43_MMIO_MACCTL, ctl); in b43_adjust_opmode()
3147 if (dev->dev->chip_id == 0x4306 && in b43_adjust_opmode()
3148 dev->dev->chip_rev == 3) in b43_adjust_opmode()
3153 b43_write16(dev, 0x612, cfp_pretbtt); in b43_adjust_opmode()
3160 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_DISCPMQ, 0); in b43_adjust_opmode()
3162 b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_DISCPMQ); in b43_adjust_opmode()
3165 static void b43_rate_memory_write(struct b43_wldev *dev, u16 rate, int is_ofdm) in b43_rate_memory_write() argument
3176 b43_shm_write16(dev, B43_SHM_SHARED, offset + 0x20, in b43_rate_memory_write()
3177 b43_shm_read16(dev, B43_SHM_SHARED, offset)); in b43_rate_memory_write()
3180 static void b43_rate_memory_init(struct b43_wldev *dev) in b43_rate_memory_init() argument
3182 switch (dev->phy.type) { in b43_rate_memory_init()
3189 b43_rate_memory_write(dev, B43_OFDM_RATE_6MB, 1); in b43_rate_memory_init()
3190 b43_rate_memory_write(dev, B43_OFDM_RATE_9MB, 1); in b43_rate_memory_init()
3191 b43_rate_memory_write(dev, B43_OFDM_RATE_12MB, 1); in b43_rate_memory_init()
3192 b43_rate_memory_write(dev, B43_OFDM_RATE_18MB, 1); in b43_rate_memory_init()
3193 b43_rate_memory_write(dev, B43_OFDM_RATE_24MB, 1); in b43_rate_memory_init()
3194 b43_rate_memory_write(dev, B43_OFDM_RATE_36MB, 1); in b43_rate_memory_init()
3195 b43_rate_memory_write(dev, B43_OFDM_RATE_48MB, 1); in b43_rate_memory_init()
3196 b43_rate_memory_write(dev, B43_OFDM_RATE_54MB, 1); in b43_rate_memory_init()
3197 if (dev->phy.type == B43_PHYTYPE_A) in b43_rate_memory_init()
3201 b43_rate_memory_write(dev, B43_CCK_RATE_1MB, 0); in b43_rate_memory_init()
3202 b43_rate_memory_write(dev, B43_CCK_RATE_2MB, 0); in b43_rate_memory_init()
3203 b43_rate_memory_write(dev, B43_CCK_RATE_5MB, 0); in b43_rate_memory_init()
3204 b43_rate_memory_write(dev, B43_CCK_RATE_11MB, 0); in b43_rate_memory_init()
3212 static void b43_set_phytxctl_defaults(struct b43_wldev *dev) in b43_set_phytxctl_defaults() argument
3220 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl); in b43_set_phytxctl_defaults()
3221 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, ctl); in b43_set_phytxctl_defaults()
3222 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, ctl); in b43_set_phytxctl_defaults()
3226 static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna) in b43_mgmtframe_txantenna() argument
3234 tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL); in b43_mgmtframe_txantenna()
3236 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, tmp); in b43_mgmtframe_txantenna()
3238 tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL); in b43_mgmtframe_txantenna()
3240 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp); in b43_mgmtframe_txantenna()
3244 static void b43_chip_exit(struct b43_wldev *dev) in b43_chip_exit() argument
3246 b43_phy_exit(dev); in b43_chip_exit()
3247 b43_gpio_cleanup(dev); in b43_chip_exit()
3254 static int b43_chip_init(struct b43_wldev *dev) in b43_chip_init() argument
3256 struct b43_phy *phy = &dev->phy; in b43_chip_init()
3263 if (dev->phy.gmode) in b43_chip_init()
3266 b43_write32(dev, B43_MMIO_MACCTL, macctl); in b43_chip_init()
3268 err = b43_upload_microcode(dev); in b43_chip_init()
3272 err = b43_gpio_init(dev); in b43_chip_init()
3276 err = b43_upload_initvals(dev); in b43_chip_init()
3280 err = b43_upload_initvals_band(dev); in b43_chip_init()
3285 phy->ops->switch_analog(dev, 1); in b43_chip_init()
3286 err = b43_phy_init(dev); in b43_chip_init()
3292 phy->ops->interf_mitigation(dev, B43_INTERFMODE_NONE); in b43_chip_init()
3296 phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT); in b43_chip_init()
3297 b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT); in b43_chip_init()
3300 value16 = b43_read16(dev, 0x005E); in b43_chip_init()
3302 b43_write16(dev, 0x005E, value16); in b43_chip_init()
3304 b43_write32(dev, 0x0100, 0x01000000); in b43_chip_init()
3305 if (dev->dev->core_rev < 5) in b43_chip_init()
3306 b43_write32(dev, 0x010C, 0x01000000); in b43_chip_init()
3308 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_INFRA, 0); in b43_chip_init()
3309 b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_INFRA); in b43_chip_init()
3313 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 0); in b43_chip_init()
3316 b43_adjust_opmode(dev); in b43_chip_init()
3318 if (dev->dev->core_rev < 3) { in b43_chip_init()
3319 b43_write16(dev, 0x060E, 0x0000); in b43_chip_init()
3320 b43_write16(dev, 0x0610, 0x8000); in b43_chip_init()
3321 b43_write16(dev, 0x0604, 0x0000); in b43_chip_init()
3322 b43_write16(dev, 0x0606, 0x0200); in b43_chip_init()
3324 b43_write32(dev, 0x0188, 0x80000000); in b43_chip_init()
3325 b43_write32(dev, 0x018C, 0x02000000); in b43_chip_init()
3327 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000); in b43_chip_init()
3328 b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001FC00); in b43_chip_init()
3329 b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00); in b43_chip_init()
3330 b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00); in b43_chip_init()
3331 b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00); in b43_chip_init()
3332 b43_write32(dev, B43_MMIO_DMA4_IRQ_MASK, 0x0000DC00); in b43_chip_init()
3333 b43_write32(dev, B43_MMIO_DMA5_IRQ_MASK, 0x0000DC00); in b43_chip_init()
3335 b43_mac_phy_clock_set(dev, true); in b43_chip_init()
3337 switch (dev->dev->bus_type) { in b43_chip_init()
3341 b43_write16(dev, B43_MMIO_POWERUP_DELAY, 0xE74); in b43_chip_init()
3346 b43_write16(dev, B43_MMIO_POWERUP_DELAY, in b43_chip_init()
3347 dev->dev->sdev->bus->chipco.fast_pwrup_delay); in b43_chip_init()
3353 b43dbg(dev->wl, "Chip initialized\n"); in b43_chip_init()
3358 b43_gpio_cleanup(dev); in b43_chip_init()
3362 static void b43_periodic_every60sec(struct b43_wldev *dev) in b43_periodic_every60sec() argument
3364 const struct b43_phy_operations *ops = dev->phy.ops; in b43_periodic_every60sec()
3367 ops->pwork_60sec(dev); in b43_periodic_every60sec()
3370 b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME); in b43_periodic_every60sec()
3373 static void b43_periodic_every30sec(struct b43_wldev *dev) in b43_periodic_every30sec() argument
3376 b43_calculate_link_quality(dev); in b43_periodic_every30sec()
3379 static void b43_periodic_every15sec(struct b43_wldev *dev) in b43_periodic_every15sec() argument
3381 struct b43_phy *phy = &dev->phy; in b43_periodic_every15sec()
3384 if (dev->fw.opensource) { in b43_periodic_every15sec()
3387 wdr = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_WATCHDOG_REG); in b43_periodic_every15sec()
3389 b43err(dev->wl, "Firmware watchdog: The firmware died!\n"); in b43_periodic_every15sec()
3390 b43_controller_restart(dev, "Firmware watchdog"); in b43_periodic_every15sec()
3393 b43_shm_write16(dev, B43_SHM_SCRATCH, in b43_periodic_every15sec()
3399 phy->ops->pwork_15sec(dev); in b43_periodic_every15sec()
3405 if (b43_debug(dev, B43_DBG_VERBOSESTATS)) { in b43_periodic_every15sec()
3408 b43dbg(dev->wl, "Stats: %7u IRQs/sec, %7u TX/sec, %7u RX/sec\n", in b43_periodic_every15sec()
3409 dev->irq_count / 15, in b43_periodic_every15sec()
3410 dev->tx_count / 15, in b43_periodic_every15sec()
3411 dev->rx_count / 15); in b43_periodic_every15sec()
3412 dev->irq_count = 0; in b43_periodic_every15sec()
3413 dev->tx_count = 0; in b43_periodic_every15sec()
3414 dev->rx_count = 0; in b43_periodic_every15sec()
3415 for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) { in b43_periodic_every15sec()
3416 if (dev->irq_bit_count[i]) { in b43_periodic_every15sec()
3417 b43dbg(dev->wl, "Stats: %7u IRQ-%02u/sec (0x%08X)\n", in b43_periodic_every15sec()
3418 dev->irq_bit_count[i] / 15, i, (1 << i)); in b43_periodic_every15sec()
3419 dev->irq_bit_count[i] = 0; in b43_periodic_every15sec()
3426 static void do_periodic_work(struct b43_wldev *dev) in do_periodic_work() argument
3430 state = dev->periodic_state; in do_periodic_work()
3432 b43_periodic_every60sec(dev); in do_periodic_work()
3434 b43_periodic_every30sec(dev); in do_periodic_work()
3435 b43_periodic_every15sec(dev); in do_periodic_work()
3445 struct b43_wldev *dev = container_of(work, struct b43_wldev, in b43_periodic_work_handler() local
3447 struct b43_wl *wl = dev->wl; in b43_periodic_work_handler()
3452 if (unlikely(b43_status(dev) != B43_STAT_STARTED)) in b43_periodic_work_handler()
3454 if (b43_debug(dev, B43_DBG_PWORK_STOP)) in b43_periodic_work_handler()
3457 do_periodic_work(dev); in b43_periodic_work_handler()
3459 dev->periodic_state++; in b43_periodic_work_handler()
3461 if (b43_debug(dev, B43_DBG_PWORK_FAST)) in b43_periodic_work_handler()
3465 ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); in b43_periodic_work_handler()
3470 static void b43_periodic_tasks_setup(struct b43_wldev *dev) in b43_periodic_tasks_setup() argument
3472 struct delayed_work *work = &dev->periodic_work; in b43_periodic_tasks_setup()
3474 dev->periodic_state = 0; in b43_periodic_tasks_setup()
3476 ieee80211_queue_delayed_work(dev->wl->hw, work, 0); in b43_periodic_tasks_setup()
3480 static int b43_validate_chipaccess(struct b43_wldev *dev) in b43_validate_chipaccess() argument
3484 backup0 = b43_shm_read32(dev, B43_SHM_SHARED, 0); in b43_validate_chipaccess()
3485 backup4 = b43_shm_read32(dev, B43_SHM_SHARED, 4); in b43_validate_chipaccess()
3488 b43_shm_write32(dev, B43_SHM_SHARED, 0, 0x55AAAA55); in b43_validate_chipaccess()
3489 if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0x55AAAA55) in b43_validate_chipaccess()
3491 b43_shm_write32(dev, B43_SHM_SHARED, 0, 0xAA5555AA); in b43_validate_chipaccess()
3492 if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0xAA5555AA) in b43_validate_chipaccess()
3497 b43_shm_write16(dev, B43_SHM_SHARED, 0, 0x1122); in b43_validate_chipaccess()
3498 b43_shm_write16(dev, B43_SHM_SHARED, 2, 0x3344); in b43_validate_chipaccess()
3499 b43_shm_write16(dev, B43_SHM_SHARED, 4, 0x5566); in b43_validate_chipaccess()
3500 b43_shm_write16(dev, B43_SHM_SHARED, 6, 0x7788); in b43_validate_chipaccess()
3501 if (b43_shm_read32(dev, B43_SHM_SHARED, 2) != 0x55663344) in b43_validate_chipaccess()
3502 b43warn(dev->wl, "Unaligned 32bit SHM read access is broken\n"); in b43_validate_chipaccess()
3503 b43_shm_write32(dev, B43_SHM_SHARED, 2, 0xAABBCCDD); in b43_validate_chipaccess()
3504 if (b43_shm_read16(dev, B43_SHM_SHARED, 0) != 0x1122 || in b43_validate_chipaccess()
3505 b43_shm_read16(dev, B43_SHM_SHARED, 2) != 0xCCDD || in b43_validate_chipaccess()
3506 b43_shm_read16(dev, B43_SHM_SHARED, 4) != 0xAABB || in b43_validate_chipaccess()
3507 b43_shm_read16(dev, B43_SHM_SHARED, 6) != 0x7788) in b43_validate_chipaccess()
3508 b43warn(dev->wl, "Unaligned 32bit SHM write access is broken\n"); in b43_validate_chipaccess()
3510 b43_shm_write32(dev, B43_SHM_SHARED, 0, backup0); in b43_validate_chipaccess()
3511 b43_shm_write32(dev, B43_SHM_SHARED, 4, backup4); in b43_validate_chipaccess()
3513 if ((dev->dev->core_rev >= 3) && (dev->dev->core_rev <= 10)) { in b43_validate_chipaccess()
3516 b43_write16(dev, B43_MMIO_TSF_CFP_START, 0xAAAA); in b43_validate_chipaccess()
3517 b43_write32(dev, B43_MMIO_TSF_CFP_START, 0xCCCCBBBB); in b43_validate_chipaccess()
3518 if (b43_read16(dev, B43_MMIO_TSF_CFP_START_LOW) != 0xBBBB) in b43_validate_chipaccess()
3520 if (b43_read16(dev, B43_MMIO_TSF_CFP_START_HIGH) != 0xCCCC) in b43_validate_chipaccess()
3523 b43_write32(dev, B43_MMIO_TSF_CFP_START, 0); in b43_validate_chipaccess()
3525 v = b43_read32(dev, B43_MMIO_MACCTL); in b43_validate_chipaccess()
3532 b43err(dev->wl, "Failed to validate the chipaccess\n"); in b43_validate_chipaccess()
3536 static void b43_security_init(struct b43_wldev *dev) in b43_security_init() argument
3538 dev->ktp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_KTP); in b43_security_init()
3542 dev->ktp *= 2; in b43_security_init()
3544 b43_write16(dev, B43_MMIO_RCMTA_COUNT, B43_NR_PAIRWISE_KEYS); in b43_security_init()
3546 b43_clear_keys(dev); in b43_security_init()
3553 struct b43_wldev *dev; in b43_rng_read() local
3557 dev = wl->current_dev; in b43_rng_read()
3558 if (likely(dev && b43_status(dev) >= B43_STAT_INITIALIZED)) { in b43_rng_read()
3559 *data = b43_read16(dev, B43_MMIO_RNG); in b43_rng_read()
3601 struct b43_wldev *dev; in b43_tx_work() local
3607 dev = wl->current_dev; in b43_tx_work()
3608 if (unlikely(!dev || b43_status(dev) < B43_STAT_STARTED)) { in b43_tx_work()
3616 if (b43_using_pio_transfers(dev)) in b43_tx_work()
3617 err = b43_pio_tx(dev, skb); in b43_tx_work()
3619 err = b43_dma_tx(dev, skb); in b43_tx_work()
3636 dev->tx_count++; in b43_tx_work()
3662 static void b43_qos_params_upload(struct b43_wldev *dev, in b43_qos_params_upload() argument
3670 if (!dev->qos_enabled) in b43_qos_params_upload()
3673 bslots = b43_read16(dev, B43_MMIO_RNG) & p->cw_min; in b43_qos_params_upload()
3687 tmp = b43_shm_read16(dev, B43_SHM_SHARED, in b43_qos_params_upload()
3691 b43_shm_write16(dev, B43_SHM_SHARED, in b43_qos_params_upload()
3695 b43_shm_write16(dev, B43_SHM_SHARED, in b43_qos_params_upload()
3712 static void b43_qos_upload_all(struct b43_wldev *dev) in b43_qos_upload_all() argument
3714 struct b43_wl *wl = dev->wl; in b43_qos_upload_all()
3718 if (!dev->qos_enabled) in b43_qos_upload_all()
3724 b43_mac_suspend(dev); in b43_qos_upload_all()
3727 b43_qos_params_upload(dev, &(params->p), in b43_qos_upload_all()
3730 b43_mac_enable(dev); in b43_qos_upload_all()
3778 static void b43_qos_init(struct b43_wldev *dev) in b43_qos_init() argument
3780 if (!dev->qos_enabled) { in b43_qos_init()
3782 b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_EDCF); in b43_qos_init()
3783 b43_write16(dev, B43_MMIO_IFSCTL, in b43_qos_init()
3784 b43_read16(dev, B43_MMIO_IFSCTL) in b43_qos_init()
3786 b43dbg(dev->wl, "QoS disabled\n"); in b43_qos_init()
3791 b43_qos_upload_all(dev); in b43_qos_init()
3794 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_EDCF); in b43_qos_init()
3795 b43_write16(dev, B43_MMIO_IFSCTL, in b43_qos_init()
3796 b43_read16(dev, B43_MMIO_IFSCTL) in b43_qos_init()
3798 b43dbg(dev->wl, "QoS enabled\n"); in b43_qos_init()
3806 struct b43_wldev *dev; in b43_op_conf_tx() local
3820 dev = wl->current_dev; in b43_op_conf_tx()
3821 if (unlikely(!dev || (b43_status(dev) < B43_STAT_INITIALIZED))) in b43_op_conf_tx()
3825 b43_mac_suspend(dev); in b43_op_conf_tx()
3826 b43_qos_params_upload(dev, &(wl->qos_params[queue].p), in b43_op_conf_tx()
3828 b43_mac_enable(dev); in b43_op_conf_tx()
3852 struct b43_wldev *dev; in b43_op_get_tsf() local
3856 dev = wl->current_dev; in b43_op_get_tsf()
3858 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) in b43_op_get_tsf()
3859 b43_tsf_read(dev, &tsf); in b43_op_get_tsf()
3872 struct b43_wldev *dev; in b43_op_set_tsf() local
3875 dev = wl->current_dev; in b43_op_set_tsf()
3877 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) in b43_op_set_tsf()
3878 b43_tsf_write(dev, tsf); in b43_op_set_tsf()
3898 static int b43_switch_band(struct b43_wldev *dev, in b43_switch_band() argument
3901 struct b43_phy *phy = &dev->phy; in b43_switch_band()
3919 b43err(dev->wl, "This device doesn't support %s-GHz band\n", in b43_switch_band()
3929 b43dbg(dev->wl, "Switching to %s GHz band\n", in b43_switch_band()
3934 b43_software_rfkill(dev, true); in b43_switch_band()
3937 b43_phy_put_into_reset(dev); in b43_switch_band()
3938 switch (dev->dev->bus_type) { in b43_switch_band()
3941 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); in b43_switch_band()
3946 bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); in b43_switch_band()
3951 tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); in b43_switch_band()
3956 ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); in b43_switch_band()
3960 b43_phy_take_out_of_reset(dev); in b43_switch_band()
3962 b43_upload_initvals_band(dev); in b43_switch_band()
3964 b43_phy_init(dev); in b43_switch_band()
3969 static void b43_set_beacon_listen_interval(struct b43_wldev *dev, u16 interval) in b43_set_beacon_listen_interval() argument
3972 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BCN_LI, interval); in b43_set_beacon_listen_interval()
3976 static void b43_set_retry_limits(struct b43_wldev *dev, in b43_set_retry_limits() argument
3985 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT, in b43_set_retry_limits()
3987 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT, in b43_set_retry_limits()
3994 struct b43_wldev *dev = wl->current_dev; in b43_op_config() local
3995 struct b43_phy *phy = &dev->phy; in b43_op_config()
4001 b43_mac_suspend(dev); in b43_op_config()
4004 b43_set_beacon_listen_interval(dev, conf->listen_interval); in b43_op_config()
4011 err = b43_switch_band(dev, conf->chandef.chan); in b43_op_config()
4018 b43_switch_channel(dev, phy->channel); in b43_op_config()
4022 b43_set_retry_limits(dev, conf->short_frame_max_tx_count, in b43_op_config()
4028 dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR); in b43_op_config()
4034 b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME | in b43_op_config()
4041 b43_mgmtframe_txantenna(dev, antenna); in b43_op_config()
4044 phy->ops->set_rx_antenna(dev, antenna); in b43_op_config()
4048 b43_software_rfkill(dev, false); in b43_op_config()
4049 b43info(dev->wl, "Radio turned on by software\n"); in b43_op_config()
4050 if (!dev->radio_hw_enable) { in b43_op_config()
4051 b43info(dev->wl, "The hardware RF-kill button " in b43_op_config()
4056 b43_software_rfkill(dev, true); in b43_op_config()
4057 b43info(dev->wl, "Radio turned off by software\n"); in b43_op_config()
4062 b43_mac_enable(dev); in b43_op_config()
4068 static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates) in b43_update_basic_rates() argument
4071 dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)]; in b43_update_basic_rates()
4105 rateptr = b43_shm_read16(dev, B43_SHM_SHARED, in b43_update_basic_rates()
4108 b43_shm_write16(dev, B43_SHM_SHARED, basic + 2 * offset, in b43_update_basic_rates()
4119 struct b43_wldev *dev; in b43_op_bss_info_changed() local
4123 dev = wl->current_dev; in b43_op_bss_info_changed()
4124 if (!dev || b43_status(dev) < B43_STAT_STARTED) in b43_op_bss_info_changed()
4136 if (b43_status(dev) >= B43_STAT_INITIALIZED) { in b43_op_bss_info_changed()
4144 b43_write_mac_bssid_templates(dev); in b43_op_bss_info_changed()
4147 b43_mac_suspend(dev); in b43_op_bss_info_changed()
4155 b43_set_beacon_int(dev, conf->beacon_int); in b43_op_bss_info_changed()
4158 b43_update_basic_rates(dev, conf->basic_rates); in b43_op_bss_info_changed()
4162 b43_short_slot_timing_enable(dev); in b43_op_bss_info_changed()
4164 b43_short_slot_timing_disable(dev); in b43_op_bss_info_changed()
4167 b43_mac_enable(dev); in b43_op_bss_info_changed()
4177 struct b43_wldev *dev; in b43_op_set_key() local
4202 dev = wl->current_dev; in b43_op_set_key()
4204 if (!dev || b43_status(dev) < B43_STAT_INITIALIZED) in b43_op_set_key()
4207 if (dev->fw.pcm_request_failed || !dev->hwcrypto_enabled) { in b43_op_set_key()
4252 err = b43_key_write(dev, -1, algorithm, in b43_op_set_key()
4257 err = b43_key_write(dev, index, algorithm, in b43_op_set_key()
4265 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_USEDEFKEYS); in b43_op_set_key()
4267 b43_hf_write(dev, in b43_op_set_key()
4268 b43_hf_read(dev) & ~B43_HF_USEDEFKEYS); in b43_op_set_key()
4275 err = b43_key_clear(dev, key->hw_key_idx); in b43_op_set_key()
4290 b43_dump_keymemory(dev); in b43_op_set_key()
4302 struct b43_wldev *dev; in b43_op_configure_filter() local
4305 dev = wl->current_dev; in b43_op_configure_filter()
4306 if (!dev) { in b43_op_configure_filter()
4327 if (changed && b43_status(dev) >= B43_STAT_INITIALIZED) in b43_op_configure_filter()
4328 b43_adjust_opmode(dev); in b43_op_configure_filter()
4337 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev) in b43_wireless_core_stop() argument
4344 if (!dev) in b43_wireless_core_stop()
4346 wl = dev->wl; in b43_wireless_core_stop()
4348 if (!dev || b43_status(dev) < B43_STAT_STARTED) in b43_wireless_core_stop()
4349 return dev; in b43_wireless_core_stop()
4353 cancel_delayed_work_sync(&dev->periodic_work); in b43_wireless_core_stop()
4355 b43_leds_stop(dev); in b43_wireless_core_stop()
4357 dev = wl->current_dev; in b43_wireless_core_stop()
4358 if (!dev || b43_status(dev) < B43_STAT_STARTED) { in b43_wireless_core_stop()
4360 return dev; in b43_wireless_core_stop()
4364 b43_set_status(dev, B43_STAT_INITIALIZED); in b43_wireless_core_stop()
4365 if (b43_bus_host_is_sdio(dev->dev)) { in b43_wireless_core_stop()
4367 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0); in b43_wireless_core_stop()
4368 b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */ in b43_wireless_core_stop()
4371 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0); in b43_wireless_core_stop()
4372 b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */ in b43_wireless_core_stop()
4376 orig_dev = dev; in b43_wireless_core_stop()
4378 if (b43_bus_host_is_sdio(dev->dev)) { in b43_wireless_core_stop()
4379 b43_sdio_free_irq(dev); in b43_wireless_core_stop()
4381 synchronize_irq(dev->dev->irq); in b43_wireless_core_stop()
4382 free_irq(dev->dev->irq, dev); in b43_wireless_core_stop()
4385 dev = wl->current_dev; in b43_wireless_core_stop()
4386 if (!dev) in b43_wireless_core_stop()
4387 return dev; in b43_wireless_core_stop()
4388 if (dev != orig_dev) { in b43_wireless_core_stop()
4389 if (b43_status(dev) >= B43_STAT_STARTED) in b43_wireless_core_stop()
4391 return dev; in b43_wireless_core_stop()
4393 mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); in b43_wireless_core_stop()
4406 b43_mac_suspend(dev); in b43_wireless_core_stop()
4407 b43_leds_exit(dev); in b43_wireless_core_stop()
4410 return dev; in b43_wireless_core_stop()
4414 static int b43_wireless_core_start(struct b43_wldev *dev) in b43_wireless_core_start() argument
4418 B43_WARN_ON(b43_status(dev) != B43_STAT_INITIALIZED); in b43_wireless_core_start()
4420 drain_txstatus_queue(dev); in b43_wireless_core_start()
4421 if (b43_bus_host_is_sdio(dev->dev)) { in b43_wireless_core_start()
4422 err = b43_sdio_request_irq(dev, b43_sdio_interrupt_handler); in b43_wireless_core_start()
4424 b43err(dev->wl, "Cannot request SDIO IRQ\n"); in b43_wireless_core_start()
4428 err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler, in b43_wireless_core_start()
4430 IRQF_SHARED, KBUILD_MODNAME, dev); in b43_wireless_core_start()
4432 b43err(dev->wl, "Cannot request IRQ-%d\n", in b43_wireless_core_start()
4433 dev->dev->irq); in b43_wireless_core_start()
4439 ieee80211_wake_queues(dev->wl->hw); in b43_wireless_core_start()
4440 b43_set_status(dev, B43_STAT_STARTED); in b43_wireless_core_start()
4443 b43_mac_enable(dev); in b43_wireless_core_start()
4444 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43_wireless_core_start()
4447 b43_periodic_tasks_setup(dev); in b43_wireless_core_start()
4449 b43_leds_init(dev); in b43_wireless_core_start()
4451 b43dbg(dev->wl, "Wireless interface started\n"); in b43_wireless_core_start()
4456 static char *b43_phy_name(struct b43_wldev *dev, u8 phy_type) in b43_phy_name() argument
4486 static int b43_phy_versioning(struct b43_wldev *dev) in b43_phy_versioning() argument
4488 struct b43_phy *phy = &dev->phy; in b43_phy_versioning()
4489 const u8 core_rev = dev->dev->core_rev; in b43_phy_versioning()
4501 tmp = b43_read16(dev, B43_MMIO_PHY_VER); in b43_phy_versioning()
4553 b43err(dev->wl, "FOUND UNSUPPORTED PHY (Analog %u, Type %d (%s), Revision %u)\n", in b43_phy_versioning()
4554 analog_type, phy_type, b43_phy_name(dev, phy_type), in b43_phy_versioning()
4558 b43info(dev->wl, "Found PHY: Analog %u, Type %d (%s), Revision %u\n", in b43_phy_versioning()
4559 analog_type, phy_type, b43_phy_name(dev, phy_type), phy_rev); in b43_phy_versioning()
4565 b43_write16f(dev, B43_MMIO_RADIO24_CONTROL, 0); in b43_phy_versioning()
4566 radio_rev = b43_read16(dev, B43_MMIO_RADIO24_DATA); in b43_phy_versioning()
4568 b43_write16f(dev, B43_MMIO_RADIO24_CONTROL, 1); in b43_phy_versioning()
4569 radio_id = b43_read16(dev, B43_MMIO_RADIO24_DATA); in b43_phy_versioning()
4576 b43_write16f(dev, B43_MMIO_RADIO24_CONTROL, tmp); in b43_phy_versioning()
4577 radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA); in b43_phy_versioning()
4585 if (dev->dev->chip_id == 0x4317) { in b43_phy_versioning()
4586 if (dev->dev->chip_rev == 0) in b43_phy_versioning()
4588 else if (dev->dev->chip_rev == 1) in b43_phy_versioning()
4593 b43_write16f(dev, B43_MMIO_RADIO_CONTROL, in b43_phy_versioning()
4595 tmp = b43_read16(dev, B43_MMIO_RADIO_DATA_LOW); in b43_phy_versioning()
4596 b43_write16f(dev, B43_MMIO_RADIO_CONTROL, in b43_phy_versioning()
4598 tmp |= b43_read16(dev, B43_MMIO_RADIO_DATA_HIGH) << 16; in b43_phy_versioning()
4653 b43err(dev->wl, in b43_phy_versioning()
4658 b43info(dev->wl, in b43_phy_versioning()
4674 static void setup_struct_phy_for_init(struct b43_wldev *dev, in setup_struct_phy_for_init() argument
4688 static void setup_struct_wldev_for_init(struct b43_wldev *dev) in setup_struct_wldev_for_init() argument
4690 dev->dfq_valid = false; in setup_struct_wldev_for_init()
4694 dev->radio_hw_enable = true; in setup_struct_wldev_for_init()
4697 memset(&dev->stats, 0, sizeof(dev->stats)); in setup_struct_wldev_for_init()
4699 setup_struct_phy_for_init(dev, &dev->phy); in setup_struct_wldev_for_init()
4702 dev->irq_reason = 0; in setup_struct_wldev_for_init()
4703 memset(dev->dma_reason, 0, sizeof(dev->dma_reason)); in setup_struct_wldev_for_init()
4704 dev->irq_mask = B43_IRQ_MASKTEMPLATE; in setup_struct_wldev_for_init()
4706 dev->irq_mask &= ~B43_IRQ_PHY_TXERR; in setup_struct_wldev_for_init()
4708 dev->mac_suspended = 1; in setup_struct_wldev_for_init()
4711 memset(&dev->noisecalc, 0, sizeof(dev->noisecalc)); in setup_struct_wldev_for_init()
4714 static void b43_bluetooth_coext_enable(struct b43_wldev *dev) in b43_bluetooth_coext_enable() argument
4716 struct ssb_sprom *sprom = dev->dev->bus_sprom; in b43_bluetooth_coext_enable()
4723 if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode) in b43_bluetooth_coext_enable()
4726 hf = b43_hf_read(dev); in b43_bluetooth_coext_enable()
4731 b43_hf_write(dev, hf); in b43_bluetooth_coext_enable()
4734 static void b43_bluetooth_coext_disable(struct b43_wldev *dev) in b43_bluetooth_coext_disable() argument
4741 static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev) in b43_imcfglo_timeouts_workaround() argument
4747 if (dev->dev->bus_type != B43_BUS_SSB) in b43_imcfglo_timeouts_workaround()
4753 bus = dev->dev->sdev->bus; in b43_imcfglo_timeouts_workaround()
4757 tmp = ssb_read32(dev->dev->sdev, SSB_IMCFGLO); in b43_imcfglo_timeouts_workaround()
4761 ssb_write32(dev->dev->sdev, SSB_IMCFGLO, tmp); in b43_imcfglo_timeouts_workaround()
4766 static void b43_set_synth_pu_delay(struct b43_wldev *dev, bool idle) in b43_set_synth_pu_delay() argument
4771 if (dev->phy.type == B43_PHYTYPE_A) in b43_set_synth_pu_delay()
4775 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle) in b43_set_synth_pu_delay()
4777 if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8)) in b43_set_synth_pu_delay()
4780 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SPUWKUP, pu_delay); in b43_set_synth_pu_delay()
4784 static void b43_set_pretbtt(struct b43_wldev *dev) in b43_set_pretbtt() argument
4789 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) { in b43_set_pretbtt()
4792 if (dev->phy.type == B43_PHYTYPE_A) in b43_set_pretbtt()
4797 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRETBTT, pretbtt); in b43_set_pretbtt()
4798 b43_write16(dev, B43_MMIO_TSF_CFP_PRETBTT, pretbtt); in b43_set_pretbtt()
4803 static void b43_wireless_core_exit(struct b43_wldev *dev) in b43_wireless_core_exit() argument
4805 B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED); in b43_wireless_core_exit()
4806 if (!dev || b43_status(dev) != B43_STAT_INITIALIZED) in b43_wireless_core_exit()
4809 b43_set_status(dev, B43_STAT_UNINIT); in b43_wireless_core_exit()
4812 b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN, in b43_wireless_core_exit()
4815 switch (dev->dev->bus_type) { in b43_wireless_core_exit()
4818 bcma_host_pci_down(dev->dev->bdev->bus); in b43_wireless_core_exit()
4828 b43_dma_free(dev); in b43_wireless_core_exit()
4829 b43_pio_free(dev); in b43_wireless_core_exit()
4830 b43_chip_exit(dev); in b43_wireless_core_exit()
4831 dev->phy.ops->switch_analog(dev, 0); in b43_wireless_core_exit()
4832 if (dev->wl->current_beacon) { in b43_wireless_core_exit()
4833 dev_kfree_skb_any(dev->wl->current_beacon); in b43_wireless_core_exit()
4834 dev->wl->current_beacon = NULL; in b43_wireless_core_exit()
4837 b43_device_disable(dev, 0); in b43_wireless_core_exit()
4838 b43_bus_may_powerdown(dev); in b43_wireless_core_exit()
4842 static int b43_wireless_core_init(struct b43_wldev *dev) in b43_wireless_core_init() argument
4844 struct ssb_sprom *sprom = dev->dev->bus_sprom; in b43_wireless_core_init()
4845 struct b43_phy *phy = &dev->phy; in b43_wireless_core_init()
4849 B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); in b43_wireless_core_init()
4851 err = b43_bus_powerup(dev, 0); in b43_wireless_core_init()
4854 if (!b43_device_is_enabled(dev)) in b43_wireless_core_init()
4855 b43_wireless_core_reset(dev, phy->gmode); in b43_wireless_core_init()
4858 setup_struct_wldev_for_init(dev); in b43_wireless_core_init()
4859 phy->ops->prepare_structs(dev); in b43_wireless_core_init()
4862 switch (dev->dev->bus_type) { in b43_wireless_core_init()
4865 bcma_host_pci_irq_ctl(dev->dev->bdev->bus, in b43_wireless_core_init()
4866 dev->dev->bdev, true); in b43_wireless_core_init()
4867 bcma_host_pci_up(dev->dev->bdev->bus); in b43_wireless_core_init()
4872 ssb_pcicore_dev_irqvecs_enable(&dev->dev->sdev->bus->pcicore, in b43_wireless_core_init()
4873 dev->dev->sdev); in b43_wireless_core_init()
4878 b43_imcfglo_timeouts_workaround(dev); in b43_wireless_core_init()
4879 b43_bluetooth_coext_disable(dev); in b43_wireless_core_init()
4881 err = phy->ops->prepare_hardware(dev); in b43_wireless_core_init()
4885 err = b43_chip_init(dev); in b43_wireless_core_init()
4888 b43_shm_write16(dev, B43_SHM_SHARED, in b43_wireless_core_init()
4889 B43_SHM_SH_WLCOREREV, dev->dev->core_rev); in b43_wireless_core_init()
4890 hf = b43_hf_read(dev); in b43_wireless_core_init()
4907 if (dev->dev->bus_type == B43_BUS_SSB && in b43_wireless_core_init()
4908 dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI && in b43_wireless_core_init()
4909 dev->dev->sdev->bus->pcicore.dev->id.revision <= 10) in b43_wireless_core_init()
4913 b43_hf_write(dev, hf); in b43_wireless_core_init()
4916 if (dev->dev->core_rev >= 13) { in b43_wireless_core_init()
4917 u32 mac_hw_cap = b43_read32(dev, B43_MMIO_MAC_HW_CAP); in b43_wireless_core_init()
4919 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_MACHW_L, in b43_wireless_core_init()
4921 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_MACHW_H, in b43_wireless_core_init()
4925 b43_set_retry_limits(dev, B43_DEFAULT_SHORT_RETRY_LIMIT, in b43_wireless_core_init()
4927 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3); in b43_wireless_core_init()
4928 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2); in b43_wireless_core_init()
4934 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 1); in b43_wireless_core_init()
4936 b43_rate_memory_init(dev); in b43_wireless_core_init()
4937 b43_set_phytxctl_defaults(dev); in b43_wireless_core_init()
4941 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0x1F); in b43_wireless_core_init()
4943 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0xF); in b43_wireless_core_init()
4945 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MAXCONT, 0x3FF); in b43_wireless_core_init()
4948 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PHYTYPE, phy->type); in b43_wireless_core_init()
4949 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PHYVER, phy->rev); in b43_wireless_core_init()
4951 if (b43_bus_host_is_pcmcia(dev->dev) || in b43_wireless_core_init()
4952 b43_bus_host_is_sdio(dev->dev)) { in b43_wireless_core_init()
4953 dev->__using_pio_transfers = true; in b43_wireless_core_init()
4954 err = b43_pio_init(dev); in b43_wireless_core_init()
4955 } else if (dev->use_pio) { in b43_wireless_core_init()
4956 b43warn(dev->wl, "Forced PIO by use_pio module parameter. " in b43_wireless_core_init()
4959 dev->__using_pio_transfers = true; in b43_wireless_core_init()
4960 err = b43_pio_init(dev); in b43_wireless_core_init()
4962 dev->__using_pio_transfers = false; in b43_wireless_core_init()
4963 err = b43_dma_init(dev); in b43_wireless_core_init()
4967 b43_qos_init(dev); in b43_wireless_core_init()
4968 b43_set_synth_pu_delay(dev, 1); in b43_wireless_core_init()
4969 b43_bluetooth_coext_enable(dev); in b43_wireless_core_init()
4971 b43_bus_powerup(dev, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)); in b43_wireless_core_init()
4972 b43_upload_card_macaddress(dev); in b43_wireless_core_init()
4973 b43_security_init(dev); in b43_wireless_core_init()
4975 ieee80211_wake_queues(dev->wl->hw); in b43_wireless_core_init()
4977 b43_set_status(dev, B43_STAT_INITIALIZED); in b43_wireless_core_init()
4983 b43_chip_exit(dev); in b43_wireless_core_init()
4985 b43_bus_may_powerdown(dev); in b43_wireless_core_init()
4986 B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); in b43_wireless_core_init()
4994 struct b43_wldev *dev; in b43_op_add_interface() local
5012 dev = wl->current_dev; in b43_op_add_interface()
5018 b43_adjust_opmode(dev); in b43_op_add_interface()
5019 b43_set_pretbtt(dev); in b43_op_add_interface()
5020 b43_set_synth_pu_delay(dev, 0); in b43_op_add_interface()
5021 b43_upload_card_macaddress(dev); in b43_op_add_interface()
5037 struct b43_wldev *dev = wl->current_dev; in b43_op_remove_interface() local
5049 b43_adjust_opmode(dev); in b43_op_remove_interface()
5051 b43_upload_card_macaddress(dev); in b43_op_remove_interface()
5059 struct b43_wldev *dev = wl->current_dev; in b43_op_start() local
5078 if (b43_status(dev) < B43_STAT_INITIALIZED) { in b43_op_start()
5079 err = b43_wireless_core_init(dev); in b43_op_start()
5085 if (b43_status(dev) < B43_STAT_STARTED) { in b43_op_start()
5086 err = b43_wireless_core_start(dev); in b43_op_start()
5089 b43_wireless_core_exit(dev); in b43_op_start()
5115 struct b43_wldev *dev = wl->current_dev; in b43_op_stop() local
5119 if (!dev) in b43_op_stop()
5123 if (b43_status(dev) >= B43_STAT_STARTED) { in b43_op_stop()
5124 dev = b43_wireless_core_stop(dev); in b43_op_stop()
5125 if (!dev) in b43_op_stop()
5128 b43_wireless_core_exit(dev); in b43_op_stop()
5162 struct b43_wldev *dev; in b43_op_sw_scan_start_notifier() local
5165 dev = wl->current_dev; in b43_op_sw_scan_start_notifier()
5166 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) { in b43_op_sw_scan_start_notifier()
5168 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_SKCFPUP); in b43_op_sw_scan_start_notifier()
5177 struct b43_wldev *dev; in b43_op_sw_scan_complete_notifier() local
5180 dev = wl->current_dev; in b43_op_sw_scan_complete_notifier()
5181 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) { in b43_op_sw_scan_complete_notifier()
5183 b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_SKCFPUP); in b43_op_sw_scan_complete_notifier()
5192 struct b43_wldev *dev = wl->current_dev; in b43_op_get_survey() local
5200 survey->noise = dev->stats.link_noise; in b43_op_get_survey()
5233 struct b43_wldev *dev = in b43_chip_reset() local
5235 struct b43_wl *wl = dev->wl; in b43_chip_reset()
5241 prev_status = b43_status(dev); in b43_chip_reset()
5244 dev = b43_wireless_core_stop(dev); in b43_chip_reset()
5245 if (!dev) { in b43_chip_reset()
5251 b43_wireless_core_exit(dev); in b43_chip_reset()
5255 err = b43_wireless_core_init(dev); in b43_chip_reset()
5260 err = b43_wireless_core_start(dev); in b43_chip_reset()
5262 b43_wireless_core_exit(dev); in b43_chip_reset()
5284 static int b43_setup_bands(struct b43_wldev *dev, in b43_setup_bands() argument
5287 struct ieee80211_hw *hw = dev->wl->hw; in b43_setup_bands()
5288 struct b43_phy *phy = &dev->phy; in b43_setup_bands()
5301 if (dev->phy.type == B43_PHYTYPE_N) { in b43_setup_bands()
5311 dev->phy.supports_2ghz = have_2ghz_phy; in b43_setup_bands()
5312 dev->phy.supports_5ghz = have_5ghz_phy; in b43_setup_bands()
5317 static void b43_wireless_core_detach(struct b43_wldev *dev) in b43_wireless_core_detach() argument
5321 b43_release_firmware(dev); in b43_wireless_core_detach()
5322 b43_phy_free(dev); in b43_wireless_core_detach()
5325 static void b43_supported_bands(struct b43_wldev *dev, bool *have_2ghz_phy, in b43_supported_bands() argument
5331 if (dev->dev->bus_type == B43_BUS_BCMA && in b43_supported_bands()
5332 dev->dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI) in b43_supported_bands()
5333 dev_id = dev->dev->bdev->bus->host_pci->device; in b43_supported_bands()
5336 if (dev->dev->bus_type == B43_BUS_SSB && in b43_supported_bands()
5337 dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI) in b43_supported_bands()
5338 dev_id = dev->dev->sdev->bus->host_pci->device; in b43_supported_bands()
5341 if (dev->dev->bus_sprom->dev_id) in b43_supported_bands()
5342 dev_id = dev->dev->bus_sprom->dev_id; in b43_supported_bands()
5365 if (dev->phy.type != B43_PHYTYPE_G) in b43_supported_bands()
5384 switch (dev->phy.type) { in b43_supported_bands()
5402 static int b43_wireless_core_attach(struct b43_wldev *dev) in b43_wireless_core_attach() argument
5404 struct b43_wl *wl = dev->wl; in b43_wireless_core_attach()
5405 struct b43_phy *phy = &dev->phy; in b43_wireless_core_attach()
5417 err = b43_bus_powerup(dev, 0); in b43_wireless_core_attach()
5426 switch (dev->dev->bus_type) { in b43_wireless_core_attach()
5429 tmp = bcma_aread32(dev->dev->bdev, BCMA_IOST); in b43_wireless_core_attach()
5436 if (dev->dev->core_rev >= 5) { in b43_wireless_core_attach()
5437 tmp = ssb_read32(dev->dev->sdev, SSB_TMSHIGH); in b43_wireless_core_attach()
5446 dev->phy.gmode = have_2ghz_phy; in b43_wireless_core_attach()
5447 b43_wireless_core_reset(dev, dev->phy.gmode); in b43_wireless_core_attach()
5450 err = b43_phy_versioning(dev); in b43_wireless_core_attach()
5455 b43_supported_bands(dev, &have_2ghz_phy, &have_5ghz_phy); in b43_wireless_core_attach()
5459 switch (dev->phy.type) { in b43_wireless_core_attach()
5475 err = b43_phy_allocate(dev); in b43_wireless_core_attach()
5479 dev->phy.gmode = have_2ghz_phy; in b43_wireless_core_attach()
5480 b43_wireless_core_reset(dev, dev->phy.gmode); in b43_wireless_core_attach()
5482 err = b43_validate_chipaccess(dev); in b43_wireless_core_attach()
5485 err = b43_setup_bands(dev, have_2ghz_phy, have_5ghz_phy); in b43_wireless_core_attach()
5491 wl->current_dev = dev; in b43_wireless_core_attach()
5492 INIT_WORK(&dev->restart_work, b43_chip_reset); in b43_wireless_core_attach()
5494 dev->phy.ops->switch_analog(dev, 0); in b43_wireless_core_attach()
5495 b43_device_disable(dev, 0); in b43_wireless_core_attach()
5496 b43_bus_may_powerdown(dev); in b43_wireless_core_attach()
5502 b43_phy_free(dev); in b43_wireless_core_attach()
5504 b43_bus_may_powerdown(dev); in b43_wireless_core_attach()
5508 static void b43_one_core_detach(struct b43_bus_dev *dev) in b43_one_core_detach() argument
5516 wldev = b43_bus_get_wldev(dev); in b43_one_core_detach()
5521 b43_bus_set_wldev(dev, NULL); in b43_one_core_detach()
5525 static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl) in b43_one_core_attach() argument
5535 wldev->dev = dev; in b43_one_core_attach()
5545 b43_bus_set_wldev(dev, wldev); in b43_one_core_attach()
5587 static void b43_wireless_exit(struct b43_bus_dev *dev, struct b43_wl *wl) in b43_wireless_exit() argument
5591 ssb_set_devtypedata(dev->sdev, NULL); in b43_wireless_exit()
5596 static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev) in b43_wireless_init() argument
5598 struct ssb_sprom *sprom = dev->bus_sprom; in b43_wireless_init()
5626 SET_IEEE80211_DEV(hw, dev->dev); in b43_wireless_init()
5648 (dev->chip_id > 0x9999) ? "%d" : "%04X", dev->chip_id); in b43_wireless_init()
5650 dev->core_rev); in b43_wireless_init()
5657 struct b43_bus_dev *dev; in b43_bcma_probe() local
5667 dev = b43_bus_dev_bcma_init(core); in b43_bcma_probe()
5668 if (!dev) in b43_bcma_probe()
5671 wl = b43_wireless_init(dev); in b43_bcma_probe()
5677 err = b43_one_core_attach(dev, wl); in b43_bcma_probe()
5711 b43_one_core_detach(wldev->dev); in b43_bcma_remove()
5733 struct b43_bus_dev *dev; in b43_ssb_probe() local
5737 dev = b43_bus_dev_ssb_init(sdev); in b43_ssb_probe()
5738 if (!dev) in b43_ssb_probe()
5750 wl = b43_wireless_init(dev); in b43_ssb_probe()
5758 err = b43_one_core_attach(dev, wl); in b43_ssb_probe()
5769 b43_wireless_exit(dev, wl); in b43_ssb_probe()
5771 kfree(dev); in b43_ssb_probe()
5779 struct b43_bus_dev *dev = wldev->dev; in b43_ssb_remove() local
5794 b43_one_core_detach(dev); in b43_ssb_remove()
5800 b43_wireless_exit(dev, wl); in b43_ssb_remove()
5812 void b43_controller_restart(struct b43_wldev *dev, const char *reason) in b43_controller_restart() argument
5815 if (b43_status(dev) < B43_STAT_INITIALIZED) in b43_controller_restart()
5817 b43info(dev->wl, "Controller RESET (%s) ...\n", reason); in b43_controller_restart()
5818 ieee80211_queue_work(dev->wl->hw, &dev->restart_work); in b43_controller_restart()