Lines Matching refs:pmc
30 static int wil_is_pmc_allocated(struct pmc_ctx *pmc) in wil_is_pmc_allocated() argument
32 return !!pmc->pring_va; in wil_is_pmc_allocated()
37 memset(&wil->pmc, 0, sizeof(struct pmc_ctx)); in wil_pmc_init()
38 mutex_init(&wil->pmc.lock); in wil_pmc_init()
54 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_alloc() local
58 mutex_lock(&pmc->lock); in wil_pmc_alloc()
60 if (wil_is_pmc_allocated(pmc)) { in wil_pmc_alloc()
66 pmc->num_descriptors = num_descriptors; in wil_pmc_alloc()
67 pmc->descriptor_size = descriptor_size; in wil_pmc_alloc()
73 pmc->descriptors = kcalloc(num_descriptors, in wil_pmc_alloc()
76 if (!pmc->descriptors) { in wil_pmc_alloc()
83 __func__, pmc->descriptors); in wil_pmc_alloc()
89 pmc->pring_va = dma_alloc_coherent(dev, in wil_pmc_alloc()
91 &pmc->pring_pa, in wil_pmc_alloc()
97 pmc->pring_va, &pmc->pring_pa, in wil_pmc_alloc()
102 if (!pmc->pring_va) { in wil_pmc_alloc()
112 struct vring_tx_desc *_d = &pmc->pring_va[i]; in wil_pmc_alloc()
116 pmc->descriptors[i].va = dma_alloc_coherent(dev, in wil_pmc_alloc()
118 &pmc->descriptors[i].pa, in wil_pmc_alloc()
121 if (unlikely(!pmc->descriptors[i].va)) { in wil_pmc_alloc()
129 u32 *p = (u32 *)pmc->descriptors[i].va + j; in wil_pmc_alloc()
135 cpu_to_le32(lower_32_bits(pmc->descriptors[i].pa)); in wil_pmc_alloc()
137 cpu_to_le16((u16)upper_32_bits(pmc->descriptors[i].pa)); in wil_pmc_alloc()
147 pmc_cmd.ring_size = cpu_to_le16(pmc->num_descriptors); in wil_pmc_alloc()
148 pmc_cmd.mem_base = cpu_to_le64(pmc->pring_pa); in wil_pmc_alloc()
151 pmc->last_cmd_status = wmi_send(wil, in wil_pmc_alloc()
155 if (pmc->last_cmd_status) { in wil_pmc_alloc()
158 __func__, pmc->last_cmd_status); in wil_pmc_alloc()
162 mutex_unlock(&pmc->lock); in wil_pmc_alloc()
168 for (i = 0; pmc->descriptors[i].va && i < num_descriptors; i++) { in wil_pmc_alloc()
171 pmc->descriptors[i].va, in wil_pmc_alloc()
172 pmc->descriptors[i].pa); in wil_pmc_alloc()
174 pmc->descriptors[i].va = NULL; in wil_pmc_alloc()
180 pmc->pring_va, in wil_pmc_alloc()
181 pmc->pring_pa); in wil_pmc_alloc()
183 pmc->pring_va = NULL; in wil_pmc_alloc()
188 kfree(pmc->descriptors); in wil_pmc_alloc()
189 pmc->descriptors = NULL; in wil_pmc_alloc()
192 pmc->last_cmd_status = -ENOMEM; in wil_pmc_alloc()
193 mutex_unlock(&pmc->lock); in wil_pmc_alloc()
202 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_free() local
206 mutex_lock(&pmc->lock); in wil_pmc_free()
208 pmc->last_cmd_status = 0; in wil_pmc_free()
210 if (!wil_is_pmc_allocated(pmc)) { in wil_pmc_free()
213 pmc->last_cmd_status = -EPERM; in wil_pmc_free()
214 mutex_unlock(&pmc->lock); in wil_pmc_free()
222 pmc->last_cmd_status = in wil_pmc_free()
225 if (pmc->last_cmd_status) { in wil_pmc_free()
228 __func__, pmc->last_cmd_status); in wil_pmc_free()
236 if (pmc->pring_va) { in wil_pmc_free()
238 pmc->num_descriptors; in wil_pmc_free()
241 __func__, pmc->pring_va); in wil_pmc_free()
242 dma_free_coherent(dev, buf_size, pmc->pring_va, pmc->pring_pa); in wil_pmc_free()
244 pmc->pring_va = NULL; in wil_pmc_free()
246 pmc->last_cmd_status = -ENOENT; in wil_pmc_free()
249 if (pmc->descriptors) { in wil_pmc_free()
253 pmc->descriptors[i].va && i < pmc->num_descriptors; i++) { in wil_pmc_free()
255 pmc->descriptor_size, in wil_pmc_free()
256 pmc->descriptors[i].va, in wil_pmc_free()
257 pmc->descriptors[i].pa); in wil_pmc_free()
258 pmc->descriptors[i].va = NULL; in wil_pmc_free()
261 __func__, i, pmc->num_descriptors); in wil_pmc_free()
264 __func__, pmc->descriptors); in wil_pmc_free()
265 kfree(pmc->descriptors); in wil_pmc_free()
266 pmc->descriptors = NULL; in wil_pmc_free()
268 pmc->last_cmd_status = -ENOENT; in wil_pmc_free()
271 mutex_unlock(&pmc->lock); in wil_pmc_free()
281 wil->pmc.last_cmd_status); in wil_pmc_last_cmd_status()
283 return wil->pmc.last_cmd_status; in wil_pmc_last_cmd_status()
294 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_read() local
298 size_t pmc_size = pmc->descriptor_size * pmc->num_descriptors; in wil_pmc_read()
300 mutex_lock(&pmc->lock); in wil_pmc_read()
302 if (!wil_is_pmc_allocated(pmc)) { in wil_pmc_read()
304 pmc->last_cmd_status = -EPERM; in wil_pmc_read()
305 mutex_unlock(&pmc->lock); in wil_pmc_read()
313 pmc->last_cmd_status = 0; in wil_pmc_read()
316 do_div(idx, pmc->descriptor_size); in wil_pmc_read()
317 offset = *f_pos - (idx * pmc->descriptor_size); in wil_pmc_read()
322 pmc->last_cmd_status = -ERANGE; in wil_pmc_read()
334 pmc->descriptors[idx].va, in wil_pmc_read()
335 pmc->descriptor_size); in wil_pmc_read()
338 mutex_unlock(&pmc->lock); in wil_pmc_read()
347 struct pmc_ctx *pmc = &wil->pmc; in wil_pmc_llseek() local
348 size_t pmc_size = pmc->descriptor_size * pmc->num_descriptors; in wil_pmc_llseek()