Lines Matching refs:wil

12 bool wil_has_other_active_ifaces(struct wil6210_priv *wil,
19 for (i = 0; i < GET_MAX_VIFS(wil); i++) {
20 vif = wil->vifs[i];
33 bool wil_has_active_ifaces(struct wil6210_priv *wil, bool up, bool ok)
36 return wil_has_other_active_ifaces(wil, NULL, up, ok);
41 struct wil6210_priv *wil = ndev_to_wil(ndev);
44 wil_dbg_misc(wil, "open\n");
47 test_bit(WMI_FW_CAPABILITY_WMI_ONLY, wil->fw_capabilities)) {
48 wil_err(wil, "while in debug_fw or wmi_only mode\n");
52 if (!wil_has_other_active_ifaces(wil, ndev, true, false)) {
53 wil_dbg_misc(wil, "open, first iface\n");
54 rc = wil_pm_runtime_get(wil);
58 rc = wil_up(wil);
60 wil_pm_runtime_put(wil);
68 struct wil6210_priv *wil = ndev_to_wil(ndev);
71 wil_dbg_misc(wil, "stop\n");
73 if (!wil_has_other_active_ifaces(wil, ndev, true, false)) {
74 wil_dbg_misc(wil, "stop, last iface\n");
75 rc = wil_down(wil);
77 wil_pm_runtime_put(wil);
93 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv,
98 wil_rx_handle(wil, &quota);
103 wil6210_unmask_irq_rx(wil);
104 wil_dbg_txrx(wil, "NAPI RX complete\n");
107 wil_dbg_txrx(wil, "NAPI RX poll(%d) done %d\n", budget, done);
114 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv,
119 wil_rx_handle_edma(wil, &quota);
124 wil6210_unmask_irq_rx_edma(wil);
125 wil_dbg_txrx(wil, "NAPI RX complete\n");
128 wil_dbg_txrx(wil, "NAPI RX poll(%d) done %d\n", budget, done);
135 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv,
142 struct wil_ring *ring = &wil->ring_tx[i];
143 struct wil_ring_tx_data *txdata = &wil->ring_tx_data[i];
147 txdata->mid >= GET_MAX_VIFS(wil))
150 vif = wil->vifs[txdata->mid];
152 wil_dbg_txrx(wil, "Invalid MID %d\n", txdata->mid);
161 wil6210_unmask_irq_tx(wil);
162 wil_dbg_txrx(wil, "NAPI TX complete\n");
165 wil_dbg_txrx(wil, "NAPI TX poll(%d) done %d\n", budget, tx_done);
172 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv,
176 struct wil_status_ring *sring = &wil->srings[wil->tx_sring_idx];
181 tx_done = wil_tx_sring_handler(wil, sring);
185 wil6210_unmask_irq_tx_edma(wil);
186 wil_dbg_txrx(wil, "NAPI TX complete\n");
189 wil_dbg_txrx(wil, "NAPI TX poll(%d) done %d\n", budget, tx_done);
231 struct wil6210_priv *wil = vif_to_wil(vif);
234 wil_err(wil, "Connect timeout detected, disconnect station\n");
240 q = queue_work(wil->wmi_wq, &vif->disconnect_worker);
241 wil_dbg_wmi(wil, "queue_work of disconnect_worker -> %d\n", q);
247 struct wil6210_priv *wil = vif_to_wil(vif);
249 clear_bit(wil_status_fwready, wil->status);
250 wil_err(wil, "Scan timeout detected, start fw error recovery\n");
251 wil_fw_error_recovery(wil);
257 struct wil6210_priv *wil = vif_to_wil(vif);
259 wil_dbg_misc(wil, "p2p_discovery_timer_fn\n");
285 static u8 wil_vif_find_free_mid(struct wil6210_priv *wil)
289 for (i = 0; i < GET_MAX_VIFS(wil); i++) {
290 if (!wil->vifs[i])
298 wil_vif_alloc(struct wil6210_priv *wil, const char *name,
306 mid = wil_vif_find_free_mid(wil);
308 wil_err(wil, "no available virtual interface\n");
315 dev_err(wil_to_dev(wil), "alloc_netdev failed\n");
319 wil->main_ndev = ndev;
327 vif->wil = wil;
332 wdev->wiphy = wil->wiphy;
350 struct wil6210_priv *wil;
354 wil = wil_cfg80211_init(dev);
355 if (IS_ERR(wil)) {
357 return wil;
360 rc = wil_priv_init(wil);
366 wil_dbg_misc(wil, "if_alloc\n");
368 vif = wil_vif_alloc(wil, "wlan%d", NET_NAME_UNKNOWN,
376 wil->radio_wdev = vif_to_wdev(vif);
378 return wil;
381 wil_priv_deinit(wil);
384 wil_cfg80211_deinit(wil);
389 void wil_if_free(struct wil6210_priv *wil)
391 struct net_device *ndev = wil->main_ndev;
393 wil_dbg_misc(wil, "if_free\n");
398 wil_priv_deinit(wil);
400 wil->main_ndev = NULL;
404 wil_cfg80211_deinit(wil);
407 int wil_vif_add(struct wil6210_priv *wil, struct wil6210_vif *vif)
411 bool any_active = wil_has_active_ifaces(wil, true, false);
416 if (wil->vifs[vif->mid]) {
422 rc = wmi_port_allocate(wil, vif->mid, ndev->dev_addr,
431 wmi_port_delete(wil, vif->mid);
435 wil->vifs[vif->mid] = vif;
439 int wil_if_add(struct wil6210_priv *wil)
441 struct wiphy *wiphy = wil->wiphy;
442 struct net_device *ndev = wil->main_ndev;
446 wil_dbg_misc(wil, "entered");
448 strlcpy(wiphy->fw_version, wil->fw_version, sizeof(wiphy->fw_version));
452 wil_err(wil, "failed to register wiphy, err %d\n", rc);
456 init_dummy_netdev(&wil->napi_ndev);
457 if (wil->use_enhanced_dma_hw) {
458 netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
461 netif_tx_napi_add(&wil->napi_ndev,
462 &wil->napi_tx, wil6210_netdev_poll_tx_edma,
465 netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
468 netif_tx_napi_add(&wil->napi_ndev,
469 &wil->napi_tx, wil6210_netdev_poll_tx,
473 wil_update_net_queues_bh(wil, vif, NULL, true);
476 rc = wil_vif_add(wil, vif);
488 void wil_vif_remove(struct wil6210_priv *wil, u8 mid)
492 bool any_active = wil_has_active_ifaces(wil, true, false);
495 if (mid >= GET_MAX_VIFS(wil)) {
496 wil_err(wil, "invalid MID: %d\n", mid);
500 vif = wil->vifs[mid];
502 wil_err(wil, "MID %d not registered\n", mid);
506 mutex_lock(&wil->mutex);
508 mutex_unlock(&wil->mutex);
517 wmi_port_delete(wil, vif->mid);
520 mutex_lock(&wil->vif_mutex);
521 wil->vifs[mid] = NULL;
524 if (test_bit(wil_status_napi_en, wil->status)) {
525 napi_synchronize(&wil->napi_rx);
526 napi_synchronize(&wil->napi_tx);
528 mutex_unlock(&wil->vif_mutex);
530 flush_work(&wil->wmi_event_worker);
542 void wil_if_remove(struct wil6210_priv *wil)
544 struct net_device *ndev = wil->main_ndev;
547 wil_dbg_misc(wil, "if_remove\n");
550 wil_vif_remove(wil, 0);
553 netif_napi_del(&wil->napi_tx);
554 netif_napi_del(&wil->napi_rx);