update copyright date to 2013
[dpdk.git] / lib / librte_eal / linuxapp / igb_uio / igb_uio.c
index 18e2dd1..4774c7f 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * GPL LICENSE SUMMARY
  * 
- *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
  * 
  *   This program is free software; you can redistribute it and/or modify 
  *   it under the terms of version 2 of the GNU General Public License as
@@ -66,7 +66,8 @@ struct rte_uio_pci_dev {
                msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
 };
 
-static const enum igbuio_intr_mode igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+static char *intr_mode = NULL;
+static enum igbuio_intr_mode igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
 
 /* PCI device id table */
 static struct pci_device_id igbuio_pci_ids[] = {
@@ -283,7 +284,11 @@ igbuio_pci_release_iomem(struct uio_info *info)
        }
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
 static int __devinit
+#else
+static int
+#endif
 igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct rte_uio_pci_dev *udev;
@@ -401,7 +406,8 @@ igbuio_pci_remove(struct pci_dev *dev)
 
        uio_unregister_device(info);
        igbuio_pci_release_iomem(info);
-       if (((struct rte_uio_pci_dev *)info->priv)->mode == IGBUIO_MSIX_INTR_MODE)
+       if (((struct rte_uio_pci_dev *)info->priv)->mode ==
+                                       IGBUIO_MSIX_INTR_MODE)
                pci_disable_msix(dev);
        pci_release_regions(dev);
        pci_disable_device(dev);
@@ -409,6 +415,28 @@ igbuio_pci_remove(struct pci_dev *dev)
        kfree(info);
 }
 
+static int
+igbuio_config_intr_mode(char *intr_str)
+{
+       if (!intr_str) {
+               printk(KERN_INFO "Use MSIX interrupt by default\n");
+               return 0;
+       }
+
+       if (!strcmp(intr_str, "msix")) {
+               igbuio_intr_mode_preferred = IGBUIO_MSIX_INTR_MODE;
+               printk(KERN_INFO "Use MSIX interrupt\n");
+       } else if (!strcmp(intr_str, "legacy")) {
+               igbuio_intr_mode_preferred = IGBUIO_LEGACY_INTR_MODE;
+               printk(KERN_INFO "Use legacy interrupt\n");
+       } else {
+               printk(KERN_INFO "Error: bad parameter - %s\n", intr_str);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static struct pci_driver igbuio_pci_driver = {
        .name = "igb_uio",
        .id_table = igbuio_pci_ids,
@@ -419,6 +447,12 @@ static struct pci_driver igbuio_pci_driver = {
 static int __init
 igbuio_pci_init_module(void)
 {
+       int ret;
+
+       ret = igbuio_config_intr_mode(intr_mode);
+       if (ret < 0)
+               return ret;
+
        return pci_register_driver(&igbuio_pci_driver);
 }
 
@@ -431,6 +465,13 @@ igbuio_pci_exit_module(void)
 module_init(igbuio_pci_init_module);
 module_exit(igbuio_pci_exit_module);
 
+module_param(intr_mode, charp, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(intr_mode,
+"igb_uio interrupt mode (default=msix):\n"
+"    msix       Use MSIX interrupt\n"
+"    legacy     Use Legacy interrupt\n"
+"\n");
+
 MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Intel Corporation");