drivers/net/vsc9953: Add commands to manipulate the FDB for VSC9953

The new command:
ethsw [port <port_no>] [vlan <vid>] fdb
        { [help] | show | flush | { add | del } <mac> }

Can be used to add and delete FDB entries. Also, the command can be used
to show entries from the FDB tables. When used with [port <port_no>]
and [vlan <vid>], only the matching the FDB entries can be seen or
flushed. The command has also been added to the generic ethsw parser
from cmd_ethsw.c.

Signed-off-by: Johnson Leung <johnson.leung@freescale.com>
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@freescale.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: York Sun <yorksun@freescale.com>
diff --git a/include/ethsw.h b/include/ethsw.h
index 6d2f0de..5159031 100644
--- a/include/ethsw.h
+++ b/include/ethsw.h
@@ -11,6 +11,7 @@
 
 #define ETHSW_MAX_CMD_PARAMS 20
 #define ETHSW_CMD_PORT_ALL -1
+#define ETHSW_CMD_VLAN_ALL -1
 
 /* IDs used to track keywords in a command */
 enum ethsw_keyword_id {
@@ -24,11 +25,19 @@
 	ethsw_id_clear,
 	ethsw_id_learning,
 	ethsw_id_auto,
+	ethsw_id_vlan,
+	ethsw_id_fdb,
+	ethsw_id_add,
+	ethsw_id_del,
+	ethsw_id_flush,
 	ethsw_id_count,	/* keep last */
 };
 
 enum ethsw_keyword_opt_id {
 	ethsw_id_port_no = ethsw_id_count + 1,
+	ethsw_id_vlan_no,
+	ethsw_id_add_del_no,
+	ethsw_id_add_del_mac,
 	ethsw_id_count_all,	/* keep last */
 };
 
@@ -36,6 +45,8 @@
 	int cmd_to_keywords[ETHSW_MAX_CMD_PARAMS];
 	int cmd_keywords_nr;
 	int port;
+	int vid;
+	uchar ethaddr[6];
 	int (*cmd_function)(struct ethsw_command_def *parsed_cmd);
 };
 
@@ -49,6 +60,10 @@
 	int (*port_stats_clear)(struct ethsw_command_def *parsed_cmd);
 	int (*port_learn)(struct ethsw_command_def *parsed_cmd);
 	int (*port_learn_show)(struct ethsw_command_def *parsed_cmd);
+	int (*fdb_show)(struct ethsw_command_def *parsed_cmd);
+	int (*fdb_flush)(struct ethsw_command_def *parsed_cmd);
+	int (*fdb_entry_add)(struct ethsw_command_def *parsed_cmd);
+	int (*fdb_entry_del)(struct ethsw_command_def *parsed_cmd);
 };
 
 int ethsw_define_functions(const struct ethsw_command_func *cmd_func);
diff --git a/include/vsc9953.h b/include/vsc9953.h
index 49215e6..df1c709 100644
--- a/include/vsc9953.h
+++ b/include/vsc9953.h
@@ -86,6 +86,25 @@
 #define VSC9953_VCAP_MV_CFG		0x0000ffff
 #define VSC9953_VCAP_UPDATE_CTRL	0x01000004
 
+/* Macros for register vsc9953_ana_ana_tables.mac_access register */
+#define VSC9953_MAC_CMD_IDLE		0x00000000
+#define VSC9953_MAC_CMD_LEARN		0x00000001
+#define VSC9953_MAC_CMD_FORGET		0x00000002
+#define VSC9953_MAC_CMD_AGE		0x00000003
+#define VSC9953_MAC_CMD_NEXT		0x00000004
+#define VSC9953_MAC_CMD_READ		0x00000006
+#define VSC9953_MAC_CMD_WRITE		0x00000007
+#define VSC9953_MAC_CMD_MASK		0x00000007
+#define VSC9953_MAC_CMD_VALID		0x00000800
+#define VSC9953_MAC_ENTRYTYPE_NORMAL	0x00000000
+#define VSC9953_MAC_ENTRYTYPE_LOCKED	0x00000200
+#define VSC9953_MAC_ENTRYTYPE_IPV4MCAST	0x00000400
+#define VSC9953_MAC_ENTRYTYPE_IPV6MCAST	0x00000600
+#define VSC9953_MAC_ENTRYTYPE_MASK	0x00000600
+#define VSC9953_MAC_DESTIDX_MASK	0x000001f8
+#define VSC9953_MAC_VID_MASK		0x1fff0000
+#define VSC9953_MAC_MACH_MASK		0x0000ffff
+
 /* Macros for vsc9953_ana_port.vlan_cfg register */
 #define VSC9953_VLAN_CFG_AWARE_ENA	0x00100000
 #define VSC9953_VLAN_CFG_POP_CNT_MASK	0x000c0000
@@ -124,6 +143,15 @@
 #define VSC9953_TAG_CFG_ALL_BUT_ZERO		0x00000100
 #define VSC9953_TAG_CFG_ALL		0x00000180
 
+/* Macros for vsc9953_ana_ana.anag_efil register */
+#define VSC9953_AGE_PORT_EN		0x00080000
+#define VSC9953_AGE_PORT_MASK		0x0007c000
+#define VSC9953_AGE_VID_EN		0x00002000
+#define VSC9953_AGE_VID_MASK		0x00001fff
+
+/* Macros for vsc9953_ana_ana_tables.mach_data register */
+#define VSC9953_MACHDATA_VID_MASK	0x1fff0000
+
 #define VSC9953_MAX_PORTS		10
 #define VSC9953_PORT_CHECK(port)	\
 	(((port) < 0 || (port) >= VSC9953_MAX_PORTS) ? 0 : 1)