| OLD | NEW |
| 1 /* | 1 //------------------------------------------------------------------------------ |
| 2 * | 2 // Copyright (c) 2004-2010 Atheros Communications Inc. |
| 3 * Copyright (c) 2004-2010 Atheros Communications Inc. | 3 // All rights reserved. |
| 4 * All rights reserved. | |
| 5 * | |
| 6 * | |
| 7 // This program is free software; you can redistribute it and/or modify | |
| 8 // it under the terms of the GNU General Public License version 2 as | |
| 9 // published by the Free Software Foundation; | |
| 10 // | 4 // |
| 11 // Software distributed under the License is distributed on an "AS | 5 // |
| 12 // IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | 6 // |
| 13 // implied. See the License for the specific language governing | 7 // Permission to use, copy, modify, and/or distribute this software for any |
| 14 // rights and limitations under the License. | 8 // purpose with or without fee is hereby granted, provided that the above |
| 9 // copyright notice and this permission notice appear in all copies. |
| 10 // |
| 11 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 12 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 13 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 14 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 15 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 16 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 17 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 15 // | 18 // |
| 16 // | 19 // |
| 17 * | 20 // |
| 18 */ | 21 // Author(s): ="Atheros" |
| 22 //------------------------------------------------------------------------------ |
| 19 | 23 |
| 20 /* | 24 /* |
| 21 * This driver is a pseudo ethernet driver to access the Atheros AR6000 | 25 * This driver is a pseudo ethernet driver to access the Atheros AR6000 |
| 22 * WLAN Device | 26 * WLAN Device |
| 23 */ | 27 */ |
| 24 | 28 |
| 25 #include "ar6000_drv.h" | 29 #include "ar6000_drv.h" |
| 26 #ifdef ATH6K_CONFIG_CFG80211 | 30 #ifdef ATH6K_CONFIG_CFG80211 |
| 27 #include "cfg80211.h" | 31 #include "cfg80211.h" |
| 28 #endif /* ATH6K_CONFIG_CFG80211 */ | 32 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 29 #include "htc.h" | 33 #include "htc.h" |
| 30 #include "wmi_filter_linux.h" | 34 #include "wmi_filter_linux.h" |
| 31 #include "epping_test.h" | 35 #include "epping_test.h" |
| 32 #include "wlan_config.h" | 36 #include "wlan_config.h" |
| 33 #include "ar3kconfig.h" | 37 #include "ar3kconfig.h" |
| 38 #include "ar6k_pal.h" |
| 39 #include "AR6002/addrs.h" |
| 34 | 40 |
| 35 | 41 |
| 36 /* LINUX_HACK_FUDGE_FACTOR -- this is used to provide a workaround for linux beh
avior. When | 42 /* LINUX_HACK_FUDGE_FACTOR -- this is used to provide a workaround for linux beh
avior. When |
| 37 * the meta data was added to the header it was found that linux did not correc
tly provide | 43 * the meta data was added to the header it was found that linux did not correc
tly provide |
| 38 * enough headroom. However when more headroom was requested beyond what was t
ruly needed | 44 * enough headroom. However when more headroom was requested beyond what was t
ruly needed |
| 39 * Linux gave the requested headroom. Therefore to get the necessary headroom f
rom Linux | 45 * Linux gave the requested headroom. Therefore to get the necessary headroom f
rom Linux |
| 40 * the driver requests more than is needed by the amount = LINUX_HACK_FUDGE_FAC
TOR */ | 46 * the driver requests more than is needed by the amount = LINUX_HACK_FUDGE_FAC
TOR */ |
| 41 #define LINUX_HACK_FUDGE_FACTOR 16 | 47 #define LINUX_HACK_FUDGE_FACTOR 16 |
| 42 #define BDATA_BDADDR_OFFSET 28 | 48 #define BDATA_BDADDR_OFFSET 28 |
| 43 | 49 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 56 | 62 |
| 57 static ATH_DEBUG_MASK_DESCRIPTION driver_debug_desc[] = { | 63 static ATH_DEBUG_MASK_DESCRIPTION driver_debug_desc[] = { |
| 58 { ATH_DEBUG_DBG_LOG , "Target Debug Logs"}, | 64 { ATH_DEBUG_DBG_LOG , "Target Debug Logs"}, |
| 59 { ATH_DEBUG_WLAN_CONNECT , "WLAN connect"}, | 65 { ATH_DEBUG_WLAN_CONNECT , "WLAN connect"}, |
| 60 { ATH_DEBUG_WLAN_SCAN , "WLAN scan"}, | 66 { ATH_DEBUG_WLAN_SCAN , "WLAN scan"}, |
| 61 { ATH_DEBUG_WLAN_TX , "WLAN Tx"}, | 67 { ATH_DEBUG_WLAN_TX , "WLAN Tx"}, |
| 62 { ATH_DEBUG_WLAN_RX , "WLAN Rx"}, | 68 { ATH_DEBUG_WLAN_RX , "WLAN Rx"}, |
| 63 { ATH_DEBUG_HTC_RAW , "HTC Raw IF tracing"}, | 69 { ATH_DEBUG_HTC_RAW , "HTC Raw IF tracing"}, |
| 64 { ATH_DEBUG_HCI_BRIDGE , "HCI Bridge Setup"}, | 70 { ATH_DEBUG_HCI_BRIDGE , "HCI Bridge Setup"}, |
| 65 { ATH_DEBUG_HCI_RECV , "HCI Recv tracing"}, | 71 { ATH_DEBUG_HCI_RECV , "HCI Recv tracing"}, |
| 66 { ATH_DEBUG_HCI_SEND , "HCI Send tracing"}, | |
| 67 { ATH_DEBUG_HCI_DUMP , "HCI Packet dumps"}, | 72 { ATH_DEBUG_HCI_DUMP , "HCI Packet dumps"}, |
| 68 }; | 73 }; |
| 69 | 74 |
| 70 ATH_DEBUG_INSTANTIATE_MODULE_VAR(driver, | 75 ATH_DEBUG_INSTANTIATE_MODULE_VAR(driver, |
| 71 "driver", | 76 "driver", |
| 72 "Linux Driver Interface", | 77 "Linux Driver Interface", |
| 73 ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_WLAN_SCAN | | 78 ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_WLAN_SCAN | |
| 74 ATH_DEBUG_HCI_BRIDGE, | 79 ATH_DEBUG_HCI_BRIDGE, |
| 75 ATH_DEBUG_DESCRIPTION_COUNT(driver_debug_desc), | 80 ATH_DEBUG_DESCRIPTION_COUNT(driver_debug_desc), |
| 76 driver_debug_desc); | 81 driver_debug_desc); |
| 77 | 82 |
| 78 #endif | 83 #endif |
| 79 | 84 |
| 80 | 85 |
| 81 #define IS_MAC_NULL(mac) (mac[0]==0 && mac[1]==0 && mac[2]==0 && mac[3]==0 && ma
c[4]==0 && mac[5]==0) | 86 #define IS_MAC_NULL(mac) (mac[0]==0 && mac[1]==0 && mac[2]==0 && mac[3]==0 && ma
c[4]==0 && mac[5]==0) |
| 82 #define IS_MAC_BCAST(mac) (*mac==0xff) | 87 #define IS_MAC_BCAST(mac) (*mac==0xff) |
| 83 | 88 |
| 84 #define DESCRIPTION "Driver to access the Atheros AR600x Device, version " __str
ingify(__VER_MAJOR_) "." __stringify(__VER_MINOR_) "." __stringify(__VER_PATCH_)
"." __stringify(__BUILD_NUMBER_) | 89 #define DESCRIPTION "Driver to access the Atheros AR600x Device, version " __str
ingify(__VER_MAJOR_) "." __stringify(__VER_MINOR_) "." __stringify(__VER_PATCH_)
"." __stringify(__BUILD_NUMBER_) |
| 85 | 90 |
| 86 MODULE_AUTHOR("Atheros Communications, Inc."); | 91 MODULE_AUTHOR("Atheros Communications, Inc."); |
| 87 MODULE_DESCRIPTION(DESCRIPTION); | 92 MODULE_DESCRIPTION(DESCRIPTION); |
| 88 MODULE_LICENSE("GPL and additional rights"); | 93 MODULE_LICENSE("Dual BSD/GPL"); |
| 89 | 94 |
| 90 #ifndef REORG_APTC_HEURISTICS | 95 #ifndef REORG_APTC_HEURISTICS |
| 91 #undef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 96 #undef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 92 #endif /* REORG_APTC_HEURISTICS */ | 97 #endif /* REORG_APTC_HEURISTICS */ |
| 93 | 98 |
| 94 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 99 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 95 #define APTC_TRAFFIC_SAMPLING_INTERVAL 100 /* msec */ | 100 #define APTC_TRAFFIC_SAMPLING_INTERVAL 100 /* msec */ |
| 96 #define APTC_UPPER_THROUGHPUT_THRESHOLD 3000 /* Kbps */ | 101 #define APTC_UPPER_THROUGHPUT_THRESHOLD 3000 /* Kbps */ |
| 97 #define APTC_LOWER_THROUGHPUT_THRESHOLD 2000 /* Kbps */ | 102 #define APTC_LOWER_THROUGHPUT_THRESHOLD 2000 /* Kbps */ |
| 98 | 103 |
| 99 typedef struct aptc_traffic_record { | 104 typedef struct aptc_traffic_record { |
| 100 A_BOOL timerScheduled; | 105 A_BOOL timerScheduled; |
| 101 struct timeval samplingTS; | 106 struct timeval samplingTS; |
| 102 unsigned long bytesReceived; | 107 unsigned long bytesReceived; |
| 103 unsigned long bytesTransmitted; | 108 unsigned long bytesTransmitted; |
| 104 } APTC_TRAFFIC_RECORD; | 109 } APTC_TRAFFIC_RECORD; |
| 105 | 110 |
| 106 A_TIMER aptcTimer; | 111 A_TIMER aptcTimer; |
| 107 APTC_TRAFFIC_RECORD aptcTR; | 112 APTC_TRAFFIC_RECORD aptcTR; |
| 108 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ | 113 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ |
| 109 | 114 |
| 110 #ifdef EXPORT_HCI_BRIDGE_INTERFACE | 115 #ifdef EXPORT_HCI_BRIDGE_INTERFACE |
| 111 // callbacks registered by HCI transport driver | 116 // callbacks registered by HCI transport driver |
| 112 HCI_TRANSPORT_CALLBACKS ar6kHciTransCallbacks = { NULL }; | 117 HCI_TRANSPORT_CALLBACKS ar6kHciTransCallbacks = { NULL }; |
| 113 #endif | 118 #endif |
| 114 | 119 |
| 115 unsigned int processDot11Hdr = 0; | 120 unsigned int processDot11Hdr = 0; |
| 116 int bmienable = BMIENABLE_DEFAULT; | 121 int bmienable = BMIENABLE_DEFAULT; |
| 117 | 122 |
| 118 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | |
| 119 char ifname[IFNAMSIZ] = {0,}; | 123 char ifname[IFNAMSIZ] = {0,}; |
| 120 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */ | |
| 121 | 124 |
| 122 int wlaninitmode = WLAN_INIT_MODE_DEFAULT; | 125 int wlaninitmode = WLAN_INIT_MODE_DEFAULT; |
| 123 unsigned int bypasswmi = 0; | 126 unsigned int bypasswmi = 0; |
| 124 unsigned int debuglevel = 0; | 127 unsigned int debuglevel = 0; |
| 125 int tspecCompliance = ATHEROS_COMPLIANCE; | 128 int tspecCompliance = ATHEROS_COMPLIANCE; |
| 126 unsigned int busspeedlow = 0; | 129 unsigned int busspeedlow = 0; |
| 127 unsigned int onebitmode = 0; | 130 unsigned int onebitmode = 0; |
| 128 unsigned int skipflash = 0; | 131 unsigned int skipflash = 0; |
| 129 unsigned int wmitimeout = 2; | 132 unsigned int wmitimeout = 2; |
| 130 unsigned int wlanNodeCaching = 1; | 133 unsigned int wlanNodeCaching = 1; |
| 131 unsigned int enableuartprint = ENABLEUARTPRINT_DEFAULT; | 134 unsigned int enableuartprint = ENABLEUARTPRINT_DEFAULT; |
| 132 unsigned int logWmiRawMsgs = 0; | 135 unsigned int logWmiRawMsgs = 0; |
| 133 unsigned int enabletimerwar = 0; | 136 unsigned int enabletimerwar = 0; |
| 134 unsigned int fwmode = 1; | 137 unsigned int fwmode = 1; |
| 135 unsigned int mbox_yield_limit = 99; | 138 unsigned int mbox_yield_limit = 99; |
| 136 unsigned int enablerssicompensation = 0; | 139 unsigned int enablerssicompensation = 0; |
| 137 int reduce_credit_dribble = 1 + HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF; | 140 int reduce_credit_dribble = 1 + HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF; |
| 138 int allow_trace_signal = 0; | 141 int allow_trace_signal = 0; |
| 139 #ifdef CONFIG_HOST_TCMD_SUPPORT | 142 #ifdef CONFIG_HOST_TCMD_SUPPORT |
| 140 unsigned int testmode =0; | 143 unsigned int testmode =0; |
| 141 #endif | 144 #endif |
| 142 | 145 |
| 143 unsigned int irqprocmode = HIF_DEVICE_IRQ_SYNC_ONLY;//HIF_DEVICE_IRQ_ASYNC_SYNC; | 146 unsigned int irqprocmode = HIF_DEVICE_IRQ_SYNC_ONLY;//HIF_DEVICE_IRQ_ASYNC_SYNC; |
| 144 unsigned int panic_on_assert = 1; | 147 unsigned int panic_on_assert = 1; |
| 145 unsigned int nohifscattersupport = NOHIFSCATTERSUPPORT_DEFAULT; | 148 unsigned int nohifscattersupport = NOHIFSCATTERSUPPORT_DEFAULT; |
| 146 | 149 |
| 147 unsigned int setuphci = SETUPHCI_DEFAULT; | 150 unsigned int setuphci = SETUPHCI_DEFAULT; |
| 151 unsigned int setuphcipal = SETUPHCIPAL_DEFAULT; |
| 148 unsigned int loghci = 0; | 152 unsigned int loghci = 0; |
| 149 unsigned int setupbtdev = SETUPBTDEV_DEFAULT; | 153 unsigned int setupbtdev = SETUPBTDEV_DEFAULT; |
| 150 #ifndef EXPORT_HCI_BRIDGE_INTERFACE | 154 #ifndef EXPORT_HCI_BRIDGE_INTERFACE |
| 151 unsigned int ar3khcibaud = AR3KHCIBAUD_DEFAULT; | 155 unsigned int ar3khcibaud = AR3KHCIBAUD_DEFAULT; |
| 152 unsigned int hciuartscale = HCIUARTSCALE_DEFAULT; | 156 unsigned int hciuartscale = HCIUARTSCALE_DEFAULT; |
| 153 unsigned int hciuartstep = HCIUARTSTEP_DEFAULT; | 157 unsigned int hciuartstep = HCIUARTSTEP_DEFAULT; |
| 154 #endif | 158 #endif |
| 155 #ifdef CONFIG_CHECKSUM_OFFLOAD | 159 #ifdef CONFIG_CHECKSUM_OFFLOAD |
| 156 unsigned int csumOffload=0; | 160 unsigned int csumOffload=0; |
| 157 unsigned int csumOffloadTest=0; | 161 unsigned int csumOffloadTest=0; |
| 158 #endif | 162 #endif |
| 159 unsigned int eppingtest=0; | 163 unsigned int eppingtest=0; |
| 160 | 164 |
| 161 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | |
| 162 module_param_string(ifname, ifname, sizeof(ifname), 0644); | 165 module_param_string(ifname, ifname, sizeof(ifname), 0644); |
| 163 module_param(wlaninitmode, int, 0644); | 166 module_param(wlaninitmode, int, 0644); |
| 164 module_param(bmienable, int, 0644); | 167 module_param(bmienable, int, 0644); |
| 165 module_param(bypasswmi, uint, 0644); | 168 module_param(bypasswmi, uint, 0644); |
| 166 module_param(debuglevel, uint, 0644); | 169 module_param(debuglevel, uint, 0644); |
| 167 module_param(tspecCompliance, int, 0644); | 170 module_param(tspecCompliance, int, 0644); |
| 168 module_param(onebitmode, uint, 0644); | 171 module_param(onebitmode, uint, 0644); |
| 169 module_param(busspeedlow, uint, 0644); | 172 module_param(busspeedlow, uint, 0644); |
| 170 module_param(skipflash, uint, 0644); | 173 module_param(skipflash, uint, 0644); |
| 171 module_param(wmitimeout, uint, 0644); | 174 module_param(wmitimeout, uint, 0644); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 182 #ifdef CONFIG_CHECKSUM_OFFLOAD | 185 #ifdef CONFIG_CHECKSUM_OFFLOAD |
| 183 module_param(csumOffload, uint, 0644); | 186 module_param(csumOffload, uint, 0644); |
| 184 #endif | 187 #endif |
| 185 #ifdef CONFIG_HOST_TCMD_SUPPORT | 188 #ifdef CONFIG_HOST_TCMD_SUPPORT |
| 186 module_param(testmode, uint, 0644); | 189 module_param(testmode, uint, 0644); |
| 187 #endif | 190 #endif |
| 188 module_param(irqprocmode, uint, 0644); | 191 module_param(irqprocmode, uint, 0644); |
| 189 module_param(nohifscattersupport, uint, 0644); | 192 module_param(nohifscattersupport, uint, 0644); |
| 190 module_param(panic_on_assert, uint, 0644); | 193 module_param(panic_on_assert, uint, 0644); |
| 191 module_param(setuphci, uint, 0644); | 194 module_param(setuphci, uint, 0644); |
| 195 module_param(setuphcipal, uint, 0644); |
| 192 module_param(loghci, uint, 0644); | 196 module_param(loghci, uint, 0644); |
| 193 module_param(setupbtdev, uint, 0644); | 197 module_param(setupbtdev, uint, 0644); |
| 194 #ifndef EXPORT_HCI_BRIDGE_INTERFACE | 198 #ifndef EXPORT_HCI_BRIDGE_INTERFACE |
| 195 module_param(ar3khcibaud, uint, 0644); | 199 module_param(ar3khcibaud, uint, 0644); |
| 196 module_param(hciuartscale, uint, 0644); | 200 module_param(hciuartscale, uint, 0644); |
| 197 module_param(hciuartstep, uint, 0644); | 201 module_param(hciuartstep, uint, 0644); |
| 198 #endif | 202 #endif |
| 199 module_param(eppingtest, uint, 0644); | 203 module_param(eppingtest, uint, 0644); |
| 200 #else | |
| 201 | 204 |
| 202 #define __user | |
| 203 /* for linux 2.4 and lower */ | |
| 204 MODULE_PARM(bmienable,"i"); | |
| 205 MODULE_PARM(wlaninitmode,"i"); | |
| 206 MODULE_PARM(bypasswmi,"i"); | |
| 207 MODULE_PARM(debuglevel, "i"); | |
| 208 MODULE_PARM(onebitmode,"i"); | |
| 209 MODULE_PARM(busspeedlow, "i"); | |
| 210 MODULE_PARM(skipflash, "i"); | |
| 211 MODULE_PARM(wmitimeout, "i"); | |
| 212 MODULE_PARM(wlanNodeCaching, "i"); | |
| 213 MODULE_PARM(enableuartprint,"i"); | |
| 214 MODULE_PARM(logWmiRawMsgs, "i"); | |
| 215 MODULE_PARM(enabletimerwar,"i"); | |
| 216 MODULE_PARM(fwmode,"i"); | |
| 217 MODULE_PARM(mbox_yield_limit,"i"); | |
| 218 MODULE_PARM(reduce_credit_dribble,"i"); | |
| 219 MODULE_PARM(allow_trace_signal,"i"); | |
| 220 MODULE_PARM(enablerssicompensation,"i"); | |
| 221 MODULE_PARM(processDot11Hdr,"i"); | |
| 222 #ifdef CONFIG_CHECKSUM_OFFLOAD | |
| 223 MODULE_PARM(csumOffload,"i"); | |
| 224 #endif | |
| 225 #ifdef CONFIG_HOST_TCMD_SUPPORT | |
| 226 MODULE_PARM(testmode, "i"); | |
| 227 #endif | |
| 228 MODULE_PARM(irqprocmode, "i"); | |
| 229 MODULE_PARM(nohifscattersupport, "i"); | |
| 230 MODULE_PARM(panic_on_assert, "i"); | |
| 231 MODULE_PARM(setuphci, "i"); | |
| 232 MODULE_PARM(loghci, "i"); | |
| 233 #endif | |
| 234 | |
| 235 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) | |
| 236 /* in 2.6.10 and later this is now a pointer to a uint */ | 205 /* in 2.6.10 and later this is now a pointer to a uint */ |
| 237 unsigned int _mboxnum = HTC_MAILBOX_NUM_MAX; | 206 unsigned int _mboxnum = HTC_MAILBOX_NUM_MAX; |
| 238 #define mboxnum &_mboxnum | 207 #define mboxnum &_mboxnum |
| 239 #else | |
| 240 unsigned int mboxnum = HTC_MAILBOX_NUM_MAX; | |
| 241 #endif | |
| 242 | 208 |
| 243 #ifdef DEBUG | 209 #ifdef DEBUG |
| 244 A_UINT32 g_dbg_flags = DBG_DEFAULTS; | 210 A_UINT32 g_dbg_flags = DBG_DEFAULTS; |
| 245 unsigned int debugflags = 0; | 211 unsigned int debugflags = 0; |
| 246 int debugdriver = 0; | 212 int debugdriver = 0; |
| 247 unsigned int debughtc = 0; | 213 unsigned int debughtc = 0; |
| 248 unsigned int debugbmi = 0; | 214 unsigned int debugbmi = 0; |
| 249 unsigned int debughif = 0; | 215 unsigned int debughif = 0; |
| 250 unsigned int txcreditsavailable[HTC_MAILBOX_NUM_MAX] = {0}; | 216 unsigned int txcreditsavailable[HTC_MAILBOX_NUM_MAX] = {0}; |
| 251 unsigned int txcreditsconsumed[HTC_MAILBOX_NUM_MAX] = {0}; | 217 unsigned int txcreditsconsumed[HTC_MAILBOX_NUM_MAX] = {0}; |
| 252 unsigned int txcreditintrenable[HTC_MAILBOX_NUM_MAX] = {0}; | 218 unsigned int txcreditintrenable[HTC_MAILBOX_NUM_MAX] = {0}; |
| 253 unsigned int txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX] = {0}; | 219 unsigned int txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX] = {0}; |
| 254 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | |
| 255 module_param(debugflags, uint, 0644); | 220 module_param(debugflags, uint, 0644); |
| 256 module_param(debugdriver, int, 0644); | 221 module_param(debugdriver, int, 0644); |
| 257 module_param(debughtc, uint, 0644); | 222 module_param(debughtc, uint, 0644); |
| 258 module_param(debugbmi, uint, 0644); | 223 module_param(debugbmi, uint, 0644); |
| 259 module_param(debughif, uint, 0644); | 224 module_param(debughif, uint, 0644); |
| 260 module_param_array(txcreditsavailable, uint, mboxnum, 0644); | 225 module_param_array(txcreditsavailable, uint, mboxnum, 0644); |
| 261 module_param_array(txcreditsconsumed, uint, mboxnum, 0644); | 226 module_param_array(txcreditsconsumed, uint, mboxnum, 0644); |
| 262 module_param_array(txcreditintrenable, uint, mboxnum, 0644); | 227 module_param_array(txcreditintrenable, uint, mboxnum, 0644); |
| 263 module_param_array(txcreditintrenableaggregate, uint, mboxnum, 0644); | 228 module_param_array(txcreditintrenableaggregate, uint, mboxnum, 0644); |
| 264 #else | |
| 265 /* linux 2.4 and lower */ | |
| 266 MODULE_PARM(debugflags,"i"); | |
| 267 MODULE_PARM(debugdriver, "i"); | |
| 268 MODULE_PARM(debughtc, "i"); | |
| 269 MODULE_PARM(debugbmi, "i"); | |
| 270 MODULE_PARM(debughif, "i"); | |
| 271 MODULE_PARM(txcreditsavailable, "0-3i"); | |
| 272 MODULE_PARM(txcreditsconsumed, "0-3i"); | |
| 273 MODULE_PARM(txcreditintrenable, "0-3i"); | |
| 274 MODULE_PARM(txcreditintrenableaggregate, "0-3i"); | |
| 275 #endif | |
| 276 | 229 |
| 277 #endif /* DEBUG */ | 230 #endif /* DEBUG */ |
| 278 | 231 |
| 279 unsigned int resetok = 1; | 232 unsigned int resetok = 1; |
| 280 unsigned int tx_attempt[HTC_MAILBOX_NUM_MAX] = {0}; | 233 unsigned int tx_attempt[HTC_MAILBOX_NUM_MAX] = {0}; |
| 281 unsigned int tx_post[HTC_MAILBOX_NUM_MAX] = {0}; | 234 unsigned int tx_post[HTC_MAILBOX_NUM_MAX] = {0}; |
| 282 unsigned int tx_complete[HTC_MAILBOX_NUM_MAX] = {0}; | 235 unsigned int tx_complete[HTC_MAILBOX_NUM_MAX] = {0}; |
| 283 unsigned int hifBusRequestNumMax = 40; | 236 unsigned int hifBusRequestNumMax = 40; |
| 284 unsigned int war23838_disabled = 0; | 237 unsigned int war23838_disabled = 0; |
| 285 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 238 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 286 unsigned int enableAPTCHeuristics = 1; | 239 unsigned int enableAPTCHeuristics = 1; |
| 287 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ | 240 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ |
| 288 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | |
| 289 module_param_array(tx_attempt, uint, mboxnum, 0644); | 241 module_param_array(tx_attempt, uint, mboxnum, 0644); |
| 290 module_param_array(tx_post, uint, mboxnum, 0644); | 242 module_param_array(tx_post, uint, mboxnum, 0644); |
| 291 module_param_array(tx_complete, uint, mboxnum, 0644); | 243 module_param_array(tx_complete, uint, mboxnum, 0644); |
| 292 module_param(hifBusRequestNumMax, uint, 0644); | 244 module_param(hifBusRequestNumMax, uint, 0644); |
| 293 module_param(war23838_disabled, uint, 0644); | 245 module_param(war23838_disabled, uint, 0644); |
| 294 module_param(resetok, uint, 0644); | 246 module_param(resetok, uint, 0644); |
| 295 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 247 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 296 module_param(enableAPTCHeuristics, uint, 0644); | 248 module_param(enableAPTCHeuristics, uint, 0644); |
| 297 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ | 249 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ |
| 298 #else | |
| 299 MODULE_PARM(tx_attempt, "0-3i"); | |
| 300 MODULE_PARM(tx_post, "0-3i"); | |
| 301 MODULE_PARM(tx_complete, "0-3i"); | |
| 302 MODULE_PARM(hifBusRequestNumMax, "i"); | |
| 303 MODULE_PARM(war23838_disabled, "i"); | |
| 304 MODULE_PARM(resetok, "i"); | |
| 305 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | |
| 306 MODULE_PARM(enableAPTCHeuristics, "i"); | |
| 307 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ | |
| 308 #endif | |
| 309 | 250 |
| 310 #ifdef BLOCK_TX_PATH_FLAG | 251 #ifdef BLOCK_TX_PATH_FLAG |
| 311 int blocktx = 0; | 252 int blocktx = 0; |
| 312 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | |
| 313 module_param(blocktx, int, 0644); | 253 module_param(blocktx, int, 0644); |
| 314 #else | |
| 315 MODULE_PARM(blocktx, "i"); | |
| 316 #endif | |
| 317 #endif /* BLOCK_TX_PATH_FLAG */ | 254 #endif /* BLOCK_TX_PATH_FLAG */ |
| 318 | 255 |
| 319 typedef struct user_rssi_compensation_t { | 256 typedef struct user_rssi_compensation_t { |
| 320 A_UINT16 customerID; | 257 A_UINT16 customerID; |
| 321 union { | 258 union { |
| 322 A_UINT16 a_enable; | 259 A_UINT16 a_enable; |
| 323 A_UINT16 bg_enable; | 260 A_UINT16 bg_enable; |
| 324 A_UINT16 enable; | 261 A_UINT16 enable; |
| 325 }; | 262 }; |
| 326 A_INT16 bg_param_a; | 263 A_INT16 bg_param_a; |
| 327 A_INT16 bg_param_b; | 264 A_INT16 bg_param_b; |
| 328 A_INT16 a_param_a; | 265 A_INT16 a_param_a; |
| 329 A_INT16 a_param_b; | 266 A_INT16 a_param_b; |
| 330 A_UINT32 reserved; | 267 A_UINT32 reserved; |
| 331 } USER_RSSI_CPENSATION; | 268 } USER_RSSI_CPENSATION; |
| 332 | 269 |
| 333 static USER_RSSI_CPENSATION rssi_compensation_param; | 270 static USER_RSSI_CPENSATION rssi_compensation_param; |
| 334 | 271 |
| 335 static A_INT16 rssi_compensation_table[96]; | 272 static A_INT16 rssi_compensation_table[96]; |
| 336 | 273 |
| 337 int reconnect_flag = 0; | 274 int reconnect_flag = 0; |
| 275 static ar6k_pal_config_t ar6k_pal_config_g; |
| 338 | 276 |
| 339 /* Function declarations */ | 277 /* Function declarations */ |
| 340 static int ar6000_init_module(void); | 278 static int ar6000_init_module(void); |
| 341 static void ar6000_cleanup_module(void); | 279 static void ar6000_cleanup_module(void); |
| 342 | 280 |
| 343 int ar6000_init(struct net_device *dev); | 281 int ar6000_init(struct net_device *dev); |
| 344 static int ar6000_open(struct net_device *dev); | 282 static int ar6000_open(struct net_device *dev); |
| 345 static int ar6000_close(struct net_device *dev); | 283 static int ar6000_close(struct net_device *dev); |
| 346 static void ar6000_init_control_info(AR_SOFTC_T *ar); | 284 static void ar6000_init_control_info(AR_SOFTC_T *ar); |
| 347 static int ar6000_data_tx(struct sk_buff *skb, struct net_device *dev); | 285 static int ar6000_data_tx(struct sk_buff *skb, struct net_device *dev); |
| 348 | 286 |
| 349 void ar6000_destroy(struct net_device *dev, unsigned int unregister); | 287 void ar6000_destroy(struct net_device *dev, unsigned int unregister); |
| 350 static void ar6000_detect_error(unsigned long ptr); | 288 static void ar6000_detect_error(unsigned long ptr); |
| 351 static void ar6000_set_multicast_list(struct net_device *dev); | 289 static void ar6000_set_multicast_list(struct net_device *dev); |
| 352 static struct net_device_stats *ar6000_get_stats(struct net_device *dev); | 290 static struct net_device_stats *ar6000_get_stats(struct net_device *dev); |
| 353 static struct iw_statistics *ar6000_get_iwstats(struct net_device * dev); | 291 static struct iw_statistics *ar6000_get_iwstats(struct net_device * dev); |
| 354 | 292 |
| 355 static void disconnect_timer_handler(unsigned long ptr); | 293 static void disconnect_timer_handler(unsigned long ptr); |
| 356 | 294 |
| 357 void read_rssi_compensation_param(AR_SOFTC_T *ar); | 295 void read_rssi_compensation_param(AR_SOFTC_T *ar); |
| 358 | 296 |
| 359 /* for android builds we call external APIs that handle firmware download an
d configuration */ | 297 /* for android builds we call external APIs that handle firmware download an
d configuration */ |
| 360 #ifdef ANDROID_ENV | 298 #ifdef ANDROID_ENV |
| 361 /* !!!! Interim android support to make it easier to patch the default driver fo
r | 299 /* !!!! Interim android support to make it easier to patch the default driver fo
r |
| 362 * android use. You must define an external source file ar6000_android.c that ha
ndles the following | 300 * android use. You must define an external source file ar6000_android.c that ha
ndles the following |
| 363 * APIs */ | 301 * APIs */ |
| 364 extern A_STATUS android_ar6k_start(AR_SOFTC_T *ar); | |
| 365 extern void android_module_init(OSDRV_CALLBACKS *osdrvCallbacks); | 302 extern void android_module_init(OSDRV_CALLBACKS *osdrvCallbacks); |
| 366 extern void android_module_exit(void); | 303 extern void android_module_exit(void); |
| 367 extern A_BOOL android_ar6k_endpoint_is_stop(AR_SOFTC_T *ar); | |
| 368 extern void android_ar6k_check_wow_status(AR_SOFTC_T *ar, struct sk_buff *skb, A
_BOOL isEvent); | |
| 369 #endif | 304 #endif |
| 370 /* | 305 /* |
| 371 * HTC service connection handlers | 306 * HTC service connection handlers |
| 372 */ | 307 */ |
| 373 static A_STATUS ar6000_avail_ev(void *context, void *hif_handle); | 308 static A_STATUS ar6000_avail_ev(void *context, void *hif_handle); |
| 374 | 309 |
| 375 static A_STATUS ar6000_unavail_ev(void *context, void *hif_handle); | 310 static A_STATUS ar6000_unavail_ev(void *context, void *hif_handle); |
| 376 | 311 |
| 377 A_STATUS ar6000_configure_target(AR_SOFTC_T *ar); | 312 A_STATUS ar6000_configure_target(AR_SOFTC_T *ar); |
| 378 | 313 |
| 379 void ar6000_stop_endpoint(struct net_device *dev, A_BOOL keepprofile); | |
| 380 | |
| 381 static void ar6000_target_failure(void *Instance, A_STATUS Status); | 314 static void ar6000_target_failure(void *Instance, A_STATUS Status); |
| 382 | 315 |
| 383 static void ar6000_rx(void *Context, HTC_PACKET *pPacket); | 316 static void ar6000_rx(void *Context, HTC_PACKET *pPacket); |
| 384 | 317 |
| 385 static void ar6000_rx_refill(void *Context,HTC_ENDPOINT_ID Endpoint); | 318 static void ar6000_rx_refill(void *Context,HTC_ENDPOINT_ID Endpoint); |
| 386 | 319 |
| 387 static void ar6000_tx_complete(void *Context, HTC_PACKET_QUEUE *pPackets); | 320 static void ar6000_tx_complete(void *Context, HTC_PACKET_QUEUE *pPackets); |
| 388 | 321 |
| 389 static HTC_SEND_FULL_ACTION ar6000_tx_queue_full(void *Context, HTC_PACKET *pPac
ket); | 322 static HTC_SEND_FULL_ACTION ar6000_tx_queue_full(void *Context, HTC_PACKET *pPac
ket); |
| 390 | 323 |
| 391 #ifdef ATH_AR6K_11N_SUPPORT | 324 #ifdef ATH_AR6K_11N_SUPPORT |
| 392 static void ar6000_alloc_netbufs(A_NETBUF_QUEUE_T *q, A_UINT16 num); | 325 static void ar6000_alloc_netbufs(A_NETBUF_QUEUE_T *q, A_UINT16 num); |
| 393 #endif | 326 #endif |
| 394 static void ar6000_deliver_frames_to_nw_stack(void * dev, void *osbuf); | 327 static void ar6000_deliver_frames_to_nw_stack(void * dev, void *osbuf); |
| 395 //static void ar6000_deliver_frames_to_bt_stack(void * dev, void *osbuf); | 328 //static void ar6000_deliver_frames_to_bt_stack(void * dev, void *osbuf); |
| 396 | 329 |
| 397 static HTC_PACKET *ar6000_alloc_amsdu_rxbuf(void *Context, HTC_ENDPOINT_ID Endpo
int, int Length); | 330 static HTC_PACKET *ar6000_alloc_amsdu_rxbuf(void *Context, HTC_ENDPOINT_ID Endpo
int, int Length); |
| 398 | 331 |
| 399 static void ar6000_refill_amsdu_rxbufs(AR_SOFTC_T *ar, int Count); | 332 static void ar6000_refill_amsdu_rxbufs(AR_SOFTC_T *ar, int Count); |
| 400 | 333 |
| 401 static void ar6000_cleanup_amsdu_rxbufs(AR_SOFTC_T *ar); | 334 static void ar6000_cleanup_amsdu_rxbufs(AR_SOFTC_T *ar); |
| 402 | 335 |
| 403 static ssize_t | 336 static ssize_t |
| 404 ar6000_sysfs_bmi_read(struct kobject *kobj, struct bin_attribute *bin_attr, | 337 ar6000_sysfs_bmi_read(struct file *fp, struct kobject *kobj, |
| 338 struct bin_attribute *bin_attr, |
| 405 char *buf, loff_t pos, size_t count); | 339 char *buf, loff_t pos, size_t count); |
| 406 | 340 |
| 407 static ssize_t | 341 static ssize_t |
| 408 ar6000_sysfs_bmi_write(struct kobject *kobj, struct bin_attribute *bin_attr, | 342 ar6000_sysfs_bmi_write(struct file *fp, struct kobject *kobj, |
| 343 struct bin_attribute *bin_attr, |
| 409 char *buf, loff_t pos, size_t count); | 344 char *buf, loff_t pos, size_t count); |
| 410 | 345 |
| 411 static A_STATUS | 346 static A_STATUS |
| 412 ar6000_sysfs_bmi_init(AR_SOFTC_T *ar); | 347 ar6000_sysfs_bmi_init(AR_SOFTC_T *ar); |
| 413 | 348 |
| 349 /* HCI PAL callback function declarations */ |
| 350 A_STATUS ar6k_setup_hci_pal(AR_SOFTC_T *ar); |
| 351 void ar6k_cleanup_hci_pal(AR_SOFTC_T *ar); |
| 352 |
| 414 static void | 353 static void |
| 415 ar6000_sysfs_bmi_deinit(AR_SOFTC_T *ar); | 354 ar6000_sysfs_bmi_deinit(AR_SOFTC_T *ar); |
| 416 | 355 |
| 417 A_STATUS | 356 A_STATUS |
| 418 ar6000_sysfs_bmi_get_config(AR_SOFTC_T *ar, A_UINT32 mode); | 357 ar6000_sysfs_bmi_get_config(AR_SOFTC_T *ar, A_UINT32 mode); |
| 419 | 358 |
| 420 /* | 359 /* |
| 421 * Static variables | 360 * Static variables |
| 422 */ | 361 */ |
| 423 | 362 |
| 424 struct net_device *ar6000_devices[MAX_AR6000]; | 363 struct net_device *ar6000_devices[MAX_AR6000]; |
| 364 static int is_netdev_registered; |
| 425 extern struct iw_handler_def ath_iw_handler_def; | 365 extern struct iw_handler_def ath_iw_handler_def; |
| 426 DECLARE_WAIT_QUEUE_HEAD(arEvent); | 366 DECLARE_WAIT_QUEUE_HEAD(arEvent); |
| 427 static void ar6000_cookie_init(AR_SOFTC_T *ar); | 367 static void ar6000_cookie_init(AR_SOFTC_T *ar); |
| 428 static void ar6000_cookie_cleanup(AR_SOFTC_T *ar); | 368 static void ar6000_cookie_cleanup(AR_SOFTC_T *ar); |
| 429 static void ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie); | 369 static void ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie); |
| 430 static struct ar_cookie *ar6000_alloc_cookie(AR_SOFTC_T *ar); | 370 static struct ar_cookie *ar6000_alloc_cookie(AR_SOFTC_T *ar); |
| 431 | 371 |
| 432 #ifdef USER_KEYS | 372 #ifdef USER_KEYS |
| 433 static A_STATUS ar6000_reinstall_keys(AR_SOFTC_T *ar,A_UINT8 key_op_ctrl); | 373 static A_STATUS ar6000_reinstall_keys(AR_SOFTC_T *ar,A_UINT8 key_op_ctrl); |
| 434 #endif | 374 #endif |
| 435 | 375 |
| 376 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT |
| 377 struct net_device *arApNetDev; |
| 378 #endif /* CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT */ |
| 436 | 379 |
| 437 static struct ar_cookie s_ar_cookie_mem[MAX_COOKIE_NUM]; | 380 static struct ar_cookie s_ar_cookie_mem[MAX_COOKIE_NUM]; |
| 438 | 381 |
| 439 #define HOST_INTEREST_ITEM_ADDRESS(ar, item) \ | 382 #define HOST_INTEREST_ITEM_ADDRESS(ar, item) \ |
| 440 (((ar)->arTargetType == TARGET_TYPE_AR6001) ? AR6001_HOST_INTEREST_ITEM_
ADDRESS(item) : \ | |
| 441 (((ar)->arTargetType == TARGET_TYPE_AR6002) ? AR6002_HOST_INTEREST_ITEM_
ADDRESS(item) : \ | 383 (((ar)->arTargetType == TARGET_TYPE_AR6002) ? AR6002_HOST_INTEREST_ITEM_
ADDRESS(item) : \ |
| 442 (((ar)->arTargetType == TARGET_TYPE_AR6003) ? AR6003_HOST_INTEREST_ITEM_
ADDRESS(item) : 0))) | 384 (((ar)->arTargetType == TARGET_TYPE_AR6003) ? AR6003_HOST_INTEREST_ITEM_
ADDRESS(item) : 0)) |
| 443 | 385 |
| 444 | 386 |
| 445 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) | |
| 446 static struct net_device_ops ar6000_netdev_ops = { | 387 static struct net_device_ops ar6000_netdev_ops = { |
| 447 .ndo_init = NULL, | 388 .ndo_init = NULL, |
| 448 .ndo_open = ar6000_open, | 389 .ndo_open = ar6000_open, |
| 449 .ndo_stop = ar6000_close, | 390 .ndo_stop = ar6000_close, |
| 450 .ndo_get_stats = ar6000_get_stats, | 391 .ndo_get_stats = ar6000_get_stats, |
| 451 .ndo_do_ioctl = ar6000_ioctl, | 392 .ndo_do_ioctl = ar6000_ioctl, |
| 452 .ndo_start_xmit = ar6000_data_tx, | 393 .ndo_start_xmit = ar6000_data_tx, |
| 453 .ndo_set_multicast_list = ar6000_set_multicast_list, | 394 .ndo_set_multicast_list = ar6000_set_multicast_list, |
| 454 }; | 395 }; |
| 455 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) */ | |
| 456 | 396 |
| 457 /* Debug log support */ | 397 /* Debug log support */ |
| 458 | 398 |
| 459 /* | 399 /* |
| 460 * Flag to govern whether the debug logs should be parsed in the kernel | 400 * Flag to govern whether the debug logs should be parsed in the kernel |
| 461 * or reported to the application. | 401 * or reported to the application. |
| 462 */ | 402 */ |
| 463 #define REPORT_DEBUG_LOGS_TO_APP | 403 #define REPORT_DEBUG_LOGS_TO_APP |
| 464 | 404 |
| 465 A_STATUS | 405 A_STATUS |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 default: | 515 default: |
| 576 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid args: %d\n", numargs)); | 516 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid args: %d\n", numargs)); |
| 577 } | 517 } |
| 578 count += numargs + 1; | 518 count += numargs + 1; |
| 579 } | 519 } |
| 580 } | 520 } |
| 581 | 521 |
| 582 int | 522 int |
| 583 ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar) | 523 ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar) |
| 584 { | 524 { |
| 585 struct dbglog_hdr_s debug_hdr; | 525 A_UINT32 data[8]; /* Should be able to accomodate struct dbglog_buf_s */ |
| 586 struct dbglog_buf_s debug_buf; | |
| 587 A_UINT32 address; | 526 A_UINT32 address; |
| 588 A_UINT32 length; | 527 A_UINT32 length; |
| 589 A_UINT32 dropped; | 528 A_UINT32 dropped; |
| 590 A_UINT32 firstbuf; | 529 A_UINT32 firstbuf; |
| 591 A_UINT32 debug_hdr_ptr; | 530 A_UINT32 debug_hdr_ptr; |
| 592 | 531 |
| 593 if (!ar->dbglog_init_done) return A_ERROR; | 532 if (!ar->dbglog_init_done) return A_ERROR; |
| 594 | 533 |
| 595 | 534 |
| 596 AR6000_SPIN_LOCK(&ar->arLock, 0); | 535 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| 597 | 536 |
| 598 if (ar->dbgLogFetchInProgress) { | 537 if (ar->dbgLogFetchInProgress) { |
| 599 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 538 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 600 return A_EBUSY; | 539 return A_EBUSY; |
| 601 } | 540 } |
| 602 | 541 |
| 603 /* block out others */ | 542 /* block out others */ |
| 604 ar->dbgLogFetchInProgress = TRUE; | 543 ar->dbgLogFetchInProgress = TRUE; |
| 605 | 544 |
| 606 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 545 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 607 | 546 |
| 608 debug_hdr_ptr = dbglog_get_debug_hdr_ptr(ar); | 547 debug_hdr_ptr = dbglog_get_debug_hdr_ptr(ar); |
| 609 printk("debug_hdr_ptr: 0x%x\n", debug_hdr_ptr); | 548 printk("debug_hdr_ptr: 0x%x\n", debug_hdr_ptr); |
| 610 | 549 |
| 611 /* Get the contents of the ring buffer */ | 550 /* Get the contents of the ring buffer */ |
| 612 if (debug_hdr_ptr) { | 551 if (debug_hdr_ptr) { |
| 613 address = TARG_VTOP(ar->arTargetType, debug_hdr_ptr); | 552 address = TARG_VTOP(ar->arTargetType, debug_hdr_ptr); |
| 614 length = sizeof(struct dbglog_hdr_s); | 553 length = 4 /* sizeof(dbuf) */ + 4 /* sizeof(dropped) */; |
| 615 ar6000_ReadDataDiag(ar->arHifDevice, address, | 554 A_MEMZERO(data, sizeof(data)); |
| 616 (A_UCHAR *)&debug_hdr, length); | 555 ar6000_ReadDataDiag(ar->arHifDevice, address, (A_UCHAR *)data, length); |
| 617 address = TARG_VTOP(ar->arTargetType, (A_UINT32)debug_hdr.dbuf); | 556 address = TARG_VTOP(ar->arTargetType, data[0] /* dbuf */); |
| 618 firstbuf = address; | 557 firstbuf = address; |
| 619 dropped = debug_hdr.dropped; | 558 dropped = data[1]; /* dropped */ |
| 620 length = sizeof(struct dbglog_buf_s); | 559 length = 4 /* sizeof(next) */ + 4 /* sizeof(buffer) */ + 4 /* sizeof(buf
size) */ + 4 /* sizeof(length) */ + 4 /* sizeof(count) */ + 4 /* sizeof(free) */
; |
| 621 ar6000_ReadDataDiag(ar->arHifDevice, address, | 560 A_MEMZERO(data, sizeof(data)); |
| 622 (A_UCHAR *)&debug_buf, length); | 561 ar6000_ReadDataDiag(ar->arHifDevice, address, (A_UCHAR *)&data, length); |
| 623 | 562 |
| 624 do { | 563 do { |
| 625 address = TARG_VTOP(ar->arTargetType, (A_UINT32)debug_buf.buffer); | 564 address = TARG_VTOP(ar->arTargetType, data[1] /* buffer*/); |
| 626 length = debug_buf.length; | 565 length = data[3]; /* length */ |
| 627 if ((length) && (debug_buf.length <= debug_buf.bufsize)) { | 566 if ((length) && (length <= data[2] /* bufsize*/)) { |
| 628 /* Rewind the index if it is about to overrun the buffer */ | 567 /* Rewind the index if it is about to overrun the buffer */ |
| 629 if (ar->log_cnt > (DBGLOG_HOST_LOG_BUFFER_SIZE - length)) { | 568 if (ar->log_cnt > (DBGLOG_HOST_LOG_BUFFER_SIZE - length)) { |
| 630 ar->log_cnt = 0; | 569 ar->log_cnt = 0; |
| 631 } | 570 } |
| 632 if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address, | 571 if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address, |
| 633 (A_UCHAR *)&ar->log_buffer[ar->log_cnt], len
gth)) | 572 (A_UCHAR *)&ar->log_buffer[ar->log_cnt], len
gth)) |
| 634 { | 573 { |
| 635 break; | 574 break; |
| 636 } | 575 } |
| 637 ar6000_dbglog_event(ar, dropped, (A_INT8*)&ar->log_buffer[ar->lo
g_cnt], length); | 576 ar6000_dbglog_event(ar, dropped, (A_INT8*)&ar->log_buffer[ar->lo
g_cnt], length); |
| 638 ar->log_cnt += length; | 577 ar->log_cnt += length; |
| 639 } else { | 578 } else { |
| 640 AR_DEBUG_PRINTF(ATH_DEBUG_DBG_LOG,("Length: %d (Total size: %d)\
n", | 579 AR_DEBUG_PRINTF(ATH_DEBUG_DBG_LOG,("Length: %d (Total size: %d)\
n", |
| 641 debug_buf.length, debug_buf.bufsize)); | 580 data[3], data[2])); |
| 642 } | 581 } |
| 643 | 582 |
| 644 address = TARG_VTOP(ar->arTargetType, (A_UINT32)debug_buf.next); | 583 address = TARG_VTOP(ar->arTargetType, data[0] /* next */); |
| 645 length = sizeof(struct dbglog_buf_s); | 584 length = 4 /* sizeof(next) */ + 4 /* sizeof(buffer) */ + 4 /* sizeof
(bufsize) */ + 4 /* sizeof(length) */ + 4 /* sizeof(count) */ + 4 /* sizeof(free
) */; |
| 585 A_MEMZERO(data, sizeof(data)); |
| 646 if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address, | 586 if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address, |
| 647 (A_UCHAR *)&debug_buf, length)) | 587 (A_UCHAR *)&data, length)) |
| 648 { | 588 { |
| 649 break; | 589 break; |
| 650 } | 590 } |
| 651 | 591 |
| 652 } while (address != firstbuf); | 592 } while (address != firstbuf); |
| 653 } | 593 } |
| 654 | 594 |
| 655 ar->dbgLogFetchInProgress = FALSE; | 595 ar->dbgLogFetchInProgress = FALSE; |
| 656 | 596 |
| 657 return A_OK; | 597 return A_OK; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 ATH_DEBUG_SET_DEBUG_MASK(driver,debugdriver); | 653 ATH_DEBUG_SET_DEBUG_MASK(driver,debugdriver); |
| 714 } | 654 } |
| 715 | 655 |
| 716 #endif | 656 #endif |
| 717 | 657 |
| 718 A_REGISTER_MODULE_DEBUG_INFO(driver); | 658 A_REGISTER_MODULE_DEBUG_INFO(driver); |
| 719 | 659 |
| 720 A_MEMZERO(&osdrvCallbacks,sizeof(osdrvCallbacks)); | 660 A_MEMZERO(&osdrvCallbacks,sizeof(osdrvCallbacks)); |
| 721 osdrvCallbacks.deviceInsertedHandler = ar6000_avail_ev; | 661 osdrvCallbacks.deviceInsertedHandler = ar6000_avail_ev; |
| 722 osdrvCallbacks.deviceRemovedHandler = ar6000_unavail_ev; | 662 osdrvCallbacks.deviceRemovedHandler = ar6000_unavail_ev; |
| 663 #ifdef CONFIG_PM |
| 664 osdrvCallbacks.deviceSuspendHandler = ar6000_suspend_ev; |
| 665 osdrvCallbacks.deviceResumeHandler = ar6000_resume_ev; |
| 666 osdrvCallbacks.devicePowerChangeHandler = ar6000_power_change_ev; |
| 667 #endif |
| 668 |
| 669 ar6000_pm_init(); |
| 723 | 670 |
| 724 #ifdef ANDROID_ENV | 671 #ifdef ANDROID_ENV |
| 725 android_module_init(&osdrvCallbacks); | 672 android_module_init(&osdrvCallbacks); |
| 726 #endif | 673 #endif |
| 727 | 674 |
| 728 #ifdef DEBUG | 675 #ifdef DEBUG |
| 729 /* Set the debug flags if specified at load time */ | 676 /* Set the debug flags if specified at load time */ |
| 730 if(debugflags != 0) | 677 if(debugflags != 0) |
| 731 { | 678 { |
| 732 g_dbg_flags = debugflags; | 679 g_dbg_flags = debugflags; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 ar6000_netdev = ar6000_devices[i]; | 718 ar6000_netdev = ar6000_devices[i]; |
| 772 ar6000_devices[i] = NULL; | 719 ar6000_devices[i] = NULL; |
| 773 ar6000_destroy(ar6000_netdev, 1); | 720 ar6000_destroy(ar6000_netdev, 1); |
| 774 } | 721 } |
| 775 } | 722 } |
| 776 | 723 |
| 777 HIFShutDownDevice(NULL); | 724 HIFShutDownDevice(NULL); |
| 778 | 725 |
| 779 a_module_debug_support_cleanup(); | 726 a_module_debug_support_cleanup(); |
| 780 | 727 |
| 728 ar6000_pm_exit(); |
| 729 |
| 781 #ifdef ANDROID_ENV | 730 #ifdef ANDROID_ENV |
| 782 android_module_exit(); | 731 android_module_exit(); |
| 783 #endif | 732 #endif |
| 784 | 733 |
| 785 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("ar6000_cleanup: success\n")); | 734 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("ar6000_cleanup: success\n")); |
| 786 } | 735 } |
| 787 | 736 |
| 788 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 737 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 789 void | 738 void |
| 790 aptcTimerHandler(unsigned long arg) | 739 aptcTimerHandler(unsigned long arg) |
| 791 { | 740 { |
| 792 A_UINT32 numbytes; | 741 A_UINT32 numbytes; |
| 793 A_UINT32 throughput; | 742 A_UINT32 throughput; |
| 794 AR_SOFTC_T *ar; | 743 AR_SOFTC_T *ar; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 } | 792 } |
| 844 #endif | 793 #endif |
| 845 | 794 |
| 846 static struct bin_attribute bmi_attr = { | 795 static struct bin_attribute bmi_attr = { |
| 847 .attr = {.name = "bmi", .mode = 0600}, | 796 .attr = {.name = "bmi", .mode = 0600}, |
| 848 .read = ar6000_sysfs_bmi_read, | 797 .read = ar6000_sysfs_bmi_read, |
| 849 .write = ar6000_sysfs_bmi_write, | 798 .write = ar6000_sysfs_bmi_write, |
| 850 }; | 799 }; |
| 851 | 800 |
| 852 static ssize_t | 801 static ssize_t |
| 853 ar6000_sysfs_bmi_read(struct kobject *kobj, struct bin_attribute *bin_attr, | 802 ar6000_sysfs_bmi_read(struct file *fp, struct kobject *kobj, |
| 803 struct bin_attribute *bin_attr, |
| 854 char *buf, loff_t pos, size_t count) | 804 char *buf, loff_t pos, size_t count) |
| 855 { | 805 { |
| 856 int index; | 806 int index; |
| 857 AR_SOFTC_T *ar; | 807 AR_SOFTC_T *ar; |
| 858 HIF_DEVICE_OS_DEVICE_INFO *osDevInfo; | 808 HIF_DEVICE_OS_DEVICE_INFO *osDevInfo; |
| 859 | 809 |
| 860 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("BMI: Read %d bytes\n", count)); | 810 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("BMI: Read %d bytes\n", (A_UINT32)count)); |
| 861 for (index=0; index < MAX_AR6000; index++) { | 811 for (index=0; index < MAX_AR6000; index++) { |
| 862 ar = (AR_SOFTC_T *)ar6k_priv(ar6000_devices[index]); | 812 ar = (AR_SOFTC_T *)ar6k_priv(ar6000_devices[index]); |
| 863 osDevInfo = &ar->osDevInfo; | 813 osDevInfo = &ar->osDevInfo; |
| 864 if (kobj == (&(((struct device *)osDevInfo->pOSDevice)->kobj))) { | 814 if (kobj == (&(((struct device *)osDevInfo->pOSDevice)->kobj))) { |
| 865 break; | 815 break; |
| 866 } | 816 } |
| 867 } | 817 } |
| 868 | 818 |
| 869 if (index == MAX_AR6000) return 0; | 819 if (index == MAX_AR6000) return 0; |
| 870 | 820 |
| 871 if ((BMIRawRead(ar->arHifDevice, (A_UCHAR*)buf, count, TRUE)) != A_OK) { | 821 if ((BMIRawRead(ar->arHifDevice, (A_UCHAR*)buf, count, TRUE)) != A_OK) { |
| 872 return 0; | 822 return 0; |
| 873 } | 823 } |
| 874 | 824 |
| 875 return count; | 825 return count; |
| 876 } | 826 } |
| 877 | 827 |
| 878 static ssize_t | 828 static ssize_t |
| 879 ar6000_sysfs_bmi_write(struct kobject *kobj, struct bin_attribute *bin_attr, | 829 ar6000_sysfs_bmi_write(struct file *fp, struct kobject *kobj, |
| 830 struct bin_attribute *bin_attr, |
| 880 char *buf, loff_t pos, size_t count) | 831 char *buf, loff_t pos, size_t count) |
| 881 { | 832 { |
| 882 int index; | 833 int index; |
| 883 AR_SOFTC_T *ar; | 834 AR_SOFTC_T *ar; |
| 884 HIF_DEVICE_OS_DEVICE_INFO *osDevInfo; | 835 HIF_DEVICE_OS_DEVICE_INFO *osDevInfo; |
| 885 | 836 |
| 886 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("BMI: Write %d bytes\n", count)); | 837 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("BMI: Write %d bytes\n", (A_UINT32)count)); |
| 887 for (index=0; index < MAX_AR6000; index++) { | 838 for (index=0; index < MAX_AR6000; index++) { |
| 888 ar = (AR_SOFTC_T *)ar6k_priv(ar6000_devices[index]); | 839 ar = (AR_SOFTC_T *)ar6k_priv(ar6000_devices[index]); |
| 889 osDevInfo = &ar->osDevInfo; | 840 osDevInfo = &ar->osDevInfo; |
| 890 if (kobj == (&(((struct device *)osDevInfo->pOSDevice)->kobj))) { | 841 if (kobj == (&(((struct device *)osDevInfo->pOSDevice)->kobj))) { |
| 891 break; | 842 break; |
| 892 } | 843 } |
| 893 } | 844 } |
| 894 | 845 |
| 895 if (index == MAX_AR6000) return 0; | 846 if (index == MAX_AR6000) return 0; |
| 896 | 847 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 #define bmifn(fn) do { \ | 892 #define bmifn(fn) do { \ |
| 942 if ((fn) < A_OK) { \ | 893 if ((fn) < A_OK) { \ |
| 943 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__))
; \ | 894 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__))
; \ |
| 944 return A_ERROR; \ | 895 return A_ERROR; \ |
| 945 } \ | 896 } \ |
| 946 } while(0) | 897 } while(0) |
| 947 | 898 |
| 948 #ifdef INIT_MODE_DRV_ENABLED | 899 #ifdef INIT_MODE_DRV_ENABLED |
| 949 | 900 |
| 950 #ifdef SOFTMAC_FILE_USED | 901 #ifdef SOFTMAC_FILE_USED |
| 951 #define AR6001_MAC_ADDRESS_OFFSET 0x06 | |
| 952 #define AR6002_MAC_ADDRESS_OFFSET 0x0A | 902 #define AR6002_MAC_ADDRESS_OFFSET 0x0A |
| 953 #define AR6003_MAC_ADDRESS_OFFSET 0x16 | 903 #define AR6003_MAC_ADDRESS_OFFSET 0x16 |
| 954 static | 904 static |
| 955 void calculate_crc(A_UINT32 TargetType, A_UCHAR *eeprom_data) | 905 void calculate_crc(A_UINT32 TargetType, A_UCHAR *eeprom_data) |
| 956 { | 906 { |
| 957 A_UINT16 *ptr_crc; | 907 A_UINT16 *ptr_crc; |
| 958 A_UINT16 *ptr16_eeprom; | 908 A_UINT16 *ptr16_eeprom; |
| 959 A_UINT16 checksum; | 909 A_UINT16 checksum; |
| 960 A_UINT32 i; | 910 A_UINT32 i; |
| 961 A_UINT32 eeprom_size; | 911 A_UINT32 eeprom_size; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 992 *ptr_crc = checksum; | 942 *ptr_crc = checksum; |
| 993 } | 943 } |
| 994 | 944 |
| 995 static void | 945 static void |
| 996 ar6000_softmac_update(AR_SOFTC_T *ar, A_UCHAR *eeprom_data, size_t size) | 946 ar6000_softmac_update(AR_SOFTC_T *ar, A_UCHAR *eeprom_data, size_t size) |
| 997 { | 947 { |
| 998 const char *source = "random generated"; | 948 const char *source = "random generated"; |
| 999 const struct firmware *softmac_entry; | 949 const struct firmware *softmac_entry; |
| 1000 A_UCHAR *ptr_mac; | 950 A_UCHAR *ptr_mac; |
| 1001 switch (ar->arTargetType) { | 951 switch (ar->arTargetType) { |
| 1002 case TARGET_TYPE_AR6001: | |
| 1003 ptr_mac = (A_UINT8 *)((A_UCHAR *)eeprom_data + AR6001_MAC_ADDRESS_OFFSET
); | |
| 1004 break; | |
| 1005 case TARGET_TYPE_AR6002: | 952 case TARGET_TYPE_AR6002: |
| 1006 ptr_mac = (A_UINT8 *)((A_UCHAR *)eeprom_data + AR6002_MAC_ADDRESS_OFFSET
); | 953 ptr_mac = (A_UINT8 *)((A_UCHAR *)eeprom_data + AR6002_MAC_ADDRESS_OFFSET
); |
| 1007 break; | 954 break; |
| 1008 case TARGET_TYPE_AR6003: | 955 case TARGET_TYPE_AR6003: |
| 1009 ptr_mac = (A_UINT8 *)((A_UCHAR *)eeprom_data + AR6003_MAC_ADDRESS_OFFSET
); | 956 ptr_mac = (A_UINT8 *)((A_UCHAR *)eeprom_data + AR6003_MAC_ADDRESS_OFFSET
); |
| 1010 break; | 957 break; |
| 1011 default: | 958 default: |
| 1012 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid Target Type \n")); | 959 » AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Invalid Target Type\n")); |
| 1013 return; | 960 return; |
| 1014 } | 961 } |
| 1015 printk("MAC from EEPROM %02X:%02X:%02X:%02X:%02X:%02X\n", | 962 » printk(KERN_DEBUG "MAC from EEPROM %pM\n", ptr_mac); |
| 1016 ptr_mac[0], ptr_mac[1], ptr_mac[2], | |
| 1017 ptr_mac[3], ptr_mac[4], ptr_mac[5]); | |
| 1018 | 963 |
| 1019 /* create a random MAC in case we cannot read file from system */ | 964 /* create a random MAC in case we cannot read file from system */ |
| 1020 ptr_mac[0] = 0; | 965 ptr_mac[0] = 0; |
| 1021 ptr_mac[1] = 0x03; | 966 ptr_mac[1] = 0x03; |
| 1022 ptr_mac[2] = 0x7F; | 967 ptr_mac[2] = 0x7F; |
| 1023 ptr_mac[3] = random32() & 0xff; | 968 ptr_mac[3] = random32() & 0xff; |
| 1024 ptr_mac[4] = random32() & 0xff; | 969 ptr_mac[4] = random32() & 0xff; |
| 1025 ptr_mac[5] = random32() & 0xff; | 970 ptr_mac[5] = random32() & 0xff; |
| 1026 if ((A_REQUEST_FIRMWARE(&softmac_entry, "softmac", ((struct device *)ar->osD
evInfo.pOSDevice))) == 0) | 971 if ((A_REQUEST_FIRMWARE(&softmac_entry, "softmac", ((struct device *)ar->osD
evInfo.pOSDevice))) == 0) |
| 1027 { | 972 { |
| 1028 A_CHAR *macbuf = A_MALLOC_NOWAIT(softmac_entry->size+1); | 973 A_CHAR *macbuf = A_MALLOC_NOWAIT(softmac_entry->size+1); |
| 1029 if (macbuf) { | 974 if (macbuf) { |
| 1030 unsigned int softmac[6]; | 975 unsigned int softmac[6]; |
| 1031 memcpy(macbuf, softmac_entry->data, softmac_entry->size); | 976 memcpy(macbuf, softmac_entry->data, softmac_entry->size); |
| 1032 macbuf[softmac_entry->size] = '\0'; | 977 macbuf[softmac_entry->size] = '\0'; |
| 1033 if (sscanf(macbuf, "%02x:%02x:%02x:%02x:%02x:%02x", | 978 if (sscanf(macbuf, "%02x:%02x:%02x:%02x:%02x:%02x", |
| 1034 &softmac[0], &softmac[1], &softmac[2], | 979 &softmac[0], &softmac[1], &softmac[2], |
| 1035 &softmac[3], &softmac[4], &softmac[5])==6) { | 980 &softmac[3], &softmac[4], &softmac[5])==6) { |
| 1036 int i; | 981 int i; |
| 1037 for (i=0; i<6; ++i) { | 982 for (i=0; i<6; ++i) { |
| 1038 ptr_mac[i] = softmac[i] & 0xff; | 983 ptr_mac[i] = softmac[i] & 0xff; |
| 1039 } | 984 } |
| 1040 source = "softmac file"; | 985 source = "softmac file"; |
| 1041 } | 986 } |
| 1042 A_FREE(macbuf); | 987 A_FREE(macbuf); |
| 1043 } | 988 } |
| 1044 A_RELEASE_FIRMWARE(softmac_entry); | 989 A_RELEASE_FIRMWARE(softmac_entry); |
| 1045 } | 990 } |
| 1046 printk("MAC from %s %02X:%02X:%02X:%02X:%02X:%02X\n", source, | 991 » printk(KERN_DEBUG "MAC from %s %pM\n", source, ptr_mac); |
| 1047 ptr_mac[0], ptr_mac[1], ptr_mac[2], | |
| 1048 ptr_mac[3], ptr_mac[4], ptr_mac[5]); | |
| 1049 calculate_crc(ar->arTargetType, eeprom_data); | 992 calculate_crc(ar->arTargetType, eeprom_data); |
| 1050 } | 993 } |
| 1051 #endif /* SOFTMAC_FILE_USED */ | 994 #endif /* SOFTMAC_FILE_USED */ |
| 1052 | 995 |
| 1053 static A_STATUS | 996 static A_STATUS |
| 1054 ar6000_transfer_bin_file(AR_SOFTC_T *ar, AR6K_BIN_FILE file, A_UINT32 address, A
_BOOL compressed) | 997 ar6000_transfer_bin_file(AR_SOFTC_T *ar, AR6K_BIN_FILE file, A_UINT32 address, A
_BOOL compressed) |
| 1055 { | 998 { |
| 1056 A_STATUS status; | 999 A_STATUS status; |
| 1057 const char *filename; | 1000 const char *filename; |
| 1058 const struct firmware *fw_entry; | 1001 const struct firmware *fw_entry; |
| 1002 A_UINT32 fw_entry_size; |
| 1059 | 1003 |
| 1060 switch (file) { | 1004 switch (file) { |
| 1061 case AR6K_OTP_FILE: | 1005 case AR6K_OTP_FILE: |
| 1062 if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { | 1006 if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
| 1063 filename = AR6003_REV1_OTP_FILE; | 1007 filename = AR6003_REV1_OTP_FILE; |
| 1064 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { | 1008 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
| 1065 filename = AR6003_REV2_OTP_FILE; | 1009 filename = AR6003_REV2_OTP_FILE; |
| 1066 } else { | 1010 } else { |
| 1067 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n
", ar->arVersion.target_ver)); | 1011 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n
", ar->arVersion.target_ver)); |
| 1068 return A_ERROR; | 1012 return A_ERROR; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to get %s\n", filename)); | 1096 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to get %s\n", filename)); |
| 1153 return A_ENOENT; | 1097 return A_ENOENT; |
| 1154 } | 1098 } |
| 1155 | 1099 |
| 1156 #ifdef SOFTMAC_FILE_USED | 1100 #ifdef SOFTMAC_FILE_USED |
| 1157 if (file==AR6K_BOARD_DATA_FILE && fw_entry->data) { | 1101 if (file==AR6K_BOARD_DATA_FILE && fw_entry->data) { |
| 1158 ar6000_softmac_update(ar, (A_UCHAR *)fw_entry->data, fw_entry->size); | 1102 ar6000_softmac_update(ar, (A_UCHAR *)fw_entry->data, fw_entry->size); |
| 1159 } | 1103 } |
| 1160 #endif | 1104 #endif |
| 1161 | 1105 |
| 1106 |
| 1107 fw_entry_size = fw_entry->size; |
| 1108 |
| 1109 /* Load extended board data for AR6003 */ |
| 1110 if ((file==AR6K_BOARD_DATA_FILE) && (fw_entry->data)) { |
| 1111 A_UINT32 board_ext_address; |
| 1112 A_UINT32 board_ext_data_size; |
| 1113 A_UINT32 board_data_size; |
| 1114 |
| 1115 board_ext_data_size = (((ar)->arTargetType == TARGET_TYPE_AR6002) ? AR60
02_BOARD_EXT_DATA_SZ : \ |
| 1116 (((ar)->arTargetType == TARGET_TYPE_AR6003) ? AR6
003_BOARD_EXT_DATA_SZ : 0)); |
| 1117 |
| 1118 board_data_size = (((ar)->arTargetType == TARGET_TYPE_AR6002) ? AR6002_B
OARD_DATA_SZ : \ |
| 1119 (((ar)->arTargetType == TARGET_TYPE_AR6003) ? AR6003_B
OARD_DATA_SZ : 0)); |
| 1120 |
| 1121 /* Determine where in Target RAM to write Board Data */ |
| 1122 bmifn(BMIReadMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_b
oard_ext_data), (A_UCHAR *)&board_ext_address, 4)); |
| 1123 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("Board extended Data download address:
0x%x\n", board_ext_address)); |
| 1124 |
| 1125 /* check whether the target has allocated memory for extended board data
and file contains extended board data */ |
| 1126 if ((board_ext_address) && (fw_entry->size == (board_data_size + board_e
xt_data_size))) { |
| 1127 A_UINT32 param; |
| 1128 |
| 1129 status = BMIWriteMemory(ar->arHifDevice, board_ext_address, (A_UCHAR
*)(((A_UINT32)fw_entry->data) + board_data_size), board_ext_data_size); |
| 1130 |
| 1131 if (status != A_OK) { |
| 1132 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __
LINE__)); |
| 1133 A_RELEASE_FIRMWARE(fw_entry); |
| 1134 return A_ERROR; |
| 1135 } |
| 1136 |
| 1137 /* Record the fact that extended board Data IS initialized */ |
| 1138 param = 1; |
| 1139 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_board_ext_data_initialized), (A_UCHAR *)¶m, 4)); |
| 1140 } |
| 1141 fw_entry_size = board_data_size; |
| 1142 } |
| 1143 |
| 1162 if (compressed) { | 1144 if (compressed) { |
| 1163 status = BMIFastDownload(ar->arHifDevice, address, (A_UCHAR *)fw_entry->
data, fw_entry->size); | 1145 status = BMIFastDownload(ar->arHifDevice, address, (A_UCHAR *)fw_entry->
data, fw_entry_size); |
| 1164 } else { | 1146 } else { |
| 1165 status = BMIWriteMemory(ar->arHifDevice, address, (A_UCHAR *)fw_entry->d
ata, fw_entry->size); | 1147 status = BMIWriteMemory(ar->arHifDevice, address, (A_UCHAR *)fw_entry->d
ata, fw_entry_size); |
| 1166 } | 1148 } |
| 1167 | 1149 |
| 1168 if (status != A_OK) { | 1150 if (status != A_OK) { |
| 1169 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__))
; | 1151 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__))
; |
| 1170 A_RELEASE_FIRMWARE(fw_entry); | 1152 A_RELEASE_FIRMWARE(fw_entry); |
| 1171 return A_ERROR; | 1153 return A_ERROR; |
| 1172 } | 1154 } |
| 1173 A_RELEASE_FIRMWARE(fw_entry); | 1155 A_RELEASE_FIRMWARE(fw_entry); |
| 1174 return A_OK; | 1156 return A_OK; |
| 1175 } | 1157 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1234 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); | 1216 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); |
| 1235 | 1217 |
| 1236 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; | 1218 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; |
| 1237 bmifn(BMIReadSOCRegister(ar->arHifDevice, address, ¶m)); | 1219 bmifn(BMIReadSOCRegister(ar->arHifDevice, address, ¶m)); |
| 1238 sleep = param; | 1220 sleep = param; |
| 1239 param |= WLAN_SYSTEM_SLEEP_DISABLE_SET(1); | 1221 param |= WLAN_SYSTEM_SLEEP_DISABLE_SET(1); |
| 1240 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); | 1222 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); |
| 1241 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("old options: %d, old sleep: %d\n", opt
ions, sleep)); | 1223 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("old options: %d, old sleep: %d\n", opt
ions, sleep)); |
| 1242 | 1224 |
| 1243 if (ar->arTargetType == TARGET_TYPE_AR6003) { | 1225 if (ar->arTargetType == TARGET_TYPE_AR6003) { |
| 1226 /* Program analog PLL register */ |
| 1227 bmifn(BMIWriteSOCRegister(ar->arHifDevice, ANALOG_INTF_BASE_ADDRESS
+ 0x284, 0xF9104001)); |
| 1244 /* Run at 80/88MHz by default */ | 1228 /* Run at 80/88MHz by default */ |
| 1245 param = CPU_CLOCK_STANDARD_SET(1); | 1229 param = CPU_CLOCK_STANDARD_SET(1); |
| 1246 } else { | 1230 } else { |
| 1247 /* Run at 40/44MHz by default */ | 1231 /* Run at 40/44MHz by default */ |
| 1248 param = CPU_CLOCK_STANDARD_SET(0); | 1232 param = CPU_CLOCK_STANDARD_SET(0); |
| 1249 } | 1233 } |
| 1250 address = RTC_BASE_ADDRESS + CPU_CLOCK_ADDRESS; | 1234 address = RTC_BASE_ADDRESS + CPU_CLOCK_ADDRESS; |
| 1251 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); | 1235 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); |
| 1252 | 1236 |
| 1253 param = 0; | 1237 param = 0; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 } | 1327 } |
| 1344 | 1328 |
| 1345 param = address; | 1329 param = address; |
| 1346 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_
dset_list_head), (A_UCHAR *)¶m, 4)); | 1330 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_
dset_list_head), (A_UCHAR *)¶m, 4)); |
| 1347 | 1331 |
| 1348 if (ar->arTargetType == TARGET_TYPE_AR6003) { | 1332 if (ar->arTargetType == TARGET_TYPE_AR6003) { |
| 1349 if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { | 1333 if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
| 1350 /* Reserve 5.5K of RAM */ | 1334 /* Reserve 5.5K of RAM */ |
| 1351 param = 5632; | 1335 param = 5632; |
| 1352 } else { /* AR6003_REV2_VERSION */ | 1336 } else { /* AR6003_REV2_VERSION */ |
| 1353 /* Reserve 6K of RAM */ | 1337 /* Reserve 6.5K of RAM */ |
| 1354 param = 6144; | 1338 param = 6656; |
| 1355 } | 1339 } |
| 1356 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_end_RAM_reserve_sz), (A_UCHAR *)¶m, 4)); | 1340 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_end_RAM_reserve_sz), (A_UCHAR *)¶m, 4)); |
| 1357 } | 1341 } |
| 1358 | 1342 |
| 1359 /* Restore system sleep */ | 1343 /* Restore system sleep */ |
| 1360 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; | 1344 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; |
| 1361 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, sleep)); | 1345 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, sleep)); |
| 1362 | 1346 |
| 1363 address = MBOX_BASE_ADDRESS + LOCAL_SCRATCH_ADDRESS; | 1347 address = MBOX_BASE_ADDRESS + LOCAL_SCRATCH_ADDRESS; |
| 1364 param = options | 0x20; | 1348 param = options | 0x20; |
| 1365 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); | 1349 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); |
| 1366 /* Get the device address for BT if enabled */ | |
| 1367 ar6000_update_bdaddr(ar); | |
| 1368 | 1350 |
| 1369 if (ar->arTargetType == TARGET_TYPE_AR6003) { | 1351 if (ar->arTargetType == TARGET_TYPE_AR6003) { |
| 1370 /* Configure GPIO AR6003 UART */ | 1352 /* Configure GPIO AR6003 UART */ |
| 1371 #ifndef CONFIG_AR600x_DEBUG_UART_TX_PIN | 1353 #ifndef CONFIG_AR600x_DEBUG_UART_TX_PIN |
| 1372 #define CONFIG_AR600x_DEBUG_UART_TX_PIN 8 | 1354 #define CONFIG_AR600x_DEBUG_UART_TX_PIN 8 |
| 1373 #endif | 1355 #endif |
| 1374 param = CONFIG_AR600x_DEBUG_UART_TX_PIN; | 1356 param = CONFIG_AR600x_DEBUG_UART_TX_PIN; |
| 1375 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_dbg_uart_txpin), (A_UCHAR *)¶m, 4)); | 1357 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_dbg_uart_txpin), (A_UCHAR *)¶m, 4)); |
| 1376 | 1358 |
| 1377 #if (CONFIG_AR600x_DEBUG_UART_TX_PIN == 23) | 1359 #if (CONFIG_AR600x_DEBUG_UART_TX_PIN == 23) |
| 1378 { | 1360 { |
| 1379 address = GPIO_BASE_ADDRESS + CLOCK_GPIO_ADDRESS; | 1361 address = GPIO_BASE_ADDRESS + CLOCK_GPIO_ADDRESS; |
| 1380 bmifn(BMIReadSOCRegister(ar->arHifDevice, address, ¶m)); | 1362 bmifn(BMIReadSOCRegister(ar->arHifDevice, address, ¶m)); |
| 1381 param |= CLOCK_GPIO_BT_CLK_OUT_EN_SET(1); | 1363 param |= CLOCK_GPIO_BT_CLK_OUT_EN_SET(1); |
| 1382 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); | 1364 bmifn(BMIWriteSOCRegister(ar->arHifDevice, address, param)); |
| 1383 } | 1365 } |
| 1384 #endif | 1366 #endif |
| 1385 | 1367 |
| 1386 /* Configure GPIO for BT Reset */ | 1368 /* Configure GPIO for BT Reset */ |
| 1387 #ifdef ATH6KL_CONFIG_GPIO_BT_RESET | 1369 #ifdef ATH6KL_CONFIG_GPIO_BT_RESET |
| 1370 #define CONFIG_AR600x_BT_RESET_PIN 0x16 |
| 1388 param = CONFIG_AR600x_BT_RESET_PIN; | 1371 param = CONFIG_AR600x_BT_RESET_PIN; |
| 1389 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_hci_uart_support_pins), (A_UCHAR *)¶m, 4)); | 1372 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar,
hi_hci_uart_support_pins), (A_UCHAR *)¶m, 4)); |
| 1390 #endif /* ATH6KL_CONFIG_GPIO_BT_RESET */ | 1373 #endif /* ATH6KL_CONFIG_GPIO_BT_RESET */ |
| 1374 |
| 1375 /* Configure UART flow control polarity */ |
| 1376 #ifndef CONFIG_ATH6KL_BT_UART_FC_POLARITY |
| 1377 #define CONFIG_ATH6KL_BT_UART_FC_POLARITY 0 |
| 1378 #endif |
| 1379 |
| 1380 #if (CONFIG_ATH6KL_BT_UART_FC_POLARITY == 1) |
| 1381 if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
| 1382 param = ((CONFIG_ATH6KL_BT_UART_FC_POLARITY << 1) & 0x2); |
| 1383 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS
(ar, hi_hci_uart_pwr_mgmt_params), (A_UCHAR *)¶m, 4)); |
| 1384 } |
| 1385 #endif /* CONFIG_ATH6KL_BT_UART_FC_POLARITY */ |
| 1391 } | 1386 } |
| 1387 |
| 1392 #ifdef HTC_RAW_INTERFACE | 1388 #ifdef HTC_RAW_INTERFACE |
| 1393 if (!eppingtest && bypasswmi) { | 1389 if (!eppingtest && bypasswmi) { |
| 1394 /* Don't run BMIDone for ART mode and force resetok=0 */ | 1390 /* Don't run BMIDone for ART mode and force resetok=0 */ |
| 1395 resetok = 0; | 1391 resetok = 0; |
| 1396 msleep(1000); | 1392 msleep(1000); |
| 1397 return A_OK; | |
| 1398 } | 1393 } |
| 1399 #endif /* HTC_RAW_INTERFACE */ | 1394 #endif /* HTC_RAW_INTERFACE */ |
| 1400 /* Tell Target to execute loaded firmware */ | 1395 |
| 1401 bmifn(BMIDone(ar->arHifDevice)); | |
| 1402 #endif /* INIT_MODE_DRV_ENABLED */ | 1396 #endif /* INIT_MODE_DRV_ENABLED */ |
| 1403 } | 1397 } |
| 1404 | 1398 |
| 1405 return A_OK; | 1399 return A_OK; |
| 1406 } | 1400 } |
| 1407 | 1401 |
| 1408 A_STATUS | 1402 A_STATUS |
| 1409 ar6000_configure_target(AR_SOFTC_T *ar) | 1403 ar6000_configure_target(AR_SOFTC_T *ar) |
| 1410 { | 1404 { |
| 1411 A_UINT32 param; | 1405 A_UINT32 param; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1483 if (BMIWriteMemory(ar->arHifDevice, | 1477 if (BMIWriteMemory(ar->arHifDevice, |
| 1484 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), | 1478 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), |
| 1485 (A_UCHAR *)¶m, | 1479 (A_UCHAR *)¶m, |
| 1486 4) != A_OK) | 1480 4) != A_OK) |
| 1487 { | 1481 { |
| 1488 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for setting fwmode fa
iled \n")); | 1482 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for setting fwmode fa
iled \n")); |
| 1489 return A_ERROR; | 1483 return A_ERROR; |
| 1490 } | 1484 } |
| 1491 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Firmware mode set\n")); | 1485 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Firmware mode set\n")); |
| 1492 } | 1486 } |
| 1493 #if 0 /* HOST_INTEREST is no longer used to configure dot11 processing rule */ | |
| 1494 if (processDot11Hdr) { | |
| 1495 A_UINT32 param; | |
| 1496 | |
| 1497 if (BMIReadMemory(ar->arHifDevice, | |
| 1498 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), | |
| 1499 (A_UCHAR *)¶m, | |
| 1500 4)!= A_OK) | |
| 1501 { | |
| 1502 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIReadMemory for processDot11Hdr fa
iled \n")); | |
| 1503 return A_ERROR; | |
| 1504 } | |
| 1505 | |
| 1506 param |= HI_OPTION_RELAY_DOT11_HDR; | |
| 1507 | |
| 1508 if (BMIWriteMemory(ar->arHifDevice, | |
| 1509 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), | |
| 1510 (A_UCHAR *)¶m, | |
| 1511 4) != A_OK) | |
| 1512 { | |
| 1513 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for processDot11Hdr f
ailed \n")); | |
| 1514 return A_ERROR; | |
| 1515 } | |
| 1516 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("processDot11Hdr enabled\n")); | |
| 1517 } | |
| 1518 #endif | |
| 1519 | 1487 |
| 1520 #ifdef ATH6KL_DISABLE_TARGET_DBGLOGS | 1488 #ifdef ATH6KL_DISABLE_TARGET_DBGLOGS |
| 1521 { | 1489 { |
| 1522 A_UINT32 param; | 1490 A_UINT32 param; |
| 1523 | 1491 |
| 1524 if (BMIReadMemory(ar->arHifDevice, | 1492 if (BMIReadMemory(ar->arHifDevice, |
| 1525 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), | 1493 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), |
| 1526 (A_UCHAR *)¶m, | 1494 (A_UCHAR *)¶m, |
| 1527 4)!= A_OK) | 1495 4)!= A_OK) |
| 1528 { | 1496 { |
| 1529 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIReadMemory for disabling debug lo
gs failed\n")); | 1497 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIReadMemory for disabling debug lo
gs failed\n")); |
| 1530 return A_ERROR; | 1498 return A_ERROR; |
| 1531 } | 1499 } |
| 1532 | 1500 |
| 1533 param |= HI_OPTION_DISABLE_DBGLOG; | 1501 param |= HI_OPTION_DISABLE_DBGLOG; |
| 1534 | 1502 |
| 1535 if (BMIWriteMemory(ar->arHifDevice, | 1503 if (BMIWriteMemory(ar->arHifDevice, |
| 1536 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), | 1504 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), |
| 1537 (A_UCHAR *)¶m, | 1505 (A_UCHAR *)¶m, |
| 1538 4) != A_OK) | 1506 4) != A_OK) |
| 1539 { | 1507 { |
| 1540 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for HI_OPTION_DISABLE
_DBGLOG\n")); | 1508 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for HI_OPTION_DISABLE
_DBGLOG\n")); |
| 1541 return A_ERROR; | 1509 return A_ERROR; |
| 1542 } | 1510 } |
| 1543 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Firmware mode set\n")); | 1511 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Firmware mode set\n")); |
| 1544 } | 1512 } |
| 1545 #endif /* ATH6KL_DISABLE_TARGET_DBGLOGS */ | 1513 #endif /* ATH6KL_DISABLE_TARGET_DBGLOGS */ |
| 1546 | 1514 |
| 1547 // No need to reserve RAM space for patch as AR6001 is flash based | 1515 /* |
| 1548 if (ar->arTargetType == TARGET_TYPE_AR6001) { | 1516 * Hardcode the address use for the extended board data |
| 1549 param = 0; | 1517 * Ideally this should be pre-allocate by the OS at boot time |
| 1518 * But since it is a new feature and board data is loaded |
| 1519 * at init time, we have to workaround this from host. |
| 1520 * It is difficult to patch the firmware boot code, |
| 1521 * but possible in theory. |
| 1522 */ |
| 1523 if (ar->arTargetType == TARGET_TYPE_AR6003) { |
| 1524 param = AR6003_BOARD_EXT_DATA_ADDRESS; |
| 1550 if (BMIWriteMemory(ar->arHifDevice, | 1525 if (BMIWriteMemory(ar->arHifDevice, |
| 1551 HOST_INTEREST_ITEM_ADDRESS(ar, hi_end_RAM_reserve_sz), | 1526 HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_ext_data), |
| 1552 (A_UCHAR *)¶m, | 1527 (A_UCHAR *)¶m, |
| 1553 4) != A_OK) | 1528 4) != A_OK) |
| 1554 { | 1529 { |
| 1555 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for hi_end_RAM_reserv
e_sz failed \n")); | 1530 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for hi_board_ext_data
failed \n")); |
| 1556 return A_ERROR; | 1531 return A_ERROR; |
| 1557 } | 1532 } |
| 1558 } | 1533 } |
| 1559 | 1534 |
| 1560 | 1535 |
| 1561 /* since BMIInit is called in the driver layer, we have to set the block | 1536 /* since BMIInit is called in the driver layer, we have to set the block |
| 1562 * size here for the target */ | 1537 * size here for the target */ |
| 1563 | 1538 |
| 1564 if (A_FAILED(ar6000_set_htc_params(ar->arHifDevice, | 1539 if (A_FAILED(ar6000_set_htc_params(ar->arHifDevice, |
| 1565 ar->arTargetType, | 1540 ar->arTargetType, |
| 1566 mbox_yield_limit, | 1541 mbox_yield_limit, |
| 1567 0 /* use default number of control buffer
s */ | 1542 0 /* use default number of control buffer
s */ |
| 1568 ))) { | 1543 ))) { |
| 1569 return A_ERROR; | 1544 return A_ERROR; |
| 1570 } | 1545 } |
| 1571 | 1546 |
| 1572 if (setupbtdev != 0) { | 1547 if (setupbtdev != 0) { |
| 1573 if (A_FAILED(ar6000_set_hci_bridge_flags(ar->arHifDevice, | 1548 if (A_FAILED(ar6000_set_hci_bridge_flags(ar->arHifDevice, |
| 1574 ar->arTargetType, | 1549 ar->arTargetType, |
| 1575 setupbtdev))) { | 1550 setupbtdev))) { |
| 1576 return A_ERROR; | 1551 return A_ERROR; |
| 1577 } | 1552 } |
| 1578 } | 1553 } |
| 1579 return A_OK; | 1554 return A_OK; |
| 1580 } | 1555 } |
| 1581 | 1556 |
| 1557 static void |
| 1558 init_netdev(struct net_device *dev, char *name) |
| 1559 { |
| 1560 dev->netdev_ops = &ar6000_netdev_ops; |
| 1561 dev->watchdog_timeo = AR6000_TX_TIMEOUT; |
| 1562 dev->wireless_handlers = &ath_iw_handler_def; |
| 1563 |
| 1564 ath_iw_handler_def.get_wireless_stats = ar6000_get_iwstats; /*Displayed via
proc fs */ |
| 1565 |
| 1566 /* |
| 1567 * We need the OS to provide us with more headroom in order to |
| 1568 * perform dix to 802.3, WMI header encap, and the HTC header |
| 1569 */ |
| 1570 if (processDot11Hdr) { |
| 1571 dev->hard_header_len = sizeof(struct ieee80211_qosframe) + sizeof(ATH_LL
C_SNAP_HDR) + sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN + WMI_MAX_TX_META_SZ + LINUX
_HACK_FUDGE_FACTOR; |
| 1572 } else { |
| 1573 dev->hard_header_len = ETH_HLEN + sizeof(ATH_LLC_SNAP_HDR) + |
| 1574 sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN + WMI_MAX_TX_META_SZ + LINUX_H
ACK_FUDGE_FACTOR; |
| 1575 } |
| 1576 |
| 1577 if (name[0]) |
| 1578 { |
| 1579 strcpy(dev->name, name); |
| 1580 } |
| 1581 |
| 1582 #ifdef SET_MODULE_OWNER |
| 1583 SET_MODULE_OWNER(dev); |
| 1584 #endif |
| 1585 |
| 1586 #ifdef CONFIG_CHECKSUM_OFFLOAD |
| 1587 if(csumOffload){ |
| 1588 dev->features |= NETIF_F_IP_CSUM; /*advertise kernel capability to do TC
P/UDP CSUM offload for IPV4*/ |
| 1589 } |
| 1590 #endif |
| 1591 |
| 1592 return; |
| 1593 } |
| 1594 |
| 1582 /* | 1595 /* |
| 1583 * HTC Event handlers | 1596 * HTC Event handlers |
| 1584 */ | 1597 */ |
| 1585 static A_STATUS | 1598 static A_STATUS |
| 1586 ar6000_avail_ev(void *context, void *hif_handle) | 1599 ar6000_avail_ev(void *context, void *hif_handle) |
| 1587 { | 1600 { |
| 1588 int i; | 1601 int i; |
| 1589 struct net_device *dev; | 1602 struct net_device *dev; |
| 1590 void *ar_netif; | 1603 void *ar_netif; |
| 1591 AR_SOFTC_T *ar; | 1604 AR_SOFTC_T *ar; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1648 ar6k_cfg80211_deinit(ar); | 1661 ar6k_cfg80211_deinit(ar); |
| 1649 return A_ERROR; | 1662 return A_ERROR; |
| 1650 } | 1663 } |
| 1651 | 1664 |
| 1652 dev->ieee80211_ptr = wdev; | 1665 dev->ieee80211_ptr = wdev; |
| 1653 SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy)); | 1666 SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy)); |
| 1654 wdev->netdev = dev; | 1667 wdev->netdev = dev; |
| 1655 ar->arNetworkType = INFRA_NETWORK; | 1668 ar->arNetworkType = INFRA_NETWORK; |
| 1656 #endif /* ATH6K_CONFIG_CFG80211 */ | 1669 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 1657 | 1670 |
| 1658 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 1671 init_netdev(dev, ifname); |
| 1659 if (ifname[0]) | |
| 1660 { | |
| 1661 strcpy(dev->name, ifname); | |
| 1662 } | |
| 1663 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */ | |
| 1664 | |
| 1665 #ifdef SET_MODULE_OWNER | |
| 1666 SET_MODULE_OWNER(dev); | |
| 1667 #endif | |
| 1668 | 1672 |
| 1669 #ifdef SET_NETDEV_DEV | 1673 #ifdef SET_NETDEV_DEV |
| 1670 if (ar_netif) { | 1674 if (ar_netif) { |
| 1671 HIF_DEVICE_OS_DEVICE_INFO osDevInfo; | 1675 HIF_DEVICE_OS_DEVICE_INFO osDevInfo; |
| 1672 A_MEMZERO(&osDevInfo, sizeof(osDevInfo)); | 1676 A_MEMZERO(&osDevInfo, sizeof(osDevInfo)); |
| 1673 if ( A_SUCCESS( HIFConfigureDevice(hif_handle, HIF_DEVICE_GET_OS_DEVICE, | 1677 if ( A_SUCCESS( HIFConfigureDevice(hif_handle, HIF_DEVICE_GET_OS_DEVICE, |
| 1674 &osDevInfo, sizeof(osDevInfo))) ) { | 1678 &osDevInfo, sizeof(osDevInfo))) ) { |
| 1675 SET_NETDEV_DEV(dev, osDevInfo.pOSDevice); | 1679 SET_NETDEV_DEV(dev, osDevInfo.pOSDevice); |
| 1676 } | 1680 } |
| 1677 } | 1681 } |
| 1678 #endif | 1682 #endif |
| 1679 | 1683 |
| 1680 ar->arNetDev = dev; | 1684 ar->arNetDev = dev; |
| 1681 ar->arHifDevice = hif_handle; | 1685 ar->arHifDevice = hif_handle; |
| 1682 ar->arWlanState = WLAN_ENABLED; | 1686 ar->arWlanState = WLAN_ENABLED; |
| 1683 ar->arDeviceIndex = device_index; | 1687 ar->arDeviceIndex = device_index; |
| 1684 | 1688 |
| 1689 ar->arWlanPowerState = WLAN_POWER_STATE_ON; |
| 1690 ar->arWlanOff = FALSE; /* We are in ON state */ |
| 1691 #ifdef CONFIG_PM |
| 1692 ar->arWowState = WLAN_WOW_STATE_NONE; |
| 1693 ar->arBTOff = TRUE; /* BT chip assumed to be OFF */ |
| 1694 ar->arBTSharing = WLAN_CONFIG_BT_SHARING; |
| 1695 ar->arWlanOffConfig = WLAN_CONFIG_WLAN_OFF; |
| 1696 ar->arSuspendConfig = WLAN_CONFIG_PM_SUSPEND; |
| 1697 ar->arWow2Config = WLAN_CONFIG_PM_WOW2; |
| 1698 #endif /* CONFIG_PM */ |
| 1699 |
| 1685 A_INIT_TIMER(&ar->arHBChallengeResp.timer, ar6000_detect_error, dev); | 1700 A_INIT_TIMER(&ar->arHBChallengeResp.timer, ar6000_detect_error, dev); |
| 1686 ar->arHBChallengeResp.seqNum = 0; | 1701 ar->arHBChallengeResp.seqNum = 0; |
| 1687 ar->arHBChallengeResp.outstanding = FALSE; | 1702 ar->arHBChallengeResp.outstanding = FALSE; |
| 1688 ar->arHBChallengeResp.missCnt = 0; | 1703 ar->arHBChallengeResp.missCnt = 0; |
| 1689 ar->arHBChallengeResp.frequency = AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT; | 1704 ar->arHBChallengeResp.frequency = AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT; |
| 1690 ar->arHBChallengeResp.missThres = AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAUL
T; | 1705 ar->arHBChallengeResp.missThres = AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAUL
T; |
| 1691 | 1706 |
| 1692 ar6000_init_control_info(ar); | 1707 ar6000_init_control_info(ar); |
| 1693 init_waitqueue_head(&arEvent); | 1708 init_waitqueue_head(&arEvent); |
| 1694 sema_init(&ar->arSem, 1); | 1709 sema_init(&ar->arSem, 1); |
| 1695 ar->bIsDestroyProgress = FALSE; | 1710 ar->bIsDestroyProgress = FALSE; |
| 1696 | 1711 |
| 1697 INIT_HTC_PACKET_QUEUE(&ar->amsdu_rx_buffer_queue); | 1712 INIT_HTC_PACKET_QUEUE(&ar->amsdu_rx_buffer_queue); |
| 1698 | 1713 |
| 1699 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL | 1714 #ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL |
| 1700 A_INIT_TIMER(&aptcTimer, aptcTimerHandler, ar); | 1715 A_INIT_TIMER(&aptcTimer, aptcTimerHandler, ar); |
| 1701 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ | 1716 #endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */ |
| 1702 | 1717 |
| 1703 A_INIT_TIMER(&ar->disconnect_timer, disconnect_timer_handler, dev); | 1718 A_INIT_TIMER(&ar->disconnect_timer, disconnect_timer_handler, dev); |
| 1704 | 1719 |
| 1705 /* | |
| 1706 * If requested, perform some magic which requires no cooperation from | |
| 1707 * the Target. It causes the Target to ignore flash and execute to the | |
| 1708 * OS from ROM. | |
| 1709 * | |
| 1710 * This is intended to support recovery from a corrupted flash on Targets | |
| 1711 * that support flash. | |
| 1712 */ | |
| 1713 if (skipflash) | |
| 1714 { | |
| 1715 //ar6000_reset_device_skipflash(ar->arHifDevice); | |
| 1716 } | |
| 1717 | |
| 1718 BMIInit(); | 1720 BMIInit(); |
| 1719 | 1721 |
| 1720 if (bmienable) { | 1722 if (bmienable) { |
| 1721 ar6000_sysfs_bmi_init(ar); | 1723 ar6000_sysfs_bmi_init(ar); |
| 1722 } | 1724 } |
| 1723 | 1725 |
| 1724 { | 1726 { |
| 1725 struct bmi_target_info targ_info; | 1727 struct bmi_target_info targ_info; |
| 1726 | 1728 |
| 1727 if (BMIGetTargetInfo(ar->arHifDevice, &targ_info) != A_OK) { | 1729 if (BMIGetTargetInfo(ar->arHifDevice, &targ_info) != A_OK) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1757 init_status = A_ERROR; | 1759 init_status = A_ERROR; |
| 1758 goto avail_ev_failed; | 1760 goto avail_ev_failed; |
| 1759 } | 1761 } |
| 1760 | 1762 |
| 1761 spin_lock_init(&ar->arLock); | 1763 spin_lock_init(&ar->arLock); |
| 1762 | 1764 |
| 1763 #ifdef WAPI_ENABLE | 1765 #ifdef WAPI_ENABLE |
| 1764 ar->arWapiEnable = 0; | 1766 ar->arWapiEnable = 0; |
| 1765 #endif | 1767 #endif |
| 1766 | 1768 |
| 1767 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
| 1768 dev->open = &ar6000_open; | |
| 1769 dev->stop = &ar6000_close; | |
| 1770 dev->hard_start_xmit = &ar6000_data_tx; | |
| 1771 dev->get_stats = &ar6000_get_stats; | |
| 1772 | 1769 |
| 1773 /* dev->tx_timeout = ar6000_tx_timeout; */ | |
| 1774 dev->do_ioctl = &ar6000_ioctl; | |
| 1775 dev->set_multicast_list = &ar6000_set_multicast_list; | |
| 1776 #else | |
| 1777 dev->netdev_ops = &ar6000_netdev_ops; | |
| 1778 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */ | |
| 1779 dev->watchdog_timeo = AR6000_TX_TIMEOUT; | |
| 1780 dev->wireless_handlers = &ath_iw_handler_def; | |
| 1781 | |
| 1782 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) | |
| 1783 dev->get_wireless_stats = ar6000_get_iwstats; /*Displayed via proc fs */ | |
| 1784 #else | |
| 1785 ath_iw_handler_def.get_wireless_stats = ar6000_get_iwstats; /*Displayed via
proc fs */ | |
| 1786 #endif | |
| 1787 #ifdef CONFIG_CHECKSUM_OFFLOAD | 1770 #ifdef CONFIG_CHECKSUM_OFFLOAD |
| 1788 if(csumOffload){ | 1771 if(csumOffload){ |
| 1789 | 1772 /*if external frame work is also needed, change and use an extended rxMe
taVerion*/ |
| 1790 dev->features |= NETIF_F_IP_CSUM;/*advertise kernel capability | 1773 ar->rxMetaVersion=WMI_META_VERSION_2; |
| 1791 to do TCP/UDP CSUM offload for IPV4
*/ | |
| 1792 ar->rxMetaVersion=WMI_META_VERSION_2;/*if external frame work is also ne
eded, change and use an extended rxMetaVerion*/ | |
| 1793 } | 1774 } |
| 1794 #endif | 1775 #endif |
| 1795 if (processDot11Hdr) { | |
| 1796 dev->hard_header_len = sizeof(struct ieee80211_qosframe) + sizeof(ATH_LL
C_SNAP_HDR) + sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN + WMI_MAX_TX_META_SZ + LINUX
_HACK_FUDGE_FACTOR; | |
| 1797 } else { | |
| 1798 /* | |
| 1799 * We need the OS to provide us with more headroom in order to | |
| 1800 * perform dix to 802.3, WMI header encap, and the HTC header | |
| 1801 */ | |
| 1802 dev->hard_header_len = ETH_HLEN + sizeof(ATH_LLC_SNAP_HDR) + | |
| 1803 sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN + WMI_MAX_TX_META_SZ + LINUX_H
ACK_FUDGE_FACTOR; | |
| 1804 } | |
| 1805 | 1776 |
| 1806 #ifdef ATH_AR6K_11N_SUPPORT | 1777 #ifdef ATH_AR6K_11N_SUPPORT |
| 1807 if((ar->aggr_cntxt = aggr_init(ar6000_alloc_netbufs)) == NULL) { | 1778 if((ar->aggr_cntxt = aggr_init(ar6000_alloc_netbufs)) == NULL) { |
| 1808 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Failed to initialize aggr.\n",
__func__)); | 1779 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Failed to initialize aggr.\n",
__func__)); |
| 1809 init_status = A_ERROR; | 1780 init_status = A_ERROR; |
| 1810 goto avail_ev_failed; | 1781 goto avail_ev_failed; |
| 1811 } | 1782 } |
| 1812 | 1783 |
| 1813 aggr_register_rx_dispatcher(ar->aggr_cntxt, (void *)dev, ar6000_deliver_fram
es_to_nw_stack); | 1784 aggr_register_rx_dispatcher(ar->aggr_cntxt, (void *)dev, ar6000_deliver_fram
es_to_nw_stack); |
| 1814 #endif | 1785 #endif |
| 1815 | 1786 |
| 1816 HIFClaimDevice(ar->arHifDevice, ar); | 1787 HIFClaimDevice(ar->arHifDevice, ar); |
| 1817 | 1788 |
| 1818 /* We only register the device in the global list if we succeed. */ | 1789 /* We only register the device in the global list if we succeed. */ |
| 1819 /* If the device is in the global list, it will be destroyed */ | 1790 /* If the device is in the global list, it will be destroyed */ |
| 1820 /* when the module is unloaded. */ | 1791 /* when the module is unloaded. */ |
| 1821 ar6000_devices[device_index] = dev; | 1792 ar6000_devices[device_index] = dev; |
| 1822 | 1793 |
| 1823 /* Don't install the init function if BMI is requested */ | 1794 /* Don't install the init function if BMI is requested */ |
| 1824 if (!bmienable) { | 1795 if (!bmienable) { |
| 1825 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
| 1826 dev->init = ar6000_init; | |
| 1827 #else | |
| 1828 ar6000_netdev_ops.ndo_init = ar6000_init; | 1796 ar6000_netdev_ops.ndo_init = ar6000_init; |
| 1829 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */ | |
| 1830 } else { | 1797 } else { |
| 1831 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("BMI enabled: %d\n", wlaninitmode)); | 1798 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("BMI enabled: %d\n", wlaninitmode)); |
| 1832 if ((wlaninitmode == WLAN_INIT_MODE_UDEV) || | 1799 if ((wlaninitmode == WLAN_INIT_MODE_UDEV) || |
| 1833 (wlaninitmode == WLAN_INIT_MODE_DRV)) | 1800 (wlaninitmode == WLAN_INIT_MODE_DRV)) |
| 1834 { | 1801 { |
| 1835 A_STATUS status = A_OK; | 1802 A_STATUS status = A_OK; |
| 1836 do { | 1803 do { |
| 1837 if ((status = ar6000_sysfs_bmi_get_config(ar, wlaninitmode)) !=
A_OK) | 1804 if ((status = ar6000_sysfs_bmi_get_config(ar, wlaninitmode)) !=
A_OK) |
| 1838 { | 1805 { |
| 1839 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: ar6000_sysfs_b
mi_get_config failed\n")); | 1806 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: ar6000_sysfs_b
mi_get_config failed\n")); |
| 1840 break; | 1807 break; |
| 1841 } | 1808 } |
| 1842 #ifdef HTC_RAW_INTERFACE | 1809 #ifdef HTC_RAW_INTERFACE |
| 1843 if (bypasswmi) { | 1810 break; /* Don't call ar6000_init for ART */ |
| 1844 A_UINT32 param = 1; | |
| 1845 status = BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_
ADDRESS(ar, hi_board_data_initialized), | |
| 1846 (A_UCHAR *)¶m, 4); | |
| 1847 break; | |
| 1848 } | |
| 1849 #endif | 1811 #endif |
| 1850 rtnl_lock(); | 1812 rtnl_lock(); |
| 1851 status = (ar6000_init(dev)==0) ? A_OK : A_ERROR; | 1813 status = (ar6000_init(dev)==0) ? A_OK : A_ERROR; |
| 1852 rtnl_unlock(); | 1814 rtnl_unlock(); |
| 1853 if (status != A_OK) { | 1815 if (status != A_OK) { |
| 1854 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: ar6000_init\n"
)); | 1816 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: ar6000_init\n"
)); |
| 1855 } | 1817 } |
| 1856 } while (FALSE); | 1818 } while (FALSE); |
| 1857 | 1819 |
| 1858 if (status != A_OK) { | 1820 if (status != A_OK) { |
| 1859 init_status = status; | 1821 init_status = status; |
| 1860 goto avail_ev_failed; | 1822 goto avail_ev_failed; |
| 1861 } | 1823 } |
| 1862 } | 1824 } |
| 1863 } | 1825 } |
| 1864 | 1826 |
| 1865 /* This runs the init function if registered */ | 1827 /* This runs the init function if registered */ |
| 1866 if (register_netdev(dev)) { | 1828 if (register_netdev(dev)) { |
| 1867 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: register_netdev failed\n")
); | 1829 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: register_netdev failed\n")
); |
| 1868 ar6000_destroy(dev, 0); | 1830 ar6000_destroy(dev, 0); |
| 1869 return A_ERROR; | 1831 return A_ERROR; |
| 1870 } | 1832 } |
| 1871 | 1833 |
| 1872 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("ar6000_avail: name=%s hifdevice=0x%x, dev=0
x%x (%d), ar=0x%x\n", | 1834 » is_netdev_registered = 1; |
| 1873 dev->name, (A_UINT32)ar->arHifDevice, (A_UINT32)dev, device_
index, | 1835 |
| 1874 (A_UINT32)ar)); | 1836 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT |
| 1837 arApNetDev = NULL; |
| 1838 #endif /* CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT */ |
| 1839 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("ar6000_avail: name=%s hifdevice=0x%lx, dev=
0x%lx (%d), ar=0x%lx\n", |
| 1840 dev->name, (unsigned long)ar->arHifDevice, (unsigned long)de
v, device_index, |
| 1841 (unsigned long)ar)); |
| 1875 | 1842 |
| 1876 avail_ev_failed : | 1843 avail_ev_failed : |
| 1877 if (A_FAILED(init_status)) { | 1844 if (A_FAILED(init_status)) { |
| 1878 if (bmienable) { | 1845 if (bmienable) { |
| 1879 ar6000_sysfs_bmi_deinit(ar); | 1846 ar6000_sysfs_bmi_deinit(ar); |
| 1880 } | 1847 } |
| 1881 } | 1848 } |
| 1882 | 1849 |
| 1883 return init_status; | 1850 return init_status; |
| 1884 } | 1851 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 { | 1890 { |
| 1924 AR_SOFTC_T *ar = (AR_SOFTC_T *)context; | 1891 AR_SOFTC_T *ar = (AR_SOFTC_T *)context; |
| 1925 /* NULL out it's entry in the global list */ | 1892 /* NULL out it's entry in the global list */ |
| 1926 ar6000_devices[ar->arDeviceIndex] = NULL; | 1893 ar6000_devices[ar->arDeviceIndex] = NULL; |
| 1927 ar6000_destroy(ar->arNetDev, 1); | 1894 ar6000_destroy(ar->arNetDev, 1); |
| 1928 | 1895 |
| 1929 return A_OK; | 1896 return A_OK; |
| 1930 } | 1897 } |
| 1931 | 1898 |
| 1932 void | 1899 void |
| 1933 ar6000_stop_endpoint(struct net_device *dev, A_BOOL keepprofile) | 1900 ar6000_restart_endpoint(struct net_device *dev) |
| 1901 { |
| 1902 A_STATUS status = A_OK; |
| 1903 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 1904 |
| 1905 BMIInit(); |
| 1906 do { |
| 1907 if ( (status=ar6000_configure_target(ar))!=A_OK) |
| 1908 break; |
| 1909 if ( (status=ar6000_sysfs_bmi_get_config(ar, wlaninitmode)) != A_OK) |
| 1910 { |
| 1911 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_avail: ar6000_sysfs_bmi_get_c
onfig failed\n")); |
| 1912 break; |
| 1913 } |
| 1914 rtnl_lock(); |
| 1915 status = (ar6000_init(dev)==0) ? A_OK : A_ERROR; |
| 1916 rtnl_unlock(); |
| 1917 |
| 1918 if (status!=A_OK) { |
| 1919 break; |
| 1920 } |
| 1921 if (ar->arSsidLen && ar->arWlanState == WLAN_ENABLED) { |
| 1922 ar6000_connect_to_ap(ar); |
| 1923 } |
| 1924 } while (0); |
| 1925 |
| 1926 if (status==A_OK) { |
| 1927 return; |
| 1928 } |
| 1929 |
| 1930 ar6000_devices[ar->arDeviceIndex] = NULL; |
| 1931 ar6000_destroy(ar->arNetDev, 1); |
| 1932 } |
| 1933 |
| 1934 void |
| 1935 ar6000_stop_endpoint(struct net_device *dev, A_BOOL keepprofile, A_BOOL getdbglo
gs) |
| 1934 { | 1936 { |
| 1935 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 1937 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 1936 | 1938 |
| 1937 /* Stop the transmit queues */ | 1939 /* Stop the transmit queues */ |
| 1938 netif_stop_queue(dev); | 1940 netif_stop_queue(dev); |
| 1939 | 1941 |
| 1940 /* Disable the target and the interrupts associated with it */ | 1942 /* Disable the target and the interrupts associated with it */ |
| 1941 if (ar->arWmiReady == TRUE) | 1943 if (ar->arWmiReady == TRUE) |
| 1942 { | 1944 { |
| 1943 if (!bypasswmi) | 1945 if (!bypasswmi) |
| 1944 { | 1946 { |
| 1945 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) | 1947 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) |
| 1946 { | 1948 { |
| 1947 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): Disconnect\n", __func__))
; | 1949 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): Disconnect\n", __func__))
; |
| 1948 #ifdef ANDROID_ENV | 1950 if (!keepprofile) { |
| 1949 if (keepprofile) { | |
| 1950 wmi_disconnect_cmd(ar->arWmi); | |
| 1951 } else | |
| 1952 #endif /* ANDROID_ENV */ | |
| 1953 { | |
| 1954 AR6000_SPIN_LOCK(&ar->arLock, 0); | 1951 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| 1955 ar6000_init_profile_info(ar); | 1952 ar6000_init_profile_info(ar); |
| 1956 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 1953 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 1957 wmi_disconnect_cmd(ar->arWmi); | |
| 1958 } | 1954 } |
| 1955 wmi_disconnect_cmd(ar->arWmi); |
| 1959 } | 1956 } |
| 1957 |
| 1960 A_UNTIMEOUT(&ar->disconnect_timer); | 1958 A_UNTIMEOUT(&ar->disconnect_timer); |
| 1959 |
| 1960 if (getdbglogs) { |
| 1961 ar6000_dbglog_get_debug_logs(ar); |
| 1962 } |
| 1963 |
| 1961 ar->arWmiReady = FALSE; | 1964 ar->arWmiReady = FALSE; |
| 1962 ar->arConnected = FALSE; | |
| 1963 ar->arConnectPending = FALSE; | |
| 1964 wmi_shutdown(ar->arWmi); | 1965 wmi_shutdown(ar->arWmi); |
| 1965 ar->arWmiEnabled = FALSE; | 1966 ar->arWmiEnabled = FALSE; |
| 1966 ar->arWmi = NULL; | 1967 ar->arWmi = NULL; |
| 1967 #ifdef ANDROID_ENV | 1968 /* |
| 1968 if (!keepprofile) { | 1969 * After wmi_shudown all WMI events will be dropped. |
| 1969 ar->arWlanState = WLAN_ENABLED; | 1970 * We need to cleanup the buffers allocated in AP mode |
| 1971 * and give disconnect notification to stack, which usually |
| 1972 * happens in the disconnect_event. |
| 1973 * Simulate the disconnect_event by calling the function directly. |
| 1974 * Sometimes disconnect_event will be received when the debug logs |
| 1975 * are collected. |
| 1976 */ |
| 1977 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) { |
| 1978 if(ar->arNetworkType & AP_NETWORK) { |
| 1979 ar6000_disconnect_event(ar, DISCONNECT_CMD, bcast_mac, 0, NU
LL, 0); |
| 1980 } else { |
| 1981 ar6000_disconnect_event(ar, DISCONNECT_CMD, ar->arBssid, 0,
NULL, 0); |
| 1982 } |
| 1983 ar->arConnected = FALSE; |
| 1984 ar->arConnectPending = FALSE; |
| 1970 } | 1985 } |
| 1971 #else | |
| 1972 ar->arWlanState = WLAN_ENABLED; | |
| 1973 #endif /* ANDROID_ENV */ | |
| 1974 #ifdef USER_KEYS | 1986 #ifdef USER_KEYS |
| 1975 ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT; | 1987 ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT; |
| 1976 ar->user_key_ctrl = 0; | 1988 ar->user_key_ctrl = 0; |
| 1977 #endif | 1989 #endif |
| 1978 } | 1990 } |
| 1979 | 1991 |
| 1980 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): WMI stopped\n", __func__)); | 1992 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): WMI stopped\n", __func__)); |
| 1981 } | 1993 } |
| 1982 else | 1994 else |
| 1983 { | 1995 { |
| 1984 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): WMI not ready 0x%08x 0x%08x\n", | 1996 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): WMI not ready 0x%lx 0x%lx\n", |
| 1985 __func__, (unsigned int) ar, (unsigned int) ar->arWmi)); | 1997 __func__, (unsigned long) ar, (unsigned long) ar->arWmi)); |
| 1986 | 1998 |
| 1987 /* Shut down WMI if we have started it */ | 1999 /* Shut down WMI if we have started it */ |
| 1988 if(ar->arWmiEnabled == TRUE) | 2000 if(ar->arWmiEnabled == TRUE) |
| 1989 { | 2001 { |
| 1990 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): Shut down WMI\n", __func__)); | 2002 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("%s(): Shut down WMI\n", __func__)); |
| 1991 wmi_shutdown(ar->arWmi); | 2003 wmi_shutdown(ar->arWmi); |
| 1992 ar->arWmiEnabled = FALSE; | 2004 ar->arWmiEnabled = FALSE; |
| 1993 ar->arWmi = NULL; | 2005 ar->arWmi = NULL; |
| 1994 } | 2006 } |
| 1995 } | 2007 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2006 A_STATUS status; | 2018 A_STATUS status; |
| 2007 | 2019 |
| 2008 A_MEMZERO(&ar3kconfig,sizeof(ar3kconfig)); | 2020 A_MEMZERO(&ar3kconfig,sizeof(ar3kconfig)); |
| 2009 ar6000_set_default_ar3kconfig(ar, (void *)&ar3kconfig); | 2021 ar6000_set_default_ar3kconfig(ar, (void *)&ar3kconfig); |
| 2010 status = ar->exitCallback(&ar3kconfig); | 2022 status = ar->exitCallback(&ar3kconfig); |
| 2011 if (A_OK != status) { | 2023 if (A_OK != status) { |
| 2012 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to reset AR3K baud rate!
\n")); | 2024 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to reset AR3K baud rate!
\n")); |
| 2013 } | 2025 } |
| 2014 } | 2026 } |
| 2015 // END workaround | 2027 // END workaround |
| 2016 ar6000_cleanup_hci(ar); | 2028 if (setuphci) |
| 2029 » ar6000_cleanup_hci(ar); |
| 2030 #endif |
| 2031 #ifdef EXPORT_HCI_PAL_INTERFACE |
| 2032 if (setuphcipal && (NULL != ar6kHciPalCallbacks_g.cleanupTransport)) { |
| 2033 ar6kHciPalCallbacks_g.cleanupTransport(ar); |
| 2034 } |
| 2035 #else |
| 2036 » » » » /* cleanup hci pal driver data structures */ |
| 2037 if(setuphcipal) |
| 2038 ar6k_cleanup_hci_pal(ar); |
| 2017 #endif | 2039 #endif |
| 2018 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Shutting down HTC .... \n")); | 2040 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Shutting down HTC .... \n")); |
| 2019 /* stop HTC */ | 2041 /* stop HTC */ |
| 2020 HTCStop(ar->arHtcTarget); | 2042 HTCStop(ar->arHtcTarget); |
| 2021 } | 2043 } |
| 2022 | 2044 |
| 2023 if (resetok) { | 2045 if (resetok) { |
| 2024 /* try to reset the device if we can | 2046 /* try to reset the device if we can |
| 2025 * The driver may have been configure NOT to reset the target during | 2047 * The driver may have been configure NOT to reset the target during |
| 2026 * a debug session */ | 2048 * a debug session */ |
| 2027 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Attempting to reset target on instance
destroy.... \n")); | 2049 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Attempting to reset target on instance
destroy.... \n")); |
| 2028 if (ar->arHifDevice != NULL) { | 2050 if (ar->arHifDevice != NULL) { |
| 2029 A_BOOL coldReset = FALSE; | 2051 A_BOOL coldReset = (ar->arTargetType == TARGET_TYPE_AR6003) ? TRUE:
FALSE; |
| 2030 #ifdef CONFIG_MMC_SDHCI_S3C | |
| 2031 coldReset = TRUE; | |
| 2032 #endif | |
| 2033 ar6000_reset_device(ar->arHifDevice, ar->arTargetType, TRUE, coldRes
et); | 2052 ar6000_reset_device(ar->arHifDevice, ar->arTargetType, TRUE, coldRes
et); |
| 2034 } | 2053 } |
| 2035 } else { | 2054 } else { |
| 2036 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Host does not want target reset. \n"))
; | 2055 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,(" Host does not want target reset. \n"))
; |
| 2037 } | 2056 } |
| 2038 /* Done with cookies */ | 2057 /* Done with cookies */ |
| 2039 ar6000_cookie_cleanup(ar); | 2058 ar6000_cookie_cleanup(ar); |
| 2040 } | 2059 } |
| 2041 /* | 2060 /* |
| 2042 * We need to differentiate between the surprise and planned removal of the | 2061 * We need to differentiate between the surprise and planned removal of the |
| 2043 * device because of the following consideration: | 2062 * device because of the following consideration: |
| 2044 * - In case of surprise removal, the hcd already frees up the pending | 2063 * - In case of surprise removal, the hcd already frees up the pending |
| 2045 * for the device and hence there is no need to unregister the function | 2064 * for the device and hence there is no need to unregister the function |
| 2046 * driver inorder to get these requests. For planned removal, the function | 2065 * driver inorder to get these requests. For planned removal, the function |
| 2047 * driver has to explictly unregister itself to have the hcd return all the | 2066 * driver has to explictly unregister itself to have the hcd return all the |
| 2048 * pending requests before the data structures for the devices are freed up. | 2067 * pending requests before the data structures for the devices are freed up. |
| 2049 * Note that as per the current implementation, the function driver will | 2068 * Note that as per the current implementation, the function driver will |
| 2050 * end up releasing all the devices since there is no API to selectively | 2069 * end up releasing all the devices since there is no API to selectively |
| 2051 * release a particular device. | 2070 * release a particular device. |
| 2052 * - Certain commands issued to the target can be skipped for surprise | 2071 * - Certain commands issued to the target can be skipped for surprise |
| 2053 * removal since they will anyway not go through. | 2072 * removal since they will anyway not go through. |
| 2054 */ | 2073 */ |
| 2055 void | 2074 void |
| 2056 ar6000_destroy(struct net_device *dev, unsigned int unregister) | 2075 ar6000_destroy(struct net_device *dev, unsigned int unregister) |
| 2057 { | 2076 { |
| 2058 AR_SOFTC_T *ar; | 2077 AR_SOFTC_T *ar; |
| 2059 | 2078 |
| 2060 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("+ar6000_destroy \n")); | 2079 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("+ar6000_destroy \n")); |
| 2061 | 2080 |
| 2062 if((dev == NULL) || ((ar = ar6k_priv(dev)) == NULL)) | 2081 if((dev == NULL) || ((ar = ar6k_priv(dev)) == NULL)) |
| 2063 { | 2082 { |
| 2064 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s(): Failed to get device structure.\n"
, __func__)); | 2083 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s(): Failed to get device structure.\n"
, __func__)); |
| 2065 return; | 2084 return; |
| 2066 } | 2085 } |
| 2067 | 2086 |
| 2068 ar->bIsDestroyProgress = TRUE; | 2087 ar->bIsDestroyProgress = TRUE; |
| 2069 | 2088 |
| 2070 if (down_interruptible(&ar->arSem)) { | 2089 if (down_interruptible(&ar->arSem)) { |
| 2071 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s(): down_interruptible failed \n", __f
unc__)); | 2090 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s(): down_interruptible failed \n", __f
unc__)); |
| 2072 return; | 2091 return; |
| 2073 } | 2092 } |
| 2074 if (ar->arWmiReady && !bypasswmi) { | 2093 |
| 2075 ar6000_dbglog_get_debug_logs(ar); | 2094 if (ar->arWlanPowerState != WLAN_POWER_STATE_CUT_PWR) { |
| 2095 /* only stop endpoint if we are not stop it in suspend_ev */ |
| 2096 ar6000_stop_endpoint(dev, FALSE, TRUE); |
| 2097 } else { |
| 2098 /* clear up the platform power state before rmmod */ |
| 2099 plat_setup_power(1,0); |
| 2076 } | 2100 } |
| 2077 #ifdef ANDROID_ENV | 2101 |
| 2078 if (!android_ar6k_endpoint_is_stop(ar)) { | 2102 ar->arWlanState = WLAN_DISABLED; |
| 2079 #else | |
| 2080 if (1) { | |
| 2081 #endif | |
| 2082 /* only stop endpoint if we are not stop it in suspend_ev */ | |
| 2083 ar6000_stop_endpoint(dev, FALSE); | |
| 2084 } | |
| 2085 if (ar->arHtcTarget != NULL) { | 2103 if (ar->arHtcTarget != NULL) { |
| 2086 /* destroy HTC */ | 2104 /* destroy HTC */ |
| 2087 HTCDestroy(ar->arHtcTarget); | 2105 HTCDestroy(ar->arHtcTarget); |
| 2088 } | 2106 } |
| 2089 if (ar->arHifDevice != NULL) { | 2107 if (ar->arHifDevice != NULL) { |
| 2090 /*release the device so we do not get called back on remove incase we | 2108 /*release the device so we do not get called back on remove incase we |
| 2091 * we're explicity destroyed by module unload */ | 2109 * we're explicity destroyed by module unload */ |
| 2092 HIFReleaseDevice(ar->arHifDevice); | 2110 HIFReleaseDevice(ar->arHifDevice); |
| 2093 HIFShutDownDevice(ar->arHifDevice); | 2111 HIFShutDownDevice(ar->arHifDevice); |
| 2094 } | 2112 } |
| 2095 #ifdef ATH_AR6K_11N_SUPPORT | 2113 #ifdef ATH_AR6K_11N_SUPPORT |
| 2096 aggr_module_destroy(ar->aggr_cntxt); | 2114 aggr_module_destroy(ar->aggr_cntxt); |
| 2097 #endif | 2115 #endif |
| 2098 | 2116 |
| 2099 /* Done with cookies */ | 2117 /* Done with cookies */ |
| 2100 ar6000_cookie_cleanup(ar); | 2118 ar6000_cookie_cleanup(ar); |
| 2101 | 2119 |
| 2102 /* cleanup any allocated AMSDU buffers */ | 2120 /* cleanup any allocated AMSDU buffers */ |
| 2103 ar6000_cleanup_amsdu_rxbufs(ar); | 2121 ar6000_cleanup_amsdu_rxbufs(ar); |
| 2104 | 2122 |
| 2105 if (bmienable) { | 2123 if (bmienable) { |
| 2106 ar6000_sysfs_bmi_deinit(ar); | 2124 ar6000_sysfs_bmi_deinit(ar); |
| 2107 } | 2125 } |
| 2108 | 2126 |
| 2109 /* Cleanup BMI */ | 2127 /* Cleanup BMI */ |
| 2110 BMIInit(); | 2128 BMICleanup(); |
| 2111 | 2129 |
| 2112 /* Clear the tx counters */ | 2130 /* Clear the tx counters */ |
| 2113 memset(tx_attempt, 0, sizeof(tx_attempt)); | 2131 memset(tx_attempt, 0, sizeof(tx_attempt)); |
| 2114 memset(tx_post, 0, sizeof(tx_post)); | 2132 memset(tx_post, 0, sizeof(tx_post)); |
| 2115 memset(tx_complete, 0, sizeof(tx_complete)); | 2133 memset(tx_complete, 0, sizeof(tx_complete)); |
| 2116 | 2134 |
| 2117 #ifdef HTC_RAW_INTERFACE | 2135 #ifdef HTC_RAW_INTERFACE |
| 2118 if (ar->arRawHtc) { | 2136 if (ar->arRawHtc) { |
| 2119 A_FREE(ar->arRawHtc); | 2137 A_FREE(ar->arRawHtc); |
| 2120 ar->arRawHtc = NULL; | 2138 ar->arRawHtc = NULL; |
| 2121 } | 2139 } |
| 2122 #endif | 2140 #endif |
| 2123 /* Free up the device data structure */ | 2141 /* Free up the device data structure */ |
| 2124 if( unregister ) | 2142 if (unregister && is_netdev_registered) {» » |
| 2125 unregister_netdev(dev); | 2143 unregister_netdev(dev); |
| 2144 is_netdev_registered = 0; |
| 2145 } |
| 2126 #ifndef free_netdev | 2146 #ifndef free_netdev |
| 2127 kfree(dev); | 2147 kfree(dev); |
| 2128 #else | 2148 #else |
| 2129 free_netdev(dev); | 2149 free_netdev(dev); |
| 2130 #endif | 2150 #endif |
| 2131 | 2151 |
| 2132 #ifdef ATH6K_CONFIG_CFG80211 | 2152 #ifdef ATH6K_CONFIG_CFG80211 |
| 2133 ar6k_cfg80211_deinit(ar); | 2153 ar6k_cfg80211_deinit(ar); |
| 2134 #endif /* ATH6K_CONFIG_CFG80211 */ | 2154 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 2135 | 2155 |
| 2156 #ifdef CONFIG_AP_VIRTUL_ADAPTER_SUPPORT |
| 2157 ar6000_remove_ap_interface(); |
| 2158 #endif /*CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT */ |
| 2159 |
| 2136 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("-ar6000_destroy \n")); | 2160 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("-ar6000_destroy \n")); |
| 2137 } | 2161 } |
| 2138 | 2162 |
| 2139 static void disconnect_timer_handler(unsigned long ptr) | 2163 static void disconnect_timer_handler(unsigned long ptr) |
| 2140 { | 2164 { |
| 2141 struct net_device *dev = (struct net_device *)ptr; | 2165 struct net_device *dev = (struct net_device *)ptr; |
| 2142 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 2166 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 2143 | 2167 |
| 2144 A_UNTIMEOUT(&ar->disconnect_timer); | 2168 A_UNTIMEOUT(&ar->disconnect_timer); |
| 2145 | 2169 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2269 } | 2293 } |
| 2270 | 2294 |
| 2271 static int | 2295 static int |
| 2272 ar6000_open(struct net_device *dev) | 2296 ar6000_open(struct net_device *dev) |
| 2273 { | 2297 { |
| 2274 unsigned long flags; | 2298 unsigned long flags; |
| 2275 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 2299 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 2276 | 2300 |
| 2277 spin_lock_irqsave(&ar->arLock, flags); | 2301 spin_lock_irqsave(&ar->arLock, flags); |
| 2278 | 2302 |
| 2279 #ifndef ANDROID_ENV | 2303 #ifdef ATH6K_CONFIG_CFG80211 |
| 2280 if(ar->arWlanState == WLAN_DISABLED) { | 2304 if(ar->arWlanState == WLAN_DISABLED) { |
| 2281 ar->arWlanState = WLAN_ENABLED; | 2305 ar->arWlanState = WLAN_ENABLED; |
| 2282 } | 2306 } |
| 2283 #endif | 2307 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 2284 | 2308 |
| 2285 if( ar->arConnected || bypasswmi) { | 2309 if( ar->arConnected || bypasswmi) { |
| 2286 netif_carrier_on(dev); | 2310 netif_carrier_on(dev); |
| 2287 /* Wake up the queues */ | 2311 /* Wake up the queues */ |
| 2288 netif_wake_queue(dev); | 2312 netif_wake_queue(dev); |
| 2289 } | 2313 } |
| 2290 else | 2314 else |
| 2291 netif_carrier_off(dev); | 2315 netif_carrier_off(dev); |
| 2292 | 2316 |
| 2293 spin_unlock_irqrestore(&ar->arLock, flags); | 2317 spin_unlock_irqrestore(&ar->arLock, flags); |
| 2294 return 0; | 2318 return 0; |
| 2295 } | 2319 } |
| 2296 | 2320 |
| 2297 static int | 2321 static int |
| 2298 ar6000_close(struct net_device *dev) | 2322 ar6000_close(struct net_device *dev) |
| 2299 { | 2323 { |
| 2324 #ifdef ATH6K_CONFIG_CFG80211 |
| 2300 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 2325 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 2326 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 2301 netif_stop_queue(dev); | 2327 netif_stop_queue(dev); |
| 2302 | 2328 |
| 2303 #ifdef ANDROID_ENV | 2329 #ifdef ATH6K_CONFIG_CFG80211 |
| 2304 (void)ar; /* do nothing. Android SDK will handle it */ | |
| 2305 #else | |
| 2306 AR6000_SPIN_LOCK(&ar->arLock, 0); | 2330 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| 2307 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) { | 2331 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) { |
| 2308 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 2332 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 2309 wmi_disconnect_cmd(ar->arWmi); | 2333 wmi_disconnect_cmd(ar->arWmi); |
| 2310 } else { | 2334 } else { |
| 2311 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 2335 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 2312 } | 2336 } |
| 2313 | 2337 |
| 2314 if(ar->arWmiReady == TRUE) { | 2338 if(ar->arWmiReady == TRUE) { |
| 2315 if (wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, | 2339 if (wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, |
| 2316 0, 0, 0, 0, 0, 0, 0, 0) != A_OK) { | 2340 0, 0, 0, 0, 0, 0, 0, 0) != A_OK) { |
| 2317 return -EIO; | 2341 return -EIO; |
| 2318 } | 2342 } |
| 2319 ar->arWlanState = WLAN_DISABLED; | 2343 ar->arWlanState = WLAN_DISABLED; |
| 2320 } | 2344 } |
| 2321 #endif | 2345 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 2346 |
| 2322 return 0; | 2347 return 0; |
| 2323 } | 2348 } |
| 2324 | 2349 |
| 2325 /* connect to a service */ | 2350 /* connect to a service */ |
| 2326 static A_STATUS ar6000_connectservice(AR_SOFTC_T *ar, | 2351 static A_STATUS ar6000_connectservice(AR_SOFTC_T *ar, |
| 2327 HTC_SERVICE_CONNECT_REQ *pConnect, | 2352 HTC_SERVICE_CONNECT_REQ *pConnect, |
| 2328 char *pDesc) | 2353 char *pDesc) |
| 2329 { | 2354 { |
| 2330 A_STATUS status; | 2355 A_STATUS status; |
| 2331 HTC_SERVICE_CONNECT_RESP response; | 2356 HTC_SERVICE_CONNECT_RESP response; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2416 A_INT32 timeleft; | 2441 A_INT32 timeleft; |
| 2417 A_INT16 i; | 2442 A_INT16 i; |
| 2418 int ret = 0; | 2443 int ret = 0; |
| 2419 #if defined(INIT_MODE_DRV_ENABLED) && defined(ENABLE_COEXISTENCE) | 2444 #if defined(INIT_MODE_DRV_ENABLED) && defined(ENABLE_COEXISTENCE) |
| 2420 WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD sbcb_cmd; | 2445 WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD sbcb_cmd; |
| 2421 WMI_SET_BTCOEX_FE_ANT_CMD sbfa_cmd; | 2446 WMI_SET_BTCOEX_FE_ANT_CMD sbfa_cmd; |
| 2422 #endif /* INIT_MODE_DRV_ENABLED && ENABLE_COEXISTENCE */ | 2447 #endif /* INIT_MODE_DRV_ENABLED && ENABLE_COEXISTENCE */ |
| 2423 | 2448 |
| 2424 if((ar = ar6k_priv(dev)) == NULL) | 2449 if((ar = ar6k_priv(dev)) == NULL) |
| 2425 { | 2450 { |
| 2426 ret = -EIO; | 2451 return -EIO; |
| 2427 goto ar6000_init_done; | |
| 2428 } | 2452 } |
| 2429 | 2453 |
| 2430 if (wlaninitmode == WLAN_INIT_MODE_USR) | 2454 if (wlaninitmode == WLAN_INIT_MODE_USR || wlaninitmode == WLAN_INIT_MODE_DRV
) { |
| 2455 |
| 2431 ar6000_update_bdaddr(ar); | 2456 ar6000_update_bdaddr(ar); |
| 2432 | 2457 |
| 2458 if (enablerssicompensation) { |
| 2459 ar6000_copy_cust_data_from_target(ar->arHifDevice, ar->arTargetType)
; |
| 2460 read_rssi_compensation_param(ar); |
| 2461 for (i=-95; i<=0; i++) { |
| 2462 rssi_compensation_table[0-i] = rssi_compensation_calc(ar,i); |
| 2463 } |
| 2464 } |
| 2465 } |
| 2466 |
| 2433 dev_hold(dev); | 2467 dev_hold(dev); |
| 2434 rtnl_unlock(); | 2468 rtnl_unlock(); |
| 2435 | 2469 |
| 2436 if (enablerssicompensation) { | |
| 2437 ar6000_copy_cust_data_from_target(ar->arHifDevice, ar->arTargetType); | |
| 2438 read_rssi_compensation_param(ar); | |
| 2439 for (i=-95; i<=0; i++) { | |
| 2440 rssi_compensation_table[0-i] = rssi_compensation_calc(ar,i); | |
| 2441 } | |
| 2442 } | |
| 2443 | |
| 2444 /* Do we need to finish the BMI phase */ | 2470 /* Do we need to finish the BMI phase */ |
| 2445 if ((wlaninitmode == WLAN_INIT_MODE_USR) && (BMIDone(ar->arHifDevice) != A_O
K)) | 2471 if ((wlaninitmode == WLAN_INIT_MODE_USR || wlaninitmode == WLAN_INIT_MODE_DR
V) && |
| 2472 (BMIDone(ar->arHifDevice) != A_OK)) |
| 2446 { | 2473 { |
| 2447 ret = -EIO; | 2474 ret = -EIO; |
| 2448 goto ar6000_init_done; | 2475 goto ar6000_init_done; |
| 2449 } | 2476 } |
| 2450 | 2477 |
| 2451 if (!bypasswmi) | 2478 if (!bypasswmi) |
| 2452 { | 2479 { |
| 2453 #if 0 /* TBDXXX */ | 2480 #if 0 /* TBDXXX */ |
| 2454 if (ar->arVersion.host_ver != ar->arVersion.target_ver) { | 2481 if (ar->arVersion.host_ver != ar->arVersion.target_ver) { |
| 2455 A_PRINTF("WARNING: Host version 0x%x does not match Target " | 2482 A_PRINTF("WARNING: Host version 0x%x does not match Target " |
| 2456 " version 0x%x!\n", | 2483 " version 0x%x!\n", |
| 2457 ar->arVersion.host_ver, ar->arVersion.target_ver); | 2484 ar->arVersion.host_ver, ar->arVersion.target_ver); |
| 2458 } | 2485 } |
| 2459 #endif | 2486 #endif |
| 2460 | 2487 |
| 2461 /* Indicate that WMI is enabled (although not ready yet) */ | 2488 /* Indicate that WMI is enabled (although not ready yet) */ |
| 2462 ar->arWmiEnabled = TRUE; | 2489 ar->arWmiEnabled = TRUE; |
| 2463 if ((ar->arWmi = wmi_init((void *) ar)) == NULL) | 2490 if ((ar->arWmi = wmi_init((void *) ar)) == NULL) |
| 2464 { | 2491 { |
| 2465 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Failed to initialize WMI.\n", _
_func__)); | 2492 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Failed to initialize WMI.\n", _
_func__)); |
| 2466 ret = -EIO; | 2493 ret = -EIO; |
| 2467 goto ar6000_init_done; | 2494 goto ar6000_init_done; |
| 2468 } | 2495 } |
| 2469 | 2496 |
| 2470 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Got WMI @ 0x%08x.\n", __func__, | 2497 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s() Got WMI @ 0x%lx.\n", __func__, |
| 2471 (unsigned int) ar->arWmi)); | 2498 (unsigned long) ar->arWmi)); |
| 2472 } | 2499 } |
| 2473 | 2500 |
| 2474 do { | 2501 do { |
| 2475 HTC_SERVICE_CONNECT_REQ connect; | 2502 HTC_SERVICE_CONNECT_REQ connect; |
| 2476 | 2503 |
| 2477 /* the reason we have to wait for the target here is that the driver
layer | 2504 /* the reason we have to wait for the target here is that the driver
layer |
| 2478 * has to init BMI in order to set the host block size, | 2505 * has to init BMI in order to set the host block size, |
| 2479 */ | 2506 */ |
| 2480 status = HTCWaitTarget(ar->arHtcTarget); | 2507 status = HTCWaitTarget(ar->arHtcTarget); |
| 2481 | 2508 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2596 hciHandles.hifDevice = ar->arHifDevice; | 2623 hciHandles.hifDevice = ar->arHifDevice; |
| 2597 hciHandles.htcHandle = ar->arHtcTarget; | 2624 hciHandles.htcHandle = ar->arHtcTarget; |
| 2598 status = (A_STATUS)(ar6kHciTransCallbacks.setupTransport(&hciHandles
)); | 2625 status = (A_STATUS)(ar6kHciTransCallbacks.setupTransport(&hciHandles
)); |
| 2599 } | 2626 } |
| 2600 #else | 2627 #else |
| 2601 if (setuphci) { | 2628 if (setuphci) { |
| 2602 /* setup HCI */ | 2629 /* setup HCI */ |
| 2603 status = ar6000_setup_hci(ar); | 2630 status = ar6000_setup_hci(ar); |
| 2604 } | 2631 } |
| 2605 #endif | 2632 #endif |
| 2633 #ifdef EXPORT_HCI_PAL_INTERFACE |
| 2634 if (setuphcipal && (NULL != ar6kHciPalCallbacks_g.setupTransport)) |
| 2635 status = ar6kHciPalCallbacks_g.setupTransport(ar); |
| 2636 #else |
| 2637 if(setuphcipal) |
| 2638 status = ar6k_setup_hci_pal(ar); |
| 2639 #endif |
| 2606 | 2640 |
| 2607 } while (FALSE); | 2641 } while (FALSE); |
| 2608 | 2642 |
| 2609 if (A_FAILED(status)) { | 2643 if (A_FAILED(status)) { |
| 2610 ret = -EIO; | 2644 ret = -EIO; |
| 2611 goto ar6000_init_done; | 2645 goto ar6000_init_done; |
| 2612 } | 2646 } |
| 2613 | 2647 |
| 2614 /* | 2648 /* |
| 2615 * give our connected endpoints some buffers | 2649 * give our connected endpoints some buffers |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2726 /* for tests like endpoint ping, the MAC address needs to be non-zer
o otherwise | 2760 /* for tests like endpoint ping, the MAC address needs to be non-zer
o otherwise |
| 2727 * the data path through a raw socket is disabled */ | 2761 * the data path through a raw socket is disabled */ |
| 2728 dev->dev_addr[0] = 0x00; | 2762 dev->dev_addr[0] = 0x00; |
| 2729 dev->dev_addr[1] = 0x01; | 2763 dev->dev_addr[1] = 0x01; |
| 2730 dev->dev_addr[2] = 0x02; | 2764 dev->dev_addr[2] = 0x02; |
| 2731 dev->dev_addr[3] = 0xAA; | 2765 dev->dev_addr[3] = 0xAA; |
| 2732 dev->dev_addr[4] = 0xBB; | 2766 dev->dev_addr[4] = 0xBB; |
| 2733 dev->dev_addr[5] = 0xCC; | 2767 dev->dev_addr[5] = 0xCC; |
| 2734 } | 2768 } |
| 2735 | 2769 |
| 2736 #ifdef ANDROID_ENV | |
| 2737 android_ar6k_start(ar); | |
| 2738 #endif | |
| 2739 | |
| 2740 ar6000_init_done: | 2770 ar6000_init_done: |
| 2741 rtnl_lock(); | 2771 rtnl_lock(); |
| 2742 dev_put(dev); | 2772 dev_put(dev); |
| 2743 | 2773 |
| 2744 return ret; | 2774 return ret; |
| 2745 } | 2775 } |
| 2746 | 2776 |
| 2747 | 2777 |
| 2748 void | 2778 void |
| 2749 ar6000_bitrate_rx(void *devt, A_INT32 rateKbps) | 2779 ar6000_bitrate_rx(void *devt, A_INT32 rateKbps) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2839 ar->arNodeMap[eptMap].txPending ++; | 2869 ar->arNodeMap[eptMap].txPending ++; |
| 2840 | 2870 |
| 2841 return ar->arNodeMap[eptMap].epId; | 2871 return ar->arNodeMap[eptMap].epId; |
| 2842 } | 2872 } |
| 2843 | 2873 |
| 2844 #ifdef DEBUG | 2874 #ifdef DEBUG |
| 2845 static void ar6000_dump_skb(struct sk_buff *skb) | 2875 static void ar6000_dump_skb(struct sk_buff *skb) |
| 2846 { | 2876 { |
| 2847 u_char *ch; | 2877 u_char *ch; |
| 2848 for (ch = A_NETBUF_DATA(skb); | 2878 for (ch = A_NETBUF_DATA(skb); |
| 2849 (A_UINT32)ch < ((A_UINT32)A_NETBUF_DATA(skb) + | 2879 (unsigned long)ch < ((unsigned long)A_NETBUF_DATA(skb) + |
| 2850 A_NETBUF_LEN(skb)); ch++) | 2880 A_NETBUF_LEN(skb)); ch++) |
| 2851 { | 2881 { |
| 2852 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("%2.2x ", *ch)); | 2882 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("%2.2x ", *ch)); |
| 2853 } | 2883 } |
| 2854 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("\n")); | 2884 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("\n")); |
| 2855 } | 2885 } |
| 2856 #endif | 2886 #endif |
| 2857 | 2887 |
| 2858 #ifdef HTC_TEST_SEND_PKTS | 2888 #ifdef HTC_TEST_SEND_PKTS |
| 2859 static void DoHTCSendPktsTest(AR_SOFTC_T *ar, int MapNo, HTC_ENDPOINT_ID eid, st
ruct sk_buff *skb); | 2889 static void DoHTCSendPktsTest(AR_SOFTC_T *ar, int MapNo, HTC_ENDPOINT_ID eid, st
ruct sk_buff *skb); |
| 2860 #endif | 2890 #endif |
| 2861 | 2891 |
| 2862 static int | 2892 static int |
| 2863 ar6000_data_tx(struct sk_buff *skb, struct net_device *dev) | 2893 ar6000_data_tx(struct sk_buff *skb, struct net_device *dev) |
| 2864 { | 2894 { |
| 2865 #define AC_NOT_MAPPED 99 | 2895 #define AC_NOT_MAPPED 99 |
| 2866 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 2896 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 2867 A_UINT8 ac = AC_NOT_MAPPED; | 2897 A_UINT8 ac = AC_NOT_MAPPED; |
| 2868 HTC_ENDPOINT_ID eid = ENDPOINT_UNUSED; | 2898 HTC_ENDPOINT_ID eid = ENDPOINT_UNUSED; |
| 2869 A_UINT32 mapNo = 0; | 2899 A_UINT32 mapNo = 0; |
| 2870 int len; | 2900 int len; |
| 2871 struct ar_cookie *cookie; | 2901 struct ar_cookie *cookie; |
| 2872 A_BOOL checkAdHocPsMapping = FALSE,bMoreData = FALSE; | 2902 A_BOOL checkAdHocPsMapping = FALSE,bMoreData = FALSE; |
| 2873 HTC_TX_TAG htc_tag = AR6K_DATA_PKT_TAG; | 2903 HTC_TX_TAG htc_tag = AR6K_DATA_PKT_TAG; |
| 2874 A_UINT8 dot11Hdr = processDot11Hdr; | 2904 A_UINT8 dot11Hdr = processDot11Hdr; |
| 2875 #ifdef CONFIG_PM | 2905 #ifdef CONFIG_PM |
| 2876 if (ar->arWowState) { | 2906 if (ar->arWowState != WLAN_WOW_STATE_NONE) { |
| 2877 A_NETBUF_FREE(skb); | 2907 A_NETBUF_FREE(skb); |
| 2878 return 0; | 2908 return 0; |
| 2879 } | 2909 } |
| 2880 #endif /* CONFIG_PM */ | 2910 #endif /* CONFIG_PM */ |
| 2881 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13) | |
| 2882 skb->list = NULL; | |
| 2883 #endif | |
| 2884 | 2911 |
| 2885 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar6000_data_tx start - skb=0x%x, data=0x
%x, len=0x%x\n", | 2912 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar6000_data_tx start - skb=0x%lx, data=0
x%lx, len=0x%x\n", |
| 2886 (A_UINT32)skb, (A_UINT32)A_NETBUF_DATA(skb), | 2913 (unsigned long)skb, (unsigned long)A_NETBUF_DATA(skb), |
| 2887 A_NETBUF_LEN(skb))); | 2914 A_NETBUF_LEN(skb))); |
| 2888 | 2915 |
| 2889 /* If target is not associated */ | 2916 /* If target is not associated */ |
| 2890 if( (!ar->arConnected && !bypasswmi) | 2917 if( (!ar->arConnected && !bypasswmi) |
| 2891 #ifdef CONFIG_HOST_TCMD_SUPPORT | 2918 #ifdef CONFIG_HOST_TCMD_SUPPORT |
| 2892 /* TCMD doesnt support any data, free the buf and return */ | 2919 /* TCMD doesnt support any data, free the buf and return */ |
| 2893 || (ar->arTargetMode == AR6000_TCMD_MODE) | 2920 || (ar->arTargetMode == AR6000_TCMD_MODE) |
| 2894 #endif | 2921 #endif |
| 2895 ) { | 2922 ) { |
| 2896 A_NETBUF_FREE(skb); | 2923 A_NETBUF_FREE(skb); |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3147 /* update counts while the lock is held */ | 3174 /* update counts while the lock is held */ |
| 3148 ar->arTxPending[eid]++; | 3175 ar->arTxPending[eid]++; |
| 3149 ar->arTotalTxDataPending++; | 3176 ar->arTotalTxDataPending++; |
| 3150 } | 3177 } |
| 3151 | 3178 |
| 3152 } while (FALSE); | 3179 } while (FALSE); |
| 3153 | 3180 |
| 3154 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 3181 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 3155 | 3182 |
| 3156 if (cookie != NULL) { | 3183 if (cookie != NULL) { |
| 3157 cookie->arc_bp[0] = (A_UINT32)skb; | 3184 cookie->arc_bp[0] = (unsigned long)skb; |
| 3158 cookie->arc_bp[1] = mapNo; | 3185 cookie->arc_bp[1] = mapNo; |
| 3159 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, | 3186 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, |
| 3160 cookie, | 3187 cookie, |
| 3161 A_NETBUF_DATA(skb), | 3188 A_NETBUF_DATA(skb), |
| 3162 A_NETBUF_LEN(skb), | 3189 A_NETBUF_LEN(skb), |
| 3163 eid, | 3190 eid, |
| 3164 htc_tag); | 3191 htc_tag); |
| 3165 | 3192 |
| 3166 #ifdef DEBUG | 3193 #ifdef DEBUG |
| 3167 if (debugdriver >= 3) { | 3194 if (debugdriver >= 3) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3202 if (cookie != NULL) { | 3229 if (cookie != NULL) { |
| 3203 /* update counts while the lock is held */ | 3230 /* update counts while the lock is held */ |
| 3204 ar->arTxPending[eid]++; | 3231 ar->arTxPending[eid]++; |
| 3205 ar->arTotalTxDataPending++; | 3232 ar->arTotalTxDataPending++; |
| 3206 } | 3233 } |
| 3207 | 3234 |
| 3208 | 3235 |
| 3209 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 3236 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 3210 | 3237 |
| 3211 if (cookie != NULL) { | 3238 if (cookie != NULL) { |
| 3212 cookie->arc_bp[0] = (A_UINT32)skb; | 3239 cookie->arc_bp[0] = (unsigned long)skb; |
| 3213 cookie->arc_bp[1] = 0; | 3240 cookie->arc_bp[1] = 0; |
| 3214 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, | 3241 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, |
| 3215 cookie, | 3242 cookie, |
| 3216 A_NETBUF_DATA(skb), | 3243 A_NETBUF_DATA(skb), |
| 3217 A_NETBUF_LEN(skb), | 3244 A_NETBUF_LEN(skb), |
| 3218 eid, | 3245 eid, |
| 3219 AR6K_DATA_PKT_TAG); | 3246 AR6K_DATA_PKT_TAG); |
| 3220 | 3247 |
| 3221 /* HTC interface is asynchronous, if this fails, cleanup will happen
in | 3248 /* HTC interface is asynchronous, if this fails, cleanup will happen
in |
| 3222 * the ar6000_tx_complete callback */ | 3249 * the ar6000_tx_complete callback */ |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3401 A_ASSERT(pktSkb); | 3428 A_ASSERT(pktSkb); |
| 3402 A_ASSERT(pPacket->pBuffer == A_NETBUF_DATA(pktSkb)); | 3429 A_ASSERT(pPacket->pBuffer == A_NETBUF_DATA(pktSkb)); |
| 3403 | 3430 |
| 3404 /* add this to the list, use faster non-lock API */ | 3431 /* add this to the list, use faster non-lock API */ |
| 3405 __skb_queue_tail(&skb_queue,pktSkb); | 3432 __skb_queue_tail(&skb_queue,pktSkb); |
| 3406 | 3433 |
| 3407 if (A_SUCCESS(status)) { | 3434 if (A_SUCCESS(status)) { |
| 3408 A_ASSERT(pPacket->ActualLength == A_NETBUF_LEN(pktSkb)); | 3435 A_ASSERT(pPacket->ActualLength == A_NETBUF_LEN(pktSkb)); |
| 3409 } | 3436 } |
| 3410 | 3437 |
| 3411 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar6000_tx_complete skb=0x%x data=0x%
x len=0x%x eid=%d ", | 3438 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar6000_tx_complete skb=0x%lx data=0x
%lx len=0x%x eid=%d ", |
| 3412 (A_UINT32)pktSkb, (A_UINT32)pPacket->pBuffer, | 3439 (unsigned long)pktSkb, (unsigned long)pPacket->pBuffer, |
| 3413 pPacket->ActualLength, | 3440 pPacket->ActualLength, |
| 3414 eid)); | 3441 eid)); |
| 3415 | 3442 |
| 3416 ar->arTxPending[eid]--; | 3443 ar->arTxPending[eid]--; |
| 3417 | 3444 |
| 3418 if ((eid != ar->arControlEp) || bypasswmi) { | 3445 if ((eid != ar->arControlEp) || bypasswmi) { |
| 3419 ar->arTotalTxDataPending--; | 3446 ar->arTotalTxDataPending--; |
| 3420 } | 3447 } |
| 3421 | 3448 |
| 3422 if (eid == ar->arControlEp) | 3449 if (eid == ar->arControlEp) |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3553 AR_SOFTC_T *ar = (AR_SOFTC_T *)Context; | 3580 AR_SOFTC_T *ar = (AR_SOFTC_T *)Context; |
| 3554 struct sk_buff *skb = (struct sk_buff *)pPacket->pPktContext; | 3581 struct sk_buff *skb = (struct sk_buff *)pPacket->pPktContext; |
| 3555 int minHdrLen; | 3582 int minHdrLen; |
| 3556 A_UINT8 containsDot11Hdr = 0; | 3583 A_UINT8 containsDot11Hdr = 0; |
| 3557 A_STATUS status = pPacket->Status; | 3584 A_STATUS status = pPacket->Status; |
| 3558 HTC_ENDPOINT_ID ept = pPacket->Endpoint; | 3585 HTC_ENDPOINT_ID ept = pPacket->Endpoint; |
| 3559 | 3586 |
| 3560 A_ASSERT((status != A_OK) || | 3587 A_ASSERT((status != A_OK) || |
| 3561 (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN))); | 3588 (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN))); |
| 3562 | 3589 |
| 3563 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_RX,("ar6000_rx ar=0x%x eid=%d, skb=0x%x, data
=0x%x, len=0x%x status:%d", | 3590 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_RX,("ar6000_rx ar=0x%lx eid=%d, skb=0x%lx, da
ta=0x%lx, len=0x%x status:%d", |
| 3564 (A_UINT32)ar, ept, (A_UINT32)skb, (A_UINT32)pPacket->pBuffer
, | 3591 (unsigned long)ar, ept, (unsigned long)skb, (unsigned long)p
Packet->pBuffer, |
| 3565 pPacket->ActualLength, status)); | 3592 pPacket->ActualLength, status)); |
| 3566 if (status != A_OK) { | 3593 if (status != A_OK) { |
| 3567 if (status != A_ECANCELED) { | 3594 if (status != A_ECANCELED) { |
| 3568 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("RX ERR (%d) \n",status)); | 3595 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("RX ERR (%d) \n",status)); |
| 3569 } | 3596 } |
| 3570 } | 3597 } |
| 3571 | 3598 |
| 3572 /* take lock to protect buffer counts | 3599 /* take lock to protect buffer counts |
| 3573 * and adaptive power throughput state */ | 3600 * and adaptive power throughput state */ |
| 3574 AR6000_SPIN_LOCK(&ar->arLock, 0); | 3601 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3595 | 3622 |
| 3596 skb->dev = ar->arNetDev; | 3623 skb->dev = ar->arNetDev; |
| 3597 if (status != A_OK) { | 3624 if (status != A_OK) { |
| 3598 AR6000_STAT_INC(ar, rx_errors); | 3625 AR6000_STAT_INC(ar, rx_errors); |
| 3599 A_NETBUF_FREE(skb); | 3626 A_NETBUF_FREE(skb); |
| 3600 } else if (ar->arWmiEnabled == TRUE) { | 3627 } else if (ar->arWmiEnabled == TRUE) { |
| 3601 if (ept == ar->arControlEp) { | 3628 if (ept == ar->arControlEp) { |
| 3602 /* | 3629 /* |
| 3603 * this is a wmi control msg | 3630 * this is a wmi control msg |
| 3604 */ | 3631 */ |
| 3605 #ifdef ANDROID_ENV | 3632 #ifdef CONFIG_PM |
| 3606 android_ar6k_check_wow_status(ar, skb, TRUE); | 3633 ar6000_check_wow_status(ar, skb, TRUE); |
| 3607 #endif /* ANDROID_ENV */ | 3634 #endif /* CONFIG_PM */ |
| 3608 wmi_control_rx(ar->arWmi, skb); | 3635 wmi_control_rx(ar->arWmi, skb); |
| 3609 } else { | 3636 } else { |
| 3610 WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)A_NETBUF_DATA(skb); | 3637 WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)A_NETBUF_DATA(skb); |
| 3611 A_UINT8 is_amsdu, tid, is_acl_data_frame; | 3638 A_UINT8 is_amsdu, tid, is_acl_data_frame; |
| 3612 is_acl_data_frame = WMI_DATA_HDR_GET_DATA_TYPE(dhdr) == WMI_DATA
_HDR_DATA_TYPE_ACL; | 3639 is_acl_data_frame = WMI_DATA_HDR_GET_DATA_TYPE(dhdr) == WMI_DATA
_HDR_DATA_TYPE_ACL; |
| 3613 #ifdef ANDROID_ENV | 3640 #ifdef CONFIG_PM |
| 3614 android_ar6k_check_wow_status(ar, NULL, FALSE); | 3641 ar6000_check_wow_status(ar, NULL, FALSE); |
| 3615 #endif /* ANDROID_ENV */ | 3642 #endif /* CONFIG_PM */ |
| 3616 /* | 3643 /* |
| 3617 * this is a wmi data packet | 3644 * this is a wmi data packet |
| 3618 */ | 3645 */ |
| 3619 // NWF | 3646 // NWF |
| 3620 | 3647 |
| 3621 if (processDot11Hdr) { | 3648 if (processDot11Hdr) { |
| 3622 minHdrLen = sizeof(WMI_DATA_HDR) + sizeof(struct ieee80211_f
rame) + sizeof(ATH_LLC_SNAP_HDR); | 3649 minHdrLen = sizeof(WMI_DATA_HDR) + sizeof(struct ieee80211_f
rame) + sizeof(ATH_LLC_SNAP_HDR); |
| 3623 } else { | 3650 } else { |
| 3624 minHdrLen = sizeof (WMI_DATA_HDR) + sizeof(ATH_MAC_HDR) + | 3651 minHdrLen = sizeof (WMI_DATA_HDR) + sizeof(ATH_MAC_HDR) + |
| 3625 sizeof(ATH_LLC_SNAP_HDR); | 3652 sizeof(ATH_LLC_SNAP_HDR); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3772 | 3799 |
| 3773 if (status != A_OK) { | 3800 if (status != A_OK) { |
| 3774 /* Drop frames that could not be processed (lack of memo
ry, etc.) */ | 3801 /* Drop frames that could not be processed (lack of memo
ry, etc.) */ |
| 3775 A_NETBUF_FREE(skb); | 3802 A_NETBUF_FREE(skb); |
| 3776 goto rx_done; | 3803 goto rx_done; |
| 3777 } | 3804 } |
| 3778 | 3805 |
| 3779 if (is_acl_data_frame) { | 3806 if (is_acl_data_frame) { |
| 3780 A_NETBUF_PUSH(skb, sizeof(int)); | 3807 A_NETBUF_PUSH(skb, sizeof(int)); |
| 3781 *((short *)A_NETBUF_DATA(skb)) = WMI_ACL_DATA_EVENTID; | 3808 *((short *)A_NETBUF_DATA(skb)) = WMI_ACL_DATA_EVENTID; |
| 3809 /* send the data packet to PAL driver */ |
| 3810 if(ar6k_pal_config_g.fpar6k_pal_recv_pkt) { |
| 3811 if((*ar6k_pal_config_g.fpar6k_pal_recv_pkt)(ar->
hcipal_info, skb) == TRUE) |
| 3812 goto rx_done; |
| 3813 } |
| 3782 } | 3814 } |
| 3783 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) | 3815 |
| 3784 /* | |
| 3785 * extra push and memcpy, for eth_type_trans() of 2.4 kernel | |
| 3786 * will pull out hard_header_len bytes of the skb. | |
| 3787 */ | |
| 3788 A_NETBUF_PUSH(skb, sizeof(WMI_DATA_HDR) + sizeof(ATH_LLC_SNA
P_HDR) + HTC_HEADER_LEN); | |
| 3789 A_MEMCPY(A_NETBUF_DATA(skb), A_NETBUF_DATA(skb) + sizeof(WMI
_DATA_HDR) + | |
| 3790 sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN, sizeof(A
TH_MAC_HDR)); | |
| 3791 #endif | |
| 3792 if ((ar->arNetDev->flags & IFF_UP) == IFF_UP) { | 3816 if ((ar->arNetDev->flags & IFF_UP) == IFF_UP) { |
| 3793 if (ar->arNetworkType == AP_NETWORK) { | 3817 if (ar->arNetworkType == AP_NETWORK) { |
| 3794 struct sk_buff *skb1 = NULL; | 3818 struct sk_buff *skb1 = NULL; |
| 3795 ATH_MAC_HDR *datap; | 3819 ATH_MAC_HDR *datap; |
| 3796 | 3820 |
| 3797 datap = (ATH_MAC_HDR *)A_NETBUF_DATA(skb); | 3821 datap = (ATH_MAC_HDR *)A_NETBUF_DATA(skb); |
| 3798 if (IEEE80211_IS_MULTICAST(datap->dstMac)) { | 3822 if (IEEE80211_IS_MULTICAST(datap->dstMac)) { |
| 3799 /* Bcast/Mcast frames should be sent to the OS | 3823 /* Bcast/Mcast frames should be sent to the OS |
| 3800 * stack as well as on the air. | 3824 * stack as well as on the air. |
| 3801 */ | 3825 */ |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3841 } | 3865 } |
| 3842 | 3866 |
| 3843 static void | 3867 static void |
| 3844 ar6000_deliver_frames_to_nw_stack(void *dev, void *osbuf) | 3868 ar6000_deliver_frames_to_nw_stack(void *dev, void *osbuf) |
| 3845 { | 3869 { |
| 3846 struct sk_buff *skb = (struct sk_buff *)osbuf; | 3870 struct sk_buff *skb = (struct sk_buff *)osbuf; |
| 3847 | 3871 |
| 3848 if(skb) { | 3872 if(skb) { |
| 3849 skb->dev = dev; | 3873 skb->dev = dev; |
| 3850 if ((skb->dev->flags & IFF_UP) == IFF_UP) { | 3874 if ((skb->dev->flags & IFF_UP) == IFF_UP) { |
| 3851 #ifdef ANDROID_ENV | 3875 #ifdef CONFIG_PM |
| 3852 android_ar6k_check_wow_status((AR_SOFTC_T *)ar6k_priv(dev), skb, FAL
SE); | 3876 ar6000_check_wow_status((AR_SOFTC_T *)ar6k_priv(dev), skb, FALSE);
|
| 3853 #endif | 3877 #endif /* CONFIG_PM */ |
| 3854 skb->protocol = eth_type_trans(skb, skb->dev); | 3878 skb->protocol = eth_type_trans(skb, skb->dev); |
| 3855 /* | 3879 /* |
| 3856 * If this routine is called on a ISR (Hard IRQ) or DSR (Soft IRQ) | 3880 * If this routine is called on a ISR (Hard IRQ) or DSR (Soft IRQ) |
| 3857 * or tasklet use the netif_rx to deliver the packet to the stack | 3881 * or tasklet use the netif_rx to deliver the packet to the stack |
| 3858 * netif_rx will queue the packet onto the receive queue and mark | 3882 * netif_rx will queue the packet onto the receive queue and mark |
| 3859 * the softirq thread has a pending action to complete. Kernel will | 3883 * the softirq thread has a pending action to complete. Kernel will |
| 3860 * schedule the softIrq kernel thread after processing the DSR. | 3884 * schedule the softIrq kernel thread after processing the DSR. |
| 3861 * | 3885 * |
| 3862 * If this routine is called on a process context, use netif_rx_ni | 3886 * If this routine is called on a process context, use netif_rx_ni |
| 3863 * which will schedle the softIrq kernel thread after queuing the packet
. | 3887 * which will schedle the softIrq kernel thread after queuing the packet
. |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4036 if (refillCount >= AR6000_AMSDU_REFILL_THRESHOLD) { | 4060 if (refillCount >= AR6000_AMSDU_REFILL_THRESHOLD) { |
| 4037 ar6000_refill_amsdu_rxbufs(ar,refillCount); | 4061 ar6000_refill_amsdu_rxbufs(ar,refillCount); |
| 4038 } | 4062 } |
| 4039 | 4063 |
| 4040 return pPacket; | 4064 return pPacket; |
| 4041 } | 4065 } |
| 4042 | 4066 |
| 4043 static void | 4067 static void |
| 4044 ar6000_set_multicast_list(struct net_device *dev) | 4068 ar6000_set_multicast_list(struct net_device *dev) |
| 4045 { | 4069 { |
| 4046 int i; | 4070 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000: Multicast filter not supported\n")); |
| 4047 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | |
| 4048 if (ar->arWmiReady == FALSE || ar->arWlanState == WLAN_DISABLED) | |
| 4049 return; | |
| 4050 | |
| 4051 for (i=0; i<MAC_MAX_FILTERS_PER_LIST; ++i) { | |
| 4052 A_UINT8 *filter = ar->mcast_filters[i]; | |
| 4053 if (filter[0] || filter[1] || filter[2] || filter[3] ) { | |
| 4054 wmi_del_mcast_filter_cmd(ar->arWmi, filter[0], filter[1], filter[2],
filter[3]); | |
| 4055 } | |
| 4056 } | |
| 4057 A_MEMZERO(ar->mcast_filters, sizeof(ar->mcast_filters)); | |
| 4058 | |
| 4059 if ((dev->flags & IFF_PROMISC) || | |
| 4060 (dev->flags & IFF_ALLMULTI) || dev->mc_count > MAC_MAX_FILTERS_PER_L
IST) { | |
| 4061 wmi_mcast_filter_cmd(ar->arWmi, TRUE); | |
| 4062 return; | |
| 4063 } | |
| 4064 | |
| 4065 if (dev->flags & IFF_MULTICAST && dev->mc_count > 0) { | |
| 4066 struct dev_mc_list *mc; | |
| 4067 for (mc = dev->mc_list, i=0; mc; mc = mc->next, ++i) { | |
| 4068 u8 *mac = mc->dmi_addr; | |
| 4069 if (mac[2] || mac[3] || mac[4] || mac[5]) { | |
| 4070 A_MEMCPY(ar->mcast_filters[i], &mac[2], sizeof(ar->mcast_filters
[i])); | |
| 4071 wmi_set_mcast_filter_cmd(ar->arWmi, mac[2], mac[3], mac[4] , mac
[5]); | |
| 4072 } | |
| 4073 } | |
| 4074 wmi_mcast_filter_cmd(ar->arWmi, TRUE); | |
| 4075 } else { | |
| 4076 /* target drop multicast packets if fitler disable and fitler list is ze
ro */ | |
| 4077 wmi_mcast_filter_cmd(ar->arWmi, FALSE); | |
| 4078 } | |
| 4079 } | 4071 } |
| 4080 | 4072 |
| 4081 static struct net_device_stats * | 4073 static struct net_device_stats * |
| 4082 ar6000_get_stats(struct net_device *dev) | 4074 ar6000_get_stats(struct net_device *dev) |
| 4083 { | 4075 { |
| 4084 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 4076 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 4085 return &ar->arNetStats; | 4077 return &ar->arNetStats; |
| 4086 } | 4078 } |
| 4087 | 4079 |
| 4088 static struct iw_statistics * | 4080 static struct iw_statistics * |
| 4089 ar6000_get_iwstats(struct net_device * dev) | 4081 ar6000_get_iwstats(struct net_device * dev) |
| 4090 { | 4082 { |
| 4091 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); | 4083 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev); |
| 4092 TARGET_STATS *pStats = &ar->arTargetStats; | 4084 TARGET_STATS *pStats = &ar->arTargetStats; |
| 4093 struct iw_statistics * pIwStats = &ar->arIwStats; | 4085 struct iw_statistics * pIwStats = &ar->arIwStats; |
| 4094 int rtnllocked; | 4086 int rtnllocked; |
| 4095 | 4087 |
| 4096 if (ar->bIsDestroyProgress || ar->arWmiReady == FALSE || ar->arWlanState ==
WLAN_DISABLED) | 4088 if (ar->bIsDestroyProgress || ar->arWmiReady == FALSE || ar->arWlanState ==
WLAN_DISABLED) |
| 4097 { | 4089 { |
| 4098 pIwStats->status = 0; | 4090 pIwStats->status = 0; |
| 4099 pIwStats->qual.qual = 0; | 4091 pIwStats->qual.qual = 0; |
| 4100 pIwStats->qual.level =0; | 4092 pIwStats->qual.level =0; |
| 4101 pIwStats->qual.noise = 0; | 4093 pIwStats->qual.noise = 0; |
| 4102 pIwStats->discard.code =0; | 4094 pIwStats->discard.code =0; |
| 4103 pIwStats->discard.retries=0; | 4095 pIwStats->discard.retries=0; |
| 4104 pIwStats->miss.beacon =0; | 4096 pIwStats->miss.beacon =0; |
| 4105 return pIwStats; | 4097 return pIwStats; |
| 4106 } | 4098 } |
| 4107 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 4099 |
| 4108 /* | 4100 /* |
| 4109 * The in_atomic function is used to determine if the scheduling is | 4101 * The in_atomic function is used to determine if the scheduling is |
| 4110 * allowed in the current context or not. This was introduced in 2.6 | 4102 * allowed in the current context or not. This was introduced in 2.6 |
| 4111 * From what I have read on the differences between 2.4 and 2.6, the | 4103 * From what I have read on the differences between 2.4 and 2.6, the |
| 4112 * 2.4 kernel did not support preemption and so this check might not | 4104 * 2.4 kernel did not support preemption and so this check might not |
| 4113 * be required for 2.4 kernels. | 4105 * be required for 2.4 kernels. |
| 4114 */ | 4106 */ |
| 4115 if (in_atomic()) | 4107 if (in_atomic()) |
| 4116 { | 4108 { |
| 4117 wmi_get_stats_cmd(ar->arWmi); | 4109 wmi_get_stats_cmd(ar->arWmi); |
| 4118 | 4110 |
| 4119 pIwStats->status = 1 ; | 4111 pIwStats->status = 1 ; |
| 4120 pIwStats->qual.qual = pStats->cs_aveBeacon_rssi - 161; | 4112 pIwStats->qual.qual = pStats->cs_aveBeacon_rssi - 161; |
| 4121 pIwStats->qual.level =pStats->cs_aveBeacon_rssi; /* noise is -95 dBm */ | 4113 pIwStats->qual.level =pStats->cs_aveBeacon_rssi; /* noise is -95 dBm */ |
| 4122 pIwStats->qual.noise = pStats->noise_floor_calibation; | 4114 pIwStats->qual.noise = pStats->noise_floor_calibation; |
| 4123 pIwStats->discard.code = pStats->rx_decrypt_err; | 4115 pIwStats->discard.code = pStats->rx_decrypt_err; |
| 4124 pIwStats->discard.retries = pStats->tx_retry_cnt; | 4116 pIwStats->discard.retries = pStats->tx_retry_cnt; |
| 4125 pIwStats->miss.beacon = pStats->cs_bmiss_cnt; | 4117 pIwStats->miss.beacon = pStats->cs_bmiss_cnt; |
| 4126 return pIwStats; | 4118 return pIwStats; |
| 4127 } | 4119 } |
| 4128 #endif /* LINUX_VERSION_CODE */ | 4120 |
| 4129 dev_hold(dev); | 4121 dev_hold(dev); |
| 4130 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) | |
| 4131 rtnllocked = rtnl_is_locked(); | 4122 rtnllocked = rtnl_is_locked(); |
| 4132 #else | |
| 4133 rtnllocked = TRUE; | |
| 4134 #endif | |
| 4135 if (rtnllocked) { | 4123 if (rtnllocked) { |
| 4136 rtnl_unlock(); | 4124 rtnl_unlock(); |
| 4137 } | 4125 } |
| 4138 pIwStats->status = 0; | 4126 pIwStats->status = 0; |
| 4139 | 4127 |
| 4140 if (down_interruptible(&ar->arSem)) { | 4128 if (down_interruptible(&ar->arSem)) { |
| 4141 goto err_exit; | 4129 goto err_exit; |
| 4142 } | 4130 } |
| 4143 | 4131 |
| 4144 do { | 4132 do { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 4175 dev_put(dev); | 4163 dev_put(dev); |
| 4176 return pIwStats; | 4164 return pIwStats; |
| 4177 } | 4165 } |
| 4178 | 4166 |
| 4179 void | 4167 void |
| 4180 ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap, A_UINT32 sw_ver,
A_UINT32 abi_ver) | 4168 ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap, A_UINT32 sw_ver,
A_UINT32 abi_ver) |
| 4181 { | 4169 { |
| 4182 AR_SOFTC_T *ar = (AR_SOFTC_T *)devt; | 4170 AR_SOFTC_T *ar = (AR_SOFTC_T *)devt; |
| 4183 struct net_device *dev = ar->arNetDev; | 4171 struct net_device *dev = ar->arNetDev; |
| 4184 | 4172 |
| 4185 ar->arWmiReady = TRUE; | |
| 4186 wake_up(&arEvent); | |
| 4187 A_MEMCPY(dev->dev_addr, datap, AR6000_ETH_ADDR_LEN); | 4173 A_MEMCPY(dev->dev_addr, datap, AR6000_ETH_ADDR_LEN); |
| 4188 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("mac address = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x
:%2.2x\n", | 4174 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("mac address = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x
:%2.2x\n", |
| 4189 dev->dev_addr[0], dev->dev_addr[1], | 4175 dev->dev_addr[0], dev->dev_addr[1], |
| 4190 dev->dev_addr[2], dev->dev_addr[3], | 4176 dev->dev_addr[2], dev->dev_addr[3], |
| 4191 dev->dev_addr[4], dev->dev_addr[5])); | 4177 dev->dev_addr[4], dev->dev_addr[5])); |
| 4192 | 4178 |
| 4193 ar->arPhyCapability = phyCap; | 4179 ar->arPhyCapability = phyCap; |
| 4194 ar->arVersion.wlan_ver = sw_ver; | 4180 ar->arVersion.wlan_ver = sw_ver; |
| 4195 ar->arVersion.abi_ver = abi_ver; | 4181 ar->arVersion.abi_ver = abi_ver; |
| 4196 | 4182 |
| 4183 /* Indicate to the waiting thread that the ready event was received */ |
| 4184 ar->arWmiReady = TRUE; |
| 4185 wake_up(&arEvent); |
| 4186 |
| 4197 #if WLAN_CONFIG_IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN | 4187 #if WLAN_CONFIG_IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN |
| 4198 wmi_pmparams_cmd(ar->arWmi, 0, 1, 0, 0, 1, IGNORE_POWER_SAVE_FAIL_EVENT_DURI
NG_SCAN); | 4188 wmi_pmparams_cmd(ar->arWmi, 0, 1, 0, 0, 1, IGNORE_POWER_SAVE_FAIL_EVENT_DURI
NG_SCAN); |
| 4199 #endif | 4189 #endif |
| 4200 #if WLAN_CONFIG_DONOT_IGNORE_BARKER_IN_ERP | 4190 #if WLAN_CONFIG_DONOT_IGNORE_BARKER_IN_ERP |
| 4201 wmi_set_lpreamble_cmd(ar->arWmi, 0, WMI_DONOT_IGNORE_BARKER_IN_ERP); | 4191 wmi_set_lpreamble_cmd(ar->arWmi, 0, WMI_DONOT_IGNORE_BARKER_IN_ERP); |
| 4202 #endif | 4192 #endif |
| 4203 wmi_set_keepalive_cmd(ar->arWmi, WLAN_CONFIG_KEEP_ALIVE_INTERVAL); | 4193 wmi_set_keepalive_cmd(ar->arWmi, WLAN_CONFIG_KEEP_ALIVE_INTERVAL); |
| 4194 #if WLAN_CONFIG_DISABLE_11N |
| 4195 { |
| 4196 WMI_SET_HT_CAP_CMD htCap; |
| 4197 |
| 4198 A_MEMZERO(&htCap, sizeof(WMI_SET_HT_CAP_CMD)); |
| 4199 htCap.band = 0; |
| 4200 wmi_set_ht_cap_cmd(ar->arWmi, &htCap); |
| 4201 |
| 4202 htCap.band = 1; |
| 4203 wmi_set_ht_cap_cmd(ar->arWmi, &htCap); |
| 4204 } |
| 4205 #endif /* WLAN_CONFIG_DISABLE_11N */ |
| 4206 |
| 4207 #ifdef ATH6K_CONFIG_OTA_MODE |
| 4208 wmi_powermode_cmd(ar->arWmi, MAX_PERF_POWER); |
| 4209 #endif |
| 4210 wmi_disctimeout_cmd(ar->arWmi, WLAN_CONFIG_DISCONNECT_TIMEOUT); |
| 4204 } | 4211 } |
| 4205 | 4212 |
| 4206 A_UINT8 | 4213 void |
| 4207 add_new_sta(AR_SOFTC_T *ar, A_UINT8 *mac, A_UINT16 aid, A_UINT8 *wpaie, | 4214 add_new_sta(AR_SOFTC_T *ar, A_UINT8 *mac, A_UINT16 aid, A_UINT8 *wpaie, |
| 4208 A_UINT8 ielen, A_UINT8 keymgmt, A_UINT8 ucipher, A_UINT8 auth) | 4215 A_UINT8 ielen, A_UINT8 keymgmt, A_UINT8 ucipher, A_UINT8 auth) |
| 4209 { | 4216 { |
| 4210 A_INT8 free_slot=-1, i; | 4217 A_UINT8 free_slot=aid-1; |
| 4211 | 4218 |
| 4212 for(i=0; i < AP_MAX_NUM_STA; i++) { | |
| 4213 if(A_MEMCMP(ar->sta_list[i].mac, mac, ATH_MAC_LEN)==0) { | |
| 4214 /* it is already available */ | |
| 4215 return 0; | |
| 4216 } | |
| 4217 | |
| 4218 if(!((1 << i) & ar->sta_list_index)) { | |
| 4219 free_slot = i; | |
| 4220 break; | |
| 4221 } | |
| 4222 } | |
| 4223 | |
| 4224 if(free_slot >= 0) { | |
| 4225 A_MEMCPY(ar->sta_list[free_slot].mac, mac, ATH_MAC_LEN); | 4219 A_MEMCPY(ar->sta_list[free_slot].mac, mac, ATH_MAC_LEN); |
| 4226 A_MEMCPY(ar->sta_list[free_slot].wpa_ie, wpaie, ielen); | 4220 A_MEMCPY(ar->sta_list[free_slot].wpa_ie, wpaie, ielen); |
| 4227 ar->sta_list[free_slot].aid = aid; | 4221 ar->sta_list[free_slot].aid = aid; |
| 4228 ar->sta_list[free_slot].keymgmt = keymgmt; | 4222 ar->sta_list[free_slot].keymgmt = keymgmt; |
| 4229 ar->sta_list[free_slot].ucipher = ucipher; | 4223 ar->sta_list[free_slot].ucipher = ucipher; |
| 4230 ar->sta_list[free_slot].auth = auth; | 4224 ar->sta_list[free_slot].auth = auth; |
| 4231 ar->sta_list_index = ar->sta_list_index | (1 << free_slot); | 4225 ar->sta_list_index = ar->sta_list_index | (1 << free_slot); |
| 4232 ar->arAPStats.sta[aid-1].aid = aid; | 4226 ar->arAPStats.sta[free_slot].aid = aid; |
| 4233 return 1; | |
| 4234 } | |
| 4235 return 0; /* not added */ | |
| 4236 } | 4227 } |
| 4237 | 4228 |
| 4238 void | 4229 void |
| 4239 ar6000_connect_event(AR_SOFTC_T *ar, A_UINT16 channel, A_UINT8 *bssid, | 4230 ar6000_connect_event(AR_SOFTC_T *ar, A_UINT16 channel, A_UINT8 *bssid, |
| 4240 A_UINT16 listenInterval, A_UINT16 beaconInterval, | 4231 A_UINT16 listenInterval, A_UINT16 beaconInterval, |
| 4241 NETWORK_TYPE networkType, A_UINT8 beaconIeLen, | 4232 NETWORK_TYPE networkType, A_UINT8 beaconIeLen, |
| 4242 A_UINT8 assocReqLen, A_UINT8 assocRespLen, | 4233 A_UINT8 assocReqLen, A_UINT8 assocRespLen, |
| 4243 A_UINT8 *assocInfo) | 4234 A_UINT8 *assocInfo) |
| 4244 { | 4235 { |
| 4245 union iwreq_data wrqu; | 4236 union iwreq_data wrqu; |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4470 key_op_ctrl &= ~KEY_OP_INIT_RSC; | 4461 key_op_ctrl &= ~KEY_OP_INIT_RSC; |
| 4471 } else { | 4462 } else { |
| 4472 key_op_ctrl |= KEY_OP_INIT_RSC; | 4463 key_op_ctrl |= KEY_OP_INIT_RSC; |
| 4473 } | 4464 } |
| 4474 ar6000_reinstall_keys(ar, key_op_ctrl); | 4465 ar6000_reinstall_keys(ar, key_op_ctrl); |
| 4475 } | 4466 } |
| 4476 #endif /* USER_KEYS */ | 4467 #endif /* USER_KEYS */ |
| 4477 | 4468 |
| 4478 netif_wake_queue(ar->arNetDev); | 4469 netif_wake_queue(ar->arNetDev); |
| 4479 | 4470 |
| 4471 /* For CFG80211 the key configuration and the default key comes in after con
nect so no point in plumbing invalid keys */ |
| 4472 #ifndef ATH6K_CONFIG_CFG80211 |
| 4480 if ((networkType & ADHOC_NETWORK) && | 4473 if ((networkType & ADHOC_NETWORK) && |
| 4481 (OPEN_AUTH == ar->arDot11AuthMode) && | 4474 (OPEN_AUTH == ar->arDot11AuthMode) && |
| 4482 (NONE_AUTH == ar->arAuthMode) && | 4475 (NONE_AUTH == ar->arAuthMode) && |
| 4483 (WEP_CRYPT == ar->arPairwiseCrypto)) | 4476 (WEP_CRYPT == ar->arPairwiseCrypto)) |
| 4484 { | 4477 { |
| 4485 if (!ar->arConnected) { | 4478 if (!ar->arConnected) { |
| 4486 wmi_addKey_cmd(ar->arWmi, | 4479 wmi_addKey_cmd(ar->arWmi, |
| 4487 ar->arDefTxKeyIndex, | 4480 ar->arDefTxKeyIndex, |
| 4488 WEP_CRYPT, | 4481 WEP_CRYPT, |
| 4489 GROUP_USAGE | TX_USAGE, | 4482 GROUP_USAGE | TX_USAGE, |
| 4490 ar->arWepKeyList[ar->arDefTxKeyIndex].arKeyLen, | 4483 ar->arWepKeyList[ar->arDefTxKeyIndex].arKeyLen, |
| 4491 NULL, | 4484 NULL, |
| 4492 ar->arWepKeyList[ar->arDefTxKeyIndex].arKey, KEY_OP_I
NIT_VAL, NULL, | 4485 ar->arWepKeyList[ar->arDefTxKeyIndex].arKey, KEY_OP_I
NIT_VAL, NULL, |
| 4493 NO_SYNC_WMIFLAG); | 4486 NO_SYNC_WMIFLAG); |
| 4494 } | 4487 } |
| 4495 } | 4488 } |
| 4489 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 4496 | 4490 |
| 4497 /* Update connect & link status atomically */ | 4491 /* Update connect & link status atomically */ |
| 4498 spin_lock_irqsave(&ar->arLock, flags); | 4492 spin_lock_irqsave(&ar->arLock, flags); |
| 4499 ar->arConnected = TRUE; | 4493 ar->arConnected = TRUE; |
| 4500 ar->arConnectPending = FALSE; | 4494 ar->arConnectPending = FALSE; |
| 4501 netif_carrier_on(ar->arNetDev); | 4495 netif_carrier_on(ar->arNetDev); |
| 4502 spin_unlock_irqrestore(&ar->arLock, flags); | 4496 spin_unlock_irqrestore(&ar->arLock, flags); |
| 4503 /* reset the rx aggr state */ | 4497 /* reset the rx aggr state */ |
| 4504 aggr_reset_state(ar->aggr_cntxt); | 4498 aggr_reset_state(ar->aggr_cntxt); |
| 4505 reconnect_flag = 0; | 4499 reconnect_flag = 0; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4581 } | 4575 } |
| 4582 return removed; | 4576 return removed; |
| 4583 } | 4577 } |
| 4584 | 4578 |
| 4585 void | 4579 void |
| 4586 ar6000_disconnect_event(AR_SOFTC_T *ar, A_UINT8 reason, A_UINT8 *bssid, | 4580 ar6000_disconnect_event(AR_SOFTC_T *ar, A_UINT8 reason, A_UINT8 *bssid, |
| 4587 A_UINT8 assocRespLen, A_UINT8 *assocInfo, A_UINT16 proto
colReasonStatus) | 4581 A_UINT8 assocRespLen, A_UINT8 *assocInfo, A_UINT16 proto
colReasonStatus) |
| 4588 { | 4582 { |
| 4589 A_UINT8 i; | 4583 A_UINT8 i; |
| 4590 unsigned long flags; | 4584 unsigned long flags; |
| 4585 union iwreq_data wrqu; |
| 4591 | 4586 |
| 4592 if(ar->arNetworkType & AP_NETWORK) { | 4587 if(ar->arNetworkType & AP_NETWORK) { |
| 4593 union iwreq_data wrqu; | 4588 union iwreq_data wrqu; |
| 4594 struct sk_buff *skb; | 4589 struct sk_buff *skb; |
| 4595 | 4590 |
| 4596 if(!remove_sta(ar, bssid, protocolReasonStatus)) { | 4591 if(!remove_sta(ar, bssid, protocolReasonStatus)) { |
| 4597 return; | 4592 return; |
| 4598 } | 4593 } |
| 4599 | 4594 |
| 4600 /* If there are no more associated STAs, empty the mcast PS q */ | 4595 /* If there are no more associated STAs, empty the mcast PS q */ |
| 4601 if (ar->sta_list_index == 0) { | 4596 if (ar->sta_list_index == 0) { |
| 4602 A_MUTEX_LOCK(&ar->mcastpsqLock); | 4597 A_MUTEX_LOCK(&ar->mcastpsqLock); |
| 4603 while (!A_NETBUF_QUEUE_EMPTY(&ar->mcastpsq)) { | 4598 while (!A_NETBUF_QUEUE_EMPTY(&ar->mcastpsq)) { |
| 4604 skb = A_NETBUF_DEQUEUE(&ar->mcastpsq); | 4599 skb = A_NETBUF_DEQUEUE(&ar->mcastpsq); |
| 4605 A_NETBUF_FREE(skb); | 4600 A_NETBUF_FREE(skb); |
| 4606 } | 4601 } |
| 4607 A_MUTEX_UNLOCK(&ar->mcastpsqLock); | 4602 A_MUTEX_UNLOCK(&ar->mcastpsqLock); |
| 4608 | 4603 |
| 4609 /* Clear the LSB of the BitMapCtl field of the TIM IE */ | 4604 /* Clear the LSB of the BitMapCtl field of the TIM IE */ |
| 4610 wmi_set_pvb_cmd(ar->arWmi, MCAST_AID, 0); | 4605 if (ar->arWmiReady) { |
| 4606 wmi_set_pvb_cmd(ar->arWmi, MCAST_AID, 0); |
| 4607 } |
| 4611 } | 4608 } |
| 4612 | 4609 |
| 4613 if(!IS_MAC_BCAST(bssid)) { | 4610 if(!IS_MAC_BCAST(bssid)) { |
| 4614 /* Send event to application */ | 4611 /* Send event to application */ |
| 4615 A_MEMZERO(&wrqu, sizeof(wrqu)); | 4612 A_MEMZERO(&wrqu, sizeof(wrqu)); |
| 4616 A_MEMCPY(wrqu.addr.sa_data, bssid, ATH_MAC_LEN); | 4613 A_MEMCPY(wrqu.addr.sa_data, bssid, ATH_MAC_LEN); |
| 4617 wireless_send_event(ar->arNetDev, IWEVEXPIRED, &wrqu, NULL); | 4614 wireless_send_event(ar->arNetDev, IWEVEXPIRED, &wrqu, NULL); |
| 4618 } | 4615 } |
| 4619 return; | 4616 return; |
| 4620 } | 4617 } |
| 4621 | 4618 |
| 4622 #ifdef ATH6K_CONFIG_CFG80211 | 4619 #ifdef ATH6K_CONFIG_CFG80211 |
| 4623 ar6k_cfg80211_disconnect_event(ar, reason, bssid, | 4620 ar6k_cfg80211_disconnect_event(ar, reason, bssid, |
| 4624 assocRespLen, assocInfo, | 4621 assocRespLen, assocInfo, |
| 4625 protocolReasonStatus); | 4622 protocolReasonStatus); |
| 4626 #endif /* ATH6K_CONFIG_CFG80211 */ | 4623 #endif /* ATH6K_CONFIG_CFG80211 */ |
| 4627 | 4624 |
| 4628 if (NO_NETWORK_AVAIL != reason) | 4625 /* Send disconnect event to supplicant */ |
| 4629 { | 4626 A_MEMZERO(&wrqu, sizeof(wrqu)); |
| 4630 union iwreq_data wrqu; | 4627 wrqu.addr.sa_family = ARPHRD_ETHER; |
| 4631 A_MEMZERO(&wrqu, sizeof(wrqu)); | 4628 wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL); |
| 4632 wrqu.addr.sa_family = ARPHRD_ETHER; | |
| 4633 | 4629 |
| 4634 /* Send disconnect event to supplicant */ | |
| 4635 wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL); | |
| 4636 } | |
| 4637 /* it is necessary to clear the host-side rx aggregation state */ | 4630 /* it is necessary to clear the host-side rx aggregation state */ |
| 4638 | |
| 4639 aggr_reset_state(ar->aggr_cntxt); | 4631 aggr_reset_state(ar->aggr_cntxt); |
| 4640 | 4632 |
| 4641 A_UNTIMEOUT(&ar->disconnect_timer); | 4633 A_UNTIMEOUT(&ar->disconnect_timer); |
| 4642 | 4634 |
| 4643 A_PRINTF("AR6000 disconnected"); | 4635 A_PRINTF("AR6000 disconnected"); |
| 4644 if (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]) { | 4636 if (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]) { |
| 4645 A_PRINTF(" from %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ", | 4637 A_PRINTF(" from %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ", |
| 4646 bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); | 4638 bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); |
| 4647 } | 4639 } |
| 4648 | 4640 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4659 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_CONNECT,("\n")); | 4651 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_CONNECT,("\n")); |
| 4660 /* | 4652 /* |
| 4661 * If the event is due to disconnect cmd from the host, only they the target | 4653 * If the event is due to disconnect cmd from the host, only they the target |
| 4662 * would stop trying to connect. Under any other condition, target would | 4654 * would stop trying to connect. Under any other condition, target would |
| 4663 * keep trying to connect. | 4655 * keep trying to connect. |
| 4664 * | 4656 * |
| 4665 */ | 4657 */ |
| 4666 if( reason == DISCONNECT_CMD) | 4658 if( reason == DISCONNECT_CMD) |
| 4667 { | 4659 { |
| 4668 ar->arConnectPending = FALSE; | 4660 ar->arConnectPending = FALSE; |
| 4669 if (!ar->arUserBssFilter) { | 4661 if ((!ar->arUserBssFilter) && (ar->arWmiReady)) { |
| 4670 wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0); | 4662 wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0); |
| 4671 } | 4663 } |
| 4672 } else { | 4664 } else { |
| 4673 ar->arConnectPending = TRUE; | 4665 ar->arConnectPending = TRUE; |
| 4674 if (((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x11)) || | 4666 if (((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x11)) || |
| 4675 ((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x0) && (recon
nect_flag == 1))) { | 4667 ((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x0) && (recon
nect_flag == 1))) { |
| 4676 ar->arConnected = TRUE; | 4668 ar->arConnected = TRUE; |
| 4677 return; | 4669 return; |
| 4678 } | 4670 } |
| 4679 } | 4671 } |
| 4680 | 4672 |
| 4681 if (reason == NO_NETWORK_AVAIL) | 4673 if ((reason == NO_NETWORK_AVAIL) && (ar->arWmiReady)) |
| 4682 { | 4674 { |
| 4683 bss_t *pWmiSsidnode = NULL; | 4675 bss_t *pWmiSsidnode = NULL; |
| 4684 | 4676 |
| 4685 /* remove the current associated bssid node */ | 4677 /* remove the current associated bssid node */ |
| 4686 wmi_free_node (ar->arWmi, bssid); | 4678 wmi_free_node (ar->arWmi, bssid); |
| 4687 | 4679 |
| 4688 /* | 4680 /* |
| 4689 * In case any other same SSID nodes are present | 4681 * In case any other same SSID nodes are present |
| 4690 * remove it, since those nodes also not available now | 4682 * remove it, since those nodes also not available now |
| 4691 */ | 4683 */ |
| 4692 do | 4684 do |
| 4693 { | 4685 { |
| 4694 /* | 4686 /* |
| 4695 * Find the nodes based on SSID and remove it | 4687 * Find the nodes based on SSID and remove it |
| 4696 * NOTE :: This case will not work out for Hidden-SSID | 4688 * NOTE :: This case will not work out for Hidden-SSID |
| 4697 */ | 4689 */ |
| 4698 pWmiSsidnode = wmi_find_Ssidnode (ar->arWmi, ar->arSsid, ar->arSsidL
en, FALSE, TRUE); | 4690 pWmiSsidnode = wmi_find_Ssidnode (ar->arWmi, ar->arSsid, ar->arSsidL
en, FALSE, TRUE); |
| 4699 | 4691 |
| 4700 if (pWmiSsidnode) | 4692 if (pWmiSsidnode) |
| 4701 { | 4693 { |
| 4702 wmi_free_node (ar->arWmi, pWmiSsidnode->ni_macaddr); | 4694 wmi_free_node (ar->arWmi, pWmiSsidnode->ni_macaddr); |
| 4703 } | 4695 } |
| 4704 | 4696 |
| 4705 }while (pWmiSsidnode); | 4697 } while (pWmiSsidnode); |
| 4706 | |
| 4707 #if 0 | |
| 4708 /* | |
| 4709 * Issuing a disconnect cmd prevent the firmware from | |
| 4710 * continuing the scan and connect to the AP, if the AP | |
| 4711 * cannot be found in 10 seconds. The user has to issue | |
| 4712 * the iwconfig command again to connect to the AP. | |
| 4713 * This change came in CL#575412 (EV# 59469) has to | |
| 4714 * be fixed in a different way | |
| 4715 */ | |
| 4716 ar6000_init_profile_info(ar); | |
| 4717 wmi_disconnect_cmd(ar->arWmi); | |
| 4718 #else | |
| 4719 { /* FIXME, This code is necessary if don't invoke | |
| 4720 * wmi_disconnect_cmd. FIXME if you has fixed above | |
| 4721 * EV# 59469 | |
| 4722 */ | |
| 4723 union iwreq_data wrqu; | |
| 4724 A_MEMZERO(&wrqu, sizeof(wrqu)); | |
| 4725 wrqu.addr.sa_family = ARPHRD_ETHER; | |
| 4726 | |
| 4727 /* Send disconnect event to supplicant */ | |
| 4728 wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL); | |
| 4729 } | |
| 4730 | |
| 4731 #endif | |
| 4732 } | 4698 } |
| 4733 | 4699 |
| 4734 /* Update connect & link status atomically */ | 4700 /* Update connect & link status atomically */ |
| 4735 spin_lock_irqsave(&ar->arLock, flags); | 4701 spin_lock_irqsave(&ar->arLock, flags); |
| 4736 ar->arConnected = FALSE; | 4702 ar->arConnected = FALSE; |
| 4737 netif_carrier_off(ar->arNetDev); | 4703 netif_carrier_off(ar->arNetDev); |
| 4738 spin_unlock_irqrestore(&ar->arLock, flags); | 4704 spin_unlock_irqrestore(&ar->arLock, flags); |
| 4739 | 4705 |
| 4740 if( (reason != CSERV_DISCONNECT) || (reconnect_flag != 1) ) { | 4706 if( (reason != CSERV_DISCONNECT) || (reconnect_flag != 1) ) { |
| 4741 reconnect_flag = 0; | 4707 reconnect_flag = 0; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4781 } | 4747 } |
| 4782 } | 4748 } |
| 4783 | 4749 |
| 4784 void | 4750 void |
| 4785 ar6000_aggr_rcv_delba_req_evt(AR_SOFTC_T *ar, WMI_DELBA_EVENT *evt) | 4751 ar6000_aggr_rcv_delba_req_evt(AR_SOFTC_T *ar, WMI_DELBA_EVENT *evt) |
| 4786 { | 4752 { |
| 4787 aggr_recv_delba_req_evt(ar->aggr_cntxt, evt->tid); | 4753 aggr_recv_delba_req_evt(ar->aggr_cntxt, evt->tid); |
| 4788 } | 4754 } |
| 4789 #endif | 4755 #endif |
| 4790 | 4756 |
| 4757 void register_pal_cb(ar6k_pal_config_t *palConfig_p) |
| 4758 { |
| 4759 ar6k_pal_config_g = *palConfig_p; |
| 4760 } |
| 4761 |
| 4791 void | 4762 void |
| 4792 ar6000_hci_event_rcv_evt(struct ar6_softc *ar, WMI_HCI_EVENT *cmd) | 4763 ar6000_hci_event_rcv_evt(struct ar6_softc *ar, WMI_HCI_EVENT *cmd) |
| 4793 { | 4764 { |
| 4794 void *osbuf = NULL; | 4765 void *osbuf = NULL; |
| 4795 A_INT8 i; | 4766 A_INT8 i; |
| 4796 A_UINT8 size, *buf; | 4767 A_UINT8 size, *buf; |
| 4797 A_STATUS ret = A_OK; | 4768 A_STATUS ret = A_OK; |
| 4798 | 4769 |
| 4799 size = cmd->evt_buf_sz + 4; | 4770 size = cmd->evt_buf_sz + 4; |
| 4800 osbuf = A_NETBUF_ALLOC(size); | 4771 osbuf = A_NETBUF_ALLOC(size); |
| 4801 if (osbuf == NULL) { | 4772 if (osbuf == NULL) { |
| 4802 ret = A_NO_MEMORY; | 4773 ret = A_NO_MEMORY; |
| 4803 A_PRINTF("Error in allocating netbuf \n"); | 4774 A_PRINTF("Error in allocating netbuf \n"); |
| 4804 return; | 4775 return; |
| 4805 } | 4776 } |
| 4806 | 4777 |
| 4807 A_NETBUF_PUT(osbuf, size); | 4778 A_NETBUF_PUT(osbuf, size); |
| 4808 buf = (A_UINT8 *)A_NETBUF_DATA(osbuf); | 4779 buf = (A_UINT8 *)A_NETBUF_DATA(osbuf); |
| 4809 /* First 2-bytes carry HCI event/ACL data type | 4780 /* First 2-bytes carry HCI event/ACL data type |
| 4810 * the next 2 are free | 4781 * the next 2 are free |
| 4811 */ | 4782 */ |
| 4812 *((short *)buf) = WMI_HCI_EVENT_EVENTID; | 4783 *((short *)buf) = WMI_HCI_EVENT_EVENTID; |
| 4813 buf += sizeof(int); | 4784 buf += sizeof(int); |
| 4814 A_MEMCPY(buf, cmd->buf, cmd->evt_buf_sz); | 4785 A_MEMCPY(buf, cmd->buf, cmd->evt_buf_sz); |
| 4815 | 4786 |
| 4787 if(ar6k_pal_config_g.fpar6k_pal_recv_pkt) |
| 4788 { |
| 4789 /* pass the cmd packet to PAL driver */ |
| 4790 if((*ar6k_pal_config_g.fpar6k_pal_recv_pkt)(ar->hcipal_info, osbuf) == TRU
E) |
| 4791 return; |
| 4792 } |
| 4816 ar6000_deliver_frames_to_nw_stack(ar->arNetDev, osbuf); | 4793 ar6000_deliver_frames_to_nw_stack(ar->arNetDev, osbuf); |
| 4817 if(loghci) { | 4794 if(loghci) { |
| 4818 A_PRINTF_LOG("HCI Event From PAL <-- \n"); | 4795 A_PRINTF_LOG("HCI Event From PAL <-- \n"); |
| 4819 for(i = 0; i < cmd->evt_buf_sz; i++) { | 4796 for(i = 0; i < cmd->evt_buf_sz; i++) { |
| 4820 A_PRINTF_LOG("0x%02x ", cmd->buf[i]); | 4797 A_PRINTF_LOG("0x%02x ", cmd->buf[i]); |
| 4821 if((i % 10) == 0) { | 4798 if((i % 10) == 0) { |
| 4822 A_PRINTF_LOG("\n"); | 4799 A_PRINTF_LOG("\n"); |
| 4823 } | 4800 } |
| 4824 } | 4801 } |
| 4825 A_PRINTF_LOG("\n"); | 4802 A_PRINTF_LOG("\n"); |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5093 if (cookie == ar->arHBChallengeResp.seqNum) { | 5070 if (cookie == ar->arHBChallengeResp.seqNum) { |
| 5094 ar->arHBChallengeResp.outstanding = FALSE; | 5071 ar->arHBChallengeResp.outstanding = FALSE; |
| 5095 } | 5072 } |
| 5096 } | 5073 } |
| 5097 } | 5074 } |
| 5098 | 5075 |
| 5099 | 5076 |
| 5100 void | 5077 void |
| 5101 ar6000_reportError_event(AR_SOFTC_T *ar, WMI_TARGET_ERROR_VAL errorVal) | 5078 ar6000_reportError_event(AR_SOFTC_T *ar, WMI_TARGET_ERROR_VAL errorVal) |
| 5102 { | 5079 { |
| 5103 char *errString[] = { | 5080 » static const char * const errString[] = { |
| 5104 [WMI_TARGET_PM_ERR_FAIL] "WMI_TARGET_PM_ERR_FAIL", | 5081 » » [WMI_TARGET_PM_ERR_FAIL] "WMI_TARGET_PM_ERR_FAIL", |
| 5105 [WMI_TARGET_KEY_NOT_FOUND] "WMI_TARGET_KEY_NOT_FOUND", | 5082 » » [WMI_TARGET_KEY_NOT_FOUND] "WMI_TARGET_KEY_NOT_FOUND", |
| 5106 [WMI_TARGET_DECRYPTION_ERR] "WMI_TARGET_DECRYPTION_ERR", | 5083 » » [WMI_TARGET_DECRYPTION_ERR] "WMI_TARGET_DECRYPTION_ERR", |
| 5107 [WMI_TARGET_BMISS] "WMI_TARGET_BMISS", | 5084 » » [WMI_TARGET_BMISS] "WMI_TARGET_BMISS", |
| 5108 [WMI_PSDISABLE_NODE_JOIN] "WMI_PSDISABLE_NODE_JOIN" | 5085 » » [WMI_PSDISABLE_NODE_JOIN] "WMI_PSDISABLE_NODE_JOIN" |
| 5109 }; | 5086 » }; |
| 5110 | 5087 |
| 5111 A_PRINTF("AR6000 Error on Target. Error = 0x%x\n", errorVal); | 5088 A_PRINTF("AR6000 Error on Target. Error = 0x%x\n", errorVal); |
| 5112 | 5089 |
| 5113 /* One error is reported at a time, and errorval is a bitmask */ | 5090 /* One error is reported at a time, and errorval is a bitmask */ |
| 5114 if(errorVal & (errorVal - 1)) | 5091 if(errorVal & (errorVal - 1)) |
| 5115 return; | 5092 return; |
| 5116 | 5093 |
| 5117 A_PRINTF("AR6000 Error type = "); | 5094 A_PRINTF("AR6000 Error type = "); |
| 5118 switch(errorVal) | 5095 switch(errorVal) |
| 5119 { | 5096 { |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5276 (bih->frameType != PROBERESP_FTYPE))) | 5253 (bih->frameType != PROBERESP_FTYPE))) |
| 5277 { | 5254 { |
| 5278 return; | 5255 return; |
| 5279 } | 5256 } |
| 5280 | 5257 |
| 5281 if ((skb = A_NETBUF_ALLOC_RAW(len)) != NULL) { | 5258 if ((skb = A_NETBUF_ALLOC_RAW(len)) != NULL) { |
| 5282 | 5259 |
| 5283 A_NETBUF_PUT(skb, len); | 5260 A_NETBUF_PUT(skb, len); |
| 5284 A_MEMCPY(A_NETBUF_DATA(skb), datap, len); | 5261 A_MEMCPY(A_NETBUF_DATA(skb), datap, len); |
| 5285 skb->dev = ar->arNetDev; | 5262 skb->dev = ar->arNetDev; |
| 5286 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) | |
| 5287 A_MEMCPY(skb_mac_header(skb), A_NETBUF_DATA(skb), 6); | 5263 A_MEMCPY(skb_mac_header(skb), A_NETBUF_DATA(skb), 6); |
| 5288 #else | |
| 5289 skb->mac.raw = A_NETBUF_DATA(skb); | |
| 5290 #endif | |
| 5291 skb->ip_summed = CHECKSUM_NONE; | 5264 skb->ip_summed = CHECKSUM_NONE; |
| 5292 skb->pkt_type = PACKET_OTHERHOST; | 5265 skb->pkt_type = PACKET_OTHERHOST; |
| 5293 skb->protocol = __constant_htons(0x0019); | 5266 skb->protocol = __constant_htons(0x0019); |
| 5294 netif_rx(skb); | 5267 netif_rx(skb); |
| 5295 } | 5268 } |
| 5296 } | 5269 } |
| 5297 | 5270 |
| 5298 A_UINT32 wmiSendCmdNum; | 5271 A_UINT32 wmiSendCmdNum; |
| 5299 | 5272 |
| 5300 A_STATUS | 5273 A_STATUS |
| 5301 ar6000_control_tx(void *devt, void *osbuf, HTC_ENDPOINT_ID eid) | 5274 ar6000_control_tx(void *devt, void *osbuf, HTC_ENDPOINT_ID eid) |
| 5302 { | 5275 { |
| 5303 AR_SOFTC_T *ar = (AR_SOFTC_T *)devt; | 5276 AR_SOFTC_T *ar = (AR_SOFTC_T *)devt; |
| 5304 A_STATUS status = A_OK; | 5277 A_STATUS status = A_OK; |
| 5305 struct ar_cookie *cookie = NULL; | 5278 struct ar_cookie *cookie = NULL; |
| 5306 int i; | 5279 int i; |
| 5307 #ifdef CONFIG_PM | 5280 #ifdef CONFIG_PM |
| 5308 if (ar->arWowState) { | 5281 if (ar->arWowState != WLAN_WOW_STATE_NONE) { |
| 5309 A_NETBUF_FREE(osbuf); | 5282 A_NETBUF_FREE(osbuf); |
| 5310 return A_EACCES; | 5283 return A_EACCES; |
| 5311 } | 5284 } |
| 5312 #endif /* CONFIG_PM */ | 5285 #endif /* CONFIG_PM */ |
| 5313 /* take lock to protect ar6000_alloc_cookie() */ | 5286 /* take lock to protect ar6000_alloc_cookie() */ |
| 5314 AR6000_SPIN_LOCK(&ar->arLock, 0); | 5287 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| 5315 | 5288 |
| 5316 do { | 5289 do { |
| 5317 | 5290 |
| 5318 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar_contrstatus = ol_tx: skb=0x%x, le
n=0x%x eid =%d\n", | 5291 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_TX,("ar_contrstatus = ol_tx: skb=0x%lx, l
en=0x%x eid =%d\n", |
| 5319 (A_UINT32)osbuf, A_NETBUF_LEN(osbuf), eid)); | 5292 (unsigned long)osbuf, A_NETBUF_LEN(osbuf), eid)); |
| 5320 | 5293 |
| 5321 if (ar->arWMIControlEpFull && (eid == ar->arControlEp)) { | 5294 if (ar->arWMIControlEpFull && (eid == ar->arControlEp)) { |
| 5322 /* control endpoint is full, don't allocate resources, we | 5295 /* control endpoint is full, don't allocate resources, we |
| 5323 * are just going to drop this packet */ | 5296 * are just going to drop this packet */ |
| 5324 cookie = NULL; | 5297 cookie = NULL; |
| 5325 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" WMI Control EP full, dropping packe
t : 0x%X, len:%d \n", | 5298 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" WMI Control EP full, dropping packe
t : 0x%lX, len:%d \n", |
| 5326 (A_UINT32)osbuf, A_NETBUF_LEN(osbuf))); | 5299 (unsigned long)osbuf, A_NETBUF_LEN(osbuf))); |
| 5327 } else { | 5300 } else { |
| 5328 cookie = ar6000_alloc_cookie(ar); | 5301 cookie = ar6000_alloc_cookie(ar); |
| 5329 } | 5302 } |
| 5330 | 5303 |
| 5331 if (cookie == NULL) { | 5304 if (cookie == NULL) { |
| 5332 status = A_NO_MEMORY; | 5305 status = A_NO_MEMORY; |
| 5333 break; | 5306 break; |
| 5334 } | 5307 } |
| 5335 | 5308 |
| 5336 if(logWmiRawMsgs) { | 5309 if(logWmiRawMsgs) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5349 ar->arTxPending[eid]++; | 5322 ar->arTxPending[eid]++; |
| 5350 | 5323 |
| 5351 if (eid != ar->arControlEp) { | 5324 if (eid != ar->arControlEp) { |
| 5352 ar->arTotalTxDataPending++; | 5325 ar->arTotalTxDataPending++; |
| 5353 } | 5326 } |
| 5354 } | 5327 } |
| 5355 | 5328 |
| 5356 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 5329 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 5357 | 5330 |
| 5358 if (cookie != NULL) { | 5331 if (cookie != NULL) { |
| 5359 cookie->arc_bp[0] = (A_UINT32)osbuf; | 5332 cookie->arc_bp[0] = (unsigned long)osbuf; |
| 5360 cookie->arc_bp[1] = 0; | 5333 cookie->arc_bp[1] = 0; |
| 5361 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, | 5334 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, |
| 5362 cookie, | 5335 cookie, |
| 5363 A_NETBUF_DATA(osbuf), | 5336 A_NETBUF_DATA(osbuf), |
| 5364 A_NETBUF_LEN(osbuf), | 5337 A_NETBUF_LEN(osbuf), |
| 5365 eid, | 5338 eid, |
| 5366 AR6K_CONTROL_PKT_TAG); | 5339 AR6K_CONTROL_PKT_TAG); |
| 5367 /* this interface is asynchronous, if there is an error, cleanup wil
l happen in the | 5340 /* this interface is asynchronous, if there is an error, cleanup wil
l happen in the |
| 5368 * TX completion callback */ | 5341 * TX completion callback */ |
| 5369 HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt); | 5342 HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt); |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6125 | 6098 |
| 6126 wmi_ap_profile_commit(ar->arWmi, &p); | 6099 wmi_ap_profile_commit(ar->arWmi, &p); |
| 6127 spin_lock_irqsave(&ar->arLock, flags); | 6100 spin_lock_irqsave(&ar->arLock, flags); |
| 6128 ar->arConnected = TRUE; | 6101 ar->arConnected = TRUE; |
| 6129 netif_carrier_on(ar->arNetDev); | 6102 netif_carrier_on(ar->arNetDev); |
| 6130 spin_unlock_irqrestore(&ar->arLock, flags); | 6103 spin_unlock_irqrestore(&ar->arLock, flags); |
| 6131 ar->ap_profile_flag = 0; | 6104 ar->ap_profile_flag = 0; |
| 6132 return 0; | 6105 return 0; |
| 6133 } | 6106 } |
| 6134 | 6107 |
| 6135 | |
| 6136 A_STATUS | 6108 A_STATUS |
| 6137 ar6000_connect_to_ap(struct ar6_softc *ar) | 6109 ar6000_connect_to_ap(struct ar6_softc *ar) |
| 6138 { | 6110 { |
| 6139 /* The ssid length check prevents second "essid off" from the user, | 6111 /* The ssid length check prevents second "essid off" from the user, |
| 6140 to be treated as a connect cmd. The second "essid off" is ignored. | 6112 to be treated as a connect cmd. The second "essid off" is ignored. |
| 6141 */ | 6113 */ |
| 6142 if((ar->arWmiReady == TRUE) && (ar->arSsidLen > 0) && ar->arNetworkType!=AP_
NETWORK) | 6114 if((ar->arWmiReady == TRUE) && (ar->arSsidLen > 0) && ar->arNetworkType!=AP_
NETWORK) |
| 6143 { | 6115 { |
| 6144 A_STATUS status; | 6116 A_STATUS status; |
| 6145 if((ADHOC_NETWORK != ar->arNetworkType) && | 6117 if((ADHOC_NETWORK != ar->arNetworkType) && |
| (...skipping 17 matching lines...) Expand all Loading... |
| 6163 ar->arConnectCtrlFlags |= CONNECT_IGNORE_WPAx_GROUP_CIPHER; | 6135 ar->arConnectCtrlFlags |= CONNECT_IGNORE_WPAx_GROUP_CIPHER; |
| 6164 } | 6136 } |
| 6165 #endif | 6137 #endif |
| 6166 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_CONNECT,("Connect called with authmode %d
dot11 auth %d"\ | 6138 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_CONNECT,("Connect called with authmode %d
dot11 auth %d"\ |
| 6167 " PW crypto %d PW crypto Len %d GRP crypto %d"\ | 6139 " PW crypto %d PW crypto Len %d GRP crypto %d"\ |
| 6168 " GRP crypto Len %d\n", | 6140 " GRP crypto Len %d\n", |
| 6169 ar->arAuthMode, ar->arDot11AuthMode, | 6141 ar->arAuthMode, ar->arDot11AuthMode, |
| 6170 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen, | 6142 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen, |
| 6171 ar->arGroupCrypto, ar->arGroupCryptoLen)); | 6143 ar->arGroupCrypto, ar->arGroupCryptoLen)); |
| 6172 reconnect_flag = 0; | 6144 reconnect_flag = 0; |
| 6173 /* Set the listen interval into 1000TUs. This value will be indicated to
Ap in the conn. | 6145 /* Set the listen interval into 1000TUs or more. This value will be indi
cated to Ap in the conn. |
| 6174 later set it back locally at the STA to 100/1000 TUs depending on the
power mode */ | 6146 later set it back locally at the STA to 100/1000 TUs depending on the
power mode */ |
| 6175 if ((ar->arNetworkType == INFRA_NETWORK)) { | 6147 if ((ar->arNetworkType == INFRA_NETWORK)) { |
| 6176 wmi_listeninterval_cmd(ar->arWmi, A_MAX_WOW_LISTEN_INTERVAL, 0); | 6148 wmi_listeninterval_cmd(ar->arWmi, max(ar->arListenIntervalT, (A_UINT
16)A_MAX_WOW_LISTEN_INTERVAL), 0); |
| 6177 } | 6149 } |
| 6178 status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType, | 6150 status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType, |
| 6179 ar->arDot11AuthMode, ar->arAuthMode, | 6151 ar->arDot11AuthMode, ar->arAuthMode, |
| 6180 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen, | 6152 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen, |
| 6181 ar->arGroupCrypto,ar->arGroupCryptoLen, | 6153 ar->arGroupCrypto,ar->arGroupCryptoLen, |
| 6182 ar->arSsidLen, ar->arSsid, | 6154 ar->arSsidLen, ar->arSsid, |
| 6183 ar->arReqBssid, ar->arChannelHint, | 6155 ar->arReqBssid, ar->arChannelHint, |
| 6184 ar->arConnectCtrlFlags); | 6156 ar->arConnectCtrlFlags); |
| 6185 if (status != A_OK) { | 6157 if (status != A_OK) { |
| 6186 wmi_listeninterval_cmd(ar->arWmi, ar->arListenIntervalT, ar->arListe
nIntervalB); | 6158 wmi_listeninterval_cmd(ar->arWmi, ar->arListenIntervalT, ar->arListe
nIntervalB); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 6197 } | 6169 } |
| 6198 | 6170 |
| 6199 ar->arConnectCtrlFlags &= ~CONNECT_DO_WPA_OFFLOAD; | 6171 ar->arConnectCtrlFlags &= ~CONNECT_DO_WPA_OFFLOAD; |
| 6200 | 6172 |
| 6201 ar->arConnectPending = TRUE; | 6173 ar->arConnectPending = TRUE; |
| 6202 return status; | 6174 return status; |
| 6203 } | 6175 } |
| 6204 return A_ERROR; | 6176 return A_ERROR; |
| 6205 } | 6177 } |
| 6206 | 6178 |
| 6207 A_STATUS | |
| 6208 ar6000_set_wlan_state(struct ar6_softc *ar, AR6000_WLAN_STATE state) | |
| 6209 { | |
| 6210 A_STATUS status = A_OK; | |
| 6211 AR6000_WLAN_STATE oldstate = ar->arWlanState; | |
| 6212 if (ar->arWmiReady == FALSE || | |
| 6213 (state!=WLAN_DISABLED && state!=WLAN_ENABLED)) { | |
| 6214 return A_ERROR; | |
| 6215 } | |
| 6216 if (state == ar->arWlanState) { | |
| 6217 return A_OK; | |
| 6218 } | |
| 6219 | |
| 6220 if (down_interruptible(&ar->arSem)) { | |
| 6221 return -ERESTARTSYS; | |
| 6222 } | |
| 6223 | |
| 6224 if (ar->bIsDestroyProgress) { | |
| 6225 up(&ar->arSem); | |
| 6226 return -EBUSY; | |
| 6227 } | |
| 6228 | |
| 6229 ar->arWlanState = state; | |
| 6230 do { | |
| 6231 if (ar->arWlanState == WLAN_ENABLED) { | |
| 6232 A_UINT16 fg_start_period = (ar->scParams.fg_start_period==0) ? 1 : a
r->scParams.fg_start_period; | |
| 6233 WMI_SET_HOST_SLEEP_MODE_CMD hostSleepMode = { TRUE, FALSE}; | |
| 6234 WMI_REPORT_SLEEP_STATE_EVENT wmiSleepEvent ; | |
| 6235 | |
| 6236 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_AWAKE; | |
| 6237 if ((status=wmi_set_host_sleep_mode_cmd(ar->arWmi, &hostSleepMode))
!= A_OK) { | |
| 6238 break; | |
| 6239 } | |
| 6240 ar6000_send_event_to_app(ar, WMI_REPORT_SLEEP_STATE_EVENTID, (A_UINT
8*)&wmiSleepEvent, | |
| 6241 sizeof(WMI_REPORT_SLEEP_STATE_EVENTID)); | |
| 6242 /* Enable foreground scanning */ | |
| 6243 if ((status=wmi_scanparams_cmd(ar->arWmi, fg_start_period, | |
| 6244 ar->scParams.fg_end_period, | |
| 6245 ar->scParams.bg_period, | |
| 6246 ar->scParams.minact_chdwell_time, | |
| 6247 ar->scParams.maxact_chdwell_time, | |
| 6248 ar->scParams.pas_chdwell_time, | |
| 6249 ar->scParams.shortScanRatio, | |
| 6250 ar->scParams.scanCtrlFlags, | |
| 6251 ar->scParams.max_dfsch_act_time, | |
| 6252 ar->scParams.maxact_scan_per_ssid)) != A_OK)
{ | |
| 6253 break; | |
| 6254 } | |
| 6255 if (ar->arSsidLen) { | |
| 6256 if (ar6000_connect_to_ap(ar) != A_OK) { | |
| 6257 /* no need to report error if connection failed */ | |
| 6258 break; | |
| 6259 } | |
| 6260 } | |
| 6261 } else { | |
| 6262 WMI_SET_WOW_MODE_CMD wowMode = { .enable_wow = FALSE }; | |
| 6263 | |
| 6264 WMI_SET_HOST_SLEEP_MODE_CMD hostSleepMode; | |
| 6265 WMI_REPORT_SLEEP_STATE_EVENT wmiSleepEvent; | |
| 6266 | |
| 6267 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_DEEP_SLEEP; | |
| 6268 /* make sure we disable wow for deep sleep */ | |
| 6269 if ((status=wmi_set_wow_mode_cmd(ar->arWmi, &wowMode))!=A_OK) { | |
| 6270 break; | |
| 6271 } | |
| 6272 | |
| 6273 ar6000_send_event_to_app(ar, WMI_REPORT_SLEEP_STATE_EVENTID, (A_UINT
8*)&wmiSleepEvent, | |
| 6274 sizeof(WMI_REPORT_SLEEP_STATE_EVENTID)); | |
| 6275 | |
| 6276 /* Disconnect from the AP and disable foreground scanning */ | |
| 6277 AR6000_SPIN_LOCK(&ar->arLock, 0); | |
| 6278 if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) { | |
| 6279 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | |
| 6280 wmi_disconnect_cmd(ar->arWmi); | |
| 6281 } else { | |
| 6282 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | |
| 6283 } | |
| 6284 | |
| 6285 ar->scan_triggered = 0; | |
| 6286 | |
| 6287 if ((status=wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, 0, 0, 0, 0, 0,
0, 0, 0)) != A_OK) { | |
| 6288 break; | |
| 6289 } | |
| 6290 ar6000_TxDataCleanup(ar); | |
| 6291 #ifndef ATH6K_CONFIG_OTA_MODE | |
| 6292 wmi_powermode_cmd(ar->arWmi, REC_POWER); | |
| 6293 #endif | |
| 6294 hostSleepMode.awake = FALSE; | |
| 6295 hostSleepMode.asleep = TRUE; | |
| 6296 if ((status=wmi_set_host_sleep_mode_cmd(ar->arWmi, &hostSleepMode))!
=A_OK) { | |
| 6297 break; | |
| 6298 } | |
| 6299 if (ar->arTxPending[ar->arControlEp]) { | |
| 6300 long timeleft = wait_event_interruptible_timeout(arEvent, | |
| 6301 ar->arTxPending[ar->arControlEp] == 0, wmiti
meout * HZ); | |
| 6302 if (!timeleft || signal_pending(current)) { | |
| 6303 status = A_ERROR; | |
| 6304 break; | |
| 6305 } | |
| 6306 } | |
| 6307 } | |
| 6308 } while (0); | |
| 6309 if (status!=A_OK) { | |
| 6310 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Fail to setup WLAN state %d\n", ar->arWl
anState)); | |
| 6311 ar->arWlanState = oldstate; | |
| 6312 } | |
| 6313 up(&ar->arSem); | |
| 6314 | |
| 6315 return status; | |
| 6316 } | |
| 6317 | |
| 6318 A_STATUS | 6179 A_STATUS |
| 6319 ar6000_ap_mode_get_wpa_ie(struct ar6_softc *ar, struct ieee80211req_wpaie *wpaie
) | 6180 ar6000_ap_mode_get_wpa_ie(struct ar6_softc *ar, struct ieee80211req_wpaie *wpaie
) |
| 6320 { | 6181 { |
| 6321 sta_t *conn = NULL; | 6182 sta_t *conn = NULL; |
| 6322 conn = ieee80211_find_conn(ar, wpaie->wpa_macaddr); | 6183 conn = ieee80211_find_conn(ar, wpaie->wpa_macaddr); |
| 6323 | 6184 |
| 6324 A_MEMZERO(wpaie->wpa_ie, IEEE80211_MAX_IE); | 6185 A_MEMZERO(wpaie->wpa_ie, IEEE80211_MAX_IE); |
| 6325 A_MEMZERO(wpaie->rsn_ie, IEEE80211_MAX_IE); | 6186 A_MEMZERO(wpaie->rsn_ie, IEEE80211_MAX_IE); |
| 6326 | 6187 |
| 6327 if(conn) { | 6188 if(conn) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6437 new_skb = A_NETBUF_ALLOC(A_NETBUF_LEN(dupskb)); | 6298 new_skb = A_NETBUF_ALLOC(A_NETBUF_LEN(dupskb)); |
| 6438 | 6299 |
| 6439 if (new_skb == NULL) { | 6300 if (new_skb == NULL) { |
| 6440 AR6000_SPIN_LOCK(&ar->arLock, 0); | 6301 AR6000_SPIN_LOCK(&ar->arLock, 0); |
| 6441 ar6000_free_cookie(ar,cookie); | 6302 ar6000_free_cookie(ar,cookie); |
| 6442 AR6000_SPIN_UNLOCK(&ar->arLock, 0); | 6303 AR6000_SPIN_UNLOCK(&ar->arLock, 0); |
| 6443 break; | 6304 break; |
| 6444 } | 6305 } |
| 6445 | 6306 |
| 6446 A_NETBUF_PUT_DATA(new_skb, A_NETBUF_DATA(dupskb), A_NETBUF_LEN(dupskb)); | 6307 A_NETBUF_PUT_DATA(new_skb, A_NETBUF_DATA(dupskb), A_NETBUF_LEN(dupskb)); |
| 6447 cookie->arc_bp[0] = (A_UINT32)new_skb; | 6308 cookie->arc_bp[0] = (unsigned long)new_skb; |
| 6448 cookie->arc_bp[1] = MapNo; | 6309 cookie->arc_bp[1] = MapNo; |
| 6449 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, | 6310 SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt, |
| 6450 cookie, | 6311 cookie, |
| 6451 A_NETBUF_DATA(new_skb), | 6312 A_NETBUF_DATA(new_skb), |
| 6452 A_NETBUF_LEN(new_skb), | 6313 A_NETBUF_LEN(new_skb), |
| 6453 eid, | 6314 eid, |
| 6454 AR6K_DATA_PKT_TAG); | 6315 AR6K_DATA_PKT_TAG); |
| 6455 | 6316 |
| 6456 cookieArray[i] = cookie; | 6317 cookieArray[i] = cookie; |
| 6457 | 6318 |
| 6458 { | 6319 { |
| 6459 EPPING_HEADER *pHdr = (EPPING_HEADER *)A_NETBUF_DATA(new_skb); | 6320 EPPING_HEADER *pHdr = (EPPING_HEADER *)A_NETBUF_DATA(new_skb); |
| 6460 pHdr->Cmd_h = EPPING_CMD_NO_ECHO; /* do not echo the packet */ | 6321 pHdr->Cmd_h = EPPING_CMD_NO_ECHO; /* do not echo the packet */ |
| 6461 } | 6322 } |
| 6462 } | 6323 } |
| 6463 | 6324 |
| 6464 if (pkts == 0) { | 6325 if (pkts == 0) { |
| 6465 return; | 6326 return; |
| 6466 } | 6327 } |
| 6467 | 6328 |
| 6468 INIT_HTC_PACKET_QUEUE(&pktQueue); | 6329 INIT_HTC_PACKET_QUEUE(&pktQueue); |
| 6469 | 6330 |
| 6470 for (i = 0; i < pkts; i++) { | 6331 for (i = 0; i < pkts; i++) { |
| 6471 HTC_PACKET_ENQUEUE(&pktQueue,&cookieArray[i]->HtcPkt); | 6332 HTC_PACKET_ENQUEUE(&pktQueue,&cookieArray[i]->HtcPkt); |
| 6472 } | 6333 } |
| 6473 | 6334 |
| 6474 HTCSendPktsMultiple(ar->arHtcTarget, &pktQueue); | 6335 HTCSendPktsMultiple(ar->arHtcTarget, &pktQueue); |
| 6475 | 6336 |
| 6476 } | 6337 } |
| 6338 #endif |
| 6477 | 6339 |
| 6340 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT |
| 6341 /* |
| 6342 * Add support for adding and removing a virtual adapter for soft AP. |
| 6343 * Some OS requires different adapters names for station and soft AP mode. |
| 6344 * To support these requirement, create and destory a netdevice instance |
| 6345 * when the AP mode is operational. A full fledged support for virual device |
| 6346 * is not implemented. Rather a virtual interface is created and is linked |
| 6347 * with the existing physical device instance during the operation of the |
| 6348 * AP mode. |
| 6349 */ |
| 6350 |
| 6351 A_STATUS ar6000_start_ap_interface(AR_SOFTC_T *ar) |
| 6352 { |
| 6353 AR_VIRTUAL_INTERFACE_T *arApDev; |
| 6354 |
| 6355 /* Change net_device to point to AP instance */ |
| 6356 arApDev = (AR_VIRTUAL_INTERFACE_T *)ar->arApDev; |
| 6357 ar->arNetDev = arApDev->arNetDev; |
| 6358 |
| 6359 return A_OK; |
| 6360 } |
| 6361 |
| 6362 A_STATUS ar6000_stop_ap_interface(AR_SOFTC_T *ar) |
| 6363 { |
| 6364 AR_VIRTUAL_INTERFACE_T *arApDev; |
| 6365 |
| 6366 /* Change net_device to point to sta instance */ |
| 6367 arApDev = (AR_VIRTUAL_INTERFACE_T *)ar->arApDev; |
| 6368 if (arApDev) { |
| 6369 ar->arNetDev = arApDev->arStaNetDev; |
| 6370 } |
| 6371 |
| 6372 return A_OK; |
| 6373 } |
| 6374 |
| 6375 |
| 6376 A_STATUS ar6000_create_ap_interface(AR_SOFTC_T *ar, char *ap_ifname) |
| 6377 { |
| 6378 struct net_device *dev; |
| 6379 AR_VIRTUAL_INTERFACE_T *arApDev; |
| 6380 |
| 6381 dev = alloc_etherdev(sizeof(AR_VIRTUAL_INTERFACE_T)); |
| 6382 if (dev == NULL) { |
| 6383 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_create_ap_interface: can't alloc
etherdev\n")); |
| 6384 return A_ERROR; |
| 6385 } |
| 6386 |
| 6387 ether_setup(dev); |
| 6388 init_netdev(dev, ap_ifname); |
| 6389 |
| 6390 if (register_netdev(dev)) { |
| 6391 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_create_ap_interface: register_net
dev failed\n")); |
| 6392 return A_ERROR; |
| 6393 } |
| 6394 |
| 6395 arApDev = netdev_priv(dev); |
| 6396 arApDev->arDev = ar; |
| 6397 arApDev->arNetDev = dev; |
| 6398 arApDev->arStaNetDev = ar->arNetDev; |
| 6399 |
| 6400 ar->arApDev = arApDev; |
| 6401 arApNetDev = dev; |
| 6402 |
| 6403 /* Copy the MAC address */ |
| 6404 A_MEMCPY(dev->dev_addr, ar->arNetDev->dev_addr, AR6000_ETH_ADDR_LEN); |
| 6405 |
| 6406 return A_OK; |
| 6407 } |
| 6408 |
| 6409 A_STATUS ar6000_add_ap_interface(AR_SOFTC_T *ar, char *ap_ifname) |
| 6410 { |
| 6411 /* Interface already added, need not proceed further */ |
| 6412 if (ar->arApDev != NULL) { |
| 6413 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_add_ap_interface: interface alrea
dy present \n")); |
| 6414 return A_OK; |
| 6415 } |
| 6416 |
| 6417 if (ar6000_create_ap_interface(ar, ap_ifname) != A_OK) { |
| 6418 return A_ERROR; |
| 6419 } |
| 6420 |
| 6421 A_PRINTF("Add AP interface %s \n",ap_ifname); |
| 6422 |
| 6423 return ar6000_start_ap_interface(ar); |
| 6424 } |
| 6425 |
| 6426 A_STATUS ar6000_remove_ap_interface(AR_SOFTC_T *ar) |
| 6427 { |
| 6428 if (arApNetDev) { |
| 6429 ar6000_stop_ap_interface(ar); |
| 6430 |
| 6431 unregister_netdev(arApNetDev); |
| 6432 #ifndef free_netdev |
| 6433 kfree(arApNetDev); |
| 6434 #else |
| 6435 free_netdev(apApNetDev); |
| 6478 #endif | 6436 #endif |
| 6479 | 6437 |
| 6438 A_PRINTF("Remove AP interface\n"); |
| 6439 } |
| 6440 ar->arApDev = NULL; |
| 6441 arApNetDev = NULL; |
| 6442 |
| 6443 |
| 6444 return A_OK; |
| 6445 } |
| 6446 #endif /* CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT */ |
| 6447 |
| 6448 |
| 6480 #ifdef EXPORT_HCI_BRIDGE_INTERFACE | 6449 #ifdef EXPORT_HCI_BRIDGE_INTERFACE |
| 6481 EXPORT_SYMBOL(setupbtdev); | 6450 EXPORT_SYMBOL(setupbtdev); |
| 6482 #endif | 6451 #endif |
| OLD | NEW |