More #defines in bcm43xx.h can be deleted and the corresponding #defines in ssh.h can be used instead. But I leave this alone for now...
Signed-off-by: Michael Buesch <[EMAIL PROTECTED]> Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx.h =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx.h 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx.h 2006-08-14 23:19:39.000000000 +0200 @@ -11,6 +11,7 @@ #include <asm/atomic.h> #include <asm/io.h> +#include <linux/ssb.h> #include <linux/wireless.h> #include <net/d80211.h> #include <net/d80211_mgmt.h> @@ -186,25 +187,7 @@ #define BCM43xx_PCTL_FORCE_PLL 0x1000 #define BCM43xx_PCTL_DYN_XTAL 0x2000 -/* COREIDs */ -#define BCM43xx_COREID_CHIPCOMMON 0x800 -#define BCM43xx_COREID_ILINE20 0x801 -#define BCM43xx_COREID_SDRAM 0x803 -#define BCM43xx_COREID_PCI 0x804 -#define BCM43xx_COREID_MIPS 0x805 -#define BCM43xx_COREID_ETHERNET 0x806 -#define BCM43xx_COREID_V90 0x807 -#define BCM43xx_COREID_USB11_HOSTDEV 0x80a -#define BCM43xx_COREID_IPSEC 0x80b -#define BCM43xx_COREID_PCMCIA 0x80d -#define BCM43xx_COREID_EXT_IF 0x80f -#define BCM43xx_COREID_80211 0x812 -#define BCM43xx_COREID_MIPS_3302 0x816 -#define BCM43xx_COREID_USB11_HOST 0x817 -#define BCM43xx_COREID_USB11_DEV 0x818 -#define BCM43xx_COREID_USB20_HOST 0x819 -#define BCM43xx_COREID_USB20_DEV 0x81a -#define BCM43xx_COREID_SDIO_HOST 0x81b +// FIXME: deletes SSB duplicates. /* Core Information Registers */ #define BCM43xx_CIR_BASE 0xf00 @@ -578,29 +561,9 @@ #define BCM43xx_MAX_80211_CORES 2 -#ifdef CONFIG_BCM947XX -#define core_offset(bcm) (bcm)->current_core_offset -#else -#define core_offset(bcm) 0 -#endif - -/* Generic information about a core. */ -struct bcm43xx_coreinfo { - u8 available:1, - enabled:1, - initialized:1; - /** 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. */ -struct bcm43xx_coreinfo_80211 { +struct bcm43xx_corepriv_80211 { + u8 initialized:1; /* PHY device. */ struct bcm43xx_phyinfo phy; /* Radio device. */ @@ -615,7 +578,7 @@ /* Context information for a noise calculation (Link Quality). */ struct bcm43xx_noise_calculation { - struct bcm43xx_coreinfo *core_at_start; + struct ssb_core *core_at_start; u8 channel_at_start; u8 calculation_running:1; u8 nr_samples; @@ -685,6 +648,8 @@ */ struct bcm43xx_private { + /* Pointer to the Sonics Silicon Backplane. */ + struct ssb *ssb; struct ieee80211_hw *ieee; struct ieee80211_low_level_stats ieee_stats; @@ -735,27 +700,19 @@ struct bcm43xx_led leds[BCM43xx_NR_LEDS]; spinlock_t leds_lock; - /* The currently active core. */ - struct bcm43xx_coreinfo *current_core; -#ifdef CONFIG_BCM947XX - /** current core memory offset */ - u32 current_core_offset; -#endif - struct bcm43xx_coreinfo *active_80211_core; - /* coreinfo structs for all possible cores follow. - * Note that a core might not exist. - * So check the coreinfo flags before using it. + /* Pointers to the available cores. + * If a core is not available, this is NULL. */ - struct bcm43xx_coreinfo core_chipcommon; - struct bcm43xx_coreinfo core_pci; - struct bcm43xx_coreinfo core_80211[ BCM43xx_MAX_80211_CORES ]; + struct ssb_core *core_80211[ BCM43xx_MAX_80211_CORES ]; + struct ssb_core *active_80211_core;//FIXME remove? + struct ssb_core *core_chipcommon; + struct ssb_core *core_pci; + /* Additional information, specific to the 80211 cores. */ - struct bcm43xx_coreinfo_80211 core_80211_ext[ BCM43xx_MAX_80211_CORES ]; + struct bcm43xx_corepriv_80211 corepriv_80211[ BCM43xx_MAX_80211_CORES ]; /* Number of available 80211 cores. */ int nr_80211_available; - u32 chipcommon_capabilities; - /* Reason code of the last interrupt. */ u32 irq_reason; u32 dma_reason[4]; @@ -829,11 +786,11 @@ * any of these functions. */ static inline -struct bcm43xx_coreinfo_80211 * +struct bcm43xx_corepriv_80211 * bcm43xx_current_80211_priv(struct bcm43xx_private *bcm) { - assert(bcm->current_core->id == BCM43xx_COREID_80211); - return bcm->current_core->priv; + assert(bcm->ssb->current_core->cc == SSB_CC_80211); + return bcm->ssb->current_core->priv; } static inline struct bcm43xx_pio * bcm43xx_current_pio(struct bcm43xx_private *bcm) @@ -894,25 +851,25 @@ static inline u16 bcm43xx_read16(struct bcm43xx_private *bcm, u16 offset) { - return ioread16(bcm->mmio_addr + core_offset(bcm) + offset); + return ioread16(bcm->mmio_addr + ssb_core_offset(bcm->ssb) + offset); } static inline void bcm43xx_write16(struct bcm43xx_private *bcm, u16 offset, u16 value) { - iowrite16(value, bcm->mmio_addr + core_offset(bcm) + offset); + iowrite16(value, bcm->mmio_addr + ssb_core_offset(bcm->ssb) + offset); } static inline u32 bcm43xx_read32(struct bcm43xx_private *bcm, u16 offset) { - return ioread32(bcm->mmio_addr + core_offset(bcm) + offset); + return ioread32(bcm->mmio_addr + ssb_core_offset(bcm->ssb) + offset); } static inline void bcm43xx_write32(struct bcm43xx_private *bcm, u16 offset, u32 value) { - iowrite32(value, bcm->mmio_addr + core_offset(bcm) + offset); + iowrite32(value, bcm->mmio_addr + ssb_core_offset(bcm->ssb) + offset); } static inline Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c 2006-08-14 23:20:59.000000000 +0200 @@ -341,7 +341,7 @@ * We try to be atomic here, by restaring the read process, * if any of the high registers changed (overflew). */ - if (bcm->current_core->rev >= 3) { + if (bcm->ssb->current_core->rev >= 3) { u32 low, high, high2; do { @@ -406,7 +406,7 @@ * First zero out the low register, so we have a full * register-overflow duration to complete the operation. */ - if (bcm->current_core->rev >= 3) { + if (bcm->ssb->current_core->rev >= 3) { u32 lo = (tsf & 0x00000000FFFFFFFFULL); u32 hi = (tsf & 0xFFFFFFFF00000000ULL) >> 32; @@ -1079,7 +1079,7 @@ return; index -= 4; - if (bcm->current_core->rev >= 5) { + if (bcm->ssb->current_core->rev >= 5) { bcm43xx_shm_write32(bcm, BCM43xx_SHM_HWMAC, index * 2, @@ -1128,7 +1128,7 @@ unsigned int i,j, nr_keys = 54; u16 offset; - if (bcm->current_core->rev < 5) + if (bcm->ssb->current_core->rev < 5) nr_keys = 16; assert(nr_keys <= ARRAY_SIZE(bcm->key)); @@ -1147,194 +1147,12 @@ dprintk(KERN_INFO PFX "Keys cleared\n"); } -/* Lowlevel core-switch function. This is only to be used in - * bcm43xx_switch_core() and bcm43xx_probe_cores() - */ -static int _switch_core(struct bcm43xx_private *bcm, int core) -{ - int err; - int attempts = 0; - u32 current_core; - - assert(core >= 0); - while (1) { - err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_ACTIVE_CORE, - (core * 0x1000) + 0x18000000); - if (unlikely(err)) - goto error; - err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_ACTIVE_CORE, - ¤t_core); - if (unlikely(err)) - goto error; - current_core = (current_core - 0x18000000) / 0x1000; - if (current_core == core) - break; - - if (unlikely(attempts++ > BCM43xx_SWITCH_CORE_MAX_RETRIES)) - goto error; - udelay(10); - } -#ifdef CONFIG_BCM947XX - if (bcm->pci_dev->bus->number == 0) - bcm->current_core_offset = 0x1000 * core; - else - bcm->current_core_offset = 0; -#endif - - return 0; -error: - printk(KERN_ERR PFX "Failed to switch to core %d\n", core); - return -ENODEV; -} - -int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *new_core) -{ - int err; - - if (unlikely(!new_core)) - return 0; - if (!new_core->available) - return -ENODEV; - if (bcm->current_core == new_core) - return 0; - err = _switch_core(bcm, new_core->index); - if (unlikely(err)) - goto out; - - bcm->current_core = new_core; -out: - return err; -} - -static int bcm43xx_core_enabled(struct bcm43xx_private *bcm) -{ - u32 value; - - value = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - value &= BCM43xx_SBTMSTATELOW_CLOCK | BCM43xx_SBTMSTATELOW_RESET - | BCM43xx_SBTMSTATELOW_REJECT; - - return (value == BCM43xx_SBTMSTATELOW_CLOCK); -} - -/* disable current core */ -static int bcm43xx_core_disable(struct bcm43xx_private *bcm, u32 core_flags) -{ - u32 sbtmstatelow; - u32 sbtmstatehigh; - int i; - - /* fetch sbtmstatelow from core information registers */ - sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - - /* core is already in reset */ - if (sbtmstatelow & BCM43xx_SBTMSTATELOW_RESET) - goto out; - - if (sbtmstatelow & BCM43xx_SBTMSTATELOW_CLOCK) { - sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK | - BCM43xx_SBTMSTATELOW_REJECT; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - - for (i = 0; i < 1000; i++) { - sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - if (sbtmstatelow & BCM43xx_SBTMSTATELOW_REJECT) { - i = -1; - break; - } - udelay(10); - } - if (i != -1) { - printk(KERN_ERR PFX "Error: core_disable() REJECT timeout!\n"); - return -EBUSY; - } - - for (i = 0; i < 1000; i++) { - sbtmstatehigh = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); - if (!(sbtmstatehigh & BCM43xx_SBTMSTATEHIGH_BUSY)) { - i = -1; - break; - } - udelay(10); - } - if (i != -1) { - printk(KERN_ERR PFX "Error: core_disable() BUSY timeout!\n"); - return -EBUSY; - } - - sbtmstatelow = BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK | - BCM43xx_SBTMSTATELOW_REJECT | - BCM43xx_SBTMSTATELOW_RESET | - BCM43xx_SBTMSTATELOW_CLOCK | - core_flags; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - udelay(10); - } - - sbtmstatelow = BCM43xx_SBTMSTATELOW_RESET | - BCM43xx_SBTMSTATELOW_REJECT | - core_flags; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - -out: - bcm->current_core->enabled = 0; - - return 0; -} - -/* enable (reset) current core */ -static int bcm43xx_core_enable(struct bcm43xx_private *bcm, u32 core_flags) -{ - u32 sbtmstatelow; - u32 sbtmstatehigh; - u32 sbimstate; - int err; - - err = bcm43xx_core_disable(bcm, core_flags); - if (err) - goto out; - - sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK | - BCM43xx_SBTMSTATELOW_RESET | - BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK | - core_flags; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - udelay(1); - - sbtmstatehigh = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); - if (sbtmstatehigh & BCM43xx_SBTMSTATEHIGH_SERROR) { - sbtmstatehigh = 0x00000000; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATEHIGH, sbtmstatehigh); - } - - sbimstate = bcm43xx_read32(bcm, BCM43xx_CIR_SBIMSTATE); - if (sbimstate & (BCM43xx_SBIMSTATE_IB_ERROR | BCM43xx_SBIMSTATE_TIMEOUT)) { - sbimstate &= ~(BCM43xx_SBIMSTATE_IB_ERROR | BCM43xx_SBIMSTATE_TIMEOUT); - bcm43xx_write32(bcm, BCM43xx_CIR_SBIMSTATE, sbimstate); - } - - sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK | - BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK | - core_flags; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - udelay(1); - - sbtmstatelow = BCM43xx_SBTMSTATELOW_CLOCK | core_flags; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - udelay(1); - - bcm->current_core->enabled = 1; - assert(err == 0); -out: - return err; -} - /* http://bcm-specs.sipsolutions.net/80211CoreReset */ void bcm43xx_wireless_core_reset(struct bcm43xx_private *bcm, int connect_phy) { u32 flags = 0x00040000; - if ((bcm43xx_core_enabled(bcm)) && + if ((ssb_core_is_enabled(bcm->ssb)) && !bcm43xx_using_pio(bcm)) { //FIXME: Do we _really_ want #ifndef CONFIG_BCM947XX here? #ifndef CONFIG_BCM947XX @@ -1344,7 +1162,7 @@ bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA3_BASE); bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA4_BASE); bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA1_BASE); - if (bcm->current_core->rev < 5) + if (bcm->ssb->current_core->rev < 5) bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA4_BASE); #endif } @@ -1356,7 +1174,7 @@ if (connect_phy) flags |= 0x20000000; bcm43xx_phy_connect(bcm, connect_phy); - bcm43xx_core_enable(bcm, flags); + ssb_core_enable(bcm->ssb, flags); bcm43xx_write16(bcm, 0x03E6, 0x0000); bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) @@ -1368,7 +1186,7 @@ { bcm43xx_radio_turn_off(bcm); bcm43xx_write16(bcm, 0x03E6, 0x00F4); - bcm43xx_core_disable(bcm, 0); + ssb_core_disable(bcm->ssb, 0); } /* Mark the current 80211 core inactive. */ @@ -1431,7 +1249,7 @@ bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x40A, 0x7F7F); bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD, bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS2_BITFIELD) | (1 << 4)); - assert(bcm->noisecalc.core_at_start == bcm->current_core); + assert(bcm->noisecalc.core_at_start == bcm->ssb->current_core); assert(bcm->noisecalc.channel_at_start == bcm43xx_current_radio(bcm)->channel); } @@ -1441,7 +1259,7 @@ if (bcm->noisecalc.calculation_running) return; - bcm->noisecalc.core_at_start = bcm->current_core; + bcm->noisecalc.core_at_start = bcm->ssb->current_core; bcm->noisecalc.channel_at_start = bcm43xx_current_radio(bcm)->channel; bcm->noisecalc.calculation_running = 1; bcm->noisecalc.nr_samples = 0; @@ -1460,7 +1278,7 @@ /* Bottom half of Link Quality calculation. */ assert(bcm->noisecalc.calculation_running); - if (bcm->noisecalc.core_at_start != bcm->current_core || + if (bcm->noisecalc.core_at_start != bcm->ssb->current_core || bcm->noisecalc.channel_at_start != radio->channel) goto drop_calculation; tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x408); @@ -1802,7 +1620,7 @@ static void bcm43xx_set_beacon_int(struct bcm43xx_private *bcm, u16 beacon_int) { bcm43xx_time_lock(bcm); - if (bcm->current_core->rev >= 3) { + if (bcm->ssb->current_core->rev >= 3) { bcm43xx_write32(bcm, 0x188, (beacon_int << 16)); } else { bcm43xx_write16(bcm, 0x606, (beacon_int >> 6)); @@ -1989,7 +1807,7 @@ static void bcm43xx_interrupt_ack(struct bcm43xx_private *bcm, u32 reason) { if (bcm43xx_using_pio(bcm) && - (bcm->current_core->rev < 3) && + (bcm->ssb->current_core->rev < 3) && (!(reason & BCM43xx_IRQ_PIO_WORKAROUND))) { /* Apply a PIO specific workaround to the dma_reasons */ pio_irq_workaround(bcm, BCM43xx_MMIO_PIO1_BASE, 0); @@ -2023,7 +1841,7 @@ spin_lock(&bcm->irq_lock); assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); - assert(bcm->current_core->id == BCM43xx_COREID_80211); + assert(bcm->ssb->current_core->cc == SSB_CC_80211); reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); if (reason == 0xffffffff) { @@ -2076,7 +1894,7 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); - u8 rev = bcm->current_core->rev; + u8 rev = bcm->ssb->current_core->rev; int err = 0; int nr; char buf[22 + sizeof(modparam_fwpostfix) - 1] = { 0 }; @@ -2308,22 +2126,26 @@ */ static int switch_to_gpio_core(struct bcm43xx_private *bcm) { - int err; + int err = -ENODEV; /* Where to find the GPIO register depends on the chipset. * If it has a ChipCommon, its register at offset 0x6c is the GPIO * control register. Otherwise the register at offset 0x6c in the * PCI core is the GPIO control register. */ - err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon); - if (err == -ENODEV) { - err = bcm43xx_switch_core(bcm, &bcm->core_pci); - if (unlikely(err == -ENODEV)) { - printk(KERN_ERR PFX "gpio error: " - "Neither ChipCommon nor PCI core available!\n"); - } + if (bcm->core_chipcommon) { + err = ssb_switch_core(bcm->ssb, bcm->core_chipcommon); + if (err) + goto out; + } else if (bcm->core_pci) { + err = ssb_switch_core(bcm->ssb, bcm->core_pci); + if (err) + goto out; + } else { + printk(KERN_ERR PFX "gpio error: " + "Neither ChipCommon nor PCI core available!\n"); } - +out: return err; } @@ -2332,7 +2154,7 @@ */ static int bcm43xx_gpio_init(struct bcm43xx_private *bcm) { - struct bcm43xx_coreinfo *old_core; + struct ssb_core *old_core; int err; u32 mask, set; @@ -2364,16 +2186,16 @@ mask |= 0x0200; set |= 0x0200; } - if (bcm->current_core->rev >= 2) + if (bcm->ssb->current_core->rev >= 2) mask |= 0x0010; /* FIXME: This is redundant. */ - old_core = bcm->current_core; + old_core = bcm->ssb->current_core; err = switch_to_gpio_core(bcm); if (err) goto out; bcm43xx_write32(bcm, BCM43xx_GPIO_CONTROL, (bcm43xx_read32(bcm, BCM43xx_GPIO_CONTROL) & mask) | set); - err = bcm43xx_switch_core(bcm, old_core); + err = ssb_switch_core(bcm->ssb, old_core); out: return err; } @@ -2381,15 +2203,15 @@ /* Turn off all GPIO stuff. Call this on module unload, for example. */ static int bcm43xx_gpio_cleanup(struct bcm43xx_private *bcm) { - struct bcm43xx_coreinfo *old_core; + struct ssb_core *old_core; int err; - old_core = bcm->current_core; + old_core = bcm->ssb->current_core; err = switch_to_gpio_core(bcm); if (err) return err; bcm43xx_write32(bcm, BCM43xx_GPIO_CONTROL, 0x00000000); - err = bcm43xx_switch_core(bcm, old_core); + err = ssb_switch_core(bcm->ssb, old_core); assert(err == 0); return 0; @@ -2601,7 +2423,7 @@ bcm43xx_write16(bcm, 0x005E, value16); } bcm43xx_write32(bcm, 0x0100, 0x01000000); - if (bcm->current_core->rev < 5) + if (bcm->ssb->current_core->rev < 5) bcm43xx_write32(bcm, 0x010C, 0x01000000); value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); @@ -2630,7 +2452,7 @@ /* Initially set the wireless operation mode. */ bcm43xx_select_opmode(bcm); - if (bcm->current_core->rev < 3) { + if (bcm->ssb->current_core->rev < 3) { bcm43xx_write16(bcm, 0x060E, 0x0000); bcm43xx_write16(bcm, 0x0610, 0x8000); bcm43xx_write16(bcm, 0x0604, 0x0000); @@ -2671,7 +2493,7 @@ bcm43xx_pio_free(bcm); bcm43xx_dma_free(bcm); - bcm->current_core->initialized = 0; + bcm43xx_current_80211_priv(bcm)->initialized = 0; } /* http://bcm-specs.sipsolutions.net/80211Init */ @@ -2703,7 +2525,7 @@ if (err) goto out; - bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0016, bcm->current_core->rev); + bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0016, bcm->ssb->current_core->rev); ucodeflags = bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, BCM43xx_UCODEFLAGS_OFFSET); if (0 /*FIXME: which condition has to be used here? */) @@ -2754,7 +2576,7 @@ bcm43xx_write_mac_bssid_templates(bcm); - if (bcm->current_core->rev >= 5) + if (bcm->ssb->current_core->rev >= 5) bcm43xx_write16(bcm, 0x043C, 0x000C); if (active_wlcore) { @@ -2777,7 +2599,7 @@ /* Don't enable MAC/IRQ here, as it will race with the IRQ handler. * We enable it later. */ - bcm->current_core->initialized = 1; + bcm43xx_current_80211_priv(bcm)->initialized = 1; out: return err; @@ -2949,15 +2771,16 @@ { int ret = 0; int i, err; - struct bcm43xx_coreinfo *core; + struct ssb_core *core; + struct bcm43xx_corepriv_80211 *wlpriv; bcm43xx_set_status(bcm, BCM43xx_STAT_SHUTTINGDOWN); for (i = 0; i < bcm->nr_80211_available; i++) { - core = &(bcm->core_80211[i]); - assert(core->available); - if (!core->initialized) + core = bcm->core_80211[i]; + wlpriv = core->priv; + if (!wlpriv->initialized) continue; - err = bcm43xx_switch_core(bcm, core); + err = ssb_switch_core(bcm->ssb, core); if (err) { dprintk(KERN_ERR PFX "shutdown_all_wireless_cores " "switch_core failed (%d)\n", err); @@ -3041,162 +2864,74 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) { - int err, i; - int current_core; - u32 core_vendor, core_id, core_rev; - u32 sb_id_hi, chip_id_32 = 0; - u16 pci_device, chip_id_16; - u8 core_count; - - memset(&bcm->core_chipcommon, 0, sizeof(struct bcm43xx_coreinfo)); - memset(&bcm->core_pci, 0, sizeof(struct bcm43xx_coreinfo)); - memset(&bcm->core_80211, 0, sizeof(struct bcm43xx_coreinfo) - * BCM43xx_MAX_80211_CORES); - memset(&bcm->core_80211_ext, 0, sizeof(struct bcm43xx_coreinfo_80211) - * BCM43xx_MAX_80211_CORES); - bcm->nr_80211_available = 0; - bcm->current_core = NULL; - bcm->active_80211_core = NULL; - - /* map core 0 */ - err = _switch_core(bcm, 0); - if (err) - goto out; + struct ssb *ssb = bcm->ssb; + int err; + u16 chipid_fallback = 0; + struct ssb_core *core; + struct bcm43xx_corepriv_80211 *priv_80211; + int i; - /* fetch sb_id_hi from core information registers */ - sb_id_hi = bcm43xx_read32(bcm, BCM43xx_CIR_SB_ID_HI); + static const struct ssb_nrcores_elem nrcores_fallback[] = { + { .chip_id_key = 0x5365, .nr_cores_value = 7, }, + { .chip_id_key = 0x4306, .nr_cores_value = 6, }, + { .chip_id_key = 0x4310, .nr_cores_value = 8, }, + { .chip_id_key = 0x4307, .nr_cores_value = 5, }, + { .chip_id_key = 0x4301, .nr_cores_value = 5, }, + { .chip_id_key = 0x4402, .nr_cores_value = 3, }, + { .chip_id_key = 0x4710, .nr_cores_value = 9, }, + { .chip_id_key = 0x4610, .nr_cores_value = 9, }, + { .chip_id_key = 0x4704, .nr_cores_value = 9, }, + }; - core_id = (sb_id_hi & 0xFFF0) >> 4; - core_rev = (sb_id_hi & 0xF); - core_vendor = (sb_id_hi & 0xFFFF0000) >> 16; - - /* if present, chipcommon is always core 0; read the chipid from it */ - if (core_id == BCM43xx_COREID_CHIPCOMMON) { - chip_id_32 = bcm43xx_read32(bcm, 0); - chip_id_16 = chip_id_32 & 0xFFFF; - bcm->core_chipcommon.available = 1; - bcm->core_chipcommon.id = core_id; - bcm->core_chipcommon.rev = core_rev; - bcm->core_chipcommon.index = 0; - /* While we are at it, also read the capabilities. */ - bcm->chipcommon_capabilities = bcm43xx_read32(bcm, BCM43xx_CHIPCOMMON_CAPABILITIES); - } else { - /* without a chipCommon, use a hard coded table. */ - pci_device = bcm->pci_dev->device; - if (pci_device == 0x4301) - chip_id_16 = 0x4301; - else if ((pci_device >= 0x4305) && (pci_device <= 0x4307)) - chip_id_16 = 0x4307; - else if ((pci_device >= 0x4402) && (pci_device <= 0x4403)) - chip_id_16 = 0x4402; - else if ((pci_device >= 0x4610) && (pci_device <= 0x4615)) - chip_id_16 = 0x4610; - else if ((pci_device >= 0x4710) && (pci_device <= 0x4715)) - chip_id_16 = 0x4710; + switch (bcm->pci_dev->device) { + case 0x4301: + chipid_fallback = 0x4301; + break; + case 0x4305 ... 0x4307: + chipid_fallback = 0x4307; + break; + case 0x4402 ... 0x4403: + chipid_fallback = 0x4402; + break; + case 0x4610 ... 0x4615: + chipid_fallback = 0x4610; + break; + case 0x4710 ... 0x4715: + chipid_fallback = 0x4710; + break; #ifdef CONFIG_BCM947XX - else if ((pci_device >= 0x4320) && (pci_device <= 0x4325)) - chip_id_16 = 0x4309; + case 0x4320 ... 0x4325: + chipid_fallback = 0x4309; + break; #endif - else { - printk(KERN_ERR PFX "Could not determine Chip ID\n"); - return -ENODEV; - } - } - - /* ChipCommon with Core Rev >=4 encodes number of cores, - * otherwise consult hardcoded table */ - if ((core_id == BCM43xx_COREID_CHIPCOMMON) && (core_rev >= 4)) { - core_count = (chip_id_32 & 0x0F000000) >> 24; - } else { - switch (chip_id_16) { - case 0x4610: - case 0x4704: - case 0x4710: - core_count = 9; - break; - case 0x4310: - core_count = 8; - break; - case 0x5365: - core_count = 7; - break; - case 0x4306: - core_count = 6; - break; - case 0x4301: - case 0x4307: - core_count = 5; - break; - case 0x4402: - core_count = 3; - break; - default: - /* SOL if we get here */ - assert(0); - core_count = 1; - } - } - - bcm->chip_id = chip_id_16; - bcm->chip_rev = (chip_id_32 & 0x000F0000) >> 16; - bcm->chip_package = (chip_id_32 & 0x00F00000) >> 20; - - dprintk(KERN_INFO PFX "Chip ID 0x%x, rev 0x%x\n", - bcm->chip_id, bcm->chip_rev); - dprintk(KERN_INFO PFX "Number of cores: %d\n", core_count); - if (bcm->core_chipcommon.available) { - dprintk(KERN_INFO PFX "Core 0: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n", - core_id, core_rev, core_vendor, - bcm43xx_core_enabled(bcm) ? "enabled" : "disabled"); } + err = ssb_probe_cores(ssb, chipid_fallback, + nrcores_fallback, + ARRAY_SIZE(nrcores_fallback)); + if (err) + goto out; - if (bcm->core_chipcommon.available) - current_core = 1; - else - current_core = 0; - for ( ; current_core < core_count; current_core++) { - struct bcm43xx_coreinfo *core; - struct bcm43xx_coreinfo_80211 *ext_80211; + bcm->nr_80211_available = 0; + bcm->active_80211_core = NULL; + for (i = 0; i < ssb->nr_cores; i++) { + core = &(ssb->cores[i]); - err = _switch_core(bcm, current_core); - if (err) - goto out; - /* Gather information */ - /* fetch sb_id_hi from core information registers */ - sb_id_hi = bcm43xx_read32(bcm, BCM43xx_CIR_SB_ID_HI); - - /* extract core_id, core_rev, core_vendor */ - core_id = (sb_id_hi & 0xFFF0) >> 4; - core_rev = (sb_id_hi & 0xF); - core_vendor = (sb_id_hi & 0xFFFF0000) >> 16; - - dprintk(KERN_INFO PFX "Core %d: ID 0x%x, rev 0x%x, vendor 0x%x, %s\n", - current_core, core_id, core_rev, core_vendor, - bcm43xx_core_enabled(bcm) ? "enabled" : "disabled" ); - - core = NULL; - switch (core_id) { - case BCM43xx_COREID_PCI: - core = &bcm->core_pci; - if (core->available) { + switch (core->cc) { + case SSB_CC_PCI: + if (bcm->core_pci) { printk(KERN_WARNING PFX "Multiple PCI cores found.\n"); - continue; + break; } + bcm->core_pci = core; break; - case BCM43xx_COREID_80211: - for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { - core = &(bcm->core_80211[i]); - ext_80211 = &(bcm->core_80211_ext[i]); - if (!core->available) - break; - core = NULL; - } - if (!core) { - printk(KERN_WARNING PFX "More than %d cores of type 802.11 found.\n", + case SSB_CC_80211: + if (bcm->nr_80211_available == BCM43xx_MAX_80211_CORES) { + printk(KERN_WARNING PFX "More tham %d cores of " + "type 802.11 found.\n", BCM43xx_MAX_80211_CORES); - continue; + break; } - if (i != 0) { + if (bcm->nr_80211_available == 1) { /* More than one 80211 core is only supported * by special chips. * There are chips with two 80211 cores, but with @@ -3205,49 +2940,46 @@ */ if (bcm->pci_dev->device != 0x4324) { dprintk(KERN_INFO PFX "Ignoring additional 802.11 core.\n"); - continue; + break; } } - switch (core_rev) { - case 2: - case 4: - case 5: - case 6: - case 7: - case 9: + + bcm->core_80211[bcm->nr_80211_available] = core; + priv_80211 = &(bcm->corepriv_80211[bcm->nr_80211_available]); + bcm->nr_80211_available++; + + switch (core->rev) { + case 2: case 4: case 5: case 6: + case 7: case 9: break; default: printk(KERN_ERR PFX "Error: Unsupported 80211 core revision %u\n", - core_rev); + core->rev); err = -ENODEV; goto out; } - bcm->nr_80211_available++; - core->priv = ext_80211; - bcm43xx_init_struct_phyinfo(&ext_80211->phy); - bcm43xx_init_struct_radioinfo(&ext_80211->radio); + core->priv = priv_80211; + bcm43xx_init_struct_phyinfo(&priv_80211->phy); + bcm43xx_init_struct_radioinfo(&priv_80211->radio); break; - case BCM43xx_COREID_CHIPCOMMON: - printk(KERN_WARNING PFX "Multiple CHIPCOMMON cores found.\n"); + case SSB_CC_CHIPCOMMON: + if (bcm->core_chipcommon) { + printk(KERN_WARNING PFX "Multiple CHIPCOMMON cores found.\n"); + break; + } + bcm->core_chipcommon = core; break; } - if (core) { - core->available = 1; - core->id = core_id; - core->rev = core_rev; - core->index = current_core; - } } - - if (!bcm->core_80211[0].available) { + if (!bcm->core_80211[0]) { printk(KERN_ERR PFX "Error: No 80211 core found!\n"); err = -ENODEV; goto out; } + err = ssb_switch_core(ssb, bcm->core_80211[0]); + if (err) + goto out; - err = bcm43xx_switch_core(bcm, &bcm->core_80211[0]); - - assert(err == 0); out: return err; } @@ -3273,90 +3005,6 @@ bcm43xx_pctl_set_crystal(bcm, 0); } -static void bcm43xx_pcicore_broadcast_value(struct bcm43xx_private *bcm, - u32 address, - u32 data) -{ - bcm43xx_write32(bcm, BCM43xx_PCICORE_BCAST_ADDR, address); - bcm43xx_write32(bcm, BCM43xx_PCICORE_BCAST_DATA, data); -} - -static int bcm43xx_pcicore_commit_settings(struct bcm43xx_private *bcm) -{ - int err; - struct bcm43xx_coreinfo *old_core; - - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, &bcm->core_pci); - if (err) - goto out; - - bcm43xx_pcicore_broadcast_value(bcm, 0xfd8, 0x00000000); - - bcm43xx_switch_core(bcm, old_core); - assert(err == 0); -out: - return err; -} - -/* Make an I/O Core usable. "core_mask" is the bitmask of the cores to enable. - * To enable core 0, pass a core_mask of 1<<0 - */ -static int bcm43xx_setup_backplane_pci_connection(struct bcm43xx_private *bcm, - u32 core_mask) -{ - u32 backplane_flag_nr; - u32 value; - struct bcm43xx_coreinfo *old_core; - int err = 0; - - value = bcm43xx_read32(bcm, BCM43xx_CIR_SBTPSFLAG); - backplane_flag_nr = value & BCM43xx_BACKPLANE_FLAG_NR_MASK; - - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, &bcm->core_pci); - if (err) - goto out; - - if (bcm->core_pci.rev < 6) { - value = bcm43xx_read32(bcm, BCM43xx_CIR_SBINTVEC); - value |= (1 << backplane_flag_nr); - bcm43xx_write32(bcm, BCM43xx_CIR_SBINTVEC, value); - } else { - err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_ICR, &value); - if (err) { - printk(KERN_ERR PFX "Error: ICR setup failure!\n"); - goto out_switch_back; - } - value |= core_mask << 8; - err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_ICR, value); - if (err) { - printk(KERN_ERR PFX "Error: ICR setup failure!\n"); - goto out_switch_back; - } - } - - value = bcm43xx_read32(bcm, BCM43xx_PCICORE_SBTOPCI2); - value |= BCM43xx_SBTOPCI2_PREFETCH | BCM43xx_SBTOPCI2_BURST; - bcm43xx_write32(bcm, BCM43xx_PCICORE_SBTOPCI2, value); - - if (bcm->core_pci.rev < 5) { - value = bcm43xx_read32(bcm, BCM43xx_CIR_SBIMCONFIGLOW); - value |= (2 << BCM43xx_SBIMCONFIGLOW_SERVICE_TOUT_SHIFT) - & BCM43xx_SBIMCONFIGLOW_SERVICE_TOUT_MASK; - value |= (3 << BCM43xx_SBIMCONFIGLOW_REQUEST_TOUT_SHIFT) - & BCM43xx_SBIMCONFIGLOW_REQUEST_TOUT_MASK; - bcm43xx_write32(bcm, BCM43xx_CIR_SBIMCONFIGLOW, value); - err = bcm43xx_pcicore_commit_settings(bcm); - assert(err == 0); - } - -out_switch_back: - err = bcm43xx_switch_core(bcm, old_core); -out: - return err; -} - static void bcm43xx_free_modes(struct bcm43xx_private *bcm) { struct ieee80211_hw *ieee = bcm->ieee; @@ -3418,8 +3066,8 @@ { int err = -ENOMEM; struct ieee80211_hw *ieee = bcm->ieee; - struct bcm43xx_coreinfo *core; - struct bcm43xx_coreinfo_80211 *wlext; + struct ssb_core *core; + struct bcm43xx_corepriv_80211 *wlpriv; int i, nr_modes; nr_modes = bcm->nr_80211_available; @@ -3430,10 +3078,10 @@ ieee->num_modes = 0; for (i = 0; i < bcm->nr_80211_available; i++) { - core = &(bcm->core_80211[i]); - wlext = core->priv; + core = bcm->core_80211[i]; + wlpriv = core->priv; - switch (wlext->phy.type) { + switch (wlpriv->phy.type) { case BCM43xx_PHYTYPE_A: err = bcm43xx_append_mode(bcm->ieee, MODE_IEEE80211A, ARRAY_SIZE(bcm43xx_a_chantable), @@ -3527,8 +3175,8 @@ static void prepare_priv_for_init(struct bcm43xx_private *bcm) { int i; - struct bcm43xx_coreinfo *core; - struct bcm43xx_coreinfo_80211 *wlext; + struct ssb_core *core; + struct bcm43xx_corepriv_80211 *wlpriv; assert(!bcm->active_80211_core); @@ -3542,16 +3190,13 @@ memset(&bcm->stats, 0, sizeof(bcm->stats)); /* Wireless core data */ - for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { - core = &(bcm->core_80211[i]); - wlext = core->priv; - - if (!core->available) - continue; - assert(wlext == &(bcm->core_80211_ext[i])); + for (i = 0; i < bcm->nr_80211_available; i++) { + core = bcm->core_80211[i]; + wlpriv = core->priv; + assert(wlpriv == &(bcm->corepriv_80211[i])); - prepare_phydata_for_init(&wlext->phy); - prepare_radiodata_for_init(bcm, &wlext->radio); + prepare_phydata_for_init(&wlpriv->phy); + prepare_radiodata_for_init(bcm, &wlpriv->radio); } /* IRQ related flags */ @@ -3573,7 +3218,7 @@ { int err; - if (!bcm43xx_core_enabled(bcm)) + if (!ssb_core_is_enabled(bcm->ssb)) bcm43xx_wireless_core_reset(bcm, 1); if (!active_wlcore) bcm43xx_wireless_core_mark_inactive(bcm); @@ -3594,27 +3239,27 @@ int phytype) { int i, err; - struct bcm43xx_coreinfo *active_core = NULL; - struct bcm43xx_coreinfo_80211 *active_wlext = NULL; - struct bcm43xx_coreinfo *core; - struct bcm43xx_coreinfo_80211 *wlext; + struct ssb_core *active_core = NULL; + struct bcm43xx_corepriv_80211 *active_wlpriv = NULL; + struct ssb_core *core; + struct bcm43xx_corepriv_80211 *wlpriv; int adjust_active_sbtmstatelow = 0; might_sleep(); if (phytype < 0) { /* If no phytype is requested, select the first core. */ - assert(bcm->core_80211[0].available); - wlext = bcm->core_80211[0].priv; - phytype = wlext->phy.type; + assert(bcm->nr_80211_available != 0); + wlpriv = bcm->core_80211[0]->priv; + phytype = wlpriv->phy.type; } /* Find the requested core. */ for (i = 0; i < bcm->nr_80211_available; i++) { - core = &(bcm->core_80211[i]); - wlext = core->priv; - if (wlext->phy.type == phytype) { + core = bcm->core_80211[i]; + wlpriv = core->priv; + if (wlpriv->phy.type == phytype) { active_core = core; - active_wlext = wlext; + active_wlpriv = wlpriv; break; } } @@ -3651,12 +3296,12 @@ /* Mark all unused cores "inactive". */ for (i = 0; i < bcm->nr_80211_available; i++) { - core = &(bcm->core_80211[i]); - wlext = core->priv; + core = bcm->core_80211[i]; + wlpriv = core->priv; if (core == active_core) continue; - err = bcm43xx_switch_core(bcm, core); + err = ssb_switch_core(bcm->ssb, core); if (err) { dprintk(KERN_ERR PFX "Could not switch to inactive " "802.11 core (%d)\n", err); @@ -3672,14 +3317,14 @@ } /* Now initialize the active 802.11 core. */ - err = bcm43xx_switch_core(bcm, active_core); + err = ssb_switch_core(bcm->ssb, active_core); if (err) { dprintk(KERN_ERR PFX "Could not switch to active " "802.11 core (%d)\n", err); goto error; } if (adjust_active_sbtmstatelow && - active_wlext->phy.type == BCM43xx_PHYTYPE_G) { + active_wlpriv->phy.type == BCM43xx_PHYTYPE_G) { u32 sbtmstatelow; sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); @@ -3716,7 +3361,7 @@ bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate); dprintk(KERN_INFO PFX "Selected 802.11 core (phytype %d)\n", - active_wlext->phy.type); + active_wlpriv->phy.type); return 0; @@ -3766,6 +3411,7 @@ int i; bcm43xx_chipset_detach(bcm); + ssb_free(bcm->ssb); /* Do _not_ access the chip, after it is detached. */ pci_iounmap(pci_dev, bcm->mmio_addr); pci_release_regions(pci_dev); @@ -3773,9 +3419,9 @@ /* Free allocated structures/fields */ for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { - kfree(bcm->core_80211_ext[i].phy._lo_pairs); - if (bcm->core_80211_ext[i].phy.dyn_tssi_tbl) - kfree(bcm->core_80211_ext[i].phy.tssi2dbm); + kfree(bcm->corepriv_80211[i].phy._lo_pairs); + if (bcm->corepriv_80211[i].phy.dyn_tssi_tbl) + kfree(bcm->corepriv_80211[i].phy.tssi2dbm); } bcm43xx_free_modes(bcm); } @@ -3843,6 +3489,7 @@ int err; int i; u32 coremask; + struct ssb *ssb; err = pci_enable_device(pci_dev); if (err) { @@ -3864,6 +3511,11 @@ } net_dev->base_addr = (unsigned long)bcm->mmio_addr; + ssb = ssb_alloc(pci_dev, bcm->mmio_addr); + if (!ssb) + goto err_iounmap; + bcm->ssb = ssb; + bcm43xx_pci_read_config16(bcm, PCI_SUBSYSTEM_VENDOR_ID, &bcm->board_vendor); bcm43xx_pci_read_config16(bcm, PCI_SUBSYSTEM_ID, @@ -3873,7 +3525,7 @@ err = bcm43xx_chipset_attach(bcm); if (err) - goto err_iounmap; + goto err_free_ssb; err = bcm43xx_pctl_init(bcm); if (err) goto err_chipset_detach; @@ -3884,9 +3536,9 @@ /* Attach all IO cores to the backplane. */ coremask = 0; for (i = 0; i < bcm->nr_80211_available; i++) - coremask |= (1 << bcm->core_80211[i].index); + coremask |= (1 << bcm->core_80211[i]->index); //FIXME: Also attach some non80211 cores? - err = bcm43xx_setup_backplane_pci_connection(bcm, coremask); + err = ssb_cores_connect(bcm->ssb, coremask); if (err) { printk(KERN_ERR PFX "Backplane->PCI connection failed!\n"); goto err_chipset_detach; @@ -3900,7 +3552,7 @@ goto err_chipset_detach; for (i = 0; i < bcm->nr_80211_available; i++) { - err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); + err = ssb_switch_core(bcm->ssb, bcm->core_80211[i]); assert(err != -ENODEV); if (err) goto err_80211_unwind; @@ -3946,12 +3598,14 @@ err_80211_unwind: for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { - kfree(bcm->core_80211_ext[i].phy._lo_pairs); - if (bcm->core_80211_ext[i].phy.dyn_tssi_tbl) - kfree(bcm->core_80211_ext[i].phy.tssi2dbm); + kfree(bcm->corepriv_80211[i].phy._lo_pairs); + if (bcm->corepriv_80211[i].phy.dyn_tssi_tbl) + kfree(bcm->corepriv_80211[i].phy.tssi2dbm); } err_chipset_detach: bcm43xx_chipset_detach(bcm); +err_free_ssb: + ssb_free(ssb); err_iounmap: pci_iounmap(pci_dev, bcm->mmio_addr); err_pci_release: Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_debugfs.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_debugfs.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_debugfs.c 2006-08-14 23:19:39.000000000 +0200 @@ -95,21 +95,21 @@ fappend("IRQ: %d\n", bcm->irq); fappend("mmio_addr: 0x%p\n", bcm->mmio_addr); fappend("chip_id: 0x%04x chip_rev: 0x%02x\n", bcm->chip_id, bcm->chip_rev); - if ((bcm->core_80211[0].rev >= 3) && (bcm43xx_read32(bcm, 0x0158) & (1 << 16))) + if ((bcm->core_80211[0]->rev >= 3) && (bcm43xx_read32(bcm, 0x0158) & (1 << 16))) fappend("Radio disabled by hardware!\n"); - if ((bcm->core_80211[0].rev < 3) && !(bcm43xx_read16(bcm, 0x049A) & (1 << 4))) + if ((bcm->core_80211[0]->rev < 3) && !(bcm43xx_read16(bcm, 0x049A) & (1 << 4))) fappend("Radio disabled by hardware!\n"); fappend("board_vendor: 0x%04x board_type: 0x%04x\n", bcm->board_vendor, bcm->board_type); fappend("\nCores:\n"); -#define fappend_core(name, info) fappend("core \"" name "\" %s, %s, id: 0x%04x, " \ +#define fappend_core(name, info) fappend("core \"" name "\" %s, id: 0x%04x, " \ "rev: 0x%02x, index: 0x%02x\n", \ - (info).available \ + (info) \ ? "available" : "nonavailable", \ - (info).enabled \ - ? "enabled" : "disabled", \ - (info).id, (info).rev, (info).index) + (info) ? (info)->cc : 0, \ + (info) ? (info)->rev : 0, \ + (info) ? (info)->index : 0) fappend_core("CHIPCOMMON", bcm->core_chipcommon); fappend_core("PCI", bcm->core_pci); fappend_core("first 80211", bcm->core_80211[0]); Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c 2006-08-14 23:19:39.000000000 +0200 @@ -569,7 +569,7 @@ goto err_destroy_tx3; dma->rx_ring0 = ring; - if (bcm->current_core->rev < 5) { + if (bcm->ssb->current_core->rev < 5) { ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA4_BASE, BCM43xx_RXRING_SLOTS, 0); if (!ring) Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.h =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.h 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.h 2006-08-14 23:19:39.000000000 +0200 @@ -128,8 +128,6 @@ void bcm43xx_dummy_transmission(struct bcm43xx_private *bcm); -int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *new_core); - int bcm43xx_select_wireless_core(struct bcm43xx_private *bcm, int phytype); Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_phy.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_phy.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_phy.c 2006-08-14 23:19:39.000000000 +0200 @@ -90,7 +90,7 @@ phy->is_locked = 0; return; } - if (bcm->current_core->rev < 3) { + if (bcm->ssb->current_core->rev < 3) { bcm43xx_mac_suspend(bcm); spin_lock(&phy->lock); } else { @@ -105,7 +105,7 @@ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); assert(irqs_disabled()); - if (bcm->current_core->rev < 3) { + if (bcm->ssb->current_core->rev < 3) { if (phy->is_locked) { spin_unlock(&phy->lock); bcm43xx_mac_enable(bcm); @@ -161,7 +161,7 @@ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); u32 flags; - if (bcm->current_core->rev < 5) + if (bcm->ssb->current_core->rev < 5) goto out; flags = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); @@ -2329,7 +2329,7 @@ } break; case BCM43xx_PHYTYPE_B: - if (bcm->current_core->rev == 2) + if (bcm->ssb->current_core->rev == 2) value = (3/*automatic*/ << 7); else value = (antennadiv << 7); Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c 2006-08-14 23:19:39.000000000 +0200 @@ -316,7 +316,7 @@ queue->bcm = bcm; queue->mmio_base = pio_mmio_base; - queue->need_workarounds = (bcm->current_core->rev < 3); + queue->need_workarounds = (bcm->ssb->current_core->rev < 3); INIT_LIST_HEAD(&queue->txfree); INIT_LIST_HEAD(&queue->txqueue); @@ -420,7 +420,7 @@ goto err_destroy2; pio->queue3 = queue; - if (bcm->current_core->rev < 3) + if (bcm->ssb->current_core->rev < 3) bcm->irq_savedstate |= BCM43xx_IRQ_PIO_WORKAROUND; dprintk(KERN_INFO PFX "PIO initialized\n"); Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_power.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_power.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_power.c 2006-08-14 23:19:39.000000000 +0200 @@ -41,8 +41,8 @@ u32 tmp; int err; - assert(bcm->current_core == &bcm->core_chipcommon); - if (bcm->current_core->rev < 6) { + assert(bcm->ssb->current_core == bcm->core_chipcommon); + if (bcm->ssb->current_core->rev < 6) { if (bcm->bustype == BCM43xx_BUSTYPE_PCMCIA || bcm->bustype == BCM43xx_BUSTYPE_SB) return BCM43xx_PCTL_CLKSRC_XTALOS; @@ -54,7 +54,7 @@ return BCM43xx_PCTL_CLKSRC_XTALOS; } } - if (bcm->current_core->rev < 10) { + if (bcm->ssb->current_core->rev < 10) { tmp = bcm43xx_read32(bcm, BCM43xx_CHIPCOMMON_SLOWCLKCTL); tmp &= 0x7; if (tmp == 0) @@ -79,11 +79,11 @@ int divisor; u32 tmp; - assert(bcm->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL); - assert(bcm->current_core == &bcm->core_chipcommon); + assert(bcm->ssb->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL); + assert(bcm->ssb->current_core == bcm->core_chipcommon); clocksrc = bcm43xx_pctl_get_slowclksrc(bcm); - if (bcm->current_core->rev < 6) { + if (bcm->ssb->current_core->rev < 6) { switch (clocksrc) { case BCM43xx_PCTL_CLKSRC_PCI: divisor = 64; @@ -95,7 +95,7 @@ assert(0); divisor = 1; } - } else if (bcm->current_core->rev < 10) { + } else if (bcm->ssb->current_core->rev < 10) { switch (clocksrc) { case BCM43xx_PCTL_CLKSRC_LOPWROS: divisor = 1; @@ -151,14 +151,15 @@ int bcm43xx_pctl_init(struct bcm43xx_private *bcm) { int err, maxfreq; - struct bcm43xx_coreinfo *old_core; + struct ssb_core *old_core; - if (!(bcm->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL)) + if (!(bcm->ssb->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL)) return 0; - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon); - if (err == -ENODEV) + if (!bcm->core_chipcommon) return 0; + + old_core = bcm->ssb->current_core; + err = ssb_switch_core(bcm->ssb, bcm->core_chipcommon); if (err) goto out; @@ -168,7 +169,7 @@ bcm43xx_write32(bcm, BCM43xx_CHIPCOMMON_FREFSELDELAY, (maxfreq * 15 + 999999) / 1000000); - err = bcm43xx_switch_core(bcm, old_core); + err = ssb_switch_core(bcm->ssb, old_core); assert(err == 0); out: @@ -180,23 +181,26 @@ u16 delay = 0; int err; u32 pll_on_delay; - struct bcm43xx_coreinfo *old_core; + struct ssb_core *old_core; int minfreq; if (bcm->bustype != BCM43xx_BUSTYPE_PCI) goto out; - if (!(bcm->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL)) + if (!(bcm->ssb->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL)) goto out; - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon); - if (err == -ENODEV) + if (!bcm->core_chipcommon) + goto out; + + old_core = bcm->ssb->current_core; + err = ssb_switch_core(bcm->ssb, bcm->core_chipcommon); + if (err) goto out; minfreq = bcm43xx_pctl_clockfreqlimit(bcm, 0); pll_on_delay = bcm43xx_read32(bcm, BCM43xx_CHIPCOMMON_PLLONDELAY); delay = (((pll_on_delay + 2) * 1000000) + (minfreq - 1)) / minfreq; - err = bcm43xx_switch_core(bcm, old_core); + err = ssb_switch_core(bcm->ssb, old_core); assert(err == 0); out: @@ -209,25 +213,26 @@ int bcm43xx_pctl_set_clock(struct bcm43xx_private *bcm, u16 mode) { int err; - struct bcm43xx_coreinfo *old_core; + struct ssb_core *old_core; u32 tmp; - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon); - if (err == -ENODEV) + if (!bcm->core_chipcommon) return 0; + + old_core = bcm->ssb->current_core; + err = ssb_switch_core(bcm->ssb, bcm->core_chipcommon); if (err) goto out; - if (bcm->core_chipcommon.rev < 6) { + if (bcm->core_chipcommon->rev < 6) { if (mode == BCM43xx_PCTL_CLK_FAST) { err = bcm43xx_pctl_set_crystal(bcm, 1); if (err) goto out; } } else { - if ((bcm->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL) && - (bcm->core_chipcommon.rev < 10)) { + if ((bcm->ssb->chipcommon_capabilities & BCM43xx_CAPABILITIES_PCTL) && + (bcm->core_chipcommon->rev < 10)) { switch (mode) { case BCM43xx_PCTL_CLK_FAST: tmp = bcm43xx_read32(bcm, BCM43xx_CHIPCOMMON_SLOWCLKCTL); @@ -249,7 +254,7 @@ } } - err = bcm43xx_switch_core(bcm, old_core); + err = ssb_switch_core(bcm->ssb, old_core); assert(err == 0); out: @@ -293,7 +298,7 @@ goto err_pci; udelay(5000); } else { - if (bcm->current_core->rev < 5) + if (bcm->ssb->current_core->rev < 5) return 0; if (bcm->sprom.boardflags & BCM43xx_BFL_XTAL_NOSLOW) return 0; @@ -302,9 +307,9 @@ * err = bcm43xx_switch_core(bcm, bcm->active_80211_core); * if (err) * return err; - * if (((bcm->current_core->rev >= 3) && + * if (((bcm->ssb->current_core->rev >= 3) && * (bcm43xx_read32(bcm, BCM43xx_MMIO_RADIO_HWENABLED_HI) & (1 << 16))) || - * ((bcm->current_core->rev < 3) && + * ((bcm->ssb->current_core->rev < 3) && * !(bcm43xx_read16(bcm, BCM43xx_MMIO_RADIO_HWENABLED_LO) & (1 << 4)))) * return 0; * err = bcm43xx_switch_core(bcm, &bcm->core_chipcommon); @@ -369,7 +374,7 @@ else status &= ~BCM43xx_SBF_PS2; bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, status); - if (bit26 && bcm->current_core->rev >= 5) { + if (bit26 && bcm->ssb->current_core->rev >= 5) { for (i = 0; i < 100; i++) { if (bcm43xx_shm_read32(bcm, BCM43xx_SHM_SHARED, 0x0040) != 4) break; Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_radio.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_radio.c 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/bcm43xx_radio.c 2006-08-14 23:19:39.000000000 +0200 @@ -1997,7 +1997,7 @@ bcm43xx_phy_write(bcm, 0x0010, bcm43xx_phy_read(bcm, 0x0010) | 0x0008); bcm43xx_phy_write(bcm, 0x0011, bcm43xx_phy_read(bcm, 0x0011) | 0x0008); } - if (phy->type == BCM43xx_PHYTYPE_G && bcm->current_core->rev >= 5) { + if (phy->type == BCM43xx_PHYTYPE_G && bcm->ssb->current_core->rev >= 5) { bcm43xx_phy_write(bcm, 0x0811, bcm43xx_phy_read(bcm, 0x0811) | 0x008C); bcm43xx_phy_write(bcm, 0x0812, bcm43xx_phy_read(bcm, 0x0812) & 0xFF73); } else Index: wireless-dev/drivers/net/wireless/d80211/bcm43xx/Kconfig =================================================================== --- wireless-dev.orig/drivers/net/wireless/d80211/bcm43xx/Kconfig 2006-08-14 22:05:06.000000000 +0200 +++ wireless-dev/drivers/net/wireless/d80211/bcm43xx/Kconfig 2006-08-14 23:19:39.000000000 +0200 @@ -1,6 +1,6 @@ config BCM43XX_D80211 tristate "Broadcom BCM43xx wireless support (DeviceScape stack)" - depends on PCI && D80211 && NET_RADIO && EXPERIMENTAL + depends on PCI && SONICS_SILICON_BACKPLANE && D80211 && NET_RADIO && EXPERIMENTAL select FW_LOADER ---help--- This is an experimental driver for the Broadcom 43xx wireless chip, -- Greetings Michael. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html