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
|