mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
brcmutil: add field storing control channel to the struct brcmu_chan
Our d11 code supports encoding/decoding channel info into/from chanspec format used by firmware. Current implementation is quite misleading because of the way "chnum" field is used. When encoding channel info, "chnum" has to be filled by a caller with *center* channel number. However when decoding chanspec the same field is filled with a *control* channel number. 1) This can be confusing. It's expected for information to be the same after encoding and decoding. 2) It doesn't allow accessing all info when decoding. Some functions may need to know both channel numbers, e.g. cfg80211 callback getting current channel. Solve this by adding a separated field for control channel. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
committed by
Kalle Valo
parent
d464fd8b48
commit
4712d88a57
@@ -107,6 +107,7 @@ static void brcmu_d11n_decchspec(struct brcmu_chan *ch)
|
||||
u16 val;
|
||||
|
||||
ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK);
|
||||
ch->control_ch_num = ch->chnum;
|
||||
|
||||
switch (ch->chspec & BRCMU_CHSPEC_D11N_BW_MASK) {
|
||||
case BRCMU_CHSPEC_D11N_BW_20:
|
||||
@@ -118,10 +119,10 @@ static void brcmu_d11n_decchspec(struct brcmu_chan *ch)
|
||||
val = ch->chspec & BRCMU_CHSPEC_D11N_SB_MASK;
|
||||
if (val == BRCMU_CHSPEC_D11N_SB_L) {
|
||||
ch->sb = BRCMU_CHAN_SB_L;
|
||||
ch->chnum -= CH_10MHZ_APART;
|
||||
ch->control_ch_num -= CH_10MHZ_APART;
|
||||
} else {
|
||||
ch->sb = BRCMU_CHAN_SB_U;
|
||||
ch->chnum += CH_10MHZ_APART;
|
||||
ch->control_ch_num += CH_10MHZ_APART;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -147,6 +148,7 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
|
||||
u16 val;
|
||||
|
||||
ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK);
|
||||
ch->control_ch_num = ch->chnum;
|
||||
|
||||
switch (ch->chspec & BRCMU_CHSPEC_D11AC_BW_MASK) {
|
||||
case BRCMU_CHSPEC_D11AC_BW_20:
|
||||
@@ -158,10 +160,10 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
|
||||
val = ch->chspec & BRCMU_CHSPEC_D11AC_SB_MASK;
|
||||
if (val == BRCMU_CHSPEC_D11AC_SB_L) {
|
||||
ch->sb = BRCMU_CHAN_SB_L;
|
||||
ch->chnum -= CH_10MHZ_APART;
|
||||
ch->control_ch_num -= CH_10MHZ_APART;
|
||||
} else if (val == BRCMU_CHSPEC_D11AC_SB_U) {
|
||||
ch->sb = BRCMU_CHAN_SB_U;
|
||||
ch->chnum += CH_10MHZ_APART;
|
||||
ch->control_ch_num += CH_10MHZ_APART;
|
||||
} else {
|
||||
WARN_ON_ONCE(1);
|
||||
}
|
||||
@@ -172,16 +174,16 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
|
||||
BRCMU_CHSPEC_D11AC_SB_SHIFT);
|
||||
switch (ch->sb) {
|
||||
case BRCMU_CHAN_SB_LL:
|
||||
ch->chnum -= CH_30MHZ_APART;
|
||||
ch->control_ch_num -= CH_30MHZ_APART;
|
||||
break;
|
||||
case BRCMU_CHAN_SB_LU:
|
||||
ch->chnum -= CH_10MHZ_APART;
|
||||
ch->control_ch_num -= CH_10MHZ_APART;
|
||||
break;
|
||||
case BRCMU_CHAN_SB_UL:
|
||||
ch->chnum += CH_10MHZ_APART;
|
||||
ch->control_ch_num += CH_10MHZ_APART;
|
||||
break;
|
||||
case BRCMU_CHAN_SB_UU:
|
||||
ch->chnum += CH_30MHZ_APART;
|
||||
ch->control_ch_num += CH_30MHZ_APART;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
Reference in New Issue
Block a user