ethdev: add new offload flag to keep CRC
DEV_RX_OFFLOAD_KEEP_CRC offload flag is added. PMDs that support keeping CRC should advertise this offload capability. DEV_RX_OFFLOAD_CRC_STRIP flag will remain one more release default behavior in PMDs are to keep the CRC until this flag removed Until DEV_RX_OFFLOAD_CRC_STRIP flag is removed: - Setting both KEEP_CRC & CRC_STRIP is INVALID - Setting only CRC_STRIP PMD should strip the CRC - Setting only KEEP_CRC PMD should keep the CRC - Not setting both PMD should keep the CRC A helper function rte_eth_dev_is_keep_crc() has been added to be able to change the no flag behavior with minimal changes in PMDs. The PMDs that doesn't report the DEV_RX_OFFLOAD_KEEP_CRC offload can remove rte_eth_dev_is_keep_crc() checks next release, related code commented to help the maintenance task. And DEV_RX_OFFLOAD_CRC_STRIP has been added to virtual drivers since they don't use CRC at all, when an application requires this offload virtual PMDs should not return error. Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com> Acked-by: Allain Legacy <allain.legacy@windriver.com> Acked-by: Andrew Rybchenko <arybchenko@solarflare.com> Acked-by: Thomas Monjalon <thomas@monjalon.net>
This commit is contained in:
parent
4ed05fcd44
commit
70815c9eca
@ -67,16 +67,6 @@ Deprecation Notices
|
||||
- removal of ``txq_flags`` field from ``rte_eth_txconf`` struct.
|
||||
- removal of the offloads bit-field from ``rte_eth_rxmode`` struct.
|
||||
|
||||
* ethdev: A new offloading flag ``DEV_RX_OFFLOAD_KEEP_CRC`` will be added in v18.08,
|
||||
This will replace the usage of not setting ``DEV_RX_OFFLOAD_CRC_STRIP`` flag
|
||||
and will be implemented in PMDs accordingly.
|
||||
In v18.08 both ``DEV_RX_OFFLOAD_KEEP_CRC`` and ``DEV_RX_OFFLOAD_CRC_STRIP`` flags
|
||||
will be available, usage will be:
|
||||
``CRC_STRIP``: Strip CRC from packet
|
||||
``KEEP_CRC``: Keep CRC in packet
|
||||
Both ``CRC_STRIP`` & ``KEEP_CRC``: Invalid
|
||||
No flag: Keep CRC in packet
|
||||
|
||||
* ethdev: In v18.11 ``DEV_RX_OFFLOAD_CRC_STRIP`` offload flag will be removed, default
|
||||
behavior without any flag will be changed to CRC strip.
|
||||
To keep CRC ``DEV_RX_OFFLOAD_KEEP_CRC`` flag is required.
|
||||
|
@ -305,6 +305,7 @@ eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
dev_info->max_rx_queues = (uint16_t)internals->nb_queues;
|
||||
dev_info->max_tx_queues = (uint16_t)internals->nb_queues;
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2170,6 +2170,7 @@ avp_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
|
||||
dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT;
|
||||
}
|
||||
dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -363,7 +363,9 @@ axgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
dev_info->rx_offload_capa =
|
||||
DEV_RX_OFFLOAD_IPV4_CKSUM |
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM;
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC;
|
||||
|
||||
dev_info->tx_offload_capa =
|
||||
DEV_TX_OFFLOAD_IPV4_CKSUM |
|
||||
|
@ -74,8 +74,10 @@ int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
|
||||
(DMA_CH_INC * rxq->queue_id));
|
||||
rxq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)rxq->dma_regs +
|
||||
DMA_CH_RDTR_LO);
|
||||
rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
|
||||
/* CRC strip in AXGBE supports per port not per queue */
|
||||
pdata->crc_strip_enable = (rxq->crc_len == 0) ? 1 : 0;
|
||||
|
@ -147,6 +147,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
|
||||
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME | \
|
||||
DEV_RX_OFFLOAD_CRC_STRIP | \
|
||||
DEV_RX_OFFLOAD_KEEP_CRC | \
|
||||
DEV_RX_OFFLOAD_TCP_LRO)
|
||||
|
||||
static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
|
||||
|
@ -326,8 +326,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
|
||||
|
||||
rxq->queue_id = queue_idx;
|
||||
rxq->port_id = eth_dev->data->port_id;
|
||||
rxq->crc_len = rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP ?
|
||||
0 : ETHER_CRC_LEN;
|
||||
rxq->crc_len = rte_eth_dev_must_keep_crc(rx_offloads) ?
|
||||
ETHER_CRC_LEN : 0;
|
||||
|
||||
eth_dev->data->rx_queues[queue_idx] = rxq;
|
||||
/* Allocate RX ring hardware descriptors */
|
||||
|
@ -354,7 +354,11 @@ int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
|
||||
|
||||
CXGBE_FUNC_TRACE();
|
||||
configured_offloads = eth_dev->data->dev_conf.rxmode.offloads;
|
||||
if (!(configured_offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(configured_offloads)) {
|
||||
dev_info(adapter, "can't disable hw crc strip\n");
|
||||
eth_dev->data->dev_conf.rxmode.offloads |=
|
||||
DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
|
@ -1364,6 +1364,7 @@ em_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_SCATTER;
|
||||
if (max_rx_pktlen > ETHER_MAX_LEN)
|
||||
rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
|
||||
@ -1458,8 +1459,10 @@ eth_em_rx_queue_setup(struct rte_eth_dev *dev,
|
||||
rxq->rx_free_thresh = rx_conf->rx_free_thresh;
|
||||
rxq->queue_id = queue_idx;
|
||||
rxq->port_id = dev->data->port_id;
|
||||
rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
|
||||
rxq->rdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDT(queue_idx));
|
||||
rxq->rdh_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDH(queue_idx));
|
||||
@ -1792,9 +1795,10 @@ eth_em_rx_init(struct rte_eth_dev *dev)
|
||||
* Reset crc_len in case it was changed after queue setup by a
|
||||
* call to configure
|
||||
*/
|
||||
rxq->crc_len =
|
||||
(uint8_t)(dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
|
||||
bus_addr = rxq->rx_ring_phys_addr;
|
||||
E1000_WRITE_REG(hw, E1000_RDLEN(i),
|
||||
@ -1873,10 +1877,10 @@ eth_em_rx_init(struct rte_eth_dev *dev)
|
||||
}
|
||||
|
||||
/* Setup the Receive Control Register. */
|
||||
if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP)
|
||||
rctl |= E1000_RCTL_SECRC; /* Strip Ethernet CRC. */
|
||||
else
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rctl &= ~E1000_RCTL_SECRC; /* Do not Strip Ethernet CRC. */
|
||||
else
|
||||
rctl |= E1000_RCTL_SECRC; /* Strip Ethernet CRC. */
|
||||
|
||||
rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
|
||||
rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
|
||||
|
@ -3194,12 +3194,12 @@ igbvf_dev_configure(struct rte_eth_dev *dev)
|
||||
* Keep the persistent behavior the same as Host PF
|
||||
*/
|
||||
#ifndef RTE_LIBRTE_E1000_PF_DISABLE_STRIP_CRC
|
||||
if (!(conf->rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
if (rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "VF can't disable HW CRC Strip");
|
||||
conf->rxmode.offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
#else
|
||||
if (conf->rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
if (!rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "VF can't enable HW CRC Strip");
|
||||
conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
@ -1639,6 +1639,7 @@ igb_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_SCATTER;
|
||||
|
||||
return rx_offload_capa;
|
||||
@ -1720,8 +1721,10 @@ eth_igb_rx_queue_setup(struct rte_eth_dev *dev,
|
||||
rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
|
||||
queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
|
||||
rxq->port_id = dev->data->port_id;
|
||||
rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
|
||||
/*
|
||||
* Allocate RX ring hardware descriptors. A memzone large enough to
|
||||
@ -2371,8 +2374,10 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
|
||||
* Reset crc_len in case it was changed after queue setup by a
|
||||
* call to configure
|
||||
*/
|
||||
rxq->crc_len = (uint8_t)(dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
|
||||
bus_addr = rxq->rx_ring_phys_addr;
|
||||
E1000_WRITE_REG(hw, E1000_RDLEN(rxq->reg_idx),
|
||||
@ -2501,23 +2506,7 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
|
||||
E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum);
|
||||
|
||||
/* Setup the Receive Control Register. */
|
||||
if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
rctl |= E1000_RCTL_SECRC; /* Strip Ethernet CRC. */
|
||||
|
||||
/* set STRCRC bit in all queues */
|
||||
if (hw->mac.type == e1000_i350 ||
|
||||
hw->mac.type == e1000_i210 ||
|
||||
hw->mac.type == e1000_i211 ||
|
||||
hw->mac.type == e1000_i354) {
|
||||
for (i = 0; i < dev->data->nb_rx_queues; i++) {
|
||||
rxq = dev->data->rx_queues[i];
|
||||
uint32_t dvmolr = E1000_READ_REG(hw,
|
||||
E1000_DVMOLR(rxq->reg_idx));
|
||||
dvmolr |= E1000_DVMOLR_STRCRC;
|
||||
E1000_WRITE_REG(hw, E1000_DVMOLR(rxq->reg_idx), dvmolr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads)) {
|
||||
rctl &= ~E1000_RCTL_SECRC; /* Do not Strip Ethernet CRC. */
|
||||
|
||||
/* clear STRCRC bit in all queues */
|
||||
@ -2533,6 +2522,22 @@ eth_igb_rx_init(struct rte_eth_dev *dev)
|
||||
E1000_WRITE_REG(hw, E1000_DVMOLR(rxq->reg_idx), dvmolr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rctl |= E1000_RCTL_SECRC; /* Strip Ethernet CRC. */
|
||||
|
||||
/* set STRCRC bit in all queues */
|
||||
if (hw->mac.type == e1000_i350 ||
|
||||
hw->mac.type == e1000_i210 ||
|
||||
hw->mac.type == e1000_i211 ||
|
||||
hw->mac.type == e1000_i354) {
|
||||
for (i = 0; i < dev->data->nb_rx_queues; i++) {
|
||||
rxq = dev->data->rx_queues[i];
|
||||
uint32_t dvmolr = E1000_READ_REG(hw,
|
||||
E1000_DVMOLR(rxq->reg_idx));
|
||||
dvmolr |= E1000_DVMOLR_STRCRC;
|
||||
E1000_WRITE_REG(hw, E1000_DVMOLR(rxq->reg_idx), dvmolr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
|
||||
|
@ -451,8 +451,10 @@ fm10k_dev_configure(struct rte_eth_dev *dev)
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if ((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) == 0)
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
|
||||
|
||||
/* multipe queue mode checking */
|
||||
|
@ -3331,6 +3331,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_VLAN_EXTEND |
|
||||
DEV_RX_OFFLOAD_VLAN_FILTER |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME;
|
||||
|
@ -1536,7 +1536,7 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
|
||||
/* For non-DPDK PF drivers, VF has no ability to disable HW
|
||||
* CRC strip, and is implicitly enabled by the PF.
|
||||
*/
|
||||
if (!(conf->rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
if (rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
|
||||
vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
|
||||
if ((vf->version_major == VIRTCHNL_VERSION_MAJOR) &&
|
||||
(vf->version_minor <= VIRTCHNL_VERSION_MINOR)) {
|
||||
@ -2199,6 +2199,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_SCATTER |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME |
|
||||
DEV_RX_OFFLOAD_VLAN_FILTER;
|
||||
|
@ -1836,8 +1836,10 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
|
||||
rxq->queue_id = queue_idx;
|
||||
rxq->reg_idx = reg_idx;
|
||||
rxq->port_id = dev->data->port_id;
|
||||
rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
rxq->drop_en = rx_conf->rx_drop_en;
|
||||
rxq->vsi = vsi;
|
||||
rxq->rx_deferred_start = rx_conf->rx_deferred_start;
|
||||
|
@ -5008,12 +5008,12 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)
|
||||
* Keep the persistent behavior the same as Host PF
|
||||
*/
|
||||
#ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC
|
||||
if (!(conf->rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
if (rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "VF can't disable HW CRC Strip");
|
||||
conf->rxmode.offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
#else
|
||||
if (conf->rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
if (!rte_eth_dev_must_keep_crc(conf->rxmode.offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "VF can't enable HW CRC Strip");
|
||||
conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
@ -609,7 +609,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)
|
||||
PMD_DRV_LOG(ERR, "RSC and IPsec not supported");
|
||||
return -1;
|
||||
}
|
||||
if (!(rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
if (rte_eth_dev_must_keep_crc(rx_offloads)) {
|
||||
PMD_DRV_LOG(ERR, "HW CRC strip needs to be enabled for IPsec");
|
||||
return -1;
|
||||
}
|
||||
|
@ -2849,6 +2849,7 @@ ixgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME |
|
||||
DEV_RX_OFFLOAD_SCATTER;
|
||||
|
||||
@ -2935,8 +2936,10 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
|
||||
rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
|
||||
queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
|
||||
rxq->port_id = dev->data->port_id;
|
||||
rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.offloads &
|
||||
DEV_RX_OFFLOAD_CRC_STRIP) ? 0 : ETHER_CRC_LEN);
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
|
||||
rxq->crc_len = ETHER_CRC_LEN;
|
||||
else
|
||||
rxq->crc_len = 0;
|
||||
rxq->drop_en = rx_conf->rx_drop_en;
|
||||
rxq->rx_deferred_start = rx_conf->rx_deferred_start;
|
||||
rxq->offloads = offloads;
|
||||
@ -4702,7 +4705,7 @@ ixgbe_set_rsc(struct rte_eth_dev *dev)
|
||||
|
||||
/* RSC global configuration (chapter 4.6.7.2.1 of 82599 Spec) */
|
||||
|
||||
if (!(rx_conf->offloads & DEV_RX_OFFLOAD_CRC_STRIP) &&
|
||||
if (rte_eth_dev_must_keep_crc(rx_conf->offloads) &&
|
||||
(rx_conf->offloads & DEV_RX_OFFLOAD_TCP_LRO)) {
|
||||
/*
|
||||
* According to chapter of 4.6.7.2.1 of the Spec Rev.
|
||||
@ -4851,10 +4854,10 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
|
||||
* Configure CRC stripping, if any.
|
||||
*/
|
||||
hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
|
||||
if (rx_conf->offloads & DEV_RX_OFFLOAD_CRC_STRIP)
|
||||
hlreg0 |= IXGBE_HLREG0_RXCRCSTRP;
|
||||
else
|
||||
if (rte_eth_dev_must_keep_crc(rx_conf->offloads))
|
||||
hlreg0 &= ~IXGBE_HLREG0_RXCRCSTRP;
|
||||
else
|
||||
hlreg0 |= IXGBE_HLREG0_RXCRCSTRP;
|
||||
|
||||
/*
|
||||
* Configure jumbo frame support, if any.
|
||||
@ -4892,8 +4895,8 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
|
||||
* Reset crc_len in case it was changed after queue setup by a
|
||||
* call to configure.
|
||||
*/
|
||||
rxq->crc_len = (rx_conf->offloads & DEV_RX_OFFLOAD_CRC_STRIP) ?
|
||||
0 : ETHER_CRC_LEN;
|
||||
rxq->crc_len = rte_eth_dev_must_keep_crc(rx_conf->offloads) ?
|
||||
ETHER_CRC_LEN : 0;
|
||||
|
||||
/* Setup the Base and Length of the Rx Descriptor Rings */
|
||||
bus_addr = rxq->rx_ring_phys_addr;
|
||||
@ -4962,10 +4965,10 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
|
||||
if (hw->mac.type == ixgbe_mac_82599EB ||
|
||||
hw->mac.type == ixgbe_mac_X540) {
|
||||
rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
|
||||
if (rx_conf->offloads & DEV_RX_OFFLOAD_CRC_STRIP)
|
||||
rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
|
||||
else
|
||||
if (rte_eth_dev_must_keep_crc(rx_conf->offloads))
|
||||
rdrxctl &= ~IXGBE_RDRXCTL_CRCSTRIP;
|
||||
else
|
||||
rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
|
||||
rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
|
||||
}
|
||||
|
@ -207,6 +207,7 @@ eth_kni_dev_info(struct rte_eth_dev *dev __rte_unused,
|
||||
dev_info->max_rx_queues = KNI_MAX_QUEUE_PER_PORT;
|
||||
dev_info->max_tx_queues = KNI_MAX_QUEUE_PER_PORT;
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -672,7 +672,8 @@ uint64_t
|
||||
mlx4_get_rx_queue_offloads(struct priv *priv)
|
||||
{
|
||||
uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC;
|
||||
|
||||
if (priv->hw_csum)
|
||||
offloads |= DEV_RX_OFFLOAD_CHECKSUM;
|
||||
@ -771,16 +772,16 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
|
||||
(void *)dev, idx, desc);
|
||||
}
|
||||
/* By default, FCS (CRC) is stripped by hardware. */
|
||||
if (offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
crc_present = 0;
|
||||
} else if (priv->hw_fcs_strip) {
|
||||
crc_present = 1;
|
||||
} else {
|
||||
WARN("%p: CRC stripping has been disabled but will still"
|
||||
" be performed by hardware, make sure MLNX_OFED and"
|
||||
" firmware are up to date",
|
||||
(void *)dev);
|
||||
crc_present = 0;
|
||||
crc_present = 0;
|
||||
if (rte_eth_dev_must_keep_crc(offloads)) {
|
||||
if (priv->hw_fcs_strip) {
|
||||
crc_present = 1;
|
||||
} else {
|
||||
WARN("%p: CRC stripping has been disabled but will still"
|
||||
" be performed by hardware, make sure MLNX_OFED and"
|
||||
" firmware are up to date",
|
||||
(void *)dev);
|
||||
}
|
||||
}
|
||||
DEBUG("%p: CRC stripping is %s, %u bytes will be subtracted from"
|
||||
" incoming frames to hide it",
|
||||
|
@ -386,8 +386,10 @@ mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev)
|
||||
DEV_RX_OFFLOAD_TIMESTAMP |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME);
|
||||
|
||||
offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
if (config->hw_fcs_strip)
|
||||
offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
|
||||
|
||||
if (config->hw_csum)
|
||||
offloads |= (DEV_RX_OFFLOAD_IPV4_CKSUM |
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
@ -1417,17 +1419,17 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
|
||||
/* Configure VLAN stripping. */
|
||||
tmpl->rxq.vlan_strip = !!(offloads & DEV_RX_OFFLOAD_VLAN_STRIP);
|
||||
/* By default, FCS (CRC) is stripped by hardware. */
|
||||
if (offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
tmpl->rxq.crc_present = 0;
|
||||
} else if (config->hw_fcs_strip) {
|
||||
tmpl->rxq.crc_present = 1;
|
||||
} else {
|
||||
DRV_LOG(WARNING,
|
||||
"port %u CRC stripping has been disabled but will"
|
||||
" still be performed by hardware, make sure MLNX_OFED"
|
||||
" and firmware are up to date",
|
||||
dev->data->port_id);
|
||||
tmpl->rxq.crc_present = 0;
|
||||
tmpl->rxq.crc_present = 0;
|
||||
if (rte_eth_dev_must_keep_crc(offloads)) {
|
||||
if (config->hw_fcs_strip) {
|
||||
tmpl->rxq.crc_present = 1;
|
||||
} else {
|
||||
DRV_LOG(WARNING,
|
||||
"port %u CRC stripping has been disabled but will"
|
||||
" still be performed by hardware, make sure MLNX_OFED"
|
||||
" and firmware are up to date",
|
||||
dev->data->port_id);
|
||||
}
|
||||
}
|
||||
DRV_LOG(DEBUG,
|
||||
"port %u CRC stripping is %s, %u bytes will be subtracted from"
|
||||
|
@ -314,9 +314,11 @@ mrvl_dev_configure(struct rte_eth_dev *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
MRVL_LOG(INFO,
|
||||
"L2 CRC stripping is always enabled in hw");
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads)) {
|
||||
MRVL_LOG(INFO, "L2 CRC stripping is always enabled in hw");
|
||||
dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
|
@ -411,8 +411,10 @@ nfp_net_configure(struct rte_eth_dev *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Checking RX offloads */
|
||||
if (!(rxmode->offloads & DEV_RX_OFFLOAD_CRC_STRIP))
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(rxmode->offloads))
|
||||
PMD_INIT_LOG(INFO, "HW does strip CRC. No configurable!");
|
||||
|
||||
return 0;
|
||||
@ -1166,7 +1168,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM;
|
||||
|
||||
dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
|
||||
dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC;
|
||||
|
||||
if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
|
||||
dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT;
|
||||
|
@ -305,6 +305,7 @@ eth_dev_info(struct rte_eth_dev *dev,
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->reta_size = internals->reta_size;
|
||||
dev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -283,7 +283,10 @@ octeontx_dev_configure(struct rte_eth_dev *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!(rxmode->offloads & DEV_RX_OFFLOAD_CRC_STRIP)) {
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(rxmode->offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "can't disable hw crc strip");
|
||||
rxmode->offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
@ -538,6 +538,7 @@ eth_dev_info(struct rte_eth_dev *dev,
|
||||
dev_info->max_rx_queues = dev->data->nb_rx_queues;
|
||||
dev_info->max_tx_queues = dev->data->nb_tx_queues;
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1554,6 +1554,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_LRO |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP |
|
||||
DEV_RX_OFFLOAD_KEEP_CRC |
|
||||
DEV_RX_OFFLOAD_SCATTER |
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME |
|
||||
DEV_RX_OFFLOAD_VLAN_FILTER |
|
||||
|
@ -164,6 +164,7 @@ eth_dev_info(struct rte_eth_dev *dev,
|
||||
dev_info->max_rx_queues = (uint16_t)internals->max_rx_queues;
|
||||
dev_info->max_tx_queues = (uint16_t)internals->max_tx_queues;
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1443,7 +1443,10 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
|
||||
rc = EINVAL;
|
||||
}
|
||||
|
||||
if (~rxmode->offloads & DEV_RX_OFFLOAD_CRC_STRIP) {
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(rxmode->offloads)) {
|
||||
sfc_warn(sa, "FCS stripping cannot be disabled - always on");
|
||||
rxmode->offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
rxmode->hw_strip_crc = 1;
|
||||
|
@ -65,6 +65,7 @@ static const struct rte_eth_dev_info pmd_dev_info = {
|
||||
.nb_min = 0,
|
||||
.nb_align = 1,
|
||||
},
|
||||
.rx_offload_capa = DEV_RX_OFFLOAD_CRC_STRIP,
|
||||
};
|
||||
|
||||
static int pmd_softnic_logtype;
|
||||
|
@ -1056,7 +1056,8 @@ eth_dev_info(struct rte_eth_dev *dev,
|
||||
dev_info->max_rx_queues = internals->max_rx_queues;
|
||||
dev_info->max_tx_queues = internals->max_tx_queues;
|
||||
dev_info->min_rx_bufsize = 0;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_SCATTER;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_SCATTER |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
dev_info->tx_offload_capa = 0;
|
||||
dev_info->rx_queue_offload_capa = 0;
|
||||
dev_info->tx_queue_offload_capa = 0;
|
||||
|
@ -1905,7 +1905,10 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((rxmode->offloads & DEV_RX_OFFLOAD_CRC_STRIP) == 0) {
|
||||
/* KEEP_CRC offload flag is not supported by PMD
|
||||
* can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
|
||||
*/
|
||||
if (rte_eth_dev_must_keep_crc(rxmode->offloads)) {
|
||||
PMD_INIT_LOG(NOTICE, "Can't disable hw crc strip");
|
||||
rxmode->offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
@ -1070,7 +1070,8 @@ eth_dev_info(struct rte_eth_dev *dev,
|
||||
|
||||
dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS |
|
||||
DEV_TX_OFFLOAD_VLAN_INSERT;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2127,7 +2127,8 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
};
|
||||
|
||||
host_features = VTPCI_OPS(hw)->get_features(hw);
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
|
||||
dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
|
||||
DEV_RX_OFFLOAD_CRC_STRIP;
|
||||
if (host_features & (1ULL << VIRTIO_NET_F_GUEST_CSUM)) {
|
||||
dev_info->rx_offload_capa |=
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
|
@ -57,7 +57,8 @@
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM | \
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM | \
|
||||
DEV_RX_OFFLOAD_TCP_LRO | \
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME)
|
||||
DEV_RX_OFFLOAD_JUMBO_FRAME | \
|
||||
DEV_RX_OFFLOAD_CRC_STRIP)
|
||||
|
||||
static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);
|
||||
static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev);
|
||||
|
@ -126,6 +126,7 @@ static const struct {
|
||||
RTE_RX_OFFLOAD_BIT2STR(SCATTER),
|
||||
RTE_RX_OFFLOAD_BIT2STR(TIMESTAMP),
|
||||
RTE_RX_OFFLOAD_BIT2STR(SECURITY),
|
||||
RTE_RX_OFFLOAD_BIT2STR(KEEP_CRC),
|
||||
};
|
||||
|
||||
#undef RTE_RX_OFFLOAD_BIT2STR
|
||||
@ -1184,6 +1185,14 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((local_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) &&
|
||||
(local_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC)) {
|
||||
RTE_ETHDEV_LOG(ERR,
|
||||
"Port id=%u not allowed to set both CRC STRIP and KEEP CRC offload flags\n",
|
||||
port_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Check that device supports requested rss hash functions. */
|
||||
if ((dev_info.flow_type_rss_offloads |
|
||||
dev_conf->rx_adv_conf.rss_conf.rss_hf) !=
|
||||
|
@ -944,6 +944,12 @@ struct rte_eth_conf {
|
||||
#define DEV_RX_OFFLOAD_SCATTER 0x00002000
|
||||
#define DEV_RX_OFFLOAD_TIMESTAMP 0x00004000
|
||||
#define DEV_RX_OFFLOAD_SECURITY 0x00008000
|
||||
|
||||
/**
|
||||
* Invalid to set both DEV_RX_OFFLOAD_CRC_STRIP and DEV_RX_OFFLOAD_KEEP_CRC
|
||||
* No DEV_RX_OFFLOAD_CRC_STRIP flag means keep CRC
|
||||
*/
|
||||
#define DEV_RX_OFFLOAD_KEEP_CRC 0x00010000
|
||||
#define DEV_RX_OFFLOAD_CHECKSUM (DEV_RX_OFFLOAD_IPV4_CKSUM | \
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM | \
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM)
|
||||
|
@ -325,6 +325,32 @@ typedef int (*ethdev_uninit_t)(struct rte_eth_dev *ethdev);
|
||||
int __rte_experimental
|
||||
rte_eth_dev_destroy(struct rte_eth_dev *ethdev, ethdev_uninit_t ethdev_uninit);
|
||||
|
||||
/**
|
||||
* PMD helper function to check if keeping CRC is requested
|
||||
*
|
||||
* @note
|
||||
* When CRC_STRIP offload flag is removed and default behavior switch to
|
||||
* strip CRC, as planned, this helper function is not that useful and will be
|
||||
* removed. In PMDs this function will be replaced with check:
|
||||
* if (offloads & DEV_RX_OFFLOAD_KEEP_CRC)
|
||||
*
|
||||
* @param rx_offloads
|
||||
* offload bits to be applied
|
||||
*
|
||||
* @return
|
||||
* Return positive if keeping CRC is requested,
|
||||
* zero if stripping CRC is requested
|
||||
*/
|
||||
static inline int
|
||||
rte_eth_dev_must_keep_crc(uint64_t rx_offloads)
|
||||
{
|
||||
if (rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)
|
||||
return 0;
|
||||
|
||||
/* no KEEP_CRC or CRC_STRIP offload flags means keep CRC */
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user