wl12xx: change bits in the link_map under spin lock
authorArik Nemtsov <arik@wizery.com>
Mon, 27 Feb 2012 22:41:29 +0000 (00:41 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 28 Feb 2012 11:19:19 +0000 (13:19 +0200)
These bits are used in op_tx to determine if a packet should be dropped.
As such we should use the spin lock to sync the state.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/cmd.c

index b776d9d5efe8d3deafdbb72a5cc8bd432f0629fb..ef994dacf8d23d7739055e4aa4d1390841fdabb2 100644 (file)
@@ -459,23 +459,32 @@ out:
 
 int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
 {
+       unsigned long flags;
        u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
        if (link >= WL12XX_MAX_LINKS)
                return -EBUSY;
 
+       /* these bits are used by op_tx */
+       spin_lock_irqsave(&wl->wl_lock, flags);
        __set_bit(link, wl->links_map);
        __set_bit(link, wlvif->links_map);
+       spin_unlock_irqrestore(&wl->wl_lock, flags);
        *hlid = link;
        return 0;
 }
 
 void wl12xx_free_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
 {
+       unsigned long flags;
+
        if (*hlid == WL12XX_INVALID_LINK_ID)
                return;
 
+       /* these bits are used by op_tx */
+       spin_lock_irqsave(&wl->wl_lock, flags);
        __clear_bit(*hlid, wl->links_map);
        __clear_bit(*hlid, wlvif->links_map);
+       spin_unlock_irqrestore(&wl->wl_lock, flags);
        *hlid = WL12XX_INVALID_LINK_ID;
 }
 
This page took 0.048393 seconds and 5 git commands to generate.