Path: blob/main/sys/contrib/dev/broadcom/brcm80211/brcmutil/d11.c
178665 views
// SPDX-License-Identifier: ISC1/*2* Copyright (c) 2013 Broadcom Corporation3*/4/*********************channel spec common functions*********************/56#include <linux/module.h>78#include <brcmu_utils.h>9#include <brcmu_wifi.h>10#include <brcmu_d11.h>1112static u16 d11n_sb(enum brcmu_chan_sb sb)13{14switch (sb) {15case BRCMU_CHAN_SB_NONE:16return BRCMU_CHSPEC_D11N_SB_N;17case BRCMU_CHAN_SB_L:18return BRCMU_CHSPEC_D11N_SB_L;19case BRCMU_CHAN_SB_U:20return BRCMU_CHSPEC_D11N_SB_U;21default:22WARN_ON(1);23}24return 0;25}2627static u16 d11n_bw(enum brcmu_chan_bw bw)28{29switch (bw) {30case BRCMU_CHAN_BW_20:31return BRCMU_CHSPEC_D11N_BW_20;32case BRCMU_CHAN_BW_40:33return BRCMU_CHSPEC_D11N_BW_40;34default:35WARN_ON(1);36}37return 0;38}3940static void brcmu_d11n_encchspec(struct brcmu_chan *ch)41{42if (ch->bw == BRCMU_CHAN_BW_20)43ch->sb = BRCMU_CHAN_SB_NONE;4445ch->chspec = 0;46brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_CH_MASK,47BRCMU_CHSPEC_CH_SHIFT, ch->chnum);48brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_D11N_SB_MASK,490, d11n_sb(ch->sb));50brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_D11N_BW_MASK,510, d11n_bw(ch->bw));5253if (ch->chnum <= CH_MAX_2G_CHANNEL)54ch->chspec |= BRCMU_CHSPEC_D11N_BND_2G;55else56ch->chspec |= BRCMU_CHSPEC_D11N_BND_5G;57}5859static u16 d11ac_bw(enum brcmu_chan_bw bw)60{61switch (bw) {62case BRCMU_CHAN_BW_20:63return BRCMU_CHSPEC_D11AC_BW_20;64case BRCMU_CHAN_BW_40:65return BRCMU_CHSPEC_D11AC_BW_40;66case BRCMU_CHAN_BW_80:67return BRCMU_CHSPEC_D11AC_BW_80;68case BRCMU_CHAN_BW_160:69return BRCMU_CHSPEC_D11AC_BW_160;70default:71WARN_ON(1);72}73return 0;74}7576static void brcmu_d11ac_encchspec(struct brcmu_chan *ch)77{78if (ch->bw == BRCMU_CHAN_BW_20 || ch->sb == BRCMU_CHAN_SB_NONE)79ch->sb = BRCMU_CHAN_SB_L;8081brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_CH_MASK,82BRCMU_CHSPEC_CH_SHIFT, ch->chnum);83brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,84BRCMU_CHSPEC_D11AC_SB_SHIFT, ch->sb);85brcmu_maskset16(&ch->chspec, BRCMU_CHSPEC_D11AC_BW_MASK,860, d11ac_bw(ch->bw));8788ch->chspec &= ~BRCMU_CHSPEC_D11AC_BND_MASK;89if (ch->chnum <= CH_MAX_2G_CHANNEL)90ch->chspec |= BRCMU_CHSPEC_D11AC_BND_2G;91else92ch->chspec |= BRCMU_CHSPEC_D11AC_BND_5G;93}9495static void brcmu_d11n_decchspec(struct brcmu_chan *ch)96{97u16 val;9899ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK);100ch->control_ch_num = ch->chnum;101102switch (ch->chspec & BRCMU_CHSPEC_D11N_BW_MASK) {103case BRCMU_CHSPEC_D11N_BW_20:104ch->bw = BRCMU_CHAN_BW_20;105ch->sb = BRCMU_CHAN_SB_NONE;106break;107case BRCMU_CHSPEC_D11N_BW_40:108ch->bw = BRCMU_CHAN_BW_40;109val = ch->chspec & BRCMU_CHSPEC_D11N_SB_MASK;110if (val == BRCMU_CHSPEC_D11N_SB_L) {111ch->sb = BRCMU_CHAN_SB_L;112ch->control_ch_num -= CH_10MHZ_APART;113} else {114ch->sb = BRCMU_CHAN_SB_U;115ch->control_ch_num += CH_10MHZ_APART;116}117break;118default:119WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);120break;121}122123switch (ch->chspec & BRCMU_CHSPEC_D11N_BND_MASK) {124case BRCMU_CHSPEC_D11N_BND_5G:125ch->band = BRCMU_CHAN_BAND_5G;126break;127case BRCMU_CHSPEC_D11N_BND_2G:128ch->band = BRCMU_CHAN_BAND_2G;129break;130default:131WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);132break;133}134}135136static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)137{138u16 val;139140ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK);141ch->control_ch_num = ch->chnum;142143switch (ch->chspec & BRCMU_CHSPEC_D11AC_BW_MASK) {144case BRCMU_CHSPEC_D11AC_BW_20:145ch->bw = BRCMU_CHAN_BW_20;146ch->sb = BRCMU_CHAN_SB_NONE;147break;148case BRCMU_CHSPEC_D11AC_BW_40:149ch->bw = BRCMU_CHAN_BW_40;150val = ch->chspec & BRCMU_CHSPEC_D11AC_SB_MASK;151if (val == BRCMU_CHSPEC_D11AC_SB_L) {152ch->sb = BRCMU_CHAN_SB_L;153ch->control_ch_num -= CH_10MHZ_APART;154} else if (val == BRCMU_CHSPEC_D11AC_SB_U) {155ch->sb = BRCMU_CHAN_SB_U;156ch->control_ch_num += CH_10MHZ_APART;157} else {158WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);159}160break;161case BRCMU_CHSPEC_D11AC_BW_80:162ch->bw = BRCMU_CHAN_BW_80;163ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,164BRCMU_CHSPEC_D11AC_SB_SHIFT);165switch (ch->sb) {166case BRCMU_CHAN_SB_LL:167ch->control_ch_num -= CH_30MHZ_APART;168break;169case BRCMU_CHAN_SB_LU:170ch->control_ch_num -= CH_10MHZ_APART;171break;172case BRCMU_CHAN_SB_UL:173ch->control_ch_num += CH_10MHZ_APART;174break;175case BRCMU_CHAN_SB_UU:176ch->control_ch_num += CH_30MHZ_APART;177break;178default:179WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);180break;181}182break;183case BRCMU_CHSPEC_D11AC_BW_160:184ch->bw = BRCMU_CHAN_BW_160;185ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,186BRCMU_CHSPEC_D11AC_SB_SHIFT);187switch (ch->sb) {188case BRCMU_CHAN_SB_LLL:189ch->control_ch_num -= CH_70MHZ_APART;190break;191case BRCMU_CHAN_SB_LLU:192ch->control_ch_num -= CH_50MHZ_APART;193break;194case BRCMU_CHAN_SB_LUL:195ch->control_ch_num -= CH_30MHZ_APART;196break;197case BRCMU_CHAN_SB_LUU:198ch->control_ch_num -= CH_10MHZ_APART;199break;200case BRCMU_CHAN_SB_ULL:201ch->control_ch_num += CH_10MHZ_APART;202break;203case BRCMU_CHAN_SB_ULU:204ch->control_ch_num += CH_30MHZ_APART;205break;206case BRCMU_CHAN_SB_UUL:207ch->control_ch_num += CH_50MHZ_APART;208break;209case BRCMU_CHAN_SB_UUU:210ch->control_ch_num += CH_70MHZ_APART;211break;212default:213WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);214break;215}216break;217case BRCMU_CHSPEC_D11AC_BW_8080:218default:219WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);220break;221}222223switch (ch->chspec & BRCMU_CHSPEC_D11AC_BND_MASK) {224case BRCMU_CHSPEC_D11AC_BND_5G:225ch->band = BRCMU_CHAN_BAND_5G;226break;227case BRCMU_CHSPEC_D11AC_BND_2G:228ch->band = BRCMU_CHAN_BAND_2G;229break;230default:231WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);232break;233}234}235236void brcmu_d11_attach(struct brcmu_d11inf *d11inf)237{238if (d11inf->io_type == BRCMU_D11N_IOTYPE) {239d11inf->encchspec = brcmu_d11n_encchspec;240d11inf->decchspec = brcmu_d11n_decchspec;241} else {242d11inf->encchspec = brcmu_d11ac_encchspec;243d11inf->decchspec = brcmu_d11ac_decchspec;244}245}246EXPORT_SYMBOL(brcmu_d11_attach);247248249