1/*
2 * This file is part of wl1271
3 *
4 * Copyright (C) 2008-2010 Nokia Corporation
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 */
21
22#include <linux/module.h>
23#include <linux/platform_device.h>
24
25#include <linux/err.h>
26
27#include "../wlcore/wlcore.h"
28#include "../wlcore/debug.h"
29#include "../wlcore/io.h"
30#include "../wlcore/acx.h"
31#include "../wlcore/tx.h"
32#include "../wlcore/rx.h"
33#include "../wlcore/boot.h"
34
35#include "wl12xx.h"
36#include "reg.h"
37#include "cmd.h"
38#include "acx.h"
39#include "scan.h"
40#include "event.h"
41#include "debugfs.h"
42
43static char *fref_param;
44static char *tcxo_param;
45
46static struct wlcore_conf wl12xx_conf = {
47	.sg = {
48		.params = {
49			[CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
50			[CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
51			[CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
52			[CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
53			[CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
54			[CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
55			[CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
56			[CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
57			[CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
58			[CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
59			[CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
60			[CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
61			[CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
62			[CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
63			[CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
64			[CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
65			[CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
66			[CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
67			[CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
68			[CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
69			[CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
70			[CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
71			[CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
72			[CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
73			[CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
74			[CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
75			/* active scan params */
76			[CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
77			[CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
78			[CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
79			/* passive scan params */
80			[CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
81			[CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
82			[CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
83			/* passive scan in dual antenna params */
84			[CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
85			[CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
86			[CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
87			/* general params */
88			[CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
89			[CONF_SG_ANTENNA_CONFIGURATION] = 0,
90			[CONF_SG_BEACON_MISS_PERCENT] = 60,
91			[CONF_SG_DHCP_TIME] = 5000,
92			[CONF_SG_RXT] = 1200,
93			[CONF_SG_TXT] = 1000,
94			[CONF_SG_ADAPTIVE_RXT_TXT] = 1,
95			[CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
96			[CONF_SG_HV3_MAX_SERVED] = 6,
97			[CONF_SG_PS_POLL_TIMEOUT] = 10,
98			[CONF_SG_UPSD_TIMEOUT] = 10,
99			[CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
100			[CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
101			[CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
102			/* AP params */
103			[CONF_AP_BEACON_MISS_TX] = 3,
104			[CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
105			[CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
106			[CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
107			[CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
108			[CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
109			/* CTS Diluting params */
110			[CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
111			[CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
112		},
113		.state = CONF_SG_PROTECTIVE,
114	},
115	.rx = {
116		.rx_msdu_life_time           = 512000,
117		.packet_detection_threshold  = 0,
118		.ps_poll_timeout             = 15,
119		.upsd_timeout                = 15,
120		.rts_threshold               = IEEE80211_MAX_RTS_THRESHOLD,
121		.rx_cca_threshold            = 0,
122		.irq_blk_threshold           = 0xFFFF,
123		.irq_pkt_threshold           = 0,
124		.irq_timeout                 = 600,
125		.queue_type                  = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
126	},
127	.tx = {
128		.tx_energy_detection         = 0,
129		.sta_rc_conf                 = {
130			.enabled_rates       = 0,
131			.short_retry_limit   = 10,
132			.long_retry_limit    = 10,
133			.aflags              = 0,
134		},
135		.ac_conf_count               = 4,
136		.ac_conf                     = {
137			[CONF_TX_AC_BE] = {
138				.ac          = CONF_TX_AC_BE,
139				.cw_min      = 15,
140				.cw_max      = 63,
141				.aifsn       = 3,
142				.tx_op_limit = 0,
143			},
144			[CONF_TX_AC_BK] = {
145				.ac          = CONF_TX_AC_BK,
146				.cw_min      = 15,
147				.cw_max      = 63,
148				.aifsn       = 7,
149				.tx_op_limit = 0,
150			},
151			[CONF_TX_AC_VI] = {
152				.ac          = CONF_TX_AC_VI,
153				.cw_min      = 15,
154				.cw_max      = 63,
155				.aifsn       = CONF_TX_AIFS_PIFS,
156				.tx_op_limit = 3008,
157			},
158			[CONF_TX_AC_VO] = {
159				.ac          = CONF_TX_AC_VO,
160				.cw_min      = 15,
161				.cw_max      = 63,
162				.aifsn       = CONF_TX_AIFS_PIFS,
163				.tx_op_limit = 1504,
164			},
165		},
166		.max_tx_retries = 100,
167		.ap_aging_period = 300,
168		.tid_conf_count = 4,
169		.tid_conf = {
170			[CONF_TX_AC_BE] = {
171				.queue_id    = CONF_TX_AC_BE,
172				.channel_type = CONF_CHANNEL_TYPE_EDCF,
173				.tsid        = CONF_TX_AC_BE,
174				.ps_scheme   = CONF_PS_SCHEME_LEGACY,
175				.ack_policy  = CONF_ACK_POLICY_LEGACY,
176				.apsd_conf   = {0, 0},
177			},
178			[CONF_TX_AC_BK] = {
179				.queue_id    = CONF_TX_AC_BK,
180				.channel_type = CONF_CHANNEL_TYPE_EDCF,
181				.tsid        = CONF_TX_AC_BK,
182				.ps_scheme   = CONF_PS_SCHEME_LEGACY,
183				.ack_policy  = CONF_ACK_POLICY_LEGACY,
184				.apsd_conf   = {0, 0},
185			},
186			[CONF_TX_AC_VI] = {
187				.queue_id    = CONF_TX_AC_VI,
188				.channel_type = CONF_CHANNEL_TYPE_EDCF,
189				.tsid        = CONF_TX_AC_VI,
190				.ps_scheme   = CONF_PS_SCHEME_LEGACY,
191				.ack_policy  = CONF_ACK_POLICY_LEGACY,
192				.apsd_conf   = {0, 0},
193			},
194			[CONF_TX_AC_VO] = {
195				.queue_id    = CONF_TX_AC_VO,
196				.channel_type = CONF_CHANNEL_TYPE_EDCF,
197				.tsid        = CONF_TX_AC_VO,
198				.ps_scheme   = CONF_PS_SCHEME_LEGACY,
199				.ack_policy  = CONF_ACK_POLICY_LEGACY,
200				.apsd_conf   = {0, 0},
201			},
202		},
203		.frag_threshold              = IEEE80211_MAX_FRAG_THRESHOLD,
204		.tx_compl_timeout            = 700,
205		.tx_compl_threshold          = 4,
206		.basic_rate                  = CONF_HW_BIT_RATE_1MBPS,
207		.basic_rate_5                = CONF_HW_BIT_RATE_6MBPS,
208		.tmpl_short_retry_limit      = 10,
209		.tmpl_long_retry_limit       = 10,
210		.tx_watchdog_timeout         = 5000,
211		.slow_link_thold             = 3,
212		.fast_link_thold             = 10,
213	},
214	.conn = {
215		.wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
216		.listen_interval             = 1,
217		.suspend_wake_up_event       = CONF_WAKE_UP_EVENT_N_DTIM,
218		.suspend_listen_interval     = 3,
219		.bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
220		.bcn_filt_ie_count           = 3,
221		.bcn_filt_ie = {
222			[0] = {
223				.ie          = WLAN_EID_CHANNEL_SWITCH,
224				.rule        = CONF_BCN_RULE_PASS_ON_APPEARANCE,
225			},
226			[1] = {
227				.ie          = WLAN_EID_HT_OPERATION,
228				.rule        = CONF_BCN_RULE_PASS_ON_CHANGE,
229			},
230			[2] = {
231				.ie	     = WLAN_EID_ERP_INFO,
232				.rule	     = CONF_BCN_RULE_PASS_ON_CHANGE,
233			},
234		},
235		.synch_fail_thold            = 12,
236		.bss_lose_timeout            = 400,
237		.beacon_rx_timeout           = 10000,
238		.broadcast_timeout           = 20000,
239		.rx_broadcast_in_ps          = 1,
240		.ps_poll_threshold           = 10,
241		.bet_enable                  = CONF_BET_MODE_ENABLE,
242		.bet_max_consecutive         = 50,
243		.psm_entry_retries           = 8,
244		.psm_exit_retries            = 16,
245		.psm_entry_nullfunc_retries  = 3,
246		.dynamic_ps_timeout          = 1500,
247		.forced_ps                   = false,
248		.keep_alive_interval         = 55000,
249		.max_listen_interval         = 20,
250		.sta_sleep_auth              = WL1271_PSM_ILLEGAL,
251		.suspend_rx_ba_activity      = 0,
252	},
253	.itrim = {
254		.enable = false,
255		.timeout = 50000,
256	},
257	.pm_config = {
258		.host_clk_settling_time = 5000,
259		.host_fast_wakeup_support = CONF_FAST_WAKEUP_DISABLE,
260	},
261	.roam_trigger = {
262		.trigger_pacing               = 1,
263		.avg_weight_rssi_beacon       = 20,
264		.avg_weight_rssi_data         = 10,
265		.avg_weight_snr_beacon        = 20,
266		.avg_weight_snr_data          = 10,
267	},
268	.scan = {
269		.min_dwell_time_active        = 7500,
270		.max_dwell_time_active        = 30000,
271		.min_dwell_time_active_long   = 25000,
272		.max_dwell_time_active_long   = 50000,
273		.dwell_time_passive           = 100000,
274		.dwell_time_dfs               = 150000,
275		.num_probe_reqs               = 2,
276		.split_scan_timeout           = 50000,
277	},
278	.sched_scan = {
279		/*
280		 * Values are in TU/1000 but since sched scan FW command
281		 * params are in TUs rounding up may occur.
282		 */
283		.base_dwell_time		= 7500,
284		.max_dwell_time_delta		= 22500,
285		/* based on 250bits per probe @1Mbps */
286		.dwell_time_delta_per_probe	= 2000,
287		/* based on 250bits per probe @6Mbps (plus a bit more) */
288		.dwell_time_delta_per_probe_5	= 350,
289		.dwell_time_passive		= 100000,
290		.dwell_time_dfs			= 150000,
291		.num_probe_reqs			= 2,
292		.rssi_threshold			= -90,
293		.snr_threshold			= 0,
294	},
295	.ht = {
296		.rx_ba_win_size = 8,
297		.tx_ba_win_size = 64,
298		.inactivity_timeout = 10000,
299		.tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
300	},
301	/*
302	 * Memory config for wl127x chips is given in the
303	 * wl12xx_default_priv_conf struct. The below configuration is
304	 * for wl128x chips.
305	 */
306	.mem = {
307		.num_stations                 = 1,
308		.ssid_profiles                = 1,
309		.rx_block_num                 = 40,
310		.tx_min_block_num             = 40,
311		.dynamic_memory               = 1,
312		.min_req_tx_blocks            = 45,
313		.min_req_rx_blocks            = 22,
314		.tx_min                       = 27,
315	},
316	.fm_coex = {
317		.enable                       = true,
318		.swallow_period               = 5,
319		.n_divider_fref_set_1         = 0xff,       /* default */
320		.n_divider_fref_set_2         = 12,
321		.m_divider_fref_set_1         = 0xffff,
322		.m_divider_fref_set_2         = 148,	    /* default */
323		.coex_pll_stabilization_time  = 0xffffffff, /* default */
324		.ldo_stabilization_time       = 0xffff,     /* default */
325		.fm_disturbed_band_margin     = 0xff,       /* default */
326		.swallow_clk_diff             = 0xff,       /* default */
327	},
328	.rx_streaming = {
329		.duration                      = 150,
330		.queues                        = 0x1,
331		.interval                      = 20,
332		.always                        = 0,
333	},
334	.fwlog = {
335		.mode                         = WL12XX_FWLOG_CONTINUOUS,
336		.mem_blocks                   = 2,
337		.severity                     = 0,
338		.timestamp                    = WL12XX_FWLOG_TIMESTAMP_DISABLED,
339		.output                       = WL12XX_FWLOG_OUTPUT_DBG_PINS,
340		.threshold                    = 0,
341	},
342	.rate = {
343		.rate_retry_score = 32000,
344		.per_add = 8192,
345		.per_th1 = 2048,
346		.per_th2 = 4096,
347		.max_per = 8100,
348		.inverse_curiosity_factor = 5,
349		.tx_fail_low_th = 4,
350		.tx_fail_high_th = 10,
351		.per_alpha_shift = 4,
352		.per_add_shift = 13,
353		.per_beta1_shift = 10,
354		.per_beta2_shift = 8,
355		.rate_check_up = 2,
356		.rate_check_down = 12,
357		.rate_retry_policy = {
358			0x00, 0x00, 0x00, 0x00, 0x00,
359			0x00, 0x00, 0x00, 0x00, 0x00,
360			0x00, 0x00, 0x00,
361		},
362	},
363	.hangover = {
364		.recover_time               = 0,
365		.hangover_period            = 20,
366		.dynamic_mode               = 1,
367		.early_termination_mode     = 1,
368		.max_period                 = 20,
369		.min_period                 = 1,
370		.increase_delta             = 1,
371		.decrease_delta             = 2,
372		.quiet_time                 = 4,
373		.increase_time              = 1,
374		.window_size                = 16,
375	},
376	.recovery = {
377		.bug_on_recovery	    = 0,
378		.no_recovery		    = 0,
379	},
380};
381
382static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
383	.rf = {
384		.tx_per_channel_power_compensation_2 = {
385			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386		},
387		.tx_per_channel_power_compensation_5 = {
388			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391		},
392	},
393	.mem_wl127x = {
394		.num_stations                 = 1,
395		.ssid_profiles                = 1,
396		.rx_block_num                 = 70,
397		.tx_min_block_num             = 40,
398		.dynamic_memory               = 1,
399		.min_req_tx_blocks            = 100,
400		.min_req_rx_blocks            = 22,
401		.tx_min                       = 27,
402	},
403
404};
405
406#define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT        1
407#define WL12XX_TX_HW_BLOCK_GEM_SPARE            2
408#define WL12XX_TX_HW_BLOCK_SIZE                 252
409
410static const u8 wl12xx_rate_to_idx_2ghz[] = {
411	/* MCS rates are used only with 11n */
412	7,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
413	7,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
414	6,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
415	5,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
416	4,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
417	3,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
418	2,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
419	1,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
420	0,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
421
422	11,                            /* WL12XX_CONF_HW_RXTX_RATE_54   */
423	10,                            /* WL12XX_CONF_HW_RXTX_RATE_48   */
424	9,                             /* WL12XX_CONF_HW_RXTX_RATE_36   */
425	8,                             /* WL12XX_CONF_HW_RXTX_RATE_24   */
426
427	/* TI-specific rate */
428	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22   */
429
430	7,                             /* WL12XX_CONF_HW_RXTX_RATE_18   */
431	6,                             /* WL12XX_CONF_HW_RXTX_RATE_12   */
432	3,                             /* WL12XX_CONF_HW_RXTX_RATE_11   */
433	5,                             /* WL12XX_CONF_HW_RXTX_RATE_9    */
434	4,                             /* WL12XX_CONF_HW_RXTX_RATE_6    */
435	2,                             /* WL12XX_CONF_HW_RXTX_RATE_5_5  */
436	1,                             /* WL12XX_CONF_HW_RXTX_RATE_2    */
437	0                              /* WL12XX_CONF_HW_RXTX_RATE_1    */
438};
439
440static const u8 wl12xx_rate_to_idx_5ghz[] = {
441	/* MCS rates are used only with 11n */
442	7,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
443	7,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
444	6,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
445	5,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
446	4,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
447	3,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
448	2,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
449	1,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
450	0,                             /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
451
452	7,                             /* WL12XX_CONF_HW_RXTX_RATE_54   */
453	6,                             /* WL12XX_CONF_HW_RXTX_RATE_48   */
454	5,                             /* WL12XX_CONF_HW_RXTX_RATE_36   */
455	4,                             /* WL12XX_CONF_HW_RXTX_RATE_24   */
456
457	/* TI-specific rate */
458	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22   */
459
460	3,                             /* WL12XX_CONF_HW_RXTX_RATE_18   */
461	2,                             /* WL12XX_CONF_HW_RXTX_RATE_12   */
462	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_11   */
463	1,                             /* WL12XX_CONF_HW_RXTX_RATE_9    */
464	0,                             /* WL12XX_CONF_HW_RXTX_RATE_6    */
465	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_5_5  */
466	CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_2    */
467	CONF_HW_RXTX_RATE_UNSUPPORTED  /* WL12XX_CONF_HW_RXTX_RATE_1    */
468};
469
470static const u8 *wl12xx_band_rate_to_idx[] = {
471	[IEEE80211_BAND_2GHZ] = wl12xx_rate_to_idx_2ghz,
472	[IEEE80211_BAND_5GHZ] = wl12xx_rate_to_idx_5ghz
473};
474
475enum wl12xx_hw_rates {
476	WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI = 0,
477	WL12XX_CONF_HW_RXTX_RATE_MCS7,
478	WL12XX_CONF_HW_RXTX_RATE_MCS6,
479	WL12XX_CONF_HW_RXTX_RATE_MCS5,
480	WL12XX_CONF_HW_RXTX_RATE_MCS4,
481	WL12XX_CONF_HW_RXTX_RATE_MCS3,
482	WL12XX_CONF_HW_RXTX_RATE_MCS2,
483	WL12XX_CONF_HW_RXTX_RATE_MCS1,
484	WL12XX_CONF_HW_RXTX_RATE_MCS0,
485	WL12XX_CONF_HW_RXTX_RATE_54,
486	WL12XX_CONF_HW_RXTX_RATE_48,
487	WL12XX_CONF_HW_RXTX_RATE_36,
488	WL12XX_CONF_HW_RXTX_RATE_24,
489	WL12XX_CONF_HW_RXTX_RATE_22,
490	WL12XX_CONF_HW_RXTX_RATE_18,
491	WL12XX_CONF_HW_RXTX_RATE_12,
492	WL12XX_CONF_HW_RXTX_RATE_11,
493	WL12XX_CONF_HW_RXTX_RATE_9,
494	WL12XX_CONF_HW_RXTX_RATE_6,
495	WL12XX_CONF_HW_RXTX_RATE_5_5,
496	WL12XX_CONF_HW_RXTX_RATE_2,
497	WL12XX_CONF_HW_RXTX_RATE_1,
498	WL12XX_CONF_HW_RXTX_RATE_MAX,
499};
500
501static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
502	[PART_DOWN] = {
503		.mem = {
504			.start = 0x00000000,
505			.size  = 0x000177c0
506		},
507		.reg = {
508			.start = REGISTERS_BASE,
509			.size  = 0x00008800
510		},
511		.mem2 = {
512			.start = 0x00000000,
513			.size  = 0x00000000
514		},
515		.mem3 = {
516			.start = 0x00000000,
517			.size  = 0x00000000
518		},
519	},
520
521	[PART_BOOT] = { /* in wl12xx we can use a mix of work and down
522			 * partition here */
523		.mem = {
524			.start = 0x00040000,
525			.size  = 0x00014fc0
526		},
527		.reg = {
528			.start = REGISTERS_BASE,
529			.size  = 0x00008800
530		},
531		.mem2 = {
532			.start = 0x00000000,
533			.size  = 0x00000000
534		},
535		.mem3 = {
536			.start = 0x00000000,
537			.size  = 0x00000000
538		},
539	},
540
541	[PART_WORK] = {
542		.mem = {
543			.start = 0x00040000,
544			.size  = 0x00014fc0
545		},
546		.reg = {
547			.start = REGISTERS_BASE,
548			.size  = 0x0000a000
549		},
550		.mem2 = {
551			.start = 0x003004f8,
552			.size  = 0x00000004
553		},
554		.mem3 = {
555			.start = 0x00040404,
556			.size  = 0x00000000
557		},
558	},
559
560	[PART_DRPW] = {
561		.mem = {
562			.start = 0x00040000,
563			.size  = 0x00014fc0
564		},
565		.reg = {
566			.start = DRPW_BASE,
567			.size  = 0x00006000
568		},
569		.mem2 = {
570			.start = 0x00000000,
571			.size  = 0x00000000
572		},
573		.mem3 = {
574			.start = 0x00000000,
575			.size  = 0x00000000
576		}
577	}
578};
579
580static const int wl12xx_rtable[REG_TABLE_LEN] = {
581	[REG_ECPU_CONTROL]		= WL12XX_REG_ECPU_CONTROL,
582	[REG_INTERRUPT_NO_CLEAR]	= WL12XX_REG_INTERRUPT_NO_CLEAR,
583	[REG_INTERRUPT_ACK]		= WL12XX_REG_INTERRUPT_ACK,
584	[REG_COMMAND_MAILBOX_PTR]	= WL12XX_REG_COMMAND_MAILBOX_PTR,
585	[REG_EVENT_MAILBOX_PTR]		= WL12XX_REG_EVENT_MAILBOX_PTR,
586	[REG_INTERRUPT_TRIG]		= WL12XX_REG_INTERRUPT_TRIG,
587	[REG_INTERRUPT_MASK]		= WL12XX_REG_INTERRUPT_MASK,
588	[REG_PC_ON_RECOVERY]		= WL12XX_SCR_PAD4,
589	[REG_CHIP_ID_B]			= WL12XX_CHIP_ID_B,
590	[REG_CMD_MBOX_ADDRESS]		= WL12XX_CMD_MBOX_ADDRESS,
591
592	/* data access memory addresses, used with partition translation */
593	[REG_SLV_MEM_DATA]		= WL1271_SLV_MEM_DATA,
594	[REG_SLV_REG_DATA]		= WL1271_SLV_REG_DATA,
595
596	/* raw data access memory addresses */
597	[REG_RAW_FW_STATUS_ADDR]	= FW_STATUS_ADDR,
598};
599
600/* TODO: maybe move to a new header file? */
601#define WL127X_FW_NAME_MULTI	"ti-connectivity/wl127x-fw-5-mr.bin"
602#define WL127X_FW_NAME_SINGLE	"ti-connectivity/wl127x-fw-5-sr.bin"
603#define WL127X_PLT_FW_NAME	"ti-connectivity/wl127x-fw-5-plt.bin"
604
605#define WL128X_FW_NAME_MULTI	"ti-connectivity/wl128x-fw-5-mr.bin"
606#define WL128X_FW_NAME_SINGLE	"ti-connectivity/wl128x-fw-5-sr.bin"
607#define WL128X_PLT_FW_NAME	"ti-connectivity/wl128x-fw-5-plt.bin"
608
609static int wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
610{
611	int ret;
612
613	if (wl->chip.id != CHIP_ID_128X_PG20) {
614		struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
615		struct wl12xx_priv *priv = wl->priv;
616
617		/*
618		 * Choose the block we want to read
619		 * For aggregated packets, only the first memory block
620		 * should be retrieved. The FW takes care of the rest.
621		 */
622		u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
623
624		priv->rx_mem_addr->addr = (mem_block << 8) +
625			le32_to_cpu(wl_mem_map->packet_memory_pool_start);
626
627		priv->rx_mem_addr->addr_extra = priv->rx_mem_addr->addr + 4;
628
629		ret = wlcore_write(wl, WL1271_SLV_REG_DATA, priv->rx_mem_addr,
630				   sizeof(*priv->rx_mem_addr), false);
631		if (ret < 0)
632			return ret;
633	}
634
635	return 0;
636}
637
638static int wl12xx_identify_chip(struct wl1271 *wl)
639{
640	int ret = 0;
641
642	switch (wl->chip.id) {
643	case CHIP_ID_127X_PG10:
644		wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
645			       wl->chip.id);
646
647		wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
648			      WLCORE_QUIRK_DUAL_PROBE_TMPL |
649			      WLCORE_QUIRK_TKIP_HEADER_SPACE |
650			      WLCORE_QUIRK_START_STA_FAILS |
651			      WLCORE_QUIRK_AP_ZERO_SESSION_ID;
652		wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
653		wl->mr_fw_name = WL127X_FW_NAME_MULTI;
654		memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
655		       sizeof(wl->conf.mem));
656
657		/* read data preparation is only needed by wl127x */
658		wl->ops->prepare_read = wl127x_prepare_read;
659
660		wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
661			      WL127X_IFTYPE_SR_VER,  WL127X_MAJOR_SR_VER,
662			      WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
663			      WL127X_IFTYPE_MR_VER,  WL127X_MAJOR_MR_VER,
664			      WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
665		break;
666
667	case CHIP_ID_127X_PG20:
668		wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
669			     wl->chip.id);
670
671		wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
672			      WLCORE_QUIRK_DUAL_PROBE_TMPL |
673			      WLCORE_QUIRK_TKIP_HEADER_SPACE |
674			      WLCORE_QUIRK_START_STA_FAILS |
675			      WLCORE_QUIRK_AP_ZERO_SESSION_ID;
676		wl->plt_fw_name = WL127X_PLT_FW_NAME;
677		wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
678		wl->mr_fw_name = WL127X_FW_NAME_MULTI;
679		memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
680		       sizeof(wl->conf.mem));
681
682		/* read data preparation is only needed by wl127x */
683		wl->ops->prepare_read = wl127x_prepare_read;
684
685		wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER,
686			      WL127X_IFTYPE_SR_VER,  WL127X_MAJOR_SR_VER,
687			      WL127X_SUBTYPE_SR_VER, WL127X_MINOR_SR_VER,
688			      WL127X_IFTYPE_MR_VER,  WL127X_MAJOR_MR_VER,
689			      WL127X_SUBTYPE_MR_VER, WL127X_MINOR_MR_VER);
690		break;
691
692	case CHIP_ID_128X_PG20:
693		wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
694			     wl->chip.id);
695		wl->plt_fw_name = WL128X_PLT_FW_NAME;
696		wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
697		wl->mr_fw_name = WL128X_FW_NAME_MULTI;
698
699		/* wl128x requires TX blocksize alignment */
700		wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
701			      WLCORE_QUIRK_DUAL_PROBE_TMPL |
702			      WLCORE_QUIRK_TKIP_HEADER_SPACE |
703			      WLCORE_QUIRK_START_STA_FAILS |
704			      WLCORE_QUIRK_AP_ZERO_SESSION_ID;
705
706		wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER,
707			      WL128X_IFTYPE_SR_VER,  WL128X_MAJOR_SR_VER,
708			      WL128X_SUBTYPE_SR_VER, WL128X_MINOR_SR_VER,
709			      WL128X_IFTYPE_MR_VER,  WL128X_MAJOR_MR_VER,
710			      WL128X_SUBTYPE_MR_VER, WL128X_MINOR_MR_VER);
711		break;
712	case CHIP_ID_128X_PG10:
713	default:
714		wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
715		ret = -ENODEV;
716		goto out;
717	}
718
719	wl->fw_mem_block_size = 256;
720	wl->fwlog_end = 0x2000000;
721
722	/* common settings */
723	wl->scan_templ_id_2_4 = CMD_TEMPL_APP_PROBE_REQ_2_4_LEGACY;
724	wl->scan_templ_id_5 = CMD_TEMPL_APP_PROBE_REQ_5_LEGACY;
725	wl->sched_scan_templ_id_2_4 = CMD_TEMPL_CFG_PROBE_REQ_2_4;
726	wl->sched_scan_templ_id_5 = CMD_TEMPL_CFG_PROBE_REQ_5;
727	wl->max_channels_5 = WL12XX_MAX_CHANNELS_5GHZ;
728	wl->ba_rx_session_count_max = WL12XX_RX_BA_MAX_SESSIONS;
729out:
730	return ret;
731}
732
733static int __must_check wl12xx_top_reg_write(struct wl1271 *wl, int addr,
734					     u16 val)
735{
736	int ret;
737
738	/* write address >> 1 + 0x30000 to OCP_POR_CTR */
739	addr = (addr >> 1) + 0x30000;
740	ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
741	if (ret < 0)
742		goto out;
743
744	/* write value to OCP_POR_WDATA */
745	ret = wlcore_write32(wl, WL12XX_OCP_DATA_WRITE, val);
746	if (ret < 0)
747		goto out;
748
749	/* write 1 to OCP_CMD */
750	ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
751	if (ret < 0)
752		goto out;
753
754out:
755	return ret;
756}
757
758static int __must_check wl12xx_top_reg_read(struct wl1271 *wl, int addr,
759					    u16 *out)
760{
761	u32 val;
762	int timeout = OCP_CMD_LOOP;
763	int ret;
764
765	/* write address >> 1 + 0x30000 to OCP_POR_CTR */
766	addr = (addr >> 1) + 0x30000;
767	ret = wlcore_write32(wl, WL12XX_OCP_POR_CTR, addr);
768	if (ret < 0)
769		return ret;
770
771	/* write 2 to OCP_CMD */
772	ret = wlcore_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
773	if (ret < 0)
774		return ret;
775
776	/* poll for data ready */
777	do {
778		ret = wlcore_read32(wl, WL12XX_OCP_DATA_READ, &val);
779		if (ret < 0)
780			return ret;
781	} while (!(val & OCP_READY_MASK) && --timeout);
782
783	if (!timeout) {
784		wl1271_warning("Top register access timed out.");
785		return -ETIMEDOUT;
786	}
787
788	/* check data status and return if OK */
789	if ((val & OCP_STATUS_MASK) != OCP_STATUS_OK) {
790		wl1271_warning("Top register access returned error.");
791		return -EIO;
792	}
793
794	if (out)
795		*out = val & 0xffff;
796
797	return 0;
798}
799
800static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
801{
802	u16 spare_reg;
803	int ret;
804
805	/* Mask bits [2] & [8:4] in the sys_clk_cfg register */
806	ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
807	if (ret < 0)
808		return ret;
809
810	if (spare_reg == 0xFFFF)
811		return -EFAULT;
812	spare_reg |= (BIT(3) | BIT(5) | BIT(6));
813	ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
814	if (ret < 0)
815		return ret;
816
817	/* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
818	ret = wl12xx_top_reg_write(wl, SYS_CLK_CFG_REG,
819				   WL_CLK_REQ_TYPE_PG2 | MCS_PLL_CLK_SEL_FREF);
820	if (ret < 0)
821		return ret;
822
823	/* Delay execution for 15msec, to let the HW settle */
824	mdelay(15);
825
826	return 0;
827}
828
829static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
830{
831	u16 tcxo_detection;
832	int ret;
833
834	ret = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG, &tcxo_detection);
835	if (ret < 0)
836		return false;
837
838	if (tcxo_detection & TCXO_DET_FAILED)
839		return false;
840
841	return true;
842}
843
844static bool wl128x_is_fref_valid(struct wl1271 *wl)
845{
846	u16 fref_detection;
847	int ret;
848
849	ret = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG, &fref_detection);
850	if (ret < 0)
851		return false;
852
853	if (fref_detection & FREF_CLK_DETECT_FAIL)
854		return false;
855
856	return true;
857}
858
859static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
860{
861	int ret;
862
863	ret = wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
864	if (ret < 0)
865		goto out;
866
867	ret = wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
868	if (ret < 0)
869		goto out;
870
871	ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG,
872				   MCS_PLL_CONFIG_REG_VAL);
873
874out:
875	return ret;
876}
877
878static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
879{
880	u16 spare_reg;
881	u16 pll_config;
882	u8 input_freq;
883	struct wl12xx_priv *priv = wl->priv;
884	int ret;
885
886	/* Mask bits [3:1] in the sys_clk_cfg register */
887	ret = wl12xx_top_reg_read(wl, WL_SPARE_REG, &spare_reg);
888	if (ret < 0)
889		return ret;
890
891	if (spare_reg == 0xFFFF)
892		return -EFAULT;
893	spare_reg |= BIT(2);
894	ret = wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
895	if (ret < 0)
896		return ret;
897
898	/* Handle special cases of the TCXO clock */
899	if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_8 ||
900	    priv->tcxo_clock == WL12XX_TCXOCLOCK_33_6)
901		return wl128x_manually_configure_mcs_pll(wl);
902
903	/* Set the input frequency according to the selected clock source */
904	input_freq = (clk & 1) + 1;
905
906	ret = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG, &pll_config);
907	if (ret < 0)
908		return ret;
909
910	if (pll_config == 0xFFFF)
911		return -EFAULT;
912	pll_config |= (input_freq << MCS_SEL_IN_FREQ_SHIFT);
913	pll_config |= MCS_PLL_ENABLE_HP;
914	ret = wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, pll_config);
915
916	return ret;
917}
918
919/*
920 * WL128x has two clocks input - TCXO and FREF.
921 * TCXO is the main clock of the device, while FREF is used to sync
922 * between the GPS and the cellular modem.
923 * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
924 * as the WLAN/BT main clock.
925 */
926static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
927{
928	struct wl12xx_priv *priv = wl->priv;
929	u16 sys_clk_cfg;
930	int ret;
931
932	/* For XTAL-only modes, FREF will be used after switching from TCXO */
933	if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
934	    priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
935		if (!wl128x_switch_tcxo_to_fref(wl))
936			return -EINVAL;
937		goto fref_clk;
938	}
939
940	/* Query the HW, to determine which clock source we should use */
941	ret = wl12xx_top_reg_read(wl, SYS_CLK_CFG_REG, &sys_clk_cfg);
942	if (ret < 0)
943		return ret;
944
945	if (sys_clk_cfg == 0xFFFF)
946		return -EINVAL;
947	if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
948		goto fref_clk;
949
950	/* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
951	if (priv->tcxo_clock == WL12XX_TCXOCLOCK_16_368 ||
952	    priv->tcxo_clock == WL12XX_TCXOCLOCK_32_736) {
953		if (!wl128x_switch_tcxo_to_fref(wl))
954			return -EINVAL;
955		goto fref_clk;
956	}
957
958	/* TCXO clock is selected */
959	if (!wl128x_is_tcxo_valid(wl))
960		return -EINVAL;
961	*selected_clock = priv->tcxo_clock;
962	goto config_mcs_pll;
963
964fref_clk:
965	/* FREF clock is selected */
966	if (!wl128x_is_fref_valid(wl))
967		return -EINVAL;
968	*selected_clock = priv->ref_clock;
969
970config_mcs_pll:
971	return wl128x_configure_mcs_pll(wl, *selected_clock);
972}
973
974static int wl127x_boot_clk(struct wl1271 *wl)
975{
976	struct wl12xx_priv *priv = wl->priv;
977	u32 pause;
978	u32 clk;
979	int ret;
980
981	if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
982		wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
983
984	if (priv->ref_clock == CONF_REF_CLK_19_2_E ||
985	    priv->ref_clock == CONF_REF_CLK_38_4_E ||
986	    priv->ref_clock == CONF_REF_CLK_38_4_M_XTAL)
987		/* ref clk: 19.2/38.4/38.4-XTAL */
988		clk = 0x3;
989	else if (priv->ref_clock == CONF_REF_CLK_26_E ||
990		 priv->ref_clock == CONF_REF_CLK_26_M_XTAL ||
991		 priv->ref_clock == CONF_REF_CLK_52_E)
992		/* ref clk: 26/52 */
993		clk = 0x5;
994	else
995		return -EINVAL;
996
997	if (priv->ref_clock != CONF_REF_CLK_19_2_E) {
998		u16 val;
999		/* Set clock type (open drain) */
1000		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE, &val);
1001		if (ret < 0)
1002			goto out;
1003
1004		val &= FREF_CLK_TYPE_BITS;
1005		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
1006		if (ret < 0)
1007			goto out;
1008
1009		/* Set clock pull mode (no pull) */
1010		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL, &val);
1011		if (ret < 0)
1012			goto out;
1013
1014		val |= NO_PULL;
1015		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
1016		if (ret < 0)
1017			goto out;
1018	} else {
1019		u16 val;
1020		/* Set clock polarity */
1021		ret = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY, &val);
1022		if (ret < 0)
1023			goto out;
1024
1025		val &= FREF_CLK_POLARITY_BITS;
1026		val |= CLK_REQ_OUTN_SEL;
1027		ret = wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
1028		if (ret < 0)
1029			goto out;
1030	}
1031
1032	ret = wlcore_write32(wl, WL12XX_PLL_PARAMETERS, clk);
1033	if (ret < 0)
1034		goto out;
1035
1036	ret = wlcore_read32(wl, WL12XX_PLL_PARAMETERS, &pause);
1037	if (ret < 0)
1038		goto out;
1039
1040	wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
1041
1042	pause &= ~(WU_COUNTER_PAUSE_VAL);
1043	pause |= WU_COUNTER_PAUSE_VAL;
1044	ret = wlcore_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
1045
1046out:
1047	return ret;
1048}
1049
1050static int wl1271_boot_soft_reset(struct wl1271 *wl)
1051{
1052	unsigned long timeout;
1053	u32 boot_data;
1054	int ret = 0;
1055
1056	/* perform soft reset */
1057	ret = wlcore_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
1058	if (ret < 0)
1059		goto out;
1060
1061	/* SOFT_RESET is self clearing */
1062	timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
1063	while (1) {
1064		ret = wlcore_read32(wl, WL12XX_SLV_SOFT_RESET, &boot_data);
1065		if (ret < 0)
1066			goto out;
1067
1068		wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
1069		if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
1070			break;
1071
1072		if (time_after(jiffies, timeout)) {
1073			/* 1.2 check pWhalBus->uSelfClearTime if the
1074			 * timeout was reached */
1075			wl1271_error("soft reset timeout");
1076			return -1;
1077		}
1078
1079		udelay(SOFT_RESET_STALL_TIME);
1080	}
1081
1082	/* disable Rx/Tx */
1083	ret = wlcore_write32(wl, WL12XX_ENABLE, 0x0);
1084	if (ret < 0)
1085		goto out;
1086
1087	/* disable auto calibration on start*/
1088	ret = wlcore_write32(wl, WL12XX_SPARE_A2, 0xffff);
1089
1090out:
1091	return ret;
1092}
1093
1094static int wl12xx_pre_boot(struct wl1271 *wl)
1095{
1096	struct wl12xx_priv *priv = wl->priv;
1097	int ret = 0;
1098	u32 clk;
1099	int selected_clock = -1;
1100
1101	if (wl->chip.id == CHIP_ID_128X_PG20) {
1102		ret = wl128x_boot_clk(wl, &selected_clock);
1103		if (ret < 0)
1104			goto out;
1105	} else {
1106		ret = wl127x_boot_clk(wl);
1107		if (ret < 0)
1108			goto out;
1109	}
1110
1111	/* Continue the ELP wake up sequence */
1112	ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
1113	if (ret < 0)
1114		goto out;
1115
1116	udelay(500);
1117
1118	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1119	if (ret < 0)
1120		goto out;
1121
1122	/* Read-modify-write DRPW_SCRATCH_START register (see next state)
1123	   to be used by DRPw FW. The RTRIM value will be added by the FW
1124	   before taking DRPw out of reset */
1125
1126	ret = wlcore_read32(wl, WL12XX_DRPW_SCRATCH_START, &clk);
1127	if (ret < 0)
1128		goto out;
1129
1130	wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
1131
1132	if (wl->chip.id == CHIP_ID_128X_PG20)
1133		clk |= ((selected_clock & 0x3) << 1) << 4;
1134	else
1135		clk |= (priv->ref_clock << 1) << 4;
1136
1137	ret = wlcore_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
1138	if (ret < 0)
1139		goto out;
1140
1141	ret = wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
1142	if (ret < 0)
1143		goto out;
1144
1145	/* Disable interrupts */
1146	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
1147	if (ret < 0)
1148		goto out;
1149
1150	ret = wl1271_boot_soft_reset(wl);
1151	if (ret < 0)
1152		goto out;
1153
1154out:
1155	return ret;
1156}
1157
1158static int wl12xx_pre_upload(struct wl1271 *wl)
1159{
1160	u32 tmp;
1161	u16 polarity;
1162	int ret;
1163
1164	/* write firmware's last address (ie. it's length) to
1165	 * ACX_EEPROMLESS_IND_REG */
1166	wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
1167
1168	ret = wlcore_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
1169	if (ret < 0)
1170		goto out;
1171
1172	ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &tmp);
1173	if (ret < 0)
1174		goto out;
1175
1176	wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
1177
1178	/* 6. read the EEPROM parameters */
1179	ret = wlcore_read32(wl, WL12XX_SCR_PAD2, &tmp);
1180	if (ret < 0)
1181		goto out;
1182
1183	/* WL1271: The reference driver skips steps 7 to 10 (jumps directly
1184	 * to upload_fw) */
1185
1186	if (wl->chip.id == CHIP_ID_128X_PG20) {
1187		ret = wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
1188		if (ret < 0)
1189			goto out;
1190	}
1191
1192	/* polarity must be set before the firmware is loaded */
1193	ret = wl12xx_top_reg_read(wl, OCP_REG_POLARITY, &polarity);
1194	if (ret < 0)
1195		goto out;
1196
1197	/* We use HIGH polarity, so unset the LOW bit */
1198	polarity &= ~POLARITY_LOW;
1199	ret = wl12xx_top_reg_write(wl, OCP_REG_POLARITY, polarity);
1200
1201out:
1202	return ret;
1203}
1204
1205static int wl12xx_enable_interrupts(struct wl1271 *wl)
1206{
1207	int ret;
1208
1209	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1210			       WL12XX_ACX_ALL_EVENTS_VECTOR);
1211	if (ret < 0)
1212		goto out;
1213
1214	wlcore_enable_interrupts(wl);
1215	ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
1216			       WL1271_ACX_INTR_ALL & ~(WL12XX_INTR_MASK));
1217	if (ret < 0)
1218		goto disable_interrupts;
1219
1220	ret = wlcore_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
1221	if (ret < 0)
1222		goto disable_interrupts;
1223
1224	return ret;
1225
1226disable_interrupts:
1227	wlcore_disable_interrupts(wl);
1228
1229out:
1230	return ret;
1231}
1232
1233static int wl12xx_boot(struct wl1271 *wl)
1234{
1235	int ret;
1236
1237	ret = wl12xx_pre_boot(wl);
1238	if (ret < 0)
1239		goto out;
1240
1241	ret = wlcore_boot_upload_nvs(wl);
1242	if (ret < 0)
1243		goto out;
1244
1245	ret = wl12xx_pre_upload(wl);
1246	if (ret < 0)
1247		goto out;
1248
1249	ret = wlcore_boot_upload_firmware(wl);
1250	if (ret < 0)
1251		goto out;
1252
1253	wl->event_mask = BSS_LOSE_EVENT_ID |
1254		REGAINED_BSS_EVENT_ID |
1255		SCAN_COMPLETE_EVENT_ID |
1256		ROLE_STOP_COMPLETE_EVENT_ID |
1257		RSSI_SNR_TRIGGER_0_EVENT_ID |
1258		PSPOLL_DELIVERY_FAILURE_EVENT_ID |
1259		SOFT_GEMINI_SENSE_EVENT_ID |
1260		PERIODIC_SCAN_REPORT_EVENT_ID |
1261		PERIODIC_SCAN_COMPLETE_EVENT_ID |
1262		DUMMY_PACKET_EVENT_ID |
1263		PEER_REMOVE_COMPLETE_EVENT_ID |
1264		BA_SESSION_RX_CONSTRAINT_EVENT_ID |
1265		REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
1266		INACTIVE_STA_EVENT_ID |
1267		CHANNEL_SWITCH_COMPLETE_EVENT_ID;
1268
1269	wl->ap_event_mask = MAX_TX_RETRY_EVENT_ID;
1270
1271	ret = wlcore_boot_run_firmware(wl);
1272	if (ret < 0)
1273		goto out;
1274
1275	ret = wl12xx_enable_interrupts(wl);
1276
1277out:
1278	return ret;
1279}
1280
1281static int wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
1282			       void *buf, size_t len)
1283{
1284	int ret;
1285
1286	ret = wlcore_write(wl, cmd_box_addr, buf, len, false);
1287	if (ret < 0)
1288		return ret;
1289
1290	ret = wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
1291
1292	return ret;
1293}
1294
1295static int wl12xx_ack_event(struct wl1271 *wl)
1296{
1297	return wlcore_write_reg(wl, REG_INTERRUPT_TRIG,
1298				WL12XX_INTR_TRIG_EVENT_ACK);
1299}
1300
1301static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
1302{
1303	u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
1304	u32 align_len = wlcore_calc_packet_alignment(wl, len);
1305
1306	return (align_len + blk_size - 1) / blk_size + spare_blks;
1307}
1308
1309static void
1310wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1311			  u32 blks, u32 spare_blks)
1312{
1313	if (wl->chip.id == CHIP_ID_128X_PG20) {
1314		desc->wl128x_mem.total_mem_blocks = blks;
1315	} else {
1316		desc->wl127x_mem.extra_blocks = spare_blks;
1317		desc->wl127x_mem.total_mem_blocks = blks;
1318	}
1319}
1320
1321static void
1322wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
1323			    struct sk_buff *skb)
1324{
1325	u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
1326
1327	if (wl->chip.id == CHIP_ID_128X_PG20) {
1328		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
1329		desc->length = cpu_to_le16(aligned_len >> 2);
1330
1331		wl1271_debug(DEBUG_TX,
1332			     "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
1333			     desc->hlid,
1334			     le16_to_cpu(desc->length),
1335			     le16_to_cpu(desc->life_time),
1336			     desc->wl128x_mem.total_mem_blocks,
1337			     desc->wl128x_mem.extra_bytes);
1338	} else {
1339		/* calculate number of padding bytes */
1340		int pad = aligned_len - skb->len;
1341		desc->tx_attr |=
1342			cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
1343
1344		/* Store the aligned length in terms of words */
1345		desc->length = cpu_to_le16(aligned_len >> 2);
1346
1347		wl1271_debug(DEBUG_TX,
1348			     "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
1349			     pad, desc->hlid,
1350			     le16_to_cpu(desc->length),
1351			     le16_to_cpu(desc->life_time),
1352			     desc->wl127x_mem.total_mem_blocks);
1353	}
1354}
1355
1356static enum wl_rx_buf_align
1357wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
1358{
1359	if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
1360		return WLCORE_RX_BUF_UNALIGNED;
1361
1362	return WLCORE_RX_BUF_ALIGNED;
1363}
1364
1365static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
1366				    u32 data_len)
1367{
1368	struct wl1271_rx_descriptor *desc = rx_data;
1369
1370	/* invalid packet */
1371	if (data_len < sizeof(*desc) ||
1372	    data_len < sizeof(*desc) + desc->pad_len)
1373		return 0;
1374
1375	return data_len - sizeof(*desc) - desc->pad_len;
1376}
1377
1378static int wl12xx_tx_delayed_compl(struct wl1271 *wl)
1379{
1380	if (wl->fw_status->tx_results_counter ==
1381	    (wl->tx_results_count & 0xff))
1382		return 0;
1383
1384	return wlcore_tx_complete(wl);
1385}
1386
1387static int wl12xx_hw_init(struct wl1271 *wl)
1388{
1389	int ret;
1390
1391	if (wl->chip.id == CHIP_ID_128X_PG20) {
1392		u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
1393
1394		ret = wl128x_cmd_general_parms(wl);
1395		if (ret < 0)
1396			goto out;
1397
1398		/*
1399		 * If we are in calibrator based auto detect then we got the FEM nr
1400		 * in wl->fem_manuf. No need to continue further
1401		 */
1402		if (wl->plt_mode == PLT_FEM_DETECT)
1403			goto out;
1404
1405		ret = wl128x_cmd_radio_parms(wl);
1406		if (ret < 0)
1407			goto out;
1408
1409		if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
1410			/* Enable SDIO padding */
1411			host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
1412
1413		/* Must be before wl1271_acx_init_mem_config() */
1414		ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
1415		if (ret < 0)
1416			goto out;
1417	} else {
1418		ret = wl1271_cmd_general_parms(wl);
1419		if (ret < 0)
1420			goto out;
1421
1422		/*
1423		 * If we are in calibrator based auto detect then we got the FEM nr
1424		 * in wl->fem_manuf. No need to continue further
1425		 */
1426		if (wl->plt_mode == PLT_FEM_DETECT)
1427			goto out;
1428
1429		ret = wl1271_cmd_radio_parms(wl);
1430		if (ret < 0)
1431			goto out;
1432		ret = wl1271_cmd_ext_radio_parms(wl);
1433		if (ret < 0)
1434			goto out;
1435	}
1436out:
1437	return ret;
1438}
1439
1440static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
1441				     struct wl_fw_status *fw_status)
1442{
1443	struct wl12xx_fw_status *int_fw_status = raw_fw_status;
1444
1445	fw_status->intr = le32_to_cpu(int_fw_status->intr);
1446	fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
1447	fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
1448	fw_status->tx_results_counter = int_fw_status->tx_results_counter;
1449	fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
1450
1451	fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
1452	fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
1453	fw_status->link_fast_bitmap =
1454			le32_to_cpu(int_fw_status->link_fast_bitmap);
1455	fw_status->total_released_blks =
1456			le32_to_cpu(int_fw_status->total_released_blks);
1457	fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
1458
1459	fw_status->counters.tx_released_pkts =
1460			int_fw_status->counters.tx_released_pkts;
1461	fw_status->counters.tx_lnk_free_pkts =
1462			int_fw_status->counters.tx_lnk_free_pkts;
1463	fw_status->counters.tx_voice_released_blks =
1464			int_fw_status->counters.tx_voice_released_blks;
1465	fw_status->counters.tx_last_rate =
1466			int_fw_status->counters.tx_last_rate;
1467
1468	fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
1469}
1470
1471static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1472				       struct wl12xx_vif *wlvif)
1473{
1474	return wlvif->rate_set;
1475}
1476
1477static void wl12xx_conf_init(struct wl1271 *wl)
1478{
1479	struct wl12xx_priv *priv = wl->priv;
1480
1481	/* apply driver default configuration */
1482	memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
1483
1484	/* apply default private configuration */
1485	memcpy(&priv->conf, &wl12xx_default_priv_conf, sizeof(priv->conf));
1486}
1487
1488static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
1489{
1490	bool supported = false;
1491	u8 major, minor;
1492
1493	if (wl->chip.id == CHIP_ID_128X_PG20) {
1494		major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
1495		minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
1496
1497		/* in wl128x we have the MAC address if the PG is >= (2, 1) */
1498		if (major > 2 || (major == 2 && minor >= 1))
1499			supported = true;
1500	} else {
1501		major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
1502		minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
1503
1504		/* in wl127x we have the MAC address if the PG is >= (3, 1) */
1505		if (major == 3 && minor >= 1)
1506			supported = true;
1507	}
1508
1509	wl1271_debug(DEBUG_PROBE,
1510		     "PG Ver major = %d minor = %d, MAC %s present",
1511		     major, minor, supported ? "is" : "is not");
1512
1513	return supported;
1514}
1515
1516static int wl12xx_get_fuse_mac(struct wl1271 *wl)
1517{
1518	u32 mac1, mac2;
1519	int ret;
1520
1521	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
1522	if (ret < 0)
1523		goto out;
1524
1525	ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1, &mac1);
1526	if (ret < 0)
1527		goto out;
1528
1529	ret = wlcore_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2, &mac2);
1530	if (ret < 0)
1531		goto out;
1532
1533	/* these are the two parts of the BD_ADDR */
1534	wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
1535		((mac1 & 0xff000000) >> 24);
1536	wl->fuse_nic_addr = mac1 & 0xffffff;
1537
1538	ret = wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1539
1540out:
1541	return ret;
1542}
1543
1544static int wl12xx_get_pg_ver(struct wl1271 *wl, s8 *ver)
1545{
1546	u16 die_info;
1547	int ret;
1548
1549	if (wl->chip.id == CHIP_ID_128X_PG20)
1550		ret = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1,
1551					  &die_info);
1552	else
1553		ret = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1,
1554					  &die_info);
1555
1556	if (ret >= 0 && ver)
1557		*ver = (s8)((die_info & PG_VER_MASK) >> PG_VER_OFFSET);
1558
1559	return ret;
1560}
1561
1562static int wl12xx_get_mac(struct wl1271 *wl)
1563{
1564	if (wl12xx_mac_in_fuse(wl))
1565		return wl12xx_get_fuse_mac(wl);
1566
1567	return 0;
1568}
1569
1570static void wl12xx_set_tx_desc_csum(struct wl1271 *wl,
1571				    struct wl1271_tx_hw_descr *desc,
1572				    struct sk_buff *skb)
1573{
1574	desc->wl12xx_reserved = 0;
1575}
1576
1577static int wl12xx_plt_init(struct wl1271 *wl)
1578{
1579	int ret;
1580
1581	ret = wl->ops->boot(wl);
1582	if (ret < 0)
1583		goto out;
1584
1585	ret = wl->ops->hw_init(wl);
1586	if (ret < 0)
1587		goto out_irq_disable;
1588
1589	/*
1590	 * If we are in calibrator based auto detect then we got the FEM nr
1591	 * in wl->fem_manuf. No need to continue further
1592	 */
1593	if (wl->plt_mode == PLT_FEM_DETECT)
1594		goto out;
1595
1596	ret = wl1271_acx_init_mem_config(wl);
1597	if (ret < 0)
1598		goto out_irq_disable;
1599
1600	ret = wl12xx_acx_mem_cfg(wl);
1601	if (ret < 0)
1602		goto out_free_memmap;
1603
1604	/* Enable data path */
1605	ret = wl1271_cmd_data_path(wl, 1);
1606	if (ret < 0)
1607		goto out_free_memmap;
1608
1609	/* Configure for CAM power saving (ie. always active) */
1610	ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
1611	if (ret < 0)
1612		goto out_free_memmap;
1613
1614	/* configure PM */
1615	ret = wl1271_acx_pm_config(wl);
1616	if (ret < 0)
1617		goto out_free_memmap;
1618
1619	goto out;
1620
1621out_free_memmap:
1622	kfree(wl->target_mem_map);
1623	wl->target_mem_map = NULL;
1624
1625out_irq_disable:
1626	mutex_unlock(&wl->mutex);
1627	/* Unlocking the mutex in the middle of handling is
1628	   inherently unsafe. In this case we deem it safe to do,
1629	   because we need to let any possibly pending IRQ out of
1630	   the system (and while we are WL1271_STATE_OFF the IRQ
1631	   work function will not do anything.) Also, any other
1632	   possible concurrent operations will fail due to the
1633	   current state, hence the wl1271 struct should be safe. */
1634	wlcore_disable_interrupts(wl);
1635	mutex_lock(&wl->mutex);
1636out:
1637	return ret;
1638}
1639
1640static int wl12xx_get_spare_blocks(struct wl1271 *wl, bool is_gem)
1641{
1642	if (is_gem)
1643		return WL12XX_TX_HW_BLOCK_GEM_SPARE;
1644
1645	return WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
1646}
1647
1648static int wl12xx_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
1649			  struct ieee80211_vif *vif,
1650			  struct ieee80211_sta *sta,
1651			  struct ieee80211_key_conf *key_conf)
1652{
1653	return wlcore_set_key(wl, cmd, vif, sta, key_conf);
1654}
1655
1656static int wl12xx_set_peer_cap(struct wl1271 *wl,
1657			       struct ieee80211_sta_ht_cap *ht_cap,
1658			       bool allow_ht_operation,
1659			       u32 rate_set, u8 hlid)
1660{
1661	return wl1271_acx_set_ht_capabilities(wl, ht_cap, allow_ht_operation,
1662					      hlid);
1663}
1664
1665static bool wl12xx_lnk_high_prio(struct wl1271 *wl, u8 hlid,
1666				 struct wl1271_link *lnk)
1667{
1668	u8 thold;
1669
1670	if (test_bit(hlid, &wl->fw_fast_lnk_map))
1671		thold = wl->conf.tx.fast_link_thold;
1672	else
1673		thold = wl->conf.tx.slow_link_thold;
1674
1675	return lnk->allocated_pkts < thold;
1676}
1677
1678static bool wl12xx_lnk_low_prio(struct wl1271 *wl, u8 hlid,
1679				struct wl1271_link *lnk)
1680{
1681	/* any link is good for low priority */
1682	return true;
1683}
1684
1685static u32 wl12xx_convert_hwaddr(struct wl1271 *wl, u32 hwaddr)
1686{
1687	return hwaddr << 5;
1688}
1689
1690static int wl12xx_setup(struct wl1271 *wl);
1691
1692static struct wlcore_ops wl12xx_ops = {
1693	.setup			= wl12xx_setup,
1694	.identify_chip		= wl12xx_identify_chip,
1695	.boot			= wl12xx_boot,
1696	.plt_init		= wl12xx_plt_init,
1697	.trigger_cmd		= wl12xx_trigger_cmd,
1698	.ack_event		= wl12xx_ack_event,
1699	.wait_for_event		= wl12xx_wait_for_event,
1700	.process_mailbox_events	= wl12xx_process_mailbox_events,
1701	.calc_tx_blocks		= wl12xx_calc_tx_blocks,
1702	.set_tx_desc_blocks	= wl12xx_set_tx_desc_blocks,
1703	.set_tx_desc_data_len	= wl12xx_set_tx_desc_data_len,
1704	.get_rx_buf_align	= wl12xx_get_rx_buf_align,
1705	.get_rx_packet_len	= wl12xx_get_rx_packet_len,
1706	.tx_immediate_compl	= NULL,
1707	.tx_delayed_compl	= wl12xx_tx_delayed_compl,
1708	.hw_init		= wl12xx_hw_init,
1709	.init_vif		= NULL,
1710	.convert_fw_status	= wl12xx_convert_fw_status,
1711	.sta_get_ap_rate_mask	= wl12xx_sta_get_ap_rate_mask,
1712	.get_pg_ver		= wl12xx_get_pg_ver,
1713	.get_mac		= wl12xx_get_mac,
1714	.set_tx_desc_csum	= wl12xx_set_tx_desc_csum,
1715	.set_rx_csum		= NULL,
1716	.ap_get_mimo_wide_rate_mask = NULL,
1717	.debugfs_init		= wl12xx_debugfs_add_files,
1718	.scan_start		= wl12xx_scan_start,
1719	.scan_stop		= wl12xx_scan_stop,
1720	.sched_scan_start	= wl12xx_sched_scan_start,
1721	.sched_scan_stop	= wl12xx_scan_sched_scan_stop,
1722	.get_spare_blocks	= wl12xx_get_spare_blocks,
1723	.set_key		= wl12xx_set_key,
1724	.channel_switch		= wl12xx_cmd_channel_switch,
1725	.pre_pkt_send		= NULL,
1726	.set_peer_cap		= wl12xx_set_peer_cap,
1727	.convert_hwaddr		= wl12xx_convert_hwaddr,
1728	.lnk_high_prio		= wl12xx_lnk_high_prio,
1729	.lnk_low_prio		= wl12xx_lnk_low_prio,
1730	.interrupt_notify	= NULL,
1731	.rx_ba_filter		= NULL,
1732	.ap_sleep		= NULL,
1733};
1734
1735static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
1736	.cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 |
1737	       (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT),
1738	.ht_supported = true,
1739	.ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K,
1740	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8,
1741	.mcs = {
1742		.rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1743		.rx_highest = cpu_to_le16(72),
1744		.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1745		},
1746};
1747
1748static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
1749	{
1750		.max = 3,
1751		.types = BIT(NL80211_IFTYPE_STATION),
1752	},
1753	{
1754		.max = 1,
1755		.types = BIT(NL80211_IFTYPE_AP) |
1756			 BIT(NL80211_IFTYPE_P2P_GO) |
1757			 BIT(NL80211_IFTYPE_P2P_CLIENT),
1758	},
1759};
1760
1761static const struct ieee80211_iface_combination
1762wl12xx_iface_combinations[] = {
1763	{
1764		.max_interfaces = 3,
1765		.limits = wl12xx_iface_limits,
1766		.n_limits = ARRAY_SIZE(wl12xx_iface_limits),
1767		.num_different_channels = 1,
1768	},
1769};
1770
1771static const struct wl12xx_clock wl12xx_refclock_table[] = {
1772	{ 19200000,	false,	WL12XX_REFCLOCK_19	},
1773	{ 26000000,	false,	WL12XX_REFCLOCK_26	},
1774	{ 26000000,	true,	WL12XX_REFCLOCK_26_XTAL	},
1775	{ 38400000,	false,	WL12XX_REFCLOCK_38	},
1776	{ 38400000,	true,	WL12XX_REFCLOCK_38_XTAL	},
1777	{ 52000000,	false,	WL12XX_REFCLOCK_52	},
1778	{ 0,		false,	0 }
1779};
1780
1781static const struct wl12xx_clock wl12xx_tcxoclock_table[] = {
1782	{ 16368000,	true,	WL12XX_TCXOCLOCK_16_368	},
1783	{ 16800000,	true,	WL12XX_TCXOCLOCK_16_8	},
1784	{ 19200000,	true,	WL12XX_TCXOCLOCK_19_2	},
1785	{ 26000000,	true,	WL12XX_TCXOCLOCK_26	},
1786	{ 32736000,	true,	WL12XX_TCXOCLOCK_32_736	},
1787	{ 33600000,	true,	WL12XX_TCXOCLOCK_33_6	},
1788	{ 38400000,	true,	WL12XX_TCXOCLOCK_38_4	},
1789	{ 52000000,	true,	WL12XX_TCXOCLOCK_52	},
1790	{ 0,		false,	0 }
1791};
1792
1793static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
1794				u32 freq, bool xtal)
1795{
1796	int i;
1797
1798	for (i = 0; table[i].freq != 0; i++)
1799		if ((table[i].freq == freq) && (table[i].xtal == xtal))
1800			return table[i].hw_idx;
1801
1802	return -EINVAL;
1803}
1804
1805static int wl12xx_setup(struct wl1271 *wl)
1806{
1807	struct wl12xx_priv *priv = wl->priv;
1808	struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
1809
1810	BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
1811	BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS > WL12XX_MAX_LINKS);
1812
1813	wl->rtable = wl12xx_rtable;
1814	wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
1815	wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
1816	wl->num_links = WL12XX_MAX_LINKS;
1817	wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
1818	wl->iface_combinations = wl12xx_iface_combinations;
1819	wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations);
1820	wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
1821	wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
1822	wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
1823	wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
1824	wl->fw_status_len = sizeof(struct wl12xx_fw_status);
1825	wl->fw_status_priv_len = 0;
1826	wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
1827	wl->ofdm_only_ap = true;
1828	wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap);
1829	wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap);
1830	wl12xx_conf_init(wl);
1831
1832	if (!fref_param) {
1833		priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
1834						pdev_data->ref_clock_freq,
1835						pdev_data->ref_clock_xtal);
1836		if (priv->ref_clock < 0) {
1837			wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
1838				     pdev_data->ref_clock_freq,
1839				     pdev_data->ref_clock_xtal ?
1840				     "XTAL" : "not XTAL");
1841
1842			return priv->ref_clock;
1843		}
1844	} else {
1845		if (!strcmp(fref_param, "19.2"))
1846			priv->ref_clock = WL12XX_REFCLOCK_19;
1847		else if (!strcmp(fref_param, "26"))
1848			priv->ref_clock = WL12XX_REFCLOCK_26;
1849		else if (!strcmp(fref_param, "26x"))
1850			priv->ref_clock = WL12XX_REFCLOCK_26_XTAL;
1851		else if (!strcmp(fref_param, "38.4"))
1852			priv->ref_clock = WL12XX_REFCLOCK_38;
1853		else if (!strcmp(fref_param, "38.4x"))
1854			priv->ref_clock = WL12XX_REFCLOCK_38_XTAL;
1855		else if (!strcmp(fref_param, "52"))
1856			priv->ref_clock = WL12XX_REFCLOCK_52;
1857		else
1858			wl1271_error("Invalid fref parameter %s", fref_param);
1859	}
1860
1861	if (!tcxo_param && pdev_data->tcxo_clock_freq) {
1862		priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
1863						pdev_data->tcxo_clock_freq,
1864						true);
1865		if (priv->tcxo_clock < 0) {
1866			wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
1867				     pdev_data->tcxo_clock_freq);
1868
1869			return priv->tcxo_clock;
1870		}
1871	} else if (tcxo_param) {
1872		if (!strcmp(tcxo_param, "19.2"))
1873			priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
1874		else if (!strcmp(tcxo_param, "26"))
1875			priv->tcxo_clock = WL12XX_TCXOCLOCK_26;
1876		else if (!strcmp(tcxo_param, "38.4"))
1877			priv->tcxo_clock = WL12XX_TCXOCLOCK_38_4;
1878		else if (!strcmp(tcxo_param, "52"))
1879			priv->tcxo_clock = WL12XX_TCXOCLOCK_52;
1880		else if (!strcmp(tcxo_param, "16.368"))
1881			priv->tcxo_clock = WL12XX_TCXOCLOCK_16_368;
1882		else if (!strcmp(tcxo_param, "32.736"))
1883			priv->tcxo_clock = WL12XX_TCXOCLOCK_32_736;
1884		else if (!strcmp(tcxo_param, "16.8"))
1885			priv->tcxo_clock = WL12XX_TCXOCLOCK_16_8;
1886		else if (!strcmp(tcxo_param, "33.6"))
1887			priv->tcxo_clock = WL12XX_TCXOCLOCK_33_6;
1888		else
1889			wl1271_error("Invalid tcxo parameter %s", tcxo_param);
1890	}
1891
1892	priv->rx_mem_addr = kmalloc(sizeof(*priv->rx_mem_addr), GFP_KERNEL);
1893	if (!priv->rx_mem_addr)
1894		return -ENOMEM;
1895
1896	return 0;
1897}
1898
1899static int wl12xx_probe(struct platform_device *pdev)
1900{
1901	struct wl1271 *wl;
1902	struct ieee80211_hw *hw;
1903	int ret;
1904
1905	hw = wlcore_alloc_hw(sizeof(struct wl12xx_priv),
1906			     WL12XX_AGGR_BUFFER_SIZE,
1907			     sizeof(struct wl12xx_event_mailbox));
1908	if (IS_ERR(hw)) {
1909		wl1271_error("can't allocate hw");
1910		ret = PTR_ERR(hw);
1911		goto out;
1912	}
1913
1914	wl = hw->priv;
1915	wl->ops = &wl12xx_ops;
1916	wl->ptable = wl12xx_ptable;
1917	ret = wlcore_probe(wl, pdev);
1918	if (ret)
1919		goto out_free;
1920
1921	return ret;
1922
1923out_free:
1924	wlcore_free_hw(wl);
1925out:
1926	return ret;
1927}
1928
1929static int wl12xx_remove(struct platform_device *pdev)
1930{
1931	struct wl1271 *wl = platform_get_drvdata(pdev);
1932	struct wl12xx_priv *priv;
1933
1934	if (!wl)
1935		goto out;
1936	priv = wl->priv;
1937
1938	kfree(priv->rx_mem_addr);
1939
1940out:
1941	return wlcore_remove(pdev);
1942}
1943
1944static const struct platform_device_id wl12xx_id_table[] = {
1945	{ "wl12xx", 0 },
1946	{  } /* Terminating Entry */
1947};
1948MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
1949
1950static struct platform_driver wl12xx_driver = {
1951	.probe		= wl12xx_probe,
1952	.remove		= wl12xx_remove,
1953	.id_table	= wl12xx_id_table,
1954	.driver = {
1955		.name	= "wl12xx_driver",
1956	}
1957};
1958
1959module_platform_driver(wl12xx_driver);
1960
1961module_param_named(fref, fref_param, charp, 0);
1962MODULE_PARM_DESC(fref, "FREF clock: 19.2, 26, 26x, 38.4, 38.4x, 52");
1963
1964module_param_named(tcxo, tcxo_param, charp, 0);
1965MODULE_PARM_DESC(tcxo,
1966		 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
1967
1968MODULE_LICENSE("GPL v2");
1969MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
1970MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
1971MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
1972MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
1973MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
1974MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
1975MODULE_FIRMWARE(WL128X_PLT_FW_NAME);
1976