* [bk] 2.6.x net driver queue snapshot
@ 2003-08-26 20:51 Jeff Garzik
2003-08-26 22:07 ` [patch] 2.6.0-test4 - more sis190 nit I/II Francois Romieu
2003-08-26 22:14 ` [patch] 2.6.0-test4 - more sis190 nit II/II Francois Romieu
0 siblings, 2 replies; 4+ messages in thread
From: Jeff Garzik @ 2003-08-26 20:51 UTC (permalink / raw)
To: netdev
Snapshot of the current 2.6.x net driver queue.
Notably, collects sis190 fixes.
BK users:
bk pull bk://kernel.bkbits.net/jgarzik/net-drivers-2.6
or
bk pull http://gkernel.bkbits.net/net-drivers-2.6
This will update the following files:
drivers/net/3c501.c | 91 +--------
drivers/net/3c501.h | 2
drivers/net/3c503.c | 71 +------
drivers/net/3c505.c | 96 ++--------
drivers/net/3c507.c | 97 ++--------
drivers/net/3c515.c | 94 ++-------
drivers/net/3c523.c | 73 +------
drivers/net/3c527.c | 94 ++-------
drivers/net/3c59x.c | 47 +---
drivers/net/8139cp.c | 444 ++++++++++++++++++-----------------------------
drivers/net/Kconfig | 2
drivers/net/sis190.c | 79 +++++---
drivers/net/sis900.c | 43 +---
drivers/net/tulip/dmfe.c | 62 +-----
14 files changed, 393 insertions(+), 902 deletions(-)
through these ChangeSets:
<jgarzik@redhat.com> (03/08/26 1.1301)
[netdrvr] ethtool_ops support for 3c515, 3c523, 3c527, and dmfe
<jgarzik@redhat.com> (03/08/26 1.1300)
[netdrvr] ethtool_ops support in 3c503, 3c505, 3c507
<jgarzik@redhat.com> (03/08/26 1.1299)
[netdrvr 3c501] ethtool_ops support
<jgarzik@redhat.com> (03/08/26 1.1298)
[netdrvr sis190] make driver depend on CONFIG_BROKEN
Until RX path is cleaned up to use PCI DMA API and
not virt_to_bus.
<jgarzik@redhat.com> (03/08/26 1.1297)
[netdrvr sis190] convert TX path to use PCI DMA API
Also, minor changes:
* mark ->hard_start_xmit ETH_ZLEN test as unlikely()
* use cpu_to_le32() and le32_to_cpu() in TX path
* fix two leak in error path, in ->hard_start_xmit
* don't test netif_queue_stopped() in TX completion path,
netif_wake_queue() already does that.
<jgarzik@redhat.com> (03/08/26 1.1296)
[netdrvr 8139cp] ethtool_ops support
<jgarzik@redhat.com> (03/08/26 1.1295)
[netdrvr sis900] ethtool_ops support
<willy@debian.org> (03/08/26 1.1294)
[netdrvr 3c59x] ethtool_ops support
<romieu@fr.zoreil.com> (03/08/26 1.1293)
[netdrvr sis190] pass irq argument to synchronize_irq()
Looks like this driver wasn't tested on SMP :)
<bunk@fs.tum.de> (03/08/26 1.1292)
[netdrvr sis190] fix build with older gcc
older gcc's do not support C99/C++ style of variable declarations.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch] 2.6.0-test4 - more sis190 nit I/II
2003-08-26 20:51 [bk] 2.6.x net driver queue snapshot Jeff Garzik
@ 2003-08-26 22:07 ` Francois Romieu
2003-08-26 22:24 ` Jeff Garzik
2003-08-26 22:14 ` [patch] 2.6.0-test4 - more sis190 nit II/II Francois Romieu
1 sibling, 1 reply; 4+ messages in thread
From: Francois Romieu @ 2003-08-26 22:07 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Jeff Garzik <jgarzik@pobox.com> :
[....]
> <romieu@fr.zoreil.com> (03/08/26 1.1293)
> [netdrvr sis190] pass irq argument to synchronize_irq()
>
> Looks like this driver wasn't tested on SMP :)
The following patch should apply on top of this. Compiled, untested.
Driver does not need to enforce 256 byte alignment for data returned
from pci_alloc_consistent().
- {rx/tx}_dma_aligned and {rx/td}_dma_raw are both replaced by {rx/tx}_dma;
- {rx/tx}_desc_raw is replaced by direct use of {Rx/Tx}DescArray;
- SiS190_open()
+ fixup for a lack of kmalloc() failure handling;
+ (return status) there is no need for both retval/rc: merge them;
+ anonymous printk() fixup: the name of the guilty device is printed;
- define {RX/TX}_DESC_TOTAL_SIZE because I am too lazy to read twice the
same lengthy arithmetic expression.
drivers/net/sis190.c | 78 ++++++++++++++++++++++-----------------------------
1 files changed, 35 insertions(+), 43 deletions(-)
diff -puN drivers/net/sis190.c~redundant-alignment-sis190 drivers/net/sis190.c
--- linux-2.6.0-test4/drivers/net/sis190.c~redundant-alignment-sis190 Tue Aug 26 21:55:14 2003
+++ linux-2.6.0-test4-fr/drivers/net/sis190.c Tue Aug 26 22:22:09 2003
@@ -76,6 +76,8 @@ static int multicast_filter_limit = 32;
#define NUM_TX_DESC 64 /* Number of Tx descriptor registers */
#define NUM_RX_DESC 64 /* Number of Rx descriptor registers */
+#define TX_DESC_TOTAL_SIZE ((NUM_TX_DESC * sizeof (struct TxDesc)) + 256)
+#define RX_DESC_TOTAL_SIZE ((NUM_RX_DESC * sizeof (struct RxDesc)) + 256)
#define RX_BUF_SIZE 1536 /* Rx Buffer size */
#define SiS190_MIN_IO_SIZE 0x80
@@ -311,12 +313,8 @@ struct sis190_private {
unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
unsigned long dirty_tx;
- void *tx_desc_raw; /* Tx descriptor buffer */
- dma_addr_t tx_dma_raw;
- dma_addr_t tx_dma_aligned;
- void *rx_desc_raw; /* Rx descriptor buffer */
- dma_addr_t rx_dma_raw;
- dma_addr_t rx_dma_aligned;
+ dma_addr_t tx_dma;
+ dma_addr_t rx_dma;
struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
unsigned char *RxBufferRings; /* Index of Rx Buffer */
@@ -714,54 +712,50 @@ static int
SiS190_open(struct net_device *dev)
{
struct sis190_private *tp = dev->priv;
- int retval;
- u8 diff;
int rc;
- retval =
- request_irq(dev->irq, SiS190_interrupt, SA_SHIRQ, dev->name, dev);
- if (retval) {
- return retval;
- }
+ rc = request_irq(dev->irq, SiS190_interrupt, SA_SHIRQ, dev->name, dev);
+ if (rc)
+ goto out;
- tp->tx_desc_raw = pci_alloc_consistent(tp->pci_dev,
- (NUM_TX_DESC * sizeof (struct TxDesc)) + 256,
- &tp->tx_dma_raw);
- if (!tp->tx_desc_raw) {
+ /*
+ * Rx and Tx descriptors need 256 bytes alignment.
+ * pci_alloc_consistent() guarantees a stronger alignment.
+ */
+ tp->TxDescArray = pci_alloc_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE,
+ &tp->tx_dma);
+ if (!tp->TxDescArray) {
rc = -ENOMEM;
goto err_out;
}
- // Tx Desscriptor needs 256 bytes alignment;
- diff = 256 - (tp->tx_dma_raw - ((tp->tx_dma_raw >> 8) << 8));
- tp->tx_dma_aligned = tp->tx_dma_raw + diff;
- tp->TxDescArray = (struct TxDesc *) (tp->tx_desc_raw + diff);
-
- tp->rx_desc_raw = pci_alloc_consistent(tp->pci_dev,
- (NUM_RX_DESC * sizeof (struct RxDesc)) + 256,
- &tp->rx_dma_raw);
- if (!tp->rx_desc_raw) {
+
+ tp->RxDescArray = pci_alloc_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE,
+ &tp->rx_dma);
+ if (!tp->RxDescArray) {
rc = -ENOMEM;
goto err_out_free_tx;
}
- // Rx Desscriptor needs 256 bytes alignment;
- diff = 256 - (tp->rx_dma_raw - ((tp->rx_dma_raw >> 8) << 8));
- tp->rx_dma_aligned = tp->rx_dma_raw + diff;
- tp->RxDescArray = (struct RxDesc *) (tp->rx_desc_raw + diff);
tp->RxBufferRings = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
if (tp->RxBufferRings == NULL) {
- printk(KERN_INFO "Allocate RxBufferRing failed\n");
+ printk(KERN_INFO "%s: allocate RxBufferRing failed\n",
+ dev->name);
+ rc = -ENOMEM;
+ goto err_out_free_rx;
}
SiS190_init_ring(dev);
SiS190_hw_start(dev);
- return 0;
+out:
+ return rc;
+err_out_free_rx:
+ pci_free_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE, tp->RxDescArray,
+ tp->rx_dma);
err_out_free_tx:
- pci_free_consistent(tp->pci_dev,
- (NUM_TX_DESC * sizeof (struct TxDesc)) + 256,
- tp->tx_desc_raw, tp->tx_dma_raw);
+ pci_free_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE, tp->TxDescArray,
+ tp->tx_dma);
err_out:
free_irq(dev->irq, dev);
return rc;
@@ -780,10 +774,10 @@ SiS190_hw_start(struct net_device *dev)
SiS_W32(IntrControl, 0x0);
SiS_W32(0x0, 0x01a00);
- SiS_W32(0x4, tp->tx_dma_aligned);
+ SiS_W32(0x4, tp->tx_dma);
SiS_W32(0x10, 0x1a00);
- SiS_W32(0x14, tp->rx_dma_aligned);
+ SiS_W32(0x14, tp->rx_dma);
SiS_W32(0x20, 0xffffffff);
SiS_W32(0x24, 0x0);
@@ -1115,12 +1109,10 @@ SiS190_close(struct net_device *dev)
free_irq(dev->irq, dev);
SiS190_tx_clear(tp);
- pci_free_consistent(tp->pci_dev,
- (NUM_TX_DESC * sizeof (struct TxDesc)) + 256,
- tp->tx_desc_raw, tp->tx_dma_raw);
- pci_free_consistent(tp->pci_dev,
- (NUM_RX_DESC * sizeof (struct RxDesc)) + 256,
- tp->rx_desc_raw, tp->rx_dma_raw);
+ pci_free_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE, tp->TxDescArray,
+ tp->tx_dma);
+ pci_free_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE, tp->RxDescArray,
+ tp->rx_dma);
tp->TxDescArray = NULL;
tp->RxDescArray = NULL;
kfree(tp->RxBufferRings);
_
^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch] 2.6.0-test4 - more sis190 nit II/II
2003-08-26 20:51 [bk] 2.6.x net driver queue snapshot Jeff Garzik
2003-08-26 22:07 ` [patch] 2.6.0-test4 - more sis190 nit I/II Francois Romieu
@ 2003-08-26 22:14 ` Francois Romieu
1 sibling, 0 replies; 4+ messages in thread
From: Francois Romieu @ 2003-08-26 22:14 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Jeff Garzik <jgarzik@pobox.com> :
[...]
> <jgarzik@redhat.com> (03/08/26 1.1298)
> [netdrvr sis190] make driver depend on CONFIG_BROKEN
>
> Until RX path is cleaned up to use PCI DMA API and
> not virt_to_bus.
>
> <jgarzik@redhat.com> (03/08/26 1.1297)
> [netdrvr sis190] convert TX path to use PCI DMA API
>
> Also, minor changes:
> * mark ->hard_start_xmit ETH_ZLEN test as unlikely()
> * use cpu_to_le32() and le32_to_cpu() in TX path
> * fix two leak in error path, in ->hard_start_xmit
> * don't test netif_queue_stopped() in TX completion path,
> netif_wake_queue() already does that.
>
Is plain old patch for the previous items available somewhere ? I had just
finished that (no more work on it before 24h):
Missing pieces for DMA-API.
- SiS190_init_ring: the global area for the received data is mapped.
This area is persistent during the whole driver's life.
It only needs to be unmapped in SiS190_close() as no other exit/error
path exists.
- SiS190_rx_interrupt: no map/unmap for received data buffer. A single
sync operation is done. Btw, there is no need to store the same value
in RxDescArray[cur_rx].buf_addr over and over again.
- SiS190_start_xmit: transmitted data buffer is mapped.
- SiS190_tx_clear/SiS190_tx_interrupt: transmitted data buffer is unmapped.
drivers/net/sis190.c | 109 ++++++++++++++++++++++++++-------------------------
1 files changed, 57 insertions(+), 52 deletions(-)
diff -puN drivers/net/sis190.c~sis190-dma-mapping drivers/net/sis190.c
--- linux-2.6.0-test4/drivers/net/sis190.c~sis190-dma-mapping Tue Aug 26 22:28:01 2003
+++ linux-2.6.0-test4-fr/drivers/net/sis190.c Wed Aug 27 00:00:54 2003
@@ -824,19 +824,19 @@ SiS190_init_ring(struct net_device *dev)
tp->Tx_skbuff[i] = NULL;
}
for (i = 0; i < NUM_RX_DESC; i++) {
+ struct RxDesc *desc = tp->RxDescArray + i;
- tp->RxDescArray[i].PSize = 0x0;
+ desc->PSize = 0x0;
if (i == (NUM_RX_DESC - 1))
- tp->RxDescArray[i].buf_Len = BIT_31 + RX_BUF_SIZE; //bit 31 is End bit
+ desc->buf_Len = BIT_31 + RX_BUF_SIZE; //bit 31 is End bit
else
- tp->RxDescArray[i].buf_Len = RX_BUF_SIZE;
-
-#warning Replace virt_to_bus with DMA mapping
- tp->RxBufferRing[i] = &(tp->RxBufferRings[i * RX_BUF_SIZE]);
- tp->RxDescArray[i].buf_addr = virt_to_bus(tp->RxBufferRing[i]);
- tp->RxDescArray[i].status = OWNbit | INTbit;
+ desc->buf_Len = RX_BUF_SIZE;
+ tp->RxBufferRing[i] = tp->RxBufferRings + i * RX_BUF_SIZE;
+ desc->buf_addr = pci_map_single(tp->pci_dev,
+ tp->RxBufferRing[i], RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+ desc->status = OWNbit | INTbit;
}
}
@@ -848,8 +848,14 @@ SiS190_tx_clear(struct sis190_private *t
tp->cur_tx = 0;
for (i = 0; i < NUM_TX_DESC; i++) {
- if (tp->Tx_skbuff[i] != NULL) {
- dev_kfree_skb(tp->Tx_skbuff[i]);
+ struct sk_buff *skb = tp->Tx_skbuff[i];
+
+ if (skb != NULL) {
+ pci_unmap_single(tp->pci_dev,
+ tp->TxDescArray[i].buf_addr,
+ (skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN,
+ PCI_DMA_TODEVICE);
+ dev_kfree_skb(skb);
tp->Tx_skbuff[i] = NULL;
tp->stats.tx_dropped++;
}
@@ -888,6 +894,7 @@ SiS190_start_xmit(struct sk_buff *skb, s
struct sis190_private *tp = dev->priv;
void *ioaddr = tp->mmio_addr;
int entry = tp->cur_tx % NUM_TX_DESC;
+ struct TxDesc *desc = tp->TxDescArray + entry;
if (skb->len < ETH_ZLEN) {
skb = skb_padto(skb, ETH_ZLEN);
@@ -897,23 +904,17 @@ SiS190_start_xmit(struct sk_buff *skb, s
spin_lock_irq(&tp->lock);
- if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
-#warning Replace virt_to_bus with DMA mapping
+ if ((desc->status & OWNbit) == 0) {
tp->Tx_skbuff[entry] = skb;
- tp->TxDescArray[entry].buf_addr = virt_to_bus(skb->data);
- tp->TxDescArray[entry].PSize =
- ((skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);
-
- if (entry != (NUM_TX_DESC - 1)) {
- tp->TxDescArray[entry].buf_Len =
- tp->TxDescArray[entry].PSize;
- } else {
- tp->TxDescArray[entry].buf_Len =
- tp->TxDescArray[entry].PSize | ENDbit;
- }
+ desc->buf_addr = pci_map_single(tp->pci_dev, skb->data,
+ desc->PSize, PCI_DMA_TODEVICE);
+ desc->PSize = ((skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);
+
+ desc->buf_Len = desc->PSize;
+ if (entry == (NUM_TX_DESC - 1))
+ desc->buf_Len |= ENDbit;
- tp->TxDescArray[entry].status |=
- (OWNbit | INTbit | DEFbit | CRCbit | PADbit);
+ desc->status |= (OWNbit | INTbit | DEFbit | CRCbit | PADbit);
SiS_W32(TxControl, 0x1a11); //Start Send
@@ -946,10 +947,17 @@ SiS190_tx_interrupt(struct net_device *d
tx_left = tp->cur_tx - dirty_tx;
while (tx_left > 0) {
- if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
- dev_kfree_skb_irq(tp->
- Tx_skbuff[dirty_tx % NUM_TX_DESC]);
- tp->Tx_skbuff[dirty_tx % NUM_TX_DESC] = NULL;
+ const int dirty = dirty_tx % NUM_TX_DESC;
+ struct TxDesc *desc = tp->TxDescArray + dirty;
+
+ if ((desc->status & OWNbit) == 0) {
+ struct sk_buff *skb = tp->Tx_skbuff[dirty];
+
+ pci_unmap_single(tp->pci_dev, desc->buf_addr,
+ (skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN,
+ PCI_DMA_TODEVICE);
+ dev_kfree_skb_irq(skb);
+ tp->Tx_skbuff[dirty] = NULL;
tp->stats.tx_packets++;
dirty_tx++;
tx_left--;
@@ -968,29 +976,30 @@ static void
SiS190_rx_interrupt(struct net_device *dev, struct sis190_private *tp,
void *ioaddr)
{
- int cur_rx;
- struct sk_buff *skb;
- int pkt_size = 0;
+ int cur_rx = tp->cur_rx;
+ struct RxDesc *desc = tp->RxDescArray + cur_rx;
assert(dev != NULL);
assert(tp != NULL);
assert(ioaddr != NULL);
- cur_rx = tp->cur_rx;
- while ((tp->RxDescArray[cur_rx].status & OWNbit) == 0) {
+ while ((desc->status & OWNbit) == 0) {
- if (tp->RxDescArray[cur_rx].PSize & 0x0080000) {
+ if (desc->PSize & 0x0080000) {
printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
tp->stats.rx_errors++;
tp->stats.rx_length_errors++;
- } else if (!(tp->RxDescArray[cur_rx].PSize & 0x0010000)) {
+ } else if (!(desc->PSize & 0x0010000)) {
printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
tp->stats.rx_errors++;
tp->stats.rx_crc_errors++;
} else {
- pkt_size =
- (int) (tp->RxDescArray[cur_rx].
- PSize & 0x0000FFFF) - 4;
+ struct sk_buff *skb;
+ int pkt_size;
+
+ pkt_size = (int) (desc->PSize & 0x0000FFFF) - 4;
+ pci_dma_sync_single(tp->pci_dev, desc->buf_addr,
+ RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
skb = dev_alloc_skb(pkt_size + 2);
if (skb != NULL) {
skb->dev = dev;
@@ -1001,24 +1010,18 @@ SiS190_rx_interrupt(struct net_device *d
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
- tp->RxDescArray[cur_rx].PSize = 0x0;
+ desc->PSize = 0x0;
if (cur_rx == (NUM_RX_DESC - 1))
- tp->RxDescArray[cur_rx].buf_Len =
- ENDbit + RX_BUF_SIZE;
+ desc->buf_Len = ENDbit + RX_BUF_SIZE;
else
- tp->RxDescArray[cur_rx].buf_Len =
- RX_BUF_SIZE;
+ desc->buf_Len = RX_BUF_SIZE;
-#warning Replace virt_to_bus with DMA mapping
- tp->RxDescArray[cur_rx].buf_addr =
- virt_to_bus(tp->RxBufferRing[cur_rx]);
dev->last_rx = jiffies;
tp->stats.rx_bytes += pkt_size;
tp->stats.rx_packets++;
- tp->RxDescArray[cur_rx].status =
- OWNbit | INTbit;
+ desc->status = OWNbit | INTbit;
} else {
printk(KERN_WARNING
"%s: Memory squeeze, deferring packet.\n",
@@ -1030,7 +1033,7 @@ SiS190_rx_interrupt(struct net_device *d
}
cur_rx = (cur_rx + 1) % NUM_RX_DESC;
-
+ desc = tp->RxDescArray + cur_rx;
}
tp->cur_rx = cur_rx;
@@ -1114,11 +1117,13 @@ SiS190_close(struct net_device *dev)
pci_free_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE, tp->RxDescArray,
tp->rx_dma);
tp->TxDescArray = NULL;
- tp->RxDescArray = NULL;
- kfree(tp->RxBufferRings);
for (i = 0; i < NUM_RX_DESC; i++) {
+ pci_unmap_single(tp->pci_dev, tp->RxDescArray[i].buf_addr,
+ RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
tp->RxBufferRing[i] = NULL;
}
+ tp->RxDescArray = NULL;
+ kfree(tp->RxBufferRings);
return 0;
}
_
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch] 2.6.0-test4 - more sis190 nit I/II
2003-08-26 22:07 ` [patch] 2.6.0-test4 - more sis190 nit I/II Francois Romieu
@ 2003-08-26 22:24 ` Jeff Garzik
0 siblings, 0 replies; 4+ messages in thread
From: Jeff Garzik @ 2003-08-26 22:24 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev
thanks, applied.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-08-26 22:24 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-26 20:51 [bk] 2.6.x net driver queue snapshot Jeff Garzik
2003-08-26 22:07 ` [patch] 2.6.0-test4 - more sis190 nit I/II Francois Romieu
2003-08-26 22:24 ` Jeff Garzik
2003-08-26 22:14 ` [patch] 2.6.0-test4 - more sis190 nit II/II Francois Romieu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).