• Home
  • Raw
  • Download

Lines Matching full:pmc

24 #include "pmc.h"
31 static int wil_is_pmc_allocated(struct pmc_ctx *pmc) in wil_is_pmc_allocated() argument
33 return !!pmc->pring_va; in wil_is_pmc_allocated()
38 memset(&wil->pmc, 0, sizeof(struct pmc_ctx)); in wil_pmc_init()
39 mutex_init(&wil->pmc.lock); in wil_pmc_init()
45 * Initialize the descriptors as required by pmc dma.
55 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_alloc() local
61 mutex_lock(&pmc->lock); in wil_pmc_alloc()
63 if (wil_is_pmc_allocated(pmc)) { in wil_pmc_alloc()
65 wil_err(wil, "ERROR pmc is already allocated\n"); in wil_pmc_alloc()
92 pmc->num_descriptors = num_descriptors; in wil_pmc_alloc()
93 pmc->descriptor_size = descriptor_size; in wil_pmc_alloc()
98 /* allocate descriptors info list in pmc context*/ in wil_pmc_alloc()
99 pmc->descriptors = kcalloc(num_descriptors, in wil_pmc_alloc()
102 if (!pmc->descriptors) { in wil_pmc_alloc()
103 wil_err(wil, "ERROR allocating pmc skb list\n"); in wil_pmc_alloc()
108 pmc->descriptors); in wil_pmc_alloc()
126 pmc->pring_va = dma_alloc_coherent(dev, in wil_pmc_alloc()
128 &pmc->pring_pa, in wil_pmc_alloc()
137 pmc->pring_va, &pmc->pring_pa, in wil_pmc_alloc()
142 if (!pmc->pring_va) { in wil_pmc_alloc()
143 wil_err(wil, "ERROR allocating pmc pring\n"); in wil_pmc_alloc()
148 * For Tx, Rx, and PMC, ownership bit is at the same location, thus in wil_pmc_alloc()
152 struct vring_tx_desc *_d = &pmc->pring_va[i]; in wil_pmc_alloc()
156 pmc->descriptors[i].va = dma_alloc_coherent(dev, in wil_pmc_alloc()
158 &pmc->descriptors[i].pa, in wil_pmc_alloc()
161 if (unlikely(!pmc->descriptors[i].va)) { in wil_pmc_alloc()
162 wil_err(wil, "ERROR allocating pmc descriptor %d", i); in wil_pmc_alloc()
167 u32 *p = (u32 *)pmc->descriptors[i].va + j; in wil_pmc_alloc()
173 cpu_to_le32(lower_32_bits(pmc->descriptors[i].pa)); in wil_pmc_alloc()
175 cpu_to_le16((u16)upper_32_bits(pmc->descriptors[i].pa)); in wil_pmc_alloc()
185 pmc_cmd.ring_size = cpu_to_le16(pmc->num_descriptors); in wil_pmc_alloc()
186 pmc_cmd.mem_base = cpu_to_le64(pmc->pring_pa); in wil_pmc_alloc()
189 pmc->last_cmd_status = wmi_send(wil, in wil_pmc_alloc()
194 if (pmc->last_cmd_status) { in wil_pmc_alloc()
197 pmc->last_cmd_status); in wil_pmc_alloc()
201 mutex_unlock(&pmc->lock); in wil_pmc_alloc()
207 for (i = 0; i < num_descriptors && pmc->descriptors[i].va; i++) { in wil_pmc_alloc()
210 pmc->descriptors[i].va, in wil_pmc_alloc()
211 pmc->descriptors[i].pa); in wil_pmc_alloc()
213 pmc->descriptors[i].va = NULL; in wil_pmc_alloc()
219 pmc->pring_va, in wil_pmc_alloc()
220 pmc->pring_pa); in wil_pmc_alloc()
222 pmc->pring_va = NULL; in wil_pmc_alloc()
226 kfree(pmc->descriptors); in wil_pmc_alloc()
227 pmc->descriptors = NULL; in wil_pmc_alloc()
230 pmc->last_cmd_status = last_cmd_err; in wil_pmc_alloc()
231 mutex_unlock(&pmc->lock); in wil_pmc_alloc()
240 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_free() local
245 mutex_lock(&pmc->lock); in wil_pmc_free()
247 pmc->last_cmd_status = 0; in wil_pmc_free()
249 if (!wil_is_pmc_allocated(pmc)) { in wil_pmc_free()
252 pmc->last_cmd_status = -EPERM; in wil_pmc_free()
253 mutex_unlock(&pmc->lock); in wil_pmc_free()
260 pmc->last_cmd_status = in wil_pmc_free()
263 if (pmc->last_cmd_status) { in wil_pmc_free()
266 pmc->last_cmd_status); in wil_pmc_free()
269 * Continue to freeing all memory allocated for pmc. in wil_pmc_free()
274 if (pmc->pring_va) { in wil_pmc_free()
276 pmc->num_descriptors; in wil_pmc_free()
279 pmc->pring_va); in wil_pmc_free()
280 dma_free_coherent(dev, buf_size, pmc->pring_va, pmc->pring_pa); in wil_pmc_free()
282 pmc->pring_va = NULL; in wil_pmc_free()
284 pmc->last_cmd_status = -ENOENT; in wil_pmc_free()
287 if (pmc->descriptors) { in wil_pmc_free()
291 i < pmc->num_descriptors && pmc->descriptors[i].va; i++) { in wil_pmc_free()
293 pmc->descriptor_size, in wil_pmc_free()
294 pmc->descriptors[i].va, in wil_pmc_free()
295 pmc->descriptors[i].pa); in wil_pmc_free()
296 pmc->descriptors[i].va = NULL; in wil_pmc_free()
299 pmc->num_descriptors); in wil_pmc_free()
301 "pmc_free: free pmc descriptors info list %p\n", in wil_pmc_free()
302 pmc->descriptors); in wil_pmc_free()
303 kfree(pmc->descriptors); in wil_pmc_free()
304 pmc->descriptors = NULL; in wil_pmc_free()
306 pmc->last_cmd_status = -ENOENT; in wil_pmc_free()
309 mutex_unlock(&pmc->lock); in wil_pmc_free()
319 wil->pmc.last_cmd_status); in wil_pmc_last_cmd_status()
321 return wil->pmc.last_cmd_status; in wil_pmc_last_cmd_status()
332 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_read() local
338 mutex_lock(&pmc->lock); in wil_pmc_read()
340 if (!wil_is_pmc_allocated(pmc)) { in wil_pmc_read()
341 wil_err(wil, "error, pmc is not allocated!\n"); in wil_pmc_read()
342 pmc->last_cmd_status = -EPERM; in wil_pmc_read()
343 mutex_unlock(&pmc->lock); in wil_pmc_read()
347 pmc_size = pmc->descriptor_size * pmc->num_descriptors; in wil_pmc_read()
353 pmc->last_cmd_status = 0; in wil_pmc_read()
356 do_div(idx, pmc->descriptor_size); in wil_pmc_read()
357 offset = *f_pos - (idx * pmc->descriptor_size); in wil_pmc_read()
361 "pmc_read: reached end of pmc buf: %lld >= %u\n", in wil_pmc_read()
363 pmc->last_cmd_status = -ERANGE; in wil_pmc_read()
375 pmc->descriptors[idx].va, in wil_pmc_read()
376 pmc->descriptor_size); in wil_pmc_read()
379 mutex_unlock(&pmc->lock); in wil_pmc_read()
388 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_llseek() local
391 mutex_lock(&pmc->lock); in wil_pmc_llseek()
393 if (!wil_is_pmc_allocated(pmc)) { in wil_pmc_llseek()
394 wil_err(wil, "error, pmc is not allocated!\n"); in wil_pmc_llseek()
395 pmc->last_cmd_status = -EPERM; in wil_pmc_llseek()
396 mutex_unlock(&pmc->lock); in wil_pmc_llseek()
400 pmc_size = pmc->descriptor_size * pmc->num_descriptors; in wil_pmc_llseek()
430 mutex_unlock(&pmc->lock); in wil_pmc_llseek()