summaryrefslogtreecommitdiffstats
path: root/meta-agl-devel/meta-agl-jailhouse/recipes-kernel/linux/linux/0023-ivshmem-net-Switch-to-pci_alloc_irq_vectors.patch
blob: fcc2cac31249e101f6e0dc5f42dfb40a17f9138b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
From 77920ddb91fa49f7085875d29dd2a2c7e783af3a 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 23/32] 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>
---
 drivers/net/ivshmem-net.c | 66 ++++++++++++++++++++---------------------------
 1 file changed, 28 insertions(+), 38 deletions(-)

diff --git a/drivers/net/ivshmem-net.c b/drivers/net/ivshmem-net.c
index 0e770ca293a4..fd7d78b84576 100644
--- 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_dev *pdev,
 	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_dev *pdev,
 	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_dev *pdev,
 	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;
-	}
+	ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY | PCI_IRQ_MSIX);
+	if (ret < 0)
+		goto err_alloc_irq;
 
-	err = request_irq(interrupt, ivshm_net_int, 0, device_name, ndev);
-	if (err)
-		goto err_int;
+	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_dev *pdev,
 
 	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_dev *pdev)
 
 	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);
-- 
2.11.0