u-boot ethernet changes for prowl
by danielmentz@
configure the QCA8337N Ethernet switch to "Mode 5" as described in the
datasheet where RMGII 0 is connected to MAC0 of the Ethernet switch and
RGMII 1 is routed straight to PHY 4 (WAN port).
Change-Id: Ida68072f2d6443b6bd5b556c45c28a980592f320
diff --git a/board/ruby/ar8237.c b/board/ruby/ar8237.c
index 08e39aa..5ab1e41 100755
--- a/board/ruby/ar8237.c
+++ b/board/ruby/ar8237.c
@@ -120,14 +120,30 @@
#define AR8237_MASK_CTL_RESET (0x80000000)
#define AR8237_MASK_CLEAR_DEF (0)
#define AR8237_MODE_CTRL (0x04)
-#define AR8237_MODE_RGMII_PHY (0x07600000)
+
+#define S17_MAC0_RGMII_RXCLK_SHIFT 20
+#define S17_MAC0_RGMII_TXCLK_SHIFT 22
+#define S17_MAC0_RGMII_TXCLK_DELAY_EN (1 << 25)
+#define S17_MAC0_RGMII_EN (1 << 26)
+
+#define AR8237_MODE_RGMII_PHY (S17_MAC0_RGMII_EN)
+
+//#define AR8237_MODE_RGMII_PHY (0x07600000)
//#define AR8237_MODE_RGMII_PHY (0x07402000)
#define AR8237_PWS_CTRL (0x10)
#define AR8237_PWS_CTRL_DEF (0x40000000)
#define AR8237_FWCTL_CTRL (0x0624)
#define AR8237_FWCTL_CTRL_DEF (0x007f7f7f)
+
+#define S17_P0STATUS_REG 0x007c
+#define S17_P5STATUS_REG 0x0090
+#define S17_P6STATUS_REG 0x0094
+
#define AR8237_PORT6_CTRL (0xc)
-#define AR8237_PORT6_CTRL_DEF (0x01000000)
+#define S17_PHY4_RGMII_EN (1 << 17)
+#define S17_MAC6_RGMII_EN (1 << 26)
+#define AR8237_PORT6_CTRL_DEF (S17_PHY4_RGMII_EN)
+
#define AR8237_PORT0_CTRL (0x7c)
#define AR8237_PORT0_CTRL_DEF (0x7e)
@@ -143,6 +159,27 @@
#define AR8237_MIN_PHY_NUM (0)
#define AR8237_MAX_PHY_NUM (4)
+
+#define S17_P5PAD_MODE_REG 0x0008
+#define S17_MAC_RGMII_RXCLK_DELAY_EN (1 << 24)
+
+#define S17_SPEED_10M (0 << 0)
+#define S17_SPEED_100M (1 << 0)
+#define S17_SPEED_1000M (2 << 0)
+#define S17_TXMAC_EN (1 << 2)
+#define S17_RXMAC_EN (1 << 3)
+#define S17_TX_FLOW_EN (1 << 4)
+#define S17_RX_FLOW_EN (1 << 5)
+#define S17_DUPLEX_FULL (1 << 6)
+#define S17_DUPLEX_HALF (0 << 6)
+#define S17_TX_HALF_FLOW_EN (1 << 7)
+#define S17_LINK_EN (1 << 9)
+#define S17_FLOW_LINK_EN (1 << 12)
+#define S17_PORT_STATUS_DEFAULT (S17_SPEED_1000M | S17_TXMAC_EN | \
+ S17_RXMAC_EN | \
+ S17_DUPLEX_FULL )
+
+
////////////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////////////
@@ -190,6 +227,42 @@
return 0;
}
+int ar8237_normal_mdio_write(u16 phyAddr, u8 regAddr, u16 data)
+{
+ // check for clear MDIO status
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_DATA, data & 0xffff);
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_CTRL,
+ ((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
+ (regAddr << 5) | (phyAddr & 0x1f) |
+ AR8237_MDIO_START);
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+ // return without waiting for final completion
+ return 0;
+}
+int ar8237_normal_mdio_read(u16 phyAddr, u8 regAddr, u16 *data)
+{
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_CTRL, ( (regAddr & 0x1f) << 5) | AR8237_MDIO_START |
+ ((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
+ AR8237_MDIO_READ | (phyAddr & 0x1f));
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ *data = ar8237_emac_rdreg(EMAC_MAC_MDIO_DATA);
+ return 0;
+}
+int __ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data);
+
/*********************************************************************
Name: ar8237_mdio_write
Purpose: mdio write routine for AR8237 device
@@ -204,6 +277,9 @@
u32 rg = (regAddr & 0x3c) >> 1;
u32 ph = (regAddr & 0x1c0) >> 6;
+ u32 prev;
+ __ar8237_mdio_read(phyAddr, regAddr, &prev);
+
// check for clear MDIO status
if (ar8237_mdio_poll() != 0) {
return -1;
@@ -237,6 +313,8 @@
return -1;
}
+ // printf("%s reg 0x%04x data 0x%08x previously %08x\n", __func__, regAddr, data, prev);
+
// return without waiting for final completion
return 0;
}
@@ -248,7 +326,7 @@
more than one cycle to complete the write.
checks for completion first
*********************************************************************/
-int ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data)
+int __ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data)
{
u32 highAddr = regAddr >> 9;
// need to swizzle the bits into arasan's fields which are different
@@ -288,6 +366,16 @@
*data = *data | (ar8237_emac_rdreg(EMAC_MAC_MDIO_DATA) << 16);
return 0;
}
+int ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data) {
+ int rc;
+ rc = __ar8237_mdio_read(phyAddr, regAddr, data);
+ if (!rc) {
+ // printf("%s reg 0x%04x data 0x%08x\n", __func__, regAddr, *data);
+ } else {
+ printf("%s failed reg 0x%04x data 0x%08x\n", __func__, regAddr, *data);
+ }
+ return rc;
+}
/*********************************************************************
Name: ar8237_init
@@ -299,6 +387,7 @@
{
u32 addr;
u32 devID;
+ u16 val;
g8237Dev.base = baseAddr;
// need to scan?
@@ -315,29 +404,37 @@
while (addr < AR8237_MAX_PHY_NUM) {
uint32_t reset = AR8237_MASK_CTL_RESET;
ar8237_mdio_read(addr, AR8237_MASK_CTL, &devID);
- if ((devID & 0xff00) == 0x1200) {
- printf("Detected AR8237 Switch %d - set for RGMII, 1000FD\n",addr);
+ if ((devID & 0xff00) == 0x1300) {
+ printf("Detected AR8337 Switch %d - set for RGMII, 1000FD devID 0x%x\n",addr, devID);
// do a softreset
- ar8237_mdio_write(phy_addr, AR8237_MODE_CTRL, AR8237_MODE_RGMII_PHY);
-
// do a clean reset and wait for completion
ar8237_mdio_write(phy_addr, AR8237_MASK_CTL, AR8237_MASK_CTL_RESET);
while (reset & AR8237_MASK_CTL_RESET) {
ar8237_mdio_read(addr, AR8237_MASK_CTL, &reset);
}
+ ar8237_mdio_write(phy_addr, AR8237_MODE_CTRL, AR8237_MODE_RGMII_PHY);
+
ar8237_mdio_write(phy_addr, AR8237_MASK_CTL, AR8237_MASK_CLEAR_DEF);
-
- ar8237_mdio_write(phy_addr, AR8237_PWS_CTRL, AR8237_PWS_CTRL_DEF);
ar8237_mdio_write(phy_addr, AR8237_FWCTL_CTRL, AR8237_FWCTL_CTRL_DEF);
ar8237_mdio_write(phy_addr, AR8237_PORT6_CTRL, AR8237_PORT6_CTRL_DEF);
- ar8237_mdio_write(phy_addr, AR8237_PORT0_CTRL, AR8237_PORT0_CTRL_DEF);
- g8237Dev.phy = addr;
+
+ /* Disable MAC5 and MAC6 (due to PHY4), QCA */
+ ar8237_mdio_write(phy_addr, S17_P5STATUS_REG, 0);
+ ar8237_mdio_write(phy_addr, S17_P6STATUS_REG, 0);
- //set the register 0xe00000b4 for RGMII Dll control register
- *(volatile u32 *)(0xe00000b4) = 0x86868f8f;
+ ar8237_mdio_write(phy_addr, S17_P0STATUS_REG, S17_PORT_STATUS_DEFAULT);
+
+ ar8237_normal_mdio_write(4, 29, 0x12);
+ ar8237_normal_mdio_read(4, 30, &val);
+ val |= (1<<3);
+ ar8237_normal_mdio_write(4, 30, val);
+ ar8237_normal_mdio_write(4, 29, 0);
+
+
+ g8237Dev.phy = addr;
return addr;
}
diff --git a/board/ruby/arasan-emac-ahb.c b/board/ruby/arasan-emac-ahb.c
index d70bf7e..2f62807 100644
--- a/board/ruby/arasan-emac-ahb.c
+++ b/board/ruby/arasan-emac-ahb.c
@@ -887,6 +887,11 @@
const char *dbg_bus = getenv("debug_bus");
int i;
+ printf("Resetting QCA8337\n");
+ gpio_config(7, GPIO_MODE_OUTPUT);
+ gpio_output(7, 1);
+ udelay(10);
+
if (!((emac0_cfg & EMAC_IN_USE) || (emac1_cfg & EMAC_IN_USE))) {
printf("error: no emac enabled\n");
return -1;
@@ -949,7 +954,7 @@
if (strcmp(argv[1],"read") == 0) {
uint32_t a1,a2,val;
a1 = simple_strtoul (argv[2], NULL, 10);
- a2 = simple_strtoul (argv[3], NULL, 16);
+ a2 = simple_strtoul (argv[3], NULL, 10);
mdio_postrd_raw(base, a1, a2);
val = mdio_rdval_raw(base, 1);
printf("phy:%d reg:%d=0x%x\n",a1,a2,val);
diff --git a/include/configs/ruby.h b/include/configs/ruby.h
index 882682c..4d0c629 100644
--- a/include/configs/ruby.h
+++ b/include/configs/ruby.h
@@ -168,7 +168,7 @@
#define CONFIG_NET_MULTI 1
#define CONFIG_ARASAN_GBE 1
#define CONFIG_IPADDR 192.168.1.100
- #define CONFIG_SERVERIP 192.168.1.150
+ #define CONFIG_SERVERIP 192.168.1.2
#define CONFIG_ETHADDR 30:46:9a:25:be:e4
#define CONFIG_BOOTFILE "topaz-linux.lzma.img"
#ifndef PLATFORM_NOSPI