* @mgd_complete_tx: Notify the driver that the response frame for a previously
  *     transmitted frame announced with @mgd_prepare_tx was received, the data
  *     is filled similarly to @mgd_prepare_tx though the duration is not used.
+ *     Note that this isn't always called for each mgd_prepare_tx() call, for
+ *     example for SAE the 'confirm' messages can be on the air in any order.
  *
  * @mgd_protect_tdls_discover: Protect a TDLS discovery session. After sending
  *     a TDLS discovery-request, we expect a reply to arrive on the AP's
 
        struct ieee80211_prep_tx_info info = {
                .subtype = IEEE80211_STYPE_AUTH,
        };
+       bool sae_need_confirm = false;
 
        lockdep_assert_wiphy(sdata->local->hw.wiphy);
 
                                jiffies + IEEE80211_AUTH_WAIT_SAE_RETRY;
                        ifmgd->auth_data->timeout_started = true;
                        run_again(sdata, ifmgd->auth_data->timeout);
+                       if (auth_transaction == 1)
+                               sae_need_confirm = true;
                        goto notify_driver;
                }
 
             ifmgd->auth_data->expected_transaction == 2)) {
                if (!ieee80211_mark_sta_auth(sdata))
                        return; /* ignore frame -- wait for timeout */
+       } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE &&
+                  auth_transaction == 1) {
+               sae_need_confirm = true;
        } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE &&
                   auth_transaction == 2) {
                sdata_info(sdata, "SAE peer confirmed\n");
 
        cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
 notify_driver:
-       drv_mgd_complete_tx(sdata->local, sdata, &info);
+       if (!sae_need_confirm)
+               drv_mgd_complete_tx(sdata->local, sdata, &info);
 }
 
 #define case_WLAN(type) \