diff options
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/wil6210.h')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/wil6210.h | 164 |
1 files changed, 149 insertions, 15 deletions
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h index 1f91eaf95bbe..2a2dec75f026 100644 --- a/drivers/net/wireless/ath/wil6210/wil6210.h +++ b/drivers/net/wireless/ath/wil6210/wil6210.h | |||
@@ -74,23 +74,21 @@ struct RGF_ICR { | |||
74 | } __packed; | 74 | } __packed; |
75 | 75 | ||
76 | /* registers - FW addresses */ | 76 | /* registers - FW addresses */ |
77 | #define RGF_USER_USER_SCRATCH_PAD (0x8802bc) | 77 | #define RGF_USER_HW_MACHINE_STATE (0x8801dc) |
78 | #define RGF_USER_USER_ICR (0x880b4c) /* struct RGF_ICR */ | 78 | #define HW_MACHINE_BOOT_DONE (0x3fffffd) |
79 | #define BIT_USER_USER_ICR_SW_INT_2 BIT(18) | ||
80 | #define RGF_USER_CLKS_CTL_SW_RST_MASK_0 (0x880b14) | ||
81 | #define RGF_USER_MAC_CPU_0 (0x8801fc) | ||
82 | #define RGF_USER_USER_CPU_0 (0x8801e0) | 79 | #define RGF_USER_USER_CPU_0 (0x8801e0) |
80 | #define RGF_USER_MAC_CPU_0 (0x8801fc) | ||
81 | #define RGF_USER_USER_SCRATCH_PAD (0x8802bc) | ||
82 | #define RGF_USER_FW_REV_ID (0x880a8c) /* chip revision */ | ||
83 | #define RGF_USER_CLKS_CTL_0 (0x880abc) | ||
84 | #define BIT_USER_CLKS_RST_PWGD BIT(11) /* reset on "power good" */ | ||
83 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_0 (0x880b04) | 85 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_0 (0x880b04) |
84 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_1 (0x880b08) | 86 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_1 (0x880b08) |
85 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_2 (0x880b0c) | 87 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_2 (0x880b0c) |
86 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_3 (0x880b10) | 88 | #define RGF_USER_CLKS_CTL_SW_RST_VEC_3 (0x880b10) |
87 | 89 | #define RGF_USER_CLKS_CTL_SW_RST_MASK_0 (0x880b14) | |
88 | #define RGF_DMA_PSEUDO_CAUSE (0x881c68) | 90 | #define RGF_USER_USER_ICR (0x880b4c) /* struct RGF_ICR */ |
89 | #define RGF_DMA_PSEUDO_CAUSE_MASK_SW (0x881c6c) | 91 | #define BIT_USER_USER_ICR_SW_INT_2 BIT(18) |
90 | #define RGF_DMA_PSEUDO_CAUSE_MASK_FW (0x881c70) | ||
91 | #define BIT_DMA_PSEUDO_CAUSE_RX BIT(0) | ||
92 | #define BIT_DMA_PSEUDO_CAUSE_TX BIT(1) | ||
93 | #define BIT_DMA_PSEUDO_CAUSE_MISC BIT(2) | ||
94 | 92 | ||
95 | #define RGF_DMA_EP_TX_ICR (0x881bb4) /* struct RGF_ICR */ | 93 | #define RGF_DMA_EP_TX_ICR (0x881bb4) /* struct RGF_ICR */ |
96 | #define BIT_DMA_EP_TX_ICR_TX_DONE BIT(0) | 94 | #define BIT_DMA_EP_TX_ICR_TX_DONE BIT(0) |
@@ -105,13 +103,22 @@ struct RGF_ICR { | |||
105 | /* Interrupt moderation control */ | 103 | /* Interrupt moderation control */ |
106 | #define RGF_DMA_ITR_CNT_TRSH (0x881c5c) | 104 | #define RGF_DMA_ITR_CNT_TRSH (0x881c5c) |
107 | #define RGF_DMA_ITR_CNT_DATA (0x881c60) | 105 | #define RGF_DMA_ITR_CNT_DATA (0x881c60) |
108 | #define RGF_DMA_ITR_CNT_CRL (0x881C64) | 106 | #define RGF_DMA_ITR_CNT_CRL (0x881c64) |
109 | #define BIT_DMA_ITR_CNT_CRL_EN BIT(0) | 107 | #define BIT_DMA_ITR_CNT_CRL_EN BIT(0) |
110 | #define BIT_DMA_ITR_CNT_CRL_EXT_TICK BIT(1) | 108 | #define BIT_DMA_ITR_CNT_CRL_EXT_TICK BIT(1) |
111 | #define BIT_DMA_ITR_CNT_CRL_FOREVER BIT(2) | 109 | #define BIT_DMA_ITR_CNT_CRL_FOREVER BIT(2) |
112 | #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3) | 110 | #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3) |
113 | #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4) | 111 | #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4) |
114 | 112 | ||
113 | #define RGF_DMA_PSEUDO_CAUSE (0x881c68) | ||
114 | #define RGF_DMA_PSEUDO_CAUSE_MASK_SW (0x881c6c) | ||
115 | #define RGF_DMA_PSEUDO_CAUSE_MASK_FW (0x881c70) | ||
116 | #define BIT_DMA_PSEUDO_CAUSE_RX BIT(0) | ||
117 | #define BIT_DMA_PSEUDO_CAUSE_TX BIT(1) | ||
118 | #define BIT_DMA_PSEUDO_CAUSE_MISC BIT(2) | ||
119 | |||
120 | #define RGF_PCIE_LOS_COUNTER_CTL (0x882dc4) | ||
121 | |||
115 | /* popular locations */ | 122 | /* popular locations */ |
116 | #define HOST_MBOX HOSTADDR(RGF_USER_USER_SCRATCH_PAD) | 123 | #define HOST_MBOX HOSTADDR(RGF_USER_USER_SCRATCH_PAD) |
117 | #define HOST_SW_INT (HOSTADDR(RGF_USER_USER_ICR) + \ | 124 | #define HOST_SW_INT (HOSTADDR(RGF_USER_USER_ICR) + \ |
@@ -125,6 +132,31 @@ struct RGF_ICR { | |||
125 | 132 | ||
126 | /* Hardware definitions end */ | 133 | /* Hardware definitions end */ |
127 | 134 | ||
135 | /** | ||
136 | * mk_cidxtid - construct @cidxtid field | ||
137 | * @cid: CID value | ||
138 | * @tid: TID value | ||
139 | * | ||
140 | * @cidxtid field encoded as bits 0..3 - CID; 4..7 - TID | ||
141 | */ | ||
142 | static inline u8 mk_cidxtid(u8 cid, u8 tid) | ||
143 | { | ||
144 | return ((tid & 0xf) << 4) | (cid & 0xf); | ||
145 | } | ||
146 | |||
147 | /** | ||
148 | * parse_cidxtid - parse @cidxtid field | ||
149 | * @cid: store CID value here | ||
150 | * @tid: store TID value here | ||
151 | * | ||
152 | * @cidxtid field encoded as bits 0..3 - CID; 4..7 - TID | ||
153 | */ | ||
154 | static inline void parse_cidxtid(u8 cidxtid, u8 *cid, u8 *tid) | ||
155 | { | ||
156 | *cid = cidxtid & 0xf; | ||
157 | *tid = (cidxtid >> 4) & 0xf; | ||
158 | } | ||
159 | |||
128 | struct wil6210_mbox_ring { | 160 | struct wil6210_mbox_ring { |
129 | u32 base; | 161 | u32 base; |
130 | u16 entry_size; /* max. size of mbox entry, incl. all headers */ | 162 | u16 entry_size; /* max. size of mbox entry, incl. all headers */ |
@@ -184,12 +216,19 @@ struct pending_wmi_event { | |||
184 | } __packed event; | 216 | } __packed event; |
185 | }; | 217 | }; |
186 | 218 | ||
219 | enum { /* for wil_ctx.mapped_as */ | ||
220 | wil_mapped_as_none = 0, | ||
221 | wil_mapped_as_single = 1, | ||
222 | wil_mapped_as_page = 2, | ||
223 | }; | ||
224 | |||
187 | /** | 225 | /** |
188 | * struct wil_ctx - software context for Vring descriptor | 226 | * struct wil_ctx - software context for Vring descriptor |
189 | */ | 227 | */ |
190 | struct wil_ctx { | 228 | struct wil_ctx { |
191 | struct sk_buff *skb; | 229 | struct sk_buff *skb; |
192 | u8 mapped_as_page:1; | 230 | u8 nr_frags; |
231 | u8 mapped_as; | ||
193 | }; | 232 | }; |
194 | 233 | ||
195 | union vring_desc; | 234 | union vring_desc; |
@@ -204,6 +243,14 @@ struct vring { | |||
204 | struct wil_ctx *ctx; /* ctx[size] - software context */ | 243 | struct wil_ctx *ctx; /* ctx[size] - software context */ |
205 | }; | 244 | }; |
206 | 245 | ||
246 | /** | ||
247 | * Additional data for Tx Vring | ||
248 | */ | ||
249 | struct vring_tx_data { | ||
250 | int enabled; | ||
251 | |||
252 | }; | ||
253 | |||
207 | enum { /* for wil6210_priv.status */ | 254 | enum { /* for wil6210_priv.status */ |
208 | wil_status_fwready = 0, | 255 | wil_status_fwready = 0, |
209 | wil_status_fwconnecting, | 256 | wil_status_fwconnecting, |
@@ -211,10 +258,51 @@ enum { /* for wil6210_priv.status */ | |||
211 | wil_status_dontscan, | 258 | wil_status_dontscan, |
212 | wil_status_reset_done, | 259 | wil_status_reset_done, |
213 | wil_status_irqen, /* FIXME: interrupts enabled - for debug */ | 260 | wil_status_irqen, /* FIXME: interrupts enabled - for debug */ |
261 | wil_status_napi_en, /* NAPI enabled protected by wil->mutex */ | ||
214 | }; | 262 | }; |
215 | 263 | ||
216 | struct pci_dev; | 264 | struct pci_dev; |
217 | 265 | ||
266 | /** | ||
267 | * struct tid_ampdu_rx - TID aggregation information (Rx). | ||
268 | * | ||
269 | * @reorder_buf: buffer to reorder incoming aggregated MPDUs | ||
270 | * @reorder_time: jiffies when skb was added | ||
271 | * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value) | ||
272 | * @reorder_timer: releases expired frames from the reorder buffer. | ||
273 | * @last_rx: jiffies of last rx activity | ||
274 | * @head_seq_num: head sequence number in reordering buffer. | ||
275 | * @stored_mpdu_num: number of MPDUs in reordering buffer | ||
276 | * @ssn: Starting Sequence Number expected to be aggregated. | ||
277 | * @buf_size: buffer size for incoming A-MPDUs | ||
278 | * @timeout: reset timer value (in TUs). | ||
279 | * @dialog_token: dialog token for aggregation session | ||
280 | * @rcu_head: RCU head used for freeing this struct | ||
281 | * @reorder_lock: serializes access to reorder buffer, see below. | ||
282 | * | ||
283 | * This structure's lifetime is managed by RCU, assignments to | ||
284 | * the array holding it must hold the aggregation mutex. | ||
285 | * | ||
286 | * The @reorder_lock is used to protect the members of this | ||
287 | * struct, except for @timeout, @buf_size and @dialog_token, | ||
288 | * which are constant across the lifetime of the struct (the | ||
289 | * dialog token being used only for debugging). | ||
290 | */ | ||
291 | struct wil_tid_ampdu_rx { | ||
292 | spinlock_t reorder_lock; /* see above */ | ||
293 | struct sk_buff **reorder_buf; | ||
294 | unsigned long *reorder_time; | ||
295 | struct timer_list session_timer; | ||
296 | struct timer_list reorder_timer; | ||
297 | unsigned long last_rx; | ||
298 | u16 head_seq_num; | ||
299 | u16 stored_mpdu_num; | ||
300 | u16 ssn; | ||
301 | u16 buf_size; | ||
302 | u16 timeout; | ||
303 | u8 dialog_token; | ||
304 | }; | ||
305 | |||
218 | struct wil6210_stats { | 306 | struct wil6210_stats { |
219 | u64 tsf; | 307 | u64 tsf; |
220 | u32 snr; | 308 | u32 snr; |
@@ -226,6 +314,43 @@ struct wil6210_stats { | |||
226 | u16 peer_tx_sector; | 314 | u16 peer_tx_sector; |
227 | }; | 315 | }; |
228 | 316 | ||
317 | enum wil_sta_status { | ||
318 | wil_sta_unused = 0, | ||
319 | wil_sta_conn_pending = 1, | ||
320 | wil_sta_connected = 2, | ||
321 | }; | ||
322 | |||
323 | #define WIL_STA_TID_NUM (16) | ||
324 | |||
325 | struct wil_net_stats { | ||
326 | unsigned long rx_packets; | ||
327 | unsigned long tx_packets; | ||
328 | unsigned long rx_bytes; | ||
329 | unsigned long tx_bytes; | ||
330 | unsigned long tx_errors; | ||
331 | unsigned long rx_dropped; | ||
332 | u16 last_mcs_rx; | ||
333 | }; | ||
334 | |||
335 | /** | ||
336 | * struct wil_sta_info - data for peer | ||
337 | * | ||
338 | * Peer identified by its CID (connection ID) | ||
339 | * NIC performs beam forming for each peer; | ||
340 | * if no beam forming done, frame exchange is not | ||
341 | * possible. | ||
342 | */ | ||
343 | struct wil_sta_info { | ||
344 | u8 addr[ETH_ALEN]; | ||
345 | enum wil_sta_status status; | ||
346 | struct wil_net_stats stats; | ||
347 | bool data_port_open; /* can send any data, not only EAPOL */ | ||
348 | /* Rx BACK */ | ||
349 | struct wil_tid_ampdu_rx *tid_rx[WIL_STA_TID_NUM]; | ||
350 | unsigned long tid_rx_timer_expired[BITS_TO_LONGS(WIL_STA_TID_NUM)]; | ||
351 | unsigned long tid_rx_stop_requested[BITS_TO_LONGS(WIL_STA_TID_NUM)]; | ||
352 | }; | ||
353 | |||
229 | struct wil6210_priv { | 354 | struct wil6210_priv { |
230 | struct pci_dev *pdev; | 355 | struct pci_dev *pdev; |
231 | int n_msi; | 356 | int n_msi; |
@@ -233,6 +358,7 @@ struct wil6210_priv { | |||
233 | void __iomem *csr; | 358 | void __iomem *csr; |
234 | ulong status; | 359 | ulong status; |
235 | u32 fw_version; | 360 | u32 fw_version; |
361 | u32 hw_version; | ||
236 | u8 n_mids; /* number of additional MIDs as reported by FW */ | 362 | u8 n_mids; /* number of additional MIDs as reported by FW */ |
237 | /* profile */ | 363 | /* profile */ |
238 | u32 monitor_flags; | 364 | u32 monitor_flags; |
@@ -253,6 +379,7 @@ struct wil6210_priv { | |||
253 | struct workqueue_struct *wmi_wq_conn; /* for connect worker */ | 379 | struct workqueue_struct *wmi_wq_conn; /* for connect worker */ |
254 | struct work_struct connect_worker; | 380 | struct work_struct connect_worker; |
255 | struct work_struct disconnect_worker; | 381 | struct work_struct disconnect_worker; |
382 | struct work_struct fw_error_worker; /* for FW error recovery */ | ||
256 | struct timer_list connect_timer; | 383 | struct timer_list connect_timer; |
257 | int pending_connect_cid; | 384 | int pending_connect_cid; |
258 | struct list_head pending_wmi_ev; | 385 | struct list_head pending_wmi_ev; |
@@ -267,7 +394,9 @@ struct wil6210_priv { | |||
267 | /* DMA related */ | 394 | /* DMA related */ |
268 | struct vring vring_rx; | 395 | struct vring vring_rx; |
269 | struct vring vring_tx[WIL6210_MAX_TX_RINGS]; | 396 | struct vring vring_tx[WIL6210_MAX_TX_RINGS]; |
270 | u8 dst_addr[WIL6210_MAX_TX_RINGS][ETH_ALEN]; | 397 | struct vring_tx_data vring_tx_data[WIL6210_MAX_TX_RINGS]; |
398 | u8 vring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */ | ||
399 | struct wil_sta_info sta[WIL6210_MAX_CID]; | ||
271 | /* scan */ | 400 | /* scan */ |
272 | struct cfg80211_scan_request *scan_request; | 401 | struct cfg80211_scan_request *scan_request; |
273 | 402 | ||
@@ -329,11 +458,13 @@ void wil_if_remove(struct wil6210_priv *wil); | |||
329 | int wil_priv_init(struct wil6210_priv *wil); | 458 | int wil_priv_init(struct wil6210_priv *wil); |
330 | void wil_priv_deinit(struct wil6210_priv *wil); | 459 | void wil_priv_deinit(struct wil6210_priv *wil); |
331 | int wil_reset(struct wil6210_priv *wil); | 460 | int wil_reset(struct wil6210_priv *wil); |
461 | void wil_fw_error_recovery(struct wil6210_priv *wil); | ||
332 | void wil_link_on(struct wil6210_priv *wil); | 462 | void wil_link_on(struct wil6210_priv *wil); |
333 | void wil_link_off(struct wil6210_priv *wil); | 463 | void wil_link_off(struct wil6210_priv *wil); |
334 | int wil_up(struct wil6210_priv *wil); | 464 | int wil_up(struct wil6210_priv *wil); |
335 | int wil_down(struct wil6210_priv *wil); | 465 | int wil_down(struct wil6210_priv *wil); |
336 | void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); | 466 | void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); |
467 | int wil_find_cid(struct wil6210_priv *wil, const u8 *mac); | ||
337 | 468 | ||
338 | void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr); | 469 | void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr); |
339 | void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr); | 470 | void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr); |
@@ -357,8 +488,11 @@ int wmi_echo(struct wil6210_priv *wil); | |||
357 | int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie); | 488 | int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie); |
358 | int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring); | 489 | int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring); |
359 | int wmi_p2p_cfg(struct wil6210_priv *wil, int channel); | 490 | int wmi_p2p_cfg(struct wil6210_priv *wil, int channel); |
491 | int wmi_rxon(struct wil6210_priv *wil, bool on); | ||
360 | int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r); | 492 | int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r); |
493 | int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason); | ||
361 | 494 | ||
495 | void wil6210_clear_irq(struct wil6210_priv *wil); | ||
362 | int wil6210_init_irq(struct wil6210_priv *wil, int irq); | 496 | int wil6210_init_irq(struct wil6210_priv *wil, int irq); |
363 | void wil6210_fini_irq(struct wil6210_priv *wil, int irq); | 497 | void wil6210_fini_irq(struct wil6210_priv *wil, int irq); |
364 | void wil6210_disable_irq(struct wil6210_priv *wil); | 498 | void wil6210_disable_irq(struct wil6210_priv *wil); |