sky2: fix bugs - ring size too small, improper iob freeing
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Sun, 3 May 2009 00:41:06 +0000 (17:41 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Sun, 3 May 2009 00:41:06 +0000 (17:41 -0700)
src/drivers/net/sky2.c

index d22b477..72da46f 100644 (file)
  *
  * Each ring start must be aligned to a 4k boundary. You will get mysterious
  * "invalid LE" errors if they're not.
+ *
+ * The card silently forces each ring size to be at least 128. If you
+ * act as though one of them is smaller (by setting the below
+ * #defines) you'll get bad bugs.
  */
 
-#define RX_LE_SIZE             64
+#define RX_LE_SIZE             128
 #define RX_LE_BYTES            (RX_LE_SIZE*sizeof(struct sky2_rx_le))
 #define RX_RING_ALIGN          4096
 #define RX_MAX_PENDING         (RX_LE_SIZE/6 - 2)
 #define RX_DEF_PENDING         RX_MAX_PENDING
 #define RX_COPYBREAK            1
 
-#define TX_RING_SIZE           32
+#define TX_RING_SIZE           128
 #define TX_DEF_PENDING         (TX_RING_SIZE - 1)
 #define TX_RING_ALIGN          4096
 #define MAX_SKB_TX_LE          4
 
-#define STATUS_RING_SIZE       512     /* 2 ports * (TX + 2*RX) */
+#define STATUS_RING_SIZE       512     /* 2 ports * (TX + RX) */
 #define STATUS_LE_BYTES                (STATUS_RING_SIZE*sizeof(struct sky2_status_le))
 #define STATUS_RING_ALIGN       4096
 #define PHY_RETRIES            1000
@@ -1322,7 +1326,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
                if (le->ctrl & EOP) {
                        DBGP(PFX "%s: tx done %d\n", dev->name, idx);
 
-                       free_iob(re->iob);
+                       netdev_tx_complete(dev, re->iob);
                        sky2->tx_next = RING_NEXT(idx, TX_RING_SIZE);
                }
        }
@@ -1890,8 +1894,9 @@ static void sky2_le_error(struct sky2_hw *hw, unsigned port,
                ? (u64 *) sky2->rx_le : (u64 *) sky2->tx_le;
 
        idx = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX));
-       DBG(PFX "%s: descriptor error q=%#x get=%d [%llx] put=%d should be %d\n",
+       DBG(PFX "%s: descriptor error q=%#x get=%d [%llx] last=%d put=%d should be %d\n",
            dev->name, (unsigned) q, idx, (unsigned long long) le[idx],
+           (int) sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_LAST_IDX)),
            (int) sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX)), le == (u64 *)sky2->rx_le? sky2->rx_put : sky2->tx_prod);
 
        sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_IRQ_CHK);