1diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c 2index 4574c5cb1..c3653b067 100644 3--- a/net/bluetooth/l2cap_sock.c 4+++ b/net/bluetooth/l2cap_sock.c 5@@ -1527,9 +1527,6 @@ static void l2cap_sock_close_cb(struct l2cap_chan *chan) 6 { 7 struct sock *sk = chan->data; 8 9- if (!sk) 10- return; 11- 12 l2cap_sock_kill(sk); 13 } 14 15@@ -1538,9 +1535,6 @@ static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) 16 struct sock *sk = chan->data; 17 struct sock *parent; 18 19- if (!sk) 20- return; 21- 22 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); 23 24 /* This callback can be called both for server (BT_LISTEN) 25@@ -1732,10 +1726,8 @@ static void l2cap_sock_destruct(struct sock *sk) 26 { 27 BT_DBG("sk %p", sk); 28 29- if (l2cap_pi(sk)->chan) { 30- l2cap_pi(sk)->chan->data = NULL; 31+ if (l2cap_pi(sk)->chan) 32 l2cap_chan_put(l2cap_pi(sk)->chan); 33- } 34 35 if (l2cap_pi(sk)->rx_busy_skb) { 36 kfree_skb(l2cap_pi(sk)->rx_busy_skb); 37diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c 38index cf165b0d1..2a14519a8 100644 39--- a/net/bluetooth/sco.c 40+++ b/net/bluetooth/sco.c 41@@ -93,10 +93,10 @@ static void sco_sock_timeout(struct work_struct *work) 42 43 BT_DBG("sock %p state %d", sk, sk->sk_state); 44 45- lock_sock(sk); 46+ bh_lock_sock(sk); 47 sk->sk_err = ETIMEDOUT; 48 sk->sk_state_change(sk); 49- release_sock(sk); 50+ bh_unlock_sock(sk); 51 52 sock_put(sk); 53 } 54@@ -193,10 +193,10 @@ static void sco_conn_del(struct hci_conn *hcon, int err) 55 56 if (sk) { 57 sock_hold(sk); 58- lock_sock(sk); 59+ bh_lock_sock(sk); 60 sco_sock_clear_timer(sk); 61 sco_chan_del(sk, err); 62- release_sock(sk); 63+ bh_unlock_sock(sk); 64 sock_put(sk); 65 } 66 67@@ -1103,10 +1103,10 @@ static void sco_conn_ready(struct sco_conn *conn) 68 69 if (sk) { 70 sco_sock_clear_timer(sk); 71- lock_sock(sk); 72+ bh_lock_sock(sk); 73 sk->sk_state = BT_CONNECTED; 74 sk->sk_state_change(sk); 75- release_sock(sk); 76+ bh_unlock_sock(sk); 77 } else { 78 sco_conn_lock(conn); 79 80@@ -1121,12 +1121,12 @@ static void sco_conn_ready(struct sco_conn *conn) 81 return; 82 } 83 84- lock_sock(parent); 85+ bh_lock_sock(parent); 86 87 sk = sco_sock_alloc(sock_net(parent), NULL, 88 BTPROTO_SCO, GFP_ATOMIC, 0); 89 if (!sk) { 90- release_sock(parent); 91+ bh_unlock_sock(parent); 92 sco_conn_unlock(conn); 93 return; 94 } 95@@ -1147,7 +1147,7 @@ static void sco_conn_ready(struct sco_conn *conn) 96 /* Wake up parent */ 97 parent->sk_data_ready(parent); 98 99- release_sock(parent); 100+ bh_unlock_sock(parent); 101 102 sco_conn_unlock(conn); 103 } 104diff --git a/net/rfkill/Kconfig b/net/rfkill/Kconfig 105index 83a7af898..33ab1f7a3 100644 106--- a/net/rfkill/Kconfig 107+++ b/net/rfkill/Kconfig 108@@ -32,3 +32,12 @@ config RFKILL_GPIO 109 help 110 If you say yes here you get support of a generic gpio RFKILL 111 driver. 112+ 113+config RFKILL_RK 114+ tristate "Rockchip RFKILL driver" 115+ depends on RFKILL 116+ depends on MMC 117+ depends on ARCH_ROCKCHIP 118+ default y 119+ help 120+ Rockchip rfkill driver for rk29/rk3X 121diff --git a/net/rfkill/Makefile b/net/rfkill/Makefile 122index dc47b6174..beed5b506 100644 123--- a/net/rfkill/Makefile 124+++ b/net/rfkill/Makefile 125@@ -7,3 +7,5 @@ rfkill-y += core.o 126 rfkill-$(CONFIG_RFKILL_INPUT) += input.o 127 obj-$(CONFIG_RFKILL) += rfkill.o 128 obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o 129+rfkill-rk-y += rfkill-wlan.o rfkill-bt.o 130+obj-$(CONFIG_RFKILL_RK) += rfkill-rk.o 131