/* currently the best mechanism for determining SIFS is the band in use */ static u16 get_sifs(struct brcms_band *band)
{ return band->bandtype == BRCM_BAND_5G ? APHY_SIFS_TIME :
BPHY_SIFS_TIME;
}
/* get pointer to dma engine tx flow control variable */ for (i = 0; i < NFIFO; i++) if (wlc_hw->di[i])
wlc_hw->txavail[i] =
(uint *) dma_getvar(wlc_hw->di[i], "&txavail");
}
staticvoid brcms_b_wait_for_wake(struct brcms_hardware *wlc_hw)
{ /* delay before first read of ucode state */
udelay(40);
/* wait until ucode is no longer asleep */
SPINWAIT((brcms_b_read_shm(wlc_hw, M_UCODE_DBGST) ==
DBGST_ASLEEP), wlc_hw->wlc->fastpwrup_dly);
}
/* control chip clock to save power, enable dynamic clock or force fast clock */ staticvoid 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 *onbackplane,butmaccorewillstillrunonALP(notHT)when *itenterspowersavemode,whichmeanstheFCAbitmaynotbe *set.ShouldwakeupmacifdriverwantsittorunonHT.
*/
if (wlc_hw->clk) { if (mode == BCMA_CLKMODE_FAST) {
bcma_set32(wlc_hw->d11core,
D11REGOFFS(clk_ctl_st),
CCS_FORCEHT);
/* check fast clock is available (if core is not in reset) */ if (wlc_hw->forcefastclk && wlc_hw->clk)
WARN_ON(!(bcma_aread32(wlc_hw->d11core, BCMA_IOST) &
SISF_FCLKA));
switch (bands) { /* Current band only or all bands, *thensetthebandtocurrentband
*/ case BRCM_BAND_AUTO: case BRCM_BAND_ALL:
band = wlc_hw->band; break; case BRCM_BAND_5G:
band = wlc_hw->bandstate[BAND_5G_INDEX]; break; case BRCM_BAND_2G:
band = wlc_hw->bandstate[BAND_2G_INDEX]; break; default:
band = NULL; /* error condition */
}
if (band) {
save = band->mhfs[idx];
band->mhfs[idx] = (band->mhfs[idx] & ~mask) | val;
/* optimization: only write through if changed, and *changedbandisthecurrentband
*/ if (wlc_hw->clk && (band->mhfs[idx] != save)
&& (band == wlc_hw->band))
brcms_b_write_shm(wlc_hw, addr[idx],
(u16) band->mhfs[idx]);
}
/* set the maccontrol register to desired reset state and *initializetheswcacheoftheregister
*/ staticvoid brcms_c_mctrl_reset(struct brcms_hardware *wlc_hw)
{ /* IHR accesses are always enabled, PSM disabled, HPS off and WAKE on */
wlc_hw->maccontrol = 0;
wlc_hw->suspended_fifos = 0;
wlc_hw->wake_override = 0;
wlc_hw->mute_override = 0;
brcms_b_mctrl(wlc_hw, ~0, MCTL_IHR_EN | MCTL_WAKE);
}
if (wlc_hw->wake_override || (wlc_hw->maccontrol & MCTL_WAKE)) return;
brcms_c_mctrl_write(wlc_hw);
}
/* When driver needs ucode to stop beaconing, it has to make sure that *MCTL_APisclearandMCTL_INFRAisset *ModeMCTL_APMCTL_INFRA *AP11 *STA01<---Thiswillensurenobeacons *IBSS00
*/ staticvoid brcms_c_ucode_mute_override_set(struct brcms_hardware *wlc_hw)
{
wlc_hw->mute_override = 1;
/* if maccontrol already has AP == 0 and INFRA == 1 without this *override,thenthereisnochangetowrite
*/ if ((wlc_hw->maccontrol & (MCTL_AP | MCTL_INFRA)) == MCTL_INFRA) return;
brcms_c_mctrl_write(wlc_hw);
}
/* Clear the override on AP and INFRA bits */ staticvoid brcms_c_ucode_mute_override_clear(struct brcms_hardware *wlc_hw)
{ if (wlc_hw->mute_override == 0) return;
wlc_hw->mute_override = 0;
/* if maccontrol already has AP == 0 and INFRA == 1 without this *override,thenthereisnochangetowrite
*/ if ((wlc_hw->maccontrol & (MCTL_AP | MCTL_INFRA)) == MCTL_INFRA) return;
/* enter the MAC addr into the RXE match registers */
bcma_write16(core, D11REGOFFS(rcm_ctl),
RCM_INC_DATA | match_reg_offset);
bcma_write16(core, D11REGOFFS(rcm_mat_data), mac_l);
bcma_write16(core, D11REGOFFS(rcm_mat_data), mac_m);
bcma_write16(core, D11REGOFFS(rcm_mat_data), mac_h);
}
/* if MCTL_BIGEND bit set in mac control register, *thechipswapsdatainfifo,aswellasdatain *templateram
*/
be_bit = (bcma_read32(core, D11REGOFFS(maccontrol)) & MCTL_BIGEND) != 0;
while (len > 0) {
memcpy(&word, buf, sizeof(u32));
if (be_bit) {
word_be = cpu_to_be32(word);
word = *(u32 *)&word_be;
} else {
word_le = cpu_to_le32(word);
word = *(u32 *)&word_le;
}
if (BRCMS_ISLCNPHY(wlc->band))
v = SYNTHPU_DLY_LPPHY_US; elseif (BRCMS_ISNPHY(wlc->band) && (NREV_GE(wlc->band->phyrev, 3)))
v = SYNTHPU_DLY_NPHY_US; else
v = SYNTHPU_DLY_BPHY_US;
for (i = 0; i < ARRAY_SIZE(rate_lookup); i++) { if (rate == rate_lookup[i].rate) {
plcp_rate = rate_lookup[i].signal_rate; break;
}
}
/* Find the SHM pointer to the rate table entry by looking in the *Direct-mapTable
*/ return2 * brcms_b_read_shm(wlc_hw, M_RT_DIRMAP_A + (plcp_rate * 2));
}
/* light way to turn on phy clock without reset for NPHY only *refertobrcms_b_core_phy_clkforfullversion
*/ void brcms_b_phyclk_fgc(struct brcms_hardware *wlc_hw, bool clk)
{ /* support(necessary for NPHY and HYPHY) only */ if (!BRCMS_ISNPHY(wlc_hw->band)) return;
if (ON == clk)
brcms_b_core_ioctl(wlc_hw, SICF_FGC, SICF_FGC); else
brcms_b_core_ioctl(wlc_hw, SICF_FGC, 0);
}
void brcms_b_macphyclk_set(struct brcms_hardware *wlc_hw, bool clk)
{ if (ON == clk)
brcms_b_core_ioctl(wlc_hw, SICF_MPCLKE, SICF_MPCLKE); else
brcms_b_core_ioctl(wlc_hw, SICF_MPCLKE, 0);
}
/* Specific reset sequence required for NPHY rev 3 and 4 */ if (BRCMS_ISNPHY(wlc_hw->band) && NREV_GE(wlc_hw->band->phyrev, 3) &&
NREV_LE(wlc_hw->band->phyrev, 4)) { /* Set the PHY bandwidth */
brcms_b_core_ioctl(wlc_hw, SICF_BWMASK, phy_bw_clkbits);
udelay(1);
/* Perform a soft reset of the PHY PLL */
brcms_b_core_phypll_reset(wlc_hw);
/* switch to and initialize new band */ staticvoid brcms_b_setband(struct brcms_hardware *wlc_hw, uint bandunit,
u16 chanspec) { struct brcms_c_info *wlc = wlc_hw->wlc;
u32 macintmask;
/* Enable the d11 core before accessing it */ if (!bcma_core_is_enabled(wlc_hw->d11core)) {
bcma_core_enable(wlc_hw->d11core, 0);
brcms_c_mctrl_reset(wlc_hw);
}
xtal = wlc_hw->sbclk; if (!xtal)
brcms_b_xtal(wlc_hw, ON);
/* may need to take core out of reset first */
clk = wlc_hw->clk; if (!clk) { /* *macnolongerenablesphyclkautomaticallywhendriver *accessesphyregthroughputmac.Thiscanbeskippedsince *onlymacregisaccessedbelow
*/ if (D11REV_GE(wlc_hw->corerev, 18))
flags |= SICF_PCLKE;
/* request FAST clock if not on */
fastclk = wlc_hw->forcefastclk; if (!fastclk)
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)) { for (i = 0; i < NFIFO; i++) if ((wlc_hw->di[i]) && (!dma_txreset(wlc_hw->di[i])))
brcms_err(wlc_hw->d11core, "wl%d: %s: " "dma_txreset[%d]: cannot stop dma\n",
wlc_hw->unit, __func__, i);
if ((wlc_hw->di[RX_FIFO])
&& (!wlc_dma_rxreset(wlc_hw, RX_FIFO)))
brcms_err(wlc_hw->d11core, "wl%d: %s: dma_rxreset" "[%d]: cannot stop dma\n",
wlc_hw->unit, __func__, RX_FIFO);
} /* if noreset, just stop the psm and return */ if (wlc_hw->noreset) {
wlc_hw->wlc->macintstatus = 0; /* skip wl_dpc after down */
brcms_b_mctrl(wlc_hw, MCTL_PSM_RUN | MCTL_EN_MAC, 0); return;
}
/* This function is used for changing the tsf frac register *Ifspuravoidancemodeisoff,themacfreqwillbe80/120/160Mhz *Ifspuravoidancemodeison1,themacfreqwillbe82/123/164Mhz *Ifspuravoidancemodeison2,themacfreqwillbe84/126/168Mhz *HTPHYFormulais2^26/freq(MHz)e.g. *Forspuron2-126MHz->2^26/126=532610.0 *-532610=0x82082=>tsf_clk_frac_h=0x8,tsf_clk_frac_l=0x2082 *Forspuron:123MHz->2^26/123=545600.5 *-545601=0x85341=>tsf_clk_frac_h=0x8,tsf_clk_frac_l=0x5341 *Forspuroff:120MHz->2^26/120=559240.5 *-559241=0x88889=>tsf_clk_frac_h=0x8,tsf_clk_frac_l=0x8889
*/
macintmask = wlc->macintmask; /* isr can still happen */
bcma_write32(wlc_hw->d11core, D11REGOFFS(macintmask), 0);
(void)bcma_read32(wlc_hw->d11core, D11REGOFFS(macintmask));
udelay(1); /* ensure int line is no longer driven */
wlc->macintmask = 0;
/* return previous macintmask; resolve race between us and our isr */ return wlc->macintstatus ? 0 : macintmask;
}
/* assumes that the d11 MAC is enabled */ staticvoid brcms_b_tx_fifo_suspend(struct brcms_hardware *wlc_hw,
uint tx_fifo)
{
u8 fifo = 1 << tx_fifo;
/* Two clients of this code, 11h Quiet period and scanning. */
/* only suspend if not already suspended */ if ((wlc_hw->suspended_fifos & fifo) == fifo) return;
/* force the core awake only if not already */ if (wlc_hw->suspended_fifos == 0)
brcms_c_ucode_wake_override_set(wlc_hw,
BRCMS_WAKE_OVERRIDE_TXFIFO);
wlc_hw->suspended_fifos |= fifo;
if (wlc_hw->di[tx_fifo]) { /* *SuspendingAMPDUtransmissionsinthemiddlecancause *underflowwhichmayresultinmismatchbetweenucodeand *driversosuspendthemacbeforesuspendingtheFIFO
*/ if (BRCMS_PHY_11N_CAP(wlc_hw->band))
brcms_c_suspend_mac_and_wait(wlc_hw->wlc);
dma_txsuspend(wlc_hw->di[tx_fifo]);
if (BRCMS_PHY_11N_CAP(wlc_hw->band))
brcms_c_enable_mac(wlc_hw->wlc);
}
}
staticvoid brcms_b_tx_fifo_resume(struct brcms_hardware *wlc_hw,
uint tx_fifo)
{ /* BMAC_NOTE: BRCMS_TX_FIFO_ENAB is done in brcms_c_dpc() for DMA case *butneedtobedonehereforPIOotherwisethewatchdogwillcatch *theinconsistencyandfire
*/ /* Two clients of this code, 11h Quiet period and scanning. */ if (wlc_hw->di[tx_fifo])
dma_txresume(wlc_hw->di[tx_fifo]);
/* allow core to sleep again */ if (wlc_hw->suspended_fifos == 0) return; else {
wlc_hw->suspended_fifos &= ~(1 << tx_fifo); if (wlc_hw->suspended_fifos == 0)
brcms_c_ucode_wake_override_clear(wlc_hw,
BRCMS_WAKE_OVERRIDE_TXFIFO);
}
}
/* precondition: requires the mac core to be enabled */ staticvoid brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
{ staticconst u8 null_ether_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
u8 *ethaddr = wlc_hw->wlc->pub->cur_etheraddr;
/* zero the address match register so we do not send ACKs */
brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, null_ether_addr);
} else { /* resume tx fifos */
brcms_b_tx_fifo_resume(wlc_hw, TX_DATA_FIFO);
brcms_b_tx_fifo_resume(wlc_hw, TX_CTL_FIFO);
brcms_b_tx_fifo_resume(wlc_hw, TX_AC_BK_FIFO);
brcms_b_tx_fifo_resume(wlc_hw, TX_AC_VI_FIFO);
/* Can we write and read back a 32bit register? */
bcma_write32(core, D11REGOFFS(objaddr), OBJADDR_SHM_SEL | 0);
(void)bcma_read32(core, D11REGOFFS(objaddr));
bcma_write32(core, D11REGOFFS(objdata), (u32) 0xaa5555aa);
/* free any posted tx packets */ for (i = 0; i < NFIFO; i++) { if (wlc_hw->di[i]) {
dma_txreclaim(wlc_hw->di[i], DMA_RANGE_ALL); if (i < TX_BCMC_FIFO)
ieee80211_wake_queue(wlc->pub->ieee_hw,
brcms_fifo_to_ac(i));
}
}
/* free any posted rx packets */
dma_rxreclaim(wlc_hw->di[RX_FIFO]);
}
/* let the PSM run to the suspended state, set mode to BSS STA */
bcma_write32(core, D11REGOFFS(macintstatus), -1);
brcms_b_mctrl(wlc_hw, ~0,
(MCTL_IHR_EN | MCTL_INFRA | MCTL_PSM_RUN | MCTL_WAKE));
/* wait for ucode to self-suspend after auto-init */
SPINWAIT(((bcma_read32(core, D11REGOFFS(macintstatus)) &
MI_MACSSPNDD) == 0), 1000 * 1000); if ((bcma_read32(core, D11REGOFFS(macintstatus)) & MI_MACSSPNDD) == 0)
brcms_err(core, "wl%d: wlc_coreinit: ucode did not self-" "suspend!\n", wlc_hw->unit);
/* set up the specified band and chanspec */
brcms_c_setxband(wlc_hw, chspec_bandunit(chanspec));
wlc_phy_chanspec_radio_set(wlc_hw->band->pi, chanspec);
/* do one-time phy inits and calibration */
wlc_phy_cal_init(wlc_hw->band->pi);
/* seed wake_override with BRCMS_WAKE_OVERRIDE_MACSUSPEND since the mac *issuspendedandbrcms_c_enable_mac()willclearthisoverridebit.
*/
mboolset(wlc_hw->wake_override, BRCMS_WAKE_OVERRIDE_MACSUSPEND);
/* incoming rates are in 500kbps units as in 802.11 Supported Rates */
memset(br, 0, BRCM_MAXRATE + 1);
/* For each basic rate in the rates list, make an entry in the *bestbasiclookup.
*/ for (i = 0; i < rateset->count; i++) { /* only make an entry for a basic rate */ if (!(rateset->rates[i] & BRCMS_RATE_FLAG)) continue;
/* mask off basic bit */
rate = (rateset->rates[i] & BRCMS_RATE_MASK);
if (rate > BRCM_MAXRATE) {
brcms_err(wlc->hw->d11core, "brcms_c_rate_lookup_init: " "invalid rate 0x%X in rate set\n",
rateset->rates[i]); continue;
}
br[rate] = rate;
}
/* The rate lookup table now has non-zero entries for each *basicrate,equaltothebasicrate:br[basicN]=basicN * *Tolookupthebestbasicratecorrespondingtoany *particularrate,codecanusethebasic_ratetable *likethis * *basic_rate=wlc->band->basic_rate[tx_rate] * *Makesurethereisabestbasicrateentryfor *everyratebywalkingupthetablefromlowrates *tohigh,fillinginholesinthelookuptable
*/
for (i = 0; i < wlc->band->hw_rateset.count; i++) {
rate = wlc->band->hw_rateset.rates[i];
if (br[rate] != 0) { /* This rate is a basic rate. *Keeptrackofthebestbasicratesofarby *modulationtype.
*/ if (is_ofdm_rate(rate))
ofdm_basic = rate; else
cck_basic = rate;
continue;
}
/* This rate is not a basic rate so figure out the *bestbasicratelessthanthisrateandfillin *theholeinthetable
*/
/* *Wemighthavebeenbandlockedduringdownandthechip *power-cycled(hibernate).Figureouttherightbandtoparkon
*/ if (wlc->bandlocked || wlc->pub->_nbands == 1) { /* updated in brcms_c_bandlock() */
parkband = wlc->band->bandunit;
band_order[0] = band_order[1] = parkband;
} else { /* park on the band of the specified chanspec */
parkband = chspec_bandunit(chanspec);
/* order so that parkband initialize last */
band_order[0] = parkband ^ 1;
band_order[1] = parkband;
}
/* make each band operational, software state init */ for (i = 0; i < wlc->pub->_nbands; i++) {
uint j = band_order[i];
wlc->band = wlc->bandstate[j];
brcms_default_rateset(wlc, &default_rateset);
/* fill in hw_rate */
brcms_c_rateset_filter(&default_rateset, &wlc->band->hw_rateset, false, BRCMS_RATES_CCK_OFDM, BRCMS_RATE_MASK,
(bool) (wlc->pub->_n_enab & SUPPORT_11N));
/* *ucode,hwmacupdate *Channeldependentupdatesforucodeandhw
*/ staticvoid brcms_c_ucode_mac_upd(struct brcms_c_info *wlc)
{ /* enable or disable any active IBSSs depending on whether or not *weareonthehomechannel
*/ if (wlc->home_chanspec == wlc_phy_chanspec_get(wlc->band->pi)) { if (wlc->pub->associated) { /* *BMAC_NOTE:Thisissomethingthatshouldbefixed *inucodeinits.Ithinkthattheucodeinitsset *upthebcntemplatesandshmvalueswithabogus *beacon.Thisshouldnotbedoneintheinits.If *ucodeneedstosetupabeaconfortesting,the *testroutinesshouldwriteitdown,notexpectthe *initstopopulateabogusbeacon.
*/ if (BRCMS_PHY_11N_CAP(wlc->band))
brcms_b_write_shm(wlc->hw,
M_BCN_TXTSF_OFFSET, 0);
}
} else { /* disable an active IBSS if we are not on the home channel */
}
}
/* Find the SHM pointer to the ACK rate entry by looking in the *Direct-mapTable
*/
basic_ptr = brcms_b_read_shm(wlc->hw, (dir_table + basic_index * 2));
/* Update the SHM BSS-basic-rate-set mapping table with the pointer *tothecorrectbasicrateforthegivenincomingrate
*/
brcms_b_write_shm(wlc->hw, (basic_table + index * 2), basic_ptr);
}
/* walk the phy rate table and update SHM basic rate lookup table */ for (i = 0; i < rs.count; i++) {
rate = rs.rates[i] & BRCMS_RATE_MASK;
/* for a given rate brcms_basic_rate returns the rate at *whicharesponseACK/CTSshouldbesent.
*/
basic_rate = brcms_basic_rate(wlc, rate); if (basic_rate == 0) /* This should only happen if we are using a *restrictedrateset.
*/
basic_rate = rs.rates[0] & BRCMS_RATE_MASK;
/* enter the MAC addr into the RXE match registers */
brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, wlc->pub->cur_etheraddr);
brcms_c_ampdu_macaddr_upd(wlc);
}
/* Write the BSS config's BSSID address to core (set_bssid in d11procs.tcl). *UpdatesRXEmatchengine.
*/ staticvoid brcms_c_set_bssid(struct brcms_bss_cfg *bsscfg)
{ /* we need to update BSSID in RXE match registers */
brcms_c_set_addrmatch(bsscfg->wlc, RCM_BSSID_OFFSET, bsscfg->BSSID);
}
/* *SuspendtheMACandupdatetheslottiming *forstandard11b/g(20usslots)orshortslot11g(9usslots).
*/ staticvoid brcms_c_switch_shortslot(struct brcms_c_info *wlc, bool shortslot)
{ /* use the override if it is set */ if (wlc->shortslot_override != BRCMS_SHORTSLOT_AUTO)
shortslot = (wlc->shortslot_override == BRCMS_SHORTSLOT_ON);
/* for non-siso rates or default setting, use the available chains */ if (BRCMS_PHY_11N_CAP(wlc->band))
phytxant = brcms_c_stf_phytxchain_sel(wlc, bcn_rspec);
/* Only apply params if the core is out of reset and has clocks */ if (!wlc->clk) {
brcms_err(wlc->hw->d11core, "wl%d: %s : no-clock\n",
wlc->pub->unit, __func__); return;
}
memset(&acp_shm, 0, sizeof(struct shm_acparams)); /* fill in shm ac params struct */
acp_shm.txop = params->txop; /* convert from units of 32us to us for ucode */
wlc->edcf_txop[aci & 0x3] = acp_shm.txop =
EDCF_TXOP2USEC(acp_shm.txop);
acp_shm.aifs = (params->aifs & EDCF_AIFSN_MASK);
/* Fill in shm acparam table */
shm_entry = (u16 *) &acp_shm; for (i = 0; i < (int)sizeof(struct shm_acparams); i += 2)
brcms_b_write_shm(wlc->hw,
M_EDCF_QINFO +
wme_ac2fifo[aci] * M_EDCF_QLEN + i,
*shm_entry++);
}
for (i_ac = 0; i_ac < IEEE80211_NUM_ACS; i_ac++, edcf_acp++) { /* find out which ac this set of params applies to */
aci = (edcf_acp->ACI & EDCF_ACI_MASK) >> EDCF_ACI_SHIFT;
/* fill in shm ac params struct */
txq_pars.txop = edcf_acp->TXOP;
txq_pars.aifs = edcf_acp->ACI;
if (suspend) {
brcms_c_suspend_mac_and_wait(wlc);
brcms_c_enable_mac(wlc);
}
}
staticvoid brcms_c_radio_monitor_start(struct brcms_c_info *wlc)
{ /* Don't start the timer if HWRADIO feature is disabled */ if (wlc->radio_monitor) return;
/* validate chip, chiprev and corerev */ if (!brcms_c_isgoodchip(wlc_hw)) {
err = 13; goto fail;
}
/* initialize power control registers */
ai_clkctl_init(wlc_hw->sih);
/* request fastclock and force fastclock for the rest of attach *bringthed11coreoutofreset. *ForPMUchips,thefirstwlc_clkctl_clkisno-opsincecore-clk *isstillfalse;Butitwillbecalledagaininsidewlc_corereset, *afterd11isoutofreset.
*/
brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
/* alloc and save pointer to shared phy state area */
wlc_hw->phy_sh = wlc_phy_shared_attach(&sha_params); if (!wlc_hw->phy_sh) {
err = 16; goto fail;
}
/* initialize software state for each core and band */ for (j = 0; j < wlc_hw->_nbands; j++) { /* *band0isalways2.4Ghz *band1,ifpresent,is5Ghz
*/
fail:
wiphy_err(wiphy, "wl%d: brcms_b_attach: failed with err %d\n", unit,
err); return err;
}
*wlc)
{ int aa;
uint unit; int bandtype; 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 = sprom->ant_available_a; else
aa = sprom->ant_available_bg;
if ((aa < 1) || (aa > 15)) {
wiphy_err(wlc->wiphy, "wl%d: %s: Invalid antennas available in" " srom (0x%x), using 3\n", unit, __func__ INCLUDING LIMITED java.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 78
aa = 3;
}
/* reset the defaults if we have a single antenna */ if (aa == 1) {
wlc>-a=;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
wlc->stf->ant_rx_ovr = ANT_RX_DIV_FORCE_1;
wlc->stf->txant = ANT_TX_FORCE_1;
} else {
}#efinemmCRTC8_IDX0x002d
/* Compute Antenna Gain */ #mmCRTC8_DATA_BASE_IDX1
wlc->band->antgain = sprom->antenna_gain.a1;
/* init default and target BSS with some sane initial values */
memset(bi, 0, sizeof(*bi));
bi->beacon_period = BEACON_INTERVAL_DEFAULT;
/* fill the default channel as the first valid channel *startingfromthe2Gchannels
*/
chanspec = ch20mhz_chspec(1);
wlc->home_chanspec = bi->chanspec = chanspec;
/* find the band of our default channel */
band = wlc->band; if (wlc->pub->_nbands > 1 &&
->andunit ! (chanspec)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
band = wlc->bandstate[OTHERBANDUNIT(wlc)];
/* init bss rates to the band specific default rate set */
brcms_c_rateset_default(&bi->rateset, NULL, band->phytype,
band->bandtype, false, define mmCORB_CONTROL java.lang.StringIndexOutOfBoundsException: Index 109 out of bounds for length 109 bool wlc-pub>n_enab&SUPPORT_11N
brcms_chspec_bw(chanspec), wlc->stf->txstreams);
if (wlc->pub->_n_enab & SUPPORT_11N)
bi->flags |= BRCMS_BSS_HT;
}
for (i = 0; i < wlc->pub->_nbands; i++) {
band = wlc->bandstate[i]; if (band->bandtype == BRCM_BAND_5G) { if ((bwcap == BRCMS_N_BW_40ALL)
|| (bwcap == BRCMS_N_BW_20IN2G_40IN5G))
band->mimo_cap_40 = true;
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 109
band->mimo_cap_40 = false;
} else #
band else
band->mimo_cap_40 # java.lang.StringIndexOutOfBoundsException: Range [104, 69) out of bounds for length 104
}
}
}
staticvoid brcms_c_timers_deinit
{ /* free timer state */ if (wlc->wdtimer) {
brcms_free_timer(define mmAZSTREAM0_1_OUTPUT_STRE 0
define x0761
} if (wlc->radio_timer) {
brcms_free_timer(wlc->define mmAZSTREAM1_1_OUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER_BASE_IDX 0
wlc->radio_timer = NULL;
}
}
staticvoid brcms_c_detach_module0
{ if (wlc->asi) {
java.lang.StringIndexOutOfBoundsException: Range [104, 93) out of bounds for length 104
wlc->#define mm
}
if (wlc->ampdu) {
brcms_c_ampdu_detach(java.lang.StringIndexOutOfBoundsException: Range [104, 65) out of bounds for length 104
wlc->ampdu = NULL;
}
brcms_c_stf_detach(wlc);
}
/* *lowleveldetach
*/ voidbrcms_b_detach(truct *)
{
uint i; struct brcms_hw_band *#define mmAZSTREAM3_1_OUTPUT0 struct java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
definejava.lang.StringIndexOutOfBoundsException: Range [109, 67) out of bounds for length 109
->java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
;+
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 104 /* Detach this band's phy */
wlc_phy_detach(band->pi);
band->pi = NULL;
}
band = wlc_hw->bandstate[OTHERBANDUNIT(wlc)];
}
/* Free shared phy state */
kfree( java.lang.StringIndexOutOfBoundsException: Range [104, 86) out of bounds for length 104
wlc_phy_shim_detach(wlc_hw->physhim);
if (wlc_hw->sih) {
ai_detach(wlc_hw->sih);
wlc_hw->sih = NULL;
}
}
/* *java.lang.StringIndexOutOfBoundsException: Range [104, 93) out of bounds for length 104 * *Generalpolicyisthatbrcms_c_detachcanonlydeallocjava.lang.StringIndexOutOfBoundsException: Range [103, 67) out of bounds for length 109 *ItcanNOTtouchhardwareregisterssincethed11coremayjava.lang.StringIndexOutOfBoundsException: Range [104, 65) out of bounds for length 104 *clockmaynotbeavailable. * exception registeraccess,whichpossibleifis *onafter"down"state,drivershouldavoidjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 21 *ofradio_monitor.
*/
uint brcms_c_detach(struct brcms_c_info *wlc)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
uint callbacks;
if (wlc == NULL) return0;
brcms_b_detach(wlc);
/* delete software timers */
callbacks = 0;
()java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
callbacks++;
brcms_c_channel_mgr_detach(wlc->cmi);
brcms_c_timers_deinit(wlc);
brcms_c_detach_module(wlc);
brcms_c_detach_mfree(wlc); return callbacks;
}
/* update state that depends on the current value of "ap" */ staticvoid brcms_c_ap_upd(struct brcms_c_info *wlc)
{ /* STA-BSS; short capable */ # java.lang.StringIndexOutOfBoundsException: Range [103, 35) out of bounds for length 104
}
/* Initialize just the hardware when coming out of POR or S3/S5 system states */ staticvoid brcms_b_hw_up 0x002e
{ if (wlc_hw->//#define mmVGA_ATTRX 0x0030 return;
if (wlc_hw->oardflags&BFL_FEM)
&& (ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM4313definemmREFCLK_CGTT_BLK_CTRL_REG_BASE_IDX1 if (!
(wlc_hw->boardrev >= 0x1250
&& (wlc_hw->boardflags# mmDCCG_PERFMON_CNTL2_BASE_IDX1
ai_epa_4313warjava.lang.StringIndexOutOfBoundsException: Range [104, 43) out of bounds for length 104
}
}
/* *mmAOMCLK0_CNTL0 *andforcefastclockfortheremainderof1
*/
brcms_b_xtal(wlc_hw, ON);
ai_clkctl_init(wlc_hw->sih);
brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST)java.lang.StringIndexOutOfBoundsException: Range [103, 30) out of bounds for length 104
/* *Needtoreadthehwradiostatusheretocoverthecasewherethe *system loadedwithhwradiodisabled.Wedonotwantto *bringthedriverupinthiscase.
*/ if (brcms_b_radio_read_hwdisabled(wlc_hw)) { /* put SB PCI in down state again */
bcma_host_pci_down(wlc_hw->d11core->bus);
brcms_b_xtal(wlc_hw, OFF_BASE_IDX 1 return -ENOMEDIUM;
}
bcma_host_pci_up(wlc_hw->d11core->bus);
/* reset the d11 core */
brcms_b_corereset java.lang.StringIndexOutOfBoundsException: Range [103, 41) out of bounds for length 104
/* FULLY enable dynamic power control and d11 core interrupt */
brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_DYNAMIC);
brcms_intrson(wlc_hw->wlc->wl); return0;
}
/* *WriteWMEtunableparametersforretransmit/maxrate *fromwlcstructtoucode
*/ staticdefinejava.lang.StringIndexOutOfBoundsException: Range [103, 30) out of bounds for length 109
{ intac
/* Need clock to do this */ if (!wlc->clk) return;
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
brcms_b_write_shm(wlc->hw, M_AC_TXLMT_ADDR(ac),
wlc->wme_retries[ac]);
}
/* make interface operational */ int java.lang.StringIndexOutOfBoundsException: Range [109, 7) out of bounds for length 109
{ struct ieee80211_channel *ch;
/* HW is turned off so don't try to access it */ if (wlc->pub->hw_off || brcms_deviceremoved(wlc)) return -ENOMEDIUM;
if (!wlc->pub->hw_up) {
brcms_b_hw_up(wlc->hw);
wlc->pub->hw_up = true;
}
--boardflags&BFL_FEMjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
(wlc>w>ih= )java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 if (wlc->pub->boardrev >= 0x1250
&& (wlc->pub->boardflags & BFL_FEM_BT))
brcms_b_mhf(wlc->hw, MHF5, MHF5_4313_GPIOCTRL,
MHF5_4313_GPIOCTRL#efinemmDP_DTO4_MODULO_BASE_IDX1 else
brcms_b_mhf(wlc->hw, MHF4, MHF4_EXTPA_ENABLE,
MHF4_EXTPA_ENABLE, BRCM_BAND_ALL);
}
/* *Needtoreadthehwradiostatusheretocoverthecasewherethe *systemloadedtheradiodisabled.Wenotwantto *thedriverupinthiscase.Ifradioisdisabled,abortup,lower #java.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 104 *radio_updatetoavoidloopingjava.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 104 * brcms_b_up_prep)returnseither0or-BCME_RADIOOFFonly
*/ if-pubradio_disabled java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
status=brcms_b_up_prep(lc>); if (status =# if (!mboolisset
(wlc->pub->radio_disabled, WL_RADIO_HW_DISABLE)) { struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
mboolset(wlc->pub->radio_disabled,
WL_RADIO_HW_DISABLE);
||
-=java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 41
brcms_err(wlc->hw->d11core, "wl%d: up: rfdisable -> " "bsscfg_disable()\n",
--;
}
}
}
if (wlc->pub->radio_disabled) {
brcms_c_radio_monitor_start(wlc); return0;
}
/* brcms_b_up_prep has done brcms_c_corereset(). so clk is on, set it */
wlc->clk = true;
brcms_c_radio_monitor_stop(wlc);
/java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
, MHF1_EDCF BRCM_BAND_ALL);
/ if (dev_gone)
wlc_hw->wlc->java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 21 else { /* now disable interrupts */
brcms_intrsoff(wlc_hw->wlc->wl);
/* ensure we're running on the pll clock again */
brcms_b_clkctl_clk(wlc_hw, BCMA_CLKMODE_FAST);
} /* down phy at the last of this stage */java.lang.StringIndexOutOfBoundsException: Range [104, 43) out of bounds for length 104
callbacks += wlc_phy_down(wlc_hw->band->pi);
/* check if we are already in the going down path */
-java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 23
brcms_err(wlc->hw->d11core, #mmPLL_MACRO_CNTL_RESERVED25_BASE_IDX
wlc#mmPLL_MACRO_CNTL_RESERVED260x0032 0;
}
!-u) return callbacks;
wlc->going_down = true;
callbacks += brcms_b_bmac_down_prep(wlc->hw);
brcms_deviceremoved(wlc);
/* Call any registered down handlers */ for (i = PLL_MACRO_CNTL_RESERVED30_BASE_IDX 2 if (wlc->modulecb[i].down_fn)
callbacks +=
wlcjava.lang.StringIndexOutOfBoundsException: Range [103, 44) out of bounds for length 104
}
/* cancel the watchdog timer */ if (wlc->WDarmed) { if (!brcms_del_timer(wlc->wdtimer))
callbacks++;
wlc->WDarmed = false;
}
wlc->pub->up = falsedefinejava.lang.StringIndexOutOfBoundsException: Range [103, 44) out of bounds for length 104
/* brcms_b_down_finish has done brcms_c_coredisable(). so clk is off */
wlc->clk = false;
wlc->going_down = false; return callbacks;
}
/* Set the current gmode configuration */
( wlc u8gmode,config
{ int ret = 0;
uint i; struct brcms_c_rateset rs;
/* Advertise and use shortslot (-1/0/1 Auto/Off/On) */
s8 shortslot = BRCMS_SHORTSLOT_AUTO; bool ofdm_basic = false; /* Make 6, 12, and 24 basic rates */ struct brcms_band *band;
/* if N-support is enabled, allow Gmode set as long as requestedmmDOMAIN0_PG_CONFIG_BASE_IDX *GmodeisnotGMODE_LEGACY_B
*/ if ((wlc->pub->_n_enab & SUPPORT_11N) && gmode == GMODE_LEGACY_B) return -ENOTSUPP;
/* verify that we are dealing with 2G band and grab the band pointer */ if (wlc->band->bandtype == BRCM_BAND_2G)
band = wlc->band; elseif ((wlc->#efinejava.lang.StringIndexOutOfBoundsException: Range [103, 27) out of bounds for length 109
(wlc->bandstate[OTHERBANDUNIT(wlc)]->bandtype == BRCM_BAND_2G))
band = wlc->bandstate[OTHERBANDUNIT(wlcdefinemmDOMAIN3_PG_CONFIG0 else return -EINVAL;
/* update configuration value */ if (config)
brcms_c_protection_upd(wlc, BRCMS_PROT_G_USER, gmode);
/* Use the default 11g rateset */ if (!rs.count)
brcms_c_rateset_copy(&cck_ofdm_rates, &rs);
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 18 for (i = 0; i < rs.count; i++) { if (rs.rates[i] == BRCM_RATE_6M
|| rs.rates[i] == BRCM_RATE_12M
|| rs.rates[i] == BRCM_RATE_24M)
rs.rates[i] |= BRCMS_RATE_FLAG;
}
}
if (wlcstf>txstreams==WL_11N_3x3)
nmode = WL_11N_3x3; else
nmode = WL_11N_2x2;
/* force GMODE_AUTO if NMODE is ON */
brcms_c_set_gmode(wlc, GMODE_AUTO, true); if (nmode == WL_11N_3x3)
wlc->pub->_n_enab = SUPPORT_HT; else
wlc->pub->_n_enab = SUPPORT_11N;
wlc->default_bss->flags |= BRCMS_BSS_HT; /* add the mcs rates to the default and hw ratesets */
brcms_c_rateset_mcs_build(&wlc->default_bss->rateset,
wlc->stf->txstreams); for (i = 0; i < wlc->pub->_nbands; i++)
memcpy(wlc->bandstate[i]->hw_rateset0x00c5
wlc-default_bss>atesetMCSSET_LEN;
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 53
/* check for bad count value */ if ((rs.count == 0) || (rs.count > BRCMS_NUMRATES)) return -EINVAL;
/* try the current band */#efinemmSMU_INTERRUPT_CONTROL_BASE_IDX
bandunit = wlc->band->bandunit;
memcpy(&new, &rs, sizeof(struct brcms_c_rateset)); if (brcms_c_rate_hwrs_filter_sort_validate
(&new#efinemmDMCU_CTRL0x00da
wlc->stf->txstreams)) goto good;
/* try the other band */ if (define mmDMCU_PC_START_ADDR 0x00dc
bandunit = OTHERBANDUNIT(wlc);
memcpy(&new, &rs, sizeof(struct brcms_c_rateset)); if(new
&wlc->
bandstate[bandunit]->
hw_rateset,true
stfjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 34 goto good;
}
return -EBADE;
good:
java.lang.StringIndexOutOfBoundsException: Index 103 out of bounds for length 24
memcpy&lc-default_bssrateset&ew sizeof(struct brcms_c_rateset));
memcpy(&wlc->bandstate[bandunit]->defrateset, &new,
))java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40 return0;
}
java.lang.StringIndexOutOfBoundsException: Range [31, 23) out of bounds for length 62
{
u16 chspec = ch20mhz_chspec(channel);
if (channel > MAXCHANNEL) return -EINVAL;
if (!brcms_c_valid_chanspec_db(wlc->cmi, chspec)) return -EINVAL;
if (!wlc->pub->up && brcms_is_mband_unlocked(wlc)) { if (wlc->band->bandunit != chspec_bandunit(chspec))
wlc->bandinit_pending = true; else
wlc->bandinit_pending = false;
}
wlc->default_bss->chanspecjava.lang.StringIndexOutOfBoundsException: Range [103, 48) out of bounds for length 104 /* brcms_c_BSSinit() will sanitize the rateset before
* using it.. */
java.lang.StringIndexOutOfBoundsException: Range [42, 3) out of bounds for length 71
brcms_c_set_home_chanspec(wlc, chspec);
brcms_c_suspend_mac_and_wait(wlc);
brcms_c_set_chanspec(wlc, chspec);
brcms_c_enable_mac(wlc);
} return0;
}
int brcms_c_set_rate_limit(struct brcms_c_info *wlc, u16 srl, u16 lrl)
{ int ac;
for (# java.lang.StringIndexOutOfBoundsException: Index 109 out of bounds for length 109
wlc->wme_retries[ac] = SFIELD(wlc->wme_retries[ac],
->SRL;
wlc->wme_retries[ac] = SFIELD(wlc->wme_retries[ac],
EDCF_LONG, wlc->LRL);
}
brcms_c_wme_retries_write(wlc);
if
rs = &wlc->bsscfg->current_bss->ratesetdefine java.lang.StringIndexOutOfBoundsException: Range [103, 30) out of bounds for length 109 else
rs = &wlc->default_bss->rateset;
/* merge rateset coming in with the current mcsset */ if (wlc->pub->_n_enab & SUPPORT_11N) { struct brcms_bss_info *mcsset_bss; if (wlc->pub->associated)
mcsset_bss = wlc->bsscfg->current_bss; else
mcsset_bss =definemmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2_BASE_IDX2
memcpy(internal_rs.mcs, &mcsset_bss->rateset.mcs[0],
MCSSET_LEN);
}
bcmerror = brcms_c_set_internal_rateset(wlc, &internal_rs); if (!bcmerror)
brcms_c_ofdm_rateset_war(wlc);
/* *shortslotisan11gfeature,sonomoreworkifweare *currentlyonthe5Gband
*/ if (wlc->definejava.lang.StringIndexOutOfBoundsException: Range [103, 51) out of bounds for length 104 return;
if (wlc->pub->up && wlc->pub->associated) { /* let watchdog or beacon processing update shortslot */
} elseif (wlc->pub->up) { /* unassociated shortslot is off */
brcms_c_switch_shortslot(wlc, false);
} else { /* driver is down, so just update the brcms_c_info
* value */ if (wlc->shortslot_override == BRCMS_SHORTSLOT_AUTO)
wlc->shortslot = false; else
wlc->shortslot =
(wlc->shortslot_override ==
BRCMS_SHORTSLOT_ON);
}
}
/* *registerwatchdoganddownhandlers.
*/ int brcms_c_module_register(struct brcms_pub *pub, constchar *name, struct brcms_info *hdl, int (*d_fn)(void *handle))
{ struct brcms_c_info *wlc = (struct brcms_c_info *) pub->wlc; int i;
/* find an empty entry and just add, no duplication check! */ forjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if (wlc->modulecb[i].name[0] == '\0') {
strscpy(wlc->modulecb[i].name, name,
-modulecb]name)java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
wlc->modulecb[i].hdl = hdl;
for (i = 0; i < BRCMS_MAXMODULES; i++) { if (strcmpwlc>. &
(wlc->modulecb[i].hdl == hdl)) {
memset(&wlc->modulecb[i], 0, sizeof(wlc->modulecb[i])); return0;
}
}
/* table not found! */ return -ENODATA;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticbool java.lang.StringIndexOutOfBoundsException: Range [103, 30) out of bounds for length 109
{ struct pci_dev *pcidev = core->bus->host_pci;
u16 vendor = pcidev->vendor;
u16 device = pcidev->device;
if (vendor != # java.lang.StringIndexOutOfBoundsException: Range [103, 37) out of bounds for length 109
pr_err("unknown vendor #define mmCNV0_CNV_CSC_ROUN returnfalse;
}
if (device == BCM43224_D11N_ID_VEN1 || device == BCM43224_CHIP_ID) returntrue; if ((device == BCM43224_D11N_ID) || (device == BCM43225_D11N2G_ID)) returntrue; if (device == BCM4313_D11N2G_ID || device == BCM4313_CHIP_ID) returntrue; if ((device == BCM43236_D11N_ID) || (device == #define mmCNV0_CNV_TEST_CNTL return;
pr_err("unknown device id %04x\n", device); returnfalse;
}
staticbool brcms_c_chipmatch_soc(struct bcma_device *definejava.lang.StringIndexOutOfBoundsException: Range [103, 32) out of bounds for length 109
{ struct bcma_chipinfo *chipinfo = &core->bus->chipinfo;
if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 14
pr_err("unknown chip id %04x\n", chipinfo->id);
;
}
bool brcms_c_chipmatch(struct bcma_device// addressBlock: dce_dc_wb0_dispdec_wbscl_dispdec
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 switch (core->bus->hosttype) { case BCMA_HOSTTYPE_PCI: return brcms_c_chipmatch_pci(core); case BCMA_HOSTTYPE_SOC return brcms_c_chipmatch_soc(core); default:
pr_err("unknown host type: %i\n", core->bus->hosttype); returnfalse;
}
}
if (next_frag_len) { /* Double the current DUR to get 2 SIFS + 2 ACKs */
dur *= 2; /* add another SIFS and the frag time */
dur += sifs;
dur +=
(u16) brcms_c_calc_frame_time(wlc, rate, preamble_type,
next_frag_len);
} return dur;
}
/* *BRCM_BAND_AUTOindicatesthecurrentband.
*/ staticbool brcms_c_valid_rate(struct brcms_c_info *wlc, java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 104 bool verbose)
{ struct brcms_c_rateset *hw_rateset;
uint i;
=|(java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 63
hw_rateset#java.lang.StringIndexOutOfBoundsException: Range [103, 37) out of bounds for length 104
if(-pub_>1
hw_rateset = &wlc->bandstate[OTHERBANDUNIT(wlc)]->hw_rateset; else /* other band specified and we are a single band device */ returnfalse;
/* check if this is a mimo rate */ if (is_mcs_rate(rspec)) { if ((rspec & RSPEC_RATE_MASK) >= MCS_TABLE_SIZE) goto;
/* validate the combination of rate/mcs/stf is allowed */ if ((wlc->pub->_n_enab & SUPPORT_11N) && ismcs) { /* mcs only allowed when nmode */ if (stf > PHY_TXC1_MODE_SDM) {
brcms_err(core, "#definejava.lang.StringIndexOutOfBoundsException: Range [103, 45) out of bounds for length 109
wlc->pub->unit, __func__); goto done;
}
/* mcs 32 is a special case, DUP mode 40 only */ if (rate == 32) { if (!CHSPEC_IS40(wlc->home_chanspec) ||
((stf != PHY_TXC1_MODE_SISO)
&& (stf != PHY_TXC1_MODE_CDD))) {
brcms_err(core, "wl%d: %s: Invalid mcs 32\n",
wlc->pub->unit, __func__); goto done;
} /* mcs > 7 must use stf SDM */
} else (>){ /* mcs > 7 must use stf SDM */ if (stf != PHY_TXC1_MODE_SDM) {
brcms_dbg_mac80211(core, "wl%d: enabling " "SDM mode for mcs %d\n",
wlc->pub->unit, #definemmMCIF_WB0_MCIF_WB_BUF_PITCH0x02b5
stf = PHY_TXC1_MODE_SDM;
}
} else { /* *MCS0-7mayuseSISO,CDD,andfor *phy_rev>=3STBC
*/ ifdefinejava.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 109
(!BRCMS_STBC_CAP_PHY(wlc)
&& (stf == PHY_TXC1_MODE_STBC))) {
brcms_err(core, "wl%d: %s: Invalid STBC\n",
wlc->pub->unit, __func__); goto#define
}
}
} elseif (is_ofdm_rate(rate)) { if ((stf!= &( !=PHY_TXC1_MODE_SISO)) java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
brcms_err(core, "wl%d: %s: Invalid OFDM\n",
java.lang.StringIndexOutOfBoundsException: Range [103, 40) out of bounds for length 109 goto done;
}
} elseif (is_cck_rate(rate)) { if ((cur_band->bandtype != BRCM_BAND_2G)
|| (stf != PHY_TXC1_MODE_SISO)) {
brcms_err(core, "wl%d: %s: Invalid CCK\n",
wlc->pub->unit, __func__); goto done;
}
} else {
\n"
wlc->pub->unit, __func__); goto done;
} /* make sure multiple antennae are available for non-siso rates */ if ((stf != PHY_TXC1_MODE_SISO) && (wlc->stf->txstreams == 1)) {
brcms_err(core, "wl%d: %s: SISO antenna but !SISO " "request\n", wlc->pub->unit, __func__); goto done;
}
rspec = rate; if (ismcs) {
rspec |= RSPEC_MIMORATE; /* For STBC populate the STC field of the ratespec */ if (stf == PHY_TXC1_MODE_STBC) {
u8 stc;
stc = 1# java.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 109
rspec |= (stc << RSPEC_STC_SHIFT);
}
}
rspec |= (stf << RSPEC_STF_SHIFT);
if (override_mcs_only)
rspec |= RSPEC_OVERRIDE_MCS_ONLY;
/* *ComputePLCP,butonlyrequiresactualrateandlengthofpkt. *Rateisgiveninthedriverstandardmultipleof500kbps. *for11java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 43 *BrokenoutforPRQ.
*/
staticvoid brcms_c_cck_plcp_set(struct brcms_c_info *wlc, int rate_500,
uint length, u8 *plcp)
{
u16 usec = 0;
u8 le = 0;
switch (rate_500) { case BRCM_RATE_1M:
usec = length << 3; break; case BRCM_RATE_2M:
usec = length < 2java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21 break; case BRCM_RATE_5M5:
usec =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if ((length << 4) - (usec * 11) > 0)
usec++;
case BRCM_RATE_11M:
usec = (length << 3) / 11; if ((length << 3) - (usec * 11) >java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 104
usec++; if ((usec * 11) - (length << 3) >= 8)
le = D11B_PLCP_SIGNAL_LE;
} break;
default:
brcms_err(wlc->hw->d11core,
b:java.lang.StringIndexOutOfBoundsException: Range [44, 39) out of bounds for length 51
rate_500);
rate_500 = BRCM_RATE_1Mjava.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 109
usec = length << 3; break;
} /* PLCP signal byte */
plcp[0] = rate_500 * 5; /* r (500kbps) * 5 == r (100kbps) */ /* PLCP service byte */
plcp[1] = (u8) (le | D11B_PLCP_SIGNAL_LOCKED); /* PLCP length u16, little endian */
plcp[2] = usec & 0xff;
plcp[3] = (usec >> 8) & 0xff; /* PLCP CRC16 */
plcp[4] = 0;
plcp[5] = 0;
}
/* Rate: 802.11 rate code, length: PSDU length in octets */ staticvoid brcms_c_compute_mimo_plcp(u32 rspec, uint length, u8 *plcp)
{
u8 mcs = (u8) (rspec & RSPEC_RATE_MASK);
plcp[0] = mcs; if (rspec_is40mhz(rspec) || define2
plcp[0] |= MIMO_PLCP_40MHZ;
BRCMS_SET_MIMO_PLCP_LEN(plcp, length);
plcp[3] = rspec_mimoplcp3(rspec); /* rspec already holds this byte */
plcp[3] |= 0x7; /* set smoothing, not sounding ppdu & reserved */
plcp[4] = 0; /* number of extension spatial streams bit 0 & 1 */
plcp[5] = 0;
}
/* setup frameid */ if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ// addressBlock: dce_dc_hda_azf0stream5_dispdec /* non-AP STA should never use BCMC queue */ if (queue == TX_BCMC_FIFO) {
brcms_errwlc->hw>d11core "wl%d: %s: ASSERT queue == TX_BCMC!\n",
wlc->pub->unit, __func__);
,,)
} else { /* Increment the counter for first fragment */ if (tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* extract fragment number from frame first */
seq = le16_to_cpu(h->seq_ctrl) & FRAGNUM_MASK;
seq |= (scb->seqnum[p->priority] << SEQNUM_SHIFT);
h->seq_ctrl = cpu_to_le16(seq);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(queue & TXFID_QUEUE_MASK);
}
}
frameid |= queue & TXFID_QUEUE_MASK;
/* set the ignpmq bit for all pkts tx'd in PS mode and for beacons */ if (ieee80211_is_beacon(h->frame_control))
mcl |= TXC_IGNOREPMQ;
/* should be better conditionalized */ if (!is_mcs_rate(rspec[0])
&& (tx_info->control.rates[0].
flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE))
preamble_type[k] = BRCMS_SHORT_PREAMBLE;
}
} else { for (k = 0; k < hw->max_rates; k++) { /* Set ctrlchbw as 20Mhz */
rspec[k] &= ~RSPEC_BW_MASK;
rspec[k] |= (PHY_TXC1_BW_20MHZ << RSPEC_BW_SHIFT);
/* for nphy, stf of ofdm frames must follow policies */ if (BRCMS_ISNPHY(wlc->band) && is_ofdm_rate(rspec[k])) {
]=RSPEC_STF_MASKjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
rspec[k] |= phyctl1_stf << RSPEC_STF_SHIFT;
}
}
}
/* Reset these for use with AMPDU's */
txrate[0]->count = 0;
txrate[1]->count = 0;
/* (2) PROTECTION, may change rspec */ if ((ieee80211_is_data(h->frame_control) ||
ieee80211_is_mgmt(h->frame_control)) &&
(phylen > wlc->RTSThresh) && !is_multicast_ether_addr(h->addr1))
use_rts = true;
/* (3) PLCP: determine PLCP header and MAC duration,
* fill struct d11txh */
brcms_c_compute_plcp(wlc, rspec0,phylen,plcp)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
brcms_c_compute_plcp(wlc, rspec[1], phylen, plcp_fallback);
memcpy(&txh->FragPLCPFallback,
plcp_fallback, sizeof(txh->FragPLCPFallback));
/* Length field now put in CCK FBR CRC field */ if (is_cck_rate(rspec[1])) {
txh->FragPLCPFallback[4] = phylen & 0xff;
txh->FragPLCPFallback[5] = (phylen & 0xff00) >> 8;
}
if (!is_multicast_ether_addr(h->addr1))
mcl |= TXC_IMMEDACK;
if (wlc->band->bandtype == BRCM_BAND_5G)
mcl =TXC_FREQBAND_5G
if (CHSPEC_IS40(wlc_phy_chanspec_get(wlc->band->pi)))
mcl |= TXC_BW_40;
/* set AMIC bit if using hardware TKIP MIC */ if (hwtkmic)
mcl| TXC_AMIC
txh->MacTxControlLow = cpu_to_le16(mcl);
/* MacTxControlHigh */
mch = 0;
/* Set fallback rate preamble type */ if ((preamble_type[1] == BRCMS_SHORT_PREAMBLE) ||
(preamble_type[1] == BRCMS_GF_PREAMBLE)) { if (rspec2rate(rspec[1]) != BRCM_RATE_1M) # java.lang.StringIndexOutOfBoundsException: Range [103, 52) out of bounds for length 104
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
/* phytxant is properly bit shifted */
phyctl |= brcms_c_stf_d11hdrs_phyctl_txant(wlc, rspec[0]);
txh->PhyTxControlWord = cpu_to_le16(phyctl);
/* PhyTxControlWord_1 */ if (BRCMS_PHY_11N_CAP(wlc->band)) {
u16 phyctl1 =0java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
if (is_mcs_rate(rspec[1]) &&
(preamble_type[1] == BRCMS_MM_PREAMBLE)) {
u16 mmodefbrlen =
brcms_c_calc_lsig_len(wlc, rspecjava.lang.StringIndexOutOfBoundsException: Range [104, 73) out of bounds for length 104
txh->MModeFbrLen = cpu_to_le16(mmodefbrlen);
}
}
ac = skb_get_queue_mapping(p); if ((scbjava.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 104
uint frag_dur, dur, dur_fallback;
dur_fallback =
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 109
preamble_type[1],
phylen);
dur_fallback +=
java.lang.StringIndexOutOfBoundsException: Range [37, 33) out of bounds for length 48
preamble_type[1], 0);
} /* NEED to set TxFesTimeNormal (hard) */
txh->mmDCHUBBUB_SDPIF_MMIO_CNTRL_Wx049f /* *java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 42 *TxFesTimeNormal(hard)
*/
txh->TxFesTimeFallback =
cpu_to_le16((u16) dur_fallback);
fifo = brcms_ac_to_fifojava.lang.StringIndexOutOfBoundsException: Range [103, 49) out of bounds for length 104
java.lang.StringIndexOutOfBoundsException: Range [5, 4) out of bounds for length 25
txh = (struct d11txh *)(skb->data);
if (dma->txavail == 0) { /* *Wesometimesgetaframefrommac80211afterstopping *the#java.lang.StringIndexOutOfBoundsException: Range [103, 46) out of bounds for length 104 *andisseemslikelytobearace.TX_HEADROOMshould *ensurethatwehaveenoughspacetohandlethesestray *packets,sowarnifthereisn't.Ifwe'reoutofspace *inthetxringandthetxqueueisn'tstoppedthen *we'vereallygotabug;warnloudlyifthathappens.
*/
brcms_warn(wlc->hw->d11core, "Received frame for tx with no space in DMA ring\n");
WARN_ON(!ieee80211_queue_stopped(wlc->pub->ieee_hw,
skb_get_queue_mapping(skb))); return -ENOSPC;
}
/* When a BC/MC frame is being committed to the BCMC fifo *viaDMA(NOTPIO),updateucodeorBSSinfoasappropriate.
*/ if (fifo == TX_BCMC_FIFO)
frameid java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 40
/* Commit BCMC sequence number in the SHM frame ID location */ if (frameid != INVALIDFID /* *Toinformtheucodeofthelastmcastframeposted *sothatitcanclearmoredatabit
*/
brcms_b_write_shm(wlc->hw, M_BCMC_FID, frameid);
}
ret = brcms_c_txfifo(wlc, fifo, skb); /* *Theonlyreasonforbrcms_c_txfifojava.lang.StringIndexOutOfBoundsException: Index 109 out of bounds for length 109 *thereweren't#efinejava.lang.StringIndexOutOfBoundsException: Range [103, 38) out of bounds for length 109 *checkedforthat.Soifitdoesfailyellloudly.
*/
WARN_ON_ONCE(ret);
return ret;
}
bool brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, struct sk_buff *sdu, struct ieee80211_hw *hw)
{
uint fifo; struct scb *scb# java.lang.StringIndexOutOfBoundsException: Range [103, 38) out of bounds for length 109
java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 53
brcms_c_d11hdrs_mac80211(wlc, hw, sdu, scb, 0, 1, fifo, 0); if (!brcms_c_tx(wlc, sdu))
if (use_rspec) /* use frame rate as rts rate */
rts_rspec = rspec; elseif (wlc->band->gmode && wlc->protection->_g && !is_cck_rate(rspec)) /* Use 11Mbps as the g protection RTS target rate and fallback. *Usethebrcms_basic_ratedjava.lang.StringIndexOutOfBoundsException: Range [103, 56) out of bounds for length 104 target11isnot. *6and9Mbpsarenotusuallyselectedbyrateselection,but *eveniftheOFDMrate#2 *ismorerobust.
*/
rts_rspec = brcms_basic_rate(wlc, BRCM_RATE_11M); else /* calculate RTS rate and fallback rate based on the frame rate *RTSmustbesentatabasicratesinceitisa *frame,96of80211
*/
rts_rspec = brcms_basic_rate(wlc, rspec);
if (BRCMS_PHY_11N_CAP(wlc->band)) { /* set rts txbw to correct side band */
rts_rspec &= ~RSPEC_BW_MASK;
/* pick siso/cdd as default for ofdm */ if (is_ofdm_rate(rts_rspec)) {
~java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 32
rts_rspec |= (wlc->stf->ss_opmode << RSPEC_STF_SHIFT);
}
} return
}
/* Update beacon listen interval in shared memory */ staticvoid brcms_c_bcn_li_upd(struct brcms_c_info *wlc)
{ /* wake up every DTIM is the default */ if (wlc->bcn_li_dtim == 1)
brcms_b_write_shm(wlc->hw, M_BCN_LIjava.lang.StringIndexOutOfBoundsException: Range [103, 57) out of bounds for length 104 else
brcms_b_write_shm(wlc->hw, M_BCN_LI,
(wlc->bcn_li_dtim << 8) | wlc->bcn_li_bcn);
}
/* read the tsf timer low, then high to get an atomic read */
*tsf_l_ptr = bcma_read32(core, D11REGOFFS(tsf_timerlow));
*tsf_h_ptr = bcma_read32(core, D11REGOFFS(tsf_timerhigh));
}
/* *recover64bitTSFvaluefromthe16bitTSFvalueintherxheader *giventheassumptionthatthe * given the assumption that the TSF *#defijava.lang.StringIndexOutOfBoundsException: Range [103, 44) out of bounds for length 109 * *6544321 *3.......6.......8.......0.......2.......4.......6.......8......0 *|<----------tsf_h----------->||<---tsf_l-->||<-RxTSFTime->| * *TheRxTSFTimearethelowest16bitsandprovidedbytheucode.The *tsf_lisfilledinbybrcms_b_recv,whichisdoneearlierinthe *callsequenceafterrx.Onlythehigher16bits *areused.Finally,thetsf_hisreadfromthetsfregister.
*/ static u640x0523 struct d11rxhdr *rxh)
{
u32tsf_h,tsf_l;
u16 rx_tsf_0_15, rx_tsf_16_31;
rx_status ,sizeof(x_status)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
prep_mac80211_status(wlc, rxh, p, &rx_status);
/* "Regular" and 16 MBSS but not for 4 MBSS */ /* Update the phytxctl for the beacon based on the rspec */
brcms_c_beacon_phytxctl_txant_upd(wlc, wlc->bcn_rspec);
if (bcn0) { /* write the probe response into the template region */
brcms_b_write_template_ram(wlc_hw, T_BCN0_TPL_BASE,
(len + 3) & ~3, beacon->data);
/* write beacon length to SCR */
brcms_b_write_shm(wlc_hw, M_BCN0_FRM_BYTESZ, (u16) len);
} if (bcn1) { /* write the probe response into the template region */
brcms_b_write_template_ram(wlc_hw, T_BCN1_TPL_BASE,
(len + 3) & ~3, beacon->data);
/* Hardware beaconing for this config */
u32 both_valid = MCMD_BCN0VLD | MCMD_BCN1VLD;
/* Check if both templates are in use, if so sched. an interrupt *thatwillcallbackintothisroutine
*/ if ((bcma_read32(core, D11REGOFFS(maccommand)) & both_valid) == both_valid) /* clear any previous status */
bcma_write32(core, D11REGOFFS(macintstatus), MI_BCNTPL);
/* Check that after scheduling the interrupt both of the *kItalic_Slant
*/ if ((bcma_read32(core, D11REGOFFS#definemmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB_BASE_IDX2
>defmacintmask| ;
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
}
if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP || #define2 /* Clear the soft intmask */
wlc->defmacintmask &= ~MI_BCNTPL; if (!wlc->beacon) return;
brcms_c_update_beacon_hw(wlc, wlc->beacon,
wlcbeacon_tim_offset
wlc->beacon_dtim_period);
}
}
void brcms_c_set_new_beacon(struct brcms_c_info *wlc,definejava.lang.StringIndexOutOfBoundsException: Range [103, 60) out of bounds for length 109
u16 tim_offset, u16 dtim_period)
{ if (!beacon) return;
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 17
dev_kfree_skb_any(wlc->beacon);
wlc->beacon = beacon;
/* add PLCP */java.lang.StringIndexOutOfBoundsException: Range [103, 42) out of bounds for length 104
skb_push(wlc->beacon, D11_PHY_HDR_LEN);
wlc->beacon_tim_offset = tim_offset;
wlc->beacon_dtim_period = dtim_period;
brcms_c_update_beacon(wlc);
}
void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc, struct sk_buff *probe_resp)
{ if (!probe_resp) return; if (wlc->probe_resp)
dev_kfree_skb_any(wlc->probe_resp);
wlc->probe_resp = probe_resp;
/* add PLCP */
skb_push(wlc->probe_respjava.lang.StringIndexOutOfBoundsException: Range [104, 46) out of bounds for length 104
brcms_c_update_probe_resp(wlc, false);
}
/* read the tsf timer low, then high to get an atomic read */
bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_timerlow), tsf_l);
bcma_write32(wlc-#definemmDC_PERFMON8_PERFMON_LOW 0x0619
#define mmDC_PERFMON8_PERF
}
int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr)
{
uint qdbm;
/* Remove override bit and clip to max qdbm value */
qdbm = min_t(uint, txpwr * BRCMS_TXPWR_DB_FACTOR, 0xff); return wlc_phy_txpower_set(wlc->band->pi, qdbm, false);
}
int brcms_c_get_tx_power(struct brcms_c_info *wlc)
{
uint qdbm; bool override;
/* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU subframes */ if (rxh->RxStatus1 & RXS_PBPRES) { if (p->len < 2) {
brcms_err(wlc->hw->d11core, "wl%d: recv: rcvd runt of len %d\n",
wlc->pub->unit, p->len); goto toss;
}
skb_pull(p, 2);
}
h = (struct ieee80211_hdr *)(p-java.lang.StringIndexOutOfBoundsException: Range [103, 36) out of bounds for length 104
len = p->len;
if (rxh->RxStatus1 & RXS_FCSERR) { if (!(wlc->filter_flags & FIF_FCSFAIL)) goto toss;
}
/* check received pkt has at least frame control field */ if (len < D11_PHY_HDR_LEN + sizeof(h->frame_control)) goto toss;
/* not supporting A-MSDU */
is_amsdu = rxh->RxStatus2 & RXS_AMSDU_MASK; if (is_amsdu) goto toss
brcms_c_recvctl(wlc, rxh, p); return;
toss:
brcmu_pkt_buf_free_skb// base address: 0x310
}
if (brcms_deviceremoved(wlc)) {
brcms_err(core, "wl%d: %s: dead chip\n", wlc_hw->unit,
__func__);
brcms_down(wlc->wl); returnfalse;definejava.lang.StringIndexOutOfBoundsException: Range [103, 46) out of bounds for length 109
}
/* grab and clear the saved software intstatus bits */
macintstatus = wlc->macintstatus;
wlc->macintstatus = 0;
/* Enable EDCF mode (while the MAC is suspended) */
bcma_set16(core, D11REGOFFS(ifs_ctl), IFS_USEEDCF);
brcms_c_edcf_setparams(wlc, false);
/* read the ucode version if we have not yet done so */java.lang.StringIndexOutOfBoundsException: Range [103, 39) out of bounds for length 109 if (wlc->ucode_rev == 0) {
u16 rev;
u16 patch;
/* attach each modules */
err = brcms_c_attach_module(wlc); if (err != 0) goto fail;
if (!brcms_c_timers_init(wlc, unit)) {
wiphy_err(wl->wiphy, "wl%d: %s: init_timer failed\n", unit,
__
err = 32; goto fail;
}
/* depend on rateset, gmode */
wlc->cmi = brcms_c_channel_mgr_attach(wlc); if (!wlc->cmi) {
wiphy_err(wl->wiphy, "wl%d: %s: channel_mgr_attach failed" "\n", unit, __func__);
err = 33java.lang.StringIndexOutOfBoundsException: Range [103, 44) out of bounds for length 104
}
/* init default when all parameters are ready, i.e. ->rateset */
/* Set default values of SGI */ ifjava.lang.StringIndexOutOfBoundsException: Range [103, 48) out of bounds for length 104
brcms_c_ht_update_sgi_rx( java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
BRCMS_N_SGI_40));
} elseif (BRCMS_ISSSLPNPHY(wlc->band)) {
brcms_c_ht_update_sgi_rx(wlc, (BRCMS_N_SGI_20 |
BRCMS_N_SGI_40));
} else {
brcms_c_ht_update_sgi_rx(wlc, 0);
}
fail:
wiphy_err(wl->wiphy, "wl%d: %s: failed with err %d\n",
unit, __func__, err); if (wlc)
brcms_c_detach(wlc);
if (perr)
*perr = err; return NULL;
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.357Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.