Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: dsa: use ethtool string helpers

These are the preferred way to copy ethtool strings.

Avoids incrementing pointers all over the place.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
(for hellcreek driver)
Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de>
Link: https://patch.msgid.link/20241028044828.1639668-1-rosenp@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Rosen Penev and committed by
Jakub Kicinski
f12b3638 574583c3

+64 -103
+1 -2
drivers/net/dsa/b53/b53_common.c
··· 989 989 990 990 if (stringset == ETH_SS_STATS) { 991 991 for (i = 0; i < mib_size; i++) 992 - strscpy(data + i * ETH_GSTRING_LEN, 993 - mibs[i].name, ETH_GSTRING_LEN); 992 + ethtool_puts(&data, mibs[i].name); 994 993 } else if (stringset == ETH_SS_PHY_STATS) { 995 994 phydev = b53_get_phy_device(ds, port); 996 995 if (!phydev)
+2 -2
drivers/net/dsa/bcm_sf2.c
··· 1183 1183 int cnt = b53_get_sset_count(ds, port, stringset); 1184 1184 1185 1185 b53_get_strings(ds, port, stringset, data); 1186 - bcm_sf2_cfp_get_strings(ds, port, stringset, 1187 - data + cnt * ETH_GSTRING_LEN); 1186 + data += cnt * ETH_GSTRING_LEN; 1187 + bcm_sf2_cfp_get_strings(ds, port, stringset, &data); 1188 1188 } 1189 1189 1190 1190 static void bcm_sf2_sw_get_ethtool_stats(struct dsa_switch *ds, int port,
+2 -2
drivers/net/dsa/bcm_sf2.h
··· 228 228 int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv); 229 229 void bcm_sf2_cfp_exit(struct dsa_switch *ds); 230 230 int bcm_sf2_cfp_resume(struct dsa_switch *ds); 231 - void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, 232 - u32 stringset, uint8_t *data); 231 + void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, u32 stringset, 232 + uint8_t **data); 233 233 void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port, 234 234 uint64_t *data); 235 235 int bcm_sf2_cfp_get_sset_count(struct dsa_switch *ds, int port, int sset);
+7 -15
drivers/net/dsa/bcm_sf2_cfp.c
··· 1279 1279 }, 1280 1280 }; 1281 1281 1282 - void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, 1283 - u32 stringset, uint8_t *data) 1282 + void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, u32 stringset, 1283 + uint8_t **data) 1284 1284 { 1285 1285 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); 1286 - unsigned int s = ARRAY_SIZE(bcm_sf2_cfp_stats); 1287 - char buf[ETH_GSTRING_LEN]; 1288 - unsigned int i, j, iter; 1286 + unsigned int i, j; 1289 1287 1290 1288 if (stringset != ETH_SS_STATS) 1291 1289 return; 1292 1290 1293 - for (i = 1; i < priv->num_cfp_rules; i++) { 1294 - for (j = 0; j < s; j++) { 1295 - snprintf(buf, sizeof(buf), 1296 - "CFP%03d_%sCntr", 1297 - i, bcm_sf2_cfp_stats[j].name); 1298 - iter = (i - 1) * s + j; 1299 - strscpy(data + iter * ETH_GSTRING_LEN, 1300 - buf, ETH_GSTRING_LEN); 1301 - } 1302 - } 1291 + for (i = 1; i < priv->num_cfp_rules; i++) 1292 + for (j = 0; j < ARRAY_SIZE(bcm_sf2_cfp_stats); j++) 1293 + ethtool_sprintf(data, "CFP%03d_%sCntr", i, 1294 + bcm_sf2_cfp_stats[j].name); 1303 1295 } 1304 1296 1305 1297 void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port,
+1 -2
drivers/net/dsa/dsa_loop.c
··· 121 121 return; 122 122 123 123 for (i = 0; i < __DSA_LOOP_CNT_MAX; i++) 124 - memcpy(data + i * ETH_GSTRING_LEN, 125 - ps->ports[port].mib[i].name, ETH_GSTRING_LEN); 124 + ethtool_puts(&data, ps->ports[port].mib[i].name); 126 125 } 127 126 128 127 static void dsa_loop_get_ethtool_stats(struct dsa_switch *ds, int port,
+2 -6
drivers/net/dsa/hirschmann/hellcreek.c
··· 294 294 { 295 295 int i; 296 296 297 - for (i = 0; i < ARRAY_SIZE(hellcreek_counter); ++i) { 298 - const struct hellcreek_counter *counter = &hellcreek_counter[i]; 299 - 300 - strscpy(data + i * ETH_GSTRING_LEN, 301 - counter->name, ETH_GSTRING_LEN); 302 - } 297 + for (i = 0; i < ARRAY_SIZE(hellcreek_counter); ++i) 298 + ethtool_puts(&data, hellcreek_counter[i].name); 303 299 } 304 300 305 301 static int hellcreek_get_sset_count(struct dsa_switch *ds, int port, int sset)
+2 -4
drivers/net/dsa/microchip/ksz_common.c
··· 2112 2112 if (stringset != ETH_SS_STATS) 2113 2113 return; 2114 2114 2115 - for (i = 0; i < dev->info->mib_cnt; i++) { 2116 - memcpy(buf + i * ETH_GSTRING_LEN, 2117 - dev->info->mib_names[i].string, ETH_GSTRING_LEN); 2118 - } 2115 + for (i = 0; i < dev->info->mib_cnt; i++) 2116 + ethtool_puts(&buf, dev->info->mib_names[i].string); 2119 2117 } 2120 2118 2121 2119 /**
+23 -34
drivers/net/dsa/mv88e6xxx/chip.c
··· 1153 1153 return value; 1154 1154 } 1155 1155 1156 - static int mv88e6xxx_stats_get_strings(struct mv88e6xxx_chip *chip, 1157 - uint8_t *data, int types) 1156 + static void mv88e6xxx_stats_get_strings(struct mv88e6xxx_chip *chip, 1157 + uint8_t **data, int types) 1158 1158 { 1159 1159 const struct mv88e6xxx_hw_stat *stat; 1160 - int i, j; 1160 + int i; 1161 1161 1162 - for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) { 1162 + for (i = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) { 1163 1163 stat = &mv88e6xxx_hw_stats[i]; 1164 - if (stat->type & types) { 1165 - memcpy(data + j * ETH_GSTRING_LEN, stat->string, 1166 - ETH_GSTRING_LEN); 1167 - j++; 1168 - } 1164 + if (stat->type & types) 1165 + ethtool_puts(data, stat->string); 1169 1166 } 1170 - 1171 - return j; 1172 1167 } 1173 1168 1174 - static int mv88e6095_stats_get_strings(struct mv88e6xxx_chip *chip, 1175 - uint8_t *data) 1169 + static void mv88e6095_stats_get_strings(struct mv88e6xxx_chip *chip, 1170 + uint8_t **data) 1176 1171 { 1177 - return mv88e6xxx_stats_get_strings(chip, data, 1178 - STATS_TYPE_BANK0 | STATS_TYPE_PORT); 1172 + mv88e6xxx_stats_get_strings(chip, data, 1173 + STATS_TYPE_BANK0 | STATS_TYPE_PORT); 1179 1174 } 1180 1175 1181 - static int mv88e6250_stats_get_strings(struct mv88e6xxx_chip *chip, 1182 - uint8_t *data) 1176 + static void mv88e6250_stats_get_strings(struct mv88e6xxx_chip *chip, 1177 + uint8_t **data) 1183 1178 { 1184 - return mv88e6xxx_stats_get_strings(chip, data, STATS_TYPE_BANK0); 1179 + mv88e6xxx_stats_get_strings(chip, data, STATS_TYPE_BANK0); 1185 1180 } 1186 1181 1187 - static int mv88e6320_stats_get_strings(struct mv88e6xxx_chip *chip, 1188 - uint8_t *data) 1182 + static void mv88e6320_stats_get_strings(struct mv88e6xxx_chip *chip, 1183 + uint8_t **data) 1189 1184 { 1190 - return mv88e6xxx_stats_get_strings(chip, data, 1191 - STATS_TYPE_BANK0 | STATS_TYPE_BANK1); 1185 + mv88e6xxx_stats_get_strings(chip, data, 1186 + STATS_TYPE_BANK0 | STATS_TYPE_BANK1); 1192 1187 } 1193 1188 1194 1189 static const uint8_t *mv88e6xxx_atu_vtu_stats_strings[] = { ··· 1194 1199 "vtu_miss_violation", 1195 1200 }; 1196 1201 1197 - static void mv88e6xxx_atu_vtu_get_strings(uint8_t *data) 1202 + static void mv88e6xxx_atu_vtu_get_strings(uint8_t **data) 1198 1203 { 1199 1204 unsigned int i; 1200 1205 1201 1206 for (i = 0; i < ARRAY_SIZE(mv88e6xxx_atu_vtu_stats_strings); i++) 1202 - strscpy(data + i * ETH_GSTRING_LEN, 1203 - mv88e6xxx_atu_vtu_stats_strings[i], 1204 - ETH_GSTRING_LEN); 1207 + ethtool_puts(data, mv88e6xxx_atu_vtu_stats_strings[i]); 1205 1208 } 1206 1209 1207 1210 static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port, 1208 1211 u32 stringset, uint8_t *data) 1209 1212 { 1210 1213 struct mv88e6xxx_chip *chip = ds->priv; 1211 - int count = 0; 1212 1214 1213 1215 if (stringset != ETH_SS_STATS) 1214 1216 return; ··· 1213 1221 mv88e6xxx_reg_lock(chip); 1214 1222 1215 1223 if (chip->info->ops->stats_get_strings) 1216 - count = chip->info->ops->stats_get_strings(chip, data); 1224 + chip->info->ops->stats_get_strings(chip, &data); 1217 1225 1218 - if (chip->info->ops->serdes_get_strings) { 1219 - data += count * ETH_GSTRING_LEN; 1220 - count = chip->info->ops->serdes_get_strings(chip, port, data); 1221 - } 1226 + if (chip->info->ops->serdes_get_strings) 1227 + chip->info->ops->serdes_get_strings(chip, port, &data); 1222 1228 1223 - data += count * ETH_GSTRING_LEN; 1224 - mv88e6xxx_atu_vtu_get_strings(data); 1229 + mv88e6xxx_atu_vtu_get_strings(&data); 1225 1230 1226 1231 mv88e6xxx_reg_unlock(chip); 1227 1232 }
+3 -3
drivers/net/dsa/mv88e6xxx/chip.h
··· 606 606 607 607 /* Return the number of strings describing statistics */ 608 608 int (*stats_get_sset_count)(struct mv88e6xxx_chip *chip); 609 - int (*stats_get_strings)(struct mv88e6xxx_chip *chip, uint8_t *data); 609 + void (*stats_get_strings)(struct mv88e6xxx_chip *chip, uint8_t **data); 610 610 size_t (*stats_get_stat)(struct mv88e6xxx_chip *chip, int port, 611 611 const struct mv88e6xxx_hw_stat *stat, 612 612 uint64_t *data); ··· 633 633 634 634 /* Statistics from the SERDES interface */ 635 635 int (*serdes_get_sset_count)(struct mv88e6xxx_chip *chip, int port); 636 - int (*serdes_get_strings)(struct mv88e6xxx_chip *chip, int port, 637 - uint8_t *data); 636 + int (*serdes_get_strings)(struct mv88e6xxx_chip *chip, int port, 637 + uint8_t **data); 638 638 size_t (*serdes_get_stats)(struct mv88e6xxx_chip *chip, int port, 639 639 uint64_t *data); 640 640
+6 -8
drivers/net/dsa/mv88e6xxx/serdes.c
··· 132 132 return ARRAY_SIZE(mv88e6352_serdes_hw_stats); 133 133 } 134 134 135 - int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, 136 - int port, uint8_t *data) 135 + int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, int port, 136 + uint8_t **data) 137 137 { 138 138 struct mv88e6352_serdes_hw_stat *stat; 139 139 int err, i; ··· 144 144 145 145 for (i = 0; i < ARRAY_SIZE(mv88e6352_serdes_hw_stats); i++) { 146 146 stat = &mv88e6352_serdes_hw_stats[i]; 147 - memcpy(data + i * ETH_GSTRING_LEN, stat->string, 148 - ETH_GSTRING_LEN); 147 + ethtool_puts(data, stat->string); 149 148 } 150 149 return ARRAY_SIZE(mv88e6352_serdes_hw_stats); 151 150 } ··· 393 394 return ARRAY_SIZE(mv88e6390_serdes_hw_stats); 394 395 } 395 396 396 - int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip, 397 - int port, uint8_t *data) 397 + int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip, int port, 398 + uint8_t **data) 398 399 { 399 400 struct mv88e6390_serdes_hw_stat *stat; 400 401 int i; ··· 404 405 405 406 for (i = 0; i < ARRAY_SIZE(mv88e6390_serdes_hw_stats); i++) { 406 407 stat = &mv88e6390_serdes_hw_stats[i]; 407 - memcpy(data + i * ETH_GSTRING_LEN, stat->string, 408 - ETH_GSTRING_LEN); 408 + ethtool_puts(data, stat->string); 409 409 } 410 410 return ARRAY_SIZE(mv88e6390_serdes_hw_stats); 411 411 }
+4 -4
drivers/net/dsa/mv88e6xxx/serdes.h
··· 125 125 unsigned int mv88e6390_serdes_irq_mapping(struct mv88e6xxx_chip *chip, 126 126 int port); 127 127 int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port); 128 - int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, 129 - int port, uint8_t *data); 128 + int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, int port, 129 + uint8_t **data); 130 130 size_t mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, 131 131 uint64_t *data); 132 132 int mv88e6390_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port); 133 - int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip, 134 - int port, uint8_t *data); 133 + int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip, int port, 134 + uint8_t **data); 135 135 size_t mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, 136 136 uint64_t *data); 137 137
+2 -4
drivers/net/dsa/rzn1_a5psw.c
··· 802 802 if (stringset != ETH_SS_STATS) 803 803 return; 804 804 805 - for (u = 0; u < ARRAY_SIZE(a5psw_stats); u++) { 806 - memcpy(data + u * ETH_GSTRING_LEN, a5psw_stats[u].name, 807 - ETH_GSTRING_LEN); 808 - } 805 + for (u = 0; u < ARRAY_SIZE(a5psw_stats); u++) 806 + ethtool_puts(&data, a5psw_stats[u].name); 809 807 } 810 808 811 809 static void a5psw_get_ethtool_stats(struct dsa_switch *ds, int port,
+2 -5
drivers/net/dsa/sja1105/sja1105_ethtool.c
··· 586 586 { 587 587 struct sja1105_private *priv = ds->priv; 588 588 enum sja1105_counter_index max_ctr, i; 589 - char *p = data; 590 589 591 590 if (stringset != ETH_SS_STATS) 592 591 return; ··· 596 597 else 597 598 max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER; 598 599 599 - for (i = 0; i < max_ctr; i++) { 600 - strscpy(p, sja1105_port_counters[i].name, ETH_GSTRING_LEN); 601 - p += ETH_GSTRING_LEN; 602 - } 600 + for (i = 0; i < max_ctr; i++) 601 + ethtool_puts(&data, sja1105_port_counters[i].name); 603 602 } 604 603 605 604 int sja1105_get_sset_count(struct dsa_switch *ds, int port, int sset)
+2 -4
drivers/net/dsa/xrs700x/xrs700x.c
··· 91 91 if (stringset != ETH_SS_STATS) 92 92 return; 93 93 94 - for (i = 0; i < ARRAY_SIZE(xrs700x_mibs); i++) { 95 - strscpy(data, xrs700x_mibs[i].name, ETH_GSTRING_LEN); 96 - data += ETH_GSTRING_LEN; 97 - } 94 + for (i = 0; i < ARRAY_SIZE(xrs700x_mibs); i++) 95 + ethtool_puts(&data, xrs700x_mibs[i].name); 98 96 } 99 97 100 98 static int xrs700x_get_sset_count(struct dsa_switch *ds, int port, int sset)
+5 -8
net/dsa/user.c
··· 1042 1042 struct dsa_switch *ds = dp->ds; 1043 1043 1044 1044 if (stringset == ETH_SS_STATS) { 1045 - int len = ETH_GSTRING_LEN; 1046 - 1047 - strscpy_pad(data, "tx_packets", len); 1048 - strscpy_pad(data + len, "tx_bytes", len); 1049 - strscpy_pad(data + 2 * len, "rx_packets", len); 1050 - strscpy_pad(data + 3 * len, "rx_bytes", len); 1045 + ethtool_puts(&data, "tx_packets"); 1046 + ethtool_puts(&data, "tx_bytes"); 1047 + ethtool_puts(&data, "rx_packets"); 1048 + ethtool_puts(&data, "rx_bytes"); 1051 1049 if (ds->ops->get_strings) 1052 - ds->ops->get_strings(ds, dp->index, stringset, 1053 - data + 4 * len); 1050 + ds->ops->get_strings(ds, dp->index, stringset, data); 1054 1051 } else if (stringset == ETH_SS_TEST) { 1055 1052 net_selftest_get_strings(data); 1056 1053 }