u32 reg;
 
        if (flags & CONFIG_UPDATE_TYPE) {
-               rt2x00pci_register_write(rt2x00dev, CSR14, 0);
-
                /*
                 * Enable beacon config
                 */
                 * Enable synchronisation.
                 */
                rt2x00pci_register_read(rt2x00dev, CSR14, ®);
-               rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
-               rt2x00_set_field32(®, CSR14_TBCN,
-                                  (conf->sync == TSF_SYNC_BEACON));
-               rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
                rt2x00_set_field32(®, CSR14_TSF_SYNC, conf->sync);
                rt2x00pci_register_write(rt2x00dev, CSR14, reg);
        }
        if (queue == RT2X00_BCN_QUEUE_BEACON) {
                rt2x00pci_register_read(rt2x00dev, CSR14, ®);
                if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) {
+                       rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
+                       rt2x00_set_field32(®, CSR14_TBCN, 1);
                        rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
                        rt2x00pci_register_write(rt2x00dev, CSR14, reg);
                }
        struct rt2x00_intf *intf = vif_to_intf(control->vif);
        struct queue_entry_priv_pci_tx *priv_tx;
        struct skb_frame_desc *skbdesc;
+       u32 reg;
 
        if (unlikely(!intf->beacon))
                return -ENOBUFS;
-
        priv_tx = intf->beacon->priv_data;
 
        /*
        skbdesc->desc_len = intf->beacon->queue->desc_size;
        skbdesc->entry = intf->beacon;
 
+       /*
+        * Disable beaconing while we are reloading the beacon data,
+        * otherwise we might be sending out invalid data.
+        */
+       rt2x00pci_register_read(rt2x00dev, CSR14, ®);
+       rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
+       rt2x00_set_field32(®, CSR14_TBCN, 0);
+       rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
+       rt2x00pci_register_write(rt2x00dev, CSR14, reg);
+
        /*
         * mac80211 doesn't provide the control->queue variable
         * for beacons. Set our own queue identification so
 
        u32 reg;
 
        if (flags & CONFIG_UPDATE_TYPE) {
-               rt2x00pci_register_write(rt2x00dev, CSR14, 0);
-
                /*
                 * Enable beacon config
                 */
                 * Enable synchronisation.
                 */
                rt2x00pci_register_read(rt2x00dev, CSR14, ®);
-               rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
-               rt2x00_set_field32(®, CSR14_TBCN,
-                                  (conf->sync == TSF_SYNC_BEACON));
-               rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
                rt2x00_set_field32(®, CSR14_TSF_SYNC, conf->sync);
                rt2x00pci_register_write(rt2x00dev, CSR14, reg);
        }
        if (queue == RT2X00_BCN_QUEUE_BEACON) {
                rt2x00pci_register_read(rt2x00dev, CSR14, ®);
                if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) {
+                       rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
+                       rt2x00_set_field32(®, CSR14_TBCN, 1);
                        rt2x00_set_field32(®, CSR14_BEACON_GEN, 1);
                        rt2x00pci_register_write(rt2x00dev, CSR14, reg);
                }
        struct rt2x00_intf *intf = vif_to_intf(control->vif);
        struct queue_entry_priv_pci_tx *priv_tx;
        struct skb_frame_desc *skbdesc;
+       u32 reg;
 
        if (unlikely(!intf->beacon))
                return -ENOBUFS;
        skbdesc->desc_len = intf->beacon->queue->desc_size;
        skbdesc->entry = intf->beacon;
 
+       /*
+        * Disable beaconing while we are reloading the beacon data,
+        * otherwise we might be sending out invalid data.
+        */
+       rt2x00pci_register_read(rt2x00dev, CSR14, ®);
+       rt2x00_set_field32(®, CSR14_TSF_COUNT, 0);
+       rt2x00_set_field32(®, CSR14_TBCN, 0);
+       rt2x00_set_field32(®, CSR14_BEACON_GEN, 0);
+       rt2x00pci_register_write(rt2x00dev, CSR14, reg);
+
        /*
         * mac80211 doesn't provide the control->queue variable
         * for beacons. Set our own queue identification so
 
        u16 reg;
 
        if (flags & CONFIG_UPDATE_TYPE) {
-               rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
-
                /*
                 * Enable beacon config
                 */
                rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
 
                rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®);
-               rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
-               rt2x00_set_field16(®, TXRX_CSR19_TBCN,
-                                  (conf->sync == TSF_SYNC_BEACON));
-               rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0);
                rt2x00_set_field16(®, TXRX_CSR19_TSF_SYNC, conf->sync);
                rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
        }
 
        rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®);
        if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) {
+               rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
+               rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1);
                rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 1);
                /*
                 * Beacon generation will fail initially.
        struct skb_frame_desc *skbdesc;
        int pipe = usb_sndbulkpipe(usb_dev, 1);
        int length;
+       u16 reg;
 
        if (unlikely(!intf->beacon))
                return -ENOBUFS;
        skbdesc->desc_len = intf->beacon->queue->desc_size;
        skbdesc->entry = intf->beacon;
 
+       /*
+        * Disable beaconing while we are reloading the beacon data,
+        * otherwise we might be sending out invalid data.
+        */
+       rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®);
+       rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 0);
+       rt2x00_set_field16(®, TXRX_CSR19_TBCN, 0);
+       rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0);
+       rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
+
        /*
         * mac80211 doesn't provide the control->queue variable
         * for beacons. Set our own queue identification so
 
                 * bits which (when set to 0) will invalidate the entire beacon.
                 */
                beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
-               rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, 0);
                rt2x00pci_register_write(rt2x00dev, beacon_base, 0);
 
                /*
                 * Enable synchronisation.
                 */
                rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, ®);
-               rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
-               rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE,
-                                 (conf->sync == TSF_SYNC_BEACON));
-               rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0);
                rt2x00_set_field32(®, TXRX_CSR9_TSF_SYNC, conf->sync);
                rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
        }
 
                rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, ®);
                if (!rt2x00_get_field32(reg, TXRX_CSR9_BEACON_GEN)) {
+                       rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
+                       rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1);
                        rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 1);
                        rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
                }
        struct rt2x00_intf *intf = vif_to_intf(control->vif);
        struct skb_frame_desc *skbdesc;
        unsigned int beacon_base;
+       u32 reg;
 
        if (unlikely(!intf->beacon))
                return -ENOBUFS;
        skbdesc->desc_len = intf->beacon->queue->desc_size;
        skbdesc->entry = intf->beacon;
 
+       /*
+        * Disable beaconing while we are reloading the beacon data,
+        * otherwise we might be sending out invalid data.
+        */
+       rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, ®);
+       rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 0);
+       rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 0);
+       rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0);
+       rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
+
        /*
         * mac80211 doesn't provide the control->queue variable
         * for beacons. Set our own queue identification so
 
                 * bits which (when set to 0) will invalidate the entire beacon.
                 */
                beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
-               rt73usb_register_write(rt2x00dev, TXRX_CSR9, 0);
                rt73usb_register_write(rt2x00dev, beacon_base, 0);
 
                /*
                 * Enable synchronisation.
                 */
                rt73usb_register_read(rt2x00dev, TXRX_CSR9, ®);
-               rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
-               rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE,
-                                 (conf->sync == TSF_SYNC_BEACON));
-               rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0);
                rt2x00_set_field32(®, TXRX_CSR9_TSF_SYNC, conf->sync);
                rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg);
        }
 
        rt73usb_register_read(rt2x00dev, TXRX_CSR9, ®);
        if (!rt2x00_get_field32(reg, TXRX_CSR9_BEACON_GEN)) {
+               rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
+               rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1);
                rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 1);
                rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg);
        }
        struct skb_frame_desc *skbdesc;
        unsigned int beacon_base;
        unsigned int timeout;
+       u32 reg;
 
        if (unlikely(!intf->beacon))
                return -ENOBUFS;
        skbdesc->desc_len = intf->beacon->queue->desc_size;
        skbdesc->entry = intf->beacon;
 
+       /*
+        * Disable beaconing while we are reloading the beacon data,
+        * otherwise we might be sending out invalid data.
+        */
+       rt73usb_register_read(rt2x00dev, TXRX_CSR9, ®);
+       rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 0);
+       rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 0);
+       rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0);
+       rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg);
+
        /*
         * mac80211 doesn't provide the control->queue variable
         * for beacons. Set our own queue identification so