Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (26 commits) llc: Fix double accounting of received packets netfilter: nf_conntrack_expect: fix error path unwind in nf_conntrack_expect_init() bluetooth: fix locking bug in the rfcomm socket cleanup handling mac80211: fix alignment issue with compare_ether_addr() mac80211: Fix for NULL pointer dereference in sta_info_get() mac80211: fix a typo in ieee80211_handle_filtered_frame comment rndis_wlan: add missing range check for power_output modparam iwlwifi: fix rate scale TLC column selection bug iwlwifi: fix exit from stay_in_table state rndis_wlan: Make connections to TKIP PSK networks work mac80211 : Fixes the status message for iwconfig rt2x00: Use atomic interface iteration in irq context rt2x00: Reset antenna RSSI after switch rt2x00: Don't count retries as failure rt2x00: Fix memleak in tx() path mac80211: reorder channel and freq reporting in wext scan report b43: Fix controller restart crash mac80211: fix ieee80211_rx_bss_put/get imbalance net/mac80211: always true conditionals b43: Upload both beacon templates on initial load ...
This commit is contained in:
@ -737,6 +737,7 @@ struct b43_wl {
|
||||
struct ieee80211_tx_control beacon_txctl;
|
||||
bool beacon0_uploaded;
|
||||
bool beacon1_uploaded;
|
||||
bool beacon_templates_virgin; /* Never wrote the templates? */
|
||||
struct work_struct beacon_update_trigger;
|
||||
|
||||
/* The current QOS parameters for the 4 queues.
|
||||
|
@ -1544,6 +1544,30 @@ static void b43_write_probe_resp_template(struct b43_wldev *dev,
|
||||
kfree(probe_resp_data);
|
||||
}
|
||||
|
||||
static void b43_upload_beacon0(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_wl *wl = dev->wl;
|
||||
|
||||
if (wl->beacon0_uploaded)
|
||||
return;
|
||||
b43_write_beacon_template(dev, 0x68, 0x18);
|
||||
/* FIXME: Probe resp upload doesn't really belong here,
|
||||
* but we don't use that feature anyway. */
|
||||
b43_write_probe_resp_template(dev, 0x268, 0x4A,
|
||||
&__b43_ratetable[3]);
|
||||
wl->beacon0_uploaded = 1;
|
||||
}
|
||||
|
||||
static void b43_upload_beacon1(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_wl *wl = dev->wl;
|
||||
|
||||
if (wl->beacon1_uploaded)
|
||||
return;
|
||||
b43_write_beacon_template(dev, 0x468, 0x1A);
|
||||
wl->beacon1_uploaded = 1;
|
||||
}
|
||||
|
||||
static void handle_irq_beacon(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_wl *wl = dev->wl;
|
||||
@ -1568,24 +1592,27 @@ static void handle_irq_beacon(struct b43_wldev *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!beacon0_valid) {
|
||||
if (!wl->beacon0_uploaded) {
|
||||
b43_write_beacon_template(dev, 0x68, 0x18);
|
||||
b43_write_probe_resp_template(dev, 0x268, 0x4A,
|
||||
&__b43_ratetable[3]);
|
||||
wl->beacon0_uploaded = 1;
|
||||
}
|
||||
if (unlikely(wl->beacon_templates_virgin)) {
|
||||
/* We never uploaded a beacon before.
|
||||
* Upload both templates now, but only mark one valid. */
|
||||
wl->beacon_templates_virgin = 0;
|
||||
b43_upload_beacon0(dev);
|
||||
b43_upload_beacon1(dev);
|
||||
cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
||||
cmd |= B43_MACCMD_BEACON0_VALID;
|
||||
b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
||||
} else if (!beacon1_valid) {
|
||||
if (!wl->beacon1_uploaded) {
|
||||
b43_write_beacon_template(dev, 0x468, 0x1A);
|
||||
wl->beacon1_uploaded = 1;
|
||||
} else {
|
||||
if (!beacon0_valid) {
|
||||
b43_upload_beacon0(dev);
|
||||
cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
||||
cmd |= B43_MACCMD_BEACON0_VALID;
|
||||
b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
||||
} else if (!beacon1_valid) {
|
||||
b43_upload_beacon1(dev);
|
||||
cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
||||
cmd |= B43_MACCMD_BEACON1_VALID;
|
||||
b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
||||
}
|
||||
cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
||||
cmd |= B43_MACCMD_BEACON1_VALID;
|
||||
b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4073,6 +4100,9 @@ static int b43_op_start(struct ieee80211_hw *hw)
|
||||
wl->filter_flags = 0;
|
||||
wl->radiotap_enabled = 0;
|
||||
b43_qos_clear(wl);
|
||||
wl->beacon0_uploaded = 0;
|
||||
wl->beacon1_uploaded = 0;
|
||||
wl->beacon_templates_virgin = 1;
|
||||
|
||||
/* First register RFkill.
|
||||
* LEDs that are registered later depend on it. */
|
||||
@ -4241,7 +4271,9 @@ static void b43_chip_reset(struct work_struct *work)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
out:
|
||||
out:
|
||||
if (err)
|
||||
wl->current_dev = NULL; /* Failed to init the dev. */
|
||||
mutex_unlock(&wl->mutex);
|
||||
if (err)
|
||||
b43err(wl, "Controller restart FAILED\n");
|
||||
@ -4382,9 +4414,11 @@ static void b43_one_core_detach(struct ssb_device *dev)
|
||||
struct b43_wldev *wldev;
|
||||
struct b43_wl *wl;
|
||||
|
||||
/* Do not cancel ieee80211-workqueue based work here.
|
||||
* See comment in b43_remove(). */
|
||||
|
||||
wldev = ssb_get_drvdata(dev);
|
||||
wl = wldev->wl;
|
||||
cancel_work_sync(&wldev->restart_work);
|
||||
b43_debugfs_remove_device(wldev);
|
||||
b43_wireless_core_detach(wldev);
|
||||
list_del(&wldev->list);
|
||||
@ -4569,6 +4603,10 @@ static void b43_remove(struct ssb_device *dev)
|
||||
struct b43_wl *wl = ssb_get_devtypedata(dev);
|
||||
struct b43_wldev *wldev = ssb_get_drvdata(dev);
|
||||
|
||||
/* We must cancel any work here before unregistering from ieee80211,
|
||||
* as the ieee80211 unreg will destroy the workqueue. */
|
||||
cancel_work_sync(&wldev->restart_work);
|
||||
|
||||
B43_WARN_ON(!wl);
|
||||
if (wl->current_dev == wldev)
|
||||
ieee80211_unregister_hw(wl->hw);
|
||||
|
@ -1162,7 +1162,6 @@ static s32 rs_get_best_rate(struct iwl_priv *priv,
|
||||
|
||||
/* Higher rate not available, use the original */
|
||||
} else {
|
||||
new_rate = rate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2009,7 +2008,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
||||
* 2) Not just finishing up a search
|
||||
* 3) Allowing a new search
|
||||
*/
|
||||
if (!update_lq && !done_search && !lq_sta->stay_in_tbl) {
|
||||
if (!update_lq && !done_search && !lq_sta->stay_in_tbl && window->counter) {
|
||||
/* Save current throughput to compare with "search" throughput*/
|
||||
lq_sta->last_tpt = current_tpt;
|
||||
|
||||
|
@ -116,6 +116,7 @@ MODULE_PARM_DESC(workaround_interval,
|
||||
#define OID_802_11_ENCRYPTION_STATUS ccpu2(0x0d01011b)
|
||||
#define OID_802_11_ADD_KEY ccpu2(0x0d01011d)
|
||||
#define OID_802_11_REMOVE_KEY ccpu2(0x0d01011e)
|
||||
#define OID_802_11_ASSOCIATION_INFORMATION ccpu2(0x0d01011f)
|
||||
#define OID_802_11_PMKID ccpu2(0x0d010123)
|
||||
#define OID_802_11_NETWORK_TYPES_SUPPORTED ccpu2(0x0d010203)
|
||||
#define OID_802_11_NETWORK_TYPE_IN_USE ccpu2(0x0d010204)
|
||||
@ -271,6 +272,26 @@ struct ndis_config_param {
|
||||
__le32 value_length;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct ndis_80211_assoc_info {
|
||||
__le32 length;
|
||||
__le16 req_ies;
|
||||
struct req_ie {
|
||||
__le16 capa;
|
||||
__le16 listen_interval;
|
||||
u8 cur_ap_address[6];
|
||||
} req_ie;
|
||||
__le32 req_ie_length;
|
||||
__le32 offset_req_ies;
|
||||
__le16 resp_ies;
|
||||
struct resp_ie {
|
||||
__le16 capa;
|
||||
__le16 status_code;
|
||||
__le16 assoc_id;
|
||||
} resp_ie;
|
||||
__le32 resp_ie_length;
|
||||
__le32 offset_resp_ies;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* these have to match what is in wpa_supplicant */
|
||||
enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP };
|
||||
enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
|
||||
@ -674,6 +695,12 @@ static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN])
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_association_info(struct usbnet *usbdev,
|
||||
struct ndis_80211_assoc_info *info, int len)
|
||||
{
|
||||
return rndis_query_oid(usbdev, OID_802_11_ASSOCIATION_INFORMATION,
|
||||
info, &len);
|
||||
}
|
||||
|
||||
static int is_associated(struct usbnet *usbdev)
|
||||
{
|
||||
@ -2182,11 +2209,40 @@ static void rndis_wext_worker(struct work_struct *work)
|
||||
struct usbnet *usbdev = priv->usbdev;
|
||||
union iwreq_data evt;
|
||||
unsigned char bssid[ETH_ALEN];
|
||||
int ret;
|
||||
struct ndis_80211_assoc_info *info;
|
||||
int assoc_size = sizeof(*info) + IW_CUSTOM_MAX + 32;
|
||||
int ret, offset;
|
||||
|
||||
if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) {
|
||||
ret = get_bssid(usbdev, bssid);
|
||||
info = kzalloc(assoc_size, GFP_KERNEL);
|
||||
if (!info)
|
||||
goto get_bssid;
|
||||
|
||||
/* Get association info IEs from device and send them back to
|
||||
* userspace. */
|
||||
ret = get_association_info(usbdev, info, assoc_size);
|
||||
if (!ret) {
|
||||
evt.data.length = le32_to_cpu(info->req_ie_length);
|
||||
if (evt.data.length > 0) {
|
||||
offset = le32_to_cpu(info->offset_req_ies);
|
||||
wireless_send_event(usbdev->net,
|
||||
IWEVASSOCREQIE, &evt,
|
||||
(char *)info + offset);
|
||||
}
|
||||
|
||||
evt.data.length = le32_to_cpu(info->resp_ie_length);
|
||||
if (evt.data.length > 0) {
|
||||
offset = le32_to_cpu(info->offset_resp_ies);
|
||||
wireless_send_event(usbdev->net,
|
||||
IWEVASSOCRESPIE, &evt,
|
||||
(char *)info + offset);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(info);
|
||||
|
||||
get_bssid:
|
||||
ret = get_bssid(usbdev, bssid);
|
||||
if (!ret) {
|
||||
evt.data.flags = 0;
|
||||
evt.data.length = 0;
|
||||
@ -2414,6 +2470,11 @@ static int bcm4320_early_init(struct usbnet *dev)
|
||||
else if (priv->param_power_save > 2)
|
||||
priv->param_power_save = 2;
|
||||
|
||||
if (priv->param_power_output < 0)
|
||||
priv->param_power_output = 0;
|
||||
else if (priv->param_power_output > 3)
|
||||
priv->param_power_output = 3;
|
||||
|
||||
if (priv->param_roamtrigger < -80)
|
||||
priv->param_roamtrigger = -80;
|
||||
else if (priv->param_roamtrigger > -60)
|
||||
|
@ -328,6 +328,11 @@ static inline int rt2x00_get_link_ant_rssi(struct link *link)
|
||||
return DEFAULT_RSSI;
|
||||
}
|
||||
|
||||
static inline void rt2x00_reset_link_ant_rssi(struct link *link)
|
||||
{
|
||||
link->ant.rssi_ant = 0;
|
||||
}
|
||||
|
||||
static inline int rt2x00_get_link_ant_rssi_history(struct link *link,
|
||||
enum antenna ant)
|
||||
{
|
||||
|
@ -129,6 +129,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
rt2x00dev->ops->lib->config(rt2x00dev, &libconf, CONFIG_UPDATE_ANTENNA);
|
||||
rt2x00lib_reset_link_tuner(rt2x00dev);
|
||||
rt2x00_reset_link_ant_rssi(&rt2x00dev->link);
|
||||
|
||||
rt2x00dev->link.ant.active.rx = libconf.ant.rx;
|
||||
rt2x00dev->link.ant.active.tx = libconf.ant.tx;
|
||||
|
@ -483,9 +483,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
|
||||
if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
ieee80211_iterate_active_interfaces(rt2x00dev->hw,
|
||||
rt2x00lib_beacondone_iter,
|
||||
rt2x00dev);
|
||||
ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
|
||||
rt2x00lib_beacondone_iter,
|
||||
rt2x00dev);
|
||||
|
||||
queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work);
|
||||
}
|
||||
@ -507,7 +507,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||||
* Update TX statistics.
|
||||
*/
|
||||
rt2x00dev->link.qual.tx_success += success;
|
||||
rt2x00dev->link.qual.tx_failed += txdesc->retry + fail;
|
||||
rt2x00dev->link.qual.tx_failed += fail;
|
||||
|
||||
/*
|
||||
* Initialize TX status
|
||||
|
@ -93,6 +93,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
*/
|
||||
if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) {
|
||||
ieee80211_stop_queues(hw);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ static void grf5101_rf_set_channel(struct ieee80211_hw *dev,
|
||||
write_grf5101(dev, 0x0B, chan);
|
||||
write_grf5101(dev, 0x07, 0x1000);
|
||||
|
||||
grf5101_write_phy_antenna(dev, chan);
|
||||
grf5101_write_phy_antenna(dev, channel);
|
||||
}
|
||||
|
||||
static void grf5101_rf_stop(struct ieee80211_hw *dev)
|
||||
|
@ -78,7 +78,8 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev,
|
||||
struct ieee80211_conf *conf)
|
||||
{
|
||||
struct rtl8180_priv *priv = dev->priv;
|
||||
int channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
|
||||
int channel = conf ?
|
||||
ieee80211_frequency_to_channel(conf->channel->center_freq) : 1;
|
||||
unsigned int chan_idx = channel - 1;
|
||||
u32 txpw = priv->channels[chan_idx].hw_value & 0xFF;
|
||||
u32 chan = max2820_chan[chan_idx];
|
||||
@ -87,7 +88,7 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev,
|
||||
* sa2400, for MAXIM we do this directly from BB */
|
||||
rtl8180_write_phy(dev, 3, txpw);
|
||||
|
||||
max2820_write_phy_antenna(dev, chan);
|
||||
max2820_write_phy_antenna(dev, channel);
|
||||
write_max2820(dev, 3, chan);
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ static void sa2400_rf_set_channel(struct ieee80211_hw *dev,
|
||||
|
||||
write_sa2400(dev, 7, txpw);
|
||||
|
||||
sa2400_write_phy_antenna(dev, chan);
|
||||
sa2400_write_phy_antenna(dev, channel);
|
||||
|
||||
write_sa2400(dev, 0, chan);
|
||||
write_sa2400(dev, 1, 0xbb50);
|
||||
|
Reference in New Issue
Block a user