diff options
-rw-r--r-- | drivers/net/wireless/rtlwifi/pci.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/usb.c | 10 | ||||
-rw-r--r-- | include/net/bluetooth/bluetooth.h | 1 | ||||
-rw-r--r-- | net/bluetooth/af_bluetooth.c | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_core.c | 8 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 11 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 5 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 12 |
8 files changed, 45 insertions, 20 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index cc15fdb36060..67f9430ee197 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -1851,14 +1851,6 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
1851 | /*like read eeprom and so on */ | 1851 | /*like read eeprom and so on */ |
1852 | rtlpriv->cfg->ops->read_eeprom_info(hw); | 1852 | rtlpriv->cfg->ops->read_eeprom_info(hw); |
1853 | 1853 | ||
1854 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
1855 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
1856 | err = -ENODEV; | ||
1857 | goto fail3; | ||
1858 | } | ||
1859 | |||
1860 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
1861 | |||
1862 | /*aspm */ | 1854 | /*aspm */ |
1863 | rtl_pci_init_aspm(hw); | 1855 | rtl_pci_init_aspm(hw); |
1864 | 1856 | ||
@@ -1877,6 +1869,14 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
1877 | goto fail3; | 1869 | goto fail3; |
1878 | } | 1870 | } |
1879 | 1871 | ||
1872 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
1873 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
1874 | err = -ENODEV; | ||
1875 | goto fail3; | ||
1876 | } | ||
1877 | |||
1878 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
1879 | |||
1880 | err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); | 1880 | err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); |
1881 | if (err) { | 1881 | if (err) { |
1882 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 1882 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index d04dbda13f5a..a6049d7d51b3 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -971,11 +971,6 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | |||
971 | rtlpriv->cfg->ops->read_chip_version(hw); | 971 | rtlpriv->cfg->ops->read_chip_version(hw); |
972 | /*like read eeprom and so on */ | 972 | /*like read eeprom and so on */ |
973 | rtlpriv->cfg->ops->read_eeprom_info(hw); | 973 | rtlpriv->cfg->ops->read_eeprom_info(hw); |
974 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
975 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
976 | goto error_out; | ||
977 | } | ||
978 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
979 | err = _rtl_usb_init(hw); | 974 | err = _rtl_usb_init(hw); |
980 | if (err) | 975 | if (err) |
981 | goto error_out; | 976 | goto error_out; |
@@ -987,6 +982,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | |||
987 | "Can't allocate sw for mac80211\n"); | 982 | "Can't allocate sw for mac80211\n"); |
988 | goto error_out; | 983 | goto error_out; |
989 | } | 984 | } |
985 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
986 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
987 | goto error_out; | ||
988 | } | ||
989 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
990 | 990 | ||
991 | return 0; | 991 | return 0; |
992 | error_out: | 992 | error_out: |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 262ebd1747d4..a65910bda381 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -191,6 +191,7 @@ struct bt_sock { | |||
191 | struct list_head accept_q; | 191 | struct list_head accept_q; |
192 | struct sock *parent; | 192 | struct sock *parent; |
193 | u32 defer_setup; | 193 | u32 defer_setup; |
194 | bool suspended; | ||
194 | }; | 195 | }; |
195 | 196 | ||
196 | struct bt_sock_list { | 197 | struct bt_sock_list { |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 72eb187a5f60..6fb68a9743af 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -450,7 +450,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wa | |||
450 | sk->sk_state == BT_CONFIG) | 450 | sk->sk_state == BT_CONFIG) |
451 | return mask; | 451 | return mask; |
452 | 452 | ||
453 | if (sock_writeable(sk)) | 453 | if (!bt_sk(sk)->suspended && sock_writeable(sk)) |
454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
455 | else | 455 | else |
456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index edfd61addcec..d6dc44cd15b0 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -2784,6 +2784,14 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
2784 | if (conn) { | 2784 | if (conn) { |
2785 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); | 2785 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); |
2786 | 2786 | ||
2787 | hci_dev_lock(hdev); | ||
2788 | if (test_bit(HCI_MGMT, &hdev->dev_flags) && | ||
2789 | !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) | ||
2790 | mgmt_device_connected(hdev, &conn->dst, conn->type, | ||
2791 | conn->dst_type, 0, NULL, 0, | ||
2792 | conn->dev_class); | ||
2793 | hci_dev_unlock(hdev); | ||
2794 | |||
2787 | /* Send to upper protocol */ | 2795 | /* Send to upper protocol */ |
2788 | l2cap_recv_acldata(conn, skb, flags); | 2796 | l2cap_recv_acldata(conn, skb, flags); |
2789 | return; | 2797 | return; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6c065254afc0..1266f78fa8e3 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -2039,6 +2039,12 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * | |||
2039 | 2039 | ||
2040 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); | 2040 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); |
2041 | 2041 | ||
2042 | if (ev->status && conn->state == BT_CONNECTED) { | ||
2043 | hci_acl_disconn(conn, 0x13); | ||
2044 | hci_conn_put(conn); | ||
2045 | goto unlock; | ||
2046 | } | ||
2047 | |||
2042 | if (conn->state == BT_CONFIG) { | 2048 | if (conn->state == BT_CONFIG) { |
2043 | if (!ev->status) | 2049 | if (!ev->status) |
2044 | conn->state = BT_CONNECTED; | 2050 | conn->state = BT_CONNECTED; |
@@ -2049,6 +2055,7 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * | |||
2049 | hci_encrypt_cfm(conn, ev->status, ev->encrypt); | 2055 | hci_encrypt_cfm(conn, ev->status, ev->encrypt); |
2050 | } | 2056 | } |
2051 | 2057 | ||
2058 | unlock: | ||
2052 | hci_dev_unlock(hdev); | 2059 | hci_dev_unlock(hdev); |
2053 | } | 2060 | } |
2054 | 2061 | ||
@@ -2102,7 +2109,7 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff | |||
2102 | goto unlock; | 2109 | goto unlock; |
2103 | } | 2110 | } |
2104 | 2111 | ||
2105 | if (!ev->status) { | 2112 | if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) { |
2106 | struct hci_cp_remote_name_req cp; | 2113 | struct hci_cp_remote_name_req cp; |
2107 | memset(&cp, 0, sizeof(cp)); | 2114 | memset(&cp, 0, sizeof(cp)); |
2108 | bacpy(&cp.bdaddr, &conn->dst); | 2115 | bacpy(&cp.bdaddr, &conn->dst); |
@@ -2871,7 +2878,7 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b | |||
2871 | if (conn->state != BT_CONFIG) | 2878 | if (conn->state != BT_CONFIG) |
2872 | goto unlock; | 2879 | goto unlock; |
2873 | 2880 | ||
2874 | if (!ev->status) { | 2881 | if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) { |
2875 | struct hci_cp_remote_name_req cp; | 2882 | struct hci_cp_remote_name_req cp; |
2876 | memset(&cp, 0, sizeof(cp)); | 2883 | memset(&cp, 0, sizeof(cp)); |
2877 | bacpy(&cp.bdaddr, &conn->dst); | 2884 | bacpy(&cp.bdaddr, &conn->dst); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 94552b33d528..6f9c25b633a6 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -4589,6 +4589,11 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
4589 | 4589 | ||
4590 | if (!status && (chan->state == BT_CONNECTED || | 4590 | if (!status && (chan->state == BT_CONNECTED || |
4591 | chan->state == BT_CONFIG)) { | 4591 | chan->state == BT_CONFIG)) { |
4592 | struct sock *sk = chan->sk; | ||
4593 | |||
4594 | bt_sk(sk)->suspended = false; | ||
4595 | sk->sk_state_change(sk); | ||
4596 | |||
4592 | l2cap_check_encryption(chan, encrypt); | 4597 | l2cap_check_encryption(chan, encrypt); |
4593 | l2cap_chan_unlock(chan); | 4598 | l2cap_chan_unlock(chan); |
4594 | continue; | 4599 | continue; |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 29122ed28ea9..04e7c172d49c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -592,10 +592,14 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
592 | sk->sk_state = BT_CONFIG; | 592 | sk->sk_state = BT_CONFIG; |
593 | chan->state = BT_CONFIG; | 593 | chan->state = BT_CONFIG; |
594 | 594 | ||
595 | /* or for ACL link, under defer_setup time */ | 595 | /* or for ACL link */ |
596 | } else if (sk->sk_state == BT_CONNECT2 && | 596 | } else if ((sk->sk_state == BT_CONNECT2 && |
597 | bt_sk(sk)->defer_setup) { | 597 | bt_sk(sk)->defer_setup) || |
598 | err = l2cap_chan_check_security(chan); | 598 | sk->sk_state == BT_CONNECTED) { |
599 | if (!l2cap_chan_check_security(chan)) | ||
600 | bt_sk(sk)->suspended = true; | ||
601 | else | ||
602 | sk->sk_state_change(sk); | ||
599 | } else { | 603 | } else { |
600 | err = -EINVAL; | 604 | err = -EINVAL; |
601 | } | 605 | } |