fman/mEMAC: set SETSP bit in IF_MODE regisgter for RGMII speed
authorZang Roy-R61911 <tie-fei.zang@freescale.com>
Mon, 4 Mar 2013 03:59:20 +0000 (03:59 +0000)
committerAndy Fleming <afleming@freescale.com>
Thu, 2 May 2013 21:56:44 +0000 (16:56 -0500)
Some legacy RGMII phys don't have in band signaling for the
speed information. so set the RGMII MAC mode according to
the speed got from PHY.

Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
Reported-by: John Traill <john.traill@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
arch/powerpc/include/asm/fsl_memac.h
drivers/net/fm/memac.c

index d6b60e6..69f95d1 100644 (file)
@@ -222,6 +222,10 @@ struct memac {
 
 /* IF_MODE - Interface Mode Register */
 #define IF_MODE_EN_AUTO        0x00008000 /* 1 - Enable automatic speed selection */
+#define IF_MODE_SETSP_100M     0x00000000 /* 00 - 100Mbps RGMII */
+#define IF_MODE_SETSP_10M      0x00002000 /* 01 - 10Mbps RGMII */
+#define IF_MODE_SETSP_1000M    0x00004000 /* 10 - 1000Mbps RGMII */
+#define IF_MODE_SETSP_MASK     0x00006000 /* setsp mask bits */
 #define IF_MODE_XGMII  0x00000000 /* 00- XGMII(10) interface mode */
 #define IF_MODE_GMII           0x00000002 /* 10- GMII interface mode */
 #define IF_MODE_MASK   0x00000003 /* mask for mode interface mode */
index 32c7054..d3eee24 100644 (file)
@@ -112,6 +112,23 @@ static void memac_set_interface_mode(struct fsl_enet_mac *mac,
        /* Enable automatic speed selection */
        if_mode |= IF_MODE_EN_AUTO;
 
+       if (type == PHY_INTERFACE_MODE_RGMII) {
+               if_mode &= ~IF_MODE_EN_AUTO;
+               if_mode &= ~IF_MODE_SETSP_MASK;
+               switch (speed) {
+               case SPEED_1000:
+                       if_mode |= IF_MODE_SETSP_1000M;
+                       break;
+               case SPEED_100:
+                       if_mode |= IF_MODE_SETSP_100M;
+                       break;
+               case SPEED_10:
+                       if_mode |= IF_MODE_SETSP_10M;
+               default:
+                       break;
+               }
+       }
+
        debug(" %s, if_mode = %x\n", __func__,  if_mode);
        debug(" %s, if_status = %x\n", __func__,  if_status);
        out_be32(&regs->if_mode, if_mode);