struct kernel_ethtool_ringparam *kernel_ring,
                     struct netlink_ext_ack *extack)
 {
-       const struct net_device_ops *ops = dev->netdev_ops;
        struct qcaspi *qca = netdev_priv(dev);
 
        if ((ring->rx_pending) ||
            (ring->rx_jumbo_pending))
                return -EINVAL;
 
-       if (netif_running(dev))
-               ops->ndo_stop(dev);
+       if (qca->spi_thread)
+               kthread_park(qca->spi_thread);
 
        qca->txr.count = max_t(u32, ring->tx_pending, TX_RING_MIN_LEN);
        qca->txr.count = min_t(u16, qca->txr.count, TX_RING_MAX_LEN);
 
-       if (netif_running(dev))
-               ops->ndo_open(dev);
+       if (qca->spi_thread)
+               kthread_unpark(qca->spi_thread);
 
        return 0;
 }
 
        netdev_info(qca->net_dev, "SPI thread created\n");
        while (!kthread_should_stop()) {
                set_current_state(TASK_INTERRUPTIBLE);
+               if (kthread_should_park()) {
+                       netif_tx_disable(qca->net_dev);
+                       netif_carrier_off(qca->net_dev);
+                       qcaspi_flush_tx_ring(qca);
+                       kthread_parkme();
+                       if (qca->sync == QCASPI_SYNC_READY) {
+                               netif_carrier_on(qca->net_dev);
+                               netif_wake_queue(qca->net_dev);
+                       }
+                       continue;
+               }
+
                if ((qca->intr_req == qca->intr_svc) &&
                    !qca->txr.skb[qca->txr.head])
                        schedule();