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()
2066 if (dev->dev->id.revision <= 4) in b43legacy_adjust_opmode()
2069 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, ctl); in b43legacy_adjust_opmode()
2074 if (dev->dev->bus->chip_id == 0x4306 && in b43legacy_adjust_opmode()
2075 dev->dev->bus->chip_rev == 3) in b43legacy_adjust_opmode()
2080 b43legacy_write16(dev, 0x612, cfp_pretbtt); in b43legacy_adjust_opmode()
2083 static void b43legacy_rate_memory_write(struct b43legacy_wldev *dev, in b43legacy_rate_memory_write() argument
2096 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, offset + 0x20, in b43legacy_rate_memory_write()
2097 b43legacy_shm_read16(dev, in b43legacy_rate_memory_write()
2101 static void b43legacy_rate_memory_init(struct b43legacy_wldev *dev) in b43legacy_rate_memory_init() argument
2103 switch (dev->phy.type) { in b43legacy_rate_memory_init()
2105 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_6MB, 1); in b43legacy_rate_memory_init()
2106 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_12MB, 1); in b43legacy_rate_memory_init()
2107 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_18MB, 1); in b43legacy_rate_memory_init()
2108 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_24MB, 1); in b43legacy_rate_memory_init()
2109 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_36MB, 1); in b43legacy_rate_memory_init()
2110 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_48MB, 1); in b43legacy_rate_memory_init()
2111 b43legacy_rate_memory_write(dev, B43legacy_OFDM_RATE_54MB, 1); in b43legacy_rate_memory_init()
2114 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_1MB, 0); in b43legacy_rate_memory_init()
2115 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_2MB, 0); in b43legacy_rate_memory_init()
2116 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_5MB, 0); in b43legacy_rate_memory_init()
2117 b43legacy_rate_memory_write(dev, B43legacy_CCK_RATE_11MB, 0); in b43legacy_rate_memory_init()
2125 static void b43legacy_mgmtframe_txantenna(struct b43legacy_wldev *dev, in b43legacy_mgmtframe_txantenna() argument
2149 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2152 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2155 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2158 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2161 tmp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2164 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_mgmtframe_txantenna()
2169 static void b43legacy_chip_exit(struct b43legacy_wldev *dev) in b43legacy_chip_exit() argument
2171 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_exit()
2172 b43legacy_gpio_cleanup(dev); in b43legacy_chip_exit()
2179 static int b43legacy_chip_init(struct b43legacy_wldev *dev) in b43legacy_chip_init() argument
2181 struct b43legacy_phy *phy = &dev->phy; in b43legacy_chip_init()
2189 if (dev->phy.gmode) in b43legacy_chip_init()
2192 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_chip_init()
2194 err = b43legacy_upload_microcode(dev); in b43legacy_chip_init()
2198 err = b43legacy_gpio_init(dev); in b43legacy_chip_init()
2202 err = b43legacy_upload_initvals(dev); in b43legacy_chip_init()
2205 b43legacy_radio_turn_on(dev); in b43legacy_chip_init()
2207 b43legacy_write16(dev, 0x03E6, 0x0000); in b43legacy_chip_init()
2208 err = b43legacy_phy_init(dev); in b43legacy_chip_init()
2215 b43legacy_radio_set_interference_mitigation(dev, tmp); in b43legacy_chip_init()
2217 b43legacy_phy_set_antenna_diversity(dev); in b43legacy_chip_init()
2218 b43legacy_mgmtframe_txantenna(dev, B43legacy_ANTENNA_DEFAULT); in b43legacy_chip_init()
2221 value16 = b43legacy_read16(dev, 0x005E); in b43legacy_chip_init()
2223 b43legacy_write16(dev, 0x005E, value16); in b43legacy_chip_init()
2225 b43legacy_write32(dev, 0x0100, 0x01000000); in b43legacy_chip_init()
2226 if (dev->dev->id.revision < 5) in b43legacy_chip_init()
2227 b43legacy_write32(dev, 0x010C, 0x01000000); in b43legacy_chip_init()
2229 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2231 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2232 value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_chip_init()
2234 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); in b43legacy_chip_init()
2236 if (b43legacy_using_pio(dev)) { in b43legacy_chip_init()
2237 b43legacy_write32(dev, 0x0210, 0x00000100); in b43legacy_chip_init()
2238 b43legacy_write32(dev, 0x0230, 0x00000100); in b43legacy_chip_init()
2239 b43legacy_write32(dev, 0x0250, 0x00000100); in b43legacy_chip_init()
2240 b43legacy_write32(dev, 0x0270, 0x00000100); in b43legacy_chip_init()
2241 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0034, in b43legacy_chip_init()
2247 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, 0x0074, 0x0000); in b43legacy_chip_init()
2250 b43legacy_adjust_opmode(dev); in b43legacy_chip_init()
2252 if (dev->dev->id.revision < 3) { in b43legacy_chip_init()
2253 b43legacy_write16(dev, 0x060E, 0x0000); in b43legacy_chip_init()
2254 b43legacy_write16(dev, 0x0610, 0x8000); in b43legacy_chip_init()
2255 b43legacy_write16(dev, 0x0604, 0x0000); in b43legacy_chip_init()
2256 b43legacy_write16(dev, 0x0606, 0x0200); in b43legacy_chip_init()
2258 b43legacy_write32(dev, 0x0188, 0x80000000); in b43legacy_chip_init()
2259 b43legacy_write32(dev, 0x018C, 0x02000000); in b43legacy_chip_init()
2261 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, 0x00004000); in b43legacy_chip_init()
2262 b43legacy_write32(dev, B43legacy_MMIO_DMA0_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2263 b43legacy_write32(dev, B43legacy_MMIO_DMA1_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2264 b43legacy_write32(dev, B43legacy_MMIO_DMA2_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2265 b43legacy_write32(dev, B43legacy_MMIO_DMA3_IRQ_MASK, 0x0001DC00); in b43legacy_chip_init()
2266 b43legacy_write32(dev, B43legacy_MMIO_DMA4_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2267 b43legacy_write32(dev, B43legacy_MMIO_DMA5_IRQ_MASK, 0x0000DC00); in b43legacy_chip_init()
2269 value32 = ssb_read32(dev->dev, SSB_TMSLOW); in b43legacy_chip_init()
2271 ssb_write32(dev->dev, SSB_TMSLOW, value32); in b43legacy_chip_init()
2273 b43legacy_write16(dev, B43legacy_MMIO_POWERUP_DELAY, in b43legacy_chip_init()
2274 dev->dev->bus->chipco.fast_pwrup_delay); in b43legacy_chip_init()
2280 b43legacydbg(dev->wl, "Chip initialized\n"); in b43legacy_chip_init()
2285 b43legacy_radio_turn_off(dev, 1); in b43legacy_chip_init()
2287 b43legacy_gpio_cleanup(dev); in b43legacy_chip_init()
2291 static void b43legacy_periodic_every120sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every120sec() argument
2293 struct b43legacy_phy *phy = &dev->phy; in b43legacy_periodic_every120sec()
2298 b43legacy_mac_suspend(dev); in b43legacy_periodic_every120sec()
2299 b43legacy_phy_lo_g_measure(dev); in b43legacy_periodic_every120sec()
2300 b43legacy_mac_enable(dev); in b43legacy_periodic_every120sec()
2303 static void b43legacy_periodic_every60sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every60sec() argument
2305 b43legacy_phy_lo_mark_all_unused(dev); in b43legacy_periodic_every60sec()
2306 if (dev->dev->bus->sprom.boardflags_lo & B43legacy_BFL_RSSI) { in b43legacy_periodic_every60sec()
2307 b43legacy_mac_suspend(dev); in b43legacy_periodic_every60sec()
2308 b43legacy_calc_nrssi_slope(dev); in b43legacy_periodic_every60sec()
2309 b43legacy_mac_enable(dev); in b43legacy_periodic_every60sec()
2313 static void b43legacy_periodic_every30sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every30sec() argument
2316 b43legacy_calculate_link_quality(dev); in b43legacy_periodic_every30sec()
2319 static void b43legacy_periodic_every15sec(struct b43legacy_wldev *dev) in b43legacy_periodic_every15sec() argument
2321 b43legacy_phy_xmitpower(dev); /* FIXME: unless scanning? */ in b43legacy_periodic_every15sec()
2323 atomic_set(&dev->phy.txerr_cnt, B43legacy_PHY_TX_BADNESS_LIMIT); in b43legacy_periodic_every15sec()
2327 static void do_periodic_work(struct b43legacy_wldev *dev) in do_periodic_work() argument
2331 state = dev->periodic_state; in do_periodic_work()
2333 b43legacy_periodic_every120sec(dev); in do_periodic_work()
2335 b43legacy_periodic_every60sec(dev); in do_periodic_work()
2337 b43legacy_periodic_every30sec(dev); in do_periodic_work()
2338 b43legacy_periodic_every15sec(dev); in do_periodic_work()
2348 struct b43legacy_wldev *dev = container_of(work, struct b43legacy_wldev, in b43legacy_periodic_work_handler() local
2350 struct b43legacy_wl *wl = dev->wl; in b43legacy_periodic_work_handler()
2355 if (unlikely(b43legacy_status(dev) != B43legacy_STAT_STARTED)) in b43legacy_periodic_work_handler()
2357 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_STOP)) in b43legacy_periodic_work_handler()
2360 do_periodic_work(dev); in b43legacy_periodic_work_handler()
2362 dev->periodic_state++; in b43legacy_periodic_work_handler()
2364 if (b43legacy_debug(dev, B43legacy_DBG_PWORK_FAST)) in b43legacy_periodic_work_handler()
2368 ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay); in b43legacy_periodic_work_handler()
2373 static void b43legacy_periodic_tasks_setup(struct b43legacy_wldev *dev) in b43legacy_periodic_tasks_setup() argument
2375 struct delayed_work *work = &dev->periodic_work; in b43legacy_periodic_tasks_setup()
2377 dev->periodic_state = 0; in b43legacy_periodic_tasks_setup()
2379 ieee80211_queue_delayed_work(dev->wl->hw, work, 0); in b43legacy_periodic_tasks_setup()
2383 static int b43legacy_validate_chipaccess(struct b43legacy_wldev *dev) in b43legacy_validate_chipaccess() argument
2388 shm_backup = b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0); in b43legacy_validate_chipaccess()
2389 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0xAA5555AA); in b43legacy_validate_chipaccess()
2390 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2393 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, 0x55AAAA55); in b43legacy_validate_chipaccess()
2394 if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, 0) != in b43legacy_validate_chipaccess()
2397 b43legacy_shm_write32(dev, B43legacy_SHM_SHARED, 0, shm_backup); in b43legacy_validate_chipaccess()
2399 value = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_validate_chipaccess()
2404 value = b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); in b43legacy_validate_chipaccess()
2410 b43legacyerr(dev->wl, "Failed to validate the chipaccess\n"); in b43legacy_validate_chipaccess()
2414 static void b43legacy_security_init(struct b43legacy_wldev *dev) in b43legacy_security_init() argument
2416 dev->max_nr_keys = (dev->dev->id.revision >= 5) ? 58 : 20; in b43legacy_security_init()
2417 B43legacy_WARN_ON(dev->max_nr_keys > ARRAY_SIZE(dev->key)); in b43legacy_security_init()
2418 dev->ktp = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_security_init()
2423 dev->ktp *= 2; in b43legacy_security_init()
2424 if (dev->dev->id.revision >= 5) in b43legacy_security_init()
2426 b43legacy_write16(dev, B43legacy_MMIO_RCMTA_COUNT, in b43legacy_security_init()
2427 dev->max_nr_keys - 8); in b43legacy_security_init()
2482 struct b43legacy_wldev *dev; in b43legacy_tx_work() local
2488 dev = wl->current_dev; in b43legacy_tx_work()
2489 if (unlikely(!dev || b43legacy_status(dev) < B43legacy_STAT_STARTED)) { in b43legacy_tx_work()
2497 if (b43legacy_using_pio(dev)) in b43legacy_tx_work()
2498 err = b43legacy_pio_tx(dev, skb); in b43legacy_tx_work()
2500 err = b43legacy_dma_tx(dev, skb); in b43legacy_tx_work()
2574 struct b43legacy_wldev **dev, in find_wldev_for_phymode() argument
2584 *dev = d; in find_wldev_for_phymode()
2593 static void b43legacy_put_phy_into_reset(struct b43legacy_wldev *dev) in b43legacy_put_phy_into_reset() argument
2595 struct ssb_device *sdev = dev->dev; in b43legacy_put_phy_into_reset()
2683 static void b43legacy_set_retry_limits(struct b43legacy_wldev *dev, in b43legacy_set_retry_limits() argument
2692 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0006, short_retry); in b43legacy_set_retry_limits()
2693 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0007, long_retry); in b43legacy_set_retry_limits()
2700 struct b43legacy_wldev *dev; in b43legacy_op_dev_config() local
2711 dev = wl->current_dev; in b43legacy_op_dev_config()
2712 phy = &dev->phy; in b43legacy_op_dev_config()
2715 b43legacy_set_retry_limits(dev, in b43legacy_op_dev_config()
2741 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_dev_config()
2745 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_dev_config()
2747 b43legacy_synchronize_irq(dev); in b43legacy_op_dev_config()
2752 b43legacy_radio_selectchannel(dev, conf->chandef.chan->hw_value, in b43legacy_op_dev_config()
2755 dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR); in b43legacy_op_dev_config()
2761 b43legacy_phy_xmitpower(dev); in b43legacy_op_dev_config()
2766 b43legacy_mgmtframe_txantenna(dev, antenna_tx); in b43legacy_op_dev_config()
2770 b43legacy_radio_turn_on(dev); in b43legacy_op_dev_config()
2771 b43legacyinfo(dev->wl, "Radio turned on by software\n"); in b43legacy_op_dev_config()
2772 if (!dev->radio_hw_enable) in b43legacy_op_dev_config()
2773 b43legacyinfo(dev->wl, "The hardware RF-kill" in b43legacy_op_dev_config()
2778 b43legacy_radio_turn_off(dev, 0); in b43legacy_op_dev_config()
2779 b43legacyinfo(dev->wl, "Radio turned off by" in b43legacy_op_dev_config()
2785 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_dev_config()
2794 static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates) in b43legacy_update_basic_rates() argument
2797 dev->wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ]; in b43legacy_update_basic_rates()
2831 rateptr = b43legacy_shm_read16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2834 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_update_basic_rates()
2845 struct b43legacy_wldev *dev; in b43legacy_op_bss_info_changed() local
2851 dev = wl->current_dev; in b43legacy_op_bss_info_changed()
2857 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_bss_info_changed()
2861 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_op_bss_info_changed()
2864 b43legacy_synchronize_irq(dev); in b43legacy_op_bss_info_changed()
2872 if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) { in b43legacy_op_bss_info_changed()
2879 b43legacy_write_mac_bssid_templates(dev); in b43legacy_op_bss_info_changed()
2883 b43legacy_mac_suspend(dev); in b43legacy_op_bss_info_changed()
2888 b43legacy_set_beacon_int(dev, conf->beacon_int); in b43legacy_op_bss_info_changed()
2891 b43legacy_update_basic_rates(dev, conf->basic_rates); in b43legacy_op_bss_info_changed()
2895 b43legacy_short_slot_timing_enable(dev); in b43legacy_op_bss_info_changed()
2897 b43legacy_short_slot_timing_disable(dev); in b43legacy_op_bss_info_changed()
2900 b43legacy_mac_enable(dev); in b43legacy_op_bss_info_changed()
2903 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_op_bss_info_changed()
2916 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_configure_filter() local
2919 if (!dev) { in b43legacy_op_configure_filter()
2943 if (changed && b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) in b43legacy_op_configure_filter()
2944 b43legacy_adjust_opmode(dev); in b43legacy_op_configure_filter()
2949 static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev) in b43legacy_wireless_core_stop() argument
2951 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_stop()
2955 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) in b43legacy_wireless_core_stop()
2962 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0); in b43legacy_wireless_core_stop()
2963 b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_MASK); /* flush */ in b43legacy_wireless_core_stop()
2965 b43legacy_synchronize_irq(dev); in b43legacy_wireless_core_stop()
2967 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_stop()
2972 cancel_delayed_work_sync(&dev->periodic_work); in b43legacy_wireless_core_stop()
2982 b43legacy_mac_suspend(dev); in b43legacy_wireless_core_stop()
2983 free_irq(dev->dev->irq, dev); in b43legacy_wireless_core_stop()
2988 static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev) in b43legacy_wireless_core_start() argument
2992 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_start()
2994 drain_txstatus_queue(dev); in b43legacy_wireless_core_start()
2995 err = request_irq(dev->dev->irq, b43legacy_interrupt_handler, in b43legacy_wireless_core_start()
2996 IRQF_SHARED, KBUILD_MODNAME, dev); in b43legacy_wireless_core_start()
2998 b43legacyerr(dev->wl, "Cannot request IRQ-%d\n", in b43legacy_wireless_core_start()
2999 dev->dev->irq); in b43legacy_wireless_core_start()
3003 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_start()
3004 b43legacy_set_status(dev, B43legacy_STAT_STARTED); in b43legacy_wireless_core_start()
3007 b43legacy_mac_enable(dev); in b43legacy_wireless_core_start()
3008 b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, dev->irq_mask); in b43legacy_wireless_core_start()
3011 b43legacy_periodic_tasks_setup(dev); in b43legacy_wireless_core_start()
3013 b43legacydbg(dev->wl, "Wireless interface started\n"); in b43legacy_wireless_core_start()
3019 static int b43legacy_phy_versioning(struct b43legacy_wldev *dev) in b43legacy_phy_versioning() argument
3021 struct b43legacy_phy *phy = &dev->phy; in b43legacy_phy_versioning()
3032 tmp = b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); in b43legacy_phy_versioning()
3051 b43legacyerr(dev->wl, "FOUND UNSUPPORTED PHY " in b43legacy_phy_versioning()
3056 b43legacydbg(dev->wl, "Found PHY: Analog %u, Type %u, Revision %u\n", in b43legacy_phy_versioning()
3061 if (dev->dev->bus->chip_id == 0x4317) { in b43legacy_phy_versioning()
3062 if (dev->dev->bus->chip_rev == 0) in b43legacy_phy_versioning()
3064 else if (dev->dev->bus->chip_rev == 1) 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_HIGH); in b43legacy_phy_versioning()
3073 b43legacy_write16(dev, B43legacy_MMIO_RADIO_CONTROL, in b43legacy_phy_versioning()
3075 tmp |= b43legacy_read16(dev, B43legacy_MMIO_RADIO_DATA_LOW); in b43legacy_phy_versioning()
3093 b43legacyerr(dev->wl, "FOUND UNSUPPORTED RADIO " in b43legacy_phy_versioning()
3098 b43legacydbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X," in b43legacy_phy_versioning()
3113 static void setup_struct_phy_for_init(struct b43legacy_wldev *dev, in setup_struct_phy_for_init() argument
3124 dev->radio_hw_enable = true; in setup_struct_phy_for_init()
3139 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in setup_struct_phy_for_init()
3140 phy->rfatt = b43legacy_default_radio_attenuation(dev); in setup_struct_phy_for_init()
3141 phy->txctl1 = b43legacy_default_txctl1(dev); in setup_struct_phy_for_init()
3158 static void setup_struct_wldev_for_init(struct b43legacy_wldev *dev) in setup_struct_wldev_for_init() argument
3161 dev->dfq_valid = false; in setup_struct_wldev_for_init()
3164 memset(&dev->stats, 0, sizeof(dev->stats)); in setup_struct_wldev_for_init()
3166 setup_struct_phy_for_init(dev, &dev->phy); in setup_struct_wldev_for_init()
3169 dev->irq_reason = 0; in setup_struct_wldev_for_init()
3170 memset(dev->dma_reason, 0, sizeof(dev->dma_reason)); in setup_struct_wldev_for_init()
3171 dev->irq_mask = B43legacy_IRQ_MASKTEMPLATE; in setup_struct_wldev_for_init()
3173 dev->mac_suspended = 1; in setup_struct_wldev_for_init()
3176 memset(&dev->noisecalc, 0, sizeof(dev->noisecalc)); in setup_struct_wldev_for_init()
3179 static void b43legacy_set_synth_pu_delay(struct b43legacy_wldev *dev, in b43legacy_set_synth_pu_delay() argument
3183 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle) in b43legacy_set_synth_pu_delay()
3185 if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8)) in b43legacy_set_synth_pu_delay()
3188 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_synth_pu_delay()
3193 static void b43legacy_set_pretbtt(struct b43legacy_wldev *dev) in b43legacy_set_pretbtt() argument
3198 if (b43legacy_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) in b43legacy_set_pretbtt()
3202 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_set_pretbtt()
3204 b43legacy_write16(dev, B43legacy_MMIO_TSF_CFP_PRETBTT, pretbtt); in b43legacy_set_pretbtt()
3209 static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) in b43legacy_wireless_core_exit() argument
3211 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_exit()
3214 B43legacy_WARN_ON(b43legacy_status(dev) > B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_exit()
3215 if (b43legacy_status(dev) != B43legacy_STAT_INITIALIZED) in b43legacy_wireless_core_exit()
3217 b43legacy_set_status(dev, B43legacy_STAT_UNINIT); in b43legacy_wireless_core_exit()
3220 macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); in b43legacy_wireless_core_exit()
3223 b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); in b43legacy_wireless_core_exit()
3225 b43legacy_leds_exit(dev); in b43legacy_wireless_core_exit()
3226 b43legacy_rng_exit(dev->wl); in b43legacy_wireless_core_exit()
3227 b43legacy_pio_free(dev); in b43legacy_wireless_core_exit()
3228 b43legacy_dma_free(dev); in b43legacy_wireless_core_exit()
3229 b43legacy_chip_exit(dev); in b43legacy_wireless_core_exit()
3230 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_exit()
3231 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_exit()
3236 if (dev->wl->current_beacon) { in b43legacy_wireless_core_exit()
3237 dev_kfree_skb_any(dev->wl->current_beacon); in b43legacy_wireless_core_exit()
3238 dev->wl->current_beacon = NULL; in b43legacy_wireless_core_exit()
3241 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_exit()
3242 ssb_bus_may_powerdown(dev->dev->bus); in b43legacy_wireless_core_exit()
3245 static void prepare_phy_data_for_init(struct b43legacy_wldev *dev) in prepare_phy_data_for_init() argument
3247 struct b43legacy_phy *phy = &dev->phy; in prepare_phy_data_for_init()
3251 phy->bbatt = b43legacy_default_baseband_attenuation(dev); in prepare_phy_data_for_init()
3252 phy->rfatt = b43legacy_default_radio_attenuation(dev); in prepare_phy_data_for_init()
3253 phy->txctl1 = b43legacy_default_txctl1(dev); in prepare_phy_data_for_init()
3285 static int b43legacy_wireless_core_init(struct b43legacy_wldev *dev) in b43legacy_wireless_core_init() argument
3287 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_init()
3288 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_init()
3289 struct b43legacy_phy *phy = &dev->phy; in b43legacy_wireless_core_init()
3290 struct ssb_sprom *sprom = &dev->dev->bus->sprom; in b43legacy_wireless_core_init()
3295 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3300 if (!ssb_device_is_enabled(dev->dev)) { in b43legacy_wireless_core_init()
3302 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_init()
3313 setup_struct_wldev_for_init(dev); in b43legacy_wireless_core_init()
3315 err = b43legacy_phy_init_tssi2dbm_table(dev); in b43legacy_wireless_core_init()
3320 ssb_pcicore_dev_irqvecs_enable(&bus->pcicore, dev->dev); in b43legacy_wireless_core_init()
3322 prepare_phy_data_for_init(dev); in b43legacy_wireless_core_init()
3323 b43legacy_phy_calibrate(dev); in b43legacy_wireless_core_init()
3324 err = b43legacy_chip_init(dev); in b43legacy_wireless_core_init()
3327 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3329 dev->dev->id.revision); in b43legacy_wireless_core_init()
3330 hf = b43legacy_hf_read(dev); in b43legacy_wireless_core_init()
3342 b43legacy_hf_write(dev, hf); in b43legacy_wireless_core_init()
3344 b43legacy_set_retry_limits(dev, in b43legacy_wireless_core_init()
3348 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3350 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3357 b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, in b43legacy_wireless_core_init()
3360 b43legacy_rate_memory_init(dev); in b43legacy_wireless_core_init()
3364 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3367 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3370 b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, in b43legacy_wireless_core_init()
3374 if (b43legacy_using_pio(dev)) in b43legacy_wireless_core_init()
3375 err = b43legacy_pio_init(dev); in b43legacy_wireless_core_init()
3377 err = b43legacy_dma_init(dev); in b43legacy_wireless_core_init()
3379 b43legacy_qos_init(dev); in b43legacy_wireless_core_init()
3385 b43legacy_set_synth_pu_delay(dev, 1); in b43legacy_wireless_core_init()
3388 b43legacy_upload_card_macaddress(dev); in b43legacy_wireless_core_init()
3389 b43legacy_security_init(dev); in b43legacy_wireless_core_init()
3392 ieee80211_wake_queues(dev->wl->hw); in b43legacy_wireless_core_init()
3393 b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); in b43legacy_wireless_core_init()
3395 b43legacy_leds_init(dev); in b43legacy_wireless_core_init()
3400 b43legacy_chip_exit(dev); in b43legacy_wireless_core_init()
3408 B43legacy_WARN_ON(b43legacy_status(dev) != B43legacy_STAT_UNINIT); in b43legacy_wireless_core_init()
3416 struct b43legacy_wldev *dev; in b43legacy_op_add_interface() local
3434 dev = wl->current_dev; in b43legacy_op_add_interface()
3441 b43legacy_adjust_opmode(dev); in b43legacy_op_add_interface()
3442 b43legacy_set_pretbtt(dev); in b43legacy_op_add_interface()
3443 b43legacy_set_synth_pu_delay(dev, 0); in b43legacy_op_add_interface()
3444 b43legacy_upload_card_macaddress(dev); in b43legacy_op_add_interface()
3458 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_remove_interface() local
3472 b43legacy_adjust_opmode(dev); in b43legacy_op_remove_interface()
3474 b43legacy_upload_card_macaddress(dev); in b43legacy_op_remove_interface()
3483 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_start() local
3500 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) { in b43legacy_op_start()
3501 err = b43legacy_wireless_core_init(dev); in b43legacy_op_start()
3507 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) { in b43legacy_op_start()
3508 err = b43legacy_wireless_core_start(dev); in b43legacy_op_start()
3511 b43legacy_wireless_core_exit(dev); in b43legacy_op_start()
3527 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_stop() local
3532 if (b43legacy_status(dev) >= B43legacy_STAT_STARTED) in b43legacy_op_stop()
3533 b43legacy_wireless_core_stop(dev); in b43legacy_op_stop()
3534 b43legacy_wireless_core_exit(dev); in b43legacy_op_stop()
3556 struct b43legacy_wldev *dev = wl->current_dev; in b43legacy_op_get_survey() local
3564 survey->noise = dev->stats.link_noise; in b43legacy_op_get_survey()
3590 struct b43legacy_wldev *dev = in b43legacy_chip_reset() local
3592 struct b43legacy_wl *wl = dev->wl; in b43legacy_chip_reset()
3598 prev_status = b43legacy_status(dev); in b43legacy_chip_reset()
3601 b43legacy_wireless_core_stop(dev); in b43legacy_chip_reset()
3603 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3607 err = b43legacy_wireless_core_init(dev); in b43legacy_chip_reset()
3612 err = b43legacy_wireless_core_start(dev); in b43legacy_chip_reset()
3614 b43legacy_wireless_core_exit(dev); in b43legacy_chip_reset()
3628 static int b43legacy_setup_modes(struct b43legacy_wldev *dev, in b43legacy_setup_modes() argument
3632 struct ieee80211_hw *hw = dev->wl->hw; in b43legacy_setup_modes()
3633 struct b43legacy_phy *phy = &dev->phy; in b43legacy_setup_modes()
3651 static void b43legacy_wireless_core_detach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_detach() argument
3655 b43legacy_release_firmware(dev); in b43legacy_wireless_core_detach()
3658 static int b43legacy_wireless_core_attach(struct b43legacy_wldev *dev) in b43legacy_wireless_core_attach() argument
3660 struct b43legacy_wl *wl = dev->wl; in b43legacy_wireless_core_attach()
3661 struct ssb_bus *bus = dev->dev->bus; in b43legacy_wireless_core_attach()
3681 if (dev->dev->id.revision >= 5) { in b43legacy_wireless_core_attach()
3684 tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH); in b43legacy_wireless_core_attach()
3688 } else if (dev->dev->id.revision == 4) in b43legacy_wireless_core_attach()
3693 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3694 dev->phy.radio_on = true; in b43legacy_wireless_core_attach()
3695 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3696 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3698 err = b43legacy_phy_versioning(dev); in b43legacy_wireless_core_attach()
3709 switch (dev->phy.type) { in b43legacy_wireless_core_attach()
3720 dev->phy.gmode = (have_gphy || have_bphy); in b43legacy_wireless_core_attach()
3721 tmp = dev->phy.gmode ? B43legacy_TMSLOW_GMODE : 0; in b43legacy_wireless_core_attach()
3722 b43legacy_wireless_core_reset(dev, tmp); in b43legacy_wireless_core_attach()
3724 err = b43legacy_validate_chipaccess(dev); in b43legacy_wireless_core_attach()
3727 err = b43legacy_setup_modes(dev, have_bphy, have_gphy); in b43legacy_wireless_core_attach()
3733 wl->current_dev = dev; in b43legacy_wireless_core_attach()
3734 INIT_WORK(&dev->restart_work, b43legacy_chip_reset); in b43legacy_wireless_core_attach()
3736 b43legacy_radio_turn_off(dev, 1); in b43legacy_wireless_core_attach()
3737 b43legacy_switch_analog(dev, 0); in b43legacy_wireless_core_attach()
3738 ssb_device_disable(dev->dev, 0); in b43legacy_wireless_core_attach()
3749 static void b43legacy_one_core_detach(struct ssb_device *dev) in b43legacy_one_core_detach() argument
3757 wldev = ssb_get_drvdata(dev); in b43legacy_one_core_detach()
3763 ssb_set_drvdata(dev, NULL); in b43legacy_one_core_detach()
3767 static int b43legacy_one_core_attach(struct ssb_device *dev, in b43legacy_one_core_attach() argument
3777 wldev->dev = dev; in b43legacy_one_core_attach()
3794 ssb_set_drvdata(dev, wldev); in b43legacy_one_core_attach()
3813 static void b43legacy_wireless_exit(struct ssb_device *dev, in b43legacy_wireless_exit() argument
3818 ssb_set_devtypedata(dev, NULL); in b43legacy_wireless_exit()
3822 static int b43legacy_wireless_init(struct ssb_device *dev) in b43legacy_wireless_init() argument
3824 struct ssb_sprom *sprom = &dev->bus->sprom; in b43legacy_wireless_init()
3830 b43legacy_sprom_fixup(dev->bus); in b43legacy_wireless_init()
3848 SET_IEEE80211_DEV(hw, dev->dev); in b43legacy_wireless_init()
3871 ssb_set_devtypedata(dev, wl); in b43legacy_wireless_init()
3873 dev->bus->chip_id, dev->id.revision); in b43legacy_wireless_init()
3879 static int b43legacy_probe(struct ssb_device *dev, in b43legacy_probe() argument
3886 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3890 err = b43legacy_wireless_init(dev); in b43legacy_probe()
3893 wl = ssb_get_devtypedata(dev); in b43legacy_probe()
3896 err = b43legacy_one_core_attach(dev, wl); in b43legacy_probe()
3909 b43legacy_wireless_exit(dev, wl); in b43legacy_probe()
3913 static void b43legacy_remove(struct ssb_device *dev) in b43legacy_remove() argument
3915 struct b43legacy_wl *wl = ssb_get_devtypedata(dev); in b43legacy_remove()
3916 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_remove()
3930 b43legacy_one_core_detach(dev); in b43legacy_remove()
3936 b43legacy_wireless_exit(dev, wl); in b43legacy_remove()
3940 void b43legacy_controller_restart(struct b43legacy_wldev *dev, in b43legacy_controller_restart() argument
3944 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) in b43legacy_controller_restart()
3946 b43legacyinfo(dev->wl, "Controller RESET (%s) ...\n", reason); in b43legacy_controller_restart()
3947 ieee80211_queue_work(dev->wl->hw, &dev->restart_work); in b43legacy_controller_restart()
3952 static int b43legacy_suspend(struct ssb_device *dev, pm_message_t state) in b43legacy_suspend() argument
3954 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_suspend()
3972 static int b43legacy_resume(struct ssb_device *dev) in b43legacy_resume() argument
3974 struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); in b43legacy_resume()