int rate, signal;
        u32 flags;
        u32 quality;
+       unsigned long f;
 
-       spin_lock(&priv->rx_queue.lock);
+       spin_lock_irqsave(&priv->rx_queue.lock, f);
        if (skb->next)
                __skb_unlink(skb, &priv->rx_queue);
        else {
-               spin_unlock(&priv->rx_queue.lock);
+               spin_unlock_irqrestore(&priv->rx_queue.lock, f);
                return;
        }
-       spin_unlock(&priv->rx_queue.lock);
+       spin_unlock_irqrestore(&priv->rx_queue.lock, f);
        skb_put(skb, urb->actual_length);
 
        if (unlikely(urb->status)) {
 static void rtl8187_stop(struct ieee80211_hw *dev)
 {
        struct rtl8187_priv *priv = dev->priv;
-       struct rtl8187_rx_info *info;
        struct sk_buff *skb;
        u32 reg;
 
        rtl818x_iowrite8(priv, &priv->map->CONFIG4, reg | RTL818X_CONFIG4_VCOOFF);
        rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
 
-       while ((skb = skb_dequeue(&priv->rx_queue))) {
-               info = (struct rtl8187_rx_info *)skb->cb;
-               kfree_skb(skb);
-       }
        while ((skb = skb_dequeue(&priv->b_tx_status.queue)))
                dev_kfree_skb_any(skb);