/* * Chip-specific hardware definitions for * Broadcom 802.11abg Networking Device Driver * * Broadcom Proprietary and Confidential. Copyright (C) 2020, * All Rights Reserved. * * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom; * the contents of this file may not be disclosed to third parties, * copied or duplicated in any form, in whole or in part, without * the prior written permission of Broadcom. * * * <> */ #ifndef _D11REGS_H #define _D11REGS_H #include #include #include #include #if !defined(BCMDONGLEHOST) #include #include #endif #if defined(BCMDONGLEHOST) || defined(WL_UNITTEST) typedef struct { uint32 pad; } d11regdefs_t; typedef volatile uint8 d11regs_t; typedef struct _d11regs_info { uint32 pad; } d11regs_info_t; #else /* defined(BCMDONGLEHOST) || defined(WL_UNITTEST) */ typedef volatile struct d11regs d11regs_t; typedef struct _d11regs_info { d11regs_t *regs; } d11regs_info_t; #endif /* !defined(BCMDONGLEHOST) || !defined(WL_UNITTEST) */ typedef volatile struct { uint32 intstatus; uint32 intmask; } intctrlregs_t; /** * read: 32-bit register that can be read as 32-bit or as 2 16-bit * write: only low 16b-it half can be written */ typedef volatile union { uint32 pmqhostdata; /**< read only! */ struct { uint16 pmqctrlstatus; /**< read/write */ uint16 PAD; } w; } pmqreg_t; /** dma corerev >= 11 */ typedef volatile struct { dma64regs_t dmaxmt; /* dma tx */ pio4regs_t piotx; /* pio tx */ dma64regs_t dmarcv; /* dma rx */ pio4regs_t piorx; /* pio rx */ } fifo64_t; /** indirect dma corerev >= 64 */ typedef volatile struct { dma64regs_t dma; /**< dma tx */ uint32 indintstatus; uint32 indintmask; } ind_dma_t; /** indirect dma corerev 80, 81, 82 */ typedef volatile struct { uint32 indintstatus; uint32 indintmask; dma64regs_t dma; /**< dma tx, */ } ind_dma_axc_t; /* access to register offsets and fields defined in dot11mac_all_regs.h */ #define D11_REG_OFF(regname) \ dot11mac_##regname##_ADDR #define D11_REG_FIELD_MASK(regname, regfield) \ dot11mac_##regname##__##regfield##_MASK #define D11_REG_FIELD_SHIFT(regname, regfield) \ dot11mac_##regname##__##regfield##_SHIFT /* convert register offset to backplane address */ #ifndef D11_REG_ADDR_CHK // #define D11_REG_ADDR_CHK #endif #ifdef D11_REG_ADDR_CHK #define D11_REG_ADDR_EXEMPT(regname) \ (D11_REG_OFF(regname) == D11_REG_OFF(PHY_REG_ADDR) || \ D11_REG_OFF(regname) == D11_REG_OFF(radioregaddr) || \ D11_REG_OFF(regname) == D11_REG_OFF(radioregdata) || \ D11_REG_OFF(regname) == D11_REG_OFF(OBJ_DATA) || \ 0) #define D11_REG32_ADDR(regbase, regname) \ ({ \ STATIC_ASSERT(D11_REG_ADDR_EXEMPT(regname) || D11_REG_OFF(regname) < 0x3e0); \ (volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname)); \ }) #define D11_REG16_ADDR(regbase, regname) \ ({ \ STATIC_ASSERT(D11_REG_ADDR_EXEMPT(regname) || D11_REG_OFF(regname) >= 0x3e0); \ (volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname)); \ }) #else /* !D11_REG_ADDR_CHK */ #define D11_REG32_ADDR(regbase, regname) \ (volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname)) #define D11_REG16_ADDR(regbase, regname) \ (volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname)) #endif /* !D11_REG_ADDR_CHK */ /* used in table */ #define D11_REG32_ADDR_ENTRY(regbase, regname) \ (volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname)) #define D11_REG16_ADDR_ENTRY(regbase, regname) \ (volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname)) #ifndef D11_NEW_ACCESS_MACROS /* MOVED TO src/wl/sys/wlc_hw_priv.h */ #define GET_MACINTSTATUS(osh, hw) R_REG((osh), D11_MACINTSTATUS(hw)) #define SET_MACINTSTATUS(osh, hw, val) W_REG((osh), D11_MACINTSTATUS(hw), (val)) #define GET_MACINTMASK(osh, hw) R_REG((osh), D11_MACINTMASK(hw)) #define SET_MACINTMASK(osh, hw, val) W_REG((osh), D11_MACINTMASK(hw), (val)) #define GET_MACINTSTATUS_X(osh, hw) R_REG((osh), D11_MACINTSTATUS_psmx(hw)) #define SET_MACINTSTATUS_X(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_psmx(hw), (val)) #define GET_MACINTMASK_X(osh, hw) R_REG((osh), D11_MACINTMASK_psmx(hw)) #define SET_MACINTMASK_X(osh, hw, val) W_REG((osh), D11_MACINTMASK_psmx(hw), (val)) #define GET_MACINTSTATUS_EXT(osh, hw) R_REG((osh), D11_MACINTSTATUS_EXT(hw)) #define SET_MACINTSTATUS_EXT(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_EXT(hw), (val)) #define GET_MACINTMASK_EXT(osh, hw) R_REG((osh), D11_MACINTMASK_EXT(hw)) #define SET_MACINTMASK_EXT(osh, hw, val) W_REG((osh), D11_MACINTMASK_EXT(hw), (val)) #define GET_MACINTSTATUS_EXT_X(osh, hw) R_REG((osh), D11_MACINTSTATUS_EXT_psmx(hw)) #define SET_MACINTSTATUS_EXT_X(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_EXT_psmx(hw), (val)) #define GET_MACINTMASK_EXT_X(osh, hw) R_REG((osh), D11_MACINTMASK_EXT_psmx(hw)) #define SET_MACINTMASK_EXT_X(osh, hw, val) W_REG((osh), D11_MACINTMASK_EXT_psmx(hw), (val)) #define D11Reggrp_intctrlregs(hw, ix) ((intctrlregs_t*)(((volatile uint8*)D11_intstat0(hw)) + \ (sizeof(intctrlregs_t)*ix))) #define D11Reggrp_inddma(hw, ix) (D11REV_GE(hw->corerev, 86) ? \ ((ind_dma_t*)(((volatile uint8*)D11_ind_xmt_control(hw)) + (sizeof(ind_dma_t)*ix))) : \ ((ind_dma_t*)(((volatile uint8*)D11_inddma(hw)) + (sizeof(ind_dma_t)*ix)))) #define D11Reggrp_inddma_axc(hw, ix) ((ind_dma_axc_t*)(((volatile uint8*)D11_inddma(hw)) + \ (sizeof(ind_dma_axc_t)*ix))) #define D11Reggrp_indaqm(hw, ix) (D11REV_GE(hw->corerev, 86) ? \ ((ind_dma_t*)(((volatile uint8*)D11_IndAQMctl(hw)) + (sizeof(ind_dma_t)*ix))) : \ ((ind_dma_t*)(((volatile uint8*)D11_indaqm(hw)) + (sizeof(ind_dma_t)*ix)))) #define D11Reggrp_pmqreg(hw, ix) ((pmqreg_t*)(((volatile uint8*)D11_PMQHOSTDATA(hw)) + \ (sizeof(pmqreg_t)*ix))) #define D11Reggrp_f64regs(hw, ix) ((fifo64_t*)(((volatile uint8*)D11_xmt0ctl(hw)) + \ (sizeof(fifo64_t)*ix))) #define D11Reggrp_dmafifo(hw, ix) ((dma32diag_t*)(((volatile uint8*)D11_fifobase(hw)) + \ (sizeof(dma32diag_t)*ix))) #define D11Reggrp_intrcvlazy(hw, ix) ((volatile uint32*)(((volatile uint8*)D11_intrcvlzy0(hw)) + \ (sizeof(uint32)*ix))) #define D11Reggrp_altintmask(hw, ix) ((volatile uint32*)(((volatile uint8*)D11_alt_intmask0(hw)) + \ (sizeof(uint32)*ix))) #define D11REG_ISVALID(ptr, addr) ((volatile uint16 *)(addr) != \ ((volatile uint16 *) &((ptr)->regs->INVALID_ID))) #endif /* D11_NEW_ACCESS_MACROS */ #endif /* _D11REGS_H */