1 /* Copyright (c) 2016, The Linux Foundation. All rights reserved. 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License version 2 and 5 * only version 2 as published by the Free Software Foundation. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 */ 12 13 #include <linux/ethtool.h> 14 #include <linux/phy.h> 15 16 #include "emac.h" 17 18 static const char * const emac_ethtool_stat_strings[] = { 19 "rx_ok", 20 "rx_bcast", 21 "rx_mcast", 22 "rx_pause", 23 "rx_ctrl", 24 "rx_fcs_err", 25 "rx_len_err", 26 "rx_byte_cnt", 27 "rx_runt", 28 "rx_frag", 29 "rx_sz_64", 30 "rx_sz_65_127", 31 "rx_sz_128_255", 32 "rx_sz_256_511", 33 "rx_sz_512_1023", 34 "rx_sz_1024_1518", 35 "rx_sz_1519_max", 36 "rx_sz_ov", 37 "rx_rxf_ov", 38 "rx_align_err", 39 "rx_bcast_byte_cnt", 40 "rx_mcast_byte_cnt", 41 "rx_err_addr", 42 "rx_crc_align", 43 "rx_jabbers", 44 "tx_ok", 45 "tx_bcast", 46 "tx_mcast", 47 "tx_pause", 48 "tx_exc_defer", 49 "tx_ctrl", 50 "tx_defer", 51 "tx_byte_cnt", 52 "tx_sz_64", 53 "tx_sz_65_127", 54 "tx_sz_128_255", 55 "tx_sz_256_511", 56 "tx_sz_512_1023", 57 "tx_sz_1024_1518", 58 "tx_sz_1519_max", 59 "tx_1_col", 60 "tx_2_col", 61 "tx_late_col", 62 "tx_abort_col", 63 "tx_underrun", 64 "tx_rd_eop", 65 "tx_len_err", 66 "tx_trunc", 67 "tx_bcast_byte", 68 "tx_mcast_byte", 69 "tx_col", 70 }; 71 72 #define EMAC_STATS_LEN ARRAY_SIZE(emac_ethtool_stat_strings) 73 74 static u32 emac_get_msglevel(struct net_device *netdev) 75 { 76 struct emac_adapter *adpt = netdev_priv(netdev); 77 78 return adpt->msg_enable; 79 } 80 81 static void emac_set_msglevel(struct net_device *netdev, u32 data) 82 { 83 struct emac_adapter *adpt = netdev_priv(netdev); 84 85 adpt->msg_enable = data; 86 } 87 88 static int emac_get_sset_count(struct net_device *netdev, int sset) 89 { 90 switch (sset) { 91 case ETH_SS_PRIV_FLAGS: 92 return 1; 93 case ETH_SS_STATS: 94 return EMAC_STATS_LEN; 95 default: 96 return -EOPNOTSUPP; 97 } 98 } 99 100 static void emac_get_strings(struct net_device *netdev, u32 stringset, u8 *data) 101 { 102 unsigned int i; 103 104 switch (stringset) { 105 case ETH_SS_PRIV_FLAGS: 106 strcpy(data, "single-pause-mode"); 107 break; 108 109 case ETH_SS_STATS: 110 for (i = 0; i < EMAC_STATS_LEN; i++) { 111 strlcpy(data, emac_ethtool_stat_strings[i], 112 ETH_GSTRING_LEN); 113 data += ETH_GSTRING_LEN; 114 } 115 break; 116 } 117 } 118 119 static void emac_get_ethtool_stats(struct net_device *netdev, 120 struct ethtool_stats *stats, 121 u64 *data) 122 { 123 struct emac_adapter *adpt = netdev_priv(netdev); 124 125 spin_lock(&adpt->stats.lock); 126 127 emac_update_hw_stats(adpt); 128 memcpy(data, &adpt->stats, EMAC_STATS_LEN * sizeof(u64)); 129 130 spin_unlock(&adpt->stats.lock); 131 } 132 133 static int emac_nway_reset(struct net_device *netdev) 134 { 135 struct phy_device *phydev = netdev->phydev; 136 137 if (!phydev) 138 return -ENODEV; 139 140 return genphy_restart_aneg(phydev); 141 } 142 143 static void emac_get_ringparam(struct net_device *netdev, 144 struct ethtool_ringparam *ring) 145 { 146 struct emac_adapter *adpt = netdev_priv(netdev); 147 148 ring->rx_max_pending = EMAC_MAX_RX_DESCS; 149 ring->tx_max_pending = EMAC_MAX_TX_DESCS; 150 ring->rx_pending = adpt->rx_desc_cnt; 151 ring->tx_pending = adpt->tx_desc_cnt; 152 } 153 154 static int emac_set_ringparam(struct net_device *netdev, 155 struct ethtool_ringparam *ring) 156 { 157 struct emac_adapter *adpt = netdev_priv(netdev); 158 159 /* We don't have separate queues/rings for small/large frames, so 160 * reject any attempt to specify those values separately. 161 */ 162 if (ring->rx_mini_pending || ring->rx_jumbo_pending) 163 return -EINVAL; 164 165 adpt->tx_desc_cnt = 166 clamp_val(ring->tx_pending, EMAC_MIN_TX_DESCS, EMAC_MAX_TX_DESCS); 167 168 adpt->rx_desc_cnt = 169 clamp_val(ring->rx_pending, EMAC_MIN_RX_DESCS, EMAC_MAX_RX_DESCS); 170 171 if (netif_running(netdev)) 172 return emac_reinit_locked(adpt); 173 174 return 0; 175 } 176 177 static void emac_get_pauseparam(struct net_device *netdev, 178 struct ethtool_pauseparam *pause) 179 { 180 struct emac_adapter *adpt = netdev_priv(netdev); 181 182 pause->autoneg = adpt->automatic ? AUTONEG_ENABLE : AUTONEG_DISABLE; 183 pause->rx_pause = adpt->rx_flow_control ? 1 : 0; 184 pause->tx_pause = adpt->tx_flow_control ? 1 : 0; 185 } 186 187 static int emac_set_pauseparam(struct net_device *netdev, 188 struct ethtool_pauseparam *pause) 189 { 190 struct emac_adapter *adpt = netdev_priv(netdev); 191 192 adpt->automatic = pause->autoneg == AUTONEG_ENABLE; 193 adpt->rx_flow_control = pause->rx_pause != 0; 194 adpt->tx_flow_control = pause->tx_pause != 0; 195 196 if (netif_running(netdev)) 197 return emac_reinit_locked(adpt); 198 199 return 0; 200 } 201 202 /* Selected registers that might want to track during runtime. */ 203 static const u16 emac_regs[] = { 204 EMAC_DMA_MAS_CTRL, 205 EMAC_MAC_CTRL, 206 EMAC_TXQ_CTRL_0, 207 EMAC_RXQ_CTRL_0, 208 EMAC_DMA_CTRL, 209 EMAC_INT_MASK, 210 EMAC_AXI_MAST_CTRL, 211 EMAC_CORE_HW_VERSION, 212 EMAC_MISC_CTRL, 213 }; 214 215 /* Every time emac_regs[] above is changed, increase this version number. */ 216 #define EMAC_REGS_VERSION 0 217 218 #define EMAC_MAX_REG_SIZE ARRAY_SIZE(emac_regs) 219 220 static void emac_get_regs(struct net_device *netdev, 221 struct ethtool_regs *regs, void *buff) 222 { 223 struct emac_adapter *adpt = netdev_priv(netdev); 224 u32 *val = buff; 225 unsigned int i; 226 227 regs->version = EMAC_REGS_VERSION; 228 regs->len = EMAC_MAX_REG_SIZE * sizeof(u32); 229 230 for (i = 0; i < EMAC_MAX_REG_SIZE; i++) 231 val[i] = readl(adpt->base + emac_regs[i]); 232 } 233 234 static int emac_get_regs_len(struct net_device *netdev) 235 { 236 return EMAC_MAX_REG_SIZE * sizeof(u32); 237 } 238 239 #define EMAC_PRIV_ENABLE_SINGLE_PAUSE BIT(0) 240 241 static int emac_set_priv_flags(struct net_device *netdev, u32 flags) 242 { 243 struct emac_adapter *adpt = netdev_priv(netdev); 244 245 adpt->single_pause_mode = !!(flags & EMAC_PRIV_ENABLE_SINGLE_PAUSE); 246 247 if (netif_running(netdev)) 248 return emac_reinit_locked(adpt); 249 250 return 0; 251 } 252 253 static u32 emac_get_priv_flags(struct net_device *netdev) 254 { 255 struct emac_adapter *adpt = netdev_priv(netdev); 256 257 return adpt->single_pause_mode ? EMAC_PRIV_ENABLE_SINGLE_PAUSE : 0; 258 } 259 260 static const struct ethtool_ops emac_ethtool_ops = { 261 .get_link_ksettings = phy_ethtool_get_link_ksettings, 262 .set_link_ksettings = phy_ethtool_set_link_ksettings, 263 264 .get_msglevel = emac_get_msglevel, 265 .set_msglevel = emac_set_msglevel, 266 267 .get_sset_count = emac_get_sset_count, 268 .get_strings = emac_get_strings, 269 .get_ethtool_stats = emac_get_ethtool_stats, 270 271 .get_ringparam = emac_get_ringparam, 272 .set_ringparam = emac_set_ringparam, 273 274 .get_pauseparam = emac_get_pauseparam, 275 .set_pauseparam = emac_set_pauseparam, 276 277 .nway_reset = emac_nway_reset, 278 279 .get_link = ethtool_op_get_link, 280 281 .get_regs_len = emac_get_regs_len, 282 .get_regs = emac_get_regs, 283 284 .set_priv_flags = emac_set_priv_flags, 285 .get_priv_flags = emac_get_priv_flags, 286 }; 287 288 void emac_set_ethtool_ops(struct net_device *netdev) 289 { 290 netdev->ethtool_ops = &emac_ethtool_ops; 291 } 292