ixgbe: convert to new offloads API
cover ixgbe: convert to new offloads API
This patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads API
drivers/net/ixgbe/ixgbe_ethdev.c | 243 +++++++++++++----------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 209 ++++++++++++++++++++++--- drivers/net/ixgbe/ixgbe_rxtx.h | 12 ++ drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 318 insertions(+), 172 deletions(-)
Signature · 1 line
2.7.5
PATCH 1/4 net/ixgbe: support VLAN strip per queue offloading in PF
VLAN strip is a per queue offloading in PF. With this patch it can be enabled or disabled on any Rx queue in PF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 109 +++++++++++++++++---------------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 1 + drivers/net/ixgbe/ixgbe_rxtx.h | 1 + 5 files changed, 51 insertions(+), 69 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +47 -62
@@ -2001,64 +2001,6 @@ ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue)ixgbe_vlan_hw_strip_bitmap_set (dev, queue,1 ); } -void -ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl &= ~IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl &= ~IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,0 ); - } - } -} - -void -ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl |=IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl |=IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,1 ); - } - } -} -static void ixgbe_vlan_hw_extend_disable (struct rte_eth_dev *dev) {
@@ -2114,14 +2056,57 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)*/ } +void +ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev) +{ +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; +uint32_t ctrl; +uint16_t i; +struct ixgbe_rx_queue *rxq; +bool on; + +PMD_INIT_FUNC_TRACE (); + +if (hw->mac.type == ixgbe_mac_82598EB) { +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl |=IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + }else { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl &= ~IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + } + }else { +/* +* Other 10G NIC, the VLAN strip can be setup +* per queue in RXDCTL +*/ +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); +if (rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl |=IXGBE_RXDCTL_VME ; + on = TRUE; + }else { + ctrl &= ~IXGBE_RXDCTL_VME ; + on = FALSE; + } +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); + +/* record those setting for HW strip per queue */ +ixgbe_vlan_hw_strip_bitmap_set (dev, i, on); + } + } +} +static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) {if (mask Ð_VLAN_STRIP_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) {
drivers/net/ixgbe/ixgbe_ethdev.h +1 -3
@@ -659,9 +659,7 @@ void ixgbe_vlan_hw_filter_enable(struct rte_eth_dev *dev);void ixgbe_vlan_hw_filter_disable (struct rte_eth_dev *dev); -void ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev); - -void ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev); +void ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev);void ixgbe_pf_host_init (struct rte_eth_dev *eth_dev);
drivers/net/ixgbe/ixgbe_pf.c +1 -4
@@ -329,10 +329,7 @@ set_rx_mode(struct rte_eth_dev *dev)IXGBE_WRITE_REG (hw,IXGBE_FCTRL , fctrl); -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); } static inline void
drivers/net/ixgbe/ixgbe_rxtx.c +1 -0
@@ -2820,6 +2820,7 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, 0 : ETHER_CRC_LEN); rxq->drop_en = rx_conf->rx_drop_en; rxq->rx_deferred_start = rx_conf->rx_deferred_start; + rxq->offloads = rx_conf->offloads;/* * The packet type in RX descriptor is different for different NICs.
drivers/net/ixgbe/ixgbe_rxtx.h +1 -0
@@ -129,6 +129,7 @@ struct ixgbe_rx_queue {uint8_t rx_deferred_start;/**< not in global dev start. */ /** flags to set in mbuf when a vlan is detected. */ uint64_t vlan_flags; +uint64_t offloads;/**< Rx offloads with DEV_RX_OFFLOAD_* */ /** need to alloc dummy mbuf, for wraparound when scanning hw ring */ struct rte_mbuf fake_mbuf;/** hold packets to return to application */
Signature · 1 line
2.7.5
PATCH 2/4 net/ixgbe: support VLAN strip per queue offloading in VF
In reply to Wei DaiVLAN strip is a per queue offloading in VF. With this patch it can be enabled or disabled on any Rx queue in VF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +5 -3
@@ -5215,15 +5215,17 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct ixgbe_rx_queue *rxq;uint16_t i;int on =0 ;/* VF function only support hw strip feature, others are not support */ if (mask Ð_VLAN_STRIP_MASK ) { - on = !!(dev->data->dev_conf.rxmode.hw_vlan_strip); - -for (i =0 ; i < hw->mac.max_rx_queues; i++) +for (i =0 ; i < hw->mac.max_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + on = !!(rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP );ixgbevf_vlan_strip_queue_set (dev, i, on); + } }return 0 ;
Signature · 1 line
2.7.5
PATCH 3/4 net/ixgbe: convert to new Rx offloads API
In reply to Wei DaiEthdev Rx offloads API has changed since:
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 88 +++++++++--------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 143 ++++++++++++++++++++++++++---- drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 180 insertions(+), 66 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +44 -44
@@ -2105,19 +2105,22 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) { +struct rte_eth_rxmode *rxmode; + rxmode = &dev->data->dev_conf.rxmode; +if (mask Ð_VLAN_STRIP_MASK ) {ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_filter) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_FILTER )ixgbe_vlan_hw_filter_enable (dev);else ixgbe_vlan_hw_filter_disable (dev); }if (mask Ð_VLAN_EXTEND_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_extend) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_EXTEND )ixgbe_vlan_hw_extend_enable (dev);else ixgbe_vlan_hw_extend_disable (dev);
@@ -2353,6 +2356,15 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) adapter->rx_bulk_alloc_allowed = true; adapter->rx_vec_allowed = true; +/* +* Header split and VLAN strip are per queue offload features, +* clear them first and set them if they are enabled on any Rx queue. +* This is for set_rx_function() called later. +*/ +if (dev->data->dev_conf.rxmode.ignore_offload_bitfield) + dev->data->dev_conf.rxmode.offloads &= + ~(ixgbe_get_rx_port_offloads (dev)); +return 0 ; }
@@ -3632,30 +3644,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)else dev_info->max_vmdq_pools =ETH_64_POOLS ; dev_info->vmdq_queue_num = dev_info->max_rx_queues; - dev_info->rx_offload_capa = -DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; - -/* -* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV -* mode. -*/ -if ((hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) && - !RTE_ETH_DEV_SRIOV (dev).active) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_TCP_LRO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_MACSEC_STRIP ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
@@ -3675,10 +3666,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ;#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) { - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_SECURITY ; +if (dev->security_ctx) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; - }#endif dev_info->default_rxconf = (struct rte_eth_rxconf ) {
@@ -3689,6 +3678,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -3781,11 +3771,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->max_vmdq_pools =ETH_16_POOLS ; else dev_info->max_vmdq_pools = ETH_64_POOLS; - dev_info->rx_offload_capa =DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT |DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM |
@@ -3801,6 +3789,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -4894,10 +4883,12 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)/* switch to jumbo mode if needed */ if (frame_size >ETHER_MAX_LEN ) { - dev->data->dev_conf.rxmode.jumbo_frame =1 ; + dev->data->dev_conf.rxmode.offloads |= +DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 |=IXGBE_HLREG0_JUMBOEN ; }else { - dev->data->dev_conf.rxmode.jumbo_frame =0 ; + dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; }IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);
@@ -4955,14 +4946,14 @@ 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.hw_strip_crc) { +if (!(conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_INIT_LOG (NOTICE ,"VF can't disable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =1 ; + conf->rxmode.offloads |=DEV_RX_OFFLOAD_CRC_STRIP ; }#else -if (conf->rxmode.hw_strip_crc) { +if (conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP ) {PMD_INIT_LOG (NOTICE ,"VF can't enable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =0 ; + conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP ; }#endif
@@ -4973,6 +4964,14 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) adapter->rx_bulk_alloc_allowed = true; adapter->rx_vec_allowed = true; +/* +* Header split and VLAN strip are per queue offload features, +* clear them first and set them if they are enabled on any Rx queue. +* This is for set_rx_function() called later. +*/ +if (conf->rxmode.ignore_offload_bitfield) + conf->rxmode.offloads &= ~(ixgbe_get_rx_queue_offloads (dev)); +return 0 ; }
@@ -5850,6 +5849,7 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t tx_rate) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode;uint32_t rf_dec, rf_int;uint32_t bcnrc_val;uint16_t link_speed = dev->data->dev_link.link_speed;
@@ -5871,14 +5871,14 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, bcnrc_val =0 ; } + rxmode = &dev->data->dev_conf.rxmode;/* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise * set as 0x4. */ -if ((dev->data->dev_conf.rxmode.jumbo_frame ==1 ) && - (dev->data->dev_conf.rxmode.max_rx_pkt_len >= -IXGBE_MAX_JUMBO_FRAME_SIZE )) +if ((rxmode->offloads &DEV_RX_OFFLOAD_JUMBO_FRAME ) && + (rxmode->max_rx_pkt_len >=IXGBE_MAX_JUMBO_FRAME_SIZE ))IXGBE_WRITE_REG (hw,IXGBE_RTTBCNRM ,IXGBE_MMW_SIZE_JUMBO_FRAME );else
@@ -6225,7 +6225,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)/* refuse mtu that requires the support of scattered packets when this * feature has not been enabled before. */ -if (!rx_conf->enable_scatter && +if (!(rx_conf->offloads &DEV_RX_OFFLOAD_SCATTER ) && (max_frame +2 *IXGBE_VLAN_TAG_SIZE > dev->data->min_rx_buf_size -RTE_PKTMBUF_HEADROOM ))return -EINVAL ;
drivers/net/ixgbe/ixgbe_ipsec.c +5 -3
@@ -598,13 +598,15 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg; +uint64_t rx_offloads; + rx_offloads = dev->data->dev_conf.rxmode.offloads;/* sanity checks */ -if (dev->data->dev_conf.rxmode.enable_lro) { +if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );return -1 ; } -if (!dev->data->dev_conf.rxmode.hw_strip_crc) { +if (!(rx_offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_DRV_LOG (ERR ,"HW CRC strip needs to be enabled for IPsec" );return -1 ; }
@@ -624,7 +626,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) reg |=IXGBE_HLREG0_TXCRCEN |IXGBE_HLREG0_RXCRCSTRP ;IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , reg); -if (dev->data->dev_conf.rxmode.offloads &DEV_RX_OFFLOAD_SECURITY ) { +if (rx_offloads &DEV_RX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECRXCTRL ,0 ); reg =IXGBE_READ_REG (hw,IXGBE_SECRXCTRL );if (reg !=0 ) {
drivers/net/ixgbe/ixgbe_rxtx.c +126 -17
262 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -307,5 +307,8 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
drivers/net/ixgbe/ixgbe_rxtx_vec_common.h +1 -1
@@ -286,7 +286,7 @@ ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)return -1 ;/* no header split support */ -if (rxmode->header_split ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_HEADER_SPLIT )return -1 ;return 0 ;
drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c +1 -1
@@ -515,7 +515,7 @@ ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;/* no csum error report support */ -if (rxmode->hw_ip_checksum ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_CHECKSUM )return -1 ;return ixgbe_rx_vec_dev_conf_condition_check_default (dev);
Signature · 1 line
2.7.5
PATCH 4/4 net/ixgbe: convert to new Tx offloads API
In reply to Wei DaiEthdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") This commit support the new Tx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 40 +++++++------------------ drivers/net/ixgbe/ixgbe_ipsec.c | 5 +++- drivers/net/ixgbe/ixgbe_rxtx.c | 65 +++++++++++++++++++++++++++++++++++++--- drivers/net/ixgbe/ixgbe_rxtx.h | 8 +++++ 4 files changed, 83 insertions(+), 35 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +10 -30
@@ -3647,28 +3647,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - - dev_info->tx_offload_capa = -DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_MACSEC_INSERT ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ; - -#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; -#endif + dev_info->tx_queue_offload_capa =0 ; + dev_info->tx_offload_capa =ixgbe_get_tx_port_offlaods (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3690,7 +3670,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -3774,12 +3756,8 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; + dev_info->tx_queue_offload_capa =0 ; + dev_info->tx_offload_capa =ixgbe_get_tx_port_offlaods (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3801,7 +3779,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
drivers/net/ixgbe/ixgbe_ipsec.c +4 -1
@@ -599,8 +599,11 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg;uint64_t rx_offloads; +uint64_t tx_offloads; rx_offloads = dev->data->dev_conf.rxmode.offloads; + tx_offloads = dev->data->dev_conf.txmode.offloads; +/* sanity checks */ if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );
@@ -634,7 +637,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)return -1 ; } } -if (dev->data->dev_conf.txmode.offloads &DEV_TX_OFFLOAD_SECURITY ) { +if (tx_offloads &DEV_TX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECTXCTRL ,IXGBE_SECTXCTRL_STORE_FORWARD ); reg =IXGBE_READ_REG (hw,IXGBE_SECTXCTRL );
drivers/net/ixgbe/ixgbe_rxtx.c +61 -4
101 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +8 -0
@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */ uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */ /** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM ];
@@ -254,6 +255,12 @@ struct ixgbe_txq_ops {#define IXGBE_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \ ETH_TXQ_FLAGS_NOOFFLOADS) +#define IXGBE_SIMPLE_TX_OFFLOAD_FLAGS ((uint64_t)DEV_TX_OFFLOAD_MULTI_SEGS |\ + DEV_TX_OFFLOAD_VLAN_INSERT |\ + DEV_TX_OFFLOAD_SCTP_CKSUM |\ + DEV_TX_OFFLOAD_UDP_CKSUM |\ + DEV_TX_OFFLOAD_TCP_CKSUM) +/* * Populate descriptors with the following info: * 1.) buffer_addr = phys_addr + headroom
@@ -307,6 +314,7 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offlaods (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev);
Signature · 1 line
2.7.5
Re: [PATCH 4/4] net/ixgbe: convert to new Tx offloads API
Quoted 14 lines
drivers/net/ixgbe/ixgbe_rxtx.h +1
-0@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */ uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */ /** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM ];
drivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_txq_ops { · line 262
Quoted 8 lines
drivers/net/ixgbe/ixgbe_rxtx.h +5
-0@@ -254,6 +255,12 @@ struct ixgbe_txq_ops {#define IXGBE_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \ ETH_TXQ_FLAGS_NOOFFLOADS) +#define IXGBE_SIMPLE_TX_OFFLOAD_FLAGS ((uint64_t)DEV_TX_OFFLOAD_MULTI_SEGS |\ + DEV_TX_OFFLOAD_VLAN_INSERT |\ + DEV_TX_OFFLOAD_SCTP_CKSUM |\ + DEV_TX_OFFLOAD_UDP_CKSUM |\ + DEV_TX_OFFLOAD_TCP_CKSUM)
Hmm and why IP_CKSUM, TSO, OUTER_IP_CKSUM, etc. is not included into that macro? In fact do you really need that?
As I understand right now vector TX doesn't support any offloads, so tx_offload != 0, should be enough for tx function selection, right?
Konstanitn
Quoted 14 lines
drivers/net/ixgbe/ixgbe_rxtx.h +2
-1+/* * Populate descriptors with the following info: * 1.) buffer_addr = phys_addr + headroom @@ -307,6 +314,7 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offlaods (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); --2.7.5
Re: [PATCH 4/4] net/ixgbe: convert to new Tx offloads API
Hi, Konstantin
Thanks for your feedback.
Quoted 29 lines
-----Original Message-----
From: Ananyev, Konstantin
Sent: Thursday, March 15, 2018 7:19 AM
To: Dai, Wei <[email protected]>; Lu, Wenzhuo <[email protected]>
Cc: [email protected]
Subject: RE: [PATCH 4/4] net/ixgbe: convert to new Tx offloads APIdrivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_tx_queue { · line 224
Quoted 7 lines
(quoted diff) +0
-0
b/drivers/net/ixgbe/ixgbe_rxtx.hindex 30095fa..d7f0535 100644drivers/net/ixgbe/ixgbe_rxtx.h +0
-0@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */
drivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_tx_queue {
Quoted 3 lines
drivers/net/ixgbe/ixgbe_rxtx.h +1
-0uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */
drivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_tx_queue { · line 229
Quoted 2 lines
drivers/net/ixgbe/ixgbe_rxtx.h +0
-0/** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM]; @@ -254,6+255,12
drivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_txq_ops {
Quoted 5 lines
@@ struct
ixgbe_txq_ops{ #defineIXGBE_SIMPLE_FLAGS((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \drivers/net/ixgbe/ixgbe_rxtx.h +1
-0ETH_TXQ_FLAGS_NOOFFLOADS) +#define IXGBE_SIMPLE_TX_OFFLOAD_FLAGS ((uint64_t)DEV_TX_OFFLOAD_MULTI_SEGS |\
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.h struct ixgbe_txq_ops { · line 262
Quoted 4 lines
drivers/net/ixgbe/ixgbe_rxtx.h +4
-0+DEV_TX_OFFLOAD_VLAN_INSERT |\ +DEV_TX_OFFLOAD_SCTP_CKSUM |\ +DEV_TX_OFFLOAD_UDP_CKSUM |\ + DEV_TX_OFFLOAD_TCP_CKSUM)Hmm and why
IP_CKSUM, TSO,OUTER_IP_CKSUM, etc. is not included into that macro?
In fact do you really need that?
As I understand right now vector TX doesn't support any offloads, sotx_offload!= 0, should be enough for tx function selection, right? Konstanitn
In this patch, IXGBE_SIMPLE_TX_OFFLOAD_FLAGS is just a reverse transform of IXGBE_SIMPLE_FLAGS which is used in old offload API.
Yes, current vector Tx doesn't support any offloads.
I will use tx_offload==0 following your guide.
Quoted 16 lines
Quoted 6 lines
+
/*
* Populate descriptors with the following info:
* 1.)buffer_addr=phys_addr+ headroom @@ -307,6 +314,7 @@uint16_tixgbe_xmit_fixed_burst_vec(void*tx_queue, structrte_mbuf**tx_pkts,
Quoted 9 lines
drivers/net/ixgbe/ixgbe_rxtx.h +1
-0uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offlaods (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);
uint64_tixgbe_get_rx_port_offloads(struct rte_eth_dev *dev);--
2.7.5
v2 cover ixgbe: convert to new offloads API
In reply to Wei DaiThis patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.
---
v2: improve error checking
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads API
drivers/net/ixgbe/ixgbe_ethdev.c | 264 ++++++++++++++---------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 245 ++++++++++++++++++++++++--- drivers/net/ixgbe/ixgbe_rxtx.h | 13 ++ drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 376 insertions(+), 172 deletions(-)
Signature · 1 line
2.7.5
PATCH v2 1/4 net/ixgbe: support VLAN strip per queue offloading in PF
VLAN strip is a per queue offloading in PF. With this patch it can be enabled or disabled on any Rx queue in PF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 109 +++++++++++++++++---------------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 1 + drivers/net/ixgbe/ixgbe_rxtx.h | 1 + 5 files changed, 51 insertions(+), 69 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +47 -62
@@ -2001,64 +2001,6 @@ ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue)ixgbe_vlan_hw_strip_bitmap_set (dev, queue,1 ); } -void -ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl &= ~IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl &= ~IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,0 ); - } - } -} - -void -ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl |=IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl |=IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,1 ); - } - } -} -static void ixgbe_vlan_hw_extend_disable (struct rte_eth_dev *dev) {
@@ -2114,14 +2056,57 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)*/ } +void +ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev) +{ +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; +uint32_t ctrl; +uint16_t i; +struct ixgbe_rx_queue *rxq; +bool on; + +PMD_INIT_FUNC_TRACE (); + +if (hw->mac.type == ixgbe_mac_82598EB) { +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl |=IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + }else { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl &= ~IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + } + }else { +/* +* Other 10G NIC, the VLAN strip can be setup +* per queue in RXDCTL +*/ +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); +if (rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl |=IXGBE_RXDCTL_VME ; + on = TRUE; + }else { + ctrl &= ~IXGBE_RXDCTL_VME ; + on = FALSE; + } +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); + +/* record those setting for HW strip per queue */ +ixgbe_vlan_hw_strip_bitmap_set (dev, i, on); + } + } +} +static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) {if (mask Ð_VLAN_STRIP_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) {
drivers/net/ixgbe/ixgbe_ethdev.h +1 -3
@@ -659,9 +659,7 @@ void ixgbe_vlan_hw_filter_enable(struct rte_eth_dev *dev);void ixgbe_vlan_hw_filter_disable (struct rte_eth_dev *dev); -void ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev); - -void ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev); +void ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev);void ixgbe_pf_host_init (struct rte_eth_dev *eth_dev);
drivers/net/ixgbe/ixgbe_pf.c +1 -4
@@ -329,10 +329,7 @@ set_rx_mode(struct rte_eth_dev *dev)IXGBE_WRITE_REG (hw,IXGBE_FCTRL , fctrl); -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); } static inline void
drivers/net/ixgbe/ixgbe_rxtx.c +1 -0
@@ -2820,6 +2820,7 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, 0 : ETHER_CRC_LEN); rxq->drop_en = rx_conf->rx_drop_en; rxq->rx_deferred_start = rx_conf->rx_deferred_start; + rxq->offloads = rx_conf->offloads;/* * The packet type in RX descriptor is different for different NICs.
drivers/net/ixgbe/ixgbe_rxtx.h +1 -0
@@ -129,6 +129,7 @@ struct ixgbe_rx_queue {uint8_t rx_deferred_start;/**< not in global dev start. */ /** flags to set in mbuf when a vlan is detected. */ uint64_t vlan_flags; +uint64_t offloads;/**< Rx offloads with DEV_RX_OFFLOAD_* */ /** need to alloc dummy mbuf, for wraparound when scanning hw ring */ struct rte_mbuf fake_mbuf;/** hold packets to return to application */
Signature · 1 line
2.7.5
PATCH v2 2/4 net/ixgbe: support VLAN strip per queue offloading in VF
In reply to Wei DaiVLAN strip is a per queue offloading in VF. With this patch it can be enabled or disabled on any Rx queue in VF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +5 -3
@@ -5215,15 +5215,17 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct ixgbe_rx_queue *rxq;uint16_t i;int on =0 ;/* VF function only support hw strip feature, others are not support */ if (mask Ð_VLAN_STRIP_MASK ) { - on = !!(dev->data->dev_conf.rxmode.hw_vlan_strip); - -for (i =0 ; i < hw->mac.max_rx_queues; i++) +for (i =0 ; i < hw->mac.max_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + on = !!(rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP );ixgbevf_vlan_strip_queue_set (dev, i, on); + } }return 0 ;
Signature · 1 line
2.7.5
PATCH v2 3/4 net/ixgbe: convert to new Rx offloads API
In reply to Wei DaiEthdev Rx offloads API has changed since:
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++++-------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 163 ++++++++++++++++++++++++++---- drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 205 insertions(+), 66 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +49 -44
@@ -2105,19 +2105,22 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) { +struct rte_eth_rxmode *rxmode; + rxmode = &dev->data->dev_conf.rxmode; +if (mask Ð_VLAN_STRIP_MASK ) {ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_filter) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_FILTER )ixgbe_vlan_hw_filter_enable (dev);else ixgbe_vlan_hw_filter_disable (dev); }if (mask Ð_VLAN_EXTEND_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_extend) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_EXTEND )ixgbe_vlan_hw_extend_enable (dev);else ixgbe_vlan_hw_extend_disable (dev);
@@ -2332,6 +2335,8 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)IXGBE_DEV_PRIVATE_TO_INTR (dev->data->dev_private);struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2343,6 +2348,15 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)return ret; } +ixgbe_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3632,30 +3646,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)else dev_info->max_vmdq_pools =ETH_64_POOLS ; dev_info->vmdq_queue_num = dev_info->max_rx_queues; - dev_info->rx_offload_capa = -DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; - -/* -* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV -* mode. -*/ -if ((hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) && - !RTE_ETH_DEV_SRIOV (dev).active) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_TCP_LRO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_MACSEC_STRIP ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
@@ -3675,10 +3668,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ;#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) { - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_SECURITY ; +if (dev->security_ctx) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; - }#endif dev_info->default_rxconf = (struct rte_eth_rxconf ) {
@@ -3689,6 +3680,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -3781,11 +3773,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->max_vmdq_pools =ETH_16_POOLS ; else dev_info->max_vmdq_pools = ETH_64_POOLS; - dev_info->rx_offload_capa =DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT |DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM |
@@ -3801,6 +3791,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -4894,10 +4885,12 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)/* switch to jumbo mode if needed */ if (frame_size >ETHER_MAX_LEN ) { - dev->data->dev_conf.rxmode.jumbo_frame =1 ; + dev->data->dev_conf.rxmode.offloads |= +DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 |=IXGBE_HLREG0_JUMBOEN ; }else { - dev->data->dev_conf.rxmode.jumbo_frame =0 ; + dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; }IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);
@@ -4946,23 +4939,34 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)struct rte_eth_conf *conf = &dev->data->dev_conf;struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id); +ixgbevf_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* * VF has no ability to enable/disable HW CRC * Keep the persistent behavior the same as Host PF */ #ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC -if (!conf->rxmode.hw_strip_crc) { +if (!(conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_INIT_LOG (NOTICE ,"VF can't disable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =1 ; + conf->rxmode.offloads |=DEV_RX_OFFLOAD_CRC_STRIP ; }#else -if (conf->rxmode.hw_strip_crc) { +if (conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP ) {PMD_INIT_LOG (NOTICE ,"VF can't enable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =0 ; + conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP ; }#endif
@@ -5850,6 +5854,7 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t tx_rate) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode;uint32_t rf_dec, rf_int;uint32_t bcnrc_val;uint16_t link_speed = dev->data->dev_link.link_speed;
@@ -5871,14 +5876,14 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, bcnrc_val =0 ; } + rxmode = &dev->data->dev_conf.rxmode;/* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise * set as 0x4. */ -if ((dev->data->dev_conf.rxmode.jumbo_frame ==1 ) && - (dev->data->dev_conf.rxmode.max_rx_pkt_len >= -IXGBE_MAX_JUMBO_FRAME_SIZE )) +if ((rxmode->offloads &DEV_RX_OFFLOAD_JUMBO_FRAME ) && + (rxmode->max_rx_pkt_len >=IXGBE_MAX_JUMBO_FRAME_SIZE ))IXGBE_WRITE_REG (hw,IXGBE_RTTBCNRM ,IXGBE_MMW_SIZE_JUMBO_FRAME );else
@@ -6225,7 +6230,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)/* refuse mtu that requires the support of scattered packets when this * feature has not been enabled before. */ -if (!rx_conf->enable_scatter && +if (!(rx_conf->offloads &DEV_RX_OFFLOAD_SCATTER ) && (max_frame +2 *IXGBE_VLAN_TAG_SIZE > dev->data->min_rx_buf_size -RTE_PKTMBUF_HEADROOM ))return -EINVAL ;
drivers/net/ixgbe/ixgbe_ipsec.c +5 -3
@@ -598,13 +598,15 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg; +uint64_t rx_offloads; + rx_offloads = dev->data->dev_conf.rxmode.offloads;/* sanity checks */ -if (dev->data->dev_conf.rxmode.enable_lro) { +if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );return -1 ; } -if (!dev->data->dev_conf.rxmode.hw_strip_crc) { +if (!(rx_offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_DRV_LOG (ERR ,"HW CRC strip needs to be enabled for IPsec" );return -1 ; }
@@ -624,7 +626,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) reg |=IXGBE_HLREG0_TXCRCEN |IXGBE_HLREG0_RXCRCSTRP ;IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , reg); -if (dev->data->dev_conf.rxmode.offloads &DEV_RX_OFFLOAD_SECURITY ) { +if (rx_offloads &DEV_RX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECRXCTRL ,0 ); reg =IXGBE_READ_REG (hw,IXGBE_SECRXCTRL );if (reg !=0 ) {
drivers/net/ixgbe/ixgbe_rxtx.c +146 -17
294 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -307,5 +307,8 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
drivers/net/ixgbe/ixgbe_rxtx_vec_common.h +1 -1
@@ -286,7 +286,7 @@ ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)return -1 ;/* no header split support */ -if (rxmode->header_split ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_HEADER_SPLIT )return -1 ;return 0 ;
drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c +1 -1
@@ -515,7 +515,7 @@ ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;/* no csum error report support */ -if (rxmode->hw_ip_checksum ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_CHECKSUM )return -1 ;return ixgbe_rx_vec_dev_conf_condition_check_default (dev);
Signature · 1 line
2.7.5
Re: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads API
Hi Wei,
Quoted 294 lines
-----Original Message-----
From: Dai, Wei
Sent: Wednesday, March 7, 2018 1:06 PM
To: Lu, Wenzhuo <[email protected]>; Ananyev, Konstantin <[email protected]>
Cc: [email protected]; Dai, Wei <[email protected]>
Subject: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads APIEthdev Rx offloads API has changed since:
commitce17eddefc20("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.Signed-off-by Wei Dai <[email protected]>--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++++-------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 163 ++++++++++++++++++++++++++---- drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 205 insertions(+), 66 deletions(-)drivers/net/ixgbe/ixgbe_ethdev.c +49
-44@@ -2105,19 +2105,22 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) { +struct rte_eth_rxmode *rxmode; + rxmode = &dev->data->dev_conf.rxmode; +if (mask Ð_VLAN_STRIP_MASK ) {ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_filter) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_FILTER )ixgbe_vlan_hw_filter_enable (dev);else ixgbe_vlan_hw_filter_disable (dev); }if (mask Ð_VLAN_EXTEND_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_extend) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_EXTEND )ixgbe_vlan_hw_extend_enable (dev);else ixgbe_vlan_hw_extend_disable (dev);@@ -2332,6 +2335,8 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)IXGBE_DEV_PRIVATE_TO_INTR (dev->data->dev_private);struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;int ret;PMD_INIT_FUNC_TRACE ();@@ -2343,6 +2348,15 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)return ret; } +ixgbe_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;@@ -3632,30 +3646,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)else dev_info->max_vmdq_pools =ETH_64_POOLS ; dev_info->vmdq_queue_num = dev_info->max_rx_queues; - dev_info->rx_offload_capa = -DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; - -/* -* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV -* mode. -*/ -if ((hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) && - !RTE_ETH_DEV_SRIOV (dev).active) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_TCP_LRO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_MACSEC_STRIP ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |@@ -3675,10 +3668,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ;#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) { - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_SECURITY ; +if (dev->security_ctx) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; - }#endif dev_info->default_rxconf = (struct rte_eth_rxconf ) {@@ -3689,6 +3680,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {@@ -3781,11 +3773,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->max_vmdq_pools =ETH_16_POOLS ; else dev_info->max_vmdq_pools = ETH_64_POOLS; - dev_info->rx_offload_capa =DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT |DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM |@@ -3801,6 +3791,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {@@ -4894,10 +4885,12 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)/* switch to jumbo mode if needed */ if (frame_size >ETHER_MAX_LEN ) { - dev->data->dev_conf.rxmode.jumbo_frame =1 ; + dev->data->dev_conf.rxmode.offloads |= +DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 |=IXGBE_HLREG0_JUMBOEN ; }else { - dev->data->dev_conf.rxmode.jumbo_frame =0 ; + dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; }IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);@@ -4946,23 +4939,34 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)struct rte_eth_conf *conf = &dev->data->dev_conf;struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id); +ixgbevf_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* * VF has no ability to enable/disable HW CRC * Keep the persistent behavior the same as Host PF */ #ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC -if (!conf->rxmode.hw_strip_crc) { +if (!(conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_INIT_LOG (NOTICE ,"VF can't disable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =1 ; + conf->rxmode.offloads |=DEV_RX_OFFLOAD_CRC_STRIP ; }#else -if (conf->rxmode.hw_strip_crc) { +if (conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP ) {PMD_INIT_LOG (NOTICE ,"VF can't enable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =0 ; + conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP ; }#endif @@ -5850,6 +5854,7 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t tx_rate) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode;uint32_t rf_dec, rf_int;uint32_t bcnrc_val;uint16_t link_speed = dev->data->dev_link.link_speed;@@ -5871,14 +5876,14 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, bcnrc_val =0 ; } + rxmode = &dev->data->dev_conf.rxmode;/* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise * set as 0x4. */ -if ((dev->data->dev_conf.rxmode.jumbo_frame ==1 ) && - (dev->data->dev_conf.rxmode.max_rx_pkt_len >= -IXGBE_MAX_JUMBO_FRAME_SIZE )) +if ((rxmode->offloads &DEV_RX_OFFLOAD_JUMBO_FRAME ) && + (rxmode->max_rx_pkt_len >=IXGBE_MAX_JUMBO_FRAME_SIZE ))IXGBE_WRITE_REG (hw,IXGBE_RTTBCNRM ,IXGBE_MMW_SIZE_JUMBO_FRAME );else @@ -6225,7 +6230,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)/* refuse mtu that requires the support of scattered packets when this * feature has not been enabled before. */ -if (!rx_conf->enable_scatter && +if (!(rx_conf->offloads &DEV_RX_OFFLOAD_SCATTER ) && (max_frame +2 *IXGBE_VLAN_TAG_SIZE > dev->data->min_rx_buf_size -RTE_PKTMBUF_HEADROOM ))return -EINVAL ;drivers/net/ixgbe/ixgbe_ipsec.c +5
-3@@ -598,13 +598,15 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg; +uint64_t rx_offloads; + rx_offloads = dev->data->dev_conf.rxmode.offloads;/* sanity checks */ -if (dev->data->dev_conf.rxmode.enable_lro) { +if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );return -1 ; } -if (!dev->data->dev_conf.rxmode.hw_strip_crc) { +if (!(rx_offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_DRV_LOG (ERR ,"HW CRC strip needs to be enabled for IPsec" );return -1 ; }@@ -624,7 +626,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) reg |=IXGBE_HLREG0_TXCRCEN |IXGBE_HLREG0_RXCRCSTRP ;IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , reg); -if (dev->data->dev_conf.rxmode.offloads &DEV_RX_OFFLOAD_SECURITY ) { +if (rx_offloads &DEV_RX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECRXCTRL ,0 ); reg =IXGBE_READ_REG (hw,IXGBE_SECRXCTRL );if (reg !=0 ) {drivers/net/ixgbe/ixgbe_rxtx.c +14
-0@@ -2769,6 +2769,98 @@ ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq)#endif } +static int +ixgbe_is_vf (struct rte_eth_dev *dev) +{ +struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); + +switch (hw->mac.type) { +case ixgbe_mac_82599_vf: +case ixgbe_mac_X540_vf: +case ixgbe_mac_X550_vf: +case ixgbe_mac_X550EM_x_vf: +case ixgbe_mac_X550EM_a_vf: +return 1 ; +default : +return 0 ;
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2795
Quoted 10 lines
drivers/net/ixgbe/ixgbe_rxtx.c +10
-0+ } +} + +uint64_t +ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev) +{ +uint64_t offloads; +struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); + + offloads =DEV_RX_OFFLOAD_HEADER_SPLIT ;
As I can see I ixgbe all header_split code is enabled only if RTE_HEADER_SPLIT_ENABLE is on. It is off by default and I doubt anyone really using it these days.
So I think the best thing would be not to advertise DEV_RX_OFFLOAD_HEADER_SPLIT for ixgbe at all, and probably remove related code.
If you'd prefer to keep it, then at least we should set that capability only
at #ifdef RTE_HEADER_SPLIT_ENABLE.
Another thing - it should be per port, not per queue.
Thought I think better is just to remove it completely.
Quoted 35 lines
drivers/net/ixgbe/ixgbe_rxtx.c +35
-0+if (hw->mac.type != ixgbe_mac_82598EB) + offloads |=DEV_RX_OFFLOAD_VLAN_STRIP ; + +return offloads; +} + +uint64_t +ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev) +{ +uint64_t offloads; +struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); + + offloads =DEV_RX_OFFLOAD_IPV4_CKSUM | +DEV_RX_OFFLOAD_UDP_CKSUM | +DEV_RX_OFFLOAD_TCP_CKSUM | +DEV_RX_OFFLOAD_CRC_STRIP | +DEV_RX_OFFLOAD_JUMBO_FRAME | +DEV_RX_OFFLOAD_SCATTER ; + +if (hw->mac.type == ixgbe_mac_82598EB) + offloads |=DEV_RX_OFFLOAD_VLAN_STRIP ; + +if (ixgbe_is_vf (dev) ==0 ) + offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER | +DEV_RX_OFFLOAD_VLAN_EXTEND ); + +/* +* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV +* mode. +*/ +if ((hw->mac.type == ixgbe_mac_82599EB || + hw->mac.type == ixgbe_mac_X540) && + !RTE_ETH_DEV_SRIOV (dev).active) + offloads |=DEV_RX_OFFLOAD_TCP_LRO ; +
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2840
Quoted 10 lines
drivers/net/ixgbe/ixgbe_rxtx.c +10
-0+if (hw->mac.type == ixgbe_mac_82599EB || + hw->mac.type == ixgbe_mac_X540) + offloads |=DEV_RX_OFFLOAD_MACSEC_STRIP ; + +if (hw->mac.type == ixgbe_mac_X550 || + hw->mac.type == ixgbe_mac_X550EM_x || + hw->mac.type == ixgbe_mac_X550EM_a) + offloads |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + +#ifdef RTE_LIBRTE_SECURITY
I don't think you need that ifdef here.
Quoted 8 lines
drivers/net/ixgbe/ixgbe_rxtx.c +8
-0+if (dev->security_ctx) + offloads |=DEV_RX_OFFLOAD_SECURITY ; +#endif + +return offloads; +} + +static int
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2858
Quoted 10 lines
drivers/net/ixgbe/ixgbe_rxtx.c +10
-0+ixgbe_check_rx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested) +{ + uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; +uint64_t queue_supported =ixgbe_get_rx_queue_offloads (dev); +uint64_t port_supported =ixgbe_get_rx_port_offloads (dev); + +if ((requested & (queue_supported | port_supported)) != requested) +return 0 ; + +if ((port_offloads ^ requested) & port_supported)
Could you explain a bit more what are you cheking here?
As I can see:
(port_offloads ^ requested) - that's a diff between already set and newly
requested offloads.
Then you check if that diff consists of supported by port offloads, and if yes you return an error?
Konstantin
Quoted 5 lines
drivers/net/ixgbe/ixgbe_rxtx.c +5
-0+return 0 ; + +return 1 ; +} +
Re: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads API
Hi, Konstantin
Thanks for your feedback.
Quoted 42 lines
-----Original Message-----
From: Ananyev, Konstantin
Sent: Thursday, March 15, 2018 5:48 AM
To: Dai, Wei <[email protected]>; Lu, Wenzhuo <[email protected]>
Cc: [email protected]
Subject: RE: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads APIHi Wei,
Quoted 12 lines
-----Original Message-----
From: Dai, Wei
Sent: Wednesday, March 7, 2018 1:06 PM
To: Lu, Wenzhuo <[email protected]>; Ananyev, Konstantin <[email protected]>
Cc: [email protected]; Dai, Wei <[email protected]>
Subject: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads APIEthdev Rx offloads API has changed since:
commitce17eddefc20("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.Quoted 5 lines
Signed-off-by Wei Dai <[email protected]>--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++++-------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 163++++++++++++++++++++++++++----
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2795
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 205 insertions(+), 66 deletions(-)drivers/net/ixgbe/ixgbe_rxtx.c +7
-0+uint64_t +ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev) { +uint64_t offloads; +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); + + offloads =DEV_RX_OFFLOAD_HEADER_SPLIT ;As I can see I ixgbe all
header_splitcode is enabled only ifRTE_HEADER_SPLIT_ENABLEis on.
Quoted 8 lines
It is off by default and I doubt anyone really using it these days. So I think the best thing would be not to advertise
DEV_RX_OFFLOAD_HEADER_SPLITfor ixgbe at all, and probably remove related code.
If you'd prefer to keep it, then at least we should set that capability only at #ifdefRTE_HEADER_SPLIT_ENABLE.
Another thing - it should be per port, not per queue.
Thought I think better is just to remove it completely.
I will set this header splitting capability in #ifdef RTE_HEADER_SPLIT_ENABLE in my next patch set. I think it is a per queue capability as it can be configured on the register IXGBE_SRRCTL of every Rx queue In this code line: IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxq->reg_idx), srrctl); in ixgbe_dev_rx_init( ). Same case is also in the code line: IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), srrctl); in ixgbevf_dev_rx_init( ).
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2858
Quoted 11 lines
drivers/net/ixgbe/ixgbe_rxtx.c +11
-0+static int +ixgbe_check_rx_queue_offloads (struct rte_eth_dev *dev,uint64_t +requested) { +uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; +uint64_t queue_supported =ixgbe_get_rx_queue_offloads (dev); +uint64_t port_supported =ixgbe_get_rx_port_offloads (dev); + +if ((requested & (queue_supported | port_supported)) != requested) +return 0 ; + +if ((port_offloads ^ requested) & port_supported)
Quoted 8 lines
Could you explain a bit more what are you cheking here?
As I can see:
(port_offloads^ requested) - that's a diff between already set and newly
requested offloads.
Then you check if that diff consists of supported by port offloads, and if yes you return an error?
Konstantin
This function is similar to mlx4_check_rx_queue_offloads() in mlx4 driver.
As the git log message in the commit ce17eddefc20285bbfe575bdc07f42f0b20f34cb say that a per port capability should has same setting (enabling or disabling) on both port configuration via rte_eth_dev_configure( ) and queue configuration via rte_eth_rx_queue_setup( ). This function check if this requirement is matched or not.
It also check offloading request is supported as a per port or a per queue capability or not. If above checking is pass, it return 1 else return 0.
Re: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads API
Hi Wei,
Quoted 54 lines
Hi, Konstantin
Thanks for your feedback.Quoted 42 lines
-----Original Message-----
From: Ananyev, Konstantin
Sent: Thursday, March 15, 2018 5:48 AM
To: Dai, Wei <[email protected]>; Lu, Wenzhuo <[email protected]>
Cc: [email protected]
Subject: RE: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads APIHi Wei,
Quoted 12 lines
-----Original Message-----
From: Dai, Wei
Sent: Wednesday, March 7, 2018 1:06 PM
To: Lu, Wenzhuo <[email protected]>; Ananyev, Konstantin <[email protected]>
Cc: [email protected]; Dai, Wei <[email protected]>
Subject: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads APIEthdev Rx offloads API has changed since:
commitce17eddefc20("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.Quoted 5 lines
Signed-off-by Wei Dai <[email protected]>--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++++-------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 163++++++++++++++++++++++++++----
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2795
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 205 insertions(+), 66 deletions(-)drivers/net/ixgbe/ixgbe_rxtx.c +7
-0+uint64_t +ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev) { +uint64_t offloads; +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); + + offloads =DEV_RX_OFFLOAD_HEADER_SPLIT ;As I can see I ixgbe all
header_splitcode is enabled only ifRTE_HEADER_SPLIT_ENABLEis on.Quoted 8 lines
It is off by default and I doubt anyone really using it these days. So I think the best thing would be not to advertise
DEV_RX_OFFLOAD_HEADER_SPLITfor ixgbe at all, and probably remove related code.
If you'd prefer to keep it, then at least we should set that capability only at #ifdefRTE_HEADER_SPLIT_ENABLE.
Another thing - it should be per port, not per queue.
Thought I think better is just to remove it completely.
Quoted 4 lines
I will set this header splitting capability in #ifdef
RTE_HEADER_SPLIT_ENABLEin my next patch set. I think it is a per queue capability as it can be configured on the registerIXGBE_SRRCTLof every Rx queue In this code line:IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxq->reg_idx), srrctl); inixgbe_dev_rx_init( ). Same case is also in the code line:IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), srrctl); inixgbevf_dev_rx_init( ).
Yes, HW can enable/disable it on a per queue basis.
Though it affects rx function selection, and as right now we have one rx function per device - That's why it looks to me more like a per port offload.
Though I believe these days ixgbe PMD doesn't support it properly anyway
(we always set rxd.hdr_addr to zero) - so probably better to remove it at all.
Quoted 21 lines
Quoted 13 lines
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2858
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.c +11
-0+static int +ixgbe_check_rx_queue_offloads (struct rte_eth_dev *dev,uint64_t +requested) { +uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; +uint64_t queue_supported =ixgbe_get_rx_queue_offloads (dev); +uint64_t port_supported =ixgbe_get_rx_port_offloads (dev); + +if ((requested & (queue_supported | port_supported)) != requested) +return 0 ; + +if ((port_offloads ^ requested) & port_supported)Quoted 8 lines
Could you explain a bit more what are you cheking here?
As I can see:
(port_offloads^ requested) - that's a diff between already set and newly
requested offloads.
Then you check if that diff consists of supported by port offloads, and if yes you return an error?
Konstantin
Quoted 7 lines
This function is similar to
mlx4_check_rx_queue_offloads()in mlx4 driver.
As the git log message in the commitce17eddefc20285bbfe575bdc07f42f0b20f34cbsay that a per port capability should has same setting (enabling or disabling) on both port configuration viarte_eth_dev_configure( )and queue configuration viarte_eth_rx_queue_setup( ). This function check if this requirement is matched or not.
It also check offloading request is supported as a per port or a per queue capability or not. If above checking is pass, it return 1 else return 0.
Ok, let be more specific here.
Let say:
requested == DEV_RX_OFFLOAD_VLAN_STRIP;port_offloads == DEV_RX_OFFLOAD_IPV4_CKSUM;port_supported = (DEV_RX_OFFLOAD_IPV4_CKSUM |
DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_CRC_STRIP | DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_SCATTER);
(port_offloads ^ requested) == DEV_RX_OFFLOAD_VLAN_STRIP | DEV_RX_OFFLOAD_IPV4_CKSUM; (port_offloads ^ requested) & port_supported == DEV_RX_OFFLOAD_IPV4_CKSUM;
And that function will return failure, while as I understand it shouldn't - requested queue offload is valid.
Konstantin
Re: [PATCH v2 3/4] net/ixgbe: convert to new Rx offloads API
Hi, Konstantin
Thanks for your patient guidance!
Quoted 11 lines
IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxq->reg_idx), srrctl); inixgbe_dev_rx_init( ).Quoted 1 line
Same case is also in the code line: IXGBE_WRITE_REG(hw,
IXGBE_VFSRRCTL(i), srrctl); inixgbevf_dev_rx_init( ).Yes, HW can enable/disable it on a per queue basis.
Though it affects rx function selection, and as right now we have one rx function per device - That's why it looks to me more like a per port offload. Though I believe these days ixgbe PMD doesn't support it properly anyway (we always set rxd.hdr_addr to zero) - so probably better to remove it at all.
Yes, rx function is related with offloading.
I'll remove this header split capability in my next patch set.
Quoted 43 lines
Quoted 21 lines
Quoted 13 lines
drivers/net/ixgbe/ixgbe_rxtx.c ixgbe_reset_rx_queue(struct ixgbe_adapter *adapter, struct ixgbe_rx_queue *rxq) · line 2858
Quoted 12 lines
drivers/net/ixgbe/ixgbe_rxtx.c +11
-0+static int +ixgbe_check_rx_queue_offloads (struct rte_eth_dev *dev,uint64_t +requested) { +uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; +uint64_t queue_supported =ixgbe_get_rx_queue_offloads (dev); +uint64_t port_supported =ixgbe_get_rx_port_offloads (dev); + +if ((requested & (queue_supported | port_supported)) != requested) +return 0 ; + +if ((port_offloads ^ requested) & port_supported)Quoted 8 lines
Could you explain a bit more what are you cheking here? As I can see:
(port_offloads^ requested) - that's a diff between already set and
newly requested offloads.
Then you check if that diff consists of supported by port offloads, and if yes you return an error?
KonstantinQuoted 4 lines
This function is similar to
mlx4_check_rx_queue_offloads()in mlx4 driver. As the git log message in the commitce17eddefc20285bbfe575bdc07f42f0b20f34cbsay that a per port capability should has same setting (enabling or disabling) on both portconfiguration via
rte_eth_dev_configure( )and queue configuration viarte_eth_rx_queue_setup( ).Quoted 2 lines
This function check if this requirement is matched or not.
It also check offloading request is supported as a per port or a per queuecapability or not.
Quoted 1 line
If above checking is pass, it return 1 else return 0.
Ok, let be more specific here.
Let say:
requested ==DEV_RX_OFFLOAD_VLAN_STRIP;port_offloads==DEV_RX_OFFLOAD_IPV4_CKSUM;port_supported= (DEV_RX_OFFLOAD_IPV4_CKSUM|DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_CRC_STRIP | DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_SCATTER);
Quoted 7 lines
(
port_offloads^ requested) ==DEV_RX_OFFLOAD_VLAN_STRIP|DEV_RX_OFFLOAD_IPV4_CKSUM; (port_offloads^ requested) &port_supported==DEV_RX_OFFLOAD_IPV4_CKSUM; And that function will return failure, while as I understand it shouldn't - requested queue offload is valid.Konstantin
I'd like to list the git message of commit ce17eddefc20285bbfe575bdc07f42f0b20f34cb which has been submitted by Shahaf Shuler and already been accepted.
SHA-1: ce17eddefc20285bbfe575bdc07f42f0b20f34cb
* ethdev: introduce Rx queue offloads API
Introduce a new API to configure Rx offloads.
In the new API, offloads are divided into per-port and per-queue offloads. The PMD reports capability for each of them. Offloads are enabled using the existing DEV_RX_OFFLOAD_* flags. To enable per-port offload, the offload should be set on both device configuration and queue configuration. To enable per-queue offload, the offloads can be set only on queue configuration.
Applications should set the ignore_offload_bitfield bit on rxmode structure in order to move to the new API.
The old Rx offloads API is kept for the meanwhile, in order to enable a smooth transition for PMDs and application to the new API.
In your example, IPV4_CKSUM is a per port offloading, it is Enabled in port_offloads to rte_eth_dev_configure(), and it Should also be enabled in requested to rte_eth_rx_queue_setup( ). So your example fails in this checking.
This function is very similar with priv_is_rx_queue_offloads_allowed( ) in /net/mlx5/mlx5_rxq.c In the patch http://dpdk.org/dev/patchwork/patch/33386/ which has already been accepted.
PATCH v2 4/4 net/ixgbe: convert to new Tx offloads API
In reply to Wei DaiEthdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") This commit support the new Tx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 56 +++++++++++++-------------- drivers/net/ixgbe/ixgbe_ipsec.c | 5 ++- drivers/net/ixgbe/ixgbe_rxtx.c | 81 ++++++++++++++++++++++++++++++++++++++-- drivers/net/ixgbe/ixgbe_rxtx.h | 9 +++++ 4 files changed, 116 insertions(+), 35 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +26 -30
@@ -2337,6 +2337,7 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2356,6 +2357,13 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3649,28 +3657,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - - dev_info->tx_offload_capa = -DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_MACSEC_INSERT ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ; - -#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; -#endif + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3692,7 +3680,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -3776,12 +3766,8 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3803,7 +3789,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -4941,6 +4929,7 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id);
@@ -4953,6 +4942,13 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* * VF has no ability to enable/disable HW CRC
drivers/net/ixgbe/ixgbe_ipsec.c +4 -1
@@ -599,8 +599,11 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg;uint64_t rx_offloads; +uint64_t tx_offloads; rx_offloads = dev->data->dev_conf.rxmode.offloads; + tx_offloads = dev->data->dev_conf.txmode.offloads; +/* sanity checks */ if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );
@@ -634,7 +637,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)return -1 ; } } -if (dev->data->dev_conf.txmode.offloads &DEV_TX_OFFLOAD_SECURITY ) { +if (tx_offloads &DEV_TX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECTXCTRL ,IXGBE_SECTXCTRL_STORE_FORWARD ); reg =IXGBE_READ_REG (hw,IXGBE_SECTXCTRL );
drivers/net/ixgbe/ixgbe_rxtx.c +77 -4
117 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +9 -0
@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */ uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */ /** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM ];
@@ -254,6 +255,12 @@ struct ixgbe_txq_ops {#define IXGBE_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \ ETH_TXQ_FLAGS_NOOFFLOADS) +#define IXGBE_SIMPLE_TX_OFFLOAD_FLAGS ((uint64_t)DEV_TX_OFFLOAD_MULTI_SEGS |\ + DEV_TX_OFFLOAD_VLAN_INSERT |\ + DEV_TX_OFFLOAD_SCTP_CKSUM |\ + DEV_TX_OFFLOAD_UDP_CKSUM |\ + DEV_TX_OFFLOAD_TCP_CKSUM) +/* * Populate descriptors with the following info: * 1.) buffer_addr = phys_addr + headroom
@@ -307,8 +314,10 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_tx_queue_offloads (struct rte_eth_dev *dev);#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
Signature · 1 line
2.7.5
v3 cover net/ixgbe: convert to new offloads API
In reply to Wei DaiThis patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.
---
v3: Rx header spliting capability is only enabled in
#ifdef RTE_HEADER_SPLIT_ENABLE.
Tx vector tranmit function only work without any Tx offloads.
v2: improve error checking
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads API
drivers/net/ixgbe/ixgbe_ethdev.c | 264 ++++++++++++++---------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 245 ++++++++++++++++++++++++--- drivers/net/ixgbe/ixgbe_rxtx.h | 7 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 370 insertions(+), 172 deletions(-)
Signature · 1 line
2.7.5
PATCH v3 1/4 net/ixgbe: support VLAN strip per queue offloading in PF
VLAN strip is a per queue offloading in PF. With this patch it can be enabled or disabled on any Rx queue in PF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 109 +++++++++++++++++---------------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 1 + drivers/net/ixgbe/ixgbe_rxtx.h | 1 + 5 files changed, 51 insertions(+), 69 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +47 -62
@@ -2001,64 +2001,6 @@ ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue)ixgbe_vlan_hw_strip_bitmap_set (dev, queue,1 ); } -void -ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl &= ~IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl &= ~IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,0 ); - } - } -} - -void -ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl |=IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl |=IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,1 ); - } - } -} -static void ixgbe_vlan_hw_extend_disable (struct rte_eth_dev *dev) {
@@ -2114,14 +2056,57 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)*/ } +void +ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev) +{ +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; +uint32_t ctrl; +uint16_t i; +struct ixgbe_rx_queue *rxq; +bool on; + +PMD_INIT_FUNC_TRACE (); + +if (hw->mac.type == ixgbe_mac_82598EB) { +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl |=IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + }else { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl &= ~IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + } + }else { +/* +* Other 10G NIC, the VLAN strip can be setup +* per queue in RXDCTL +*/ +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); +if (rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl |=IXGBE_RXDCTL_VME ; + on = TRUE; + }else { + ctrl &= ~IXGBE_RXDCTL_VME ; + on = FALSE; + } +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); + +/* record those setting for HW strip per queue */ +ixgbe_vlan_hw_strip_bitmap_set (dev, i, on); + } + } +} +static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) {if (mask Ð_VLAN_STRIP_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) {
drivers/net/ixgbe/ixgbe_ethdev.h +1 -3
@@ -659,9 +659,7 @@ void ixgbe_vlan_hw_filter_enable(struct rte_eth_dev *dev);void ixgbe_vlan_hw_filter_disable (struct rte_eth_dev *dev); -void ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev); - -void ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev); +void ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev);void ixgbe_pf_host_init (struct rte_eth_dev *eth_dev);
drivers/net/ixgbe/ixgbe_pf.c +1 -4
@@ -329,10 +329,7 @@ set_rx_mode(struct rte_eth_dev *dev)IXGBE_WRITE_REG (hw,IXGBE_FCTRL , fctrl); -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); } static inline void
drivers/net/ixgbe/ixgbe_rxtx.c +1 -0
@@ -2820,6 +2820,7 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, 0 : ETHER_CRC_LEN); rxq->drop_en = rx_conf->rx_drop_en; rxq->rx_deferred_start = rx_conf->rx_deferred_start; + rxq->offloads = rx_conf->offloads;/* * The packet type in RX descriptor is different for different NICs.
drivers/net/ixgbe/ixgbe_rxtx.h +1 -0
@@ -129,6 +129,7 @@ struct ixgbe_rx_queue {uint8_t rx_deferred_start;/**< not in global dev start. */ /** flags to set in mbuf when a vlan is detected. */ uint64_t vlan_flags; +uint64_t offloads;/**< Rx offloads with DEV_RX_OFFLOAD_* */ /** need to alloc dummy mbuf, for wraparound when scanning hw ring */ struct rte_mbuf fake_mbuf;/** hold packets to return to application */
Signature · 1 line
2.7.5
PATCH v3 2/4 net/ixgbe: support VLAN strip per queue offloading in VF
In reply to Wei DaiVLAN strip is a per queue offloading in VF. With this patch it can be enabled or disabled on any Rx queue in VF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +5 -3
@@ -5215,15 +5215,17 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct ixgbe_rx_queue *rxq;uint16_t i;int on =0 ;/* VF function only support hw strip feature, others are not support */ if (mask Ð_VLAN_STRIP_MASK ) { - on = !!(dev->data->dev_conf.rxmode.hw_vlan_strip); - -for (i =0 ; i < hw->mac.max_rx_queues; i++) +for (i =0 ; i < hw->mac.max_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + on = !!(rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP );ixgbevf_vlan_strip_queue_set (dev, i, on); + } }return 0 ;
Signature · 1 line
2.7.5
PATCH v3 3/4 net/ixgbe: convert to new Rx offloads API
In reply to Wei DaiEthdev Rx offloads API has changed since:
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++++-------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 165 +++++++++++++++++++++++++++--- drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 2 +- drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 207 insertions(+), 66 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +49 -44
@@ -2105,19 +2105,22 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) { +struct rte_eth_rxmode *rxmode; + rxmode = &dev->data->dev_conf.rxmode; +if (mask Ð_VLAN_STRIP_MASK ) {ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_filter) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_FILTER )ixgbe_vlan_hw_filter_enable (dev);else ixgbe_vlan_hw_filter_disable (dev); }if (mask Ð_VLAN_EXTEND_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_extend) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_EXTEND )ixgbe_vlan_hw_extend_enable (dev);else ixgbe_vlan_hw_extend_disable (dev);
@@ -2332,6 +2335,8 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)IXGBE_DEV_PRIVATE_TO_INTR (dev->data->dev_private);struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2343,6 +2348,15 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)return ret; } +ixgbe_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3632,30 +3646,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)else dev_info->max_vmdq_pools =ETH_64_POOLS ; dev_info->vmdq_queue_num = dev_info->max_rx_queues; - dev_info->rx_offload_capa = -DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; - -/* -* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV -* mode. -*/ -if ((hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) && - !RTE_ETH_DEV_SRIOV (dev).active) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_TCP_LRO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_MACSEC_STRIP ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
@@ -3675,10 +3668,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ;#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) { - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_SECURITY ; +if (dev->security_ctx) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; - }#endif dev_info->default_rxconf = (struct rte_eth_rxconf ) {
@@ -3689,6 +3680,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -3781,11 +3773,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->max_vmdq_pools =ETH_16_POOLS ; else dev_info->max_vmdq_pools = ETH_64_POOLS; - dev_info->rx_offload_capa =DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT |DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM |
@@ -3801,6 +3791,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -4894,10 +4885,12 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)/* switch to jumbo mode if needed */ if (frame_size >ETHER_MAX_LEN ) { - dev->data->dev_conf.rxmode.jumbo_frame =1 ; + dev->data->dev_conf.rxmode.offloads |= +DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 |=IXGBE_HLREG0_JUMBOEN ; }else { - dev->data->dev_conf.rxmode.jumbo_frame =0 ; + dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; }IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);
@@ -4946,23 +4939,34 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)struct rte_eth_conf *conf = &dev->data->dev_conf;struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id); +ixgbevf_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* * VF has no ability to enable/disable HW CRC * Keep the persistent behavior the same as Host PF */ #ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC -if (!conf->rxmode.hw_strip_crc) { +if (!(conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_INIT_LOG (NOTICE ,"VF can't disable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =1 ; + conf->rxmode.offloads |=DEV_RX_OFFLOAD_CRC_STRIP ; }#else -if (conf->rxmode.hw_strip_crc) { +if (conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP ) {PMD_INIT_LOG (NOTICE ,"VF can't enable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =0 ; + conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP ; }#endif
@@ -5850,6 +5854,7 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t tx_rate) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode;uint32_t rf_dec, rf_int;uint32_t bcnrc_val;uint16_t link_speed = dev->data->dev_link.link_speed;
@@ -5871,14 +5876,14 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, bcnrc_val =0 ; } + rxmode = &dev->data->dev_conf.rxmode;/* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise * set as 0x4. */ -if ((dev->data->dev_conf.rxmode.jumbo_frame ==1 ) && - (dev->data->dev_conf.rxmode.max_rx_pkt_len >= -IXGBE_MAX_JUMBO_FRAME_SIZE )) +if ((rxmode->offloads &DEV_RX_OFFLOAD_JUMBO_FRAME ) && + (rxmode->max_rx_pkt_len >=IXGBE_MAX_JUMBO_FRAME_SIZE ))IXGBE_WRITE_REG (hw,IXGBE_RTTBCNRM ,IXGBE_MMW_SIZE_JUMBO_FRAME );else
@@ -6225,7 +6230,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)/* refuse mtu that requires the support of scattered packets when this * feature has not been enabled before. */ -if (!rx_conf->enable_scatter && +if (!(rx_conf->offloads &DEV_RX_OFFLOAD_SCATTER ) && (max_frame +2 *IXGBE_VLAN_TAG_SIZE > dev->data->min_rx_buf_size -RTE_PKTMBUF_HEADROOM ))return -EINVAL ;
drivers/net/ixgbe/ixgbe_ipsec.c +5 -3
@@ -598,13 +598,15 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg; +uint64_t rx_offloads; + rx_offloads = dev->data->dev_conf.rxmode.offloads;/* sanity checks */ -if (dev->data->dev_conf.rxmode.enable_lro) { +if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );return -1 ; } -if (!dev->data->dev_conf.rxmode.hw_strip_crc) { +if (!(rx_offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_DRV_LOG (ERR ,"HW CRC strip needs to be enabled for IPsec" );return -1 ; }
@@ -624,7 +626,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) reg |=IXGBE_HLREG0_TXCRCEN |IXGBE_HLREG0_RXCRCSTRP ;IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , reg); -if (dev->data->dev_conf.rxmode.offloads &DEV_RX_OFFLOAD_SECURITY ) { +if (rx_offloads &DEV_RX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECRXCTRL ,0 ); reg =IXGBE_READ_REG (hw,IXGBE_SECRXCTRL );if (reg !=0 ) {
drivers/net/ixgbe/ixgbe_rxtx.c +148 -17
296 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -307,5 +307,8 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
drivers/net/ixgbe/ixgbe_rxtx_vec_common.h +1 -1
@@ -286,7 +286,7 @@ ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev)return -1 ;/* no header split support */ -if (rxmode->header_split ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_HEADER_SPLIT )return -1 ;return 0 ;
drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c +1 -1
@@ -515,7 +515,7 @@ ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;/* no csum error report support */ -if (rxmode->hw_ip_checksum ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_CHECKSUM )return -1 ;return ixgbe_rx_vec_dev_conf_condition_check_default (dev);
Signature · 1 line
2.7.5
PATCH v3 4/4 net/ixgbe: convert to new Tx offloads API
In reply to Wei DaiEthdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") This commit support the new Tx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 56 +++++++++++++--------------- drivers/net/ixgbe/ixgbe_ipsec.c | 5 ++- drivers/net/ixgbe/ixgbe_rxtx.c | 79 ++++++++++++++++++++++++++++++++++++++-- drivers/net/ixgbe/ixgbe_rxtx.h | 3 ++ 4 files changed, 108 insertions(+), 35 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +26 -30
@@ -2337,6 +2337,7 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2356,6 +2357,13 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3649,28 +3657,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - - dev_info->tx_offload_capa = -DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_MACSEC_INSERT ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ; - -#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; -#endif + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3692,7 +3680,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -3776,12 +3766,8 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3803,7 +3789,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -4941,6 +4929,7 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id);
@@ -4953,6 +4942,13 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* * VF has no ability to enable/disable HW CRC
drivers/net/ixgbe/ixgbe_ipsec.c +4 -1
@@ -599,8 +599,11 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg;uint64_t rx_offloads; +uint64_t tx_offloads; rx_offloads = dev->data->dev_conf.rxmode.offloads; + tx_offloads = dev->data->dev_conf.txmode.offloads; +/* sanity checks */ if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );
@@ -634,7 +637,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)return -1 ; } } -if (dev->data->dev_conf.txmode.offloads &DEV_TX_OFFLOAD_SECURITY ) { +if (tx_offloads &DEV_TX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECTXCTRL ,IXGBE_SECTXCTRL_STORE_FORWARD ); reg =IXGBE_READ_REG (hw,IXGBE_SECTXCTRL );
drivers/net/ixgbe/ixgbe_rxtx.c +75 -4
115 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */ uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */ /** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM ];
@@ -307,8 +308,10 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_tx_queue_offloads (struct rte_eth_dev *dev);#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
Signature · 1 line
2.7.5
v4 cover net/ixgbe: convert to new offloads API
In reply to Wei DaiThis patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.
---
v4: don't support header spliting any more
v3: Rx header spliting capability is only enabled in
#ifdef RTE_HEADER_SPLIT_ENABLE.
Tx vector tranmit function only work without any Tx offloads.
v2: improve error checking
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads API
drivers/net/ixgbe/ixgbe_ethdev.c | 264 ++++++++++++++-------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 275 +++++++++++++++++++++++------- drivers/net/ixgbe/ixgbe_rxtx.h | 7 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 5 - drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 359 insertions(+), 216 deletions(-)
Signature · 1 line
2.9.5
PATCH v4 1/4 net/ixgbe: support VLAN strip per queue offloading in PF
VLAN strip is a per queue offloading in PF. With this patch it can be enabled or disabled on any Rx queue in PF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 109 +++++++++++++++++---------------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 1 + drivers/net/ixgbe/ixgbe_rxtx.h | 1 + 5 files changed, 51 insertions(+), 69 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +47 -62
@@ -2001,64 +2001,6 @@ ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue)ixgbe_vlan_hw_strip_bitmap_set (dev, queue,1 ); } -void -ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl &= ~IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl &= ~IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,0 ); - } - } -} - -void -ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev) -{ -struct ixgbe_hw *hw = -IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); -uint32_t ctrl; -uint16_t i; -struct ixgbe_rx_queue *rxq; - -PMD_INIT_FUNC_TRACE (); - -if (hw->mac.type == ixgbe_mac_82598EB) { - ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - ctrl |=IXGBE_VLNCTRL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); - }else { -/* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */ -for (i =0 ; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; - ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); - ctrl |=IXGBE_RXDCTL_VME ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); - -/* record those setting for HW strip per queue */ -ixgbe_vlan_hw_strip_bitmap_set (dev, i,1 ); - } - } -} -static void ixgbe_vlan_hw_extend_disable (struct rte_eth_dev *dev) {
@@ -2114,14 +2056,57 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)*/ } +void +ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev) +{ +struct ixgbe_hw *hw = +IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; +uint32_t ctrl; +uint16_t i; +struct ixgbe_rx_queue *rxq; +bool on; + +PMD_INIT_FUNC_TRACE (); + +if (hw->mac.type == ixgbe_mac_82598EB) { +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl |=IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + }else { + ctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + ctrl &= ~IXGBE_VLNCTRL_VME ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , ctrl); + } + }else { +/* +* Other 10G NIC, the VLAN strip can be setup +* per queue in RXDCTL +*/ +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + ctrl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (rxq->reg_idx)); +if (rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP ) { + ctrl |=IXGBE_RXDCTL_VME ; + on = TRUE; + }else { + ctrl &= ~IXGBE_RXDCTL_VME ; + on = FALSE; + } +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (rxq->reg_idx), ctrl); + +/* record those setting for HW strip per queue */ +ixgbe_vlan_hw_strip_bitmap_set (dev, i, on); + } + } +} +static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) {if (mask Ð_VLAN_STRIP_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) {
drivers/net/ixgbe/ixgbe_ethdev.h +1 -3
@@ -659,9 +659,7 @@ void ixgbe_vlan_hw_filter_enable(struct rte_eth_dev *dev);void ixgbe_vlan_hw_filter_disable (struct rte_eth_dev *dev); -void ixgbe_vlan_hw_strip_enable_all (struct rte_eth_dev *dev); - -void ixgbe_vlan_hw_strip_disable_all (struct rte_eth_dev *dev); +void ixgbe_vlan_hw_strip_config (struct rte_eth_dev *dev);void ixgbe_pf_host_init (struct rte_eth_dev *eth_dev);
drivers/net/ixgbe/ixgbe_pf.c +1 -4
@@ -329,10 +329,7 @@ set_rx_mode(struct rte_eth_dev *dev)IXGBE_WRITE_REG (hw,IXGBE_FCTRL , fctrl); -if (dev->data->dev_conf.rxmode.hw_vlan_strip) -ixgbe_vlan_hw_strip_enable_all (dev); -else -ixgbe_vlan_hw_strip_disable_all (dev); +ixgbe_vlan_hw_strip_config (dev); } static inline void
drivers/net/ixgbe/ixgbe_rxtx.c +1 -0
@@ -2820,6 +2820,7 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, 0 : ETHER_CRC_LEN); rxq->drop_en = rx_conf->rx_drop_en; rxq->rx_deferred_start = rx_conf->rx_deferred_start; + rxq->offloads = rx_conf->offloads;/* * The packet type in RX descriptor is different for different NICs.
drivers/net/ixgbe/ixgbe_rxtx.h +1 -0
@@ -129,6 +129,7 @@ struct ixgbe_rx_queue {uint8_t rx_deferred_start;/**< not in global dev start. */ /** flags to set in mbuf when a vlan is detected. */ uint64_t vlan_flags; +uint64_t offloads;/**< Rx offloads with DEV_RX_OFFLOAD_* */ /** need to alloc dummy mbuf, for wraparound when scanning hw ring */ struct rte_mbuf fake_mbuf;/** hold packets to return to application */
Signature · 1 line
2.9.5
PATCH v4 2/4 net/ixgbe: support VLAN strip per queue offloading in VF
In reply to Wei DaiVLAN strip is a per queue offloading in VF. With this patch it can be enabled or disabled on any Rx queue in VF.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +5 -3
@@ -5215,15 +5215,17 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct ixgbe_rx_queue *rxq;uint16_t i;int on =0 ;/* VF function only support hw strip feature, others are not support */ if (mask Ð_VLAN_STRIP_MASK ) { - on = !!(dev->data->dev_conf.rxmode.hw_vlan_strip); - -for (i =0 ; i < hw->mac.max_rx_queues; i++) +for (i =0 ; i < hw->mac.max_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + on = !!(rxq->offloads &DEV_RX_OFFLOAD_VLAN_STRIP );ixgbevf_vlan_strip_queue_set (dev, i, on); + } }return 0 ;
Signature · 1 line
2.9.5
PATCH v4 3/4 net/ixgbe: convert to new Rx offloads API
In reply to Wei DaiEthdev Rx offloads API has changed since:
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") This commit support the new Rx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 93 +++++++------- drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- drivers/net/ixgbe/ixgbe_rxtx.c | 195 +++++++++++++++++++++--------- drivers/net/ixgbe/ixgbe_rxtx.h | 3 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 5 - drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 6 files changed, 196 insertions(+), 110 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +49 -44
@@ -2105,19 +2105,22 @@ ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)static int ixgbe_vlan_offload_set (struct rte_eth_dev *dev,int mask) { +struct rte_eth_rxmode *rxmode; + rxmode = &dev->data->dev_conf.rxmode; +if (mask Ð_VLAN_STRIP_MASK ) {ixgbe_vlan_hw_strip_config (dev); }if (mask Ð_VLAN_FILTER_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_filter) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_FILTER )ixgbe_vlan_hw_filter_enable (dev);else ixgbe_vlan_hw_filter_disable (dev); }if (mask Ð_VLAN_EXTEND_MASK ) { -if (dev->data->dev_conf.rxmode.hw_vlan_extend) +if (rxmode->offloads &DEV_RX_OFFLOAD_VLAN_EXTEND )ixgbe_vlan_hw_extend_enable (dev);else ixgbe_vlan_hw_extend_disable (dev);
@@ -2332,6 +2335,8 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)IXGBE_DEV_PRIVATE_TO_INTR (dev->data->dev_private);struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2343,6 +2348,15 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)return ret; } +ixgbe_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3632,30 +3646,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)else dev_info->max_vmdq_pools =ETH_64_POOLS ; dev_info->vmdq_queue_num = dev_info->max_rx_queues; - dev_info->rx_offload_capa = -DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; - -/* -* RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV -* mode. -*/ -if ((hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) && - !RTE_ETH_DEV_SRIOV (dev).active) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_TCP_LRO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_MACSEC_STRIP ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
@@ -3675,10 +3668,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ;#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) { - dev_info->rx_offload_capa |=DEV_RX_OFFLOAD_SECURITY ; +if (dev->security_ctx) dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; - }#endif dev_info->default_rxconf = (struct rte_eth_rxconf ) {
@@ -3689,6 +3680,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -3781,11 +3773,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->max_vmdq_pools =ETH_16_POOLS ; else dev_info->max_vmdq_pools = ETH_64_POOLS; - dev_info->rx_offload_capa =DEV_RX_OFFLOAD_VLAN_STRIP | -DEV_RX_OFFLOAD_IPV4_CKSUM | -DEV_RX_OFFLOAD_UDP_CKSUM | -DEV_RX_OFFLOAD_TCP_CKSUM | -DEV_RX_OFFLOAD_CRC_STRIP ; + dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); + dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | + dev_info->rx_queue_offload_capa); dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT |DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM |
@@ -3801,6 +3791,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, }, .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH, .rx_drop_en = 0, + .offloads = 0, }; dev_info->default_txconf = (struct rte_eth_txconf ) {
@@ -4894,10 +4885,12 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)/* switch to jumbo mode if needed */ if (frame_size >ETHER_MAX_LEN ) { - dev->data->dev_conf.rxmode.jumbo_frame =1 ; + dev->data->dev_conf.rxmode.offloads |= +DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 |=IXGBE_HLREG0_JUMBOEN ; }else { - dev->data->dev_conf.rxmode.jumbo_frame =0 ; + dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME ; hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; }IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);
@@ -4946,23 +4939,34 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)struct rte_eth_conf *conf = &dev->data->dev_conf;struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)dev->data->dev_private; +struct rte_eth_dev_info dev_info; +uint64_t rx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id); +ixgbevf_dev_info_get (dev, &dev_info); + rx_offloads = dev->data->dev_conf.rxmode.offloads; +if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) { +PMD_DRV_LOG (ERR ,"Some Rx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + rx_offloads, dev_info.rx_offload_capa); +return -ENOTSUP ; + } +/* * VF has no ability to enable/disable HW CRC * Keep the persistent behavior the same as Host PF */ #ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC -if (!conf->rxmode.hw_strip_crc) { +if (!(conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_INIT_LOG (NOTICE ,"VF can't disable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =1 ; + conf->rxmode.offloads |=DEV_RX_OFFLOAD_CRC_STRIP ; }#else -if (conf->rxmode.hw_strip_crc) { +if (conf->rxmode.offloads &DEV_RX_OFFLOAD_CRC_STRIP ) {PMD_INIT_LOG (NOTICE ,"VF can't enable HW CRC Strip" ); - conf->rxmode.hw_strip_crc =0 ; + conf->rxmode.offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP ; }#endif
@@ -5850,6 +5854,7 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t tx_rate) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private); +struct rte_eth_rxmode *rxmode;uint32_t rf_dec, rf_int;uint32_t bcnrc_val;uint16_t link_speed = dev->data->dev_link.link_speed;
@@ -5871,14 +5876,14 @@ ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev, bcnrc_val =0 ; } + rxmode = &dev->data->dev_conf.rxmode;/* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise * set as 0x4. */ -if ((dev->data->dev_conf.rxmode.jumbo_frame ==1 ) && - (dev->data->dev_conf.rxmode.max_rx_pkt_len >= -IXGBE_MAX_JUMBO_FRAME_SIZE )) +if ((rxmode->offloads &DEV_RX_OFFLOAD_JUMBO_FRAME ) && + (rxmode->max_rx_pkt_len >=IXGBE_MAX_JUMBO_FRAME_SIZE ))IXGBE_WRITE_REG (hw,IXGBE_RTTBCNRM ,IXGBE_MMW_SIZE_JUMBO_FRAME );else
@@ -6225,7 +6230,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)/* refuse mtu that requires the support of scattered packets when this * feature has not been enabled before. */ -if (!rx_conf->enable_scatter && +if (!(rx_conf->offloads &DEV_RX_OFFLOAD_SCATTER ) && (max_frame +2 *IXGBE_VLAN_TAG_SIZE > dev->data->min_rx_buf_size -RTE_PKTMBUF_HEADROOM ))return -EINVAL ;
drivers/net/ixgbe/ixgbe_ipsec.c +5 -3
@@ -598,13 +598,15 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) {struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg; +uint64_t rx_offloads; + rx_offloads = dev->data->dev_conf.rxmode.offloads;/* sanity checks */ -if (dev->data->dev_conf.rxmode.enable_lro) { +if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );return -1 ; } -if (!dev->data->dev_conf.rxmode.hw_strip_crc) { +if (!(rx_offloads &DEV_RX_OFFLOAD_CRC_STRIP )) {PMD_DRV_LOG (ERR ,"HW CRC strip needs to be enabled for IPsec" );return -1 ; }
@@ -624,7 +626,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev) reg |=IXGBE_HLREG0_TXCRCEN |IXGBE_HLREG0_RXCRCSTRP ;IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , reg); -if (dev->data->dev_conf.rxmode.offloads &DEV_RX_OFFLOAD_SECURITY ) { +if (rx_offloads &DEV_RX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECRXCTRL ,0 ); reg =IXGBE_READ_REG (hw,IXGBE_SECRXCTRL );if (reg !=0 ) {
drivers/net/ixgbe/ixgbe_rxtx.c +138 -57
324 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -307,5 +307,8 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
drivers/net/ixgbe/ixgbe_rxtx_vec_common.h +0 -5
@@ -278,17 +278,12 @@ static inline int ixgbe_rx_vec_dev_conf_condition_check_default(struct rte_eth_dev *dev) {#ifndef RTE_LIBRTE_IEEE1588 -struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;struct rte_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf;/* no fdir support */ if (fconf->mode !=RTE_FDIR_MODE_NONE )return -1 ; -/* no header split support */ -if (rxmode->header_split ==1 ) -return -1 ; -return 0 ;#else RTE_SET_USED (dev);
drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c +1 -1
@@ -515,7 +515,7 @@ ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;/* no csum error report support */ -if (rxmode->hw_ip_checksum ==1 ) +if (rxmode->offloads &DEV_RX_OFFLOAD_CHECKSUM )return -1 ;return ixgbe_rx_vec_dev_conf_condition_check_default (dev);
Signature · 1 line
2.9.5
PATCH v4 4/4 net/ixgbe: convert to new Tx offloads API
In reply to Wei DaiEthdev Tx offloads API has changed since:
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") This commit support the new Tx offloads API.
--- drivers/net/ixgbe/ixgbe_ethdev.c | 56 +++++++++++++--------------- drivers/net/ixgbe/ixgbe_ipsec.c | 5 ++- drivers/net/ixgbe/ixgbe_rxtx.c | 79 ++++++++++++++++++++++++++++++++++++++-- drivers/net/ixgbe/ixgbe_rxtx.h | 3 ++ 4 files changed, 108 insertions(+), 35 deletions(-)
drivers/net/ixgbe/ixgbe_ethdev.c +26 -30
@@ -2337,6 +2337,7 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;int ret;PMD_INIT_FUNC_TRACE ();
@@ -2356,6 +2357,13 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* set flag to update link status after init */ intr->flags |=IXGBE_FLAG_NEED_LINK_UPDATE ;
@@ -3649,28 +3657,8 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - - dev_info->tx_offload_capa = -DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; - -if (hw->mac.type == ixgbe_mac_82599EB || - hw->mac.type == ixgbe_mac_X540) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_MACSEC_INSERT ; - -if (hw->mac.type == ixgbe_mac_X550 || - hw->mac.type == ixgbe_mac_X550EM_x || - hw->mac.type == ixgbe_mac_X550EM_a) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ; - -#ifdef RTE_LIBRTE_SECURITY -if (dev->security_ctx) - dev_info->tx_offload_capa |=DEV_TX_OFFLOAD_SECURITY ; -#endif + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3692,7 +3680,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -3776,12 +3766,8 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, dev_info->rx_queue_offload_capa =ixgbe_get_rx_queue_offloads (dev); dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads (dev) | dev_info->rx_queue_offload_capa); - dev_info->tx_offload_capa =DEV_TX_OFFLOAD_VLAN_INSERT | -DEV_TX_OFFLOAD_IPV4_CKSUM | -DEV_TX_OFFLOAD_UDP_CKSUM | -DEV_TX_OFFLOAD_TCP_CKSUM | -DEV_TX_OFFLOAD_SCTP_CKSUM | -DEV_TX_OFFLOAD_TCP_TSO ; + dev_info->tx_queue_offload_capa =ixgbe_get_tx_queue_offloads (dev); + dev_info->tx_offload_capa =ixgbe_get_tx_port_offloads (dev); dev_info->default_rxconf = (struct rte_eth_rxconf ) { .rx_thresh = {
@@ -3803,7 +3789,9 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH, .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH, .txq_flags =ETH_TXQ_FLAGS_NOMULTSEGS | - ETH_TXQ_FLAGS_NOOFFLOADS, +ETH_TXQ_FLAGS_NOOFFLOADS | + ETH_TXQ_FLAGS_IGNORE, + .offloads = 0, }; dev_info->rx_desc_lim = rx_desc_lim;
@@ -4941,6 +4929,7 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) (struct ixgbe_adapter *)dev->data->dev_private;struct rte_eth_dev_info dev_info;uint64_t rx_offloads; +uint64_t tx_offloads;PMD_INIT_LOG (DEBUG ,"Configured Virtual Function port id: %d" , dev->data->port_id);
@@ -4953,6 +4942,13 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev) rx_offloads, dev_info.rx_offload_capa);return -ENOTSUP ; } + tx_offloads = dev->data->dev_conf.txmode.offloads; +if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) { +PMD_DRV_LOG (ERR ,"Some Tx offloads are not supported " +"requested 0x%" PRIx64" supported 0x%" PRIx64, + tx_offloads, dev_info.tx_offload_capa); +return -ENOTSUP ; + }/* * VF has no ability to enable/disable HW CRC
drivers/net/ixgbe/ixgbe_ipsec.c +4 -1
@@ -599,8 +599,11 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)struct ixgbe_hw *hw =IXGBE_DEV_PRIVATE_TO_HW (dev->data->dev_private);uint32_t reg;uint64_t rx_offloads; +uint64_t tx_offloads; rx_offloads = dev->data->dev_conf.rxmode.offloads; + tx_offloads = dev->data->dev_conf.txmode.offloads; +/* sanity checks */ if (rx_offloads &DEV_RX_OFFLOAD_TCP_LRO ) {PMD_DRV_LOG (ERR ,"RSC and IPsec not supported" );
@@ -634,7 +637,7 @@ ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev)return -1 ; } } -if (dev->data->dev_conf.txmode.offloads &DEV_TX_OFFLOAD_SECURITY ) { +if (tx_offloads &DEV_TX_OFFLOAD_SECURITY ) {IXGBE_WRITE_REG (hw,IXGBE_SECTXCTRL ,IXGBE_SECTXCTRL_STORE_FORWARD ); reg =IXGBE_READ_REG (hw,IXGBE_SECTXCTRL );
drivers/net/ixgbe/ixgbe_rxtx.c +75 -4
115 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_rxtx.h +3 -0
@@ -223,6 +223,7 @@ struct ixgbe_tx_queue {uint8_t hthresh;/**< Host threshold register. */ uint8_t wthresh;/**< Write-back threshold reg. */ uint32_t txq_flags;/**< Holds flags for this TXq */ +uint64_t offloads;/**< Tx offload flags of DEV_TX_OFFLOAD_* */ uint32_t ctx_curr;/**< Hardware context states. */ /** Hardware context0 history. */ struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM ];
@@ -307,8 +308,10 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);int ixgbe_txq_vec_setup (struct ixgbe_tx_queue *txq); +uint64_t ixgbe_get_tx_port_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_queue_offloads (struct rte_eth_dev *dev);uint64_t ixgbe_get_rx_port_offloads (struct rte_eth_dev *dev); +uint64_t ixgbe_get_tx_queue_offloads (struct rte_eth_dev *dev);#endif /* RTE_IXGBE_INC_VECTOR */ #endif /* _IXGBE_RXTX_H_ */
Signature · 1 line
2.9.5
Re: [PATCH v4 0/4] net/ixgbe: convert to new offloads API
In reply to Wei DaiQuoted 39 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Wei Dai
Sent: Thursday, March 22, 2018 11:41 AM
To: Ananyev, Konstantin <[email protected]>; Lu, Wenzhuo <[email protected]>
Cc: [email protected]; Dai, Wei <[email protected]>
Subject: [dpdk-dev] [PATCH v4 0/4] net/ixgbe: convert to new offloads APIThis patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.---
v4: don't support header spliting any morev3: Rx header spliting capability is only enabled in
#ifdefRTE_HEADER_SPLIT_ENABLE.
Tx vector tranmit function only work without any Tx offloads.v2: improve error checking
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads APIdrivers/net/ixgbe/ixgbe_ethdev.c | 264 ++++++++++++++-------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 275 +++++++++++++++++++++++------- drivers/net/ixgbe/ixgbe_rxtx.h | 7 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 5 - drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 359 insertions(+), 216 deletions(-)
Quoted 2 lines
--
2.9.5
It's better to only enable per queue vlan-strip without convert to new offload in patch 1,2 then convert all to new offload in patch 3,4
But still ok for me.
Re: [PATCH v4 0/4] net/ixgbe: convert to new offloads API
Quoted 49 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Zhang, Qi Z
Sent: Monday, April 2, 2018 9:27 PM
To: Dai, Wei; Ananyev, Konstantin; Lu, Wenzhuo
Cc: [email protected]; Dai, Wei
Subject: Re: [dpdk-dev] [PATCH v4 0/4] net/ixgbe: convert to new offloads APIQuoted 40 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Wei Dai
Sent: Thursday, March 22, 2018 11:41 AM
To: Ananyev, Konstantin <[email protected]>; Lu, Wenzhuo <[email protected]>
Cc: [email protected]; Dai, Wei <[email protected]>
Subject: [dpdk-dev] [PATCH v4 0/4] net/ixgbe: convert to new offloads APIThis patch set adds support of per queue VLAN strip offloading in ixgbe PF and VF.
This patch support new offloads API in ixgbe PF and VF.---
v4: don't support header spliting any morev3: Rx header spliting capability is only enabled in
#ifdefRTE_HEADER_SPLIT_ENABLE.
Tx vector tranmit function only work without any Tx offloads.v2: improve error checking
Wei Dai (4):
net/ixgbe: support VLAN strip per queue offloading in PF net/ixgbe: support VLAN strip per queue offloading in VF net/ixgbe: convert to new Rx offloads API net/ixgbe: convert to new Tx offloads APIdrivers/net/ixgbe/ixgbe_ethdev.c | 264 ++++++++++++++-------------- drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- drivers/net/ixgbe/ixgbe_ipsec.c | 13 +- drivers/net/ixgbe/ixgbe_pf.c | 5 +- drivers/net/ixgbe/ixgbe_rxtx.c | 275 +++++++++++++++++++++++------- drivers/net/ixgbe/ixgbe_rxtx.h | 7 + drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 5 - drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 2 +- 8 files changed, 359 insertions(+), 216 deletions(-)
Quoted 7 lines
Quoted 2 lines
--
2.9.5It's better to only enable per queue vlan-strip without convert to new offload in patch 1,2 then convert all to new offload in patch 3,4 But still ok for me.
Acked-by Qi Zhang <[email protected]>
Series applied to dpdk-next-net-intel, thanks!
/Helin