Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 39422
b: refs/heads/master
c: 204e5fa
h: refs/heads/master
v: v3
  • Loading branch information
Linas Vepstas authored and Jeff Garzik committed Oct 11, 2006
1 parent a0bdad7 commit c0131de
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 5 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: b21606a773faffc2b3ec326325c433bdf37ecbdf
refs/heads/master: 204e5fa17c7ba45a89989f8da6dfe8e54d64b79b
43 changes: 43 additions & 0 deletions trunk/drivers/net/spider_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,7 @@ spider_net_prepare_tx_descr(struct spider_net_card *card,
break;
}

/* Chain the bus address, so that the DMA engine finds this descr. */
descr->prev->next_descr_addr = descr->bus_addr;

card->netdev->trans_start = jiffies; /* set netdev watchdog timer */
Expand Down Expand Up @@ -717,6 +718,41 @@ spider_net_release_tx_descr(struct spider_net_card *card)
dev_kfree_skb_any(skb);
}

static void
spider_net_set_low_watermark(struct spider_net_card *card)
{
int status;
int cnt=0;
int i;
struct spider_net_descr *descr = card->tx_chain.tail;

/* Measure the length of the queue. */
while (descr != card->tx_chain.head) {
status = descr->dmac_cmd_status & SPIDER_NET_DESCR_NOT_IN_USE;
if (status == SPIDER_NET_DESCR_NOT_IN_USE)
break;
descr = descr->next;
cnt++;
}

/* If TX queue is short, don't even bother with interrupts */
if (cnt < card->tx_desc/4)
return;

/* Set low-watermark 3/4th's of the way into the queue. */
descr = card->tx_chain.tail;
cnt = (cnt*3)/4;
for (i=0;i<cnt; i++)
descr = descr->next;

/* Set the new watermark, clear the old watermark */
descr->dmac_cmd_status |= SPIDER_NET_DESCR_TXDESFLG;
if (card->low_watermark && card->low_watermark != descr)
card->low_watermark->dmac_cmd_status =
card->low_watermark->dmac_cmd_status & ~SPIDER_NET_DESCR_TXDESFLG;
card->low_watermark = descr;
}

/**
* spider_net_release_tx_chain - processes sent tx descriptors
* @card: adapter structure
Expand Down Expand Up @@ -838,6 +874,7 @@ spider_net_xmit(struct sk_buff *skb, struct net_device *netdev)
return NETDEV_TX_BUSY;
}

spider_net_set_low_watermark(card);
spider_net_kick_tx_dma(card);
card->tx_chain.head = card->tx_chain.head->next;
spin_unlock_irqrestore(&chain->lock, flags);
Expand Down Expand Up @@ -1467,6 +1504,10 @@ spider_net_interrupt(int irq, void *ptr)
spider_net_rx_irq_off(card);
netif_rx_schedule(netdev);
}
if (status_reg & SPIDER_NET_TXINT ) {
spider_net_cleanup_tx_ring(card);
netif_wake_queue(netdev);
}

if (status_reg & SPIDER_NET_ERRINT )
spider_net_handle_error_irq(card, status_reg);
Expand Down Expand Up @@ -1629,6 +1670,8 @@ spider_net_open(struct net_device *netdev)
PCI_DMA_TODEVICE, card->tx_desc))
goto alloc_tx_failed;

card->low_watermark = NULL;

/* rx_chain is after tx_chain, so offset is descr + tx_count */
if (spider_net_init_chain(card, &card->rx_chain,
card->descr + card->tx_desc,
Expand Down
8 changes: 4 additions & 4 deletions trunk/drivers/net/spider_net.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ extern char spider_net_driver_name[];
#define SPIDER_NET_TX_DESCRIPTORS_MIN 16
#define SPIDER_NET_TX_DESCRIPTORS_MAX 512

#define SPIDER_NET_TX_TIMER 20
#define SPIDER_NET_TX_TIMER (HZ/5)

#define SPIDER_NET_RX_CSUM_DEFAULT 1

Expand Down Expand Up @@ -328,9 +328,7 @@ enum spider_net_int2_status {
SPIDER_NET_GRISPDNGINT
};

#define SPIDER_NET_TXINT ( (1 << SPIDER_NET_GTTEDINT) | \
(1 << SPIDER_NET_GDTDCEINT) | \
(1 << SPIDER_NET_GDTFDCINT) )
#define SPIDER_NET_TXINT ( (1 << SPIDER_NET_GDTFDCINT) )

/* We rely on flagged descriptor interrupts */
#define SPIDER_NET_RXINT ( (1 << SPIDER_NET_GDAFDCINT) )
Expand All @@ -356,6 +354,7 @@ enum spider_net_int2_status {
#define SPIDER_NET_DESCR_FORCE_END 0x50000000 /* used in rx and tx */
#define SPIDER_NET_DESCR_CARDOWNED 0xA0000000 /* used in rx and tx */
#define SPIDER_NET_DESCR_NOT_IN_USE 0xF0000000
#define SPIDER_NET_DESCR_TXDESFLG 0x00800000

struct spider_net_descr {
/* as defined by the hardware */
Expand Down Expand Up @@ -440,6 +439,7 @@ struct spider_net_card {

struct spider_net_descr_chain tx_chain;
struct spider_net_descr_chain rx_chain;
struct spider_net_descr *low_watermark;

struct net_device_stats netdev_stats;

Expand Down

0 comments on commit c0131de

Please sign in to comment.