Add layer to support Jailhouse hypervisor
[AGL/meta-agl-devel.git] / meta-agl-jailhouse / recipes-kernel / linux / linux / 0023-ivshmem-net-Switch-to-pci_alloc_irq_vectors.patch
1 From 77920ddb91fa49f7085875d29dd2a2c7e783af3a Mon Sep 17 00:00:00 2001
2 From: Jan Kiszka <jan.kiszka@siemens.com>
3 Date: Tue, 23 May 2017 17:41:00 +0200
4 Subject: [PATCH 23/32] ivshmem-net: Switch to pci_alloc_irq_vectors
5
6 Required by 4.12, and it also simplifies our code. Needs to be folded
7 into the initial patch eventually.
8
9 Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
10 ---
11  drivers/net/ivshmem-net.c | 66 ++++++++++++++++++++---------------------------
12  1 file changed, 28 insertions(+), 38 deletions(-)
13
14 diff --git a/drivers/net/ivshmem-net.c b/drivers/net/ivshmem-net.c
15 index 0e770ca293a4..fd7d78b84576 100644
16 --- a/drivers/net/ivshmem-net.c
17 +++ b/drivers/net/ivshmem-net.c
18 @@ -114,8 +114,6 @@ struct ivshm_net {
19         u32 peer_id;
20  
21         struct pci_dev *pdev;
22 -       struct msix_entry msix;
23 -       bool using_msix;
24  };
25  
26  static void *ivshm_net_desc_data(struct ivshm_net *in,
27 @@ -793,22 +791,21 @@ static int ivshm_net_probe(struct pci_dev *pdev,
28         struct ivshmem_regs __iomem *regs;
29         resource_size_t shmaddr;
30         resource_size_t shmlen;
31 -       int interrupt;
32         char *device_name;
33         void *shm;
34         u32 ivpos;
35 -       int err;
36 +       int ret;
37  
38 -       err = pcim_enable_device(pdev);
39 -       if (err) {
40 -               dev_err(&pdev->dev, "pci_enable_device: %d\n", err);
41 -               return err;
42 +       ret = pcim_enable_device(pdev);
43 +       if (ret) {
44 +               dev_err(&pdev->dev, "pci_enable_device: %d\n", ret);
45 +               return ret;
46         }
47  
48 -       err = pcim_iomap_regions(pdev, BIT(0), DRV_NAME);
49 -       if (err) {
50 -               dev_err(&pdev->dev, "pcim_iomap_regions: %d\n", err);
51 -               return err;
52 +       ret = pcim_iomap_regions(pdev, BIT(0), DRV_NAME);
53 +       if (ret) {
54 +               dev_err(&pdev->dev, "pcim_iomap_regions: %d\n", ret);
55 +               return ret;
56         }
57  
58         regs = pcim_iomap_table(pdev)[0];
59 @@ -869,8 +866,8 @@ static int ivshm_net_probe(struct pci_dev *pdev,
60         spin_lock_init(&in->tx_free_lock);
61         spin_lock_init(&in->tx_clean_lock);
62  
63 -       err = ivshm_net_calc_qsize(ndev);
64 -       if (err)
65 +       ret = ivshm_net_calc_qsize(ndev);
66 +       if (ret)
67                 goto err_free;
68  
69         in->state_wq = alloc_ordered_workqueue(device_name, 0);
70 @@ -889,25 +886,21 @@ static int ivshm_net_probe(struct pci_dev *pdev,
71         netif_carrier_off(ndev);
72         netif_napi_add(ndev, &in->napi, ivshm_net_poll, NAPI_POLL_WEIGHT);
73  
74 -       err = register_netdev(ndev);
75 -       if (err)
76 +       ret = register_netdev(ndev);
77 +       if (ret)
78                 goto err_wq;
79  
80 -       err = pci_enable_msix(pdev, &in->msix, 1);
81 -       if (!err) {
82 -               interrupt = in->msix.vector;
83 -               in->using_msix = true;
84 -       } else {
85 -               interrupt = pdev->irq;
86 -               in->using_msix = false;
87 -       }
88 +       ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY | PCI_IRQ_MSIX);
89 +       if (ret < 0)
90 +               goto err_alloc_irq;
91  
92 -       err = request_irq(interrupt, ivshm_net_int, 0, device_name, ndev);
93 -       if (err)
94 -               goto err_int;
95 +       ret = request_irq(pci_irq_vector(pdev, 0), ivshm_net_int, 0,
96 +                         device_name, ndev);
97 +       if (ret)
98 +               goto err_request_irq;
99  
100         pci_set_master(pdev);
101 -       if (!in->using_msix)
102 +       if (!pdev->msix_enabled)
103                 writel(IVSHMEM_INTX_ENABLE, &in->ivshm_regs->intxctrl);
104  
105         writel(IVSHM_NET_STATE_RESET, &in->ivshm_regs->lstate);
106 @@ -915,16 +908,16 @@ static int ivshm_net_probe(struct pci_dev *pdev,
107  
108         return 0;
109  
110 -err_int:
111 -       if (in->using_msix)
112 -               pci_disable_msix(pdev);
113 +err_request_irq:
114 +       pci_free_irq_vectors(pdev);
115 +err_alloc_irq:
116         unregister_netdev(ndev);
117  err_wq:
118         destroy_workqueue(in->state_wq);
119  err_free:
120         free_netdev(ndev);
121  
122 -       return err;
123 +       return ret;
124  }
125  
126  static void ivshm_net_remove(struct pci_dev *pdev)
127 @@ -934,13 +927,10 @@ static void ivshm_net_remove(struct pci_dev *pdev)
128  
129         writel(IVSHM_NET_STATE_RESET, &in->ivshm_regs->lstate);
130  
131 -       if (in->using_msix)  {
132 -               free_irq(in->msix.vector, ndev);
133 -               pci_disable_msix(pdev);
134 -       } else {
135 +       if (!pdev->msix_enabled)
136                 writel(0, &in->ivshm_regs->intxctrl);
137 -               free_irq(pdev->irq, ndev);
138 -       }
139 +       free_irq(pci_irq_vector(pdev, 0), ndev);
140 +       pci_free_irq_vectors(pdev);
141  
142         unregister_netdev(ndev);
143         cancel_work_sync(&in->state_work);
144 -- 
145 2.11.0
146