return p->bands - 1 - band;
 }
 
+/**
+ * ksz88x3_tc_ets_add - Configure ETS (Enhanced Transmission Selection)
+ *                      for a port on KSZ88x3 switch
+ * @dev: Pointer to the KSZ switch device structure
+ * @port: Port number to configure
+ * @p: Pointer to offload replace parameters describing ETS bands and mapping
+ *
+ * The KSZ88x3 supports two scheduling modes: Strict Priority and
+ * Weighted Fair Queuing (WFQ). Both modes have fixed behavior:
+ *   - No configurable queue-to-priority mapping
+ *   - No weight adjustment in WFQ mode
+ *
+ * This function configures the switch to use strict priority mode by
+ * clearing the WFQ enable bit for all queues associated with ETS bands.
+ * If strict priority is not explicitly requested, the switch will default
+ * to WFQ mode.
+ *
+ * Return: 0 on success, or a negative error code on failure
+ */
+static int ksz88x3_tc_ets_add(struct ksz_device *dev, int port,
+                             struct tc_ets_qopt_offload_replace_params *p)
+{
+       int ret, band;
+
+       /* Only strict priority mode is supported for now.
+        * WFQ is implicitly enabled when strict mode is disabled.
+        */
+       for (band = 0; band < p->bands; band++) {
+               int queue = ksz_ets_band_to_queue(p, band);
+               u8 reg;
+
+               /* Calculate TXQ Split Control register address for this
+                * port/queue
+                */
+               reg = KSZ8873_TXQ_SPLIT_CTRL_REG(port, queue);
+
+               /* Clear WFQ enable bit to select strict priority scheduling */
+               ret = ksz_rmw8(dev, reg, KSZ8873_TXQ_WFQ_ENABLE, 0);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * ksz88x3_tc_ets_del - Reset ETS (Enhanced Transmission Selection) config
+ *                      for a port on KSZ88x3 switch
+ * @dev: Pointer to the KSZ switch device structure
+ * @port: Port number to reset
+ *
+ * The KSZ88x3 supports only fixed scheduling modes: Strict Priority or
+ * Weighted Fair Queuing (WFQ), with no reconfiguration of weights or
+ * queue mapping. This function resets the port’s scheduling mode to
+ * the default, which is WFQ, by enabling the WFQ bit for all queues.
+ *
+ * Return: 0 on success, or a negative error code on failure
+ */
+static int ksz88x3_tc_ets_del(struct ksz_device *dev, int port)
+{
+       int ret, queue;
+
+       /* Iterate over all transmit queues for this port */
+       for (queue = 0; queue < dev->info->num_tx_queues; queue++) {
+               u8 reg;
+
+               /* Calculate TXQ Split Control register address for this
+                * port/queue
+                */
+               reg = KSZ8873_TXQ_SPLIT_CTRL_REG(port, queue);
+
+               /* Set WFQ enable bit to revert back to default scheduling
+                * mode
+                */
+               ret = ksz_rmw8(dev, reg, KSZ8873_TXQ_WFQ_ENABLE,
+                              KSZ8873_TXQ_WFQ_ENABLE);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 static int ksz_queue_set_strict(struct ksz_device *dev, int port, int queue)
 {
        int ret;
        for (queue = 0; queue < dev->info->num_tx_queues; queue++) {
                ret = ksz_queue_set_wrr(dev, port, queue,
                                        KSZ9477_DEFAULT_WRR_WEIGHT);
+
                if (ret)
                        return ret;
        }
        struct ksz_device *dev = ds->priv;
        int ret;
 
-       if (is_ksz8(dev))
+       if (is_ksz8(dev) && !ksz_is_ksz88x3(dev))
                return -EOPNOTSUPP;
 
        if (qopt->parent != TC_H_ROOT) {
                if (ret)
                        return ret;
 
-               return ksz_tc_ets_add(dev, port, &qopt->replace_params);
+               if (ksz_is_ksz88x3(dev))
+                       return ksz88x3_tc_ets_add(dev, port,
+                                                 &qopt->replace_params);
+               else
+                       return ksz_tc_ets_add(dev, port, &qopt->replace_params);
        case TC_ETS_DESTROY:
-               return ksz_tc_ets_del(dev, port);
+               if (ksz_is_ksz88x3(dev))
+                       return ksz88x3_tc_ets_del(dev, port);
+               else
+                       return ksz_tc_ets_del(dev, port);
        case TC_ETS_STATS:
        case TC_ETS_GRAFT:
                return -EOPNOTSUPP;
 
 #define SW_HI_SPEED_DRIVE_STRENGTH_S   4
 #define SW_LO_SPEED_DRIVE_STRENGTH_S   0
 
+/* TXQ Split Control Register for per-port, per-queue configuration.
+ * Register 0xAF is TXQ Split for Q3 on Port 1.
+ * Register offset formula: 0xAF + (port * 4) + (3 - queue)
+ *   where: port = 0..2, queue = 0..3
+ */
+#define KSZ8873_TXQ_SPLIT_CTRL_REG(port, queue) \
+       (0xAF + ((port) * 4) + (3 - (queue)))
+
+/* Bit 7 selects between:
+ *   0 = Strict priority mode (highest-priority queue first)
+ *   1 = Weighted Fair Queuing (WFQ) mode:
+ *       Queue weights: Q3:Q2:Q1:Q0 = 8:4:2:1
+ *       If any queues are empty, weight is redistributed.
+ *
+ * Note: This is referred to as "Weighted Fair Queuing" (WFQ) in KSZ8863/8873
+ * documentation, and as "Weighted Round Robin" (WRR) in KSZ9477 family docs.
+ */
+#define KSZ8873_TXQ_WFQ_ENABLE         BIT(7)
+
 #define KSZ9477_REG_PORT_OUT_RATE_0    0x0420
 #define KSZ9477_OUT_RATE_NO_LIMIT      0