struct net_device *ndev = vif_to_ndev(vif);
        struct wireless_dev *wdev = vif_to_wdev(vif);
        struct wil_sta_info *sta = &wil->sta[cid];
+       int min_ring_id = wil_get_min_tx_ring_id(wil);
 
        might_sleep();
        wil_dbg_misc(wil, "disconnect_cid: CID %d, MID %d, status %d\n",
        memset(sta->tid_crypto_rx, 0, sizeof(sta->tid_crypto_rx));
        memset(&sta->group_crypto_rx, 0, sizeof(sta->group_crypto_rx));
        /* release vrings */
-       for (i = 0; i < ARRAY_SIZE(wil->ring_tx); i++) {
+       for (i = min_ring_id; i < ARRAY_SIZE(wil->ring_tx); i++) {
                if (wil->ring2cid_tid[i][0] == cid)
                        wil_ring_fini_tx(wil, i);
        }
                wil->sta[i].mid = U8_MAX;
        }
 
-       for (i = 0; i < WIL6210_MAX_TX_RINGS; i++)
+       for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
                spin_lock_init(&wil->ring_tx_data[i].lock);
+               wil->ring2cid_tid[i][0] = WIL6210_MAX_CID;
+       }
 
        mutex_init(&wil->mutex);
        mutex_init(&wil->vif_mutex);
 
 {
        int i;
        unsigned long data_comp_to;
+       int min_ring_id = wil_get_min_tx_ring_id(wil);
 
-       for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
+       for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) {
                struct wil_ring *vring = &wil->ring_tx[i];
                int vring_index = vring - wil->ring_tx;
                struct wil_ring_tx_data *txdata =
                                           bool check_stop)
 {
        int i;
+       int min_ring_id = wil_get_min_tx_ring_id(wil);
 
        if (unlikely(!vif))
                return;
                return;
 
        /* check wake */
-       for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
+       for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) {
                struct wil_ring *cur_ring = &wil->ring_tx[i];
                struct wil_ring_tx_data  *txdata = &wil->ring_tx_data[i];