2 * This file is part of wl1271
4 * Copyright (C) 2008-2010 Nokia Corporation
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22 #include <linux/module.h>
23 #include <linux/platform_device.h>
25 #include <linux/err.h>
27 #include <linux/wl12xx.h>
29 #include "../wlcore/wlcore.h"
30 #include "../wlcore/debug.h"
31 #include "../wlcore/io.h"
32 #include "../wlcore/acx.h"
33 #include "../wlcore/tx.h"
34 #include "../wlcore/rx.h"
35 #include "../wlcore/io.h"
36 #include "../wlcore/boot.h"
44 static char *fref_param;
45 static char *tcxo_param;
47 static struct wlcore_conf wl12xx_conf = {
50 [CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
51 [CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
52 [CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
53 [CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
54 [CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
55 [CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
56 [CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
57 [CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
58 [CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
59 [CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
60 [CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
61 [CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
62 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
63 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
64 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
65 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
66 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
67 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
68 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
69 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
70 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
71 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
72 [CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
73 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
74 [CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
75 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
76 /* active scan params */
77 [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
78 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
79 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
80 /* passive scan params */
81 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
82 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
83 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
84 /* passive scan in dual antenna params */
85 [CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
86 [CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
87 [CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
89 [CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
90 [CONF_SG_ANTENNA_CONFIGURATION] = 0,
91 [CONF_SG_BEACON_MISS_PERCENT] = 60,
92 [CONF_SG_DHCP_TIME] = 5000,
95 [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
96 [CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
97 [CONF_SG_HV3_MAX_SERVED] = 6,
98 [CONF_SG_PS_POLL_TIMEOUT] = 10,
99 [CONF_SG_UPSD_TIMEOUT] = 10,
100 [CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
101 [CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
102 [CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
104 [CONF_AP_BEACON_MISS_TX] = 3,
105 [CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
106 [CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
107 [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
108 [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
109 [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
110 /* CTS Diluting params */
111 [CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
112 [CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
114 .state = CONF_SG_PROTECTIVE,
117 .rx_msdu_life_time = 512000,
118 .packet_detection_threshold = 0,
119 .ps_poll_timeout = 15,
121 .rts_threshold = IEEE80211_MAX_RTS_THRESHOLD,
122 .rx_cca_threshold = 0,
123 .irq_blk_threshold = 0xFFFF,
124 .irq_pkt_threshold = 0,
126 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
129 .tx_energy_detection = 0,
132 .short_retry_limit = 10,
133 .long_retry_limit = 10,
156 .aifsn = CONF_TX_AIFS_PIFS,
163 .aifsn = CONF_TX_AIFS_PIFS,
167 .max_tx_retries = 100,
168 .ap_aging_period = 300,
172 .queue_id = CONF_TX_AC_BE,
173 .channel_type = CONF_CHANNEL_TYPE_EDCF,
174 .tsid = CONF_TX_AC_BE,
175 .ps_scheme = CONF_PS_SCHEME_LEGACY,
176 .ack_policy = CONF_ACK_POLICY_LEGACY,
180 .queue_id = CONF_TX_AC_BK,
181 .channel_type = CONF_CHANNEL_TYPE_EDCF,
182 .tsid = CONF_TX_AC_BK,
183 .ps_scheme = CONF_PS_SCHEME_LEGACY,
184 .ack_policy = CONF_ACK_POLICY_LEGACY,
188 .queue_id = CONF_TX_AC_VI,
189 .channel_type = CONF_CHANNEL_TYPE_EDCF,
190 .tsid = CONF_TX_AC_VI,
191 .ps_scheme = CONF_PS_SCHEME_LEGACY,
192 .ack_policy = CONF_ACK_POLICY_LEGACY,
196 .queue_id = CONF_TX_AC_VO,
197 .channel_type = CONF_CHANNEL_TYPE_EDCF,
198 .tsid = CONF_TX_AC_VO,
199 .ps_scheme = CONF_PS_SCHEME_LEGACY,
200 .ack_policy = CONF_ACK_POLICY_LEGACY,
204 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
205 .tx_compl_timeout = 700,
206 .tx_compl_threshold = 4,
207 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
208 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
209 .tmpl_short_retry_limit = 10,
210 .tmpl_long_retry_limit = 10,
211 .tx_watchdog_timeout = 5000,
214 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
215 .listen_interval = 1,
216 .suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM,
217 .suspend_listen_interval = 3,
218 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
219 .bcn_filt_ie_count = 2,
222 .ie = WLAN_EID_CHANNEL_SWITCH,
223 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
226 .ie = WLAN_EID_HT_OPERATION,
227 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
230 .synch_fail_thold = 10,
231 .bss_lose_timeout = 100,
232 .beacon_rx_timeout = 10000,
233 .broadcast_timeout = 20000,
234 .rx_broadcast_in_ps = 1,
235 .ps_poll_threshold = 10,
236 .bet_enable = CONF_BET_MODE_ENABLE,
237 .bet_max_consecutive = 50,
238 .psm_entry_retries = 8,
239 .psm_exit_retries = 16,
240 .psm_entry_nullfunc_retries = 3,
241 .dynamic_ps_timeout = 40,
243 .keep_alive_interval = 55000,
244 .max_listen_interval = 20,
251 .host_clk_settling_time = 5000,
252 .host_fast_wakeup_support = false
256 .avg_weight_rssi_beacon = 20,
257 .avg_weight_rssi_data = 10,
258 .avg_weight_snr_beacon = 20,
259 .avg_weight_snr_data = 10,
262 .min_dwell_time_active = 7500,
263 .max_dwell_time_active = 30000,
264 .min_dwell_time_passive = 100000,
265 .max_dwell_time_passive = 100000,
267 .split_scan_timeout = 50000,
271 * Values are in TU/1000 but since sched scan FW command
272 * params are in TUs rounding up may occur.
274 .base_dwell_time = 7500,
275 .max_dwell_time_delta = 22500,
276 /* based on 250bits per probe @1Mbps */
277 .dwell_time_delta_per_probe = 2000,
278 /* based on 250bits per probe @6Mbps (plus a bit more) */
279 .dwell_time_delta_per_probe_5 = 350,
280 .dwell_time_passive = 100000,
281 .dwell_time_dfs = 150000,
283 .rssi_threshold = -90,
288 .tx_ba_win_size = 64,
289 .inactivity_timeout = 10000,
290 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
293 * Memory config for wl127x chips is given in the
294 * wl12xx_default_priv_conf struct. The below configuration is
301 .tx_min_block_num = 40,
303 .min_req_tx_blocks = 45,
304 .min_req_rx_blocks = 22,
310 .n_divider_fref_set_1 = 0xff, /* default */
311 .n_divider_fref_set_2 = 12,
312 .m_divider_fref_set_1 = 148,
313 .m_divider_fref_set_2 = 0xffff, /* default */
314 .coex_pll_stabilization_time = 0xffffffff, /* default */
315 .ldo_stabilization_time = 0xffff, /* default */
316 .fm_disturbed_band_margin = 0xff, /* default */
317 .swallow_clk_diff = 0xff, /* default */
326 .mode = WL12XX_FWLOG_ON_DEMAND,
329 .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
330 .output = WL12XX_FWLOG_OUTPUT_HOST,
334 .rate_retry_score = 32000,
339 .inverse_curiosity_factor = 5,
341 .tx_fail_high_th = 10,
342 .per_alpha_shift = 4,
344 .per_beta1_shift = 10,
345 .per_beta2_shift = 8,
347 .rate_check_down = 12,
348 .rate_retry_policy = {
349 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00,
356 .hangover_period = 20,
358 .early_termination_mode = 1,
369 static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
371 .tx_per_channel_power_compensation_2 = {
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 .tx_per_channel_power_compensation_5 = {
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 .tx_min_block_num = 40,
386 .min_req_tx_blocks = 100,
387 .min_req_rx_blocks = 22,
393 #define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT 1
394 #define WL12XX_TX_HW_BLOCK_GEM_SPARE 2
395 #define WL12XX_TX_HW_BLOCK_SIZE 252
397 static const u8 wl12xx_rate_to_idx_2ghz[] = {
398 /* MCS rates are used only with 11n */
399 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
400 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
401 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
402 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
403 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
404 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
405 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
406 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
407 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
409 11, /* WL12XX_CONF_HW_RXTX_RATE_54 */
410 10, /* WL12XX_CONF_HW_RXTX_RATE_48 */
411 9, /* WL12XX_CONF_HW_RXTX_RATE_36 */
412 8, /* WL12XX_CONF_HW_RXTX_RATE_24 */
414 /* TI-specific rate */
415 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
417 7, /* WL12XX_CONF_HW_RXTX_RATE_18 */
418 6, /* WL12XX_CONF_HW_RXTX_RATE_12 */
419 3, /* WL12XX_CONF_HW_RXTX_RATE_11 */
420 5, /* WL12XX_CONF_HW_RXTX_RATE_9 */
421 4, /* WL12XX_CONF_HW_RXTX_RATE_6 */
422 2, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
423 1, /* WL12XX_CONF_HW_RXTX_RATE_2 */
424 0 /* WL12XX_CONF_HW_RXTX_RATE_1 */
427 static const u8 wl12xx_rate_to_idx_5ghz[] = {
428 /* MCS rates are used only with 11n */
429 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
430 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
431 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
432 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
433 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
434 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
435 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
436 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
437 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
439 7, /* WL12XX_CONF_HW_RXTX_RATE_54 */
440 6, /* WL12XX_CONF_HW_RXTX_RATE_48 */
441 5, /* WL12XX_CONF_HW_RXTX_RATE_36 */
442 4, /* WL12XX_CONF_HW_RXTX_RATE_24 */
444 /* TI-specific rate */
445 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
447 3, /* WL12XX_CONF_HW_RXTX_RATE_18 */
448 2, /* WL12XX_CONF_HW_RXTX_RATE_12 */
449 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_11 */
450 1, /* WL12XX_CONF_HW_RXTX_RATE_9 */
451 0, /* WL12XX_CONF_HW_RXTX_RATE_6 */
452 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
453 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_2 */
454 CONF_HW_RXTX_RATE_UNSUPPORTED /* WL12XX_CONF_HW_RXTX_RATE_1 */
457 static const u8 *wl12xx_band_rate_to_idx[] = {
458 [IEEE80211_BAND_2GHZ] = wl12xx_rate_to_idx_2ghz,
459 [IEEE80211_BAND_5GHZ] = wl12xx_rate_to_idx_5ghz
462 enum wl12xx_hw_rates {
463 WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI = 0,
464 WL12XX_CONF_HW_RXTX_RATE_MCS7,
465 WL12XX_CONF_HW_RXTX_RATE_MCS6,
466 WL12XX_CONF_HW_RXTX_RATE_MCS5,
467 WL12XX_CONF_HW_RXTX_RATE_MCS4,
468 WL12XX_CONF_HW_RXTX_RATE_MCS3,
469 WL12XX_CONF_HW_RXTX_RATE_MCS2,
470 WL12XX_CONF_HW_RXTX_RATE_MCS1,
471 WL12XX_CONF_HW_RXTX_RATE_MCS0,
472 WL12XX_CONF_HW_RXTX_RATE_54,
473 WL12XX_CONF_HW_RXTX_RATE_48,
474 WL12XX_CONF_HW_RXTX_RATE_36,
475 WL12XX_CONF_HW_RXTX_RATE_24,
476 WL12XX_CONF_HW_RXTX_RATE_22,
477 WL12XX_CONF_HW_RXTX_RATE_18,
478 WL12XX_CONF_HW_RXTX_RATE_12,
479 WL12XX_CONF_HW_RXTX_RATE_11,
480 WL12XX_CONF_HW_RXTX_RATE_9,
481 WL12XX_CONF_HW_RXTX_RATE_6,
482 WL12XX_CONF_HW_RXTX_RATE_5_5,
483 WL12XX_CONF_HW_RXTX_RATE_2,
484 WL12XX_CONF_HW_RXTX_RATE_1,
485 WL12XX_CONF_HW_RXTX_RATE_MAX,
488 static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
495 .start = REGISTERS_BASE,
508 [PART_BOOT] = { /* in wl12xx we can use a mix of work and down
515 .start = REGISTERS_BASE,
534 .start = REGISTERS_BASE,
567 static const int wl12xx_rtable[REG_TABLE_LEN] = {
568 [REG_ECPU_CONTROL] = WL12XX_REG_ECPU_CONTROL,
569 [REG_INTERRUPT_NO_CLEAR] = WL12XX_REG_INTERRUPT_NO_CLEAR,
570 [REG_INTERRUPT_ACK] = WL12XX_REG_INTERRUPT_ACK,
571 [REG_COMMAND_MAILBOX_PTR] = WL12XX_REG_COMMAND_MAILBOX_PTR,
572 [REG_EVENT_MAILBOX_PTR] = WL12XX_REG_EVENT_MAILBOX_PTR,
573 [REG_INTERRUPT_TRIG] = WL12XX_REG_INTERRUPT_TRIG,
574 [REG_INTERRUPT_MASK] = WL12XX_REG_INTERRUPT_MASK,
575 [REG_PC_ON_RECOVERY] = WL12XX_SCR_PAD4,
576 [REG_CHIP_ID_B] = WL12XX_CHIP_ID_B,
577 [REG_CMD_MBOX_ADDRESS] = WL12XX_CMD_MBOX_ADDRESS,
579 /* data access memory addresses, used with partition translation */
580 [REG_SLV_MEM_DATA] = WL1271_SLV_MEM_DATA,
581 [REG_SLV_REG_DATA] = WL1271_SLV_REG_DATA,
583 /* raw data access memory addresses */
584 [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR,
587 /* TODO: maybe move to a new header file? */
588 #define WL127X_FW_NAME_MULTI "ti-connectivity/wl127x-fw-4-mr.bin"
589 #define WL127X_FW_NAME_SINGLE "ti-connectivity/wl127x-fw-4-sr.bin"
590 #define WL127X_PLT_FW_NAME "ti-connectivity/wl127x-fw-4-plt.bin"
592 #define WL128X_FW_NAME_MULTI "ti-connectivity/wl128x-fw-4-mr.bin"
593 #define WL128X_FW_NAME_SINGLE "ti-connectivity/wl128x-fw-4-sr.bin"
594 #define WL128X_PLT_FW_NAME "ti-connectivity/wl128x-fw-4-plt.bin"
596 static void wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
598 if (wl->chip.id != CHIP_ID_1283_PG20) {
599 struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
600 struct wl127x_rx_mem_pool_addr rx_mem_addr;
603 * Choose the block we want to read
604 * For aggregated packets, only the first memory block
605 * should be retrieved. The FW takes care of the rest.
607 u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
609 rx_mem_addr.addr = (mem_block << 8) +
610 le32_to_cpu(wl_mem_map->packet_memory_pool_start);
612 rx_mem_addr.addr_extra = rx_mem_addr.addr + 4;
614 wl1271_write(wl, WL1271_SLV_REG_DATA,
615 &rx_mem_addr, sizeof(rx_mem_addr), false);
619 static int wl12xx_identify_chip(struct wl1271 *wl)
623 switch (wl->chip.id) {
624 case CHIP_ID_1271_PG10:
625 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
628 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS;
629 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
630 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
631 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
632 sizeof(wl->conf.mem));
634 /* read data preparation is only needed by wl127x */
635 wl->ops->prepare_read = wl127x_prepare_read;
639 case CHIP_ID_1271_PG20:
640 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
643 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS;
644 wl->plt_fw_name = WL127X_PLT_FW_NAME;
645 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
646 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
647 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
648 sizeof(wl->conf.mem));
650 /* read data preparation is only needed by wl127x */
651 wl->ops->prepare_read = wl127x_prepare_read;
655 case CHIP_ID_1283_PG20:
656 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
658 wl->plt_fw_name = WL128X_PLT_FW_NAME;
659 wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
660 wl->mr_fw_name = WL128X_FW_NAME_MULTI;
662 /* wl128x requires TX blocksize alignment */
663 wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
666 case CHIP_ID_1283_PG10:
668 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
677 static void wl12xx_top_reg_write(struct wl1271 *wl, int addr, u16 val)
679 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
680 addr = (addr >> 1) + 0x30000;
681 wl1271_write32(wl, WL12XX_OCP_POR_CTR, addr);
683 /* write value to OCP_POR_WDATA */
684 wl1271_write32(wl, WL12XX_OCP_DATA_WRITE, val);
686 /* write 1 to OCP_CMD */
687 wl1271_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
690 static u16 wl12xx_top_reg_read(struct wl1271 *wl, int addr)
693 int timeout = OCP_CMD_LOOP;
695 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
696 addr = (addr >> 1) + 0x30000;
697 wl1271_write32(wl, WL12XX_OCP_POR_CTR, addr);
699 /* write 2 to OCP_CMD */
700 wl1271_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
702 /* poll for data ready */
704 val = wl1271_read32(wl, WL12XX_OCP_DATA_READ);
705 } while (!(val & OCP_READY_MASK) && --timeout);
708 wl1271_warning("Top register access timed out.");
712 /* check data status and return if OK */
713 if ((val & OCP_STATUS_MASK) == OCP_STATUS_OK)
716 wl1271_warning("Top register access returned error.");
721 static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
725 /* Mask bits [2] & [8:4] in the sys_clk_cfg register */
726 spare_reg = wl12xx_top_reg_read(wl, WL_SPARE_REG);
727 if (spare_reg == 0xFFFF)
729 spare_reg |= (BIT(3) | BIT(5) | BIT(6));
730 wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
732 /* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
733 wl12xx_top_reg_write(wl, SYS_CLK_CFG_REG,
734 WL_CLK_REQ_TYPE_PG2 | MCS_PLL_CLK_SEL_FREF);
736 /* Delay execution for 15msec, to let the HW settle */
742 static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
746 tcxo_detection = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG);
747 if (tcxo_detection & TCXO_DET_FAILED)
753 static bool wl128x_is_fref_valid(struct wl1271 *wl)
757 fref_detection = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG);
758 if (fref_detection & FREF_CLK_DETECT_FAIL)
764 static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
766 wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
767 wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
768 wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, MCS_PLL_CONFIG_REG_VAL);
773 static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
778 struct wl12xx_priv *priv = wl->priv;
780 /* Mask bits [3:1] in the sys_clk_cfg register */
781 spare_reg = wl12xx_top_reg_read(wl, WL_SPARE_REG);
782 if (spare_reg == 0xFFFF)
785 wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
787 /* Handle special cases of the TCXO clock */
788 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_8 ||
789 priv->tcxo_clock == WL12XX_TCXOCLOCK_33_6)
790 return wl128x_manually_configure_mcs_pll(wl);
792 /* Set the input frequency according to the selected clock source */
793 input_freq = (clk & 1) + 1;
795 pll_config = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG);
796 if (pll_config == 0xFFFF)
798 pll_config |= (input_freq << MCS_SEL_IN_FREQ_SHIFT);
799 pll_config |= MCS_PLL_ENABLE_HP;
800 wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, pll_config);
806 * WL128x has two clocks input - TCXO and FREF.
807 * TCXO is the main clock of the device, while FREF is used to sync
808 * between the GPS and the cellular modem.
809 * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
810 * as the WLAN/BT main clock.
812 static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
814 struct wl12xx_priv *priv = wl->priv;
817 /* For XTAL-only modes, FREF will be used after switching from TCXO */
818 if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
819 priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
820 if (!wl128x_switch_tcxo_to_fref(wl))
825 /* Query the HW, to determine which clock source we should use */
826 sys_clk_cfg = wl12xx_top_reg_read(wl, SYS_CLK_CFG_REG);
827 if (sys_clk_cfg == 0xFFFF)
829 if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
832 /* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
833 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_368 ||
834 priv->tcxo_clock == WL12XX_TCXOCLOCK_32_736) {
835 if (!wl128x_switch_tcxo_to_fref(wl))
840 /* TCXO clock is selected */
841 if (!wl128x_is_tcxo_valid(wl))
843 *selected_clock = priv->tcxo_clock;
847 /* FREF clock is selected */
848 if (!wl128x_is_fref_valid(wl))
850 *selected_clock = priv->ref_clock;
853 return wl128x_configure_mcs_pll(wl, *selected_clock);
856 static int wl127x_boot_clk(struct wl1271 *wl)
858 struct wl12xx_priv *priv = wl->priv;
862 if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
863 wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
865 if (priv->ref_clock == CONF_REF_CLK_19_2_E ||
866 priv->ref_clock == CONF_REF_CLK_38_4_E ||
867 priv->ref_clock == CONF_REF_CLK_38_4_M_XTAL)
868 /* ref clk: 19.2/38.4/38.4-XTAL */
870 else if (priv->ref_clock == CONF_REF_CLK_26_E ||
871 priv->ref_clock == CONF_REF_CLK_52_E)
877 if (priv->ref_clock != CONF_REF_CLK_19_2_E) {
879 /* Set clock type (open drain) */
880 val = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE);
881 val &= FREF_CLK_TYPE_BITS;
882 wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
884 /* Set clock pull mode (no pull) */
885 val = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL);
887 wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
890 /* Set clock polarity */
891 val = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY);
892 val &= FREF_CLK_POLARITY_BITS;
893 val |= CLK_REQ_OUTN_SEL;
894 wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
897 wl1271_write32(wl, WL12XX_PLL_PARAMETERS, clk);
899 pause = wl1271_read32(wl, WL12XX_PLL_PARAMETERS);
901 wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
903 pause &= ~(WU_COUNTER_PAUSE_VAL);
904 pause |= WU_COUNTER_PAUSE_VAL;
905 wl1271_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
910 static int wl1271_boot_soft_reset(struct wl1271 *wl)
912 unsigned long timeout;
915 /* perform soft reset */
916 wl1271_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
918 /* SOFT_RESET is self clearing */
919 timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
921 boot_data = wl1271_read32(wl, WL12XX_SLV_SOFT_RESET);
922 wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
923 if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
926 if (time_after(jiffies, timeout)) {
927 /* 1.2 check pWhalBus->uSelfClearTime if the
928 * timeout was reached */
929 wl1271_error("soft reset timeout");
933 udelay(SOFT_RESET_STALL_TIME);
937 wl1271_write32(wl, WL12XX_ENABLE, 0x0);
939 /* disable auto calibration on start*/
940 wl1271_write32(wl, WL12XX_SPARE_A2, 0xffff);
945 static int wl12xx_pre_boot(struct wl1271 *wl)
947 struct wl12xx_priv *priv = wl->priv;
950 int selected_clock = -1;
952 if (wl->chip.id == CHIP_ID_1283_PG20) {
953 ret = wl128x_boot_clk(wl, &selected_clock);
957 ret = wl127x_boot_clk(wl);
962 /* Continue the ELP wake up sequence */
963 wl1271_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
966 wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
968 /* Read-modify-write DRPW_SCRATCH_START register (see next state)
969 to be used by DRPw FW. The RTRIM value will be added by the FW
970 before taking DRPw out of reset */
972 clk = wl1271_read32(wl, WL12XX_DRPW_SCRATCH_START);
974 wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
976 if (wl->chip.id == CHIP_ID_1283_PG20)
977 clk |= ((selected_clock & 0x3) << 1) << 4;
979 clk |= (priv->ref_clock << 1) << 4;
981 wl1271_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
983 wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
985 /* Disable interrupts */
986 wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
988 ret = wl1271_boot_soft_reset(wl);
996 static void wl12xx_pre_upload(struct wl1271 *wl)
1000 /* write firmware's last address (ie. it's length) to
1001 * ACX_EEPROMLESS_IND_REG */
1002 wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
1004 wl1271_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
1006 tmp = wlcore_read_reg(wl, REG_CHIP_ID_B);
1008 wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
1010 /* 6. read the EEPROM parameters */
1011 tmp = wl1271_read32(wl, WL12XX_SCR_PAD2);
1013 /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1016 if (wl->chip.id == CHIP_ID_1283_PG20)
1017 wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
1020 static void wl12xx_enable_interrupts(struct wl1271 *wl)
1024 polarity = wl12xx_top_reg_read(wl, OCP_REG_POLARITY);
1026 /* We use HIGH polarity, so unset the LOW bit */
1027 polarity &= ~POLARITY_LOW;
1028 wl12xx_top_reg_write(wl, OCP_REG_POLARITY, polarity);
1030 wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_ALL_EVENTS_VECTOR);
1032 wlcore_enable_interrupts(wl);
1033 wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1034 WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
1036 wl1271_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
1039 static int wl12xx_boot(struct wl1271 *wl)
1043 ret = wl12xx_pre_boot(wl);
1047 ret = wlcore_boot_upload_nvs(wl);
1051 wl12xx_pre_upload(wl);
1053 ret = wlcore_boot_upload_firmware(wl);
1057 ret = wlcore_boot_run_firmware(wl);
1061 wl12xx_enable_interrupts(wl);
1067 static void wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
1068 void *buf, size_t len)
1070 wl1271_write(wl, cmd_box_addr, buf, len, false);
1071 wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
1074 static void wl12xx_ack_event(struct wl1271 *wl)
1076 wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_EVENT_ACK);
1079 static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
1081 u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
1082 u32 align_len = wlcore_calc_packet_alignment(wl, len);
1084 return (align_len + blk_size - 1) / blk_size + spare_blks;
1088 wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1089 u32 blks, u32 spare_blks)
1091 if (wl->chip.id == CHIP_ID_1283_PG20) {
1092 desc->wl128x_mem.total_mem_blocks = blks;
1094 desc->wl127x_mem.extra_blocks = spare_blks;
1095 desc->wl127x_mem.total_mem_blocks = blks;
1100 wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1101 struct sk_buff *skb)
1103 u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
1105 if (wl->chip.id == CHIP_ID_1283_PG20) {
1106 desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
1107 desc->length = cpu_to_le16(aligned_len >> 2);
1109 wl1271_debug(DEBUG_TX,
1110 "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1112 le16_to_cpu(desc->length),
1113 le16_to_cpu(desc->life_time),
1114 desc->wl128x_mem.total_mem_blocks,
1115 desc->wl128x_mem.extra_bytes);
1117 /* calculate number of padding bytes */
1118 int pad = aligned_len - skb->len;
1120 cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
1122 /* Store the aligned length in terms of words */
1123 desc->length = cpu_to_le16(aligned_len >> 2);
1125 wl1271_debug(DEBUG_TX,
1126 "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1128 le16_to_cpu(desc->length),
1129 le16_to_cpu(desc->life_time),
1130 desc->wl127x_mem.total_mem_blocks);
1134 static enum wl_rx_buf_align
1135 wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
1137 if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
1138 return WLCORE_RX_BUF_UNALIGNED;
1140 return WLCORE_RX_BUF_ALIGNED;
1143 static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
1146 struct wl1271_rx_descriptor *desc = rx_data;
1148 /* invalid packet */
1149 if (data_len < sizeof(*desc) ||
1150 data_len < sizeof(*desc) + desc->pad_len)
1153 return data_len - sizeof(*desc) - desc->pad_len;
1156 static void wl12xx_tx_delayed_compl(struct wl1271 *wl)
1158 if (wl->fw_status_1->tx_results_counter ==
1159 (wl->tx_results_count & 0xff))
1162 wl1271_tx_complete(wl);
1165 static int wl12xx_hw_init(struct wl1271 *wl)
1169 if (wl->chip.id == CHIP_ID_1283_PG20) {
1170 u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
1172 ret = wl128x_cmd_general_parms(wl);
1175 ret = wl128x_cmd_radio_parms(wl);
1179 if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
1180 /* Enable SDIO padding */
1181 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
1183 /* Must be before wl1271_acx_init_mem_config() */
1184 ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
1188 ret = wl1271_cmd_general_parms(wl);
1191 ret = wl1271_cmd_radio_parms(wl);
1194 ret = wl1271_cmd_ext_radio_parms(wl);
1202 static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1203 struct wl12xx_vif *wlvif)
1205 return wlvif->rate_set;
1208 static int wl12xx_identify_fw(struct wl1271 *wl)
1210 unsigned int *fw_ver = wl->chip.fw_ver;
1212 /* Only new station firmwares support routing fw logs to the host */
1213 if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
1214 (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN))
1215 wl->quirks |= WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED;
1217 /* This feature is not yet supported for AP mode */
1218 if (fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP)
1219 wl->quirks |= WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED;
1224 static void wl12xx_conf_init(struct wl1271 *wl)
1226 struct wl12xx_priv *priv = wl->priv;
1228 /* apply driver default configuration */
1229 memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
1231 /* apply default private configuration */
1232 memcpy(&priv->conf, &wl12xx_default_priv_conf, sizeof(priv->conf));
1235 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
1237 bool supported = false;
1240 if (wl->chip.id == CHIP_ID_1283_PG20) {
1241 major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
1242 minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
1244 /* in wl128x we have the MAC address if the PG is >= (2, 1) */
1245 if (major > 2 || (major == 2 && minor >= 1))
1248 major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
1249 minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
1251 /* in wl127x we have the MAC address if the PG is >= (3, 1) */
1252 if (major == 3 && minor >= 1)
1256 wl1271_debug(DEBUG_PROBE,
1257 "PG Ver major = %d minor = %d, MAC %s present",
1258 major, minor, supported ? "is" : "is not");
1263 static void wl12xx_get_fuse_mac(struct wl1271 *wl)
1267 wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1269 mac1 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1);
1270 mac2 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2);
1272 /* these are the two parts of the BD_ADDR */
1273 wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
1274 ((mac1 & 0xff000000) >> 24);
1275 wl->fuse_nic_addr = mac1 & 0xffffff;
1277 wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1280 static s8 wl12xx_get_pg_ver(struct wl1271 *wl)
1284 if (wl->chip.id == CHIP_ID_1283_PG20)
1285 die_info = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
1287 die_info = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
1289 return (s8) (die_info & PG_VER_MASK) >> PG_VER_OFFSET;
1292 static void wl12xx_get_mac(struct wl1271 *wl)
1294 if (wl12xx_mac_in_fuse(wl))
1295 wl12xx_get_fuse_mac(wl);
1298 static void wl12xx_set_tx_desc_csum(struct wl1271 *wl,
1299 struct wl1271_tx_hw_descr *desc,
1300 struct sk_buff *skb)
1302 desc->wl12xx_reserved = 0;
1305 static int wl12xx_plt_init(struct wl1271 *wl)
1309 ret = wl->ops->boot(wl);
1313 ret = wl->ops->hw_init(wl);
1315 goto out_irq_disable;
1317 ret = wl1271_acx_init_mem_config(wl);
1319 goto out_irq_disable;
1321 ret = wl12xx_acx_mem_cfg(wl);
1323 goto out_free_memmap;
1325 /* Enable data path */
1326 ret = wl1271_cmd_data_path(wl, 1);
1328 goto out_free_memmap;
1330 /* Configure for CAM power saving (ie. always active) */
1331 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
1333 goto out_free_memmap;
1336 ret = wl1271_acx_pm_config(wl);
1338 goto out_free_memmap;
1343 kfree(wl->target_mem_map);
1344 wl->target_mem_map = NULL;
1347 mutex_unlock(&wl->mutex);
1348 /* Unlocking the mutex in the middle of handling is
1349 inherently unsafe. In this case we deem it safe to do,
1350 because we need to let any possibly pending IRQ out of
1351 the system (and while we are WL1271_STATE_OFF the IRQ
1352 work function will not do anything.) Also, any other
1353 possible concurrent operations will fail due to the
1354 current state, hence the wl1271 struct should be safe. */
1355 wlcore_disable_interrupts(wl);
1356 mutex_lock(&wl->mutex);
1361 static struct wlcore_ops wl12xx_ops = {
1362 .identify_chip = wl12xx_identify_chip,
1363 .identify_fw = wl12xx_identify_fw,
1364 .boot = wl12xx_boot,
1365 .plt_init = wl12xx_plt_init,
1366 .trigger_cmd = wl12xx_trigger_cmd,
1367 .ack_event = wl12xx_ack_event,
1368 .calc_tx_blocks = wl12xx_calc_tx_blocks,
1369 .set_tx_desc_blocks = wl12xx_set_tx_desc_blocks,
1370 .set_tx_desc_data_len = wl12xx_set_tx_desc_data_len,
1371 .get_rx_buf_align = wl12xx_get_rx_buf_align,
1372 .get_rx_packet_len = wl12xx_get_rx_packet_len,
1373 .tx_immediate_compl = NULL,
1374 .tx_delayed_compl = wl12xx_tx_delayed_compl,
1375 .hw_init = wl12xx_hw_init,
1377 .sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask,
1378 .get_pg_ver = wl12xx_get_pg_ver,
1379 .get_mac = wl12xx_get_mac,
1380 .set_tx_desc_csum = wl12xx_set_tx_desc_csum,
1381 .set_rx_csum = NULL,
1382 .ap_get_mimo_wide_rate_mask = NULL,
1383 .debugfs_init = wl12xx_debugfs_add_files,
1386 static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
1387 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 |
1388 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT),
1389 .ht_supported = true,
1390 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K,
1391 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8,
1393 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1394 .rx_highest = cpu_to_le16(72),
1395 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1399 static int __devinit wl12xx_probe(struct platform_device *pdev)
1401 struct wl12xx_platform_data *pdata = pdev->dev.platform_data;
1403 struct ieee80211_hw *hw;
1404 struct wl12xx_priv *priv;
1406 hw = wlcore_alloc_hw(sizeof(*priv));
1408 wl1271_error("can't allocate hw");
1414 wl->ops = &wl12xx_ops;
1415 wl->ptable = wl12xx_ptable;
1416 wl->rtable = wl12xx_rtable;
1417 wl->num_tx_desc = 16;
1418 wl->num_rx_desc = 8;
1419 wl->normal_tx_spare = WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
1420 wl->gem_tx_spare = WL12XX_TX_HW_BLOCK_GEM_SPARE;
1421 wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
1422 wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
1423 wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
1424 wl->fw_status_priv_len = 0;
1425 wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
1426 memcpy(&wl->ht_cap, &wl12xx_ht_cap, sizeof(wl12xx_ht_cap));
1427 wl12xx_conf_init(wl);
1430 priv->ref_clock = pdata->board_ref_clock;
1432 if (!strcmp(fref_param, "19.2"))
1433 priv->ref_clock = WL12XX_REFCLOCK_19;
1434 else if (!strcmp(fref_param, "26"))
1435 priv->ref_clock = WL12XX_REFCLOCK_26;
1436 else if (!strcmp(fref_param, "26x"))
1437 priv->ref_clock = WL12XX_REFCLOCK_26_XTAL;
1438 else if (!strcmp(fref_param, "38.4"))
1439 priv->ref_clock = WL12XX_REFCLOCK_38;
1440 else if (!strcmp(fref_param, "38.4x"))
1441 priv->ref_clock = WL12XX_REFCLOCK_38_XTAL;
1442 else if (!strcmp(fref_param, "52"))
1443 priv->ref_clock = WL12XX_REFCLOCK_52;
1445 wl1271_error("Invalid fref parameter %s", fref_param);
1449 priv->tcxo_clock = pdata->board_tcxo_clock;
1451 if (!strcmp(tcxo_param, "19.2"))
1452 priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
1453 else if (!strcmp(tcxo_param, "26"))
1454 priv->tcxo_clock = WL12XX_TCXOCLOCK_26;
1455 else if (!strcmp(tcxo_param, "38.4"))
1456 priv->tcxo_clock = WL12XX_TCXOCLOCK_38_4;
1457 else if (!strcmp(tcxo_param, "52"))
1458 priv->tcxo_clock = WL12XX_TCXOCLOCK_52;
1459 else if (!strcmp(tcxo_param, "16.368"))
1460 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_368;
1461 else if (!strcmp(tcxo_param, "32.736"))
1462 priv->tcxo_clock = WL12XX_TCXOCLOCK_32_736;
1463 else if (!strcmp(tcxo_param, "16.8"))
1464 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_8;
1465 else if (!strcmp(tcxo_param, "33.6"))
1466 priv->tcxo_clock = WL12XX_TCXOCLOCK_33_6;
1468 wl1271_error("Invalid tcxo parameter %s", tcxo_param);
1471 return wlcore_probe(wl, pdev);
1474 static const struct platform_device_id wl12xx_id_table[] __devinitconst = {
1476 { } /* Terminating Entry */
1478 MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
1480 static struct platform_driver wl12xx_driver = {
1481 .probe = wl12xx_probe,
1482 .remove = __devexit_p(wlcore_remove),
1483 .id_table = wl12xx_id_table,
1485 .name = "wl12xx_driver",
1486 .owner = THIS_MODULE,
1490 static int __init wl12xx_init(void)
1492 return platform_driver_register(&wl12xx_driver);
1494 module_init(wl12xx_init);
1496 static void __exit wl12xx_exit(void)
1498 platform_driver_unregister(&wl12xx_driver);
1500 module_exit(wl12xx_exit);
1502 module_param_named(fref, fref_param, charp, 0);
1503 MODULE_PARM_DESC(fref, "FREF clock: 19.2, 26, 26x, 38.4, 38.4x, 52");
1505 module_param_named(tcxo, tcxo_param, charp, 0);
1506 MODULE_PARM_DESC(tcxo,
1507 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
1509 MODULE_LICENSE("GPL v2");
1510 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
1511 MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
1512 MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
1513 MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
1514 MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
1515 MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
1516 MODULE_FIRMWARE(WL128X_PLT_FW_NAME);