wil6210.h 47.6 KB
Newer Older
1
/*
2
 * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
3
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef __WIL6210_H__
#define __WIL6210_H__

21
#include <linux/etherdevice.h>
22 23 24
#include <linux/netdevice.h>
#include <linux/wireless.h>
#include <net/cfg80211.h>
25
#include <linux/timex.h>
26
#include <linux/types.h>
27
#include <linux/irqreturn.h>
28
#include "wmi.h"
29
#include "wil_platform.h"
30
#include "fw.h"
31

32
extern bool no_fw_recovery;
33
extern unsigned int mtu_max;
34
extern unsigned short rx_ring_overflow_thrsh;
35
extern int agg_wsize;
36
extern bool rx_align_2;
37
extern bool rx_large_buf;
38
extern bool debug_fw;
39
extern bool disable_ap_sme;
40
extern bool ftm_mode;
41
extern bool drop_if_ring_full;
42
extern uint max_assoc_sta;
43

44 45
struct wil6210_priv;
struct wil6210_vif;
46
union wil_tx_desc;
47

48
#define WIL_NAME "wil6210"
49 50 51 52 53 54 55

#define WIL_FW_NAME_DEFAULT "wil6210.fw"
#define WIL_FW_NAME_FTM_DEFAULT "wil6210_ftm.fw"

#define WIL_FW_NAME_SPARROW_PLUS "wil6210_sparrow_plus.fw"
#define WIL_FW_NAME_FTM_SPARROW_PLUS "wil6210_sparrow_plus_ftm.fw"

56 57
#define WIL_FW_NAME_TALYN "wil6436.fw"
#define WIL_FW_NAME_FTM_TALYN "wil6436_ftm.fw"
58
#define WIL_BRD_NAME_TALYN "wil6436.brd"
59

60
#define WIL_BOARD_FILE_NAME "wil6210.brd" /* board & radio parameters */
61

62
#define WIL_DEFAULT_BUS_REQUEST_KBPS 128000 /* ~1Gbps */
63
#define WIL_MAX_BUS_REQUEST_KBPS 800000 /* ~6.1Gbps */
64

65 66
#define WIL_NUM_LATENCY_BINS 200

67 68 69 70 71
/* maximum number of virtual interfaces the driver supports
 * (including the main interface)
 */
#define WIL_MAX_VIFS 4

72 73 74 75 76 77 78 79 80
/**
 * extract bits [@b0:@b1] (inclusive) from the value @x
 * it should be @b0 <= @b1, or result is incorrect
 */
static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
{
	return (x >> b0) & ((1 << (b1 - b0 + 1)) - 1);
}

81 82
#define WIL6210_MIN_MEM_SIZE (2 * 1024 * 1024UL)
#define WIL6210_MAX_MEM_SIZE (4 * 1024 * 1024UL)
83

84
#define WIL_TX_Q_LEN_DEFAULT		(4000)
85
#define WIL_RX_RING_SIZE_ORDER_DEFAULT	(10)
86
#define WIL_RX_RING_SIZE_ORDER_TALYN_DEFAULT	(11)
87
#define WIL_TX_RING_SIZE_ORDER_DEFAULT	(12)
88 89
#define WIL_BCAST_RING_SIZE_ORDER_DEFAULT	(7)
#define WIL_BCAST_MCS0_LIMIT		(1024) /* limit for MCS0 frame size */
90 91 92
/* limit ring size in range [32..32k] */
#define WIL_RING_SIZE_ORDER_MIN	(5)
#define WIL_RING_SIZE_ORDER_MAX	(15)
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
93
#define WIL6210_MAX_TX_RINGS	(24) /* HW limit */
94 95
#define WIL6210_MAX_CID		(20) /* max number of stations */
#define WIL6210_RX_DESC_MAX_CID	(8)  /* HW limit */
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
96
#define WIL6210_NAPI_BUDGET	(16) /* arbitrary */
97 98
#define WIL_MAX_AMPDU_SIZE	(64 * 1024) /* FW/HW limit */
#define WIL_MAX_AGG_WSIZE	(32) /* FW/HW limit */
99 100
#define WIL_MAX_AMPDU_SIZE_128	(128 * 1024) /* FW/HW limit */
#define WIL_MAX_AGG_WSIZE_64	(64) /* FW/HW limit */
101 102
#define WIL6210_MAX_STATUS_RINGS	(8)

103 104
/* Hardware offload block adds the following:
 * 26 bytes - 3-address QoS data header
105
 *  8 bytes - IV + EIV (for GCMP)
106
 *  8 bytes - SNAP
107
 * 16 bytes - MIC (for GCMP)
108 109 110
 *  4 bytes - CRC
 */
#define WIL_MAX_MPDU_OVERHEAD	(62)
111

112
struct wil_suspend_count_stats {
113 114
	unsigned long successful_suspends;
	unsigned long successful_resumes;
115
	unsigned long failed_suspends;
116
	unsigned long failed_resumes;
117 118 119 120 121 122
};

struct wil_suspend_stats {
	struct wil_suspend_count_stats r_off;
	struct wil_suspend_count_stats r_on;
	unsigned long rejected_by_device; /* only radio on */
123 124 125
	unsigned long rejected_by_host;
};

126 127 128 129 130 131 132 133
/* Calculate MAC buffer size for the firmware. It includes all overhead,
 * as it will go over the air, and need to be 8 byte aligned
 */
static inline u32 wil_mtu2macbuf(u32 mtu)
{
	return ALIGN(mtu + WIL_MAX_MPDU_OVERHEAD, 8);
}

134 135 136 137
/* MTU for Ethernet need to take into account 8-byte SNAP header
 * to be added when encapsulating Ethernet frame into 802.11
 */
#define WIL_MAX_ETH_MTU		(IEEE80211_MAX_DATA_LEN_DMG - 8)
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
138 139
/* Max supported by wil6210 value for interrupt threshold is 5sec. */
#define WIL6210_ITR_TRSH_MAX (5000000)
140 141
#define WIL6210_ITR_TX_INTERFRAME_TIMEOUT_DEFAULT (13) /* usec */
#define WIL6210_ITR_RX_INTERFRAME_TIMEOUT_DEFAULT (13) /* usec */
142 143
#define WIL6210_ITR_TX_MAX_BURST_DURATION_DEFAULT (500) /* usec */
#define WIL6210_ITR_RX_MAX_BURST_DURATION_DEFAULT (500) /* usec */
144 145
#define WIL6210_FW_RECOVERY_RETRIES	(5) /* try to recover this many times */
#define WIL6210_FW_RECOVERY_TO	msecs_to_jiffies(5000)
146
#define WIL6210_SCAN_TO		msecs_to_jiffies(10000)
147
#define WIL6210_DISCONNECT_TO_MS (2000)
148 149 150
#define WIL6210_RX_HIGH_TRSH_INIT		(0)
#define WIL6210_RX_HIGH_TRSH_DEFAULT \
				(1 << (WIL_RX_RING_SIZE_ORDER_DEFAULT - 3))
151 152 153
#define WIL_MAX_DMG_AID 254 /* for DMG only 1-254 allowed (see
			     * 802.11REVmc/D5.0, section 9.4.1.8)
			     */
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
/* Hardware definitions begin */

/*
 * Mapping
 * RGF File      | Host addr    |  FW addr
 *               |              |
 * user_rgf      | 0x000000     | 0x880000
 *  dma_rgf      | 0x001000     | 0x881000
 * pcie_rgf      | 0x002000     | 0x882000
 *               |              |
 */

/* Where various structures placed in host address space */
#define WIL6210_FW_HOST_OFF      (0x880000UL)

#define HOSTADDR(fwaddr)        (fwaddr - WIL6210_FW_HOST_OFF)

/*
 * Interrupt control registers block
 *
 * each interrupt controlled by the same bit in all registers
 */
struct RGF_ICR {
	u32 ICC; /* Cause Control, RW: 0 - W1C, 1 - COR */
	u32 ICR; /* Cause, W1C/COR depending on ICC */
	u32 ICM; /* Cause masked (ICR & ~IMV), W1C/COR depending on ICC */
	u32 ICS; /* Cause Set, WO */
	u32 IMV; /* Mask, RW+S/C */
	u32 IMS; /* Mask Set, write 1 to set */
	u32 IMC; /* Mask Clear, write 1 to clear */
} __packed;

/* registers - FW addresses */
187
#define RGF_USER_USAGE_1		(0x880004)
188
#define RGF_USER_USAGE_2		(0x880008)
189
#define RGF_USER_USAGE_6		(0x880018)
190
	#define BIT_USER_OOB_MODE		BIT(31)
191
	#define BIT_USER_OOB_R2_MODE		BIT(30)
192 193 194 195
#define RGF_USER_USAGE_8		(0x880020)
	#define BIT_USER_PREVENT_DEEP_SLEEP	BIT(0)
	#define BIT_USER_SUPPORT_T_POWER_ON_0	BIT(1)
	#define BIT_USER_EXT_CLK		BIT(2)
196 197
#define RGF_USER_HW_MACHINE_STATE	(0x8801dc)
	#define HW_MACHINE_BOOT_DONE	(0x3fffffd)
198
#define RGF_USER_USER_CPU_0		(0x8801e0)
199
	#define BIT_USER_USER_CPU_MAN_RST	BIT(1) /* user_cpu_man_rst */
200
#define RGF_USER_CPU_PC			(0x8801e8)
201
#define RGF_USER_MAC_CPU_0		(0x8801fc)
202
	#define BIT_USER_MAC_CPU_MAN_RST	BIT(1) /* mac_cpu_man_rst */
203
#define RGF_USER_USER_SCRATCH_PAD	(0x8802bc)
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
204
#define RGF_USER_BL			(0x880A3C) /* Boot Loader */
205
#define RGF_USER_FW_REV_ID		(0x880a8c) /* chip revision */
206 207 208 209
#define RGF_USER_FW_CALIB_RESULT	(0x880a90) /* b0-7:result
						    * b8-15:signature
						    */
	#define CALIB_RESULT_SIGNATURE	(0x11)
210
#define RGF_USER_CLKS_CTL_0		(0x880abc)
211
	#define BIT_USER_CLKS_CAR_AHB_SW_SEL	BIT(1) /* ref clk/PLL */
212
	#define BIT_USER_CLKS_RST_PWGD	BIT(11) /* reset on "power good" */
213 214 215 216
#define RGF_USER_CLKS_CTL_SW_RST_VEC_0	(0x880b04)
#define RGF_USER_CLKS_CTL_SW_RST_VEC_1	(0x880b08)
#define RGF_USER_CLKS_CTL_SW_RST_VEC_2	(0x880b0c)
#define RGF_USER_CLKS_CTL_SW_RST_VEC_3	(0x880b10)
217
#define RGF_USER_CLKS_CTL_SW_RST_MASK_0	(0x880b14)
218 219
	#define BIT_HPAL_PERST_FROM_PAD	BIT(6)
	#define BIT_CAR_PERST_RST	BIT(7)
220 221
#define RGF_USER_USER_ICR		(0x880b4c) /* struct RGF_ICR */
	#define BIT_USER_USER_ICR_SW_INT_2	BIT(18)
222
#define RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0	(0x880c18)
223
#define RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1	(0x880c2c)
224 225
#define RGF_USER_SPARROW_M_4			(0x880c50) /* Sparrow */
	#define BIT_SPARROW_M_4_SEL_SLEEP_OR_REF	BIT(2)
226
#define RGF_USER_OTP_HW_RD_MACHINE_1	(0x880ce0)
227 228 229
	#define BIT_OTP_SIGNATURE_ERR_TALYN_MB		BIT(0)
	#define BIT_OTP_HW_SECTION_DONE_TALYN_MB	BIT(2)
	#define BIT_NO_FLASH_INDICATION			BIT(8)
230 231 232 233 234 235 236 237 238 239 240
#define RGF_USER_XPM_IFC_RD_TIME1	(0x880cec)
#define RGF_USER_XPM_IFC_RD_TIME2	(0x880cf0)
#define RGF_USER_XPM_IFC_RD_TIME3	(0x880cf4)
#define RGF_USER_XPM_IFC_RD_TIME4	(0x880cf8)
#define RGF_USER_XPM_IFC_RD_TIME5	(0x880cfc)
#define RGF_USER_XPM_IFC_RD_TIME6	(0x880d00)
#define RGF_USER_XPM_IFC_RD_TIME7	(0x880d04)
#define RGF_USER_XPM_IFC_RD_TIME8	(0x880d08)
#define RGF_USER_XPM_IFC_RD_TIME9	(0x880d0c)
#define RGF_USER_XPM_IFC_RD_TIME10	(0x880d10)
#define RGF_USER_XPM_RD_DOUT_SAMPLE_TIME (0x880d64)
241 242 243 244 245 246

#define RGF_DMA_EP_TX_ICR		(0x881bb4) /* struct RGF_ICR */
	#define BIT_DMA_EP_TX_ICR_TX_DONE	BIT(0)
	#define BIT_DMA_EP_TX_ICR_TX_DONE_N(n)	BIT(n+1) /* n = [0..23] */
#define RGF_DMA_EP_RX_ICR		(0x881bd0) /* struct RGF_ICR */
	#define BIT_DMA_EP_RX_ICR_RX_DONE	BIT(0)
247
	#define BIT_DMA_EP_RX_ICR_RX_HTRSH	BIT(1)
248 249 250
#define RGF_DMA_EP_MISC_ICR		(0x881bec) /* struct RGF_ICR */
	#define BIT_DMA_EP_MISC_ICR_RX_HTRSH	BIT(0)
	#define BIT_DMA_EP_MISC_ICR_TX_NO_ACT	BIT(1)
251
	#define BIT_DMA_EP_MISC_ICR_HALP	BIT(27)
252
	#define BIT_DMA_EP_MISC_ICR_FW_INT(n)	BIT(28+n) /* n = [0..3] */
253

254
/* Legacy interrupt moderation control (before Sparrow v2)*/
255 256
#define RGF_DMA_ITR_CNT_TRSH		(0x881c5c)
#define RGF_DMA_ITR_CNT_DATA		(0x881c60)
257
#define RGF_DMA_ITR_CNT_CRL		(0x881c64)
258 259 260 261 262 263
	#define BIT_DMA_ITR_CNT_CRL_EN		BIT(0)
	#define BIT_DMA_ITR_CNT_CRL_EXT_TICK	BIT(1)
	#define BIT_DMA_ITR_CNT_CRL_FOREVER	BIT(2)
	#define BIT_DMA_ITR_CNT_CRL_CLR		BIT(3)
	#define BIT_DMA_ITR_CNT_CRL_REACH_TRSH	BIT(4)

264 265 266 267 268 269 270
/* Offload control (Sparrow B0+) */
#define RGF_DMA_OFUL_NID_0		(0x881cd4)
	#define BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN		BIT(0)
	#define BIT_DMA_OFUL_NID_0_TX_EXT_TR_EN		BIT(1)
	#define BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC	BIT(2)
	#define BIT_DMA_OFUL_NID_0_TX_EXT_A3_SRC	BIT(3)

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
/* New (sparrow v2+) interrupt moderation control */
#define RGF_DMA_ITR_TX_DESQ_NO_MOD		(0x881d40)
#define RGF_DMA_ITR_TX_CNT_TRSH			(0x881d34)
#define RGF_DMA_ITR_TX_CNT_DATA			(0x881d38)
#define RGF_DMA_ITR_TX_CNT_CTL			(0x881d3c)
	#define BIT_DMA_ITR_TX_CNT_CTL_EN		BIT(0)
	#define BIT_DMA_ITR_TX_CNT_CTL_EXT_TIC_SEL	BIT(1)
	#define BIT_DMA_ITR_TX_CNT_CTL_FOREVER		BIT(2)
	#define BIT_DMA_ITR_TX_CNT_CTL_CLR		BIT(3)
	#define BIT_DMA_ITR_TX_CNT_CTL_REACHED_TRESH	BIT(4)
	#define BIT_DMA_ITR_TX_CNT_CTL_CROSS_EN		BIT(5)
	#define BIT_DMA_ITR_TX_CNT_CTL_FREE_RUNNIG	BIT(6)
#define RGF_DMA_ITR_TX_IDL_CNT_TRSH			(0x881d60)
#define RGF_DMA_ITR_TX_IDL_CNT_DATA			(0x881d64)
#define RGF_DMA_ITR_TX_IDL_CNT_CTL			(0x881d68)
	#define BIT_DMA_ITR_TX_IDL_CNT_CTL_EN			BIT(0)
	#define BIT_DMA_ITR_TX_IDL_CNT_CTL_EXT_TIC_SEL		BIT(1)
	#define BIT_DMA_ITR_TX_IDL_CNT_CTL_FOREVER		BIT(2)
	#define BIT_DMA_ITR_TX_IDL_CNT_CTL_CLR			BIT(3)
	#define BIT_DMA_ITR_TX_IDL_CNT_CTL_REACHED_TRESH	BIT(4)
#define RGF_DMA_ITR_RX_DESQ_NO_MOD		(0x881d50)
#define RGF_DMA_ITR_RX_CNT_TRSH			(0x881d44)
#define RGF_DMA_ITR_RX_CNT_DATA			(0x881d48)
#define RGF_DMA_ITR_RX_CNT_CTL			(0x881d4c)
	#define BIT_DMA_ITR_RX_CNT_CTL_EN		BIT(0)
	#define BIT_DMA_ITR_RX_CNT_CTL_EXT_TIC_SEL	BIT(1)
	#define BIT_DMA_ITR_RX_CNT_CTL_FOREVER		BIT(2)
	#define BIT_DMA_ITR_RX_CNT_CTL_CLR		BIT(3)
	#define BIT_DMA_ITR_RX_CNT_CTL_REACHED_TRESH	BIT(4)
	#define BIT_DMA_ITR_RX_CNT_CTL_CROSS_EN		BIT(5)
	#define BIT_DMA_ITR_RX_CNT_CTL_FREE_RUNNIG	BIT(6)
#define RGF_DMA_ITR_RX_IDL_CNT_TRSH			(0x881d54)
#define RGF_DMA_ITR_RX_IDL_CNT_DATA			(0x881d58)
#define RGF_DMA_ITR_RX_IDL_CNT_CTL			(0x881d5c)
	#define BIT_DMA_ITR_RX_IDL_CNT_CTL_EN			BIT(0)
	#define BIT_DMA_ITR_RX_IDL_CNT_CTL_EXT_TIC_SEL		BIT(1)
	#define BIT_DMA_ITR_RX_IDL_CNT_CTL_FOREVER		BIT(2)
	#define BIT_DMA_ITR_RX_IDL_CNT_CTL_CLR			BIT(3)
	#define BIT_DMA_ITR_RX_IDL_CNT_CTL_REACHED_TRESH	BIT(4)
Maya Erez's avatar
Maya Erez committed
310 311
#define RGF_DMA_MISC_CTL				(0x881d6c)
	#define BIT_OFUL34_RDY_VALID_BUG_FIX_EN			BIT(7)
312

313 314 315 316 317 318 319
#define RGF_DMA_PSEUDO_CAUSE		(0x881c68)
#define RGF_DMA_PSEUDO_CAUSE_MASK_SW	(0x881c6c)
#define RGF_DMA_PSEUDO_CAUSE_MASK_FW	(0x881c70)
	#define BIT_DMA_PSEUDO_CAUSE_RX		BIT(0)
	#define BIT_DMA_PSEUDO_CAUSE_TX		BIT(1)
	#define BIT_DMA_PSEUDO_CAUSE_MISC	BIT(2)

320
#define RGF_HP_CTRL			(0x88265c)
321
#define RGF_PAL_UNIT_ICR		(0x88266c) /* struct RGF_ICR */
322 323
#define RGF_PCIE_LOS_COUNTER_CTL	(0x882dc4)

324 325 326
/* MAC timer, usec, for packet lifetime */
#define RGF_MAC_MTRL_COUNTER_0		(0x886aa8)

327
#define RGF_CAF_ICR_TALYN_MB		(0x8893d4) /* struct RGF_ICR */
328
#define RGF_CAF_ICR			(0x88946c) /* struct RGF_ICR */
329 330 331 332
#define RGF_CAF_OSC_CONTROL		(0x88afa4)
	#define BIT_CAF_OSC_XTAL_EN		BIT(0)
#define RGF_CAF_PLL_LOCK_STATUS		(0x88afec)
	#define BIT_CAF_OSC_DIG_XTAL_STABLE	BIT(0)
333

334 335 336
#define RGF_OTP_QC_SECURED		(0x8a0038)
	#define BIT_BOOT_FROM_ROM		BIT(31)

337 338 339 340 341 342 343 344 345 346
/* eDMA */
#define RGF_INT_COUNT_ON_SPECIAL_EVT	(0x8b62d8)

#define RGF_INT_CTRL_INT_GEN_CFG_0	(0x8bc000)
#define RGF_INT_CTRL_INT_GEN_CFG_1	(0x8bc004)
#define RGF_INT_GEN_TIME_UNIT_LIMIT	(0x8bc0c8)

#define RGF_INT_GEN_CTRL		(0x8bc0ec)
	#define BIT_CONTROL_0			BIT(0)

347
/* eDMA status interrupts */
348 349
#define RGF_INT_GEN_RX_ICR		(0x8bc0f4)
	#define BIT_RX_STATUS_IRQ BIT(WIL_RX_STATUS_IRQ_IDX)
350 351
#define RGF_INT_GEN_TX_ICR		(0x8bc110)
	#define BIT_TX_STATUS_IRQ BIT(WIL_TX_STATUS_IRQ_IDX)
352
#define RGF_INT_CTRL_RX_INT_MASK	(0x8bc12c)
353
#define RGF_INT_CTRL_TX_INT_MASK	(0x8bc130)
354

355 356
#define RGF_INT_GEN_IDLE_TIME_LIMIT	(0x8bc134)

357 358 359
#define USER_EXT_USER_PMU_3		(0x88d00c)
	#define BIT_PMU_DEVICE_RDY		BIT(0)

360
#define RGF_USER_JTAG_DEV_ID	(0x880b34) /* device ID */
361
	#define JTAG_DEV_ID_SPARROW	(0x2632072f)
362
	#define JTAG_DEV_ID_TALYN	(0x7e0e1)
363
	#define JTAG_DEV_ID_TALYN_MB	(0x1007e0e1)
364 365 366 367 368

#define RGF_USER_REVISION_ID		(0x88afe4)
#define RGF_USER_REVISION_ID_MASK	(3)
	#define REVISION_ID_SPARROW_B0	(0x0)
	#define REVISION_ID_SPARROW_D0	(0x3)
369

370
#define RGF_OTP_MAC_TALYN_MB		(0x8a0304)
371
#define RGF_OTP_OEM_MAC			(0x8a0334)
372 373
#define RGF_OTP_MAC			(0x8a0620)

374 375 376 377
/* Talyn-MB */
#define RGF_USER_USER_CPU_0_TALYN_MB	(0x8c0138)
#define RGF_USER_MAC_CPU_0_TALYN_MB	(0x8c0154)

378
/* crash codes for FW/Ucode stored here */
379 380 381 382 383 384

/* ASSERT RGFs */
#define SPARROW_RGF_FW_ASSERT_CODE	(0x91f020)
#define SPARROW_RGF_UCODE_ASSERT_CODE	(0x91f028)
#define TALYN_RGF_FW_ASSERT_CODE	(0xa37020)
#define TALYN_RGF_UCODE_ASSERT_CODE	(0xa37028)
385

386 387
enum {
	HW_VER_UNKNOWN,
388 389
	HW_VER_SPARROW_B0, /* REVISION_ID_SPARROW_B0 */
	HW_VER_SPARROW_D0, /* REVISION_ID_SPARROW_D0 */
390
	HW_VER_TALYN,	/* JTAG_DEV_ID_TALYN */
391
	HW_VER_TALYN_MB	/* JTAG_DEV_ID_TALYN_MB */
392 393
};

394
/* popular locations */
395 396
#define RGF_MBOX   RGF_USER_USER_SCRATCH_PAD
#define HOST_MBOX   HOSTADDR(RGF_MBOX)
397 398 399
#define SW_INT_MBOX BIT_USER_USER_ICR_SW_INT_2

/* ISR register bits */
400 401 402
#define ISR_MISC_FW_READY	BIT_DMA_EP_MISC_ICR_FW_INT(0)
#define ISR_MISC_MBOX_EVT	BIT_DMA_EP_MISC_ICR_FW_INT(1)
#define ISR_MISC_FW_ERROR	BIT_DMA_EP_MISC_ICR_FW_INT(3)
403

404 405
#define WIL_DATA_COMPLETION_TO_MS 200

406
/* Hardware definitions end */
407 408
#define SPARROW_FW_MAPPING_TABLE_SIZE 10
#define TALYN_FW_MAPPING_TABLE_SIZE 13
409 410
#define TALYN_MB_FW_MAPPING_TABLE_SIZE 19
#define MAX_FW_MAPPING_TABLE_SIZE 19
411

412 413 414 415 416 417
/* Common representation of physical address in wil ring */
struct wil_ring_dma_addr {
	__le32 addr_low;
	__le16 addr_high;
} __packed;

418 419 420 421 422
struct fw_map {
	u32 from; /* linker address - from, inclusive */
	u32 to;   /* linker address - to, exclusive */
	u32 host; /* PCI/Host address - BAR0 + 0x880000 */
	const char *name; /* for debugfs */
423
	bool fw; /* true if FW mapping, false if UCODE mapping */
424
	bool crash_dump; /* true if should be dumped during crash dump */
425
};
426

427
/* array size should be in sync with actual definition in the wmi.c */
428
extern const struct fw_map sparrow_fw_mapping[SPARROW_FW_MAPPING_TABLE_SIZE];
429
extern const struct fw_map sparrow_d0_mac_rgf_ext;
430
extern const struct fw_map talyn_fw_mapping[TALYN_FW_MAPPING_TABLE_SIZE];
431
extern const struct fw_map talyn_mb_fw_mapping[TALYN_MB_FW_MAPPING_TABLE_SIZE];
432
extern struct fw_map fw_mapping[MAX_FW_MAPPING_TABLE_SIZE];
433

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
/**
 * mk_cidxtid - construct @cidxtid field
 * @cid: CID value
 * @tid: TID value
 *
 * @cidxtid field encoded as bits 0..3 - CID; 4..7 - TID
 */
static inline u8 mk_cidxtid(u8 cid, u8 tid)
{
	return ((tid & 0xf) << 4) | (cid & 0xf);
}

/**
 * parse_cidxtid - parse @cidxtid field
 * @cid: store CID value here
 * @tid: store TID value here
 *
 * @cidxtid field encoded as bits 0..3 - CID; 4..7 - TID
 */
static inline void parse_cidxtid(u8 cidxtid, u8 *cid, u8 *tid)
{
	*cid = cidxtid & 0xf;
	*tid = (cidxtid >> 4) & 0xf;
}

459 460 461 462 463 464
/**
 * wil_cid_valid - check cid is valid
 * @cid: CID value
 */
static inline bool wil_cid_valid(u8 cid)
{
465
	return (cid >= 0 && cid < max_assoc_sta);
466 467
}

468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
struct wil6210_mbox_ring {
	u32 base;
	u16 entry_size; /* max. size of mbox entry, incl. all headers */
	u16 size;
	u32 tail;
	u32 head;
} __packed;

struct wil6210_mbox_ring_desc {
	__le32 sync;
	__le32 addr;
} __packed;

/* at HOST_OFF_WIL6210_MBOX_CTL */
struct wil6210_mbox_ctl {
	struct wil6210_mbox_ring tx;
	struct wil6210_mbox_ring rx;
} __packed;

struct wil6210_mbox_hdr {
	__le16 seq;
	__le16 len; /* payload, bytes after this header */
	__le16 type;
	u8 flags;
	u8 reserved;
} __packed;

#define WIL_MBOX_HDR_TYPE_WMI (0)

/* max. value for wil6210_mbox_hdr.len */
#define MAX_MBOXITEM_SIZE   (240)

struct pending_wmi_event {
	struct list_head list;
	struct {
		struct wil6210_mbox_hdr hdr;
504
		struct wmi_cmd_hdr wmi;
505 506 507 508
		u8 data[0];
	} __packed event;
};

509 510 511 512 513 514
enum { /* for wil_ctx.mapped_as */
	wil_mapped_as_none = 0,
	wil_mapped_as_single = 1,
	wil_mapped_as_page = 2,
};

515
/**
516
 * struct wil_ctx - software context for ring descriptor
517 518 519
 */
struct wil_ctx {
	struct sk_buff *skb;
520
	u8 nr_frags;
521
	u8 mapped_as;
522 523
};

524 525 526 527
struct wil_desc_ring_rx_swtail { /* relevant for enhanced DMA only */
	u32 *va;
	dma_addr_t pa;
};
528

529 530 531 532 533 534
/**
 * A general ring structure, used for RX and TX.
 * In legacy DMA it represents the vring,
 * In enahnced DMA it represents the descriptor ring (vrings are handled by FW)
 */
struct wil_ring {
535
	dma_addr_t pa;
536 537
	volatile union wil_ring_desc *va;
	u16 size; /* number of wil_ring_desc elements */
538 539 540
	u32 swtail;
	u32 swhead;
	u32 hwtail; /* write here to inform hw */
541
	struct wil_ctx *ctx; /* ctx[size] - software context */
542 543
	struct wil_desc_ring_rx_swtail edma_rx_swtail;
	bool is_rx;
544 545
};

546
/**
547 548
 * Additional data for Rx ring.
 * Used for enhanced DMA RX chaining.
549
 */
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
struct wil_ring_rx_data {
	/* the skb being assembled */
	struct sk_buff *skb;
	/* true if we are skipping a bad fragmented packet */
	bool skipping;
	u16 buff_size;
};

/**
 * Status ring structure, used for enhanced DMA completions for RX and TX.
 */
struct wil_status_ring {
	dma_addr_t pa;
	void *va; /* pointer to ring_[tr]x_status elements */
	u16 size; /* number of status elements */
	size_t elem_size; /* status element size in bytes */
	u32 swhead;
	u32 hwtail; /* write here to inform hw */
	bool is_rx;
	u8 desc_rdy_pol; /* Expected descriptor ready bit polarity */
	struct wil_ring_rx_data rx_data;
571
	u32 invalid_buff_id_cnt; /* relevant only for RX */
572 573
};

574
#define WIL_STA_TID_NUM (16)
575
#define WIL_MCS_MAX (15) /* Maximum MCS supported */
576 577 578 579 580 581 582

struct wil_net_stats {
	unsigned long	rx_packets;
	unsigned long	tx_packets;
	unsigned long	rx_bytes;
	unsigned long	tx_bytes;
	unsigned long	tx_errors;
583 584 585
	u32 tx_latency_min_us;
	u32 tx_latency_max_us;
	u64 tx_latency_total_us;
586 587 588 589 590 591 592 593
	unsigned long	rx_dropped;
	unsigned long	rx_non_data_frame;
	unsigned long	rx_short_frame;
	unsigned long	rx_large_frame;
	unsigned long	rx_replay;
	unsigned long	rx_mic_error;
	unsigned long	rx_key_error; /* eDMA specific */
	unsigned long	rx_amsdu_error; /* eDMA specific */
594
	unsigned long	rx_csum_err;
595 596
	u16 last_mcs_rx;
	u64 rx_per_mcs[WIL_MCS_MAX + 1];
597
	u32 ft_roams; /* relevant in STA mode */
598 599
};

600 601 602 603 604 605 606 607 608 609 610 611 612
/**
 * struct tx_rx_ops - different TX/RX ops for legacy and enhanced
 * DMA flow
 */
struct wil_txrx_ops {
	void (*configure_interrupt_moderation)(struct wil6210_priv *wil);
	/* TX ops */
	int (*ring_init_tx)(struct wil6210_vif *vif, int ring_id,
			    int size, int cid, int tid);
	void (*ring_fini_tx)(struct wil6210_priv *wil, struct wil_ring *ring);
	int (*ring_init_bcast)(struct wil6210_vif *vif, int id, int size);
	int (*tx_init)(struct wil6210_priv *wil);
	void (*tx_fini)(struct wil6210_priv *wil);
613 614 615 616 617 618 619
	int (*tx_desc_map)(union wil_tx_desc *desc, dma_addr_t pa,
			   u32 len, int ring_index);
	void (*tx_desc_unmap)(struct device *dev,
			      union wil_tx_desc *desc,
			      struct wil_ctx *ctx);
	int (*tx_ring_tso)(struct wil6210_priv *wil, struct wil6210_vif *vif,
			   struct wil_ring *ring, struct sk_buff *skb);
620 621
	int (*tx_ring_modify)(struct wil6210_vif *vif, int ring_id,
			      int cid, int tid);
622
	irqreturn_t (*irq_tx)(int irq, void *cookie);
623
	/* RX ops */
624
	int (*rx_init)(struct wil6210_priv *wil, uint ring_order);
625
	void (*rx_fini)(struct wil6210_priv *wil);
626 627 628 629 630
	int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid,
				 u8 tid, u8 token, u16 status, bool amsdu,
				 u16 agg_wsize, u16 timeout);
	void (*get_reorder_params)(struct wil6210_priv *wil,
				   struct sk_buff *skb, int *tid, int *cid,
631
				   int *mid, u16 *seq, int *mcast, int *retry);
632 633 634
	void (*get_netif_rx_params)(struct sk_buff *skb,
				    int *cid, int *security);
	int (*rx_crypto_check)(struct wil6210_priv *wil, struct sk_buff *skb);
635 636
	int (*rx_error_check)(struct wil6210_priv *wil, struct sk_buff *skb,
			      struct wil_net_stats *stats);
637 638
	bool (*is_rx_idle)(struct wil6210_priv *wil);
	irqreturn_t (*irq_rx)(int irq, void *cookie);
639 640
};

641 642 643 644
/**
 * Additional data for Tx ring
 */
struct wil_ring_tx_data {
645
	bool dot1x_open;
646
	int enabled;
647
	cycles_t idle, last_idle, begin;
648 649
	u8 agg_wsize; /* agreed aggregation window, 0 - no agg */
	u16 agg_timeout;
650
	u8 agg_amsdu;
651
	bool addba_in_progress; /* if set, agg_xxx is for request in progress */
652
	u8 mid;
653
	spinlock_t lock;
654 655
};

656
enum { /* for wil6210_priv.status */
657
	wil_status_fwready = 0, /* FW operational */
658
	wil_status_dontscan,
659
	wil_status_mbox_ready, /* MBOX structures ready */
660
	wil_status_irqen, /* interrupts enabled - for debug */
661
	wil_status_napi_en, /* NAPI enabled protected by wil->mutex */
662
	wil_status_resetting, /* reset in progress */
663
	wil_status_suspending, /* suspend in progress */
664
	wil_status_suspended, /* suspend completed, device is suspended */
665
	wil_status_resuming, /* resume in progress */
666
	wil_status_last /* keep last */
667 668 669 670
};

struct pci_dev;

Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
671 672 673 674 675 676 677 678 679
/**
 * struct tid_ampdu_rx - TID aggregation information (Rx).
 *
 * @reorder_buf: buffer to reorder incoming aggregated MPDUs
 * @last_rx: jiffies of last rx activity
 * @head_seq_num: head sequence number in reordering buffer.
 * @stored_mpdu_num: number of MPDUs in reordering buffer
 * @ssn: Starting Sequence Number expected to be aggregated.
 * @buf_size: buffer size for incoming A-MPDUs
680 681 682 683 684
 * @ssn_last_drop: SSN of the last dropped frame
 * @total: total number of processed incoming frames
 * @drop_dup: duplicate frames dropped for this reorder buffer
 * @drop_old: old frames dropped for this reorder buffer
 * @first_time: true when this buffer used 1-st time
685 686
 * @mcast_last_seq: sequence number (SN) of last received multicast packet
 * @drop_dup_mcast: duplicate multicast frames dropped for this reorder buffer
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
687 688 689 690 691 692 693 694
 */
struct wil_tid_ampdu_rx {
	struct sk_buff **reorder_buf;
	unsigned long last_rx;
	u16 head_seq_num;
	u16 stored_mpdu_num;
	u16 ssn;
	u16 buf_size;
695
	u16 ssn_last_drop;
696 697 698
	unsigned long long total; /* frames processed */
	unsigned long long drop_dup;
	unsigned long long drop_old;
699
	bool first_time; /* is it 1-st time this buffer used? */
700 701
	u16 mcast_last_seq; /* multicast dup detection */
	unsigned long long drop_dup_mcast;
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
702 703
};

704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
/**
 * struct wil_tid_crypto_rx_single - TID crypto information (Rx).
 *
 * @pn: GCMP PN for the session
 * @key_set: valid key present
 */
struct wil_tid_crypto_rx_single {
	u8 pn[IEEE80211_GCMP_PN_LEN];
	bool key_set;
};

struct wil_tid_crypto_rx {
	struct wil_tid_crypto_rx_single key_id[4];
};

Dedy Lansky's avatar
Dedy Lansky committed
719 720 721 722
struct wil_p2p_info {
	struct ieee80211_channel listen_chan;
	u8 discovery_started;
	u64 cookie;
723 724
	struct wireless_dev *pending_listen_wdev;
	unsigned int listen_duration;
Dedy Lansky's avatar
Dedy Lansky committed
725 726
	struct timer_list discovery_timer; /* listen/search duration */
	struct work_struct discovery_expired_work; /* listen/search expire */
727
	struct work_struct delayed_listen_work; /* listen after scan done */
Dedy Lansky's avatar
Dedy Lansky committed
728 729
};

730 731 732 733 734
enum wil_sta_status {
	wil_sta_unused = 0,
	wil_sta_conn_pending = 1,
	wil_sta_connected = 2,
};
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
735

736 737 738 739 740 741 742 743 744 745
/**
 * struct wil_sta_info - data for peer
 *
 * Peer identified by its CID (connection ID)
 * NIC performs beam forming for each peer;
 * if no beam forming done, frame exchange is not
 * possible.
 */
struct wil_sta_info {
	u8 addr[ETH_ALEN];
746
	u8 mid;
747
	enum wil_sta_status status;
748
	struct wil_net_stats stats;
749 750 751 752 753 754 755
	/**
	 * 20 latency bins. 1st bin counts packets with latency
	 * of 0..tx_latency_res, last bin counts packets with latency
	 * of 19*tx_latency_res and above.
	 * tx_latency_res is configured from "tx_latency" debug-fs.
	 */
	u64 *tx_latency_bins;
756
	struct wmi_link_stats_basic fw_stats_basic;
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
757 758
	/* Rx BACK */
	struct wil_tid_ampdu_rx *tid_rx[WIL_STA_TID_NUM];
759
	spinlock_t tid_rx_lock; /* guarding tid_rx array */
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
760 761
	unsigned long tid_rx_timer_expired[BITS_TO_LONGS(WIL_STA_TID_NUM)];
	unsigned long tid_rx_stop_requested[BITS_TO_LONGS(WIL_STA_TID_NUM)];
762 763
	struct wil_tid_crypto_rx tid_crypto_rx[WIL_STA_TID_NUM];
	struct wil_tid_crypto_rx group_crypto_rx;
764
	u8 aid; /* 1-254; 0 if unknown/not reported */
765 766
};

767 768 769 770 771 772
enum {
	fw_recovery_idle = 0,
	fw_recovery_pending = 1,
	fw_recovery_running = 2,
};

773
enum {
774 775
	hw_capa_no_flash,
	hw_capa_last
776 777
};

778 779 780 781 782 783
struct wil_probe_client_req {
	struct list_head list;
	u64 cookie;
	u8 cid;
};

784 785 786 787 788 789 790 791 792 793 794
struct pmc_ctx {
	/* alloc, free, and read operations must own the lock */
	struct mutex		lock;
	struct vring_tx_desc	*pring_va;
	dma_addr_t		pring_pa;
	struct desc_alloc_info  *descriptors;
	int			last_cmd_status;
	int			num_descriptors;
	int			descriptor_size;
};

795 796 797 798
struct wil_halp {
	struct mutex		lock; /* protect halp ref_cnt */
	unsigned int		ref_cnt;
	struct completion	comp;
799
	u8			handle_icr;
800 801 802 803 804 805 806
};

struct wil_blob_wrapper {
	struct wil6210_priv *wil;
	struct debugfs_blob_wrapper blob;
};

807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826
#define WIL_LED_MAX_ID			(2)
#define WIL_LED_INVALID_ID		(0xF)
#define WIL_LED_BLINK_ON_SLOW_MS	(300)
#define WIL_LED_BLINK_OFF_SLOW_MS	(300)
#define WIL_LED_BLINK_ON_MED_MS		(200)
#define WIL_LED_BLINK_OFF_MED_MS	(200)
#define WIL_LED_BLINK_ON_FAST_MS	(100)
#define WIL_LED_BLINK_OFF_FAST_MS	(100)
enum {
	WIL_LED_TIME_SLOW = 0,
	WIL_LED_TIME_MED,
	WIL_LED_TIME_FAST,
	WIL_LED_TIME_LAST,
};

struct blink_on_off_time {
	u32 on_ms;
	u32 off_ms;
};

827 828 829 830 831 832 833 834 835 836
struct wil_debugfs_iomem_data {
	void *offset;
	struct wil6210_priv *wil;
};

struct wil_debugfs_data {
	struct wil_debugfs_iomem_data *data_arr;
	int iomem_data_count;
};

837 838 839 840
extern struct blink_on_off_time led_blink_time[WIL_LED_TIME_LAST];
extern u8 led_id;
extern u8 led_polarity;

841 842 843
enum wil6210_vif_status {
	wil_vif_fwconnecting,
	wil_vif_fwconnected,
844
	wil_vif_ft_roam,
845 846 847
	wil_vif_status_last /* keep last */
};

848 849
struct wil6210_vif {
	struct wireless_dev wdev;
850
	struct net_device *ndev;
851 852
	struct wil6210_priv *wil;
	u8 mid;
853
	DECLARE_BITMAP(status, wil_vif_status_last);
854 855 856 857 858
	u32 privacy; /* secure connection? */
	u16 channel; /* relevant in AP mode */
	u8 hidden_ssid; /* relevant in AP mode */
	u32 ap_isolate; /* no intra-BSS communication */
	bool pbss;
859 860 861 862 863 864 865 866
	int bi;
	u8 *proberesp, *proberesp_ies, *assocresp_ies;
	size_t proberesp_len, proberesp_ies_len, assocresp_ies_len;
	u8 ssid[IEEE80211_MAX_SSID_LEN];
	size_t ssid_len;
	u8 gtk_index;
	u8 gtk[WMI_MAX_KEY_LEN];
	size_t gtk_len;
867
	int bcast_ring;
868 869 870 871 872 873 874 875 876 877 878 879
	struct cfg80211_bss *bss; /* connected bss, relevant in STA mode */
	int locally_generated_disc; /* relevant in STA mode */
	struct timer_list connect_timer;
	struct work_struct disconnect_worker;
	/* scan */
	struct cfg80211_scan_request *scan_request;
	struct timer_list scan_timer; /* detect scan timeout */
	struct wil_p2p_info p2p;
	/* keep alive */
	struct list_head probe_client_pending;
	struct mutex probe_client_mutex; /* protect @probe_client_pending */
	struct work_struct probe_client_worker;
880
	int net_queue_stopped; /* netif_tx_stop_all_queues invoked */
881 882
	bool fw_stats_ready; /* per-cid statistics are ready inside sta_info */
	u64 fw_stats_tsf; /* measurement timestamp */
883 884
};

885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909
/**
 * RX buffer allocated for enhanced DMA RX descriptors
 */
struct wil_rx_buff {
	struct sk_buff *skb;
	struct list_head list;
	int id;
};

/**
 * During Rx completion processing, the driver extracts a buffer ID which
 * is used as an index to the rx_buff_mgmt.buff_arr array and then the SKB
 * is given to the network stack and the buffer is moved from the 'active'
 * list to the 'free' list.
 * During Rx refill, SKBs are attached to free buffers and moved to the
 * 'active' list.
 */
struct wil_rx_buff_mgmt {
	struct wil_rx_buff *buff_arr;
	size_t size; /* number of items in buff_arr */
	struct list_head active;
	struct list_head free;
	unsigned long free_list_empty_cnt; /* statistics */
};

910 911 912 913 914 915
struct wil_fw_stats_global {
	bool ready;
	u64 tsf; /* measurement timestamp */
	struct wmi_link_stats_global stats;
};

916 917
struct wil6210_priv {
	struct pci_dev *pdev;
918
	u32 bar_size;
919
	struct wiphy *wiphy;
920
	struct net_device *main_ndev;
921
	int n_msi;
922
	void __iomem *csr;
923
	DECLARE_BITMAP(status, wil_status_last);
924
	u8 fw_version[ETHTOOL_FWVERS_LEN];
925
	u32 hw_version;
926
	u8 chip_revision;
927
	const char *hw_name;
928
	const char *wil_fw_name;
929
	char *board_file;
930 931
	u32 brd_file_addr;
	u32 brd_file_max_size;
932
	DECLARE_BITMAP(hw_capa, hw_capa_last);
933
	DECLARE_BITMAP(fw_capabilities, WMI_FW_CAPABILITY_MAX);
934
	DECLARE_BITMAP(platform_capa, WIL_PLATFORM_CAPA_MAX);
935 936
	u32 recovery_count; /* num of FW recovery attempts in a short time */
	u32 recovery_state; /* FW recovery state machine */
937
	unsigned long last_fw_recovery; /* jiffies of last fw recovery */
938
	wait_queue_head_t wq; /* for all wait_event() use */
939 940
	u8 max_vifs; /* maximum number of interfaces, including main */
	struct wil6210_vif *vifs[WIL_MAX_VIFS];
941
	struct mutex vif_mutex; /* protects access to VIF entries */
942
	atomic_t connected_vifs;
943
	/* profile */
944
	struct cfg80211_chan_def monitor_chandef;
945 946
	u32 monitor_flags;
	int sinfo_gen;
947 948 949 950 951
	/* interrupt moderation */
	u32 tx_max_burst_duration;
	u32 tx_interframe_timeout;
	u32 rx_max_burst_duration;
	u32 rx_interframe_timeout;
952 953 954 955 956 957
	/* cached ISR registers */
	u32 isr_misc;
	/* mailbox related */
	struct mutex wmi_mutex;
	struct wil6210_mbox_ctl mbox_ctl;
	struct completion wmi_ready;
958
	struct completion wmi_call;
959 960
	u16 wmi_seq;
	u16 reply_id; /**< wait for this WMI event */
961
	u8 reply_mid;
962 963 964 965
	void *reply_buf;
	u16 reply_size;
	struct workqueue_struct *wmi_wq; /* for deferred calls */
	struct work_struct wmi_event_worker;
966
	struct workqueue_struct *wq_service;
967
	struct work_struct fw_error_worker;	/* for FW error recovery */
968 969 970 971 972 973 974
	struct list_head pending_wmi_ev;
	/*
	 * protect pending_wmi_ev
	 * - fill in IRQ from wil6210_irq_misc,
	 * - consumed in thread by wmi_event_worker
	 */
	spinlock_t wmi_ev_lock;
975
	spinlock_t net_queue_lock; /* guarding stop/wake netif queue */
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
976 977
	struct napi_struct napi_rx;
	struct napi_struct napi_tx;
978 979
	struct net_device napi_ndev; /* dummy net_device serving all VIFs */

980
	/* DMA related */
981
	struct wil_ring ring_rx;
982
	unsigned int rx_buf_len;
983 984 985
	struct wil_ring ring_tx[WIL6210_MAX_TX_RINGS];
	struct wil_ring_tx_data ring_tx_data[WIL6210_MAX_TX_RINGS];
	struct wil_status_ring srings[WIL6210_MAX_STATUS_RINGS];
986 987
	u8 num_rx_status_rings;
	int tx_sring_idx;
988
	u8 ring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */
989
	struct wil_sta_info sta[WIL6210_MAX_CID];
990
	u32 ring_idle_trsh; /* HW fetches up to 16 descriptors at once  */
991
	u32 dma_addr_size; /* indicates dma addr size */
992
	struct wil_rx_buff_mgmt rx_buff_mgmt;
993 994
	bool use_enhanced_dma_hw;
	struct wil_txrx_ops txrx_ops;
995 996

	struct mutex mutex; /* for wil6210_priv access in wil_{up|down} */
997 998
	/* for synchronizing device memory access while reset or suspend */
	struct rw_semaphore mem_lock;
999
	/* statistics */
1000
	atomic_t isr_count_rx, isr_count_tx;
1001 1002
	/* debugfs */
	struct dentry *debug;
1003
	struct wil_blob_wrapper blobs[MAX_FW_MAPPING_TABLE_SIZE];
1004
	u8 discovery_mode;
1005
	u8 abft_len;
1006 1007
	u8 wakeup_trigger;
	struct wil_suspend_stats suspend_stats;
1008
	struct wil_debugfs_data dbg_data;
1009 1010
	bool tx_latency; /* collect TX latency measurements */
	size_t tx_latency_res; /* bin resolution in usec */
1011 1012 1013

	void *platform_handle;
	struct wil_platform_ops platform_ops;
1014
	bool keep_radio_on_during_sleep;
1015 1016

	struct pmc_ctx pmc;
1017

1018
	u8 p2p_dev_started;
1019 1020 1021 1022

	/* P2P_DEVICE vif */
	struct wireless_dev *p2p_wdev;
	struct wireless_dev *radio_wdev;
1023 1024 1025 1026

	/* High Access Latency Policy voting */
	struct wil_halp halp;

1027 1028
	enum wmi_ps_profile_type ps_profile;

1029 1030
	int fw_calib_result;

1031
	struct notifier_block pm_notify;
1032 1033 1034 1035 1036

	bool suspend_resp_rcvd;
	bool suspend_resp_comp;
	u32 bus_request_kbps;
	u32 bus_request_kbps_pre_suspend;
1037 1038 1039

	u32 rgf_fw_assert_code_addr;
	u32 rgf_ucode_assert_code_addr;
1040
	u32 iccm_base;
1041 1042 1043 1044 1045 1046

	/* relevant only for eDMA */
	bool use_compressed_rx_status;
	u32 rx_status_ring_order;
	u32 tx_status_ring_order;
	u32 rx_buff_id_count;
1047 1048
	bool amsdu_en;
	bool use_rx_hw_reordering;
1049 1050
	bool secured_boot;
	u8 boot_config;
1051 1052

	struct wil_fw_stats_global fw_stats_global;
1053 1054 1055

	u32 max_agg_wsize;
	u32 max_ampdu_size;
1056 1057
};

1058
#define wil_to_wiphy(i) (i->wiphy)
1059 1060 1061 1062
#define wil_to_dev(i) (wiphy_dev(wil_to_wiphy(i)))
#define wiphy_to_wil(w) (struct wil6210_priv *)(wiphy_priv(w))
#define wdev_to_wil(w) (struct wil6210_priv *)(wdev_priv(w))
#define ndev_to_wil(n) (wdev_to_wil(n->ieee80211_ptr))
1063
#define ndev_to_vif(n) (struct wil6210_vif *)(netdev_priv(n))
1064 1065 1066
#define vif_to_wil(v) (v->wil)
#define vif_to_ndev(v) (v->ndev)
#define vif_to_wdev(v) (&v->wdev)
Ahmad Masri's avatar
Ahmad Masri committed
1067
#define GET_MAX_VIFS(wil) min_t(int, (wil)->max_vifs, WIL_MAX_VIFS)
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087

static inline struct wil6210_vif *wdev_to_vif(struct wil6210_priv *wil,
					      struct wireless_dev *wdev)
{
	/* main interface is shared with P2P device */
	if (wdev == wil->p2p_wdev)
		return ndev_to_vif(wil->main_ndev);
	else
		return container_of(wdev, struct wil6210_vif, wdev);
}

static inline struct wireless_dev *
vif_to_radio_wdev(struct wil6210_priv *wil, struct wil6210_vif *vif)
{
	/* main interface is shared with P2P device */
	if (vif->mid)
		return vif_to_wdev(vif);
	else
		return wil->radio_wdev;
}
1088

1089
__printf(2, 3)
1090
void wil_dbg_trace(struct wil6210_priv *wil, const char *fmt, ...);
1091
__printf(2, 3)
1092
void __wil_err(struct wil6210_priv *wil, const char *fmt, ...);
1093
__printf(2, 3)
1094
void __wil_err_ratelimited(struct wil6210_priv *wil, const char *fmt, ...);
1095
__printf(2, 3)
1096
void __wil_info(struct wil6210_priv *wil, const char *fmt, ...);
1097 1098
__printf(2, 3)
void wil_dbg_ratelimited(const struct wil6210_priv *wil, const char *fmt, ...);
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1099
#define wil_dbg(wil, fmt, arg...) do { \
1100
	netdev_dbg(wil->main_ndev, fmt, ##arg); \
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1101 1102
	wil_dbg_trace(wil, fmt, ##arg); \
} while (0)
1103

1104 1105 1106 1107
#define wil_dbg_irq(wil, fmt, arg...) wil_dbg(wil, "DBG[ IRQ]" fmt, ##arg)
#define wil_dbg_txrx(wil, fmt, arg...) wil_dbg(wil, "DBG[TXRX]" fmt, ##arg)
#define wil_dbg_wmi(wil, fmt, arg...) wil_dbg(wil, "DBG[ WMI]" fmt, ##arg)
#define wil_dbg_misc(wil, fmt, arg...) wil_dbg(wil, "DBG[MISC]" fmt, ##arg)
1108
#define wil_dbg_pm(wil, fmt, arg...) wil_dbg(wil, "DBG[ PM ]" fmt, ##arg)
1109 1110 1111 1112
#define wil_err(wil, fmt, arg...) __wil_err(wil, "%s: " fmt, __func__, ##arg)
#define wil_info(wil, fmt, arg...) __wil_info(wil, "%s: " fmt, __func__, ##arg)
#define wil_err_ratelimited(wil, fmt, arg...) \
	__wil_err_ratelimited(wil, "%s: " fmt, __func__, ##arg)
1113

1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
/* target operations */
/* register read */
static inline u32 wil_r(struct wil6210_priv *wil, u32 reg)
{
	return readl(wil->csr + HOSTADDR(reg));
}

/* register write. wmb() to make sure it is completed */
static inline void wil_w(struct wil6210_priv *wil, u32 reg, u32 val)
{
	writel(val, wil->csr + HOSTADDR(reg));
	wmb(); /* wait for write to propagate to the HW */
}

/* register set = read, OR, write */
static inline void wil_s(struct wil6210_priv *wil, u32 reg, u32 val)
{
	wil_w(wil, reg, wil_r(wil, reg) | val);
}

/* register clear = read, AND with inverted, write */
static inline void wil_c(struct wil6210_priv *wil, u32 reg, u32 val)
{
	wil_w(wil, reg, wil_r(wil, reg) & ~val);
}

1140 1141
void wil_get_board_file(struct wil6210_priv *wil, char *buf, size_t len);

1142
#if defined(CONFIG_DYNAMIC_DEBUG)
1143
#define wil_hex_dump_txrx(prefix_str, prefix_type, rowsize,	\
1144
			  groupsize, buf, len, ascii)		\
1145
			  print_hex_dump_debug("DBG[TXRX]" prefix_str,\
1146 1147 1148
					 prefix_type, rowsize,	\
					 groupsize, buf, len, ascii)

1149
#define wil_hex_dump_wmi(prefix_str, prefix_type, rowsize,	\
1150
			 groupsize, buf, len, ascii)		\
1151
			 print_hex_dump_debug("DBG[ WMI]" prefix_str,\
1152 1153
					prefix_type, rowsize,	\
					groupsize, buf, len, ascii)
1154 1155 1156 1157 1158 1159

#define wil_hex_dump_misc(prefix_str, prefix_type, rowsize,	\
			  groupsize, buf, len, ascii)		\
			  print_hex_dump_debug("DBG[MISC]" prefix_str,\
					prefix_type, rowsize,	\
					groupsize, buf, len, ascii)
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
#else /* defined(CONFIG_DYNAMIC_DEBUG) */
static inline
void wil_hex_dump_txrx(const char *prefix_str, int prefix_type, int rowsize,
		       int groupsize, const void *buf, size_t len, bool ascii)
{
}

static inline
void wil_hex_dump_wmi(const char *prefix_str, int prefix_type, int rowsize,
		      int groupsize, const void *buf, size_t len, bool ascii)
{
}
1172 1173 1174 1175 1176 1177

static inline
void wil_hex_dump_misc(const char *prefix_str, int prefix_type, int rowsize,
		       int groupsize, const void *buf, size_t len, bool ascii)
{
}
1178
#endif /* defined(CONFIG_DYNAMIC_DEBUG) */
1179 1180 1181 1182 1183

void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
			  size_t count);
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
			size_t count);
1184 1185
int wil_mem_access_lock(struct wil6210_priv *wil);
void wil_mem_access_unlock(struct wil6210_priv *wil);
1186

1187 1188
struct wil6210_vif *
wil_vif_alloc(struct wil6210_priv *wil, const char *name,
1189 1190
	      unsigned char name_assign_type, enum nl80211_iftype iftype);
void wil_vif_free(struct wil6210_vif *vif);
1191
void *wil_if_alloc(struct device *dev);
1192 1193 1194
bool wil_has_other_active_ifaces(struct wil6210_priv *wil,
				 struct net_device *ndev, bool up, bool ok);
bool wil_has_active_ifaces(struct wil6210_priv *wil, bool up, bool ok);
1195
void wil_if_free(struct wil6210_priv *wil);
1196
int wil_vif_add(struct wil6210_priv *wil, struct wil6210_vif *vif);
1197
int wil_if_add(struct wil6210_priv *wil);
1198
void wil_vif_remove(struct wil6210_priv *wil, u8 mid);
1199 1200 1201
void wil_if_remove(struct wil6210_priv *wil);
int wil_priv_init(struct wil6210_priv *wil);
void wil_priv_deinit(struct wil6210_priv *wil);
1202 1203
int wil_ps_update(struct wil6210_priv *wil,
		  enum wmi_ps_profile_type ps_profile);
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1204
int wil_reset(struct wil6210_priv *wil, bool no_fw);
1205
void wil_fw_error_recovery(struct wil6210_priv *wil);
1206
void wil_set_recovery_state(struct wil6210_priv *wil, int state);
1207
bool wil_is_recovery_blocked(struct wil6210_priv *wil);
1208
int wil_up(struct wil6210_priv *wil);
1209
int __wil_up(struct wil6210_priv *wil);
1210
int wil_down(struct wil6210_priv *wil);
1211
int __wil_down(struct wil6210_priv *wil);
1212
void wil_refresh_fw_capabilities(struct wil6210_priv *wil);
1213
void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r);
1214
int wil_find_cid(struct wil6210_priv *wil, u8 mid, const u8 *mac);
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1215
void wil_set_ethtoolops(struct net_device *ndev);
1216

1217
struct fw_map *wil_find_fw_mapping(const char *section);
1218
void __iomem *wmi_buffer_block(struct wil6210_priv *wil, __le32 ptr, u32 size);
1219 1220 1221 1222
void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr);
void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr);
int wmi_read_hdr(struct wil6210_priv *wil, __le32 ptr,
		 struct wil6210_mbox_hdr *hdr);
1223
int wmi_send(struct wil6210_priv *wil, u16 cmdid, u8 mid, void *buf, u16 len);
1224
void wmi_recv_cmd(struct wil6210_priv *wil);
1225
int wmi_call(struct wil6210_priv *wil, u16 cmdid, u8 mid, void *buf, u16 len,
1226
	     u16 reply_id, void *reply, u16 reply_size, int to_msec);
1227 1228
void wmi_event_worker(struct work_struct *work);
void wmi_event_flush(struct wil6210_priv *wil);
1229 1230
int wmi_set_ssid(struct wil6210_vif *vif, u8 ssid_len, const void *ssid);
int wmi_get_ssid(struct wil6210_vif *vif, u8 *ssid_len, void *ssid);
1231 1232
int wmi_set_channel(struct wil6210_priv *wil, int channel);
int wmi_get_channel(struct wil6210_priv *wil, int *channel);
1233
int wmi_del_cipher_key(struct wil6210_vif *vif, u8 key_index,
1234
		       const void *mac_addr, int key_usage);
1235
int wmi_add_cipher_key(struct wil6210_vif *vif, u8 key_index,
1236 1237
		       const void *mac_addr, int key_len, const void *key,
		       int key_usage);
1238
int wmi_echo(struct wil6210_priv *wil);
1239
int wmi_set_ie(struct wil6210_vif *vif, u8 type, u16 ie_len, const void *ie);
1240
int wmi_rx_chain_add(struct wil6210_priv *wil, struct wil_ring *vring);
1241
int wmi_update_ft_ies(struct wil6210_vif *vif, u16 ie_len, const void *ie);
1242
int wmi_rxon(struct wil6210_priv *wil, bool on);
1243
int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r);
1244 1245
int wmi_disconnect_sta(struct wil6210_vif *vif, const u8 *mac, u16 reason,
		       bool del_sta);
1246 1247 1248
int wmi_addba(struct wil6210_priv *wil, u8 mid,
	      u8 ringid, u8 size, u16 timeout);
int wmi_delba_tx(struct wil6210_priv *wil, u8 mid, u8 ringid, u16 reason);
1249
int wmi_delba_rx(struct wil6210_priv *wil, u8 mid, u8 cid, u8 tid, u16 reason);
1250 1251
int wmi_addba_rx_resp(struct wil6210_priv *wil,
		      u8 mid, u8 cid, u8 tid, u8 token,
1252
		      u16 status, bool amsdu, u16 agg_wsize, u16 timeout);
1253 1254
int wmi_ps_dev_profile_cfg(struct wil6210_priv *wil,
			   enum wmi_ps_profile_type ps_profile);
1255 1256
int wmi_set_mgmt_retry(struct wil6210_priv *wil, u8 retry_short);
int wmi_get_mgmt_retry(struct wil6210_priv *wil, u8 *retry_short);
1257
int wmi_new_sta(struct wil6210_vif *vif, const u8 *mac, u8 aid);
1258 1259 1260
int wmi_port_allocate(struct wil6210_priv *wil, u8 mid,
		      const u8 *mac, enum nl80211_iftype iftype);
int wmi_port_delete(struct wil6210_priv *wil, u8 mid);
1261
int wmi_link_stats_cfg(struct wil6210_vif *vif, u32 type, u8 cid, u32 interval);
1262 1263
int wil_addba_rx_request(struct wil6210_priv *wil, u8 mid, u8 cid, u8 tid,
			 u8 dialog_token, __le16 ba_param_set,
1264
			 __le16 ba_timeout, __le16 ba_seq_ctrl);
1265
int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid, u16 wsize);
1266

1267
void wil6210_clear_irq(struct wil6210_priv *wil);
1268
int wil6210_init_irq(struct wil6210_priv *wil, int irq);
1269
void wil6210_fini_irq(struct wil6210_priv *wil, int irq);
1270 1271
void wil_mask_irq(struct wil6210_priv *wil);
void wil_unmask_irq(struct wil6210_priv *wil);
1272
void wil_configure_interrupt_moderation(struct wil6210_priv *wil);
1273 1274
void wil_disable_irq(struct wil6210_priv *wil);
void wil_enable_irq(struct wil6210_priv *wil);
1275
void wil6210_mask_halp(struct wil6210_priv *wil);
Dedy Lansky's avatar
Dedy Lansky committed
1276 1277

/* P2P */
1278
bool wil_p2p_is_social_scan(struct cfg80211_scan_request *request);
1279
int wil_p2p_search(struct wil6210_vif *vif,
Dedy Lansky's avatar
Dedy Lansky committed
1280
		   struct cfg80211_scan_request *request);
1281 1282 1283
int wil_p2p_listen(struct wil6210_priv *wil, struct wireless_dev *wdev,
		   unsigned int duration, struct ieee80211_channel *chan,
		   u64 *cookie);
1284 1285
u8 wil_p2p_stop_discovery(struct wil6210_vif *vif);
int wil_p2p_cancel_listen(struct wil6210_vif *vif, u64 cookie);
Dedy Lansky's avatar
Dedy Lansky committed
1286 1287
void wil_p2p_listen_expired(struct work_struct *work);
void wil_p2p_search_expired(struct work_struct *work);
1288
void wil_p2p_stop_radio_operations(struct wil6210_priv *wil);
1289
void wil_p2p_delayed_listen_work(struct work_struct *work);
Dedy Lansky's avatar
Dedy Lansky committed
1290 1291

/* WMI for P2P */
1292 1293 1294 1295
int wmi_p2p_cfg(struct wil6210_vif *vif, int channel, int bi);
int wmi_start_listen(struct wil6210_vif *vif);
int wmi_start_search(struct wil6210_vif *vif);
int wmi_stop_discovery(struct wil6210_vif *vif);
Dedy Lansky's avatar
Dedy Lansky committed
1296

1297 1298 1299
int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
			 struct cfg80211_mgmt_tx_params *params,
			 u64 *cookie);
1300
void wil_cfg80211_ap_recovery(struct wil6210_priv *wil);
1301 1302 1303
int wil_cfg80211_iface_combinations_from_fw(
	struct wil6210_priv *wil,
	const struct wil_fw_record_concurrency *conc);
1304
int wil_vif_prepare_stop(struct wil6210_vif *vif);
1305

1306
#if defined(CONFIG_WIL6210_DEBUGFS)
1307 1308
int wil6210_debugfs_init(struct wil6210_priv *wil);
void wil6210_debugfs_remove(struct wil6210_priv *wil);
1309 1310 1311 1312 1313
#else
static inline int wil6210_debugfs_init(struct wil6210_priv *wil) { return 0; }
static inline void wil6210_debugfs_remove(struct wil6210_priv *wil) {}
#endif

1314
int wil_cid_fill_sinfo(struct wil6210_vif *vif, int cid,
1315
		       struct station_info *sinfo);
1316

1317 1318
struct wil6210_priv *wil_cfg80211_init(struct device *dev);
void wil_cfg80211_deinit(struct wil6210_priv *wil);
1319
void wil_p2p_wdev_free(struct wil6210_priv *wil);
1320 1321

int wmi_set_mac_address(struct wil6210_priv *wil, void *addr);
1322 1323 1324
int wmi_pcp_start(struct wil6210_vif *vif, int bi, u8 wmi_nettype, u8 chan,
		  u8 hidden_ssid, u8 is_go);
int wmi_pcp_stop(struct wil6210_vif *vif);
1325
int wmi_led_cfg(struct wil6210_priv *wil, bool enable);
1326 1327
int wmi_abort_scan(struct wil6210_vif *vif);
void wil_abort_scan(struct wil6210_vif *vif, bool sync);
1328
void wil_abort_scan_all_vifs(struct wil6210_priv *wil, bool sync);
1329
void wil6210_bus_request(struct wil6210_priv *wil, u32 kbps);
1330
void wil6210_disconnect(struct wil6210_vif *vif, const u8 *bssid,
1331 1332 1333
			u16 reason_code);
void wil6210_disconnect_complete(struct wil6210_vif *vif, const u8 *bssid,
				 u16 reason_code);
1334
void wil_probe_client_flush(struct wil6210_vif *vif);
1335
void wil_probe_client_worker(struct work_struct *work);
1336
void wil_disconnect_worker(struct work_struct *work);
1337

1338
void wil_init_txrx_ops(struct wil6210_priv *wil);
1339 1340

/* TX API */
1341
int wil_ring_init_tx(struct wil6210_vif *vif, int cid);
1342 1343 1344
int wil_vring_init_bcast(struct wil6210_vif *vif, int id, int size);
int wil_bcast_init(struct wil6210_vif *vif);
void wil_bcast_fini(struct wil6210_vif *vif);
1345
void wil_bcast_fini_all(struct wil6210_priv *wil);
1346

1347
void wil_update_net_queues(struct wil6210_priv *wil, struct wil6210_vif *vif,
1348
			   struct wil_ring *ring, bool should_stop);
1349
void wil_update_net_queues_bh(struct wil6210_priv *wil, struct wil6210_vif *vif,
1350
			      struct wil_ring *ring, bool check_stop);
1351
netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev);
1352
int wil_tx_complete(struct wil6210_vif *vif, int ringid);
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1353
void wil6210_unmask_irq_tx(struct wil6210_priv *wil);
1354
void wil6210_unmask_irq_tx_edma(struct wil6210_priv *wil);
1355 1356

/* RX API */
Vladimir Kondratiev's avatar
Vladimir Kondratiev committed
1357 1358
void wil_rx_handle(struct wil6210_priv *wil, int *quota);
void wil6210_unmask_irq_rx(struct wil6210_priv *wil);
1359
void wil6210_unmask_irq_rx_edma(struct wil6210_priv *wil);
1360 1361 1362
void wil_set_crypto_rx(u8 key_index, enum wmi_key_usage key_usage,
		       struct wil_sta_info *cs,
		       struct key_params *params);
1363 1364 1365

int wil_iftype_nl2wmi(enum nl80211_iftype type);

1366 1367
int wil_request_firmware(struct wil6210_priv *wil, const char *name,
			 bool load);
1368
int wil_request_board(struct wil6210_priv *wil, const char *name);
1369
bool wil_fw_verify_file_exists(struct wil6210_priv *wil, const char *name);
1370

1371 1372 1373 1374 1375
void wil_pm_runtime_allow(struct wil6210_priv *wil);
void wil_pm_runtime_forbid(struct wil6210_priv *wil);
int wil_pm_runtime_get(struct wil6210_priv *wil);
void wil_pm_runtime_put(struct wil6210_priv *wil);

1376
int wil_can_suspend(struct wil6210_priv *wil, bool is_runtime);
1377 1378
int wil_suspend(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on);
int wil_resume(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on);
1379 1380 1381 1382
bool wil_is_wmi_idle(struct wil6210_priv *wil);
int wmi_resume(struct wil6210_priv *wil);
int wmi_suspend(struct wil6210_priv *wil);
bool wil_is_tx_idle(struct wil6210_priv *wil);
1383

1384
int wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size);
1385 1386
void wil_fw_core_dump(struct wil6210_priv *wil);

1387 1388 1389 1390 1391
void wil_halp_vote(struct wil6210_priv *wil);
void wil_halp_unvote(struct wil6210_priv *wil);
void wil6210_set_halp(struct wil6210_priv *wil);
void wil6210_clear_halp(struct wil6210_priv *wil);

1392 1393 1394
int wmi_start_sched_scan(struct wil6210_priv *wil,
			 struct cfg80211_sched_scan_request *request);
int wmi_stop_sched_scan(struct wil6210_priv *wil);
1395
int wmi_mgmt_tx(struct wil6210_vif *vif, const u8 *buf, size_t len);
1396 1397
int wmi_mgmt_tx_ext(struct wil6210_vif *vif, const u8 *buf, size_t len,
		    u8 channel, u16 duration_ms);
1398

1399 1400
int reverse_memcmp(const void *cs, const void *ct, size_t count);

1401 1402 1403 1404 1405 1406 1407 1408 1409
/* WMI for enhanced DMA */
int wil_wmi_tx_sring_cfg(struct wil6210_priv *wil, int ring_id);
int wil_wmi_cfg_def_rx_offload(struct wil6210_priv *wil,
			       u16 max_rx_pl_per_desc);
int wil_wmi_rx_sring_add(struct wil6210_priv *wil, u16 ring_id);
int wil_wmi_rx_desc_ring_add(struct wil6210_priv *wil, int status_ring_id);
int wil_wmi_tx_desc_ring_add(struct wil6210_vif *vif, int ring_id, int cid,
			     int tid);
int wil_wmi_bcast_desc_ring_add(struct wil6210_vif *vif, int ring_id);
1410 1411 1412
int wmi_addba_rx_resp_edma(struct wil6210_priv *wil, u8 mid, u8 cid,
			   u8 tid, u8 token, u16 status, bool amsdu,
			   u16 agg_wsize, u16 timeout);
1413

1414 1415
void update_supported_bands(struct wil6210_priv *wil);

1416
#endif /* __WIL6210_H__ */