1 // SPDX-License-Identifier: GPL-2.0-only
3 * This file is part of wl1271
5 * Copyright (C) 2008-2010 Nokia Corporation
8 #include <linux/module.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/platform_device.h>
12 #include <linux/err.h>
14 #include "../wlcore/wlcore.h"
15 #include "../wlcore/debug.h"
16 #include "../wlcore/io.h"
17 #include "../wlcore/acx.h"
18 #include "../wlcore/tx.h"
19 #include "../wlcore/rx.h"
20 #include "../wlcore/boot.h"
31 static char *fref_param
;
32 static char *tcxo_param
;
34 static struct wlcore_conf wl12xx_conf
= {
37 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_BR
] = 10,
38 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_BR
] = 180,
39 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_BR
] = 10,
40 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_BR
] = 180,
41 [WL12XX_CONF_SG_ACL_BT_MASTER_MIN_EDR
] = 10,
42 [WL12XX_CONF_SG_ACL_BT_MASTER_MAX_EDR
] = 80,
43 [WL12XX_CONF_SG_ACL_BT_SLAVE_MIN_EDR
] = 10,
44 [WL12XX_CONF_SG_ACL_BT_SLAVE_MAX_EDR
] = 80,
45 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_BR
] = 8,
46 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_BR
] = 8,
47 [WL12XX_CONF_SG_ACL_WLAN_PS_MASTER_EDR
] = 20,
48 [WL12XX_CONF_SG_ACL_WLAN_PS_SLAVE_EDR
] = 20,
49 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR
] = 20,
50 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR
] = 35,
51 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR
] = 16,
52 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR
] = 35,
53 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR
] = 32,
54 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR
] = 50,
55 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR
] = 28,
56 [WL12XX_CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR
] = 50,
57 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR
] = 10,
58 [WL12XX_CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR
] = 20,
59 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_BR
] = 75,
60 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR
] = 15,
61 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_BT_EDR
] = 27,
62 [WL12XX_CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR
] = 17,
63 /* active scan params */
64 [WL12XX_CONF_SG_AUTO_SCAN_PROBE_REQ
] = 170,
65 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3
] = 50,
66 [WL12XX_CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP
] = 100,
67 /* passive scan params */
68 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_BR
] = 800,
69 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_A2DP_EDR
] = 200,
70 [WL12XX_CONF_SG_PASSIVE_SCAN_DUR_FACTOR_HV3
] = 200,
71 /* passive scan in dual antenna params */
72 [WL12XX_CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN
] = 0,
73 [WL12XX_CONF_SG_BCN_HV3_COLL_THR_IN_PASSIVE_SCAN
] = 0,
74 [WL12XX_CONF_SG_TX_RX_PROTECT_BW_IN_PASSIVE_SCAN
] = 0,
76 [WL12XX_CONF_SG_STA_FORCE_PS_IN_BT_SCO
] = 1,
77 [WL12XX_CONF_SG_ANTENNA_CONFIGURATION
] = 0,
78 [WL12XX_CONF_SG_BEACON_MISS_PERCENT
] = 60,
79 [WL12XX_CONF_SG_DHCP_TIME
] = 5000,
80 [WL12XX_CONF_SG_RXT
] = 1200,
81 [WL12XX_CONF_SG_TXT
] = 1000,
82 [WL12XX_CONF_SG_ADAPTIVE_RXT_TXT
] = 1,
83 [WL12XX_CONF_SG_GENERAL_USAGE_BIT_MAP
] = 3,
84 [WL12XX_CONF_SG_HV3_MAX_SERVED
] = 6,
85 [WL12XX_CONF_SG_PS_POLL_TIMEOUT
] = 10,
86 [WL12XX_CONF_SG_UPSD_TIMEOUT
] = 10,
87 [WL12XX_CONF_SG_CONSECUTIVE_CTS_THRESHOLD
] = 2,
88 [WL12XX_CONF_SG_STA_RX_WINDOW_AFTER_DTIM
] = 5,
89 [WL12XX_CONF_SG_STA_CONNECTION_PROTECTION_TIME
] = 30,
91 [WL12XX_CONF_AP_BEACON_MISS_TX
] = 3,
92 [WL12XX_CONF_AP_RX_WINDOW_AFTER_BEACON
] = 10,
93 [WL12XX_CONF_AP_BEACON_WINDOW_INTERVAL
] = 2,
94 [WL12XX_CONF_AP_CONNECTION_PROTECTION_TIME
] = 0,
95 [WL12XX_CONF_AP_BT_ACL_VAL_BT_SERVE_TIME
] = 25,
96 [WL12XX_CONF_AP_BT_ACL_VAL_WL_SERVE_TIME
] = 25,
97 /* CTS Diluting params */
98 [WL12XX_CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH
] = 0,
99 [WL12XX_CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER
] = 0,
101 .state
= CONF_SG_PROTECTIVE
,
104 .rx_msdu_life_time
= 512000,
105 .packet_detection_threshold
= 0,
106 .ps_poll_timeout
= 15,
108 .rts_threshold
= IEEE80211_MAX_RTS_THRESHOLD
,
109 .rx_cca_threshold
= 0,
110 .irq_blk_threshold
= 0xFFFF,
111 .irq_pkt_threshold
= 0,
113 .queue_type
= CONF_RX_QUEUE_TYPE_LOW_PRIORITY
,
116 .tx_energy_detection
= 0,
119 .short_retry_limit
= 10,
120 .long_retry_limit
= 10,
143 .aifsn
= CONF_TX_AIFS_PIFS
,
150 .aifsn
= CONF_TX_AIFS_PIFS
,
154 .max_tx_retries
= 100,
155 .ap_aging_period
= 300,
159 .queue_id
= CONF_TX_AC_BE
,
160 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
161 .tsid
= CONF_TX_AC_BE
,
162 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
163 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
167 .queue_id
= CONF_TX_AC_BK
,
168 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
169 .tsid
= CONF_TX_AC_BK
,
170 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
171 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
175 .queue_id
= CONF_TX_AC_VI
,
176 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
177 .tsid
= CONF_TX_AC_VI
,
178 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
179 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
183 .queue_id
= CONF_TX_AC_VO
,
184 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
185 .tsid
= CONF_TX_AC_VO
,
186 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
187 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
191 .frag_threshold
= IEEE80211_MAX_FRAG_THRESHOLD
,
192 .tx_compl_timeout
= 700,
193 .tx_compl_threshold
= 4,
194 .basic_rate
= CONF_HW_BIT_RATE_1MBPS
,
195 .basic_rate_5
= CONF_HW_BIT_RATE_6MBPS
,
196 .tmpl_short_retry_limit
= 10,
197 .tmpl_long_retry_limit
= 10,
198 .tx_watchdog_timeout
= 5000,
199 .slow_link_thold
= 3,
200 .fast_link_thold
= 10,
203 .wake_up_event
= CONF_WAKE_UP_EVENT_DTIM
,
204 .listen_interval
= 1,
205 .suspend_wake_up_event
= CONF_WAKE_UP_EVENT_N_DTIM
,
206 .suspend_listen_interval
= 3,
207 .bcn_filt_mode
= CONF_BCN_FILT_MODE_ENABLED
,
208 .bcn_filt_ie_count
= 3,
211 .ie
= WLAN_EID_CHANNEL_SWITCH
,
212 .rule
= CONF_BCN_RULE_PASS_ON_APPEARANCE
,
215 .ie
= WLAN_EID_HT_OPERATION
,
216 .rule
= CONF_BCN_RULE_PASS_ON_CHANGE
,
219 .ie
= WLAN_EID_ERP_INFO
,
220 .rule
= CONF_BCN_RULE_PASS_ON_CHANGE
,
223 .synch_fail_thold
= 12,
224 .bss_lose_timeout
= 400,
225 .beacon_rx_timeout
= 10000,
226 .broadcast_timeout
= 20000,
227 .rx_broadcast_in_ps
= 1,
228 .ps_poll_threshold
= 10,
229 .bet_enable
= CONF_BET_MODE_ENABLE
,
230 .bet_max_consecutive
= 50,
231 .psm_entry_retries
= 8,
232 .psm_exit_retries
= 16,
233 .psm_entry_nullfunc_retries
= 3,
234 .dynamic_ps_timeout
= 1500,
236 .keep_alive_interval
= 55000,
237 .max_listen_interval
= 20,
238 .sta_sleep_auth
= WL1271_PSM_ILLEGAL
,
239 .suspend_rx_ba_activity
= 0,
246 .host_clk_settling_time
= 5000,
247 .host_fast_wakeup_support
= CONF_FAST_WAKEUP_DISABLE
,
251 .avg_weight_rssi_beacon
= 20,
252 .avg_weight_rssi_data
= 10,
253 .avg_weight_snr_beacon
= 20,
254 .avg_weight_snr_data
= 10,
257 .min_dwell_time_active
= 7500,
258 .max_dwell_time_active
= 30000,
259 .min_dwell_time_active_long
= 25000,
260 .max_dwell_time_active_long
= 50000,
261 .dwell_time_passive
= 100000,
262 .dwell_time_dfs
= 150000,
264 .split_scan_timeout
= 50000,
268 * Values are in TU/1000 but since sched scan FW command
269 * params are in TUs rounding up may occur.
271 .base_dwell_time
= 7500,
272 .max_dwell_time_delta
= 22500,
273 /* based on 250bits per probe @1Mbps */
274 .dwell_time_delta_per_probe
= 2000,
275 /* based on 250bits per probe @6Mbps (plus a bit more) */
276 .dwell_time_delta_per_probe_5
= 350,
277 .dwell_time_passive
= 100000,
278 .dwell_time_dfs
= 150000,
280 .rssi_threshold
= -90,
285 .tx_ba_win_size
= 64,
286 .inactivity_timeout
= 10000,
287 .tx_ba_tid_bitmap
= CONF_TX_BA_ENABLED_TID_BITMAP
,
290 * Memory config for wl127x chips is given in the
291 * wl12xx_default_priv_conf struct. The below configuration is
298 .tx_min_block_num
= 40,
300 .min_req_tx_blocks
= 45,
301 .min_req_rx_blocks
= 22,
307 .n_divider_fref_set_1
= 0xff, /* default */
308 .n_divider_fref_set_2
= 12,
309 .m_divider_fref_set_1
= 0xffff,
310 .m_divider_fref_set_2
= 148, /* default */
311 .coex_pll_stabilization_time
= 0xffffffff, /* default */
312 .ldo_stabilization_time
= 0xffff, /* default */
313 .fm_disturbed_band_margin
= 0xff, /* default */
314 .swallow_clk_diff
= 0xff, /* default */
323 .mode
= WL12XX_FWLOG_CONTINUOUS
,
326 .timestamp
= WL12XX_FWLOG_TIMESTAMP_DISABLED
,
327 .output
= WL12XX_FWLOG_OUTPUT_DBG_PINS
,
331 .rate_retry_score
= 32000,
336 .inverse_curiosity_factor
= 5,
338 .tx_fail_high_th
= 10,
339 .per_alpha_shift
= 4,
341 .per_beta1_shift
= 10,
342 .per_beta2_shift
= 8,
344 .rate_check_down
= 12,
345 .rate_retry_policy
= {
346 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00,
353 .hangover_period
= 20,
355 .early_termination_mode
= 1,
365 .bug_on_recovery
= 0,
370 static struct wl12xx_priv_conf wl12xx_default_priv_conf
= {
372 .tx_per_channel_power_compensation_2
= {
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 .tx_per_channel_power_compensation_5
= {
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 .tx_min_block_num
= 40,
387 .min_req_tx_blocks
= 100,
388 .min_req_rx_blocks
= 22,
394 #define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT 1
395 #define WL12XX_TX_HW_BLOCK_GEM_SPARE 2
396 #define WL12XX_TX_HW_BLOCK_SIZE 252
398 static const u8 wl12xx_rate_to_idx_2ghz
[] = {
399 /* MCS rates are used only with 11n */
400 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
401 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
402 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
403 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
404 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
405 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
406 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
407 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
408 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
410 11, /* WL12XX_CONF_HW_RXTX_RATE_54 */
411 10, /* WL12XX_CONF_HW_RXTX_RATE_48 */
412 9, /* WL12XX_CONF_HW_RXTX_RATE_36 */
413 8, /* WL12XX_CONF_HW_RXTX_RATE_24 */
415 /* TI-specific rate */
416 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* WL12XX_CONF_HW_RXTX_RATE_22 */
418 7, /* WL12XX_CONF_HW_RXTX_RATE_18 */
419 6, /* WL12XX_CONF_HW_RXTX_RATE_12 */
420 3, /* WL12XX_CONF_HW_RXTX_RATE_11 */
421 5, /* WL12XX_CONF_HW_RXTX_RATE_9 */
422 4, /* WL12XX_CONF_HW_RXTX_RATE_6 */
423 2, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
424 1, /* WL12XX_CONF_HW_RXTX_RATE_2 */
425 0 /* WL12XX_CONF_HW_RXTX_RATE_1 */
428 static const u8 wl12xx_rate_to_idx_5ghz
[] = {
429 /* MCS rates are used only with 11n */
430 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
431 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
432 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
433 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
434 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
435 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
436 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
437 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
438 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
440 7, /* WL12XX_CONF_HW_RXTX_RATE_54 */
441 6, /* WL12XX_CONF_HW_RXTX_RATE_48 */
442 5, /* WL12XX_CONF_HW_RXTX_RATE_36 */
443 4, /* WL12XX_CONF_HW_RXTX_RATE_24 */
445 /* TI-specific rate */
446 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* WL12XX_CONF_HW_RXTX_RATE_22 */
448 3, /* WL12XX_CONF_HW_RXTX_RATE_18 */
449 2, /* WL12XX_CONF_HW_RXTX_RATE_12 */
450 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* WL12XX_CONF_HW_RXTX_RATE_11 */
451 1, /* WL12XX_CONF_HW_RXTX_RATE_9 */
452 0, /* WL12XX_CONF_HW_RXTX_RATE_6 */
453 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
454 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* WL12XX_CONF_HW_RXTX_RATE_2 */
455 CONF_HW_RXTX_RATE_UNSUPPORTED
/* WL12XX_CONF_HW_RXTX_RATE_1 */
458 static const u8
*wl12xx_band_rate_to_idx
[] = {
459 [NL80211_BAND_2GHZ
] = wl12xx_rate_to_idx_2ghz
,
460 [NL80211_BAND_5GHZ
] = wl12xx_rate_to_idx_5ghz
463 enum wl12xx_hw_rates
{
464 WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI
= 0,
465 WL12XX_CONF_HW_RXTX_RATE_MCS7
,
466 WL12XX_CONF_HW_RXTX_RATE_MCS6
,
467 WL12XX_CONF_HW_RXTX_RATE_MCS5
,
468 WL12XX_CONF_HW_RXTX_RATE_MCS4
,
469 WL12XX_CONF_HW_RXTX_RATE_MCS3
,
470 WL12XX_CONF_HW_RXTX_RATE_MCS2
,
471 WL12XX_CONF_HW_RXTX_RATE_MCS1
,
472 WL12XX_CONF_HW_RXTX_RATE_MCS0
,
473 WL12XX_CONF_HW_RXTX_RATE_54
,
474 WL12XX_CONF_HW_RXTX_RATE_48
,
475 WL12XX_CONF_HW_RXTX_RATE_36
,
476 WL12XX_CONF_HW_RXTX_RATE_24
,
477 WL12XX_CONF_HW_RXTX_RATE_22
,
478 WL12XX_CONF_HW_RXTX_RATE_18
,
479 WL12XX_CONF_HW_RXTX_RATE_12
,
480 WL12XX_CONF_HW_RXTX_RATE_11
,
481 WL12XX_CONF_HW_RXTX_RATE_9
,
482 WL12XX_CONF_HW_RXTX_RATE_6
,
483 WL12XX_CONF_HW_RXTX_RATE_5_5
,
484 WL12XX_CONF_HW_RXTX_RATE_2
,
485 WL12XX_CONF_HW_RXTX_RATE_1
,
486 WL12XX_CONF_HW_RXTX_RATE_MAX
,
489 static struct wlcore_partition_set wl12xx_ptable
[PART_TABLE_LEN
] = {
496 .start
= REGISTERS_BASE
,
509 [PART_BOOT
] = { /* in wl12xx we can use a mix of work and down
516 .start
= REGISTERS_BASE
,
535 .start
= REGISTERS_BASE
,
568 static const int wl12xx_rtable
[REG_TABLE_LEN
] = {
569 [REG_ECPU_CONTROL
] = WL12XX_REG_ECPU_CONTROL
,
570 [REG_INTERRUPT_NO_CLEAR
] = WL12XX_REG_INTERRUPT_NO_CLEAR
,
571 [REG_INTERRUPT_ACK
] = WL12XX_REG_INTERRUPT_ACK
,
572 [REG_COMMAND_MAILBOX_PTR
] = WL12XX_REG_COMMAND_MAILBOX_PTR
,
573 [REG_EVENT_MAILBOX_PTR
] = WL12XX_REG_EVENT_MAILBOX_PTR
,
574 [REG_INTERRUPT_TRIG
] = WL12XX_REG_INTERRUPT_TRIG
,
575 [REG_INTERRUPT_MASK
] = WL12XX_REG_INTERRUPT_MASK
,
576 [REG_PC_ON_RECOVERY
] = WL12XX_SCR_PAD4
,
577 [REG_CHIP_ID_B
] = WL12XX_CHIP_ID_B
,
578 [REG_CMD_MBOX_ADDRESS
] = WL12XX_CMD_MBOX_ADDRESS
,
580 /* data access memory addresses, used with partition translation */
581 [REG_SLV_MEM_DATA
] = WL1271_SLV_MEM_DATA
,
582 [REG_SLV_REG_DATA
] = WL1271_SLV_REG_DATA
,
584 /* raw data access memory addresses */
585 [REG_RAW_FW_STATUS_ADDR
] = FW_STATUS_ADDR
,
588 /* TODO: maybe move to a new header file? */
589 #define WL127X_FW_NAME_MULTI "ti-connectivity/wl127x-fw-5-mr.bin"
590 #define WL127X_FW_NAME_SINGLE "ti-connectivity/wl127x-fw-5-sr.bin"
591 #define WL127X_PLT_FW_NAME "ti-connectivity/wl127x-fw-5-plt.bin"
593 #define WL128X_FW_NAME_MULTI "ti-connectivity/wl128x-fw-5-mr.bin"
594 #define WL128X_FW_NAME_SINGLE "ti-connectivity/wl128x-fw-5-sr.bin"
595 #define WL128X_PLT_FW_NAME "ti-connectivity/wl128x-fw-5-plt.bin"
597 static int wl127x_prepare_read(struct wl1271
*wl
, u32 rx_desc
, u32 len
)
601 if (wl
->chip
.id
!= CHIP_ID_128X_PG20
) {
602 struct wl1271_acx_mem_map
*wl_mem_map
= wl
->target_mem_map
;
603 struct wl12xx_priv
*priv
= wl
->priv
;
606 * Choose the block we want to read
607 * For aggregated packets, only the first memory block
608 * should be retrieved. The FW takes care of the rest.
610 u32 mem_block
= rx_desc
& RX_MEM_BLOCK_MASK
;
612 priv
->rx_mem_addr
->addr
= (mem_block
<< 8) +
613 le32_to_cpu(wl_mem_map
->packet_memory_pool_start
);
615 priv
->rx_mem_addr
->addr_extra
= priv
->rx_mem_addr
->addr
+ 4;
617 ret
= wlcore_write(wl
, WL1271_SLV_REG_DATA
, priv
->rx_mem_addr
,
618 sizeof(*priv
->rx_mem_addr
), false);
626 static int wl12xx_identify_chip(struct wl1271
*wl
)
630 switch (wl
->chip
.id
) {
631 case CHIP_ID_127X_PG10
:
632 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
635 wl
->quirks
|= WLCORE_QUIRK_LEGACY_NVS
|
636 WLCORE_QUIRK_DUAL_PROBE_TMPL
|
637 WLCORE_QUIRK_TKIP_HEADER_SPACE
|
638 WLCORE_QUIRK_START_STA_FAILS
|
639 WLCORE_QUIRK_AP_ZERO_SESSION_ID
;
640 wl
->sr_fw_name
= WL127X_FW_NAME_SINGLE
;
641 wl
->mr_fw_name
= WL127X_FW_NAME_MULTI
;
642 memcpy(&wl
->conf
.mem
, &wl12xx_default_priv_conf
.mem_wl127x
,
643 sizeof(wl
->conf
.mem
));
645 /* read data preparation is only needed by wl127x */
646 wl
->ops
->prepare_read
= wl127x_prepare_read
;
648 wlcore_set_min_fw_ver(wl
, WL127X_CHIP_VER
,
649 WL127X_IFTYPE_SR_VER
, WL127X_MAJOR_SR_VER
,
650 WL127X_SUBTYPE_SR_VER
, WL127X_MINOR_SR_VER
,
651 WL127X_IFTYPE_MR_VER
, WL127X_MAJOR_MR_VER
,
652 WL127X_SUBTYPE_MR_VER
, WL127X_MINOR_MR_VER
);
655 case CHIP_ID_127X_PG20
:
656 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
659 wl
->quirks
|= WLCORE_QUIRK_LEGACY_NVS
|
660 WLCORE_QUIRK_DUAL_PROBE_TMPL
|
661 WLCORE_QUIRK_TKIP_HEADER_SPACE
|
662 WLCORE_QUIRK_START_STA_FAILS
|
663 WLCORE_QUIRK_AP_ZERO_SESSION_ID
;
664 wl
->plt_fw_name
= WL127X_PLT_FW_NAME
;
665 wl
->sr_fw_name
= WL127X_FW_NAME_SINGLE
;
666 wl
->mr_fw_name
= WL127X_FW_NAME_MULTI
;
667 memcpy(&wl
->conf
.mem
, &wl12xx_default_priv_conf
.mem_wl127x
,
668 sizeof(wl
->conf
.mem
));
670 /* read data preparation is only needed by wl127x */
671 wl
->ops
->prepare_read
= wl127x_prepare_read
;
673 wlcore_set_min_fw_ver(wl
, WL127X_CHIP_VER
,
674 WL127X_IFTYPE_SR_VER
, WL127X_MAJOR_SR_VER
,
675 WL127X_SUBTYPE_SR_VER
, WL127X_MINOR_SR_VER
,
676 WL127X_IFTYPE_MR_VER
, WL127X_MAJOR_MR_VER
,
677 WL127X_SUBTYPE_MR_VER
, WL127X_MINOR_MR_VER
);
680 case CHIP_ID_128X_PG20
:
681 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1283 PG20)",
683 wl
->plt_fw_name
= WL128X_PLT_FW_NAME
;
684 wl
->sr_fw_name
= WL128X_FW_NAME_SINGLE
;
685 wl
->mr_fw_name
= WL128X_FW_NAME_MULTI
;
687 /* wl128x requires TX blocksize alignment */
688 wl
->quirks
|= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN
|
689 WLCORE_QUIRK_DUAL_PROBE_TMPL
|
690 WLCORE_QUIRK_TKIP_HEADER_SPACE
|
691 WLCORE_QUIRK_START_STA_FAILS
|
692 WLCORE_QUIRK_AP_ZERO_SESSION_ID
;
694 wlcore_set_min_fw_ver(wl
, WL128X_CHIP_VER
,
695 WL128X_IFTYPE_SR_VER
, WL128X_MAJOR_SR_VER
,
696 WL128X_SUBTYPE_SR_VER
, WL128X_MINOR_SR_VER
,
697 WL128X_IFTYPE_MR_VER
, WL128X_MAJOR_MR_VER
,
698 WL128X_SUBTYPE_MR_VER
, WL128X_MINOR_MR_VER
);
700 case CHIP_ID_128X_PG10
:
702 wl1271_warning("unsupported chip id: 0x%x", wl
->chip
.id
);
707 wl
->fw_mem_block_size
= 256;
708 wl
->fwlog_end
= 0x2000000;
710 /* common settings */
711 wl
->scan_templ_id_2_4
= CMD_TEMPL_APP_PROBE_REQ_2_4_LEGACY
;
712 wl
->scan_templ_id_5
= CMD_TEMPL_APP_PROBE_REQ_5_LEGACY
;
713 wl
->sched_scan_templ_id_2_4
= CMD_TEMPL_CFG_PROBE_REQ_2_4
;
714 wl
->sched_scan_templ_id_5
= CMD_TEMPL_CFG_PROBE_REQ_5
;
715 wl
->max_channels_5
= WL12XX_MAX_CHANNELS_5GHZ
;
716 wl
->ba_rx_session_count_max
= WL12XX_RX_BA_MAX_SESSIONS
;
721 static int __must_check
wl12xx_top_reg_write(struct wl1271
*wl
, int addr
,
726 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
727 addr
= (addr
>> 1) + 0x30000;
728 ret
= wlcore_write32(wl
, WL12XX_OCP_POR_CTR
, addr
);
732 /* write value to OCP_POR_WDATA */
733 ret
= wlcore_write32(wl
, WL12XX_OCP_DATA_WRITE
, val
);
737 /* write 1 to OCP_CMD */
738 ret
= wlcore_write32(wl
, WL12XX_OCP_CMD
, OCP_CMD_WRITE
);
746 static int __must_check
wl12xx_top_reg_read(struct wl1271
*wl
, int addr
,
750 int timeout
= OCP_CMD_LOOP
;
753 /* write address >> 1 + 0x30000 to OCP_POR_CTR */
754 addr
= (addr
>> 1) + 0x30000;
755 ret
= wlcore_write32(wl
, WL12XX_OCP_POR_CTR
, addr
);
759 /* write 2 to OCP_CMD */
760 ret
= wlcore_write32(wl
, WL12XX_OCP_CMD
, OCP_CMD_READ
);
764 /* poll for data ready */
766 ret
= wlcore_read32(wl
, WL12XX_OCP_DATA_READ
, &val
);
769 } while (!(val
& OCP_READY_MASK
) && --timeout
);
772 wl1271_warning("Top register access timed out.");
776 /* check data status and return if OK */
777 if ((val
& OCP_STATUS_MASK
) != OCP_STATUS_OK
) {
778 wl1271_warning("Top register access returned error.");
788 static int wl128x_switch_tcxo_to_fref(struct wl1271
*wl
)
793 /* Mask bits [2] & [8:4] in the sys_clk_cfg register */
794 ret
= wl12xx_top_reg_read(wl
, WL_SPARE_REG
, &spare_reg
);
798 if (spare_reg
== 0xFFFF)
800 spare_reg
|= (BIT(3) | BIT(5) | BIT(6));
801 ret
= wl12xx_top_reg_write(wl
, WL_SPARE_REG
, spare_reg
);
805 /* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
806 ret
= wl12xx_top_reg_write(wl
, SYS_CLK_CFG_REG
,
807 WL_CLK_REQ_TYPE_PG2
| MCS_PLL_CLK_SEL_FREF
);
811 /* Delay execution for 15msec, to let the HW settle */
817 static bool wl128x_is_tcxo_valid(struct wl1271
*wl
)
822 ret
= wl12xx_top_reg_read(wl
, TCXO_CLK_DETECT_REG
, &tcxo_detection
);
826 if (tcxo_detection
& TCXO_DET_FAILED
)
832 static bool wl128x_is_fref_valid(struct wl1271
*wl
)
837 ret
= wl12xx_top_reg_read(wl
, FREF_CLK_DETECT_REG
, &fref_detection
);
841 if (fref_detection
& FREF_CLK_DETECT_FAIL
)
847 static int wl128x_manually_configure_mcs_pll(struct wl1271
*wl
)
851 ret
= wl12xx_top_reg_write(wl
, MCS_PLL_M_REG
, MCS_PLL_M_REG_VAL
);
855 ret
= wl12xx_top_reg_write(wl
, MCS_PLL_N_REG
, MCS_PLL_N_REG_VAL
);
859 ret
= wl12xx_top_reg_write(wl
, MCS_PLL_CONFIG_REG
,
860 MCS_PLL_CONFIG_REG_VAL
);
866 static int wl128x_configure_mcs_pll(struct wl1271
*wl
, int clk
)
871 struct wl12xx_priv
*priv
= wl
->priv
;
874 /* Mask bits [3:1] in the sys_clk_cfg register */
875 ret
= wl12xx_top_reg_read(wl
, WL_SPARE_REG
, &spare_reg
);
879 if (spare_reg
== 0xFFFF)
882 ret
= wl12xx_top_reg_write(wl
, WL_SPARE_REG
, spare_reg
);
886 /* Handle special cases of the TCXO clock */
887 if (priv
->tcxo_clock
== WL12XX_TCXOCLOCK_16_8
||
888 priv
->tcxo_clock
== WL12XX_TCXOCLOCK_33_6
)
889 return wl128x_manually_configure_mcs_pll(wl
);
891 /* Set the input frequency according to the selected clock source */
892 input_freq
= (clk
& 1) + 1;
894 ret
= wl12xx_top_reg_read(wl
, MCS_PLL_CONFIG_REG
, &pll_config
);
898 if (pll_config
== 0xFFFF)
900 pll_config
|= (input_freq
<< MCS_SEL_IN_FREQ_SHIFT
);
901 pll_config
|= MCS_PLL_ENABLE_HP
;
902 ret
= wl12xx_top_reg_write(wl
, MCS_PLL_CONFIG_REG
, pll_config
);
908 * WL128x has two clocks input - TCXO and FREF.
909 * TCXO is the main clock of the device, while FREF is used to sync
910 * between the GPS and the cellular modem.
911 * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
912 * as the WLAN/BT main clock.
914 static int wl128x_boot_clk(struct wl1271
*wl
, int *selected_clock
)
916 struct wl12xx_priv
*priv
= wl
->priv
;
920 /* For XTAL-only modes, FREF will be used after switching from TCXO */
921 if (priv
->ref_clock
== WL12XX_REFCLOCK_26_XTAL
||
922 priv
->ref_clock
== WL12XX_REFCLOCK_38_XTAL
) {
923 if (!wl128x_switch_tcxo_to_fref(wl
))
928 /* Query the HW, to determine which clock source we should use */
929 ret
= wl12xx_top_reg_read(wl
, SYS_CLK_CFG_REG
, &sys_clk_cfg
);
933 if (sys_clk_cfg
== 0xFFFF)
935 if (sys_clk_cfg
& PRCM_CM_EN_MUX_WLAN_FREF
)
938 /* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
939 if (priv
->tcxo_clock
== WL12XX_TCXOCLOCK_16_368
||
940 priv
->tcxo_clock
== WL12XX_TCXOCLOCK_32_736
) {
941 if (!wl128x_switch_tcxo_to_fref(wl
))
946 /* TCXO clock is selected */
947 if (!wl128x_is_tcxo_valid(wl
))
949 *selected_clock
= priv
->tcxo_clock
;
953 /* FREF clock is selected */
954 if (!wl128x_is_fref_valid(wl
))
956 *selected_clock
= priv
->ref_clock
;
959 return wl128x_configure_mcs_pll(wl
, *selected_clock
);
962 static int wl127x_boot_clk(struct wl1271
*wl
)
964 struct wl12xx_priv
*priv
= wl
->priv
;
969 if (WL127X_PG_GET_MAJOR(wl
->hw_pg_ver
) < 3)
970 wl
->quirks
|= WLCORE_QUIRK_END_OF_TRANSACTION
;
972 if (priv
->ref_clock
== CONF_REF_CLK_19_2_E
||
973 priv
->ref_clock
== CONF_REF_CLK_38_4_E
||
974 priv
->ref_clock
== CONF_REF_CLK_38_4_M_XTAL
)
975 /* ref clk: 19.2/38.4/38.4-XTAL */
977 else if (priv
->ref_clock
== CONF_REF_CLK_26_E
||
978 priv
->ref_clock
== CONF_REF_CLK_26_M_XTAL
||
979 priv
->ref_clock
== CONF_REF_CLK_52_E
)
985 if (priv
->ref_clock
!= CONF_REF_CLK_19_2_E
) {
987 /* Set clock type (open drain) */
988 ret
= wl12xx_top_reg_read(wl
, OCP_REG_CLK_TYPE
, &val
);
992 val
&= FREF_CLK_TYPE_BITS
;
993 ret
= wl12xx_top_reg_write(wl
, OCP_REG_CLK_TYPE
, val
);
997 /* Set clock pull mode (no pull) */
998 ret
= wl12xx_top_reg_read(wl
, OCP_REG_CLK_PULL
, &val
);
1003 ret
= wl12xx_top_reg_write(wl
, OCP_REG_CLK_PULL
, val
);
1008 /* Set clock polarity */
1009 ret
= wl12xx_top_reg_read(wl
, OCP_REG_CLK_POLARITY
, &val
);
1013 val
&= FREF_CLK_POLARITY_BITS
;
1014 val
|= CLK_REQ_OUTN_SEL
;
1015 ret
= wl12xx_top_reg_write(wl
, OCP_REG_CLK_POLARITY
, val
);
1020 ret
= wlcore_write32(wl
, WL12XX_PLL_PARAMETERS
, clk
);
1024 ret
= wlcore_read32(wl
, WL12XX_PLL_PARAMETERS
, &pause
);
1028 wl1271_debug(DEBUG_BOOT
, "pause1 0x%x", pause
);
1030 pause
&= ~(WU_COUNTER_PAUSE_VAL
);
1031 pause
|= WU_COUNTER_PAUSE_VAL
;
1032 ret
= wlcore_write32(wl
, WL12XX_WU_COUNTER_PAUSE
, pause
);
1038 static int wl1271_boot_soft_reset(struct wl1271
*wl
)
1040 unsigned long timeout
;
1044 /* perform soft reset */
1045 ret
= wlcore_write32(wl
, WL12XX_SLV_SOFT_RESET
, ACX_SLV_SOFT_RESET_BIT
);
1049 /* SOFT_RESET is self clearing */
1050 timeout
= jiffies
+ usecs_to_jiffies(SOFT_RESET_MAX_TIME
);
1052 ret
= wlcore_read32(wl
, WL12XX_SLV_SOFT_RESET
, &boot_data
);
1056 wl1271_debug(DEBUG_BOOT
, "soft reset bootdata 0x%x", boot_data
);
1057 if ((boot_data
& ACX_SLV_SOFT_RESET_BIT
) == 0)
1060 if (time_after(jiffies
, timeout
)) {
1061 /* 1.2 check pWhalBus->uSelfClearTime if the
1062 * timeout was reached */
1063 wl1271_error("soft reset timeout");
1067 udelay(SOFT_RESET_STALL_TIME
);
1071 ret
= wlcore_write32(wl
, WL12XX_ENABLE
, 0x0);
1075 /* disable auto calibration on start*/
1076 ret
= wlcore_write32(wl
, WL12XX_SPARE_A2
, 0xffff);
1082 static int wl12xx_pre_boot(struct wl1271
*wl
)
1084 struct wl12xx_priv
*priv
= wl
->priv
;
1087 int selected_clock
= -1;
1089 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1090 ret
= wl128x_boot_clk(wl
, &selected_clock
);
1094 ret
= wl127x_boot_clk(wl
);
1099 /* Continue the ELP wake up sequence */
1100 ret
= wlcore_write32(wl
, WL12XX_WELP_ARM_COMMAND
, WELP_ARM_COMMAND_VAL
);
1106 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_DRPW
]);
1110 /* Read-modify-write DRPW_SCRATCH_START register (see next state)
1111 to be used by DRPw FW. The RTRIM value will be added by the FW
1112 before taking DRPw out of reset */
1114 ret
= wlcore_read32(wl
, WL12XX_DRPW_SCRATCH_START
, &clk
);
1118 wl1271_debug(DEBUG_BOOT
, "clk2 0x%x", clk
);
1120 if (wl
->chip
.id
== CHIP_ID_128X_PG20
)
1121 clk
|= ((selected_clock
& 0x3) << 1) << 4;
1123 clk
|= (priv
->ref_clock
<< 1) << 4;
1125 ret
= wlcore_write32(wl
, WL12XX_DRPW_SCRATCH_START
, clk
);
1129 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_WORK
]);
1133 /* Disable interrupts */
1134 ret
= wlcore_write_reg(wl
, REG_INTERRUPT_MASK
, WL1271_ACX_INTR_ALL
);
1138 ret
= wl1271_boot_soft_reset(wl
);
1146 static int wl12xx_pre_upload(struct wl1271
*wl
)
1152 /* write firmware's last address (ie. it's length) to
1153 * ACX_EEPROMLESS_IND_REG */
1154 wl1271_debug(DEBUG_BOOT
, "ACX_EEPROMLESS_IND_REG");
1156 ret
= wlcore_write32(wl
, WL12XX_EEPROMLESS_IND
, WL12XX_EEPROMLESS_IND
);
1160 ret
= wlcore_read_reg(wl
, REG_CHIP_ID_B
, &tmp
);
1164 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x", tmp
);
1166 /* 6. read the EEPROM parameters */
1167 ret
= wlcore_read32(wl
, WL12XX_SCR_PAD2
, &tmp
);
1171 /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1174 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1175 ret
= wl12xx_top_reg_write(wl
, SDIO_IO_DS
, HCI_IO_DS_6MA
);
1180 /* polarity must be set before the firmware is loaded */
1181 ret
= wl12xx_top_reg_read(wl
, OCP_REG_POLARITY
, &polarity
);
1185 /* We use HIGH polarity, so unset the LOW bit */
1186 polarity
&= ~POLARITY_LOW
;
1187 ret
= wl12xx_top_reg_write(wl
, OCP_REG_POLARITY
, polarity
);
1193 static int wl12xx_enable_interrupts(struct wl1271
*wl
)
1197 ret
= wlcore_write_reg(wl
, REG_INTERRUPT_MASK
,
1198 WL12XX_ACX_ALL_EVENTS_VECTOR
);
1202 wlcore_enable_interrupts(wl
);
1203 ret
= wlcore_write_reg(wl
, REG_INTERRUPT_MASK
,
1204 WL1271_ACX_INTR_ALL
& ~(WL12XX_INTR_MASK
));
1206 goto disable_interrupts
;
1208 ret
= wlcore_write32(wl
, WL12XX_HI_CFG
, HI_CFG_DEF_VAL
);
1210 goto disable_interrupts
;
1215 wlcore_disable_interrupts(wl
);
1221 static int wl12xx_boot(struct wl1271
*wl
)
1225 ret
= wl12xx_pre_boot(wl
);
1229 ret
= wlcore_boot_upload_nvs(wl
);
1233 ret
= wl12xx_pre_upload(wl
);
1237 ret
= wlcore_boot_upload_firmware(wl
);
1241 wl
->event_mask
= BSS_LOSE_EVENT_ID
|
1242 REGAINED_BSS_EVENT_ID
|
1243 SCAN_COMPLETE_EVENT_ID
|
1244 ROLE_STOP_COMPLETE_EVENT_ID
|
1245 RSSI_SNR_TRIGGER_0_EVENT_ID
|
1246 PSPOLL_DELIVERY_FAILURE_EVENT_ID
|
1247 SOFT_GEMINI_SENSE_EVENT_ID
|
1248 PERIODIC_SCAN_REPORT_EVENT_ID
|
1249 PERIODIC_SCAN_COMPLETE_EVENT_ID
|
1250 DUMMY_PACKET_EVENT_ID
|
1251 PEER_REMOVE_COMPLETE_EVENT_ID
|
1252 BA_SESSION_RX_CONSTRAINT_EVENT_ID
|
1253 REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID
|
1254 INACTIVE_STA_EVENT_ID
|
1255 CHANNEL_SWITCH_COMPLETE_EVENT_ID
;
1257 wl
->ap_event_mask
= MAX_TX_RETRY_EVENT_ID
;
1259 ret
= wlcore_boot_run_firmware(wl
);
1263 ret
= wl12xx_enable_interrupts(wl
);
1269 static int wl12xx_trigger_cmd(struct wl1271
*wl
, int cmd_box_addr
,
1270 void *buf
, size_t len
)
1274 ret
= wlcore_write(wl
, cmd_box_addr
, buf
, len
, false);
1278 ret
= wlcore_write_reg(wl
, REG_INTERRUPT_TRIG
, WL12XX_INTR_TRIG_CMD
);
1283 static int wl12xx_ack_event(struct wl1271
*wl
)
1285 return wlcore_write_reg(wl
, REG_INTERRUPT_TRIG
,
1286 WL12XX_INTR_TRIG_EVENT_ACK
);
1289 static u32
wl12xx_calc_tx_blocks(struct wl1271
*wl
, u32 len
, u32 spare_blks
)
1291 u32 blk_size
= WL12XX_TX_HW_BLOCK_SIZE
;
1292 u32 align_len
= wlcore_calc_packet_alignment(wl
, len
);
1294 return (align_len
+ blk_size
- 1) / blk_size
+ spare_blks
;
1298 wl12xx_set_tx_desc_blocks(struct wl1271
*wl
, struct wl1271_tx_hw_descr
*desc
,
1299 u32 blks
, u32 spare_blks
)
1301 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1302 desc
->wl128x_mem
.total_mem_blocks
= blks
;
1304 desc
->wl127x_mem
.extra_blocks
= spare_blks
;
1305 desc
->wl127x_mem
.total_mem_blocks
= blks
;
1310 wl12xx_set_tx_desc_data_len(struct wl1271
*wl
, struct wl1271_tx_hw_descr
*desc
,
1311 struct sk_buff
*skb
)
1313 u32 aligned_len
= wlcore_calc_packet_alignment(wl
, skb
->len
);
1315 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1316 desc
->wl128x_mem
.extra_bytes
= aligned_len
- skb
->len
;
1317 desc
->length
= cpu_to_le16(aligned_len
>> 2);
1319 wl1271_debug(DEBUG_TX
,
1320 "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1322 le16_to_cpu(desc
->length
),
1323 le16_to_cpu(desc
->life_time
),
1324 desc
->wl128x_mem
.total_mem_blocks
,
1325 desc
->wl128x_mem
.extra_bytes
);
1327 /* calculate number of padding bytes */
1328 int pad
= aligned_len
- skb
->len
;
1330 cpu_to_le16(pad
<< TX_HW_ATTR_OFST_LAST_WORD_PAD
);
1332 /* Store the aligned length in terms of words */
1333 desc
->length
= cpu_to_le16(aligned_len
>> 2);
1335 wl1271_debug(DEBUG_TX
,
1336 "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1338 le16_to_cpu(desc
->length
),
1339 le16_to_cpu(desc
->life_time
),
1340 desc
->wl127x_mem
.total_mem_blocks
);
1344 static enum wl_rx_buf_align
1345 wl12xx_get_rx_buf_align(struct wl1271
*wl
, u32 rx_desc
)
1347 if (rx_desc
& RX_BUF_UNALIGNED_PAYLOAD
)
1348 return WLCORE_RX_BUF_UNALIGNED
;
1350 return WLCORE_RX_BUF_ALIGNED
;
1353 static u32
wl12xx_get_rx_packet_len(struct wl1271
*wl
, void *rx_data
,
1356 struct wl1271_rx_descriptor
*desc
= rx_data
;
1358 /* invalid packet */
1359 if (data_len
< sizeof(*desc
) ||
1360 data_len
< sizeof(*desc
) + desc
->pad_len
)
1363 return data_len
- sizeof(*desc
) - desc
->pad_len
;
1366 static int wl12xx_tx_delayed_compl(struct wl1271
*wl
)
1368 if (wl
->fw_status
->tx_results_counter
==
1369 (wl
->tx_results_count
& 0xff))
1372 return wlcore_tx_complete(wl
);
1375 static int wl12xx_hw_init(struct wl1271
*wl
)
1379 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1380 u32 host_cfg_bitmap
= HOST_IF_CFG_RX_FIFO_ENABLE
;
1382 ret
= wl128x_cmd_general_parms(wl
);
1387 * If we are in calibrator based auto detect then we got the FEM nr
1388 * in wl->fem_manuf. No need to continue further
1390 if (wl
->plt_mode
== PLT_FEM_DETECT
)
1393 ret
= wl128x_cmd_radio_parms(wl
);
1397 if (wl
->quirks
& WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN
)
1398 /* Enable SDIO padding */
1399 host_cfg_bitmap
|= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK
;
1401 /* Must be before wl1271_acx_init_mem_config() */
1402 ret
= wl1271_acx_host_if_cfg_bitmap(wl
, host_cfg_bitmap
);
1406 ret
= wl1271_cmd_general_parms(wl
);
1411 * If we are in calibrator based auto detect then we got the FEM nr
1412 * in wl->fem_manuf. No need to continue further
1414 if (wl
->plt_mode
== PLT_FEM_DETECT
)
1417 ret
= wl1271_cmd_radio_parms(wl
);
1420 ret
= wl1271_cmd_ext_radio_parms(wl
);
1428 static void wl12xx_convert_fw_status(struct wl1271
*wl
, void *raw_fw_status
,
1429 struct wl_fw_status
*fw_status
)
1431 struct wl12xx_fw_status
*int_fw_status
= raw_fw_status
;
1433 fw_status
->intr
= le32_to_cpu(int_fw_status
->intr
);
1434 fw_status
->fw_rx_counter
= int_fw_status
->fw_rx_counter
;
1435 fw_status
->drv_rx_counter
= int_fw_status
->drv_rx_counter
;
1436 fw_status
->tx_results_counter
= int_fw_status
->tx_results_counter
;
1437 fw_status
->rx_pkt_descs
= int_fw_status
->rx_pkt_descs
;
1439 fw_status
->fw_localtime
= le32_to_cpu(int_fw_status
->fw_localtime
);
1440 fw_status
->link_ps_bitmap
= le32_to_cpu(int_fw_status
->link_ps_bitmap
);
1441 fw_status
->link_fast_bitmap
=
1442 le32_to_cpu(int_fw_status
->link_fast_bitmap
);
1443 fw_status
->total_released_blks
=
1444 le32_to_cpu(int_fw_status
->total_released_blks
);
1445 fw_status
->tx_total
= le32_to_cpu(int_fw_status
->tx_total
);
1447 fw_status
->counters
.tx_released_pkts
=
1448 int_fw_status
->counters
.tx_released_pkts
;
1449 fw_status
->counters
.tx_lnk_free_pkts
=
1450 int_fw_status
->counters
.tx_lnk_free_pkts
;
1451 fw_status
->counters
.tx_voice_released_blks
=
1452 int_fw_status
->counters
.tx_voice_released_blks
;
1453 fw_status
->counters
.tx_last_rate
=
1454 int_fw_status
->counters
.tx_last_rate
;
1456 fw_status
->log_start_addr
= le32_to_cpu(int_fw_status
->log_start_addr
);
1459 static u32
wl12xx_sta_get_ap_rate_mask(struct wl1271
*wl
,
1460 struct wl12xx_vif
*wlvif
)
1462 return wlvif
->rate_set
;
1465 static void wl12xx_conf_init(struct wl1271
*wl
)
1467 struct wl12xx_priv
*priv
= wl
->priv
;
1469 /* apply driver default configuration */
1470 memcpy(&wl
->conf
, &wl12xx_conf
, sizeof(wl12xx_conf
));
1472 /* apply default private configuration */
1473 memcpy(&priv
->conf
, &wl12xx_default_priv_conf
, sizeof(priv
->conf
));
1476 static bool wl12xx_mac_in_fuse(struct wl1271
*wl
)
1478 bool supported
= false;
1481 if (wl
->chip
.id
== CHIP_ID_128X_PG20
) {
1482 major
= WL128X_PG_GET_MAJOR(wl
->hw_pg_ver
);
1483 minor
= WL128X_PG_GET_MINOR(wl
->hw_pg_ver
);
1485 /* in wl128x we have the MAC address if the PG is >= (2, 1) */
1486 if (major
> 2 || (major
== 2 && minor
>= 1))
1489 major
= WL127X_PG_GET_MAJOR(wl
->hw_pg_ver
);
1490 minor
= WL127X_PG_GET_MINOR(wl
->hw_pg_ver
);
1492 /* in wl127x we have the MAC address if the PG is >= (3, 1) */
1493 if (major
== 3 && minor
>= 1)
1497 wl1271_debug(DEBUG_PROBE
,
1498 "PG Ver major = %d minor = %d, MAC %s present",
1499 major
, minor
, supported
? "is" : "is not");
1504 static int wl12xx_get_fuse_mac(struct wl1271
*wl
)
1509 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_DRPW
]);
1513 ret
= wlcore_read32(wl
, WL12XX_REG_FUSE_BD_ADDR_1
, &mac1
);
1517 ret
= wlcore_read32(wl
, WL12XX_REG_FUSE_BD_ADDR_2
, &mac2
);
1521 /* these are the two parts of the BD_ADDR */
1522 wl
->fuse_oui_addr
= ((mac2
& 0xffff) << 8) +
1523 ((mac1
& 0xff000000) >> 24);
1524 wl
->fuse_nic_addr
= mac1
& 0xffffff;
1526 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_DOWN
]);
1532 static int wl12xx_get_pg_ver(struct wl1271
*wl
, s8
*ver
)
1537 if (wl
->chip
.id
== CHIP_ID_128X_PG20
)
1538 ret
= wl12xx_top_reg_read(wl
, WL128X_REG_FUSE_DATA_2_1
,
1541 ret
= wl12xx_top_reg_read(wl
, WL127X_REG_FUSE_DATA_2_1
,
1544 if (ret
>= 0 && ver
)
1545 *ver
= (s8
)((die_info
& PG_VER_MASK
) >> PG_VER_OFFSET
);
1550 static int wl12xx_get_mac(struct wl1271
*wl
)
1552 if (wl12xx_mac_in_fuse(wl
))
1553 return wl12xx_get_fuse_mac(wl
);
1558 static void wl12xx_set_tx_desc_csum(struct wl1271
*wl
,
1559 struct wl1271_tx_hw_descr
*desc
,
1560 struct sk_buff
*skb
)
1562 desc
->wl12xx_reserved
= 0;
1565 static int wl12xx_plt_init(struct wl1271
*wl
)
1569 ret
= wl
->ops
->boot(wl
);
1573 ret
= wl
->ops
->hw_init(wl
);
1575 goto out_irq_disable
;
1578 * If we are in calibrator based auto detect then we got the FEM nr
1579 * in wl->fem_manuf. No need to continue further
1581 if (wl
->plt_mode
== PLT_FEM_DETECT
)
1584 ret
= wl1271_acx_init_mem_config(wl
);
1586 goto out_irq_disable
;
1588 ret
= wl12xx_acx_mem_cfg(wl
);
1590 goto out_free_memmap
;
1592 /* Enable data path */
1593 ret
= wl1271_cmd_data_path(wl
, 1);
1595 goto out_free_memmap
;
1597 /* Configure for CAM power saving (ie. always active) */
1598 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
1600 goto out_free_memmap
;
1603 ret
= wl1271_acx_pm_config(wl
);
1605 goto out_free_memmap
;
1610 kfree(wl
->target_mem_map
);
1611 wl
->target_mem_map
= NULL
;
1614 mutex_unlock(&wl
->mutex
);
1615 /* Unlocking the mutex in the middle of handling is
1616 inherently unsafe. In this case we deem it safe to do,
1617 because we need to let any possibly pending IRQ out of
1618 the system (and while we are WL1271_STATE_OFF the IRQ
1619 work function will not do anything.) Also, any other
1620 possible concurrent operations will fail due to the
1621 current state, hence the wl1271 struct should be safe. */
1622 wlcore_disable_interrupts(wl
);
1623 mutex_lock(&wl
->mutex
);
1628 static int wl12xx_get_spare_blocks(struct wl1271
*wl
, bool is_gem
)
1631 return WL12XX_TX_HW_BLOCK_GEM_SPARE
;
1633 return WL12XX_TX_HW_BLOCK_SPARE_DEFAULT
;
1636 static int wl12xx_set_key(struct wl1271
*wl
, enum set_key_cmd cmd
,
1637 struct ieee80211_vif
*vif
,
1638 struct ieee80211_sta
*sta
,
1639 struct ieee80211_key_conf
*key_conf
)
1641 return wlcore_set_key(wl
, cmd
, vif
, sta
, key_conf
);
1644 static int wl12xx_set_peer_cap(struct wl1271
*wl
,
1645 struct ieee80211_sta_ht_cap
*ht_cap
,
1646 bool allow_ht_operation
,
1647 u32 rate_set
, u8 hlid
)
1649 return wl1271_acx_set_ht_capabilities(wl
, ht_cap
, allow_ht_operation
,
1653 static bool wl12xx_lnk_high_prio(struct wl1271
*wl
, u8 hlid
,
1654 struct wl1271_link
*lnk
)
1658 if (test_bit(hlid
, &wl
->fw_fast_lnk_map
))
1659 thold
= wl
->conf
.tx
.fast_link_thold
;
1661 thold
= wl
->conf
.tx
.slow_link_thold
;
1663 return lnk
->allocated_pkts
< thold
;
1666 static bool wl12xx_lnk_low_prio(struct wl1271
*wl
, u8 hlid
,
1667 struct wl1271_link
*lnk
)
1669 /* any link is good for low priority */
1673 static u32
wl12xx_convert_hwaddr(struct wl1271
*wl
, u32 hwaddr
)
1678 static int wl12xx_setup(struct wl1271
*wl
);
1680 static struct wlcore_ops wl12xx_ops
= {
1681 .setup
= wl12xx_setup
,
1682 .identify_chip
= wl12xx_identify_chip
,
1683 .boot
= wl12xx_boot
,
1684 .plt_init
= wl12xx_plt_init
,
1685 .trigger_cmd
= wl12xx_trigger_cmd
,
1686 .ack_event
= wl12xx_ack_event
,
1687 .wait_for_event
= wl12xx_wait_for_event
,
1688 .process_mailbox_events
= wl12xx_process_mailbox_events
,
1689 .calc_tx_blocks
= wl12xx_calc_tx_blocks
,
1690 .set_tx_desc_blocks
= wl12xx_set_tx_desc_blocks
,
1691 .set_tx_desc_data_len
= wl12xx_set_tx_desc_data_len
,
1692 .get_rx_buf_align
= wl12xx_get_rx_buf_align
,
1693 .get_rx_packet_len
= wl12xx_get_rx_packet_len
,
1694 .tx_immediate_compl
= NULL
,
1695 .tx_delayed_compl
= wl12xx_tx_delayed_compl
,
1696 .hw_init
= wl12xx_hw_init
,
1698 .convert_fw_status
= wl12xx_convert_fw_status
,
1699 .sta_get_ap_rate_mask
= wl12xx_sta_get_ap_rate_mask
,
1700 .get_pg_ver
= wl12xx_get_pg_ver
,
1701 .get_mac
= wl12xx_get_mac
,
1702 .set_tx_desc_csum
= wl12xx_set_tx_desc_csum
,
1703 .set_rx_csum
= NULL
,
1704 .ap_get_mimo_wide_rate_mask
= NULL
,
1705 .debugfs_init
= wl12xx_debugfs_add_files
,
1706 .scan_start
= wl12xx_scan_start
,
1707 .scan_stop
= wl12xx_scan_stop
,
1708 .sched_scan_start
= wl12xx_sched_scan_start
,
1709 .sched_scan_stop
= wl12xx_scan_sched_scan_stop
,
1710 .get_spare_blocks
= wl12xx_get_spare_blocks
,
1711 .set_key
= wl12xx_set_key
,
1712 .channel_switch
= wl12xx_cmd_channel_switch
,
1713 .pre_pkt_send
= NULL
,
1714 .set_peer_cap
= wl12xx_set_peer_cap
,
1715 .convert_hwaddr
= wl12xx_convert_hwaddr
,
1716 .lnk_high_prio
= wl12xx_lnk_high_prio
,
1717 .lnk_low_prio
= wl12xx_lnk_low_prio
,
1718 .interrupt_notify
= NULL
,
1719 .rx_ba_filter
= NULL
,
1723 static struct ieee80211_sta_ht_cap wl12xx_ht_cap
= {
1724 .cap
= IEEE80211_HT_CAP_GRN_FLD
| IEEE80211_HT_CAP_SGI_20
|
1725 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT
),
1726 .ht_supported
= true,
1727 .ampdu_factor
= IEEE80211_HT_MAX_AMPDU_8K
,
1728 .ampdu_density
= IEEE80211_HT_MPDU_DENSITY_8
,
1730 .rx_mask
= { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1731 .rx_highest
= cpu_to_le16(72),
1732 .tx_params
= IEEE80211_HT_MCS_TX_DEFINED
,
1736 static const struct ieee80211_iface_limit wl12xx_iface_limits
[] = {
1739 .types
= BIT(NL80211_IFTYPE_STATION
),
1743 .types
= BIT(NL80211_IFTYPE_AP
) |
1744 BIT(NL80211_IFTYPE_P2P_GO
) |
1745 BIT(NL80211_IFTYPE_P2P_CLIENT
),
1749 static const struct ieee80211_iface_combination
1750 wl12xx_iface_combinations
[] = {
1752 .max_interfaces
= 3,
1753 .limits
= wl12xx_iface_limits
,
1754 .n_limits
= ARRAY_SIZE(wl12xx_iface_limits
),
1755 .num_different_channels
= 1,
1759 static const struct wl12xx_clock wl12xx_refclock_table
[] = {
1760 { 19200000, false, WL12XX_REFCLOCK_19
},
1761 { 26000000, false, WL12XX_REFCLOCK_26
},
1762 { 26000000, true, WL12XX_REFCLOCK_26_XTAL
},
1763 { 38400000, false, WL12XX_REFCLOCK_38
},
1764 { 38400000, true, WL12XX_REFCLOCK_38_XTAL
},
1765 { 52000000, false, WL12XX_REFCLOCK_52
},
1769 static const struct wl12xx_clock wl12xx_tcxoclock_table
[] = {
1770 { 16368000, true, WL12XX_TCXOCLOCK_16_368
},
1771 { 16800000, true, WL12XX_TCXOCLOCK_16_8
},
1772 { 19200000, true, WL12XX_TCXOCLOCK_19_2
},
1773 { 26000000, true, WL12XX_TCXOCLOCK_26
},
1774 { 32736000, true, WL12XX_TCXOCLOCK_32_736
},
1775 { 33600000, true, WL12XX_TCXOCLOCK_33_6
},
1776 { 38400000, true, WL12XX_TCXOCLOCK_38_4
},
1777 { 52000000, true, WL12XX_TCXOCLOCK_52
},
1781 static int wl12xx_get_clock_idx(const struct wl12xx_clock
*table
,
1782 u32 freq
, bool xtal
)
1786 for (i
= 0; table
[i
].freq
!= 0; i
++)
1787 if ((table
[i
].freq
== freq
) && (table
[i
].xtal
== xtal
))
1788 return table
[i
].hw_idx
;
1793 static int wl12xx_setup(struct wl1271
*wl
)
1795 struct wl12xx_priv
*priv
= wl
->priv
;
1796 struct wlcore_platdev_data
*pdev_data
= dev_get_platdata(&wl
->pdev
->dev
);
1798 BUILD_BUG_ON(WL12XX_MAX_LINKS
> WLCORE_MAX_LINKS
);
1799 BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS
> WL12XX_MAX_LINKS
);
1800 BUILD_BUG_ON(WL12XX_CONF_SG_PARAMS_MAX
> WLCORE_CONF_SG_PARAMS_MAX
);
1802 wl
->rtable
= wl12xx_rtable
;
1803 wl
->num_tx_desc
= WL12XX_NUM_TX_DESCRIPTORS
;
1804 wl
->num_rx_desc
= WL12XX_NUM_RX_DESCRIPTORS
;
1805 wl
->num_links
= WL12XX_MAX_LINKS
;
1806 wl
->max_ap_stations
= WL12XX_MAX_AP_STATIONS
;
1807 wl
->iface_combinations
= wl12xx_iface_combinations
;
1808 wl
->n_iface_combinations
= ARRAY_SIZE(wl12xx_iface_combinations
);
1809 wl
->num_mac_addr
= WL12XX_NUM_MAC_ADDRESSES
;
1810 wl
->band_rate_to_idx
= wl12xx_band_rate_to_idx
;
1811 wl
->hw_tx_rate_tbl_size
= WL12XX_CONF_HW_RXTX_RATE_MAX
;
1812 wl
->hw_min_ht_rate
= WL12XX_CONF_HW_RXTX_RATE_MCS0
;
1813 wl
->fw_status_len
= sizeof(struct wl12xx_fw_status
);
1814 wl
->fw_status_priv_len
= 0;
1815 wl
->stats
.fw_stats_len
= sizeof(struct wl12xx_acx_statistics
);
1816 wl
->ofdm_only_ap
= true;
1817 wlcore_set_ht_cap(wl
, NL80211_BAND_2GHZ
, &wl12xx_ht_cap
);
1818 wlcore_set_ht_cap(wl
, NL80211_BAND_5GHZ
, &wl12xx_ht_cap
);
1819 wl12xx_conf_init(wl
);
1822 priv
->ref_clock
= wl12xx_get_clock_idx(wl12xx_refclock_table
,
1823 pdev_data
->ref_clock_freq
,
1824 pdev_data
->ref_clock_xtal
);
1825 if (priv
->ref_clock
< 0) {
1826 wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
1827 pdev_data
->ref_clock_freq
,
1828 pdev_data
->ref_clock_xtal
?
1829 "XTAL" : "not XTAL");
1831 return priv
->ref_clock
;
1834 if (!strcmp(fref_param
, "19.2"))
1835 priv
->ref_clock
= WL12XX_REFCLOCK_19
;
1836 else if (!strcmp(fref_param
, "26"))
1837 priv
->ref_clock
= WL12XX_REFCLOCK_26
;
1838 else if (!strcmp(fref_param
, "26x"))
1839 priv
->ref_clock
= WL12XX_REFCLOCK_26_XTAL
;
1840 else if (!strcmp(fref_param
, "38.4"))
1841 priv
->ref_clock
= WL12XX_REFCLOCK_38
;
1842 else if (!strcmp(fref_param
, "38.4x"))
1843 priv
->ref_clock
= WL12XX_REFCLOCK_38_XTAL
;
1844 else if (!strcmp(fref_param
, "52"))
1845 priv
->ref_clock
= WL12XX_REFCLOCK_52
;
1847 wl1271_error("Invalid fref parameter %s", fref_param
);
1850 if (!tcxo_param
&& pdev_data
->tcxo_clock_freq
) {
1851 priv
->tcxo_clock
= wl12xx_get_clock_idx(wl12xx_tcxoclock_table
,
1852 pdev_data
->tcxo_clock_freq
,
1854 if (priv
->tcxo_clock
< 0) {
1855 wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
1856 pdev_data
->tcxo_clock_freq
);
1858 return priv
->tcxo_clock
;
1860 } else if (tcxo_param
) {
1861 if (!strcmp(tcxo_param
, "19.2"))
1862 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_19_2
;
1863 else if (!strcmp(tcxo_param
, "26"))
1864 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_26
;
1865 else if (!strcmp(tcxo_param
, "38.4"))
1866 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_38_4
;
1867 else if (!strcmp(tcxo_param
, "52"))
1868 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_52
;
1869 else if (!strcmp(tcxo_param
, "16.368"))
1870 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_16_368
;
1871 else if (!strcmp(tcxo_param
, "32.736"))
1872 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_32_736
;
1873 else if (!strcmp(tcxo_param
, "16.8"))
1874 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_16_8
;
1875 else if (!strcmp(tcxo_param
, "33.6"))
1876 priv
->tcxo_clock
= WL12XX_TCXOCLOCK_33_6
;
1878 wl1271_error("Invalid tcxo parameter %s", tcxo_param
);
1881 priv
->rx_mem_addr
= kmalloc(sizeof(*priv
->rx_mem_addr
), GFP_KERNEL
);
1882 if (!priv
->rx_mem_addr
)
1888 static int wl12xx_probe(struct platform_device
*pdev
)
1891 struct ieee80211_hw
*hw
;
1894 hw
= wlcore_alloc_hw(sizeof(struct wl12xx_priv
),
1895 WL12XX_AGGR_BUFFER_SIZE
,
1896 sizeof(struct wl12xx_event_mailbox
));
1898 wl1271_error("can't allocate hw");
1904 wl
->ops
= &wl12xx_ops
;
1905 wl
->ptable
= wl12xx_ptable
;
1906 ret
= wlcore_probe(wl
, pdev
);
1918 static int wl12xx_remove(struct platform_device
*pdev
)
1920 struct wl1271
*wl
= platform_get_drvdata(pdev
);
1921 struct wl12xx_priv
*priv
;
1927 kfree(priv
->rx_mem_addr
);
1930 return wlcore_remove(pdev
);
1933 static const struct platform_device_id wl12xx_id_table
[] = {
1935 { } /* Terminating Entry */
1937 MODULE_DEVICE_TABLE(platform
, wl12xx_id_table
);
1939 static struct platform_driver wl12xx_driver
= {
1940 .probe
= wl12xx_probe
,
1941 .remove
= wl12xx_remove
,
1942 .id_table
= wl12xx_id_table
,
1944 .name
= "wl12xx_driver",
1948 module_platform_driver(wl12xx_driver
);
1950 module_param_named(fref
, fref_param
, charp
, 0);
1951 MODULE_PARM_DESC(fref
, "FREF clock: 19.2, 26, 26x, 38.4, 38.4x, 52");
1953 module_param_named(tcxo
, tcxo_param
, charp
, 0);
1954 MODULE_PARM_DESC(tcxo
,
1955 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
1957 MODULE_LICENSE("GPL v2");
1958 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
1959 MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE
);
1960 MODULE_FIRMWARE(WL127X_FW_NAME_MULTI
);
1961 MODULE_FIRMWARE(WL127X_PLT_FW_NAME
);
1962 MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE
);
1963 MODULE_FIRMWARE(WL128X_FW_NAME_MULTI
);
1964 MODULE_FIRMWARE(WL128X_PLT_FW_NAME
);