Message ID | 20230619100858.116286-3-florian.kauer@linutronix.de (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | igc: Fix corner cases for TSN offload | expand |
Context | Check | Description |
---|---|---|
netdev/series_format | success | Posting correctly formatted |
netdev/tree_selection | success | Clearly marked for net |
netdev/fixes_present | success | Fixes tag present in non-next series |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 8 this patch: 8 |
netdev/cc_maintainers | success | CCed 10 of 10 maintainers |
netdev/build_clang | success | Errors and warnings before: 8 this patch: 8 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/deprecated_api | success | None detected |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | Fixes tag looks correct |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 8 this patch: 8 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 22 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On 6/19/2023 13:08, Florian Kauer wrote: > Only set adapter->taprio_offload_enable after validating the arguments. > Otherwise, it stays set even if the offload was not enabled. > Since the subsequent code does not get executed in case of invalid > arguments, it will not be read at first. > However, by activating and then deactivating another offload > (e.g. ETF/TX launchtime offload), taprio_offload_enable is read > and erroneously keeps the offload feature of the NIC enabled. > > This can be reproduced as follows: > > # TAPRIO offload (flags == 0x2) and negative base-time leading to expected -ERANGE > sudo tc qdisc replace dev enp1s0 parent root handle 100 stab overhead 24 taprio \ > num_tc 1 \ > map 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ > queues 1@0 \ > base-time -1000 \ > sched-entry S 01 300000 \ > flags 0x2 > > # IGC_TQAVCTRL is 0x0 as expected (iomem=relaxed for reading register) > sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1 > > # Activate ETF offload > sudo tc qdisc replace dev enp1s0 parent root handle 6666 mqprio \ > num_tc 3 \ > map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \ > queues 1@0 1@1 2@2 \ > hw 0 > sudo tc qdisc add dev enp1s0 parent 6666:1 etf \ > clockid CLOCK_TAI \ > delta 500000 \ > offload > > # IGC_TQAVCTRL is 0x9 as expected > sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1 > > # Deactivate ETF offload again > sudo tc qdisc delete dev enp1s0 parent 6666:1 > > # IGC_TQAVCTRL should now be 0x0 again, but is observed as 0x9 > sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1 > > Fixes: e17090eb2494 ("igc: allow BaseTime 0 enrollment for Qbv") > Signed-off-by: Florian Kauer <florian.kauer@linutronix.de> > Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de> > --- > drivers/net/ethernet/intel/igc/igc_main.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Tested-by: Naama Meir <naamax.meir@linux.intel.com>
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index dda057a3b5e3..290daa5827f0 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -6053,6 +6053,7 @@ static int igc_tsn_clear_schedule(struct igc_adapter *adapter) adapter->base_time = 0; adapter->cycle_time = NSEC_PER_SEC; + adapter->taprio_offload_enable = false; adapter->qbv_config_change_errors = 0; for (i = 0; i < adapter->num_tx_queues; i++) { @@ -6075,8 +6076,6 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, size_t n; int i; - adapter->taprio_offload_enable = qopt->enable; - if (!qopt->enable) return igc_tsn_clear_schedule(adapter); @@ -6091,6 +6090,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, adapter->cycle_time = qopt->cycle_time; adapter->base_time = qopt->base_time; + adapter->taprio_offload_enable = true; for (n = 0; n < qopt->num_entries; n++) { struct tc_taprio_sched_entry *e = &qopt->entries[n];