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

+94 -74
+8 -8
drivers/bluetooth/hci_usb.c
··· 115 { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, 116 117 /* Broadcom BCM2045 */ 118 - { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_WRONG_SCO_MTU }, 119 120 /* IBM/Lenovo ThinkPad with Broadcom chip */ 121 - { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_WRONG_SCO_MTU }, 122 - { USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_WRONG_SCO_MTU }, 123 124 /* Targus ACB10US */ 125 { USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET }, ··· 128 { USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET }, 129 130 /* HP laptop with Broadcom chip */ 131 - { USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_WRONG_SCO_MTU }, 132 133 /* Dell laptop with Broadcom chip */ 134 - { USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_WRONG_SCO_MTU }, 135 136 /* Microsoft Wireless Transceiver for Bluetooth 2.0 */ 137 { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET }, 138 139 /* Kensington Bluetooth USB adapter */ 140 { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET }, 141 - { USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_WRONG_SCO_MTU }, 142 143 /* ISSC Bluetooth Adapter v3.1 */ 144 { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, ··· 148 { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC }, 149 150 /* Belkin F8T012 and F8T013 devices */ 151 - { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_WRONG_SCO_MTU }, 152 - { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_WRONG_SCO_MTU }, 153 154 /* Digianswer devices */ 155 { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
··· 115 { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, 116 117 /* Broadcom BCM2045 */ 118 + { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 119 120 /* IBM/Lenovo ThinkPad with Broadcom chip */ 121 + { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 122 + { USB_DEVICE(0x0a5c, 0x2110), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 123 124 /* Targus ACB10US */ 125 { USB_DEVICE(0x0a5c, 0x2100), .driver_info = HCI_RESET }, ··· 128 { USB_DEVICE(0x0a5c, 0x2111), .driver_info = HCI_RESET }, 129 130 /* HP laptop with Broadcom chip */ 131 + { USB_DEVICE(0x03f0, 0x171d), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 132 133 /* Dell laptop with Broadcom chip */ 134 + { USB_DEVICE(0x413c, 0x8126), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 135 136 /* Microsoft Wireless Transceiver for Bluetooth 2.0 */ 137 { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET }, 138 139 /* Kensington Bluetooth USB adapter */ 140 { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET }, 141 + { USB_DEVICE(0x047d, 0x105e), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 142 143 /* ISSC Bluetooth Adapter v3.1 */ 144 { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET }, ··· 148 { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC }, 149 150 /* Belkin F8T012 and F8T013 devices */ 151 + { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 152 + { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, 153 154 /* Digianswer devices */ 155 { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
+6 -2
include/net/bluetooth/l2cap.h
··· 129 __u8 data[0]; 130 } __attribute__ ((packed)); 131 132 - #define L2CAP_CONF_SUCCESS 0x00 133 - #define L2CAP_CONF_UNACCEPT 0x01 134 135 struct l2cap_conf_opt { 136 __u8 type; ··· 217 218 __u32 link_mode; 219 220 __u8 conf_state; 221 __u8 conf_retry; 222 __u16 conf_mtu;
··· 129 __u8 data[0]; 130 } __attribute__ ((packed)); 131 132 + #define L2CAP_CONF_SUCCESS 0x0000 133 + #define L2CAP_CONF_UNACCEPT 0x0001 134 + #define L2CAP_CONF_REJECT 0x0002 135 + #define L2CAP_CONF_UNKNOWN 0x0003 136 137 struct l2cap_conf_opt { 138 __u8 type; ··· 215 216 __u32 link_mode; 217 218 + __u8 conf_req[64]; 219 + __u8 conf_len; 220 __u8 conf_state; 221 __u8 conf_retry; 222 __u16 conf_mtu;
+80 -64
net/bluetooth/l2cap.c
··· 507 } 508 509 /* Default config options */ 510 pi->conf_mtu = L2CAP_DEFAULT_MTU; 511 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; 512 } ··· 1272 return len; 1273 } 1274 1275 - static inline void l2cap_parse_conf_req(struct sock *sk, void *data, int len) 1276 - { 1277 - int type, hint, olen; 1278 - unsigned long val; 1279 - void *ptr = data; 1280 - 1281 - BT_DBG("sk %p len %d", sk, len); 1282 - 1283 - while (len >= L2CAP_CONF_OPT_SIZE) { 1284 - len -= l2cap_get_conf_opt(&ptr, &type, &olen, &val); 1285 - 1286 - hint = type & 0x80; 1287 - type &= 0x7f; 1288 - 1289 - switch (type) { 1290 - case L2CAP_CONF_MTU: 1291 - l2cap_pi(sk)->conf_mtu = val; 1292 - break; 1293 - 1294 - case L2CAP_CONF_FLUSH_TO: 1295 - l2cap_pi(sk)->flush_to = val; 1296 - break; 1297 - 1298 - case L2CAP_CONF_QOS: 1299 - break; 1300 - 1301 - default: 1302 - if (hint) 1303 - break; 1304 - 1305 - /* FIXME: Reject unknown option */ 1306 - break; 1307 - } 1308 - } 1309 - } 1310 - 1311 static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) 1312 { 1313 struct l2cap_conf_opt *opt = *ptr; ··· 1323 return ptr - data; 1324 } 1325 1326 - static inline int l2cap_conf_output(struct sock *sk, void **ptr) 1327 { 1328 struct l2cap_pinfo *pi = l2cap_pi(sk); 1329 - int result = 0; 1330 1331 - /* Configure output options and let the other side know 1332 - * which ones we don't like. */ 1333 - if (pi->conf_mtu < pi->omtu) 1334 - result = L2CAP_CONF_UNACCEPT; 1335 - else 1336 - pi->omtu = pi->conf_mtu; 1337 1338 - l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); 1339 1340 - BT_DBG("sk %p result %d", sk, result); 1341 - return result; 1342 } 1343 1344 - static int l2cap_build_conf_rsp(struct sock *sk, void *data, int *result) 1345 { 1346 struct l2cap_conf_rsp *rsp = data; 1347 void *ptr = rsp->data; 1348 - u16 flags = 0; 1349 1350 - BT_DBG("sk %p complete %d", sk, result ? 1 : 0); 1351 - 1352 - if (result) 1353 - *result = l2cap_conf_output(sk, &ptr); 1354 - else 1355 - flags = 0x0001; 1356 1357 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); 1358 - rsp->result = cpu_to_le16(result ? *result : 0); 1359 rsp->flags = cpu_to_le16(flags); 1360 1361 return ptr - data; ··· 1536 u16 dcid, flags; 1537 u8 rsp[64]; 1538 struct sock *sk; 1539 - int result; 1540 1541 dcid = __le16_to_cpu(req->dcid); 1542 flags = __le16_to_cpu(req->flags); ··· 1549 if (sk->sk_state == BT_DISCONN) 1550 goto unlock; 1551 1552 - l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); 1553 1554 if (flags & 0x0001) { 1555 /* Incomplete config. Send empty response. */ 1556 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, 1557 - l2cap_build_conf_rsp(sk, rsp, NULL), rsp); 1558 goto unlock; 1559 } 1560 1561 /* Complete config. */ 1562 - l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, 1563 - l2cap_build_conf_rsp(sk, rsp, &result), rsp); 1564 - 1565 - if (result) 1566 goto unlock; 1567 1568 - /* Output config done */ 1569 l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; 1570 1571 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { 1572 sk->sk_state = BT_CONNECTED;
··· 507 } 508 509 /* Default config options */ 510 + pi->conf_len = 0; 511 pi->conf_mtu = L2CAP_DEFAULT_MTU; 512 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; 513 } ··· 1271 return len; 1272 } 1273 1274 static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) 1275 { 1276 struct l2cap_conf_opt *opt = *ptr; ··· 1358 return ptr - data; 1359 } 1360 1361 + static int l2cap_parse_conf_req(struct sock *sk, void *data) 1362 { 1363 struct l2cap_pinfo *pi = l2cap_pi(sk); 1364 + struct l2cap_conf_rsp *rsp = data; 1365 + void *ptr = rsp->data; 1366 + void *req = pi->conf_req; 1367 + int len = pi->conf_len; 1368 + int type, hint, olen; 1369 + unsigned long val; 1370 + u16 result = L2CAP_CONF_SUCCESS; 1371 1372 + BT_DBG("sk %p", sk); 1373 1374 + while (len >= L2CAP_CONF_OPT_SIZE) { 1375 + len -= l2cap_get_conf_opt(&req, &type, &olen, &val); 1376 1377 + hint = type & 0x80; 1378 + type &= 0x7f; 1379 + 1380 + switch (type) { 1381 + case L2CAP_CONF_MTU: 1382 + pi->conf_mtu = val; 1383 + break; 1384 + 1385 + case L2CAP_CONF_FLUSH_TO: 1386 + pi->flush_to = val; 1387 + break; 1388 + 1389 + case L2CAP_CONF_QOS: 1390 + break; 1391 + 1392 + default: 1393 + if (hint) 1394 + break; 1395 + 1396 + result = L2CAP_CONF_UNKNOWN; 1397 + *((u8 *) ptr++) = type; 1398 + break; 1399 + } 1400 + } 1401 + 1402 + if (result == L2CAP_CONF_SUCCESS) { 1403 + /* Configure output options and let the other side know 1404 + * which ones we don't like. */ 1405 + 1406 + if (pi->conf_mtu < pi->omtu) 1407 + result = L2CAP_CONF_UNACCEPT; 1408 + else 1409 + pi->omtu = pi->conf_mtu; 1410 + 1411 + l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); 1412 + } 1413 + 1414 + rsp->scid = cpu_to_le16(pi->dcid); 1415 + rsp->result = cpu_to_le16(result); 1416 + rsp->flags = cpu_to_le16(0x0000); 1417 + 1418 + return ptr - data; 1419 } 1420 1421 + static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags) 1422 { 1423 struct l2cap_conf_rsp *rsp = data; 1424 void *ptr = rsp->data; 1425 1426 + BT_DBG("sk %p", sk); 1427 1428 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); 1429 + rsp->result = cpu_to_le16(result); 1430 rsp->flags = cpu_to_le16(flags); 1431 1432 return ptr - data; ··· 1535 u16 dcid, flags; 1536 u8 rsp[64]; 1537 struct sock *sk; 1538 + int len; 1539 1540 dcid = __le16_to_cpu(req->dcid); 1541 flags = __le16_to_cpu(req->flags); ··· 1548 if (sk->sk_state == BT_DISCONN) 1549 goto unlock; 1550 1551 + /* Reject if config buffer is too small. */ 1552 + len = cmd->len - sizeof(*req); 1553 + if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) { 1554 + l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, 1555 + l2cap_build_conf_rsp(sk, rsp, 1556 + L2CAP_CONF_REJECT, flags), rsp); 1557 + goto unlock; 1558 + } 1559 + 1560 + /* Store config. */ 1561 + memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len); 1562 + l2cap_pi(sk)->conf_len += len; 1563 1564 if (flags & 0x0001) { 1565 /* Incomplete config. Send empty response. */ 1566 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, 1567 + l2cap_build_conf_rsp(sk, rsp, 1568 + L2CAP_CONF_SUCCESS, 0x0001), rsp); 1569 goto unlock; 1570 } 1571 1572 /* Complete config. */ 1573 + len = l2cap_parse_conf_req(sk, rsp); 1574 + if (len < 0) 1575 goto unlock; 1576 1577 + l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); 1578 + 1579 + /* Output config done. */ 1580 l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; 1581 + 1582 + /* Reset config buffer. */ 1583 + l2cap_pi(sk)->conf_len = 0; 1584 1585 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { 1586 sk->sk_state = BT_CONNECTED;