Lines Matching refs:wil
97 static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring) in wil_vring_alloc() argument
99 struct device *dev = wil_to_dev(wil); in wil_vring_alloc()
103 wil_dbg_misc(wil, "%s()\n", __func__); in wil_vring_alloc()
133 wil_dbg_misc(wil, "vring[%d] 0x%p:%pad 0x%p\n", vring->size, in wil_vring_alloc()
157 static void wil_vring_free(struct wil6210_priv *wil, struct vring *vring, in wil_vring_free() argument
160 struct device *dev = wil_to_dev(wil); in wil_vring_free()
164 int vring_index = vring - wil->vring_tx; in wil_vring_free()
166 wil_dbg_misc(wil, "free Tx vring %d [%d] 0x%p:%pad 0x%p\n", in wil_vring_free()
170 wil_dbg_misc(wil, "free Rx vring [%d] 0x%p:%pad 0x%p\n", in wil_vring_free()
217 static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring, in wil_vring_alloc_skb() argument
220 struct device *dev = wil_to_dev(wil); in wil_vring_alloc_skb()
261 static void wil_rx_add_radiotap_header(struct wil6210_priv *wil, in wil_rx_add_radiotap_header() argument
264 struct wireless_dev *wdev = wil->wdev; in wil_rx_add_radiotap_header()
321 wil_err(wil, "Unable to expand headrom to %d\n", rtap_len); in wil_rx_add_radiotap_header()
375 static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil, in wil_vring_reap_rx() argument
378 struct device *dev = wil_to_dev(wil); in wil_vring_reap_rx()
379 struct net_device *ndev = wil_to_ndev(wil); in wil_vring_reap_rx()
409 wil_err(wil, "No Rx skb at [%d]\n", i); in wil_vring_reap_rx()
420 wil_dbg_txrx(wil, "Rx[%3d] : %d bytes\n", i, dmalen); in wil_vring_reap_rx()
425 stats = &wil->sta[cid].stats; in wil_vring_reap_rx()
428 wil_err(wil, "Rx size too large: %d bytes!\n", dmalen); in wil_vring_reap_rx()
446 wil_rx_add_radiotap_header(wil, skb); in wil_vring_reap_rx()
462 wil_dbg_txrx(wil, in wil_vring_reap_rx()
467 wil_dbg_txrx(wil, in wil_vring_reap_rx()
470 wil_rx_bar(wil, cid, tid, seq); in wil_vring_reap_rx()
475 wil_dbg_txrx(wil, in wil_vring_reap_rx()
488 wil_err(wil, "Short frame, len = %d\n", skb->len); in wil_vring_reap_rx()
527 static int wil_rx_refill(struct wil6210_priv *wil, int count) in wil_rx_refill() argument
529 struct net_device *ndev = wil_to_ndev(wil); in wil_rx_refill()
530 struct vring *v = &wil->vring_rx; in wil_rx_refill()
539 rc = wil_vring_alloc_skb(wil, v, v->swtail, headroom); in wil_rx_refill()
541 wil_err(wil, "Error %d in wil_rx_refill[%d]\n", in wil_rx_refill()
546 wil_w(wil, v->hwtail, v->swtail); in wil_rx_refill()
558 struct wil6210_priv *wil = ndev_to_wil(ndev); in wil_netif_rx_any() local
559 struct wireless_dev *wdev = wil_to_wdev(wil); in wil_netif_rx_any()
568 struct wil_net_stats *stats = &wil->sta[cid].stats; in wil_netif_rx_any()
588 if (wdev->iftype == NL80211_IFTYPE_AP && !wil->ap_isolate) { in wil_netif_rx_any()
595 int xmit_cid = wil_find_cid(wil, eth->h_dest); in wil_netif_rx_any()
618 wil_dbg_txrx(wil, "Rx -> Tx %d bytes\n", len); in wil_netif_rx_any()
625 rc = napi_gro_receive(&wil->napi_rx, skb); in wil_netif_rx_any()
626 wil_dbg_txrx(wil, "Rx complete %d bytes => %s\n", in wil_netif_rx_any()
633 wil_dbg_txrx(wil, "Rx drop %d bytes\n", len); in wil_netif_rx_any()
649 void wil_rx_handle(struct wil6210_priv *wil, int *quota) in wil_rx_handle() argument
651 struct net_device *ndev = wil_to_ndev(wil); in wil_rx_handle()
652 struct vring *v = &wil->vring_rx; in wil_rx_handle()
656 wil_err(wil, "Rx IRQ while Rx not yet initialized\n"); in wil_rx_handle()
659 wil_dbg_txrx(wil, "%s()\n", __func__); in wil_rx_handle()
660 while ((*quota > 0) && (NULL != (skb = wil_vring_reap_rx(wil, v)))) { in wil_rx_handle()
663 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { in wil_rx_handle()
671 wil_rx_reorder(wil, skb); in wil_rx_handle()
674 wil_rx_refill(wil, v->size); in wil_rx_handle()
677 int wil_rx_init(struct wil6210_priv *wil, u16 size) in wil_rx_init() argument
679 struct vring *vring = &wil->vring_rx; in wil_rx_init()
682 wil_dbg_misc(wil, "%s()\n", __func__); in wil_rx_init()
685 wil_err(wil, "Rx ring already allocated\n"); in wil_rx_init()
690 rc = wil_vring_alloc(wil, vring); in wil_rx_init()
694 rc = wmi_rx_chain_add(wil, vring); in wil_rx_init()
698 rc = wil_rx_refill(wil, vring->size); in wil_rx_init()
704 wil_vring_free(wil, vring, 0); in wil_rx_init()
709 void wil_rx_fini(struct wil6210_priv *wil) in wil_rx_fini() argument
711 struct vring *vring = &wil->vring_rx; in wil_rx_fini()
713 wil_dbg_misc(wil, "%s()\n", __func__); in wil_rx_fini()
716 wil_vring_free(wil, vring, 0); in wil_rx_fini()
719 int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size, in wil_vring_init_tx() argument
747 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_tx()
748 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_init_tx()
750 wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__, in wil_vring_init_tx()
754 wil_err(wil, "Tx ring [%d] already allocated\n", id); in wil_vring_init_tx()
762 rc = wil_vring_alloc(wil, vring); in wil_vring_init_tx()
766 wil->vring2cid_tid[id][0] = cid; in wil_vring_init_tx()
767 wil->vring2cid_tid[id][1] = tid; in wil_vring_init_tx()
771 if (!wil->privacy) in wil_vring_init_tx()
773 rc = wmi_call(wil, WMI_VRING_CFG_CMDID, &cmd, sizeof(cmd), in wil_vring_init_tx()
779 wil_err(wil, "Tx config failed, status 0x%02x\n", in wil_vring_init_tx()
788 wil_addba_tx_request(wil, id, agg_wsize); in wil_vring_init_tx()
794 wil_vring_free(wil, vring, 1); in wil_vring_init_tx()
800 int wil_vring_init_bcast(struct wil6210_priv *wil, int id, int size) in wil_vring_init_bcast() argument
819 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_bcast()
820 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_init_bcast()
822 wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__, in wil_vring_init_bcast()
826 wil_err(wil, "Tx ring [%d] already allocated\n", id); in wil_vring_init_bcast()
834 rc = wil_vring_alloc(wil, vring); in wil_vring_init_bcast()
838 wil->vring2cid_tid[id][0] = WIL6210_MAX_CID; /* CID */ in wil_vring_init_bcast()
839 wil->vring2cid_tid[id][1] = 0; /* TID */ in wil_vring_init_bcast()
843 if (!wil->privacy) in wil_vring_init_bcast()
845 rc = wmi_call(wil, WMI_BCAST_VRING_CFG_CMDID, &cmd, sizeof(cmd), in wil_vring_init_bcast()
851 wil_err(wil, "Tx config failed, status 0x%02x\n", in wil_vring_init_bcast()
864 wil_vring_free(wil, vring, 1); in wil_vring_init_bcast()
870 void wil_vring_fini_tx(struct wil6210_priv *wil, int id) in wil_vring_fini_tx() argument
872 struct vring *vring = &wil->vring_tx[id]; in wil_vring_fini_tx()
873 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_fini_tx()
875 WARN_ON(!mutex_is_locked(&wil->mutex)); in wil_vring_fini_tx()
880 wil_dbg_misc(wil, "%s() id=%d\n", __func__, id); in wil_vring_fini_tx()
887 if (test_bit(wil_status_napi_en, wil->status)) in wil_vring_fini_tx()
888 napi_synchronize(&wil->napi_tx); in wil_vring_fini_tx()
890 wil_vring_free(wil, vring, 1); in wil_vring_fini_tx()
894 static struct vring *wil_find_tx_ucast(struct wil6210_priv *wil, in wil_find_tx_ucast() argument
899 int cid = wil_find_cid(wil, eth->h_dest); in wil_find_tx_ucast()
905 for (i = 0; i < ARRAY_SIZE(wil->vring2cid_tid); i++) { in wil_find_tx_ucast()
906 if (!wil->vring_tx_data[i].dot1x_open && in wil_find_tx_ucast()
909 if (wil->vring2cid_tid[i][0] == cid) { in wil_find_tx_ucast()
910 struct vring *v = &wil->vring_tx[i]; in wil_find_tx_ucast()
912 wil_dbg_txrx(wil, "%s(%pM) -> [%d]\n", in wil_find_tx_ucast()
917 wil_dbg_txrx(wil, "vring[%d] not valid\n", i); in wil_find_tx_ucast()
926 static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
929 static struct vring *wil_find_tx_vring_sta(struct wil6210_priv *wil, in wil_find_tx_vring_sta() argument
941 v = &wil->vring_tx[i]; in wil_find_tx_vring_sta()
945 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_vring_sta()
949 if (!wil->vring_tx_data[i].dot1x_open && in wil_find_tx_vring_sta()
953 wil_dbg_txrx(wil, "Tx -> ring %d\n", i); in wil_find_tx_vring_sta()
958 wil_dbg_txrx(wil, "Tx while no vrings active?\n"); in wil_find_tx_vring_sta()
974 static struct vring *wil_find_tx_bcast_1(struct wil6210_priv *wil, in wil_find_tx_bcast_1() argument
978 int i = wil->bcast_vring; in wil_find_tx_bcast_1()
982 v = &wil->vring_tx[i]; in wil_find_tx_bcast_1()
985 if (!wil->vring_tx_data[i].dot1x_open && in wil_find_tx_bcast_1()
992 static void wil_set_da_for_vring(struct wil6210_priv *wil, in wil_set_da_for_vring() argument
996 int cid = wil->vring2cid_tid[vring_index][0]; in wil_set_da_for_vring()
998 ether_addr_copy(eth->h_dest, wil->sta[cid].addr); in wil_set_da_for_vring()
1001 static struct vring *wil_find_tx_bcast_2(struct wil6210_priv *wil, in wil_find_tx_bcast_2() argument
1013 v = &wil->vring_tx[i]; in wil_find_tx_bcast_2()
1017 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_bcast_2()
1020 if (!wil->vring_tx_data[i].dot1x_open && in wil_find_tx_bcast_2()
1025 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN)) in wil_find_tx_bcast_2()
1031 wil_dbg_txrx(wil, "Tx while no vrings active?\n"); in wil_find_tx_bcast_2()
1036 wil_dbg_txrx(wil, "BCAST -> ring %d\n", i); in wil_find_tx_bcast_2()
1037 wil_set_da_for_vring(wil, skb, i); in wil_find_tx_bcast_2()
1041 v2 = &wil->vring_tx[i]; in wil_find_tx_bcast_2()
1044 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_bcast_2()
1047 if (!wil->vring_tx_data[i].dot1x_open && in wil_find_tx_bcast_2()
1051 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN)) in wil_find_tx_bcast_2()
1056 wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i); in wil_find_tx_bcast_2()
1057 wil_set_da_for_vring(wil, skb2, i); in wil_find_tx_bcast_2()
1058 wil_tx_vring(wil, v2, skb2); in wil_find_tx_bcast_2()
1060 wil_err(wil, "skb_copy failed\n"); in wil_find_tx_bcast_2()
1067 static struct vring *wil_find_tx_bcast(struct wil6210_priv *wil, in wil_find_tx_bcast() argument
1070 struct wireless_dev *wdev = wil->wdev; in wil_find_tx_bcast()
1073 return wil_find_tx_bcast_2(wil, skb); in wil_find_tx_bcast()
1075 return wil_find_tx_bcast_1(wil, skb); in wil_find_tx_bcast()
1206 static int __wil_tx_vring_tso(struct wil6210_priv *wil, struct vring *vring, in __wil_tx_vring_tso() argument
1209 struct device *dev = wil_to_dev(wil); in __wil_tx_vring_tso()
1232 int vring_index = vring - wil->vring_tx; in __wil_tx_vring_tso()
1233 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; in __wil_tx_vring_tso()
1247 wil_dbg_txrx(wil, "%s() %d bytes to vring %d\n", in __wil_tx_vring_tso()
1259 wil_err_ratelimited(wil, in __wil_tx_vring_tso()
1305 wil_err(wil, "TSO: Skb head DMA map error\n"); in __wil_tx_vring_tso()
1323 wil_dbg_txrx(wil, "TSO: process skb head, len %u\n", in __wil_tx_vring_tso()
1328 wil_dbg_txrx(wil, "TSO: frag[%d]: len %u\n", f, len); in __wil_tx_vring_tso()
1332 wil_dbg_txrx(wil, in __wil_tx_vring_tso()
1337 wil_err_ratelimited(wil, "TSO: ring overflow\n"); in __wil_tx_vring_tso()
1344 wil_dbg_txrx(wil, "TSO: lenmss %d, i %d\n", lenmss, i); in __wil_tx_vring_tso()
1362 wil_err(wil, "TSO: DMA map page error\n"); in __wil_tx_vring_tso()
1389 wil_dbg_txrx(wil, in __wil_tx_vring_tso()
1458 wil_dbg_txrx(wil, "Ring[%2d] not idle %d -> %d\n", in __wil_tx_vring_tso()
1464 wil_dbg_txrx(wil, "TSO: Tx swhead %d -> %d\n", swhead, vring->swhead); in __wil_tx_vring_tso()
1471 wil_w(wil, vring->hwtail, vring->swhead); in __wil_tx_vring_tso()
1492 static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, in __wil_tx_vring() argument
1495 struct device *dev = wil_to_dev(wil); in __wil_tx_vring()
1502 int vring_index = vring - wil->vring_tx; in __wil_tx_vring()
1503 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; in __wil_tx_vring()
1507 bool mcast = (vring_index == wil->bcast_vring); in __wil_tx_vring()
1510 wil_dbg_txrx(wil, "%s() %d bytes to vring %d\n", in __wil_tx_vring()
1517 wil_err_ratelimited(wil, in __wil_tx_vring()
1526 wil_dbg_txrx(wil, "Tx[%2d] skb %d bytes 0x%p -> %pad\n", vring_index, in __wil_tx_vring()
1543 wil_err(wil, "Tx[%2d] Failed to set cksum, drop packet\n", in __wil_tx_vring()
1558 wil_dbg_txrx(wil, "Tx[%2d] desc[%4d]\n", vring_index, i); in __wil_tx_vring()
1566 wil_err(wil, "Tx[%2d] failed to map fragment\n", in __wil_tx_vring()
1583 wil_dbg_txrx(wil, "Tx[%2d] desc[%4d]\n", vring_index, i); in __wil_tx_vring()
1598 wil_dbg_txrx(wil, "Ring[%2d] not idle %d -> %d\n", in __wil_tx_vring()
1604 wil_dbg_txrx(wil, "Tx[%2d] swhead %d -> %d\n", vring_index, swhead, in __wil_tx_vring()
1613 wil_w(wil, vring->hwtail, vring->swhead); in __wil_tx_vring()
1635 static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, in wil_tx_vring() argument
1638 int vring_index = vring - wil->vring_tx; in wil_tx_vring()
1639 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; in wil_tx_vring()
1645 (wil, vring, skb); in wil_tx_vring()
1654 struct wil6210_priv *wil = ndev_to_wil(ndev); in wil_start_xmit() local
1661 wil_dbg_txrx(wil, "%s()\n", __func__); in wil_start_xmit()
1662 if (unlikely(!test_bit(wil_status_fwready, wil->status))) { in wil_start_xmit()
1664 wil_err(wil, "FW not ready\n"); in wil_start_xmit()
1669 if (unlikely(!test_bit(wil_status_fwconnected, wil->status))) { in wil_start_xmit()
1670 wil_err_ratelimited(wil, "FW not connected\n"); in wil_start_xmit()
1673 if (unlikely(wil->wdev->iftype == NL80211_IFTYPE_MONITOR)) { in wil_start_xmit()
1674 wil_err(wil, "Xmit in monitor mode not supported\n"); in wil_start_xmit()
1680 if (wil->wdev->iftype == NL80211_IFTYPE_STATION) { in wil_start_xmit()
1682 vring = wil_find_tx_vring_sta(wil, skb); in wil_start_xmit()
1684 vring = bcast ? wil_find_tx_bcast(wil, skb) : in wil_start_xmit()
1685 wil_find_tx_ucast(wil, skb); in wil_start_xmit()
1688 wil_dbg_txrx(wil, "No Tx VRING found for %pM\n", eth->h_dest); in wil_start_xmit()
1692 rc = wil_tx_vring(wil, vring, skb); in wil_start_xmit()
1696 netif_tx_stop_all_queues(wil_to_ndev(wil)); in wil_start_xmit()
1697 wil_dbg_txrx(wil, "netif_tx_stop : ring full\n"); in wil_start_xmit()
1740 int wil_tx_complete(struct wil6210_priv *wil, int ringid) in wil_tx_complete() argument
1742 struct net_device *ndev = wil_to_ndev(wil); in wil_tx_complete()
1743 struct device *dev = wil_to_dev(wil); in wil_tx_complete()
1744 struct vring *vring = &wil->vring_tx[ringid]; in wil_tx_complete()
1745 struct vring_tx_data *txdata = &wil->vring_tx_data[ringid]; in wil_tx_complete()
1747 int cid = wil->vring2cid_tid[ringid][0]; in wil_tx_complete()
1754 wil_err(wil, "Tx irq[%d]: vring not initialized\n", ringid); in wil_tx_complete()
1759 wil_info(wil, "Tx irq[%d]: vring disabled\n", ringid); in wil_tx_complete()
1763 wil_dbg_txrx(wil, "%s(%d)\n", __func__, ringid); in wil_tx_complete()
1768 stats = &wil->sta[cid].stats; in wil_tx_complete()
1800 wil_dbg_txrx(wil, in wil_tx_complete()
1839 wil_dbg_txrx(wil, "Ring[%2d] idle %d -> %d\n", in wil_tx_complete()
1845 wil_dbg_txrx(wil, "netif_tx_wake : ring not full\n"); in wil_tx_complete()
1846 netif_tx_wake_all_queues(wil_to_ndev(wil)); in wil_tx_complete()