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