History

Merge branch 'dsa-Add-ATU-VTU-statistics'

Andrew Lunn says: ==================== Add ATU/VTU statistics Previous patches have added basic support for Address Translation Unit and VLAN translation Unit violation interrupts. Add statistics counters for when these occur, which can be accessed using ethtool. Downgrade one of the particularly spammy warnings from VTU violations to debug only, now that we have a counter for it. ====================

David S. Miller committed 8 years ago

Commit e3e67a42 parents 7ae665f 7f20d836 files · +80 −29Browse files

Unified · Split

6 files
  1. drivers/net/dsa/mv88e6xxx/chip.c +43 −7
  2. drivers/net/dsa/mv88e6xxx/chip.h +9 −4
  3. drivers/net/dsa/mv88e6xxx/global1_atu.c +8 −4
  4. drivers/net/dsa/mv88e6xxx/global1_vtu.c +7 −4
  5. drivers/net/dsa/mv88e6xxx/serdes.c +9 −6
  6. drivers/net/dsa/mv88e6xxx/serdes.h +4 −4
drivers/net/dsa/mv88e6xxx/chip.c+43−7
@@ -723,6 +723,24 @@ static int mv88e6320_stats_get_strings(struct mv88e6xxx_chip *chip, · 722 unmodified lines
723723 STATS_TYPE_BANK0 | STATS_TYPE_BANK1);
724724 }
725725
726+static const uint8_t *mv88e6xxx_atu_vtu_stats_strings[] = {
727+ "atu_member_violation",
728+ "atu_miss_violation",
729+ "atu_full_violation",
730+ "vtu_member_violation",
731+ "vtu_miss_violation",
732+};
733+
734+static void mv88e6xxx_atu_vtu_get_strings(uint8_t *data)
735+{
736+ unsigned int i;
737+
738+ for (i = 0; i < ARRAY_SIZE(mv88e6xxx_atu_vtu_stats_strings); i++)
739+ strlcpy(data + i * ETH_GSTRING_LEN,
740+ mv88e6xxx_atu_vtu_stats_strings[i],
741+ ETH_GSTRING_LEN);
742+}
743+
726744 static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
727745 uint8_t *data)
728746 {
@@ -736,9 +754,12 @@ static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port, · 7 unmodified lines
736754
737755 if (chip->info->ops->serdes_get_strings) {
738756 data += count * ETH_GSTRING_LEN;
739− chip->info->ops->serdes_get_strings(chip, port, data);
757+ count = chip->info->ops->serdes_get_strings(chip, port, data);
740758 }
741759
760+ data += count * ETH_GSTRING_LEN;
761+ mv88e6xxx_atu_vtu_get_strings(data);
762+
742763 mutex_unlock(&chip->reg_lock);
743764 }
744765
@@ -783,10 +804,13 @@ static int mv88e6xxx_get_sset_count(struct dsa_switch *ds, int port) · 38 unmodified lines
783804 if (chip->info->ops->serdes_get_sset_count)
784805 serdes_count = chip->info->ops->serdes_get_sset_count(chip,
785806 port);
786− if (serdes_count < 0)
807+ if (serdes_count < 0) {
787808 count = serdes_count;
788− else
789− count += serdes_count;
809+ goto out;
810+ }
811+ count += serdes_count;
812+ count += ARRAY_SIZE(mv88e6xxx_atu_vtu_stats_strings);
813+
790814 out:
791815 mutex_unlock(&chip->reg_lock);
792816
@@ -841,6 +865,16 @@ static int mv88e6390_stats_get_stats(struct mv88e6xxx_chip *chip, int port, · 48 unmodified lines
841865 0);
842866 }
843867
868+static void mv88e6xxx_atu_vtu_get_stats(struct mv88e6xxx_chip *chip, int port,
869+ uint64_t *data)
870+{
871+ *data++ = chip->ports[port].atu_member_violation;
872+ *data++ = chip->ports[port].atu_miss_violation;
873+ *data++ = chip->ports[port].atu_full_violation;
874+ *data++ = chip->ports[port].vtu_member_violation;
875+ *data++ = chip->ports[port].vtu_miss_violation;
876+}
877+
844878 static void mv88e6xxx_get_stats(struct mv88e6xxx_chip *chip, int port,
845879 uint64_t *data)
846880 {
@@ -849,12 +883,14 @@ static void mv88e6xxx_get_stats(struct mv88e6xxx_chip *chip, int port, · 2 unmodified lines
849883 if (chip->info->ops->stats_get_stats)
850884 count = chip->info->ops->stats_get_stats(chip, port, data);
851885
886+ mutex_lock(&chip->reg_lock);
852887 if (chip->info->ops->serdes_get_stats) {
853888 data += count;
854− mutex_lock(&chip->reg_lock);
855− chip->info->ops->serdes_get_stats(chip, port, data);
856− mutex_unlock(&chip->reg_lock);
889+ count = chip->info->ops->serdes_get_stats(chip, port, data);
857890 }
891+ data += count;
892+ mv88e6xxx_atu_vtu_get_stats(chip, port, data);
893+ mutex_unlock(&chip->reg_lock);
858894 }
859895
860896 static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
drivers/net/dsa/mv88e6xxx/chip.h+9−4
@@ -194,6 +194,11 @@ struct mv88e6xxx_port_hwtstamp { · 193 unmodified lines
194194
195195 struct mv88e6xxx_port {
196196 u64 serdes_stats[2];
197+ u64 atu_member_violation;
198+ u64 atu_miss_violation;
199+ u64 atu_full_violation;
200+ u64 vtu_member_violation;
201+ u64 vtu_miss_violation;
197202 };
198203
199204 struct mv88e6xxx_chip {
@@ -409,10 +414,10 @@ struct mv88e6xxx_ops { · 209 unmodified lines
409414
410415 /* Statistics from the SERDES interface */
411416 int (*serdes_get_sset_count)(struct mv88e6xxx_chip *chip, int port);
412− void (*serdes_get_strings)(struct mv88e6xxx_chip *chip, int port,
413− uint8_t *data);
414− void (*serdes_get_stats)(struct mv88e6xxx_chip *chip, int port,
415− uint64_t *data);
417+ int (*serdes_get_strings)(struct mv88e6xxx_chip *chip, int port,
418+ uint8_t *data);
419+ int (*serdes_get_stats)(struct mv88e6xxx_chip *chip, int port,
420+ uint64_t *data);
416421
417422 /* VLAN Translation Unit operations */
418423 int (*vtu_getnext)(struct mv88e6xxx_chip *chip,
drivers/net/dsa/mv88e6xxx/global1_atu.c+8−4
@@ -336,8 +336,6 @@ static irqreturn_t mv88e6xxx_g1_atu_prob_irq_thread_fn(int irq, void *dev_id) · 335 unmodified lines
336336 if (err)
337337 goto out;
338338
339− mutex_unlock(&chip->reg_lock);
340−
341339 if (val & MV88E6XXX_G1_ATU_OP_AGE_OUT_VIOLATION) {
342340 dev_err_ratelimited(chip->dev,
343341 "ATU age out violation for %pM\n",
@@ -348,17 +346,23 @@ static irqreturn_t mv88e6xxx_g1_atu_prob_irq_thread_fn(int irq, void *dev_id) · 4 unmodified lines
348346 dev_err_ratelimited(chip->dev,
349347 "ATU member violation for %pM portvec %x\n",
350348 entry.mac, entry.portvec);
349+ chip->ports[entry.portvec].atu_member_violation++;
351350 }
352351
353− if (val & MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION)
352+ if (val & MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION) {
354353 dev_err_ratelimited(chip->dev,
355354 "ATU miss violation for %pM portvec %x\n",
356355 entry.mac, entry.portvec);
356+ chip->ports[entry.portvec].atu_miss_violation++;
357+ }
357358
358− if (val & MV88E6XXX_G1_ATU_OP_FULL_VIOLATION)
359+ if (val & MV88E6XXX_G1_ATU_OP_FULL_VIOLATION) {
359360 dev_err_ratelimited(chip->dev,
360361 "ATU full violation for %pM portvec %x\n",
361362 entry.mac, entry.portvec);
363+ chip->ports[entry.portvec].atu_full_violation++;
364+ }
365+ mutex_unlock(&chip->reg_lock);
362366
363367 return IRQ_HANDLED;
364368
drivers/net/dsa/mv88e6xxx/global1_vtu.c+7−4
@@ -539,18 +539,21 @@ static irqreturn_t mv88e6xxx_g1_vtu_prob_irq_thread_fn(int irq, void *dev_id) · 538 unmodified lines
539539 if (err)
540540 goto out;
541541
542− mutex_unlock(&chip->reg_lock);
543−
544542 spid = val & MV88E6XXX_G1_VTU_OP_SPID_MASK;
545543
546544 if (val & MV88E6XXX_G1_VTU_OP_MEMBER_VIOLATION) {
547545 dev_err_ratelimited(chip->dev, "VTU member violation for vid %d, source port %d\n",
548546 entry.vid, spid);
547+ chip->ports[spid].vtu_member_violation++;
549548 }
550549
551− if (val & MV88E6XXX_G1_VTU_OP_MISS_VIOLATION)
552− dev_err_ratelimited(chip->dev, "VTU miss violation for vid %d, source port %d\n",
550+ if (val & MV88E6XXX_G1_VTU_OP_MISS_VIOLATION) {
551+ dev_dbg_ratelimited(chip->dev, "VTU miss violation for vid %d, source port %d\n",
553552 entry.vid, spid);
553+ chip->ports[spid].vtu_miss_violation++;
554+ }
555+
556+ mutex_unlock(&chip->reg_lock);
554557
555558 return IRQ_HANDLED;
556559
drivers/net/dsa/mv88e6xxx/serdes.c+9−6
@@ -106,20 +106,21 @@ int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port) · 105 unmodified lines
106106 return 0;
107107 }
108108
109−void mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
110− int port, uint8_t *data)
109+int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
110+ int port, uint8_t *data)
111111 {
112112 struct mv88e6352_serdes_hw_stat *stat;
113113 int i;
114114
115115 if (!mv88e6352_port_has_serdes(chip, port))
116− return;
116+ return 0;
117117
118118 for (i = 0; i < ARRAY_SIZE(mv88e6352_serdes_hw_stats); i++) {
119119 stat = &mv88e6352_serdes_hw_stats[i];
120120 memcpy(data + i * ETH_GSTRING_LEN, stat->string,
121121 ETH_GSTRING_LEN);
122122 }
123+ return ARRAY_SIZE(mv88e6352_serdes_hw_stats);
123124 }
124125
125126 static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip,
@@ -149,8 +150,8 @@ static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip, · 23 unmodified lines
149150 return val;
150151 }
151152
152−void mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
153− uint64_t *data)
153+int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
154+ uint64_t *data)
154155 {
155156 struct mv88e6xxx_port *mv88e6xxx_port = &chip->ports[port];
156157 struct mv88e6352_serdes_hw_stat *stat;
@@ -158,7 +159,7 @@ void mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, · 1 unmodified line
158159 int i;
159160
160161 if (!mv88e6352_port_has_serdes(chip, port))
161− return;
162+ return 0;
162163
163164 BUILD_BUG_ON(ARRAY_SIZE(mv88e6352_serdes_hw_stats) >
164165 ARRAY_SIZE(mv88e6xxx_port->serdes_stats));
@@ -169,6 +170,8 @@ void mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, · 4 unmodified lines
169170 mv88e6xxx_port->serdes_stats[i] += value;
170171 data[i] = mv88e6xxx_port->serdes_stats[i];
171172 }
173+
174+ return ARRAY_SIZE(mv88e6352_serdes_hw_stats);
172175 }
173176
174177 /* Set the power on/off for 10GBASE-R and 10GBASE-X4/X2 */
drivers/net/dsa/mv88e6xxx/serdes.h+4−4
@@ -45,8 +45,8 @@ · 44 unmodified lines
4545 int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
4646 int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
4747 int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
48−void mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
49− int port, uint8_t *data);
50−void mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
51− uint64_t *data);
48+int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
49+ int port, uint8_t *data);
50+int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
51+ uint64_t *data);
5252 #endif