From: Jakub Kicinski Date: Fri, 14 Dec 2018 23:01:54 +0000 (-0800) Subject: nfp: abm: allow to opt-out of RED offload X-Git-Tag: for-linus-20190104~82^2~77 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=036b9e7caeb09598afb297a6d4fb36b477a4f6b2;p=linux-block.git nfp: abm: allow to opt-out of RED offload FW team asks to be able to not support RED even if NIC is capable of buffering for testing and experimentation. Add an opt-out flag. Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe Signed-off-by: David S. Miller --- diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index ad6c2a621c7a..9584f03f3efa 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -17,6 +17,8 @@ #define NFP_NUM_BANDS_SYM_NAME "_abi_pci_dscp_num_band_%u" #define NFP_ACT_MASK_SYM_NAME "_abi_nfd_out_q_actions_%u" +#define NFP_RED_SUPPORT_SYM_NAME "_abi_nfd_out_red_offload_%u" + #define NFP_QLVL_SYM_NAME "_abi_nfd_out_q_lvls_%u%s" #define NFP_QLVL_STRIDE 16 #define NFP_QLVL_BLOG_BYTES 0 @@ -358,6 +360,12 @@ int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm) abm->pf_id = nfp_cppcore_pcie_unit(pf->cpp); + /* Check if Qdisc offloads are supported */ + res = nfp_pf_rtsym_read_optional(pf, NFP_RED_SUPPORT_SYM_NAME, 1); + if (res < 0) + return res; + abm->red_support = res; + /* Read count of prios and prio bands */ res = nfp_pf_rtsym_read_optional(pf, NFP_NUM_BANDS_SYM_NAME, 1); if (res < 0) @@ -390,6 +398,9 @@ int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm) } /* Find level and stat symbols */ + if (!abm->red_support) + return 0; + sym = nfp_abm_ctrl_find_q_rtsym(abm, NFP_QLVL_SYM_NAME, NFP_QLVL_STRIDE); if (IS_ERR(sym)) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 80e79447b644..4d4ff5844c47 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -207,6 +207,9 @@ static int nfp_abm_eswitch_set_switchdev(struct nfp_abm *abm) struct nfp_net *nn; int err; + if (!abm->red_support) + return -EOPNOTSUPP; + err = nfp_abm_ctrl_qm_enable(abm); if (err) return err; @@ -418,12 +421,26 @@ nfp_abm_port_get_stats_strings(struct nfp_app *app, struct nfp_port *port, return data; } +static int nfp_abm_fw_init_reset(struct nfp_abm *abm) +{ + unsigned int i; + + if (!abm->red_support) + return 0; + + for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++) { + __nfp_abm_ctrl_set_q_lvl(abm, i, NFP_ABM_LVL_INFINITY); + __nfp_abm_ctrl_set_q_act(abm, i, NFP_ABM_ACT_DROP); + } + + return nfp_abm_ctrl_qm_disable(abm); +} + static int nfp_abm_init(struct nfp_app *app) { struct nfp_pf *pf = app->pf; struct nfp_reprs *reprs; struct nfp_abm *abm; - unsigned int i; int err; if (!pf->eth_tbl) { @@ -460,18 +477,14 @@ static int nfp_abm_init(struct nfp_app *app) sizeof(*abm->thresholds), GFP_KERNEL); if (!abm->thresholds) goto err_free_thresh_umap; - for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++) - __nfp_abm_ctrl_set_q_lvl(abm, i, NFP_ABM_LVL_INFINITY); abm->actions = kvcalloc(abm->num_thresholds, sizeof(*abm->actions), GFP_KERNEL); if (!abm->actions) goto err_free_thresh; - for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++) - __nfp_abm_ctrl_set_q_act(abm, i, NFP_ABM_ACT_DROP); /* We start in legacy mode, make sure advanced queuing is disabled */ - err = nfp_abm_ctrl_qm_disable(abm); + err = nfp_abm_fw_init_reset(abm); if (err) goto err_free_act; diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 4dcf5881fb4b..49749c60885e 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -40,6 +40,7 @@ enum nfp_abm_q_action { * @app: back pointer to nfp_app * @pf_id: ID of our PF link * + * @red_support: is RED offload supported * @num_prios: number of supported DSCP priorities * @num_bands: number of supported DSCP priority bands * @action_mask: bitmask of supported actions @@ -63,6 +64,7 @@ struct nfp_abm { struct nfp_app *app; unsigned int pf_id; + unsigned int red_support; unsigned int num_prios; unsigned int num_bands; unsigned int action_mask;