dsa: mv88x6xxx: Add debugfs interface for device map
authorAndrew Lunn <andrew@lunn.ch>
Sat, 20 Jun 2015 16:42:32 +0000 (18:42 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Jun 2015 13:33:41 +0000 (06:33 -0700)
The device map is used to route packets between cascaded switches.
Add dumping a switches device map via debugfs.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx.c
drivers/net/dsa/mv88e6xxx.h

index fc5d4fdfcb02510e50f8297f4700bf46f9679af5..7e12a31e9dae4ccd0ee6e12851f6e75beb704f80 100644 (file)
@@ -1786,6 +1786,45 @@ static const struct file_operations mv88e6xxx_stats_fops = {
        .owner  = THIS_MODULE,
 };
 
+static int mv88e6xxx_device_map_show(struct seq_file *s, void *p)
+{
+       struct dsa_switch *ds = s->private;
+       struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
+       int target, ret;
+
+       seq_puts(s, "Target Port\n");
+
+       mutex_lock(&ps->smi_mutex);
+       for (target = 0; target < 32; target++) {
+               ret = _mv88e6xxx_reg_write(
+                       ds, REG_GLOBAL2, GLOBAL2_DEVICE_MAPPING,
+                       target << GLOBAL2_DEVICE_MAPPING_TARGET_SHIFT);
+               if (ret < 0)
+                       goto out;
+               ret = _mv88e6xxx_reg_read(ds, REG_GLOBAL2,
+                                         GLOBAL2_DEVICE_MAPPING);
+               seq_printf(s, "  %2d   %2d\n", target,
+                          ret & GLOBAL2_DEVICE_MAPPING_PORT_MASK);
+       }
+out:
+       mutex_unlock(&ps->smi_mutex);
+
+       return 0;
+}
+
+static int mv88e6xxx_device_map_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, mv88e6xxx_device_map_show, inode->i_private);
+}
+
+static const struct file_operations mv88e6xxx_device_map_fops = {
+       .open   = mv88e6xxx_device_map_open,
+       .read   = seq_read,
+       .llseek = no_llseek,
+       .release = single_release,
+       .owner  = THIS_MODULE,
+};
+
 int mv88e6xxx_setup_common(struct dsa_switch *ds)
 {
        struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
@@ -1812,6 +1851,8 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds)
        debugfs_create_file("stats", S_IRUGO, ps->dbgfs, ds,
                            &mv88e6xxx_stats_fops);
 
+       debugfs_create_file("device_map", S_IRUGO, ps->dbgfs, ds,
+                           &mv88e6xxx_device_map_fops);
        return 0;
 }
 
index 7cccff20258643f394166bff06a20fcb5c4933a4..a2c9ac0c54ab047d72699dc4d50e447da0266b5e 100644 (file)
 #define GLOBAL2_DEVICE_MAPPING 0x06
 #define GLOBAL2_DEVICE_MAPPING_UPDATE          BIT(15)
 #define GLOBAL2_DEVICE_MAPPING_TARGET_SHIFT    8
+#define GLOBAL2_DEVICE_MAPPING_PORT_MASK       0x0f
 #define GLOBAL2_TRUNK_MASK     0x07
 #define GLOBAL2_TRUNK_MASK_UPDATE              BIT(15)
 #define GLOBAL2_TRUNK_MASK_NUM_SHIFT           12