Skip to content

Commit

Permalink
net/i40e: enable maximum frame size at port level
Browse files Browse the repository at this point in the history
Currently max frame size is set at queue level, which makes the values
of the following counters wrong when a jumbo frame is received.

The expected value:
rx_good_bytes: 0
rx_errors: 1
rx_oversize_errors: 1

The actual value:
rx_good_bytes: 1626
rx_errors: 0
rx_oversize_errors: 0

This patch enables setting max frame size at port level, and makes the
values above right.

Cc: stable@dpdk.org

Signed-off-by: Dapeng Yu <dapengx.yu@intel.com>
Tested-by: Peng Zhang <peng1x.zhang@intel.com>
Reviewed-by: Qi Zhang <qi.z.zhang@intel.com>
  • Loading branch information
yudapengx authored and qzhan16 committed Feb 21, 2022
1 parent 6a28563 commit a4ba773
Showing 1 changed file with 34 additions and 7 deletions.
41 changes: 34 additions & 7 deletions drivers/net/i40e/i40e_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ static int i40e_set_default_mac_addr(struct rte_eth_dev *dev,
struct rte_ether_addr *mac_addr);

static int i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
static void i40e_set_mac_max_frame(struct rte_eth_dev *dev, uint16_t size);

static int i40e_ethertype_filter_convert(
const struct rte_eth_ethertype_filter *input,
Expand Down Expand Up @@ -1709,11 +1710,6 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
*/
i40e_add_tx_flow_control_drop_filter(pf);

/* Set the max frame size to 0x2600 by default,
* in case other drivers changed the default value.
*/
i40e_aq_set_mac_config(hw, I40E_FRAME_SIZE_MAX, TRUE, false, 0, NULL);

/* initialize RSS rule list */
TAILQ_INIT(&pf->rss_config_list);

Expand Down Expand Up @@ -2355,6 +2351,7 @@ i40e_dev_start(struct rte_eth_dev *dev)
uint32_t intr_vector = 0;
struct i40e_vsi *vsi;
uint16_t nb_rxq, nb_txq;
uint16_t max_frame_size;

hw->adapter_stopped = 0;

Expand Down Expand Up @@ -2493,6 +2490,9 @@ i40e_dev_start(struct rte_eth_dev *dev)
"please call hierarchy_commit() "
"before starting the port");

max_frame_size = dev->data->mtu + I40E_ETH_OVERHEAD;
i40e_set_mac_max_frame(dev, max_frame_size);

return I40E_SUCCESS;

tx_err:
Expand Down Expand Up @@ -2839,6 +2839,9 @@ i40e_dev_set_link_down(struct rte_eth_dev *dev)
return i40e_phy_conf_link(hw, abilities, speed, false);
}

#define CHECK_INTERVAL 100 /* 100ms */
#define MAX_REPEAT_TIME 10 /* 1s (10 * 100ms) in total */

static __rte_always_inline void
update_link_reg(struct i40e_hw *hw, struct rte_eth_link *link)
{
Expand Down Expand Up @@ -2905,8 +2908,6 @@ static __rte_always_inline void
update_link_aq(struct i40e_hw *hw, struct rte_eth_link *link,
bool enable_lse, int wait_to_complete)
{
#define CHECK_INTERVAL 100 /* 100ms */
#define MAX_REPEAT_TIME 10 /* 1s (10 * 100ms) in total */
uint32_t rep_cnt = MAX_REPEAT_TIME;
struct i40e_link_status link_status;
int status;
Expand Down Expand Up @@ -6710,6 +6711,7 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)
if (!ret)
rte_eth_dev_callback_process(dev,
RTE_ETH_EVENT_INTR_LSC, NULL);

break;
default:
PMD_DRV_LOG(DEBUG, "Request %u is not supported yet",
Expand Down Expand Up @@ -12094,6 +12096,31 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf)
return ret;
}

static void
i40e_set_mac_max_frame(struct rte_eth_dev *dev, uint16_t size)
{
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
uint32_t rep_cnt = MAX_REPEAT_TIME;
struct rte_eth_link link;
enum i40e_status_code status;

do {
update_link_reg(hw, &link);
if (link.link_status)
break;

rte_delay_ms(CHECK_INTERVAL);
} while (--rep_cnt);

if (link.link_status) {
status = i40e_aq_set_mac_config(hw, size, TRUE, 0, false, NULL);
if (status != I40E_SUCCESS)
PMD_DRV_LOG(ERR, "Failed to set max frame size at port level");
} else {
PMD_DRV_LOG(ERR, "Set max frame size at port level not applicable on link down");
}
}

RTE_LOG_REGISTER_SUFFIX(i40e_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(i40e_logtype_driver, driver, NOTICE);
#ifdef RTE_ETHDEV_DEBUG_RX
Expand Down

0 comments on commit a4ba773

Please sign in to comment.