Lines Matching refs:dev

149 static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev);
150 static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev);
151 static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev);
152 static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev);
241 static void b43legacy_ram_write(struct b43legacy_wldev *dev, u16 offset, in b43legacy_ram_write() argument
248 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_ram_write()
252 b43legacy_write32(dev, B43legacy_MMIO_RAM_CONTROL, offset); in b43legacy_ram_write()
253 b43legacy_write32(dev, B43legacy_MMIO_RAM_DATA, val); in b43legacy_ram_write()
257 void b43legacy_shm_control_word(struct b43legacy_wldev *dev, in b43legacy_shm_control_word() argument
267 b43legacy_write32(dev, B43legacy_MMIO_SHM_CONTROL, control); in b43legacy_shm_control_word()
270 u32 b43legacy_shm_read32(struct b43legacy_wldev *dev, in b43legacy_shm_read32() argument
279 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_read32()
280 ret = b43legacy_read16(dev, in b43legacy_shm_read32()
283 b43legacy_shm_control_word(dev, routing, in b43legacy_shm_read32()
285 ret |= b43legacy_read16(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read32()
291 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_read32()
292 ret = b43legacy_read32(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read32()
297 u16 b43legacy_shm_read16(struct b43legacy_wldev *dev, in b43legacy_shm_read16() argument
306 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_read16()
307 ret = b43legacy_read16(dev, in b43legacy_shm_read16()
314 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_read16()
315 ret = b43legacy_read16(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read16()
320 void b43legacy_shm_write32(struct b43legacy_wldev *dev, in b43legacy_shm_write32() argument
328 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_write32()
329 b43legacy_write16(dev, in b43legacy_shm_write32()
332 b43legacy_shm_control_word(dev, routing, in b43legacy_shm_write32()
334 b43legacy_write16(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_shm_write32()
340 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_write32()
341 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, value); in b43legacy_shm_write32()
344 void b43legacy_shm_write16(struct b43legacy_wldev *dev, u16 routing, u16 offset, in b43legacy_shm_write16() argument
351 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_write16()
352 b43legacy_write16(dev, in b43legacy_shm_write16()
359 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_write16()
360 b43legacy_write16(dev, B43legacy_MMIO_SHM_DATA, value); in b43legacy_shm_write16()
364 u32 b43legacy_hf_read(struct b43legacy_wldev *dev) in b43legacy_hf_read() argument
368 ret = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_read()
371 ret |= b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_read()
378 void b43legacy_hf_write(struct b43legacy_wldev *dev, u32 value) in b43legacy_hf_write() argument
380 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_write()
383 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_write()
388 void b43legacy_tsf_read(struct b43legacy_wldev *dev, u64 *tsf) in b43legacy_tsf_read() argument
396 if (dev->dev->id.revision >= 3) { in b43legacy_tsf_read()
402 high = b43legacy_read32(dev, in b43legacy_tsf_read()
404 low = b43legacy_read32(dev, in b43legacy_tsf_read()
406 high2 = b43legacy_read32(dev, in b43legacy_tsf_read()
424 v3 = b43legacy_read16(dev, B43legacy_MMIO_TSF_3); in b43legacy_tsf_read()
425 v2 = b43legacy_read16(dev, B43legacy_MMIO_TSF_2); in b43legacy_tsf_read()
426 v1 = b43legacy_read16(dev, B43legacy_MMIO_TSF_1); in b43legacy_tsf_read()
427 v0 = b43legacy_read16(dev, B43legacy_MMIO_TSF_0); in b43legacy_tsf_read()
429 test3 = b43legacy_read16(dev, B43legacy_MMIO_TSF_3); in b43legacy_tsf_read()
430 test2 = b43legacy_read16(dev, B43legacy_MMIO_TSF_2); in b43legacy_tsf_read()
431 test1 = b43legacy_read16(dev, B43legacy_MMIO_TSF_1); in b43legacy_tsf_read()
446 static void b43legacy_time_lock(struct b43legacy_wldev *dev) in b43legacy_time_lock() argument
450 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_time_lock()
452 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); in b43legacy_time_lock()
455 static void b43legacy_time_unlock(struct b43legacy_wldev *dev) in b43legacy_time_unlock() argument
459 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_time_unlock()
461 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); in b43legacy_time_unlock()
464 static void b43legacy_tsf_write_locked(struct b43legacy_wldev *dev, u64 tsf) in b43legacy_tsf_write_locked() argument
470 if (dev->dev->id.revision >= 3) { in b43legacy_tsf_write_locked()
474 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_LOW, 0); in b43legacy_tsf_write_locked()
475 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_HIGH, in b43legacy_tsf_write_locked()
477 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_LOW, in b43legacy_tsf_write_locked()
485 b43legacy_write16(dev, B43legacy_MMIO_TSF_0, 0); in b43legacy_tsf_write_locked()
486 b43legacy_write16(dev, B43legacy_MMIO_TSF_3, v3); in b43legacy_tsf_write_locked()
487 b43legacy_write16(dev, B43legacy_MMIO_TSF_2, v2); in b43legacy_tsf_write_locked()
488 b43legacy_write16(dev, B43legacy_MMIO_TSF_1, v1); in b43legacy_tsf_write_locked()
489 b43legacy_write16(dev, B43legacy_MMIO_TSF_0, v0); in b43legacy_tsf_write_locked()
493 void b43legacy_tsf_write(struct b43legacy_wldev *dev, u64 tsf) in b43legacy_tsf_write() argument
495 b43legacy_time_lock(dev); in b43legacy_tsf_write()
496 b43legacy_tsf_write_locked(dev, tsf); in b43legacy_tsf_write()
497 b43legacy_time_unlock(dev); in b43legacy_tsf_write()
501 void b43legacy_macfilter_set(struct b43legacy_wldev *dev, in b43legacy_macfilter_set() argument
511 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_CONTROL, offset); in b43legacy_macfilter_set()
515 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
518 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
521 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
524 static void b43legacy_write_mac_bssid_templates(struct b43legacy_wldev *dev) in b43legacy_write_mac_bssid_templates() argument
527 const u8 *mac = dev->wl->mac_addr; in b43legacy_write_mac_bssid_templates()
528 const u8 *bssid = dev->wl->bssid; in b43legacy_write_mac_bssid_templates()
538 b43legacy_macfilter_set(dev, B43legacy_MACFILTER_BSSID, bssid); in b43legacy_write_mac_bssid_templates()
549 b43legacy_ram_write(dev, 0x20 + i, tmp); in b43legacy_write_mac_bssid_templates()
550 b43legacy_ram_write(dev, 0x78 + i, tmp); in b43legacy_write_mac_bssid_templates()
551 b43legacy_ram_write(dev, 0x478 + i, tmp); in b43legacy_write_mac_bssid_templates()
555 static void b43legacy_upload_card_macaddress(struct b43legacy_wldev *dev) in b43legacy_upload_card_macaddress() argument
557 b43legacy_write_mac_bssid_templates(dev); in b43legacy_upload_card_macaddress()
558 b43legacy_macfilter_set(dev, B43legacy_MACFILTER_SELF, in b43legacy_upload_card_macaddress()
559 dev->wl->mac_addr); in b43legacy_upload_card_macaddress()
562 static void b43legacy_set_slot_time(struct b43legacy_wldev *dev, in b43legacy_set_slot_time() argument
566 if (dev->phy.type != B43legacy_PHYTYPE_G) in b43legacy_set_slot_time()
568 b43legacy_write16(dev, 0x684, 510 + slot_time); in b43legacy_set_slot_time()
569 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0010, in b43legacy_set_slot_time()
573 static void b43legacy_short_slot_timing_enable(struct b43legacy_wldev *dev) in b43legacy_short_slot_timing_enable() argument
575 b43legacy_set_slot_time(dev, 9); in b43legacy_short_slot_timing_enable()
578 static void b43legacy_short_slot_timing_disable(struct b43legacy_wldev *dev) in b43legacy_short_slot_timing_disable() argument
580 b43legacy_set_slot_time(dev, 20); in b43legacy_short_slot_timing_disable()
587 static void b43legacy_synchronize_irq(struct b43legacy_wldev *dev) in b43legacy_synchronize_irq() argument
589 synchronize_irq(dev->dev->irq); in b43legacy_synchronize_irq()
590 tasklet_kill(&dev->isr_tasklet); in b43legacy_synchronize_irq()
596 void b43legacy_dummy_transmission(struct b43legacy_wldev *dev) in b43legacy_dummy_transmission() argument
598 struct b43legacy_phy *phy = &dev->phy; in b43legacy_dummy_transmission()
622 b43legacy_ram_write(dev, i * 4, buffer[i]); in b43legacy_dummy_transmission()
625 b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_dummy_transmission()
627 b43legacy_write16(dev, 0x0568, 0x0000); in b43legacy_dummy_transmission()
628 b43legacy_write16(dev, 0x07C0, 0x0000); in b43legacy_dummy_transmission()
629 b43legacy_write16(dev, 0x050C, 0x0000); in b43legacy_dummy_transmission()
630 b43legacy_write16(dev, 0x0508, 0x0000); in b43legacy_dummy_transmission()
631 b43legacy_write16(dev, 0x050A, 0x0000); in b43legacy_dummy_transmission()
632 b43legacy_write16(dev, 0x054C, 0x0000); in b43legacy_dummy_transmission()
633 b43legacy_write16(dev, 0x056A, 0x0014); in b43legacy_dummy_transmission()
634 b43legacy_write16(dev, 0x0568, 0x0826); in b43legacy_dummy_transmission()
635 b43legacy_write16(dev, 0x0500, 0x0000); in b43legacy_dummy_transmission()
636 b43legacy_write16(dev, 0x0502, 0x0030); in b43legacy_dummy_transmission()
639 b43legacy_radio_write16(dev, 0x0051, 0x0017); in b43legacy_dummy_transmission()
641 value = b43legacy_read16(dev, 0x050E); in b43legacy_dummy_transmission()
647 value = b43legacy_read16(dev, 0x050E); in b43legacy_dummy_transmission()
653 value = b43legacy_read16(dev, 0x0690); in b43legacy_dummy_transmission()
659 b43legacy_radio_write16(dev, 0x0051, 0x0037); in b43legacy_dummy_transmission()
663 static void b43legacy_switch_analog(struct b43legacy_wldev *dev, int on) in b43legacy_switch_analog() argument
665 b43legacy_write16(dev, B43legacy_MMIO_PHY0, on ? 0 : 0xF4); in b43legacy_switch_analog()
668 void b43legacy_wireless_core_reset(struct b43legacy_wldev *dev, u32 flags) in b43legacy_wireless_core_reset() argument
675 ssb_device_enable(dev->dev, flags); in b43legacy_wireless_core_reset()
679 tmslow = ssb_read32(dev->dev, SSB_TMSLOW); in b43legacy_wireless_core_reset()
682 ssb_write32(dev->dev, SSB_TMSLOW, tmslow); in b43legacy_wireless_core_reset()
683 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */ in b43legacy_wireless_core_reset()
686 ssb_write32(dev->dev, SSB_TMSLOW, tmslow); in b43legacy_wireless_core_reset()
687 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */ in b43legacy_wireless_core_reset()
691 b43legacy_switch_analog(dev, 1); in b43legacy_wireless_core_reset()
693 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_wireless_core_reset()
697 dev->phy.gmode = true; in b43legacy_wireless_core_reset()
699 dev->phy.gmode = false; in b43legacy_wireless_core_reset()
701 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_wireless_core_reset()
704 static void handle_irq_transmit_status(struct b43legacy_wldev *dev) in handle_irq_transmit_status() argument
712 v0 = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_0); in handle_irq_transmit_status()
715 v1 = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_1); in handle_irq_transmit_status()
729 b43legacy_handle_txstatus(dev, &stat); in handle_irq_transmit_status()
733 static void drain_txstatus_queue(struct b43legacy_wldev *dev) in drain_txstatus_queue() argument
737 if (dev->dev->id.revision < 5) in drain_txstatus_queue()
743 dummy = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_0); in drain_txstatus_queue()
746 dummy = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_1); in drain_txstatus_queue()
750 static u32 b43legacy_jssi_read(struct b43legacy_wldev *dev) in b43legacy_jssi_read() argument
754 val = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, 0x40A); in b43legacy_jssi_read()
756 val |= b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, 0x408); in b43legacy_jssi_read()
761 static void b43legacy_jssi_write(struct b43legacy_wldev *dev, u32 jssi) in b43legacy_jssi_write() argument
763 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x408, in b43legacy_jssi_write()
765 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x40A, in b43legacy_jssi_write()
769 static void b43legacy_generate_noise_sample(struct b43legacy_wldev *dev) in b43legacy_generate_noise_sample() argument
771 b43legacy_jssi_write(dev, 0x7F7F7F7F); in b43legacy_generate_noise_sample()
772 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, in b43legacy_generate_noise_sample()
773 b43legacy_read32(dev, B43legacy_MMIO_MACCMD) in b43legacy_generate_noise_sample()
775 B43legacy_WARN_ON(dev->noisecalc.channel_at_start != in b43legacy_generate_noise_sample()
776 dev->phy.channel); in b43legacy_generate_noise_sample()
779 static void b43legacy_calculate_link_quality(struct b43legacy_wldev *dev) in b43legacy_calculate_link_quality() argument
783 if (dev->noisecalc.calculation_running) in b43legacy_calculate_link_quality()
785 dev->noisecalc.channel_at_start = dev->phy.channel; in b43legacy_calculate_link_quality()
786 dev->noisecalc.calculation_running = true; in b43legacy_calculate_link_quality()
787 dev->noisecalc.nr_samples = 0; in b43legacy_calculate_link_quality()
789 b43legacy_generate_noise_sample(dev); in b43legacy_calculate_link_quality()
792 static void handle_irq_noise(struct b43legacy_wldev *dev) in handle_irq_noise() argument
794 struct b43legacy_phy *phy = &dev->phy; in handle_irq_noise()
803 B43legacy_WARN_ON(!dev->noisecalc.calculation_running); in handle_irq_noise()
804 if (dev->noisecalc.channel_at_start != phy->channel) in handle_irq_noise()
806 *((__le32 *)noise) = cpu_to_le32(b43legacy_jssi_read(dev)); in handle_irq_noise()
812 B43legacy_WARN_ON(dev->noisecalc.nr_samples >= 8); in handle_irq_noise()
813 i = dev->noisecalc.nr_samples; in handle_irq_noise()
818 dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]]; in handle_irq_noise()
819 dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]]; in handle_irq_noise()
820 dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]]; in handle_irq_noise()
821 dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]]; in handle_irq_noise()
822 dev->noisecalc.nr_samples++; in handle_irq_noise()
823 if (dev->noisecalc.nr_samples == 8) { in handle_irq_noise()
828 average += dev->noisecalc.samples[i][j]; in handle_irq_noise()
834 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in handle_irq_noise()
846 dev->stats.link_noise = average; in handle_irq_noise()
848 dev->noisecalc.calculation_running = false; in handle_irq_noise()
852 b43legacy_generate_noise_sample(dev); in handle_irq_noise()
855 static void handle_irq_tbtt_indication(struct b43legacy_wldev *dev) in handle_irq_tbtt_indication() argument
857 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_AP)) { in handle_irq_tbtt_indication()
861 b43legacy_power_saving_ctl_bits(dev, -1, -1); in handle_irq_tbtt_indication()
863 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in handle_irq_tbtt_indication()
864 dev->dfq_valid = true; in handle_irq_tbtt_indication()
867 static void handle_irq_atim_end(struct b43legacy_wldev *dev) in handle_irq_atim_end() argument
869 if (dev->dfq_valid) { in handle_irq_atim_end()
870 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, in handle_irq_atim_end()
871 b43legacy_read32(dev, B43legacy_MMIO_MACCMD) in handle_irq_atim_end()
873 dev->dfq_valid = false; in handle_irq_atim_end()
877 static void handle_irq_pmq(struct b43legacy_wldev *dev) in handle_irq_pmq() argument
884 tmp = b43legacy_read32(dev, B43legacy_MMIO_PS_STATUS); in handle_irq_pmq()
889 b43legacy_write16(dev, B43legacy_MMIO_PS_STATUS, 0x0002); in handle_irq_pmq()
892 static void b43legacy_write_template_common(struct b43legacy_wldev *dev, in b43legacy_write_template_common() argument
903 b43legacy_ram_write(dev, ram_offset, le32_to_cpu(plcp.data)); in b43legacy_write_template_common()
910 b43legacy_ram_write(dev, ram_offset, tmp); in b43legacy_write_template_common()
920 b43legacy_ram_write(dev, ram_offset + i - 2, tmp); in b43legacy_write_template_common()
922 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_size_offset, in b43legacy_write_template_common()
938 static void b43legacy_write_beacon_template(struct b43legacy_wldev *dev, in b43legacy_write_beacon_template() argument
950 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(dev->wl->current_beacon); in b43legacy_write_beacon_template()
952 bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data); in b43legacy_write_beacon_template()
953 len = min_t(size_t, dev->wl->current_beacon->len, in b43legacy_write_beacon_template()
955 rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value; in b43legacy_write_beacon_template()
957 b43legacy_write_template_common(dev, (const u8 *)bcn, len, ram_offset, in b43legacy_write_beacon_template()
963 ctl = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
971 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1003 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1005 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1012 b43legacywarn(dev->wl, "Did not find a valid TIM IE in the " in b43legacy_write_beacon_template()
1016 b43legacydbg(dev->wl, "Updated beacon template\n"); in b43legacy_write_beacon_template()
1019 static void b43legacy_write_probe_resp_plcp(struct b43legacy_wldev *dev, in b43legacy_write_probe_resp_plcp() argument
1029 dur = ieee80211_generic_frame_duration(dev->wl->hw, in b43legacy_write_probe_resp_plcp()
1030 dev->wl->vif, in b43legacy_write_probe_resp_plcp()
1036 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset, in b43legacy_write_probe_resp_plcp()
1038 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset + 2, in b43legacy_write_probe_resp_plcp()
1040 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset + 6, in b43legacy_write_probe_resp_plcp()
1050 static const u8 *b43legacy_generate_probe_resp(struct b43legacy_wldev *dev, in b43legacy_generate_probe_resp() argument
1061 src_size = dev->wl->current_beacon->len; in b43legacy_generate_probe_resp()
1062 src_data = (const u8 *)dev->wl->current_beacon->data; in b43legacy_generate_probe_resp()
1095 dur = ieee80211_generic_frame_duration(dev->wl->hw, in b43legacy_generate_probe_resp()
1096 dev->wl->vif, in b43legacy_generate_probe_resp()
1105 static void b43legacy_write_probe_resp_template(struct b43legacy_wldev *dev, in b43legacy_write_probe_resp_template() argument
1113 size = dev->wl->current_beacon->len; in b43legacy_write_probe_resp_template()
1114 probe_resp_data = b43legacy_generate_probe_resp(dev, &size, rate); in b43legacy_write_probe_resp_template()
1121 b43legacy_write_probe_resp_plcp(dev, 0x31A, size, in b43legacy_write_probe_resp_template()
1123 b43legacy_write_probe_resp_plcp(dev, 0x32C, size, in b43legacy_write_probe_resp_template()
1125 b43legacy_write_probe_resp_plcp(dev, 0x33E, size, in b43legacy_write_probe_resp_template()
1127 b43legacy_write_probe_resp_plcp(dev, 0x350, size, in b43legacy_write_probe_resp_template()
1132 b43legacy_write_template_common(dev, probe_resp_data, in b43legacy_write_probe_resp_template()
1138 static void b43legacy_upload_beacon0(struct b43legacy_wldev *dev) in b43legacy_upload_beacon0() argument
1140 struct b43legacy_wl *wl = dev->wl; in b43legacy_upload_beacon0()
1144 b43legacy_write_beacon_template(dev, 0x68, 0x18); in b43legacy_upload_beacon0()
1147 b43legacy_write_probe_resp_template(dev, 0x268, 0x4A, in b43legacy_upload_beacon0()
1152 static void b43legacy_upload_beacon1(struct b43legacy_wldev *dev) in b43legacy_upload_beacon1() argument
1154 struct b43legacy_wl *wl = dev->wl; in b43legacy_upload_beacon1()
1158 b43legacy_write_beacon_template(dev, 0x468, 0x1A); in b43legacy_upload_beacon1()
1162 static void handle_irq_beacon(struct b43legacy_wldev *dev) in handle_irq_beacon() argument
1164 struct b43legacy_wl *wl = dev->wl; in handle_irq_beacon()
1173 dev->irq_mask &= ~B43legacy_IRQ_BEACON; in handle_irq_beacon()
1175 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1181 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, B43legacy_IRQ_BEACON); in handle_irq_beacon()
1182 dev->irq_mask |= B43legacy_IRQ_BEACON; in handle_irq_beacon()
1190 b43legacy_upload_beacon0(dev); in handle_irq_beacon()
1191 b43legacy_upload_beacon1(dev); in handle_irq_beacon()
1192 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1194 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1197 b43legacy_upload_beacon0(dev); in handle_irq_beacon()
1198 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1200 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1202 b43legacy_upload_beacon1(dev); in handle_irq_beacon()
1203 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1205 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1214 struct b43legacy_wldev *dev; in b43legacy_beacon_update_trigger_work() local
1217 dev = wl->current_dev; in b43legacy_beacon_update_trigger_work()
1218 if (likely(dev && (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED))) { in b43legacy_beacon_update_trigger_work()
1221 handle_irq_beacon(dev); in b43legacy_beacon_update_trigger_work()
1223 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, in b43legacy_beacon_update_trigger_work()
1224 dev->irq_mask); in b43legacy_beacon_update_trigger_work()
1256 static void b43legacy_set_beacon_int(struct b43legacy_wldev *dev, in b43legacy_set_beacon_int() argument
1259 b43legacy_time_lock(dev); in b43legacy_set_beacon_int()
1260 if (dev->dev->id.revision >= 3) { in b43legacy_set_beacon_int()
1261 b43legacy_write32(dev, B43legacy_MMIO_TSF_CFP_REP, in b43legacy_set_beacon_int()
1263 b43legacy_write32(dev, B43legacy_MMIO_TSF_CFP_START, in b43legacy_set_beacon_int()
1266 b43legacy_write16(dev, 0x606, (beacon_int >> 6)); in b43legacy_set_beacon_int()
1267 b43legacy_write16(dev, 0x610, beacon_int); in b43legacy_set_beacon_int()
1269 b43legacy_time_unlock(dev); in b43legacy_set_beacon_int()
1270 b43legacydbg(dev->wl, "Set beacon interval to %u\n", beacon_int); in b43legacy_set_beacon_int()
1273 static void handle_irq_ucode_debug(struct b43legacy_wldev *dev) in handle_irq_ucode_debug() argument
1280 struct b43legacy_wldev *dev = from_tasklet(dev, t, isr_tasklet); in b43legacy_interrupt_tasklet() local
1282 u32 dma_reason[ARRAY_SIZE(dev->dma_reason)]; in b43legacy_interrupt_tasklet()
1287 spin_lock_irqsave(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1289 B43legacy_WARN_ON(b43legacy_status(dev) < in b43legacy_interrupt_tasklet()
1292 reason = dev->irq_reason; in b43legacy_interrupt_tasklet()
1294 dma_reason[i] = dev->dma_reason[i]; in b43legacy_interrupt_tasklet()
1299 b43legacyerr(dev->wl, "MAC transmission error\n"); in b43legacy_interrupt_tasklet()
1302 b43legacyerr(dev->wl, "PHY transmission error\n"); in b43legacy_interrupt_tasklet()
1304 if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) { in b43legacy_interrupt_tasklet()
1305 b43legacyerr(dev->wl, "Too many PHY TX errors, " in b43legacy_interrupt_tasklet()
1307 b43legacy_controller_restart(dev, "PHY TX errors"); in b43legacy_interrupt_tasklet()
1314 b43legacyerr(dev->wl, "Fatal DMA error: " in b43legacy_interrupt_tasklet()
1320 b43legacy_controller_restart(dev, "DMA error"); in b43legacy_interrupt_tasklet()
1321 spin_unlock_irqrestore(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1325 b43legacyerr(dev->wl, "DMA error: " in b43legacy_interrupt_tasklet()
1334 handle_irq_ucode_debug(dev); in b43legacy_interrupt_tasklet()
1336 handle_irq_tbtt_indication(dev); in b43legacy_interrupt_tasklet()
1338 handle_irq_atim_end(dev); in b43legacy_interrupt_tasklet()
1340 handle_irq_beacon(dev); in b43legacy_interrupt_tasklet()
1342 handle_irq_pmq(dev); in b43legacy_interrupt_tasklet()
1347 handle_irq_noise(dev); in b43legacy_interrupt_tasklet()
1351 if (b43legacy_using_pio(dev)) in b43legacy_interrupt_tasklet()
1352 b43legacy_pio_rx(dev->pio.queue0); in b43legacy_interrupt_tasklet()
1354 b43legacy_dma_rx(dev->dma.rx_ring0); in b43legacy_interrupt_tasklet()
1359 if (b43legacy_using_pio(dev)) in b43legacy_interrupt_tasklet()
1360 b43legacy_pio_rx(dev->pio.queue3); in b43legacy_interrupt_tasklet()
1362 b43legacy_dma_rx(dev->dma.rx_ring3); in b43legacy_interrupt_tasklet()
1368 handle_irq_transmit_status(dev); in b43legacy_interrupt_tasklet()
1370 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_interrupt_tasklet()
1371 spin_unlock_irqrestore(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1374 static void pio_irq_workaround(struct b43legacy_wldev *dev, in pio_irq_workaround() argument
1379 rxctl = b43legacy_read16(dev, base + B43legacy_PIO_RXCTL); in pio_irq_workaround()
1381 dev->dma_reason[queueidx] |= B43legacy_DMAIRQ_RX_DONE; in pio_irq_workaround()
1383 dev->dma_reason[queueidx] &= ~B43legacy_DMAIRQ_RX_DONE; in pio_irq_workaround()
1386 static void b43legacy_interrupt_ack(struct b43legacy_wldev *dev, u32 reason) in b43legacy_interrupt_ack() argument
1388 if (b43legacy_using_pio(dev) && in b43legacy_interrupt_ack()
1389 (dev->dev->id.revision < 3) && in b43legacy_interrupt_ack()
1392 pio_irq_workaround(dev, B43legacy_MMIO_PIO1_BASE, 0); in b43legacy_interrupt_ack()
1393 pio_irq_workaround(dev, B43legacy_MMIO_PIO2_BASE, 1); in b43legacy_interrupt_ack()
1394 pio_irq_workaround(dev, B43legacy_MMIO_PIO3_BASE, 2); in b43legacy_interrupt_ack()
1395 pio_irq_workaround(dev, B43legacy_MMIO_PIO4_BASE, 3); in b43legacy_interrupt_ack()
1398 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, reason); in b43legacy_interrupt_ack()
1400 b43legacy_write32(dev, B43legacy_MMIO_DMA0_REASON, in b43legacy_interrupt_ack()
1401 dev->dma_reason[0]); in b43legacy_interrupt_ack()
1402 b43legacy_write32(dev, B43legacy_MMIO_DMA1_REASON, in b43legacy_interrupt_ack()
1403 dev->dma_reason[1]); in b43legacy_interrupt_ack()
1404 b43legacy_write32(dev, B43legacy_MMIO_DMA2_REASON, in b43legacy_interrupt_ack()
1405 dev->dma_reason[2]); in b43legacy_interrupt_ack()
1406 b43legacy_write32(dev, B43legacy_MMIO_DMA3_REASON, in b43legacy_interrupt_ack()
1407 dev->dma_reason[3]); in b43legacy_interrupt_ack()
1408 b43legacy_write32(dev, B43legacy_MMIO_DMA4_REASON, in b43legacy_interrupt_ack()
1409 dev->dma_reason[4]); in b43legacy_interrupt_ack()
1410 b43legacy_write32(dev, B43legacy_MMIO_DMA5_REASON, in b43legacy_interrupt_ack()
1411 dev->dma_reason[5]); in b43legacy_interrupt_ack()
1418 struct b43legacy_wldev *dev = dev_id; in b43legacy_interrupt_handler() local
1421 B43legacy_WARN_ON(!dev); in b43legacy_interrupt_handler()
1423 spin_lock(&dev->wl->irq_lock); in b43legacy_interrupt_handler()
1425 if (unlikely(b43legacy_status(dev) < B43legacy_STAT_STARTED)) in b43legacy_interrupt_handler()
1428 reason = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_interrupt_handler()
1432 reason &= dev->irq_mask; in b43legacy_interrupt_handler()
1436 dev->dma_reason[0] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1439 dev->dma_reason[1] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1442 dev->dma_reason[2] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1445 dev->dma_reason[3] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1448 dev->dma_reason[4] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1451 dev->dma_reason[5] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1455 b43legacy_interrupt_ack(dev, reason); in b43legacy_interrupt_handler()
1457 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_interrupt_handler()
1459 dev->irq_reason = reason; in b43legacy_interrupt_handler()
1460 tasklet_schedule(&dev->isr_tasklet); in b43legacy_interrupt_handler()
1462 spin_unlock(&dev->wl->irq_lock); in b43legacy_interrupt_handler()
1467 static void b43legacy_release_firmware(struct b43legacy_wldev *dev) in b43legacy_release_firmware() argument
1469 release_firmware(dev->fw.ucode); in b43legacy_release_firmware()
1470 dev->fw.ucode = NULL; in b43legacy_release_firmware()
1471 release_firmware(dev->fw.pcm); in b43legacy_release_firmware()
1472 dev->fw.pcm = NULL; in b43legacy_release_firmware()
1473 release_firmware(dev->fw.initvals); in b43legacy_release_firmware()
1474 dev->fw.initvals = NULL; in b43legacy_release_firmware()
1475 release_firmware(dev->fw.initvals_band); in b43legacy_release_firmware()
1476 dev->fw.initvals_band = NULL; in b43legacy_release_firmware()
1488 struct b43legacy_wldev *dev = context; in b43legacy_fw_cb() local
1490 dev->fwp = firmware; in b43legacy_fw_cb()
1491 complete(&dev->fw_load_complete); in b43legacy_fw_cb()
1494 static int do_request_fw(struct b43legacy_wldev *dev, in do_request_fw() argument
1509 b43legacyinfo(dev->wl, "Loading firmware %s\n", path); in do_request_fw()
1511 init_completion(&dev->fw_load_complete); in do_request_fw()
1513 dev->dev->dev, GFP_KERNEL, in do_request_fw()
1514 dev, b43legacy_fw_cb); in do_request_fw()
1516 b43legacyerr(dev->wl, "Unable to load firmware\n"); in do_request_fw()
1520 wait_for_completion(&dev->fw_load_complete); in do_request_fw()
1521 if (!dev->fwp) in do_request_fw()
1523 *fw = dev->fwp; in do_request_fw()
1525 err = request_firmware(fw, path, dev->dev->dev); in do_request_fw()
1528 b43legacyerr(dev->wl, "Firmware file \"%s\" not found " in do_request_fw()
1553 b43legacyerr(dev->wl, "Firmware file \"%s\" format error.\n", path); in do_request_fw()
1557 static int b43legacy_one_core_attach(struct ssb_device *dev,
1559 static void b43legacy_one_core_detach(struct ssb_device *dev);
1565 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_request_firmware() local
1566 struct b43legacy_firmware *fw = &dev->fw; in b43legacy_request_firmware()
1567 const u8 rev = dev->dev->id.revision; in b43legacy_request_firmware()
1578 err = do_request_fw(dev, filename, &fw->ucode, true); in b43legacy_request_firmware()
1587 err = do_request_fw(dev, filename, &fw->pcm, false); in b43legacy_request_firmware()
1592 switch (dev->phy.type) { in b43legacy_request_firmware()
1605 err = do_request_fw(dev, filename, &fw->initvals, false); in b43legacy_request_firmware()
1610 switch (dev->phy.type) { in b43legacy_request_firmware()
1625 err = do_request_fw(dev, filename, &fw->initvals_band, false); in b43legacy_request_firmware()
1635 b43legacy_one_core_detach(dev->dev); in b43legacy_request_firmware()
1639 b43legacy_print_fw_helptext(dev->wl); in b43legacy_request_firmware()
1644 b43legacyerr(dev->wl, "No Initial Values firmware file for PHY %u, " in b43legacy_request_firmware()
1645 "core rev %u\n", dev->phy.type, rev); in b43legacy_request_firmware()
1649 b43legacy_release_firmware(dev); in b43legacy_request_firmware()
1653 static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) in b43legacy_upload_microcode() argument
1655 struct wiphy *wiphy = dev->wl->hw->wiphy; in b43legacy_upload_microcode()
1668 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1671 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1674 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, i, 0); in b43legacy_upload_microcode()
1676 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, i, 0); in b43legacy_upload_microcode()
1679 data = (__be32 *) (dev->fw.ucode->data + hdr_len); in b43legacy_upload_microcode()
1680 len = (dev->fw.ucode->size - hdr_len) / sizeof(__be32); in b43legacy_upload_microcode()
1681 b43legacy_shm_control_word(dev, in b43legacy_upload_microcode()
1686 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_upload_microcode()
1691 if (dev->fw.pcm) { in b43legacy_upload_microcode()
1693 data = (__be32 *) (dev->fw.pcm->data + hdr_len); in b43legacy_upload_microcode()
1694 len = (dev->fw.pcm->size - hdr_len) / sizeof(__be32); in b43legacy_upload_microcode()
1695 b43legacy_shm_control_word(dev, B43legacy_SHM_HW, 0x01EA); in b43legacy_upload_microcode()
1696 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, 0x00004000); in b43legacy_upload_microcode()
1698 b43legacy_shm_control_word(dev, B43legacy_SHM_HW, 0x01EB); in b43legacy_upload_microcode()
1700 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_upload_microcode()
1706 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, in b43legacy_upload_microcode()
1710 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1713 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1718 tmp = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_upload_microcode()
1723 b43legacyerr(dev->wl, "Microcode not responding\n"); in b43legacy_upload_microcode()
1724 b43legacy_print_fw_helptext(dev->wl); in b43legacy_upload_microcode()
1735 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_upload_microcode()
1738 fwrev = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1740 fwpatch = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1742 fwdate = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1744 fwtime = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1748 b43legacyerr(dev->wl, "YOU ARE TRYING TO LOAD V4 FIRMWARE." in b43legacy_upload_microcode()
1752 b43legacy_print_fw_helptext(dev->wl); in b43legacy_upload_microcode()
1756 b43legacyinfo(dev->wl, "Loading firmware version 0x%X, patch level %u " in b43legacy_upload_microcode()
1762 dev->fw.rev = fwrev; in b43legacy_upload_microcode()
1763 dev->fw.patch = fwpatch; in b43legacy_upload_microcode()
1766 dev->fw.rev, dev->fw.patch); in b43legacy_upload_microcode()
1767 wiphy->hw_version = dev->dev->id.coreid; in b43legacy_upload_microcode()
1772 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1775 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1780 static int b43legacy_write_initvals(struct b43legacy_wldev *dev, in b43legacy_write_initvals() argument
1809 b43legacy_write32(dev, offset, value); in b43legacy_write_initvals()
1822 b43legacy_write16(dev, offset, value); in b43legacy_write_initvals()
1835 b43legacyerr(dev->wl, "Initial Values Firmware file-format error.\n"); in b43legacy_write_initvals()
1836 b43legacy_print_fw_helptext(dev->wl); in b43legacy_write_initvals()
1841 static int b43legacy_upload_initvals(struct b43legacy_wldev *dev) in b43legacy_upload_initvals() argument
1845 struct b43legacy_firmware *fw = &dev->fw; in b43legacy_upload_initvals()
1853 err = b43legacy_write_initvals(dev, ivals, count, in b43legacy_upload_initvals()
1863 err = b43legacy_write_initvals(dev, ivals, count, in b43legacy_upload_initvals()
1876 static int b43legacy_gpio_init(struct b43legacy_wldev *dev) in b43legacy_gpio_init() argument
1878 struct ssb_bus *bus = dev->dev->bus; in b43legacy_gpio_init()
1883 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_gpio_init()
1884 b43legacy_read32(dev, in b43legacy_gpio_init()
1888 b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, in b43legacy_gpio_init()
1889 b43legacy_read16(dev, in b43legacy_gpio_init()
1895 if (dev->dev->bus->chip_id == 0x4301) { in b43legacy_gpio_init()
1899 if (dev->dev->bus->sprom.boardflags_lo & B43legacy_BFL_PACTRL) { in b43legacy_gpio_init()
1900 b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, in b43legacy_gpio_init()
1901 b43legacy_read16(dev, in b43legacy_gpio_init()
1907 if (dev->dev->id.revision >= 2) in b43legacy_gpio_init()
1911 pcidev = bus->pcicore.dev; in b43legacy_gpio_init()
1913 gpiodev = bus->chipco.dev ? : pcidev; in b43legacy_gpio_init()
1924 static void b43legacy_gpio_cleanup(struct b43legacy_wldev *dev) in b43legacy_gpio_cleanup() argument
1926 struct ssb_bus *bus = dev->dev->bus; in b43legacy_gpio_cleanup()
1930 pcidev = bus->pcicore.dev; in b43legacy_gpio_cleanup()
1932 gpiodev = bus->chipco.dev ? : pcidev; in b43legacy_gpio_cleanup()
1939 void b43legacy_mac_enable(struct b43legacy_wldev *dev) in b43legacy_mac_enable() argument
1941 dev->mac_suspended--; in b43legacy_mac_enable()
1942 B43legacy_WARN_ON(dev->mac_suspended < 0); in b43legacy_mac_enable()
1944 if (dev->mac_suspended == 0) { in b43legacy_mac_enable()
1945 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_mac_enable()
1946 b43legacy_read32(dev, in b43legacy_mac_enable()
1949 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, in b43legacy_mac_enable()
1952 b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_mac_enable()
1953 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_mac_enable()
1954 b43legacy_power_saving_ctl_bits(dev, -1, -1); in b43legacy_mac_enable()
1957 spin_lock_irq(&dev->wl->irq_lock); in b43legacy_mac_enable()
1958 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, in b43legacy_mac_enable()
1959 dev->irq_mask); in b43legacy_mac_enable()
1960 spin_unlock_irq(&dev->wl->irq_lock); in b43legacy_mac_enable()
1965 void b43legacy_mac_suspend(struct b43legacy_wldev *dev) in b43legacy_mac_suspend() argument
1972 B43legacy_WARN_ON(dev->mac_suspended < 0); in b43legacy_mac_suspend()
1974 if (dev->mac_suspended == 0) { in b43legacy_mac_suspend()
1977 spin_lock_irq(&dev->wl->irq_lock); in b43legacy_mac_suspend()
1978 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_mac_suspend()
1979 spin_unlock_irq(&dev->wl->irq_lock); in b43legacy_mac_suspend()
1980 b43legacy_synchronize_irq(dev); in b43legacy_mac_suspend()
1982 b43legacy_power_saving_ctl_bits(dev, -1, 1); in b43legacy_mac_suspend()
1983 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_mac_suspend()
1984 b43legacy_read32(dev, in b43legacy_mac_suspend()
1987 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_mac_suspend()
1989 tmp = b43legacy_read32(dev, in b43legacy_mac_suspend()
1995 b43legacyerr(dev->wl, "MAC suspend failed\n"); in b43legacy_mac_suspend()
1998 dev->mac_suspended++; in b43legacy_mac_suspend()
2001 static void b43legacy_adjust_opmode(struct b43legacy_wldev *dev) in b43legacy_adjust_opmode() argument
2003 struct b43legacy_wl *wl = dev->wl; in b43legacy_adjust_opmode()
2007 ctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_adjust_opmode()
2034 if (dev->dev->id.revision <= 4) in b43legacy_adjust_opmode()
2037 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, ctl); in b43legacy_adjust_opmode()
2042 if (dev->dev->bus->chip_id == 0x4306 && in b43legacy_adjust_opmode()
2043 dev->dev->bus->chip_rev == 3) in b43legacy_adjust_opmode()
2048 b43legacy_write16(dev, 0x612, cfp_pretbtt); in b43legacy_adjust_opmode()
2051 static void b43legacy_rate_memory_write(struct b43legacy_wldev *dev, in b43legacy_rate_memory_write() argument
2064 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, offset + 0x20, in b43legacy_rate_memory_write()
2065 b43legacy_shm_read16(dev, in b43legacy_rate_memory_write()
2069 static void b43legacy_rate_memory_init(struct b43legacy_wldev *dev) in b43legacy_rate_memory_init() argument
2071 switch (dev->phy.type) { in b43legacy_rate_memory_init()
2073 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_6MB, 1); in b43legacy_rate_memory_init()
2074 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_12MB, 1); in b43legacy_rate_memory_init()
2075 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_18MB, 1); in b43legacy_rate_memory_init()
2076 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_24MB, 1); in b43legacy_rate_memory_init()
2077 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_36MB, 1); in b43legacy_rate_memory_init()
2078 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_48MB, 1); in b43legacy_rate_memory_init()
2079 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_54MB, 1); in b43legacy_rate_memory_init()
2082 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_1MB, 0); in b43legacy_rate_memory_init()
2083 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_2MB, 0); in b43legacy_rate_memory_init()
2084 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_5MB, 0); in b43legacy_rate_memory_init()
2085 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_11MB, 0); in b43legacy_rate_memory_init()
2093 static void b43legacy_mgmtframe_txantenna(struct b43legacy_wldev *dev, in b43legacy_mgmtframe_txantenna() argument
2117 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2120 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2123 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2126 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2129 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2132 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2137 static void b43legacy_chip_exit(struct b43legacy_wldev *dev) in b43legacy_chip_exit() argument
2139 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_exit()
2140 b43legacy_gpio_cleanup(dev); in b43legacy_chip_exit()
2147 static int b43legacy_chip_init(struct b43legacy_wldev *dev) in b43legacy_chip_init() argument
2149 struct b43legacy_phy *phy = &dev->phy; in b43legacy_chip_init()
2157 if (dev->phy.gmode) in b43legacy_chip_init()
2160 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_chip_init()
2162 err = b43legacy_upload_microcode(dev); in b43legacy_chip_init()
2166 err = b43legacy_gpio_init(dev); in b43legacy_chip_init()
2170 err = b43legacy_upload_initvals(dev); in b43legacy_chip_init()
2173 b43legacy_radio_turn_on(dev); in b43legacy_chip_init()
2175 b43legacy_write16(dev, 0x03E6, 0x0000); in b43legacy_chip_init()
2176 err = b43legacy_phy_init(dev); in b43legacy_chip_init()
2183 b43legacy_radio_set_interference_mitigation(dev, tmp); in b43legacy_chip_init()
2185 b43legacy_phy_set_antenna_diversity(dev); in b43legacy_chip_init()
2186 b43legacy_mgmtframe_txantenna(dev, B43legacy_ANTENNA_DEFAULT); in b43legacy_chip_init()
2189 value16 = b43legacy_read16(dev, 0x005E); in b43legacy_chip_init()
2191 b43legacy_write16(dev, 0x005E, value16); in b43legacy_chip_init()
2193 b43legacy_write32(dev, 0x0100, 0x01000000); in b43legacy_chip_init()
2194 if (dev->dev->id.revision < 5) in b43legacy_chip_init()
2195 b43legacy_write32(dev, 0x010C, 0x01000000); in b43legacy_chip_init()
2197 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2199 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2200 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2202 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2204 if (b43legacy_using_pio(dev)) { in b43legacy_chip_init()
2205 b43legacy_write32(dev, 0x0210, 0x00000100); in b43legacy_chip_init()
2206 b43legacy_write32(dev, 0x0230, 0x00000100); in b43legacy_chip_init()
2207 b43legacy_write32(dev, 0x0250, 0x00000100); in b43legacy_chip_init()
2208 b43legacy_write32(dev, 0x0270, 0x00000100); in b43legacy_chip_init()
2209 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0034, in b43legacy_chip_init()
2215 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0074, 0x0000); in b43legacy_chip_init()
2218 b43legacy_adjust_opmode(dev); in b43legacy_chip_init()
2220 if (dev->dev->id.revision < 3) { in b43legacy_chip_init()
2221 b43legacy_write16(dev, 0x060E, 0x0000); in b43legacy_chip_init()
2222 b43legacy_write16(dev, 0x0610, 0x8000); in b43legacy_chip_init()
2223 b43legacy_write16(dev, 0x0604, 0x0000); in b43legacy_chip_init()
2224 b43legacy_write16(dev, 0x0606, 0x0200); in b43legacy_chip_init()
2226 b43legacy_write32(dev, 0x0188, 0x80000000); in b43legacy_chip_init()
2227 b43legacy_write32(dev, 0x018C, 0x02000000); in b43legacy_chip_init()
2229 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, 0x00004000); in b43legacy_chip_init()
2230 b43legacy_write32(dev, B43legacy_MMIO_DMA0_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2231 b43legacy_write32(dev, B43legacy_MMIO_DMA1_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2232 b43legacy_write32(dev, B43legacy_MMIO_DMA2_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2233 b43legacy_write32(dev, B43legacy_MMIO_DMA3_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2234 b43legacy_write32(dev, B43legacy_MMIO_DMA4_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2235 b43legacy_write32(dev, B43legacy_MMIO_DMA5_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2237 value32 = ssb_read32(dev->dev, SSB_TMSLOW); in b43legacy_chip_init()
2239 ssb_write32(dev->dev, SSB_TMSLOW, value32); in b43legacy_chip_init()
2241 b43legacy_write16(dev, B43legacy_MMIO_POWERUP_DELAY, in b43legacy_chip_init()
2242 dev->dev->bus->chipco.fast_pwrup_delay); in b43legacy_chip_init()
2248 b43legacydbg(dev->wl, "Chip initialized\n"); in b43legacy_chip_init()
2253 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_init()
2255 b43legacy_gpio_cleanup(dev); in b43legacy_chip_init()
2259 static void b43legacy_periodic_every120sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every120sec() argument
2261 struct b43legacy_phy *phy = &dev->phy; in b43legacy_periodic_every120sec()
2266 b43legacy_mac_suspend(dev); in b43legacy_periodic_every120sec()
2267 b43legacy_phy_lo_g_measure(dev); in b43legacy_periodic_every120sec()
2268 b43legacy_mac_enable(dev); in b43legacy_periodic_every120sec()
2271 static void b43legacy_periodic_every60sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every60sec() argument
2273 b43legacy_phy_lo_mark_all_unused(dev); in b43legacy_periodic_every60sec()
2274 if (dev->dev->bus->sprom.boardflags_lo & B43legacy_BFL_RSSI) { in b43legacy_periodic_every60sec()
2275 b43legacy_mac_suspend(dev); in b43legacy_periodic_every60sec()
2276 b43legacy_calc_nrssi_slope(dev); in b43legacy_periodic_every60sec()
2277 b43legacy_mac_enable(dev); in b43legacy_periodic_every60sec()
2281 static void b43legacy_periodic_every30sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every30sec() argument
2284 b43legacy_calculate_link_quality(dev); in b43legacy_periodic_every30sec()
2287 static void b43legacy_periodic_every15sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every15sec() argument
2289 b43legacy_phy_xmitpower(dev); /* FIXME: unless scanning? */ in b43legacy_periodic_every15sec()
2291 atomic_set(&dev->phy.txerr_cnt, B43legacy_PHY_TX_BADNESS_LIMIT); in b43legacy_periodic_every15sec()
2295 static void do_periodic_work(struct b43legacy_wldev *dev) in do_periodic_work() argument
2299 state = dev->periodic_state; in do_periodic_work()
2301 b43legacy_periodic_every120sec(dev); in do_periodic_work()
2303 b43legacy_periodic_every60sec(dev); in do_periodic_work()
2305 b43legacy_periodic_every30sec(dev); in do_periodic_work()
2306 b43legacy_periodic_every15sec(dev); in do_periodic_work()
2316 struct b43legacy_wldev *dev = container_of(work, struct b43legacy_wldev, in b43legacy_periodic_work_handler() local
2318 struct b43legacy_wl *wl = dev->wl; in b43legacy_periodic_work_handler()
2323 if (unlikely(b43legacy_status(dev) != B43legacy_STAT_STARTED)) in b43legacy_periodic_work_handler()
2325 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_STOP)) in b43legacy_periodic_work_handler()
2328 do_periodic_work(dev); in b43legacy_periodic_work_handler()
2330 dev->periodic_state++; in b43legacy_periodic_work_handler()
2332 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_FAST)) in b43legacy_periodic_work_handler()
2336 ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); in b43legacy_periodic_work_handler()
2341 static void b43legacy_periodic_tasks_setup(struct b43legacy_wldev *dev) in b43legacy_periodic_tasks_setup() argument
2343 struct delayed_work *work = &dev->periodic_work; in b43legacy_periodic_tasks_setup()
2345 dev->periodic_state = 0; in b43legacy_periodic_tasks_setup()
2347 ieee80211_queue_delayed_work(dev->wl->hw, work, 0); in b43legacy_periodic_tasks_setup()
2351 static int b43legacy_validate_chipaccess(struct b43legacy_wldev *dev) in b43legacy_validate_chipaccess() argument
2356 shm_backup = b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0); in b43legacy_validate_chipaccess()
2357 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0xAA5555AA); in b43legacy_validate_chipaccess()
2358 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2361 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0x55AAAA55); in b43legacy_validate_chipaccess()
2362 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2365 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, shm_backup); in b43legacy_validate_chipaccess()
2367 value = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_validate_chipaccess()
2372 value = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_validate_chipaccess()
2378 b43legacyerr(dev->wl, "Failed to validate the chipaccess\n"); in b43legacy_validate_chipaccess()
2382 static void b43legacy_security_init(struct b43legacy_wldev *dev) in b43legacy_security_init() argument
2384 dev->max_nr_keys = (dev->dev->id.revision >= 5) ? 58 : 20; in b43legacy_security_init()
2385 B43legacy_WARN_ON(dev->max_nr_keys > ARRAY_SIZE(dev->key)); in b43legacy_security_init()
2386 dev->ktp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_security_init()
2391 dev->ktp *= 2; in b43legacy_security_init()
2392 if (dev->dev->id.revision >= 5) in b43legacy_security_init()
2394 b43legacy_write16(dev, B43legacy_MMIO_RCMTA_COUNT, in b43legacy_security_init()
2395 dev->max_nr_keys - 8); in b43legacy_security_init()
2450 struct b43legacy_wldev *dev; in b43legacy_tx_work() local
2456 dev = wl->current_dev; in b43legacy_tx_work()
2457 if (unlikely(!dev || b43legacy_status(dev) < B43legacy_STAT_STARTED)) { in b43legacy_tx_work()
2465 if (b43legacy_using_pio(dev)) in b43legacy_tx_work()
2466 err = b43legacy_pio_tx(dev, skb); in b43legacy_tx_work()
2468 err = b43legacy_dma_tx(dev, skb); in b43legacy_tx_work()
2543 struct b43legacy_wldev **dev, in find_wldev_for_phymode() argument
2553 *dev = d; in find_wldev_for_phymode()
2562 static void b43legacy_put_phy_into_reset(struct b43legacy_wldev *dev) in b43legacy_put_phy_into_reset() argument
2564 struct ssb_device *sdev = dev->dev; in b43legacy_put_phy_into_reset()
2652 static void b43legacy_set_retry_limits(struct b43legacy_wldev *dev, in b43legacy_set_retry_limits() argument
2661 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0006, short_retry); in b43legacy_set_retry_limits()
2662 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0007, long_retry); in b43legacy_set_retry_limits()
2669 struct b43legacy_wldev *dev; in b43legacy_op_dev_config() local
2680 dev = wl->current_dev; in b43legacy_op_dev_config()
2681 phy = &dev->phy; in b43legacy_op_dev_config()
2684 b43legacy_set_retry_limits(dev, in b43legacy_op_dev_config()
2710 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_dev_config()
2714 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_dev_config()
2716 b43legacy_synchronize_irq(dev); in b43legacy_op_dev_config()
2721 b43legacy_radio_selectchannel(dev, conf->chandef.chan->hw_value, in b43legacy_op_dev_config()
2724 dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR); in b43legacy_op_dev_config()
2730 b43legacy_phy_xmitpower(dev); in b43legacy_op_dev_config()
2735 b43legacy_mgmtframe_txantenna(dev, antenna_tx); in b43legacy_op_dev_config()
2739 b43legacy_radio_turn_on(dev); in b43legacy_op_dev_config()
2740 b43legacyinfo(dev->wl, "Radio turned on by software\n"); in b43legacy_op_dev_config()
2741 if (!dev->radio_hw_enable) in b43legacy_op_dev_config()
2742 b43legacyinfo(dev->wl, "The hardware RF-kill" in b43legacy_op_dev_config()
2747 b43legacy_radio_turn_off(dev, 0); in b43legacy_op_dev_config()
2748 b43legacyinfo(dev->wl, "Radio turned off by" in b43legacy_op_dev_config()
2754 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_dev_config()
2762 static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates) in b43legacy_update_basic_rates() argument
2765 dev->wl->hw->wiphy->bands[NL80211_BAND_2GHZ]; in b43legacy_update_basic_rates()
2799 rateptr = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2802 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2813 struct b43legacy_wldev *dev; in b43legacy_op_bss_info_changed() local
2819 dev = wl->current_dev; in b43legacy_op_bss_info_changed()
2825 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_bss_info_changed()
2829 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_bss_info_changed()
2832 b43legacy_synchronize_irq(dev); in b43legacy_op_bss_info_changed()
2840 if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) { in b43legacy_op_bss_info_changed()
2847 b43legacy_write_mac_bssid_templates(dev); in b43legacy_op_bss_info_changed()
2851 b43legacy_mac_suspend(dev); in b43legacy_op_bss_info_changed()
2856 b43legacy_set_beacon_int(dev, conf->beacon_int); in b43legacy_op_bss_info_changed()
2859 b43legacy_update_basic_rates(dev, conf->basic_rates); in b43legacy_op_bss_info_changed()
2863 b43legacy_short_slot_timing_enable(dev); in b43legacy_op_bss_info_changed()
2865 b43legacy_short_slot_timing_disable(dev); in b43legacy_op_bss_info_changed()
2868 b43legacy_mac_enable(dev); in b43legacy_op_bss_info_changed()
2871 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_bss_info_changed()
2883 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_configure_filter() local
2886 if (!dev) { in b43legacy_op_configure_filter()
2908 if (changed && b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) in b43legacy_op_configure_filter()
2909 b43legacy_adjust_opmode(dev); in b43legacy_op_configure_filter()
2914 static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev) in b43legacy_wireless_core_stop() argument
2916 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_stop()
2920 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) in b43legacy_wireless_core_stop()
2927 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_wireless_core_stop()
2928 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_MASK); /* flush */ in b43legacy_wireless_core_stop()
2930 b43legacy_synchronize_irq(dev); in b43legacy_wireless_core_stop()
2932 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_stop()
2937 cancel_delayed_work_sync(&dev->periodic_work); in b43legacy_wireless_core_stop()
2947 b43legacy_mac_suspend(dev); in b43legacy_wireless_core_stop()
2948 free_irq(dev->dev->irq, dev); in b43legacy_wireless_core_stop()
2953 static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev) in b43legacy_wireless_core_start() argument
2957 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_start()
2959 drain_txstatus_queue(dev); in b43legacy_wireless_core_start()
2960 err = request_irq(dev->dev->irq, b43legacy_interrupt_handler, in b43legacy_wireless_core_start()
2961 IRQF_SHARED, KBUILD_MODNAME, dev); in b43legacy_wireless_core_start()
2963 b43legacyerr(dev->wl, "Cannot request IRQ-%d\n", in b43legacy_wireless_core_start()
2964 dev->dev->irq); in b43legacy_wireless_core_start()
2968 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_start()
2969 b43legacy_set_status(dev, B43legacy_STAT_STARTED); in b43legacy_wireless_core_start()
2972 b43legacy_mac_enable(dev); in b43legacy_wireless_core_start()
2973 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_wireless_core_start()
2976 b43legacy_periodic_tasks_setup(dev); in b43legacy_wireless_core_start()
2978 b43legacydbg(dev->wl, "Wireless interface started\n"); in b43legacy_wireless_core_start()
2984 static int b43legacy_phy_versioning(struct b43legacy_wldev *dev) in b43legacy_phy_versioning() argument
2986 struct b43legacy_phy *phy = &dev->phy; in b43legacy_phy_versioning()
2997 tmp = b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); in b43legacy_phy_versioning()
3016 b43legacyerr(dev->wl, "FOUND UNSUPPORTED PHY " in b43legacy_phy_versioning()
3021 b43legacydbg(dev->wl, "Found PHY: Analog %u, Type %u, Revision %u\n", in b43legacy_phy_versioning()
3026 if (dev->dev->bus->chip_id == 0x4317) { in b43legacy_phy_versioning()
3027 if (dev->dev->bus->chip_rev == 0) in b43legacy_phy_versioning()
3029 else if (dev->dev->bus->chip_rev == 1) in b43legacy_phy_versioning()
3034 b43legacy_write16(dev, B43legacy_MMIO_RADIO_CONTROL, in b43legacy_phy_versioning()
3036 tmp = b43legacy_read16(dev, B43legacy_MMIO_RADIO_DATA_HIGH); in b43legacy_phy_versioning()
3038 b43legacy_write16(dev, B43legacy_MMIO_RADIO_CONTROL, in b43legacy_phy_versioning()
3040 tmp |= b43legacy_read16(dev, B43legacy_MMIO_RADIO_DATA_LOW); in b43legacy_phy_versioning()
3058 b43legacyerr(dev->wl, "FOUND UNSUPPORTED RADIO " in b43legacy_phy_versioning()
3063 b43legacydbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X," in b43legacy_phy_versioning()
3078 static void setup_struct_phy_for_init(struct b43legacy_wldev *dev, in setup_struct_phy_for_init() argument
3089 dev->radio_hw_enable = true; in setup_struct_phy_for_init()
3104 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in setup_struct_phy_for_init()
3105 phy->rfatt = b43legacy_default_radio_attenuation(dev); in setup_struct_phy_for_init()
3106 phy->txctl1 = b43legacy_default_txctl1(dev); in setup_struct_phy_for_init()
3123 static void setup_struct_wldev_for_init(struct b43legacy_wldev *dev) in setup_struct_wldev_for_init() argument
3126 dev->dfq_valid = false; in setup_struct_wldev_for_init()
3129 memset(&dev->stats, 0, sizeof(dev->stats)); in setup_struct_wldev_for_init()
3131 setup_struct_phy_for_init(dev, &dev->phy); in setup_struct_wldev_for_init()
3134 dev->irq_reason = 0; in setup_struct_wldev_for_init()
3135 memset(dev->dma_reason, 0, sizeof(dev->dma_reason)); in setup_struct_wldev_for_init()
3136 dev->irq_mask = B43legacy_IRQ_MASKTEMPLATE; in setup_struct_wldev_for_init()
3138 dev->mac_suspended = 1; in setup_struct_wldev_for_init()
3141 memset(&dev->noisecalc, 0, sizeof(dev->noisecalc)); in setup_struct_wldev_for_init()
3144 static void b43legacy_set_synth_pu_delay(struct b43legacy_wldev *dev, in b43legacy_set_synth_pu_delay() argument
3148 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle) in b43legacy_set_synth_pu_delay()
3150 if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8)) in b43legacy_set_synth_pu_delay()
3153 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_synth_pu_delay()
3158 static void b43legacy_set_pretbtt(struct b43legacy_wldev *dev) in b43legacy_set_pretbtt() argument
3163 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in b43legacy_set_pretbtt()
3167 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_pretbtt()
3169 b43legacy_write16(dev, B43legacy_MMIO_TSF_CFP_PRETBTT, pretbtt); in b43legacy_set_pretbtt()
3174 static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) in b43legacy_wireless_core_exit() argument
3176 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_exit()
3179 B43legacy_WARN_ON(b43legacy_status(dev) > B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_exit()
3180 if (b43legacy_status(dev) != B43legacy_STAT_INITIALIZED) in b43legacy_wireless_core_exit()
3182 b43legacy_set_status(dev, B43legacy_STAT_UNINIT); in b43legacy_wireless_core_exit()
3185 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_wireless_core_exit()
3188 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_wireless_core_exit()
3190 b43legacy_leds_exit(dev); in b43legacy_wireless_core_exit()
3191 b43legacy_rng_exit(dev->wl); in b43legacy_wireless_core_exit()
3192 b43legacy_pio_free(dev); in b43legacy_wireless_core_exit()
3193 b43legacy_dma_free(dev); in b43legacy_wireless_core_exit()
3194 b43legacy_chip_exit(dev); in b43legacy_wireless_core_exit()
3195 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_exit()
3196 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_exit()
3201 if (dev->wl->current_beacon) { in b43legacy_wireless_core_exit()
3202 dev_kfree_skb_any(dev->wl->current_beacon); in b43legacy_wireless_core_exit()
3203 dev->wl->current_beacon = NULL; in b43legacy_wireless_core_exit()
3206 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_exit()
3207 ssb_bus_may_powerdown(dev->dev->bus); in b43legacy_wireless_core_exit()
3210 static void prepare_phy_data_for_init(struct b43legacy_wldev *dev) in prepare_phy_data_for_init() argument
3212 struct b43legacy_phy *phy = &dev->phy; in prepare_phy_data_for_init()
3216 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in prepare_phy_data_for_init()
3217 phy->rfatt = b43legacy_default_radio_attenuation(dev); in prepare_phy_data_for_init()
3218 phy->txctl1 = b43legacy_default_txctl1(dev); in prepare_phy_data_for_init()
3250 static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev) in b43legacy_wireless_core_init() argument
3252 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_init()
3253 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_init()
3254 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_init()
3255 struct ssb_sprom *sprom = &dev->dev->bus->sprom; in b43legacy_wireless_core_init()
3260 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3265 if (!ssb_device_is_enabled(dev->dev)) { in b43legacy_wireless_core_init()
3267 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_init()
3278 setup_struct_wldev_for_init(dev); in b43legacy_wireless_core_init()
3280 err = b43legacy_phy_init_tssi2dbm_table(dev); in b43legacy_wireless_core_init()
3285 ssb_pcicore_dev_irqvecs_enable(&bus->pcicore, dev->dev); in b43legacy_wireless_core_init()
3287 prepare_phy_data_for_init(dev); in b43legacy_wireless_core_init()
3288 b43legacy_phy_calibrate(dev); in b43legacy_wireless_core_init()
3289 err = b43legacy_chip_init(dev); in b43legacy_wireless_core_init()
3292 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3294 dev->dev->id.revision); in b43legacy_wireless_core_init()
3295 hf = b43legacy_hf_read(dev); in b43legacy_wireless_core_init()
3307 b43legacy_hf_write(dev, hf); in b43legacy_wireless_core_init()
3309 b43legacy_set_retry_limits(dev, in b43legacy_wireless_core_init()
3313 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3315 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3322 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3325 b43legacy_rate_memory_init(dev); in b43legacy_wireless_core_init()
3329 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3332 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3335 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3339 if (b43legacy_using_pio(dev)) in b43legacy_wireless_core_init()
3340 err = b43legacy_pio_init(dev); in b43legacy_wireless_core_init()
3342 err = b43legacy_dma_init(dev); in b43legacy_wireless_core_init()
3344 b43legacy_qos_init(dev); in b43legacy_wireless_core_init()
3350 b43legacy_set_synth_pu_delay(dev, 1); in b43legacy_wireless_core_init()
3353 b43legacy_upload_card_macaddress(dev); in b43legacy_wireless_core_init()
3354 b43legacy_security_init(dev); in b43legacy_wireless_core_init()
3357 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_init()
3358 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_init()
3360 b43legacy_leds_init(dev); in b43legacy_wireless_core_init()
3365 b43legacy_chip_exit(dev); in b43legacy_wireless_core_init()
3373 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3381 struct b43legacy_wldev *dev; in b43legacy_op_add_interface() local
3398 dev = wl->current_dev; in b43legacy_op_add_interface()
3405 b43legacy_adjust_opmode(dev); in b43legacy_op_add_interface()
3406 b43legacy_set_pretbtt(dev); in b43legacy_op_add_interface()
3407 b43legacy_set_synth_pu_delay(dev, 0); in b43legacy_op_add_interface()
3408 b43legacy_upload_card_macaddress(dev); in b43legacy_op_add_interface()
3422 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_remove_interface() local
3436 b43legacy_adjust_opmode(dev); in b43legacy_op_remove_interface()
3438 b43legacy_upload_card_macaddress(dev); in b43legacy_op_remove_interface()
3447 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_start() local
3464 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) { in b43legacy_op_start()
3465 err = b43legacy_wireless_core_init(dev); in b43legacy_op_start()
3471 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_start()
3472 err = b43legacy_wireless_core_start(dev); in b43legacy_op_start()
3475 b43legacy_wireless_core_exit(dev); in b43legacy_op_start()
3491 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_stop() local
3496 if (b43legacy_status(dev) >= B43legacy_STAT_STARTED) in b43legacy_op_stop()
3497 b43legacy_wireless_core_stop(dev); in b43legacy_op_stop()
3498 b43legacy_wireless_core_exit(dev); in b43legacy_op_stop()
3520 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_get_survey() local
3528 survey->noise = dev->stats.link_noise; in b43legacy_op_get_survey()
3555 struct b43legacy_wldev *dev = in b43legacy_chip_reset() local
3557 struct b43legacy_wl *wl = dev->wl; in b43legacy_chip_reset()
3563 prev_status = b43legacy_status(dev); in b43legacy_chip_reset()
3566 b43legacy_wireless_core_stop(dev); in b43legacy_chip_reset()
3568 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3572 err = b43legacy_wireless_core_init(dev); in b43legacy_chip_reset()
3577 err = b43legacy_wireless_core_start(dev); in b43legacy_chip_reset()
3579 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3593 static int b43legacy_setup_modes(struct b43legacy_wldev *dev, in b43legacy_setup_modes() argument
3597 struct ieee80211_hw *hw = dev->wl->hw; in b43legacy_setup_modes()
3598 struct b43legacy_phy *phy = &dev->phy; in b43legacy_setup_modes()
3616 static void b43legacy_wireless_core_detach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_detach() argument
3620 b43legacy_release_firmware(dev); in b43legacy_wireless_core_detach()
3623 static int b43legacy_wireless_core_attach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_attach() argument
3625 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_attach()
3626 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_attach()
3646 if (dev->dev->id.revision >= 5) { in b43legacy_wireless_core_attach()
3649 tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH); in b43legacy_wireless_core_attach()
3653 } else if (dev->dev->id.revision == 4) in b43legacy_wireless_core_attach()
3658 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3659 dev->phy.radio_on = true; in b43legacy_wireless_core_attach()
3660 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3661 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3663 err = b43legacy_phy_versioning(dev); in b43legacy_wireless_core_attach()
3674 switch (dev->phy.type) { in b43legacy_wireless_core_attach()
3685 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3686 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3687 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3689 err = b43legacy_validate_chipaccess(dev); in b43legacy_wireless_core_attach()
3692 err = b43legacy_setup_modes(dev, have_bphy, have_gphy); in b43legacy_wireless_core_attach()
3698 wl->current_dev = dev; in b43legacy_wireless_core_attach()
3699 INIT_WORK(&dev->restart_work, b43legacy_chip_reset); in b43legacy_wireless_core_attach()
3701 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_attach()
3702 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_attach()
3703 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_attach()
3714 static void b43legacy_one_core_detach(struct ssb_device *dev) in b43legacy_one_core_detach() argument
3722 wldev = ssb_get_drvdata(dev); in b43legacy_one_core_detach()
3728 ssb_set_drvdata(dev, NULL); in b43legacy_one_core_detach()
3732 static int b43legacy_one_core_attach(struct ssb_device *dev, in b43legacy_one_core_attach() argument
3742 wldev->dev = dev; in b43legacy_one_core_attach()
3757 ssb_set_drvdata(dev, wldev); in b43legacy_one_core_attach()
3776 static void b43legacy_wireless_exit(struct ssb_device *dev, in b43legacy_wireless_exit() argument
3781 ssb_set_devtypedata(dev, NULL); in b43legacy_wireless_exit()
3785 static int b43legacy_wireless_init(struct ssb_device *dev) in b43legacy_wireless_init() argument
3787 struct ssb_sprom *sprom = &dev->bus->sprom; in b43legacy_wireless_init()
3793 b43legacy_sprom_fixup(dev->bus); in b43legacy_wireless_init()
3812 SET_IEEE80211_DEV(hw, dev->dev); in b43legacy_wireless_init()
3837 ssb_set_devtypedata(dev, wl); in b43legacy_wireless_init()
3839 dev->bus->chip_id, dev->id.revision); in b43legacy_wireless_init()
3845 static int b43legacy_probe(struct ssb_device *dev, in b43legacy_probe() argument
3852 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3856 err = b43legacy_wireless_init(dev); in b43legacy_probe()
3859 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3862 err = b43legacy_one_core_attach(dev, wl); in b43legacy_probe()
3875 b43legacy_wireless_exit(dev, wl); in b43legacy_probe()
3879 static void b43legacy_remove(struct ssb_device *dev) in b43legacy_remove() argument
3881 struct b43legacy_wl *wl = ssb_get_devtypedata(dev); in b43legacy_remove()
3882 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_remove()
3896 b43legacy_one_core_detach(dev); in b43legacy_remove()
3902 b43legacy_wireless_exit(dev, wl); in b43legacy_remove()
3906 void b43legacy_controller_restart(struct b43legacy_wldev *dev, in b43legacy_controller_restart() argument
3910 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) in b43legacy_controller_restart()
3912 b43legacyinfo(dev->wl, "Controller RESET (%s) ...\n", reason); in b43legacy_controller_restart()
3913 ieee80211_queue_work(dev->wl->hw, &dev->restart_work); in b43legacy_controller_restart()
3918 static int b43legacy_suspend(struct ssb_device *dev, pm_message_t state) in b43legacy_suspend() argument
3920 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_suspend()
3938 static int b43legacy_resume(struct ssb_device *dev) in b43legacy_resume() argument
3940 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_resume()