Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-4965-rs.c drivers/net/wireless/rt2x00/rt61pci.c
This commit is contained in:
@@ -255,14 +255,23 @@ void ieee80211_debugfs_key_remove(struct ieee80211_key *key)
|
||||
void ieee80211_debugfs_key_add_default(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
char buf[50];
|
||||
struct ieee80211_key *key;
|
||||
|
||||
if (!sdata->debugfsdir)
|
||||
return;
|
||||
|
||||
sprintf(buf, "../keys/%d", sdata->default_key->debugfs.cnt);
|
||||
sdata->debugfs.default_key =
|
||||
debugfs_create_symlink("default_key", sdata->debugfsdir, buf);
|
||||
/* this is running under the key lock */
|
||||
|
||||
key = sdata->default_key;
|
||||
if (key) {
|
||||
sprintf(buf, "../keys/%d", key->debugfs.cnt);
|
||||
sdata->debugfs.default_key =
|
||||
debugfs_create_symlink("default_key",
|
||||
sdata->debugfsdir, buf);
|
||||
} else
|
||||
ieee80211_debugfs_key_remove_default(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_key_remove_default(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
if (!sdata)
|
||||
|
||||
@@ -53,6 +53,15 @@ int ieee80211_if_add(struct net_device *dev, const char *name,
|
||||
if (!ndev)
|
||||
return -ENOMEM;
|
||||
|
||||
ndev->needed_headroom = local->tx_headroom +
|
||||
4*6 /* four MAC addresses */
|
||||
+ 2 + 2 + 2 + 2 /* ctl, dur, seq, qos */
|
||||
+ 6 /* mesh */
|
||||
+ 8 /* rfc1042/bridge tunnel */
|
||||
- ETH_HLEN /* ethernet hard_header_len */
|
||||
+ IEEE80211_ENCRYPT_HEADROOM;
|
||||
ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM;
|
||||
|
||||
ret = dev_alloc_name(ndev, ndev->name);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
@@ -1771,6 +1771,7 @@ fail_wep:
|
||||
fail_rate:
|
||||
ieee80211_debugfs_remove_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev));
|
||||
unregister_netdevice(local->mdev);
|
||||
local->mdev = NULL;
|
||||
fail_dev:
|
||||
rtnl_unlock();
|
||||
sta_info_stop(local);
|
||||
@@ -1778,8 +1779,10 @@ fail_sta_info:
|
||||
debugfs_hw_del(local);
|
||||
destroy_workqueue(local->hw.workqueue);
|
||||
fail_workqueue:
|
||||
ieee80211_if_free(local->mdev);
|
||||
local->mdev = NULL;
|
||||
if (local->mdev != NULL) {
|
||||
ieee80211_if_free(local->mdev);
|
||||
local->mdev = NULL;
|
||||
}
|
||||
fail_mdev_alloc:
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
return result;
|
||||
|
||||
@@ -397,7 +397,7 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
|
||||
put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum);
|
||||
sdata->u.sta.mesh_seqnum++;
|
||||
|
||||
return 5;
|
||||
return 6;
|
||||
}
|
||||
|
||||
void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
@@ -120,7 +120,7 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
|
||||
*pos++ = WLAN_EID_PREP;
|
||||
break;
|
||||
default:
|
||||
kfree(skb);
|
||||
kfree_skb(skb);
|
||||
return -ENOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -158,19 +158,25 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
|
||||
if (atomic_add_unless(&sdata->u.sta.mpaths, 1, MESH_MAX_MPATHS) == 0)
|
||||
return -ENOSPC;
|
||||
|
||||
read_lock(&pathtbl_resize_lock);
|
||||
|
||||
new_mpath = kzalloc(sizeof(struct mesh_path), GFP_KERNEL);
|
||||
if (!new_mpath) {
|
||||
atomic_dec(&sdata->u.sta.mpaths);
|
||||
err = -ENOMEM;
|
||||
goto endadd2;
|
||||
}
|
||||
new_node = kmalloc(sizeof(struct mpath_node), GFP_KERNEL);
|
||||
if (!new_node) {
|
||||
kfree(new_mpath);
|
||||
atomic_dec(&sdata->u.sta.mpaths);
|
||||
err = -ENOMEM;
|
||||
goto endadd2;
|
||||
}
|
||||
|
||||
read_lock(&pathtbl_resize_lock);
|
||||
memcpy(new_mpath->dst, dst, ETH_ALEN);
|
||||
new_mpath->dev = dev;
|
||||
new_mpath->flags = 0;
|
||||
skb_queue_head_init(&new_mpath->frame_queue);
|
||||
new_node = kmalloc(sizeof(struct mpath_node), GFP_KERNEL);
|
||||
new_node->mpath = new_mpath;
|
||||
new_mpath->timer.data = (unsigned long) new_mpath;
|
||||
new_mpath->timer.function = mesh_path_timer;
|
||||
@@ -202,7 +208,6 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
|
||||
|
||||
endadd:
|
||||
spin_unlock(&mesh_paths->hashwlock[hash_idx]);
|
||||
endadd2:
|
||||
read_unlock(&pathtbl_resize_lock);
|
||||
if (!err && grow) {
|
||||
struct mesh_table *oldtbl, *newtbl;
|
||||
@@ -215,10 +220,12 @@ endadd2:
|
||||
return -ENOMEM;
|
||||
}
|
||||
rcu_assign_pointer(mesh_paths, newtbl);
|
||||
write_unlock(&pathtbl_resize_lock);
|
||||
|
||||
synchronize_rcu();
|
||||
mesh_table_free(oldtbl, false);
|
||||
write_unlock(&pathtbl_resize_lock);
|
||||
}
|
||||
endadd2:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -651,6 +651,26 @@ static void ieee80211_authenticate(struct net_device *dev,
|
||||
mod_timer(&ifsta->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
|
||||
}
|
||||
|
||||
static int ieee80211_compatible_rates(struct ieee80211_sta_bss *bss,
|
||||
struct ieee80211_supported_band *sband,
|
||||
u64 *rates)
|
||||
{
|
||||
int i, j, count;
|
||||
*rates = 0;
|
||||
count = 0;
|
||||
for (i = 0; i < bss->supp_rates_len; i++) {
|
||||
int rate = (bss->supp_rates[i] & 0x7F) * 5;
|
||||
|
||||
for (j = 0; j < sband->n_bitrates; j++)
|
||||
if (sband->bitrates[j].bitrate == rate) {
|
||||
*rates |= BIT(j);
|
||||
count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void ieee80211_send_assoc(struct net_device *dev,
|
||||
struct ieee80211_if_sta *ifsta)
|
||||
@@ -659,11 +679,12 @@ static void ieee80211_send_assoc(struct net_device *dev,
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u8 *pos, *ies;
|
||||
int i, len;
|
||||
int i, len, count, rates_len, supp_rates_len;
|
||||
u16 capab;
|
||||
struct ieee80211_sta_bss *bss;
|
||||
int wmm = 0;
|
||||
struct ieee80211_supported_band *sband;
|
||||
u64 rates = 0;
|
||||
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
||||
sizeof(*mgmt) + 200 + ifsta->extra_ie_len +
|
||||
@@ -725,24 +746,39 @@ static void ieee80211_send_assoc(struct net_device *dev,
|
||||
*pos++ = ifsta->ssid_len;
|
||||
memcpy(pos, ifsta->ssid, ifsta->ssid_len);
|
||||
|
||||
len = sband->n_bitrates;
|
||||
if (len > 8)
|
||||
len = 8;
|
||||
pos = skb_put(skb, len + 2);
|
||||
*pos++ = WLAN_EID_SUPP_RATES;
|
||||
*pos++ = len;
|
||||
for (i = 0; i < len; i++) {
|
||||
int rate = sband->bitrates[i].bitrate;
|
||||
*pos++ = (u8) (rate / 5);
|
||||
}
|
||||
/* all supported rates should be added here but some APs
|
||||
* (e.g. D-Link DAP 1353 in b-only mode) don't like that
|
||||
* Therefore only add rates the AP supports */
|
||||
rates_len = ieee80211_compatible_rates(bss, sband, &rates);
|
||||
supp_rates_len = rates_len;
|
||||
if (supp_rates_len > 8)
|
||||
supp_rates_len = 8;
|
||||
|
||||
if (sband->n_bitrates > len) {
|
||||
pos = skb_put(skb, sband->n_bitrates - len + 2);
|
||||
*pos++ = WLAN_EID_EXT_SUPP_RATES;
|
||||
*pos++ = sband->n_bitrates - len;
|
||||
for (i = len; i < sband->n_bitrates; i++) {
|
||||
len = sband->n_bitrates;
|
||||
pos = skb_put(skb, supp_rates_len + 2);
|
||||
*pos++ = WLAN_EID_SUPP_RATES;
|
||||
*pos++ = supp_rates_len;
|
||||
|
||||
count = 0;
|
||||
for (i = 0; i < sband->n_bitrates; i++) {
|
||||
if (BIT(i) & rates) {
|
||||
int rate = sband->bitrates[i].bitrate;
|
||||
*pos++ = (u8) (rate / 5);
|
||||
if (++count == 8)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (count == 8) {
|
||||
pos = skb_put(skb, rates_len - count + 2);
|
||||
*pos++ = WLAN_EID_EXT_SUPP_RATES;
|
||||
*pos++ = rates_len - count;
|
||||
|
||||
for (i++; i < sband->n_bitrates; i++) {
|
||||
if (BIT(i) & rates) {
|
||||
int rate = sband->bitrates[i].bitrate;
|
||||
*pos++ = (u8) (rate / 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ static int rate_control_pid_events_open(struct inode *inode, struct file *file)
|
||||
struct rc_pid_sta_info *sinfo = inode->i_private;
|
||||
struct rc_pid_event_buffer *events = &sinfo->events;
|
||||
struct rc_pid_events_file_info *file_info;
|
||||
unsigned int status;
|
||||
unsigned long status;
|
||||
|
||||
/* Allocate a state struct */
|
||||
file_info = kmalloc(sizeof(*file_info), GFP_KERNEL);
|
||||
@@ -135,7 +135,7 @@ static ssize_t rate_control_pid_events_read(struct file *file, char __user *buf,
|
||||
char pb[RC_PID_PRINT_BUF_SIZE];
|
||||
int ret;
|
||||
int p;
|
||||
unsigned int status;
|
||||
unsigned long status;
|
||||
|
||||
/* Check if there is something to read. */
|
||||
if (events->next_entry == file_info->next_entry) {
|
||||
|
||||
@@ -1300,11 +1300,11 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
||||
if (is_multicast_ether_addr(skb->data)) {
|
||||
if (*mesh_ttl > 0) {
|
||||
xmit_skb = skb_copy(skb, GFP_ATOMIC);
|
||||
if (!xmit_skb && net_ratelimit())
|
||||
if (xmit_skb)
|
||||
xmit_skb->pkt_type = PACKET_OTHERHOST;
|
||||
else if (net_ratelimit())
|
||||
printk(KERN_DEBUG "%s: failed to clone "
|
||||
"multicast frame\n", dev->name);
|
||||
else
|
||||
xmit_skb->pkt_type = PACKET_OTHERHOST;
|
||||
} else
|
||||
IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.sta,
|
||||
dropped_frames_ttl);
|
||||
@@ -1390,7 +1390,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
||||
padding = ((4 - subframe_len) & 0x3);
|
||||
/* the last MSDU has no padding */
|
||||
if (subframe_len > remaining) {
|
||||
printk(KERN_DEBUG "%s: wrong buffer size", dev->name);
|
||||
printk(KERN_DEBUG "%s: wrong buffer size\n", dev->name);
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
||||
@@ -1413,7 +1413,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
||||
eth = (struct ethhdr *) skb_pull(skb, ntohs(len) +
|
||||
padding);
|
||||
if (!eth) {
|
||||
printk(KERN_DEBUG "%s: wrong buffer size ",
|
||||
printk(KERN_DEBUG "%s: wrong buffer size\n",
|
||||
dev->name);
|
||||
dev_kfree_skb(frame);
|
||||
return RX_DROP_UNUSABLE;
|
||||
@@ -1947,7 +1947,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||
if (!skb_new) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_DEBUG "%s: failed to copy "
|
||||
"multicast frame for %s",
|
||||
"multicast frame for %s\n",
|
||||
wiphy_name(local->hw.wiphy),
|
||||
prev->dev->name);
|
||||
continue;
|
||||
|
||||
@@ -1562,13 +1562,13 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||
* be cloned. This could happen, e.g., with Linux bridge code passing
|
||||
* us broadcast frames. */
|
||||
|
||||
if (head_need > 0 || skb_cloned(skb)) {
|
||||
if (head_need > 0 || skb_header_cloned(skb)) {
|
||||
#if 0
|
||||
printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes "
|
||||
"of headroom\n", dev->name, head_need);
|
||||
#endif
|
||||
|
||||
if (skb_cloned(skb))
|
||||
if (skb_header_cloned(skb))
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
||||
else
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head);
|
||||
@@ -1898,6 +1898,7 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
|
||||
control->flags |= IEEE80211_TXCTL_SHORT_PREAMBLE;
|
||||
control->antenna_sel_tx = local->hw.conf.antenna_sel_tx;
|
||||
control->flags |= IEEE80211_TXCTL_NO_ACK;
|
||||
control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
|
||||
control->retry_limit = 1;
|
||||
control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT;
|
||||
}
|
||||
|
||||
@@ -153,15 +153,15 @@ int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)
|
||||
/* 7.1.3.5a.2 */
|
||||
switch (ae) {
|
||||
case 0:
|
||||
return 5;
|
||||
return 6;
|
||||
case 1:
|
||||
return 11;
|
||||
return 12;
|
||||
case 2:
|
||||
return 17;
|
||||
return 18;
|
||||
case 3:
|
||||
return 23;
|
||||
return 24;
|
||||
default:
|
||||
return 5;
|
||||
return 6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -379,7 +379,8 @@ static int wme_qdiscop_init(struct Qdisc *qd, struct nlattr *opt)
|
||||
qd->handle);
|
||||
if (!q->queues[i]) {
|
||||
q->queues[i] = &noop_qdisc;
|
||||
printk(KERN_ERR "%s child qdisc %i creation failed", dev->name, i);
|
||||
printk(KERN_ERR "%s child qdisc %i creation failed\n",
|
||||
dev->name, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user