[PATCH][2.5.30] 3c59x MII problems w/ 3c905B

From: Zwane Mwaikambo (zwane@linuxpower.ca)
Date: Sun Aug 04 2002 - 04:02:15 EST


Hi Andrew,
        The sluggishness turned out to be a tranceiver problem. My 3c905B
has the suppress preamble bit set but seems to be lying, although a 3c905 works.

3c905B: phy=0, phyx=24, mii_status=0x786d
3c905: phy=0, phyx=24, mii_status=0x786f

Cheers,
        Zwane

Index: linux-2.5.30/drivers/net/3c59x.c
===================================================================
RCS file: /build/cvsroot/linux-2.5.30/drivers/net/3c59x.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 3c59x.c
--- linux-2.5.30/drivers/net/3c59x.c 2 Aug 2002 17:19:36 -0000 1.1.1.1
+++ linux-2.5.30/drivers/net/3c59x.c 3 Aug 2002 21:16:20 -0000
@@ -321,7 +321,7 @@
 #define VORTEX_TOTAL_SIZE 0x20
 #define BOOMERANG_TOTAL_SIZE 0x40
 
-/* Set iff a MII transceiver on any interface requires mdio preamble.
+/* Set if a MII transceiver on any interface requires mdio preamble.
    This only set with the original DP83840 on older 3c905 boards, so the extra
    code size of a per-interface flag is not worthwhile. */
 static char mii_preamble_required;
@@ -1280,6 +1280,15 @@
                 dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
                 int phy, phy_idx = 0;
                 EL3WINDOW(4);
+
+ /* The following cards blatantly lie about the suppress preamble bit */
+ switch (pdev->device) {
+ case PCI_DEVICE_ID_3COM_3C905B_TX:
+ mii_preamble_required++;
+ default:
+ break;
+ }
+
                 mii_preamble_required++;
                 mdio_sync(ioaddr, 32);
                 mdio_read(dev, 24, 1);
@@ -1297,8 +1306,8 @@
                         else
                                 phyx = phy;
                         mii_status = mdio_read(dev, phyx, 1);
- printk("phy=%d, phyx=%d, mii_status=0x%04x\n",
- phy, phyx, mii_status);
+ printk("phy=%d, phyx=%d, mii_status=0x%04x\n",
+ phy, phyx, mii_status);
                         if (mii_status && mii_status != 0xffff) {
                                 vp->phys[phy_idx++] = phyx;
                                 if (print_info) {
@@ -1421,7 +1430,7 @@
                 pci_set_power_state(vp->pdev, 0); /* Go active */
                 pci_restore_state(vp->pdev, vp->power_state);
         }
-
+
         /* Before initializing select the active media port. */
         EL3WINDOW(3);
         config = inl(ioaddr + Wn3_Config);

-- 
function.linuxpower.ca

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Aug 07 2002 - 22:00:24 EST