diff options
Diffstat (limited to 'drivers/net/s2io.c')
| -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; |
