Lines Matching +full:wait +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/delay.h>
55 int wait);
65 return vdev->priv; in svnic_dev_priv()
76 return -EINVAL; in vnic_dev_discover_res()
78 if (bar->len < VNIC_MAX_RES_HDR_SIZE) { in vnic_dev_discover_res()
81 return -EINVAL; in vnic_dev_discover_res()
84 rh = bar->vaddr; in vnic_dev_discover_res()
86 pr_err("vNIC BAR0 res hdr not mem-mapped\n"); in vnic_dev_discover_res()
88 return -EINVAL; in vnic_dev_discover_res()
91 if (ioread32(&rh->magic) != VNIC_RES_MAGIC || in vnic_dev_discover_res()
92 ioread32(&rh->version) != VNIC_RES_VERSION) { in vnic_dev_discover_res()
95 ioread32(&rh->magic), ioread32(&rh->version)); in vnic_dev_discover_res()
97 return -EINVAL; in vnic_dev_discover_res()
102 while ((type = ioread8(&r->type)) != RES_TYPE_EOL) { in vnic_dev_discover_res()
104 u8 bar_num = ioread8(&r->bar); in vnic_dev_discover_res()
105 u32 bar_offset = ioread32(&r->bar_offset); in vnic_dev_discover_res()
106 u32 count = ioread32(&r->count); in vnic_dev_discover_res()
124 if (len + bar_offset > bar->len) { in vnic_dev_discover_res()
125 pr_err("vNIC BAR0 resource %d out-of-bounds, offset 0x%x + size 0x%x > bar len 0x%lx\n", in vnic_dev_discover_res()
128 bar->len); in vnic_dev_discover_res()
130 return -EINVAL; in vnic_dev_discover_res()
144 vdev->res[type].count = count; in vnic_dev_discover_res()
145 vdev->res[type].vaddr = (char __iomem *)bar->vaddr + bar_offset; in vnic_dev_discover_res()
154 return vdev->res[type].count; in svnic_dev_get_res_count()
160 if (!vdev->res[type].vaddr) in svnic_dev_get_res()
168 return (char __iomem *)vdev->res[type].vaddr + in svnic_dev_get_res()
172 return (char __iomem *)vdev->res[type].vaddr; in svnic_dev_get_res()
189 ring->base_align = 512; in svnic_dev_desc_ring_size()
194 ring->desc_count = ALIGN(desc_count, count_align); in svnic_dev_desc_ring_size()
196 ring->desc_size = ALIGN(desc_size, desc_align); in svnic_dev_desc_ring_size()
198 ring->size = ring->desc_count * ring->desc_size; in svnic_dev_desc_ring_size()
199 ring->size_unaligned = ring->size + ring->base_align; in svnic_dev_desc_ring_size()
201 return ring->size_unaligned; in svnic_dev_desc_ring_size()
206 memset(ring->descs, 0, ring->size); in svnic_dev_clear_desc_ring()
214 ring->descs_unaligned = dma_alloc_coherent(&vdev->pdev->dev, in svnic_dev_alloc_desc_ring()
215 ring->size_unaligned, &ring->base_addr_unaligned, in svnic_dev_alloc_desc_ring()
217 if (!ring->descs_unaligned) { in svnic_dev_alloc_desc_ring()
219 (int)ring->size); in svnic_dev_alloc_desc_ring()
221 return -ENOMEM; in svnic_dev_alloc_desc_ring()
224 ring->base_addr = ALIGN(ring->base_addr_unaligned, in svnic_dev_alloc_desc_ring()
225 ring->base_align); in svnic_dev_alloc_desc_ring()
226 ring->descs = (u8 *)ring->descs_unaligned + in svnic_dev_alloc_desc_ring()
227 (ring->base_addr - ring->base_addr_unaligned); in svnic_dev_alloc_desc_ring()
231 ring->desc_avail = ring->desc_count - 1; in svnic_dev_alloc_desc_ring()
238 if (ring->descs) { in svnic_dev_free_desc_ring()
239 dma_free_coherent(&vdev->pdev->dev, in svnic_dev_free_desc_ring()
240 ring->size_unaligned, in svnic_dev_free_desc_ring()
241 ring->descs_unaligned, in svnic_dev_free_desc_ring()
242 ring->base_addr_unaligned); in svnic_dev_free_desc_ring()
243 ring->descs = NULL; in svnic_dev_free_desc_ring()
248 int wait) in _svnic_dev_cmd2() argument
250 struct devcmd2_controller *dc2c = vdev->devcmd2; in _svnic_dev_cmd2()
253 int delay; in _svnic_dev_cmd2() local
260 fetch_idx = ioread32(&dc2c->wq_ctrl->fetch_index); in _svnic_dev_cmd2()
263 return -ENODEV; in _svnic_dev_cmd2()
266 posted = ioread32(&dc2c->wq_ctrl->posted_index); in _svnic_dev_cmd2()
270 return -ENODEV; in _svnic_dev_cmd2()
276 pci_name(vdev->pdev), _CMD_N(cmd), fetch_idx, posted); in _svnic_dev_cmd2()
278 return -EBUSY; in _svnic_dev_cmd2()
281 dc2c->cmd_ring[posted].cmd = cmd; in _svnic_dev_cmd2()
282 dc2c->cmd_ring[posted].flags = 0; in _svnic_dev_cmd2()
285 dc2c->cmd_ring[posted].flags |= DEVCMD2_FNORESULT; in _svnic_dev_cmd2()
289 dc2c->cmd_ring[posted].args[i] = vdev->args[i]; in _svnic_dev_cmd2()
297 iowrite32(new_posted, &dc2c->wq_ctrl->posted_index); in _svnic_dev_cmd2()
299 if (dc2c->cmd_ring[posted].flags & DEVCMD2_FNORESULT) in _svnic_dev_cmd2()
302 result = dc2c->result + dc2c->next_result; in _svnic_dev_cmd2()
303 color = dc2c->color; in _svnic_dev_cmd2()
309 dc2c->next_result++; in _svnic_dev_cmd2()
310 if (dc2c->next_result == dc2c->result_size) { in _svnic_dev_cmd2()
311 dc2c->next_result = 0; in _svnic_dev_cmd2()
312 dc2c->color = dc2c->color ? 0 : 1; in _svnic_dev_cmd2()
315 for (delay = 0; delay < wait; delay++) { in _svnic_dev_cmd2()
317 if (result->color == color) { in _svnic_dev_cmd2()
318 if (result->error) { in _svnic_dev_cmd2()
319 err = (int) result->error; in _svnic_dev_cmd2()
329 vdev->args[i] = result->results[i]; in _svnic_dev_cmd2()
338 return -ETIMEDOUT; in _svnic_dev_cmd2()
348 if (vdev->devcmd2) in svnic_dev_init_devcmd2()
353 return -ENODEV; in svnic_dev_init_devcmd2()
357 return -ENOMEM; in svnic_dev_init_devcmd2()
359 vdev->devcmd2 = dc2c; in svnic_dev_init_devcmd2()
361 dc2c->color = 1; in svnic_dev_init_devcmd2()
362 dc2c->result_size = DEVCMD2_RING_SIZE; in svnic_dev_init_devcmd2()
365 &dc2c->wq, in svnic_dev_init_devcmd2()
371 fetch_idx = ioread32(&dc2c->wq.ctrl->fetch_index); in svnic_dev_init_devcmd2()
382 vnic_wq_init_start(&dc2c->wq, 0, fetch_idx, fetch_idx, 0, 0); in svnic_dev_init_devcmd2()
383 svnic_wq_enable(&dc2c->wq); in svnic_dev_init_devcmd2()
385 &dc2c->results_ring, in svnic_dev_init_devcmd2()
391 dc2c->result = (struct devcmd2_result *) dc2c->results_ring.descs; in svnic_dev_init_devcmd2()
392 dc2c->cmd_ring = (struct vnic_devcmd2 *) dc2c->wq.ring.descs; in svnic_dev_init_devcmd2()
393 dc2c->wq_ctrl = dc2c->wq.ctrl; in svnic_dev_init_devcmd2()
394 vdev->args[0] = (u64) dc2c->results_ring.base_addr | VNIC_PADDR_TARGET; in svnic_dev_init_devcmd2()
395 vdev->args[1] = DEVCMD2_RING_SIZE; in svnic_dev_init_devcmd2()
401 vdev->devcmd_rtn = &_svnic_dev_cmd2; in svnic_dev_init_devcmd2()
407 svnic_dev_free_desc_ring(vdev, &dc2c->results_ring); in svnic_dev_init_devcmd2()
410 svnic_wq_disable(&dc2c->wq); in svnic_dev_init_devcmd2()
411 svnic_wq_free(&dc2c->wq); in svnic_dev_init_devcmd2()
415 vdev->devcmd2 = NULL; in svnic_dev_init_devcmd2()
422 struct devcmd2_controller *dc2c = vdev->devcmd2; in vnic_dev_deinit_devcmd2()
424 vdev->devcmd2 = NULL; in vnic_dev_deinit_devcmd2()
425 vdev->devcmd_rtn = NULL; in vnic_dev_deinit_devcmd2()
427 svnic_dev_free_desc_ring(vdev, &dc2c->results_ring); in vnic_dev_deinit_devcmd2()
428 svnic_wq_disable(&dc2c->wq); in vnic_dev_deinit_devcmd2()
429 svnic_wq_free(&dc2c->wq); in vnic_dev_deinit_devcmd2()
434 u64 *a0, u64 *a1, int wait) in svnic_dev_cmd() argument
438 memset(vdev->args, 0, sizeof(vdev->args)); in svnic_dev_cmd()
439 vdev->args[0] = *a0; in svnic_dev_cmd()
440 vdev->args[1] = *a1; in svnic_dev_cmd()
442 err = (*vdev->devcmd_rtn)(vdev, cmd, wait); in svnic_dev_cmd()
444 *a0 = vdev->args[0]; in svnic_dev_cmd()
445 *a1 = vdev->args[1]; in svnic_dev_cmd()
454 int wait = VNIC_DVCMD_TMO; in svnic_dev_fw_info() local
457 if (!vdev->fw_info) { in svnic_dev_fw_info()
458 vdev->fw_info = dma_alloc_coherent(&vdev->pdev->dev, in svnic_dev_fw_info()
460 &vdev->fw_info_pa, GFP_KERNEL); in svnic_dev_fw_info()
461 if (!vdev->fw_info) in svnic_dev_fw_info()
462 return -ENOMEM; in svnic_dev_fw_info()
464 a0 = vdev->fw_info_pa; in svnic_dev_fw_info()
467 err = svnic_dev_cmd(vdev, CMD_MCPU_FW_INFO, &a0, &a1, wait); in svnic_dev_fw_info()
470 *fw_info = vdev->fw_info; in svnic_dev_fw_info()
479 int wait = VNIC_DVCMD_TMO; in svnic_dev_spec() local
485 err = svnic_dev_cmd(vdev, CMD_DEV_SPEC, &a0, &a1, wait); in svnic_dev_spec()
511 int wait = VNIC_DVCMD_TMO; in svnic_dev_stats_clear() local
513 return svnic_dev_cmd(vdev, CMD_STATS_CLEAR, &a0, &a1, wait); in svnic_dev_stats_clear()
519 int wait = VNIC_DVCMD_TMO; in svnic_dev_stats_dump() local
521 if (!vdev->stats) { in svnic_dev_stats_dump()
522 vdev->stats = dma_alloc_coherent(&vdev->pdev->dev, in svnic_dev_stats_dump()
523 sizeof(struct vnic_stats), &vdev->stats_pa, GFP_KERNEL); in svnic_dev_stats_dump()
524 if (!vdev->stats) in svnic_dev_stats_dump()
525 return -ENOMEM; in svnic_dev_stats_dump()
528 *stats = vdev->stats; in svnic_dev_stats_dump()
529 a0 = vdev->stats_pa; in svnic_dev_stats_dump()
532 return svnic_dev_cmd(vdev, CMD_STATS_DUMP, &a0, &a1, wait); in svnic_dev_stats_dump()
538 int wait = VNIC_DVCMD_TMO; in svnic_dev_close() local
540 return svnic_dev_cmd(vdev, CMD_CLOSE, &a0, &a1, wait); in svnic_dev_close()
546 int wait = VNIC_DVCMD_TMO; in svnic_dev_enable_wait() local
549 err = svnic_dev_cmd(vdev, CMD_ENABLE_WAIT, &a0, &a1, wait); in svnic_dev_enable_wait()
551 return svnic_dev_cmd(vdev, CMD_ENABLE, &a0, &a1, wait); in svnic_dev_enable_wait()
559 int wait = VNIC_DVCMD_TMO; in svnic_dev_disable() local
561 return svnic_dev_cmd(vdev, CMD_DISABLE, &a0, &a1, wait); in svnic_dev_disable()
567 int wait = VNIC_DVCMD_TMO; in svnic_dev_open() local
569 return svnic_dev_cmd(vdev, CMD_OPEN, &a0, &a1, wait); in svnic_dev_open()
575 int wait = VNIC_DVCMD_TMO; in svnic_dev_open_done() local
580 err = svnic_dev_cmd(vdev, CMD_OPEN_STATUS, &a0, &a1, wait); in svnic_dev_open_done()
592 int wait = VNIC_DVCMD_TMO; in svnic_dev_notify_set() local
594 if (!vdev->notify) { in svnic_dev_notify_set()
595 vdev->notify = dma_alloc_coherent(&vdev->pdev->dev, in svnic_dev_notify_set()
597 &vdev->notify_pa, GFP_KERNEL); in svnic_dev_notify_set()
598 if (!vdev->notify) in svnic_dev_notify_set()
599 return -ENOMEM; in svnic_dev_notify_set()
602 a0 = vdev->notify_pa; in svnic_dev_notify_set()
606 return svnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); in svnic_dev_notify_set()
612 int wait = VNIC_DVCMD_TMO; in svnic_dev_notify_unset() local
615 a1 = VNIC_NOTIFY_INTR_MASK; /* intr num = -1 to unreg for intr */ in svnic_dev_notify_unset()
618 svnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); in svnic_dev_notify_unset()
628 if (!vdev->notify) in vnic_dev_notify_ready()
633 memcpy(&vdev->notify_copy, vdev->notify, in vnic_dev_notify_ready()
635 words = (u32 *)&vdev->notify_copy; in vnic_dev_notify_ready()
646 int wait = VNIC_DVCMD_TMO; in svnic_dev_init() local
648 return svnic_dev_cmd(vdev, CMD_INIT, &a0, &a1, wait); in svnic_dev_init()
653 if (vdev->linkstatus) in svnic_dev_link_status()
654 return *vdev->linkstatus; in svnic_dev_link_status()
659 return vdev->notify_copy.link_state; in svnic_dev_link_status()
667 return vdev->notify_copy.link_down_cnt; in svnic_dev_link_down_cnt()
673 vdev->intr_mode = intr_mode; in svnic_dev_set_intr_mode()
678 return vdev->intr_mode; in svnic_dev_get_intr_mode()
684 if (vdev->notify) in svnic_dev_unregister()
685 dma_free_coherent(&vdev->pdev->dev, in svnic_dev_unregister()
687 vdev->notify, in svnic_dev_unregister()
688 vdev->notify_pa); in svnic_dev_unregister()
689 if (vdev->linkstatus) in svnic_dev_unregister()
690 dma_free_coherent(&vdev->pdev->dev, in svnic_dev_unregister()
692 vdev->linkstatus, in svnic_dev_unregister()
693 vdev->linkstatus_pa); in svnic_dev_unregister()
694 if (vdev->stats) in svnic_dev_unregister()
695 dma_free_coherent(&vdev->pdev->dev, in svnic_dev_unregister()
697 vdev->stats, vdev->stats_pa); in svnic_dev_unregister()
698 if (vdev->fw_info) in svnic_dev_unregister()
699 dma_free_coherent(&vdev->pdev->dev, in svnic_dev_unregister()
701 vdev->fw_info, vdev->fw_info_pa); in svnic_dev_unregister()
702 if (vdev->devcmd2) in svnic_dev_unregister()
720 vdev->priv = priv; in svnic_dev_alloc_discover()
721 vdev->pdev = pdev; in svnic_dev_alloc_discover()
739 int err = -ENODEV; in svnic_dev_cmd_init()