net/ixgbe: use link status helper functions
Use new rte_eth_linkstatus_get/set helper functions to handle link status update. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
parent
80ba61115e
commit
faadebad81
@ -20,7 +20,6 @@
|
||||
#include <rte_debug.h>
|
||||
#include <rte_pci.h>
|
||||
#include <rte_bus_pci.h>
|
||||
#include <rte_atomic.h>
|
||||
#include <rte_branch_prediction.h>
|
||||
#include <rte_memory.h>
|
||||
#include <rte_eal.h>
|
||||
@ -787,58 +786,6 @@ static const struct rte_ixgbe_xstats_name_off rte_ixgbevf_stats_strings[] = {
|
||||
#define IXGBEVF_NB_XSTATS (sizeof(rte_ixgbevf_stats_strings) / \
|
||||
sizeof(rte_ixgbevf_stats_strings[0]))
|
||||
|
||||
/**
|
||||
* Atomically reads the link status information from global
|
||||
* structure rte_eth_dev.
|
||||
*
|
||||
* @param dev
|
||||
* - Pointer to the structure rte_eth_dev to read from.
|
||||
* - Pointer to the buffer to be saved with the link status.
|
||||
*
|
||||
* @return
|
||||
* - On success, zero.
|
||||
* - On failure, negative value.
|
||||
*/
|
||||
static inline int
|
||||
rte_ixgbe_dev_atomic_read_link_status(struct rte_eth_dev *dev,
|
||||
struct rte_eth_link *link)
|
||||
{
|
||||
struct rte_eth_link *dst = link;
|
||||
struct rte_eth_link *src = &(dev->data->dev_link);
|
||||
|
||||
if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
|
||||
*(uint64_t *)src) == 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Atomically writes the link status information into global
|
||||
* structure rte_eth_dev.
|
||||
*
|
||||
* @param dev
|
||||
* - Pointer to the structure rte_eth_dev to read from.
|
||||
* - Pointer to the buffer to be saved with the link status.
|
||||
*
|
||||
* @return
|
||||
* - On success, zero.
|
||||
* - On failure, negative value.
|
||||
*/
|
||||
static inline int
|
||||
rte_ixgbe_dev_atomic_write_link_status(struct rte_eth_dev *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;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is the same as ixgbe_is_sfp() in base/ixgbe.h.
|
||||
*/
|
||||
@ -2757,7 +2704,7 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
|
||||
|
||||
/* Clear recorded link status */
|
||||
memset(&link, 0, sizeof(link));
|
||||
rte_ixgbe_dev_atomic_write_link_status(dev, &link);
|
||||
rte_eth_linkstatus_set(dev, &link);
|
||||
|
||||
if (!rte_intr_allow_others(intr_handle))
|
||||
/* resume to the default handler */
|
||||
@ -3946,7 +3893,7 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
|
||||
int wait_to_complete, int vf)
|
||||
{
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
struct rte_eth_link link, old;
|
||||
struct rte_eth_link link;
|
||||
ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
|
||||
struct ixgbe_interrupt *intr =
|
||||
IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
|
||||
@ -3956,12 +3903,11 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
|
||||
int wait = 1;
|
||||
bool autoneg = false;
|
||||
|
||||
memset(&link, 0, sizeof(link));
|
||||
link.link_status = ETH_LINK_DOWN;
|
||||
link.link_speed = 0;
|
||||
link.link_duplex = ETH_LINK_HALF_DUPLEX;
|
||||
link.link_autoneg = ETH_LINK_AUTONEG;
|
||||
memset(&old, 0, sizeof(old));
|
||||
rte_ixgbe_dev_atomic_read_link_status(dev, &old);
|
||||
|
||||
hw->mac.get_link_status = true;
|
||||
|
||||
@ -3985,19 +3931,14 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
|
||||
if (diag != 0) {
|
||||
link.link_speed = ETH_SPEED_NUM_100M;
|
||||
link.link_duplex = ETH_LINK_FULL_DUPLEX;
|
||||
rte_ixgbe_dev_atomic_write_link_status(dev, &link);
|
||||
if (link.link_status == old.link_status)
|
||||
return -1;
|
||||
return 0;
|
||||
return rte_eth_linkstatus_set(dev, &link);
|
||||
}
|
||||
|
||||
if (link_up == 0) {
|
||||
rte_ixgbe_dev_atomic_write_link_status(dev, &link);
|
||||
intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;
|
||||
if (link.link_status == old.link_status)
|
||||
return -1;
|
||||
return 0;
|
||||
return rte_eth_linkstatus_set(dev, &link);
|
||||
}
|
||||
|
||||
intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
|
||||
link.link_status = ETH_LINK_UP;
|
||||
link.link_duplex = ETH_LINK_FULL_DUPLEX;
|
||||
@ -4029,12 +3970,8 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
|
||||
link.link_speed = ETH_SPEED_NUM_10G;
|
||||
break;
|
||||
}
|
||||
rte_ixgbe_dev_atomic_write_link_status(dev, &link);
|
||||
|
||||
if (link.link_status == old.link_status)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
return rte_eth_linkstatus_set(dev, &link);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -4233,8 +4170,8 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
|
||||
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
|
||||
struct rte_eth_link link;
|
||||
|
||||
memset(&link, 0, sizeof(link));
|
||||
rte_ixgbe_dev_atomic_read_link_status(dev, &link);
|
||||
rte_eth_linkstatus_get(dev, &link);
|
||||
|
||||
if (link.link_status) {
|
||||
PMD_INIT_LOG(INFO, "Port %d: Link Up - speed %u Mbps - %s",
|
||||
(int)(dev->data->port_id),
|
||||
@ -4269,7 +4206,6 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
|
||||
struct ixgbe_interrupt *intr =
|
||||
IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
|
||||
int64_t timeout;
|
||||
struct rte_eth_link link;
|
||||
struct ixgbe_hw *hw =
|
||||
IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
|
||||
@ -4286,9 +4222,10 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
|
||||
}
|
||||
|
||||
if (intr->flags & IXGBE_FLAG_NEED_LINK_UPDATE) {
|
||||
struct rte_eth_link link;
|
||||
|
||||
/* get the link status before link update, for predicting later */
|
||||
memset(&link, 0, sizeof(link));
|
||||
rte_ixgbe_dev_atomic_read_link_status(dev, &link);
|
||||
rte_eth_linkstatus_get(dev, &link);
|
||||
|
||||
ixgbe_dev_link_update(dev, 0);
|
||||
|
||||
@ -6812,9 +6749,8 @@ ixgbe_start_timecounters(struct rte_eth_dev *dev)
|
||||
uint32_t shift = 0;
|
||||
|
||||
/* Get current link speed. */
|
||||
memset(&link, 0, sizeof(link));
|
||||
ixgbe_dev_link_update(dev, 1);
|
||||
rte_ixgbe_dev_atomic_read_link_status(dev, &link);
|
||||
rte_eth_linkstatus_get(dev, &link);
|
||||
|
||||
switch (link.link_speed) {
|
||||
case ETH_SPEED_NUM_100M:
|
||||
|
Loading…
x
Reference in New Issue
Block a user