162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci BlueZ - Bluetooth protocol stack for Linux 362306a36Sopenharmony_ci Copyright (C) 2000-2001 Qualcomm Incorporated 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci This program is free software; you can redistribute it and/or modify 862306a36Sopenharmony_ci it under the terms of the GNU General Public License version 2 as 962306a36Sopenharmony_ci published by the Free Software Foundation; 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1262306a36Sopenharmony_ci OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1362306a36Sopenharmony_ci FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 1462306a36Sopenharmony_ci IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 1562306a36Sopenharmony_ci CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 1662306a36Sopenharmony_ci WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1762306a36Sopenharmony_ci ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1862306a36Sopenharmony_ci OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 2162306a36Sopenharmony_ci COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 2262306a36Sopenharmony_ci SOFTWARE IS DISCLAIMED. 2362306a36Sopenharmony_ci*/ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* Bluetooth kernel library. */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define pr_fmt(fmt) "Bluetooth: " fmt 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include <linux/export.h> 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#include <net/bluetooth/bluetooth.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_civoid baswap(bdaddr_t *dst, const bdaddr_t *src) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci const unsigned char *s = (const unsigned char *)src; 3662306a36Sopenharmony_ci unsigned char *d = (unsigned char *)dst; 3762306a36Sopenharmony_ci unsigned int i; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci for (i = 0; i < 6; i++) 4062306a36Sopenharmony_ci d[i] = s[5 - i]; 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ciEXPORT_SYMBOL(baswap); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* Bluetooth error codes to Unix errno mapping */ 4562306a36Sopenharmony_ciint bt_to_errno(__u16 code) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci switch (code) { 4862306a36Sopenharmony_ci case 0: 4962306a36Sopenharmony_ci return 0; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci case 0x01: 5262306a36Sopenharmony_ci return EBADRQC; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci case 0x02: 5562306a36Sopenharmony_ci return ENOTCONN; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci case 0x03: 5862306a36Sopenharmony_ci return EIO; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci case 0x04: 6162306a36Sopenharmony_ci case 0x3c: 6262306a36Sopenharmony_ci return EHOSTDOWN; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci case 0x05: 6562306a36Sopenharmony_ci return EACCES; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci case 0x06: 6862306a36Sopenharmony_ci return EBADE; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci case 0x07: 7162306a36Sopenharmony_ci return ENOMEM; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci case 0x08: 7462306a36Sopenharmony_ci return ETIMEDOUT; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci case 0x09: 7762306a36Sopenharmony_ci return EMLINK; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci case 0x0a: 8062306a36Sopenharmony_ci return EMLINK; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci case 0x0b: 8362306a36Sopenharmony_ci return EALREADY; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci case 0x0c: 8662306a36Sopenharmony_ci return EBUSY; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci case 0x0d: 8962306a36Sopenharmony_ci case 0x0e: 9062306a36Sopenharmony_ci case 0x0f: 9162306a36Sopenharmony_ci return ECONNREFUSED; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci case 0x10: 9462306a36Sopenharmony_ci return ETIMEDOUT; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci case 0x11: 9762306a36Sopenharmony_ci case 0x27: 9862306a36Sopenharmony_ci case 0x29: 9962306a36Sopenharmony_ci case 0x20: 10062306a36Sopenharmony_ci return EOPNOTSUPP; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci case 0x12: 10362306a36Sopenharmony_ci return EINVAL; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci case 0x13: 10662306a36Sopenharmony_ci case 0x14: 10762306a36Sopenharmony_ci case 0x15: 10862306a36Sopenharmony_ci return ECONNRESET; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci case 0x16: 11162306a36Sopenharmony_ci return ECONNABORTED; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci case 0x17: 11462306a36Sopenharmony_ci return ELOOP; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci case 0x18: 11762306a36Sopenharmony_ci return EACCES; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci case 0x1a: 12062306a36Sopenharmony_ci return EPROTONOSUPPORT; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci case 0x1b: 12362306a36Sopenharmony_ci return ECONNREFUSED; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci case 0x19: 12662306a36Sopenharmony_ci case 0x1e: 12762306a36Sopenharmony_ci case 0x23: 12862306a36Sopenharmony_ci case 0x24: 12962306a36Sopenharmony_ci case 0x25: 13062306a36Sopenharmony_ci return EPROTO; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci default: 13362306a36Sopenharmony_ci return ENOSYS; 13462306a36Sopenharmony_ci } 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ciEXPORT_SYMBOL(bt_to_errno); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* Unix errno to Bluetooth error codes mapping */ 13962306a36Sopenharmony_ci__u8 bt_status(int err) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci /* Don't convert if already positive value */ 14262306a36Sopenharmony_ci if (err >= 0) 14362306a36Sopenharmony_ci return err; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci switch (err) { 14662306a36Sopenharmony_ci case -EBADRQC: 14762306a36Sopenharmony_ci return 0x01; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci case -ENOTCONN: 15062306a36Sopenharmony_ci return 0x02; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci case -EIO: 15362306a36Sopenharmony_ci return 0x03; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci case -EHOSTDOWN: 15662306a36Sopenharmony_ci return 0x04; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci case -EACCES: 15962306a36Sopenharmony_ci return 0x05; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci case -EBADE: 16262306a36Sopenharmony_ci return 0x06; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci case -ENOMEM: 16562306a36Sopenharmony_ci return 0x07; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci case -ETIMEDOUT: 16862306a36Sopenharmony_ci return 0x08; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci case -EMLINK: 17162306a36Sopenharmony_ci return 0x09; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci case -EALREADY: 17462306a36Sopenharmony_ci return 0x0b; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci case -EBUSY: 17762306a36Sopenharmony_ci return 0x0c; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci case -ECONNREFUSED: 18062306a36Sopenharmony_ci return 0x0d; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci case -EOPNOTSUPP: 18362306a36Sopenharmony_ci return 0x11; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci case -EINVAL: 18662306a36Sopenharmony_ci return 0x12; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci case -ECONNRESET: 18962306a36Sopenharmony_ci return 0x13; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci case -ECONNABORTED: 19262306a36Sopenharmony_ci return 0x16; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci case -ELOOP: 19562306a36Sopenharmony_ci return 0x17; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci case -EPROTONOSUPPORT: 19862306a36Sopenharmony_ci return 0x1a; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci case -EPROTO: 20162306a36Sopenharmony_ci return 0x19; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci default: 20462306a36Sopenharmony_ci return 0x1f; 20562306a36Sopenharmony_ci } 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_ciEXPORT_SYMBOL(bt_status); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_civoid bt_info(const char *format, ...) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci struct va_format vaf; 21262306a36Sopenharmony_ci va_list args; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci va_start(args, format); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci vaf.fmt = format; 21762306a36Sopenharmony_ci vaf.va = &args; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci pr_info("%pV", &vaf); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci va_end(args); 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ciEXPORT_SYMBOL(bt_info); 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_civoid bt_warn(const char *format, ...) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct va_format vaf; 22862306a36Sopenharmony_ci va_list args; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci va_start(args, format); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci vaf.fmt = format; 23362306a36Sopenharmony_ci vaf.va = &args; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci pr_warn("%pV", &vaf); 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci va_end(args); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ciEXPORT_SYMBOL(bt_warn); 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_civoid bt_err(const char *format, ...) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci struct va_format vaf; 24462306a36Sopenharmony_ci va_list args; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci va_start(args, format); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci vaf.fmt = format; 24962306a36Sopenharmony_ci vaf.va = &args; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci pr_err("%pV", &vaf); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci va_end(args); 25462306a36Sopenharmony_ci} 25562306a36Sopenharmony_ciEXPORT_SYMBOL(bt_err); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#ifdef CONFIG_BT_FEATURE_DEBUG 25862306a36Sopenharmony_cistatic bool debug_enable; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_civoid bt_dbg_set(bool enable) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci debug_enable = enable; 26362306a36Sopenharmony_ci} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cibool bt_dbg_get(void) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci return debug_enable; 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_civoid bt_dbg(const char *format, ...) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci struct va_format vaf; 27362306a36Sopenharmony_ci va_list args; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci if (likely(!debug_enable)) 27662306a36Sopenharmony_ci return; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci va_start(args, format); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci vaf.fmt = format; 28162306a36Sopenharmony_ci vaf.va = &args; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci printk(KERN_DEBUG pr_fmt("%pV"), &vaf); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci va_end(args); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ciEXPORT_SYMBOL(bt_dbg); 28862306a36Sopenharmony_ci#endif 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_civoid bt_warn_ratelimited(const char *format, ...) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci struct va_format vaf; 29362306a36Sopenharmony_ci va_list args; 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci va_start(args, format); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci vaf.fmt = format; 29862306a36Sopenharmony_ci vaf.va = &args; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci pr_warn_ratelimited("%pV", &vaf); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci va_end(args); 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ciEXPORT_SYMBOL(bt_warn_ratelimited); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_civoid bt_err_ratelimited(const char *format, ...) 30762306a36Sopenharmony_ci{ 30862306a36Sopenharmony_ci struct va_format vaf; 30962306a36Sopenharmony_ci va_list args; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci va_start(args, format); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci vaf.fmt = format; 31462306a36Sopenharmony_ci vaf.va = &args; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci pr_err_ratelimited("%pV", &vaf); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci va_end(args); 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ciEXPORT_SYMBOL(bt_err_ratelimited); 321