mac80211: add unified BSS configuration
[safe/jmp/linux-2.6] / drivers / net / wireless / rt2x00 / rt2500usb.c
index 2a38388..1933113 100644 (file)
@@ -327,7 +327,8 @@ static void rt2500usb_config_type(struct rt2x00_dev *rt2x00dev, const int type,
 
        rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
        rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
-       rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
+       rt2x00_set_field16(&reg, TXRX_CSR19_TBCN,
+                          (tsf_sync == TSF_SYNC_BEACON));
        rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
        rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, tsf_sync);
        rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
@@ -919,8 +920,6 @@ static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev)
                return -EIO;
        }
 
-       rt2x00usb_enable_radio(rt2x00dev);
-
        /*
         * Enable LED
         */
@@ -1023,12 +1022,12 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev,
  * TX descriptor initialization
  */
 static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
-                                   __le32 *txd,
+                                   struct sk_buff *skb,
                                    struct txdata_entry_desc *desc,
-                                   struct ieee80211_hdr *ieee80211hdr,
-                                   unsigned int length,
                                    struct ieee80211_tx_control *control)
 {
+       struct skb_desc *skbdesc = get_skb_desc(skb);
+       __le32 *txd = skbdesc->desc;
        u32 word;
 
        /*
@@ -1061,7 +1060,7 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W0_NEW_SEQ,
                           !!(control->flags & IEEE80211_TXCTL_FIRST_FRAGMENT));
        rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
-       rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
+       rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, skbdesc->data_len);
        rt2x00_set_field32(&word, TXD_W0_CIPHER, CIPHER_NONE);
        rt2x00_desc_write(txd, 0, word);
 }
@@ -1114,6 +1113,7 @@ static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
 static void rt2500usb_fill_rxdone(struct data_entry *entry,
                                  struct rxdata_entry_desc *desc)
 {
+       struct skb_desc *skbdesc = get_skb_desc(entry->skb);
        struct urb *urb = entry->priv;
        __le32 *rxd = (__le32 *)(entry->skb->data +
                                 (urb->actual_length - entry->ring->desc_size));
@@ -1137,8 +1137,18 @@ static void rt2500usb_fill_rxdone(struct data_entry *entry,
            entry->ring->rt2x00dev->rssi_offset;
        desc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
        desc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+       desc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS);
 
-       return;
+       /*
+        * Trim the skb to clear the descriptor area.
+        */
+       skb_pull(entry->skb, entry->ring->desc_size);
+
+       /*
+        * Set descriptor and data pointer.
+        */
+       skbdesc->desc = entry->skb->data + skbdesc->data_len;
+       skbdesc->data = entry->skb->data;
 }
 
 /*
@@ -1610,7 +1620,6 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
                                       struct dev_addr_list *mc_list)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
-       struct interface *intf = &rt2x00dev->interface;
        u16 reg;
 
        /*
@@ -1629,22 +1638,19 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
         * Apply some rules to the filters:
         * - Some filters imply different filters to be set.
         * - Some things we can't filter out at all.
-        * - Some filters are set based on interface type.
         */
        if (mc_count)
                *total_flags |= FIF_ALLMULTI;
        if (*total_flags & FIF_OTHER_BSS ||
            *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
-       if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
-               *total_flags |= FIF_PROMISC_IN_BSS;
 
        /*
         * Check if there is any work left for us.
         */
-       if (intf->filter == *total_flags)
+       if (rt2x00dev->packet_filter == *total_flags)
                return;
-       intf->filter = *total_flags;
+       rt2x00dev->packet_filter = *total_flags;
 
        /*
         * When in atomic context, reschedule and let rt2x00lib
@@ -1770,7 +1776,7 @@ static const struct ieee80211_ops rt2500usb_mac80211_ops = {
        .config_interface       = rt2x00mac_config_interface,
        .configure_filter       = rt2500usb_configure_filter,
        .get_stats              = rt2x00mac_get_stats,
-       .erp_ie_changed         = rt2x00mac_erp_ie_changed,
+       .bss_info_changed       = rt2x00mac_bss_info_changed,
        .conf_tx                = rt2x00mac_conf_tx,
        .get_tx_stats           = rt2x00mac_get_tx_stats,
        .beacon_update          = rt2500usb_beacon_update,
@@ -1780,6 +1786,8 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
        .probe_hw               = rt2500usb_probe_hw,
        .initialize             = rt2x00usb_initialize,
        .uninitialize           = rt2x00usb_uninitialize,
+       .init_rxentry           = rt2x00usb_init_rxentry,
+       .init_txentry           = rt2x00usb_init_txentry,
        .set_device_state       = rt2500usb_set_device_state,
        .link_stats             = rt2500usb_link_stats,
        .reset_tuner            = rt2500usb_reset_tuner,