Re: [RTnet-developers] [PATCH 6/6] e1000e: enable MSI again.
Brought to you by:
bet-frogger,
kiszka
From: Jan K. <jan...@si...> - 2011-10-25 13:08:14
|
On 2011-10-06 22:35, Arnout Vandecappelle (Essensium/Mind) wrote: > 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. MSI-X is usable under RT as well (see rt-igb changes) and should generally be preferred over legacy MSI, e.g. due to lower hardware latencies or separation of config and tx/rx interrupts - the former may be realized as normal Linux IRQs when lucky. Jan > > 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 } } > }; -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux |