Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef B43_H_
0003 #define B43_H_
0004 
0005 #include <linux/kernel.h>
0006 #include <linux/spinlock.h>
0007 #include <linux/interrupt.h>
0008 #include <linux/hw_random.h>
0009 #include <linux/bcma/bcma.h>
0010 #include <linux/ssb/ssb.h>
0011 #include <linux/completion.h>
0012 #include <net/mac80211.h>
0013 
0014 #include "debugfs.h"
0015 #include "leds.h"
0016 #include "rfkill.h"
0017 #include "bus.h"
0018 #include "lo.h"
0019 #include "phy_common.h"
0020 
0021 
0022 #ifdef CONFIG_B43_DEBUG
0023 # define B43_DEBUG  1
0024 #else
0025 # define B43_DEBUG  0
0026 #endif
0027 
0028 /* MMIO offsets */
0029 #define B43_MMIO_DMA0_REASON        0x20
0030 #define B43_MMIO_DMA0_IRQ_MASK      0x24
0031 #define B43_MMIO_DMA1_REASON        0x28
0032 #define B43_MMIO_DMA1_IRQ_MASK      0x2C
0033 #define B43_MMIO_DMA2_REASON        0x30
0034 #define B43_MMIO_DMA2_IRQ_MASK      0x34
0035 #define B43_MMIO_DMA3_REASON        0x38
0036 #define B43_MMIO_DMA3_IRQ_MASK      0x3C
0037 #define B43_MMIO_DMA4_REASON        0x40
0038 #define B43_MMIO_DMA4_IRQ_MASK      0x44
0039 #define B43_MMIO_DMA5_REASON        0x48
0040 #define B43_MMIO_DMA5_IRQ_MASK      0x4C
0041 #define B43_MMIO_MACCTL         0x120   /* MAC control */
0042 #define B43_MMIO_MACCMD         0x124   /* MAC command */
0043 #define B43_MMIO_GEN_IRQ_REASON     0x128
0044 #define B43_MMIO_GEN_IRQ_MASK       0x12C
0045 #define B43_MMIO_RAM_CONTROL        0x130
0046 #define B43_MMIO_RAM_DATA       0x134
0047 #define B43_MMIO_PS_STATUS      0x140
0048 #define B43_MMIO_RADIO_HWENABLED_HI 0x158
0049 #define B43_MMIO_MAC_HW_CAP     0x15C   /* MAC capabilities (corerev >= 13) */
0050 #define B43_MMIO_SHM_CONTROL        0x160
0051 #define B43_MMIO_SHM_DATA       0x164
0052 #define B43_MMIO_SHM_DATA_UNALIGNED 0x166
0053 #define B43_MMIO_XMITSTAT_0     0x170
0054 #define B43_MMIO_XMITSTAT_1     0x174
0055 #define B43_MMIO_REV3PLUS_TSF_LOW   0x180   /* core rev >= 3 only */
0056 #define B43_MMIO_REV3PLUS_TSF_HIGH  0x184   /* core rev >= 3 only */
0057 #define B43_MMIO_TSF_CFP_REP        0x188
0058 #define B43_MMIO_TSF_CFP_START      0x18C
0059 #define B43_MMIO_TSF_CFP_MAXDUR     0x190
0060 
0061 /* 32-bit DMA */
0062 #define B43_MMIO_DMA32_BASE0        0x200
0063 #define B43_MMIO_DMA32_BASE1        0x220
0064 #define B43_MMIO_DMA32_BASE2        0x240
0065 #define B43_MMIO_DMA32_BASE3        0x260
0066 #define B43_MMIO_DMA32_BASE4        0x280
0067 #define B43_MMIO_DMA32_BASE5        0x2A0
0068 /* 64-bit DMA */
0069 #define B43_MMIO_DMA64_BASE0        0x200
0070 #define B43_MMIO_DMA64_BASE1        0x240
0071 #define B43_MMIO_DMA64_BASE2        0x280
0072 #define B43_MMIO_DMA64_BASE3        0x2C0
0073 #define B43_MMIO_DMA64_BASE4        0x300
0074 #define B43_MMIO_DMA64_BASE5        0x340
0075 
0076 /* PIO on core rev < 11 */
0077 #define B43_MMIO_PIO_BASE0      0x300
0078 #define B43_MMIO_PIO_BASE1      0x310
0079 #define B43_MMIO_PIO_BASE2      0x320
0080 #define B43_MMIO_PIO_BASE3      0x330
0081 #define B43_MMIO_PIO_BASE4      0x340
0082 #define B43_MMIO_PIO_BASE5      0x350
0083 #define B43_MMIO_PIO_BASE6      0x360
0084 #define B43_MMIO_PIO_BASE7      0x370
0085 /* PIO on core rev >= 11 */
0086 #define B43_MMIO_PIO11_BASE0        0x200
0087 #define B43_MMIO_PIO11_BASE1        0x240
0088 #define B43_MMIO_PIO11_BASE2        0x280
0089 #define B43_MMIO_PIO11_BASE3        0x2C0
0090 #define B43_MMIO_PIO11_BASE4        0x300
0091 #define B43_MMIO_PIO11_BASE5        0x340
0092 
0093 #define B43_MMIO_RADIO24_CONTROL    0x3D8   /* core rev >= 24 only */
0094 #define B43_MMIO_RADIO24_DATA       0x3DA   /* core rev >= 24 only */
0095 #define B43_MMIO_PHY_VER        0x3E0
0096 #define B43_MMIO_PHY_RADIO      0x3E2
0097 #define B43_MMIO_PHY0           0x3E6
0098 #define B43_MMIO_ANTENNA        0x3E8
0099 #define B43_MMIO_CHANNEL        0x3F0
0100 #define B43_MMIO_CHANNEL_EXT        0x3F4
0101 #define B43_MMIO_RADIO_CONTROL      0x3F6
0102 #define B43_MMIO_RADIO_DATA_HIGH    0x3F8
0103 #define B43_MMIO_RADIO_DATA_LOW     0x3FA
0104 #define B43_MMIO_PHY_CONTROL        0x3FC
0105 #define B43_MMIO_PHY_DATA       0x3FE
0106 #define B43_MMIO_MACFILTER_CONTROL  0x420
0107 #define B43_MMIO_MACFILTER_DATA     0x422
0108 #define B43_MMIO_RCMTA_COUNT        0x43C
0109 #define B43_MMIO_PSM_PHY_HDR        0x492
0110 #define B43_MMIO_RADIO_HWENABLED_LO 0x49A
0111 #define B43_MMIO_GPIO_CONTROL       0x49C
0112 #define B43_MMIO_GPIO_MASK      0x49E
0113 #define B43_MMIO_TXE0_CTL       0x500
0114 #define B43_MMIO_TXE0_AUX       0x502
0115 #define B43_MMIO_TXE0_TS_LOC        0x504
0116 #define B43_MMIO_TXE0_TIME_OUT      0x506
0117 #define B43_MMIO_TXE0_WM_0      0x508
0118 #define B43_MMIO_TXE0_WM_1      0x50A
0119 #define B43_MMIO_TXE0_PHYCTL        0x50C
0120 #define B43_MMIO_TXE0_STATUS        0x50E
0121 #define B43_MMIO_TXE0_MMPLCP0       0x510
0122 #define B43_MMIO_TXE0_MMPLCP1       0x512
0123 #define B43_MMIO_TXE0_PHYCTL1       0x514
0124 #define B43_MMIO_XMTFIFODEF     0x520
0125 #define B43_MMIO_XMTFIFO_FRAME_CNT  0x522   /* core rev>= 16 only */
0126 #define B43_MMIO_XMTFIFO_BYTE_CNT   0x524   /* core rev>= 16 only */
0127 #define B43_MMIO_XMTFIFO_HEAD       0x526   /* core rev>= 16 only */
0128 #define B43_MMIO_XMTFIFO_RD_PTR     0x528   /* core rev>= 16 only */
0129 #define B43_MMIO_XMTFIFO_WR_PTR     0x52A   /* core rev>= 16 only */
0130 #define B43_MMIO_XMTFIFODEF1        0x52C   /* core rev>= 16 only */
0131 #define B43_MMIO_XMTFIFOCMD     0x540
0132 #define B43_MMIO_XMTFIFOFLUSH       0x542
0133 #define B43_MMIO_XMTFIFOTHRESH      0x544
0134 #define B43_MMIO_XMTFIFORDY     0x546
0135 #define B43_MMIO_XMTFIFOPRIRDY      0x548
0136 #define B43_MMIO_XMTFIFORQPRI       0x54A
0137 #define B43_MMIO_XMTTPLATETXPTR     0x54C
0138 #define B43_MMIO_XMTTPLATEPTR       0x550
0139 #define B43_MMIO_SMPL_CLCT_STRPTR   0x552   /* core rev>= 22 only */
0140 #define B43_MMIO_SMPL_CLCT_STPPTR   0x554   /* core rev>= 22 only */
0141 #define B43_MMIO_SMPL_CLCT_CURPTR   0x556   /* core rev>= 22 only */
0142 #define B43_MMIO_XMTTPLATEDATALO    0x560
0143 #define B43_MMIO_XMTTPLATEDATAHI    0x562
0144 #define B43_MMIO_XMTSEL         0x568
0145 #define B43_MMIO_XMTTXCNT       0x56A
0146 #define B43_MMIO_XMTTXSHMADDR       0x56C
0147 #define B43_MMIO_TSF_CFP_START_LOW  0x604
0148 #define B43_MMIO_TSF_CFP_START_HIGH 0x606
0149 #define B43_MMIO_TSF_CFP_PRETBTT    0x612
0150 #define B43_MMIO_TSF_CLK_FRAC_LOW   0x62E
0151 #define B43_MMIO_TSF_CLK_FRAC_HIGH  0x630
0152 #define B43_MMIO_TSF_0          0x632   /* core rev < 3 only */
0153 #define B43_MMIO_TSF_1          0x634   /* core rev < 3 only */
0154 #define B43_MMIO_TSF_2          0x636   /* core rev < 3 only */
0155 #define B43_MMIO_TSF_3          0x638   /* core rev < 3 only */
0156 #define B43_MMIO_RNG            0x65A
0157 #define B43_MMIO_IFSSLOT        0x684   /* Interframe slot time */
0158 #define B43_MMIO_IFSCTL         0x688   /* Interframe space control */
0159 #define B43_MMIO_IFSSTAT        0x690
0160 #define B43_MMIO_IFSMEDBUSYCTL      0x692
0161 #define B43_MMIO_IFTXDUR        0x694
0162 #define  B43_MMIO_IFSCTL_USE_EDCF   0x0004
0163 #define B43_MMIO_POWERUP_DELAY      0x6A8
0164 #define B43_MMIO_BTCOEX_CTL     0x6B4 /* Bluetooth Coexistence Control */
0165 #define B43_MMIO_BTCOEX_STAT        0x6B6 /* Bluetooth Coexistence Status */
0166 #define B43_MMIO_BTCOEX_TXCTL       0x6B8 /* Bluetooth Coexistence Transmit Control */
0167 #define B43_MMIO_WEPCTL         0x7C0
0168 
0169 /* SPROM boardflags_lo values */
0170 #define B43_BFL_BTCOEXIST       0x0001  /* implements Bluetooth coexistance */
0171 #define B43_BFL_PACTRL          0x0002  /* GPIO 9 controlling the PA */
0172 #define B43_BFL_AIRLINEMODE     0x0004  /* implements GPIO 13 radio disable indication */
0173 #define B43_BFL_RSSI            0x0008  /* software calculates nrssi slope. */
0174 #define B43_BFL_ENETSPI         0x0010  /* has ephy roboswitch spi */
0175 #define B43_BFL_XTAL_NOSLOW     0x0020  /* no slow clock available */
0176 #define B43_BFL_CCKHIPWR        0x0040  /* can do high power CCK transmission */
0177 #define B43_BFL_ENETADM         0x0080  /* has ADMtek switch */
0178 #define B43_BFL_ENETVLAN        0x0100  /* can do vlan */
0179 #define B43_BFL_AFTERBURNER     0x0200  /* supports Afterburner mode */
0180 #define B43_BFL_NOPCI           0x0400  /* leaves PCI floating */
0181 #define B43_BFL_FEM         0x0800  /* supports the Front End Module */
0182 #define B43_BFL_EXTLNA          0x1000  /* has an external LNA */
0183 #define B43_BFL_HGPA            0x2000  /* had high gain PA */
0184 #define B43_BFL_BTCMOD          0x4000  /* BFL_BTCOEXIST is given in alternate GPIOs */
0185 #define B43_BFL_ALTIQ           0x8000  /* alternate I/Q settings */
0186 
0187 /* SPROM boardflags_hi values */
0188 #define B43_BFH_NOPA            0x0001  /* has no PA */
0189 #define B43_BFH_RSSIINV         0x0002  /* RSSI uses positive slope (not TSSI) */
0190 #define B43_BFH_PAREF           0x0004  /* uses the PARef LDO */
0191 #define B43_BFH_3TSWITCH        0x0008  /* uses a triple throw switch shared
0192                          * with bluetooth */
0193 #define B43_BFH_PHASESHIFT      0x0010  /* can support phase shifter */
0194 #define B43_BFH_BUCKBOOST       0x0020  /* has buck/booster */
0195 #define B43_BFH_FEM_BT          0x0040  /* has FEM and switch to share antenna
0196                          * with bluetooth */
0197 #define B43_BFH_NOCBUCK         0x0080
0198 #define B43_BFH_PALDO           0x0200
0199 #define B43_BFH_EXTLNA_5GHZ     0x1000  /* has an external LNA (5GHz mode) */
0200 
0201 /* SPROM boardflags2_lo values */
0202 #define B43_BFL2_RXBB_INT_REG_DIS   0x0001  /* external RX BB regulator present */
0203 #define B43_BFL2_APLL_WAR       0x0002  /* alternative A-band PLL settings implemented */
0204 #define B43_BFL2_TXPWRCTRL_EN       0x0004  /* permits enabling TX Power Control */
0205 #define B43_BFL2_2X4_DIV        0x0008  /* 2x4 diversity switch */
0206 #define B43_BFL2_5G_PWRGAIN     0x0010  /* supports 5G band power gain */
0207 #define B43_BFL2_PCIEWAR_OVR        0x0020  /* overrides ASPM and Clkreq settings */
0208 #define B43_BFL2_CAESERS_BRD        0x0040  /* is Caesers board (unused) */
0209 #define B43_BFL2_BTC3WIRE       0x0080  /* used 3-wire bluetooth coexist */
0210 #define B43_BFL2_SKWRKFEM_BRD       0x0100  /* 4321mcm93 uses Skyworks FEM */
0211 #define B43_BFL2_SPUR_WAR       0x0200  /* has a workaround for clock-harmonic spurs */
0212 #define B43_BFL2_GPLL_WAR       0x0400  /* altenative G-band PLL settings implemented */
0213 #define B43_BFL2_SINGLEANT_CCK      0x1000
0214 #define B43_BFL2_2G_SPUR_WAR        0x2000
0215 
0216 /* SPROM boardflags2_hi values */
0217 #define B43_BFH2_GPLL_WAR2      0x0001
0218 #define B43_BFH2_IPALVLSHIFT_3P3    0x0002
0219 #define B43_BFH2_INTERNDET_TXIQCAL  0x0004
0220 #define B43_BFH2_XTALBUFOUTEN       0x0008
0221 
0222 /* GPIO register offset, in both ChipCommon and PCI core. */
0223 #define B43_GPIO_CONTROL        0x6c
0224 
0225 /* SHM Routing */
0226 enum {
0227     B43_SHM_UCODE,      /* Microcode memory */
0228     B43_SHM_SHARED,     /* Shared memory */
0229     B43_SHM_SCRATCH,    /* Scratch memory */
0230     B43_SHM_HW,     /* Internal hardware register */
0231     B43_SHM_RCMTA,      /* Receive match transmitter address (rev >= 5 only) */
0232 };
0233 /* SHM Routing modifiers */
0234 #define B43_SHM_AUTOINC_R       0x0200  /* Auto-increment address on read */
0235 #define B43_SHM_AUTOINC_W       0x0100  /* Auto-increment address on write */
0236 #define B43_SHM_AUTOINC_RW      (B43_SHM_AUTOINC_R | \
0237                      B43_SHM_AUTOINC_W)
0238 
0239 /* Misc SHM_SHARED offsets */
0240 #define B43_SHM_SH_WLCOREREV        0x0016  /* 802.11 core revision */
0241 #define B43_SHM_SH_PCTLWDPOS        0x0008
0242 #define B43_SHM_SH_RXPADOFF     0x0034  /* RX Padding data offset (PIO only) */
0243 #define B43_SHM_SH_FWCAPA       0x0042  /* Firmware capabilities (Opensource firmware only) */
0244 #define B43_SHM_SH_PHYVER       0x0050  /* PHY version */
0245 #define B43_SHM_SH_PHYTYPE      0x0052  /* PHY type */
0246 #define B43_SHM_SH_ANTSWAP      0x005C  /* Antenna swap threshold */
0247 #define B43_SHM_SH_HOSTF1       0x005E  /* Hostflags 1 for ucode options */
0248 #define B43_SHM_SH_HOSTF2       0x0060  /* Hostflags 2 for ucode options */
0249 #define B43_SHM_SH_HOSTF3       0x0062  /* Hostflags 3 for ucode options */
0250 #define B43_SHM_SH_RFATT        0x0064  /* Current radio attenuation value */
0251 #define B43_SHM_SH_RADAR        0x0066  /* Radar register */
0252 #define B43_SHM_SH_PHYTXNOI     0x006E  /* PHY noise directly after TX (lower 8bit only) */
0253 #define B43_SHM_SH_RFRXSP1      0x0072  /* RF RX SP Register 1 */
0254 #define B43_SHM_SH_HOSTF4       0x0078  /* Hostflags 4 for ucode options */
0255 #define B43_SHM_SH_CHAN         0x00A0  /* Current channel (low 8bit only) */
0256 #define  B43_SHM_SH_CHAN_5GHZ       0x0100  /* Bit set, if 5 Ghz channel */
0257 #define  B43_SHM_SH_CHAN_40MHZ      0x0200  /* Bit set, if 40 Mhz channel width */
0258 #define B43_SHM_SH_MACHW_L      0x00C0  /* Location where the ucode expects the MAC capabilities */
0259 #define B43_SHM_SH_MACHW_H      0x00C2  /* Location where the ucode expects the MAC capabilities */
0260 #define B43_SHM_SH_HOSTF5       0x00D4  /* Hostflags 5 for ucode options */
0261 #define B43_SHM_SH_BCMCFIFOID       0x0108  /* Last posted cookie to the bcast/mcast FIFO */
0262 /* TSSI information */
0263 #define B43_SHM_SH_TSSI_CCK     0x0058  /* TSSI for last 4 CCK frames (32bit) */
0264 #define B43_SHM_SH_TSSI_OFDM_A      0x0068  /* TSSI for last 4 OFDM frames (32bit) */
0265 #define B43_SHM_SH_TSSI_OFDM_G      0x0070  /* TSSI for last 4 OFDM frames (32bit) */
0266 #define  B43_TSSI_MAX           0x7F    /* Max value for one TSSI value */
0267 /* SHM_SHARED TX FIFO variables */
0268 #define B43_SHM_SH_SIZE01       0x0098  /* TX FIFO size for FIFO 0 (low) and 1 (high) */
0269 #define B43_SHM_SH_SIZE23       0x009A  /* TX FIFO size for FIFO 2 and 3 */
0270 #define B43_SHM_SH_SIZE45       0x009C  /* TX FIFO size for FIFO 4 and 5 */
0271 #define B43_SHM_SH_SIZE67       0x009E  /* TX FIFO size for FIFO 6 and 7 */
0272 /* SHM_SHARED background noise */
0273 #define B43_SHM_SH_JSSI0        0x0088  /* Measure JSSI 0 */
0274 #define B43_SHM_SH_JSSI1        0x008A  /* Measure JSSI 1 */
0275 #define B43_SHM_SH_JSSIAUX      0x008C  /* Measure JSSI AUX */
0276 /* SHM_SHARED crypto engine */
0277 #define B43_SHM_SH_DEFAULTIV        0x003C  /* Default IV location */
0278 #define B43_SHM_SH_NRRXTRANS        0x003E  /* # of soft RX transmitter addresses (max 8) */
0279 #define B43_SHM_SH_KTP          0x0056  /* Key table pointer */
0280 #define B43_SHM_SH_TKIPTSCTTAK      0x0318
0281 #define B43_SHM_SH_KEYIDXBLOCK      0x05D4  /* Key index/algorithm block (v4 firmware) */
0282 #define B43_SHM_SH_PSM          0x05F4  /* PSM transmitter address match block (rev < 5) */
0283 /* SHM_SHARED WME variables */
0284 #define B43_SHM_SH_EDCFSTAT     0x000E  /* EDCF status */
0285 #define B43_SHM_SH_TXFCUR       0x0030  /* TXF current index */
0286 #define B43_SHM_SH_EDCFQ        0x0240  /* EDCF Q info */
0287 /* SHM_SHARED powersave mode related */
0288 #define B43_SHM_SH_SLOTT        0x0010  /* Slot time */
0289 #define B43_SHM_SH_DTIMPER      0x0012  /* DTIM period */
0290 #define B43_SHM_SH_NOSLPZNATDTIM    0x004C  /* NOSLPZNAT DTIM */
0291 /* SHM_SHARED beacon/AP variables */
0292 #define B43_SHM_SH_BT_BASE0     0x0068  /* Beacon template base 0 */
0293 #define B43_SHM_SH_BTL0         0x0018  /* Beacon template length 0 */
0294 #define B43_SHM_SH_BT_BASE1     0x0468  /* Beacon template base 1 */
0295 #define B43_SHM_SH_BTL1         0x001A  /* Beacon template length 1 */
0296 #define B43_SHM_SH_BTSFOFF      0x001C  /* Beacon TSF offset */
0297 #define B43_SHM_SH_TIMBPOS      0x001E  /* TIM B position in beacon */
0298 #define B43_SHM_SH_DTIMP        0x0012  /* DTIP period */
0299 #define B43_SHM_SH_MCASTCOOKIE      0x00A8  /* Last bcast/mcast frame ID */
0300 #define B43_SHM_SH_SFFBLIM      0x0044  /* Short frame fallback retry limit */
0301 #define B43_SHM_SH_LFFBLIM      0x0046  /* Long frame fallback retry limit */
0302 #define B43_SHM_SH_BEACPHYCTL       0x0054  /* Beacon PHY TX control word (see PHY TX control) */
0303 #define B43_SHM_SH_EXTNPHYCTL       0x00B0  /* Extended bytes for beacon PHY control (N) */
0304 #define B43_SHM_SH_BCN_LI       0x00B6  /* beacon listen interval */
0305 /* SHM_SHARED ACK/CTS control */
0306 #define B43_SHM_SH_ACKCTSPHYCTL     0x0022  /* ACK/CTS PHY control word (see PHY TX control) */
0307 /* SHM_SHARED probe response variables */
0308 #define B43_SHM_SH_PRSSID       0x0160  /* Probe Response SSID */
0309 #define B43_SHM_SH_PRSSIDLEN        0x0048  /* Probe Response SSID length */
0310 #define B43_SHM_SH_PRTLEN       0x004A  /* Probe Response template length */
0311 #define B43_SHM_SH_PRMAXTIME        0x0074  /* Probe Response max time */
0312 #define B43_SHM_SH_PRPHYCTL     0x0188  /* Probe Response PHY TX control word */
0313 /* SHM_SHARED rate tables */
0314 #define B43_SHM_SH_OFDMDIRECT       0x01C0  /* Pointer to OFDM direct map */
0315 #define B43_SHM_SH_OFDMBASIC        0x01E0  /* Pointer to OFDM basic rate map */
0316 #define B43_SHM_SH_CCKDIRECT        0x0200  /* Pointer to CCK direct map */
0317 #define B43_SHM_SH_CCKBASIC     0x0220  /* Pointer to CCK basic rate map */
0318 /* SHM_SHARED microcode soft registers */
0319 #define B43_SHM_SH_UCODEREV     0x0000  /* Microcode revision */
0320 #define B43_SHM_SH_UCODEPATCH       0x0002  /* Microcode patchlevel */
0321 #define B43_SHM_SH_UCODEDATE        0x0004  /* Microcode date */
0322 #define B43_SHM_SH_UCODETIME        0x0006  /* Microcode time */
0323 #define B43_SHM_SH_UCODESTAT        0x0040  /* Microcode debug status code */
0324 #define  B43_SHM_SH_UCODESTAT_INVALID   0
0325 #define  B43_SHM_SH_UCODESTAT_INIT  1
0326 #define  B43_SHM_SH_UCODESTAT_ACTIVE    2
0327 #define  B43_SHM_SH_UCODESTAT_SUSP  3   /* suspended */
0328 #define  B43_SHM_SH_UCODESTAT_SLEEP 4   /* asleep (PS) */
0329 #define B43_SHM_SH_MAXBFRAMES       0x0080  /* Maximum number of frames in a burst */
0330 #define B43_SHM_SH_SPUWKUP      0x0094  /* pre-wakeup for synth PU in us */
0331 #define B43_SHM_SH_PRETBTT      0x0096  /* pre-TBTT in us */
0332 /* SHM_SHARED tx iq workarounds */
0333 #define B43_SHM_SH_NPHY_TXIQW0      0x0700
0334 #define B43_SHM_SH_NPHY_TXIQW1      0x0702
0335 #define B43_SHM_SH_NPHY_TXIQW2      0x0704
0336 #define B43_SHM_SH_NPHY_TXIQW3      0x0706
0337 /* SHM_SHARED tx pwr ctrl */
0338 #define B43_SHM_SH_NPHY_TXPWR_INDX0 0x0708
0339 #define B43_SHM_SH_NPHY_TXPWR_INDX1 0x070E
0340 
0341 /* SHM_SCRATCH offsets */
0342 #define B43_SHM_SC_MINCONT      0x0003  /* Minimum contention window */
0343 #define B43_SHM_SC_MAXCONT      0x0004  /* Maximum contention window */
0344 #define B43_SHM_SC_CURCONT      0x0005  /* Current contention window */
0345 #define B43_SHM_SC_SRLIMIT      0x0006  /* Short retry count limit */
0346 #define B43_SHM_SC_LRLIMIT      0x0007  /* Long retry count limit */
0347 #define B43_SHM_SC_DTIMC        0x0008  /* Current DTIM count */
0348 #define B43_SHM_SC_BTL0LEN      0x0015  /* Beacon 0 template length */
0349 #define B43_SHM_SC_BTL1LEN      0x0016  /* Beacon 1 template length */
0350 #define B43_SHM_SC_SCFB         0x0017  /* Short frame transmit count threshold for rate fallback */
0351 #define B43_SHM_SC_LCFB         0x0018  /* Long frame transmit count threshold for rate fallback */
0352 
0353 /* Hardware Radio Enable masks */
0354 #define B43_MMIO_RADIO_HWENABLED_HI_MASK (1 << 16)
0355 #define B43_MMIO_RADIO_HWENABLED_LO_MASK (1 << 4)
0356 
0357 /* HostFlags. See b43_hf_read/write() */
0358 #define B43_HF_ANTDIVHELP   0x000000000001ULL /* ucode antenna div helper */
0359 #define B43_HF_SYMW     0x000000000002ULL /* G-PHY SYM workaround */
0360 #define B43_HF_RXPULLW      0x000000000004ULL /* RX pullup workaround */
0361 #define B43_HF_CCKBOOST     0x000000000008ULL /* 4dB CCK power boost (exclusive with OFDM boost) */
0362 #define B43_HF_BTCOEX       0x000000000010ULL /* Bluetooth coexistance */
0363 #define B43_HF_GDCW     0x000000000020ULL /* G-PHY DC canceller filter bw workaround */
0364 #define B43_HF_OFDMPABOOST  0x000000000040ULL /* Enable PA gain boost for OFDM */
0365 #define B43_HF_ACPR     0x000000000080ULL /* Disable for Japan, channel 14 */
0366 #define B43_HF_EDCF     0x000000000100ULL /* on if WME and MAC suspended */
0367 #define B43_HF_TSSIRPSMW    0x000000000200ULL /* TSSI reset PSM ucode workaround */
0368 #define B43_HF_20IN40IQW    0x000000000200ULL /* 20 in 40 MHz I/Q workaround (rev >= 13 only) */
0369 #define B43_HF_DSCRQ        0x000000000400ULL /* Disable slow clock request in ucode */
0370 #define B43_HF_ACIW     0x000000000800ULL /* ACI workaround: shift bits by 2 on PHY CRS */
0371 #define B43_HF_2060W        0x000000001000ULL /* 2060 radio workaround */
0372 #define B43_HF_RADARW       0x000000002000ULL /* Radar workaround */
0373 #define B43_HF_USEDEFKEYS   0x000000004000ULL /* Enable use of default keys */
0374 #define B43_HF_AFTERBURNER  0x000000008000ULL /* Afterburner enabled */
0375 #define B43_HF_BT4PRIOCOEX  0x000000010000ULL /* Bluetooth 4-priority coexistance */
0376 #define B43_HF_FWKUP        0x000000020000ULL /* Fast wake-up ucode */
0377 #define B43_HF_VCORECALC    0x000000040000ULL /* Force VCO recalculation when powering up synthpu */
0378 #define B43_HF_PCISCW       0x000000080000ULL /* PCI slow clock workaround */
0379 #define B43_HF_4318TSSI     0x000000200000ULL /* 4318 TSSI */
0380 #define B43_HF_FBCMCFIFO    0x000000400000ULL /* Flush bcast/mcast FIFO immediately */
0381 #define B43_HF_HWPCTL       0x000000800000ULL /* Enable hardwarre power control */
0382 #define B43_HF_BTCOEXALT    0x000001000000ULL /* Bluetooth coexistance in alternate pins */
0383 #define B43_HF_TXBTCHECK    0x000002000000ULL /* Bluetooth check during transmission */
0384 #define B43_HF_SKCFPUP      0x000004000000ULL /* Skip CFP update */
0385 #define B43_HF_N40W     0x000008000000ULL /* N PHY 40 MHz workaround (rev >= 13 only) */
0386 #define B43_HF_ANTSEL       0x000020000000ULL /* Antenna selection (for testing antenna div.) */
0387 #define B43_HF_BT3COEXT     0x000020000000ULL /* Bluetooth 3-wire coexistence (rev >= 13 only) */
0388 #define B43_HF_BTCANT       0x000040000000ULL /* Bluetooth coexistence (antenna mode) (rev >= 13 only) */
0389 #define B43_HF_ANTSELEN     0x000100000000ULL /* Antenna selection enabled (rev >= 13 only) */
0390 #define B43_HF_ANTSELMODE   0x000200000000ULL /* Antenna selection mode (rev >= 13 only) */
0391 #define B43_HF_MLADVW       0x001000000000ULL /* N PHY ML ADV workaround (rev >= 13 only) */
0392 #define B43_HF_PR45960W     0x080000000000ULL /* PR 45960 workaround (rev >= 13 only) */
0393 
0394 /* Firmware capabilities field in SHM (Opensource firmware only) */
0395 #define B43_FWCAPA_HWCRYPTO 0x0001
0396 #define B43_FWCAPA_QOS      0x0002
0397 
0398 /* MacFilter offsets. */
0399 #define B43_MACFILTER_SELF      0x0000
0400 #define B43_MACFILTER_BSSID     0x0003
0401 
0402 /* PowerControl */
0403 #define B43_PCTL_IN         0xB0
0404 #define B43_PCTL_OUT            0xB4
0405 #define B43_PCTL_OUTENABLE      0xB8
0406 #define B43_PCTL_XTAL_POWERUP       0x40
0407 #define B43_PCTL_PLL_POWERDOWN      0x80
0408 
0409 /* PowerControl Clock Modes */
0410 #define B43_PCTL_CLK_FAST       0x00
0411 #define B43_PCTL_CLK_SLOW       0x01
0412 #define B43_PCTL_CLK_DYNAMIC        0x02
0413 
0414 #define B43_PCTL_FORCE_SLOW     0x0800
0415 #define B43_PCTL_FORCE_PLL      0x1000
0416 #define B43_PCTL_DYN_XTAL       0x2000
0417 
0418 /* PHYVersioning */
0419 #define B43_PHYTYPE_A           0x00
0420 #define B43_PHYTYPE_B           0x01
0421 #define B43_PHYTYPE_G           0x02
0422 #define B43_PHYTYPE_N           0x04
0423 #define B43_PHYTYPE_LP          0x05
0424 #define B43_PHYTYPE_SSLPN       0x06
0425 #define B43_PHYTYPE_HT          0x07
0426 #define B43_PHYTYPE_LCN         0x08
0427 #define B43_PHYTYPE_LCNXN       0x09
0428 #define B43_PHYTYPE_LCN40       0x0a
0429 #define B43_PHYTYPE_AC          0x0b
0430 
0431 /* PHYRegisters */
0432 #define B43_PHY_ILT_A_CTRL      0x0072
0433 #define B43_PHY_ILT_A_DATA1     0x0073
0434 #define B43_PHY_ILT_A_DATA2     0x0074
0435 #define B43_PHY_G_LO_CONTROL        0x0810
0436 #define B43_PHY_ILT_G_CTRL      0x0472
0437 #define B43_PHY_ILT_G_DATA1     0x0473
0438 #define B43_PHY_ILT_G_DATA2     0x0474
0439 #define B43_PHY_A_PCTL          0x007B
0440 #define B43_PHY_G_PCTL          0x0029
0441 #define B43_PHY_A_CRS           0x0029
0442 #define B43_PHY_RADIO_BITFIELD      0x0401
0443 #define B43_PHY_G_CRS           0x0429
0444 #define B43_PHY_NRSSILT_CTRL        0x0803
0445 #define B43_PHY_NRSSILT_DATA        0x0804
0446 
0447 /* RadioRegisters */
0448 #define B43_RADIOCTL_ID         0x01
0449 
0450 /* MAC Control bitfield */
0451 #define B43_MACCTL_ENABLED      0x00000001  /* MAC Enabled */
0452 #define B43_MACCTL_PSM_RUN      0x00000002  /* Run Microcode */
0453 #define B43_MACCTL_PSM_JMP0     0x00000004  /* Microcode jump to 0 */
0454 #define B43_MACCTL_SHM_ENABLED      0x00000100  /* SHM Enabled */
0455 #define B43_MACCTL_SHM_UPPER        0x00000200  /* SHM Upper */
0456 #define B43_MACCTL_IHR_ENABLED      0x00000400  /* IHR Region Enabled */
0457 #define B43_MACCTL_PSM_DBG      0x00002000  /* Microcode debugging enabled */
0458 #define B43_MACCTL_GPOUTSMSK        0x0000C000  /* GPOUT Select Mask */
0459 #define B43_MACCTL_BE           0x00010000  /* Big Endian mode */
0460 #define B43_MACCTL_INFRA        0x00020000  /* Infrastructure mode */
0461 #define B43_MACCTL_AP           0x00040000  /* AccessPoint mode */
0462 #define B43_MACCTL_RADIOLOCK        0x00080000  /* Radio lock */
0463 #define B43_MACCTL_BEACPROMISC      0x00100000  /* Beacon Promiscuous */
0464 #define B43_MACCTL_KEEP_BADPLCP     0x00200000  /* Keep frames with bad PLCP */
0465 #define B43_MACCTL_PHY_LOCK     0x00200000
0466 #define B43_MACCTL_KEEP_CTL     0x00400000  /* Keep control frames */
0467 #define B43_MACCTL_KEEP_BAD     0x00800000  /* Keep bad frames (FCS) */
0468 #define B43_MACCTL_PROMISC      0x01000000  /* Promiscuous mode */
0469 #define B43_MACCTL_HWPS         0x02000000  /* Hardware Power Saving */
0470 #define B43_MACCTL_AWAKE        0x04000000  /* Device is awake */
0471 #define B43_MACCTL_CLOSEDNET        0x08000000  /* Closed net (no SSID bcast) */
0472 #define B43_MACCTL_TBTTHOLD     0x10000000  /* TBTT Hold */
0473 #define B43_MACCTL_DISCTXSTAT       0x20000000  /* Discard TX status */
0474 #define B43_MACCTL_DISCPMQ      0x40000000  /* Discard Power Management Queue */
0475 #define B43_MACCTL_GMODE        0x80000000  /* G Mode */
0476 
0477 /* MAC Command bitfield */
0478 #define B43_MACCMD_BEACON0_VALID    0x00000001  /* Beacon 0 in template RAM is busy/valid */
0479 #define B43_MACCMD_BEACON1_VALID    0x00000002  /* Beacon 1 in template RAM is busy/valid */
0480 #define B43_MACCMD_DFQ_VALID        0x00000004  /* Directed frame queue valid (IBSS PS mode, ATIM) */
0481 #define B43_MACCMD_CCA          0x00000008  /* Clear channel assessment */
0482 #define B43_MACCMD_BGNOISE      0x00000010  /* Background noise */
0483 
0484 /* B43_MMIO_PSM_PHY_HDR bits */
0485 #define B43_PSM_HDR_MAC_PHY_RESET   0x00000001
0486 #define B43_PSM_HDR_MAC_PHY_CLOCK_EN    0x00000002
0487 #define B43_PSM_HDR_MAC_PHY_FORCE_CLK   0x00000004
0488 
0489 /* See BCMA_CLKCTLST_EXTRESREQ and BCMA_CLKCTLST_EXTRESST */
0490 #define B43_BCMA_CLKCTLST_80211_PLL_REQ 0x00000100
0491 #define B43_BCMA_CLKCTLST_PHY_PLL_REQ   0x00000200
0492 #define B43_BCMA_CLKCTLST_80211_PLL_ST  0x01000000
0493 #define B43_BCMA_CLKCTLST_PHY_PLL_ST    0x02000000
0494 
0495 /* BCMA 802.11 core specific IO Control (BCMA_IOCTL) flags */
0496 #define B43_BCMA_IOCTL_PHY_CLKEN    0x00000004  /* PHY Clock Enable */
0497 #define B43_BCMA_IOCTL_PHY_RESET    0x00000008  /* PHY Reset */
0498 #define B43_BCMA_IOCTL_MACPHYCLKEN  0x00000010  /* MAC PHY Clock Control Enable */
0499 #define B43_BCMA_IOCTL_PLLREFSEL    0x00000020  /* PLL Frequency Reference Select */
0500 #define B43_BCMA_IOCTL_PHY_BW       0x000000C0  /* PHY band width and clock speed mask (N-PHY+ only?) */
0501 #define  B43_BCMA_IOCTL_PHY_BW_10MHZ    0x00000000  /* 10 MHz bandwidth, 40 MHz PHY */
0502 #define  B43_BCMA_IOCTL_PHY_BW_20MHZ    0x00000040  /* 20 MHz bandwidth, 80 MHz PHY */
0503 #define  B43_BCMA_IOCTL_PHY_BW_40MHZ    0x00000080  /* 40 MHz bandwidth, 160 MHz PHY */
0504 #define  B43_BCMA_IOCTL_PHY_BW_80MHZ    0x000000C0  /* 80 MHz bandwidth */
0505 #define B43_BCMA_IOCTL_DAC      0x00000300  /* Highspeed DAC mode control field */
0506 #define B43_BCMA_IOCTL_GMODE        0x00002000  /* G Mode Enable */
0507 
0508 /* BCMA 802.11 core specific IO status (BCMA_IOST) flags */
0509 #define B43_BCMA_IOST_2G_PHY        0x00000001  /* 2.4G capable phy */
0510 #define B43_BCMA_IOST_5G_PHY        0x00000002  /* 5G capable phy */
0511 #define B43_BCMA_IOST_FASTCLKA      0x00000004  /* Fast Clock Available */
0512 #define B43_BCMA_IOST_DUALB_PHY     0x00000008  /* Dualband phy */
0513 
0514 /* 802.11 core specific TM State Low (SSB_TMSLOW) flags */
0515 #define B43_TMSLOW_GMODE        0x20000000  /* G Mode Enable */
0516 #define B43_TMSLOW_PHY_BANDWIDTH    0x00C00000  /* PHY band width and clock speed mask (N-PHY only) */
0517 #define  B43_TMSLOW_PHY_BANDWIDTH_10MHZ 0x00000000  /* 10 MHz bandwidth, 40 MHz PHY */
0518 #define  B43_TMSLOW_PHY_BANDWIDTH_20MHZ 0x00400000  /* 20 MHz bandwidth, 80 MHz PHY */
0519 #define  B43_TMSLOW_PHY_BANDWIDTH_40MHZ 0x00800000  /* 40 MHz bandwidth, 160 MHz PHY */
0520 #define B43_TMSLOW_PLLREFSEL        0x00200000  /* PLL Frequency Reference Select (rev >= 5) */
0521 #define B43_TMSLOW_MACPHYCLKEN      0x00100000  /* MAC PHY Clock Control Enable (rev >= 5) */
0522 #define B43_TMSLOW_PHYRESET     0x00080000  /* PHY Reset */
0523 #define B43_TMSLOW_PHYCLKEN     0x00040000  /* PHY Clock Enable */
0524 
0525 /* 802.11 core specific TM State High (SSB_TMSHIGH) flags */
0526 #define B43_TMSHIGH_DUALBAND_PHY    0x00080000  /* Dualband PHY available */
0527 #define B43_TMSHIGH_FCLOCK      0x00040000  /* Fast Clock Available (rev >= 5) */
0528 #define B43_TMSHIGH_HAVE_5GHZ_PHY   0x00020000  /* 5 GHz PHY available (rev >= 5) */
0529 #define B43_TMSHIGH_HAVE_2GHZ_PHY   0x00010000  /* 2.4 GHz PHY available (rev >= 5) */
0530 
0531 /* Generic-Interrupt reasons. */
0532 #define B43_IRQ_MAC_SUSPENDED       0x00000001
0533 #define B43_IRQ_BEACON          0x00000002
0534 #define B43_IRQ_TBTT_INDI       0x00000004
0535 #define B43_IRQ_BEACON_TX_OK        0x00000008
0536 #define B43_IRQ_BEACON_CANCEL       0x00000010
0537 #define B43_IRQ_ATIM_END        0x00000020
0538 #define B43_IRQ_PMQ         0x00000040
0539 #define B43_IRQ_PIO_WORKAROUND      0x00000100
0540 #define B43_IRQ_MAC_TXERR       0x00000200
0541 #define B43_IRQ_PHY_TXERR       0x00000800
0542 #define B43_IRQ_PMEVENT         0x00001000
0543 #define B43_IRQ_TIMER0          0x00002000
0544 #define B43_IRQ_TIMER1          0x00004000
0545 #define B43_IRQ_DMA         0x00008000
0546 #define B43_IRQ_TXFIFO_FLUSH_OK     0x00010000
0547 #define B43_IRQ_CCA_MEASURE_OK      0x00020000
0548 #define B43_IRQ_NOISESAMPLE_OK      0x00040000
0549 #define B43_IRQ_UCODE_DEBUG     0x08000000
0550 #define B43_IRQ_RFKILL          0x10000000
0551 #define B43_IRQ_TX_OK           0x20000000
0552 #define B43_IRQ_PHY_G_CHANGED       0x40000000
0553 #define B43_IRQ_TIMEOUT         0x80000000
0554 
0555 #define B43_IRQ_ALL         0xFFFFFFFF
0556 #define B43_IRQ_MASKTEMPLATE        (B43_IRQ_TBTT_INDI | \
0557                      B43_IRQ_ATIM_END | \
0558                      B43_IRQ_PMQ | \
0559                      B43_IRQ_MAC_TXERR | \
0560                      B43_IRQ_PHY_TXERR | \
0561                      B43_IRQ_DMA | \
0562                      B43_IRQ_TXFIFO_FLUSH_OK | \
0563                      B43_IRQ_NOISESAMPLE_OK | \
0564                      B43_IRQ_UCODE_DEBUG | \
0565                      B43_IRQ_RFKILL | \
0566                      B43_IRQ_TX_OK)
0567 
0568 /* The firmware register to fetch the debug-IRQ reason from. */
0569 #define B43_DEBUGIRQ_REASON_REG     63
0570 /* Debug-IRQ reasons. */
0571 #define B43_DEBUGIRQ_PANIC      0   /* The firmware panic'ed */
0572 #define B43_DEBUGIRQ_DUMP_SHM       1   /* Dump shared SHM */
0573 #define B43_DEBUGIRQ_DUMP_REGS      2   /* Dump the microcode registers */
0574 #define B43_DEBUGIRQ_MARKER     3   /* A "marker" was thrown by the firmware. */
0575 #define B43_DEBUGIRQ_ACK        0xFFFF  /* The host writes that to ACK the IRQ */
0576 
0577 /* The firmware register that contains the "marker" line. */
0578 #define B43_MARKER_ID_REG       2
0579 #define B43_MARKER_LINE_REG     3
0580 
0581 /* The firmware register to fetch the panic reason from. */
0582 #define B43_FWPANIC_REASON_REG      3
0583 /* Firmware panic reason codes */
0584 #define B43_FWPANIC_DIE         0 /* Firmware died. Don't auto-restart it. */
0585 #define B43_FWPANIC_RESTART     1 /* Firmware died. Schedule a controller reset. */
0586 
0587 /* The firmware register that contains the watchdog counter. */
0588 #define B43_WATCHDOG_REG        1
0589 
0590 /* Device specific rate values.
0591  * The actual values defined here are (rate_in_mbps * 2).
0592  * Some code depends on this. Don't change it. */
0593 #define B43_CCK_RATE_1MB        0x02
0594 #define B43_CCK_RATE_2MB        0x04
0595 #define B43_CCK_RATE_5MB        0x0B
0596 #define B43_CCK_RATE_11MB       0x16
0597 #define B43_OFDM_RATE_6MB       0x0C
0598 #define B43_OFDM_RATE_9MB       0x12
0599 #define B43_OFDM_RATE_12MB      0x18
0600 #define B43_OFDM_RATE_18MB      0x24
0601 #define B43_OFDM_RATE_24MB      0x30
0602 #define B43_OFDM_RATE_36MB      0x48
0603 #define B43_OFDM_RATE_48MB      0x60
0604 #define B43_OFDM_RATE_54MB      0x6C
0605 /* Convert a b43 rate value to a rate in 100kbps */
0606 #define B43_RATE_TO_BASE100KBPS(rate)   (((rate) * 10) / 2)
0607 
0608 #define B43_DEFAULT_SHORT_RETRY_LIMIT   7
0609 #define B43_DEFAULT_LONG_RETRY_LIMIT    4
0610 
0611 #define B43_PHY_TX_BADNESS_LIMIT    1000
0612 
0613 /* Max size of a security key */
0614 #define B43_SEC_KEYSIZE         16
0615 /* Max number of group keys */
0616 #define B43_NR_GROUP_KEYS       4
0617 /* Max number of pairwise keys */
0618 #define B43_NR_PAIRWISE_KEYS        50
0619 /* Security algorithms. */
0620 enum {
0621     B43_SEC_ALGO_NONE = 0,  /* unencrypted, as of TX header. */
0622     B43_SEC_ALGO_WEP40,
0623     B43_SEC_ALGO_TKIP,
0624     B43_SEC_ALGO_AES,
0625     B43_SEC_ALGO_WEP104,
0626     B43_SEC_ALGO_AES_LEGACY,
0627 };
0628 
0629 struct b43_dmaring;
0630 
0631 /* The firmware file header */
0632 #define B43_FW_TYPE_UCODE   'u'
0633 #define B43_FW_TYPE_PCM     'p'
0634 #define B43_FW_TYPE_IV      'i'
0635 struct b43_fw_header {
0636     /* File type */
0637     u8 type;
0638     /* File format version */
0639     u8 ver;
0640     u8 __padding[2];
0641     /* Size of the data. For ucode and PCM this is in bytes.
0642      * For IV this is number-of-ivs. */
0643     __be32 size;
0644 } __packed;
0645 
0646 /* Initial Value file format */
0647 #define B43_IV_OFFSET_MASK  0x7FFF
0648 #define B43_IV_32BIT        0x8000
0649 struct b43_iv {
0650     __be16 offset_size;
0651     union {
0652         __be16 d16;
0653         __be32 d32;
0654     } data __packed;
0655 } __packed;
0656 
0657 
0658 /* Data structures for DMA transmission, per 80211 core. */
0659 struct b43_dma {
0660     struct b43_dmaring *tx_ring_AC_BK; /* Background */
0661     struct b43_dmaring *tx_ring_AC_BE; /* Best Effort */
0662     struct b43_dmaring *tx_ring_AC_VI; /* Video */
0663     struct b43_dmaring *tx_ring_AC_VO; /* Voice */
0664     struct b43_dmaring *tx_ring_mcast; /* Multicast */
0665 
0666     struct b43_dmaring *rx_ring;
0667 
0668     u32 translation; /* Routing bits */
0669     bool translation_in_low; /* Should translation bit go into low addr? */
0670     bool parity; /* Check for parity */
0671 };
0672 
0673 struct b43_pio_txqueue;
0674 struct b43_pio_rxqueue;
0675 
0676 /* Data structures for PIO transmission, per 80211 core. */
0677 struct b43_pio {
0678     struct b43_pio_txqueue *tx_queue_AC_BK; /* Background */
0679     struct b43_pio_txqueue *tx_queue_AC_BE; /* Best Effort */
0680     struct b43_pio_txqueue *tx_queue_AC_VI; /* Video */
0681     struct b43_pio_txqueue *tx_queue_AC_VO; /* Voice */
0682     struct b43_pio_txqueue *tx_queue_mcast; /* Multicast */
0683 
0684     struct b43_pio_rxqueue *rx_queue;
0685 };
0686 
0687 /* Context information for a noise calculation (Link Quality). */
0688 struct b43_noise_calculation {
0689     bool calculation_running;
0690     u8 nr_samples;
0691     s8 samples[8][4];
0692 };
0693 
0694 struct b43_stats {
0695     u8 link_noise;
0696 };
0697 
0698 struct b43_key {
0699     /* If keyconf is NULL, this key is disabled.
0700      * keyconf is a cookie. Don't derefenrence it outside of the set_key
0701      * path, because b43 doesn't own it. */
0702     struct ieee80211_key_conf *keyconf;
0703     u8 algorithm;
0704 };
0705 
0706 /* SHM offsets to the QOS data structures for the 4 different queues. */
0707 #define B43_QOS_QUEUE_NUM   4
0708 #define B43_QOS_PARAMS(queue)   (B43_SHM_SH_EDCFQ + \
0709                  (B43_NR_QOSPARAMS * sizeof(u16) * (queue)))
0710 #define B43_QOS_BACKGROUND  B43_QOS_PARAMS(0)
0711 #define B43_QOS_BESTEFFORT  B43_QOS_PARAMS(1)
0712 #define B43_QOS_VIDEO       B43_QOS_PARAMS(2)
0713 #define B43_QOS_VOICE       B43_QOS_PARAMS(3)
0714 
0715 /* QOS parameter hardware data structure offsets. */
0716 #define B43_NR_QOSPARAMS    16
0717 enum {
0718     B43_QOSPARAM_TXOP = 0,
0719     B43_QOSPARAM_CWMIN,
0720     B43_QOSPARAM_CWMAX,
0721     B43_QOSPARAM_CWCUR,
0722     B43_QOSPARAM_AIFS,
0723     B43_QOSPARAM_BSLOTS,
0724     B43_QOSPARAM_REGGAP,
0725     B43_QOSPARAM_STATUS,
0726 };
0727 
0728 /* QOS parameters for a queue. */
0729 struct b43_qos_params {
0730     /* The QOS parameters */
0731     struct ieee80211_tx_queue_params p;
0732 };
0733 
0734 struct b43_wl;
0735 
0736 /* The type of the firmware file. */
0737 enum b43_firmware_file_type {
0738     B43_FWTYPE_PROPRIETARY,
0739     B43_FWTYPE_OPENSOURCE,
0740     B43_NR_FWTYPES,
0741 };
0742 
0743 /* Context data for fetching firmware. */
0744 struct b43_request_fw_context {
0745     /* The device we are requesting the fw for. */
0746     struct b43_wldev *dev;
0747     /* a pointer to the firmware object */
0748     const struct firmware *blob;
0749     /* The type of firmware to request. */
0750     enum b43_firmware_file_type req_type;
0751     /* Error messages for each firmware type. */
0752     char errors[B43_NR_FWTYPES][128];
0753     /* Temporary buffer for storing the firmware name. */
0754     char fwname[64];
0755     /* A fatal error occurred while requesting. Firmware request
0756      * can not continue, as any other request will also fail. */
0757     int fatal_failure;
0758 };
0759 
0760 /* In-memory representation of a cached microcode file. */
0761 struct b43_firmware_file {
0762     const char *filename;
0763     const struct firmware *data;
0764     /* Type of the firmware file name. Note that this does only indicate
0765      * the type by the firmware name. NOT the file contents.
0766      * If you want to check for proprietary vs opensource, use (struct b43_firmware)->opensource
0767      * instead! The (struct b43_firmware)->opensource flag is derived from the actual firmware
0768      * binary code, not just the filename.
0769      */
0770     enum b43_firmware_file_type type;
0771 };
0772 
0773 enum b43_firmware_hdr_format {
0774     B43_FW_HDR_598,
0775     B43_FW_HDR_410,
0776     B43_FW_HDR_351,
0777 };
0778 
0779 /* Pointers to the firmware data and meta information about it. */
0780 struct b43_firmware {
0781     /* Microcode */
0782     struct b43_firmware_file ucode;
0783     /* PCM code */
0784     struct b43_firmware_file pcm;
0785     /* Initial MMIO values for the firmware */
0786     struct b43_firmware_file initvals;
0787     /* Initial MMIO values for the firmware, band-specific */
0788     struct b43_firmware_file initvals_band;
0789 
0790     /* Firmware revision */
0791     u16 rev;
0792     /* Firmware patchlevel */
0793     u16 patch;
0794 
0795     /* Format of header used by firmware */
0796     enum b43_firmware_hdr_format hdr_format;
0797 
0798     /* Set to true, if we are using an opensource firmware.
0799      * Use this to check for proprietary vs opensource. */
0800     bool opensource;
0801     /* Set to true, if the core needs a PCM firmware, but
0802      * we failed to load one. This is always false for
0803      * core rev > 10, as these don't need PCM firmware. */
0804     bool pcm_request_failed;
0805 };
0806 
0807 enum b43_band {
0808     B43_BAND_2G = 0,
0809     B43_BAND_5G_LO = 1,
0810     B43_BAND_5G_MI = 2,
0811     B43_BAND_5G_HI = 3,
0812 };
0813 
0814 /* Device (802.11 core) initialization status. */
0815 enum {
0816     B43_STAT_UNINIT = 0,    /* Uninitialized. */
0817     B43_STAT_INITIALIZED = 1,   /* Initialized, but not started, yet. */
0818     B43_STAT_STARTED = 2,   /* Up and running. */
0819 };
0820 #define b43_status(wldev)       atomic_read(&(wldev)->__init_status)
0821 #define b43_set_status(wldev, stat) do {            \
0822         atomic_set(&(wldev)->__init_status, (stat));    \
0823         smp_wmb();                  \
0824                     } while (0)
0825 
0826 /* Data structure for one wireless device (802.11 core) */
0827 struct b43_wldev {
0828     struct b43_bus_dev *dev;
0829     struct b43_wl *wl;
0830     /* a completion event structure needed if this call is asynchronous */
0831     struct completion fw_load_complete;
0832 
0833     /* The device initialization status.
0834      * Use b43_status() to query. */
0835     atomic_t __init_status;
0836 
0837     bool bad_frames_preempt;    /* Use "Bad Frames Preemption" (default off) */
0838     bool dfq_valid;     /* Directed frame queue valid (IBSS PS mode, ATIM) */
0839     bool radio_hw_enable;   /* saved state of radio hardware enabled state */
0840     bool qos_enabled;       /* TRUE, if QoS is used. */
0841     bool hwcrypto_enabled;      /* TRUE, if HW crypto acceleration is enabled. */
0842     bool use_pio;           /* TRUE if next init should use PIO */
0843 
0844     /* PHY/Radio device. */
0845     struct b43_phy phy;
0846 
0847     union {
0848         /* DMA engines. */
0849         struct b43_dma dma;
0850         /* PIO engines. */
0851         struct b43_pio pio;
0852     };
0853     /* Use b43_using_pio_transfers() to check whether we are using
0854      * DMA or PIO data transfers. */
0855     bool __using_pio_transfers;
0856 
0857     /* Various statistics about the physical device. */
0858     struct b43_stats stats;
0859 
0860     /* Reason code of the last interrupt. */
0861     u32 irq_reason;
0862     u32 dma_reason[6];
0863     /* The currently active generic-interrupt mask. */
0864     u32 irq_mask;
0865 
0866     /* Link Quality calculation context. */
0867     struct b43_noise_calculation noisecalc;
0868     /* if > 0 MAC is suspended. if == 0 MAC is enabled. */
0869     int mac_suspended;
0870 
0871     /* Periodic tasks */
0872     struct delayed_work periodic_work;
0873     unsigned int periodic_state;
0874 
0875     struct work_struct restart_work;
0876 
0877     /* encryption/decryption */
0878     u16 ktp;        /* Key table pointer */
0879     struct b43_key key[B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS];
0880 
0881     /* Firmware data */
0882     struct b43_firmware fw;
0883 
0884     /* Devicelist in struct b43_wl (all 802.11 cores) */
0885     struct list_head list;
0886 
0887     /* Debugging stuff follows. */
0888 #ifdef CONFIG_B43_DEBUG
0889     struct b43_dfsentry *dfsentry;
0890     unsigned int irq_count;
0891     unsigned int irq_bit_count[32];
0892     unsigned int tx_count;
0893     unsigned int rx_count;
0894 #endif
0895 };
0896 
0897 /* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */
0898 struct b43_wl {
0899     /* Pointer to the active wireless device on this chip */
0900     struct b43_wldev *current_dev;
0901     /* Pointer to the ieee80211 hardware data structure */
0902     struct ieee80211_hw *hw;
0903 
0904     /* Global driver mutex. Every operation must run with this mutex locked. */
0905     struct mutex mutex;
0906     /* Hard-IRQ spinlock. This lock protects things used in the hard-IRQ
0907      * handler, only. This basically is just the IRQ mask register. */
0908     spinlock_t hardirq_lock;
0909 
0910     /* Set this if we call ieee80211_register_hw() and check if we call
0911      * ieee80211_unregister_hw(). */
0912     bool hw_registered;
0913 
0914     /* We can only have one operating interface (802.11 core)
0915      * at a time. General information about this interface follows.
0916      */
0917 
0918     struct ieee80211_vif *vif;
0919     /* The MAC address of the operating interface. */
0920     u8 mac_addr[ETH_ALEN];
0921     /* Current BSSID */
0922     u8 bssid[ETH_ALEN];
0923     /* Interface type. (NL80211_IFTYPE_XXX) */
0924     int if_type;
0925     /* Is the card operating in AP, STA or IBSS mode? */
0926     bool operating;
0927     /* filter flags */
0928     unsigned int filter_flags;
0929     /* Stats about the wireless interface */
0930     struct ieee80211_low_level_stats ieee_stats;
0931 
0932 #ifdef CONFIG_B43_HWRNG
0933     struct hwrng rng;
0934     bool rng_initialized;
0935     char rng_name[30 + 1];
0936 #endif /* CONFIG_B43_HWRNG */
0937 
0938     bool radiotap_enabled;
0939     bool radio_enabled;
0940 
0941     /* The beacon we are currently using (AP or IBSS mode). */
0942     struct sk_buff *current_beacon;
0943     bool beacon0_uploaded;
0944     bool beacon1_uploaded;
0945     bool beacon_templates_virgin; /* Never wrote the templates? */
0946     struct work_struct beacon_update_trigger;
0947     spinlock_t beacon_lock;
0948 
0949     /* The current QOS parameters for the 4 queues. */
0950     struct b43_qos_params qos_params[B43_QOS_QUEUE_NUM];
0951 
0952     /* Work for adjustment of the transmission power.
0953      * This is scheduled when we determine that the actual TX output
0954      * power doesn't match what we want. */
0955     struct work_struct txpower_adjust_work;
0956 
0957     /* Packet transmit work */
0958     struct work_struct tx_work;
0959 
0960     /* Queue of packets to be transmitted. */
0961     struct sk_buff_head tx_queue[B43_QOS_QUEUE_NUM];
0962 
0963     /* Flag that implement the queues stopping. */
0964     bool tx_queue_stopped[B43_QOS_QUEUE_NUM];
0965 
0966     /* firmware loading work */
0967     struct work_struct firmware_load;
0968 
0969     /* The device LEDs. */
0970     struct b43_leds leds;
0971 
0972     /* Kmalloc'ed scratch space for PIO TX/RX. Protected by wl->mutex. */
0973     u8 pio_scratchspace[118] __attribute__((__aligned__(8)));
0974     u8 pio_tailspace[4] __attribute__((__aligned__(8)));
0975 };
0976 
0977 static inline struct b43_wl *hw_to_b43_wl(struct ieee80211_hw *hw)
0978 {
0979     return hw->priv;
0980 }
0981 
0982 static inline struct b43_wldev *dev_to_b43_wldev(struct device *dev)
0983 {
0984     struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
0985     return ssb_get_drvdata(ssb_dev);
0986 }
0987 
0988 /* Is the device operating in a specified mode (NL80211_IFTYPE_XXX). */
0989 static inline int b43_is_mode(struct b43_wl *wl, int type)
0990 {
0991     return (wl->operating && wl->if_type == type);
0992 }
0993 
0994 /**
0995  * b43_current_band - Returns the currently used band.
0996  * Returns one of NL80211_BAND_2GHZ and NL80211_BAND_5GHZ.
0997  */
0998 static inline enum nl80211_band b43_current_band(struct b43_wl *wl)
0999 {
1000     return wl->hw->conf.chandef.chan->band;
1001 }
1002 
1003 static inline int b43_bus_may_powerdown(struct b43_wldev *wldev)
1004 {
1005     return wldev->dev->bus_may_powerdown(wldev->dev);
1006 }
1007 static inline int b43_bus_powerup(struct b43_wldev *wldev, bool dynamic_pctl)
1008 {
1009     return wldev->dev->bus_powerup(wldev->dev, dynamic_pctl);
1010 }
1011 static inline int b43_device_is_enabled(struct b43_wldev *wldev)
1012 {
1013     return wldev->dev->device_is_enabled(wldev->dev);
1014 }
1015 static inline void b43_device_enable(struct b43_wldev *wldev,
1016                      u32 core_specific_flags)
1017 {
1018     wldev->dev->device_enable(wldev->dev, core_specific_flags);
1019 }
1020 static inline void b43_device_disable(struct b43_wldev *wldev,
1021                       u32 core_specific_flags)
1022 {
1023     wldev->dev->device_disable(wldev->dev, core_specific_flags);
1024 }
1025 
1026 static inline u16 b43_read16(struct b43_wldev *dev, u16 offset)
1027 {
1028     return dev->dev->read16(dev->dev, offset);
1029 }
1030 
1031 static inline void b43_write16(struct b43_wldev *dev, u16 offset, u16 value)
1032 {
1033     dev->dev->write16(dev->dev, offset, value);
1034 }
1035 
1036 /* To optimize this check for flush_writes on BCM47XX_BCMA only. */
1037 static inline void b43_write16f(struct b43_wldev *dev, u16 offset, u16 value)
1038 {
1039     b43_write16(dev, offset, value);
1040 #if defined(CONFIG_BCM47XX_BCMA)
1041     if (dev->dev->flush_writes)
1042         b43_read16(dev, offset);
1043 #endif
1044 }
1045 
1046 static inline void b43_maskset16(struct b43_wldev *dev, u16 offset, u16 mask,
1047                  u16 set)
1048 {
1049     b43_write16(dev, offset, (b43_read16(dev, offset) & mask) | set);
1050 }
1051 
1052 static inline u32 b43_read32(struct b43_wldev *dev, u16 offset)
1053 {
1054     return dev->dev->read32(dev->dev, offset);
1055 }
1056 
1057 static inline void b43_write32(struct b43_wldev *dev, u16 offset, u32 value)
1058 {
1059     dev->dev->write32(dev->dev, offset, value);
1060 }
1061 
1062 static inline void b43_maskset32(struct b43_wldev *dev, u16 offset, u32 mask,
1063                  u32 set)
1064 {
1065     b43_write32(dev, offset, (b43_read32(dev, offset) & mask) | set);
1066 }
1067 
1068 static inline void b43_block_read(struct b43_wldev *dev, void *buffer,
1069                  size_t count, u16 offset, u8 reg_width)
1070 {
1071     dev->dev->block_read(dev->dev, buffer, count, offset, reg_width);
1072 }
1073 
1074 static inline void b43_block_write(struct b43_wldev *dev, const void *buffer,
1075                    size_t count, u16 offset, u8 reg_width)
1076 {
1077     dev->dev->block_write(dev->dev, buffer, count, offset, reg_width);
1078 }
1079 
1080 static inline bool b43_using_pio_transfers(struct b43_wldev *dev)
1081 {
1082     return dev->__using_pio_transfers;
1083 }
1084 
1085 /* Message printing */
1086 __printf(2, 3) void b43info(struct b43_wl *wl, const char *fmt, ...);
1087 __printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
1088 __printf(2, 3) void b43warn(struct b43_wl *wl, const char *fmt, ...);
1089 __printf(2, 3) void b43dbg(struct b43_wl *wl, const char *fmt, ...);
1090 
1091 
1092 /* A WARN_ON variant that vanishes when b43 debugging is disabled.
1093  * This _also_ evaluates the arg with debugging disabled. */
1094 #if B43_DEBUG
1095 # define B43_WARN_ON(x) WARN_ON(x)
1096 #else
1097 static inline bool __b43_warn_on_dummy(bool x) { return x; }
1098 # define B43_WARN_ON(x) __b43_warn_on_dummy(unlikely(!!(x)))
1099 #endif
1100 
1101 /* Convert an integer to a Q5.2 value */
1102 #define INT_TO_Q52(i)   ((i) << 2)
1103 /* Convert a Q5.2 value to an integer (precision loss!) */
1104 #define Q52_TO_INT(q52) ((q52) >> 2)
1105 /* Macros for printing a value in Q5.2 format */
1106 #define Q52_FMT     "%u.%u"
1107 #define Q52_ARG(q52)    Q52_TO_INT(q52), ((((q52) & 0x3) * 100) / 4)
1108 
1109 #endif /* B43_H_ */