return;
        pci_unmap_single(sc->pdev, bf->skbaddr, bf->skb->len,
                        PCI_DMA_TODEVICE);
-       dev_kfree_skb(bf->skb);
+       dev_kfree_skb_any(bf->skb);
        bf->skb = NULL;
 }
 
        mutex_init(&sc->lock);
        spin_lock_init(&sc->rxbuflock);
        spin_lock_init(&sc->txbuflock);
+       spin_lock_init(&sc->block);
 
        /* Set private data */
        pci_set_drvdata(pdev, hw);
 
                sc->imask |= AR5K_INT_SWBA;
 
-               if (ath5k_hw_hasveol(ah))
+               if (ath5k_hw_hasveol(ah)) {
+                       spin_lock(&sc->block);
                        ath5k_beacon_send(sc);
+                       spin_unlock(&sc->block);
+               }
        }
        /* TODO else AP */
 
                                                  TSF_TO_TU(tsf),
                                                  (unsigned long long) tsf);
                                } else {
+                                       spin_lock(&sc->block);
                                        ath5k_beacon_send(sc);
+                                       spin_unlock(&sc->block);
                                }
                        }
                        if (status & AR5K_INT_RXEOL) {
 ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
 {
        struct ath5k_softc *sc = hw->priv;
+       unsigned long flags;
        int ret;
 
        ath5k_debug_dump_skb(sc, skb, "BC  ", 1);
                goto end;
        }
 
+       spin_lock_irqsave(&sc->block, flags);
        ath5k_txbuf_free(sc, sc->bbuf);
        sc->bbuf->skb = skb;
        ret = ath5k_beacon_setup(sc, sc->bbuf);
        if (ret)
                sc->bbuf->skb = NULL;
-       else {
+       spin_unlock_irqrestore(&sc->block, flags);
+       if (!ret) {
                ath5k_beacon_config(sc);
                mmiowb();
        }
 
        struct tasklet_struct   txtq;           /* tx intr tasklet */
        struct ath5k_led        tx_led;         /* tx led */
 
+       spinlock_t              block;          /* protects beacon */
        struct ath5k_buf        *bbuf;          /* beacon buffer */
        unsigned int            bhalq,          /* SW q for outgoing beacons */
                                bmisscount,     /* missed beacon transmits */