]> Git Repo - J-linux.git/blobdiff - drivers/net/ethernet/intel/ice/ice_main.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[J-linux.git] / drivers / net / ethernet / intel / ice / ice_main.c
index 6d256dbcb77d0f1172b7dcc86178addb671482ff..33a164fa325ac02527b0779a4f2e9614c2998dfc 100644 (file)
@@ -613,7 +613,7 @@ skip:
        ice_pf_dis_all_vsi(pf, false);
 
        if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
-               ice_ptp_prepare_for_reset(pf);
+               ice_ptp_prepare_for_reset(pf, reset_type);
 
        if (ice_is_feature_supported(pf, ICE_F_GNSS))
                ice_gnss_exit(pf);
@@ -1649,8 +1649,10 @@ static void ice_clean_sbq_subtask(struct ice_pf *pf)
 {
        struct ice_hw *hw = &pf->hw;
 
-       /* Nothing to do here if sideband queue is not supported */
-       if (!ice_is_sbq_supported(hw)) {
+       /* if mac_type is not generic, sideband is not supported
+        * and there's nothing to do here
+        */
+       if (!ice_is_generic_mac(hw)) {
                clear_bit(ICE_SIDEBANDQ_EVENT_PENDING, pf->state);
                return;
        }
@@ -4572,90 +4574,6 @@ static void ice_decfg_netdev(struct ice_vsi *vsi)
        vsi->netdev = NULL;
 }
 
-static int ice_start_eth(struct ice_vsi *vsi)
-{
-       int err;
-
-       err = ice_init_mac_fltr(vsi->back);
-       if (err)
-               return err;
-
-       err = ice_vsi_open(vsi);
-       if (err)
-               ice_fltr_remove_all(vsi);
-
-       return err;
-}
-
-static void ice_stop_eth(struct ice_vsi *vsi)
-{
-       ice_fltr_remove_all(vsi);
-       ice_vsi_close(vsi);
-}
-
-static int ice_init_eth(struct ice_pf *pf)
-{
-       struct ice_vsi *vsi = ice_get_main_vsi(pf);
-       int err;
-
-       if (!vsi)
-               return -EINVAL;
-
-       /* init channel list */
-       INIT_LIST_HEAD(&vsi->ch_list);
-
-       err = ice_cfg_netdev(vsi);
-       if (err)
-               return err;
-       /* Setup DCB netlink interface */
-       ice_dcbnl_setup(vsi);
-
-       err = ice_init_mac_fltr(pf);
-       if (err)
-               goto err_init_mac_fltr;
-
-       err = ice_devlink_create_pf_port(pf);
-       if (err)
-               goto err_devlink_create_pf_port;
-
-       SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port);
-
-       err = ice_register_netdev(vsi);
-       if (err)
-               goto err_register_netdev;
-
-       err = ice_tc_indir_block_register(vsi);
-       if (err)
-               goto err_tc_indir_block_register;
-
-       ice_napi_add(vsi);
-
-       return 0;
-
-err_tc_indir_block_register:
-       ice_unregister_netdev(vsi);
-err_register_netdev:
-       ice_devlink_destroy_pf_port(pf);
-err_devlink_create_pf_port:
-err_init_mac_fltr:
-       ice_decfg_netdev(vsi);
-       return err;
-}
-
-static void ice_deinit_eth(struct ice_pf *pf)
-{
-       struct ice_vsi *vsi = ice_get_main_vsi(pf);
-
-       if (!vsi)
-               return;
-
-       ice_vsi_close(vsi);
-       ice_unregister_netdev(vsi);
-       ice_devlink_destroy_pf_port(pf);
-       ice_tc_indir_block_unregister(vsi);
-       ice_decfg_netdev(vsi);
-}
-
 /**
  * ice_wait_for_fw - wait for full FW readiness
  * @hw: pointer to the hardware structure
@@ -4681,7 +4599,7 @@ static int ice_wait_for_fw(struct ice_hw *hw, u32 timeout)
        return -ETIMEDOUT;
 }
 
-static int ice_init_dev(struct ice_pf *pf)
+int ice_init_dev(struct ice_pf *pf)
 {
        struct device *dev = ice_pf_to_dev(pf);
        struct ice_hw *hw = &pf->hw;
@@ -4774,7 +4692,7 @@ err_init_pf:
        return err;
 }
 
-static void ice_deinit_dev(struct ice_pf *pf)
+void ice_deinit_dev(struct ice_pf *pf)
 {
        ice_free_irq_msix_misc(pf);
        ice_deinit_pf(pf);
@@ -5079,31 +4997,47 @@ static void ice_deinit(struct ice_pf *pf)
 /**
  * ice_load - load pf by init hw and starting VSI
  * @pf: pointer to the pf instance
+ *
+ * This function has to be called under devl_lock.
  */
 int ice_load(struct ice_pf *pf)
 {
-       struct ice_vsi_cfg_params params = {};
        struct ice_vsi *vsi;
        int err;
 
-       err = ice_init_dev(pf);
+       devl_assert_locked(priv_to_devlink(pf));
+
+       vsi = ice_get_main_vsi(pf);
+
+       /* init channel list */
+       INIT_LIST_HEAD(&vsi->ch_list);
+
+       err = ice_cfg_netdev(vsi);
        if (err)
                return err;
 
-       vsi = ice_get_main_vsi(pf);
+       /* Setup DCB netlink interface */
+       ice_dcbnl_setup(vsi);
 
-       params = ice_vsi_to_params(vsi);
-       params.flags = ICE_VSI_FLAG_INIT;
+       err = ice_init_mac_fltr(pf);
+       if (err)
+               goto err_init_mac_fltr;
 
-       rtnl_lock();
-       err = ice_vsi_cfg(vsi, &params);
+       err = ice_devlink_create_pf_port(pf);
        if (err)
-               goto err_vsi_cfg;
+               goto err_devlink_create_pf_port;
+
+       SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port);
 
-       err = ice_start_eth(ice_get_main_vsi(pf));
+       err = ice_register_netdev(vsi);
        if (err)
-               goto err_start_eth;
-       rtnl_unlock();
+               goto err_register_netdev;
+
+       err = ice_tc_indir_block_register(vsi);
+       if (err)
+               goto err_tc_indir_block_register;
+
+       ice_napi_add(vsi);
 
        err = ice_init_rdma(pf);
        if (err)
@@ -5117,29 +5051,35 @@ int ice_load(struct ice_pf *pf)
        return 0;
 
 err_init_rdma:
-       ice_vsi_close(ice_get_main_vsi(pf));
-       rtnl_lock();
-err_start_eth:
-       ice_vsi_decfg(ice_get_main_vsi(pf));
-err_vsi_cfg:
-       rtnl_unlock();
-       ice_deinit_dev(pf);
+       ice_tc_indir_block_unregister(vsi);
+err_tc_indir_block_register:
+       ice_unregister_netdev(vsi);
+err_register_netdev:
+       ice_devlink_destroy_pf_port(pf);
+err_devlink_create_pf_port:
+err_init_mac_fltr:
+       ice_decfg_netdev(vsi);
        return err;
 }
 
 /**
  * ice_unload - unload pf by stopping VSI and deinit hw
  * @pf: pointer to the pf instance
+ *
+ * This function has to be called under devl_lock.
  */
 void ice_unload(struct ice_pf *pf)
 {
+       struct ice_vsi *vsi = ice_get_main_vsi(pf);
+
+       devl_assert_locked(priv_to_devlink(pf));
+
        ice_deinit_features(pf);
        ice_deinit_rdma(pf);
-       rtnl_lock();
-       ice_stop_eth(ice_get_main_vsi(pf));
-       ice_vsi_decfg(ice_get_main_vsi(pf));
-       rtnl_unlock();
-       ice_deinit_dev(pf);
+       ice_tc_indir_block_unregister(vsi);
+       ice_unregister_netdev(vsi);
+       ice_devlink_destroy_pf_port(pf);
+       ice_decfg_netdev(vsi);
 }
 
 /**
@@ -5237,27 +5177,23 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
        if (err)
                goto err_init;
 
-       err = ice_init_eth(pf);
-       if (err)
-               goto err_init_eth;
-
-       err = ice_init_rdma(pf);
+       devl_lock(priv_to_devlink(pf));
+       err = ice_load(pf);
+       devl_unlock(priv_to_devlink(pf));
        if (err)
-               goto err_init_rdma;
+               goto err_load;
 
        err = ice_init_devlink(pf);
        if (err)
                goto err_init_devlink;
 
-       ice_init_features(pf);
-
        return 0;
 
 err_init_devlink:
-       ice_deinit_rdma(pf);
-err_init_rdma:
-       ice_deinit_eth(pf);
-err_init_eth:
+       devl_lock(priv_to_devlink(pf));
+       ice_unload(pf);
+       devl_unlock(priv_to_devlink(pf));
+err_load:
        ice_deinit(pf);
 err_init:
        pci_disable_device(pdev);
@@ -5340,8 +5276,6 @@ static void ice_remove(struct pci_dev *pdev)
                msleep(100);
        }
 
-       ice_debugfs_exit();
-
        if (test_bit(ICE_FLAG_SRIOV_ENA, pf->flags)) {
                set_bit(ICE_VF_RESETS_DISABLED, pf->state);
                ice_free_vfs(pf);
@@ -5355,12 +5289,14 @@ static void ice_remove(struct pci_dev *pdev)
 
        if (!ice_is_safe_mode(pf))
                ice_remove_arfs(pf);
-       ice_deinit_features(pf);
+
        ice_deinit_devlink(pf);
-       ice_deinit_rdma(pf);
-       ice_deinit_eth(pf);
-       ice_deinit(pf);
 
+       devl_lock(priv_to_devlink(pf));
+       ice_unload(pf);
+       devl_unlock(priv_to_devlink(pf));
+
+       ice_deinit(pf);
        ice_vsi_release_all(pf);
 
        ice_setup_mc_magic_wake(pf);
@@ -5753,6 +5689,10 @@ static const struct pci_device_id ice_pci_tbl[] = {
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E823L_1GBE) },
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E823L_QSFP) },
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E822_SI_DFLT) },
+       { PCI_VDEVICE(INTEL, ICE_DEV_ID_E825C_BACKPLANE), },
+       { PCI_VDEVICE(INTEL, ICE_DEV_ID_E825C_QSFP), },
+       { PCI_VDEVICE(INTEL, ICE_DEV_ID_E825C_SFP), },
+       { PCI_VDEVICE(INTEL, ICE_DEV_ID_E825C_SGMII), },
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E830_BACKPLANE) },
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E830_QSFP56) },
        { PCI_VDEVICE(INTEL, ICE_DEV_ID_E830_SFP) },
@@ -5842,6 +5782,7 @@ module_init(ice_module_init);
 static void __exit ice_module_exit(void)
 {
        pci_unregister_driver(&ice_driver);
+       ice_debugfs_exit();
        destroy_workqueue(ice_wq);
        destroy_workqueue(ice_lag_wq);
        pr_info("module unloaded\n");
@@ -7058,6 +6999,50 @@ static void ice_napi_disable_all(struct ice_vsi *vsi)
        }
 }
 
+/**
+ * ice_vsi_dis_irq - Mask off queue interrupt generation on the VSI
+ * @vsi: the VSI being un-configured
+ */
+static void ice_vsi_dis_irq(struct ice_vsi *vsi)
+{
+       struct ice_pf *pf = vsi->back;
+       struct ice_hw *hw = &pf->hw;
+       u32 val;
+       int i;
+
+       /* disable interrupt causation from each Rx queue; Tx queues are
+        * handled in ice_vsi_stop_tx_ring()
+        */
+       if (vsi->rx_rings) {
+               ice_for_each_rxq(vsi, i) {
+                       if (vsi->rx_rings[i]) {
+                               u16 reg;
+
+                               reg = vsi->rx_rings[i]->reg_idx;
+                               val = rd32(hw, QINT_RQCTL(reg));
+                               val &= ~QINT_RQCTL_CAUSE_ENA_M;
+                               wr32(hw, QINT_RQCTL(reg), val);
+                       }
+               }
+       }
+
+       /* disable each interrupt */
+       ice_for_each_q_vector(vsi, i) {
+               if (!vsi->q_vectors[i])
+                       continue;
+               wr32(hw, GLINT_DYN_CTL(vsi->q_vectors[i]->reg_idx), 0);
+       }
+
+       ice_flush(hw);
+
+       /* don't call synchronize_irq() for VF's from the host */
+       if (vsi->type == ICE_VSI_VF)
+               return;
+
+       ice_for_each_q_vector(vsi, i)
+               synchronize_irq(vsi->q_vectors[i]->irq.virq);
+}
+
 /**
  * ice_down - Shutdown the connection
  * @vsi: The VSI being stopped
@@ -7547,7 +7532,7 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
         * fail.
         */
        if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
-               ice_ptp_reset(pf);
+               ice_ptp_rebuild(pf, reset_type);
 
        if (ice_is_feature_supported(pf, ICE_F_GNSS))
                ice_gnss_init(pf);
This page took 0.038285 seconds and 4 git commands to generate.