Linux Audio

Check our new training course

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