3 Broadcom BCM43xx wireless driver
5 Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
6 Stefano Brivio <st3@riseup.net>
7 Michael Buesch <mbuesch@freenet.de>
8 Danny van Dyk <kugelfang@gentoo.org>
9 Andreas Jaggi <andreas.jaggi@waterwave.ch>
11 Some parts of the code in this file are derived from the ipw2200
12 driver Copyright(c) 2003 - 2004 Intel Corporation.
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; see the file COPYING. If not, write to
26 the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
27 Boston, MA 02110-1301, USA.
31 #include <linux/delay.h>
32 #include <linux/init.h>
33 #include <linux/moduleparam.h>
34 #include <linux/if_arp.h>
35 #include <linux/etherdevice.h>
36 #include <linux/version.h>
37 #include <linux/firmware.h>
38 #include <linux/wireless.h>
39 #include <linux/workqueue.h>
40 #include <linux/skbuff.h>
41 #include <net/iw_handler.h>
44 #include "bcm43xx_main.h"
45 #include "bcm43xx_debugfs.h"
46 #include "bcm43xx_radio.h"
47 #include "bcm43xx_phy.h"
48 #include "bcm43xx_dma.h"
49 #include "bcm43xx_pio.h"
50 #include "bcm43xx_power.h"
51 #include "bcm43xx_wx.h"
52 #include "bcm43xx_ethtool.h"
53 #include "bcm43xx_xmit.h"
56 MODULE_DESCRIPTION("Broadcom BCM43xx wireless driver");
57 MODULE_AUTHOR("Martin Langer");
58 MODULE_AUTHOR("Stefano Brivio");
59 MODULE_AUTHOR("Michael Buesch");
60 MODULE_LICENSE("GPL");
62 #ifdef CONFIG_BCM947XX
63 extern char *nvram_get(char *name);
66 #if defined(CONFIG_BCM43XX_DMA) && defined(CONFIG_BCM43XX_PIO)
67 static int modparam_pio;
68 module_param_named(pio, modparam_pio, int, 0444);
69 MODULE_PARM_DESC(pio, "enable(1) / disable(0) PIO mode");
70 #elif defined(CONFIG_BCM43XX_DMA)
71 # define modparam_pio 0
72 #elif defined(CONFIG_BCM43XX_PIO)
73 # define modparam_pio 1
76 static int modparam_bad_frames_preempt;
77 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
78 MODULE_PARM_DESC(bad_frames_preempt, "enable(1) / disable(0) Bad Frames Preemption");
80 static int modparam_short_retry = BCM43xx_DEFAULT_SHORT_RETRY_LIMIT;
81 module_param_named(short_retry, modparam_short_retry, int, 0444);
82 MODULE_PARM_DESC(short_retry, "Short-Retry-Limit (0 - 15)");
84 static int modparam_long_retry = BCM43xx_DEFAULT_LONG_RETRY_LIMIT;
85 module_param_named(long_retry, modparam_long_retry, int, 0444);
86 MODULE_PARM_DESC(long_retry, "Long-Retry-Limit (0 - 15)");
88 static int modparam_locale = -1;
89 module_param_named(locale, modparam_locale, int, 0444);
90 MODULE_PARM_DESC(country, "Select LocaleCode 0-11 (For travelers)");
92 static int modparam_noleds;
93 module_param_named(noleds, modparam_noleds, int, 0444);
94 MODULE_PARM_DESC(noleds, "Turn off all LED activity");
96 #ifdef CONFIG_BCM43XX_DEBUG
97 static char modparam_fwpostfix[64];
98 module_param_string(fwpostfix, modparam_fwpostfix, 64, 0444);
99 MODULE_PARM_DESC(fwpostfix, "Postfix for .fw files. Useful for debugging.");
101 # define modparam_fwpostfix ""
102 #endif /* CONFIG_BCM43XX_DEBUG*/
105 /* If you want to debug with just a single device, enable this,
106 * where the string is the pci device ID (as given by the kernel's
107 * pci_name function) of the device to be used.
109 //#define DEBUG_SINGLE_DEVICE_ONLY "0001:11:00.0"
111 /* If you want to enable printing of each MMIO access, enable this. */
112 //#define DEBUG_ENABLE_MMIO_PRINT
114 /* If you want to enable printing of MMIO access within
115 * ucode/pcm upload, initvals write, enable this.
117 //#define DEBUG_ENABLE_UCODE_MMIO_PRINT
119 /* If you want to enable printing of PCI Config Space access, enable this */
120 //#define DEBUG_ENABLE_PCILOG
123 /* Detailed list maintained at:
124 * http://openfacts.berlios.de/index-en.phtml?title=Bcm43xxDevices
126 static struct pci_device_id bcm43xx_pci_tbl[] = {
127 /* Broadcom 4303 802.11b */
128 { PCI_VENDOR_ID_BROADCOM, 0x4301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
129 /* Broadcom 4307 802.11b */
130 { PCI_VENDOR_ID_BROADCOM, 0x4307, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
131 /* Broadcom 4318 802.11b/g */
132 { PCI_VENDOR_ID_BROADCOM, 0x4318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
133 /* Broadcom 4306 802.11b/g */
134 { PCI_VENDOR_ID_BROADCOM, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
135 /* Broadcom 4306 802.11a */
136 // { PCI_VENDOR_ID_BROADCOM, 0x4321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
137 /* Broadcom 4309 802.11a/b/g */
138 { PCI_VENDOR_ID_BROADCOM, 0x4324, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
139 /* Broadcom 43XG 802.11b/g */
140 { PCI_VENDOR_ID_BROADCOM, 0x4325, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
141 #ifdef CONFIG_BCM947XX
142 /* SB bus on BCM947xx */
143 { PCI_VENDOR_ID_BROADCOM, 0x0800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
147 MODULE_DEVICE_TABLE(pci, bcm43xx_pci_tbl);
149 static void bcm43xx_ram_write(struct bcm43xx_private *bcm, u16 offset, u32 val)
153 status = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
154 if (!(status & BCM43xx_SBF_XFER_REG_BYTESWAP))
157 bcm43xx_write32(bcm, BCM43xx_MMIO_RAM_CONTROL, offset);
158 bcm43xx_write32(bcm, BCM43xx_MMIO_RAM_DATA, val);
162 void bcm43xx_shm_control_word(struct bcm43xx_private *bcm,
163 u16 routing, u16 offset)
167 /* "offset" is the WORD offset. */
172 bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_CONTROL, control);
175 u32 bcm43xx_shm_read32(struct bcm43xx_private *bcm,
176 u16 routing, u16 offset)
180 if (routing == BCM43xx_SHM_SHARED) {
181 if (offset & 0x0003) {
182 /* Unaligned access */
183 bcm43xx_shm_control_word(bcm, routing, offset >> 2);
184 ret = bcm43xx_read16(bcm, BCM43xx_MMIO_SHM_DATA_UNALIGNED);
186 bcm43xx_shm_control_word(bcm, routing, (offset >> 2) + 1);
187 ret |= bcm43xx_read16(bcm, BCM43xx_MMIO_SHM_DATA);
193 bcm43xx_shm_control_word(bcm, routing, offset);
194 ret = bcm43xx_read32(bcm, BCM43xx_MMIO_SHM_DATA);
199 u16 bcm43xx_shm_read16(struct bcm43xx_private *bcm,
200 u16 routing, u16 offset)
204 if (routing == BCM43xx_SHM_SHARED) {
205 if (offset & 0x0003) {
206 /* Unaligned access */
207 bcm43xx_shm_control_word(bcm, routing, offset >> 2);
208 ret = bcm43xx_read16(bcm, BCM43xx_MMIO_SHM_DATA_UNALIGNED);
214 bcm43xx_shm_control_word(bcm, routing, offset);
215 ret = bcm43xx_read16(bcm, BCM43xx_MMIO_SHM_DATA);
220 void bcm43xx_shm_write32(struct bcm43xx_private *bcm,
221 u16 routing, u16 offset,
224 if (routing == BCM43xx_SHM_SHARED) {
225 if (offset & 0x0003) {
226 /* Unaligned access */
227 bcm43xx_shm_control_word(bcm, routing, offset >> 2);
228 bcm43xx_write16(bcm, BCM43xx_MMIO_SHM_DATA_UNALIGNED,
229 (value >> 16) & 0xffff);
230 bcm43xx_shm_control_word(bcm, routing, (offset >> 2) + 1);
231 bcm43xx_write16(bcm, BCM43xx_MMIO_SHM_DATA,
237 bcm43xx_shm_control_word(bcm, routing, offset);
238 bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA, value);
241 void bcm43xx_shm_write16(struct bcm43xx_private *bcm,
242 u16 routing, u16 offset,
245 if (routing == BCM43xx_SHM_SHARED) {
246 if (offset & 0x0003) {
247 /* Unaligned access */
248 bcm43xx_shm_control_word(bcm, routing, offset >> 2);
249 bcm43xx_write16(bcm, BCM43xx_MMIO_SHM_DATA_UNALIGNED,
255 bcm43xx_shm_control_word(bcm, routing, offset);
256 bcm43xx_write16(bcm, BCM43xx_MMIO_SHM_DATA, value);
259 void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf)
261 /* We need to be careful. As we read the TSF from multiple
262 * registers, we should take care of register overflows.
263 * In theory, the whole tsf read process should be atomic.
264 * We try to be atomic here, by restaring the read process,
265 * if any of the high registers changed (overflew).
267 if (bcm->current_core->rev >= 3) {
268 u32 low, high, high2;
271 high = bcm43xx_read32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_HIGH);
272 low = bcm43xx_read32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_LOW);
273 high2 = bcm43xx_read32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_HIGH);
274 } while (unlikely(high != high2));
282 u16 test1, test2, test3;
285 v3 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_3);
286 v2 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_2);
287 v1 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_1);
288 v0 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_0);
290 test3 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_3);
291 test2 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_2);
292 test1 = bcm43xx_read16(bcm, BCM43xx_MMIO_TSF_1);
293 } while (v3 != test3 || v2 != test2 || v1 != test1);
307 void bcm43xx_tsf_write(struct bcm43xx_private *bcm, u64 tsf)
311 status = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
312 status |= BCM43xx_SBF_TIME_UPDATE;
313 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, status);
315 /* Be careful with the in-progress timer.
316 * First zero out the low register, so we have a full
317 * register-overflow duration to complete the operation.
319 if (bcm->current_core->rev >= 3) {
320 u32 lo = (tsf & 0x00000000FFFFFFFFULL);
321 u32 hi = (tsf & 0xFFFFFFFF00000000ULL) >> 32;
324 bcm43xx_write32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_LOW, 0);
325 bcm43xx_write32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_HIGH, hi);
326 bcm43xx_write32(bcm, BCM43xx_MMIO_REV3PLUS_TSF_LOW, lo);
328 u16 v0 = (tsf & 0x000000000000FFFFULL);
329 u16 v1 = (tsf & 0x00000000FFFF0000ULL) >> 16;
330 u16 v2 = (tsf & 0x0000FFFF00000000ULL) >> 32;
331 u16 v3 = (tsf & 0xFFFF000000000000ULL) >> 48;
334 bcm43xx_write16(bcm, BCM43xx_MMIO_TSF_0, 0);
335 bcm43xx_write16(bcm, BCM43xx_MMIO_TSF_3, v3);
336 bcm43xx_write16(bcm, BCM43xx_MMIO_TSF_2, v2);
337 bcm43xx_write16(bcm, BCM43xx_MMIO_TSF_1, v1);
338 bcm43xx_write16(bcm, BCM43xx_MMIO_TSF_0, v0);
341 status = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
342 status &= ~BCM43xx_SBF_TIME_UPDATE;
343 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, status);
347 void bcm43xx_macfilter_set(struct bcm43xx_private *bcm,
354 bcm43xx_write16(bcm, BCM43xx_MMIO_MACFILTER_CONTROL, offset);
358 bcm43xx_write16(bcm, BCM43xx_MMIO_MACFILTER_DATA, data);
361 bcm43xx_write16(bcm, BCM43xx_MMIO_MACFILTER_DATA, data);
364 bcm43xx_write16(bcm, BCM43xx_MMIO_MACFILTER_DATA, data);
367 static void bcm43xx_macfilter_clear(struct bcm43xx_private *bcm,
370 const u8 zero_addr[ETH_ALEN] = { 0 };
372 bcm43xx_macfilter_set(bcm, offset, zero_addr);
375 static void bcm43xx_write_mac_bssid_templates(struct bcm43xx_private *bcm)
377 const u8 *mac = (const u8 *)(bcm->net_dev->dev_addr);
378 const u8 *bssid = (const u8 *)(bcm->ieee->bssid);
379 u8 mac_bssid[ETH_ALEN * 2];
382 memcpy(mac_bssid, mac, ETH_ALEN);
383 memcpy(mac_bssid + ETH_ALEN, bssid, ETH_ALEN);
385 /* Write our MAC address and BSSID to template ram */
386 for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32))
387 bcm43xx_ram_write(bcm, 0x20 + i, *((u32 *)(mac_bssid + i)));
388 for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32))
389 bcm43xx_ram_write(bcm, 0x78 + i, *((u32 *)(mac_bssid + i)));
390 for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32))
391 bcm43xx_ram_write(bcm, 0x478 + i, *((u32 *)(mac_bssid + i)));
394 static void bcm43xx_set_slot_time(struct bcm43xx_private *bcm, u16 slot_time)
396 /* slot_time is in usec. */
397 if (bcm->current_core->phy->type != BCM43xx_PHYTYPE_G)
399 bcm43xx_write16(bcm, 0x684, 510 + slot_time);
400 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0010, slot_time);
403 static void bcm43xx_short_slot_timing_enable(struct bcm43xx_private *bcm)
405 bcm43xx_set_slot_time(bcm, 9);
408 static void bcm43xx_short_slot_timing_disable(struct bcm43xx_private *bcm)
410 bcm43xx_set_slot_time(bcm, 20);
413 //FIXME: rename this func?
414 static void bcm43xx_disassociate(struct bcm43xx_private *bcm)
416 bcm43xx_mac_suspend(bcm);
417 bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC);
419 bcm43xx_ram_write(bcm, 0x0026, 0x0000);
420 bcm43xx_ram_write(bcm, 0x0028, 0x0000);
421 bcm43xx_ram_write(bcm, 0x007E, 0x0000);
422 bcm43xx_ram_write(bcm, 0x0080, 0x0000);
423 bcm43xx_ram_write(bcm, 0x047E, 0x0000);
424 bcm43xx_ram_write(bcm, 0x0480, 0x0000);
426 if (bcm->current_core->rev < 3) {
427 bcm43xx_write16(bcm, 0x0610, 0x8000);
428 bcm43xx_write16(bcm, 0x060E, 0x0000);
430 bcm43xx_write32(bcm, 0x0188, 0x80000000);
432 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0004, 0x000003ff);
434 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G &&
435 ieee80211_is_ofdm_rate(bcm->softmac->txrates.default_rate))
436 bcm43xx_short_slot_timing_enable(bcm);
438 bcm43xx_mac_enable(bcm);
441 //FIXME: rename this func?
442 static void bcm43xx_associate(struct bcm43xx_private *bcm,
445 memcpy(bcm->ieee->bssid, mac, ETH_ALEN);
447 bcm43xx_mac_suspend(bcm);
448 bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_ASSOC, mac);
449 bcm43xx_write_mac_bssid_templates(bcm);
450 bcm43xx_mac_enable(bcm);
453 /* Enable a Generic IRQ. "mask" is the mask of which IRQs to enable.
454 * Returns the _previously_ enabled IRQ mask.
456 static inline u32 bcm43xx_interrupt_enable(struct bcm43xx_private *bcm, u32 mask)
460 old_mask = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK);
461 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK, old_mask | mask);
466 /* Disable a Generic IRQ. "mask" is the mask of which IRQs to disable.
467 * Returns the _previously_ enabled IRQ mask.
469 static inline u32 bcm43xx_interrupt_disable(struct bcm43xx_private *bcm, u32 mask)
473 old_mask = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK);
474 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK, old_mask & ~mask);
479 /* Make sure we don't receive more data from the device. */
480 static int bcm43xx_disable_interrupts_sync(struct bcm43xx_private *bcm, u32 *oldstate)
485 spin_lock_irqsave(&bcm->lock, flags);
486 if (bcm43xx_is_initializing(bcm) || bcm->shutting_down) {
487 spin_unlock_irqrestore(&bcm->lock, flags);
490 old = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
491 tasklet_disable(&bcm->isr_tasklet);
492 spin_unlock_irqrestore(&bcm->lock, flags);
499 static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm)
501 struct bcm43xx_radioinfo *radio = bcm->current_core->radio;
502 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
509 if (bcm->chip_id == 0x4317) {
510 if (bcm->chip_rev == 0x00)
511 radio_id = 0x3205017F;
512 else if (bcm->chip_rev == 0x01)
513 radio_id = 0x4205017F;
515 radio_id = 0x5205017F;
517 bcm43xx_write16(bcm, BCM43xx_MMIO_RADIO_CONTROL, BCM43xx_RADIOCTL_ID);
518 radio_id = bcm43xx_read16(bcm, BCM43xx_MMIO_RADIO_DATA_HIGH);
520 bcm43xx_write16(bcm, BCM43xx_MMIO_RADIO_CONTROL, BCM43xx_RADIOCTL_ID);
521 radio_id |= bcm43xx_read16(bcm, BCM43xx_MMIO_RADIO_DATA_LOW);
524 manufact = (radio_id & 0x00000FFF);
525 version = (radio_id & 0x0FFFF000) >> 12;
526 revision = (radio_id & 0xF0000000) >> 28;
528 dprintk(KERN_INFO PFX "Detected Radio: ID: %x (Manuf: %x Ver: %x Rev: %x)\n",
529 radio_id, manufact, version, revision);
532 case BCM43xx_PHYTYPE_A:
533 if ((version != 0x2060) || (revision != 1) || (manufact != 0x17f))
534 goto err_unsupported_radio;
536 case BCM43xx_PHYTYPE_B:
537 if ((version & 0xFFF0) != 0x2050)
538 goto err_unsupported_radio;
540 case BCM43xx_PHYTYPE_G:
541 if (version != 0x2050)
542 goto err_unsupported_radio;
546 radio->manufact = manufact;
547 radio->version = version;
548 radio->revision = revision;
550 /* Set default attenuation values. */
551 radio->txpower[0] = 2;
552 radio->txpower[1] = 2;
554 radio->txpower[2] = 3;
556 radio->txpower[2] = 0;
557 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A)
558 radio->txpower_desired = bcm->sprom.maxpower_aphy;
560 bcm->current_core->radio->txpower_desired = bcm->sprom.maxpower_bgphy;
562 /* Initialize the in-memory nrssi Lookup Table. */
563 for (i = 0; i < 64; i++)
564 radio->nrssi_lt[i] = i;
568 err_unsupported_radio:
569 printk(KERN_ERR PFX "Unsupported Radio connected to the PHY!\n");
573 static const char * bcm43xx_locale_iso(u8 locale)
575 /* ISO 3166-1 country codes.
576 * Note that there aren't ISO 3166-1 codes for
577 * all or locales. (Not all locales are countries)
580 case BCM43xx_LOCALE_WORLD:
581 case BCM43xx_LOCALE_ALL:
583 case BCM43xx_LOCALE_THAILAND:
585 case BCM43xx_LOCALE_ISRAEL:
587 case BCM43xx_LOCALE_JORDAN:
589 case BCM43xx_LOCALE_CHINA:
591 case BCM43xx_LOCALE_JAPAN:
592 case BCM43xx_LOCALE_JAPAN_HIGH:
594 case BCM43xx_LOCALE_USA_CANADA_ANZ:
595 case BCM43xx_LOCALE_USA_LOW:
597 case BCM43xx_LOCALE_EUROPE:
599 case BCM43xx_LOCALE_NONE:
606 static const char * bcm43xx_locale_string(u8 locale)
609 case BCM43xx_LOCALE_WORLD:
611 case BCM43xx_LOCALE_THAILAND:
613 case BCM43xx_LOCALE_ISRAEL:
615 case BCM43xx_LOCALE_JORDAN:
617 case BCM43xx_LOCALE_CHINA:
619 case BCM43xx_LOCALE_JAPAN:
621 case BCM43xx_LOCALE_USA_CANADA_ANZ:
622 return "USA/Canada/ANZ";
623 case BCM43xx_LOCALE_EUROPE:
625 case BCM43xx_LOCALE_USA_LOW:
627 case BCM43xx_LOCALE_JAPAN_HIGH:
629 case BCM43xx_LOCALE_ALL:
631 case BCM43xx_LOCALE_NONE:
638 static inline u8 bcm43xx_crc8(u8 crc, u8 data)
640 static const u8 t[] = {
641 0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
642 0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
643 0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
644 0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
645 0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
646 0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
647 0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
648 0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
649 0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
650 0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
651 0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
652 0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
653 0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
654 0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
655 0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
656 0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
657 0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
658 0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
659 0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
660 0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
661 0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
662 0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
663 0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
664 0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
665 0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
666 0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
667 0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
668 0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
669 0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
670 0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
671 0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
672 0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F,
674 return t[crc ^ data];
677 static u8 bcm43xx_sprom_crc(const u16 *sprom)
682 for (word = 0; word < BCM43xx_SPROM_SIZE - 1; word++) {
683 crc = bcm43xx_crc8(crc, sprom[word] & 0x00FF);
684 crc = bcm43xx_crc8(crc, (sprom[word] & 0xFF00) >> 8);
686 crc = bcm43xx_crc8(crc, sprom[BCM43xx_SPROM_VERSION] & 0x00FF);
692 int bcm43xx_sprom_read(struct bcm43xx_private *bcm, u16 *sprom)
695 u8 crc, expected_crc;
697 for (i = 0; i < BCM43xx_SPROM_SIZE; i++)
698 sprom[i] = bcm43xx_read16(bcm, BCM43xx_SPROM_BASE + (i * 2));
700 crc = bcm43xx_sprom_crc(sprom);
701 expected_crc = (sprom[BCM43xx_SPROM_VERSION] & 0xFF00) >> 8;
702 if (crc != expected_crc) {
703 printk(KERN_WARNING PFX "WARNING: Invalid SPROM checksum "
704 "(0x%02X, expected: 0x%02X)\n",
712 int bcm43xx_sprom_write(struct bcm43xx_private *bcm, const u16 *sprom)
715 u8 crc, expected_crc;
718 /* CRC-8 validation of the input data. */
719 crc = bcm43xx_sprom_crc(sprom);
720 expected_crc = (sprom[BCM43xx_SPROM_VERSION] & 0xFF00) >> 8;
721 if (crc != expected_crc) {
722 printk(KERN_ERR PFX "SPROM input data: Invalid CRC\n");
726 printk(KERN_INFO PFX "Writing SPROM. Do NOT turn off the power! Please stand by...\n");
727 err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_SPROMCTL, &spromctl);
730 spromctl |= 0x10; /* SPROM WRITE enable. */
731 bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl);
734 /* We must burn lots of CPU cycles here, but that does not
735 * really matter as one does not write the SPROM every other minute...
737 printk(KERN_INFO PFX "[ 0%%");
739 for (i = 0; i < BCM43xx_SPROM_SIZE; i++) {
748 bcm43xx_write16(bcm, BCM43xx_SPROM_BASE + (i * 2), sprom[i]);
751 spromctl &= ~0x10; /* SPROM WRITE enable. */
752 bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl);
757 printk(KERN_INFO PFX "SPROM written.\n");
758 bcm43xx_controller_restart(bcm, "SPROM update");
762 printk(KERN_ERR PFX "Could not access SPROM control register.\n");
766 static int bcm43xx_sprom_extract(struct bcm43xx_private *bcm)
770 #ifdef CONFIG_BCM947XX
774 sprom = kzalloc(BCM43xx_SPROM_SIZE * sizeof(u16),
777 printk(KERN_ERR PFX "sprom_extract OOM\n");
780 #ifdef CONFIG_BCM947XX
781 sprom[BCM43xx_SPROM_BOARDFLAGS2] = atoi(nvram_get("boardflags2"));
782 sprom[BCM43xx_SPROM_BOARDFLAGS] = atoi(nvram_get("boardflags"));
784 if ((c = nvram_get("il0macaddr")) != NULL)
785 e_aton(c, (char *) &(sprom[BCM43xx_SPROM_IL0MACADDR]));
787 if ((c = nvram_get("et1macaddr")) != NULL)
788 e_aton(c, (char *) &(sprom[BCM43xx_SPROM_ET1MACADDR]));
790 sprom[BCM43xx_SPROM_PA0B0] = atoi(nvram_get("pa0b0"));
791 sprom[BCM43xx_SPROM_PA0B1] = atoi(nvram_get("pa0b1"));
792 sprom[BCM43xx_SPROM_PA0B2] = atoi(nvram_get("pa0b2"));
794 sprom[BCM43xx_SPROM_PA1B0] = atoi(nvram_get("pa1b0"));
795 sprom[BCM43xx_SPROM_PA1B1] = atoi(nvram_get("pa1b1"));
796 sprom[BCM43xx_SPROM_PA1B2] = atoi(nvram_get("pa1b2"));
798 sprom[BCM43xx_SPROM_BOARDREV] = atoi(nvram_get("boardrev"));
800 bcm43xx_sprom_read(bcm, sprom);
804 value = sprom[BCM43xx_SPROM_BOARDFLAGS2];
805 bcm->sprom.boardflags2 = value;
808 value = sprom[BCM43xx_SPROM_IL0MACADDR + 0];
809 *(((u16 *)bcm->sprom.il0macaddr) + 0) = cpu_to_be16(value);
810 value = sprom[BCM43xx_SPROM_IL0MACADDR + 1];
811 *(((u16 *)bcm->sprom.il0macaddr) + 1) = cpu_to_be16(value);
812 value = sprom[BCM43xx_SPROM_IL0MACADDR + 2];
813 *(((u16 *)bcm->sprom.il0macaddr) + 2) = cpu_to_be16(value);
816 value = sprom[BCM43xx_SPROM_ET0MACADDR + 0];
817 *(((u16 *)bcm->sprom.et0macaddr) + 0) = cpu_to_be16(value);
818 value = sprom[BCM43xx_SPROM_ET0MACADDR + 1];
819 *(((u16 *)bcm->sprom.et0macaddr) + 1) = cpu_to_be16(value);
820 value = sprom[BCM43xx_SPROM_ET0MACADDR + 2];
821 *(((u16 *)bcm->sprom.et0macaddr) + 2) = cpu_to_be16(value);
824 value = sprom[BCM43xx_SPROM_ET1MACADDR + 0];
825 *(((u16 *)bcm->sprom.et1macaddr) + 0) = cpu_to_be16(value);
826 value = sprom[BCM43xx_SPROM_ET1MACADDR + 1];
827 *(((u16 *)bcm->sprom.et1macaddr) + 1) = cpu_to_be16(value);
828 value = sprom[BCM43xx_SPROM_ET1MACADDR + 2];
829 *(((u16 *)bcm->sprom.et1macaddr) + 2) = cpu_to_be16(value);
831 /* ethernet phy settings */
832 value = sprom[BCM43xx_SPROM_ETHPHY];
833 bcm->sprom.et0phyaddr = (value & 0x001F);
834 bcm->sprom.et1phyaddr = (value & 0x03E0) >> 5;
835 bcm->sprom.et0mdcport = (value & (1 << 14)) >> 14;
836 bcm->sprom.et1mdcport = (value & (1 << 15)) >> 15;
838 /* boardrev, antennas, locale */
839 value = sprom[BCM43xx_SPROM_BOARDREV];
840 bcm->sprom.boardrev = (value & 0x00FF);
841 bcm->sprom.locale = (value & 0x0F00) >> 8;
842 bcm->sprom.antennas_aphy = (value & 0x3000) >> 12;
843 bcm->sprom.antennas_bgphy = (value & 0xC000) >> 14;
844 if (modparam_locale != -1) {
845 if (modparam_locale >= 0 && modparam_locale <= 11) {
846 bcm->sprom.locale = modparam_locale;
847 printk(KERN_WARNING PFX "Operating with modified "
848 "LocaleCode %u (%s)\n",
850 bcm43xx_locale_string(bcm->sprom.locale));
852 printk(KERN_WARNING PFX "Module parameter \"locale\" "
853 "invalid value. (0 - 11)\n");
858 value = sprom[BCM43xx_SPROM_PA0B0];
859 bcm->sprom.pa0b0 = value;
860 value = sprom[BCM43xx_SPROM_PA0B1];
861 bcm->sprom.pa0b1 = value;
862 value = sprom[BCM43xx_SPROM_PA0B2];
863 bcm->sprom.pa0b2 = value;
866 value = sprom[BCM43xx_SPROM_WL0GPIO0];
869 bcm->sprom.wl0gpio0 = value & 0x00FF;
870 bcm->sprom.wl0gpio1 = (value & 0xFF00) >> 8;
871 value = sprom[BCM43xx_SPROM_WL0GPIO2];
874 bcm->sprom.wl0gpio2 = value & 0x00FF;
875 bcm->sprom.wl0gpio3 = (value & 0xFF00) >> 8;
878 value = sprom[BCM43xx_SPROM_MAXPWR];
879 bcm->sprom.maxpower_aphy = (value & 0xFF00) >> 8;
880 bcm->sprom.maxpower_bgphy = value & 0x00FF;
883 value = sprom[BCM43xx_SPROM_PA1B0];
884 bcm->sprom.pa1b0 = value;
885 value = sprom[BCM43xx_SPROM_PA1B1];
886 bcm->sprom.pa1b1 = value;
887 value = sprom[BCM43xx_SPROM_PA1B2];
888 bcm->sprom.pa1b2 = value;
890 /* idle tssi target */
891 value = sprom[BCM43xx_SPROM_IDL_TSSI_TGT];
892 bcm->sprom.idle_tssi_tgt_aphy = value & 0x00FF;
893 bcm->sprom.idle_tssi_tgt_bgphy = (value & 0xFF00) >> 8;
896 value = sprom[BCM43xx_SPROM_BOARDFLAGS];
899 bcm->sprom.boardflags = value;
902 value = sprom[BCM43xx_SPROM_ANTENNA_GAIN];
903 if (value == 0x0000 || value == 0xFFFF)
905 /* convert values to Q5.2 */
906 bcm->sprom.antennagain_aphy = ((value & 0xFF00) >> 8) * 4;
907 bcm->sprom.antennagain_bgphy = (value & 0x00FF) * 4;
914 static void bcm43xx_geo_init(struct bcm43xx_private *bcm)
916 struct ieee80211_geo geo;
917 struct ieee80211_channel *chan;
918 int have_a = 0, have_bg = 0;
921 struct bcm43xx_phyinfo *phy;
922 const char *iso_country;
924 memset(&geo, 0, sizeof(geo));
925 num80211 = bcm43xx_num_80211_cores(bcm);
926 for (i = 0; i < num80211; i++) {
929 case BCM43xx_PHYTYPE_B:
930 case BCM43xx_PHYTYPE_G:
933 case BCM43xx_PHYTYPE_A:
940 iso_country = bcm43xx_locale_iso(bcm->sprom.locale);
943 for (i = 0, channel = 0; channel < 201; channel++) {
945 chan->freq = bcm43xx_channel_to_freq_a(channel);
946 chan->channel = channel;
951 for (i = 0, channel = 1; channel < 15; channel++) {
953 chan->freq = bcm43xx_channel_to_freq_bg(channel);
954 chan->channel = channel;
958 memcpy(geo.name, iso_country, 2);
959 if (0 /*TODO: Outdoor use only */)
961 else if (0 /*TODO: Indoor use only */)
967 ieee80211_set_geo(bcm->ieee, &geo);
970 /* DummyTransmission function, as documented on
971 * http://bcm-specs.sipsolutions.net/DummyTransmission
973 void bcm43xx_dummy_transmission(struct bcm43xx_private *bcm)
975 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
976 unsigned int i, max_loop;
987 case BCM43xx_PHYTYPE_A:
989 buffer[0] = 0xCC010200;
991 case BCM43xx_PHYTYPE_B:
992 case BCM43xx_PHYTYPE_G:
994 buffer[0] = 0x6E840B00;
1001 for (i = 0; i < 5; i++)
1002 bcm43xx_ram_write(bcm, i * 4, buffer[i]);
1004 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */
1006 bcm43xx_write16(bcm, 0x0568, 0x0000);
1007 bcm43xx_write16(bcm, 0x07C0, 0x0000);
1008 bcm43xx_write16(bcm, 0x050C, ((phy->type == BCM43xx_PHYTYPE_A) ? 1 : 0));
1009 bcm43xx_write16(bcm, 0x0508, 0x0000);
1010 bcm43xx_write16(bcm, 0x050A, 0x0000);
1011 bcm43xx_write16(bcm, 0x054C, 0x0000);
1012 bcm43xx_write16(bcm, 0x056A, 0x0014);
1013 bcm43xx_write16(bcm, 0x0568, 0x0826);
1014 bcm43xx_write16(bcm, 0x0500, 0x0000);
1015 bcm43xx_write16(bcm, 0x0502, 0x0030);
1017 for (i = 0x00; i < max_loop; i++) {
1018 value = bcm43xx_read16(bcm, 0x050E);
1019 if ((value & 0x0080) != 0)
1023 for (i = 0x00; i < 0x0A; i++) {
1024 value = bcm43xx_read16(bcm, 0x050E);
1025 if ((value & 0x0400) != 0)
1029 for (i = 0x00; i < 0x0A; i++) {
1030 value = bcm43xx_read16(bcm, 0x0690);
1031 if ((value & 0x0100) == 0)
1037 static void key_write(struct bcm43xx_private *bcm,
1038 u8 index, u8 algorithm, const u16 *key)
1040 unsigned int i, basic_wep = 0;
1044 /* Write associated key information */
1045 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x100 + (index * 2),
1046 ((index << 4) | (algorithm & 0x0F)));
1048 /* The first 4 WEP keys need extra love */
1049 if (((algorithm == BCM43xx_SEC_ALGO_WEP) ||
1050 (algorithm == BCM43xx_SEC_ALGO_WEP104)) && (index < 4))
1053 /* Write key payload, 8 little endian words */
1054 offset = bcm->security_offset + (index * BCM43xx_SEC_KEYSIZE);
1055 for (i = 0; i < (BCM43xx_SEC_KEYSIZE / sizeof(u16)); i++) {
1056 value = cpu_to_le16(key[i]);
1057 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED,
1058 offset + (i * 2), value);
1063 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED,
1064 offset + (i * 2) + 4 * BCM43xx_SEC_KEYSIZE,
1069 static void keymac_write(struct bcm43xx_private *bcm,
1070 u8 index, const u32 *addr)
1072 /* for keys 0-3 there is no associated mac address */
1077 if (bcm->current_core->rev >= 5) {
1078 bcm43xx_shm_write32(bcm,
1081 cpu_to_be32(*addr));
1082 bcm43xx_shm_write16(bcm,
1085 cpu_to_be16(*((u16 *)(addr + 1))));
1088 TODO(); /* Put them in the macaddress filter */
1091 /* Put them BCM43xx_SHM_SHARED, stating index 0x0120.
1092 Keep in mind to update the count of keymacs in 0x003E as well! */
1097 static int bcm43xx_key_write(struct bcm43xx_private *bcm,
1098 u8 index, u8 algorithm,
1099 const u8 *_key, int key_len,
1102 u8 key[BCM43xx_SEC_KEYSIZE] = { 0 };
1104 if (index >= ARRAY_SIZE(bcm->key))
1106 if (key_len > ARRAY_SIZE(key))
1108 if (algorithm < 1 || algorithm > 5)
1111 memcpy(key, _key, key_len);
1112 key_write(bcm, index, algorithm, (const u16 *)key);
1113 keymac_write(bcm, index, (const u32 *)mac_addr);
1115 bcm->key[index].algorithm = algorithm;
1120 static void bcm43xx_clear_keys(struct bcm43xx_private *bcm)
1122 static const u32 zero_mac[2] = { 0 };
1123 unsigned int i,j, nr_keys = 54;
1126 if (bcm->current_core->rev < 5)
1128 assert(nr_keys <= ARRAY_SIZE(bcm->key));
1130 for (i = 0; i < nr_keys; i++) {
1131 bcm->key[i].enabled = 0;
1132 /* returns for i < 4 immediately */
1133 keymac_write(bcm, i, zero_mac);
1134 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED,
1135 0x100 + (i * 2), 0x0000);
1136 for (j = 0; j < 8; j++) {
1137 offset = bcm->security_offset + (j * 4) + (i * BCM43xx_SEC_KEYSIZE);
1138 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED,
1142 dprintk(KERN_INFO PFX "Keys cleared\n");
1145 /* Lowlevel core-switch function. This is only to be used in
1146 * bcm43xx_switch_core() and bcm43xx_probe_cores()
1148 static int _switch_core(struct bcm43xx_private *bcm, int core)
1156 err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_ACTIVE_CORE,
1157 (core * 0x1000) + 0x18000000);
1160 err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_ACTIVE_CORE,
1164 current_core = (current_core - 0x18000000) / 0x1000;
1165 if (current_core == core)
1168 if (unlikely(attempts++ > BCM43xx_SWITCH_CORE_MAX_RETRIES))
1172 #ifdef CONFIG_BCM947XX
1173 if (bcm->pci_dev->bus->number == 0)
1174 bcm->current_core_offset = 0x1000 * core;
1176 bcm->current_core_offset = 0;
1181 printk(KERN_ERR PFX "Failed to switch to core %d\n", core);
1185 int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *new_core)
1189 if (unlikely(!new_core))
1191 if (!(new_core->flags & BCM43xx_COREFLAG_AVAILABLE))
1193 if (bcm->current_core == new_core)
1195 err = _switch_core(bcm, new_core->index);
1197 bcm->current_core = new_core;
1202 static int bcm43xx_core_enabled(struct bcm43xx_private *bcm)
1206 value = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1207 value &= BCM43xx_SBTMSTATELOW_CLOCK | BCM43xx_SBTMSTATELOW_RESET
1208 | BCM43xx_SBTMSTATELOW_REJECT;
1210 return (value == BCM43xx_SBTMSTATELOW_CLOCK);
1213 /* disable current core */
1214 static int bcm43xx_core_disable(struct bcm43xx_private *bcm, u32 core_flags)
1220 /* fetch sbtmstatelow from core information registers */
1221 sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1223 /* core is already in reset */
1224 if (sbtmstatelow & BCM43xx_SBTMSTATELOW_RESET)
1227 if (sbtmstatelow & BCM43xx_SBTMSTATELOW_CLOCK) {
1228 sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK |
1229 BCM43xx_SBTMSTATELOW_REJECT;
1230 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1232 for (i = 0; i < 1000; i++) {
1233 sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1234 if (sbtmstatelow & BCM43xx_SBTMSTATELOW_REJECT) {
1241 printk(KERN_ERR PFX "Error: core_disable() REJECT timeout!\n");
1245 for (i = 0; i < 1000; i++) {
1246 sbtmstatehigh = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH);
1247 if (!(sbtmstatehigh & BCM43xx_SBTMSTATEHIGH_BUSY)) {
1254 printk(KERN_ERR PFX "Error: core_disable() BUSY timeout!\n");
1258 sbtmstatelow = BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK |
1259 BCM43xx_SBTMSTATELOW_REJECT |
1260 BCM43xx_SBTMSTATELOW_RESET |
1261 BCM43xx_SBTMSTATELOW_CLOCK |
1263 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1267 sbtmstatelow = BCM43xx_SBTMSTATELOW_RESET |
1268 BCM43xx_SBTMSTATELOW_REJECT |
1270 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1273 bcm->current_core->flags &= ~ BCM43xx_COREFLAG_ENABLED;
1277 /* enable (reset) current core */
1278 static int bcm43xx_core_enable(struct bcm43xx_private *bcm, u32 core_flags)
1285 err = bcm43xx_core_disable(bcm, core_flags);
1289 sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK |
1290 BCM43xx_SBTMSTATELOW_RESET |
1291 BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK |
1293 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1296 sbtmstatehigh = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH);
1297 if (sbtmstatehigh & BCM43xx_SBTMSTATEHIGH_SERROR) {
1298 sbtmstatehigh = 0x00000000;
1299 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATEHIGH, sbtmstatehigh);
1302 sbimstate = bcm43xx_read32(bcm, BCM43xx_CIR_SBIMSTATE);
1303 if (sbimstate & (BCM43xx_SBIMSTATE_IB_ERROR | BCM43xx_SBIMSTATE_TIMEOUT)) {
1304 sbimstate &= ~(BCM43xx_SBIMSTATE_IB_ERROR | BCM43xx_SBIMSTATE_TIMEOUT);
1305 bcm43xx_write32(bcm, BCM43xx_CIR_SBIMSTATE, sbimstate);
1308 sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK |
1309 BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK |
1311 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1314 sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK | core_flags;
1315 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1318 bcm->current_core->flags |= BCM43xx_COREFLAG_ENABLED;
1324 /* http://bcm-specs.sipsolutions.net/80211CoreReset */
1325 void bcm43xx_wireless_core_reset(struct bcm43xx_private *bcm, int connect_phy)
1327 u32 flags = 0x00040000;
1329 if ((bcm43xx_core_enabled(bcm)) &&
1330 !bcm43xx_using_pio(bcm)) {
1331 //FIXME: Do we _really_ want #ifndef CONFIG_BCM947XX here?
1332 #ifndef CONFIG_BCM947XX
1333 /* reset all used DMA controllers. */
1334 bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA1_BASE);
1335 bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA2_BASE);
1336 bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA3_BASE);
1337 bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA4_BASE);
1338 bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA1_BASE);
1339 if (bcm->current_core->rev < 5)
1340 bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA4_BASE);
1343 if (bcm->shutting_down) {
1344 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
1345 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
1346 & ~(BCM43xx_SBF_MAC_ENABLED | 0x00000002));
1349 flags |= 0x20000000;
1350 bcm43xx_phy_connect(bcm, connect_phy);
1351 bcm43xx_core_enable(bcm, flags);
1352 bcm43xx_write16(bcm, 0x03E6, 0x0000);
1353 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
1354 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
1359 static void bcm43xx_wireless_core_disable(struct bcm43xx_private *bcm)
1361 bcm43xx_radio_turn_off(bcm);
1362 bcm43xx_write16(bcm, 0x03E6, 0x00F4);
1363 bcm43xx_core_disable(bcm, 0);
1366 /* Mark the current 80211 core inactive.
1367 * "active_80211_core" is the other 80211 core, which is used.
1369 static int bcm43xx_wireless_core_mark_inactive(struct bcm43xx_private *bcm,
1370 struct bcm43xx_coreinfo *active_80211_core)
1373 struct bcm43xx_coreinfo *old_core;
1376 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
1377 bcm43xx_radio_turn_off(bcm);
1378 sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1379 sbtmstatelow &= ~0x200a0000;
1380 sbtmstatelow |= 0xa0000;
1381 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1383 sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1384 sbtmstatelow &= ~0xa0000;
1385 sbtmstatelow |= 0x80000;
1386 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1389 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) {
1390 old_core = bcm->current_core;
1391 err = bcm43xx_switch_core(bcm, active_80211_core);
1394 sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
1395 sbtmstatelow &= ~0x20000000;
1396 sbtmstatelow |= 0x20000000;
1397 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1398 err = bcm43xx_switch_core(bcm, old_core);
1405 static void handle_irq_transmit_status(struct bcm43xx_private *bcm)
1409 struct bcm43xx_xmitstatus stat;
1411 assert(bcm->current_core->id == BCM43xx_COREID_80211);
1412 assert(bcm->current_core->rev >= 5);
1415 v0 = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0);
1418 v1 = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_1);
1420 stat.cookie = (v0 >> 16) & 0x0000FFFF;
1421 tmp = (u16)((v0 & 0xFFF0) | ((v0 & 0xF) >> 1));
1422 stat.flags = tmp & 0xFF;
1423 stat.cnt1 = (tmp & 0x0F00) >> 8;
1424 stat.cnt2 = (tmp & 0xF000) >> 12;
1425 stat.seq = (u16)(v1 & 0xFFFF);
1426 stat.unknown = (u16)((v1 >> 16) & 0xFF);
1428 bcm43xx_debugfs_log_txstat(bcm, &stat);
1430 if (stat.flags & BCM43xx_TXSTAT_FLAG_IGNORE)
1432 if (!(stat.flags & BCM43xx_TXSTAT_FLAG_ACK)) {
1433 //TODO: packet was not acked (was lost)
1435 //TODO: There are more (unknown) flags to test. see bcm43xx_main.h
1437 if (bcm43xx_using_pio(bcm))
1438 bcm43xx_pio_handle_xmitstatus(bcm, &stat);
1440 bcm43xx_dma_handle_xmitstatus(bcm, &stat);
1444 static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm)
1446 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F);
1447 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x40A, 0x7F7F);
1448 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD,
1449 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD) | (1 << 4));
1450 assert(bcm->noisecalc.core_at_start == bcm->current_core);
1451 assert(bcm->noisecalc.channel_at_start == bcm->current_core->radio->channel);
1454 static void bcm43xx_calculate_link_quality(struct bcm43xx_private *bcm)
1456 /* Top half of Link Quality calculation. */
1458 if (bcm->noisecalc.calculation_running)
1460 bcm->noisecalc.core_at_start = bcm->current_core;
1461 bcm->noisecalc.channel_at_start = bcm->current_core->radio->channel;
1462 bcm->noisecalc.calculation_running = 1;
1463 bcm->noisecalc.nr_samples = 0;
1465 bcm43xx_generate_noise_sample(bcm);
1468 static void handle_irq_noise(struct bcm43xx_private *bcm)
1470 struct bcm43xx_radioinfo *radio = bcm->current_core->radio;
1476 /* Bottom half of Link Quality calculation. */
1478 assert(bcm->noisecalc.calculation_running);
1479 if (bcm->noisecalc.core_at_start != bcm->current_core ||
1480 bcm->noisecalc.channel_at_start != radio->channel)
1481 goto drop_calculation;
1482 tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x408);
1483 noise[0] = (tmp & 0x00FF);
1484 noise[1] = (tmp & 0xFF00) >> 8;
1485 tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x40A);
1486 noise[2] = (tmp & 0x00FF);
1487 noise[3] = (tmp & 0xFF00) >> 8;
1488 if (noise[0] == 0x7F || noise[1] == 0x7F ||
1489 noise[2] == 0x7F || noise[3] == 0x7F)
1492 /* Get the noise samples. */
1493 assert(bcm->noisecalc.nr_samples <= 8);
1494 i = bcm->noisecalc.nr_samples;
1495 noise[0] = limit_value(noise[0], 0, ARRAY_SIZE(radio->nrssi_lt) - 1);
1496 noise[1] = limit_value(noise[1], 0, ARRAY_SIZE(radio->nrssi_lt) - 1);
1497 noise[2] = limit_value(noise[2], 0, ARRAY_SIZE(radio->nrssi_lt) - 1);
1498 noise[3] = limit_value(noise[3], 0, ARRAY_SIZE(radio->nrssi_lt) - 1);
1499 bcm->noisecalc.samples[i][0] = radio->nrssi_lt[noise[0]];
1500 bcm->noisecalc.samples[i][1] = radio->nrssi_lt[noise[1]];
1501 bcm->noisecalc.samples[i][2] = radio->nrssi_lt[noise[2]];
1502 bcm->noisecalc.samples[i][3] = radio->nrssi_lt[noise[3]];
1503 bcm->noisecalc.nr_samples++;
1504 if (bcm->noisecalc.nr_samples == 8) {
1505 /* Calculate the Link Quality by the noise samples. */
1507 for (i = 0; i < 8; i++) {
1508 for (j = 0; j < 4; j++)
1509 average += bcm->noisecalc.samples[i][j];
1515 tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x40C);
1516 tmp = (tmp / 128) & 0x1F;
1527 bcm->stats.link_quality = 0;
1528 else if (average > -75)
1529 bcm->stats.link_quality = 1;
1530 else if (average > -85)
1531 bcm->stats.link_quality = 2;
1533 bcm->stats.link_quality = 3;
1534 // dprintk(KERN_INFO PFX "Link Quality: %u (avg was %d)\n", bcm->stats.link_quality, average);
1536 bcm->noisecalc.calculation_running = 0;
1540 bcm43xx_generate_noise_sample(bcm);
1543 static void handle_irq_ps(struct bcm43xx_private *bcm)
1545 if (bcm->ieee->iw_mode == IW_MODE_MASTER) {
1548 if (1/*FIXME: the last PSpoll frame was sent successfully */)
1549 bcm43xx_power_saving_ctl_bits(bcm, -1, -1);
1551 if (bcm->ieee->iw_mode == IW_MODE_ADHOC)
1552 bcm->reg124_set_0x4 = 1;
1553 //FIXME else set to false?
1556 static void handle_irq_reg124(struct bcm43xx_private *bcm)
1558 if (!bcm->reg124_set_0x4)
1560 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD,
1561 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD)
1563 //FIXME: reset reg124_set_0x4 to false?
1566 static void handle_irq_pmq(struct bcm43xx_private *bcm)
1573 tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_PS_STATUS);
1574 if (!(tmp & 0x00000008))
1577 /* 16bit write is odd, but correct. */
1578 bcm43xx_write16(bcm, BCM43xx_MMIO_PS_STATUS, 0x0002);
1581 static void bcm43xx_generate_beacon_template(struct bcm43xx_private *bcm,
1582 u16 ram_offset, u16 shm_size_offset)
1588 //FIXME: assumption: The chip sets the timestamp
1590 bcm43xx_ram_write(bcm, ram_offset++, value);
1591 bcm43xx_ram_write(bcm, ram_offset++, value);
1594 /* Beacon Interval / Capability Information */
1595 value = 0x0000;//FIXME: Which interval?
1596 value |= (1 << 0) << 16; /* ESS */
1597 value |= (1 << 2) << 16; /* CF Pollable */ //FIXME?
1598 value |= (1 << 3) << 16; /* CF Poll Request */ //FIXME?
1599 if (!bcm->ieee->open_wep)
1600 value |= (1 << 4) << 16; /* Privacy */
1601 bcm43xx_ram_write(bcm, ram_offset++, value);
1607 /* FH Parameter Set */
1610 /* DS Parameter Set */
1613 /* CF Parameter Set */
1619 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, shm_size_offset, size);
1622 static void handle_irq_beacon(struct bcm43xx_private *bcm)
1626 bcm->irq_savedstate &= ~BCM43xx_IRQ_BEACON;
1627 status = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD);
1629 if ((status & 0x1) && (status & 0x2)) {
1630 /* ACK beacon IRQ. */
1631 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON,
1632 BCM43xx_IRQ_BEACON);
1633 bcm->irq_savedstate |= BCM43xx_IRQ_BEACON;
1636 if (!(status & 0x1)) {
1637 bcm43xx_generate_beacon_template(bcm, 0x68, 0x18);
1639 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD, status);
1641 if (!(status & 0x2)) {
1642 bcm43xx_generate_beacon_template(bcm, 0x468, 0x1A);
1644 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD, status);
1648 /* Debug helper for irq bottom-half to print all reason registers. */
1649 #define bcmirq_print_reasons(description) \
1651 dprintkl(KERN_ERR PFX description "\n" \
1652 KERN_ERR PFX " Generic Reason: 0x%08x\n" \
1653 KERN_ERR PFX " DMA reasons: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n" \
1654 KERN_ERR PFX " DMA TX status: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n", \
1656 dma_reason[0], dma_reason[1], \
1657 dma_reason[2], dma_reason[3], \
1658 bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_BASE + BCM43xx_DMA_TX_STATUS), \
1659 bcm43xx_read32(bcm, BCM43xx_MMIO_DMA2_BASE + BCM43xx_DMA_TX_STATUS), \
1660 bcm43xx_read32(bcm, BCM43xx_MMIO_DMA3_BASE + BCM43xx_DMA_TX_STATUS), \
1661 bcm43xx_read32(bcm, BCM43xx_MMIO_DMA4_BASE + BCM43xx_DMA_TX_STATUS)); \
1664 /* Interrupt handler bottom-half */
1665 static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm)
1670 unsigned long flags;
1672 #ifdef CONFIG_BCM43XX_DEBUG
1673 u32 _handled = 0x00000000;
1674 # define bcmirq_handled(irq) do { _handled |= (irq); } while (0)
1676 # define bcmirq_handled(irq) do { /* nothing */ } while (0)
1677 #endif /* CONFIG_BCM43XX_DEBUG*/
1679 spin_lock_irqsave(&bcm->lock, flags);
1680 reason = bcm->irq_reason;
1681 dma_reason[0] = bcm->dma_reason[0];
1682 dma_reason[1] = bcm->dma_reason[1];
1683 dma_reason[2] = bcm->dma_reason[2];
1684 dma_reason[3] = bcm->dma_reason[3];
1686 if (unlikely(reason & BCM43xx_IRQ_XMIT_ERROR)) {
1687 /* TX error. We get this when Template Ram is written in wrong endianess
1688 * in dummy_tx(). We also get this if something is wrong with the TX header
1689 * on DMA or PIO queues.
1690 * Maybe we get this in other error conditions, too.
1692 bcmirq_print_reasons("XMIT ERROR");
1693 bcmirq_handled(BCM43xx_IRQ_XMIT_ERROR);
1696 if (reason & BCM43xx_IRQ_PS) {
1698 bcmirq_handled(BCM43xx_IRQ_PS);
1701 if (reason & BCM43xx_IRQ_REG124) {
1702 handle_irq_reg124(bcm);
1703 bcmirq_handled(BCM43xx_IRQ_REG124);
1706 if (reason & BCM43xx_IRQ_BEACON) {
1707 if (bcm->ieee->iw_mode == IW_MODE_MASTER)
1708 handle_irq_beacon(bcm);
1709 bcmirq_handled(BCM43xx_IRQ_BEACON);
1712 if (reason & BCM43xx_IRQ_PMQ) {
1713 handle_irq_pmq(bcm);
1714 bcmirq_handled(BCM43xx_IRQ_PMQ);
1717 if (reason & BCM43xx_IRQ_SCAN) {
1719 //bcmirq_handled(BCM43xx_IRQ_SCAN);
1722 if (reason & BCM43xx_IRQ_NOISE) {
1723 handle_irq_noise(bcm);
1724 bcmirq_handled(BCM43xx_IRQ_NOISE);
1727 /* Check the DMA reason registers for received data. */
1728 assert(!(dma_reason[1] & BCM43xx_DMAIRQ_RX_DONE));
1729 assert(!(dma_reason[2] & BCM43xx_DMAIRQ_RX_DONE));
1730 if (dma_reason[0] & BCM43xx_DMAIRQ_RX_DONE) {
1731 if (bcm43xx_using_pio(bcm))
1732 bcm43xx_pio_rx(bcm->current_core->pio->queue0);
1734 bcm43xx_dma_rx(bcm->current_core->dma->rx_ring0);
1735 /* We intentionally don't set "activity" to 1, here. */
1737 if (dma_reason[3] & BCM43xx_DMAIRQ_RX_DONE) {
1738 if (likely(bcm->current_core->rev < 5)) {
1739 if (bcm43xx_using_pio(bcm))
1740 bcm43xx_pio_rx(bcm->current_core->pio->queue3);
1742 bcm43xx_dma_rx(bcm->current_core->dma->rx_ring1);
1747 bcmirq_handled(BCM43xx_IRQ_RX);
1749 if (reason & BCM43xx_IRQ_XMIT_STATUS) {
1750 if (bcm->current_core->rev >= 5) {
1751 handle_irq_transmit_status(bcm);
1754 //TODO: In AP mode, this also causes sending of powersave responses.
1755 bcmirq_handled(BCM43xx_IRQ_XMIT_STATUS);
1758 /* We get spurious IRQs, althought they are masked.
1759 * Assume they are void and ignore them.
1761 bcmirq_handled(~(bcm->irq_savedstate));
1762 /* IRQ_PIO_WORKAROUND is handled in the top-half. */
1763 bcmirq_handled(BCM43xx_IRQ_PIO_WORKAROUND);
1764 #ifdef CONFIG_BCM43XX_DEBUG
1765 if (unlikely(reason & ~_handled)) {
1766 printkl(KERN_WARNING PFX
1767 "Unhandled IRQ! Reason: 0x%08x, Unhandled: 0x%08x, "
1768 "DMA: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
1769 reason, (reason & ~_handled),
1770 dma_reason[0], dma_reason[1],
1771 dma_reason[2], dma_reason[3]);
1774 #undef bcmirq_handled
1776 if (!modparam_noleds)
1777 bcm43xx_leds_update(bcm, activity);
1778 bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate);
1779 spin_unlock_irqrestore(&bcm->lock, flags);
1782 #undef bcmirq_print_reasons
1784 static void bcm43xx_interrupt_ack(struct bcm43xx_private *bcm,
1785 u32 reason, u32 mask)
1787 bcm->dma_reason[0] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_REASON)
1789 bcm->dma_reason[1] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA2_REASON)
1791 bcm->dma_reason[2] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA3_REASON)
1793 bcm->dma_reason[3] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA4_REASON)
1796 if (bcm43xx_using_pio(bcm) &&
1797 (bcm->current_core->rev < 3) &&
1798 (!(reason & BCM43xx_IRQ_PIO_WORKAROUND))) {
1799 /* Apply a PIO specific workaround to the dma_reasons */
1801 #define apply_pio_workaround(BASE, QNUM) \
1803 if (bcm43xx_read16(bcm, BASE + BCM43xx_PIO_RXCTL) & BCM43xx_PIO_RXCTL_DATAAVAILABLE) \
1804 bcm->dma_reason[QNUM] |= 0x00010000; \
1806 bcm->dma_reason[QNUM] &= ~0x00010000; \
1809 apply_pio_workaround(BCM43xx_MMIO_PIO1_BASE, 0);
1810 apply_pio_workaround(BCM43xx_MMIO_PIO2_BASE, 1);
1811 apply_pio_workaround(BCM43xx_MMIO_PIO3_BASE, 2);
1812 apply_pio_workaround(BCM43xx_MMIO_PIO4_BASE, 3);
1814 #undef apply_pio_workaround
1817 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON,
1820 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_REASON,
1821 bcm->dma_reason[0]);
1822 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA2_REASON,
1823 bcm->dma_reason[1]);
1824 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_REASON,
1825 bcm->dma_reason[2]);
1826 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_REASON,
1827 bcm->dma_reason[3]);
1830 /* Interrupt handler top-half */
1831 static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
1833 struct bcm43xx_private *bcm = dev_id;
1839 spin_lock(&bcm->lock);
1841 reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
1842 if (reason == 0xffffffff) {
1843 /* irq not for us (shared irq) */
1844 spin_unlock(&bcm->lock);
1847 mask = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK);
1848 if (!(reason & mask)) {
1849 spin_unlock(&bcm->lock);
1853 bcm43xx_interrupt_ack(bcm, reason, mask);
1855 /* Only accept IRQs, if we are initialized properly.
1856 * This avoids an RX race while initializing.
1857 * We should probably not enable IRQs before we are initialized
1858 * completely, but some careful work is needed to fix this. I think it
1859 * is best to stay with this cheap workaround for now... .
1861 if (likely(bcm->initialized)) {
1862 /* disable all IRQs. They are enabled again in the bottom half. */
1863 bcm->irq_savedstate = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
1864 /* save the reason code and call our bottom half. */
1865 bcm->irq_reason = reason;
1866 tasklet_schedule(&bcm->isr_tasklet);
1869 spin_unlock(&bcm->lock);
1874 static void bcm43xx_release_firmware(struct bcm43xx_private *bcm, int force)
1876 if (bcm->firmware_norelease && !force)
1877 return; /* Suspending or controller reset. */
1878 release_firmware(bcm->ucode);
1880 release_firmware(bcm->pcm);
1882 release_firmware(bcm->initvals0);
1883 bcm->initvals0 = NULL;
1884 release_firmware(bcm->initvals1);
1885 bcm->initvals1 = NULL;
1888 static int bcm43xx_request_firmware(struct bcm43xx_private *bcm)
1890 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
1891 u8 rev = bcm->current_core->rev;
1894 char buf[22 + sizeof(modparam_fwpostfix) - 1] = { 0 };
1897 snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_microcode%d%s.fw",
1898 (rev >= 5 ? 5 : rev),
1899 modparam_fwpostfix);
1900 err = request_firmware(&bcm->ucode, buf, &bcm->pci_dev->dev);
1903 "Error: Microcode \"%s\" not available or load failed.\n",
1910 snprintf(buf, ARRAY_SIZE(buf),
1911 "bcm43xx_pcm%d%s.fw",
1913 modparam_fwpostfix);
1914 err = request_firmware(&bcm->pcm, buf, &bcm->pci_dev->dev);
1917 "Error: PCM \"%s\" not available or load failed.\n",
1923 if (!bcm->initvals0) {
1924 if (rev == 2 || rev == 4) {
1925 switch (phy->type) {
1926 case BCM43xx_PHYTYPE_A:
1929 case BCM43xx_PHYTYPE_B:
1930 case BCM43xx_PHYTYPE_G:
1937 } else if (rev >= 5) {
1938 switch (phy->type) {
1939 case BCM43xx_PHYTYPE_A:
1942 case BCM43xx_PHYTYPE_B:
1943 case BCM43xx_PHYTYPE_G:
1951 snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_initval%02d%s.fw",
1952 nr, modparam_fwpostfix);
1954 err = request_firmware(&bcm->initvals0, buf, &bcm->pci_dev->dev);
1957 "Error: InitVals \"%s\" not available or load failed.\n",
1961 if (bcm->initvals0->size % sizeof(struct bcm43xx_initval)) {
1962 printk(KERN_ERR PFX "InitVals fileformat error.\n");
1967 if (!bcm->initvals1) {
1971 switch (phy->type) {
1972 case BCM43xx_PHYTYPE_A:
1973 sbtmstatehigh = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH);
1974 if (sbtmstatehigh & 0x00010000)
1979 case BCM43xx_PHYTYPE_B:
1980 case BCM43xx_PHYTYPE_G:
1986 snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_initval%02d%s.fw",
1987 nr, modparam_fwpostfix);
1989 err = request_firmware(&bcm->initvals1, buf, &bcm->pci_dev->dev);
1992 "Error: InitVals \"%s\" not available or load failed.\n",
1996 if (bcm->initvals1->size % sizeof(struct bcm43xx_initval)) {
1997 printk(KERN_ERR PFX "InitVals fileformat error.\n");
2006 bcm43xx_release_firmware(bcm, 1);
2009 printk(KERN_ERR PFX "Error: No InitVals available!\n");
2014 static void bcm43xx_upload_microcode(struct bcm43xx_private *bcm)
2017 unsigned int i, len;
2019 #ifdef DEBUG_ENABLE_UCODE_MMIO_PRINT
2020 bcm43xx_mmioprint_enable(bcm);
2022 bcm43xx_mmioprint_disable(bcm);
2025 /* Upload Microcode. */
2026 data = (u32 *)(bcm->ucode->data);
2027 len = bcm->ucode->size / sizeof(u32);
2028 bcm43xx_shm_control_word(bcm, BCM43xx_SHM_UCODE, 0x0000);
2029 for (i = 0; i < len; i++) {
2030 bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA,
2031 be32_to_cpu(data[i]));
2035 /* Upload PCM data. */
2036 data = (u32 *)(bcm->pcm->data);
2037 len = bcm->pcm->size / sizeof(u32);
2038 bcm43xx_shm_control_word(bcm, BCM43xx_SHM_PCM, 0x01ea);
2039 bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA, 0x00004000);
2040 bcm43xx_shm_control_word(bcm, BCM43xx_SHM_PCM, 0x01eb);
2041 for (i = 0; i < len; i++) {
2042 bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA,
2043 be32_to_cpu(data[i]));
2047 #ifdef DEBUG_ENABLE_UCODE_MMIO_PRINT
2048 bcm43xx_mmioprint_disable(bcm);
2050 bcm43xx_mmioprint_enable(bcm);
2054 static int bcm43xx_write_initvals(struct bcm43xx_private *bcm,
2055 const struct bcm43xx_initval *data,
2056 const unsigned int len)
2062 for (i = 0; i < len; i++) {
2063 offset = be16_to_cpu(data[i].offset);
2064 size = be16_to_cpu(data[i].size);
2065 value = be32_to_cpu(data[i].value);
2067 if (unlikely(offset >= 0x1000))
2070 if (unlikely(value & 0xFFFF0000))
2072 bcm43xx_write16(bcm, offset, (u16)value);
2073 } else if (size == 4) {
2074 bcm43xx_write32(bcm, offset, value);
2082 printk(KERN_ERR PFX "InitVals (bcm43xx_initvalXX.fw) file-format error. "
2083 "Please fix your bcm43xx firmware files.\n");
2087 static int bcm43xx_upload_initvals(struct bcm43xx_private *bcm)
2091 #ifdef DEBUG_ENABLE_UCODE_MMIO_PRINT
2092 bcm43xx_mmioprint_enable(bcm);
2094 bcm43xx_mmioprint_disable(bcm);
2097 err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)bcm->initvals0->data,
2098 bcm->initvals0->size / sizeof(struct bcm43xx_initval));
2101 if (bcm->initvals1) {
2102 err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)bcm->initvals1->data,
2103 bcm->initvals1->size / sizeof(struct bcm43xx_initval));
2109 #ifdef DEBUG_ENABLE_UCODE_MMIO_PRINT
2110 bcm43xx_mmioprint_disable(bcm);
2112 bcm43xx_mmioprint_enable(bcm);
2117 static int bcm43xx_initialize_irq(struct bcm43xx_private *bcm)
2123 bcm->irq = bcm->pci_dev->irq;
2124 #ifdef CONFIG_BCM947XX
2125 if (bcm->pci_dev->bus->number == 0) {
2126 struct pci_dev *d = NULL;
2127 /* FIXME: we will probably need more device IDs here... */
2128 d = pci_find_device(PCI_VENDOR_ID_BROADCOM, 0x4324, NULL);
2134 res = request_irq(bcm->irq, bcm43xx_interrupt_handler,
2135 SA_SHIRQ, KBUILD_MODNAME, bcm);
2137 printk(KERN_ERR PFX "Cannot register IRQ%d\n", bcm->irq);
2140 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, 0xffffffff);
2141 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, 0x00020402);
2144 data = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
2145 if (data == BCM43xx_IRQ_READY)
2148 if (i >= BCM43xx_IRQWAIT_MAX_RETRIES) {
2149 printk(KERN_ERR PFX "Card IRQ register not responding. "
2151 free_irq(bcm->irq, bcm);
2157 bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
2162 /* Switch to the core used to write the GPIO register.
2163 * This is either the ChipCommon, or the PCI core.
2165 static int switch_to_gpio_core(struct bcm43xx_private *bcm)
2169 /* Where to find the GPIO register depends on the chipset.
2170 * If it has a ChipCommon, its register at offset 0x6c is the GPIO
2171 * control register. Otherwise the register at offset 0x6c in the
2172 * PCI core is the GPIO control register.
2174 err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon);
2175 if (err == -ENODEV) {
2176 err = bcm43xx_switch_core(bcm, &bcm->core_pci);
2177 if (unlikely(err == -ENODEV)) {
2178 printk(KERN_ERR PFX "gpio error: "
2179 "Neither ChipCommon nor PCI core available!\n");
2181 } else if (unlikely(err != 0))
2183 } else if (unlikely(err != 0))
2189 /* Initialize the GPIOs
2190 * http://bcm-specs.sipsolutions.net/GPIO
2192 static int bcm43xx_gpio_init(struct bcm43xx_private *bcm)
2194 struct bcm43xx_coreinfo *old_core;
2198 value = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2200 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value);
2204 bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL,
2205 bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL) & 0xFFF0);
2206 bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_MASK,
2207 bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_MASK) | 0x000F);
2209 old_core = bcm->current_core;
2211 err = switch_to_gpio_core(bcm);
2215 if (bcm->current_core->rev >= 2){
2219 if (bcm->chip_id == 0x4301) {
2223 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) {
2228 bcm43xx_write32(bcm, BCM43xx_GPIO_CONTROL,
2229 (bcm43xx_read32(bcm, BCM43xx_GPIO_CONTROL) & mask) | value);
2231 err = bcm43xx_switch_core(bcm, old_core);
2237 /* Turn off all GPIO stuff. Call this on module unload, for example. */
2238 static int bcm43xx_gpio_cleanup(struct bcm43xx_private *bcm)
2240 struct bcm43xx_coreinfo *old_core;
2243 old_core = bcm->current_core;
2244 err = switch_to_gpio_core(bcm);
2247 bcm43xx_write32(bcm, BCM43xx_GPIO_CONTROL, 0x00000000);
2248 err = bcm43xx_switch_core(bcm, old_core);
2254 /* http://bcm-specs.sipsolutions.net/EnableMac */
2255 void bcm43xx_mac_enable(struct bcm43xx_private *bcm)
2257 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
2258 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
2259 | BCM43xx_SBF_MAC_ENABLED);
2260 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, BCM43xx_IRQ_READY);
2261 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */
2262 bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
2263 bcm43xx_power_saving_ctl_bits(bcm, -1, -1);
2266 /* http://bcm-specs.sipsolutions.net/SuspendMAC */
2267 void bcm43xx_mac_suspend(struct bcm43xx_private *bcm)
2272 bcm43xx_power_saving_ctl_bits(bcm, -1, 1);
2273 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
2274 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
2275 & ~BCM43xx_SBF_MAC_ENABLED);
2276 bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
2277 for (i = 100000; i; i--) {
2278 tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
2279 if (tmp & BCM43xx_IRQ_READY)
2283 printkl(KERN_ERR PFX "MAC suspend failed\n");
2286 void bcm43xx_set_iwmode(struct bcm43xx_private *bcm,
2289 unsigned long flags;
2292 spin_lock_irqsave(&bcm->ieee->lock, flags);
2293 bcm->ieee->iw_mode = iw_mode;
2294 spin_unlock_irqrestore(&bcm->ieee->lock, flags);
2295 if (iw_mode == IW_MODE_MONITOR)
2296 bcm->net_dev->type = ARPHRD_IEEE80211;
2298 bcm->net_dev->type = ARPHRD_ETHER;
2300 if (!bcm->initialized)
2303 bcm43xx_mac_suspend(bcm);
2304 status = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2305 /* Reset status to infrastructured mode */
2306 status &= ~(BCM43xx_SBF_MODE_AP | BCM43xx_SBF_MODE_MONITOR);
2307 /*FIXME: We actually set promiscuous mode as well, until we don't
2308 * get the HW mac filter working */
2309 status |= BCM43xx_SBF_MODE_NOTADHOC | BCM43xx_SBF_MODE_PROMISC;
2312 case IW_MODE_MONITOR:
2313 status |= (BCM43xx_SBF_MODE_PROMISC |
2314 BCM43xx_SBF_MODE_MONITOR);
2317 status &= ~BCM43xx_SBF_MODE_NOTADHOC;
2319 case IW_MODE_MASTER:
2320 case IW_MODE_SECOND:
2321 case IW_MODE_REPEAT:
2322 /* TODO: No AP/Repeater mode for now :-/ */
2326 /* nothing to be done here... */
2329 printk(KERN_ERR PFX "Unknown iwmode %d\n", iw_mode);
2332 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, status);
2333 bcm43xx_mac_enable(bcm);
2336 /* This is the opposite of bcm43xx_chip_init() */
2337 static void bcm43xx_chip_cleanup(struct bcm43xx_private *bcm)
2339 bcm43xx_radio_turn_off(bcm);
2340 if (!modparam_noleds)
2341 bcm43xx_leds_exit(bcm);
2342 bcm43xx_gpio_cleanup(bcm);
2343 free_irq(bcm->irq, bcm);
2344 bcm43xx_release_firmware(bcm, 0);
2347 /* Initialize the chip
2348 * http://bcm-specs.sipsolutions.net/ChipInit
2350 static int bcm43xx_chip_init(struct bcm43xx_private *bcm)
2353 int iw_mode = bcm->ieee->iw_mode;
2358 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
2359 BCM43xx_SBF_CORE_READY
2362 err = bcm43xx_request_firmware(bcm);
2365 bcm43xx_upload_microcode(bcm);
2367 err = bcm43xx_initialize_irq(bcm);
2369 goto err_release_fw;
2371 err = bcm43xx_gpio_init(bcm);
2375 err = bcm43xx_upload_initvals(bcm);
2377 goto err_gpio_cleanup;
2378 bcm43xx_radio_turn_on(bcm);
2380 if (modparam_noleds)
2381 bcm43xx_leds_turn_off(bcm);
2383 bcm43xx_leds_update(bcm, 0);
2385 bcm43xx_write16(bcm, 0x03E6, 0x0000);
2386 err = bcm43xx_phy_init(bcm);
2390 /* Select initial Interference Mitigation. */
2391 tmp = bcm->current_core->radio->interfmode;
2392 bcm->current_core->radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE;
2393 bcm43xx_radio_set_interference_mitigation(bcm, tmp);
2395 bcm43xx_phy_set_antenna_diversity(bcm);
2396 bcm43xx_radio_set_txantenna(bcm, BCM43xx_RADIO_TXANTENNA_DEFAULT);
2397 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B) {
2398 value16 = bcm43xx_read16(bcm, 0x005E);
2400 bcm43xx_write16(bcm, 0x005E, value16);
2402 bcm43xx_write32(bcm, 0x0100, 0x01000000);
2403 if (bcm->current_core->rev < 5)
2404 bcm43xx_write32(bcm, 0x010C, 0x01000000);
2406 value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2407 value32 &= ~ BCM43xx_SBF_MODE_NOTADHOC;
2408 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value32);
2409 value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2410 value32 |= BCM43xx_SBF_MODE_NOTADHOC;
2411 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value32);
2412 /*FIXME: For now, use promiscuous mode at all times; otherwise we don't
2413 get broadcast or multicast packets */
2414 value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2415 value32 |= BCM43xx_SBF_MODE_PROMISC;
2416 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value32);
2418 if (iw_mode == IW_MODE_MONITOR) {
2419 value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2420 value32 |= BCM43xx_SBF_MODE_PROMISC;
2421 value32 |= BCM43xx_SBF_MODE_MONITOR;
2422 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value32);
2424 value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2425 value32 |= 0x100000; //FIXME: What's this? Is this correct?
2426 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value32);
2428 if (bcm43xx_using_pio(bcm)) {
2429 bcm43xx_write32(bcm, 0x0210, 0x00000100);
2430 bcm43xx_write32(bcm, 0x0230, 0x00000100);
2431 bcm43xx_write32(bcm, 0x0250, 0x00000100);
2432 bcm43xx_write32(bcm, 0x0270, 0x00000100);
2433 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0034, 0x0000);
2436 /* Probe Response Timeout value */
2437 /* FIXME: Default to 0, has to be set by ioctl probably... :-/ */
2438 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0074, 0x0000);
2440 if (iw_mode != IW_MODE_ADHOC && iw_mode != IW_MODE_MASTER) {
2441 if ((bcm->chip_id == 0x4306) && (bcm->chip_rev == 3))
2442 bcm43xx_write16(bcm, 0x0612, 0x0064);
2444 bcm43xx_write16(bcm, 0x0612, 0x0032);
2446 bcm43xx_write16(bcm, 0x0612, 0x0002);
2448 if (bcm->current_core->rev < 3) {
2449 bcm43xx_write16(bcm, 0x060E, 0x0000);
2450 bcm43xx_write16(bcm, 0x0610, 0x8000);
2451 bcm43xx_write16(bcm, 0x0604, 0x0000);
2452 bcm43xx_write16(bcm, 0x0606, 0x0200);
2454 bcm43xx_write32(bcm, 0x0188, 0x80000000);
2455 bcm43xx_write32(bcm, 0x018C, 0x02000000);
2457 bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, 0x00004000);
2458 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_IRQ_MASK, 0x0001DC00);
2459 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA2_IRQ_MASK, 0x0000DC00);
2460 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_IRQ_MASK, 0x0000DC00);
2461 bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_IRQ_MASK, 0x0001DC00);
2463 value32 = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
2464 value32 |= 0x00100000;
2465 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, value32);
2467 bcm43xx_write16(bcm, BCM43xx_MMIO_POWERUP_DELAY, bcm43xx_pctl_powerup_delay(bcm));
2470 dprintk(KERN_INFO PFX "Chip initialized\n");
2475 bcm43xx_radio_turn_off(bcm);
2477 bcm43xx_gpio_cleanup(bcm);
2479 free_irq(bcm->irq, bcm);
2481 bcm43xx_release_firmware(bcm, 1);
2485 /* Validate chip access
2486 * http://bcm-specs.sipsolutions.net/ValidateChipAccess */
2487 static int bcm43xx_validate_chip(struct bcm43xx_private *bcm)
2492 shm_backup = bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, 0x0000);
2493 bcm43xx_shm_write32(bcm, BCM43xx_SHM_SHARED, 0x0000, 0xAA5555AA);
2494 if (bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, 0x0000) != 0xAA5555AA)
2496 bcm43xx_shm_write32(bcm, BCM43xx_SHM_SHARED, 0x0000, 0x55AAAA55);
2497 if (bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, 0x0000) != 0x55AAAA55)
2499 bcm43xx_shm_write32(bcm, BCM43xx_SHM_SHARED, 0x0000, shm_backup);
2501 value = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
2502 if ((value | 0x80000000) != 0x80000400)
2505 value = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
2506 if (value != 0x00000000)
2511 printk(KERN_ERR PFX "Failed to validate the chipaccess\n");
2515 static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2519 u32 core_vendor, core_id, core_rev;
2520 u32 sb_id_hi, chip_id_32 = 0;
2521 u16 pci_device, chip_id_16;
2524 memset(&bcm->core_chipcommon, 0, sizeof(struct bcm43xx_coreinfo));
2525 memset(&bcm->core_pci, 0, sizeof(struct bcm43xx_coreinfo));
2526 memset(&bcm->core_v90, 0, sizeof(struct bcm43xx_coreinfo));
2527 memset(&bcm->core_pcmcia, 0, sizeof(struct bcm43xx_coreinfo));
2528 memset(&bcm->core_80211, 0, sizeof(struct bcm43xx_coreinfo)
2529 * BCM43xx_MAX_80211_CORES);
2531 memset(&bcm->phy, 0, sizeof(struct bcm43xx_phyinfo)
2532 * BCM43xx_MAX_80211_CORES);
2533 memset(&bcm->radio, 0, sizeof(struct bcm43xx_radioinfo)
2534 * BCM43xx_MAX_80211_CORES);
2537 err = _switch_core(bcm, 0);
2541 /* fetch sb_id_hi from core information registers */
2542 sb_id_hi = bcm43xx_read32(bcm, BCM43xx_CIR_SB_ID_HI);
2544 core_id = (sb_id_hi & 0xFFF0) >> 4;
2545 core_rev = (sb_id_hi & 0xF);
2546 core_vendor = (sb_id_hi & 0xFFFF0000) >> 16;
2548 /* if present, chipcommon is always core 0; read the chipid from it */
2549 if (core_id == BCM43xx_COREID_CHIPCOMMON) {
2550 chip_id_32 = bcm43xx_read32(bcm, 0);
2551 chip_id_16 = chip_id_32 & 0xFFFF;
2552 bcm->core_chipcommon.flags |= BCM43xx_COREFLAG_AVAILABLE;
2553 bcm->core_chipcommon.id = core_id;
2554 bcm->core_chipcommon.rev = core_rev;
2555 bcm->core_chipcommon.index = 0;
2556 /* While we are at it, also read the capabilities. */
2557 bcm->chipcommon_capabilities = bcm43xx_read32(bcm, BCM43xx_CHIPCOMMON_CAPABILITIES);
2559 /* without a chipCommon, use a hard coded table. */
2560 pci_device = bcm->pci_dev->device;
2561 if (pci_device == 0x4301)
2562 chip_id_16 = 0x4301;
2563 else if ((pci_device >= 0x4305) && (pci_device <= 0x4307))
2564 chip_id_16 = 0x4307;
2565 else if ((pci_device >= 0x4402) && (pci_device <= 0x4403))
2566 chip_id_16 = 0x4402;
2567 else if ((pci_device >= 0x4610) && (pci_device <= 0x4615))
2568 chip_id_16 = 0x4610;
2569 else if ((pci_device >= 0x4710) && (pci_device <= 0x4715))
2570 chip_id_16 = 0x4710;
2571 #ifdef CONFIG_BCM947XX
2572 else if ((pci_device >= 0x4320) && (pci_device <= 0x4325))
2573 chip_id_16 = 0x4309;
2576 printk(KERN_ERR PFX "Could not determine Chip ID\n");
2581 /* ChipCommon with Core Rev >=4 encodes number of cores,
2582 * otherwise consult hardcoded table */
2583 if ((core_id == BCM43xx_COREID_CHIPCOMMON) && (core_rev >= 4)) {
2584 core_count = (chip_id_32 & 0x0F000000) >> 24;
2586 switch (chip_id_16) {
2609 /* SOL if we get here */
2615 bcm->chip_id = chip_id_16;
2616 bcm->chip_rev = (chip_id_32 & 0x000f0000) >> 16;
2618 dprintk(KERN_INFO PFX "Chip ID 0x%x, rev 0x%x\n",
2619 bcm->chip_id, bcm->chip_rev);
2620 dprintk(KERN_INFO PFX "Number of cores: %d\n", core_count);
2621 if (bcm->core_chipcommon.flags & BCM43xx_COREFLAG_AVAILABLE) {
2622 dprintk(KERN_INFO PFX "Core 0: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n",
2623 core_id, core_rev, core_vendor,
2624 bcm43xx_core_enabled(bcm) ? "enabled" : "disabled");
2627 if (bcm->core_chipcommon.flags & BCM43xx_COREFLAG_AVAILABLE)
2631 for ( ; current_core < core_count; current_core++) {
2632 struct bcm43xx_coreinfo *core;
2634 err = _switch_core(bcm, current_core);
2637 /* Gather information */
2638 /* fetch sb_id_hi from core information registers */
2639 sb_id_hi = bcm43xx_read32(bcm, BCM43xx_CIR_SB_ID_HI);
2641 /* extract core_id, core_rev, core_vendor */
2642 core_id = (sb_id_hi & 0xFFF0) >> 4;
2643 core_rev = (sb_id_hi & 0xF);
2644 core_vendor = (sb_id_hi & 0xFFFF0000) >> 16;
2646 dprintk(KERN_INFO PFX "Core %d: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n",
2647 current_core, core_id, core_rev, core_vendor,
2648 bcm43xx_core_enabled(bcm) ? "enabled" : "disabled" );
2652 case BCM43xx_COREID_PCI:
2653 core = &bcm->core_pci;
2654 if (core->flags & BCM43xx_COREFLAG_AVAILABLE) {
2655 printk(KERN_WARNING PFX "Multiple PCI cores found.\n");
2659 case BCM43xx_COREID_V90:
2660 core = &bcm->core_v90;
2661 if (core->flags & BCM43xx_COREFLAG_AVAILABLE) {
2662 printk(KERN_WARNING PFX "Multiple V90 cores found.\n");
2666 case BCM43xx_COREID_PCMCIA:
2667 core = &bcm->core_pcmcia;
2668 if (core->flags & BCM43xx_COREFLAG_AVAILABLE) {
2669 printk(KERN_WARNING PFX "Multiple PCMCIA cores found.\n");
2673 case BCM43xx_COREID_ETHERNET:
2674 core = &bcm->core_ethernet;
2675 if (core->flags & BCM43xx_COREFLAG_AVAILABLE) {
2676 printk(KERN_WARNING PFX "Multiple Ethernet cores found.\n");
2680 case BCM43xx_COREID_80211:
2681 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
2682 core = &(bcm->core_80211[i]);
2683 if (!(core->flags & BCM43xx_COREFLAG_AVAILABLE))
2688 printk(KERN_WARNING PFX "More than %d cores of type 802.11 found.\n",
2689 BCM43xx_MAX_80211_CORES);
2693 /* More than one 80211 core is only supported
2695 * There are chips with two 80211 cores, but with
2696 * dangling pins on the second core. Be careful
2697 * and ignore these cores here.
2699 if (bcm->pci_dev->device != 0x4324) {
2700 dprintk(KERN_INFO PFX "Ignoring additional 802.11 core.\n");
2713 printk(KERN_ERR PFX "Error: Unsupported 80211 core revision %u\n",
2718 core->phy = &bcm->phy[i];
2719 core->phy->antenna_diversity = 0xffff;
2720 core->phy->savedpctlreg = 0xFFFF;
2721 core->phy->minlowsig[0] = 0xFFFF;
2722 core->phy->minlowsig[1] = 0xFFFF;
2723 core->phy->minlowsigpos[0] = 0;
2724 core->phy->minlowsigpos[1] = 0;
2725 spin_lock_init(&core->phy->lock);
2726 core->radio = &bcm->radio[i];
2727 core->radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE;
2728 core->radio->channel = 0xFF;
2729 core->radio->initial_channel = 0xFF;
2730 core->radio->lofcal = 0xFFFF;
2731 core->radio->initval = 0xFFFF;
2732 core->radio->nrssi[0] = -1000;
2733 core->radio->nrssi[1] = -1000;
2734 core->dma = &bcm->dma[i];
2735 core->pio = &bcm->pio[i];
2737 case BCM43xx_COREID_CHIPCOMMON:
2738 printk(KERN_WARNING PFX "Multiple CHIPCOMMON cores found.\n");
2741 printk(KERN_WARNING PFX "Unknown core found (ID 0x%x)\n", core_id);
2744 core->flags |= BCM43xx_COREFLAG_AVAILABLE;
2746 core->rev = core_rev;
2747 core->index = current_core;
2751 if (!(bcm->core_80211[0].flags & BCM43xx_COREFLAG_AVAILABLE)) {
2752 printk(KERN_ERR PFX "Error: No 80211 core found!\n");
2757 err = bcm43xx_switch_core(bcm, &bcm->core_80211[0]);
2764 static void bcm43xx_gen_bssid(struct bcm43xx_private *bcm)
2766 const u8 *mac = (const u8*)(bcm->net_dev->dev_addr);
2767 u8 *bssid = bcm->ieee->bssid;
2769 switch (bcm->ieee->iw_mode) {
2771 random_ether_addr(bssid);
2773 case IW_MODE_MASTER:
2775 case IW_MODE_REPEAT:
2776 case IW_MODE_SECOND:
2777 case IW_MODE_MONITOR:
2778 memcpy(bssid, mac, ETH_ALEN);
2785 static void bcm43xx_rate_memory_write(struct bcm43xx_private *bcm,
2793 offset += (bcm43xx_plcp_get_ratecode_ofdm(rate) & 0x000F) * 2;
2797 offset += (bcm43xx_plcp_get_ratecode_cck(rate) & 0x000F) * 2;
2799 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, offset + 0x20,
2800 bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, offset));
2803 static void bcm43xx_rate_memory_init(struct bcm43xx_private *bcm)
2805 switch (bcm->current_core->phy->type) {
2806 case BCM43xx_PHYTYPE_A:
2807 case BCM43xx_PHYTYPE_G:
2808 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_6MB, 1);
2809 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_12MB, 1);
2810 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_18MB, 1);
2811 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_24MB, 1);
2812 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_36MB, 1);
2813 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_48MB, 1);
2814 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_54MB, 1);
2815 case BCM43xx_PHYTYPE_B:
2816 bcm43xx_rate_memory_write(bcm, IEEE80211_CCK_RATE_1MB, 0);
2817 bcm43xx_rate_memory_write(bcm, IEEE80211_CCK_RATE_2MB, 0);
2818 bcm43xx_rate_memory_write(bcm, IEEE80211_CCK_RATE_5MB, 0);
2819 bcm43xx_rate_memory_write(bcm, IEEE80211_CCK_RATE_11MB, 0);
2826 static void bcm43xx_wireless_core_cleanup(struct bcm43xx_private *bcm)
2828 bcm43xx_chip_cleanup(bcm);
2829 bcm43xx_pio_free(bcm);
2830 bcm43xx_dma_free(bcm);
2832 bcm->current_core->flags &= ~ BCM43xx_COREFLAG_INITIALIZED;
2835 /* http://bcm-specs.sipsolutions.net/80211Init */
2836 static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm)
2843 if (bcm->chip_rev < 5) {
2844 sbimconfiglow = bcm43xx_read32(bcm, BCM43xx_CIR_SBIMCONFIGLOW);
2845 sbimconfiglow &= ~ BCM43xx_SBIMCONFIGLOW_REQUEST_TOUT_MASK;
2846 sbimconfiglow &= ~ BCM43xx_SBIMCONFIGLOW_SERVICE_TOUT_MASK;
2847 if (bcm->bustype == BCM43xx_BUSTYPE_PCI)
2848 sbimconfiglow |= 0x32;
2849 else if (bcm->bustype == BCM43xx_BUSTYPE_SB)
2850 sbimconfiglow |= 0x53;
2853 bcm43xx_write32(bcm, BCM43xx_CIR_SBIMCONFIGLOW, sbimconfiglow);
2856 bcm43xx_phy_calibrate(bcm);
2857 err = bcm43xx_chip_init(bcm);
2861 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0016, bcm->current_core->rev);
2862 ucodeflags = bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, BCM43xx_UCODEFLAGS_OFFSET);
2864 if (0 /*FIXME: which condition has to be used here? */)
2865 ucodeflags |= 0x00000010;
2867 /* HW decryption needs to be set now */
2868 ucodeflags |= 0x40000000;
2870 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) {
2871 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY;
2872 if (bcm->current_core->phy->rev == 1)
2873 ucodeflags |= BCM43xx_UCODEFLAG_UNKGPHY;
2874 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL)
2875 ucodeflags |= BCM43xx_UCODEFLAG_UNKPACTRL;
2876 } else if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B) {
2877 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY;
2878 if ((bcm->current_core->phy->rev >= 2) &&
2879 (bcm->current_core->radio->version == 0x2050))
2880 ucodeflags &= ~BCM43xx_UCODEFLAG_UNKGPHY;
2883 if (ucodeflags != bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED,
2884 BCM43xx_UCODEFLAGS_OFFSET)) {
2885 bcm43xx_shm_write32(bcm, BCM43xx_SHM_SHARED,
2886 BCM43xx_UCODEFLAGS_OFFSET, ucodeflags);
2889 /* Short/Long Retry Limit.
2890 * The retry-limit is a 4-bit counter. Enforce this to avoid overflowing
2891 * the chip-internal counter.
2893 limit = limit_value(modparam_short_retry, 0, 0xF);
2894 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0006, limit);
2895 limit = limit_value(modparam_long_retry, 0, 0xF);
2896 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0007, limit);
2898 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0044, 3);
2899 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0046, 2);
2901 bcm43xx_rate_memory_init(bcm);
2903 /* Minimum Contention Window */
2904 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B)
2905 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000001f);
2907 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000000f);
2908 /* Maximum Contention Window */
2909 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0004, 0x000003ff);
2911 bcm43xx_gen_bssid(bcm);
2912 bcm43xx_write_mac_bssid_templates(bcm);
2914 if (bcm->current_core->rev >= 5)
2915 bcm43xx_write16(bcm, 0x043C, 0x000C);
2917 if (bcm43xx_using_pio(bcm))
2918 err = bcm43xx_pio_init(bcm);
2920 err = bcm43xx_dma_init(bcm);
2922 goto err_chip_cleanup;
2923 bcm43xx_write16(bcm, 0x0612, 0x0050);
2924 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0416, 0x0050);
2925 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0414, 0x01F4);
2927 bcm43xx_mac_enable(bcm);
2928 bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate);
2930 bcm->current_core->flags |= BCM43xx_COREFLAG_INITIALIZED;
2935 bcm43xx_chip_cleanup(bcm);
2939 static int bcm43xx_chipset_attach(struct bcm43xx_private *bcm)
2944 err = bcm43xx_pctl_set_crystal(bcm, 1);
2947 bcm43xx_pci_read_config16(bcm, PCI_STATUS, &pci_status);
2948 bcm43xx_pci_write_config16(bcm, PCI_STATUS, pci_status & ~PCI_STATUS_SIG_TARGET_ABORT);
2954 static void bcm43xx_chipset_detach(struct bcm43xx_private *bcm)
2956 bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_SLOW);
2957 bcm43xx_pctl_set_crystal(bcm, 0);
2960 static void bcm43xx_pcicore_broadcast_value(struct bcm43xx_private *bcm,
2964 bcm43xx_write32(bcm, BCM43xx_PCICORE_BCAST_ADDR, address);
2965 bcm43xx_write32(bcm, BCM43xx_PCICORE_BCAST_DATA, data);
2968 static int bcm43xx_pcicore_commit_settings(struct bcm43xx_private *bcm)
2971 struct bcm43xx_coreinfo *old_core;
2973 old_core = bcm->current_core;
2974 err = bcm43xx_switch_core(bcm, &bcm->core_pci);
2978 bcm43xx_pcicore_broadcast_value(bcm, 0xfd8, 0x00000000);
2980 bcm43xx_switch_core(bcm, old_core);
2986 /* Make an I/O Core usable. "core_mask" is the bitmask of the cores to enable.
2987 * To enable core 0, pass a core_mask of 1<<0
2989 static int bcm43xx_setup_backplane_pci_connection(struct bcm43xx_private *bcm,
2992 u32 backplane_flag_nr;
2994 struct bcm43xx_coreinfo *old_core;
2997 value = bcm43xx_read32(bcm, BCM43xx_CIR_SBTPSFLAG);
2998 backplane_flag_nr = value & BCM43xx_BACKPLANE_FLAG_NR_MASK;
3000 old_core = bcm->current_core;
3001 err = bcm43xx_switch_core(bcm, &bcm->core_pci);
3005 if (bcm->core_pci.rev < 6) {
3006 value = bcm43xx_read32(bcm, BCM43xx_CIR_SBINTVEC);
3007 value |= (1 << backplane_flag_nr);
3008 bcm43xx_write32(bcm, BCM43xx_CIR_SBINTVEC, value);
3010 err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_ICR, &value);
3012 printk(KERN_ERR PFX "Error: ICR setup failure!\n");
3013 goto out_switch_back;
3015 value |= core_mask << 8;
3016 err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_ICR, value);
3018 printk(KERN_ERR PFX "Error: ICR setup failure!\n");
3019 goto out_switch_back;
3023 value = bcm43xx_read32(bcm, BCM43xx_PCICORE_SBTOPCI2);
3024 value |= BCM43xx_SBTOPCI2_PREFETCH | BCM43xx_SBTOPCI2_BURST;
3025 bcm43xx_write32(bcm, BCM43xx_PCICORE_SBTOPCI2, value);
3027 if (bcm->core_pci.rev < 5) {
3028 value = bcm43xx_read32(bcm, BCM43xx_CIR_SBIMCONFIGLOW);
3029 value |= (2 << BCM43xx_SBIMCONFIGLOW_SERVICE_TOUT_SHIFT)
3030 & BCM43xx_SBIMCONFIGLOW_SERVICE_TOUT_MASK;
3031 value |= (3 << BCM43xx_SBIMCONFIGLOW_REQUEST_TOUT_SHIFT)
3032 & BCM43xx_SBIMCONFIGLOW_REQUEST_TOUT_MASK;
3033 bcm43xx_write32(bcm, BCM43xx_CIR_SBIMCONFIGLOW, value);
3034 err = bcm43xx_pcicore_commit_settings(bcm);
3039 err = bcm43xx_switch_core(bcm, old_core);
3044 static void bcm43xx_softmac_init(struct bcm43xx_private *bcm)
3046 ieee80211softmac_start(bcm->net_dev);
3049 static void bcm43xx_periodic_every120sec(struct bcm43xx_private *bcm)
3051 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
3053 if (phy->type != BCM43xx_PHYTYPE_G || phy->rev < 2)
3056 bcm43xx_mac_suspend(bcm);
3057 bcm43xx_phy_lo_g_measure(bcm);
3058 bcm43xx_mac_enable(bcm);
3061 static void bcm43xx_periodic_every60sec(struct bcm43xx_private *bcm)
3063 bcm43xx_phy_lo_mark_all_unused(bcm);
3064 if (bcm->sprom.boardflags & BCM43xx_BFL_RSSI) {
3065 bcm43xx_mac_suspend(bcm);
3066 bcm43xx_calc_nrssi_slope(bcm);
3067 bcm43xx_mac_enable(bcm);
3071 static void bcm43xx_periodic_every30sec(struct bcm43xx_private *bcm)
3073 /* Update device statistics. */
3074 bcm43xx_calculate_link_quality(bcm);
3077 static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm)
3079 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
3080 struct bcm43xx_radioinfo *radio = bcm->current_core->radio;
3082 if (phy->type == BCM43xx_PHYTYPE_G) {
3083 //TODO: update_aci_moving_average
3084 if (radio->aci_enable && radio->aci_wlan_automatic) {
3085 bcm43xx_mac_suspend(bcm);
3086 if (!radio->aci_enable && 1 /*TODO: not scanning? */) {
3087 if (0 /*TODO: bunch of conditions*/) {
3088 bcm43xx_radio_set_interference_mitigation(bcm,
3089 BCM43xx_RADIO_INTERFMODE_MANUALWLAN);
3091 } else if (1/*TODO*/) {
3093 if ((aci_average > 1000) && !(bcm43xx_radio_aci_scan(bcm))) {
3094 bcm43xx_radio_set_interference_mitigation(bcm,
3095 BCM43xx_RADIO_INTERFMODE_NONE);
3099 bcm43xx_mac_enable(bcm);
3100 } else if (radio->interfmode == BCM43xx_RADIO_INTERFMODE_NONWLAN &&
3102 //TODO: implement rev1 workaround
3105 bcm43xx_phy_xmitpower(bcm); //FIXME: unless scanning?
3106 //TODO for APHY (temperature?)
3109 static void bcm43xx_periodic_task_handler(unsigned long d)
3111 struct bcm43xx_private *bcm = (struct bcm43xx_private *)d;
3112 unsigned long flags;
3115 spin_lock_irqsave(&bcm->lock, flags);
3117 assert(bcm->initialized);
3118 state = bcm->periodic_state;
3120 bcm43xx_periodic_every120sec(bcm);
3122 bcm43xx_periodic_every60sec(bcm);
3124 bcm43xx_periodic_every30sec(bcm);
3125 bcm43xx_periodic_every15sec(bcm);
3126 bcm->periodic_state = state + 1;
3128 mod_timer(&bcm->periodic_tasks, jiffies + (HZ * 15));
3130 spin_unlock_irqrestore(&bcm->lock, flags);
3133 static void bcm43xx_periodic_tasks_delete(struct bcm43xx_private *bcm)
3135 del_timer_sync(&bcm->periodic_tasks);
3138 static void bcm43xx_periodic_tasks_setup(struct bcm43xx_private *bcm)
3140 struct timer_list *timer = &(bcm->periodic_tasks);
3142 assert(bcm->initialized);
3144 bcm43xx_periodic_task_handler,
3145 (unsigned long)bcm);
3146 timer->expires = jiffies;
3150 static void bcm43xx_security_init(struct bcm43xx_private *bcm)
3152 bcm->security_offset = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED,
3154 bcm43xx_clear_keys(bcm);
3157 /* This is the opposite of bcm43xx_init_board() */
3158 static void bcm43xx_free_board(struct bcm43xx_private *bcm)
3161 unsigned long flags;
3163 bcm43xx_sysfs_unregister(bcm);
3165 bcm43xx_periodic_tasks_delete(bcm);
3167 spin_lock_irqsave(&bcm->lock, flags);
3168 bcm->initialized = 0;
3169 bcm->shutting_down = 1;
3170 spin_unlock_irqrestore(&bcm->lock, flags);
3172 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3173 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_AVAILABLE))
3175 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_INITIALIZED))
3178 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
3180 bcm43xx_wireless_core_cleanup(bcm);
3183 bcm43xx_pctl_set_crystal(bcm, 0);
3185 spin_lock_irqsave(&bcm->lock, flags);
3186 bcm->shutting_down = 0;
3187 spin_unlock_irqrestore(&bcm->lock, flags);
3190 static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3193 int num_80211_cores;
3195 unsigned long flags;
3199 spin_lock_irqsave(&bcm->lock, flags);
3200 bcm->initialized = 0;
3201 bcm->shutting_down = 0;
3202 spin_unlock_irqrestore(&bcm->lock, flags);
3204 err = bcm43xx_pctl_set_crystal(bcm, 1);
3207 err = bcm43xx_pctl_init(bcm);
3209 goto err_crystal_off;
3210 err = bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_FAST);
3212 goto err_crystal_off;
3214 tasklet_enable(&bcm->isr_tasklet);
3215 num_80211_cores = bcm43xx_num_80211_cores(bcm);
3216 for (i = 0; i < num_80211_cores; i++) {
3217 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
3218 assert(err != -ENODEV);
3220 goto err_80211_unwind;
3222 /* Enable the selected wireless core.
3223 * Connect PHY only on the first core.
3225 if (!bcm43xx_core_enabled(bcm)) {
3226 if (num_80211_cores == 1) {
3227 connect_phy = bcm->current_core->phy->connected;
3234 bcm43xx_wireless_core_reset(bcm, connect_phy);
3238 bcm43xx_wireless_core_mark_inactive(bcm, &bcm->core_80211[0]);
3240 err = bcm43xx_wireless_core_init(bcm);
3242 goto err_80211_unwind;
3245 bcm43xx_mac_suspend(bcm);
3246 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
3247 bcm43xx_radio_turn_off(bcm);
3250 bcm->active_80211_core = &bcm->core_80211[0];
3251 if (num_80211_cores >= 2) {
3252 bcm43xx_switch_core(bcm, &bcm->core_80211[0]);
3253 bcm43xx_mac_enable(bcm);
3255 bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC);
3256 bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr));
3257 dprintk(KERN_INFO PFX "80211 cores initialized\n");
3258 bcm43xx_security_init(bcm);
3259 bcm43xx_softmac_init(bcm);
3261 bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_DYNAMIC);
3263 if (bcm->current_core->radio->initial_channel != 0xFF) {
3264 bcm43xx_mac_suspend(bcm);
3265 bcm43xx_radio_selectchannel(bcm, bcm->current_core->radio->initial_channel, 0);
3266 bcm43xx_mac_enable(bcm);
3269 /* Initialization of the board is done. Flag it as such. */
3270 spin_lock_irqsave(&bcm->lock, flags);
3271 bcm->initialized = 1;
3272 spin_unlock_irqrestore(&bcm->lock, flags);
3274 bcm43xx_periodic_tasks_setup(bcm);
3275 bcm43xx_sysfs_register(bcm);
3276 //FIXME: check for bcm43xx_sysfs_register failure. This function is a bit messy regarding unwinding, though...
3283 tasklet_disable(&bcm->isr_tasklet);
3284 /* unwind all 80211 initialization */
3285 for (i = 0; i < num_80211_cores; i++) {
3286 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_INITIALIZED))
3288 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
3289 bcm43xx_wireless_core_cleanup(bcm);
3292 bcm43xx_pctl_set_crystal(bcm, 0);
3296 static void bcm43xx_detach_board(struct bcm43xx_private *bcm)
3298 struct pci_dev *pci_dev = bcm->pci_dev;
3301 bcm43xx_chipset_detach(bcm);
3302 /* Do _not_ access the chip, after it is detached. */
3303 iounmap(bcm->mmio_addr);
3305 pci_release_regions(pci_dev);
3306 pci_disable_device(pci_dev);
3308 /* Free allocated structures/fields */
3309 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3310 kfree(bcm->phy[i]._lo_pairs);
3311 if (bcm->phy[i].dyn_tssi_tbl)
3312 kfree(bcm->phy[i].tssi2dbm);
3316 static int bcm43xx_read_phyinfo(struct bcm43xx_private *bcm)
3318 struct bcm43xx_phyinfo *phy = bcm->current_core->phy;
3326 value = bcm43xx_read16(bcm, BCM43xx_MMIO_PHY_VER);
3328 phy_version = (value & 0xF000) >> 12;
3329 phy_type = (value & 0x0F00) >> 8;
3330 phy_rev = (value & 0x000F);
3332 dprintk(KERN_INFO PFX "Detected PHY: Version: %x, Type %x, Revision %x\n",
3333 phy_version, phy_type, phy_rev);
3336 case BCM43xx_PHYTYPE_A:
3339 /*FIXME: We need to switch the ieee->modulation, etc.. flags,
3340 * if we switch 80211 cores after init is done.
3341 * As we do not implement on the fly switching between
3342 * wireless cores, I will leave this as a future task.
3344 bcm->ieee->modulation = IEEE80211_OFDM_MODULATION;
3345 bcm->ieee->mode = IEEE_A;
3346 bcm->ieee->freq_band = IEEE80211_52GHZ_BAND |
3347 IEEE80211_24GHZ_BAND;
3349 case BCM43xx_PHYTYPE_B:
3350 if (phy_rev != 2 && phy_rev != 4 && phy_rev != 6 && phy_rev != 7)
3352 bcm->ieee->modulation = IEEE80211_CCK_MODULATION;
3353 bcm->ieee->mode = IEEE_B;
3354 bcm->ieee->freq_band = IEEE80211_24GHZ_BAND;
3356 case BCM43xx_PHYTYPE_G:
3359 bcm->ieee->modulation = IEEE80211_OFDM_MODULATION |
3360 IEEE80211_CCK_MODULATION;
3361 bcm->ieee->mode = IEEE_G;
3362 bcm->ieee->freq_band = IEEE80211_24GHZ_BAND;
3365 printk(KERN_ERR PFX "Error: Unknown PHY Type %x\n",
3370 printk(KERN_WARNING PFX "Invalid PHY Revision %x\n",
3374 phy->version = phy_version;
3375 phy->type = phy_type;
3377 if ((phy_type == BCM43xx_PHYTYPE_B) || (phy_type == BCM43xx_PHYTYPE_G)) {
3378 p = kzalloc(sizeof(struct bcm43xx_lopair) * BCM43xx_LO_COUNT,
3388 static int bcm43xx_attach_board(struct bcm43xx_private *bcm)
3390 struct pci_dev *pci_dev = bcm->pci_dev;
3391 struct net_device *net_dev = bcm->net_dev;
3394 void __iomem *ioaddr;
3395 unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
3396 int num_80211_cores;
3399 err = pci_enable_device(pci_dev);
3401 printk(KERN_ERR PFX "unable to wake up pci device (%i)\n", err);
3406 mmio_start = pci_resource_start(pci_dev, 0);
3407 mmio_end = pci_resource_end(pci_dev, 0);
3408 mmio_flags = pci_resource_flags(pci_dev, 0);
3409 mmio_len = pci_resource_len(pci_dev, 0);
3411 /* make sure PCI base addr is MMIO */
3412 if (!(mmio_flags & IORESOURCE_MEM)) {
3414 "%s, region #0 not an MMIO resource, aborting\n",
3417 goto err_pci_disable;
3419 //FIXME: Why is this check disabled for BCM947XX? What is the IO_SIZE there?
3420 #ifndef CONFIG_BCM947XX
3421 if (mmio_len != BCM43xx_IO_SIZE) {
3423 "%s: invalid PCI mem region size(s), aborting\n",
3426 goto err_pci_disable;
3430 err = pci_request_regions(pci_dev, KBUILD_MODNAME);
3433 "could not access PCI resources (%i)\n", err);
3434 goto err_pci_disable;
3437 /* enable PCI bus-mastering */
3438 pci_set_master(pci_dev);
3440 /* ioremap MMIO region */
3441 ioaddr = ioremap(mmio_start, mmio_len);
3443 printk(KERN_ERR PFX "%s: cannot remap MMIO, aborting\n",
3446 goto err_pci_release;
3449 net_dev->base_addr = (unsigned long)ioaddr;
3450 bcm->mmio_addr = ioaddr;
3451 bcm->mmio_len = mmio_len;
3453 bcm43xx_pci_read_config16(bcm, PCI_SUBSYSTEM_VENDOR_ID,
3454 &bcm->board_vendor);
3455 bcm43xx_pci_read_config16(bcm, PCI_SUBSYSTEM_ID,
3457 bcm43xx_pci_read_config16(bcm, PCI_REVISION_ID,
3458 &bcm->board_revision);
3460 err = bcm43xx_chipset_attach(bcm);
3463 err = bcm43xx_pctl_init(bcm);
3465 goto err_chipset_detach;
3466 err = bcm43xx_probe_cores(bcm);
3468 goto err_chipset_detach;
3470 num_80211_cores = bcm43xx_num_80211_cores(bcm);
3472 /* Attach all IO cores to the backplane. */
3474 for (i = 0; i < num_80211_cores; i++)
3475 coremask |= (1 << bcm->core_80211[i].index);
3476 //FIXME: Also attach some non80211 cores?
3477 err = bcm43xx_setup_backplane_pci_connection(bcm, coremask);
3479 printk(KERN_ERR PFX "Backplane->PCI connection failed!\n");
3480 goto err_chipset_detach;
3483 err = bcm43xx_sprom_extract(bcm);
3485 goto err_chipset_detach;
3486 err = bcm43xx_leds_init(bcm);
3488 goto err_chipset_detach;
3490 for (i = 0; i < num_80211_cores; i++) {
3491 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
3492 assert(err != -ENODEV);
3494 goto err_80211_unwind;
3496 /* Enable the selected wireless core.
3497 * Connect PHY only on the first core.
3499 bcm43xx_wireless_core_reset(bcm, (i == 0));
3501 err = bcm43xx_read_phyinfo(bcm);
3502 if (err && (i == 0))
3503 goto err_80211_unwind;
3505 err = bcm43xx_read_radioinfo(bcm);
3506 if (err && (i == 0))
3507 goto err_80211_unwind;
3509 err = bcm43xx_validate_chip(bcm);
3510 if (err && (i == 0))
3511 goto err_80211_unwind;
3513 bcm43xx_radio_turn_off(bcm);
3514 err = bcm43xx_phy_init_tssi2dbm_table(bcm);
3516 goto err_80211_unwind;
3517 bcm43xx_wireless_core_disable(bcm);
3519 bcm43xx_pctl_set_crystal(bcm, 0);
3521 /* Set the MAC address in the networking subsystem */
3522 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A)
3523 memcpy(bcm->net_dev->dev_addr, bcm->sprom.et1macaddr, 6);
3525 memcpy(bcm->net_dev->dev_addr, bcm->sprom.il0macaddr, 6);
3527 bcm43xx_geo_init(bcm);
3529 snprintf(bcm->nick, IW_ESSID_MAX_SIZE,
3530 "Broadcom %04X", bcm->chip_id);
3537 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3538 kfree(bcm->phy[i]._lo_pairs);
3539 if (bcm->phy[i].dyn_tssi_tbl)
3540 kfree(bcm->phy[i].tssi2dbm);
3543 bcm43xx_chipset_detach(bcm);
3545 iounmap(bcm->mmio_addr);
3547 pci_release_regions(pci_dev);
3549 pci_disable_device(pci_dev);
3553 /* Do the Hardware IO operations to send the txb */
3554 static inline int bcm43xx_tx(struct bcm43xx_private *bcm,
3555 struct ieee80211_txb *txb)
3559 if (bcm43xx_using_pio(bcm))
3560 err = bcm43xx_pio_tx(bcm, txb);
3562 err = bcm43xx_dma_tx(bcm, txb);
3567 static void bcm43xx_ieee80211_set_chan(struct net_device *net_dev,
3570 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3571 unsigned long flags;
3573 spin_lock_irqsave(&bcm->lock, flags);
3574 bcm43xx_mac_suspend(bcm);
3575 bcm43xx_radio_selectchannel(bcm, channel, 0);
3576 bcm43xx_mac_enable(bcm);
3577 spin_unlock_irqrestore(&bcm->lock, flags);
3580 /* set_security() callback in struct ieee80211_device */
3581 static void bcm43xx_ieee80211_set_security(struct net_device *net_dev,
3582 struct ieee80211_security *sec)
3584 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3585 struct ieee80211_security *secinfo = &bcm->ieee->sec;
3586 unsigned long flags;
3589 dprintk(KERN_INFO PFX "set security called\n");
3591 spin_lock_irqsave(&bcm->lock, flags);
3593 for (keyidx = 0; keyidx<WEP_KEYS; keyidx++)
3594 if (sec->flags & (1<<keyidx)) {
3595 secinfo->encode_alg[keyidx] = sec->encode_alg[keyidx];
3596 secinfo->key_sizes[keyidx] = sec->key_sizes[keyidx];
3597 memcpy(secinfo->keys[keyidx], sec->keys[keyidx], SCM_KEY_LEN);
3600 if (sec->flags & SEC_ACTIVE_KEY) {
3601 secinfo->active_key = sec->active_key;
3602 dprintk(KERN_INFO PFX " .active_key = %d\n", sec->active_key);
3604 if (sec->flags & SEC_UNICAST_GROUP) {
3605 secinfo->unicast_uses_group = sec->unicast_uses_group;
3606 dprintk(KERN_INFO PFX " .unicast_uses_group = %d\n", sec->unicast_uses_group);
3608 if (sec->flags & SEC_LEVEL) {
3609 secinfo->level = sec->level;
3610 dprintk(KERN_INFO PFX " .level = %d\n", sec->level);
3612 if (sec->flags & SEC_ENABLED) {
3613 secinfo->enabled = sec->enabled;
3614 dprintk(KERN_INFO PFX " .enabled = %d\n", sec->enabled);
3616 if (sec->flags & SEC_ENCRYPT) {
3617 secinfo->encrypt = sec->encrypt;
3618 dprintk(KERN_INFO PFX " .encrypt = %d\n", sec->encrypt);
3620 if (bcm->initialized && !bcm->ieee->host_encrypt) {
3621 if (secinfo->enabled) {
3622 /* upload WEP keys to hardware */
3623 char null_address[6] = { 0 };
3625 for (keyidx = 0; keyidx<WEP_KEYS; keyidx++) {
3626 if (!(sec->flags & (1<<keyidx)))
3628 switch (sec->encode_alg[keyidx]) {
3629 case SEC_ALG_NONE: algorithm = BCM43xx_SEC_ALGO_NONE; break;
3631 algorithm = BCM43xx_SEC_ALGO_WEP;
3632 if (secinfo->key_sizes[keyidx] == 13)
3633 algorithm = BCM43xx_SEC_ALGO_WEP104;
3637 algorithm = BCM43xx_SEC_ALGO_TKIP;
3641 algorithm = BCM43xx_SEC_ALGO_AES;
3647 bcm43xx_key_write(bcm, keyidx, algorithm, sec->keys[keyidx], secinfo->key_sizes[keyidx], &null_address[0]);
3648 bcm->key[keyidx].enabled = 1;
3649 bcm->key[keyidx].algorithm = algorithm;
3652 bcm43xx_clear_keys(bcm);
3654 spin_unlock_irqrestore(&bcm->lock, flags);
3657 /* hard_start_xmit() callback in struct ieee80211_device */
3658 static int bcm43xx_ieee80211_hard_start_xmit(struct ieee80211_txb *txb,
3659 struct net_device *net_dev,
3662 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3664 unsigned long flags;
3666 spin_lock_irqsave(&bcm->lock, flags);
3667 if (likely(bcm->initialized))
3668 err = bcm43xx_tx(bcm, txb);
3669 spin_unlock_irqrestore(&bcm->lock, flags);
3674 static struct net_device_stats * bcm43xx_net_get_stats(struct net_device *net_dev)
3676 return &(bcm43xx_priv(net_dev)->ieee->stats);
3679 static void bcm43xx_net_tx_timeout(struct net_device *net_dev)
3681 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3683 bcm43xx_controller_restart(bcm, "TX timeout");
3686 #ifdef CONFIG_NET_POLL_CONTROLLER
3687 static void bcm43xx_net_poll_controller(struct net_device *net_dev)
3689 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3690 unsigned long flags;
3692 local_irq_save(flags);
3693 bcm43xx_interrupt_handler(bcm->irq, bcm, NULL);
3694 local_irq_restore(flags);
3696 #endif /* CONFIG_NET_POLL_CONTROLLER */
3698 static int bcm43xx_net_open(struct net_device *net_dev)
3700 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3702 return bcm43xx_init_board(bcm);
3705 static int bcm43xx_net_stop(struct net_device *net_dev)
3707 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3709 ieee80211softmac_stop(net_dev);
3710 bcm43xx_disable_interrupts_sync(bcm, NULL);
3711 bcm43xx_free_board(bcm);
3716 static int bcm43xx_init_private(struct bcm43xx_private *bcm,
3717 struct net_device *net_dev,
3718 struct pci_dev *pci_dev)
3722 bcm->ieee = netdev_priv(net_dev);
3723 bcm->softmac = ieee80211_priv(net_dev);
3724 bcm->softmac->set_channel = bcm43xx_ieee80211_set_chan;
3726 #ifdef DEBUG_ENABLE_MMIO_PRINT
3727 bcm43xx_mmioprint_initial(bcm, 1);
3729 bcm43xx_mmioprint_initial(bcm, 0);
3731 #ifdef DEBUG_ENABLE_PCILOG
3732 bcm43xx_pciprint_initial(bcm, 1);
3734 bcm43xx_pciprint_initial(bcm, 0);
3737 bcm->irq_savedstate = BCM43xx_IRQ_INITIAL;
3738 bcm->pci_dev = pci_dev;
3739 bcm->net_dev = net_dev;
3740 bcm->bad_frames_preempt = modparam_bad_frames_preempt;
3741 spin_lock_init(&bcm->lock);
3742 tasklet_init(&bcm->isr_tasklet,
3743 (void (*)(unsigned long))bcm43xx_interrupt_tasklet,
3744 (unsigned long)bcm);
3745 tasklet_disable_nosync(&bcm->isr_tasklet);
3747 bcm->__using_pio = 1;
3749 err = pci_set_dma_mask(pci_dev, DMA_30BIT_MASK);
3750 err |= pci_set_consistent_dma_mask(pci_dev, DMA_30BIT_MASK);
3752 #ifdef CONFIG_BCM43XX_PIO
3753 printk(KERN_WARNING PFX "DMA not supported. Falling back to PIO.\n");
3754 bcm->__using_pio = 1;
3756 printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. "
3757 "Recompile the driver with PIO support, please.\n");
3759 #endif /* CONFIG_BCM43XX_PIO */
3762 bcm->rts_threshold = BCM43xx_DEFAULT_RTS_THRESHOLD;
3764 /* default to sw encryption for now */
3765 bcm->ieee->host_build_iv = 0;
3766 bcm->ieee->host_encrypt = 1;
3767 bcm->ieee->host_decrypt = 1;
3769 bcm->ieee->iw_mode = BCM43xx_INITIAL_IWMODE;
3770 bcm->ieee->tx_headroom = sizeof(struct bcm43xx_txhdr);
3771 bcm->ieee->set_security = bcm43xx_ieee80211_set_security;
3772 bcm->ieee->hard_start_xmit = bcm43xx_ieee80211_hard_start_xmit;
3777 static int __devinit bcm43xx_init_one(struct pci_dev *pdev,
3778 const struct pci_device_id *ent)
3780 struct net_device *net_dev;
3781 struct bcm43xx_private *bcm;
3784 #ifdef CONFIG_BCM947XX
3785 if ((pdev->bus->number == 0) && (pdev->device != 0x0800))
3789 #ifdef DEBUG_SINGLE_DEVICE_ONLY
3790 if (strcmp(pci_name(pdev), DEBUG_SINGLE_DEVICE_ONLY))
3794 net_dev = alloc_ieee80211softmac(sizeof(*bcm));
3797 "could not allocate ieee80211 device %s\n",
3802 /* initialize the net_device struct */
3803 SET_MODULE_OWNER(net_dev);
3804 SET_NETDEV_DEV(net_dev, &pdev->dev);
3806 net_dev->open = bcm43xx_net_open;
3807 net_dev->stop = bcm43xx_net_stop;
3808 net_dev->get_stats = bcm43xx_net_get_stats;
3809 net_dev->tx_timeout = bcm43xx_net_tx_timeout;
3810 #ifdef CONFIG_NET_POLL_CONTROLLER
3811 net_dev->poll_controller = bcm43xx_net_poll_controller;
3813 net_dev->wireless_handlers = &bcm43xx_wx_handlers_def;
3814 net_dev->irq = pdev->irq;
3815 SET_ETHTOOL_OPS(net_dev, &bcm43xx_ethtool_ops);
3817 /* initialize the bcm43xx_private struct */
3818 bcm = bcm43xx_priv(net_dev);
3819 memset(bcm, 0, sizeof(*bcm));
3820 err = bcm43xx_init_private(bcm, net_dev, pdev);
3822 goto err_free_netdev;
3824 pci_set_drvdata(pdev, net_dev);
3826 err = bcm43xx_attach_board(bcm);
3828 goto err_free_netdev;
3830 err = register_netdev(net_dev);
3832 printk(KERN_ERR PFX "Cannot register net device, "
3835 goto err_detach_board;
3838 bcm43xx_debugfs_add_device(bcm);
3845 bcm43xx_detach_board(bcm);
3847 free_ieee80211softmac(net_dev);
3851 static void __devexit bcm43xx_remove_one(struct pci_dev *pdev)
3853 struct net_device *net_dev = pci_get_drvdata(pdev);
3854 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3856 bcm43xx_debugfs_remove_device(bcm);
3857 unregister_netdev(net_dev);
3858 bcm43xx_detach_board(bcm);
3859 assert(bcm->ucode == NULL);
3860 free_ieee80211softmac(net_dev);
3863 /* Hard-reset the chip. Do not call this directly.
3864 * Use bcm43xx_controller_restart()
3866 static void bcm43xx_chip_reset(void *_bcm)
3868 struct bcm43xx_private *bcm = _bcm;
3869 struct net_device *net_dev = bcm->net_dev;
3870 struct pci_dev *pci_dev = bcm->pci_dev;
3872 int was_initialized = bcm->initialized;
3874 netif_stop_queue(bcm->net_dev);
3875 tasklet_disable(&bcm->isr_tasklet);
3877 bcm->firmware_norelease = 1;
3878 if (was_initialized)
3879 bcm43xx_free_board(bcm);
3880 bcm->firmware_norelease = 0;
3881 bcm43xx_detach_board(bcm);
3882 err = bcm43xx_init_private(bcm, net_dev, pci_dev);
3885 err = bcm43xx_attach_board(bcm);
3888 if (was_initialized) {
3889 err = bcm43xx_init_board(bcm);
3893 netif_wake_queue(bcm->net_dev);
3894 printk(KERN_INFO PFX "Controller restarted\n");
3898 printk(KERN_ERR PFX "Controller restart failed\n");
3901 /* Hard-reset the chip.
3902 * This can be called from interrupt or process context.
3903 * Make sure to _not_ re-enable device interrupts after this has been called.
3905 void bcm43xx_controller_restart(struct bcm43xx_private *bcm, const char *reason)
3907 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
3908 printk(KERN_ERR PFX "Controller RESET (%s) ...\n", reason);
3909 INIT_WORK(&bcm->restart_work, bcm43xx_chip_reset, bcm);
3910 schedule_work(&bcm->restart_work);
3915 static int bcm43xx_suspend(struct pci_dev *pdev, pm_message_t state)
3917 struct net_device *net_dev = pci_get_drvdata(pdev);
3918 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3919 unsigned long flags;
3920 int try_to_shutdown = 0, err;
3922 dprintk(KERN_INFO PFX "Suspending...\n");
3924 spin_lock_irqsave(&bcm->lock, flags);
3925 bcm->was_initialized = bcm->initialized;
3926 if (bcm->initialized)
3927 try_to_shutdown = 1;
3928 spin_unlock_irqrestore(&bcm->lock, flags);
3930 netif_device_detach(net_dev);
3931 if (try_to_shutdown) {
3932 ieee80211softmac_stop(net_dev);
3933 err = bcm43xx_disable_interrupts_sync(bcm, &bcm->irq_savedstate);
3934 if (unlikely(err)) {
3935 dprintk(KERN_ERR PFX "Suspend failed.\n");
3938 bcm->firmware_norelease = 1;
3939 bcm43xx_free_board(bcm);
3940 bcm->firmware_norelease = 0;
3942 bcm43xx_chipset_detach(bcm);
3944 pci_save_state(pdev);
3945 pci_disable_device(pdev);
3946 pci_set_power_state(pdev, pci_choose_state(pdev, state));
3948 dprintk(KERN_INFO PFX "Device suspended.\n");
3953 static int bcm43xx_resume(struct pci_dev *pdev)
3955 struct net_device *net_dev = pci_get_drvdata(pdev);
3956 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
3959 dprintk(KERN_INFO PFX "Resuming...\n");
3961 pci_set_power_state(pdev, 0);
3962 pci_enable_device(pdev);
3963 pci_restore_state(pdev);
3965 bcm43xx_chipset_attach(bcm);
3966 if (bcm->was_initialized) {
3967 bcm->irq_savedstate = BCM43xx_IRQ_INITIAL;
3968 err = bcm43xx_init_board(bcm);
3971 printk(KERN_ERR PFX "Resume failed!\n");
3975 netif_device_attach(net_dev);
3977 /*FIXME: This should be handled by softmac instead. */
3978 schedule_work(&bcm->softmac->associnfo.work);
3980 dprintk(KERN_INFO PFX "Device resumed.\n");
3985 #endif /* CONFIG_PM */
3987 static struct pci_driver bcm43xx_pci_driver = {
3988 .name = KBUILD_MODNAME,
3989 .id_table = bcm43xx_pci_tbl,
3990 .probe = bcm43xx_init_one,
3991 .remove = __devexit_p(bcm43xx_remove_one),
3993 .suspend = bcm43xx_suspend,
3994 .resume = bcm43xx_resume,
3995 #endif /* CONFIG_PM */
3998 static int __init bcm43xx_init(void)
4000 printk(KERN_INFO KBUILD_MODNAME " driver\n");
4001 bcm43xx_debugfs_init();
4002 return pci_register_driver(&bcm43xx_pci_driver);
4005 static void __exit bcm43xx_exit(void)
4007 pci_unregister_driver(&bcm43xx_pci_driver);
4008 bcm43xx_debugfs_exit();
4011 module_init(bcm43xx_init)
4012 module_exit(bcm43xx_exit)
4014 /* vim: set ts=8 sw=8 sts=8: */