diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 9034a05734ef..ef1e3d1173c4 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -574,7 +574,7 @@ static void tg3_restart_ints(struct tg3 *tp) | |||
574 | static inline void tg3_netif_stop(struct tg3 *tp) | 574 | static inline void tg3_netif_stop(struct tg3 *tp) |
575 | { | 575 | { |
576 | tp->dev->trans_start = jiffies; /* prevent tx timeout */ | 576 | tp->dev->trans_start = jiffies; /* prevent tx timeout */ |
577 | netif_poll_disable(tp->dev); | 577 | napi_disable(&tp->napi); |
578 | netif_tx_disable(tp->dev); | 578 | netif_tx_disable(tp->dev); |
579 | } | 579 | } |
580 | 580 | ||
@@ -585,7 +585,7 @@ static inline void tg3_netif_start(struct tg3 *tp) | |||
585 | * so long as all callers are assured to have free tx slots | 585 | * so long as all callers are assured to have free tx slots |
586 | * (such as after tg3_init_hw) | 586 | * (such as after tg3_init_hw) |
587 | */ | 587 | */ |
588 | netif_poll_enable(tp->dev); | 588 | napi_enable(&tp->napi); |
589 | tp->hw_status->status |= SD_STATUS_UPDATED; | 589 | tp->hw_status->status |= SD_STATUS_UPDATED; |
590 | tg3_enable_ints(tp); | 590 | tg3_enable_ints(tp); |
591 | } | 591 | } |
@@ -3471,11 +3471,12 @@ next_pkt_nopost: | |||
3471 | return received; | 3471 | return received; |
3472 | } | 3472 | } |
3473 | 3473 | ||
3474 | static int tg3_poll(struct net_device *netdev, int *budget) | 3474 | static int tg3_poll(struct napi_struct *napi, int budget) |
3475 | { | 3475 | { |
3476 | struct tg3 *tp = netdev_priv(netdev); | 3476 | struct tg3 *tp = container_of(napi, struct tg3, napi); |
3477 | struct net_device *netdev = tp->dev; | ||
3477 | struct tg3_hw_status *sblk = tp->hw_status; | 3478 | struct tg3_hw_status *sblk = tp->hw_status; |
3478 | int done; | 3479 | int work_done = 0; |
3479 | 3480 | ||
3480 | /* handle link change and other phy events */ | 3481 | /* handle link change and other phy events */ |
3481 | if (!(tp->tg3_flags & | 3482 | if (!(tp->tg3_flags & |
@@ -3494,7 +3495,7 @@ static int tg3_poll(struct net_device *netdev, int *budget) | |||
3494 | if (sblk->idx[0].tx_consumer != tp->tx_cons) { | 3495 | if (sblk->idx[0].tx_consumer != tp->tx_cons) { |
3495 | tg3_tx(tp); | 3496 | tg3_tx(tp); |
3496 | if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) { | 3497 | if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) { |
3497 | netif_rx_complete(netdev); | 3498 | netif_rx_complete(netdev, napi); |
3498 | schedule_work(&tp->reset_task); | 3499 | schedule_work(&tp->reset_task); |
3499 | return 0; | 3500 | return 0; |
3500 | } | 3501 | } |
@@ -3502,20 +3503,10 @@ static int tg3_poll(struct net_device *netdev, int *budget) | |||
3502 | 3503 | ||
3503 | /* run RX thread, within the bounds set by NAPI. | 3504 | /* run RX thread, within the bounds set by NAPI. |
3504 | * All RX "locking" is done by ensuring outside | 3505 | * All RX "locking" is done by ensuring outside |
3505 | * code synchronizes with dev->poll() | 3506 | * code synchronizes with tg3->napi.poll() |
3506 | */ | 3507 | */ |
3507 | if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) { | 3508 | if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) |
3508 | int orig_budget = *budget; | 3509 | work_done = tg3_rx(tp, budget); |
3509 | int work_done; | ||
3510 | |||
3511 | if (orig_budget > netdev->quota) | ||
3512 | orig_budget = netdev->quota; | ||
3513 | |||
3514 | work_done = tg3_rx(tp, orig_budget); | ||
3515 | |||
3516 | *budget -= work_done; | ||
3517 | netdev->quota -= work_done; | ||
3518 | } | ||
3519 | 3510 | ||
3520 | if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) { | 3511 | if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) { |
3521 | tp->last_tag = sblk->status_tag; | 3512 | tp->last_tag = sblk->status_tag; |
@@ -3524,13 +3515,12 @@ static int tg3_poll(struct net_device *netdev, int *budget) | |||
3524 | sblk->status &= ~SD_STATUS_UPDATED; | 3515 | sblk->status &= ~SD_STATUS_UPDATED; |
3525 | 3516 | ||
3526 | /* if no more work, tell net stack and NIC we're done */ | 3517 | /* if no more work, tell net stack and NIC we're done */ |
3527 | done = !tg3_has_work(tp); | 3518 | if (!tg3_has_work(tp)) { |
3528 | if (done) { | 3519 | netif_rx_complete(netdev, napi); |
3529 | netif_rx_complete(netdev); | ||
3530 | tg3_restart_ints(tp); | 3520 | tg3_restart_ints(tp); |
3531 | } | 3521 | } |
3532 | 3522 | ||
3533 | return (done ? 0 : 1); | 3523 | return work_done; |
3534 | } | 3524 | } |
3535 | 3525 | ||
3536 | static void tg3_irq_quiesce(struct tg3 *tp) | 3526 | static void tg3_irq_quiesce(struct tg3 *tp) |
@@ -3577,7 +3567,7 @@ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) | |||
3577 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | 3567 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); |
3578 | 3568 | ||
3579 | if (likely(!tg3_irq_sync(tp))) | 3569 | if (likely(!tg3_irq_sync(tp))) |
3580 | netif_rx_schedule(dev); /* schedule NAPI poll */ | 3570 | netif_rx_schedule(dev, &tp->napi); |
3581 | 3571 | ||
3582 | return IRQ_HANDLED; | 3572 | return IRQ_HANDLED; |
3583 | } | 3573 | } |
@@ -3602,7 +3592,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id) | |||
3602 | */ | 3592 | */ |
3603 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); | 3593 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); |
3604 | if (likely(!tg3_irq_sync(tp))) | 3594 | if (likely(!tg3_irq_sync(tp))) |
3605 | netif_rx_schedule(dev); /* schedule NAPI poll */ | 3595 | netif_rx_schedule(dev, &tp->napi); |
3606 | 3596 | ||
3607 | return IRQ_RETVAL(1); | 3597 | return IRQ_RETVAL(1); |
3608 | } | 3598 | } |
@@ -3644,7 +3634,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id) | |||
3644 | sblk->status &= ~SD_STATUS_UPDATED; | 3634 | sblk->status &= ~SD_STATUS_UPDATED; |
3645 | if (likely(tg3_has_work(tp))) { | 3635 | if (likely(tg3_has_work(tp))) { |
3646 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | 3636 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); |
3647 | netif_rx_schedule(dev); /* schedule NAPI poll */ | 3637 | netif_rx_schedule(dev, &tp->napi); |
3648 | } else { | 3638 | } else { |
3649 | /* No work, shared interrupt perhaps? re-enable | 3639 | /* No work, shared interrupt perhaps? re-enable |
3650 | * interrupts, and flush that PCI write | 3640 | * interrupts, and flush that PCI write |
@@ -3690,7 +3680,7 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) | |||
3690 | tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); | 3680 | tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); |
3691 | if (tg3_irq_sync(tp)) | 3681 | if (tg3_irq_sync(tp)) |
3692 | goto out; | 3682 | goto out; |
3693 | if (netif_rx_schedule_prep(dev)) { | 3683 | if (netif_rx_schedule_prep(dev, &tp->napi)) { |
3694 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | 3684 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); |
3695 | /* Update last_tag to mark that this status has been | 3685 | /* Update last_tag to mark that this status has been |
3696 | * seen. Because interrupt may be shared, we may be | 3686 | * seen. Because interrupt may be shared, we may be |
@@ -3698,7 +3688,7 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) | |||
3698 | * if tg3_poll() is not scheduled. | 3688 | * if tg3_poll() is not scheduled. |
3699 | */ | 3689 | */ |
3700 | tp->last_tag = sblk->status_tag; | 3690 | tp->last_tag = sblk->status_tag; |
3701 | __netif_rx_schedule(dev); | 3691 | __netif_rx_schedule(dev, &tp->napi); |
3702 | } | 3692 | } |
3703 | out: | 3693 | out: |
3704 | return IRQ_RETVAL(handled); | 3694 | return IRQ_RETVAL(handled); |
@@ -3737,7 +3727,7 @@ static int tg3_restart_hw(struct tg3 *tp, int reset_phy) | |||
3737 | tg3_full_unlock(tp); | 3727 | tg3_full_unlock(tp); |
3738 | del_timer_sync(&tp->timer); | 3728 | del_timer_sync(&tp->timer); |
3739 | tp->irq_sync = 0; | 3729 | tp->irq_sync = 0; |
3740 | netif_poll_enable(tp->dev); | 3730 | napi_enable(&tp->napi); |
3741 | dev_close(tp->dev); | 3731 | dev_close(tp->dev); |
3742 | tg3_full_lock(tp, 0); | 3732 | tg3_full_lock(tp, 0); |
3743 | } | 3733 | } |
@@ -3932,7 +3922,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3932 | len = skb_headlen(skb); | 3922 | len = skb_headlen(skb); |
3933 | 3923 | ||
3934 | /* We are running in BH disabled context with netif_tx_lock | 3924 | /* We are running in BH disabled context with netif_tx_lock |
3935 | * and TX reclaim runs via tp->poll inside of a software | 3925 | * and TX reclaim runs via tp->napi.poll inside of a software |
3936 | * interrupt. Furthermore, IRQ processing runs lockless so we have | 3926 | * interrupt. Furthermore, IRQ processing runs lockless so we have |
3937 | * no IRQ context deadlocks to worry about either. Rejoice! | 3927 | * no IRQ context deadlocks to worry about either. Rejoice! |
3938 | */ | 3928 | */ |
@@ -4087,7 +4077,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
4087 | len = skb_headlen(skb); | 4077 | len = skb_headlen(skb); |
4088 | 4078 | ||
4089 | /* We are running in BH disabled context with netif_tx_lock | 4079 | /* We are running in BH disabled context with netif_tx_lock |
4090 | * and TX reclaim runs via tp->poll inside of a software | 4080 | * and TX reclaim runs via tp->napi.poll inside of a software |
4091 | * interrupt. Furthermore, IRQ processing runs lockless so we have | 4081 | * interrupt. Furthermore, IRQ processing runs lockless so we have |
4092 | * no IRQ context deadlocks to worry about either. Rejoice! | 4082 | * no IRQ context deadlocks to worry about either. Rejoice! |
4093 | */ | 4083 | */ |
@@ -7147,6 +7137,8 @@ static int tg3_open(struct net_device *dev) | |||
7147 | return err; | 7137 | return err; |
7148 | } | 7138 | } |
7149 | 7139 | ||
7140 | napi_enable(&tp->napi); | ||
7141 | |||
7150 | tg3_full_lock(tp, 0); | 7142 | tg3_full_lock(tp, 0); |
7151 | 7143 | ||
7152 | err = tg3_init_hw(tp, 1); | 7144 | err = tg3_init_hw(tp, 1); |
@@ -7174,6 +7166,7 @@ static int tg3_open(struct net_device *dev) | |||
7174 | tg3_full_unlock(tp); | 7166 | tg3_full_unlock(tp); |
7175 | 7167 | ||
7176 | if (err) { | 7168 | if (err) { |
7169 | napi_disable(&tp->napi); | ||
7177 | free_irq(tp->pdev->irq, dev); | 7170 | free_irq(tp->pdev->irq, dev); |
7178 | if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { | 7171 | if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { |
7179 | pci_disable_msi(tp->pdev); | 7172 | pci_disable_msi(tp->pdev); |
@@ -7199,6 +7192,8 @@ static int tg3_open(struct net_device *dev) | |||
7199 | 7192 | ||
7200 | tg3_full_unlock(tp); | 7193 | tg3_full_unlock(tp); |
7201 | 7194 | ||
7195 | napi_disable(&tp->napi); | ||
7196 | |||
7202 | return err; | 7197 | return err; |
7203 | } | 7198 | } |
7204 | 7199 | ||
@@ -7460,6 +7455,7 @@ static int tg3_close(struct net_device *dev) | |||
7460 | { | 7455 | { |
7461 | struct tg3 *tp = netdev_priv(dev); | 7456 | struct tg3 *tp = netdev_priv(dev); |
7462 | 7457 | ||
7458 | napi_disable(&tp->napi); | ||
7463 | cancel_work_sync(&tp->reset_task); | 7459 | cancel_work_sync(&tp->reset_task); |
7464 | 7460 | ||
7465 | netif_stop_queue(dev); | 7461 | netif_stop_queue(dev); |
@@ -11900,9 +11896,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11900 | dev->set_mac_address = tg3_set_mac_addr; | 11896 | dev->set_mac_address = tg3_set_mac_addr; |
11901 | dev->do_ioctl = tg3_ioctl; | 11897 | dev->do_ioctl = tg3_ioctl; |
11902 | dev->tx_timeout = tg3_tx_timeout; | 11898 | dev->tx_timeout = tg3_tx_timeout; |
11903 | dev->poll = tg3_poll; | 11899 | netif_napi_add(dev, &tp->napi, tg3_poll, 64); |
11904 | dev->ethtool_ops = &tg3_ethtool_ops; | 11900 | dev->ethtool_ops = &tg3_ethtool_ops; |
11905 | dev->weight = 64; | ||
11906 | dev->watchdog_timeo = TG3_TX_TIMEOUT; | 11901 | dev->watchdog_timeo = TG3_TX_TIMEOUT; |
11907 | dev->change_mtu = tg3_change_mtu; | 11902 | dev->change_mtu = tg3_change_mtu; |
11908 | dev->irq = pdev->irq; | 11903 | dev->irq = pdev->irq; |