Author: loos
Date: Tue Jul 23 14:02:38 2013
New Revision: 253570
URL: http://svnweb.freebsd.org/changeset/base/253570

Log:
  Fix the arswitch instability problem.  It turns out that the
  arswitch_writereg() routine was writing the registers in the wrong order.
  
  Revert -r241918 as the root problem is now fixed. Remove another workaround
  from arswitch_ar7240.c.
  
  Simplify and fix the code on arswitch_writephy() by using
  arswitch_writereg().
  
  While here remove a redundant declaration from arswitchvar.h.
  
  Approved by:  adrian (mentor)

Modified:
  head/sys/dev/etherswitch/arswitch/arswitch_7240.c
  head/sys/dev/etherswitch/arswitch/arswitch_phy.c
  head/sys/dev/etherswitch/arswitch/arswitch_reg.c
  head/sys/dev/etherswitch/arswitch/arswitchvar.h

Modified: head/sys/dev/etherswitch/arswitch/arswitch_7240.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_7240.c   Tue Jul 23 13:56:38 
2013        (r253569)
+++ head/sys/dev/etherswitch/arswitch/arswitch_7240.c   Tue Jul 23 14:02:38 
2013        (r253570)
@@ -75,12 +75,6 @@ ar7240_hw_setup(struct arswitch_softc *s
        arswitch_writereg(sc->sc_dev, AR8X16_REG_CPU_PORT,
            AR8X16_CPU_PORT_EN | AR8X16_CPU_MIRROR_DIS);
 
-       /*
-        * Let things settle; probing PHY4 doesn't seem reliable
-        * without a litle delay.
-        */
-       DELAY(1000);
-
        return (0);
 }
 

Modified: head/sys/dev/etherswitch/arswitch/arswitch_phy.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_phy.c    Tue Jul 23 13:56:38 
2013        (r253569)
+++ head/sys/dev/etherswitch/arswitch/arswitch_phy.c    Tue Jul 23 14:02:38 
2013        (r253570)
@@ -127,16 +127,13 @@ arswitch_writephy(device_t dev, int phy,
                return (ENXIO);
 
        ARSWITCH_LOCK(sc);
-       err = arswitch_writereg_lsb(dev, AR8X16_REG_MDIO_CTRL,
-           (data & AR8X16_MDIO_CTRL_DATA_MASK));
-       if (err != 0)
-               goto out;
-       err = arswitch_writereg_msb(dev, AR8X16_REG_MDIO_CTRL,
+       err = arswitch_writereg(dev, AR8X16_REG_MDIO_CTRL,
            AR8X16_MDIO_CTRL_BUSY |
            AR8X16_MDIO_CTRL_MASTER_EN |
            AR8X16_MDIO_CTRL_CMD_WRITE |
            (phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) |
-           (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT));
+           (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT) |
+           (data & AR8X16_MDIO_CTRL_DATA_MASK));
        if (err != 0)
                goto out;
        for (timeout = 100; timeout--; ) {

Modified: head/sys/dev/etherswitch/arswitch/arswitch_reg.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_reg.c    Tue Jul 23 13:56:38 
2013        (r253569)
+++ head/sys/dev/etherswitch/arswitch/arswitch_reg.c    Tue Jul 23 14:02:38 
2013        (r253570)
@@ -72,17 +72,10 @@ arswitch_split_setpage(device_t dev, uin
        *phy = (((addr) >> 6) & 0x07) | 0x10;
        *reg = ((addr) >> 1) & 0x1f;
 
-       /*
-        * The earlier code would only switch the page
-        * over if the page were different.  Experiments have
-        * shown that this is unstable.
-        *
-        * Hence, the page is always set here.
-        *
-        * See PR kern/172968
-        */
-       MDIO_WRITEREG(device_get_parent(dev), 0x18, 0, page);
-       sc->page = page;
+       if (sc->page != page) {
+               MDIO_WRITEREG(device_get_parent(dev), 0x18, 0, page);
+               sc->page = page;
+       }
 }
 
 /*
@@ -171,8 +164,8 @@ arswitch_writereg(device_t dev, int addr
 {
 
        /* XXX Check the first write too? */
-       arswitch_writereg_lsb(dev, addr, value);
-       return (arswitch_writereg_msb(dev, addr, value));
+       arswitch_writereg_msb(dev, addr, value);
+       return (arswitch_writereg_lsb(dev, addr, value));
 }
 
 int

Modified: head/sys/dev/etherswitch/arswitch/arswitchvar.h
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitchvar.h     Tue Jul 23 13:56:38 
2013        (r253569)
+++ head/sys/dev/etherswitch/arswitch/arswitchvar.h     Tue Jul 23 14:02:38 
2013        (r253570)
@@ -42,8 +42,6 @@ typedef enum {
 #define        AR8X16_IS_SWITCH(_sc, _type) \
            (!!((_sc)->sc_switchtype == AR8X16_SWITCH_ ## _type))
 
-struct arswitch_softc;
-
 struct arswitch_softc {
        struct mtx      sc_mtx;         /* serialize access to softc */
        device_t        sc_dev;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to