Commit 6c36810a authored by David S. Miller's avatar David S. Miller
parents df694712 576fdeae
...@@ -251,7 +251,7 @@ static inline void ath5k_txbuf_free(struct ath5k_softc *sc, ...@@ -251,7 +251,7 @@ static inline void ath5k_txbuf_free(struct ath5k_softc *sc,
return; return;
pci_unmap_single(sc->pdev, bf->skbaddr, bf->skb->len, pci_unmap_single(sc->pdev, bf->skbaddr, bf->skb->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
dev_kfree_skb(bf->skb); dev_kfree_skb_any(bf->skb);
bf->skb = NULL; bf->skb = NULL;
} }
...@@ -466,6 +466,7 @@ ath5k_pci_probe(struct pci_dev *pdev, ...@@ -466,6 +466,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
mutex_init(&sc->lock); mutex_init(&sc->lock);
spin_lock_init(&sc->rxbuflock); spin_lock_init(&sc->rxbuflock);
spin_lock_init(&sc->txbuflock); spin_lock_init(&sc->txbuflock);
spin_lock_init(&sc->block);
/* Set private data */ /* Set private data */
pci_set_drvdata(pdev, hw); pci_set_drvdata(pdev, hw);
...@@ -2179,8 +2180,11 @@ ath5k_beacon_config(struct ath5k_softc *sc) ...@@ -2179,8 +2180,11 @@ ath5k_beacon_config(struct ath5k_softc *sc)
sc->imask |= AR5K_INT_SWBA; sc->imask |= AR5K_INT_SWBA;
if (ath5k_hw_hasveol(ah)) if (ath5k_hw_hasveol(ah)) {
spin_lock(&sc->block);
ath5k_beacon_send(sc); ath5k_beacon_send(sc);
spin_unlock(&sc->block);
}
} }
/* TODO else AP */ /* TODO else AP */
...@@ -2403,7 +2407,9 @@ ath5k_intr(int irq, void *dev_id) ...@@ -2403,7 +2407,9 @@ ath5k_intr(int irq, void *dev_id)
TSF_TO_TU(tsf), TSF_TO_TU(tsf),
(unsigned long long) tsf); (unsigned long long) tsf);
} else { } else {
spin_lock(&sc->block);
ath5k_beacon_send(sc); ath5k_beacon_send(sc);
spin_unlock(&sc->block);
} }
} }
if (status & AR5K_INT_RXEOL) { if (status & AR5K_INT_RXEOL) {
...@@ -2745,6 +2751,11 @@ static int ath5k_add_interface(struct ieee80211_hw *hw, ...@@ -2745,6 +2751,11 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto end; goto end;
} }
/* Set to a reasonable value. Note that this will
* be set to mac80211's value at ath5k_config(). */
sc->bintval = 1000;
ret = 0; ret = 0;
end: end:
mutex_unlock(&sc->lock); mutex_unlock(&sc->lock);
...@@ -2789,9 +2800,6 @@ ath5k_config_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -2789,9 +2800,6 @@ ath5k_config_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ath5k_hw *ah = sc->ah; struct ath5k_hw *ah = sc->ah;
int ret; int ret;
/* Set to a reasonable value. Note that this will
* be set to mac80211's value at ath5k_config(). */
sc->bintval = 1000;
mutex_lock(&sc->lock); mutex_lock(&sc->lock);
if (sc->vif != vif) { if (sc->vif != vif) {
ret = -EIO; ret = -EIO;
...@@ -3050,6 +3058,7 @@ static int ...@@ -3050,6 +3058,7 @@ static int
ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb) ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
{ {
struct ath5k_softc *sc = hw->priv; struct ath5k_softc *sc = hw->priv;
unsigned long flags;
int ret; int ret;
ath5k_debug_dump_skb(sc, skb, "BC ", 1); ath5k_debug_dump_skb(sc, skb, "BC ", 1);
...@@ -3059,12 +3068,14 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -3059,12 +3068,14 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
goto end; goto end;
} }
spin_lock_irqsave(&sc->block, flags);
ath5k_txbuf_free(sc, sc->bbuf); ath5k_txbuf_free(sc, sc->bbuf);
sc->bbuf->skb = skb; sc->bbuf->skb = skb;
ret = ath5k_beacon_setup(sc, sc->bbuf); ret = ath5k_beacon_setup(sc, sc->bbuf);
if (ret) if (ret)
sc->bbuf->skb = NULL; sc->bbuf->skb = NULL;
else { spin_unlock_irqrestore(&sc->block, flags);
if (!ret) {
ath5k_beacon_config(sc); ath5k_beacon_config(sc);
mmiowb(); mmiowb();
} }
......
...@@ -172,6 +172,7 @@ struct ath5k_softc { ...@@ -172,6 +172,7 @@ struct ath5k_softc {
struct tasklet_struct txtq; /* tx intr tasklet */ struct tasklet_struct txtq; /* tx intr tasklet */
struct ath5k_led tx_led; /* tx led */ struct ath5k_led tx_led; /* tx led */
spinlock_t block; /* protects beacon */
struct ath5k_buf *bbuf; /* beacon buffer */ struct ath5k_buf *bbuf; /* beacon buffer */
unsigned int bhalq, /* SW q for outgoing beacons */ unsigned int bhalq, /* SW q for outgoing beacons */
bmisscount, /* missed beacon transmits */ bmisscount, /* missed beacon transmits */
......
...@@ -1304,7 +1304,7 @@ EXPORT_SYMBOL(atmel_open); ...@@ -1304,7 +1304,7 @@ EXPORT_SYMBOL(atmel_open);
int atmel_open(struct net_device *dev) int atmel_open(struct net_device *dev)
{ {
struct atmel_private *priv = netdev_priv(dev); struct atmel_private *priv = netdev_priv(dev);
int i, channel; int i, channel, err;
/* any scheduled timer is no longer needed and might screw things up.. */ /* any scheduled timer is no longer needed and might screw things up.. */
del_timer_sync(&priv->management_timer); del_timer_sync(&priv->management_timer);
...@@ -1328,8 +1328,9 @@ int atmel_open(struct net_device *dev) ...@@ -1328,8 +1328,9 @@ int atmel_open(struct net_device *dev)
priv->site_survey_state = SITE_SURVEY_IDLE; priv->site_survey_state = SITE_SURVEY_IDLE;
priv->station_is_associated = 0; priv->station_is_associated = 0;
if (!reset_atmel_card(dev)) err = reset_atmel_card(dev);
return -EAGAIN; if (err)
return err;
if (priv->config_reg_domain) { if (priv->config_reg_domain) {
priv->reg_domain = priv->config_reg_domain; priv->reg_domain = priv->config_reg_domain;
...@@ -3061,12 +3062,20 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) ...@@ -3061,12 +3062,20 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
} }
if (status == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) { if (status == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) {
/* Do opensystem first, then try sharedkey */ /* Flip back and forth between WEP auth modes until the max
* authentication tries has been exceeded.
*/
if (system == WLAN_AUTH_OPEN) { if (system == WLAN_AUTH_OPEN) {
priv->CurrentAuthentTransactionSeqNum = 0x001; priv->CurrentAuthentTransactionSeqNum = 0x001;
priv->exclude_unencrypted = 1; priv->exclude_unencrypted = 1;
send_authentication_request(priv, WLAN_AUTH_SHARED_KEY, NULL, 0); send_authentication_request(priv, WLAN_AUTH_SHARED_KEY, NULL, 0);
return; return;
} else if ( system == WLAN_AUTH_SHARED_KEY
&& priv->wep_is_on) {
priv->CurrentAuthentTransactionSeqNum = 0x001;
priv->exclude_unencrypted = 0;
send_authentication_request(priv, WLAN_AUTH_OPEN, NULL, 0);
return;
} else if (priv->connect_to_any_BSS) { } else if (priv->connect_to_any_BSS) {
int bss_index; int bss_index;
...@@ -3580,12 +3589,12 @@ static int atmel_wakeup_firmware(struct atmel_private *priv) ...@@ -3580,12 +3589,12 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
if (i == 0) { if (i == 0) {
printk(KERN_ALERT "%s: MAC failed to boot.\n", priv->dev->name); printk(KERN_ALERT "%s: MAC failed to boot.\n", priv->dev->name);
return 0; return -EIO;
} }
if ((priv->host_info_base = atmel_read16(priv->dev, MR2)) == 0xffff) { if ((priv->host_info_base = atmel_read16(priv->dev, MR2)) == 0xffff) {
printk(KERN_ALERT "%s: card missing.\n", priv->dev->name); printk(KERN_ALERT "%s: card missing.\n", priv->dev->name);
return 0; return -ENODEV;
} }
/* now check for completion of MAC initialization through /* now check for completion of MAC initialization through
...@@ -3609,19 +3618,19 @@ static int atmel_wakeup_firmware(struct atmel_private *priv) ...@@ -3609,19 +3618,19 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
if (i == 0) { if (i == 0) {
printk(KERN_ALERT "%s: MAC failed to initialise.\n", printk(KERN_ALERT "%s: MAC failed to initialise.\n",
priv->dev->name); priv->dev->name);
return 0; return -EIO;
} }
/* Check for MAC_INIT_OK only on the register that the MAC_INIT_OK was set */ /* Check for MAC_INIT_OK only on the register that the MAC_INIT_OK was set */
if ((mr3 & MAC_INIT_COMPLETE) && if ((mr3 & MAC_INIT_COMPLETE) &&
!(atmel_read16(priv->dev, MR3) & MAC_INIT_OK)) { !(atmel_read16(priv->dev, MR3) & MAC_INIT_OK)) {
printk(KERN_ALERT "%s: MAC failed MR3 self-test.\n", priv->dev->name); printk(KERN_ALERT "%s: MAC failed MR3 self-test.\n", priv->dev->name);
return 0; return -EIO;
} }
if ((mr1 & MAC_INIT_COMPLETE) && if ((mr1 & MAC_INIT_COMPLETE) &&
!(atmel_read16(priv->dev, MR1) & MAC_INIT_OK)) { !(atmel_read16(priv->dev, MR1) & MAC_INIT_OK)) {
printk(KERN_ALERT "%s: MAC failed MR1 self-test.\n", priv->dev->name); printk(KERN_ALERT "%s: MAC failed MR1 self-test.\n", priv->dev->name);
return 0; return -EIO;
} }
atmel_copy_to_host(priv->dev, (unsigned char *)iface, atmel_copy_to_host(priv->dev, (unsigned char *)iface,
...@@ -3642,7 +3651,7 @@ static int atmel_wakeup_firmware(struct atmel_private *priv) ...@@ -3642,7 +3651,7 @@ static int atmel_wakeup_firmware(struct atmel_private *priv)
iface->func_ctrl = le16_to_cpu(iface->func_ctrl); iface->func_ctrl = le16_to_cpu(iface->func_ctrl);
iface->mac_status = le16_to_cpu(iface->mac_status); iface->mac_status = le16_to_cpu(iface->mac_status);
return 1; return 0;
} }
/* determine type of memory and MAC address */ /* determine type of memory and MAC address */
...@@ -3693,7 +3702,7 @@ static int probe_atmel_card(struct net_device *dev) ...@@ -3693,7 +3702,7 @@ static int probe_atmel_card(struct net_device *dev)
/* Standard firmware in flash, boot it up and ask /* Standard firmware in flash, boot it up and ask
for the Mac Address */ for the Mac Address */
priv->card_type = CARD_TYPE_SPI_FLASH; priv->card_type = CARD_TYPE_SPI_FLASH;
if (atmel_wakeup_firmware(priv)) { if (atmel_wakeup_firmware(priv) == 0) {
atmel_get_mib(priv, Mac_Address_Mib_Type, 0, dev->dev_addr, 6); atmel_get_mib(priv, Mac_Address_Mib_Type, 0, dev->dev_addr, 6);
/* got address, now squash it again until the network /* got address, now squash it again until the network
...@@ -3835,6 +3844,7 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -3835,6 +3844,7 @@ static int reset_atmel_card(struct net_device *dev)
struct atmel_private *priv = netdev_priv(dev); struct atmel_private *priv = netdev_priv(dev);
u8 configuration; u8 configuration;
int old_state = priv->station_state; int old_state = priv->station_state;
int err = 0;
/* data to add to the firmware names, in priority order /* data to add to the firmware names, in priority order
this implemenents firmware versioning */ this implemenents firmware versioning */
...@@ -3868,11 +3878,12 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -3868,11 +3878,12 @@ static int reset_atmel_card(struct net_device *dev)
dev->name); dev->name);
strcpy(priv->firmware_id, "atmel_at76c502.bin"); strcpy(priv->firmware_id, "atmel_at76c502.bin");
} }
if (request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev) != 0) { err = request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev);
if (err != 0) {
printk(KERN_ALERT printk(KERN_ALERT
"%s: firmware %s is missing, cannot continue.\n", "%s: firmware %s is missing, cannot continue.\n",
dev->name, priv->firmware_id); dev->name, priv->firmware_id);
return 0; return err;
} }
} else { } else {
int fw_index = 0; int fw_index = 0;
...@@ -3901,7 +3912,7 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -3901,7 +3912,7 @@ static int reset_atmel_card(struct net_device *dev)
"%s: firmware %s is missing, cannot start.\n", "%s: firmware %s is missing, cannot start.\n",
dev->name, priv->firmware_id); dev->name, priv->firmware_id);
priv->firmware_id[0] = '\0'; priv->firmware_id[0] = '\0';
return 0; return -ENOENT;
} }
} }
...@@ -3926,8 +3937,9 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -3926,8 +3937,9 @@ static int reset_atmel_card(struct net_device *dev)
release_firmware(fw_entry); release_firmware(fw_entry);
} }
if (!atmel_wakeup_firmware(priv)) err = atmel_wakeup_firmware(priv);
return 0; if (err != 0)
return err;
/* Check the version and set the correct flag for wpa stuff, /* Check the version and set the correct flag for wpa stuff,
old and new firmware is incompatible. old and new firmware is incompatible.
...@@ -3968,10 +3980,9 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -3968,10 +3980,9 @@ static int reset_atmel_card(struct net_device *dev)
if (!priv->radio_on_broken) { if (!priv->radio_on_broken) {
if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) == if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) ==
CMD_STATUS_REJECTED_RADIO_OFF) { CMD_STATUS_REJECTED_RADIO_OFF) {
printk(KERN_INFO printk(KERN_INFO "%s: cannot turn the radio on.\n",
"%s: cannot turn the radio on. (Hey radio, you're beautiful!)\n",
dev->name); dev->name);
return 0; return -EIO;
} }
} }
...@@ -4006,7 +4017,7 @@ static int reset_atmel_card(struct net_device *dev) ...@@ -4006,7 +4017,7 @@ static int reset_atmel_card(struct net_device *dev)
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
} }
return 1; return 0;
} }
static void atmel_send_command(struct atmel_private *priv, int command, static void atmel_send_command(struct atmel_private *priv, int command,
......
...@@ -248,8 +248,8 @@ IEEE80211_IF_WFILE(min_discovery_timeout, ...@@ -248,8 +248,8 @@ IEEE80211_IF_WFILE(min_discovery_timeout,
static void add_sta_files(struct ieee80211_sub_if_data *sdata) static void add_sta_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_ADD(drop_unencrypted, sta); DEBUGFS_ADD(drop_unencrypted, sta);
DEBUGFS_ADD(force_unicast_rateidx, ap); DEBUGFS_ADD(force_unicast_rateidx, sta);
DEBUGFS_ADD(max_ratectrl_rateidx, ap); DEBUGFS_ADD(max_ratectrl_rateidx, sta);
DEBUGFS_ADD(state, sta); DEBUGFS_ADD(state, sta);
DEBUGFS_ADD(bssid, sta); DEBUGFS_ADD(bssid, sta);
...@@ -283,8 +283,8 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata) ...@@ -283,8 +283,8 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata)
static void add_wds_files(struct ieee80211_sub_if_data *sdata) static void add_wds_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_ADD(drop_unencrypted, wds); DEBUGFS_ADD(drop_unencrypted, wds);
DEBUGFS_ADD(force_unicast_rateidx, ap); DEBUGFS_ADD(force_unicast_rateidx, wds);
DEBUGFS_ADD(max_ratectrl_rateidx, ap); DEBUGFS_ADD(max_ratectrl_rateidx, wds);
DEBUGFS_ADD(peer, wds); DEBUGFS_ADD(peer, wds);
} }
...@@ -292,8 +292,8 @@ static void add_wds_files(struct ieee80211_sub_if_data *sdata) ...@@ -292,8 +292,8 @@ static void add_wds_files(struct ieee80211_sub_if_data *sdata)
static void add_vlan_files(struct ieee80211_sub_if_data *sdata) static void add_vlan_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_ADD(drop_unencrypted, vlan); DEBUGFS_ADD(drop_unencrypted, vlan);
DEBUGFS_ADD(force_unicast_rateidx, ap); DEBUGFS_ADD(force_unicast_rateidx, vlan);
DEBUGFS_ADD(max_ratectrl_rateidx, ap); DEBUGFS_ADD(max_ratectrl_rateidx, vlan);
} }
static void add_monitor_files(struct ieee80211_sub_if_data *sdata) static void add_monitor_files(struct ieee80211_sub_if_data *sdata)
...@@ -381,8 +381,8 @@ static void add_files(struct ieee80211_sub_if_data *sdata) ...@@ -381,8 +381,8 @@ static void add_files(struct ieee80211_sub_if_data *sdata)
static void del_sta_files(struct ieee80211_sub_if_data *sdata) static void del_sta_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_DEL(drop_unencrypted, sta); DEBUGFS_DEL(drop_unencrypted, sta);
DEBUGFS_DEL(force_unicast_rateidx, ap); DEBUGFS_DEL(force_unicast_rateidx, sta);
DEBUGFS_DEL(max_ratectrl_rateidx, ap); DEBUGFS_DEL(max_ratectrl_rateidx, sta);
DEBUGFS_DEL(state, sta); DEBUGFS_DEL(state, sta);
DEBUGFS_DEL(bssid, sta); DEBUGFS_DEL(bssid, sta);
...@@ -416,8 +416,8 @@ static void del_ap_files(struct ieee80211_sub_if_data *sdata) ...@@ -416,8 +416,8 @@ static void del_ap_files(struct ieee80211_sub_if_data *sdata)
static void del_wds_files(struct ieee80211_sub_if_data *sdata) static void del_wds_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_DEL(drop_unencrypted, wds); DEBUGFS_DEL(drop_unencrypted, wds);
DEBUGFS_DEL(force_unicast_rateidx, ap); DEBUGFS_DEL(force_unicast_rateidx, wds);
DEBUGFS_DEL(max_ratectrl_rateidx, ap); DEBUGFS_DEL(max_ratectrl_rateidx, wds);
DEBUGFS_DEL(peer, wds); DEBUGFS_DEL(peer, wds);
} }
...@@ -425,8 +425,8 @@ static void del_wds_files(struct ieee80211_sub_if_data *sdata) ...@@ -425,8 +425,8 @@ static void del_wds_files(struct ieee80211_sub_if_data *sdata)
static void del_vlan_files(struct ieee80211_sub_if_data *sdata) static void del_vlan_files(struct ieee80211_sub_if_data *sdata)
{ {
DEBUGFS_DEL(drop_unencrypted, vlan); DEBUGFS_DEL(drop_unencrypted, vlan);
DEBUGFS_DEL(force_unicast_rateidx, ap); DEBUGFS_DEL(force_unicast_rateidx, vlan);
DEBUGFS_DEL(max_ratectrl_rateidx, ap); DEBUGFS_DEL(max_ratectrl_rateidx, vlan);
} }
static void del_monitor_files(struct ieee80211_sub_if_data *sdata) static void del_monitor_files(struct ieee80211_sub_if_data *sdata)
......
...@@ -470,6 +470,8 @@ struct ieee80211_sub_if_data { ...@@ -470,6 +470,8 @@ struct ieee80211_sub_if_data {
struct dentry *auth_transaction; struct dentry *auth_transaction;
struct dentry *flags; struct dentry *flags;
struct dentry *num_beacons_sta; struct dentry *num_beacons_sta;
struct dentry *force_unicast_rateidx;
struct dentry *max_ratectrl_rateidx;
} sta; } sta;
struct { struct {
struct dentry *drop_unencrypted; struct dentry *drop_unencrypted;
...@@ -483,9 +485,13 @@ struct ieee80211_sub_if_data { ...@@ -483,9 +485,13 @@ struct ieee80211_sub_if_data {
struct { struct {
struct dentry *drop_unencrypted; struct dentry *drop_unencrypted;
struct dentry *peer; struct dentry *peer;
struct dentry *force_unicast_rateidx;
struct dentry *max_ratectrl_rateidx;
} wds; } wds;
struct { struct {
struct dentry *drop_unencrypted; struct dentry *drop_unencrypted;
struct dentry *force_unicast_rateidx;
struct dentry *max_ratectrl_rateidx;
} vlan; } vlan;
struct { struct {
struct dentry *mode; struct dentry *mode;
......
...@@ -383,7 +383,7 @@ struct mesh_table *mesh_table_grow(struct mesh_table *tbl) ...@@ -383,7 +383,7 @@ struct mesh_table *mesh_table_grow(struct mesh_table *tbl)
hlist_for_each_safe(p, q, &newtbl->hash_buckets[i]) hlist_for_each_safe(p, q, &newtbl->hash_buckets[i])
tbl->free_node(p, 0); tbl->free_node(p, 0);
} }
__mesh_table_free(tbl); __mesh_table_free(newtbl);
endgrow: endgrow:
return NULL; return NULL;
} }
......
...@@ -478,51 +478,21 @@ int ieee80211_ht_addt_info_ie_to_ht_bss_info( ...@@ -478,51 +478,21 @@ int ieee80211_ht_addt_info_ie_to_ht_bss_info(
static void ieee80211_sta_send_associnfo(struct net_device *dev, static void ieee80211_sta_send_associnfo(struct net_device *dev,
struct ieee80211_if_sta *ifsta) struct ieee80211_if_sta *ifsta)
{ {
char *buf;
size_t len;
int i;
union iwreq_data wrqu; union iwreq_data wrqu;
if (!ifsta->assocreq_ies && !ifsta->assocresp_ies)
return;
buf = kmalloc(50 + 2 * (ifsta->assocreq_ies_len +
ifsta->assocresp_ies_len), GFP_KERNEL);
if (!buf)
return;
len = sprintf(buf, "ASSOCINFO(");
if (ifsta->assocreq_ies) { if (ifsta->assocreq_ies) {
len += sprintf(buf + len, "ReqIEs="); memset(&wrqu, 0, sizeof(wrqu));
for (i = 0; i < ifsta->assocreq_ies_len; i++) { wrqu.data.length = ifsta->assocreq_ies_len;
len += sprintf(buf + len, "%02x", wireless_send_event(dev, IWEVASSOCREQIE, &wrqu,
ifsta->assocreq_ies[i]); ifsta->assocreq_ies);
}
} }
if (ifsta->assocresp_ies) {
if (ifsta->assocreq_ies)
len += sprintf(buf + len, " ");
len += sprintf(buf + len, "RespIEs=");
for (i = 0; i < ifsta->assocresp_ies_len; i++) {
len += sprintf(buf + len, "%02x",
ifsta->assocresp_ies[i]);
}
}
len += sprintf(buf + len, ")");
if (len > IW_CUSTOM_MAX) { if (ifsta->assocresp_ies) {
len = sprintf(buf, "ASSOCRESPIE="); memset(&wrqu, 0, sizeof(wrqu));
for (i = 0; i < ifsta->assocresp_ies_len; i++) { wrqu.data.length = ifsta->assocresp_ies_len;
len += sprintf(buf + len, "%02x", wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu,
ifsta->assocresp_ies[i]); ifsta->assocresp_ies);
}
} }
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.length = len;
wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
kfree(buf);
} }
...@@ -813,7 +783,7 @@ static void ieee80211_send_assoc(struct net_device *dev, ...@@ -813,7 +783,7 @@ static void ieee80211_send_assoc(struct net_device *dev,
} }
} }
if (count == 8) { if (rates_len > count) {
pos = skb_put(skb, rates_len - count + 2); pos = skb_put(skb, rates_len - count + 2);
*pos++ = WLAN_EID_EXT_SUPP_RATES; *pos++ = WLAN_EID_EXT_SUPP_RATES;
*pos++ = rates_len - count; *pos++ = rates_len - count;
...@@ -2868,7 +2838,7 @@ static void ieee80211_rx_bss_info(struct net_device *dev, ...@@ -2868,7 +2838,7 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
jiffies); jiffies);
#endif /* CONFIG_MAC80211_IBSS_DEBUG */ #endif /* CONFIG_MAC80211_IBSS_DEBUG */
if (beacon_timestamp > rx_timestamp) { if (beacon_timestamp > rx_timestamp) {
#ifndef CONFIG_MAC80211_IBSS_DEBUG #ifdef CONFIG_MAC80211_IBSS_DEBUG
printk(KERN_DEBUG "%s: beacon TSF higher than " printk(KERN_DEBUG "%s: beacon TSF higher than "
"local TSF - IBSS merge with BSSID %s\n", "local TSF - IBSS merge with BSSID %s\n",
dev->name, print_mac(mac, mgmt->bssid)); dev->name, print_mac(mac, mgmt->bssid));
......
...@@ -377,7 +377,7 @@ static ssize_t rfkill_claim_show(struct device *dev, ...@@ -377,7 +377,7 @@ static ssize_t rfkill_claim_show(struct device *dev,
{ {
struct rfkill *rfkill = to_rfkill(dev); struct rfkill *rfkill = to_rfkill(dev);
return sprintf(buf, "%d", rfkill->user_claim); return sprintf(buf, "%d\n", rfkill->user_claim);
} }
static ssize_t rfkill_claim_store(struct device *dev, static ssize_t rfkill_claim_store(struct device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment