Skip to content

Commit d7a550d

Browse files
committed
Merge branch 'sja1105-driver-fixes'
Vladimir Oltean says: ==================== sja1105 driver fixes This is a collection of 3 fixes for the sja1105 DSA driver: - 1/3: "ethtool -S" shows a bogus counter with no name, and doesn't show a valid counter because of it (either "n_not_reach" or "n_rx_bcast"). - 2/3: RX timestamping filters other than L2 PTP event messages don't work, but are not rejected, either. - 3/3: there is a KASAN out-of-bounds warning in sja1105_table_delete_entry() ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 4af9939 + 5f2b28b commit d7a550d

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

drivers/net/dsa/sja1105/sja1105_ethtool.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,9 @@ void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data)
571571
max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER;
572572

573573
for (i = 0; i < max_ctr; i++) {
574+
if (!strlen(sja1105_port_counters[i].name))
575+
continue;
576+
574577
rc = sja1105_port_counter_read(priv, port, i, &data[k++]);
575578
if (rc) {
576579
dev_err(ds->dev,
@@ -596,8 +599,12 @@ void sja1105_get_strings(struct dsa_switch *ds, int port,
596599
else
597600
max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER;
598601

599-
for (i = 0; i < max_ctr; i++)
602+
for (i = 0; i < max_ctr; i++) {
603+
if (!strlen(sja1105_port_counters[i].name))
604+
continue;
605+
600606
ethtool_puts(&data, sja1105_port_counters[i].name);
607+
}
601608
}
602609

603610
int sja1105_get_sset_count(struct dsa_switch *ds, int port, int sset)

drivers/net/dsa/sja1105/sja1105_ptp.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,33 +61,43 @@ enum sja1105_ptp_clk_mode {
6161
int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
6262
{
6363
struct sja1105_private *priv = ds->priv;
64+
unsigned long hwts_tx_en, hwts_rx_en;
6465
struct hwtstamp_config config;
6566

6667
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
6768
return -EFAULT;
6869

70+
hwts_tx_en = priv->hwts_tx_en;
71+
hwts_rx_en = priv->hwts_rx_en;
72+
6973
switch (config.tx_type) {
7074
case HWTSTAMP_TX_OFF:
71-
priv->hwts_tx_en &= ~BIT(port);
75+
hwts_tx_en &= ~BIT(port);
7276
break;
7377
case HWTSTAMP_TX_ON:
74-
priv->hwts_tx_en |= BIT(port);
78+
hwts_tx_en |= BIT(port);
7579
break;
7680
default:
7781
return -ERANGE;
7882
}
7983

8084
switch (config.rx_filter) {
8185
case HWTSTAMP_FILTER_NONE:
82-
priv->hwts_rx_en &= ~BIT(port);
86+
hwts_rx_en &= ~BIT(port);
8387
break;
84-
default:
85-
priv->hwts_rx_en |= BIT(port);
88+
case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
89+
hwts_rx_en |= BIT(port);
8690
break;
91+
default:
92+
return -ERANGE;
8793
}
8894

8995
if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
9096
return -EFAULT;
97+
98+
priv->hwts_tx_en = hwts_tx_en;
99+
priv->hwts_rx_en = hwts_rx_en;
100+
91101
return 0;
92102
}
93103

drivers/net/dsa/sja1105/sja1105_static_config.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,8 +1917,10 @@ int sja1105_table_delete_entry(struct sja1105_table *table, int i)
19171917
if (i > table->entry_count)
19181918
return -ERANGE;
19191919

1920-
memmove(entries + i * entry_size, entries + (i + 1) * entry_size,
1921-
(table->entry_count - i) * entry_size);
1920+
if (i + 1 < table->entry_count) {
1921+
memmove(entries + i * entry_size, entries + (i + 1) * entry_size,
1922+
(table->entry_count - i - 1) * entry_size);
1923+
}
19221924

19231925
table->entry_count--;
19241926

0 commit comments

Comments
 (0)