Lines Matching refs:dev

163 static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev);
164 static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev);
165 static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev);
166 static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev);
255 static void b43legacy_ram_write(struct b43legacy_wldev *dev, u16 offset, in b43legacy_ram_write() argument
262 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_ram_write()
266 b43legacy_write32(dev, B43legacy_MMIO_RAM_CONTROL, offset); in b43legacy_ram_write()
268 b43legacy_write32(dev, B43legacy_MMIO_RAM_DATA, val); in b43legacy_ram_write()
272 void b43legacy_shm_control_word(struct b43legacy_wldev *dev, in b43legacy_shm_control_word() argument
282 b43legacy_write32(dev, B43legacy_MMIO_SHM_CONTROL, control); in b43legacy_shm_control_word()
285 u32 b43legacy_shm_read32(struct b43legacy_wldev *dev, in b43legacy_shm_read32() argument
294 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_read32()
295 ret = b43legacy_read16(dev, in b43legacy_shm_read32()
298 b43legacy_shm_control_word(dev, routing, in b43legacy_shm_read32()
300 ret |= b43legacy_read16(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read32()
306 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_read32()
307 ret = b43legacy_read32(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read32()
312 u16 b43legacy_shm_read16(struct b43legacy_wldev *dev, in b43legacy_shm_read16() argument
321 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_read16()
322 ret = b43legacy_read16(dev, in b43legacy_shm_read16()
329 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_read16()
330 ret = b43legacy_read16(dev, B43legacy_MMIO_SHM_DATA); in b43legacy_shm_read16()
335 void b43legacy_shm_write32(struct b43legacy_wldev *dev, in b43legacy_shm_write32() argument
343 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_write32()
345 b43legacy_write16(dev, in b43legacy_shm_write32()
349 b43legacy_shm_control_word(dev, routing, in b43legacy_shm_write32()
352 b43legacy_write16(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_shm_write32()
358 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_write32()
360 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, value); in b43legacy_shm_write32()
363 void b43legacy_shm_write16(struct b43legacy_wldev *dev, u16 routing, u16 offset, in b43legacy_shm_write16() argument
370 b43legacy_shm_control_word(dev, routing, offset >> 2); in b43legacy_shm_write16()
372 b43legacy_write16(dev, in b43legacy_shm_write16()
379 b43legacy_shm_control_word(dev, routing, offset); in b43legacy_shm_write16()
381 b43legacy_write16(dev, B43legacy_MMIO_SHM_DATA, value); in b43legacy_shm_write16()
385 u32 b43legacy_hf_read(struct b43legacy_wldev *dev) in b43legacy_hf_read() argument
389 ret = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_read()
392 ret |= b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_read()
399 void b43legacy_hf_write(struct b43legacy_wldev *dev, u32 value) in b43legacy_hf_write() argument
401 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_write()
404 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_hf_write()
409 void b43legacy_tsf_read(struct b43legacy_wldev *dev, u64 *tsf) in b43legacy_tsf_read() argument
417 if (dev->dev->id.revision >= 3) { in b43legacy_tsf_read()
423 high = b43legacy_read32(dev, in b43legacy_tsf_read()
425 low = b43legacy_read32(dev, in b43legacy_tsf_read()
427 high2 = b43legacy_read32(dev, in b43legacy_tsf_read()
445 v3 = b43legacy_read16(dev, B43legacy_MMIO_TSF_3); in b43legacy_tsf_read()
446 v2 = b43legacy_read16(dev, B43legacy_MMIO_TSF_2); in b43legacy_tsf_read()
447 v1 = b43legacy_read16(dev, B43legacy_MMIO_TSF_1); in b43legacy_tsf_read()
448 v0 = b43legacy_read16(dev, B43legacy_MMIO_TSF_0); in b43legacy_tsf_read()
450 test3 = b43legacy_read16(dev, B43legacy_MMIO_TSF_3); in b43legacy_tsf_read()
451 test2 = b43legacy_read16(dev, B43legacy_MMIO_TSF_2); in b43legacy_tsf_read()
452 test1 = b43legacy_read16(dev, B43legacy_MMIO_TSF_1); in b43legacy_tsf_read()
467 static void b43legacy_time_lock(struct b43legacy_wldev *dev) in b43legacy_time_lock() argument
471 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_time_lock()
473 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); in b43legacy_time_lock()
477 static void b43legacy_time_unlock(struct b43legacy_wldev *dev) in b43legacy_time_unlock() argument
481 status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_time_unlock()
483 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); in b43legacy_time_unlock()
486 static void b43legacy_tsf_write_locked(struct b43legacy_wldev *dev, u64 tsf) in b43legacy_tsf_write_locked() argument
492 if (dev->dev->id.revision >= 3) { in b43legacy_tsf_write_locked()
496 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_LOW, 0); in b43legacy_tsf_write_locked()
498 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_HIGH, in b43legacy_tsf_write_locked()
501 b43legacy_write32(dev, B43legacy_MMIO_REV3PLUS_TSF_LOW, in b43legacy_tsf_write_locked()
509 b43legacy_write16(dev, B43legacy_MMIO_TSF_0, 0); in b43legacy_tsf_write_locked()
511 b43legacy_write16(dev, B43legacy_MMIO_TSF_3, v3); in b43legacy_tsf_write_locked()
513 b43legacy_write16(dev, B43legacy_MMIO_TSF_2, v2); in b43legacy_tsf_write_locked()
515 b43legacy_write16(dev, B43legacy_MMIO_TSF_1, v1); in b43legacy_tsf_write_locked()
517 b43legacy_write16(dev, B43legacy_MMIO_TSF_0, v0); in b43legacy_tsf_write_locked()
521 void b43legacy_tsf_write(struct b43legacy_wldev *dev, u64 tsf) in b43legacy_tsf_write() argument
523 b43legacy_time_lock(dev); in b43legacy_tsf_write()
524 b43legacy_tsf_write_locked(dev, tsf); in b43legacy_tsf_write()
525 b43legacy_time_unlock(dev); in b43legacy_tsf_write()
529 void b43legacy_macfilter_set(struct b43legacy_wldev *dev, in b43legacy_macfilter_set() argument
539 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_CONTROL, offset); in b43legacy_macfilter_set()
543 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
546 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
549 b43legacy_write16(dev, B43legacy_MMIO_MACFILTER_DATA, data); in b43legacy_macfilter_set()
552 static void b43legacy_write_mac_bssid_templates(struct b43legacy_wldev *dev) in b43legacy_write_mac_bssid_templates() argument
555 const u8 *mac = dev->wl->mac_addr; in b43legacy_write_mac_bssid_templates()
556 const u8 *bssid = dev->wl->bssid; in b43legacy_write_mac_bssid_templates()
566 b43legacy_macfilter_set(dev, B43legacy_MACFILTER_BSSID, bssid); in b43legacy_write_mac_bssid_templates()
577 b43legacy_ram_write(dev, 0x20 + i, tmp); in b43legacy_write_mac_bssid_templates()
578 b43legacy_ram_write(dev, 0x78 + i, tmp); in b43legacy_write_mac_bssid_templates()
579 b43legacy_ram_write(dev, 0x478 + i, tmp); in b43legacy_write_mac_bssid_templates()
583 static void b43legacy_upload_card_macaddress(struct b43legacy_wldev *dev) in b43legacy_upload_card_macaddress() argument
585 b43legacy_write_mac_bssid_templates(dev); in b43legacy_upload_card_macaddress()
586 b43legacy_macfilter_set(dev, B43legacy_MACFILTER_SELF, in b43legacy_upload_card_macaddress()
587 dev->wl->mac_addr); in b43legacy_upload_card_macaddress()
590 static void b43legacy_set_slot_time(struct b43legacy_wldev *dev, in b43legacy_set_slot_time() argument
594 if (dev->phy.type != B43legacy_PHYTYPE_G) in b43legacy_set_slot_time()
596 b43legacy_write16(dev, 0x684, 510 + slot_time); in b43legacy_set_slot_time()
597 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0010, in b43legacy_set_slot_time()
601 static void b43legacy_short_slot_timing_enable(struct b43legacy_wldev *dev) in b43legacy_short_slot_timing_enable() argument
603 b43legacy_set_slot_time(dev, 9); in b43legacy_short_slot_timing_enable()
606 static void b43legacy_short_slot_timing_disable(struct b43legacy_wldev *dev) in b43legacy_short_slot_timing_disable() argument
608 b43legacy_set_slot_time(dev, 20); in b43legacy_short_slot_timing_disable()
615 static void b43legacy_synchronize_irq(struct b43legacy_wldev *dev) in b43legacy_synchronize_irq() argument
617 synchronize_irq(dev->dev->irq); in b43legacy_synchronize_irq()
618 tasklet_kill(&dev->isr_tasklet); in b43legacy_synchronize_irq()
624 void b43legacy_dummy_transmission(struct b43legacy_wldev *dev) in b43legacy_dummy_transmission() argument
626 struct b43legacy_phy *phy = &dev->phy; in b43legacy_dummy_transmission()
650 b43legacy_ram_write(dev, i * 4, buffer[i]); in b43legacy_dummy_transmission()
653 b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_dummy_transmission()
655 b43legacy_write16(dev, 0x0568, 0x0000); in b43legacy_dummy_transmission()
656 b43legacy_write16(dev, 0x07C0, 0x0000); in b43legacy_dummy_transmission()
657 b43legacy_write16(dev, 0x050C, 0x0000); in b43legacy_dummy_transmission()
658 b43legacy_write16(dev, 0x0508, 0x0000); in b43legacy_dummy_transmission()
659 b43legacy_write16(dev, 0x050A, 0x0000); in b43legacy_dummy_transmission()
660 b43legacy_write16(dev, 0x054C, 0x0000); in b43legacy_dummy_transmission()
661 b43legacy_write16(dev, 0x056A, 0x0014); in b43legacy_dummy_transmission()
662 b43legacy_write16(dev, 0x0568, 0x0826); in b43legacy_dummy_transmission()
663 b43legacy_write16(dev, 0x0500, 0x0000); in b43legacy_dummy_transmission()
664 b43legacy_write16(dev, 0x0502, 0x0030); in b43legacy_dummy_transmission()
667 b43legacy_radio_write16(dev, 0x0051, 0x0017); in b43legacy_dummy_transmission()
669 value = b43legacy_read16(dev, 0x050E); in b43legacy_dummy_transmission()
675 value = b43legacy_read16(dev, 0x050E); in b43legacy_dummy_transmission()
681 value = b43legacy_read16(dev, 0x0690); in b43legacy_dummy_transmission()
687 b43legacy_radio_write16(dev, 0x0051, 0x0037); in b43legacy_dummy_transmission()
691 static void b43legacy_switch_analog(struct b43legacy_wldev *dev, int on) in b43legacy_switch_analog() argument
693 b43legacy_write16(dev, B43legacy_MMIO_PHY0, on ? 0 : 0xF4); in b43legacy_switch_analog()
696 void b43legacy_wireless_core_reset(struct b43legacy_wldev *dev, u32 flags) in b43legacy_wireless_core_reset() argument
703 ssb_device_enable(dev->dev, flags); in b43legacy_wireless_core_reset()
707 tmslow = ssb_read32(dev->dev, SSB_TMSLOW); in b43legacy_wireless_core_reset()
710 ssb_write32(dev->dev, SSB_TMSLOW, tmslow); in b43legacy_wireless_core_reset()
711 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */ in b43legacy_wireless_core_reset()
714 ssb_write32(dev->dev, SSB_TMSLOW, tmslow); in b43legacy_wireless_core_reset()
715 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */ in b43legacy_wireless_core_reset()
719 b43legacy_switch_analog(dev, 1); in b43legacy_wireless_core_reset()
721 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_wireless_core_reset()
725 dev->phy.gmode = true; in b43legacy_wireless_core_reset()
727 dev->phy.gmode = false; in b43legacy_wireless_core_reset()
729 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_wireless_core_reset()
732 static void handle_irq_transmit_status(struct b43legacy_wldev *dev) in handle_irq_transmit_status() argument
740 v0 = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_0); in handle_irq_transmit_status()
743 v1 = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_1); in handle_irq_transmit_status()
757 b43legacy_handle_txstatus(dev, &stat); in handle_irq_transmit_status()
761 static void drain_txstatus_queue(struct b43legacy_wldev *dev) in drain_txstatus_queue() argument
765 if (dev->dev->id.revision < 5) in drain_txstatus_queue()
771 dummy = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_0); in drain_txstatus_queue()
774 dummy = b43legacy_read32(dev, B43legacy_MMIO_XMITSTAT_1); in drain_txstatus_queue()
778 static u32 b43legacy_jssi_read(struct b43legacy_wldev *dev) in b43legacy_jssi_read() argument
782 val = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, 0x40A); in b43legacy_jssi_read()
784 val |= b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, 0x408); in b43legacy_jssi_read()
789 static void b43legacy_jssi_write(struct b43legacy_wldev *dev, u32 jssi) in b43legacy_jssi_write() argument
791 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x408, in b43legacy_jssi_write()
793 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x40A, in b43legacy_jssi_write()
797 static void b43legacy_generate_noise_sample(struct b43legacy_wldev *dev) in b43legacy_generate_noise_sample() argument
799 b43legacy_jssi_write(dev, 0x7F7F7F7F); in b43legacy_generate_noise_sample()
800 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, in b43legacy_generate_noise_sample()
801 b43legacy_read32(dev, B43legacy_MMIO_MACCMD) in b43legacy_generate_noise_sample()
803 B43legacy_WARN_ON(dev->noisecalc.channel_at_start != in b43legacy_generate_noise_sample()
804 dev->phy.channel); in b43legacy_generate_noise_sample()
807 static void b43legacy_calculate_link_quality(struct b43legacy_wldev *dev) in b43legacy_calculate_link_quality() argument
811 if (dev->noisecalc.calculation_running) in b43legacy_calculate_link_quality()
813 dev->noisecalc.channel_at_start = dev->phy.channel; in b43legacy_calculate_link_quality()
814 dev->noisecalc.calculation_running = true; in b43legacy_calculate_link_quality()
815 dev->noisecalc.nr_samples = 0; in b43legacy_calculate_link_quality()
817 b43legacy_generate_noise_sample(dev); in b43legacy_calculate_link_quality()
820 static void handle_irq_noise(struct b43legacy_wldev *dev) in handle_irq_noise() argument
822 struct b43legacy_phy *phy = &dev->phy; in handle_irq_noise()
831 B43legacy_WARN_ON(!dev->noisecalc.calculation_running); in handle_irq_noise()
832 if (dev->noisecalc.channel_at_start != phy->channel) in handle_irq_noise()
834 *((__le32 *)noise) = cpu_to_le32(b43legacy_jssi_read(dev)); in handle_irq_noise()
840 B43legacy_WARN_ON(dev->noisecalc.nr_samples >= 8); in handle_irq_noise()
841 i = dev->noisecalc.nr_samples; in handle_irq_noise()
846 dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]]; in handle_irq_noise()
847 dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]]; in handle_irq_noise()
848 dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]]; in handle_irq_noise()
849 dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]]; in handle_irq_noise()
850 dev->noisecalc.nr_samples++; in handle_irq_noise()
851 if (dev->noisecalc.nr_samples == 8) { in handle_irq_noise()
856 average += dev->noisecalc.samples[i][j]; in handle_irq_noise()
862 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in handle_irq_noise()
874 dev->stats.link_noise = average; in handle_irq_noise()
876 dev->noisecalc.calculation_running = false; in handle_irq_noise()
880 b43legacy_generate_noise_sample(dev); in handle_irq_noise()
883 static void handle_irq_tbtt_indication(struct b43legacy_wldev *dev) in handle_irq_tbtt_indication() argument
885 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_AP)) { in handle_irq_tbtt_indication()
889 b43legacy_power_saving_ctl_bits(dev, -1, -1); in handle_irq_tbtt_indication()
891 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in handle_irq_tbtt_indication()
892 dev->dfq_valid = true; in handle_irq_tbtt_indication()
895 static void handle_irq_atim_end(struct b43legacy_wldev *dev) in handle_irq_atim_end() argument
897 if (dev->dfq_valid) { in handle_irq_atim_end()
898 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, in handle_irq_atim_end()
899 b43legacy_read32(dev, B43legacy_MMIO_MACCMD) in handle_irq_atim_end()
901 dev->dfq_valid = false; in handle_irq_atim_end()
905 static void handle_irq_pmq(struct b43legacy_wldev *dev) in handle_irq_pmq() argument
912 tmp = b43legacy_read32(dev, B43legacy_MMIO_PS_STATUS); in handle_irq_pmq()
917 b43legacy_write16(dev, B43legacy_MMIO_PS_STATUS, 0x0002); in handle_irq_pmq()
920 static void b43legacy_write_template_common(struct b43legacy_wldev *dev, in b43legacy_write_template_common() argument
931 b43legacy_ram_write(dev, ram_offset, le32_to_cpu(plcp.data)); in b43legacy_write_template_common()
938 b43legacy_ram_write(dev, ram_offset, tmp); in b43legacy_write_template_common()
948 b43legacy_ram_write(dev, ram_offset + i - 2, tmp); in b43legacy_write_template_common()
950 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_size_offset, in b43legacy_write_template_common()
966 static void b43legacy_write_beacon_template(struct b43legacy_wldev *dev, in b43legacy_write_beacon_template() argument
978 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(dev->wl->current_beacon); in b43legacy_write_beacon_template()
980 bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data); in b43legacy_write_beacon_template()
981 len = min_t(size_t, dev->wl->current_beacon->len, in b43legacy_write_beacon_template()
983 rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value; in b43legacy_write_beacon_template()
985 b43legacy_write_template_common(dev, (const u8 *)bcn, len, ram_offset, in b43legacy_write_beacon_template()
991 ctl = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
999 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1031 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1033 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_write_beacon_template()
1040 b43legacywarn(dev->wl, "Did not find a valid TIM IE in the " in b43legacy_write_beacon_template()
1044 b43legacydbg(dev->wl, "Updated beacon template\n"); in b43legacy_write_beacon_template()
1047 static void b43legacy_write_probe_resp_plcp(struct b43legacy_wldev *dev, in b43legacy_write_probe_resp_plcp() argument
1057 dur = ieee80211_generic_frame_duration(dev->wl->hw, in b43legacy_write_probe_resp_plcp()
1058 dev->wl->vif, in b43legacy_write_probe_resp_plcp()
1064 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset, in b43legacy_write_probe_resp_plcp()
1066 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset + 2, in b43legacy_write_probe_resp_plcp()
1068 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, shm_offset + 6, in b43legacy_write_probe_resp_plcp()
1078 static const u8 *b43legacy_generate_probe_resp(struct b43legacy_wldev *dev, in b43legacy_generate_probe_resp() argument
1089 src_size = dev->wl->current_beacon->len; in b43legacy_generate_probe_resp()
1090 src_data = (const u8 *)dev->wl->current_beacon->data; in b43legacy_generate_probe_resp()
1123 dur = ieee80211_generic_frame_duration(dev->wl->hw, in b43legacy_generate_probe_resp()
1124 dev->wl->vif, in b43legacy_generate_probe_resp()
1133 static void b43legacy_write_probe_resp_template(struct b43legacy_wldev *dev, in b43legacy_write_probe_resp_template() argument
1141 size = dev->wl->current_beacon->len; in b43legacy_write_probe_resp_template()
1142 probe_resp_data = b43legacy_generate_probe_resp(dev, &size, rate); in b43legacy_write_probe_resp_template()
1149 b43legacy_write_probe_resp_plcp(dev, 0x31A, size, in b43legacy_write_probe_resp_template()
1151 b43legacy_write_probe_resp_plcp(dev, 0x32C, size, in b43legacy_write_probe_resp_template()
1153 b43legacy_write_probe_resp_plcp(dev, 0x33E, size, in b43legacy_write_probe_resp_template()
1155 b43legacy_write_probe_resp_plcp(dev, 0x350, size, in b43legacy_write_probe_resp_template()
1160 b43legacy_write_template_common(dev, probe_resp_data, in b43legacy_write_probe_resp_template()
1166 static void b43legacy_upload_beacon0(struct b43legacy_wldev *dev) in b43legacy_upload_beacon0() argument
1168 struct b43legacy_wl *wl = dev->wl; in b43legacy_upload_beacon0()
1172 b43legacy_write_beacon_template(dev, 0x68, 0x18); in b43legacy_upload_beacon0()
1175 b43legacy_write_probe_resp_template(dev, 0x268, 0x4A, in b43legacy_upload_beacon0()
1180 static void b43legacy_upload_beacon1(struct b43legacy_wldev *dev) in b43legacy_upload_beacon1() argument
1182 struct b43legacy_wl *wl = dev->wl; in b43legacy_upload_beacon1()
1186 b43legacy_write_beacon_template(dev, 0x468, 0x1A); in b43legacy_upload_beacon1()
1190 static void handle_irq_beacon(struct b43legacy_wldev *dev) in handle_irq_beacon() argument
1192 struct b43legacy_wl *wl = dev->wl; in handle_irq_beacon()
1201 dev->irq_mask &= ~B43legacy_IRQ_BEACON; in handle_irq_beacon()
1203 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1209 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, B43legacy_IRQ_BEACON); in handle_irq_beacon()
1210 dev->irq_mask |= B43legacy_IRQ_BEACON; in handle_irq_beacon()
1218 b43legacy_upload_beacon0(dev); in handle_irq_beacon()
1219 b43legacy_upload_beacon1(dev); in handle_irq_beacon()
1220 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1222 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1225 b43legacy_upload_beacon0(dev); in handle_irq_beacon()
1226 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1228 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1230 b43legacy_upload_beacon1(dev); in handle_irq_beacon()
1231 cmd = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); in handle_irq_beacon()
1233 b43legacy_write32(dev, B43legacy_MMIO_MACCMD, cmd); in handle_irq_beacon()
1242 struct b43legacy_wldev *dev; in b43legacy_beacon_update_trigger_work() local
1245 dev = wl->current_dev; in b43legacy_beacon_update_trigger_work()
1246 if (likely(dev && (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED))) { in b43legacy_beacon_update_trigger_work()
1249 handle_irq_beacon(dev); in b43legacy_beacon_update_trigger_work()
1251 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, in b43legacy_beacon_update_trigger_work()
1252 dev->irq_mask); in b43legacy_beacon_update_trigger_work()
1285 static void b43legacy_set_beacon_int(struct b43legacy_wldev *dev, in b43legacy_set_beacon_int() argument
1288 b43legacy_time_lock(dev); in b43legacy_set_beacon_int()
1289 if (dev->dev->id.revision >= 3) { in b43legacy_set_beacon_int()
1290 b43legacy_write32(dev, B43legacy_MMIO_TSF_CFP_REP, in b43legacy_set_beacon_int()
1292 b43legacy_write32(dev, B43legacy_MMIO_TSF_CFP_START, in b43legacy_set_beacon_int()
1295 b43legacy_write16(dev, 0x606, (beacon_int >> 6)); in b43legacy_set_beacon_int()
1296 b43legacy_write16(dev, 0x610, beacon_int); in b43legacy_set_beacon_int()
1298 b43legacy_time_unlock(dev); in b43legacy_set_beacon_int()
1299 b43legacydbg(dev->wl, "Set beacon interval to %u\n", beacon_int); in b43legacy_set_beacon_int()
1302 static void handle_irq_ucode_debug(struct b43legacy_wldev *dev) in handle_irq_ucode_debug() argument
1307 static void b43legacy_interrupt_tasklet(struct b43legacy_wldev *dev) in b43legacy_interrupt_tasklet() argument
1310 u32 dma_reason[ARRAY_SIZE(dev->dma_reason)]; in b43legacy_interrupt_tasklet()
1315 spin_lock_irqsave(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1317 B43legacy_WARN_ON(b43legacy_status(dev) < in b43legacy_interrupt_tasklet()
1320 reason = dev->irq_reason; in b43legacy_interrupt_tasklet()
1322 dma_reason[i] = dev->dma_reason[i]; in b43legacy_interrupt_tasklet()
1327 b43legacyerr(dev->wl, "MAC transmission error\n"); in b43legacy_interrupt_tasklet()
1330 b43legacyerr(dev->wl, "PHY transmission error\n"); in b43legacy_interrupt_tasklet()
1332 if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) { in b43legacy_interrupt_tasklet()
1333 b43legacyerr(dev->wl, "Too many PHY TX errors, " in b43legacy_interrupt_tasklet()
1335 b43legacy_controller_restart(dev, "PHY TX errors"); in b43legacy_interrupt_tasklet()
1342 b43legacyerr(dev->wl, "Fatal DMA error: " in b43legacy_interrupt_tasklet()
1348 b43legacy_controller_restart(dev, "DMA error"); in b43legacy_interrupt_tasklet()
1350 spin_unlock_irqrestore(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1354 b43legacyerr(dev->wl, "DMA error: " in b43legacy_interrupt_tasklet()
1363 handle_irq_ucode_debug(dev); in b43legacy_interrupt_tasklet()
1365 handle_irq_tbtt_indication(dev); in b43legacy_interrupt_tasklet()
1367 handle_irq_atim_end(dev); in b43legacy_interrupt_tasklet()
1369 handle_irq_beacon(dev); in b43legacy_interrupt_tasklet()
1371 handle_irq_pmq(dev); in b43legacy_interrupt_tasklet()
1375 handle_irq_noise(dev); in b43legacy_interrupt_tasklet()
1379 if (b43legacy_using_pio(dev)) in b43legacy_interrupt_tasklet()
1380 b43legacy_pio_rx(dev->pio.queue0); in b43legacy_interrupt_tasklet()
1382 b43legacy_dma_rx(dev->dma.rx_ring0); in b43legacy_interrupt_tasklet()
1387 if (b43legacy_using_pio(dev)) in b43legacy_interrupt_tasklet()
1388 b43legacy_pio_rx(dev->pio.queue3); in b43legacy_interrupt_tasklet()
1390 b43legacy_dma_rx(dev->dma.rx_ring3); in b43legacy_interrupt_tasklet()
1396 handle_irq_transmit_status(dev); in b43legacy_interrupt_tasklet()
1398 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_interrupt_tasklet()
1400 spin_unlock_irqrestore(&dev->wl->irq_lock, flags); in b43legacy_interrupt_tasklet()
1403 static void pio_irq_workaround(struct b43legacy_wldev *dev, in pio_irq_workaround() argument
1408 rxctl = b43legacy_read16(dev, base + B43legacy_PIO_RXCTL); in pio_irq_workaround()
1410 dev->dma_reason[queueidx] |= B43legacy_DMAIRQ_RX_DONE; in pio_irq_workaround()
1412 dev->dma_reason[queueidx] &= ~B43legacy_DMAIRQ_RX_DONE; in pio_irq_workaround()
1415 static void b43legacy_interrupt_ack(struct b43legacy_wldev *dev, u32 reason) in b43legacy_interrupt_ack() argument
1417 if (b43legacy_using_pio(dev) && in b43legacy_interrupt_ack()
1418 (dev->dev->id.revision < 3) && in b43legacy_interrupt_ack()
1421 pio_irq_workaround(dev, B43legacy_MMIO_PIO1_BASE, 0); in b43legacy_interrupt_ack()
1422 pio_irq_workaround(dev, B43legacy_MMIO_PIO2_BASE, 1); in b43legacy_interrupt_ack()
1423 pio_irq_workaround(dev, B43legacy_MMIO_PIO3_BASE, 2); in b43legacy_interrupt_ack()
1424 pio_irq_workaround(dev, B43legacy_MMIO_PIO4_BASE, 3); in b43legacy_interrupt_ack()
1427 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, reason); in b43legacy_interrupt_ack()
1429 b43legacy_write32(dev, B43legacy_MMIO_DMA0_REASON, in b43legacy_interrupt_ack()
1430 dev->dma_reason[0]); in b43legacy_interrupt_ack()
1431 b43legacy_write32(dev, B43legacy_MMIO_DMA1_REASON, in b43legacy_interrupt_ack()
1432 dev->dma_reason[1]); in b43legacy_interrupt_ack()
1433 b43legacy_write32(dev, B43legacy_MMIO_DMA2_REASON, in b43legacy_interrupt_ack()
1434 dev->dma_reason[2]); in b43legacy_interrupt_ack()
1435 b43legacy_write32(dev, B43legacy_MMIO_DMA3_REASON, in b43legacy_interrupt_ack()
1436 dev->dma_reason[3]); in b43legacy_interrupt_ack()
1437 b43legacy_write32(dev, B43legacy_MMIO_DMA4_REASON, in b43legacy_interrupt_ack()
1438 dev->dma_reason[4]); in b43legacy_interrupt_ack()
1439 b43legacy_write32(dev, B43legacy_MMIO_DMA5_REASON, in b43legacy_interrupt_ack()
1440 dev->dma_reason[5]); in b43legacy_interrupt_ack()
1447 struct b43legacy_wldev *dev = dev_id; in b43legacy_interrupt_handler() local
1450 B43legacy_WARN_ON(!dev); in b43legacy_interrupt_handler()
1452 spin_lock(&dev->wl->irq_lock); in b43legacy_interrupt_handler()
1454 if (unlikely(b43legacy_status(dev) < B43legacy_STAT_STARTED)) in b43legacy_interrupt_handler()
1457 reason = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_interrupt_handler()
1461 reason &= dev->irq_mask; in b43legacy_interrupt_handler()
1465 dev->dma_reason[0] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1468 dev->dma_reason[1] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1471 dev->dma_reason[2] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1474 dev->dma_reason[3] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1477 dev->dma_reason[4] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1480 dev->dma_reason[5] = b43legacy_read32(dev, in b43legacy_interrupt_handler()
1484 b43legacy_interrupt_ack(dev, reason); in b43legacy_interrupt_handler()
1486 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_interrupt_handler()
1488 dev->irq_reason = reason; in b43legacy_interrupt_handler()
1489 tasklet_schedule(&dev->isr_tasklet); in b43legacy_interrupt_handler()
1492 spin_unlock(&dev->wl->irq_lock); in b43legacy_interrupt_handler()
1497 static void b43legacy_release_firmware(struct b43legacy_wldev *dev) in b43legacy_release_firmware() argument
1499 release_firmware(dev->fw.ucode); in b43legacy_release_firmware()
1500 dev->fw.ucode = NULL; in b43legacy_release_firmware()
1501 release_firmware(dev->fw.pcm); in b43legacy_release_firmware()
1502 dev->fw.pcm = NULL; in b43legacy_release_firmware()
1503 release_firmware(dev->fw.initvals); in b43legacy_release_firmware()
1504 dev->fw.initvals = NULL; in b43legacy_release_firmware()
1505 release_firmware(dev->fw.initvals_band); in b43legacy_release_firmware()
1506 dev->fw.initvals_band = NULL; in b43legacy_release_firmware()
1518 struct b43legacy_wldev *dev = context; in b43legacy_fw_cb() local
1520 dev->fwp = firmware; in b43legacy_fw_cb()
1521 complete(&dev->fw_load_complete); in b43legacy_fw_cb()
1524 static int do_request_fw(struct b43legacy_wldev *dev, in do_request_fw() argument
1539 b43legacyinfo(dev->wl, "Loading firmware %s\n", path); in do_request_fw()
1541 init_completion(&dev->fw_load_complete); in do_request_fw()
1543 dev->dev->dev, GFP_KERNEL, in do_request_fw()
1544 dev, b43legacy_fw_cb); in do_request_fw()
1546 b43legacyerr(dev->wl, "Unable to load firmware\n"); in do_request_fw()
1550 wait_for_completion(&dev->fw_load_complete); in do_request_fw()
1551 if (!dev->fwp) in do_request_fw()
1553 *fw = dev->fwp; in do_request_fw()
1555 err = request_firmware(fw, path, dev->dev->dev); in do_request_fw()
1558 b43legacyerr(dev->wl, "Firmware file \"%s\" not found " in do_request_fw()
1583 b43legacyerr(dev->wl, "Firmware file \"%s\" format error.\n", path); in do_request_fw()
1587 static int b43legacy_one_core_attach(struct ssb_device *dev,
1589 static void b43legacy_one_core_detach(struct ssb_device *dev);
1595 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_request_firmware() local
1596 struct b43legacy_firmware *fw = &dev->fw; in b43legacy_request_firmware()
1597 const u8 rev = dev->dev->id.revision; in b43legacy_request_firmware()
1608 err = do_request_fw(dev, filename, &fw->ucode, true); in b43legacy_request_firmware()
1617 err = do_request_fw(dev, filename, &fw->pcm, false); in b43legacy_request_firmware()
1622 switch (dev->phy.type) { in b43legacy_request_firmware()
1635 err = do_request_fw(dev, filename, &fw->initvals, false); in b43legacy_request_firmware()
1640 switch (dev->phy.type) { in b43legacy_request_firmware()
1655 err = do_request_fw(dev, filename, &fw->initvals_band, false); in b43legacy_request_firmware()
1665 b43legacy_one_core_detach(dev->dev); in b43legacy_request_firmware()
1669 b43legacy_print_fw_helptext(dev->wl); in b43legacy_request_firmware()
1674 b43legacyerr(dev->wl, "No Initial Values firmware file for PHY %u, " in b43legacy_request_firmware()
1675 "core rev %u\n", dev->phy.type, rev); in b43legacy_request_firmware()
1679 b43legacy_release_firmware(dev); in b43legacy_request_firmware()
1683 static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) in b43legacy_upload_microcode() argument
1685 struct wiphy *wiphy = dev->wl->hw->wiphy; in b43legacy_upload_microcode()
1698 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1701 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1704 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, i, 0); in b43legacy_upload_microcode()
1706 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, i, 0); in b43legacy_upload_microcode()
1709 data = (__be32 *) (dev->fw.ucode->data + hdr_len); in b43legacy_upload_microcode()
1710 len = (dev->fw.ucode->size - hdr_len) / sizeof(__be32); in b43legacy_upload_microcode()
1711 b43legacy_shm_control_word(dev, in b43legacy_upload_microcode()
1716 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_upload_microcode()
1721 if (dev->fw.pcm) { in b43legacy_upload_microcode()
1723 data = (__be32 *) (dev->fw.pcm->data + hdr_len); in b43legacy_upload_microcode()
1724 len = (dev->fw.pcm->size - hdr_len) / sizeof(__be32); in b43legacy_upload_microcode()
1725 b43legacy_shm_control_word(dev, B43legacy_SHM_HW, 0x01EA); in b43legacy_upload_microcode()
1726 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, 0x00004000); in b43legacy_upload_microcode()
1728 b43legacy_shm_control_word(dev, B43legacy_SHM_HW, 0x01EB); in b43legacy_upload_microcode()
1730 b43legacy_write32(dev, B43legacy_MMIO_SHM_DATA, in b43legacy_upload_microcode()
1736 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, in b43legacy_upload_microcode()
1740 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1743 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1748 tmp = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_upload_microcode()
1753 b43legacyerr(dev->wl, "Microcode not responding\n"); in b43legacy_upload_microcode()
1754 b43legacy_print_fw_helptext(dev->wl); in b43legacy_upload_microcode()
1765 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_upload_microcode()
1768 fwrev = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1770 fwpatch = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1772 fwdate = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1774 fwtime = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_upload_microcode()
1778 b43legacyerr(dev->wl, "YOU ARE TRYING TO LOAD V4 FIRMWARE." in b43legacy_upload_microcode()
1782 b43legacy_print_fw_helptext(dev->wl); in b43legacy_upload_microcode()
1786 b43legacyinfo(dev->wl, "Loading firmware version 0x%X, patch level %u " in b43legacy_upload_microcode()
1792 dev->fw.rev = fwrev; in b43legacy_upload_microcode()
1793 dev->fw.patch = fwpatch; in b43legacy_upload_microcode()
1796 dev->fw.rev, dev->fw.patch); in b43legacy_upload_microcode()
1797 wiphy->hw_version = dev->dev->id.coreid; in b43legacy_upload_microcode()
1802 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_upload_microcode()
1805 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_upload_microcode()
1810 static int b43legacy_write_initvals(struct b43legacy_wldev *dev, in b43legacy_write_initvals() argument
1839 b43legacy_write32(dev, offset, value); in b43legacy_write_initvals()
1852 b43legacy_write16(dev, offset, value); in b43legacy_write_initvals()
1865 b43legacyerr(dev->wl, "Initial Values Firmware file-format error.\n"); in b43legacy_write_initvals()
1866 b43legacy_print_fw_helptext(dev->wl); in b43legacy_write_initvals()
1871 static int b43legacy_upload_initvals(struct b43legacy_wldev *dev) in b43legacy_upload_initvals() argument
1875 struct b43legacy_firmware *fw = &dev->fw; in b43legacy_upload_initvals()
1883 err = b43legacy_write_initvals(dev, ivals, count, in b43legacy_upload_initvals()
1893 err = b43legacy_write_initvals(dev, ivals, count, in b43legacy_upload_initvals()
1906 static int b43legacy_gpio_init(struct b43legacy_wldev *dev) in b43legacy_gpio_init() argument
1908 struct ssb_bus *bus = dev->dev->bus; in b43legacy_gpio_init()
1913 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_gpio_init()
1914 b43legacy_read32(dev, in b43legacy_gpio_init()
1918 b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, in b43legacy_gpio_init()
1919 b43legacy_read16(dev, in b43legacy_gpio_init()
1925 if (dev->dev->bus->chip_id == 0x4301) { in b43legacy_gpio_init()
1929 if (dev->dev->bus->sprom.boardflags_lo & B43legacy_BFL_PACTRL) { in b43legacy_gpio_init()
1930 b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, in b43legacy_gpio_init()
1931 b43legacy_read16(dev, in b43legacy_gpio_init()
1937 if (dev->dev->id.revision >= 2) in b43legacy_gpio_init()
1941 pcidev = bus->pcicore.dev; in b43legacy_gpio_init()
1943 gpiodev = bus->chipco.dev ? : pcidev; in b43legacy_gpio_init()
1954 static void b43legacy_gpio_cleanup(struct b43legacy_wldev *dev) in b43legacy_gpio_cleanup() argument
1956 struct ssb_bus *bus = dev->dev->bus; in b43legacy_gpio_cleanup()
1960 pcidev = bus->pcicore.dev; in b43legacy_gpio_cleanup()
1962 gpiodev = bus->chipco.dev ? : pcidev; in b43legacy_gpio_cleanup()
1969 void b43legacy_mac_enable(struct b43legacy_wldev *dev) in b43legacy_mac_enable() argument
1971 dev->mac_suspended--; in b43legacy_mac_enable()
1972 B43legacy_WARN_ON(dev->mac_suspended < 0); in b43legacy_mac_enable()
1974 if (dev->mac_suspended == 0) { in b43legacy_mac_enable()
1975 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_mac_enable()
1976 b43legacy_read32(dev, in b43legacy_mac_enable()
1979 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, in b43legacy_mac_enable()
1982 b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_mac_enable()
1983 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_mac_enable()
1984 b43legacy_power_saving_ctl_bits(dev, -1, -1); in b43legacy_mac_enable()
1987 spin_lock_irq(&dev->wl->irq_lock); in b43legacy_mac_enable()
1988 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, in b43legacy_mac_enable()
1989 dev->irq_mask); in b43legacy_mac_enable()
1990 spin_unlock_irq(&dev->wl->irq_lock); in b43legacy_mac_enable()
1995 void b43legacy_mac_suspend(struct b43legacy_wldev *dev) in b43legacy_mac_suspend() argument
2002 B43legacy_WARN_ON(dev->mac_suspended < 0); in b43legacy_mac_suspend()
2004 if (dev->mac_suspended == 0) { in b43legacy_mac_suspend()
2007 spin_lock_irq(&dev->wl->irq_lock); in b43legacy_mac_suspend()
2008 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_mac_suspend()
2009 spin_unlock_irq(&dev->wl->irq_lock); in b43legacy_mac_suspend()
2010 b43legacy_synchronize_irq(dev); in b43legacy_mac_suspend()
2012 b43legacy_power_saving_ctl_bits(dev, -1, 1); in b43legacy_mac_suspend()
2013 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, in b43legacy_mac_suspend()
2014 b43legacy_read32(dev, in b43legacy_mac_suspend()
2017 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_mac_suspend()
2019 tmp = b43legacy_read32(dev, in b43legacy_mac_suspend()
2025 b43legacyerr(dev->wl, "MAC suspend failed\n"); in b43legacy_mac_suspend()
2028 dev->mac_suspended++; in b43legacy_mac_suspend()
2031 static void b43legacy_adjust_opmode(struct b43legacy_wldev *dev) in b43legacy_adjust_opmode() argument
2033 struct b43legacy_wl *wl = dev->wl; in b43legacy_adjust_opmode()
2037 ctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_adjust_opmode()
2064 if (dev->dev->id.revision <= 4) in b43legacy_adjust_opmode()
2067 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, ctl); in b43legacy_adjust_opmode()
2072 if (dev->dev->bus->chip_id == 0x4306 && in b43legacy_adjust_opmode()
2073 dev->dev->bus->chip_rev == 3) in b43legacy_adjust_opmode()
2078 b43legacy_write16(dev, 0x612, cfp_pretbtt); in b43legacy_adjust_opmode()
2081 static void b43legacy_rate_memory_write(struct b43legacy_wldev *dev, in b43legacy_rate_memory_write() argument
2094 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, offset + 0x20, in b43legacy_rate_memory_write()
2095 b43legacy_shm_read16(dev, in b43legacy_rate_memory_write()
2099 static void b43legacy_rate_memory_init(struct b43legacy_wldev *dev) in b43legacy_rate_memory_init() argument
2101 switch (dev->phy.type) { in b43legacy_rate_memory_init()
2103 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_6MB, 1); in b43legacy_rate_memory_init()
2104 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_12MB, 1); in b43legacy_rate_memory_init()
2105 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_18MB, 1); in b43legacy_rate_memory_init()
2106 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_24MB, 1); in b43legacy_rate_memory_init()
2107 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_36MB, 1); in b43legacy_rate_memory_init()
2108 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_48MB, 1); in b43legacy_rate_memory_init()
2109 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_54MB, 1); in b43legacy_rate_memory_init()
2112 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_1MB, 0); in b43legacy_rate_memory_init()
2113 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_2MB, 0); in b43legacy_rate_memory_init()
2114 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_5MB, 0); in b43legacy_rate_memory_init()
2115 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_11MB, 0); in b43legacy_rate_memory_init()
2123 static void b43legacy_mgmtframe_txantenna(struct b43legacy_wldev *dev, in b43legacy_mgmtframe_txantenna() argument
2147 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2150 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2153 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2156 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2159 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2162 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2167 static void b43legacy_chip_exit(struct b43legacy_wldev *dev) in b43legacy_chip_exit() argument
2169 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_exit()
2170 b43legacy_gpio_cleanup(dev); in b43legacy_chip_exit()
2177 static int b43legacy_chip_init(struct b43legacy_wldev *dev) in b43legacy_chip_init() argument
2179 struct b43legacy_phy *phy = &dev->phy; in b43legacy_chip_init()
2187 if (dev->phy.gmode) in b43legacy_chip_init()
2190 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_chip_init()
2192 err = b43legacy_upload_microcode(dev); in b43legacy_chip_init()
2196 err = b43legacy_gpio_init(dev); in b43legacy_chip_init()
2200 err = b43legacy_upload_initvals(dev); in b43legacy_chip_init()
2203 b43legacy_radio_turn_on(dev); in b43legacy_chip_init()
2205 b43legacy_write16(dev, 0x03E6, 0x0000); in b43legacy_chip_init()
2206 err = b43legacy_phy_init(dev); in b43legacy_chip_init()
2213 b43legacy_radio_set_interference_mitigation(dev, tmp); in b43legacy_chip_init()
2215 b43legacy_phy_set_antenna_diversity(dev); in b43legacy_chip_init()
2216 b43legacy_mgmtframe_txantenna(dev, B43legacy_ANTENNA_DEFAULT); in b43legacy_chip_init()
2219 value16 = b43legacy_read16(dev, 0x005E); in b43legacy_chip_init()
2221 b43legacy_write16(dev, 0x005E, value16); in b43legacy_chip_init()
2223 b43legacy_write32(dev, 0x0100, 0x01000000); in b43legacy_chip_init()
2224 if (dev->dev->id.revision < 5) in b43legacy_chip_init()
2225 b43legacy_write32(dev, 0x010C, 0x01000000); in b43legacy_chip_init()
2227 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2229 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2230 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2232 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2234 if (b43legacy_using_pio(dev)) { in b43legacy_chip_init()
2235 b43legacy_write32(dev, 0x0210, 0x00000100); in b43legacy_chip_init()
2236 b43legacy_write32(dev, 0x0230, 0x00000100); in b43legacy_chip_init()
2237 b43legacy_write32(dev, 0x0250, 0x00000100); in b43legacy_chip_init()
2238 b43legacy_write32(dev, 0x0270, 0x00000100); in b43legacy_chip_init()
2239 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0034, in b43legacy_chip_init()
2245 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0074, 0x0000); in b43legacy_chip_init()
2248 b43legacy_adjust_opmode(dev); in b43legacy_chip_init()
2250 if (dev->dev->id.revision < 3) { in b43legacy_chip_init()
2251 b43legacy_write16(dev, 0x060E, 0x0000); in b43legacy_chip_init()
2252 b43legacy_write16(dev, 0x0610, 0x8000); in b43legacy_chip_init()
2253 b43legacy_write16(dev, 0x0604, 0x0000); in b43legacy_chip_init()
2254 b43legacy_write16(dev, 0x0606, 0x0200); in b43legacy_chip_init()
2256 b43legacy_write32(dev, 0x0188, 0x80000000); in b43legacy_chip_init()
2257 b43legacy_write32(dev, 0x018C, 0x02000000); in b43legacy_chip_init()
2259 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, 0x00004000); in b43legacy_chip_init()
2260 b43legacy_write32(dev, B43legacy_MMIO_DMA0_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2261 b43legacy_write32(dev, B43legacy_MMIO_DMA1_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2262 b43legacy_write32(dev, B43legacy_MMIO_DMA2_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2263 b43legacy_write32(dev, B43legacy_MMIO_DMA3_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2264 b43legacy_write32(dev, B43legacy_MMIO_DMA4_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2265 b43legacy_write32(dev, B43legacy_MMIO_DMA5_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2267 value32 = ssb_read32(dev->dev, SSB_TMSLOW); in b43legacy_chip_init()
2269 ssb_write32(dev->dev, SSB_TMSLOW, value32); in b43legacy_chip_init()
2271 b43legacy_write16(dev, B43legacy_MMIO_POWERUP_DELAY, in b43legacy_chip_init()
2272 dev->dev->bus->chipco.fast_pwrup_delay); in b43legacy_chip_init()
2278 b43legacydbg(dev->wl, "Chip initialized\n"); in b43legacy_chip_init()
2283 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_init()
2285 b43legacy_gpio_cleanup(dev); in b43legacy_chip_init()
2289 static void b43legacy_periodic_every120sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every120sec() argument
2291 struct b43legacy_phy *phy = &dev->phy; in b43legacy_periodic_every120sec()
2296 b43legacy_mac_suspend(dev); in b43legacy_periodic_every120sec()
2297 b43legacy_phy_lo_g_measure(dev); in b43legacy_periodic_every120sec()
2298 b43legacy_mac_enable(dev); in b43legacy_periodic_every120sec()
2301 static void b43legacy_periodic_every60sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every60sec() argument
2303 b43legacy_phy_lo_mark_all_unused(dev); in b43legacy_periodic_every60sec()
2304 if (dev->dev->bus->sprom.boardflags_lo & B43legacy_BFL_RSSI) { in b43legacy_periodic_every60sec()
2305 b43legacy_mac_suspend(dev); in b43legacy_periodic_every60sec()
2306 b43legacy_calc_nrssi_slope(dev); in b43legacy_periodic_every60sec()
2307 b43legacy_mac_enable(dev); in b43legacy_periodic_every60sec()
2311 static void b43legacy_periodic_every30sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every30sec() argument
2314 b43legacy_calculate_link_quality(dev); in b43legacy_periodic_every30sec()
2317 static void b43legacy_periodic_every15sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every15sec() argument
2319 b43legacy_phy_xmitpower(dev); /* FIXME: unless scanning? */ in b43legacy_periodic_every15sec()
2321 atomic_set(&dev->phy.txerr_cnt, B43legacy_PHY_TX_BADNESS_LIMIT); in b43legacy_periodic_every15sec()
2325 static void do_periodic_work(struct b43legacy_wldev *dev) in do_periodic_work() argument
2329 state = dev->periodic_state; in do_periodic_work()
2331 b43legacy_periodic_every120sec(dev); in do_periodic_work()
2333 b43legacy_periodic_every60sec(dev); in do_periodic_work()
2335 b43legacy_periodic_every30sec(dev); in do_periodic_work()
2336 b43legacy_periodic_every15sec(dev); in do_periodic_work()
2346 struct b43legacy_wldev *dev = container_of(work, struct b43legacy_wldev, in b43legacy_periodic_work_handler() local
2348 struct b43legacy_wl *wl = dev->wl; in b43legacy_periodic_work_handler()
2353 if (unlikely(b43legacy_status(dev) != B43legacy_STAT_STARTED)) in b43legacy_periodic_work_handler()
2355 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_STOP)) in b43legacy_periodic_work_handler()
2358 do_periodic_work(dev); in b43legacy_periodic_work_handler()
2360 dev->periodic_state++; in b43legacy_periodic_work_handler()
2362 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_FAST)) in b43legacy_periodic_work_handler()
2366 ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); in b43legacy_periodic_work_handler()
2371 static void b43legacy_periodic_tasks_setup(struct b43legacy_wldev *dev) in b43legacy_periodic_tasks_setup() argument
2373 struct delayed_work *work = &dev->periodic_work; in b43legacy_periodic_tasks_setup()
2375 dev->periodic_state = 0; in b43legacy_periodic_tasks_setup()
2377 ieee80211_queue_delayed_work(dev->wl->hw, work, 0); in b43legacy_periodic_tasks_setup()
2381 static int b43legacy_validate_chipaccess(struct b43legacy_wldev *dev) in b43legacy_validate_chipaccess() argument
2386 shm_backup = b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0); in b43legacy_validate_chipaccess()
2387 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0xAA5555AA); in b43legacy_validate_chipaccess()
2388 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2391 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0x55AAAA55); in b43legacy_validate_chipaccess()
2392 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2395 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, shm_backup); in b43legacy_validate_chipaccess()
2397 value = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_validate_chipaccess()
2402 value = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_validate_chipaccess()
2408 b43legacyerr(dev->wl, "Failed to validate the chipaccess\n"); in b43legacy_validate_chipaccess()
2412 static void b43legacy_security_init(struct b43legacy_wldev *dev) in b43legacy_security_init() argument
2414 dev->max_nr_keys = (dev->dev->id.revision >= 5) ? 58 : 20; in b43legacy_security_init()
2415 B43legacy_WARN_ON(dev->max_nr_keys > ARRAY_SIZE(dev->key)); in b43legacy_security_init()
2416 dev->ktp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_security_init()
2421 dev->ktp *= 2; in b43legacy_security_init()
2422 if (dev->dev->id.revision >= 5) in b43legacy_security_init()
2424 b43legacy_write16(dev, B43legacy_MMIO_RCMTA_COUNT, in b43legacy_security_init()
2425 dev->max_nr_keys - 8); in b43legacy_security_init()
2480 struct b43legacy_wldev *dev; in b43legacy_tx_work() local
2486 dev = wl->current_dev; in b43legacy_tx_work()
2487 if (unlikely(!dev || b43legacy_status(dev) < B43legacy_STAT_STARTED)) { in b43legacy_tx_work()
2495 if (b43legacy_using_pio(dev)) in b43legacy_tx_work()
2496 err = b43legacy_pio_tx(dev, skb); in b43legacy_tx_work()
2498 err = b43legacy_dma_tx(dev, skb); in b43legacy_tx_work()
2572 struct b43legacy_wldev **dev, in find_wldev_for_phymode() argument
2582 *dev = d; in find_wldev_for_phymode()
2591 static void b43legacy_put_phy_into_reset(struct b43legacy_wldev *dev) in b43legacy_put_phy_into_reset() argument
2593 struct ssb_device *sdev = dev->dev; in b43legacy_put_phy_into_reset()
2681 static void b43legacy_set_retry_limits(struct b43legacy_wldev *dev, in b43legacy_set_retry_limits() argument
2690 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0006, short_retry); in b43legacy_set_retry_limits()
2691 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0007, long_retry); in b43legacy_set_retry_limits()
2698 struct b43legacy_wldev *dev; in b43legacy_op_dev_config() local
2709 dev = wl->current_dev; in b43legacy_op_dev_config()
2710 phy = &dev->phy; in b43legacy_op_dev_config()
2713 b43legacy_set_retry_limits(dev, in b43legacy_op_dev_config()
2739 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_dev_config()
2743 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_dev_config()
2745 b43legacy_synchronize_irq(dev); in b43legacy_op_dev_config()
2750 b43legacy_radio_selectchannel(dev, conf->chandef.chan->hw_value, in b43legacy_op_dev_config()
2753 dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR); in b43legacy_op_dev_config()
2759 b43legacy_phy_xmitpower(dev); in b43legacy_op_dev_config()
2764 b43legacy_mgmtframe_txantenna(dev, antenna_tx); in b43legacy_op_dev_config()
2768 b43legacy_radio_turn_on(dev); in b43legacy_op_dev_config()
2769 b43legacyinfo(dev->wl, "Radio turned on by software\n"); in b43legacy_op_dev_config()
2770 if (!dev->radio_hw_enable) in b43legacy_op_dev_config()
2771 b43legacyinfo(dev->wl, "The hardware RF-kill" in b43legacy_op_dev_config()
2776 b43legacy_radio_turn_off(dev, 0); in b43legacy_op_dev_config()
2777 b43legacyinfo(dev->wl, "Radio turned off by" in b43legacy_op_dev_config()
2783 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_dev_config()
2792 static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates) in b43legacy_update_basic_rates() argument
2795 dev->wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ]; in b43legacy_update_basic_rates()
2829 rateptr = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2832 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2843 struct b43legacy_wldev *dev; in b43legacy_op_bss_info_changed() local
2849 dev = wl->current_dev; in b43legacy_op_bss_info_changed()
2855 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_bss_info_changed()
2859 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_bss_info_changed()
2862 b43legacy_synchronize_irq(dev); in b43legacy_op_bss_info_changed()
2870 if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) { in b43legacy_op_bss_info_changed()
2877 b43legacy_write_mac_bssid_templates(dev); in b43legacy_op_bss_info_changed()
2881 b43legacy_mac_suspend(dev); in b43legacy_op_bss_info_changed()
2886 b43legacy_set_beacon_int(dev, conf->beacon_int); in b43legacy_op_bss_info_changed()
2889 b43legacy_update_basic_rates(dev, conf->basic_rates); in b43legacy_op_bss_info_changed()
2893 b43legacy_short_slot_timing_enable(dev); in b43legacy_op_bss_info_changed()
2895 b43legacy_short_slot_timing_disable(dev); in b43legacy_op_bss_info_changed()
2898 b43legacy_mac_enable(dev); in b43legacy_op_bss_info_changed()
2901 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_bss_info_changed()
2914 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_configure_filter() local
2917 if (!dev) { in b43legacy_op_configure_filter()
2939 if (changed && b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) in b43legacy_op_configure_filter()
2940 b43legacy_adjust_opmode(dev); in b43legacy_op_configure_filter()
2945 static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev) in b43legacy_wireless_core_stop() argument
2947 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_stop()
2951 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) in b43legacy_wireless_core_stop()
2958 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_wireless_core_stop()
2959 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_MASK); /* flush */ in b43legacy_wireless_core_stop()
2961 b43legacy_synchronize_irq(dev); in b43legacy_wireless_core_stop()
2963 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_stop()
2968 cancel_delayed_work_sync(&dev->periodic_work); in b43legacy_wireless_core_stop()
2978 b43legacy_mac_suspend(dev); in b43legacy_wireless_core_stop()
2979 free_irq(dev->dev->irq, dev); in b43legacy_wireless_core_stop()
2984 static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev) in b43legacy_wireless_core_start() argument
2988 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_start()
2990 drain_txstatus_queue(dev); in b43legacy_wireless_core_start()
2991 err = request_irq(dev->dev->irq, b43legacy_interrupt_handler, in b43legacy_wireless_core_start()
2992 IRQF_SHARED, KBUILD_MODNAME, dev); in b43legacy_wireless_core_start()
2994 b43legacyerr(dev->wl, "Cannot request IRQ-%d\n", in b43legacy_wireless_core_start()
2995 dev->dev->irq); in b43legacy_wireless_core_start()
2999 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_start()
3000 b43legacy_set_status(dev, B43legacy_STAT_STARTED); in b43legacy_wireless_core_start()
3003 b43legacy_mac_enable(dev); in b43legacy_wireless_core_start()
3004 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_wireless_core_start()
3007 b43legacy_periodic_tasks_setup(dev); in b43legacy_wireless_core_start()
3009 b43legacydbg(dev->wl, "Wireless interface started\n"); in b43legacy_wireless_core_start()
3015 static int b43legacy_phy_versioning(struct b43legacy_wldev *dev) in b43legacy_phy_versioning() argument
3017 struct b43legacy_phy *phy = &dev->phy; in b43legacy_phy_versioning()
3028 tmp = b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); in b43legacy_phy_versioning()
3047 b43legacyerr(dev->wl, "FOUND UNSUPPORTED PHY " in b43legacy_phy_versioning()
3052 b43legacydbg(dev->wl, "Found PHY: Analog %u, Type %u, Revision %u\n", in b43legacy_phy_versioning()
3057 if (dev->dev->bus->chip_id == 0x4317) { in b43legacy_phy_versioning()
3058 if (dev->dev->bus->chip_rev == 0) in b43legacy_phy_versioning()
3060 else if (dev->dev->bus->chip_rev == 1) in b43legacy_phy_versioning()
3065 b43legacy_write16(dev, B43legacy_MMIO_RADIO_CONTROL, in b43legacy_phy_versioning()
3067 tmp = b43legacy_read16(dev, B43legacy_MMIO_RADIO_DATA_HIGH); in b43legacy_phy_versioning()
3069 b43legacy_write16(dev, B43legacy_MMIO_RADIO_CONTROL, in b43legacy_phy_versioning()
3071 tmp |= b43legacy_read16(dev, B43legacy_MMIO_RADIO_DATA_LOW); in b43legacy_phy_versioning()
3089 b43legacyerr(dev->wl, "FOUND UNSUPPORTED RADIO " in b43legacy_phy_versioning()
3094 b43legacydbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X," in b43legacy_phy_versioning()
3109 static void setup_struct_phy_for_init(struct b43legacy_wldev *dev, in setup_struct_phy_for_init() argument
3120 dev->radio_hw_enable = true; in setup_struct_phy_for_init()
3135 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in setup_struct_phy_for_init()
3136 phy->rfatt = b43legacy_default_radio_attenuation(dev); in setup_struct_phy_for_init()
3137 phy->txctl1 = b43legacy_default_txctl1(dev); in setup_struct_phy_for_init()
3154 static void setup_struct_wldev_for_init(struct b43legacy_wldev *dev) in setup_struct_wldev_for_init() argument
3157 dev->dfq_valid = false; in setup_struct_wldev_for_init()
3160 memset(&dev->stats, 0, sizeof(dev->stats)); in setup_struct_wldev_for_init()
3162 setup_struct_phy_for_init(dev, &dev->phy); in setup_struct_wldev_for_init()
3165 dev->irq_reason = 0; in setup_struct_wldev_for_init()
3166 memset(dev->dma_reason, 0, sizeof(dev->dma_reason)); in setup_struct_wldev_for_init()
3167 dev->irq_mask = B43legacy_IRQ_MASKTEMPLATE; in setup_struct_wldev_for_init()
3169 dev->mac_suspended = 1; in setup_struct_wldev_for_init()
3172 memset(&dev->noisecalc, 0, sizeof(dev->noisecalc)); in setup_struct_wldev_for_init()
3175 static void b43legacy_set_synth_pu_delay(struct b43legacy_wldev *dev, in b43legacy_set_synth_pu_delay() argument
3179 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle) in b43legacy_set_synth_pu_delay()
3181 if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8)) in b43legacy_set_synth_pu_delay()
3184 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_synth_pu_delay()
3189 static void b43legacy_set_pretbtt(struct b43legacy_wldev *dev) in b43legacy_set_pretbtt() argument
3194 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in b43legacy_set_pretbtt()
3198 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_pretbtt()
3200 b43legacy_write16(dev, B43legacy_MMIO_TSF_CFP_PRETBTT, pretbtt); in b43legacy_set_pretbtt()
3205 static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) in b43legacy_wireless_core_exit() argument
3207 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_exit()
3210 B43legacy_WARN_ON(b43legacy_status(dev) > B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_exit()
3211 if (b43legacy_status(dev) != B43legacy_STAT_INITIALIZED) in b43legacy_wireless_core_exit()
3213 b43legacy_set_status(dev, B43legacy_STAT_UNINIT); in b43legacy_wireless_core_exit()
3216 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_wireless_core_exit()
3219 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_wireless_core_exit()
3221 b43legacy_leds_exit(dev); in b43legacy_wireless_core_exit()
3222 b43legacy_rng_exit(dev->wl); in b43legacy_wireless_core_exit()
3223 b43legacy_pio_free(dev); in b43legacy_wireless_core_exit()
3224 b43legacy_dma_free(dev); in b43legacy_wireless_core_exit()
3225 b43legacy_chip_exit(dev); in b43legacy_wireless_core_exit()
3226 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_exit()
3227 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_exit()
3232 if (dev->wl->current_beacon) { in b43legacy_wireless_core_exit()
3233 dev_kfree_skb_any(dev->wl->current_beacon); in b43legacy_wireless_core_exit()
3234 dev->wl->current_beacon = NULL; in b43legacy_wireless_core_exit()
3237 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_exit()
3238 ssb_bus_may_powerdown(dev->dev->bus); in b43legacy_wireless_core_exit()
3241 static void prepare_phy_data_for_init(struct b43legacy_wldev *dev) in prepare_phy_data_for_init() argument
3243 struct b43legacy_phy *phy = &dev->phy; in prepare_phy_data_for_init()
3247 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in prepare_phy_data_for_init()
3248 phy->rfatt = b43legacy_default_radio_attenuation(dev); in prepare_phy_data_for_init()
3249 phy->txctl1 = b43legacy_default_txctl1(dev); in prepare_phy_data_for_init()
3281 static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev) in b43legacy_wireless_core_init() argument
3283 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_init()
3284 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_init()
3285 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_init()
3286 struct ssb_sprom *sprom = &dev->dev->bus->sprom; in b43legacy_wireless_core_init()
3291 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3296 if (!ssb_device_is_enabled(dev->dev)) { in b43legacy_wireless_core_init()
3298 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_init()
3309 setup_struct_wldev_for_init(dev); in b43legacy_wireless_core_init()
3311 err = b43legacy_phy_init_tssi2dbm_table(dev); in b43legacy_wireless_core_init()
3316 ssb_pcicore_dev_irqvecs_enable(&bus->pcicore, dev->dev); in b43legacy_wireless_core_init()
3318 prepare_phy_data_for_init(dev); in b43legacy_wireless_core_init()
3319 b43legacy_phy_calibrate(dev); in b43legacy_wireless_core_init()
3320 err = b43legacy_chip_init(dev); in b43legacy_wireless_core_init()
3323 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3325 dev->dev->id.revision); in b43legacy_wireless_core_init()
3326 hf = b43legacy_hf_read(dev); in b43legacy_wireless_core_init()
3338 b43legacy_hf_write(dev, hf); in b43legacy_wireless_core_init()
3340 b43legacy_set_retry_limits(dev, in b43legacy_wireless_core_init()
3344 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3346 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3353 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3356 b43legacy_rate_memory_init(dev); in b43legacy_wireless_core_init()
3360 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3363 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3366 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3370 if (b43legacy_using_pio(dev)) in b43legacy_wireless_core_init()
3371 err = b43legacy_pio_init(dev); in b43legacy_wireless_core_init()
3373 err = b43legacy_dma_init(dev); in b43legacy_wireless_core_init()
3375 b43legacy_qos_init(dev); in b43legacy_wireless_core_init()
3381 b43legacy_set_synth_pu_delay(dev, 1); in b43legacy_wireless_core_init()
3384 b43legacy_upload_card_macaddress(dev); in b43legacy_wireless_core_init()
3385 b43legacy_security_init(dev); in b43legacy_wireless_core_init()
3388 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_init()
3389 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_init()
3391 b43legacy_leds_init(dev); in b43legacy_wireless_core_init()
3396 b43legacy_chip_exit(dev); in b43legacy_wireless_core_init()
3404 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3412 struct b43legacy_wldev *dev; in b43legacy_op_add_interface() local
3430 dev = wl->current_dev; in b43legacy_op_add_interface()
3437 b43legacy_adjust_opmode(dev); in b43legacy_op_add_interface()
3438 b43legacy_set_pretbtt(dev); in b43legacy_op_add_interface()
3439 b43legacy_set_synth_pu_delay(dev, 0); in b43legacy_op_add_interface()
3440 b43legacy_upload_card_macaddress(dev); in b43legacy_op_add_interface()
3454 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_remove_interface() local
3468 b43legacy_adjust_opmode(dev); in b43legacy_op_remove_interface()
3470 b43legacy_upload_card_macaddress(dev); in b43legacy_op_remove_interface()
3479 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_start() local
3496 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) { in b43legacy_op_start()
3497 err = b43legacy_wireless_core_init(dev); in b43legacy_op_start()
3503 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_start()
3504 err = b43legacy_wireless_core_start(dev); in b43legacy_op_start()
3507 b43legacy_wireless_core_exit(dev); in b43legacy_op_start()
3523 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_stop() local
3528 if (b43legacy_status(dev) >= B43legacy_STAT_STARTED) in b43legacy_op_stop()
3529 b43legacy_wireless_core_stop(dev); in b43legacy_op_stop()
3530 b43legacy_wireless_core_exit(dev); in b43legacy_op_stop()
3552 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_get_survey() local
3560 survey->noise = dev->stats.link_noise; in b43legacy_op_get_survey()
3586 struct b43legacy_wldev *dev = in b43legacy_chip_reset() local
3588 struct b43legacy_wl *wl = dev->wl; in b43legacy_chip_reset()
3594 prev_status = b43legacy_status(dev); in b43legacy_chip_reset()
3597 b43legacy_wireless_core_stop(dev); in b43legacy_chip_reset()
3599 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3603 err = b43legacy_wireless_core_init(dev); in b43legacy_chip_reset()
3608 err = b43legacy_wireless_core_start(dev); in b43legacy_chip_reset()
3610 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3624 static int b43legacy_setup_modes(struct b43legacy_wldev *dev, in b43legacy_setup_modes() argument
3628 struct ieee80211_hw *hw = dev->wl->hw; in b43legacy_setup_modes()
3629 struct b43legacy_phy *phy = &dev->phy; in b43legacy_setup_modes()
3647 static void b43legacy_wireless_core_detach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_detach() argument
3651 b43legacy_release_firmware(dev); in b43legacy_wireless_core_detach()
3654 static int b43legacy_wireless_core_attach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_attach() argument
3656 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_attach()
3657 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_attach()
3677 if (dev->dev->id.revision >= 5) { in b43legacy_wireless_core_attach()
3680 tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH); in b43legacy_wireless_core_attach()
3684 } else if (dev->dev->id.revision == 4) in b43legacy_wireless_core_attach()
3689 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3690 dev->phy.radio_on = true; in b43legacy_wireless_core_attach()
3691 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3692 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3694 err = b43legacy_phy_versioning(dev); in b43legacy_wireless_core_attach()
3705 switch (dev->phy.type) { in b43legacy_wireless_core_attach()
3716 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3717 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3718 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3720 err = b43legacy_validate_chipaccess(dev); in b43legacy_wireless_core_attach()
3723 err = b43legacy_setup_modes(dev, have_bphy, have_gphy); in b43legacy_wireless_core_attach()
3729 wl->current_dev = dev; in b43legacy_wireless_core_attach()
3730 INIT_WORK(&dev->restart_work, b43legacy_chip_reset); in b43legacy_wireless_core_attach()
3732 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_attach()
3733 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_attach()
3734 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_attach()
3745 static void b43legacy_one_core_detach(struct ssb_device *dev) in b43legacy_one_core_detach() argument
3753 wldev = ssb_get_drvdata(dev); in b43legacy_one_core_detach()
3759 ssb_set_drvdata(dev, NULL); in b43legacy_one_core_detach()
3763 static int b43legacy_one_core_attach(struct ssb_device *dev, in b43legacy_one_core_attach() argument
3773 wldev->dev = dev; in b43legacy_one_core_attach()
3790 ssb_set_drvdata(dev, wldev); in b43legacy_one_core_attach()
3809 static void b43legacy_wireless_exit(struct ssb_device *dev, in b43legacy_wireless_exit() argument
3814 ssb_set_devtypedata(dev, NULL); in b43legacy_wireless_exit()
3818 static int b43legacy_wireless_init(struct ssb_device *dev) in b43legacy_wireless_init() argument
3820 struct ssb_sprom *sprom = &dev->bus->sprom; in b43legacy_wireless_init()
3826 b43legacy_sprom_fixup(dev->bus); in b43legacy_wireless_init()
3845 SET_IEEE80211_DEV(hw, dev->dev); in b43legacy_wireless_init()
3868 ssb_set_devtypedata(dev, wl); in b43legacy_wireless_init()
3870 dev->bus->chip_id, dev->id.revision); in b43legacy_wireless_init()
3876 static int b43legacy_probe(struct ssb_device *dev, in b43legacy_probe() argument
3883 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3887 err = b43legacy_wireless_init(dev); in b43legacy_probe()
3890 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3893 err = b43legacy_one_core_attach(dev, wl); in b43legacy_probe()
3906 b43legacy_wireless_exit(dev, wl); in b43legacy_probe()
3910 static void b43legacy_remove(struct ssb_device *dev) in b43legacy_remove() argument
3912 struct b43legacy_wl *wl = ssb_get_devtypedata(dev); in b43legacy_remove()
3913 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_remove()
3927 b43legacy_one_core_detach(dev); in b43legacy_remove()
3933 b43legacy_wireless_exit(dev, wl); in b43legacy_remove()
3937 void b43legacy_controller_restart(struct b43legacy_wldev *dev, in b43legacy_controller_restart() argument
3941 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) in b43legacy_controller_restart()
3943 b43legacyinfo(dev->wl, "Controller RESET (%s) ...\n", reason); in b43legacy_controller_restart()
3944 ieee80211_queue_work(dev->wl->hw, &dev->restart_work); in b43legacy_controller_restart()
3949 static int b43legacy_suspend(struct ssb_device *dev, pm_message_t state) in b43legacy_suspend() argument
3951 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_suspend()
3969 static int b43legacy_resume(struct ssb_device *dev) in b43legacy_resume() argument
3971 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_resume()