Commit d28d7413 authored by wangpeiyang's avatar wangpeiyang Committed by Jiantao Xiao
Browse files

net: hns3: add support set mac state

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


CVE: NA

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

The patch provides a customized interface to modify the MAC mode.

Signed-off-by: default avatarwangpeiyang <wangpeiyang1@huawei.com>
Signed-off-by: default avatarshaojijie <shaojijie@huawei.com>
Signed-off-by: default avatarJiantao Xiao <xiaojiantao1@h-partners.com>
parent ad7b67e7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ enum hnae3_ext_opcode {
	HNAE3_EXT_OPC_GET_HILINK_REF_LOS,
	HNAE3_EXT_OPC_GET_PORT_FAULT_STATUS,
	HNAE3_EXT_OPC_GET_PORT_TYPE,
	HNAE3_EXT_OPC_SET_MAC_STATE,
};

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

int nic_set_mac_state(struct net_device *ndev, int enable)
{
	return nic_invoke_pri_ops(ndev, HNAE3_EXT_OPC_SET_MAC_STATE,
				  &enable, sizeof(enable));
}
EXPORT_SYMBOL(nic_set_mac_state);
+1 −0
Original line number Diff line number Diff line
@@ -49,4 +49,5 @@ int nic_disable_clock(struct net_device *ndev);
int nic_set_pfc_time_cfg(struct net_device *ndev, u16 time);
int nic_get_port_fault_status(struct net_device *ndev, u32 fault_type, u32 *status);
int nic_get_port_wire_type(struct net_device *ndev, u32 *wire_type);
int nic_set_mac_state(struct net_device *ndev, int enable);
#endif
+32 −0
Original line number Diff line number Diff line
@@ -645,6 +645,37 @@ static int hclge_get_port_wire_type(struct hclge_dev *hdev, void *data,
	return 0;
}

static void hclge_set_phy_state(struct hclge_dev *hdev, bool enable)
{
	struct phy_device *phydev = hdev->hw.mac.phydev;

	if (!phydev)
		return;

	if (enable && (phydev->state == PHY_READY || phydev->state == PHY_HALTED))
		phy_start(phydev);
	else if (!enable && (phy_is_started(phydev) || phydev->state == PHY_DOWN))
		phy_stop(phydev);
}

static int hclge_set_mac_state(struct hclge_dev *hdev, void *data,
			       size_t length)
{
	bool enable;
	int ret;

	if (length != sizeof(int))
		return -EINVAL;

	enable = !!*(int *)data;
	ret = hclge_cfg_mac_mode(hdev, enable);

	if (!ret && !hclge_comm_dev_phy_imp_supported(hdev->ae_dev))
		hclge_set_phy_state(hdev, enable);

	return ret;
}

static void hclge_ext_resotre_config(struct hclge_dev *hdev)
{
	if (hdev->reset_type != HNAE3_IMP_RESET &&
@@ -815,6 +846,7 @@ static const hclge_priv_ops_fn hclge_ext_func_arr[] = {
	[HNAE3_EXT_OPC_GET_HILINK_REF_LOS] = hclge_get_hilink_ref_los,
	[HNAE3_EXT_OPC_GET_PORT_FAULT_STATUS] = hclge_get_port_fault_status,
	[HNAE3_EXT_OPC_GET_PORT_TYPE] = hclge_get_port_wire_type,
	[HNAE3_EXT_OPC_SET_MAC_STATE] = hclge_set_mac_state,
};

int hclge_ext_ops_handle(struct hnae3_handle *handle, int opcode,
+5 −3
Original line number Diff line number Diff line
@@ -7977,7 +7977,7 @@ static void hclge_enable_fd(struct hnae3_handle *handle, bool enable)
	hclge_task_schedule(hdev, 0);
}

static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
int hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
{
	struct hclge_desc desc;
	struct hclge_config_mac_mode_cmd *req =
@@ -8004,8 +8004,10 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)

	ret = hclge_cmd_send(&hdev->hw, &desc, 1);
	if (ret)
		dev_err(&hdev->pdev->dev,
			"mac enable fail, ret =%d.\n", ret);
		dev_err(&hdev->pdev->dev, "failed to %s mac, ret = %d.\n",
			enable ? "enable" : "disable", ret);

	return ret;
}

static int hclge_config_switch_param(struct hclge_dev *hdev, int vfid,
Loading