aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorMichael Buesch <mbuesch@freenet.de>2006-03-13 13:27:34 -0500
committerJohn W. Linville <linville@tuxdriver.com>2006-03-27 11:19:37 -0500
commite9357c056c5e62516f0044e60591d41f00ca7cfa (patch)
treea5dc842a43db15403207f1d763df008fb43cb8e6 /drivers/net
parentaae3778176ec7a57b1c4f539b7252acfd7d99a1b (diff)
[PATCH] bcm43xx: reduce the size of bcm43xx_private by removing unneeded members.
Signed-off-by: Michael Buesch <mbuesch@freenet.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx.h94
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c7
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_dma.c9
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_ilt.c4
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_leds.c4
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_main.c238
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_main.h6
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_phy.c128
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_pio.c8
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_radio.c72
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c2
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_wx.c35
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_xmit.c14
13 files changed, 320 insertions, 301 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx.h b/drivers/net/wireless/bcm43xx/bcm43xx.h
index 29c95b07122a..a358646ad3eb 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx.h
+++ b/drivers/net/wireless/bcm43xx/bcm43xx.h
@@ -556,33 +556,37 @@ struct bcm43xx_pio {
556 556
557#define BCM43xx_MAX_80211_CORES 2 557#define BCM43xx_MAX_80211_CORES 2
558 558
559#define BCM43xx_COREFLAG_AVAILABLE (1 << 0)
560#define BCM43xx_COREFLAG_ENABLED (1 << 1)
561#define BCM43xx_COREFLAG_INITIALIZED (1 << 2)
562
563#ifdef CONFIG_BCM947XX 559#ifdef CONFIG_BCM947XX
564#define core_offset(bcm) (bcm)->current_core_offset 560#define core_offset(bcm) (bcm)->current_core_offset
565#else 561#else
566#define core_offset(bcm) 0 562#define core_offset(bcm) 0
567#endif 563#endif
568 564
565/* Generic information about a core. */
569struct bcm43xx_coreinfo { 566struct bcm43xx_coreinfo {
570 /** Driver internal flags. See BCM43xx_COREFLAG_* */ 567 u8 available:1,
571 u32 flags; 568 enabled:1,
569 initialized:1;
572 /** core_id ID number */ 570 /** core_id ID number */
573 u16 id; 571 u16 id;
574 /** core_rev revision number */ 572 /** core_rev revision number */
575 u8 rev; 573 u8 rev;
576 /** Index number for _switch_core() */ 574 /** Index number for _switch_core() */
577 u8 index; 575 u8 index;
578 /* Pointer to the PHYinfo, which belongs to this core (if 80211 core) */ 576};
579 struct bcm43xx_phyinfo *phy; 577
580 /* Pointer to the RadioInfo, which belongs to this core (if 80211 core) */ 578/* Additional information for each 80211 core. */
581 struct bcm43xx_radioinfo *radio; 579struct bcm43xx_coreinfo_80211 {
582 /* Pointer to the DMA rings, which belong to this core (if 80211 core) */ 580 /* PHY device. */
583 struct bcm43xx_dma *dma; 581 struct bcm43xx_phyinfo phy;
584 /* Pointer to the PIO queues, which belong to this core (if 80211 core) */ 582 /* Radio device. */
585 struct bcm43xx_pio *pio; 583 struct bcm43xx_radioinfo radio;
584 union {
585 /* DMA context. */
586 struct bcm43xx_dma dma;
587 /* PIO context. */
588 struct bcm43xx_pio pio;
589 };
586}; 590};
587 591
588/* Context information for a noise calculation (Link Quality). */ 592/* Context information for a noise calculation (Link Quality). */
@@ -652,7 +656,7 @@ struct bcm43xx_private {
652#define BCM43xx_NR_LEDS 4 656#define BCM43xx_NR_LEDS 4
653 struct bcm43xx_led leds[BCM43xx_NR_LEDS]; 657 struct bcm43xx_led leds[BCM43xx_NR_LEDS];
654 658
655 /* The currently active core. NULL if not initialized, yet. */ 659 /* The currently active core. */
656 struct bcm43xx_coreinfo *current_core; 660 struct bcm43xx_coreinfo *current_core;
657#ifdef CONFIG_BCM947XX 661#ifdef CONFIG_BCM947XX
658 /** current core memory offset */ 662 /** current core memory offset */
@@ -665,18 +669,15 @@ struct bcm43xx_private {
665 */ 669 */
666 struct bcm43xx_coreinfo core_chipcommon; 670 struct bcm43xx_coreinfo core_chipcommon;
667 struct bcm43xx_coreinfo core_pci; 671 struct bcm43xx_coreinfo core_pci;
668 struct bcm43xx_coreinfo core_v90;
669 struct bcm43xx_coreinfo core_pcmcia;
670 struct bcm43xx_coreinfo core_ethernet;
671 struct bcm43xx_coreinfo core_80211[ BCM43xx_MAX_80211_CORES ]; 672 struct bcm43xx_coreinfo core_80211[ BCM43xx_MAX_80211_CORES ];
672 /* Info about the PHY for each 80211 core. */ 673 /* Additional information, specific to the 80211 cores. */
673 struct bcm43xx_phyinfo phy[ BCM43xx_MAX_80211_CORES ]; 674 struct bcm43xx_coreinfo_80211 core_80211_ext[ BCM43xx_MAX_80211_CORES ];
674 /* Info about the Radio for each 80211 core. */ 675 /* Index of the current 80211 core. If current_core is not
675 struct bcm43xx_radioinfo radio[ BCM43xx_MAX_80211_CORES ]; 676 * an 80211 core, this is -1.
676 /* DMA */ 677 */
677 struct bcm43xx_dma dma[ BCM43xx_MAX_80211_CORES ]; 678 int current_80211_core_idx;
678 /* PIO */ 679 /* Number of available 80211 cores. */
679 struct bcm43xx_pio pio[ BCM43xx_MAX_80211_CORES ]; 680 int nr_80211_available;
680 681
681 u32 chipcommon_capabilities; 682 u32 chipcommon_capabilities;
682 683
@@ -769,18 +770,39 @@ int bcm43xx_using_pio(struct bcm43xx_private *bcm)
769# error "Using neither DMA nor PIO? Confused..." 770# error "Using neither DMA nor PIO? Confused..."
770#endif 771#endif
771 772
772 773/* Helper functions to access data structures private to the 80211 cores.
774 * Note that we _must_ have an 80211 core mapped when calling
775 * any of these functions.
776 */
773static inline 777static inline
774int bcm43xx_num_80211_cores(struct bcm43xx_private *bcm) 778struct bcm43xx_pio * bcm43xx_current_pio(struct bcm43xx_private *bcm)
775{ 779{
776 int i, cnt = 0; 780 assert(bcm43xx_using_pio(bcm));
777 781 assert(bcm->current_80211_core_idx >= 0);
778 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { 782 assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES);
779 if (bcm->core_80211[i].flags & BCM43xx_COREFLAG_AVAILABLE) 783 return &(bcm->core_80211_ext[bcm->current_80211_core_idx].pio);
780 cnt++; 784}
781 } 785static inline
782 786struct bcm43xx_dma * bcm43xx_current_dma(struct bcm43xx_private *bcm)
783 return cnt; 787{
788 assert(!bcm43xx_using_pio(bcm));
789 assert(bcm->current_80211_core_idx >= 0);
790 assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES);
791 return &(bcm->core_80211_ext[bcm->current_80211_core_idx].dma);
792}
793static inline
794struct bcm43xx_phyinfo * bcm43xx_current_phy(struct bcm43xx_private *bcm)
795{
796 assert(bcm->current_80211_core_idx >= 0);
797 assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES);
798 return &(bcm->core_80211_ext[bcm->current_80211_core_idx].phy);
799}
800static inline
801struct bcm43xx_radioinfo * bcm43xx_current_radio(struct bcm43xx_private *bcm)
802{
803 assert(bcm->current_80211_core_idx >= 0);
804 assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES);
805 return &(bcm->core_80211_ext[bcm->current_80211_core_idx].radio);
784} 806}
785 807
786/* Are we running in init_board() context? */ 808/* Are we running in init_board() context? */
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c
index bcfcebe28261..f73d36b8e0f4 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c
@@ -104,16 +104,13 @@ static ssize_t devinfo_read_file(struct file *file, char __user *userbuf,
104 fappend("\nCores:\n"); 104 fappend("\nCores:\n");
105#define fappend_core(name, info) fappend("core \"" name "\" %s, %s, id: 0x%04x, " \ 105#define fappend_core(name, info) fappend("core \"" name "\" %s, %s, id: 0x%04x, " \
106 "rev: 0x%02x, index: 0x%02x\n", \ 106 "rev: 0x%02x, index: 0x%02x\n", \
107 (info).flags & BCM43xx_COREFLAG_AVAILABLE \ 107 (info).available \
108 ? "available" : "nonavailable", \ 108 ? "available" : "nonavailable", \
109 (info).flags & BCM43xx_COREFLAG_ENABLED \ 109 (info).enabled \
110 ? "enabled" : "disabled", \ 110 ? "enabled" : "disabled", \
111 (info).id, (info).rev, (info).index) 111 (info).id, (info).rev, (info).index)
112 fappend_core("CHIPCOMMON", bcm->core_chipcommon); 112 fappend_core("CHIPCOMMON", bcm->core_chipcommon);
113 fappend_core("PCI", bcm->core_pci); 113 fappend_core("PCI", bcm->core_pci);
114 fappend_core("V90", bcm->core_v90);
115 fappend_core("PCMCIA", bcm->core_pcmcia);
116 fappend_core("ETHERNET", bcm->core_ethernet);
117 fappend_core("first 80211", bcm->core_80211[0]); 114 fappend_core("first 80211", bcm->core_80211[0]);
118 fappend_core("second 80211", bcm->core_80211[1]); 115 fappend_core("second 80211", bcm->core_80211[1]);
119#undef fappend_core 116#undef fappend_core
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
index fbe19b922aa7..7ed368a587f3 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
@@ -531,7 +531,7 @@ static void bcm43xx_destroy_dmaring(struct bcm43xx_dmaring *ring)
531 531
532void bcm43xx_dma_free(struct bcm43xx_private *bcm) 532void bcm43xx_dma_free(struct bcm43xx_private *bcm)
533{ 533{
534 struct bcm43xx_dma *dma = bcm->current_core->dma; 534 struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm);
535 535
536 bcm43xx_destroy_dmaring(dma->rx_ring1); 536 bcm43xx_destroy_dmaring(dma->rx_ring1);
537 dma->rx_ring1 = NULL; 537 dma->rx_ring1 = NULL;
@@ -549,7 +549,7 @@ void bcm43xx_dma_free(struct bcm43xx_private *bcm)
549 549
550int bcm43xx_dma_init(struct bcm43xx_private *bcm) 550int bcm43xx_dma_init(struct bcm43xx_private *bcm)
551{ 551{
552 struct bcm43xx_dma *dma = bcm->current_core->dma; 552 struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm);
553 struct bcm43xx_dmaring *ring; 553 struct bcm43xx_dmaring *ring;
554 int err = -ENOMEM; 554 int err = -ENOMEM;
555 555
@@ -652,7 +652,7 @@ static
652struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm, 652struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm,
653 u16 cookie, int *slot) 653 u16 cookie, int *slot)
654{ 654{
655 struct bcm43xx_dma *dma = bcm->current_core->dma; 655 struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm);
656 struct bcm43xx_dmaring *ring = NULL; 656 struct bcm43xx_dmaring *ring = NULL;
657 657
658 switch (cookie & 0xF000) { 658 switch (cookie & 0xF000) {
@@ -755,7 +755,7 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm,
755 * the device to send the stuff. 755 * the device to send the stuff.
756 * Note that this is called from atomic context. 756 * Note that this is called from atomic context.
757 */ 757 */
758 struct bcm43xx_dmaring *ring = bcm->current_core->dma->tx_ring1; 758 struct bcm43xx_dmaring *ring = bcm43xx_current_dma(bcm)->tx_ring1;
759 u8 i; 759 u8 i;
760 struct sk_buff *skb; 760 struct sk_buff *skb;
761 761
@@ -784,6 +784,7 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm,
784void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm, 784void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm,
785 struct bcm43xx_xmitstatus *status) 785 struct bcm43xx_xmitstatus *status)
786{ 786{
787 struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm);
787 struct bcm43xx_dmaring *ring; 788 struct bcm43xx_dmaring *ring;
788 struct bcm43xx_dmadesc *desc; 789 struct bcm43xx_dmadesc *desc;
789 struct bcm43xx_dmadesc_meta *meta; 790 struct bcm43xx_dmadesc_meta *meta;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_ilt.c b/drivers/net/wireless/bcm43xx/bcm43xx_ilt.c
index 865ed5c33613..ad8e569d1faf 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_ilt.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_ilt.c
@@ -314,7 +314,7 @@ const u16 bcm43xx_ilt_sigmasqr2[BCM43xx_ILT_SIGMASQR_SIZE] = {
314 314
315void bcm43xx_ilt_write(struct bcm43xx_private *bcm, u16 offset, u16 val) 315void bcm43xx_ilt_write(struct bcm43xx_private *bcm, u16 offset, u16 val)
316{ 316{
317 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) { 317 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A) {
318 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, offset); 318 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, offset);
319 mmiowb(); 319 mmiowb();
320 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, val); 320 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, val);
@@ -327,7 +327,7 @@ void bcm43xx_ilt_write(struct bcm43xx_private *bcm, u16 offset, u16 val)
327 327
328u16 bcm43xx_ilt_read(struct bcm43xx_private *bcm, u16 offset) 328u16 bcm43xx_ilt_read(struct bcm43xx_private *bcm, u16 offset)
329{ 329{
330 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) { 330 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A) {
331 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, offset); 331 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, offset);
332 return bcm43xx_phy_read(bcm, BCM43xx_PHY_ILT_A_DATA1); 332 return bcm43xx_phy_read(bcm, BCM43xx_PHY_ILT_A_DATA1);
333 } else { 333 } else {
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
index 949555da5aa9..72a243aac6cb 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
@@ -171,8 +171,8 @@ void bcm43xx_leds_exit(struct bcm43xx_private *bcm)
171void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) 171void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity)
172{ 172{
173 struct bcm43xx_led *led; 173 struct bcm43xx_led *led;
174 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 174 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
175 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 175 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
176 const int transferring = (jiffies - bcm->stats.last_tx) < BCM43xx_LED_XFER_THRES; 176 const int transferring = (jiffies - bcm->stats.last_tx) < BCM43xx_LED_XFER_THRES;
177 int i, turn_on; 177 int i, turn_on;
178 unsigned long interval = 0; 178 unsigned long interval = 0;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
index 3ab02f4f8ec0..88e9a125c2d7 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -406,7 +406,7 @@ static void bcm43xx_write_mac_bssid_templates(struct bcm43xx_private *bcm)
406static void bcm43xx_set_slot_time(struct bcm43xx_private *bcm, u16 slot_time) 406static void bcm43xx_set_slot_time(struct bcm43xx_private *bcm, u16 slot_time)
407{ 407{
408 /* slot_time is in usec. */ 408 /* slot_time is in usec. */
409 if (bcm->current_core->phy->type != BCM43xx_PHYTYPE_G) 409 if (bcm43xx_current_phy(bcm)->type != BCM43xx_PHYTYPE_G)
410 return; 410 return;
411 bcm43xx_write16(bcm, 0x684, 510 + slot_time); 411 bcm43xx_write16(bcm, 0x684, 510 + slot_time);
412 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0010, slot_time); 412 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0010, slot_time);
@@ -443,7 +443,7 @@ static void bcm43xx_disassociate(struct bcm43xx_private *bcm)
443 443
444 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0004, 0x000003ff); 444 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0004, 0x000003ff);
445 445
446 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G && 446 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_G &&
447 ieee80211_is_ofdm_rate(bcm->softmac->txrates.default_rate)) 447 ieee80211_is_ofdm_rate(bcm->softmac->txrates.default_rate))
448 bcm43xx_short_slot_timing_enable(bcm); 448 bcm43xx_short_slot_timing_enable(bcm);
449 449
@@ -510,8 +510,8 @@ static int bcm43xx_disable_interrupts_sync(struct bcm43xx_private *bcm, u32 *old
510 510
511static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm) 511static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm)
512{ 512{
513 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 513 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
514 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 514 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
515 u32 radio_id; 515 u32 radio_id;
516 u16 manufact; 516 u16 manufact;
517 u16 version; 517 u16 version;
@@ -566,10 +566,10 @@ static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm)
566 radio->txpower[2] = 3; 566 radio->txpower[2] = 3;
567 else 567 else
568 radio->txpower[2] = 0; 568 radio->txpower[2] = 0;
569 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 569 if (phy->type == BCM43xx_PHYTYPE_A)
570 radio->txpower_desired = bcm->sprom.maxpower_aphy; 570 radio->txpower_desired = bcm->sprom.maxpower_aphy;
571 else 571 else
572 bcm->current_core->radio->txpower_desired = bcm->sprom.maxpower_bgphy; 572 radio->txpower_desired = bcm->sprom.maxpower_bgphy;
573 573
574 /* Initialize the in-memory nrssi Lookup Table. */ 574 /* Initialize the in-memory nrssi Lookup Table. */
575 for (i = 0; i < 64; i++) 575 for (i = 0; i < 64; i++)
@@ -929,15 +929,14 @@ static void bcm43xx_geo_init(struct bcm43xx_private *bcm)
929 struct ieee80211_geo geo; 929 struct ieee80211_geo geo;
930 struct ieee80211_channel *chan; 930 struct ieee80211_channel *chan;
931 int have_a = 0, have_bg = 0; 931 int have_a = 0, have_bg = 0;
932 int i, num80211; 932 int i;
933 u8 channel; 933 u8 channel;
934 struct bcm43xx_phyinfo *phy; 934 struct bcm43xx_phyinfo *phy;
935 const char *iso_country; 935 const char *iso_country;
936 936
937 memset(&geo, 0, sizeof(geo)); 937 memset(&geo, 0, sizeof(geo));
938 num80211 = bcm43xx_num_80211_cores(bcm); 938 for (i = 0; i < bcm->nr_80211_available; i++) {
939 for (i = 0; i < num80211; i++) { 939 phy = &(bcm->core_80211_ext[i].phy);
940 phy = bcm->phy + i;
941 switch (phy->type) { 940 switch (phy->type) {
942 case BCM43xx_PHYTYPE_B: 941 case BCM43xx_PHYTYPE_B:
943 case BCM43xx_PHYTYPE_G: 942 case BCM43xx_PHYTYPE_G:
@@ -985,8 +984,8 @@ static void bcm43xx_geo_init(struct bcm43xx_private *bcm)
985 */ 984 */
986void bcm43xx_dummy_transmission(struct bcm43xx_private *bcm) 985void bcm43xx_dummy_transmission(struct bcm43xx_private *bcm)
987{ 986{
988 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 987 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
989 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 988 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
990 unsigned int i, max_loop; 989 unsigned int i, max_loop;
991 u16 value = 0; 990 u16 value = 0;
992 u32 buffer[5] = { 991 u32 buffer[5] = {
@@ -1213,14 +1212,20 @@ int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *ne
1213 1212
1214 if (unlikely(!new_core)) 1213 if (unlikely(!new_core))
1215 return 0; 1214 return 0;
1216 if (!(new_core->flags & BCM43xx_COREFLAG_AVAILABLE)) 1215 if (!new_core->available)
1217 return -ENODEV; 1216 return -ENODEV;
1218 if (bcm->current_core == new_core) 1217 if (bcm->current_core == new_core)
1219 return 0; 1218 return 0;
1220 err = _switch_core(bcm, new_core->index); 1219 err = _switch_core(bcm, new_core->index);
1221 if (likely(!err)) 1220 if (unlikely(err))
1222 bcm->current_core = new_core; 1221 goto out;
1223 1222
1223 bcm->current_core = new_core;
1224 bcm->current_80211_core_idx = -1;
1225 if (new_core->id == BCM43xx_COREID_80211)
1226 bcm->current_80211_core_idx = (int)(new_core - &(bcm->core_80211[0]));
1227
1228out:
1224 return err; 1229 return err;
1225} 1230}
1226 1231
@@ -1295,7 +1300,8 @@ static int bcm43xx_core_disable(struct bcm43xx_private *bcm, u32 core_flags)
1295 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); 1300 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1296 1301
1297out: 1302out:
1298 bcm->current_core->flags &= ~ BCM43xx_COREFLAG_ENABLED; 1303 bcm->current_core->enabled = 0;
1304
1299 return 0; 1305 return 0;
1300} 1306}
1301 1307
@@ -1340,7 +1346,7 @@ static int bcm43xx_core_enable(struct bcm43xx_private *bcm, u32 core_flags)
1340 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); 1346 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1341 udelay(1); 1347 udelay(1);
1342 1348
1343 bcm->current_core->flags |= BCM43xx_COREFLAG_ENABLED; 1349 bcm->current_core->enabled = 1;
1344 assert(err == 0); 1350 assert(err == 0);
1345out: 1351out:
1346 return err; 1352 return err;
@@ -1411,7 +1417,7 @@ static int bcm43xx_wireless_core_mark_inactive(struct bcm43xx_private *bcm,
1411 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); 1417 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow);
1412 udelay(1); 1418 udelay(1);
1413 1419
1414 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) { 1420 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_G) {
1415 old_core = bcm->current_core; 1421 old_core = bcm->current_core;
1416 err = bcm43xx_switch_core(bcm, active_80211_core); 1422 err = bcm43xx_switch_core(bcm, active_80211_core);
1417 if (err) 1423 if (err)
@@ -1433,9 +1439,6 @@ static void handle_irq_transmit_status(struct bcm43xx_private *bcm)
1433 u16 tmp; 1439 u16 tmp;
1434 struct bcm43xx_xmitstatus stat; 1440 struct bcm43xx_xmitstatus stat;
1435 1441
1436 assert(bcm->current_core->id == BCM43xx_COREID_80211);
1437 assert(bcm->current_core->rev >= 5);
1438
1439 while (1) { 1442 while (1) {
1440 v0 = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0); 1443 v0 = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0);
1441 if (!v0) 1444 if (!v0)
@@ -1473,7 +1476,7 @@ static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm)
1473 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD, 1476 bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD,
1474 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD) | (1 << 4)); 1477 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD) | (1 << 4));
1475 assert(bcm->noisecalc.core_at_start == bcm->current_core); 1478 assert(bcm->noisecalc.core_at_start == bcm->current_core);
1476 assert(bcm->noisecalc.channel_at_start == bcm->current_core->radio->channel); 1479 assert(bcm->noisecalc.channel_at_start == bcm43xx_current_radio(bcm)->channel);
1477} 1480}
1478 1481
1479static void bcm43xx_calculate_link_quality(struct bcm43xx_private *bcm) 1482static void bcm43xx_calculate_link_quality(struct bcm43xx_private *bcm)
@@ -1483,7 +1486,7 @@ static void bcm43xx_calculate_link_quality(struct bcm43xx_private *bcm)
1483 if (bcm->noisecalc.calculation_running) 1486 if (bcm->noisecalc.calculation_running)
1484 return; 1487 return;
1485 bcm->noisecalc.core_at_start = bcm->current_core; 1488 bcm->noisecalc.core_at_start = bcm->current_core;
1486 bcm->noisecalc.channel_at_start = bcm->current_core->radio->channel; 1489 bcm->noisecalc.channel_at_start = bcm43xx_current_radio(bcm)->channel;
1487 bcm->noisecalc.calculation_running = 1; 1490 bcm->noisecalc.calculation_running = 1;
1488 bcm->noisecalc.nr_samples = 0; 1491 bcm->noisecalc.nr_samples = 0;
1489 1492
@@ -1492,7 +1495,7 @@ static void bcm43xx_calculate_link_quality(struct bcm43xx_private *bcm)
1492 1495
1493static void handle_irq_noise(struct bcm43xx_private *bcm) 1496static void handle_irq_noise(struct bcm43xx_private *bcm)
1494{ 1497{
1495 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1498 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1496 u16 tmp; 1499 u16 tmp;
1497 u8 noise[4]; 1500 u8 noise[4];
1498 u8 i, j; 1501 u8 i, j;
@@ -1759,16 +1762,16 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm)
1759 assert(!(dma_reason[2] & BCM43xx_DMAIRQ_RX_DONE)); 1762 assert(!(dma_reason[2] & BCM43xx_DMAIRQ_RX_DONE));
1760 if (dma_reason[0] & BCM43xx_DMAIRQ_RX_DONE) { 1763 if (dma_reason[0] & BCM43xx_DMAIRQ_RX_DONE) {
1761 if (bcm43xx_using_pio(bcm)) 1764 if (bcm43xx_using_pio(bcm))
1762 bcm43xx_pio_rx(bcm->current_core->pio->queue0); 1765 bcm43xx_pio_rx(bcm43xx_current_pio(bcm)->queue0);
1763 else 1766 else
1764 bcm43xx_dma_rx(bcm->current_core->dma->rx_ring0); 1767 bcm43xx_dma_rx(bcm43xx_current_dma(bcm)->rx_ring0);
1765 /* We intentionally don't set "activity" to 1, here. */ 1768 /* We intentionally don't set "activity" to 1, here. */
1766 } 1769 }
1767 if (dma_reason[3] & BCM43xx_DMAIRQ_RX_DONE) { 1770 if (dma_reason[3] & BCM43xx_DMAIRQ_RX_DONE) {
1768 if (bcm43xx_using_pio(bcm)) 1771 if (bcm43xx_using_pio(bcm))
1769 bcm43xx_pio_rx(bcm->current_core->pio->queue3); 1772 bcm43xx_pio_rx(bcm43xx_current_pio(bcm)->queue3);
1770 else 1773 else
1771 bcm43xx_dma_rx(bcm->current_core->dma->rx_ring1); 1774 bcm43xx_dma_rx(bcm43xx_current_dma(bcm)->rx_ring1);
1772 activity = 1; 1775 activity = 1;
1773 } 1776 }
1774 bcmirq_handled(BCM43xx_IRQ_RX); 1777 bcmirq_handled(BCM43xx_IRQ_RX);
@@ -1911,7 +1914,7 @@ static void bcm43xx_release_firmware(struct bcm43xx_private *bcm, int force)
1911 1914
1912static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) 1915static int bcm43xx_request_firmware(struct bcm43xx_private *bcm)
1913{ 1916{
1914 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1917 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1915 u8 rev = bcm->current_core->rev; 1918 u8 rev = bcm->current_core->rev;
1916 int err = 0; 1919 int err = 0;
1917 int nr; 1920 int nr;
@@ -2349,6 +2352,8 @@ static void bcm43xx_chip_cleanup(struct bcm43xx_private *bcm)
2349 */ 2352 */
2350static int bcm43xx_chip_init(struct bcm43xx_private *bcm) 2353static int bcm43xx_chip_init(struct bcm43xx_private *bcm)
2351{ 2354{
2355 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
2356 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
2352 int err; 2357 int err;
2353 int iw_mode = bcm->ieee->iw_mode; 2358 int iw_mode = bcm->ieee->iw_mode;
2354 int tmp; 2359 int tmp;
@@ -2388,13 +2393,13 @@ static int bcm43xx_chip_init(struct bcm43xx_private *bcm)
2388 goto err_radio_off; 2393 goto err_radio_off;
2389 2394
2390 /* Select initial Interference Mitigation. */ 2395 /* Select initial Interference Mitigation. */
2391 tmp = bcm->current_core->radio->interfmode; 2396 tmp = radio->interfmode;
2392 bcm->current_core->radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE; 2397 radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE;
2393 bcm43xx_radio_set_interference_mitigation(bcm, tmp); 2398 bcm43xx_radio_set_interference_mitigation(bcm, tmp);
2394 2399
2395 bcm43xx_phy_set_antenna_diversity(bcm); 2400 bcm43xx_phy_set_antenna_diversity(bcm);
2396 bcm43xx_radio_set_txantenna(bcm, BCM43xx_RADIO_TXANTENNA_DEFAULT); 2401 bcm43xx_radio_set_txantenna(bcm, BCM43xx_RADIO_TXANTENNA_DEFAULT);
2397 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B) { 2402 if (phy->type == BCM43xx_PHYTYPE_B) {
2398 value16 = bcm43xx_read16(bcm, 0x005E); 2403 value16 = bcm43xx_read16(bcm, 0x005E);
2399 value16 |= 0x0004; 2404 value16 |= 0x0004;
2400 bcm43xx_write16(bcm, 0x005E, value16); 2405 bcm43xx_write16(bcm, 0x005E, value16);
@@ -2512,6 +2517,32 @@ error:
2512 return -ENODEV; 2517 return -ENODEV;
2513} 2518}
2514 2519
2520void bcm43xx_init_struct_phyinfo(struct bcm43xx_phyinfo *phy)
2521{
2522 /* Initialize a "phyinfo" structure. The structure is already
2523 * zeroed out.
2524 */
2525 phy->antenna_diversity = 0xFFFF;
2526 phy->savedpctlreg = 0xFFFF;
2527 phy->minlowsig[0] = 0xFFFF;
2528 phy->minlowsig[1] = 0xFFFF;
2529 spin_lock_init(&phy->lock);
2530}
2531
2532void bcm43xx_init_struct_radioinfo(struct bcm43xx_radioinfo *radio)
2533{
2534 /* Initialize a "radioinfo" structure. The structure is already
2535 * zeroed out.
2536 */
2537 radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE;
2538 radio->channel = 0xFF;
2539 radio->initial_channel = 0xFF;
2540 radio->lofcal = 0xFFFF;
2541 radio->initval = 0xFFFF;
2542 radio->nrssi[0] = -1000;
2543 radio->nrssi[1] = -1000;
2544}
2545
2515static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) 2546static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2516{ 2547{
2517 int err, i; 2548 int err, i;
@@ -2523,15 +2554,14 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2523 2554
2524 memset(&bcm->core_chipcommon, 0, sizeof(struct bcm43xx_coreinfo)); 2555 memset(&bcm->core_chipcommon, 0, sizeof(struct bcm43xx_coreinfo));
2525 memset(&bcm->core_pci, 0, sizeof(struct bcm43xx_coreinfo)); 2556 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) 2557 memset(&bcm->core_80211, 0, sizeof(struct bcm43xx_coreinfo)
2529 * BCM43xx_MAX_80211_CORES); 2558 * BCM43xx_MAX_80211_CORES);
2530 2559 memset(&bcm->core_80211_ext, 0, sizeof(struct bcm43xx_coreinfo_80211)
2531 memset(&bcm->phy, 0, sizeof(struct bcm43xx_phyinfo) 2560 * BCM43xx_MAX_80211_CORES);
2532 * BCM43xx_MAX_80211_CORES); 2561 bcm->current_80211_core_idx = -1;
2533 memset(&bcm->radio, 0, sizeof(struct bcm43xx_radioinfo) 2562 bcm->nr_80211_available = 0;
2534 * BCM43xx_MAX_80211_CORES); 2563 bcm->current_core = NULL;
2564 bcm->active_80211_core = NULL;
2535 2565
2536 /* map core 0 */ 2566 /* map core 0 */
2537 err = _switch_core(bcm, 0); 2567 err = _switch_core(bcm, 0);
@@ -2549,7 +2579,7 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2549 if (core_id == BCM43xx_COREID_CHIPCOMMON) { 2579 if (core_id == BCM43xx_COREID_CHIPCOMMON) {
2550 chip_id_32 = bcm43xx_read32(bcm, 0); 2580 chip_id_32 = bcm43xx_read32(bcm, 0);
2551 chip_id_16 = chip_id_32 & 0xFFFF; 2581 chip_id_16 = chip_id_32 & 0xFFFF;
2552 bcm->core_chipcommon.flags |= BCM43xx_COREFLAG_AVAILABLE; 2582 bcm->core_chipcommon.available = 1;
2553 bcm->core_chipcommon.id = core_id; 2583 bcm->core_chipcommon.id = core_id;
2554 bcm->core_chipcommon.rev = core_rev; 2584 bcm->core_chipcommon.rev = core_rev;
2555 bcm->core_chipcommon.index = 0; 2585 bcm->core_chipcommon.index = 0;
@@ -2618,18 +2648,19 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2618 dprintk(KERN_INFO PFX "Chip ID 0x%x, rev 0x%x\n", 2648 dprintk(KERN_INFO PFX "Chip ID 0x%x, rev 0x%x\n",
2619 bcm->chip_id, bcm->chip_rev); 2649 bcm->chip_id, bcm->chip_rev);
2620 dprintk(KERN_INFO PFX "Number of cores: %d\n", core_count); 2650 dprintk(KERN_INFO PFX "Number of cores: %d\n", core_count);
2621 if (bcm->core_chipcommon.flags & BCM43xx_COREFLAG_AVAILABLE) { 2651 if (bcm->core_chipcommon.available) {
2622 dprintk(KERN_INFO PFX "Core 0: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n", 2652 dprintk(KERN_INFO PFX "Core 0: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n",
2623 core_id, core_rev, core_vendor, 2653 core_id, core_rev, core_vendor,
2624 bcm43xx_core_enabled(bcm) ? "enabled" : "disabled"); 2654 bcm43xx_core_enabled(bcm) ? "enabled" : "disabled");
2625 } 2655 }
2626 2656
2627 if (bcm->core_chipcommon.flags & BCM43xx_COREFLAG_AVAILABLE) 2657 if (bcm->core_chipcommon.available)
2628 current_core = 1; 2658 current_core = 1;
2629 else 2659 else
2630 current_core = 0; 2660 current_core = 0;
2631 for ( ; current_core < core_count; current_core++) { 2661 for ( ; current_core < core_count; current_core++) {
2632 struct bcm43xx_coreinfo *core; 2662 struct bcm43xx_coreinfo *core;
2663 struct bcm43xx_coreinfo_80211 *ext_80211;
2633 2664
2634 err = _switch_core(bcm, current_core); 2665 err = _switch_core(bcm, current_core);
2635 if (err) 2666 if (err)
@@ -2651,36 +2682,16 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2651 switch (core_id) { 2682 switch (core_id) {
2652 case BCM43xx_COREID_PCI: 2683 case BCM43xx_COREID_PCI:
2653 core = &bcm->core_pci; 2684 core = &bcm->core_pci;
2654 if (core->flags & BCM43xx_COREFLAG_AVAILABLE) { 2685 if (core->available) {
2655 printk(KERN_WARNING PFX "Multiple PCI cores found.\n"); 2686 printk(KERN_WARNING PFX "Multiple PCI cores found.\n");
2656 continue; 2687 continue;
2657 } 2688 }
2658 break; 2689 break;
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");
2663 continue;
2664 }
2665 break;
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");
2670 continue;
2671 }
2672 break;
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");
2677 continue;
2678 }
2679 break;
2680 case BCM43xx_COREID_80211: 2690 case BCM43xx_COREID_80211:
2681 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { 2691 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
2682 core = &(bcm->core_80211[i]); 2692 core = &(bcm->core_80211[i]);
2683 if (!(core->flags & BCM43xx_COREFLAG_AVAILABLE)) 2693 ext_80211 = &(bcm->core_80211_ext[i]);
2694 if (!core->available)
2684 break; 2695 break;
2685 core = NULL; 2696 core = NULL;
2686 } 2697 }
@@ -2715,40 +2726,23 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
2715 err = -ENODEV; 2726 err = -ENODEV;
2716 goto out; 2727 goto out;
2717 } 2728 }
2718 core->phy = &bcm->phy[i]; 2729 bcm->nr_80211_available++;
2719 core->phy->antenna_diversity = 0xffff; 2730 bcm43xx_init_struct_phyinfo(&ext_80211->phy);
2720 core->phy->savedpctlreg = 0xFFFF; 2731 bcm43xx_init_struct_radioinfo(&ext_80211->radio);
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];
2736 break; 2732 break;
2737 case BCM43xx_COREID_CHIPCOMMON: 2733 case BCM43xx_COREID_CHIPCOMMON:
2738 printk(KERN_WARNING PFX "Multiple CHIPCOMMON cores found.\n"); 2734 printk(KERN_WARNING PFX "Multiple CHIPCOMMON cores found.\n");
2739 break; 2735 break;
2740 default:
2741 printk(KERN_WARNING PFX "Unknown core found (ID 0x%x)\n", core_id);
2742 } 2736 }
2743 if (core) { 2737 if (core) {
2744 core->flags |= BCM43xx_COREFLAG_AVAILABLE; 2738 core->available = 1;
2745 core->id = core_id; 2739 core->id = core_id;
2746 core->rev = core_rev; 2740 core->rev = core_rev;
2747 core->index = current_core; 2741 core->index = current_core;
2748 } 2742 }
2749 } 2743 }
2750 2744
2751 if (!(bcm->core_80211[0].flags & BCM43xx_COREFLAG_AVAILABLE)) { 2745 if (!bcm->core_80211[0].available) {
2752 printk(KERN_ERR PFX "Error: No 80211 core found!\n"); 2746 printk(KERN_ERR PFX "Error: No 80211 core found!\n");
2753 err = -ENODEV; 2747 err = -ENODEV;
2754 goto out; 2748 goto out;
@@ -2802,7 +2796,7 @@ static void bcm43xx_rate_memory_write(struct bcm43xx_private *bcm,
2802 2796
2803static void bcm43xx_rate_memory_init(struct bcm43xx_private *bcm) 2797static void bcm43xx_rate_memory_init(struct bcm43xx_private *bcm)
2804{ 2798{
2805 switch (bcm->current_core->phy->type) { 2799 switch (bcm43xx_current_phy(bcm)->type) {
2806 case BCM43xx_PHYTYPE_A: 2800 case BCM43xx_PHYTYPE_A:
2807 case BCM43xx_PHYTYPE_G: 2801 case BCM43xx_PHYTYPE_G:
2808 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_6MB, 1); 2802 bcm43xx_rate_memory_write(bcm, IEEE80211_OFDM_RATE_6MB, 1);
@@ -2829,12 +2823,14 @@ static void bcm43xx_wireless_core_cleanup(struct bcm43xx_private *bcm)
2829 bcm43xx_pio_free(bcm); 2823 bcm43xx_pio_free(bcm);
2830 bcm43xx_dma_free(bcm); 2824 bcm43xx_dma_free(bcm);
2831 2825
2832 bcm->current_core->flags &= ~ BCM43xx_COREFLAG_INITIALIZED; 2826 bcm->current_core->initialized = 0;
2833} 2827}
2834 2828
2835/* http://bcm-specs.sipsolutions.net/80211Init */ 2829/* http://bcm-specs.sipsolutions.net/80211Init */
2836static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm) 2830static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm)
2837{ 2831{
2832 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
2833 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
2838 u32 ucodeflags; 2834 u32 ucodeflags;
2839 int err; 2835 int err;
2840 u32 sbimconfiglow; 2836 u32 sbimconfiglow;
@@ -2867,16 +2863,15 @@ static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm)
2867 /* HW decryption needs to be set now */ 2863 /* HW decryption needs to be set now */
2868 ucodeflags |= 0x40000000; 2864 ucodeflags |= 0x40000000;
2869 2865
2870 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) { 2866 if (phy->type == BCM43xx_PHYTYPE_G) {
2871 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY; 2867 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY;
2872 if (bcm->current_core->phy->rev == 1) 2868 if (phy->rev == 1)
2873 ucodeflags |= BCM43xx_UCODEFLAG_UNKGPHY; 2869 ucodeflags |= BCM43xx_UCODEFLAG_UNKGPHY;
2874 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) 2870 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL)
2875 ucodeflags |= BCM43xx_UCODEFLAG_UNKPACTRL; 2871 ucodeflags |= BCM43xx_UCODEFLAG_UNKPACTRL;
2876 } else if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B) { 2872 } else if (phy->type == BCM43xx_PHYTYPE_B) {
2877 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY; 2873 ucodeflags |= BCM43xx_UCODEFLAG_UNKBGPHY;
2878 if ((bcm->current_core->phy->rev >= 2) && 2874 if (phy->rev >= 2 && radio->version == 0x2050)
2879 (bcm->current_core->radio->version == 0x2050))
2880 ucodeflags &= ~BCM43xx_UCODEFLAG_UNKGPHY; 2875 ucodeflags &= ~BCM43xx_UCODEFLAG_UNKGPHY;
2881 } 2876 }
2882 2877
@@ -2901,7 +2896,7 @@ static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm)
2901 bcm43xx_rate_memory_init(bcm); 2896 bcm43xx_rate_memory_init(bcm);
2902 2897
2903 /* Minimum Contention Window */ 2898 /* Minimum Contention Window */
2904 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B) 2899 if (phy->type == BCM43xx_PHYTYPE_B)
2905 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000001f); 2900 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000001f);
2906 else 2901 else
2907 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000000f); 2902 bcm43xx_shm_write32(bcm, BCM43xx_SHM_WIRELESS, 0x0003, 0x0000000f);
@@ -2927,7 +2922,7 @@ static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm)
2927 bcm43xx_mac_enable(bcm); 2922 bcm43xx_mac_enable(bcm);
2928 bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate); 2923 bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate);
2929 2924
2930 bcm->current_core->flags |= BCM43xx_COREFLAG_INITIALIZED; 2925 bcm->current_core->initialized = 1;
2931out: 2926out:
2932 return err; 2927 return err;
2933 2928
@@ -3048,7 +3043,7 @@ static void bcm43xx_softmac_init(struct bcm43xx_private *bcm)
3048 3043
3049static void bcm43xx_periodic_every120sec(struct bcm43xx_private *bcm) 3044static void bcm43xx_periodic_every120sec(struct bcm43xx_private *bcm)
3050{ 3045{
3051 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 3046 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
3052 3047
3053 if (phy->type != BCM43xx_PHYTYPE_G || phy->rev < 2) 3048 if (phy->type != BCM43xx_PHYTYPE_G || phy->rev < 2)
3054 return; 3049 return;
@@ -3076,8 +3071,8 @@ static void bcm43xx_periodic_every30sec(struct bcm43xx_private *bcm)
3076 3071
3077static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm) 3072static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm)
3078{ 3073{
3079 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 3074 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
3080 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 3075 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
3081 3076
3082 if (phy->type == BCM43xx_PHYTYPE_G) { 3077 if (phy->type == BCM43xx_PHYTYPE_G) {
3083 //TODO: update_aci_moving_average 3078 //TODO: update_aci_moving_average
@@ -3170,9 +3165,9 @@ static void bcm43xx_free_board(struct bcm43xx_private *bcm)
3170 bcm43xx_unlock(bcm, flags); 3165 bcm43xx_unlock(bcm, flags);
3171 3166
3172 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { 3167 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3173 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_AVAILABLE)) 3168 if (!bcm->core_80211[i].available)
3174 continue; 3169 continue;
3175 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_INITIALIZED)) 3170 if (!bcm->core_80211[i].initialized)
3176 continue; 3171 continue;
3177 3172
3178 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); 3173 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
@@ -3190,7 +3185,6 @@ static void bcm43xx_free_board(struct bcm43xx_private *bcm)
3190static int bcm43xx_init_board(struct bcm43xx_private *bcm) 3185static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3191{ 3186{
3192 int i, err; 3187 int i, err;
3193 int num_80211_cores;
3194 int connect_phy; 3188 int connect_phy;
3195 unsigned long flags; 3189 unsigned long flags;
3196 3190
@@ -3212,8 +3206,7 @@ static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3212 goto err_crystal_off; 3206 goto err_crystal_off;
3213 3207
3214 tasklet_enable(&bcm->isr_tasklet); 3208 tasklet_enable(&bcm->isr_tasklet);
3215 num_80211_cores = bcm43xx_num_80211_cores(bcm); 3209 for (i = 0; i < bcm->nr_80211_available; i++) {
3216 for (i = 0; i < num_80211_cores; i++) {
3217 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); 3210 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
3218 assert(err != -ENODEV); 3211 assert(err != -ENODEV);
3219 if (err) 3212 if (err)
@@ -3223,8 +3216,8 @@ static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3223 * Connect PHY only on the first core. 3216 * Connect PHY only on the first core.
3224 */ 3217 */
3225 if (!bcm43xx_core_enabled(bcm)) { 3218 if (!bcm43xx_core_enabled(bcm)) {
3226 if (num_80211_cores == 1) { 3219 if (bcm->nr_80211_available == 1) {
3227 connect_phy = bcm->current_core->phy->connected; 3220 connect_phy = bcm43xx_current_phy(bcm)->connected;
3228 } else { 3221 } else {
3229 if (i == 0) 3222 if (i == 0)
3230 connect_phy = 1; 3223 connect_phy = 1;
@@ -3248,7 +3241,7 @@ static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3248 } 3241 }
3249 } 3242 }
3250 bcm->active_80211_core = &bcm->core_80211[0]; 3243 bcm->active_80211_core = &bcm->core_80211[0];
3251 if (num_80211_cores >= 2) { 3244 if (bcm->nr_80211_available >= 2) {
3252 bcm43xx_switch_core(bcm, &bcm->core_80211[0]); 3245 bcm43xx_switch_core(bcm, &bcm->core_80211[0]);
3253 bcm43xx_mac_enable(bcm); 3246 bcm43xx_mac_enable(bcm);
3254 } 3247 }
@@ -3260,9 +3253,9 @@ static int bcm43xx_init_board(struct bcm43xx_private *bcm)
3260 3253
3261 bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_DYNAMIC); 3254 bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_DYNAMIC);
3262 3255
3263 if (bcm->current_core->radio->initial_channel != 0xFF) { 3256 if (bcm43xx_current_radio(bcm)->initial_channel != 0xFF) {
3264 bcm43xx_mac_suspend(bcm); 3257 bcm43xx_mac_suspend(bcm);
3265 bcm43xx_radio_selectchannel(bcm, bcm->current_core->radio->initial_channel, 0); 3258 bcm43xx_radio_selectchannel(bcm, bcm43xx_current_radio(bcm)->initial_channel, 0);
3266 bcm43xx_mac_enable(bcm); 3259 bcm43xx_mac_enable(bcm);
3267 } 3260 }
3268 3261
@@ -3282,8 +3275,8 @@ out:
3282err_80211_unwind: 3275err_80211_unwind:
3283 tasklet_disable(&bcm->isr_tasklet); 3276 tasklet_disable(&bcm->isr_tasklet);
3284 /* unwind all 80211 initialization */ 3277 /* unwind all 80211 initialization */
3285 for (i = 0; i < num_80211_cores; i++) { 3278 for (i = 0; i < bcm->nr_80211_available; i++) {
3286 if (!(bcm->core_80211[i].flags & BCM43xx_COREFLAG_INITIALIZED)) 3279 if (!bcm->core_80211[i].initialized)
3287 continue; 3280 continue;
3288 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); 3281 bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
3289 bcm43xx_wireless_core_cleanup(bcm); 3282 bcm43xx_wireless_core_cleanup(bcm);
@@ -3307,15 +3300,15 @@ static void bcm43xx_detach_board(struct bcm43xx_private *bcm)
3307 3300
3308 /* Free allocated structures/fields */ 3301 /* Free allocated structures/fields */
3309 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { 3302 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3310 kfree(bcm->phy[i]._lo_pairs); 3303 kfree(bcm->core_80211_ext[i].phy._lo_pairs);
3311 if (bcm->phy[i].dyn_tssi_tbl) 3304 if (bcm->core_80211_ext[i].phy.dyn_tssi_tbl)
3312 kfree(bcm->phy[i].tssi2dbm); 3305 kfree(bcm->core_80211_ext[i].phy.tssi2dbm);
3313 } 3306 }
3314} 3307}
3315 3308
3316static int bcm43xx_read_phyinfo(struct bcm43xx_private *bcm) 3309static int bcm43xx_read_phyinfo(struct bcm43xx_private *bcm)
3317{ 3310{
3318 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 3311 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
3319 u16 value; 3312 u16 value;
3320 u8 phy_version; 3313 u8 phy_version;
3321 u8 phy_type; 3314 u8 phy_type;
@@ -3393,7 +3386,6 @@ static int bcm43xx_attach_board(struct bcm43xx_private *bcm)
3393 int i; 3386 int i;
3394 void __iomem *ioaddr; 3387 void __iomem *ioaddr;
3395 unsigned long mmio_start, mmio_end, mmio_flags, mmio_len; 3388 unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
3396 int num_80211_cores;
3397 u32 coremask; 3389 u32 coremask;
3398 3390
3399 err = pci_enable_device(pci_dev); 3391 err = pci_enable_device(pci_dev);
@@ -3467,11 +3459,9 @@ static int bcm43xx_attach_board(struct bcm43xx_private *bcm)
3467 if (err) 3459 if (err)
3468 goto err_chipset_detach; 3460 goto err_chipset_detach;
3469 3461
3470 num_80211_cores = bcm43xx_num_80211_cores(bcm);
3471
3472 /* Attach all IO cores to the backplane. */ 3462 /* Attach all IO cores to the backplane. */
3473 coremask = 0; 3463 coremask = 0;
3474 for (i = 0; i < num_80211_cores; i++) 3464 for (i = 0; i < bcm->nr_80211_available; i++)
3475 coremask |= (1 << bcm->core_80211[i].index); 3465 coremask |= (1 << bcm->core_80211[i].index);
3476 //FIXME: Also attach some non80211 cores? 3466 //FIXME: Also attach some non80211 cores?
3477 err = bcm43xx_setup_backplane_pci_connection(bcm, coremask); 3467 err = bcm43xx_setup_backplane_pci_connection(bcm, coremask);
@@ -3487,7 +3477,7 @@ static int bcm43xx_attach_board(struct bcm43xx_private *bcm)
3487 if (err) 3477 if (err)
3488 goto err_chipset_detach; 3478 goto err_chipset_detach;
3489 3479
3490 for (i = 0; i < num_80211_cores; i++) { 3480 for (i = 0; i < bcm->nr_80211_available; i++) {
3491 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); 3481 err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]);
3492 assert(err != -ENODEV); 3482 assert(err != -ENODEV);
3493 if (err) 3483 if (err)
@@ -3519,7 +3509,7 @@ static int bcm43xx_attach_board(struct bcm43xx_private *bcm)
3519 bcm43xx_pctl_set_crystal(bcm, 0); 3509 bcm43xx_pctl_set_crystal(bcm, 0);
3520 3510
3521 /* Set the MAC address in the networking subsystem */ 3511 /* Set the MAC address in the networking subsystem */
3522 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 3512 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A)
3523 memcpy(bcm->net_dev->dev_addr, bcm->sprom.et1macaddr, 6); 3513 memcpy(bcm->net_dev->dev_addr, bcm->sprom.et1macaddr, 6);
3524 else 3514 else
3525 memcpy(bcm->net_dev->dev_addr, bcm->sprom.il0macaddr, 6); 3515 memcpy(bcm->net_dev->dev_addr, bcm->sprom.il0macaddr, 6);
@@ -3535,9 +3525,9 @@ out:
3535 3525
3536err_80211_unwind: 3526err_80211_unwind:
3537 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { 3527 for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) {
3538 kfree(bcm->phy[i]._lo_pairs); 3528 kfree(bcm->core_80211_ext[i].phy._lo_pairs);
3539 if (bcm->phy[i].dyn_tssi_tbl) 3529 if (bcm->core_80211_ext[i].phy.dyn_tssi_tbl)
3540 kfree(bcm->phy[i].tssi2dbm); 3530 kfree(bcm->core_80211_ext[i].phy.tssi2dbm);
3541 } 3531 }
3542err_chipset_detach: 3532err_chipset_detach:
3543 bcm43xx_chipset_detach(bcm); 3533 bcm43xx_chipset_detach(bcm);
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.h b/drivers/net/wireless/bcm43xx/bcm43xx_main.h
index 086136c3d01f..eca79a38594a 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.h
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.h
@@ -80,7 +80,7 @@ static inline
80u8 bcm43xx_freq_to_channel(struct bcm43xx_private *bcm, 80u8 bcm43xx_freq_to_channel(struct bcm43xx_private *bcm,
81 int freq) 81 int freq)
82{ 82{
83 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 83 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A)
84 return bcm43xx_freq_to_channel_a(freq); 84 return bcm43xx_freq_to_channel_a(freq);
85 return bcm43xx_freq_to_channel_bg(freq); 85 return bcm43xx_freq_to_channel_bg(freq);
86} 86}
@@ -107,7 +107,7 @@ static inline
107int bcm43xx_channel_to_freq(struct bcm43xx_private *bcm, 107int bcm43xx_channel_to_freq(struct bcm43xx_private *bcm,
108 u8 channel) 108 u8 channel)
109{ 109{
110 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 110 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A)
111 return bcm43xx_channel_to_freq_a(channel); 111 return bcm43xx_channel_to_freq_a(channel);
112 return bcm43xx_channel_to_freq_bg(channel); 112 return bcm43xx_channel_to_freq_bg(channel);
113} 113}
@@ -129,7 +129,7 @@ static inline
129int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm, 129int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm,
130 u8 channel) 130 u8 channel)
131{ 131{
132 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 132 if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A)
133 return bcm43xx_is_valid_channel_a(channel); 133 return bcm43xx_is_valid_channel_a(channel);
134 return bcm43xx_is_valid_channel_bg(channel); 134 return bcm43xx_is_valid_channel_bg(channel);
135} 135}
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
index dbbef6ccd153..1ce9a4599903 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
@@ -83,7 +83,7 @@ static void bcm43xx_phy_initg(struct bcm43xx_private *bcm);
83 83
84void bcm43xx_raw_phy_lock(struct bcm43xx_private *bcm) 84void bcm43xx_raw_phy_lock(struct bcm43xx_private *bcm)
85{ 85{
86 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 86 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
87 87
88 assert(irqs_disabled()); 88 assert(irqs_disabled());
89 if (bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) == 0x00000000) { 89 if (bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) == 0x00000000) {
@@ -102,7 +102,7 @@ void bcm43xx_raw_phy_lock(struct bcm43xx_private *bcm)
102 102
103void bcm43xx_raw_phy_unlock(struct bcm43xx_private *bcm) 103void bcm43xx_raw_phy_unlock(struct bcm43xx_private *bcm)
104{ 104{
105 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 105 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
106 106
107 assert(irqs_disabled()); 107 assert(irqs_disabled());
108 if (bcm->current_core->rev < 3) { 108 if (bcm->current_core->rev < 3) {
@@ -132,7 +132,7 @@ void bcm43xx_phy_write(struct bcm43xx_private *bcm, u16 offset, u16 val)
132 132
133void bcm43xx_phy_calibrate(struct bcm43xx_private *bcm) 133void bcm43xx_phy_calibrate(struct bcm43xx_private *bcm)
134{ 134{
135 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 135 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
136 unsigned long flags; 136 unsigned long flags;
137 137
138 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* Dummy read. */ 138 bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* Dummy read. */
@@ -158,39 +158,32 @@ void bcm43xx_phy_calibrate(struct bcm43xx_private *bcm)
158 */ 158 */
159int bcm43xx_phy_connect(struct bcm43xx_private *bcm, int connect) 159int bcm43xx_phy_connect(struct bcm43xx_private *bcm, int connect)
160{ 160{
161 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
161 u32 flags; 162 u32 flags;
162 163
163 if (bcm->current_core->rev < 5) { 164 if (bcm->current_core->rev < 5)
164 if (connect) { 165 goto out;
165 bcm->current_core->phy->connected = 1; 166
166 dprintk(KERN_INFO PFX "PHY connected\n");
167 } else {
168 bcm->current_core->phy->connected = 0;
169 dprintk(KERN_INFO PFX "PHY disconnected\n");
170 }
171 return 0;
172 }
173
174 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); 167 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH);
175 if (connect) { 168 if (connect) {
176 if (!(flags & 0x00010000)) 169 if (!(flags & 0x00010000))
177 return -ENODEV; 170 return -ENODEV;
178 bcm->current_core->phy->connected = 1;
179
180 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); 171 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
181 flags |= (0x800 << 18); 172 flags |= (0x800 << 18);
182 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags); 173 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags);
183 dprintk(KERN_INFO PFX "PHY connected\n");
184 } else { 174 } else {
185 if (!(flags & 0x00020000)) 175 if (!(flags & 0x00020000))
186 return -ENODEV; 176 return -ENODEV;
187 bcm->current_core->phy->connected = 0;
188
189 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); 177 flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW);
190 flags &= ~(0x800 << 18); 178 flags &= ~(0x800 << 18);
191 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags); 179 bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, flags);
192 dprintk(KERN_INFO PFX "PHY disconnected\n");
193 } 180 }
181out:
182 phy->connected = connect;
183 if (connect)
184 dprintk(KERN_INFO PFX "PHY connected\n");
185 else
186 dprintk(KERN_INFO PFX "PHY disconnected\n");
194 187
195 return 0; 188 return 0;
196} 189}
@@ -200,8 +193,8 @@ int bcm43xx_phy_connect(struct bcm43xx_private *bcm, int connect)
200 */ 193 */
201static void bcm43xx_phy_init_pctl(struct bcm43xx_private *bcm) 194static void bcm43xx_phy_init_pctl(struct bcm43xx_private *bcm)
202{ 195{
203 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 196 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
204 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 197 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
205 u16 saved_batt = 0, saved_ratt = 0, saved_txctl1 = 0; 198 u16 saved_batt = 0, saved_ratt = 0, saved_txctl1 = 0;
206 int must_reset_txpower = 0; 199 int must_reset_txpower = 0;
207 200
@@ -250,7 +243,7 @@ static void bcm43xx_phy_init_pctl(struct bcm43xx_private *bcm)
250 243
251static void bcm43xx_phy_agcsetup(struct bcm43xx_private *bcm) 244static void bcm43xx_phy_agcsetup(struct bcm43xx_private *bcm)
252{ 245{
253 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 246 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
254 u16 offset = 0x0000; 247 u16 offset = 0x0000;
255 248
256 if (phy->rev == 1) 249 if (phy->rev == 1)
@@ -326,7 +319,7 @@ static void bcm43xx_phy_agcsetup(struct bcm43xx_private *bcm)
326 319
327static void bcm43xx_phy_setupg(struct bcm43xx_private *bcm) 320static void bcm43xx_phy_setupg(struct bcm43xx_private *bcm)
328{ 321{
329 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 322 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
330 u16 i; 323 u16 i;
331 324
332 assert(phy->type == BCM43xx_PHYTYPE_G); 325 assert(phy->type == BCM43xx_PHYTYPE_G);
@@ -420,7 +413,7 @@ static void bcm43xx_phy_setupg(struct bcm43xx_private *bcm)
420/* Initialize the noisescaletable for APHY */ 413/* Initialize the noisescaletable for APHY */
421static void bcm43xx_phy_init_noisescaletbl(struct bcm43xx_private *bcm) 414static void bcm43xx_phy_init_noisescaletbl(struct bcm43xx_private *bcm)
422{ 415{
423 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 416 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
424 int i; 417 int i;
425 418
426 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, 0x1400); 419 bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, 0x1400);
@@ -448,10 +441,11 @@ static void bcm43xx_phy_init_noisescaletbl(struct bcm43xx_private *bcm)
448 441
449static void bcm43xx_phy_setupa(struct bcm43xx_private *bcm) 442static void bcm43xx_phy_setupa(struct bcm43xx_private *bcm)
450{ 443{
444 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
451 u16 i; 445 u16 i;
452 446
453 assert(bcm->current_core->phy->type == BCM43xx_PHYTYPE_A); 447 assert(phy->type == BCM43xx_PHYTYPE_A);
454 switch (bcm->current_core->phy->rev) { 448 switch (phy->rev) {
455 case 2: 449 case 2:
456 bcm43xx_phy_write(bcm, 0x008E, 0x3800); 450 bcm43xx_phy_write(bcm, 0x008E, 0x3800);
457 bcm43xx_phy_write(bcm, 0x0035, 0x03FF); 451 bcm43xx_phy_write(bcm, 0x0035, 0x03FF);
@@ -563,7 +557,8 @@ static void bcm43xx_phy_setupa(struct bcm43xx_private *bcm)
563/* Initialize APHY. This is also called for the GPHY in some cases. */ 557/* Initialize APHY. This is also called for the GPHY in some cases. */
564static void bcm43xx_phy_inita(struct bcm43xx_private *bcm) 558static void bcm43xx_phy_inita(struct bcm43xx_private *bcm)
565{ 559{
566 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 560 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
561 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
567 u16 tval; 562 u16 tval;
568 563
569 if (phy->type == BCM43xx_PHYTYPE_A) { 564 if (phy->type == BCM43xx_PHYTYPE_A) {
@@ -586,11 +581,11 @@ static void bcm43xx_phy_inita(struct bcm43xx_private *bcm)
586 581
587 if ((bcm->board_vendor == PCI_VENDOR_ID_BROADCOM) 582 if ((bcm->board_vendor == PCI_VENDOR_ID_BROADCOM)
588 && ((bcm->board_type == 0x0416) || (bcm->board_type == 0x040A))) { 583 && ((bcm->board_type == 0x0416) || (bcm->board_type == 0x040A))) {
589 if (bcm->current_core->radio->lofcal == 0xFFFF) { 584 if (radio->lofcal == 0xFFFF) {
590 TODO();//TODO: LOF Cal 585 TODO();//TODO: LOF Cal
591 bcm43xx_radio_set_tx_iq(bcm); 586 bcm43xx_radio_set_tx_iq(bcm);
592 } else 587 } else
593 bcm43xx_radio_write16(bcm, 0x001E, bcm->current_core->radio->lofcal); 588 bcm43xx_radio_write16(bcm, 0x001E, radio->lofcal);
594 } 589 }
595 590
596 bcm43xx_phy_write(bcm, 0x007A, 0xF111); 591 bcm43xx_phy_write(bcm, 0x007A, 0xF111);
@@ -620,7 +615,7 @@ static void bcm43xx_phy_inita(struct bcm43xx_private *bcm)
620 615
621static void bcm43xx_phy_initb2(struct bcm43xx_private *bcm) 616static void bcm43xx_phy_initb2(struct bcm43xx_private *bcm)
622{ 617{
623 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 618 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
624 u16 offset, val; 619 u16 offset, val;
625 620
626 bcm43xx_write16(bcm, 0x03EC, 0x3F22); 621 bcm43xx_write16(bcm, 0x03EC, 0x3F22);
@@ -671,7 +666,7 @@ static void bcm43xx_phy_initb2(struct bcm43xx_private *bcm)
671 666
672static void bcm43xx_phy_initb4(struct bcm43xx_private *bcm) 667static void bcm43xx_phy_initb4(struct bcm43xx_private *bcm)
673{ 668{
674 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 669 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
675 u16 offset, val; 670 u16 offset, val;
676 671
677 bcm43xx_write16(bcm, 0x03EC, 0x3F22); 672 bcm43xx_write16(bcm, 0x03EC, 0x3F22);
@@ -729,8 +724,8 @@ static void bcm43xx_phy_initb4(struct bcm43xx_private *bcm)
729 724
730static void bcm43xx_phy_initb5(struct bcm43xx_private *bcm) 725static void bcm43xx_phy_initb5(struct bcm43xx_private *bcm)
731{ 726{
732 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 727 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
733 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 728 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
734 u16 offset; 729 u16 offset;
735 730
736 if (phy->version == 1 && 731 if (phy->version == 1 &&
@@ -835,8 +830,8 @@ static void bcm43xx_phy_initb5(struct bcm43xx_private *bcm)
835 830
836static void bcm43xx_phy_initb6(struct bcm43xx_private *bcm) 831static void bcm43xx_phy_initb6(struct bcm43xx_private *bcm)
837{ 832{
838 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 833 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
839 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 834 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
840 u16 offset, val; 835 u16 offset, val;
841 836
842 bcm43xx_phy_write(bcm, 0x003E, 0x817A); 837 bcm43xx_phy_write(bcm, 0x003E, 0x817A);
@@ -946,9 +941,9 @@ static void bcm43xx_phy_initb6(struct bcm43xx_private *bcm)
946 udelay(40); 941 udelay(40);
947 bcm43xx_radio_write16(bcm, 0x007C, (bcm43xx_radio_read16(bcm, 0x007C) | 0x0002)); 942 bcm43xx_radio_write16(bcm, 0x007C, (bcm43xx_radio_read16(bcm, 0x007C) | 0x0002));
948 bcm43xx_radio_write16(bcm, 0x0050, 0x0020); 943 bcm43xx_radio_write16(bcm, 0x0050, 0x0020);
949 if ((bcm->current_core->radio->manufact == 0x17F) && 944 if (radio->manufact == 0x17F &&
950 (bcm->current_core->radio->version == 0x2050) && 945 radio->version == 0x2050 &&
951 (bcm->current_core->radio->revision <= 2)) { 946 radio->revision <= 2) {
952 bcm43xx_radio_write16(bcm, 0x0050, 0x0020); 947 bcm43xx_radio_write16(bcm, 0x0050, 0x0020);
953 bcm43xx_radio_write16(bcm, 0x005A, 0x0070); 948 bcm43xx_radio_write16(bcm, 0x005A, 0x0070);
954 bcm43xx_radio_write16(bcm, 0x005B, 0x007B); 949 bcm43xx_radio_write16(bcm, 0x005B, 0x007B);
@@ -1001,8 +996,8 @@ static void bcm43xx_phy_initb6(struct bcm43xx_private *bcm)
1001 996
1002static void bcm43xx_phy_initg(struct bcm43xx_private *bcm) 997static void bcm43xx_phy_initg(struct bcm43xx_private *bcm)
1003{ 998{
1004 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 999 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1005 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1000 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1006 u16 tmp; 1001 u16 tmp;
1007 1002
1008 if (phy->rev == 1) 1003 if (phy->rev == 1)
@@ -1096,8 +1091,8 @@ static u16 bcm43xx_phy_lo_b_r15_loop(struct bcm43xx_private *bcm)
1096 1091
1097void bcm43xx_phy_lo_b_measure(struct bcm43xx_private *bcm) 1092void bcm43xx_phy_lo_b_measure(struct bcm43xx_private *bcm)
1098{ 1093{
1099 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1094 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1100 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1095 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1101 u16 regstack[12] = { 0 }; 1096 u16 regstack[12] = { 0 };
1102 u16 mls; 1097 u16 mls;
1103 u16 fval; 1098 u16 fval;
@@ -1190,7 +1185,9 @@ void bcm43xx_phy_lo_b_measure(struct bcm43xx_private *bcm)
1190static inline 1185static inline
1191u16 bcm43xx_phy_lo_g_deviation_subval(struct bcm43xx_private *bcm, u16 control) 1186u16 bcm43xx_phy_lo_g_deviation_subval(struct bcm43xx_private *bcm, u16 control)
1192{ 1187{
1193 if (bcm->current_core->phy->connected) { 1188 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1189
1190 if (phy->connected) {
1194 bcm43xx_phy_write(bcm, 0x15, 0xE300); 1191 bcm43xx_phy_write(bcm, 0x15, 0xE300);
1195 control <<= 8; 1192 control <<= 8;
1196 bcm43xx_phy_write(bcm, 0x0812, control | 0x00B0); 1193 bcm43xx_phy_write(bcm, 0x0812, control | 0x00B0);
@@ -1242,7 +1239,7 @@ void bcm43xx_lo_write(struct bcm43xx_private *bcm,
1242 "WARNING: Writing invalid LOpair " 1239 "WARNING: Writing invalid LOpair "
1243 "(low: %d, high: %d, index: %lu)\n", 1240 "(low: %d, high: %d, index: %lu)\n",
1244 pair->low, pair->high, 1241 pair->low, pair->high,
1245 (unsigned long)(pair - bcm->current_core->phy->_lo_pairs)); 1242 (unsigned long)(pair - bcm43xx_current_phy(bcm)->_lo_pairs));
1246 dump_stack(); 1243 dump_stack();
1247 } 1244 }
1248#endif 1245#endif
@@ -1257,7 +1254,7 @@ struct bcm43xx_lopair * bcm43xx_find_lopair(struct bcm43xx_private *bcm,
1257 u16 tx) 1254 u16 tx)
1258{ 1255{
1259 static const u8 dict[10] = { 11, 10, 11, 12, 13, 12, 13, 12, 13, 12 }; 1256 static const u8 dict[10] = { 11, 10, 11, 12, 13, 12, 13, 12, 13, 12 };
1260 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1257 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1261 1258
1262 if (baseband_attenuation > 6) 1259 if (baseband_attenuation > 6)
1263 baseband_attenuation = 6; 1260 baseband_attenuation = 6;
@@ -1275,10 +1272,12 @@ struct bcm43xx_lopair * bcm43xx_find_lopair(struct bcm43xx_private *bcm,
1275static inline 1272static inline
1276struct bcm43xx_lopair * bcm43xx_current_lopair(struct bcm43xx_private *bcm) 1273struct bcm43xx_lopair * bcm43xx_current_lopair(struct bcm43xx_private *bcm)
1277{ 1274{
1275 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1276
1278 return bcm43xx_find_lopair(bcm, 1277 return bcm43xx_find_lopair(bcm,
1279 bcm->current_core->radio->txpower[0], 1278 radio->txpower[0],
1280 bcm->current_core->radio->txpower[1], 1279 radio->txpower[1],
1281 bcm->current_core->radio->txpower[2]); 1280 radio->txpower[2]);
1282} 1281}
1283 1282
1284/* Adjust B/G LO */ 1283/* Adjust B/G LO */
@@ -1294,9 +1293,9 @@ void bcm43xx_phy_lo_adjust(struct bcm43xx_private *bcm, int fixed)
1294 bcm43xx_lo_write(bcm, pair); 1293 bcm43xx_lo_write(bcm, pair);
1295} 1294}
1296 1295
1297static inline 1296static void bcm43xx_phy_lo_g_measure_txctl2(struct bcm43xx_private *bcm)
1298void bcm43xx_phy_lo_g_measure_txctl2(struct bcm43xx_private *bcm)
1299{ 1297{
1298 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1300 u16 txctl2 = 0, i; 1299 u16 txctl2 = 0, i;
1301 u32 smallest, tmp; 1300 u32 smallest, tmp;
1302 1301
@@ -1312,7 +1311,7 @@ void bcm43xx_phy_lo_g_measure_txctl2(struct bcm43xx_private *bcm)
1312 txctl2 = i; 1311 txctl2 = i;
1313 } 1312 }
1314 } 1313 }
1315 bcm->current_core->radio->txpower[3] = txctl2; 1314 radio->txpower[3] = txctl2;
1316} 1315}
1317 1316
1318static 1317static
@@ -1402,16 +1401,17 @@ void bcm43xx_phy_lo_g_state(struct bcm43xx_private *bcm,
1402void bcm43xx_phy_set_baseband_attenuation(struct bcm43xx_private *bcm, 1401void bcm43xx_phy_set_baseband_attenuation(struct bcm43xx_private *bcm,
1403 u16 baseband_attenuation) 1402 u16 baseband_attenuation)
1404{ 1403{
1404 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1405 u16 value; 1405 u16 value;
1406 1406
1407 if (bcm->current_core->phy->version == 0) { 1407 if (phy->version == 0) {
1408 value = (bcm43xx_read16(bcm, 0x03E6) & 0xFFF0); 1408 value = (bcm43xx_read16(bcm, 0x03E6) & 0xFFF0);
1409 value |= (baseband_attenuation & 0x000F); 1409 value |= (baseband_attenuation & 0x000F);
1410 bcm43xx_write16(bcm, 0x03E6, value); 1410 bcm43xx_write16(bcm, 0x03E6, value);
1411 return; 1411 return;
1412 } 1412 }
1413 1413
1414 if (bcm->current_core->phy->version > 1) { 1414 if (phy->version > 1) {
1415 value = bcm43xx_phy_read(bcm, 0x0060) & ~0x003C; 1415 value = bcm43xx_phy_read(bcm, 0x0060) & ~0x003C;
1416 value |= (baseband_attenuation << 2) & 0x003C; 1416 value |= (baseband_attenuation << 2) & 0x003C;
1417 } else { 1417 } else {
@@ -1426,8 +1426,8 @@ void bcm43xx_phy_lo_g_measure(struct bcm43xx_private *bcm)
1426{ 1426{
1427 static const u8 pairorder[10] = { 3, 1, 5, 7, 9, 2, 0, 4, 6, 8 }; 1427 static const u8 pairorder[10] = { 3, 1, 5, 7, 9, 2, 0, 4, 6, 8 };
1428 const int is_initializing = bcm43xx_is_initializing(bcm); 1428 const int is_initializing = bcm43xx_is_initializing(bcm);
1429 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1429 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1430 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1430 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1431 u16 h, i, oldi = 0, j; 1431 u16 h, i, oldi = 0, j;
1432 struct bcm43xx_lopair control; 1432 struct bcm43xx_lopair control;
1433 struct bcm43xx_lopair *tmp_control; 1433 struct bcm43xx_lopair *tmp_control;
@@ -1653,7 +1653,7 @@ void bcm43xx_phy_lo_mark_current_used(struct bcm43xx_private *bcm)
1653 1653
1654void bcm43xx_phy_lo_mark_all_unused(struct bcm43xx_private *bcm) 1654void bcm43xx_phy_lo_mark_all_unused(struct bcm43xx_private *bcm)
1655{ 1655{
1656 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1656 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1657 struct bcm43xx_lopair *pair; 1657 struct bcm43xx_lopair *pair;
1658 int i; 1658 int i;
1659 1659
@@ -1668,7 +1668,7 @@ void bcm43xx_phy_lo_mark_all_unused(struct bcm43xx_private *bcm)
1668 */ 1668 */
1669static s8 bcm43xx_phy_estimate_power_out(struct bcm43xx_private *bcm, s8 tssi) 1669static s8 bcm43xx_phy_estimate_power_out(struct bcm43xx_private *bcm, s8 tssi)
1670{ 1670{
1671 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1671 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1672 s8 dbm = 0; 1672 s8 dbm = 0;
1673 s32 tmp; 1673 s32 tmp;
1674 1674
@@ -1698,8 +1698,8 @@ static s8 bcm43xx_phy_estimate_power_out(struct bcm43xx_private *bcm, s8 tssi)
1698/* http://bcm-specs.sipsolutions.net/RecalculateTransmissionPower */ 1698/* http://bcm-specs.sipsolutions.net/RecalculateTransmissionPower */
1699void bcm43xx_phy_xmitpower(struct bcm43xx_private *bcm) 1699void bcm43xx_phy_xmitpower(struct bcm43xx_private *bcm)
1700{ 1700{
1701 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1701 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1702 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1702 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1703 1703
1704 if (phy->savedpctlreg == 0xFFFF) 1704 if (phy->savedpctlreg == 0xFFFF)
1705 return; 1705 return;
@@ -1880,8 +1880,8 @@ s8 bcm43xx_tssi2dbm_entry(s8 entry [], u8 index, s16 pab0, s16 pab1, s16 pab2)
1880/* http://bcm-specs.sipsolutions.net/TSSI_to_DBM_Table */ 1880/* http://bcm-specs.sipsolutions.net/TSSI_to_DBM_Table */
1881int bcm43xx_phy_init_tssi2dbm_table(struct bcm43xx_private *bcm) 1881int bcm43xx_phy_init_tssi2dbm_table(struct bcm43xx_private *bcm)
1882{ 1882{
1883 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1883 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1884 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1884 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1885 s16 pab0, pab1, pab2; 1885 s16 pab0, pab1, pab2;
1886 u8 idx; 1886 u8 idx;
1887 s8 *dyn_tssi2dbm; 1887 s8 *dyn_tssi2dbm;
@@ -1958,7 +1958,7 @@ int bcm43xx_phy_init_tssi2dbm_table(struct bcm43xx_private *bcm)
1958 1958
1959int bcm43xx_phy_init(struct bcm43xx_private *bcm) 1959int bcm43xx_phy_init(struct bcm43xx_private *bcm)
1960{ 1960{
1961 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1961 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1962 int err = -ENODEV; 1962 int err = -ENODEV;
1963 unsigned long flags; 1963 unsigned long flags;
1964 1964
@@ -2008,7 +2008,7 @@ int bcm43xx_phy_init(struct bcm43xx_private *bcm)
2008 2008
2009void bcm43xx_phy_set_antenna_diversity(struct bcm43xx_private *bcm) 2009void bcm43xx_phy_set_antenna_diversity(struct bcm43xx_private *bcm)
2010{ 2010{
2011 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 2011 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
2012 u16 antennadiv; 2012 u16 antennadiv;
2013 u16 offset; 2013 u16 offset;
2014 u16 value; 2014 u16 value;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_pio.c b/drivers/net/wireless/bcm43xx/bcm43xx_pio.c
index 26dc6047d458..7bddae910de9 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_pio.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_pio.c
@@ -146,7 +146,7 @@ struct bcm43xx_pioqueue * parse_cookie(struct bcm43xx_private *bcm,
146 u16 cookie, 146 u16 cookie,
147 struct bcm43xx_pio_txpacket **packet) 147 struct bcm43xx_pio_txpacket **packet)
148{ 148{
149 struct bcm43xx_pio *pio = bcm->current_core->pio; 149 struct bcm43xx_pio *pio = bcm43xx_current_pio(bcm);
150 struct bcm43xx_pioqueue *queue = NULL; 150 struct bcm43xx_pioqueue *queue = NULL;
151 int packetindex; 151 int packetindex;
152 152
@@ -377,7 +377,7 @@ static void bcm43xx_destroy_pioqueue(struct bcm43xx_pioqueue *queue)
377 377
378void bcm43xx_pio_free(struct bcm43xx_private *bcm) 378void bcm43xx_pio_free(struct bcm43xx_private *bcm)
379{ 379{
380 struct bcm43xx_pio *pio = bcm->current_core->pio; 380 struct bcm43xx_pio *pio = bcm43xx_current_pio(bcm);
381 381
382 bcm43xx_destroy_pioqueue(pio->queue3); 382 bcm43xx_destroy_pioqueue(pio->queue3);
383 pio->queue3 = NULL; 383 pio->queue3 = NULL;
@@ -391,7 +391,7 @@ void bcm43xx_pio_free(struct bcm43xx_private *bcm)
391 391
392int bcm43xx_pio_init(struct bcm43xx_private *bcm) 392int bcm43xx_pio_init(struct bcm43xx_private *bcm)
393{ 393{
394 struct bcm43xx_pio *pio = bcm->current_core->pio; 394 struct bcm43xx_pio *pio = bcm43xx_current_pio(bcm);
395 struct bcm43xx_pioqueue *queue; 395 struct bcm43xx_pioqueue *queue;
396 int err = -ENOMEM; 396 int err = -ENOMEM;
397 397
@@ -438,7 +438,7 @@ err_destroy0:
438int bcm43xx_pio_tx(struct bcm43xx_private *bcm, 438int bcm43xx_pio_tx(struct bcm43xx_private *bcm,
439 struct ieee80211_txb *txb) 439 struct ieee80211_txb *txb)
440{ 440{
441 struct bcm43xx_pioqueue *queue = bcm->current_core->pio->queue1; 441 struct bcm43xx_pioqueue *queue = bcm43xx_current_pio(bcm)->queue1;
442 struct bcm43xx_pio_txpacket *packet; 442 struct bcm43xx_pio_txpacket *packet;
443 u16 tmp; 443 u16 tmp;
444 444
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
index 4d3b0e85876c..07a6169a0b34 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
@@ -114,8 +114,8 @@ void bcm43xx_radio_unlock(struct bcm43xx_private *bcm)
114 114
115u16 bcm43xx_radio_read16(struct bcm43xx_private *bcm, u16 offset) 115u16 bcm43xx_radio_read16(struct bcm43xx_private *bcm, u16 offset)
116{ 116{
117 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 117 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
118 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 118 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
119 119
120 switch (phy->type) { 120 switch (phy->type) {
121 case BCM43xx_PHYTYPE_A: 121 case BCM43xx_PHYTYPE_A:
@@ -151,7 +151,7 @@ void bcm43xx_radio_write16(struct bcm43xx_private *bcm, u16 offset, u16 val)
151static void bcm43xx_set_all_gains(struct bcm43xx_private *bcm, 151static void bcm43xx_set_all_gains(struct bcm43xx_private *bcm,
152 s16 first, s16 second, s16 third) 152 s16 first, s16 second, s16 third)
153{ 153{
154 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 154 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
155 u16 i; 155 u16 i;
156 u16 start = 0x08, end = 0x18; 156 u16 start = 0x08, end = 0x18;
157 u16 offset = 0x0400; 157 u16 offset = 0x0400;
@@ -183,7 +183,7 @@ static void bcm43xx_set_all_gains(struct bcm43xx_private *bcm,
183 183
184static void bcm43xx_set_original_gains(struct bcm43xx_private *bcm) 184static void bcm43xx_set_original_gains(struct bcm43xx_private *bcm)
185{ 185{
186 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 186 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
187 u16 i, tmp; 187 u16 i, tmp;
188 u16 offset = 0x0400; 188 u16 offset = 0x0400;
189 u16 start = 0x0008, end = 0x0018; 189 u16 start = 0x0008, end = 0x0018;
@@ -217,7 +217,7 @@ static void bcm43xx_set_original_gains(struct bcm43xx_private *bcm)
217/* Synthetic PU workaround */ 217/* Synthetic PU workaround */
218static void bcm43xx_synth_pu_workaround(struct bcm43xx_private *bcm, u8 channel) 218static void bcm43xx_synth_pu_workaround(struct bcm43xx_private *bcm, u8 channel)
219{ 219{
220 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 220 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
221 221
222 if (radio->version != 0x2050 || radio->revision >= 6) { 222 if (radio->version != 0x2050 || radio->revision >= 6) {
223 /* We do not need the workaround. */ 223 /* We do not need the workaround. */
@@ -238,7 +238,7 @@ static void bcm43xx_synth_pu_workaround(struct bcm43xx_private *bcm, u8 channel)
238 238
239u8 bcm43xx_radio_aci_detect(struct bcm43xx_private *bcm, u8 channel) 239u8 bcm43xx_radio_aci_detect(struct bcm43xx_private *bcm, u8 channel)
240{ 240{
241 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 241 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
242 u8 ret = 0; 242 u8 ret = 0;
243 u16 saved, rssi, temp; 243 u16 saved, rssi, temp;
244 int i, j = 0; 244 int i, j = 0;
@@ -269,8 +269,8 @@ u8 bcm43xx_radio_aci_detect(struct bcm43xx_private *bcm, u8 channel)
269 269
270u8 bcm43xx_radio_aci_scan(struct bcm43xx_private *bcm) 270u8 bcm43xx_radio_aci_scan(struct bcm43xx_private *bcm)
271{ 271{
272 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 272 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
273 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 273 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
274 u8 ret[13]; 274 u8 ret[13];
275 unsigned int channel = radio->channel; 275 unsigned int channel = radio->channel;
276 unsigned int i, j, start, end; 276 unsigned int i, j, start, end;
@@ -351,22 +351,23 @@ void bcm43xx_nrssi_hw_update(struct bcm43xx_private *bcm, u16 val)
351/* http://bcm-specs.sipsolutions.net/NRSSILookupTable */ 351/* http://bcm-specs.sipsolutions.net/NRSSILookupTable */
352void bcm43xx_nrssi_mem_update(struct bcm43xx_private *bcm) 352void bcm43xx_nrssi_mem_update(struct bcm43xx_private *bcm)
353{ 353{
354 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
354 s16 i, delta; 355 s16 i, delta;
355 s32 tmp; 356 s32 tmp;
356 357
357 delta = 0x1F - bcm->current_core->radio->nrssi[0]; 358 delta = 0x1F - radio->nrssi[0];
358 for (i = 0; i < 64; i++) { 359 for (i = 0; i < 64; i++) {
359 tmp = (i - delta) * bcm->current_core->radio->nrssislope; 360 tmp = (i - delta) * radio->nrssislope;
360 tmp /= 0x10000; 361 tmp /= 0x10000;
361 tmp += 0x3A; 362 tmp += 0x3A;
362 tmp = limit_value(tmp, 0, 0x3F); 363 tmp = limit_value(tmp, 0, 0x3F);
363 bcm->current_core->radio->nrssi_lt[i] = tmp; 364 radio->nrssi_lt[i] = tmp;
364 } 365 }
365} 366}
366 367
367static void bcm43xx_calc_nrssi_offset(struct bcm43xx_private *bcm) 368static void bcm43xx_calc_nrssi_offset(struct bcm43xx_private *bcm)
368{ 369{
369 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 370 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
370 u16 backup[20] = { 0 }; 371 u16 backup[20] = { 0 };
371 s16 v47F; 372 s16 v47F;
372 u16 i; 373 u16 i;
@@ -531,8 +532,8 @@ static void bcm43xx_calc_nrssi_offset(struct bcm43xx_private *bcm)
531 532
532void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm) 533void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm)
533{ 534{
534 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 535 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
535 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 536 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
536 u16 backup[18] = { 0 }; 537 u16 backup[18] = { 0 };
537 u16 tmp; 538 u16 tmp;
538 s16 nrssi0, nrssi1; 539 s16 nrssi0, nrssi1;
@@ -779,8 +780,8 @@ void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm)
779 780
780void bcm43xx_calc_nrssi_threshold(struct bcm43xx_private *bcm) 781void bcm43xx_calc_nrssi_threshold(struct bcm43xx_private *bcm)
781{ 782{
782 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 783 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
783 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 784 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
784 s16 threshold; 785 s16 threshold;
785 s32 a, b; 786 s32 a, b;
786 int tmp; 787 int tmp;
@@ -804,7 +805,7 @@ void bcm43xx_calc_nrssi_threshold(struct bcm43xx_private *bcm)
804 radiotype = 1; 805 radiotype = 1;
805 806
806 if (radiotype == 1) { 807 if (radiotype == 1) {
807 threshold = bcm->current_core->radio->nrssi[1] - 5; 808 threshold = radio->nrssi[1] - 5;
808 } else { 809 } else {
809 threshold = 40 * radio->nrssi[0]; 810 threshold = 40 * radio->nrssi[0];
810 threshold += 33 * (radio->nrssi[1] - radio->nrssi[0]); 811 threshold += 33 * (radio->nrssi[1] - radio->nrssi[0]);
@@ -901,8 +902,8 @@ static void
901bcm43xx_radio_interference_mitigation_enable(struct bcm43xx_private *bcm, 902bcm43xx_radio_interference_mitigation_enable(struct bcm43xx_private *bcm,
902 int mode) 903 int mode)
903{ 904{
904 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 905 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
905 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 906 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
906 int i = 0; 907 int i = 0;
907 u16 *stack = radio->interfstack; 908 u16 *stack = radio->interfstack;
908 u16 tmp, flipped; 909 u16 tmp, flipped;
@@ -1052,8 +1053,8 @@ static void
1052bcm43xx_radio_interference_mitigation_disable(struct bcm43xx_private *bcm, 1053bcm43xx_radio_interference_mitigation_disable(struct bcm43xx_private *bcm,
1053 int mode) 1054 int mode)
1054{ 1055{
1055 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1056 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1056 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1057 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1057 int i = 0; 1058 int i = 0;
1058 u16 *stack = radio->interfstack; 1059 u16 *stack = radio->interfstack;
1059 u16 tmp, flipped; 1060 u16 tmp, flipped;
@@ -1142,8 +1143,8 @@ bcm43xx_radio_interference_mitigation_disable(struct bcm43xx_private *bcm,
1142int bcm43xx_radio_set_interference_mitigation(struct bcm43xx_private *bcm, 1143int bcm43xx_radio_set_interference_mitigation(struct bcm43xx_private *bcm,
1143 int mode) 1144 int mode)
1144{ 1145{
1145 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1146 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1146 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1147 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1147 int currentmode; 1148 int currentmode;
1148 1149
1149 if ((phy->type != BCM43xx_PHYTYPE_G) || 1150 if ((phy->type != BCM43xx_PHYTYPE_G) ||
@@ -1199,8 +1200,8 @@ u16 bcm43xx_radio_calibrationvalue(struct bcm43xx_private *bcm)
1199 1200
1200u16 bcm43xx_radio_init2050(struct bcm43xx_private *bcm) 1201u16 bcm43xx_radio_init2050(struct bcm43xx_private *bcm)
1201{ 1202{
1202 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1203 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1203 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1204 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1204 u16 backup[19] = { 0 }; 1205 u16 backup[19] = { 0 };
1205 u16 ret; 1206 u16 ret;
1206 u16 i, j; 1207 u16 i, j;
@@ -1444,7 +1445,7 @@ int bcm43xx_radio_selectchannel(struct bcm43xx_private *bcm,
1444 u8 channel, 1445 u8 channel,
1445 int synthetic_pu_workaround) 1446 int synthetic_pu_workaround)
1446{ 1447{
1447 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1448 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1448 u16 r8, tmp; 1449 u16 r8, tmp;
1449 u16 freq; 1450 u16 freq;
1450 1451
@@ -1628,6 +1629,7 @@ static u16 bcm43xx_get_txgain_dac(u16 txpower)
1628 1629
1629void bcm43xx_radio_set_txpower_a(struct bcm43xx_private *bcm, u16 txpower) 1630void bcm43xx_radio_set_txpower_a(struct bcm43xx_private *bcm, u16 txpower)
1630{ 1631{
1632 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1631 u16 pamp, base, dac, ilt; 1633 u16 pamp, base, dac, ilt;
1632 1634
1633 txpower = limit_value(txpower, 0, 63); 1635 txpower = limit_value(txpower, 0, 63);
@@ -1650,7 +1652,7 @@ void bcm43xx_radio_set_txpower_a(struct bcm43xx_private *bcm, u16 txpower)
1650 1652
1651 bcm43xx_ilt_write(bcm, 0x3001, dac); 1653 bcm43xx_ilt_write(bcm, 0x3001, dac);
1652 1654
1653 bcm->current_core->radio->txpower[0] = txpower; 1655 radio->txpower[0] = txpower;
1654 1656
1655 TODO(); 1657 TODO();
1656 //TODO: FuncPlaceholder (Adjust BB loft cancel) 1658 //TODO: FuncPlaceholder (Adjust BB loft cancel)
@@ -1660,8 +1662,8 @@ void bcm43xx_radio_set_txpower_bg(struct bcm43xx_private *bcm,
1660 u16 baseband_attenuation, u16 radio_attenuation, 1662 u16 baseband_attenuation, u16 radio_attenuation,
1661 u16 txpower) 1663 u16 txpower)
1662{ 1664{
1663 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1665 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1664 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1666 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1665 1667
1666 if (baseband_attenuation == 0xFFFF) 1668 if (baseband_attenuation == 0xFFFF)
1667 baseband_attenuation = radio->txpower[0]; 1669 baseband_attenuation = radio->txpower[0];
@@ -1698,8 +1700,8 @@ void bcm43xx_radio_set_txpower_bg(struct bcm43xx_private *bcm,
1698 1700
1699void bcm43xx_radio_turn_on(struct bcm43xx_private *bcm) 1701void bcm43xx_radio_turn_on(struct bcm43xx_private *bcm)
1700{ 1702{
1701 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1703 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1702 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1704 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1703 int err; 1705 int err;
1704 1706
1705 if (radio->enabled) 1707 if (radio->enabled)
@@ -1730,8 +1732,8 @@ void bcm43xx_radio_turn_on(struct bcm43xx_private *bcm)
1730 1732
1731void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm) 1733void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm)
1732{ 1734{
1733 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 1735 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1734 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 1736 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
1735 1737
1736 if (phy->type == BCM43xx_PHYTYPE_A) { 1738 if (phy->type == BCM43xx_PHYTYPE_A) {
1737 bcm43xx_radio_write16(bcm, 0x0004, 0x00FF); 1739 bcm43xx_radio_write16(bcm, 0x0004, 0x00FF);
@@ -1750,7 +1752,9 @@ void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm)
1750 1752
1751void bcm43xx_radio_clear_tssi(struct bcm43xx_private *bcm) 1753void bcm43xx_radio_clear_tssi(struct bcm43xx_private *bcm)
1752{ 1754{
1753 switch (bcm->current_core->phy->type) { 1755 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
1756
1757 switch (phy->type) {
1754 case BCM43xx_PHYTYPE_A: 1758 case BCM43xx_PHYTYPE_A:
1755 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0068, 0x7F7F); 1759 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0068, 0x7F7F);
1756 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x006a, 0x7F7F); 1760 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x006a, 0x7F7F);
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c b/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c
index 713ec601c342..35c3c9704c3c 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c
@@ -150,7 +150,7 @@ static ssize_t bcm43xx_attr_interfmode_show(struct device *dev,
150 bcm43xx_lock(bcm, flags); 150 bcm43xx_lock(bcm, flags);
151 assert(bcm->initialized); 151 assert(bcm->initialized);
152 152
153 switch (bcm->current_core->radio->interfmode) { 153 switch (bcm43xx_current_radio(bcm)->interfmode) {
154 case BCM43xx_RADIO_INTERFMODE_NONE: 154 case BCM43xx_RADIO_INTERFMODE_NONE:
155 count = snprintf(buf, PAGE_SIZE, "0 (No Interference Mitigation)\n"); 155 count = snprintf(buf, PAGE_SIZE, "0 (No Interference Mitigation)\n");
156 break; 156 break;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
index 208193851e8e..651ba6054957 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
@@ -56,15 +56,14 @@ static int bcm43xx_wx_get_name(struct net_device *net_dev,
56{ 56{
57 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 57 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
58 unsigned long flags; 58 unsigned long flags;
59 int i, nr_80211; 59 int i;
60 struct bcm43xx_phyinfo *phy; 60 struct bcm43xx_phyinfo *phy;
61 char suffix[7] = { 0 }; 61 char suffix[7] = { 0 };
62 int have_a = 0, have_b = 0, have_g = 0; 62 int have_a = 0, have_b = 0, have_g = 0;
63 63
64 bcm43xx_lock(bcm, flags); 64 bcm43xx_lock(bcm, flags);
65 nr_80211 = bcm43xx_num_80211_cores(bcm); 65 for (i = 0; i < bcm->nr_80211_available; i++) {
66 for (i = 0; i < nr_80211; i++) { 66 phy = &(bcm->core_80211_ext[i].phy);
67 phy = bcm->phy + i;
68 switch (phy->type) { 67 switch (phy->type) {
69 case BCM43xx_PHYTYPE_A: 68 case BCM43xx_PHYTYPE_A:
70 have_a = 1; 69 have_a = 1;
@@ -129,7 +128,7 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
129 err = bcm43xx_radio_selectchannel(bcm, channel, 0); 128 err = bcm43xx_radio_selectchannel(bcm, channel, 0);
130 bcm43xx_mac_enable(bcm); 129 bcm43xx_mac_enable(bcm);
131 } else { 130 } else {
132 bcm->current_core->radio->initial_channel = channel; 131 bcm43xx_current_radio(bcm)->initial_channel = channel;
133 err = 0; 132 err = 0;
134 } 133 }
135out_unlock: 134out_unlock:
@@ -144,15 +143,17 @@ static int bcm43xx_wx_get_channelfreq(struct net_device *net_dev,
144 char *extra) 143 char *extra)
145{ 144{
146 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); 145 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
146 struct bcm43xx_radioinfo *radio;
147 unsigned long flags; 147 unsigned long flags;
148 int err = -ENODEV; 148 int err = -ENODEV;
149 u16 channel; 149 u16 channel;
150 150
151 bcm43xx_lock(bcm, flags); 151 bcm43xx_lock(bcm, flags);
152 channel = bcm->current_core->radio->channel; 152 radio = bcm43xx_current_radio(bcm);
153 channel = radio->channel;
153 if (channel == 0xFF) { 154 if (channel == 0xFF) {
154 assert(!bcm->initialized); 155 assert(!bcm->initialized);
155 channel = bcm->current_core->radio->initial_channel; 156 channel = radio->initial_channel;
156 if (channel == 0xFF) 157 if (channel == 0xFF)
157 goto out_unlock; 158 goto out_unlock;
158 } 159 }
@@ -232,6 +233,7 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
232 const struct ieee80211_geo *geo; 233 const struct ieee80211_geo *geo;
233 unsigned long flags; 234 unsigned long flags;
234 int i, j; 235 int i, j;
236 struct bcm43xx_phyinfo *phy;
235 237
236 data->data.length = sizeof(*range); 238 data->data.length = sizeof(*range);
237 memset(range, 0, sizeof(*range)); 239 memset(range, 0, sizeof(*range));
@@ -270,11 +272,12 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
270 IW_ENC_CAPA_CIPHER_CCMP; 272 IW_ENC_CAPA_CIPHER_CCMP;
271 273
272 bcm43xx_lock(bcm, flags); 274 bcm43xx_lock(bcm, flags);
275 phy = bcm43xx_current_phy(bcm);
273 276
274 range->num_bitrates = 0; 277 range->num_bitrates = 0;
275 i = 0; 278 i = 0;
276 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A || 279 if (phy->type == BCM43xx_PHYTYPE_A ||
277 bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) { 280 phy->type == BCM43xx_PHYTYPE_G) {
278 range->num_bitrates = 8; 281 range->num_bitrates = 8;
279 range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB; 282 range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB;
280 range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB; 283 range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB;
@@ -285,8 +288,8 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
285 range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB; 288 range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB;
286 range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB; 289 range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB;
287 } 290 }
288 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_B || 291 if (phy->type == BCM43xx_PHYTYPE_B ||
289 bcm->current_core->phy->type == BCM43xx_PHYTYPE_G) { 292 phy->type == BCM43xx_PHYTYPE_G) {
290 range->num_bitrates += 4; 293 range->num_bitrates += 4;
291 range->bitrate[i++] = IEEE80211_CCK_RATE_1MB; 294 range->bitrate[i++] = IEEE80211_CCK_RATE_1MB;
292 range->bitrate[i++] = IEEE80211_CCK_RATE_2MB; 295 range->bitrate[i++] = IEEE80211_CCK_RATE_2MB;
@@ -461,8 +464,8 @@ static int bcm43xx_wx_set_xmitpower(struct net_device *net_dev,
461 bcm43xx_lock_mmio(bcm, flags); 464 bcm43xx_lock_mmio(bcm, flags);
462 if (!bcm->initialized) 465 if (!bcm->initialized)
463 goto out_unlock; 466 goto out_unlock;
464 radio = bcm->current_core->radio; 467 radio = bcm43xx_current_radio(bcm);
465 phy = bcm->current_core->phy; 468 phy = bcm43xx_current_phy(bcm);
466 if (data->txpower.disabled != (!(radio->enabled))) { 469 if (data->txpower.disabled != (!(radio->enabled))) {
467 if (data->txpower.disabled) 470 if (data->txpower.disabled)
468 bcm43xx_radio_turn_off(bcm); 471 bcm43xx_radio_turn_off(bcm);
@@ -500,7 +503,7 @@ static int bcm43xx_wx_get_xmitpower(struct net_device *net_dev,
500 bcm43xx_lock(bcm, flags); 503 bcm43xx_lock(bcm, flags);
501 if (!bcm->initialized) 504 if (!bcm->initialized)
502 goto out_unlock; 505 goto out_unlock;
503 radio = bcm->current_core->radio; 506 radio = bcm43xx_current_radio(bcm);
504 /* desired dBm value is in Q5.2 */ 507 /* desired dBm value is in Q5.2 */
505 data->txpower.value = radio->txpower_desired >> 2; 508 data->txpower.value = radio->txpower_desired >> 2;
506 data->txpower.fixed = 1; 509 data->txpower.fixed = 1;
@@ -645,7 +648,7 @@ static int bcm43xx_wx_set_interfmode(struct net_device *net_dev,
645 "not supported while the interface is down.\n"); 648 "not supported while the interface is down.\n");
646 err = -ENODEV; 649 err = -ENODEV;
647 } else 650 } else
648 bcm->current_core->radio->interfmode = mode; 651 bcm43xx_current_radio(bcm)->interfmode = mode;
649 } 652 }
650 bcm43xx_unlock_mmio(bcm, flags); 653 bcm43xx_unlock_mmio(bcm, flags);
651 654
@@ -662,7 +665,7 @@ static int bcm43xx_wx_get_interfmode(struct net_device *net_dev,
662 int mode; 665 int mode;
663 666
664 bcm43xx_lock(bcm, flags); 667 bcm43xx_lock(bcm, flags);
665 mode = bcm->current_core->radio->interfmode; 668 mode = bcm43xx_current_radio(bcm)->interfmode;
666 bcm43xx_unlock(bcm, flags); 669 bcm43xx_unlock(bcm, flags);
667 670
668 switch (mode) { 671 switch (mode) {
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
index 5ee572e79f61..c4809da8e9c7 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
@@ -284,7 +284,7 @@ void bcm43xx_generate_txhdr(struct bcm43xx_private *bcm,
284 const int is_first_fragment, 284 const int is_first_fragment,
285 const u16 cookie) 285 const u16 cookie)
286{ 286{
287 const struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 287 const struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
288 const struct ieee80211_hdr_4addr *wireless_header = (const struct ieee80211_hdr_4addr *)fragment_data; 288 const struct ieee80211_hdr_4addr *wireless_header = (const struct ieee80211_hdr_4addr *)fragment_data;
289 const struct ieee80211_security *secinfo = &bcm->ieee->sec; 289 const struct ieee80211_security *secinfo = &bcm->ieee->sec;
290 u8 bitrate; 290 u8 bitrate;
@@ -382,8 +382,8 @@ static s8 bcm43xx_rssi_postprocess(struct bcm43xx_private *bcm,
382 u8 in_rssi, int ofdm, 382 u8 in_rssi, int ofdm,
383 int adjust_2053, int adjust_2050) 383 int adjust_2053, int adjust_2050)
384{ 384{
385 struct bcm43xx_radioinfo *radio = bcm->current_core->radio; 385 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
386 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 386 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
387 s32 tmp; 387 s32 tmp;
388 388
389 switch (radio->version) { 389 switch (radio->version) {
@@ -442,7 +442,7 @@ static s8 bcm43xx_rssi_postprocess(struct bcm43xx_private *bcm,
442static s8 bcm43xx_rssinoise_postprocess(struct bcm43xx_private *bcm, 442static s8 bcm43xx_rssinoise_postprocess(struct bcm43xx_private *bcm,
443 u8 in_rssi) 443 u8 in_rssi)
444{ 444{
445 struct bcm43xx_phyinfo *phy = bcm->current_core->phy; 445 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
446 s8 ret; 446 s8 ret;
447 447
448 if (phy->type == BCM43xx_PHYTYPE_A) { 448 if (phy->type == BCM43xx_PHYTYPE_A) {
@@ -458,6 +458,8 @@ int bcm43xx_rx(struct bcm43xx_private *bcm,
458 struct sk_buff *skb, 458 struct sk_buff *skb,
459 struct bcm43xx_rxhdr *rxhdr) 459 struct bcm43xx_rxhdr *rxhdr)
460{ 460{
461 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
462 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
461 struct bcm43xx_plcp_hdr4 *plcp; 463 struct bcm43xx_plcp_hdr4 *plcp;
462 struct ieee80211_rx_stats stats; 464 struct ieee80211_rx_stats stats;
463 struct ieee80211_hdr_4addr *wlhdr; 465 struct ieee80211_hdr_4addr *wlhdr;
@@ -494,13 +496,13 @@ int bcm43xx_rx(struct bcm43xx_private *bcm,
494 else 496 else
495 stats.rate = bcm43xx_plcp_get_bitrate_cck(plcp); 497 stats.rate = bcm43xx_plcp_get_bitrate_cck(plcp);
496//printk("RX ofdm %d, rate == %u\n", is_ofdm, stats.rate); 498//printk("RX ofdm %d, rate == %u\n", is_ofdm, stats.rate);
497 stats.received_channel = bcm->current_core->radio->channel; 499 stats.received_channel = radio->channel;
498//TODO stats.control = 500//TODO stats.control =
499 stats.mask = IEEE80211_STATMASK_SIGNAL | 501 stats.mask = IEEE80211_STATMASK_SIGNAL |
500//TODO IEEE80211_STATMASK_NOISE | 502//TODO IEEE80211_STATMASK_NOISE |
501 IEEE80211_STATMASK_RATE | 503 IEEE80211_STATMASK_RATE |
502 IEEE80211_STATMASK_RSSI; 504 IEEE80211_STATMASK_RSSI;
503 if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) 505 if (phy->type == BCM43xx_PHYTYPE_A)
504 stats.freq = IEEE80211_52GHZ_BAND; 506 stats.freq = IEEE80211_52GHZ_BAND;
505 else 507 else
506 stats.freq = IEEE80211_24GHZ_BAND; 508 stats.freq = IEEE80211_24GHZ_BAND;