Message ID | 20230704095915.9750-3-sriram.yagnaraman@est.tech (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | igb: Add support for AF_XDP zero-copy | expand |
On Tue, Jul 04, 2023 at 11:59:13AM +0200, Sriram Yagnaraman wrote: > Add enable/disable functions for TX and RX rings, will be used in later > patches when AF_XDP zero-copy support is added. > > Signed-off-by: Sriram Yagnaraman <sriram.yagnaraman@est.tech> > --- > drivers/net/ethernet/intel/igb/igb.h | 5 ++- > drivers/net/ethernet/intel/igb/igb_main.c | 41 +++++++++++++++++++++++ > 2 files changed, 45 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h > index 94440af6cf4b..5fa011c6ef2f 100644 > --- a/drivers/net/ethernet/intel/igb/igb.h > +++ b/drivers/net/ethernet/intel/igb/igb.h > @@ -384,7 +384,8 @@ enum e1000_ring_flags_t { > IGB_RING_FLAG_RX_SCTP_CSUM, > IGB_RING_FLAG_RX_LB_VLAN_BSWAP, > IGB_RING_FLAG_TX_CTX_IDX, > - IGB_RING_FLAG_TX_DETECT_HANG > + IGB_RING_FLAG_TX_DETECT_HANG, > + IGB_RING_FLAG_TX_DISABLED > }; > > #define ring_uses_large_buffer(ring) \ > @@ -735,6 +736,8 @@ void igb_free_tx_resources(struct igb_ring *); > void igb_free_rx_resources(struct igb_ring *); > void igb_configure_tx_ring(struct igb_adapter *, struct igb_ring *); > void igb_configure_rx_ring(struct igb_adapter *, struct igb_ring *); > +void igb_txrx_ring_disable(struct igb_adapter *adapter, u16 qid); > +void igb_txrx_ring_enable(struct igb_adapter *adapter, u16 qid); > void igb_setup_tctl(struct igb_adapter *); > void igb_setup_rctl(struct igb_adapter *); > void igb_setup_srrctl(struct igb_adapter *, struct igb_ring *); > diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c > index dadc3d423cfd..391c0eb136d9 100644 > --- a/drivers/net/ethernet/intel/igb/igb_main.c > +++ b/drivers/net/ethernet/intel/igb/igb_main.c > @@ -4856,6 +4856,47 @@ static void igb_configure_rx(struct igb_adapter *adapter) > } > } > > +void igb_txrx_ring_disable(struct igb_adapter *adapter, u16 qid) they could be static funcs defined in igb_xsk.c i believe? I'll review the rest after you address the things I have requested on cover letter response. > +{ > + struct e1000_hw *hw = &adapter->hw; > + struct igb_ring *tx_ring = adapter->tx_ring[qid]; > + struct igb_ring *rx_ring = adapter->rx_ring[qid]; > + > + set_bit(IGB_RING_FLAG_TX_DISABLED, &tx_ring->flags); > + > + wr32(E1000_TXDCTL(tx_ring->reg_idx), 0); > + wr32(E1000_RXDCTL(rx_ring->reg_idx), 0); > + > + /* Rx/Tx share the same napi context. */ > + napi_disable(&rx_ring->q_vector->napi); > + > + igb_clean_tx_ring(tx_ring); > + igb_clean_rx_ring(rx_ring); > + > + memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats)); > + memset(&tx_ring->tx_stats, 0, sizeof(tx_ring->tx_stats)); > +} > + > +void igb_txrx_ring_enable(struct igb_adapter *adapter, u16 qid) > +{ > + struct igb_ring *tx_ring = adapter->tx_ring[qid]; > + struct igb_ring *rx_ring = adapter->rx_ring[qid]; > + > + /* Rx/Tx share the same napi context. */ > + napi_enable(&rx_ring->q_vector->napi); > + > + igb_configure_tx_ring(adapter, tx_ring); > + igb_configure_rx_ring(adapter, rx_ring); > + > + /* call igb_desc_unused which always leaves > + * at least 1 descriptor unused to make sure > + * next_to_use != next_to_clean > + */ > + igb_alloc_rx_buffers(rx_ring, igb_desc_unused(rx_ring)); > + > + clear_bit(IGB_RING_FLAG_TX_DISABLED, &tx_ring->flags); > +} > + > /** > * igb_free_tx_resources - Free Tx Resources per Queue > * @tx_ring: Tx descriptor ring for a specific queue > -- > 2.34.1 > >
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 94440af6cf4b..5fa011c6ef2f 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h @@ -384,7 +384,8 @@ enum e1000_ring_flags_t { IGB_RING_FLAG_RX_SCTP_CSUM, IGB_RING_FLAG_RX_LB_VLAN_BSWAP, IGB_RING_FLAG_TX_CTX_IDX, - IGB_RING_FLAG_TX_DETECT_HANG + IGB_RING_FLAG_TX_DETECT_HANG, + IGB_RING_FLAG_TX_DISABLED }; #define ring_uses_large_buffer(ring) \ @@ -735,6 +736,8 @@ void igb_free_tx_resources(struct igb_ring *); void igb_free_rx_resources(struct igb_ring *); void igb_configure_tx_ring(struct igb_adapter *, struct igb_ring *); void igb_configure_rx_ring(struct igb_adapter *, struct igb_ring *); +void igb_txrx_ring_disable(struct igb_adapter *adapter, u16 qid); +void igb_txrx_ring_enable(struct igb_adapter *adapter, u16 qid); void igb_setup_tctl(struct igb_adapter *); void igb_setup_rctl(struct igb_adapter *); void igb_setup_srrctl(struct igb_adapter *, struct igb_ring *); diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index dadc3d423cfd..391c0eb136d9 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -4856,6 +4856,47 @@ static void igb_configure_rx(struct igb_adapter *adapter) } } +void igb_txrx_ring_disable(struct igb_adapter *adapter, u16 qid) +{ + struct e1000_hw *hw = &adapter->hw; + struct igb_ring *tx_ring = adapter->tx_ring[qid]; + struct igb_ring *rx_ring = adapter->rx_ring[qid]; + + set_bit(IGB_RING_FLAG_TX_DISABLED, &tx_ring->flags); + + wr32(E1000_TXDCTL(tx_ring->reg_idx), 0); + wr32(E1000_RXDCTL(rx_ring->reg_idx), 0); + + /* Rx/Tx share the same napi context. */ + napi_disable(&rx_ring->q_vector->napi); + + igb_clean_tx_ring(tx_ring); + igb_clean_rx_ring(rx_ring); + + memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats)); + memset(&tx_ring->tx_stats, 0, sizeof(tx_ring->tx_stats)); +} + +void igb_txrx_ring_enable(struct igb_adapter *adapter, u16 qid) +{ + struct igb_ring *tx_ring = adapter->tx_ring[qid]; + struct igb_ring *rx_ring = adapter->rx_ring[qid]; + + /* Rx/Tx share the same napi context. */ + napi_enable(&rx_ring->q_vector->napi); + + igb_configure_tx_ring(adapter, tx_ring); + igb_configure_rx_ring(adapter, rx_ring); + + /* call igb_desc_unused which always leaves + * at least 1 descriptor unused to make sure + * next_to_use != next_to_clean + */ + igb_alloc_rx_buffers(rx_ring, igb_desc_unused(rx_ring)); + + clear_bit(IGB_RING_FLAG_TX_DISABLED, &tx_ring->flags); +} + /** * igb_free_tx_resources - Free Tx Resources per Queue * @tx_ring: Tx descriptor ring for a specific queue
Add enable/disable functions for TX and RX rings, will be used in later patches when AF_XDP zero-copy support is added. Signed-off-by: Sriram Yagnaraman <sriram.yagnaraman@est.tech> --- drivers/net/ethernet/intel/igb/igb.h | 5 ++- drivers/net/ethernet/intel/igb/igb_main.c | 41 +++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-)