bcm43xx-d80211: init routine rewrite
Subsystems (3)
PATCH 1/1 bcm43xx-d80211: init routine rewrite
Hi John,
Please apply this to wireless-dev.
--
Rewrite of the bcm43xx initialization routines.
This fixes several issues:
* up-down-up-down-up... stale data issue
(May fix some DHCP issues)
* Fix the init vs IRQ handler race (and remove the workaround)
* Fix init for cards with multiple cores (APHY)
The active PHY is selected through d80211.
* Fix the controller restart code.
Controller restart can now also be triggered through echo 1 > /debug/bcm43xx/ethX/restart
Signed-off-by Michael Buesch <[email protected]>
drivers/net/wireless/d80211/bcm43xx/bcm43xx.h +25 -25
@@ -493,6 +493,12 @@* This lock is only used by bcm43xx_phy_{un}lock() */ spinlock_t lock; + +/* Firmware. */ +const struct firmware *ucode; +const struct firmware *pcm; +const struct firmware *initvals0; +const struct firmware *initvals1; };
@@ -583,12 +589,14 @@ u8 available:1, enabled:1, initialized:1; -/** core_id ID number */ -u16 id;/** core_rev revision number */ u8 rev;/** Index number for _switch_core() */ u8 index; +/** core_id ID number */ +u16 id; +/** Core-specific data. */ +void *priv; };/* Additional information for each 80211 core. */
@@ -658,7 +666,10 @@ BCM43xx_STAT_RESTARTING, /* controller_restart() called. */ };#define bcm43xx_status (bcm) atomic_read(&(bcm)->init_status) -#define bcm43xx_set_status (bcm, stat) atomic_set(&(bcm)->init_status, (stat)) +#define bcm43xx_set_status (bcm, stat) do { \ + atomic_set(&(bcm)->init_status, (stat)); \ + smp_wmb(); \ + } while (0)/* *** THEORY OF LOCKING *** *
@@ -740,10 +751,6 @@struct bcm43xx_coreinfo core_80211[ BCM43xx_MAX_80211_CORES ];/* Additional information, specific to the 80211 cores. */ struct bcm43xx_coreinfo_80211 core_80211_ext[ BCM43xx_MAX_80211_CORES ]; -/* Index of the current 80211 core. If current_core is not -* an 80211 core, this is -1. -*/ -int current_80211_core_idx;/* Number of available 80211 cores. */ int nr_80211_available;
@@ -776,12 +783,6 @@struct bcm43xx_key key[54 ];u8 default_key_idx; -/* Firmware. */ -const struct firmware *ucode; -const struct firmware *pcm; -const struct firmware *initvals0; -const struct firmware *initvals1; -/* Cached beacon template while uploading the template. */ struct sk_buff *cached_beacon;
@@ -828,34 +829,33 @@* any of these functions. */ static inline +struct bcm43xx_coreinfo_80211 * +bcm43xx_current_80211_priv (struct bcm43xx_private *bcm) +{ +assert (bcm->current_core->id == BCM43xx_COREID_80211); +return bcm->current_core->priv; +} +static inline struct bcm43xx_pio *bcm43xx_current_pio (struct bcm43xx_private *bcm) {assert (bcm43xx_using_pio (bcm)); -assert (bcm->current_80211_core_idx >=0 ); -assert (bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); -return &(bcm->core_80211_ext[bcm->current_80211_core_idx].pio); +return &(bcm43xx_current_80211_priv (bcm)->pio); }static inline struct bcm43xx_dma *bcm43xx_current_dma (struct bcm43xx_private *bcm) {assert (!bcm43xx_using_pio (bcm)); -assert (bcm->current_80211_core_idx >=0 ); -assert (bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); -return &(bcm->core_80211_ext[bcm->current_80211_core_idx].dma); +return &(bcm43xx_current_80211_priv (bcm)->dma); }static inline struct bcm43xx_phyinfo *bcm43xx_current_phy (struct bcm43xx_private *bcm) { -assert (bcm->current_80211_core_idx >=0 ); -assert (bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); -return &(bcm->core_80211_ext[bcm->current_80211_core_idx].phy); +return &(bcm43xx_current_80211_priv (bcm)->phy); }static inline struct bcm43xx_radioinfo *bcm43xx_current_radio (struct bcm43xx_private *bcm) { -assert (bcm->current_80211_core_idx >=0 ); -assert (bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); -return &(bcm->core_80211_ext[bcm->current_80211_core_idx].radio); +return &(bcm43xx_current_80211_priv (bcm)->radio); }
drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c +991 -1292
2,720 lines not on this page · raw message
drivers/net/wireless/d80211/bcm43xx/bcm43xx_debugfs.c +46 -0
70 lines not on this page · raw message
drivers/net/wireless/d80211/bcm43xx/bcm43xx_debugfs.h +1 -0
@@ -20,6 +20,7 @@struct dentry *dentry_spromdump;struct dentry *dentry_tsf;struct dentry *dentry_txstat; +struct dentry *dentry_restart;struct bcm43xx_private *bcm;
drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.h +3 -0
@@ -152,6 +152,9 @@int bcm43xx_switch_core (struct bcm43xx_private *bcm,struct bcm43xx_coreinfo *new_core); +int bcm43xx_select_wireless_core (struct bcm43xx_private *bcm, +int phytype); +void bcm43xx_wireless_core_reset (struct bcm43xx_private *bcm,int connect_phy);void bcm43xx_mac_suspend (struct bcm43xx_private *bcm);
Signature · 1 line
Greetings Michael.