diff options
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/main.c')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/main.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c index db74e811f5c4..c2a238426425 100644 --- a/drivers/net/wireless/ath/wil6210/main.c +++ b/drivers/net/wireless/ath/wil6210/main.c | |||
@@ -68,6 +68,7 @@ MODULE_PARM_DESC(mtu_max, " Max MTU value."); | |||
68 | 68 | ||
69 | static uint rx_ring_order = WIL_RX_RING_SIZE_ORDER_DEFAULT; | 69 | static uint rx_ring_order = WIL_RX_RING_SIZE_ORDER_DEFAULT; |
70 | static uint tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT; | 70 | static uint tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT; |
71 | static uint bcast_ring_order = WIL_BCAST_RING_SIZE_ORDER_DEFAULT; | ||
71 | 72 | ||
72 | static int ring_order_set(const char *val, const struct kernel_param *kp) | 73 | static int ring_order_set(const char *val, const struct kernel_param *kp) |
73 | { | 74 | { |
@@ -216,6 +217,7 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid, | |||
216 | switch (wdev->iftype) { | 217 | switch (wdev->iftype) { |
217 | case NL80211_IFTYPE_STATION: | 218 | case NL80211_IFTYPE_STATION: |
218 | case NL80211_IFTYPE_P2P_CLIENT: | 219 | case NL80211_IFTYPE_P2P_CLIENT: |
220 | wil_bcast_fini(wil); | ||
219 | netif_tx_stop_all_queues(ndev); | 221 | netif_tx_stop_all_queues(ndev); |
220 | netif_carrier_off(ndev); | 222 | netif_carrier_off(ndev); |
221 | 223 | ||
@@ -360,6 +362,35 @@ static int wil_find_free_vring(struct wil6210_priv *wil) | |||
360 | return -EINVAL; | 362 | return -EINVAL; |
361 | } | 363 | } |
362 | 364 | ||
365 | int wil_bcast_init(struct wil6210_priv *wil) | ||
366 | { | ||
367 | int ri = wil->bcast_vring, rc; | ||
368 | |||
369 | if ((ri >= 0) && wil->vring_tx[ri].va) | ||
370 | return 0; | ||
371 | |||
372 | ri = wil_find_free_vring(wil); | ||
373 | if (ri < 0) | ||
374 | return ri; | ||
375 | |||
376 | rc = wil_vring_init_bcast(wil, ri, 1 << bcast_ring_order); | ||
377 | if (rc == 0) | ||
378 | wil->bcast_vring = ri; | ||
379 | |||
380 | return rc; | ||
381 | } | ||
382 | |||
383 | void wil_bcast_fini(struct wil6210_priv *wil) | ||
384 | { | ||
385 | int ri = wil->bcast_vring; | ||
386 | |||
387 | if (ri < 0) | ||
388 | return; | ||
389 | |||
390 | wil->bcast_vring = -1; | ||
391 | wil_vring_fini_tx(wil, ri); | ||
392 | } | ||
393 | |||
363 | static void wil_connect_worker(struct work_struct *work) | 394 | static void wil_connect_worker(struct work_struct *work) |
364 | { | 395 | { |
365 | int rc; | 396 | int rc; |
@@ -407,6 +438,7 @@ int wil_priv_init(struct wil6210_priv *wil) | |||
407 | init_completion(&wil->wmi_call); | 438 | init_completion(&wil->wmi_call); |
408 | 439 | ||
409 | wil->pending_connect_cid = -1; | 440 | wil->pending_connect_cid = -1; |
441 | wil->bcast_vring = -1; | ||
410 | setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil); | 442 | setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil); |
411 | setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil); | 443 | setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil); |
412 | 444 | ||
@@ -656,6 +688,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) | |||
656 | 688 | ||
657 | cancel_work_sync(&wil->disconnect_worker); | 689 | cancel_work_sync(&wil->disconnect_worker); |
658 | wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false); | 690 | wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false); |
691 | wil_bcast_fini(wil); | ||
659 | 692 | ||
660 | /* prevent NAPI from being scheduled */ | 693 | /* prevent NAPI from being scheduled */ |
661 | bitmap_zero(wil->status, wil_status_last); | 694 | bitmap_zero(wil->status, wil_status_last); |
@@ -714,6 +747,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) | |||
714 | 747 | ||
715 | /* init after reset */ | 748 | /* init after reset */ |
716 | wil->pending_connect_cid = -1; | 749 | wil->pending_connect_cid = -1; |
750 | wil->ap_isolate = 0; | ||
717 | reinit_completion(&wil->wmi_ready); | 751 | reinit_completion(&wil->wmi_ready); |
718 | reinit_completion(&wil->wmi_call); | 752 | reinit_completion(&wil->wmi_call); |
719 | 753 | ||
@@ -723,6 +757,8 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) | |||
723 | 757 | ||
724 | /* we just started MAC, wait for FW ready */ | 758 | /* we just started MAC, wait for FW ready */ |
725 | rc = wil_wait_for_fw_ready(wil); | 759 | rc = wil_wait_for_fw_ready(wil); |
760 | if (rc == 0) /* check FW is responsive */ | ||
761 | rc = wmi_echo(wil); | ||
726 | } | 762 | } |
727 | 763 | ||
728 | return rc; | 764 | return rc; |