Merge remote-tracking branch 'asoc/fix/ux500' into asoc-linus
[cascardo/linux.git] / drivers / net / wireless / ti / wl18xx / main.c
1 /*
2  * This file is part of wl18xx
3  *
4  * Copyright (C) 2011 Texas Instruments
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 #include <linux/ip.h>
25 #include <linux/firmware.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 "reg.h"
36 #include "conf.h"
37 #include "cmd.h"
38 #include "acx.h"
39 #include "tx.h"
40 #include "wl18xx.h"
41 #include "io.h"
42 #include "scan.h"
43 #include "event.h"
44 #include "debugfs.h"
45
46 #define WL18XX_RX_CHECKSUM_MASK      0x40
47
48 static char *ht_mode_param = NULL;
49 static char *board_type_param = NULL;
50 static bool checksum_param = false;
51 static int num_rx_desc_param = -1;
52
53 /* phy paramters */
54 static int dc2dc_param = -1;
55 static int n_antennas_2_param = -1;
56 static int n_antennas_5_param = -1;
57 static int low_band_component_param = -1;
58 static int low_band_component_type_param = -1;
59 static int high_band_component_param = -1;
60 static int high_band_component_type_param = -1;
61 static int pwr_limit_reference_11_abg_param = -1;
62
63 static const u8 wl18xx_rate_to_idx_2ghz[] = {
64         /* MCS rates are used only with 11n */
65         15,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS15 */
66         14,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS14 */
67         13,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS13 */
68         12,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS12 */
69         11,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS11 */
70         10,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS10 */
71         9,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS9 */
72         8,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS8 */
73         7,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS7 */
74         6,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS6 */
75         5,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS5 */
76         4,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS4 */
77         3,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS3 */
78         2,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS2 */
79         1,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS1 */
80         0,                             /* WL18XX_CONF_HW_RXTX_RATE_MCS0 */
81
82         11,                            /* WL18XX_CONF_HW_RXTX_RATE_54   */
83         10,                            /* WL18XX_CONF_HW_RXTX_RATE_48   */
84         9,                             /* WL18XX_CONF_HW_RXTX_RATE_36   */
85         8,                             /* WL18XX_CONF_HW_RXTX_RATE_24   */
86
87         /* TI-specific rate */
88         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_22   */
89
90         7,                             /* WL18XX_CONF_HW_RXTX_RATE_18   */
91         6,                             /* WL18XX_CONF_HW_RXTX_RATE_12   */
92         3,                             /* WL18XX_CONF_HW_RXTX_RATE_11   */
93         5,                             /* WL18XX_CONF_HW_RXTX_RATE_9    */
94         4,                             /* WL18XX_CONF_HW_RXTX_RATE_6    */
95         2,                             /* WL18XX_CONF_HW_RXTX_RATE_5_5  */
96         1,                             /* WL18XX_CONF_HW_RXTX_RATE_2    */
97         0                              /* WL18XX_CONF_HW_RXTX_RATE_1    */
98 };
99
100 static const u8 wl18xx_rate_to_idx_5ghz[] = {
101         /* MCS rates are used only with 11n */
102         15,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS15 */
103         14,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS14 */
104         13,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS13 */
105         12,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS12 */
106         11,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS11 */
107         10,                           /* WL18XX_CONF_HW_RXTX_RATE_MCS10 */
108         9,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS9 */
109         8,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS8 */
110         7,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS7 */
111         6,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS6 */
112         5,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS5 */
113         4,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS4 */
114         3,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS3 */
115         2,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS2 */
116         1,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS1 */
117         0,                            /* WL18XX_CONF_HW_RXTX_RATE_MCS0 */
118
119         7,                             /* WL18XX_CONF_HW_RXTX_RATE_54   */
120         6,                             /* WL18XX_CONF_HW_RXTX_RATE_48   */
121         5,                             /* WL18XX_CONF_HW_RXTX_RATE_36   */
122         4,                             /* WL18XX_CONF_HW_RXTX_RATE_24   */
123
124         /* TI-specific rate */
125         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_22   */
126
127         3,                             /* WL18XX_CONF_HW_RXTX_RATE_18   */
128         2,                             /* WL18XX_CONF_HW_RXTX_RATE_12   */
129         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_11   */
130         1,                             /* WL18XX_CONF_HW_RXTX_RATE_9    */
131         0,                             /* WL18XX_CONF_HW_RXTX_RATE_6    */
132         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_5_5  */
133         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_2    */
134         CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL18XX_CONF_HW_RXTX_RATE_1    */
135 };
136
137 static const u8 *wl18xx_band_rate_to_idx[] = {
138         [IEEE80211_BAND_2GHZ] = wl18xx_rate_to_idx_2ghz,
139         [IEEE80211_BAND_5GHZ] = wl18xx_rate_to_idx_5ghz
140 };
141
142 enum wl18xx_hw_rates {
143         WL18XX_CONF_HW_RXTX_RATE_MCS15 = 0,
144         WL18XX_CONF_HW_RXTX_RATE_MCS14,
145         WL18XX_CONF_HW_RXTX_RATE_MCS13,
146         WL18XX_CONF_HW_RXTX_RATE_MCS12,
147         WL18XX_CONF_HW_RXTX_RATE_MCS11,
148         WL18XX_CONF_HW_RXTX_RATE_MCS10,
149         WL18XX_CONF_HW_RXTX_RATE_MCS9,
150         WL18XX_CONF_HW_RXTX_RATE_MCS8,
151         WL18XX_CONF_HW_RXTX_RATE_MCS7,
152         WL18XX_CONF_HW_RXTX_RATE_MCS6,
153         WL18XX_CONF_HW_RXTX_RATE_MCS5,
154         WL18XX_CONF_HW_RXTX_RATE_MCS4,
155         WL18XX_CONF_HW_RXTX_RATE_MCS3,
156         WL18XX_CONF_HW_RXTX_RATE_MCS2,
157         WL18XX_CONF_HW_RXTX_RATE_MCS1,
158         WL18XX_CONF_HW_RXTX_RATE_MCS0,
159         WL18XX_CONF_HW_RXTX_RATE_54,
160         WL18XX_CONF_HW_RXTX_RATE_48,
161         WL18XX_CONF_HW_RXTX_RATE_36,
162         WL18XX_CONF_HW_RXTX_RATE_24,
163         WL18XX_CONF_HW_RXTX_RATE_22,
164         WL18XX_CONF_HW_RXTX_RATE_18,
165         WL18XX_CONF_HW_RXTX_RATE_12,
166         WL18XX_CONF_HW_RXTX_RATE_11,
167         WL18XX_CONF_HW_RXTX_RATE_9,
168         WL18XX_CONF_HW_RXTX_RATE_6,
169         WL18XX_CONF_HW_RXTX_RATE_5_5,
170         WL18XX_CONF_HW_RXTX_RATE_2,
171         WL18XX_CONF_HW_RXTX_RATE_1,
172         WL18XX_CONF_HW_RXTX_RATE_MAX,
173 };
174
175 static struct wlcore_conf wl18xx_conf = {
176         .sg = {
177                 .params = {
178                         [CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
179                         [CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
180                         [CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
181                         [CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
182                         [CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
183                         [CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
184                         [CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
185                         [CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
186                         [CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
187                         [CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
188                         [CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
189                         [CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
190                         [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
191                         [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
192                         [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
193                         [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
194                         [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
195                         [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
196                         [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
197                         [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
198                         [CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
199                         [CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
200                         [CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
201                         [CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
202                         [CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
203                         [CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
204                         /* active scan params */
205                         [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
206                         [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
207                         [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
208                         /* passive scan params */
209                         [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
210                         [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
211                         [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
212                         /* passive scan in dual antenna params */
213                         [CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
214                         [CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
215                         [CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
216                         /* general params */
217                         [CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
218                         [CONF_SG_ANTENNA_CONFIGURATION] = 0,
219                         [CONF_SG_BEACON_MISS_PERCENT] = 60,
220                         [CONF_SG_DHCP_TIME] = 5000,
221                         [CONF_SG_RXT] = 1200,
222                         [CONF_SG_TXT] = 1000,
223                         [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
224                         [CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
225                         [CONF_SG_HV3_MAX_SERVED] = 6,
226                         [CONF_SG_PS_POLL_TIMEOUT] = 10,
227                         [CONF_SG_UPSD_TIMEOUT] = 10,
228                         [CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
229                         [CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
230                         [CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
231                         /* AP params */
232                         [CONF_AP_BEACON_MISS_TX] = 3,
233                         [CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
234                         [CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
235                         [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
236                         [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
237                         [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
238                         /* CTS Diluting params */
239                         [CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
240                         [CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
241                 },
242                 .state = CONF_SG_PROTECTIVE,
243         },
244         .rx = {
245                 .rx_msdu_life_time           = 512000,
246                 .packet_detection_threshold  = 0,
247                 .ps_poll_timeout             = 15,
248                 .upsd_timeout                = 15,
249                 .rts_threshold               = IEEE80211_MAX_RTS_THRESHOLD,
250                 .rx_cca_threshold            = 0,
251                 .irq_blk_threshold           = 0xFFFF,
252                 .irq_pkt_threshold           = 0,
253                 .irq_timeout                 = 600,
254                 .queue_type                  = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
255         },
256         .tx = {
257                 .tx_energy_detection         = 0,
258                 .sta_rc_conf                 = {
259                         .enabled_rates       = 0,
260                         .short_retry_limit   = 10,
261                         .long_retry_limit    = 10,
262                         .aflags              = 0,
263                 },
264                 .ac_conf_count               = 4,
265                 .ac_conf                     = {
266                         [CONF_TX_AC_BE] = {
267                                 .ac          = CONF_TX_AC_BE,
268                                 .cw_min      = 15,
269                                 .cw_max      = 63,
270                                 .aifsn       = 3,
271                                 .tx_op_limit = 0,
272                         },
273                         [CONF_TX_AC_BK] = {
274                                 .ac          = CONF_TX_AC_BK,
275                                 .cw_min      = 15,
276                                 .cw_max      = 63,
277                                 .aifsn       = 7,
278                                 .tx_op_limit = 0,
279                         },
280                         [CONF_TX_AC_VI] = {
281                                 .ac          = CONF_TX_AC_VI,
282                                 .cw_min      = 15,
283                                 .cw_max      = 63,
284                                 .aifsn       = CONF_TX_AIFS_PIFS,
285                                 .tx_op_limit = 3008,
286                         },
287                         [CONF_TX_AC_VO] = {
288                                 .ac          = CONF_TX_AC_VO,
289                                 .cw_min      = 15,
290                                 .cw_max      = 63,
291                                 .aifsn       = CONF_TX_AIFS_PIFS,
292                                 .tx_op_limit = 1504,
293                         },
294                 },
295                 .max_tx_retries = 100,
296                 .ap_aging_period = 300,
297                 .tid_conf_count = 4,
298                 .tid_conf = {
299                         [CONF_TX_AC_BE] = {
300                                 .queue_id    = CONF_TX_AC_BE,
301                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
302                                 .tsid        = CONF_TX_AC_BE,
303                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
304                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
305                                 .apsd_conf   = {0, 0},
306                         },
307                         [CONF_TX_AC_BK] = {
308                                 .queue_id    = CONF_TX_AC_BK,
309                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
310                                 .tsid        = CONF_TX_AC_BK,
311                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
312                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
313                                 .apsd_conf   = {0, 0},
314                         },
315                         [CONF_TX_AC_VI] = {
316                                 .queue_id    = CONF_TX_AC_VI,
317                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
318                                 .tsid        = CONF_TX_AC_VI,
319                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
320                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
321                                 .apsd_conf   = {0, 0},
322                         },
323                         [CONF_TX_AC_VO] = {
324                                 .queue_id    = CONF_TX_AC_VO,
325                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
326                                 .tsid        = CONF_TX_AC_VO,
327                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
328                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
329                                 .apsd_conf   = {0, 0},
330                         },
331                 },
332                 .frag_threshold              = IEEE80211_MAX_FRAG_THRESHOLD,
333                 .tx_compl_timeout            = 350,
334                 .tx_compl_threshold          = 10,
335                 .basic_rate                  = CONF_HW_BIT_RATE_1MBPS,
336                 .basic_rate_5                = CONF_HW_BIT_RATE_6MBPS,
337                 .tmpl_short_retry_limit      = 10,
338                 .tmpl_long_retry_limit       = 10,
339                 .tx_watchdog_timeout         = 5000,
340                 .slow_link_thold             = 3,
341                 .fast_link_thold             = 30,
342         },
343         .conn = {
344                 .wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
345                 .listen_interval             = 1,
346                 .suspend_wake_up_event       = CONF_WAKE_UP_EVENT_N_DTIM,
347                 .suspend_listen_interval     = 3,
348                 .bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
349                 .bcn_filt_ie_count           = 3,
350                 .bcn_filt_ie = {
351                         [0] = {
352                                 .ie          = WLAN_EID_CHANNEL_SWITCH,
353                                 .rule        = CONF_BCN_RULE_PASS_ON_APPEARANCE,
354                         },
355                         [1] = {
356                                 .ie          = WLAN_EID_HT_OPERATION,
357                                 .rule        = CONF_BCN_RULE_PASS_ON_CHANGE,
358                         },
359                         [2] = {
360                                 .ie          = WLAN_EID_ERP_INFO,
361                                 .rule        = CONF_BCN_RULE_PASS_ON_CHANGE,
362                         },
363                 },
364                 .synch_fail_thold            = 12,
365                 .bss_lose_timeout            = 400,
366                 .beacon_rx_timeout           = 10000,
367                 .broadcast_timeout           = 20000,
368                 .rx_broadcast_in_ps          = 1,
369                 .ps_poll_threshold           = 10,
370                 .bet_enable                  = CONF_BET_MODE_ENABLE,
371                 .bet_max_consecutive         = 50,
372                 .psm_entry_retries           = 8,
373                 .psm_exit_retries            = 16,
374                 .psm_entry_nullfunc_retries  = 3,
375                 .dynamic_ps_timeout          = 1500,
376                 .forced_ps                   = false,
377                 .keep_alive_interval         = 55000,
378                 .max_listen_interval         = 20,
379                 .sta_sleep_auth              = WL1271_PSM_ILLEGAL,
380         },
381         .itrim = {
382                 .enable = false,
383                 .timeout = 50000,
384         },
385         .pm_config = {
386                 .host_clk_settling_time = 5000,
387                 .host_fast_wakeup_support = CONF_FAST_WAKEUP_DISABLE,
388         },
389         .roam_trigger = {
390                 .trigger_pacing               = 1,
391                 .avg_weight_rssi_beacon       = 20,
392                 .avg_weight_rssi_data         = 10,
393                 .avg_weight_snr_beacon        = 20,
394                 .avg_weight_snr_data          = 10,
395         },
396         .scan = {
397                 .min_dwell_time_active        = 7500,
398                 .max_dwell_time_active        = 30000,
399                 .min_dwell_time_active_long   = 25000,
400                 .max_dwell_time_active_long   = 50000,
401                 .dwell_time_passive           = 100000,
402                 .dwell_time_dfs               = 150000,
403                 .num_probe_reqs               = 2,
404                 .split_scan_timeout           = 50000,
405         },
406         .sched_scan = {
407                 /*
408                  * Values are in TU/1000 but since sched scan FW command
409                  * params are in TUs rounding up may occur.
410                  */
411                 .base_dwell_time                = 7500,
412                 .max_dwell_time_delta           = 22500,
413                 /* based on 250bits per probe @1Mbps */
414                 .dwell_time_delta_per_probe     = 2000,
415                 /* based on 250bits per probe @6Mbps (plus a bit more) */
416                 .dwell_time_delta_per_probe_5   = 350,
417                 .dwell_time_passive             = 100000,
418                 .dwell_time_dfs                 = 150000,
419                 .num_probe_reqs                 = 2,
420                 .rssi_threshold                 = -90,
421                 .snr_threshold                  = 0,
422         },
423         .ht = {
424                 .rx_ba_win_size = 32,
425                 .tx_ba_win_size = 64,
426                 .inactivity_timeout = 10000,
427                 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
428         },
429         .mem = {
430                 .num_stations                 = 1,
431                 .ssid_profiles                = 1,
432                 .rx_block_num                 = 40,
433                 .tx_min_block_num             = 40,
434                 .dynamic_memory               = 1,
435                 .min_req_tx_blocks            = 45,
436                 .min_req_rx_blocks            = 22,
437                 .tx_min                       = 27,
438         },
439         .fm_coex = {
440                 .enable                       = true,
441                 .swallow_period               = 5,
442                 .n_divider_fref_set_1         = 0xff,       /* default */
443                 .n_divider_fref_set_2         = 12,
444                 .m_divider_fref_set_1         = 0xffff,
445                 .m_divider_fref_set_2         = 148,        /* default */
446                 .coex_pll_stabilization_time  = 0xffffffff, /* default */
447                 .ldo_stabilization_time       = 0xffff,     /* default */
448                 .fm_disturbed_band_margin     = 0xff,       /* default */
449                 .swallow_clk_diff             = 0xff,       /* default */
450         },
451         .rx_streaming = {
452                 .duration                      = 150,
453                 .queues                        = 0x1,
454                 .interval                      = 20,
455                 .always                        = 0,
456         },
457         .fwlog = {
458                 .mode                         = WL12XX_FWLOG_ON_DEMAND,
459                 .mem_blocks                   = 2,
460                 .severity                     = 0,
461                 .timestamp                    = WL12XX_FWLOG_TIMESTAMP_DISABLED,
462                 .output                       = WL12XX_FWLOG_OUTPUT_HOST,
463                 .threshold                    = 0,
464         },
465         .rate = {
466                 .rate_retry_score = 32000,
467                 .per_add = 8192,
468                 .per_th1 = 2048,
469                 .per_th2 = 4096,
470                 .max_per = 8100,
471                 .inverse_curiosity_factor = 5,
472                 .tx_fail_low_th = 4,
473                 .tx_fail_high_th = 10,
474                 .per_alpha_shift = 4,
475                 .per_add_shift = 13,
476                 .per_beta1_shift = 10,
477                 .per_beta2_shift = 8,
478                 .rate_check_up = 2,
479                 .rate_check_down = 12,
480                 .rate_retry_policy = {
481                         0x00, 0x00, 0x00, 0x00, 0x00,
482                         0x00, 0x00, 0x00, 0x00, 0x00,
483                         0x00, 0x00, 0x00,
484                 },
485         },
486         .hangover = {
487                 .recover_time               = 0,
488                 .hangover_period            = 20,
489                 .dynamic_mode               = 1,
490                 .early_termination_mode     = 1,
491                 .max_period                 = 20,
492                 .min_period                 = 1,
493                 .increase_delta             = 1,
494                 .decrease_delta             = 2,
495                 .quiet_time                 = 4,
496                 .increase_time              = 1,
497                 .window_size                = 16,
498         },
499         .recovery = {
500                 .bug_on_recovery            = 0,
501                 .no_recovery                = 0,
502         },
503 };
504
505 static struct wl18xx_priv_conf wl18xx_default_priv_conf = {
506         .ht = {
507                 .mode                           = HT_MODE_DEFAULT,
508         },
509         .phy = {
510                 .phy_standalone                 = 0x00,
511                 .primary_clock_setting_time     = 0x05,
512                 .clock_valid_on_wake_up         = 0x00,
513                 .secondary_clock_setting_time   = 0x05,
514                 .board_type                     = BOARD_TYPE_HDK_18XX,
515                 .auto_detect                    = 0x00,
516                 .dedicated_fem                  = FEM_NONE,
517                 .low_band_component             = COMPONENT_3_WAY_SWITCH,
518                 .low_band_component_type        = 0x04,
519                 .high_band_component            = COMPONENT_2_WAY_SWITCH,
520                 .high_band_component_type       = 0x09,
521                 .tcxo_ldo_voltage               = 0x00,
522                 .xtal_itrim_val                 = 0x04,
523                 .srf_state                      = 0x00,
524                 .io_configuration               = 0x01,
525                 .sdio_configuration             = 0x00,
526                 .settings                       = 0x00,
527                 .enable_clpc                    = 0x00,
528                 .enable_tx_low_pwr_on_siso_rdl  = 0x00,
529                 .rx_profile                     = 0x00,
530                 .pwr_limit_reference_11_abg     = 0x64,
531                 .per_chan_pwr_limit_arr_11abg   = {
532                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
533                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
534                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
535                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
536                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
537                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
538                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
539                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
540                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
541                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
542                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
543                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
544                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
545                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
546                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
547                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
548                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
549                 .pwr_limit_reference_11p        = 0x64,
550                 .per_chan_bo_mode_11_abg        = { 0x00, 0x00, 0x00, 0x00,
551                                                     0x00, 0x00, 0x00, 0x00,
552                                                     0x00, 0x00, 0x00, 0x00,
553                                                     0x00 },
554                 .per_chan_bo_mode_11_p          = { 0x00, 0x00, 0x00, 0x00 },
555                 .per_chan_pwr_limit_arr_11p     = { 0xff, 0xff, 0xff, 0xff,
556                                                     0xff, 0xff, 0xff },
557                 .psat                           = 0,
558                 .low_power_val                  = 0x08,
559                 .med_power_val                  = 0x12,
560                 .high_power_val                 = 0x18,
561                 .low_power_val_2nd              = 0x05,
562                 .med_power_val_2nd              = 0x0a,
563                 .high_power_val_2nd             = 0x14,
564                 .external_pa_dc2dc              = 0,
565                 .number_of_assembled_ant2_4     = 2,
566                 .number_of_assembled_ant5       = 1,
567                 .tx_rf_margin                   = 1,
568         },
569 };
570
571 static const struct wlcore_partition_set wl18xx_ptable[PART_TABLE_LEN] = {
572         [PART_TOP_PRCM_ELP_SOC] = {
573                 .mem  = { .start = 0x00A02000, .size  = 0x00010000 },
574                 .reg  = { .start = 0x00807000, .size  = 0x00005000 },
575                 .mem2 = { .start = 0x00800000, .size  = 0x0000B000 },
576                 .mem3 = { .start = 0x00000000, .size  = 0x00000000 },
577         },
578         [PART_DOWN] = {
579                 .mem  = { .start = 0x00000000, .size  = 0x00014000 },
580                 .reg  = { .start = 0x00810000, .size  = 0x0000BFFF },
581                 .mem2 = { .start = 0x00000000, .size  = 0x00000000 },
582                 .mem3 = { .start = 0x00000000, .size  = 0x00000000 },
583         },
584         [PART_BOOT] = {
585                 .mem  = { .start = 0x00700000, .size = 0x0000030c },
586                 .reg  = { .start = 0x00802000, .size = 0x00014578 },
587                 .mem2 = { .start = 0x00B00404, .size = 0x00001000 },
588                 .mem3 = { .start = 0x00C00000, .size = 0x00000400 },
589         },
590         [PART_WORK] = {
591                 .mem  = { .start = 0x00800000, .size  = 0x000050FC },
592                 .reg  = { .start = 0x00B00404, .size  = 0x00001000 },
593                 .mem2 = { .start = 0x00C00000, .size  = 0x00000400 },
594                 .mem3 = { .start = 0x00000000, .size  = 0x00000000 },
595         },
596         [PART_PHY_INIT] = {
597                 .mem  = { .start = 0x80926000,
598                           .size = sizeof(struct wl18xx_mac_and_phy_params) },
599                 .reg  = { .start = 0x00000000, .size = 0x00000000 },
600                 .mem2 = { .start = 0x00000000, .size = 0x00000000 },
601                 .mem3 = { .start = 0x00000000, .size = 0x00000000 },
602         },
603 };
604
605 static const int wl18xx_rtable[REG_TABLE_LEN] = {
606         [REG_ECPU_CONTROL]              = WL18XX_REG_ECPU_CONTROL,
607         [REG_INTERRUPT_NO_CLEAR]        = WL18XX_REG_INTERRUPT_NO_CLEAR,
608         [REG_INTERRUPT_ACK]             = WL18XX_REG_INTERRUPT_ACK,
609         [REG_COMMAND_MAILBOX_PTR]       = WL18XX_REG_COMMAND_MAILBOX_PTR,
610         [REG_EVENT_MAILBOX_PTR]         = WL18XX_REG_EVENT_MAILBOX_PTR,
611         [REG_INTERRUPT_TRIG]            = WL18XX_REG_INTERRUPT_TRIG_H,
612         [REG_INTERRUPT_MASK]            = WL18XX_REG_INTERRUPT_MASK,
613         [REG_PC_ON_RECOVERY]            = WL18XX_SCR_PAD4,
614         [REG_CHIP_ID_B]                 = WL18XX_REG_CHIP_ID_B,
615         [REG_CMD_MBOX_ADDRESS]          = WL18XX_CMD_MBOX_ADDRESS,
616
617         /* data access memory addresses, used with partition translation */
618         [REG_SLV_MEM_DATA]              = WL18XX_SLV_MEM_DATA,
619         [REG_SLV_REG_DATA]              = WL18XX_SLV_REG_DATA,
620
621         /* raw data access memory addresses */
622         [REG_RAW_FW_STATUS_ADDR]        = WL18XX_FW_STATUS_ADDR,
623 };
624
625 static const struct wl18xx_clk_cfg wl18xx_clk_table[NUM_CLOCK_CONFIGS] = {
626         [CLOCK_CONFIG_16_2_M]   = { 7,  104,  801, 4,  true },
627         [CLOCK_CONFIG_16_368_M] = { 9,  132, 3751, 4,  true },
628         [CLOCK_CONFIG_16_8_M]   = { 7,  100,    0, 0, false },
629         [CLOCK_CONFIG_19_2_M]   = { 8,  100,    0, 0, false },
630         [CLOCK_CONFIG_26_M]     = { 13, 120,    0, 0, false },
631         [CLOCK_CONFIG_32_736_M] = { 9,  132, 3751, 4,  true },
632         [CLOCK_CONFIG_33_6_M]   = { 7,  100,    0, 0, false },
633         [CLOCK_CONFIG_38_468_M] = { 8,  100,    0, 0, false },
634         [CLOCK_CONFIG_52_M]     = { 13, 120,    0, 0, false },
635 };
636
637 /* TODO: maybe move to a new header file? */
638 #define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-2.bin"
639
640 static int wl18xx_identify_chip(struct wl1271 *wl)
641 {
642         int ret = 0;
643
644         switch (wl->chip.id) {
645         case CHIP_ID_185x_PG20:
646                 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (185x PG20)",
647                                  wl->chip.id);
648                 wl->sr_fw_name = WL18XX_FW_NAME;
649                 /* wl18xx uses the same firmware for PLT */
650                 wl->plt_fw_name = WL18XX_FW_NAME;
651                 wl->quirks |= WLCORE_QUIRK_RX_BLOCKSIZE_ALIGN |
652                               WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
653                               WLCORE_QUIRK_NO_SCHED_SCAN_WHILE_CONN |
654                               WLCORE_QUIRK_TX_PAD_LAST_FRAME |
655                               WLCORE_QUIRK_REGDOMAIN_CONF |
656                               WLCORE_QUIRK_DUAL_PROBE_TMPL;
657
658                 wlcore_set_min_fw_ver(wl, WL18XX_CHIP_VER,
659                                       WL18XX_IFTYPE_VER,  WL18XX_MAJOR_VER,
660                                       WL18XX_SUBTYPE_VER, WL18XX_MINOR_VER,
661                                       /* there's no separate multi-role FW */
662                                       0, 0, 0, 0);
663                 break;
664         case CHIP_ID_185x_PG10:
665                 wl1271_warning("chip id 0x%x (185x PG10) is deprecated",
666                                wl->chip.id);
667                 ret = -ENODEV;
668                 goto out;
669
670         default:
671                 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
672                 ret = -ENODEV;
673                 goto out;
674         }
675
676         wl->scan_templ_id_2_4 = CMD_TEMPL_CFG_PROBE_REQ_2_4;
677         wl->scan_templ_id_5 = CMD_TEMPL_CFG_PROBE_REQ_5;
678         wl->sched_scan_templ_id_2_4 = CMD_TEMPL_PROBE_REQ_2_4_PERIODIC;
679         wl->sched_scan_templ_id_5 = CMD_TEMPL_PROBE_REQ_5_PERIODIC;
680         wl->max_channels_5 = WL18XX_MAX_CHANNELS_5GHZ;
681         wl->ba_rx_session_count_max = WL18XX_RX_BA_MAX_SESSIONS;
682 out:
683         return ret;
684 }
685
686 static int wl18xx_set_clk(struct wl1271 *wl)
687 {
688         u16 clk_freq;
689         int ret;
690
691         ret = wlcore_set_partition(wl, &wl->ptable[PART_TOP_PRCM_ELP_SOC]);
692         if (ret < 0)
693                 goto out;
694
695         /* TODO: PG2: apparently we need to read the clk type */
696
697         ret = wl18xx_top_reg_read(wl, PRIMARY_CLK_DETECT, &clk_freq);
698         if (ret < 0)
699                 goto out;
700
701         wl1271_debug(DEBUG_BOOT, "clock freq %d (%d, %d, %d, %d, %s)", clk_freq,
702                      wl18xx_clk_table[clk_freq].n, wl18xx_clk_table[clk_freq].m,
703                      wl18xx_clk_table[clk_freq].p, wl18xx_clk_table[clk_freq].q,
704                      wl18xx_clk_table[clk_freq].swallow ? "swallow" : "spit");
705
706         ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_N,
707                                    wl18xx_clk_table[clk_freq].n);
708         if (ret < 0)
709                 goto out;
710
711         ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_M,
712                                    wl18xx_clk_table[clk_freq].m);
713         if (ret < 0)
714                 goto out;
715
716         if (wl18xx_clk_table[clk_freq].swallow) {
717                 /* first the 16 lower bits */
718                 ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_Q_FACTOR_CFG_1,
719                                            wl18xx_clk_table[clk_freq].q &
720                                            PLLSH_WCS_PLL_Q_FACTOR_CFG_1_MASK);
721                 if (ret < 0)
722                         goto out;
723
724                 /* then the 16 higher bits, masked out */
725                 ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_Q_FACTOR_CFG_2,
726                                         (wl18xx_clk_table[clk_freq].q >> 16) &
727                                         PLLSH_WCS_PLL_Q_FACTOR_CFG_2_MASK);
728                 if (ret < 0)
729                         goto out;
730
731                 /* first the 16 lower bits */
732                 ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_P_FACTOR_CFG_1,
733                                            wl18xx_clk_table[clk_freq].p &
734                                            PLLSH_WCS_PLL_P_FACTOR_CFG_1_MASK);
735                 if (ret < 0)
736                         goto out;
737
738                 /* then the 16 higher bits, masked out */
739                 ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_P_FACTOR_CFG_2,
740                                         (wl18xx_clk_table[clk_freq].p >> 16) &
741                                         PLLSH_WCS_PLL_P_FACTOR_CFG_2_MASK);
742         } else {
743                 ret = wl18xx_top_reg_write(wl, PLLSH_WCS_PLL_SWALLOW_EN,
744                                            PLLSH_WCS_PLL_SWALLOW_EN_VAL2);
745         }
746
747 out:
748         return ret;
749 }
750
751 static int wl18xx_boot_soft_reset(struct wl1271 *wl)
752 {
753         int ret;
754
755         /* disable Rx/Tx */
756         ret = wlcore_write32(wl, WL18XX_ENABLE, 0x0);
757         if (ret < 0)
758                 goto out;
759
760         /* disable auto calibration on start*/
761         ret = wlcore_write32(wl, WL18XX_SPARE_A2, 0xffff);
762
763 out:
764         return ret;
765 }
766
767 static int wl18xx_pre_boot(struct wl1271 *wl)
768 {
769         int ret;
770
771         ret = wl18xx_set_clk(wl);
772         if (ret < 0)
773                 goto out;
774
775         /* Continue the ELP wake up sequence */
776         ret = wlcore_write32(wl, WL18XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
777         if (ret < 0)
778                 goto out;
779
780         udelay(500);
781
782         ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
783         if (ret < 0)
784                 goto out;
785
786         /* Disable interrupts */
787         ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
788         if (ret < 0)
789                 goto out;
790
791         ret = wl18xx_boot_soft_reset(wl);
792
793 out:
794         return ret;
795 }
796
797 static int wl18xx_pre_upload(struct wl1271 *wl)
798 {
799         u32 tmp;
800         int ret;
801
802         ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
803         if (ret < 0)
804                 goto out;
805
806         /* TODO: check if this is all needed */
807         ret = wlcore_write32(wl, WL18XX_EEPROMLESS_IND, WL18XX_EEPROMLESS_IND);
808         if (ret < 0)
809                 goto out;
810
811         ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &tmp);
812         if (ret < 0)
813                 goto out;
814
815         wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
816
817         ret = wlcore_read32(wl, WL18XX_SCR_PAD2, &tmp);
818
819 out:
820         return ret;
821 }
822
823 static int wl18xx_set_mac_and_phy(struct wl1271 *wl)
824 {
825         struct wl18xx_priv *priv = wl->priv;
826         struct wl18xx_mac_and_phy_params *params;
827         int ret;
828
829         params = kmemdup(&priv->conf.phy, sizeof(*params), GFP_KERNEL);
830         if (!params) {
831                 ret = -ENOMEM;
832                 goto out;
833         }
834
835         ret = wlcore_set_partition(wl, &wl->ptable[PART_PHY_INIT]);
836         if (ret < 0)
837                 goto out;
838
839         ret = wlcore_write(wl, WL18XX_PHY_INIT_MEM_ADDR, params,
840                            sizeof(*params), false);
841
842 out:
843         kfree(params);
844         return ret;
845 }
846
847 static int wl18xx_enable_interrupts(struct wl1271 *wl)
848 {
849         u32 event_mask, intr_mask;
850         int ret;
851
852         event_mask = WL18XX_ACX_EVENTS_VECTOR;
853         intr_mask = WL18XX_INTR_MASK;
854
855         ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK, event_mask);
856         if (ret < 0)
857                 goto out;
858
859         wlcore_enable_interrupts(wl);
860
861         ret = wlcore_write_reg(wl, REG_INTERRUPT_MASK,
862                                WL1271_ACX_INTR_ALL & ~intr_mask);
863         if (ret < 0)
864                 goto disable_interrupts;
865
866         return ret;
867
868 disable_interrupts:
869         wlcore_disable_interrupts(wl);
870
871 out:
872         return ret;
873 }
874
875 static int wl18xx_boot(struct wl1271 *wl)
876 {
877         int ret;
878
879         ret = wl18xx_pre_boot(wl);
880         if (ret < 0)
881                 goto out;
882
883         ret = wl18xx_pre_upload(wl);
884         if (ret < 0)
885                 goto out;
886
887         ret = wlcore_boot_upload_firmware(wl);
888         if (ret < 0)
889                 goto out;
890
891         ret = wl18xx_set_mac_and_phy(wl);
892         if (ret < 0)
893                 goto out;
894
895         wl->event_mask = BSS_LOSS_EVENT_ID |
896                 SCAN_COMPLETE_EVENT_ID |
897                 RSSI_SNR_TRIGGER_0_EVENT_ID |
898                 PERIODIC_SCAN_COMPLETE_EVENT_ID |
899                 PERIODIC_SCAN_REPORT_EVENT_ID |
900                 DUMMY_PACKET_EVENT_ID |
901                 PEER_REMOVE_COMPLETE_EVENT_ID |
902                 BA_SESSION_RX_CONSTRAINT_EVENT_ID |
903                 REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
904                 INACTIVE_STA_EVENT_ID |
905                 MAX_TX_FAILURE_EVENT_ID |
906                 CHANNEL_SWITCH_COMPLETE_EVENT_ID |
907                 DFS_CHANNELS_CONFIG_COMPLETE_EVENT;
908
909         ret = wlcore_boot_run_firmware(wl);
910         if (ret < 0)
911                 goto out;
912
913         ret = wl18xx_enable_interrupts(wl);
914
915 out:
916         return ret;
917 }
918
919 static int wl18xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
920                                void *buf, size_t len)
921 {
922         struct wl18xx_priv *priv = wl->priv;
923
924         memcpy(priv->cmd_buf, buf, len);
925         memset(priv->cmd_buf + len, 0, WL18XX_CMD_MAX_SIZE - len);
926
927         return wlcore_write(wl, cmd_box_addr, priv->cmd_buf,
928                             WL18XX_CMD_MAX_SIZE, false);
929 }
930
931 static int wl18xx_ack_event(struct wl1271 *wl)
932 {
933         return wlcore_write_reg(wl, REG_INTERRUPT_TRIG,
934                                 WL18XX_INTR_TRIG_EVENT_ACK);
935 }
936
937 static u32 wl18xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
938 {
939         u32 blk_size = WL18XX_TX_HW_BLOCK_SIZE;
940         return (len + blk_size - 1) / blk_size + spare_blks;
941 }
942
943 static void
944 wl18xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
945                           u32 blks, u32 spare_blks)
946 {
947         desc->wl18xx_mem.total_mem_blocks = blks;
948 }
949
950 static void
951 wl18xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
952                             struct sk_buff *skb)
953 {
954         desc->length = cpu_to_le16(skb->len);
955
956         /* if only the last frame is to be padded, we unset this bit on Tx */
957         if (wl->quirks & WLCORE_QUIRK_TX_PAD_LAST_FRAME)
958                 desc->wl18xx_mem.ctrl = WL18XX_TX_CTRL_NOT_PADDED;
959         else
960                 desc->wl18xx_mem.ctrl = 0;
961
962         wl1271_debug(DEBUG_TX, "tx_fill_hdr: hlid: %d "
963                      "len: %d life: %d mem: %d", desc->hlid,
964                      le16_to_cpu(desc->length),
965                      le16_to_cpu(desc->life_time),
966                      desc->wl18xx_mem.total_mem_blocks);
967 }
968
969 static enum wl_rx_buf_align
970 wl18xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
971 {
972         if (rx_desc & RX_BUF_PADDED_PAYLOAD)
973                 return WLCORE_RX_BUF_PADDED;
974
975         return WLCORE_RX_BUF_ALIGNED;
976 }
977
978 static u32 wl18xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
979                                     u32 data_len)
980 {
981         struct wl1271_rx_descriptor *desc = rx_data;
982
983         /* invalid packet */
984         if (data_len < sizeof(*desc))
985                 return 0;
986
987         return data_len - sizeof(*desc);
988 }
989
990 static void wl18xx_tx_immediate_completion(struct wl1271 *wl)
991 {
992         wl18xx_tx_immediate_complete(wl);
993 }
994
995 static int wl18xx_set_host_cfg_bitmap(struct wl1271 *wl, u32 extra_mem_blk)
996 {
997         int ret;
998         u32 sdio_align_size = 0;
999         u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE |
1000                               HOST_IF_CFG_ADD_RX_ALIGNMENT;
1001
1002         /* Enable Tx SDIO padding */
1003         if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN) {
1004                 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
1005                 sdio_align_size = WL12XX_BUS_BLOCK_SIZE;
1006         }
1007
1008         /* Enable Rx SDIO padding */
1009         if (wl->quirks & WLCORE_QUIRK_RX_BLOCKSIZE_ALIGN) {
1010                 host_cfg_bitmap |= HOST_IF_CFG_RX_PAD_TO_SDIO_BLK;
1011                 sdio_align_size = WL12XX_BUS_BLOCK_SIZE;
1012         }
1013
1014         ret = wl18xx_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap,
1015                                             sdio_align_size, extra_mem_blk,
1016                                             WL18XX_HOST_IF_LEN_SIZE_FIELD);
1017         if (ret < 0)
1018                 return ret;
1019
1020         return 0;
1021 }
1022
1023 static int wl18xx_hw_init(struct wl1271 *wl)
1024 {
1025         int ret;
1026         struct wl18xx_priv *priv = wl->priv;
1027
1028         /* (re)init private structures. Relevant on recovery as well. */
1029         priv->last_fw_rls_idx = 0;
1030         priv->extra_spare_key_count = 0;
1031
1032         /* set the default amount of spare blocks in the bitmap */
1033         ret = wl18xx_set_host_cfg_bitmap(wl, WL18XX_TX_HW_BLOCK_SPARE);
1034         if (ret < 0)
1035                 return ret;
1036
1037         if (checksum_param) {
1038                 ret = wl18xx_acx_set_checksum_state(wl);
1039                 if (ret != 0)
1040                         return ret;
1041         }
1042
1043         return ret;
1044 }
1045
1046 static void wl18xx_set_tx_desc_csum(struct wl1271 *wl,
1047                                     struct wl1271_tx_hw_descr *desc,
1048                                     struct sk_buff *skb)
1049 {
1050         u32 ip_hdr_offset;
1051         struct iphdr *ip_hdr;
1052
1053         if (!checksum_param) {
1054                 desc->wl18xx_checksum_data = 0;
1055                 return;
1056         }
1057
1058         if (skb->ip_summed != CHECKSUM_PARTIAL) {
1059                 desc->wl18xx_checksum_data = 0;
1060                 return;
1061         }
1062
1063         ip_hdr_offset = skb_network_header(skb) - skb_mac_header(skb);
1064         if (WARN_ON(ip_hdr_offset >= (1<<7))) {
1065                 desc->wl18xx_checksum_data = 0;
1066                 return;
1067         }
1068
1069         desc->wl18xx_checksum_data = ip_hdr_offset << 1;
1070
1071         /* FW is interested only in the LSB of the protocol  TCP=0 UDP=1 */
1072         ip_hdr = (void *)skb_network_header(skb);
1073         desc->wl18xx_checksum_data |= (ip_hdr->protocol & 0x01);
1074 }
1075
1076 static void wl18xx_set_rx_csum(struct wl1271 *wl,
1077                                struct wl1271_rx_descriptor *desc,
1078                                struct sk_buff *skb)
1079 {
1080         if (desc->status & WL18XX_RX_CHECKSUM_MASK)
1081                 skb->ip_summed = CHECKSUM_UNNECESSARY;
1082 }
1083
1084 static bool wl18xx_is_mimo_supported(struct wl1271 *wl)
1085 {
1086         struct wl18xx_priv *priv = wl->priv;
1087
1088         /* only support MIMO with multiple antennas, and when SISO
1089          * is not forced through config
1090          */
1091         return (priv->conf.phy.number_of_assembled_ant2_4 >= 2) &&
1092                (priv->conf.ht.mode != HT_MODE_WIDE) &&
1093                (priv->conf.ht.mode != HT_MODE_SISO20);
1094 }
1095
1096 /*
1097  * TODO: instead of having these two functions to get the rate mask,
1098  * we should modify the wlvif->rate_set instead
1099  */
1100 static u32 wl18xx_sta_get_ap_rate_mask(struct wl1271 *wl,
1101                                        struct wl12xx_vif *wlvif)
1102 {
1103         u32 hw_rate_set = wlvif->rate_set;
1104
1105         if (wlvif->channel_type == NL80211_CHAN_HT40MINUS ||
1106             wlvif->channel_type == NL80211_CHAN_HT40PLUS) {
1107                 wl1271_debug(DEBUG_ACX, "using wide channel rate mask");
1108                 hw_rate_set |= CONF_TX_RATE_USE_WIDE_CHAN;
1109
1110                 /* we don't support MIMO in wide-channel mode */
1111                 hw_rate_set &= ~CONF_TX_MIMO_RATES;
1112         } else if (wl18xx_is_mimo_supported(wl)) {
1113                 wl1271_debug(DEBUG_ACX, "using MIMO channel rate mask");
1114                 hw_rate_set |= CONF_TX_MIMO_RATES;
1115         }
1116
1117         return hw_rate_set;
1118 }
1119
1120 static u32 wl18xx_ap_get_mimo_wide_rate_mask(struct wl1271 *wl,
1121                                              struct wl12xx_vif *wlvif)
1122 {
1123         if (wlvif->channel_type == NL80211_CHAN_HT40MINUS ||
1124             wlvif->channel_type == NL80211_CHAN_HT40PLUS) {
1125                 wl1271_debug(DEBUG_ACX, "using wide channel rate mask");
1126
1127                 /* sanity check - we don't support this */
1128                 if (WARN_ON(wlvif->band != IEEE80211_BAND_5GHZ))
1129                         return 0;
1130
1131                 return CONF_TX_RATE_USE_WIDE_CHAN;
1132         } else if (wl18xx_is_mimo_supported(wl) &&
1133                    wlvif->band == IEEE80211_BAND_2GHZ) {
1134                 wl1271_debug(DEBUG_ACX, "using MIMO rate mask");
1135                 /*
1136                  * we don't care about HT channel here - if a peer doesn't
1137                  * support MIMO, we won't enable it in its rates
1138                  */
1139                 return CONF_TX_MIMO_RATES;
1140         } else {
1141                 return 0;
1142         }
1143 }
1144
1145 static int wl18xx_get_pg_ver(struct wl1271 *wl, s8 *ver)
1146 {
1147         u32 fuse;
1148         s8 rom = 0, metal = 0, pg_ver = 0, rdl_ver = 0;
1149         int ret;
1150
1151         ret = wlcore_set_partition(wl, &wl->ptable[PART_TOP_PRCM_ELP_SOC]);
1152         if (ret < 0)
1153                 goto out;
1154
1155         ret = wlcore_read32(wl, WL18XX_REG_FUSE_DATA_1_3, &fuse);
1156         if (ret < 0)
1157                 goto out;
1158
1159         pg_ver = (fuse & WL18XX_PG_VER_MASK) >> WL18XX_PG_VER_OFFSET;
1160         rom = (fuse & WL18XX_ROM_VER_MASK) >> WL18XX_ROM_VER_OFFSET;
1161
1162         if (rom <= 0xE)
1163                 metal = (fuse & WL18XX_METAL_VER_MASK) >>
1164                         WL18XX_METAL_VER_OFFSET;
1165         else
1166                 metal = (fuse & WL18XX_NEW_METAL_VER_MASK) >>
1167                         WL18XX_NEW_METAL_VER_OFFSET;
1168
1169         ret = wlcore_read32(wl, WL18XX_REG_FUSE_DATA_2_3, &fuse);
1170         if (ret < 0)
1171                 goto out;
1172
1173         rdl_ver = (fuse & WL18XX_RDL_VER_MASK) >> WL18XX_RDL_VER_OFFSET;
1174         if (rdl_ver > RDL_MAX)
1175                 rdl_ver = RDL_NONE;
1176
1177         wl1271_info("wl18xx HW: RDL %d, %s, PG %x.%x (ROM %x)",
1178                     rdl_ver, rdl_names[rdl_ver], pg_ver, metal, rom);
1179
1180         if (ver)
1181                 *ver = pg_ver;
1182
1183         ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
1184
1185 out:
1186         return ret;
1187 }
1188
1189 #define WL18XX_CONF_FILE_NAME "ti-connectivity/wl18xx-conf.bin"
1190 static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
1191 {
1192         struct wl18xx_priv *priv = wl->priv;
1193         struct wlcore_conf_file *conf_file;
1194         const struct firmware *fw;
1195         int ret;
1196
1197         ret = request_firmware(&fw, WL18XX_CONF_FILE_NAME, dev);
1198         if (ret < 0) {
1199                 wl1271_error("could not get configuration binary %s: %d",
1200                              WL18XX_CONF_FILE_NAME, ret);
1201                 goto out_fallback;
1202         }
1203
1204         if (fw->size != WL18XX_CONF_SIZE) {
1205                 wl1271_error("configuration binary file size is wrong, expected %zu got %zu",
1206                              WL18XX_CONF_SIZE, fw->size);
1207                 ret = -EINVAL;
1208                 goto out;
1209         }
1210
1211         conf_file = (struct wlcore_conf_file *) fw->data;
1212
1213         if (conf_file->header.magic != cpu_to_le32(WL18XX_CONF_MAGIC)) {
1214                 wl1271_error("configuration binary file magic number mismatch, "
1215                              "expected 0x%0x got 0x%0x", WL18XX_CONF_MAGIC,
1216                              conf_file->header.magic);
1217                 ret = -EINVAL;
1218                 goto out;
1219         }
1220
1221         if (conf_file->header.version != cpu_to_le32(WL18XX_CONF_VERSION)) {
1222                 wl1271_error("configuration binary file version not supported, "
1223                              "expected 0x%08x got 0x%08x",
1224                              WL18XX_CONF_VERSION, conf_file->header.version);
1225                 ret = -EINVAL;
1226                 goto out;
1227         }
1228
1229         memcpy(&wl->conf, &conf_file->core, sizeof(wl18xx_conf));
1230         memcpy(&priv->conf, &conf_file->priv, sizeof(priv->conf));
1231
1232         goto out;
1233
1234 out_fallback:
1235         wl1271_warning("falling back to default config");
1236
1237         /* apply driver default configuration */
1238         memcpy(&wl->conf, &wl18xx_conf, sizeof(wl18xx_conf));
1239         /* apply default private configuration */
1240         memcpy(&priv->conf, &wl18xx_default_priv_conf, sizeof(priv->conf));
1241
1242         /* For now we just fallback */
1243         return 0;
1244
1245 out:
1246         release_firmware(fw);
1247         return ret;
1248 }
1249
1250 static int wl18xx_plt_init(struct wl1271 *wl)
1251 {
1252         int ret;
1253
1254         /* calibrator based auto/fem detect not supported for 18xx */
1255         if (wl->plt_mode == PLT_FEM_DETECT) {
1256                 wl1271_error("wl18xx_plt_init: PLT FEM_DETECT not supported");
1257                 return -EINVAL;
1258         }
1259
1260         ret = wlcore_write32(wl, WL18XX_SCR_PAD8, WL18XX_SCR_PAD8_PLT);
1261         if (ret < 0)
1262                 return ret;
1263
1264         return wl->ops->boot(wl);
1265 }
1266
1267 static int wl18xx_get_mac(struct wl1271 *wl)
1268 {
1269         u32 mac1, mac2;
1270         int ret;
1271
1272         ret = wlcore_set_partition(wl, &wl->ptable[PART_TOP_PRCM_ELP_SOC]);
1273         if (ret < 0)
1274                 goto out;
1275
1276         ret = wlcore_read32(wl, WL18XX_REG_FUSE_BD_ADDR_1, &mac1);
1277         if (ret < 0)
1278                 goto out;
1279
1280         ret = wlcore_read32(wl, WL18XX_REG_FUSE_BD_ADDR_2, &mac2);
1281         if (ret < 0)
1282                 goto out;
1283
1284         /* these are the two parts of the BD_ADDR */
1285         wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
1286                 ((mac1 & 0xff000000) >> 24);
1287         wl->fuse_nic_addr = (mac1 & 0xffffff);
1288
1289         ret = wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
1290
1291 out:
1292         return ret;
1293 }
1294
1295 static int wl18xx_handle_static_data(struct wl1271 *wl,
1296                                      struct wl1271_static_data *static_data)
1297 {
1298         struct wl18xx_static_data_priv *static_data_priv =
1299                 (struct wl18xx_static_data_priv *) static_data->priv;
1300
1301         strncpy(wl->chip.phy_fw_ver_str, static_data_priv->phy_version,
1302                 sizeof(wl->chip.phy_fw_ver_str));
1303
1304         /* make sure the string is NULL-terminated */
1305         wl->chip.phy_fw_ver_str[sizeof(wl->chip.phy_fw_ver_str) - 1] = '\0';
1306
1307         wl1271_info("PHY firmware version: %s", static_data_priv->phy_version);
1308
1309         return 0;
1310 }
1311
1312 static int wl18xx_get_spare_blocks(struct wl1271 *wl, bool is_gem)
1313 {
1314         struct wl18xx_priv *priv = wl->priv;
1315
1316         /* If we have keys requiring extra spare, indulge them */
1317         if (priv->extra_spare_key_count)
1318                 return WL18XX_TX_HW_EXTRA_BLOCK_SPARE;
1319
1320         return WL18XX_TX_HW_BLOCK_SPARE;
1321 }
1322
1323 static int wl18xx_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
1324                           struct ieee80211_vif *vif,
1325                           struct ieee80211_sta *sta,
1326                           struct ieee80211_key_conf *key_conf)
1327 {
1328         struct wl18xx_priv *priv = wl->priv;
1329         bool change_spare = false, special_enc;
1330         int ret;
1331
1332         wl1271_debug(DEBUG_CRYPT, "extra spare keys before: %d",
1333                      priv->extra_spare_key_count);
1334
1335         special_enc = key_conf->cipher == WL1271_CIPHER_SUITE_GEM ||
1336                       key_conf->cipher == WLAN_CIPHER_SUITE_TKIP;
1337
1338         ret = wlcore_set_key(wl, cmd, vif, sta, key_conf);
1339         if (ret < 0)
1340                 goto out;
1341
1342         /*
1343          * when adding the first or removing the last GEM/TKIP key,
1344          * we have to adjust the number of spare blocks.
1345          */
1346         if (special_enc) {
1347                 if (cmd == SET_KEY) {
1348                         /* first key */
1349                         change_spare = (priv->extra_spare_key_count == 0);
1350                         priv->extra_spare_key_count++;
1351                 } else if (cmd == DISABLE_KEY) {
1352                         /* last key */
1353                         change_spare = (priv->extra_spare_key_count == 1);
1354                         priv->extra_spare_key_count--;
1355                 }
1356         }
1357
1358         wl1271_debug(DEBUG_CRYPT, "extra spare keys after: %d",
1359                      priv->extra_spare_key_count);
1360
1361         if (!change_spare)
1362                 goto out;
1363
1364         /* key is now set, change the spare blocks */
1365         if (priv->extra_spare_key_count)
1366                 ret = wl18xx_set_host_cfg_bitmap(wl,
1367                                         WL18XX_TX_HW_EXTRA_BLOCK_SPARE);
1368         else
1369                 ret = wl18xx_set_host_cfg_bitmap(wl,
1370                                         WL18XX_TX_HW_BLOCK_SPARE);
1371
1372 out:
1373         return ret;
1374 }
1375
1376 static u32 wl18xx_pre_pkt_send(struct wl1271 *wl,
1377                                u32 buf_offset, u32 last_len)
1378 {
1379         if (wl->quirks & WLCORE_QUIRK_TX_PAD_LAST_FRAME) {
1380                 struct wl1271_tx_hw_descr *last_desc;
1381
1382                 /* get the last TX HW descriptor written to the aggr buf */
1383                 last_desc = (struct wl1271_tx_hw_descr *)(wl->aggr_buf +
1384                                                         buf_offset - last_len);
1385
1386                 /* the last frame is padded up to an SDIO block */
1387                 last_desc->wl18xx_mem.ctrl &= ~WL18XX_TX_CTRL_NOT_PADDED;
1388                 return ALIGN(buf_offset, WL12XX_BUS_BLOCK_SIZE);
1389         }
1390
1391         /* no modifications */
1392         return buf_offset;
1393 }
1394
1395 static void wl18xx_sta_rc_update(struct wl1271 *wl,
1396                                  struct wl12xx_vif *wlvif,
1397                                  struct ieee80211_sta *sta,
1398                                  u32 changed)
1399 {
1400         bool wide = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
1401
1402         wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update wide %d", wide);
1403
1404         if (!(changed & IEEE80211_RC_BW_CHANGED))
1405                 return;
1406
1407         mutex_lock(&wl->mutex);
1408
1409         /* sanity */
1410         if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
1411                 goto out;
1412
1413         /* ignore the change before association */
1414         if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1415                 goto out;
1416
1417         /*
1418          * If we started out as wide, we can change the operation mode. If we
1419          * thought this was a 20mhz AP, we have to reconnect
1420          */
1421         if (wlvif->sta.role_chan_type == NL80211_CHAN_HT40MINUS ||
1422             wlvif->sta.role_chan_type == NL80211_CHAN_HT40PLUS)
1423                 wl18xx_acx_peer_ht_operation_mode(wl, wlvif->sta.hlid, wide);
1424         else
1425                 ieee80211_connection_loss(wl12xx_wlvif_to_vif(wlvif));
1426
1427 out:
1428         mutex_unlock(&wl->mutex);
1429 }
1430
1431 static int wl18xx_set_peer_cap(struct wl1271 *wl,
1432                                struct ieee80211_sta_ht_cap *ht_cap,
1433                                bool allow_ht_operation,
1434                                u32 rate_set, u8 hlid)
1435 {
1436         return wl18xx_acx_set_peer_cap(wl, ht_cap, allow_ht_operation,
1437                                        rate_set, hlid);
1438 }
1439
1440 static bool wl18xx_lnk_high_prio(struct wl1271 *wl, u8 hlid,
1441                                  struct wl1271_link *lnk)
1442 {
1443         u8 thold;
1444         struct wl18xx_fw_status_priv *status_priv =
1445                 (struct wl18xx_fw_status_priv *)wl->fw_status_2->priv;
1446         u32 suspend_bitmap = le32_to_cpu(status_priv->link_suspend_bitmap);
1447
1448         /* suspended links are never high priority */
1449         if (test_bit(hlid, (unsigned long *)&suspend_bitmap))
1450                 return false;
1451
1452         /* the priority thresholds are taken from FW */
1453         if (test_bit(hlid, (unsigned long *)&wl->fw_fast_lnk_map) &&
1454             !test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map))
1455                 thold = status_priv->tx_fast_link_prio_threshold;
1456         else
1457                 thold = status_priv->tx_slow_link_prio_threshold;
1458
1459         return lnk->allocated_pkts < thold;
1460 }
1461
1462 static bool wl18xx_lnk_low_prio(struct wl1271 *wl, u8 hlid,
1463                                 struct wl1271_link *lnk)
1464 {
1465         u8 thold;
1466         struct wl18xx_fw_status_priv *status_priv =
1467                 (struct wl18xx_fw_status_priv *)wl->fw_status_2->priv;
1468         u32 suspend_bitmap = le32_to_cpu(status_priv->link_suspend_bitmap);
1469
1470         if (test_bit(hlid, (unsigned long *)&suspend_bitmap))
1471                 thold = status_priv->tx_suspend_threshold;
1472         else if (test_bit(hlid, (unsigned long *)&wl->fw_fast_lnk_map) &&
1473                  !test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map))
1474                 thold = status_priv->tx_fast_stop_threshold;
1475         else
1476                 thold = status_priv->tx_slow_stop_threshold;
1477
1478         return lnk->allocated_pkts < thold;
1479 }
1480
1481 static int wl18xx_setup(struct wl1271 *wl);
1482
1483 static struct wlcore_ops wl18xx_ops = {
1484         .setup          = wl18xx_setup,
1485         .identify_chip  = wl18xx_identify_chip,
1486         .boot           = wl18xx_boot,
1487         .plt_init       = wl18xx_plt_init,
1488         .trigger_cmd    = wl18xx_trigger_cmd,
1489         .ack_event      = wl18xx_ack_event,
1490         .wait_for_event = wl18xx_wait_for_event,
1491         .process_mailbox_events = wl18xx_process_mailbox_events,
1492         .calc_tx_blocks = wl18xx_calc_tx_blocks,
1493         .set_tx_desc_blocks = wl18xx_set_tx_desc_blocks,
1494         .set_tx_desc_data_len = wl18xx_set_tx_desc_data_len,
1495         .get_rx_buf_align = wl18xx_get_rx_buf_align,
1496         .get_rx_packet_len = wl18xx_get_rx_packet_len,
1497         .tx_immediate_compl = wl18xx_tx_immediate_completion,
1498         .tx_delayed_compl = NULL,
1499         .hw_init        = wl18xx_hw_init,
1500         .set_tx_desc_csum = wl18xx_set_tx_desc_csum,
1501         .get_pg_ver     = wl18xx_get_pg_ver,
1502         .set_rx_csum = wl18xx_set_rx_csum,
1503         .sta_get_ap_rate_mask = wl18xx_sta_get_ap_rate_mask,
1504         .ap_get_mimo_wide_rate_mask = wl18xx_ap_get_mimo_wide_rate_mask,
1505         .get_mac        = wl18xx_get_mac,
1506         .debugfs_init   = wl18xx_debugfs_add_files,
1507         .scan_start     = wl18xx_scan_start,
1508         .scan_stop      = wl18xx_scan_stop,
1509         .sched_scan_start       = wl18xx_sched_scan_start,
1510         .sched_scan_stop        = wl18xx_scan_sched_scan_stop,
1511         .handle_static_data     = wl18xx_handle_static_data,
1512         .get_spare_blocks = wl18xx_get_spare_blocks,
1513         .set_key        = wl18xx_set_key,
1514         .channel_switch = wl18xx_cmd_channel_switch,
1515         .pre_pkt_send   = wl18xx_pre_pkt_send,
1516         .sta_rc_update  = wl18xx_sta_rc_update,
1517         .set_peer_cap   = wl18xx_set_peer_cap,
1518         .lnk_high_prio  = wl18xx_lnk_high_prio,
1519         .lnk_low_prio   = wl18xx_lnk_low_prio,
1520 };
1521
1522 /* HT cap appropriate for wide channels in 2Ghz */
1523 static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap_2ghz = {
1524         .cap = IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40 |
1525                IEEE80211_HT_CAP_SUP_WIDTH_20_40 | IEEE80211_HT_CAP_DSSSCCK40 |
1526                IEEE80211_HT_CAP_GRN_FLD,
1527         .ht_supported = true,
1528         .ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
1529         .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1530         .mcs = {
1531                 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1532                 .rx_highest = cpu_to_le16(150),
1533                 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1534                 },
1535 };
1536
1537 /* HT cap appropriate for wide channels in 5Ghz */
1538 static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap_5ghz = {
1539         .cap = IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40 |
1540                IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
1541                IEEE80211_HT_CAP_GRN_FLD,
1542         .ht_supported = true,
1543         .ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
1544         .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1545         .mcs = {
1546                 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1547                 .rx_highest = cpu_to_le16(150),
1548                 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1549                 },
1550 };
1551
1552 /* HT cap appropriate for SISO 20 */
1553 static struct ieee80211_sta_ht_cap wl18xx_siso20_ht_cap = {
1554         .cap = IEEE80211_HT_CAP_SGI_20 |
1555                IEEE80211_HT_CAP_GRN_FLD,
1556         .ht_supported = true,
1557         .ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
1558         .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1559         .mcs = {
1560                 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
1561                 .rx_highest = cpu_to_le16(72),
1562                 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1563                 },
1564 };
1565
1566 /* HT cap appropriate for MIMO rates in 20mhz channel */
1567 static struct ieee80211_sta_ht_cap wl18xx_mimo_ht_cap_2ghz = {
1568         .cap = IEEE80211_HT_CAP_SGI_20 |
1569                IEEE80211_HT_CAP_GRN_FLD,
1570         .ht_supported = true,
1571         .ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
1572         .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1573         .mcs = {
1574                 .rx_mask = { 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, },
1575                 .rx_highest = cpu_to_le16(144),
1576                 .tx_params = IEEE80211_HT_MCS_TX_DEFINED,
1577                 },
1578 };
1579
1580 static int wl18xx_setup(struct wl1271 *wl)
1581 {
1582         struct wl18xx_priv *priv = wl->priv;
1583         int ret;
1584
1585         wl->rtable = wl18xx_rtable;
1586         wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
1587         wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
1588         wl->num_channels = 2;
1589         wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
1590         wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
1591         wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
1592         wl->hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0;
1593         wl->fw_status_priv_len = sizeof(struct wl18xx_fw_status_priv);
1594         wl->stats.fw_stats_len = sizeof(struct wl18xx_acx_statistics);
1595         wl->static_data_priv_len = sizeof(struct wl18xx_static_data_priv);
1596
1597         if (num_rx_desc_param != -1)
1598                 wl->num_rx_desc = num_rx_desc_param;
1599
1600         ret = wl18xx_conf_init(wl, wl->dev);
1601         if (ret < 0)
1602                 return ret;
1603
1604         /* If the module param is set, update it in conf */
1605         if (board_type_param) {
1606                 if (!strcmp(board_type_param, "fpga")) {
1607                         priv->conf.phy.board_type = BOARD_TYPE_FPGA_18XX;
1608                 } else if (!strcmp(board_type_param, "hdk")) {
1609                         priv->conf.phy.board_type = BOARD_TYPE_HDK_18XX;
1610                 } else if (!strcmp(board_type_param, "dvp")) {
1611                         priv->conf.phy.board_type = BOARD_TYPE_DVP_18XX;
1612                 } else if (!strcmp(board_type_param, "evb")) {
1613                         priv->conf.phy.board_type = BOARD_TYPE_EVB_18XX;
1614                 } else if (!strcmp(board_type_param, "com8")) {
1615                         priv->conf.phy.board_type = BOARD_TYPE_COM8_18XX;
1616                 } else {
1617                         wl1271_error("invalid board type '%s'",
1618                                 board_type_param);
1619                         return -EINVAL;
1620                 }
1621         }
1622
1623         if (priv->conf.phy.board_type >= NUM_BOARD_TYPES) {
1624                 wl1271_error("invalid board type '%d'",
1625                         priv->conf.phy.board_type);
1626                 return -EINVAL;
1627         }
1628
1629         if (low_band_component_param != -1)
1630                 priv->conf.phy.low_band_component = low_band_component_param;
1631         if (low_band_component_type_param != -1)
1632                 priv->conf.phy.low_band_component_type =
1633                         low_band_component_type_param;
1634         if (high_band_component_param != -1)
1635                 priv->conf.phy.high_band_component = high_band_component_param;
1636         if (high_band_component_type_param != -1)
1637                 priv->conf.phy.high_band_component_type =
1638                         high_band_component_type_param;
1639         if (pwr_limit_reference_11_abg_param != -1)
1640                 priv->conf.phy.pwr_limit_reference_11_abg =
1641                         pwr_limit_reference_11_abg_param;
1642         if (n_antennas_2_param != -1)
1643                 priv->conf.phy.number_of_assembled_ant2_4 = n_antennas_2_param;
1644         if (n_antennas_5_param != -1)
1645                 priv->conf.phy.number_of_assembled_ant5 = n_antennas_5_param;
1646         if (dc2dc_param != -1)
1647                 priv->conf.phy.external_pa_dc2dc = dc2dc_param;
1648
1649         if (ht_mode_param) {
1650                 if (!strcmp(ht_mode_param, "default"))
1651                         priv->conf.ht.mode = HT_MODE_DEFAULT;
1652                 else if (!strcmp(ht_mode_param, "wide"))
1653                         priv->conf.ht.mode = HT_MODE_WIDE;
1654                 else if (!strcmp(ht_mode_param, "siso20"))
1655                         priv->conf.ht.mode = HT_MODE_SISO20;
1656                 else {
1657                         wl1271_error("invalid ht_mode '%s'", ht_mode_param);
1658                         return -EINVAL;
1659                 }
1660         }
1661
1662         if (priv->conf.ht.mode == HT_MODE_DEFAULT) {
1663                 /*
1664                  * Only support mimo with multiple antennas. Fall back to
1665                  * siso40.
1666                  */
1667                 if (wl18xx_is_mimo_supported(wl))
1668                         wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
1669                                           &wl18xx_mimo_ht_cap_2ghz);
1670                 else
1671                         wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
1672                                           &wl18xx_siso40_ht_cap_2ghz);
1673
1674                 /* 5Ghz is always wide */
1675                 wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
1676                                   &wl18xx_siso40_ht_cap_5ghz);
1677         } else if (priv->conf.ht.mode == HT_MODE_WIDE) {
1678                 wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
1679                                   &wl18xx_siso40_ht_cap_2ghz);
1680                 wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
1681                                   &wl18xx_siso40_ht_cap_5ghz);
1682         } else if (priv->conf.ht.mode == HT_MODE_SISO20) {
1683                 wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
1684                                   &wl18xx_siso20_ht_cap);
1685                 wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
1686                                   &wl18xx_siso20_ht_cap);
1687         }
1688
1689         if (!checksum_param) {
1690                 wl18xx_ops.set_rx_csum = NULL;
1691                 wl18xx_ops.init_vif = NULL;
1692         }
1693
1694         /* Enable 11a Band only if we have 5G antennas */
1695         wl->enable_11a = (priv->conf.phy.number_of_assembled_ant5 != 0);
1696
1697         return 0;
1698 }
1699
1700 static int wl18xx_probe(struct platform_device *pdev)
1701 {
1702         struct wl1271 *wl;
1703         struct ieee80211_hw *hw;
1704         int ret;
1705
1706         hw = wlcore_alloc_hw(sizeof(struct wl18xx_priv),
1707                              WL18XX_AGGR_BUFFER_SIZE,
1708                              sizeof(struct wl18xx_event_mailbox));
1709         if (IS_ERR(hw)) {
1710                 wl1271_error("can't allocate hw");
1711                 ret = PTR_ERR(hw);
1712                 goto out;
1713         }
1714
1715         wl = hw->priv;
1716         wl->ops = &wl18xx_ops;
1717         wl->ptable = wl18xx_ptable;
1718         ret = wlcore_probe(wl, pdev);
1719         if (ret)
1720                 goto out_free;
1721
1722         return ret;
1723
1724 out_free:
1725         wlcore_free_hw(wl);
1726 out:
1727         return ret;
1728 }
1729
1730 static const struct platform_device_id wl18xx_id_table[] = {
1731         { "wl18xx", 0 },
1732         {  } /* Terminating Entry */
1733 };
1734 MODULE_DEVICE_TABLE(platform, wl18xx_id_table);
1735
1736 static struct platform_driver wl18xx_driver = {
1737         .probe          = wl18xx_probe,
1738         .remove         = wlcore_remove,
1739         .id_table       = wl18xx_id_table,
1740         .driver = {
1741                 .name   = "wl18xx_driver",
1742                 .owner  = THIS_MODULE,
1743         }
1744 };
1745
1746 module_platform_driver(wl18xx_driver);
1747 module_param_named(ht_mode, ht_mode_param, charp, S_IRUSR);
1748 MODULE_PARM_DESC(ht_mode, "Force HT mode: wide or siso20");
1749
1750 module_param_named(board_type, board_type_param, charp, S_IRUSR);
1751 MODULE_PARM_DESC(board_type, "Board type: fpga, hdk (default), evb, com8 or "
1752                  "dvp");
1753
1754 module_param_named(checksum, checksum_param, bool, S_IRUSR);
1755 MODULE_PARM_DESC(checksum, "Enable TCP checksum: boolean (defaults to false)");
1756
1757 module_param_named(dc2dc, dc2dc_param, int, S_IRUSR);
1758 MODULE_PARM_DESC(dc2dc, "External DC2DC: u8 (defaults to 0)");
1759
1760 module_param_named(n_antennas_2, n_antennas_2_param, int, S_IRUSR);
1761 MODULE_PARM_DESC(n_antennas_2,
1762                  "Number of installed 2.4GHz antennas: 1 (default) or 2");
1763
1764 module_param_named(n_antennas_5, n_antennas_5_param, int, S_IRUSR);
1765 MODULE_PARM_DESC(n_antennas_5,
1766                  "Number of installed 5GHz antennas: 1 (default) or 2");
1767
1768 module_param_named(low_band_component, low_band_component_param, int,
1769                    S_IRUSR);
1770 MODULE_PARM_DESC(low_band_component, "Low band component: u8 "
1771                  "(default is 0x01)");
1772
1773 module_param_named(low_band_component_type, low_band_component_type_param,
1774                    int, S_IRUSR);
1775 MODULE_PARM_DESC(low_band_component_type, "Low band component type: u8 "
1776                  "(default is 0x05 or 0x06 depending on the board_type)");
1777
1778 module_param_named(high_band_component, high_band_component_param, int,
1779                    S_IRUSR);
1780 MODULE_PARM_DESC(high_band_component, "High band component: u8, "
1781                  "(default is 0x01)");
1782
1783 module_param_named(high_band_component_type, high_band_component_type_param,
1784                    int, S_IRUSR);
1785 MODULE_PARM_DESC(high_band_component_type, "High band component type: u8 "
1786                  "(default is 0x09)");
1787
1788 module_param_named(pwr_limit_reference_11_abg,
1789                    pwr_limit_reference_11_abg_param, int, S_IRUSR);
1790 MODULE_PARM_DESC(pwr_limit_reference_11_abg, "Power limit reference: u8 "
1791                  "(default is 0xc8)");
1792
1793 module_param_named(num_rx_desc,
1794                    num_rx_desc_param, int, S_IRUSR);
1795 MODULE_PARM_DESC(num_rx_desc_param,
1796                  "Number of Rx descriptors: u8 (default is 32)");
1797
1798 MODULE_LICENSE("GPL v2");
1799 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
1800 MODULE_FIRMWARE(WL18XX_FW_NAME);