From 42a6a4a6906c78e89813aa022782957b7190e9ba Mon Sep 17 00:00:00 2001 From: David Marchand Date: Tue, 17 Jun 2014 20:09:29 +0200 Subject: [PATCH] ethdev: allow to force Rx scatter mode We might want to be sure the scatter packets reception handler is selected in a pmd. This makes it possible to then change mtu later, without the need of restarting a port. It is then the pmd duty to tell it enabled the scatter reception handler by setting dev->data->scattered_rx to 1. Signed-off-by: David Marchand Acked-by: Konstantin Ananyev --- lib/librte_ether/rte_ethdev.h | 3 ++- lib/librte_pmd_e1000/em_rxtx.c | 5 +++++ lib/librte_pmd_e1000/igb_rxtx.c | 10 ++++++++++ lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 10 ++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 581259dcfe..2b987004a6 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -307,7 +307,8 @@ struct rte_eth_rxmode { hw_vlan_strip : 1, /**< VLAN strip enable. */ hw_vlan_extend : 1, /**< Extended VLAN enable. */ jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */ - hw_strip_crc : 1; /**< Enable CRC stripping by hardware. */ + hw_strip_crc : 1, /**< Enable CRC stripping by hardware. */ + enable_scatter : 1; /**< Enable scatter packets rx handler */ }; /** diff --git a/lib/librte_pmd_e1000/em_rxtx.c b/lib/librte_pmd_e1000/em_rxtx.c index 1575e79a86..e5f1933f53 100644 --- a/lib/librte_pmd_e1000/em_rxtx.c +++ b/lib/librte_pmd_e1000/em_rxtx.c @@ -1714,6 +1714,11 @@ eth_em_rx_init(struct rte_eth_dev *dev) } } + if (dev->data->dev_conf.rxmode.enable_scatter) { + dev->rx_pkt_burst = eth_em_recv_scattered_pkts; + dev->data->scattered_rx = 1; + } + /* * Setup the Checksum Register. * Receive Full-Packet Checksum Offload is mutually exclusive with RSS. diff --git a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxtx.c index 9f0310ddf3..aea898c139 100644 --- a/lib/librte_pmd_e1000/igb_rxtx.c +++ b/lib/librte_pmd_e1000/igb_rxtx.c @@ -2008,6 +2008,11 @@ eth_igb_rx_init(struct rte_eth_dev *dev) E1000_WRITE_REG(hw, E1000_RXDCTL(rxq->reg_idx), rxdctl); } + if (dev->data->dev_conf.rxmode.enable_scatter) { + dev->rx_pkt_burst = eth_igb_recv_scattered_pkts; + dev->data->scattered_rx = 1; + } + /* * Setup BSIZE field of RCTL register, if needed. * Buffer sizes >= 1024 are not [supposed to be] setup in the RCTL @@ -2277,6 +2282,11 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev) E1000_WRITE_REG(hw, E1000_RXDCTL(i), rxdctl); } + if (dev->data->dev_conf.rxmode.enable_scatter) { + dev->rx_pkt_burst = eth_igb_recv_scattered_pkts; + dev->data->scattered_rx = 1; + } + /* * Setup the HW Rx Head and Tail Descriptor Pointers. * This needs to be done after enable. diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c index ca72e7501f..f487859bdf 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c @@ -3486,6 +3486,11 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev) } } + if (dev->data->dev_conf.rxmode.enable_scatter) { + dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; + dev->data->scattered_rx = 1; + } + /* * Device configured with multiple RX queues. */ @@ -3961,6 +3966,11 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev) } } + if (dev->data->dev_conf.rxmode.enable_scatter) { + dev->rx_pkt_burst = ixgbe_recv_scattered_pkts; + dev->data->scattered_rx = 1; + } + return 0; } -- 2.20.1