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()
368 static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil, in wil_vring_reap_rx() argument
371 struct device *dev = wil_to_dev(wil); in wil_vring_reap_rx()
372 struct net_device *ndev = wil_to_ndev(wil); in wil_vring_reap_rx()
400 wil_err(wil, "No Rx skb at [%d]\n", i); in wil_vring_reap_rx()
411 wil_dbg_txrx(wil, "Rx[%3d] : %d bytes\n", i, dmalen); in wil_vring_reap_rx()
416 wil_err(wil, "Rx size too large: %d bytes!\n", dmalen); in wil_vring_reap_rx()
428 stats = &wil->sta[cid].stats; in wil_vring_reap_rx()
433 wil_rx_add_radiotap_header(wil, skb); in wil_vring_reap_rx()
445 wil_dbg_txrx(wil, "Non-data frame ftype 0x%08x\n", ftype); in wil_vring_reap_rx()
452 wil_err(wil, "Short frame, len = %d\n", skb->len); in wil_vring_reap_rx()
491 static int wil_rx_refill(struct wil6210_priv *wil, int count) in wil_rx_refill() argument
493 struct net_device *ndev = wil_to_ndev(wil); in wil_rx_refill()
494 struct vring *v = &wil->vring_rx; in wil_rx_refill()
503 rc = wil_vring_alloc_skb(wil, v, v->swtail, headroom); in wil_rx_refill()
505 wil_err(wil, "Error %d in wil_rx_refill[%d]\n", in wil_rx_refill()
510 iowrite32(v->swtail, wil->csr + HOSTADDR(v->hwtail)); in wil_rx_refill()
522 struct wil6210_priv *wil = ndev_to_wil(ndev); in wil_netif_rx_any() local
523 struct wireless_dev *wdev = wil_to_wdev(wil); in wil_netif_rx_any()
532 struct wil_net_stats *stats = &wil->sta[cid].stats; in wil_netif_rx_any()
544 if (wdev->iftype == NL80211_IFTYPE_AP && !wil->ap_isolate) { in wil_netif_rx_any()
551 int xmit_cid = wil_find_cid(wil, eth->h_dest); in wil_netif_rx_any()
574 wil_dbg_txrx(wil, "Rx -> Tx %d bytes\n", len); in wil_netif_rx_any()
581 rc = napi_gro_receive(&wil->napi_rx, skb); in wil_netif_rx_any()
582 wil_dbg_txrx(wil, "Rx complete %d bytes => %s\n", in wil_netif_rx_any()
589 wil_dbg_txrx(wil, "Rx drop %d bytes\n", len); in wil_netif_rx_any()
605 void wil_rx_handle(struct wil6210_priv *wil, int *quota) in wil_rx_handle() argument
607 struct net_device *ndev = wil_to_ndev(wil); in wil_rx_handle()
608 struct vring *v = &wil->vring_rx; in wil_rx_handle()
612 wil_err(wil, "Rx IRQ while Rx not yet initialized\n"); in wil_rx_handle()
615 wil_dbg_txrx(wil, "%s()\n", __func__); in wil_rx_handle()
616 while ((*quota > 0) && (NULL != (skb = wil_vring_reap_rx(wil, v)))) { in wil_rx_handle()
619 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { in wil_rx_handle()
627 wil_rx_reorder(wil, skb); in wil_rx_handle()
630 wil_rx_refill(wil, v->size); in wil_rx_handle()
633 int wil_rx_init(struct wil6210_priv *wil, u16 size) in wil_rx_init() argument
635 struct vring *vring = &wil->vring_rx; in wil_rx_init()
638 wil_dbg_misc(wil, "%s()\n", __func__); in wil_rx_init()
641 wil_err(wil, "Rx ring already allocated\n"); in wil_rx_init()
646 rc = wil_vring_alloc(wil, vring); in wil_rx_init()
650 rc = wmi_rx_chain_add(wil, vring); in wil_rx_init()
654 rc = wil_rx_refill(wil, vring->size); in wil_rx_init()
660 wil_vring_free(wil, vring, 0); in wil_rx_init()
665 void wil_rx_fini(struct wil6210_priv *wil) in wil_rx_fini() argument
667 struct vring *vring = &wil->vring_rx; in wil_rx_fini()
669 wil_dbg_misc(wil, "%s()\n", __func__); in wil_rx_fini()
672 wil_vring_free(wil, vring, 0); in wil_rx_fini()
675 int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size, in wil_vring_init_tx() argument
703 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_tx()
704 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_init_tx()
706 wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__, in wil_vring_init_tx()
710 wil_err(wil, "Tx ring [%d] already allocated\n", id); in wil_vring_init_tx()
718 rc = wil_vring_alloc(wil, vring); in wil_vring_init_tx()
722 wil->vring2cid_tid[id][0] = cid; in wil_vring_init_tx()
723 wil->vring2cid_tid[id][1] = tid; in wil_vring_init_tx()
727 rc = wmi_call(wil, WMI_VRING_CFG_CMDID, &cmd, sizeof(cmd), in wil_vring_init_tx()
733 wil_err(wil, "Tx config failed, status 0x%02x\n", in wil_vring_init_tx()
741 if (wil->sta[cid].data_port_open && (agg_wsize >= 0)) in wil_vring_init_tx()
742 wil_addba_tx_request(wil, id, agg_wsize); in wil_vring_init_tx()
746 wil_vring_free(wil, vring, 1); in wil_vring_init_tx()
752 int wil_vring_init_bcast(struct wil6210_priv *wil, int id, int size) in wil_vring_init_bcast() argument
771 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_bcast()
772 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_init_bcast()
774 wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__, in wil_vring_init_bcast()
778 wil_err(wil, "Tx ring [%d] already allocated\n", id); in wil_vring_init_bcast()
786 rc = wil_vring_alloc(wil, vring); in wil_vring_init_bcast()
790 wil->vring2cid_tid[id][0] = WIL6210_MAX_CID; /* CID */ in wil_vring_init_bcast()
791 wil->vring2cid_tid[id][1] = 0; /* TID */ in wil_vring_init_bcast()
795 rc = wmi_call(wil, WMI_BCAST_VRING_CFG_CMDID, &cmd, sizeof(cmd), in wil_vring_init_bcast()
801 wil_err(wil, "Tx config failed, status 0x%02x\n", in wil_vring_init_bcast()
812 wil_vring_free(wil, vring, 1); in wil_vring_init_bcast()
818 void wil_vring_fini_tx(struct wil6210_priv *wil, int id) in wil_vring_fini_tx() argument
820 struct vring *vring = &wil->vring_tx[id]; in wil_vring_fini_tx()
821 struct vring_tx_data *txdata = &wil->vring_tx_data[id]; in wil_vring_fini_tx()
823 WARN_ON(!mutex_is_locked(&wil->mutex)); in wil_vring_fini_tx()
828 wil_dbg_misc(wil, "%s() id=%d\n", __func__, id); in wil_vring_fini_tx()
834 if (test_bit(wil_status_napi_en, wil->status)) in wil_vring_fini_tx()
835 napi_synchronize(&wil->napi_tx); in wil_vring_fini_tx()
837 wil_vring_free(wil, vring, 1); in wil_vring_fini_tx()
841 static struct vring *wil_find_tx_ucast(struct wil6210_priv *wil, in wil_find_tx_ucast() argument
846 int cid = wil_find_cid(wil, eth->h_dest); in wil_find_tx_ucast()
851 if (!wil->sta[cid].data_port_open && in wil_find_tx_ucast()
856 for (i = 0; i < ARRAY_SIZE(wil->vring2cid_tid); i++) { in wil_find_tx_ucast()
857 if (wil->vring2cid_tid[i][0] == cid) { in wil_find_tx_ucast()
858 struct vring *v = &wil->vring_tx[i]; in wil_find_tx_ucast()
860 wil_dbg_txrx(wil, "%s(%pM) -> [%d]\n", in wil_find_tx_ucast()
865 wil_dbg_txrx(wil, "vring[%d] not valid\n", i); in wil_find_tx_ucast()
874 static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
877 static struct vring *wil_find_tx_vring_sta(struct wil6210_priv *wil, in wil_find_tx_vring_sta() argument
889 v = &wil->vring_tx[i]; in wil_find_tx_vring_sta()
893 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_vring_sta()
897 if (!wil->sta[cid].data_port_open && in wil_find_tx_vring_sta()
901 wil_dbg_txrx(wil, "Tx -> ring %d\n", i); in wil_find_tx_vring_sta()
906 wil_dbg_txrx(wil, "Tx while no vrings active?\n"); in wil_find_tx_vring_sta()
923 static struct vring *wil_find_tx_bcast_1(struct wil6210_priv *wil, in wil_find_tx_bcast_1() argument
927 int i = wil->bcast_vring; in wil_find_tx_bcast_1()
931 v = &wil->vring_tx[i]; in wil_find_tx_bcast_1()
938 static void wil_set_da_for_vring(struct wil6210_priv *wil, in wil_set_da_for_vring() argument
942 int cid = wil->vring2cid_tid[vring_index][0]; in wil_set_da_for_vring()
944 ether_addr_copy(eth->h_dest, wil->sta[cid].addr); in wil_set_da_for_vring()
947 static struct vring *wil_find_tx_bcast_2(struct wil6210_priv *wil, in wil_find_tx_bcast_2() argument
959 v = &wil->vring_tx[i]; in wil_find_tx_bcast_2()
963 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_bcast_2()
966 if (!wil->sta[cid].data_port_open) in wil_find_tx_bcast_2()
970 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN)) in wil_find_tx_bcast_2()
976 wil_dbg_txrx(wil, "Tx while no vrings active?\n"); in wil_find_tx_bcast_2()
981 wil_dbg_txrx(wil, "BCAST -> ring %d\n", i); in wil_find_tx_bcast_2()
982 wil_set_da_for_vring(wil, skb, i); in wil_find_tx_bcast_2()
986 v2 = &wil->vring_tx[i]; in wil_find_tx_bcast_2()
989 cid = wil->vring2cid_tid[i][0]; in wil_find_tx_bcast_2()
992 if (!wil->sta[cid].data_port_open) in wil_find_tx_bcast_2()
995 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN)) in wil_find_tx_bcast_2()
1000 wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i); in wil_find_tx_bcast_2()
1001 wil_set_da_for_vring(wil, skb2, i); in wil_find_tx_bcast_2()
1002 wil_tx_vring(wil, v2, skb2); in wil_find_tx_bcast_2()
1004 wil_err(wil, "skb_copy failed\n"); in wil_find_tx_bcast_2()
1011 static struct vring *wil_find_tx_bcast(struct wil6210_priv *wil, in wil_find_tx_bcast() argument
1014 struct wireless_dev *wdev = wil->wdev; in wil_find_tx_bcast()
1017 return wil_find_tx_bcast_2(wil, skb); in wil_find_tx_bcast()
1019 if (wil->privacy) in wil_find_tx_bcast()
1020 return wil_find_tx_bcast_2(wil, skb); in wil_find_tx_bcast()
1022 return wil_find_tx_bcast_1(wil, skb); in wil_find_tx_bcast()
1054 static int wil_tx_desc_offload_cksum_set(struct wil6210_priv *wil, in wil_tx_desc_offload_cksum_set() argument
1102 static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, in __wil_tx_vring() argument
1105 struct device *dev = wil_to_dev(wil); in __wil_tx_vring()
1112 int vring_index = vring - wil->vring_tx; in __wil_tx_vring()
1113 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; in __wil_tx_vring()
1117 bool mcast = (vring_index == wil->bcast_vring); in __wil_tx_vring()
1120 wil_dbg_txrx(wil, "%s()\n", __func__); in __wil_tx_vring()
1126 wil_err_ratelimited(wil, in __wil_tx_vring()
1135 wil_dbg_txrx(wil, "Tx[%2d] skb %d bytes 0x%p -> %pad\n", vring_index, in __wil_tx_vring()
1156 if (unlikely(wil_tx_desc_offload_cksum_set(wil, d, skb))) { in __wil_tx_vring()
1157 wil_err(wil, "Tx[%2d] Failed to set cksum, drop packet\n", in __wil_tx_vring()
1172 wil_dbg_txrx(wil, "Tx[%2d] desc[%4d]\n", vring_index, i); in __wil_tx_vring()
1187 wil_tx_desc_offload_cksum_set(wil, d, skb); in __wil_tx_vring()
1194 wil_dbg_txrx(wil, "Tx[%2d] desc[%4d]\n", vring_index, i); in __wil_tx_vring()
1209 wil_dbg_txrx(wil, "Ring[%2d] not idle %d -> %d\n", in __wil_tx_vring()
1215 wil_dbg_txrx(wil, "Tx[%2d] swhead %d -> %d\n", vring_index, swhead, in __wil_tx_vring()
1218 iowrite32(vring->swhead, wil->csr + HOSTADDR(vring->hwtail)); in __wil_tx_vring()
1243 static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, in wil_tx_vring() argument
1246 int vring_index = vring - wil->vring_tx; in wil_tx_vring()
1247 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; in wil_tx_vring()
1251 rc = __wil_tx_vring(wil, vring, skb); in wil_tx_vring()
1258 struct wil6210_priv *wil = ndev_to_wil(ndev); in wil_start_xmit() local
1265 wil_dbg_txrx(wil, "%s()\n", __func__); in wil_start_xmit()
1266 if (unlikely(!test_bit(wil_status_fwready, wil->status))) { in wil_start_xmit()
1268 wil_err(wil, "FW not ready\n"); in wil_start_xmit()
1273 if (unlikely(!test_bit(wil_status_fwconnected, wil->status))) { in wil_start_xmit()
1274 wil_err(wil, "FW not connected\n"); in wil_start_xmit()
1277 if (unlikely(wil->wdev->iftype == NL80211_IFTYPE_MONITOR)) { in wil_start_xmit()
1278 wil_err(wil, "Xmit in monitor mode not supported\n"); in wil_start_xmit()
1284 if (wil->wdev->iftype == NL80211_IFTYPE_STATION) { in wil_start_xmit()
1286 vring = wil_find_tx_vring_sta(wil, skb); in wil_start_xmit()
1288 vring = bcast ? wil_find_tx_bcast(wil, skb) : in wil_start_xmit()
1289 wil_find_tx_ucast(wil, skb); in wil_start_xmit()
1292 wil_dbg_txrx(wil, "No Tx VRING found for %pM\n", eth->h_dest); in wil_start_xmit()
1296 rc = wil_tx_vring(wil, vring, skb); in wil_start_xmit()
1300 netif_tx_stop_all_queues(wil_to_ndev(wil)); in wil_start_xmit()
1301 wil_dbg_txrx(wil, "netif_tx_stop : ring full\n"); in wil_start_xmit()
1344 int wil_tx_complete(struct wil6210_priv *wil, int ringid) in wil_tx_complete() argument
1346 struct net_device *ndev = wil_to_ndev(wil); in wil_tx_complete()
1347 struct device *dev = wil_to_dev(wil); in wil_tx_complete()
1348 struct vring *vring = &wil->vring_tx[ringid]; in wil_tx_complete()
1349 struct vring_tx_data *txdata = &wil->vring_tx_data[ringid]; in wil_tx_complete()
1351 int cid = wil->vring2cid_tid[ringid][0]; in wil_tx_complete()
1358 wil_err(wil, "Tx irq[%d]: vring not initialized\n", ringid); in wil_tx_complete()
1363 wil_info(wil, "Tx irq[%d]: vring disabled\n", ringid); in wil_tx_complete()
1367 wil_dbg_txrx(wil, "%s(%d)\n", __func__, ringid); in wil_tx_complete()
1372 stats = &wil->sta[cid].stats; in wil_tx_complete()
1403 wil_dbg_txrx(wil, in wil_tx_complete()
1442 wil_dbg_txrx(wil, "Ring[%2d] idle %d -> %d\n", in wil_tx_complete()
1448 wil_dbg_txrx(wil, "netif_tx_wake : ring not full\n"); in wil_tx_complete()
1449 netif_tx_wake_all_queues(wil_to_ndev(wil)); in wil_tx_complete()