|
7 | 7 | #define SJA1105_SIZE_HL1_AREA (0x10 * 4) |
8 | 8 | #define SJA1105_SIZE_HL2_AREA (0x4 * 4) |
9 | 9 | #define SJA1105_SIZE_QLEVEL_AREA (0x8 * 4) /* 0x4 to 0xB */ |
| 10 | +#define SJA1105_SIZE_ETHER_AREA (0x17 * 4) |
10 | 11 |
|
11 | 12 | struct sja1105_port_status_mac { |
12 | 13 | u64 n_runt; |
@@ -63,10 +64,37 @@ struct sja1105_port_status_hl2 { |
63 | 64 | u64 qlevel[8]; /* Only for P/Q/R/S */ |
64 | 65 | }; |
65 | 66 |
|
| 67 | +struct sja1105_port_status_ether { |
| 68 | + u64 n_drops_nolearn; |
| 69 | + u64 n_drops_noroute; |
| 70 | + u64 n_drops_ill_dtag; |
| 71 | + u64 n_drops_dtag; |
| 72 | + u64 n_drops_sotag; |
| 73 | + u64 n_drops_sitag; |
| 74 | + u64 n_drops_utag; |
| 75 | + u64 n_tx_bytes_1024_2047; |
| 76 | + u64 n_tx_bytes_512_1023; |
| 77 | + u64 n_tx_bytes_256_511; |
| 78 | + u64 n_tx_bytes_128_255; |
| 79 | + u64 n_tx_bytes_65_127; |
| 80 | + u64 n_tx_bytes_64; |
| 81 | + u64 n_tx_mcast; |
| 82 | + u64 n_tx_bcast; |
| 83 | + u64 n_rx_bytes_1024_2047; |
| 84 | + u64 n_rx_bytes_512_1023; |
| 85 | + u64 n_rx_bytes_256_511; |
| 86 | + u64 n_rx_bytes_128_255; |
| 87 | + u64 n_rx_bytes_65_127; |
| 88 | + u64 n_rx_bytes_64; |
| 89 | + u64 n_rx_mcast; |
| 90 | + u64 n_rx_bcast; |
| 91 | +}; |
| 92 | + |
66 | 93 | struct sja1105_port_status { |
67 | 94 | struct sja1105_port_status_mac mac; |
68 | 95 | struct sja1105_port_status_hl1 hl1; |
69 | 96 | struct sja1105_port_status_hl2 hl2; |
| 97 | + struct sja1105_port_status_ether ether; |
70 | 98 | }; |
71 | 99 |
|
72 | 100 | static void |
@@ -158,6 +186,58 @@ sja1105pqrs_port_status_qlevel_unpack(void *buf, |
158 | 186 | } |
159 | 187 | } |
160 | 188 |
|
| 189 | +static void |
| 190 | +sja1105pqrs_port_status_ether_unpack(void *buf, |
| 191 | + struct sja1105_port_status_ether *status) |
| 192 | +{ |
| 193 | + /* Make pointer arithmetic work on 4 bytes */ |
| 194 | + u32 *p = buf; |
| 195 | + |
| 196 | + sja1105_unpack(p + 0x16, &status->n_drops_nolearn, 31, 0, 4); |
| 197 | + sja1105_unpack(p + 0x15, &status->n_drops_noroute, 31, 0, 4); |
| 198 | + sja1105_unpack(p + 0x14, &status->n_drops_ill_dtag, 31, 0, 4); |
| 199 | + sja1105_unpack(p + 0x13, &status->n_drops_dtag, 31, 0, 4); |
| 200 | + sja1105_unpack(p + 0x12, &status->n_drops_sotag, 31, 0, 4); |
| 201 | + sja1105_unpack(p + 0x11, &status->n_drops_sitag, 31, 0, 4); |
| 202 | + sja1105_unpack(p + 0x10, &status->n_drops_utag, 31, 0, 4); |
| 203 | + sja1105_unpack(p + 0x0F, &status->n_tx_bytes_1024_2047, 31, 0, 4); |
| 204 | + sja1105_unpack(p + 0x0E, &status->n_tx_bytes_512_1023, 31, 0, 4); |
| 205 | + sja1105_unpack(p + 0x0D, &status->n_tx_bytes_256_511, 31, 0, 4); |
| 206 | + sja1105_unpack(p + 0x0C, &status->n_tx_bytes_128_255, 31, 0, 4); |
| 207 | + sja1105_unpack(p + 0x0B, &status->n_tx_bytes_65_127, 31, 0, 4); |
| 208 | + sja1105_unpack(p + 0x0A, &status->n_tx_bytes_64, 31, 0, 4); |
| 209 | + sja1105_unpack(p + 0x09, &status->n_tx_mcast, 31, 0, 4); |
| 210 | + sja1105_unpack(p + 0x08, &status->n_tx_bcast, 31, 0, 4); |
| 211 | + sja1105_unpack(p + 0x07, &status->n_rx_bytes_1024_2047, 31, 0, 4); |
| 212 | + sja1105_unpack(p + 0x06, &status->n_rx_bytes_512_1023, 31, 0, 4); |
| 213 | + sja1105_unpack(p + 0x05, &status->n_rx_bytes_256_511, 31, 0, 4); |
| 214 | + sja1105_unpack(p + 0x04, &status->n_rx_bytes_128_255, 31, 0, 4); |
| 215 | + sja1105_unpack(p + 0x03, &status->n_rx_bytes_65_127, 31, 0, 4); |
| 216 | + sja1105_unpack(p + 0x02, &status->n_rx_bytes_64, 31, 0, 4); |
| 217 | + sja1105_unpack(p + 0x01, &status->n_rx_mcast, 31, 0, 4); |
| 218 | + sja1105_unpack(p + 0x00, &status->n_rx_bcast, 31, 0, 4); |
| 219 | +} |
| 220 | + |
| 221 | +static int |
| 222 | +sja1105pqrs_port_status_get_ether(struct sja1105_private *priv, |
| 223 | + struct sja1105_port_status_ether *ether, |
| 224 | + int port) |
| 225 | +{ |
| 226 | + const struct sja1105_regs *regs = priv->info->regs; |
| 227 | + u8 packed_buf[SJA1105_SIZE_ETHER_AREA] = {0}; |
| 228 | + int rc; |
| 229 | + |
| 230 | + /* Ethernet statistics area */ |
| 231 | + rc = sja1105_xfer_buf(priv, SPI_READ, regs->ether_stats[port], |
| 232 | + packed_buf, SJA1105_SIZE_ETHER_AREA); |
| 233 | + if (rc < 0) |
| 234 | + return rc; |
| 235 | + |
| 236 | + sja1105pqrs_port_status_ether_unpack(packed_buf, ether); |
| 237 | + |
| 238 | + return 0; |
| 239 | +} |
| 240 | + |
161 | 241 | static int sja1105_port_status_get_mac(struct sja1105_private *priv, |
162 | 242 | struct sja1105_port_status_mac *status, |
163 | 243 | int port) |
@@ -241,7 +321,11 @@ static int sja1105_port_status_get(struct sja1105_private *priv, |
241 | 321 | if (rc < 0) |
242 | 322 | return rc; |
243 | 323 |
|
244 | | - return 0; |
| 324 | + if (priv->info->device_id == SJA1105E_DEVICE_ID || |
| 325 | + priv->info->device_id == SJA1105T_DEVICE_ID) |
| 326 | + return 0; |
| 327 | + |
| 328 | + return sja1105pqrs_port_status_get_ether(priv, &status->ether, port); |
245 | 329 | } |
246 | 330 |
|
247 | 331 | static char sja1105_port_stats[][ETH_GSTRING_LEN] = { |
@@ -308,6 +392,30 @@ static char sja1105pqrs_extra_port_stats[][ETH_GSTRING_LEN] = { |
308 | 392 | "qlevel_5", |
309 | 393 | "qlevel_6", |
310 | 394 | "qlevel_7", |
| 395 | + /* Ether Stats */ |
| 396 | + "n_drops_nolearn", |
| 397 | + "n_drops_noroute", |
| 398 | + "n_drops_ill_dtag", |
| 399 | + "n_drops_dtag", |
| 400 | + "n_drops_sotag", |
| 401 | + "n_drops_sitag", |
| 402 | + "n_drops_utag", |
| 403 | + "n_tx_bytes_1024_2047", |
| 404 | + "n_tx_bytes_512_1023", |
| 405 | + "n_tx_bytes_256_511", |
| 406 | + "n_tx_bytes_128_255", |
| 407 | + "n_tx_bytes_65_127", |
| 408 | + "n_tx_bytes_64", |
| 409 | + "n_tx_mcast", |
| 410 | + "n_tx_bcast", |
| 411 | + "n_rx_bytes_1024_2047", |
| 412 | + "n_rx_bytes_512_1023", |
| 413 | + "n_rx_bytes_256_511", |
| 414 | + "n_rx_bytes_128_255", |
| 415 | + "n_rx_bytes_65_127", |
| 416 | + "n_rx_bytes_64", |
| 417 | + "n_rx_mcast", |
| 418 | + "n_rx_bcast", |
311 | 419 | }; |
312 | 420 |
|
313 | 421 | void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data) |
@@ -376,6 +484,29 @@ void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data) |
376 | 484 | data[k++] = status.hl2.qlevel_hwm[i]; |
377 | 485 | data[k++] = status.hl2.qlevel[i]; |
378 | 486 | } |
| 487 | + data[k++] = status.ether.n_drops_nolearn; |
| 488 | + data[k++] = status.ether.n_drops_noroute; |
| 489 | + data[k++] = status.ether.n_drops_ill_dtag; |
| 490 | + data[k++] = status.ether.n_drops_dtag; |
| 491 | + data[k++] = status.ether.n_drops_sotag; |
| 492 | + data[k++] = status.ether.n_drops_sitag; |
| 493 | + data[k++] = status.ether.n_drops_utag; |
| 494 | + data[k++] = status.ether.n_tx_bytes_1024_2047; |
| 495 | + data[k++] = status.ether.n_tx_bytes_512_1023; |
| 496 | + data[k++] = status.ether.n_tx_bytes_256_511; |
| 497 | + data[k++] = status.ether.n_tx_bytes_128_255; |
| 498 | + data[k++] = status.ether.n_tx_bytes_65_127; |
| 499 | + data[k++] = status.ether.n_tx_bytes_64; |
| 500 | + data[k++] = status.ether.n_tx_mcast; |
| 501 | + data[k++] = status.ether.n_tx_bcast; |
| 502 | + data[k++] = status.ether.n_rx_bytes_1024_2047; |
| 503 | + data[k++] = status.ether.n_rx_bytes_512_1023; |
| 504 | + data[k++] = status.ether.n_rx_bytes_256_511; |
| 505 | + data[k++] = status.ether.n_rx_bytes_128_255; |
| 506 | + data[k++] = status.ether.n_rx_bytes_65_127; |
| 507 | + data[k++] = status.ether.n_rx_bytes_64; |
| 508 | + data[k++] = status.ether.n_rx_mcast; |
| 509 | + data[k++] = status.ether.n_rx_bcast; |
379 | 510 | } |
380 | 511 |
|
381 | 512 | void sja1105_get_strings(struct dsa_switch *ds, int port, |
|
0 commit comments