* [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info
@ 2026-11-11 4:25 Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 1/7] wifi: brcmsmac: embed bandstate arrays instead of separate allocation Rosen Penev
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
brcms_c_attach_malloc() allocates struct brcms_c_info and then a number
of fixed-size structures that live exactly as long as it does, each with
its own kzalloc(GFP_ATOMIC), error code and kfree(). This series embeds
seven of them in their parent structures. That removes the allocations
and their OOM error paths and, for the per-band state, the open-coded
pointer arithmetic that carved two arrays out of one allocation.
Patch 1 embeds the per-band state arrays of brcms_c_info and
brcms_hardware. Patches 2-7 embed the module callback array, the MAC
statistics snapshot, the default BSS info, the protection settings, the
core state and the BSS configuration. Patch 7 moves the definition of
struct brcms_bss_cfg, unchanged, above struct brcms_c_info.
There is no functional change. The pub, hw and stf allocations are left
alone: embedding them would touch most of the driver for little gain.
Each patch builds with W=1 (arm64, clang) and passes checkpatch.
Compile-tested only.
An AI coding assistant (Claude Code, Claude Opus 5.5) was used to review
the series, resolve rebase conflicts, write patches 5-7, and draft the
commit messages and this cover letter.
Rosen Penev (7):
wifi: brcmsmac: embed bandstate arrays instead of separate allocation
wifi: brcmsmac: embed modulecb array instead of separate allocation
wifi: brcmsmac: embed macstat_snapshot in brcms_core
wifi: brcmsmac: embed default_bss in brcms_c_info
wifi: brcmsmac: embed brcms_protection in brcms_c_info
wifi: brcmsmac: embed brcms_core in brcms_c_info
wifi: brcmsmac: embed brcms_bss_cfg in brcms_c_info
.../broadcom/brcm80211/brcmsmac/ampdu.c | 2 +-
.../broadcom/brcm80211/brcmsmac/channel.c | 14 +-
.../broadcom/brcm80211/brcmsmac/debug.c | 2 +-
.../broadcom/brcm80211/brcmsmac/mac80211_if.c | 4 +-
.../broadcom/brcm80211/brcmsmac/main.c | 226 ++++++------------
.../broadcom/brcm80211/brcmsmac/main.h | 82 +++----
.../broadcom/brcm80211/brcmsmac/stf.c | 22 +-
7 files changed, 138 insertions(+), 214 deletions(-)
base-commit: 793807ca13bf3072fc6d16ce6d90e9ab9beff2a5
--
2.56.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 1/7] wifi: brcmsmac: embed bandstate arrays instead of separate allocation
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 2/7] wifi: brcmsmac: embed modulecb array " Rosen Penev
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
.../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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 2/7] wifi: brcmsmac: embed modulecb array instead of separate allocation
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 1/7] wifi: brcmsmac: embed bandstate arrays instead of separate allocation Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 3/7] wifi: brcmsmac: embed macstat_snapshot in brcms_core Rosen Penev
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 3/7] wifi: brcmsmac: embed macstat_snapshot in brcms_core
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 1/7] wifi: brcmsmac: embed bandstate arrays instead of separate allocation Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 2/7] wifi: brcmsmac: embed modulecb array " Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 4/7] wifi: brcmsmac: embed default_bss in brcms_c_info Rosen Penev
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
.../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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 4/7] wifi: brcmsmac: embed default_bss in brcms_c_info
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
` (2 preceding siblings ...)
2026-11-11 4:25 ` [PATCH wireless-next 3/7] wifi: brcmsmac: embed macstat_snapshot in brcms_core Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 5/7] wifi: brcmsmac: embed brcms_protection " Rosen Penev
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
.../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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 5/7] wifi: brcmsmac: embed brcms_protection in brcms_c_info
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
` (3 preceding siblings ...)
2026-11-11 4:25 ` [PATCH wireless-next 4/7] wifi: brcmsmac: embed default_bss in brcms_c_info Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 6/7] wifi: brcmsmac: embed brcms_core " Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 7/7] wifi: brcmsmac: embed brcms_bss_cfg " Rosen Penev
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
.../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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 6/7] wifi: brcmsmac: embed brcms_core in brcms_c_info
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
` (4 preceding siblings ...)
2026-11-11 4:25 ` [PATCH wireless-next 5/7] wifi: brcmsmac: embed brcms_protection " Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 7/7] wifi: brcmsmac: embed brcms_bss_cfg " Rosen Penev
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 7/7] wifi: brcmsmac: embed brcms_bss_cfg in brcms_c_info
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
` (5 preceding siblings ...)
2026-11-11 4:25 ` [PATCH wireless-next 6/7] wifi: brcmsmac: embed brcms_core " Rosen Penev
@ 2026-11-11 4:25 ` Rosen Penev
6 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-11-11 4:25 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211, brcm80211-dev-list.pdl, linux-kernel
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 <rosenp@gmail.com>
---
.../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
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-11-11 4:26 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-11 4:25 [PATCH wireless-next 0/7] wifi: brcmsmac: embed fixed-size allocations in brcms_c_info Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 1/7] wifi: brcmsmac: embed bandstate arrays instead of separate allocation Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 2/7] wifi: brcmsmac: embed modulecb array " Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 3/7] wifi: brcmsmac: embed macstat_snapshot in brcms_core Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 4/7] wifi: brcmsmac: embed default_bss in brcms_c_info Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 5/7] wifi: brcmsmac: embed brcms_protection " Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 6/7] wifi: brcmsmac: embed brcms_core " Rosen Penev
2026-11-11 4:25 ` [PATCH wireless-next 7/7] wifi: brcmsmac: embed brcms_bss_cfg " Rosen Penev
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®