wait_entry->fn_data = fn_data;
        wait_entry->cmd = cmd;
        wait_entry->triggered = false;
+       wait_entry->aborted = false;
 
        spin_lock_bh(&priv->_agn.notif_wait_lock);
        list_add(&wait_entry->list, &priv->_agn.notif_waits);
        int ret;
 
        ret = wait_event_timeout(priv->_agn.notif_waitq,
-                                wait_entry->triggered,
+                                wait_entry->triggered || wait_entry->aborted,
                                 timeout);
 
        spin_lock_bh(&priv->_agn.notif_wait_lock);
        list_del(&wait_entry->list);
        spin_unlock_bh(&priv->_agn.notif_wait_lock);
 
+       if (wait_entry->aborted)
+               return -EIO;
+
        /* return value is always >= 0 */
        if (ret <= 0)
                return -ETIMEDOUT;
 
 }
 #endif
 
+static void iwlagn_abort_notification_waits(struct iwl_priv *priv)
+{
+       unsigned long flags;
+       struct iwl_notification_wait *wait_entry;
+
+       spin_lock_irqsave(&priv->_agn.notif_wait_lock, flags);
+       list_for_each_entry(wait_entry, &priv->_agn.notif_waits, list)
+               wait_entry->aborted = true;
+       spin_unlock_irqrestore(&priv->_agn.notif_wait_lock, flags);
+
+       wake_up_all(&priv->_agn.notif_waitq);
+}
+
 void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
 {
        unsigned int reload_msec;
        /* Cancel currently queued command. */
        clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
 
+       iwlagn_abort_notification_waits(priv);
+
        /* Keep the restart process from trying to send host
         * commands by clearing the ready bit */
        clear_bit(STATUS_READY, &priv->status);