mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 into for-davem
This commit is contained in:
commit
8a98d935c4
16 changed files with 92 additions and 42 deletions
|
@ -297,7 +297,9 @@ ath5k_pci_remove(struct pci_dev *pdev)
|
|||
#ifdef CONFIG_PM_SLEEP
|
||||
static int ath5k_pci_suspend(struct device *dev)
|
||||
{
|
||||
struct ath5k_softc *sc = pci_get_drvdata(to_pci_dev(dev));
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
|
||||
ath5k_led_off(sc);
|
||||
return 0;
|
||||
|
@ -306,7 +308,8 @@ static int ath5k_pci_suspend(struct device *dev)
|
|||
static int ath5k_pci_resume(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct ath5k_softc *sc = pci_get_drvdata(pdev);
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
|
||||
/*
|
||||
* Suspend/Resume resets the PCI configuration space, so we have to
|
||||
|
|
|
@ -10,7 +10,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \
|
|||
struct device_attribute *attr, \
|
||||
char *buf) \
|
||||
{ \
|
||||
struct ath5k_softc *sc = dev_get_drvdata(dev); \
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
|
||||
struct ath5k_softc *sc = hw->priv; \
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", get); \
|
||||
} \
|
||||
\
|
||||
|
@ -18,7 +19,8 @@ static ssize_t ath5k_attr_store_##name(struct device *dev, \
|
|||
struct device_attribute *attr, \
|
||||
const char *buf, size_t count) \
|
||||
{ \
|
||||
struct ath5k_softc *sc = dev_get_drvdata(dev); \
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
|
||||
struct ath5k_softc *sc = hw->priv; \
|
||||
int val; \
|
||||
\
|
||||
val = (int)simple_strtoul(buf, NULL, 10); \
|
||||
|
@ -33,7 +35,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \
|
|||
struct device_attribute *attr, \
|
||||
char *buf) \
|
||||
{ \
|
||||
struct ath5k_softc *sc = dev_get_drvdata(dev); \
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
|
||||
struct ath5k_softc *sc = hw->priv; \
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", get); \
|
||||
} \
|
||||
static DEVICE_ATTR(name, S_IRUGO, ath5k_attr_show_##name, NULL)
|
||||
|
|
|
@ -671,7 +671,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
|
|||
* TODO - this could be improved to be dependent on the rate.
|
||||
* The hardware can keep up at lower rates, but not higher rates
|
||||
*/
|
||||
if (fi->keyix != ATH9K_TXKEYIX_INVALID)
|
||||
if ((fi->keyix != ATH9K_TXKEYIX_INVALID) &&
|
||||
!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA))
|
||||
ndelim += ATH_AGGR_ENCRYPTDELIM;
|
||||
|
||||
/*
|
||||
|
|
|
@ -112,6 +112,8 @@ static struct usb_device_id carl9170_usb_ids[] = {
|
|||
{ USB_DEVICE(0x04bb, 0x093f) },
|
||||
/* NEC WL300NU-G */
|
||||
{ USB_DEVICE(0x0409, 0x0249) },
|
||||
/* NEC WL300NU-AG */
|
||||
{ USB_DEVICE(0x0409, 0x02b4) },
|
||||
/* AVM FRITZ!WLAN USB Stick N */
|
||||
{ USB_DEVICE(0x057c, 0x8401) },
|
||||
/* AVM FRITZ!WLAN USB Stick N 2.4 */
|
||||
|
|
|
@ -298,6 +298,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
|
|||
{RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/
|
||||
{RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/
|
||||
{RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/
|
||||
{RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/
|
||||
{RTL_USB_DEVICE(0x0Df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
|
||||
{RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/
|
||||
/* HP - Lite-On ,8188CUS Slim Combo */
|
||||
|
|
|
@ -516,8 +516,17 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc)
|
|||
|
||||
static void ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
|
||||
{
|
||||
ssb_pcicore_fix_sprom_core_index(pc);
|
||||
|
||||
/* Disable PCI interrupts. */
|
||||
ssb_write32(pc->dev, SSB_INTVEC, 0);
|
||||
|
||||
/* Additional PCIe always once-executed workarounds */
|
||||
if (pc->dev->id.coreid == SSB_DEV_PCIE) {
|
||||
ssb_pcicore_serdes_workaround(pc);
|
||||
/* TODO: ASPM */
|
||||
/* TODO: Clock Request Update */
|
||||
}
|
||||
}
|
||||
|
||||
void ssb_pcicore_init(struct ssb_pcicore *pc)
|
||||
|
@ -529,8 +538,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
|
|||
if (!ssb_device_is_enabled(dev))
|
||||
ssb_device_enable(dev, 0);
|
||||
|
||||
ssb_pcicore_fix_sprom_core_index(pc);
|
||||
|
||||
#ifdef CONFIG_SSB_PCICORE_HOSTMODE
|
||||
pc->hostmode = pcicore_is_in_hostmode(pc);
|
||||
if (pc->hostmode)
|
||||
|
@ -538,13 +545,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
|
|||
#endif /* CONFIG_SSB_PCICORE_HOSTMODE */
|
||||
if (!pc->hostmode)
|
||||
ssb_pcicore_init_clientmode(pc);
|
||||
|
||||
/* Additional PCIe always once-executed workarounds */
|
||||
if (dev->id.coreid == SSB_DEV_PCIE) {
|
||||
ssb_pcicore_serdes_workaround(pc);
|
||||
/* TODO: ASPM */
|
||||
/* TODO: Clock Request Update */
|
||||
}
|
||||
}
|
||||
|
||||
static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address)
|
||||
|
|
|
@ -393,6 +393,9 @@ int hci_conn_del(struct hci_conn *conn)
|
|||
|
||||
hci_dev_put(hdev);
|
||||
|
||||
if (conn->handle == 0)
|
||||
kfree(conn);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -464,7 +464,8 @@ static void hidp_idle_timeout(unsigned long arg)
|
|||
{
|
||||
struct hidp_session *session = (struct hidp_session *) arg;
|
||||
|
||||
kthread_stop(session->task);
|
||||
atomic_inc(&session->terminate);
|
||||
wake_up_process(session->task);
|
||||
}
|
||||
|
||||
static void hidp_set_timer(struct hidp_session *session)
|
||||
|
@ -535,7 +536,8 @@ static void hidp_process_hid_control(struct hidp_session *session,
|
|||
skb_queue_purge(&session->ctrl_transmit);
|
||||
skb_queue_purge(&session->intr_transmit);
|
||||
|
||||
kthread_stop(session->task);
|
||||
atomic_inc(&session->terminate);
|
||||
wake_up_process(current);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -706,9 +708,8 @@ static int hidp_session(void *arg)
|
|||
add_wait_queue(sk_sleep(intr_sk), &intr_wait);
|
||||
session->waiting_for_startup = 0;
|
||||
wake_up_interruptible(&session->startup_queue);
|
||||
while (!kthread_should_stop()) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
while (!atomic_read(&session->terminate)) {
|
||||
if (ctrl_sk->sk_state != BT_CONNECTED ||
|
||||
intr_sk->sk_state != BT_CONNECTED)
|
||||
break;
|
||||
|
@ -726,6 +727,7 @@ static int hidp_session(void *arg)
|
|||
hidp_process_transmit(session);
|
||||
|
||||
schedule();
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(sk_sleep(intr_sk), &intr_wait);
|
||||
|
@ -1060,7 +1062,8 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,
|
|||
err_add_device:
|
||||
hid_destroy_device(session->hid);
|
||||
session->hid = NULL;
|
||||
kthread_stop(session->task);
|
||||
atomic_inc(&session->terminate);
|
||||
wake_up_process(session->task);
|
||||
|
||||
unlink:
|
||||
hidp_del_timer(session);
|
||||
|
@ -1111,7 +1114,8 @@ int hidp_del_connection(struct hidp_conndel_req *req)
|
|||
skb_queue_purge(&session->ctrl_transmit);
|
||||
skb_queue_purge(&session->intr_transmit);
|
||||
|
||||
kthread_stop(session->task);
|
||||
atomic_inc(&session->terminate);
|
||||
wake_up_process(session->task);
|
||||
}
|
||||
} else
|
||||
err = -ENOENT;
|
||||
|
|
|
@ -142,6 +142,7 @@ struct hidp_session {
|
|||
uint ctrl_mtu;
|
||||
uint intr_mtu;
|
||||
|
||||
atomic_t terminate;
|
||||
struct task_struct *task;
|
||||
|
||||
unsigned char keys[8];
|
||||
|
|
|
@ -2323,7 +2323,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|||
|
||||
sk = chan->sk;
|
||||
|
||||
if (sk->sk_state != BT_CONFIG) {
|
||||
if ((bt_sk(sk)->defer_setup && sk->sk_state != BT_CONNECT2) ||
|
||||
(!bt_sk(sk)->defer_setup && sk->sk_state != BT_CONFIG)) {
|
||||
struct l2cap_cmd_rej rej;
|
||||
|
||||
rej.reason = cpu_to_le16(0x0002);
|
||||
|
@ -2334,7 +2335,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|||
|
||||
/* Reject if config buffer is too small. */
|
||||
len = cmd_len - sizeof(*req);
|
||||
if (chan->conf_len + len > sizeof(chan->conf_req)) {
|
||||
if (len < 0 || chan->conf_len + len > sizeof(chan->conf_req)) {
|
||||
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
|
||||
l2cap_build_conf_rsp(chan, rsp,
|
||||
L2CAP_CONF_REJECT, flags), rsp);
|
||||
|
|
|
@ -877,7 +877,8 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
|
|||
for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
|
||||
local->sched_scan_ies.ie[i] = kzalloc(2 +
|
||||
IEEE80211_MAX_SSID_LEN +
|
||||
local->scan_ies_len,
|
||||
local->scan_ies_len +
|
||||
req->ie_len,
|
||||
GFP_KERNEL);
|
||||
if (!local->sched_scan_ies.ie[i]) {
|
||||
ret = -ENOMEM;
|
||||
|
|
|
@ -86,6 +86,11 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
|
|||
struct sk_buff *skb = rx->skb;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
int queue = rx->queue;
|
||||
|
||||
/* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */
|
||||
if (rx->queue == NUM_RX_DATA_QUEUES - 1)
|
||||
queue = 0;
|
||||
|
||||
/*
|
||||
* it makes no sense to check for MIC errors on anything other
|
||||
|
@ -148,8 +153,8 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
|
|||
|
||||
update_iv:
|
||||
/* update IV in key information to be able to detect replays */
|
||||
rx->key->u.tkip.rx[rx->queue].iv32 = rx->tkip_iv32;
|
||||
rx->key->u.tkip.rx[rx->queue].iv16 = rx->tkip_iv16;
|
||||
rx->key->u.tkip.rx[queue].iv32 = rx->tkip_iv32;
|
||||
rx->key->u.tkip.rx[queue].iv16 = rx->tkip_iv16;
|
||||
|
||||
return RX_CONTINUE;
|
||||
|
||||
|
@ -241,6 +246,11 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
|
|||
struct ieee80211_key *key = rx->key;
|
||||
struct sk_buff *skb = rx->skb;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
int queue = rx->queue;
|
||||
|
||||
/* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */
|
||||
if (rx->queue == NUM_RX_DATA_QUEUES - 1)
|
||||
queue = 0;
|
||||
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
|
@ -261,7 +271,7 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
|
|||
res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm,
|
||||
key, skb->data + hdrlen,
|
||||
skb->len - hdrlen, rx->sta->sta.addr,
|
||||
hdr->addr1, hwaccel, rx->queue,
|
||||
hdr->addr1, hwaccel, queue,
|
||||
&rx->tkip_iv32,
|
||||
&rx->tkip_iv16);
|
||||
if (res != TKIP_DECRYPT_OK)
|
||||
|
|
|
@ -366,6 +366,7 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
|
|||
|
||||
mutex_init(&rdev->mtx);
|
||||
mutex_init(&rdev->devlist_mtx);
|
||||
mutex_init(&rdev->sched_scan_mtx);
|
||||
INIT_LIST_HEAD(&rdev->netdev_list);
|
||||
spin_lock_init(&rdev->bss_lock);
|
||||
INIT_LIST_HEAD(&rdev->bss_list);
|
||||
|
@ -701,6 +702,7 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
|
|||
rfkill_destroy(rdev->rfkill);
|
||||
mutex_destroy(&rdev->mtx);
|
||||
mutex_destroy(&rdev->devlist_mtx);
|
||||
mutex_destroy(&rdev->sched_scan_mtx);
|
||||
list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
|
||||
cfg80211_put_bss(&scan->pub);
|
||||
cfg80211_rdev_free_wowlan(rdev);
|
||||
|
@ -737,12 +739,16 @@ static void wdev_cleanup_work(struct work_struct *work)
|
|||
___cfg80211_scan_done(rdev, true);
|
||||
}
|
||||
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
|
||||
if (WARN_ON(rdev->sched_scan_req &&
|
||||
rdev->sched_scan_req->dev == wdev->netdev)) {
|
||||
__cfg80211_stop_sched_scan(rdev, false);
|
||||
}
|
||||
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
|
||||
mutex_lock(&rdev->devlist_mtx);
|
||||
rdev->opencount--;
|
||||
|
@ -830,9 +836,9 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
|
|||
break;
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_STATION:
|
||||
cfg80211_lock_rdev(rdev);
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
__cfg80211_stop_sched_scan(rdev, false);
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
|
||||
wdev_lock(wdev);
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
|
|
|
@ -65,6 +65,8 @@ struct cfg80211_registered_device {
|
|||
struct work_struct scan_done_wk;
|
||||
struct work_struct sched_scan_results_wk;
|
||||
|
||||
struct mutex sched_scan_mtx;
|
||||
|
||||
#ifdef CONFIG_NL80211_TESTMODE
|
||||
struct genl_info *testmode_info;
|
||||
#endif
|
||||
|
|
|
@ -3461,9 +3461,6 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
||||
return -EINVAL;
|
||||
|
||||
if (rdev->sched_scan_req)
|
||||
return -EINPROGRESS;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -3502,12 +3499,21 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
if (ie_len > wiphy->max_scan_ie_len)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
|
||||
if (rdev->sched_scan_req) {
|
||||
err = -EINPROGRESS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
request = kzalloc(sizeof(*request)
|
||||
+ sizeof(*request->ssids) * n_ssids
|
||||
+ sizeof(*request->channels) * n_channels
|
||||
+ ie_len, GFP_KERNEL);
|
||||
if (!request)
|
||||
return -ENOMEM;
|
||||
if (!request) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (n_ssids)
|
||||
request->ssids = (void *)&request->channels[n_channels];
|
||||
|
@ -3605,6 +3611,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
out_free:
|
||||
kfree(request);
|
||||
out:
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -3612,12 +3619,17 @@ static int nl80211_stop_sched_scan(struct sk_buff *skb,
|
|||
struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
int err;
|
||||
|
||||
if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
|
||||
!rdev->ops->sched_scan_stop)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return __cfg80211_stop_sched_scan(rdev, false);
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
err = __cfg80211_stop_sched_scan(rdev, false);
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
||||
|
|
|
@ -100,14 +100,14 @@ void __cfg80211_sched_scan_results(struct work_struct *wk)
|
|||
rdev = container_of(wk, struct cfg80211_registered_device,
|
||||
sched_scan_results_wk);
|
||||
|
||||
cfg80211_lock_rdev(rdev);
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
|
||||
/* we don't have sched_scan_req anymore if the scan is stopping */
|
||||
if (rdev->sched_scan_req)
|
||||
nl80211_send_sched_scan_results(rdev,
|
||||
rdev->sched_scan_req->dev);
|
||||
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
}
|
||||
|
||||
void cfg80211_sched_scan_results(struct wiphy *wiphy)
|
||||
|
@ -123,9 +123,9 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
|
|||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||
|
||||
cfg80211_lock_rdev(rdev);
|
||||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
__cfg80211_stop_sched_scan(rdev, true);
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
mutex_unlock(&rdev->sched_scan_mtx);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
|
||||
|
||||
|
@ -135,7 +135,7 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
|
|||
int err;
|
||||
struct net_device *dev;
|
||||
|
||||
ASSERT_RDEV_LOCK(rdev);
|
||||
lockdep_assert_held(&rdev->sched_scan_mtx);
|
||||
|
||||
if (!rdev->sched_scan_req)
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue