You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/target/linux/layerscape/patches-5.4/809-jailhouse-0011-ivshmem-...

144 lines
3.7 KiB
Diff

From 8b5d421b2bfa6800d182f74a60afa48cf305fb86 Mon Sep 17 00:00:00 2001
From: Jan Kiszka <jan.kiszka@siemens.com>
Date: Tue, 23 May 2017 17:41:00 +0200
Subject: [PATCH] ivshmem-net: Switch to pci_alloc_irq_vectors
Required by 4.12, and it also simplifies our code. Needs to be folded
into the initial patch eventually.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
(cherry picked from commit ea6e78c89582711f15a2711f0a35ac3a61d9d074)
---
drivers/net/ivshmem-net.c | 66 ++++++++++++++++++++---------------------------
1 file changed, 28 insertions(+), 38 deletions(-)
--- a/drivers/net/ivshmem-net.c
+++ b/drivers/net/ivshmem-net.c
@@ -114,8 +114,6 @@ struct ivshm_net {
u32 peer_id;
struct pci_dev *pdev;
- struct msix_entry msix;
- bool using_msix;
};
static void *ivshm_net_desc_data(struct ivshm_net *in,
@@ -793,22 +791,21 @@ static int ivshm_net_probe(struct pci_de
struct ivshmem_regs __iomem *regs;
resource_size_t shmaddr;
resource_size_t shmlen;
- int interrupt;
char *device_name;
void *shm;
u32 ivpos;
- int err;
+ int ret;
- err = pcim_enable_device(pdev);
- if (err) {
- dev_err(&pdev->dev, "pci_enable_device: %d\n", err);
- return err;
+ ret = pcim_enable_device(pdev);
+ if (ret) {
+ dev_err(&pdev->dev, "pci_enable_device: %d\n", ret);
+ return ret;
}
- err = pcim_iomap_regions(pdev, BIT(0), DRV_NAME);
- if (err) {
- dev_err(&pdev->dev, "pcim_iomap_regions: %d\n", err);
- return err;
+ ret = pcim_iomap_regions(pdev, BIT(0), DRV_NAME);
+ if (ret) {
+ dev_err(&pdev->dev, "pcim_iomap_regions: %d\n", ret);
+ return ret;
}
regs = pcim_iomap_table(pdev)[0];
@@ -869,8 +866,8 @@ static int ivshm_net_probe(struct pci_de
spin_lock_init(&in->tx_free_lock);
spin_lock_init(&in->tx_clean_lock);
- err = ivshm_net_calc_qsize(ndev);
- if (err)
+ ret = ivshm_net_calc_qsize(ndev);
+ if (ret)
goto err_free;
in->state_wq = alloc_ordered_workqueue(device_name, 0);
@@ -889,25 +886,21 @@ static int ivshm_net_probe(struct pci_de
netif_carrier_off(ndev);
netif_napi_add(ndev, &in->napi, ivshm_net_poll, NAPI_POLL_WEIGHT);
- err = register_netdev(ndev);
- if (err)
+ ret = register_netdev(ndev);
+ if (ret)
goto err_wq;
- err = pci_enable_msix(pdev, &in->msix, 1);
- if (!err) {
- interrupt = in->msix.vector;
- in->using_msix = true;
- } else {
- interrupt = pdev->irq;
- in->using_msix = false;
- }
-
- err = request_irq(interrupt, ivshm_net_int, 0, device_name, ndev);
- if (err)
- goto err_int;
+ ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY | PCI_IRQ_MSIX);
+ if (ret < 0)
+ goto err_alloc_irq;
+
+ ret = request_irq(pci_irq_vector(pdev, 0), ivshm_net_int, 0,
+ device_name, ndev);
+ if (ret)
+ goto err_request_irq;
pci_set_master(pdev);
- if (!in->using_msix)
+ if (!pdev->msix_enabled)
writel(IVSHMEM_INTX_ENABLE, &in->ivshm_regs->intxctrl);
writel(IVSHM_NET_STATE_RESET, &in->ivshm_regs->lstate);
@@ -915,16 +908,16 @@ static int ivshm_net_probe(struct pci_de
return 0;
-err_int:
- if (in->using_msix)
- pci_disable_msix(pdev);
+err_request_irq:
+ pci_free_irq_vectors(pdev);
+err_alloc_irq:
unregister_netdev(ndev);
err_wq:
destroy_workqueue(in->state_wq);
err_free:
free_netdev(ndev);
- return err;
+ return ret;
}
static void ivshm_net_remove(struct pci_dev *pdev)
@@ -934,13 +927,10 @@ static void ivshm_net_remove(struct pci_
writel(IVSHM_NET_STATE_RESET, &in->ivshm_regs->lstate);
- if (in->using_msix) {
- free_irq(in->msix.vector, ndev);
- pci_disable_msix(pdev);
- } else {
+ if (!pdev->msix_enabled)
writel(0, &in->ivshm_regs->intxctrl);
- free_irq(pdev->irq, ndev);
- }
+ free_irq(pci_irq_vector(pdev, 0), ndev);
+ pci_free_irq_vectors(pdev);
unregister_netdev(ndev);
cancel_work_sync(&in->state_work);