Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 78975
b: refs/heads/master
c: 61cec3b
h: refs/heads/master
i:
  78973: 9e812db
  78971: 139ba9f
  78967: 7cd2df6
  78959: db51535
  78943: d3b0cfa
  78911: d46a6a0
  78847: 24505d5
v: v3
  • Loading branch information
Olof Johansson authored and David S. Miller committed Jan 28, 2008
1 parent 908722c commit f2ca8f3
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 9 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: 5c15332bed4c59fff6423f08ef6bd6894af38a99
refs/heads/master: 61cec3bddc79373a246e2f8eb13e5acdc106f46a
41 changes: 33 additions & 8 deletions trunk/drivers/net/pasemi_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -805,27 +805,43 @@ static irqreturn_t pasemi_mac_rx_intr(int irq, void *data)
return IRQ_HANDLED;
}

#define TX_CLEAN_INTERVAL HZ

static void pasemi_mac_tx_timer(unsigned long data)
{
struct pasemi_mac_txring *txring = (struct pasemi_mac_txring *)data;
struct pasemi_mac *mac = txring->mac;

pasemi_mac_clean_tx(txring);

mod_timer(&txring->clean_timer, jiffies + TX_CLEAN_INTERVAL);

pasemi_mac_restart_tx_intr(mac);
}

static irqreturn_t pasemi_mac_tx_intr(int irq, void *data)
{
struct pasemi_mac_txring *txring = data;
const struct pasemi_dmachan *chan = &txring->chan;
unsigned int reg, pcnt;
struct pasemi_mac *mac = txring->mac;
unsigned int reg;

if (!(*chan->status & PAS_STATUS_CAUSE_M))
return IRQ_NONE;

pasemi_mac_clean_tx(txring);

pcnt = *chan->status & PAS_STATUS_PCNT_M;

reg = PAS_IOB_DMA_TXCH_RESET_PCNT(pcnt) | PAS_IOB_DMA_TXCH_RESET_PINTC;
reg = 0;

if (*chan->status & PAS_STATUS_SOFT)
reg |= PAS_IOB_DMA_TXCH_RESET_SINTC;
if (*chan->status & PAS_STATUS_ERROR)
reg |= PAS_IOB_DMA_TXCH_RESET_DINTC;

write_iob_reg(PAS_IOB_DMA_TXCH_RESET(chan->chno), reg);
mod_timer(&txring->clean_timer, jiffies + (TX_CLEAN_INTERVAL)*2);

netif_rx_schedule(mac->netdev, &mac->napi);

if (reg)
write_iob_reg(PAS_IOB_DMA_TXCH_RESET(chan->chno), reg);

return IRQ_HANDLED;
}
Expand Down Expand Up @@ -973,7 +989,7 @@ static int pasemi_mac_open(struct net_device *dev)
PAS_IOB_DMA_RXCH_CFG_CNTTH(0));

write_iob_reg(PAS_IOB_DMA_TXCH_CFG(mac->tx->chan.chno),
PAS_IOB_DMA_TXCH_CFG_CNTTH(128));
PAS_IOB_DMA_TXCH_CFG_CNTTH(32));

write_mac_reg(mac, PAS_MAC_IPC_CHNL,
PAS_MAC_IPC_CHNL_DCHNO(mac->rx->chan.chno) |
Expand Down Expand Up @@ -1054,6 +1070,12 @@ static int pasemi_mac_open(struct net_device *dev)
if (mac->phydev)
phy_start(mac->phydev);

init_timer(&mac->tx->clean_timer);
mac->tx->clean_timer.function = pasemi_mac_tx_timer;
mac->tx->clean_timer.data = (unsigned long)mac->tx;
mac->tx->clean_timer.expires = jiffies+HZ;
add_timer(&mac->tx->clean_timer);

return 0;

out_rx_int:
Expand Down Expand Up @@ -1087,6 +1109,8 @@ static int pasemi_mac_close(struct net_device *dev)
phy_disconnect(mac->phydev);
}

del_timer_sync(&mac->tx->clean_timer);

netif_stop_queue(dev);
napi_disable(&mac->napi);

Expand Down Expand Up @@ -1304,6 +1328,7 @@ static int pasemi_mac_poll(struct napi_struct *napi, int budget)
netif_rx_complete(dev, napi);

pasemi_mac_restart_rx_intr(mac);
pasemi_mac_restart_tx_intr(mac);
}
return pkts;
}
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/net/pasemi_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct pasemi_mac_txring {
unsigned int next_to_clean;
struct pasemi_mac_buffer *ring_info;
struct pasemi_mac *mac; /* Needed in intr handler */
struct timer_list clean_timer;
};

struct pasemi_mac_rxring {
Expand Down

0 comments on commit f2ca8f3

Please sign in to comment.