Skip to content

Commit 95ad86d

Browse files
dberlinjannau
authored andcommitted
[brcmfmac] Add support for encoding/decoding 6g chanspecs
This patch adds support for 6G chanspecs, as part of adding 6G and 802.11ax support. Signed-off-by: Daniel Berlin <dberlin@dberlin.org>
1 parent 7f0b158 commit 95ad86d

4 files changed

Lines changed: 89 additions & 31 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7035,7 +7035,6 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
70357035
if (band)
70367036
for (i = 0; i < band->n_channels; i++)
70377037
band->channels[i].flags = IEEE80211_CHAN_DISABLED;
7038-
70397038
total = le32_to_cpu(list->count);
70407039
if (total > BRCMF_MAX_CHANSPEC_LIST) {
70417040
bphy_err(drvr, "Invalid count of channel Spec. (%u)\n",

drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,20 @@ static void brcmu_d11ac_encchspec(struct brcmu_chan *ch)
8787
0, d11ac_bw(ch->bw));
8888

8989
ch->chspec &= ~BRCMU_CHSPEC_D11AC_BND_MASK;
90-
if (ch->chnum <= CH_MAX_2G_CHANNEL)
91-
ch->chspec |= BRCMU_CHSPEC_D11AC_BND_2G;
92-
else
90+
switch (ch->band) {
91+
case BRCMU_CHAN_BAND_6G:
92+
ch->chspec |= BRCMU_CHSPEC_D11AC_BND_6G;
93+
break;
94+
case BRCMU_CHAN_BAND_5G:
9395
ch->chspec |= BRCMU_CHSPEC_D11AC_BND_5G;
96+
break;
97+
case BRCMU_CHAN_BAND_2G:
98+
ch->chspec |= BRCMU_CHSPEC_D11AC_BND_2G;
99+
break;
100+
default:
101+
WARN_ONCE(1, "Invalid band 0x%04x\n", ch->band);
102+
break;
103+
}
94104
}
95105

96106
static void brcmu_d11n_decchspec(struct brcmu_chan *ch)
@@ -117,7 +127,9 @@ static void brcmu_d11n_decchspec(struct brcmu_chan *ch)
117127
}
118128
break;
119129
default:
120-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
130+
WARN_ONCE(1,
131+
"Invalid chanspec - unknown 11n bandwidth 0x%04x\n",
132+
ch->chspec);
121133
break;
122134
}
123135

@@ -129,7 +141,8 @@ static void brcmu_d11n_decchspec(struct brcmu_chan *ch)
129141
ch->band = BRCMU_CHAN_BAND_2G;
130142
break;
131143
default:
132-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
144+
WARN_ONCE(1, "Invalid chanspec - unknown 11n band 0x%04x\n",
145+
ch->chspec);
133146
break;
134147
}
135148
}
@@ -156,7 +169,9 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
156169
ch->sb = BRCMU_CHAN_SB_U;
157170
ch->control_ch_num += CH_10MHZ_APART;
158171
} else {
159-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
172+
WARN_ONCE(1,
173+
"Invalid chanspec - unknown 11ac channel distance 0x%04x\n",
174+
ch->chspec);
160175
}
161176
break;
162177
case BRCMU_CHSPEC_D11AC_BW_80:
@@ -177,7 +192,9 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
177192
ch->control_ch_num += CH_30MHZ_APART;
178193
break;
179194
default:
180-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
195+
WARN_ONCE(1,
196+
"Invalid chanspec - unknown 11ac channel distance 0x%04x\n",
197+
ch->chspec);
181198
break;
182199
}
183200
break;
@@ -211,25 +228,34 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
211228
ch->control_ch_num += CH_70MHZ_APART;
212229
break;
213230
default:
214-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
231+
WARN_ONCE(1,
232+
"Invalid chanspec - unknown 11ac channel distance 0x%04x\n",
233+
ch->chspec);
215234
break;
216235
}
217236
break;
218237
case BRCMU_CHSPEC_D11AC_BW_8080:
219238
default:
220-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
239+
WARN_ONCE(1,
240+
"Invalid chanspec - unknown 11ac channel bandwidth 0x%04x\n",
241+
ch->chspec);
221242
break;
222243
}
223244

224245
switch (ch->chspec & BRCMU_CHSPEC_D11AC_BND_MASK) {
246+
case BRCMU_CHSPEC_D11AC_BND_6G:
247+
ch->band = BRCMU_CHAN_BAND_6G;
248+
break;
225249
case BRCMU_CHSPEC_D11AC_BND_5G:
226250
ch->band = BRCMU_CHAN_BAND_5G;
227251
break;
228252
case BRCMU_CHSPEC_D11AC_BND_2G:
229253
ch->band = BRCMU_CHAN_BAND_2G;
230254
break;
231255
default:
232-
WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
256+
WARN_ONCE(1,
257+
"Invalid chanspec - unknown 11ac channel band 0x%04x\n",
258+
ch->chspec);
233259
break;
234260
}
235261
}

drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,44 @@
6969
#define BRCMU_CHSPEC_D11AC_SB_UU BRCMU_CHSPEC_D11AC_SB_LUU
7070
#define BRCMU_CHSPEC_D11AC_SB_L BRCMU_CHSPEC_D11AC_SB_LLL
7171
#define BRCMU_CHSPEC_D11AC_SB_U BRCMU_CHSPEC_D11AC_SB_LLU
72+
/* channel sideband indication for frequency >= 240MHz */
73+
#define BRCMU_CHSPEC_D11AC_320_SB_MASK 0x0780
74+
#define BRCMU_CHSPEC_D11AC_320_SB_SHIFT 7
75+
#define BRCMU_CHSPEC_D11AC_SB_LLLL 0x0000
76+
#define BRCMU_CHSPEC_D11AC_SB_LLLU 0x0080
77+
#define BRCMU_CHSPEC_D11AC_SB_LLUL 0x0100
78+
#define BRCMU_CHSPEC_D11AC_SB_LLUU 0x0180
79+
#define BRCMU_CHSPEC_D11AC_SB_LULL 0x0200
80+
#define BRCMU_CHSPEC_D11AC_SB_LULU 0x0280
81+
#define BRCMU_CHSPEC_D11AC_SB_LUUL 0x0300
82+
#define BRCMU_CHSPEC_D11AC_SB_LUUU 0x0380
83+
#define BRCMU_CHSPEC_D11AC_SB_ULLL 0x0400
84+
#define BRCMU_CHSPEC_D11AC_SB_ULLU 0x0480
85+
#define BRCMU_CHSPEC_D11AC_SB_ULUL 0x0500
86+
#define BRCMU_CHSPEC_D11AC_SB_ULUU 0x0580
87+
#define BRCMU_CHSPEC_D11AC_SB_UULL 0x0600
88+
#define BRCMU_CHSPEC_D11AC_SB_UULU 0x0680
89+
#define BRCMU_CHSPEC_D11AC_SB_UUUL 0x0700
90+
#define BRCMU_CHSPEC_D11AC_SB_UUUU 0x0780
7291
#define BRCMU_CHSPEC_D11AC_BW_MASK 0x3800
7392
#define BRCMU_CHSPEC_D11AC_BW_SHIFT 11
74-
#define BRCMU_CHSPEC_D11AC_BW_5 0x0000
75-
#define BRCMU_CHSPEC_D11AC_BW_10 0x0800
76-
#define BRCMU_CHSPEC_D11AC_BW_20 0x1000
77-
#define BRCMU_CHSPEC_D11AC_BW_40 0x1800
78-
#define BRCMU_CHSPEC_D11AC_BW_80 0x2000
79-
#define BRCMU_CHSPEC_D11AC_BW_160 0x2800
80-
#define BRCMU_CHSPEC_D11AC_BW_8080 0x3000
81-
#define BRCMU_CHSPEC_D11AC_BND_MASK 0xc000
82-
#define BRCMU_CHSPEC_D11AC_BND_SHIFT 14
83-
#define BRCMU_CHSPEC_D11AC_BND_2G 0x0000
84-
#define BRCMU_CHSPEC_D11AC_BND_3G 0x4000
85-
#define BRCMU_CHSPEC_D11AC_BND_4G 0x8000
86-
#define BRCMU_CHSPEC_D11AC_BND_5G 0xc000
93+
#define BRCMU_CHSPEC_D11AC_BW_10 0x0800
94+
#define BRCMU_CHSPEC_D11AC_BW_20 0x1000
95+
#define BRCMU_CHSPEC_D11AC_BW_40 0x1800
96+
#define BRCMU_CHSPEC_D11AC_BW_80 0x2000
97+
#define BRCMU_CHSPEC_D11AC_BW_160 0x2800
98+
#define BRCMU_CHSPEC_D11AC_BW_320 0x0000
99+
#define BRCMU_CHSPEC_D11AC_BW_8080 0x3000
100+
#define BRCMU_CHSPEC_D11AC_BND_MASK 0xc000
101+
#define BRCMU_CHSPEC_D11AC_BND_SHIFT 14
102+
#define BRCMU_CHSPEC_D11AC_BND_2G 0x0000
103+
#define BRCMU_CHSPEC_D11AC_BND_4G 0x8000
104+
#define BRCMU_CHSPEC_D11AC_BND_5G 0xc000
105+
#define BRCMU_CHSPEC_D11AC_BND_6G 0x4000
87106

88107
#define BRCMU_CHAN_BAND_2G 0
89108
#define BRCMU_CHAN_BAND_5G 1
109+
#define BRCMU_CHAN_BAND_6G 2
90110

91111
enum brcmu_chan_bw {
92112
BRCMU_CHAN_BW_20,

drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
/* bandstate array indices */
3232
#define BAND_2G_INDEX 0 /* wlc->bandstate[x] index */
3333
#define BAND_5G_INDEX 1 /* wlc->bandstate[x] index */
34+
#define BAND_6G_INDEX 2 /* wlc->bandstate[x] index */
3435

3536
/*
3637
* max # supported channels. The max channel no is 216, this is that + 1
@@ -48,17 +49,22 @@
4849
#define WL_CHANSPEC_CTL_SB_UPPER 0x0200
4950
#define WL_CHANSPEC_CTL_SB_NONE 0x0300
5051

51-
#define WL_CHANSPEC_BW_MASK 0x0C00
52-
#define WL_CHANSPEC_BW_SHIFT 10
52+
#define WL_CHANSPEC_BW_MASK 0x3800
53+
#define WL_CHANSPEC_BW_SHIFT 11
5354
#define WL_CHANSPEC_BW_10 0x0400
5455
#define WL_CHANSPEC_BW_20 0x0800
5556
#define WL_CHANSPEC_BW_40 0x0C00
5657
#define WL_CHANSPEC_BW_80 0x2000
57-
58-
#define WL_CHANSPEC_BAND_MASK 0xf000
59-
#define WL_CHANSPEC_BAND_SHIFT 12
60-
#define WL_CHANSPEC_BAND_5G 0x1000
61-
#define WL_CHANSPEC_BAND_2G 0x2000
58+
#define WL_CHANSPEC_BW_160 0x2800
59+
#define WL_CHANSPEC_BW_8080 0x3000
60+
#define WL_CHANSPEC_BW_320 0x0000
61+
62+
#define WL_CHANSPEC_BAND_MASK 0xc000
63+
#define WL_CHANSPEC_BAND_SHIFT 14
64+
#define WL_CHANSPEC_BAND_2G 0x0000
65+
#define WL_CHANSPEC_BAND_4G 0x8000
66+
#define WL_CHANSPEC_BAND_5G 0xc000
67+
#define WL_CHANSPEC_BAND_6G 0x4000
6268
#define INVCHANSPEC 255
6369

6470
#define WL_CHAN_VALID_HW (1 << 0) /* valid with current HW */
@@ -93,6 +99,7 @@
9399
#define WLC_BAND_5G 1 /* 5 Ghz */
94100
#define WLC_BAND_2G 2 /* 2.4 Ghz */
95101
#define WLC_BAND_ALL 3 /* all bands */
102+
#define WLC_BAND_6G 4 /* 6 Ghz */
96103

97104
#define WLC_AP_IOV_OP_MANUAL_AP_BSSCFG_CREATE 2
98105

@@ -114,6 +121,12 @@
114121
#define CHSPEC_IS80(chspec) \
115122
(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_80)
116123

124+
#define CHSPEC_IS160(chspec) \
125+
(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_160)
126+
127+
#define CHSPEC_IS6G(chspec) \
128+
(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_6G)
129+
117130
#define CHSPEC_IS5G(chspec) \
118131
(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
119132

0 commit comments

Comments
 (0)