[U-Boot] [PATCH 09/11 v2] drivers/net/vsc9953: Add command for shared/private VLAN learning

Joe Hershberger joe.hershberger at gmail.com
Fri Jun 26 00:41:14 CEST 2015


Hi Codrin,

On Tue, Jun 23, 2015 at 11:48 AM, Codrin Ciubotariu
<codrin.ciubotariu at freescale.com> wrote:
> The command:
> ethsw vlan fdb { [help] | show | shared | private }
>  - make VLAN learning shared or private"
>
> configures the FDB to share the FDB entries learned on multiple VLANs
> or to keep them separated. By default, the FBD uses private VLAN
> learning.
>
> Signed-off-by: Johnson Leung <johnson.leung at freescale.com>
> Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu at freescale.com>
> ---
> Changes for v2:
>         - removed Change-id field;
>
>  drivers/net/vsc9953.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/vsc9953.h     |   3 +
>  2 files changed, 158 insertions(+)
>
> diff --git a/drivers/net/vsc9953.c b/drivers/net/vsc9953.c
> index b78a941..3129b03 100644
> --- a/drivers/net/vsc9953.c
> +++ b/drivers/net/vsc9953.c
> @@ -1503,6 +1503,58 @@ static void vsc9953_mac_table_flush(int port, int vid)
>         vsc9953_mac_table_age(port, vid);
>  }
>
> +/* VSC9953 VLAN learning modes */
> +enum vlan_learning_mode {
> +       SHARED_VLAN_LEARNING,
> +       PRIVATE_VLAN_LEARNING,
> +};
> +
> +/* Set VLAN learning mode for VSC9953 */
> +static void vsc9953_vlan_learning_set(enum vlan_learning_mode lrn_mode)
> +{
> +       struct vsc9953_analyzer         *l2ana_reg;

Use a single space.

> +
> +       l2ana_reg = (struct vsc9953_analyzer *)(VSC9953_OFFSET +
> +                       VSC9953_ANA_OFFSET);
> +
> +       switch (lrn_mode) {
> +       case SHARED_VLAN_LEARNING:
> +               setbits_le32(&l2ana_reg->ana.agen_ctrl,
> +                            CONFIG_VSC9953_FID_MASK_ALL);
> +               break;
> +       case PRIVATE_VLAN_LEARNING:
> +               clrbits_le32(&l2ana_reg->ana.agen_ctrl,
> +                            CONFIG_VSC9953_FID_MASK_ALL);
> +               break;
> +       default:
> +               printf("Unknown VLAN learn mode\n");
> +       }
> +}
> +
> +/* Get VLAN learning mode for VSC9953 */
> +static int vsc9953_vlan_learning_get(enum vlan_learning_mode *lrn_mode)
> +{
> +       u32                             val;
> +       struct vsc9953_analyzer         *l2ana_reg;
> +
> +       l2ana_reg = (struct vsc9953_analyzer *)(VSC9953_OFFSET +
> +                       VSC9953_ANA_OFFSET);
> +
> +       val = in_le32(&l2ana_reg->ana.agen_ctrl);
> +
> +       if (!(val & CONFIG_VSC9953_FID_MASK_ALL)) {
> +               *lrn_mode = PRIVATE_VLAN_LEARNING;
> +       } else if ((val & CONFIG_VSC9953_FID_MASK_ALL) ==
> +                       CONFIG_VSC9953_FID_MASK_ALL) {
> +               *lrn_mode = SHARED_VLAN_LEARNING;
> +       } else {
> +               printf("Unknown VLAN learning mode\n");
> +               return -EINVAL;

Please use:
+               return CMD_RET_FAILURE;

> +       }
> +
> +       return 0;

Please use:
+       return CMD_RET_SUCCESS;

> +}
> +
>  enum egress_vlan_tag {
>         EGR_TAG_CLASS = 0,
>         EGR_TAG_PVID,
> @@ -1572,6 +1624,8 @@ enum keyword_id {
>         id_egress,
>         id_tag,
>         id_classified,
> +       id_shared,
> +       id_private,
>         id_count,       /* keep last */
>  };
>
> @@ -1868,6 +1922,61 @@ static int vsc9953_vlan_set_key_func(struct command_def *parsed_cmd)
>         return 0;
>  }
>
> +#define VSC9953_VLAN_FDB_HELP "ethsw vlan fdb " \
> +"{ [help] | show | shared | private } " \
> +"- make VLAN learning shared or private"
> +
> +static int vsc9953_vlan_learn_help_key_func(struct command_def *parsed_cmd)
> +{
> +       printf(VSC9953_VLAN_FDB_HELP"\n");
> +
> +       return 0;

Please use:
+       return CMD_RET_SUCCESS;

> +}
> +
> +static int vsc9953_vlan_learn_show_key_func(struct command_def *parsed_cmd)
> +{
> +       int                             rc;
> +       enum vlan_learning_mode         mode;
> +
> +       rc = vsc9953_vlan_learning_get(&mode);
> +       if (rc)
> +               goto __out_return;
> +
> +       switch (mode) {
> +       case SHARED_VLAN_LEARNING:
> +               printf("VLAN learning mode: shared\n");
> +               break;
> +       case PRIVATE_VLAN_LEARNING:
> +               printf("VLAN learning mode: private\n");
> +               break;
> +       default:
> +               printf("Unknown VLAN learning mode\n");
> +               rc = -EINVAL;

Please use:
+              rc =CMD_RET_FAILURE;

> +       }
> +
> +__out_return:
> +       return rc;
> +}
> +
> +static int vsc9953_vlan_learn_set_key_func(struct command_def *parsed_cmd)
> +{
> +       enum vlan_learning_mode         mode;
> +
> +       /* keywords for shared/private are the last in the array */
> +       if (parsed_cmd->cmd_to_keywords[parsed_cmd->cmd_keywords_nr - 1] ==
> +           id_shared)
> +               mode = SHARED_VLAN_LEARNING;
> +       else if (parsed_cmd->cmd_to_keywords[parsed_cmd->cmd_keywords_nr - 1] ==
> +                id_private)
> +               mode = PRIVATE_VLAN_LEARNING;
> +       else
> +               return -1;

Please use:
+               return CMD_RET_USAGE;

> +
> +       vsc9953_vlan_learning_set(mode);
> +
> +       return 0;

Please use:
+       return CMD_RET_SUCCESS;

> +}
> +
>  #define VSC9953_PORT_UNTAG_HELP "ethsw [port <port_no>] untagged " \
>  "{ [help] | show | all | none | pvid } " \
>  " - set egress tagging mod for a port"
> @@ -2331,6 +2440,45 @@ struct keywords_to_function {
>                                         id_key_end,
>                         },
>                         .keyword_function = &vsc9953_fdb_entry_del_key_func,
> +               }, {
> +                       .cmd_keyword = {
> +                                       id_vlan,
> +                                       id_fdb,
> +                                       id_key_end,
> +                       },
> +                       .keyword_function = &vsc9953_vlan_learn_help_key_func,
> +               }, {
> +                       .cmd_keyword = {
> +                                       id_vlan,
> +                                       id_fdb,
> +                                       id_help,
> +                                       id_key_end,
> +                       },
> +                       .keyword_function = &vsc9953_vlan_learn_help_key_func,
> +               }, {
> +                       .cmd_keyword = {
> +                                       id_vlan,
> +                                       id_fdb,
> +                                       id_show,
> +                                       id_key_end,
> +                       },
> +                       .keyword_function = &vsc9953_vlan_learn_show_key_func,
> +               }, {
> +                       .cmd_keyword = {
> +                                       id_vlan,
> +                                       id_fdb,
> +                                       id_shared,
> +                                       id_key_end,
> +                       },
> +                       .keyword_function = &vsc9953_vlan_learn_set_key_func,
> +               }, {
> +                       .cmd_keyword = {
> +                                       id_vlan,
> +                                       id_fdb,
> +                                       id_private,
> +                                       id_key_end,
> +                       },
> +                       .keyword_function = &vsc9953_vlan_learn_set_key_func,
>                 },
>  };
>
> @@ -2447,6 +2595,12 @@ struct keyword_def {
>                 }, {
>                                 .keyword_name = "classified",
>                                 .match = &keyword_match_gen,
> +               }, {
> +                               .keyword_name = "shared",
> +                               .match = &keyword_match_gen,
> +               }, {
> +                               .keyword_name = "private",
> +                               .match = &keyword_match_gen,
>                 },
>  };
>
> @@ -2770,6 +2924,7 @@ U_BOOT_CMD(ethsw, VSC9953_MAX_CMD_PARAMS, 0, do_ethsw,
>            VSC9953_PVID_HELP"\n"
>            VSC9953_PORT_UNTAG_HELP"\n"
>            VSC9953_EGR_VLAN_TAG_HELP"\n"
> +          VSC9953_VLAN_FDB_HELP"\n"
>  );
>
>  #endif /* CONFIG_VSC9953_CMD */
> diff --git a/include/vsc9953.h b/include/vsc9953.h
> index 6eb22a9..26a08aa 100644
> --- a/include/vsc9953.h
> +++ b/include/vsc9953.h
> @@ -142,6 +142,9 @@
>  /* Macros for vsc9953_qsys_sys.switch_port_mode register */
>  #define CONFIG_VSC9953_PORT_ENA                0x00002000
>
> +/* Macros for vsc9953_ana_ana.agen_ctrl register */
> +#define CONFIG_VSC9953_FID_MASK_ALL    0x00fff000
> +
>  /* Macros for vsc9953_ana_ana.adv_learn register */
>  #define CONFIG_VSC9953_VLAN_CHK                0x00000400
>
> --
> 1.9.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot


More information about the U-Boot mailing list