Lines Matching refs:vring
45 static inline int wil_vring_is_empty(struct vring *vring) in wil_vring_is_empty() argument
47 return vring->swhead == vring->swtail; in wil_vring_is_empty()
50 static inline u32 wil_vring_next_tail(struct vring *vring) in wil_vring_next_tail() argument
52 return (vring->swtail + 1) % vring->size; in wil_vring_next_tail()
55 static inline void wil_vring_advance_head(struct vring *vring, int n) in wil_vring_advance_head() argument
57 vring->swhead = (vring->swhead + n) % vring->size; in wil_vring_advance_head()
60 static inline int wil_vring_is_full(struct vring *vring) in wil_vring_is_full() argument
62 return wil_vring_next_tail(vring) == vring->swhead; in wil_vring_is_full()
66 static inline int wil_vring_used_tx(struct vring *vring) in wil_vring_used_tx() argument
68 u32 swhead = vring->swhead; in wil_vring_used_tx()
69 u32 swtail = vring->swtail; in wil_vring_used_tx()
70 return (vring->size + swhead - swtail) % vring->size; in wil_vring_used_tx()
74 static inline int wil_vring_avail_tx(struct vring *vring) in wil_vring_avail_tx() argument
76 return vring->size - wil_vring_used_tx(vring) - 1; in wil_vring_avail_tx()
80 static inline int wil_vring_wmark_low(struct vring *vring) in wil_vring_wmark_low() argument
82 return vring->size/8; in wil_vring_wmark_low()
86 static inline int wil_vring_wmark_high(struct vring *vring) in wil_vring_wmark_high() argument
88 return vring->size/4; in wil_vring_wmark_high()
97 static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring) in wil_vring_alloc() argument
100 size_t sz = vring->size * sizeof(vring->va[0]); in wil_vring_alloc()
105 BUILD_BUG_ON(sizeof(vring->va[0]) != 32); in wil_vring_alloc()
107 vring->swhead = 0; in wil_vring_alloc()
108 vring->swtail = 0; in wil_vring_alloc()
109 vring->ctx = kcalloc(vring->size, sizeof(vring->ctx[0]), GFP_KERNEL); in wil_vring_alloc()
110 if (!vring->ctx) { in wil_vring_alloc()
111 vring->va = NULL; in wil_vring_alloc()
117 vring->va = dma_alloc_coherent(dev, sz, &vring->pa, GFP_KERNEL); in wil_vring_alloc()
118 if (!vring->va) { in wil_vring_alloc()
119 kfree(vring->ctx); in wil_vring_alloc()
120 vring->ctx = NULL; in wil_vring_alloc()
127 for (i = 0; i < vring->size; i++) { in wil_vring_alloc()
128 volatile struct vring_tx_desc *_d = &vring->va[i].tx; in wil_vring_alloc()
133 wil_dbg_misc(wil, "vring[%d] 0x%p:%pad 0x%p\n", vring->size, in wil_vring_alloc()
134 vring->va, &vring->pa, vring->ctx); in wil_vring_alloc()
157 static void wil_vring_free(struct wil6210_priv *wil, struct vring *vring, in wil_vring_free() argument
161 size_t sz = vring->size * sizeof(vring->va[0]); in wil_vring_free()
164 int vring_index = vring - wil->vring_tx; in wil_vring_free()
167 vring_index, vring->size, vring->va, in wil_vring_free()
168 &vring->pa, vring->ctx); in wil_vring_free()
171 vring->size, vring->va, in wil_vring_free()
172 &vring->pa, vring->ctx); in wil_vring_free()
175 while (!wil_vring_is_empty(vring)) { in wil_vring_free()
183 &vring->va[vring->swtail].tx; in wil_vring_free()
185 ctx = &vring->ctx[vring->swtail]; in wil_vring_free()
190 vring->swtail = wil_vring_next_tail(vring); in wil_vring_free()
194 &vring->va[vring->swhead].rx; in wil_vring_free()
196 ctx = &vring->ctx[vring->swhead]; in wil_vring_free()
202 wil_vring_advance_head(vring, 1); in wil_vring_free()
205 dma_free_coherent(dev, sz, (void *)vring->va, vring->pa); in wil_vring_free()
206 kfree(vring->ctx); in wil_vring_free()
207 vring->pa = 0; in wil_vring_free()
208 vring->va = NULL; in wil_vring_free()
209 vring->ctx = NULL; in wil_vring_free()
217 static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring, in wil_vring_alloc_skb() argument
223 volatile struct vring_rx_desc *_d = &vring->va[i].rx; in wil_vring_alloc_skb()
247 vring->ctx[i].skb = skb; in wil_vring_alloc_skb()
369 struct vring *vring) in wil_vring_reap_rx() argument
382 int i = (int)vring->swhead; in wil_vring_reap_rx()
387 if (unlikely(wil_vring_is_empty(vring))) in wil_vring_reap_rx()
390 _d = &vring->va[i].rx; in wil_vring_reap_rx()
396 skb = vring->ctx[i].skb; in wil_vring_reap_rx()
397 vring->ctx[i].skb = NULL; in wil_vring_reap_rx()
398 wil_vring_advance_head(vring, 1); in wil_vring_reap_rx()
494 struct vring *v = &wil->vring_rx; in wil_rx_refill()
608 struct vring *v = &wil->vring_rx; in wil_rx_handle()
635 struct vring *vring = &wil->vring_rx; in wil_rx_init() local
640 if (vring->va) { in wil_rx_init()
645 vring->size = size; 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()
667 struct vring *vring = &wil->vring_rx; in wil_rx_fini() local
671 if (vring->va) in wil_rx_fini()
672 wil_vring_free(wil, vring, 0); in wil_rx_fini()
703 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_tx() local
709 if (vring->va) { in wil_vring_init_tx()
717 vring->size = size; in wil_vring_init_tx()
718 rc = wil_vring_alloc(wil, vring); in wil_vring_init_tx()
725 cmd.vring_cfg.tx_sw_ring.ring_mem_base = cpu_to_le64(vring->pa); in wil_vring_init_tx()
738 vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr); in wil_vring_init_tx()
746 wil_vring_free(wil, vring, 1); in wil_vring_init_tx()
771 struct vring *vring = &wil->vring_tx[id]; in wil_vring_init_bcast() local
777 if (vring->va) { in wil_vring_init_bcast()
785 vring->size = size; in wil_vring_init_bcast()
786 rc = wil_vring_alloc(wil, vring); in wil_vring_init_bcast()
793 cmd.vring_cfg.tx_sw_ring.ring_mem_base = cpu_to_le64(vring->pa); in wil_vring_init_bcast()
806 vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr); in wil_vring_init_bcast()
812 wil_vring_free(wil, vring, 1); in wil_vring_init_bcast()
820 struct vring *vring = &wil->vring_tx[id]; in wil_vring_fini_tx() local
825 if (!vring->va) 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()
858 struct vring *v = &wil->vring_tx[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()
880 struct vring *v; 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()
926 struct vring *v; in wil_find_tx_bcast_1()
947 static struct vring *wil_find_tx_bcast_2(struct wil6210_priv *wil, in wil_find_tx_bcast_2()
950 struct vring *v, *v2; in wil_find_tx_bcast_2()
1011 static struct vring *wil_find_tx_bcast(struct wil6210_priv *wil, in wil_find_tx_bcast()
1102 static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, in __wil_tx_vring() argument
1108 u32 swhead = vring->swhead; in __wil_tx_vring()
1109 int avail = wil_vring_avail_tx(vring); in __wil_tx_vring()
1112 int vring_index = vring - wil->vring_tx; in __wil_tx_vring()
1131 _d = &vring->va[i].tx; in __wil_tx_vring()
1142 vring->ctx[i].mapped_as = wil_mapped_as_single; in __wil_tx_vring()
1162 vring->ctx[i].nr_frags = nr_frags; in __wil_tx_vring()
1175 i = (swhead + f + 1) % vring->size; in __wil_tx_vring()
1176 _d = &vring->va[i].tx; in __wil_tx_vring()
1181 vring->ctx[i].mapped_as = wil_mapped_as_page; in __wil_tx_vring()
1202 vring->ctx[i].skb = skb_get(skb); in __wil_tx_vring()
1205 used = wil_vring_used_tx(vring); in __wil_tx_vring()
1214 wil_vring_advance_head(vring, nr_frags + 1); in __wil_tx_vring()
1216 vring->swhead); in __wil_tx_vring()
1218 iowrite32(vring->swhead, wil->csr + HOSTADDR(vring->hwtail)); in __wil_tx_vring()
1227 i = (swhead + f) % vring->size; in __wil_tx_vring()
1228 ctx = &vring->ctx[i]; in __wil_tx_vring()
1229 _d = &vring->va[i].tx; 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()
1251 rc = __wil_tx_vring(wil, vring, skb); in wil_tx_vring()
1261 struct vring *vring; in wil_start_xmit() local
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()
1291 if (unlikely(!vring)) { in wil_start_xmit()
1296 rc = wil_tx_vring(wil, vring, skb); in wil_start_xmit()
1299 if (unlikely(wil_vring_avail_tx(vring) < wil_vring_wmark_low(vring))) { in wil_start_xmit()
1348 struct vring *vring = &wil->vring_tx[ringid]; in wil_tx_complete() local
1357 if (unlikely(!vring->va)) { in wil_tx_complete()
1369 used_before_complete = wil_vring_used_tx(vring); in wil_tx_complete()
1374 while (!wil_vring_is_empty(vring)) { in wil_tx_complete()
1376 struct wil_ctx *ctx = &vring->ctx[vring->swtail]; in wil_tx_complete()
1381 int lf = (vring->swtail + ctx->nr_frags) % vring->size; in wil_tx_complete()
1384 _d = &vring->va[lf].tx; in wil_tx_complete()
1388 new_swtail = (lf + 1) % vring->size; in wil_tx_complete()
1389 while (vring->swtail != new_swtail) { in wil_tx_complete()
1394 ctx = &vring->ctx[vring->swtail]; in wil_tx_complete()
1396 _d = &vring->va[vring->swtail].tx; in wil_tx_complete()
1401 trace_wil6210_tx_done(ringid, vring->swtail, dmalen, in wil_tx_complete()
1405 ringid, vring->swtail, dmalen, in wil_tx_complete()
1433 vring->swtail = wil_vring_next_tail(vring); in wil_tx_complete()
1439 used_new = wil_vring_used_tx(vring); in wil_tx_complete()
1447 if (wil_vring_avail_tx(vring) > wil_vring_wmark_high(vring)) { in wil_tx_complete()