Replace the separately allocated per-band state (struct brcms_band in brcms_c_info and struct brcms_hw_band in brcms_hardware) with directly embedded fixed-size arrays. This removes the manual pointer arithmetic, two kzalloc()/kfree() pairs and their OOM error paths. MAXBANDS is 2, so the embedded arrays are small. Signed-off-by: Rosen Penev --- .../broadcom/brcm80211/brcmsmac/channel.c | 8 +- .../broadcom/brcm80211/brcmsmac/mac80211_if.c | 4 +- .../broadcom/brcm80211/brcmsmac/main.c | 82 ++++++------------- .../broadcom/brcm80211/brcmsmac/main.h | 4 +- .../broadcom/brcm80211/brcmsmac/stf.c | 22 ++--- 5 files changed, 44 insertions(+), 76 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c index 5ca8a0735398..a5c1c4d45683 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c @@ -315,8 +315,8 @@ brcms_c_set_country(struct brcms_cm_info *wlc_cm, wlc->protection->nmode_user) brcms_c_set_nmode(wlc); - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_2G_INDEX]); - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_5G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_2G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_5G_INDEX]); brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false); @@ -420,7 +420,7 @@ brcms_c_channel_reg_limits(struct brcms_cm_info *wlc_cm, u16 chanspec, country = &wlc_cm->world_regd->country; chan = CHSPEC_CHANNEL(chanspec); - band = wlc->bandstate[chspec_bandunit(chanspec)]; + band = &wlc->bandstate[chspec_bandunit(chanspec)]; li_mimo = (band->bandtype == BRCM_BAND_5G) ? brcms_c_get_mimo_5g(country->locale_mimo_5G) : brcms_c_get_mimo_2g(country->locale_mimo_2G); @@ -748,7 +748,7 @@ void brcms_c_regd_init(struct brcms_c_info *wlc) /* Disable any channels not supported by the phy */ for (band_idx = 0; band_idx < wlc->pub->_nbands; band_idx++) { - band = wlc->bandstate[band_idx]; + band = &wlc->bandstate[band_idx]; wlc_phy_chanspec_band_validch(band->pi, band->bandtype, &sup_chan); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c index c1a2318d7ea6..5946a0e133ee 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c @@ -1059,7 +1059,7 @@ static int ieee_hw_rate_init(struct ieee80211_hw *hw) phy_type = brcms_c_get_phy_type(wl->wlc, 0); if (phy_type == PHY_TYPE_N || phy_type == PHY_TYPE_LCN) { - band = &wlc->bandstate[BAND_2G_INDEX]->band; + band = &wlc->bandstate[BAND_2G_INDEX].band; *band = brcms_band_2GHz_nphy_template; if (phy_type == PHY_TYPE_LCN) { /* Single stream */ @@ -1074,7 +1074,7 @@ static int ieee_hw_rate_init(struct ieee80211_hw *hw) /* Assume all bands use the same phy. True for 11n devices. */ if (wl->pub->_nbands > 1) { if (phy_type == PHY_TYPE_N || phy_type == PHY_TYPE_LCN) { - band = &wlc->bandstate[BAND_5G_INDEX]->band; + band = &wlc->bandstate[BAND_5G_INDEX].band; *band = brcms_band_5GHz_nphy_template; hw->wiphy->bands[NL80211_BAND_5GHZ] = band; } else { diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index 7d000a2d033b..3834f2da5aa7 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -424,12 +424,9 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->default_bss); kfree(wlc->protection); kfree(wlc->stf); - kfree(wlc->bandstate[0]); if (wlc->corestate) kfree(wlc->corestate->macstat_snapshot); kfree(wlc->corestate); - if (wlc->hw) - kfree(wlc->hw->bandstate[0]); kfree(wlc->hw); if (wlc->beacon) dev_kfree_skb_any(wlc->beacon); @@ -467,20 +464,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) } wlc->hw->wlc = wlc; - wlc->hw->bandstate[0] = - kzalloc_objs(struct brcms_hw_band, MAXBANDS, GFP_ATOMIC); - if (wlc->hw->bandstate[0] == NULL) { - *err = 1006; - goto fail; - } else { - int i; - - for (i = 1; i < MAXBANDS; i++) - wlc->hw->bandstate[i] = (struct brcms_hw_band *) - ((unsigned long)wlc->hw->bandstate[0] + - (sizeof(struct brcms_hw_band) * i)); - } - wlc->modulecb = kzalloc_objs(struct modulecb, BRCMS_MAXMODULES, GFP_ATOMIC); if (wlc->modulecb == NULL) { @@ -512,20 +495,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) goto fail; } - wlc->bandstate[0] = - kzalloc_objs(*wlc->bandstate[0], MAXBANDS, GFP_ATOMIC); - if (wlc->bandstate[0] == NULL) { - *err = 1025; - goto fail; - } else { - int i; - - for (i = 1; i < MAXBANDS; i++) - wlc->bandstate[i] = (struct brcms_band *) - ((unsigned long)wlc->bandstate[0] - + (sizeof(struct brcms_band)*i)); - } - wlc->corestate = kzalloc_obj(*wlc->corestate, GFP_ATOMIC); if (wlc->corestate == NULL) { *err = 1026; @@ -744,13 +713,13 @@ static void brcms_c_setxband(struct brcms_hardware *wlc_hw, uint bandunit) brcms_dbg_mac80211(wlc_hw->d11core, "wl%d: bandunit %d\n", wlc_hw->unit, bandunit); - wlc_hw->band = wlc_hw->bandstate[bandunit]; + wlc_hw->band = &wlc_hw->bandstate[bandunit]; /* * BMAC_NOTE: * until we eliminate need for wlc->band refs in low level code */ - wlc_hw->wlc->band = wlc_hw->wlc->bandstate[bandunit]; + wlc_hw->wlc->band = &wlc_hw->wlc->bandstate[bandunit]; /* set gmode core flag */ if (wlc_hw->sbclk && !wlc_hw->noreset) { @@ -1298,10 +1267,10 @@ brcms_b_mhf(struct brcms_hardware *wlc_hw, u8 idx, u16 mask, u16 val, band = wlc_hw->band; break; case BRCM_BAND_5G: - band = wlc_hw->bandstate[BAND_5G_INDEX]; + band = &wlc_hw->bandstate[BAND_5G_INDEX]; break; case BRCM_BAND_2G: - band = wlc_hw->bandstate[BAND_2G_INDEX]; + band = &wlc_hw->bandstate[BAND_2G_INDEX]; break; default: band = NULL; /* error condition */ @@ -1321,10 +1290,10 @@ brcms_b_mhf(struct brcms_hardware *wlc_hw, u8 idx, u16 mask, u16 val, } if (bands == BRCM_BAND_ALL) { - wlc_hw->bandstate[0]->mhfs[idx] = - (wlc_hw->bandstate[0]->mhfs[idx] & ~mask) | val; - wlc_hw->bandstate[1]->mhfs[idx] = - (wlc_hw->bandstate[1]->mhfs[idx] & ~mask) | val; + wlc_hw->bandstate[0].mhfs[idx] = + (wlc_hw->bandstate[0].mhfs[idx] & ~mask) | val; + wlc_hw->bandstate[1].mhfs[idx] = + (wlc_hw->bandstate[1].mhfs[idx] & ~mask) | val; } } @@ -3486,7 +3455,7 @@ static void brcms_c_bandinit_ordered(struct brcms_c_info *wlc, for (i = 0; i < wlc->pub->_nbands; i++) { uint j = band_order[i]; - wlc->band = wlc->bandstate[j]; + wlc->band = &wlc->bandstate[j]; brcms_default_rateset(wlc, &default_rateset); @@ -3803,9 +3772,8 @@ brcms_b_set_chanspec(struct brcms_hardware *wlc_hw, u16 chanspec, * use light band switch if not up yet */ if (wlc_hw->up) { - wlc_phy_chanspec_radio_set(wlc_hw-> - bandstate[bandunit]-> - pi, chanspec); + wlc_phy_chanspec_radio_set(wlc_hw->bandstate[bandunit].pi, + chanspec); brcms_b_setband(wlc_hw, bandunit, chanspec); } else { brcms_c_setxband(wlc_hw, bandunit); @@ -3833,7 +3801,7 @@ brcms_b_set_chanspec(struct brcms_hardware *wlc_hw, u16 chanspec, static void brcms_c_setband(struct brcms_c_info *wlc, uint bandunit) { - wlc->band = wlc->bandstate[bandunit]; + wlc->band = &wlc->bandstate[bandunit]; if (!wlc->pub->up) return; @@ -4363,7 +4331,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core, wlc_hw = wlc->hw; wlc_hw->wlc = wlc; wlc_hw->unit = unit; - wlc_hw->band = wlc_hw->bandstate[0]; + wlc_hw->band = &wlc_hw->bandstate[0]; wlc_hw->_piomode = piomode; /* populate struct brcms_hardware with default values */ @@ -4704,7 +4672,7 @@ static void brcms_c_bss_default_init(struct brcms_c_info *wlc) band = wlc->band; if (wlc->pub->_nbands > 1 && band->bandunit != chspec_bandunit(chanspec)) - band = wlc->bandstate[OTHERBANDUNIT(wlc)]; + band = &wlc->bandstate[OTHERBANDUNIT(wlc)]; /* init bss rates to the band specific default rate set */ brcms_c_rateset_default(&bi->rateset, NULL, band->phytype, @@ -4722,7 +4690,7 @@ static void brcms_c_update_mimo_band_bwcap(struct brcms_c_info *wlc, u8 bwcap) struct brcms_band *band; for (i = 0; i < wlc->pub->_nbands; i++) { - band = wlc->bandstate[i]; + band = &wlc->bandstate[i]; if (band->bandtype == BRCM_BAND_5G) { if ((bwcap == BRCMS_N_BW_40ALL) || (bwcap == BRCMS_N_BW_20IN2G_40IN5G)) @@ -4784,7 +4752,7 @@ static void brcms_b_detach(struct brcms_c_info *wlc) wlc_phy_detach(band->pi); band->pi = NULL; } - band = wlc_hw->bandstate[OTHERBANDUNIT(wlc)]; + band = &wlc_hw->bandstate[OTHERBANDUNIT(wlc)]; } /* Free shared phy state */ @@ -5187,8 +5155,8 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config) if (wlc->band->bandtype == BRCM_BAND_2G) band = wlc->band; else if ((wlc->pub->_nbands > 1) && - (wlc->bandstate[OTHERBANDUNIT(wlc)]->bandtype == BRCM_BAND_2G)) - band = wlc->bandstate[OTHERBANDUNIT(wlc)]; + (wlc->bandstate[OTHERBANDUNIT(wlc)].bandtype == BRCM_BAND_2G)) + band = &wlc->bandstate[OTHERBANDUNIT(wlc)]; else return -EINVAL; @@ -5275,7 +5243,7 @@ int brcms_c_set_nmode(struct brcms_c_info *wlc) 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_rateset.mcs, + memcpy(wlc->bandstate[i].hw_rateset.mcs, wlc->default_bss->rateset.mcs, MCSSET_LEN); return 0; @@ -5298,7 +5266,7 @@ brcms_c_set_internal_rateset(struct brcms_c_info *wlc, bandunit = wlc->band->bandunit; memcpy(&new, &rs, sizeof(struct brcms_c_rateset)); if (brcms_c_rate_hwrs_filter_sort_validate - (&new, &wlc->bandstate[bandunit]->hw_rateset, true, + (&new, &wlc->bandstate[bandunit].hw_rateset, true, wlc->stf->txstreams)) goto good; @@ -5308,7 +5276,7 @@ brcms_c_set_internal_rateset(struct brcms_c_info *wlc, memcpy(&new, &rs, sizeof(struct brcms_c_rateset)); if (brcms_c_rate_hwrs_filter_sort_validate(&new, &wlc-> - bandstate[bandunit]-> + bandstate[bandunit]. hw_rateset, true, wlc->stf->txstreams)) goto good; @@ -5320,7 +5288,7 @@ brcms_c_set_internal_rateset(struct brcms_c_info *wlc, /* apply new rateset */ memcpy(&wlc->default_bss->rateset, &new, sizeof(struct brcms_c_rateset)); - memcpy(&wlc->bandstate[bandunit]->defrateset, &new, + memcpy(&wlc->bandstate[bandunit].defrateset, &new, sizeof(struct brcms_c_rateset)); return 0; } @@ -5766,7 +5734,7 @@ static bool brcms_c_valid_rate(struct brcms_c_info *wlc, u32 rspec, int band, if ((band == BRCM_BAND_AUTO) || (band == wlc->band->bandtype)) hw_rateset = &wlc->band->hw_rateset; else if (wlc->pub->_nbands > 1) - hw_rateset = &wlc->bandstate[OTHERBANDUNIT(wlc)]->hw_rateset; + hw_rateset = &wlc->bandstate[OTHERBANDUNIT(wlc)].hw_rateset; else /* other band specified and we are a single band device */ return false; @@ -7870,7 +7838,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit, wlc->wiphy = wl->wiphy; pub = wlc->pub; - wlc->band = wlc->bandstate[0]; + wlc->band = &wlc->bandstate[0]; wlc->core = wlc->corestate; wlc->wl = wl; pub->unit = unit; @@ -7918,7 +7886,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit, memcpy(&pub->cur_etheraddr, &wlc->hw->etheraddr, ETH_ALEN); for (j = 0; j < wlc->pub->_nbands; j++) { - wlc->band = wlc->bandstate[j]; + wlc->band = &wlc->bandstate[j]; if (!brcms_c_attach_stf_ant_init(wlc)) { err = 24; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 2d133264f4a7..425c867964e9 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -335,7 +335,7 @@ struct brcms_hardware { struct shared_phy *phy_sh; /* pointer to shared phy state */ struct brcms_hw_band *band;/* pointer to active per-band state */ /* band state per phy/radio */ - struct brcms_hw_band *bandstate[MAXBANDS]; + struct brcms_hw_band bandstate[MAXBANDS]; u16 bmac_phytxant; /* cache of high phytxant state */ bool shortslot; /* currently using 11g ShortSlot timing */ u16 SRL; /* 802.11 dot11ShortRetryLimit */ @@ -471,7 +471,7 @@ struct brcms_c_info { struct brcms_core *core; struct brcms_band *band; struct brcms_core *corestate; - struct brcms_band *bandstate[MAXBANDS]; + struct brcms_band bandstate[MAXBANDS]; /* packet queue */ uint qvalid; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c index 79d4a7a4da8b..6e31be49f83c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c @@ -136,8 +136,8 @@ static bool brcms_c_stf_stbc_tx_set(struct brcms_c_info *wlc, s32 int_val) if ((int_val == ON) && (wlc->stf->txstreams == 1)) return false; - wlc->bandstate[BAND_2G_INDEX]->band_stf_stbc_tx = (s8) int_val; - wlc->bandstate[BAND_5G_INDEX]->band_stf_stbc_tx = (s8) int_val; + wlc->bandstate[BAND_2G_INDEX].band_stf_stbc_tx = (s8) int_val; + wlc->bandstate[BAND_5G_INDEX].band_stf_stbc_tx = (s8) int_val; return true; } @@ -285,8 +285,8 @@ int brcms_c_stf_txchain_set(struct brcms_c_info *wlc, s32 int_val, bool force) wlc->stf->txchain = txchain; wlc->stf->txstreams = txstreams; brcms_c_stf_stbc_tx_set(wlc, wlc->band->band_stf_stbc_tx); - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_2G_INDEX]); - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_5G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_2G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_5G_INDEX]); wlc->stf->txant = (wlc->stf->txstreams == 1) ? ANT_TX_FORCE_0 : ANT_TX_DEF; _brcms_c_stf_phy_txant_upd(wlc); @@ -336,19 +336,19 @@ void brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band) int brcms_c_stf_attach(struct brcms_c_info *wlc) { - wlc->bandstate[BAND_2G_INDEX]->band_stf_ss_mode = PHY_TXC1_MODE_SISO; - wlc->bandstate[BAND_5G_INDEX]->band_stf_ss_mode = PHY_TXC1_MODE_CDD; + wlc->bandstate[BAND_2G_INDEX].band_stf_ss_mode = PHY_TXC1_MODE_SISO; + wlc->bandstate[BAND_5G_INDEX].band_stf_ss_mode = PHY_TXC1_MODE_CDD; if (BRCMS_ISNPHY(wlc->band) && (wlc_phy_txpower_hw_ctrl_get(wlc->band->pi) != PHY_TPC_HW_ON)) - wlc->bandstate[BAND_2G_INDEX]->band_stf_ss_mode = + wlc->bandstate[BAND_2G_INDEX].band_stf_ss_mode = PHY_TXC1_MODE_CDD; - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_2G_INDEX]); - brcms_c_stf_ss_update(wlc, wlc->bandstate[BAND_5G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_2G_INDEX]); + brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_5G_INDEX]); brcms_c_stf_stbc_rx_ht_update(wlc, HT_CAP_RX_STBC_NO); - wlc->bandstate[BAND_2G_INDEX]->band_stf_stbc_tx = OFF; - wlc->bandstate[BAND_5G_INDEX]->band_stf_stbc_tx = OFF; + wlc->bandstate[BAND_2G_INDEX].band_stf_stbc_tx = OFF; + wlc->bandstate[BAND_5G_INDEX].band_stf_stbc_tx = OFF; if (BRCMS_STBC_CAP_PHY(wlc)) { wlc->stf->ss_algosel_auto = true; -- 2.56.0 Replace the separately allocated module callback array with a directly embedded fixed-size array in struct brcms_c_info, removing one kzalloc()/kfree() pair and its OOM error path. Signed-off-by: Rosen Penev --- drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c | 8 -------- drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index 3834f2da5aa7..ed022fd2613e 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -420,7 +420,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->bsscfg); kfree(wlc->pub); - kfree(wlc->modulecb); kfree(wlc->default_bss); kfree(wlc->protection); kfree(wlc->stf); @@ -464,13 +463,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) } wlc->hw->wlc = wlc; - wlc->modulecb = - kzalloc_objs(struct modulecb, BRCMS_MAXMODULES, GFP_ATOMIC); - if (wlc->modulecb == NULL) { - *err = 1009; - goto fail; - } - wlc->default_bss = kzalloc_obj(*wlc->default_bss, GFP_ATOMIC); if (wlc->default_bss == NULL) { *err = 1010; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 425c867964e9..8af883e40876 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -517,7 +517,7 @@ struct brcms_c_info { struct brcms_bss_cfg *bsscfg; - struct modulecb *modulecb; + struct modulecb modulecb[BRCMS_MAXMODULES]; u8 mimoft; s8 cck_40txbw; -- 2.56.0 The MAC statistics snapshot is a fixed-size struct with the same lifetime as struct brcms_core. Embed it directly instead of allocating it separately, removing one kzalloc()/kfree() pair and its OOM error path. Signed-off-by: Rosen Penev --- .../wireless/broadcom/brcm80211/brcmsmac/debug.c | 2 +- .../net/wireless/broadcom/brcm80211/brcmsmac/main.c | 13 ++----------- .../net/wireless/broadcom/brcm80211/brcmsmac/main.h | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.c index a1888ff02d08..711e994dd04d 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.c @@ -98,7 +98,7 @@ static int brcms_debugfs_macstat_read(struct seq_file *s, void *data) int i; spin_lock_bh(&wl->lock); - stats = *(drvr->wlc->core->macstat_snapshot); + stats = drvr->wlc->core->macstat_snapshot; spin_unlock_bh(&wl->lock); seq_printf(s, "txallfrm: %d\n", stats.txallfrm); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index ed022fd2613e..d000e2a70870 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -423,8 +423,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->default_bss); kfree(wlc->protection); kfree(wlc->stf); - if (wlc->corestate) - kfree(wlc->corestate->macstat_snapshot); kfree(wlc->corestate); kfree(wlc->hw); if (wlc->beacon) @@ -493,13 +491,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) goto fail; } - wlc->corestate->macstat_snapshot = kzalloc_obj(*wlc->corestate->macstat_snapshot, - GFP_ATOMIC); - if (wlc->corestate->macstat_snapshot == NULL) { - *err = 1027; - goto fail; - } - return wlc; fail: @@ -2997,7 +2988,7 @@ static void brcms_c_statsupd(struct brcms_c_info *wlc) if (!wlc->pub->up) return; - macstats = wlc->core->macstat_snapshot; + macstats = &wlc->core->macstat_snapshot; #ifdef DEBUG /* save last rx fifo 0 overflow count */ @@ -3054,7 +3045,7 @@ void brcms_c_reset(struct brcms_c_info *wlc) brcms_c_statsupd(wlc); /* reset our snapshot of macstat counters */ - memset(wlc->core->macstat_snapshot, 0, sizeof(struct macstat)); + memset(&wlc->core->macstat_snapshot, 0, sizeof(struct macstat)); brcms_b_reset(wlc->hw); } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 8af883e40876..0e6a5edc74c8 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -240,7 +240,7 @@ struct brcms_core { /* fifo */ uint *txavail[NFIFO]; /* # tx descriptors available */ - struct macstat *macstat_snapshot; /* mac hw prev read values */ + struct macstat macstat_snapshot; /* mac hw prev read values */ }; /* -- 2.56.0 Replace the separately allocated default_bss pointer with a directly embedded struct brcms_bss_info in brcms_c_info, removing one kzalloc()/kfree() pair and its OOM error path. Signed-off-by: Rosen Penev --- .../broadcom/brcm80211/brcmsmac/ampdu.c | 2 +- .../broadcom/brcm80211/brcmsmac/main.c | 35 ++++++++----------- .../broadcom/brcm80211/brcmsmac/main.h | 2 +- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c index fc7a5dd2e5d8..b40761e571c2 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c @@ -862,7 +862,7 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, brcms_dbg_ht(wlc->hw->d11core, "%s: Pkt tx suppressed, illegal channel possibly %d\n", __func__, CHSPEC_CHANNEL( - wlc->default_bss->chanspec)); + wlc->default_bss.chanspec)); } else { if (supr_status != TX_STATUS_SUPR_FRAG) brcms_err(wlc->hw->d11core, diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index d000e2a70870..2140feb86964 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -420,7 +420,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->bsscfg); kfree(wlc->pub); - kfree(wlc->default_bss); kfree(wlc->protection); kfree(wlc->stf); kfree(wlc->corestate); @@ -461,12 +460,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) } wlc->hw->wlc = wlc; - wlc->default_bss = kzalloc_obj(*wlc->default_bss, GFP_ATOMIC); - if (wlc->default_bss == NULL) { - *err = 1010; - goto fail; - } - wlc->bsscfg = kzalloc_obj(*wlc->bsscfg, GFP_ATOMIC); if (wlc->bsscfg == NULL) { *err = 1011; @@ -822,7 +815,7 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs) brcms_dbg_tx(wlc->hw->d11core, "Pkt tx suppressed, dest chan %u, current %d\n", (xfts >> XFTS_CHANNEL_SHIFT) & 0xff, - CHSPEC_CHANNEL(wlc->default_bss->chanspec)); + CHSPEC_CHANNEL(wlc->default_bss.chanspec)); } tx_frame_count = @@ -3311,7 +3304,7 @@ brcms_default_rateset(struct brcms_c_info *wlc, struct brcms_c_rateset *rs) brcms_c_rateset_default(rs, NULL, wlc->band->phytype, wlc->band->bandtype, false, BRCMS_RATE_MASK_FULL, (bool) (wlc->pub->_n_enab & SUPPORT_11N), - brcms_chspec_bw(wlc->default_bss->chanspec), + brcms_chspec_bw(wlc->default_bss.chanspec), wlc->stf->txstreams); } @@ -4639,7 +4632,7 @@ static void brcms_c_bss_default_init(struct brcms_c_info *wlc) { u16 chanspec; struct brcms_band *band; - struct brcms_bss_info *bi = wlc->default_bss; + struct brcms_bss_info *bi = &wlc->default_bss; /* init default and target BSS with some sane initial values */ memset(bi, 0, sizeof(*bi)); @@ -5198,9 +5191,9 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config) } /* Set default bss rateset */ - wlc->default_bss->rateset.count = rs.count; - memcpy(wlc->default_bss->rateset.rates, rs.rates, - sizeof(wlc->default_bss->rateset.rates)); + wlc->default_bss.rateset.count = rs.count; + memcpy(wlc->default_bss.rateset.rates, rs.rates, + sizeof(wlc->default_bss.rateset.rates)); return ret; } @@ -5221,13 +5214,13 @@ int brcms_c_set_nmode(struct brcms_c_info *wlc) wlc->pub->_n_enab = SUPPORT_HT; else wlc->pub->_n_enab = SUPPORT_11N; - wlc->default_bss->flags |= BRCMS_BSS_HT; + 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, + 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_rateset.mcs, - wlc->default_bss->rateset.mcs, MCSSET_LEN); + wlc->default_bss.rateset.mcs, MCSSET_LEN); return 0; } @@ -5269,7 +5262,7 @@ brcms_c_set_internal_rateset(struct brcms_c_info *wlc, good: /* apply new rateset */ - memcpy(&wlc->default_bss->rateset, &new, + memcpy(&wlc->default_bss.rateset, &new, sizeof(struct brcms_c_rateset)); memcpy(&wlc->bandstate[bandunit].defrateset, &new, sizeof(struct brcms_c_rateset)); @@ -5299,7 +5292,7 @@ int brcms_c_set_channel(struct brcms_c_info *wlc, u16 channel) wlc->bandinit_pending = false; } - wlc->default_bss->chanspec = chspec; + wlc->default_bss.chanspec = chspec; /* brcms_c_BSSinit() will sanitize the rateset before * using it.. */ if (wlc->pub->up && (wlc_phy_chanspec_get(wlc->band->pi) != chspec)) { @@ -5343,7 +5336,7 @@ void brcms_c_get_current_rateset(struct brcms_c_info *wlc, if (wlc->pub->associated) rs = &wlc->bsscfg->current_bss.rateset; else - rs = &wlc->default_bss->rateset; + rs = &wlc->default_bss.rateset; /* Copy only legacy rateset section */ currs->count = rs->count; @@ -5370,7 +5363,7 @@ int brcms_c_set_rateset(struct brcms_c_info *wlc, struct brcm_rateset *rs) if (wlc->pub->associated) mcsset_bss = &wlc->bsscfg->current_bss; else - mcsset_bss = wlc->default_bss; + mcsset_bss = &wlc->default_bss; memcpy(internal_rs.mcs, &mcsset_bss->rateset.mcs[0], MCSSET_LEN); } @@ -5403,7 +5396,7 @@ int brcms_c_set_beacon_period(struct brcms_c_info *wlc, u16 period) if (period == 0) return -EINVAL; - wlc->default_bss->beacon_period = period; + wlc->default_bss.beacon_period = period; bcnint_us = period << 10; brcms_c_time_lock(wlc); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 0e6a5edc74c8..94966418b069 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -524,7 +524,7 @@ struct brcms_c_info { s8 ofdm_40txbw; s8 mimo_40txbw; - struct brcms_bss_info *default_bss; + struct brcms_bss_info default_bss; u16 mc_fid_counter; -- 2.56.0 The protection settings (struct brcms_protection) have the same lifetime as struct brcms_c_info. Embed them directly instead of allocating them separately, removing one kzalloc()/kfree() pair and its OOM error path. Signed-off-by: Rosen Penev --- .../broadcom/brcm80211/brcmsmac/channel.c | 6 ++-- .../broadcom/brcm80211/brcmsmac/main.c | 31 +++++++------------ .../broadcom/brcm80211/brcmsmac/main.h | 2 +- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c index a5c1c4d45683..b4c575f8c0f6 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c @@ -312,13 +312,13 @@ brcms_c_set_country(struct brcms_cm_info *wlc_cm, struct brcms_c_info *wlc = wlc_cm->wlc; if ((wlc->pub->_n_enab & SUPPORT_11N) != - wlc->protection->nmode_user) + wlc->protection.nmode_user) brcms_c_set_nmode(wlc); brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_2G_INDEX]); brcms_c_stf_ss_update(wlc, &wlc->bandstate[BAND_5G_INDEX]); - brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false); + brcms_c_set_gmode(wlc, wlc->protection.gmode_user, false); return; } @@ -387,7 +387,7 @@ brcms_c_channel_set_chanspec(struct brcms_cm_info *wlc_cm, u16 chanspec, if (ch->flags & IEEE80211_CHAN_NO_OFDM) brcms_c_set_gmode(wlc, GMODE_LEGACY_B, false); else - brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false); + brcms_c_set_gmode(wlc, wlc->protection.gmode_user, false); brcms_b_set_chanspec(wlc->hw, chanspec, !!(ch->flags & IEEE80211_CHAN_NO_IR), diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index 2140feb86964..bd1880e3738f 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -420,7 +420,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->bsscfg); kfree(wlc->pub); - kfree(wlc->protection); kfree(wlc->stf); kfree(wlc->corestate); kfree(wlc->hw); @@ -466,12 +465,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) goto fail; } - wlc->protection = kzalloc_obj(*wlc->protection, GFP_ATOMIC); - if (wlc->protection == NULL) { - *err = 1016; - goto fail; - } - wlc->stf = kzalloc_obj(*wlc->stf, GFP_ATOMIC); if (wlc->stf == NULL) { *err = 1017; @@ -3878,37 +3871,37 @@ void brcms_c_protection_upd(struct brcms_c_info *wlc, uint idx, int val) switch (idx) { case BRCMS_PROT_G_SPEC: - wlc->protection->_g = (bool) val; + wlc->protection._g = (bool) val; break; case BRCMS_PROT_G_OVR: - wlc->protection->g_override = (s8) val; + wlc->protection.g_override = (s8) val; break; case BRCMS_PROT_G_USER: - wlc->protection->gmode_user = (u8) val; + wlc->protection.gmode_user = (u8) val; break; case BRCMS_PROT_OVERLAP: - wlc->protection->overlap = (s8) val; + wlc->protection.overlap = (s8) val; break; case BRCMS_PROT_N_USER: - wlc->protection->nmode_user = (s8) val; + wlc->protection.nmode_user = (s8) val; break; case BRCMS_PROT_N_CFG: - wlc->protection->n_cfg = (s8) val; + wlc->protection.n_cfg = (s8) val; break; case BRCMS_PROT_N_CFG_OVR: - wlc->protection->n_cfg_override = (s8) val; + wlc->protection.n_cfg_override = (s8) val; break; case BRCMS_PROT_N_NONGF: - wlc->protection->nongf = (bool) val; + wlc->protection.nongf = (bool) val; break; case BRCMS_PROT_N_NONGF_OVR: - wlc->protection->nongf_override = (s8) val; + wlc->protection.nongf_override = (s8) val; break; case BRCMS_PROT_N_PAM_OVR: - wlc->protection->n_pam_override = (s8) val; + wlc->protection.n_pam_override = (s8) val; break; case BRCMS_PROT_N_OBSS: - wlc->protection->n_obss = (bool) val; + wlc->protection.n_obss = (bool) val; break; default: @@ -6800,7 +6793,7 @@ brcms_c_rspec_to_rts_rspec(struct brcms_c_info *wlc, u32 rspec, if (use_rspec) /* use frame rate as rts rate */ rts_rspec = rspec; - else if (wlc->band->gmode && wlc->protection->_g && !is_cck_rate(rspec)) + else if (wlc->band->gmode && wlc->protection._g && !is_cck_rate(rspec)) /* Use 11Mbps as the g protection RTS target rate and fallback. * Use the brcms_basic_rate() lookup to find the best basic rate * under the target in case 11 Mbps is not Basic. diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 94966418b069..266fe7825042 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -549,7 +549,7 @@ struct brcms_c_info { s8 shortslot_override; bool include_legacy_erp; - struct brcms_protection *protection; + struct brcms_protection protection; s8 PLCPHdr_override; struct brcms_stf *stf; -- 2.56.0 There is only one struct brcms_core and it has the same lifetime as struct brcms_c_info. Embed it directly instead of allocating it separately, removing one kzalloc()/kfree() pair and its OOM error path. Signed-off-by: Rosen Penev --- drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c | 9 +-------- drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index bd1880e3738f..8c3048082fbb 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -421,7 +421,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) kfree(wlc->bsscfg); kfree(wlc->pub); kfree(wlc->stf); - kfree(wlc->corestate); kfree(wlc->hw); if (wlc->beacon) dev_kfree_skb_any(wlc->beacon); @@ -471,12 +470,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) goto fail; } - wlc->corestate = kzalloc_obj(*wlc->corestate, GFP_ATOMIC); - if (wlc->corestate == NULL) { - *err = 1026; - goto fail; - } - return wlc; fail: @@ -7808,7 +7801,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit, pub = wlc->pub; wlc->band = &wlc->bandstate[0]; - wlc->core = wlc->corestate; + wlc->core = &wlc->corestate; wlc->wl = wl; pub->unit = unit; pub->_piomode = piomode; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 266fe7825042..72720b9f9b35 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -470,7 +470,7 @@ struct brcms_c_info { /* multiband */ struct brcms_core *core; struct brcms_band *band; - struct brcms_core *corestate; + struct brcms_core corestate; struct brcms_band bandstate[MAXBANDS]; /* packet queue */ -- 2.56.0 The driver only ever has one BSS configuration, and it has the same lifetime as struct brcms_c_info. Embed it directly instead of allocating it separately, removing one kzalloc()/kfree() pair and its OOM error path. Move the struct brcms_bss_cfg definition, unchanged, above struct brcms_c_info so that it is a complete type there. Signed-off-by: Rosen Penev --- .../broadcom/brcm80211/brcmsmac/main.c | 48 ++++++------- .../broadcom/brcm80211/brcmsmac/main.h | 68 +++++++++---------- 2 files changed, 55 insertions(+), 61 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c index 8c3048082fbb..7046c116605c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c @@ -418,7 +418,6 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc) if (wlc == NULL) return; - kfree(wlc->bsscfg); kfree(wlc->pub); kfree(wlc->stf); kfree(wlc->hw); @@ -458,12 +457,6 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid) } wlc->hw->wlc = wlc; - wlc->bsscfg = kzalloc_obj(*wlc->bsscfg, GFP_ATOMIC); - if (wlc->bsscfg == NULL) { - *err = 1011; - goto fail; - } - wlc->stf = kzalloc_obj(*wlc->stf, GFP_ATOMIC); if (wlc->stf == NULL) { *err = 1017; @@ -955,7 +948,7 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal) static void brcms_c_tbtt(struct brcms_c_info *wlc) { - if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC) + if (wlc->bsscfg.type == BRCMS_TYPE_ADHOC) /* * DirFrmQ is now valid...defer setting until end * of ATIM window @@ -2049,7 +2042,7 @@ void brcms_b_switch_macfreq(struct brcms_hardware *wlc_hw, u8 spurmode) void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr) { memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr)); - wlc->bsscfg->type = BRCMS_TYPE_STATION; + wlc->bsscfg.type = BRCMS_TYPE_STATION; } void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid, @@ -2058,8 +2051,8 @@ void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid, brcms_c_set_ssid(wlc, ssid, ssid_len); memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr)); - memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID)); - wlc->bsscfg->type = BRCMS_TYPE_AP; + memcpy(wlc->bsscfg.BSSID, bssid, sizeof(wlc->bsscfg.BSSID)); + wlc->bsscfg.type = BRCMS_TYPE_AP; brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA); } @@ -2067,7 +2060,7 @@ void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid, void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr) { memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr)); - wlc->bsscfg->type = BRCMS_TYPE_ADHOC; + wlc->bsscfg.type = BRCMS_TYPE_ADHOC; brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, 0); } @@ -3669,11 +3662,12 @@ static void brcms_c_set_bssid(struct brcms_bss_cfg *bsscfg) void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid, size_t ssid_len) { - u8 len = min_t(u8, sizeof(wlc->bsscfg->SSID), ssid_len); - memset(wlc->bsscfg->SSID, 0, sizeof(wlc->bsscfg->SSID)); + u8 len = min_t(u8, sizeof(wlc->bsscfg.SSID), ssid_len); + + memset(wlc->bsscfg.SSID, 0, sizeof(wlc->bsscfg.SSID)); - memcpy(wlc->bsscfg->SSID, ssid, len); - wlc->bsscfg->SSID_len = len; + memcpy(wlc->bsscfg.SSID, ssid, len); + wlc->bsscfg.SSID_len = len; } static void brcms_b_set_shortslot(struct brcms_hardware *wlc_hw, bool shortslot) @@ -3711,7 +3705,7 @@ static void brcms_c_set_home_chanspec(struct brcms_c_info *wlc, u16 chanspec) wlc->home_chanspec = chanspec; if (wlc->pub->associated) - wlc->bsscfg->current_bss.chanspec = chanspec; + wlc->bsscfg.current_bss.chanspec = chanspec; } } @@ -4918,7 +4912,7 @@ int brcms_c_up(struct brcms_c_info *wlc) if (status == -ENOMEDIUM) { if (!mboolisset (wlc->pub->radio_disabled, WL_RADIO_HW_DISABLE)) { - struct brcms_bss_cfg *bsscfg = wlc->bsscfg; + struct brcms_bss_cfg *bsscfg = &wlc->bsscfg; mboolset(wlc->pub->radio_disabled, WL_RADIO_HW_DISABLE); if (bsscfg->type == BRCMS_TYPE_STATION || @@ -5320,7 +5314,7 @@ void brcms_c_get_current_rateset(struct brcms_c_info *wlc, struct brcms_c_rateset *rs; if (wlc->pub->associated) - rs = &wlc->bsscfg->current_bss.rateset; + rs = &wlc->bsscfg.current_bss.rateset; else rs = &wlc->default_bss.rateset; @@ -5347,7 +5341,7 @@ int brcms_c_set_rateset(struct brcms_c_info *wlc, struct brcm_rateset *rs) if (wlc->pub->_n_enab & SUPPORT_11N) { struct brcms_bss_info *mcsset_bss; if (wlc->pub->associated) - mcsset_bss = &wlc->bsscfg->current_bss; + mcsset_bss = &wlc->bsscfg.current_bss; else mcsset_bss = &wlc->default_bss; memcpy(internal_rs.mcs, &mcsset_bss->rateset.mcs[0], @@ -7228,7 +7222,7 @@ static void brcms_c_update_beacon_hw(struct brcms_c_info *wlc, */ void brcms_c_update_beacon(struct brcms_c_info *wlc) { - struct brcms_bss_cfg *bsscfg = wlc->bsscfg; + struct brcms_bss_cfg *bsscfg = &wlc->bsscfg; if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP || bsscfg->type == BRCMS_TYPE_ADHOC)) { @@ -7337,7 +7331,7 @@ brcms_c_bss_update_probe_resp(struct brcms_c_info *wlc, void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend) { - struct brcms_bss_cfg *bsscfg = wlc->bsscfg; + struct brcms_bss_cfg *bsscfg = &wlc->bsscfg; /* update AP or IBSS probe responses */ if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP || @@ -7366,7 +7360,7 @@ brcms_c_set_addrmatch(struct brcms_c_info *wlc, int match_reg_offset, { brcms_b_set_addrmatch(wlc->hw, match_reg_offset, addr); if (match_reg_offset == RCM_BSSID_OFFSET) - memcpy(wlc->bsscfg->BSSID, addr, ETH_ALEN); + memcpy(wlc->bsscfg.BSSID, addr, ETH_ALEN); } /* @@ -7698,15 +7692,15 @@ void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx) brcms_c_bcn_li_upd(wlc); /* write ethernet address to core */ - brcms_c_set_mac(wlc->bsscfg); - brcms_c_set_bssid(wlc->bsscfg); + brcms_c_set_mac(&wlc->bsscfg); + brcms_c_set_bssid(&wlc->bsscfg); /* Update tsf_cfprep if associated and up */ if (wlc->pub->associated && wlc->pub->up) { u32 bi; /* get beacon period and convert to uS */ - bi = wlc->bsscfg->current_bss.beacon_period << 10; + bi = wlc->bsscfg.current_bss.beacon_period << 10; /* * update since init path would reset * to default value @@ -7919,7 +7913,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit, * Complete the wlc default state initializations.. */ - wlc->bsscfg->wlc = wlc; + wlc->bsscfg.wlc = wlc; wlc->mimoft = FT_HT; wlc->mimo_40txbw = AUTO; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h index 72720b9f9b35..30d62049775a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h @@ -378,6 +378,39 @@ struct brcms_hardware { */ }; +enum brcms_bss_type { + BRCMS_TYPE_STATION, + BRCMS_TYPE_AP, + BRCMS_TYPE_ADHOC, +}; + +/* + * BSS configuration state + * + * wlc: wlc to which this bsscfg belongs to. + * type: interface type + * SSID_len: the length of SSID + * SSID: SSID string + * + * + * BSSID: BSSID (associated) + * cur_etheraddr: h/w address + * flags: BSSCFG flags; see below + * + * current_bss: BSS parameters in ASSOCIATED state + * + * + * ID: 'unique' ID of this bsscfg, assigned at bsscfg allocation + */ +struct brcms_bss_cfg { + struct brcms_c_info *wlc; + enum brcms_bss_type type; + u8 SSID_len; + u8 SSID[IEEE80211_MAX_SSID_LEN]; + u8 BSSID[ETH_ALEN]; + struct brcms_bss_info current_bss; +}; + /* * Principal common driver data structure. * @@ -515,7 +548,7 @@ struct brcms_c_info { u16 wme_retries[IEEE80211_NUM_ACS]; - struct brcms_bss_cfg *bsscfg; + struct brcms_bss_cfg bsscfg; struct modulecb modulecb[BRCMS_MAXMODULES]; @@ -584,39 +617,6 @@ struct antsel_info { struct brcms_antselcfg antcfg_cur; /* current antenna config (auto) */ }; -enum brcms_bss_type { - BRCMS_TYPE_STATION, - BRCMS_TYPE_AP, - BRCMS_TYPE_ADHOC, -}; - -/* - * BSS configuration state - * - * wlc: wlc to which this bsscfg belongs to. - * type: interface type - * SSID_len: the length of SSID - * SSID: SSID string - * - * - * BSSID: BSSID (associated) - * cur_etheraddr: h/w address - * flags: BSSCFG flags; see below - * - * current_bss: BSS parameters in ASSOCIATED state - * - * - * ID: 'unique' ID of this bsscfg, assigned at bsscfg allocation - */ -struct brcms_bss_cfg { - struct brcms_c_info *wlc; - enum brcms_bss_type type; - u8 SSID_len; - u8 SSID[IEEE80211_MAX_SSID_LEN]; - u8 BSSID[ETH_ALEN]; - struct brcms_bss_info current_bss; -}; - int brcms_c_txfifo(struct brcms_c_info *wlc, uint fifo, struct sk_buff *p); int brcms_b_xmtfifo_sz_get(struct brcms_hardware *wlc_hw, uint fifo, uint *blocks); -- 2.56.0