]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireles...
authorDavid S. Miller <davem@davemloft.net>
Thu, 1 May 2008 09:06:32 +0000 (02:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 1 May 2008 09:06:32 +0000 (02:06 -0700)
drivers/net/wireless/b43/main.c
drivers/net/wireless/libertas/scan.c
include/linux/ieee80211.h
net/mac80211/ieee80211_i.h
net/mac80211/main.c
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/tkip.c

index 8c24cd72aaca711ae9852fcdd0b0e0c2bb44b325..6c7db9a1a466e06abe2b4abcdff186ea69161685 100644 (file)
@@ -4326,6 +4326,14 @@ static int b43_wireless_core_attach(struct b43_wldev *dev)
                err = -EOPNOTSUPP;
                goto err_powerdown;
        }
+       if (1 /* disable A-PHY */) {
+               /* FIXME: For now we disable the A-PHY on multi-PHY devices. */
+               if (dev->phy.type != B43_PHYTYPE_N) {
+                       have_2ghz_phy = 1;
+                       have_5ghz_phy = 0;
+               }
+       }
+
        dev->phy.gmode = have_2ghz_phy;
        tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
        b43_wireless_core_reset(dev, tmp);
index 1a409fcc80d3fdb30f65a703a2938bcba58af8d2..d448c9702a0f93528d66f7d5f2ee116a452a1604 100644 (file)
@@ -298,7 +298,8 @@ static int lbs_do_scan(struct lbs_private *priv, uint8_t bsstype,
        uint8_t *tlv;   /* pointer into our current, growing TLV storage area */
 
        lbs_deb_enter_args(LBS_DEB_SCAN, "bsstype %d, chanlist[].chan %d, chan_count %d",
-                          bsstype, chan_list[0].channumber, chan_count);
+               bsstype, chan_list ? chan_list[0].channumber : -1,
+               chan_count);
 
        /* create the fixed part for scan command */
        scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
index 529f301d9372d85ed588441894140edbd5d79321..0b5e03eae6d25556b8ebb7209bb1af3033d7ffe1 100644 (file)
@@ -113,7 +113,7 @@ struct ieee80211_hdr {
 struct ieee80211s_hdr {
        u8 flags;
        u8 ttl;
-       u8 seqnum[3];
+       __le32 seqnum;
        u8 eaddr1[6];
        u8 eaddr2[6];
        u8 eaddr3[6];
index 8e53ce7ed44485ee0afe2a347a49555d9d1a22a5..c7314bf4bec2c9ac4e45e3837a2ce024e21a59d2 100644 (file)
@@ -354,7 +354,7 @@ struct ieee80211_if_sta {
        int preq_queue_len;
        struct mesh_stats mshstats;
        struct mesh_config mshcfg;
-       u8 mesh_seqnum[3];
+       u32 mesh_seqnum;
        bool accepting_plinks;
 #endif
        u16 aid;
index e9a978979d38553188163f1b632360233735a401..9ad4e3631b6bd4b5ac012f53457abcaa41e2ec47 100644 (file)
@@ -255,22 +255,8 @@ static int ieee80211_open(struct net_device *dev)
 
        switch (sdata->vif.type) {
        case IEEE80211_IF_TYPE_WDS:
-               if (is_zero_ether_addr(sdata->u.wds.remote_addr))
+               if (!is_valid_ether_addr(sdata->u.wds.remote_addr))
                        return -ENOLINK;
-
-               /* Create STA entry for the WDS peer */
-               sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
-                                    GFP_KERNEL);
-               if (!sta)
-                       return -ENOMEM;
-
-               sta->flags |= WLAN_STA_AUTHORIZED;
-
-               res = sta_info_insert(sta);
-               if (res) {
-                       /* STA has been freed */
-                       return res;
-               }
                break;
        case IEEE80211_IF_TYPE_VLAN:
                if (!sdata->u.vlan.ap)
@@ -337,10 +323,8 @@ static int ieee80211_open(struct net_device *dev)
                conf.type = sdata->vif.type;
                conf.mac_addr = dev->dev_addr;
                res = local->ops->add_interface(local_to_hw(local), &conf);
-               if (res && !local->open_count && local->ops->stop)
-                       local->ops->stop(local_to_hw(local));
                if (res)
-                       return res;
+                       goto err_stop;
 
                ieee80211_if_config(dev);
                ieee80211_reset_erp_info(dev);
@@ -353,9 +337,29 @@ static int ieee80211_open(struct net_device *dev)
                        netif_carrier_on(dev);
        }
 
+       if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) {
+               /* Create STA entry for the WDS peer */
+               sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
+                                    GFP_KERNEL);
+               if (!sta) {
+                       res = -ENOMEM;
+                       goto err_del_interface;
+               }
+
+               sta->flags |= WLAN_STA_AUTHORIZED;
+
+               res = sta_info_insert(sta);
+               if (res) {
+                       /* STA has been freed */
+                       goto err_del_interface;
+               }
+       }
+
        if (local->open_count == 0) {
                res = dev_open(local->mdev);
                WARN_ON(res);
+               if (res)
+                       goto err_del_interface;
                tasklet_enable(&local->tx_pending_tasklet);
                tasklet_enable(&local->tasklet);
        }
@@ -390,6 +394,12 @@ static int ieee80211_open(struct net_device *dev)
        netif_start_queue(dev);
 
        return 0;
+ err_del_interface:
+       local->ops->remove_interface(local_to_hw(local), &conf);
+ err_stop:
+       if (!local->open_count && local->ops->stop)
+               local->ops->stop(local_to_hw(local));
+       return res;
 }
 
 static int ieee80211_stop(struct net_device *dev)
@@ -975,6 +985,7 @@ static int __ieee80211_if_config(struct net_device *dev,
                conf.ssid_len = sdata->u.sta.ssid_len;
        } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
                conf.beacon = beacon;
+               conf.beacon_control = control;
                ieee80211_start_mesh(dev);
        } else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) {
                conf.ssid = sdata->u.ap.ssid;
index 594a3356a5082c3c33760c67254cac02133f42fb..f76bc26ae4d219301dcde04bda7b62d350007ba1 100644 (file)
@@ -8,6 +8,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <asm/unaligned.h>
 #include "ieee80211_i.h"
 #include "mesh.h"
 
@@ -167,8 +168,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
        struct rmc_entry *p, *n;
 
        /* Don't care about endianness since only match matters */
-       memcpy(&seqnum, mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
-       idx = mesh_hdr->seqnum[0] & rmc->idx_mask;
+       memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
+       idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
        list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
                ++entries;
                if (time_after(jiffies, p->exp_time) ||
@@ -393,16 +394,8 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
 {
        meshhdr->flags = 0;
        meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL;
-
-       meshhdr->seqnum[0] = sdata->u.sta.mesh_seqnum[0]++;
-       meshhdr->seqnum[1] = sdata->u.sta.mesh_seqnum[1];
-       meshhdr->seqnum[2] = sdata->u.sta.mesh_seqnum[2];
-
-       if (sdata->u.sta.mesh_seqnum[0] == 0) {
-               sdata->u.sta.mesh_seqnum[1]++;
-               if (sdata->u.sta.mesh_seqnum[1] == 0)
-                       sdata->u.sta.mesh_seqnum[2]++;
-       }
+       put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum);
+       sdata->u.sta.mesh_seqnum++;
 
        return 5;
 }
index 9ee3affab346a548bc4f046afac9c7fc07134b11..2e161f6d8288255d47609fb83febf9bc2faae5ba 100644 (file)
@@ -140,7 +140,7 @@ struct rmc_entry {
 
 struct mesh_rmc {
        struct rmc_entry bucket[RMC_BUCKETS];
-       u8 idx_mask;
+       u32 idx_mask;
 };
 
 
index dddbfd60f35148e790a46d80db2ae70821f7850e..09093da24af625f8d42db34d9f285734c1e7b5d3 100644 (file)
@@ -230,10 +230,8 @@ void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
 
        iv16 = data[hdr_len] << 8;
        iv16 += data[hdr_len + 2];
-       iv32 = data[hdr_len + 4] +
-               (data[hdr_len + 5] >> 8) +
-               (data[hdr_len + 6] >> 16) +
-               (data[hdr_len + 7] >> 24);
+       iv32 = data[hdr_len + 4] | (data[hdr_len + 5] << 8) |
+              (data[hdr_len + 6] << 16) | (data[hdr_len + 7] << 24);
 
 #ifdef CONFIG_TKIP_DEBUG
        printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",