Fman/mEMAC: mEMAC fix for 10G MAC and PHY
authorShaohui Xie <Shaohui.Xie@freescale.com>
Wed, 13 Aug 2014 10:32:19 +0000 (18:32 +0800)
committerYork Sun <yorksun@freescale.com>
Fri, 14 Nov 2014 19:12:13 +0000 (11:12 -0800)
1. use Payload length check disable when enable MAC;
2. add XGMII support for setting MAC interface mode;
3. only enable auto negotiation for Non-XGMII mode;
4. return 0xffff if clause 22 is used to read 10G phy_id;

Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
Acked-By: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: York Sun <yorksun@freescale.com>
arch/powerpc/include/asm/fsl_memac.h
drivers/net/fm/memac.c
drivers/net/fm/memac_phy.c

index 4640e33a5e38b4a51385b98bade9c6c6e4657cca..f84c1a915b3dea1586301849499c95068c3dad11 100644 (file)
@@ -159,6 +159,7 @@ struct memac {
 #define MEMAC_CMD_CFG_RX_EN            0x00000002 /* MAC Rx path enable */
 #define MEMAC_CMD_CFG_TX_EN            0x00000001 /* MAC Tx path enable */
 #define MEMAC_CMD_CFG_RXTX_EN  (MEMAC_CMD_CFG_RX_EN | MEMAC_CMD_CFG_TX_EN)
+#define MEMAC_CMD_CFG_NO_LEN_CHK 0x20000 /* Payload length check disable */
 
 /* HASHTABLE_CTRL - Hashtable control register */
 #define HASHTABLE_CTRL_MCAST_EN        0x00000200 /* enable mulitcast Rx hash */
index 9499290bba8b453f0172e354f9a8065569163af9..60e898cd7c34f0f4e29c09159be1bc292cf8e27b 100644 (file)
@@ -37,7 +37,8 @@ static void memac_enable_mac(struct fsl_enet_mac *mac)
 {
        struct memac *regs = mac->base;
 
-       setbits_be32(&regs->command_config, MEMAC_CMD_CFG_RXTX_EN);
+       setbits_be32(&regs->command_config,
+                    MEMAC_CMD_CFG_RXTX_EN | MEMAC_CMD_CFG_NO_LEN_CHK);
 }
 
 static void memac_disable_mac(struct fsl_enet_mac *mac)
@@ -93,11 +94,16 @@ static void memac_set_interface_mode(struct fsl_enet_mac *mac,
                if_mode &= ~IF_MODE_MASK;
                if_mode |= (IF_MODE_GMII);
                break;
+       case PHY_INTERFACE_MODE_XGMII:
+               if_mode &= ~IF_MODE_MASK;
+               if_mode |= IF_MODE_XGMII;
+               break;
        default:
                break;
        }
-       /* Enable automatic speed selection */
-       if_mode |= IF_MODE_EN_AUTO;
+       /* Enable automatic speed selection for Non-XGMII */
+       if (type != PHY_INTERFACE_MODE_XGMII)
+               if_mode |= IF_MODE_EN_AUTO;
 
        if (type == PHY_INTERFACE_MODE_RGMII) {
                if_mode &= ~IF_MODE_EN_AUTO;
index 5f910c2cdd3025086aba99a15e14118134d7de69..e432ae77583500a5a97ba7965079af1d6d036d1c 100644 (file)
@@ -71,6 +71,8 @@ int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
        u32 c45 = 1;
 
        if (dev_addr == MDIO_DEVAD_NONE) {
+               if (!strcmp(bus->name, DEFAULT_FM_TGEC_MDIO_NAME))
+                       return 0xffff;
                c45 = 0; /* clause 22 */
                dev_addr = regnum & 0x1f;
                clrbits_be32(&regs->mdio_stat, MDIO_STAT_ENC);