eni_vdpa
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
int irq = eni_vdpa->vring[idx].irq;
static void eni_vdpa_free_irq(struct eni_vdpa *eni_vdpa)
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
for (i = 0; i < eni_vdpa->queues; i++) {
if (eni_vdpa->vring[i].irq != VIRTIO_MSI_NO_VECTOR) {
devm_free_irq(&pdev->dev, eni_vdpa->vring[i].irq,
&eni_vdpa->vring[i]);
eni_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
if (eni_vdpa->config_irq != VIRTIO_MSI_NO_VECTOR) {
devm_free_irq(&pdev->dev, eni_vdpa->config_irq, eni_vdpa);
eni_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
if (eni_vdpa->vectors) {
eni_vdpa->vectors = 0;
struct eni_vdpa *eni_vdpa = arg;
if (eni_vdpa->config_cb.callback)
return eni_vdpa->config_cb.callback(eni_vdpa->config_cb.private);
static int eni_vdpa_request_irq(struct eni_vdpa *eni_vdpa)
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
int queues = eni_vdpa->queues;
eni_vdpa->vectors = vectors;
snprintf(eni_vdpa->vring[i].msix_name, ENI_MSIX_NAME_SIZE,
0, eni_vdpa->vring[i].msix_name,
&eni_vdpa->vring[i]);
eni_vdpa->vring[i].irq = irq;
snprintf(eni_vdpa->msix_name, ENI_MSIX_NAME_SIZE, "eni-vdpa[%s]-config\n",
eni_vdpa->msix_name, eni_vdpa);
eni_vdpa->config_irq = irq;
eni_vdpa_free_irq(eni_vdpa);
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
eni_vdpa_request_irq(eni_vdpa);
eni_vdpa_free_irq(eni_vdpa);
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
eni_vdpa_free_irq(eni_vdpa);
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
eni_vdpa->vring[qid].cb = *cb;
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
iowrite16(qid, eni_vdpa->vring[qid].notify);
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
VIRTIO_PCI_CONFIG_OFF(eni_vdpa->vectors) +
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
VIRTIO_PCI_CONFIG_OFF(eni_vdpa->vectors) +
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
eni_vdpa->config_cb = *cb;
static u16 eni_vdpa_get_num_queues(struct eni_vdpa *eni_vdpa)
struct virtio_pci_legacy_device *ldev = &eni_vdpa->ldev;
eni_vdpa_get_config(&eni_vdpa->vdpa,
struct eni_vdpa *eni_vdpa;
eni_vdpa = vdpa_alloc_device(struct eni_vdpa, vdpa,
if (IS_ERR(eni_vdpa)) {
return PTR_ERR(eni_vdpa);
ldev = &eni_vdpa->ldev;
static struct eni_vdpa *vdpa_to_eni(struct vdpa_device *vdpa)
pci_set_drvdata(pdev, eni_vdpa);
eni_vdpa->vdpa.vmap.dma_dev = &pdev->dev;
eni_vdpa->queues = eni_vdpa_get_num_queues(eni_vdpa);
eni_vdpa->vring = devm_kcalloc(&pdev->dev, eni_vdpa->queues,
sizeof(*eni_vdpa->vring),
if (!eni_vdpa->vring) {
return container_of(vdpa, struct eni_vdpa, vdpa);
for (i = 0; i < eni_vdpa->queues; i++) {
eni_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
eni_vdpa->vring[i].notify = ldev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY;
eni_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
ret = vdpa_register_device(&eni_vdpa->vdpa, eni_vdpa->queues);
vp_legacy_remove(&eni_vdpa->ldev);
put_device(&eni_vdpa->vdpa.dev);
struct eni_vdpa *eni_vdpa = pci_get_drvdata(pdev);
vdpa_unregister_device(&eni_vdpa->vdpa);
vp_legacy_remove(&eni_vdpa->ldev);
struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
return &eni_vdpa->ldev;