xref: /linux/drivers/net/wireless/ti/wl12xx/main.c (revision 6fdcba32711044c35c0e1b094cbd8f3f0b4472c9)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * This file is part of wl1271
4  *
5  * Copyright (C) 2008-2010 Nokia Corporation
6  */
7 
8 #include <linux/module.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/platform_device.h>
11 
12 #include <linux/err.h>
13 
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"
21 
22 #include "wl12xx.h"
23 #include "reg.h"
24 #include "cmd.h"
25 #include "acx.h"
26 #include "scan.h"
27 #include "event.h"
28 #include "debugfs.h"
29 #include "conf.h"
30 
31 static char *fref_param;
32 static char *tcxo_param;
33 
34 static struct wlcore_conf wl12xx_conf = {
35 	.sg = {
36 		.params = {
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,
75 			/* general params */
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,
90 			/* AP params */
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,
100 		},
101 		.state = CONF_SG_PROTECTIVE,
102 	},
103 	.rx = {
104 		.rx_msdu_life_time           = 512000,
105 		.packet_detection_threshold  = 0,
106 		.ps_poll_timeout             = 15,
107 		.upsd_timeout                = 15,
108 		.rts_threshold               = IEEE80211_MAX_RTS_THRESHOLD,
109 		.rx_cca_threshold            = 0,
110 		.irq_blk_threshold           = 0xFFFF,
111 		.irq_pkt_threshold           = 0,
112 		.irq_timeout                 = 600,
113 		.queue_type                  = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
114 	},
115 	.tx = {
116 		.tx_energy_detection         = 0,
117 		.sta_rc_conf                 = {
118 			.enabled_rates       = 0,
119 			.short_retry_limit   = 10,
120 			.long_retry_limit    = 10,
121 			.aflags              = 0,
122 		},
123 		.ac_conf_count               = 4,
124 		.ac_conf                     = {
125 			[CONF_TX_AC_BE] = {
126 				.ac          = CONF_TX_AC_BE,
127 				.cw_min      = 15,
128 				.cw_max      = 63,
129 				.aifsn       = 3,
130 				.tx_op_limit = 0,
131 			},
132 			[CONF_TX_AC_BK] = {
133 				.ac          = CONF_TX_AC_BK,
134 				.cw_min      = 15,
135 				.cw_max      = 63,
136 				.aifsn       = 7,
137 				.tx_op_limit = 0,
138 			},
139 			[CONF_TX_AC_VI] = {
140 				.ac          = CONF_TX_AC_VI,
141 				.cw_min      = 15,
142 				.cw_max      = 63,
143 				.aifsn       = CONF_TX_AIFS_PIFS,
144 				.tx_op_limit = 3008,
145 			},
146 			[CONF_TX_AC_VO] = {
147 				.ac          = CONF_TX_AC_VO,
148 				.cw_min      = 15,
149 				.cw_max      = 63,
150 				.aifsn       = CONF_TX_AIFS_PIFS,
151 				.tx_op_limit = 1504,
152 			},
153 		},
154 		.max_tx_retries = 100,
155 		.ap_aging_period = 300,
156 		.tid_conf_count = 4,
157 		.tid_conf = {
158 			[CONF_TX_AC_BE] = {
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,
164 				.apsd_conf   = {0, 0},
165 			},
166 			[CONF_TX_AC_BK] = {
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,
172 				.apsd_conf   = {0, 0},
173 			},
174 			[CONF_TX_AC_VI] = {
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,
180 				.apsd_conf   = {0, 0},
181 			},
182 			[CONF_TX_AC_VO] = {
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,
188 				.apsd_conf   = {0, 0},
189 			},
190 		},
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,
201 	},
202 	.conn = {
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,
209 		.bcn_filt_ie = {
210 			[0] = {
211 				.ie          = WLAN_EID_CHANNEL_SWITCH,
212 				.rule        = CONF_BCN_RULE_PASS_ON_APPEARANCE,
213 			},
214 			[1] = {
215 				.ie          = WLAN_EID_HT_OPERATION,
216 				.rule        = CONF_BCN_RULE_PASS_ON_CHANGE,
217 			},
218 			[2] = {
219 				.ie	     = WLAN_EID_ERP_INFO,
220 				.rule	     = CONF_BCN_RULE_PASS_ON_CHANGE,
221 			},
222 		},
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,
235 		.forced_ps                   = false,
236 		.keep_alive_interval         = 55000,
237 		.max_listen_interval         = 20,
238 		.sta_sleep_auth              = WL1271_PSM_ILLEGAL,
239 		.suspend_rx_ba_activity      = 0,
240 	},
241 	.itrim = {
242 		.enable = false,
243 		.timeout = 50000,
244 	},
245 	.pm_config = {
246 		.host_clk_settling_time = 5000,
247 		.host_fast_wakeup_support = CONF_FAST_WAKEUP_DISABLE,
248 	},
249 	.roam_trigger = {
250 		.trigger_pacing               = 1,
251 		.avg_weight_rssi_beacon       = 20,
252 		.avg_weight_rssi_data         = 10,
253 		.avg_weight_snr_beacon        = 20,
254 		.avg_weight_snr_data          = 10,
255 	},
256 	.scan = {
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,
263 		.num_probe_reqs               = 2,
264 		.split_scan_timeout           = 50000,
265 	},
266 	.sched_scan = {
267 		/*
268 		 * Values are in TU/1000 but since sched scan FW command
269 		 * params are in TUs rounding up may occur.
270 		 */
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,
279 		.num_probe_reqs			= 2,
280 		.rssi_threshold			= -90,
281 		.snr_threshold			= 0,
282 	},
283 	.ht = {
284 		.rx_ba_win_size = 8,
285 		.tx_ba_win_size = 64,
286 		.inactivity_timeout = 10000,
287 		.tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
288 	},
289 	/*
290 	 * Memory config for wl127x chips is given in the
291 	 * wl12xx_default_priv_conf struct. The below configuration is
292 	 * for wl128x chips.
293 	 */
294 	.mem = {
295 		.num_stations                 = 1,
296 		.ssid_profiles                = 1,
297 		.rx_block_num                 = 40,
298 		.tx_min_block_num             = 40,
299 		.dynamic_memory               = 1,
300 		.min_req_tx_blocks            = 45,
301 		.min_req_rx_blocks            = 22,
302 		.tx_min                       = 27,
303 	},
304 	.fm_coex = {
305 		.enable                       = true,
306 		.swallow_period               = 5,
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 */
315 	},
316 	.rx_streaming = {
317 		.duration                      = 150,
318 		.queues                        = 0x1,
319 		.interval                      = 20,
320 		.always                        = 0,
321 	},
322 	.fwlog = {
323 		.mode                         = WL12XX_FWLOG_CONTINUOUS,
324 		.mem_blocks                   = 2,
325 		.severity                     = 0,
326 		.timestamp                    = WL12XX_FWLOG_TIMESTAMP_DISABLED,
327 		.output                       = WL12XX_FWLOG_OUTPUT_DBG_PINS,
328 		.threshold                    = 0,
329 	},
330 	.rate = {
331 		.rate_retry_score = 32000,
332 		.per_add = 8192,
333 		.per_th1 = 2048,
334 		.per_th2 = 4096,
335 		.max_per = 8100,
336 		.inverse_curiosity_factor = 5,
337 		.tx_fail_low_th = 4,
338 		.tx_fail_high_th = 10,
339 		.per_alpha_shift = 4,
340 		.per_add_shift = 13,
341 		.per_beta1_shift = 10,
342 		.per_beta2_shift = 8,
343 		.rate_check_up = 2,
344 		.rate_check_down = 12,
345 		.rate_retry_policy = {
346 			0x00, 0x00, 0x00, 0x00, 0x00,
347 			0x00, 0x00, 0x00, 0x00, 0x00,
348 			0x00, 0x00, 0x00,
349 		},
350 	},
351 	.hangover = {
352 		.recover_time               = 0,
353 		.hangover_period            = 20,
354 		.dynamic_mode               = 1,
355 		.early_termination_mode     = 1,
356 		.max_period                 = 20,
357 		.min_period                 = 1,
358 		.increase_delta             = 1,
359 		.decrease_delta             = 2,
360 		.quiet_time                 = 4,
361 		.increase_time              = 1,
362 		.window_size                = 16,
363 	},
364 	.recovery = {
365 		.bug_on_recovery	    = 0,
366 		.no_recovery		    = 0,
367 	},
368 };
369 
370 static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
371 	.rf = {
372 		.tx_per_channel_power_compensation_2 = {
373 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 		},
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,
379 		},
380 	},
381 	.mem_wl127x = {
382 		.num_stations                 = 1,
383 		.ssid_profiles                = 1,
384 		.rx_block_num                 = 70,
385 		.tx_min_block_num             = 40,
386 		.dynamic_memory               = 1,
387 		.min_req_tx_blocks            = 100,
388 		.min_req_rx_blocks            = 22,
389 		.tx_min                       = 27,
390 	},
391 
392 };
393 
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
397 
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 */
409 
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   */
414 
415 	/* TI-specific rate */
416 	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22   */
417 
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    */
426 };
427 
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 */
439 
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   */
444 
445 	/* TI-specific rate */
446 	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22   */
447 
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    */
456 };
457 
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
461 };
462 
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,
487 };
488 
489 static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
490 	[PART_DOWN] = {
491 		.mem = {
492 			.start = 0x00000000,
493 			.size  = 0x000177c0
494 		},
495 		.reg = {
496 			.start = REGISTERS_BASE,
497 			.size  = 0x00008800
498 		},
499 		.mem2 = {
500 			.start = 0x00000000,
501 			.size  = 0x00000000
502 		},
503 		.mem3 = {
504 			.start = 0x00000000,
505 			.size  = 0x00000000
506 		},
507 	},
508 
509 	[PART_BOOT] = { /* in wl12xx we can use a mix of work and down
510 			 * partition here */
511 		.mem = {
512 			.start = 0x00040000,
513 			.size  = 0x00014fc0
514 		},
515 		.reg = {
516 			.start = REGISTERS_BASE,
517 			.size  = 0x00008800
518 		},
519 		.mem2 = {
520 			.start = 0x00000000,
521 			.size  = 0x00000000
522 		},
523 		.mem3 = {
524 			.start = 0x00000000,
525 			.size  = 0x00000000
526 		},
527 	},
528 
529 	[PART_WORK] = {
530 		.mem = {
531 			.start = 0x00040000,
532 			.size  = 0x00014fc0
533 		},
534 		.reg = {
535 			.start = REGISTERS_BASE,
536 			.size  = 0x0000a000
537 		},
538 		.mem2 = {
539 			.start = 0x003004f8,
540 			.size  = 0x00000004
541 		},
542 		.mem3 = {
543 			.start = 0x00000000,
544 			.size  = 0x00040404
545 		},
546 	},
547 
548 	[PART_DRPW] = {
549 		.mem = {
550 			.start = 0x00040000,
551 			.size  = 0x00014fc0
552 		},
553 		.reg = {
554 			.start = DRPW_BASE,
555 			.size  = 0x00006000
556 		},
557 		.mem2 = {
558 			.start = 0x00000000,
559 			.size  = 0x00000000
560 		},
561 		.mem3 = {
562 			.start = 0x00000000,
563 			.size  = 0x00000000
564 		}
565 	}
566 };
567 
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,
579 
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,
583 
584 	/* raw data access memory addresses */
585 	[REG_RAW_FW_STATUS_ADDR]	= FW_STATUS_ADDR,
586 };
587 
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"
592 
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"
596 
597 static int wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
598 {
599 	int ret;
600 
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;
604 
605 		/*
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.
609 		 */
610 		u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
611 
612 		priv->rx_mem_addr->addr = (mem_block << 8) +
613 			le32_to_cpu(wl_mem_map->packet_memory_pool_start);
614 
615 		priv->rx_mem_addr->addr_extra = priv->rx_mem_addr->addr + 4;
616 
617 		ret = wlcore_write(wl, WL1271_SLV_REG_DATA, priv->rx_mem_addr,
618 				   sizeof(*priv->rx_mem_addr), false);
619 		if (ret < 0)
620 			return ret;
621 	}
622 
623 	return 0;
624 }
625 
626 static int wl12xx_identify_chip(struct wl1271 *wl)
627 {
628 	int ret = 0;
629 
630 	switch (wl->chip.id) {
631 	case CHIP_ID_127X_PG10:
632 		wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
633 			       wl->chip.id);
634 
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));
644 
645 		/* read data preparation is only needed by wl127x */
646 		wl->ops->prepare_read = wl127x_prepare_read;
647 
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);
653 		break;
654 
655 	case CHIP_ID_127X_PG20:
656 		wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
657 			     wl->chip.id);
658 
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));
669 
670 		/* read data preparation is only needed by wl127x */
671 		wl->ops->prepare_read = wl127x_prepare_read;
672 
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);
678 		break;
679 
680 	case CHIP_ID_128X_PG20:
681 		wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
682 			     wl->chip.id);
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;
686 
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;
693 
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);
699 		break;
700 	case CHIP_ID_128X_PG10:
701 	default:
702 		wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
703 		ret = -ENODEV;
704 		goto out;
705 	}
706 
707 	wl->fw_mem_block_size = 256;
708 	wl->fwlog_end = 0x2000000;
709 
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;
717 out:
718 	return ret;
719 }
720 
721 static int __must_check wl12xx_top_reg_write(struct wl1271 *wl, int addr,
722 					     u16 val)
723 {
724 	int ret;
725 
726 	/* write address >> 1 + 0x30000 to OCP_POR_CTR */
727 	addr = (addr >> 1) + 0x30000;
728 	ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
729 	if (ret < 0)
730 		goto out;
731 
732 	/* write value to OCP_POR_WDATA */
733 	ret = wlcore_write32(wl, WL12XX_OCP_DATA_WRITE, val);
734 	if (ret < 0)
735 		goto out;
736 
737 	/* write 1 to OCP_CMD */
738 	ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
739 	if (ret < 0)
740 		goto out;
741 
742 out:
743 	return ret;
744 }
745 
746 static int __must_check wl12xx_top_reg_read(struct wl1271 *wl, int addr,
747 					    u16 *out)
748 {
749 	u32 val;
750 	int timeout = OCP_CMD_LOOP;
751 	int ret;
752 
753 	/* write address >> 1 + 0x30000 to OCP_POR_CTR */
754 	addr = (addr >> 1) + 0x30000;
755 	ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
756 	if (ret < 0)
757 		return ret;
758 
759 	/* write 2 to OCP_CMD */
760 	ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
761 	if (ret < 0)
762 		return ret;
763 
764 	/* poll for data ready */
765 	do {
766 		ret = wlcore_read32(wl, WL12XX_OCP_DATA_READ, &val);
767 		if (ret < 0)
768 			return ret;
769 	} while (!(val & OCP_READY_MASK) && --timeout);
770 
771 	if (!timeout) {
772 		wl1271_warning("Top register access timed out.");
773 		return -ETIMEDOUT;
774 	}
775 
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.");
779 		return -EIO;
780 	}
781 
782 	if (out)
783 		*out = val & 0xffff;
784 
785 	return 0;
786 }
787 
788 static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
789 {
790 	u16 spare_reg;
791 	int ret;
792 
793 	/* Mask bits [2] & [8:4] in the sys_clk_cfg register */
794 	ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
795 	if (ret < 0)
796 		return ret;
797 
798 	if (spare_reg == 0xFFFF)
799 		return -EFAULT;
800 	spare_reg |= (BIT(3) | BIT(5) | BIT(6));
801 	ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
802 	if (ret < 0)
803 		return ret;
804 
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);
808 	if (ret < 0)
809 		return ret;
810 
811 	/* Delay execution for 15msec, to let the HW settle */
812 	mdelay(15);
813 
814 	return 0;
815 }
816 
817 static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
818 {
819 	u16 tcxo_detection;
820 	int ret;
821 
822 	ret = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG, &tcxo_detection);
823 	if (ret < 0)
824 		return false;
825 
826 	if (tcxo_detection & TCXO_DET_FAILED)
827 		return false;
828 
829 	return true;
830 }
831 
832 static bool wl128x_is_fref_valid(struct wl1271 *wl)
833 {
834 	u16 fref_detection;
835 	int ret;
836 
837 	ret = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG, &fref_detection);
838 	if (ret < 0)
839 		return false;
840 
841 	if (fref_detection & FREF_CLK_DETECT_FAIL)
842 		return false;
843 
844 	return true;
845 }
846 
847 static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
848 {
849 	int ret;
850 
851 	ret = wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
852 	if (ret < 0)
853 		goto out;
854 
855 	ret = wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
856 	if (ret < 0)
857 		goto out;
858 
859 	ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG,
860 				   MCS_PLL_CONFIG_REG_VAL);
861 
862 out:
863 	return ret;
864 }
865 
866 static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
867 {
868 	u16 spare_reg;
869 	u16 pll_config;
870 	u8 input_freq;
871 	struct wl12xx_priv *priv = wl->priv;
872 	int ret;
873 
874 	/* Mask bits [3:1] in the sys_clk_cfg register */
875 	ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
876 	if (ret < 0)
877 		return ret;
878 
879 	if (spare_reg == 0xFFFF)
880 		return -EFAULT;
881 	spare_reg |= BIT(2);
882 	ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
883 	if (ret < 0)
884 		return ret;
885 
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);
890 
891 	/* Set the input frequency according to the selected clock source */
892 	input_freq = (clk & 1) + 1;
893 
894 	ret = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG, &pll_config);
895 	if (ret < 0)
896 		return ret;
897 
898 	if (pll_config == 0xFFFF)
899 		return -EFAULT;
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);
903 
904 	return ret;
905 }
906 
907 /*
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.
913  */
914 static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
915 {
916 	struct wl12xx_priv *priv = wl->priv;
917 	u16 sys_clk_cfg;
918 	int ret;
919 
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))
924 			return -EINVAL;
925 		goto fref_clk;
926 	}
927 
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);
930 	if (ret < 0)
931 		return ret;
932 
933 	if (sys_clk_cfg == 0xFFFF)
934 		return -EINVAL;
935 	if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
936 		goto fref_clk;
937 
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))
942 			return -EINVAL;
943 		goto fref_clk;
944 	}
945 
946 	/* TCXO clock is selected */
947 	if (!wl128x_is_tcxo_valid(wl))
948 		return -EINVAL;
949 	*selected_clock = priv->tcxo_clock;
950 	goto config_mcs_pll;
951 
952 fref_clk:
953 	/* FREF clock is selected */
954 	if (!wl128x_is_fref_valid(wl))
955 		return -EINVAL;
956 	*selected_clock = priv->ref_clock;
957 
958 config_mcs_pll:
959 	return wl128x_configure_mcs_pll(wl, *selected_clock);
960 }
961 
962 static int wl127x_boot_clk(struct wl1271 *wl)
963 {
964 	struct wl12xx_priv *priv = wl->priv;
965 	u32 pause;
966 	u32 clk;
967 	int ret;
968 
969 	if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
970 		wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
971 
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 */
976 		clk = 0x3;
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)
980 		/* ref clk: 26/52 */
981 		clk = 0x5;
982 	else
983 		return -EINVAL;
984 
985 	if (priv->ref_clock != CONF_REF_CLK_19_2_E) {
986 		u16 val;
987 		/* Set clock type (open drain) */
988 		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE, &val);
989 		if (ret < 0)
990 			goto out;
991 
992 		val &= FREF_CLK_TYPE_BITS;
993 		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
994 		if (ret < 0)
995 			goto out;
996 
997 		/* Set clock pull mode (no pull) */
998 		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL, &val);
999 		if (ret < 0)
1000 			goto out;
1001 
1002 		val |= NO_PULL;
1003 		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
1004 		if (ret < 0)
1005 			goto out;
1006 	} else {
1007 		u16 val;
1008 		/* Set clock polarity */
1009 		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY, &val);
1010 		if (ret < 0)
1011 			goto out;
1012 
1013 		val &= FREF_CLK_POLARITY_BITS;
1014 		val |= CLK_REQ_OUTN_SEL;
1015 		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
1016 		if (ret < 0)
1017 			goto out;
1018 	}
1019 
1020 	ret = wlcore_write32(wl, WL12XX_PLL_PARAMETERS, clk);
1021 	if (ret < 0)
1022 		goto out;
1023 
1024 	ret = wlcore_read32(wl, WL12XX_PLL_PARAMETERS, &pause);
1025 	if (ret < 0)
1026 		goto out;
1027 
1028 	wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
1029 
1030 	pause &= ~(WU_COUNTER_PAUSE_VAL);
1031 	pause |= WU_COUNTER_PAUSE_VAL;
1032 	ret = wlcore_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
1033 
1034 out:
1035 	return ret;
1036 }
1037 
1038 static int wl1271_boot_soft_reset(struct wl1271 *wl)
1039 {
1040 	unsigned long timeout;
1041 	u32 boot_data;
1042 	int ret = 0;
1043 
1044 	/* perform soft reset */
1045 	ret = wlcore_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
1046 	if (ret < 0)
1047 		goto out;
1048 
1049 	/* SOFT_RESET is self clearing */
1050 	timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
1051 	while (1) {
1052 		ret = wlcore_read32(wl, WL12XX_SLV_SOFT_RESET, &boot_data);
1053 		if (ret < 0)
1054 			goto out;
1055 
1056 		wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
1057 		if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
1058 			break;
1059 
1060 		if (time_after(jiffies, timeout)) {
1061 			/* 1.2 check pWhalBus->uSelfClearTime if the
1062 			 * timeout was reached */
1063 			wl1271_error("soft reset timeout");
1064 			return -1;
1065 		}
1066 
1067 		udelay(SOFT_RESET_STALL_TIME);
1068 	}
1069 
1070 	/* disable Rx/Tx */
1071 	ret = wlcore_write32(wl, WL12XX_ENABLE, 0x0);
1072 	if (ret < 0)
1073 		goto out;
1074 
1075 	/* disable auto calibration on start*/
1076 	ret = wlcore_write32(wl, WL12XX_SPARE_A2, 0xffff);
1077 
1078 out:
1079 	return ret;
1080 }
1081 
1082 static int wl12xx_pre_boot(struct wl1271 *wl)
1083 {
1084 	struct wl12xx_priv *priv = wl->priv;
1085 	int ret = 0;
1086 	u32 clk;
1087 	int selected_clock = -1;
1088 
1089 	if (wl->chip.id == CHIP_ID_128X_PG20) {
1090 		ret = wl128x_boot_clk(wl, &selected_clock);
1091 		if (ret < 0)
1092 			goto out;
1093 	} else {
1094 		ret = wl127x_boot_clk(wl);
1095 		if (ret < 0)
1096 			goto out;
1097 	}
1098 
1099 	/* Continue the ELP wake up sequence */
1100 	ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1101 	if (ret < 0)
1102 		goto out;
1103 
1104 	udelay(500);
1105 
1106 	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1107 	if (ret < 0)
1108 		goto out;
1109 
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 */
1113 
1114 	ret = wlcore_read32(wl, WL12XX_DRPW_SCRATCH_START, &clk);
1115 	if (ret < 0)
1116 		goto out;
1117 
1118 	wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
1119 
1120 	if (wl->chip.id == CHIP_ID_128X_PG20)
1121 		clk |= ((selected_clock & 0x3) << 1) << 4;
1122 	else
1123 		clk |= (priv->ref_clock << 1) << 4;
1124 
1125 	ret = wlcore_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
1126 	if (ret < 0)
1127 		goto out;
1128 
1129 	ret = wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
1130 	if (ret < 0)
1131 		goto out;
1132 
1133 	/* Disable interrupts */
1134 	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
1135 	if (ret < 0)
1136 		goto out;
1137 
1138 	ret = wl1271_boot_soft_reset(wl);
1139 	if (ret < 0)
1140 		goto out;
1141 
1142 out:
1143 	return ret;
1144 }
1145 
1146 static int wl12xx_pre_upload(struct wl1271 *wl)
1147 {
1148 	u32 tmp;
1149 	u16 polarity;
1150 	int ret;
1151 
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");
1155 
1156 	ret = wlcore_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
1157 	if (ret < 0)
1158 		goto out;
1159 
1160 	ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &tmp);
1161 	if (ret < 0)
1162 		goto out;
1163 
1164 	wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
1165 
1166 	/* 6. read the EEPROM parameters */
1167 	ret = wlcore_read32(wl, WL12XX_SCR_PAD2, &tmp);
1168 	if (ret < 0)
1169 		goto out;
1170 
1171 	/* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1172 	 * to upload_fw) */
1173 
1174 	if (wl->chip.id == CHIP_ID_128X_PG20) {
1175 		ret = wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
1176 		if (ret < 0)
1177 			goto out;
1178 	}
1179 
1180 	/* polarity must be set before the firmware is loaded */
1181 	ret = wl12xx_top_reg_read(wl, OCP_REG_POLARITY, &polarity);
1182 	if (ret < 0)
1183 		goto out;
1184 
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);
1188 
1189 out:
1190 	return ret;
1191 }
1192 
1193 static int wl12xx_enable_interrupts(struct wl1271 *wl)
1194 {
1195 	int ret;
1196 
1197 	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1198 			       WL12XX_ACX_ALL_EVENTS_VECTOR);
1199 	if (ret < 0)
1200 		goto out;
1201 
1202 	wlcore_enable_interrupts(wl);
1203 	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1204 			       WL1271_ACX_INTR_ALL & ~(WL12XX_INTR_MASK));
1205 	if (ret < 0)
1206 		goto disable_interrupts;
1207 
1208 	ret = wlcore_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
1209 	if (ret < 0)
1210 		goto disable_interrupts;
1211 
1212 	return ret;
1213 
1214 disable_interrupts:
1215 	wlcore_disable_interrupts(wl);
1216 
1217 out:
1218 	return ret;
1219 }
1220 
1221 static int wl12xx_boot(struct wl1271 *wl)
1222 {
1223 	int ret;
1224 
1225 	ret = wl12xx_pre_boot(wl);
1226 	if (ret < 0)
1227 		goto out;
1228 
1229 	ret = wlcore_boot_upload_nvs(wl);
1230 	if (ret < 0)
1231 		goto out;
1232 
1233 	ret = wl12xx_pre_upload(wl);
1234 	if (ret < 0)
1235 		goto out;
1236 
1237 	ret = wlcore_boot_upload_firmware(wl);
1238 	if (ret < 0)
1239 		goto out;
1240 
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;
1256 
1257 	wl->ap_event_mask = MAX_TX_RETRY_EVENT_ID;
1258 
1259 	ret = wlcore_boot_run_firmware(wl);
1260 	if (ret < 0)
1261 		goto out;
1262 
1263 	ret = wl12xx_enable_interrupts(wl);
1264 
1265 out:
1266 	return ret;
1267 }
1268 
1269 static int wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
1270 			       void *buf, size_t len)
1271 {
1272 	int ret;
1273 
1274 	ret = wlcore_write(wl, cmd_box_addr, buf, len, false);
1275 	if (ret < 0)
1276 		return ret;
1277 
1278 	ret = wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
1279 
1280 	return ret;
1281 }
1282 
1283 static int wl12xx_ack_event(struct wl1271 *wl)
1284 {
1285 	return wlcore_write_reg(wl, REG_INTERRUPT_TRIG,
1286 				WL12XX_INTR_TRIG_EVENT_ACK);
1287 }
1288 
1289 static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
1290 {
1291 	u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
1292 	u32 align_len = wlcore_calc_packet_alignment(wl, len);
1293 
1294 	return (align_len + blk_size - 1) / blk_size + spare_blks;
1295 }
1296 
1297 static void
1298 wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1299 			  u32 blks, u32 spare_blks)
1300 {
1301 	if (wl->chip.id == CHIP_ID_128X_PG20) {
1302 		desc->wl128x_mem.total_mem_blocks = blks;
1303 	} else {
1304 		desc->wl127x_mem.extra_blocks = spare_blks;
1305 		desc->wl127x_mem.total_mem_blocks = blks;
1306 	}
1307 }
1308 
1309 static void
1310 wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1311 			    struct sk_buff *skb)
1312 {
1313 	u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
1314 
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);
1318 
1319 		wl1271_debug(DEBUG_TX,
1320 			     "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1321 			     desc->hlid,
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);
1326 	} else {
1327 		/* calculate number of padding bytes */
1328 		int pad = aligned_len - skb->len;
1329 		desc->tx_attr |=
1330 			cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
1331 
1332 		/* Store the aligned length in terms of words */
1333 		desc->length = cpu_to_le16(aligned_len >> 2);
1334 
1335 		wl1271_debug(DEBUG_TX,
1336 			     "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1337 			     pad, desc->hlid,
1338 			     le16_to_cpu(desc->length),
1339 			     le16_to_cpu(desc->life_time),
1340 			     desc->wl127x_mem.total_mem_blocks);
1341 	}
1342 }
1343 
1344 static enum wl_rx_buf_align
1345 wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
1346 {
1347 	if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
1348 		return WLCORE_RX_BUF_UNALIGNED;
1349 
1350 	return WLCORE_RX_BUF_ALIGNED;
1351 }
1352 
1353 static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
1354 				    u32 data_len)
1355 {
1356 	struct wl1271_rx_descriptor *desc = rx_data;
1357 
1358 	/* invalid packet */
1359 	if (data_len < sizeof(*desc) ||
1360 	    data_len < sizeof(*desc) + desc->pad_len)
1361 		return 0;
1362 
1363 	return data_len - sizeof(*desc) - desc->pad_len;
1364 }
1365 
1366 static int wl12xx_tx_delayed_compl(struct wl1271 *wl)
1367 {
1368 	if (wl->fw_status->tx_results_counter ==
1369 	    (wl->tx_results_count & 0xff))
1370 		return 0;
1371 
1372 	return wlcore_tx_complete(wl);
1373 }
1374 
1375 static int wl12xx_hw_init(struct wl1271 *wl)
1376 {
1377 	int ret;
1378 
1379 	if (wl->chip.id == CHIP_ID_128X_PG20) {
1380 		u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
1381 
1382 		ret = wl128x_cmd_general_parms(wl);
1383 		if (ret < 0)
1384 			goto out;
1385 
1386 		/*
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
1389 		 */
1390 		if (wl->plt_mode == PLT_FEM_DETECT)
1391 			goto out;
1392 
1393 		ret = wl128x_cmd_radio_parms(wl);
1394 		if (ret < 0)
1395 			goto out;
1396 
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;
1400 
1401 		/* Must be before wl1271_acx_init_mem_config() */
1402 		ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
1403 		if (ret < 0)
1404 			goto out;
1405 	} else {
1406 		ret = wl1271_cmd_general_parms(wl);
1407 		if (ret < 0)
1408 			goto out;
1409 
1410 		/*
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
1413 		 */
1414 		if (wl->plt_mode == PLT_FEM_DETECT)
1415 			goto out;
1416 
1417 		ret = wl1271_cmd_radio_parms(wl);
1418 		if (ret < 0)
1419 			goto out;
1420 		ret = wl1271_cmd_ext_radio_parms(wl);
1421 		if (ret < 0)
1422 			goto out;
1423 	}
1424 out:
1425 	return ret;
1426 }
1427 
1428 static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
1429 				     struct wl_fw_status *fw_status)
1430 {
1431 	struct wl12xx_fw_status *int_fw_status = raw_fw_status;
1432 
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;
1438 
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);
1446 
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;
1455 
1456 	fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
1457 }
1458 
1459 static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1460 				       struct wl12xx_vif *wlvif)
1461 {
1462 	return wlvif->rate_set;
1463 }
1464 
1465 static void wl12xx_conf_init(struct wl1271 *wl)
1466 {
1467 	struct wl12xx_priv *priv = wl->priv;
1468 
1469 	/* apply driver default configuration */
1470 	memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
1471 
1472 	/* apply default private configuration */
1473 	memcpy(&priv->conf, &wl12xx_default_priv_conf, sizeof(priv->conf));
1474 }
1475 
1476 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
1477 {
1478 	bool supported = false;
1479 	u8 major, minor;
1480 
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);
1484 
1485 		/* in wl128x we have the MAC address if the PG is >= (2, 1) */
1486 		if (major > 2 || (major == 2 && minor >= 1))
1487 			supported = true;
1488 	} else {
1489 		major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
1490 		minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
1491 
1492 		/* in wl127x we have the MAC address if the PG is >= (3, 1) */
1493 		if (major == 3 && minor >= 1)
1494 			supported = true;
1495 	}
1496 
1497 	wl1271_debug(DEBUG_PROBE,
1498 		     "PG Ver major = %d minor = %d, MAC %s present",
1499 		     major, minor, supported ? "is" : "is not");
1500 
1501 	return supported;
1502 }
1503 
1504 static int wl12xx_get_fuse_mac(struct wl1271 *wl)
1505 {
1506 	u32 mac1, mac2;
1507 	int ret;
1508 
1509 	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1510 	if (ret < 0)
1511 		goto out;
1512 
1513 	ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1, &mac1);
1514 	if (ret < 0)
1515 		goto out;
1516 
1517 	ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2, &mac2);
1518 	if (ret < 0)
1519 		goto out;
1520 
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;
1525 
1526 	ret = wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1527 
1528 out:
1529 	return ret;
1530 }
1531 
1532 static int wl12xx_get_pg_ver(struct wl1271 *wl, s8 *ver)
1533 {
1534 	u16 die_info;
1535 	int ret;
1536 
1537 	if (wl->chip.id == CHIP_ID_128X_PG20)
1538 		ret = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1,
1539 					  &die_info);
1540 	else
1541 		ret = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1,
1542 					  &die_info);
1543 
1544 	if (ret >= 0 && ver)
1545 		*ver = (s8)((die_info & PG_VER_MASK) >> PG_VER_OFFSET);
1546 
1547 	return ret;
1548 }
1549 
1550 static int wl12xx_get_mac(struct wl1271 *wl)
1551 {
1552 	if (wl12xx_mac_in_fuse(wl))
1553 		return wl12xx_get_fuse_mac(wl);
1554 
1555 	return 0;
1556 }
1557 
1558 static void wl12xx_set_tx_desc_csum(struct wl1271 *wl,
1559 				    struct wl1271_tx_hw_descr *desc,
1560 				    struct sk_buff *skb)
1561 {
1562 	desc->wl12xx_reserved = 0;
1563 }
1564 
1565 static int wl12xx_plt_init(struct wl1271 *wl)
1566 {
1567 	int ret;
1568 
1569 	ret = wl->ops->boot(wl);
1570 	if (ret < 0)
1571 		goto out;
1572 
1573 	ret = wl->ops->hw_init(wl);
1574 	if (ret < 0)
1575 		goto out_irq_disable;
1576 
1577 	/*
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
1580 	 */
1581 	if (wl->plt_mode == PLT_FEM_DETECT)
1582 		goto out;
1583 
1584 	ret = wl1271_acx_init_mem_config(wl);
1585 	if (ret < 0)
1586 		goto out_irq_disable;
1587 
1588 	ret = wl12xx_acx_mem_cfg(wl);
1589 	if (ret < 0)
1590 		goto out_free_memmap;
1591 
1592 	/* Enable data path */
1593 	ret = wl1271_cmd_data_path(wl, 1);
1594 	if (ret < 0)
1595 		goto out_free_memmap;
1596 
1597 	/* Configure for CAM power saving (ie. always active) */
1598 	ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
1599 	if (ret < 0)
1600 		goto out_free_memmap;
1601 
1602 	/* configure PM */
1603 	ret = wl1271_acx_pm_config(wl);
1604 	if (ret < 0)
1605 		goto out_free_memmap;
1606 
1607 	goto out;
1608 
1609 out_free_memmap:
1610 	kfree(wl->target_mem_map);
1611 	wl->target_mem_map = NULL;
1612 
1613 out_irq_disable:
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);
1624 out:
1625 	return ret;
1626 }
1627 
1628 static int wl12xx_get_spare_blocks(struct wl1271 *wl, bool is_gem)
1629 {
1630 	if (is_gem)
1631 		return WL12XX_TX_HW_BLOCK_GEM_SPARE;
1632 
1633 	return WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
1634 }
1635 
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)
1640 {
1641 	return wlcore_set_key(wl, cmd, vif, sta, key_conf);
1642 }
1643 
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)
1648 {
1649 	return wl1271_acx_set_ht_capabilities(wl, ht_cap, allow_ht_operation,
1650 					      hlid);
1651 }
1652 
1653 static bool wl12xx_lnk_high_prio(struct wl1271 *wl, u8 hlid,
1654 				 struct wl1271_link *lnk)
1655 {
1656 	u8 thold;
1657 
1658 	if (test_bit(hlid, &wl->fw_fast_lnk_map))
1659 		thold = wl->conf.tx.fast_link_thold;
1660 	else
1661 		thold = wl->conf.tx.slow_link_thold;
1662 
1663 	return lnk->allocated_pkts < thold;
1664 }
1665 
1666 static bool wl12xx_lnk_low_prio(struct wl1271 *wl, u8 hlid,
1667 				struct wl1271_link *lnk)
1668 {
1669 	/* any link is good for low priority */
1670 	return true;
1671 }
1672 
1673 static u32 wl12xx_convert_hwaddr(struct wl1271 *wl, u32 hwaddr)
1674 {
1675 	return hwaddr << 5;
1676 }
1677 
1678 static int wl12xx_setup(struct wl1271 *wl);
1679 
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,
1697 	.init_vif		= NULL,
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,
1720 	.ap_sleep		= NULL,
1721 };
1722 
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,
1729 	.mcs = {
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,
1733 		},
1734 };
1735 
1736 static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
1737 	{
1738 		.max = 3,
1739 		.types = BIT(NL80211_IFTYPE_STATION),
1740 	},
1741 	{
1742 		.max = 1,
1743 		.types = BIT(NL80211_IFTYPE_AP) |
1744 			 BIT(NL80211_IFTYPE_P2P_GO) |
1745 			 BIT(NL80211_IFTYPE_P2P_CLIENT),
1746 	},
1747 };
1748 
1749 static const struct ieee80211_iface_combination
1750 wl12xx_iface_combinations[] = {
1751 	{
1752 		.max_interfaces = 3,
1753 		.limits = wl12xx_iface_limits,
1754 		.n_limits = ARRAY_SIZE(wl12xx_iface_limits),
1755 		.num_different_channels = 1,
1756 	},
1757 };
1758 
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	},
1766 	{ 0,		false,	0 }
1767 };
1768 
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	},
1778 	{ 0,		false,	0 }
1779 };
1780 
1781 static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
1782 				u32 freq, bool xtal)
1783 {
1784 	int i;
1785 
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;
1789 
1790 	return -EINVAL;
1791 }
1792 
1793 static int wl12xx_setup(struct wl1271 *wl)
1794 {
1795 	struct wl12xx_priv *priv = wl->priv;
1796 	struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
1797 
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);
1801 
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);
1820 
1821 	if (!fref_param) {
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");
1830 
1831 			return priv->ref_clock;
1832 		}
1833 	} else {
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;
1846 		else
1847 			wl1271_error("Invalid fref parameter %s", fref_param);
1848 	}
1849 
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,
1853 						true);
1854 		if (priv->tcxo_clock < 0) {
1855 			wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
1856 				     pdev_data->tcxo_clock_freq);
1857 
1858 			return priv->tcxo_clock;
1859 		}
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;
1877 		else
1878 			wl1271_error("Invalid tcxo parameter %s", tcxo_param);
1879 	}
1880 
1881 	priv->rx_mem_addr = kmalloc(sizeof(*priv->rx_mem_addr), GFP_KERNEL);
1882 	if (!priv->rx_mem_addr)
1883 		return -ENOMEM;
1884 
1885 	return 0;
1886 }
1887 
1888 static int wl12xx_probe(struct platform_device *pdev)
1889 {
1890 	struct wl1271 *wl;
1891 	struct ieee80211_hw *hw;
1892 	int ret;
1893 
1894 	hw = wlcore_alloc_hw(sizeof(struct wl12xx_priv),
1895 			     WL12XX_AGGR_BUFFER_SIZE,
1896 			     sizeof(struct wl12xx_event_mailbox));
1897 	if (IS_ERR(hw)) {
1898 		wl1271_error("can't allocate hw");
1899 		ret = PTR_ERR(hw);
1900 		goto out;
1901 	}
1902 
1903 	wl = hw->priv;
1904 	wl->ops = &wl12xx_ops;
1905 	wl->ptable = wl12xx_ptable;
1906 	ret = wlcore_probe(wl, pdev);
1907 	if (ret)
1908 		goto out_free;
1909 
1910 	return ret;
1911 
1912 out_free:
1913 	wlcore_free_hw(wl);
1914 out:
1915 	return ret;
1916 }
1917 
1918 static int wl12xx_remove(struct platform_device *pdev)
1919 {
1920 	struct wl1271 *wl = platform_get_drvdata(pdev);
1921 	struct wl12xx_priv *priv;
1922 
1923 	if (!wl)
1924 		goto out;
1925 	priv = wl->priv;
1926 
1927 	kfree(priv->rx_mem_addr);
1928 
1929 out:
1930 	return wlcore_remove(pdev);
1931 }
1932 
1933 static const struct platform_device_id wl12xx_id_table[] = {
1934 	{ "wl12xx", 0 },
1935 	{  } /* Terminating Entry */
1936 };
1937 MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
1938 
1939 static struct platform_driver wl12xx_driver = {
1940 	.probe		= wl12xx_probe,
1941 	.remove		= wl12xx_remove,
1942 	.id_table	= wl12xx_id_table,
1943 	.driver = {
1944 		.name	= "wl12xx_driver",
1945 	}
1946 };
1947 
1948 module_platform_driver(wl12xx_driver);
1949 
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");
1952 
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");
1956 
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);
1965