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);