Re: atl1 64-bit => 32-bit DMA borkage (reproducible, bisected)

Jay Cliburn
2008-04-22T02:08:39Z

On Mon, 21 Apr 2008 00:55:00 +0400
Alexey Dobriyan <adobriyan@gmail.com> wrote:

> Aha, ifconfig down is enough. Here is how reproducer looks like now:
>
> ./sync-linux-linus && ssh core2 "sudo /sbin/ifconfig eth0
> down"
>
> where first script is basically scp(1).
>
> Also, booting with 1G or 2G of RAM (mem=1024m) makes issue go away.
>
> printk at dev_close() time shows that NETIF_F_HIGHDMA was not somehow
> enabled.
>

Alexey, can you please try this (very minimally tested) patch?

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 5586fc6..07fe5c0 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1115,9 +1115,6 @@ static void atl1_free_ring_resources(struct atl1_adapter *adapter)
struct atl1_rrd_ring *rrd_ring = &adapter->rrd_ring;
struct atl1_ring_header *ring_header = &adapter->ring_header;

- atl1_clean_tx_ring(adapter);
- atl1_clean_rx_ring(adapter);
-
kfree(tpd_ring->buffer_info);
pci_free_consistent(pdev, ring_header->size, ring_header->desc,
ring_header->dma);
@@ -3423,6 +3420,8 @@ static int atl1_set_ringparam(struct net_device *netdev,
adapter->rrd_ring = rrd_old;
adapter->tpd_ring = tpd_old;
adapter->ring_header = rhdr_old;
+ atl1_clean_tx_ring(adapter);
+ atl1_clean_rx_ring(adapter);
atl1_free_ring_resources(adapter);
adapter->rfd_ring = rfd_new;
adapter->rrd_ring = rrd_new;