Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 67007
b: refs/heads/master
c: 59e90b2
h: refs/heads/master
i:
  67005: f63ef2f
  67003: c11df93
  66999: ab332ac
  66991: 68539c5
  66975: 63b4d2d
  66943: 43fe091
v: v3
  • Loading branch information
Roland Dreier authored and David S. Miller committed Oct 10, 2007
1 parent c65338e commit 69f8841
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 61ba5b3c14b4956493d1180e0a860e941108393e
refs/heads/master: 59e90b2d22500f2e9cc635793562154abc8f4621
55 changes: 19 additions & 36 deletions trunk/drivers/net/ibm_newemac/mal.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,10 +235,10 @@ static irqreturn_t mal_serr(int irq, void *dev_instance)

static inline void mal_schedule_poll(struct mal_instance *mal)
{
if (likely(netif_rx_schedule_prep(&mal->poll_dev))) {
if (likely(napi_schedule_prep(&mal->napi))) {
MAL_DBG2(mal, "schedule_poll" NL);
mal_disable_eob_irq(mal);
__netif_rx_schedule(&mal->poll_dev);
__napi_schedule(&mal->napi);
} else
MAL_DBG2(mal, "already in poll" NL);
}
Expand Down Expand Up @@ -318,8 +318,7 @@ void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac)
msleep(1);

/* Synchronize with the MAL NAPI poller. */
while (test_bit(__LINK_STATE_RX_SCHED, &mal->poll_dev.state))
msleep(1);
napi_disable(&mal->napi);
}

void mal_poll_enable(struct mal_instance *mal, struct mal_commac *commac)
Expand All @@ -330,11 +329,11 @@ void mal_poll_enable(struct mal_instance *mal, struct mal_commac *commac)
// XXX might want to kick a poll now...
}

static int mal_poll(struct net_device *ndev, int *budget)
static int mal_poll(struct napi_struct *napi, int budget)
{
struct mal_instance *mal = netdev_priv(ndev);
struct mal_instance *mal = container_of(napi, struct mal_instance, napi);
struct list_head *l;
int rx_work_limit = min(ndev->quota, *budget), received = 0, done;
int received = 0;
unsigned long flags;

MAL_DBG2(mal, "poll(%d) %d ->" NL, *budget,
Expand All @@ -358,26 +357,21 @@ static int mal_poll(struct net_device *ndev, int *budget)
int n;
if (unlikely(test_bit(MAL_COMMAC_POLL_DISABLED, &mc->flags)))
continue;
n = mc->ops->poll_rx(mc->dev, rx_work_limit);
n = mc->ops->poll_rx(mc->dev, budget);
if (n) {
received += n;
rx_work_limit -= n;
if (rx_work_limit <= 0) {
done = 0;
// XXX What if this is the last one ?
goto more_work;
}
budget -= n;
if (budget <= 0)
goto more_work; // XXX What if this is the last one ?
}
}

/* We need to disable IRQs to protect from RXDE IRQ here */
spin_lock_irqsave(&mal->lock, flags);
__netif_rx_complete(ndev);
__napi_complete(napi);
mal_enable_eob_irq(mal);
spin_unlock_irqrestore(&mal->lock, flags);

done = 1;

/* Check for "rotting" packet(s) */
list_for_each(l, &mal->poll_list) {
struct mal_commac *mc =
Expand All @@ -387,12 +381,12 @@ static int mal_poll(struct net_device *ndev, int *budget)
if (unlikely(mc->ops->peek_rx(mc->dev) ||
test_bit(MAL_COMMAC_RX_STOPPED, &mc->flags))) {
MAL_DBG2(mal, "rotting packet" NL);
if (netif_rx_reschedule(ndev, received))
if (napi_reschedule(napi))
mal_disable_eob_irq(mal);
else
MAL_DBG2(mal, "already in poll list" NL);

if (rx_work_limit > 0)
if (budget > 0)
goto again;
else
goto more_work;
Expand All @@ -401,13 +395,8 @@ static int mal_poll(struct net_device *ndev, int *budget)
}

more_work:
ndev->quota -= received;
*budget -= received;

MAL_DBG2(mal, "poll() %d <- %d" NL, *budget,
done ? 0 : 1);

return done ? 0 : 1;
MAL_DBG2(mal, "poll() %d <- %d" NL, budget, received);
return received;
}

static void mal_reset(struct mal_instance *mal)
Expand Down Expand Up @@ -538,11 +527,8 @@ static int __devinit mal_probe(struct of_device *ofdev,
}

INIT_LIST_HEAD(&mal->poll_list);
set_bit(__LINK_STATE_START, &mal->poll_dev.state);
mal->poll_dev.weight = CONFIG_IBM_NEW_EMAC_POLL_WEIGHT;
mal->poll_dev.poll = mal_poll;
mal->poll_dev.priv = mal;
atomic_set(&mal->poll_dev.refcnt, 1);
mal->napi.weight = CONFIG_IBM_NEW_EMAC_POLL_WEIGHT;
mal->napi.poll = mal_poll;
INIT_LIST_HEAD(&mal->list);
spin_lock_init(&mal->lock);

Expand Down Expand Up @@ -653,11 +639,8 @@ static int __devexit mal_remove(struct of_device *ofdev)

MAL_DBG(mal, "remove" NL);

/* Syncronize with scheduled polling,
stolen from net/core/dev.c:dev_close()
*/
clear_bit(__LINK_STATE_START, &mal->poll_dev.state);
netif_poll_disable(&mal->poll_dev);
/* Synchronize with scheduled polling */
napi_disable(&mal->napi);

if (!list_empty(&mal->list)) {
/* This is *very* bad */
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/net/ibm_newemac/mal.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ struct mal_instance {
int serr_irq; /* MAL System Error IRQ */

struct list_head poll_list;
struct net_device poll_dev;
struct napi_struct napi;

struct list_head list;
u32 tx_chan_mask;
Expand Down

0 comments on commit 69f8841

Please sign in to comment.