3 Broadcom B43 wireless driver
5 Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
6 Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
7 Copyright (c) 2005-2009 Michael Buesch <mb@bu3sch.de>
8 Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
9 Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
12 Copyright (c) 2009 Albert Herranz <albert_herranz@yahoo.es>
14 Some parts of the code in this file are derived from the ipw2200
15 driver Copyright(c) 2003 - 2004 Intel Corporation.
17 This program is free software; you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by
19 the Free Software Foundation; either version 2 of the License, or
20 (at your option) any later version.
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with this program; see the file COPYING. If not, write to
29 the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
30 Boston, MA 02110-1301, USA.
34 #include <linux/delay.h>
35 #include <linux/init.h>
36 #include <linux/moduleparam.h>
37 #include <linux/if_arp.h>
38 #include <linux/etherdevice.h>
39 #include <linux/firmware.h>
40 #include <linux/wireless.h>
41 #include <linux/workqueue.h>
42 #include <linux/skbuff.h>
44 #include <linux/dma-mapping.h>
45 #include <asm/unaligned.h>
50 #include "phy_common.h"
60 #include <linux/mmc/sdio_func.h>
62 MODULE_DESCRIPTION("Broadcom B43 wireless driver");
63 MODULE_AUTHOR("Martin Langer");
64 MODULE_AUTHOR("Stefano Brivio");
65 MODULE_AUTHOR("Michael Buesch");
66 MODULE_AUTHOR("Gábor Stefanik");
67 MODULE_LICENSE("GPL");
69 MODULE_FIRMWARE(B43_SUPPORTED_FIRMWARE_ID);
70 MODULE_FIRMWARE("b43/ucode11.fw");
71 MODULE_FIRMWARE("b43/ucode13.fw");
72 MODULE_FIRMWARE("b43/ucode14.fw");
73 MODULE_FIRMWARE("b43/ucode15.fw");
74 MODULE_FIRMWARE("b43/ucode5.fw");
75 MODULE_FIRMWARE("b43/ucode9.fw");
77 static int modparam_bad_frames_preempt;
78 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
79 MODULE_PARM_DESC(bad_frames_preempt,
80 "enable(1) / disable(0) Bad Frames Preemption");
82 static char modparam_fwpostfix[16];
83 module_param_string(fwpostfix, modparam_fwpostfix, 16, 0444);
84 MODULE_PARM_DESC(fwpostfix, "Postfix for the .fw files to load.");
86 static int modparam_hwpctl;
87 module_param_named(hwpctl, modparam_hwpctl, int, 0444);
88 MODULE_PARM_DESC(hwpctl, "Enable hardware-side power control (default off)");
90 static int modparam_nohwcrypt;
91 module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
92 MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
94 static int modparam_hwtkip;
95 module_param_named(hwtkip, modparam_hwtkip, int, 0444);
96 MODULE_PARM_DESC(hwtkip, "Enable hardware tkip.");
98 static int modparam_qos = 1;
99 module_param_named(qos, modparam_qos, int, 0444);
100 MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
102 static int modparam_btcoex = 1;
103 module_param_named(btcoex, modparam_btcoex, int, 0444);
104 MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistence (default on)");
106 int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
107 module_param_named(verbose, b43_modparam_verbose, int, 0644);
108 MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
110 static int modparam_pio;
111 module_param_named(pio, modparam_pio, int, 0444);
112 MODULE_PARM_DESC(pio, "enable(1) / disable(0) PIO mode");
114 static const struct ssb_device_id b43_ssb_tbl[] = {
115 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
116 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 6),
117 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 7),
118 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 9),
119 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 10),
120 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 11),
121 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 13),
122 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 15),
123 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 16),
127 MODULE_DEVICE_TABLE(ssb, b43_ssb_tbl);
129 /* Channel and ratetables are shared for all devices.
130 * They can't be const, because ieee80211 puts some precalculated
131 * data in there. This data is the same for all devices, so we don't
132 * get concurrency issues */
133 #define RATETAB_ENT(_rateid, _flags) \
135 .bitrate = B43_RATE_TO_BASE100KBPS(_rateid), \
136 .hw_value = (_rateid), \
141 * NOTE: When changing this, sync with xmit.c's
142 * b43_plcp_get_bitrate_idx_* functions!
144 static struct ieee80211_rate __b43_ratetable[] = {
145 RATETAB_ENT(B43_CCK_RATE_1MB, 0),
146 RATETAB_ENT(B43_CCK_RATE_2MB, IEEE80211_RATE_SHORT_PREAMBLE),
147 RATETAB_ENT(B43_CCK_RATE_5MB, IEEE80211_RATE_SHORT_PREAMBLE),
148 RATETAB_ENT(B43_CCK_RATE_11MB, IEEE80211_RATE_SHORT_PREAMBLE),
149 RATETAB_ENT(B43_OFDM_RATE_6MB, 0),
150 RATETAB_ENT(B43_OFDM_RATE_9MB, 0),
151 RATETAB_ENT(B43_OFDM_RATE_12MB, 0),
152 RATETAB_ENT(B43_OFDM_RATE_18MB, 0),
153 RATETAB_ENT(B43_OFDM_RATE_24MB, 0),
154 RATETAB_ENT(B43_OFDM_RATE_36MB, 0),
155 RATETAB_ENT(B43_OFDM_RATE_48MB, 0),
156 RATETAB_ENT(B43_OFDM_RATE_54MB, 0),
159 #define b43_a_ratetable (__b43_ratetable + 4)
160 #define b43_a_ratetable_size 8
161 #define b43_b_ratetable (__b43_ratetable + 0)
162 #define b43_b_ratetable_size 4
163 #define b43_g_ratetable (__b43_ratetable + 0)
164 #define b43_g_ratetable_size 12
166 #define CHAN4G(_channel, _freq, _flags) { \
167 .band = IEEE80211_BAND_2GHZ, \
168 .center_freq = (_freq), \
169 .hw_value = (_channel), \
171 .max_antenna_gain = 0, \
174 static struct ieee80211_channel b43_2ghz_chantable[] = {
192 #define CHAN5G(_channel, _flags) { \
193 .band = IEEE80211_BAND_5GHZ, \
194 .center_freq = 5000 + (5 * (_channel)), \
195 .hw_value = (_channel), \
197 .max_antenna_gain = 0, \
200 static struct ieee80211_channel b43_5ghz_nphy_chantable[] = {
201 CHAN5G(32, 0), CHAN5G(34, 0),
202 CHAN5G(36, 0), CHAN5G(38, 0),
203 CHAN5G(40, 0), CHAN5G(42, 0),
204 CHAN5G(44, 0), CHAN5G(46, 0),
205 CHAN5G(48, 0), CHAN5G(50, 0),
206 CHAN5G(52, 0), CHAN5G(54, 0),
207 CHAN5G(56, 0), CHAN5G(58, 0),
208 CHAN5G(60, 0), CHAN5G(62, 0),
209 CHAN5G(64, 0), CHAN5G(66, 0),
210 CHAN5G(68, 0), CHAN5G(70, 0),
211 CHAN5G(72, 0), CHAN5G(74, 0),
212 CHAN5G(76, 0), CHAN5G(78, 0),
213 CHAN5G(80, 0), CHAN5G(82, 0),
214 CHAN5G(84, 0), CHAN5G(86, 0),
215 CHAN5G(88, 0), CHAN5G(90, 0),
216 CHAN5G(92, 0), CHAN5G(94, 0),
217 CHAN5G(96, 0), CHAN5G(98, 0),
218 CHAN5G(100, 0), CHAN5G(102, 0),
219 CHAN5G(104, 0), CHAN5G(106, 0),
220 CHAN5G(108, 0), CHAN5G(110, 0),
221 CHAN5G(112, 0), CHAN5G(114, 0),
222 CHAN5G(116, 0), CHAN5G(118, 0),
223 CHAN5G(120, 0), CHAN5G(122, 0),
224 CHAN5G(124, 0), CHAN5G(126, 0),
225 CHAN5G(128, 0), CHAN5G(130, 0),
226 CHAN5G(132, 0), CHAN5G(134, 0),
227 CHAN5G(136, 0), CHAN5G(138, 0),
228 CHAN5G(140, 0), CHAN5G(142, 0),
229 CHAN5G(144, 0), CHAN5G(145, 0),
230 CHAN5G(146, 0), CHAN5G(147, 0),
231 CHAN5G(148, 0), CHAN5G(149, 0),
232 CHAN5G(150, 0), CHAN5G(151, 0),
233 CHAN5G(152, 0), CHAN5G(153, 0),
234 CHAN5G(154, 0), CHAN5G(155, 0),
235 CHAN5G(156, 0), CHAN5G(157, 0),
236 CHAN5G(158, 0), CHAN5G(159, 0),
237 CHAN5G(160, 0), CHAN5G(161, 0),
238 CHAN5G(162, 0), CHAN5G(163, 0),
239 CHAN5G(164, 0), CHAN5G(165, 0),
240 CHAN5G(166, 0), CHAN5G(168, 0),
241 CHAN5G(170, 0), CHAN5G(172, 0),
242 CHAN5G(174, 0), CHAN5G(176, 0),
243 CHAN5G(178, 0), CHAN5G(180, 0),
244 CHAN5G(182, 0), CHAN5G(184, 0),
245 CHAN5G(186, 0), CHAN5G(188, 0),
246 CHAN5G(190, 0), CHAN5G(192, 0),
247 CHAN5G(194, 0), CHAN5G(196, 0),
248 CHAN5G(198, 0), CHAN5G(200, 0),
249 CHAN5G(202, 0), CHAN5G(204, 0),
250 CHAN5G(206, 0), CHAN5G(208, 0),
251 CHAN5G(210, 0), CHAN5G(212, 0),
252 CHAN5G(214, 0), CHAN5G(216, 0),
253 CHAN5G(218, 0), CHAN5G(220, 0),
254 CHAN5G(222, 0), CHAN5G(224, 0),
255 CHAN5G(226, 0), CHAN5G(228, 0),
258 static struct ieee80211_channel b43_5ghz_aphy_chantable[] = {
259 CHAN5G(34, 0), CHAN5G(36, 0),
260 CHAN5G(38, 0), CHAN5G(40, 0),
261 CHAN5G(42, 0), CHAN5G(44, 0),
262 CHAN5G(46, 0), CHAN5G(48, 0),
263 CHAN5G(52, 0), CHAN5G(56, 0),
264 CHAN5G(60, 0), CHAN5G(64, 0),
265 CHAN5G(100, 0), CHAN5G(104, 0),
266 CHAN5G(108, 0), CHAN5G(112, 0),
267 CHAN5G(116, 0), CHAN5G(120, 0),
268 CHAN5G(124, 0), CHAN5G(128, 0),
269 CHAN5G(132, 0), CHAN5G(136, 0),
270 CHAN5G(140, 0), CHAN5G(149, 0),
271 CHAN5G(153, 0), CHAN5G(157, 0),
272 CHAN5G(161, 0), CHAN5G(165, 0),
273 CHAN5G(184, 0), CHAN5G(188, 0),
274 CHAN5G(192, 0), CHAN5G(196, 0),
275 CHAN5G(200, 0), CHAN5G(204, 0),
276 CHAN5G(208, 0), CHAN5G(212, 0),
281 static struct ieee80211_supported_band b43_band_5GHz_nphy = {
282 .band = IEEE80211_BAND_5GHZ,
283 .channels = b43_5ghz_nphy_chantable,
284 .n_channels = ARRAY_SIZE(b43_5ghz_nphy_chantable),
285 .bitrates = b43_a_ratetable,
286 .n_bitrates = b43_a_ratetable_size,
289 static struct ieee80211_supported_band b43_band_5GHz_aphy = {
290 .band = IEEE80211_BAND_5GHZ,
291 .channels = b43_5ghz_aphy_chantable,
292 .n_channels = ARRAY_SIZE(b43_5ghz_aphy_chantable),
293 .bitrates = b43_a_ratetable,
294 .n_bitrates = b43_a_ratetable_size,
297 static struct ieee80211_supported_band b43_band_2GHz = {
298 .band = IEEE80211_BAND_2GHZ,
299 .channels = b43_2ghz_chantable,
300 .n_channels = ARRAY_SIZE(b43_2ghz_chantable),
301 .bitrates = b43_g_ratetable,
302 .n_bitrates = b43_g_ratetable_size,
305 static void b43_wireless_core_exit(struct b43_wldev *dev);
306 static int b43_wireless_core_init(struct b43_wldev *dev);
307 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
308 static int b43_wireless_core_start(struct b43_wldev *dev);
310 static int b43_ratelimit(struct b43_wl *wl)
312 if (!wl || !wl->current_dev)
314 if (b43_status(wl->current_dev) < B43_STAT_STARTED)
316 /* We are up and running.
317 * Ratelimit the messages to avoid DoS over the net. */
318 return net_ratelimit();
321 void b43info(struct b43_wl *wl, const char *fmt, ...)
325 if (b43_modparam_verbose < B43_VERBOSITY_INFO)
327 if (!b43_ratelimit(wl))
330 printk(KERN_INFO "b43-%s: ",
331 (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
336 void b43err(struct b43_wl *wl, const char *fmt, ...)
340 if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
342 if (!b43_ratelimit(wl))
345 printk(KERN_ERR "b43-%s ERROR: ",
346 (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
351 void b43warn(struct b43_wl *wl, const char *fmt, ...)
355 if (b43_modparam_verbose < B43_VERBOSITY_WARN)
357 if (!b43_ratelimit(wl))
360 printk(KERN_WARNING "b43-%s warning: ",
361 (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
366 void b43dbg(struct b43_wl *wl, const char *fmt, ...)
370 if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
373 printk(KERN_DEBUG "b43-%s debug: ",
374 (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
379 static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val)
383 B43_WARN_ON(offset % 4 != 0);
385 macctl = b43_read32(dev, B43_MMIO_MACCTL);
386 if (macctl & B43_MACCTL_BE)
389 b43_write32(dev, B43_MMIO_RAM_CONTROL, offset);
391 b43_write32(dev, B43_MMIO_RAM_DATA, val);
394 static inline void b43_shm_control_word(struct b43_wldev *dev,
395 u16 routing, u16 offset)
399 /* "offset" is the WORD offset. */
403 b43_write32(dev, B43_MMIO_SHM_CONTROL, control);
406 u32 b43_shm_read32(struct b43_wldev *dev, u16 routing, u16 offset)
410 if (routing == B43_SHM_SHARED) {
411 B43_WARN_ON(offset & 0x0001);
412 if (offset & 0x0003) {
413 /* Unaligned access */
414 b43_shm_control_word(dev, routing, offset >> 2);
415 ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
416 b43_shm_control_word(dev, routing, (offset >> 2) + 1);
417 ret |= ((u32)b43_read16(dev, B43_MMIO_SHM_DATA)) << 16;
423 b43_shm_control_word(dev, routing, offset);
424 ret = b43_read32(dev, B43_MMIO_SHM_DATA);
429 u16 b43_shm_read16(struct b43_wldev *dev, u16 routing, u16 offset)
433 if (routing == B43_SHM_SHARED) {
434 B43_WARN_ON(offset & 0x0001);
435 if (offset & 0x0003) {
436 /* Unaligned access */
437 b43_shm_control_word(dev, routing, offset >> 2);
438 ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
444 b43_shm_control_word(dev, routing, offset);
445 ret = b43_read16(dev, B43_MMIO_SHM_DATA);
450 void b43_shm_write32(struct b43_wldev *dev, u16 routing, u16 offset, u32 value)
452 if (routing == B43_SHM_SHARED) {
453 B43_WARN_ON(offset & 0x0001);
454 if (offset & 0x0003) {
455 /* Unaligned access */
456 b43_shm_control_word(dev, routing, offset >> 2);
457 b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED,
459 b43_shm_control_word(dev, routing, (offset >> 2) + 1);
460 b43_write16(dev, B43_MMIO_SHM_DATA,
461 (value >> 16) & 0xFFFF);
466 b43_shm_control_word(dev, routing, offset);
467 b43_write32(dev, B43_MMIO_SHM_DATA, value);
470 void b43_shm_write16(struct b43_wldev *dev, u16 routing, u16 offset, u16 value)
472 if (routing == B43_SHM_SHARED) {
473 B43_WARN_ON(offset & 0x0001);
474 if (offset & 0x0003) {
475 /* Unaligned access */
476 b43_shm_control_word(dev, routing, offset >> 2);
477 b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED, value);
482 b43_shm_control_word(dev, routing, offset);
483 b43_write16(dev, B43_MMIO_SHM_DATA, value);
487 u64 b43_hf_read(struct b43_wldev *dev)
491 ret = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI);
493 ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFMI);
495 ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFLO);
500 /* Write HostFlags */
501 void b43_hf_write(struct b43_wldev *dev, u64 value)
505 lo = (value & 0x00000000FFFFULL);
506 mi = (value & 0x0000FFFF0000ULL) >> 16;
507 hi = (value & 0xFFFF00000000ULL) >> 32;
508 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFLO, lo);
509 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFMI, mi);
510 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI, hi);
513 /* Read the firmware capabilities bitmask (Opensource firmware only) */
514 static u16 b43_fwcapa_read(struct b43_wldev *dev)
516 B43_WARN_ON(!dev->fw.opensource);
517 return b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_FWCAPA);
520 void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
524 B43_WARN_ON(dev->dev->id.revision < 3);
526 /* The hardware guarantees us an atomic read, if we
527 * read the low register first. */
528 low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW);
529 high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
536 static void b43_time_lock(struct b43_wldev *dev)
540 macctl = b43_read32(dev, B43_MMIO_MACCTL);
541 macctl |= B43_MACCTL_TBTTHOLD;
542 b43_write32(dev, B43_MMIO_MACCTL, macctl);
543 /* Commit the write */
544 b43_read32(dev, B43_MMIO_MACCTL);
547 static void b43_time_unlock(struct b43_wldev *dev)
551 macctl = b43_read32(dev, B43_MMIO_MACCTL);
552 macctl &= ~B43_MACCTL_TBTTHOLD;
553 b43_write32(dev, B43_MMIO_MACCTL, macctl);
554 /* Commit the write */
555 b43_read32(dev, B43_MMIO_MACCTL);
558 static void b43_tsf_write_locked(struct b43_wldev *dev, u64 tsf)
562 B43_WARN_ON(dev->dev->id.revision < 3);
566 /* The hardware guarantees us an atomic write, if we
567 * write the low register first. */
568 b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, low);
570 b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, high);
574 void b43_tsf_write(struct b43_wldev *dev, u64 tsf)
577 b43_tsf_write_locked(dev, tsf);
578 b43_time_unlock(dev);
582 void b43_macfilter_set(struct b43_wldev *dev, u16 offset, const u8 *mac)
584 static const u8 zero_addr[ETH_ALEN] = { 0 };
591 b43_write16(dev, B43_MMIO_MACFILTER_CONTROL, offset);
595 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
598 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
601 b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
604 static void b43_write_mac_bssid_templates(struct b43_wldev *dev)
608 u8 mac_bssid[ETH_ALEN * 2];
612 bssid = dev->wl->bssid;
613 mac = dev->wl->mac_addr;
615 b43_macfilter_set(dev, B43_MACFILTER_BSSID, bssid);
617 memcpy(mac_bssid, mac, ETH_ALEN);
618 memcpy(mac_bssid + ETH_ALEN, bssid, ETH_ALEN);
620 /* Write our MAC address and BSSID to template ram */
621 for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32)) {
622 tmp = (u32) (mac_bssid[i + 0]);
623 tmp |= (u32) (mac_bssid[i + 1]) << 8;
624 tmp |= (u32) (mac_bssid[i + 2]) << 16;
625 tmp |= (u32) (mac_bssid[i + 3]) << 24;
626 b43_ram_write(dev, 0x20 + i, tmp);
630 static void b43_upload_card_macaddress(struct b43_wldev *dev)
632 b43_write_mac_bssid_templates(dev);
633 b43_macfilter_set(dev, B43_MACFILTER_SELF, dev->wl->mac_addr);
636 static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time)
638 /* slot_time is in usec. */
639 if (dev->phy.type != B43_PHYTYPE_G)
641 b43_write16(dev, 0x684, 510 + slot_time);
642 b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
645 static void b43_short_slot_timing_enable(struct b43_wldev *dev)
647 b43_set_slot_time(dev, 9);
650 static void b43_short_slot_timing_disable(struct b43_wldev *dev)
652 b43_set_slot_time(dev, 20);
655 /* DummyTransmission function, as documented on
656 * http://bcm-v4.sipsolutions.net/802.11/DummyTransmission
658 void b43_dummy_transmission(struct b43_wldev *dev, bool ofdm, bool pa_on)
660 struct b43_phy *phy = &dev->phy;
661 unsigned int i, max_loop;
673 buffer[0] = 0x000201CC;
676 buffer[0] = 0x000B846E;
679 for (i = 0; i < 5; i++)
680 b43_ram_write(dev, i * 4, buffer[i]);
682 b43_write16(dev, 0x0568, 0x0000);
683 if (dev->dev->id.revision < 11)
684 b43_write16(dev, 0x07C0, 0x0000);
686 b43_write16(dev, 0x07C0, 0x0100);
687 value = (ofdm ? 0x41 : 0x40);
688 b43_write16(dev, 0x050C, value);
689 if ((phy->type == B43_PHYTYPE_N) || (phy->type == B43_PHYTYPE_LP))
690 b43_write16(dev, 0x0514, 0x1A02);
691 b43_write16(dev, 0x0508, 0x0000);
692 b43_write16(dev, 0x050A, 0x0000);
693 b43_write16(dev, 0x054C, 0x0000);
694 b43_write16(dev, 0x056A, 0x0014);
695 b43_write16(dev, 0x0568, 0x0826);
696 b43_write16(dev, 0x0500, 0x0000);
697 if (!pa_on && (phy->type == B43_PHYTYPE_N)) {
703 b43_write16(dev, 0x0502, 0x00D0);
706 b43_write16(dev, 0x0502, 0x0050);
709 b43_write16(dev, 0x0502, 0x0030);
712 if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
713 b43_radio_write16(dev, 0x0051, 0x0017);
714 for (i = 0x00; i < max_loop; i++) {
715 value = b43_read16(dev, 0x050E);
720 for (i = 0x00; i < 0x0A; i++) {
721 value = b43_read16(dev, 0x050E);
726 for (i = 0x00; i < 0x19; i++) {
727 value = b43_read16(dev, 0x0690);
728 if (!(value & 0x0100))
732 if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
733 b43_radio_write16(dev, 0x0051, 0x0037);
736 static void key_write(struct b43_wldev *dev,
737 u8 index, u8 algorithm, const u8 *key)
744 /* Key index/algo block */
745 kidx = b43_kidx_to_fw(dev, index);
746 value = ((kidx << 4) | algorithm);
747 b43_shm_write16(dev, B43_SHM_SHARED,
748 B43_SHM_SH_KEYIDXBLOCK + (kidx * 2), value);
750 /* Write the key to the Key Table Pointer offset */
751 offset = dev->ktp + (index * B43_SEC_KEYSIZE);
752 for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
754 value |= (u16) (key[i + 1]) << 8;
755 b43_shm_write16(dev, B43_SHM_SHARED, offset + i, value);
759 static void keymac_write(struct b43_wldev *dev, u8 index, const u8 *addr)
761 u32 addrtmp[2] = { 0, 0, };
762 u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
764 if (b43_new_kidx_api(dev))
765 pairwise_keys_start = B43_NR_GROUP_KEYS;
767 B43_WARN_ON(index < pairwise_keys_start);
768 /* We have four default TX keys and possibly four default RX keys.
769 * Physical mac 0 is mapped to physical key 4 or 8, depending
770 * on the firmware version.
771 * So we must adjust the index here.
773 index -= pairwise_keys_start;
774 B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
777 addrtmp[0] = addr[0];
778 addrtmp[0] |= ((u32) (addr[1]) << 8);
779 addrtmp[0] |= ((u32) (addr[2]) << 16);
780 addrtmp[0] |= ((u32) (addr[3]) << 24);
781 addrtmp[1] = addr[4];
782 addrtmp[1] |= ((u32) (addr[5]) << 8);
785 /* Receive match transmitter address (RCMTA) mechanism */
786 b43_shm_write32(dev, B43_SHM_RCMTA,
787 (index * 2) + 0, addrtmp[0]);
788 b43_shm_write16(dev, B43_SHM_RCMTA,
789 (index * 2) + 1, addrtmp[1]);
792 /* The ucode will use phase1 key with TEK key to decrypt rx packets.
793 * When a packet is received, the iv32 is checked.
794 * - if it doesn't the packet is returned without modification (and software
795 * decryption can be done). That's what happen when iv16 wrap.
796 * - if it does, the rc4 key is computed, and decryption is tried.
797 * Either it will success and B43_RX_MAC_DEC is returned,
798 * either it fails and B43_RX_MAC_DEC|B43_RX_MAC_DECERR is returned
799 * and the packet is not usable (it got modified by the ucode).
800 * So in order to never have B43_RX_MAC_DECERR, we should provide
801 * a iv32 and phase1key that match. Because we drop packets in case of
802 * B43_RX_MAC_DECERR, if we have a correct iv32 but a wrong phase1key, all
803 * packets will be lost without higher layer knowing (ie no resync possible
806 * NOTE : this should support 50 key like RCMTA because
807 * (B43_SHM_SH_KEYIDXBLOCK - B43_SHM_SH_TKIPTSCTTAK)/14 = 50
809 static void rx_tkip_phase1_write(struct b43_wldev *dev, u8 index, u32 iv32,
814 u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
816 if (!modparam_hwtkip)
819 if (b43_new_kidx_api(dev))
820 pairwise_keys_start = B43_NR_GROUP_KEYS;
822 B43_WARN_ON(index < pairwise_keys_start);
823 /* We have four default TX keys and possibly four default RX keys.
824 * Physical mac 0 is mapped to physical key 4 or 8, depending
825 * on the firmware version.
826 * So we must adjust the index here.
828 index -= pairwise_keys_start;
829 B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
831 if (b43_debug(dev, B43_DBG_KEYS)) {
832 b43dbg(dev->wl, "rx_tkip_phase1_write : idx 0x%x, iv32 0x%x\n",
835 /* Write the key to the RX tkip shared mem */
836 offset = B43_SHM_SH_TKIPTSCTTAK + index * (10 + 4);
837 for (i = 0; i < 10; i += 2) {
838 b43_shm_write16(dev, B43_SHM_SHARED, offset + i,
839 phase1key ? phase1key[i / 2] : 0);
841 b43_shm_write16(dev, B43_SHM_SHARED, offset + i, iv32);
842 b43_shm_write16(dev, B43_SHM_SHARED, offset + i + 2, iv32 >> 16);
845 static void b43_op_update_tkip_key(struct ieee80211_hw *hw,
846 struct ieee80211_key_conf *keyconf, const u8 *addr,
847 u32 iv32, u16 *phase1key)
849 struct b43_wl *wl = hw_to_b43_wl(hw);
850 struct b43_wldev *dev;
851 int index = keyconf->hw_key_idx;
853 if (B43_WARN_ON(!modparam_hwtkip))
856 mutex_lock(&wl->mutex);
858 dev = wl->current_dev;
859 if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
862 keymac_write(dev, index, NULL); /* First zero out mac to avoid race */
864 rx_tkip_phase1_write(dev, index, iv32, phase1key);
865 keymac_write(dev, index, addr);
868 mutex_unlock(&wl->mutex);
871 static void do_key_write(struct b43_wldev *dev,
872 u8 index, u8 algorithm,
873 const u8 *key, size_t key_len, const u8 *mac_addr)
875 u8 buf[B43_SEC_KEYSIZE] = { 0, };
876 u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
878 if (b43_new_kidx_api(dev))
879 pairwise_keys_start = B43_NR_GROUP_KEYS;
881 B43_WARN_ON(index >= ARRAY_SIZE(dev->key));
882 B43_WARN_ON(key_len > B43_SEC_KEYSIZE);
884 if (index >= pairwise_keys_start)
885 keymac_write(dev, index, NULL); /* First zero out mac. */
886 if (algorithm == B43_SEC_ALGO_TKIP) {
888 * We should provide an initial iv32, phase1key pair.
889 * We could start with iv32=0 and compute the corresponding
890 * phase1key, but this means calling ieee80211_get_tkip_key
891 * with a fake skb (or export other tkip function).
892 * Because we are lazy we hope iv32 won't start with
893 * 0xffffffff and let's b43_op_update_tkip_key provide a
896 rx_tkip_phase1_write(dev, index, 0xffffffff, (u16*)buf);
897 } else if (index >= pairwise_keys_start) /* clear it */
898 rx_tkip_phase1_write(dev, index, 0, NULL);
900 memcpy(buf, key, key_len);
901 key_write(dev, index, algorithm, buf);
902 if (index >= pairwise_keys_start)
903 keymac_write(dev, index, mac_addr);
905 dev->key[index].algorithm = algorithm;
908 static int b43_key_write(struct b43_wldev *dev,
909 int index, u8 algorithm,
910 const u8 *key, size_t key_len,
912 struct ieee80211_key_conf *keyconf)
915 int pairwise_keys_start;
917 /* For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block:
918 * - Temporal Encryption Key (128 bits)
919 * - Temporal Authenticator Tx MIC Key (64 bits)
920 * - Temporal Authenticator Rx MIC Key (64 bits)
922 * Hardware only store TEK
924 if (algorithm == B43_SEC_ALGO_TKIP && key_len == 32)
926 if (key_len > B43_SEC_KEYSIZE)
928 for (i = 0; i < ARRAY_SIZE(dev->key); i++) {
929 /* Check that we don't already have this key. */
930 B43_WARN_ON(dev->key[i].keyconf == keyconf);
933 /* Pairwise key. Get an empty slot for the key. */
934 if (b43_new_kidx_api(dev))
935 pairwise_keys_start = B43_NR_GROUP_KEYS;
937 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
938 for (i = pairwise_keys_start;
939 i < pairwise_keys_start + B43_NR_PAIRWISE_KEYS;
941 B43_WARN_ON(i >= ARRAY_SIZE(dev->key));
942 if (!dev->key[i].keyconf) {
949 b43warn(dev->wl, "Out of hardware key memory\n");
953 B43_WARN_ON(index > 3);
955 do_key_write(dev, index, algorithm, key, key_len, mac_addr);
956 if ((index <= 3) && !b43_new_kidx_api(dev)) {
958 B43_WARN_ON(mac_addr);
959 do_key_write(dev, index + 4, algorithm, key, key_len, NULL);
961 keyconf->hw_key_idx = index;
962 dev->key[index].keyconf = keyconf;
967 static int b43_key_clear(struct b43_wldev *dev, int index)
969 if (B43_WARN_ON((index < 0) || (index >= ARRAY_SIZE(dev->key))))
971 do_key_write(dev, index, B43_SEC_ALGO_NONE,
972 NULL, B43_SEC_KEYSIZE, NULL);
973 if ((index <= 3) && !b43_new_kidx_api(dev)) {
974 do_key_write(dev, index + 4, B43_SEC_ALGO_NONE,
975 NULL, B43_SEC_KEYSIZE, NULL);
977 dev->key[index].keyconf = NULL;
982 static void b43_clear_keys(struct b43_wldev *dev)
986 if (b43_new_kidx_api(dev))
987 count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
989 count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
990 for (i = 0; i < count; i++)
991 b43_key_clear(dev, i);
994 static void b43_dump_keymemory(struct b43_wldev *dev)
996 unsigned int i, index, count, offset, pairwise_keys_start;
1002 struct b43_key *key;
1004 if (!b43_debug(dev, B43_DBG_KEYS))
1007 hf = b43_hf_read(dev);
1008 b43dbg(dev->wl, "Hardware key memory dump: USEDEFKEYS=%u\n",
1009 !!(hf & B43_HF_USEDEFKEYS));
1010 if (b43_new_kidx_api(dev)) {
1011 pairwise_keys_start = B43_NR_GROUP_KEYS;
1012 count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
1014 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
1015 count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
1017 for (index = 0; index < count; index++) {
1018 key = &(dev->key[index]);
1019 printk(KERN_DEBUG "Key slot %02u: %s",
1020 index, (key->keyconf == NULL) ? " " : "*");
1021 offset = dev->ktp + (index * B43_SEC_KEYSIZE);
1022 for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
1023 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1024 printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1027 algo = b43_shm_read16(dev, B43_SHM_SHARED,
1028 B43_SHM_SH_KEYIDXBLOCK + (index * 2));
1029 printk(" Algo: %04X/%02X", algo, key->algorithm);
1031 if (index >= pairwise_keys_start) {
1032 if (key->algorithm == B43_SEC_ALGO_TKIP) {
1034 offset = B43_SHM_SH_TKIPTSCTTAK + (index - 4) * (10 + 4);
1035 for (i = 0; i < 14; i += 2) {
1036 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1037 printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1040 rcmta0 = b43_shm_read32(dev, B43_SHM_RCMTA,
1041 ((index - pairwise_keys_start) * 2) + 0);
1042 rcmta1 = b43_shm_read16(dev, B43_SHM_RCMTA,
1043 ((index - pairwise_keys_start) * 2) + 1);
1044 *((__le32 *)(&mac[0])) = cpu_to_le32(rcmta0);
1045 *((__le16 *)(&mac[4])) = cpu_to_le16(rcmta1);
1046 printk(" MAC: %pM", mac);
1048 printk(" DEFAULT KEY");
1053 void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags)
1061 B43_WARN_ON((ps_flags & B43_PS_ENABLED) &&
1062 (ps_flags & B43_PS_DISABLED));
1063 B43_WARN_ON((ps_flags & B43_PS_AWAKE) && (ps_flags & B43_PS_ASLEEP));
1065 if (ps_flags & B43_PS_ENABLED) {
1067 } else if (ps_flags & B43_PS_DISABLED) {
1070 //TODO: If powersave is not off and FIXME is not set and we are not in adhoc
1071 // and thus is not an AP and we are associated, set bit 25
1073 if (ps_flags & B43_PS_AWAKE) {
1075 } else if (ps_flags & B43_PS_ASLEEP) {
1078 //TODO: If the device is awake or this is an AP, or we are scanning, or FIXME,
1079 // or we are associated, or FIXME, or the latest PS-Poll packet sent was
1080 // successful, set bit26
1083 /* FIXME: For now we force awake-on and hwps-off */
1087 macctl = b43_read32(dev, B43_MMIO_MACCTL);
1089 macctl |= B43_MACCTL_HWPS;
1091 macctl &= ~B43_MACCTL_HWPS;
1093 macctl |= B43_MACCTL_AWAKE;
1095 macctl &= ~B43_MACCTL_AWAKE;
1096 b43_write32(dev, B43_MMIO_MACCTL, macctl);
1098 b43_read32(dev, B43_MMIO_MACCTL);
1099 if (awake && dev->dev->id.revision >= 5) {
1100 /* Wait for the microcode to wake up. */
1101 for (i = 0; i < 100; i++) {
1102 ucstat = b43_shm_read16(dev, B43_SHM_SHARED,
1103 B43_SHM_SH_UCODESTAT);
1104 if (ucstat != B43_SHM_SH_UCODESTAT_SLEEP)
1111 void b43_wireless_core_reset(struct b43_wldev *dev, u32 flags)
1116 flags |= B43_TMSLOW_PHYCLKEN;
1117 flags |= B43_TMSLOW_PHYRESET;
1118 ssb_device_enable(dev->dev, flags);
1119 msleep(2); /* Wait for the PLL to turn on. */
1121 /* Now take the PHY out of Reset again */
1122 tmslow = ssb_read32(dev->dev, SSB_TMSLOW);
1123 tmslow |= SSB_TMSLOW_FGC;
1124 tmslow &= ~B43_TMSLOW_PHYRESET;
1125 ssb_write32(dev->dev, SSB_TMSLOW, tmslow);
1126 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */
1128 tmslow &= ~SSB_TMSLOW_FGC;
1129 ssb_write32(dev->dev, SSB_TMSLOW, tmslow);
1130 ssb_read32(dev->dev, SSB_TMSLOW); /* flush */
1133 /* Turn Analog ON, but only if we already know the PHY-type.
1134 * This protects against very early setup where we don't know the
1135 * PHY-type, yet. wireless_core_reset will be called once again later,
1136 * when we know the PHY-type. */
1138 dev->phy.ops->switch_analog(dev, 1);
1140 macctl = b43_read32(dev, B43_MMIO_MACCTL);
1141 macctl &= ~B43_MACCTL_GMODE;
1142 if (flags & B43_TMSLOW_GMODE)
1143 macctl |= B43_MACCTL_GMODE;
1144 macctl |= B43_MACCTL_IHR_ENABLED;
1145 b43_write32(dev, B43_MMIO_MACCTL, macctl);
1148 static void handle_irq_transmit_status(struct b43_wldev *dev)
1152 struct b43_txstatus stat;
1155 v0 = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1156 if (!(v0 & 0x00000001))
1158 v1 = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1160 stat.cookie = (v0 >> 16);
1161 stat.seq = (v1 & 0x0000FFFF);
1162 stat.phy_stat = ((v1 & 0x00FF0000) >> 16);
1163 tmp = (v0 & 0x0000FFFF);
1164 stat.frame_count = ((tmp & 0xF000) >> 12);
1165 stat.rts_count = ((tmp & 0x0F00) >> 8);
1166 stat.supp_reason = ((tmp & 0x001C) >> 2);
1167 stat.pm_indicated = !!(tmp & 0x0080);
1168 stat.intermediate = !!(tmp & 0x0040);
1169 stat.for_ampdu = !!(tmp & 0x0020);
1170 stat.acked = !!(tmp & 0x0002);
1172 b43_handle_txstatus(dev, &stat);
1176 static void drain_txstatus_queue(struct b43_wldev *dev)
1180 if (dev->dev->id.revision < 5)
1182 /* Read all entries from the microcode TXstatus FIFO
1183 * and throw them away.
1186 dummy = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1187 if (!(dummy & 0x00000001))
1189 dummy = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1193 static u32 b43_jssi_read(struct b43_wldev *dev)
1197 val = b43_shm_read16(dev, B43_SHM_SHARED, 0x08A);
1199 val |= b43_shm_read16(dev, B43_SHM_SHARED, 0x088);
1204 static void b43_jssi_write(struct b43_wldev *dev, u32 jssi)
1206 b43_shm_write16(dev, B43_SHM_SHARED, 0x088, (jssi & 0x0000FFFF));
1207 b43_shm_write16(dev, B43_SHM_SHARED, 0x08A, (jssi & 0xFFFF0000) >> 16);
1210 static void b43_generate_noise_sample(struct b43_wldev *dev)
1212 b43_jssi_write(dev, 0x7F7F7F7F);
1213 b43_write32(dev, B43_MMIO_MACCMD,
1214 b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
1217 static void b43_calculate_link_quality(struct b43_wldev *dev)
1219 /* Top half of Link Quality calculation. */
1221 if (dev->phy.type != B43_PHYTYPE_G)
1223 if (dev->noisecalc.calculation_running)
1225 dev->noisecalc.calculation_running = 1;
1226 dev->noisecalc.nr_samples = 0;
1228 b43_generate_noise_sample(dev);
1231 static void handle_irq_noise(struct b43_wldev *dev)
1233 struct b43_phy_g *phy = dev->phy.g;
1239 /* Bottom half of Link Quality calculation. */
1241 if (dev->phy.type != B43_PHYTYPE_G)
1244 /* Possible race condition: It might be possible that the user
1245 * changed to a different channel in the meantime since we
1246 * started the calculation. We ignore that fact, since it's
1247 * not really that much of a problem. The background noise is
1248 * an estimation only anyway. Slightly wrong results will get damped
1249 * by the averaging of the 8 sample rounds. Additionally the
1250 * value is shortlived. So it will be replaced by the next noise
1251 * calculation round soon. */
1253 B43_WARN_ON(!dev->noisecalc.calculation_running);
1254 *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
1255 if (noise[0] == 0x7F || noise[1] == 0x7F ||
1256 noise[2] == 0x7F || noise[3] == 0x7F)
1259 /* Get the noise samples. */
1260 B43_WARN_ON(dev->noisecalc.nr_samples >= 8);
1261 i = dev->noisecalc.nr_samples;
1262 noise[0] = clamp_val(noise[0], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1263 noise[1] = clamp_val(noise[1], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1264 noise[2] = clamp_val(noise[2], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1265 noise[3] = clamp_val(noise[3], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1266 dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]];
1267 dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]];
1268 dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]];
1269 dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]];
1270 dev->noisecalc.nr_samples++;
1271 if (dev->noisecalc.nr_samples == 8) {
1272 /* Calculate the Link Quality by the noise samples. */
1274 for (i = 0; i < 8; i++) {
1275 for (j = 0; j < 4; j++)
1276 average += dev->noisecalc.samples[i][j];
1282 tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x40C);
1283 tmp = (tmp / 128) & 0x1F;
1293 dev->stats.link_noise = average;
1294 dev->noisecalc.calculation_running = 0;
1298 b43_generate_noise_sample(dev);
1301 static void handle_irq_tbtt_indication(struct b43_wldev *dev)
1303 if (b43_is_mode(dev->wl, NL80211_IFTYPE_AP)) {
1306 if (1 /*FIXME: the last PSpoll frame was sent successfully */ )
1307 b43_power_saving_ctl_bits(dev, 0);
1309 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC))
1313 static void handle_irq_atim_end(struct b43_wldev *dev)
1315 if (dev->dfq_valid) {
1316 b43_write32(dev, B43_MMIO_MACCMD,
1317 b43_read32(dev, B43_MMIO_MACCMD)
1318 | B43_MACCMD_DFQ_VALID);
1323 static void handle_irq_pmq(struct b43_wldev *dev)
1330 tmp = b43_read32(dev, B43_MMIO_PS_STATUS);
1331 if (!(tmp & 0x00000008))
1334 /* 16bit write is odd, but correct. */
1335 b43_write16(dev, B43_MMIO_PS_STATUS, 0x0002);
1338 static void b43_write_template_common(struct b43_wldev *dev,
1339 const u8 *data, u16 size,
1341 u16 shm_size_offset, u8 rate)
1344 struct b43_plcp_hdr4 plcp;
1347 b43_generate_plcp_hdr(&plcp, size + FCS_LEN, rate);
1348 b43_ram_write(dev, ram_offset, le32_to_cpu(plcp.data));
1349 ram_offset += sizeof(u32);
1350 /* The PLCP is 6 bytes long, but we only wrote 4 bytes, yet.
1351 * So leave the first two bytes of the next write blank.
1353 tmp = (u32) (data[0]) << 16;
1354 tmp |= (u32) (data[1]) << 24;
1355 b43_ram_write(dev, ram_offset, tmp);
1356 ram_offset += sizeof(u32);
1357 for (i = 2; i < size; i += sizeof(u32)) {
1358 tmp = (u32) (data[i + 0]);
1360 tmp |= (u32) (data[i + 1]) << 8;
1362 tmp |= (u32) (data[i + 2]) << 16;
1364 tmp |= (u32) (data[i + 3]) << 24;
1365 b43_ram_write(dev, ram_offset + i - 2, tmp);
1367 b43_shm_write16(dev, B43_SHM_SHARED, shm_size_offset,
1368 size + sizeof(struct b43_plcp_hdr6));
1371 /* Check if the use of the antenna that ieee80211 told us to
1372 * use is possible. This will fall back to DEFAULT.
1373 * "antenna_nr" is the antenna identifier we got from ieee80211. */
1374 u8 b43_ieee80211_antenna_sanitize(struct b43_wldev *dev,
1379 if (antenna_nr == 0) {
1380 /* Zero means "use default antenna". That's always OK. */
1384 /* Get the mask of available antennas. */
1386 antenna_mask = dev->dev->bus->sprom.ant_available_bg;
1388 antenna_mask = dev->dev->bus->sprom.ant_available_a;
1390 if (!(antenna_mask & (1 << (antenna_nr - 1)))) {
1391 /* This antenna is not available. Fall back to default. */
1398 /* Convert a b43 antenna number value to the PHY TX control value. */
1399 static u16 b43_antenna_to_phyctl(int antenna)
1403 return B43_TXH_PHY_ANT0;
1405 return B43_TXH_PHY_ANT1;
1407 return B43_TXH_PHY_ANT2;
1409 return B43_TXH_PHY_ANT3;
1410 case B43_ANTENNA_AUTO0:
1411 case B43_ANTENNA_AUTO1:
1412 return B43_TXH_PHY_ANT01AUTO;
1418 static void b43_write_beacon_template(struct b43_wldev *dev,
1420 u16 shm_size_offset)
1422 unsigned int i, len, variable_len;
1423 const struct ieee80211_mgmt *bcn;
1429 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(dev->wl->current_beacon);
1431 bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data);
1432 len = min((size_t) dev->wl->current_beacon->len,
1433 0x200 - sizeof(struct b43_plcp_hdr6));
1434 rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value;
1436 b43_write_template_common(dev, (const u8 *)bcn,
1437 len, ram_offset, shm_size_offset, rate);
1439 /* Write the PHY TX control parameters. */
1440 antenna = B43_ANTENNA_DEFAULT;
1441 antenna = b43_antenna_to_phyctl(antenna);
1442 ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
1443 /* We can't send beacons with short preamble. Would get PHY errors. */
1444 ctl &= ~B43_TXH_PHY_SHORTPRMBL;
1445 ctl &= ~B43_TXH_PHY_ANT;
1446 ctl &= ~B43_TXH_PHY_ENC;
1448 if (b43_is_cck_rate(rate))
1449 ctl |= B43_TXH_PHY_ENC_CCK;
1451 ctl |= B43_TXH_PHY_ENC_OFDM;
1452 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
1454 /* Find the position of the TIM and the DTIM_period value
1455 * and write them to SHM. */
1456 ie = bcn->u.beacon.variable;
1457 variable_len = len - offsetof(struct ieee80211_mgmt, u.beacon.variable);
1458 for (i = 0; i < variable_len - 2; ) {
1459 uint8_t ie_id, ie_len;
1466 /* This is the TIM Information Element */
1468 /* Check whether the ie_len is in the beacon data range. */
1469 if (variable_len < ie_len + 2 + i)
1471 /* A valid TIM is at least 4 bytes long. */
1476 tim_position = sizeof(struct b43_plcp_hdr6);
1477 tim_position += offsetof(struct ieee80211_mgmt, u.beacon.variable);
1480 dtim_period = ie[i + 3];
1482 b43_shm_write16(dev, B43_SHM_SHARED,
1483 B43_SHM_SH_TIMBPOS, tim_position);
1484 b43_shm_write16(dev, B43_SHM_SHARED,
1485 B43_SHM_SH_DTIMPER, dtim_period);
1492 * If ucode wants to modify TIM do it behind the beacon, this
1493 * will happen, for example, when doing mesh networking.
1495 b43_shm_write16(dev, B43_SHM_SHARED,
1497 len + sizeof(struct b43_plcp_hdr6));
1498 b43_shm_write16(dev, B43_SHM_SHARED,
1499 B43_SHM_SH_DTIMPER, 0);
1501 b43dbg(dev->wl, "Updated beacon template at 0x%x\n", ram_offset);
1504 static void b43_upload_beacon0(struct b43_wldev *dev)
1506 struct b43_wl *wl = dev->wl;
1508 if (wl->beacon0_uploaded)
1510 b43_write_beacon_template(dev, 0x68, 0x18);
1511 wl->beacon0_uploaded = 1;
1514 static void b43_upload_beacon1(struct b43_wldev *dev)
1516 struct b43_wl *wl = dev->wl;
1518 if (wl->beacon1_uploaded)
1520 b43_write_beacon_template(dev, 0x468, 0x1A);
1521 wl->beacon1_uploaded = 1;
1524 static void handle_irq_beacon(struct b43_wldev *dev)
1526 struct b43_wl *wl = dev->wl;
1527 u32 cmd, beacon0_valid, beacon1_valid;
1529 if (!b43_is_mode(wl, NL80211_IFTYPE_AP) &&
1530 !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
1533 /* This is the bottom half of the asynchronous beacon update. */
1535 /* Ignore interrupt in the future. */
1536 dev->irq_mask &= ~B43_IRQ_BEACON;
1538 cmd = b43_read32(dev, B43_MMIO_MACCMD);
1539 beacon0_valid = (cmd & B43_MACCMD_BEACON0_VALID);
1540 beacon1_valid = (cmd & B43_MACCMD_BEACON1_VALID);
1542 /* Schedule interrupt manually, if busy. */
1543 if (beacon0_valid && beacon1_valid) {
1544 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_BEACON);
1545 dev->irq_mask |= B43_IRQ_BEACON;
1549 if (unlikely(wl->beacon_templates_virgin)) {
1550 /* We never uploaded a beacon before.
1551 * Upload both templates now, but only mark one valid. */
1552 wl->beacon_templates_virgin = 0;
1553 b43_upload_beacon0(dev);
1554 b43_upload_beacon1(dev);
1555 cmd = b43_read32(dev, B43_MMIO_MACCMD);
1556 cmd |= B43_MACCMD_BEACON0_VALID;
1557 b43_write32(dev, B43_MMIO_MACCMD, cmd);
1559 if (!beacon0_valid) {
1560 b43_upload_beacon0(dev);
1561 cmd = b43_read32(dev, B43_MMIO_MACCMD);
1562 cmd |= B43_MACCMD_BEACON0_VALID;
1563 b43_write32(dev, B43_MMIO_MACCMD, cmd);
1564 } else if (!beacon1_valid) {
1565 b43_upload_beacon1(dev);
1566 cmd = b43_read32(dev, B43_MMIO_MACCMD);
1567 cmd |= B43_MACCMD_BEACON1_VALID;
1568 b43_write32(dev, B43_MMIO_MACCMD, cmd);
1573 static void b43_do_beacon_update_trigger_work(struct b43_wldev *dev)
1575 u32 old_irq_mask = dev->irq_mask;
1577 /* update beacon right away or defer to irq */
1578 handle_irq_beacon(dev);
1579 if (old_irq_mask != dev->irq_mask) {
1580 /* The handler updated the IRQ mask. */
1581 B43_WARN_ON(!dev->irq_mask);
1582 if (b43_read32(dev, B43_MMIO_GEN_IRQ_MASK)) {
1583 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1585 /* Device interrupts are currently disabled. That means
1586 * we just ran the hardirq handler and scheduled the
1587 * IRQ thread. The thread will write the IRQ mask when
1588 * it finished, so there's nothing to do here. Writing
1589 * the mask _here_ would incorrectly re-enable IRQs. */
1594 static void b43_beacon_update_trigger_work(struct work_struct *work)
1596 struct b43_wl *wl = container_of(work, struct b43_wl,
1597 beacon_update_trigger);
1598 struct b43_wldev *dev;
1600 mutex_lock(&wl->mutex);
1601 dev = wl->current_dev;
1602 if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) {
1603 if (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) {
1604 /* wl->mutex is enough. */
1605 b43_do_beacon_update_trigger_work(dev);
1608 spin_lock_irq(&wl->hardirq_lock);
1609 b43_do_beacon_update_trigger_work(dev);
1611 spin_unlock_irq(&wl->hardirq_lock);
1614 mutex_unlock(&wl->mutex);
1617 /* Asynchronously update the packet templates in template RAM.
1618 * Locking: Requires wl->mutex to be locked. */
1619 static void b43_update_templates(struct b43_wl *wl)
1621 struct sk_buff *beacon;
1623 /* This is the top half of the ansynchronous beacon update.
1624 * The bottom half is the beacon IRQ.
1625 * Beacon update must be asynchronous to avoid sending an
1626 * invalid beacon. This can happen for example, if the firmware
1627 * transmits a beacon while we are updating it. */
1629 /* We could modify the existing beacon and set the aid bit in
1630 * the TIM field, but that would probably require resizing and
1631 * moving of data within the beacon template.
1632 * Simply request a new beacon and let mac80211 do the hard work. */
1633 beacon = ieee80211_beacon_get(wl->hw, wl->vif);
1634 if (unlikely(!beacon))
1637 if (wl->current_beacon)
1638 dev_kfree_skb_any(wl->current_beacon);
1639 wl->current_beacon = beacon;
1640 wl->beacon0_uploaded = 0;
1641 wl->beacon1_uploaded = 0;
1642 ieee80211_queue_work(wl->hw, &wl->beacon_update_trigger);
1645 static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int)
1648 if (dev->dev->id.revision >= 3) {
1649 b43_write32(dev, B43_MMIO_TSF_CFP_REP, (beacon_int << 16));
1650 b43_write32(dev, B43_MMIO_TSF_CFP_START, (beacon_int << 10));
1652 b43_write16(dev, 0x606, (beacon_int >> 6));
1653 b43_write16(dev, 0x610, beacon_int);
1655 b43_time_unlock(dev);
1656 b43dbg(dev->wl, "Set beacon interval to %u\n", beacon_int);
1659 static void b43_handle_firmware_panic(struct b43_wldev *dev)
1663 /* Read the register that contains the reason code for the panic. */
1664 reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_FWPANIC_REASON_REG);
1665 b43err(dev->wl, "Whoopsy, firmware panic! Reason: %u\n", reason);
1669 b43dbg(dev->wl, "The panic reason is unknown.\n");
1671 case B43_FWPANIC_DIE:
1672 /* Do not restart the controller or firmware.
1673 * The device is nonfunctional from now on.
1674 * Restarting would result in this panic to trigger again,
1675 * so we avoid that recursion. */
1677 case B43_FWPANIC_RESTART:
1678 b43_controller_restart(dev, "Microcode panic");
1683 static void handle_irq_ucode_debug(struct b43_wldev *dev)
1685 unsigned int i, cnt;
1686 u16 reason, marker_id, marker_line;
1689 /* The proprietary firmware doesn't have this IRQ. */
1690 if (!dev->fw.opensource)
1693 /* Read the register that contains the reason code for this IRQ. */
1694 reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_DEBUGIRQ_REASON_REG);
1697 case B43_DEBUGIRQ_PANIC:
1698 b43_handle_firmware_panic(dev);
1700 case B43_DEBUGIRQ_DUMP_SHM:
1702 break; /* Only with driver debugging enabled. */
1703 buf = kmalloc(4096, GFP_ATOMIC);
1705 b43dbg(dev->wl, "SHM-dump: Failed to allocate memory\n");
1708 for (i = 0; i < 4096; i += 2) {
1709 u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, i);
1710 buf[i / 2] = cpu_to_le16(tmp);
1712 b43info(dev->wl, "Shared memory dump:\n");
1713 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET,
1714 16, 2, buf, 4096, 1);
1717 case B43_DEBUGIRQ_DUMP_REGS:
1719 break; /* Only with driver debugging enabled. */
1720 b43info(dev->wl, "Microcode register dump:\n");
1721 for (i = 0, cnt = 0; i < 64; i++) {
1722 u16 tmp = b43_shm_read16(dev, B43_SHM_SCRATCH, i);
1725 printk("r%02u: 0x%04X ", i, tmp);
1734 case B43_DEBUGIRQ_MARKER:
1736 break; /* Only with driver debugging enabled. */
1737 marker_id = b43_shm_read16(dev, B43_SHM_SCRATCH,
1739 marker_line = b43_shm_read16(dev, B43_SHM_SCRATCH,
1740 B43_MARKER_LINE_REG);
1741 b43info(dev->wl, "The firmware just executed the MARKER(%u) "
1742 "at line number %u\n",
1743 marker_id, marker_line);
1746 b43dbg(dev->wl, "Debug-IRQ triggered for unknown reason: %u\n",
1750 /* Acknowledge the debug-IRQ, so the firmware can continue. */
1751 b43_shm_write16(dev, B43_SHM_SCRATCH,
1752 B43_DEBUGIRQ_REASON_REG, B43_DEBUGIRQ_ACK);
1755 static void b43_do_interrupt_thread(struct b43_wldev *dev)
1758 u32 dma_reason[ARRAY_SIZE(dev->dma_reason)];
1759 u32 merged_dma_reason = 0;
1762 if (unlikely(b43_status(dev) != B43_STAT_STARTED))
1765 reason = dev->irq_reason;
1766 for (i = 0; i < ARRAY_SIZE(dma_reason); i++) {
1767 dma_reason[i] = dev->dma_reason[i];
1768 merged_dma_reason |= dma_reason[i];
1771 if (unlikely(reason & B43_IRQ_MAC_TXERR))
1772 b43err(dev->wl, "MAC transmission error\n");
1774 if (unlikely(reason & B43_IRQ_PHY_TXERR)) {
1775 b43err(dev->wl, "PHY transmission error\n");
1777 if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) {
1778 atomic_set(&dev->phy.txerr_cnt,
1779 B43_PHY_TX_BADNESS_LIMIT);
1780 b43err(dev->wl, "Too many PHY TX errors, "
1781 "restarting the controller\n");
1782 b43_controller_restart(dev, "PHY TX errors");
1786 if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK |
1787 B43_DMAIRQ_NONFATALMASK))) {
1788 if (merged_dma_reason & B43_DMAIRQ_FATALMASK) {
1789 b43err(dev->wl, "Fatal DMA error: "
1790 "0x%08X, 0x%08X, 0x%08X, "
1791 "0x%08X, 0x%08X, 0x%08X\n",
1792 dma_reason[0], dma_reason[1],
1793 dma_reason[2], dma_reason[3],
1794 dma_reason[4], dma_reason[5]);
1795 b43err(dev->wl, "This device does not support DMA "
1796 "on your system. Please use PIO instead.\n");
1797 b43err(dev->wl, "Unload the b43 module and reload "
1801 if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) {
1802 b43err(dev->wl, "DMA error: "
1803 "0x%08X, 0x%08X, 0x%08X, "
1804 "0x%08X, 0x%08X, 0x%08X\n",
1805 dma_reason[0], dma_reason[1],
1806 dma_reason[2], dma_reason[3],
1807 dma_reason[4], dma_reason[5]);
1811 if (unlikely(reason & B43_IRQ_UCODE_DEBUG))
1812 handle_irq_ucode_debug(dev);
1813 if (reason & B43_IRQ_TBTT_INDI)
1814 handle_irq_tbtt_indication(dev);
1815 if (reason & B43_IRQ_ATIM_END)
1816 handle_irq_atim_end(dev);
1817 if (reason & B43_IRQ_BEACON)
1818 handle_irq_beacon(dev);
1819 if (reason & B43_IRQ_PMQ)
1820 handle_irq_pmq(dev);
1821 if (reason & B43_IRQ_TXFIFO_FLUSH_OK)
1823 if (reason & B43_IRQ_NOISESAMPLE_OK)
1824 handle_irq_noise(dev);
1826 /* Check the DMA reason registers for received data. */
1827 if (dma_reason[0] & B43_DMAIRQ_RX_DONE) {
1828 if (b43_using_pio_transfers(dev))
1829 b43_pio_rx(dev->pio.rx_queue);
1831 b43_dma_rx(dev->dma.rx_ring);
1833 B43_WARN_ON(dma_reason[1] & B43_DMAIRQ_RX_DONE);
1834 B43_WARN_ON(dma_reason[2] & B43_DMAIRQ_RX_DONE);
1835 B43_WARN_ON(dma_reason[3] & B43_DMAIRQ_RX_DONE);
1836 B43_WARN_ON(dma_reason[4] & B43_DMAIRQ_RX_DONE);
1837 B43_WARN_ON(dma_reason[5] & B43_DMAIRQ_RX_DONE);
1839 if (reason & B43_IRQ_TX_OK)
1840 handle_irq_transmit_status(dev);
1842 /* Re-enable interrupts on the device by restoring the current interrupt mask. */
1843 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1846 if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
1848 for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
1849 if (reason & (1 << i))
1850 dev->irq_bit_count[i]++;
1856 /* Interrupt thread handler. Handles device interrupts in thread context. */
1857 static irqreturn_t b43_interrupt_thread_handler(int irq, void *dev_id)
1859 struct b43_wldev *dev = dev_id;
1861 mutex_lock(&dev->wl->mutex);
1862 b43_do_interrupt_thread(dev);
1864 mutex_unlock(&dev->wl->mutex);
1869 static irqreturn_t b43_do_interrupt(struct b43_wldev *dev)
1873 /* This code runs under wl->hardirq_lock, but _only_ on non-SDIO busses.
1874 * On SDIO, this runs under wl->mutex. */
1876 reason = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
1877 if (reason == 0xffffffff) /* shared IRQ */
1879 reason &= dev->irq_mask;
1883 dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON)
1885 dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON)
1887 dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON)
1889 dev->dma_reason[3] = b43_read32(dev, B43_MMIO_DMA3_REASON)
1891 dev->dma_reason[4] = b43_read32(dev, B43_MMIO_DMA4_REASON)
1894 dev->dma_reason[5] = b43_read32(dev, B43_MMIO_DMA5_REASON)
1898 /* ACK the interrupt. */
1899 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, reason);
1900 b43_write32(dev, B43_MMIO_DMA0_REASON, dev->dma_reason[0]);
1901 b43_write32(dev, B43_MMIO_DMA1_REASON, dev->dma_reason[1]);
1902 b43_write32(dev, B43_MMIO_DMA2_REASON, dev->dma_reason[2]);
1903 b43_write32(dev, B43_MMIO_DMA3_REASON, dev->dma_reason[3]);
1904 b43_write32(dev, B43_MMIO_DMA4_REASON, dev->dma_reason[4]);
1906 b43_write32(dev, B43_MMIO_DMA5_REASON, dev->dma_reason[5]);
1909 /* Disable IRQs on the device. The IRQ thread handler will re-enable them. */
1910 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
1911 /* Save the reason bitmasks for the IRQ thread handler. */
1912 dev->irq_reason = reason;
1914 return IRQ_WAKE_THREAD;
1917 /* Interrupt handler top-half. This runs with interrupts disabled. */
1918 static irqreturn_t b43_interrupt_handler(int irq, void *dev_id)
1920 struct b43_wldev *dev = dev_id;
1923 if (unlikely(b43_status(dev) < B43_STAT_STARTED))
1926 spin_lock(&dev->wl->hardirq_lock);
1927 ret = b43_do_interrupt(dev);
1929 spin_unlock(&dev->wl->hardirq_lock);
1934 /* SDIO interrupt handler. This runs in process context. */
1935 static void b43_sdio_interrupt_handler(struct b43_wldev *dev)
1937 struct b43_wl *wl = dev->wl;
1940 mutex_lock(&wl->mutex);
1942 ret = b43_do_interrupt(dev);
1943 if (ret == IRQ_WAKE_THREAD)
1944 b43_do_interrupt_thread(dev);
1946 mutex_unlock(&wl->mutex);
1949 void b43_do_release_fw(struct b43_firmware_file *fw)
1951 release_firmware(fw->data);
1953 fw->filename = NULL;
1956 static void b43_release_firmware(struct b43_wldev *dev)
1958 b43_do_release_fw(&dev->fw.ucode);
1959 b43_do_release_fw(&dev->fw.pcm);
1960 b43_do_release_fw(&dev->fw.initvals);
1961 b43_do_release_fw(&dev->fw.initvals_band);
1964 static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
1968 "http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware " \
1969 "and download the correct firmware for this driver version. " \
1970 "Please carefully read all instructions on this website.\n";
1978 int b43_do_request_fw(struct b43_request_fw_context *ctx,
1980 struct b43_firmware_file *fw)
1982 const struct firmware *blob;
1983 struct b43_fw_header *hdr;
1988 /* Don't fetch anything. Free possibly cached firmware. */
1989 /* FIXME: We should probably keep it anyway, to save some headache
1990 * on suspend/resume with multiband devices. */
1991 b43_do_release_fw(fw);
1995 if ((fw->type == ctx->req_type) &&
1996 (strcmp(fw->filename, name) == 0))
1997 return 0; /* Already have this fw. */
1998 /* Free the cached firmware first. */
1999 /* FIXME: We should probably do this later after we successfully
2000 * got the new fw. This could reduce headache with multiband devices.
2001 * We could also redesign this to cache the firmware for all possible
2002 * bands all the time. */
2003 b43_do_release_fw(fw);
2006 switch (ctx->req_type) {
2007 case B43_FWTYPE_PROPRIETARY:
2008 snprintf(ctx->fwname, sizeof(ctx->fwname),
2010 modparam_fwpostfix, name);
2012 case B43_FWTYPE_OPENSOURCE:
2013 snprintf(ctx->fwname, sizeof(ctx->fwname),
2015 modparam_fwpostfix, name);
2021 err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev);
2022 if (err == -ENOENT) {
2023 snprintf(ctx->errors[ctx->req_type],
2024 sizeof(ctx->errors[ctx->req_type]),
2025 "Firmware file \"%s\" not found\n", ctx->fwname);
2028 snprintf(ctx->errors[ctx->req_type],
2029 sizeof(ctx->errors[ctx->req_type]),
2030 "Firmware file \"%s\" request failed (err=%d)\n",
2034 if (blob->size < sizeof(struct b43_fw_header))
2036 hdr = (struct b43_fw_header *)(blob->data);
2037 switch (hdr->type) {
2038 case B43_FW_TYPE_UCODE:
2039 case B43_FW_TYPE_PCM:
2040 size = be32_to_cpu(hdr->size);
2041 if (size != blob->size - sizeof(struct b43_fw_header))
2044 case B43_FW_TYPE_IV:
2053 fw->filename = name;
2054 fw->type = ctx->req_type;
2059 snprintf(ctx->errors[ctx->req_type],
2060 sizeof(ctx->errors[ctx->req_type]),
2061 "Firmware file \"%s\" format error.\n", ctx->fwname);
2062 release_firmware(blob);
2067 static int b43_try_request_fw(struct b43_request_fw_context *ctx)
2069 struct b43_wldev *dev = ctx->dev;
2070 struct b43_firmware *fw = &ctx->dev->fw;
2071 const u8 rev = ctx->dev->dev->id.revision;
2072 const char *filename;
2077 tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH);
2078 if ((rev >= 5) && (rev <= 10))
2079 filename = "ucode5";
2080 else if ((rev >= 11) && (rev <= 12))
2081 filename = "ucode11";
2083 filename = "ucode13";
2085 filename = "ucode14";
2087 filename = "ucode15";
2090 err = b43_do_request_fw(ctx, filename, &fw->ucode);
2095 if ((rev >= 5) && (rev <= 10))
2101 fw->pcm_request_failed = 0;
2102 err = b43_do_request_fw(ctx, filename, &fw->pcm);
2103 if (err == -ENOENT) {
2104 /* We did not find a PCM file? Not fatal, but
2105 * core rev <= 10 must do without hwcrypto then. */
2106 fw->pcm_request_failed = 1;
2111 switch (dev->phy.type) {
2113 if ((rev >= 5) && (rev <= 10)) {
2114 if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2115 filename = "a0g1initvals5";
2117 filename = "a0g0initvals5";
2119 goto err_no_initvals;
2122 if ((rev >= 5) && (rev <= 10))
2123 filename = "b0g0initvals5";
2125 filename = "b0g0initvals13";
2127 goto err_no_initvals;
2130 if ((rev >= 11) && (rev <= 12))
2131 filename = "n0initvals11";
2133 goto err_no_initvals;
2135 case B43_PHYTYPE_LP:
2137 filename = "lp0initvals13";
2139 filename = "lp0initvals14";
2141 filename = "lp0initvals15";
2143 goto err_no_initvals;
2146 goto err_no_initvals;
2148 err = b43_do_request_fw(ctx, filename, &fw->initvals);
2152 /* Get bandswitch initvals */
2153 switch (dev->phy.type) {
2155 if ((rev >= 5) && (rev <= 10)) {
2156 if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2157 filename = "a0g1bsinitvals5";
2159 filename = "a0g0bsinitvals5";
2160 } else if (rev >= 11)
2163 goto err_no_initvals;
2166 if ((rev >= 5) && (rev <= 10))
2167 filename = "b0g0bsinitvals5";
2171 goto err_no_initvals;
2174 if ((rev >= 11) && (rev <= 12))
2175 filename = "n0bsinitvals11";
2177 goto err_no_initvals;
2179 case B43_PHYTYPE_LP:
2181 filename = "lp0bsinitvals13";
2183 filename = "lp0bsinitvals14";
2185 filename = "lp0bsinitvals15";
2187 goto err_no_initvals;
2190 goto err_no_initvals;
2192 err = b43_do_request_fw(ctx, filename, &fw->initvals_band);
2199 err = ctx->fatal_failure = -EOPNOTSUPP;
2200 b43err(dev->wl, "The driver does not know which firmware (ucode) "
2201 "is required for your device (wl-core rev %u)\n", rev);
2205 err = ctx->fatal_failure = -EOPNOTSUPP;
2206 b43err(dev->wl, "The driver does not know which firmware (PCM) "
2207 "is required for your device (wl-core rev %u)\n", rev);
2211 err = ctx->fatal_failure = -EOPNOTSUPP;
2212 b43err(dev->wl, "The driver does not know which firmware (initvals) "
2213 "is required for your device (wl-core rev %u)\n", rev);
2217 /* We failed to load this firmware image. The error message
2218 * already is in ctx->errors. Return and let our caller decide
2223 b43_release_firmware(dev);
2227 static int b43_request_firmware(struct b43_wldev *dev)
2229 struct b43_request_fw_context *ctx;
2234 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2239 ctx->req_type = B43_FWTYPE_PROPRIETARY;
2240 err = b43_try_request_fw(ctx);
2242 goto out; /* Successfully loaded it. */
2243 err = ctx->fatal_failure;
2247 ctx->req_type = B43_FWTYPE_OPENSOURCE;
2248 err = b43_try_request_fw(ctx);
2250 goto out; /* Successfully loaded it. */
2251 err = ctx->fatal_failure;
2255 /* Could not find a usable firmware. Print the errors. */
2256 for (i = 0; i < B43_NR_FWTYPES; i++) {
2257 errmsg = ctx->errors[i];
2259 b43err(dev->wl, errmsg);
2261 b43_print_fw_helptext(dev->wl, 1);
2269 static int b43_upload_microcode(struct b43_wldev *dev)
2271 const size_t hdr_len = sizeof(struct b43_fw_header);
2273 unsigned int i, len;
2274 u16 fwrev, fwpatch, fwdate, fwtime;
2278 /* Jump the microcode PSM to offset 0 */
2279 macctl = b43_read32(dev, B43_MMIO_MACCTL);
2280 B43_WARN_ON(macctl & B43_MACCTL_PSM_RUN);
2281 macctl |= B43_MACCTL_PSM_JMP0;
2282 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2283 /* Zero out all microcode PSM registers and shared memory. */
2284 for (i = 0; i < 64; i++)
2285 b43_shm_write16(dev, B43_SHM_SCRATCH, i, 0);
2286 for (i = 0; i < 4096; i += 2)
2287 b43_shm_write16(dev, B43_SHM_SHARED, i, 0);
2289 /* Upload Microcode. */
2290 data = (__be32 *) (dev->fw.ucode.data->data + hdr_len);
2291 len = (dev->fw.ucode.data->size - hdr_len) / sizeof(__be32);
2292 b43_shm_control_word(dev, B43_SHM_UCODE | B43_SHM_AUTOINC_W, 0x0000);
2293 for (i = 0; i < len; i++) {
2294 b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2298 if (dev->fw.pcm.data) {
2299 /* Upload PCM data. */
2300 data = (__be32 *) (dev->fw.pcm.data->data + hdr_len);
2301 len = (dev->fw.pcm.data->size - hdr_len) / sizeof(__be32);
2302 b43_shm_control_word(dev, B43_SHM_HW, 0x01EA);
2303 b43_write32(dev, B43_MMIO_SHM_DATA, 0x00004000);
2304 /* No need for autoinc bit in SHM_HW */
2305 b43_shm_control_word(dev, B43_SHM_HW, 0x01EB);
2306 for (i = 0; i < len; i++) {
2307 b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2312 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_ALL);
2314 /* Start the microcode PSM */
2315 macctl = b43_read32(dev, B43_MMIO_MACCTL);
2316 macctl &= ~B43_MACCTL_PSM_JMP0;
2317 macctl |= B43_MACCTL_PSM_RUN;
2318 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2320 /* Wait for the microcode to load and respond */
2323 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2324 if (tmp == B43_IRQ_MAC_SUSPENDED)
2328 b43err(dev->wl, "Microcode not responding\n");
2329 b43_print_fw_helptext(dev->wl, 1);
2335 b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); /* dummy read */
2337 /* Get and check the revisions. */
2338 fwrev = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEREV);
2339 fwpatch = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEPATCH);
2340 fwdate = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEDATE);
2341 fwtime = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODETIME);
2343 if (fwrev <= 0x128) {
2344 b43err(dev->wl, "YOUR FIRMWARE IS TOO OLD. Firmware from "
2345 "binary drivers older than version 4.x is unsupported. "
2346 "You must upgrade your firmware files.\n");
2347 b43_print_fw_helptext(dev->wl, 1);
2351 dev->fw.rev = fwrev;
2352 dev->fw.patch = fwpatch;
2353 dev->fw.opensource = (fwdate == 0xFFFF);
2355 /* Default to use-all-queues. */
2356 dev->wl->hw->queues = dev->wl->mac80211_initially_registered_queues;
2357 dev->qos_enabled = !!modparam_qos;
2358 /* Default to firmware/hardware crypto acceleration. */
2359 dev->hwcrypto_enabled = 1;
2361 if (dev->fw.opensource) {
2364 /* Patchlevel info is encoded in the "time" field. */
2365 dev->fw.patch = fwtime;
2366 b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n",
2367 dev->fw.rev, dev->fw.patch);
2369 fwcapa = b43_fwcapa_read(dev);
2370 if (!(fwcapa & B43_FWCAPA_HWCRYPTO) || dev->fw.pcm_request_failed) {
2371 b43info(dev->wl, "Hardware crypto acceleration not supported by firmware\n");
2372 /* Disable hardware crypto and fall back to software crypto. */
2373 dev->hwcrypto_enabled = 0;
2375 if (!(fwcapa & B43_FWCAPA_QOS)) {
2376 b43info(dev->wl, "QoS not supported by firmware\n");
2377 /* Disable QoS. Tweak hw->queues to 1. It will be restored before
2378 * ieee80211_unregister to make sure the networking core can
2379 * properly free possible resources. */
2380 dev->wl->hw->queues = 1;
2381 dev->qos_enabled = 0;
2384 b43info(dev->wl, "Loading firmware version %u.%u "
2385 "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
2387 (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
2388 (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
2389 if (dev->fw.pcm_request_failed) {
2390 b43warn(dev->wl, "No \"pcm5.fw\" firmware file found. "
2391 "Hardware accelerated cryptography is disabled.\n");
2392 b43_print_fw_helptext(dev->wl, 0);
2396 if (b43_is_old_txhdr_format(dev)) {
2397 /* We're over the deadline, but we keep support for old fw
2398 * until it turns out to be in major conflict with something new. */
2399 b43warn(dev->wl, "You are using an old firmware image. "
2400 "Support for old firmware will be removed soon "
2401 "(official deadline was July 2008).\n");
2402 b43_print_fw_helptext(dev->wl, 0);
2408 macctl = b43_read32(dev, B43_MMIO_MACCTL);
2409 macctl &= ~B43_MACCTL_PSM_RUN;
2410 macctl |= B43_MACCTL_PSM_JMP0;
2411 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2416 static int b43_write_initvals(struct b43_wldev *dev,
2417 const struct b43_iv *ivals,
2421 const struct b43_iv *iv;
2426 BUILD_BUG_ON(sizeof(struct b43_iv) != 6);
2428 for (i = 0; i < count; i++) {
2429 if (array_size < sizeof(iv->offset_size))
2431 array_size -= sizeof(iv->offset_size);
2432 offset = be16_to_cpu(iv->offset_size);
2433 bit32 = !!(offset & B43_IV_32BIT);
2434 offset &= B43_IV_OFFSET_MASK;
2435 if (offset >= 0x1000)
2440 if (array_size < sizeof(iv->data.d32))
2442 array_size -= sizeof(iv->data.d32);
2444 value = get_unaligned_be32(&iv->data.d32);
2445 b43_write32(dev, offset, value);
2447 iv = (const struct b43_iv *)((const uint8_t *)iv +
2453 if (array_size < sizeof(iv->data.d16))
2455 array_size -= sizeof(iv->data.d16);
2457 value = be16_to_cpu(iv->data.d16);
2458 b43_write16(dev, offset, value);
2460 iv = (const struct b43_iv *)((const uint8_t *)iv +
2471 b43err(dev->wl, "Initial Values Firmware file-format error.\n");
2472 b43_print_fw_helptext(dev->wl, 1);
2477 static int b43_upload_initvals(struct b43_wldev *dev)
2479 const size_t hdr_len = sizeof(struct b43_fw_header);
2480 const struct b43_fw_header *hdr;
2481 struct b43_firmware *fw = &dev->fw;
2482 const struct b43_iv *ivals;
2486 hdr = (const struct b43_fw_header *)(fw->initvals.data->data);
2487 ivals = (const struct b43_iv *)(fw->initvals.data->data + hdr_len);
2488 count = be32_to_cpu(hdr->size);
2489 err = b43_write_initvals(dev, ivals, count,
2490 fw->initvals.data->size - hdr_len);
2493 if (fw->initvals_band.data) {
2494 hdr = (const struct b43_fw_header *)(fw->initvals_band.data->data);
2495 ivals = (const struct b43_iv *)(fw->initvals_band.data->data + hdr_len);
2496 count = be32_to_cpu(hdr->size);
2497 err = b43_write_initvals(dev, ivals, count,
2498 fw->initvals_band.data->size - hdr_len);
2507 /* Initialize the GPIOs
2508 * http://bcm-specs.sipsolutions.net/GPIO
2510 static int b43_gpio_init(struct b43_wldev *dev)
2512 struct ssb_bus *bus = dev->dev->bus;
2513 struct ssb_device *gpiodev, *pcidev = NULL;
2516 b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
2517 & ~B43_MACCTL_GPOUTSMSK);
2519 b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)
2524 if (dev->dev->bus->chip_id == 0x4301) {
2528 if (0 /* FIXME: conditional unknown */ ) {
2529 b43_write16(dev, B43_MMIO_GPIO_MASK,
2530 b43_read16(dev, B43_MMIO_GPIO_MASK)
2535 if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_PACTRL) {
2536 b43_write16(dev, B43_MMIO_GPIO_MASK,
2537 b43_read16(dev, B43_MMIO_GPIO_MASK)
2542 if (dev->dev->id.revision >= 2)
2543 mask |= 0x0010; /* FIXME: This is redundant. */
2545 #ifdef CONFIG_SSB_DRIVER_PCICORE
2546 pcidev = bus->pcicore.dev;
2548 gpiodev = bus->chipco.dev ? : pcidev;
2551 ssb_write32(gpiodev, B43_GPIO_CONTROL,
2552 (ssb_read32(gpiodev, B43_GPIO_CONTROL)
2558 /* Turn off all GPIO stuff. Call this on module unload, for example. */
2559 static void b43_gpio_cleanup(struct b43_wldev *dev)
2561 struct ssb_bus *bus = dev->dev->bus;
2562 struct ssb_device *gpiodev, *pcidev = NULL;
2564 #ifdef CONFIG_SSB_DRIVER_PCICORE
2565 pcidev = bus->pcicore.dev;
2567 gpiodev = bus->chipco.dev ? : pcidev;
2570 ssb_write32(gpiodev, B43_GPIO_CONTROL, 0);
2573 /* http://bcm-specs.sipsolutions.net/EnableMac */
2574 void b43_mac_enable(struct b43_wldev *dev)
2576 if (b43_debug(dev, B43_DBG_FIRMWARE)) {
2579 fwstate = b43_shm_read16(dev, B43_SHM_SHARED,
2580 B43_SHM_SH_UCODESTAT);
2581 if ((fwstate != B43_SHM_SH_UCODESTAT_SUSP) &&
2582 (fwstate != B43_SHM_SH_UCODESTAT_SLEEP)) {
2583 b43err(dev->wl, "b43_mac_enable(): The firmware "
2584 "should be suspended, but current state is %u\n",
2589 dev->mac_suspended--;
2590 B43_WARN_ON(dev->mac_suspended < 0);
2591 if (dev->mac_suspended == 0) {
2592 b43_write32(dev, B43_MMIO_MACCTL,
2593 b43_read32(dev, B43_MMIO_MACCTL)
2594 | B43_MACCTL_ENABLED);
2595 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON,
2596 B43_IRQ_MAC_SUSPENDED);
2598 b43_read32(dev, B43_MMIO_MACCTL);
2599 b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2600 b43_power_saving_ctl_bits(dev, 0);
2604 /* http://bcm-specs.sipsolutions.net/SuspendMAC */
2605 void b43_mac_suspend(struct b43_wldev *dev)
2611 B43_WARN_ON(dev->mac_suspended < 0);
2613 if (dev->mac_suspended == 0) {
2614 b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
2615 b43_write32(dev, B43_MMIO_MACCTL,
2616 b43_read32(dev, B43_MMIO_MACCTL)
2617 & ~B43_MACCTL_ENABLED);
2618 /* force pci to flush the write */
2619 b43_read32(dev, B43_MMIO_MACCTL);
2620 for (i = 35; i; i--) {
2621 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2622 if (tmp & B43_IRQ_MAC_SUSPENDED)
2626 /* Hm, it seems this will take some time. Use msleep(). */
2627 for (i = 40; i; i--) {
2628 tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2629 if (tmp & B43_IRQ_MAC_SUSPENDED)
2633 b43err(dev->wl, "MAC suspend failed\n");
2636 dev->mac_suspended++;
2639 static void b43_adjust_opmode(struct b43_wldev *dev)
2641 struct b43_wl *wl = dev->wl;
2645 ctl = b43_read32(dev, B43_MMIO_MACCTL);
2646 /* Reset status to STA infrastructure mode. */
2647 ctl &= ~B43_MACCTL_AP;
2648 ctl &= ~B43_MACCTL_KEEP_CTL;
2649 ctl &= ~B43_MACCTL_KEEP_BADPLCP;
2650 ctl &= ~B43_MACCTL_KEEP_BAD;
2651 ctl &= ~B43_MACCTL_PROMISC;
2652 ctl &= ~B43_MACCTL_BEACPROMISC;
2653 ctl |= B43_MACCTL_INFRA;
2655 if (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
2656 b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
2657 ctl |= B43_MACCTL_AP;
2658 else if (b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
2659 ctl &= ~B43_MACCTL_INFRA;
2661 if (wl->filter_flags & FIF_CONTROL)
2662 ctl |= B43_MACCTL_KEEP_CTL;
2663 if (wl->filter_flags & FIF_FCSFAIL)
2664 ctl |= B43_MACCTL_KEEP_BAD;
2665 if (wl->filter_flags & FIF_PLCPFAIL)
2666 ctl |= B43_MACCTL_KEEP_BADPLCP;
2667 if (wl->filter_flags & FIF_PROMISC_IN_BSS)
2668 ctl |= B43_MACCTL_PROMISC;
2669 if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
2670 ctl |= B43_MACCTL_BEACPROMISC;
2672 /* Workaround: On old hardware the HW-MAC-address-filter
2673 * doesn't work properly, so always run promisc in filter
2674 * it in software. */
2675 if (dev->dev->id.revision <= 4)
2676 ctl |= B43_MACCTL_PROMISC;
2678 b43_write32(dev, B43_MMIO_MACCTL, ctl);
2681 if ((ctl & B43_MACCTL_INFRA) && !(ctl & B43_MACCTL_AP)) {
2682 if (dev->dev->bus->chip_id == 0x4306 &&
2683 dev->dev->bus->chip_rev == 3)
2688 b43_write16(dev, 0x612, cfp_pretbtt);
2690 /* FIXME: We don't currently implement the PMQ mechanism,
2691 * so always disable it. If we want to implement PMQ,
2692 * we need to enable it here (clear DISCPMQ) in AP mode.
2694 if (0 /* ctl & B43_MACCTL_AP */) {
2695 b43_write32(dev, B43_MMIO_MACCTL,
2696 b43_read32(dev, B43_MMIO_MACCTL)
2697 & ~B43_MACCTL_DISCPMQ);
2699 b43_write32(dev, B43_MMIO_MACCTL,
2700 b43_read32(dev, B43_MMIO_MACCTL)
2701 | B43_MACCTL_DISCPMQ);
2705 static void b43_rate_memory_write(struct b43_wldev *dev, u16 rate, int is_ofdm)
2711 offset += (b43_plcp_get_ratecode_ofdm(rate) & 0x000F) * 2;
2714 offset += (b43_plcp_get_ratecode_cck(rate) & 0x000F) * 2;
2716 b43_shm_write16(dev, B43_SHM_SHARED, offset + 0x20,
2717 b43_shm_read16(dev, B43_SHM_SHARED, offset));
2720 static void b43_rate_memory_init(struct b43_wldev *dev)
2722 switch (dev->phy.type) {
2726 case B43_PHYTYPE_LP:
2727 b43_rate_memory_write(dev, B43_OFDM_RATE_6MB, 1);
2728 b43_rate_memory_write(dev, B43_OFDM_RATE_12MB, 1);
2729 b43_rate_memory_write(dev, B43_OFDM_RATE_18MB, 1);
2730 b43_rate_memory_write(dev, B43_OFDM_RATE_24MB, 1);
2731 b43_rate_memory_write(dev, B43_OFDM_RATE_36MB, 1);
2732 b43_rate_memory_write(dev, B43_OFDM_RATE_48MB, 1);
2733 b43_rate_memory_write(dev, B43_OFDM_RATE_54MB, 1);
2734 if (dev->phy.type == B43_PHYTYPE_A)
2738 b43_rate_memory_write(dev, B43_CCK_RATE_1MB, 0);
2739 b43_rate_memory_write(dev, B43_CCK_RATE_2MB, 0);
2740 b43_rate_memory_write(dev, B43_CCK_RATE_5MB, 0);
2741 b43_rate_memory_write(dev, B43_CCK_RATE_11MB, 0);
2748 /* Set the default values for the PHY TX Control Words. */
2749 static void b43_set_phytxctl_defaults(struct b43_wldev *dev)
2753 ctl |= B43_TXH_PHY_ENC_CCK;
2754 ctl |= B43_TXH_PHY_ANT01AUTO;
2755 ctl |= B43_TXH_PHY_TXPWR;
2757 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
2758 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, ctl);
2759 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, ctl);
2762 /* Set the TX-Antenna for management frames sent by firmware. */
2763 static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna)
2768 ant = b43_antenna_to_phyctl(antenna);
2771 tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL);
2772 tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
2773 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, tmp);
2774 /* For Probe Resposes */
2775 tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL);
2776 tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
2777 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp);
2780 /* This is the opposite of b43_chip_init() */
2781 static void b43_chip_exit(struct b43_wldev *dev)
2784 b43_gpio_cleanup(dev);
2785 /* firmware is released later */
2788 /* Initialize the chip
2789 * http://bcm-specs.sipsolutions.net/ChipInit
2791 static int b43_chip_init(struct b43_wldev *dev)
2793 struct b43_phy *phy = &dev->phy;
2795 u32 value32, macctl;
2798 /* Initialize the MAC control */
2799 macctl = B43_MACCTL_IHR_ENABLED | B43_MACCTL_SHM_ENABLED;
2801 macctl |= B43_MACCTL_GMODE;
2802 macctl |= B43_MACCTL_INFRA;
2803 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2805 err = b43_request_firmware(dev);
2808 err = b43_upload_microcode(dev);
2810 goto out; /* firmware is released later */
2812 err = b43_gpio_init(dev);
2814 goto out; /* firmware is released later */
2816 err = b43_upload_initvals(dev);
2818 goto err_gpio_clean;
2820 /* Turn the Analog on and initialize the PHY. */
2821 phy->ops->switch_analog(dev, 1);
2822 err = b43_phy_init(dev);
2824 goto err_gpio_clean;
2826 /* Disable Interference Mitigation. */
2827 if (phy->ops->interf_mitigation)
2828 phy->ops->interf_mitigation(dev, B43_INTERFMODE_NONE);
2830 /* Select the antennae */
2831 if (phy->ops->set_rx_antenna)
2832 phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
2833 b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
2835 if (phy->type == B43_PHYTYPE_B) {
2836 value16 = b43_read16(dev, 0x005E);
2838 b43_write16(dev, 0x005E, value16);
2840 b43_write32(dev, 0x0100, 0x01000000);
2841 if (dev->dev->id.revision < 5)
2842 b43_write32(dev, 0x010C, 0x01000000);
2844 b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
2845 & ~B43_MACCTL_INFRA);
2846 b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
2847 | B43_MACCTL_INFRA);
2849 /* Probe Response Timeout value */
2850 /* FIXME: Default to 0, has to be set by ioctl probably... :-/ */
2851 b43_shm_write16(dev, B43_SHM_SHARED, 0x0074, 0x0000);
2853 /* Initially set the wireless operation mode. */
2854 b43_adjust_opmode(dev);
2856 if (dev->dev->id.revision < 3) {
2857 b43_write16(dev, 0x060E, 0x0000);
2858 b43_write16(dev, 0x0610, 0x8000);
2859 b43_write16(dev, 0x0604, 0x0000);
2860 b43_write16(dev, 0x0606, 0x0200);
2862 b43_write32(dev, 0x0188, 0x80000000);
2863 b43_write32(dev, 0x018C, 0x02000000);
2865 b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000);
2866 b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001DC00);
2867 b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00);
2868 b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00);
2869 b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00);
2870 b43_write32(dev, B43_MMIO_DMA4_IRQ_MASK, 0x0000DC00);
2871 b43_write32(dev, B43_MMIO_DMA5_IRQ_MASK, 0x0000DC00);
2873 value32 = ssb_read32(dev->dev, SSB_TMSLOW);
2874 value32 |= 0x00100000;
2875 ssb_write32(dev->dev, SSB_TMSLOW, value32);
2877 b43_write16(dev, B43_MMIO_POWERUP_DELAY,
2878 dev->dev->bus->chipco.fast_pwrup_delay);
2881 b43dbg(dev->wl, "Chip initialized\n");
2886 b43_gpio_cleanup(dev);
2890 static void b43_periodic_every60sec(struct b43_wldev *dev)
2892 const struct b43_phy_operations *ops = dev->phy.ops;
2894 if (ops->pwork_60sec)
2895 ops->pwork_60sec(dev);
2897 /* Force check the TX power emission now. */
2898 b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME);
2901 static void b43_periodic_every30sec(struct b43_wldev *dev)
2903 /* Update device statistics. */
2904 b43_calculate_link_quality(dev);
2907 static void b43_periodic_every15sec(struct b43_wldev *dev)
2909 struct b43_phy *phy = &dev->phy;
2912 if (dev->fw.opensource) {
2913 /* Check if the firmware is still alive.
2914 * It will reset the watchdog counter to 0 in its idle loop. */
2915 wdr = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_WATCHDOG_REG);
2916 if (unlikely(wdr)) {
2917 b43err(dev->wl, "Firmware watchdog: The firmware died!\n");
2918 b43_controller_restart(dev, "Firmware watchdog");
2921 b43_shm_write16(dev, B43_SHM_SCRATCH,
2922 B43_WATCHDOG_REG, 1);
2926 if (phy->ops->pwork_15sec)
2927 phy->ops->pwork_15sec(dev);
2929 atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
2933 if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
2936 b43dbg(dev->wl, "Stats: %7u IRQs/sec, %7u TX/sec, %7u RX/sec\n",
2937 dev->irq_count / 15,
2939 dev->rx_count / 15);
2943 for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
2944 if (dev->irq_bit_count[i]) {
2945 b43dbg(dev->wl, "Stats: %7u IRQ-%02u/sec (0x%08X)\n",
2946 dev->irq_bit_count[i] / 15, i, (1 << i));
2947 dev->irq_bit_count[i] = 0;
2954 static void do_periodic_work(struct b43_wldev *dev)
2958 state = dev->periodic_state;
2960 b43_periodic_every60sec(dev);
2962 b43_periodic_every30sec(dev);
2963 b43_periodic_every15sec(dev);
2966 /* Periodic work locking policy:
2967 * The whole periodic work handler is protected by
2968 * wl->mutex. If another lock is needed somewhere in the
2969 * pwork callchain, it's aquired in-place, where it's needed.
2971 static void b43_periodic_work_handler(struct work_struct *work)
2973 struct b43_wldev *dev = container_of(work, struct b43_wldev,
2974 periodic_work.work);
2975 struct b43_wl *wl = dev->wl;
2976 unsigned long delay;
2978 mutex_lock(&wl->mutex);
2980 if (unlikely(b43_status(dev) != B43_STAT_STARTED))
2982 if (b43_debug(dev, B43_DBG_PWORK_STOP))
2985 do_periodic_work(dev);
2987 dev->periodic_state++;
2989 if (b43_debug(dev, B43_DBG_PWORK_FAST))
2990 delay = msecs_to_jiffies(50);
2992 delay = round_jiffies_relative(HZ * 15);
2993 ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay);
2995 mutex_unlock(&wl->mutex);
2998 static void b43_periodic_tasks_setup(struct b43_wldev *dev)
3000 struct delayed_work *work = &dev->periodic_work;
3002 dev->periodic_state = 0;
3003 INIT_DELAYED_WORK(work, b43_periodic_work_handler);
3004 ieee80211_queue_delayed_work(dev->wl->hw, work, 0);
3007 /* Check if communication with the device works correctly. */
3008 static int b43_validate_chipaccess(struct b43_wldev *dev)
3010 u32 v, backup0, backup4;
3012 backup0 = b43_shm_read32(dev, B43_SHM_SHARED, 0);
3013 backup4 = b43_shm_read32(dev, B43_SHM_SHARED, 4);
3015 /* Check for read/write and endianness problems. */
3016 b43_shm_write32(dev, B43_SHM_SHARED, 0, 0x55AAAA55);
3017 if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0x55AAAA55)
3019 b43_shm_write32(dev, B43_SHM_SHARED, 0, 0xAA5555AA);
3020 if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0xAA5555AA)
3023 /* Check if unaligned 32bit SHM_SHARED access works properly.
3024 * However, don't bail out on failure, because it's noncritical. */
3025 b43_shm_write16(dev, B43_SHM_SHARED, 0, 0x1122);
3026 b43_shm_write16(dev, B43_SHM_SHARED, 2, 0x3344);
3027 b43_shm_write16(dev, B43_SHM_SHARED, 4, 0x5566);
3028 b43_shm_write16(dev, B43_SHM_SHARED, 6, 0x7788);
3029 if (b43_shm_read32(dev, B43_SHM_SHARED, 2) != 0x55663344)
3030 b43warn(dev->wl, "Unaligned 32bit SHM read access is broken\n");
3031 b43_shm_write32(dev, B43_SHM_SHARED, 2, 0xAABBCCDD);
3032 if (b43_shm_read16(dev, B43_SHM_SHARED, 0) != 0x1122 ||
3033 b43_shm_read16(dev, B43_SHM_SHARED, 2) != 0xCCDD ||
3034 b43_shm_read16(dev, B43_SHM_SHARED, 4) != 0xAABB ||
3035 b43_shm_read16(dev, B43_SHM_SHARED, 6) != 0x7788)
3036 b43warn(dev->wl, "Unaligned 32bit SHM write access is broken\n");
3038 b43_shm_write32(dev, B43_SHM_SHARED, 0, backup0);
3039 b43_shm_write32(dev, B43_SHM_SHARED, 4, backup4);
3041 if ((dev->dev->id.revision >= 3) && (dev->dev->id.revision <= 10)) {
3042 /* The 32bit register shadows the two 16bit registers
3043 * with update sideeffects. Validate this. */
3044 b43_write16(dev, B43_MMIO_TSF_CFP_START, 0xAAAA);
3045 b43_write32(dev, B43_MMIO_TSF_CFP_START, 0xCCCCBBBB);
3046 if (b43_read16(dev, B43_MMIO_TSF_CFP_START_LOW) != 0xBBBB)
3048 if (b43_read16(dev, B43_MMIO_TSF_CFP_START_HIGH) != 0xCCCC)
3051 b43_write32(dev, B43_MMIO_TSF_CFP_START, 0);
3053 v = b43_read32(dev, B43_MMIO_MACCTL);
3054 v |= B43_MACCTL_GMODE;
3055 if (v != (B43_MACCTL_GMODE | B43_MACCTL_IHR_ENABLED))
3060 b43err(dev->wl, "Failed to validate the chipaccess\n");
3064 static void b43_security_init(struct b43_wldev *dev)
3066 dev->ktp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_KTP);
3067 /* KTP is a word address, but we address SHM bytewise.
3068 * So multiply by two.
3071 /* Number of RCMTA address slots */
3072 b43_write16(dev, B43_MMIO_RCMTA_COUNT, B43_NR_PAIRWISE_KEYS);
3073 /* Clear the key memory. */
3074 b43_clear_keys(dev);
3077 #ifdef CONFIG_B43_HWRNG
3078 static int b43_rng_read(struct hwrng *rng, u32 *data)
3080 struct b43_wl *wl = (struct b43_wl *)rng->priv;
3081 struct b43_wldev *dev;
3082 int count = -ENODEV;
3084 mutex_lock(&wl->mutex);
3085 dev = wl->current_dev;
3086 if (likely(dev && b43_status(dev) >= B43_STAT_INITIALIZED)) {
3087 *data = b43_read16(dev, B43_MMIO_RNG);
3088 count = sizeof(u16);
3090 mutex_unlock(&wl->mutex);
3094 #endif /* CONFIG_B43_HWRNG */
3096 static void b43_rng_exit(struct b43_wl *wl)
3098 #ifdef CONFIG_B43_HWRNG
3099 if (wl->rng_initialized)
3100 hwrng_unregister(&wl->rng);
3101 #endif /* CONFIG_B43_HWRNG */
3104 static int b43_rng_init(struct b43_wl *wl)
3108 #ifdef CONFIG_B43_HWRNG
3109 snprintf(wl->rng_name, ARRAY_SIZE(wl->rng_name),
3110 "%s_%s", KBUILD_MODNAME, wiphy_name(wl->hw->wiphy));
3111 wl->rng.name = wl->rng_name;
3112 wl->rng.data_read = b43_rng_read;
3113 wl->rng.priv = (unsigned long)wl;
3114 wl->rng_initialized = 1;
3115 err = hwrng_register(&wl->rng);
3117 wl->rng_initialized = 0;
3118 b43err(wl, "Failed to register the random "
3119 "number generator (%d)\n", err);
3121 #endif /* CONFIG_B43_HWRNG */
3126 static void b43_tx_work(struct work_struct *work)
3128 struct b43_wl *wl = container_of(work, struct b43_wl, tx_work);
3129 struct b43_wldev *dev;
3130 struct sk_buff *skb;
3133 mutex_lock(&wl->mutex);
3134 dev = wl->current_dev;
3135 if (unlikely(!dev || b43_status(dev) < B43_STAT_STARTED)) {
3136 mutex_unlock(&wl->mutex);
3140 while (skb_queue_len(&wl->tx_queue)) {
3141 skb = skb_dequeue(&wl->tx_queue);
3143 if (b43_using_pio_transfers(dev))
3144 err = b43_pio_tx(dev, skb);
3146 err = b43_dma_tx(dev, skb);
3148 dev_kfree_skb(skb); /* Drop it */
3154 mutex_unlock(&wl->mutex);
3157 static int b43_op_tx(struct ieee80211_hw *hw,
3158 struct sk_buff *skb)
3160 struct b43_wl *wl = hw_to_b43_wl(hw);
3162 if (unlikely(skb->len < 2 + 2 + 6)) {
3163 /* Too short, this can't be a valid frame. */
3164 dev_kfree_skb_any(skb);
3165 return NETDEV_TX_OK;
3167 B43_WARN_ON(skb_shinfo(skb)->nr_frags);
3169 skb_queue_tail(&wl->tx_queue, skb);
3170 ieee80211_queue_work(wl->hw, &wl->tx_work);
3172 return NETDEV_TX_OK;
3175 static void b43_qos_params_upload(struct b43_wldev *dev,
3176 const struct ieee80211_tx_queue_params *p,
3179 u16 params[B43_NR_QOSPARAMS];
3183 if (!dev->qos_enabled)
3186 bslots = b43_read16(dev, B43_MMIO_RNG) & p->cw_min;
3188 memset(¶ms, 0, sizeof(params));
3190 params[B43_QOSPARAM_TXOP] = p->txop * 32;
3191 params[B43_QOSPARAM_CWMIN] = p->cw_min;
3192 params[B43_QOSPARAM_CWMAX] = p->cw_max;
3193 params[B43_QOSPARAM_CWCUR] = p->cw_min;
3194 params[B43_QOSPARAM_AIFS] = p->aifs;
3195 params[B43_QOSPARAM_BSLOTS] = bslots;
3196 params[B43_QOSPARAM_REGGAP] = bslots + p->aifs;
3198 for (i = 0; i < ARRAY_SIZE(params); i++) {
3199 if (i == B43_QOSPARAM_STATUS) {
3200 tmp = b43_shm_read16(dev, B43_SHM_SHARED,
3201 shm_offset + (i * 2));
3202 /* Mark the parameters as updated. */
3204 b43_shm_write16(dev, B43_SHM_SHARED,
3205 shm_offset + (i * 2),
3208 b43_shm_write16(dev, B43_SHM_SHARED,
3209 shm_offset + (i * 2),
3215 /* Mapping of mac80211 queue numbers to b43 QoS SHM offsets. */
3216 static const u16 b43_qos_shm_offsets[] = {
3217 /* [mac80211-queue-nr] = SHM_OFFSET, */
3218 [0] = B43_QOS_VOICE,
3219 [1] = B43_QOS_VIDEO,
3220 [2] = B43_QOS_BESTEFFORT,
3221 [3] = B43_QOS_BACKGROUND,
3224 /* Update all QOS parameters in hardware. */
3225 static void b43_qos_upload_all(struct b43_wldev *dev)
3227 struct b43_wl *wl = dev->wl;
3228 struct b43_qos_params *params;
3231 if (!dev->qos_enabled)
3234 BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3235 ARRAY_SIZE(wl->qos_params));
3237 b43_mac_suspend(dev);
3238 for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3239 params = &(wl->qos_params[i]);
3240 b43_qos_params_upload(dev, &(params->p),
3241 b43_qos_shm_offsets[i]);
3243 b43_mac_enable(dev);
3246 static void b43_qos_clear(struct b43_wl *wl)
3248 struct b43_qos_params *params;
3251 /* Initialize QoS parameters to sane defaults. */
3253 BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3254 ARRAY_SIZE(wl->qos_params));
3256 for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3257 params = &(wl->qos_params[i]);
3259 switch (b43_qos_shm_offsets[i]) {
3263 params->p.cw_min = 0x0001;
3264 params->p.cw_max = 0x0001;
3269 params->p.cw_min = 0x0001;
3270 params->p.cw_max = 0x0001;
3272 case B43_QOS_BESTEFFORT:
3275 params->p.cw_min = 0x0001;
3276 params->p.cw_max = 0x03FF;
3278 case B43_QOS_BACKGROUND:
3281 params->p.cw_min = 0x0001;
3282 params->p.cw_max = 0x03FF;
3290 /* Initialize the core's QOS capabilities */
3291 static void b43_qos_init(struct b43_wldev *dev)
3293 if (!dev->qos_enabled) {
3294 /* Disable QOS support. */
3295 b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_EDCF);
3296 b43_write16(dev, B43_MMIO_IFSCTL,
3297 b43_read16(dev, B43_MMIO_IFSCTL)
3298 & ~B43_MMIO_IFSCTL_USE_EDCF);
3299 b43dbg(dev->wl, "QoS disabled\n");
3303 /* Upload the current QOS parameters. */
3304 b43_qos_upload_all(dev);
3306 /* Enable QOS support. */
3307 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_EDCF);
3308 b43_write16(dev, B43_MMIO_IFSCTL,
3309 b43_read16(dev, B43_MMIO_IFSCTL)
3310 | B43_MMIO_IFSCTL_USE_EDCF);
3311 b43dbg(dev->wl, "QoS enabled\n");
3314 static int b43_op_conf_tx(struct ieee80211_hw *hw, u16 _queue,
3315 const struct ieee80211_tx_queue_params *params)
3317 struct b43_wl *wl = hw_to_b43_wl(hw);
3318 struct b43_wldev *dev;
3319 unsigned int queue = (unsigned int)_queue;
3322 if (queue >= ARRAY_SIZE(wl->qos_params)) {
3323 /* Queue not available or don't support setting
3324 * params on this queue. Return success to not
3325 * confuse mac80211. */
3328 BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3329 ARRAY_SIZE(wl->qos_params));
3331 mutex_lock(&wl->mutex);
3332 dev = wl->current_dev;
3333 if (unlikely(!dev || (b43_status(dev) < B43_STAT_INITIALIZED)))
3336 memcpy(&(wl->qos_params[queue].p), params, sizeof(*params));
3337 b43_mac_suspend(dev);
3338 b43_qos_params_upload(dev, &(wl->qos_params[queue].p),
3339 b43_qos_shm_offsets[queue]);
3340 b43_mac_enable(dev);
3344 mutex_unlock(&wl->mutex);
3349 static int b43_op_get_tx_stats(struct ieee80211_hw *hw,
3350 struct ieee80211_tx_queue_stats *stats)
3352 struct b43_wl *wl = hw_to_b43_wl(hw);
3353 struct b43_wldev *dev;
3356 mutex_lock(&wl->mutex);
3357 dev = wl->current_dev;
3358 if (dev && b43_status(dev) >= B43_STAT_STARTED) {
3359 if (b43_using_pio_transfers(dev))
3360 b43_pio_get_tx_stats(dev, stats);
3362 b43_dma_get_tx_stats(dev, stats);
3365 mutex_unlock(&wl->mutex);
3370 static int b43_op_get_stats(struct ieee80211_hw *hw,
3371 struct ieee80211_low_level_stats *stats)
3373 struct b43_wl *wl = hw_to_b43_wl(hw);
3375 mutex_lock(&wl->mutex);
3376 memcpy(stats, &wl->ieee_stats, sizeof(*stats));
3377 mutex_unlock(&wl->mutex);
3382 static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
3384 struct b43_wl *wl = hw_to_b43_wl(hw);
3385 struct b43_wldev *dev;
3388 mutex_lock(&wl->mutex);
3389 dev = wl->current_dev;
3391 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3392 b43_tsf_read(dev, &tsf);
3396 mutex_unlock(&wl->mutex);
3401 static void b43_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
3403 struct b43_wl *wl = hw_to_b43_wl(hw);
3404 struct b43_wldev *dev;
3406 mutex_lock(&wl->mutex);
3407 dev = wl->current_dev;
3409 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3410 b43_tsf_write(dev, tsf);
3412 mutex_unlock(&wl->mutex);
3415 static void b43_put_phy_into_reset(struct b43_wldev *dev)
3417 struct ssb_device *sdev = dev->dev;
3420 tmslow = ssb_read32(sdev, SSB_TMSLOW);
3421 tmslow &= ~B43_TMSLOW_GMODE;
3422 tmslow |= B43_TMSLOW_PHYRESET;
3423 tmslow |= SSB_TMSLOW_FGC;
3424 ssb_write32(sdev, SSB_TMSLOW, tmslow);
3427 tmslow = ssb_read32(sdev, SSB_TMSLOW);
3428 tmslow &= ~SSB_TMSLOW_FGC;
3429 tmslow |= B43_TMSLOW_PHYRESET;
3430 ssb_write32(sdev, SSB_TMSLOW, tmslow);
3434 static const char *band_to_string(enum ieee80211_band band)
3437 case IEEE80211_BAND_5GHZ:
3439 case IEEE80211_BAND_2GHZ:
3448 /* Expects wl->mutex locked */
3449 static int b43_switch_band(struct b43_wl *wl, struct ieee80211_channel *chan)
3451 struct b43_wldev *up_dev = NULL;
3452 struct b43_wldev *down_dev;
3453 struct b43_wldev *d;
3455 bool uninitialized_var(gmode);
3458 /* Find a device and PHY which supports the band. */
3459 list_for_each_entry(d, &wl->devlist, list) {
3460 switch (chan->band) {
3461 case IEEE80211_BAND_5GHZ:
3462 if (d->phy.supports_5ghz) {
3467 case IEEE80211_BAND_2GHZ:
3468 if (d->phy.supports_2ghz) {
3481 b43err(wl, "Could not find a device for %s-GHz band operation\n",
3482 band_to_string(chan->band));
3485 if ((up_dev == wl->current_dev) &&
3486 (!!wl->current_dev->phy.gmode == !!gmode)) {
3487 /* This device is already running. */
3490 b43dbg(wl, "Switching to %s-GHz band\n",
3491 band_to_string(chan->band));
3492 down_dev = wl->current_dev;
3494 prev_status = b43_status(down_dev);
3495 /* Shutdown the currently running core. */
3496 if (prev_status >= B43_STAT_STARTED)
3497 down_dev = b43_wireless_core_stop(down_dev);
3498 if (prev_status >= B43_STAT_INITIALIZED)
3499 b43_wireless_core_exit(down_dev);
3501 if (down_dev != up_dev) {
3502 /* We switch to a different core, so we put PHY into
3503 * RESET on the old core. */
3504 b43_put_phy_into_reset(down_dev);
3507 /* Now start the new core. */
3508 up_dev->phy.gmode = gmode;
3509 if (prev_status >= B43_STAT_INITIALIZED) {
3510 err = b43_wireless_core_init(up_dev);
3512 b43err(wl, "Fatal: Could not initialize device for "
3513 "selected %s-GHz band\n",
3514 band_to_string(chan->band));
3518 if (prev_status >= B43_STAT_STARTED) {
3519 err = b43_wireless_core_start(up_dev);
3521 b43err(wl, "Fatal: Coult not start device for "
3522 "selected %s-GHz band\n",
3523 band_to_string(chan->band));
3524 b43_wireless_core_exit(up_dev);
3528 B43_WARN_ON(b43_status(up_dev) != prev_status);
3530 wl->current_dev = up_dev;
3534 /* Whoops, failed to init the new core. No core is operating now. */
3535 wl->current_dev = NULL;
3539 /* Write the short and long frame retry limit values. */
3540 static void b43_set_retry_limits(struct b43_wldev *dev,
3541 unsigned int short_retry,
3542 unsigned int long_retry)
3544 /* The retry limit is a 4-bit counter. Enforce this to avoid overflowing
3545 * the chip-internal counter. */
3546 short_retry = min(short_retry, (unsigned int)0xF);
3547 long_retry = min(long_retry, (unsigned int)0xF);
3549 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT,
3551 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT,
3555 static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
3557 struct b43_wl *wl = hw_to_b43_wl(hw);
3558 struct b43_wldev *dev;
3559 struct b43_phy *phy;
3560 struct ieee80211_conf *conf = &hw->conf;
3564 mutex_lock(&wl->mutex);
3566 /* Switch the band (if necessary). This might change the active core. */
3567 err = b43_switch_band(wl, conf->channel);
3569 goto out_unlock_mutex;
3570 dev = wl->current_dev;
3573 b43_mac_suspend(dev);
3575 if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
3576 b43_set_retry_limits(dev, conf->short_frame_max_tx_count,
3577 conf->long_frame_max_tx_count);
3578 changed &= ~IEEE80211_CONF_CHANGE_RETRY_LIMITS;
3580 goto out_mac_enable;
3582 /* Switch to the requested channel.
3583 * The firmware takes care of races with the TX handler. */
3584 if (conf->channel->hw_value != phy->channel)
3585 b43_switch_channel(dev, conf->channel->hw_value);
3587 dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
3589 /* Adjust the desired TX power level. */
3590 if (conf->power_level != 0) {
3591 if (conf->power_level != phy->desired_txpower) {
3592 phy->desired_txpower = conf->power_level;
3593 b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME |
3594 B43_TXPWR_IGNORE_TSSI);
3598 /* Antennas for RX and management frame TX. */
3599 antenna = B43_ANTENNA_DEFAULT;
3600 b43_mgmtframe_txantenna(dev, antenna);
3601 antenna = B43_ANTENNA_DEFAULT;
3602 if (phy->ops->set_rx_antenna)
3603 phy->ops->set_rx_antenna(dev, antenna);
3605 if (wl->radio_enabled != phy->radio_on) {
3606 if (wl->radio_enabled) {
3607 b43_software_rfkill(dev, false);
3608 b43info(dev->wl, "Radio turned on by software\n");
3609 if (!dev->radio_hw_enable) {
3610 b43info(dev->wl, "The hardware RF-kill button "
3611 "still turns the radio physically off. "
3612 "Press the button to turn it on.\n");
3615 b43_software_rfkill(dev, true);
3616 b43info(dev->wl, "Radio turned off by software\n");
3621 b43_mac_enable(dev);
3623 mutex_unlock(&wl->mutex);
3628 static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
3630 struct ieee80211_supported_band *sband =
3631 dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
3632 struct ieee80211_rate *rate;
3634 u16 basic, direct, offset, basic_offset, rateptr;
3636 for (i = 0; i < sband->n_bitrates; i++) {
3637 rate = &sband->bitrates[i];
3639 if (b43_is_cck_rate(rate->hw_value)) {
3640 direct = B43_SHM_SH_CCKDIRECT;
3641 basic = B43_SHM_SH_CCKBASIC;
3642 offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3645 direct = B43_SHM_SH_OFDMDIRECT;
3646 basic = B43_SHM_SH_OFDMBASIC;
3647 offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3651 rate = ieee80211_get_response_rate(sband, brates, rate->bitrate);
3653 if (b43_is_cck_rate(rate->hw_value)) {
3654 basic_offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3655 basic_offset &= 0xF;
3657 basic_offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3658 basic_offset &= 0xF;
3662 * Get the pointer that we need to point to
3663 * from the direct map
3665 rateptr = b43_shm_read16(dev, B43_SHM_SHARED,
3666 direct + 2 * basic_offset);
3667 /* and write it to the basic map */
3668 b43_shm_write16(dev, B43_SHM_SHARED, basic + 2 * offset,
3673 static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
3674 struct ieee80211_vif *vif,
3675 struct ieee80211_bss_conf *conf,
3678 struct b43_wl *wl = hw_to_b43_wl(hw);
3679 struct b43_wldev *dev;
3681 mutex_lock(&wl->mutex);
3683 dev = wl->current_dev;
3684 if (!dev || b43_status(dev) < B43_STAT_STARTED)
3685 goto out_unlock_mutex;
3687 B43_WARN_ON(wl->vif != vif);
3689 if (changed & BSS_CHANGED_BSSID) {
3691 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
3693 memset(wl->bssid, 0, ETH_ALEN);
3696 if (b43_status(dev) >= B43_STAT_INITIALIZED) {
3697 if (changed & BSS_CHANGED_BEACON &&
3698 (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
3699 b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
3700 b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
3701 b43_update_templates(wl);
3703 if (changed & BSS_CHANGED_BSSID)
3704 b43_write_mac_bssid_templates(dev);
3707 b43_mac_suspend(dev);
3709 /* Update templates for AP/mesh mode. */
3710 if (changed & BSS_CHANGED_BEACON_INT &&
3711 (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
3712 b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
3713 b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
3714 b43_set_beacon_int(dev, conf->beacon_int);
3716 if (changed & BSS_CHANGED_BASIC_RATES)
3717 b43_update_basic_rates(dev, conf->basic_rates);
3719 if (changed & BSS_CHANGED_ERP_SLOT) {
3720 if (conf->use_short_slot)
3721 b43_short_slot_timing_enable(dev);
3723 b43_short_slot_timing_disable(dev);
3726 b43_mac_enable(dev);
3728 mutex_unlock(&wl->mutex);
3731 static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3732 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3733 struct ieee80211_key_conf *key)
3735 struct b43_wl *wl = hw_to_b43_wl(hw);
3736 struct b43_wldev *dev;
3740 static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
3742 if (modparam_nohwcrypt)
3743 return -ENOSPC; /* User disabled HW-crypto */
3745 mutex_lock(&wl->mutex);
3747 dev = wl->current_dev;
3749 if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
3752 if (dev->fw.pcm_request_failed || !dev->hwcrypto_enabled) {
3753 /* We don't have firmware for the crypto engine.
3754 * Must use software-crypto. */
3762 if (key->keylen == WLAN_KEY_LEN_WEP40)
3763 algorithm = B43_SEC_ALGO_WEP40;
3765 algorithm = B43_SEC_ALGO_WEP104;
3768 algorithm = B43_SEC_ALGO_TKIP;
3771 algorithm = B43_SEC_ALGO_AES;
3777 index = (u8) (key->keyidx);
3783 if (algorithm == B43_SEC_ALGO_TKIP &&
3784 (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE) ||
3785 !modparam_hwtkip)) {
3786 /* We support only pairwise key */
3791 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3792 if (WARN_ON(!sta)) {
3796 /* Pairwise key with an assigned MAC address. */
3797 err = b43_key_write(dev, -1, algorithm,
3798 key->key, key->keylen,
3802 err = b43_key_write(dev, index, algorithm,
3803 key->key, key->keylen, NULL, key);
3808 if (algorithm == B43_SEC_ALGO_WEP40 ||
3809 algorithm == B43_SEC_ALGO_WEP104) {
3810 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_USEDEFKEYS);
3813 b43_hf_read(dev) & ~B43_HF_USEDEFKEYS);
3815 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
3816 if (algorithm == B43_SEC_ALGO_TKIP)
3817 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
3820 err = b43_key_clear(dev, key->hw_key_idx);
3831 b43dbg(wl, "%s hardware based encryption for keyidx: %d, "
3833 cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
3834 sta ? sta->addr : bcast_addr);
3835 b43_dump_keymemory(dev);
3837 mutex_unlock(&wl->mutex);
3842 static void b43_op_configure_filter(struct ieee80211_hw *hw,
3843 unsigned int changed, unsigned int *fflags,
3846 struct b43_wl *wl = hw_to_b43_wl(hw);
3847 struct b43_wldev *dev;
3849 mutex_lock(&wl->mutex);
3850 dev = wl->current_dev;
3856 *fflags &= FIF_PROMISC_IN_BSS |
3862 FIF_BCN_PRBRESP_PROMISC;
3864 changed &= FIF_PROMISC_IN_BSS |
3870 FIF_BCN_PRBRESP_PROMISC;
3872 wl->filter_flags = *fflags;
3874 if (changed && b43_status(dev) >= B43_STAT_INITIALIZED)
3875 b43_adjust_opmode(dev);
3878 mutex_unlock(&wl->mutex);
3881 /* Locking: wl->mutex
3882 * Returns the current dev. This might be different from the passed in dev,
3883 * because the core might be gone away while we unlocked the mutex. */
3884 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev)
3886 struct b43_wl *wl = dev->wl;
3887 struct b43_wldev *orig_dev;
3891 if (!dev || b43_status(dev) < B43_STAT_STARTED)
3894 /* Cancel work. Unlock to avoid deadlocks. */
3895 mutex_unlock(&wl->mutex);
3896 cancel_delayed_work_sync(&dev->periodic_work);
3897 cancel_work_sync(&wl->tx_work);
3898 mutex_lock(&wl->mutex);
3899 dev = wl->current_dev;
3900 if (!dev || b43_status(dev) < B43_STAT_STARTED) {
3901 /* Whoops, aliens ate up the device while we were unlocked. */
3905 /* Disable interrupts on the device. */
3906 b43_set_status(dev, B43_STAT_INITIALIZED);
3907 if (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) {
3908 /* wl->mutex is locked. That is enough. */
3909 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
3910 b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */
3912 spin_lock_irq(&wl->hardirq_lock);
3913 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
3914 b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */
3915 spin_unlock_irq(&wl->hardirq_lock);
3917 /* Synchronize and free the interrupt handlers. Unlock to avoid deadlocks. */
3919 mutex_unlock(&wl->mutex);
3920 if (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) {
3921 b43_sdio_free_irq(dev);
3923 synchronize_irq(dev->dev->irq);
3924 free_irq(dev->dev->irq, dev);
3926 mutex_lock(&wl->mutex);
3927 dev = wl->current_dev;
3930 if (dev != orig_dev) {
3931 if (b43_status(dev) >= B43_STAT_STARTED)
3935 mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
3936 B43_WARN_ON(mask != 0xFFFFFFFF && mask);
3938 /* Drain the TX queue */
3939 while (skb_queue_len(&wl->tx_queue))
3940 dev_kfree_skb(skb_dequeue(&wl->tx_queue));
3942 b43_mac_suspend(dev);
3944 b43dbg(wl, "Wireless interface stopped\n");
3949 /* Locking: wl->mutex */
3950 static int b43_wireless_core_start(struct b43_wldev *dev)
3954 B43_WARN_ON(b43_status(dev) != B43_STAT_INITIALIZED);
3956 drain_txstatus_queue(dev);
3957 if (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) {
3958 err = b43_sdio_request_irq(dev, b43_sdio_interrupt_handler);
3960 b43err(dev->wl, "Cannot request SDIO IRQ\n");
3964 err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
3965 b43_interrupt_thread_handler,
3966 IRQF_SHARED, KBUILD_MODNAME, dev);
3968 b43err(dev->wl, "Cannot request IRQ-%d\n", dev->dev->irq);
3973 /* We are ready to run. */
3974 b43_set_status(dev, B43_STAT_STARTED);
3976 /* Start data flow (TX/RX). */
3977 b43_mac_enable(dev);
3978 b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
3980 /* Start maintainance work */
3981 b43_periodic_tasks_setup(dev);
3985 b43dbg(dev->wl, "Wireless interface started\n");
3990 /* Get PHY and RADIO versioning numbers */
3991 static int b43_phy_versioning(struct b43_wldev *dev)
3993 struct b43_phy *phy = &dev->phy;
4001 int unsupported = 0;
4003 /* Get PHY versioning */
4004 tmp = b43_read16(dev, B43_MMIO_PHY_VER);
4005 analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT;
4006 phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT;
4007 phy_rev = (tmp & B43_PHYVER_VERSION);
4014 if (phy_rev != 2 && phy_rev != 4 && phy_rev != 6
4022 #ifdef CONFIG_B43_NPHY
4028 #ifdef CONFIG_B43_PHY_LP
4029 case B43_PHYTYPE_LP:
4038 b43err(dev->wl, "FOUND UNSUPPORTED PHY "
4039 "(Analog %u, Type %u, Revision %u)\n",
4040 analog_type, phy_type, phy_rev);
4043 b43dbg(dev->wl, "Found PHY: Analog %u, Type %u, Revision %u\n",
4044 analog_type, phy_type, phy_rev);
4046 /* Get RADIO versioning */
4047 if (dev->dev->bus->chip_id == 0x4317) {
4048 if (dev->dev->bus->chip_rev == 0)
4050 else if (dev->dev->bus->chip_rev == 1)
4055 b43_write16(dev, B43_MMIO_RADIO_CONTROL, B43_RADIOCTL_ID);
4056 tmp = b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
4057 b43_write16(dev, B43_MMIO_RADIO_CONTROL, B43_RADIOCTL_ID);
4058 tmp |= (u32)b43_read16(dev, B43_MMIO_RADIO_DATA_HIGH) << 16;
4060 radio_manuf = (tmp & 0x00000FFF);
4061 radio_ver = (tmp & 0x0FFFF000) >> 12;
4062 radio_rev = (tmp & 0xF0000000) >> 28;
4063 if (radio_manuf != 0x17F /* Broadcom */)
4067 if (radio_ver != 0x2060)
4071 if (radio_manuf != 0x17F)
4075 if ((radio_ver & 0xFFF0) != 0x2050)
4079 if (radio_ver != 0x2050)
4083 if (radio_ver != 0x2055 && radio_ver != 0x2056)
4086 case B43_PHYTYPE_LP:
4087 if (radio_ver != 0x2062 && radio_ver != 0x2063)
4094 b43err(dev->wl, "FOUND UNSUPPORTED RADIO "
4095 "(Manuf 0x%X, Version 0x%X, Revision %u)\n",
4096 radio_manuf, radio_ver, radio_rev);
4099 b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n",
4100 radio_manuf, radio_ver, radio_rev);
4102 phy->radio_manuf = radio_manuf;
4103 phy->radio_ver = radio_ver;
4104 phy->radio_rev = radio_rev;
4106 phy->analog = analog_type;
4107 phy->type = phy_type;
4113 static void setup_struct_phy_for_init(struct b43_wldev *dev,
4114 struct b43_phy *phy)
4116 phy->hardware_power_control = !!modparam_hwpctl;
4117 phy->next_txpwr_check_time = jiffies;
4118 /* PHY TX errors counter. */
4119 atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
4122 phy->phy_locked = 0;
4123 phy->radio_locked = 0;
4127 static void setup_struct_wldev_for_init(struct b43_wldev *dev)
4131 /* Assume the radio is enabled. If it's not enabled, the state will
4132 * immediately get fixed on the first periodic work run. */
4133 dev->radio_hw_enable = 1;
4136 memset(&dev->stats, 0, sizeof(dev->stats));
4138 setup_struct_phy_for_init(dev, &dev->phy);
4140 /* IRQ related flags */
4141 dev->irq_reason = 0;
4142 memset(dev->dma_reason, 0, sizeof(dev->dma_reason));
4143 dev->irq_mask = B43_IRQ_MASKTEMPLATE;
4144 if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
4145 dev->irq_mask &= ~B43_IRQ_PHY_TXERR;
4147 dev->mac_suspended = 1;
4149 /* Noise calculation context */
4150 memset(&dev->noisecalc, 0, sizeof(dev->noisecalc));
4153 static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
4155 struct ssb_sprom *sprom = &dev->dev->bus->sprom;
4158 if (!modparam_btcoex)
4160 if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
4162 if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode)
4165 hf = b43_hf_read(dev);
4166 if (sprom->boardflags_lo & B43_BFL_BTCMOD)
4167 hf |= B43_HF_BTCOEXALT;
4169 hf |= B43_HF_BTCOEX;
4170 b43_hf_write(dev, hf);
4173 static void b43_bluetooth_coext_disable(struct b43_wldev *dev)
4175 if (!modparam_btcoex)
4180 static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
4182 #ifdef CONFIG_SSB_DRIVER_PCICORE
4183 struct ssb_bus *bus = dev->dev->bus;
4186 if (bus->pcicore.dev &&
4187 bus->pcicore.dev->id.coreid == SSB_DEV_PCI &&
4188 bus->pcicore.dev->id.revision <= 5) {
4189 /* IMCFGLO timeouts workaround. */
4190 tmp = ssb_read32(dev->dev, SSB_IMCFGLO);
4191 switch (bus->bustype) {
4192 case SSB_BUSTYPE_PCI:
4193 case SSB_BUSTYPE_PCMCIA:
4194 tmp &= ~SSB_IMCFGLO_REQTO;
4195 tmp &= ~SSB_IMCFGLO_SERTO;
4198 case SSB_BUSTYPE_SSB:
4199 tmp &= ~SSB_IMCFGLO_REQTO;
4200 tmp &= ~SSB_IMCFGLO_SERTO;
4206 ssb_write32(dev->dev, SSB_IMCFGLO, tmp);
4208 #endif /* CONFIG_SSB_DRIVER_PCICORE */
4211 static void b43_set_synth_pu_delay(struct b43_wldev *dev, bool idle)
4215 /* The time value is in microseconds. */
4216 if (dev->phy.type == B43_PHYTYPE_A)
4220 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle)
4222 if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8))
4223 pu_delay = max(pu_delay, (u16)2400);
4225 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SPUWKUP, pu_delay);
4228 /* Set the TSF CFP pre-TargetBeaconTransmissionTime. */
4229 static void b43_set_pretbtt(struct b43_wldev *dev)
4233 /* The time value is in microseconds. */
4234 if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) {
4237 if (dev->phy.type == B43_PHYTYPE_A)
4242 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRETBTT, pretbtt);
4243 b43_write16(dev, B43_MMIO_TSF_CFP_PRETBTT, pretbtt);
4246 /* Shutdown a wireless core */
4247 /* Locking: wl->mutex */
4248 static void b43_wireless_core_exit(struct b43_wldev *dev)
4252 B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED);
4253 if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
4255 b43_set_status(dev, B43_STAT_UNINIT);
4257 /* Stop the microcode PSM. */
4258 macctl = b43_read32(dev, B43_MMIO_MACCTL);
4259 macctl &= ~B43_MACCTL_PSM_RUN;
4260 macctl |= B43_MACCTL_PSM_JMP0;
4261 b43_write32(dev, B43_MMIO_MACCTL, macctl);
4266 dev->phy.ops->switch_analog(dev, 0);
4267 if (dev->wl->current_beacon) {
4268 dev_kfree_skb_any(dev->wl->current_beacon);
4269 dev->wl->current_beacon = NULL;
4272 ssb_device_disable(dev->dev, 0);
4273 ssb_bus_may_powerdown(dev->dev->bus);
4276 /* Initialize a wireless core */
4277 static int b43_wireless_core_init(struct b43_wldev *dev)
4279 struct ssb_bus *bus = dev->dev->bus;
4280 struct ssb_sprom *sprom = &bus->sprom;
4281 struct b43_phy *phy = &dev->phy;
4286 B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4288 err = ssb_bus_powerup(bus, 0);
4291 if (!ssb_device_is_enabled(dev->dev)) {
4292 tmp = phy->gmode ? B43_TMSLOW_GMODE : 0;
4293 b43_wireless_core_reset(dev, tmp);
4296 /* Reset all data structures. */
4297 setup_struct_wldev_for_init(dev);
4298 phy->ops->prepare_structs(dev);
4300 /* Enable IRQ routing to this device. */
4301 ssb_pcicore_dev_irqvecs_enable(&bus->pcicore, dev->dev);
4303 b43_imcfglo_timeouts_workaround(dev);
4304 b43_bluetooth_coext_disable(dev);
4305 if (phy->ops->prepare_hardware) {
4306 err = phy->ops->prepare_hardware(dev);
4310 err = b43_chip_init(dev);
4313 b43_shm_write16(dev, B43_SHM_SHARED,
4314 B43_SHM_SH_WLCOREREV, dev->dev->id.revision);
4315 hf = b43_hf_read(dev);
4316 if (phy->type == B43_PHYTYPE_G) {
4320 if (sprom->boardflags_lo & B43_BFL_PACTRL)
4321 hf |= B43_HF_OFDMPABOOST;
4323 if (phy->radio_ver == 0x2050) {
4324 if (phy->radio_rev == 6)
4325 hf |= B43_HF_4318TSSI;
4326 if (phy->radio_rev < 6)
4327 hf |= B43_HF_VCORECALC;
4329 if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
4330 hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
4331 #ifdef CONFIG_SSB_DRIVER_PCICORE
4332 if ((bus->bustype == SSB_BUSTYPE_PCI) &&
4333 (bus->pcicore.dev->id.revision <= 10))
4334 hf |= B43_HF_PCISCW; /* PCI slow clock workaround. */
4336 hf &= ~B43_HF_SKCFPUP;
4337 b43_hf_write(dev, hf);
4339 b43_set_retry_limits(dev, B43_DEFAULT_SHORT_RETRY_LIMIT,
4340 B43_DEFAULT_LONG_RETRY_LIMIT);
4341 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3);
4342 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2);
4344 /* Disable sending probe responses from firmware.
4345 * Setting the MaxTime to one usec will always trigger
4346 * a timeout, so we never send any probe resp.
4347 * A timeout of zero is infinite. */
4348 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 1);
4350 b43_rate_memory_init(dev);
4351 b43_set_phytxctl_defaults(dev);
4353 /* Minimum Contention Window */
4354 if (phy->type == B43_PHYTYPE_B) {
4355 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0x1F);
4357 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0xF);
4359 /* Maximum Contention Window */
4360 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MAXCONT, 0x3FF);
4362 if ((dev->dev->bus->bustype == SSB_BUSTYPE_PCMCIA) ||
4363 (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) ||
4365 dev->__using_pio_transfers = 1;
4366 err = b43_pio_init(dev);
4368 dev->__using_pio_transfers = 0;
4369 err = b43_dma_init(dev);
4374 b43_set_synth_pu_delay(dev, 1);
4375 b43_bluetooth_coext_enable(dev);
4377 ssb_bus_powerup(bus, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW));
4378 b43_upload_card_macaddress(dev);
4379 b43_security_init(dev);
4381 ieee80211_wake_queues(dev->wl->hw);
4383 ieee80211_wake_queues(dev->wl->hw);
4385 b43_set_status(dev, B43_STAT_INITIALIZED);
4393 ssb_bus_may_powerdown(bus);
4394 B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4398 static int b43_op_add_interface(struct ieee80211_hw *hw,
4399 struct ieee80211_vif *vif)
4401 struct b43_wl *wl = hw_to_b43_wl(hw);
4402 struct b43_wldev *dev;
4403 int err = -EOPNOTSUPP;
4405 /* TODO: allow WDS/AP devices to coexist */
4407 if (vif->type != NL80211_IFTYPE_AP &&
4408 vif->type != NL80211_IFTYPE_MESH_POINT &&
4409 vif->type != NL80211_IFTYPE_STATION &&
4410 vif->type != NL80211_IFTYPE_WDS &&
4411 vif->type != NL80211_IFTYPE_ADHOC)
4414 mutex_lock(&wl->mutex);
4416 goto out_mutex_unlock;
4418 b43dbg(wl, "Adding Interface type %d\n", vif->type);
4420 dev = wl->current_dev;
4423 wl->if_type = vif->type;
4424 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
4426 b43_adjust_opmode(dev);
4427 b43_set_pretbtt(dev);
4428 b43_set_synth_pu_delay(dev, 0);
4429 b43_upload_card_macaddress(dev);
4433 mutex_unlock(&wl->mutex);
4438 static void b43_op_remove_interface(struct ieee80211_hw *hw,
4439 struct ieee80211_vif *vif)
4441 struct b43_wl *wl = hw_to_b43_wl(hw);
4442 struct b43_wldev *dev = wl->current_dev;
4444 b43dbg(wl, "Removing Interface type %d\n", vif->type);
4446 mutex_lock(&wl->mutex);
4448 B43_WARN_ON(!wl->operating);
4449 B43_WARN_ON(wl->vif != vif);
4454 b43_adjust_opmode(dev);
4455 memset(wl->mac_addr, 0, ETH_ALEN);
4456 b43_upload_card_macaddress(dev);
4458 mutex_unlock(&wl->mutex);
4461 static int b43_op_start(struct ieee80211_hw *hw)
4463 struct b43_wl *wl = hw_to_b43_wl(hw);
4464 struct b43_wldev *dev = wl->current_dev;
4468 /* Kill all old instance specific information to make sure
4469 * the card won't use it in the short timeframe between start
4470 * and mac80211 reconfiguring it. */
4471 memset(wl->bssid, 0, ETH_ALEN);
4472 memset(wl->mac_addr, 0, ETH_ALEN);
4473 wl->filter_flags = 0;
4474 wl->radiotap_enabled = 0;
4476 wl->beacon0_uploaded = 0;
4477 wl->beacon1_uploaded = 0;
4478 wl->beacon_templates_virgin = 1;
4479 wl->radio_enabled = 1;
4481 mutex_lock(&wl->mutex);
4483 if (b43_status(dev) < B43_STAT_INITIALIZED) {
4484 err = b43_wireless_core_init(dev);
4486 goto out_mutex_unlock;
4490 if (b43_status(dev) < B43_STAT_STARTED) {
4491 err = b43_wireless_core_start(dev);
4494 b43_wireless_core_exit(dev);
4495 goto out_mutex_unlock;
4499 /* XXX: only do if device doesn't support rfkill irq */
4500 wiphy_rfkill_start_polling(hw->wiphy);
4503 mutex_unlock(&wl->mutex);
4508 static void b43_op_stop(struct ieee80211_hw *hw)
4510 struct b43_wl *wl = hw_to_b43_wl(hw);
4511 struct b43_wldev *dev = wl->current_dev;
4513 cancel_work_sync(&(wl->beacon_update_trigger));
4515 mutex_lock(&wl->mutex);
4516 if (b43_status(dev) >= B43_STAT_STARTED) {
4517 dev = b43_wireless_core_stop(dev);
4521 b43_wireless_core_exit(dev);
4522 wl->radio_enabled = 0;
4525 mutex_unlock(&wl->mutex);
4527 cancel_work_sync(&(wl->txpower_adjust_work));
4530 static int b43_op_beacon_set_tim(struct ieee80211_hw *hw,
4531 struct ieee80211_sta *sta, bool set)
4533 struct b43_wl *wl = hw_to_b43_wl(hw);
4535 /* FIXME: add locking */
4536 b43_update_templates(wl);
4541 static void b43_op_sta_notify(struct ieee80211_hw *hw,
4542 struct ieee80211_vif *vif,
4543 enum sta_notify_cmd notify_cmd,
4544 struct ieee80211_sta *sta)
4546 struct b43_wl *wl = hw_to_b43_wl(hw);
4548 B43_WARN_ON(!vif || wl->vif != vif);
4551 static void b43_op_sw_scan_start_notifier(struct ieee80211_hw *hw)
4553 struct b43_wl *wl = hw_to_b43_wl(hw);
4554 struct b43_wldev *dev;
4556 mutex_lock(&wl->mutex);
4557 dev = wl->current_dev;
4558 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
4559 /* Disable CFP update during scan on other channels. */
4560 b43_hf_write(dev, b43_hf_read(dev) | B43_HF_SKCFPUP);
4562 mutex_unlock(&wl->mutex);
4565 static void b43_op_sw_scan_complete_notifier(struct ieee80211_hw *hw)
4567 struct b43_wl *wl = hw_to_b43_wl(hw);
4568 struct b43_wldev *dev;
4570 mutex_lock(&wl->mutex);
4571 dev = wl->current_dev;
4572 if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
4573 /* Re-enable CFP update. */
4574 b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_SKCFPUP);
4576 mutex_unlock(&wl->mutex);
4579 static const struct ieee80211_ops b43_hw_ops = {
4581 .conf_tx = b43_op_conf_tx,
4582 .add_interface = b43_op_add_interface,
4583 .remove_interface = b43_op_remove_interface,
4584 .config = b43_op_config,
4585 .bss_info_changed = b43_op_bss_info_changed,
4586 .configure_filter = b43_op_configure_filter,
4587 .set_key = b43_op_set_key,
4588 .update_tkip_key = b43_op_update_tkip_key,
4589 .get_stats = b43_op_get_stats,
4590 .get_tx_stats = b43_op_get_tx_stats,
4591 .get_tsf = b43_op_get_tsf,
4592 .set_tsf = b43_op_set_tsf,
4593 .start = b43_op_start,
4594 .stop = b43_op_stop,
4595 .set_tim = b43_op_beacon_set_tim,
4596 .sta_notify = b43_op_sta_notify,
4597 .sw_scan_start = b43_op_sw_scan_start_notifier,
4598 .sw_scan_complete = b43_op_sw_scan_complete_notifier,
4599 .rfkill_poll = b43_rfkill_poll,
4602 /* Hard-reset the chip. Do not call this directly.
4603 * Use b43_controller_restart()
4605 static void b43_chip_reset(struct work_struct *work)
4607 struct b43_wldev *dev =
4608 container_of(work, struct b43_wldev, restart_work);
4609 struct b43_wl *wl = dev->wl;
4613 mutex_lock(&wl->mutex);
4615 prev_status = b43_status(dev);
4616 /* Bring the device down... */
4617 if (prev_status >= B43_STAT_STARTED) {
4618 dev = b43_wireless_core_stop(dev);
4624 if (prev_status >= B43_STAT_INITIALIZED)
4625 b43_wireless_core_exit(dev);
4627 /* ...and up again. */
4628 if (prev_status >= B43_STAT_INITIALIZED) {
4629 err = b43_wireless_core_init(dev);
4633 if (prev_status >= B43_STAT_STARTED) {
4634 err = b43_wireless_core_start(dev);
4636 b43_wireless_core_exit(dev);
4642 wl->current_dev = NULL; /* Failed to init the dev. */
4643 mutex_unlock(&wl->mutex);
4645 b43err(wl, "Controller restart FAILED\n");
4647 b43info(wl, "Controller restarted\n");
4650 static int b43_setup_bands(struct b43_wldev *dev,
4651 bool have_2ghz_phy, bool have_5ghz_phy)
4653 struct ieee80211_hw *hw = dev->wl->hw;
4656 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &b43_band_2GHz;
4657 if (dev->phy.type == B43_PHYTYPE_N) {
4659 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy;
4662 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_aphy;
4665 dev->phy.supports_2ghz = have_2ghz_phy;
4666 dev->phy.supports_5ghz = have_5ghz_phy;
4671 static void b43_wireless_core_detach(struct b43_wldev *dev)
4673 /* We release firmware that late to not be required to re-request
4674 * is all the time when we reinit the core. */
4675 b43_release_firmware(dev);
4679 static int b43_wireless_core_attach(struct b43_wldev *dev)
4681 struct b43_wl *wl = dev->wl;
4682 struct ssb_bus *bus = dev->dev->bus;
4683 struct pci_dev *pdev = (bus->bustype == SSB_BUSTYPE_PCI) ? bus->host_pci : NULL;
4685 bool have_2ghz_phy = 0, have_5ghz_phy = 0;
4688 /* Do NOT do any device initialization here.
4689 * Do it in wireless_core_init() instead.
4690 * This function is for gathering basic information about the HW, only.
4691 * Also some structs may be set up here. But most likely you want to have
4692 * that in core_init(), too.
4695 err = ssb_bus_powerup(bus, 0);
4697 b43err(wl, "Bus powerup failed\n");
4700 /* Get the PHY type. */
4701 if (dev->dev->id.revision >= 5) {
4704 tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH);
4705 have_2ghz_phy = !!(tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY);
4706 have_5ghz_phy = !!(tmshigh & B43_TMSHIGH_HAVE_5GHZ_PHY);
4710 dev->phy.gmode = have_2ghz_phy;
4711 dev->phy.radio_on = 1;
4712 tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
4713 b43_wireless_core_reset(dev, tmp);
4715 err = b43_phy_versioning(dev);
4718 /* Check if this device supports multiband. */
4720 (pdev->device != 0x4312 &&
4721 pdev->device != 0x4319 && pdev->device != 0x4324)) {
4722 /* No multiband support. */
4725 switch (dev->phy.type) {
4729 case B43_PHYTYPE_LP: //FIXME not always!
4730 #if 0 //FIXME enabling 5GHz causes a NULL pointer dereference
4741 if (dev->phy.type == B43_PHYTYPE_A) {
4743 b43err(wl, "IEEE 802.11a devices are unsupported\n");
4747 if (1 /* disable A-PHY */) {
4748 /* FIXME: For now we disable the A-PHY on multi-PHY devices. */
4749 if (dev->phy.type != B43_PHYTYPE_N &&
4750 dev->phy.type != B43_PHYTYPE_LP) {
4756 err = b43_phy_allocate(dev);
4760 dev->phy.gmode = have_2ghz_phy;
4761 tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
4762 b43_wireless_core_reset(dev, tmp);
4764 err = b43_validate_chipaccess(dev);
4767 err = b43_setup_bands(dev, have_2ghz_phy, have_5ghz_phy);
4771 /* Now set some default "current_dev" */
4772 if (!wl->current_dev)
4773 wl->current_dev = dev;
4774 INIT_WORK(&dev->restart_work, b43_chip_reset);
4776 dev->phy.ops->switch_analog(dev, 0);
4777 ssb_device_disable(dev->dev, 0);
4778 ssb_bus_may_powerdown(bus);
4786 ssb_bus_may_powerdown(bus);
4790 static void b43_one_core_detach(struct ssb_device *dev)
4792 struct b43_wldev *wldev;
4795 /* Do not cancel ieee80211-workqueue based work here.
4796 * See comment in b43_remove(). */
4798 wldev = ssb_get_drvdata(dev);
4800 b43_debugfs_remove_device(wldev);
4801 b43_wireless_core_detach(wldev);
4802 list_del(&wldev->list);
4804 ssb_set_drvdata(dev, NULL);
4808 static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
4810 struct b43_wldev *wldev;
4811 struct pci_dev *pdev;
4814 if (!list_empty(&wl->devlist)) {
4815 /* We are not the first core on this chip. */
4816 pdev = (dev->bus->bustype == SSB_BUSTYPE_PCI) ? dev->bus->host_pci : NULL;
4817 /* Only special chips support more than one wireless
4818 * core, although some of the other chips have more than
4819 * one wireless core as well. Check for this and
4823 ((pdev->device != 0x4321) &&
4824 (pdev->device != 0x4313) && (pdev->device != 0x431A))) {
4825 b43dbg(wl, "Ignoring unconnected 802.11 core\n");
4830 wldev = kzalloc(sizeof(*wldev), GFP_KERNEL);
4836 b43_set_status(wldev, B43_STAT_UNINIT);
4837 wldev->bad_frames_preempt = modparam_bad_frames_preempt;
4838 INIT_LIST_HEAD(&wldev->list);
4840 err = b43_wireless_core_attach(wldev);
4842 goto err_kfree_wldev;
4844 list_add(&wldev->list, &wl->devlist);
4846 ssb_set_drvdata(dev, wldev);
4847 b43_debugfs_add_device(wldev);
4857 #define IS_PDEV(pdev, _vendor, _device, _subvendor, _subdevice) ( \
4858 (pdev->vendor == PCI_VENDOR_ID_##_vendor) && \
4859 (pdev->device == _device) && \
4860 (pdev->subsystem_vendor == PCI_VENDOR_ID_##_subvendor) && \
4861 (pdev->subsystem_device == _subdevice) )
4863 static void b43_sprom_fixup(struct ssb_bus *bus)
4865 struct pci_dev *pdev;
4867 /* boardflags workarounds */
4868 if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL &&
4869 bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74)
4870 bus->sprom.boardflags_lo |= B43_BFL_BTCOEXIST;
4871 if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE &&
4872 bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40)
4873 bus->sprom.boardflags_lo |= B43_BFL_PACTRL;
4874 if (bus->bustype == SSB_BUSTYPE_PCI) {
4875 pdev = bus->host_pci;
4876 if (IS_PDEV(pdev, BROADCOM, 0x4318, ASUSTEK, 0x100F) ||
4877 IS_PDEV(pdev, BROADCOM, 0x4320, DELL, 0x0003) ||
4878 IS_PDEV(pdev, BROADCOM, 0x4320, HP, 0x12f8) ||
4879 IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0015) ||
4880 IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0014) ||
4881 IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0013) ||
4882 IS_PDEV(pdev, BROADCOM, 0x4320, MOTOROLA, 0x7010))
4883 bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST;
4887 static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl)
4889 struct ieee80211_hw *hw = wl->hw;
4891 ssb_set_devtypedata(dev, NULL);
4892 ieee80211_free_hw(hw);
4895 static int b43_wireless_init(struct ssb_device *dev)
4897 struct ssb_sprom *sprom = &dev->bus->sprom;
4898 struct ieee80211_hw *hw;
4902 b43_sprom_fixup(dev->bus);
4904 hw = ieee80211_alloc_hw(sizeof(*wl), &b43_hw_ops);
4906 b43err(NULL, "Could not allocate ieee80211 device\n");
4909 wl = hw_to_b43_wl(hw);
4912 hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
4913 IEEE80211_HW_SIGNAL_DBM |
4914 IEEE80211_HW_NOISE_DBM;
4916 hw->wiphy->interface_modes =
4917 BIT(NL80211_IFTYPE_AP) |
4918 BIT(NL80211_IFTYPE_MESH_POINT) |
4919 BIT(NL80211_IFTYPE_STATION) |
4920 BIT(NL80211_IFTYPE_WDS) |
4921 BIT(NL80211_IFTYPE_ADHOC);
4923 hw->queues = modparam_qos ? 4 : 1;
4924 wl->mac80211_initially_registered_queues = hw->queues;
4926 SET_IEEE80211_DEV(hw, dev->dev);
4927 if (is_valid_ether_addr(sprom->et1mac))
4928 SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac);
4930 SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac);
4932 /* Initialize struct b43_wl */
4934 mutex_init(&wl->mutex);
4935 spin_lock_init(&wl->hardirq_lock);
4936 INIT_LIST_HEAD(&wl->devlist);
4937 INIT_WORK(&wl->beacon_update_trigger, b43_beacon_update_trigger_work);
4938 INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work);
4939 INIT_WORK(&wl->tx_work, b43_tx_work);
4940 skb_queue_head_init(&wl->tx_queue);
4942 ssb_set_devtypedata(dev, wl);
4943 b43info(wl, "Broadcom %04X WLAN found (core revision %u)\n",
4944 dev->bus->chip_id, dev->id.revision);
4950 static int b43_probe(struct ssb_device *dev, const struct ssb_device_id *id)
4956 wl = ssb_get_devtypedata(dev);
4958 /* Probing the first core. Must setup common struct b43_wl */
4960 err = b43_wireless_init(dev);
4963 wl = ssb_get_devtypedata(dev);
4966 err = b43_one_core_attach(dev, wl);
4968 goto err_wireless_exit;
4971 err = ieee80211_register_hw(wl->hw);
4973 goto err_one_core_detach;
4974 b43_leds_register(wl->current_dev);
4981 err_one_core_detach:
4982 b43_one_core_detach(dev);
4985 b43_wireless_exit(dev, wl);
4989 static void b43_remove(struct ssb_device *dev)
4991 struct b43_wl *wl = ssb_get_devtypedata(dev);
4992 struct b43_wldev *wldev = ssb_get_drvdata(dev);
4994 /* We must cancel any work here before unregistering from ieee80211,
4995 * as the ieee80211 unreg will destroy the workqueue. */
4996 cancel_work_sync(&wldev->restart_work);
4999 if (wl->current_dev == wldev) {
5000 /* Restore the queues count before unregistering, because firmware detect
5001 * might have modified it. Restoring is important, so the networking
5002 * stack can properly free resources. */
5003 wl->hw->queues = wl->mac80211_initially_registered_queues;
5004 b43_leds_stop(wldev);
5005 ieee80211_unregister_hw(wl->hw);
5008 b43_one_core_detach(dev);
5010 if (list_empty(&wl->devlist)) {
5012 b43_leds_unregister(wl);
5013 /* Last core on the chip unregistered.
5014 * We can destroy common struct b43_wl.
5016 b43_wireless_exit(dev, wl);
5020 /* Perform a hardware reset. This can be called from any context. */
5021 void b43_controller_restart(struct b43_wldev *dev, const char *reason)
5023 /* Must avoid requeueing, if we are in shutdown. */
5024 if (b43_status(dev) < B43_STAT_INITIALIZED)
5026 b43info(dev->wl, "Controller RESET (%s) ...\n", reason);
5027 ieee80211_queue_work(dev->wl->hw, &dev->restart_work);
5030 static struct ssb_driver b43_ssb_driver = {
5031 .name = KBUILD_MODNAME,
5032 .id_table = b43_ssb_tbl,
5034 .remove = b43_remove,
5037 static void b43_print_driverinfo(void)
5039 const char *feat_pci = "", *feat_pcmcia = "", *feat_nphy = "",
5040 *feat_leds = "", *feat_sdio = "";
5042 #ifdef CONFIG_B43_PCI_AUTOSELECT
5045 #ifdef CONFIG_B43_PCMCIA
5048 #ifdef CONFIG_B43_NPHY
5051 #ifdef CONFIG_B43_LEDS
5054 #ifdef CONFIG_B43_SDIO
5057 printk(KERN_INFO "Broadcom 43xx driver loaded "
5058 "[ Features: %s%s%s%s%s, Firmware-ID: "
5059 B43_SUPPORTED_FIRMWARE_ID " ]\n",
5060 feat_pci, feat_pcmcia, feat_nphy,
5061 feat_leds, feat_sdio);
5064 static int __init b43_init(void)
5069 err = b43_pcmcia_init();
5072 err = b43_sdio_init();
5074 goto err_pcmcia_exit;
5075 err = ssb_driver_register(&b43_ssb_driver);
5078 b43_print_driverinfo();
5091 static void __exit b43_exit(void)
5093 ssb_driver_unregister(&b43_ssb_driver);
5099 module_init(b43_init)
5100 module_exit(b43_exit)