Commit 75e77666 authored by Herbert Xu's avatar Herbert Xu
parents b7e0fe9f 53cb4791
...@@ -144,7 +144,8 @@ static int ieee80211_copy_snap(u8 * data, u16 h_proto) ...@@ -144,7 +144,8 @@ static int ieee80211_copy_snap(u8 * data, u16 h_proto)
snap->oui[1] = oui[1]; snap->oui[1] = oui[1];
snap->oui[2] = oui[2]; snap->oui[2] = oui[2];
*(u16 *) (data + SNAP_SIZE) = htons(h_proto); h_proto = htons(h_proto);
memcpy(data + SNAP_SIZE, &h_proto, sizeof(u16));
return SNAP_SIZE + sizeof(u16); return SNAP_SIZE + sizeof(u16);
} }
......
...@@ -216,6 +216,7 @@ static int ieee80211_open(struct net_device *dev) ...@@ -216,6 +216,7 @@ static int ieee80211_open(struct net_device *dev)
res = local->ops->start(local_to_hw(local)); res = local->ops->start(local_to_hw(local));
if (res) if (res)
return res; return res;
ieee80211_hw_config(local);
} }
switch (sdata->type) { switch (sdata->type) {
...@@ -232,7 +233,6 @@ static int ieee80211_open(struct net_device *dev) ...@@ -232,7 +233,6 @@ static int ieee80211_open(struct net_device *dev)
netif_tx_unlock_bh(local->mdev); netif_tx_unlock_bh(local->mdev);
local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP;
ieee80211_hw_config(local);
} }
break; break;
case IEEE80211_IF_TYPE_STA: case IEEE80211_IF_TYPE_STA:
...@@ -334,8 +334,7 @@ static int ieee80211_stop(struct net_device *dev) ...@@ -334,8 +334,7 @@ static int ieee80211_stop(struct net_device *dev)
ieee80211_configure_filter(local); ieee80211_configure_filter(local);
netif_tx_unlock_bh(local->mdev); netif_tx_unlock_bh(local->mdev);
local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP;
ieee80211_hw_config(local);
} }
break; break;
case IEEE80211_IF_TYPE_STA: case IEEE80211_IF_TYPE_STA:
...@@ -357,6 +356,11 @@ static int ieee80211_stop(struct net_device *dev) ...@@ -357,6 +356,11 @@ static int ieee80211_stop(struct net_device *dev)
cancel_delayed_work(&local->scan_work); cancel_delayed_work(&local->scan_work);
} }
flush_workqueue(local->hw.workqueue); flush_workqueue(local->hw.workqueue);
sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED;
kfree(sdata->u.sta.extra_ie);
sdata->u.sta.extra_ie = NULL;
sdata->u.sta.extra_ie_len = 0;
/* fall through */ /* fall through */
default: default:
conf.if_id = dev->ifindex; conf.if_id = dev->ifindex;
......
...@@ -997,7 +997,7 @@ ieee80211_rx_h_drop_unencrypted(struct ieee80211_txrx_data *rx) ...@@ -997,7 +997,7 @@ ieee80211_rx_h_drop_unencrypted(struct ieee80211_txrx_data *rx)
if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) && if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) &&
(rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC && (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC &&
rx->sdata->drop_unencrypted && (rx->key || rx->sdata->drop_unencrypted) &&
(rx->sdata->eapol == 0 || !ieee80211_is_eapol(rx->skb)))) { (rx->sdata->eapol == 0 || !ieee80211_is_eapol(rx->skb)))) {
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_DEBUG "%s: RX non-WEP frame, but expected " printk(KERN_DEBUG "%s: RX non-WEP frame, but expected "
......
...@@ -265,7 +265,8 @@ int ieee80211_wep_decrypt(struct ieee80211_local *local, struct sk_buff *skb, ...@@ -265,7 +265,8 @@ int ieee80211_wep_decrypt(struct ieee80211_local *local, struct sk_buff *skb,
if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen, if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen,
skb->data + hdrlen + WEP_IV_LEN, skb->data + hdrlen + WEP_IV_LEN,
len)) { len)) {
printk(KERN_DEBUG "WEP decrypt failed (ICV)\n"); if (net_ratelimit())
printk(KERN_DEBUG "WEP decrypt failed (ICV)\n");
ret = -1; ret = -1;
} }
......
...@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfkill *rfkill, ...@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfkill *rfkill,
static int rfkill_toggle_radio(struct rfkill *rfkill, static int rfkill_toggle_radio(struct rfkill *rfkill,
enum rfkill_state state) enum rfkill_state state)
{ {
int retval; int retval = 0;
retval = mutex_lock_interruptible(&rfkill->mutex);
if (retval)
return retval;
if (state != rfkill->state) { if (state != rfkill->state) {
retval = rfkill->toggle_radio(rfkill->data, state); retval = rfkill->toggle_radio(rfkill->data, state);
...@@ -74,7 +70,6 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, ...@@ -74,7 +70,6 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
} }
} }
mutex_unlock(&rfkill->mutex);
return retval; return retval;
} }
...@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(struct device *dev, ...@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(struct device *dev,
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (mutex_lock_interruptible(&rfkill->mutex))
return -ERESTARTSYS;
error = rfkill_toggle_radio(rfkill, error = rfkill_toggle_radio(rfkill,
state ? RFKILL_STATE_ON : RFKILL_STATE_OFF); state ? RFKILL_STATE_ON : RFKILL_STATE_OFF);
if (error) mutex_unlock(&rfkill->mutex);
return error;
return count; return error ? error : count;
} }
static ssize_t rfkill_claim_show(struct device *dev, static ssize_t rfkill_claim_show(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