diff options
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 66d47e448e4d..bf4cf3fbb5f2 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -2118,6 +2118,82 @@ static void fec_enet_get_drvinfo(struct net_device *ndev, | |||
2118 | strlcpy(info->bus_info, dev_name(&ndev->dev), sizeof(info->bus_info)); | 2118 | strlcpy(info->bus_info, dev_name(&ndev->dev), sizeof(info->bus_info)); |
2119 | } | 2119 | } |
2120 | 2120 | ||
2121 | static int fec_enet_get_regs_len(struct net_device *ndev) | ||
2122 | { | ||
2123 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
2124 | struct resource *r; | ||
2125 | int s = 0; | ||
2126 | |||
2127 | r = platform_get_resource(fep->pdev, IORESOURCE_MEM, 0); | ||
2128 | if (r) | ||
2129 | s = resource_size(r); | ||
2130 | |||
2131 | return s; | ||
2132 | } | ||
2133 | |||
2134 | /* List of registers that can be safety be read to dump them with ethtool */ | ||
2135 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ | ||
2136 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ | ||
2137 | defined(CONFIG_ARCH_MXC) || defined(CONFIG_SOC_IMX28) | ||
2138 | static u32 fec_enet_register_offset[] = { | ||
2139 | FEC_IEVENT, FEC_IMASK, FEC_R_DES_ACTIVE_0, FEC_X_DES_ACTIVE_0, | ||
2140 | FEC_ECNTRL, FEC_MII_DATA, FEC_MII_SPEED, FEC_MIB_CTRLSTAT, FEC_R_CNTRL, | ||
2141 | FEC_X_CNTRL, FEC_ADDR_LOW, FEC_ADDR_HIGH, FEC_OPD, FEC_TXIC0, FEC_TXIC1, | ||
2142 | FEC_TXIC2, FEC_RXIC0, FEC_RXIC1, FEC_RXIC2, FEC_HASH_TABLE_HIGH, | ||
2143 | FEC_HASH_TABLE_LOW, FEC_GRP_HASH_TABLE_HIGH, FEC_GRP_HASH_TABLE_LOW, | ||
2144 | FEC_X_WMRK, FEC_R_BOUND, FEC_R_FSTART, FEC_R_DES_START_1, | ||
2145 | FEC_X_DES_START_1, FEC_R_BUFF_SIZE_1, FEC_R_DES_START_2, | ||
2146 | FEC_X_DES_START_2, FEC_R_BUFF_SIZE_2, FEC_R_DES_START_0, | ||
2147 | FEC_X_DES_START_0, FEC_R_BUFF_SIZE_0, FEC_R_FIFO_RSFL, FEC_R_FIFO_RSEM, | ||
2148 | FEC_R_FIFO_RAEM, FEC_R_FIFO_RAFL, FEC_RACC, FEC_RCMR_1, FEC_RCMR_2, | ||
2149 | FEC_DMA_CFG_1, FEC_DMA_CFG_2, FEC_R_DES_ACTIVE_1, FEC_X_DES_ACTIVE_1, | ||
2150 | FEC_R_DES_ACTIVE_2, FEC_X_DES_ACTIVE_2, FEC_QOS_SCHEME, | ||
2151 | RMON_T_DROP, RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT, | ||
2152 | RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG, | ||
2153 | RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255, | ||
2154 | RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2047, | ||
2155 | RMON_T_P_GTE2048, RMON_T_OCTETS, | ||
2156 | IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL, IEEE_T_DEF, | ||
2157 | IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR, IEEE_T_SQE, | ||
2158 | IEEE_T_FDXFC, IEEE_T_OCTETS_OK, | ||
2159 | RMON_R_PACKETS, RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN, | ||
2160 | RMON_R_UNDERSIZE, RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB, | ||
2161 | RMON_R_RESVD_O, RMON_R_P64, RMON_R_P65TO127, RMON_R_P128TO255, | ||
2162 | RMON_R_P256TO511, RMON_R_P512TO1023, RMON_R_P1024TO2047, | ||
2163 | RMON_R_P_GTE2048, RMON_R_OCTETS, | ||
2164 | IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR, | ||
2165 | IEEE_R_FDXFC, IEEE_R_OCTETS_OK | ||
2166 | }; | ||
2167 | #else | ||
2168 | static u32 fec_enet_register_offset[] = { | ||
2169 | FEC_ECNTRL, FEC_IEVENT, FEC_IMASK, FEC_IVEC, FEC_R_DES_ACTIVE_0, | ||
2170 | FEC_R_DES_ACTIVE_1, FEC_R_DES_ACTIVE_2, FEC_X_DES_ACTIVE_0, | ||
2171 | FEC_X_DES_ACTIVE_1, FEC_X_DES_ACTIVE_2, FEC_MII_DATA, FEC_MII_SPEED, | ||
2172 | FEC_R_BOUND, FEC_R_FSTART, FEC_X_WMRK, FEC_X_FSTART, FEC_R_CNTRL, | ||
2173 | FEC_MAX_FRM_LEN, FEC_X_CNTRL, FEC_ADDR_LOW, FEC_ADDR_HIGH, | ||
2174 | FEC_GRP_HASH_TABLE_HIGH, FEC_GRP_HASH_TABLE_LOW, FEC_R_DES_START_0, | ||
2175 | FEC_R_DES_START_1, FEC_R_DES_START_2, FEC_X_DES_START_0, | ||
2176 | FEC_X_DES_START_1, FEC_X_DES_START_2, FEC_R_BUFF_SIZE_0, | ||
2177 | FEC_R_BUFF_SIZE_1, FEC_R_BUFF_SIZE_2 | ||
2178 | }; | ||
2179 | #endif | ||
2180 | |||
2181 | static void fec_enet_get_regs(struct net_device *ndev, | ||
2182 | struct ethtool_regs *regs, void *regbuf) | ||
2183 | { | ||
2184 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
2185 | u32 __iomem *theregs = (u32 __iomem *)fep->hwp; | ||
2186 | u32 *buf = (u32 *)regbuf; | ||
2187 | u32 i, off; | ||
2188 | |||
2189 | memset(buf, 0, regs->len); | ||
2190 | |||
2191 | for (i = 0; i < ARRAY_SIZE(fec_enet_register_offset); i++) { | ||
2192 | off = fec_enet_register_offset[i] / 4; | ||
2193 | buf[off] = readl(&theregs[off]); | ||
2194 | } | ||
2195 | } | ||
2196 | |||
2121 | static int fec_enet_get_ts_info(struct net_device *ndev, | 2197 | static int fec_enet_get_ts_info(struct net_device *ndev, |
2122 | struct ethtool_ts_info *info) | 2198 | struct ethtool_ts_info *info) |
2123 | { | 2199 | { |
@@ -2515,6 +2591,8 @@ static const struct ethtool_ops fec_enet_ethtool_ops = { | |||
2515 | .get_settings = fec_enet_get_settings, | 2591 | .get_settings = fec_enet_get_settings, |
2516 | .set_settings = fec_enet_set_settings, | 2592 | .set_settings = fec_enet_set_settings, |
2517 | .get_drvinfo = fec_enet_get_drvinfo, | 2593 | .get_drvinfo = fec_enet_get_drvinfo, |
2594 | .get_regs_len = fec_enet_get_regs_len, | ||
2595 | .get_regs = fec_enet_get_regs, | ||
2518 | .nway_reset = fec_enet_nway_reset, | 2596 | .nway_reset = fec_enet_nway_reset, |
2519 | .get_link = ethtool_op_get_link, | 2597 | .get_link = ethtool_op_get_link, |
2520 | .get_coalesce = fec_enet_get_coalesce, | 2598 | .get_coalesce = fec_enet_get_coalesce, |