netdev
[Top] [All Lists]

PATCH: [my] sundance #5

To: netdev@xxxxxxxxxxx, Linux Kernel Mailing List <linux-kernel@xxxxxxxxxxxxxxx>
Subject: PATCH: [my] sundance #5
From: Jeff Garzik <jgarzik@xxxxxxxxxxxxxxxx>
Date: Thu, 19 Sep 2002 17:35:55 -0400
Cc: Donald Becker <becker@xxxxxxxxx>, Jason Lunz <lunz@xxxxxxxxxxxx>, Richard Gooch <rgooch@xxxxxxxxxxxxxxx>, "Patrick R. McManus" <mcmanus@xxxxxxxxxxxx>, edward_peng@xxxxxxxxxxxx
Organization: MandrakeSoft
References: <Pine.LNX.4.44.0209190903050.29420-100000@beohost.scyld.com> <3D8A25D1.3060300@mandrakesoft.com>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020826
next sundance patch in the series, updated with Jason's patches

Note, with the patching of Configure.help this is a 2.4-specific patch.
diff -Nru a/Documentation/Configure.help b/Documentation/Configure.help
--- a/Documentation/Configure.help      Thu Sep 19 17:32:40 2002
+++ b/Documentation/Configure.help      Thu Sep 19 17:32:41 2002
@@ -11799,6 +11799,14 @@
   say M here and read <file:Documentation/modules.txt>.  The module
   will be called sundance.o.
 
+Sundance Alta memory-mapped I/O support
+CONFIG_SUNDANCE_MMIO
+  Enable memory-mapped I/O for interaction with Sundance NIC registers.
+  Do NOT enable this by default, PIO (enabled when MMIO is disabled)
+  is known to solve bugs on certain chips.
+
+  If unsure, say N.
+
 Sun3/Sun3x on-board LANCE support
 CONFIG_SUN3LANCE
   Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80)
diff -Nru a/drivers/net/Config.in b/drivers/net/Config.in
--- a/drivers/net/Config.in     Thu Sep 19 17:32:40 2002
+++ b/drivers/net/Config.in     Thu Sep 19 17:32:40 2002
@@ -192,6 +192,7 @@
       dep_tristate '    SiS 900/7016 PCI Fast Ethernet Adapter support' 
CONFIG_SIS900 $CONFIG_PCI
       dep_tristate '    SMC EtherPower II' CONFIG_EPIC100 $CONFIG_PCI
       dep_tristate '    Sundance Alta support' CONFIG_SUNDANCE $CONFIG_PCI
+      dep_mbool '      Use MMIO instead of PIO' CONFIG_SUNDANCE_MMIO 
$CONFIG_SUNDANCE
       if [ "$CONFIG_PCI" = "y" -o "$CONFIG_EISA" = "y" ]; then
          tristate '    TI ThunderLAN support' CONFIG_TLAN
       fi
diff -Nru a/drivers/net/sundance.c b/drivers/net/sundance.c
--- a/drivers/net/sundance.c    Thu Sep 19 17:32:40 2002
+++ b/drivers/net/sundance.c    Thu Sep 19 17:32:40 2002
@@ -33,10 +33,11 @@
        - Tx timeout recovery
        - More support for ethtool.
 
-       Version LK1.04a (jgarzik):
+       Version LK1.04a:
        - Remove unused/constant members from struct pci_id_info
        (which then allows removal of 'drv_flags' from private struct)
-       - If no phy is found, fail to load that board
+       (jgarzik)
+       - If no phy is found, fail to load that board (jgarzik)
        - Always start phy id scan at id 1 to avoid problems (Donald Becker)
        - Autodetect where mii_preable_required is needed,
        default to not needed.  (Donald Becker)
@@ -45,18 +46,25 @@
        - Remove mii_preamble_required module parameter (Donald Becker)
        - Add per-interface mii_preamble_required (setting is autodetected)
          (Donald Becker)
-       - Remove unnecessary cast from void pointer
-       - Re-align comments in private struct
+       - Remove unnecessary cast from void pointer (jgarzik)
+       - Re-align comments in private struct (jgarzik)
 
-       Version LK1.04c:
+       Version LK1.04c (jgarzik):
        - Support bitmapped message levels (NETIF_MSG_xxx), and the
          two ethtool ioctls that get/set them
        - Don't hand-code MII ethtool support, use standard API/lib
 
+       Version LK1.04d:
+       - Merge from Donald Becker's sundance.c: (Jason Lunz)
+               * proper support for variably-sized MTUs
+               * default to PIO, to fix chip bugs
+       - Add missing unregister_netdev (Jason Lunz)
+       - Add CONFIG_SUNDANCE_MMIO config option (jgarzik)
+
 */
 
 #define DRV_NAME       "sundance"
-#define DRV_VERSION    "1.01+LK1.04c"
+#define DRV_VERSION    "1.01+LK1.04d"
 #define DRV_RELDATE    "19-Sep-2002"
 
 
@@ -65,7 +73,6 @@
 static int debug = 1;                  /* 1 normal messages, 0 quiet .. 7 
verbose. */
 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
 static int max_interrupt_work = 0;
-static int mtu;
 /* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
    Typical is a 64 element hash table based on the Ethernet CRC.  */
 static int multicast_filter_limit = 32;
@@ -162,13 +169,11 @@
 MODULE_LICENSE("GPL");
 
 MODULE_PARM(max_interrupt_work, "i");
-MODULE_PARM(mtu, "i");
 MODULE_PARM(debug, "i");
 MODULE_PARM(rx_copybreak, "i");
 MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "s");
 MODULE_PARM(flowctrl, "i");
 MODULE_PARM_DESC(max_interrupt_work, "Sundance Alta maximum events handled per 
interrupt");
-MODULE_PARM_DESC(mtu, "Sundance Alta MTU (all boards)");
 MODULE_PARM_DESC(debug, "Sundance Alta debug level (0-5)");
 MODULE_PARM_DESC(rx_copybreak, "Sundance Alta copy breakpoint for 
copy-only-tiny-frames");
 MODULE_PARM_DESC(flowctrl, "Sundance Alta flow control [0|1]");
@@ -247,6 +252,10 @@
 
 */
 
+/* Work-around for Kendin chip bugs. */
+#ifndef CONFIG_SUNDANCE_MMIO
+#define USE_IO_OPS 1
+#endif
 
 static struct pci_device_id sundance_pci_tbl[] __devinitdata = {
        {0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0},
@@ -329,7 +338,7 @@
        MACCtrl0 = 0x50,
        MACCtrl1 = 0x52,
        StationAddr = 0x54,
-       MaxTxSize = 0x5A,
+       MaxFrameSize = 0x5A,
        RxMode = 0x5c,
        MIICtrl = 0x5e,
        MulticastFilter0 = 0x60,
@@ -457,6 +466,7 @@
                        IntrDrvRqst | IntrTxDone | StatsMax | \
                        LinkChange)
 
+static int  change_mtu(struct net_device *dev, int new_mtu);
 static int  eeprom_read(long ioaddr, int location);
 static int  mdio_read(struct net_device *dev, int phy_id, int location);
 static void mdio_write(struct net_device *dev, int phy_id, int location, int 
value);
@@ -563,11 +573,9 @@
        dev->do_ioctl = &netdev_ioctl;
        dev->tx_timeout = &tx_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
+       dev->change_mtu = &change_mtu;
        pci_set_drvdata(pdev, dev);
 
-       if (mtu)
-               dev->mtu = mtu;
-
        i = register_netdev(dev);
        if (i)
                goto err_out_unmap_rx;
@@ -599,7 +607,7 @@
                if (phy_idx == 0) {
                        printk(KERN_INFO "%s: No MII transceiver found, 
aborting.  ASIC status %x\n",
                                   dev->name, readl(ioaddr + ASICCtrl));
-                       goto err_out_unmap_rx;
+                       goto err_out_unregister;
                }
 
                np->mii_if.phy_id = np->phys[0];
@@ -673,6 +681,8 @@
        card_idx++;
        return 0;
 
+err_out_unregister:
+       unregister_netdev(dev);
 err_out_unmap_rx:
         pci_free_consistent(pdev, RX_TOTAL_SIZE, np->rx_ring, np->rx_ring_dma);
 err_out_unmap_tx:
@@ -689,6 +699,15 @@
        return -ENODEV;
 }
 
+static int change_mtu(struct net_device *dev, int new_mtu)
+{
+       if ((new_mtu < 68) || (new_mtu > 8191)) /* Set by RxDMAFrameLen */
+               return -EINVAL;
+       if (netif_running(dev))
+               return -EBUSY;
+       dev->mtu = new_mtu;
+       return 0;
+}
 
 /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. */
 static int __devinit eeprom_read(long ioaddr, int location)
@@ -818,6 +837,10 @@
                writeb(dev->dev_addr[i], ioaddr + StationAddr + i);
 
        /* Initialize other registers. */
+       writew(dev->mtu + 14, ioaddr + MaxFrameSize);
+       if (dev->mtu > 2047)
+               writel(readl(ioaddr + ASICCtrl) | 0x0C, ioaddr + ASICCtrl);
+
        /* Configure the PCI bus bursts and FIFO thresholds. */
 
        if (dev->if_port == 0)
@@ -950,7 +973,7 @@
        np->cur_rx = np->cur_tx = 0;
        np->dirty_rx = np->dirty_tx = 0;
 
-       np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
+       np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 36);
 
        /* Initialize all Rx descriptors. */
        for (i = 0; i < RX_RING_SIZE; i++) {
<Prev in Thread] Current Thread [Next in Thread>