Author: yongari
Date: Sun Nov 28 01:56:44 2010
New Revision: 215969
URL: http://svn.freebsd.org/changeset/base/215969

Log:
  Add initial AX88772A support.
  
  H/W donated by:       Derrick Brashear (shadow <> gmail dot com)

Modified:
  head/sys/dev/usb/net/if_axe.c
  head/sys/dev/usb/net/if_axereg.h

Modified: head/sys/dev/usb/net/if_axe.c
==============================================================================
--- head/sys/dev/usb/net/if_axe.c       Sun Nov 28 01:43:28 2010        
(r215968)
+++ head/sys/dev/usb/net/if_axe.c       Sun Nov 28 01:56:44 2010        
(r215969)
@@ -142,11 +142,11 @@ static const struct usb_device_id axe_de
        AXE_DEV(ASIX, AX88172, 0),
        AXE_DEV(ASIX, AX88178, AXE_FLAG_178),
        AXE_DEV(ASIX, AX88772, AXE_FLAG_772),
-       AXE_DEV(ASIX, AX88772A, AXE_FLAG_772),
+       AXE_DEV(ASIX, AX88772A, AXE_FLAG_772A),
        AXE_DEV(ATEN, UC210T, 0),
        AXE_DEV(BELKIN, F5D5055, AXE_FLAG_178),
        AXE_DEV(BILLIONTON, USB2AR, 0),
-       AXE_DEV(CISCOLINKSYS, USB200MV2, AXE_FLAG_772),
+       AXE_DEV(CISCOLINKSYS, USB200MV2, AXE_FLAG_772A),
        AXE_DEV(COREGA, FETHER_USB2_TX, 0),
        AXE_DEV(DLINK, DUBE100, 0),
        AXE_DEV(DLINK, DUBE100B1, AXE_FLAG_772),
@@ -191,6 +191,7 @@ static void axe_ifmedia_sts(struct ifnet
 static int     axe_cmd(struct axe_softc *, int, int, int, void *);
 static void    axe_ax88178_init(struct axe_softc *);
 static void    axe_ax88772_init(struct axe_softc *);
+static void    axe_ax88772a_init(struct axe_softc *);
 static int     axe_get_phyno(struct axe_softc *, int);
 
 static const struct usb_config axe_config[AXE_N_TRANSFER] = {
@@ -613,7 +614,6 @@ axe_ax88178_init(struct axe_softc *sc)
 
        axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
 }
-#undef AXE_GPIO_WRITE
 
 static void
 axe_ax88772_init(struct axe_softc *sc)
@@ -657,6 +657,47 @@ axe_ax88772_init(struct axe_softc *sc)
 }
 
 static void
+axe_ax88772a_init(struct axe_softc *sc)
+{
+       struct usb_ether *ue;
+       uint16_t eeprom;
+
+       ue = &sc->sc_ue;
+       axe_cmd(sc, AXE_CMD_SROM_READ, 0, 0x0017, &eeprom);
+       eeprom = le16toh(eeprom);
+       /* Reload EEPROM. */
+       AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
+       if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) {
+               /* Manually select internal(embedded) PHY - MAC mode. */
+               axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB |
+                   AXE_SW_PHY_SELECT_EMBEDDED | AXE_SW_PHY_SELECT_SS_MII,
+                   NULL);
+               uether_pause(&sc->sc_ue, hz / 32);
+       } else {
+               /*
+                * Manually select external PHY - MAC mode.
+                * Reverse MII/RMII is for AX88772A PHY mode.
+                */
+               axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB |
+                   AXE_SW_PHY_SELECT_EXT | AXE_SW_PHY_SELECT_SS_MII, NULL);
+               uether_pause(&sc->sc_ue, hz / 32);
+       }
+       /* Take PHY out of power down. */
+       axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPPD |
+           AXE_SW_RESET_IPRL, NULL);
+       uether_pause(&sc->sc_ue, hz / 4);
+       axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL);
+       uether_pause(&sc->sc_ue, hz);
+       axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_CLEAR, NULL);
+       uether_pause(&sc->sc_ue, hz / 32);
+       axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL);
+       uether_pause(&sc->sc_ue, hz / 32);
+       axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
+}
+
+#undef AXE_GPIO_WRITE
+
+static void
 axe_reset(struct axe_softc *sc)
 {
        struct usb_config_descriptor *cd;
@@ -677,6 +718,8 @@ axe_reset(struct axe_softc *sc)
                axe_ax88178_init(sc);
        else if (sc->sc_flags & AXE_FLAG_772)
                axe_ax88772_init(sc);
+       else if (sc->sc_flags & AXE_FLAG_772A)
+               axe_ax88772a_init(sc);
 }
 
 static void
@@ -706,6 +749,9 @@ axe_attach_post(struct usb_ether *ue)
        } else if (sc->sc_flags & AXE_FLAG_772) {
                axe_ax88772_init(sc);
                sc->sc_tx_bufsz = 8 * 1024;
+       } else if (sc->sc_flags & AXE_FLAG_772A) {
+               axe_ax88772a_init(sc);
+               sc->sc_tx_bufsz = 8 * 1024;
        }
 
        /*
@@ -719,7 +765,13 @@ axe_attach_post(struct usb_ether *ue)
        /*
         * Fetch IPG values.
         */
-       axe_cmd(sc, AXE_CMD_READ_IPG012, 0, 0, sc->sc_ipgs);
+       if (sc->sc_flags & AXE_FLAG_772A) {
+               /* Set IPG values. */
+               sc->sc_ipgs[0] = 0x15;
+               sc->sc_ipgs[1] = 0x16;
+               sc->sc_ipgs[2] = 0x1A;
+       } else
+               axe_cmd(sc, AXE_CMD_READ_IPG012, 0, 0, sc->sc_ipgs);
 }
 
 /*

Modified: head/sys/dev/usb/net/if_axereg.h
==============================================================================
--- head/sys/dev/usb/net/if_axereg.h    Sun Nov 28 01:43:28 2010        
(r215968)
+++ head/sys/dev/usb/net/if_axereg.h    Sun Nov 28 01:56:44 2010        
(r215969)
@@ -92,6 +92,10 @@
 #define        AXE_CMD_SW_PHY_STATUS                   0x0021
 #define        AXE_CMD_SW_PHY_SELECT                   0x0122
 
+/* AX88772A and AX88772B only. */
+#define        AXE_CMD_READ_VLAN_CTRL                  0x4027
+#define        AXE_CMD_WRITE_VLAN_CTRL                 0x4028
+
 #define        AXE_SW_RESET_CLEAR                      0x00
 #define        AXE_SW_RESET_RR                         0x01
 #define        AXE_SW_RESET_RT                         0x02
@@ -172,6 +176,21 @@
 #define        AXE_PHY_MODE_REALTEK_8251CL     0x0E
 #define        AXE_PHY_MODE_ATTANSIC           0x40
 
+/* AX88772A only. */
+#define        AXE_SW_PHY_SELECT_EXT           0x0000
+#define        AXE_SW_PHY_SELECT_EMBEDDED      0x0001
+#define        AXE_SW_PHY_SELECT_AUTO          0x0002
+#define        AXE_SW_PHY_SELECT_SS_MII        0x0004
+#define        AXE_SW_PHY_SELECT_SS_RVRS_MII   0x0008
+#define        AXE_SW_PHY_SELECT_SS_RVRS_RMII  0x000C
+#define        AXE_SW_PHY_SELECT_SS_ENB        0x0010
+
+/* AX88772A/AX88772B VLAN control. */
+#define        AXE_VLAN_CTRL_ENB               0x00001000
+#define        AXE_VLAN_CTRL_STRIP             0x00002000
+#define        AXE_VLAN_CTRL_VID1_MASK         0x00000FFF
+#define        AXE_VLAN_CTRL_VID2_MASK         0x0FFF0000
+
 #define        AXE_BULK_BUF_SIZE       16384   /* bytes */
 
 #define        AXE_CTL_READ            0x01
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to