net/hinic: set link down and up

This patch supports setting link down and up.

Signed-off-by: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
This commit is contained in:
Xiaoyun Wang 2019-10-10 22:51:56 +08:00 committed by Ferruh Yigit
parent 1742421b9e
commit 54ac338699
5 changed files with 112 additions and 0 deletions

View File

@ -31,6 +31,7 @@ Features
- Unicast MAC filter
- Multicast MAC filter
- Flow director
- Set Link down or up
Prerequisites
-------------

View File

@ -119,6 +119,8 @@ enum hinic_port_cmd {
HINIC_PORT_CMD_SET_IPSU_MAC = 0xcb,
HINIC_PORT_CMD_GET_IPSU_MAC = 0xcc,
HINIC_PORT_CMD_SET_XSFP_STATUS = 0xD4,
HINIC_PORT_CMD_GET_LINK_MODE = 0xD9,
HINIC_PORT_CMD_SET_SPEED = 0xDA,
HINIC_PORT_CMD_SET_AUTONEG = 0xDB,

View File

@ -1612,6 +1612,44 @@ int hinic_get_link_mode(void *hwdev, u32 *supported, u32 *advertised)
return 0;
}
/**
* hinic_set_xsfp_tx_status - Enable or disable the fiber in
* tx direction when set link up or down.
*
* @param hwdev
* The hardware interface of a nic device.
* @param enable
* Enable or Disable.
*
* @return
* 0 on success.
* negative error value otherwise.
*/
int hinic_set_xsfp_tx_status(void *hwdev, bool enable)
{
struct hinic_set_xsfp_status xsfp_status;
u16 out_size = sizeof(struct hinic_set_xsfp_status);
int err;
memset(&xsfp_status, 0, sizeof(xsfp_status));
xsfp_status.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
xsfp_status.port_id = hinic_global_func_id(hwdev);
xsfp_status.xsfp_tx_dis = ((enable == 0) ? 1 : 0);
err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_XSFP_STATUS,
&xsfp_status, sizeof(struct hinic_set_xsfp_status),
&xsfp_status, &out_size);
if (err || !out_size || xsfp_status.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR,
"Failed to %s port xsfp status, err: %d, status: 0x%x, out size: 0x%x\n",
enable ? "Disable" : "Enable", err,
xsfp_status.mgmt_msg_head.status, out_size);
return -EFAULT;
}
return 0;
}
/**
* hinic_flush_qp_res - Flush tx && rx chip resources in case of set vport
* fake failed when device start.

View File

@ -578,6 +578,13 @@ struct hinic_link_mode_cmd {
u16 advertised;
};
struct hinic_set_xsfp_status {
struct hinic_mgmt_msg_head mgmt_msg_head;
u32 port_id;
u32 xsfp_tx_dis; /* 0: tx enable; 1: tx disable */
};
struct hinic_clear_qp_resource {
struct hinic_mgmt_msg_head mgmt_msg_head;
@ -807,6 +814,8 @@ int hinic_set_link_status_follow(void *hwdev,
int hinic_get_link_mode(void *hwdev, u32 *supported, u32 *advertised);
int hinic_set_xsfp_tx_status(void *hwdev, bool enable);
int hinic_flush_qp_res(void *hwdev);
int hinic_init_function_table(void *hwdev, u16 rx_buf_sz);

View File

@ -882,6 +882,66 @@ static int hinic_link_update(struct rte_eth_dev *dev, int wait_to_complete)
return rc;
}
/**
* DPDK callback to bring the link UP.
*
* @param dev
* Pointer to Ethernet device structure.
*
* @return
* 0 on success, negative errno value on failure.
*/
static int hinic_dev_set_link_up(struct rte_eth_dev *dev)
{
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
int ret;
ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, true);
if (ret) {
PMD_DRV_LOG(ERR, "Enable port tx xsfp failed, dev_name: %s, port_id: %d",
nic_dev->proc_dev_name, dev->data->port_id);
return ret;
}
/* link status follow phy port status, up will open pma */
ret = hinic_set_port_enable(nic_dev->hwdev, true);
if (ret)
PMD_DRV_LOG(ERR, "Set mac link up failed, dev_name: %s, port_id: %d",
nic_dev->proc_dev_name, dev->data->port_id);
return ret;
}
/**
* DPDK callback to bring the link DOWN.
*
* @param dev
* Pointer to Ethernet device structure.
*
* @return
* 0 on success, negative errno value on failure.
*/
static int hinic_dev_set_link_down(struct rte_eth_dev *dev)
{
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
int ret;
ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, false);
if (ret) {
PMD_DRV_LOG(ERR, "Disable port tx xsfp failed, dev_name: %s, port_id: %d",
nic_dev->proc_dev_name, dev->data->port_id);
return ret;
}
/* link status follow phy port status, up will close pma */
ret = hinic_set_port_enable(nic_dev->hwdev, false);
if (ret)
PMD_DRV_LOG(ERR, "Set mac link down failed, dev_name: %s, port_id: %d",
nic_dev->proc_dev_name, dev->data->port_id);
return ret;
}
/**
* DPDK callback to start the device.
*
@ -2756,6 +2816,8 @@ static const struct eth_dev_ops hinic_pmd_ops = {
.rx_queue_setup = hinic_rx_queue_setup,
.tx_queue_setup = hinic_tx_queue_setup,
.dev_start = hinic_dev_start,
.dev_set_link_up = hinic_dev_set_link_up,
.dev_set_link_down = hinic_dev_set_link_down,
.link_update = hinic_link_update,
.rx_queue_release = hinic_rx_queue_release,
.tx_queue_release = hinic_tx_queue_release,