18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci BlueZ - Bluetooth protocol stack for Linux 38c2ecf20Sopenharmony_ci Copyright (C) 2000-2001 Qualcomm Incorporated 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci This program is free software; you can redistribute it and/or modify 88c2ecf20Sopenharmony_ci it under the terms of the GNU General Public License version 2 as 98c2ecf20Sopenharmony_ci published by the Free Software Foundation; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 128c2ecf20Sopenharmony_ci OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 138c2ecf20Sopenharmony_ci FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 148c2ecf20Sopenharmony_ci IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 158c2ecf20Sopenharmony_ci CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 168c2ecf20Sopenharmony_ci WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 178c2ecf20Sopenharmony_ci ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 188c2ecf20Sopenharmony_ci OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 218c2ecf20Sopenharmony_ci COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 228c2ecf20Sopenharmony_ci SOFTWARE IS DISCLAIMED. 238c2ecf20Sopenharmony_ci*/ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/* Bluetooth kernel library. */ 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define pr_fmt(fmt) "Bluetooth: " fmt 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#include <linux/export.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <net/bluetooth/bluetooth.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_civoid baswap(bdaddr_t *dst, const bdaddr_t *src) 348c2ecf20Sopenharmony_ci{ 358c2ecf20Sopenharmony_ci const unsigned char *s = (const unsigned char *)src; 368c2ecf20Sopenharmony_ci unsigned char *d = (unsigned char *)dst; 378c2ecf20Sopenharmony_ci unsigned int i; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci for (i = 0; i < 6; i++) 408c2ecf20Sopenharmony_ci d[i] = s[5 - i]; 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ciEXPORT_SYMBOL(baswap); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/* Bluetooth error codes to Unix errno mapping */ 458c2ecf20Sopenharmony_ciint bt_to_errno(__u16 code) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci switch (code) { 488c2ecf20Sopenharmony_ci case 0: 498c2ecf20Sopenharmony_ci return 0; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci case 0x01: 528c2ecf20Sopenharmony_ci return EBADRQC; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci case 0x02: 558c2ecf20Sopenharmony_ci return ENOTCONN; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci case 0x03: 588c2ecf20Sopenharmony_ci return EIO; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci case 0x04: 618c2ecf20Sopenharmony_ci case 0x3c: 628c2ecf20Sopenharmony_ci return EHOSTDOWN; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci case 0x05: 658c2ecf20Sopenharmony_ci return EACCES; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci case 0x06: 688c2ecf20Sopenharmony_ci return EBADE; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci case 0x07: 718c2ecf20Sopenharmony_ci return ENOMEM; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci case 0x08: 748c2ecf20Sopenharmony_ci return ETIMEDOUT; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci case 0x09: 778c2ecf20Sopenharmony_ci return EMLINK; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci case 0x0a: 808c2ecf20Sopenharmony_ci return EMLINK; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci case 0x0b: 838c2ecf20Sopenharmony_ci return EALREADY; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci case 0x0c: 868c2ecf20Sopenharmony_ci return EBUSY; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci case 0x0d: 898c2ecf20Sopenharmony_ci case 0x0e: 908c2ecf20Sopenharmony_ci case 0x0f: 918c2ecf20Sopenharmony_ci return ECONNREFUSED; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci case 0x10: 948c2ecf20Sopenharmony_ci return ETIMEDOUT; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci case 0x11: 978c2ecf20Sopenharmony_ci case 0x27: 988c2ecf20Sopenharmony_ci case 0x29: 998c2ecf20Sopenharmony_ci case 0x20: 1008c2ecf20Sopenharmony_ci return EOPNOTSUPP; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci case 0x12: 1038c2ecf20Sopenharmony_ci return EINVAL; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci case 0x13: 1068c2ecf20Sopenharmony_ci case 0x14: 1078c2ecf20Sopenharmony_ci case 0x15: 1088c2ecf20Sopenharmony_ci return ECONNRESET; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci case 0x16: 1118c2ecf20Sopenharmony_ci return ECONNABORTED; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci case 0x17: 1148c2ecf20Sopenharmony_ci return ELOOP; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci case 0x18: 1178c2ecf20Sopenharmony_ci return EACCES; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci case 0x1a: 1208c2ecf20Sopenharmony_ci return EPROTONOSUPPORT; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci case 0x1b: 1238c2ecf20Sopenharmony_ci return ECONNREFUSED; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci case 0x19: 1268c2ecf20Sopenharmony_ci case 0x1e: 1278c2ecf20Sopenharmony_ci case 0x23: 1288c2ecf20Sopenharmony_ci case 0x24: 1298c2ecf20Sopenharmony_ci case 0x25: 1308c2ecf20Sopenharmony_ci return EPROTO; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci default: 1338c2ecf20Sopenharmony_ci return ENOSYS; 1348c2ecf20Sopenharmony_ci } 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_to_errno); 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_civoid bt_info(const char *format, ...) 1398c2ecf20Sopenharmony_ci{ 1408c2ecf20Sopenharmony_ci struct va_format vaf; 1418c2ecf20Sopenharmony_ci va_list args; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci va_start(args, format); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci vaf.fmt = format; 1468c2ecf20Sopenharmony_ci vaf.va = &args; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci pr_info("%pV", &vaf); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci va_end(args); 1518c2ecf20Sopenharmony_ci} 1528c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_info); 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_civoid bt_warn(const char *format, ...) 1558c2ecf20Sopenharmony_ci{ 1568c2ecf20Sopenharmony_ci struct va_format vaf; 1578c2ecf20Sopenharmony_ci va_list args; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci va_start(args, format); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci vaf.fmt = format; 1628c2ecf20Sopenharmony_ci vaf.va = &args; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci pr_warn("%pV", &vaf); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci va_end(args); 1678c2ecf20Sopenharmony_ci} 1688c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_warn); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_civoid bt_err(const char *format, ...) 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci struct va_format vaf; 1738c2ecf20Sopenharmony_ci va_list args; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci va_start(args, format); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci vaf.fmt = format; 1788c2ecf20Sopenharmony_ci vaf.va = &args; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci pr_err("%pV", &vaf); 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci va_end(args); 1838c2ecf20Sopenharmony_ci} 1848c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_err); 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci#ifdef CONFIG_BT_FEATURE_DEBUG 1878c2ecf20Sopenharmony_cistatic bool debug_enable; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_civoid bt_dbg_set(bool enable) 1908c2ecf20Sopenharmony_ci{ 1918c2ecf20Sopenharmony_ci debug_enable = enable; 1928c2ecf20Sopenharmony_ci} 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cibool bt_dbg_get(void) 1958c2ecf20Sopenharmony_ci{ 1968c2ecf20Sopenharmony_ci return debug_enable; 1978c2ecf20Sopenharmony_ci} 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_civoid bt_dbg(const char *format, ...) 2008c2ecf20Sopenharmony_ci{ 2018c2ecf20Sopenharmony_ci struct va_format vaf; 2028c2ecf20Sopenharmony_ci va_list args; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci if (likely(!debug_enable)) 2058c2ecf20Sopenharmony_ci return; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci va_start(args, format); 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci vaf.fmt = format; 2108c2ecf20Sopenharmony_ci vaf.va = &args; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci printk(KERN_DEBUG pr_fmt("%pV"), &vaf); 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci va_end(args); 2158c2ecf20Sopenharmony_ci} 2168c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_dbg); 2178c2ecf20Sopenharmony_ci#endif 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_civoid bt_warn_ratelimited(const char *format, ...) 2208c2ecf20Sopenharmony_ci{ 2218c2ecf20Sopenharmony_ci struct va_format vaf; 2228c2ecf20Sopenharmony_ci va_list args; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci va_start(args, format); 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci vaf.fmt = format; 2278c2ecf20Sopenharmony_ci vaf.va = &args; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci pr_warn_ratelimited("%pV", &vaf); 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci va_end(args); 2328c2ecf20Sopenharmony_ci} 2338c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_warn_ratelimited); 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_civoid bt_err_ratelimited(const char *format, ...) 2368c2ecf20Sopenharmony_ci{ 2378c2ecf20Sopenharmony_ci struct va_format vaf; 2388c2ecf20Sopenharmony_ci va_list args; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci va_start(args, format); 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci vaf.fmt = format; 2438c2ecf20Sopenharmony_ci vaf.va = &args; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci pr_err_ratelimited("%pV", &vaf); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci va_end(args); 2488c2ecf20Sopenharmony_ci} 2498c2ecf20Sopenharmony_ciEXPORT_SYMBOL(bt_err_ratelimited); 250