Commit 67daa90c authored by Tian Jiang's avatar Tian Jiang Committed by Jiantao Xiao
Browse files

net: hns3: add support disable nic clock

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I6W94W


CVE: NA

----------------------------------------------------------------------

The patch disables the clocks of the PPP, PPU, IGU_EGU, ROCE, and
TM modules by configuring the network subctrl register.

Signed-off-by: default avatarTian Jiang <jiangtian6@h-partners.com>
Signed-off-by: default avatarshaojijie <shaojijie@huawei.com>
Signed-off-by: default avatarJiantao Xiao <xiaojiantao1@h-partners.com>
parent 9571f135
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ enum hnae3_ext_opcode {
	HNAE3_EXT_OPC_SET_SFP_STATE,
	HNAE3_EXT_OPC_DISABLE_LANE,
	HNAE3_EXT_OPC_GET_LANE_STATUS,
	HNAE3_EXT_OPC_DISABLE_CLOCK,
};

struct hnae3_pfc_storm_para {
+7 −0
Original line number Diff line number Diff line
@@ -425,3 +425,10 @@ int nic_get_net_lane_status(struct net_device *ndev, u32 *status)
				  status, sizeof(*status));
}
EXPORT_SYMBOL(nic_get_net_lane_status);

int nic_disable_clock(struct net_device *ndev)
{
	return nic_invoke_pri_ops(ndev, HNAE3_EXT_OPC_DISABLE_CLOCK,
				  NULL, 0);
}
EXPORT_SYMBOL(nic_disable_clock);
+1 −0
Original line number Diff line number Diff line
@@ -40,4 +40,5 @@ int nic_get_sfp_present(struct net_device *ndev, int *present);
int nic_set_sfp_state(struct net_device *ndev, bool en);
int nic_disable_net_lane(struct net_device *ndev);
int nic_get_net_lane_status(struct net_device *ndev, u32 *status);
int nic_disable_clock(struct net_device *ndev);
#endif
+18 −0
Original line number Diff line number Diff line
@@ -528,6 +528,23 @@ static int hclge_get_net_lane_status(struct hclge_dev *hdev, void *data,
	return 0;
}

static int hclge_disable_nic_clock(struct hclge_dev *hdev, void *data,
				   size_t length)
{
	struct hclge_desc desc;
	u32 nic_clock_en = 0;
	int ret;

	hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_NIC_CLOCK, false);
	desc.data[0] = cpu_to_le32(nic_clock_en);

	ret = hclge_cmd_send(&hdev->hw, &desc, 1);
	if (ret)
		dev_err(&hdev->pdev->dev,
			"failed to disable nic clock, ret = %d\n", ret);
	return ret;
}

static void hclge_ext_resotre_config(struct hclge_dev *hdev)
{
	if (hdev->reset_type != HNAE3_IMP_RESET &&
@@ -693,6 +710,7 @@ static const hclge_priv_ops_fn hclge_ext_func_arr[] = {
	[HNAE3_EXT_OPC_SET_SFP_STATE] = hclge_set_sfp_state,
	[HNAE3_EXT_OPC_DISABLE_LANE] = hclge_disable_net_lane,
	[HNAE3_EXT_OPC_GET_LANE_STATUS] = hclge_get_net_lane_status,
	[HNAE3_EXT_OPC_DISABLE_CLOCK] = hclge_disable_nic_clock,
};

int hclge_ext_ops_handle(struct hnae3_handle *handle, int opcode,
+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ struct hclge_sfp_enable_cmd {
};

enum hclge_ext_opcode_type {
	HCLGE_OPC_CONFIG_NIC_CLOCK = 0x0060,
	HCLGE_OPC_CONFIG_SWITCH_PARAM = 0x1033,
	HCLGE_OPC_CONFIG_VLAN_FILTER = 0x1100,
	HCLGE_OPC_SET_NOTIFY_PKT = 0x180A,