From: "Arnout Vandecappelle (Essensium/Mind)" <[email protected]>

e1000_test_msi(), which is a workaround for malfunctioning PCIe chipsets,
is not included.  It is assumed the IntMode module parameter will be used
if required.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <[email protected]>
---
 drivers/experimental/e1000e/netdev.c |   35 ++++++++++++++++++++++++++-------
 drivers/experimental/e1000e/param.c  |    4 +-
 2 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/drivers/experimental/e1000e/netdev.c 
b/drivers/experimental/e1000e/netdev.c
index d005956..7bc606b 100644
--- a/drivers/experimental/e1000e/netdev.c
+++ b/drivers/experimental/e1000e/netdev.c
@@ -1419,14 +1419,16 @@ static void e1000_configure_msix(struct e1000_adapter 
*adapter)
        ew32(CTRL_EXT, ctrl_ext);
        e1e_flush();
 }
+#endif
 
 void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
 {
-       if (adapter->msix_entries) {
-               pci_disable_msix(adapter->pdev);
-               kfree(adapter->msix_entries);
-               adapter->msix_entries = NULL;
-       } else if (adapter->flags & FLAG_MSI_ENABLED) {
+//     if (adapter->msix_entries) {
+//             pci_disable_msix(adapter->pdev);
+//             kfree(adapter->msix_entries);
+//             adapter->msix_entries = NULL;
+//     } else 
+       if (adapter->flags & FLAG_MSI_ENABLED) {
                pci_disable_msi(adapter->pdev);
                adapter->flags &= ~FLAG_MSI_ENABLED;
        }
@@ -1442,11 +1444,12 @@ void e1000e_reset_interrupt_capability(struct 
e1000_adapter *adapter)
  **/
 void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
 {
-       int err;
-       int numvecs, i;
+//     int err;
+//     int numvecs, i;
 
 
        switch (adapter->int_mode) {
+#ifdef DISABLED_FOR_RTNET
        case E1000E_INT_MODE_MSIX:
                if (adapter->flags & FLAG_HAS_MSIX) {
                        numvecs = 3; /* RxQ0, TxQ0 and other */
@@ -1470,6 +1473,7 @@ void e1000e_set_interrupt_capability(struct e1000_adapter 
*adapter)
                }
                adapter->int_mode = E1000E_INT_MODE_MSI;
                /* Fall through */
+#endif
        case E1000E_INT_MODE_MSI:
                if (!pci_enable_msi(adapter->pdev)) {
                        adapter->flags |= FLAG_MSI_ENABLED;
@@ -1487,6 +1491,7 @@ void e1000e_set_interrupt_capability(struct e1000_adapter 
*adapter)
        return;
 }
 
+#ifdef DISABLED_FOR_RTNET
 /**
  * e1000_request_msix - Initialize MSI-X interrupts
  *
@@ -1549,6 +1554,16 @@ static int e1000_request_irq(struct e1000_adapter 
*adapter)
 
        rt_stack_connect(netdev, &STACK_manager);
 
+       if (adapter->flags & FLAG_MSI_ENABLED) {
+               err = rtdm_irq_request(&adapter->irq_handle, adapter->pdev->irq,
+                                      &e1000_intr, 0, netdev->name, netdev);
+               if (!err)
+                       return err;
+
+               /* fall back to legacy interrupt */
+               e1000e_reset_interrupt_capability(adapter);
+               adapter->int_mode = E1000E_INT_MODE_LEGACY;
+       }
        err = rtdm_irq_request(&adapter->irq_handle, adapter->pdev->irq,
                               &e1000_intr, RTDM_IRQTYPE_SHARED, netdev->name, 
netdev);
        if (err)
@@ -2884,6 +2899,8 @@ static int __devinit e1000_sw_init(struct e1000_adapter 
*adapter)
        adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
        adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
 
+       e1000e_set_interrupt_capability(adapter);
+
        if (rtskb_pool_init(&adapter->skb_pool, 16) < 16)
        {
                rtskb_pool_release(&adapter->skb_pool);
@@ -4393,7 +4410,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool 
*enable_wake)
                e1000e_down(adapter);
                e1000_free_irq(adapter);
        }
-//     e1000e_reset_interrupt_capability(adapter);
+       e1000e_reset_interrupt_capability(adapter);
 
        retval = pci_save_state(pdev);
        if (retval)
@@ -5186,6 +5203,8 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
         */
        e1000_release_hw_control(adapter);
 
+       e1000e_reset_interrupt_capability(adapter);
+
        rt_unregister_rtnetdev(netdev);
 
        if (!e1000_check_reset_block(&adapter->hw))
diff --git a/drivers/experimental/e1000e/param.c 
b/drivers/experimental/e1000e/param.c
index a57ddb8..09d5e60 100644
--- a/drivers/experimental/e1000e/param.c
+++ b/drivers/experimental/e1000e/param.c
@@ -424,8 +424,8 @@ void __devinit e1000e_check_options(struct e1000_adapter 
*adapter)
                struct e1000_option opt = {
                        .type = range_option,
                        .name = "Interrupt Mode",
-                       .err  = "defaulting to 2 (MSI-X)",
-                       .def  = E1000E_INT_MODE_LEGACY, //E1000E_INT_MODE_MSIX,
+                       .err  = "defaulting to 1 (MSI)",
+                       .def  = E1000E_INT_MODE_MSI,
                        .arg  = { .r = { .min = MIN_INTMODE,
                                         .max = MAX_INTMODE } }
                };
-- 
1.7.6.3


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
RTnet-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rtnet-developers

Reply via email to