diff options
author | Brian Haley <brian.haley@hp.com> | 2006-06-15 14:36:36 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-06-20 04:50:36 -0400 |
commit | 612eff0e3715a6faff5ba1b74873b99e036c59fe (patch) | |
tree | 647f0ddec94d0fb4aaf74fa55bcad75946030f8a /drivers | |
parent | 4b2d9cf00962d0a0e697f887f3ecaa155cbde555 (diff) |
[PATCH] s2io: netpoll support
This adds netpoll support for things like netconsole/kgdboe to the s2io
10GbE driver.
Signed-off-by: Brian Haley <brian.haley@hp.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/s2io.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index cac9fdd2e1d5..11daed495b97 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -2627,6 +2627,50 @@ no_rx: | |||
2627 | #endif | 2627 | #endif |
2628 | 2628 | ||
2629 | /** | 2629 | /** |
2630 | * s2io_netpoll - Rx interrupt service handler for netpoll support | ||
2631 | * @dev : pointer to the device structure. | ||
2632 | * Description: | ||
2633 | * Polling 'interrupt' - used by things like netconsole to send skbs | ||
2634 | * without having to re-enable interrupts. It's not called while | ||
2635 | * the interrupt routine is executing. | ||
2636 | */ | ||
2637 | |||
2638 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2639 | static void s2io_netpoll(struct net_device *dev) | ||
2640 | { | ||
2641 | nic_t *nic = dev->priv; | ||
2642 | mac_info_t *mac_control; | ||
2643 | struct config_param *config; | ||
2644 | XENA_dev_config_t __iomem *bar0 = nic->bar0; | ||
2645 | u64 val64; | ||
2646 | int i; | ||
2647 | |||
2648 | disable_irq(dev->irq); | ||
2649 | |||
2650 | atomic_inc(&nic->isr_cnt); | ||
2651 | mac_control = &nic->mac_control; | ||
2652 | config = &nic->config; | ||
2653 | |||
2654 | val64 = readq(&bar0->rx_traffic_int); | ||
2655 | writeq(val64, &bar0->rx_traffic_int); | ||
2656 | |||
2657 | for (i = 0; i < config->rx_ring_num; i++) | ||
2658 | rx_intr_handler(&mac_control->rings[i]); | ||
2659 | |||
2660 | for (i = 0; i < config->rx_ring_num; i++) { | ||
2661 | if (fill_rx_buffers(nic, i) == -ENOMEM) { | ||
2662 | DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); | ||
2663 | DBG_PRINT(ERR_DBG, " in Rx Netpoll!!\n"); | ||
2664 | break; | ||
2665 | } | ||
2666 | } | ||
2667 | atomic_dec(&nic->isr_cnt); | ||
2668 | enable_irq(dev->irq); | ||
2669 | return; | ||
2670 | } | ||
2671 | #endif | ||
2672 | |||
2673 | /** | ||
2630 | * rx_intr_handler - Rx interrupt handler | 2674 | * rx_intr_handler - Rx interrupt handler |
2631 | * @nic: device private variable. | 2675 | * @nic: device private variable. |
2632 | * Description: | 2676 | * Description: |
@@ -6967,6 +7011,10 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
6967 | dev->weight = 32; | 7011 | dev->weight = 32; |
6968 | #endif | 7012 | #endif |
6969 | 7013 | ||
7014 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
7015 | dev->poll_controller = s2io_netpoll; | ||
7016 | #endif | ||
7017 | |||
6970 | dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; | 7018 | dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; |
6971 | if (sp->high_dma_flag == TRUE) | 7019 | if (sp->high_dma_flag == TRUE) |
6972 | dev->features |= NETIF_F_HIGHDMA; | 7020 | dev->features |= NETIF_F_HIGHDMA; |