OSDN Git Service

ice: Use ice_ena_vsi and ice_dis_vsi in DCB configuration flow
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Wed, 6 Nov 2019 10:05:27 +0000 (02:05 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 8 Nov 2019 19:58:49 +0000 (11:58 -0800)
DCB configuration flow needs to disable and enable only the PF (main)
VSI, so use ice_ena_vsi and ice_dis_vsi. To avoid the use of ifdef to
control the staticness of these functions, move them to ice_lib.c.

Also replace the allocate and copy of old_cfg to kmemdup() in
ice_pf_dcb_cfg().

Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_dcb_lib.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 f552a67..7da4ae9 100644 (file)
@@ -502,10 +502,6 @@ int ice_set_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
 int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
 void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size);
 void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
-#ifdef CONFIG_DCB
-int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked);
-void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked);
-#endif /* CONFIG_DCB */
 int ice_open(struct net_device *netdev);
 int ice_stop(struct net_device *netdev);
 
index 13da89e..baea28c 100644 (file)
@@ -150,6 +150,7 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
 {
        struct ice_dcbx_cfg *old_cfg, *curr_cfg;
        struct ice_aqc_port_ets_elem buf = { 0 };
+       struct ice_vsi *pf_vsi;
        int ret = 0;
 
        curr_cfg = &pf->hw.port_info->local_dcbx_cfg;
@@ -169,15 +170,23 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
        }
 
        /* Store old config in case FW config fails */
-       old_cfg = devm_kzalloc(&pf->pdev->dev, sizeof(*old_cfg), GFP_KERNEL);
-       memcpy(old_cfg, curr_cfg, sizeof(*old_cfg));
+       old_cfg = kmemdup(curr_cfg, sizeof(*old_cfg), GFP_KERNEL);
+       if (!old_cfg)
+               return -ENOMEM;
+
+       pf_vsi = ice_get_main_vsi(pf);
+       if (!pf_vsi) {
+               dev_dbg(&pf->pdev->dev, "PF VSI doesn't exist\n");
+               ret = -EINVAL;
+               goto free_cfg;
+       }
 
        /* avoid race conditions by holding the lock while disabling and
         * re-enabling the VSI
         */
        if (!locked)
                rtnl_lock();
-       ice_pf_dis_all_vsi(pf, true);
+       ice_dis_vsi(pf_vsi, true);
 
        memcpy(curr_cfg, new_cfg, sizeof(*curr_cfg));
        memcpy(&curr_cfg->etsrec, &curr_cfg->etscfg, sizeof(curr_cfg->etsrec));
@@ -204,10 +213,11 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
        ice_pf_dcb_recfg(pf);
 
 out:
-       ice_pf_ena_all_vsi(pf, true);
+       ice_ena_vsi(pf_vsi, true);
        if (!locked)
                rtnl_unlock();
-       devm_kfree(&pf->pdev->dev, old_cfg);
+free_cfg:
+       kfree(old_cfg);
        return ret;
 }
 
@@ -690,6 +700,7 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
        struct ice_dcbx_cfg tmp_dcbx_cfg;
        bool need_reconfig = false;
        struct ice_port_info *pi;
+       struct ice_vsi *pf_vsi;
        u8 type;
        int ret;
 
@@ -761,8 +772,14 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
                clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
        }
 
+       pf_vsi = ice_get_main_vsi(pf);
+       if (!pf_vsi) {
+               dev_dbg(&pf->pdev->dev, "PF VSI doesn't exist\n");
+               return;
+       }
+
        rtnl_lock();
-       ice_pf_dis_all_vsi(pf, true);
+       ice_dis_vsi(pf_vsi, true);
 
        ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
        if (ret) {
@@ -774,6 +791,6 @@ ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
        /* changes in configuration update VSI */
        ice_pf_dcb_recfg(pf);
 
-       ice_pf_ena_all_vsi(pf, true);
+       ice_ena_vsi(pf_vsi, true);
        rtnl_unlock();
 }
index b1e96ca..f3cfd50 100644 (file)
@@ -2041,6 +2041,62 @@ void ice_vsi_close(struct ice_vsi *vsi)
 }
 
 /**
+ * ice_ena_vsi - resume a VSI
+ * @vsi: the VSI being resume
+ * @locked: is the rtnl_lock already held
+ */
+int ice_ena_vsi(struct ice_vsi *vsi, bool locked)
+{
+       int err = 0;
+
+       if (!test_bit(__ICE_NEEDS_RESTART, vsi->state))
+               return 0;
+
+       clear_bit(__ICE_NEEDS_RESTART, vsi->state);
+
+       if (vsi->netdev && vsi->type == ICE_VSI_PF) {
+               if (netif_running(vsi->netdev)) {
+                       if (!locked)
+                               rtnl_lock();
+
+                       err = ice_open(vsi->netdev);
+
+                       if (!locked)
+                               rtnl_unlock();
+               }
+       }
+
+       return err;
+}
+
+/**
+ * ice_dis_vsi - pause a VSI
+ * @vsi: the VSI being paused
+ * @locked: is the rtnl_lock already held
+ */
+void ice_dis_vsi(struct ice_vsi *vsi, bool locked)
+{
+       if (test_bit(__ICE_DOWN, vsi->state))
+               return;
+
+       set_bit(__ICE_NEEDS_RESTART, vsi->state);
+
+       if (vsi->type == ICE_VSI_PF && vsi->netdev) {
+               if (netif_running(vsi->netdev)) {
+                       if (!locked)
+                               rtnl_lock();
+
+                       ice_stop(vsi->netdev);
+
+                       if (!locked)
+                               rtnl_unlock();
+               } else {
+                       ice_vsi_close(vsi);
+               }
+       }
+}
+
+/**
  * ice_free_res - free a block of resources
  * @res: pointer to the resource
  * @index: starting index previously returned by ice_get_res
index 8d5a797..2c5c01b 100644 (file)
@@ -62,6 +62,10 @@ int ice_vsi_release(struct ice_vsi *vsi);
 
 void ice_vsi_close(struct ice_vsi *vsi);
 
+int ice_ena_vsi(struct ice_vsi *vsi, bool locked);
+
+void ice_dis_vsi(struct ice_vsi *vsi, bool locked);
+
 int ice_free_res(struct ice_res_tracker *res, u16 index, u16 id);
 
 int
index 32684fc..5f3a692 100644 (file)
@@ -436,42 +436,11 @@ static void ice_sync_fltr_subtask(struct ice_pf *pf)
 }
 
 /**
- * ice_dis_vsi - pause a VSI
- * @vsi: the VSI being paused
- * @locked: is the rtnl_lock already held
- */
-static void ice_dis_vsi(struct ice_vsi *vsi, bool locked)
-{
-       if (test_bit(__ICE_DOWN, vsi->state))
-               return;
-
-       set_bit(__ICE_NEEDS_RESTART, vsi->state);
-
-       if (vsi->type == ICE_VSI_PF && vsi->netdev) {
-               if (netif_running(vsi->netdev)) {
-                       if (!locked)
-                               rtnl_lock();
-
-                       ice_stop(vsi->netdev);
-
-                       if (!locked)
-                               rtnl_unlock();
-               } else {
-                       ice_vsi_close(vsi);
-               }
-       }
-}
-
-/**
  * ice_pf_dis_all_vsi - Pause all VSIs on a PF
  * @pf: the PF
  * @locked: is the rtnl_lock already held
  */
-#ifdef CONFIG_DCB
-void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked)
-#else
 static void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked)
-#endif /* CONFIG_DCB */
 {
        int v;
 
@@ -4441,54 +4410,6 @@ static void ice_vsi_release_all(struct ice_pf *pf)
 }
 
 /**
- * ice_ena_vsi - resume a VSI
- * @vsi: the VSI being resume
- * @locked: is the rtnl_lock already held
- */
-static int ice_ena_vsi(struct ice_vsi *vsi, bool locked)
-{
-       int err = 0;
-
-       if (!test_bit(__ICE_NEEDS_RESTART, vsi->state))
-               return 0;
-
-       clear_bit(__ICE_NEEDS_RESTART, vsi->state);
-
-       if (vsi->netdev && vsi->type == ICE_VSI_PF) {
-               if (netif_running(vsi->netdev)) {
-                       if (!locked)
-                               rtnl_lock();
-
-                       err = ice_open(vsi->netdev);
-
-                       if (!locked)
-                               rtnl_unlock();
-               }
-       }
-
-       return err;
-}
-
-/**
- * ice_pf_ena_all_vsi - Resume all VSIs on a PF
- * @pf: the PF
- * @locked: is the rtnl_lock already held
- */
-#ifdef CONFIG_DCB
-int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked)
-{
-       int v;
-
-       ice_for_each_vsi(pf, v)
-               if (pf->vsi[v])
-                       if (ice_ena_vsi(pf->vsi[v], locked))
-                               return -EIO;
-
-       return 0;
-}
-#endif /* CONFIG_DCB */
-
-/**
  * ice_vsi_rebuild_by_type - Rebuild VSI of a given type
  * @pf: pointer to the PF instance
  * @type: VSI type to rebuild