forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
4.0 KiB
249 lines
4.0 KiB
/* |
|
BlueZ - Bluetooth protocol stack for Linux |
|
Copyright (C) 2000-2001 Qualcomm Incorporated |
|
|
|
Written 2000,2001 by Maxim Krasnyansky <[email protected]> |
|
|
|
This program is free software; you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License version 2 as |
|
published by the Free Software Foundation; |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. |
|
IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY |
|
CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES |
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
|
|
ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, |
|
COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS |
|
SOFTWARE IS DISCLAIMED. |
|
*/ |
|
|
|
/* Bluetooth kernel library. */ |
|
|
|
#define pr_fmt(fmt) "Bluetooth: " fmt |
|
|
|
#include <linux/export.h> |
|
|
|
#include <net/bluetooth/bluetooth.h> |
|
|
|
void baswap(bdaddr_t *dst, const bdaddr_t *src) |
|
{ |
|
const unsigned char *s = (const unsigned char *)src; |
|
unsigned char *d = (unsigned char *)dst; |
|
unsigned int i; |
|
|
|
for (i = 0; i < 6; i++) |
|
d[i] = s[5 - i]; |
|
} |
|
EXPORT_SYMBOL(baswap); |
|
|
|
/* Bluetooth error codes to Unix errno mapping */ |
|
int bt_to_errno(__u16 code) |
|
{ |
|
switch (code) { |
|
case 0: |
|
return 0; |
|
|
|
case 0x01: |
|
return EBADRQC; |
|
|
|
case 0x02: |
|
return ENOTCONN; |
|
|
|
case 0x03: |
|
return EIO; |
|
|
|
case 0x04: |
|
case 0x3c: |
|
return EHOSTDOWN; |
|
|
|
case 0x05: |
|
return EACCES; |
|
|
|
case 0x06: |
|
return EBADE; |
|
|
|
case 0x07: |
|
return ENOMEM; |
|
|
|
case 0x08: |
|
return ETIMEDOUT; |
|
|
|
case 0x09: |
|
return EMLINK; |
|
|
|
case 0x0a: |
|
return EMLINK; |
|
|
|
case 0x0b: |
|
return EALREADY; |
|
|
|
case 0x0c: |
|
return EBUSY; |
|
|
|
case 0x0d: |
|
case 0x0e: |
|
case 0x0f: |
|
return ECONNREFUSED; |
|
|
|
case 0x10: |
|
return ETIMEDOUT; |
|
|
|
case 0x11: |
|
case 0x27: |
|
case 0x29: |
|
case 0x20: |
|
return EOPNOTSUPP; |
|
|
|
case 0x12: |
|
return EINVAL; |
|
|
|
case 0x13: |
|
case 0x14: |
|
case 0x15: |
|
return ECONNRESET; |
|
|
|
case 0x16: |
|
return ECONNABORTED; |
|
|
|
case 0x17: |
|
return ELOOP; |
|
|
|
case 0x18: |
|
return EACCES; |
|
|
|
case 0x1a: |
|
return EPROTONOSUPPORT; |
|
|
|
case 0x1b: |
|
return ECONNREFUSED; |
|
|
|
case 0x19: |
|
case 0x1e: |
|
case 0x23: |
|
case 0x24: |
|
case 0x25: |
|
return EPROTO; |
|
|
|
default: |
|
return ENOSYS; |
|
} |
|
} |
|
EXPORT_SYMBOL(bt_to_errno); |
|
|
|
void bt_info(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
pr_info("%pV", &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_info); |
|
|
|
void bt_warn(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
pr_warn("%pV", &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_warn); |
|
|
|
void bt_err(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
pr_err("%pV", &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_err); |
|
|
|
#ifdef CONFIG_BT_FEATURE_DEBUG |
|
static bool debug_enable; |
|
|
|
void bt_dbg_set(bool enable) |
|
{ |
|
debug_enable = enable; |
|
} |
|
|
|
bool bt_dbg_get(void) |
|
{ |
|
return debug_enable; |
|
} |
|
|
|
void bt_dbg(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
if (likely(!debug_enable)) |
|
return; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
printk(KERN_DEBUG pr_fmt("%pV"), &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_dbg); |
|
#endif |
|
|
|
void bt_warn_ratelimited(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
pr_warn_ratelimited("%pV", &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_warn_ratelimited); |
|
|
|
void bt_err_ratelimited(const char *format, ...) |
|
{ |
|
struct va_format vaf; |
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
vaf.fmt = format; |
|
vaf.va = &args; |
|
|
|
pr_err_ratelimited("%pV", &vaf); |
|
|
|
va_end(args); |
|
} |
|
EXPORT_SYMBOL(bt_err_ratelimited);
|
|
|