int status = urb->status;
        struct rx_agg *agg;
        struct r8152 *tp;
+       unsigned long flags;
 
        agg = urb->context;
        if (!agg)
                if (urb->actual_length < ETH_ZLEN)
                        break;
 
-               spin_lock(&tp->rx_lock);
+               spin_lock_irqsave(&tp->rx_lock, flags);
                list_add_tail(&agg->list, &tp->rx_done);
-               spin_unlock(&tp->rx_lock);
+               spin_unlock_irqrestore(&tp->rx_lock, flags);
                napi_schedule(&tp->napi);
                return;
        case -ESHUTDOWN:
        struct net_device *netdev;
        struct tx_agg *agg;
        struct r8152 *tp;
+       unsigned long flags;
        int status = urb->status;
 
        agg = urb->context;
                stats->tx_bytes += agg->skb_len;
        }
 
-       spin_lock(&tp->tx_lock);
+       spin_lock_irqsave(&tp->tx_lock, flags);
        list_add_tail(&agg->list, &tp->tx_free);
-       spin_unlock(&tp->tx_lock);
+       spin_unlock_irqrestore(&tp->tx_lock, flags);
 
        usb_autopm_put_interface_async(tp->intf);