Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
authorDavid S. Miller <davem@davemloft.net>
Wed, 15 Oct 2008 06:19:16 +0000 (23:19 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Oct 2008 06:19:16 +0000 (23:19 -0700)
21 files changed:
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/orinoco_cs.c
drivers/net/wireless/p54/p54common.c
drivers/net/wireless/p54/p54usb.c
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rtl8187_dev.c
drivers/net/wireless/spectrum_cs.c
include/net/mac80211.h
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_sta.c
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/scan.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/util.c
net/mac80211/wext.c
net/wireless/core.c

index 74726990d59e0ae1851fe0d587032f355dabecbf..f05f584ab7bc960f9e8ba5ea29207ec63582bd2c 100644 (file)
@@ -1640,6 +1640,11 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
        return ret;
 }
 
+static int ath9k_no_fragmentation(struct ieee80211_hw *hw, u32 value)
+{
+       return -EOPNOTSUPP;
+}
+
 static struct ieee80211_ops ath9k_ops = {
        .tx                 = ath9k_tx,
        .start              = ath9k_start,
@@ -1664,7 +1669,8 @@ static struct ieee80211_ops ath9k_ops = {
        .get_tsf            = ath9k_get_tsf,
        .reset_tsf          = ath9k_reset_tsf,
        .tx_last_beacon     = NULL,
-       .ampdu_action       = ath9k_ampdu_action
+       .ampdu_action       = ath9k_ampdu_action,
+       .set_frag_threshold = ath9k_no_fragmentation,
 };
 
 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
index f6003e7996afcd01aec848c726fa21d2080761c4..5155b8a760a7299cd5b01ae139821ec3c5dd0fe1 100644 (file)
@@ -833,12 +833,12 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
        switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
        case CSR_HW_REV_TYPE_5100:
        case CSR_HW_REV_TYPE_5300:
-               /* 5X00 wants in Celsius */
+       case CSR_HW_REV_TYPE_5350:
+               /* 5X00 and 5350 wants in Celsius */
                priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD;
                break;
        case CSR_HW_REV_TYPE_5150:
-       case CSR_HW_REV_TYPE_5350:
-               /* 5X50 wants in Kelvin */
+               /* 5150 wants in Kelvin */
                priv->hw_params.ct_kill_threshold =
                                CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD);
                break;
index 93944de923cafd0913979e1f45bf8a36023d2285..e2a58e477036e611da5ffc78abeda5748f7392ce 100644 (file)
@@ -2422,7 +2422,7 @@ static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta,
                        void *priv_sta)
 {
        struct iwl_lq_sta *lq_sta = priv_sta;
-       struct iwl_priv *priv = priv_r;
+       struct iwl_priv *priv __maybe_unused = priv_r;
 
        IWL_DEBUG_RATE("enter\n");
        kfree(lq_sta);
index a912fb68c09990fd12bfc18360e3d9c674b79e7f..297696de2da0554543f86cf1a50be458cba82b2b 100644 (file)
@@ -823,7 +823,9 @@ int lbs_update_channel(struct lbs_private *priv)
 int lbs_set_channel(struct lbs_private *priv, u8 channel)
 {
        struct cmd_ds_802_11_rf_channel cmd;
+#ifdef DEBUG
        u8 old_channel = priv->curbssparams.channel;
+#endif
        int ret = 0;
 
        lbs_deb_enter(LBS_DEB_CMD);
index 9eaa252c2430b441bf6671a9a9a354ad9bbe4c0d..65fd054e0172f8ebda281c35d9903665c38c36a9 100644 (file)
@@ -403,6 +403,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link)
        struct orinoco_private *priv = netdev_priv(dev);
        struct orinoco_pccard *card = priv->card;
        int err = 0;
+       unsigned long flags;
 
        if (! test_bit(0, &card->hard_reset_in_progress)) {
                err = orinoco_reinit_firmware(dev);
@@ -412,7 +413,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link)
                        return -EIO;
                }
 
-               spin_lock(&priv->lock);
+               spin_lock_irqsave(&priv->lock, flags);
 
                netif_device_attach(dev);
                priv->hw_unavailable--;
@@ -424,7 +425,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link)
                                       dev->name, err);
                }
 
-               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->lock, flags);
        }
 
        return err;
index 1994aa199d3726375c9b19346cea7e1babaab0d0..117c7d3a52b0ca4beb7e78f41da62d7a08797cae 100644 (file)
@@ -479,7 +479,6 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
        printk(KERN_ERR "p54: eeprom parse failed!\n");
        return err;
 }
-EXPORT_SYMBOL_GPL(p54_parse_eeprom);
 
 static int p54_rssi_to_dbm(struct ieee80211_hw *dev, int rssi)
 {
index 1912f5e9a0a98aff4d67e84180307060356ab349..75d749bccb0d13e17104b67e348c3723bbb1032b 100644 (file)
@@ -39,6 +39,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
        {USB_DEVICE(0x0846, 0x4200)},   /* Netgear WG121 */
        {USB_DEVICE(0x0846, 0x4210)},   /* Netgear WG121 the second ? */
        {USB_DEVICE(0x0846, 0x4220)},   /* Netgear WG111 */
+       {USB_DEVICE(0x09aa, 0x1000)},   /* Spinnaker Proto board */
        {USB_DEVICE(0x0cde, 0x0006)},   /* Medion 40900, Roper Europe */
        {USB_DEVICE(0x124a, 0x4023)},   /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
        {USB_DEVICE(0x1915, 0x2234)},   /* Linksys WUSB54G OEM */
@@ -63,8 +64,8 @@ static struct usb_device_id p54u_table[] __devinitdata = {
        {USB_DEVICE(0x0cde, 0x0006)},   /* Medion MD40900 */
        {USB_DEVICE(0x0cde, 0x0008)},   /* Sagem XG703A */
        {USB_DEVICE(0x0d8e, 0x3762)},   /* DLink DWL-G120 Cohiba */
-       {USB_DEVICE(0x09aa, 0x1000)},   /* Spinnaker Proto board */
        {USB_DEVICE(0x124a, 0x4025)},   /* IOGear GWU513 (GW3887IK chip) */
+       {USB_DEVICE(0x1260, 0xee22)},   /* SMC 2862W-G version 2 */
        {USB_DEVICE(0x13b1, 0x000a)},   /* Linksys WUSB54G ver 2 */
        {USB_DEVICE(0x13B1, 0x000C)},   /* Linksys WUSB54AG */
        {USB_DEVICE(0x1435, 0x0427)},   /* Inventel UR054G */
index 1676ac484790bfcc692b72a06f3e3feb3e0f2669..451d410ecdae4fae126ab835bdadd5647a4f13b8 100644 (file)
@@ -374,7 +374,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
        struct txentry_desc txdesc;
        struct skb_frame_desc *skbdesc;
-       unsigned int iv_len;
+       unsigned int iv_len = 0;
 
        if (unlikely(rt2x00queue_full(queue)))
                return -EINVAL;
@@ -395,6 +395,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        entry->skb = skb;
        rt2x00queue_create_tx_descriptor(entry, &txdesc);
 
+       if (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)
+               iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len;
+
        /*
         * All information is retreived from the skb->cb array,
         * now we should claim ownership of the driver part of that
@@ -410,9 +413,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
         * the frame so we can provide it to the driver seperately.
         */
        if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) &&
-           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags) &&
-               (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)) {
-               iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len;
+           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) {
                rt2x00crypto_tx_remove_iv(skb, iv_len);
        }
 
index e9902613e2eeb70695ca52a408e5d558eb515e52..431e3c78bf27668b00d87fc06120a7f909ae5090 100644 (file)
@@ -33,10 +33,13 @@ MODULE_LICENSE("GPL");
 static struct usb_device_id rtl8187_table[] __devinitdata = {
        /* Asus */
        {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187},
+       /* Belkin */
+       {USB_DEVICE(0x050d, 0x705e), .driver_info = DEVICE_RTL8187B},
        /* Realtek */
        {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187},
        {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
        {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
+       {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
        /* Netgear */
        {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
        {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
index 67b26d3c3cd50548a1b4639ffb949b4345a98906..f5513cd4db35331d6b126242e65fb9dd90da76ba 100644 (file)
@@ -450,10 +450,11 @@ spectrum_cs_suspend(struct pcmcia_device *link)
 {
        struct net_device *dev = link->priv;
        struct orinoco_private *priv = netdev_priv(dev);
+       unsigned long flags;
        int err = 0;
 
        /* Mark the device as stopped, to block IO until later */
-       spin_lock(&priv->lock);
+       spin_lock_irqsave(&priv->lock, flags);
 
        err = __orinoco_down(dev);
        if (err)
@@ -463,7 +464,7 @@ spectrum_cs_suspend(struct pcmcia_device *link)
        netif_device_detach(dev);
        priv->hw_unavailable++;
 
-       spin_unlock(&priv->lock);
+       spin_unlock_irqrestore(&priv->lock, flags);
 
        return err;
 }
index 5617a1613c917b84c43758fd30400fd816b1a618..d861197f83c76aefdd1ec6dd1854057c6b27f177 100644 (file)
@@ -645,7 +645,8 @@ enum ieee80211_key_flags {
  *     - Temporal Encryption Key (128 bits)
  *     - Temporal Authenticator Tx MIC Key (64 bits)
  *     - Temporal Authenticator Rx MIC Key (64 bits)
- *
+ * @icv_len: FIXME
+ * @iv_len: FIXME
  */
 struct ieee80211_key_conf {
        enum ieee80211_key_alg alg;
index 2a451562377608788b5e7ece2beac917320dca43..2ad504fc3414e19eb1b43cef909af2a68214de4b 100644 (file)
@@ -545,8 +545,12 @@ static int netdev_notify(struct notifier_block *nb,
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
-       sprintf(buf, "netdev:%s", dev->name);
        dir = sdata->debugfsdir;
+
+       if (!dir)
+               return 0;
+
+       sprintf(buf, "netdev:%s", dev->name);
        if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf))
                printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs "
                       "dir to %s\n", buf);
index b9902e425f096f336f93c97aa2a4494508de4272..189d0bafa91ae0f274c2813f912012679f53903d 100644 (file)
@@ -249,11 +249,22 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
        DECLARE_MAC_BUF(mbuf);
        u8 *mac;
 
+       sta->debugfs.add_has_run = true;
+
        if (!stations_dir)
                return;
 
        mac = print_mac(mbuf, sta->sta.addr);
 
+       /*
+        * This might fail due to a race condition:
+        * When mac80211 unlinks a station, the debugfs entries
+        * remain, but it is already possible to link a new
+        * station with the same address which triggers adding
+        * it to debugfs; therefore, if the old station isn't
+        * destroyed quickly enough the old station's debugfs
+        * dir might still be around.
+        */
        sta->debugfs.dir = debugfs_create_dir(mac, stations_dir);
        if (!sta->debugfs.dir)
                return;
index 8025b294588bc0e1c44b61bfb465085cb0184c84..156e42a003ae77ac38e77aa1e047d58575e87eec 100644 (file)
@@ -816,8 +816,8 @@ struct ieee802_11_elems {
        u8 *ext_supp_rates;
        u8 *wmm_info;
        u8 *wmm_param;
-       u8 *ht_cap_elem;
-       u8 *ht_info_elem;
+       struct ieee80211_ht_cap *ht_cap_elem;
+       struct ieee80211_ht_addt_info *ht_info_elem;
        u8 *mesh_config;
        u8 *mesh_id;
        u8 *peer_link;
@@ -844,8 +844,6 @@ struct ieee802_11_elems {
        u8 ext_supp_rates_len;
        u8 wmm_info_len;
        u8 wmm_param_len;
-       u8 ht_cap_elem_len;
-       u8 ht_info_elem_len;
        u8 mesh_config_len;
        u8 mesh_id_len;
        u8 peer_link_len;
index 49f86fa56bff396adfc99daf8c921be3517a8cfb..87665d7bb4f9aa0bad666295914edca3dfefa701 100644 (file)
@@ -1348,10 +1348,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
            (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
                struct ieee80211_ht_bss_info bss_info;
                ieee80211_ht_cap_ie_to_ht_info(
-                               (struct ieee80211_ht_cap *)
                                elems.ht_cap_elem, &sta->sta.ht_info);
                ieee80211_ht_addt_info_ie_to_ht_bss_info(
-                               (struct ieee80211_ht_addt_info *)
                                elems.ht_info_elem, &bss_info);
                ieee80211_handle_ht(local, 1, &sta->sta.ht_info, &bss_info);
        }
@@ -1709,7 +1707,6 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                struct ieee80211_ht_bss_info bss_info;
 
                ieee80211_ht_addt_info_ie_to_ht_bss_info(
-                               (struct ieee80211_ht_addt_info *)
                                elems.ht_info_elem, &bss_info);
                changed |= ieee80211_handle_ht(local, 1, &conf->ht_conf,
                                               &bss_info);
index 8e6685e7ae8595569582ecdf7ea67340da79f2fa..416bb41099f361159d0bc578533d08a371a7de03 100644 (file)
@@ -388,7 +388,8 @@ ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
        bss = ieee80211_bss_info_update(sdata->local, rx_status,
                                        mgmt, skb->len, &elems,
                                        freq, beacon);
-       ieee80211_rx_bss_put(sdata->local, bss);
+       if (bss)
+               ieee80211_rx_bss_put(sdata->local, bss);
 
        dev_kfree_skb(skb);
        return RX_QUEUED;
index 9b72d15bc8dcb7c12978c607e057a67626c482c1..7fef8ea1f5ecf53eaf5b1596479ef1d8a834b348 100644 (file)
@@ -635,7 +635,12 @@ static void sta_info_debugfs_add_work(struct work_struct *work)
 
                spin_lock_irqsave(&local->sta_lock, flags);
                list_for_each_entry(tmp, &local->sta_list, list) {
-                       if (!tmp->debugfs.dir) {
+                       /*
+                        * debugfs.add_has_run will be set by
+                        * ieee80211_sta_debugfs_add regardless
+                        * of what else it does.
+                        */
+                       if (!tmp->debugfs.add_has_run) {
                                sta = tmp;
                                __sta_info_pin(sta);
                                break;
index a6b51862a89d2b8fc46ab9bdf7ff8fc2e27d89df..168a39a298bdc1f754de9ad1d0ac04f311466d33 100644 (file)
@@ -300,6 +300,7 @@ struct sta_info {
                struct dentry *inactive_ms;
                struct dentry *last_seq_ctrl;
                struct dentry *agg_status;
+               bool add_has_run;
        } debugfs;
 #endif
 
index f32561ec224ca4fb1ec6a83a53d0b59dc7d63451..cee4884b9d06215f86b73630362fae1f9ab87168 100644 (file)
@@ -529,12 +529,12 @@ void ieee802_11_parse_elems(u8 *start, size_t len,
                        elems->ext_supp_rates_len = elen;
                        break;
                case WLAN_EID_HT_CAPABILITY:
-                       elems->ht_cap_elem = pos;
-                       elems->ht_cap_elem_len = elen;
+                       if (elen >= sizeof(struct ieee80211_ht_cap))
+                               elems->ht_cap_elem = (void *)pos;
                        break;
                case WLAN_EID_HT_EXTRA_INFO:
-                       elems->ht_info_elem = pos;
-                       elems->ht_info_elem_len = elen;
+                       if (elen >= sizeof(struct ieee80211_ht_addt_info))
+                               elems->ht_info_elem = (void *)pos;
                        break;
                case WLAN_EID_MESH_ID:
                        elems->mesh_id = pos;
index 7e0d53abde24bb9e10b86e55d1112b76eaa63331..742f811ca416e5b16701ce2ae49f582ed32317a6 100644 (file)
@@ -775,7 +775,7 @@ static int ieee80211_ioctl_siwfrag(struct net_device *dev,
         * configure it here */
 
        if (local->ops->set_frag_threshold)
-               local->ops->set_frag_threshold(
+               return local->ops->set_frag_threshold(
                        local_to_hw(local),
                        local->fragmentation_threshold);
 
index 24fdd4cd22cb0a0ee2708d1c96b71fb416fd503b..5031db7b275b734b46870089765420c75c136d10 100644 (file)
@@ -184,7 +184,8 @@ int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
        if (result)
                goto out_unlock;
 
-       if (!debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
+       if (rdev->wiphy.debugfsdir &&
+           !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
                            rdev->wiphy.debugfsdir,
                            rdev->wiphy.debugfsdir->d_parent,
                            newname))
@@ -317,6 +318,8 @@ int wiphy_register(struct wiphy *wiphy)
        drv->wiphy.debugfsdir =
                debugfs_create_dir(wiphy_name(&drv->wiphy),
                                   ieee80211_debugfs_dir);
+       if (IS_ERR(drv->wiphy.debugfsdir))
+               drv->wiphy.debugfsdir = NULL;
 
        res = 0;
 out_unlock:
This page took 0.039497 seconds and 5 git commands to generate.