[RTnet-developers] [PATCH 6/6] e1000e: enable MSI again.
Brought to you by:
bet-frogger,
kiszka
|
From: Arnout V. (Essensium/Mind) <ar...@mi...> - 2011-10-06 20:37:22
|
From: "Arnout Vandecappelle (Essensium/Mind)" <ar...@mi...>
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) <ar...@mi...>
---
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
|