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/mod_devicetable.h>
24 #include <linux/platform_device.h>
26 #include <linux/err.h>
28 #include "../wlcore/wlcore.h"
29 #include "../wlcore/debug.h"
30 #include "../wlcore/io.h"
31 #include "../wlcore/acx.h"
32 #include "../wlcore/tx.h"
33 #include "../wlcore/rx.h"
34 #include "../wlcore/boot.h"
45 static char *fref_param;
46 static char *tcxo_param;
48 static struct wlcore_conf wl12xx_conf = {
51 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
52 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
53 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
54 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
55 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
56 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
57 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
58 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
59 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
60 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
61 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
62 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
63 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
64 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
65 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
66 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
67 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
68 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
69 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
70 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
71 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
72 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
73 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
74 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
75 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
76 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
77 /* active scan params */
78 [WL12XX_CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
79 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
80 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
81 /* passive scan params */
82 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_BR] = 800,
83 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_EDR] = 200,
84 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_HV3] = 200,
85 /* passive scan in dual antenna params */
86 [WL12XX_CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
87 [WL12XX_CONF_SG_BCN_HV3_COLL_THR_IN_PASSIVE_SCAN] = 0,
88 [WL12XX_CONF_SG_TX_RX_PROTECT_BW_IN_PASSIVE_SCAN] = 0,
90 [WL12XX_CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
91 [WL12XX_CONF_SG_ANTENNA_CONFIGURATION] = 0,
92 [WL12XX_CONF_SG_BEACON_MISS_PERCENT] = 60,
93 [WL12XX_CONF_SG_DHCP_TIME] = 5000,
94 [WL12XX_CONF_SG_RXT] = 1200,
95 [WL12XX_CONF_SG_TXT] = 1000,
96 [WL12XX_CONF_SG_ADAPTIVE_RXT_TXT] = 1,
97 [WL12XX_CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
98 [WL12XX_CONF_SG_HV3_MAX_SERVED] = 6,
99 [WL12XX_CONF_SG_PS_POLL_TIMEOUT] = 10,
100 [WL12XX_CONF_SG_UPSD_TIMEOUT] = 10,
101 [WL12XX_CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
102 [WL12XX_CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
103 [WL12XX_CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
105 [WL12XX_CONF_AP_BEACON_MISS_TX] = 3,
106 [WL12XX_CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
107 [WL12XX_CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
108 [WL12XX_CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
109 [WL12XX_CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
110 [WL12XX_CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
111 /* CTS Diluting params */
112 [WL12XX_CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
113 [WL12XX_CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
115 .state = CONF_SG_PROTECTIVE,
118 .rx_msdu_life_time = 512000,
119 .packet_detection_threshold = 0,
120 .ps_poll_timeout = 15,
122 .rts_threshold = IEEE80211_MAX_RTS_THRESHOLD,
123 .rx_cca_threshold = 0,
124 .irq_blk_threshold = 0xFFFF,
125 .irq_pkt_threshold = 0,
127 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
130 .tx_energy_detection = 0,
133 .short_retry_limit = 10,
134 .long_retry_limit = 10,
157 .aifsn = CONF_TX_AIFS_PIFS,
164 .aifsn = CONF_TX_AIFS_PIFS,
168 .max_tx_retries = 100,
169 .ap_aging_period = 300,
173 .queue_id = CONF_TX_AC_BE,
174 .channel_type = CONF_CHANNEL_TYPE_EDCF,
175 .tsid = CONF_TX_AC_BE,
176 .ps_scheme = CONF_PS_SCHEME_LEGACY,
177 .ack_policy = CONF_ACK_POLICY_LEGACY,
181 .queue_id = CONF_TX_AC_BK,
182 .channel_type = CONF_CHANNEL_TYPE_EDCF,
183 .tsid = CONF_TX_AC_BK,
184 .ps_scheme = CONF_PS_SCHEME_LEGACY,
185 .ack_policy = CONF_ACK_POLICY_LEGACY,
189 .queue_id = CONF_TX_AC_VI,
190 .channel_type = CONF_CHANNEL_TYPE_EDCF,
191 .tsid = CONF_TX_AC_VI,
192 .ps_scheme = CONF_PS_SCHEME_LEGACY,
193 .ack_policy = CONF_ACK_POLICY_LEGACY,
197 .queue_id = CONF_TX_AC_VO,
198 .channel_type = CONF_CHANNEL_TYPE_EDCF,
199 .tsid = CONF_TX_AC_VO,
200 .ps_scheme = CONF_PS_SCHEME_LEGACY,
201 .ack_policy = CONF_ACK_POLICY_LEGACY,
205 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
206 .tx_compl_timeout = 700,
207 .tx_compl_threshold = 4,
208 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
209 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
210 .tmpl_short_retry_limit = 10,
211 .tmpl_long_retry_limit = 10,
212 .tx_watchdog_timeout = 5000,
213 .slow_link_thold = 3,
214 .fast_link_thold = 10,
217 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
218 .listen_interval = 1,
219 .suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM,
220 .suspend_listen_interval = 3,
221 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
222 .bcn_filt_ie_count = 3,
225 .ie = WLAN_EID_CHANNEL_SWITCH,
226 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
229 .ie = WLAN_EID_HT_OPERATION,
230 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
233 .ie = WLAN_EID_ERP_INFO,
234 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
237 .synch_fail_thold = 12,
238 .bss_lose_timeout = 400,
239 .beacon_rx_timeout = 10000,
240 .broadcast_timeout = 20000,
241 .rx_broadcast_in_ps = 1,
242 .ps_poll_threshold = 10,
243 .bet_enable = CONF_BET_MODE_ENABLE,
244 .bet_max_consecutive = 50,
245 .psm_entry_retries = 8,
246 .psm_exit_retries = 16,
247 .psm_entry_nullfunc_retries = 3,
248 .dynamic_ps_timeout = 1500,
250 .keep_alive_interval = 55000,
251 .max_listen_interval = 20,
252 .sta_sleep_auth = WL1271_PSM_ILLEGAL,
253 .suspend_rx_ba_activity = 0,
260 .host_clk_settling_time = 5000,
261 .host_fast_wakeup_support = CONF_FAST_WAKEUP_DISABLE,
265 .avg_weight_rssi_beacon = 20,
266 .avg_weight_rssi_data = 10,
267 .avg_weight_snr_beacon = 20,
268 .avg_weight_snr_data = 10,
271 .min_dwell_time_active = 7500,
272 .max_dwell_time_active = 30000,
273 .min_dwell_time_active_long = 25000,
274 .max_dwell_time_active_long = 50000,
275 .dwell_time_passive = 100000,
276 .dwell_time_dfs = 150000,
278 .split_scan_timeout = 50000,
282 * Values are in TU/1000 but since sched scan FW command
283 * params are in TUs rounding up may occur.
285 .base_dwell_time = 7500,
286 .max_dwell_time_delta = 22500,
287 /* based on 250bits per probe @1Mbps */
288 .dwell_time_delta_per_probe = 2000,
289 /* based on 250bits per probe @6Mbps (plus a bit more) */
290 .dwell_time_delta_per_probe_5 = 350,
291 .dwell_time_passive = 100000,
292 .dwell_time_dfs = 150000,
294 .rssi_threshold = -90,
299 .tx_ba_win_size = 64,
300 .inactivity_timeout = 10000,
301 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
304 * Memory config for wl127x chips is given in the
305 * wl12xx_default_priv_conf struct. The below configuration is
312 .tx_min_block_num = 40,
314 .min_req_tx_blocks = 45,
315 .min_req_rx_blocks = 22,
321 .n_divider_fref_set_1 = 0xff, /* default */
322 .n_divider_fref_set_2 = 12,
323 .m_divider_fref_set_1 = 0xffff,
324 .m_divider_fref_set_2 = 148, /* default */
325 .coex_pll_stabilization_time = 0xffffffff, /* default */
326 .ldo_stabilization_time = 0xffff, /* default */
327 .fm_disturbed_band_margin = 0xff, /* default */
328 .swallow_clk_diff = 0xff, /* default */
337 .mode = WL12XX_FWLOG_CONTINUOUS,
340 .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
341 .output = WL12XX_FWLOG_OUTPUT_DBG_PINS,
345 .rate_retry_score = 32000,
350 .inverse_curiosity_factor = 5,
352 .tx_fail_high_th = 10,
353 .per_alpha_shift = 4,
355 .per_beta1_shift = 10,
356 .per_beta2_shift = 8,
358 .rate_check_down = 12,
359 .rate_retry_policy = {
360 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00,
367 .hangover_period = 20,
369 .early_termination_mode = 1,
379 .bug_on_recovery = 0,
384 static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
386 .tx_per_channel_power_compensation_2 = {
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 .tx_per_channel_power_compensation_5 = {
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 .tx_min_block_num = 40,
401 .min_req_tx_blocks = 100,
402 .min_req_rx_blocks = 22,
408 #define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT 1
409 #define WL12XX_TX_HW_BLOCK_GEM_SPARE 2
410 #define WL12XX_TX_HW_BLOCK_SIZE 252
412 static const u8 wl12xx_rate_to_idx_2ghz[] = {
413 /* MCS rates are used only with 11n */
414 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
415 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
416 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
417 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
418 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
419 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
420 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
421 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
422 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
424 11, /* WL12XX_CONF_HW_RXTX_RATE_54 */
425 10, /* WL12XX_CONF_HW_RXTX_RATE_48 */
426 9, /* WL12XX_CONF_HW_RXTX_RATE_36 */
427 8, /* WL12XX_CONF_HW_RXTX_RATE_24 */
429 /* TI-specific rate */
430 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
432 7, /* WL12XX_CONF_HW_RXTX_RATE_18 */
433 6, /* WL12XX_CONF_HW_RXTX_RATE_12 */
434 3, /* WL12XX_CONF_HW_RXTX_RATE_11 */
435 5, /* WL12XX_CONF_HW_RXTX_RATE_9 */
436 4, /* WL12XX_CONF_HW_RXTX_RATE_6 */
437 2, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
438 1, /* WL12XX_CONF_HW_RXTX_RATE_2 */
439 0 /* WL12XX_CONF_HW_RXTX_RATE_1 */
442 static const u8 wl12xx_rate_to_idx_5ghz[] = {
443 /* MCS rates are used only with 11n */
444 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
445 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
446 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
447 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
448 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
449 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
450 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
451 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
452 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
454 7, /* WL12XX_CONF_HW_RXTX_RATE_54 */
455 6, /* WL12XX_CONF_HW_RXTX_RATE_48 */
456 5, /* WL12XX_CONF_HW_RXTX_RATE_36 */
457 4, /* WL12XX_CONF_HW_RXTX_RATE_24 */
459 /* TI-specific rate */
460 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
462 3, /* WL12XX_CONF_HW_RXTX_RATE_18 */
463 2, /* WL12XX_CONF_HW_RXTX_RATE_12 */
464 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_11 */
465 1, /* WL12XX_CONF_HW_RXTX_RATE_9 */
466 0, /* WL12XX_CONF_HW_RXTX_RATE_6 */
467 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
468 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_2 */
469 CONF_HW_RXTX_RATE_UNSUPPORTED /* WL12XX_CONF_HW_RXTX_RATE_1 */
472 static const u8 *wl12xx_band_rate_to_idx[] = {
473 [NL80211_BAND_2GHZ] = wl12xx_rate_to_idx_2ghz,
474 [NL80211_BAND_5GHZ] = wl12xx_rate_to_idx_5ghz
477 enum wl12xx_hw_rates {
478 WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI = 0,
479 WL12XX_CONF_HW_RXTX_RATE_MCS7,
480 WL12XX_CONF_HW_RXTX_RATE_MCS6,
481 WL12XX_CONF_HW_RXTX_RATE_MCS5,
482 WL12XX_CONF_HW_RXTX_RATE_MCS4,
483 WL12XX_CONF_HW_RXTX_RATE_MCS3,
484 WL12XX_CONF_HW_RXTX_RATE_MCS2,
485 WL12XX_CONF_HW_RXTX_RATE_MCS1,
486 WL12XX_CONF_HW_RXTX_RATE_MCS0,
487 WL12XX_CONF_HW_RXTX_RATE_54,
488 WL12XX_CONF_HW_RXTX_RATE_48,
489 WL12XX_CONF_HW_RXTX_RATE_36,
490 WL12XX_CONF_HW_RXTX_RATE_24,
491 WL12XX_CONF_HW_RXTX_RATE_22,
492 WL12XX_CONF_HW_RXTX_RATE_18,
493 WL12XX_CONF_HW_RXTX_RATE_12,
494 WL12XX_CONF_HW_RXTX_RATE_11,
495 WL12XX_CONF_HW_RXTX_RATE_9,
496 WL12XX_CONF_HW_RXTX_RATE_6,
497 WL12XX_CONF_HW_RXTX_RATE_5_5,
498 WL12XX_CONF_HW_RXTX_RATE_2,
499 WL12XX_CONF_HW_RXTX_RATE_1,
500 WL12XX_CONF_HW_RXTX_RATE_MAX,
503 static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
510 .start = REGISTERS_BASE,
523 [PART_BOOT] = { /* in wl12xx we can use a mix of work and down
530 .start = REGISTERS_BASE,
549 .start = REGISTERS_BASE,
582 static const int wl12xx_rtable[REG_TABLE_LEN] = {
583 [REG_ECPU_CONTROL] = WL12XX_REG_ECPU_CONTROL,
584 [REG_INTERRUPT_NO_CLEAR] = WL12XX_REG_INTERRUPT_NO_CLEAR,
585 [REG_INTERRUPT_ACK] = WL12XX_REG_INTERRUPT_ACK,
586 [REG_COMMAND_MAILBOX_PTR] = WL12XX_REG_COMMAND_MAILBOX_PTR,
587 [REG_EVENT_MAILBOX_PTR] = WL12XX_REG_EVENT_MAILBOX_PTR,
588 [REG_INTERRUPT_TRIG] = WL12XX_REG_INTERRUPT_TRIG,
589 [REG_INTERRUPT_MASK] = WL12XX_REG_INTERRUPT_MASK,
590 [REG_PC_ON_RECOVERY] = WL12XX_SCR_PAD4,
591 [REG_CHIP_ID_B] = WL12XX_CHIP_ID_B,
592 [REG_CMD_MBOX_ADDRESS] = WL12XX_CMD_MBOX_ADDRESS,
594 /* data access memory addresses, used with partition translation */
595 [REG_SLV_MEM_DATA] = WL1271_SLV_MEM_DATA,
596 [REG_SLV_REG_DATA] = WL1271_SLV_REG_DATA,
598 /* raw data access memory addresses */
599 [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR,
602 /* TODO: maybe move to a new header file? */
603 #define WL127X_FW_NAME_MULTI "/*(DEBLOBBED)*/"
604 #define WL127X_FW_NAME_SINGLE "/*(DEBLOBBED)*/"
605 #define WL127X_PLT_FW_NAME "/*(DEBLOBBED)*/"
607 #define WL128X_FW_NAME_MULTI "/*(DEBLOBBED)*/"
608 #define WL128X_FW_NAME_SINGLE "/*(DEBLOBBED)*/"
609 #define WL128X_PLT_FW_NAME "/*(DEBLOBBED)*/"
611 static int wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
615 if (wl->chip.id != CHIP_ID_128X_PG20) {
616 struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
617 struct wl12xx_priv *priv = wl->priv;
620 * Choose the block we want to read
621 * For aggregated packets, only the first memory block
622 * should be retrieved. The FW takes care of the rest.
624 u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
626 priv->rx_mem_addr->addr = (mem_block << 8) +
627 le32_to_cpu(wl_mem_map->packet_memory_pool_start);
629 priv->rx_mem_addr->addr_extra = priv->rx_mem_addr->addr + 4;
631 ret = wlcore_write(wl, WL1271_SLV_REG_DATA, priv->rx_mem_addr,
632 sizeof(*priv->rx_mem_addr), false);
640 static int wl12xx_identify_chip(struct wl1271 *wl)
644 switch (wl->chip.id) {
645 case CHIP_ID_127X_PG10:
646 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
649 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
650 WLCORE_QUIRK_DUAL_PROBE_TMPL |
651 WLCORE_QUIRK_TKIP_HEADER_SPACE |
652 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
653 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
654 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
655 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
656 sizeof(wl->conf.mem));
658 /* read data preparation is only needed by wl127x */
659 wl->ops->prepare_read = wl127x_prepare_read;
661 wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
662 WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER,
663 WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
664 WL127X_IFTYPE_MR_VER, WL127X_MAJOR_MR_VER,
665 WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
668 case CHIP_ID_127X_PG20:
669 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
672 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
673 WLCORE_QUIRK_DUAL_PROBE_TMPL |
674 WLCORE_QUIRK_TKIP_HEADER_SPACE |
675 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
676 wl->plt_fw_name = WL127X_PLT_FW_NAME;
677 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
678 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
679 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
680 sizeof(wl->conf.mem));
682 /* read data preparation is only needed by wl127x */
683 wl->ops->prepare_read = wl127x_prepare_read;
685 wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
686 WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER,
687 WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
688 WL127X_IFTYPE_MR_VER, WL127X_MAJOR_MR_VER,
689 WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
692 case CHIP_ID_128X_PG20:
693 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
695 wl->plt_fw_name = WL128X_PLT_FW_NAME;
696 wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
697 wl->mr_fw_name = WL128X_FW_NAME_MULTI;
699 /* wl128x requires TX blocksize alignment */
700 wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
701 WLCORE_QUIRK_DUAL_PROBE_TMPL |
702 WLCORE_QUIRK_TKIP_HEADER_SPACE |
703 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
705 wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER,
706 WL128X_IFTYPE_SR_VER, WL128X_MAJOR_SR_VER,
707 WL128X_SUBTYPE_SR_VER, WL128X_MINOR_SR_VER,
708 WL128X_IFTYPE_MR_VER, WL128X_MAJOR_MR_VER,
709 WL128X_SUBTYPE_MR_VER, WL128X_MINOR_MR_VER);
711 case CHIP_ID_128X_PG10:
713 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
718 wl->fw_mem_block_size = 256;
719 wl->fwlog_end = 0x2000000;
721 /* common settings */
722 wl->scan_templ_id_2_4 = CMD_TEMPL_APP_PROBE_REQ_2_4_LEGACY;
723 wl->scan_templ_id_5 = CMD_TEMPL_APP_PROBE_REQ_5_LEGACY;
724 wl->sched_scan_templ_id_2_4 = CMD_TEMPL_CFG_PROBE_REQ_2_4;
725 wl->sched_scan_templ_id_5 = CMD_TEMPL_CFG_PROBE_REQ_5;
726 wl->max_channels_5 = WL12XX_MAX_CHANNELS_5GHZ;
727 wl->ba_rx_session_count_max = WL12XX_RX_BA_MAX_SESSIONS;
732 static int __must_check wl12xx_top_reg_write(struct wl1271 *wl, int addr,
737 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
738 addr = (addr >> 1) + 0x30000;
739 ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
743 /* write value to OCP_POR_WDATA */
744 ret = wlcore_write32(wl, WL12XX_OCP_DATA_WRITE, val);
748 /* write 1 to OCP_CMD */
749 ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
757 static int __must_check wl12xx_top_reg_read(struct wl1271 *wl, int addr,
761 int timeout = OCP_CMD_LOOP;
764 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
765 addr = (addr >> 1) + 0x30000;
766 ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
770 /* write 2 to OCP_CMD */
771 ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
775 /* poll for data ready */
777 ret = wlcore_read32(wl, WL12XX_OCP_DATA_READ, &val);
780 } while (!(val & OCP_READY_MASK) && --timeout);
783 wl1271_warning("Top register access timed out.");
787 /* check data status and return if OK */
788 if ((val & OCP_STATUS_MASK) != OCP_STATUS_OK) {
789 wl1271_warning("Top register access returned error.");
799 static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
804 /* Mask bits [2] & [8:4] in the sys_clk_cfg register */
805 ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
809 if (spare_reg == 0xFFFF)
811 spare_reg |= (BIT(3) | BIT(5) | BIT(6));
812 ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
816 /* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
817 ret = wl12xx_top_reg_write(wl, SYS_CLK_CFG_REG,
818 WL_CLK_REQ_TYPE_PG2 | MCS_PLL_CLK_SEL_FREF);
822 /* Delay execution for 15msec, to let the HW settle */
828 static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
833 ret = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG, &tcxo_detection);
837 if (tcxo_detection & TCXO_DET_FAILED)
843 static bool wl128x_is_fref_valid(struct wl1271 *wl)
848 ret = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG, &fref_detection);
852 if (fref_detection & FREF_CLK_DETECT_FAIL)
858 static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
862 ret = wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
866 ret = wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
870 ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG,
871 MCS_PLL_CONFIG_REG_VAL);
877 static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
882 struct wl12xx_priv *priv = wl->priv;
885 /* Mask bits [3:1] in the sys_clk_cfg register */
886 ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
890 if (spare_reg == 0xFFFF)
893 ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
897 /* Handle special cases of the TCXO clock */
898 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_8 ||
899 priv->tcxo_clock == WL12XX_TCXOCLOCK_33_6)
900 return wl128x_manually_configure_mcs_pll(wl);
902 /* Set the input frequency according to the selected clock source */
903 input_freq = (clk & 1) + 1;
905 ret = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG, &pll_config);
909 if (pll_config == 0xFFFF)
911 pll_config |= (input_freq << MCS_SEL_IN_FREQ_SHIFT);
912 pll_config |= MCS_PLL_ENABLE_HP;
913 ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, pll_config);
919 * WL128x has two clocks input - TCXO and FREF.
920 * TCXO is the main clock of the device, while FREF is used to sync
921 * between the GPS and the cellular modem.
922 * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
923 * as the WLAN/BT main clock.
925 static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
927 struct wl12xx_priv *priv = wl->priv;
931 /* For XTAL-only modes, FREF will be used after switching from TCXO */
932 if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
933 priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
934 if (!wl128x_switch_tcxo_to_fref(wl))
939 /* Query the HW, to determine which clock source we should use */
940 ret = wl12xx_top_reg_read(wl, SYS_CLK_CFG_REG, &sys_clk_cfg);
944 if (sys_clk_cfg == 0xFFFF)
946 if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
949 /* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
950 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_368 ||
951 priv->tcxo_clock == WL12XX_TCXOCLOCK_32_736) {
952 if (!wl128x_switch_tcxo_to_fref(wl))
957 /* TCXO clock is selected */
958 if (!wl128x_is_tcxo_valid(wl))
960 *selected_clock = priv->tcxo_clock;
964 /* FREF clock is selected */
965 if (!wl128x_is_fref_valid(wl))
967 *selected_clock = priv->ref_clock;
970 return wl128x_configure_mcs_pll(wl, *selected_clock);
973 static int wl127x_boot_clk(struct wl1271 *wl)
975 struct wl12xx_priv *priv = wl->priv;
980 if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
981 wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
983 if (priv->ref_clock == CONF_REF_CLK_19_2_E ||
984 priv->ref_clock == CONF_REF_CLK_38_4_E ||
985 priv->ref_clock == CONF_REF_CLK_38_4_M_XTAL)
986 /* ref clk: 19.2/38.4/38.4-XTAL */
988 else if (priv->ref_clock == CONF_REF_CLK_26_E ||
989 priv->ref_clock == CONF_REF_CLK_26_M_XTAL ||
990 priv->ref_clock == CONF_REF_CLK_52_E)
996 if (priv->ref_clock != CONF_REF_CLK_19_2_E) {
998 /* Set clock type (open drain) */
999 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE, &val);
1003 val &= FREF_CLK_TYPE_BITS;
1004 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
1008 /* Set clock pull mode (no pull) */
1009 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL, &val);
1014 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
1019 /* Set clock polarity */
1020 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY, &val);
1024 val &= FREF_CLK_POLARITY_BITS;
1025 val |= CLK_REQ_OUTN_SEL;
1026 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
1031 ret = wlcore_write32(wl, WL12XX_PLL_PARAMETERS, clk);
1035 ret = wlcore_read32(wl, WL12XX_PLL_PARAMETERS, &pause);
1039 wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
1041 pause &= ~(WU_COUNTER_PAUSE_VAL);
1042 pause |= WU_COUNTER_PAUSE_VAL;
1043 ret = wlcore_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
1049 static int wl1271_boot_soft_reset(struct wl1271 *wl)
1051 unsigned long timeout;
1055 /* perform soft reset */
1056 ret = wlcore_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
1060 /* SOFT_RESET is self clearing */
1061 timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
1063 ret = wlcore_read32(wl, WL12XX_SLV_SOFT_RESET, &boot_data);
1067 wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
1068 if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
1071 if (time_after(jiffies, timeout)) {
1072 /* 1.2 check pWhalBus->uSelfClearTime if the
1073 * timeout was reached */
1074 wl1271_error("soft reset timeout");
1078 udelay(SOFT_RESET_STALL_TIME);
1082 ret = wlcore_write32(wl, WL12XX_ENABLE, 0x0);
1086 /* disable auto calibration on start*/
1087 ret = wlcore_write32(wl, WL12XX_SPARE_A2, 0xffff);
1093 static int wl12xx_pre_boot(struct wl1271 *wl)
1095 struct wl12xx_priv *priv = wl->priv;
1098 int selected_clock = -1;
1100 if (wl->chip.id == CHIP_ID_128X_PG20) {
1101 ret = wl128x_boot_clk(wl, &selected_clock);
1105 ret = wl127x_boot_clk(wl);
1110 /* Continue the ELP wake up sequence */
1111 ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1117 ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1121 /* Read-modify-write DRPW_SCRATCH_START register (see next state)
1122 to be used by DRPw FW. The RTRIM value will be added by the FW
1123 before taking DRPw out of reset */
1125 ret = wlcore_read32(wl, WL12XX_DRPW_SCRATCH_START, &clk);
1129 wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
1131 if (wl->chip.id == CHIP_ID_128X_PG20)
1132 clk |= ((selected_clock & 0x3) << 1) << 4;
1134 clk |= (priv->ref_clock << 1) << 4;
1136 ret = wlcore_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
1140 ret = wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
1144 /* Disable interrupts */
1145 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
1149 ret = wl1271_boot_soft_reset(wl);
1157 static int wl12xx_pre_upload(struct wl1271 *wl)
1163 /* write firmware's last address (ie. it's length) to
1164 * ACX_EEPROMLESS_IND_REG */
1165 wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
1167 ret = wlcore_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
1171 ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &tmp);
1175 wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
1177 /* 6. read the EEPROM parameters */
1178 ret = wlcore_read32(wl, WL12XX_SCR_PAD2, &tmp);
1182 /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1185 if (wl->chip.id == CHIP_ID_128X_PG20) {
1186 ret = wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
1191 /* polarity must be set before the firmware is loaded */
1192 ret = wl12xx_top_reg_read(wl, OCP_REG_POLARITY, &polarity);
1196 /* We use HIGH polarity, so unset the LOW bit */
1197 polarity &= ~POLARITY_LOW;
1198 ret = wl12xx_top_reg_write(wl, OCP_REG_POLARITY, polarity);
1204 static int wl12xx_enable_interrupts(struct wl1271 *wl)
1208 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1209 WL12XX_ACX_ALL_EVENTS_VECTOR);
1213 wlcore_enable_interrupts(wl);
1214 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1215 WL1271_ACX_INTR_ALL & ~(WL12XX_INTR_MASK));
1217 goto disable_interrupts;
1219 ret = wlcore_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
1221 goto disable_interrupts;
1226 wlcore_disable_interrupts(wl);
1232 static int wl12xx_boot(struct wl1271 *wl)
1236 ret = wl12xx_pre_boot(wl);
1240 ret = wlcore_boot_upload_nvs(wl);
1244 ret = wl12xx_pre_upload(wl);
1248 ret = wlcore_boot_upload_firmware(wl);
1252 wl->event_mask = BSS_LOSE_EVENT_ID |
1253 REGAINED_BSS_EVENT_ID |
1254 SCAN_COMPLETE_EVENT_ID |
1255 ROLE_STOP_COMPLETE_EVENT_ID |
1256 RSSI_SNR_TRIGGER_0_EVENT_ID |
1257 PSPOLL_DELIVERY_FAILURE_EVENT_ID |
1258 SOFT_GEMINI_SENSE_EVENT_ID |
1259 PERIODIC_SCAN_REPORT_EVENT_ID |
1260 PERIODIC_SCAN_COMPLETE_EVENT_ID |
1261 DUMMY_PACKET_EVENT_ID |
1262 PEER_REMOVE_COMPLETE_EVENT_ID |
1263 BA_SESSION_RX_CONSTRAINT_EVENT_ID |
1264 REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
1265 INACTIVE_STA_EVENT_ID |
1266 CHANNEL_SWITCH_COMPLETE_EVENT_ID;
1268 wl->ap_event_mask = MAX_TX_RETRY_EVENT_ID;
1270 ret = wlcore_boot_run_firmware(wl);
1274 ret = wl12xx_enable_interrupts(wl);
1280 static int wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
1281 void *buf, size_t len)
1285 ret = wlcore_write(wl, cmd_box_addr, buf, len, false);
1289 ret = wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
1294 static int wl12xx_ack_event(struct wl1271 *wl)
1296 return wlcore_write_reg(wl, REG_INTERRUPT_TRIG,
1297 WL12XX_INTR_TRIG_EVENT_ACK);
1300 static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
1302 u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
1303 u32 align_len = wlcore_calc_packet_alignment(wl, len);
1305 return (align_len + blk_size - 1) / blk_size + spare_blks;
1309 wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1310 u32 blks, u32 spare_blks)
1312 if (wl->chip.id == CHIP_ID_128X_PG20) {
1313 desc->wl128x_mem.total_mem_blocks = blks;
1315 desc->wl127x_mem.extra_blocks = spare_blks;
1316 desc->wl127x_mem.total_mem_blocks = blks;
1321 wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1322 struct sk_buff *skb)
1324 u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
1326 if (wl->chip.id == CHIP_ID_128X_PG20) {
1327 desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
1328 desc->length = cpu_to_le16(aligned_len >> 2);
1330 wl1271_debug(DEBUG_TX,
1331 "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1333 le16_to_cpu(desc->length),
1334 le16_to_cpu(desc->life_time),
1335 desc->wl128x_mem.total_mem_blocks,
1336 desc->wl128x_mem.extra_bytes);
1338 /* calculate number of padding bytes */
1339 int pad = aligned_len - skb->len;
1341 cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
1343 /* Store the aligned length in terms of words */
1344 desc->length = cpu_to_le16(aligned_len >> 2);
1346 wl1271_debug(DEBUG_TX,
1347 "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1349 le16_to_cpu(desc->length),
1350 le16_to_cpu(desc->life_time),
1351 desc->wl127x_mem.total_mem_blocks);
1355 static enum wl_rx_buf_align
1356 wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
1358 if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
1359 return WLCORE_RX_BUF_UNALIGNED;
1361 return WLCORE_RX_BUF_ALIGNED;
1364 static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
1367 struct wl1271_rx_descriptor *desc = rx_data;
1369 /* invalid packet */
1370 if (data_len < sizeof(*desc) ||
1371 data_len < sizeof(*desc) + desc->pad_len)
1374 return data_len - sizeof(*desc) - desc->pad_len;
1377 static int wl12xx_tx_delayed_compl(struct wl1271 *wl)
1379 if (wl->fw_status->tx_results_counter ==
1380 (wl->tx_results_count & 0xff))
1383 return wlcore_tx_complete(wl);
1386 static int wl12xx_hw_init(struct wl1271 *wl)
1390 if (wl->chip.id == CHIP_ID_128X_PG20) {
1391 u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
1393 ret = wl128x_cmd_general_parms(wl);
1398 * If we are in calibrator based auto detect then we got the FEM nr
1399 * in wl->fem_manuf. No need to continue further
1401 if (wl->plt_mode == PLT_FEM_DETECT)
1404 ret = wl128x_cmd_radio_parms(wl);
1408 if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
1409 /* Enable SDIO padding */
1410 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
1412 /* Must be before wl1271_acx_init_mem_config() */
1413 ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
1417 ret = wl1271_cmd_general_parms(wl);
1422 * If we are in calibrator based auto detect then we got the FEM nr
1423 * in wl->fem_manuf. No need to continue further
1425 if (wl->plt_mode == PLT_FEM_DETECT)
1428 ret = wl1271_cmd_radio_parms(wl);
1431 ret = wl1271_cmd_ext_radio_parms(wl);
1439 static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
1440 struct wl_fw_status *fw_status)
1442 struct wl12xx_fw_status *int_fw_status = raw_fw_status;
1444 fw_status->intr = le32_to_cpu(int_fw_status->intr);
1445 fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
1446 fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
1447 fw_status->tx_results_counter = int_fw_status->tx_results_counter;
1448 fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
1450 fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
1451 fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
1452 fw_status->link_fast_bitmap =
1453 le32_to_cpu(int_fw_status->link_fast_bitmap);
1454 fw_status->total_released_blks =
1455 le32_to_cpu(int_fw_status->total_released_blks);
1456 fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
1458 fw_status->counters.tx_released_pkts =
1459 int_fw_status->counters.tx_released_pkts;
1460 fw_status->counters.tx_lnk_free_pkts =
1461 int_fw_status->counters.tx_lnk_free_pkts;
1462 fw_status->counters.tx_voice_released_blks =
1463 int_fw_status->counters.tx_voice_released_blks;
1464 fw_status->counters.tx_last_rate =
1465 int_fw_status->counters.tx_last_rate;
1467 fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
1470 static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1471 struct wl12xx_vif *wlvif)
1473 return wlvif->rate_set;
1476 static void wl12xx_conf_init(struct wl1271 *wl)
1478 struct wl12xx_priv *priv = wl->priv;
1480 /* apply driver default configuration */
1481 memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
1483 /* apply default private configuration */
1484 memcpy(&priv->conf, &wl12xx_default_priv_conf, sizeof(priv->conf));
1487 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
1489 bool supported = false;
1492 if (wl->chip.id == CHIP_ID_128X_PG20) {
1493 major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
1494 minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
1496 /* in wl128x we have the MAC address if the PG is >= (2, 1) */
1497 if (major > 2 || (major == 2 && minor >= 1))
1500 major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
1501 minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
1503 /* in wl127x we have the MAC address if the PG is >= (3, 1) */
1504 if (major == 3 && minor >= 1)
1508 wl1271_debug(DEBUG_PROBE,
1509 "PG Ver major = %d minor = %d, MAC %s present",
1510 major, minor, supported ? "is" : "is not");
1515 static int wl12xx_get_fuse_mac(struct wl1271 *wl)
1520 /* Device may be in ELP from the bootloader or kexec */
1521 ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1525 usleep_range(500000, 700000);
1527 ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1531 ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1, &mac1);
1535 ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2, &mac2);
1539 /* these are the two parts of the BD_ADDR */
1540 wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
1541 ((mac1 & 0xff000000) >> 24);
1542 wl->fuse_nic_addr = mac1 & 0xffffff;
1544 ret = wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1550 static int wl12xx_get_pg_ver(struct wl1271 *wl, s8 *ver)
1555 if (wl->chip.id == CHIP_ID_128X_PG20)
1556 ret = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1,
1559 ret = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1,
1562 if (ret >= 0 && ver)
1563 *ver = (s8)((die_info & PG_VER_MASK) >> PG_VER_OFFSET);
1568 static int wl12xx_get_mac(struct wl1271 *wl)
1570 if (wl12xx_mac_in_fuse(wl))
1571 return wl12xx_get_fuse_mac(wl);
1576 static void wl12xx_set_tx_desc_csum(struct wl1271 *wl,
1577 struct wl1271_tx_hw_descr *desc,
1578 struct sk_buff *skb)
1580 desc->wl12xx_reserved = 0;
1583 static int wl12xx_plt_init(struct wl1271 *wl)
1587 ret = wl->ops->boot(wl);
1591 ret = wl->ops->hw_init(wl);
1593 goto out_irq_disable;
1596 * If we are in calibrator based auto detect then we got the FEM nr
1597 * in wl->fem_manuf. No need to continue further
1599 if (wl->plt_mode == PLT_FEM_DETECT)
1602 ret = wl1271_acx_init_mem_config(wl);
1604 goto out_irq_disable;
1606 ret = wl12xx_acx_mem_cfg(wl);
1608 goto out_free_memmap;
1610 /* Enable data path */
1611 ret = wl1271_cmd_data_path(wl, 1);
1613 goto out_free_memmap;
1615 /* Configure for CAM power saving (ie. always active) */
1616 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
1618 goto out_free_memmap;
1621 ret = wl1271_acx_pm_config(wl);
1623 goto out_free_memmap;
1628 kfree(wl->target_mem_map);
1629 wl->target_mem_map = NULL;
1632 mutex_unlock(&wl->mutex);
1633 /* Unlocking the mutex in the middle of handling is
1634 inherently unsafe. In this case we deem it safe to do,
1635 because we need to let any possibly pending IRQ out of
1636 the system (and while we are WL1271_STATE_OFF the IRQ
1637 work function will not do anything.) Also, any other
1638 possible concurrent operations will fail due to the
1639 current state, hence the wl1271 struct should be safe. */
1640 wlcore_disable_interrupts(wl);
1641 mutex_lock(&wl->mutex);
1646 static int wl12xx_get_spare_blocks(struct wl1271 *wl, bool is_gem)
1649 return WL12XX_TX_HW_BLOCK_GEM_SPARE;
1651 return WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
1654 static int wl12xx_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
1655 struct ieee80211_vif *vif,
1656 struct ieee80211_sta *sta,
1657 struct ieee80211_key_conf *key_conf)
1659 return wlcore_set_key(wl, cmd, vif, sta, key_conf);
1662 static int wl12xx_set_peer_cap(struct wl1271 *wl,
1663 struct ieee80211_sta_ht_cap *ht_cap,
1664 bool allow_ht_operation,
1665 u32 rate_set, u8 hlid)
1667 return wl1271_acx_set_ht_capabilities(wl, ht_cap, allow_ht_operation,
1671 static bool wl12xx_lnk_high_prio(struct wl1271 *wl, u8 hlid,
1672 struct wl1271_link *lnk)
1676 if (test_bit(hlid, &wl->fw_fast_lnk_map))
1677 thold = wl->conf.tx.fast_link_thold;
1679 thold = wl->conf.tx.slow_link_thold;
1681 return lnk->allocated_pkts < thold;
1684 static bool wl12xx_lnk_low_prio(struct wl1271 *wl, u8 hlid,
1685 struct wl1271_link *lnk)
1687 /* any link is good for low priority */
1691 static u32 wl12xx_convert_hwaddr(struct wl1271 *wl, u32 hwaddr)
1696 static int wl12xx_setup(struct wl1271 *wl);
1698 static struct wlcore_ops wl12xx_ops = {
1699 .setup = wl12xx_setup,
1700 .identify_chip = wl12xx_identify_chip,
1701 .boot = wl12xx_boot,
1702 .plt_init = wl12xx_plt_init,
1703 .trigger_cmd = wl12xx_trigger_cmd,
1704 .ack_event = wl12xx_ack_event,
1705 .wait_for_event = wl12xx_wait_for_event,
1706 .process_mailbox_events = wl12xx_process_mailbox_events,
1707 .calc_tx_blocks = wl12xx_calc_tx_blocks,
1708 .set_tx_desc_blocks = wl12xx_set_tx_desc_blocks,
1709 .set_tx_desc_data_len = wl12xx_set_tx_desc_data_len,
1710 .get_rx_buf_align = wl12xx_get_rx_buf_align,
1711 .get_rx_packet_len = wl12xx_get_rx_packet_len,
1712 .tx_immediate_compl = NULL,
1713 .tx_delayed_compl = wl12xx_tx_delayed_compl,
1714 .hw_init = wl12xx_hw_init,
1716 .convert_fw_status = wl12xx_convert_fw_status,
1717 .sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask,
1718 .get_pg_ver = wl12xx_get_pg_ver,
1719 .get_mac = wl12xx_get_mac,
1720 .set_tx_desc_csum = wl12xx_set_tx_desc_csum,
1721 .set_rx_csum = NULL,
1722 .ap_get_mimo_wide_rate_mask = NULL,
1723 .debugfs_init = wl12xx_debugfs_add_files,
1724 .scan_start = wl12xx_scan_start,
1725 .scan_stop = wl12xx_scan_stop,
1726 .sched_scan_start = wl12xx_sched_scan_start,
1727 .sched_scan_stop = wl12xx_scan_sched_scan_stop,
1728 .get_spare_blocks = wl12xx_get_spare_blocks,
1729 .set_key = wl12xx_set_key,
1730 .channel_switch = wl12xx_cmd_channel_switch,
1731 .pre_pkt_send = NULL,
1732 .set_peer_cap = wl12xx_set_peer_cap,
1733 .convert_hwaddr = wl12xx_convert_hwaddr,
1734 .lnk_high_prio = wl12xx_lnk_high_prio,
1735 .lnk_low_prio = wl12xx_lnk_low_prio,
1736 .interrupt_notify = NULL,
1737 .rx_ba_filter = NULL,
1741 static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
1742 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 |
1743 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT),
1744 .ht_supported = true,
1745 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K,
1746 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8,
1748 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1749 .rx_highest = cpu_to_le16(72),
1750 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1754 static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
1757 .types = BIT(NL80211_IFTYPE_STATION),
1761 .types = BIT(NL80211_IFTYPE_AP) |
1762 BIT(NL80211_IFTYPE_P2P_GO) |
1763 BIT(NL80211_IFTYPE_P2P_CLIENT),
1767 static const struct ieee80211_iface_combination
1768 wl12xx_iface_combinations[] = {
1770 .max_interfaces = 3,
1771 .limits = wl12xx_iface_limits,
1772 .n_limits = ARRAY_SIZE(wl12xx_iface_limits),
1773 .num_different_channels = 1,
1777 static const struct wl12xx_clock wl12xx_refclock_table[] = {
1778 { 19200000, false, WL12XX_REFCLOCK_19 },
1779 { 26000000, false, WL12XX_REFCLOCK_26 },
1780 { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
1781 { 38400000, false, WL12XX_REFCLOCK_38 },
1782 { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
1783 { 52000000, false, WL12XX_REFCLOCK_52 },
1787 static const struct wl12xx_clock wl12xx_tcxoclock_table[] = {
1788 { 16368000, true, WL12XX_TCXOCLOCK_16_368 },
1789 { 16800000, true, WL12XX_TCXOCLOCK_16_8 },
1790 { 19200000, true, WL12XX_TCXOCLOCK_19_2 },
1791 { 26000000, true, WL12XX_TCXOCLOCK_26 },
1792 { 32736000, true, WL12XX_TCXOCLOCK_32_736 },
1793 { 33600000, true, WL12XX_TCXOCLOCK_33_6 },
1794 { 38400000, true, WL12XX_TCXOCLOCK_38_4 },
1795 { 52000000, true, WL12XX_TCXOCLOCK_52 },
1799 static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
1800 u32 freq, bool xtal)
1804 for (i = 0; table[i].freq != 0; i++)
1805 if ((table[i].freq == freq) && (table[i].xtal == xtal))
1806 return table[i].hw_idx;
1811 static int wl12xx_setup(struct wl1271 *wl)
1813 struct wl12xx_priv *priv = wl->priv;
1814 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
1816 BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
1817 BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS > WL12XX_MAX_LINKS);
1818 BUILD_BUG_ON(WL12XX_CONF_SG_PARAMS_MAX > WLCORE_CONF_SG_PARAMS_MAX);
1820 wl->rtable = wl12xx_rtable;
1821 wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
1822 wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
1823 wl->num_links = WL12XX_MAX_LINKS;
1824 wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
1825 wl->iface_combinations = wl12xx_iface_combinations;
1826 wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations);
1827 wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
1828 wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
1829 wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
1830 wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
1831 wl->fw_status_len = sizeof(struct wl12xx_fw_status);
1832 wl->fw_status_priv_len = 0;
1833 wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
1834 wl->ofdm_only_ap = true;
1835 wlcore_set_ht_cap(wl, NL80211_BAND_2GHZ, &wl12xx_ht_cap);
1836 wlcore_set_ht_cap(wl, NL80211_BAND_5GHZ, &wl12xx_ht_cap);
1837 wl12xx_conf_init(wl);
1840 priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
1841 pdev_data->ref_clock_freq,
1842 pdev_data->ref_clock_xtal);
1843 if (priv->ref_clock < 0) {
1844 wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
1845 pdev_data->ref_clock_freq,
1846 pdev_data->ref_clock_xtal ?
1847 "XTAL" : "not XTAL");
1849 return priv->ref_clock;
1852 if (!strcmp(fref_param, "19.2"))
1853 priv->ref_clock = WL12XX_REFCLOCK_19;
1854 else if (!strcmp(fref_param, "26"))
1855 priv->ref_clock = WL12XX_REFCLOCK_26;
1856 else if (!strcmp(fref_param, "26x"))
1857 priv->ref_clock = WL12XX_REFCLOCK_26_XTAL;
1858 else if (!strcmp(fref_param, "38.4"))
1859 priv->ref_clock = WL12XX_REFCLOCK_38;
1860 else if (!strcmp(fref_param, "38.4x"))
1861 priv->ref_clock = WL12XX_REFCLOCK_38_XTAL;
1862 else if (!strcmp(fref_param, "52"))
1863 priv->ref_clock = WL12XX_REFCLOCK_52;
1865 wl1271_error("Invalid fref parameter %s", fref_param);
1868 if (!tcxo_param && pdev_data->tcxo_clock_freq) {
1869 priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
1870 pdev_data->tcxo_clock_freq,
1872 if (priv->tcxo_clock < 0) {
1873 wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
1874 pdev_data->tcxo_clock_freq);
1876 return priv->tcxo_clock;
1878 } else if (tcxo_param) {
1879 if (!strcmp(tcxo_param, "19.2"))
1880 priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
1881 else if (!strcmp(tcxo_param, "26"))
1882 priv->tcxo_clock = WL12XX_TCXOCLOCK_26;
1883 else if (!strcmp(tcxo_param, "38.4"))
1884 priv->tcxo_clock = WL12XX_TCXOCLOCK_38_4;
1885 else if (!strcmp(tcxo_param, "52"))
1886 priv->tcxo_clock = WL12XX_TCXOCLOCK_52;
1887 else if (!strcmp(tcxo_param, "16.368"))
1888 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_368;
1889 else if (!strcmp(tcxo_param, "32.736"))
1890 priv->tcxo_clock = WL12XX_TCXOCLOCK_32_736;
1891 else if (!strcmp(tcxo_param, "16.8"))
1892 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_8;
1893 else if (!strcmp(tcxo_param, "33.6"))
1894 priv->tcxo_clock = WL12XX_TCXOCLOCK_33_6;
1896 wl1271_error("Invalid tcxo parameter %s", tcxo_param);
1899 priv->rx_mem_addr = kmalloc(sizeof(*priv->rx_mem_addr), GFP_KERNEL);
1900 if (!priv->rx_mem_addr)
1906 static int wl12xx_probe(struct platform_device *pdev)
1909 struct ieee80211_hw *hw;
1912 hw = wlcore_alloc_hw(sizeof(struct wl12xx_priv),
1913 WL12XX_AGGR_BUFFER_SIZE,
1914 sizeof(struct wl12xx_event_mailbox));
1916 wl1271_error("can't allocate hw");
1922 wl->ops = &wl12xx_ops;
1923 wl->ptable = wl12xx_ptable;
1924 ret = wlcore_probe(wl, pdev);
1936 static int wl12xx_remove(struct platform_device *pdev)
1938 struct wl1271 *wl = platform_get_drvdata(pdev);
1939 struct wl12xx_priv *priv;
1945 kfree(priv->rx_mem_addr);
1948 return wlcore_remove(pdev);
1951 static const struct platform_device_id wl12xx_id_table[] = {
1953 { } /* Terminating Entry */
1955 MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
1957 static struct platform_driver wl12xx_driver = {
1958 .probe = wl12xx_probe,
1959 .remove = wl12xx_remove,
1960 .id_table = wl12xx_id_table,
1962 .name = "wl12xx_driver",
1966 module_platform_driver(wl12xx_driver);
1968 module_param_named(fref, fref_param, charp, 0);
1969 MODULE_PARM_DESC(fref, "FREF clock: 19.2, 26, 26x, 38.4, 38.4x, 52");
1971 module_param_named(tcxo, tcxo_param, charp, 0);
1972 MODULE_PARM_DESC(tcxo,
1973 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
1975 MODULE_LICENSE("GPL v2");
1976 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");