net/fman: Add support for 10GEC3 and 10GEC4
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Fri, 22 Nov 2013 09:39:09 +0000 (17:39 +0800)
committerYork Sun <yorksun@freescale.com>
Mon, 25 Nov 2013 19:43:47 +0000 (11:43 -0800)
There are more than two 10GEC in single FMAN in some SoCs(e.g. T2080).
This patch adds support for 10GEC3 and 10GEC4.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
arch/powerpc/include/asm/fsl_serdes.h
arch/powerpc/include/asm/immap_85xx.h
drivers/net/fm/eth.c
drivers/net/fm/fm.h
drivers/net/fm/init.c
include/fm_eth.h

index cce892ce90a1e6bf20db1d56776cbb4b38833977..404ded4580ac7b361f27f77b794b8eb4fa3a76be 100644 (file)
@@ -62,6 +62,8 @@ enum srds_prtcl {
        QSGMII_FM1_B,           /* B indicates MACs 5,6,9,10 */
        QSGMII_FM2_A,
        QSGMII_FM2_B,
+       XFI_FM1_MAC1,
+       XFI_FM1_MAC2,
        XFI_FM1_MAC9,
        XFI_FM1_MAC10,
        XFI_FM2_MAC9,
index 9b386ee6b2a6cb4d9ab65ae03feaa04f94c05827..882b0b15eba9d473ca77679203165e5ddbb9fb00 100644 (file)
@@ -1621,6 +1621,8 @@ typedef struct ccsr_gur {
 #define FSL_CORENET_DEVDISR2_DTSEC1_10 0x00400000
 #define FSL_CORENET_DEVDISR2_10GEC1_1  0x00800000
 #define FSL_CORENET_DEVDISR2_10GEC1_2  0x00400000
+#define FSL_CORENET_DEVDISR2_10GEC1_3  0x80000000
+#define FSL_CORENET_DEVDISR2_10GEC1_4  0x40000000
 #define FSL_CORENET_DEVDISR2_DTSEC2_1  0x00080000
 #define FSL_CORENET_DEVDISR2_DTSEC2_2  0x00040000
 #define FSL_CORENET_DEVDISR2_DTSEC2_3  0x00020000
index cb099cd84962fa7ba09da632683c1fd8622466ff..218a5ed17509a6d2d50eb83cbebabd55fe110a53 100644 (file)
@@ -557,8 +557,16 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg)
        num = fm_eth->num;
 
 #ifdef CONFIG_SYS_FMAN_V3
-       if (fm_eth->type == FM_ETH_10G_E)
-               num += 8;
+       if (fm_eth->type == FM_ETH_10G_E) {
+               /* 10GEC1/10GEC2 use mEMAC9/mEMAC10
+                * 10GEC3/10GEC4 use mEMAC1/mEMAC2
+                * so it needs to change the num.
+                */
+               if (fm_eth->num >= 2)
+                       num -= 2;
+               else
+                       num += 8;
+       }
        base = &reg->memac[num].fm_memac;
        phyregs = &reg->memac[num].fm_memac_mdio;
 #else
index 3ec49a4f3b0dd7eccfefd52eec63a87c761efd82..43de114b529c09397238623fc91cfe90be998654 100644 (file)
 #define RX_PORT_1G_BASE                0x08
 #define MAX_NUM_RX_PORT_1G     CONFIG_SYS_NUM_FM1_DTSEC
 #define RX_PORT_10G_BASE       0x10
+#define RX_PORT_10G_BASE2      0x08
 #define TX_PORT_1G_BASE                0x28
 #define MAX_NUM_TX_PORT_1G     CONFIG_SYS_NUM_FM1_DTSEC
 #define TX_PORT_10G_BASE       0x30
+#define TX_PORT_10G_BASE2      0x28
 #define MIIM_TIMEOUT    0xFFFF
 
 struct fm_muram {
index 35edd7ad94017ff7cb0f69064d76d0e8ca560da7..cd787f4eedabf13d091a1fc05577a7cde1b9102b 100644 (file)
@@ -64,6 +64,12 @@ struct fm_eth_info fm_info[] = {
 #if (CONFIG_SYS_NUM_FM1_10GEC >= 2)
        FM_TGEC_INFO_INITIALIZER(1, 2),
 #endif
+#if (CONFIG_SYS_NUM_FM1_10GEC >= 3)
+       FM_TGEC_INFO_INITIALIZER2(1, 3),
+#endif
+#if (CONFIG_SYS_NUM_FM1_10GEC >= 4)
+       FM_TGEC_INFO_INITIALIZER2(1, 4),
+#endif
 #if (CONFIG_SYS_NUM_FM2_10GEC >= 1)
        FM_TGEC_INFO_INITIALIZER(2, 1),
 #endif
@@ -239,10 +245,14 @@ static void ft_fixup_port(void *blob, struct fm_eth_info *info, char *prop)
         * FM1_10GEC1 is enabled and  FM1_DTSEC9 is disabled, ensure that the
         * dual-role MAC is not disabled, ditto for other dual-role MACs.
         */
-       if (((info->port == FM1_DTSEC9) && (PORT_IS_ENABLED(FM1_10GEC1)))       ||
-           ((info->port == FM1_DTSEC10) && (PORT_IS_ENABLED(FM1_10GEC2)))      ||
-           ((info->port == FM1_10GEC1) && (PORT_IS_ENABLED(FM1_DTSEC9)))       ||
-           ((info->port == FM1_10GEC2) && (PORT_IS_ENABLED(FM1_DTSEC10)))
+       if (((info->port == FM1_DTSEC9) && (PORT_IS_ENABLED(FM1_10GEC1)))  ||
+           ((info->port == FM1_DTSEC10) && (PORT_IS_ENABLED(FM1_10GEC2))) ||
+           ((info->port == FM1_DTSEC1) && (PORT_IS_ENABLED(FM1_10GEC3)))  ||
+           ((info->port == FM1_DTSEC2) && (PORT_IS_ENABLED(FM1_10GEC4)))  ||
+           ((info->port == FM1_10GEC1) && (PORT_IS_ENABLED(FM1_DTSEC9)))  ||
+           ((info->port == FM1_10GEC2) && (PORT_IS_ENABLED(FM1_DTSEC10))) ||
+           ((info->port == FM1_10GEC3) && (PORT_IS_ENABLED(FM1_DTSEC1)))  ||
+           ((info->port == FM1_10GEC4) && (PORT_IS_ENABLED(FM1_DTSEC2)))
 #if (CONFIG_SYS_NUM_FMAN == 2)
                                                                                ||
            ((info->port == FM2_DTSEC9) && (PORT_IS_ENABLED(FM2_10GEC1)))       ||
index 5a4fb70dfa4fe824c192a55ef15aec095169fe58..98edfcf4add8f8b4c12d87a17f8ff123b8d8399d 100644 (file)
@@ -22,6 +22,8 @@ enum fm_port {
        FM1_DTSEC10,
        FM1_10GEC1,
        FM1_10GEC2,
+       FM1_10GEC3,
+       FM1_10GEC4,
        FM2_DTSEC1,
        FM2_DTSEC2,
        FM2_DTSEC3,
@@ -85,6 +87,22 @@ enum fm_eth_type {
        .compat_offset  = CONFIG_SYS_FSL_FM##idx##_OFFSET +             \
                                offsetof(struct ccsr_fman, memac[n-1+8]),\
 }
+
+#if (CONFIG_SYS_NUM_FM1_10GEC >= 3)
+#define FM_TGEC_INFO_INITIALIZER2(idx, n) \
+{                                                                      \
+       FM_ETH_INFO_INITIALIZER(idx, CONFIG_SYS_FM1_TGEC_MDIO_ADDR)     \
+       .index          = idx,                                          \
+       .num            = n - 1,                                        \
+       .type           = FM_ETH_10G_E,                                 \
+       .port           = FM##idx##_10GEC##n,                           \
+       .rx_port_id     = RX_PORT_10G_BASE2 + n - 3,                    \
+       .tx_port_id     = TX_PORT_10G_BASE2 + n - 3,                    \
+       .compat_offset  = CONFIG_SYS_FSL_FM##idx##_OFFSET +             \
+                               offsetof(struct ccsr_fman, memac[n-1-2]),\
+}
+#endif
+
 #else
 #define FM_DTSEC_INFO_INITIALIZER(idx, n) \
 {                                                                      \