Re: [PATCH net-next 1/5] net: hns3: add support config dscp map to tc

From: Paolo Abeni
Date: Tue Sep 06 2022 - 09:12:57 EST


On Mon, 2022-09-05 at 16:15 +0800, Guangbin Huang wrote:
> This patch add support config dscp map to tc by implementing ieee_setapp
> and ieee_delapp of struct dcbnl_rtnl_ops. Driver will convert mapping
> relationship from dscp-prio to dscp-tc.
>
> Signed-off-by: Guangbin Huang <huangguangbin2@xxxxxxxxxx>
> ---
> drivers/net/ethernet/hisilicon/hns3/hnae3.h | 10 ++
> .../net/ethernet/hisilicon/hns3/hns3_dcbnl.c | 28 +++++
> .../hisilicon/hns3/hns3pf/hclge_dcb.c | 107 ++++++++++++++++++
> .../hisilicon/hns3/hns3pf/hclge_dcb.h | 3 +
> .../hisilicon/hns3/hns3pf/hclge_main.c | 1 +
> .../hisilicon/hns3/hns3pf/hclge_main.h | 4 +
> .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 50 +++++++-
> .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 5 +
> 8 files changed, 207 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
> index 795df7111119..33b5ac47f342 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
> @@ -310,6 +310,11 @@ enum hnae3_dbg_cmd {
> HNAE3_DBG_CMD_UNKNOWN,
> };
>
> +enum hnae3_tc_map_mode {
> + HNAE3_TC_MAP_MODE_PRIO,
> + HNAE3_TC_MAP_MODE_DSCP,
> +};
> +
> struct hnae3_vector_info {
> u8 __iomem *io_addr;
> int vector;
> @@ -739,6 +744,8 @@ struct hnae3_ae_ops {
> int (*get_link_diagnosis_info)(struct hnae3_handle *handle,
> u32 *status_code);
> void (*clean_vf_config)(struct hnae3_ae_dev *ae_dev, int num_vfs);
> + int (*get_dscp_prio)(struct hnae3_handle *handle, u8 dscp,
> + u8 *tc_map_mode, u8 *priority);
> };
>
> struct hnae3_dcb_ops {
> @@ -747,6 +754,8 @@ struct hnae3_dcb_ops {
> int (*ieee_setets)(struct hnae3_handle *, struct ieee_ets *);
> int (*ieee_getpfc)(struct hnae3_handle *, struct ieee_pfc *);
> int (*ieee_setpfc)(struct hnae3_handle *, struct ieee_pfc *);
> + int (*ieee_setapp)(struct hnae3_handle *h, struct dcb_app *app);
> + int (*ieee_delapp)(struct hnae3_handle *h, struct dcb_app *app);
>
> /* DCBX configuration */
> u8 (*getdcbx)(struct hnae3_handle *);
> @@ -786,6 +795,7 @@ struct hnae3_knic_private_info {
> u32 tx_spare_buf_size;
>
> struct hnae3_tc_info tc_info;
> + u8 tc_map_mode;
>
> u16 num_tqps; /* total number of TQPs in this handle */
> struct hnae3_queue **tqp; /* array base of all TQPs in this instance */
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c b/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c
> index d2ec4c573bf8..3b6dbf158b98 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c
> @@ -56,6 +56,32 @@ static int hns3_dcbnl_ieee_setpfc(struct net_device *ndev, struct ieee_pfc *pfc)
> return -EOPNOTSUPP;
> }
>
> +static int hns3_dcbnl_ieee_setapp(struct net_device *ndev, struct dcb_app *app)
> +{
> + struct hnae3_handle *h = hns3_get_handle(ndev);
> +
> + if (hns3_nic_resetting(ndev))
> + return -EBUSY;
> +
> + if (h->kinfo.dcb_ops->ieee_setapp)
> + return h->kinfo.dcb_ops->ieee_setapp(h, app);
> +
> + return -EOPNOTSUPP;
> +}
> +
> +static int hns3_dcbnl_ieee_delapp(struct net_device *ndev, struct dcb_app *app)
> +{
> + struct hnae3_handle *h = hns3_get_handle(ndev);
> +
> + if (hns3_nic_resetting(ndev))
> + return -EBUSY;
> +
> + if (h->kinfo.dcb_ops->ieee_setapp)
> + return h->kinfo.dcb_ops->ieee_delapp(h, app);
> +
> + return -EOPNOTSUPP;
> +}
> +
> /* DCBX configuration */
> static u8 hns3_dcbnl_getdcbx(struct net_device *ndev)
> {
> @@ -83,6 +109,8 @@ static const struct dcbnl_rtnl_ops hns3_dcbnl_ops = {
> .ieee_setets = hns3_dcbnl_ieee_setets,
> .ieee_getpfc = hns3_dcbnl_ieee_getpfc,
> .ieee_setpfc = hns3_dcbnl_ieee_setpfc,
> + .ieee_setapp = hns3_dcbnl_ieee_setapp,
> + .ieee_delapp = hns3_dcbnl_ieee_delapp,
> .getdcbx = hns3_dcbnl_getdcbx,
> .setdcbx = hns3_dcbnl_setdcbx,
> };
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
> index 69b8673436ca..7fcacc76e749 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
> @@ -359,6 +359,111 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
> return hclge_notify_client(hdev, HNAE3_UP_CLIENT);
> }
>
> +static int hclge_ieee_setapp(struct hnae3_handle *h, struct dcb_app *app)
> +{
> + struct hclge_vport *vport = hclge_get_vport(h);
> + struct net_device *netdev = h->kinfo.netdev;
> + struct hclge_dev *hdev = vport->back;
> + struct dcb_app old_app;
> + int ret;
> +
> + if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP ||
> + app->protocol >= HCLGE_MAX_DSCP ||
> + app->priority >= HNAE3_MAX_USER_PRIO)
> + return -EINVAL;
> +
> + dev_info(&hdev->pdev->dev, "setapp dscp=%u priority=%u\n",
> + app->protocol, app->priority);
> +
> + if (app->priority == hdev->tm_info.dscp_prio[app->protocol])
> + return 0;
> +
> + ret = dcb_ieee_setapp(netdev, app);
> + if (ret)
> + return ret;
> +
> + old_app.selector = IEEE_8021QAZ_APP_SEL_DSCP;
> + old_app.protocol = app->protocol;
> + old_app.priority = hdev->tm_info.dscp_prio[app->protocol];
> +
> + hdev->tm_info.dscp_prio[app->protocol] = app->priority;
> + ret = hclge_dscp_to_tc_map(hdev);
> + if (ret) {
> + dev_err(&hdev->pdev->dev,
> + "failed to set dscp to tc map, ret = %d\n", ret);
> + hdev->tm_info.dscp_prio[app->protocol] = old_app.priority;
> + (void)dcb_ieee_delapp(netdev, app);
> + return ret;
> + }
> +
> + vport->nic.kinfo.tc_map_mode = HNAE3_TC_MAP_MODE_DSCP;
> + if (old_app.priority == HCLGE_PRIO_ID_INVALID)
> + hdev->tm_info.dscp_app_cnt++;
> + else
> + ret = dcb_ieee_delapp(netdev, &old_app);
> +
> + return ret;
> +}
> +
> +static int hclge_ieee_delapp(struct hnae3_handle *h, struct dcb_app *app)
> +{
> + struct hclge_vport *vport = hclge_get_vport(h);
> + struct net_device *netdev = h->kinfo.netdev;
> + struct hclge_dev *hdev = vport->back;
> + int ret;
> +
> + if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP ||
> + app->protocol >= HCLGE_MAX_DSCP ||
> + app->priority >= HNAE3_MAX_USER_PRIO ||
> + app->priority != hdev->tm_info.dscp_prio[app->protocol])
> + return -EINVAL;
> +
> + dev_info(&hdev->pdev->dev, "delapp dscp=%u priority=%u\n",
> + app->protocol, app->priority);
> +
> + ret = dcb_ieee_delapp(netdev, app);
> + if (ret)
> + return ret;
> +
> + hdev->tm_info.dscp_prio[app->protocol] = HCLGE_PRIO_ID_INVALID;
> + ret = hclge_dscp_to_tc_map(hdev);
> + if (ret) {
> + dev_err(&hdev->pdev->dev,
> + "failed to del dscp to tc map, ret = %d\n", ret);
> + hdev->tm_info.dscp_prio[app->protocol] = app->priority;
> + (void)dcb_ieee_setapp(netdev, app);
> + return ret;
> + }
> +
> + if (hdev->tm_info.dscp_app_cnt)
> + hdev->tm_info.dscp_app_cnt--;
> +
> + if (!hdev->tm_info.dscp_app_cnt) {
> + vport->nic.kinfo.tc_map_mode = HNAE3_TC_MAP_MODE_PRIO;
> + ret = hclge_up_to_tc_map(hdev);
> + }
> +
> + return ret;
> +}
> +
> +int hclge_get_dscp_prio(struct hnae3_handle *h, u8 dscp, u8 *tc_mode,
> + u8 *priority)
> +{
> + struct hclge_vport *vport = hclge_get_vport(h);
> + struct hclge_dev *hdev = vport->back;
> +
> + if (dscp >= HCLGE_MAX_DSCP)
> + return -EINVAL;
> +
> + if (tc_mode)
> + *tc_mode = vport->nic.kinfo.tc_map_mode;
> + if (priority)
> + *priority = hdev->tm_info.dscp_prio[dscp] == HCLGE_PRIO_ID_INVALID ? 0 :
> + hdev->tm_info.dscp_prio[dscp];
> +
> + return 0;
> +}
> +
> /* DCBX configuration */
> static u8 hclge_getdcbx(struct hnae3_handle *h)
> {
> @@ -543,6 +648,8 @@ static const struct hnae3_dcb_ops hns3_dcb_ops = {
> .ieee_setets = hclge_ieee_setets,
> .ieee_getpfc = hclge_ieee_getpfc,
> .ieee_setpfc = hclge_ieee_setpfc,
> + .ieee_setapp = hclge_ieee_setapp,
> + .ieee_delapp = hclge_ieee_delapp,
> .getdcbx = hclge_getdcbx,
> .setdcbx = hclge_setdcbx,
> .setup_tc = hclge_setup_tc,
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.h
> index b04702e65689..17a5460e7ea9 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.h
> @@ -12,4 +12,7 @@ void hclge_dcb_ops_set(struct hclge_dev *hdev);
> static inline void hclge_dcb_ops_set(struct hclge_dev *hdev) {}
> #endif
>
> +int hclge_get_dscp_prio(struct hnae3_handle *h, u8 dscp, u8 *tc_mode,
> + u8 *priority);
> +
> #endif /* __HCLGE_DCB_H__ */
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> index fcdc978379ff..f43c7d392d1a 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> @@ -12907,6 +12907,7 @@ static const struct hnae3_ae_ops hclge_ops = {
> .get_ts_info = hclge_ptp_get_ts_info,
> .get_link_diagnosis_info = hclge_get_link_diagnosis_info,
> .clean_vf_config = hclge_clean_vport_config,
> + .get_dscp_prio = hclge_get_dscp_prio,

This brings in an implicit dependency on CONFIG_HNS3_DCB, causing the
build error reported by the intel bot.

Please, address the above, thanks!

Paolo