Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F3735679
brcmwl.h
audioone.official_gmail.com (audioone)
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
audioone.official_gmail.com
Sep 17 2018, 2:57 PM
2018-09-17 14:57:47 (UTC+0)
Size
62 KB
Referenced Files
None
Subscribers
None
brcmwl.h
View Options
/*
* $FreeBSD$
*/
#ifndef _IF_BRCMWL_H
#define _IF_BRCMWL_H
struct
siba_dev_softc
;
struct
brcmwl_softc
;
struct
bwn_mac
;
#define MANPREFIX_LEN 3
#define FWCHAR_LEN 15
#define SDIO_CCCR_BRCM_CARDCTRL 0xf1
#define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET (1 << 1)
#define letoh32(x) le32toh(x)
#define letoh16(x) le16toh(x)
/* sprom command and status */
#define SBSDIO_SPROM_CS 0x10000
/* sprom info register */
#define SBSDIO_SPROM_INFO 0x10001
/* sprom indirect access data byte 0 */
#define SBSDIO_SPROM_DATA_LOW 0x10002
/* sprom indirect access data byte 1 */
#define SBSDIO_SPROM_DATA_HIGH 0x10003
/* sprom indirect access addr byte 0 */
#define SBSDIO_SPROM_ADDR_LOW 0x10004
/* gpio select */
#define SBSDIO_GPIO_SELECT 0x10005
/* gpio output */
#define SBSDIO_GPIO_OUT 0x10006
/* gpio enable */
#define SBSDIO_GPIO_EN 0x10007
/* rev < 7, watermark for sdio device */
#define SBSDIO_WATERMARK 0x10008
/* control busy signal generation */
#define SBSDIO_DEVICE_CTL 0x10009
#define SBSDIO_DEVCTL_SETBUSY 0x01
#define SBSDIO_DEVCTL_SPI_INTR_SYNC 0x02
#define SBSDIO_DEVCTL_CA_INT_ONLY 0x04
#define SBSDIO_DEVCTL_PADS_ISO 0x08
#define SBSDIO_DEVCTL_SB_RST_CTL 0x30
#define SBSDIO_DEVCTL_RST_CORECTL 0x00
#define SBSDIO_DEVCTL_RST_BPRESET 0x10
#define SBSDIO_DEVCTL_RST_NOBPRESET 0x20
#define HOSTINTMASK (I_HMB_SW_MASK | I_CHIPACTIVE)
#define I_HMB_SW_MASK 0x000000f0
/* To Host Mail S/W interrupts mask */
#define I_HMB_SW_SHIFT 4
/* To Host Mail S/W interrupts shift */
#define I_CHIPACTIVE (1 << 29)
/* chip from doze to active state */
/* SB Address Window Low (b15) */
#define OFFSET_FUNC1_SBADDRLOW 0x1000A
#define BCMA_CC_CAP_EXT_AOB_PRESENT 0x00000040
#define BCMA_CORE_PMU 0x827
#define DMP_MASTER_PORT_UID 0x0000FF00
#define DMP_MASTER_PORT_UID_S 8
#define DMP_MASTER_PORT_NUM 0x000000F0
#define DMP_MASTER_PORT_NUM_S 4
#define DMP_SLAVE_ADDR_BASE 0xFFFFF000
#define DMP_SLAVE_ADDR_BASE_S 12
#define DMP_SLAVE_PORT_NUM 0x00000F00
#define DMP_SLAVE_PORT_NUM_S 8
#define DMP_SLAVE_TYPE 0x000000C0
#define DMP_SLAVE_TYPE_S 6
#define DMP_SLAVE_TYPE_SLAVE 0
#define DMP_SLAVE_TYPE_BRIDGE 1
#define DMP_SLAVE_TYPE_SWRAP 2
#define DMP_SLAVE_TYPE_MWRAP 3
#define DMP_SLAVE_SIZE_TYPE 0x00000030
#define DMP_SLAVE_SIZE_TYPE_S 4
#define DMP_SLAVE_SIZE_4K 0
#define DMP_SLAVE_SIZE_8K 1
#define DMP_SLAVE_SIZE_16K 2
#define DMP_SLAVE_SIZE_DESC 3
#define PMU_MAX_TRANSITION_DLY 1000000
#define BCMA_CC_PMU_CTL 0x0600
/* PMU control */
#define BCMA_CC_PMU_CTL_ILP_DIV 0xFFFF0000
/* ILP div mask */
#define BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16
#define BCMA_CC_PMU_CTL_RES 0x00006000
/* reset control mask */
#define BCMA_CC_PMU_CTL_RES_SHIFT 13
#define BCMA_CC_PMU_CTL_RES_RELOAD 0x2
/* reload POR values */
#define BCMA_CC_PMU_CTL_PLL_UPD 0x00000400
#define BCMA_CC_PMU_CTL_NOILPONW 0x00000200
/* No ILP on wait */
#define BCMA_CC_PMU_CTL_HTREQEN 0x00000100
/* HT req enable */
#define BCMA_CC_PMU_CTL_ALPREQEN 0x00000080
/* ALP req enable */
#define BCMA_CC_PMU_CTL_XTALFREQ 0x0000007C
/* Crystal freq */
#define BCMA_CC_PMU_CTL_XTALFREQ_SHIFT 2
#define BCMA_CC_PMU_CTL_ILPDIVEN 0x00000002
/* ILP div enable */
#define BCMA_CC_PMU_CTL_LPOSEL 0x00000001
/* LPO sel */
#define BCMA_CC_PMU_CAP 0x0604
/* PMU capabilities */
#define BCMA_CC_PMU_CAP_REVISION 0x000000FF
/* Revision mask */
#define BCMA_CC_PMU_STAT 0x0608
/* PMU status */
#define BCMA_CC_PMU_STAT_EXT_LPO_AVAIL 0x00000100
#define BCMA_CC_PMU_STAT_WDRESET 0x00000080
#define BCMA_CC_PMU_STAT_INTPEND 0x00000040
/* Interrupt pending */
#define BCMA_CC_PMU_STAT_SBCLKST 0x00000030
/* Backplane clock status? */
#define BCMA_CC_PMU_STAT_HAVEALP 0x00000008
/* ALP available */
#define BCMA_CC_PMU_STAT_HAVEHT 0x00000004
/* HT available */
#define BCMA_CC_PMU_STAT_RESINIT 0x00000003
/* Res init */
#define BCMA_CC_PMU_RES_STAT 0x060C
/* PMU res status */
#define BCMA_CC_PMU_RES_PEND 0x0610
/* PMU res pending */
#define BCMA_CC_PMU_TIMER 0x0614
/* PMU timer */
#define BCMA_CC_PMU_MINRES_MSK 0x0618
/* PMU min res mask */
#define BCMA_CC_PMU_MAXRES_MSK 0x061C
/* PMU max res mask */
#define BCMA_CC_PMU_RES_TABSEL 0x0620
/* PMU res table sel */
#define BCMA_CC_PMU_RES_DEPMSK 0x0624
/* PMU res dep mask */
#define BCMA_CC_PMU_RES_UPDNTM 0x0628
/* PMU res updown timer */
#define BCMA_CC_PMU_RES_TIMER 0x062C
/* PMU res timer */
#define BCMA_CC_PMU_CLKSTRETCH 0x0630
/* PMU clockstretch */
#define BCMA_CC_PMU_WATCHDOG 0x0634
/* PMU watchdog */
#define BCMA_CC_PMU_RES_REQTS 0x0640
/* PMU res req timer sel */
#define BCMA_CC_PMU_RES_REQT 0x0644
/* PMU res req timer */
#define BCMA_CC_PMU_RES_REQM 0x0648
/* PMU res req mask */
#define BCMA_CC_PMU_CHIPCTL_ADDR 0x0650
#define BCMA_CC_PMU_CHIPCTL_DATA 0x0654
#define BCMA_CC_PMU_REGCTL_ADDR 0x0658
#define BCMA_CC_PMU_REGCTL_DATA 0x065C
#define BCMA_CC_PMU_PLLCTL_ADDR 0x0660
#define BCMA_CC_PMU_PLLCTL_DATA 0x0664
#define BCMA_CC_PMU_STRAPOPT 0x0668
/* (corerev >= 28) */
#define BCMA_CC_PMU_XTAL_FREQ 0x066C
/* (pmurev >= 10) */
#define BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK 0x00001FFF
#define BCMA_CC_PMU_XTAL_FREQ_MEASURE_MASK 0x80000000
#define BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT 31
#define BCMA_CC_SPROM 0x0800
/* SPROM beginning */
#define ARMCR4_BCMA_IOCTL_CPUHALT 0x0020
#define BCMA_IOCTL 0x0408
#define D11_BCMA_IOCTL_PHYCLOCKEN 0x0004
#define D11_BCMA_IOCTL_PHYRESET 0x0008
#define DMP_DESC_TYPE_MSK 0x0000000F
#define DMP_DESC_EMPTY 0x00000000
#define DMP_DESC_VALID 0x00000001
#define DMP_DESC_COMPONENT 0x00000001
#define DMP_DESC_MASTER_PORT 0x00000003
#define DMP_DESC_ADDRESS 0x00000005
#define DMP_DESC_ADDRSIZE_GT32 0x00000008
#define DMP_DESC_EOT 0x0000000F
#define DMP_COMP_DESIGNER 0xFFF00000
#define DMP_COMP_DESIGNER_S 20
#define DMP_COMP_PARTNUM 0x000FFF00
#define DMP_COMP_PARTNUM_S 8
#define DMP_COMP_CLASS 0x000000F0
#define DMP_COMP_CLASS_S 4
#define DMP_COMP_REVISION 0xFF000000
#define DMP_COMP_REVISION_S 24
#define DMP_COMP_NUM_SWRAP 0x00F80000
#define DMP_COMP_NUM_SWRAP_S 19
#define DMP_COMP_NUM_MWRAP 0x0007C000
#define DMP_COMP_NUM_MWRAP_S 14
#define DMP_COMP_NUM_SPORT 0x00003E00
#define DMP_COMP_NUM_SPORT_S 9
#define DMP_COMP_NUM_MPORT 0x000001F0
#define DMP_COMP_NUM_MPORT_S 4
#define BCMA_RESET_CTL 0x0800
#define BCMA_RESET_CTL_RESET 0x0001
#define BCMA_IOCTL_CLK 0x0001
#define BCMA_IOCTL_FGC 0x0002
#define BCM4329_CORE_SOCRAM_BASE 0x18003000
#define SOCRAM_BANKINFO_RETNTRAM_MASK 0x00010000
#define SOCRAM_BANKINFO_SZMASK 0x0000007f
#define SOCRAM_BANKIDX_ROM_MASK 0x00000100
#define SOCRAM_BANKIDX_MEMTYPE_SHIFT 8
#define SOCRAM_MEMTYPE_RAM 0
#define SOCRAM_MEMTYPE_R0M 1
#define SOCRAM_MEMTYPE_DEVRAM 2
#define SOCRAM_BANKINFO_SZBASE 8192
#define BRCMWL_CHIP_MAX_MEMSIZE (4 * 1024 * 1024)
/* Status: ALP is ready */
#define SBSDIO_ALP_AVAIL 0x40
/* Status: HT is ready */
#define SBSDIO_HT_AVAIL 0x80
#define SBSDIO_HT_AVAIL_REQ 0x10
#define SBSDIO_ALP_AVAIL_REQ 0x08
#define SBSDIO_CSR_MASK 0x1F
#define SBSDIO_AVBITS (SBSDIO_HT_AVAIL | SBSDIO_ALP_AVAIL)
#define SBSDIO_ALPAV(regval) ((regval) & SBSDIO_AVBITS)
#define SBSDIO_HTAV(regval) (((regval) & SBSDIO_AVBITS) == SBSDIO_AVBITS)
#define SBSDIO_ALPONLY(regval) (SBSDIO_ALPAV(regval) && !SBSDIO_HTAV(regval))
#define SBSDIO_CLKAV(regval, alponly) \
(SBSDIO_ALPAV(regval) && (alponly ? 1 : SBSDIO_HTAV(regval)))
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_FORCE_ALP 0x01
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT 0x02
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_FORCE_ILP 0x04
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL_REQ 0x08
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL_REQ 0x10
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_FORCE_HW_CLKREQ_OFF 0x20
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL 0x40
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL 0x80
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_CSR_MASK 0x1F
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_AVBITS \
(BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL | \
BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL)
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) \
((regval) & BRCMWL_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval) \
(((regval) & BRCMWL_SDIO_FUNC1_CHIPCLKCSR_AVBITS) == BRCMWL_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALPONLY(regval) \
(BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
!BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval))
#define BRCMWL_SDIO_FUNC1_CHIPCLKCSR_CLKAV(regval, alponly) \
(BRCMWL_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
(alponly ? 1 : BRCMWL_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval)))
#define SBSDIO_SBADDRLOW_MASK 0x80
/* Valid bits in SBADDRLOW */
#define SBSDIO_SBADDRMID_MASK 0xff
/* Valid bits in SBADDRMID */
#define SBSDIO_SBADDRHIGH_MASK 0xffU
/* Valid bits in SBADDRHIGH */
/* Address bits from SBADDR regs */
#define SBSDIO_SBWINDOW_MASK 0xffff8000
#define SRCI_LSS_SHIFT 20
#define SRCI_SRBSZ_MASK 0xf
#define SRCI_SRNB_MASK 0xf0
#define SRCI_SRNB_SHIFT 4
#define SRCI_LSS_MASK 0x00f00000
#define SR_BSZ_BASE 14
#define SBSDIO_FORCE_HW_CLKREQ_OFF 0x20
#define SBSDIO_AVBITS (SBSDIO_HT_AVAIL | SBSDIO_ALP_AVAIL)
#define BRCMWL_SDIO_FUNC1_SLEEPCSR 0x1001F
#define BRCMWL_SDIO_FUNC1_SLEEPCSR_KSO (1 << 0)
#define BRCMWL_SDIO_FUNC1_SLEEPCSR_DEVON (1 << 2)
#define BRCMWL_INIT_CLKCTL1 (SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ)
/* SB Address Window Mid (b23:b16) */
#define OFFSET_FUNC1_SBADDRMID 0x1000B
/* SB Address Window High (b31:b24) */
#define OFFSET_FUNC1_SBADDRHIGH 0x1000C
/* Frame Control (frame term/abort) */
#define SBSDIO_FUNC1_FRAMECTRL 0x1000D
/* ChipClockCSR (ALP/HT ctl/status) */
#define SBSDIO_FUNC1_CHIPCLKCSR 0x1000E
/* SdioPullUp (on cmd, d0-d2) */
#define SBSDIO_FUNC1_SDIOPULLUP 0x1000F
/* Write Frame Byte Count Low */
#define SBSDIO_FUNC1_WFRAMEBCLO 0x10019
/* Write Frame Byte Count High */
#define SBSDIO_FUNC1_WFRAMEBCHI 0x1001A
/* Read Frame Byte Count Low */
#define SBSDIO_FUNC1_RFRAMEBCLO 0x1001B
/* Read Frame Byte Count High */
#define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C
/* MesBusyCtl (rev 11) */
#define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D
/* Sdio Core Rev 12 */
#define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E
#define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1
#define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT 0
#define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK 0x2
#define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT 1
#define SBSDIO_FUNC1_SLEEPCSR 0x1001F
#define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK 0x1
#define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT 0
#define SBSDIO_FUNC1_SLEEPCSR_KSO_EN 1
#define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK 0x2
#define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT 1
#define SBSDIO_FUNC1_MISC_REG_START 0x10000
/* f1 misc register start */
#define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001F
/* f1 misc register end */
/* function 0 vendor specific CCCR registers */
#define SDIO_CCCR_BRCM_CARDCAP 0xf0
#define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT (1 << 1)
#define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT (1 << 2)
#define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC (1 << 3)
/* function 1 OCP space */
/* sb offset addr is <= 15 bits, 32k */
#define OFFSET_OFT_ADDR_MASK 0x07FFF
#define SBSDIO_SB_OFT_ADDR_LIMIT 0x08000
/* with b15, maps to 32-bit SB access */
#define OFFSET_ACCESS_2_4B_FLAG 0x08000
#define BRCMWL_SDIO_SB_OFT_ADDR_PAGE 0x08000
#define SOCRAMREGOFFS(_f) offsetof(struct sb_socramregs_t, _f)
#define SYSMEMREGOFFS(_f) offsetof(struct sb_socramregs_t, _f)
/* Protocol defines */
#define SDPCM_PROT_VERSION 4
#define SDPCM_PROT_VERSION_SHIFT 16
#define SDPCM_SHARED_VERSION 0x0003
#define SDPCM_SHARED_VERSION_MASK 0x00FF
#define SDPCM_SHARED_ASSERT_BUILT 0x0100
#define SDPCM_SHARED_ASSERT 0x0200
#define SDPCM_SHARED_TRAP 0x0400
#define SDPCMD_INTSTATUS 0x020
#define SDPCMD_INTSTATUS_SMB_SW0 (1 << 0)
/* To SB Mail S/W interrupt 0 */
#define SDPCMD_INTSTATUS_SMB_SW1 (1 << 1)
/* To SB Mail S/W interrupt 1 */
#define SDPCMD_INTSTATUS_SMB_SW2 (1 << 2)
/* To SB Mail S/W interrupt 2 */
#define SDPCMD_INTSTATUS_SMB_SW3 (1 << 3)
/* To SB Mail S/W interrupt 3 */
#define SDPCMD_INTSTATUS_SMB_SW_MASK 0x0000000f
/* To SB Mail S/W interrupts mask */
#define SDPCMD_INTSTATUS_SMB_SW_SHIFT 0
/* To SB Mail S/W interrupts shift */
#define SDPCMD_INTSTATUS_HMB_SW0 (1 << 4)
/* To Host Mail S/W interrupt 0 */
#define SDPCMD_INTSTATUS_HMB_SW1 (1 << 5)
/* To Host Mail S/W interrupt 1 */
#define SDPCMD_INTSTATUS_HMB_SW2 (1 << 6)
/* To Host Mail S/W interrupt 2 */
#define SDPCMD_INTSTATUS_HMB_SW3 (1 << 7)
/* To Host Mail S/W interrupt 3 */
#define SDPCMD_INTSTATUS_HMB_FC_STATE SDPCMD_INTSTATUS_HMB_SW0
#define SDPCMD_INTSTATUS_HMB_FC_CHANGE SDPCMD_INTSTATUS_HMB_SW1
#define SDPCMD_INTSTATUS_HMB_FRAME_IND SDPCMD_INTSTATUS_HMB_SW2
#define SDPCMD_INTSTATUS_HMB_HOST_INT SDPCMD_INTSTATUS_HMB_SW3
#define SDPCMD_INTSTATUS_HMB_SW_MASK 0x000000f0
/* To Host Mail S/W interrupts mask */
#define SDPCMD_INTSTATUS_HMB_SW_SHIFT 4
/* To Host Mail S/W interrupts shift */
#define SDPCMD_INTSTATUS_WR_OOSYNC (1 << 8)
/* Write Frame Out Of Sync */
#define SDPCMD_INTSTATUS_RD_OOSYNC (1 << 9)
/* Read Frame Out Of Sync */
#define SDPCMD_INTSTATUS_PC (1 << 10)
/* descriptor error */
#define SDPCMD_INTSTATUS_PD (1 << 11)
/* data error */
#define SDPCMD_INTSTATUS_DE (1 << 12)
/* Descriptor protocol Error */
#define SDPCMD_INTSTATUS_RU (1 << 13)
/* Receive descriptor Underflow */
#define SDPCMD_INTSTATUS_RO (1 << 14)
/* Receive fifo Overflow */
#define SDPCMD_INTSTATUS_XU (1 << 15)
/* Transmit fifo Underflow */
#define SDPCMD_INTSTATUS_RI (1 << 16)
/* Receive Interrupt */
#define SDPCMD_INTSTATUS_BUSPWR (1 << 17)
/* SDIO Bus Power Change (rev 9) */
#define SDPCMD_INTSTATUS_XMTDATA_AVAIL (1 << 23)
/* bits in fifo */
#define SDPCMD_INTSTATUS_XI (1 << 24)
/* Transmit Interrupt */
#define SDPCMD_INTSTATUS_RF_TERM (1 << 25)
/* Read Frame Terminate */
#define SDPCMD_INTSTATUS_WF_TERM (1 << 26)
/* Write Frame Terminate */
#define SDPCMD_INTSTATUS_PCMCIA_XU (1 << 27)
/* PCMCIA Transmit FIFO Underflow */
#define SDPCMD_INTSTATUS_SBINT (1 << 28)
/* sbintstatus Interrupt */
#define SDPCMD_INTSTATUS_CHIPACTIVE (1 << 29)
/* chip from doze to active state */
#define SDPCMD_INTSTATUS_SRESET (1 << 30)
/* CCCR RES interrupt */
#define SDPCMD_INTSTATUS_IOE2 (1U << 31)
/* CCCR IOE2 Bit Changed */
#define SDPCMD_INTSTATUS_ERRORS (SDPCMD_INTSTATUS_PC | \
SDPCMD_INTSTATUS_PD | \
SDPCMD_INTSTATUS_DE | \
SDPCMD_INTSTATUS_RU | \
SDPCMD_INTSTATUS_RO | \
SDPCMD_INTSTATUS_XU)
#define SDPCMD_INTSTATUS_DMA (SDPCMD_INTSTATUS_RI | \
SDPCMD_INTSTATUS_XI | \
SDPCMD_INTSTATUS_ERRORS)
#define SDPCMD_HOSTINTMASK 0x024
#define SDPCMD_INTMASK 0x028
#define SDPCMD_SBINTSTATUS 0x02c
#define SDPCMD_SBINTMASK 0x030
#define SDPCMD_FUNCTINTMASK 0x034
#define SDPCMD_TOSBMAILBOX 0x040
#define SDPCMD_TOSBMAILBOX_NAK (1 << 0)
#define SDPCMD_TOSBMAILBOX_INT_ACK (1 << 1)
#define SDPCMD_TOSBMAILBOX_USE_OOB (1 << 2)
#define SDPCMD_TOSBMAILBOX_DEV_INT (1 << 3)
#define SDPCMD_TOHOSTMAILBOX 0x044
#define SDPCMD_TOSBMAILBOXDATA 0x048
#define SDPCMD_TOHOSTMAILBOXDATA 0x04C
#define SDPCMD_TOHOSTMAILBOXDATA_NAKHANDLED (1 << 0)
#define SDPCMD_TOHOSTMAILBOXDATA_DEVREADY (1 << 1)
#define SDPCMD_TOHOSTMAILBOXDATA_FC (1 << 2)
#define SDPCMD_TOHOSTMAILBOXDATA_FWREADY (1 << 3)
#define SDPCMD_TOHOSTMAILBOXDATA_FWHALT (1 << 4)
#define SDIO_BROADCOM 0x02d0
#define BRCMWL_SOFTC(d) (struct brcmwl_softc *) device_get_softc(d)
#define N(a) (sizeof(a) / sizeof(a[0]))
#define BWN_ALIGN 0x1000
#define BWN_BUS_SPACE_MAXADDR_30BIT 0x3fffffff
#define BWN_RETRY_SHORT 7
#define BWN_RETRY_LONG 4
#define BWN_STAID_MAX 64
#define BWN_TXPWR_IGNORE_TIME (1 << 0)
#define BWN_TXPWR_IGNORE_TSSI (1 << 1)
#define BWN_HAS_TXMAG(phy) \
(((phy)->rev >= 2) && ((phy)->rf_ver == 0x2050) && \
((phy)->rf_rev == 8))
#define BWN_HAS_LOOPBACK(phy) \
(((phy)->rev > 1) || ((phy)->gmode))
#define BWN_TXERROR_MAX 1000
#define BWN_GETTIME(v) do { \
struct timespec ts; \
nanouptime(&ts); \
(v) = ts.tv_nsec / 1000000 + ts.tv_sec * 1000; \
} while (0)
#define BWN_ISOLDFMT(mac) ((mac)->mac_fw.rev <= 351)
#define BWN_TSSI2DBM(num, den) \
((int32_t)((num < 0) ? num / den : (num + den / 2) / den))
#define BWN_HDRSIZE(mac) bwn_tx_hdrsize(mac)
#define BWN_MAXTXHDRSIZE (112 + (sizeof(struct bwn_plcp6)))
#define BWN_PIO_COOKIE(tq, tp) \
((uint16_t)((((uint16_t)tq->tq_index + 1) << 12) | tp->tp_index))
#define BWN_DMA_COOKIE(dr, slot) \
((uint16_t)(((uint16_t)dr->dr_index + 1) << 12) | (uint16_t)slot)
#define BWN_READ_2(mac, o) (siba_read_2(mac->mac_sc->sc_dev, o))
#define BWN_READ_4(mac, o) (siba_read_4(mac->mac_sc->sc_dev, o))
#define BWN_WRITE_2(mac, o, v) \
(siba_write_2(mac->mac_sc->sc_dev, o, v))
#define BWN_WRITE_2_F(mac, o, v) do { \
(BWN_WRITE_2(mac, o, v)); \
BWN_READ_2(mac, o); \
} while(0)
#define BWN_WRITE_SETMASK2(mac, offset, mask, set) \
BWN_WRITE_2(mac, offset, (BWN_READ_2(mac, offset) & mask) | set)
#define BWN_WRITE_4(mac, o, v) \
(siba_write_4(mac->mac_sc->sc_dev, o, v))
#define BWN_WRITE_SETMASK4(mac, offset, mask, set) \
BWN_WRITE_4(mac, offset, (BWN_READ_4(mac, offset) & mask) | set)
#define BWN_PIO_TXQOFFSET(mac) \
((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x18 : 0)
#define BWN_PIO_RXQOFFSET(mac) \
((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x38 : 8)
#define BWN_SEC_NEWAPI(mac) (mac->mac_fw.rev >= 351)
#define BWN_SEC_KEY2FW(mac, idx) \
(BWN_SEC_NEWAPI(mac) ? idx : ((idx >= 4) ? idx - 4 : idx))
#define BWN_RF_READ(mac, r) (mac->mac_phy.rf_read(mac, r))
#define BWN_RF_WRITE(mac, r, v) (mac->mac_phy.rf_write(mac, r, v))
#define BWN_RF_MASK(mac, o, m) \
BWN_RF_WRITE(mac, o, BWN_RF_READ(mac, o) & m)
#define BWN_RF_SETMASK(mac, offset, mask, set) \
BWN_RF_WRITE(mac, offset, (BWN_RF_READ(mac, offset) & mask) | set)
#define BWN_RF_SET(mac, offset, set) \
BWN_RF_WRITE(mac, offset, BWN_RF_READ(mac, offset) | set)
#define BWN_PHY_READ(mac, r) (mac->mac_phy.phy_read(mac, r))
#define BWN_PHY_WRITE(mac, r, v) \
(mac->mac_phy.phy_write(mac, r, v))
#define BWN_PHY_SET(mac, offset, set) do { \
if (mac->mac_phy.phy_maskset != NULL) { \
KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \
mac->mac_suspended > 0, \
("dont access PHY or RF registers after turning on MAC")); \
mac->mac_phy.phy_maskset(mac, offset, 0xffff, set); \
} else \
BWN_PHY_WRITE(mac, offset, \
BWN_PHY_READ(mac, offset) | (set)); \
} while (0)
#define BWN_PHY_SETMASK(mac, offset, mask, set) do { \
if (mac->mac_phy.phy_maskset != NULL) { \
KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \
mac->mac_suspended > 0, \
("dont access PHY or RF registers after turning on MAC")); \
mac->mac_phy.phy_maskset(mac, offset, mask, set); \
} else \
BWN_PHY_WRITE(mac, offset, \
(BWN_PHY_READ(mac, offset) & (mask)) | (set)); \
} while (0)
#define BWN_PHY_MASK(mac, offset, mask) do { \
if (mac->mac_phy.phy_maskset != NULL) { \
KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \
mac->mac_suspended > 0, \
("dont access PHY or RF registers after turning on MAC")); \
mac->mac_phy.phy_maskset(mac, offset, mask, 0); \
} else \
BWN_PHY_WRITE(mac, offset, \
BWN_PHY_READ(mac, offset) & mask); \
} while (0)
#define BWN_PHY_COPY(mac, dst, src) do { \
KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \
mac->mac_suspended > 0, \
("dont access PHY or RF registers after turning on MAC")); \
BWN_PHY_WRITE(mac, dst, BWN_PHY_READ(mac, src)); \
} while (0)
#define BWN_LO_CALIB_EXPIRE (1000 * (30 - 2))
#define BWN_LO_PWRVEC_EXPIRE (1000 * (30 - 2))
#define BWN_LO_TXCTL_EXPIRE (1000 * (180 - 4))
#define BWN_DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
#define BWN_LPD(L, P, D) (((L) << 2) | ((P) << 1) | ((D) << 0))
#define BWN_BITREV4(tmp) (BWN_BITREV8(tmp) >> 4)
#define BWN_BITREV8(byte) (bwn_bitrev_table[byte])
#define BWN_BBATTCMP(a, b) ((a)->att == (b)->att)
#define BWN_RFATTCMP(a, b) \
(((a)->att == (b)->att) && ((a)->padmix == (b)->padmix))
#define BWN_PIO_WRITE_2(mac, tq, offset, value) \
BWN_WRITE_2(mac, (tq)->tq_base + offset, value)
#define BWN_PIO_READ_4(mac, tq, offset) \
BWN_READ_4(mac, tq->tq_base + offset)
#define BWN_ISCCKRATE(rate) \
(rate == BWN_CCK_RATE_1MB || rate == BWN_CCK_RATE_2MB || \
rate == BWN_CCK_RATE_5MB || rate == BWN_CCK_RATE_11MB)
#define BWN_ISOFDMRATE(rate) (!BWN_ISCCKRATE(rate))
#define BWN_BARRIER(mac, flags) siba_barrier(mac->mac_sc->sc_dev, flags)
#define BWN_DMA_READ(dr, offset) \
(BWN_READ_4(dr->dr_mac, dr->dr_base + offset))
#define BWN_DMA_WRITE(dr, offset, value) \
(BWN_WRITE_4(dr->dr_mac, dr->dr_base + offset, value))
/* chipid */
#define CID_ID_MASK 0x0000ffff
/* Chip Id mask */
#define CID_REV_MASK 0x000f0000
/* Chip Revision mask */
#define CID_REV_SHIFT 16
/* Chip Revision shift */
#define CID_PKG_MASK 0x00f00000
/* Package Option mask */
#define CID_PKG_SHIFT 20
/* Package Option shift */
#define CID_CC_MASK 0x0f000000
/* CoreCount (corerev >= 4) */
#define CID_CC_SHIFT 24
#define CID_TYPE_MASK 0xf0000000
/* Chip Type */
#define CID_TYPE_SHIFT 28
#define SI_ENUM_BASE 0x18000000
/* capabilities */
#define CC_CAP_UARTS_MASK 0x00000003
/* Number of UARTs */
#define CC_CAP_MIPSEB 0x00000004
/* MIPS is in big-endian mode */
#define CC_CAP_UCLKSEL 0x00000018
/* UARTs clock select */
/* UARTs are driven by internal divided clock */
#define CC_CAP_UINTCLK 0x00000008
#define CC_CAP_UARTGPIO 0x00000020
/* UARTs own GPIOs 15:12 */
#define CC_CAP_EXTBUS_MASK 0x000000c0
/* External bus mask */
#define CC_CAP_EXTBUS_NONE 0x00000000
/* No ExtBus present */
#define CC_CAP_EXTBUS_FULL 0x00000040
/* ExtBus: PCMCIA, IDE & Prog */
#define CC_CAP_EXTBUS_PROG 0x00000080
/* ExtBus: ProgIf only */
#define CC_CAP_FLASH_MASK 0x00000700
/* Type of flash */
#define CC_CAP_PLL_MASK 0x00038000
/* Type of PLL */
#define CC_CAP_PWR_CTL 0x00040000
/* Power control */
#define CC_CAP_OTPSIZE 0x00380000
/* OTP Size (0 = none) */
#define CC_CAP_OTPSIZE_SHIFT 19
/* OTP Size shift */
#define CC_CAP_OTPSIZE_BASE 5
/* OTP Size base */
#define CC_CAP_JTAGP 0x00400000
/* JTAG Master Present */
#define CC_CAP_ROM 0x00800000
/* Internal boot rom active */
#define CC_CAP_BKPLN64 0x08000000
/* 64-bit backplane */
#define CC_CAP_PMU 0x10000000
/* PMU Present, rev >= 20 */
#define CC_CAP_SROM 0x40000000
/* Srom Present, rev >= 32 */
/* Nand flash present, rev >= 35 */
#define CC_CAP_NFLASH 0x80000000
#define CC_CAP2_SECI 0x00000001
/* SECI Present, rev >= 36 */
/* GSIO (spi/i2c) present, rev >= 37 */
#define CC_CAP2_GSIO 0x00000002
/* pmucapabilities */
#define PCAP_REV_MASK 0x000000ff
#define PCAP_RC_MASK 0x00001f00
#define PCAP_RC_SHIFT 8
#define PCAP_TC_MASK 0x0001e000
#define PCAP_TC_SHIFT 13
#define PCAP_PC_MASK 0x001e0000
#define PCAP_PC_SHIFT 17
#define PCAP_VC_MASK 0x01e00000
#define PCAP_VC_SHIFT 21
#define PCAP_CC_MASK 0x1e000000
#define PCAP_CC_SHIFT 25
#define PCAP5_PC_MASK 0x003e0000
/* PMU corerev >= 5 */
#define PCAP5_PC_SHIFT 17
#define PCAP5_VC_MASK 0x07c00000
#define PCAP5_VC_SHIFT 22
#define PCAP5_CC_MASK 0xf8000000
#define PCAP5_CC_SHIFT 27
/* pmucapabilites_ext PMU rev >= 15 */
#define PCAPEXT_SR_SUPPORTED_MASK (1 << 1)
/* retention_ctl PMU rev >= 15 */
#define PMU_RCTL_MACPHY_DISABLE_MASK (1 << 26)
#define PMU_RCTL_LOGIC_DISABLE_MASK (1 << 27)
/* Core-ID values. */
#define BCMA_CORE_OOB_ROUTER 0x367
/* Out of band */
#define BCMA_CORE_4706_CHIPCOMMON 0x500
#define BCMA_CORE_NS_PCIEG2 0x501
#define BCMA_CORE_NS_DMA 0x502
#define BCMA_CORE_NS_SDIO3 0x503
#define BCMA_CORE_NS_USB20 0x504
#define BCMA_CORE_NS_USB30 0x505
#define BCMA_CORE_NS_A9JTAG 0x506
#define BCMA_CORE_NS_DDR23 0x507
#define BCMA_CORE_NS_ROM 0x508
#define BCMA_CORE_NS_NAND 0x509
#define BCMA_CORE_NS_QSPI 0x50A
#define BCMA_CORE_NS_CHIPCOMMON_B 0x50B
#define BCMA_CORE_4706_SOC_RAM 0x50E
#define BCMA_CORE_ARMCA9 0x510
#define BCMA_CORE_4706_MAC_GBIT 0x52D
#define BCMA_CORE_AMEMC 0x52E
/* DDR1/2 memory controller core */
#define BCMA_CORE_ALTA 0x534
/* I2S core */
#define BCMA_CORE_4706_MAC_GBIT_COMMON 0x5DC
#define BCMA_CORE_DDR23_PHY 0x5DD
#define BCMA_CORE_INVALID 0x700
#define BCMA_CORE_CHIPCOMMON 0x800
#define BCMA_CORE_ILINE20 0x801
#define BCMA_CORE_SRAM 0x802
#define BCMA_CORE_SDRAM 0x803
#define BCMA_CORE_PCI 0x804
#define BCMA_CORE_MIPS 0x805
#define BCMA_CORE_ETHERNET 0x806
#define BCMA_CORE_V90 0x807
#define BCMA_CORE_USB11_HOSTDEV 0x808
#define BCMA_CORE_ADSL 0x809
#define BCMA_CORE_ILINE100 0x80A
#define BCMA_CORE_IPSEC 0x80B
#define BCMA_CORE_UTOPIA 0x80C
#define BCMA_CORE_PCMCIA 0x80D
#define BCMA_CORE_INTERNAL_MEM 0x80E
#define BCMA_CORE_MEMC_SDRAM 0x80F
#define BCMA_CORE_OFDM 0x810
#define BCMA_CORE_EXTIF 0x811
#define BCMA_CORE_80211 0x812
#define BCMA_CORE_PHY_A 0x813
#define BCMA_CORE_PHY_B 0x814
#define BCMA_CORE_PHY_G 0x815
#define BCMA_CORE_MIPS_3302 0x816
#define BCMA_CORE_USB11_HOST 0x817
#define BCMA_CORE_USB11_DEV 0x818
#define BCMA_CORE_USB20_HOST 0x819
#define BCMA_CORE_USB20_DEV 0x81A
#define BCMA_CORE_SDIO_HOST 0x81B
#define BCMA_CORE_ROBOSWITCH 0x81C
#define BCMA_CORE_PARA_ATA 0x81D
#define BCMA_CORE_SATA_XORDMA 0x81E
#define BCMA_CORE_ETHERNET_GBIT 0x81F
#define BCMA_CORE_PCIE 0x820
#define BCMA_CORE_PHY_N 0x821
#define BCMA_CORE_SRAM_CTL 0x822
#define BCMA_CORE_MINI_MACPHY 0x823
#define BCMA_CORE_ARM_1176 0x824
#define BCMA_CORE_ARM_7TDMI 0x825
#define BCMA_CORE_PHY_LP 0x826
#define BCMA_CORE_PMU 0x827
#define BCMA_CORE_PHY_SSN 0x828
#define BCMA_CORE_SDIO_DEV 0x829
#define BCMA_CORE_PHY_HT 0x82B
#define BCMA_CORE_MIPS_74K 0x82C
#define BCMA_CORE_MAC_GBIT 0x82D
#define BCMA_CORE_DDR12_MEM_CTL 0x82E
#define BCMA_CORE_PCIE_RC 0x82F
/* PCIe Root Complex */
#define BCMA_CORE_OCP_OCP_BRIDGE 0x830
#define BCMA_CORE_SHARED_COMMON 0x831
#define BCMA_CORE_OCP_AHB_BRIDGE 0x832
#define BCMA_CORE_SPI_HOST 0x833
#define BCMA_CORE_I2S 0x834
#define BCMA_CORE_SDR_DDR1_MEM_CTL 0x835
/* SDR/DDR1 memory controller core */
#define BCMA_CORE_SHIM 0x837
/* SHIM component in ubus/6362 */
#define BCMA_CORE_PHY_AC 0x83B
#define BCMA_CORE_PCIE2 0x83C
/* PCI Express Gen2 */
#define BCMA_CORE_USB30_DEV 0x83D
#define BCMA_CORE_GCI 0x840
#define BCMA_CORE_CMEM 0x846
/* CNDS DDR2/3 memory controller */
#define BCMA_CORE_ARM_CR4 0x83E
#define BCMA_CORE_ARM_CA7 0x847
#define BCMA_CORE_ARM_CM3 0x82A
#define BCMA_CORE_SYS_MEM 0x849
#define BCMA_CORE_DEFAULT 0xFFF
#define BCMA_MAX_NR_CORES 16
#define BCMA_CORE_SIZE 0x1000
/* clkstate */
#define CLK_NONE 0
#define CLK_SDONLY 1
#define CLK_PENDING 2
#define CLK_AVAIL 3
struct
brcmwl_event_msg
{
uint16_t
version
;
uint16_t
flags
;
uint32_t
event_type
;
uint32_t
status
;
uint32_t
reason
;
uint32_t
auth_type
;
uint32_t
datalen
;
struct
ether_addr
addr
;
char
ifname
[
IFNAMSIZ
];
uint8_t
ifidx
;
uint8_t
bsscfgidx
;
}
;
struct
brcmwl_ethhdr
{
uint16_t
subtype
;
uint16_t
length
;
uint8_t
version
;
uint8_t
oui
[
3
];
#define BRCMWL_BRCM_OUI "\x00\x10\x18"
uint16_t
usr_subtype
;
#define BRCMWL_BRCM_SUBTYPE_EVENT 1
};
struct
brcmwl_event
{
struct
ether_header
ehdr
;
#define BRCMWL_ETHERTYPE_LINK_CTL 0x886c
struct
brcmwl_ethhdr
hdr
;
struct
brcmwl_event_msg
msg
;
};
struct
brcmwl_proto_bcdc_ctl
{
int
reqid
;
char
*
buf
;
size_t
len
;
int
done
;
TAILQ_ENTRY
(
brcmwl_proto_bcdc_ctl
)
next
;
};
struct
brcmwl_proto_bcdc_dcmd
{
struct
{
uint32_t
cmd
;
uint32_t
len
;
uint32_t
flags
;
#define BRCMWL_BCDC_DCMD_ERROR (1 << 0)
#define BRCMWL_BCDC_DCMD_GET (0 << 1)
#define BRCMWL_BCDC_DCMD_SET (1 << 1)
#define BRCMWL_BCDC_DCMD_IF_GET(x) (((x) >> 12) & 0xf)
#define BRCMWL_BCDC_DCMD_IF_SET(x) (((x) & 0xf) << 12)
#define BRCMWL_BCDC_DCMD_ID_GET(x) (((x) >> 16) & 0xffff)
#define BRCMWL_BCDC_DCMD_ID_SET(x) (((x) & 0xffff) << 16)
uint32_t
status
;
}
hdr
;
char
buf
[
8192
];
};
struct
brcmwl_sdio_sdpcm_t
{
uint32_t
flags
;
uint32_t
trap_addr
;
uint32_t
assert_exp_addr
;
uint32_t
assert_file_addr
;
uint32_t
assert_line
;
uint32_t
console_addr
;
uint32_t
msgtrace_addr
;
uint8_t
tag
[
32
];
uint32_t
brpt_addr
;
};
struct
brcmwl_sdio_console_t
{
uint32_t
vcons_in
;
uint32_t
vcons_out
;
uint32_t
log_buf
;
uint32_t
log_bufsz
;
uint32_t
log_idx
;
};
struct
brcmwl_proto_bcdc_hdr
{
uint8_t
flags
;
#define BRCMWL_BCDC_FLAG_PROTO_VER 2
#define BRCMWL_BCDC_FLAG_VER(x) (((x) & 0xf) << 4)
#define BRCMWL_BCDC_FLAG_SUM_GOOD (1 << 2)
/* rx */
#define BRCMWL_BCDC_FLAG_SUM_NEEDED (1 << 3)
/* tx */
uint8_t
priority
;
#define BRCMWL_BCDC_PRIORITY_MASK 0x7
uint8_t
flags2
;
#define BRCMWL_BCDC_FLAG2_IF_MASK 0xf
uint8_t
data_offset
;
};
struct
brcmwl_sdio_hwhdr
{
uint16_t
frmlen
;
uint16_t
cksum
;
};
struct
brcmwl_sdio_hwexthdr
{
uint16_t
pktlen
;
uint8_t
res0
;
uint8_t
flags
;
uint16_t
res1
;
uint16_t
padlen
;
};
struct
brcmwl_sdio_swhdr
{
uint8_t
seqnr
;
uint8_t
chanflag
;
/* channel + flag */
#define BRCMWL_SDIO_SWHDR_CHANNEL_CONTROL 0x00
#define BRCMWL_SDIO_SWHDR_CHANNEL_EVENT 0x01
#define BRCMWL_SDIO_SWHDR_CHANNEL_DATA 0x02
#define BRCMWL_SDIO_SWHDR_CHANNEL_GLOM 0x03
#define BRCMWL_SDIO_SWHDR_CHANNEL_TEST 0x0F
#define BRCMWL_SDIO_SWHDR_CHANNEL_MASK 0x0F
uint8_t
nextlen
;
uint8_t
dataoff
;
uint8_t
flowctl
;
uint8_t
maxseqnr
;
uint16_t
res0
;
};
/**
* struct brcmwl_core - core related information.
*
* @id: core identifier.
* @rev: core revision.
* @base: base address of core register space.
*/
struct
brcmwl_core_t
{
uint16_t
id
;
uint16_t
rev
;
uint32_t
base
;
};
struct
brcmwl_chip_t
{
uint32_t
chip
;
uint32_t
chiprev
;
uint32_t
cc_caps
;
uint32_t
cc_caps_ext
;
uint32_t
pmucaps
;
uint32_t
pmurev
;
uint32_t
rambase
;
uint32_t
ramsize
;
uint32_t
srsize
;
char
name
[
FWCHAR_LEN
];
};
struct
brcmwl_chip_priv_t
{
struct
brcmwl_chip_t
pub
;
////const struct brcmwl_buscore_ops *ops;
///void *ctx;
//// assured first core is chipcommon, second core is buscore
//lst struct list_head cores;
uint16_t
num_cores
;
///bool (*iscoreup)(struct brcmwl_core_priv *core);
//void (*coredisable)(struct brcmwl_core_priv *core, u32 prereset, u32 reset);
///void (*resetcore)(struct brcmwl_core_priv *core, u32 prereset, u32 reset, u32 postreset);
};
struct
brcmwl_core_priv_t
{
struct
brcmwl_core_t
pub
;
uint32_t
wrapbase
;
//lst struct list_head coreLst;
struct
brcmwl_chip_priv_t
*
chip
;
};
struct
sb_socramregs_t
{
uint32_t
coreinfo
;
uint32_t
bwalloc
;
uint32_t
extracoreinfo
;
uint32_t
biststat
;
uint32_t
bankidx
;
uint32_t
standbyctrl
;
uint32_t
errlogstatus
;
/* rev 6 */
uint32_t
errlogaddr
;
/* rev 6 */
/* used for patching rev 3 & 5 */
uint32_t
cambankidx
;
uint32_t
cambankstandbyctrl
;
uint32_t
cambankpatchctrl
;
uint32_t
cambankpatchtblbaseaddr
;
uint32_t
cambankcmdreg
;
uint32_t
cambankdatareg
;
uint32_t
cambankmaskreg
;
uint32_t
PAD0
[
1
];
uint32_t
bankinfo
;
/* corev 8 */
uint32_t
bankpda
;
uint32_t
PAD1
[
14
];
uint32_t
extmemconfig
;
uint32_t
extmemparitycsr
;
uint32_t
extmemparityerrdata
;
uint32_t
extmemparityerrcnt
;
uint32_t
extmemwrctrlandsize
;
uint32_t
PAD2
[
84
];
uint32_t
workaround
;
uint32_t
pwrctl
;
/* corerev >= 2 */
uint32_t
PAD3
[
133
];
uint32_t
sr_control
;
/* corerev >= 15 */
uint32_t
sr_status
;
/* corerev >= 15 */
uint32_t
sr_address
;
/* corerev >= 15 */
uint32_t
sr_data
;
/* corerev >= 15 */
};
struct
bcm_chipcregs_t
{
uint32_t
chipid
;
/* 0x0 */
uint32_t
capabilities
;
uint32_t
corecontrol
;
/* corerev >= 1 */
uint32_t
bist
;
/* OTP */
uint32_t
otpstatus
;
/* 0x10, corerev >= 10 */
uint32_t
otpcontrol
;
uint32_t
otpprog
;
uint32_t
otplayout
;
/* corerev >= 23 */
/* Interrupt control */
uint32_t
intstatus
;
/* 0x20 */
uint32_t
intmask
;
/* Chip specific regs */
uint32_t
chipcontrol
;
/* 0x28, rev >= 11 */
uint32_t
chipstatus
;
/* 0x2c, rev >= 11 */
/* Jtag Master */
uint32_t
jtagcmd
;
/* 0x30, rev >= 10 */
uint32_t
jtagir
;
uint32_t
jtagdr
;
uint32_t
jtagctrl
;
/* serial flash interface registers */
uint32_t
flashcontrol
;
/* 0x40 */
uint32_t
flashaddress
;
uint32_t
flashdata
;
uint32_t
PAD1
[
1
];
/* Silicon backplane configuration broadcast control */
uint32_t
broadcastaddress
;
/* 0x50 */
uint32_t
broadcastdata
;
/* gpio - cleared only by power-on-reset */
uint32_t
gpiopullup
;
/* 0x58, corerev >= 20 */
uint32_t
gpiopulldown
;
/* 0x5c, corerev >= 20 */
uint32_t
gpioin
;
/* 0x60 */
uint32_t
gpioout
;
/* 0x64 */
uint32_t
gpioouten
;
/* 0x68 */
uint32_t
gpiocontrol
;
/* 0x6C */
uint32_t
gpiointpolarity
;
/* 0x70 */
uint32_t
gpiointmask
;
/* 0x74 */
/* GPIO events corerev >= 11 */
uint32_t
gpioevent
;
uint32_t
gpioeventintmask
;
/* Watchdog timer */
uint32_t
watchdog
;
/* 0x80 */
/* GPIO events corerev >= 11 */
uint32_t
gpioeventintpolarity
;
/* GPIO based LED powersave registers corerev >= 16 */
uint32_t
gpiotimerval
;
/* 0x88 */
uint32_t
gpiotimeroutmask
;
/* clock control */
uint32_t
clockcontrol_n
;
/* 0x90 */
uint32_t
clockcontrol_sb
;
/* aka m0 */
uint32_t
clockcontrol_pci
;
/* aka m1 */
uint32_t
clockcontrol_m2
;
/* mii/uart/mipsref */
uint32_t
clockcontrol_m3
;
/* cpu */
uint32_t
clkdiv
;
/* corerev >= 3 */
uint32_t
gpiodebugsel
;
/* corerev >= 28 */
uint32_t
capabilities_ext
;
/* 0xac */
/* pll delay registers (corerev >= 4) */
uint32_t
pll_on_delay
;
/* 0xb0 */
uint32_t
fref_sel_delay
;
uint32_t
slow_clk_ctl
;
/* 5 < corerev < 10 */
uint32_t
PAD2
;
/* Instaclock registers (corerev >= 10) */
uint32_t
system_clk_ctl
;
/* 0xc0 */
uint32_t
clkstatestretch
;
uint32_t
PAD3
[
2
];
/* Indirect backplane access (corerev >= 22) */
uint32_t
bp_addrlow
;
/* 0xd0 */
uint32_t
bp_addrhigh
;
uint32_t
bp_data
;
uint32_t
PAD4
;
uint32_t
bp_indaccess
;
uint32_t
PAD5
[
3
];
/* More clock dividers (corerev >= 32) */
uint32_t
clkdiv2
;
uint32_t
PAD6
[
2
];
/* In AI chips, pointer to erom */
uint32_t
eromptr
;
/* 0xfc */
/* ExtBus control registers (corerev >= 3) */
uint32_t
pcmcia_config
;
/* 0x100 */
uint32_t
pcmcia_memwait
;
uint32_t
pcmcia_attrwait
;
uint32_t
pcmcia_iowait
;
uint32_t
ide_config
;
uint32_t
ide_memwait
;
uint32_t
ide_attrwait
;
uint32_t
ide_iowait
;
uint32_t
prog_config
;
uint32_t
prog_waitcount
;
uint32_t
flash_config
;
uint32_t
flash_waitcount
;
uint32_t
SECI_config
;
/* 0x130 SECI configuration */
uint32_t
PAD7
[
3
];
/* Enhanced Coexistence Interface (ECI) registers (corerev >= 21) */
uint32_t
eci_output
;
/* 0x140 */
uint32_t
eci_control
;
uint32_t
eci_inputlo
;
uint32_t
eci_inputmi
;
uint32_t
eci_inputhi
;
uint32_t
eci_inputintpolaritylo
;
uint32_t
eci_inputintpolaritymi
;
uint32_t
eci_inputintpolarityhi
;
uint32_t
eci_intmasklo
;
uint32_t
eci_intmaskmi
;
uint32_t
eci_intmaskhi
;
uint32_t
eci_eventlo
;
uint32_t
eci_eventmi
;
uint32_t
eci_eventhi
;
uint32_t
eci_eventmasklo
;
uint32_t
eci_eventmaskmi
;
uint32_t
eci_eventmaskhi
;
uint32_t
PAD8
[
3
];
/* SROM interface (corerev >= 32) */
uint32_t
sromcontrol
;
/* 0x190 */
uint32_t
sromaddress
;
uint32_t
sromdata
;
uint32_t
PAD9
[
17
];
/* Clock control and hardware workarounds (corerev >= 20) */
uint32_t
clk_ctl_st
;
/* 0x1e0 */
uint32_t
hw_war
;
uint32_t
PAD10
[
70
];
/* UARTs */
uint8_t
uart0data
;
/* 0x300 */
uint8_t
uart0imr
;
uint8_t
uart0fcr
;
uint8_t
uart0lcr
;
uint8_t
uart0mcr
;
uint8_t
uart0lsr
;
uint8_t
uart0msr
;
uint8_t
uart0scratch
;
uint8_t
PAD11
[
248
];
/* corerev >= 1 */
uint8_t
uart1data
;
/* 0x400 */
uint8_t
uart1imr
;
uint8_t
uart1fcr
;
uint8_t
uart1lcr
;
uint8_t
uart1mcr
;
uint8_t
uart1lsr
;
uint8_t
uart1msr
;
uint8_t
uart1scratch
;
uint32_t
PAD12
[
62
];
/* save/restore, corerev >= 48 */
uint32_t
sr_capability
;
/* 0x500 */
uint32_t
sr_control0
;
/* 0x504 */
uint32_t
sr_control1
;
/* 0x508 */
uint32_t
gpio_control
;
/* 0x50C */
uint32_t
PAD13
[
60
];
/* PMU registers (corerev >= 20) */
uint32_t
pmucontrol
;
/* 0x600 */
uint32_t
pmucapabilities
;
uint32_t
pmustatus
;
uint32_t
res_state
;
uint32_t
res_pending
;
uint32_t
pmutimer
;
uint32_t
min_res_mask
;
uint32_t
max_res_mask
;
uint32_t
res_table_sel
;
uint32_t
res_dep_mask
;
uint32_t
res_updn_timer
;
uint32_t
res_timer
;
uint32_t
clkstretch
;
uint32_t
pmuwatchdog
;
uint32_t
gpiosel
;
/* 0x638, rev >= 1 */
uint32_t
gpioenable
;
/* 0x63c, rev >= 1 */
uint32_t
res_req_timer_sel
;
uint32_t
res_req_timer
;
uint32_t
res_req_mask
;
uint32_t
pmucapabilities_ext
;
/* 0x64c, pmurev >=15 */
uint32_t
chipcontrol_addr
;
/* 0x650 */
uint32_t
chipcontrol_data
;
/* 0x654 */
uint32_t
regcontrol_addr
;
uint32_t
regcontrol_data
;
uint32_t
pllcontrol_addr
;
uint32_t
pllcontrol_data
;
uint32_t
pmustrapopt
;
/* 0x668, corerev >= 28 */
uint32_t
pmu_xtalfreq
;
/* 0x66C, pmurev >= 10 */
uint32_t
retention_ctl
;
/* 0x670, pmurev >= 15 */
uint32_t
PAD14
[
3
];
uint32_t
retention_grpidx
;
/* 0x680 */
uint32_t
retention_grpctl
;
/* 0x684 */
uint32_t
PAD15
[
94
];
uint16_t
sromotp
[
768
];
};
/* sdio core registers */
struct
sdpcmd_regs_t
{
uint32_t
corecontrol
;
/* 0x00, rev8 */
uint32_t
corestatus
;
/* rev8 */
uint32_t
PAD0
[
1
];
uint32_t
biststatus
;
/* rev8 */
/* PCMCIA access */
uint16_t
pcmciamesportaladdr
;
/* 0x010, rev8 */
uint16_t
PAD1
[
1
];
uint16_t
pcmciamesportalmask
;
/* rev8 */
uint16_t
PAD2
[
1
];
uint16_t
pcmciawrframebc
;
/* rev8 */
uint16_t
PAD3
[
1
];
uint16_t
pcmciaunderflowtimer
;
/* rev8 */
uint16_t
PAD4
[
1
];
/* interrupt */
uint32_t
intstatus
;
/* 0x020, rev8 */
uint32_t
hostintmask
;
/* rev8 */
uint32_t
intmask
;
/* rev8 */
uint32_t
sbintstatus
;
/* rev8 */
uint32_t
sbintmask
;
/* rev8 */
uint32_t
funcintmask
;
/* rev4 */
uint32_t
PAD5
[
2
];
uint32_t
tosbmailbox
;
/* 0x040, rev8 */
uint32_t
tohostmailbox
;
/* rev8 */
uint32_t
tosbmailboxdata
;
/* rev8 */
uint32_t
tohostmailboxdata
;
/* rev8 */
/* synchronized access to registers in SDIO clock domain */
uint32_t
sdioaccess
;
/* 0x050, rev8 */
uint32_t
PAD6
[
3
];
/* PCMCIA frame control */
uint8_t
pcmciaframectrl
;
/* 0x060, rev8 */
uint8_t
PAD7
[
3
];
uint8_t
pcmciawatermark
;
/* rev8 */
uint8_t
PAD8
[
155
];
/* interrupt batching control */
uint32_t
intrcvlazy
;
/* 0x100, rev8 */
uint32_t
PAD9
[
3
];
/* counters */
uint32_t
cmd52rd
;
/* 0x110, rev8 */
uint32_t
cmd52wr
;
/* rev8 */
uint32_t
cmd53rd
;
/* rev8 */
uint32_t
cmd53wr
;
/* rev8 */
uint32_t
abort
;
/* rev8 */
uint32_t
datacrcerror
;
/* rev8 */
uint32_t
rdoutofsync
;
/* rev8 */
uint32_t
wroutofsync
;
/* rev8 */
uint32_t
writebusy
;
/* rev8 */
uint32_t
readwait
;
/* rev8 */
uint32_t
readterm
;
/* rev8 */
uint32_t
writeterm
;
/* rev8 */
uint32_t
PAD10
[
40
];
uint32_t
clockctlstatus
;
/* rev8 */
uint32_t
PAD11
[
7
];
uint32_t
PAD12
[
128
];
/* DMA engines */
/* SDIO/PCMCIA CIS region */
char
cis13
[
512
];
/* 0x400-0x5ff, rev6 */
/* PCMCIA function control registers */
char
pcmciafcr
[
256
];
/* 0x600-6ff, rev6 */
uint16_t
PAD14
[
55
];
/* PCMCIA backplane access */
uint16_t
backplanecsr
;
/* 0x76E, rev6 */
uint16_t
backplaneaddr0
;
/* rev6 */
uint16_t
backplaneaddr1
;
/* rev6 */
uint16_t
backplaneaddr2
;
/* rev6 */
uint16_t
backplaneaddr3
;
/* rev6 */
uint16_t
backplanedata0
;
/* rev6 */
uint16_t
backplanedata1
;
/* rev6 */
uint16_t
backplanedata2
;
/* rev6 */
uint16_t
backplanedata3
;
/* rev6 */
uint16_t
PAD15
[
31
];
/* sprom "size" & "blank" info */
uint16_t
spromstatus
;
/* 0x7BE, rev2 */
uint32_t
PAD16
[
464
];
uint16_t
PAD17
[
0x80
];
};
#define SD_REG(field) \
(offsetof(struct sdpcmd_regs_t, field))
/* Current protocol version */
#define SDPCM_PROT_VERSION 4
/* tosbmailboxdata */
#define SMB_DATA_VERSION_SHIFT 16
/* host protocol version */
#define CORE_CC_REG(base, field) (base + offsetof(struct bcm_chipcregs_t, field))
typedef
enum
{
BWN_PHY_BAND_2G
=
0
,
BWN_PHY_BAND_5G_LO
=
1
,
BWN_PHY_BAND_5G_MI
=
2
,
BWN_PHY_BAND_5G_HI
=
3
}
bwn_phy_band_t
;
typedef
enum
{
BWN_BAND_2G
,
BWN_BAND_5G
,
}
bwn_band_t
;
typedef
enum
{
BWN_CHAN_TYPE_20
,
BWN_CHAN_TYPE_20_HT
,
BWN_CHAN_TYPE_40_HT_U
,
BWN_CHAN_TYPE_40_HT_D
,
}
bwn_chan_type_t
;
struct
bwn_rate
{
uint16_t
rateid
;
uint32_t
flags
;
};
#define BWN_ANT0 0
#define BWN_ANT1 1
#define BWN_ANTAUTO0 2
#define BWN_ANTAUTO1 3
#define BWN_ANT2 4
#define BWN_ANT3 8
#define BWN_ANTAUTO BWN_ANTAUTO0
#define BWN_ANT_DEFAULT BWN_ANTAUTO
#define BWN_TX_SLOTS_PER_FRAME 2
struct
bwn_channel
{
unsigned
freq
;
unsigned
ieee
;
unsigned
maxTxPow
;
};
struct
bwn_channelinfo
{
struct
bwn_channel
channels
[
IEEE80211_CHAN_MAX
];
unsigned
nchannels
;
};
struct
bwn_bbatt
{
uint8_t
att
;
};
struct
bwn_bbatt_list
{
const
struct
bwn_bbatt
*
array
;
uint8_t
len
;
uint8_t
min
;
uint8_t
max
;
};
struct
bwn_rfatt
{
uint8_t
att
;
int
padmix
;
};
struct
bwn_rfatt_list
{
const
struct
bwn_rfatt
*
array
;
uint8_t
len
;
uint8_t
min
;
uint8_t
max
;
};
#define BWN_DC_LT_SIZE 32
struct
bwn_loctl
{
int8_t
i
;
int8_t
q
;
};
typedef
enum
{
BWN_TXPWR_RES_NEED_ADJUST
,
BWN_TXPWR_RES_DONE
,
}
bwn_txpwr_result_t
;
struct
bwn_lo_calib
{
struct
bwn_bbatt
bbatt
;
struct
bwn_rfatt
rfatt
;
struct
bwn_loctl
ctl
;
unsigned
long
calib_time
;
TAILQ_ENTRY
(
bwn_lo_calib
)
list
;
};
struct
bwn_rxhdr4
{
uint16_t
frame_len
;
uint8_t
pad1
[
2
];
uint16_t
phy_status0
;
union
{
struct
{
uint8_t
rssi
;
uint8_t
sig_qual
;
}
__packed
abg
;
struct
{
int8_t
power0
;
int8_t
power1
;
}
__packed
n
;
}
__packed
phy
;
union
{
struct
{
int8_t
power2
;
uint8_t
pad
;
}
__packed
n
;
struct
{
uint8_t
pad
;
int8_t
ht_power0
;
}
__packed
ht
;
uint16_t
phy_status2
;
}
__packed
ps2
;
union
{
struct
{
uint16_t
phy_status3
;
}
__packed
lp
;
struct
{
int8_t
phy_ht_power1
;
int8_t
phy_ht_power2
;
}
__packed
ht
;
}
__packed
ps3
;
union
{
struct
{
uint32_t
mac_status
;
uint16_t
mac_time
;
uint16_t
channel
;
}
__packed
r351
;
struct
{
uint16_t
phy_status4
;
uint16_t
phy_status5
;
uint32_t
mac_status
;
uint16_t
mac_time
;
uint16_t
channel
;
}
__packed
r598
;
}
__packed
ps4
;
}
__packed
;
struct
bwn_txstatus
{
uint16_t
cookie
;
uint16_t
seq
;
uint8_t
phy_stat
;
uint8_t
framecnt
;
uint8_t
rtscnt
;
uint8_t
sreason
;
uint8_t
pm
;
uint8_t
im
;
uint8_t
ampdu
;
uint8_t
ack
;
};
#define BWN_TXCTL_PA3DB 0x40
#define BWN_TXCTL_PA2DB 0x20
#define BWN_TXCTL_TXMIX 0x10
struct
bwn_txpwr_loctl
{
struct
bwn_rfatt_list
rfatt
;
struct
bwn_bbatt_list
bbatt
;
uint16_t
dc_lt
[
BWN_DC_LT_SIZE
];
TAILQ_HEAD
(,
bwn_lo_calib
)
calib_list
;
unsigned
long
pwr_vec_read_time
;
unsigned
long
txctl_measured_time
;
uint8_t
tx_bias
;
uint8_t
tx_magn
;
uint64_t
power_vector
;
};
#define BWN_OFDMTAB_DIR_UNKNOWN 0
#define BWN_OFDMTAB_DIR_READ 1
#define BWN_OFDMTAB_DIR_WRITE 2
struct
bwn_phy_g
{
unsigned
pg_flags
;
#define BWN_PHY_G_FLAG_TSSITABLE_ALLOC (1 << 0)
#define BWN_PHY_G_FLAG_RADIOCTX_VALID (1 << 1)
int
pg_aci_enable
;
int
pg_aci_wlan_automatic
;
int
pg_aci_hw_rssi
;
int
pg_rf_on
;
uint16_t
pg_radioctx_over
;
uint16_t
pg_radioctx_overval
;
uint16_t
pg_minlowsig
[
2
];
uint16_t
pg_minlowsigpos
[
2
];
int8_t
*
pg_tssi2dbm
;
int
pg_idletssi
;
int
pg_curtssi
;
uint8_t
pg_avgtssi
;
struct
bwn_bbatt
pg_bbatt
;
struct
bwn_rfatt
pg_rfatt
;
uint8_t
pg_txctl
;
int
pg_bbatt_delta
;
int
pg_rfatt_delta
;
struct
bwn_txpwr_loctl
pg_loctl
;
int16_t
pg_max_lb_gain
;
int16_t
pg_trsw_rx_gain
;
int16_t
pg_lna_lod_gain
;
int16_t
pg_lna_gain
;
int16_t
pg_pga_gain
;
int
pg_immode
;
#define BWN_INTERFSTACK_SIZE 26
uint32_t
pg_interfstack
[
BWN_INTERFSTACK_SIZE
];
int16_t
pg_nrssi
[
2
];
int32_t
pg_nrssi_slope
;
int8_t
pg_nrssi_lt
[
64
];
uint16_t
pg_lofcal
;
uint16_t
pg_initval
;
uint16_t
pg_ofdmtab_addr
;
unsigned
pg_ofdmtab_dir
;
};
#define BWN_IMMODE_NONE 0
#define BWN_IMMODE_NONWLAN 1
#define BWN_IMMODE_MANUAL 2
#define BWN_IMMODE_AUTO 3
#define BWN_PHYLP_TXPCTL_UNKNOWN 0
#define BWN_PHYLP_TXPCTL_OFF 1
#define BWN_PHYLP_TXPCTL_ON_SW 2
#define BWN_PHYLP_TXPCTL_ON_HW 3
struct
bwn_phy_lp
{
uint8_t
plp_chan
;
uint8_t
plp_chanfullcal
;
int32_t
plp_antenna
;
uint8_t
plp_txpctlmode
;
uint8_t
plp_txisoband_h
;
uint8_t
plp_txisoband_m
;
uint8_t
plp_txisoband_l
;
uint8_t
plp_rxpwroffset
;
int8_t
plp_txpwridx
;
uint16_t
plp_tssiidx
;
uint16_t
plp_tssinpt
;
uint8_t
plp_rssivf
;
uint8_t
plp_rssivc
;
uint8_t
plp_rssigs
;
uint8_t
plp_rccap
;
uint8_t
plp_bxarch
;
uint8_t
plp_crsusr_off
;
uint8_t
plp_crssys_off
;
uint32_t
plp_div
;
int32_t
plp_tonefreq
;
uint16_t
plp_digfilt
[
9
];
};
/* for LP */
struct
bwn_txgain
{
uint16_t
tg_gm
;
uint16_t
tg_pga
;
uint16_t
tg_pad
;
uint16_t
tg_dac
;
};
struct
bwn_rxcompco
{
uint8_t
rc_chan
;
int8_t
rc_c1
;
int8_t
rc_c0
;
};
struct
bwn_phy_lp_iq_est
{
uint32_t
ie_iqprod
;
uint32_t
ie_ipwr
;
uint32_t
ie_qpwr
;
};
struct
bwn_txgain_entry
{
uint8_t
te_gm
;
uint8_t
te_pga
;
uint8_t
te_pad
;
uint8_t
te_dac
;
uint8_t
te_bbmult
;
};
/* only for LP PHY */
struct
bwn_stxtable
{
uint16_t
st_phyoffset
;
uint16_t
st_physhift
;
uint16_t
st_rfaddr
;
uint16_t
st_rfshift
;
uint16_t
st_mask
;
};
struct
bwn_b206x_chan
{
uint8_t
bc_chan
;
uint16_t
bc_freq
;
const
uint8_t
*
bc_data
;
};
struct
bwn_b206x_rfinit_entry
{
uint16_t
br_offset
;
uint16_t
br_valuea
;
uint16_t
br_valueg
;
uint8_t
br_flags
;
};
struct
bwn_phy_n
;
struct
bwn_phy
{
uint8_t
type
;
uint8_t
rev
;
uint8_t
analog
;
int
supports_2ghz
;
int
supports_5ghz
;
int
gmode
;
struct
bwn_phy_g
phy_g
;
struct
bwn_phy_lp
phy_lp
;
/*
* I'd like the newer PHY code to not hide in the top-level
* structs..
*/
struct
bwn_phy_n
*
phy_n
;
uint16_t
rf_manuf
;
uint16_t
rf_ver
;
uint8_t
rf_rev
;
int
rf_on
;
int
phy_do_full_init
;
int
txpower
;
int
hwpctl
;
unsigned
long
nexttime
;
unsigned
int
chan
;
int
txerrors
;
int
(
*
attach
)(
struct
bwn_mac
*
);
void
(
*
detach
)(
struct
bwn_mac
*
);
int
(
*
prepare_hw
)(
struct
bwn_mac
*
);
void
(
*
init_pre
)(
struct
bwn_mac
*
);
int
(
*
init
)(
struct
bwn_mac
*
);
void
(
*
exit
)(
struct
bwn_mac
*
);
uint16_t
(
*
phy_read
)(
struct
bwn_mac
*
,
uint16_t
);
void
(
*
phy_write
)(
struct
bwn_mac
*
,
uint16_t
,
uint16_t
);
void
(
*
phy_maskset
)(
struct
bwn_mac
*
,
uint16_t
,
uint16_t
,
uint16_t
);
uint16_t
(
*
rf_read
)(
struct
bwn_mac
*
,
uint16_t
);
void
(
*
rf_write
)(
struct
bwn_mac
*
,
uint16_t
,
uint16_t
);
int
(
*
use_hwpctl
)(
struct
bwn_mac
*
);
void
(
*
rf_onoff
)(
struct
bwn_mac
*
,
int
);
void
(
*
switch_analog
)(
struct
bwn_mac
*
,
int
);
int
(
*
switch_channel
)(
struct
bwn_mac
*
,
unsigned
int
);
uint32_t
(
*
get_default_chan
)(
struct
bwn_mac
*
);
void
(
*
set_antenna
)(
struct
bwn_mac
*
,
int
);
int
(
*
set_im
)(
struct
bwn_mac
*
,
int
);
bwn_txpwr_result_t
(
*
recalc_txpwr
)(
struct
bwn_mac
*
,
int
);
void
(
*
set_txpwr
)(
struct
bwn_mac
*
);
void
(
*
task_15s
)(
struct
bwn_mac
*
);
void
(
*
task_60s
)(
struct
bwn_mac
*
);
};
struct
bwn_chan_band
{
uint32_t
flags
;
uint8_t
nchan
;
#define BWN_MAX_CHAN_PER_BAND 14
uint8_t
chan
[
BWN_MAX_CHAN_PER_BAND
];
};
#define BWN_NR_WMEPARAMS 16
enum
{
BWN_WMEPARAM_TXOP
=
0
,
BWN_WMEPARAM_CWMIN
,
BWN_WMEPARAM_CWMAX
,
BWN_WMEPARAM_CWCUR
,
BWN_WMEPARAM_AIFS
,
BWN_WMEPARAM_BSLOTS
,
BWN_WMEPARAM_REGGAP
,
BWN_WMEPARAM_STATUS
,
};
#define BWN_WME_PARAMS(queue) \
(BWN_SHARED_EDCFQ + (BWN_NR_WMEPARAMS * sizeof(uint16_t) * (queue)))
#define BWN_WME_BACKGROUND BWN_WME_PARAMS(0)
#define BWN_WME_BESTEFFORT BWN_WME_PARAMS(1)
#define BWN_WME_VIDEO BWN_WME_PARAMS(2)
#define BWN_WME_VOICE BWN_WME_PARAMS(3)
/*
* Radio capture format.
*/
#define BWN_RX_RADIOTAP_PRESENT ( \
(1 << IEEE80211_RADIOTAP_TSFT) | \
(1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
(1 << IEEE80211_RADIOTAP_ANTENNA) | \
(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \
0)
struct
bwn_rx_radiotap_header
{
struct
ieee80211_radiotap_header
wr_ihdr
;
uint64_t
wr_tsf
;
u_int8_t
wr_flags
;
u_int8_t
wr_rate
;
u_int16_t
wr_chan_freq
;
u_int16_t
wr_chan_flags
;
int8_t
wr_antsignal
;
int8_t
wr_antnoise
;
u_int8_t
wr_antenna
;
};
#define BWN_TX_RADIOTAP_PRESENT ( \
(1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
(1 << IEEE80211_RADIOTAP_DBM_TX_POWER) | \
(1 << IEEE80211_RADIOTAP_ANTENNA) | \
0)
struct
bwn_tx_radiotap_header
{
struct
ieee80211_radiotap_header
wt_ihdr
;
u_int8_t
wt_flags
;
u_int8_t
wt_rate
;
u_int16_t
wt_chan_freq
;
u_int16_t
wt_chan_flags
;
u_int8_t
wt_txpower
;
u_int8_t
wt_antenna
;
};
struct
bwn_stats
{
int32_t
rtsfail
;
int32_t
rts
;
int32_t
link_noise
;
};
/* Noise Calculation (Link Quality) */
struct
bwn_noise
{
uint8_t
noi_running
;
uint8_t
noi_nsamples
;
int8_t
noi_samples
[
8
][
4
];
};
#define BWN_DMA_30BIT 30
#define BWN_DMA_32BIT 32
#define BWN_DMA_64BIT 64
struct
bwn_dmadesc_meta
{
bus_dmamap_t
mt_dmap
;
bus_addr_t
mt_paddr
;
struct
mbuf
*
mt_m
;
struct
ieee80211_node
*
mt_ni
;
uint8_t
mt_txtype
;
#define BWN_DMADESC_METATYPE_HEADER 0
#define BWN_DMADESC_METATYPE_BODY 1
uint8_t
mt_islast
;
};
#define BWN_DMAINTR_FATALMASK \
((1 << 10) | (1 << 11) | (1 << 12) | (1 << 14) | (1 << 15))
#define BWN_DMAINTR_NONFATALMASK (1 << 13)
#define BWN_DMAINTR_RX_DONE (1 << 16)
#define BWN_DMA32_DCTL_BYTECNT 0x00001fff
#define BWN_DMA32_DCTL_ADDREXT_MASK 0x00030000
#define BWN_DMA32_DCTL_ADDREXT_SHIFT 16
#define BWN_DMA32_DCTL_DTABLEEND 0x10000000
#define BWN_DMA32_DCTL_IRQ 0x20000000
#define BWN_DMA32_DCTL_FRAMEEND 0x40000000
#define BWN_DMA32_DCTL_FRAMESTART 0x80000000
struct
bwn_dmadesc32
{
uint32_t
control
;
uint32_t
address
;
}
__packed
;
#define BWN_DMA64_DCTL0_DTABLEEND 0x10000000
#define BWN_DMA64_DCTL0_IRQ 0x20000000
#define BWN_DMA64_DCTL0_FRAMEEND 0x40000000
#define BWN_DMA64_DCTL0_FRAMESTART 0x80000000
#define BWN_DMA64_DCTL1_BYTECNT 0x00001fff
#define BWN_DMA64_DCTL1_ADDREXT_MASK 0x00030000
#define BWN_DMA64_DCTL1_ADDREXT_SHIFT 16
struct
bwn_dmadesc64
{
uint32_t
control0
;
uint32_t
control1
;
uint32_t
address_low
;
uint32_t
address_high
;
}
__packed
;
struct
bwn_dmadesc_generic
{
union
{
struct
bwn_dmadesc32
dma32
;
struct
bwn_dmadesc64
dma64
;
}
__packed
dma
;
}
__packed
;
struct
bwn_dma_ring
;
struct
bwn_dma_ring
{
struct
bwn_mac
*
dr_mac
;
const
struct
bwn_dma_ops
*
dr_ops
;
struct
bwn_dmadesc_meta
*
dr_meta
;
void
*
dr_txhdr_cache
;
bus_dma_tag_t
dr_ring_dtag
;
bus_dma_tag_t
dr_txring_dtag
;
bus_dmamap_t
dr_spare_dmap
;
/* only for RX */
bus_dmamap_t
dr_ring_dmap
;
bus_addr_t
dr_txring_paddr
;
void
*
dr_ring_descbase
;
bus_addr_t
dr_ring_dmabase
;
int
dr_numslots
;
int
dr_usedslot
;
int
dr_curslot
;
uint32_t
dr_frameoffset
;
uint16_t
dr_rx_bufsize
;
uint16_t
dr_base
;
int
dr_index
;
uint8_t
dr_tx
;
uint8_t
dr_stop
;
int
dr_type
;
void
(
*
getdesc
)(
struct
bwn_dma_ring
*
,
int
,
struct
bwn_dmadesc_generic
**
,
struct
bwn_dmadesc_meta
**
);
void
(
*
setdesc
)(
struct
bwn_dma_ring
*
,
struct
bwn_dmadesc_generic
*
,
bus_addr_t
,
uint16_t
,
int
,
int
,
int
);
void
(
*
start_transfer
)(
struct
bwn_dma_ring
*
,
int
);
void
(
*
suspend
)(
struct
bwn_dma_ring
*
);
void
(
*
resume
)(
struct
bwn_dma_ring
*
);
int
(
*
get_curslot
)(
struct
bwn_dma_ring
*
);
void
(
*
set_curslot
)(
struct
bwn_dma_ring
*
,
int
);
};
struct
bwn_dma
{
int
dmatype
;
bus_dma_tag_t
parent_dtag
;
bus_dma_tag_t
rxbuf_dtag
;
bus_dma_tag_t
txbuf_dtag
;
struct
bwn_dma_ring
*
wme
[
5
];
struct
bwn_dma_ring
*
mcast
;
struct
bwn_dma_ring
*
rx
;
uint64_t
lastseq
;
/* XXX FIXME */
};
struct
bwn_pio_rxqueue
{
struct
bwn_mac
*
prq_mac
;
uint16_t
prq_base
;
uint8_t
prq_rev
;
};
struct
bwn_pio_txqueue
;
struct
bwn_pio_txpkt
{
struct
bwn_pio_txqueue
*
tp_queue
;
struct
ieee80211_node
*
tp_ni
;
struct
mbuf
*
tp_m
;
uint8_t
tp_index
;
TAILQ_ENTRY
(
bwn_pio_txpkt
)
tp_list
;
};
#define BWN_PIO_MAX_TXPACKETS 32
struct
bwn_pio_txqueue
{
uint16_t
tq_base
;
uint16_t
tq_size
;
uint16_t
tq_used
;
uint16_t
tq_free
;
uint8_t
tq_index
;
struct
bwn_pio_txpkt
tq_pkts
[
BWN_PIO_MAX_TXPACKETS
];
TAILQ_HEAD
(,
bwn_pio_txpkt
)
tq_pktlist
;
};
struct
bwn_pio
{
struct
bwn_pio_txqueue
wme
[
5
];
struct
bwn_pio_txqueue
mcast
;
struct
bwn_pio_rxqueue
rx
;
};
struct
bwn_plcp4
{
union
{
uint32_t
data
;
uint8_t
raw
[
4
];
}
__packed
o
;
}
__packed
;
struct
bwn_plcp6
{
union
{
uint32_t
data
;
uint8_t
raw
[
6
];
}
__packed
o
;
}
__packed
;
struct
bwn_txhdr
{
uint32_t
macctl
;
uint8_t
macfc
[
2
];
uint16_t
tx_festime
;
uint16_t
phyctl
;
uint16_t
phyctl_1
;
uint16_t
phyctl_1fb
;
uint16_t
phyctl_1rts
;
uint16_t
phyctl_1rtsfb
;
uint8_t
phyrate
;
uint8_t
phyrate_rts
;
uint8_t
eftypes
;
/* extra frame types */
uint8_t
chan
;
uint8_t
iv
[
16
];
uint8_t
addr1
[
IEEE80211_ADDR_LEN
];
uint16_t
tx_festime_fb
;
struct
bwn_plcp6
rts_plcp_fb
;
uint16_t
rts_dur_fb
;
struct
bwn_plcp6
plcp_fb
;
uint16_t
dur_fb
;
uint16_t
mimo_modelen
;
uint16_t
mimo_ratelen_fb
;
uint32_t
timeout
;
union
{
/* format <= r351 */
struct
{
uint8_t
pad0
[
2
];
uint16_t
cookie
;
uint16_t
tx_status
;
struct
bwn_plcp6
rts_plcp
;
uint8_t
rts_frame
[
16
];
uint8_t
pad1
[
2
];
struct
bwn_plcp6
plcp
;
}
__packed
r351
;
/* format > r410 < r598 */
struct
{
uint16_t
mimo_antenna
;
uint16_t
preload_size
;
uint8_t
pad0
[
2
];
uint16_t
cookie
;
uint16_t
tx_status
;
struct
bwn_plcp6
rts_plcp
;
uint8_t
rts_frame
[
16
];
uint8_t
pad1
[
2
];
struct
bwn_plcp6
plcp
;
}
__packed
r410
;
struct
{
uint16_t
mimo_antenna
;
uint16_t
preload_size
;
uint8_t
pad0
[
2
];
uint16_t
cookie
;
uint16_t
tx_status
;
uint16_t
max_n_mpdus
;
uint16_t
max_a_bytes_mrt
;
uint16_t
max_a_bytes_fbr
;
uint16_t
min_m_bytes
;
struct
bwn_plcp6
rts_plcp
;
uint8_t
rts_frame
[
16
];
uint8_t
pad1
[
2
];
struct
bwn_plcp6
plcp
;
}
__packed
r598
;
}
__packed
body
;
}
__packed
;
#define BWN_FWTYPE_UCODE 'u'
#define BWN_FWTYPE_PCM 'p'
#define BWN_FWTYPE_IV 'i'
struct
bwn_fwhdr
{
uint8_t
type
;
uint8_t
ver
;
uint8_t
pad
[
2
];
uint32_t
size
;
}
__packed
;
#define BWN_FWINITVALS_OFFSET_MASK 0x7fff
#define BWN_FWINITVALS_32BIT 0x8000
struct
bwn_fwinitvals
{
uint16_t
offset_size
;
union
{
uint16_t
d16
;
uint32_t
d32
;
}
__packed
data
;
}
__packed
;
enum
bwn_fw_hdr_format
{
BWN_FW_HDR_598
,
BWN_FW_HDR_410
,
BWN_FW_HDR_351
,
};
enum
bwn_fwtype
{
BWN_FWTYPE_DEFAULT
,
BWN_FWTYPE_OPENSOURCE
,
BWN_NR_FWTYPES
,
};
struct
bwn_fwfile
{
const
char
*
filename
;
const
struct
firmware
*
fw
;
enum
bwn_fwtype
type
;
};
struct
bwn_key
{
void
*
keyconf
;
uint8_t
algorithm
;
};
struct
bwn_fw
{
struct
bwn_fwfile
bin
;
struct
bwn_fwfile
nvram
;
struct
bwn_fwfile
ucode
;
struct
bwn_fwfile
pcm
;
struct
bwn_fwfile
initvals
;
struct
bwn_fwfile
initvals_band
;
enum
bwn_fw_hdr_format
fw_hdr_format
;
uint16_t
rev
;
uint16_t
patch
;
uint8_t
opensource
;
uint8_t
no_pcmfile
;
};
struct
bwn_lo_g_sm
{
int
curstate
;
int
nmeasure
;
int
multipler
;
uint16_t
feedth
;
struct
bwn_loctl
loctl
;
};
struct
bwn_lo_g_value
{
uint8_t
old_channel
;
uint16_t
phy_lomask
;
uint16_t
phy_extg
;
uint16_t
phy_dacctl_hwpctl
;
uint16_t
phy_dacctl
;
uint16_t
phy_hpwr_tssictl
;
uint16_t
phy_analogover
;
uint16_t
phy_analogoverval
;
uint16_t
phy_rfover
;
uint16_t
phy_rfoverval
;
uint16_t
phy_classctl
;
uint16_t
phy_crs0
;
uint16_t
phy_pgactl
;
uint16_t
phy_syncctl
;
uint16_t
phy_cck0
;
uint16_t
phy_cck1
;
uint16_t
phy_cck2
;
uint16_t
phy_cck3
;
uint16_t
phy_cck4
;
uint16_t
reg0
;
uint16_t
reg1
;
uint16_t
rf0
;
uint16_t
rf1
;
uint16_t
rf2
;
};
#define BWN_LED_MAX 4
#define BWN_LED_EVENT_NONE -1
#define BWN_LED_EVENT_POLL 0
#define BWN_LED_EVENT_TX 1
#define BWN_LED_EVENT_RX 2
#define BWN_LED_SLOWDOWN(dur) (dur) = (((dur) * 3) / 2)
struct
bwn_led
{
uint8_t
led_flags
;
/* BWN_LED_F_ */
uint8_t
led_act
;
/* BWN_LED_ACT_ */
uint8_t
led_mask
;
};
#define BWN_LED_F_ACTLOW 0x1
#define BWN_LED_F_BLINK 0x2
#define BWN_LED_F_POLLABLE 0x4
#define BWN_LED_F_SLOW 0x8
struct
bwn_mac
{
struct
brcmwl_softc
*
mac_sc
;
unsigned
mac_status
;
#define BWN_MAC_STATUS_UNINIT 0
#define BWN_MAC_STATUS_INITED 1
#define BWN_MAC_STATUS_STARTED 2
unsigned
mac_flags
;
/* use "Bad Frames Preemption" */
#define BWN_MAC_FLAG_BADFRAME_PREEMP (1 << 0)
#define BWN_MAC_FLAG_DFQVALID (1 << 1)
#define BWN_MAC_FLAG_RADIO_ON (1 << 2)
#define BWN_MAC_FLAG_DMA (1 << 3)
#define BWN_MAC_FLAG_WME (1 << 4)
#define BWN_MAC_FLAG_HWCRYPTO (1 << 5)
/* struct resource_spec *mac_intr_spec;
#define BWN_MSI_MESSAGES 1
struct resource *mac_res_irq[BWN_MSI_MESSAGES];
void *mac_intrhand[BWN_MSI_MESSAGES];
int mac_msi;*/
struct
bwn_noise
mac_noise
;
struct
bwn_phy
mac_phy
;
struct
bwn_stats
mac_stats
;
uint32_t
mac_reason_intr
;
uint32_t
mac_reason
[
6
];
uint32_t
mac_intr_mask
;
int
mac_suspended
;
struct
bwn_fw
mac_fw
;
union
{
struct
bwn_dma
dma
;
struct
bwn_pio
pio
;
}
mac_method
;
uint16_t
mac_ktp
;
/* Key table pointer */
uint8_t
mac_max_nr_keys
;
struct
bwn_key
mac_key
[
58
];
unsigned
int
mac_task_state
;
struct
task
mac_intrtask
;
struct
task
mac_hwreset
;
struct
task
mac_txpower
;
TAILQ_ENTRY
(
bwn_mac
)
mac_list
;
};
static
inline
int
bwn_tx_hdrsize
(
struct
bwn_mac
*
mac
)
{
switch
(
mac
->
mac_fw
.
fw_hdr_format
)
{
case
BWN_FW_HDR_598
:
return
(
112
+
(
sizeof
(
struct
bwn_plcp6
)));
case
BWN_FW_HDR_410
:
return
(
104
+
(
sizeof
(
struct
bwn_plcp6
)));
case
BWN_FW_HDR_351
:
return
(
100
+
(
sizeof
(
struct
bwn_plcp6
)));
default
:
printf
(
"%s: unknown header format (%d)
\n
"
,
__func__
,
mac
->
mac_fw
.
fw_hdr_format
);
return
(
112
+
(
sizeof
(
struct
bwn_plcp6
)));
}
}
/*
* Driver-specific vap state.
*/
struct
bwn_vap
{
struct
ieee80211vap
bv_vap
;
/* base class */
int
(
*
bv_newstate
)(
struct
ieee80211vap
*
,
enum
ieee80211_state
,
int
);
};
#define BWN_VAP(vap) ((struct bwn_vap *)(vap))
#define BWN_VAP_CONST(vap) ((const struct mwl_vap *)(vap))
struct
id_struct_t
{
char
fwname
[
FWCHAR_LEN
];
uint32_t
rambase
;
uint32_t
ramsize
;
uint32_t
srsize
;
};
struct
brcmwl_softc
{
device_t
sc_dev
;
struct
brcmwl_core_priv_t
*
prCoreSoc
;
struct
brcmwl_core_priv_t
*
prCoreRam
;
struct
brcmwl_core_priv_t
*
prCoreNet
;
struct
brcmwl_core_priv_t
*
prCoreComm
;
struct
brcmwl_core_priv_t
*
prCorePmu
;
struct
brcmwl_core_priv_t
*
prCoreSdio
;
struct
brcmwl_chip_priv_t
*
bcmChip
;
if_t
ifp
;
struct
ifmedia
ifmedia
;
/* network interface media structure */
int
mtu
;
uint8_t
macaddr
[
6
];
uint8_t
*
sc_bounce_buf
;
uint32_t
sc_bounce_size
;
int
sc_tx_count
;
uint8_t
sc_tx_seq
;
uint8_t
sc_tx_max_seq
;
int
sc_bcdc_reqid
;
TAILQ_HEAD
(,
brcmwl_proto_bcdc_ctl
)
sc_bcdc_rxctlq
;
unsigned
int
clkstate
;
bool
alp_only
;
bool
sr_enabled
;
uint32_t
console_addr
;
unsigned
int
blocksize
;
unsigned
int
roundup
;
uint32_t
hostintmask
;
struct
id_struct_t
predef_val
;
uint32_t
backplaneAddr
;
struct
mtx
sc_mtx
;
struct
ieee80211com
sc_ic
;
struct
mbufq
sc_snd
;
unsigned
sc_flags
;
#define BWN_FLAG_ATTACHED (1 << 0)
#define BWN_FLAG_INVALID (1 << 1)
#define BWN_FLAG_NEED_BEACON_TP (1 << 2)
#define BWN_FLAG_RUNNING (1 << 3)
unsigned
sc_debug
;
struct
bwn_mac
*
sc_curmac
;
TAILQ_HEAD
(,
bwn_mac
)
sc_maclist
;
uint8_t
sc_bssid
[
IEEE80211_ADDR_LEN
];
unsigned
int
sc_filters
;
uint8_t
sc_beacons
[
2
];
uint8_t
sc_rf_enabled
;
struct
wmeParams
sc_wmeParams
[
4
];
struct
callout
sc_rfswitch_ch
;
/* for laptop */
struct
callout
sc_task_ch
;
struct
callout
sc_watchdog_ch
;
int
sc_watchdog_timer
;
struct
taskqueue
*
sc_tq
;
/* private task queue */
int
(
*
sc_newstate
)(
struct
ieee80211com
*
,
enum
ieee80211_state
,
int
);
void
(
*
sc_node_cleanup
)(
struct
ieee80211_node
*
);
int
sc_rx_rate
;
int
sc_tx_rate
;
int
sc_led_blinking
;
int
sc_led_ticks
;
struct
bwn_led
*
sc_blink_led
;
struct
callout
sc_led_blink_ch
;
int
sc_led_blink_offdur
;
struct
bwn_led
sc_leds
[
BWN_LED_MAX
];
int
sc_led_idle
;
int
sc_led_blink
;
struct
bwn_tx_radiotap_header
sc_tx_th
;
struct
bwn_rx_radiotap_header
sc_rx_th
;
};
#define BWN_LOCK_INIT(sc) \
mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->sc_dev), \
MTX_NETWORK_LOCK, MTX_DEF)
#define BWN_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx)
#define BWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define BWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
#define BWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
static
inline
bwn_band_t
bwn_channel_band
(
struct
bwn_mac
*
mac
,
struct
ieee80211_channel
*
c
)
{
if
(
IEEE80211_IS_CHAN_5GHZ
(
c
))
return
BWN_BAND_5G
;
/* XXX check 2g, log error if not 2g or 5g? */
return
BWN_BAND_2G
;
}
static
inline
bwn_band_t
bwn_current_band
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
if
(
IEEE80211_IS_CHAN_5GHZ
(
ic
->
ic_curchan
))
return
BWN_BAND_5G
;
/* XXX check 2g, log error if not 2g or 5g? */
return
BWN_BAND_2G
;
}
static
inline
bool
bwn_is_40mhz
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
return
!!
(
IEEE80211_IS_CHAN_HT40
(
ic
->
ic_curchan
));
}
static
inline
int
bwn_get_centre_freq
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
/* XXX TODO: calculate correctly for HT40 mode */
return
ic
->
ic_curchan
->
ic_freq
;
}
static
inline
int
bwn_get_chan_centre_freq
(
struct
bwn_mac
*
mac
,
struct
ieee80211_channel
*
chan
)
{
/* XXX TODO: calculate correctly for HT40 mode */
return
chan
->
ic_freq
;
}
static
inline
int
bwn_get_chan
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
/* XXX TODO: calculate correctly for HT40 mode */
return
ic
->
ic_curchan
->
ic_ieee
;
}
static
inline
struct
ieee80211_channel
*
bwn_get_channel
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
return
ic
->
ic_curchan
;
}
static
inline
bool
bwn_is_chan_passive
(
struct
bwn_mac
*
mac
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
return
!!
IEEE80211_IS_CHAN_PASSIVE
(
ic
->
ic_curchan
);
}
static
inline
bwn_chan_type_t
bwn_get_chan_type
(
struct
bwn_mac
*
mac
,
struct
ieee80211_channel
*
c
)
{
struct
ieee80211com
*
ic
=
&
mac
->
mac_sc
->
sc_ic
;
if
(
c
==
NULL
)
c
=
ic
->
ic_curchan
;
if
(
IEEE80211_IS_CHAN_HT40U
(
c
))
return
BWN_CHAN_TYPE_40_HT_U
;
else
if
(
IEEE80211_IS_CHAN_HT40D
(
c
))
return
BWN_CHAN_TYPE_40_HT_D
;
else
if
(
IEEE80211_IS_CHAN_HT20
(
c
))
return
BWN_CHAN_TYPE_20_HT
;
else
return
BWN_CHAN_TYPE_20
;
}
static
inline
int
bwn_get_chan_power
(
struct
bwn_mac
*
mac
,
struct
ieee80211_channel
*
c
)
{
/* return in dbm */
return
c
->
ic_maxpower
/
2
;
}
/*
* For now there's no bhnd bus support. Places where it matters
* should call this routine so we can start logging things.
*/
static
inline
int
bwn_is_bus_siba
(
struct
bwn_mac
*
mac
)
{
return
1
;
}
#endif
/* !_IF_BRCMWL_H */
File Metadata
Details
Attached
Mime Type
text/x-c
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1561080
Default Alt Text
brcmwl.h (62 KB)
Attached To
Mode
D17198: brcmwl.c (bcm43438)
Attached
Detach File
Event Timeline
Log In to Comment