Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 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 | |
| 17 | /* |
| 18 | * This is "two-way" interface, acting as the SHIM layer between WL and PHY layer. |
| 19 | * WL driver can optinally call this translation layer to do some preprocessing, then reach PHY. |
| 20 | * On the PHY->WL driver direction, all calls go through this layer since PHY doesn't have the |
| 21 | * access to wlc_hw pointer. |
| 22 | */ |
| 23 | |
Brett Rudley | 3327989 | 2010-10-01 18:03:27 -0700 | [diff] [blame] | 24 | #include <linux/kernel.h> |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 25 | #include <bcmdefs.h> |
Greg Kroah-Hartman | a1c16ed | 2010-10-21 11:17:44 -0700 | [diff] [blame^] | 26 | #include <wlc_cfg.h> |
| 27 | #include <linuxver.h> |
| 28 | #include <bcmutils.h> |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 29 | #include <osl.h> |
| 30 | |
| 31 | #include <proto/802.11.h> |
| 32 | #include <bcmwifi.h> |
| 33 | #include <siutils.h> |
| 34 | #include <bcmendian.h> |
| 35 | #include <wlioctl.h> |
| 36 | #include <sbconfig.h> |
| 37 | #include <sbchipc.h> |
| 38 | #include <pcicfg.h> |
| 39 | #include <sbhndpio.h> |
| 40 | #include <sbhnddma.h> |
| 41 | #include <hnddma.h> |
| 42 | #include <hndpmu.h> |
| 43 | #include <d11.h> |
| 44 | #include <wlc_rate.h> |
| 45 | #include <wlc_pub.h> |
| 46 | #include <wlc_channel.h> |
| 47 | #include <bcmsrom.h> |
| 48 | #include <wlc_key.h> |
| 49 | |
| 50 | #include <wlc_mac80211.h> |
| 51 | |
| 52 | #include <wlc_bmac.h> |
| 53 | #include <wlc_phy_shim.h> |
| 54 | #include <wlc_phy_hal.h> |
| 55 | #include <wl_export.h> |
| 56 | |
| 57 | /* PHY SHIM module specific state */ |
| 58 | struct wlc_phy_shim_info { |
| 59 | wlc_hw_info_t *wlc_hw; /* pointer to main wlc_hw structure */ |
| 60 | void *wlc; /* pointer to main wlc structure */ |
| 61 | void *wl; /* pointer to os-specific private state */ |
| 62 | }; |
| 63 | |
Greg Kroah-Hartman | 0d2f072 | 2010-10-08 14:28:21 -0700 | [diff] [blame] | 64 | wlc_phy_shim_info_t *wlc_phy_shim_attach(wlc_hw_info_t *wlc_hw, |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 65 | void *wl, void *wlc) { |
| 66 | wlc_phy_shim_info_t *physhim = NULL; |
| 67 | |
mike.rapoport@gmail.com | 5fcc1fc | 2010-10-13 00:09:10 +0200 | [diff] [blame] | 68 | physhim = kzalloc(sizeof(wlc_phy_shim_info_t), GFP_ATOMIC); |
Jason Cooper | ca8c1e5 | 2010-09-14 09:45:33 -0400 | [diff] [blame] | 69 | if (!physhim) { |
mike.rapoport@gmail.com | 97e17d0 | 2010-10-13 00:09:09 +0200 | [diff] [blame] | 70 | WL_ERROR(("wl%d: wlc_phy_shim_attach: out of mem\n", wlc_hw->unit)); |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 71 | return NULL; |
| 72 | } |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 73 | physhim->wlc_hw = wlc_hw; |
| 74 | physhim->wlc = wlc; |
| 75 | physhim->wl = wl; |
| 76 | |
| 77 | return physhim; |
| 78 | } |
| 79 | |
Greg Kroah-Hartman | 0d2f072 | 2010-10-08 14:28:21 -0700 | [diff] [blame] | 80 | void wlc_phy_shim_detach(wlc_phy_shim_info_t *physhim) |
Jason Cooper | a2627bc | 2010-09-14 09:45:31 -0400 | [diff] [blame] | 81 | { |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 82 | if (!physhim) |
| 83 | return; |
| 84 | |
mike.rapoport@gmail.com | 182acb3 | 2010-10-13 00:09:12 +0200 | [diff] [blame] | 85 | kfree(physhim); |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 86 | } |
| 87 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 88 | struct wlapi_timer *wlapi_init_timer(wlc_phy_shim_info_t *physhim, |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 89 | void (*fn) (void *arg), void *arg, |
| 90 | const char *name) |
| 91 | { |
| 92 | return (struct wlapi_timer *)wl_init_timer(physhim->wl, fn, arg, name); |
| 93 | } |
| 94 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 95 | void wlapi_free_timer(wlc_phy_shim_info_t *physhim, struct wlapi_timer *t) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 96 | { |
| 97 | wl_free_timer(physhim->wl, (struct wl_timer *)t); |
| 98 | } |
| 99 | |
| 100 | void |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 101 | wlapi_add_timer(wlc_phy_shim_info_t *physhim, struct wlapi_timer *t, uint ms, |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 102 | int periodic) |
| 103 | { |
| 104 | wl_add_timer(physhim->wl, (struct wl_timer *)t, ms, periodic); |
| 105 | } |
| 106 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 107 | bool wlapi_del_timer(wlc_phy_shim_info_t *physhim, struct wlapi_timer *t) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 108 | { |
| 109 | return wl_del_timer(physhim->wl, (struct wl_timer *)t); |
| 110 | } |
| 111 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 112 | void wlapi_intrson(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 113 | { |
| 114 | wl_intrson(physhim->wl); |
| 115 | } |
| 116 | |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 117 | u32 wlapi_intrsoff(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 118 | { |
| 119 | return wl_intrsoff(physhim->wl); |
| 120 | } |
| 121 | |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 122 | void wlapi_intrsrestore(wlc_phy_shim_info_t *physhim, u32 macintmask) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 123 | { |
| 124 | wl_intrsrestore(physhim->wl, macintmask); |
| 125 | } |
| 126 | |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 127 | void wlapi_bmac_write_shm(wlc_phy_shim_info_t *physhim, uint offset, u16 v) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 128 | { |
| 129 | wlc_bmac_write_shm(physhim->wlc_hw, offset, v); |
| 130 | } |
| 131 | |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 132 | u16 wlapi_bmac_read_shm(wlc_phy_shim_info_t *physhim, uint offset) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 133 | { |
| 134 | return wlc_bmac_read_shm(physhim->wlc_hw, offset); |
| 135 | } |
| 136 | |
| 137 | void |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 138 | wlapi_bmac_mhf(wlc_phy_shim_info_t *physhim, u8 idx, u16 mask, |
| 139 | u16 val, int bands) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 140 | { |
| 141 | wlc_bmac_mhf(physhim->wlc_hw, idx, mask, val, bands); |
| 142 | } |
| 143 | |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 144 | void wlapi_bmac_corereset(wlc_phy_shim_info_t *physhim, u32 flags) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 145 | { |
| 146 | wlc_bmac_corereset(physhim->wlc_hw, flags); |
| 147 | } |
| 148 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 149 | void wlapi_suspend_mac_and_wait(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 150 | { |
| 151 | wlc_suspend_mac_and_wait(physhim->wlc); |
| 152 | } |
| 153 | |
Greg Kroah-Hartman | 41feb5e | 2010-10-05 10:09:00 -0700 | [diff] [blame] | 154 | void wlapi_switch_macfreq(wlc_phy_shim_info_t *physhim, u8 spurmode) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 155 | { |
| 156 | wlc_bmac_switch_macfreq(physhim->wlc_hw, spurmode); |
| 157 | } |
| 158 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 159 | void wlapi_enable_mac(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 160 | { |
| 161 | wlc_enable_mac(physhim->wlc); |
| 162 | } |
| 163 | |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 164 | void wlapi_bmac_mctrl(wlc_phy_shim_info_t *physhim, u32 mask, u32 val) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 165 | { |
| 166 | wlc_bmac_mctrl(physhim->wlc_hw, mask, val); |
| 167 | } |
| 168 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 169 | void wlapi_bmac_phy_reset(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 170 | { |
| 171 | wlc_bmac_phy_reset(physhim->wlc_hw); |
| 172 | } |
| 173 | |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 174 | void wlapi_bmac_bw_set(wlc_phy_shim_info_t *physhim, u16 bw) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 175 | { |
| 176 | wlc_bmac_bw_set(physhim->wlc_hw, bw); |
| 177 | } |
| 178 | |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 179 | u16 wlapi_bmac_get_txant(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 180 | { |
| 181 | return wlc_bmac_get_txant(physhim->wlc_hw); |
| 182 | } |
| 183 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 184 | void wlapi_bmac_phyclk_fgc(wlc_phy_shim_info_t *physhim, bool clk) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 185 | { |
| 186 | wlc_bmac_phyclk_fgc(physhim->wlc_hw, clk); |
| 187 | } |
| 188 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 189 | void wlapi_bmac_macphyclk_set(wlc_phy_shim_info_t *physhim, bool clk) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 190 | { |
| 191 | wlc_bmac_macphyclk_set(physhim->wlc_hw, clk); |
| 192 | } |
| 193 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 194 | void wlapi_bmac_core_phypll_ctl(wlc_phy_shim_info_t *physhim, bool on) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 195 | { |
| 196 | wlc_bmac_core_phypll_ctl(physhim->wlc_hw, on); |
| 197 | } |
| 198 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 199 | void wlapi_bmac_core_phypll_reset(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 200 | { |
| 201 | wlc_bmac_core_phypll_reset(physhim->wlc_hw); |
| 202 | } |
| 203 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 204 | void wlapi_bmac_ucode_wake_override_phyreg_set(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 205 | { |
| 206 | wlc_ucode_wake_override_set(physhim->wlc_hw, WLC_WAKE_OVERRIDE_PHYREG); |
| 207 | } |
| 208 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 209 | void wlapi_bmac_ucode_wake_override_phyreg_clear(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 210 | { |
| 211 | wlc_ucode_wake_override_clear(physhim->wlc_hw, |
| 212 | WLC_WAKE_OVERRIDE_PHYREG); |
| 213 | } |
| 214 | |
| 215 | void |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 216 | wlapi_bmac_write_template_ram(wlc_phy_shim_info_t *physhim, int offset, |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 217 | int len, void *buf) |
| 218 | { |
| 219 | wlc_bmac_write_template_ram(physhim->wlc_hw, offset, len, buf); |
| 220 | } |
| 221 | |
Greg Kroah-Hartman | 7d4df48 | 2010-10-07 17:04:47 -0700 | [diff] [blame] | 222 | u16 wlapi_bmac_rate_shm_offset(wlc_phy_shim_info_t *physhim, u8 rate) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 223 | { |
| 224 | return wlc_bmac_rate_shm_offset(physhim->wlc_hw, rate); |
| 225 | } |
| 226 | |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 227 | void wlapi_ucode_sample_init(wlc_phy_shim_info_t *physhim) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 228 | { |
| 229 | } |
| 230 | |
| 231 | void |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 232 | wlapi_copyfrom_objmem(wlc_phy_shim_info_t *physhim, uint offset, void *buf, |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 233 | int len, u32 sel) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 234 | { |
| 235 | wlc_bmac_copyfrom_objmem(physhim->wlc_hw, offset, buf, len, sel); |
| 236 | } |
| 237 | |
| 238 | void |
Jason Cooper | 7cc4a4c | 2010-09-14 09:45:30 -0400 | [diff] [blame] | 239 | wlapi_copyto_objmem(wlc_phy_shim_info_t *physhim, uint offset, const void *buf, |
Greg Kroah-Hartman | 66cbd3a | 2010-10-08 11:05:47 -0700 | [diff] [blame] | 240 | int l, u32 sel) |
Henry Ptasinski | a9533e7 | 2010-09-08 21:04:42 -0700 | [diff] [blame] | 241 | { |
| 242 | wlc_bmac_copyto_objmem(physhim->wlc_hw, offset, buf, l, sel); |
| 243 | } |