svn commit: r190900 - head/sys/dev/ed

Warner Losh imp at FreeBSD.org
Fri Apr 10 16:12:02 UTC 2009


Author: imp
Date: Fri Apr 10 16:12:00 2009
New Revision: 190900
URL: http://svn.freebsd.org/changeset/base/190900

Log:
  Improvements for TC5299J MII support.

Modified:
  head/sys/dev/ed/if_ed_pccard.c

Modified: head/sys/dev/ed/if_ed_pccard.c
==============================================================================
--- head/sys/dev/ed/if_ed_pccard.c	Fri Apr 10 15:33:47 2009	(r190899)
+++ head/sys/dev/ed/if_ed_pccard.c	Fri Apr 10 16:12:00 2009	(r190900)
@@ -258,7 +258,6 @@ static int	ed_ifmedia_upd(struct ifnet *
 static void	ed_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 
 static int	ed_pccard_tc5299j(device_t dev, const struct ed_product *);
-static void	ed_pccard_tc5299j_mii_reset(struct ed_softc *sc);
 static u_int	ed_pccard_tc5299j_mii_readbits(struct ed_softc *sc, int nbits);
 static void	ed_pccard_tc5299j_mii_writebits(struct ed_softc *sc, u_int val,
     int nbits);
@@ -574,7 +573,6 @@ ed_pccard_attach(device_t dev)
 		}
 		    
 	} else if (sc->chip_type == ED_CHIP_TYPE_TC5299J) {
-		ed_pccard_tc5299j_mii_reset(sc);
 		if ((error = mii_phy_probe(dev, &sc->miibus, ed_ifmedia_upd,
 		     ed_ifmedia_sts)) != 0) {
 			device_printf(dev, "Missing mii!\n");
@@ -1009,36 +1007,24 @@ ed_pccard_tc5299j(device_t dev, const st
 	return (0);
 }
 
-/* MII bit-twiddling routines for cards using TC5299J chipset */
-#define TC5299J_MIISET(sc, x) ed_nic_outb(sc, ED_TC5299J_MIIBUS, \
-    ed_nic_inb(sc, ED_TC5299J_MIIBUS) | (x))
-#define TC5299J_MIICLR(sc, x) ed_nic_outb(sc, ED_TC5299J_MIIBUS, \
-    ed_nic_inb(sc, ED_TC5299J_MIIBUS) & ~(x))
-
-static void
-ed_pccard_tc5299j_mii_reset(struct ed_softc *sc)
-{
-	/* Do nothing! */
-}
-
 static void
 ed_pccard_tc5299j_mii_writebits(struct ed_softc *sc, u_int val, int nbits)
 {
 	int i;
-	uint8_t cr;
+	uint8_t cr, data;
 
+	/* Select page 3 */
 	cr = ed_nic_inb(sc, ED_P0_CR);
 	ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
 
-	TC5299J_MIICLR(sc, ED_TC5299J_MII_DIROUT);
 	for (i = nbits - 1; i >= 0; i--) {
-		if ((val >> i) & 1)
-			TC5299J_MIISET(sc, ED_TC5299J_MII_DATAOUT);
-		else
-			TC5299J_MIICLR(sc, ED_TC5299J_MII_DATAOUT);
-		TC5299J_MIISET(sc, ED_TC5299J_MII_CLK);
-		TC5299J_MIICLR(sc, ED_TC5299J_MII_CLK);
+		data = (val >> i) & 1 ? ED_TC5299J_MII_DATAOUT : 0;
+		ed_nic_outb(sc, ED_TC5299J_MIIBUS, data);
+		ed_nic_outb(sc, ED_TC5299J_MIIBUS, data | ED_TC5299J_MII_CLK);
 	}
+	ed_nic_outb(sc, ED_TC5299J_MIIBUS, 0);
+		
+	/* Restore prior page */
 	ed_nic_outb(sc, ED_P0_CR, cr);
 }
 
@@ -1049,17 +1035,21 @@ ed_pccard_tc5299j_mii_readbits(struct ed
 	u_int val = 0;
 	uint8_t cr;
 
+	/* Select page 3 */
 	cr = ed_nic_inb(sc, ED_P0_CR);
 	ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
 
-	TC5299J_MIISET(sc, ED_TC5299J_MII_DIROUT);
+	ed_asic_outb(sc, ED_TC5299J_MIIBUS, ED_TC5299J_MII_DIROUT);
 	for (i = nbits - 1; i >= 0; i--) {
-		TC5299J_MIISET(sc, ED_TC5299J_MII_CLK);
+		ed_nic_outb(sc, ED_TC5299J_MIIBUS,
+		    ED_TC5299J_MII_CLK | ED_TC5299J_MII_DIROUT);
 		val <<= 1;
 		if (ed_nic_inb(sc, ED_TC5299J_MIIBUS) & ED_TC5299J_MII_DATAIN)
 			val++;
-		TC5299J_MIICLR(sc, ED_TC5299J_MII_CLK);
+		ed_nic_outb(sc, ED_TC5299J_MIIBUS, ED_TC5299J_MII_DIROUT);
 	}
+
+	/* Restore prior page */
 	ed_nic_outb(sc, ED_P0_CR, cr);
 	return val;
 }


More information about the svn-src-head mailing list