Message ID | 20250321-igc_mqprio_tx_mode-v4-2-4571abb6714e@linutronix.de |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | igc: Change Tx mode for MQPRIO offloading | expand |
On Fri, Mar 21, 2025 at 02:52:39PM +0100, Kurt Kanzenbach wrote: > The current MQPRIO offload implementation uses the legacy TSN Tx mode. In > this mode the hardware uses four packet buffers and considers queue > priorities. > > In order to harmonize the TAPRIO implementation with MQPRIO, switch to the > regular TSN Tx mode. This mode also uses four packet buffers and considers > queue priorities. In addition to the legacy mode, transmission is always > coupled to Qbv. The driver already has mechanisms to use a dummy schedule > of 1 second with all gates open for ETF. Simply use this for MQPRIO too. > > This reduces code and makes it easier to add support for frame preemption > later. > > Tested on i225 with real time application using high priority queue, iperf3 > using low priority queue and network TAP device. > > Acked-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com> > Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> Reviewed-by: Simon Horman <horms@kernel.org>
On 21/03/2025 15:52, Kurt Kanzenbach wrote: > The current MQPRIO offload implementation uses the legacy TSN Tx mode. In > this mode the hardware uses four packet buffers and considers queue > priorities. > > In order to harmonize the TAPRIO implementation with MQPRIO, switch to the > regular TSN Tx mode. This mode also uses four packet buffers and considers > queue priorities. In addition to the legacy mode, transmission is always > coupled to Qbv. The driver already has mechanisms to use a dummy schedule > of 1 second with all gates open for ETF. Simply use this for MQPRIO too. > > This reduces code and makes it easier to add support for frame preemption > later. > > Tested on i225 with real time application using high priority queue, iperf3 > using low priority queue and network TAP device. > > Acked-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com> > Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> > Reviewed-by: Simon Horman <horms@kernel.org> > --- > drivers/net/ethernet/intel/igc/igc.h | 4 +--- > drivers/net/ethernet/intel/igc/igc_tsn.c | 20 ++------------------ > 2 files changed, 3 insertions(+), 21 deletions(-) > Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index cd1d7b6c1782352094f6867a31b6958c929bbbf4..16d85bdf55a7e9c412c47acf727bca6bc7154c61 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -388,11 +388,9 @@ extern char igc_driver_name[]; #define IGC_FLAG_RX_LEGACY BIT(16) #define IGC_FLAG_TSN_QBV_ENABLED BIT(17) #define IGC_FLAG_TSN_QAV_ENABLED BIT(18) -#define IGC_FLAG_TSN_LEGACY_ENABLED BIT(19) #define IGC_FLAG_TSN_ANY_ENABLED \ - (IGC_FLAG_TSN_QBV_ENABLED | IGC_FLAG_TSN_QAV_ENABLED | \ - IGC_FLAG_TSN_LEGACY_ENABLED) + (IGC_FLAG_TSN_QBV_ENABLED | IGC_FLAG_TSN_QAV_ENABLED) #define IGC_FLAG_RSS_FIELD_IPV4_UDP BIT(6) #define IGC_FLAG_RSS_FIELD_IPV6_UDP BIT(7) diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index 67632356083708f82a099141a4b68ba10e06f952..7c28f3e7bb576f0e6a21c883e934ede4d53096f4 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -37,18 +37,13 @@ static unsigned int igc_tsn_new_flags(struct igc_adapter *adapter) { unsigned int new_flags = adapter->flags & ~IGC_FLAG_TSN_ANY_ENABLED; - if (adapter->taprio_offload_enable) - new_flags |= IGC_FLAG_TSN_QBV_ENABLED; - - if (is_any_launchtime(adapter)) + if (adapter->taprio_offload_enable || is_any_launchtime(adapter) || + adapter->strict_priority_enable) new_flags |= IGC_FLAG_TSN_QBV_ENABLED; if (is_cbs_enabled(adapter)) new_flags |= IGC_FLAG_TSN_QAV_ENABLED; - if (adapter->strict_priority_enable) - new_flags |= IGC_FLAG_TSN_LEGACY_ENABLED; - return new_flags; } @@ -163,7 +158,6 @@ static int igc_tsn_disable_offload(struct igc_adapter *adapter) igc_tsn_tx_arb(adapter, queue_per_tc); adapter->flags &= ~IGC_FLAG_TSN_QBV_ENABLED; - adapter->flags &= ~IGC_FLAG_TSN_LEGACY_ENABLED; return 0; } @@ -207,16 +201,6 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) * mapping. */ igc_tsn_tx_arb(adapter, adapter->queue_per_tc); - - /* Enable legacy TSN mode which will do strict priority without - * any other TSN features. - */ - tqavctrl = rd32(IGC_TQAVCTRL); - tqavctrl |= IGC_TQAVCTRL_TRANSMIT_MODE_TSN; - tqavctrl &= ~IGC_TQAVCTRL_ENHANCED_QAV; - wr32(IGC_TQAVCTRL, tqavctrl); - - return 0; } for (i = 0; i < adapter->num_tx_queues; i++) {