Version:  2.0.40 2.2.26 2.4.37 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us