aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/spider_net.h
diff options
context:
space:
mode:
authorLinas Vepstas <linas@austin.ibm.com>2006-10-10 17:11:33 -0400
committerJeff Garzik <jeff@garzik.org>2006-10-11 04:04:26 -0400
commit204e5fa17c7ba45a89989f8da6dfe8e54d64b79b (patch)
treee69b3c2989839bac94718c6be16dd1433da30c12 /drivers/net/spider_net.h
parentb21606a773faffc2b3ec326325c433bdf37ecbdf (diff)
[PATCH] powerpc/cell spidernet low watermark patch.
Implement basic low-watermark support for the transmit queue. Hardware low-watermarks allow a properly configured kernel to continously stream data to a device and not have to handle any interrupts at all in doing so. Correct zero-interrupt operation can be actually observed for this driver, when the socket buffer is made large enough. The basic idea of a low-watermark interrupt is as follows. The device driver queues up a bunch of packets for the hardware to transmit, and then kicks the hardware to get it started. As the hardware drains the queue of pending, untransmitted packets, the device driver will want to know when the queue is almost empty, so that it can queue some more packets. If the queue drains down to the low waterark, then an interrupt will be generated. However, if the kernel/driver continues to add enough packets to keep the queue partially filled, no interrupt will actually be generated, and the hardware can continue streaming packets indefinitely in this mode. The impelmentation is done by setting the DESCR_TXDESFLG flag in one of the packets. When the hardware sees this flag, it will interrupt the device driver. Because this flag is on a fixed packet, rather than at fixed location in the queue, the code below needs to move the flag as more packets are queued up. This implementation attempts to keep the flag at about 1/4 from "empty". Signed-off-by: Linas Vepstas <linas@austin.ibm.com> Signed-off-by: James K Lewis <jklewis@us.ibm.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/spider_net.h')
-rw-r--r--drivers/net/spider_net.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/spider_net.h b/drivers/net/spider_net.h
index 6c9d7ce7f731..1f5c9dc806a0 100644
--- a/drivers/net/spider_net.h
+++ b/drivers/net/spider_net.h
@@ -49,7 +49,7 @@ extern char spider_net_driver_name[];
49#define SPIDER_NET_TX_DESCRIPTORS_MIN 16 49#define SPIDER_NET_TX_DESCRIPTORS_MIN 16
50#define SPIDER_NET_TX_DESCRIPTORS_MAX 512 50#define SPIDER_NET_TX_DESCRIPTORS_MAX 512
51 51
52#define SPIDER_NET_TX_TIMER 20 52#define SPIDER_NET_TX_TIMER (HZ/5)
53 53
54#define SPIDER_NET_RX_CSUM_DEFAULT 1 54#define SPIDER_NET_RX_CSUM_DEFAULT 1
55 55
@@ -328,9 +328,7 @@ enum spider_net_int2_status {
328 SPIDER_NET_GRISPDNGINT 328 SPIDER_NET_GRISPDNGINT
329}; 329};
330 330
331#define SPIDER_NET_TXINT ( (1 << SPIDER_NET_GTTEDINT) | \ 331#define SPIDER_NET_TXINT ( (1 << SPIDER_NET_GDTFDCINT) )
332 (1 << SPIDER_NET_GDTDCEINT) | \
333 (1 << SPIDER_NET_GDTFDCINT) )
334 332
335/* We rely on flagged descriptor interrupts */ 333/* We rely on flagged descriptor interrupts */
336#define SPIDER_NET_RXINT ( (1 << SPIDER_NET_GDAFDCINT) ) 334#define SPIDER_NET_RXINT ( (1 << SPIDER_NET_GDAFDCINT) )
@@ -356,6 +354,7 @@ enum spider_net_int2_status {
356#define SPIDER_NET_DESCR_FORCE_END 0x50000000 /* used in rx and tx */ 354#define SPIDER_NET_DESCR_FORCE_END 0x50000000 /* used in rx and tx */
357#define SPIDER_NET_DESCR_CARDOWNED 0xA0000000 /* used in rx and tx */ 355#define SPIDER_NET_DESCR_CARDOWNED 0xA0000000 /* used in rx and tx */
358#define SPIDER_NET_DESCR_NOT_IN_USE 0xF0000000 356#define SPIDER_NET_DESCR_NOT_IN_USE 0xF0000000
357#define SPIDER_NET_DESCR_TXDESFLG 0x00800000
359 358
360struct spider_net_descr { 359struct spider_net_descr {
361 /* as defined by the hardware */ 360 /* as defined by the hardware */
@@ -440,6 +439,7 @@ struct spider_net_card {
440 439
441 struct spider_net_descr_chain tx_chain; 440 struct spider_net_descr_chain tx_chain;
442 struct spider_net_descr_chain rx_chain; 441 struct spider_net_descr_chain rx_chain;
442 struct spider_net_descr *low_watermark;
443 443
444 struct net_device_stats netdev_stats; 444 struct net_device_stats netdev_stats;
445 445