svn commit: r238293 - in head/sys/mips/nlm: dev/net hal

Jayachandran C. jchandra at FreeBSD.org
Mon Jul 9 10:39:57 UTC 2012


Author: jchandra
Date: Mon Jul  9 10:39:57 2012
New Revision: 238293
URL: http://svn.freebsd.org/changeset/base/238293

Log:
  Support Netlogic XLP 8xx B1 revisions in xlpge.
  
  Updates to the MDIO access code for the new revision of the
  XLP chip.

Modified:
  head/sys/mips/nlm/dev/net/mdio.c
  head/sys/mips/nlm/hal/mdio.h

Modified: head/sys/mips/nlm/dev/net/mdio.c
==============================================================================
--- head/sys/mips/nlm/dev/net/mdio.c	Mon Jul  9 10:36:43 2012	(r238292)
+++ head/sys/mips/nlm/dev/net/mdio.c	Mon Jul  9 10:39:57 2012	(r238293)
@@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$");
 #include <mips/nlm/hal/nae.h>
 #include <mips/nlm/hal/mdio.h>
 
+#include <mips/nlm/xlp.h>
+
 /* Internal MDIO READ/WRITE Routines */
 int
 nlm_int_gmac_mdio_read(uint64_t nae_base, int bus, int block,
@@ -176,12 +178,7 @@ nlm_gmac_mdio_read(uint64_t nae_base, in
     int intf_type, int phyaddr, int regidx)
 {
 	uint32_t mdio_ld_cmd;
-	uint32_t val;
-
-	val = EXT_G_MDIO_CMD_SP |
-	    (phyaddr << EXT_G_MDIO_PHYADDR_POS) |
-	    (regidx << EXT_G_MDIO_REGADDR_POS) |
-	    EXT_G_MDIO_DIV;
+	uint32_t ctrlval;
 
 	mdio_ld_cmd = nlm_read_nae_reg(nae_base, NAE_REG(block, intf_type,
 	    (EXT_G0_MDIO_CTRL + bus * 4)));
@@ -195,14 +192,22 @@ nlm_gmac_mdio_read(uint64_t nae_base, in
 		    EXT_G_MDIO_STAT_MBSY);
 	}
 
-	nlm_write_nae_reg(nae_base,
+	ctrlval = EXT_G_MDIO_CMD_SP |
+	    (phyaddr << EXT_G_MDIO_PHYADDR_POS) |
+	    (regidx << EXT_G_MDIO_REGADDR_POS);
+	if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax())
+	    	ctrlval |= EXT_G_MDIO_DIV;
+	else
+		ctrlval |= EXT_G_MDIO_DIV_WITH_HW_DIV64;
+
+	nlm_write_nae_reg(nae_base, 
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
-	    val);
+	    ctrlval);
 
 	nlm_write_nae_reg(nae_base,
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
-	    val | (1<<18));
-
+	    ctrlval | (1<<18));
+	DELAY(1000);
 	/* poll master busy bit until it is not busy */
 	while(nlm_read_nae_reg(nae_base,
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_RD_STAT + bus * 4))) &
@@ -210,7 +215,7 @@ nlm_gmac_mdio_read(uint64_t nae_base, in
 
 	nlm_write_nae_reg(nae_base,
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
-	    val);
+	    ctrlval);
 
 	/* Read the data back */
 	return nlm_read_nae_reg(nae_base,
@@ -236,11 +241,6 @@ nlm_gmac_mdio_write(uint64_t nae_base, i
 	uint32_t mdio_ld_cmd;
 	uint32_t ctrlval;
 
-	ctrlval = EXT_G_MDIO_CMD_SP		|
-	    (phyaddr << EXT_G_MDIO_PHYADDR_POS)	|
-	    (regidx << EXT_G_MDIO_REGADDR_POS)	|
-	    EXT_G_MDIO_DIV;
-
 	mdio_ld_cmd = nlm_read_nae_reg(nae_base, NAE_REG(block, intf_type,
 	    (EXT_G0_MDIO_CTRL + bus * 4)));
 	if (mdio_ld_cmd & EXT_G_MDIO_CMD_LCD) {
@@ -258,6 +258,14 @@ nlm_gmac_mdio_write(uint64_t nae_base, i
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL_DATA+bus*4)), 
 	    val);
 
+	ctrlval = EXT_G_MDIO_CMD_SP		|
+	    (phyaddr << EXT_G_MDIO_PHYADDR_POS)	|
+	    (regidx << EXT_G_MDIO_REGADDR_POS);
+	if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax())
+	    	ctrlval |= EXT_G_MDIO_DIV;
+	else
+		ctrlval |= EXT_G_MDIO_DIV_WITH_HW_DIV64;
+
 	nlm_write_nae_reg(nae_base,
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
 	    ctrlval);
@@ -265,6 +273,7 @@ nlm_gmac_mdio_write(uint64_t nae_base, i
 	nlm_write_nae_reg(nae_base,
 	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
 	    ctrlval | EXT_G_MDIO_CMD_LCD);
+	DELAY(1000);
 
 	/* poll master busy bit until it is not busy */
 	while(nlm_read_nae_reg(nae_base,
@@ -291,11 +300,17 @@ int
 nlm_gmac_mdio_reset(uint64_t nae_base, int bus, int block,
     int intf_type)
 {
+	uint32_t ctrlval;
+
+	if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax())
+	    	ctrlval = EXT_G_MDIO_DIV;
+	else
+		ctrlval = EXT_G_MDIO_DIV_WITH_HW_DIV64;
+
 	nlm_write_nae_reg(nae_base,
-	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
-	    EXT_G_MDIO_MMRST | EXT_G_MDIO_DIV);
+	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4)), 
+	    EXT_G_MDIO_MMRST | ctrlval);
 	nlm_write_nae_reg(nae_base,
-	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), 
-	    EXT_G_MDIO_DIV);
+	    NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4)), ctrlval);
 	return (0);
 }

Modified: head/sys/mips/nlm/hal/mdio.h
==============================================================================
--- head/sys/mips/nlm/hal/mdio.h	Mon Jul  9 10:36:43 2012	(r238292)
+++ head/sys/mips/nlm/hal/mdio.h	Mon Jul  9 10:39:57 2012	(r238293)
@@ -81,6 +81,7 @@
 #define	EXT_G_MDIO_CMD_SC			0x00080000
 #define	EXT_G_MDIO_MMRST			0x00100000
 #define	EXT_G_MDIO_DIV				0x0000001E
+#define	EXT_G_MDIO_DIV_WITH_HW_DIV64		0x00000010
 
 #define	EXT_G_MDIO_RD_STAT_MASK			0x0000FFFF
 #define	EXT_G_MDIO_STAT_LFV			0x00010000


More information about the svn-src-all mailing list