igb_uio: fix typos for kernel older than 3.3
[dpdk.git] / lib / librte_eal / linuxapp / igb_uio / igb_uio.c
1 /*-
2  * GPL LICENSE SUMMARY
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of version 2 of the GNU General Public License as
8  *   published by the Free Software Foundation.
9  *
10  *   This program is distributed in the hope that it will be useful, but
11  *   WITHOUT ANY WARRANTY; without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *   General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program; if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18  *   The full GNU General Public License is included in this distribution
19  *   in the file called LICENSE.GPL.
20  *
21  *   Contact Information:
22  *   Intel Corporation
23  */
24
25 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26
27 #include <linux/device.h>
28 #include <linux/module.h>
29 #include <linux/pci.h>
30 #include <linux/uio_driver.h>
31 #include <linux/io.h>
32 #include <linux/msi.h>
33 #include <linux/version.h>
34
35 #ifdef CONFIG_XEN_DOM0
36 #include <xen/xen.h>
37 #endif
38 #include <rte_pci_dev_features.h>
39
40 #ifdef RTE_PCI_CONFIG
41 #define PCI_SYS_FILE_BUF_SIZE      10
42 #define PCI_DEV_CAP_REG            0xA4
43 #define PCI_DEV_CTRL_REG           0xA8
44 #define PCI_DEV_CAP_EXT_TAG_MASK   0x20
45 #define PCI_DEV_CTRL_EXT_TAG_SHIFT 8
46 #define PCI_DEV_CTRL_EXT_TAG_MASK  (1 << PCI_DEV_CTRL_EXT_TAG_SHIFT)
47 #endif
48
49 /**
50  * A structure describing the private information for a uio device.
51  */
52 struct rte_uio_pci_dev {
53         struct uio_info info;
54         struct pci_dev *pdev;
55         enum rte_intr_mode mode;
56 };
57
58 static char *intr_mode = NULL;
59 static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
60
61 static inline struct rte_uio_pci_dev *
62 igbuio_get_uio_pci_dev(struct uio_info *info)
63 {
64         return container_of(info, struct rte_uio_pci_dev, info);
65 }
66
67 /* sriov sysfs */
68 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)
69 static int pci_num_vf(struct pci_dev *dev)
70         struct iov {
71                 int pos;
72                 int nres;
73                 u32 cap;
74                 u16 ctrl;
75                 u16 total;
76                 u16 initial;
77                 u16 nr_virtfn;
78         } *iov = (struct iov *)dev->sriov;
79
80         if (!dev->is_physfn)
81                 return 0;
82
83         return iov->nr_virtfn;
84 }
85 #endif
86
87 static ssize_t
88 show_max_vfs(struct device *dev, struct device_attribute *attr,
89              char *buf)
90 {
91         return snprintf(buf, 10, "%u\n",
92                         pci_num_vf(container_of(dev, struct pci_dev, dev)));
93 }
94
95 static ssize_t
96 store_max_vfs(struct device *dev, struct device_attribute *attr,
97               const char *buf, size_t count)
98 {
99         int err = 0;
100         unsigned long max_vfs;
101         struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
102
103         if (0 != strict_strtoul(buf, 0, &max_vfs))
104                 return -EINVAL;
105
106         if (0 == max_vfs)
107                 pci_disable_sriov(pdev);
108         else if (0 == pci_num_vf(pdev))
109                 err = pci_enable_sriov(pdev, max_vfs);
110         else /* do nothing if change max_vfs number */
111                 err = -EINVAL;
112
113         return err ? err : count;
114 }
115
116 #ifdef RTE_PCI_CONFIG
117 static ssize_t
118 show_extended_tag(struct device *dev, struct device_attribute *attr, char *buf)
119 {
120         struct pci_dev *pci_dev = container_of(dev, struct pci_dev, dev);
121         uint32_t val = 0;
122
123         pci_read_config_dword(pci_dev, PCI_DEV_CAP_REG, &val);
124         if (!(val & PCI_DEV_CAP_EXT_TAG_MASK)) /* Not supported */
125                 return snprintf(buf, PCI_SYS_FILE_BUF_SIZE, "%s\n", "invalid");
126
127         val = 0;
128         pci_bus_read_config_dword(pci_dev->bus, pci_dev->devfn,
129                                         PCI_DEV_CTRL_REG, &val);
130
131         return snprintf(buf, PCI_SYS_FILE_BUF_SIZE, "%s\n",
132                 (val & PCI_DEV_CTRL_EXT_TAG_MASK) ? "on" : "off");
133 }
134
135 static ssize_t
136 store_extended_tag(struct device *dev,
137                    struct device_attribute *attr,
138                    const char *buf,
139                    size_t count)
140 {
141         struct pci_dev *pci_dev = container_of(dev, struct pci_dev, dev);
142         uint32_t val = 0, enable;
143
144         if (strncmp(buf, "on", 2) == 0)
145                 enable = 1;
146         else if (strncmp(buf, "off", 3) == 0)
147                 enable = 0;
148         else
149                 return -EINVAL;
150
151         pci_cfg_access_lock(pci_dev);
152         pci_bus_read_config_dword(pci_dev->bus, pci_dev->devfn,
153                                         PCI_DEV_CAP_REG, &val);
154         if (!(val & PCI_DEV_CAP_EXT_TAG_MASK)) { /* Not supported */
155                 pci_cfg_access_unlock(pci_dev);
156                 return -EPERM;
157         }
158
159         val = 0;
160         pci_bus_read_config_dword(pci_dev->bus, pci_dev->devfn,
161                                         PCI_DEV_CTRL_REG, &val);
162         if (enable)
163                 val |= PCI_DEV_CTRL_EXT_TAG_MASK;
164         else
165                 val &= ~PCI_DEV_CTRL_EXT_TAG_MASK;
166         pci_bus_write_config_dword(pci_dev->bus, pci_dev->devfn,
167                                         PCI_DEV_CTRL_REG, val);
168         pci_cfg_access_unlock(pci_dev);
169
170         return count;
171 }
172
173 static ssize_t
174 show_max_read_request_size(struct device *dev,
175                            struct device_attribute *attr,
176                            char *buf)
177 {
178         struct pci_dev *pci_dev = container_of(dev, struct pci_dev, dev);
179         int val = pcie_get_readrq(pci_dev);
180
181         return snprintf(buf, PCI_SYS_FILE_BUF_SIZE, "%d\n", val);
182 }
183
184 static ssize_t
185 store_max_read_request_size(struct device *dev,
186                             struct device_attribute *attr,
187                             const char *buf,
188                             size_t count)
189 {
190         struct pci_dev *pci_dev = container_of(dev, struct pci_dev, dev);
191         unsigned long size = 0;
192         int ret;
193
194         if (strict_strtoul(buf, 0, &size) != 0)
195                 return -EINVAL;
196
197         ret = pcie_set_readrq(pci_dev, (int)size);
198         if (ret < 0)
199                 return ret;
200
201         return count;
202 }
203 #endif
204
205 static DEVICE_ATTR(max_vfs, S_IRUGO | S_IWUSR, show_max_vfs, store_max_vfs);
206 #ifdef RTE_PCI_CONFIG
207 static DEVICE_ATTR(extended_tag, S_IRUGO | S_IWUSR, show_extended_tag,
208         store_extended_tag);
209 static DEVICE_ATTR(max_read_request_size, S_IRUGO | S_IWUSR,
210         show_max_read_request_size, store_max_read_request_size);
211 #endif
212
213 static struct attribute *dev_attrs[] = {
214         &dev_attr_max_vfs.attr,
215 #ifdef RTE_PCI_CONFIG
216         &dev_attr_extended_tag.attr,
217         &dev_attr_max_read_request_size.attr,
218 #endif
219         NULL,
220 };
221
222 static const struct attribute_group dev_attr_grp = {
223         .attrs = dev_attrs,
224 };
225
226 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
227 /* Check if INTX works to control irq's.
228  * Set's INTX_DISABLE flag and reads it back
229  */
230 static bool pci_intx_mask_supported(struct pci_dev *pdev)
231 {
232         bool mask_supported = false;
233         uint16_t orig, new;
234
235         pci_block_user_cfg_access(pdev);
236         pci_read_config_word(pdev, PCI_COMMAND, &orig);
237         pci_write_config_word(pdev, PCI_COMMAND,
238                               orig ^ PCI_COMMAND_INTX_DISABLE);
239         pci_read_config_word(pdev, PCI_COMMAND, &new);
240
241         if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) {
242                 dev_err(&pdev->dev, "Command register changed from "
243                         "0x%x to 0x%x: driver or hardware bug?\n", orig, new);
244         } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) {
245                 mask_supported = true;
246                 pci_write_config_word(pdev, PCI_COMMAND, orig);
247         }
248         pci_unblock_user_cfg_access(pdev);
249
250         return mask_supported;
251 }
252
253 static bool pci_check_and_mask_intx(struct pci_dev *pdev)
254 {
255         bool pending;
256         uint32_t status;
257
258         pci_block_user_cfg_access(pdev);
259         pci_read_config_dword(pdev, PCI_COMMAND, &status);
260
261         /* interrupt is not ours, goes to out */
262         pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0);
263         if (pending) {
264                 uint16_t old, new;
265
266                 old = status;
267                 if (status != 0)
268                         new = old & (~PCI_COMMAND_INTX_DISABLE);
269                 else
270                         new = old | PCI_COMMAND_INTX_DISABLE;
271
272                 if (old != new)
273                         pci_write_config_word(pdev, PCI_COMMAND, new);
274         }
275         pci_unblock_user_cfg_access(pdev);
276
277         return pending;
278 }
279 #endif
280
281 /*
282  * It masks the msix on/off of generating MSI-X messages.
283  */
284 static void
285 igbuio_msix_mask_irq(struct msi_desc *desc, int32_t state)
286 {
287         u32 mask_bits = desc->masked;
288         unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
289                                                 PCI_MSIX_ENTRY_VECTOR_CTRL;
290
291         if (state != 0)
292                 mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
293         else
294                 mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
295
296         if (mask_bits != desc->masked) {
297                 writel(mask_bits, desc->mask_base + offset);
298                 readl(desc->mask_base);
299                 desc->masked = mask_bits;
300         }
301 }
302
303 static void
304 igbuio_msi_mask_irq(struct irq_data *data, u32 enable)
305 {
306         struct msi_desc *desc = irq_data_get_msi(data);
307         u32 mask_bits = desc->masked;
308         unsigned offset = data->irq - desc->dev->irq;
309         u32 mask = 1 << offset;
310         u32 flag = enable << offset;
311
312         mask_bits &= ~mask;
313         mask_bits |= flag;
314
315         if (desc->msi_attrib.maskbit && mask_bits != desc->masked) {
316                 pci_write_config_dword(desc->dev, desc->mask_pos, mask_bits);
317                 desc->masked = mask_bits;
318         }
319 }
320
321 /**
322  * This is the irqcontrol callback to be registered to uio_info.
323  * It can be used to disable/enable interrupt from user space processes.
324  *
325  * @param info
326  *  pointer to uio_info.
327  * @param irq_state
328  *  state value. 1 to enable interrupt, 0 to disable interrupt.
329  *
330  * @return
331  *  - On success, 0.
332  *  - On failure, a negative value.
333  */
334 static int
335 igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state)
336 {
337         struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
338         struct pci_dev *pdev = udev->pdev;
339
340         pci_cfg_access_lock(pdev);
341         if (udev->mode == RTE_INTR_MODE_LEGACY)
342                 pci_intx(pdev, !!irq_state);
343         else if (udev->mode == RTE_INTR_MODE_MSI) {
344                 struct irq_data *data = irq_get_irq_data(pdev->irq);
345
346                 igbuio_msi_mask_irq(data, !!irq_state);
347         } else if (udev->mode == RTE_INTR_MODE_MSIX) {
348                 struct msi_desc *desc;
349
350                 list_for_each_entry(desc, &pdev->msi_list, list)
351                         igbuio_msix_mask_irq(desc, irq_state);
352         }
353         pci_cfg_access_unlock(pdev);
354
355         return 0;
356 }
357
358 /**
359  * This is interrupt handler which will check if the interrupt is for the right device.
360  * If yes, disable it here and will be enable later.
361  */
362 static irqreturn_t
363 igbuio_pci_irqhandler(int irq, struct uio_info *info)
364 {
365         struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
366
367         /* Legacy mode need to mask in hardware */
368         if (udev->mode == RTE_INTR_MODE_LEGACY &&
369             !pci_check_and_mask_intx(udev->pdev))
370                 return IRQ_NONE;
371
372         /* Message signal mode, no share IRQ and automasked */
373         return IRQ_HANDLED;
374 }
375
376 #ifdef CONFIG_XEN_DOM0
377 static int
378 igbuio_dom0_mmap_phys(struct uio_info *info, struct vm_area_struct *vma)
379 {
380         int idx;
381
382         idx = (int)vma->vm_pgoff;
383         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
384         vma->vm_page_prot.pgprot |= _PAGE_IOMAP;
385
386         return remap_pfn_range(vma,
387                         vma->vm_start,
388                         info->mem[idx].addr >> PAGE_SHIFT,
389                         vma->vm_end - vma->vm_start,
390                         vma->vm_page_prot);
391 }
392
393 /**
394  * This is uio device mmap method which will use igbuio mmap for Xen
395  * Dom0 environment.
396  */
397 static int
398 igbuio_dom0_pci_mmap(struct uio_info *info, struct vm_area_struct *vma)
399 {
400         int idx;
401
402         if (vma->vm_pgoff >= MAX_UIO_MAPS)
403                 return -EINVAL;
404
405         if (info->mem[vma->vm_pgoff].size == 0)
406                 return -EINVAL;
407
408         idx = (int)vma->vm_pgoff;
409         switch (info->mem[idx].memtype) {
410         case UIO_MEM_PHYS:
411                 return igbuio_dom0_mmap_phys(info, vma);
412         case UIO_MEM_LOGICAL:
413         case UIO_MEM_VIRTUAL:
414         default:
415                 return -EINVAL;
416         }
417 }
418 #endif
419
420 /* Remap pci resources described by bar #pci_bar in uio resource n. */
421 static int
422 igbuio_pci_setup_iomem(struct pci_dev *dev, struct uio_info *info,
423                        int n, int pci_bar, const char *name)
424 {
425         unsigned long addr, len;
426         void *internal_addr;
427
428         if (sizeof(info->mem) / sizeof(info->mem[0]) <= n)
429                 return -EINVAL;
430
431         addr = pci_resource_start(dev, pci_bar);
432         len = pci_resource_len(dev, pci_bar);
433         if (addr == 0 || len == 0)
434                 return -1;
435         internal_addr = ioremap(addr, len);
436         if (internal_addr == NULL)
437                 return -1;
438         info->mem[n].name = name;
439         info->mem[n].addr = addr;
440         info->mem[n].internal_addr = internal_addr;
441         info->mem[n].size = len;
442         info->mem[n].memtype = UIO_MEM_PHYS;
443         return 0;
444 }
445
446 /* Get pci port io resources described by bar #pci_bar in uio resource n. */
447 static int
448 igbuio_pci_setup_ioport(struct pci_dev *dev, struct uio_info *info,
449                 int n, int pci_bar, const char *name)
450 {
451         unsigned long addr, len;
452
453         if (sizeof(info->port) / sizeof(info->port[0]) <= n)
454                 return -EINVAL;
455
456         addr = pci_resource_start(dev, pci_bar);
457         len = pci_resource_len(dev, pci_bar);
458         if (addr == 0 || len == 0)
459                 return -EINVAL;
460
461         info->port[n].name = name;
462         info->port[n].start = addr;
463         info->port[n].size = len;
464         info->port[n].porttype = UIO_PORT_X86;
465
466         return 0;
467 }
468
469 /* Unmap previously ioremap'd resources */
470 static void
471 igbuio_pci_release_iomem(struct uio_info *info)
472 {
473         int i;
474
475         for (i = 0; i < MAX_UIO_MAPS; i++) {
476                 if (info->mem[i].internal_addr)
477                         iounmap(info->mem[i].internal_addr);
478         }
479 }
480
481 static int
482 igbuio_setup_bars(struct pci_dev *dev, struct uio_info *info)
483 {
484         int i, iom, iop, ret;
485         unsigned long flags;
486         static const char *bar_names[PCI_STD_RESOURCE_END + 1]  = {
487                 "BAR0",
488                 "BAR1",
489                 "BAR2",
490                 "BAR3",
491                 "BAR4",
492                 "BAR5",
493         };
494
495         iom = 0;
496         iop = 0;
497
498         for (i = 0; i != sizeof(bar_names) / sizeof(bar_names[0]); i++) {
499                 if (pci_resource_len(dev, i) != 0 &&
500                                 pci_resource_start(dev, i) != 0) {
501                         flags = pci_resource_flags(dev, i);
502                         if (flags & IORESOURCE_MEM) {
503                                 ret = igbuio_pci_setup_iomem(dev, info, iom,
504                                                              i, bar_names[i]);
505                                 if (ret != 0)
506                                         return ret;
507                                 iom++;
508                         } else if (flags & IORESOURCE_IO) {
509                                 ret = igbuio_pci_setup_ioport(dev, info, iop,
510                                                               i, bar_names[i]);
511                                 if (ret != 0)
512                                         return ret;
513                                 iop++;
514                         }
515                 }
516         }
517
518         return (iom != 0) ? ret : -ENOENT;
519 }
520
521 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
522 static int __devinit
523 #else
524 static int
525 #endif
526 igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
527 {
528         struct rte_uio_pci_dev *udev;
529         struct msix_entry msix_entry;
530         int err;
531
532         udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL);
533         if (!udev)
534                 return -ENOMEM;
535
536         /*
537          * enable device: ask low-level code to enable I/O and
538          * memory
539          */
540         err = pci_enable_device(dev);
541         if (err != 0) {
542                 dev_err(&dev->dev, "Cannot enable PCI device\n");
543                 goto fail_free;
544         }
545
546         /*
547          * reserve device's PCI memory regions for use by this
548          * module
549          */
550         err = pci_request_regions(dev, "igb_uio");
551         if (err != 0) {
552                 dev_err(&dev->dev, "Cannot request regions\n");
553                 goto fail_disable;
554         }
555
556         /* enable bus mastering on the device */
557         pci_set_master(dev);
558
559         /* remap IO memory */
560         err = igbuio_setup_bars(dev, &udev->info);
561         if (err != 0)
562                 goto fail_release_iomem;
563
564         /* set 64-bit DMA mask */
565         err = pci_set_dma_mask(dev,  DMA_BIT_MASK(64));
566         if (err != 0) {
567                 dev_err(&dev->dev, "Cannot set DMA mask\n");
568                 goto fail_release_iomem;
569         }
570
571         err = pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64));
572         if (err != 0) {
573                 dev_err(&dev->dev, "Cannot set consistent DMA mask\n");
574                 goto fail_release_iomem;
575         }
576
577         /* fill uio infos */
578         udev->info.name = "igb_uio";
579         udev->info.version = "0.1";
580         udev->info.handler = igbuio_pci_irqhandler;
581         udev->info.irqcontrol = igbuio_pci_irqcontrol;
582         udev->info.irq = dev->irq;
583 #ifdef CONFIG_XEN_DOM0
584         /* check if the driver run on Xen Dom0 */
585         if (xen_initial_domain())
586                 udev->info.mmap = igbuio_dom0_pci_mmap;
587 #endif
588         udev->info.priv = udev;
589         udev->pdev = dev;
590
591         switch (igbuio_intr_mode_preferred) {
592         case RTE_INTR_MODE_NONE:
593                 udev->info.irq = 0;
594                 break;
595         case RTE_INTR_MODE_MSIX:
596                 /* Only 1 msi-x vector needed */
597                 msix_entry.entry = 0;
598                 if (pci_enable_msix(dev, &msix_entry, 1) == 0) {
599                         dev_dbg(&dev->dev, "using MSI-X");
600                         udev->info.irq = msix_entry.vector;
601                         udev->mode = RTE_INTR_MODE_MSIX;
602                         break;
603                 }
604                 /* fall back to MSI */
605         case RTE_INTR_MODE_MSI:
606                 if (pci_enable_msi(dev) == 0) {
607                         dev_dbg(&dev->dev, "using MSI");
608                         udev->mode = RTE_INTR_MODE_MSI;
609                         break;
610                 }
611                 /* fall back to INTX */
612         case RTE_INTR_MODE_LEGACY:
613                 if (pci_intx_mask_supported(dev)) {
614                         dev_dbg(&dev->dev, "using INTX");
615                         udev->info.irq_flags = IRQF_SHARED;
616                         udev->mode = RTE_INTR_MODE_LEGACY;
617                 } else {
618                         dev_err(&dev->dev, "PCI INTX mask not supported\n");
619                         err = -EIO;
620                         goto fail_release_iomem;
621                 }
622                 break;
623         default:
624                 dev_err(&dev->dev, "invalid IRQ mode %u",
625                         igbuio_intr_mode_preferred);
626                 err = -EINVAL;
627                 goto fail_release_iomem;
628         }
629
630         err = sysfs_create_group(&dev->dev.kobj, &dev_attr_grp);
631         if (err != 0)
632                 goto fail_release_iomem;
633
634         /* register uio driver */
635         err = uio_register_device(&dev->dev, &udev->info);
636         if (err != 0)
637                 goto fail_remove_group;
638
639         pci_set_drvdata(dev, udev);
640
641         dev_info(&dev->dev, "uio device registered with irq %lx\n",
642                  udev->info.irq);
643
644         return 0;
645
646 fail_remove_group:
647         sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
648 fail_release_iomem:
649         igbuio_pci_release_iomem(&udev->info);
650         if (udev->mode == RTE_INTR_MODE_MSIX)
651                 pci_disable_msix(udev->pdev);
652         else if (udev->mode == RTE_INTR_MODE_MSI)
653                 pci_disable_msi(udev->pdev);
654         pci_release_regions(dev);
655 fail_disable:
656         pci_disable_device(dev);
657 fail_free:
658         kfree(udev);
659
660         return err;
661 }
662
663 static void
664 igbuio_pci_remove(struct pci_dev *dev)
665 {
666         struct uio_info *info = pci_get_drvdata(dev);
667         struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
668
669         if (info->priv == NULL) {
670                 pr_notice("Not igbuio device\n");
671                 return;
672         }
673
674         sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
675         uio_unregister_device(info);
676         igbuio_pci_release_iomem(info);
677         if (udev->mode == RTE_INTR_MODE_MSIX)
678                 pci_disable_msix(dev);
679         else if (udev->mode == RTE_INTR_MODE_MSI)
680                 pci_disable_msi(dev);
681         pci_release_regions(dev);
682         pci_disable_device(dev);
683         pci_set_drvdata(dev, NULL);
684         kfree(info);
685 }
686
687 static int
688 igbuio_config_intr_mode(char *intr_str)
689 {
690         if (!intr_str) {
691                 pr_info("Use MSIX interrupt by default\n");
692                 return 0;
693         }
694
695         if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) {
696                 igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
697                 pr_info("Use MSIX interrupt\n");
698         } else if (!strcmp(intr_str, RTE_INTR_MODE_MSI_NAME)) {
699                 igbuio_intr_mode_preferred = RTE_INTR_MODE_MSI;
700                 pr_info("Use MSI interrupt\n");
701         } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) {
702                 igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY;
703                 pr_info("Use legacy interrupt\n");
704         } else {
705                 pr_info("Error: bad parameter - %s\n", intr_str);
706                 return -EINVAL;
707         }
708
709         return 0;
710 }
711
712 static struct pci_driver igbuio_pci_driver = {
713         .name = "igb_uio",
714         .id_table = NULL,
715         .probe = igbuio_pci_probe,
716         .remove = igbuio_pci_remove,
717 };
718
719 static int __init
720 igbuio_pci_init_module(void)
721 {
722         int ret;
723
724         ret = igbuio_config_intr_mode(intr_mode);
725         if (ret < 0)
726                 return ret;
727
728         return pci_register_driver(&igbuio_pci_driver);
729 }
730
731 static void __exit
732 igbuio_pci_exit_module(void)
733 {
734         pci_unregister_driver(&igbuio_pci_driver);
735 }
736
737 module_init(igbuio_pci_init_module);
738 module_exit(igbuio_pci_exit_module);
739
740 module_param(intr_mode, charp, S_IRUGO);
741 MODULE_PARM_DESC(intr_mode,
742 "igb_uio interrupt mode (default=msix):\n"
743 "    " RTE_INTR_MODE_MSIX_NAME "       Use MSIX interrupt\n"
744 "    " RTE_INTR_MODE_MSI_NAME "        Use MSI interrupt\n"
745 "    " RTE_INTR_MODE_LEGACY_NAME "     Use Legacy interrupt\n"
746 "\n");
747
748 MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards");
749 MODULE_LICENSE("GPL");
750 MODULE_AUTHOR("Intel Corporation");