revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36
[firefly-linux-kernel-4.4.55.git] / net / bluetooth / sco.c
index cb21a785f9de2c88fb1b45bcd8c6041f71feb93d..d0927d1fdadaba4887dbac40064c4328541b9b00 100644 (file)
@@ -178,7 +178,6 @@ static int sco_connect(struct sock *sk)
 {
        bdaddr_t *src = &bt_sk(sk)->src;
        bdaddr_t *dst = &bt_sk(sk)->dst;
-       __u16 pkt_type = sco_pi(sk)->pkt_type;
        struct sco_conn *conn;
        struct hci_conn *hcon;
        struct hci_dev  *hdev;
@@ -195,13 +194,10 @@ static int sco_connect(struct sock *sk)
 
        if (lmp_esco_capable(hdev) && !disable_esco)
                type = ESCO_LINK;
-       else {
+       else
                type = SCO_LINK;
-               pkt_type &= SCO_ESCO_MASK;
-       }
 
-       hcon = hci_connect(hdev, type, pkt_type, dst,
-                                       BT_SECURITY_LOW, HCI_AT_NO_BONDING);
+       hcon = hci_connect(hdev, type, dst, BT_SECURITY_LOW, HCI_AT_NO_BONDING);
        if (!hcon)
                goto done;
 
@@ -454,22 +450,18 @@ static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
        return 0;
 }
 
-static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
+static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
 {
-       struct sockaddr_sco sa;
+       struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
        struct sock *sk = sock->sk;
-       bdaddr_t *src = &sa.sco_bdaddr;
-       int len, err = 0;
+       bdaddr_t *src = &sa->sco_bdaddr;
+       int err = 0;
 
-       BT_DBG("sk %p %s", sk, batostr(&sa.sco_bdaddr));
+       BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr));
 
        if (!addr || addr->sa_family != AF_BLUETOOTH)
                return -EINVAL;
 
-       memset(&sa, 0, sizeof(sa));
-       len = min_t(unsigned int, sizeof(sa), alen);
-       memcpy(&sa, addr, len);
-
        lock_sock(sk);
 
        if (sk->sk_state != BT_OPEN) {
@@ -483,8 +475,7 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
                err = -EADDRINUSE;
        } else {
                /* Save source address */
-               bacpy(&bt_sk(sk)->src, &sa.sco_bdaddr);
-               sco_pi(sk)->pkt_type = sa.sco_pkt_type;
+               bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
                sk->sk_state = BT_BOUND;
        }
 
@@ -497,34 +488,27 @@ done:
 
 static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
 {
+       struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
        struct sock *sk = sock->sk;
-       struct sockaddr_sco sa;
-       int len, err = 0;
+       int err = 0;
+
 
        BT_DBG("sk %p", sk);
 
-       if (!addr || addr->sa_family != AF_BLUETOOTH)
+       if (alen < sizeof(struct sockaddr_sco) ||
+           addr->sa_family != AF_BLUETOOTH)
                return -EINVAL;
 
-       memset(&sa, 0, sizeof(sa));
-       len = min_t(unsigned int, sizeof(sa), alen);
-       memcpy(&sa, addr, len);
-
-       lock_sock(sk);
+       if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
+               return -EBADFD;
 
-       if (sk->sk_type != SOCK_SEQPACKET) {
-               err = -EINVAL;
-               goto done;
-       }
+       if (sk->sk_type != SOCK_SEQPACKET)
+               return -EINVAL;
 
-       if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
-               err = -EBADFD;
-               goto done;
-       }
+       lock_sock(sk);
 
        /* Set destination address and psm */
-       bacpy(&bt_sk(sk)->dst, &sa.sco_bdaddr);
-       sco_pi(sk)->pkt_type = sa.sco_pkt_type;
+       bacpy(&bt_sk(sk)->dst, &sa->sco_bdaddr);
 
        if ((err = sco_connect(sk)))
                goto done;
@@ -630,7 +614,6 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len
                bacpy(&sa->sco_bdaddr, &bt_sk(sk)->dst);
        else
                bacpy(&sa->sco_bdaddr, &bt_sk(sk)->src);
-       sa->sco_pkt_type = sco_pi(sk)->pkt_type;
 
        return 0;
 }