1 /* 2 * Copyright (c) 2010 Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 #ifndef _wlc_bmac_h_ 17 #define _wlc_bmac_h_ 18 19 /* XXXXX this interface is under wlc.c by design 20 * http://hwnbu-twiki.broadcom.com/bin/view/Mwgroup/WlBmacDesign 21 * 22 * high driver files(e.g. wlc_ampdu.c etc) 23 * wlc.h/wlc.c 24 * wlc_bmac.h/wlc_bmac.c 25 * 26 * So don't include this in files other than wlc.c, wlc_bmac* wl_rte.c(dongle port) and wl_phy.c 27 * create wrappers in wlc.c if needed 28 */ 29 30 /* dup state between BMAC(struct wlc_hw_info) and HIGH(struct wlc_info) 31 driver */ 32 typedef struct wlc_bmac_state { 33 u32 machwcap; /* mac hw capibility */ 34 u32 preamble_ovr; /* preamble override */ 35 } wlc_bmac_state_t; 36 37 enum { 38 IOV_BMAC_DIAG, 39 IOV_BMAC_SBGPIOTIMERVAL, 40 IOV_BMAC_SBGPIOOUT, 41 IOV_BMAC_CCGPIOCTRL, /* CC GPIOCTRL REG */ 42 IOV_BMAC_CCGPIOOUT, /* CC GPIOOUT REG */ 43 IOV_BMAC_CCGPIOOUTEN, /* CC GPIOOUTEN REG */ 44 IOV_BMAC_CCGPIOIN, /* CC GPIOIN REG */ 45 IOV_BMAC_WPSGPIO, /* WPS push button GPIO pin */ 46 IOV_BMAC_OTPDUMP, 47 IOV_BMAC_OTPSTAT, 48 IOV_BMAC_PCIEASPM, /* obfuscation clkreq/aspm control */ 49 IOV_BMAC_PCIEADVCORRMASK, /* advanced correctable error mask */ 50 IOV_BMAC_PCIECLKREQ, /* PCIE 1.1 clockreq enab support */ 51 IOV_BMAC_PCIELCREG, /* PCIE LCREG */ 52 IOV_BMAC_SBGPIOTIMERMASK, 53 IOV_BMAC_RFDISABLEDLY, 54 IOV_BMAC_PCIEREG, /* PCIE REG */ 55 IOV_BMAC_PCICFGREG, /* PCI Config register */ 56 IOV_BMAC_PCIESERDESREG, /* PCIE SERDES REG (dev, 0}offset) */ 57 IOV_BMAC_PCIEGPIOOUT, /* PCIEOUT REG */ 58 IOV_BMAC_PCIEGPIOOUTEN, /* PCIEOUTEN REG */ 59 IOV_BMAC_PCIECLKREQENCTRL, /* clkreqenctrl REG (PCIE REV > 6.0 */ 60 IOV_BMAC_DMALPBK, 61 IOV_BMAC_CCREG, 62 IOV_BMAC_COREREG, 63 IOV_BMAC_SDCIS, 64 IOV_BMAC_SDIO_DRIVE, 65 IOV_BMAC_OTPW, 66 IOV_BMAC_NVOTPW, 67 IOV_BMAC_SROM, 68 IOV_BMAC_SRCRC, 69 IOV_BMAC_CIS_SOURCE, 70 IOV_BMAC_CISVAR, 71 IOV_BMAC_OTPLOCK, 72 IOV_BMAC_OTP_CHIPID, 73 IOV_BMAC_CUSTOMVAR1, 74 IOV_BMAC_BOARDFLAGS, 75 IOV_BMAC_BOARDFLAGS2, 76 IOV_BMAC_WPSLED, 77 IOV_BMAC_NVRAM_SOURCE, 78 IOV_BMAC_OTP_RAW_READ, 79 IOV_BMAC_LAST 80 }; 81 82 extern int wlc_bmac_attach(struct wlc_info *wlc, u16 vendor, u16 device, 83 uint unit, bool piomode, void *regsva, uint bustype, 84 void *btparam); 85 extern int wlc_bmac_detach(struct wlc_info *wlc); 86 extern void wlc_bmac_watchdog(void *arg); 87 88 /* up/down, reset, clk */ 89 extern void wlc_bmac_copyto_objmem(struct wlc_hw_info *wlc_hw, 90 uint offset, const void *buf, int len, 91 u32 sel); 92 extern void wlc_bmac_copyfrom_objmem(struct wlc_hw_info *wlc_hw, uint offset, 93 void *buf, int len, u32 sel); 94 #define wlc_bmac_copyfrom_shm(wlc_hw, offset, buf, len) \ 95 wlc_bmac_copyfrom_objmem(wlc_hw, offset, buf, len, OBJADDR_SHM_SEL) 96 #define wlc_bmac_copyto_shm(wlc_hw, offset, buf, len) \ 97 wlc_bmac_copyto_objmem(wlc_hw, offset, buf, len, OBJADDR_SHM_SEL) 98 99 extern void wlc_bmac_core_phypll_reset(struct wlc_hw_info *wlc_hw); 100 extern void wlc_bmac_core_phypll_ctl(struct wlc_hw_info *wlc_hw, bool on); 101 extern void wlc_bmac_phyclk_fgc(struct wlc_hw_info *wlc_hw, bool clk); 102 extern void wlc_bmac_macphyclk_set(struct wlc_hw_info *wlc_hw, bool clk); 103 extern void wlc_bmac_phy_reset(struct wlc_hw_info *wlc_hw); 104 extern void wlc_bmac_corereset(struct wlc_hw_info *wlc_hw, u32 flags); 105 extern void wlc_bmac_reset(struct wlc_hw_info *wlc_hw); 106 extern void wlc_bmac_init(struct wlc_hw_info *wlc_hw, chanspec_t chanspec, 107 bool mute); 108 extern int wlc_bmac_up_prep(struct wlc_hw_info *wlc_hw); 109 extern int wlc_bmac_up_finish(struct wlc_hw_info *wlc_hw); 110 extern int wlc_bmac_down_prep(struct wlc_hw_info *wlc_hw); 111 extern int wlc_bmac_down_finish(struct wlc_hw_info *wlc_hw); 112 extern void wlc_bmac_switch_macfreq(struct wlc_hw_info *wlc_hw, u8 spurmode); 113 114 /* chanspec, ucode interface */ 115 extern void wlc_bmac_set_chanspec(struct wlc_hw_info *wlc_hw, 116 chanspec_t chanspec, 117 bool mute, struct txpwr_limits *txpwr); 118 119 extern int wlc_bmac_xmtfifo_sz_get(struct wlc_hw_info *wlc_hw, uint fifo, 120 uint *blocks); 121 extern void wlc_bmac_mhf(struct wlc_hw_info *wlc_hw, u8 idx, u16 mask, 122 u16 val, int bands); 123 extern void wlc_bmac_mctrl(struct wlc_hw_info *wlc_hw, u32 mask, u32 val); 124 extern u16 wlc_bmac_mhf_get(struct wlc_hw_info *wlc_hw, u8 idx, int bands); 125 extern void wlc_bmac_txant_set(struct wlc_hw_info *wlc_hw, u16 phytxant); 126 extern u16 wlc_bmac_get_txant(struct wlc_hw_info *wlc_hw); 127 extern void wlc_bmac_antsel_type_set(struct wlc_hw_info *wlc_hw, 128 u8 antsel_type); 129 extern int wlc_bmac_state_get(struct wlc_hw_info *wlc_hw, 130 wlc_bmac_state_t *state); 131 extern void wlc_bmac_write_shm(struct wlc_hw_info *wlc_hw, uint offset, u16 v); 132 extern u16 wlc_bmac_read_shm(struct wlc_hw_info *wlc_hw, uint offset); 133 extern void wlc_bmac_set_shm(struct wlc_hw_info *wlc_hw, uint offset, u16 v, 134 int len); 135 extern void wlc_bmac_write_template_ram(struct wlc_hw_info *wlc_hw, int offset, 136 int len, void *buf); 137 extern void wlc_bmac_copyfrom_vars(struct wlc_hw_info *wlc_hw, char **buf, 138 uint *len); 139 140 extern void wlc_bmac_hw_etheraddr(struct wlc_hw_info *wlc_hw, 141 u8 *ea); 142 143 extern bool wlc_bmac_radio_read_hwdisabled(struct wlc_hw_info *wlc_hw); 144 extern void wlc_bmac_set_shortslot(struct wlc_hw_info *wlc_hw, bool shortslot); 145 extern void wlc_bmac_band_stf_ss_set(struct wlc_hw_info *wlc_hw, u8 stf_mode); 146 147 extern void wlc_bmac_wait_for_wake(struct wlc_hw_info *wlc_hw); 148 149 extern void wlc_ucode_wake_override_set(struct wlc_hw_info *wlc_hw, 150 u32 override_bit); 151 extern void wlc_ucode_wake_override_clear(struct wlc_hw_info *wlc_hw, 152 u32 override_bit); 153 154 extern void wlc_bmac_set_rcmta(struct wlc_hw_info *wlc_hw, int idx, 155 const u8 *addr); 156 extern void wlc_bmac_set_addrmatch(struct wlc_hw_info *wlc_hw, 157 int match_reg_offset, 158 const u8 *addr); 159 extern void wlc_bmac_write_hw_bcntemplates(struct wlc_hw_info *wlc_hw, 160 void *bcn, int len, bool both); 161 162 extern void wlc_bmac_read_tsf(struct wlc_hw_info *wlc_hw, u32 *tsf_l_ptr, 163 u32 *tsf_h_ptr); 164 extern void wlc_bmac_set_cwmin(struct wlc_hw_info *wlc_hw, u16 newmin); 165 extern void wlc_bmac_set_cwmax(struct wlc_hw_info *wlc_hw, u16 newmax); 166 extern void wlc_bmac_set_noreset(struct wlc_hw_info *wlc, bool noreset_flag); 167 168 extern void wlc_bmac_retrylimit_upd(struct wlc_hw_info *wlc_hw, u16 SRL, 169 u16 LRL); 170 171 extern void wlc_bmac_fifoerrors(struct wlc_hw_info *wlc_hw); 172 173 174 /* API for BMAC driver (e.g. wlc_phy.c etc) */ 175 176 extern void wlc_bmac_bw_set(struct wlc_hw_info *wlc_hw, u16 bw); 177 extern void wlc_bmac_pllreq(struct wlc_hw_info *wlc_hw, bool set, 178 mbool req_bit); 179 extern bool wlc_bmac_taclear(struct wlc_hw_info *wlc_hw, bool ta_ok); 180 extern void wlc_bmac_hw_up(struct wlc_hw_info *wlc_hw); 181 extern u16 wlc_bmac_rate_shm_offset(struct wlc_hw_info *wlc_hw, u8 rate); 182 extern void wlc_bmac_antsel_set(struct wlc_hw_info *wlc_hw, u32 antsel_avail); 183 184 #endif /* _wlc_bmac_h_ */ 185