Patch "igc: Fix qbv_config_change_errors logics" has been added to the 6.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    igc: Fix qbv_config_change_errors logics

to the 6.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     igc-fix-qbv_config_change_errors-logics.patch
and it can be found in the queue-6.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 864befb514567764e30a68754bc9df8f3bd7b969
Author: Faizal Rahim <faizal.abdul.rahim@xxxxxxxxxxxxxxx>
Date:   Sun Jul 7 08:53:16 2024 -0400

    igc: Fix qbv_config_change_errors logics
    
    [ Upstream commit f8d6acaee9d35cbff3c3cfad94641666c596f8da ]
    
    When user issues these cmds:
    1. Either a) or b)
       a) mqprio with hardware offload disabled
       b) taprio with txtime-assist feature enabled
    2. etf
    3. tc qdisc delete
    4. taprio with base time in the past
    
    At step 4, qbv_config_change_errors wrongly increased by 1.
    
    Excerpt from IEEE 802.1Q-2018 8.6.9.3.1:
    "If AdminBaseTime specifies a time in the past, and the current schedule
    is running, then: Increment ConfigChangeError counter"
    
    qbv_config_change_errors should only increase if base time is in the past
    and no taprio is active. In user perspective, taprio was not active when
    first triggered at step 4. However, i225/6 reuses qbv for etf, so qbv is
    enabled with a dummy schedule at step 2 where it enters
    igc_tsn_enable_offload() and qbv_count got incremented to 1. At step 4, it
    enters igc_tsn_enable_offload() again, qbv_count is incremented to 2.
    Because taprio is running, tc_setup_type is TC_SETUP_QDISC_ETF and
    qbv_count > 1, qbv_config_change_errors value got incremented.
    
    This issue happens due to reliance on qbv_count field where a non-zero
    value indicates that taprio is running. But qbv_count increases
    regardless if taprio is triggered by user or by other tsn feature. It does
    not align with qbv_config_change_errors expectation where it is only
    concerned with taprio triggered by user.
    
    Fixing this by relocating the qbv_config_change_errors logic to
    igc_save_qbv_schedule(), eliminating reliance on qbv_count and its
    inaccuracies from i225/6's multiple uses of qbv feature for other TSN
    features.
    
    The new function created: igc_tsn_is_taprio_activated_by_user() uses
    taprio_offload_enable field to indicate that the current running taprio
    was triggered by user, instead of triggered by non-qbv feature like etf.
    
    Fixes: ae4fe4698300 ("igc: Add qbv_config_change_errors counter")
    Signed-off-by: Faizal Rahim <faizal.abdul.rahim@xxxxxxxxxxxxxxx>
    Reviewed-by: Simon Horman <horms@xxxxxxxxxx>
    Acked-by: Vinicius Costa Gomes <vinicius.gomes@xxxxxxxxx>
    Tested-by: Mor Bar-Gabay <morx.bar.gabay@xxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 33069880c86c0..3041f8142324f 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -6319,12 +6319,16 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
 	if (!validate_schedule(adapter, qopt))
 		return -EINVAL;
 
+	igc_ptp_read(adapter, &now);
+
+	if (igc_tsn_is_taprio_activated_by_user(adapter) &&
+	    is_base_time_past(qopt->base_time, &now))
+		adapter->qbv_config_change_errors++;
+
 	adapter->cycle_time = qopt->cycle_time;
 	adapter->base_time = qopt->base_time;
 	adapter->taprio_offload_enable = true;
 
-	igc_ptp_read(adapter, &now);
-
 	for (n = 0; n < qopt->num_entries; n++) {
 		struct tc_taprio_sched_entry *e = &qopt->entries[n];
 
diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c
index 46d4c3275bbb5..8ed7b965484da 100644
--- a/drivers/net/ethernet/intel/igc/igc_tsn.c
+++ b/drivers/net/ethernet/intel/igc/igc_tsn.c
@@ -87,6 +87,14 @@ static void igc_tsn_restore_retx_default(struct igc_adapter *adapter)
 	wr32(IGC_RETX_CTL, retxctl);
 }
 
+bool igc_tsn_is_taprio_activated_by_user(struct igc_adapter *adapter)
+{
+	struct igc_hw *hw = &adapter->hw;
+
+	return (rd32(IGC_BASET_H) || rd32(IGC_BASET_L)) &&
+		adapter->taprio_offload_enable;
+}
+
 /* Returns the TSN specific registers to their default values after
  * the adapter is reset.
  */
@@ -296,14 +304,6 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter)
 		s64 n = div64_s64(ktime_sub_ns(systim, base_time), cycle);
 
 		base_time = ktime_add_ns(base_time, (n + 1) * cycle);
-
-		/* Increase the counter if scheduling into the past while
-		 * Gate Control List (GCL) is running.
-		 */
-		if ((rd32(IGC_BASET_H) || rd32(IGC_BASET_L)) &&
-		    (adapter->tc_setup_type == TC_SETUP_QDISC_TAPRIO) &&
-		    (adapter->qbv_count > 1))
-			adapter->qbv_config_change_errors++;
 	} else {
 		if (igc_is_device_id_i226(hw)) {
 			ktime_t adjust_time, expires_time;
diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.h b/drivers/net/ethernet/intel/igc/igc_tsn.h
index b53e6af560b73..98ec845a86bf0 100644
--- a/drivers/net/ethernet/intel/igc/igc_tsn.h
+++ b/drivers/net/ethernet/intel/igc/igc_tsn.h
@@ -7,5 +7,6 @@
 int igc_tsn_offload_apply(struct igc_adapter *adapter);
 int igc_tsn_reset(struct igc_adapter *adapter);
 void igc_tsn_adjust_txtime_offset(struct igc_adapter *adapter);
+bool igc_tsn_is_taprio_activated_by_user(struct igc_adapter *adapter);
 
 #endif /* _IGC_BASE_H */




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux