zd1211rw: add locking for mac->process_intr
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>
Mon, 31 Jan 2011 18:47:27 +0000 (20:47 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 4 Feb 2011 21:29:48 +0000 (16:29 -0500)
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_usb.c

index 6107304cb94c5e7050cda334d6eaa142218159d3..8b3d779d80dcb6b3dd038a5a5a0b3974e4deccec 100644 (file)
@@ -911,9 +911,13 @@ static int zd_op_config(struct ieee80211_hw *hw, u32 changed)
 static void zd_process_intr(struct work_struct *work)
 {
        u16 int_status;
+       unsigned long flags;
        struct zd_mac *mac = container_of(work, struct zd_mac, process_intr);
 
-       int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer+4));
+       spin_lock_irqsave(&mac->lock, flags);
+       int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer + 4));
+       spin_unlock_irqrestore(&mac->lock, flags);
+
        if (int_status & INT_CFG_NEXT_BCN)
                dev_dbg_f_limit(zd_mac_dev(mac), "INT_CFG_NEXT_BCN\n");
        else
index c32a2472eb447e482c80cc0a121d6aa4147b45a9..9493ab86a41e3e74ce5b14e0f14181719dfbf849 100644 (file)
@@ -377,8 +377,10 @@ static inline void handle_regs_int(struct urb *urb)
        int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2));
        if (int_num == CR_INTERRUPT) {
                struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context));
+               spin_lock(&mac->lock);
                memcpy(&mac->intr_buffer, urb->transfer_buffer,
                                USB_MAX_EP_INT_BUFFER);
+               spin_unlock(&mac->lock);
                schedule_work(&mac->process_intr);
        } else if (intr->read_regs_enabled) {
                intr->read_regs.length = len = urb->actual_length;