Thread (131 messages) 131 messages, 7 authors, 2010-01-21

Re: sky2 panic in 2.6.32.1 under load (new oops)

From: Michael Breuer <hidden>
Date: 2009-12-29 18:54:39
Also in: lkml

One more data point - it appears that the errors are occurring when the 
interface is under load AND there is ipv6 dns activity. As this only 
happens when under load I can't prove it, but it seems there is a 
correlation.
quoted hunk ↗ jump to hunk
There could be DMA problems, either because chip isn't remembering
upper address, or because of lack of wires from chip to memory controller;
there have been problems on motherboards where I/O devices couldn't access
all of memory.

Try this, it forces each transmit to have full 64 bit address. It drops an
optimization that was done to reduce the number of transmit descriptors
used.
--- a/drivers/net/sky2.c	2009-12-29 09:23:37.114074275 -0800
+++ b/drivers/net/sky2.c	2009-12-29 09:26:38.699912035 -0800
@@ -1038,10 +1038,11 @@ static void tx_init(struct sky2_port *sk
  	sky2->tx_tcpsum = 0;
  	sky2->tx_last_mss = 0;

-	le = get_tx_le(sky2,&sky2->tx_prod);
-	le->addr = 0;
-	le->opcode = OP_ADDR64 | HW_OWNER;
-	sky2->tx_last_upper = 0;
+	if (sizeof(dma_addr_t) == sizeof(u32)) {
+		le = get_tx_le(sky2,&sky2->tx_prod);
+		le->addr = 0;
+		le->opcode = OP_ADDR64 | HW_OWNER;
+	}
  }

  /* Update chip's next pointer */
@@ -1669,10 +1670,9 @@ static netdev_tx_t sky2_xmit_frame(struc

  	/* Send high bits if needed */
  	upper = upper_32_bits(mapping);
-	if (upper != sky2->tx_last_upper) {
+	if (sizeof(mapping)>  sizeof(u32)) {
  		le = get_tx_le(sky2,&slot);
  		le->addr = cpu_to_le32(upper);
-		sky2->tx_last_upper = upper;
  		le->opcode = OP_ADDR64 | HW_OWNER;
  	}
@@ -1762,10 +1762,9 @@ static netdev_tx_t sky2_xmit_frame(struc
  			goto mapping_unwind;

  		upper = upper_32_bits(mapping);
-		if (upper != sky2->tx_last_upper) {
+		if (sizeof(mapping)>  sizeof(u32)) {
  			le = get_tx_le(sky2,&slot);
  			le->addr = cpu_to_le32(upper);
-			sky2->tx_last_upper = upper;
  			le->opcode = OP_ADDR64 | HW_OWNER;
  		}

--- a/drivers/net/sky2.h	2009-12-29 09:23:37.164072886 -0800
+++ b/drivers/net/sky2.h	2009-12-29 09:25:15.302197993 -0800
@@ -2191,7 +2191,6 @@ struct sky2_port {

  	u16		     tx_pending;
  	u16		     tx_last_mss;
-	u32		     tx_last_upper;
  	u32		     tx_tcpsum;

  	struct rx_ring_info  *rx_ring ____cacheline_aligned_in_smp;
   
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help