rocker: implement get settings mode command
authorJiri Pirko <jiri@mellanox.com>
Tue, 16 Feb 2016 14:14:43 +0000 (15:14 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Feb 2016 04:08:34 +0000 (23:08 -0500)
Introduce a helper to ask HW for the port mode (world).

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/rocker/rocker_main.c

index eecbbd59acc1b74c1ff902eb4f82ea6a2ebaff90..1a99b358afd03d1bbc792e01c8db2ee442494d49 100644 (file)
@@ -1495,6 +1495,30 @@ rocker_cmd_get_port_settings_macaddr_proc(const struct rocker_port *rocker_port,
        return 0;
 }
 
+static int
+rocker_cmd_get_port_settings_mode_proc(const struct rocker_port *rocker_port,
+                                      const struct rocker_desc_info *desc_info,
+                                      void *priv)
+{
+       u8 *p_mode = priv;
+       const struct rocker_tlv *attrs[ROCKER_TLV_CMD_MAX + 1];
+       const struct rocker_tlv *info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_MAX + 1];
+       const struct rocker_tlv *attr;
+
+       rocker_tlv_parse_desc(attrs, ROCKER_TLV_CMD_MAX, desc_info);
+       if (!attrs[ROCKER_TLV_CMD_INFO])
+               return -EIO;
+
+       rocker_tlv_parse_nested(info_attrs, ROCKER_TLV_CMD_PORT_SETTINGS_MAX,
+                               attrs[ROCKER_TLV_CMD_INFO]);
+       attr = info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_MODE];
+       if (!attr)
+               return -EIO;
+
+       *p_mode = rocker_tlv_get_u8(info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_MODE]);
+       return 0;
+}
+
 struct port_name {
        char *buf;
        size_t len;
@@ -1660,6 +1684,14 @@ static int rocker_cmd_get_port_settings_macaddr(struct rocker_port *rocker_port,
                               macaddr);
 }
 
+static int rocker_cmd_get_port_settings_mode(struct rocker_port *rocker_port,
+                                            u8 *p_mode)
+{
+       return rocker_cmd_exec(rocker_port, NULL, 0,
+                              rocker_cmd_get_port_settings_prep, NULL,
+                              rocker_cmd_get_port_settings_mode_proc, p_mode);
+}
+
 static int rocker_cmd_set_port_settings_ethtool(struct rocker_port *rocker_port,
                                                struct ethtool_cmd *ecmd)
 {