Merge master.kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6

+91 -9
+18 -1
drivers/bluetooth/hci_usb.c
··· 65 #endif 66 67 static int ignore = 0; 68 static int reset = 0; 69 70 #ifdef CONFIG_BT_HCIUSB_SCO 71 static int isoc = 2; 72 #endif 73 74 - #define VERSION "2.8" 75 76 static struct usb_driver hci_usb_driver; 77 ··· 100 MODULE_DEVICE_TABLE (usb, bluetooth_ids); 101 102 static struct usb_device_id blacklist_ids[] = { 103 /* Broadcom BCM2033 without firmware */ 104 { USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE }, 105 ··· 841 if (ignore || id->driver_info & HCI_IGNORE) 842 return -ENODEV; 843 844 if (intf->cur_altsetting->desc.bInterfaceNumber > 0) 845 return -ENODEV; 846 ··· 1071 1072 module_param(ignore, bool, 0644); 1073 MODULE_PARM_DESC(ignore, "Ignore devices from the matching table"); 1074 1075 module_param(reset, bool, 0644); 1076 MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
··· 65 #endif 66 67 static int ignore = 0; 68 + static int ignore_csr = 0; 69 + static int ignore_sniffer = 0; 70 static int reset = 0; 71 72 #ifdef CONFIG_BT_HCIUSB_SCO 73 static int isoc = 2; 74 #endif 75 76 + #define VERSION "2.9" 77 78 static struct usb_driver hci_usb_driver; 79 ··· 98 MODULE_DEVICE_TABLE (usb, bluetooth_ids); 99 100 static struct usb_device_id blacklist_ids[] = { 101 + /* CSR BlueCore devices */ 102 + { USB_DEVICE(0x0a12, 0x0001), .driver_info = HCI_CSR }, 103 + 104 /* Broadcom BCM2033 without firmware */ 105 { USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE }, 106 ··· 836 if (ignore || id->driver_info & HCI_IGNORE) 837 return -ENODEV; 838 839 + if (ignore_csr && id->driver_info & HCI_CSR) 840 + return -ENODEV; 841 + 842 + if (ignore_sniffer && id->driver_info & HCI_SNIFFER) 843 + return -ENODEV; 844 + 845 if (intf->cur_altsetting->desc.bInterfaceNumber > 0) 846 return -ENODEV; 847 ··· 1060 1061 module_param(ignore, bool, 0644); 1062 MODULE_PARM_DESC(ignore, "Ignore devices from the matching table"); 1063 + 1064 + module_param(ignore_csr, bool, 0644); 1065 + MODULE_PARM_DESC(ignore_csr, "Ignore devices with id 0a12:0001"); 1066 + 1067 + module_param(ignore_sniffer, bool, 0644); 1068 + MODULE_PARM_DESC(ignore_sniffer, "Ignore devices with id 0a12:0002"); 1069 1070 module_param(reset, bool, 0644); 1071 MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
+3 -2
drivers/bluetooth/hci_usb.h
··· 31 #define HCI_IGNORE 0x01 32 #define HCI_RESET 0x02 33 #define HCI_DIGIANSWER 0x04 34 - #define HCI_SNIFFER 0x08 35 - #define HCI_BROKEN_ISOC 0x10 36 #define HCI_BCM92035 0x20 37 38 #define HCI_MAX_IFACE_NUM 3 39
··· 31 #define HCI_IGNORE 0x01 32 #define HCI_RESET 0x02 33 #define HCI_DIGIANSWER 0x04 34 + #define HCI_CSR 0x08 35 + #define HCI_SNIFFER 0x10 36 #define HCI_BCM92035 0x20 37 + #define HCI_BROKEN_ISOC 0x40 38 39 #define HCI_MAX_IFACE_NUM 3 40
+11
include/net/bluetooth/hci.h
··· 463 __s8 rssi; 464 } __attribute__ ((packed)); 465 466 #define HCI_EV_CONN_COMPLETE 0x03 467 struct hci_ev_conn_complete { 468 __u8 status;
··· 463 __s8 rssi; 464 } __attribute__ ((packed)); 465 466 + #define HCI_EV_EXTENDED_INQUIRY_RESULT 0x2F 467 + struct extended_inquiry_info { 468 + bdaddr_t bdaddr; 469 + __u8 pscan_rep_mode; 470 + __u8 pscan_period_mode; 471 + __u8 dev_class[3]; 472 + __u16 clock_offset; 473 + __s8 rssi; 474 + __u8 data[240]; 475 + } __attribute__ ((packed)); 476 + 477 #define HCI_EV_CONN_COMPLETE 0x03 478 struct hci_ev_conn_complete { 479 __u8 status;
+33
net/bluetooth/hci_event.c
··· 558 hci_dev_unlock(hdev); 559 } 560 561 /* Connect Request */ 562 static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) 563 { ··· 967 968 case HCI_EV_INQUIRY_RESULT_WITH_RSSI: 969 hci_inquiry_result_with_rssi_evt(hdev, skb); 970 break; 971 972 case HCI_EV_CONN_REQUEST:
··· 558 hci_dev_unlock(hdev); 559 } 560 561 + /* Extended Inquiry Result */ 562 + static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) 563 + { 564 + struct inquiry_data data; 565 + struct extended_inquiry_info *info = (struct extended_inquiry_info *) (skb->data + 1); 566 + int num_rsp = *((__u8 *) skb->data); 567 + 568 + BT_DBG("%s num_rsp %d", hdev->name, num_rsp); 569 + 570 + if (!num_rsp) 571 + return; 572 + 573 + hci_dev_lock(hdev); 574 + 575 + for (; num_rsp; num_rsp--) { 576 + bacpy(&data.bdaddr, &info->bdaddr); 577 + data.pscan_rep_mode = info->pscan_rep_mode; 578 + data.pscan_period_mode = info->pscan_period_mode; 579 + data.pscan_mode = 0x00; 580 + memcpy(data.dev_class, info->dev_class, 3); 581 + data.clock_offset = info->clock_offset; 582 + data.rssi = info->rssi; 583 + info++; 584 + hci_inquiry_cache_update(hdev, &data); 585 + } 586 + 587 + hci_dev_unlock(hdev); 588 + } 589 + 590 /* Connect Request */ 591 static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) 592 { ··· 938 939 case HCI_EV_INQUIRY_RESULT_WITH_RSSI: 940 hci_inquiry_result_with_rssi_evt(hdev, skb); 941 + break; 942 + 943 + case HCI_EV_EXTENDED_INQUIRY_RESULT: 944 + hci_extended_inquiry_result_evt(hdev, skb); 945 break; 946 947 case HCI_EV_CONN_REQUEST:
+26 -6
net/bluetooth/rfcomm/sock.c
··· 363 goto done; 364 } 365 366 write_lock_bh(&rfcomm_sk_list.lock); 367 368 if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) { ··· 398 if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc)) 399 return -EINVAL; 400 401 - if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) 402 - return -EBADFD; 403 - 404 - if (sk->sk_type != SOCK_STREAM) 405 - return -EINVAL; 406 - 407 lock_sock(sk); 408 409 sk->sk_state = BT_CONNECT; 410 bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr); ··· 419 err = bt_sock_wait_state(sk, BT_CONNECTED, 420 sock_sndtimeo(sk, flags & O_NONBLOCK)); 421 422 release_sock(sk); 423 return err; 424 } ··· 435 436 if (sk->sk_state != BT_BOUND) { 437 err = -EBADFD; 438 goto done; 439 } 440 ··· 484 485 if (sk->sk_state != BT_LISTEN) { 486 err = -EBADFD; 487 goto done; 488 } 489
··· 363 goto done; 364 } 365 366 + if (sk->sk_type != SOCK_STREAM) { 367 + err = -EINVAL; 368 + goto done; 369 + } 370 + 371 write_lock_bh(&rfcomm_sk_list.lock); 372 373 if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) { ··· 393 if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc)) 394 return -EINVAL; 395 396 lock_sock(sk); 397 + 398 + if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) { 399 + err = -EBADFD; 400 + goto done; 401 + } 402 + 403 + if (sk->sk_type != SOCK_STREAM) { 404 + err = -EINVAL; 405 + goto done; 406 + } 407 408 sk->sk_state = BT_CONNECT; 409 bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr); ··· 410 err = bt_sock_wait_state(sk, BT_CONNECTED, 411 sock_sndtimeo(sk, flags & O_NONBLOCK)); 412 413 + done: 414 release_sock(sk); 415 return err; 416 } ··· 425 426 if (sk->sk_state != BT_BOUND) { 427 err = -EBADFD; 428 + goto done; 429 + } 430 + 431 + if (sk->sk_type != SOCK_STREAM) { 432 + err = -EINVAL; 433 goto done; 434 } 435 ··· 469 470 if (sk->sk_state != BT_LISTEN) { 471 err = -EBADFD; 472 + goto done; 473 + } 474 + 475 + if (sk->sk_type != SOCK_STREAM) { 476 + err = -EINVAL; 477 goto done; 478 } 479