Commit 8ef0442f authored by Matt Carlson's avatar Matt Carlson Committed by David S. Miller

tg3: Move napi to per-int struct

This patch creates a per-interrupt data structure, moves the napi
member over, and creates a tg3 pointer back to the device structure.
Signed-off-by: default avatarMatt Carlson <mcarlson@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 07b0173c
...@@ -687,7 +687,7 @@ static void tg3_restart_ints(struct tg3 *tp) ...@@ -687,7 +687,7 @@ static void tg3_restart_ints(struct tg3 *tp)
static inline void tg3_netif_stop(struct tg3 *tp) static inline void tg3_netif_stop(struct tg3 *tp)
{ {
tp->dev->trans_start = jiffies; /* prevent tx timeout */ tp->dev->trans_start = jiffies; /* prevent tx timeout */
napi_disable(&tp->napi); napi_disable(&tp->napi[0].napi);
netif_tx_disable(tp->dev); netif_tx_disable(tp->dev);
} }
...@@ -698,7 +698,7 @@ static inline void tg3_netif_start(struct tg3 *tp) ...@@ -698,7 +698,7 @@ static inline void tg3_netif_start(struct tg3 *tp)
* so long as all callers are assured to have free tx slots * so long as all callers are assured to have free tx slots
* (such as after tg3_init_hw) * (such as after tg3_init_hw)
*/ */
napi_enable(&tp->napi); napi_enable(&tp->napi[0].napi);
tp->hw_status->status |= SD_STATUS_UPDATED; tp->hw_status->status |= SD_STATUS_UPDATED;
tg3_enable_ints(tp); tg3_enable_ints(tp);
} }
...@@ -4447,13 +4447,6 @@ static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key, ...@@ -4447,13 +4447,6 @@ static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key,
src_map->skb = NULL; src_map->skb = NULL;
} }
#if TG3_VLAN_TAG_USED
static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
{
return vlan_gro_receive(&tp->napi, tp->vlgrp, vlan_tag, skb);
}
#endif
/* The RX ring scheme is composed of multiple rings which post fresh /* The RX ring scheme is composed of multiple rings which post fresh
* buffers to the chip, and one special ring the chip uses to report * buffers to the chip, and one special ring the chip uses to report
* status back to the host. * status back to the host.
...@@ -4591,11 +4584,11 @@ static int tg3_rx(struct tg3 *tp, int budget) ...@@ -4591,11 +4584,11 @@ static int tg3_rx(struct tg3 *tp, int budget)
#if TG3_VLAN_TAG_USED #if TG3_VLAN_TAG_USED
if (tp->vlgrp != NULL && if (tp->vlgrp != NULL &&
desc->type_flags & RXD_FLAG_VLAN) { desc->type_flags & RXD_FLAG_VLAN) {
tg3_vlan_rx(tp, skb, vlan_gro_receive(&tp->napi[0].napi, tp->vlgrp,
desc->err_vlan & RXD_VLAN_MASK); desc->err_vlan & RXD_VLAN_MASK, skb);
} else } else
#endif #endif
napi_gro_receive(&tp->napi, skb); napi_gro_receive(&tp->napi[0].napi, skb);
received++; received++;
budget--; budget--;
...@@ -4686,7 +4679,8 @@ static int tg3_poll_work(struct tg3 *tp, int work_done, int budget) ...@@ -4686,7 +4679,8 @@ static int tg3_poll_work(struct tg3 *tp, int work_done, int budget)
static int tg3_poll(struct napi_struct *napi, int budget) static int tg3_poll(struct napi_struct *napi, int budget)
{ {
struct tg3 *tp = container_of(napi, struct tg3, napi); struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi);
struct tg3 *tp = tnapi->tp;
int work_done = 0; int work_done = 0;
struct tg3_hw_status *sblk = tp->hw_status; struct tg3_hw_status *sblk = tp->hw_status;
...@@ -4770,7 +4764,7 @@ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) ...@@ -4770,7 +4764,7 @@ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id)
prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
if (likely(!tg3_irq_sync(tp))) if (likely(!tg3_irq_sync(tp)))
napi_schedule(&tp->napi); napi_schedule(&tp->napi[0].napi);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -4795,7 +4789,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id) ...@@ -4795,7 +4789,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id)
*/ */
tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
if (likely(!tg3_irq_sync(tp))) if (likely(!tg3_irq_sync(tp)))
napi_schedule(&tp->napi); napi_schedule(&tp->napi[0].napi);
return IRQ_RETVAL(1); return IRQ_RETVAL(1);
} }
...@@ -4837,7 +4831,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id) ...@@ -4837,7 +4831,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id)
sblk->status &= ~SD_STATUS_UPDATED; sblk->status &= ~SD_STATUS_UPDATED;
if (likely(tg3_has_work(tp))) { if (likely(tg3_has_work(tp))) {
prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
napi_schedule(&tp->napi); napi_schedule(&tp->napi[0].napi);
} else { } else {
/* No work, shared interrupt perhaps? re-enable /* No work, shared interrupt perhaps? re-enable
* interrupts, and flush that PCI write * interrupts, and flush that PCI write
...@@ -4895,7 +4889,7 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) ...@@ -4895,7 +4889,7 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id)
prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
napi_schedule(&tp->napi); napi_schedule(&tp->napi[0].napi);
out: out:
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
...@@ -4936,7 +4930,7 @@ static int tg3_restart_hw(struct tg3 *tp, int reset_phy) ...@@ -4936,7 +4930,7 @@ static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
tg3_full_unlock(tp); tg3_full_unlock(tp);
del_timer_sync(&tp->timer); del_timer_sync(&tp->timer);
tp->irq_sync = 0; tp->irq_sync = 0;
napi_enable(&tp->napi); napi_enable(&tp->napi[0].napi);
dev_close(tp->dev); dev_close(tp->dev);
tg3_full_lock(tp, 0); tg3_full_lock(tp, 0);
} }
...@@ -7935,7 +7929,7 @@ static int tg3_open(struct net_device *dev) ...@@ -7935,7 +7929,7 @@ static int tg3_open(struct net_device *dev)
tg3_ints_init(tp); tg3_ints_init(tp);
napi_enable(&tp->napi); napi_enable(&tp->napi[0].napi);
err = tg3_request_irq(tp); err = tg3_request_irq(tp);
...@@ -8011,7 +8005,7 @@ err_out2: ...@@ -8011,7 +8005,7 @@ err_out2:
free_irq(tp->pdev->irq, dev); free_irq(tp->pdev->irq, dev);
err_out1: err_out1:
napi_disable(&tp->napi); napi_disable(&tp->napi[0].napi);
tg3_ints_fini(tp); tg3_ints_fini(tp);
tg3_free_consistent(tp); tg3_free_consistent(tp);
return err; return err;
...@@ -8252,7 +8246,7 @@ static int tg3_close(struct net_device *dev) ...@@ -8252,7 +8246,7 @@ static int tg3_close(struct net_device *dev)
{ {
struct tg3 *tp = netdev_priv(dev); struct tg3 *tp = netdev_priv(dev);
napi_disable(&tp->napi); napi_disable(&tp->napi[0].napi);
cancel_work_sync(&tp->reset_task); cancel_work_sync(&tp->reset_task);
netif_stop_queue(dev); netif_stop_queue(dev);
...@@ -13396,7 +13390,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, ...@@ -13396,7 +13390,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
tp->tx_pending = TG3_DEF_TX_RING_PENDING; tp->tx_pending = TG3_DEF_TX_RING_PENDING;
netif_napi_add(dev, &tp->napi, tg3_poll, 64); tp->napi[0].tp = tp;
netif_napi_add(dev, &tp->napi[0].napi, tg3_poll, 64);
dev->ethtool_ops = &tg3_ethtool_ops; dev->ethtool_ops = &tg3_ethtool_ops;
dev->watchdog_timeo = TG3_TX_TIMEOUT; dev->watchdog_timeo = TG3_TX_TIMEOUT;
dev->irq = pdev->irq; dev->irq = pdev->irq;
......
...@@ -2487,6 +2487,13 @@ struct tg3_rx_prodring_set { ...@@ -2487,6 +2487,13 @@ struct tg3_rx_prodring_set {
dma_addr_t rx_jmb_mapping; dma_addr_t rx_jmb_mapping;
}; };
#define TG3_IRQ_MAX_VECS 1
struct tg3_napi {
struct napi_struct napi ____cacheline_aligned;
struct tg3 *tp;
};
struct tg3 { struct tg3 {
/* begin "general, frequently-used members" cacheline section */ /* begin "general, frequently-used members" cacheline section */
...@@ -2558,7 +2565,7 @@ struct tg3 { ...@@ -2558,7 +2565,7 @@ struct tg3 {
dma_addr_t tx_desc_mapping; dma_addr_t tx_desc_mapping;
/* begin "rx thread" cacheline section */ /* begin "rx thread" cacheline section */
struct napi_struct napi; struct tg3_napi napi[TG3_IRQ_MAX_VECS];
void (*write32_rx_mbox) (struct tg3 *, u32, void (*write32_rx_mbox) (struct tg3 *, u32,
u32); u32);
u32 rx_rcb_ptr; u32 rx_rcb_ptr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment