diff options
| -rw-r--r-- | drivers/bluetooth/btusb.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/rc.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 8 | ||||
| -rw-r--r-- | include/net/bluetooth/bluetooth.h | 2 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_core.h | 6 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 12 | ||||
| -rw-r--r-- | net/bluetooth/af_bluetooth.c | 12 | ||||
| -rw-r--r-- | net/bluetooth/hci_conn.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/hci_core.c | 3 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 24 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_sock.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 18 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 2 | ||||
| -rw-r--r-- | net/mac80211/debugfs_sta.c | 4 | ||||
| -rw-r--r-- | net/mac80211/rate.c | 2 | ||||
| -rw-r--r-- | net/mac80211/rate.h | 3 | ||||
| -rw-r--r-- | net/mac80211/sta_info.h | 2 |
17 files changed, 69 insertions, 43 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index f00f596c1029..789c9b579aea 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = { | |||
| 102 | 102 | ||
| 103 | /* Broadcom BCM20702A0 */ | 103 | /* Broadcom BCM20702A0 */ |
| 104 | { USB_DEVICE(0x0a5c, 0x21e3) }, | 104 | { USB_DEVICE(0x0a5c, 0x21e3) }, |
| 105 | { USB_DEVICE(0x0a5c, 0x21f3) }, | ||
| 105 | { USB_DEVICE(0x413c, 0x8197) }, | 106 | { USB_DEVICE(0x413c, 0x8197) }, |
| 106 | 107 | ||
| 107 | { } /* Terminating entry */ | 108 | { } /* Terminating entry */ |
| @@ -726,9 +727,6 @@ static int btusb_send_frame(struct sk_buff *skb) | |||
| 726 | usb_fill_bulk_urb(urb, data->udev, pipe, | 727 | usb_fill_bulk_urb(urb, data->udev, pipe, |
| 727 | skb->data, skb->len, btusb_tx_complete, skb); | 728 | skb->data, skb->len, btusb_tx_complete, skb); |
| 728 | 729 | ||
| 729 | if (skb->priority >= HCI_PRIO_MAX - 1) | ||
| 730 | urb->transfer_flags = URB_ISO_ASAP; | ||
| 731 | |||
| 732 | hdev->stat.acl_tx++; | 730 | hdev->stat.acl_tx++; |
| 733 | break; | 731 | break; |
| 734 | 732 | ||
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 635b592ad961..a427a16bb739 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
| @@ -1346,7 +1346,7 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband, | |||
| 1346 | fc = hdr->frame_control; | 1346 | fc = hdr->frame_control; |
| 1347 | for (i = 0; i < sc->hw->max_rates; i++) { | 1347 | for (i = 0; i < sc->hw->max_rates; i++) { |
| 1348 | struct ieee80211_tx_rate *rate = &tx_info->status.rates[i]; | 1348 | struct ieee80211_tx_rate *rate = &tx_info->status.rates[i]; |
| 1349 | if (!rate->count) | 1349 | if (rate->idx < 0 || !rate->count) |
| 1350 | break; | 1350 | break; |
| 1351 | 1351 | ||
| 1352 | final_ts_idx = i; | 1352 | final_ts_idx = i; |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index c3b6c4652cd6..5b2972b43b0e 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -841,7 +841,12 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | |||
| 841 | ret = mwifiex_set_rf_channel(priv, channel, | 841 | ret = mwifiex_set_rf_channel(priv, channel, |
| 842 | priv->adapter->channel_type); | 842 | priv->adapter->channel_type); |
| 843 | 843 | ||
| 844 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); /* Disable keys */ | 844 | /* As this is new association, clear locally stored |
| 845 | * keys and security related flags */ | ||
| 846 | priv->sec_info.wpa_enabled = false; | ||
| 847 | priv->sec_info.wpa2_enabled = false; | ||
| 848 | priv->wep_key_curr_index = 0; | ||
| 849 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); | ||
| 845 | 850 | ||
| 846 | if (mode == NL80211_IFTYPE_ADHOC) { | 851 | if (mode == NL80211_IFTYPE_ADHOC) { |
| 847 | /* "privacy" is set only for ad-hoc mode */ | 852 | /* "privacy" is set only for ad-hoc mode */ |
| @@ -886,6 +891,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | |||
| 886 | dev_dbg(priv->adapter->dev, | 891 | dev_dbg(priv->adapter->dev, |
| 887 | "info: setting wep encryption" | 892 | "info: setting wep encryption" |
| 888 | " with key len %d\n", sme->key_len); | 893 | " with key len %d\n", sme->key_len); |
| 894 | priv->wep_key_curr_index = sme->key_idx; | ||
| 889 | ret = mwifiex_set_encode(priv, sme->key, sme->key_len, | 895 | ret = mwifiex_set_encode(priv, sme->key, sme->key_len, |
| 890 | sme->key_idx, 0); | 896 | sme->key_idx, 0); |
| 891 | } | 897 | } |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index abaad6ed9b83..4a82ca0bb0b2 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
| @@ -256,4 +256,6 @@ void l2cap_exit(void); | |||
| 256 | int sco_init(void); | 256 | int sco_init(void); |
| 257 | void sco_exit(void); | 257 | void sco_exit(void); |
| 258 | 258 | ||
| 259 | void bt_sock_reclassify_lock(struct sock *sk, int proto); | ||
| 260 | |||
| 259 | #endif /* __BLUETOOTH_H */ | 261 | #endif /* __BLUETOOTH_H */ |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index ea9231f4935f..453893b3120e 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -540,7 +540,7 @@ void hci_conn_put_device(struct hci_conn *conn); | |||
| 540 | static inline void hci_conn_hold(struct hci_conn *conn) | 540 | static inline void hci_conn_hold(struct hci_conn *conn) |
| 541 | { | 541 | { |
| 542 | atomic_inc(&conn->refcnt); | 542 | atomic_inc(&conn->refcnt); |
| 543 | cancel_delayed_work_sync(&conn->disc_work); | 543 | cancel_delayed_work(&conn->disc_work); |
| 544 | } | 544 | } |
| 545 | 545 | ||
| 546 | static inline void hci_conn_put(struct hci_conn *conn) | 546 | static inline void hci_conn_put(struct hci_conn *conn) |
| @@ -559,9 +559,9 @@ static inline void hci_conn_put(struct hci_conn *conn) | |||
| 559 | } else { | 559 | } else { |
| 560 | timeo = msecs_to_jiffies(10); | 560 | timeo = msecs_to_jiffies(10); |
| 561 | } | 561 | } |
| 562 | cancel_delayed_work_sync(&conn->disc_work); | 562 | cancel_delayed_work(&conn->disc_work); |
| 563 | queue_delayed_work(conn->hdev->workqueue, | 563 | queue_delayed_work(conn->hdev->workqueue, |
| 564 | &conn->disc_work, jiffies + timeo); | 564 | &conn->disc_work, timeo); |
| 565 | } | 565 | } |
| 566 | } | 566 | } |
| 567 | 567 | ||
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 68f589150692..b1664ed884e6 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
| @@ -611,7 +611,7 @@ static inline void l2cap_set_timer(struct l2cap_chan *chan, | |||
| 611 | { | 611 | { |
| 612 | BT_DBG("chan %p state %d timeout %ld", chan, chan->state, timeout); | 612 | BT_DBG("chan %p state %d timeout %ld", chan, chan->state, timeout); |
| 613 | 613 | ||
| 614 | if (!__cancel_delayed_work(work)) | 614 | if (!cancel_delayed_work(work)) |
| 615 | l2cap_chan_hold(chan); | 615 | l2cap_chan_hold(chan); |
| 616 | schedule_delayed_work(work, timeout); | 616 | schedule_delayed_work(work, timeout); |
| 617 | } | 617 | } |
| @@ -619,20 +619,20 @@ static inline void l2cap_set_timer(struct l2cap_chan *chan, | |||
| 619 | static inline void l2cap_clear_timer(struct l2cap_chan *chan, | 619 | static inline void l2cap_clear_timer(struct l2cap_chan *chan, |
| 620 | struct delayed_work *work) | 620 | struct delayed_work *work) |
| 621 | { | 621 | { |
| 622 | if (__cancel_delayed_work(work)) | 622 | if (cancel_delayed_work(work)) |
| 623 | l2cap_chan_put(chan); | 623 | l2cap_chan_put(chan); |
| 624 | } | 624 | } |
| 625 | 625 | ||
| 626 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) | 626 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) |
| 627 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) | 627 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) |
| 628 | #define __set_retrans_timer(c) l2cap_set_timer(c, &c->retrans_timer, \ | 628 | #define __set_retrans_timer(c) l2cap_set_timer(c, &c->retrans_timer, \ |
| 629 | L2CAP_DEFAULT_RETRANS_TO); | 629 | msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO)); |
| 630 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) | 630 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) |
| 631 | #define __set_monitor_timer(c) l2cap_set_timer(c, &c->monitor_timer, \ | 631 | #define __set_monitor_timer(c) l2cap_set_timer(c, &c->monitor_timer, \ |
| 632 | L2CAP_DEFAULT_MONITOR_TO); | 632 | msecs_to_jiffies(L2CAP_DEFAULT_MONITOR_TO)); |
| 633 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) | 633 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) |
| 634 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ | 634 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ |
| 635 | L2CAP_DEFAULT_ACK_TO); | 635 | msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); |
| 636 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) | 636 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) |
| 637 | 637 | ||
| 638 | static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) | 638 | static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) |
| @@ -834,7 +834,7 @@ int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); | |||
| 834 | struct l2cap_chan *l2cap_chan_create(struct sock *sk); | 834 | struct l2cap_chan *l2cap_chan_create(struct sock *sk); |
| 835 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); | 835 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); |
| 836 | void l2cap_chan_destroy(struct l2cap_chan *chan); | 836 | void l2cap_chan_destroy(struct l2cap_chan *chan); |
| 837 | inline int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, | 837 | int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, |
| 838 | bdaddr_t *dst); | 838 | bdaddr_t *dst); |
| 839 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, | 839 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, |
| 840 | u32 priority); | 840 | u32 priority); |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index ef92864ac625..72eb187a5f60 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
| @@ -71,19 +71,16 @@ static const char *const bt_slock_key_strings[BT_MAX_PROTO] = { | |||
| 71 | "slock-AF_BLUETOOTH-BTPROTO_AVDTP", | 71 | "slock-AF_BLUETOOTH-BTPROTO_AVDTP", |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | static inline void bt_sock_reclassify_lock(struct socket *sock, int proto) | 74 | void bt_sock_reclassify_lock(struct sock *sk, int proto) |
| 75 | { | 75 | { |
| 76 | struct sock *sk = sock->sk; | 76 | BUG_ON(!sk); |
| 77 | |||
| 78 | if (!sk) | ||
| 79 | return; | ||
| 80 | |||
| 81 | BUG_ON(sock_owned_by_user(sk)); | 77 | BUG_ON(sock_owned_by_user(sk)); |
| 82 | 78 | ||
| 83 | sock_lock_init_class_and_name(sk, | 79 | sock_lock_init_class_and_name(sk, |
| 84 | bt_slock_key_strings[proto], &bt_slock_key[proto], | 80 | bt_slock_key_strings[proto], &bt_slock_key[proto], |
| 85 | bt_key_strings[proto], &bt_lock_key[proto]); | 81 | bt_key_strings[proto], &bt_lock_key[proto]); |
| 86 | } | 82 | } |
| 83 | EXPORT_SYMBOL(bt_sock_reclassify_lock); | ||
| 87 | 84 | ||
| 88 | int bt_sock_register(int proto, const struct net_proto_family *ops) | 85 | int bt_sock_register(int proto, const struct net_proto_family *ops) |
| 89 | { | 86 | { |
| @@ -145,7 +142,8 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto, | |||
| 145 | 142 | ||
| 146 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { | 143 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { |
| 147 | err = bt_proto[proto]->create(net, sock, proto, kern); | 144 | err = bt_proto[proto]->create(net, sock, proto, kern); |
| 148 | bt_sock_reclassify_lock(sock, proto); | 145 | if (!err) |
| 146 | bt_sock_reclassify_lock(sock->sk, proto); | ||
| 149 | module_put(bt_proto[proto]->owner); | 147 | module_put(bt_proto[proto]->owner); |
| 150 | } | 148 | } |
| 151 | 149 | ||
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 3db432473ad5..07bc69ed9498 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -635,6 +635,10 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
| 635 | 635 | ||
| 636 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | 636 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { |
| 637 | struct hci_cp_auth_requested cp; | 637 | struct hci_cp_auth_requested cp; |
| 638 | |||
| 639 | /* encrypt must be pending if auth is also pending */ | ||
| 640 | set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); | ||
| 641 | |||
| 638 | cp.handle = cpu_to_le16(conn->handle); | 642 | cp.handle = cpu_to_le16(conn->handle); |
| 639 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, | 643 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, |
| 640 | sizeof(cp), &cp); | 644 | sizeof(cp), &cp); |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 9de93714213a..5aeb62491198 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
| @@ -640,7 +640,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
| 640 | /* Reset device */ | 640 | /* Reset device */ |
| 641 | skb_queue_purge(&hdev->cmd_q); | 641 | skb_queue_purge(&hdev->cmd_q); |
| 642 | atomic_set(&hdev->cmd_cnt, 1); | 642 | atomic_set(&hdev->cmd_cnt, 1); |
| 643 | if (!test_bit(HCI_RAW, &hdev->flags)) { | 643 | if (!test_bit(HCI_RAW, &hdev->flags) && |
| 644 | test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks)) { | ||
| 644 | set_bit(HCI_INIT, &hdev->flags); | 645 | set_bit(HCI_INIT, &hdev->flags); |
| 645 | __hci_request(hdev, hci_reset_req, 0, | 646 | __hci_request(hdev, hci_reset_req, 0, |
| 646 | msecs_to_jiffies(250)); | 647 | msecs_to_jiffies(250)); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index faf0b11ac1d3..32d338c30e65 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
| @@ -1018,10 +1018,10 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err) | |||
| 1018 | hci_chan_del(conn->hchan); | 1018 | hci_chan_del(conn->hchan); |
| 1019 | 1019 | ||
| 1020 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) | 1020 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) |
| 1021 | __cancel_delayed_work(&conn->info_timer); | 1021 | cancel_delayed_work_sync(&conn->info_timer); |
| 1022 | 1022 | ||
| 1023 | if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->pend)) { | 1023 | if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->pend)) { |
| 1024 | __cancel_delayed_work(&conn->security_timer); | 1024 | cancel_delayed_work_sync(&conn->security_timer); |
| 1025 | smp_chan_destroy(conn); | 1025 | smp_chan_destroy(conn); |
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| @@ -1120,7 +1120,7 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr | |||
| 1120 | return c1; | 1120 | return c1; |
| 1121 | } | 1121 | } |
| 1122 | 1122 | ||
| 1123 | inline int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *dst) | 1123 | int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *dst) |
| 1124 | { | 1124 | { |
| 1125 | struct sock *sk = chan->sk; | 1125 | struct sock *sk = chan->sk; |
| 1126 | bdaddr_t *src = &bt_sk(sk)->src; | 1126 | bdaddr_t *src = &bt_sk(sk)->src; |
| @@ -2574,7 +2574,7 @@ static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
| 2574 | 2574 | ||
| 2575 | if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && | 2575 | if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && |
| 2576 | cmd->ident == conn->info_ident) { | 2576 | cmd->ident == conn->info_ident) { |
| 2577 | __cancel_delayed_work(&conn->info_timer); | 2577 | cancel_delayed_work(&conn->info_timer); |
| 2578 | 2578 | ||
| 2579 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; | 2579 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; |
| 2580 | conn->info_ident = 0; | 2580 | conn->info_ident = 0; |
| @@ -2970,7 +2970,8 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
| 2970 | 2970 | ||
| 2971 | default: | 2971 | default: |
| 2972 | sk->sk_err = ECONNRESET; | 2972 | sk->sk_err = ECONNRESET; |
| 2973 | __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); | 2973 | __set_chan_timer(chan, |
| 2974 | msecs_to_jiffies(L2CAP_DISC_REJ_TIMEOUT)); | ||
| 2974 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 2975 | l2cap_send_disconn_req(conn, chan, ECONNRESET); |
| 2975 | goto done; | 2976 | goto done; |
| 2976 | } | 2977 | } |
| @@ -3120,7 +3121,7 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm | |||
| 3120 | conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) | 3121 | conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) |
| 3121 | return 0; | 3122 | return 0; |
| 3122 | 3123 | ||
| 3123 | __cancel_delayed_work(&conn->info_timer); | 3124 | cancel_delayed_work(&conn->info_timer); |
| 3124 | 3125 | ||
| 3125 | if (result != L2CAP_IR_SUCCESS) { | 3126 | if (result != L2CAP_IR_SUCCESS) { |
| 3126 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; | 3127 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; |
| @@ -4478,7 +4479,8 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) | |||
| 4478 | if (encrypt == 0x00) { | 4479 | if (encrypt == 0x00) { |
| 4479 | if (chan->sec_level == BT_SECURITY_MEDIUM) { | 4480 | if (chan->sec_level == BT_SECURITY_MEDIUM) { |
| 4480 | __clear_chan_timer(chan); | 4481 | __clear_chan_timer(chan); |
| 4481 | __set_chan_timer(chan, L2CAP_ENC_TIMEOUT); | 4482 | __set_chan_timer(chan, |
| 4483 | msecs_to_jiffies(L2CAP_ENC_TIMEOUT)); | ||
| 4482 | } else if (chan->sec_level == BT_SECURITY_HIGH) | 4484 | } else if (chan->sec_level == BT_SECURITY_HIGH) |
| 4483 | l2cap_chan_close(chan, ECONNREFUSED); | 4485 | l2cap_chan_close(chan, ECONNREFUSED); |
| 4484 | } else { | 4486 | } else { |
| @@ -4499,7 +4501,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
| 4499 | 4501 | ||
| 4500 | if (hcon->type == LE_LINK) { | 4502 | if (hcon->type == LE_LINK) { |
| 4501 | smp_distribute_keys(conn, 0); | 4503 | smp_distribute_keys(conn, 0); |
| 4502 | __cancel_delayed_work(&conn->security_timer); | 4504 | cancel_delayed_work(&conn->security_timer); |
| 4503 | } | 4505 | } |
| 4504 | 4506 | ||
| 4505 | rcu_read_lock(); | 4507 | rcu_read_lock(); |
| @@ -4546,7 +4548,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
| 4546 | L2CAP_CONN_REQ, sizeof(req), &req); | 4548 | L2CAP_CONN_REQ, sizeof(req), &req); |
| 4547 | } else { | 4549 | } else { |
| 4548 | __clear_chan_timer(chan); | 4550 | __clear_chan_timer(chan); |
| 4549 | __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); | 4551 | __set_chan_timer(chan, |
| 4552 | msecs_to_jiffies(L2CAP_DISC_TIMEOUT)); | ||
| 4550 | } | 4553 | } |
| 4551 | } else if (chan->state == BT_CONNECT2) { | 4554 | } else if (chan->state == BT_CONNECT2) { |
| 4552 | struct l2cap_conn_rsp rsp; | 4555 | struct l2cap_conn_rsp rsp; |
| @@ -4566,7 +4569,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
| 4566 | } | 4569 | } |
| 4567 | } else { | 4570 | } else { |
| 4568 | l2cap_state_change(chan, BT_DISCONN); | 4571 | l2cap_state_change(chan, BT_DISCONN); |
| 4569 | __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); | 4572 | __set_chan_timer(chan, |
| 4573 | msecs_to_jiffies(L2CAP_DISC_TIMEOUT)); | ||
| 4570 | res = L2CAP_CR_SEC_BLOCK; | 4574 | res = L2CAP_CR_SEC_BLOCK; |
| 4571 | stat = L2CAP_CS_NO_INFO; | 4575 | stat = L2CAP_CS_NO_INFO; |
| 4572 | } | 4576 | } |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index c61d967012b2..401d9428ae4c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
| @@ -849,6 +849,8 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data) | |||
| 849 | if (!sk) | 849 | if (!sk) |
| 850 | return NULL; | 850 | return NULL; |
| 851 | 851 | ||
| 852 | bt_sock_reclassify_lock(sk, BTPROTO_L2CAP); | ||
| 853 | |||
| 852 | l2cap_sock_init(sk, parent); | 854 | l2cap_sock_init(sk, parent); |
| 853 | 855 | ||
| 854 | return l2cap_pi(sk)->chan; | 856 | return l2cap_pi(sk)->chan; |
| @@ -1002,7 +1004,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p | |||
| 1002 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); | 1004 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); |
| 1003 | 1005 | ||
| 1004 | sk->sk_destruct = l2cap_sock_destruct; | 1006 | sk->sk_destruct = l2cap_sock_destruct; |
| 1005 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; | 1007 | sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT); |
| 1006 | 1008 | ||
| 1007 | sock_reset_flag(sk, SOCK_ZAPPED); | 1009 | sock_reset_flag(sk, SOCK_ZAPPED); |
| 1008 | 1010 | ||
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 501649bf5596..8a602388f1e7 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -1164,12 +1164,18 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci) | |||
| 1164 | break; | 1164 | break; |
| 1165 | 1165 | ||
| 1166 | case BT_DISCONN: | 1166 | case BT_DISCONN: |
| 1167 | /* When socket is closed and we are not RFCOMM | 1167 | /* rfcomm_session_put is called later so don't do |
| 1168 | * initiator rfcomm_process_rx already calls | 1168 | * anything here otherwise we will mess up the session |
| 1169 | * rfcomm_session_put() */ | 1169 | * reference counter: |
| 1170 | if (s->sock->sk->sk_state != BT_CLOSED) | 1170 | * |
| 1171 | if (list_empty(&s->dlcs)) | 1171 | * (a) when we are the initiator dlc_unlink will drive |
| 1172 | rfcomm_session_put(s); | 1172 | * the reference counter to 0 (there is no initial put |
| 1173 | * after session_add) | ||
| 1174 | * | ||
| 1175 | * (b) when we are not the initiator rfcomm_rx_process | ||
| 1176 | * will explicitly call put to balance the initial hold | ||
| 1177 | * done after session add. | ||
| 1178 | */ | ||
| 1173 | break; | 1179 | break; |
| 1174 | } | 1180 | } |
| 1175 | } | 1181 | } |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index f066678faeee..22169c3f1482 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
| @@ -956,6 +956,8 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc * | |||
| 956 | if (!sk) | 956 | if (!sk) |
| 957 | goto done; | 957 | goto done; |
| 958 | 958 | ||
| 959 | bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM); | ||
| 960 | |||
| 959 | rfcomm_sock_init(sk, parent); | 961 | rfcomm_sock_init(sk, parent); |
| 960 | bacpy(&bt_sk(sk)->src, &src); | 962 | bacpy(&bt_sk(sk)->src, &src); |
| 961 | bacpy(&bt_sk(sk)->dst, &dst); | 963 | bacpy(&bt_sk(sk)->dst, &dst); |
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 2406b3e7393f..d86217d56bd7 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
| @@ -63,14 +63,14 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf, | |||
| 63 | test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : "" | 63 | test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : "" |
| 64 | 64 | ||
| 65 | int res = scnprintf(buf, sizeof(buf), | 65 | int res = scnprintf(buf, sizeof(buf), |
| 66 | "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", | 66 | "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", |
| 67 | TEST(AUTH), TEST(ASSOC), TEST(PS_STA), | 67 | TEST(AUTH), TEST(ASSOC), TEST(PS_STA), |
| 68 | TEST(PS_DRIVER), TEST(AUTHORIZED), | 68 | TEST(PS_DRIVER), TEST(AUTHORIZED), |
| 69 | TEST(SHORT_PREAMBLE), | 69 | TEST(SHORT_PREAMBLE), |
| 70 | TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT), | 70 | TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT), |
| 71 | TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL), | 71 | TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL), |
| 72 | TEST(UAPSD), TEST(SP), TEST(TDLS_PEER), | 72 | TEST(UAPSD), TEST(SP), TEST(TDLS_PEER), |
| 73 | TEST(TDLS_PEER_AUTH)); | 73 | TEST(TDLS_PEER_AUTH), TEST(RATE_CONTROL)); |
| 74 | #undef TEST | 74 | #undef TEST |
| 75 | return simple_read_from_buffer(userbuf, count, ppos, buf, res); | 75 | return simple_read_from_buffer(userbuf, count, ppos, buf, res); |
| 76 | } | 76 | } |
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index 5a5a7767d541..ad64f4d5271a 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
| @@ -336,7 +336,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, | |||
| 336 | int i; | 336 | int i; |
| 337 | u32 mask; | 337 | u32 mask; |
| 338 | 338 | ||
| 339 | if (sta) { | 339 | if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) { |
| 340 | ista = &sta->sta; | 340 | ista = &sta->sta; |
| 341 | priv_sta = sta->rate_ctrl_priv; | 341 | priv_sta = sta->rate_ctrl_priv; |
| 342 | } | 342 | } |
diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h index 168427b0ffdc..80cfc006dd74 100644 --- a/net/mac80211/rate.h +++ b/net/mac80211/rate.h | |||
| @@ -41,7 +41,7 @@ static inline void rate_control_tx_status(struct ieee80211_local *local, | |||
| 41 | struct ieee80211_sta *ista = &sta->sta; | 41 | struct ieee80211_sta *ista = &sta->sta; |
| 42 | void *priv_sta = sta->rate_ctrl_priv; | 42 | void *priv_sta = sta->rate_ctrl_priv; |
| 43 | 43 | ||
| 44 | if (!ref) | 44 | if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) |
| 45 | return; | 45 | return; |
| 46 | 46 | ||
| 47 | ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb); | 47 | ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb); |
| @@ -62,6 +62,7 @@ static inline void rate_control_rate_init(struct sta_info *sta) | |||
| 62 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 62 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; |
| 63 | 63 | ||
| 64 | ref->ops->rate_init(ref->priv, sband, ista, priv_sta); | 64 | ref->ops->rate_init(ref->priv, sband, ista, priv_sta); |
| 65 | set_sta_flag(sta, WLAN_STA_RATE_CONTROL); | ||
| 65 | } | 66 | } |
| 66 | 67 | ||
| 67 | static inline void rate_control_rate_update(struct ieee80211_local *local, | 68 | static inline void rate_control_rate_update(struct ieee80211_local *local, |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 6f77f12dc3fc..bfed851d0d36 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | * @WLAN_STA_SP: Station is in a service period, so don't try to | 52 | * @WLAN_STA_SP: Station is in a service period, so don't try to |
| 53 | * reply to other uAPSD trigger frames or PS-Poll. | 53 | * reply to other uAPSD trigger frames or PS-Poll. |
| 54 | * @WLAN_STA_4ADDR_EVENT: 4-addr event was already sent for this frame. | 54 | * @WLAN_STA_4ADDR_EVENT: 4-addr event was already sent for this frame. |
| 55 | * @WLAN_STA_RATE_CONTROL: rate control was initialized for this station. | ||
| 55 | */ | 56 | */ |
| 56 | enum ieee80211_sta_info_flags { | 57 | enum ieee80211_sta_info_flags { |
| 57 | WLAN_STA_AUTH, | 58 | WLAN_STA_AUTH, |
| @@ -71,6 +72,7 @@ enum ieee80211_sta_info_flags { | |||
| 71 | WLAN_STA_UAPSD, | 72 | WLAN_STA_UAPSD, |
| 72 | WLAN_STA_SP, | 73 | WLAN_STA_SP, |
| 73 | WLAN_STA_4ADDR_EVENT, | 74 | WLAN_STA_4ADDR_EVENT, |
| 75 | WLAN_STA_RATE_CONTROL, | ||
| 74 | }; | 76 | }; |
| 75 | 77 | ||
| 76 | enum ieee80211_sta_state { | 78 | enum ieee80211_sta_state { |
