Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
c2a3b23345
|
@ -4326,6 +4326,14 @@ static int b43_wireless_core_attach(struct b43_wldev *dev)
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
goto err_powerdown;
|
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;
|
dev->phy.gmode = have_2ghz_phy;
|
||||||
tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
|
tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
|
||||||
b43_wireless_core_reset(dev, tmp);
|
b43_wireless_core_reset(dev, tmp);
|
||||||
|
|
|
@ -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 */
|
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",
|
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 */
|
/* create the fixed part for scan command */
|
||||||
scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
|
scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
|
||||||
|
|
|
@ -113,7 +113,7 @@ struct ieee80211_hdr {
|
||||||
struct ieee80211s_hdr {
|
struct ieee80211s_hdr {
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 ttl;
|
u8 ttl;
|
||||||
u8 seqnum[3];
|
__le32 seqnum;
|
||||||
u8 eaddr1[6];
|
u8 eaddr1[6];
|
||||||
u8 eaddr2[6];
|
u8 eaddr2[6];
|
||||||
u8 eaddr3[6];
|
u8 eaddr3[6];
|
||||||
|
|
|
@ -354,7 +354,7 @@ struct ieee80211_if_sta {
|
||||||
int preq_queue_len;
|
int preq_queue_len;
|
||||||
struct mesh_stats mshstats;
|
struct mesh_stats mshstats;
|
||||||
struct mesh_config mshcfg;
|
struct mesh_config mshcfg;
|
||||||
u8 mesh_seqnum[3];
|
u32 mesh_seqnum;
|
||||||
bool accepting_plinks;
|
bool accepting_plinks;
|
||||||
#endif
|
#endif
|
||||||
u16 aid;
|
u16 aid;
|
||||||
|
|
|
@ -255,22 +255,8 @@ static int ieee80211_open(struct net_device *dev)
|
||||||
|
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case IEEE80211_IF_TYPE_WDS:
|
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;
|
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;
|
break;
|
||||||
case IEEE80211_IF_TYPE_VLAN:
|
case IEEE80211_IF_TYPE_VLAN:
|
||||||
if (!sdata->u.vlan.ap)
|
if (!sdata->u.vlan.ap)
|
||||||
|
@ -337,10 +323,8 @@ static int ieee80211_open(struct net_device *dev)
|
||||||
conf.type = sdata->vif.type;
|
conf.type = sdata->vif.type;
|
||||||
conf.mac_addr = dev->dev_addr;
|
conf.mac_addr = dev->dev_addr;
|
||||||
res = local->ops->add_interface(local_to_hw(local), &conf);
|
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)
|
if (res)
|
||||||
return res;
|
goto err_stop;
|
||||||
|
|
||||||
ieee80211_if_config(dev);
|
ieee80211_if_config(dev);
|
||||||
ieee80211_reset_erp_info(dev);
|
ieee80211_reset_erp_info(dev);
|
||||||
|
@ -353,9 +337,29 @@ static int ieee80211_open(struct net_device *dev)
|
||||||
netif_carrier_on(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) {
|
if (local->open_count == 0) {
|
||||||
res = dev_open(local->mdev);
|
res = dev_open(local->mdev);
|
||||||
WARN_ON(res);
|
WARN_ON(res);
|
||||||
|
if (res)
|
||||||
|
goto err_del_interface;
|
||||||
tasklet_enable(&local->tx_pending_tasklet);
|
tasklet_enable(&local->tx_pending_tasklet);
|
||||||
tasklet_enable(&local->tasklet);
|
tasklet_enable(&local->tasklet);
|
||||||
}
|
}
|
||||||
|
@ -390,6 +394,12 @@ static int ieee80211_open(struct net_device *dev)
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
|
|
||||||
return 0;
|
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)
|
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;
|
conf.ssid_len = sdata->u.sta.ssid_len;
|
||||||
} else if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
} else if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
||||||
conf.beacon = beacon;
|
conf.beacon = beacon;
|
||||||
|
conf.beacon_control = control;
|
||||||
ieee80211_start_mesh(dev);
|
ieee80211_start_mesh(dev);
|
||||||
} else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) {
|
} else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) {
|
||||||
conf.ssid = sdata->u.ap.ssid;
|
conf.ssid = sdata->u.ap.ssid;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <asm/unaligned.h>
|
||||||
#include "ieee80211_i.h"
|
#include "ieee80211_i.h"
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
|
|
||||||
|
@ -167,8 +168,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
|
||||||
struct rmc_entry *p, *n;
|
struct rmc_entry *p, *n;
|
||||||
|
|
||||||
/* Don't care about endianness since only match matters */
|
/* Don't care about endianness since only match matters */
|
||||||
memcpy(&seqnum, mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
|
memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
|
||||||
idx = mesh_hdr->seqnum[0] & rmc->idx_mask;
|
idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
|
||||||
list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
|
list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
|
||||||
++entries;
|
++entries;
|
||||||
if (time_after(jiffies, p->exp_time) ||
|
if (time_after(jiffies, p->exp_time) ||
|
||||||
|
@ -393,16 +394,8 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
|
||||||
{
|
{
|
||||||
meshhdr->flags = 0;
|
meshhdr->flags = 0;
|
||||||
meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL;
|
meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL;
|
||||||
|
put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum);
|
||||||
meshhdr->seqnum[0] = sdata->u.sta.mesh_seqnum[0]++;
|
sdata->u.sta.mesh_seqnum++;
|
||||||
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]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ struct rmc_entry {
|
||||||
|
|
||||||
struct mesh_rmc {
|
struct mesh_rmc {
|
||||||
struct rmc_entry bucket[RMC_BUCKETS];
|
struct rmc_entry bucket[RMC_BUCKETS];
|
||||||
u8 idx_mask;
|
u32 idx_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -230,10 +230,8 @@ void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
|
||||||
|
|
||||||
iv16 = data[hdr_len] << 8;
|
iv16 = data[hdr_len] << 8;
|
||||||
iv16 += data[hdr_len + 2];
|
iv16 += data[hdr_len + 2];
|
||||||
iv32 = data[hdr_len + 4] +
|
iv32 = data[hdr_len + 4] | (data[hdr_len + 5] << 8) |
|
||||||
(data[hdr_len + 5] >> 8) +
|
(data[hdr_len + 6] << 16) | (data[hdr_len + 7] << 24);
|
||||||
(data[hdr_len + 6] >> 16) +
|
|
||||||
(data[hdr_len + 7] >> 24);
|
|
||||||
|
|
||||||
#ifdef CONFIG_TKIP_DEBUG
|
#ifdef CONFIG_TKIP_DEBUG
|
||||||
printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",
|
printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",
|
||||||
|
|
Loading…
Reference in New Issue