diff options
| author | Maksim Krasnyanskiy <maxk@qualcomm.com> | 2003-05-11 22:47:35 -0700 |
|---|---|---|
| committer | Maksim Krasnyanskiy <maxk@qualcomm.com> | 2003-05-11 22:47:35 -0700 |
| commit | b1c8ea3cff078b9c96be75bc244cd9b5c9d55b71 (patch) | |
| tree | f603e774fe59670838f9e8cd7b525c82ee6b0c31 | |
| parent | d0682bc8a011029cac0fd6aac3fdc67af25d1286 (diff) | |
| parent | 1a6fe614e48085db50b1fb2701eeb922453a40ff (diff) | |
Merge bk://linux.bkbits.net/linux-2.5
into qualcomm.com:/home/kernel/bt-2.5
| -rw-r--r-- | drivers/bluetooth/hci_ldisc.c | 1 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 8 | ||||
| -rw-r--r-- | include/net/bluetooth/rfcomm.h | 10 | ||||
| -rw-r--r-- | net/bluetooth/af_bluetooth.c | 13 | ||||
| -rw-r--r-- | net/bluetooth/bnep/core.c | 11 | ||||
| -rw-r--r-- | net/bluetooth/bnep/sock.c | 7 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 53 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 58 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 6 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/tty.c | 9 | ||||
| -rw-r--r-- | net/bluetooth/sco.c | 10 |
11 files changed, 108 insertions, 78 deletions
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 54996f2b7573..dfd1e73e611a 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c @@ -535,6 +535,7 @@ int __init hci_uart_init(void) hci_uart_ldisc.receive_room= hci_uart_tty_room; hci_uart_ldisc.receive_buf = hci_uart_tty_receive; hci_uart_ldisc.write_wakeup= hci_uart_tty_wakeup; + hci_uart_ldisc.owner = THIS_MODULE; if ((err = tty_register_ldisc(N_HCI, &hci_uart_ldisc))) { BT_ERR("HCI line discipline registration failed. (%d)", err); diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index cd9ab609d354..3758bc57d7b8 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -231,8 +231,10 @@ struct l2cap_pinfo { struct sock *prev_c; }; -#define CONF_REQ_SENT 0x01 -#define CONF_INPUT_DONE 0x02 -#define CONF_OUTPUT_DONE 0x04 +#define L2CAP_CONF_REQ_SENT 0x01 +#define L2CAP_CONF_INPUT_DONE 0x02 +#define L2CAP_CONF_OUTPUT_DONE 0x04 + +void l2cap_load(void); #endif /* __L2CAP_H */ diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 2efdc72f4193..c2a2098b4369 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h @@ -185,10 +185,11 @@ struct rfcomm_dlc { atomic_t refcnt; u8 dlci; u8 addr; - - uint mtu; + u8 priority; u8 v24_sig; + u8 mscex; + uint mtu; uint credits; uint rx_credits; uint tx_credits; @@ -213,6 +214,11 @@ struct rfcomm_dlc { #define RFCOMM_SCHED_TIMEO 3 #define RFCOMM_SCHED_WAKEUP 31 +/* MSC exchange flags */ +#define RFCOMM_MSCEX_TX 1 +#define RFCOMM_MSCEX_RX 2 +#define RFCOMM_MSCEX_OK (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX) + extern struct task_struct *rfcomm_thread; extern unsigned long rfcomm_event; diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 991a0fd7b23b..4f7b19226a30 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c @@ -92,6 +92,8 @@ int bt_sock_unregister(int proto) static int bt_sock_create(struct socket *sock, int proto) { + int err = 0; + if (proto >= BT_MAX_PROTO) return -EINVAL; @@ -102,11 +104,12 @@ static int bt_sock_create(struct socket *sock, int proto) request_module(module_name); } #endif - - if (!bt_proto[proto]) - return -ENOENT; - - return bt_proto[proto]->create(sock, proto); + err = -EPROTONOSUPPORT; + if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { + err = bt_proto[proto]->create(sock, proto); + module_put(bt_proto[proto]->owner); + } + return err; } struct sock *bt_sock_alloc(struct socket *sock, int proto, int pi_size, int prio) diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index ff3fea9cc4ce..c2e49a273b4b 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c @@ -85,14 +85,17 @@ static struct bnep_session *__bnep_get_session(u8 *dst) static void __bnep_link_session(struct bnep_session *s) { - MOD_INC_USE_COUNT; + /* It's safe to call __module_get() here because sessions are added + by the socket layer which has to hold the refference to this module. + */ + __module_get(THIS_MODULE); list_add(&s->list, &bnep_session_list); } static void __bnep_unlink_session(struct bnep_session *s) { list_del(&s->list); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } static int bnep_send(struct bnep_session *s, void *data, size_t len) @@ -677,7 +680,9 @@ int bnep_get_conninfo(struct bnep_conninfo *ci) static int __init bnep_init_module(void) { - char flt[50] = ""; + char flt[50] = ""; + + l2cap_load(); #ifdef CONFIG_BT_BNEP_PROTO_FILTER strcat(flt, "protocol "); diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index 60d22f5e5820..609fe3da8d4d 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c @@ -67,8 +67,6 @@ static int bnep_sock_release(struct socket *sock) sock_orphan(sk); sock_put(sk); - - MOD_DEC_USE_COUNT; return 0; } @@ -179,13 +177,10 @@ static int bnep_sock_create(struct socket *sock, int protocol) return -ENOMEM; sock->ops = &bnep_sock_ops; - MOD_INC_USE_COUNT; - - sock->state = SS_UNCONNECTED; + sock->state = SS_UNCONNECTED; sk->destruct = NULL; sk->protocol = protocol; - return 0; } diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index e9c1cee3ae56..9498d7e67a7b 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c @@ -145,8 +145,6 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) conn->chan_list.lock = RW_LOCK_UNLOCKED; BT_DBG("hcon %p conn %p", hcon, conn); - - MOD_INC_USE_COUNT; return conn; } @@ -173,8 +171,6 @@ static int l2cap_conn_del(struct hci_conn *hcon, int err) hcon->l2cap_data = NULL; kfree(conn); - - MOD_DEC_USE_COUNT; return 0; } @@ -242,8 +238,6 @@ static void l2cap_sock_destruct(struct sock *sk) if (sk->protinfo) kfree(sk->protinfo); - - MOD_DEC_USE_COUNT; } static void l2cap_sock_cleanup_listen(struct sock *parent) @@ -356,6 +350,8 @@ static struct sock *l2cap_sock_alloc(struct socket *sock, int proto, int prio) if (!sk) return NULL; + sk_set_owner(sk, THIS_MODULE); + sk->destruct = l2cap_sock_destruct; sk->sndtimeo = L2CAP_CONN_TIMEOUT; @@ -365,8 +361,6 @@ static struct sock *l2cap_sock_alloc(struct socket *sock, int proto, int prio) l2cap_sock_init_timer(sk); bt_sock_link(&l2cap_sk_list, sk); - - MOD_INC_USE_COUNT; return sk; } @@ -1319,15 +1313,18 @@ static int l2cap_build_conf_rsp(struct sock *sk, void *data, int *result) { struct l2cap_conf_rsp *rsp = data; void *ptr = rsp->data; + u16 flags = 0; BT_DBG("sk %p complete %d", sk, result ? 1 : 0); if (result) *result = l2cap_conf_output(sk, &ptr); + else + flags = 0x0001; rsp->scid = __cpu_to_le16(l2cap_pi(sk)->dcid); rsp->result = __cpu_to_le16(result ? *result : 0); - rsp->flags = __cpu_to_le16(0); + rsp->flags = __cpu_to_le16(flags); return ptr - data; } @@ -1440,7 +1437,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd case L2CAP_CR_SUCCESS: sk->state = BT_CONFIG; l2cap_pi(sk)->dcid = dcid; - l2cap_pi(sk)->conf_state |= CONF_REQ_SENT; + l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; l2cap_send_req(conn, L2CAP_CONF_REQ, l2cap_build_conf_req(sk, req), req); break; @@ -1475,7 +1472,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); - if (flags & 0x01) { + if (flags & 0x0001) { /* Incomplete config. Send empty response. */ l2cap_send_rsp(conn, cmd->ident, L2CAP_CONF_RSP, l2cap_build_conf_rsp(sk, rsp, NULL), rsp); goto unlock; @@ -1488,12 +1485,12 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr goto unlock; /* Output config done */ - l2cap_pi(sk)->conf_state |= CONF_OUTPUT_DONE; + l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; - if (l2cap_pi(sk)->conf_state & CONF_INPUT_DONE) { + if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { sk->state = BT_CONNECTED; l2cap_chan_ready(sk); - } else if (!(l2cap_pi(sk)->conf_state & CONF_REQ_SENT)) { + } else if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) { u8 req[64]; l2cap_send_req(conn, L2CAP_CONF_REQ, l2cap_build_conf_req(sk, req), req); } @@ -1538,9 +1535,9 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr goto done; /* Input config done */ - l2cap_pi(sk)->conf_state |= CONF_INPUT_DONE; + l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; - if (l2cap_pi(sk)->conf_state & CONF_OUTPUT_DONE) { + if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { sk->state = BT_CONNECTED; l2cap_chan_ready(sk); } @@ -1943,21 +1940,27 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl } if (skb->len < 2) { - BT_ERR("Frame is too small (len %d)", skb->len); + BT_ERR("Frame is too short (len %d)", skb->len); goto drop; } hdr = (struct l2cap_hdr *) skb->data; len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE; - BT_DBG("Start: total len %d, frag len %d", len, skb->len); - if (len == skb->len) { /* Complete frame received */ l2cap_recv_frame(conn, skb); return 0; } + BT_DBG("Start: total len %d, frag len %d", len, skb->len); + + if (skb->len > len) { + BT_ERR("Frame is too long (len %d, expected len %d)", + skb->len, len); + goto drop; + } + /* Allocate skb for the complete frame (with header) */ if (!(conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC))) goto drop; @@ -1973,7 +1976,7 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl } if (skb->len > conn->rx_len) { - BT_ERR("Fragment is too large (len %d, expect %d)", + BT_ERR("Fragment is too long (len %d, expected %d)", skb->len, conn->rx_len); kfree_skb(conn->rx_skb); conn->rx_skb = NULL; @@ -2134,7 +2137,6 @@ int __init l2cap_init(void) return err; } - l2cap_proc_init(); BT_INFO("L2CAP ver %s", VERSION); @@ -2155,6 +2157,15 @@ void __exit l2cap_cleanup(void) BT_ERR("L2CAP protocol unregistration failed"); } +void l2cap_load(void) +{ + /* Dummy function to trigger automatic L2CAP module loading by + other modules that use L2CAP sockets but don not use any other + symbols from it. */ + return; +} +EXPORT_SYMBOL(l2cap_load); + module_init(l2cap_init); module_exit(l2cap_cleanup); diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 68a447eced0d..c701753c8bcf 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -52,7 +52,7 @@ #include <net/bluetooth/l2cap.h> #include <net/bluetooth/rfcomm.h> -#define VERSION "0.3" +#define VERSION "1.0" #ifndef CONFIG_BT_RFCOMM_DEBUG #undef BT_DBG @@ -203,6 +203,7 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d) d->state = BT_OPEN; d->flags = 0; + d->mscex = 0; d->mtu = RFCOMM_DEFAULT_MTU; d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV; @@ -304,10 +305,11 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, rfcomm_dlc_clear_state(d); - d->dlci = dlci; - d->addr = __addr(s->initiator, dlci); + d->dlci = dlci; + d->addr = __addr(s->initiator, dlci); + d->priority = 7; - d->state = BT_CONFIG; + d->state = BT_CONFIG; rfcomm_dlc_link(s, d); d->mtu = s->mtu; @@ -481,9 +483,12 @@ struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state) list_add(&s->list, &session_list); /* Do not increment module usage count for listeting sessions. - * Otherwise we won't be able to unload the module. */ + * Otherwise we won't be able to unload the module. + * Non listening session are added either by a socket or a TTYs + * which means that we already hold refcount to this module. + */ if (state != BT_LISTEN) - MOD_INC_USE_COUNT; + __module_get(THIS_MODULE); return s; } @@ -502,7 +507,7 @@ void rfcomm_session_del(struct rfcomm_session *s) kfree(s); if (state != BT_LISTEN) - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst) @@ -741,7 +746,7 @@ static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d pn = (void *) ptr; ptr += sizeof(*pn); pn->dlci = d->dlci; - pn->priority = 0; + pn->priority = d->priority; pn->ack_timer = 0; pn->max_retrans = 0; @@ -1099,8 +1104,6 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn) set_bit(RFCOMM_TX_THROTTLED, &d->flags); d->credits = 0; } - - d->mtu = btohs(pn->mtu); } else { if (pn->flow_ctrl == 0xe0) { d->tx_credits = pn->credits; @@ -1108,10 +1111,12 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn) set_bit(RFCOMM_TX_THROTTLED, &d->flags); d->credits = 0; } - - d->mtu = btohs(pn->mtu); } + d->priority = pn->priority; + + d->mtu = btohs(pn->mtu); + return 0; } @@ -1137,7 +1142,7 @@ static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb) switch (d->state) { case BT_CONFIG: rfcomm_apply_pn(d, cr, pn); - + d->state = BT_CONNECT; rfcomm_send_sabm(s, d->dlci); break; @@ -1148,7 +1153,7 @@ static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb) if (!cr) return 0; - + /* PN request for non existing DLC. * Assume incoming connection. */ if (rfcomm_connect_ind(s, channel, &d)) { @@ -1157,7 +1162,7 @@ static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb) rfcomm_dlc_link(s, d); rfcomm_apply_pn(d, cr, pn); - + d->state = BT_OPEN; rfcomm_send_pn(s, 0, d); } else { @@ -1229,21 +1234,21 @@ static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_ if (rpn->param_mask & RFCOMM_RPN_PM_FLOW) { if (rpn->flow_ctrl != RFCOMM_RPN_FLOW_NONE) { BT_DBG("RPN flow ctrl mismatch 0x%x", rpn->flow_ctrl); - rpn->flow_ctrl = RFCOMM_RPN_FLOW_NONE; + flow_ctrl = RFCOMM_RPN_FLOW_NONE; rpn_mask ^= RFCOMM_RPN_PM_FLOW; } } if (rpn->param_mask & RFCOMM_RPN_PM_XON) { if (rpn->xon_char != RFCOMM_RPN_XON_CHAR) { BT_DBG("RPN XON char mismatch 0x%x", rpn->xon_char); - rpn->xon_char = RFCOMM_RPN_XON_CHAR; + xon_char = RFCOMM_RPN_XON_CHAR; rpn_mask ^= RFCOMM_RPN_PM_XON; } } if (rpn->param_mask & RFCOMM_RPN_PM_XOFF) { if (rpn->xoff_char != RFCOMM_RPN_XOFF_CHAR) { BT_DBG("RPN XOFF char mismatch 0x%x", rpn->xoff_char); - rpn->xoff_char = RFCOMM_RPN_XOFF_CHAR; + xoff_char = RFCOMM_RPN_XOFF_CHAR; rpn_mask ^= RFCOMM_RPN_PM_XOFF; } } @@ -1284,11 +1289,11 @@ static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig); - if (!cr) + d = rfcomm_dlc_get(s, dlci); + if (!d) return 0; - d = rfcomm_dlc_get(s, dlci); - if (d) { + if (cr) { if (msc->v24_sig & RFCOMM_V24_FC && !d->credits) set_bit(RFCOMM_TX_THROTTLED, &d->flags); else @@ -1300,7 +1305,11 @@ static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb rfcomm_dlc_unlock(d); rfcomm_send_msc(s, 0, dlci, msc->v24_sig); - } + + d->mscex |= RFCOMM_MSCEX_RX; + } else + d->mscex |= RFCOMM_MSCEX_TX; + return 0; } @@ -1524,7 +1533,8 @@ static inline void rfcomm_process_dlcs(struct rfcomm_session *s) continue; } - if (d->state == BT_CONNECTED || d->state == BT_DISCONN) + if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) && + d->mscex == RFCOMM_MSCEX_OK) rfcomm_process_tx(d); } } @@ -1869,6 +1879,8 @@ static void __exit rfcomm_proc_cleanup(void) /* ---- Initialization ---- */ int __init rfcomm_init(void) { + l2cap_load(); + kernel_thread(rfcomm_run, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND); BT_INFO("RFCOMM ver %s", VERSION); diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 5a8c62dd5377..1dca296a3cb5 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -182,8 +182,6 @@ static void rfcomm_sock_destruct(struct sock *sk) if (sk->protinfo) kfree(sk->protinfo); - - MOD_DEC_USE_COUNT; } static void rfcomm_sock_cleanup_listen(struct sock *parent) @@ -265,6 +263,8 @@ static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, int prio) if (!sk) return NULL; + sk_set_owner(sk, THIS_MODULE); + d = rfcomm_dlc_alloc(prio); if (!d) { sk_free(sk); @@ -288,8 +288,6 @@ static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, int prio) bt_sock_link(&rfcomm_sk_list, sk); BT_DBG("sk %p", sk); - - MOD_INC_USE_COUNT; return sk; } diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 85a6f3983ae3..99e947050ea9 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c @@ -99,7 +99,9 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev) rfcomm_dlc_put(dlc); kfree(dev); - MOD_DEC_USE_COUNT; + /* It's safe to call module_put() here because socket still + holds refference to this module. */ + module_put(THIS_MODULE); } static inline void rfcomm_dev_hold(struct rfcomm_dev *dev) @@ -211,8 +213,9 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) dev->dlc = dlc; rfcomm_dlc_unlock(dlc); - MOD_INC_USE_COUNT; - + /* It's safe to call __module_get() here because socket already + holds refference to this module. */ + __module_get(THIS_MODULE); out: write_unlock_bh(&rfcomm_dev_lock); diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index ee8a4383211e..98629665f1a9 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -145,8 +145,6 @@ static struct sco_conn *sco_conn_add(struct hci_conn *hcon, __u8 status) conn->mtu = 60; BT_DBG("hcon %p conn %p", hcon, conn); - - MOD_INC_USE_COUNT; return conn; } @@ -180,8 +178,6 @@ static int sco_conn_del(struct hci_conn *hcon, int err) hcon->sco_data = NULL; kfree(conn); - - MOD_DEC_USE_COUNT; return 0; } @@ -347,8 +343,6 @@ static void sco_sock_destruct(struct sock *sk) if (sk->protinfo) kfree(sk->protinfo); - - MOD_DEC_USE_COUNT; } static void sco_sock_cleanup_listen(struct sock *parent) @@ -434,6 +428,8 @@ static struct sock *sco_sock_alloc(struct socket *sock, int proto, int prio) if (!sk) return NULL; + sk_set_owner(sk, THIS_MODULE); + sk->destruct = sco_sock_destruct; sk->sndtimeo = SCO_CONN_TIMEOUT; sk->state = BT_OPEN; @@ -441,8 +437,6 @@ static struct sock *sco_sock_alloc(struct socket *sock, int proto, int prio) sco_sock_init_timer(sk); bt_sock_link(&sco_sk_list, sk); - - MOD_INC_USE_COUNT; return sk; } |
