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 "../wlcore/wlcore.h"
28 #include "../wlcore/debug.h"
29 #include "../wlcore/io.h"
30 #include "../wlcore/acx.h"
31 #include "../wlcore/tx.h"
32 #include "../wlcore/rx.h"
33 #include "../wlcore/boot.h"
44 static char *fref_param;
45 static char *tcxo_param;
47 static struct wlcore_conf wl12xx_conf = {
50 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
51 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
52 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
53 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
54 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
55 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
56 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
57 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
58 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
59 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
60 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
61 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
62 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
63 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
64 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
65 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
66 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
67 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
68 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
69 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
70 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
71 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
72 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
73 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
74 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
75 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
76 /* active scan params */
77 [WL12XX_CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
78 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
79 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
80 /* passive scan params */
81 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_BR] = 800,
82 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_EDR] = 200,
83 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_HV3] = 200,
84 /* passive scan in dual antenna params */
85 [WL12XX_CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
86 [WL12XX_CONF_SG_BCN_HV3_COLL_THR_IN_PASSIVE_SCAN] = 0,
87 [WL12XX_CONF_SG_TX_RX_PROTECT_BW_IN_PASSIVE_SCAN] = 0,
89 [WL12XX_CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
90 [WL12XX_CONF_SG_ANTENNA_CONFIGURATION] = 0,
91 [WL12XX_CONF_SG_BEACON_MISS_PERCENT] = 60,
92 [WL12XX_CONF_SG_DHCP_TIME] = 5000,
93 [WL12XX_CONF_SG_RXT] = 1200,
94 [WL12XX_CONF_SG_TXT] = 1000,
95 [WL12XX_CONF_SG_ADAPTIVE_RXT_TXT] = 1,
96 [WL12XX_CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
97 [WL12XX_CONF_SG_HV3_MAX_SERVED] = 6,
98 [WL12XX_CONF_SG_PS_POLL_TIMEOUT] = 10,
99 [WL12XX_CONF_SG_UPSD_TIMEOUT] = 10,
100 [WL12XX_CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
101 [WL12XX_CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
102 [WL12XX_CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
104 [WL12XX_CONF_AP_BEACON_MISS_TX] = 3,
105 [WL12XX_CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
106 [WL12XX_CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
107 [WL12XX_CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
108 [WL12XX_CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
109 [WL12XX_CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
110 /* CTS Diluting params */
111 [WL12XX_CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
112 [WL12XX_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,
212 .slow_link_thold = 3,
213 .fast_link_thold = 10,
216 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
217 .listen_interval = 1,
218 .suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM,
219 .suspend_listen_interval = 3,
220 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
221 .bcn_filt_ie_count = 3,
224 .ie = WLAN_EID_CHANNEL_SWITCH,
225 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
228 .ie = WLAN_EID_HT_OPERATION,
229 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
232 .ie = WLAN_EID_ERP_INFO,
233 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
236 .synch_fail_thold = 12,
237 .bss_lose_timeout = 400,
238 .beacon_rx_timeout = 10000,
239 .broadcast_timeout = 20000,
240 .rx_broadcast_in_ps = 1,
241 .ps_poll_threshold = 10,
242 .bet_enable = CONF_BET_MODE_ENABLE,
243 .bet_max_consecutive = 50,
244 .psm_entry_retries = 8,
245 .psm_exit_retries = 16,
246 .psm_entry_nullfunc_retries = 3,
247 .dynamic_ps_timeout = 1500,
249 .keep_alive_interval = 55000,
250 .max_listen_interval = 20,
251 .sta_sleep_auth = WL1271_PSM_ILLEGAL,
252 .suspend_rx_ba_activity = 0,
259 .host_clk_settling_time = 5000,
260 .host_fast_wakeup_support = CONF_FAST_WAKEUP_DISABLE,
264 .avg_weight_rssi_beacon = 20,
265 .avg_weight_rssi_data = 10,
266 .avg_weight_snr_beacon = 20,
267 .avg_weight_snr_data = 10,
270 .min_dwell_time_active = 7500,
271 .max_dwell_time_active = 30000,
272 .min_dwell_time_active_long = 25000,
273 .max_dwell_time_active_long = 50000,
274 .dwell_time_passive = 100000,
275 .dwell_time_dfs = 150000,
277 .split_scan_timeout = 50000,
281 * Values are in TU/1000 but since sched scan FW command
282 * params are in TUs rounding up may occur.
284 .base_dwell_time = 7500,
285 .max_dwell_time_delta = 22500,
286 /* based on 250bits per probe @1Mbps */
287 .dwell_time_delta_per_probe = 2000,
288 /* based on 250bits per probe @6Mbps (plus a bit more) */
289 .dwell_time_delta_per_probe_5 = 350,
290 .dwell_time_passive = 100000,
291 .dwell_time_dfs = 150000,
293 .rssi_threshold = -90,
298 .tx_ba_win_size = 64,
299 .inactivity_timeout = 10000,
300 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
303 * Memory config for wl127x chips is given in the
304 * wl12xx_default_priv_conf struct. The below configuration is
311 .tx_min_block_num = 40,
313 .min_req_tx_blocks = 45,
314 .min_req_rx_blocks = 22,
320 .n_divider_fref_set_1 = 0xff, /* default */
321 .n_divider_fref_set_2 = 12,
322 .m_divider_fref_set_1 = 0xffff,
323 .m_divider_fref_set_2 = 148, /* default */
324 .coex_pll_stabilization_time = 0xffffffff, /* default */
325 .ldo_stabilization_time = 0xffff, /* default */
326 .fm_disturbed_band_margin = 0xff, /* default */
327 .swallow_clk_diff = 0xff, /* default */
336 .mode = WL12XX_FWLOG_CONTINUOUS,
339 .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
340 .output = WL12XX_FWLOG_OUTPUT_DBG_PINS,
344 .rate_retry_score = 32000,
349 .inverse_curiosity_factor = 5,
351 .tx_fail_high_th = 10,
352 .per_alpha_shift = 4,
354 .per_beta1_shift = 10,
355 .per_beta2_shift = 8,
357 .rate_check_down = 12,
358 .rate_retry_policy = {
359 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00,
366 .hangover_period = 20,
368 .early_termination_mode = 1,
378 .bug_on_recovery = 0,
383 static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
385 .tx_per_channel_power_compensation_2 = {
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 .tx_per_channel_power_compensation_5 = {
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 .tx_min_block_num = 40,
400 .min_req_tx_blocks = 100,
401 .min_req_rx_blocks = 22,
407 #define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT 1
408 #define WL12XX_TX_HW_BLOCK_GEM_SPARE 2
409 #define WL12XX_TX_HW_BLOCK_SIZE 252
411 static const u8 wl12xx_rate_to_idx_2ghz[] = {
412 /* MCS rates are used only with 11n */
413 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
414 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
415 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
416 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
417 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
418 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
419 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
420 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
421 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
423 11, /* WL12XX_CONF_HW_RXTX_RATE_54 */
424 10, /* WL12XX_CONF_HW_RXTX_RATE_48 */
425 9, /* WL12XX_CONF_HW_RXTX_RATE_36 */
426 8, /* WL12XX_CONF_HW_RXTX_RATE_24 */
428 /* TI-specific rate */
429 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
431 7, /* WL12XX_CONF_HW_RXTX_RATE_18 */
432 6, /* WL12XX_CONF_HW_RXTX_RATE_12 */
433 3, /* WL12XX_CONF_HW_RXTX_RATE_11 */
434 5, /* WL12XX_CONF_HW_RXTX_RATE_9 */
435 4, /* WL12XX_CONF_HW_RXTX_RATE_6 */
436 2, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
437 1, /* WL12XX_CONF_HW_RXTX_RATE_2 */
438 0 /* WL12XX_CONF_HW_RXTX_RATE_1 */
441 static const u8 wl12xx_rate_to_idx_5ghz[] = {
442 /* MCS rates are used only with 11n */
443 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
444 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
445 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
446 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
447 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
448 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
449 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
450 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
451 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
453 7, /* WL12XX_CONF_HW_RXTX_RATE_54 */
454 6, /* WL12XX_CONF_HW_RXTX_RATE_48 */
455 5, /* WL12XX_CONF_HW_RXTX_RATE_36 */
456 4, /* WL12XX_CONF_HW_RXTX_RATE_24 */
458 /* TI-specific rate */
459 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
461 3, /* WL12XX_CONF_HW_RXTX_RATE_18 */
462 2, /* WL12XX_CONF_HW_RXTX_RATE_12 */
463 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_11 */
464 1, /* WL12XX_CONF_HW_RXTX_RATE_9 */
465 0, /* WL12XX_CONF_HW_RXTX_RATE_6 */
466 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
467 CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_2 */
468 CONF_HW_RXTX_RATE_UNSUPPORTED /* WL12XX_CONF_HW_RXTX_RATE_1 */
471 static const u8 *wl12xx_band_rate_to_idx[] = {
472 [NL80211_BAND_2GHZ] = wl12xx_rate_to_idx_2ghz,
473 [NL80211_BAND_5GHZ] = wl12xx_rate_to_idx_5ghz
476 enum wl12xx_hw_rates {
477 WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI = 0,
478 WL12XX_CONF_HW_RXTX_RATE_MCS7,
479 WL12XX_CONF_HW_RXTX_RATE_MCS6,
480 WL12XX_CONF_HW_RXTX_RATE_MCS5,
481 WL12XX_CONF_HW_RXTX_RATE_MCS4,
482 WL12XX_CONF_HW_RXTX_RATE_MCS3,
483 WL12XX_CONF_HW_RXTX_RATE_MCS2,
484 WL12XX_CONF_HW_RXTX_RATE_MCS1,
485 WL12XX_CONF_HW_RXTX_RATE_MCS0,
486 WL12XX_CONF_HW_RXTX_RATE_54,
487 WL12XX_CONF_HW_RXTX_RATE_48,
488 WL12XX_CONF_HW_RXTX_RATE_36,
489 WL12XX_CONF_HW_RXTX_RATE_24,
490 WL12XX_CONF_HW_RXTX_RATE_22,
491 WL12XX_CONF_HW_RXTX_RATE_18,
492 WL12XX_CONF_HW_RXTX_RATE_12,
493 WL12XX_CONF_HW_RXTX_RATE_11,
494 WL12XX_CONF_HW_RXTX_RATE_9,
495 WL12XX_CONF_HW_RXTX_RATE_6,
496 WL12XX_CONF_HW_RXTX_RATE_5_5,
497 WL12XX_CONF_HW_RXTX_RATE_2,
498 WL12XX_CONF_HW_RXTX_RATE_1,
499 WL12XX_CONF_HW_RXTX_RATE_MAX,
502 static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
509 .start = REGISTERS_BASE,
522 [PART_BOOT] = { /* in wl12xx we can use a mix of work and down
529 .start = REGISTERS_BASE,
548 .start = REGISTERS_BASE,
581 static const int wl12xx_rtable[REG_TABLE_LEN] = {
582 [REG_ECPU_CONTROL] = WL12XX_REG_ECPU_CONTROL,
583 [REG_INTERRUPT_NO_CLEAR] = WL12XX_REG_INTERRUPT_NO_CLEAR,
584 [REG_INTERRUPT_ACK] = WL12XX_REG_INTERRUPT_ACK,
585 [REG_COMMAND_MAILBOX_PTR] = WL12XX_REG_COMMAND_MAILBOX_PTR,
586 [REG_EVENT_MAILBOX_PTR] = WL12XX_REG_EVENT_MAILBOX_PTR,
587 [REG_INTERRUPT_TRIG] = WL12XX_REG_INTERRUPT_TRIG,
588 [REG_INTERRUPT_MASK] = WL12XX_REG_INTERRUPT_MASK,
589 [REG_PC_ON_RECOVERY] = WL12XX_SCR_PAD4,
590 [REG_CHIP_ID_B] = WL12XX_CHIP_ID_B,
591 [REG_CMD_MBOX_ADDRESS] = WL12XX_CMD_MBOX_ADDRESS,
593 /* data access memory addresses, used with partition translation */
594 [REG_SLV_MEM_DATA] = WL1271_SLV_MEM_DATA,
595 [REG_SLV_REG_DATA] = WL1271_SLV_REG_DATA,
597 /* raw data access memory addresses */
598 [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR,
601 /* TODO: maybe move to a new header file? */
602 #define WL127X_FW_NAME_MULTI "/*(DEBLOBBED)*/"
603 #define WL127X_FW_NAME_SINGLE "/*(DEBLOBBED)*/"
604 #define WL127X_PLT_FW_NAME "/*(DEBLOBBED)*/"
606 #define WL128X_FW_NAME_MULTI "/*(DEBLOBBED)*/"
607 #define WL128X_FW_NAME_SINGLE "/*(DEBLOBBED)*/"
608 #define WL128X_PLT_FW_NAME "/*(DEBLOBBED)*/"
610 static int wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
614 if (wl->chip.id != CHIP_ID_128X_PG20) {
615 struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
616 struct wl12xx_priv *priv = wl->priv;
619 * Choose the block we want to read
620 * For aggregated packets, only the first memory block
621 * should be retrieved. The FW takes care of the rest.
623 u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
625 priv->rx_mem_addr->addr = (mem_block << 8) +
626 le32_to_cpu(wl_mem_map->packet_memory_pool_start);
628 priv->rx_mem_addr->addr_extra = priv->rx_mem_addr->addr + 4;
630 ret = wlcore_write(wl, WL1271_SLV_REG_DATA, priv->rx_mem_addr,
631 sizeof(*priv->rx_mem_addr), false);
639 static int wl12xx_identify_chip(struct wl1271 *wl)
643 switch (wl->chip.id) {
644 case CHIP_ID_127X_PG10:
645 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
648 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
649 WLCORE_QUIRK_DUAL_PROBE_TMPL |
650 WLCORE_QUIRK_TKIP_HEADER_SPACE |
651 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
652 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
653 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
654 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
655 sizeof(wl->conf.mem));
657 /* read data preparation is only needed by wl127x */
658 wl->ops->prepare_read = wl127x_prepare_read;
660 wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
661 WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER,
662 WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
663 WL127X_IFTYPE_MR_VER, WL127X_MAJOR_MR_VER,
664 WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
667 case CHIP_ID_127X_PG20:
668 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
671 wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
672 WLCORE_QUIRK_DUAL_PROBE_TMPL |
673 WLCORE_QUIRK_TKIP_HEADER_SPACE |
674 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
675 wl->plt_fw_name = WL127X_PLT_FW_NAME;
676 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
677 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
678 memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
679 sizeof(wl->conf.mem));
681 /* read data preparation is only needed by wl127x */
682 wl->ops->prepare_read = wl127x_prepare_read;
684 wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
685 WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER,
686 WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
687 WL127X_IFTYPE_MR_VER, WL127X_MAJOR_MR_VER,
688 WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
691 case CHIP_ID_128X_PG20:
692 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
694 wl->plt_fw_name = WL128X_PLT_FW_NAME;
695 wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
696 wl->mr_fw_name = WL128X_FW_NAME_MULTI;
698 /* wl128x requires TX blocksize alignment */
699 wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
700 WLCORE_QUIRK_DUAL_PROBE_TMPL |
701 WLCORE_QUIRK_TKIP_HEADER_SPACE |
702 WLCORE_QUIRK_AP_ZERO_SESSION_ID;
704 wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER,
705 WL128X_IFTYPE_SR_VER, WL128X_MAJOR_SR_VER,
706 WL128X_SUBTYPE_SR_VER, WL128X_MINOR_SR_VER,
707 WL128X_IFTYPE_MR_VER, WL128X_MAJOR_MR_VER,
708 WL128X_SUBTYPE_MR_VER, WL128X_MINOR_MR_VER);
710 case CHIP_ID_128X_PG10:
712 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
717 wl->fw_mem_block_size = 256;
718 wl->fwlog_end = 0x2000000;
720 /* common settings */
721 wl->scan_templ_id_2_4 = CMD_TEMPL_APP_PROBE_REQ_2_4_LEGACY;
722 wl->scan_templ_id_5 = CMD_TEMPL_APP_PROBE_REQ_5_LEGACY;
723 wl->sched_scan_templ_id_2_4 = CMD_TEMPL_CFG_PROBE_REQ_2_4;
724 wl->sched_scan_templ_id_5 = CMD_TEMPL_CFG_PROBE_REQ_5;
725 wl->max_channels_5 = WL12XX_MAX_CHANNELS_5GHZ;
726 wl->ba_rx_session_count_max = WL12XX_RX_BA_MAX_SESSIONS;
731 static int __must_check wl12xx_top_reg_write(struct wl1271 *wl, int addr,
736 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
737 addr = (addr >> 1) + 0x30000;
738 ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
742 /* write value to OCP_POR_WDATA */
743 ret = wlcore_write32(wl, WL12XX_OCP_DATA_WRITE, val);
747 /* write 1 to OCP_CMD */
748 ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
756 static int __must_check wl12xx_top_reg_read(struct wl1271 *wl, int addr,
760 int timeout = OCP_CMD_LOOP;
763 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
764 addr = (addr >> 1) + 0x30000;
765 ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
769 /* write 2 to OCP_CMD */
770 ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
774 /* poll for data ready */
776 ret = wlcore_read32(wl, WL12XX_OCP_DATA_READ, &val);
779 } while (!(val & OCP_READY_MASK) && --timeout);
782 wl1271_warning("Top register access timed out.");
786 /* check data status and return if OK */
787 if ((val & OCP_STATUS_MASK) != OCP_STATUS_OK) {
788 wl1271_warning("Top register access returned error.");
798 static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
803 /* Mask bits [2] & [8:4] in the sys_clk_cfg register */
804 ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
808 if (spare_reg == 0xFFFF)
810 spare_reg |= (BIT(3) | BIT(5) | BIT(6));
811 ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
815 /* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
816 ret = wl12xx_top_reg_write(wl, SYS_CLK_CFG_REG,
817 WL_CLK_REQ_TYPE_PG2 | MCS_PLL_CLK_SEL_FREF);
821 /* Delay execution for 15msec, to let the HW settle */
827 static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
832 ret = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG, &tcxo_detection);
836 if (tcxo_detection & TCXO_DET_FAILED)
842 static bool wl128x_is_fref_valid(struct wl1271 *wl)
847 ret = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG, &fref_detection);
851 if (fref_detection & FREF_CLK_DETECT_FAIL)
857 static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
861 ret = wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
865 ret = wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
869 ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG,
870 MCS_PLL_CONFIG_REG_VAL);
876 static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
881 struct wl12xx_priv *priv = wl->priv;
884 /* Mask bits [3:1] in the sys_clk_cfg register */
885 ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
889 if (spare_reg == 0xFFFF)
892 ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
896 /* Handle special cases of the TCXO clock */
897 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_8 ||
898 priv->tcxo_clock == WL12XX_TCXOCLOCK_33_6)
899 return wl128x_manually_configure_mcs_pll(wl);
901 /* Set the input frequency according to the selected clock source */
902 input_freq = (clk & 1) + 1;
904 ret = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG, &pll_config);
908 if (pll_config == 0xFFFF)
910 pll_config |= (input_freq << MCS_SEL_IN_FREQ_SHIFT);
911 pll_config |= MCS_PLL_ENABLE_HP;
912 ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, pll_config);
918 * WL128x has two clocks input - TCXO and FREF.
919 * TCXO is the main clock of the device, while FREF is used to sync
920 * between the GPS and the cellular modem.
921 * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
922 * as the WLAN/BT main clock.
924 static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
926 struct wl12xx_priv *priv = wl->priv;
930 /* For XTAL-only modes, FREF will be used after switching from TCXO */
931 if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
932 priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
933 if (!wl128x_switch_tcxo_to_fref(wl))
938 /* Query the HW, to determine which clock source we should use */
939 ret = wl12xx_top_reg_read(wl, SYS_CLK_CFG_REG, &sys_clk_cfg);
943 if (sys_clk_cfg == 0xFFFF)
945 if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
948 /* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
949 if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_368 ||
950 priv->tcxo_clock == WL12XX_TCXOCLOCK_32_736) {
951 if (!wl128x_switch_tcxo_to_fref(wl))
956 /* TCXO clock is selected */
957 if (!wl128x_is_tcxo_valid(wl))
959 *selected_clock = priv->tcxo_clock;
963 /* FREF clock is selected */
964 if (!wl128x_is_fref_valid(wl))
966 *selected_clock = priv->ref_clock;
969 return wl128x_configure_mcs_pll(wl, *selected_clock);
972 static int wl127x_boot_clk(struct wl1271 *wl)
974 struct wl12xx_priv *priv = wl->priv;
979 if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
980 wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
982 if (priv->ref_clock == CONF_REF_CLK_19_2_E ||
983 priv->ref_clock == CONF_REF_CLK_38_4_E ||
984 priv->ref_clock == CONF_REF_CLK_38_4_M_XTAL)
985 /* ref clk: 19.2/38.4/38.4-XTAL */
987 else if (priv->ref_clock == CONF_REF_CLK_26_E ||
988 priv->ref_clock == CONF_REF_CLK_26_M_XTAL ||
989 priv->ref_clock == CONF_REF_CLK_52_E)
995 if (priv->ref_clock != CONF_REF_CLK_19_2_E) {
997 /* Set clock type (open drain) */
998 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE, &val);
1002 val &= FREF_CLK_TYPE_BITS;
1003 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
1007 /* Set clock pull mode (no pull) */
1008 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL, &val);
1013 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
1018 /* Set clock polarity */
1019 ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY, &val);
1023 val &= FREF_CLK_POLARITY_BITS;
1024 val |= CLK_REQ_OUTN_SEL;
1025 ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
1030 ret = wlcore_write32(wl, WL12XX_PLL_PARAMETERS, clk);
1034 ret = wlcore_read32(wl, WL12XX_PLL_PARAMETERS, &pause);
1038 wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
1040 pause &= ~(WU_COUNTER_PAUSE_VAL);
1041 pause |= WU_COUNTER_PAUSE_VAL;
1042 ret = wlcore_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
1048 static int wl1271_boot_soft_reset(struct wl1271 *wl)
1050 unsigned long timeout;
1054 /* perform soft reset */
1055 ret = wlcore_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
1059 /* SOFT_RESET is self clearing */
1060 timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
1062 ret = wlcore_read32(wl, WL12XX_SLV_SOFT_RESET, &boot_data);
1066 wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
1067 if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
1070 if (time_after(jiffies, timeout)) {
1071 /* 1.2 check pWhalBus->uSelfClearTime if the
1072 * timeout was reached */
1073 wl1271_error("soft reset timeout");
1077 udelay(SOFT_RESET_STALL_TIME);
1081 ret = wlcore_write32(wl, WL12XX_ENABLE, 0x0);
1085 /* disable auto calibration on start*/
1086 ret = wlcore_write32(wl, WL12XX_SPARE_A2, 0xffff);
1092 static int wl12xx_pre_boot(struct wl1271 *wl)
1094 struct wl12xx_priv *priv = wl->priv;
1097 int selected_clock = -1;
1099 if (wl->chip.id == CHIP_ID_128X_PG20) {
1100 ret = wl128x_boot_clk(wl, &selected_clock);
1104 ret = wl127x_boot_clk(wl);
1109 /* Continue the ELP wake up sequence */
1110 ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1116 ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1120 /* Read-modify-write DRPW_SCRATCH_START register (see next state)
1121 to be used by DRPw FW. The RTRIM value will be added by the FW
1122 before taking DRPw out of reset */
1124 ret = wlcore_read32(wl, WL12XX_DRPW_SCRATCH_START, &clk);
1128 wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
1130 if (wl->chip.id == CHIP_ID_128X_PG20)
1131 clk |= ((selected_clock & 0x3) << 1) << 4;
1133 clk |= (priv->ref_clock << 1) << 4;
1135 ret = wlcore_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
1139 ret = wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
1143 /* Disable interrupts */
1144 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
1148 ret = wl1271_boot_soft_reset(wl);
1156 static int wl12xx_pre_upload(struct wl1271 *wl)
1162 /* write firmware's last address (ie. it's length) to
1163 * ACX_EEPROMLESS_IND_REG */
1164 wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
1166 ret = wlcore_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
1170 ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &tmp);
1174 wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
1176 /* 6. read the EEPROM parameters */
1177 ret = wlcore_read32(wl, WL12XX_SCR_PAD2, &tmp);
1181 /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1184 if (wl->chip.id == CHIP_ID_128X_PG20) {
1185 ret = wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
1190 /* polarity must be set before the firmware is loaded */
1191 ret = wl12xx_top_reg_read(wl, OCP_REG_POLARITY, &polarity);
1195 /* We use HIGH polarity, so unset the LOW bit */
1196 polarity &= ~POLARITY_LOW;
1197 ret = wl12xx_top_reg_write(wl, OCP_REG_POLARITY, polarity);
1203 static int wl12xx_enable_interrupts(struct wl1271 *wl)
1207 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1208 WL12XX_ACX_ALL_EVENTS_VECTOR);
1212 wlcore_enable_interrupts(wl);
1213 ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1214 WL1271_ACX_INTR_ALL & ~(WL12XX_INTR_MASK));
1216 goto disable_interrupts;
1218 ret = wlcore_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
1220 goto disable_interrupts;
1225 wlcore_disable_interrupts(wl);
1231 static int wl12xx_boot(struct wl1271 *wl)
1235 ret = wl12xx_pre_boot(wl);
1239 ret = wlcore_boot_upload_nvs(wl);
1243 ret = wl12xx_pre_upload(wl);
1247 ret = wlcore_boot_upload_firmware(wl);
1251 wl->event_mask = BSS_LOSE_EVENT_ID |
1252 REGAINED_BSS_EVENT_ID |
1253 SCAN_COMPLETE_EVENT_ID |
1254 ROLE_STOP_COMPLETE_EVENT_ID |
1255 RSSI_SNR_TRIGGER_0_EVENT_ID |
1256 PSPOLL_DELIVERY_FAILURE_EVENT_ID |
1257 SOFT_GEMINI_SENSE_EVENT_ID |
1258 PERIODIC_SCAN_REPORT_EVENT_ID |
1259 PERIODIC_SCAN_COMPLETE_EVENT_ID |
1260 DUMMY_PACKET_EVENT_ID |
1261 PEER_REMOVE_COMPLETE_EVENT_ID |
1262 BA_SESSION_RX_CONSTRAINT_EVENT_ID |
1263 REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
1264 INACTIVE_STA_EVENT_ID |
1265 CHANNEL_SWITCH_COMPLETE_EVENT_ID;
1267 wl->ap_event_mask = MAX_TX_RETRY_EVENT_ID;
1269 ret = wlcore_boot_run_firmware(wl);
1273 ret = wl12xx_enable_interrupts(wl);
1279 static int wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
1280 void *buf, size_t len)
1284 ret = wlcore_write(wl, cmd_box_addr, buf, len, false);
1288 ret = wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
1293 static int wl12xx_ack_event(struct wl1271 *wl)
1295 return wlcore_write_reg(wl, REG_INTERRUPT_TRIG,
1296 WL12XX_INTR_TRIG_EVENT_ACK);
1299 static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
1301 u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
1302 u32 align_len = wlcore_calc_packet_alignment(wl, len);
1304 return (align_len + blk_size - 1) / blk_size + spare_blks;
1308 wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1309 u32 blks, u32 spare_blks)
1311 if (wl->chip.id == CHIP_ID_128X_PG20) {
1312 desc->wl128x_mem.total_mem_blocks = blks;
1314 desc->wl127x_mem.extra_blocks = spare_blks;
1315 desc->wl127x_mem.total_mem_blocks = blks;
1320 wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1321 struct sk_buff *skb)
1323 u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
1325 if (wl->chip.id == CHIP_ID_128X_PG20) {
1326 desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
1327 desc->length = cpu_to_le16(aligned_len >> 2);
1329 wl1271_debug(DEBUG_TX,
1330 "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1332 le16_to_cpu(desc->length),
1333 le16_to_cpu(desc->life_time),
1334 desc->wl128x_mem.total_mem_blocks,
1335 desc->wl128x_mem.extra_bytes);
1337 /* calculate number of padding bytes */
1338 int pad = aligned_len - skb->len;
1340 cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
1342 /* Store the aligned length in terms of words */
1343 desc->length = cpu_to_le16(aligned_len >> 2);
1345 wl1271_debug(DEBUG_TX,
1346 "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1348 le16_to_cpu(desc->length),
1349 le16_to_cpu(desc->life_time),
1350 desc->wl127x_mem.total_mem_blocks);
1354 static enum wl_rx_buf_align
1355 wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
1357 if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
1358 return WLCORE_RX_BUF_UNALIGNED;
1360 return WLCORE_RX_BUF_ALIGNED;
1363 static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
1366 struct wl1271_rx_descriptor *desc = rx_data;
1368 /* invalid packet */
1369 if (data_len < sizeof(*desc) ||
1370 data_len < sizeof(*desc) + desc->pad_len)
1373 return data_len - sizeof(*desc) - desc->pad_len;
1376 static int wl12xx_tx_delayed_compl(struct wl1271 *wl)
1378 if (wl->fw_status->tx_results_counter ==
1379 (wl->tx_results_count & 0xff))
1382 return wlcore_tx_complete(wl);
1385 static int wl12xx_hw_init(struct wl1271 *wl)
1389 if (wl->chip.id == CHIP_ID_128X_PG20) {
1390 u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
1392 ret = wl128x_cmd_general_parms(wl);
1397 * If we are in calibrator based auto detect then we got the FEM nr
1398 * in wl->fem_manuf. No need to continue further
1400 if (wl->plt_mode == PLT_FEM_DETECT)
1403 ret = wl128x_cmd_radio_parms(wl);
1407 if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
1408 /* Enable SDIO padding */
1409 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
1411 /* Must be before wl1271_acx_init_mem_config() */
1412 ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
1416 ret = wl1271_cmd_general_parms(wl);
1421 * If we are in calibrator based auto detect then we got the FEM nr
1422 * in wl->fem_manuf. No need to continue further
1424 if (wl->plt_mode == PLT_FEM_DETECT)
1427 ret = wl1271_cmd_radio_parms(wl);
1430 ret = wl1271_cmd_ext_radio_parms(wl);
1438 static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
1439 struct wl_fw_status *fw_status)
1441 struct wl12xx_fw_status *int_fw_status = raw_fw_status;
1443 fw_status->intr = le32_to_cpu(int_fw_status->intr);
1444 fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
1445 fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
1446 fw_status->tx_results_counter = int_fw_status->tx_results_counter;
1447 fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
1449 fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
1450 fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
1451 fw_status->link_fast_bitmap =
1452 le32_to_cpu(int_fw_status->link_fast_bitmap);
1453 fw_status->total_released_blks =
1454 le32_to_cpu(int_fw_status->total_released_blks);
1455 fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
1457 fw_status->counters.tx_released_pkts =
1458 int_fw_status->counters.tx_released_pkts;
1459 fw_status->counters.tx_lnk_free_pkts =
1460 int_fw_status->counters.tx_lnk_free_pkts;
1461 fw_status->counters.tx_voice_released_blks =
1462 int_fw_status->counters.tx_voice_released_blks;
1463 fw_status->counters.tx_last_rate =
1464 int_fw_status->counters.tx_last_rate;
1466 fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
1469 static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1470 struct wl12xx_vif *wlvif)
1472 return wlvif->rate_set;
1475 static void wl12xx_conf_init(struct wl1271 *wl)
1477 struct wl12xx_priv *priv = wl->priv;
1479 /* apply driver default configuration */
1480 memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
1482 /* apply default private configuration */
1483 memcpy(&priv->conf, &wl12xx_default_priv_conf, sizeof(priv->conf));
1486 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
1488 bool supported = false;
1491 if (wl->chip.id == CHIP_ID_128X_PG20) {
1492 major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
1493 minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
1495 /* in wl128x we have the MAC address if the PG is >= (2, 1) */
1496 if (major > 2 || (major == 2 && minor >= 1))
1499 major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
1500 minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
1502 /* in wl127x we have the MAC address if the PG is >= (3, 1) */
1503 if (major == 3 && minor >= 1)
1507 wl1271_debug(DEBUG_PROBE,
1508 "PG Ver major = %d minor = %d, MAC %s present",
1509 major, minor, supported ? "is" : "is not");
1514 static int wl12xx_get_fuse_mac(struct wl1271 *wl)
1519 /* Device may be in ELP from the bootloader or kexec */
1520 ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1524 usleep_range(500000, 700000);
1526 ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1530 ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1, &mac1);
1534 ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2, &mac2);
1538 /* these are the two parts of the BD_ADDR */
1539 wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
1540 ((mac1 & 0xff000000) >> 24);
1541 wl->fuse_nic_addr = mac1 & 0xffffff;
1543 ret = wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1549 static int wl12xx_get_pg_ver(struct wl1271 *wl, s8 *ver)
1554 if (wl->chip.id == CHIP_ID_128X_PG20)
1555 ret = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1,
1558 ret = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1,
1561 if (ret >= 0 && ver)
1562 *ver = (s8)((die_info & PG_VER_MASK) >> PG_VER_OFFSET);
1567 static int wl12xx_get_mac(struct wl1271 *wl)
1569 if (wl12xx_mac_in_fuse(wl))
1570 return wl12xx_get_fuse_mac(wl);
1575 static void wl12xx_set_tx_desc_csum(struct wl1271 *wl,
1576 struct wl1271_tx_hw_descr *desc,
1577 struct sk_buff *skb)
1579 desc->wl12xx_reserved = 0;
1582 static int wl12xx_plt_init(struct wl1271 *wl)
1586 ret = wl->ops->boot(wl);
1590 ret = wl->ops->hw_init(wl);
1592 goto out_irq_disable;
1595 * If we are in calibrator based auto detect then we got the FEM nr
1596 * in wl->fem_manuf. No need to continue further
1598 if (wl->plt_mode == PLT_FEM_DETECT)
1601 ret = wl1271_acx_init_mem_config(wl);
1603 goto out_irq_disable;
1605 ret = wl12xx_acx_mem_cfg(wl);
1607 goto out_free_memmap;
1609 /* Enable data path */
1610 ret = wl1271_cmd_data_path(wl, 1);
1612 goto out_free_memmap;
1614 /* Configure for CAM power saving (ie. always active) */
1615 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
1617 goto out_free_memmap;
1620 ret = wl1271_acx_pm_config(wl);
1622 goto out_free_memmap;
1627 kfree(wl->target_mem_map);
1628 wl->target_mem_map = NULL;
1631 mutex_unlock(&wl->mutex);
1632 /* Unlocking the mutex in the middle of handling is
1633 inherently unsafe. In this case we deem it safe to do,
1634 because we need to let any possibly pending IRQ out of
1635 the system (and while we are WL1271_STATE_OFF the IRQ
1636 work function will not do anything.) Also, any other
1637 possible concurrent operations will fail due to the
1638 current state, hence the wl1271 struct should be safe. */
1639 wlcore_disable_interrupts(wl);
1640 mutex_lock(&wl->mutex);
1645 static int wl12xx_get_spare_blocks(struct wl1271 *wl, bool is_gem)
1648 return WL12XX_TX_HW_BLOCK_GEM_SPARE;
1650 return WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
1653 static int wl12xx_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
1654 struct ieee80211_vif *vif,
1655 struct ieee80211_sta *sta,
1656 struct ieee80211_key_conf *key_conf)
1658 return wlcore_set_key(wl, cmd, vif, sta, key_conf);
1661 static int wl12xx_set_peer_cap(struct wl1271 *wl,
1662 struct ieee80211_sta_ht_cap *ht_cap,
1663 bool allow_ht_operation,
1664 u32 rate_set, u8 hlid)
1666 return wl1271_acx_set_ht_capabilities(wl, ht_cap, allow_ht_operation,
1670 static bool wl12xx_lnk_high_prio(struct wl1271 *wl, u8 hlid,
1671 struct wl1271_link *lnk)
1675 if (test_bit(hlid, &wl->fw_fast_lnk_map))
1676 thold = wl->conf.tx.fast_link_thold;
1678 thold = wl->conf.tx.slow_link_thold;
1680 return lnk->allocated_pkts < thold;
1683 static bool wl12xx_lnk_low_prio(struct wl1271 *wl, u8 hlid,
1684 struct wl1271_link *lnk)
1686 /* any link is good for low priority */
1690 static u32 wl12xx_convert_hwaddr(struct wl1271 *wl, u32 hwaddr)
1695 static int wl12xx_setup(struct wl1271 *wl);
1697 static struct wlcore_ops wl12xx_ops = {
1698 .setup = wl12xx_setup,
1699 .identify_chip = wl12xx_identify_chip,
1700 .boot = wl12xx_boot,
1701 .plt_init = wl12xx_plt_init,
1702 .trigger_cmd = wl12xx_trigger_cmd,
1703 .ack_event = wl12xx_ack_event,
1704 .wait_for_event = wl12xx_wait_for_event,
1705 .process_mailbox_events = wl12xx_process_mailbox_events,
1706 .calc_tx_blocks = wl12xx_calc_tx_blocks,
1707 .set_tx_desc_blocks = wl12xx_set_tx_desc_blocks,
1708 .set_tx_desc_data_len = wl12xx_set_tx_desc_data_len,
1709 .get_rx_buf_align = wl12xx_get_rx_buf_align,
1710 .get_rx_packet_len = wl12xx_get_rx_packet_len,
1711 .tx_immediate_compl = NULL,
1712 .tx_delayed_compl = wl12xx_tx_delayed_compl,
1713 .hw_init = wl12xx_hw_init,
1715 .convert_fw_status = wl12xx_convert_fw_status,
1716 .sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask,
1717 .get_pg_ver = wl12xx_get_pg_ver,
1718 .get_mac = wl12xx_get_mac,
1719 .set_tx_desc_csum = wl12xx_set_tx_desc_csum,
1720 .set_rx_csum = NULL,
1721 .ap_get_mimo_wide_rate_mask = NULL,
1722 .debugfs_init = wl12xx_debugfs_add_files,
1723 .scan_start = wl12xx_scan_start,
1724 .scan_stop = wl12xx_scan_stop,
1725 .sched_scan_start = wl12xx_sched_scan_start,
1726 .sched_scan_stop = wl12xx_scan_sched_scan_stop,
1727 .get_spare_blocks = wl12xx_get_spare_blocks,
1728 .set_key = wl12xx_set_key,
1729 .channel_switch = wl12xx_cmd_channel_switch,
1730 .pre_pkt_send = NULL,
1731 .set_peer_cap = wl12xx_set_peer_cap,
1732 .convert_hwaddr = wl12xx_convert_hwaddr,
1733 .lnk_high_prio = wl12xx_lnk_high_prio,
1734 .lnk_low_prio = wl12xx_lnk_low_prio,
1735 .interrupt_notify = NULL,
1736 .rx_ba_filter = NULL,
1740 static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
1741 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 |
1742 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT),
1743 .ht_supported = true,
1744 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K,
1745 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8,
1747 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1748 .rx_highest = cpu_to_le16(72),
1749 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1753 static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
1756 .types = BIT(NL80211_IFTYPE_STATION),
1760 .types = BIT(NL80211_IFTYPE_AP) |
1761 BIT(NL80211_IFTYPE_P2P_GO) |
1762 BIT(NL80211_IFTYPE_P2P_CLIENT),
1766 static const struct ieee80211_iface_combination
1767 wl12xx_iface_combinations[] = {
1769 .max_interfaces = 3,
1770 .limits = wl12xx_iface_limits,
1771 .n_limits = ARRAY_SIZE(wl12xx_iface_limits),
1772 .num_different_channels = 1,
1776 static const struct wl12xx_clock wl12xx_refclock_table[] = {
1777 { 19200000, false, WL12XX_REFCLOCK_19 },
1778 { 26000000, false, WL12XX_REFCLOCK_26 },
1779 { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
1780 { 38400000, false, WL12XX_REFCLOCK_38 },
1781 { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
1782 { 52000000, false, WL12XX_REFCLOCK_52 },
1786 static const struct wl12xx_clock wl12xx_tcxoclock_table[] = {
1787 { 16368000, true, WL12XX_TCXOCLOCK_16_368 },
1788 { 16800000, true, WL12XX_TCXOCLOCK_16_8 },
1789 { 19200000, true, WL12XX_TCXOCLOCK_19_2 },
1790 { 26000000, true, WL12XX_TCXOCLOCK_26 },
1791 { 32736000, true, WL12XX_TCXOCLOCK_32_736 },
1792 { 33600000, true, WL12XX_TCXOCLOCK_33_6 },
1793 { 38400000, true, WL12XX_TCXOCLOCK_38_4 },
1794 { 52000000, true, WL12XX_TCXOCLOCK_52 },
1798 static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
1799 u32 freq, bool xtal)
1803 for (i = 0; table[i].freq != 0; i++)
1804 if ((table[i].freq == freq) && (table[i].xtal == xtal))
1805 return table[i].hw_idx;
1810 static int wl12xx_setup(struct wl1271 *wl)
1812 struct wl12xx_priv *priv = wl->priv;
1813 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
1815 BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
1816 BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS > WL12XX_MAX_LINKS);
1817 BUILD_BUG_ON(WL12XX_CONF_SG_PARAMS_MAX > WLCORE_CONF_SG_PARAMS_MAX);
1819 wl->rtable = wl12xx_rtable;
1820 wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
1821 wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
1822 wl->num_links = WL12XX_MAX_LINKS;
1823 wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
1824 wl->iface_combinations = wl12xx_iface_combinations;
1825 wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations);
1826 wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
1827 wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
1828 wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
1829 wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
1830 wl->fw_status_len = sizeof(struct wl12xx_fw_status);
1831 wl->fw_status_priv_len = 0;
1832 wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
1833 wl->ofdm_only_ap = true;
1834 wlcore_set_ht_cap(wl, NL80211_BAND_2GHZ, &wl12xx_ht_cap);
1835 wlcore_set_ht_cap(wl, NL80211_BAND_5GHZ, &wl12xx_ht_cap);
1836 wl12xx_conf_init(wl);
1839 priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
1840 pdev_data->ref_clock_freq,
1841 pdev_data->ref_clock_xtal);
1842 if (priv->ref_clock < 0) {
1843 wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
1844 pdev_data->ref_clock_freq,
1845 pdev_data->ref_clock_xtal ?
1846 "XTAL" : "not XTAL");
1848 return priv->ref_clock;
1851 if (!strcmp(fref_param, "19.2"))
1852 priv->ref_clock = WL12XX_REFCLOCK_19;
1853 else if (!strcmp(fref_param, "26"))
1854 priv->ref_clock = WL12XX_REFCLOCK_26;
1855 else if (!strcmp(fref_param, "26x"))
1856 priv->ref_clock = WL12XX_REFCLOCK_26_XTAL;
1857 else if (!strcmp(fref_param, "38.4"))
1858 priv->ref_clock = WL12XX_REFCLOCK_38;
1859 else if (!strcmp(fref_param, "38.4x"))
1860 priv->ref_clock = WL12XX_REFCLOCK_38_XTAL;
1861 else if (!strcmp(fref_param, "52"))
1862 priv->ref_clock = WL12XX_REFCLOCK_52;
1864 wl1271_error("Invalid fref parameter %s", fref_param);
1867 if (!tcxo_param && pdev_data->tcxo_clock_freq) {
1868 priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
1869 pdev_data->tcxo_clock_freq,
1871 if (priv->tcxo_clock < 0) {
1872 wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
1873 pdev_data->tcxo_clock_freq);
1875 return priv->tcxo_clock;
1877 } else if (tcxo_param) {
1878 if (!strcmp(tcxo_param, "19.2"))
1879 priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
1880 else if (!strcmp(tcxo_param, "26"))
1881 priv->tcxo_clock = WL12XX_TCXOCLOCK_26;
1882 else if (!strcmp(tcxo_param, "38.4"))
1883 priv->tcxo_clock = WL12XX_TCXOCLOCK_38_4;
1884 else if (!strcmp(tcxo_param, "52"))
1885 priv->tcxo_clock = WL12XX_TCXOCLOCK_52;
1886 else if (!strcmp(tcxo_param, "16.368"))
1887 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_368;
1888 else if (!strcmp(tcxo_param, "32.736"))
1889 priv->tcxo_clock = WL12XX_TCXOCLOCK_32_736;
1890 else if (!strcmp(tcxo_param, "16.8"))
1891 priv->tcxo_clock = WL12XX_TCXOCLOCK_16_8;
1892 else if (!strcmp(tcxo_param, "33.6"))
1893 priv->tcxo_clock = WL12XX_TCXOCLOCK_33_6;
1895 wl1271_error("Invalid tcxo parameter %s", tcxo_param);
1898 priv->rx_mem_addr = kmalloc(sizeof(*priv->rx_mem_addr), GFP_KERNEL);
1899 if (!priv->rx_mem_addr)
1905 static int wl12xx_probe(struct platform_device *pdev)
1908 struct ieee80211_hw *hw;
1911 hw = wlcore_alloc_hw(sizeof(struct wl12xx_priv),
1912 WL12XX_AGGR_BUFFER_SIZE,
1913 sizeof(struct wl12xx_event_mailbox));
1915 wl1271_error("can't allocate hw");
1921 wl->ops = &wl12xx_ops;
1922 wl->ptable = wl12xx_ptable;
1923 ret = wlcore_probe(wl, pdev);
1935 static int wl12xx_remove(struct platform_device *pdev)
1937 struct wl1271 *wl = platform_get_drvdata(pdev);
1938 struct wl12xx_priv *priv;
1944 kfree(priv->rx_mem_addr);
1947 return wlcore_remove(pdev);
1950 static const struct platform_device_id wl12xx_id_table[] = {
1952 { } /* Terminating Entry */
1954 MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
1956 static struct platform_driver wl12xx_driver = {
1957 .probe = wl12xx_probe,
1958 .remove = wl12xx_remove,
1959 .id_table = wl12xx_id_table,
1961 .name = "wl12xx_driver",
1965 module_platform_driver(wl12xx_driver);
1967 module_param_named(fref, fref_param, charp, 0);
1968 MODULE_PARM_DESC(fref, "FREF clock: 19.2, 26, 26x, 38.4, 38.4x, 52");
1970 module_param_named(tcxo, tcxo_param, charp, 0);
1971 MODULE_PARM_DESC(tcxo,
1972 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
1974 MODULE_LICENSE("GPL v2");
1975 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");