Commit 563866c1 authored by Weibo Zhao's avatar Weibo Zhao Committed by JiangShui
Browse files

hns3 udma: add support of query_device_status

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


CVE: NA

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

Query_device_status is a function that can query device
and port's status such as mtu and speed and if is active.

Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
parent 0cc58f64
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -625,6 +625,7 @@ struct udma_caps {
	uint32_t		num_jfr_shift;
	uint32_t		num_jetty_shift;
	uint8_t			poe_ch_num;
	uint32_t		speed;
};

struct udma_idx_table {
+20 −0
Original line number Diff line number Diff line
@@ -175,6 +175,24 @@ static void set_default_jetty_caps(struct udma_dev *dev)
	caps->num_jetty_shift = UDMA_DEFAULT_MAX_JETTY_X_SHIFT;
}

static void query_hw_speed(struct udma_dev *udma_dev)
{
	struct udma_port_info_cmq *resp;
	struct udma_cmq_desc desc;
	int ret;

	resp = (struct udma_port_info_cmq *)desc.data;
	udma_cmq_setup_basic_desc(&desc, UDMA_OPC_QUERY_PORT_INFO, true);
	resp->query_type = UDMA_QUERY_PORT_INFO;
	ret = udma_cmq_send(udma_dev, &desc, 1);
	if (ret) {
		dev_err(udma_dev->dev, "failed to query speed, ret = %d. set default 100G\n", ret);
		udma_dev->caps.speed = SPEED_100G;
		return;
	}
	udma_dev->caps.speed = resp->speed;
}

static int udma_query_caps(struct udma_dev *udma_dev)
{
	enum udma_opcode_type opcode = UDMA_OPC_QUERY_PF_CAPS_NUM;
@@ -351,6 +369,8 @@ static int udma_query_caps(struct udma_dev *udma_dev)
					      QUERY_PF_CAPS_D_RQWQE_HOP_NUM_S);

	set_default_jetty_caps(udma_dev);
	query_hw_speed(udma_dev);

	return 0;
}

+11 −0
Original line number Diff line number Diff line
@@ -113,6 +113,10 @@ struct udma_query_oor_cmq {
#define UDMA_BA_PG_SZ_SUPPORTED_256K	6
#define UDMA_BA_PG_SZ_SUPPORTED_16K	2

#define UDMA_QUERY_PORT_INFO	1
#define SPEED_100G  100000
#define SPEED_200G  200000

/* Fields of UDMA_OPC_EXT_CFG */
#define EXT_CFG_VF_ID CMQ_REQ_FIELD_LOC(31, 0)
#define EXT_CFG_QP_PI_INDEX CMQ_REQ_FIELD_LOC(45, 32)
@@ -209,6 +213,7 @@ enum udma_opcode_type {
	UDMA_QUERY_OOR_CAPS				= 0xA002,
	UDMA_OPC_DEID_TBL_ADD				= 0xA110,
	UDMA_OPC_CFG_GMV_TBL				= 0xA140,
	UDMA_OPC_QUERY_PORT_INFO			= 0x7104,
};

#define UDMA_QUERY_PF_CAPS_CMD_NUM 5
@@ -461,4 +466,10 @@ union udma_eid {
	} bit32_data;
};

struct udma_port_info_cmq {
	uint32_t speed;
	uint8_t query_type;
	uint8_t rsv[19];
};

#endif /* _UDMA_HW_H */
+56 −0
Original line number Diff line number Diff line
@@ -249,11 +249,67 @@ static int udma_query_device_attr(struct ubcore_device *dev,
	return 0;
}

static int udma_get_active_speed(uint32_t speed, struct ubcore_port_status *port_status)
{
	if (speed == SPEED_100G) {
		port_status->active_width = UBCORE_LINK_X1;
		port_status->active_speed = UBCORE_SP_100G;
	} else if (speed == SPEED_200G) {
		port_status->active_width = UBCORE_LINK_X1;
		port_status->active_speed = UBCORE_SP_200G;
	} else {
		return -EINVAL;
	}

	return 0;
}

static int udma_query_device_status(const struct ubcore_device *dev,
				    struct ubcore_device_status *dev_status)
{
	struct udma_dev *udma_dev = to_udma_dev(dev);
	enum ubcore_mtu net_dev_mtu;
	struct net_device *net_dev;
	enum ubcore_mtu mtu;
	uint8_t port_num;
	int ret;
	int i;

	port_num = udma_dev->caps.num_ports;

	for (i = 0; i < port_num; i++) {
		net_dev = udma_dev->uboe.netdevs[i];
		if (!net_dev) {
			dev_err(udma_dev->dev, "Find netdev %u failed!\n", i);
			return -EINVAL;
		}

		dev_status->port_status[i].state =
			(netif_running(net_dev) &&
			netif_carrier_ok(net_dev)) ?
			UBCORE_PORT_ACTIVE : UBCORE_PORT_DOWN;
		net_dev_mtu = ubcore_get_mtu(net_dev->max_mtu);
		mtu = ubcore_get_mtu(net_dev->mtu);

		dev_status->port_status[i].active_mtu = (enum ubcore_mtu)
						(mtu ? min(net_dev_mtu, mtu) : UBCORE_MTU_256);

		ret = udma_get_active_speed(udma_dev->caps.speed, &dev_status->port_status[i]);
		if (ret) {
			dev_err(udma_dev->dev, "Port[%u] query speed and width failed!\n", i);
			return ret;
		}
	}

	return 0;
}

static struct ubcore_ops g_udma_dev_ops = {
	.owner = THIS_MODULE,
	.abi_version = 1,
	.set_eid = udma_set_eid,
	.query_device_attr = udma_query_device_attr,
	.query_device_status = udma_query_device_status,
	.alloc_ucontext = udma_alloc_ucontext,
	.free_ucontext = udma_free_ucontext,
	.mmap = udma_mmap,