diff -up wpa_supplicant-0.7.3/src/rsn_supp/pmksa_cache.c.foo wpa_supplicant-0.7.3/src/rsn_supp/pmksa_cache.c
--- wpa_supplicant-0.7.3/src/rsn_supp/pmksa_cache.c.foo	2012-08-05 23:34:38.230809262 -0500
+++ wpa_supplicant-0.7.3/src/rsn_supp/pmksa_cache.c	2012-08-05 23:41:10.862900686 -0500
@@ -203,11 +203,23 @@ pmksa_cache_add(struct rsn_pmksa_cache *
 	if (pmksa->pmksa_count >= pmksa_cache_max_entries && pmksa->pmksa) {
 		/* Remove the oldest entry to make room for the new entry */
 		pos = pmksa->pmksa;
-		pmksa->pmksa = pos->next;
-		wpa_printf(MSG_DEBUG, "RSN: removed the oldest PMKSA cache "
-			   "entry (for " MACSTR ") to make room for new one",
-			   MAC2STR(pos->aa));
-		pmksa_cache_free_entry(pmksa, pos, 0);
+
+		/* Never remove the current PMKSA cache entry, since it's
+		 * in use, and removing it triggers a needless deauthentication.
+		 */
+		if (pos == pmksa->sm->cur_pmksa) {
+			pos = pos->next;
+			pmksa->pmksa->next = pos ? pos->next : NULL;
+		} else
+			pmksa->pmksa = pos->next;
+
+		if (pos) {
+			wpa_printf(MSG_DEBUG, "RSN: removed the oldest idle "
+				   "PMKSA cache entry (for " MACSTR ") to make "
+				   "room for new one",
+				   MAC2STR(pos->aa));
+			pmksa_cache_free_entry(pmksa, pos, 0);
+		}
 	}
 
 	/* Add the new entry; order by expiration time */
