Lines Matching refs:pmc
14 #include "pmc.h"
21 static int wil_is_pmc_allocated(struct pmc_ctx *pmc)
23 return !!pmc->pring_va;
28 memset(&wil->pmc, 0, sizeof(struct pmc_ctx));
29 mutex_init(&wil->pmc.lock);
34 * Initialize the descriptors as required by pmc dma.
44 struct pmc_ctx *pmc = &wil->pmc;
50 mutex_lock(&pmc->lock);
52 if (wil_is_pmc_allocated(pmc)) {
54 wil_err(wil, "ERROR pmc is already allocated\n");
81 pmc->num_descriptors = num_descriptors;
82 pmc->descriptor_size = descriptor_size;
87 /* allocate descriptors info list in pmc context*/
88 pmc->descriptors = kcalloc(num_descriptors,
91 if (!pmc->descriptors) {
92 wil_err(wil, "ERROR allocating pmc skb list\n");
97 pmc->descriptors);
115 pmc->pring_va = dma_alloc_coherent(dev,
117 &pmc->pring_pa,
126 pmc->pring_va, &pmc->pring_pa,
131 if (!pmc->pring_va) {
132 wil_err(wil, "ERROR allocating pmc pring\n");
141 struct vring_tx_desc *_d = &pmc->pring_va[i];
145 pmc->descriptors[i].va = dma_alloc_coherent(dev,
147 &pmc->descriptors[i].pa,
150 if (unlikely(!pmc->descriptors[i].va)) {
151 wil_err(wil, "ERROR allocating pmc descriptor %d", i);
156 u32 *p = (u32 *)pmc->descriptors[i].va + j;
162 cpu_to_le32(lower_32_bits(pmc->descriptors[i].pa));
164 cpu_to_le16((u16)upper_32_bits(pmc->descriptors[i].pa));
174 pmc_cmd.ring_size = cpu_to_le16(pmc->num_descriptors);
175 pmc_cmd.mem_base = cpu_to_le64(pmc->pring_pa);
178 pmc->last_cmd_status = wmi_send(wil,
183 if (pmc->last_cmd_status) {
186 pmc->last_cmd_status);
190 mutex_unlock(&pmc->lock);
196 for (i = 0; i < num_descriptors && pmc->descriptors[i].va; i++) {
199 pmc->descriptors[i].va,
200 pmc->descriptors[i].pa);
202 pmc->descriptors[i].va = NULL;
208 pmc->pring_va,
209 pmc->pring_pa);
211 pmc->pring_va = NULL;
215 kfree(pmc->descriptors);
216 pmc->descriptors = NULL;
219 pmc->last_cmd_status = last_cmd_err;
220 mutex_unlock(&pmc->lock);
228 struct pmc_ctx *pmc = &wil->pmc;
233 mutex_lock(&pmc->lock);
235 pmc->last_cmd_status = 0;
237 if (!wil_is_pmc_allocated(pmc)) {
240 pmc->last_cmd_status = -EPERM;
241 mutex_unlock(&pmc->lock);
248 pmc->last_cmd_status =
251 if (pmc->last_cmd_status) {
254 pmc->last_cmd_status);
257 * Continue to freeing all memory allocated for pmc.
262 if (pmc->pring_va) {
264 pmc->num_descriptors;
267 pmc->pring_va);
268 dma_free_coherent(dev, buf_size, pmc->pring_va, pmc->pring_pa);
270 pmc->pring_va = NULL;
272 pmc->last_cmd_status = -ENOENT;
275 if (pmc->descriptors) {
279 i < pmc->num_descriptors && pmc->descriptors[i].va; i++) {
281 pmc->descriptor_size,
282 pmc->descriptors[i].va,
283 pmc->descriptors[i].pa);
284 pmc->descriptors[i].va = NULL;
287 pmc->num_descriptors);
289 "pmc_free: free pmc descriptors info list %p\n",
290 pmc->descriptors);
291 kfree(pmc->descriptors);
292 pmc->descriptors = NULL;
294 pmc->last_cmd_status = -ENOENT;
297 mutex_unlock(&pmc->lock);
306 wil->pmc.last_cmd_status);
308 return wil->pmc.last_cmd_status;
318 struct pmc_ctx *pmc = &wil->pmc;
324 mutex_lock(&pmc->lock);
326 if (!wil_is_pmc_allocated(pmc)) {
327 wil_err(wil, "error, pmc is not allocated!\n");
328 pmc->last_cmd_status = -EPERM;
329 mutex_unlock(&pmc->lock);
333 pmc_size = pmc->descriptor_size * pmc->num_descriptors;
339 pmc->last_cmd_status = 0;
342 do_div(idx, pmc->descriptor_size);
343 offset = *f_pos - (idx * pmc->descriptor_size);
347 "pmc_read: reached end of pmc buf: %lld >= %u\n",
349 pmc->last_cmd_status = -ERANGE;
361 pmc->descriptors[idx].va,
362 pmc->descriptor_size);
365 mutex_unlock(&pmc->lock);
374 struct pmc_ctx *pmc = &wil->pmc;
377 mutex_lock(&pmc->lock);
379 if (!wil_is_pmc_allocated(pmc)) {
380 wil_err(wil, "error, pmc is not allocated!\n");
381 pmc->last_cmd_status = -EPERM;
382 mutex_unlock(&pmc->lock);
386 pmc_size = pmc->descriptor_size * pmc->num_descriptors;
416 mutex_unlock(&pmc->lock);
424 struct pmc_ctx *pmc = &wil->pmc;
426 sizeof(struct vring_rx_desc) * pmc->num_descriptors;
428 mutex_lock(&pmc->lock);
430 if (!wil_is_pmc_allocated(pmc)) {
431 wil_err(wil, "error, pmc is not allocated!\n");
432 pmc->last_cmd_status = -EPERM;
433 mutex_unlock(&pmc->lock);
439 seq_write(s, pmc->pring_va, pmc_ring_size);
441 mutex_unlock(&pmc->lock);