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