net/bnxt: fix link handling and configuration
Remove a case where we were sending a deprecated field to the FW. There is no need to send auto_link_speed to the FW. Also set the auto_mode correctly depending on the setting requested. Fixes: 7bc8e9a227cc ("net/bnxt: support async link notification") Cc: stable@dpdk.org Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
parent
1ccdd771d6
commit
9a82633c27
@ -164,6 +164,8 @@ struct bnxt_link_info {
|
||||
uint16_t auto_link_speed;
|
||||
uint16_t auto_link_speed_mask;
|
||||
uint32_t preemphasis;
|
||||
uint8_t phy_type;
|
||||
uint8_t media_type;
|
||||
};
|
||||
|
||||
#define BNXT_COS_QUEUE_COUNT 8
|
||||
|
@ -55,7 +55,7 @@ void bnxt_handle_async_event(struct bnxt *bp,
|
||||
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
|
||||
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
|
||||
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE:
|
||||
bnxt_link_update_op(bp->eth_dev, 0);
|
||||
bnxt_link_update_op(bp->eth_dev, 1);
|
||||
break;
|
||||
default:
|
||||
RTE_LOG(DEBUG, PMD, "handle_async_event id = 0x%x\n", event_id);
|
||||
|
@ -146,6 +146,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
|
||||
ETH_RSS_NONFRAG_IPV6_UDP)
|
||||
|
||||
static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
|
||||
static void bnxt_print_link_info(struct rte_eth_dev *eth_dev);
|
||||
|
||||
/***********************/
|
||||
|
||||
@ -370,6 +371,7 @@ static int bnxt_init_chip(struct bnxt *bp)
|
||||
goto err_out;
|
||||
}
|
||||
}
|
||||
bnxt_print_link_info(bp->eth_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -533,20 +535,6 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rte_bnxt_atomic_write_link_status(struct rte_eth_dev *eth_dev,
|
||||
struct rte_eth_link *link)
|
||||
{
|
||||
struct rte_eth_link *dst = ð_dev->data->dev_link;
|
||||
struct rte_eth_link *src = link;
|
||||
|
||||
if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
|
||||
*(uint64_t *)src) == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bnxt_print_link_info(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct rte_eth_link *link = ð_dev->data->dev_link;
|
||||
@ -585,7 +573,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
bnxt_link_update_op(eth_dev, 0);
|
||||
bnxt_link_update_op(eth_dev, 1);
|
||||
|
||||
if (eth_dev->data->dev_conf.rxmode.hw_vlan_filter)
|
||||
vlan_mask |= ETH_VLAN_FILTER_MASK;
|
||||
@ -607,9 +595,14 @@ error:
|
||||
static int bnxt_dev_set_link_up_op(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
|
||||
int rc = 0;
|
||||
|
||||
eth_dev->data->dev_link.link_status = 1;
|
||||
bnxt_set_hwrm_link_config(bp, true);
|
||||
if (!bp->link_info.link_up)
|
||||
rc = bnxt_set_hwrm_link_config(bp, true);
|
||||
if (!rc)
|
||||
eth_dev->data->dev_link.link_status = 1;
|
||||
|
||||
bnxt_print_link_info(eth_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -619,6 +612,8 @@ static int bnxt_dev_set_link_down_op(struct rte_eth_dev *eth_dev)
|
||||
|
||||
eth_dev->data->dev_link.link_status = 0;
|
||||
bnxt_set_hwrm_link_config(bp, false);
|
||||
bp->link_info.link_up = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -760,7 +755,8 @@ out:
|
||||
/* Timed out or success */
|
||||
if (new.link_status != eth_dev->data->dev_link.link_status ||
|
||||
new.link_speed != eth_dev->data->dev_link.link_speed) {
|
||||
rte_bnxt_atomic_write_link_status(eth_dev, &new);
|
||||
memcpy(ð_dev->data->dev_link, &new,
|
||||
sizeof(struct rte_eth_link));
|
||||
bnxt_print_link_info(eth_dev);
|
||||
}
|
||||
|
||||
|
@ -550,7 +550,7 @@ int bnxt_hwrm_func_driver_register(struct bnxt *bp)
|
||||
}
|
||||
|
||||
req.async_event_fwd[0] |= rte_cpu_to_le_32(0x1); /* TODO: Use MACRO */
|
||||
memset(req.async_event_fwd, 0xff, sizeof(req.async_event_fwd));
|
||||
//memset(req.async_event_fwd, 0xff, sizeof(req.async_event_fwd));
|
||||
|
||||
rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
|
||||
|
||||
@ -715,34 +715,38 @@ static int bnxt_hwrm_port_phy_cfg(struct bnxt *bp, struct bnxt_link_info *conf)
|
||||
struct hwrm_port_phy_cfg_input req = {0};
|
||||
struct hwrm_port_phy_cfg_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
uint32_t enables = 0;
|
||||
uint32_t link_speed_mask =
|
||||
HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK;
|
||||
|
||||
HWRM_PREP(req, PORT_PHY_CFG);
|
||||
|
||||
if (conf->link_up) {
|
||||
/* Setting Fixed Speed. But AutoNeg is ON, So disable it */
|
||||
if (bp->link_info.auto_mode && conf->link_speed) {
|
||||
req.auto_mode = HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_NONE;
|
||||
RTE_LOG(DEBUG, PMD, "Disabling AutoNeg\n");
|
||||
}
|
||||
|
||||
req.flags = rte_cpu_to_le_32(conf->phy_flags);
|
||||
req.force_link_speed = rte_cpu_to_le_16(conf->link_speed);
|
||||
enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE;
|
||||
/*
|
||||
* Note, ChiMP FW 20.2.1 and 20.2.2 return an error when we set
|
||||
* any auto mode, even "none".
|
||||
*/
|
||||
if (!conf->link_speed) {
|
||||
req.auto_mode = conf->auto_mode;
|
||||
enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE;
|
||||
if (conf->auto_mode ==
|
||||
HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK) {
|
||||
req.auto_link_speed_mask =
|
||||
conf->auto_link_speed_mask;
|
||||
enables |= link_speed_mask;
|
||||
}
|
||||
if (bp->link_info.auto_link_speed) {
|
||||
req.auto_link_speed =
|
||||
bp->link_info.auto_link_speed;
|
||||
enables |=
|
||||
HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED;
|
||||
}
|
||||
/* No speeds specified. Enable AutoNeg - all speeds */
|
||||
req.auto_mode =
|
||||
HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ALL_SPEEDS;
|
||||
}
|
||||
/* AutoNeg - Advertise speeds specified. */
|
||||
if (conf->auto_link_speed_mask) {
|
||||
req.auto_mode =
|
||||
HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK;
|
||||
req.auto_link_speed_mask =
|
||||
conf->auto_link_speed_mask;
|
||||
enables |=
|
||||
HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK;
|
||||
}
|
||||
|
||||
req.auto_duplex = conf->duplex;
|
||||
enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_DUPLEX;
|
||||
req.auto_pause = conf->auto_pause;
|
||||
@ -791,6 +795,8 @@ static int bnxt_hwrm_port_phy_qcfg(struct bnxt *bp,
|
||||
link_info->auto_pause = resp->auto_pause;
|
||||
link_info->force_pause = resp->force_pause;
|
||||
link_info->auto_mode = resp->auto_mode;
|
||||
link_info->phy_type = resp->phy_type;
|
||||
link_info->media_type = resp->media_type;
|
||||
|
||||
link_info->support_speeds = rte_le_to_cpu_16(resp->support_speeds);
|
||||
link_info->auto_link_speed = rte_le_to_cpu_16(resp->auto_link_speed);
|
||||
@ -1886,6 +1892,11 @@ static uint16_t bnxt_parse_eth_link_duplex(uint32_t conf_link_speed)
|
||||
return hw_link_duplex;
|
||||
}
|
||||
|
||||
static uint16_t bnxt_check_eth_link_autoneg(uint32_t conf_link)
|
||||
{
|
||||
return (conf_link & ETH_LINK_SPEED_FIXED) ? 0 : 1;
|
||||
}
|
||||
|
||||
static uint16_t bnxt_parse_eth_link_speed(uint32_t conf_link_speed)
|
||||
{
|
||||
uint16_t eth_link_speed = 0;
|
||||
@ -2094,7 +2105,7 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
|
||||
int rc = 0;
|
||||
struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
|
||||
struct bnxt_link_info link_req;
|
||||
uint16_t speed;
|
||||
uint16_t speed, autoneg;
|
||||
|
||||
if (BNXT_NPAR_PF(bp) || BNXT_VF(bp))
|
||||
return 0;
|
||||
@ -2109,20 +2120,28 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
|
||||
if (!link_up)
|
||||
goto port_phy_cfg;
|
||||
|
||||
autoneg = bnxt_check_eth_link_autoneg(dev_conf->link_speeds);
|
||||
speed = bnxt_parse_eth_link_speed(dev_conf->link_speeds);
|
||||
link_req.phy_flags = HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY;
|
||||
if (speed == 0) {
|
||||
if (autoneg == 1) {
|
||||
link_req.phy_flags |=
|
||||
HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG;
|
||||
link_req.auto_mode =
|
||||
HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK;
|
||||
link_req.auto_link_speed_mask =
|
||||
bnxt_parse_eth_link_speed_mask(bp,
|
||||
dev_conf->link_speeds);
|
||||
} else {
|
||||
if (bp->link_info.phy_type ==
|
||||
HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET ||
|
||||
bp->link_info.phy_type ==
|
||||
HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASETE ||
|
||||
bp->link_info.media_type ==
|
||||
HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_TP) {
|
||||
RTE_LOG(ERR, PMD, "10GBase-T devices must autoneg\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
link_req.phy_flags |= HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE;
|
||||
link_req.link_speed = speed;
|
||||
RTE_LOG(INFO, PMD, "Set Link Speed %x\n", speed);
|
||||
}
|
||||
link_req.duplex = bnxt_parse_eth_link_duplex(dev_conf->link_speeds);
|
||||
link_req.auto_pause = bp->link_info.auto_pause;
|
||||
|
Loading…
x
Reference in New Issue
Block a user