iwlcore_low_level_notify(priv, IWLCORE_START_EVT);
        ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+
+       if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status))
+               iwl4965_set_mode(priv, priv->iw_mode);
+
        return;
 
  restart:
 {
        struct iwl_priv *priv = container_of(work,
                                struct iwl_priv, set_monitor);
+       int ret;
 
        IWL_DEBUG(IWL_DL_STATE, "setting monitor mode\n");
 
        mutex_lock(&priv->mutex);
 
-       if (!iwl_is_ready(priv))
-               IWL_DEBUG(IWL_DL_STATE, "leave - not ready\n");
-       else
-               if (iwl4965_set_mode(priv, IEEE80211_IF_TYPE_MNTR) != 0)
-                       IWL_ERROR("iwl4965_set_mode() failed\n");
+       ret = iwl4965_set_mode(priv, IEEE80211_IF_TYPE_MNTR);
+
+       if (ret) {
+               if (ret == -EAGAIN)
+                       IWL_DEBUG(IWL_DL_STATE, "leave - not ready\n");
+               else
+                       IWL_ERROR("iwl4965_set_mode() failed ret = %d\n", ret);
+       }
 
        mutex_unlock(&priv->mutex);
 }
 
        case IEEE80211_IF_TYPE_IBSS:
 
-               /* clear out the station table */
-               iwlcore_clear_stations_table(priv);
+               /* assume default assoc id */
+               priv->assoc_id = 1;
 
-               iwl_rxon_add_station(priv, iwl_bcast_addr, 0);
                iwl_rxon_add_station(priv, priv->bssid, 0);
                iwl4965_rate_scale_init(priv->hw, IWL_STA_ID);
                iwl4965_send_beacon_cmd(priv);
                memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN);
        }
 
-       if (iwl_is_ready(priv))
-               iwl4965_set_mode(priv, conf->type);
+       if (iwl4965_set_mode(priv, conf->type) == -EAGAIN)
+               /* we are not ready, will run again when ready */
+               set_bit(STATUS_MODE_PENDING, &priv->status);
 
        mutex_unlock(&priv->mutex);
 
 
        iwl_reset_qos(priv);
 
-       queue_work(priv->workqueue, &priv->post_associate.work);
+       iwl4965_post_associate(priv);
 
        mutex_unlock(&priv->mutex);