.. | .. |
---|
41 | 41 | #define BLUETOOTH_VER_1_1 1 |
---|
42 | 42 | #define BLUETOOTH_VER_1_2 2 |
---|
43 | 43 | #define BLUETOOTH_VER_2_0 3 |
---|
| 44 | +#define BLUETOOTH_VER_2_1 4 |
---|
| 45 | +#define BLUETOOTH_VER_4_0 6 |
---|
44 | 46 | |
---|
45 | 47 | /* Reserv for core and drivers use */ |
---|
46 | 48 | #define BT_SKB_RESERVE 8 |
---|
.. | .. |
---|
121 | 123 | |
---|
122 | 124 | #define BT_SNDMTU 12 |
---|
123 | 125 | #define BT_RCVMTU 13 |
---|
| 126 | +#define BT_PHY 14 |
---|
| 127 | + |
---|
| 128 | +#define BT_PHY_BR_1M_1SLOT 0x00000001 |
---|
| 129 | +#define BT_PHY_BR_1M_3SLOT 0x00000002 |
---|
| 130 | +#define BT_PHY_BR_1M_5SLOT 0x00000004 |
---|
| 131 | +#define BT_PHY_EDR_2M_1SLOT 0x00000008 |
---|
| 132 | +#define BT_PHY_EDR_2M_3SLOT 0x00000010 |
---|
| 133 | +#define BT_PHY_EDR_2M_5SLOT 0x00000020 |
---|
| 134 | +#define BT_PHY_EDR_3M_1SLOT 0x00000040 |
---|
| 135 | +#define BT_PHY_EDR_3M_3SLOT 0x00000080 |
---|
| 136 | +#define BT_PHY_EDR_3M_5SLOT 0x00000100 |
---|
| 137 | +#define BT_PHY_LE_1M_TX 0x00000200 |
---|
| 138 | +#define BT_PHY_LE_1M_RX 0x00000400 |
---|
| 139 | +#define BT_PHY_LE_2M_TX 0x00000800 |
---|
| 140 | +#define BT_PHY_LE_2M_RX 0x00001000 |
---|
| 141 | +#define BT_PHY_LE_CODED_TX 0x00002000 |
---|
| 142 | +#define BT_PHY_LE_CODED_RX 0x00004000 |
---|
| 143 | + |
---|
| 144 | +#define BT_MODE 15 |
---|
| 145 | + |
---|
| 146 | +#define BT_MODE_BASIC 0x00 |
---|
| 147 | +#define BT_MODE_ERTM 0x01 |
---|
| 148 | +#define BT_MODE_STREAMING 0x02 |
---|
| 149 | +#define BT_MODE_LE_FLOWCTL 0x03 |
---|
| 150 | +#define BT_MODE_EXT_FLOWCTL 0x04 |
---|
| 151 | + |
---|
| 152 | +#define BT_PKT_STATUS 16 |
---|
| 153 | + |
---|
| 154 | +#define BT_SCM_PKT_STATUS 0x03 |
---|
124 | 155 | |
---|
125 | 156 | __printf(1, 2) |
---|
126 | 157 | void bt_info(const char *fmt, ...); |
---|
.. | .. |
---|
128 | 159 | void bt_warn(const char *fmt, ...); |
---|
129 | 160 | __printf(1, 2) |
---|
130 | 161 | void bt_err(const char *fmt, ...); |
---|
| 162 | +#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG) |
---|
| 163 | +void bt_dbg_set(bool enable); |
---|
| 164 | +bool bt_dbg_get(void); |
---|
| 165 | +__printf(1, 2) |
---|
| 166 | +void bt_dbg(const char *fmt, ...); |
---|
| 167 | +#endif |
---|
| 168 | +__printf(1, 2) |
---|
| 169 | +void bt_warn_ratelimited(const char *fmt, ...); |
---|
131 | 170 | __printf(1, 2) |
---|
132 | 171 | void bt_err_ratelimited(const char *fmt, ...); |
---|
133 | 172 | |
---|
134 | 173 | #define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__) |
---|
135 | 174 | #define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__) |
---|
136 | 175 | #define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__) |
---|
137 | | -#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__) |
---|
138 | 176 | |
---|
139 | | -#define BT_ERR_RATELIMITED(fmt, ...) bt_err_ratelimited(fmt "\n", ##__VA_ARGS__) |
---|
| 177 | +#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG) |
---|
| 178 | +#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__) |
---|
| 179 | +#else |
---|
| 180 | +#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__) |
---|
| 181 | +#endif |
---|
| 182 | + |
---|
| 183 | +#define bt_dev_name(hdev) ((hdev) ? (hdev)->name : "null") |
---|
140 | 184 | |
---|
141 | 185 | #define bt_dev_info(hdev, fmt, ...) \ |
---|
142 | | - BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
---|
| 186 | + BT_INFO("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
143 | 187 | #define bt_dev_warn(hdev, fmt, ...) \ |
---|
144 | | - BT_WARN("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
---|
| 188 | + BT_WARN("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
145 | 189 | #define bt_dev_err(hdev, fmt, ...) \ |
---|
146 | | - BT_ERR("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
---|
| 190 | + BT_ERR("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
147 | 191 | #define bt_dev_dbg(hdev, fmt, ...) \ |
---|
148 | | - BT_DBG("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
---|
| 192 | + BT_DBG("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
149 | 193 | |
---|
| 194 | +#define bt_dev_warn_ratelimited(hdev, fmt, ...) \ |
---|
| 195 | + bt_warn_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
150 | 196 | #define bt_dev_err_ratelimited(hdev, fmt, ...) \ |
---|
151 | | - BT_ERR_RATELIMITED("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
---|
| 197 | + bt_err_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
---|
152 | 198 | |
---|
153 | 199 | /* Connection and socket states */ |
---|
154 | 200 | enum { |
---|
.. | .. |
---|
248 | 294 | struct sock *parent; |
---|
249 | 295 | unsigned long flags; |
---|
250 | 296 | void (*skb_msg_name)(struct sk_buff *, void *, int *); |
---|
| 297 | + void (*skb_put_cmsg)(struct sk_buff *, struct msghdr *, struct sock *); |
---|
251 | 298 | }; |
---|
252 | 299 | |
---|
253 | 300 | enum { |
---|
.. | .. |
---|
297 | 344 | struct l2cap_chan *chan; |
---|
298 | 345 | }; |
---|
299 | 346 | |
---|
| 347 | +struct sco_ctrl { |
---|
| 348 | + u8 pkt_status; |
---|
| 349 | +}; |
---|
| 350 | + |
---|
300 | 351 | struct hci_dev; |
---|
301 | 352 | |
---|
302 | 353 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode); |
---|
.. | .. |
---|
323 | 374 | u8 incoming:1; |
---|
324 | 375 | union { |
---|
325 | 376 | struct l2cap_ctrl l2cap; |
---|
| 377 | + struct sco_ctrl sco; |
---|
326 | 378 | struct hci_ctrl hci; |
---|
327 | 379 | }; |
---|
328 | 380 | }; |
---|
.. | .. |
---|
370 | 422 | return NULL; |
---|
371 | 423 | } |
---|
372 | 424 | |
---|
| 425 | +/* Shall not be called with lock_sock held */ |
---|
| 426 | +static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk, |
---|
| 427 | + struct msghdr *msg, |
---|
| 428 | + size_t len, size_t mtu, |
---|
| 429 | + size_t headroom, size_t tailroom) |
---|
| 430 | +{ |
---|
| 431 | + struct sk_buff *skb; |
---|
| 432 | + size_t size = min_t(size_t, len, mtu); |
---|
| 433 | + int err; |
---|
| 434 | + |
---|
| 435 | + skb = bt_skb_send_alloc(sk, size + headroom + tailroom, |
---|
| 436 | + msg->msg_flags & MSG_DONTWAIT, &err); |
---|
| 437 | + if (!skb) |
---|
| 438 | + return ERR_PTR(err); |
---|
| 439 | + |
---|
| 440 | + skb_reserve(skb, headroom); |
---|
| 441 | + skb_tailroom_reserve(skb, mtu, tailroom); |
---|
| 442 | + |
---|
| 443 | + if (!copy_from_iter_full(skb_put(skb, size), size, &msg->msg_iter)) { |
---|
| 444 | + kfree_skb(skb); |
---|
| 445 | + return ERR_PTR(-EFAULT); |
---|
| 446 | + } |
---|
| 447 | + |
---|
| 448 | + skb->priority = sk->sk_priority; |
---|
| 449 | + |
---|
| 450 | + return skb; |
---|
| 451 | +} |
---|
| 452 | + |
---|
| 453 | +/* Similar to bt_skb_sendmsg but can split the msg into multiple fragments |
---|
| 454 | + * accourding to the MTU. |
---|
| 455 | + */ |
---|
| 456 | +static inline struct sk_buff *bt_skb_sendmmsg(struct sock *sk, |
---|
| 457 | + struct msghdr *msg, |
---|
| 458 | + size_t len, size_t mtu, |
---|
| 459 | + size_t headroom, size_t tailroom) |
---|
| 460 | +{ |
---|
| 461 | + struct sk_buff *skb, **frag; |
---|
| 462 | + |
---|
| 463 | + skb = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom); |
---|
| 464 | + if (IS_ERR_OR_NULL(skb)) |
---|
| 465 | + return skb; |
---|
| 466 | + |
---|
| 467 | + len -= skb->len; |
---|
| 468 | + if (!len) |
---|
| 469 | + return skb; |
---|
| 470 | + |
---|
| 471 | + /* Add remaining data over MTU as continuation fragments */ |
---|
| 472 | + frag = &skb_shinfo(skb)->frag_list; |
---|
| 473 | + while (len) { |
---|
| 474 | + struct sk_buff *tmp; |
---|
| 475 | + |
---|
| 476 | + tmp = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom); |
---|
| 477 | + if (IS_ERR(tmp)) { |
---|
| 478 | + return skb; |
---|
| 479 | + } |
---|
| 480 | + |
---|
| 481 | + len -= tmp->len; |
---|
| 482 | + |
---|
| 483 | + *frag = tmp; |
---|
| 484 | + frag = &(*frag)->next; |
---|
| 485 | + } |
---|
| 486 | + |
---|
| 487 | + return skb; |
---|
| 488 | +} |
---|
| 489 | + |
---|
373 | 490 | int bt_to_errno(u16 code); |
---|
374 | 491 | |
---|
375 | 492 | void hci_sock_set_flag(struct sock *sk, int nr); |
---|