2012-06-30 13:17:29

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 00/18] brcmsmac: update to get SoCs working

This series contains some patches needed to get brcmsmac working on
SoCs like the BCM4718.
The last part which adds core rev 17 (used in the BCM4718) to the list
of supported cores is missing, because we do not have a firmware
supporting this core yet, but I extended the b43 fwcutter to generate
a firmware which brcmsmac accepts. With this firmware my BCM4718
works. I would appreciate an official firmware release from Broadcom
adding support for this core.
The final patch adding support for the BCM43224 is missing because
the PCIe host controller on the BCM4718 still causes problems and I
have to add some more read after writes into the code, for now it uses
an ugly hack and sometimes the problems still occur.

The wifi is not stable on the BCM4718, I had no problems connecting to
my ath9k driven access point but I have problems connecting to my
BCM47186 based AP running the vendor firmware with the Broadcom
proprietary driver.
I get 12MBit/s max with the BCM4718 connected to ath9k on the 2.4 GHz
band and 35 MBit/s max with the BCM43224 on the 5Ghz band connected to
a Broadcom based AP running the proprietary driver. This seams to be
CPU bounced as I have over 50% sirq in both cases.

brcmsmac starts on the BCM47186 (id: 0x5357), but it does not tx or rx
any traffic.

One patch extends the xmtfifo_sz array for more core revs, I just toke
the values from the other phy-n cores and hope this is correct.

These patches are depending on: "[PATCH v2 0/9] bcma misc updates" and
based on wireless-testing.

I will send a patch for bcma which converts the warning message when it
found a PCI and not a PCIe card into a WARN.

v2:
- when something depends on a patch for bcma, which is not in
wireless-testing yet, I add that to the commit comment.
- removed changes for BCM43421 and BCM6362 as I do not have a device
to test this.
- xmtfifo_sz now starts at core rev 17 and contains the correct values
for core rev 28
- make brcms_c_chipmatch() also work for SoCs
- typos and format changes

Hauke Mehrtens (18):
brcmsmac: remove PCIE() macro
brcmsmac: remove PCI_FORCEHT() macro
brcmsmac: remove ai_get_buscore{type,rev}()
brcmsmac: use container_of instead of cast
brcmsmac: remove ai_findcore()
brcmsmac: remove si_pmu_init() and si_pmu_res_init()
brcmsmac: remove si_pmu_spuravoid_pllupdate()
brcmsmac: remove some redundant chip common workarounds
brcmsmac: use core id constants from bcma
brcmsmac: use chip and package id constants from bcma
brcmsmac: remove some unnessessacry casts and void pointer
brcmsmac: add a conditions for core rev 17 again
brcmsmac: add some workarounds for other chips again
brcmsmac: extend xmtfifo_sz array
brcmsmac: fix DMA on SoCs
brcmsmac: extend brcms_c_chipmatch() to also handle non PCIe devices
brcmsmac: fix read in write_phy_reg
brcmsmac: handle non PCI devices in the phy code

drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 128 ++-------------
drivers/net/wireless/brcm80211/brcmsmac/aiutils.h | 16 --
drivers/net/wireless/brcm80211/brcmsmac/dma.c | 15 +-
.../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 3 +-
drivers/net/wireless/brcm80211/brcmsmac/main.c | 91 ++++++++---
.../net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c | 22 ++-
.../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 140 ++++++++++------
drivers/net/wireless/brcm80211/brcmsmac/pmu.c | 172 +-------------------
drivers/net/wireless/brcm80211/brcmsmac/pmu.h | 3 -
drivers/net/wireless/brcm80211/brcmsmac/pub.h | 2 +-
drivers/net/wireless/brcm80211/include/soc.h | 62 -------
11 files changed, 213 insertions(+), 441 deletions(-)

--
1.7.9.5



2012-06-30 13:17:30

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 02/18] brcmsmac: remove PCI_FORCEHT() macro

The BCM4716 is a SoC and does not have a PCI client interface, so this
condition is never true.

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 19 -------------------
1 file changed, 19 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index c942a88..c7ec9b7 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -318,9 +318,6 @@
#define IS_SIM(chippkg) \
((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))

-#define PCI_FORCEHT(sih) ((ai_get_buscoretype(sih) == PCIE_CORE_ID) && \
- (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
-
#ifdef DEBUG
#define SI_MSG(fmt, ...) pr_debug(fmt, ##__VA_ARGS__)
#else
@@ -753,9 +750,6 @@ bool ai_clkctl_cc(struct si_pub *sih, enum bcma_clkmode mode)

sii = (struct si_info *)sih;

- if (PCI_FORCEHT(sih))
- return mode == BCMA_CLKMODE_FAST;
-
cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
bcma_core_set_clockmode(cc, mode);
return mode == BCMA_CLKMODE_FAST;
@@ -764,15 +758,9 @@ bool ai_clkctl_cc(struct si_pub *sih, enum bcma_clkmode mode)
void ai_pci_up(struct si_pub *sih)
{
struct si_info *sii;
- struct bcma_device *cc;

sii = (struct si_info *)sih;

- if (PCI_FORCEHT(sih)) {
- cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
- bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
- }
-
if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
}
@@ -781,16 +769,9 @@ void ai_pci_up(struct si_pub *sih)
void ai_pci_down(struct si_pub *sih)
{
struct si_info *sii;
- struct bcma_device *cc;

sii = (struct si_info *)sih;

- /* release FORCEHT since chip is going to "down" state */
- if (PCI_FORCEHT(sih)) {
- cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
- bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
- }
-
if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
}
--
1.7.9.5


2012-06-30 13:18:10

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 17/18] brcmsmac: fix read in write_phy_reg

This reverts a unintended change mad in commit.
commit 4b006b11ca18995677c5f1cd03cc9c42fbe80693
Author: Arend van Spriel <[email protected]>
Date: Thu Dec 8 15:06:54 2011 -0800

brcm80211: smac: use bcma functions for register access in phy code

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
.../net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
index d16cbec..1703e7d 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -292,7 +292,7 @@ void write_phy_reg(struct brcms_phy *pi, u16 addr, u16 val)
bcma_wflush16(pi->d11core, D11REGOFFS(phyregaddr), addr);
bcma_write16(pi->d11core, D11REGOFFS(phyregdata), val);
if (addr == 0x72)
- (void)bcma_read16(pi->d11core, D11REGOFFS(phyversion));
+ (void)bcma_read16(pi->d11core, D11REGOFFS(phyregdata));
#else
bcma_write32(pi->d11core, D11REGOFFS(phyregaddr), addr | (val << 16));
if (++pi->phy_wreg >= pi->phy_wreg_limit) {
--
1.7.9.5


2012-06-30 13:17:58

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 13/18] brcmsmac: add some workarounds for other chips again

This adds some workarounds for the BCM4716, BCM47162, BCM5357 to the
phy code again. This patch reverts parts of the following patch.

commit c2c724977f95135f397fe0cb45f3c041d26b91e1
Author: Arend van Spriel <[email protected]>
Date: Wed Jun 29 16:46:35 2011 -0700

staging: brcm80211: remove unsupported chipset code from brcmsmac phy

The BCM4716 is working for me with an other firmware and I am working
on adding support for the other chips.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
.../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 131 +++++++++++++-------
1 file changed, 89 insertions(+), 42 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
index 14da744..65db9b7 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
@@ -17893,6 +17893,8 @@ static u32 *wlc_phy_get_ipa_gaintbl_nphy(struct brcms_phy *pi)
nphy_tpc_txgain_ipa_2g_2057rev7;
} else if (NREV_IS(pi->pubpi.phy_rev, 6)) {
tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev6;
+ if (pi->sh->chip == BCMA_CHIP_ID_BCM47162)
+ tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
} else if (NREV_IS(pi->pubpi.phy_rev, 5)) {
tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
} else {
@@ -19254,8 +19256,14 @@ static void wlc_phy_spurwar_nphy(struct brcms_phy *pi)
case 38:
case 102:
case 118:
- nphy_adj_tone_id_buf[0] = 0;
- nphy_adj_noise_var_buf[0] = 0x0;
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) &&
+ (pi->sh->chippkg == BCMA_PKG_ID_BCM4717)) {
+ nphy_adj_tone_id_buf[0] = 32;
+ nphy_adj_noise_var_buf[0] = 0x21f;
+ } else {
+ nphy_adj_tone_id_buf[0] = 0;
+ nphy_adj_noise_var_buf[0] = 0x0;
+ }
break;
case 134:
nphy_adj_tone_id_buf[0] = 32;
@@ -19318,6 +19326,10 @@ void wlc_phy_init_nphy(struct brcms_phy *pi)
0x40, 0x40);
}

+ if ((!PHY_IPA(pi)) && (pi->sh->chip == BCMA_CHIP_ID_BCM5357))
+ si_pmu_chipcontrol(pi->sh->sih, 1, CCTRL5357_EXTPA,
+ CCTRL5357_EXTPA);
+
if ((pi->nphy_gband_spurwar2_en) && CHSPEC_IS2G(pi->radio_chanspec) &&
CHSPEC_IS40(pi->radio_chanspec)) {

@@ -20695,12 +20707,22 @@ wlc_phy_chanspec_radio2056_setup(struct brcms_phy *pi,
write_radio_reg(pi, RADIO_2056_SYN_PLL_LOOPFILTER2 |
RADIO_2056_SYN, 0x1f);

- write_radio_reg(pi,
- RADIO_2056_SYN_PLL_LOOPFILTER4 |
- RADIO_2056_SYN, 0xb);
- write_radio_reg(pi,
- RADIO_2056_SYN_PLL_CP2 |
- RADIO_2056_SYN, 0x14);
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM47162)) {
+ write_radio_reg(pi,
+ RADIO_2056_SYN_PLL_LOOPFILTER4 |
+ RADIO_2056_SYN, 0x14);
+ write_radio_reg(pi,
+ RADIO_2056_SYN_PLL_CP2 |
+ RADIO_2056_SYN, 0x00);
+ } else {
+ write_radio_reg(pi,
+ RADIO_2056_SYN_PLL_LOOPFILTER4 |
+ RADIO_2056_SYN, 0xb);
+ write_radio_reg(pi,
+ RADIO_2056_SYN_PLL_CP2 |
+ RADIO_2056_SYN, 0x14);
+ }
}
}

@@ -20747,24 +20769,30 @@ wlc_phy_chanspec_radio2056_setup(struct brcms_phy *pi,
WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
PADG_IDAC, 0xcc);

- bias = 0x25;
- cascbias = 0x20;
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM47162)) {
+ bias = 0x40;
+ cascbias = 0x45;
+ pag_boost_tune = 0x5;
+ pgag_boost_tune = 0x33;
+ padg_boost_tune = 0x77;
+ mixg_boost_tune = 0x55;
+ } else {
+ bias = 0x25;
+ cascbias = 0x20;

- if ((pi->sh->chip ==
- BCMA_CHIP_ID_BCM43224)
- || (pi->sh->chip ==
- BCMA_CHIP_ID_BCM43225)) {
- if (pi->sh->chippkg ==
- BCMA_PKG_ID_BCM43224_FAB_SMIC) {
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224 ||
+ pi->sh->chip == BCMA_CHIP_ID_BCM43225) &&
+ pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC) {
bias = 0x2a;
cascbias = 0x38;
}
- }

- pag_boost_tune = 0x4;
- pgag_boost_tune = 0x03;
- padg_boost_tune = 0x77;
- mixg_boost_tune = 0x65;
+ pag_boost_tune = 0x4;
+ pgag_boost_tune = 0x03;
+ padg_boost_tune = 0x77;
+ mixg_boost_tune = 0x65;
+ }

WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
INTPAG_IMAIN_STAT, bias);
@@ -20863,11 +20891,10 @@ wlc_phy_chanspec_radio2056_setup(struct brcms_phy *pi,

cascbias = 0x30;

- if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) ||
- (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
- if (pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC)
- cascbias = 0x35;
- }
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224 ||
+ pi->sh->chip == BCMA_CHIP_ID_BCM43225) &&
+ pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC)
+ cascbias = 0x35;

pabias = (pi->phy_pabias == 0) ? 0x30 : pi->phy_pabias;

@@ -21179,19 +21206,29 @@ wlc_phy_chanspec_nphy_setup(struct brcms_phy *pi, u16 chanspec,
} else if (NREV_GE(pi->pubpi.phy_rev, 7)) {
if (val == 54)
spuravoid = 1;
- } else {
- if (pi->nphy_aband_spurwar_en &&
- ((val == 38) || (val == 102)
- || (val == 118)))
+ } else if (pi->nphy_aband_spurwar_en &&
+ ((val == 38) || (val == 102) || (val == 118))) {
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716)
+ && (pi->sh->chippkg == BCMA_PKG_ID_BCM4717)) {
+ spuravoid = 0;
+ } else {
spuravoid = 1;
+ }
}

if (pi->phy_spuravoid == SPURAVOID_FORCEON)
spuravoid = 1;

- wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
- bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc, spuravoid);
- wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
+ bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc,
+ spuravoid);
+ } else {
+ wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
+ bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc,
+ spuravoid);
+ wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
+ }

if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) ||
(pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
@@ -21210,7 +21247,9 @@ wlc_phy_chanspec_nphy_setup(struct brcms_phy *pi, u16 chanspec,
}
}

- wlapi_bmac_core_phypll_reset(pi->sh->physhim);
+ if (!((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM47162)))
+ wlapi_bmac_core_phypll_reset(pi->sh->physhim);

mod_phy_reg(pi, 0x01, (0x1 << 15),
((spuravoid > 0) ? (0x1 << 15) : 0));
@@ -22172,9 +22211,15 @@ s16 wlc_phy_tempsense_nphy(struct brcms_phy *pi)
wlc_phy_table_write_nphy(pi, NPHY_TBL_ID_AFECTRL, 1, 0x03, 16,
&auxADC_rssi_ctrlH_save);

- radio_temp[0] = (179 * (radio_temp[1] + radio_temp2[1])
- + 82 * (auxADC_Vl) - 28861 +
- 128) / 256;
+ if (pi->sh->chip == BCMA_CHIP_ID_BCM5357) {
+ radio_temp[0] = (193 * (radio_temp[1] + radio_temp2[1])
+ + 88 * (auxADC_Vl) - 27111 +
+ 128) / 256;
+ } else {
+ radio_temp[0] = (179 * (radio_temp[1] + radio_temp2[1])
+ + 82 * (auxADC_Vl) - 28861 +
+ 128) / 256;
+ }

offset = (s16) pi->phy_tempsense_offset;

@@ -24924,14 +24969,16 @@ wlc_phy_a2_nphy(struct brcms_phy *pi, struct nphy_ipa_txcalgains *txgains,
if (txgains->useindex) {
phy_a4 = 15 - ((txgains->index) >> 3);
if (CHSPEC_IS2G(pi->radio_chanspec)) {
- if (NREV_GE(pi->pubpi.phy_rev, 6))
+ if (NREV_GE(pi->pubpi.phy_rev, 6) &&
+ pi->sh->chip == BCMA_CHIP_ID_BCM47162) {
+ phy_a5 = 0x10f7 | (phy_a4 << 8);
+ } else if (NREV_GE(pi->pubpi.phy_rev, 6)) {
phy_a5 = 0x00f7 | (phy_a4 << 8);
-
- else
- if (NREV_IS(pi->pubpi.phy_rev, 5))
+ } else if (NREV_IS(pi->pubpi.phy_rev, 5)) {
phy_a5 = 0x10f7 | (phy_a4 << 8);
- else
+ } else {
phy_a5 = 0x50f7 | (phy_a4 << 8);
+ }
} else {
phy_a5 = 0x70f7 | (phy_a4 << 8);
}
--
1.7.9.5


2012-06-30 13:17:40

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 06/18] brcmsmac: remove si_pmu_init() and si_pmu_res_init()

This is already done by bcma_pmu_init() and bcma_pmu_resources_init() in bcma.

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 2 -
drivers/net/wireless/brcm80211/brcmsmac/pmu.c | 76 ---------------------
drivers/net/wireless/brcm80211/brcmsmac/pmu.h | 2 -
3 files changed, 80 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index 4abf9b6..c15d9fc 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -503,9 +503,7 @@ static struct si_info *ai_doattach(struct si_info *sii,

/* PMU specific initializations */
if (ai_get_cccaps(sih) & CC_CAP_PMU) {
- si_pmu_init(sih);
(void)si_pmu_measure_alpclk(sih);
- si_pmu_res_init(sih);
}

/* setup the GPIO based LED powersave register */
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
index 0399a86..045f43a 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
@@ -108,37 +108,6 @@
#define RES4313_HT_AVAIL_RSRC 14
#define RES4313_MACPHY_CLK_AVAIL_RSRC 15

-/* Determine min/max rsrc masks. Value 0 leaves hardware at default. */
-static void si_pmu_res_masks(struct si_pub *sih, u32 * pmin, u32 * pmax)
-{
- u32 min_mask = 0, max_mask = 0;
- uint rsrcs;
-
- /* # resources */
- rsrcs = (ai_get_pmucaps(sih) & PCAP_RC_MASK) >> PCAP_RC_SHIFT;
-
- /* determine min/max rsrc masks */
- switch (ai_get_chip_id(sih)) {
- case BCM43224_CHIP_ID:
- case BCM43225_CHIP_ID:
- /* ??? */
- break;
-
- case BCM4313_CHIP_ID:
- min_mask = PMURES_BIT(RES4313_BB_PU_RSRC) |
- PMURES_BIT(RES4313_XTAL_PU_RSRC) |
- PMURES_BIT(RES4313_ALP_AVAIL_RSRC) |
- PMURES_BIT(RES4313_BB_PLL_PWRSW_RSRC);
- max_mask = 0xffff;
- break;
- default:
- break;
- }
-
- *pmin = min_mask;
- *pmax = max_mask;
-}
-
void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid)
{
u32 tmp = 0;
@@ -284,51 +253,6 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
return clock;
}

-/* initialize PMU */
-void si_pmu_init(struct si_pub *sih)
-{
- struct si_info *sii = container_of(sih, struct si_info, pub);
- struct bcma_device *core;
-
- /* select chipc */
- core = sii->icbus->drv_cc.core;
-
- if (ai_get_pmurev(sih) == 1)
- bcma_mask32(core, CHIPCREGOFFS(pmucontrol),
- ~PCTL_NOILP_ON_WAIT);
- else if (ai_get_pmurev(sih) >= 2)
- bcma_set32(core, CHIPCREGOFFS(pmucontrol), PCTL_NOILP_ON_WAIT);
-}
-
-/* initialize PMU resources */
-void si_pmu_res_init(struct si_pub *sih)
-{
- struct si_info *sii = container_of(sih, struct si_info, pub);
- struct bcma_device *core;
- u32 min_mask = 0, max_mask = 0;
-
- /* select to chipc */
- core = sii->icbus->drv_cc.core;
-
- /* Determine min/max rsrc masks */
- si_pmu_res_masks(sih, &min_mask, &max_mask);
-
- /* It is required to program max_mask first and then min_mask */
-
- /* Program max resource mask */
-
- if (max_mask)
- bcma_write32(core, CHIPCREGOFFS(max_res_mask), max_mask);
-
- /* Program min resource mask */
-
- if (min_mask)
- bcma_write32(core, CHIPCREGOFFS(min_res_mask), min_mask);
-
- /* Add some delay; allow resources to come up and settle. */
- mdelay(2);
-}
-
u32 si_pmu_measure_alpclk(struct si_pub *sih)
{
struct si_info *sii = container_of(sih, struct si_info, pub);
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.h b/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
index 3e39c5e..2f0ad28 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
@@ -28,8 +28,6 @@ extern u32 si_pmu_alp_clock(struct si_pub *sih);
extern void si_pmu_pllupd(struct si_pub *sih);
extern void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid);
extern u32 si_pmu_pllcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
-extern void si_pmu_init(struct si_pub *sih);
-extern void si_pmu_res_init(struct si_pub *sih);
extern u32 si_pmu_measure_alpclk(struct si_pub *sih);

#endif /* _BRCM_PMU_H_ */
--
1.7.9.5


2012-06-30 13:18:12

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 18/18] brcmsmac: handle non PCI devices in the phy code

Some code in write_{radio,radio}_reg() should just be run if this is a
pci based device. Add the condition again which was removed in commit:
commit 821e4e93172e4f7d5ac1eade04665c3dc5049c4a
Author: Roland Vossen <[email protected]>
Date: Mon Aug 8 15:58:58 2011 +0200

staging: brcm80211: removed unused bus code from softmac

Signed-off-by: Hauke Mehrtens <[email protected]>
---
.../net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
index 1703e7d..91937c5 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -198,6 +198,8 @@ u16 read_radio_reg(struct brcms_phy *pi, u16 addr)

void write_radio_reg(struct brcms_phy *pi, u16 addr, u16 val)
{
+ struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);
+
if ((D11REV_GE(pi->sh->corerev, 24)) ||
(D11REV_IS(pi->sh->corerev, 22)
&& (pi->pubpi.phy_type != PHY_TYPE_SSN))) {
@@ -209,7 +211,8 @@ void write_radio_reg(struct brcms_phy *pi, u16 addr, u16 val)
bcma_write16(pi->d11core, D11REGOFFS(phy4wdatalo), val);
}

- if (++pi->phy_wreg >= pi->phy_wreg_limit) {
+ if ((sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) &&
+ (++pi->phy_wreg >= pi->phy_wreg_limit)) {
(void)bcma_read32(pi->d11core, D11REGOFFS(maccontrol));
pi->phy_wreg = 0;
}
@@ -294,8 +297,11 @@ void write_phy_reg(struct brcms_phy *pi, u16 addr, u16 val)
if (addr == 0x72)
(void)bcma_read16(pi->d11core, D11REGOFFS(phyregdata));
#else
+ struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);
+
bcma_write32(pi->d11core, D11REGOFFS(phyregaddr), addr | (val << 16));
- if (++pi->phy_wreg >= pi->phy_wreg_limit) {
+ if ((sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) &&
+ (++pi->phy_wreg >= pi->phy_wreg_limit)) {
pi->phy_wreg = 0;
(void)bcma_read16(pi->d11core, D11REGOFFS(phyversion));
}
--
1.7.9.5


2012-06-30 13:17:33

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 04/18] brcmsmac: use container_of instead of cast

Now "struct si_pub pub" does not have to be the first member in struct
si_info any more, if it is the resulting code after compilation should
be the same.

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index 339e533..2a77698 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -582,7 +582,7 @@ void ai_detach(struct si_pub *sih)
struct si_pub *si_local = NULL;
memcpy(&si_local, &sih, sizeof(struct si_pub **));

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

if (sii == NULL)
return;
@@ -597,7 +597,7 @@ struct bcma_device *ai_findcore(struct si_pub *sih, u16 coreid, u16 coreunit)
struct si_info *sii;
uint found;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

found = 0;

@@ -620,7 +620,7 @@ uint ai_cc_reg(struct si_pub *sih, uint regoff, u32 mask, u32 val)
u32 w;
struct si_info *sii;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);
cc = sii->icbus->drv_cc.core;

/* mask and set */
@@ -713,7 +713,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si_pub *sih)
uint slowminfreq;
u16 fpdelay;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);
if (ai_get_cccaps(sih) & CC_CAP_PMU) {
fpdelay = si_pmu_fast_pwrup_delay(sih);
return fpdelay;
@@ -745,7 +745,7 @@ bool ai_clkctl_cc(struct si_pub *sih, enum bcma_clkmode mode)
struct si_info *sii;
struct bcma_device *cc;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
bcma_core_set_clockmode(cc, mode);
@@ -756,7 +756,7 @@ void ai_pci_up(struct si_pub *sih)
{
struct si_info *sii;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
@@ -767,7 +767,7 @@ void ai_pci_down(struct si_pub *sih)
{
struct si_info *sii;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
@@ -790,7 +790,7 @@ bool ai_deviceremoved(struct si_pub *sih)
u32 w;
struct si_info *sii;

- sii = (struct si_info *)sih;
+ sii = container_of(sih, struct si_info, pub);

if (sii->icbus->hosttype != BCMA_HOSTTYPE_PCI)
return false;
--
1.7.9.5


2012-06-30 13:17:49

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 09/18] brcmsmac: use core id constants from bcma

This patch depends on adding the IDs to bcma done in
this commit in my pending patch series for bcma.
Author: Hauke Mehrtens <[email protected]>
Date: Sun Jun 3 18:17:57 2012 +0200

bcma: add constants for chip ids

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/dma.c | 4 +-
drivers/net/wireless/brcm80211/include/soc.h | 62 -------------------------
2 files changed, 2 insertions(+), 64 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/dma.c b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
index 11054ae..b67b20c 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
@@ -639,10 +639,10 @@ struct dma_pub *dma_attach(char *name, struct si_pub *sih,
di->dataoffsetlow = di->ddoffsetlow;
di->dataoffsethigh = di->ddoffsethigh;
/* WAR64450 : DMACtl.Addr ext fields are not supported in SDIOD core. */
- if ((core->id.id == SDIOD_CORE_ID)
+ if ((core->id.id == BCMA_CORE_SDIO_DEV)
&& ((rev > 0) && (rev <= 2)))
di->addrext = false;
- else if ((core->id.id == I2S_CORE_ID) &&
+ else if ((core->id.id == BCMA_CORE_I2S) &&
((rev == 0) || (rev == 1)))
di->addrext = false;
else
diff --git a/drivers/net/wireless/brcm80211/include/soc.h b/drivers/net/wireless/brcm80211/include/soc.h
index 4e9b7e4..123cfa8 100644
--- a/drivers/net/wireless/brcm80211/include/soc.h
+++ b/drivers/net/wireless/brcm80211/include/soc.h
@@ -19,68 +19,6 @@

#define SI_ENUM_BASE 0x18000000 /* Enumeration space base */

-/* core codes */
-#define NODEV_CORE_ID 0x700 /* Invalid coreid */
-#define CC_CORE_ID 0x800 /* chipcommon core */
-#define ILINE20_CORE_ID 0x801 /* iline20 core */
-#define SRAM_CORE_ID 0x802 /* sram core */
-#define SDRAM_CORE_ID 0x803 /* sdram core */
-#define PCI_CORE_ID 0x804 /* pci core */
-#define MIPS_CORE_ID 0x805 /* mips core */
-#define ENET_CORE_ID 0x806 /* enet mac core */
-#define CODEC_CORE_ID 0x807 /* v90 codec core */
-#define USB_CORE_ID 0x808 /* usb 1.1 host/device core */
-#define ADSL_CORE_ID 0x809 /* ADSL core */
-#define ILINE100_CORE_ID 0x80a /* iline100 core */
-#define IPSEC_CORE_ID 0x80b /* ipsec core */
-#define UTOPIA_CORE_ID 0x80c /* utopia core */
-#define PCMCIA_CORE_ID 0x80d /* pcmcia core */
-#define SOCRAM_CORE_ID 0x80e /* internal memory core */
-#define MEMC_CORE_ID 0x80f /* memc sdram core */
-#define OFDM_CORE_ID 0x810 /* OFDM phy core */
-#define EXTIF_CORE_ID 0x811 /* external interface core */
-#define D11_CORE_ID 0x812 /* 802.11 MAC core */
-#define APHY_CORE_ID 0x813 /* 802.11a phy core */
-#define BPHY_CORE_ID 0x814 /* 802.11b phy core */
-#define GPHY_CORE_ID 0x815 /* 802.11g phy core */
-#define MIPS33_CORE_ID 0x816 /* mips3302 core */
-#define USB11H_CORE_ID 0x817 /* usb 1.1 host core */
-#define USB11D_CORE_ID 0x818 /* usb 1.1 device core */
-#define USB20H_CORE_ID 0x819 /* usb 2.0 host core */
-#define USB20D_CORE_ID 0x81a /* usb 2.0 device core */
-#define SDIOH_CORE_ID 0x81b /* sdio host core */
-#define ROBO_CORE_ID 0x81c /* roboswitch core */
-#define ATA100_CORE_ID 0x81d /* parallel ATA core */
-#define SATAXOR_CORE_ID 0x81e /* serial ATA & XOR DMA core */
-#define GIGETH_CORE_ID 0x81f /* gigabit ethernet core */
-#define PCIE_CORE_ID 0x820 /* pci express core */
-#define NPHY_CORE_ID 0x821 /* 802.11n 2x2 phy core */
-#define SRAMC_CORE_ID 0x822 /* SRAM controller core */
-#define MINIMAC_CORE_ID 0x823 /* MINI MAC/phy core */
-#define ARM11_CORE_ID 0x824 /* ARM 1176 core */
-#define ARM7S_CORE_ID 0x825 /* ARM7tdmi-s core */
-#define LPPHY_CORE_ID 0x826 /* 802.11a/b/g phy core */
-#define PMU_CORE_ID 0x827 /* PMU core */
-#define SSNPHY_CORE_ID 0x828 /* 802.11n single-stream phy core */
-#define SDIOD_CORE_ID 0x829 /* SDIO device core */
-#define ARMCM3_CORE_ID 0x82a /* ARM Cortex M3 core */
-#define HTPHY_CORE_ID 0x82b /* 802.11n 4x4 phy core */
-#define MIPS74K_CORE_ID 0x82c /* mips 74k core */
-#define GMAC_CORE_ID 0x82d /* Gigabit MAC core */
-#define DMEMC_CORE_ID 0x82e /* DDR1/2 memory controller core */
-#define PCIERC_CORE_ID 0x82f /* PCIE Root Complex core */
-#define OCP_CORE_ID 0x830 /* OCP2OCP bridge core */
-#define SC_CORE_ID 0x831 /* shared common core */
-#define AHB_CORE_ID 0x832 /* OCP2AHB bridge core */
-#define SPIH_CORE_ID 0x833 /* SPI host core */
-#define I2S_CORE_ID 0x834 /* I2S core */
-#define DMEMS_CORE_ID 0x835 /* SDR/DDR1 memory controller core */
-#define DEF_SHIM_COMP 0x837 /* SHIM component in ubus/6362 */
-#define OOB_ROUTER_CORE_ID 0x367 /* OOB router core ID */
-#define DEF_AI_COMP 0xfff /* Default component, in ai chips it
- * maps all unused address ranges
- */
-
/* Common core control flags */
#define SICF_BIST_EN 0x8000
#define SICF_PME_EN 0x4000
--
1.7.9.5


2012-06-30 13:17:59

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 14/18] brcmsmac: extend xmtfifo_sz array

The xmtfifo_sz array contains the queue sizes for the different core
revs. This array missed the sizes for the core rev 17 and 28. This
patch extends the array to also include these sizes and adds a warning
if no queue size is stored in the array for the given core rev.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/main.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 547ae5b..46d7646 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -269,7 +269,7 @@ struct brcms_c_bit_desc {
*/

/* Starting corerev for the fifo size table */
-#define XMTFIFOTBL_STARTREV 20
+#define XMTFIFOTBL_STARTREV 17

struct d11init {
__le16 addr;
@@ -333,6 +333,12 @@ const u8 wlc_prio2prec_map[] = {
};

static const u16 xmtfifo_sz[][NFIFO] = {
+ /* corerev 17: 5120, 49152, 49152, 5376, 4352, 1280 */
+ {20, 192, 192, 21, 17, 5},
+ /* corerev 18: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 19: */
+ {0, 0, 0, 0, 0, 0},
/* corerev 20: 5120, 49152, 49152, 5376, 4352, 1280 */
{20, 192, 192, 21, 17, 5},
/* corerev 21: 2304, 14848, 5632, 3584, 3584, 1280 */
@@ -343,6 +349,18 @@ static const u16 xmtfifo_sz[][NFIFO] = {
{20, 192, 192, 21, 17, 5},
/* corerev 24: 2304, 14848, 5632, 3584, 3584, 1280 */
{9, 58, 22, 14, 14, 5},
+ /* corerev 25: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 26: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 27: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 28: 2304, 14848, 5632, 3584, 3584, 1280 */
+ {9, 58, 22, 14, 14, 5},
+ /* corerev 29: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 30: */
+ {0, 0, 0, 0, 0, 0},
};

#ifdef DEBUG
@@ -4596,8 +4614,12 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
wlc_hw->machwcap_backup = wlc_hw->machwcap;

/* init tx fifo size */
+ WARN_ON((wlc_hw->corerev - XMTFIFOTBL_STARTREV) < 0 ||
+ (wlc_hw->corerev - XMTFIFOTBL_STARTREV) >
+ ARRAY_SIZE(xmtfifo_sz));
wlc_hw->xmtfifo_sz =
xmtfifo_sz[(wlc_hw->corerev - XMTFIFOTBL_STARTREV)];
+ WARN_ON(!wlc_hw->xmtfifo_sz[0]);

/* Get a phy for this band */
wlc_hw->band->pi =
--
1.7.9.5


2012-06-30 13:17:54

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 12/18] brcmsmac: add a conditions for core rev 17 again

This reverts some changes made in this commit:
commit 7234592364e2efe8b4ac1040c99b1d7ef01cf502
Author: Roland Vossen <[email protected]>
Date: Mon Feb 14 12:16:45 2011 +0100

staging: brcm80211: removal of inactive d11 code

The bcm4716 has a rev 17 wireless core and this condition is needed.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/main.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 8bad8b6..547ae5b 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -1942,7 +1942,8 @@ static bool brcms_b_radio_read_hwdisabled(struct brcms_hardware *wlc_hw)
* accesses phyreg throughput mac. This can be skipped since
* only mac reg is accessed below
*/
- flags |= SICF_PCLKE;
+ if (D11REV_GE(wlc_hw->corerev, 18))
+ flags |= SICF_PCLKE;

/*
* TODO: test suspend/resume
@@ -2023,7 +2024,8 @@ void brcms_b_corereset(struct brcms_hardware *wlc_hw, u32 flags)
* phyreg throughput mac, AND phy_reset is skipped at early stage when
* band->pi is invalid. need to enable PHY CLK
*/
- flags |= SICF_PCLKE;
+ if (D11REV_GE(wlc_hw->corerev, 18))
+ flags |= SICF_PCLKE;

/*
* reset the core
--
1.7.9.5


2012-06-30 13:17:32

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 03/18] brcmsmac: remove ai_get_buscore{type,rev}()

These two functions are not used any more.

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 15 ---------------
drivers/net/wireless/brcm80211/brcmsmac/aiutils.h | 4 ----
2 files changed, 19 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index c7ec9b7..339e533 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -469,9 +469,6 @@ ai_buscore_setup(struct si_info *sii, struct bcma_device *cc)
sii->pub.pmurev = sii->pub.pmucaps & PCAP_REV_MASK;
}

- /* figure out buscore */
- sii->buscore = ai_findcore(&sii->pub, PCIE_CORE_ID, 0);
-
return true;
}

@@ -804,15 +801,3 @@ bool ai_deviceremoved(struct si_pub *sih)

return false;
}
-
-uint ai_get_buscoretype(struct si_pub *sih)
-{
- struct si_info *sii = (struct si_info *)sih;
- return sii->buscore->id.id;
-}
-
-uint ai_get_buscorerev(struct si_pub *sih)
-{
- struct si_info *sii = (struct si_info *)sih;
- return sii->buscore->id.rev;
-}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
index d6fa982..fb7f439 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
@@ -168,7 +168,6 @@ struct si_info {
struct si_pub pub; /* back plane public state (must be first) */
struct bcma_bus *icbus; /* handle to soc interconnect bus */
struct pci_dev *pcibus; /* handle to pci bus */
- struct bcma_device *buscore;

u32 chipst; /* chip status */
};
@@ -202,9 +201,6 @@ extern void ai_pci_up(struct si_pub *sih);
/* Enable Ex-PA for 4313 */
extern void ai_epa_4313war(struct si_pub *sih);

-extern uint ai_get_buscoretype(struct si_pub *sih);
-extern uint ai_get_buscorerev(struct si_pub *sih);
-
static inline u32 ai_get_cccaps(struct si_pub *sih)
{
return sih->cccaps;
--
1.7.9.5


2012-06-30 13:17:13

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 01/18] brcmsmac: remove PCIE() macro

Instead of checking if there is a PCIe core on the bus, better check if
hosttype is PCIe.

In the original submission to staging PCIE() checked, if the bustype is
PCI and the buscore is a PCIe core. Now we assume that all cores bcma
supports are PCIe based, so we just have to check if the bustype is PCI.

The old code bcmsmac currently uses searches for a PCIe core on the bus
and if there is one assumes that this is the buscore, which is wrong.
Some SoCs have a PCIe core operating in host mode and this is not the
bus core. The old code also caused a null pointer in
ai_get_buscoretype() and ai_get_buscorerev() if buscore was not set
because there was no PCIe core on the bus.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index 3c6f9b1..c942a88 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -318,9 +318,8 @@
#define IS_SIM(chippkg) \
((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))

-#define PCIE(sih) (ai_get_buscoretype(sih) == PCIE_CORE_ID)
-
-#define PCI_FORCEHT(sih) (PCIE(sih) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
+#define PCI_FORCEHT(sih) ((ai_get_buscoretype(sih) == PCIE_CORE_ID) && \
+ (ai_get_chip_id(sih) == BCM4716_CHIP_ID))

#ifdef DEBUG
#define SI_MSG(fmt, ...) pr_debug(fmt, ##__VA_ARGS__)
@@ -774,7 +773,7 @@ void ai_pci_up(struct si_pub *sih)
bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
}

- if (PCIE(sih))
+ if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
}

@@ -792,7 +791,7 @@ void ai_pci_down(struct si_pub *sih)
bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
}

- if (PCIE(sih))
+ if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
}

--
1.7.9.5


2012-06-30 13:18:05

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 16/18] brcmsmac: extend brcms_c_chipmatch() to also handle non PCIe devices

Now brcms_c_chipmatch() is also able to handle non PCI devices and also
does some checking for SoC if they are supported by brcmsmac.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
.../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 3 +-
drivers/net/wireless/brcm80211/brcmsmac/main.c | 38 ++++++++++++++++----
drivers/net/wireless/brcm80211/brcmsmac/pub.h | 2 +-
3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index 2d5a404..2b57f57 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -319,8 +319,7 @@ static void brcms_ops_stop(struct ieee80211_hw *hw)
return;

spin_lock_bh(&wl->lock);
- status = brcms_c_chipmatch(wl->wlc->hw->vendorid,
- wl->wlc->hw->deviceid);
+ status = brcms_c_chipmatch(wl->wlc->hw->d11core);
spin_unlock_bh(&wl->lock);
if (!status) {
wiphy_err(wl->wiphy,
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 46d7646..28988cb 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4473,11 +4473,9 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
}

/* verify again the device is supported */
- if (core->bus->hosttype == BCMA_HOSTTYPE_PCI &&
- !brcms_c_chipmatch(pcidev->vendor, pcidev->device)) {
- wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported "
- "vendor/device (0x%x/0x%x)\n",
- unit, pcidev->vendor, pcidev->device);
+ if (!brcms_c_chipmatch(core)) {
+ wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported device\n",
+ unit);
err = 12;
goto fail;
}
@@ -5790,8 +5788,12 @@ void brcms_c_print_txstatus(struct tx_status *txs)
(txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
}

-bool brcms_c_chipmatch(u16 vendor, u16 device)
+static bool brcms_c_chipmatch_pci(struct bcma_device *core)
{
+ struct pci_dev *pcidev = core->bus->host_pci;
+ u16 vendor = pcidev->vendor;
+ u16 device = pcidev->device;
+
if (vendor != PCI_VENDOR_ID_BROADCOM) {
pr_err("unknown vendor id %04x\n", vendor);
return false;
@@ -5810,6 +5812,30 @@ bool brcms_c_chipmatch(u16 vendor, u16 device)
return false;
}

+static bool brcms_c_chipmatch_soc(struct bcma_device *core)
+{
+ struct bcma_chipinfo *chipinfo = &core->bus->chipinfo;
+
+ if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
+ return true;
+
+ pr_err("unknown chip id %04x\n", chipinfo->id);
+ return false;
+}
+
+bool brcms_c_chipmatch(struct bcma_device *core)
+{
+ switch (core->bus->hosttype) {
+ case BCMA_HOSTTYPE_PCI:
+ return brcms_c_chipmatch_pci(core);
+ case BCMA_HOSTTYPE_SOC:
+ return brcms_c_chipmatch_soc(core);
+ default:
+ pr_err("unknown host type: %i\n", core->bus->hosttype);
+ return false;
+ }
+}
+
#if defined(DEBUG)
void brcms_c_print_txdesc(struct d11txh *txh)
{
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pub.h b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
index aa5d67f..5855f4f 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
@@ -311,7 +311,7 @@ extern uint brcms_c_detach(struct brcms_c_info *wlc);
extern int brcms_c_up(struct brcms_c_info *wlc);
extern uint brcms_c_down(struct brcms_c_info *wlc);

-extern bool brcms_c_chipmatch(u16 vendor, u16 device);
+extern bool brcms_c_chipmatch(struct bcma_device *core);
extern void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx);
extern void brcms_c_reset(struct brcms_c_info *wlc);

--
1.7.9.5


2012-06-30 13:17:37

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 05/18] brcmsmac: remove ai_findcore()

bcma also stores a pointer to the chipcommon core in its struct,
brcmsmac should use it and not search for the core by its own.

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 31 ++++-----------------
drivers/net/wireless/brcm80211/brcmsmac/aiutils.h | 2 --
drivers/net/wireless/brcm80211/brcmsmac/pmu.c | 12 +++++---
3 files changed, 14 insertions(+), 31 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index 2a77698..4abf9b6 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -590,27 +590,6 @@ void ai_detach(struct si_pub *sih)
kfree(sii);
}

-/* return index of coreid or BADIDX if not found */
-struct bcma_device *ai_findcore(struct si_pub *sih, u16 coreid, u16 coreunit)
-{
- struct bcma_device *core;
- struct si_info *sii;
- uint found;
-
- sii = container_of(sih, struct si_info, pub);
-
- found = 0;
-
- list_for_each_entry(core, &sii->icbus->cores, list)
- if (core->id.id == coreid) {
- if (found == coreunit)
- return core;
- found++;
- }
-
- return NULL;
-}
-
/*
* read/modify chipcommon core register.
*/
@@ -686,12 +665,13 @@ ai_clkctl_setdelay(struct si_pub *sih, struct bcma_device *cc)
/* initialize power control delay registers */
void ai_clkctl_init(struct si_pub *sih)
{
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *cc;

if (!(ai_get_cccaps(sih) & CC_CAP_PWR_CTL))
return;

- cc = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+ cc = sii->icbus->drv_cc.core;
if (cc == NULL)
return;

@@ -723,7 +703,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si_pub *sih)
return 0;

fpdelay = 0;
- cc = ai_findcore(sih, CC_CORE_ID, 0);
+ cc = sii->icbus->drv_cc.core;
if (cc) {
slowminfreq = ai_slowclk_freq(sih, false, cc);
fpdelay = (((bcma_read32(cc, CHIPCREGOFFS(pll_on_delay)) + 2)
@@ -747,7 +727,7 @@ bool ai_clkctl_cc(struct si_pub *sih, enum bcma_clkmode mode)

sii = container_of(sih, struct si_info, pub);

- cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
+ cc = sii->icbus->drv_cc.core;
bcma_core_set_clockmode(cc, mode);
return mode == BCMA_CLKMODE_FAST;
}
@@ -776,9 +756,10 @@ void ai_pci_down(struct si_pub *sih)
/* Enable BT-COEX & Ex-PA for 4313 */
void ai_epa_4313war(struct si_pub *sih)
{
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *cc;

- cc = ai_findcore(sih, CC_CORE_ID, 0);
+ cc = sii->icbus->drv_cc.core;

/* EPA Fix */
bcma_set32(cc, CHIPCREGOFFS(gpiocontrol), GPIO_CTRL_EPA_EN_MASK);
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
index fb7f439..3a5358c 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
@@ -182,8 +182,6 @@ struct si_info {


/* AMBA Interconnect exported externs */
-extern struct bcma_device *ai_findcore(struct si_pub *sih,
- u16 coreid, u16 coreunit);
extern u32 ai_core_cflags(struct bcma_device *core, u32 mask, u32 val);

/* === exported functions === */
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
index 4931d29..0399a86 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
@@ -142,10 +142,11 @@ static void si_pmu_res_masks(struct si_pub *sih, u32 * pmin, u32 * pmax)
void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid)
{
u32 tmp = 0;
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *core;

/* switch to chipc */
- core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+ core = sii->icbus->drv_cc.core;

switch (ai_get_chip_id(sih)) {
case BCM43224_CHIP_ID:
@@ -286,10 +287,11 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
/* initialize PMU */
void si_pmu_init(struct si_pub *sih)
{
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *core;

/* select chipc */
- core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+ core = sii->icbus->drv_cc.core;

if (ai_get_pmurev(sih) == 1)
bcma_mask32(core, CHIPCREGOFFS(pmucontrol),
@@ -301,11 +303,12 @@ void si_pmu_init(struct si_pub *sih)
/* initialize PMU resources */
void si_pmu_res_init(struct si_pub *sih)
{
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *core;
u32 min_mask = 0, max_mask = 0;

/* select to chipc */
- core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+ core = sii->icbus->drv_cc.core;

/* Determine min/max rsrc masks */
si_pmu_res_masks(sih, &min_mask, &max_mask);
@@ -328,6 +331,7 @@ void si_pmu_res_init(struct si_pub *sih)

u32 si_pmu_measure_alpclk(struct si_pub *sih)
{
+ struct si_info *sii = container_of(sih, struct si_info, pub);
struct bcma_device *core;
u32 alp_khz;

@@ -335,7 +339,7 @@ u32 si_pmu_measure_alpclk(struct si_pub *sih)
return 0;

/* Remember original core before switch to chipc */
- core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+ core = sii->icbus->drv_cc.core;

if (bcma_read32(core, CHIPCREGOFFS(pmustatus)) & PST_EXTLPOAVAIL) {
u32 ilp_ctr, alp_hz;
--
1.7.9.5


2012-06-30 13:17:44

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 08/18] brcmsmac: remove some redundant chip common workarounds

The removed workarounds are already performed in bcma_pmu_workarounds()
and bcma_core_chipcommon_init()

This patch depends on the completion of the workarounds in bcma done in
this commit in my pending patch series for bcma.
Author: Hauke Mehrtens <[email protected]>
Date: Mon Jun 4 00:20:26 2012 +0200

bcma: complete workaround for BCMA43224 and BCM4313

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 42 ---------------------
1 file changed, 42 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
index c15d9fc..8c9345d 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
@@ -476,11 +476,7 @@ static struct si_info *ai_doattach(struct si_info *sii,
struct bcma_bus *pbus)
{
struct si_pub *sih = &sii->pub;
- u32 w, savewin;
struct bcma_device *cc;
- struct ssb_sprom *sprom = &pbus->sprom;
-
- savewin = 0;

sii->icbus = pbus;
sii->pcibus = pbus->host_pci;
@@ -506,44 +502,6 @@ static struct si_info *ai_doattach(struct si_info *sii,
(void)si_pmu_measure_alpclk(sih);
}

- /* setup the GPIO based LED powersave register */
- w = (sprom->leddc_on_time << BCMA_CC_GPIOTIMER_ONTIME_SHIFT) |
- (sprom->leddc_off_time << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT);
- if (w == 0)
- w = DEFAULT_GPIOTIMERVAL;
- ai_cc_reg(sih, offsetof(struct chipcregs, gpiotimerval),
- ~0, w);
-
- if (ai_get_chip_id(sih) == BCM43224_CHIP_ID) {
- /*
- * enable 12 mA drive strenth for 43224 and
- * set chipControl register bit 15
- */
- if (ai_get_chiprev(sih) == 0) {
- SI_MSG("Applying 43224A0 WARs\n");
- ai_cc_reg(sih, offsetof(struct chipcregs, chipcontrol),
- CCTRL43224_GPIO_TOGGLE,
- CCTRL43224_GPIO_TOGGLE);
- si_pmu_chipcontrol(sih, 0, CCTRL_43224A0_12MA_LED_DRIVE,
- CCTRL_43224A0_12MA_LED_DRIVE);
- }
- if (ai_get_chiprev(sih) >= 1) {
- SI_MSG("Applying 43224B0+ WARs\n");
- si_pmu_chipcontrol(sih, 0, CCTRL_43224B0_12MA_LED_DRIVE,
- CCTRL_43224B0_12MA_LED_DRIVE);
- }
- }
-
- if (ai_get_chip_id(sih) == BCM4313_CHIP_ID) {
- /*
- * enable 12 mA drive strenth for 4313 and
- * set chipControl register bit 1
- */
- SI_MSG("Applying 4313 WARs\n");
- si_pmu_chipcontrol(sih, 0, CCTRL_4313_12MA_LED_DRIVE,
- CCTRL_4313_12MA_LED_DRIVE);
- }
-
return sii;

exit:
--
1.7.9.5


2012-06-30 13:17:50

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 10/18] brcmsmac: use chip and package id constants from bcma

This patch depends on addin the chip IDs to bcma done in this commit in
my pending patch series for bcma.
Author: Hauke Mehrtens <[email protected]>
Date: Sun Jun 3 18:17:57 2012 +0200

bcma: add constants for chip ids

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/aiutils.h | 10 ----------
drivers/net/wireless/brcm80211/brcmsmac/main.c | 12 ++++++------
.../net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c | 10 +++++-----
.../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 20 ++++++++++----------
drivers/net/wireless/brcm80211/brcmsmac/pmu.c | 12 ++++++------
5 files changed, 27 insertions(+), 37 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
index 3a5358c..89562c1 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
@@ -88,16 +88,6 @@
#define CLKD_OTP 0x000f0000
#define CLKD_OTP_SHIFT 16

-/* Package IDs */
-#define BCM4717_PKG_ID 9 /* 4717 package id */
-#define BCM4718_PKG_ID 10 /* 4718 package id */
-#define BCM43224_FAB_SMIC 0xa /* the chip is manufactured by SMIC */
-
-/* these are router chips */
-#define BCM4716_CHIP_ID 0x4716 /* 4716 chipcommon chipid */
-#define BCM47162_CHIP_ID 47162 /* 47162 chipcommon chipid */
-#define BCM4748_CHIP_ID 0x4748 /* 4716 chipcommon chipid (OTP, RBBU) */
-
/* dynamic clock control defines */
#define LPOMINFREQ 25000 /* low power oscillator min */
#define LPOMAXFREQ 43000 /* low power oscillator max */
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 8776fbc..478b374 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -2126,8 +2126,8 @@ void brcms_b_switch_macfreq(struct brcms_hardware *wlc_hw, u8 spurmode)
{
struct bcma_device *core = wlc_hw->d11core;

- if ((ai_get_chip_id(wlc_hw->sih) == BCM43224_CHIP_ID) ||
- (ai_get_chip_id(wlc_hw->sih) == BCM43225_CHIP_ID)) {
+ if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43224) ||
+ (ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43225)) {
if (spurmode == WL_SPURAVOID_ON2) { /* 126Mhz */
bcma_write16(core, D11REGOFFS(tsf_clk_frac_l), 0x2082);
bcma_write16(core, D11REGOFFS(tsf_clk_frac_h), 0x8);
@@ -2791,7 +2791,7 @@ void brcms_b_core_phypll_ctl(struct brcms_hardware *wlc_hw, bool on)
tmp = 0;

if (on) {
- if ((ai_get_chip_id(wlc_hw->sih) == BCM4313_CHIP_ID)) {
+ if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM4313)) {
bcma_set32(core, D11REGOFFS(clk_ctl_st),
CCS_ERSRC_REQ_HT |
CCS_ERSRC_REQ_D11PLL |
@@ -4528,7 +4528,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
else
wlc_hw->_nbands = 1;

- if ((ai_get_chip_id(wlc_hw->sih) == BCM43225_CHIP_ID))
+ if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43225))
wlc_hw->_nbands = 1;

/* BMAC_NOTE: remove init of pub values when brcms_c_attach()
@@ -5036,7 +5036,7 @@ static void brcms_b_hw_up(struct brcms_hardware *wlc_hw)
wlc_hw->wlc->pub->hw_up = true;

if ((wlc_hw->boardflags & BFL_FEM)
- && (ai_get_chip_id(wlc_hw->sih) == BCM4313_CHIP_ID)) {
+ && (ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM4313)) {
if (!
(wlc_hw->boardrev >= 0x1250
&& (wlc_hw->boardflags & BFL_FEM_BT)))
@@ -5130,7 +5130,7 @@ int brcms_c_up(struct brcms_c_info *wlc)
}

if ((wlc->pub->boardflags & BFL_FEM)
- && (ai_get_chip_id(wlc->hw->sih) == BCM4313_CHIP_ID)) {
+ && (ai_get_chip_id(wlc->hw->sih) == BCMA_CHIP_ID_BCM4313)) {
if (wlc->pub->boardrev >= 0x1250
&& (wlc->pub->boardflags & BFL_FEM_BT))
brcms_b_mhf(wlc->hw, MHF5, MHF5_4313_GPIOCTRL,
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
index 264f8c4..d16cbec 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -837,7 +837,7 @@ wlc_phy_table_addr(struct brcms_phy *pi, uint tbl_id, uint tbl_offset,
pi->tbl_data_hi = tblDataHi;
pi->tbl_data_lo = tblDataLo;

- if (pi->sh->chip == BCM43224_CHIP_ID &&
+ if (pi->sh->chip == BCMA_CHIP_ID_BCM43224 &&
pi->sh->chiprev == 1) {
pi->tbl_addr = tblAddr;
pi->tbl_save_id = tbl_id;
@@ -847,7 +847,7 @@ wlc_phy_table_addr(struct brcms_phy *pi, uint tbl_id, uint tbl_offset,

void wlc_phy_table_data_write(struct brcms_phy *pi, uint width, u32 val)
{
- if ((pi->sh->chip == BCM43224_CHIP_ID) &&
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
(pi->sh->chiprev == 1) &&
(pi->tbl_save_id == NPHY_TBL_ID_ANTSWCTRLLUT)) {
read_phy_reg(pi, pi->tbl_data_lo);
@@ -881,7 +881,7 @@ wlc_phy_write_table(struct brcms_phy *pi, const struct phytbl_info *ptbl_info,

for (idx = 0; idx < ptbl_info->tbl_len; idx++) {

- if ((pi->sh->chip == BCM43224_CHIP_ID) &&
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
(pi->sh->chiprev == 1) &&
(tbl_id == NPHY_TBL_ID_ANTSWCTRLLUT)) {
read_phy_reg(pi, tblDataLo);
@@ -918,7 +918,7 @@ wlc_phy_read_table(struct brcms_phy *pi, const struct phytbl_info *ptbl_info,

for (idx = 0; idx < ptbl_info->tbl_len; idx++) {

- if ((pi->sh->chip == BCM43224_CHIP_ID) &&
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
(pi->sh->chiprev == 1)) {
(void)read_phy_reg(pi, tblDataLo);

@@ -2894,7 +2894,7 @@ const u8 *wlc_phy_get_ofdm_rate_lookup(void)

void wlc_lcnphy_epa_switch(struct brcms_phy *pi, bool mode)
{
- if ((pi->sh->chip == BCM4313_CHIP_ID) &&
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM4313) &&
(pi->sh->boardflags & BFL_FEM)) {
if (mode) {
u16 txant = 0;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
index a4ae93e..14da744 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
@@ -19309,8 +19309,8 @@ void wlc_phy_init_nphy(struct brcms_phy *pi)
pi->measure_hold |= PHY_HOLD_FOR_NOT_ASSOC;

if ((ISNPHY(pi)) && (NREV_GE(pi->pubpi.phy_rev, 5)) &&
- ((pi->sh->chippkg == BCM4717_PKG_ID) ||
- (pi->sh->chippkg == BCM4718_PKG_ID))) {
+ ((pi->sh->chippkg == BCMA_PKG_ID_BCM4717) ||
+ (pi->sh->chippkg == BCMA_PKG_ID_BCM4718))) {
if ((pi->sh->boardflags & BFL_EXTLNA) &&
(CHSPEC_IS2G(pi->radio_chanspec)))
ai_cc_reg(pi->sh->sih,
@@ -20751,11 +20751,11 @@ wlc_phy_chanspec_radio2056_setup(struct brcms_phy *pi,
cascbias = 0x20;

if ((pi->sh->chip ==
- BCM43224_CHIP_ID)
+ BCMA_CHIP_ID_BCM43224)
|| (pi->sh->chip ==
- BCM43225_CHIP_ID)) {
+ BCMA_CHIP_ID_BCM43225)) {
if (pi->sh->chippkg ==
- BCM43224_FAB_SMIC) {
+ BCMA_PKG_ID_BCM43224_FAB_SMIC) {
bias = 0x2a;
cascbias = 0x38;
}
@@ -20863,9 +20863,9 @@ wlc_phy_chanspec_radio2056_setup(struct brcms_phy *pi,

cascbias = 0x30;

- if ((pi->sh->chip == BCM43224_CHIP_ID) ||
- (pi->sh->chip == BCM43225_CHIP_ID)) {
- if (pi->sh->chippkg == BCM43224_FAB_SMIC)
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
+ if (pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC)
cascbias = 0x35;
}

@@ -21193,8 +21193,8 @@ wlc_phy_chanspec_nphy_setup(struct brcms_phy *pi, u16 chanspec,
bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc, spuravoid);
wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);

- if ((pi->sh->chip == BCM43224_CHIP_ID) ||
- (pi->sh->chip == BCM43225_CHIP_ID)) {
+ if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) ||
+ (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
if (spuravoid == 1) {
bcma_write16(pi->d11core,
D11REGOFFS(tsf_clk_frac_l),
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
index 6b4344f..7e9df56 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
@@ -103,9 +103,9 @@ u16 si_pmu_fast_pwrup_delay(struct si_pub *sih)
uint delay = PMU_MAX_TRANSITION_DLY;

switch (ai_get_chip_id(sih)) {
- case BCM43224_CHIP_ID:
- case BCM43225_CHIP_ID:
- case BCM4313_CHIP_ID:
+ case BCMA_CHIP_ID_BCM43224:
+ case BCMA_CHIP_ID_BCM43225:
+ case BCMA_CHIP_ID_BCM4313:
delay = 3700;
break;
default:
@@ -156,9 +156,9 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
return clock;

switch (ai_get_chip_id(sih)) {
- case BCM43224_CHIP_ID:
- case BCM43225_CHIP_ID:
- case BCM4313_CHIP_ID:
+ case BCMA_CHIP_ID_BCM43224:
+ case BCMA_CHIP_ID_BCM43225:
+ case BCMA_CHIP_ID_BCM4313:
/* always 20Mhz */
clock = 20000 * 1000;
break;
--
1.7.9.5


2012-06-30 13:18:05

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 15/18] brcmsmac: fix DMA on SoCs

These extra offsets are only needed by PCIe devices and not when
running on an SoC.

This partly reverts commit:
commit 821e4e93172e4f7d5ac1eade04665c3dc5049c4a
Author: Roland Vossen <[email protected]>
Date: Mon Aug 8 15:58:58 2011 +0200

staging: brcm80211: removed unused bus code from softmac

Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/dma.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/dma.c b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
index b67b20c..f64c5cf 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
@@ -573,6 +573,7 @@ struct dma_pub *dma_attach(char *name, struct si_pub *sih,
struct dma_info *di;
u8 rev = core->id.rev;
uint size;
+ struct si_info *sii = container_of(sih, struct si_info, pub);

/* allocate private info structure */
di = kzalloc(sizeof(struct dma_info), GFP_ATOMIC);
@@ -633,11 +634,15 @@ struct dma_pub *dma_attach(char *name, struct si_pub *sih,
*/
di->ddoffsetlow = 0;
di->dataoffsetlow = 0;
- /* add offset for pcie with DMA64 bus */
- di->ddoffsetlow = 0;
- di->ddoffsethigh = SI_PCIE_DMA_H32;
+ /* for pci bus, add offset */
+ if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) {
+ /* add offset for pcie with DMA64 bus */
+ di->ddoffsetlow = 0;
+ di->ddoffsethigh = SI_PCIE_DMA_H32;
+ }
di->dataoffsetlow = di->ddoffsetlow;
di->dataoffsethigh = di->ddoffsethigh;
+
/* WAR64450 : DMACtl.Addr ext fields are not supported in SDIOD core. */
if ((core->id.id == BCMA_CORE_SDIO_DEV)
&& ((rev > 0) && (rev <= 2)))
--
1.7.9.5


2012-06-30 13:17:43

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 07/18] brcmsmac: remove si_pmu_spuravoid_pllupdate()

si_pmu_spuravoid_pllupdate() is now replaced by
bcma_pmu_spuravoid_pllupdate() which does the same thing, but supports
more chips.

This function is in my pending patch series for bcma.
Author: Hauke Mehrtens <[email protected]>
Date: Mon Jun 4 01:31:32 2012 +0200

bcma: add bcma_pmu_spuravoid_pllupdate()

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
.../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 3 +-
drivers/net/wireless/brcm80211/brcmsmac/pmu.c | 84 --------------------
drivers/net/wireless/brcm80211/brcmsmac/pmu.h | 1 -
3 files changed, 2 insertions(+), 86 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
index 3667181..a4ae93e 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
@@ -21106,6 +21106,7 @@ wlc_phy_chanspec_nphy_setup(struct brcms_phy *pi, u16 chanspec,
const struct nphy_sfo_cfg *ci)
{
u16 val;
+ struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);

val = read_phy_reg(pi, 0x09) & NPHY_BandControl_currentBand;
if (CHSPEC_IS5G(chanspec) && !val) {
@@ -21189,7 +21190,7 @@ wlc_phy_chanspec_nphy_setup(struct brcms_phy *pi, u16 chanspec,
spuravoid = 1;

wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
- si_pmu_spuravoid_pllupdate(pi->sh->sih, spuravoid);
+ bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc, spuravoid);
wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);

if ((pi->sh->chip == BCM43224_CHIP_ID) ||
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
index 045f43a..6b4344f 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
@@ -74,16 +74,6 @@
* PMU<rev>_PLL<num>_XX where <rev> is PMU corerev and <num> is an arbitrary
* number to differentiate different PLLs controlled by the same PMU rev.
*/
-/* pllcontrol registers:
- * ndiv_pwrdn, pwrdn_ch<x>, refcomp_pwrdn, dly_ch<x>,
- * p1div, p2div, _bypass_sdmod
- */
-#define PMU1_PLL0_PLLCTL0 0
-#define PMU1_PLL0_PLLCTL1 1
-#define PMU1_PLL0_PLLCTL2 2
-#define PMU1_PLL0_PLLCTL3 3
-#define PMU1_PLL0_PLLCTL4 4
-#define PMU1_PLL0_PLLCTL5 5

/* pmu XtalFreqRatio */
#define PMU_XTALFREQ_REG_ILPCTR_MASK 0x00001FFF
@@ -108,80 +98,6 @@
#define RES4313_HT_AVAIL_RSRC 14
#define RES4313_MACPHY_CLK_AVAIL_RSRC 15

-void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid)
-{
- u32 tmp = 0;
- struct si_info *sii = container_of(sih, struct si_info, pub);
- struct bcma_device *core;
-
- /* switch to chipc */
- core = sii->icbus->drv_cc.core;
-
- switch (ai_get_chip_id(sih)) {
- case BCM43224_CHIP_ID:
- case BCM43225_CHIP_ID:
- if (spuravoid == 1) {
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL0);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x11500010);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL1);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x000C0C06);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL2);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x0F600a08);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL3);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x00000000);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL4);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x2001E920);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL5);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x88888815);
- } else {
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL0);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x11100010);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL1);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x000c0c06);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL2);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x03000a08);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL3);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x00000000);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL4);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x200005c0);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
- PMU1_PLL0_PLLCTL5);
- bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
- 0x88888815);
- }
- tmp = 1 << 10;
- break;
-
- default:
- /* bail out */
- return;
- }
-
- bcma_set32(core, CHIPCREGOFFS(pmucontrol), tmp);
-}
-
u16 si_pmu_fast_pwrup_delay(struct si_pub *sih)
{
uint delay = PMU_MAX_TRANSITION_DLY;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pmu.h b/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
index 2f0ad28..f7cff87 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
@@ -26,7 +26,6 @@ extern u32 si_pmu_chipcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
extern u32 si_pmu_regcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
extern u32 si_pmu_alp_clock(struct si_pub *sih);
extern void si_pmu_pllupd(struct si_pub *sih);
-extern void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid);
extern u32 si_pmu_pllcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
extern u32 si_pmu_measure_alpclk(struct si_pub *sih);

--
1.7.9.5


2012-06-30 13:17:52

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v2 11/18] brcmsmac: remove some unnessessacry casts and void pointer

Acked-by: Arend van Spriel <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/main.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 478b374..8bad8b6 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4218,9 +4218,8 @@ static void brcms_c_radio_timer(void *arg)
}

/* common low-level watchdog code */
-static void brcms_b_watchdog(void *arg)
+static void brcms_b_watchdog(struct brcms_c_info *wlc)
{
- struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
struct brcms_hardware *wlc_hw = wlc->hw;

BCMMSG(wlc->wiphy, "wl%d\n", wlc_hw->unit);
@@ -4241,10 +4240,8 @@ static void brcms_b_watchdog(void *arg)
}

/* common watchdog code */
-static void brcms_c_watchdog(void *arg)
+static void brcms_c_watchdog(struct brcms_c_info *wlc)
{
- struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
-
BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);

if (!wlc->pub->up)
@@ -4284,7 +4281,9 @@ static void brcms_c_watchdog(void *arg)

static void brcms_c_watchdog_by_timer(void *arg)
{
- brcms_c_watchdog(arg);
+ struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
+
+ brcms_c_watchdog(wlc);
}

static bool brcms_c_timers_init(struct brcms_c_info *wlc, int unit)
--
1.7.9.5


2012-07-08 19:10:58

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 00/18] brcmsmac: update to get SoCs working

On 07/06/2012 08:35 PM, John W. Linville wrote:
> On Tue, Jul 03, 2012 at 09:13:13AM +0200, Arend van Spriel wrote:
>> On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
>>> This series contains some patches needed to get brcmsmac working on
>>> SoCs like the BCM4718.
>>> The last part which adds core rev 17 (used in the BCM4718) to the list
>>> of supported cores is missing, because we do not have a firmware
>>> supporting this core yet, but I extended the b43 fwcutter to generate
>>> a firmware which brcmsmac accepts. With this firmware my BCM4718
>>> works. I would appreciate an official firmware release from Broadcom
>>> adding support for this core.
>>> The final patch adding support for the BCM43224 is missing because
>>> the PCIe host controller on the BCM4718 still causes problems and I
>>> have to add some more read after writes into the code, for now it uses
>>> an ugly hack and sometimes the problems still occur.
>>>
>>> The wifi is not stable on the BCM4718, I had no problems connecting to
>>> my ath9k driven access point but I have problems connecting to my
>>> BCM47186 based AP running the vendor firmware with the Broadcom
>>> proprietary driver.
>>> I get 12MBit/s max with the BCM4718 connected to ath9k on the 2.4 GHz
>>> band and 35 MBit/s max with the BCM43224 on the 5Ghz band connected to
>>> a Broadcom based AP running the proprietary driver. This seams to be
>>> CPU bounced as I have over 50% sirq in both cases.
>>>
>>> brcmsmac starts on the BCM47186 (id: 0x5357), but it does not tx or rx
>>> any traffic.
>>>
>>> One patch extends the xmtfifo_sz array for more core revs, I just toke
>>> the values from the other phy-n cores and hope this is correct.
>>>
>>> These patches are depending on: "[PATCH v2 0/9] bcma misc updates" and
>>> based on wireless-testing.
>>>
>>> I will send a patch for bcma which converts the warning message when it
>>> found a PCI and not a PCIe card into a WARN.
>>>
>>> v2:
>>> - when something depends on a patch for bcma, which is not in
>>> wireless-testing yet, I add that to the commit comment.
>>> - removed changes for BCM43421 and BCM6362 as I do not have a device
>>> to test this.
>>> - xmtfifo_sz now starts at core rev 17 and contains the correct values
>>> for core rev 28
>>> - make brcms_c_chipmatch() also work for SoCs
>>> - typos and format changes
>>>
>>
>> I have acked all patches, but would like to do some sanity testing today.
>
> Have you had a chance to do this testing? Are you OK with this series?
>
> John
>

Yes, I am. Sorry for not getting back on that earlier.

Gr. AvS



2012-07-01 23:59:37

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v2 11/18] brcmsmac: remove some unnessessacry casts and void pointer

Hi Hauke,

On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
> Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> index 478b374..8bad8b6 100644
> --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
> +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> @@ -4241,10 +4240,8 @@ static void brcms_b_watchdog(void *arg)
> }
>
> /* common watchdog code */
> -static void brcms_c_watchdog(void *arg)
> +static void brcms_c_watchdog(struct brcms_c_info *wlc)
> {
> - struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
> -
> BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
>
> if (!wlc->pub->up)
> @@ -4284,7 +4281,9 @@ static void brcms_c_watchdog(void *arg)
>
> static void brcms_c_watchdog_by_timer(void *arg)
> {
> - brcms_c_watchdog(arg);
> + struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
> +
> + brcms_c_watchdog(wlc);

You remove 2 cases of this pattern in your patch then add one. Why?

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/
.Plan: http://sites.google.com/site/juliancalaby/

2012-07-03 07:10:49

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 15/18] brcmsmac: fix DMA on SoCs

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> These extra offsets are only needed by PCIe devices and not when
> running on an SoC.
>
> This partly reverts commit:
> commit 821e4e93172e4f7d5ac1eade04665c3dc5049c4a
> Author: Roland Vossen <[email protected]>
> Date: Mon Aug 8 15:58:58 2011 +0200
>
> staging: brcm80211: removed unused bus code from softmac
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/dma.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)

Gr. AvS




2012-07-02 17:45:05

by Hauke Mehrtens

[permalink] [raw]
Subject: Re: [PATCH v2 11/18] brcmsmac: remove some unnessessacry casts and void pointer

On 07/02/2012 09:54 AM, Dominique Martinet wrote:
> Julian Calaby wrote on Mon, Jul 02, 2012 :
>> On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
>>> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>> index 478b374..8bad8b6 100644
>>> --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>> +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>> @@ -4241,10 +4240,8 @@ static void brcms_b_watchdog(void *arg)
>>> }
>>>
>>> /* common watchdog code */
>>> -static void brcms_c_watchdog(void *arg)
>>> +static void brcms_c_watchdog(struct brcms_c_info *wlc)
>>> {
>>> - struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
>>> -
>>> BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
>>>
>>> if (!wlc->pub->up)
>>> @@ -4284,7 +4281,9 @@ static void brcms_c_watchdog(void *arg)
>>>
>>> static void brcms_c_watchdog_by_timer(void *arg)
>>> {
>>> - brcms_c_watchdog(arg);
>>> + struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
>>> +
>>> + brcms_c_watchdog(wlc);
>>
>> You remove 2 cases of this pattern in your patch then add one. Why?
>
> I'm not Hauke :) but as far as I understand, brcms_c_watchdog_by_timer
> is used by brcms_init_timer which expects a void (*fn) (void *); and
> which is also used with brcms_c_radio_timer
> Admitedly, brcms_c_radio_timer also uses a struct brcms_c_info* as
> argument, so everything could be change this way, but I think it's not
> completely insane to keep callbacks as void* :)
>
> I also see the point of removing this "pattern" since it makes it easier
> to understand with the proper type information.
>
> Regards,
>
Yes Dominique is right, that's the reason. I wanted to eliminate some of
the void *args. I left the void *args when it was called by a callback
function.

Hauke

2012-07-03 07:08:50

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 13/18] brcmsmac: add some workarounds for other chips again

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> This adds some workarounds for the BCM4716, BCM47162, BCM5357 to the
> phy code again. This patch reverts parts of the following patch.
>
> commit c2c724977f95135f397fe0cb45f3c041d26b91e1
> Author: Arend van Spriel <[email protected]>
> Date: Wed Jun 29 16:46:35 2011 -0700
>
> staging: brcm80211: remove unsupported chipset code from brcmsmac phy
>
> The BCM4716 is working for me with an other firmware and I am working
> on adding support for the other chips.
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> .../net/wireless/brcm80211/brcmsmac/phy/phy_n.c | 131 +++++++++++++-------
> 1 file changed, 89 insertions(+), 42 deletions(-)

Gr. AvS




2012-07-03 07:07:02

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 12/18] brcmsmac: add a conditions for core rev 17 again

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> This reverts some changes made in this commit:
> commit 7234592364e2efe8b4ac1040c99b1d7ef01cf502
> Author: Roland Vossen <[email protected]>
> Date: Mon Feb 14 12:16:45 2011 +0100
>
> staging: brcm80211: removal of inactive d11 code
>
> The bcm4716 has a rev 17 wireless core and this condition is needed.
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)

Gr. AvS




2012-07-03 07:09:09

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 14/18] brcmsmac: extend xmtfifo_sz array

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> The xmtfifo_sz array contains the queue sizes for the different core
> revs. This array missed the sizes for the core rev 17 and 28. This
> patch extends the array to also include these sizes and adds a warning
> if no queue size is stored in the array for the given core rev.
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 24 +++++++++++++++++++++++-
> 1 file changed, 23 insertions(+), 1 deletion(-)

Gr. AvS




2012-07-02 00:05:16

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v2 00/18] brcmsmac: update to get SoCs working

Hi Hauke,

On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
> This series contains some patches needed to get brcmsmac working on
> SoCs like the BCM4718.

I've replied to a couple of patches with some minor nits. I'm sorry I
didn't notice these when you sent these patches the first time.

I don't think any of my comments are significant enough to require
another round of patches.

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/
.Plan: http://sites.google.com/site/juliancalaby/

2012-07-02 23:01:44

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v2 11/18] brcmsmac: remove some unnessessacry casts and void pointer

Hi Hauke,

On Tue, Jul 3, 2012 at 3:44 AM, Hauke Mehrtens <[email protected]> wrote:
> On 07/02/2012 09:54 AM, Dominique Martinet wrote:
>> Julian Calaby wrote on Mon, Jul 02, 2012 :
>>> On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
>>>> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>>> index 478b374..8bad8b6 100644
>>>> --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>>> +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
>>>> @@ -4241,10 +4240,8 @@ static void brcms_b_watchdog(void *arg)
>>>> }
>>>>
>>>> /* common watchdog code */
>>>> -static void brcms_c_watchdog(void *arg)
>>>> +static void brcms_c_watchdog(struct brcms_c_info *wlc)
>>>> {
>>>> - struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
>>>> -
>>>> BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
>>>>
>>>> if (!wlc->pub->up)
>>>> @@ -4284,7 +4281,9 @@ static void brcms_c_watchdog(void *arg)
>>>>
>>>> static void brcms_c_watchdog_by_timer(void *arg)
>>>> {
>>>> - brcms_c_watchdog(arg);
>>>> + struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
>>>> +
>>>> + brcms_c_watchdog(wlc);
>>>
>>> You remove 2 cases of this pattern in your patch then add one. Why?
>>
>> I'm not Hauke :) but as far as I understand, brcms_c_watchdog_by_timer
>> is used by brcms_init_timer which expects a void (*fn) (void *); and
>> which is also used with brcms_c_radio_timer
>> Admitedly, brcms_c_radio_timer also uses a struct brcms_c_info* as
>> argument, so everything could be change this way, but I think it's not
>> completely insane to keep callbacks as void* :)
>>
>> I also see the point of removing this "pattern" since it makes it easier
>> to understand with the proper type information.
>>
>> Regards,
>>
> Yes Dominique is right, that's the reason. I wanted to eliminate some of
> the void *args. I left the void *args when it was called by a callback
> function.

Fair enough then, it just looked odd next to all the other changes.

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/
.Plan: http://sites.google.com/site/juliancalaby/

2012-07-03 07:11:45

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 18/18] brcmsmac: handle non PCI devices in the phy code

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> Some code in write_{radio,radio}_reg() should just be run if this is a
> pci based device. Add the condition again which was removed in commit:
> commit 821e4e93172e4f7d5ac1eade04665c3dc5049c4a
> Author: Roland Vossen <[email protected]>
> Date: Mon Aug 8 15:58:58 2011 +0200
>
> staging: brcm80211: removed unused bus code from softmac
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> .../net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)

Gr. AvS




2012-07-03 07:11:23

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 16/18] brcmsmac: extend brcms_c_chipmatch() to also handle non PCIe devices

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> Now brcms_c_chipmatch() is also able to handle non PCI devices and also
> does some checking for SoC if they are supported by brcmsmac.
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> .../net/wireless/brcm80211/brcmsmac/mac80211_if.c | 3 +-
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 38 ++++++++++++++++----
> drivers/net/wireless/brcm80211/brcmsmac/pub.h | 2 +-
> 3 files changed, 34 insertions(+), 9 deletions(-)

Gr. AvS




2012-07-02 08:04:31

by Dominique Martinet

[permalink] [raw]
Subject: Re: [PATCH v2 11/18] brcmsmac: remove some unnessessacry casts and void pointer

Julian Calaby wrote on Mon, Jul 02, 2012 :
> On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
> > diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> > index 478b374..8bad8b6 100644
> > --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
> > +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> > @@ -4241,10 +4240,8 @@ static void brcms_b_watchdog(void *arg)
> > }
> >
> > /* common watchdog code */
> > -static void brcms_c_watchdog(void *arg)
> > +static void brcms_c_watchdog(struct brcms_c_info *wlc)
> > {
> > - struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
> > -
> > BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
> >
> > if (!wlc->pub->up)
> > @@ -4284,7 +4281,9 @@ static void brcms_c_watchdog(void *arg)
> >
> > static void brcms_c_watchdog_by_timer(void *arg)
> > {
> > - brcms_c_watchdog(arg);
> > + struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
> > +
> > + brcms_c_watchdog(wlc);
>
> You remove 2 cases of this pattern in your patch then add one. Why?

I'm not Hauke :) but as far as I understand, brcms_c_watchdog_by_timer
is used by brcms_init_timer which expects a void (*fn) (void *); and
which is also used with brcms_c_radio_timer
Admitedly, brcms_c_radio_timer also uses a struct brcms_c_info* as
argument, so everything could be change this way, but I think it's not
completely insane to keep callbacks as void* :)

I also see the point of removing this "pattern" since it makes it easier
to understand with the proper type information.

Regards,
--
Asmadeus | Dominique Martinet

2012-07-03 07:13:29

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 00/18] brcmsmac: update to get SoCs working

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> This series contains some patches needed to get brcmsmac working on
> SoCs like the BCM4718.
> The last part which adds core rev 17 (used in the BCM4718) to the list
> of supported cores is missing, because we do not have a firmware
> supporting this core yet, but I extended the b43 fwcutter to generate
> a firmware which brcmsmac accepts. With this firmware my BCM4718
> works. I would appreciate an official firmware release from Broadcom
> adding support for this core.
> The final patch adding support for the BCM43224 is missing because
> the PCIe host controller on the BCM4718 still causes problems and I
> have to add some more read after writes into the code, for now it uses
> an ugly hack and sometimes the problems still occur.
>
> The wifi is not stable on the BCM4718, I had no problems connecting to
> my ath9k driven access point but I have problems connecting to my
> BCM47186 based AP running the vendor firmware with the Broadcom
> proprietary driver.
> I get 12MBit/s max with the BCM4718 connected to ath9k on the 2.4 GHz
> band and 35 MBit/s max with the BCM43224 on the 5Ghz band connected to
> a Broadcom based AP running the proprietary driver. This seams to be
> CPU bounced as I have over 50% sirq in both cases.
>
> brcmsmac starts on the BCM47186 (id: 0x5357), but it does not tx or rx
> any traffic.
>
> One patch extends the xmtfifo_sz array for more core revs, I just toke
> the values from the other phy-n cores and hope this is correct.
>
> These patches are depending on: "[PATCH v2 0/9] bcma misc updates" and
> based on wireless-testing.
>
> I will send a patch for bcma which converts the warning message when it
> found a PCI and not a PCIe card into a WARN.
>
> v2:
> - when something depends on a patch for bcma, which is not in
> wireless-testing yet, I add that to the commit comment.
> - removed changes for BCM43421 and BCM6362 as I do not have a device
> to test this.
> - xmtfifo_sz now starts at core rev 17 and contains the correct values
> for core rev 28
> - make brcms_c_chipmatch() also work for SoCs
> - typos and format changes
>

I have acked all patches, but would like to do some sanity testing today.

Gr. AvS




2012-07-02 18:17:05

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH v3 14/18] brcmsmac: extend xmtfifo_sz array

The xmtfifo_sz array contains the queue sizes for the different core
revs. This array missed the sizes for the core rev 17 and 28. This
patch extends the array to also include these sizes and adds a warning
if no queue size is stored in the array for the given core rev.

Signed-off-by: Hauke Mehrtens <[email protected]>
---
drivers/net/wireless/brcm80211/brcmsmac/main.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 547ae5b..942ef99 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -269,7 +269,7 @@ struct brcms_c_bit_desc {
*/

/* Starting corerev for the fifo size table */
-#define XMTFIFOTBL_STARTREV 20
+#define XMTFIFOTBL_STARTREV 17

struct d11init {
__le16 addr;
@@ -333,6 +333,12 @@ const u8 wlc_prio2prec_map[] = {
};

static const u16 xmtfifo_sz[][NFIFO] = {
+ /* corerev 17: 5120, 49152, 49152, 5376, 4352, 1280 */
+ {20, 192, 192, 21, 17, 5},
+ /* corerev 18: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 19: */
+ {0, 0, 0, 0, 0, 0},
/* corerev 20: 5120, 49152, 49152, 5376, 4352, 1280 */
{20, 192, 192, 21, 17, 5},
/* corerev 21: 2304, 14848, 5632, 3584, 3584, 1280 */
@@ -343,6 +349,14 @@ static const u16 xmtfifo_sz[][NFIFO] = {
{20, 192, 192, 21, 17, 5},
/* corerev 24: 2304, 14848, 5632, 3584, 3584, 1280 */
{9, 58, 22, 14, 14, 5},
+ /* corerev 25: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 26: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 27: */
+ {0, 0, 0, 0, 0, 0},
+ /* corerev 28: 2304, 14848, 5632, 3584, 3584, 1280 */
+ {9, 58, 22, 14, 14, 5},
};

#ifdef DEBUG
@@ -4596,8 +4610,12 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
wlc_hw->machwcap_backup = wlc_hw->machwcap;

/* init tx fifo size */
+ WARN_ON((wlc_hw->corerev - XMTFIFOTBL_STARTREV) < 0 ||
+ (wlc_hw->corerev - XMTFIFOTBL_STARTREV) >
+ ARRAY_SIZE(xmtfifo_sz));
wlc_hw->xmtfifo_sz =
xmtfifo_sz[(wlc_hw->corerev - XMTFIFOTBL_STARTREV)];
+ WARN_ON(!wlc_hw->xmtfifo_sz[0]);

/* Get a phy for this band */
wlc_hw->band->pi =
--
1.7.9.5


2012-07-03 07:07:35

by Arend van Spriel

[permalink] [raw]
Subject: Re: [PATCH v2 01/18] brcmsmac: remove PCIE() macro

On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> Instead of checking if there is a PCIe core on the bus, better check if
> hosttype is PCIe.
>
> In the original submission to staging PCIE() checked, if the bustype is
> PCI and the buscore is a PCIe core. Now we assume that all cores bcma
> supports are PCIe based, so we just have to check if the bustype is PCI.
>
> The old code bcmsmac currently uses searches for a PCIe core on the bus
> and if there is one assumes that this is the buscore, which is wrong.
> Some SoCs have a PCIe core operating in host mode and this is not the
> bus core. The old code also caused a null pointer in
> ai_get_buscoretype() and ai_get_buscorerev() if buscore was not set
> because there was no PCIe core on the bus.
>
Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/aiutils.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)

Gr. AvS


2012-07-06 18:48:28

by John W. Linville

[permalink] [raw]
Subject: Re: [PATCH v2 00/18] brcmsmac: update to get SoCs working

On Tue, Jul 03, 2012 at 09:13:13AM +0200, Arend van Spriel wrote:
> On 06/30/2012 03:16 PM, Hauke Mehrtens wrote:
> > This series contains some patches needed to get brcmsmac working on
> > SoCs like the BCM4718.
> > The last part which adds core rev 17 (used in the BCM4718) to the list
> > of supported cores is missing, because we do not have a firmware
> > supporting this core yet, but I extended the b43 fwcutter to generate
> > a firmware which brcmsmac accepts. With this firmware my BCM4718
> > works. I would appreciate an official firmware release from Broadcom
> > adding support for this core.
> > The final patch adding support for the BCM43224 is missing because
> > the PCIe host controller on the BCM4718 still causes problems and I
> > have to add some more read after writes into the code, for now it uses
> > an ugly hack and sometimes the problems still occur.
> >
> > The wifi is not stable on the BCM4718, I had no problems connecting to
> > my ath9k driven access point but I have problems connecting to my
> > BCM47186 based AP running the vendor firmware with the Broadcom
> > proprietary driver.
> > I get 12MBit/s max with the BCM4718 connected to ath9k on the 2.4 GHz
> > band and 35 MBit/s max with the BCM43224 on the 5Ghz band connected to
> > a Broadcom based AP running the proprietary driver. This seams to be
> > CPU bounced as I have over 50% sirq in both cases.
> >
> > brcmsmac starts on the BCM47186 (id: 0x5357), but it does not tx or rx
> > any traffic.
> >
> > One patch extends the xmtfifo_sz array for more core revs, I just toke
> > the values from the other phy-n cores and hope this is correct.
> >
> > These patches are depending on: "[PATCH v2 0/9] bcma misc updates" and
> > based on wireless-testing.
> >
> > I will send a patch for bcma which converts the warning message when it
> > found a PCI and not a PCIe card into a WARN.
> >
> > v2:
> > - when something depends on a patch for bcma, which is not in
> > wireless-testing yet, I add that to the commit comment.
> > - removed changes for BCM43421 and BCM6362 as I do not have a device
> > to test this.
> > - xmtfifo_sz now starts at core rev 17 and contains the correct values
> > for core rev 28
> > - make brcms_c_chipmatch() also work for SoCs
> > - typos and format changes
> >
>
> I have acked all patches, but would like to do some sanity testing today.

Have you had a chance to do this testing? Are you OK with this series?

John
--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2012-07-02 00:01:39

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v2 14/18] brcmsmac: extend xmtfifo_sz array

Hi Hauke,

On Sat, Jun 30, 2012 at 11:16 PM, Hauke Mehrtens <[email protected]> wrote:
> The xmtfifo_sz array contains the queue sizes for the different core
> revs. This array missed the sizes for the core rev 17 and 28. This
> patch extends the array to also include these sizes and adds a warning
> if no queue size is stored in the array for the given core rev.
>
> Signed-off-by: Hauke Mehrtens <[email protected]>
> ---
> drivers/net/wireless/brcm80211/brcmsmac/main.c | 24 +++++++++++++++++++++++-
> 1 file changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> index 547ae5b..46d7646 100644
> --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
> +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
> @@ -343,6 +349,18 @@ static const u16 xmtfifo_sz[][NFIFO] = {
> {20, 192, 192, 21, 17, 5},
> /* corerev 24: 2304, 14848, 5632, 3584, 3584, 1280 */
> {9, 58, 22, 14, 14, 5},
> + /* corerev 25: */
> + {0, 0, 0, 0, 0, 0},
> + /* corerev 26: */
> + {0, 0, 0, 0, 0, 0},
> + /* corerev 27: */
> + {0, 0, 0, 0, 0, 0},
> + /* corerev 28: 2304, 14848, 5632, 3584, 3584, 1280 */
> + {9, 58, 22, 14, 14, 5},
> + /* corerev 29: */
> + {0, 0, 0, 0, 0, 0},
> + /* corerev 30: */
> + {0, 0, 0, 0, 0, 0},

Why add data for 29 and 30?

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/
.Plan: http://sites.google.com/site/juliancalaby/