aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorFrédéric Dalleau <frederic.dalleau@linux.intel.com>2013-08-19 08:23:58 -0400
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-08-21 10:47:11 -0400
commit2f69a82acf6f971a9e184dd32b24c79a14388a6c (patch)
treeedbb038d065f30ed05fce437b4053f656f1e2da0 /net/bluetooth
parent5d4d62f6ca04c54ed6c84df6adf5427c52feda3e (diff)
Bluetooth: Use voice setting in deferred SCO connection request
When an incoming eSCO connection is requested, check the selected voice setting and reply appropriately. Voice setting should have been negotiated previously. For example, in case of HFP, the codec is negotiated using AT commands on the RFCOMM channel. This patch only changes replies for socket with deferred setup enabled. Signed-off-by: Frédéric Dalleau <frederic.dalleau@linux.intel.com> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/sco.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 678747e2e389..b1016c82c908 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -653,7 +653,7 @@ static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
653 return err; 653 return err;
654} 654}
655 655
656static void sco_conn_defer_accept(struct hci_conn *conn) 656static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
657{ 657{
658 struct hci_dev *hdev = conn->hdev; 658 struct hci_dev *hdev = conn->hdev;
659 659
@@ -676,9 +676,21 @@ static void sco_conn_defer_accept(struct hci_conn *conn)
676 676
677 cp.tx_bandwidth = __constant_cpu_to_le32(0x00001f40); 677 cp.tx_bandwidth = __constant_cpu_to_le32(0x00001f40);
678 cp.rx_bandwidth = __constant_cpu_to_le32(0x00001f40); 678 cp.rx_bandwidth = __constant_cpu_to_le32(0x00001f40);
679 cp.max_latency = __constant_cpu_to_le16(0xffff); 679 cp.content_format = cpu_to_le16(setting);
680 cp.content_format = cpu_to_le16(hdev->voice_setting); 680
681 cp.retrans_effort = 0xff; 681 switch (setting & SCO_AIRMODE_MASK) {
682 case SCO_AIRMODE_TRANSP:
683 if (conn->pkt_type & ESCO_2EV3)
684 cp.max_latency = __constant_cpu_to_le16(0x0008);
685 else
686 cp.max_latency = __constant_cpu_to_le16(0x000D);
687 cp.retrans_effort = 0x02;
688 break;
689 case SCO_AIRMODE_CVSD:
690 cp.max_latency = __constant_cpu_to_le16(0xffff);
691 cp.retrans_effort = 0xff;
692 break;
693 }
682 694
683 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, 695 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
684 sizeof(cp), &cp); 696 sizeof(cp), &cp);
@@ -695,7 +707,7 @@ static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
695 707
696 if (sk->sk_state == BT_CONNECT2 && 708 if (sk->sk_state == BT_CONNECT2 &&
697 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { 709 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
698 sco_conn_defer_accept(pi->conn->hcon); 710 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
699 sk->sk_state = BT_CONFIG; 711 sk->sk_state = BT_CONFIG;
700 msg->msg_namelen = 0; 712 msg->msg_namelen = 0;
701 713