37#include <sys/sysctl.h>
38#include <sys/malloc.h>
41#include <sys/kernel.h>
44#include <sys/endian.h>
46#include <sys/linker.h>
47#include <sys/firmware.h>
49#include <machine/bus.h>
54#include <sys/socket.h>
55#include <sys/sockio.h>
72#define MWL_CMDBUF_SIZE 0x4000
73#define MWL_BASTREAMS_MAX 7
74#define MWL_BAQID_MAX 8
75#define MWL_MBSS_AP_MAX 8
76#define MWL_MBSS_STA_MAX 24
77#define MWL_MBSS_MAX (MWL_MBSS_AP_MAX+MWL_MBSS_STA_MAX)
87#if MWL_BASTREAMS_MAX == 7
93#define IEEE80211_ADDR_LEN 6
94#define IEEE80211_ADDR_COPY(_dst, _src) \
95 memcpy(_dst, _src, IEEE80211_ADDR_LEN)
96#define IEEE80211_ADDR_EQ(_dst, _src) \
97 (memcmp(_dst, _src, IEEE80211_ADDR_LEN) == 0)
99#define _CMD_SETUP(pCmd, type, cmd) do { \
100 pCmd = (type *)&mh->mh_cmdbuf[0]; \
101 memset(pCmd, 0, sizeof(type)); \
102 pCmd->CmdHdr.Cmd = htole16(cmd); \
103 pCmd->CmdHdr.Length = htole16(sizeof(type)); \
106#define _VCMD_SETUP(vap, pCmd, type, cmd) do { \
107 _CMD_SETUP(pCmd, type, cmd); \
108 pCmd->CmdHdr.MacId = vap->macid; \
111#define PWTAGETRATETABLE20M 14*4
112#define PWTAGETRATETABLE40M 9*4
113#define PWTAGETRATETABLE20M_5G 35*4
114#define PWTAGETRATETABLE40M_5G 16*4
134#define MVF_RUNNING 0x01
135#define MVF_STATION 0x02
138#define MWLVAP(_vap) ((_vap)->mh)
164#define MHF_CALDATA 0x0001
165#define MHF_FWHANG 0x0002
166#define MHF_MBSS 0x0004
183#define MWLPRIV(_mh) ((struct mwl_hal_priv *)(_mh))
195static SYSCTL_NODE(_hw_mwl, OID_AUTO, hal, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
196 "Marvell HAL parameters");
207 mtx_assert(&mh->
mh_mtx, MA_OWNED);
216static __inline uint32_t
231 bus_addr_t *paddr = (bus_addr_t*) arg;
232 KASSERT(error == 0, (
"error %u on bus_dma callback", error));
233 *paddr = segs->ds_addr;
246 bus_space_handle_t ioh, bus_space_tag_t iot, bus_dma_tag_t tag)
252 mh = malloc(
sizeof(
struct mwl_hal_priv), M_DEVBUF, M_NOWAIT | M_ZERO);
265 device_printf(dev,
"unexpected BA tx qid %d for "
273 hvap->
bss_type = htole16(WL_MAC_TYPE_PRIMARY_AP);
278 hvap->
bss_type = htole16(WL_MAC_TYPE_SECONDARY_AP);
283 hvap->
bss_type = htole16(WL_MAC_TYPE_PRIMARY_CLIENT);
288 hvap->
bss_type = htole16(WL_MAC_TYPE_SECONDARY_CLIENT);
293 "%s_hal", device_get_nameunit(dev));
301 error = bus_dma_tag_create(tag,
303 BUS_SPACE_MAXADDR_32BIT,
314 device_printf(dev,
"unable to allocate memory for cmd tag, "
315 "error %u\n", error);
321 BUS_DMA_NOWAIT | BUS_DMA_COHERENT,
324 device_printf(dev,
"unable to allocate memory for cmd buffer, "
325 "error %u\n", error);
334 device_printf(dev,
"unable to load cmd buffer, error %u\n",
376 bus_dma_tag_destroy(mh->
mh_dmat);
422 if (vap->
vap_type == type && vap->
mh == NULL) {
488 if (cause == 0xffffffff) {
489device_printf(mh->
mh_dev,
"%s: cause 0x%x\n", __func__, cause);
491 }
else if (cause != 0) {
547 device_printf(mh->
mh_dev,
"cmd done interrupt:\n");
563 HostCmd_DS_GET_HW_SPEC *pCmd;
569 pCmd->ulFwAwakeCookie = htole32((
unsigned int)mh->
mh_cmdaddr+2048);
574 hw->
wcbBase[0] = le32toh(pCmd->WcbBase0) & 0x0000ffff;
575 hw->
wcbBase[1] = le32toh(pCmd->WcbBase1[0]) & 0x0000ffff;
576 hw->
wcbBase[2] = le32toh(pCmd->WcbBase1[1]) & 0x0000ffff;
577 hw->
wcbBase[3] = le32toh(pCmd->WcbBase1[2]) & 0x0000ffff;
578 hw->
rxDescRead = le32toh(pCmd->RxPdRdPtr)& 0x0000ffff;
579 hw->
rxDescWrite = le32toh(pCmd->RxPdWrPtr)& 0x0000ffff;
580 hw->
regionCode = le16toh(pCmd->RegionCode) & 0x00ff;
611 HostCmd_DS_SET_HW_SPEC *pCmd;
616 pCmd->WcbBase[0] = htole32(dma->
wcbBase[0]);
617 pCmd->WcbBase[1] = htole32(dma->
wcbBase[1]);
618 pCmd->WcbBase[2] = htole32(dma->
wcbBase[2]);
619 pCmd->WcbBase[3] = htole32(dma->
wcbBase[3]);
620 pCmd->TxWcbNumPerQueue = htole32(dma->
maxNumTxWcb);
621 pCmd->NumTxQueues = htole32(dma->
maxNumWCB);
622 pCmd->TotalRxWcb = htole32(1);
625#ifdef MWL_HOST_PS_SUPPORT
652 HostCmd_DS_802_11_GET_STAT *pCmd;
661 const uint32_t *sp = (
const uint32_t *)&pCmd->TxRetrySuccesses;
665 for (i = 0; i <
sizeof(*stats)/
sizeof(uint32_t); i++)
666 dp[i] = le32toh(sp[i]);
695 HostCmd_FW_HT_GUARD_INTERVAL *pCmd;
699 _VCMD_SETUP(vap, pCmd, HostCmd_FW_HT_GUARD_INTERVAL,
705 }
else if (GIType == 1) {
725 HostCmd_DS_802_11_RADIO_CONTROL *pCmd;
729 _CMD_SETUP(pCmd, HostCmd_DS_802_11_RADIO_CONTROL,
735 pCmd->Control = htole16(preamble);
736 pCmd->RadioOn = htole16(onoff);
762 pCmd->
Action = htole16(dirSet);
781 HostCmd_DS_802_11_RTS_THSD *pCmd;
788 pCmd->Threshold = htole16(threshold);
802 HostCmd_FW_SET_INFRA_MODE *pCmd;
821 HostCmd_802_11h_Detect_Radar *pCmd;
825 _CMD_SETUP(pCmd, HostCmd_802_11h_Detect_Radar,
827 pCmd->CmdHdr.Length = htole16(
sizeof(HostCmd_802_11h_Detect_Radar));
828 pCmd->Action = htole16(action);
830 pCmd->RadarTypeCode = htole16(131);
890 HostCmd_SET_SWITCH_CHANNEL *pCmd;
896 pCmd->Next11hChannel = htole32(nextchan->
channel);
897 pCmd->Mode = htole32(mode);
898 pCmd->InitialCount = htole32(count+1);
913 HostCmd_SET_REGIONCODE_INFO *pCmd;
920 switch (regionCode) {
925 pCmd->regionCode = htole16(regionCode);
936#define RATEVAL(r) ((r) &~ RATE_MCS)
937#define RATETYPE(r) (((r) & RATE_MCS) ? HT_RATE_TYPE : LEGACY_RATE_TYPE)
944 HostCmd_FW_USE_FIXED_RATE *pCmd;
945 FIXED_RATE_ENTRY *fp;
956 memset(pCmd->FixedRateTable, 0,
sizeof(pCmd->FixedRateTable));
960 fp = pCmd->FixedRateTable;
963 fp->FixRateTypeFlags.FixRateType =
965 pCmd->EntryCount = htole32(1);
970 fp = pCmd->FixedRateTable;
971 for (i = 0; i < 4; i++) {
974 fp->FixRateTypeFlags.FixRateType =
978 fp->FixRateTypeFlags.RetryCountValid =
984 pCmd->EntryCount = htole32(n);
997 HostCmd_FW_USE_FIXED_RATE *pCmd;
1008 memset(pCmd->FixedRateTable, 0,
sizeof(pCmd->FixedRateTable));
1023 HostCmd_FW_SET_SLOT *pCmd;
1026 if (usecs != 9 && usecs != 20)
1033 pCmd->Slot = (usecs == 9 ? 1 : 0);
1044 HostCmd_DS_802_11_RF_TX_POWER *pCmd;
1048 _CMD_SETUP(pCmd, HostCmd_DS_802_11_RF_TX_POWER,
1054 }
else if (level >= 30 && level < 60) {
1065static const struct mwl_hal_channel *
1068 const struct mwl_hal_channel *hc;
1081 hc = ((unsigned)i < ci->nchannels) ? &ci->
channels[i] : NULL;
1103 HostCmd_DS_802_11_RF_TX_POWER *pCmd;
1104 const struct mwl_hal_channel *hc;
1110 device_printf(mh->
mh_dev,
1111 "%s: no cal data for channel %u band %u width %u ext %u\n",
1118 _CMD_SETUP(pCmd, HostCmd_DS_802_11_RF_TX_POWER,
1124 pCmd->PowerLevelList[i++] = htole16(hc->targetPowers[0]);
1125 for (; i < 4; i++) {
1126 uint16_t pow = hc->targetPowers[i];
1129 pCmd->PowerLevelList[i] = htole16(pow);
1153 return ((*ci)->freqLow == (*ci)->freqHigh) ? EINVAL : 0;
1160 HostCmd_DS_MAC_MULTICAST_ADR *pCmd;
1167 _CMD_SETUP(pCmd, HostCmd_DS_MAC_MULTICAST_ADR,
1170 pCmd->NumOfAdrs = htole16(nmc);
1171 pCmd->Action = htole16(0xffff);
1183 HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY *pCmd;
1187 _VCMD_SETUP(vap, pCmd, HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY,
1193 pCmd->KeyParam.Length = htole16(
sizeof(pCmd->KeyParam));
1194 pCmd->KeyParam.KeyTypeId = htole16(kv->keyTypeId);
1195 pCmd->KeyParam.KeyInfo = htole32(kv->keyFlags);
1196 pCmd->KeyParam.KeyIndex = htole32(kv->keyIndex);
1198 memcpy(&pCmd->KeyParam.Key, &kv->key, kv->keyLen);
1199 switch (kv->keyTypeId) {
1201 pCmd->KeyParam.KeyLen = htole16(kv->keyLen);
1204 pCmd->KeyParam.KeyLen = htole16(
sizeof(TKIP_TYPE_KEY));
1205 pCmd->KeyParam.Key.TkipKey.TkipRsc.low =
1206 htole16(kv->key.tkip.rsc.low);
1207 pCmd->KeyParam.Key.TkipKey.TkipRsc.high =
1208 htole32(kv->key.tkip.rsc.high);
1209 pCmd->KeyParam.Key.TkipKey.TkipTsc.low =
1210 htole16(kv->key.tkip.tsc.low);
1211 pCmd->KeyParam.Key.TkipKey.TkipTsc.high =
1212 htole32(kv->key.tkip.tsc.high);
1215 pCmd->KeyParam.KeyLen = htole16(
sizeof(AES_TYPE_KEY));
1218#ifdef MWL_MBSS_SUPPORT
1232 HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY *pCmd;
1236 _VCMD_SETUP(vap, pCmd, HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY,
1239 pCmd->KeyParam.Length = htole16(
sizeof(pCmd->KeyParam));
1240 pCmd->KeyParam.KeyTypeId = htole16(kv->keyTypeId);
1241 pCmd->KeyParam.KeyInfo = htole32(kv->keyFlags);
1242 pCmd->KeyParam.KeyIndex = htole32(kv->keyIndex);
1243#ifdef MWL_MBSS_SUPPORT
1258 HostCmd_DS_SET_MAC *pCmd;
1262#ifdef MWL_MBSS_SUPPORT
1285 HostCmd_DS_SET_BEACON *pCmd;
1292 pCmd->CmdHdr.Length = htole16(
sizeof(HostCmd_DS_SET_BEACON)-1+frameLen);
1293 pCmd->FrmBodyLen = htole16(frameLen);
1294 memcpy(pCmd->FrmBody, frame, frameLen);
1305 HostCmd_SET_POWERSAVESTATION *pCmd;
1309 _VCMD_SETUP(vap, pCmd, HostCmd_SET_POWERSAVESTATION,
1311 pCmd->NumberOfPowersave = nsta;
1322 HostCmd_SET_TIM *pCmd;
1327 pCmd->Aid = htole16(aid);
1328 pCmd->Set = htole32(ena);
1340 HostCmd_FW_SET_AID *pCmd = (HostCmd_FW_SET_AID *) &mh->
mh_cmdbuf[0];
1345 pCmd->AssocID = htole16(assocId);
1357 HostCmd_FW_SET_RF_CHANNEL *pCmd;
1363 pCmd->CurrentChannel = chan->
channel;
1374 uint8_t Tid, uint8_t ParamInfo)
1377 HostCmd_FW_BASTREAM *pCmd;
1384 pCmd->BaInfo.CreateParams.BarThrs = htole32(63);
1385 pCmd->BaInfo.CreateParams.WindowSize = htole32(64);
1386 pCmd->BaInfo.CreateParams.IdleThrs = htole32(0x22000);
1388 pCmd->BaInfo.CreateParams.DialogToken = 10;
1389 pCmd->BaInfo.CreateParams.Tid = Tid;
1390 pCmd->BaInfo.CreateParams.QueueId = qid;
1391 pCmd->BaInfo.CreateParams.ParamInfo = (uint8_t) ParamInfo;
1393 cvtBAFlags(&pCmd->BaInfo.CreateParams.Flags, sp->ba_policy, 0);
1395 pCmd->BaInfo.CreateParams.Flags =
1417 uint8_t Tid, uint8_t ParamInfo,
void *a1,
void *a2)
1461#define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var))
1470 HostCmd_FW_BASTREAM *pCmd;
1476 pCmd->BaInfo.CreateParams.BarThrs = htole32(BarThrs);
1477 pCmd->BaInfo.CreateParams.WindowSize = htole32(WindowSize);
1478 pCmd->BaInfo.CreateParams.IdleThrs = htole32(0x22000);
1484 pCmd->BaInfo.CreateParams.DialogToken = DialogToken;
1486 pCmd->BaInfo.CreateParams.DialogToken = 10;
1488 pCmd->BaInfo.CreateParams.Tid = sp->
tid;
1489 pCmd->BaInfo.CreateParams.QueueId = sp->
stream;
1490 pCmd->BaInfo.CreateParams.ParamInfo = sp->
paraminfo;
1492 pCmd->BaInfo.CreateParams.StartSeqNo = htole16(seqno);
1494 cvtBAFlags(&pCmd->BaInfo.CreateParams.Flags, sp->
ba_policy, 0);
1496 pCmd->BaInfo.CreateParams.Flags =
1523 HostCmd_FW_BASTREAM *pCmd;
1534 pCmd->BaInfo.DestroyParams.FwBaContext.Context =
1556 HostCmd_GET_SEQNO *pCmd;
1562 pCmd->TID = sp->
tid;
1566 *pseqno = le16toh(pCmd->SeqNo);
1575 HostCmd_FW_GET_WATCHDOG_BITMAP *pCmd;
1579 _CMD_SETUP(pCmd, HostCmd_FW_GET_WATCHDOG_BITMAP,
1584 bitmap[0] = pCmd->Watchdogbitmap;
1587 bitmap[0] =
qid2ba[bitmap[0]];
1600 HostCmd_FW_AMPDU_RETRY_RATEDROP_MODE *pCmd;
1604 _CMD_SETUP(pCmd, HostCmd_FW_AMPDU_RETRY_RATEDROP_MODE,
1606 pCmd->Action = htole16(1);
1607 pCmd->Option = htole32(mode);
1608 pCmd->Threshold = htole32(threshold);
1619 HostCmd_FW_AMPDU_RETRY_RATEDROP_MODE *pCmd;
1623 _CMD_SETUP(pCmd, HostCmd_FW_AMPDU_RETRY_RATEDROP_MODE,
1625 pCmd->Action = htole16(0);
1629 *mode = le32toh(pCmd->Option);
1630 *threshold = le32toh(pCmd->Threshold);
1641 HostCmd_CFEND_ENABLE *pCmd;
1647 pCmd->Enable = htole32(ena);
1657 HostCmd_DWDS_ENABLE *pCmd;
1663 pCmd->Enable = htole32(ena);
1672 to->LegacyRateBitMap = htole32(from->LegacyRateBitMap);
1673 to->HTRateBitMap = htole32(from->HTRateBitMap);
1674 to->CapInfo = htole16(from->CapInfo);
1675 to->HTCapabilitiesInfo = htole16(from->HTCapabilitiesInfo);
1676 to->MacHTParamInfo = from->MacHTParamInfo;
1677 to->AddHtInfo.ControlChan = from->AddHtInfo.ControlChan;
1678 to->AddHtInfo.AddChan = from->AddHtInfo.AddChan;
1679 to->AddHtInfo.OpMode = htole16(from->AddHtInfo.OpMode);
1680 to->AddHtInfo.stbc = htole16(from->AddHtInfo.stbc);
1687 const MWL_HAL_PEERINFO *peer,
int isQosSta,
int wmeInfo)
1690 HostCmd_FW_SET_NEW_STN *pCmd;
1695 pCmd->AID = htole16(aid);
1696 pCmd->StnId = htole16(sid);
1697 pCmd->Action = htole16(0);
1703 pCmd->Qosinfo = wmeInfo;
1704 pCmd->isQosSta = (isQosSta != 0);
1718 HostCmd_FW_SET_NEW_STN *pCmd;
1719 int retval, islocal;
1726 pCmd->Action = htole16(2);
1730 vap->
flags &= ~MVF_STATION;
1745 HostCmd_FW_SET_KEEP_ALIVE_TICK *pCmd;
1749 _CMD_SETUP(pCmd, HostCmd_FW_SET_KEEP_ALIVE_TICK,
1766 HostCmd_FW_SET_APMODE *pCmd;
1773 pCmd->ApMode = ApMode;
1784 HostCmd_DS_BSS_START *pCmd;
1796 vap->
flags &= ~MVF_RUNNING;
1805 HostCmd_DS_BSS_START *pCmd;
1823 HostCmd_FW_SET_G_PROTECT_FLAG *pCmd;
1827 _CMD_SETUP(pCmd, HostCmd_FW_SET_G_PROTECT_FLAG,
1829 pCmd->GProtectFlag = htole32(prot);
1840 HostCmd_FW_SetWMMMode *pCmd;
1846 pCmd->Action = htole16(onoff);
1855 uint32_t CWmin, uint32_t CWmax, uint8_t AIFSN, uint16_t TXOPLimit)
1858 HostCmd_FW_SET_EDCA_PARAMS *pCmd;
1869 pCmd->Action = htole16(0xffff);
1870 pCmd->TxOP = htole16(TXOPLimit);
1871 pCmd->CWMax = htole32(CWmax);
1872 pCmd->CWMin = htole32(CWmin);
1873 pCmd->AIFSN = AIFSN;
1874 pCmd->TxQNum = qnum;
1886 HostCmd_DS_SET_RATE_ADAPT_MODE *pCmd;
1890 _CMD_SETUP(pCmd, HostCmd_DS_SET_RATE_ADAPT_MODE,
1893 pCmd->RateAdaptMode = htole16(mode);
1904 HostCmd_DS_SET_LINKADAPT_CS_MODE *pCmd;
1908 _CMD_SETUP(pCmd, HostCmd_DS_SET_LINKADAPT_CS_MODE,
1911 pCmd->CSMode = htole16(csmode);
1922 HostCmd_FW_SET_N_PROTECT_FLAG *pCmd;
1927 _VCMD_SETUP(vap, pCmd, HostCmd_FW_SET_N_PROTECT_FLAG,
1929 pCmd->NProtectFlag = htole32(mode);
1940 HostCmd_FW_SET_N_PROTECT_OPMODE *pCmd;
1944 _VCMD_SETUP(vap, pCmd, HostCmd_FW_SET_N_PROTECT_OPMODE,
1946 pCmd->NProtectOpMode = mode;
1957 HostCmd_FW_SET_OPTIMIZATION_LEVEL *pCmd;
1961 _CMD_SETUP(pCmd, HostCmd_FW_SET_OPTIMIZATION_LEVEL,
1963 pCmd->OptLevel = level;
1972 uint8_t enable, uint8_t mode)
1975 HostCmd_FW_SET_MIMOPSHT *pCmd;
1981 pCmd->Enable = enable;
1992 HostCmd_FW_GET_CALTABLE *pCmd;
1998 pCmd->annex = annex;
1999 pCmd->index = index;
2000 memset(pCmd->calTbl, 0,
sizeof(pCmd->calTbl));
2004 pCmd->calTbl[0] != annex && annex != 0 && annex != 255)
2015 hc->maxTxPow = hc->targetPowers[i];
2016 for (i++; i < maxix; i++)
2017 if (hc->targetPowers[i] > hc->maxTxPow)
2018 hc->maxTxPow = hc->targetPowers[i];
2032 for (i = 0; i < len; i += 4) {
2033 struct mwl_hal_channel *hc;
2037 f = 5000 + 5*table[i];
2044 hc->ieee = table[i];
2045 memcpy(hc->targetPowers, &table[i], 4);
2050 ci->
freqLow = (l == 32000) ? 0 : l;
2060 return 2407 + chan*5;
2061 return 2512 + (chan-15)*20;
2073 for (i = 0; i < len; i += 4) {
2074 struct mwl_hal_channel *hc = &ci->
channels[j];
2077 memcpy(hc->targetPowers, &table[i], 4);
2089dumpcaldata(
const char *name,
const uint8_t *table,
int n)
2092 printf(
"\n%s:\n", name);
2093 for (i = 0; i < n; i += 4)
2094 printf(
"[%2d] %3d %3d %3d %3d\n", i/4, table[i+0], table[i+1], table[i+2], table[i+3]);
2101 const uint8_t *data;
2107 data = ((
const HostCmd_FW_GET_CALTABLE *) mh->
mh_cmdbuf)->calTbl;
2109 len = (data[2] | (data[3] << 8)) - 12;
2113dumpcaldata(
"2.4G 20M", &data[12], len);
2118 len = (data[2] | (data[3] << 8)) - 12;
2122dumpcaldata(
"2.4G 40M", &data[12], len);
2128 len = (data[2] | (data[3] << 8)) - 20;
2132dumpcaldata(
"5G 20M", &data[20], len);
2137 len = (data[2] | (data[3] << 8)) - 20;
2141dumpcaldata(
"5G 40M", &data[20], len);
2160 const HostCmd_FW_GET_CALTABLE *pCmd =
2161 (
const HostCmd_FW_GET_CALTABLE *) mh->
mh_cmdbuf;
2162 *countryCode = pCmd->calTbl[16];
2190 return (v & 1) != 0;
2197 HostCmd_FW_GET_BEACON *pCmd;
2202 pCmd->Bcnlen = htole16(0);
2207 memcpy(pBcn, &pCmd->Bcn, pCmd->Bcnlen);
2208 *pLen = pCmd->Bcnlen;
2218 HostCmd_FW_SET_RIFS *pCmd;
2237 HostCmd_DS_RF_REG_ACCESS *pCmd;
2242 pCmd->Offset = htole16(reg);
2243 pCmd->Action = htole16(flag);
2244 pCmd->Value = htole32(*val);
2256 HostCmd_DS_BBP_REG_ACCESS *pCmd;
2261 pCmd->Offset = htole16(reg);
2262 pCmd->Action = htole16(flag);
2263 pCmd->Value = htole32(*val);
2274 void *dstbuf,
int space)
2276 uint32_t *dp = dstbuf;
2279 for (i = 0; space >= 2*
sizeof(uint32_t); i++) {
2280 u_int r = regs[i].
start;
2281 u_int e = regs[i].
end;
2282 *dp++ = (r<<16) | e;
2283 space -=
sizeof(uint32_t);
2298 r +=
sizeof(uint32_t);
2299 space -=
sizeof(uint32_t);
2300 }
while (r <= e && space >=
sizeof(uint32_t));
2302 return (
char *) dp - (
char *) dstbuf;
2307 const void *args, uint32_t argsize,
2308 void **result, uint32_t *resultsize)
2315 *resultsize =
sizeof(mh->
mh_revs);
2321 FWCmdHdr *pCmd = (FWCmdHdr *) &mh->
mh_cmdbuf[0];
2325 memcpy(pCmd, args, argsize);
2327 *result = (*resultsize != 0) ? pCmd : NULL;
2329 return (retval == 0);
2333 device_printf(mh->
mh_dev,
"problem loading fw image\n");
2351 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2362#define MAX_WAIT_FW_COMPLETE_ITERATIONS 10000
2366 if (mh->
mh_cmdbuf[0] == le16toh(cmdCode))
2371#undef MAX_WAIT_FW_COMPLETE_ITERATIONS
2383 device_printf(mh->
mh_dev,
"firmware hung, skipping cmd %s\n",
2386 device_printf(mh->
mh_dev,
"firmware hung, skipping cmd 0x%x\n",
2392 device_printf(mh->
mh_dev,
"%s: device not present!\n",
2403 device_printf(mh->
mh_dev,
2404 "timeout waiting for f/w cmd %s\n",
mwlcmdname(cmd));
2406 device_printf(mh->
mh_dev,
2407 "timeout waiting for f/w cmd 0x%x\n", cmd);
2413 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2424#define FW_DOWNLOAD_BLOCK_SIZE 256
2425#define FW_CHECK_USECS (5*1000)
2426#define FW_MAX_NUM_CHECKS 200
2430#include <dev/mwl/mwlbootfw.h>
2431#include <dev/mwl/mwl88W8363fw.h>
2438 device_printf(mh->
mh_dev,
"%s: device not present!\n",
2484 memcpy(&mh->
mh_cmdbuf[4], data , dsize);
2491 device_printf(mh->
mh_dev,
2492 "%s: timeout waiting for CMD_FINISHED, INT_CODE 0x%x\n",
2509 device_printf(mh->
mh_dev,
2510 "%s: timeout waiting for CMD_FINISHED, INT_CODE 0x%x\n",
2519 WR4(mh, 0x00006014, 0x33);
2520 WR4(mh, 0x00006018, 0xa3a2632);
2521 WR4(mh, 0x00006010, SDRAMSIZE_Addr);
2528 const char *fwname =
"mw88W8363fw";
2529 const char *fwbootname =
"mwlboot";
2530 const struct firmware *fwboot = NULL;
2531 const struct firmware *fw;
2535 const uint8_t *fp, *ep;
2536 const uint8_t *fmdata;
2537 uint32_t blocksize, nbytes, fmsize;
2538 int i, error, ntries;
2540 fw = firmware_get(fwname);
2542 device_printf(mh->
mh_dev,
2543 "could not load firmware image %s\n", fwname);
2547 fmsize = fw->datasize;
2549 device_printf(mh->
mh_dev,
"firmware image %s too small\n",
2554 if (fmdata[0] == 0x01 && fmdata[1] == 0x00 &&
2555 fmdata[2] == 0x00 && fmdata[3] == 0x00) {
2559 fwboot = firmware_get(fwbootname);
2560 if (fwboot == NULL) {
2561 device_printf(mh->
mh_dev,
2562 "could not load firmware image %s\n", fwbootname);
2579 device_printf(mh->
mh_dev,
"load %s firmware image (%u bytes)\n",
2581 if (fwboot != NULL) {
2592 if (!
mwlSendBlock(mh, fwboot->datasize, fwboot->data, fwboot->datasize) ||
2602 nbytes = ntries = 0;
2603 for (fp = fmdata, ep = fp + fmsize; fp < ep; ) {
2608 if (blocksize > 0x00000c00) {
2612 if ((blocksize & 0x1) == 0) {
2628 if (blocksize > ep - fp) {
2630 blocksize = ep - fp;
2639 for (fp = fmdata, ep = fp + fmsize; fp < ep;) {
2652 firmware_put(fwboot, FIRMWARE_UNLOAD);
2653 firmware_put(fw, FIRMWARE_UNLOAD);
2679 firmware_put(fwboot, FIRMWARE_UNLOAD);
2680 firmware_put(fw, FIRMWARE_UNLOAD);
2688 static char buf[12];
2689#define CMD(x) case HostCmd_CMD_##x: return #x
2694 CMD(MAC_MULTICAST_ADR);
2695 CMD(802_11_GET_STAT);
2696 CMD(MAC_REG_ACCESS);
2697 CMD(BBP_REG_ACCESS);
2699 CMD(802_11_RADIO_CONTROL);
2700 CMD(802_11_RF_TX_POWER);
2701 CMD(802_11_RF_ANTENNA);
2703 CMD(SET_RF_CHANNEL);
2705 CMD(SET_INFRA_MODE);
2706 CMD(SET_G_PROTECT_FLAG);
2707 CMD(802_11_RTS_THSD);
2708 CMD(802_11_SET_SLOT);
2709 CMD(SET_EDCA_PARAMS);
2710 CMD(802_11H_DETECT_RADAR);
2712 CMD(HT_GUARD_INTERVAL);
2713 CMD(SET_FIXED_RATE);
2714 CMD(SET_LINKADAPT_CS_MODE);
2716 CMD(SET_RATE_ADAPT_MODE);
2719 CMD(SET_KEEP_ALIVE);
2721 CMD(SET_SWITCH_CHANNEL);
2722 CMD(UPDATE_ENCRYPTION);
2725 CMD(SET_N_PROTECT_FLAG);
2726 CMD(SET_N_PROTECT_OPMODE);
2727 CMD(SET_OPTIMIZATION_LEVEL);
2731 CMD(SET_REGION_CODE);
2732 CMD(SET_POWERSAVESTATION);
2737 CMD(AMPDU_RETRY_RATEDROP_MODE);
2740 snprintf(buf,
sizeof(buf),
"0x%x", cmd);
2748 const FWCmdHdr *h = (
const FWCmdHdr *)mh->
mh_cmdbuf;
2752 len = le16toh(h->Length);
2753#ifdef MWL_MBSS_SUPPORT
2754 device_printf(mh->
mh_dev,
"Cmd %s Length %d SeqNum %d MacId %d",
2755 mwlcmdname(le16toh(h->Cmd) &~ 0x8000), len, h->SeqNum, h->MacId);
2757 device_printf(mh->
mh_dev,
"Cmd %s Length %d SeqNum %d",
2758 mwlcmdname(le16toh(h->Cmd) &~ 0x8000), len, le16toh(h->SeqNum));
2761 const char *results[] =
2762 {
"OK",
"ERROR",
"NOT_SUPPORT",
"PENDING",
"BUSY",
2764 int result = le16toh(h->Result);
2767 printf(
" Result %s", results[result]);
2769 printf(
" Result %d", result);
2771 cp = (
const uint8_t *)h;
2772 for (i = 0; i < len; i++) {
2774 printf(
"\n%02x", cp[i]);
2776 printf(
" %02x", cp[i]);
#define MWL_DIAG_ISMAC(r)
int mwl_hal_setwmm(struct mwl_hal *mh0, int onoff)
static int mwlSendBlock2(struct mwl_hal_priv *mh, const void *data, size_t dsize)
#define FW_MAX_NUM_CHECKS
int mwl_hal_settxpower(struct mwl_hal *mh0, const MWL_HAL_CHANNEL *c, uint8_t maxtxpow)
int mwl_hal_fwload(struct mwl_hal *mh0, void *fwargs)
static void get2Ghz(MWL_HAL_CHANNELINFO *ci, const uint8_t table[], int len)
void mwl_hal_intrset(struct mwl_hal *mh0, uint32_t mask)
int mwl_hal_bastream_create(struct mwl_hal_vap *vap, const MWL_HAL_BASTREAM *s, int BarThrs, int WindowSize, uint16_t seqno)
int mwl_hal_delstation(struct mwl_hal_vap *vap, const uint8_t addr[IEEE80211_ADDR_LEN])
int mwl_hal_setradio(struct mwl_hal *mh0, int onoff, MWL_HAL_PREAMBLE preamble)
int mwl_hal_setkeepalive(struct mwl_hal *mh0)
#define IEEE80211_ADDR_EQ(_dst, _src)
static int mwlSendBlock(struct mwl_hal_priv *mh, int bsize, const void *data, size_t dsize)
static void mwlFwReset(struct mwl_hal_priv *mh)
static void dumpresult(struct mwl_hal_priv *, int showresult)
int mwl_hal_ismbsscapable(struct mwl_hal *mh)
int mwl_hal_setaggampduratemode(struct mwl_hal *mh0, int mode, int threshold)
void mwl_hal_detach(struct mwl_hal *mh0)
int mwl_hal_setchannel(struct mwl_hal *mh0, const MWL_HAL_CHANNEL *chan)
int mwl_hal_sethtgi(struct mwl_hal_vap *vap, int GIType)
int mwl_hal_setdwds(struct mwl_hal *mh0, int ena)
void mwl_hal_delvap(struct mwl_hal_vap *vap)
static __inline void WR4(struct mwl_hal_priv *mh, bus_size_t off, uint32_t val)
static int mwl_hal_setmac_locked(struct mwl_hal_vap *, const uint8_t addr[IEEE80211_ADDR_LEN])
int mwl_hal_setmimops(struct mwl_hal *mh0, const uint8_t addr[IEEE80211_ADDR_LEN], uint8_t enable, uint8_t mode)
int mwl_hal_settxrate(struct mwl_hal_vap *vap, MWL_HAL_TXRATE_HANDLING handling, const MWL_HAL_TXRATE *rate)
static __inline void MWL_HAL_UNLOCK(struct mwl_hal_priv *mh)
#define IEEE80211_ADDR_LEN
int mwl_hal_gethwstats(struct mwl_hal *mh0, struct mwl_hal_hwstats *stats)
int mwl_hal_setedcaparams(struct mwl_hal *mh0, uint8_t qnum, uint32_t CWmin, uint32_t CWmax, uint8_t AIFSN, uint16_t TXOPLimit)
static void cvtPeerInfo(PeerInfo_t *to, const MWL_HAL_PEERINFO *from)
#define MAX_WAIT_FW_COMPLETE_ITERATIONS
#define MWL_BASTREAMS_MAX
#define IEEE80211_ADDR_COPY(_dst, _src)
int mwl_hal_getchannelinfo(struct mwl_hal *mh0, int band, int chw, const MWL_HAL_CHANNELINFO **ci)
int mwl_hal_gethwspecs(struct mwl_hal *mh0, struct mwl_hal_hwspec *hw)
@ WL_TX_POWERLEVEL_MEDIUM
int mwl_hal_setantenna(struct mwl_hal *mh0, MWL_HAL_ANTENNA dirSet, int ant)
int mwl_hal_setpowersave_bss(struct mwl_hal_vap *vap, uint8_t nsta)
int mwl_hal_getregioncode(struct mwl_hal *mh0, uint8_t *countryCode)
static void get5Ghz(MWL_HAL_CHANNELINFO *ci, const uint8_t table[], int len)
int mwl_hal_getaggampduratemode(struct mwl_hal *mh0, int *mode, int *threshold)
int mwl_hal_getpromisc(struct mwl_hal *mh0)
#define _VCMD_SETUP(vap, pCmd, type, cmd)
int mwl_hal_setradardetection(struct mwl_hal *mh0, MWL_HAL_RADAR action)
static const struct mwl_hal_channel * findchannel(const struct mwl_hal_priv *mh, const MWL_HAL_CHANNEL *c)
int mwl_hal_setmcast(struct mwl_hal *mh0, int nmc, const uint8_t macs[])
#define PWTAGETRATETABLE40M_5G
int mwl_hal_SetRifs(struct mwl_hal *mh0, uint8_t QNum)
void mwl_hal_cmddone(struct mwl_hal *mh0)
int mwl_hal_start(struct mwl_hal_vap *vap)
static int mwlGetPwrCalTable(struct mwl_hal_priv *)
static void mwl_hal_load_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
#define _CMD_SETUP(pCmd, type, cmd)
int mwl_hal_setcfend(struct mwl_hal *mh0, int ena)
int mwl_hal_setcsmode(struct mwl_hal *mh0, MWL_HAL_CSMODE csmode)
int mwl_hal_setinframode(struct mwl_hal_vap *vap)
const MWL_HAL_BASTREAM * mwl_hal_bastream_alloc(struct mwl_hal_vap *vap, int ba_policy, const uint8_t Macaddr[IEEE80211_ADDR_LEN], uint8_t Tid, uint8_t ParamInfo, void *a1, void *a2)
int mwl_hal_setchannelswitchie(struct mwl_hal *mh0, const MWL_HAL_CHANNEL *nextchan, uint32_t mode, uint32_t count)
int mwl_hal_setapmode(struct mwl_hal_vap *vap, MWL_HAL_APMODE ApMode)
static int getBBReg(struct mwl_hal_priv *mh, int flag, uint32_t reg, uint32_t *val)
int mwl_hal_setpowersave_sta(struct mwl_hal_vap *vap, uint16_t aid, int ena)
int mwl_hal_setrateadaptmode(struct mwl_hal *mh0, uint16_t mode)
#define PWTAGETRATETABLE40M
static uint16_t ieee2mhz(int chan)
int mwl_hal_bastream_destroy(struct mwl_hal *mh0, const MWL_HAL_BASTREAM *s)
int mwl_hal_adjusttxpower(struct mwl_hal *mh0, uint32_t level)
static const char * mwlcmdname(int cmd)
static void setmaxtxpow(struct mwl_hal_channel *hc, int i, int maxix)
static __inline uint32_t RD4(struct mwl_hal_priv *mh, bus_size_t off)
static int mwlWaitFor(struct mwl_hal_priv *mh, uint32_t val)
int mwl_hal_setassocid(struct mwl_hal_vap *vap, const uint8_t bssId[IEEE80211_ADDR_LEN], uint16_t assocId)
#define PWTAGETRATETABLE20M
int mwl_hal_setnprot(struct mwl_hal_vap *vap, MWL_HAL_HTPROTECT mode)
static __inline void MWL_HAL_LOCK(struct mwl_hal_priv *mh)
int mwl_hal_setslottime(struct mwl_hal *mh0, int usecs)
int mwl_hal_getdebug(struct mwl_hal *mh)
const MWL_HAL_BASTREAM * mwl_hal_bastream_lookup(struct mwl_hal *mh0, int s)
int mwl_hal_keyreset(struct mwl_hal_vap *vap, const MWL_HAL_KEYVAL *kv, const uint8_t mac[IEEE80211_ADDR_LEN])
int mwl_hal_setrtsthreshold(struct mwl_hal_vap *vap, int threshold)
#define PWTAGETRATETABLE20M_5G
static __inline void MWL_HAL_LOCK_ASSERT(struct mwl_hal_priv *mh)
struct mwl_hal_vap * mwl_hal_newvap(struct mwl_hal *mh0, MWL_HAL_BSSTYPE type, const uint8_t mac[IEEE80211_ADDR_LEN])
int mwl_hal_getdiagstate(struct mwl_hal *mh0, int request, const void *args, uint32_t argsize, void **result, uint32_t *resultsize)
struct mwl_hal * mwl_hal_attach(device_t dev, uint16_t devid, bus_space_handle_t ioh, bus_space_tag_t iot, bus_dma_tag_t tag)
static int getRFReg(struct mwl_hal_priv *mh, int flag, uint32_t reg, uint32_t *val)
static int mwlGetCalTable(struct mwl_hal_priv *mh, uint8_t annex, uint8_t index)
int mwl_hal_setmac(struct mwl_hal_vap *vap, const uint8_t addr[IEEE80211_ADDR_LEN])
int mwl_hal_keyset(struct mwl_hal_vap *vap, const MWL_HAL_KEYVAL *kv, const uint8_t mac[IEEE80211_ADDR_LEN])
int mwl_hal_bastream_get_seqno(struct mwl_hal *mh0, const MWL_HAL_BASTREAM *s, const uint8_t Macaddr[IEEE80211_ADDR_LEN], uint16_t *pseqno)
int mwl_hal_setnprotmode(struct mwl_hal_vap *vap, uint8_t mode)
int mwl_hal_newstation(struct mwl_hal_vap *vap, const uint8_t addr[IEEE80211_ADDR_LEN], uint16_t aid, uint16_t sid, const MWL_HAL_PEERINFO *peer, int isQosSta, int wmeInfo)
void mwl_hal_setbastreams(struct mwl_hal *mh, int mask)
static void mwlSendCmd(struct mwl_hal_priv *mh)
int mwl_hal_getbastreams(struct mwl_hal *mh)
int mwl_hal_stop(struct mwl_hal_vap *vap)
static void mwlTriggerPciCmd(struct mwl_hal_priv *mh)
int mwl_hal_settxrate_auto(struct mwl_hal *mh0, const MWL_HAL_TXRATE *rate)
static uint32_t cvtChannelFlags(const MWL_HAL_CHANNEL *chan)
int mwl_hal_setgprot(struct mwl_hal *mh0, int prot)
#define __DECONST(type, var)
int mwl_hal_GetBeacon(struct mwl_hal *mh0, uint8_t *pBcn, uint16_t *pLen)
int mwl_hal_getwatchdogbitmap(struct mwl_hal *mh0, uint8_t bitmap[1])
static u_int mwl_hal_getregdump(struct mwl_hal_priv *mh, const MWL_DIAG_REGRANGE *regs, void *dstbuf, int space)
int mwl_hal_setregioncode(struct mwl_hal *mh0, int regionCode)
static const int ba2qid[MWL_BASTREAMS_MAX]
static int mwlResetHalState(struct mwl_hal_priv *mh)
int mwl_hal_setpromisc(struct mwl_hal *mh0, int ena)
int mwl_hal_setoptimizationlevel(struct mwl_hal *mh0, int level)
int mwl_hal_sethwdma(struct mwl_hal *mh0, const struct mwl_hal_txrxdma *dma)
int mwl_hal_setbeacon(struct mwl_hal_vap *vap, const void *frame, size_t frameLen)
static SYSCTL_NODE(_hw_mwl, OID_AUTO, hal, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "Marvell HAL parameters")
#define FW_DOWNLOAD_BLOCK_SIZE
static int mwlWaitForCmdComplete(struct mwl_hal_priv *mh, uint16_t cmdCode)
static void mwlPokeSdramController(struct mwl_hal_priv *mh, int SDRAMSIZE_Addr)
void mwl_hal_setdebug(struct mwl_hal *mh, int debug)
static int mwlExecuteCmd(struct mwl_hal_priv *, unsigned short cmd)
static int qid2ba[MWL_BAQID_MAX]
static int bastream_check_available(struct mwl_hal_vap *vap, int qid, const uint8_t Macaddr[IEEE80211_ADDR_LEN], uint8_t Tid, uint8_t ParamInfo)
#define MACREG_REG_H2A_INTERRUPT_EVENTS
#define MWL_FREQ_BAND_2DOT4GHZ
#define MWL_EXT_CH_BELOW_CTRL_CH
#define MWL_CH_20_MHz_WIDTH
#define MWL_FREQ_BAND_5GHZ
#define MACREG_REG_INT_CODE
static __inline void mwl_hal_txstart(struct mwl_hal *mh, int qnum)
#define KEY_FLAG_RXGROUPKEY
#define MWL_CH_40_MHz_WIDTH
static __inline void mwl_hal_getisr(struct mwl_hal *mh, uint32_t *status)
#define MWL_CH_10_MHz_WIDTH
#define MACREG_H2ARIC_BIT_PPA_READY
#define MACREG_REG_A2H_INTERRUPT_CAUSE
#define MWL_EXT_CH_ABOVE_CTRL_CH
#define KEY_FLAG_TXGROUPKEY
#define MWL_HAL_MCAST_MAX
#define HostCmd_CMD_SET_AID
#define HostCmd_SOFTAP_MODE
#define SET_HW_SPEC_HOSTFORM_BEACON
#define HostCmd_CMD_BSS_START
#define HostCmd_CMD_DWDS_ENABLE
#define MACREG_H2ARIC_BIT_DOOR_BELL
#define HostCmd_ACT_GEN_READ
#define HostCmd_CMD_SET_INFRA_MODE
#define MACREG_REG_SCRATCH
#define HostCmd_CMD_SET_EDCA_PARAMS
#define HostCmd_CMD_SET_N_PROTECT_FLAG
#define HostCmd_CMD_GET_HW_SPEC
#define HostCmd_ACT_GEN_SET
#define HostCmd_RESULT_PARTIAL_DATA
#define HostCmd_CMD_BBP_REG_ACCESS
#define FIXED_RATE_WITH_AUTO_RATE_DROP
#define HostCmd_ACT_GEN_OFF
#define HostCmd_CMD_CODE_DNLD
#define HostCmd_RESULT_OK
#define EXT_CH_BELOW_CTRL_CH
#define HostCmd_CMD_SET_LINKADAPT_CS_MODE
#define HostCmd_CMD_SET_FIXED_RATE
#define HostCmd_CMD_CFEND_ENABLE
#define BASTREAM_FLAG_DIRECTION_UPSTREAM
#define HostCmd_ACT_NOT_USE_FIXED_RATE
#define HostCmd_CMD_802_11_RADIO_CONTROL
#define HostCmd_CMD_802_11_RF_ANTENNA
#define HostCmd_CMD_GET_BEACON
#define MACREG_A2HRIC_BIT_MASK
#define SET_HW_SPEC_DISABLEMBSS
#define HostCmd_CMD_GET_CALTABLE
#define HostCmd_CMD_SET_REGION_CODE
#define MACREG_REG_PROMISCUOUS
#define HostCmd_ACT_GEN_SET_LIST
#define HostCmd_CMD_802_11H_DETECT_RADAR
#define HostCmd_CMD_AMPDU_RETRY_RATEDROP_MODE
#define HostCmd_CMD_SET_RATE_ADAPT_MODE
#define HostCmd_CMD_RF_REG_ACCESS
#define MACREG_REG_GEN_PTR
#define HostCmd_CMD_HT_GUARD_INTERVAL
#define FREQ_BAND_2DOT4GHZ
#define HostCmd_CMD_GET_WATCHDOG_BITMAP
#define HostCmd_CMD_802_11_GET_STAT
#define HostCmd_CMD_SET_KEEP_ALIVE
#define HostCmd_CMD_SET_HW_SPEC
#define HostCmd_CMD_SET_RIFS
#define HostCmd_CMD_SET_MAC_ADDR
#define HostCmd_CMD_MAC_MULTICAST_ADR
@ EncrActionTypeRemoveKey
@ EncrActionTypeSetGroupKey
#define HostCmd_CMD_SET_APMODE
#define HostCmd_CMD_SET_SWITCH_CHANNEL
#define MACREG_INT_CODE_CMD_FINISHED
#define EXT_CH_ABOVE_CTRL_CH
#define HostCmd_CMD_GET_SEQNO
#define SET_HW_SPEC_HOST_POWERSAVE
#define MACREG_REG_A2H_INTERRUPT_MASK
#define HostCmd_ACT_GEN_ON
#define HostCmd_CMD_SET_N_PROTECT_OPMODE
#define HostCmd_CMD_SET_NEW_STN
#define HostCmd_CMD_SET_BEACON
#define MACREG_REG_A2H_INTERRUPT_STATUS_MASK
#define HostCmd_CMD_SET_MIMOPSHT
#define HostCmd_SOFTAP_FWRDY_SIGNATURE
#define HostCmd_CMD_SET_WMM_MODE
#define HostCmd_CMD_802_11_SET_SLOT
#define HostCmd_CMD_SET_G_PROTECT_FLAG
#define BASTREAM_FLAG_IMMEDIATE_TYPE
#define RETRY_COUNT_VALID
#define HostCmd_CMD_UPDATE_ENCRYPTION
#define HostCmd_CMD_SET_POWERSAVESTATION
#define FIXED_RATE_WITHOUT_AUTORATE_DROP
#define HostCmd_CMD_SET_OPTIMIZATION_LEVEL
#define SET_HW_SPEC_HOSTFORM_PROBERESP
#define MACREG_REG_A2H_INTERRUPT_CLEAR_SEL
#define HostCmd_CMD_SET_RF_CHANNEL
#define HostCmd_CMD_SET_TIM
#define HostCmd_CMD_802_11_RTS_THSD
#define HostCmd_CMD_BASTREAM
#define MACREG_REG_FW_PRESENT
#define HostCmd_CMD_802_11_RF_TX_POWER
struct MWL_HAL_CHANNELINFO::mwl_hal_channel channels[MWL_HAL_MAXCHAN]
MWL_HAL_CHANNEL_FLAGS channelFlags
struct MWL_HAL_TXRATE::@4 RateSeries[4]
uint8_t macaddr[IEEE80211_ADDR_LEN]
uint32_t wcbBase[MWL_NUM_TX_QUEUES - MWL_NUM_ACK_QUEUES]
uint32_t RxDuplicateFrames
uint32_t TxRetrySuccesses
MWL_HAL_CHANNELINFO mh_40M
uint32_t mh_FCSErrorCount
MWL_HAL_CHANNELINFO mh_40M_5G
MWL_HAL_CHANNELINFO mh_20M_5G
MWL_HAL_CHANNELINFO mh_20M
struct mwl_hal_bastream mh_streams[MWL_BASTREAMS_MAX]
uint32_t mh_RxDuplicateFrames
struct mwl_hal_vap mh_vaps[MWL_MBSS_MAX+1]
uint32_t wcbBase[MWL_NUM_TX_QUEUES - MWL_NUM_ACK_QUEUES]
uint8_t mac[IEEE80211_ADDR_LEN]
bus_space_handle_t mh_ioh