mirror of https://gitee.com/openkylin/linux.git
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
d14a7679ae
|
@ -2970,6 +2970,9 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
if (modparam_nohwcrypt)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (sc->opmode == NL80211_IFTYPE_AP)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (key->alg) {
|
||||
case ALG_WEP:
|
||||
case ALG_TKIP:
|
||||
|
|
|
@ -478,6 +478,18 @@ void ath9k_ani_reset(struct ath_hw *ah)
|
|||
"Reset ANI state opmode %u\n", ah->opmode);
|
||||
ah->stats.ast_ani_reset++;
|
||||
|
||||
if (ah->opmode == NL80211_IFTYPE_AP) {
|
||||
/*
|
||||
* ath9k_hw_ani_control() will only process items set on
|
||||
* ah->ani_function
|
||||
*/
|
||||
if (IS_CHAN_2GHZ(chan))
|
||||
ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
|
||||
ATH9K_ANI_FIRSTEP_LEVEL);
|
||||
else
|
||||
ah->ani_function = 0;
|
||||
}
|
||||
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0);
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0);
|
||||
|
|
|
@ -474,6 +474,21 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some users have reported their EEPROM programmed with
|
||||
* 0x8000 set, this is not a supported regulatory domain
|
||||
* but since we have more than one user with it we need
|
||||
* a solution for them. We default to 0x64, which is the
|
||||
* default Atheros world regulatory domain.
|
||||
*/
|
||||
static void ath_regd_sanitize(struct ath_regulatory *reg)
|
||||
{
|
||||
if (reg->current_rd != COUNTRY_ERD_FLAG)
|
||||
return;
|
||||
printk(KERN_DEBUG "ath: EEPROM regdomain sanitized\n");
|
||||
reg->current_rd = 0x64;
|
||||
}
|
||||
|
||||
int
|
||||
ath_regd_init(struct ath_regulatory *reg,
|
||||
struct wiphy *wiphy,
|
||||
|
@ -486,6 +501,8 @@ ath_regd_init(struct ath_regulatory *reg,
|
|||
if (!reg)
|
||||
return -EINVAL;
|
||||
|
||||
ath_regd_sanitize(reg);
|
||||
|
||||
printk(KERN_DEBUG "ath: EEPROM regdomain: 0x%0x\n", reg->current_rd);
|
||||
|
||||
if (!ath_regd_is_eeprom_valid(reg)) {
|
||||
|
|
|
@ -2675,12 +2675,10 @@ static ssize_t show_power_level(struct device *d,
|
|||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
||||
int mode = priv->power_data.user_power_setting;
|
||||
int level = priv->power_data.power_mode;
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p, "INDEX:%d\t", level);
|
||||
p += sprintf(p, "USER:%d\n", mode);
|
||||
p += sprintf(p, "%d\n", level);
|
||||
return p - buf + 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -872,7 +872,8 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len);
|
||||
|
||||
/* Set up entry for this TFD in Tx byte-count array */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq,
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU)
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq,
|
||||
le16_to_cpu(tx_cmd->len));
|
||||
|
||||
pci_dma_sync_single_for_device(priv->pci_dev, txcmd_phys,
|
||||
|
|
|
@ -3643,12 +3643,10 @@ static ssize_t show_power_level(struct device *d,
|
|||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
||||
int mode = priv->power_data.user_power_setting;
|
||||
int level = priv->power_data.power_mode;
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p, "INDEX:%d\t", level);
|
||||
p += sprintf(p, "USER:%d\n", mode);
|
||||
p += sprintf(p, "%d\n", level);
|
||||
return p - buf + 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -151,8 +151,8 @@ void iwm_if_free(struct iwm_priv *iwm)
|
|||
return;
|
||||
|
||||
free_netdev(iwm_to_ndev(iwm));
|
||||
iwm_wdev_free(iwm);
|
||||
iwm_priv_deinit(iwm);
|
||||
iwm_wdev_free(iwm);
|
||||
}
|
||||
|
||||
int iwm_if_add(struct iwm_priv *iwm)
|
||||
|
|
|
@ -135,8 +135,14 @@ int lbs_update_hw_spec(struct lbs_private *priv)
|
|||
/* Clamp region code to 8-bit since FW spec indicates that it should
|
||||
* only ever be 8-bit, even though the field size is 16-bit. Some firmware
|
||||
* returns non-zero high 8 bits here.
|
||||
*
|
||||
* Firmware version 4.0.102 used in CF8381 has region code shifted. We
|
||||
* need to check for this problem and handle it properly.
|
||||
*/
|
||||
priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
|
||||
if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V4)
|
||||
priv->regioncode = (le16_to_cpu(cmd.regioncode) >> 8) & 0xFF;
|
||||
else
|
||||
priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
|
||||
|
||||
for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
|
||||
/* use the region code to search for the index */
|
||||
|
|
|
@ -234,6 +234,8 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
|
|||
/** Mesh enable bit in FW capability */
|
||||
#define MESH_CAPINFO_ENABLE_MASK (1<<16)
|
||||
|
||||
/** FW definition from Marvell v4 */
|
||||
#define MRVL_FW_V4 (0x04)
|
||||
/** FW definition from Marvell v5 */
|
||||
#define MRVL_FW_V5 (0x05)
|
||||
/** FW definition from Marvell v10 */
|
||||
|
|
|
@ -709,7 +709,7 @@ static const struct ieee80211_ops mac80211_hwsim_ops =
|
|||
static void mac80211_hwsim_free(void)
|
||||
{
|
||||
struct list_head tmplist, *i, *tmp;
|
||||
struct mac80211_hwsim_data *data;
|
||||
struct mac80211_hwsim_data *data, *tmpdata;
|
||||
|
||||
INIT_LIST_HEAD(&tmplist);
|
||||
|
||||
|
@ -718,7 +718,7 @@ static void mac80211_hwsim_free(void)
|
|||
list_move(i, &tmplist);
|
||||
spin_unlock_bh(&hwsim_radio_lock);
|
||||
|
||||
list_for_each_entry(data, &tmplist, list) {
|
||||
list_for_each_entry_safe(data, tmpdata, &tmplist, list) {
|
||||
debugfs_remove(data->debugfs_group);
|
||||
debugfs_remove(data->debugfs_ps);
|
||||
debugfs_remove(data->debugfs);
|
||||
|
@ -1167,8 +1167,8 @@ static void __exit exit_mac80211_hwsim(void)
|
|||
{
|
||||
printk(KERN_DEBUG "mac80211_hwsim: unregister radios\n");
|
||||
|
||||
unregister_netdev(hwsim_mon);
|
||||
mac80211_hwsim_free();
|
||||
unregister_netdev(hwsim_mon);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -635,7 +635,7 @@ static int __devinit p54spi_probe(struct spi_device *spi)
|
|||
|
||||
hw = p54_init_common(sizeof(*priv));
|
||||
if (!hw) {
|
||||
dev_err(&priv->spi->dev, "could not alloc ieee80211_hw");
|
||||
dev_err(&spi->dev, "could not alloc ieee80211_hw");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -1550,7 +1550,9 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
|||
rt2500usb_register_read(rt2x00dev, MAC_CSR0, ®);
|
||||
rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
|
||||
|
||||
if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0)) {
|
||||
if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0) ||
|
||||
rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {
|
||||
|
||||
ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -208,11 +208,12 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
|
|||
{
|
||||
struct rtl8187_priv *priv = dev->priv;
|
||||
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
/* turn the LED off before exiting */
|
||||
queue_delayed_work(dev->workqueue, &priv->led_off, 0);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
rtl8187_unregister_led(&priv->led_rx);
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
}
|
||||
#endif /* def CONFIG_RTL8187_LED */
|
||||
|
||||
|
|
|
@ -973,7 +973,7 @@ static int acer_rfkill_set(void *data, bool blocked)
|
|||
{
|
||||
acpi_status status;
|
||||
u32 cap = (unsigned long)data;
|
||||
status = set_u32(!!blocked, cap);
|
||||
status = set_u32(!blocked, cap);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
|
|
|
@ -224,7 +224,7 @@ void rfkill_destroy(struct rfkill *rfkill);
|
|||
* should be blocked) so that drivers need not keep track of the soft
|
||||
* block state -- which they might not be able to.
|
||||
*/
|
||||
bool __must_check rfkill_set_hw_state(struct rfkill *rfkill, bool blocked);
|
||||
bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked);
|
||||
|
||||
/**
|
||||
* rfkill_set_sw_state - Set the internal rfkill software block state
|
||||
|
|
|
@ -83,6 +83,7 @@ endmenu
|
|||
config MAC80211_MESH
|
||||
bool "Enable mac80211 mesh networking (pre-802.11s) support"
|
||||
depends on MAC80211 && EXPERIMENTAL
|
||||
depends on BROKEN
|
||||
---help---
|
||||
This options enables support of Draft 802.11s mesh networking.
|
||||
The implementation is based on Draft 1.08 of the Mesh Networking
|
||||
|
|
|
@ -175,6 +175,8 @@ int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata)
|
|||
int err = 0;
|
||||
u32 hash_idx;
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (memcmp(dst, sdata->dev->dev_addr, ETH_ALEN) == 0)
|
||||
/* never add ourselves as neighbours */
|
||||
return -ENOTSUPP;
|
||||
|
@ -265,6 +267,7 @@ int mpp_path_add(u8 *dst, u8 *mpp, struct ieee80211_sub_if_data *sdata)
|
|||
int err = 0;
|
||||
u32 hash_idx;
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (memcmp(dst, sdata->dev->dev_addr, ETH_ALEN) == 0)
|
||||
/* never add ourselves as neighbours */
|
||||
|
@ -491,8 +494,10 @@ void mesh_path_tx_pending(struct mesh_path *mpath)
|
|||
* @skb: frame to discard
|
||||
* @sdata: network subif the frame was to be sent through
|
||||
*
|
||||
* If the frame was beign forwarded from another MP, a PERR frame will be sent
|
||||
* to the precursor.
|
||||
* If the frame was being forwarded from another MP, a PERR frame will be sent
|
||||
* to the precursor. The precursor's address (i.e. the previous hop) was saved
|
||||
* in addr1 of the frame-to-be-forwarded, and would only be overwritten once
|
||||
* the destination is successfully resolved.
|
||||
*
|
||||
* Locking: the function must me called within a rcu_read_lock region
|
||||
*/
|
||||
|
@ -507,7 +512,7 @@ void mesh_path_discard_frame(struct sk_buff *skb,
|
|||
u8 *ra, *da;
|
||||
|
||||
da = hdr->addr3;
|
||||
ra = hdr->addr2;
|
||||
ra = hdr->addr1;
|
||||
mpath = mesh_path_lookup(da, sdata);
|
||||
if (mpath)
|
||||
dsn = ++mpath->dsn;
|
||||
|
|
|
@ -1455,7 +1455,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
monitor_iface = UNKNOWN_ADDRESS;
|
||||
|
||||
len_rthdr = ieee80211_get_radiotap_len(skb->data);
|
||||
hdr = (struct ieee80211_hdr *)skb->data + len_rthdr;
|
||||
hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
/* check the header is complete in the frame */
|
||||
|
|
|
@ -549,6 +549,10 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
|
|||
swprev = !!(rfkill->state & RFKILL_BLOCK_SW);
|
||||
hwprev = !!(rfkill->state & RFKILL_BLOCK_HW);
|
||||
__rfkill_set_sw_state(rfkill, sw);
|
||||
if (hw)
|
||||
rfkill->state |= RFKILL_BLOCK_HW;
|
||||
else
|
||||
rfkill->state &= ~RFKILL_BLOCK_HW;
|
||||
|
||||
spin_unlock_irqrestore(&rfkill->lock, flags);
|
||||
|
||||
|
@ -648,15 +652,26 @@ static ssize_t rfkill_state_store(struct device *dev,
|
|||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
/*
|
||||
* The intention was that userspace can only take control over
|
||||
* a given device when/if rfkill-input doesn't control it due
|
||||
* to user_claim. Since user_claim is currently unsupported,
|
||||
* we never support changing the state from userspace -- this
|
||||
* can be implemented again later.
|
||||
*/
|
||||
struct rfkill *rfkill = to_rfkill(dev);
|
||||
unsigned long state;
|
||||
int err;
|
||||
|
||||
return -EPERM;
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
err = strict_strtoul(buf, 0, &state);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (state != RFKILL_USER_STATE_SOFT_BLOCKED &&
|
||||
state != RFKILL_USER_STATE_UNBLOCKED)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&rfkill_global_mutex);
|
||||
rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED);
|
||||
mutex_unlock(&rfkill_global_mutex);
|
||||
|
||||
return err ?: count;
|
||||
}
|
||||
|
||||
static ssize_t rfkill_claim_show(struct device *dev,
|
||||
|
|
|
@ -997,7 +997,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
if (IS_ERR(hdr)) {
|
||||
err = PTR_ERR(hdr);
|
||||
goto out;
|
||||
goto free_msg;
|
||||
}
|
||||
|
||||
cookie.msg = msg;
|
||||
|
@ -1011,7 +1011,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
&cookie, get_key_callback);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
goto free_msg;
|
||||
|
||||
if (cookie.error)
|
||||
goto nla_put_failure;
|
||||
|
@ -1022,6 +1022,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
nla_put_failure:
|
||||
err = -ENOBUFS;
|
||||
free_msg:
|
||||
nlmsg_free(msg);
|
||||
out:
|
||||
cfg80211_put_dev(drv);
|
||||
|
|
|
@ -35,8 +35,6 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
|
|||
else
|
||||
nl80211_send_scan_done(wiphy_to_dev(request->wiphy), dev);
|
||||
|
||||
wiphy_to_dev(request->wiphy)->scan_req = NULL;
|
||||
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
if (!aborted) {
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
|
@ -48,6 +46,7 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
|
|||
dev_put(dev);
|
||||
|
||||
out:
|
||||
wiphy_to_dev(request->wiphy)->scan_req = NULL;
|
||||
kfree(request);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_scan_done);
|
||||
|
|
Loading…
Reference in New Issue