Skip to content

Commit 82ff5f2

Browse files
koaloanguy11
authored andcommitted
igc: Do not enable taprio offload for invalid arguments
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: e17090e ("igc: allow BaseTime 0 enrollment for Qbv") Signed-off-by: Florian Kauer <[email protected]> Reviewed-by: Kurt Kanzenbach <[email protected]> Tested-by: Naama Meir <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent 8046063 commit 82ff5f2

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6097,6 +6097,7 @@ static int igc_tsn_clear_schedule(struct igc_adapter *adapter)
60976097

60986098
adapter->base_time = 0;
60996099
adapter->cycle_time = NSEC_PER_SEC;
6100+
adapter->taprio_offload_enable = false;
61006101
adapter->qbv_config_change_errors = 0;
61016102
adapter->qbv_transition = false;
61026103
adapter->qbv_count = 0;
@@ -6124,20 +6125,12 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
61246125
size_t n;
61256126
int i;
61266127

6127-
switch (qopt->cmd) {
6128-
case TAPRIO_CMD_REPLACE:
6129-
adapter->taprio_offload_enable = true;
6130-
break;
6131-
case TAPRIO_CMD_DESTROY:
6132-
adapter->taprio_offload_enable = false;
6133-
break;
6134-
default:
6135-
return -EOPNOTSUPP;
6136-
}
6137-
6138-
if (!adapter->taprio_offload_enable)
6128+
if (qopt->cmd == TAPRIO_CMD_DESTROY)
61396129
return igc_tsn_clear_schedule(adapter);
61406130

6131+
if (qopt->cmd != TAPRIO_CMD_REPLACE)
6132+
return -EOPNOTSUPP;
6133+
61416134
if (qopt->base_time < 0)
61426135
return -ERANGE;
61436136

@@ -6149,6 +6142,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
61496142

61506143
adapter->cycle_time = qopt->cycle_time;
61516144
adapter->base_time = qopt->base_time;
6145+
adapter->taprio_offload_enable = true;
61526146

61536147
igc_ptp_read(adapter, &now);
61546148

0 commit comments

Comments
 (0)