On 2011-10-06 22:35, Arnout Vandecappelle (Essensium/Mind) wrote:
> 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.

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) <[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 } }
>               };

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
RTnet-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rtnet-developers

Reply via email to