mirror of https://github.com/hak5/openwrt.git
4466 lines
134 KiB
Diff
4466 lines
134 KiB
Diff
--- a/drivers/net/wireless/brcm80211/brcmsmac/Makefile
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/Makefile
|
|
@@ -39,10 +39,7 @@ BRCMSMAC_OFILES := \
|
|
phy/phytbl_lcn.o \
|
|
phy/phytbl_n.o \
|
|
phy/phy_qmath.o \
|
|
- otp.o \
|
|
- srom.o \
|
|
dma.o \
|
|
- nicpci.o \
|
|
brcms_trace_events.o
|
|
|
|
MODULEPFX := brcmsmac
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
|
|
@@ -22,7 +22,6 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/printk.h>
|
|
#include <linux/delay.h>
|
|
-#include <linux/pci.h>
|
|
|
|
#include <defs.h>
|
|
#include <chipcommon.h>
|
|
@@ -32,8 +31,6 @@
|
|
#include "types.h"
|
|
#include "pub.h"
|
|
#include "pmu.h"
|
|
-#include "srom.h"
|
|
-#include "nicpci.h"
|
|
#include "aiutils.h"
|
|
|
|
/* slow_clk_ctl */
|
|
@@ -324,7 +321,6 @@
|
|
#define IS_SIM(chippkg) \
|
|
((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))
|
|
|
|
-#define PCI(sih) (ai_get_buscoretype(sih) == PCI_CORE_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))
|
|
@@ -457,36 +453,9 @@ struct aidmp {
|
|
u32 componentid3; /* 0xffc */
|
|
};
|
|
|
|
-/* return true if PCIE capability exists in the pci config space */
|
|
-static bool ai_ispcie(struct si_info *sii)
|
|
-{
|
|
- u8 cap_ptr;
|
|
-
|
|
- cap_ptr =
|
|
- pcicore_find_pci_capability(sii->pcibus, PCI_CAP_ID_EXP, NULL,
|
|
- NULL);
|
|
- if (!cap_ptr)
|
|
- return false;
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-static bool ai_buscore_prep(struct si_info *sii)
|
|
-{
|
|
- /* kludge to enable the clock on the 4306 which lacks a slowclock */
|
|
- if (!ai_ispcie(sii))
|
|
- ai_clkctl_xtal(&sii->pub, XTAL | PLL, ON);
|
|
- return true;
|
|
-}
|
|
-
|
|
static bool
|
|
ai_buscore_setup(struct si_info *sii, struct bcma_device *cc)
|
|
{
|
|
- struct bcma_device *pci = NULL;
|
|
- struct bcma_device *pcie = NULL;
|
|
- struct bcma_device *core;
|
|
-
|
|
-
|
|
/* no cores found, bail out */
|
|
if (cc->bus->nr_cores == 0)
|
|
return false;
|
|
@@ -495,8 +464,7 @@ ai_buscore_setup(struct si_info *sii, st
|
|
sii->pub.ccrev = cc->id.rev;
|
|
|
|
/* get chipcommon chipstatus */
|
|
- if (ai_get_ccrev(&sii->pub) >= 11)
|
|
- sii->chipst = bcma_read32(cc, CHIPCREGOFFS(chipstatus));
|
|
+ sii->chipst = bcma_read32(cc, CHIPCREGOFFS(chipstatus));
|
|
|
|
/* get chipcommon capabilites */
|
|
sii->pub.cccaps = bcma_read32(cc, CHIPCREGOFFS(capabilities));
|
|
@@ -509,64 +477,18 @@ ai_buscore_setup(struct si_info *sii, st
|
|
}
|
|
|
|
/* figure out buscore */
|
|
- list_for_each_entry(core, &cc->bus->cores, list) {
|
|
- uint cid, crev;
|
|
-
|
|
- cid = core->id.id;
|
|
- crev = core->id.rev;
|
|
-
|
|
- if (cid == PCI_CORE_ID) {
|
|
- pci = core;
|
|
- } else if (cid == PCIE_CORE_ID) {
|
|
- pcie = core;
|
|
- }
|
|
- }
|
|
-
|
|
- if (pci && pcie) {
|
|
- if (ai_ispcie(sii))
|
|
- pci = NULL;
|
|
- else
|
|
- pcie = NULL;
|
|
- }
|
|
- if (pci) {
|
|
- sii->buscore = pci;
|
|
- } else if (pcie) {
|
|
- sii->buscore = pcie;
|
|
- }
|
|
-
|
|
- /* fixup necessary chip/core configurations */
|
|
- if (!sii->pch) {
|
|
- sii->pch = pcicore_init(&sii->pub, sii->icbus->drv_pci.core);
|
|
- if (sii->pch == NULL)
|
|
- return false;
|
|
- }
|
|
- if (ai_pci_fixcfg(&sii->pub))
|
|
- return false;
|
|
+ sii->buscore = ai_findcore(&sii->pub, PCIE_CORE_ID, 0);
|
|
|
|
return true;
|
|
}
|
|
|
|
-/*
|
|
- * get boardtype and boardrev
|
|
- */
|
|
-static __used void ai_nvram_process(struct si_info *sii)
|
|
-{
|
|
- uint w = 0;
|
|
-
|
|
- /* do a pci config read to get subsystem id and subvendor id */
|
|
- pci_read_config_dword(sii->pcibus, PCI_SUBSYSTEM_VENDOR_ID, &w);
|
|
-
|
|
- sii->pub.boardvendor = w & 0xffff;
|
|
- sii->pub.boardtype = (w >> 16) & 0xffff;
|
|
-}
|
|
-
|
|
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;
|
|
- uint socitype;
|
|
+ struct ssb_sprom *sprom = &pbus->sprom;
|
|
|
|
savewin = 0;
|
|
|
|
@@ -576,38 +498,15 @@ static struct si_info *ai_doattach(struc
|
|
/* switch to Chipcommon core */
|
|
cc = pbus->drv_cc.core;
|
|
|
|
- /* bus/core/clk setup for register access */
|
|
- if (!ai_buscore_prep(sii))
|
|
- return NULL;
|
|
+ sih->chip = pbus->chipinfo.id;
|
|
+ sih->chiprev = pbus->chipinfo.rev;
|
|
+ sih->chippkg = pbus->chipinfo.pkg;
|
|
+ sih->boardvendor = pbus->boardinfo.vendor;
|
|
+ sih->boardtype = pbus->boardinfo.type;
|
|
|
|
- /*
|
|
- * ChipID recognition.
|
|
- * We assume we can read chipid at offset 0 from the regs arg.
|
|
- * If we add other chiptypes (or if we need to support old sdio
|
|
- * hosts w/o chipcommon), some way of recognizing them needs to
|
|
- * be added here.
|
|
- */
|
|
- w = bcma_read32(cc, CHIPCREGOFFS(chipid));
|
|
- socitype = (w & CID_TYPE_MASK) >> CID_TYPE_SHIFT;
|
|
- /* Might as wll fill in chip id rev & pkg */
|
|
- sih->chip = w & CID_ID_MASK;
|
|
- sih->chiprev = (w & CID_REV_MASK) >> CID_REV_SHIFT;
|
|
- sih->chippkg = (w & CID_PKG_MASK) >> CID_PKG_SHIFT;
|
|
-
|
|
- /* scan for cores */
|
|
- if (socitype != SOCI_AI)
|
|
- return NULL;
|
|
-
|
|
- SI_MSG("Found chip type AI (0x%08x)\n", w);
|
|
if (!ai_buscore_setup(sii, cc))
|
|
goto exit;
|
|
|
|
- /* Init nvram from sprom/otp if they exist */
|
|
- if (srom_var_init(&sii->pub))
|
|
- goto exit;
|
|
-
|
|
- ai_nvram_process(sii);
|
|
-
|
|
/* === NVRAM, clock is ready === */
|
|
bcma_write32(cc, CHIPCREGOFFS(gpiopullup), 0);
|
|
bcma_write32(cc, CHIPCREGOFFS(gpiopulldown), 0);
|
|
@@ -620,15 +519,13 @@ static struct si_info *ai_doattach(struc
|
|
}
|
|
|
|
/* setup the GPIO based LED powersave register */
|
|
- w = getintvar(sih, BRCMS_SROM_LEDDC);
|
|
+ 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 (PCIE(sih))
|
|
- pcicore_attach(sii->pch, SI_DOATTACH);
|
|
-
|
|
if (ai_get_chip_id(sih) == BCM43224_CHIP_ID) {
|
|
/*
|
|
* enable 12 mA drive strenth for 43224 and
|
|
@@ -662,9 +559,6 @@ static struct si_info *ai_doattach(struc
|
|
return sii;
|
|
|
|
exit:
|
|
- if (sii->pch)
|
|
- pcicore_deinit(sii->pch);
|
|
- sii->pch = NULL;
|
|
|
|
return NULL;
|
|
}
|
|
@@ -703,11 +597,6 @@ void ai_detach(struct si_pub *sih)
|
|
if (sii == NULL)
|
|
return;
|
|
|
|
- if (sii->pch)
|
|
- pcicore_deinit(sii->pch);
|
|
- sii->pch = NULL;
|
|
-
|
|
- srom_free_vars(sih);
|
|
kfree(sii);
|
|
}
|
|
|
|
@@ -758,21 +647,7 @@ uint ai_cc_reg(struct si_pub *sih, uint
|
|
/* return the slow clock source - LPO, XTAL, or PCI */
|
|
static uint ai_slowclk_src(struct si_pub *sih, struct bcma_device *cc)
|
|
{
|
|
- struct si_info *sii;
|
|
- u32 val;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
- if (ai_get_ccrev(&sii->pub) < 6) {
|
|
- pci_read_config_dword(sii->pcibus, PCI_GPIO_OUT,
|
|
- &val);
|
|
- if (val & PCI_CFG_GPIO_SCS)
|
|
- return SCC_SS_PCI;
|
|
- return SCC_SS_XTAL;
|
|
- } else if (ai_get_ccrev(&sii->pub) < 10) {
|
|
- return bcma_read32(cc, CHIPCREGOFFS(slow_clk_ctl)) &
|
|
- SCC_SS_MASK;
|
|
- } else /* Insta-clock */
|
|
- return SCC_SS_XTAL;
|
|
+ return SCC_SS_XTAL;
|
|
}
|
|
|
|
/*
|
|
@@ -782,36 +657,12 @@ static uint ai_slowclk_src(struct si_pub
|
|
static uint ai_slowclk_freq(struct si_pub *sih, bool max_freq,
|
|
struct bcma_device *cc)
|
|
{
|
|
- u32 slowclk;
|
|
uint div;
|
|
|
|
- slowclk = ai_slowclk_src(sih, cc);
|
|
- if (ai_get_ccrev(sih) < 6) {
|
|
- if (slowclk == SCC_SS_PCI)
|
|
- return max_freq ? (PCIMAXFREQ / 64)
|
|
- : (PCIMINFREQ / 64);
|
|
- else
|
|
- return max_freq ? (XTALMAXFREQ / 32)
|
|
- : (XTALMINFREQ / 32);
|
|
- } else if (ai_get_ccrev(sih) < 10) {
|
|
- div = 4 *
|
|
- (((bcma_read32(cc, CHIPCREGOFFS(slow_clk_ctl)) &
|
|
- SCC_CD_MASK) >> SCC_CD_SHIFT) + 1);
|
|
- if (slowclk == SCC_SS_LPO)
|
|
- return max_freq ? LPOMAXFREQ : LPOMINFREQ;
|
|
- else if (slowclk == SCC_SS_XTAL)
|
|
- return max_freq ? (XTALMAXFREQ / div)
|
|
- : (XTALMINFREQ / div);
|
|
- else if (slowclk == SCC_SS_PCI)
|
|
- return max_freq ? (PCIMAXFREQ / div)
|
|
- : (PCIMINFREQ / div);
|
|
- } else {
|
|
- /* Chipc rev 10 is InstaClock */
|
|
- div = bcma_read32(cc, CHIPCREGOFFS(system_clk_ctl));
|
|
- div = 4 * ((div >> SYCC_CD_SHIFT) + 1);
|
|
- return max_freq ? XTALMAXFREQ : (XTALMINFREQ / div);
|
|
- }
|
|
- return 0;
|
|
+ /* Chipc rev 10 is InstaClock */
|
|
+ div = bcma_read32(cc, CHIPCREGOFFS(system_clk_ctl));
|
|
+ div = 4 * ((div >> SYCC_CD_SHIFT) + 1);
|
|
+ return max_freq ? XTALMAXFREQ : (XTALMINFREQ / div);
|
|
}
|
|
|
|
static void
|
|
@@ -834,8 +685,7 @@ ai_clkctl_setdelay(struct si_pub *sih, s
|
|
|
|
/* Starting with 4318 it is ILP that is used for the delays */
|
|
slowmaxfreq =
|
|
- ai_slowclk_freq(sih,
|
|
- (ai_get_ccrev(sih) >= 10) ? false : true, cc);
|
|
+ ai_slowclk_freq(sih, false, cc);
|
|
|
|
pll_on_delay = ((slowmaxfreq * pll_delay) + 999999) / 1000000;
|
|
fref_sel_delay = ((slowmaxfreq * FREF_DELAY) + 999999) / 1000000;
|
|
@@ -857,9 +707,8 @@ void ai_clkctl_init(struct si_pub *sih)
|
|
return;
|
|
|
|
/* set all Instaclk chip ILP to 1 MHz */
|
|
- if (ai_get_ccrev(sih) >= 10)
|
|
- bcma_maskset32(cc, CHIPCREGOFFS(system_clk_ctl), SYCC_CD_MASK,
|
|
- (ILP_DIV_1MHZ << SYCC_CD_SHIFT));
|
|
+ bcma_maskset32(cc, CHIPCREGOFFS(system_clk_ctl), SYCC_CD_MASK,
|
|
+ (ILP_DIV_1MHZ << SYCC_CD_SHIFT));
|
|
|
|
ai_clkctl_setdelay(sih, cc);
|
|
}
|
|
@@ -894,140 +743,6 @@ u16 ai_clkctl_fast_pwrup_delay(struct si
|
|
return fpdelay;
|
|
}
|
|
|
|
-/* turn primary xtal and/or pll off/on */
|
|
-int ai_clkctl_xtal(struct si_pub *sih, uint what, bool on)
|
|
-{
|
|
- struct si_info *sii;
|
|
- u32 in, out, outen;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
-
|
|
- /* pcie core doesn't have any mapping to control the xtal pu */
|
|
- if (PCIE(sih))
|
|
- return -1;
|
|
-
|
|
- pci_read_config_dword(sii->pcibus, PCI_GPIO_IN, &in);
|
|
- pci_read_config_dword(sii->pcibus, PCI_GPIO_OUT, &out);
|
|
- pci_read_config_dword(sii->pcibus, PCI_GPIO_OUTEN, &outen);
|
|
-
|
|
- /*
|
|
- * Avoid glitching the clock if GPRS is already using it.
|
|
- * We can't actually read the state of the PLLPD so we infer it
|
|
- * by the value of XTAL_PU which *is* readable via gpioin.
|
|
- */
|
|
- if (on && (in & PCI_CFG_GPIO_XTAL))
|
|
- return 0;
|
|
-
|
|
- if (what & XTAL)
|
|
- outen |= PCI_CFG_GPIO_XTAL;
|
|
- if (what & PLL)
|
|
- outen |= PCI_CFG_GPIO_PLL;
|
|
-
|
|
- if (on) {
|
|
- /* turn primary xtal on */
|
|
- if (what & XTAL) {
|
|
- out |= PCI_CFG_GPIO_XTAL;
|
|
- if (what & PLL)
|
|
- out |= PCI_CFG_GPIO_PLL;
|
|
- pci_write_config_dword(sii->pcibus,
|
|
- PCI_GPIO_OUT, out);
|
|
- pci_write_config_dword(sii->pcibus,
|
|
- PCI_GPIO_OUTEN, outen);
|
|
- udelay(XTAL_ON_DELAY);
|
|
- }
|
|
-
|
|
- /* turn pll on */
|
|
- if (what & PLL) {
|
|
- out &= ~PCI_CFG_GPIO_PLL;
|
|
- pci_write_config_dword(sii->pcibus,
|
|
- PCI_GPIO_OUT, out);
|
|
- mdelay(2);
|
|
- }
|
|
- } else {
|
|
- if (what & XTAL)
|
|
- out &= ~PCI_CFG_GPIO_XTAL;
|
|
- if (what & PLL)
|
|
- out |= PCI_CFG_GPIO_PLL;
|
|
- pci_write_config_dword(sii->pcibus,
|
|
- PCI_GPIO_OUT, out);
|
|
- pci_write_config_dword(sii->pcibus,
|
|
- PCI_GPIO_OUTEN, outen);
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* clk control mechanism through chipcommon, no policy checking */
|
|
-static bool _ai_clkctl_cc(struct si_info *sii, uint mode)
|
|
-{
|
|
- struct bcma_device *cc;
|
|
- u32 scc;
|
|
-
|
|
- /* chipcommon cores prior to rev6 don't support dynamic clock control */
|
|
- if (ai_get_ccrev(&sii->pub) < 6)
|
|
- return false;
|
|
-
|
|
- cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
|
|
-
|
|
- if (!(ai_get_cccaps(&sii->pub) & CC_CAP_PWR_CTL) &&
|
|
- (ai_get_ccrev(&sii->pub) < 20))
|
|
- return mode == CLK_FAST;
|
|
-
|
|
- switch (mode) {
|
|
- case CLK_FAST: /* FORCEHT, fast (pll) clock */
|
|
- if (ai_get_ccrev(&sii->pub) < 10) {
|
|
- /*
|
|
- * don't forget to force xtal back
|
|
- * on before we clear SCC_DYN_XTAL..
|
|
- */
|
|
- ai_clkctl_xtal(&sii->pub, XTAL, ON);
|
|
- bcma_maskset32(cc, CHIPCREGOFFS(slow_clk_ctl),
|
|
- (SCC_XC | SCC_FS | SCC_IP), SCC_IP);
|
|
- } else if (ai_get_ccrev(&sii->pub) < 20) {
|
|
- bcma_set32(cc, CHIPCREGOFFS(system_clk_ctl), SYCC_HR);
|
|
- } else {
|
|
- bcma_set32(cc, CHIPCREGOFFS(clk_ctl_st), CCS_FORCEHT);
|
|
- }
|
|
-
|
|
- /* wait for the PLL */
|
|
- if (ai_get_cccaps(&sii->pub) & CC_CAP_PMU) {
|
|
- u32 htavail = CCS_HTAVAIL;
|
|
- SPINWAIT(((bcma_read32(cc, CHIPCREGOFFS(clk_ctl_st)) &
|
|
- htavail) == 0), PMU_MAX_TRANSITION_DLY);
|
|
- } else {
|
|
- udelay(PLL_DELAY);
|
|
- }
|
|
- break;
|
|
-
|
|
- case CLK_DYNAMIC: /* enable dynamic clock control */
|
|
- if (ai_get_ccrev(&sii->pub) < 10) {
|
|
- scc = bcma_read32(cc, CHIPCREGOFFS(slow_clk_ctl));
|
|
- scc &= ~(SCC_FS | SCC_IP | SCC_XC);
|
|
- if ((scc & SCC_SS_MASK) != SCC_SS_XTAL)
|
|
- scc |= SCC_XC;
|
|
- bcma_write32(cc, CHIPCREGOFFS(slow_clk_ctl), scc);
|
|
-
|
|
- /*
|
|
- * for dynamic control, we have to
|
|
- * release our xtal_pu "force on"
|
|
- */
|
|
- if (scc & SCC_XC)
|
|
- ai_clkctl_xtal(&sii->pub, XTAL, OFF);
|
|
- } else if (ai_get_ccrev(&sii->pub) < 20) {
|
|
- /* Instaclock */
|
|
- bcma_mask32(cc, CHIPCREGOFFS(system_clk_ctl), ~SYCC_HR);
|
|
- } else {
|
|
- bcma_mask32(cc, CHIPCREGOFFS(clk_ctl_st), ~CCS_FORCEHT);
|
|
- }
|
|
- break;
|
|
-
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return mode == CLK_FAST;
|
|
-}
|
|
-
|
|
/*
|
|
* clock control policy function throught chipcommon
|
|
*
|
|
@@ -1036,133 +751,53 @@ static bool _ai_clkctl_cc(struct si_info
|
|
* this is a wrapper over the next internal function
|
|
* to allow flexible policy settings for outside caller
|
|
*/
|
|
-bool ai_clkctl_cc(struct si_pub *sih, uint mode)
|
|
+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;
|
|
|
|
- /* chipcommon cores prior to rev6 don't support dynamic clock control */
|
|
- if (ai_get_ccrev(sih) < 6)
|
|
- return false;
|
|
-
|
|
if (PCI_FORCEHT(sih))
|
|
- return mode == CLK_FAST;
|
|
+ return mode == BCMA_CLKMODE_FAST;
|
|
|
|
- return _ai_clkctl_cc(sii, mode);
|
|
+ cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
|
|
+ bcma_core_set_clockmode(cc, mode);
|
|
+ return mode == BCMA_CLKMODE_FAST;
|
|
}
|
|
|
|
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))
|
|
- _ai_clkctl_cc(sii, CLK_FAST);
|
|
+ if (PCI_FORCEHT(sih)) {
|
|
+ cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
|
|
+ bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
|
|
+ }
|
|
|
|
if (PCIE(sih))
|
|
- pcicore_up(sii->pch, SI_PCIUP);
|
|
-
|
|
-}
|
|
-
|
|
-/* Unconfigure and/or apply various WARs when system is going to sleep mode */
|
|
-void ai_pci_sleep(struct si_pub *sih)
|
|
-{
|
|
- struct si_info *sii;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
-
|
|
- pcicore_sleep(sii->pch);
|
|
+ bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
|
|
}
|
|
|
|
/* Unconfigure and/or apply various WARs when going down */
|
|
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))
|
|
- _ai_clkctl_cc(sii, CLK_DYNAMIC);
|
|
-
|
|
- pcicore_down(sii->pch, SI_PCIDOWN);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Configure the pci core for pci client (NIC) action
|
|
- * coremask is the bitvec of cores by index to be enabled.
|
|
- */
|
|
-void ai_pci_setup(struct si_pub *sih, uint coremask)
|
|
-{
|
|
- struct si_info *sii;
|
|
- u32 w;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
-
|
|
- /*
|
|
- * Enable sb->pci interrupts. Assume
|
|
- * PCI rev 2.3 support was added in pci core rev 6 and things changed..
|
|
- */
|
|
- if (PCIE(sih) || (PCI(sih) && (ai_get_buscorerev(sih) >= 6))) {
|
|
- /* pci config write to set this core bit in PCIIntMask */
|
|
- pci_read_config_dword(sii->pcibus, PCI_INT_MASK, &w);
|
|
- w |= (coremask << PCI_SBIM_SHIFT);
|
|
- pci_write_config_dword(sii->pcibus, PCI_INT_MASK, w);
|
|
- }
|
|
-
|
|
- if (PCI(sih)) {
|
|
- pcicore_pci_setup(sii->pch);
|
|
+ if (PCI_FORCEHT(sih)) {
|
|
+ cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
|
|
+ bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
|
|
}
|
|
-}
|
|
-
|
|
-/*
|
|
- * Fixup SROMless PCI device's configuration.
|
|
- * The current core may be changed upon return.
|
|
- */
|
|
-int ai_pci_fixcfg(struct si_pub *sih)
|
|
-{
|
|
- struct si_info *sii = (struct si_info *)sih;
|
|
-
|
|
- /* Fixup PI in SROM shadow area to enable the correct PCI core access */
|
|
- /* check 'pi' is correct and fix it if not */
|
|
- pcicore_fixcfg(sii->pch);
|
|
- pcicore_hwup(sii->pch);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* mask&set gpiocontrol bits */
|
|
-u32 ai_gpiocontrol(struct si_pub *sih, u32 mask, u32 val, u8 priority)
|
|
-{
|
|
- uint regoff;
|
|
-
|
|
- regoff = offsetof(struct chipcregs, gpiocontrol);
|
|
- return ai_cc_reg(sih, regoff, mask, val);
|
|
-}
|
|
-
|
|
-void ai_chipcontrl_epa4331(struct si_pub *sih, bool on)
|
|
-{
|
|
- struct bcma_device *cc;
|
|
- u32 val;
|
|
-
|
|
- cc = ai_findcore(sih, CC_CORE_ID, 0);
|
|
|
|
- if (on) {
|
|
- if (ai_get_chippkg(sih) == 9 || ai_get_chippkg(sih) == 0xb)
|
|
- /* Ext PA Controls for 4331 12x9 Package */
|
|
- bcma_set32(cc, CHIPCREGOFFS(chipcontrol),
|
|
- CCTRL4331_EXTPA_EN |
|
|
- CCTRL4331_EXTPA_ON_GPIO2_5);
|
|
- else
|
|
- /* Ext PA Controls for 4331 12x12 Package */
|
|
- bcma_set32(cc, CHIPCREGOFFS(chipcontrol),
|
|
- CCTRL4331_EXTPA_EN);
|
|
- } else {
|
|
- val &= ~(CCTRL4331_EXTPA_EN | CCTRL4331_EXTPA_ON_GPIO2_5);
|
|
- bcma_mask32(cc, CHIPCREGOFFS(chipcontrol),
|
|
- ~(CCTRL4331_EXTPA_EN | CCTRL4331_EXTPA_ON_GPIO2_5));
|
|
- }
|
|
+ if (PCIE(sih))
|
|
+ bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
|
|
}
|
|
|
|
/* Enable BT-COEX & Ex-PA for 4313 */
|
|
@@ -1184,6 +819,9 @@ bool ai_deviceremoved(struct si_pub *sih
|
|
|
|
sii = (struct si_info *)sih;
|
|
|
|
+ if (sii->icbus->hosttype != BCMA_HOSTTYPE_PCI)
|
|
+ return false;
|
|
+
|
|
pci_read_config_dword(sii->pcibus, PCI_VENDOR_ID, &w);
|
|
if ((w & 0xFFFF) != PCI_VENDOR_ID_BROADCOM)
|
|
return true;
|
|
@@ -1191,45 +829,6 @@ bool ai_deviceremoved(struct si_pub *sih
|
|
return false;
|
|
}
|
|
|
|
-bool ai_is_sprom_available(struct si_pub *sih)
|
|
-{
|
|
- struct si_info *sii = (struct si_info *)sih;
|
|
-
|
|
- if (ai_get_ccrev(sih) >= 31) {
|
|
- struct bcma_device *cc;
|
|
- u32 sromctrl;
|
|
-
|
|
- if ((ai_get_cccaps(sih) & CC_CAP_SROM) == 0)
|
|
- return false;
|
|
-
|
|
- cc = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
|
|
- sromctrl = bcma_read32(cc, CHIPCREGOFFS(sromcontrol));
|
|
- return sromctrl & SRC_PRESENT;
|
|
- }
|
|
-
|
|
- switch (ai_get_chip_id(sih)) {
|
|
- case BCM4313_CHIP_ID:
|
|
- return (sii->chipst & CST4313_SPROM_PRESENT) != 0;
|
|
- default:
|
|
- return true;
|
|
- }
|
|
-}
|
|
-
|
|
-bool ai_is_otp_disabled(struct si_pub *sih)
|
|
-{
|
|
- struct si_info *sii = (struct si_info *)sih;
|
|
-
|
|
- switch (ai_get_chip_id(sih)) {
|
|
- case BCM4313_CHIP_ID:
|
|
- return (sii->chipst & CST4313_OTP_PRESENT) == 0;
|
|
- /* These chips always have their OTP on */
|
|
- case BCM43224_CHIP_ID:
|
|
- case BCM43225_CHIP_ID:
|
|
- default:
|
|
- return false;
|
|
- }
|
|
-}
|
|
-
|
|
uint ai_get_buscoretype(struct si_pub *sih)
|
|
{
|
|
struct si_info *sii = (struct si_info *)sih;
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
|
|
@@ -113,10 +113,6 @@
|
|
#define XTAL 0x1 /* primary crystal oscillator (2050) */
|
|
#define PLL 0x2 /* main chip pll */
|
|
|
|
-/* clkctl clk mode */
|
|
-#define CLK_FAST 0 /* force fast (pll) clock */
|
|
-#define CLK_DYNAMIC 2 /* enable dynamic clock control */
|
|
-
|
|
/* GPIO usage priorities */
|
|
#define GPIO_DRV_PRIORITY 0 /* Driver */
|
|
#define GPIO_APP_PRIORITY 1 /* Application */
|
|
@@ -172,9 +168,7 @@ 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 pcicore_info *pch; /* PCI/E core handle */
|
|
struct bcma_device *buscore;
|
|
- struct list_head var_list; /* list of srom variables */
|
|
|
|
u32 chipst; /* chip status */
|
|
};
|
|
@@ -197,38 +191,20 @@ extern u32 ai_core_cflags(struct bcma_de
|
|
extern struct si_pub *ai_attach(struct bcma_bus *pbus);
|
|
extern void ai_detach(struct si_pub *sih);
|
|
extern uint ai_cc_reg(struct si_pub *sih, uint regoff, u32 mask, u32 val);
|
|
-extern void ai_pci_setup(struct si_pub *sih, uint coremask);
|
|
extern void ai_clkctl_init(struct si_pub *sih);
|
|
extern u16 ai_clkctl_fast_pwrup_delay(struct si_pub *sih);
|
|
extern bool ai_clkctl_cc(struct si_pub *sih, uint mode);
|
|
-extern int ai_clkctl_xtal(struct si_pub *sih, uint what, bool on);
|
|
extern bool ai_deviceremoved(struct si_pub *sih);
|
|
-extern u32 ai_gpiocontrol(struct si_pub *sih, u32 mask, u32 val,
|
|
- u8 priority);
|
|
-
|
|
-/* OTP status */
|
|
-extern bool ai_is_otp_disabled(struct si_pub *sih);
|
|
-
|
|
-/* SPROM availability */
|
|
-extern bool ai_is_sprom_available(struct si_pub *sih);
|
|
|
|
-extern void ai_pci_sleep(struct si_pub *sih);
|
|
extern void ai_pci_down(struct si_pub *sih);
|
|
extern void ai_pci_up(struct si_pub *sih);
|
|
-extern int ai_pci_fixcfg(struct si_pub *sih);
|
|
|
|
-extern void ai_chipcontrl_epa4331(struct si_pub *sih, bool on);
|
|
/* 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 int ai_get_ccrev(struct si_pub *sih)
|
|
-{
|
|
- return sih->ccrev;
|
|
-}
|
|
-
|
|
static inline u32 ai_get_cccaps(struct si_pub *sih)
|
|
{
|
|
return sih->cccaps;
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/antsel.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/antsel.c
|
|
@@ -108,7 +108,7 @@ brcms_c_antsel_init_cfg(struct antsel_in
|
|
struct antsel_info *brcms_c_antsel_attach(struct brcms_c_info *wlc)
|
|
{
|
|
struct antsel_info *asi;
|
|
- struct si_pub *sih = wlc->hw->sih;
|
|
+ struct ssb_sprom *sprom = &wlc->hw->d11core->bus->sprom;
|
|
|
|
asi = kzalloc(sizeof(struct antsel_info), GFP_ATOMIC);
|
|
if (!asi)
|
|
@@ -118,7 +118,7 @@ struct antsel_info *brcms_c_antsel_attac
|
|
asi->pub = wlc->pub;
|
|
asi->antsel_type = ANTSEL_NA;
|
|
asi->antsel_avail = false;
|
|
- asi->antsel_antswitch = (u8) getintvar(sih, BRCMS_SROM_ANTSWITCH);
|
|
+ asi->antsel_antswitch = sprom->antswitch;
|
|
|
|
if ((asi->pub->sromrev >= 4) && (asi->antsel_antswitch != 0)) {
|
|
switch (asi->antsel_antswitch) {
|
|
@@ -128,12 +128,12 @@ struct antsel_info *brcms_c_antsel_attac
|
|
/* 4321/2 board with 2x3 switch logic */
|
|
asi->antsel_type = ANTSEL_2x3;
|
|
/* Antenna selection availability */
|
|
- if (((u16) getintvar(sih, BRCMS_SROM_AA2G) == 7) ||
|
|
- ((u16) getintvar(sih, BRCMS_SROM_AA5G) == 7)) {
|
|
+ if ((sprom->ant_available_bg == 7) ||
|
|
+ (sprom->ant_available_a == 7)) {
|
|
asi->antsel_avail = true;
|
|
} else if (
|
|
- (u16) getintvar(sih, BRCMS_SROM_AA2G) == 3 ||
|
|
- (u16) getintvar(sih, BRCMS_SROM_AA5G) == 3) {
|
|
+ sprom->ant_available_bg == 3 ||
|
|
+ sprom->ant_available_a == 3) {
|
|
asi->antsel_avail = false;
|
|
} else {
|
|
asi->antsel_avail = false;
|
|
@@ -146,8 +146,8 @@ struct antsel_info *brcms_c_antsel_attac
|
|
break;
|
|
}
|
|
} else if ((asi->pub->sromrev == 4) &&
|
|
- ((u16) getintvar(sih, BRCMS_SROM_AA2G) == 7) &&
|
|
- ((u16) getintvar(sih, BRCMS_SROM_AA5G) == 0)) {
|
|
+ (sprom->ant_available_bg == 7) &&
|
|
+ (sprom->ant_available_a == 0)) {
|
|
/* hack to match old 4321CB2 cards with 2of3 antenna switch */
|
|
asi->antsel_type = ANTSEL_2x3;
|
|
asi->antsel_avail = true;
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
|
|
@@ -1110,7 +1110,7 @@ struct brcms_cm_info *brcms_c_channel_mg
|
|
char country_abbrev[BRCM_CNTRY_BUF_SZ];
|
|
const struct country_info *country;
|
|
struct brcms_pub *pub = wlc->pub;
|
|
- char *ccode;
|
|
+ struct ssb_sprom *sprom = &wlc->hw->d11core->bus->sprom;
|
|
|
|
BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
|
|
|
|
@@ -1122,9 +1122,8 @@ struct brcms_cm_info *brcms_c_channel_mg
|
|
wlc->cmi = wlc_cm;
|
|
|
|
/* store the country code for passing up as a regulatory hint */
|
|
- ccode = getvar(wlc->hw->sih, BRCMS_SROM_CCODE);
|
|
- if (ccode && brcms_c_country_valid(ccode))
|
|
- strncpy(wlc->pub->srom_ccode, ccode, BRCM_CNTRY_BUF_SZ - 1);
|
|
+ if (sprom->alpha2 && brcms_c_country_valid(sprom->alpha2))
|
|
+ strncpy(wlc->pub->srom_ccode, sprom->alpha2, sizeof(sprom->alpha2));
|
|
|
|
/*
|
|
* internal country information which must match
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
|
|
@@ -28,7 +28,6 @@
|
|
#include <linux/bcma/bcma.h>
|
|
#include <net/mac80211.h>
|
|
#include <defs.h>
|
|
-#include "nicpci.h"
|
|
#include "phy/phy_int.h"
|
|
#include "d11.h"
|
|
#include "channel.h"
|
|
@@ -773,7 +772,7 @@ void brcms_dpc(unsigned long data)
|
|
* Precondition: Since this function is called in brcms_pci_probe() context,
|
|
* no locking is required.
|
|
*/
|
|
-static int brcms_request_fw(struct brcms_info *wl, struct pci_dev *pdev)
|
|
+static int brcms_request_fw(struct brcms_info *wl, struct bcma_device *pdev)
|
|
{
|
|
int status;
|
|
struct device *device = &pdev->dev;
|
|
@@ -1025,7 +1024,7 @@ static struct brcms_info *brcms_attach(s
|
|
spin_lock_init(&wl->isr_lock);
|
|
|
|
/* prepare ucode */
|
|
- if (brcms_request_fw(wl, pdev->bus->host_pci) < 0) {
|
|
+ if (brcms_request_fw(wl, pdev) < 0) {
|
|
wiphy_err(wl->wiphy, "%s: Failed to find firmware usually in "
|
|
"%s\n", KBUILD_MODNAME, "/lib/firmware/brcm");
|
|
brcms_release_fw(wl);
|
|
@@ -1046,12 +1045,12 @@ static struct brcms_info *brcms_attach(s
|
|
wl->pub->ieee_hw = hw;
|
|
|
|
/* register our interrupt handler */
|
|
- if (request_irq(pdev->bus->host_pci->irq, brcms_isr,
|
|
+ if (request_irq(pdev->irq, brcms_isr,
|
|
IRQF_SHARED, KBUILD_MODNAME, wl)) {
|
|
wiphy_err(wl->wiphy, "wl%d: request_irq() failed\n", unit);
|
|
goto fail;
|
|
}
|
|
- wl->irq = pdev->bus->host_pci->irq;
|
|
+ wl->irq = pdev->irq;
|
|
|
|
/* register module */
|
|
brcms_c_module_register(wl->pub, "linux", wl, NULL);
|
|
@@ -1101,7 +1100,7 @@ static int __devinit brcms_bcma_probe(st
|
|
|
|
dev_info(&pdev->dev, "mfg %x core %x rev %d class %d irq %d\n",
|
|
pdev->id.manuf, pdev->id.id, pdev->id.rev, pdev->id.class,
|
|
- pdev->bus->host_pci->irq);
|
|
+ pdev->irq);
|
|
|
|
if ((pdev->id.manuf != BCMA_MANUF_BCM) ||
|
|
(pdev->id.id != BCMA_CORE_80211))
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
|
@@ -850,8 +850,7 @@ brcms_c_dotxstatus(struct brcms_c_info *
|
|
*/
|
|
if (!(txs->status & TX_STATUS_AMPDU)
|
|
&& (txs->status & TX_STATUS_INTERMEDIATE)) {
|
|
- wiphy_err(wlc->wiphy, "%s: INTERMEDIATE but not AMPDU\n",
|
|
- __func__);
|
|
+ BCMMSG(wlc->wiphy, "INTERMEDIATE but not AMPDU\n");
|
|
return false;
|
|
}
|
|
|
|
@@ -1223,7 +1222,7 @@ static void brcms_b_wait_for_wake(struct
|
|
}
|
|
|
|
/* control chip clock to save power, enable dynamic clock or force fast clock */
|
|
-static void brcms_b_clkctl_clk(struct brcms_hardware *wlc_hw, uint mode)
|
|
+static void brcms_b_clkctl_clk(struct brcms_hardware *wlc_hw, enum bcma_clkmode mode)
|
|
{
|
|
if (ai_get_cccaps(wlc_hw->sih) & CC_CAP_PMU) {
|
|
/* new chips with PMU, CCS_FORCEHT will distribute the HT clock
|
|
@@ -1233,7 +1232,7 @@ static void brcms_b_clkctl_clk(struct br
|
|
*/
|
|
|
|
if (wlc_hw->clk) {
|
|
- if (mode == CLK_FAST) {
|
|
+ if (mode == BCMA_CLKMODE_FAST) {
|
|
bcma_set32(wlc_hw->d11core,
|
|
D11REGOFFS(clk_ctl_st),
|
|
CCS_FORCEHT);
|
|
@@ -1264,7 +1263,7 @@ static void brcms_b_clkctl_clk(struct br
|
|
~CCS_FORCEHT);
|
|
}
|
|
}
|
|
- wlc_hw->forcefastclk = (mode == CLK_FAST);
|
|
+ wlc_hw->forcefastclk = (mode == BCMA_CLKMODE_FAST);
|
|
} else {
|
|
|
|
/* old chips w/o PMU, force HT through cc,
|
|
@@ -1571,7 +1570,7 @@ void brcms_b_bw_set(struct brcms_hardwar
|
|
/* request FAST clock if not on */
|
|
fastclk = wlc_hw->forcefastclk;
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
wlc_phy_bw_state_set(wlc_hw->band->pi, bw);
|
|
|
|
@@ -1580,7 +1579,7 @@ void brcms_b_bw_set(struct brcms_hardwar
|
|
|
|
/* restore the clk */
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_DYNAMIC);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_DYNAMIC);
|
|
}
|
|
|
|
static void brcms_b_upd_synthpu(struct brcms_hardware *wlc_hw)
|
|
@@ -1886,27 +1885,20 @@ static bool brcms_c_validboardtype(struc
|
|
return true;
|
|
}
|
|
|
|
-static char *brcms_c_get_macaddr(struct brcms_hardware *wlc_hw)
|
|
+static void brcms_c_get_macaddr(struct brcms_hardware *wlc_hw, u8 etheraddr[ETH_ALEN])
|
|
{
|
|
- enum brcms_srom_id var_id = BRCMS_SROM_MACADDR;
|
|
- char *macaddr;
|
|
+ struct ssb_sprom *sprom = &wlc_hw->d11core->bus->sprom;
|
|
|
|
/* If macaddr exists, use it (Sromrev4, CIS, ...). */
|
|
- macaddr = getvar(wlc_hw->sih, var_id);
|
|
- if (macaddr != NULL)
|
|
- return macaddr;
|
|
+ if (!is_zero_ether_addr(sprom->il0mac)) {
|
|
+ memcpy(etheraddr, sprom->il0mac, 6);
|
|
+ return;
|
|
+ }
|
|
|
|
if (wlc_hw->_nbands > 1)
|
|
- var_id = BRCMS_SROM_ET1MACADDR;
|
|
+ memcpy(etheraddr, sprom->et1mac, 6);
|
|
else
|
|
- var_id = BRCMS_SROM_IL0MACADDR;
|
|
-
|
|
- macaddr = getvar(wlc_hw->sih, var_id);
|
|
- if (macaddr == NULL)
|
|
- wiphy_err(wlc_hw->wlc->wiphy, "wl%d: wlc_get_macaddr: macaddr "
|
|
- "getvar(%d) not found\n", wlc_hw->unit, var_id);
|
|
-
|
|
- return macaddr;
|
|
+ memcpy(etheraddr, sprom->il0mac, 6);
|
|
}
|
|
|
|
/* power both the pll and external oscillator on/off */
|
|
@@ -1921,9 +1913,6 @@ static void brcms_b_xtal(struct brcms_ha
|
|
if (!want && wlc_hw->pllreq)
|
|
return;
|
|
|
|
- if (wlc_hw->sih)
|
|
- ai_clkctl_xtal(wlc_hw->sih, XTAL | PLL, want);
|
|
-
|
|
wlc_hw->sbclk = want;
|
|
if (!wlc_hw->sbclk) {
|
|
wlc_hw->clk = false;
|
|
@@ -2008,7 +1997,7 @@ void brcms_b_corereset(struct brcms_hard
|
|
/* request FAST clock if not on */
|
|
fastclk = wlc_hw->forcefastclk;
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
/* reset the dma engines except first time thru */
|
|
if (bcma_core_is_enabled(wlc_hw->d11core)) {
|
|
@@ -2057,7 +2046,7 @@ void brcms_b_corereset(struct brcms_hard
|
|
brcms_c_mctrl_reset(wlc_hw);
|
|
|
|
if (ai_get_cccaps(wlc_hw->sih) & CC_CAP_PMU)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
brcms_b_phy_reset(wlc_hw);
|
|
|
|
@@ -2069,7 +2058,7 @@ void brcms_b_corereset(struct brcms_hard
|
|
|
|
/* restore the clk setting */
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_DYNAMIC);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_DYNAMIC);
|
|
}
|
|
|
|
/* txfifo sizes needs to be modified(increased) since the newer cores
|
|
@@ -2222,7 +2211,7 @@ static void brcms_c_gpio_init(struct brc
|
|
gm |= gc |= BOARD_GPIO_PACTRL;
|
|
|
|
/* apply to gpiocontrol register */
|
|
- ai_gpiocontrol(wlc_hw->sih, gm, gc, GPIO_DRV_PRIORITY);
|
|
+ bcma_chipco_gpio_control(&wlc_hw->d11core->bus->drv_cc, gm, gc);
|
|
}
|
|
|
|
static void brcms_ucode_write(struct brcms_hardware *wlc_hw,
|
|
@@ -3375,7 +3364,7 @@ static brcms_b_init(struct brcms_hardwar
|
|
/* request FAST clock if not on */
|
|
fastclk = wlc_hw->forcefastclk;
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
/* disable interrupts */
|
|
macintmask = brcms_intrsoff(wlc->wl);
|
|
@@ -3409,7 +3398,7 @@ static brcms_b_init(struct brcms_hardwar
|
|
|
|
/* restore the clk */
|
|
if (!fastclk)
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_DYNAMIC);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_DYNAMIC);
|
|
}
|
|
|
|
static void brcms_c_set_phy_chanspec(struct brcms_c_info *wlc,
|
|
@@ -4440,17 +4429,22 @@ static int brcms_b_attach(struct brcms_c
|
|
uint unit, bool piomode)
|
|
{
|
|
struct brcms_hardware *wlc_hw;
|
|
- char *macaddr = NULL;
|
|
uint err = 0;
|
|
uint j;
|
|
bool wme = false;
|
|
struct shared_phy_params sha_params;
|
|
struct wiphy *wiphy = wlc->wiphy;
|
|
struct pci_dev *pcidev = core->bus->host_pci;
|
|
+ struct ssb_sprom *sprom = &core->bus->sprom;
|
|
|
|
- BCMMSG(wlc->wiphy, "wl%d: vendor 0x%x device 0x%x\n", unit,
|
|
- pcidev->vendor,
|
|
- pcidev->device);
|
|
+ if (core->bus->hosttype == BCMA_HOSTTYPE_PCI)
|
|
+ BCMMSG(wlc->wiphy, "wl%d: vendor 0x%x device 0x%x\n", unit,
|
|
+ pcidev->vendor,
|
|
+ pcidev->device);
|
|
+ else
|
|
+ BCMMSG(wlc->wiphy, "wl%d: vendor 0x%x device 0x%x\n", unit,
|
|
+ core->bus->boardinfo.vendor,
|
|
+ core->bus->boardinfo.type);
|
|
|
|
wme = true;
|
|
|
|
@@ -4476,7 +4470,8 @@ static int brcms_b_attach(struct brcms_c
|
|
}
|
|
|
|
/* verify again the device is supported */
|
|
- if (!brcms_c_chipmatch(pcidev->vendor, pcidev->device)) {
|
|
+ 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);
|
|
@@ -4484,8 +4479,13 @@ static int brcms_b_attach(struct brcms_c
|
|
goto fail;
|
|
}
|
|
|
|
- wlc_hw->vendorid = pcidev->vendor;
|
|
- wlc_hw->deviceid = pcidev->device;
|
|
+ if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
|
|
+ wlc_hw->vendorid = pcidev->vendor;
|
|
+ wlc_hw->deviceid = pcidev->device;
|
|
+ } else {
|
|
+ wlc_hw->vendorid = core->bus->boardinfo.vendor;
|
|
+ wlc_hw->deviceid = core->bus->boardinfo.type;
|
|
+ }
|
|
|
|
wlc_hw->d11core = core;
|
|
wlc_hw->corerev = core->id.rev;
|
|
@@ -4505,7 +4505,7 @@ static int brcms_b_attach(struct brcms_c
|
|
* is still false; But it will be called again inside wlc_corereset,
|
|
* after d11 is out of reset.
|
|
*/
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
|
|
|
|
if (!brcms_b_validate_chip_access(wlc_hw)) {
|
|
@@ -4516,7 +4516,7 @@ static int brcms_b_attach(struct brcms_c
|
|
}
|
|
|
|
/* get the board rev, used just below */
|
|
- j = getintvar(wlc_hw->sih, BRCMS_SROM_BOARDREV);
|
|
+ j = sprom->board_rev;
|
|
/* promote srom boardrev of 0xFF to 1 */
|
|
if (j == BOARDREV_PROMOTABLE)
|
|
j = BOARDREV_PROMOTED;
|
|
@@ -4529,11 +4529,9 @@ static int brcms_b_attach(struct brcms_c
|
|
err = 15;
|
|
goto fail;
|
|
}
|
|
- wlc_hw->sromrev = (u8) getintvar(wlc_hw->sih, BRCMS_SROM_REV);
|
|
- wlc_hw->boardflags = (u32) getintvar(wlc_hw->sih,
|
|
- BRCMS_SROM_BOARDFLAGS);
|
|
- wlc_hw->boardflags2 = (u32) getintvar(wlc_hw->sih,
|
|
- BRCMS_SROM_BOARDFLAGS2);
|
|
+ wlc_hw->sromrev = sprom->revision;
|
|
+ wlc_hw->boardflags = sprom->boardflags_lo + (sprom->boardflags_hi << 16);
|
|
+ wlc_hw->boardflags2 = sprom->boardflags2_lo + (sprom->boardflags2_hi << 16);
|
|
|
|
if (wlc_hw->boardflags & BFL_NOPLLDOWN)
|
|
brcms_b_pllreq(wlc_hw, true, BRCMS_PLLREQ_SHARED);
|
|
@@ -4706,25 +4704,18 @@ static int brcms_b_attach(struct brcms_c
|
|
*/
|
|
|
|
/* init etheraddr state variables */
|
|
- macaddr = brcms_c_get_macaddr(wlc_hw);
|
|
- if (macaddr == NULL) {
|
|
- wiphy_err(wiphy, "wl%d: brcms_b_attach: macaddr not found\n",
|
|
- unit);
|
|
- err = 21;
|
|
- goto fail;
|
|
- }
|
|
- if (!mac_pton(macaddr, wlc_hw->etheraddr) ||
|
|
- is_broadcast_ether_addr(wlc_hw->etheraddr) ||
|
|
+ brcms_c_get_macaddr(wlc_hw, wlc_hw->etheraddr);
|
|
+
|
|
+ if (is_broadcast_ether_addr(wlc_hw->etheraddr) ||
|
|
is_zero_ether_addr(wlc_hw->etheraddr)) {
|
|
- wiphy_err(wiphy, "wl%d: brcms_b_attach: bad macaddr %s\n",
|
|
- unit, macaddr);
|
|
+ wiphy_err(wiphy, "wl%d: brcms_b_attach: bad macaddr\n",
|
|
+ unit);
|
|
err = 22;
|
|
goto fail;
|
|
}
|
|
|
|
- BCMMSG(wlc->wiphy, "deviceid 0x%x nbands %d board 0x%x macaddr: %s\n",
|
|
- wlc_hw->deviceid, wlc_hw->_nbands, ai_get_boardtype(wlc_hw->sih),
|
|
- macaddr);
|
|
+ BCMMSG(wlc->wiphy, "deviceid 0x%x nbands %d board 0x%x\n",
|
|
+ wlc_hw->deviceid, wlc_hw->_nbands, ai_get_boardtype(wlc_hw->sih));
|
|
|
|
return err;
|
|
|
|
@@ -4774,16 +4765,16 @@ static bool brcms_c_attach_stf_ant_init(
|
|
int aa;
|
|
uint unit;
|
|
int bandtype;
|
|
- struct si_pub *sih = wlc->hw->sih;
|
|
+ struct ssb_sprom *sprom = &wlc->hw->d11core->bus->sprom;
|
|
|
|
unit = wlc->pub->unit;
|
|
bandtype = wlc->band->bandtype;
|
|
|
|
/* get antennas available */
|
|
if (bandtype == BRCM_BAND_5G)
|
|
- aa = (s8) getintvar(sih, BRCMS_SROM_AA5G);
|
|
+ aa = sprom->ant_available_a;
|
|
else
|
|
- aa = (s8) getintvar(sih, BRCMS_SROM_AA2G);
|
|
+ aa = sprom->ant_available_bg;
|
|
|
|
if ((aa < 1) || (aa > 15)) {
|
|
wiphy_err(wlc->wiphy, "wl%d: %s: Invalid antennas available in"
|
|
@@ -4803,9 +4794,9 @@ static bool brcms_c_attach_stf_ant_init(
|
|
|
|
/* Compute Antenna Gain */
|
|
if (bandtype == BRCM_BAND_5G)
|
|
- wlc->band->antgain = (s8) getintvar(sih, BRCMS_SROM_AG1);
|
|
+ wlc->band->antgain = sprom->antenna_gain.a1;
|
|
else
|
|
- wlc->band->antgain = (s8) getintvar(sih, BRCMS_SROM_AG0);
|
|
+ wlc->band->antgain = sprom->antenna_gain.a0;
|
|
|
|
brcms_c_attach_antgain_init(wlc);
|
|
|
|
@@ -4956,15 +4947,6 @@ static int brcms_b_detach(struct brcms_c
|
|
|
|
callbacks = 0;
|
|
|
|
- if (wlc_hw->sih) {
|
|
- /*
|
|
- * detach interrupt sync mechanism since interrupt is disabled
|
|
- * and per-port interrupt object may has been freed. this must
|
|
- * be done before sb core switch
|
|
- */
|
|
- ai_pci_sleep(wlc_hw->sih);
|
|
- }
|
|
-
|
|
brcms_b_detach_dmapio(wlc_hw);
|
|
|
|
band = wlc_hw->band;
|
|
@@ -5051,9 +5033,7 @@ static void brcms_b_hw_up(struct brcms_h
|
|
*/
|
|
brcms_b_xtal(wlc_hw, ON);
|
|
ai_clkctl_init(wlc_hw->sih);
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
-
|
|
- ai_pci_fixcfg(wlc_hw->sih);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
/*
|
|
* TODO: test suspend/resume
|
|
@@ -5082,8 +5062,6 @@ static void brcms_b_hw_up(struct brcms_h
|
|
|
|
static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
|
|
{
|
|
- uint coremask;
|
|
-
|
|
BCMMSG(wlc_hw->wlc->wiphy, "wl%d\n", wlc_hw->unit);
|
|
|
|
/*
|
|
@@ -5092,15 +5070,14 @@ static int brcms_b_up_prep(struct brcms_
|
|
*/
|
|
brcms_b_xtal(wlc_hw, ON);
|
|
ai_clkctl_init(wlc_hw->sih);
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
|
|
/*
|
|
* Configure pci/pcmcia here instead of in brcms_c_attach()
|
|
* to allow mfg hotswap: down, hotswap (chip power cycle), up.
|
|
*/
|
|
- coremask = (1 << wlc_hw->wlc->core->coreidx);
|
|
-
|
|
- ai_pci_setup(wlc_hw->sih, coremask);
|
|
+ bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci, wlc_hw->d11core,
|
|
+ true);
|
|
|
|
/*
|
|
* Need to read the hwradio status here to cover the case where the
|
|
@@ -5130,7 +5107,7 @@ static int brcms_b_up_finish(struct brcm
|
|
wlc_phy_hw_state_upd(wlc_hw->band->pi, true);
|
|
|
|
/* FULLY enable dynamic power control and d11 core interrupt */
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_DYNAMIC);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_DYNAMIC);
|
|
brcms_intrson(wlc_hw->wlc->wl);
|
|
return 0;
|
|
}
|
|
@@ -5271,7 +5248,7 @@ static int brcms_b_bmac_down_prep(struct
|
|
brcms_intrsoff(wlc_hw->wlc->wl);
|
|
|
|
/* ensure we're running on the pll clock again */
|
|
- brcms_b_clkctl_clk(wlc_hw, CLK_FAST);
|
|
+ brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
|
|
}
|
|
/* down phy at the last of this stage */
|
|
callbacks += wlc_phy_down(wlc_hw->band->pi);
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/nicpci.c
|
|
+++ /dev/null
|
|
@@ -1,826 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#include <linux/slab.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/pci.h>
|
|
-
|
|
-#include <defs.h>
|
|
-#include <soc.h>
|
|
-#include <chipcommon.h>
|
|
-#include "aiutils.h"
|
|
-#include "pub.h"
|
|
-#include "nicpci.h"
|
|
-
|
|
-/* SPROM offsets */
|
|
-#define SRSH_ASPM_OFFSET 4 /* word 4 */
|
|
-#define SRSH_ASPM_ENB 0x18 /* bit 3, 4 */
|
|
-#define SRSH_ASPM_L1_ENB 0x10 /* bit 4 */
|
|
-#define SRSH_ASPM_L0s_ENB 0x8 /* bit 3 */
|
|
-
|
|
-#define SRSH_PCIE_MISC_CONFIG 5 /* word 5 */
|
|
-#define SRSH_L23READY_EXIT_NOPERST 0x8000 /* bit 15 */
|
|
-#define SRSH_CLKREQ_OFFSET_REV5 20 /* word 20 for srom rev <= 5 */
|
|
-#define SRSH_CLKREQ_ENB 0x0800 /* bit 11 */
|
|
-#define SRSH_BD_OFFSET 6 /* word 6 */
|
|
-
|
|
-/* chipcontrol */
|
|
-#define CHIPCTRL_4321_PLL_DOWN 0x800000/* serdes PLL down override */
|
|
-
|
|
-/* MDIO control */
|
|
-#define MDIOCTL_DIVISOR_MASK 0x7f /* clock to be used on MDIO */
|
|
-#define MDIOCTL_DIVISOR_VAL 0x2
|
|
-#define MDIOCTL_PREAM_EN 0x80 /* Enable preamble sequnce */
|
|
-#define MDIOCTL_ACCESS_DONE 0x100 /* Transaction complete */
|
|
-
|
|
-/* MDIO Data */
|
|
-#define MDIODATA_MASK 0x0000ffff /* data 2 bytes */
|
|
-#define MDIODATA_TA 0x00020000 /* Turnaround */
|
|
-
|
|
-#define MDIODATA_REGADDR_SHF 18 /* Regaddr shift */
|
|
-#define MDIODATA_REGADDR_MASK 0x007c0000 /* Regaddr Mask */
|
|
-#define MDIODATA_DEVADDR_SHF 23 /* Physmedia devaddr shift */
|
|
-#define MDIODATA_DEVADDR_MASK 0x0f800000
|
|
- /* Physmedia devaddr Mask */
|
|
-
|
|
-/* MDIO Data for older revisions < 10 */
|
|
-#define MDIODATA_REGADDR_SHF_OLD 18 /* Regaddr shift */
|
|
-#define MDIODATA_REGADDR_MASK_OLD 0x003c0000
|
|
- /* Regaddr Mask */
|
|
-#define MDIODATA_DEVADDR_SHF_OLD 22 /* Physmedia devaddr shift */
|
|
-#define MDIODATA_DEVADDR_MASK_OLD 0x0fc00000
|
|
- /* Physmedia devaddr Mask */
|
|
-
|
|
-/* Transactions flags */
|
|
-#define MDIODATA_WRITE 0x10000000
|
|
-#define MDIODATA_READ 0x20000000
|
|
-#define MDIODATA_START 0x40000000
|
|
-
|
|
-#define MDIODATA_DEV_ADDR 0x0 /* dev address for serdes */
|
|
-#define MDIODATA_BLK_ADDR 0x1F /* blk address for serdes */
|
|
-
|
|
-/* serdes regs (rev < 10) */
|
|
-#define MDIODATA_DEV_PLL 0x1d /* SERDES PLL Dev */
|
|
-#define MDIODATA_DEV_TX 0x1e /* SERDES TX Dev */
|
|
-#define MDIODATA_DEV_RX 0x1f /* SERDES RX Dev */
|
|
-
|
|
-/* SERDES RX registers */
|
|
-#define SERDES_RX_CTRL 1 /* Rx cntrl */
|
|
-#define SERDES_RX_TIMER1 2 /* Rx Timer1 */
|
|
-#define SERDES_RX_CDR 6 /* CDR */
|
|
-#define SERDES_RX_CDRBW 7 /* CDR BW */
|
|
-/* SERDES RX control register */
|
|
-#define SERDES_RX_CTRL_FORCE 0x80 /* rxpolarity_force */
|
|
-#define SERDES_RX_CTRL_POLARITY 0x40 /* rxpolarity_value */
|
|
-
|
|
-/* SERDES PLL registers */
|
|
-#define SERDES_PLL_CTRL 1 /* PLL control reg */
|
|
-#define PLL_CTRL_FREQDET_EN 0x4000 /* bit 14 is FREQDET on */
|
|
-
|
|
-/* Linkcontrol reg offset in PCIE Cap */
|
|
-#define PCIE_CAP_LINKCTRL_OFFSET 16 /* offset in pcie cap */
|
|
-#define PCIE_CAP_LCREG_ASPML0s 0x01 /* ASPM L0s in linkctrl */
|
|
-#define PCIE_CAP_LCREG_ASPML1 0x02 /* ASPM L1 in linkctrl */
|
|
-#define PCIE_CLKREQ_ENAB 0x100 /* CLKREQ Enab in linkctrl */
|
|
-
|
|
-#define PCIE_ASPM_ENAB 3 /* ASPM L0s & L1 in linkctrl */
|
|
-#define PCIE_ASPM_L1_ENAB 2 /* ASPM L0s & L1 in linkctrl */
|
|
-#define PCIE_ASPM_L0s_ENAB 1 /* ASPM L0s & L1 in linkctrl */
|
|
-#define PCIE_ASPM_DISAB 0 /* ASPM L0s & L1 in linkctrl */
|
|
-
|
|
-/* Power management threshold */
|
|
-#define PCIE_L1THRESHOLDTIME_MASK 0xFF00 /* bits 8 - 15 */
|
|
-#define PCIE_L1THRESHOLDTIME_SHIFT 8 /* PCIE_L1THRESHOLDTIME_SHIFT */
|
|
-#define PCIE_L1THRESHOLD_WARVAL 0x72 /* WAR value */
|
|
-#define PCIE_ASPMTIMER_EXTEND 0x01000000
|
|
- /* > rev7:
|
|
- * enable extend ASPM timer
|
|
- */
|
|
-
|
|
-/* different register spaces to access thru pcie indirect access */
|
|
-#define PCIE_CONFIGREGS 1 /* Access to config space */
|
|
-#define PCIE_PCIEREGS 2 /* Access to pcie registers */
|
|
-
|
|
-/* PCIE protocol PHY diagnostic registers */
|
|
-#define PCIE_PLP_STATUSREG 0x204 /* Status */
|
|
-
|
|
-/* Status reg PCIE_PLP_STATUSREG */
|
|
-#define PCIE_PLP_POLARITYINV_STAT 0x10
|
|
-
|
|
-/* PCIE protocol DLLP diagnostic registers */
|
|
-#define PCIE_DLLP_LCREG 0x100 /* Link Control */
|
|
-#define PCIE_DLLP_PMTHRESHREG 0x128 /* Power Management Threshold */
|
|
-
|
|
-/* PCIE protocol TLP diagnostic registers */
|
|
-#define PCIE_TLP_WORKAROUNDSREG 0x004 /* TLP Workarounds */
|
|
-
|
|
-/* Sonics to PCI translation types */
|
|
-#define SBTOPCI_PREF 0x4 /* prefetch enable */
|
|
-#define SBTOPCI_BURST 0x8 /* burst enable */
|
|
-#define SBTOPCI_RC_READMULTI 0x20 /* memory read multiple */
|
|
-
|
|
-#define PCI_CLKRUN_DSBL 0x8000 /* Bit 15 forceClkrun */
|
|
-
|
|
-/* PCI core index in SROM shadow area */
|
|
-#define SRSH_PI_OFFSET 0 /* first word */
|
|
-#define SRSH_PI_MASK 0xf000 /* bit 15:12 */
|
|
-#define SRSH_PI_SHIFT 12 /* bit 15:12 */
|
|
-
|
|
-#define PCIREGOFFS(field) offsetof(struct sbpciregs, field)
|
|
-#define PCIEREGOFFS(field) offsetof(struct sbpcieregs, field)
|
|
-
|
|
-/* Sonics side: PCI core and host control registers */
|
|
-struct sbpciregs {
|
|
- u32 control; /* PCI control */
|
|
- u32 PAD[3];
|
|
- u32 arbcontrol; /* PCI arbiter control */
|
|
- u32 clkrun; /* Clkrun Control (>=rev11) */
|
|
- u32 PAD[2];
|
|
- u32 intstatus; /* Interrupt status */
|
|
- u32 intmask; /* Interrupt mask */
|
|
- u32 sbtopcimailbox; /* Sonics to PCI mailbox */
|
|
- u32 PAD[9];
|
|
- u32 bcastaddr; /* Sonics broadcast address */
|
|
- u32 bcastdata; /* Sonics broadcast data */
|
|
- u32 PAD[2];
|
|
- u32 gpioin; /* ro: gpio input (>=rev2) */
|
|
- u32 gpioout; /* rw: gpio output (>=rev2) */
|
|
- u32 gpioouten; /* rw: gpio output enable (>= rev2) */
|
|
- u32 gpiocontrol; /* rw: gpio control (>= rev2) */
|
|
- u32 PAD[36];
|
|
- u32 sbtopci0; /* Sonics to PCI translation 0 */
|
|
- u32 sbtopci1; /* Sonics to PCI translation 1 */
|
|
- u32 sbtopci2; /* Sonics to PCI translation 2 */
|
|
- u32 PAD[189];
|
|
- u32 pcicfg[4][64]; /* 0x400 - 0x7FF, PCI Cfg Space (>=rev8) */
|
|
- u16 sprom[36]; /* SPROM shadow Area */
|
|
- u32 PAD[46];
|
|
-};
|
|
-
|
|
-/* SB side: PCIE core and host control registers */
|
|
-struct sbpcieregs {
|
|
- u32 control; /* host mode only */
|
|
- u32 PAD[2];
|
|
- u32 biststatus; /* bist Status: 0x00C */
|
|
- u32 gpiosel; /* PCIE gpio sel: 0x010 */
|
|
- u32 gpioouten; /* PCIE gpio outen: 0x14 */
|
|
- u32 PAD[2];
|
|
- u32 intstatus; /* Interrupt status: 0x20 */
|
|
- u32 intmask; /* Interrupt mask: 0x24 */
|
|
- u32 sbtopcimailbox; /* sb to pcie mailbox: 0x028 */
|
|
- u32 PAD[53];
|
|
- u32 sbtopcie0; /* sb to pcie translation 0: 0x100 */
|
|
- u32 sbtopcie1; /* sb to pcie translation 1: 0x104 */
|
|
- u32 sbtopcie2; /* sb to pcie translation 2: 0x108 */
|
|
- u32 PAD[5];
|
|
-
|
|
- /* pcie core supports in direct access to config space */
|
|
- u32 configaddr; /* pcie config space access: Address field: 0x120 */
|
|
- u32 configdata; /* pcie config space access: Data field: 0x124 */
|
|
-
|
|
- /* mdio access to serdes */
|
|
- u32 mdiocontrol; /* controls the mdio access: 0x128 */
|
|
- u32 mdiodata; /* Data to the mdio access: 0x12c */
|
|
-
|
|
- /* pcie protocol phy/dllp/tlp register indirect access mechanism */
|
|
- u32 pcieindaddr; /* indirect access to
|
|
- * the internal register: 0x130
|
|
- */
|
|
- u32 pcieinddata; /* Data to/from the internal regsiter: 0x134 */
|
|
-
|
|
- u32 clkreqenctrl; /* >= rev 6, Clkreq rdma control : 0x138 */
|
|
- u32 PAD[177];
|
|
- u32 pciecfg[4][64]; /* 0x400 - 0x7FF, PCIE Cfg Space */
|
|
- u16 sprom[64]; /* SPROM shadow Area */
|
|
-};
|
|
-
|
|
-struct pcicore_info {
|
|
- struct bcma_device *core;
|
|
- struct si_pub *sih; /* System interconnect handle */
|
|
- struct pci_dev *dev;
|
|
- u8 pciecap_lcreg_offset;/* PCIE capability LCreg offset
|
|
- * in the config space
|
|
- */
|
|
- bool pcie_pr42767;
|
|
- u8 pcie_polarity;
|
|
- u8 pcie_war_aspm_ovr; /* Override ASPM/Clkreq settings */
|
|
-
|
|
- u8 pmecap_offset; /* PM Capability offset in the config space */
|
|
- bool pmecap; /* Capable of generating PME */
|
|
-};
|
|
-
|
|
-#define PCIE_ASPM(sih) \
|
|
- ((ai_get_buscoretype(sih) == PCIE_CORE_ID) && \
|
|
- ((ai_get_buscorerev(sih) >= 3) && \
|
|
- (ai_get_buscorerev(sih) <= 5)))
|
|
-
|
|
-
|
|
-/* delay needed between the mdio control/ mdiodata register data access */
|
|
-static void pr28829_delay(void)
|
|
-{
|
|
- udelay(10);
|
|
-}
|
|
-
|
|
-/* Initialize the PCI core.
|
|
- * It's caller's responsibility to make sure that this is done only once
|
|
- */
|
|
-struct pcicore_info *pcicore_init(struct si_pub *sih, struct bcma_device *core)
|
|
-{
|
|
- struct pcicore_info *pi;
|
|
-
|
|
- /* alloc struct pcicore_info */
|
|
- pi = kzalloc(sizeof(struct pcicore_info), GFP_ATOMIC);
|
|
- if (pi == NULL)
|
|
- return NULL;
|
|
-
|
|
- pi->sih = sih;
|
|
- pi->dev = core->bus->host_pci;
|
|
- pi->core = core;
|
|
-
|
|
- if (core->id.id == PCIE_CORE_ID) {
|
|
- u8 cap_ptr;
|
|
- cap_ptr = pcicore_find_pci_capability(pi->dev, PCI_CAP_ID_EXP,
|
|
- NULL, NULL);
|
|
- pi->pciecap_lcreg_offset = cap_ptr + PCIE_CAP_LINKCTRL_OFFSET;
|
|
- }
|
|
- return pi;
|
|
-}
|
|
-
|
|
-void pcicore_deinit(struct pcicore_info *pch)
|
|
-{
|
|
- kfree(pch);
|
|
-}
|
|
-
|
|
-/* return cap_offset if requested capability exists in the PCI config space */
|
|
-/* Note that it's caller's responsibility to make sure it's a pci bus */
|
|
-u8
|
|
-pcicore_find_pci_capability(struct pci_dev *dev, u8 req_cap_id,
|
|
- unsigned char *buf, u32 *buflen)
|
|
-{
|
|
- u8 cap_id;
|
|
- u8 cap_ptr = 0;
|
|
- u32 bufsize;
|
|
- u8 byte_val;
|
|
-
|
|
- /* check for Header type 0 */
|
|
- pci_read_config_byte(dev, PCI_HEADER_TYPE, &byte_val);
|
|
- if ((byte_val & 0x7f) != PCI_HEADER_TYPE_NORMAL)
|
|
- goto end;
|
|
-
|
|
- /* check if the capability pointer field exists */
|
|
- pci_read_config_byte(dev, PCI_STATUS, &byte_val);
|
|
- if (!(byte_val & PCI_STATUS_CAP_LIST))
|
|
- goto end;
|
|
-
|
|
- pci_read_config_byte(dev, PCI_CAPABILITY_LIST, &cap_ptr);
|
|
- /* check if the capability pointer is 0x00 */
|
|
- if (cap_ptr == 0x00)
|
|
- goto end;
|
|
-
|
|
- /* loop thru the capability list
|
|
- * and see if the pcie capability exists
|
|
- */
|
|
-
|
|
- pci_read_config_byte(dev, cap_ptr, &cap_id);
|
|
-
|
|
- while (cap_id != req_cap_id) {
|
|
- pci_read_config_byte(dev, cap_ptr + 1, &cap_ptr);
|
|
- if (cap_ptr == 0x00)
|
|
- break;
|
|
- pci_read_config_byte(dev, cap_ptr, &cap_id);
|
|
- }
|
|
- if (cap_id != req_cap_id)
|
|
- goto end;
|
|
-
|
|
- /* found the caller requested capability */
|
|
- if (buf != NULL && buflen != NULL) {
|
|
- u8 cap_data;
|
|
-
|
|
- bufsize = *buflen;
|
|
- if (!bufsize)
|
|
- goto end;
|
|
- *buflen = 0;
|
|
- /* copy the capability data excluding cap ID and next ptr */
|
|
- cap_data = cap_ptr + 2;
|
|
- if ((bufsize + cap_data) > PCI_SZPCR)
|
|
- bufsize = PCI_SZPCR - cap_data;
|
|
- *buflen = bufsize;
|
|
- while (bufsize--) {
|
|
- pci_read_config_byte(dev, cap_data, buf);
|
|
- cap_data++;
|
|
- buf++;
|
|
- }
|
|
- }
|
|
-end:
|
|
- return cap_ptr;
|
|
-}
|
|
-
|
|
-/* ***** Register Access API */
|
|
-static uint
|
|
-pcie_readreg(struct bcma_device *core, uint addrtype, uint offset)
|
|
-{
|
|
- uint retval = 0xFFFFFFFF;
|
|
-
|
|
- switch (addrtype) {
|
|
- case PCIE_CONFIGREGS:
|
|
- bcma_write32(core, PCIEREGOFFS(configaddr), offset);
|
|
- (void)bcma_read32(core, PCIEREGOFFS(configaddr));
|
|
- retval = bcma_read32(core, PCIEREGOFFS(configdata));
|
|
- break;
|
|
- case PCIE_PCIEREGS:
|
|
- bcma_write32(core, PCIEREGOFFS(pcieindaddr), offset);
|
|
- (void)bcma_read32(core, PCIEREGOFFS(pcieindaddr));
|
|
- retval = bcma_read32(core, PCIEREGOFFS(pcieinddata));
|
|
- break;
|
|
- }
|
|
-
|
|
- return retval;
|
|
-}
|
|
-
|
|
-static uint pcie_writereg(struct bcma_device *core, uint addrtype,
|
|
- uint offset, uint val)
|
|
-{
|
|
- switch (addrtype) {
|
|
- case PCIE_CONFIGREGS:
|
|
- bcma_write32(core, PCIEREGOFFS(configaddr), offset);
|
|
- bcma_write32(core, PCIEREGOFFS(configdata), val);
|
|
- break;
|
|
- case PCIE_PCIEREGS:
|
|
- bcma_write32(core, PCIEREGOFFS(pcieindaddr), offset);
|
|
- bcma_write32(core, PCIEREGOFFS(pcieinddata), val);
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static bool pcie_mdiosetblock(struct pcicore_info *pi, uint blk)
|
|
-{
|
|
- uint mdiodata, i = 0;
|
|
- uint pcie_serdes_spinwait = 200;
|
|
-
|
|
- mdiodata = (MDIODATA_START | MDIODATA_WRITE | MDIODATA_TA |
|
|
- (MDIODATA_DEV_ADDR << MDIODATA_DEVADDR_SHF) |
|
|
- (MDIODATA_BLK_ADDR << MDIODATA_REGADDR_SHF) |
|
|
- (blk << 4));
|
|
- bcma_write32(pi->core, PCIEREGOFFS(mdiodata), mdiodata);
|
|
-
|
|
- pr28829_delay();
|
|
- /* retry till the transaction is complete */
|
|
- while (i < pcie_serdes_spinwait) {
|
|
- if (bcma_read32(pi->core, PCIEREGOFFS(mdiocontrol)) &
|
|
- MDIOCTL_ACCESS_DONE)
|
|
- break;
|
|
-
|
|
- udelay(1000);
|
|
- i++;
|
|
- }
|
|
-
|
|
- if (i >= pcie_serdes_spinwait)
|
|
- return false;
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-static int
|
|
-pcie_mdioop(struct pcicore_info *pi, uint physmedia, uint regaddr, bool write,
|
|
- uint *val)
|
|
-{
|
|
- uint mdiodata;
|
|
- uint i = 0;
|
|
- uint pcie_serdes_spinwait = 10;
|
|
-
|
|
- /* enable mdio access to SERDES */
|
|
- bcma_write32(pi->core, PCIEREGOFFS(mdiocontrol),
|
|
- MDIOCTL_PREAM_EN | MDIOCTL_DIVISOR_VAL);
|
|
-
|
|
- if (ai_get_buscorerev(pi->sih) >= 10) {
|
|
- /* new serdes is slower in rw,
|
|
- * using two layers of reg address mapping
|
|
- */
|
|
- if (!pcie_mdiosetblock(pi, physmedia))
|
|
- return 1;
|
|
- mdiodata = ((MDIODATA_DEV_ADDR << MDIODATA_DEVADDR_SHF) |
|
|
- (regaddr << MDIODATA_REGADDR_SHF));
|
|
- pcie_serdes_spinwait *= 20;
|
|
- } else {
|
|
- mdiodata = ((physmedia << MDIODATA_DEVADDR_SHF_OLD) |
|
|
- (regaddr << MDIODATA_REGADDR_SHF_OLD));
|
|
- }
|
|
-
|
|
- if (!write)
|
|
- mdiodata |= (MDIODATA_START | MDIODATA_READ | MDIODATA_TA);
|
|
- else
|
|
- mdiodata |= (MDIODATA_START | MDIODATA_WRITE | MDIODATA_TA |
|
|
- *val);
|
|
-
|
|
- bcma_write32(pi->core, PCIEREGOFFS(mdiodata), mdiodata);
|
|
-
|
|
- pr28829_delay();
|
|
-
|
|
- /* retry till the transaction is complete */
|
|
- while (i < pcie_serdes_spinwait) {
|
|
- if (bcma_read32(pi->core, PCIEREGOFFS(mdiocontrol)) &
|
|
- MDIOCTL_ACCESS_DONE) {
|
|
- if (!write) {
|
|
- pr28829_delay();
|
|
- *val = (bcma_read32(pi->core,
|
|
- PCIEREGOFFS(mdiodata)) &
|
|
- MDIODATA_MASK);
|
|
- }
|
|
- /* Disable mdio access to SERDES */
|
|
- bcma_write32(pi->core, PCIEREGOFFS(mdiocontrol), 0);
|
|
- return 0;
|
|
- }
|
|
- udelay(1000);
|
|
- i++;
|
|
- }
|
|
-
|
|
- /* Timed out. Disable mdio access to SERDES. */
|
|
- bcma_write32(pi->core, PCIEREGOFFS(mdiocontrol), 0);
|
|
- return 1;
|
|
-}
|
|
-
|
|
-/* use the mdio interface to read from mdio slaves */
|
|
-static int
|
|
-pcie_mdioread(struct pcicore_info *pi, uint physmedia, uint regaddr,
|
|
- uint *regval)
|
|
-{
|
|
- return pcie_mdioop(pi, physmedia, regaddr, false, regval);
|
|
-}
|
|
-
|
|
-/* use the mdio interface to write to mdio slaves */
|
|
-static int
|
|
-pcie_mdiowrite(struct pcicore_info *pi, uint physmedia, uint regaddr, uint val)
|
|
-{
|
|
- return pcie_mdioop(pi, physmedia, regaddr, true, &val);
|
|
-}
|
|
-
|
|
-/* ***** Support functions ***** */
|
|
-static u8 pcie_clkreq(struct pcicore_info *pi, u32 mask, u32 val)
|
|
-{
|
|
- u32 reg_val;
|
|
- u8 offset;
|
|
-
|
|
- offset = pi->pciecap_lcreg_offset;
|
|
- if (!offset)
|
|
- return 0;
|
|
-
|
|
- pci_read_config_dword(pi->dev, offset, ®_val);
|
|
- /* set operation */
|
|
- if (mask) {
|
|
- if (val)
|
|
- reg_val |= PCIE_CLKREQ_ENAB;
|
|
- else
|
|
- reg_val &= ~PCIE_CLKREQ_ENAB;
|
|
- pci_write_config_dword(pi->dev, offset, reg_val);
|
|
- pci_read_config_dword(pi->dev, offset, ®_val);
|
|
- }
|
|
- if (reg_val & PCIE_CLKREQ_ENAB)
|
|
- return 1;
|
|
- else
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void pcie_extendL1timer(struct pcicore_info *pi, bool extend)
|
|
-{
|
|
- u32 w;
|
|
- struct si_pub *sih = pi->sih;
|
|
-
|
|
- if (ai_get_buscoretype(sih) != PCIE_CORE_ID ||
|
|
- ai_get_buscorerev(sih) < 7)
|
|
- return;
|
|
-
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS, PCIE_DLLP_PMTHRESHREG);
|
|
- if (extend)
|
|
- w |= PCIE_ASPMTIMER_EXTEND;
|
|
- else
|
|
- w &= ~PCIE_ASPMTIMER_EXTEND;
|
|
- pcie_writereg(pi->core, PCIE_PCIEREGS, PCIE_DLLP_PMTHRESHREG, w);
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS, PCIE_DLLP_PMTHRESHREG);
|
|
-}
|
|
-
|
|
-/* centralized clkreq control policy */
|
|
-static void pcie_clkreq_upd(struct pcicore_info *pi, uint state)
|
|
-{
|
|
- struct si_pub *sih = pi->sih;
|
|
-
|
|
- switch (state) {
|
|
- case SI_DOATTACH:
|
|
- if (PCIE_ASPM(sih))
|
|
- pcie_clkreq(pi, 1, 0);
|
|
- break;
|
|
- case SI_PCIDOWN:
|
|
- /* turn on serdes PLL down */
|
|
- if (ai_get_buscorerev(sih) == 6) {
|
|
- ai_cc_reg(sih,
|
|
- offsetof(struct chipcregs, chipcontrol_addr),
|
|
- ~0, 0);
|
|
- ai_cc_reg(sih,
|
|
- offsetof(struct chipcregs, chipcontrol_data),
|
|
- ~0x40, 0);
|
|
- } else if (pi->pcie_pr42767) {
|
|
- pcie_clkreq(pi, 1, 1);
|
|
- }
|
|
- break;
|
|
- case SI_PCIUP:
|
|
- /* turn off serdes PLL down */
|
|
- if (ai_get_buscorerev(sih) == 6) {
|
|
- ai_cc_reg(sih,
|
|
- offsetof(struct chipcregs, chipcontrol_addr),
|
|
- ~0, 0);
|
|
- ai_cc_reg(sih,
|
|
- offsetof(struct chipcregs, chipcontrol_data),
|
|
- ~0x40, 0x40);
|
|
- } else if (PCIE_ASPM(sih)) { /* disable clkreq */
|
|
- pcie_clkreq(pi, 1, 0);
|
|
- }
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-/* ***** PCI core WARs ***** */
|
|
-/* Done only once at attach time */
|
|
-static void pcie_war_polarity(struct pcicore_info *pi)
|
|
-{
|
|
- u32 w;
|
|
-
|
|
- if (pi->pcie_polarity != 0)
|
|
- return;
|
|
-
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS, PCIE_PLP_STATUSREG);
|
|
-
|
|
- /* Detect the current polarity at attach and force that polarity and
|
|
- * disable changing the polarity
|
|
- */
|
|
- if ((w & PCIE_PLP_POLARITYINV_STAT) == 0)
|
|
- pi->pcie_polarity = SERDES_RX_CTRL_FORCE;
|
|
- else
|
|
- pi->pcie_polarity = (SERDES_RX_CTRL_FORCE |
|
|
- SERDES_RX_CTRL_POLARITY);
|
|
-}
|
|
-
|
|
-/* enable ASPM and CLKREQ if srom doesn't have it */
|
|
-/* Needs to happen when update to shadow SROM is needed
|
|
- * : Coming out of 'standby'/'hibernate'
|
|
- * : If pcie_war_aspm_ovr state changed
|
|
- */
|
|
-static void pcie_war_aspm_clkreq(struct pcicore_info *pi)
|
|
-{
|
|
- struct si_pub *sih = pi->sih;
|
|
- u16 val16;
|
|
- u32 w;
|
|
-
|
|
- if (!PCIE_ASPM(sih))
|
|
- return;
|
|
-
|
|
- /* bypass this on QT or VSIM */
|
|
- val16 = bcma_read16(pi->core, PCIEREGOFFS(sprom[SRSH_ASPM_OFFSET]));
|
|
-
|
|
- val16 &= ~SRSH_ASPM_ENB;
|
|
- if (pi->pcie_war_aspm_ovr == PCIE_ASPM_ENAB)
|
|
- val16 |= SRSH_ASPM_ENB;
|
|
- else if (pi->pcie_war_aspm_ovr == PCIE_ASPM_L1_ENAB)
|
|
- val16 |= SRSH_ASPM_L1_ENB;
|
|
- else if (pi->pcie_war_aspm_ovr == PCIE_ASPM_L0s_ENAB)
|
|
- val16 |= SRSH_ASPM_L0s_ENB;
|
|
-
|
|
- bcma_write16(pi->core, PCIEREGOFFS(sprom[SRSH_ASPM_OFFSET]), val16);
|
|
-
|
|
- pci_read_config_dword(pi->dev, pi->pciecap_lcreg_offset, &w);
|
|
- w &= ~PCIE_ASPM_ENAB;
|
|
- w |= pi->pcie_war_aspm_ovr;
|
|
- pci_write_config_dword(pi->dev, pi->pciecap_lcreg_offset, w);
|
|
-
|
|
- val16 = bcma_read16(pi->core,
|
|
- PCIEREGOFFS(sprom[SRSH_CLKREQ_OFFSET_REV5]));
|
|
-
|
|
- if (pi->pcie_war_aspm_ovr != PCIE_ASPM_DISAB) {
|
|
- val16 |= SRSH_CLKREQ_ENB;
|
|
- pi->pcie_pr42767 = true;
|
|
- } else
|
|
- val16 &= ~SRSH_CLKREQ_ENB;
|
|
-
|
|
- bcma_write16(pi->core, PCIEREGOFFS(sprom[SRSH_CLKREQ_OFFSET_REV5]),
|
|
- val16);
|
|
-}
|
|
-
|
|
-/* Apply the polarity determined at the start */
|
|
-/* Needs to happen when coming out of 'standby'/'hibernate' */
|
|
-static void pcie_war_serdes(struct pcicore_info *pi)
|
|
-{
|
|
- u32 w = 0;
|
|
-
|
|
- if (pi->pcie_polarity != 0)
|
|
- pcie_mdiowrite(pi, MDIODATA_DEV_RX, SERDES_RX_CTRL,
|
|
- pi->pcie_polarity);
|
|
-
|
|
- pcie_mdioread(pi, MDIODATA_DEV_PLL, SERDES_PLL_CTRL, &w);
|
|
- if (w & PLL_CTRL_FREQDET_EN) {
|
|
- w &= ~PLL_CTRL_FREQDET_EN;
|
|
- pcie_mdiowrite(pi, MDIODATA_DEV_PLL, SERDES_PLL_CTRL, w);
|
|
- }
|
|
-}
|
|
-
|
|
-/* Fix MISC config to allow coming out of L2/L3-Ready state w/o PRST */
|
|
-/* Needs to happen when coming out of 'standby'/'hibernate' */
|
|
-static void pcie_misc_config_fixup(struct pcicore_info *pi)
|
|
-{
|
|
- u16 val16;
|
|
-
|
|
- val16 = bcma_read16(pi->core,
|
|
- PCIEREGOFFS(sprom[SRSH_PCIE_MISC_CONFIG]));
|
|
-
|
|
- if ((val16 & SRSH_L23READY_EXIT_NOPERST) == 0) {
|
|
- val16 |= SRSH_L23READY_EXIT_NOPERST;
|
|
- bcma_write16(pi->core,
|
|
- PCIEREGOFFS(sprom[SRSH_PCIE_MISC_CONFIG]), val16);
|
|
- }
|
|
-}
|
|
-
|
|
-/* quick hack for testing */
|
|
-/* Needs to happen when coming out of 'standby'/'hibernate' */
|
|
-static void pcie_war_noplldown(struct pcicore_info *pi)
|
|
-{
|
|
- /* turn off serdes PLL down */
|
|
- ai_cc_reg(pi->sih, offsetof(struct chipcregs, chipcontrol),
|
|
- CHIPCTRL_4321_PLL_DOWN, CHIPCTRL_4321_PLL_DOWN);
|
|
-
|
|
- /* clear srom shadow backdoor */
|
|
- bcma_write16(pi->core, PCIEREGOFFS(sprom[SRSH_BD_OFFSET]), 0);
|
|
-}
|
|
-
|
|
-/* Needs to happen when coming out of 'standby'/'hibernate' */
|
|
-static void pcie_war_pci_setup(struct pcicore_info *pi)
|
|
-{
|
|
- struct si_pub *sih = pi->sih;
|
|
- u32 w;
|
|
-
|
|
- if (ai_get_buscorerev(sih) == 0 || ai_get_buscorerev(sih) == 1) {
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS,
|
|
- PCIE_TLP_WORKAROUNDSREG);
|
|
- w |= 0x8;
|
|
- pcie_writereg(pi->core, PCIE_PCIEREGS,
|
|
- PCIE_TLP_WORKAROUNDSREG, w);
|
|
- }
|
|
-
|
|
- if (ai_get_buscorerev(sih) == 1) {
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS, PCIE_DLLP_LCREG);
|
|
- w |= 0x40;
|
|
- pcie_writereg(pi->core, PCIE_PCIEREGS, PCIE_DLLP_LCREG, w);
|
|
- }
|
|
-
|
|
- if (ai_get_buscorerev(sih) == 0) {
|
|
- pcie_mdiowrite(pi, MDIODATA_DEV_RX, SERDES_RX_TIMER1, 0x8128);
|
|
- pcie_mdiowrite(pi, MDIODATA_DEV_RX, SERDES_RX_CDR, 0x0100);
|
|
- pcie_mdiowrite(pi, MDIODATA_DEV_RX, SERDES_RX_CDRBW, 0x1466);
|
|
- } else if (PCIE_ASPM(sih)) {
|
|
- /* Change the L1 threshold for better performance */
|
|
- w = pcie_readreg(pi->core, PCIE_PCIEREGS,
|
|
- PCIE_DLLP_PMTHRESHREG);
|
|
- w &= ~PCIE_L1THRESHOLDTIME_MASK;
|
|
- w |= PCIE_L1THRESHOLD_WARVAL << PCIE_L1THRESHOLDTIME_SHIFT;
|
|
- pcie_writereg(pi->core, PCIE_PCIEREGS,
|
|
- PCIE_DLLP_PMTHRESHREG, w);
|
|
-
|
|
- pcie_war_serdes(pi);
|
|
-
|
|
- pcie_war_aspm_clkreq(pi);
|
|
- } else if (ai_get_buscorerev(pi->sih) == 7)
|
|
- pcie_war_noplldown(pi);
|
|
-
|
|
- /* Note that the fix is actually in the SROM,
|
|
- * that's why this is open-ended
|
|
- */
|
|
- if (ai_get_buscorerev(pi->sih) >= 6)
|
|
- pcie_misc_config_fixup(pi);
|
|
-}
|
|
-
|
|
-/* ***** Functions called during driver state changes ***** */
|
|
-void pcicore_attach(struct pcicore_info *pi, int state)
|
|
-{
|
|
- struct si_pub *sih = pi->sih;
|
|
- u32 bfl2 = (u32)getintvar(sih, BRCMS_SROM_BOARDFLAGS2);
|
|
-
|
|
- /* Determine if this board needs override */
|
|
- if (PCIE_ASPM(sih)) {
|
|
- if (bfl2 & BFL2_PCIEWAR_OVR)
|
|
- pi->pcie_war_aspm_ovr = PCIE_ASPM_DISAB;
|
|
- else
|
|
- pi->pcie_war_aspm_ovr = PCIE_ASPM_ENAB;
|
|
- }
|
|
-
|
|
- /* These need to happen in this order only */
|
|
- pcie_war_polarity(pi);
|
|
-
|
|
- pcie_war_serdes(pi);
|
|
-
|
|
- pcie_war_aspm_clkreq(pi);
|
|
-
|
|
- pcie_clkreq_upd(pi, state);
|
|
-
|
|
-}
|
|
-
|
|
-void pcicore_hwup(struct pcicore_info *pi)
|
|
-{
|
|
- if (!pi || ai_get_buscoretype(pi->sih) != PCIE_CORE_ID)
|
|
- return;
|
|
-
|
|
- pcie_war_pci_setup(pi);
|
|
-}
|
|
-
|
|
-void pcicore_up(struct pcicore_info *pi, int state)
|
|
-{
|
|
- if (!pi || ai_get_buscoretype(pi->sih) != PCIE_CORE_ID)
|
|
- return;
|
|
-
|
|
- /* Restore L1 timer for better performance */
|
|
- pcie_extendL1timer(pi, true);
|
|
-
|
|
- pcie_clkreq_upd(pi, state);
|
|
-}
|
|
-
|
|
-/* When the device is going to enter D3 state
|
|
- * (or the system is going to enter S3/S4 states)
|
|
- */
|
|
-void pcicore_sleep(struct pcicore_info *pi)
|
|
-{
|
|
- u32 w;
|
|
-
|
|
- if (!pi || !PCIE_ASPM(pi->sih))
|
|
- return;
|
|
-
|
|
- pci_read_config_dword(pi->dev, pi->pciecap_lcreg_offset, &w);
|
|
- w &= ~PCIE_CAP_LCREG_ASPML1;
|
|
- pci_write_config_dword(pi->dev, pi->pciecap_lcreg_offset, w);
|
|
-
|
|
- pi->pcie_pr42767 = false;
|
|
-}
|
|
-
|
|
-void pcicore_down(struct pcicore_info *pi, int state)
|
|
-{
|
|
- if (!pi || ai_get_buscoretype(pi->sih) != PCIE_CORE_ID)
|
|
- return;
|
|
-
|
|
- pcie_clkreq_upd(pi, state);
|
|
-
|
|
- /* Reduce L1 timer for better power savings */
|
|
- pcie_extendL1timer(pi, false);
|
|
-}
|
|
-
|
|
-void pcicore_fixcfg(struct pcicore_info *pi)
|
|
-{
|
|
- struct bcma_device *core = pi->core;
|
|
- u16 val16;
|
|
- uint regoff;
|
|
-
|
|
- switch (pi->core->id.id) {
|
|
- case BCMA_CORE_PCI:
|
|
- regoff = PCIREGOFFS(sprom[SRSH_PI_OFFSET]);
|
|
- break;
|
|
-
|
|
- case BCMA_CORE_PCIE:
|
|
- regoff = PCIEREGOFFS(sprom[SRSH_PI_OFFSET]);
|
|
- break;
|
|
-
|
|
- default:
|
|
- return;
|
|
- }
|
|
-
|
|
- val16 = bcma_read16(pi->core, regoff);
|
|
- if (((val16 & SRSH_PI_MASK) >> SRSH_PI_SHIFT) !=
|
|
- (u16)core->core_index) {
|
|
- val16 = ((u16)core->core_index << SRSH_PI_SHIFT) |
|
|
- (val16 & ~SRSH_PI_MASK);
|
|
- bcma_write16(pi->core, regoff, val16);
|
|
- }
|
|
-}
|
|
-
|
|
-/* precondition: current core is pci core */
|
|
-void
|
|
-pcicore_pci_setup(struct pcicore_info *pi)
|
|
-{
|
|
- bcma_set32(pi->core, PCIREGOFFS(sbtopci2),
|
|
- SBTOPCI_PREF | SBTOPCI_BURST);
|
|
-
|
|
- if (pi->core->id.rev >= 11) {
|
|
- bcma_set32(pi->core, PCIREGOFFS(sbtopci2),
|
|
- SBTOPCI_RC_READMULTI);
|
|
- bcma_set32(pi->core, PCIREGOFFS(clkrun), PCI_CLKRUN_DSBL);
|
|
- (void)bcma_read32(pi->core, PCIREGOFFS(clkrun));
|
|
- }
|
|
-}
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/nicpci.h
|
|
+++ /dev/null
|
|
@@ -1,77 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#ifndef _BRCM_NICPCI_H_
|
|
-#define _BRCM_NICPCI_H_
|
|
-
|
|
-#include "types.h"
|
|
-
|
|
-/* PCI configuration address space size */
|
|
-#define PCI_SZPCR 256
|
|
-
|
|
-/* Brcm PCI configuration registers */
|
|
-/* backplane address space accessed by BAR0 */
|
|
-#define PCI_BAR0_WIN 0x80
|
|
-/* sprom property control */
|
|
-#define PCI_SPROM_CONTROL 0x88
|
|
-/* mask of PCI and other cores interrupts */
|
|
-#define PCI_INT_MASK 0x94
|
|
-/* backplane core interrupt mask bits offset */
|
|
-#define PCI_SBIM_SHIFT 8
|
|
-/* backplane address space accessed by second 4KB of BAR0 */
|
|
-#define PCI_BAR0_WIN2 0xac
|
|
-/* pci config space gpio input (>=rev3) */
|
|
-#define PCI_GPIO_IN 0xb0
|
|
-/* pci config space gpio output (>=rev3) */
|
|
-#define PCI_GPIO_OUT 0xb4
|
|
-/* pci config space gpio output enable (>=rev3) */
|
|
-#define PCI_GPIO_OUTEN 0xb8
|
|
-
|
|
-/* bar0 + 4K accesses external sprom */
|
|
-#define PCI_BAR0_SPROM_OFFSET (4 * 1024)
|
|
-/* bar0 + 6K accesses pci core registers */
|
|
-#define PCI_BAR0_PCIREGS_OFFSET (6 * 1024)
|
|
-/*
|
|
- * pci core SB registers are at the end of the
|
|
- * 8KB window, so their address is the "regular"
|
|
- * address plus 4K
|
|
- */
|
|
-#define PCI_BAR0_PCISBR_OFFSET (4 * 1024)
|
|
-/* bar0 window size Match with corerev 13 */
|
|
-#define PCI_BAR0_WINSZ (16 * 1024)
|
|
-/* On pci corerev >= 13 and all pcie, the bar0 is now 16KB and it maps: */
|
|
-/* bar0 + 8K accesses pci/pcie core registers */
|
|
-#define PCI_16KB0_PCIREGS_OFFSET (8 * 1024)
|
|
-/* bar0 + 12K accesses chipc core registers */
|
|
-#define PCI_16KB0_CCREGS_OFFSET (12 * 1024)
|
|
-
|
|
-struct sbpciregs;
|
|
-struct sbpcieregs;
|
|
-
|
|
-extern struct pcicore_info *pcicore_init(struct si_pub *sih,
|
|
- struct bcma_device *core);
|
|
-extern void pcicore_deinit(struct pcicore_info *pch);
|
|
-extern void pcicore_attach(struct pcicore_info *pch, int state);
|
|
-extern void pcicore_hwup(struct pcicore_info *pch);
|
|
-extern void pcicore_up(struct pcicore_info *pch, int state);
|
|
-extern void pcicore_sleep(struct pcicore_info *pch);
|
|
-extern void pcicore_down(struct pcicore_info *pch, int state);
|
|
-extern u8 pcicore_find_pci_capability(struct pci_dev *dev, u8 req_cap_id,
|
|
- unsigned char *buf, u32 *buflen);
|
|
-extern void pcicore_fixcfg(struct pcicore_info *pch);
|
|
-extern void pcicore_pci_setup(struct pcicore_info *pch);
|
|
-
|
|
-#endif /* _BRCM_NICPCI_H_ */
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/otp.c
|
|
+++ /dev/null
|
|
@@ -1,410 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#include <linux/io.h>
|
|
-#include <linux/errno.h>
|
|
-#include <linux/string.h>
|
|
-
|
|
-#include <brcm_hw_ids.h>
|
|
-#include <chipcommon.h>
|
|
-#include "aiutils.h"
|
|
-#include "otp.h"
|
|
-
|
|
-#define OTPS_GUP_MASK 0x00000f00
|
|
-#define OTPS_GUP_SHIFT 8
|
|
-/* h/w subregion is programmed */
|
|
-#define OTPS_GUP_HW 0x00000100
|
|
-/* s/w subregion is programmed */
|
|
-#define OTPS_GUP_SW 0x00000200
|
|
-/* chipid/pkgopt subregion is programmed */
|
|
-#define OTPS_GUP_CI 0x00000400
|
|
-/* fuse subregion is programmed */
|
|
-#define OTPS_GUP_FUSE 0x00000800
|
|
-
|
|
-/* Fields in otpprog in rev >= 21 */
|
|
-#define OTPP_COL_MASK 0x000000ff
|
|
-#define OTPP_COL_SHIFT 0
|
|
-#define OTPP_ROW_MASK 0x0000ff00
|
|
-#define OTPP_ROW_SHIFT 8
|
|
-#define OTPP_OC_MASK 0x0f000000
|
|
-#define OTPP_OC_SHIFT 24
|
|
-#define OTPP_READERR 0x10000000
|
|
-#define OTPP_VALUE_MASK 0x20000000
|
|
-#define OTPP_VALUE_SHIFT 29
|
|
-#define OTPP_START_BUSY 0x80000000
|
|
-#define OTPP_READ 0x40000000
|
|
-
|
|
-/* Opcodes for OTPP_OC field */
|
|
-#define OTPPOC_READ 0
|
|
-#define OTPPOC_BIT_PROG 1
|
|
-#define OTPPOC_VERIFY 3
|
|
-#define OTPPOC_INIT 4
|
|
-#define OTPPOC_SET 5
|
|
-#define OTPPOC_RESET 6
|
|
-#define OTPPOC_OCST 7
|
|
-#define OTPPOC_ROW_LOCK 8
|
|
-#define OTPPOC_PRESCN_TEST 9
|
|
-
|
|
-#define OTPTYPE_IPX(ccrev) ((ccrev) == 21 || (ccrev) >= 23)
|
|
-
|
|
-#define OTPP_TRIES 10000000 /* # of tries for OTPP */
|
|
-
|
|
-#define MAXNUMRDES 9 /* Maximum OTP redundancy entries */
|
|
-
|
|
-/* Fixed size subregions sizes in words */
|
|
-#define OTPGU_CI_SZ 2
|
|
-
|
|
-struct otpinfo;
|
|
-
|
|
-/* OTP function struct */
|
|
-struct otp_fn_s {
|
|
- int (*init)(struct si_pub *sih, struct otpinfo *oi);
|
|
- int (*read_region)(struct otpinfo *oi, int region, u16 *data,
|
|
- uint *wlen);
|
|
-};
|
|
-
|
|
-struct otpinfo {
|
|
- struct bcma_device *core; /* chipc core */
|
|
- const struct otp_fn_s *fn; /* OTP functions */
|
|
- struct si_pub *sih; /* Saved sb handle */
|
|
-
|
|
- /* IPX OTP section */
|
|
- u16 wsize; /* Size of otp in words */
|
|
- u16 rows; /* Geometry */
|
|
- u16 cols; /* Geometry */
|
|
- u32 status; /* Flag bits (lock/prog/rv).
|
|
- * (Reflected only when OTP is power cycled)
|
|
- */
|
|
- u16 hwbase; /* hardware subregion offset */
|
|
- u16 hwlim; /* hardware subregion boundary */
|
|
- u16 swbase; /* software subregion offset */
|
|
- u16 swlim; /* software subregion boundary */
|
|
- u16 fbase; /* fuse subregion offset */
|
|
- u16 flim; /* fuse subregion boundary */
|
|
- int otpgu_base; /* offset to General Use Region */
|
|
-};
|
|
-
|
|
-/* OTP layout */
|
|
-/* CC revs 21, 24 and 27 OTP General Use Region word offset */
|
|
-#define REVA4_OTPGU_BASE 12
|
|
-
|
|
-/* CC revs 23, 25, 26, 28 and above OTP General Use Region word offset */
|
|
-#define REVB8_OTPGU_BASE 20
|
|
-
|
|
-/* CC rev 36 OTP General Use Region word offset */
|
|
-#define REV36_OTPGU_BASE 12
|
|
-
|
|
-/* Subregion word offsets in General Use region */
|
|
-#define OTPGU_HSB_OFF 0
|
|
-#define OTPGU_SFB_OFF 1
|
|
-#define OTPGU_CI_OFF 2
|
|
-#define OTPGU_P_OFF 3
|
|
-#define OTPGU_SROM_OFF 4
|
|
-
|
|
-/* Flag bit offsets in General Use region */
|
|
-#define OTPGU_HWP_OFF 60
|
|
-#define OTPGU_SWP_OFF 61
|
|
-#define OTPGU_CIP_OFF 62
|
|
-#define OTPGU_FUSEP_OFF 63
|
|
-#define OTPGU_CIP_MSK 0x4000
|
|
-#define OTPGU_P_MSK 0xf000
|
|
-#define OTPGU_P_SHIFT (OTPGU_HWP_OFF % 16)
|
|
-
|
|
-/* OTP Size */
|
|
-#define OTP_SZ_FU_324 ((roundup(324, 8))/8) /* 324 bits */
|
|
-#define OTP_SZ_FU_288 (288/8) /* 288 bits */
|
|
-#define OTP_SZ_FU_216 (216/8) /* 216 bits */
|
|
-#define OTP_SZ_FU_72 (72/8) /* 72 bits */
|
|
-#define OTP_SZ_CHECKSUM (16/8) /* 16 bits */
|
|
-#define OTP4315_SWREG_SZ 178 /* 178 bytes */
|
|
-#define OTP_SZ_FU_144 (144/8) /* 144 bits */
|
|
-
|
|
-static u16
|
|
-ipxotp_otpr(struct otpinfo *oi, uint wn)
|
|
-{
|
|
- return bcma_read16(oi->core,
|
|
- CHIPCREGOFFS(sromotp[wn]));
|
|
-}
|
|
-
|
|
-/*
|
|
- * Calculate max HW/SW region byte size by subtracting fuse region
|
|
- * and checksum size, osizew is oi->wsize (OTP size - GU size) in words
|
|
- */
|
|
-static int ipxotp_max_rgnsz(struct si_pub *sih, int osizew)
|
|
-{
|
|
- int ret = 0;
|
|
-
|
|
- switch (ai_get_chip_id(sih)) {
|
|
- case BCM43224_CHIP_ID:
|
|
- case BCM43225_CHIP_ID:
|
|
- ret = osizew * 2 - OTP_SZ_FU_72 - OTP_SZ_CHECKSUM;
|
|
- break;
|
|
- case BCM4313_CHIP_ID:
|
|
- ret = osizew * 2 - OTP_SZ_FU_72 - OTP_SZ_CHECKSUM;
|
|
- break;
|
|
- default:
|
|
- break; /* Don't know about this chip */
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static void _ipxotp_init(struct otpinfo *oi)
|
|
-{
|
|
- uint k;
|
|
- u32 otpp, st;
|
|
- int ccrev = ai_get_ccrev(oi->sih);
|
|
-
|
|
-
|
|
- /*
|
|
- * record word offset of General Use Region
|
|
- * for various chipcommon revs
|
|
- */
|
|
- if (ccrev == 21 || ccrev == 24
|
|
- || ccrev == 27) {
|
|
- oi->otpgu_base = REVA4_OTPGU_BASE;
|
|
- } else if (ccrev == 36) {
|
|
- /*
|
|
- * OTP size greater than equal to 2KB (128 words),
|
|
- * otpgu_base is similar to rev23
|
|
- */
|
|
- if (oi->wsize >= 128)
|
|
- oi->otpgu_base = REVB8_OTPGU_BASE;
|
|
- else
|
|
- oi->otpgu_base = REV36_OTPGU_BASE;
|
|
- } else if (ccrev == 23 || ccrev >= 25) {
|
|
- oi->otpgu_base = REVB8_OTPGU_BASE;
|
|
- }
|
|
-
|
|
- /* First issue an init command so the status is up to date */
|
|
- otpp =
|
|
- OTPP_START_BUSY | ((OTPPOC_INIT << OTPP_OC_SHIFT) & OTPP_OC_MASK);
|
|
-
|
|
- bcma_write32(oi->core, CHIPCREGOFFS(otpprog), otpp);
|
|
- st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
|
|
- for (k = 0; (st & OTPP_START_BUSY) && (k < OTPP_TRIES); k++)
|
|
- st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
|
|
- if (k >= OTPP_TRIES)
|
|
- return;
|
|
-
|
|
- /* Read OTP lock bits and subregion programmed indication bits */
|
|
- oi->status = bcma_read32(oi->core, CHIPCREGOFFS(otpstatus));
|
|
-
|
|
- if ((ai_get_chip_id(oi->sih) == BCM43224_CHIP_ID)
|
|
- || (ai_get_chip_id(oi->sih) == BCM43225_CHIP_ID)) {
|
|
- u32 p_bits;
|
|
- p_bits = (ipxotp_otpr(oi, oi->otpgu_base + OTPGU_P_OFF) &
|
|
- OTPGU_P_MSK) >> OTPGU_P_SHIFT;
|
|
- oi->status |= (p_bits << OTPS_GUP_SHIFT);
|
|
- }
|
|
-
|
|
- /*
|
|
- * h/w region base and fuse region limit are fixed to
|
|
- * the top and the bottom of the general use region.
|
|
- * Everything else can be flexible.
|
|
- */
|
|
- oi->hwbase = oi->otpgu_base + OTPGU_SROM_OFF;
|
|
- oi->hwlim = oi->wsize;
|
|
- if (oi->status & OTPS_GUP_HW) {
|
|
- oi->hwlim =
|
|
- ipxotp_otpr(oi, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
|
|
- oi->swbase = oi->hwlim;
|
|
- } else
|
|
- oi->swbase = oi->hwbase;
|
|
-
|
|
- /* subtract fuse and checksum from beginning */
|
|
- oi->swlim = ipxotp_max_rgnsz(oi->sih, oi->wsize) / 2;
|
|
-
|
|
- if (oi->status & OTPS_GUP_SW) {
|
|
- oi->swlim =
|
|
- ipxotp_otpr(oi, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
|
|
- oi->fbase = oi->swlim;
|
|
- } else
|
|
- oi->fbase = oi->swbase;
|
|
-
|
|
- oi->flim = oi->wsize;
|
|
-}
|
|
-
|
|
-static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
|
|
-{
|
|
- /* Make sure we're running IPX OTP */
|
|
- if (!OTPTYPE_IPX(ai_get_ccrev(sih)))
|
|
- return -EBADE;
|
|
-
|
|
- /* Make sure OTP is not disabled */
|
|
- if (ai_is_otp_disabled(sih))
|
|
- return -EBADE;
|
|
-
|
|
- /* Check for otp size */
|
|
- switch ((ai_get_cccaps(sih) & CC_CAP_OTPSIZE) >> CC_CAP_OTPSIZE_SHIFT) {
|
|
- case 0:
|
|
- /* Nothing there */
|
|
- return -EBADE;
|
|
- case 1: /* 32x64 */
|
|
- oi->rows = 32;
|
|
- oi->cols = 64;
|
|
- oi->wsize = 128;
|
|
- break;
|
|
- case 2: /* 64x64 */
|
|
- oi->rows = 64;
|
|
- oi->cols = 64;
|
|
- oi->wsize = 256;
|
|
- break;
|
|
- case 5: /* 96x64 */
|
|
- oi->rows = 96;
|
|
- oi->cols = 64;
|
|
- oi->wsize = 384;
|
|
- break;
|
|
- case 7: /* 16x64 *//* 1024 bits */
|
|
- oi->rows = 16;
|
|
- oi->cols = 64;
|
|
- oi->wsize = 64;
|
|
- break;
|
|
- default:
|
|
- /* Don't know the geometry */
|
|
- return -EBADE;
|
|
- }
|
|
-
|
|
- /* Retrieve OTP region info */
|
|
- _ipxotp_init(oi);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int
|
|
-ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
|
|
-{
|
|
- uint base, i, sz;
|
|
-
|
|
- /* Validate region selection */
|
|
- switch (region) {
|
|
- case OTP_HW_RGN:
|
|
- sz = (uint) oi->hwlim - oi->hwbase;
|
|
- if (!(oi->status & OTPS_GUP_HW)) {
|
|
- *wlen = sz;
|
|
- return -ENODATA;
|
|
- }
|
|
- if (*wlen < sz) {
|
|
- *wlen = sz;
|
|
- return -EOVERFLOW;
|
|
- }
|
|
- base = oi->hwbase;
|
|
- break;
|
|
- case OTP_SW_RGN:
|
|
- sz = ((uint) oi->swlim - oi->swbase);
|
|
- if (!(oi->status & OTPS_GUP_SW)) {
|
|
- *wlen = sz;
|
|
- return -ENODATA;
|
|
- }
|
|
- if (*wlen < sz) {
|
|
- *wlen = sz;
|
|
- return -EOVERFLOW;
|
|
- }
|
|
- base = oi->swbase;
|
|
- break;
|
|
- case OTP_CI_RGN:
|
|
- sz = OTPGU_CI_SZ;
|
|
- if (!(oi->status & OTPS_GUP_CI)) {
|
|
- *wlen = sz;
|
|
- return -ENODATA;
|
|
- }
|
|
- if (*wlen < sz) {
|
|
- *wlen = sz;
|
|
- return -EOVERFLOW;
|
|
- }
|
|
- base = oi->otpgu_base + OTPGU_CI_OFF;
|
|
- break;
|
|
- case OTP_FUSE_RGN:
|
|
- sz = (uint) oi->flim - oi->fbase;
|
|
- if (!(oi->status & OTPS_GUP_FUSE)) {
|
|
- *wlen = sz;
|
|
- return -ENODATA;
|
|
- }
|
|
- if (*wlen < sz) {
|
|
- *wlen = sz;
|
|
- return -EOVERFLOW;
|
|
- }
|
|
- base = oi->fbase;
|
|
- break;
|
|
- case OTP_ALL_RGN:
|
|
- sz = ((uint) oi->flim - oi->hwbase);
|
|
- if (!(oi->status & (OTPS_GUP_HW | OTPS_GUP_SW))) {
|
|
- *wlen = sz;
|
|
- return -ENODATA;
|
|
- }
|
|
- if (*wlen < sz) {
|
|
- *wlen = sz;
|
|
- return -EOVERFLOW;
|
|
- }
|
|
- base = oi->hwbase;
|
|
- break;
|
|
- default:
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- /* Read the data */
|
|
- for (i = 0; i < sz; i++)
|
|
- data[i] = ipxotp_otpr(oi, base + i);
|
|
-
|
|
- *wlen = sz;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static const struct otp_fn_s ipxotp_fn = {
|
|
- (int (*)(struct si_pub *, struct otpinfo *)) ipxotp_init,
|
|
- (int (*)(struct otpinfo *, int, u16 *, uint *)) ipxotp_read_region,
|
|
-};
|
|
-
|
|
-static int otp_init(struct si_pub *sih, struct otpinfo *oi)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- memset(oi, 0, sizeof(struct otpinfo));
|
|
-
|
|
- oi->core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
|
|
-
|
|
- if (OTPTYPE_IPX(ai_get_ccrev(sih)))
|
|
- oi->fn = &ipxotp_fn;
|
|
-
|
|
- if (oi->fn == NULL)
|
|
- return -EBADE;
|
|
-
|
|
- oi->sih = sih;
|
|
-
|
|
- ret = (oi->fn->init)(sih, oi);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-int
|
|
-otp_read_region(struct si_pub *sih, int region, u16 *data, uint *wlen) {
|
|
- struct otpinfo otpinfo;
|
|
- struct otpinfo *oi = &otpinfo;
|
|
- int err = 0;
|
|
-
|
|
- if (ai_is_otp_disabled(sih)) {
|
|
- err = -EPERM;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- err = otp_init(sih, oi);
|
|
- if (err)
|
|
- goto out;
|
|
-
|
|
- err = ((oi)->fn->read_region)(oi, region, data, wlen);
|
|
-
|
|
- out:
|
|
- return err;
|
|
-}
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/otp.h
|
|
+++ /dev/null
|
|
@@ -1,36 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#ifndef _BRCM_OTP_H_
|
|
-#define _BRCM_OTP_H_
|
|
-
|
|
-#include "types.h"
|
|
-
|
|
-/* OTP regions */
|
|
-#define OTP_HW_RGN 1
|
|
-#define OTP_SW_RGN 2
|
|
-#define OTP_CI_RGN 4
|
|
-#define OTP_FUSE_RGN 8
|
|
-/* From h/w region to end of OTP including checksum */
|
|
-#define OTP_ALL_RGN 0xf
|
|
-
|
|
-/* OTP Size */
|
|
-#define OTP_SZ_MAX (6144/8) /* maximum bytes in one CIS */
|
|
-
|
|
-extern int otp_read_region(struct si_pub *sih, int region, u16 *data,
|
|
- uint *wlen);
|
|
-
|
|
-#endif /* _BRCM_OTP_H_ */
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
|
|
@@ -4817,28 +4817,23 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
s8 txpwr = 0;
|
|
int i;
|
|
struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy;
|
|
- struct phy_shim_info *shim = pi->sh->physhim;
|
|
+ struct ssb_sprom *sprom = &pi->d11core->bus->sprom;
|
|
|
|
if (CHSPEC_IS2G(pi->radio_chanspec)) {
|
|
u16 cckpo = 0;
|
|
u32 offset_ofdm, offset_mcs;
|
|
|
|
- pi_lcn->lcnphy_tr_isolation_mid =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_TRISO2G);
|
|
+ pi_lcn->lcnphy_tr_isolation_mid = sprom->fem.ghz2.tr_iso;
|
|
|
|
- pi_lcn->lcnphy_rx_power_offset =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_RXPO2G);
|
|
+ pi_lcn->lcnphy_rx_power_offset = sprom->rxpo2g;
|
|
|
|
- pi->txpa_2g[0] = (s16)wlapi_getintvar(shim, BRCMS_SROM_PA0B0);
|
|
- pi->txpa_2g[1] = (s16)wlapi_getintvar(shim, BRCMS_SROM_PA0B1);
|
|
- pi->txpa_2g[2] = (s16)wlapi_getintvar(shim, BRCMS_SROM_PA0B2);
|
|
-
|
|
- pi_lcn->lcnphy_rssi_vf =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_RSSISMF2G);
|
|
- pi_lcn->lcnphy_rssi_vc =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_RSSISMC2G);
|
|
- pi_lcn->lcnphy_rssi_gs =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_RSSISAV2G);
|
|
+ pi->txpa_2g[0] = sprom->pa0b0;
|
|
+ pi->txpa_2g[1] = sprom->pa0b1;
|
|
+ pi->txpa_2g[2] = sprom->pa0b2;
|
|
+
|
|
+ pi_lcn->lcnphy_rssi_vf = sprom->rssismf2g;
|
|
+ pi_lcn->lcnphy_rssi_vc = sprom->rssismc2g;
|
|
+ pi_lcn->lcnphy_rssi_gs = sprom->rssisav2g;
|
|
|
|
pi_lcn->lcnphy_rssi_vf_lowtemp = pi_lcn->lcnphy_rssi_vf;
|
|
pi_lcn->lcnphy_rssi_vc_lowtemp = pi_lcn->lcnphy_rssi_vc;
|
|
@@ -4848,7 +4843,7 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
pi_lcn->lcnphy_rssi_vc_hightemp = pi_lcn->lcnphy_rssi_vc;
|
|
pi_lcn->lcnphy_rssi_gs_hightemp = pi_lcn->lcnphy_rssi_gs;
|
|
|
|
- txpwr = (s8)wlapi_getintvar(shim, BRCMS_SROM_MAXP2GA0);
|
|
+ txpwr = sprom->core_pwr_info[0].maxpwr_2g;
|
|
pi->tx_srom_max_2g = txpwr;
|
|
|
|
for (i = 0; i < PWRTBL_NUM_COEFF; i++) {
|
|
@@ -4856,8 +4851,8 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
pi->txpa_2g_high_temp[i] = pi->txpa_2g[i];
|
|
}
|
|
|
|
- cckpo = (u16)wlapi_getintvar(shim, BRCMS_SROM_CCK2GPO);
|
|
- offset_ofdm = (u32)wlapi_getintvar(shim, BRCMS_SROM_OFDM2GPO);
|
|
+ cckpo = sprom->cck2gpo;
|
|
+ offset_ofdm = sprom->ofdm2gpo;
|
|
if (cckpo) {
|
|
uint max_pwr_chan = txpwr;
|
|
|
|
@@ -4876,7 +4871,7 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
} else {
|
|
u8 opo = 0;
|
|
|
|
- opo = (u8)wlapi_getintvar(shim, BRCMS_SROM_OPO);
|
|
+ opo = sprom->opo;
|
|
|
|
for (i = TXP_FIRST_CCK; i <= TXP_LAST_CCK; i++)
|
|
pi->tx_srom_max_rate_2g[i] = txpwr;
|
|
@@ -4886,12 +4881,8 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
((offset_ofdm & 0xf) * 2);
|
|
offset_ofdm >>= 4;
|
|
}
|
|
- offset_mcs =
|
|
- wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO1) << 16;
|
|
- offset_mcs |=
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO0);
|
|
+ offset_mcs = sprom->mcs2gpo[1] << 16;
|
|
+ offset_mcs |= sprom->mcs2gpo[0];
|
|
pi_lcn->lcnphy_mcs20_po = offset_mcs;
|
|
for (i = TXP_FIRST_SISO_MCS_20;
|
|
i <= TXP_LAST_SISO_MCS_20; i++) {
|
|
@@ -4901,25 +4892,17 @@ static bool wlc_phy_txpwr_srom_read_lcnp
|
|
}
|
|
}
|
|
|
|
- pi_lcn->lcnphy_rawtempsense =
|
|
- (u16)wlapi_getintvar(shim, BRCMS_SROM_RAWTEMPSENSE);
|
|
- pi_lcn->lcnphy_measPower =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_MEASPOWER);
|
|
- pi_lcn->lcnphy_tempsense_slope =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_TEMPSENSE_SLOPE);
|
|
- pi_lcn->lcnphy_hw_iqcal_en =
|
|
- (bool)wlapi_getintvar(shim, BRCMS_SROM_HW_IQCAL_EN);
|
|
- pi_lcn->lcnphy_iqcal_swp_dis =
|
|
- (bool)wlapi_getintvar(shim, BRCMS_SROM_IQCAL_SWP_DIS);
|
|
- pi_lcn->lcnphy_tempcorrx =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_TEMPCORRX);
|
|
- pi_lcn->lcnphy_tempsense_option =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_TEMPSENSE_OPTION);
|
|
- pi_lcn->lcnphy_freqoffset_corr =
|
|
- (u8)wlapi_getintvar(shim, BRCMS_SROM_FREQOFFSET_CORR);
|
|
- if ((u8)wlapi_getintvar(shim, BRCMS_SROM_AA2G) > 1)
|
|
+ pi_lcn->lcnphy_rawtempsense = sprom->rawtempsense;
|
|
+ pi_lcn->lcnphy_measPower = sprom->measpower;
|
|
+ pi_lcn->lcnphy_tempsense_slope = sprom->tempsense_slope;
|
|
+ pi_lcn->lcnphy_hw_iqcal_en = sprom->hw_iqcal_en;
|
|
+ pi_lcn->lcnphy_iqcal_swp_dis = sprom->iqcal_swp_dis;
|
|
+ pi_lcn->lcnphy_tempcorrx = sprom->tempcorrx;
|
|
+ pi_lcn->lcnphy_tempsense_option = sprom->tempsense_option;
|
|
+ pi_lcn->lcnphy_freqoffset_corr = sprom->freqoffset_corr;
|
|
+ if (sprom->ant_available_bg > 1)
|
|
wlc_phy_ant_rxdiv_set((struct brcms_phy_pub *) pi,
|
|
- (u8) wlapi_getintvar(shim, BRCMS_SROM_AA2G));
|
|
+ sprom->ant_available_bg);
|
|
}
|
|
pi_lcn->lcnphy_cck_dig_filt_type = -1;
|
|
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
|
|
@@ -14388,30 +14388,30 @@ static void wlc_phy_txpwr_srom_read_ppr_
|
|
{
|
|
u16 bw40po, cddpo, stbcpo, bwduppo;
|
|
uint band_num;
|
|
- struct phy_shim_info *shim = pi->sh->physhim;
|
|
+ struct ssb_sprom *sprom = &pi->d11core->bus->sprom;
|
|
|
|
if (pi->sh->sromrev >= 9)
|
|
return;
|
|
|
|
- bw40po = (u16) wlapi_getintvar(shim, BRCMS_SROM_BW40PO);
|
|
+ bw40po = sprom->bw40po;
|
|
pi->bw402gpo = bw40po & 0xf;
|
|
pi->bw405gpo = (bw40po & 0xf0) >> 4;
|
|
pi->bw405glpo = (bw40po & 0xf00) >> 8;
|
|
pi->bw405ghpo = (bw40po & 0xf000) >> 12;
|
|
|
|
- cddpo = (u16) wlapi_getintvar(shim, BRCMS_SROM_CDDPO);
|
|
+ cddpo = sprom->cddpo;
|
|
pi->cdd2gpo = cddpo & 0xf;
|
|
pi->cdd5gpo = (cddpo & 0xf0) >> 4;
|
|
pi->cdd5glpo = (cddpo & 0xf00) >> 8;
|
|
pi->cdd5ghpo = (cddpo & 0xf000) >> 12;
|
|
|
|
- stbcpo = (u16) wlapi_getintvar(shim, BRCMS_SROM_STBCPO);
|
|
+ stbcpo = sprom->stbcpo;
|
|
pi->stbc2gpo = stbcpo & 0xf;
|
|
pi->stbc5gpo = (stbcpo & 0xf0) >> 4;
|
|
pi->stbc5glpo = (stbcpo & 0xf00) >> 8;
|
|
pi->stbc5ghpo = (stbcpo & 0xf000) >> 12;
|
|
|
|
- bwduppo = (u16) wlapi_getintvar(shim, BRCMS_SROM_BWDUPPO);
|
|
+ bwduppo = sprom->bwduppo;
|
|
pi->bwdup2gpo = bwduppo & 0xf;
|
|
pi->bwdup5gpo = (bwduppo & 0xf0) >> 4;
|
|
pi->bwdup5glpo = (bwduppo & 0xf00) >> 8;
|
|
@@ -14421,242 +14421,137 @@ static void wlc_phy_txpwr_srom_read_ppr_
|
|
band_num++) {
|
|
switch (band_num) {
|
|
case 0:
|
|
-
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].max_pwr_2g =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP2GA0);
|
|
+ sprom->core_pwr_info[0].maxpwr_2g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].max_pwr_2g =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP2GA1);
|
|
+ sprom->core_pwr_info[1].maxpwr_2g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_2g_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW0A0);
|
|
+ sprom->core_pwr_info[0].pa_2g[0];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_2g_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW0A1);
|
|
+ sprom->core_pwr_info[1].pa_2g[0];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_2g_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW1A0);
|
|
+ sprom->core_pwr_info[0].pa_2g[1];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_2g_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW1A1);
|
|
+ sprom->core_pwr_info[1].pa_2g[1];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_2g_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW2A0);
|
|
+ sprom->core_pwr_info[0].pa_2g[2];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_2g_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA2GW2A1);
|
|
+ sprom->core_pwr_info[1].pa_2g[2];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].idle_targ_2g =
|
|
- (s8) wlapi_getintvar(shim, BRCMS_SROM_ITT2GA0);
|
|
+ sprom->core_pwr_info[0].itssi_2g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].idle_targ_2g =
|
|
- (s8) wlapi_getintvar(shim, BRCMS_SROM_ITT2GA1);
|
|
+ sprom->core_pwr_info[1].itssi_2g;
|
|
+
|
|
+ pi->cck2gpo = sprom->cck2gpo;
|
|
|
|
- pi->cck2gpo = (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_CCK2GPO);
|
|
+ pi->ofdm2gpo = sprom->ofdm2gpo;
|
|
|
|
- pi->ofdm2gpo =
|
|
- (u32) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_OFDM2GPO);
|
|
-
|
|
- pi->mcs2gpo[0] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO0);
|
|
- pi->mcs2gpo[1] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO1);
|
|
- pi->mcs2gpo[2] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO2);
|
|
- pi->mcs2gpo[3] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO3);
|
|
- pi->mcs2gpo[4] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO4);
|
|
- pi->mcs2gpo[5] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO5);
|
|
- pi->mcs2gpo[6] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO6);
|
|
- pi->mcs2gpo[7] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS2GPO7);
|
|
+ pi->mcs2gpo[0] = sprom->mcs2gpo[0];
|
|
+ pi->mcs2gpo[1] = sprom->mcs2gpo[1];
|
|
+ pi->mcs2gpo[2] = sprom->mcs2gpo[2];
|
|
+ pi->mcs2gpo[3] = sprom->mcs2gpo[3];
|
|
+ pi->mcs2gpo[4] = sprom->mcs2gpo[4];
|
|
+ pi->mcs2gpo[5] = sprom->mcs2gpo[5];
|
|
+ pi->mcs2gpo[6] = sprom->mcs2gpo[6];
|
|
+ pi->mcs2gpo[7] = sprom->mcs2gpo[7];
|
|
break;
|
|
case 1:
|
|
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].max_pwr_5gm =
|
|
- (s8) wlapi_getintvar(shim, BRCMS_SROM_MAXP5GA0);
|
|
+ sprom->core_pwr_info[0].maxpwr_5g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].max_pwr_5gm =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP5GA1);
|
|
+ sprom->core_pwr_info[1].maxpwr_5g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_5gm_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW0A0);
|
|
+ sprom->core_pwr_info[0].pa_5g[0];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_5gm_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW0A1);
|
|
+ sprom->core_pwr_info[1].pa_5g[0];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_5gm_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW1A0);
|
|
+ sprom->core_pwr_info[0].pa_5g[1];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_5gm_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW1A1);
|
|
+ sprom->core_pwr_info[1].pa_5g[1];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].pwrdet_5gm_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW2A0);
|
|
+ sprom->core_pwr_info[0].pa_5g[2];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].pwrdet_5gm_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GW2A1);
|
|
+ sprom->core_pwr_info[1].pa_5g[2];
|
|
pi->nphy_pwrctrl_info[PHY_CORE_0].idle_targ_5gm =
|
|
- (s8) wlapi_getintvar(shim, BRCMS_SROM_ITT5GA0);
|
|
+ sprom->core_pwr_info[0].itssi_5g;
|
|
pi->nphy_pwrctrl_info[PHY_CORE_1].idle_targ_5gm =
|
|
- (s8) wlapi_getintvar(shim, BRCMS_SROM_ITT5GA1);
|
|
+ sprom->core_pwr_info[1].itssi_5g;
|
|
+
|
|
+ pi->ofdm5gpo = sprom->ofdm5gpo;
|
|
|
|
- pi->ofdm5gpo =
|
|
- (u32) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_OFDM5GPO);
|
|
-
|
|
- pi->mcs5gpo[0] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO0);
|
|
- pi->mcs5gpo[1] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO1);
|
|
- pi->mcs5gpo[2] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO2);
|
|
- pi->mcs5gpo[3] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO3);
|
|
- pi->mcs5gpo[4] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO4);
|
|
- pi->mcs5gpo[5] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO5);
|
|
- pi->mcs5gpo[6] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO6);
|
|
- pi->mcs5gpo[7] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GPO7);
|
|
+ pi->mcs5gpo[0] = sprom->mcs5gpo[0];
|
|
+ pi->mcs5gpo[1] = sprom->mcs5gpo[1];
|
|
+ pi->mcs5gpo[2] = sprom->mcs5gpo[2];
|
|
+ pi->mcs5gpo[3] = sprom->mcs5gpo[3];
|
|
+ pi->mcs5gpo[4] = sprom->mcs5gpo[4];
|
|
+ pi->mcs5gpo[5] = sprom->mcs5gpo[5];
|
|
+ pi->mcs5gpo[6] = sprom->mcs5gpo[6];
|
|
+ pi->mcs5gpo[7] = sprom->mcs5gpo[7];
|
|
break;
|
|
case 2:
|
|
|
|
pi->nphy_pwrctrl_info[0].max_pwr_5gl =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP5GLA0);
|
|
+ sprom->core_pwr_info[0].maxpwr_5gl;
|
|
pi->nphy_pwrctrl_info[1].max_pwr_5gl =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP5GLA1);
|
|
+ sprom->core_pwr_info[1].maxpwr_5gl;
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gl_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW0A0);
|
|
+ sprom->core_pwr_info[0].pa_5gl[0];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gl_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW0A1);
|
|
+ sprom->core_pwr_info[1].pa_5gl[0];
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gl_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW1A0);
|
|
+ sprom->core_pwr_info[0].pa_5gl[1];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gl_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW1A1);
|
|
+ sprom->core_pwr_info[1].pa_5gl[1];
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gl_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW2A0);
|
|
+ sprom->core_pwr_info[0].pa_5gl[2];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gl_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GLW2A1);
|
|
+ sprom->core_pwr_info[1].pa_5gl[2];
|
|
pi->nphy_pwrctrl_info[0].idle_targ_5gl = 0;
|
|
pi->nphy_pwrctrl_info[1].idle_targ_5gl = 0;
|
|
|
|
- pi->ofdm5glpo =
|
|
- (u32) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_OFDM5GLPO);
|
|
-
|
|
- pi->mcs5glpo[0] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO0);
|
|
- pi->mcs5glpo[1] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO1);
|
|
- pi->mcs5glpo[2] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO2);
|
|
- pi->mcs5glpo[3] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO3);
|
|
- pi->mcs5glpo[4] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO4);
|
|
- pi->mcs5glpo[5] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO5);
|
|
- pi->mcs5glpo[6] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO6);
|
|
- pi->mcs5glpo[7] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GLPO7);
|
|
+ pi->ofdm5glpo = sprom->ofdm5glpo;
|
|
+
|
|
+ pi->mcs5glpo[0] = sprom->mcs5glpo[0];
|
|
+ pi->mcs5glpo[1] = sprom->mcs5glpo[1];
|
|
+ pi->mcs5glpo[2] = sprom->mcs5glpo[2];
|
|
+ pi->mcs5glpo[3] = sprom->mcs5glpo[3];
|
|
+ pi->mcs5glpo[4] = sprom->mcs5glpo[4];
|
|
+ pi->mcs5glpo[5] = sprom->mcs5glpo[5];
|
|
+ pi->mcs5glpo[6] = sprom->mcs5glpo[6];
|
|
+ pi->mcs5glpo[7] = sprom->mcs5glpo[7];
|
|
break;
|
|
case 3:
|
|
|
|
pi->nphy_pwrctrl_info[0].max_pwr_5gh =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP5GHA0);
|
|
+ sprom->core_pwr_info[0].maxpwr_5gh;
|
|
pi->nphy_pwrctrl_info[1].max_pwr_5gh =
|
|
- (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MAXP5GHA1);
|
|
+ sprom->core_pwr_info[1].maxpwr_5gh;
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gh_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW0A0);
|
|
+ sprom->core_pwr_info[0].pa_5gh[0];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gh_a1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW0A1);
|
|
+ sprom->core_pwr_info[1].pa_5gh[0];
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gh_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW1A0);
|
|
+ sprom->core_pwr_info[0].pa_5gh[1];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gh_b0 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW1A1);
|
|
+ sprom->core_pwr_info[1].pa_5gh[1];
|
|
pi->nphy_pwrctrl_info[0].pwrdet_5gh_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW2A0);
|
|
+ sprom->core_pwr_info[0].pa_5gh[2];
|
|
pi->nphy_pwrctrl_info[1].pwrdet_5gh_b1 =
|
|
- (s16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PA5GHW2A1);
|
|
+ sprom->core_pwr_info[1].pa_5gh[2];
|
|
pi->nphy_pwrctrl_info[0].idle_targ_5gh = 0;
|
|
pi->nphy_pwrctrl_info[1].idle_targ_5gh = 0;
|
|
|
|
- pi->ofdm5ghpo =
|
|
- (u32) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_OFDM5GHPO);
|
|
-
|
|
- pi->mcs5ghpo[0] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO0);
|
|
- pi->mcs5ghpo[1] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO1);
|
|
- pi->mcs5ghpo[2] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO2);
|
|
- pi->mcs5ghpo[3] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO3);
|
|
- pi->mcs5ghpo[4] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO4);
|
|
- pi->mcs5ghpo[5] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO5);
|
|
- pi->mcs5ghpo[6] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO6);
|
|
- pi->mcs5ghpo[7] =
|
|
- (u16) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_MCS5GHPO7);
|
|
+ pi->ofdm5ghpo = sprom->ofdm5ghpo;
|
|
+
|
|
+ pi->mcs5ghpo[0] = sprom->mcs5ghpo[0];
|
|
+ pi->mcs5ghpo[1] = sprom->mcs5ghpo[1];
|
|
+ pi->mcs5ghpo[2] = sprom->mcs5ghpo[2];
|
|
+ pi->mcs5ghpo[3] = sprom->mcs5ghpo[3];
|
|
+ pi->mcs5ghpo[4] = sprom->mcs5ghpo[4];
|
|
+ pi->mcs5ghpo[5] = sprom->mcs5ghpo[5];
|
|
+ pi->mcs5ghpo[6] = sprom->mcs5ghpo[6];
|
|
+ pi->mcs5ghpo[7] = sprom->mcs5ghpo[7];
|
|
break;
|
|
}
|
|
}
|
|
@@ -14666,45 +14561,34 @@ static void wlc_phy_txpwr_srom_read_ppr_
|
|
|
|
static bool wlc_phy_txpwr_srom_read_nphy(struct brcms_phy *pi)
|
|
{
|
|
- struct phy_shim_info *shim = pi->sh->physhim;
|
|
+ struct ssb_sprom *sprom = &pi->d11core->bus->sprom;
|
|
|
|
- pi->antswitch = (u8) wlapi_getintvar(shim, BRCMS_SROM_ANTSWITCH);
|
|
- pi->aa2g = (u8) wlapi_getintvar(shim, BRCMS_SROM_AA2G);
|
|
- pi->aa5g = (u8) wlapi_getintvar(shim, BRCMS_SROM_AA5G);
|
|
-
|
|
- pi->srom_fem2g.tssipos = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_TSSIPOS2G);
|
|
- pi->srom_fem2g.extpagain = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_EXTPAGAIN2G);
|
|
- pi->srom_fem2g.pdetrange = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PDETRANGE2G);
|
|
- pi->srom_fem2g.triso = (u8) wlapi_getintvar(shim, BRCMS_SROM_TRISO2G);
|
|
- pi->srom_fem2g.antswctrllut =
|
|
- (u8) wlapi_getintvar(shim, BRCMS_SROM_ANTSWCTL2G);
|
|
-
|
|
- pi->srom_fem5g.tssipos = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_TSSIPOS5G);
|
|
- pi->srom_fem5g.extpagain = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_EXTPAGAIN5G);
|
|
- pi->srom_fem5g.pdetrange = (u8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_PDETRANGE5G);
|
|
- pi->srom_fem5g.triso = (u8) wlapi_getintvar(shim, BRCMS_SROM_TRISO5G);
|
|
- if (wlapi_getvar(shim, BRCMS_SROM_ANTSWCTL5G))
|
|
- pi->srom_fem5g.antswctrllut =
|
|
- (u8) wlapi_getintvar(shim, BRCMS_SROM_ANTSWCTL5G);
|
|
+ pi->antswitch = sprom->antswitch;
|
|
+ pi->aa2g = sprom->ant_available_bg;
|
|
+ pi->aa5g = sprom->ant_available_a;
|
|
+
|
|
+ pi->srom_fem2g.tssipos = sprom->fem.ghz2.tssipos;
|
|
+ pi->srom_fem2g.extpagain = sprom->fem.ghz2.extpa_gain;
|
|
+ pi->srom_fem2g.pdetrange = sprom->fem.ghz2.pdet_range;
|
|
+ pi->srom_fem2g.triso = sprom->fem.ghz2.tr_iso;
|
|
+ pi->srom_fem2g.antswctrllut = sprom->fem.ghz2.antswlut;
|
|
+
|
|
+ pi->srom_fem5g.tssipos = sprom->fem.ghz5.tssipos;
|
|
+ pi->srom_fem5g.extpagain = sprom->fem.ghz5.extpa_gain;
|
|
+ pi->srom_fem5g.pdetrange = sprom->fem.ghz5.pdet_range;
|
|
+ pi->srom_fem5g.triso = sprom->fem.ghz5.tr_iso;
|
|
+ if (sprom->fem.ghz5.antswlut)
|
|
+ pi->srom_fem5g.antswctrllut = sprom->fem.ghz5.antswlut;
|
|
else
|
|
- pi->srom_fem5g.antswctrllut =
|
|
- (u8) wlapi_getintvar(shim, BRCMS_SROM_ANTSWCTL2G);
|
|
+ pi->srom_fem5g.antswctrllut = sprom->fem.ghz2.antswlut;
|
|
|
|
wlc_phy_txpower_ipa_upd(pi);
|
|
|
|
- pi->phy_txcore_disable_temp =
|
|
- (s16) wlapi_getintvar(shim, BRCMS_SROM_TEMPTHRESH);
|
|
+ pi->phy_txcore_disable_temp = sprom->tempthresh;
|
|
if (pi->phy_txcore_disable_temp == 0)
|
|
pi->phy_txcore_disable_temp = PHY_CHAIN_TX_DISABLE_TEMP;
|
|
|
|
- pi->phy_tempsense_offset = (s8) wlapi_getintvar(shim,
|
|
- BRCMS_SROM_TEMPOFFSET);
|
|
+ pi->phy_tempsense_offset = sprom->tempoffset;
|
|
if (pi->phy_tempsense_offset != 0) {
|
|
if (pi->phy_tempsense_offset >
|
|
(NPHY_SROM_TEMPSHIFT + NPHY_SROM_MAXTEMPOFFSET))
|
|
@@ -14719,8 +14603,7 @@ static bool wlc_phy_txpwr_srom_read_nphy
|
|
pi->phy_txcore_enable_temp =
|
|
pi->phy_txcore_disable_temp - PHY_HYSTERESIS_DELTATEMP;
|
|
|
|
- pi->phycal_tempdelta =
|
|
- (u8) wlapi_getintvar(shim, BRCMS_SROM_PHYCAL_TEMPDELTA);
|
|
+ pi->phycal_tempdelta = sprom->phycal_tempdelta;
|
|
if (pi->phycal_tempdelta > NPHY_CAL_MAXTEMPDELTA)
|
|
pi->phycal_tempdelta = 0;
|
|
|
|
@@ -21462,7 +21345,7 @@ void wlc_phy_antsel_init(struct brcms_ph
|
|
write_phy_reg(pi, 0xc8, 0x0);
|
|
write_phy_reg(pi, 0xc9, 0x0);
|
|
|
|
- ai_gpiocontrol(pi->sh->sih, mask, mask, GPIO_DRV_PRIORITY);
|
|
+ bcma_chipco_gpio_control(&pi->d11core->bus->drv_cc, mask, mask);
|
|
|
|
mc = bcma_read32(pi->d11core, D11REGOFFS(maccontrol));
|
|
mc &= ~MCTL_GPOUT_SEL_MASK;
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy_shim.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy_shim.c
|
|
@@ -214,12 +214,3 @@ wlapi_copyto_objmem(struct phy_shim_info
|
|
{
|
|
brcms_b_copyto_objmem(physhim->wlc_hw, offset, buf, l, sel);
|
|
}
|
|
-
|
|
-char *wlapi_getvar(struct phy_shim_info *physhim, enum brcms_srom_id id)
|
|
-{
|
|
- return getvar(physhim->wlc_hw->sih, id);
|
|
-}
|
|
-int wlapi_getintvar(struct phy_shim_info *physhim, enum brcms_srom_id id)
|
|
-{
|
|
- return getintvar(physhim->wlc_hw->sih, id);
|
|
-}
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy_shim.h
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy_shim.h
|
|
@@ -175,8 +175,5 @@ extern void wlapi_copyto_objmem(struct p
|
|
extern void wlapi_high_update_phy_mode(struct phy_shim_info *physhim,
|
|
u32 phy_mode);
|
|
extern u16 wlapi_bmac_get_txant(struct phy_shim_info *physhim);
|
|
-extern char *wlapi_getvar(struct phy_shim_info *physhim, enum brcms_srom_id id);
|
|
-extern int wlapi_getintvar(struct phy_shim_info *physhim,
|
|
- enum brcms_srom_id id);
|
|
|
|
#endif /* _BRCM_PHY_SHIM_H_ */
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
|
|
@@ -22,232 +22,6 @@
|
|
#include "types.h"
|
|
#include "defs.h"
|
|
|
|
-enum brcms_srom_id {
|
|
- BRCMS_SROM_NULL,
|
|
- BRCMS_SROM_CONT,
|
|
- BRCMS_SROM_AA2G,
|
|
- BRCMS_SROM_AA5G,
|
|
- BRCMS_SROM_AG0,
|
|
- BRCMS_SROM_AG1,
|
|
- BRCMS_SROM_AG2,
|
|
- BRCMS_SROM_AG3,
|
|
- BRCMS_SROM_ANTSWCTL2G,
|
|
- BRCMS_SROM_ANTSWCTL5G,
|
|
- BRCMS_SROM_ANTSWITCH,
|
|
- BRCMS_SROM_BOARDFLAGS2,
|
|
- BRCMS_SROM_BOARDFLAGS,
|
|
- BRCMS_SROM_BOARDNUM,
|
|
- BRCMS_SROM_BOARDREV,
|
|
- BRCMS_SROM_BOARDTYPE,
|
|
- BRCMS_SROM_BW40PO,
|
|
- BRCMS_SROM_BWDUPPO,
|
|
- BRCMS_SROM_BXA2G,
|
|
- BRCMS_SROM_BXA5G,
|
|
- BRCMS_SROM_CC,
|
|
- BRCMS_SROM_CCK2GPO,
|
|
- BRCMS_SROM_CCKBW202GPO,
|
|
- BRCMS_SROM_CCKBW20UL2GPO,
|
|
- BRCMS_SROM_CCODE,
|
|
- BRCMS_SROM_CDDPO,
|
|
- BRCMS_SROM_DEVID,
|
|
- BRCMS_SROM_ET1MACADDR,
|
|
- BRCMS_SROM_EXTPAGAIN2G,
|
|
- BRCMS_SROM_EXTPAGAIN5G,
|
|
- BRCMS_SROM_FREQOFFSET_CORR,
|
|
- BRCMS_SROM_HW_IQCAL_EN,
|
|
- BRCMS_SROM_IL0MACADDR,
|
|
- BRCMS_SROM_IQCAL_SWP_DIS,
|
|
- BRCMS_SROM_LEDBH0,
|
|
- BRCMS_SROM_LEDBH1,
|
|
- BRCMS_SROM_LEDBH2,
|
|
- BRCMS_SROM_LEDBH3,
|
|
- BRCMS_SROM_LEDDC,
|
|
- BRCMS_SROM_LEGOFDM40DUPPO,
|
|
- BRCMS_SROM_LEGOFDMBW202GPO,
|
|
- BRCMS_SROM_LEGOFDMBW205GHPO,
|
|
- BRCMS_SROM_LEGOFDMBW205GLPO,
|
|
- BRCMS_SROM_LEGOFDMBW205GMPO,
|
|
- BRCMS_SROM_LEGOFDMBW20UL2GPO,
|
|
- BRCMS_SROM_LEGOFDMBW20UL5GHPO,
|
|
- BRCMS_SROM_LEGOFDMBW20UL5GLPO,
|
|
- BRCMS_SROM_LEGOFDMBW20UL5GMPO,
|
|
- BRCMS_SROM_MACADDR,
|
|
- BRCMS_SROM_MCS2GPO0,
|
|
- BRCMS_SROM_MCS2GPO1,
|
|
- BRCMS_SROM_MCS2GPO2,
|
|
- BRCMS_SROM_MCS2GPO3,
|
|
- BRCMS_SROM_MCS2GPO4,
|
|
- BRCMS_SROM_MCS2GPO5,
|
|
- BRCMS_SROM_MCS2GPO6,
|
|
- BRCMS_SROM_MCS2GPO7,
|
|
- BRCMS_SROM_MCS32PO,
|
|
- BRCMS_SROM_MCS5GHPO0,
|
|
- BRCMS_SROM_MCS5GHPO1,
|
|
- BRCMS_SROM_MCS5GHPO2,
|
|
- BRCMS_SROM_MCS5GHPO3,
|
|
- BRCMS_SROM_MCS5GHPO4,
|
|
- BRCMS_SROM_MCS5GHPO5,
|
|
- BRCMS_SROM_MCS5GHPO6,
|
|
- BRCMS_SROM_MCS5GHPO7,
|
|
- BRCMS_SROM_MCS5GLPO0,
|
|
- BRCMS_SROM_MCS5GLPO1,
|
|
- BRCMS_SROM_MCS5GLPO2,
|
|
- BRCMS_SROM_MCS5GLPO3,
|
|
- BRCMS_SROM_MCS5GLPO4,
|
|
- BRCMS_SROM_MCS5GLPO5,
|
|
- BRCMS_SROM_MCS5GLPO6,
|
|
- BRCMS_SROM_MCS5GLPO7,
|
|
- BRCMS_SROM_MCS5GPO0,
|
|
- BRCMS_SROM_MCS5GPO1,
|
|
- BRCMS_SROM_MCS5GPO2,
|
|
- BRCMS_SROM_MCS5GPO3,
|
|
- BRCMS_SROM_MCS5GPO4,
|
|
- BRCMS_SROM_MCS5GPO5,
|
|
- BRCMS_SROM_MCS5GPO6,
|
|
- BRCMS_SROM_MCS5GPO7,
|
|
- BRCMS_SROM_MCSBW202GPO,
|
|
- BRCMS_SROM_MCSBW205GHPO,
|
|
- BRCMS_SROM_MCSBW205GLPO,
|
|
- BRCMS_SROM_MCSBW205GMPO,
|
|
- BRCMS_SROM_MCSBW20UL2GPO,
|
|
- BRCMS_SROM_MCSBW20UL5GHPO,
|
|
- BRCMS_SROM_MCSBW20UL5GLPO,
|
|
- BRCMS_SROM_MCSBW20UL5GMPO,
|
|
- BRCMS_SROM_MCSBW402GPO,
|
|
- BRCMS_SROM_MCSBW405GHPO,
|
|
- BRCMS_SROM_MCSBW405GLPO,
|
|
- BRCMS_SROM_MCSBW405GMPO,
|
|
- BRCMS_SROM_MEASPOWER,
|
|
- BRCMS_SROM_OFDM2GPO,
|
|
- BRCMS_SROM_OFDM5GHPO,
|
|
- BRCMS_SROM_OFDM5GLPO,
|
|
- BRCMS_SROM_OFDM5GPO,
|
|
- BRCMS_SROM_OPO,
|
|
- BRCMS_SROM_PA0B0,
|
|
- BRCMS_SROM_PA0B1,
|
|
- BRCMS_SROM_PA0B2,
|
|
- BRCMS_SROM_PA0ITSSIT,
|
|
- BRCMS_SROM_PA0MAXPWR,
|
|
- BRCMS_SROM_PA1B0,
|
|
- BRCMS_SROM_PA1B1,
|
|
- BRCMS_SROM_PA1B2,
|
|
- BRCMS_SROM_PA1HIB0,
|
|
- BRCMS_SROM_PA1HIB1,
|
|
- BRCMS_SROM_PA1HIB2,
|
|
- BRCMS_SROM_PA1HIMAXPWR,
|
|
- BRCMS_SROM_PA1ITSSIT,
|
|
- BRCMS_SROM_PA1LOB0,
|
|
- BRCMS_SROM_PA1LOB1,
|
|
- BRCMS_SROM_PA1LOB2,
|
|
- BRCMS_SROM_PA1LOMAXPWR,
|
|
- BRCMS_SROM_PA1MAXPWR,
|
|
- BRCMS_SROM_PDETRANGE2G,
|
|
- BRCMS_SROM_PDETRANGE5G,
|
|
- BRCMS_SROM_PHYCAL_TEMPDELTA,
|
|
- BRCMS_SROM_RAWTEMPSENSE,
|
|
- BRCMS_SROM_REGREV,
|
|
- BRCMS_SROM_REV,
|
|
- BRCMS_SROM_RSSISAV2G,
|
|
- BRCMS_SROM_RSSISAV5G,
|
|
- BRCMS_SROM_RSSISMC2G,
|
|
- BRCMS_SROM_RSSISMC5G,
|
|
- BRCMS_SROM_RSSISMF2G,
|
|
- BRCMS_SROM_RSSISMF5G,
|
|
- BRCMS_SROM_RXCHAIN,
|
|
- BRCMS_SROM_RXPO2G,
|
|
- BRCMS_SROM_RXPO5G,
|
|
- BRCMS_SROM_STBCPO,
|
|
- BRCMS_SROM_TEMPCORRX,
|
|
- BRCMS_SROM_TEMPOFFSET,
|
|
- BRCMS_SROM_TEMPSENSE_OPTION,
|
|
- BRCMS_SROM_TEMPSENSE_SLOPE,
|
|
- BRCMS_SROM_TEMPTHRESH,
|
|
- BRCMS_SROM_TRI2G,
|
|
- BRCMS_SROM_TRI5GH,
|
|
- BRCMS_SROM_TRI5GL,
|
|
- BRCMS_SROM_TRI5G,
|
|
- BRCMS_SROM_TRISO2G,
|
|
- BRCMS_SROM_TRISO5G,
|
|
- BRCMS_SROM_TSSIPOS2G,
|
|
- BRCMS_SROM_TSSIPOS5G,
|
|
- BRCMS_SROM_TXCHAIN,
|
|
- /*
|
|
- * per-path identifiers (see srom.c)
|
|
- */
|
|
- BRCMS_SROM_ITT2GA0,
|
|
- BRCMS_SROM_ITT2GA1,
|
|
- BRCMS_SROM_ITT2GA2,
|
|
- BRCMS_SROM_ITT2GA3,
|
|
- BRCMS_SROM_ITT5GA0,
|
|
- BRCMS_SROM_ITT5GA1,
|
|
- BRCMS_SROM_ITT5GA2,
|
|
- BRCMS_SROM_ITT5GA3,
|
|
- BRCMS_SROM_MAXP2GA0,
|
|
- BRCMS_SROM_MAXP2GA1,
|
|
- BRCMS_SROM_MAXP2GA2,
|
|
- BRCMS_SROM_MAXP2GA3,
|
|
- BRCMS_SROM_MAXP5GA0,
|
|
- BRCMS_SROM_MAXP5GA1,
|
|
- BRCMS_SROM_MAXP5GA2,
|
|
- BRCMS_SROM_MAXP5GA3,
|
|
- BRCMS_SROM_MAXP5GHA0,
|
|
- BRCMS_SROM_MAXP5GHA1,
|
|
- BRCMS_SROM_MAXP5GHA2,
|
|
- BRCMS_SROM_MAXP5GHA3,
|
|
- BRCMS_SROM_MAXP5GLA0,
|
|
- BRCMS_SROM_MAXP5GLA1,
|
|
- BRCMS_SROM_MAXP5GLA2,
|
|
- BRCMS_SROM_MAXP5GLA3,
|
|
- BRCMS_SROM_PA2GW0A0,
|
|
- BRCMS_SROM_PA2GW0A1,
|
|
- BRCMS_SROM_PA2GW0A2,
|
|
- BRCMS_SROM_PA2GW0A3,
|
|
- BRCMS_SROM_PA2GW1A0,
|
|
- BRCMS_SROM_PA2GW1A1,
|
|
- BRCMS_SROM_PA2GW1A2,
|
|
- BRCMS_SROM_PA2GW1A3,
|
|
- BRCMS_SROM_PA2GW2A0,
|
|
- BRCMS_SROM_PA2GW2A1,
|
|
- BRCMS_SROM_PA2GW2A2,
|
|
- BRCMS_SROM_PA2GW2A3,
|
|
- BRCMS_SROM_PA5GHW0A0,
|
|
- BRCMS_SROM_PA5GHW0A1,
|
|
- BRCMS_SROM_PA5GHW0A2,
|
|
- BRCMS_SROM_PA5GHW0A3,
|
|
- BRCMS_SROM_PA5GHW1A0,
|
|
- BRCMS_SROM_PA5GHW1A1,
|
|
- BRCMS_SROM_PA5GHW1A2,
|
|
- BRCMS_SROM_PA5GHW1A3,
|
|
- BRCMS_SROM_PA5GHW2A0,
|
|
- BRCMS_SROM_PA5GHW2A1,
|
|
- BRCMS_SROM_PA5GHW2A2,
|
|
- BRCMS_SROM_PA5GHW2A3,
|
|
- BRCMS_SROM_PA5GLW0A0,
|
|
- BRCMS_SROM_PA5GLW0A1,
|
|
- BRCMS_SROM_PA5GLW0A2,
|
|
- BRCMS_SROM_PA5GLW0A3,
|
|
- BRCMS_SROM_PA5GLW1A0,
|
|
- BRCMS_SROM_PA5GLW1A1,
|
|
- BRCMS_SROM_PA5GLW1A2,
|
|
- BRCMS_SROM_PA5GLW1A3,
|
|
- BRCMS_SROM_PA5GLW2A0,
|
|
- BRCMS_SROM_PA5GLW2A1,
|
|
- BRCMS_SROM_PA5GLW2A2,
|
|
- BRCMS_SROM_PA5GLW2A3,
|
|
- BRCMS_SROM_PA5GW0A0,
|
|
- BRCMS_SROM_PA5GW0A1,
|
|
- BRCMS_SROM_PA5GW0A2,
|
|
- BRCMS_SROM_PA5GW0A3,
|
|
- BRCMS_SROM_PA5GW1A0,
|
|
- BRCMS_SROM_PA5GW1A1,
|
|
- BRCMS_SROM_PA5GW1A2,
|
|
- BRCMS_SROM_PA5GW1A3,
|
|
- BRCMS_SROM_PA5GW2A0,
|
|
- BRCMS_SROM_PA5GW2A1,
|
|
- BRCMS_SROM_PA5GW2A2,
|
|
- BRCMS_SROM_PA5GW2A3,
|
|
-};
|
|
-
|
|
#define BRCMS_NUMRATES 16 /* max # of rates in a rateset */
|
|
|
|
/* phy types */
|
|
@@ -565,8 +339,6 @@ extern void brcms_c_ampdu_flush(struct b
|
|
struct ieee80211_sta *sta, u16 tid);
|
|
extern void brcms_c_ampdu_tx_operational(struct brcms_c_info *wlc, u8 tid,
|
|
u8 ba_wsize, uint max_rx_ampdu_bytes);
|
|
-extern char *getvar(struct si_pub *sih, enum brcms_srom_id id);
|
|
-extern int getintvar(struct si_pub *sih, enum brcms_srom_id id);
|
|
extern int brcms_c_module_register(struct brcms_pub *pub,
|
|
const char *name, struct brcms_info *hdl,
|
|
int (*down_fn)(void *handle));
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/srom.c
|
|
+++ /dev/null
|
|
@@ -1,980 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/string.h>
|
|
-#include <linux/io.h>
|
|
-#include <linux/etherdevice.h>
|
|
-#include <linux/crc8.h>
|
|
-#include <stdarg.h>
|
|
-
|
|
-#include <chipcommon.h>
|
|
-#include <brcmu_utils.h>
|
|
-#include "pub.h"
|
|
-#include "nicpci.h"
|
|
-#include "aiutils.h"
|
|
-#include "otp.h"
|
|
-#include "srom.h"
|
|
-#include "soc.h"
|
|
-
|
|
-/*
|
|
- * SROM CRC8 polynomial value:
|
|
- *
|
|
- * x^8 + x^7 +x^6 + x^4 + x^2 + 1
|
|
- */
|
|
-#define SROM_CRC8_POLY 0xAB
|
|
-
|
|
-/* Maximum srom: 6 Kilobits == 768 bytes */
|
|
-#define SROM_MAX 768
|
|
-
|
|
-/* PCI fields */
|
|
-#define PCI_F0DEVID 48
|
|
-
|
|
-#define SROM_WORDS 64
|
|
-
|
|
-#define SROM_SSID 2
|
|
-
|
|
-#define SROM_WL1LHMAXP 29
|
|
-
|
|
-#define SROM_WL1LPAB0 30
|
|
-#define SROM_WL1LPAB1 31
|
|
-#define SROM_WL1LPAB2 32
|
|
-
|
|
-#define SROM_WL1HPAB0 33
|
|
-#define SROM_WL1HPAB1 34
|
|
-#define SROM_WL1HPAB2 35
|
|
-
|
|
-#define SROM_MACHI_IL0 36
|
|
-#define SROM_MACMID_IL0 37
|
|
-#define SROM_MACLO_IL0 38
|
|
-#define SROM_MACHI_ET1 42
|
|
-#define SROM_MACMID_ET1 43
|
|
-#define SROM_MACLO_ET1 44
|
|
-
|
|
-#define SROM_BXARSSI2G 40
|
|
-#define SROM_BXARSSI5G 41
|
|
-
|
|
-#define SROM_TRI52G 42
|
|
-#define SROM_TRI5GHL 43
|
|
-
|
|
-#define SROM_RXPO52G 45
|
|
-
|
|
-#define SROM_AABREV 46
|
|
-/* Fields in AABREV */
|
|
-#define SROM_BR_MASK 0x00ff
|
|
-#define SROM_CC_MASK 0x0f00
|
|
-#define SROM_CC_SHIFT 8
|
|
-#define SROM_AA0_MASK 0x3000
|
|
-#define SROM_AA0_SHIFT 12
|
|
-#define SROM_AA1_MASK 0xc000
|
|
-#define SROM_AA1_SHIFT 14
|
|
-
|
|
-#define SROM_WL0PAB0 47
|
|
-#define SROM_WL0PAB1 48
|
|
-#define SROM_WL0PAB2 49
|
|
-
|
|
-#define SROM_LEDBH10 50
|
|
-#define SROM_LEDBH32 51
|
|
-
|
|
-#define SROM_WL10MAXP 52
|
|
-
|
|
-#define SROM_WL1PAB0 53
|
|
-#define SROM_WL1PAB1 54
|
|
-#define SROM_WL1PAB2 55
|
|
-
|
|
-#define SROM_ITT 56
|
|
-
|
|
-#define SROM_BFL 57
|
|
-#define SROM_BFL2 28
|
|
-
|
|
-#define SROM_AG10 58
|
|
-
|
|
-#define SROM_CCODE 59
|
|
-
|
|
-#define SROM_OPO 60
|
|
-
|
|
-#define SROM_CRCREV 63
|
|
-
|
|
-#define SROM4_WORDS 220
|
|
-
|
|
-#define SROM4_TXCHAIN_MASK 0x000f
|
|
-#define SROM4_RXCHAIN_MASK 0x00f0
|
|
-#define SROM4_SWITCH_MASK 0xff00
|
|
-
|
|
-/* Per-path fields */
|
|
-#define MAX_PATH_SROM 4
|
|
-
|
|
-#define SROM4_CRCREV 219
|
|
-
|
|
-/* SROM Rev 8: Make space for a 48word hardware header for PCIe rev >= 6.
|
|
- * This is acombined srom for both MIMO and SISO boards, usable in
|
|
- * the .130 4Kilobit OTP with hardware redundancy.
|
|
- */
|
|
-#define SROM8_BREV 65
|
|
-
|
|
-#define SROM8_BFL0 66
|
|
-#define SROM8_BFL1 67
|
|
-#define SROM8_BFL2 68
|
|
-#define SROM8_BFL3 69
|
|
-
|
|
-#define SROM8_MACHI 70
|
|
-#define SROM8_MACMID 71
|
|
-#define SROM8_MACLO 72
|
|
-
|
|
-#define SROM8_CCODE 73
|
|
-#define SROM8_REGREV 74
|
|
-
|
|
-#define SROM8_LEDBH10 75
|
|
-#define SROM8_LEDBH32 76
|
|
-
|
|
-#define SROM8_LEDDC 77
|
|
-
|
|
-#define SROM8_AA 78
|
|
-
|
|
-#define SROM8_AG10 79
|
|
-#define SROM8_AG32 80
|
|
-
|
|
-#define SROM8_TXRXC 81
|
|
-
|
|
-#define SROM8_BXARSSI2G 82
|
|
-#define SROM8_BXARSSI5G 83
|
|
-#define SROM8_TRI52G 84
|
|
-#define SROM8_TRI5GHL 85
|
|
-#define SROM8_RXPO52G 86
|
|
-
|
|
-#define SROM8_FEM2G 87
|
|
-#define SROM8_FEM5G 88
|
|
-#define SROM8_FEM_ANTSWLUT_MASK 0xf800
|
|
-#define SROM8_FEM_ANTSWLUT_SHIFT 11
|
|
-#define SROM8_FEM_TR_ISO_MASK 0x0700
|
|
-#define SROM8_FEM_TR_ISO_SHIFT 8
|
|
-#define SROM8_FEM_PDET_RANGE_MASK 0x00f8
|
|
-#define SROM8_FEM_PDET_RANGE_SHIFT 3
|
|
-#define SROM8_FEM_EXTPA_GAIN_MASK 0x0006
|
|
-#define SROM8_FEM_EXTPA_GAIN_SHIFT 1
|
|
-#define SROM8_FEM_TSSIPOS_MASK 0x0001
|
|
-#define SROM8_FEM_TSSIPOS_SHIFT 0
|
|
-
|
|
-#define SROM8_THERMAL 89
|
|
-
|
|
-/* Temp sense related entries */
|
|
-#define SROM8_MPWR_RAWTS 90
|
|
-#define SROM8_TS_SLP_OPT_CORRX 91
|
|
-/* FOC: freiquency offset correction, HWIQ: H/W IOCAL enable,
|
|
- * IQSWP: IQ CAL swap disable */
|
|
-#define SROM8_FOC_HWIQ_IQSWP 92
|
|
-
|
|
-/* Temperature delta for PHY calibration */
|
|
-#define SROM8_PHYCAL_TEMPDELTA 93
|
|
-
|
|
-/* Per-path offsets & fields */
|
|
-#define SROM8_PATH0 96
|
|
-#define SROM8_PATH1 112
|
|
-#define SROM8_PATH2 128
|
|
-#define SROM8_PATH3 144
|
|
-
|
|
-#define SROM8_2G_ITT_MAXP 0
|
|
-#define SROM8_2G_PA 1
|
|
-#define SROM8_5G_ITT_MAXP 4
|
|
-#define SROM8_5GLH_MAXP 5
|
|
-#define SROM8_5G_PA 6
|
|
-#define SROM8_5GL_PA 9
|
|
-#define SROM8_5GH_PA 12
|
|
-
|
|
-/* All the miriad power offsets */
|
|
-#define SROM8_2G_CCKPO 160
|
|
-
|
|
-#define SROM8_2G_OFDMPO 161
|
|
-#define SROM8_5G_OFDMPO 163
|
|
-#define SROM8_5GL_OFDMPO 165
|
|
-#define SROM8_5GH_OFDMPO 167
|
|
-
|
|
-#define SROM8_2G_MCSPO 169
|
|
-#define SROM8_5G_MCSPO 177
|
|
-#define SROM8_5GL_MCSPO 185
|
|
-#define SROM8_5GH_MCSPO 193
|
|
-
|
|
-#define SROM8_CDDPO 201
|
|
-#define SROM8_STBCPO 202
|
|
-#define SROM8_BW40PO 203
|
|
-#define SROM8_BWDUPPO 204
|
|
-
|
|
-/* SISO PA parameters are in the path0 spaces */
|
|
-#define SROM8_SISO 96
|
|
-
|
|
-/* Legacy names for SISO PA paramters */
|
|
-#define SROM8_W0_ITTMAXP (SROM8_SISO + SROM8_2G_ITT_MAXP)
|
|
-#define SROM8_W0_PAB0 (SROM8_SISO + SROM8_2G_PA)
|
|
-#define SROM8_W0_PAB1 (SROM8_SISO + SROM8_2G_PA + 1)
|
|
-#define SROM8_W0_PAB2 (SROM8_SISO + SROM8_2G_PA + 2)
|
|
-#define SROM8_W1_ITTMAXP (SROM8_SISO + SROM8_5G_ITT_MAXP)
|
|
-#define SROM8_W1_MAXP_LCHC (SROM8_SISO + SROM8_5GLH_MAXP)
|
|
-#define SROM8_W1_PAB0 (SROM8_SISO + SROM8_5G_PA)
|
|
-#define SROM8_W1_PAB1 (SROM8_SISO + SROM8_5G_PA + 1)
|
|
-#define SROM8_W1_PAB2 (SROM8_SISO + SROM8_5G_PA + 2)
|
|
-#define SROM8_W1_PAB0_LC (SROM8_SISO + SROM8_5GL_PA)
|
|
-#define SROM8_W1_PAB1_LC (SROM8_SISO + SROM8_5GL_PA + 1)
|
|
-#define SROM8_W1_PAB2_LC (SROM8_SISO + SROM8_5GL_PA + 2)
|
|
-#define SROM8_W1_PAB0_HC (SROM8_SISO + SROM8_5GH_PA)
|
|
-#define SROM8_W1_PAB1_HC (SROM8_SISO + SROM8_5GH_PA + 1)
|
|
-#define SROM8_W1_PAB2_HC (SROM8_SISO + SROM8_5GH_PA + 2)
|
|
-
|
|
-/* SROM REV 9 */
|
|
-#define SROM9_2GPO_CCKBW20 160
|
|
-#define SROM9_2GPO_CCKBW20UL 161
|
|
-#define SROM9_2GPO_LOFDMBW20 162
|
|
-#define SROM9_2GPO_LOFDMBW20UL 164
|
|
-
|
|
-#define SROM9_5GLPO_LOFDMBW20 166
|
|
-#define SROM9_5GLPO_LOFDMBW20UL 168
|
|
-#define SROM9_5GMPO_LOFDMBW20 170
|
|
-#define SROM9_5GMPO_LOFDMBW20UL 172
|
|
-#define SROM9_5GHPO_LOFDMBW20 174
|
|
-#define SROM9_5GHPO_LOFDMBW20UL 176
|
|
-
|
|
-#define SROM9_2GPO_MCSBW20 178
|
|
-#define SROM9_2GPO_MCSBW20UL 180
|
|
-#define SROM9_2GPO_MCSBW40 182
|
|
-
|
|
-#define SROM9_5GLPO_MCSBW20 184
|
|
-#define SROM9_5GLPO_MCSBW20UL 186
|
|
-#define SROM9_5GLPO_MCSBW40 188
|
|
-#define SROM9_5GMPO_MCSBW20 190
|
|
-#define SROM9_5GMPO_MCSBW20UL 192
|
|
-#define SROM9_5GMPO_MCSBW40 194
|
|
-#define SROM9_5GHPO_MCSBW20 196
|
|
-#define SROM9_5GHPO_MCSBW20UL 198
|
|
-#define SROM9_5GHPO_MCSBW40 200
|
|
-
|
|
-#define SROM9_PO_MCS32 202
|
|
-#define SROM9_PO_LOFDM40DUP 203
|
|
-
|
|
-/* SROM flags (see sromvar_t) */
|
|
-
|
|
-/* value continues as described by the next entry */
|
|
-#define SRFL_MORE 1
|
|
-#define SRFL_NOFFS 2 /* value bits can't be all one's */
|
|
-#define SRFL_PRHEX 4 /* value is in hexdecimal format */
|
|
-#define SRFL_PRSIGN 8 /* value is in signed decimal format */
|
|
-#define SRFL_CCODE 0x10 /* value is in country code format */
|
|
-#define SRFL_ETHADDR 0x20 /* value is an Ethernet address */
|
|
-#define SRFL_LEDDC 0x40 /* value is an LED duty cycle */
|
|
-/* do not generate a nvram param, entry is for mfgc */
|
|
-#define SRFL_NOVAR 0x80
|
|
-
|
|
-/* Max. nvram variable table size */
|
|
-#define MAXSZ_NVRAM_VARS 4096
|
|
-
|
|
-/*
|
|
- * indicates type of value.
|
|
- */
|
|
-enum brcms_srom_var_type {
|
|
- BRCMS_SROM_STRING,
|
|
- BRCMS_SROM_SNUMBER,
|
|
- BRCMS_SROM_UNUMBER
|
|
-};
|
|
-
|
|
-/*
|
|
- * storage type for srom variable.
|
|
- *
|
|
- * var_list: for linked list operations.
|
|
- * varid: identifier of the variable.
|
|
- * var_type: type of variable.
|
|
- * buf: variable value when var_type == BRCMS_SROM_STRING.
|
|
- * uval: unsigned variable value when var_type == BRCMS_SROM_UNUMBER.
|
|
- * sval: signed variable value when var_type == BRCMS_SROM_SNUMBER.
|
|
- */
|
|
-struct brcms_srom_list_head {
|
|
- struct list_head var_list;
|
|
- enum brcms_srom_id varid;
|
|
- enum brcms_srom_var_type var_type;
|
|
- union {
|
|
- char buf[0];
|
|
- u32 uval;
|
|
- s32 sval;
|
|
- };
|
|
-};
|
|
-
|
|
-struct brcms_sromvar {
|
|
- enum brcms_srom_id varid;
|
|
- u32 revmask;
|
|
- u32 flags;
|
|
- u16 off;
|
|
- u16 mask;
|
|
-};
|
|
-
|
|
-struct brcms_varbuf {
|
|
- char *base; /* pointer to buffer base */
|
|
- char *buf; /* pointer to current position */
|
|
- unsigned int size; /* current (residual) size in bytes */
|
|
-};
|
|
-
|
|
-/*
|
|
- * Assumptions:
|
|
- * - Ethernet address spans across 3 consecutive words
|
|
- *
|
|
- * Table rules:
|
|
- * - Add multiple entries next to each other if a value spans across multiple
|
|
- * words (even multiple fields in the same word) with each entry except the
|
|
- * last having it's SRFL_MORE bit set.
|
|
- * - Ethernet address entry does not follow above rule and must not have
|
|
- * SRFL_MORE bit set. Its SRFL_ETHADDR bit implies it takes multiple words.
|
|
- * - The last entry's name field must be NULL to indicate the end of the table.
|
|
- * Other entries must have non-NULL name.
|
|
- */
|
|
-static const struct brcms_sromvar pci_sromvars[] = {
|
|
- {BRCMS_SROM_DEVID, 0xffffff00, SRFL_PRHEX | SRFL_NOVAR, PCI_F0DEVID,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_BOARDREV, 0xffffff00, SRFL_PRHEX, SROM8_BREV, 0xffff},
|
|
- {BRCMS_SROM_BOARDFLAGS, 0xffffff00, SRFL_PRHEX | SRFL_MORE, SROM8_BFL0,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_BFL1, 0xffff},
|
|
- {BRCMS_SROM_BOARDFLAGS2, 0xffffff00, SRFL_PRHEX | SRFL_MORE, SROM8_BFL2,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_BFL3, 0xffff},
|
|
- {BRCMS_SROM_BOARDTYPE, 0xfffffffc, SRFL_PRHEX, SROM_SSID, 0xffff},
|
|
- {BRCMS_SROM_BOARDNUM, 0xffffff00, 0, SROM8_MACLO, 0xffff},
|
|
- {BRCMS_SROM_REGREV, 0xffffff00, 0, SROM8_REGREV, 0x00ff},
|
|
- {BRCMS_SROM_LEDBH0, 0xffffff00, SRFL_NOFFS, SROM8_LEDBH10, 0x00ff},
|
|
- {BRCMS_SROM_LEDBH1, 0xffffff00, SRFL_NOFFS, SROM8_LEDBH10, 0xff00},
|
|
- {BRCMS_SROM_LEDBH2, 0xffffff00, SRFL_NOFFS, SROM8_LEDBH32, 0x00ff},
|
|
- {BRCMS_SROM_LEDBH3, 0xffffff00, SRFL_NOFFS, SROM8_LEDBH32, 0xff00},
|
|
- {BRCMS_SROM_PA0B0, 0xffffff00, SRFL_PRHEX, SROM8_W0_PAB0, 0xffff},
|
|
- {BRCMS_SROM_PA0B1, 0xffffff00, SRFL_PRHEX, SROM8_W0_PAB1, 0xffff},
|
|
- {BRCMS_SROM_PA0B2, 0xffffff00, SRFL_PRHEX, SROM8_W0_PAB2, 0xffff},
|
|
- {BRCMS_SROM_PA0ITSSIT, 0xffffff00, 0, SROM8_W0_ITTMAXP, 0xff00},
|
|
- {BRCMS_SROM_PA0MAXPWR, 0xffffff00, 0, SROM8_W0_ITTMAXP, 0x00ff},
|
|
- {BRCMS_SROM_OPO, 0xffffff00, 0, SROM8_2G_OFDMPO, 0x00ff},
|
|
- {BRCMS_SROM_AA2G, 0xffffff00, 0, SROM8_AA, 0x00ff},
|
|
- {BRCMS_SROM_AA5G, 0xffffff00, 0, SROM8_AA, 0xff00},
|
|
- {BRCMS_SROM_AG0, 0xffffff00, 0, SROM8_AG10, 0x00ff},
|
|
- {BRCMS_SROM_AG1, 0xffffff00, 0, SROM8_AG10, 0xff00},
|
|
- {BRCMS_SROM_AG2, 0xffffff00, 0, SROM8_AG32, 0x00ff},
|
|
- {BRCMS_SROM_AG3, 0xffffff00, 0, SROM8_AG32, 0xff00},
|
|
- {BRCMS_SROM_PA1B0, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB0, 0xffff},
|
|
- {BRCMS_SROM_PA1B1, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB1, 0xffff},
|
|
- {BRCMS_SROM_PA1B2, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB2, 0xffff},
|
|
- {BRCMS_SROM_PA1LOB0, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB0_LC, 0xffff},
|
|
- {BRCMS_SROM_PA1LOB1, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB1_LC, 0xffff},
|
|
- {BRCMS_SROM_PA1LOB2, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB2_LC, 0xffff},
|
|
- {BRCMS_SROM_PA1HIB0, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB0_HC, 0xffff},
|
|
- {BRCMS_SROM_PA1HIB1, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB1_HC, 0xffff},
|
|
- {BRCMS_SROM_PA1HIB2, 0xffffff00, SRFL_PRHEX, SROM8_W1_PAB2_HC, 0xffff},
|
|
- {BRCMS_SROM_PA1ITSSIT, 0xffffff00, 0, SROM8_W1_ITTMAXP, 0xff00},
|
|
- {BRCMS_SROM_PA1MAXPWR, 0xffffff00, 0, SROM8_W1_ITTMAXP, 0x00ff},
|
|
- {BRCMS_SROM_PA1LOMAXPWR, 0xffffff00, 0, SROM8_W1_MAXP_LCHC, 0xff00},
|
|
- {BRCMS_SROM_PA1HIMAXPWR, 0xffffff00, 0, SROM8_W1_MAXP_LCHC, 0x00ff},
|
|
- {BRCMS_SROM_BXA2G, 0xffffff00, 0, SROM8_BXARSSI2G, 0x1800},
|
|
- {BRCMS_SROM_RSSISAV2G, 0xffffff00, 0, SROM8_BXARSSI2G, 0x0700},
|
|
- {BRCMS_SROM_RSSISMC2G, 0xffffff00, 0, SROM8_BXARSSI2G, 0x00f0},
|
|
- {BRCMS_SROM_RSSISMF2G, 0xffffff00, 0, SROM8_BXARSSI2G, 0x000f},
|
|
- {BRCMS_SROM_BXA5G, 0xffffff00, 0, SROM8_BXARSSI5G, 0x1800},
|
|
- {BRCMS_SROM_RSSISAV5G, 0xffffff00, 0, SROM8_BXARSSI5G, 0x0700},
|
|
- {BRCMS_SROM_RSSISMC5G, 0xffffff00, 0, SROM8_BXARSSI5G, 0x00f0},
|
|
- {BRCMS_SROM_RSSISMF5G, 0xffffff00, 0, SROM8_BXARSSI5G, 0x000f},
|
|
- {BRCMS_SROM_TRI2G, 0xffffff00, 0, SROM8_TRI52G, 0x00ff},
|
|
- {BRCMS_SROM_TRI5G, 0xffffff00, 0, SROM8_TRI52G, 0xff00},
|
|
- {BRCMS_SROM_TRI5GL, 0xffffff00, 0, SROM8_TRI5GHL, 0x00ff},
|
|
- {BRCMS_SROM_TRI5GH, 0xffffff00, 0, SROM8_TRI5GHL, 0xff00},
|
|
- {BRCMS_SROM_RXPO2G, 0xffffff00, SRFL_PRSIGN, SROM8_RXPO52G, 0x00ff},
|
|
- {BRCMS_SROM_RXPO5G, 0xffffff00, SRFL_PRSIGN, SROM8_RXPO52G, 0xff00},
|
|
- {BRCMS_SROM_TXCHAIN, 0xffffff00, SRFL_NOFFS, SROM8_TXRXC,
|
|
- SROM4_TXCHAIN_MASK},
|
|
- {BRCMS_SROM_RXCHAIN, 0xffffff00, SRFL_NOFFS, SROM8_TXRXC,
|
|
- SROM4_RXCHAIN_MASK},
|
|
- {BRCMS_SROM_ANTSWITCH, 0xffffff00, SRFL_NOFFS, SROM8_TXRXC,
|
|
- SROM4_SWITCH_MASK},
|
|
- {BRCMS_SROM_TSSIPOS2G, 0xffffff00, 0, SROM8_FEM2G,
|
|
- SROM8_FEM_TSSIPOS_MASK},
|
|
- {BRCMS_SROM_EXTPAGAIN2G, 0xffffff00, 0, SROM8_FEM2G,
|
|
- SROM8_FEM_EXTPA_GAIN_MASK},
|
|
- {BRCMS_SROM_PDETRANGE2G, 0xffffff00, 0, SROM8_FEM2G,
|
|
- SROM8_FEM_PDET_RANGE_MASK},
|
|
- {BRCMS_SROM_TRISO2G, 0xffffff00, 0, SROM8_FEM2G, SROM8_FEM_TR_ISO_MASK},
|
|
- {BRCMS_SROM_ANTSWCTL2G, 0xffffff00, 0, SROM8_FEM2G,
|
|
- SROM8_FEM_ANTSWLUT_MASK},
|
|
- {BRCMS_SROM_TSSIPOS5G, 0xffffff00, 0, SROM8_FEM5G,
|
|
- SROM8_FEM_TSSIPOS_MASK},
|
|
- {BRCMS_SROM_EXTPAGAIN5G, 0xffffff00, 0, SROM8_FEM5G,
|
|
- SROM8_FEM_EXTPA_GAIN_MASK},
|
|
- {BRCMS_SROM_PDETRANGE5G, 0xffffff00, 0, SROM8_FEM5G,
|
|
- SROM8_FEM_PDET_RANGE_MASK},
|
|
- {BRCMS_SROM_TRISO5G, 0xffffff00, 0, SROM8_FEM5G, SROM8_FEM_TR_ISO_MASK},
|
|
- {BRCMS_SROM_ANTSWCTL5G, 0xffffff00, 0, SROM8_FEM5G,
|
|
- SROM8_FEM_ANTSWLUT_MASK},
|
|
- {BRCMS_SROM_TEMPTHRESH, 0xffffff00, 0, SROM8_THERMAL, 0xff00},
|
|
- {BRCMS_SROM_TEMPOFFSET, 0xffffff00, 0, SROM8_THERMAL, 0x00ff},
|
|
-
|
|
- {BRCMS_SROM_CCODE, 0xffffff00, SRFL_CCODE, SROM8_CCODE, 0xffff},
|
|
- {BRCMS_SROM_MACADDR, 0xffffff00, SRFL_ETHADDR, SROM8_MACHI, 0xffff},
|
|
- {BRCMS_SROM_LEDDC, 0xffffff00, SRFL_NOFFS | SRFL_LEDDC, SROM8_LEDDC,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_RAWTEMPSENSE, 0xffffff00, SRFL_PRHEX, SROM8_MPWR_RAWTS,
|
|
- 0x01ff},
|
|
- {BRCMS_SROM_MEASPOWER, 0xffffff00, SRFL_PRHEX, SROM8_MPWR_RAWTS,
|
|
- 0xfe00},
|
|
- {BRCMS_SROM_TEMPSENSE_SLOPE, 0xffffff00, SRFL_PRHEX,
|
|
- SROM8_TS_SLP_OPT_CORRX, 0x00ff},
|
|
- {BRCMS_SROM_TEMPCORRX, 0xffffff00, SRFL_PRHEX, SROM8_TS_SLP_OPT_CORRX,
|
|
- 0xfc00},
|
|
- {BRCMS_SROM_TEMPSENSE_OPTION, 0xffffff00, SRFL_PRHEX,
|
|
- SROM8_TS_SLP_OPT_CORRX, 0x0300},
|
|
- {BRCMS_SROM_FREQOFFSET_CORR, 0xffffff00, SRFL_PRHEX,
|
|
- SROM8_FOC_HWIQ_IQSWP, 0x000f},
|
|
- {BRCMS_SROM_IQCAL_SWP_DIS, 0xffffff00, SRFL_PRHEX, SROM8_FOC_HWIQ_IQSWP,
|
|
- 0x0010},
|
|
- {BRCMS_SROM_HW_IQCAL_EN, 0xffffff00, SRFL_PRHEX, SROM8_FOC_HWIQ_IQSWP,
|
|
- 0x0020},
|
|
- {BRCMS_SROM_PHYCAL_TEMPDELTA, 0xffffff00, 0, SROM8_PHYCAL_TEMPDELTA,
|
|
- 0x00ff},
|
|
-
|
|
- {BRCMS_SROM_CCK2GPO, 0x00000100, 0, SROM8_2G_CCKPO, 0xffff},
|
|
- {BRCMS_SROM_OFDM2GPO, 0x00000100, SRFL_MORE, SROM8_2G_OFDMPO, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_2G_OFDMPO + 1, 0xffff},
|
|
- {BRCMS_SROM_OFDM5GPO, 0x00000100, SRFL_MORE, SROM8_5G_OFDMPO, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_5G_OFDMPO + 1, 0xffff},
|
|
- {BRCMS_SROM_OFDM5GLPO, 0x00000100, SRFL_MORE, SROM8_5GL_OFDMPO, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_5GL_OFDMPO + 1, 0xffff},
|
|
- {BRCMS_SROM_OFDM5GHPO, 0x00000100, SRFL_MORE, SROM8_5GH_OFDMPO, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM8_5GH_OFDMPO + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO0, 0x00000100, 0, SROM8_2G_MCSPO, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO1, 0x00000100, 0, SROM8_2G_MCSPO + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO2, 0x00000100, 0, SROM8_2G_MCSPO + 2, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO3, 0x00000100, 0, SROM8_2G_MCSPO + 3, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO4, 0x00000100, 0, SROM8_2G_MCSPO + 4, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO5, 0x00000100, 0, SROM8_2G_MCSPO + 5, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO6, 0x00000100, 0, SROM8_2G_MCSPO + 6, 0xffff},
|
|
- {BRCMS_SROM_MCS2GPO7, 0x00000100, 0, SROM8_2G_MCSPO + 7, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO0, 0x00000100, 0, SROM8_5G_MCSPO, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO1, 0x00000100, 0, SROM8_5G_MCSPO + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO2, 0x00000100, 0, SROM8_5G_MCSPO + 2, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO3, 0x00000100, 0, SROM8_5G_MCSPO + 3, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO4, 0x00000100, 0, SROM8_5G_MCSPO + 4, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO5, 0x00000100, 0, SROM8_5G_MCSPO + 5, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO6, 0x00000100, 0, SROM8_5G_MCSPO + 6, 0xffff},
|
|
- {BRCMS_SROM_MCS5GPO7, 0x00000100, 0, SROM8_5G_MCSPO + 7, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO0, 0x00000100, 0, SROM8_5GL_MCSPO, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO1, 0x00000100, 0, SROM8_5GL_MCSPO + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO2, 0x00000100, 0, SROM8_5GL_MCSPO + 2, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO3, 0x00000100, 0, SROM8_5GL_MCSPO + 3, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO4, 0x00000100, 0, SROM8_5GL_MCSPO + 4, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO5, 0x00000100, 0, SROM8_5GL_MCSPO + 5, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO6, 0x00000100, 0, SROM8_5GL_MCSPO + 6, 0xffff},
|
|
- {BRCMS_SROM_MCS5GLPO7, 0x00000100, 0, SROM8_5GL_MCSPO + 7, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO0, 0x00000100, 0, SROM8_5GH_MCSPO, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO1, 0x00000100, 0, SROM8_5GH_MCSPO + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO2, 0x00000100, 0, SROM8_5GH_MCSPO + 2, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO3, 0x00000100, 0, SROM8_5GH_MCSPO + 3, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO4, 0x00000100, 0, SROM8_5GH_MCSPO + 4, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO5, 0x00000100, 0, SROM8_5GH_MCSPO + 5, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO6, 0x00000100, 0, SROM8_5GH_MCSPO + 6, 0xffff},
|
|
- {BRCMS_SROM_MCS5GHPO7, 0x00000100, 0, SROM8_5GH_MCSPO + 7, 0xffff},
|
|
- {BRCMS_SROM_CDDPO, 0x00000100, 0, SROM8_CDDPO, 0xffff},
|
|
- {BRCMS_SROM_STBCPO, 0x00000100, 0, SROM8_STBCPO, 0xffff},
|
|
- {BRCMS_SROM_BW40PO, 0x00000100, 0, SROM8_BW40PO, 0xffff},
|
|
- {BRCMS_SROM_BWDUPPO, 0x00000100, 0, SROM8_BWDUPPO, 0xffff},
|
|
-
|
|
- /* power per rate from sromrev 9 */
|
|
- {BRCMS_SROM_CCKBW202GPO, 0xfffffe00, 0, SROM9_2GPO_CCKBW20, 0xffff},
|
|
- {BRCMS_SROM_CCKBW20UL2GPO, 0xfffffe00, 0, SROM9_2GPO_CCKBW20UL, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW202GPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_2GPO_LOFDMBW20, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_2GPO_LOFDMBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW20UL2GPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_2GPO_LOFDMBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_2GPO_LOFDMBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW205GLPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GLPO_LOFDMBW20, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GLPO_LOFDMBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW20UL5GLPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GLPO_LOFDMBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GLPO_LOFDMBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW205GMPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GMPO_LOFDMBW20, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GMPO_LOFDMBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW20UL5GMPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GMPO_LOFDMBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GMPO_LOFDMBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW205GHPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GHPO_LOFDMBW20, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GHPO_LOFDMBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDMBW20UL5GHPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GHPO_LOFDMBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GHPO_LOFDMBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW202GPO, 0xfffffe00, SRFL_MORE, SROM9_2GPO_MCSBW20,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_2GPO_MCSBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW20UL2GPO, 0xfffffe00, SRFL_MORE, SROM9_2GPO_MCSBW20UL,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_2GPO_MCSBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW402GPO, 0xfffffe00, SRFL_MORE, SROM9_2GPO_MCSBW40,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_2GPO_MCSBW40 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW205GLPO, 0xfffffe00, SRFL_MORE, SROM9_5GLPO_MCSBW20,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GLPO_MCSBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW20UL5GLPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GLPO_MCSBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GLPO_MCSBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW405GLPO, 0xfffffe00, SRFL_MORE, SROM9_5GLPO_MCSBW40,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GLPO_MCSBW40 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW205GMPO, 0xfffffe00, SRFL_MORE, SROM9_5GMPO_MCSBW20,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GMPO_MCSBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW20UL5GMPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GMPO_MCSBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GMPO_MCSBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW405GMPO, 0xfffffe00, SRFL_MORE, SROM9_5GMPO_MCSBW40,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GMPO_MCSBW40 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW205GHPO, 0xfffffe00, SRFL_MORE, SROM9_5GHPO_MCSBW20,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GHPO_MCSBW20 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW20UL5GHPO, 0xfffffe00, SRFL_MORE,
|
|
- SROM9_5GHPO_MCSBW20UL, 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GHPO_MCSBW20UL + 1, 0xffff},
|
|
- {BRCMS_SROM_MCSBW405GHPO, 0xfffffe00, SRFL_MORE, SROM9_5GHPO_MCSBW40,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_CONT, 0, 0, SROM9_5GHPO_MCSBW40 + 1, 0xffff},
|
|
- {BRCMS_SROM_MCS32PO, 0xfffffe00, 0, SROM9_PO_MCS32, 0xffff},
|
|
- {BRCMS_SROM_LEGOFDM40DUPPO, 0xfffffe00, 0, SROM9_PO_LOFDM40DUP, 0xffff},
|
|
-
|
|
- {BRCMS_SROM_NULL, 0, 0, 0, 0}
|
|
-};
|
|
-
|
|
-static const struct brcms_sromvar perpath_pci_sromvars[] = {
|
|
- {BRCMS_SROM_MAXP2GA0, 0xffffff00, 0, SROM8_2G_ITT_MAXP, 0x00ff},
|
|
- {BRCMS_SROM_ITT2GA0, 0xffffff00, 0, SROM8_2G_ITT_MAXP, 0xff00},
|
|
- {BRCMS_SROM_ITT5GA0, 0xffffff00, 0, SROM8_5G_ITT_MAXP, 0xff00},
|
|
- {BRCMS_SROM_PA2GW0A0, 0xffffff00, SRFL_PRHEX, SROM8_2G_PA, 0xffff},
|
|
- {BRCMS_SROM_PA2GW1A0, 0xffffff00, SRFL_PRHEX, SROM8_2G_PA + 1, 0xffff},
|
|
- {BRCMS_SROM_PA2GW2A0, 0xffffff00, SRFL_PRHEX, SROM8_2G_PA + 2, 0xffff},
|
|
- {BRCMS_SROM_MAXP5GA0, 0xffffff00, 0, SROM8_5G_ITT_MAXP, 0x00ff},
|
|
- {BRCMS_SROM_MAXP5GHA0, 0xffffff00, 0, SROM8_5GLH_MAXP, 0x00ff},
|
|
- {BRCMS_SROM_MAXP5GLA0, 0xffffff00, 0, SROM8_5GLH_MAXP, 0xff00},
|
|
- {BRCMS_SROM_PA5GW0A0, 0xffffff00, SRFL_PRHEX, SROM8_5G_PA, 0xffff},
|
|
- {BRCMS_SROM_PA5GW1A0, 0xffffff00, SRFL_PRHEX, SROM8_5G_PA + 1, 0xffff},
|
|
- {BRCMS_SROM_PA5GW2A0, 0xffffff00, SRFL_PRHEX, SROM8_5G_PA + 2, 0xffff},
|
|
- {BRCMS_SROM_PA5GLW0A0, 0xffffff00, SRFL_PRHEX, SROM8_5GL_PA, 0xffff},
|
|
- {BRCMS_SROM_PA5GLW1A0, 0xffffff00, SRFL_PRHEX, SROM8_5GL_PA + 1,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_PA5GLW2A0, 0xffffff00, SRFL_PRHEX, SROM8_5GL_PA + 2,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_PA5GHW0A0, 0xffffff00, SRFL_PRHEX, SROM8_5GH_PA, 0xffff},
|
|
- {BRCMS_SROM_PA5GHW1A0, 0xffffff00, SRFL_PRHEX, SROM8_5GH_PA + 1,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_PA5GHW2A0, 0xffffff00, SRFL_PRHEX, SROM8_5GH_PA + 2,
|
|
- 0xffff},
|
|
- {BRCMS_SROM_NULL, 0, 0, 0, 0}
|
|
-};
|
|
-
|
|
-/* crc table has the same contents for every device instance, so it can be
|
|
- * shared between devices. */
|
|
-static u8 brcms_srom_crc8_table[CRC8_TABLE_SIZE];
|
|
-
|
|
-static uint mask_shift(u16 mask)
|
|
-{
|
|
- uint i;
|
|
- for (i = 0; i < (sizeof(mask) << 3); i++) {
|
|
- if (mask & (1 << i))
|
|
- return i;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static uint mask_width(u16 mask)
|
|
-{
|
|
- int i;
|
|
- for (i = (sizeof(mask) << 3) - 1; i >= 0; i--) {
|
|
- if (mask & (1 << i))
|
|
- return (uint) (i - mask_shift(mask) + 1);
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static inline void le16_to_cpu_buf(u16 *buf, uint nwords)
|
|
-{
|
|
- while (nwords--)
|
|
- *(buf + nwords) = le16_to_cpu(*(__le16 *)(buf + nwords));
|
|
-}
|
|
-
|
|
-static inline void cpu_to_le16_buf(u16 *buf, uint nwords)
|
|
-{
|
|
- while (nwords--)
|
|
- *(__le16 *)(buf + nwords) = cpu_to_le16(*(buf + nwords));
|
|
-}
|
|
-
|
|
-/*
|
|
- * convert binary srom data into linked list of srom variable items.
|
|
- */
|
|
-static int
|
|
-_initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
|
|
-{
|
|
- struct brcms_srom_list_head *entry;
|
|
- enum brcms_srom_id id;
|
|
- u16 w;
|
|
- u32 val = 0;
|
|
- const struct brcms_sromvar *srv;
|
|
- uint width;
|
|
- uint flags;
|
|
- u32 sr = (1 << sromrev);
|
|
- uint p;
|
|
- uint pb = SROM8_PATH0;
|
|
- const uint psz = SROM8_PATH1 - SROM8_PATH0;
|
|
-
|
|
- /* first store the srom revision */
|
|
- entry = kzalloc(sizeof(struct brcms_srom_list_head), GFP_KERNEL);
|
|
- if (!entry)
|
|
- return -ENOMEM;
|
|
-
|
|
- entry->varid = BRCMS_SROM_REV;
|
|
- entry->var_type = BRCMS_SROM_UNUMBER;
|
|
- entry->uval = sromrev;
|
|
- list_add(&entry->var_list, var_list);
|
|
-
|
|
- for (srv = pci_sromvars; srv->varid != BRCMS_SROM_NULL; srv++) {
|
|
- enum brcms_srom_var_type type;
|
|
- u8 ea[ETH_ALEN];
|
|
- u8 extra_space = 0;
|
|
-
|
|
- if ((srv->revmask & sr) == 0)
|
|
- continue;
|
|
-
|
|
- flags = srv->flags;
|
|
- id = srv->varid;
|
|
-
|
|
- /* This entry is for mfgc only. Don't generate param for it, */
|
|
- if (flags & SRFL_NOVAR)
|
|
- continue;
|
|
-
|
|
- if (flags & SRFL_ETHADDR) {
|
|
- /*
|
|
- * stored in string format XX:XX:XX:XX:XX:XX (17 chars)
|
|
- */
|
|
- ea[0] = (srom[srv->off] >> 8) & 0xff;
|
|
- ea[1] = srom[srv->off] & 0xff;
|
|
- ea[2] = (srom[srv->off + 1] >> 8) & 0xff;
|
|
- ea[3] = srom[srv->off + 1] & 0xff;
|
|
- ea[4] = (srom[srv->off + 2] >> 8) & 0xff;
|
|
- ea[5] = srom[srv->off + 2] & 0xff;
|
|
- /* 17 characters + string terminator - union size */
|
|
- extra_space = 18 - sizeof(s32);
|
|
- type = BRCMS_SROM_STRING;
|
|
- } else {
|
|
- w = srom[srv->off];
|
|
- val = (w & srv->mask) >> mask_shift(srv->mask);
|
|
- width = mask_width(srv->mask);
|
|
-
|
|
- while (srv->flags & SRFL_MORE) {
|
|
- srv++;
|
|
- if (srv->off == 0)
|
|
- continue;
|
|
-
|
|
- w = srom[srv->off];
|
|
- val +=
|
|
- ((w & srv->mask) >> mask_shift(srv->
|
|
- mask)) <<
|
|
- width;
|
|
- width += mask_width(srv->mask);
|
|
- }
|
|
-
|
|
- if ((flags & SRFL_NOFFS)
|
|
- && ((int)val == (1 << width) - 1))
|
|
- continue;
|
|
-
|
|
- if (flags & SRFL_CCODE) {
|
|
- type = BRCMS_SROM_STRING;
|
|
- } else if (flags & SRFL_LEDDC) {
|
|
- /* LED Powersave duty cycle has to be scaled:
|
|
- *(oncount >> 24) (offcount >> 8)
|
|
- */
|
|
- u32 w32 = /* oncount */
|
|
- (((val >> 8) & 0xff) << 24) |
|
|
- /* offcount */
|
|
- (((val & 0xff)) << 8);
|
|
- type = BRCMS_SROM_UNUMBER;
|
|
- val = w32;
|
|
- } else if ((flags & SRFL_PRSIGN)
|
|
- && (val & (1 << (width - 1)))) {
|
|
- type = BRCMS_SROM_SNUMBER;
|
|
- val |= ~0 << width;
|
|
- } else
|
|
- type = BRCMS_SROM_UNUMBER;
|
|
- }
|
|
-
|
|
- entry = kzalloc(sizeof(struct brcms_srom_list_head) +
|
|
- extra_space, GFP_KERNEL);
|
|
- if (!entry)
|
|
- return -ENOMEM;
|
|
- entry->varid = id;
|
|
- entry->var_type = type;
|
|
- if (flags & SRFL_ETHADDR) {
|
|
- snprintf(entry->buf, 18, "%pM", ea);
|
|
- } else if (flags & SRFL_CCODE) {
|
|
- if (val == 0)
|
|
- entry->buf[0] = '\0';
|
|
- else
|
|
- snprintf(entry->buf, 3, "%c%c",
|
|
- (val >> 8), (val & 0xff));
|
|
- } else {
|
|
- entry->uval = val;
|
|
- }
|
|
-
|
|
- list_add(&entry->var_list, var_list);
|
|
- }
|
|
-
|
|
- for (p = 0; p < MAX_PATH_SROM; p++) {
|
|
- for (srv = perpath_pci_sromvars;
|
|
- srv->varid != BRCMS_SROM_NULL; srv++) {
|
|
- if ((srv->revmask & sr) == 0)
|
|
- continue;
|
|
-
|
|
- if (srv->flags & SRFL_NOVAR)
|
|
- continue;
|
|
-
|
|
- w = srom[pb + srv->off];
|
|
- val = (w & srv->mask) >> mask_shift(srv->mask);
|
|
- width = mask_width(srv->mask);
|
|
-
|
|
- /* Cheating: no per-path var is more than
|
|
- * 1 word */
|
|
- if ((srv->flags & SRFL_NOFFS)
|
|
- && ((int)val == (1 << width) - 1))
|
|
- continue;
|
|
-
|
|
- entry =
|
|
- kzalloc(sizeof(struct brcms_srom_list_head),
|
|
- GFP_KERNEL);
|
|
- if (!entry)
|
|
- return -ENOMEM;
|
|
- entry->varid = srv->varid+p;
|
|
- entry->var_type = BRCMS_SROM_UNUMBER;
|
|
- entry->uval = val;
|
|
- list_add(&entry->var_list, var_list);
|
|
- }
|
|
- pb += psz;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * The crc check is done on a little-endian array, we need
|
|
- * to switch the bytes around before checking crc (and
|
|
- * then switch it back).
|
|
- */
|
|
-static int do_crc_check(u16 *buf, unsigned nwords)
|
|
-{
|
|
- u8 crc;
|
|
-
|
|
- cpu_to_le16_buf(buf, nwords);
|
|
- crc = crc8(brcms_srom_crc8_table, (void *)buf, nwords << 1, CRC8_INIT_VALUE);
|
|
- le16_to_cpu_buf(buf, nwords);
|
|
-
|
|
- return crc == CRC8_GOOD_VALUE(brcms_srom_crc8_table);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Read in and validate sprom.
|
|
- * Return 0 on success, nonzero on error.
|
|
- */
|
|
-static int
|
|
-sprom_read_pci(struct si_pub *sih, u16 *buf, uint nwords, bool check_crc)
|
|
-{
|
|
- int err = 0;
|
|
- uint i;
|
|
- struct bcma_device *core;
|
|
- uint sprom_offset;
|
|
-
|
|
- /* determine core to read */
|
|
- if (ai_get_ccrev(sih) < 32) {
|
|
- core = ai_findcore(sih, BCMA_CORE_80211, 0);
|
|
- sprom_offset = PCI_BAR0_SPROM_OFFSET;
|
|
- } else {
|
|
- core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
|
|
- sprom_offset = CHIPCREGOFFS(sromotp);
|
|
- }
|
|
-
|
|
- /* read the sprom */
|
|
- for (i = 0; i < nwords; i++)
|
|
- buf[i] = bcma_read16(core, sprom_offset+i*2);
|
|
-
|
|
- if (buf[0] == 0xffff)
|
|
- /*
|
|
- * The hardware thinks that an srom that starts with
|
|
- * 0xffff is blank, regardless of the rest of the
|
|
- * content, so declare it bad.
|
|
- */
|
|
- return -ENODATA;
|
|
-
|
|
- if (check_crc && !do_crc_check(buf, nwords))
|
|
- err = -EIO;
|
|
-
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int otp_read_pci(struct si_pub *sih, u16 *buf, uint nwords)
|
|
-{
|
|
- u8 *otp;
|
|
- uint sz = OTP_SZ_MAX / 2; /* size in words */
|
|
- int err = 0;
|
|
-
|
|
- otp = kzalloc(OTP_SZ_MAX, GFP_ATOMIC);
|
|
- if (otp == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- err = otp_read_region(sih, OTP_HW_RGN, (u16 *) otp, &sz);
|
|
-
|
|
- sz = min_t(uint, sz, nwords);
|
|
- memcpy(buf, otp, sz * 2);
|
|
-
|
|
- kfree(otp);
|
|
-
|
|
- /* Check CRC */
|
|
- if (buf[0] == 0xffff)
|
|
- /* The hardware thinks that an srom that starts with 0xffff
|
|
- * is blank, regardless of the rest of the content, so declare
|
|
- * it bad.
|
|
- */
|
|
- return -ENODATA;
|
|
-
|
|
- /* fixup the endianness so crc8 will pass */
|
|
- cpu_to_le16_buf(buf, sz);
|
|
- if (crc8(brcms_srom_crc8_table, (u8 *) buf, sz * 2,
|
|
- CRC8_INIT_VALUE) != CRC8_GOOD_VALUE(brcms_srom_crc8_table))
|
|
- err = -EIO;
|
|
- else
|
|
- /* now correct the endianness of the byte array */
|
|
- le16_to_cpu_buf(buf, sz);
|
|
-
|
|
- return err;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Initialize nonvolatile variable table from sprom.
|
|
- * Return 0 on success, nonzero on error.
|
|
- */
|
|
-int srom_var_init(struct si_pub *sih)
|
|
-{
|
|
- u16 *srom;
|
|
- u8 sromrev = 0;
|
|
- u32 sr;
|
|
- int err = 0;
|
|
-
|
|
- /*
|
|
- * Apply CRC over SROM content regardless SROM is present or not.
|
|
- */
|
|
- srom = kmalloc(SROM_MAX, GFP_ATOMIC);
|
|
- if (!srom)
|
|
- return -ENOMEM;
|
|
-
|
|
- crc8_populate_lsb(brcms_srom_crc8_table, SROM_CRC8_POLY);
|
|
- if (ai_is_sprom_available(sih)) {
|
|
- err = sprom_read_pci(sih, srom, SROM4_WORDS, true);
|
|
-
|
|
- if (err == 0)
|
|
- /* srom read and passed crc */
|
|
- /* top word of sprom contains version and crc8 */
|
|
- sromrev = srom[SROM4_CRCREV] & 0xff;
|
|
- } else {
|
|
- /* Use OTP if SPROM not available */
|
|
- err = otp_read_pci(sih, srom, SROM4_WORDS);
|
|
- if (err == 0)
|
|
- /* OTP only contain SROM rev8/rev9 for now */
|
|
- sromrev = srom[SROM4_CRCREV] & 0xff;
|
|
- }
|
|
-
|
|
- if (!err) {
|
|
- struct si_info *sii = (struct si_info *)sih;
|
|
-
|
|
- /* Bitmask for the sromrev */
|
|
- sr = 1 << sromrev;
|
|
-
|
|
- /*
|
|
- * srom version check: Current valid versions: 8, 9
|
|
- */
|
|
- if ((sr & 0x300) == 0) {
|
|
- err = -EINVAL;
|
|
- goto errout;
|
|
- }
|
|
-
|
|
- INIT_LIST_HEAD(&sii->var_list);
|
|
-
|
|
- /* parse SROM into name=value pairs. */
|
|
- err = _initvars_srom_pci(sromrev, srom, &sii->var_list);
|
|
- if (err)
|
|
- srom_free_vars(sih);
|
|
- }
|
|
-
|
|
-errout:
|
|
- kfree(srom);
|
|
- return err;
|
|
-}
|
|
-
|
|
-void srom_free_vars(struct si_pub *sih)
|
|
-{
|
|
- struct si_info *sii;
|
|
- struct brcms_srom_list_head *entry, *next;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
- list_for_each_entry_safe(entry, next, &sii->var_list, var_list) {
|
|
- list_del(&entry->var_list);
|
|
- kfree(entry);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * Search the name=value vars for a specific one and return its value.
|
|
- * Returns NULL if not found.
|
|
- */
|
|
-char *getvar(struct si_pub *sih, enum brcms_srom_id id)
|
|
-{
|
|
- struct si_info *sii;
|
|
- struct brcms_srom_list_head *entry;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
-
|
|
- list_for_each_entry(entry, &sii->var_list, var_list)
|
|
- if (entry->varid == id)
|
|
- return &entry->buf[0];
|
|
-
|
|
- /* nothing found */
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Search the vars for a specific one and return its value as
|
|
- * an integer. Returns 0 if not found.-
|
|
- */
|
|
-int getintvar(struct si_pub *sih, enum brcms_srom_id id)
|
|
-{
|
|
- struct si_info *sii;
|
|
- struct brcms_srom_list_head *entry;
|
|
- unsigned long res;
|
|
-
|
|
- sii = (struct si_info *)sih;
|
|
-
|
|
- list_for_each_entry(entry, &sii->var_list, var_list)
|
|
- if (entry->varid == id) {
|
|
- if (entry->var_type == BRCMS_SROM_SNUMBER ||
|
|
- entry->var_type == BRCMS_SROM_UNUMBER)
|
|
- return (int)entry->sval;
|
|
- else if (!kstrtoul(&entry->buf[0], 0, &res))
|
|
- return (int)res;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/srom.h
|
|
+++ /dev/null
|
|
@@ -1,29 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2010 Broadcom Corporation
|
|
- *
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
- */
|
|
-
|
|
-#ifndef _BRCM_SROM_H_
|
|
-#define _BRCM_SROM_H_
|
|
-
|
|
-#include "types.h"
|
|
-
|
|
-/* Prototypes */
|
|
-extern int srom_var_init(struct si_pub *sih);
|
|
-extern void srom_free_vars(struct si_pub *sih);
|
|
-
|
|
-extern int srom_read(struct si_pub *sih, uint bus, void *curmap,
|
|
- uint byteoff, uint nbytes, u16 *buf, bool check_crc);
|
|
-
|
|
-#endif /* _BRCM_SROM_H_ */
|
|
--- a/drivers/net/wireless/brcm80211/brcmsmac/stf.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmsmac/stf.c
|
|
@@ -370,9 +370,11 @@ void brcms_c_stf_phy_txant_upd(struct br
|
|
|
|
void brcms_c_stf_phy_chain_calc(struct brcms_c_info *wlc)
|
|
{
|
|
+ struct ssb_sprom *sprom = &wlc->hw->d11core->bus->sprom;
|
|
+
|
|
/* get available rx/tx chains */
|
|
- wlc->stf->hw_txchain = (u8) getintvar(wlc->hw->sih, BRCMS_SROM_TXCHAIN);
|
|
- wlc->stf->hw_rxchain = (u8) getintvar(wlc->hw->sih, BRCMS_SROM_RXCHAIN);
|
|
+ wlc->stf->hw_txchain = sprom->txchain;
|
|
+ wlc->stf->hw_rxchain = sprom->rxchain;
|
|
|
|
/* these parameter are intended to be used for all PHY types */
|
|
if (wlc->stf->hw_txchain == 0 || wlc->stf->hw_txchain == 0xf) {
|