int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index, unsigned int desc_count, unsigned int desc_size) { int err; wq->index = index; wq->vdev = vdev; err = vnic_wq_get_ctrl(vdev, wq, index, RES_TYPE_WQ); if (err) { pr_err("Failed to hook WQ[%d] resource, err %d\n", index, err); return err; } vnic_wq_disable(wq); err = vnic_wq_alloc_ring(vdev, wq, desc_count, desc_size); if (err) return err; err = vnic_wq_alloc_bufs(wq); if (err) { vnic_wq_free(wq); return err; } return 0; }
int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index, unsigned int desc_count, unsigned int desc_size) { int err; wq->index = index; wq->vdev = vdev; wq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_WQ, index); if (!wq->ctrl) { printk(KERN_ERR "Failed to hook WQ[%d] resource\n", index); return -EINVAL; } vnic_wq_disable(wq); err = vnic_dev_alloc_desc_ring(vdev, &wq->ring, desc_count, desc_size); if (err) return err; err = vnic_wq_alloc_bufs(wq); if (err) { vnic_wq_free(wq); return err; } return 0; }
static void vnic_dev_deinit_devcmd2(struct vnic_dev *vdev) { vnic_dev_free_desc_ring(vdev, &vdev->devcmd2->results_ring); vnic_wq_disable(&vdev->devcmd2->wq); vnic_wq_free(&vdev->devcmd2->wq); kfree(vdev->devcmd2); }
void enic_free_wq(void *txq) { struct vnic_wq *wq = (struct vnic_wq *)txq; struct enic *enic = vnic_dev_priv(wq->vdev); vnic_wq_free(wq); vnic_cq_free(&enic->cq[enic->rq_count + wq->index]); }
void vnic_dev_deinit_devcmd2(struct vnic_dev *vdev) { vnic_dev_free_desc_ring(vdev, &vdev->devcmd2->results_ring); vnic_wq_disable(&vdev->devcmd2->wq); vnic_wq_free(&vdev->devcmd2->wq); kfree(vdev->devcmd2); vdev->devcmd2 = NULL; vdev->devcmd_rtn = &vnic_dev_cmd1; }
static void vnic_dev_deinit_devcmd2(struct vnic_dev *vdev) { #if !defined(CONFIG_MIPS) && !defined(MGMT_VNIC) vnic_dev_free_desc_ring(vdev, &vdev->devcmd2->results_ring); vnic_wq_disable(&vdev->devcmd2->wq); vnic_wq_free(&vdev->devcmd2->wq); kfree(vdev->devcmd2); #endif }
void enic_free_vnic_resources(struct enic *enic) { unsigned int i; for (i = 0; i < enic->wq_count; i++) vnic_wq_free(&enic->wq[i]); for (i = 0; i < enic->rq_count; i++) vnic_rq_free(&enic->rq[i]); for (i = 0; i < enic->cq_count; i++) vnic_cq_free(&enic->cq[i]); vnic_intr_free(&enic->intr); }
void fnic_free_vnic_resources(struct fnic *fnic) { unsigned int i; for (i = 0; i < fnic->raw_wq_count; i++) vnic_wq_free(&fnic->wq[i]); for (i = 0; i < fnic->wq_copy_count; i++) vnic_wq_copy_free(&fnic->wq_copy[i]); for (i = 0; i < fnic->rq_count; i++) vnic_rq_free(&fnic->rq[i]); for (i = 0; i < fnic->cq_count; i++) vnic_cq_free(&fnic->cq[i]); for (i = 0; i < fnic->intr_count; i++) vnic_intr_free(&fnic->intr[i]); }
int enic_alloc_wq(struct enic *enic, uint16_t queue_idx, unsigned int socket_id, uint16_t nb_desc) { int err; struct vnic_wq *wq = &enic->wq[queue_idx]; unsigned int cq_index = enic_cq_wq(enic, queue_idx); wq->socket_id = socket_id; if (nb_desc) { if (nb_desc > enic->config.wq_desc_count) { dev_warning(enic, "WQ %d - number of tx desc in cmd line (%d)"\ "is greater than that in the UCSM/CIMC adapter"\ "policy. Applying the value in the adapter "\ "policy (%d)\n", queue_idx, nb_desc, enic->config.wq_desc_count); } else if (nb_desc != enic->config.wq_desc_count) { enic->config.wq_desc_count = nb_desc; dev_info(enic, "TX Queues - effective number of descs:%d\n", nb_desc); } } /* Allocate queue resources */ err = vnic_wq_alloc(enic->vdev, &enic->wq[queue_idx], queue_idx, enic->config.wq_desc_count, sizeof(struct wq_enet_desc)); if (err) { dev_err(enic, "error in allocation of wq\n"); return err; } err = vnic_cq_alloc(enic->vdev, &enic->cq[cq_index], cq_index, socket_id, enic->config.wq_desc_count, sizeof(struct cq_enet_wq_desc)); if (err) { vnic_wq_free(wq); dev_err(enic, "error in allocation of cq for wq\n"); } return err; }
int vnic_dev_init_devcmd2(struct vnic_dev *vdev) { int err; unsigned int fetch_index; if (vdev->devcmd2) return 0; vdev->devcmd2 = kzalloc(sizeof(*vdev->devcmd2), GFP_ATOMIC); if (!vdev->devcmd2) return -ENOMEM; vdev->devcmd2->color = 1; vdev->devcmd2->result_size = DEVCMD2_RING_SIZE; err = vnic_wq_devcmd2_alloc(vdev, &vdev->devcmd2->wq, DEVCMD2_RING_SIZE, DEVCMD2_DESC_SIZE); if (err) goto err_free_devcmd2; fetch_index = ioread32(&vdev->devcmd2->wq.ctrl->fetch_index); if (fetch_index == 0xFFFFFFFF) { /* check for hardware gone */ pr_err("error in devcmd2 init"); return -ENODEV; } /* * Don't change fetch_index ever and * set posted_index same as fetch_index * when setting up the WQ for devcmd2. */ vnic_wq_init_start(&vdev->devcmd2->wq, 0, fetch_index, fetch_index, 0, 0); vnic_wq_enable(&vdev->devcmd2->wq); err = vnic_dev_alloc_desc_ring(vdev, &vdev->devcmd2->results_ring, DEVCMD2_RING_SIZE, DEVCMD2_DESC_SIZE); if (err) goto err_free_wq; vdev->devcmd2->result = (struct devcmd2_result *) vdev->devcmd2->results_ring.descs; vdev->devcmd2->cmd_ring = (struct vnic_devcmd2 *) vdev->devcmd2->wq.ring.descs; vdev->devcmd2->wq_ctrl = vdev->devcmd2->wq.ctrl; vdev->args[0] = (u64) vdev->devcmd2->results_ring.base_addr | VNIC_PADDR_TARGET; vdev->args[1] = DEVCMD2_RING_SIZE; err = vnic_dev_cmd2(vdev, CMD_INITIALIZE_DEVCMD2, 1000); if (err) goto err_free_desc_ring; vdev->devcmd_rtn = &vnic_dev_cmd2; return 0; err_free_desc_ring: vnic_dev_free_desc_ring(vdev, &vdev->devcmd2->results_ring); err_free_wq: vnic_wq_disable(&vdev->devcmd2->wq); vnic_wq_free(&vdev->devcmd2->wq); err_free_devcmd2: kfree(vdev->devcmd2); vdev->devcmd2 = NULL; return err; }
static int vnic_dev_init_devcmd2(struct vnic_dev *vdev) { int err; unsigned int fetch_index; if (vdev->devcmd2) return 0; vdev->devcmd2 = kzalloc(sizeof(*vdev->devcmd2), GFP_KERNEL); if (!vdev->devcmd2) return -ENOMEM; vdev->devcmd2->color = 1; vdev->devcmd2->result_size = DEVCMD2_RING_SIZE; err = enic_wq_devcmd2_alloc(vdev, &vdev->devcmd2->wq, DEVCMD2_RING_SIZE, DEVCMD2_DESC_SIZE); if (err) goto err_free_devcmd2; fetch_index = ioread32(&vdev->devcmd2->wq.ctrl->fetch_index); if (fetch_index == 0xFFFFFFFF) { /* check for hardware gone */ vdev_err(vdev, "Fatal error in devcmd2 init - hardware surprise removal\n"); return -ENODEV; } enic_wq_init_start(&vdev->devcmd2->wq, 0, fetch_index, fetch_index, 0, 0); vdev->devcmd2->posted = fetch_index; vnic_wq_enable(&vdev->devcmd2->wq); err = vnic_dev_alloc_desc_ring(vdev, &vdev->devcmd2->results_ring, DEVCMD2_RING_SIZE, DEVCMD2_DESC_SIZE); if (err) goto err_free_wq; vdev->devcmd2->result = vdev->devcmd2->results_ring.descs; vdev->devcmd2->cmd_ring = vdev->devcmd2->wq.ring.descs; vdev->devcmd2->wq_ctrl = vdev->devcmd2->wq.ctrl; vdev->args[0] = (u64)vdev->devcmd2->results_ring.base_addr | VNIC_PADDR_TARGET; vdev->args[1] = DEVCMD2_RING_SIZE; err = _vnic_dev_cmd2(vdev, CMD_INITIALIZE_DEVCMD2, 1000); if (err) goto err_free_desc_ring; vdev->devcmd_rtn = _vnic_dev_cmd2; return 0; err_free_desc_ring: vnic_dev_free_desc_ring(vdev, &vdev->devcmd2->results_ring); err_free_wq: vnic_wq_disable(&vdev->devcmd2->wq); vnic_wq_free(&vdev->devcmd2->wq); err_free_devcmd2: kfree(vdev->devcmd2); vdev->devcmd2 = NULL; return err; }