]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ice: Add feature bitmap, helpers and a check for DSCP
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Fri, 16 Jul 2021 22:16:41 +0000 (15:16 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 28 Sep 2021 16:42:04 +0000 (09:42 -0700)
DSCP a.k.a L3 QoS is only supported on certain devices. To enforce this,
this patch introduces a bitmap of features and helper functions.

The feature bitmap is set based on device IDs on driver init. Currently,
DSCP is the only feature in this bitmap, but there will be more in the
future. In the DCB netlink flow, check if the feature bit is set before
exercising DSCP.

Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Gurucharan G <gurucharanx.g@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_dcb_nl.c
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_lib.h
drivers/net/ethernet/intel/ice/ice_main.c

index 3c4f08d20414e063c59e69f6a96483fe2ea141bd..83413772b00c61c2f9f7596f50f53a3b2a24aab9 100644 (file)
 
 #define ice_pf_to_dev(pf) (&((pf)->pdev->dev))
 
+enum ice_feature {
+       ICE_F_DSCP,
+       ICE_F_MAX
+};
+
 struct ice_txq_meta {
        u32 q_teid;     /* Tx-scheduler element identifier */
        u16 q_id;       /* Entry in VSI's txq_map bitmap */
@@ -443,6 +448,7 @@ struct ice_pf {
        /* used to ratelimit the MDD event logging */
        unsigned long last_printed_mdd_jiffies;
        DECLARE_BITMAP(malvfs, ICE_MAX_VF_COUNT);
+       DECLARE_BITMAP(features, ICE_F_MAX);
        DECLARE_BITMAP(state, ICE_STATE_NBITS);
        DECLARE_BITMAP(flags, ICE_PF_FLAGS_NBITS);
        unsigned long *avail_txqs;      /* bitmap to track PF Tx queue usage */
index 0121dbc62c8a1f3032c5658af6339fbdc52de2d2..7fdeb411b6df44063b9bf74db5840d9d0a4c51ed 100644 (file)
@@ -710,6 +710,9 @@ static int ice_dcbnl_setapp(struct net_device *netdev, struct dcb_app *app)
        if (!(pf->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
                return -EINVAL;
 
+       if (!ice_is_feature_supported(pf, ICE_F_DSCP))
+               return -EOPNOTSUPP;
+
        if (app->protocol >= ICE_DSCP_NUM_VAL) {
                netdev_err(netdev, "DSCP value 0x%04X out of range\n",
                           app->protocol);
@@ -861,8 +864,9 @@ static int ice_dcbnl_delapp(struct net_device *netdev, struct dcb_app *app)
                new_cfg->app[j].priority = old_cfg->app[j + 1].priority;
        }
 
-       /* if not a DSCP APP TLV, then we are done */
-       if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP) {
+       /* if not a DSCP APP TLV or DSCP is not supported, we are done */
+       if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP ||
+           !ice_is_feature_supported(pf, ICE_F_DSCP)) {
                ret = ICE_DCB_HW_CHG;
                goto delapp_out;
        }
index dde9802c6c72903302e74a9921b6d34576fd16c1..3adbd9a179a7b436776ce0f9f31ba89f87ee479f 100644 (file)
@@ -3573,3 +3573,50 @@ int ice_set_link(struct ice_vsi *vsi, bool ena)
 
        return 0;
 }
+
+/**
+ * ice_is_feature_supported
+ * @pf: pointer to the struct ice_pf instance
+ * @f: feature enum to be checked
+ *
+ * returns true if feature is supported, false otherwise
+ */
+bool ice_is_feature_supported(struct ice_pf *pf, enum ice_feature f)
+{
+       if (f < 0 || f >= ICE_F_MAX)
+               return false;
+
+       return test_bit(f, pf->features);
+}
+
+/**
+ * ice_set_feature_support
+ * @pf: pointer to the struct ice_pf instance
+ * @f: feature enum to set
+ */
+static void ice_set_feature_support(struct ice_pf *pf, enum ice_feature f)
+{
+       if (f < 0 || f >= ICE_F_MAX)
+               return;
+
+       set_bit(f, pf->features);
+}
+
+/**
+ * ice_init_feature_support
+ * @pf: pointer to the struct ice_pf instance
+ *
+ * called during init to setup supported feature
+ */
+void ice_init_feature_support(struct ice_pf *pf)
+{
+       switch (pf->hw.device_id) {
+       case ICE_DEV_ID_E810C_BACKPLANE:
+       case ICE_DEV_ID_E810C_QSFP:
+       case ICE_DEV_ID_E810C_SFP:
+               ice_set_feature_support(pf, ICE_F_DSCP);
+               break;
+       default:
+               break;
+       }
+}
index d5a28bf0fc2ccc40a361e8cdd7f3615f68490695..4512c8513178dd196b904b18c4a12f8804b1da84 100644 (file)
@@ -116,4 +116,6 @@ bool ice_is_vsi_dflt_vsi(struct ice_sw *sw, struct ice_vsi *vsi);
 int ice_set_dflt_vsi(struct ice_sw *sw, struct ice_vsi *vsi);
 
 int ice_clear_dflt_vsi(struct ice_sw *sw);
+bool ice_is_feature_supported(struct ice_pf *pf, enum ice_feature f);
+void ice_init_feature_support(struct ice_pf *pf);
 #endif /* !_ICE_LIB_H_ */
index 7e477f1175504b6bb66dca411ace44c748e4db48..ab15862a66af56bd8875d995cced0d0b3add4a0b 100644 (file)
@@ -4270,6 +4270,8 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
                goto err_exit_unroll;
        }
 
+       ice_init_feature_support(pf);
+
        ice_request_fw(pf);
 
        /* if ice_request_fw fails, ICE_FLAG_ADV_FEATURES bit won't be