aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaveen Singh <nsingh@atheros.com>2011-04-21 16:30:36 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-25 19:24:23 -0400
commit37f7949d0ac3f77ebd1ecf479f1f4a6b6a9cf85a (patch)
treedb6e5d51db67d8a31f33b5fa39578f7ce3b28679
parenta29c58a0e6941674d3bd93bb1301643124b68266 (diff)
ath6kl: add support for AR6003 v2.1.1
This adds support for AR6003 v2.1.1. Highlights changes for this new hardware are: 1. Host interest area, through which driver communicates with FW has been enhanced to accomodate additional members for proper functioanlity of new HW. 2. The firmware and the board data files are different for AR6003 v2.1.1. The capability to read those file have been added in the driver. 3. Certain parameters like numdevice, firmware mode needs to be programmed for proper functionality of new driver. Signed-off-by: Naveen Singh <nsingh@atheros.com> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/ath6kl/include/common/targaddrs.h226
-rw-r--r--drivers/staging/ath6kl/os/linux/ar6000_drv.c133
-rw-r--r--drivers/staging/ath6kl/os/linux/include/ar6000_drv.h57
3 files changed, 340 insertions, 76 deletions
diff --git a/drivers/staging/ath6kl/include/common/targaddrs.h b/drivers/staging/ath6kl/include/common/targaddrs.h
index e921b302c451..b172209799bb 100644
--- a/drivers/staging/ath6kl/include/common/targaddrs.h
+++ b/drivers/staging/ath6kl/include/common/targaddrs.h
@@ -87,15 +87,7 @@ PREPACK struct host_interest_s {
87 /* Pointer to debug logging header */ 87 /* Pointer to debug logging header */
88 u32 hi_dbglog_hdr; /* 0x08 */ 88 u32 hi_dbglog_hdr; /* 0x08 */
89 89
90 /* Indicates whether or not flash is present on Target. 90 u32 hi_unused1; /* 0x0c */
91 * NB: flash_is_present indicator is here not just
92 * because it might be of interest to the Host; but
93 * also because it's set early on by Target's startup
94 * asm code and we need it to have a special RAM address
95 * so that it doesn't get reinitialized with the rest
96 * of data.
97 */
98 u32 hi_flash_is_present; /* 0x0c */
99 91
100 /* 92 /*
101 * General-purpose flag bits, similar to AR6000_OPTION_* flags. 93 * General-purpose flag bits, similar to AR6000_OPTION_* flags.
@@ -109,7 +101,7 @@ PREPACK struct host_interest_s {
109 */ 101 */
110 u32 hi_serial_enable; /* 0x14 */ 102 u32 hi_serial_enable; /* 0x14 */
111 103
112 /* Start address of Flash DataSet index, if any */ 104 /* Start address of DataSet index, if any */
113 u32 hi_dset_list_head; /* 0x18 */ 105 u32 hi_dset_list_head; /* 0x18 */
114 106
115 /* Override Target application start address */ 107 /* Override Target application start address */
@@ -167,35 +159,179 @@ PREPACK struct host_interest_s {
167 u32 hi_hci_uart_support_pins; /* 0xa4 */ 159 u32 hi_hci_uart_support_pins; /* 0xa4 */
168 /* NOTE: byte [0] = RESET pin (bit 7 is polarity), bytes[1]..bytes[3] are for future use */ 160 /* NOTE: byte [0] = RESET pin (bit 7 is polarity), bytes[1]..bytes[3] are for future use */
169 u32 hi_hci_uart_pwr_mgmt_params; /* 0xa8 */ 161 u32 hi_hci_uart_pwr_mgmt_params; /* 0xa8 */
170 /* 0xa8 - [0]: 1 = enable, 0 = disable 162 /*
171 * [1]: 0 = UART FC active low, 1 = UART FC active high 163 * 0xa8 - [1]: 0 = UART FC active low, 1 = UART FC active high
172 * 0xa9 - [7:0]: wakeup timeout in ms 164 * [31:16]: wakeup timeout in ms
173 * 0xaa, 0xab - [15:0]: idle timeout in ms 165 */
174 */ 166
175 /* Pointer to extended board Data */ 167 /* Pointer to extended board data */
176 u32 hi_board_ext_data; /* 0xac */ 168 u32 hi_board_ext_data; /* 0xac */
177 u32 hi_board_ext_data_initialized; /* 0xb0 */ 169 u32 hi_board_ext_data_config; /* 0xb0 */
170
171 /*
172 * Bit [0] : valid
173 * Bit[31:16: size
174 */
175 /*
176 * hi_reset_flag is used to do some stuff when target reset.
177 * such as restore app_start after warm reset or
178 * preserve host Interest area, or preserve ROM data, literals etc.
179 */
180 u32 hi_reset_flag; /* 0xb4 */
181 /* indicate hi_reset_flag is valid */
182 u32 hi_reset_flag_valid; /* 0xb8 */
183 u32 hi_hci_uart_pwr_mgmt_params_ext; /* 0xbc */
184 /*
185 * 0xbc - [31:0]: idle timeout in ms
186 */
187 /* ACS flags */
188 u32 hi_acs_flags; /* 0xc0 */
189 u32 hi_console_flags; /* 0xc4 */
190 u32 hi_nvram_state; /* 0xc8 */
191 u32 hi_option_flag2; /* 0xcc */
192
193 /* If non-zero, override values sent to Host in WMI_READY event. */
194 u32 hi_sw_version_override; /* 0xd0 */
195 u32 hi_abi_version_override; /* 0xd4 */
196
197 /*
198 * Percentage of high priority RX traffic to total expected RX traffic -
199 * applicable only to ar6004
200 */
201 u32 hi_hp_rx_traffic_ratio; /* 0xd8 */
202
203 /* test applications flags */
204 u32 hi_test_apps_related ; /* 0xdc */
205 /* location of test script */
206 u32 hi_ota_testscript; /* 0xe0 */
207 /* location of CAL data */
208 u32 hi_cal_data; /* 0xe4 */
209 /* Number of packet log buffers */
210 u32 hi_pktlog_num_buffers; /* 0xe8 */
211
178} POSTPACK; 212} POSTPACK;
179 213
180/* Bits defined in hi_option_flag */ 214/* Bits defined in hi_option_flag */
181#define HI_OPTION_TIMER_WAR 0x01 /* Enable timer workaround */ 215#define HI_OPTION_TIMER_WAR 0x01 /* Enable timer workaround */
182#define HI_OPTION_BMI_CRED_LIMIT 0x02 /* Limit BMI command credits */ 216#define HI_OPTION_BMI_CRED_LIMIT 0x02 /* Limit BMI command credits */
183#define HI_OPTION_RELAY_DOT11_HDR 0x04 /* Relay Dot11 hdr to/from host */ 217#define HI_OPTION_RELAY_DOT11_HDR 0x04 /* Relay Dot11 hdr to/from host */
184#define HI_OPTION_FW_MODE_LSB 0x08 /* low bit of MODE (see below) */ 218/* MAC addr method 0-locally administred 1-globally unique addrs */
185#define HI_OPTION_FW_MODE_MSB 0x10 /* high bit of MODE (see below) */ 219#define HI_OPTION_MAC_ADDR_METHOD 0x08
186#define HI_OPTION_ENABLE_PROFILE 0x20 /* Enable CPU profiling */ 220#define HI_OPTION_FW_BRIDGE 0x10 /* Firmware Bridging */
187#define HI_OPTION_DISABLE_DBGLOG 0x40 /* Disable debug logging */ 221#define HI_OPTION_ENABLE_PROFILE 0x20 /* Enable CPU profiling */
188#define HI_OPTION_SKIP_ERA_TRACKING 0x80 /* Skip Era Tracking */ 222#define HI_OPTION_DISABLE_DBGLOG 0x40 /* Disable debug logging */
189#define HI_OPTION_PAPRD_DISABLE 0x100 /* Disable PAPRD (debug) */ 223#define HI_OPTION_SKIP_ERA_TRACKING 0x80 /* Skip Era Tracking */
224#define HI_OPTION_PAPRD_DISABLE 0x100 /* Disable PAPRD (debug) */
225#define HI_OPTION_NUM_DEV_LSB 0x200
226#define HI_OPTION_NUM_DEV_MSB 0x800
227#define HI_OPTION_DEV_MODE_LSB 0x1000
228#define HI_OPTION_DEV_MODE_MSB 0x8000000
229/* Disable LowFreq Timer Stabilization */
230#define HI_OPTION_NO_LFT_STBL 0x10000000
231#define HI_OPTION_SKIP_REG_SCAN 0x20000000 /* Skip regulatory scan */
232/* Do regulatory scan during init beforesending WMI ready event to host */
233#define HI_OPTION_INIT_REG_SCAN 0x40000000
234#define HI_OPTION_SKIP_MEMMAP 0x80000000 /* REV6: Do not adjust memory
235 map */
236
237/* hi_option_flag2 options */
238#define HI_OPTION_OFFLOAD_AMSDU 0x01
239#define HI_OPTION_DFS_SUPPORT 0x02 /* Enable DFS support */
240
241#define HI_OPTION_MAC_ADDR_METHOD_SHIFT 3
190 242
191/* 2 bits of hi_option_flag are used to represent 3 modes */ 243/* 2 bits of hi_option_flag are used to represent 3 modes */
192#define HI_OPTION_FW_MODE_IBSS 0x0 /* IBSS Mode */ 244#define HI_OPTION_FW_MODE_IBSS 0x0 /* IBSS Mode */
193#define HI_OPTION_FW_MODE_BSS_STA 0x1 /* STA Mode */ 245#define HI_OPTION_FW_MODE_BSS_STA 0x1 /* STA Mode */
194#define HI_OPTION_FW_MODE_AP 0x2 /* AP Mode */ 246#define HI_OPTION_FW_MODE_AP 0x2 /* AP Mode */
195 247
196/* Fw Mode Mask */ 248/* 2 bits of hi_option flag are usedto represent 4 submodes */
197#define HI_OPTION_FW_MODE_MASK 0x3 249#define HI_OPTION_FW_SUBMODE_NONE 0x0 /* Normal mode */
198#define HI_OPTION_FW_MODE_SHIFT 0x3 250#define HI_OPTION_FW_SUBMODE_P2PDEV 0x1 /* p2p device mode */
251#define HI_OPTION_FW_SUBMODE_P2PCLIENT 0x2 /* p2p client mode */
252#define HI_OPTION_FW_SUBMODE_P2PGO 0x3 /* p2p go mode */
253
254/* Num dev Mask */
255#define HI_OPTION_NUM_DEV_MASK 0x7
256#define HI_OPTION_NUM_DEV_SHIFT 0x9
257
258/* firmware bridging */
259#define HI_OPTION_FW_BRIDGE_SHIFT 0x04
260
261/* Fw Mode/SubMode Mask
262|------------------------------------------------------------------------------|
263| SUB | SUB | SUB | SUB | | | |
264| MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0|
265| (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2)
266|------------------------------------------------------------------------------|
267*/
268#define HI_OPTION_FW_MODE_BITS 0x2
269#define HI_OPTION_FW_MODE_MASK 0x3
270#define HI_OPTION_FW_MODE_SHIFT 0xC
271#define HI_OPTION_ALL_FW_MODE_MASK 0xFF
272
273#define HI_OPTION_FW_SUBMODE_BITS 0x2
274#define HI_OPTION_FW_SUBMODE_MASK 0x3
275#define HI_OPTION_FW_SUBMODE_SHIFT 0x14
276#define HI_OPTION_ALL_FW_SUBMODE_MASK 0xFF00
277#define HI_OPTION_ALL_FW_SUBMODE_SHIFT 0x8
278
279/* hi_reset_flag */
280
281/* preserve App Start address */
282#define HI_RESET_FLAG_PRESERVE_APP_START 0x01
283/* preserve host interest */
284#define HI_RESET_FLAG_PRESERVE_HOST_INTEREST 0x02
285#define HI_RESET_FLAG_PRESERVE_ROMDATA 0x04 /* preserve ROM data */
286#define HI_RESET_FLAG_PRESERVE_NVRAM_STATE 0x08
287#define HI_RESET_FLAG_PRESERVE_BOOT_INFO 0x10
288
289#define HI_RESET_FLAG_IS_VALID 0x12345678 /* indicate the reset flag is
290valid */
291
292#define ON_RESET_FLAGS_VALID() \
293 (HOST_INTEREST->hi_reset_flag_valid == HI_RESET_FLAG_IS_VALID)
294
295#define RESET_FLAGS_VALIDATE() \
296 (HOST_INTEREST->hi_reset_flag_valid = HI_RESET_FLAG_IS_VALID)
297
298#define RESET_FLAGS_INVALIDATE() \
299 (HOST_INTEREST->hi_reset_flag_valid = 0)
300
301#define ON_RESET_PRESERVE_APP_START() \
302 (HOST_INTEREST->hi_reset_flag & HI_RESET_FLAG_PRESERVE_APP_START)
303
304#define ON_RESET_PRESERVE_NVRAM_STATE() \
305 (HOST_INTEREST->hi_reset_flag & HI_RESET_FLAG_PRESERVE_NVRAM_STATE)
306
307#define ON_RESET_PRESERVE_HOST_INTEREST() \
308 (HOST_INTEREST->hi_reset_flag & HI_RESET_FLAG_PRESERVE_HOST_INTEREST)
309
310#define ON_RESET_PRESERVE_ROMDATA() \
311 (HOST_INTEREST->hi_reset_flag & HI_RESET_FLAG_PRESERVE_ROMDATA)
312
313#define ON_RESET_PRESERVE_BOOT_INFO() \
314 (HOST_INTEREST->hi_reset_flag & HI_RESET_FLAG_PRESERVE_BOOT_INFO)
315
316#define HI_ACS_FLAGS_ENABLED (1 << 0) /* ACS is enabled */
317#define HI_ACS_FLAGS_USE_WWAN (1 << 1) /* Use physical WWAN device */
318#define HI_ACS_FLAGS_TEST_VAP (1 << 2) /* Use test VAP */
319
320/* CONSOLE FLAGS
321 *
322 * Bit Range Meaning
323 * --------- --------------------------------
324 * 2..0 UART ID (0 = Default)
325 * 3 Baud Select (0 = 9600, 1 = 115200)
326 * 30..4 Reserved
327 * 31 Enable Console
328 *
329 */
330
331#define HI_CONSOLE_FLAGS_ENABLE (1 << 31)
332#define HI_CONSOLE_FLAGS_UART_MASK (0x7)
333#define HI_CONSOLE_FLAGS_UART_SHIFT 0
334#define HI_CONSOLE_FLAGS_BAUD_SELECT (1 << 3)
199 335
200/* 336/*
201 * Intended for use by Host software, this macro returns the Target RAM 337 * Intended for use by Host software, this macro returns the Target RAM
@@ -208,26 +344,48 @@ PREPACK struct host_interest_s {
208#define AR6003_HOST_INTEREST_ITEM_ADDRESS(item) \ 344#define AR6003_HOST_INTEREST_ITEM_ADDRESS(item) \
209 (u32)((unsigned long)&((((struct host_interest_s *)(AR6003_HOST_INTEREST_ADDRESS))->item))) 345 (u32)((unsigned long)&((((struct host_interest_s *)(AR6003_HOST_INTEREST_ADDRESS))->item)))
210 346
347#define AR6004_HOST_INTEREST_ITEM_ADDRESS(item) \
348 ((A_UINT32)&((((struct host_interest_s *)(AR6004_HOST_INTEREST_ADDRESS))->item)))
349
350
211#define HOST_INTEREST_DBGLOG_IS_ENABLED() \ 351#define HOST_INTEREST_DBGLOG_IS_ENABLED() \
212 (!(HOST_INTEREST->hi_option_flag & HI_OPTION_DISABLE_DBGLOG)) 352 (!(HOST_INTEREST->hi_option_flag & HI_OPTION_DISABLE_DBGLOG))
213 353
354#define HOST_INTEREST_PKTLOG_IS_ENABLED() \
355 ((HOST_INTEREST->hi_pktlog_num_buffers))
356
357
214#define HOST_INTEREST_PROFILE_IS_ENABLED() \ 358#define HOST_INTEREST_PROFILE_IS_ENABLED() \
215 (HOST_INTEREST->hi_option_flag & HI_OPTION_ENABLE_PROFILE) 359 (HOST_INTEREST->hi_option_flag & HI_OPTION_ENABLE_PROFILE)
216 360
361#define LF_TIMER_STABILIZATION_IS_ENABLED() \
362 (!(HOST_INTEREST->hi_option_flag & HI_OPTION_NO_LFT_STBL))
363
364#define IS_AMSDU_OFFLAOD_ENABLED() \
365 ((HOST_INTEREST->hi_option_flag2 & HI_OPTION_OFFLOAD_AMSDU))
366
367#define HOST_INTEREST_DFS_IS_ENABLED() \
368 ((HOST_INTEREST->hi_option_flag2 & HI_OPTION_DFS_SUPPORT))
369
217/* Convert a Target virtual address into a Target physical address */ 370/* Convert a Target virtual address into a Target physical address */
218#define AR6002_VTOP(vaddr) ((vaddr) & 0x001fffff) 371#define AR6002_VTOP(vaddr) ((vaddr) & 0x001fffff)
219#define AR6003_VTOP(vaddr) ((vaddr) & 0x001fffff) 372#define AR6003_VTOP(vaddr) ((vaddr) & 0x001fffff)
220#define TARG_VTOP(TargetType, vaddr) \ 373#define TARG_VTOP(TargetType, vaddr) \
221 (((TargetType) == TARGET_TYPE_AR6002) ? AR6002_VTOP(vaddr) : AR6003_VTOP(vaddr)) 374 (((TargetType) == TARGET_TYPE_AR6002) ? AR6002_VTOP(vaddr) : AR6003_VTOP(vaddr))
222 375
223/* override REV2 ROM's app start address */ 376#define AR6003_REV2_APP_START_OVERRIDE 0x944C00
224#define AR6002_REV2_APP_START_OVERRIDE 0x911A00 377#define AR6003_REV2_APP_LOAD_ADDRESS 0x543180
225#define AR6003_REV1_APP_START_OVERRIDE 0x944c00 378#define AR6003_REV2_BOARD_EXT_DATA_ADDRESS 0x57E500
226#define AR6003_REV1_OTP_DATA_ADDRESS 0x542800 379#define AR6003_REV2_DATASET_PATCH_ADDRESS 0x57e884
227#define AR6003_REV2_APP_START_OVERRIDE 0x945000 380#define AR6003_REV2_RAM_RESERVE_SIZE 6912
228#define AR6003_REV2_OTP_DATA_ADDRESS 0x543800 381
229#define AR6003_BOARD_EXT_DATA_ADDRESS 0x57E600 382#define AR6003_REV3_APP_START_OVERRIDE 0x945d00
383#define AR6003_REV3_APP_LOAD_ADDRESS 0x545000
384#define AR6003_REV3_BOARD_EXT_DATA_ADDRESS 0x542330
385#define AR6003_REV3_DATASET_PATCH_ADDRESS 0x57FF74
386#define AR6003_REV3_RAM_RESERVE_SIZE 512
230 387
388#define AR6003_BOARD_EXT_DATA_ADDRESS 0x57E600
231 389
232/* # of u32 entries in targregs, used by DIAG_FETCH_TARG_REGS */ 390/* # of u32 entries in targregs, used by DIAG_FETCH_TARG_REGS */
233#define AR6003_FETCH_TARG_REGS_COUNT 64 391#define AR6003_FETCH_TARG_REGS_COUNT 64
diff --git a/drivers/staging/ath6kl/os/linux/ar6000_drv.c b/drivers/staging/ath6kl/os/linux/ar6000_drv.c
index db8772074ef8..36722ed6b533 100644
--- a/drivers/staging/ath6kl/os/linux/ar6000_drv.c
+++ b/drivers/staging/ath6kl/os/linux/ar6000_drv.c
@@ -131,6 +131,8 @@ unsigned int wlanNodeCaching = 1;
131unsigned int enableuartprint = ENABLEUARTPRINT_DEFAULT; 131unsigned int enableuartprint = ENABLEUARTPRINT_DEFAULT;
132unsigned int logWmiRawMsgs = 0; 132unsigned int logWmiRawMsgs = 0;
133unsigned int enabletimerwar = 0; 133unsigned int enabletimerwar = 0;
134unsigned int num_device = 1;
135unsigned int regscanmode;
134unsigned int fwmode = 1; 136unsigned int fwmode = 1;
135unsigned int mbox_yield_limit = 99; 137unsigned int mbox_yield_limit = 99;
136unsigned int enablerssicompensation = 0; 138unsigned int enablerssicompensation = 0;
@@ -155,6 +157,8 @@ unsigned int hciuartstep = HCIUARTSTEP_DEFAULT;
155unsigned int csumOffload=0; 157unsigned int csumOffload=0;
156unsigned int csumOffloadTest=0; 158unsigned int csumOffloadTest=0;
157unsigned int eppingtest=0; 159unsigned int eppingtest=0;
160unsigned int mac_addr_method;
161unsigned int firmware_bridge;
158 162
159module_param_string(ifname, ifname, sizeof(ifname), 0644); 163module_param_string(ifname, ifname, sizeof(ifname), 0644);
160module_param(wlaninitmode, int, 0644); 164module_param(wlaninitmode, int, 0644);
@@ -957,6 +961,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
957 filename = AR6003_REV1_OTP_FILE; 961 filename = AR6003_REV1_OTP_FILE;
958 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 962 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
959 filename = AR6003_REV2_OTP_FILE; 963 filename = AR6003_REV2_OTP_FILE;
964 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
965 filename = AR6003_REV3_OTP_FILE;
960 } else { 966 } else {
961 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver)); 967 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver));
962 return A_ERROR; 968 return A_ERROR;
@@ -968,6 +974,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
968 filename = AR6003_REV1_FIRMWARE_FILE; 974 filename = AR6003_REV1_FIRMWARE_FILE;
969 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 975 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
970 filename = AR6003_REV2_FIRMWARE_FILE; 976 filename = AR6003_REV2_FIRMWARE_FILE;
977 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
978 filename = AR6003_REV3_FIRMWARE_FILE;
971 } else { 979 } else {
972 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver)); 980 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver));
973 return A_ERROR; 981 return A_ERROR;
@@ -979,6 +987,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
979 filename = AR6003_REV1_EPPING_FIRMWARE_FILE; 987 filename = AR6003_REV1_EPPING_FIRMWARE_FILE;
980 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 988 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
981 filename = AR6003_REV2_EPPING_FIRMWARE_FILE; 989 filename = AR6003_REV2_EPPING_FIRMWARE_FILE;
990 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
991 filename = AR6003_REV3_EPPING_FIRMWARE_FILE;
982 } else { 992 } else {
983 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("eppingtest : unsupported firmware revision: %d\n", 993 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("eppingtest : unsupported firmware revision: %d\n",
984 ar->arVersion.target_ver)); 994 ar->arVersion.target_ver));
@@ -993,6 +1003,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
993 filename = AR6003_REV1_TCMD_FIRMWARE_FILE; 1003 filename = AR6003_REV1_TCMD_FIRMWARE_FILE;
994 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 1004 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
995 filename = AR6003_REV2_TCMD_FIRMWARE_FILE; 1005 filename = AR6003_REV2_TCMD_FIRMWARE_FILE;
1006 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
1007 filename = AR6003_REV3_TCMD_FIRMWARE_FILE;
996 } else { 1008 } else {
997 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver)); 1009 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver));
998 return A_ERROR; 1010 return A_ERROR;
@@ -1020,6 +1032,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
1020 filename = AR6003_REV1_PATCH_FILE; 1032 filename = AR6003_REV1_PATCH_FILE;
1021 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 1033 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
1022 filename = AR6003_REV2_PATCH_FILE; 1034 filename = AR6003_REV2_PATCH_FILE;
1035 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
1036 filename = AR6003_REV3_PATCH_FILE;
1023 } else { 1037 } else {
1024 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver)); 1038 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver));
1025 return A_ERROR; 1039 return A_ERROR;
@@ -1031,6 +1045,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
1031 filename = AR6003_REV1_BOARD_DATA_FILE; 1045 filename = AR6003_REV1_BOARD_DATA_FILE;
1032 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { 1046 } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
1033 filename = AR6003_REV2_BOARD_DATA_FILE; 1047 filename = AR6003_REV2_BOARD_DATA_FILE;
1048 } else if (ar->arVersion.target_ver == AR6003_REV3_VERSION) {
1049 filename = AR6003_REV3_BOARD_DATA_FILE;
1034 } else { 1050 } else {
1035 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver)); 1051 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown firmware revision: %d\n", ar->arVersion.target_ver));
1036 return A_ERROR; 1052 return A_ERROR;
@@ -1085,8 +1101,10 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address,
1085 } 1101 }
1086 1102
1087 /* Record the fact that extended board Data IS initialized */ 1103 /* Record the fact that extended board Data IS initialized */
1088 param = 1; 1104 param = (board_ext_data_size << 16) | 1;
1089 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_ext_data_initialized), (u8 *)&param, 4)); 1105 bmifn(BMIWriteMemory(ar->arHifDevice,
1106 HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_ext_data_config),
1107 (unsigned char *)&param, 4));
1090 } 1108 }
1091 fw_entry_size = board_data_size; 1109 fw_entry_size = board_data_size;
1092 } 1110 }
@@ -1243,7 +1261,9 @@ ar6000_sysfs_bmi_get_config(struct ar6_softc *ar, u32 mode)
1243 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_data_initialized), (u8 *)&param, 4)); 1261 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_data_initialized), (u8 *)&param, 4));
1244 1262
1245 /* Transfer One time Programmable data */ 1263 /* Transfer One time Programmable data */
1246 AR6K_DATA_DOWNLOAD_ADDRESS(address, ar->arVersion.target_ver); 1264 AR6K_APP_LOAD_ADDRESS(address, ar->arVersion.target_ver);
1265 if (ar->arVersion.target_ver == AR6003_REV3_VERSION)
1266 address = 0x1234;
1247 status = ar6000_transfer_bin_file(ar, AR6K_OTP_FILE, address, true); 1267 status = ar6000_transfer_bin_file(ar, AR6K_OTP_FILE, address, true);
1248 if (status == 0) { 1268 if (status == 0) {
1249 /* Execute the OTP code */ 1269 /* Execute the OTP code */
@@ -1259,7 +1279,9 @@ ar6000_sysfs_bmi_get_config(struct ar6_softc *ar, u32 mode)
1259 } 1279 }
1260 1280
1261 /* Download Target firmware */ 1281 /* Download Target firmware */
1262 AR6K_DATA_DOWNLOAD_ADDRESS(address, ar->arVersion.target_ver); 1282 AR6K_APP_LOAD_ADDRESS(address, ar->arVersion.target_ver);
1283 if (ar->arVersion.target_ver == AR6003_REV3_VERSION)
1284 address = 0x1234;
1263 if ((ar6000_transfer_bin_file(ar, AR6K_FIRMWARE_FILE, address, true)) != 0) { 1285 if ((ar6000_transfer_bin_file(ar, AR6K_FIRMWARE_FILE, address, true)) != 0) {
1264 return A_ERROR; 1286 return A_ERROR;
1265 } 1287 }
@@ -1268,25 +1290,16 @@ ar6000_sysfs_bmi_get_config(struct ar6_softc *ar, u32 mode)
1268 AR6K_APP_START_OVERRIDE_ADDRESS(address, ar->arVersion.target_ver); 1290 AR6K_APP_START_OVERRIDE_ADDRESS(address, ar->arVersion.target_ver);
1269 bmifn(BMISetAppStart(ar->arHifDevice, address)); 1291 bmifn(BMISetAppStart(ar->arHifDevice, address));
1270 1292
1271 /* Apply the patches */ 1293 if(ar->arTargetType == TARGET_TYPE_AR6003) {
1272 AR6K_PATCH_DOWNLOAD_ADDRESS(address, ar->arVersion.target_ver); 1294 AR6K_DATASET_PATCH_ADDRESS(address, ar->arVersion.target_ver);
1273 if ((ar6000_transfer_bin_file(ar, AR6K_PATCH_FILE, address, false)) != 0) { 1295 if ((ar6000_transfer_bin_file(ar, AR6K_PATCH_FILE,
1274 return A_ERROR; 1296 address, false)) != 0)
1275 } 1297 return A_ERROR;
1276 1298 param = address;
1277 param = address; 1299 bmifn(BMIWriteMemory(ar->arHifDevice,
1278 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_dset_list_head), (u8 *)&param, 4)); 1300 HOST_INTEREST_ITEM_ADDRESS(ar, hi_dset_list_head),
1279 1301 (unsigned char *)&param, 4));
1280 if (ar->arTargetType == TARGET_TYPE_AR6003) { 1302 }
1281 if (ar->arVersion.target_ver == AR6003_REV1_VERSION) {
1282 /* Reserve 5.5K of RAM */
1283 param = 5632;
1284 } else { /* AR6003_REV2_VERSION */
1285 /* Reserve 6.5K of RAM */
1286 param = 6656;
1287 }
1288 bmifn(BMIWriteMemory(ar->arHifDevice, HOST_INTEREST_ITEM_ADDRESS(ar, hi_end_RAM_reserve_sz), (u8 *)&param, 4));
1289 }
1290 1303
1291 /* Restore system sleep */ 1304 /* Restore system sleep */
1292 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; 1305 address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS;
@@ -1418,7 +1431,11 @@ ar6000_configure_target(struct ar6_softc *ar)
1418 return A_ERROR; 1431 return A_ERROR;
1419 } 1432 }
1420 1433
1434 param |= (num_device << HI_OPTION_NUM_DEV_SHIFT);
1421 param |= (fwmode << HI_OPTION_FW_MODE_SHIFT); 1435 param |= (fwmode << HI_OPTION_FW_MODE_SHIFT);
1436 param |= (mac_addr_method << HI_OPTION_MAC_ADDR_METHOD_SHIFT);
1437 param |= (firmware_bridge << HI_OPTION_FW_BRIDGE_SHIFT);
1438
1422 1439
1423 if (BMIWriteMemory(ar->arHifDevice, 1440 if (BMIWriteMemory(ar->arHifDevice,
1424 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag), 1441 HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
@@ -1466,18 +1483,34 @@ ar6000_configure_target(struct ar6_softc *ar)
1466 * It is difficult to patch the firmware boot code, 1483 * It is difficult to patch the firmware boot code,
1467 * but possible in theory. 1484 * but possible in theory.
1468 */ 1485 */
1469 if (ar->arTargetType == TARGET_TYPE_AR6003) {
1470 param = AR6003_BOARD_EXT_DATA_ADDRESS;
1471 if (BMIWriteMemory(ar->arHifDevice,
1472 HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_ext_data),
1473 (u8 *)&param,
1474 4) != 0)
1475 {
1476 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("BMIWriteMemory for hi_board_ext_data failed \n"));
1477 return A_ERROR;
1478 }
1479 }
1480 1486
1487 if (ar->arTargetType == TARGET_TYPE_AR6003) {
1488 A_UINT32 ramReservedSz;
1489 if (ar->arVersion.target_ver == AR6003_REV2_VERSION) {
1490 param = AR6003_REV2_BOARD_EXT_DATA_ADDRESS;
1491 ramReservedSz = AR6003_REV2_RAM_RESERVE_SIZE;
1492 } else {
1493 param = AR6003_REV3_BOARD_EXT_DATA_ADDRESS;
1494 ramReservedSz = AR6003_REV3_RAM_RESERVE_SIZE;
1495 }
1496 if (BMIWriteMemory(ar->arHifDevice,
1497 HOST_INTEREST_ITEM_ADDRESS(ar, hi_board_ext_data),
1498 (u8 *)&param, 4) != 0) {
1499 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1500 ("BMIWriteMemory for "
1501 "hi_board_ext_data failed\n"));
1502 return A_ERROR;
1503 }
1504 if (BMIWriteMemory(ar->arHifDevice,
1505 HOST_INTEREST_ITEM_ADDRESS(ar,
1506 hi_end_RAM_reserve_sz),
1507 (u8 *)&ramReservedSz, 4) != 0) {
1508 AR_DEBUG_PRINTF(ATH_DEBUG_ERR ,
1509 ("BMIWriteMemory for "
1510 "hi_end_RAM_reserve_sz failed\n"));
1511 return A_ERROR;
1512 }
1513 }
1481 1514
1482 /* since BMIInit is called in the driver layer, we have to set the block 1515 /* since BMIInit is called in the driver layer, we have to set the block
1483 * size here for the target */ 1516 * size here for the target */
@@ -2641,6 +2674,38 @@ int ar6000_init(struct net_device *dev)
2641 goto ar6000_init_done; 2674 goto ar6000_init_done;
2642 } 2675 }
2643 2676
2677 if (regscanmode) {
2678 A_UINT32 param;
2679
2680 if (BMIReadMemory(ar->arHifDevice,
2681 HOST_INTEREST_ITEM_ADDRESS(ar,
2682 hi_option_flag),
2683 (u8 *)&param,
2684 4) != 0) {
2685 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
2686 ("BMIReadMemory forsetting "
2687 "regscanmode failed\n"));
2688 return A_ERROR;
2689 }
2690
2691 if (regscanmode == 1)
2692 param |= HI_OPTION_SKIP_REG_SCAN;
2693 else if (regscanmode == 2)
2694 param |= HI_OPTION_INIT_REG_SCAN;
2695
2696 if (BMIWriteMemory(ar->arHifDevice,
2697 HOST_INTEREST_ITEM_ADDRESS(ar,
2698 hi_option_flag),
2699 (u8 *)&param,
2700 4) != 0) {
2701 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
2702 ("BMIWriteMemory forsetting "
2703 "regscanmode failed\n"));
2704 return A_ERROR;
2705 }
2706 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("Regulatory scan mode set\n"));
2707 }
2708
2644 /* 2709 /*
2645 * give our connected endpoints some buffers 2710 * give our connected endpoints some buffers
2646 */ 2711 */
diff --git a/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h b/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
index d17d3d07c292..b466e7f54567 100644
--- a/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+++ b/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
@@ -281,15 +281,37 @@ typedef enum _AR6K_BIN_FILE {
281 } \ 281 } \
282} while (0) 282} while (0)
283 283
284#define AR6K_DATASET_PATCH_ADDRESS(_param, _ver) do { \
285 if ((_ver) == AR6003_REV2_VERSION) { \
286 (_param) = AR6003_REV2_DATASET_PATCH_ADDRESS; \
287 } else if ((_ver) == AR6003_REV3_VERSION) { \
288 (_param) = AR6003_REV3_DATASET_PATCH_ADDRESS; \
289 } else { \
290 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown Version: %d\n", _ver)); \
291 A_ASSERT(0); \
292 } \
293} while (0)
294
295#define AR6K_APP_LOAD_ADDRESS(_param, _ver) do { \
296 if ((_ver) == AR6003_REV2_VERSION) { \
297 (_param) = AR6003_REV2_APP_LOAD_ADDRESS; \
298 } else if ((_ver) == AR6003_REV3_VERSION) { \
299 (_param) = AR6003_REV3_APP_LOAD_ADDRESS; \
300 } else { \
301 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown Version: %d\n", _ver)); \
302 A_ASSERT(0); \
303 } \
304} while (0)
305
284#define AR6K_APP_START_OVERRIDE_ADDRESS(_param, _ver) do { \ 306#define AR6K_APP_START_OVERRIDE_ADDRESS(_param, _ver) do { \
285 if ((_ver) == AR6003_REV1_VERSION) { \ 307 if ((_ver) == AR6003_REV2_VERSION) { \
286 (_param) = AR6003_REV1_APP_START_OVERRIDE; \ 308 (_param) = AR6003_REV2_APP_START_OVERRIDE; \
287 } else if ((_ver) == AR6003_REV2_VERSION) { \ 309 } else if ((_ver) == AR6003_REV3_VERSION) { \
288 (_param) = AR6003_REV2_APP_START_OVERRIDE; \ 310 (_param) = AR6003_REV3_APP_START_OVERRIDE; \
289 } else { \ 311 } else { \
290 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown Version: %d\n", _ver)); \ 312 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown Version: %d\n", _ver)); \
291 A_ASSERT(0); \ 313 A_ASSERT(0); \
292 } \ 314 } \
293} while (0) 315} while (0)
294 316
295/* AR6003 1.0 definitions */ 317/* AR6003 1.0 definitions */
@@ -332,6 +354,25 @@ typedef enum _AR6K_BIN_FILE {
332#define AR6003_REV2_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.CUSTOM.bin" 354#define AR6003_REV2_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.CUSTOM.bin"
333#endif /* Board Data File */ 355#endif /* Board Data File */
334 356
357/* AR6003 3.0 definitions */
358#define AR6003_REV3_VERSION 0x30000582
359#define AR6003_REV3_OTP_FILE "ath6k/AR6003/hw2.1.1/otp.bin"
360#define AR6003_REV3_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/athwlan.bin"
361#define AR6003_REV3_TCMD_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/athtcmd_ram.bin"
362#define AR6003_REV3_ART_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/device.bin"
363#define AR6003_REV3_PATCH_FILE "ath6k/AR6003/hw2.1.1/data.patch.bin"
364#define AR6003_REV3_EPPING_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/endpointping.bin"
365#ifdef CONFIG_AR600x_SD31_XXX
366#define AR6003_REV3_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.SD31.bin"
367#elif defined(CONFIG_AR600x_SD32_XXX)
368#define AR6003_REV3_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.SD32.bin"
369#elif defined(CONFIG_AR600x_WB31_XXX)
370#define AR6003_REV3_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.WB31.bin"
371#else
372#define AR6003_REV3_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.CUSTOM.bin"
373#endif /* Board Data File */
374
375
335/* Power states */ 376/* Power states */
336enum { 377enum {
337 WLAN_PWR_CTRL_UP = 0, 378 WLAN_PWR_CTRL_UP = 0,