1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
7 #include <linux/moduleparam.h>
8 #include <linux/if_arp.h>
9 #include <linux/etherdevice.h>
10 #include <linux/rtnetlink.h>
14 #include "txrx_edma.h"
16 #include "boot_loader.h"
18 #define WAIT_FOR_HALP_VOTE_MS 100
19 #define WAIT_FOR_SCAN_ABORT_MS 1000
20 #define WIL_DEFAULT_NUM_RX_STATUS_RINGS 1
21 #define WIL_BOARD_FILE_MAX_NAMELEN 128
23 bool debug_fw
; /* = false; */
24 module_param(debug_fw
, bool, 0444);
25 MODULE_PARM_DESC(debug_fw
, " do not perform card reset. For FW debug");
28 module_param(oob_mode
, byte
, 0444);
29 MODULE_PARM_DESC(oob_mode
,
30 " enable out of the box (OOB) mode in FW, for diagnostics and certification");
33 module_param(no_fw_recovery
, bool, 0644);
34 MODULE_PARM_DESC(no_fw_recovery
, " disable automatic FW error recovery");
36 /* if not set via modparam, will be set to default value of 1/8 of
37 * rx ring size during init flow
39 unsigned short rx_ring_overflow_thrsh
= WIL6210_RX_HIGH_TRSH_INIT
;
40 module_param(rx_ring_overflow_thrsh
, ushort
, 0444);
41 MODULE_PARM_DESC(rx_ring_overflow_thrsh
,
42 " RX ring overflow threshold in descriptors.");
44 /* We allow allocation of more than 1 page buffers to support large packets.
45 * It is suboptimal behavior performance wise in case MTU above page size.
47 unsigned int mtu_max
= TXRX_BUF_LEN_DEFAULT
- WIL_MAX_MPDU_OVERHEAD
;
48 static int mtu_max_set(const char *val
, const struct kernel_param
*kp
)
52 /* sets mtu_max directly. no need to restore it in case of
53 * illegal value since we assume this will fail insmod
55 ret
= param_set_uint(val
, kp
);
59 if (mtu_max
< 68 || mtu_max
> WIL_MAX_ETH_MTU
)
65 static const struct kernel_param_ops mtu_max_ops
= {
67 .get
= param_get_uint
,
70 module_param_cb(mtu_max
, &mtu_max_ops
, &mtu_max
, 0444);
71 MODULE_PARM_DESC(mtu_max
, " Max MTU value.");
73 static uint rx_ring_order
;
74 static uint tx_ring_order
= WIL_TX_RING_SIZE_ORDER_DEFAULT
;
75 static uint bcast_ring_order
= WIL_BCAST_RING_SIZE_ORDER_DEFAULT
;
77 static int ring_order_set(const char *val
, const struct kernel_param
*kp
)
82 ret
= kstrtouint(val
, 0, &x
);
86 if ((x
< WIL_RING_SIZE_ORDER_MIN
) || (x
> WIL_RING_SIZE_ORDER_MAX
))
89 *((uint
*)kp
->arg
) = x
;
94 static const struct kernel_param_ops ring_order_ops
= {
95 .set
= ring_order_set
,
96 .get
= param_get_uint
,
99 module_param_cb(rx_ring_order
, &ring_order_ops
, &rx_ring_order
, 0444);
100 MODULE_PARM_DESC(rx_ring_order
, " Rx ring order; size = 1 << order");
101 module_param_cb(tx_ring_order
, &ring_order_ops
, &tx_ring_order
, 0444);
102 MODULE_PARM_DESC(tx_ring_order
, " Tx ring order; size = 1 << order");
103 module_param_cb(bcast_ring_order
, &ring_order_ops
, &bcast_ring_order
, 0444);
104 MODULE_PARM_DESC(bcast_ring_order
, " Bcast ring order; size = 1 << order");
110 WIL_BOOT_DEVELOPMENT
,
114 WIL_SIG_STATUS_VANILLA
= 0x0,
115 WIL_SIG_STATUS_DEVELOPMENT
= 0x1,
116 WIL_SIG_STATUS_PRODUCTION
= 0x2,
117 WIL_SIG_STATUS_CORRUPTED_PRODUCTION
= 0x3,
120 #define RST_DELAY (20) /* msec, for loop in @wil_wait_device_ready */
121 #define RST_COUNT (1 + 1000/RST_DELAY) /* round up to be above 1 sec total */
123 #define PMU_READY_DELAY_MS (4) /* ms, for sleep in @wil_wait_device_ready */
125 #define OTP_HW_DELAY (200) /* usec, loop in @wil_wait_device_ready_talyn_mb */
126 /* round up to be above 2 ms total */
127 #define OTP_HW_COUNT (1 + 2000 / OTP_HW_DELAY)
130 * Due to a hardware issue,
131 * one has to read/write to/from NIC in 32-bit chunks;
132 * regular memcpy_fromio and siblings will
133 * not work on 64-bit platform - it uses 64-bit transactions
135 * Force 32-bit transactions to enable NIC on 64-bit platforms
137 * To avoid byte swap on big endian host, __raw_{read|write}l
138 * should be used - {read|write}l would swap bytes to provide
139 * little endian on PCI value in host endianness.
141 void wil_memcpy_fromio_32(void *dst
, const volatile void __iomem
*src
,
145 const volatile u32 __iomem
*s
= src
;
147 for (; count
>= 4; count
-= 4)
148 *d
++ = __raw_readl(s
++);
150 if (unlikely(count
)) {
151 /* count can be 1..3 */
152 u32 tmp
= __raw_readl(s
);
154 memcpy(d
, &tmp
, count
);
158 void wil_memcpy_toio_32(volatile void __iomem
*dst
, const void *src
,
161 volatile u32 __iomem
*d
= dst
;
164 for (; count
>= 4; count
-= 4)
165 __raw_writel(*s
++, d
++);
167 if (unlikely(count
)) {
168 /* count can be 1..3 */
171 memcpy(&tmp
, s
, count
);
172 __raw_writel(tmp
, d
);
176 /* Device memory access is prohibited while reset or suspend.
177 * wil_mem_access_lock protects accessing device memory in these cases
179 int wil_mem_access_lock(struct wil6210_priv
*wil
)
181 if (!down_read_trylock(&wil
->mem_lock
))
184 if (test_bit(wil_status_suspending
, wil
->status
) ||
185 test_bit(wil_status_suspended
, wil
->status
)) {
186 up_read(&wil
->mem_lock
);
193 void wil_mem_access_unlock(struct wil6210_priv
*wil
)
195 up_read(&wil
->mem_lock
);
198 static void wil_ring_fini_tx(struct wil6210_priv
*wil
, int id
)
200 struct wil_ring
*ring
= &wil
->ring_tx
[id
];
201 struct wil_ring_tx_data
*txdata
= &wil
->ring_tx_data
[id
];
203 lockdep_assert_held(&wil
->mutex
);
208 wil_dbg_misc(wil
, "vring_fini_tx: id=%d\n", id
);
210 spin_lock_bh(&txdata
->lock
);
211 txdata
->dot1x_open
= false;
212 txdata
->mid
= U8_MAX
;
213 txdata
->enabled
= 0; /* no Tx can be in progress or start anew */
214 spin_unlock_bh(&txdata
->lock
);
215 /* napi_synchronize waits for completion of the current NAPI but will
216 * not prevent the next NAPI run.
217 * Add a memory barrier to guarantee that txdata->enabled is zeroed
218 * before napi_synchronize so that the next scheduled NAPI will not
222 /* make sure NAPI won't touch this vring */
223 if (test_bit(wil_status_napi_en
, wil
->status
))
224 napi_synchronize(&wil
->napi_tx
);
226 wil
->txrx_ops
.ring_fini_tx(wil
, ring
);
229 static bool wil_vif_is_connected(struct wil6210_priv
*wil
, u8 mid
)
233 for (i
= 0; i
< wil
->max_assoc_sta
; i
++) {
234 if (wil
->sta
[i
].mid
== mid
&&
235 wil
->sta
[i
].status
== wil_sta_connected
)
242 static void wil_disconnect_cid_complete(struct wil6210_vif
*vif
, int cid
,
244 __acquires(&sta
->tid_rx_lock
) __releases(&sta
->tid_rx_lock
)
247 struct wil6210_priv
*wil
= vif_to_wil(vif
);
248 struct net_device
*ndev
= vif_to_ndev(vif
);
249 struct wireless_dev
*wdev
= vif_to_wdev(vif
);
250 struct wil_sta_info
*sta
= &wil
->sta
[cid
];
251 int min_ring_id
= wil_get_min_tx_ring_id(wil
);
255 "disconnect_cid_complete: CID %d, MID %d, status %d\n",
256 cid
, sta
->mid
, sta
->status
);
257 /* inform upper layers */
258 if (sta
->status
!= wil_sta_unused
) {
259 if (vif
->mid
!= sta
->mid
) {
260 wil_err(wil
, "STA MID mismatch with VIF MID(%d)\n",
264 switch (wdev
->iftype
) {
265 case NL80211_IFTYPE_AP
:
266 case NL80211_IFTYPE_P2P_GO
:
267 /* AP-like interface */
268 cfg80211_del_sta(ndev
, sta
->addr
, GFP_KERNEL
);
273 sta
->status
= wil_sta_unused
;
276 /* reorder buffers */
277 for (i
= 0; i
< WIL_STA_TID_NUM
; i
++) {
278 struct wil_tid_ampdu_rx
*r
;
280 spin_lock_bh(&sta
->tid_rx_lock
);
283 sta
->tid_rx
[i
] = NULL
;
284 wil_tid_ampdu_rx_free(wil
, r
);
286 spin_unlock_bh(&sta
->tid_rx_lock
);
289 memset(sta
->tid_crypto_rx
, 0, sizeof(sta
->tid_crypto_rx
));
290 memset(&sta
->group_crypto_rx
, 0, sizeof(sta
->group_crypto_rx
));
292 for (i
= min_ring_id
; i
< ARRAY_SIZE(wil
->ring_tx
); i
++) {
293 if (wil
->ring2cid_tid
[i
][0] == cid
)
294 wil_ring_fini_tx(wil
, i
);
297 memset(&sta
->stats
, 0, sizeof(sta
->stats
));
298 sta
->stats
.tx_latency_min_us
= U32_MAX
;
301 static void _wil6210_disconnect_complete(struct wil6210_vif
*vif
,
302 const u8
*bssid
, u16 reason_code
)
304 struct wil6210_priv
*wil
= vif_to_wil(vif
);
306 struct net_device
*ndev
;
307 struct wireless_dev
*wdev
;
309 ndev
= vif_to_ndev(vif
);
310 wdev
= vif_to_wdev(vif
);
313 wil_info(wil
, "disconnect_complete: bssid=%pM, reason=%d\n",
317 * - disconnect single STA, still connected
318 * - disconnect single STA, already disconnected
321 * For "disconnect all", there are 3 options:
323 * - bssid is broadcast address (ff:ff:ff:ff:ff:ff)
324 * - bssid is our MAC address
326 if (bssid
&& !is_broadcast_ether_addr(bssid
) &&
327 !ether_addr_equal_unaligned(ndev
->dev_addr
, bssid
)) {
328 cid
= wil_find_cid(wil
, vif
->mid
, bssid
);
330 "Disconnect complete %pM, CID=%d, reason=%d\n",
331 bssid
, cid
, reason_code
);
332 if (wil_cid_valid(wil
, cid
)) /* disconnect 1 peer */
333 wil_disconnect_cid_complete(vif
, cid
, reason_code
);
335 wil_dbg_misc(wil
, "Disconnect complete all\n");
336 for (cid
= 0; cid
< wil
->max_assoc_sta
; cid
++)
337 wil_disconnect_cid_complete(vif
, cid
, reason_code
);
341 switch (wdev
->iftype
) {
342 case NL80211_IFTYPE_STATION
:
343 case NL80211_IFTYPE_P2P_CLIENT
:
345 wil_update_net_queues_bh(wil
, vif
, NULL
, true);
346 netif_carrier_off(ndev
);
347 if (!wil_has_other_active_ifaces(wil
, ndev
, false, true))
348 wil6210_bus_request(wil
, WIL_DEFAULT_BUS_REQUEST_KBPS
);
350 if (test_and_clear_bit(wil_vif_fwconnected
, vif
->status
)) {
351 atomic_dec(&wil
->connected_vifs
);
352 cfg80211_disconnected(ndev
, reason_code
,
354 vif
->locally_generated_disc
,
356 vif
->locally_generated_disc
= false;
357 } else if (test_bit(wil_vif_fwconnecting
, vif
->status
)) {
358 cfg80211_connect_result(ndev
, bssid
, NULL
, 0, NULL
, 0,
359 WLAN_STATUS_UNSPECIFIED_FAILURE
,
363 clear_bit(wil_vif_fwconnecting
, vif
->status
);
364 clear_bit(wil_vif_ft_roam
, vif
->status
);
365 vif
->ptk_rekey_state
= WIL_REKEY_IDLE
;
368 case NL80211_IFTYPE_AP
:
369 case NL80211_IFTYPE_P2P_GO
:
370 if (!wil_vif_is_connected(wil
, vif
->mid
)) {
371 wil_update_net_queues_bh(wil
, vif
, NULL
, true);
372 if (test_and_clear_bit(wil_vif_fwconnected
,
374 atomic_dec(&wil
->connected_vifs
);
376 wil_update_net_queues_bh(wil
, vif
, NULL
, false);
384 static int wil_disconnect_cid(struct wil6210_vif
*vif
, int cid
,
387 struct wil6210_priv
*wil
= vif_to_wil(vif
);
388 struct wireless_dev
*wdev
= vif_to_wdev(vif
);
389 struct wil_sta_info
*sta
= &wil
->sta
[cid
];
390 bool del_sta
= false;
393 wil_dbg_misc(wil
, "disconnect_cid: CID %d, MID %d, status %d\n",
394 cid
, sta
->mid
, sta
->status
);
396 if (sta
->status
== wil_sta_unused
)
399 if (vif
->mid
!= sta
->mid
) {
400 wil_err(wil
, "STA MID mismatch with VIF MID(%d)\n", vif
->mid
);
404 /* inform lower layers */
405 if (wdev
->iftype
== NL80211_IFTYPE_AP
&& disable_ap_sme
)
408 /* disconnect by sending command disconnect/del_sta and wait
409 * synchronously for WMI_DISCONNECT_EVENTID event.
411 return wmi_disconnect_sta(vif
, sta
->addr
, reason_code
, del_sta
);
414 static void _wil6210_disconnect(struct wil6210_vif
*vif
, const u8
*bssid
,
417 struct wil6210_priv
*wil
;
418 struct net_device
*ndev
;
424 wil
= vif_to_wil(vif
);
425 ndev
= vif_to_ndev(vif
);
428 wil_info(wil
, "disconnect bssid=%pM, reason=%d\n", bssid
, reason_code
);
431 * - disconnect single STA, still connected
432 * - disconnect single STA, already disconnected
435 * For "disconnect all", there are 3 options:
437 * - bssid is broadcast address (ff:ff:ff:ff:ff:ff)
438 * - bssid is our MAC address
440 if (bssid
&& !is_broadcast_ether_addr(bssid
) &&
441 !ether_addr_equal_unaligned(ndev
->dev_addr
, bssid
)) {
442 cid
= wil_find_cid(wil
, vif
->mid
, bssid
);
443 wil_dbg_misc(wil
, "Disconnect %pM, CID=%d, reason=%d\n",
444 bssid
, cid
, reason_code
);
445 if (wil_cid_valid(wil
, cid
)) /* disconnect 1 peer */
446 wil_disconnect_cid(vif
, cid
, reason_code
);
448 wil_dbg_misc(wil
, "Disconnect all\n");
449 for (cid
= 0; cid
< wil
->max_assoc_sta
; cid
++)
450 wil_disconnect_cid(vif
, cid
, reason_code
);
453 /* call event handler manually after processing wmi_call,
454 * to avoid deadlock - disconnect event handler acquires
455 * wil->mutex while it is already held here
457 _wil6210_disconnect_complete(vif
, bssid
, reason_code
);
460 void wil_disconnect_worker(struct work_struct
*work
)
462 struct wil6210_vif
*vif
= container_of(work
,
463 struct wil6210_vif
, disconnect_worker
);
464 struct wil6210_priv
*wil
= vif_to_wil(vif
);
465 struct net_device
*ndev
= vif_to_ndev(vif
);
468 struct wmi_cmd_hdr wmi
;
469 struct wmi_disconnect_event evt
;
472 if (test_bit(wil_vif_fwconnected
, vif
->status
))
473 /* connect succeeded after all */
476 if (!test_bit(wil_vif_fwconnecting
, vif
->status
))
477 /* already disconnected */
480 memset(&reply
, 0, sizeof(reply
));
482 rc
= wmi_call(wil
, WMI_DISCONNECT_CMDID
, vif
->mid
, NULL
, 0,
483 WMI_DISCONNECT_EVENTID
, &reply
, sizeof(reply
),
484 WIL6210_DISCONNECT_TO_MS
);
486 wil_err(wil
, "disconnect error %d\n", rc
);
490 wil_update_net_queues_bh(wil
, vif
, NULL
, true);
491 netif_carrier_off(ndev
);
492 cfg80211_connect_result(ndev
, NULL
, NULL
, 0, NULL
, 0,
493 WLAN_STATUS_UNSPECIFIED_FAILURE
, GFP_KERNEL
);
494 clear_bit(wil_vif_fwconnecting
, vif
->status
);
497 static int wil_wait_for_recovery(struct wil6210_priv
*wil
)
499 if (wait_event_interruptible(wil
->wq
, wil
->recovery_state
!=
500 fw_recovery_pending
)) {
501 wil_err(wil
, "Interrupt, canceling recovery\n");
504 if (wil
->recovery_state
!= fw_recovery_running
) {
505 wil_info(wil
, "Recovery cancelled\n");
508 wil_info(wil
, "Proceed with recovery\n");
512 void wil_set_recovery_state(struct wil6210_priv
*wil
, int state
)
514 wil_dbg_misc(wil
, "set_recovery_state: %d -> %d\n",
515 wil
->recovery_state
, state
);
517 wil
->recovery_state
= state
;
518 wake_up_interruptible(&wil
->wq
);
521 bool wil_is_recovery_blocked(struct wil6210_priv
*wil
)
523 return no_fw_recovery
&& (wil
->recovery_state
== fw_recovery_pending
);
526 static void wil_fw_error_worker(struct work_struct
*work
)
528 struct wil6210_priv
*wil
= container_of(work
, struct wil6210_priv
,
530 struct net_device
*ndev
= wil
->main_ndev
;
531 struct wireless_dev
*wdev
;
533 wil_dbg_misc(wil
, "fw error worker\n");
535 if (!ndev
|| !(ndev
->flags
& IFF_UP
)) {
536 wil_info(wil
, "No recovery - interface is down\n");
539 wdev
= ndev
->ieee80211_ptr
;
541 /* increment @recovery_count if less then WIL6210_FW_RECOVERY_TO
542 * passed since last recovery attempt
544 if (time_is_after_jiffies(wil
->last_fw_recovery
+
545 WIL6210_FW_RECOVERY_TO
))
546 wil
->recovery_count
++;
548 wil
->recovery_count
= 1; /* fw was alive for a long time */
550 if (wil
->recovery_count
> WIL6210_FW_RECOVERY_RETRIES
) {
551 wil_err(wil
, "too many recovery attempts (%d), giving up\n",
552 wil
->recovery_count
);
556 wil
->last_fw_recovery
= jiffies
;
558 wil_info(wil
, "fw error recovery requested (try %d)...\n",
559 wil
->recovery_count
);
561 wil
->recovery_state
= fw_recovery_running
;
562 if (wil_wait_for_recovery(wil
) != 0)
566 mutex_lock(&wil
->mutex
);
567 /* Needs adaptation for multiple VIFs
568 * need to go over all VIFs and consider the appropriate
569 * recovery because each one can have different iftype.
571 switch (wdev
->iftype
) {
572 case NL80211_IFTYPE_STATION
:
573 case NL80211_IFTYPE_P2P_CLIENT
:
574 case NL80211_IFTYPE_MONITOR
:
575 /* silent recovery, upper layers will see disconnect */
579 case NL80211_IFTYPE_AP
:
580 case NL80211_IFTYPE_P2P_GO
:
581 if (no_fw_recovery
) /* upper layers do recovery */
583 /* silent recovery, upper layers will see disconnect */
586 mutex_unlock(&wil
->mutex
);
587 wil_cfg80211_ap_recovery(wil
);
588 mutex_lock(&wil
->mutex
);
589 wil_info(wil
, "... completed\n");
592 wil_err(wil
, "No recovery - unknown interface type %d\n",
597 mutex_unlock(&wil
->mutex
);
601 static int wil_find_free_ring(struct wil6210_priv
*wil
)
604 int min_ring_id
= wil_get_min_tx_ring_id(wil
);
606 for (i
= min_ring_id
; i
< WIL6210_MAX_TX_RINGS
; i
++) {
607 if (!wil
->ring_tx
[i
].va
)
613 int wil_ring_init_tx(struct wil6210_vif
*vif
, int cid
)
615 struct wil6210_priv
*wil
= vif_to_wil(vif
);
616 int rc
= -EINVAL
, ringid
;
619 wil_err(wil
, "No connection pending\n");
622 ringid
= wil_find_free_ring(wil
);
624 wil_err(wil
, "No free vring found\n");
628 wil_dbg_wmi(wil
, "Configure for connection CID %d MID %d ring %d\n",
629 cid
, vif
->mid
, ringid
);
631 rc
= wil
->txrx_ops
.ring_init_tx(vif
, ringid
, 1 << tx_ring_order
,
634 wil_err(wil
, "init TX for CID %d MID %d vring %d failed\n",
635 cid
, vif
->mid
, ringid
);
641 int wil_bcast_init(struct wil6210_vif
*vif
)
643 struct wil6210_priv
*wil
= vif_to_wil(vif
);
644 int ri
= vif
->bcast_ring
, rc
;
646 if (ri
>= 0 && wil
->ring_tx
[ri
].va
)
649 ri
= wil_find_free_ring(wil
);
653 vif
->bcast_ring
= ri
;
654 rc
= wil
->txrx_ops
.ring_init_bcast(vif
, ri
, 1 << bcast_ring_order
);
656 vif
->bcast_ring
= -1;
661 void wil_bcast_fini(struct wil6210_vif
*vif
)
663 struct wil6210_priv
*wil
= vif_to_wil(vif
);
664 int ri
= vif
->bcast_ring
;
669 vif
->bcast_ring
= -1;
670 wil_ring_fini_tx(wil
, ri
);
673 void wil_bcast_fini_all(struct wil6210_priv
*wil
)
676 struct wil6210_vif
*vif
;
678 for (i
= 0; i
< GET_MAX_VIFS(wil
); i
++) {
685 int wil_priv_init(struct wil6210_priv
*wil
)
689 wil_dbg_misc(wil
, "priv_init\n");
691 memset(wil
->sta
, 0, sizeof(wil
->sta
));
692 for (i
= 0; i
< WIL6210_MAX_CID
; i
++) {
693 spin_lock_init(&wil
->sta
[i
].tid_rx_lock
);
694 wil
->sta
[i
].mid
= U8_MAX
;
697 for (i
= 0; i
< WIL6210_MAX_TX_RINGS
; i
++) {
698 spin_lock_init(&wil
->ring_tx_data
[i
].lock
);
699 wil
->ring2cid_tid
[i
][0] = WIL6210_MAX_CID
;
702 mutex_init(&wil
->mutex
);
703 mutex_init(&wil
->vif_mutex
);
704 mutex_init(&wil
->wmi_mutex
);
705 mutex_init(&wil
->halp
.lock
);
707 init_completion(&wil
->wmi_ready
);
708 init_completion(&wil
->wmi_call
);
709 init_completion(&wil
->halp
.comp
);
711 INIT_WORK(&wil
->wmi_event_worker
, wmi_event_worker
);
712 INIT_WORK(&wil
->fw_error_worker
, wil_fw_error_worker
);
714 INIT_LIST_HEAD(&wil
->pending_wmi_ev
);
715 spin_lock_init(&wil
->wmi_ev_lock
);
716 spin_lock_init(&wil
->net_queue_lock
);
717 spin_lock_init(&wil
->eap_lock
);
719 init_waitqueue_head(&wil
->wq
);
720 init_rwsem(&wil
->mem_lock
);
722 wil
->wmi_wq
= create_singlethread_workqueue(WIL_NAME
"_wmi");
726 wil
->wq_service
= create_singlethread_workqueue(WIL_NAME
"_service");
727 if (!wil
->wq_service
)
730 wil
->last_fw_recovery
= jiffies
;
731 wil
->tx_interframe_timeout
= WIL6210_ITR_TX_INTERFRAME_TIMEOUT_DEFAULT
;
732 wil
->rx_interframe_timeout
= WIL6210_ITR_RX_INTERFRAME_TIMEOUT_DEFAULT
;
733 wil
->tx_max_burst_duration
= WIL6210_ITR_TX_MAX_BURST_DURATION_DEFAULT
;
734 wil
->rx_max_burst_duration
= WIL6210_ITR_RX_MAX_BURST_DURATION_DEFAULT
;
736 if (rx_ring_overflow_thrsh
== WIL6210_RX_HIGH_TRSH_INIT
)
737 rx_ring_overflow_thrsh
= WIL6210_RX_HIGH_TRSH_DEFAULT
;
739 wil
->ps_profile
= WMI_PS_PROFILE_TYPE_DEFAULT
;
741 wil
->wakeup_trigger
= WMI_WAKEUP_TRIGGER_UCAST
|
742 WMI_WAKEUP_TRIGGER_BCAST
;
743 memset(&wil
->suspend_stats
, 0, sizeof(wil
->suspend_stats
));
744 wil
->ring_idle_trsh
= 16;
746 wil
->reply_mid
= U8_MAX
;
748 wil
->max_assoc_sta
= max_assoc_sta
;
750 /* edma configuration can be updated via debugfs before allocation */
751 wil
->num_rx_status_rings
= WIL_DEFAULT_NUM_RX_STATUS_RINGS
;
752 wil
->tx_status_ring_order
= WIL_TX_SRING_SIZE_ORDER_DEFAULT
;
754 /* Rx status ring size should be bigger than the number of RX buffers
755 * in order to prevent backpressure on the status ring, which may
758 wil
->rx_status_ring_order
= WIL_RX_SRING_SIZE_ORDER_DEFAULT
;
759 /* Number of RX buffer IDs should be bigger than the RX descriptor
760 * ring size as in HW reorder flow, the HW can consume additional
761 * buffers before releasing the previous ones.
763 wil
->rx_buff_id_count
= WIL_RX_BUFF_ARR_SIZE_DEFAULT
;
765 wil
->amsdu_en
= true;
770 destroy_workqueue(wil
->wmi_wq
);
775 void wil6210_bus_request(struct wil6210_priv
*wil
, u32 kbps
)
777 if (wil
->platform_ops
.bus_request
) {
778 wil
->bus_request_kbps
= kbps
;
779 wil
->platform_ops
.bus_request(wil
->platform_handle
, kbps
);
784 * wil6210_disconnect - disconnect one connection
785 * @vif: virtual interface context
786 * @bssid: peer to disconnect, NULL to disconnect all
787 * @reason_code: Reason code for the Disassociation frame
789 * Disconnect and release associated resources. Issue WMI
790 * command(s) to trigger MAC disconnect. When command was issued
791 * successfully, call the wil6210_disconnect_complete function
792 * to handle the event synchronously
794 void wil6210_disconnect(struct wil6210_vif
*vif
, const u8
*bssid
,
797 struct wil6210_priv
*wil
= vif_to_wil(vif
);
799 wil_dbg_misc(wil
, "disconnecting\n");
801 del_timer_sync(&vif
->connect_timer
);
802 _wil6210_disconnect(vif
, bssid
, reason_code
);
806 * wil6210_disconnect_complete - handle disconnect event
807 * @vif: virtual interface context
808 * @bssid: peer to disconnect, NULL to disconnect all
809 * @reason_code: Reason code for the Disassociation frame
811 * Release associated resources and indicate upper layers the
812 * connection is terminated.
814 void wil6210_disconnect_complete(struct wil6210_vif
*vif
, const u8
*bssid
,
817 struct wil6210_priv
*wil
= vif_to_wil(vif
);
819 wil_dbg_misc(wil
, "got disconnect\n");
821 del_timer_sync(&vif
->connect_timer
);
822 _wil6210_disconnect_complete(vif
, bssid
, reason_code
);
825 void wil_priv_deinit(struct wil6210_priv
*wil
)
827 wil_dbg_misc(wil
, "priv_deinit\n");
829 wil_set_recovery_state(wil
, fw_recovery_idle
);
830 cancel_work_sync(&wil
->fw_error_worker
);
831 wmi_event_flush(wil
);
832 destroy_workqueue(wil
->wq_service
);
833 destroy_workqueue(wil
->wmi_wq
);
834 kfree(wil
->brd_info
);
837 static void wil_shutdown_bl(struct wil6210_priv
*wil
)
841 wil_s(wil
, RGF_USER_BL
+
842 offsetof(struct bl_dedicated_registers_v1
,
843 bl_shutdown_handshake
), BL_SHUTDOWN_HS_GRTD
);
845 usleep_range(100, 150);
847 val
= wil_r(wil
, RGF_USER_BL
+
848 offsetof(struct bl_dedicated_registers_v1
,
849 bl_shutdown_handshake
));
850 if (val
& BL_SHUTDOWN_HS_RTD
) {
851 wil_dbg_misc(wil
, "BL is ready for halt\n");
855 wil_err(wil
, "BL did not report ready for halt\n");
858 /* this format is used by ARC embedded CPU for instruction memory */
859 static inline u32
ARC_me_imm32(u32 d
)
861 return ((d
& 0xffff0000) >> 16) | ((d
& 0x0000ffff) << 16);
864 /* defines access to interrupt vectors for wil_freeze_bl */
865 #define ARC_IRQ_VECTOR_OFFSET(N) ((N) * 8)
866 /* ARC long jump instruction */
867 #define ARC_JAL_INST (0x20200f80)
869 static void wil_freeze_bl(struct wil6210_priv
*wil
)
872 u32 ivt3
= ARC_IRQ_VECTOR_OFFSET(3);
874 jal
= wil_r(wil
, wil
->iccm_base
+ ivt3
);
875 if (jal
!= ARC_me_imm32(ARC_JAL_INST
)) {
876 wil_dbg_misc(wil
, "invalid IVT entry found, skipping\n");
880 /* prevent the target from entering deep sleep
881 * and disabling memory access
883 saved
= wil_r(wil
, RGF_USER_USAGE_8
);
884 wil_w(wil
, RGF_USER_USAGE_8
, saved
| BIT_USER_PREVENT_DEEP_SLEEP
);
885 usleep_range(20, 25); /* let the BL process the bit */
887 /* redirect to endless loop in the INT_L1 context and let it trap */
888 wil_w(wil
, wil
->iccm_base
+ ivt3
+ 4, ARC_me_imm32(ivt3
));
889 usleep_range(20, 25); /* let the BL get into the trap */
891 /* verify the BL is frozen */
892 upc
= wil_r(wil
, RGF_USER_CPU_PC
);
893 if (upc
< ivt3
|| (upc
> (ivt3
+ 8)))
894 wil_dbg_misc(wil
, "BL freeze failed, PC=0x%08X\n", upc
);
896 wil_w(wil
, RGF_USER_USAGE_8
, saved
);
899 static void wil_bl_prepare_halt(struct wil6210_priv
*wil
)
903 /* before halting device CPU driver must make sure BL is not accessing
904 * host memory. This is done differently depending on BL version:
905 * 1. For very old BL versions the procedure is skipped
907 * 2. For old BL version we use a special trick to freeze the BL
908 * 3. For new BL versions we shutdown the BL using handshake procedure.
910 tmp
= wil_r(wil
, RGF_USER_BL
+
911 offsetof(struct bl_dedicated_registers_v0
,
912 boot_loader_struct_version
));
914 wil_dbg_misc(wil
, "old BL, skipping halt preparation\n");
918 tmp
= wil_r(wil
, RGF_USER_BL
+
919 offsetof(struct bl_dedicated_registers_v1
,
920 bl_shutdown_handshake
));
921 ver
= BL_SHUTDOWN_HS_PROT_VER(tmp
);
924 wil_shutdown_bl(wil
);
929 static inline void wil_halt_cpu(struct wil6210_priv
*wil
)
931 if (wil
->hw_version
>= HW_VER_TALYN_MB
) {
932 wil_w(wil
, RGF_USER_USER_CPU_0_TALYN_MB
,
933 BIT_USER_USER_CPU_MAN_RST
);
934 wil_w(wil
, RGF_USER_MAC_CPU_0_TALYN_MB
,
935 BIT_USER_MAC_CPU_MAN_RST
);
937 wil_w(wil
, RGF_USER_USER_CPU_0
, BIT_USER_USER_CPU_MAN_RST
);
938 wil_w(wil
, RGF_USER_MAC_CPU_0
, BIT_USER_MAC_CPU_MAN_RST
);
942 static inline void wil_release_cpu(struct wil6210_priv
*wil
)
945 if (wil
->hw_version
>= HW_VER_TALYN_MB
)
946 wil_w(wil
, RGF_USER_USER_CPU_0_TALYN_MB
, 1);
948 wil_w(wil
, RGF_USER_USER_CPU_0
, 1);
951 static void wil_set_oob_mode(struct wil6210_priv
*wil
, u8 mode
)
953 wil_info(wil
, "oob_mode to %d\n", mode
);
956 wil_c(wil
, RGF_USER_USAGE_6
, BIT_USER_OOB_MODE
|
957 BIT_USER_OOB_R2_MODE
);
960 wil_c(wil
, RGF_USER_USAGE_6
, BIT_USER_OOB_R2_MODE
);
961 wil_s(wil
, RGF_USER_USAGE_6
, BIT_USER_OOB_MODE
);
964 wil_c(wil
, RGF_USER_USAGE_6
, BIT_USER_OOB_MODE
);
965 wil_s(wil
, RGF_USER_USAGE_6
, BIT_USER_OOB_R2_MODE
);
968 wil_err(wil
, "invalid oob_mode: %d\n", mode
);
972 static int wil_wait_device_ready(struct wil6210_priv
*wil
, int no_flash
)
977 /* wait until device ready. */
979 msleep(PMU_READY_DELAY_MS
);
981 wil_dbg_misc(wil
, "Reset completed\n");
985 x
= wil_r(wil
, RGF_USER_BL
+
986 offsetof(struct bl_dedicated_registers_v0
,
989 wil_dbg_misc(wil
, "BL.ready 0x%08x => 0x%08x\n",
993 if (delay
++ > RST_COUNT
) {
994 wil_err(wil
, "Reset not completed, bl.ready 0x%08x\n",
998 } while (x
!= BL_READY
);
1000 wil_dbg_misc(wil
, "Reset completed in %d ms\n",
1007 static int wil_wait_device_ready_talyn_mb(struct wil6210_priv
*wil
)
1010 u8 signature_status
;
1011 bool otp_signature_err
;
1012 bool hw_section_done
;
1016 /* Wait for OTP signature test to complete */
1017 usleep_range(2000, 2200);
1019 wil
->boot_config
= WIL_BOOT_ERR
;
1021 /* Poll until OTP signature status is valid.
1022 * In vanilla and development modes, when signature test is complete
1023 * HW sets BIT_OTP_SIGNATURE_ERR_TALYN_MB.
1024 * In production mode BIT_OTP_SIGNATURE_ERR_TALYN_MB remains 0, poll
1025 * for signature status change to 2 or 3.
1028 otp_hw
= wil_r(wil
, RGF_USER_OTP_HW_RD_MACHINE_1
);
1029 signature_status
= WIL_GET_BITS(otp_hw
, 8, 9);
1030 otp_signature_err
= otp_hw
& BIT_OTP_SIGNATURE_ERR_TALYN_MB
;
1032 if (otp_signature_err
&&
1033 signature_status
== WIL_SIG_STATUS_VANILLA
) {
1034 wil
->boot_config
= WIL_BOOT_VANILLA
;
1037 if (otp_signature_err
&&
1038 signature_status
== WIL_SIG_STATUS_DEVELOPMENT
) {
1039 wil
->boot_config
= WIL_BOOT_DEVELOPMENT
;
1042 if (!otp_signature_err
&&
1043 signature_status
== WIL_SIG_STATUS_PRODUCTION
) {
1044 wil
->boot_config
= WIL_BOOT_PRODUCTION
;
1047 if (!otp_signature_err
&&
1049 WIL_SIG_STATUS_CORRUPTED_PRODUCTION
) {
1050 /* Unrecognized OTP signature found. Possibly a
1051 * corrupted production signature, access control
1052 * is applied as in production mode, therefore
1055 wil
->boot_config
= WIL_BOOT_PRODUCTION
;
1058 if (delay
++ > OTP_HW_COUNT
)
1061 usleep_range(OTP_HW_DELAY
, OTP_HW_DELAY
+ 10);
1062 } while (!otp_signature_err
&& signature_status
== 0);
1064 if (wil
->boot_config
== WIL_BOOT_ERR
) {
1066 "invalid boot config, signature_status %d otp_signature_err %d\n",
1067 signature_status
, otp_signature_err
);
1072 "signature test done in %d usec, otp_hw 0x%x, boot_config %d\n",
1073 delay
* OTP_HW_DELAY
, otp_hw
, wil
->boot_config
);
1075 if (wil
->boot_config
== WIL_BOOT_VANILLA
)
1076 /* Assuming not SPI boot (currently not supported) */
1079 hw_section_done
= otp_hw
& BIT_OTP_HW_SECTION_DONE_TALYN_MB
;
1082 while (!hw_section_done
) {
1085 otp_hw
= wil_r(wil
, RGF_USER_OTP_HW_RD_MACHINE_1
);
1086 hw_section_done
= otp_hw
& BIT_OTP_HW_SECTION_DONE_TALYN_MB
;
1088 if (delay
++ > RST_COUNT
) {
1089 wil_err(wil
, "TO waiting for hw_section_done\n");
1094 wil_dbg_misc(wil
, "HW section done in %d ms\n", delay
* RST_DELAY
);
1096 otp_qc_secured
= wil_r(wil
, RGF_OTP_QC_SECURED
);
1097 wil
->secured_boot
= otp_qc_secured
& BIT_BOOT_FROM_ROM
? 1 : 0;
1098 wil_dbg_misc(wil
, "secured boot is %sabled\n",
1099 wil
->secured_boot
? "en" : "dis");
1102 wil_dbg_misc(wil
, "Reset completed\n");
1107 static int wil_target_reset(struct wil6210_priv
*wil
, int no_flash
)
1112 wil_dbg_misc(wil
, "Resetting \"%s\"...\n", wil
->hw_name
);
1114 if (wil
->hw_version
< HW_VER_TALYN
) {
1115 /* Clear MAC link up */
1116 wil_s(wil
, RGF_HP_CTRL
, BIT(15));
1117 wil_s(wil
, RGF_USER_CLKS_CTL_SW_RST_MASK_0
,
1118 BIT_HPAL_PERST_FROM_PAD
);
1119 wil_s(wil
, RGF_USER_CLKS_CTL_SW_RST_MASK_0
, BIT_CAR_PERST_RST
);
1125 /* clear all boot loader "ready" bits */
1126 wil_w(wil
, RGF_USER_BL
+
1127 offsetof(struct bl_dedicated_registers_v0
,
1128 boot_loader_ready
), 0);
1129 /* this should be safe to write even with old BLs */
1130 wil_w(wil
, RGF_USER_BL
+
1131 offsetof(struct bl_dedicated_registers_v1
,
1132 bl_shutdown_handshake
), 0);
1134 /* Clear Fw Download notification */
1135 wil_c(wil
, RGF_USER_USAGE_6
, BIT(0));
1137 wil_s(wil
, RGF_CAF_OSC_CONTROL
, BIT_CAF_OSC_XTAL_EN
);
1138 /* XTAL stabilization should take about 3ms */
1139 usleep_range(5000, 7000);
1140 x
= wil_r(wil
, RGF_CAF_PLL_LOCK_STATUS
);
1141 if (!(x
& BIT_CAF_OSC_DIG_XTAL_STABLE
)) {
1142 wil_err(wil
, "Xtal stabilization timeout\n"
1143 "RGF_CAF_PLL_LOCK_STATUS = 0x%08x\n", x
);
1146 /* switch 10k to XTAL*/
1147 wil_c(wil
, RGF_USER_SPARROW_M_4
, BIT_SPARROW_M_4_SEL_SLEEP_OR_REF
);
1149 wil_c(wil
, RGF_USER_CLKS_CTL_0
, BIT_USER_CLKS_CAR_AHB_SW_SEL
);
1151 wil_w(wil
, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0
, 0x3ff81f);
1152 wil_w(wil
, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1
, 0xf);
1154 if (wil
->hw_version
>= HW_VER_TALYN_MB
) {
1155 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_2
, 0x7e000000);
1156 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_1
, 0x0000003f);
1157 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_3
, 0xc00000f0);
1158 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_0
, 0xffe7fe00);
1160 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_2
, 0xfe000000);
1161 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_1
, 0x0000003f);
1162 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_3
, 0x000000f0);
1163 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_0
, 0xffe7fe00);
1166 wil_w(wil
, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0
, 0x0);
1167 wil_w(wil
, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1
, 0x0);
1169 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_3
, 0);
1170 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_2
, 0);
1171 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_1
, 0);
1172 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_0
, 0);
1174 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_3
, 0x00000003);
1175 /* reset A2 PCIE AHB */
1176 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_2
, 0x00008000);
1178 wil_w(wil
, RGF_USER_CLKS_CTL_SW_RST_VEC_0
, 0);
1180 if (wil
->hw_version
== HW_VER_TALYN_MB
)
1181 rc
= wil_wait_device_ready_talyn_mb(wil
);
1183 rc
= wil_wait_device_ready(wil
, no_flash
);
1187 wil_c(wil
, RGF_USER_CLKS_CTL_0
, BIT_USER_CLKS_RST_PWGD
);
1189 /* enable fix for HW bug related to the SA/DA swap in AP Rx */
1190 wil_s(wil
, RGF_DMA_OFUL_NID_0
, BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN
|
1191 BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC
);
1193 if (wil
->hw_version
< HW_VER_TALYN_MB
&& no_flash
) {
1194 /* Reset OTP HW vectors to fit 40MHz */
1195 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME1
, 0x60001);
1196 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME2
, 0x20027);
1197 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME3
, 0x1);
1198 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME4
, 0x20027);
1199 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME5
, 0x30003);
1200 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME6
, 0x20002);
1201 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME7
, 0x60001);
1202 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME8
, 0x60001);
1203 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME9
, 0x60001);
1204 wil_w(wil
, RGF_USER_XPM_IFC_RD_TIME10
, 0x60001);
1205 wil_w(wil
, RGF_USER_XPM_RD_DOUT_SAMPLE_TIME
, 0x57);
1211 static void wil_collect_fw_info(struct wil6210_priv
*wil
)
1213 struct wiphy
*wiphy
= wil_to_wiphy(wil
);
1217 wil_refresh_fw_capabilities(wil
);
1219 rc
= wmi_get_mgmt_retry(wil
, &retry_short
);
1221 wiphy
->retry_short
= retry_short
;
1222 wil_dbg_misc(wil
, "FW retry_short: %d\n", retry_short
);
1226 void wil_refresh_fw_capabilities(struct wil6210_priv
*wil
)
1228 struct wiphy
*wiphy
= wil_to_wiphy(wil
);
1231 wil
->keep_radio_on_during_sleep
=
1232 test_bit(WIL_PLATFORM_CAPA_RADIO_ON_IN_SUSPEND
,
1233 wil
->platform_capa
) &&
1234 test_bit(WMI_FW_CAPABILITY_D3_SUSPEND
, wil
->fw_capabilities
);
1236 wil_info(wil
, "keep_radio_on_during_sleep (%d)\n",
1237 wil
->keep_radio_on_during_sleep
);
1239 if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING
, wil
->fw_capabilities
))
1240 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
1242 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_UNSPEC
;
1244 if (test_bit(WMI_FW_CAPABILITY_PNO
, wil
->fw_capabilities
)) {
1245 wiphy
->max_sched_scan_reqs
= 1;
1246 wiphy
->max_sched_scan_ssids
= WMI_MAX_PNO_SSID_NUM
;
1247 wiphy
->max_match_sets
= WMI_MAX_PNO_SSID_NUM
;
1248 wiphy
->max_sched_scan_ie_len
= WMI_MAX_IE_LEN
;
1249 wiphy
->max_sched_scan_plans
= WMI_MAX_PLANS_NUM
;
1252 if (test_bit(WMI_FW_CAPABILITY_TX_REQ_EXT
, wil
->fw_capabilities
))
1253 wiphy
->flags
|= WIPHY_FLAG_OFFCHAN_TX
;
1255 if (wil
->platform_ops
.set_features
) {
1256 features
= (test_bit(WMI_FW_CAPABILITY_REF_CLOCK_CONTROL
,
1257 wil
->fw_capabilities
) &&
1258 test_bit(WIL_PLATFORM_CAPA_EXT_CLK
,
1259 wil
->platform_capa
)) ?
1260 BIT(WIL_PLATFORM_FEATURE_FW_EXT_CLK_CONTROL
) : 0;
1262 if (wil
->n_msi
== 3)
1263 features
|= BIT(WIL_PLATFORM_FEATURE_TRIPLE_MSI
);
1265 wil
->platform_ops
.set_features(wil
->platform_handle
, features
);
1268 if (test_bit(WMI_FW_CAPABILITY_BACK_WIN_SIZE_64
,
1269 wil
->fw_capabilities
)) {
1270 wil
->max_agg_wsize
= WIL_MAX_AGG_WSIZE_64
;
1271 wil
->max_ampdu_size
= WIL_MAX_AMPDU_SIZE_128
;
1273 wil
->max_agg_wsize
= WIL_MAX_AGG_WSIZE
;
1274 wil
->max_ampdu_size
= WIL_MAX_AMPDU_SIZE
;
1277 update_supported_bands(wil
);
1280 void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring
*r
)
1282 le32_to_cpus(&r
->base
);
1283 le16_to_cpus(&r
->entry_size
);
1284 le16_to_cpus(&r
->size
);
1285 le32_to_cpus(&r
->tail
);
1286 le32_to_cpus(&r
->head
);
1289 /* construct actual board file name to use */
1290 void wil_get_board_file(struct wil6210_priv
*wil
, char *buf
, size_t len
)
1292 const char *board_file
;
1293 const char *wil_talyn_fw_name
= ftm_mode
? WIL_FW_NAME_FTM_TALYN
:
1296 if (wil
->board_file
) {
1297 board_file
= wil
->board_file
;
1299 /* If specific FW file is used for Talyn,
1300 * use specific board file
1302 if (strcmp(wil
->wil_fw_name
, wil_talyn_fw_name
) == 0)
1303 board_file
= WIL_BRD_NAME_TALYN
;
1305 board_file
= WIL_BOARD_FILE_NAME
;
1308 strscpy(buf
, board_file
, len
);
1311 static int wil_get_bl_info(struct wil6210_priv
*wil
)
1313 struct net_device
*ndev
= wil
->main_ndev
;
1314 struct wiphy
*wiphy
= wil_to_wiphy(wil
);
1316 struct bl_dedicated_registers_v0 bl0
;
1317 struct bl_dedicated_registers_v1 bl1
;
1323 wil_memcpy_fromio_32(&bl
, wil
->csr
+ HOSTADDR(RGF_USER_BL
),
1325 bl_ver
= le32_to_cpu(bl
.bl0
.boot_loader_struct_version
);
1326 mac
= bl
.bl0
.mac_address
;
1329 le32_to_cpus(&bl
.bl0
.rf_type
);
1330 le32_to_cpus(&bl
.bl0
.baseband_type
);
1331 rf_status
= 0; /* actually, unknown */
1333 "Boot Loader struct v%d: MAC = %pM RF = 0x%08x bband = 0x%08x\n",
1335 bl
.bl0
.rf_type
, bl
.bl0
.baseband_type
);
1336 wil_info(wil
, "Boot Loader build unknown for struct v0\n");
1338 le16_to_cpus(&bl
.bl1
.rf_type
);
1339 rf_status
= le16_to_cpu(bl
.bl1
.rf_status
);
1340 le32_to_cpus(&bl
.bl1
.baseband_type
);
1341 le16_to_cpus(&bl
.bl1
.bl_version_subminor
);
1342 le16_to_cpus(&bl
.bl1
.bl_version_build
);
1344 "Boot Loader struct v%d: MAC = %pM RF = 0x%04x (status 0x%04x) bband = 0x%08x\n",
1346 bl
.bl1
.rf_type
, rf_status
,
1347 bl
.bl1
.baseband_type
);
1348 wil_info(wil
, "Boot Loader build %d.%d.%d.%d\n",
1349 bl
.bl1
.bl_version_major
, bl
.bl1
.bl_version_minor
,
1350 bl
.bl1
.bl_version_subminor
, bl
.bl1
.bl_version_build
);
1353 if (!is_valid_ether_addr(mac
)) {
1354 wil_err(wil
, "BL: Invalid MAC %pM\n", mac
);
1358 ether_addr_copy(ndev
->perm_addr
, mac
);
1359 ether_addr_copy(wiphy
->perm_addr
, mac
);
1360 if (!is_valid_ether_addr(ndev
->dev_addr
))
1361 eth_hw_addr_set(ndev
, mac
);
1363 if (rf_status
) {/* bad RF cable? */
1364 wil_err(wil
, "RF communication error 0x%04x",
1372 static void wil_bl_crash_info(struct wil6210_priv
*wil
, bool is_err
)
1374 u32 bl_assert_code
, bl_assert_blink
, bl_magic_number
;
1375 u32 bl_ver
= wil_r(wil
, RGF_USER_BL
+
1376 offsetof(struct bl_dedicated_registers_v0
,
1377 boot_loader_struct_version
));
1382 bl_assert_code
= wil_r(wil
, RGF_USER_BL
+
1383 offsetof(struct bl_dedicated_registers_v1
,
1385 bl_assert_blink
= wil_r(wil
, RGF_USER_BL
+
1386 offsetof(struct bl_dedicated_registers_v1
,
1388 bl_magic_number
= wil_r(wil
, RGF_USER_BL
+
1389 offsetof(struct bl_dedicated_registers_v1
,
1394 "BL assert code 0x%08x blink 0x%08x magic 0x%08x\n",
1395 bl_assert_code
, bl_assert_blink
, bl_magic_number
);
1398 "BL assert code 0x%08x blink 0x%08x magic 0x%08x\n",
1399 bl_assert_code
, bl_assert_blink
, bl_magic_number
);
1403 static int wil_get_otp_info(struct wil6210_priv
*wil
)
1405 struct net_device
*ndev
= wil
->main_ndev
;
1406 struct wiphy
*wiphy
= wil_to_wiphy(wil
);
1410 /* OEM MAC has precedence */
1411 mac_addr
= RGF_OTP_OEM_MAC
;
1412 wil_memcpy_fromio_32(mac
, wil
->csr
+ HOSTADDR(mac_addr
), sizeof(mac
));
1414 if (is_valid_ether_addr(mac
)) {
1415 wil_info(wil
, "using OEM MAC %pM\n", mac
);
1417 if (wil
->hw_version
>= HW_VER_TALYN_MB
)
1418 mac_addr
= RGF_OTP_MAC_TALYN_MB
;
1420 mac_addr
= RGF_OTP_MAC
;
1422 wil_memcpy_fromio_32(mac
, wil
->csr
+ HOSTADDR(mac_addr
),
1426 if (!is_valid_ether_addr(mac
)) {
1427 wil_err(wil
, "Invalid MAC %pM\n", mac
);
1431 ether_addr_copy(ndev
->perm_addr
, mac
);
1432 ether_addr_copy(wiphy
->perm_addr
, mac
);
1433 if (!is_valid_ether_addr(ndev
->dev_addr
))
1434 eth_hw_addr_set(ndev
, mac
);
1439 static int wil_wait_for_fw_ready(struct wil6210_priv
*wil
)
1441 ulong to
= msecs_to_jiffies(2000);
1442 ulong left
= wait_for_completion_timeout(&wil
->wmi_ready
, to
);
1445 wil_err(wil
, "Firmware not ready\n");
1448 wil_info(wil
, "FW ready after %d ms. HW version 0x%08x\n",
1449 jiffies_to_msecs(to
-left
), wil
->hw_version
);
1454 void wil_abort_scan(struct wil6210_vif
*vif
, bool sync
)
1456 struct wil6210_priv
*wil
= vif_to_wil(vif
);
1458 struct cfg80211_scan_info info
= {
1462 lockdep_assert_held(&wil
->vif_mutex
);
1464 if (!vif
->scan_request
)
1467 wil_dbg_misc(wil
, "Abort scan_request 0x%p\n", vif
->scan_request
);
1468 del_timer_sync(&vif
->scan_timer
);
1469 mutex_unlock(&wil
->vif_mutex
);
1470 rc
= wmi_abort_scan(vif
);
1472 wait_event_interruptible_timeout(wil
->wq
, !vif
->scan_request
,
1474 WAIT_FOR_SCAN_ABORT_MS
));
1476 mutex_lock(&wil
->vif_mutex
);
1477 if (vif
->scan_request
) {
1478 cfg80211_scan_done(vif
->scan_request
, &info
);
1479 vif
->scan_request
= NULL
;
1483 void wil_abort_scan_all_vifs(struct wil6210_priv
*wil
, bool sync
)
1487 lockdep_assert_held(&wil
->vif_mutex
);
1489 for (i
= 0; i
< GET_MAX_VIFS(wil
); i
++) {
1490 struct wil6210_vif
*vif
= wil
->vifs
[i
];
1493 wil_abort_scan(vif
, sync
);
1497 int wil_ps_update(struct wil6210_priv
*wil
, enum wmi_ps_profile_type ps_profile
)
1501 if (!test_bit(WMI_FW_CAPABILITY_PS_CONFIG
, wil
->fw_capabilities
)) {
1502 wil_err(wil
, "set_power_mgmt not supported\n");
1506 rc
= wmi_ps_dev_profile_cfg(wil
, ps_profile
);
1508 wil_err(wil
, "wmi_ps_dev_profile_cfg failed (%d)\n", rc
);
1510 wil
->ps_profile
= ps_profile
;
1515 static void wil_pre_fw_config(struct wil6210_priv
*wil
)
1517 wil_clear_fw_log_addr(wil
);
1518 /* Mark FW as loaded from host */
1519 wil_s(wil
, RGF_USER_USAGE_6
, 1);
1521 /* clear any interrupts which on-card-firmware
1524 wil6210_clear_irq(wil
);
1525 /* CAF_ICR - clear and mask */
1526 /* it is W1C, clear by writing back same value */
1527 if (wil
->hw_version
< HW_VER_TALYN_MB
) {
1528 wil_s(wil
, RGF_CAF_ICR
+ offsetof(struct RGF_ICR
, ICR
), 0);
1529 wil_w(wil
, RGF_CAF_ICR
+ offsetof(struct RGF_ICR
, IMV
), ~0);
1531 /* clear PAL_UNIT_ICR (potential D0->D3 leftover)
1532 * In Talyn-MB host cannot access this register due to
1533 * access control, hence PAL_UNIT_ICR is cleared by the FW
1535 if (wil
->hw_version
< HW_VER_TALYN_MB
)
1536 wil_s(wil
, RGF_PAL_UNIT_ICR
+ offsetof(struct RGF_ICR
, ICR
),
1539 if (wil
->fw_calib_result
> 0) {
1540 __le32 val
= cpu_to_le32(wil
->fw_calib_result
|
1541 (CALIB_RESULT_SIGNATURE
<< 8));
1542 wil_w(wil
, RGF_USER_FW_CALIB_RESULT
, (u32 __force
)val
);
1546 static int wil_restore_vifs(struct wil6210_priv
*wil
)
1548 struct wil6210_vif
*vif
;
1549 struct net_device
*ndev
;
1550 struct wireless_dev
*wdev
;
1553 for (i
= 0; i
< GET_MAX_VIFS(wil
); i
++) {
1557 vif
->ap_isolate
= 0;
1559 ndev
= vif_to_ndev(vif
);
1560 wdev
= vif_to_wdev(vif
);
1561 rc
= wmi_port_allocate(wil
, vif
->mid
, ndev
->dev_addr
,
1564 wil_err(wil
, "fail to restore VIF %d type %d, rc %d\n",
1565 i
, wdev
->iftype
, rc
);
1575 * Clear FW and ucode log start addr to indicate FW log is not ready. The host
1576 * driver clears the addresses before FW starts and FW initializes the address
1577 * when it is ready to send logs.
1579 void wil_clear_fw_log_addr(struct wil6210_priv
*wil
)
1582 wil_w(wil
, RGF_USER_USAGE_1
, 0);
1583 /* ucode log addr */
1584 wil_w(wil
, RGF_USER_USAGE_2
, 0);
1585 wil_dbg_misc(wil
, "Cleared FW and ucode log address");
1589 * We reset all the structures, and we reset the UMAC.
1590 * After calling this routine, you're expected to reload
1593 int wil_reset(struct wil6210_priv
*wil
, bool load_fw
)
1596 unsigned long status_flags
= BIT(wil_status_resetting
);
1598 struct wil6210_vif
*vif
;
1600 wil_dbg_misc(wil
, "reset\n");
1602 WARN_ON(!mutex_is_locked(&wil
->mutex
));
1603 WARN_ON(test_bit(wil_status_napi_en
, wil
->status
));
1606 static const u8 mac
[ETH_ALEN
] = {
1607 0x00, 0xde, 0xad, 0x12, 0x34, 0x56,
1609 struct net_device
*ndev
= wil
->main_ndev
;
1611 ether_addr_copy(ndev
->perm_addr
, mac
);
1612 eth_hw_addr_set(ndev
, ndev
->perm_addr
);
1616 if (wil
->hw_version
== HW_VER_UNKNOWN
)
1619 if (test_bit(WIL_PLATFORM_CAPA_T_PWR_ON_0
, wil
->platform_capa
) &&
1620 wil
->hw_version
< HW_VER_TALYN_MB
) {
1621 wil_dbg_misc(wil
, "Notify FW to set T_POWER_ON=0\n");
1622 wil_s(wil
, RGF_USER_USAGE_8
, BIT_USER_SUPPORT_T_POWER_ON_0
);
1625 if (test_bit(WIL_PLATFORM_CAPA_EXT_CLK
, wil
->platform_capa
)) {
1626 wil_dbg_misc(wil
, "Notify FW on ext clock configuration\n");
1627 wil_s(wil
, RGF_USER_USAGE_8
, BIT_USER_EXT_CLK
);
1630 if (wil
->platform_ops
.notify
) {
1631 rc
= wil
->platform_ops
.notify(wil
->platform_handle
,
1632 WIL_PLATFORM_EVT_PRE_RESET
);
1634 wil_err(wil
, "PRE_RESET platform notify failed, rc %d\n",
1638 set_bit(wil_status_resetting
, wil
->status
);
1639 mutex_lock(&wil
->vif_mutex
);
1640 wil_abort_scan_all_vifs(wil
, false);
1641 mutex_unlock(&wil
->vif_mutex
);
1643 for (i
= 0; i
< GET_MAX_VIFS(wil
); i
++) {
1646 cancel_work_sync(&vif
->disconnect_worker
);
1647 wil6210_disconnect(vif
, NULL
,
1648 WLAN_REASON_DEAUTH_LEAVING
);
1649 vif
->ptk_rekey_state
= WIL_REKEY_IDLE
;
1652 wil_bcast_fini_all(wil
);
1654 /* Disable device led before reset*/
1655 wmi_led_cfg(wil
, false);
1657 down_write(&wil
->mem_lock
);
1659 /* prevent NAPI from being scheduled and prevent wmi commands */
1660 mutex_lock(&wil
->wmi_mutex
);
1661 if (test_bit(wil_status_suspending
, wil
->status
))
1662 status_flags
|= BIT(wil_status_suspending
);
1663 bitmap_and(wil
->status
, wil
->status
, &status_flags
,
1665 wil_dbg_misc(wil
, "wil->status (0x%lx)\n", *wil
->status
);
1666 mutex_unlock(&wil
->wmi_mutex
);
1670 wmi_event_flush(wil
);
1672 flush_workqueue(wil
->wq_service
);
1673 flush_workqueue(wil
->wmi_wq
);
1675 no_flash
= test_bit(hw_capa_no_flash
, wil
->hw_capa
);
1677 wil_bl_crash_info(wil
, false);
1678 wil_disable_irq(wil
);
1679 rc
= wil_target_reset(wil
, no_flash
);
1680 wil6210_clear_irq(wil
);
1681 wil_enable_irq(wil
);
1682 wil
->txrx_ops
.rx_fini(wil
);
1683 wil
->txrx_ops
.tx_fini(wil
);
1686 wil_bl_crash_info(wil
, true);
1691 rc
= wil_get_otp_info(wil
);
1693 rc
= wil_get_bl_info(wil
);
1694 if (rc
== -EAGAIN
&& !load_fw
)
1695 /* ignore RF error if not going up */
1701 wil_set_oob_mode(wil
, oob_mode
);
1703 char board_file
[WIL_BOARD_FILE_MAX_NAMELEN
];
1705 if (wil
->secured_boot
) {
1706 wil_err(wil
, "secured boot is not supported\n");
1707 up_write(&wil
->mem_lock
);
1711 board_file
[0] = '\0';
1712 wil_get_board_file(wil
, board_file
, sizeof(board_file
));
1713 wil_info(wil
, "Use firmware <%s> + board <%s>\n",
1714 wil
->wil_fw_name
, board_file
);
1717 wil_bl_prepare_halt(wil
);
1720 memset(wil
->fw_version
, 0, sizeof(wil
->fw_version
));
1721 /* Loading f/w from the file */
1722 rc
= wil_request_firmware(wil
, wil
->wil_fw_name
, true);
1725 if (wil
->num_of_brd_entries
)
1726 rc
= wil_request_board(wil
, board_file
);
1728 rc
= wil_request_firmware(wil
, board_file
, true);
1732 wil_pre_fw_config(wil
);
1733 wil_release_cpu(wil
);
1736 /* init after reset */
1737 reinit_completion(&wil
->wmi_ready
);
1738 reinit_completion(&wil
->wmi_call
);
1739 reinit_completion(&wil
->halp
.comp
);
1741 clear_bit(wil_status_resetting
, wil
->status
);
1743 up_write(&wil
->mem_lock
);
1746 wil_unmask_irq(wil
);
1748 /* we just started MAC, wait for FW ready */
1749 rc
= wil_wait_for_fw_ready(wil
);
1753 /* check FW is responsive */
1756 wil_err(wil
, "wmi_echo failed, rc %d\n", rc
);
1760 wil
->txrx_ops
.configure_interrupt_moderation(wil
);
1762 /* Enable OFU rdy valid bug fix, to prevent hang in oful34_rx
1763 * while there is back-pressure from Host during RX
1765 if (wil
->hw_version
>= HW_VER_TALYN_MB
)
1766 wil_s(wil
, RGF_DMA_MISC_CTL
,
1767 BIT_OFUL34_RDY_VALID_BUG_FIX_EN
);
1769 rc
= wil_restore_vifs(wil
);
1771 wil_err(wil
, "failed to restore vifs, rc %d\n", rc
);
1775 wil_collect_fw_info(wil
);
1777 if (wil
->ps_profile
!= WMI_PS_PROFILE_TYPE_DEFAULT
)
1778 wil_ps_update(wil
, wil
->ps_profile
);
1780 if (wil
->platform_ops
.notify
) {
1781 rc
= wil
->platform_ops
.notify(wil
->platform_handle
,
1782 WIL_PLATFORM_EVT_FW_RDY
);
1784 wil_err(wil
, "FW_RDY notify failed, rc %d\n",
1794 up_write(&wil
->mem_lock
);
1795 clear_bit(wil_status_resetting
, wil
->status
);
1799 void wil_fw_error_recovery(struct wil6210_priv
*wil
)
1801 wil_dbg_misc(wil
, "starting fw error recovery\n");
1803 if (test_bit(wil_status_resetting
, wil
->status
)) {
1804 wil_info(wil
, "Reset already in progress\n");
1808 wil
->recovery_state
= fw_recovery_pending
;
1809 schedule_work(&wil
->fw_error_worker
);
1812 int __wil_up(struct wil6210_priv
*wil
)
1814 struct net_device
*ndev
= wil
->main_ndev
;
1815 struct wireless_dev
*wdev
= ndev
->ieee80211_ptr
;
1818 WARN_ON(!mutex_is_locked(&wil
->mutex
));
1820 rc
= wil_reset(wil
, true);
1824 /* Rx RING. After MAC and beacon */
1825 if (rx_ring_order
== 0)
1826 rx_ring_order
= wil
->hw_version
< HW_VER_TALYN_MB
?
1827 WIL_RX_RING_SIZE_ORDER_DEFAULT
:
1828 WIL_RX_RING_SIZE_ORDER_TALYN_DEFAULT
;
1830 rc
= wil
->txrx_ops
.rx_init(wil
, rx_ring_order
);
1834 rc
= wil
->txrx_ops
.tx_init(wil
);
1838 switch (wdev
->iftype
) {
1839 case NL80211_IFTYPE_STATION
:
1840 wil_dbg_misc(wil
, "type: STATION\n");
1841 ndev
->type
= ARPHRD_ETHER
;
1843 case NL80211_IFTYPE_AP
:
1844 wil_dbg_misc(wil
, "type: AP\n");
1845 ndev
->type
= ARPHRD_ETHER
;
1847 case NL80211_IFTYPE_P2P_CLIENT
:
1848 wil_dbg_misc(wil
, "type: P2P_CLIENT\n");
1849 ndev
->type
= ARPHRD_ETHER
;
1851 case NL80211_IFTYPE_P2P_GO
:
1852 wil_dbg_misc(wil
, "type: P2P_GO\n");
1853 ndev
->type
= ARPHRD_ETHER
;
1855 case NL80211_IFTYPE_MONITOR
:
1856 wil_dbg_misc(wil
, "type: Monitor\n");
1857 ndev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
1858 /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */
1864 /* MAC address - pre-requisite for other commands */
1865 wmi_set_mac_address(wil
, ndev
->dev_addr
);
1867 wil_dbg_misc(wil
, "NAPI enable\n");
1868 napi_enable(&wil
->napi_rx
);
1869 napi_enable(&wil
->napi_tx
);
1870 set_bit(wil_status_napi_en
, wil
->status
);
1872 wil6210_bus_request(wil
, WIL_DEFAULT_BUS_REQUEST_KBPS
);
1877 int wil_up(struct wil6210_priv
*wil
)
1881 wil_dbg_misc(wil
, "up\n");
1883 mutex_lock(&wil
->mutex
);
1885 mutex_unlock(&wil
->mutex
);
1890 int __wil_down(struct wil6210_priv
*wil
)
1893 WARN_ON(!mutex_is_locked(&wil
->mutex
));
1895 set_bit(wil_status_resetting
, wil
->status
);
1897 wil6210_bus_request(wil
, 0);
1899 wil_disable_irq(wil
);
1900 if (test_and_clear_bit(wil_status_napi_en
, wil
->status
)) {
1901 napi_disable(&wil
->napi_rx
);
1902 napi_disable(&wil
->napi_tx
);
1903 wil_dbg_misc(wil
, "NAPI disable\n");
1905 wil_enable_irq(wil
);
1907 mutex_lock(&wil
->vif_mutex
);
1908 wil_p2p_stop_radio_operations(wil
);
1909 wil_abort_scan_all_vifs(wil
, false);
1910 mutex_unlock(&wil
->vif_mutex
);
1912 rc
= wil_reset(wil
, false);
1917 int wil_down(struct wil6210_priv
*wil
)
1921 wil_dbg_misc(wil
, "down\n");
1923 wil_set_recovery_state(wil
, fw_recovery_idle
);
1924 mutex_lock(&wil
->mutex
);
1925 rc
= __wil_down(wil
);
1926 mutex_unlock(&wil
->mutex
);
1931 int wil_find_cid(struct wil6210_priv
*wil
, u8 mid
, const u8
*mac
)
1936 for (i
= 0; i
< wil
->max_assoc_sta
; i
++) {
1937 if (wil
->sta
[i
].mid
== mid
&&
1938 wil
->sta
[i
].status
!= wil_sta_unused
&&
1939 ether_addr_equal(wil
->sta
[i
].addr
, mac
)) {
1948 void wil_halp_vote(struct wil6210_priv
*wil
)
1951 unsigned long to_jiffies
= msecs_to_jiffies(WAIT_FOR_HALP_VOTE_MS
);
1953 if (wil
->hw_version
>= HW_VER_TALYN_MB
)
1956 mutex_lock(&wil
->halp
.lock
);
1958 wil_dbg_irq(wil
, "halp_vote: start, HALP ref_cnt (%d)\n",
1961 if (++wil
->halp
.ref_cnt
== 1) {
1962 reinit_completion(&wil
->halp
.comp
);
1963 /* mark to IRQ context to handle HALP ICR */
1964 wil
->halp
.handle_icr
= true;
1965 wil6210_set_halp(wil
);
1966 rc
= wait_for_completion_timeout(&wil
->halp
.comp
, to_jiffies
);
1968 wil_err(wil
, "HALP vote timed out\n");
1969 /* Mask HALP as done in case the interrupt is raised */
1970 wil
->halp
.handle_icr
= false;
1971 wil6210_mask_halp(wil
);
1974 "halp_vote: HALP vote completed after %d ms\n",
1975 jiffies_to_msecs(to_jiffies
- rc
));
1979 wil_dbg_irq(wil
, "halp_vote: end, HALP ref_cnt (%d)\n",
1982 mutex_unlock(&wil
->halp
.lock
);
1985 void wil_halp_unvote(struct wil6210_priv
*wil
)
1987 if (wil
->hw_version
>= HW_VER_TALYN_MB
)
1990 WARN_ON(wil
->halp
.ref_cnt
== 0);
1992 mutex_lock(&wil
->halp
.lock
);
1994 wil_dbg_irq(wil
, "halp_unvote: start, HALP ref_cnt (%d)\n",
1997 if (--wil
->halp
.ref_cnt
== 0) {
1998 wil6210_clear_halp(wil
);
1999 wil_dbg_irq(wil
, "HALP unvote\n");
2002 wil_dbg_irq(wil
, "halp_unvote:end, HALP ref_cnt (%d)\n",
2005 mutex_unlock(&wil
->halp
.lock
);
2008 void wil_init_txrx_ops(struct wil6210_priv
*wil
)
2010 if (wil
->use_enhanced_dma_hw
)
2011 wil_init_txrx_ops_edma(wil
);
2013 wil_init_txrx_ops_legacy_dma(wil
);