From b1af04341adc860d3601ab8487f73a6c955066a7 Mon Sep 17 00:00:00 2001 From: hwg Date: Thu, 1 Dec 2011 09:44:09 +0800 Subject: [PATCH] delete drivers/net/wireless/ar6003/host/tools/ dir --- .../net/wireless/ar6003/host/tools/Android.mk | 27 - .../ar6003/host/tools/athbtfilter/Android.mk | 28 - .../host/tools/athbtfilter/Android_Readme | 7 - .../host/tools/athbtfilter/bluez/Android.mk | 100 - .../host/tools/athbtfilter/bluez/Makefile | 96 - .../athbtfilter/bluez/abtfilt_bluez_dbus.c | 2634 --------- .../athbtfilter/bluez/abtfilt_bluez_dbus.h | 93 - .../bluez/abtfilt_bluez_dbus_glib.c | 1855 ------ .../bluez/abtfilt_bluez_dbus_glib.h | 68 - .../bluez/abtfilt_bluez_hciutils.c | 382 -- .../tools/athbtfilter/bluez/abtfilt_core.c | 1422 ----- .../tools/athbtfilter/bluez/abtfilt_int.h | 281 - .../tools/athbtfilter/bluez/abtfilt_main.c | 237 - .../tools/athbtfilter/bluez/abtfilt_utils.c | 320 -- .../tools/athbtfilter/bluez/abtfilt_wlan.c | 836 --- .../host/tools/athbtfilter/bluez/btdefs.h | 152 - .../tools/athbtfilter/bluez/btfilter_action.c | 640 --- .../tools/athbtfilter/bluez/btfilter_core.c | 620 -- .../tools/athbtfilter/bluez/btfilter_core.h | 204 - .../host/tools/athbtfilter/bluez/hciutils.h | 103 - .../host/tools/athbtfilter/bluez/sample.conf | 1 - .../bluez/testscripts/bthmonoheadset.py | 59 - .../bluez/testscripts/bthstereoheadset.py | 49 - .../bluez/testscripts/btmonoloop.sh | 10 - .../bluez/testscripts/btplaywav.sh | 10 - .../bluez/testscripts/fc9_setup_readme.txt | 165 - .../bluez/testscripts/linux_setup_readme.txt | 188 - .../host/tools/athbtfilter/bluez/wireless.h | 1121 ---- .../ar6003/host/tools/athbtfilter/filter.sh | 24 - .../ar6003/host/tools/drvdebugctrl/Android.mk | 39 - .../ar6003/host/tools/drvdebugctrl/Makefile | 5 - .../host/tools/drvdebugctrl/debugctrl.c | 299 - .../ar6003/host/tools/recEvent/Android.mk | 43 - .../ar6003/host/tools/recEvent/Makefile | 27 - .../ar6003/host/tools/recEvent/dbgFormatter.c | 1790 ------ .../ar6003/host/tools/recEvent/recEvent.c | 950 --- .../ar6003/host/tools/recEvent/restore.sh | 31 - .../host/tools/recEvent/wireless_copy.h | 1142 ---- .../ar6003/host/tools/sigma-dut/Android.mk | 77 - .../ar6003/host/tools/sigma-dut/Makefile | 45 - .../wireless/ar6003/host/tools/sigma-dut/ap.c | 907 --- .../ar6003/host/tools/sigma-dut/atheros.c | 68 - .../ar6003/host/tools/sigma-dut/basic.c | 106 - .../ar6003/host/tools/sigma-dut/cmds_reg.c | 40 - .../ar6003/host/tools/sigma-dut/os_unix.c | 474 -- .../ar6003/host/tools/sigma-dut/p2p.c | 1831 ------ .../ar6003/host/tools/sigma-dut/powerswitch.c | 48 - .../ar6003/host/tools/sigma-dut/sigma_dut.c | 649 --- .../ar6003/host/tools/sigma-dut/sigma_dut.h | 292 - .../ar6003/host/tools/sigma-dut/sta.c | 1863 ------ .../ar6003/host/tools/sigma-dut/traffic.c | 194 - .../host/tools/sigma-dut/traffic_agent.c | 916 --- .../ar6003/host/tools/sigma-dut/wfa_agt.h | 58 - .../ar6003/host/tools/sigma-dut/wfa_agtctrl.h | 70 - .../ar6003/host/tools/sigma-dut/wfa_ca.h | 148 - .../ar6003/host/tools/sigma-dut/wfa_cmds.h | 688 --- .../ar6003/host/tools/sigma-dut/wfa_cmdtbl.c | 197 - .../ar6003/host/tools/sigma-dut/wfa_cs.c | 3196 ----------- .../ar6003/host/tools/sigma-dut/wfa_debug.h | 78 - .../ar6003/host/tools/sigma-dut/wfa_main.h | 109 - .../ar6003/host/tools/sigma-dut/wfa_miscs.h | 68 - .../ar6003/host/tools/sigma-dut/wfa_p2p.h | 109 - .../ar6003/host/tools/sigma-dut/wfa_portall.h | 165 - .../ar6003/host/tools/sigma-dut/wfa_rsp.h | 161 - .../ar6003/host/tools/sigma-dut/wfa_sock.h | 105 - .../ar6003/host/tools/sigma-dut/wfa_stdincs.h | 23 - .../ar6003/host/tools/sigma-dut/wfa_tg.c | 1324 ----- .../ar6003/host/tools/sigma-dut/wfa_tg.h | 280 - .../ar6003/host/tools/sigma-dut/wfa_thr.c | 1114 ---- .../ar6003/host/tools/sigma-dut/wfa_tlv.c | 206 - .../ar6003/host/tools/sigma-dut/wfa_tlv.h | 290 - .../ar6003/host/tools/sigma-dut/wfa_types.h | 111 - .../ar6003/host/tools/sigma-dut/wfa_utils.h | 61 - .../ar6003/host/tools/sigma-dut/wfa_ver.h | 64 - .../ar6003/host/tools/sigma-dut/wfa_wmmps.c | 896 --- .../ar6003/host/tools/sigma-dut/wfa_wmmps.h | 242 - .../ar6003/host/tools/sigma-dut/wlantest.c | 1118 ---- .../host/tools/sigma-dut/wlantest_ctrl.h | 167 - .../ar6003/host/tools/sigma-dut/wpa_ctrl.c | 558 -- .../ar6003/host/tools/sigma-dut/wpa_ctrl.h | 295 - .../ar6003/host/tools/sigma-dut/wpa_helpers.c | 431 -- .../ar6003/host/tools/sigma-dut/wpa_helpers.h | 35 - .../ar6003/host/tools/wlan_tool/Android.mk | 37 - .../ar6003/host/tools/wlan_tool/wlan_tool | 351 -- .../ar6003/host/tools/wmiconfig/Android.mk | 40 - .../ar6003/host/tools/wmiconfig/Makefile | 53 - .../ar6003/host/tools/wmiconfig/wmiconfig.c | 5108 ----------------- .../ar6003/host/tools/wmiconfig/wmiconfig.h | 543 -- 88 files changed, 42067 deletions(-) delete mode 100644 drivers/net/wireless/ar6003/host/tools/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/Android_Readme delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Makefile delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_hciutils.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_core.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_int.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_main.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_utils.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_wlan.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btdefs.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_action.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/hciutils.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/sample.conf delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthmonoheadset.py delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthstereoheadset.py delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btmonoloop.sh delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btplaywav.sh delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/fc9_setup_readme.txt delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/linux_setup_readme.txt delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/wireless.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/athbtfilter/filter.sh delete mode 100644 drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Makefile delete mode 100644 drivers/net/wireless/ar6003/host/tools/drvdebugctrl/debugctrl.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/Makefile delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/dbgFormatter.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/recEvent.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/restore.sh delete mode 100644 drivers/net/wireless/ar6003/host/tools/recEvent/wireless_copy.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/Makefile delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/ap.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/atheros.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/basic.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/cmds_reg.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/os_unix.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/p2p.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/powerswitch.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/sigma_dut.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/sigma_dut.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/sta.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/traffic.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/traffic_agent.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_agt.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_agtctrl.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_ca.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_cmds.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_cmdtbl.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_cs.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_debug.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_main.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_miscs.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_p2p.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_portall.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_rsp.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_sock.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_stdincs.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_tg.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_tg.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_thr.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_tlv.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_tlv.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_types.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_utils.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_ver.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_wmmps.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wfa_wmmps.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wlantest.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wlantest_ctrl.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wpa_ctrl.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wpa_ctrl.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wpa_helpers.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/sigma-dut/wpa_helpers.h delete mode 100644 drivers/net/wireless/ar6003/host/tools/wlan_tool/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/wlan_tool/wlan_tool delete mode 100644 drivers/net/wireless/ar6003/host/tools/wmiconfig/Android.mk delete mode 100644 drivers/net/wireless/ar6003/host/tools/wmiconfig/Makefile delete mode 100644 drivers/net/wireless/ar6003/host/tools/wmiconfig/wmiconfig.c delete mode 100644 drivers/net/wireless/ar6003/host/tools/wmiconfig/wmiconfig.h diff --git a/drivers/net/wireless/ar6003/host/tools/Android.mk b/drivers/net/wireless/ar6003/host/tools/Android.mk deleted file mode 100644 index b3c34c55204e..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2010 Atheros Corporation. All rights reserved. -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== - - -ifneq ($(TARGET_SIMULATOR),true) - include $(call all-subdir-makefiles) -endif diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android.mk b/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android.mk deleted file mode 100644 index 2af8bc3c67b9..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2010 Atheros Corporation. All rights reserved. -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== - -ifneq ($(TARGET_SIMULATOR),true) -ifeq ($(BOARD_HAVE_BLUETOOTH),true) - include $(call all-subdir-makefiles) -endif -endif diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android_Readme b/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android_Readme deleted file mode 100644 index 0c5eb5b9dcfa..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/Android_Readme +++ /dev/null @@ -1,7 +0,0 @@ -# -# -# To generate the Android buildable files/directory -# execute the filter.sh script ONLY ONCE and move the -# whole athbtfilter directory to Android external -# directoy for compilation. -# \ No newline at end of file diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Android.mk b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Android.mk deleted file mode 100644 index fc1882e904d6..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Android.mk +++ /dev/null @@ -1,100 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2010 Atheros Corporation. All rights reserved. -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== -# -# link or copy whole olca driver into external/athwlan/olca/ -# - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -ifeq ($(BT_ALT_STACK),true) -# Define AR6K_PREBUILT_HCIUTILS_LIB:= true if you want to force to enable HCIUTILS -# Otherwise, we will try to load the hciutil.so dynamically to determinate whether we use hciutils or hci socket -# Uncomment the following if you want to use static library - -#AR6K_PREBUILT_HCIUTILS_LIB := true - -endif - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := abtfilt_bluez_dbus.c \ - abtfilt_core.c \ - abtfilt_main.c \ - abtfilt_utils.c \ - abtfilt_wlan.c \ - btfilter_action.c \ - btfilter_core.c - -ifeq ($(BT_ALT_STACK),true) -LOCAL_SRC_FILES += abtfilt_bluez_hciutils.c - -ifeq ($(AR6K_PREBUILT_HCIUTILS_LIB),true) -LOCAL_STATIC_LIBRARIES := hciutils -LOCAL_CFLAGS += -DSTATIC_LINK_HCILIBS -endif -AR6K_PREBUILT_HCIUTILS_LIB := - -else -LOCAL_CFLAGS += -DCONFIG_NO_HCILIBS -endif - -LOCAL_SHARED_LIBRARIES := \ - libdbus \ - libbluetooth \ - libcutils \ - libdl - -ifeq ($(AR6K_PREBUILT_HCIUTILS_LIB),true) -LOCAL_STATIC_LIBRARIES := hciutils -LOCAL_CFLAGS += -DSTATIC_LINK_HCILIBS -endif -AR6K_PREBUILT_HCIUTILS_LIB := - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/../../../include \ - $(LOCAL_PATH)/../../../tools/athbtfilter/bluez \ - $(LOCAL_PATH)/../../../../include \ - $(LOCAL_PATH)/../../../os/linux/include \ - $(LOCAL_PATH)/../../../btfilter \ - $(LOCAL_PATH)/../../.. \ - $(call include-path-for, dbus) \ - $(call include-path-for, bluez-libs) - -ifneq ($(PLATFORM_VERSION),$(filter $(PLATFORM_VERSION),1.5 1.6)) -LOCAL_C_INCLUDES += external/bluetooth/bluez/include/bluetooth external/bluetooth/bluez/lib/bluetooth -LOCAL_CFLAGS+=-DBLUEZ4_3 -else -LOCAL_C_INCLUDES += external/bluez/libs/include/bluetooth -endif - -LOCAL_CFLAGS+= \ - -DDBUS_COMPILATION -DABF_DEBUG - - -LOCAL_MODULE := abtfilt -LOCAL_MODULE_TAGS := debug eng optional -#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) - -include $(BUILD_EXECUTABLE) diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Makefile b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Makefile deleted file mode 100644 index 7d48c4cb5aaf..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/Makefile +++ /dev/null @@ -1,96 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 Atheros Corporation. All rights reserved. -# -# The software source and binaries included in this development package are -# licensed, not sold. You, or your company, received the package under one -# or more license agreements. The rights granted to you are specifically -# listed in these license agreement(s). All other rights remain with Atheros -# Communications, Inc., its subsidiaries, or the respective owner including -# those listed on the included copyright notices. Distribution of any -# portion of this package must be in strict compliance with the license -# agreement(s) terms. -# -# -# -# Wifi driver for AR6002 -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== - -#USE_GLIB=1 -#USE_HCIUTILS=1 - -ifdef V210 -V210_DIR=/tftpboot/ubuntu-taiwan -endif - -ifdef V210 -CC= $(ATH_CROSS_COMPILE_TYPE)gcc -LD= $(ATH_CROSS_COMPILE_TYPE)ld -else -CC= $(ATH_CROSSS_COMPILE_TYPE)gcc -LD= $(ATH_CROSSS_COMPILE_TYPE)ld -endif -SOURCES=abtfilt_main.c \ - abtfilt_wlan.c \ - abtfilt_core.c \ - abtfilt_utils.c \ - btfilter_action.c\ - btfilter_core.c - -INCLUDES= -I../../../include \ - -I../../../os/linux/include \ - -I../../../../include \ - -I../../../ \ - -I$(V210_DIR)/usr/include/dbus-1.0/ \ - -I$(V210_DIR)/usr/lib/dbus-1.0/include \ - -I$(V210_DIR)/usr/include/bluetooth \ - -CFLAGS= -Wall -g -DABF_DEBUG -#LIBS= -ldbus-1 -lpthread -lbtfilt -lrt -lbluetooth -LIBS= -ldbus-1 -lpthread -lrt -lbluetooth - -ifdef USE_HCIUTILS -SOURCES += abtfilt_bluez_hciutils.c -LIBS += -ldl -else -CFLAGS += -DCONFIG_NO_HCILIBS -endif - -ifdef USE_GLIB -SOURCES += abtfilt_bluez_dbus_glib.c - -LIBS += -lgobject-2.0 -lglib-2.0 -ldbus-glib-1 - -INCLUDES += -I/usr/include/glib-2.0 \ - -I/usr/lib/glib-2.0/include \ - -OBJECTS= $(SOURCES:.c=.o) - -else -SOURCES += abtfilt_bluez_dbus.c - -OBJECTS= $(SOURCES:.c=.o) -endif - - - -#LDFLAGS= -L$(WORKAREA)/host/btfilter -#copy libbluetooth.so from /tftpboot/ubuntu-taiwan/usr/lib to /tftpboot/ubuntu-taiwan/lib [for V210] -ifdef V210 -LDFLAGS= -L/tftpboot/ubuntu-taiwan/lib -endif -FILTERAPP= abtfilt - -all: $(OBJECTS) - $(CC) -o $(FILTERAPP) $(OBJECTS) $(LDFLAGS) $(LIBS) - -.c.o: - $(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@ - -clean: - rm -f $(FILTERAPP) $(OBJECTS) diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.c deleted file mode 100644 index be7b6d826d30..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.c +++ /dev/null @@ -1,2634 +0,0 @@ - -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -/* - * Bluetooth Filter - BT module - * - */ - -#include "abtfilt_bluez_dbus.h" - -#undef HCI_INQUIRY -#include -#include -#include -#include - -/* Definitions */ - -#define BLUEZ_NAME "org.bluez" -#define ADAPTER_INTERFACE "org.bluez.Adapter" -#define MANAGER_INTERFACE "org.bluez.Manager" - -#ifndef ANDROID -/* This should be undef'ed if compiled at FC9 using BlueZ 3.x */ -#define BLUEZ4_3 -#endif /* ANDROID */ - -#define ABTH_MAX_CONNECTIONS 16 - -#ifdef BLUEZ4_3 - -#define BLUEZ_PATH "/" -#define AUDIO_MANAGER_PATH "/org/bluez/" -#define AUDIO_MANAGER_INTERFACE "org.bluez" -#define AUDIO_SINK_INTERFACE "org.bluez.AudioSink" -#define AUDIO_SOURCE_INTERFACE "org.bluez.AudioSource" -#define AUDIO_HEADSET_INTERFACE "org.bluez.Headset" -#define AUDIO_GATEWAY_INTERFACE "org.bluez.Gateway" -#define AUDIO_DEVICE_INTERFACE "org.bluez.Device" - -#else - -#define BLUEZ_PATH "/org/bluez" -#define AUDIO_MANAGER_PATH "/org/bluez/audio" -#define AUDIO_SINK_INTERFACE "org.bluez.audio.Sink" -#define AUDIO_SOURCE_INTERFACE "org.bluez.audio.Source" -#define AUDIO_HEADSET_INTERFACE "org.bluez.audio.Headset" -#define AUDIO_GATEWAY_INTERFACE "org.bluez.audio.Gateway" -#define AUDIO_MANAGER_INTERFACE "org.bluez.audio.Manager" -#define AUDIO_DEVICE_INTERFACE "org.bluez.audio.Device" -#endif - -#define INVALID_INTERFACE NULL - -#define BTEV_GET_BT_CONN_LINK_TYPE(p) ((p)[9]) -#define BTEV_GET_TRANS_INTERVAL(p) ((p)[10]) -#define BTEV_GET_RETRANS_INTERVAL(p) ((p)[11]) -#define BTEV_GET_RX_PKT_LEN(p) ((A_UINT16)((p)[12]) | (((A_UINT16)((p)[13])) << 8)) -#define BTEV_GET_TX_PKT_LEN(p) ((A_UINT16)((p)[14]) | (((A_UINT16)((p)[15])) << 8)) -#define BTEV_CMD_COMPLETE_GET_OPCODE(p) ((A_UINT16)((p)[1]) | (((A_UINT16)((p)[2])) << 8)) -#define BTEV_CMD_COMPLETE_GET_STATUS(p) ((p)[3]) - -#define DBUS_METHOD_CALL_TIMEOUT (-1) /* no timeout */ -#define DBUS_MESSAGE_RECV_TIMEOUT (-1) /* no timeout */ - -#define USE_DBUS_FOR_HEADSET_PROFILE(pInfo) (!((pInfo)->Flags & ABF_USE_HCI_FILTER_FOR_HEADSET_PROFILE)) -#define MAKE_BTSTATE_MASK(state) (1 << (state)) - -typedef enum { - ARG_INVALID = 0, - ARG_NONE, - ARG_STRING, -} BT_CB_TYPE; - -typedef struct _BT_NOTIFICATION_CONFIG_PARAMS { - const char *signal_name; - const char *interface; - BT_CB_TYPE arg; -} BT_NOTIFICATION_CONFIG_PARAMS; - - -ABF_BT_INFO * g_pAbfBtInfo = NULL; - -static BT_NOTIFICATION_CONFIG_PARAMS g_NotificationConfig[BT_EVENTS_NUM_MAX] = -{ - /* BT_ADAPTER_ADDED */ - {"AdapterAdded", MANAGER_INTERFACE, ARG_STRING}, - /* BT_ADAPTER_REMOVED */ - {"AdapterRemoved", MANAGER_INTERFACE, ARG_STRING}, - /* DEVICE_DISCOVERY_STARTED */ - {"DiscoveryStarted", ADAPTER_INTERFACE, ARG_NONE}, - /* DEVICE_DISCOVERY_FINISHED */ - {"DiscoveryCompleted", ADAPTER_INTERFACE, ARG_NONE}, - /* REMOTE_DEVICE_CONNECTED */ - {"RemoteDeviceConnected", ADAPTER_INTERFACE, ARG_STRING}, - /* REMOTE_DEVICE_DISCONNECTED */ - {"RemoteDeviceDisconnected", ADAPTER_INTERFACE, ARG_STRING}, - /* AUDIO_DEVICE_ADDED */ - {"DeviceCreated", AUDIO_MANAGER_INTERFACE, ARG_STRING}, - /* AUDIO_DEVICE_REMOVED */ - {"DeviceRemoved", AUDIO_MANAGER_INTERFACE, ARG_STRING}, - /* AUDIO_HEADSET_CONNECTED */ - {"Connected", AUDIO_HEADSET_INTERFACE, ARG_NONE}, - /* AUDIO_HEADSET_DISCONNECTED */ - {"Disconnected", AUDIO_HEADSET_INTERFACE, ARG_NONE}, - /* AUDIO_HEADSET_STREAM_STARTED */ - {"Playing", AUDIO_HEADSET_INTERFACE, ARG_NONE}, - /* AUDIO_HEADSET_STREAM_STOPPED */ - {"Stopped", AUDIO_HEADSET_INTERFACE, ARG_NONE}, - /* AUDIO_GATEWAY_CONNECTED */ - {NULL, INVALID_INTERFACE, ARG_INVALID}, - /* AUDIO_GATEWAY_DISCONNECTED */ - {NULL, INVALID_INTERFACE, ARG_INVALID}, - /* AUDIO_SINK_CONNECTED */ - {"Connected", AUDIO_SINK_INTERFACE, ARG_NONE}, - /* AUDIO_SINK_DISCONNECTED */ - {"Disconnected", AUDIO_SINK_INTERFACE, ARG_NONE}, - /* AUDIO_SINK_STREAM_STARTED */ - {"Playing", AUDIO_SINK_INTERFACE, ARG_NONE}, - /* AUDIO_SINK_STREAM_STOPPED */ - {"Stopped", AUDIO_SINK_INTERFACE, ARG_NONE}, - /* AUDIO_SOURCE_CONNECTED */ - {NULL, INVALID_INTERFACE, ARG_INVALID}, - /* AUDIO_SOURCE_DISCONNECTED */ - {NULL, INVALID_INTERFACE, ARG_INVALID}, -}; - -typedef struct { - char *str; - unsigned int val; -} hci_map; - -static const hci_map ver_map[] = { - { "1.0b", 0x00 }, - { "1.1", 0x01 }, - { "1.2", 0x02 }, - { "2.0", 0x03 }, - { "2.1", 0x04 }, - { NULL } -}; - -/* Function Prototypes */ -static void BtAdapterAdded(const char *string, - void * user_data); -static void BtAdapterRemoved(const char *string, - void * user_data); -static A_STATUS AcquireBtAdapter(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseBTAdapter(ABF_BT_INFO *pAbfBtInfo); -static void *BtEventThread(void *arg); -static void RegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, - BT_STACK_EVENT event, BT_EVENT_HANDLER handler); -static void DeRegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event); -static A_STATUS GetAdapterInfo(ABF_BT_INFO *pAbfBtInfo); -static void RemoteDeviceDisconnected(const char *string, - void * user_data); -static void RemoteDeviceConnected(const char *string, - void * user_data); -static void AudioDeviceAdded(const char *string, - void * user_data); -static void AudioDeviceRemoved(const char *string, - void * user_data); -static void DeviceDiscoveryStarted(void *arg, void * user_data); -static void DeviceDiscoveryFinished(void *arg, void * user_data); -static void AudioHeadsetConnected(void *arg, void * user_data); -static void AudioHeadsetDisconnected(void *arg, void * user_data); -static void AudioHeadsetStreamStarted(void *arg, void * user_data); -static void AudioHeadsetStreamStopped(void *arg, void * user_data); -static void AudioGatewayConnected(void *arg, void * user_data); -static void AudioGatewayDisconnected(void *arg, void * user_data); -static void AudioSinkConnected(void *arg, void * user_data); -static void AudioSinkDisconnected(void *arg, void * user_data); -static void AudioSinkStreamStarted(void *arg, void * user_data); -static void AudioSinkStreamStopped(void *arg, void * user_data); -static void AudioSourceConnected(void *arg, void * user_data); -static void AudioSourceDisconnected(void *arg, void * user_data); -static A_STATUS CheckAndAcquireDefaultAdapter(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseDefaultAdapter(ABF_BT_INFO *pAbfBtInfo); -static void AcquireDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo); -static void GetBtAudioConnectionProperties(ABF_BT_INFO *pAbfBtInfo, - ATHBT_STATE_INDICATION Indication); -static void GetBtAudioDeviceProperties(ABF_BT_INFO *pAbfBtInfo); - -static A_STATUS SetupHciEventFilter(ABF_BT_INFO *pAbfBtInfo); -static void CleanupHciEventFilter(ABF_BT_INFO *pAbfBtInfo); -static void CheckHciEventFilter(ABF_BT_INFO *pAbfBtInfo); - -static A_STATUS IssueHCICommand(ABF_BT_INFO *pAbfBtInfo, - A_UINT16 OpCode, - A_UCHAR *pCmdData, - int CmdLength, - int EventRecvTimeoutMS, - A_UCHAR *pEventBuffer, - int MaxLength, - A_UCHAR **ppEventPtr, - int *pEventLength); - - /* method call that involves only 1 input string (can be NULL) and/or 1 output string */ -static A_STATUS DoMethodCall(DBusConnection *Bus, - char *BusName, - char *Path, - char *Interface, - char *Method, - void *InputArg, - int InputType, - int MaxInLength, - void *OutputArg, - int OutputType, - int MaxOutLength); - -static A_STATUS ProcessDBusMessage(ABF_BT_INFO *pAbfBtInfo, DBusMessage *Msg); -static A_STATUS CheckRemoteDeviceEDRCapable(ABF_BT_INFO *pAbfBtInfo, A_BOOL *pEDRCapable); - -/* New function to check Remote LMP version */ -static A_STATUS GetRemoteDeviceLMPVersion(ABF_BT_INFO *pAbfBtInfo); - -static void *HCIFilterThread(void *arg); - -A_BOOL g_AppShutdown = FALSE; - - -#define ForgetRemoteAudioDevice(pA) \ -{ \ - A_MEMZERO((pA)->DefaultRemoteAudioDeviceAddress,sizeof((pA)->DefaultRemoteAudioDeviceAddress)); \ - (pA)->DefaultRemoteAudioDevicePropsValid = FALSE; \ -} - -/* APIs exported to other modules */ -A_STATUS -Abf_BtStackNotificationInit(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 Flags) -{ - A_STATUS status = A_ERROR; - ATHBT_FILTER_INFO *pInfo; - ABF_BT_INFO *pAbfBtInfo; - DBusError error; - - pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - if (pInfo->pBtInfo) { - return A_OK; - } - - if (g_AppShutdown) { - A_ERR (" App was already shutdown cannot call Abf_BtStackNotificationInit again!!!"); - return A_ERROR; - } - - pAbfBtInfo = (ABF_BT_INFO *)A_MALLOC(sizeof(ABF_BT_INFO)); - A_MEMZERO(pAbfBtInfo,sizeof(ABF_BT_INFO)); - - A_MUTEX_INIT(&pAbfBtInfo->hWaitEventLock); - A_MEMZERO(pAbfBtInfo, sizeof(ABF_BT_INFO)); - - pInfo->Flags = Flags; - - if (pInfo->Flags & ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION) { - A_INFO("AFH Classification Command will be issued on WLAN connect/disconnect \n"); - } - - if (pInfo->Flags & ABF_USE_HCI_FILTER_FOR_HEADSET_PROFILE) { - A_INFO("Headset Profile notifications will use HCI filter instead of DBUS \n"); - -#ifdef BLUEZ4_3 - /* We don't want to ignore INQUIRY message to implement "DiscoveryStarted" (deprecated in BlueZ 4.x) */ - pInfo->FilterCore.StateFilterIgnore = MAKE_BTSTATE_MASK(ATH_BT_A2DP); //| MAKE_BTSTATE_MASK(ATH_BT_CONNECT); -#else - /* ignore certain state detections that we can handle through dbus */ - pInfo->FilterCore.StateFilterIgnore = MAKE_BTSTATE_MASK(ATH_BT_CONNECT) | - MAKE_BTSTATE_MASK(ATH_BT_INQUIRY) | - MAKE_BTSTATE_MASK(ATH_BT_A2DP); -#endif - - } - - pAbfBtInfo->AdapterAvailable = FALSE; - pAbfBtInfo->pInfo = pInfo; - pAbfBtInfo->HCIEventListenerSocket = -1; - pInfo->pBtInfo = pAbfBtInfo; - - dbus_error_init(&error); - - do { - - pAbfBtInfo->Bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error); - if (NULL == pAbfBtInfo->Bus ) { - A_ERR("[%s] Couldn't connect to system bus: %s\n", - __FUNCTION__, error.message); - break; - } - - /* check for default adapter at startup */ - CheckAndAcquireDefaultAdapter(pAbfBtInfo); - RegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_ADDED, (BT_EVENT_HANDLER)BtAdapterAdded); - RegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_REMOVED, (BT_EVENT_HANDLER)BtAdapterRemoved); - - if(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING) { - Abf_RegisterToHciLib(pAbfBtInfo); - } - - /* Spawn a thread which will be used to process events from dbus */ - status = A_TASK_CREATE(&pInfo->hBtThread, BtEventThread, pAbfBtInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to spawn a BT thread\n", __FUNCTION__); - break; - } - - pAbfBtInfo->ThreadCreated = TRUE; - status = A_OK; - - } while (FALSE); - - dbus_error_free(&error); - - if (A_FAILED(status)) { - Abf_BtStackNotificationDeInit(pInstance); - } - A_INFO("BT Stack Notification init complete\n"); - - return status; -} - -void -Abf_BtStackNotificationDeInit(ATH_BT_FILTER_INSTANCE *pInstance) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_BT_INFO *pAbfBtInfo = pInfo->pBtInfo; - - g_AppShutdown = TRUE; - - if (!pAbfBtInfo) return; - - /* acquire lock to sync with thread */ - A_MUTEX_LOCK(&pAbfBtInfo->hWaitEventLock); - - if (pAbfBtInfo->Bus != NULL) { - A_INFO("Cleaning up dbus connection ... \n"); - - /* NOTE: there is really no need to de-register callbacks and cleanup state since we - * are exiting the application and cleaning up the bus connection. When the dbus conneciont - * is cleaned up, all signal registrations are cleanedup by the dbus library anyways. - * - DeRegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_ADDED); - DeRegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_REMOVED); - ReleaseDefaultAdapter(pAbfBtInfo); - */ - - /* Release the system bus */ - dbus_connection_unref(pAbfBtInfo->Bus); - pAbfBtInfo->Bus = NULL; - } - - Abf_UnRegisterToHciLib(pAbfBtInfo); - - /* Flush all the BT actions from the filter core TODO */ - - /* Free the remaining resources */ - pAbfBtInfo->AdapterAvailable = FALSE; - pInfo->pBtInfo = NULL; - A_MUTEX_DEINIT(&pAbfBtInfo->hWaitEventLock); - A_MEMZERO(pAbfBtInfo, sizeof(ABF_BT_INFO)); - A_FREE(pAbfBtInfo); - - A_INFO("BT Stack Notification de-init complete\n"); -} - -static void * -BtEventThread(void *arg) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)arg; - DBusMessage *msg = NULL; - A_BOOL error = FALSE; - - g_pAbfBtInfo = (ABF_BT_INFO *) arg; - A_INFO("Starting the BT Event Handler task\n"); - - A_INFO("Entering DBus Message loop \n"); - - Abf_WlanGetSleepState(pAbfBtInfo->pInfo); - - while (!g_AppShutdown && !error) { - - dbus_connection_read_write(pAbfBtInfo->Bus, DBUS_MESSAGE_RECV_TIMEOUT); - - if (g_AppShutdown) { - break; - } - /* while we retrieve and process messages we don't want this thread killed */ - A_MUTEX_LOCK(&pAbfBtInfo->hWaitEventLock); - - while (!error) { - msg = dbus_connection_pop_message(pAbfBtInfo->Bus); - if (NULL == msg) { - break; - } - A_DEBUG(" Got DBus Message ... \n"); - if (A_FAILED(ProcessDBusMessage(pAbfBtInfo, msg))) { - error = TRUE; - } - dbus_message_unref(msg); - msg = NULL; - } - - A_MUTEX_UNLOCK(&pAbfBtInfo->hWaitEventLock); - - } - - A_INFO("Leaving DBus Message loop \n"); - A_INFO("Leaving the BT Event Handler task\n"); - - return NULL; -} - -static A_STATUS -CheckAndAcquireDefaultAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status = A_OK; - - do { - - if (pAbfBtInfo->AdapterAvailable) { - /* already available */ - break; - } - - /* acquire the adapter */ - status = AcquireBtAdapter(pAbfBtInfo); - - } while (FALSE); - - return status; -} - -static void ReleaseDefaultAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - - if (pAbfBtInfo->AdapterAvailable) { - /* Release the BT adapter */ - ReleaseBTAdapter(pAbfBtInfo); - A_INFO("[%s] BT Adapter Removed\n",pAbfBtInfo->HCI_AdapterName); - } - - A_MEMZERO(pAbfBtInfo->HCI_AdapterName, sizeof(pAbfBtInfo->HCI_AdapterName)); - -} -/* Event Notifications */ -static void -BtAdapterAdded(const char *string, void * user_data) -{ - A_DEBUG("BtAdapterAdded (%s) Callback ... \n", (string != NULL) ? string : "UNKNOWN"); - - /* BUG!!!, the BtAdapterAdded callback is indicated too early by the BT service, on some systems - * the method call to "DefaultAdapter" through the Manager interface will fail because no - * default adapter exist yet even though this callback was indicated (there should be a default) - * - * Workaround is to delay before acquiring the default adapter. - * Acquiring the BT adapter should not be very infrequent though. - * - * */ - sleep(5); - CheckAndAcquireDefaultAdapter((ABF_BT_INFO *)user_data); -} - - -static void -BtAdapterRemoved(const char *string, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("BtAdapterRemoved (%s) Callback ... \n", (string != NULL) ? string : "UNKNOWN"); - - if (!pAbfBtInfo->AdapterAvailable) return; - - if ((string != NULL) && strcmp(string,pAbfBtInfo->HCI_AdapterName) == 0) { - /* the adapter we are watching has been removed */ - ReleaseDefaultAdapter(pAbfBtInfo); - } - -} - -static void -DeviceDiscoveryStarted(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Inquiry Started\n"); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); -} - -static void -DeviceDiscoveryFinished(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Inquiry Completed\n"); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); -} - -static void -RemoteDeviceConnected(const char *string, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Connected: %s\n", string); - A_STR2ADDR(string, pAbfBtInfo->RemoteDevice); - AthBtIndicateState(pInstance, ATH_BT_CONNECT, STATE_ON); -} - -static void -RemoteDeviceDisconnected(const char *string, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Disconnected: %s\n", string); - A_MEMZERO(pAbfBtInfo->RemoteDevice, sizeof(pAbfBtInfo->RemoteDevice)); - AthBtIndicateState(pInstance, ATH_BT_CONNECT, STATE_OFF); -} - -static void ReleaseDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - - if (pAbfBtInfo->AudioCbRegistered) { - if (USE_DBUS_FOR_HEADSET_PROFILE(pInfo)) { - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_CONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_DISCONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STARTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STOPPED); - } - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_CONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_DISCONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_CONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_DISCONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STARTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STOPPED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_CONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_DISCONNECTED); - pAbfBtInfo->AudioCbRegistered = FALSE; - } - - if (pAbfBtInfo->DefaultAudioDeviceAvailable) { - pAbfBtInfo->DefaultAudioDeviceAvailable = FALSE; - A_DEBUG("Default Audio Device Removed: %s\n", pAbfBtInfo->DefaultAudioDeviceName); - A_MEMZERO(pAbfBtInfo->DefaultAudioDeviceName,sizeof(pAbfBtInfo->DefaultAudioDeviceName)); - } - -} - -static A_STATUS DoMethodCall(DBusConnection *Bus, - char *BusName, - char *Path, - char *Interface, - char *Method, - void *InputArg, - int InputType, - int InputLength, - void *OutputArg, - int OutputType, - int MaxOutLength) -{ - A_STATUS status = A_ERROR; - DBusError error; - DBusMessage *msg = NULL; - DBusMessage *reply = NULL; - void *replyData; - DBusMessageIter args; - - dbus_error_init(&error); - - do { - msg = dbus_message_new_method_call(BusName, Path, Interface, Method); - - if (NULL == msg) { - A_ERR("[%s] failed new method call line \n", __FUNCTION__); - break; - } - - /* see if caller is providing an argument */ - if (InputArg != NULL) { - dbus_message_iter_init_append(msg, &args); - if (InputType == DBUS_TYPE_STRING) { - if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, (char **)&InputArg)) { - A_ERR("[%s] Failed to add string input argument \n", __FUNCTION__); - break; - } - } else { - A_ERR("[%s] unsupported input arg type: %c \n", __FUNCTION__, (char)InputType); - break; - } - } - - reply = dbus_connection_send_with_reply_and_block(Bus, msg, DBUS_METHOD_CALL_TIMEOUT, &error); - - - if (dbus_error_is_set(&error)) { - A_ERR("[%s] Failed to invoke method call (%s : method : %s) %s \n", - __FUNCTION__, Interface, Method, error.message); - break; - } - - /* check if caller expects a return string */ - if (OutputArg != NULL) { - - replyData = NULL; - - - if (OutputType == DBUS_TYPE_ARRAY) { - - DBusMessageIter iter,subIter; - dbus_message_iter_init (reply, &iter); - if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) { - - /* recurse into the array */ - dbus_message_iter_recurse(&iter, &subIter); - /* get a pointer to the start of the array */ - - dbus_message_iter_get_fixed_array(&subIter, &replyData, &MaxOutLength); - } else { - A_ERR("[%s] ARG Type (%s) is not an array! \n", __FUNCTION__, - (char)dbus_message_iter_get_arg_type(&iter)); - break; - } - - } else if (OutputType == DBUS_TYPE_STRING) { - - dbus_message_get_args(reply, &error, OutputType, &replyData, DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&error)) { - A_ERR("[%s] dbus_message_get_args failed (%s : method : %s) %s \n", - __FUNCTION__, Interface, Method, error.message); - break; - } - - } else if (OutputType == DBUS_TYPE_OBJECT_PATH) { - - dbus_message_get_args(reply, &error, OutputType, &replyData, DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&error)) { - A_ERR("[%s] dbus_message_get_args failed (%s : method : %s) %s \n", - __FUNCTION__, Interface, Method, error.message); - break; - } - - } else { - A_ERR("[%s] unsupported output arg type: %c \n", __FUNCTION__,(char)OutputType); - break; - } - - if (NULL == replyData) { - A_ERR("[%s] type %c data pointer was not returned from method call \n", - __FUNCTION__, (char)OutputType); - break; - } - - if (OutputType == DBUS_TYPE_STRING) { - strncpy(OutputArg, (char *)replyData, MaxOutLength); - } else if (OutputType == DBUS_TYPE_ARRAY) { - A_ERR(" (p:0x%X) Array has %d elements: \n", replyData, MaxOutLength); - /* just copy what the caller expects for data */ - - A_MEMCPY(OutputArg, replyData, MaxOutLength); - - } else if (OutputType == DBUS_TYPE_OBJECT_PATH) { /* Added by YG, November 19, 2009 */ - strncpy(OutputArg, (char *)replyData, MaxOutLength); - } - } - - status = A_OK; - - } while (FALSE); - - if (msg != NULL) { - dbus_message_unref(msg); - } - - if (reply != NULL) { - dbus_message_unref(reply); - } - - dbus_error_free(&error); - - return status; -} - -static void AcquireDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo) -{ - A_BOOL success = FALSE; -#ifndef BLUEZ4_3 - A_STATUS status; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; -#endif - - A_INFO("[%s]StartRegister\n", __FUNCTION__); - do { - - if (pAbfBtInfo->DefaultAudioDeviceAvailable) { - /* already acquired */ - success = TRUE; - break; - } -#ifdef BLUEZ4_3 - pAbfBtInfo->DefaultAudioDeviceAvailable = FALSE; -#else - A_INFO("Checking for a default audio device .. \n"); - - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - AUDIO_MANAGER_PATH, - AUDIO_MANAGER_INTERFACE, - "DefaultDevice", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->DefaultAudioDeviceName, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->DefaultAudioDeviceName)); - - if (A_FAILED(status)) { - break; - } - - A_INFO("Default Audio Device: %s \n", pAbfBtInfo->DefaultAudioDeviceName); - - pAbfBtInfo->DefaultAudioDeviceAvailable = TRUE; -#endif /* BLUEZ4_3 */ - - /* Register for audio specific events */ -#ifdef BLUEZ4_3 - if (1) { -#else - if (USE_DBUS_FOR_HEADSET_PROFILE(pInfo)) { -#endif - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_CONNECTED, AudioHeadsetConnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_DISCONNECTED, AudioHeadsetDisconnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STARTED, AudioHeadsetStreamStarted); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STOPPED, AudioHeadsetStreamStopped); - } -#ifndef BLUEZ4_3 - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_CONNECTED, AudioGatewayConnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_DISCONNECTED, AudioGatewayDisconnected); -#endif /* !BLUEZ4_3 */ - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_CONNECTED,AudioSinkConnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_DISCONNECTED, AudioSinkDisconnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STARTED,AudioSinkStreamStarted); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STOPPED, AudioSinkStreamStopped); -#ifndef BLUEZ4_3 - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_CONNECTED, AudioSourceConnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_DISCONNECTED, AudioSourceDisconnected); -#endif /* !BLUEZ4_3 */ - - pAbfBtInfo->AudioCbRegistered = TRUE; - - success = TRUE; - - A_INFO("[%s]EndRegister\n", __FUNCTION__); - } while (FALSE); - - if (!success) { - /* cleanup */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - } -} - -static void -AudioDeviceAdded(const char *string, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("Audio Device Added: %s\n", string); - /* release current one if any */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - /* re-acquire the new default, it could be the same one */ - AcquireDefaultAudioDevice(pAbfBtInfo); - -} - -static void -AudioDeviceRemoved(const char *string, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("Audio Device Removed: %s\n", string); - if (strcmp(string,pAbfBtInfo->DefaultAudioDeviceName) == 0) { - /* release current one */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - /* re-acquire the new default (if any) */ - AcquireDefaultAudioDevice(pAbfBtInfo); - } - -} - - -static void -AudioHeadsetConnected(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - - A_DEBUG("Audio Headset Connected \n"); - - if(!(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - GetBtAudioDeviceProperties(pAbfBtInfo); - } -} - -static void -AudioHeadsetDisconnected(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - A_DEBUG("Audio Headset (%s) Disconnected\n",pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - ForgetRemoteAudioDevice(pAbfBtInfo); -} - -static void -AudioHeadsetStreamStarted(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - if(!(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - if (!pAbfBtInfo->DefaultRemoteAudioDevicePropsValid) { - GetBtAudioDeviceProperties(pAbfBtInfo); - } - } - A_DEBUG("Audio Headset (%s) Stream Started \n",pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - /* make the indication */ - /* get properties of this headset connection */ - GetBtAudioConnectionProperties(pAbfBtInfo, ATH_BT_SCO); - - AthBtIndicateState(pInstance, - pAbfBtInfo->CurrentSCOLinkType == SCO_LINK ? ATH_BT_SCO : ATH_BT_ESCO, - STATE_ON); -} - -static void -AudioHeadsetStreamStopped(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - /* This event can also be used to indicate the SCO state */ - A_DEBUG("Audio Headset (%s) Stream Stopped \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - AthBtIndicateState(pInstance, - pAbfBtInfo->CurrentSCOLinkType == SCO_LINK ? ATH_BT_SCO : ATH_BT_ESCO, - STATE_OFF); -} - -static void -AudioGatewayConnected(void *arg, void * user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Gateway Connected\n"); -} - -static void -AudioGatewayDisconnected(void *arg, void * user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Gateway disconnected\n"); -} - -static void -AudioSinkConnected(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - A_DEBUG("Audio Sink Connected \n"); - - if(!(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - GetBtAudioDeviceProperties(pAbfBtInfo); - } -} - -static void -AudioSinkDisconnected(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - A_DEBUG("Audio Sink (%s) Disconnected \n",pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_OFF); - ForgetRemoteAudioDevice(pAbfBtInfo); -} - -static void -AudioSinkStreamStarted(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - if (!pAbfBtInfo->DefaultRemoteAudioDevicePropsValid) { - GetBtAudioDeviceProperties(pAbfBtInfo); - } - - A_DEBUG("Audio Sink (%s) Stream Started \n",pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - /* get connection properties */ - GetBtAudioConnectionProperties(pAbfBtInfo, ATH_BT_A2DP); - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_ON); -} - -static void -AudioSinkStreamStopped(void *arg, void * user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Audio Sink (%s) Stream Stopped \n",pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_OFF); -} - -static void -AudioSourceConnected(void *arg, void * user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Source Connected \n"); -} - -static void -AudioSourceDisconnected(void *arg, void * user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Source Disconnected \n"); -} - - -static A_STATUS ProcessDBusMessage(ABF_BT_INFO *pAbfBtInfo, DBusMessage *Msg) -{ - A_STATUS status = A_OK; - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - int i, argType; - DBusMessageIter msgiter; - char *argString; - - pNotificationConfig = &g_NotificationConfig[0]; - - for (i = 0; i < BT_EVENTS_NUM_MAX; i++, pNotificationConfig++) { - if ((pNotificationConfig->interface != NULL) && - (pNotificationConfig->signal_name != NULL)) { - - if (dbus_message_is_signal(Msg, - pNotificationConfig->interface, - pNotificationConfig->signal_name)) { - - /* found a match */ - break; - } - } - - } - - if (i >= BT_EVENTS_NUM_MAX) { - /* not a signal we registered for */ - return A_OK; - } - - do { - if (pAbfBtInfo->SignalHandlers[i] == NULL) { - /* no registered handler for this signal, just ignore */ - break; - } - if (pNotificationConfig->arg == ARG_NONE) { - /* call zero-argument handler */ - pAbfBtInfo->SignalHandlers[i](NULL, pAbfBtInfo); - } else if (pNotificationConfig->arg == ARG_STRING) { - /* we are expecting a string argument */ - if (!dbus_message_iter_init(Msg, &msgiter)) { - A_ERR("[%s] event: %d (if:%s , sig: %s) expecting a string argument but there are none \n", - __FUNCTION__, i, pNotificationConfig->interface, - pNotificationConfig->signal_name ); - break; - } - - argType = dbus_message_iter_get_arg_type(&msgiter); - if(!((argType == DBUS_TYPE_STRING) || argType == DBUS_TYPE_OBJECT_PATH)) { - A_ERR("[%s] event: %d (if:%s , sig: %s) expecting a string /object path argument !\n", - __FUNCTION__, i, pNotificationConfig->interface, - pNotificationConfig->signal_name); - break; - } - - dbus_message_iter_get_basic(&msgiter, &argString); - /* call string arg handler */ - pAbfBtInfo->SignalHandlers[i](argString, pAbfBtInfo); - } - - } while (FALSE); - - return status; -} - -static void -RegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event, - BT_EVENT_HANDLER handler) -{ - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - DBusError error; - char tempStr[STRING_SIZE_MAX]; - dbus_error_init(&error); - - do { - - if (event >= BT_EVENTS_NUM_MAX) { - A_ERR("[%s] Invalid Event: %d\n", __FUNCTION__, event); - break; - } - pNotificationConfig = &g_NotificationConfig[event]; - - if (pAbfBtInfo->SignalHandlers[event] != NULL) { - A_ERR("[%s] event: %d already in use \n", __FUNCTION__); - break; - } - if (pNotificationConfig->interface == NULL) { - /* no interface, may not be implemented yet */ - A_ERR("[%s] Event: %d not implemented yet \n", __FUNCTION__, event); - break; - } - - snprintf(tempStr, sizeof(tempStr), "type='signal',interface='%s'",pNotificationConfig->interface); - - A_DEBUG(" rule to add: %s \n", tempStr); - - - /* add signal */ - dbus_bus_add_match(pAbfBtInfo->Bus, tempStr, &error); - - if (dbus_error_is_set(&error)) { - A_ERR("[%s] dbus_bus_add_match failed: %s n", __FUNCTION__, error.message); - break; - } - dbus_connection_flush(pAbfBtInfo->Bus); - - /* install handler */ - pAbfBtInfo->SignalHandlers[event] = handler; - - } while (FALSE); - - dbus_error_free(&error); -} - - -static void -DeRegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event) -{ - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - DBusError error; - char tempStr[STRING_SIZE_MAX]; - - dbus_error_init(&error); - - do { - - if (event >= BT_EVENTS_NUM_MAX) { - A_ERR("[%s] Invalid Event: %d\n", __FUNCTION__, event); - break; - } - - pNotificationConfig = &g_NotificationConfig[event]; - - if (pAbfBtInfo->SignalHandlers[event] == NULL) { - A_ERR("[%s] event: %d is not in use! \n", __FUNCTION__, event); - break; - } - - snprintf(tempStr, sizeof(tempStr),"type='signal',interface='%s'",pNotificationConfig->interface); - - A_DEBUG(" rule to remove : %s \n", tempStr); - - /* remove rule */ - dbus_bus_remove_match(pAbfBtInfo->Bus, tempStr, &error); - - if (dbus_error_is_set(&error)) { - A_ERR("[%s] dbus_bus_remove_match failed: %s n", __FUNCTION__, error.message); - break; - } - - dbus_connection_flush(pAbfBtInfo->Bus); - - /* delete handler */ - pAbfBtInfo->SignalHandlers[event] = NULL; - - } while (FALSE); - - dbus_error_free(&error); - -} - -/* Misc */ -static A_STATUS -AcquireBtAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status = A_ERROR; - char *hciName; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - - do { - - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - BLUEZ_PATH, - MANAGER_INTERFACE, - "DefaultAdapter", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->HCI_AdapterName, -#ifdef BLUEZ4_3 - DBUS_TYPE_OBJECT_PATH, -#else - DBUS_TYPE_STRING, -#endif - sizeof(pAbfBtInfo->HCI_AdapterName)); - - if (A_FAILED(status)) { - A_ERR("[%s] Get Default Adapter failed \n", __FUNCTION__); - break; - } - - /* assume ID 0 */ - pAbfBtInfo->AdapterId = 0; - - if ((hciName = strstr(pAbfBtInfo->HCI_AdapterName, "hci")) != NULL) { - /* get the number following the hci name, this is the ID used for - * socket calls to the HCI layer */ - pAbfBtInfo->AdapterId = (int)hciName[3] - (int)'0'; - if (pAbfBtInfo->AdapterId < 0) { - pAbfBtInfo->AdapterId = 0; - } - } - - if(!(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - if (!A_SUCCESS(SetupHciEventFilter(pAbfBtInfo))) { - break; - } - GetAdapterInfo(pAbfBtInfo); - } - - - pAbfBtInfo->pInfo->LMPVersion = pAbfBtInfo->HCI_LMPVersion; - - pAbfBtInfo->AdapterAvailable = TRUE; - /* Register to get notified of different stack events */ - RegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_STARTED, DeviceDiscoveryStarted); - RegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_FINISHED, DeviceDiscoveryFinished); - RegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_CONNECTED, (BT_EVENT_HANDLER)RemoteDeviceConnected); - RegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_DISCONNECTED, (BT_EVENT_HANDLER)RemoteDeviceDisconnected); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_ADDED, (BT_EVENT_HANDLER)AudioDeviceAdded); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_REMOVED, (BT_EVENT_HANDLER)AudioDeviceRemoved); - - pAbfBtInfo->AdapterCbRegistered = TRUE; - - A_INFO("[%s] BT Adapter Added\n",pAbfBtInfo->HCI_AdapterName); - - /* acquire default audio device */ - AcquireDefaultAudioDevice(pAbfBtInfo); - - status = A_OK; - - } while (FALSE); - - - return status; -} - -static void -ReleaseBTAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - - if (pAbfBtInfo->AdapterCbRegistered) { - pAbfBtInfo->AdapterCbRegistered = FALSE; - /* Free the resources held for the event handlers */ - DeRegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_STARTED); - DeRegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_FINISHED); - DeRegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_CONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_DISCONNECTED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_ADDED); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_REMOVED); - } - - ReleaseDefaultAudioDevice(pAbfBtInfo); - - CleanupHciEventFilter(pAbfBtInfo); - - A_MEMZERO(pAbfBtInfo->HCI_DeviceAddress, - sizeof(pAbfBtInfo->HCI_DeviceAddress)); - A_MEMZERO(pAbfBtInfo->HCI_DeviceName, - sizeof(pAbfBtInfo->HCI_DeviceName)); - A_MEMZERO(pAbfBtInfo->HCI_ManufacturerName, - sizeof(pAbfBtInfo->HCI_ManufacturerName)); - A_MEMZERO(pAbfBtInfo->HCI_ProtocolVersion, - sizeof(pAbfBtInfo->HCI_ProtocolVersion)); - pAbfBtInfo->HCI_LMPVersion = 0; - - pAbfBtInfo->AdapterAvailable = FALSE; -} - -#ifdef BLUEZ4_3 - -static A_STATUS -GetAdapterInfo(ABF_BT_INFO *pAbfBtInfo) -{ - - A_STATUS status; - - int i; - A_UCHAR eventBuffer[HCI_MAX_EVENT_SIZE]; - A_UCHAR *eventPtr; - int eventLen; - - /* Get adapter/device address by issuing HCI command, Read_BD_ADDR */ - status = IssueHCICommand(pAbfBtInfo, - cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BD_ADDR), - 0, - 0, - 2000, - eventBuffer, - sizeof(eventBuffer), - &eventPtr, - &eventLen); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get BD_ADDR \n", __FUNCTION__); - return status; - } - - if (eventBuffer[6] == 0) { /* READ_BD_ADDR was a success */ - for (i = 0; i < BD_ADDR_SIZE; i++) { - pAbfBtInfo->HCI_DeviceAddress[i] = eventBuffer[i+7]; - } - A_DEBUG("BT-HCI Device Address: (%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X)\n", - pAbfBtInfo->HCI_DeviceAddress[0], pAbfBtInfo->HCI_DeviceAddress[1], - pAbfBtInfo->HCI_DeviceAddress[2], pAbfBtInfo->HCI_DeviceAddress[3], - pAbfBtInfo->HCI_DeviceAddress[4], pAbfBtInfo->HCI_DeviceAddress[5]); - } - - status = A_OK; - - return status; -} - -#else - -static A_STATUS -GetAdapterInfo(ABF_BT_INFO *pAbfBtInfo) -{ - int count; - A_STATUS status = A_OK; - char tempStr[STRING_SIZE_MAX]; - - do { - /* device name */ - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetName", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->HCI_DeviceName, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->HCI_DeviceName)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to complete GetName \n", __FUNCTION__); - break; - } - - /* Manufacturer name */ - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetManufacturer", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->HCI_ManufacturerName, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->HCI_ManufacturerName)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to complete GetManufacturer \n", __FUNCTION__); - break; - } - - /* get LMP version */ - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetVersion", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->HCI_ProtocolVersion, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->HCI_ProtocolVersion)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to complete GetVersion \n", __FUNCTION__); - break; - } - - - for (count = 0; - ((count < sizeof(ver_map)/sizeof(hci_map)) && (ver_map[count].str)); - count++) - { - if (strstr(pAbfBtInfo->HCI_ProtocolVersion, ver_map[count].str)) { - pAbfBtInfo->HCI_LMPVersion = ver_map[count].val; - break; - } - } - - /* Device address */ - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetAddress", - NULL, - DBUS_TYPE_INVALID, - 0, - tempStr, - DBUS_TYPE_STRING, - sizeof(tempStr)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get Address \n", __FUNCTION__); - break; - } - - A_STR2ADDR(tempStr, pAbfBtInfo->HCI_DeviceAddress); - - } while (FALSE); - - - if (A_SUCCESS(status)) { - A_INFO("BT-HCI Device Address: (%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X)\n", - pAbfBtInfo->HCI_DeviceAddress[0], pAbfBtInfo->HCI_DeviceAddress[1], - pAbfBtInfo->HCI_DeviceAddress[2], pAbfBtInfo->HCI_DeviceAddress[3], - pAbfBtInfo->HCI_DeviceAddress[4], pAbfBtInfo->HCI_DeviceAddress[5]); - A_INFO("BT-HCI Device Name: %s\n", pAbfBtInfo->HCI_DeviceName); - A_INFO("BT-HCI Manufacturer Name: %s\n", pAbfBtInfo->HCI_ManufacturerName); - A_INFO("BT-HCI Protocol Version: %s\n", pAbfBtInfo->HCI_ProtocolVersion); - A_INFO("BT-HCI LMP Version: %d\n", pAbfBtInfo->HCI_LMPVersion); - - } - - return status; -} -#endif - - -static A_STATUS GetConnectedDeviceRole(ABF_BT_INFO *pAbfBtInfo, - A_CHAR *Address, - A_BOOL IsSCO, - A_UCHAR *pRole) -{ - A_STATUS status = A_ERROR; - struct hci_conn_list_req *connList = NULL; - struct hci_conn_info *connInfo = NULL; - int i, sk = -1; - int len; - - do { - - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (sk < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - len = (sizeof(*connInfo)) * ABTH_MAX_CONNECTIONS + sizeof(*connList); - - connList = (struct hci_conn_list_req *)A_MALLOC(len); - if (connList == NULL) { - break; - } - - A_MEMZERO(connList,len); - - connList->dev_id = pAbfBtInfo->AdapterId; - connList->conn_num = ABTH_MAX_CONNECTIONS; - connInfo = connList->conn_info; - - if (ioctl(sk, HCIGETCONNLIST, (void *)connList)) { - A_ERR("[%s] Failed to get connection list %d \n", __FUNCTION__, errno); - break; - } - /* walk through connection list */ - for (i = 0; i < connList->conn_num; i++, connInfo++) { - char addr[32]; - - /* convert to a string to compare */ - ba2str(&connInfo->bdaddr, addr); - - if (strcmp(addr,Address) != 0) { - continue; - } - - if (IsSCO) { - /* look for first non-ACL connection */ - if (connInfo->type == ACL_LINK) { - continue; - } - pAbfBtInfo->CurrentSCOLinkType = connInfo->type; - } else { - /* look for first ACL connection */ - if (connInfo->type != ACL_LINK) { - continue; - } - } - /* if we get here we have a connection we are interested in */ - if (connInfo->link_mode & HCI_LM_MASTER) { - /* master */ - *pRole = 0; - } else { - /* slave */ - *pRole = 1; - } - - A_INFO("[%s] Found Connection (Link-Type : %d), found role:%d \n", - Address, connInfo->type, *pRole); - break; - } - - if (i == connList->conn_num) { - A_ERR("[%s] Could not find connection info for %s %d \n", __FUNCTION__, Address); - break; - } - status = A_OK; - - } while (FALSE); - - if (sk >= 0) { - close(sk); - } - - if (connList != NULL) { - A_FREE(connList); - } - - return status; -} - -#ifdef BLUEZ4_3 - -static void GetBtAudioDeviceProperties(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status; - - pAbfBtInfo->DefaultRemoteAudioDevicePropsValid = FALSE; - - do { - - /* Need RemoteDeviceAddress */ - - - status = GetRemoteDeviceLMPVersion(pAbfBtInfo); - - /* assume 2.1 or later */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 4; - - if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.0") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 0; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.1") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 1; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.2") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"2.0") != NULL) { - /* NOTE: contrary to what the DBUS documentation says, the BT string will - * not indicate +EDR to indiate the remote device is EDR capable! - * */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 3; - } - - if (pAbfBtInfo->DefaultAudioDeviceLmpVersion >= 3) { - A_BOOL EDRCapable = FALSE; - /* double check that the device is EDR capable, a 2.0 device can be EDR or non EDR */ - status = CheckRemoteDeviceEDRCapable(pAbfBtInfo, &EDRCapable); - if (A_SUCCESS(status)) { - if (!EDRCapable) { - A_INFO("Remote Audio Device (%s) is not EDR Capable, downgrading lmp version.. \n", - pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - /* for audio coex, treat this like a 1.2 device */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - } - } - } - pAbfBtInfo->DefaultRemoteAudioDevicePropsValid = TRUE; - - } while (FALSE); - -} - -#else - -static void GetBtAudioDeviceProperties(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status; - - pAbfBtInfo->DefaultRemoteAudioDevicePropsValid = FALSE; - - do { - /* Device address */ - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_DEVICE_INTERFACE, - "GetAddress", - NULL, - DBUS_TYPE_INVALID, - 0, - pAbfBtInfo->DefaultRemoteAudioDeviceAddress, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->DefaultRemoteAudioDeviceAddress)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get address \n", __FUNCTION__); - break; - } - - A_INFO("Connected audio device address: %s \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetRemoteVersion", - pAbfBtInfo->DefaultRemoteAudioDeviceAddress, - DBUS_TYPE_STRING, - strlen(pAbfBtInfo->DefaultRemoteAudioDeviceAddress) + 1, - pAbfBtInfo->DefaultRemoteAudioDeviceVersion, - DBUS_TYPE_STRING, - sizeof(pAbfBtInfo->DefaultRemoteAudioDeviceVersion)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get remote version \n", __FUNCTION__); - break; - } - - A_INFO("Connected audio device remote version: %s \n", - pAbfBtInfo->DefaultRemoteAudioDeviceVersion); - - - /* assume 2.1 or later */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 4; - - if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.0") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 0; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.1") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 1; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"1.2") != NULL) { - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - } else if (strstr(pAbfBtInfo->DefaultRemoteAudioDeviceVersion,"2.0") != NULL) { - /* NOTE: contrary to what the DBUS documentation says, the BT string will - * not indicate +EDR to indiate the remote device is EDR capable! - * */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 3; - } - - if (pAbfBtInfo->DefaultAudioDeviceLmpVersion >= 3) { - A_BOOL EDRCapable = FALSE; - /* double check that the device is EDR capable, a 2.0 device can be EDR or non EDR */ - status = CheckRemoteDeviceEDRCapable(pAbfBtInfo, &EDRCapable); - if (A_SUCCESS(status)) { - if (!EDRCapable) { - A_INFO("Remote Audio Device (%s) is not EDR Capable, downgrading lmp version.. \n", - pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - /* for audio coex, treat this like a 1.2 device */ - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - } - } - } - - pAbfBtInfo->DefaultRemoteAudioDevicePropsValid = TRUE; - - } while (FALSE); - -} - -#endif - -#define LMP_FEATURE_ACL_EDR_2MBPS_BYTE_INDEX 3 -#define LMP_FEATURE_ACL_EDR_2MBPS_BIT_MASK 0x2 -#define LMP_FEATURE_ACL_EDR_3MBPS_BYTE_INDEX 3 -#define LMP_FEATURE_ACL_EDR_3MBPS_BIT_MASK 0x4 -#define LMP_FEATURES_LENGTH 8 - -#ifdef BLUEZ4_3 - -#define HCI_REMOTE_COMMAND_TIMEOUT 2000 -static A_STATUS GetRemoteAclDeviceHandle(ABF_BT_INFO *pAbfBtInfo, A_UINT16 *pConn_handle) -{ - A_STATUS status = A_OK; - int i, len, sk = -1; - struct hci_conn_list_req *connList = NULL; - struct hci_conn_info *connInfo = NULL; - do { - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (sk < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d\n", __FUNCTION__, errno); - status = A_NO_RESOURCE; - break; - } - - len = (sizeof(*connInfo)) * ABTH_MAX_CONNECTIONS + sizeof(*connList); - connList = (struct hci_conn_list_req *)A_MALLOC(len); - - if (connList == NULL) { - A_DEBUG("No connection found during calling function [%s]\n", __FUNCTION__); - status = A_NO_MEMORY; - break; - } - - A_MEMZERO(connList, len); - - connList->dev_id = pAbfBtInfo->AdapterId; - connList->conn_num = ABTH_MAX_CONNECTIONS; - connInfo = connList->conn_info; - - if (ioctl(sk, HCIGETCONNLIST, (void *)connList)) { - A_ERR("[%s] Failed to get connection list: %d\n", __FUNCTION__, errno); - status = A_EPERM; - break; - } - - for (i = 0; i < connList->conn_num; i++, connInfo++) { - if (connInfo->type == ACL_LINK) { - *pConn_handle = connInfo->handle; - break; - } - } - - if (i==connList->conn_num) { - status = A_ENOENT; - break; - } - } while (0); - if (connList != NULL) { - A_FREE(connList); - } - if (sk>=0) { - close(sk); - } - return status; -} - -static A_STATUS CheckRemoteDeviceEDRCapable(ABF_BT_INFO *pAbfBtInfo, A_BOOL *pEDRCapable) -{ - A_STATUS status; - A_UINT16 conn_handle; - A_UCHAR evtBuffer[HCI_MAX_EVENT_SIZE]; - A_UCHAR *eventPtr; - int eventLen; - A_UINT8 *lmp_features; - do { - status = GetRemoteAclDeviceHandle(pAbfBtInfo, &conn_handle); - if (A_FAILED(status)) { - break; - } - status = IssueHCICommand(pAbfBtInfo, - cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES), - (A_UCHAR *)&conn_handle, - 2, - HCI_REMOTE_COMMAND_TIMEOUT, - evtBuffer, - sizeof(evtBuffer), - &eventPtr, - &eventLen); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get remote features \n", __FUNCTION__); - break; - } - - /* Process LMP Features */ - lmp_features = &eventPtr[3]; - - A_DUMP_BUFFER(lmp_features,sizeof(lmp_features),"Remote Device LMP Features:"); - - if ((lmp_features[LMP_FEATURE_ACL_EDR_2MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_2MBPS_BIT_MASK) || - (lmp_features[LMP_FEATURE_ACL_EDR_3MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_3MBPS_BIT_MASK)) { - A_INFO("Device (%s) is EDR capable \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - *pEDRCapable = TRUE; - } else { - A_INFO("Device (%s) is NOT EDR capable \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - *pEDRCapable = FALSE; - } - } while (0); - - return status; -} - -/* This is new function to check remote device LMP version */ -static A_STATUS GetRemoteDeviceLMPVersion(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status; - A_UINT16 conn_handle; - A_UCHAR evtBuffer[HCI_MAX_EVENT_SIZE]; - A_UCHAR *eventPtr; - int eventLen; - - do { - status = GetRemoteAclDeviceHandle(pAbfBtInfo, &conn_handle); - if (A_FAILED(status)) { - break; - } - status = IssueHCICommand(pAbfBtInfo, - cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION), - (A_UCHAR *)&conn_handle, - 2, - HCI_REMOTE_COMMAND_TIMEOUT, - evtBuffer, - sizeof(evtBuffer), - &eventPtr, - &eventLen); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get remote Version \n", __FUNCTION__); - break; - } - - /* Process LMP Version */ - - if (eventPtr[3] == 0) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.0"); - } else if (eventPtr[3] == 1) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.1"); - } else if (eventPtr[3] == 2) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.2"); - } else if (eventPtr[3] == 3) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "2.0"); - } - - A_INFO("[%s], Remote Device LMP Version: %d, in string format this is: %s\n", __FUNCTION__, eventPtr[3], - pAbfBtInfo->DefaultRemoteAudioDeviceVersion); - } while (0); - - return status; -} - - -#else - -static A_STATUS CheckRemoteDeviceEDRCapable(ABF_BT_INFO *pAbfBtInfo, A_BOOL *pEDRCapable) -{ - A_STATUS status = A_OK; - A_UINT8 lmp_features[LMP_FEATURES_LENGTH]; - - do { - - A_MEMZERO(lmp_features,sizeof(lmp_features)); - - status = DoMethodCall(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->HCI_AdapterName, - ADAPTER_INTERFACE, - "GetRemoteFeatures", - pAbfBtInfo->DefaultRemoteAudioDeviceAddress, - DBUS_TYPE_STRING, - strlen(pAbfBtInfo->DefaultRemoteAudioDeviceAddress) + 1, - lmp_features, - DBUS_TYPE_ARRAY, - sizeof(lmp_features)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get remote features \n", __FUNCTION__); - break; - } - - A_DUMP_BUFFER(lmp_features,sizeof(lmp_features),"Remote Device LMP Features:"); - - if ((lmp_features[LMP_FEATURE_ACL_EDR_2MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_2MBPS_BIT_MASK) || - (lmp_features[LMP_FEATURE_ACL_EDR_3MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_3MBPS_BIT_MASK)) { - A_INFO("Device (%s) is EDR capable \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - *pEDRCapable = TRUE; - } else { - A_INFO("Device (%s) is NOT EDR capable \n", pAbfBtInfo->DefaultRemoteAudioDeviceAddress); - *pEDRCapable = FALSE; - } - - } while (FALSE); - - return status; -} - -#endif - -static void GetBtAudioConnectionProperties(ABF_BT_INFO *pAbfBtInfo, - ATHBT_STATE_INDICATION Indication) -{ - A_UCHAR role = 0; - A_CHAR *pDescr = NULL; - A_STATUS status; - - do { - if (!pAbfBtInfo->DefaultRemoteAudioDevicePropsValid) { - break; - } - - /* Incases where HciX is not supported, don't check for the role */ - if((pAbfBtInfo->pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - return; - } - /* get role */ - status = GetConnectedDeviceRole(pAbfBtInfo, - pAbfBtInfo->DefaultRemoteAudioDeviceAddress, - Indication == ATH_BT_A2DP ?FALSE : TRUE, - &role); - if (A_FAILED(status)) { - role = 0; - } - if (Indication == ATH_BT_A2DP) { - pDescr = "A2DP"; - pAbfBtInfo->pInfo->A2DPConnection_LMPVersion = pAbfBtInfo->DefaultAudioDeviceLmpVersion; - pAbfBtInfo->pInfo->A2DPConnection_Role = role; - } else if (Indication == ATH_BT_SCO) { - if (pAbfBtInfo->CurrentSCOLinkType == SCO_LINK) { - pDescr = "SCO"; - } else { - pDescr = "eSCO"; - } - pAbfBtInfo->pInfo->SCOConnection_LMPVersion = pAbfBtInfo->DefaultAudioDeviceLmpVersion; - pAbfBtInfo->pInfo->SCOConnection_Role = role; - - if((pAbfBtInfo->pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING)) { - - pAbfBtInfo->pInfo->SCOConnectInfo.Valid = TRUE; - }else{ - /* for SCO connections check if the event filter captured - * the SYNCH connection complete event */ - CheckHciEventFilter(pAbfBtInfo); - } - } else { - pDescr = "UNKNOWN!!"; - } - - A_INFO("BT Audio connection properties: (%s) (role: %s, lmp version: %d) \n", - pDescr, role ? "SLAVE" : "MASTER", pAbfBtInfo->DefaultAudioDeviceLmpVersion); - - } while (FALSE); - -} - - -static A_STATUS WaitForHCIEvent(int Socket, - int TimeoutMs, - A_UCHAR *pBuffer, - int MaxLength, - A_UCHAR EventCode, - A_UINT16 OpCode, - A_UCHAR **ppEventPtr, - int *pEventLength) -{ - - int eventLen; - hci_event_hdr *eventHdr; - struct pollfd pfd; - int result; - A_UCHAR *eventPtr; - A_STATUS status = A_OK; - - *ppEventPtr = NULL; - A_MEMZERO(&pfd,sizeof(pfd)); - pfd.fd = Socket; - pfd.events = POLLIN; - - if (EventCode == EVT_CMD_COMPLETE) { - A_INFO("Waiting for HCI CMD Complete Event, Opcode: 0x%4.4X (%d MS) \n",OpCode, TimeoutMs); - } else { - A_INFO("Waiting for HCI Event: %d (%d MS) \n",EventCode, TimeoutMs); - } - - while (1) { - - /* check socket for a captured event using a short timeout - * the caller usually calls this function when it knows there - * is an event that is likely to be captured */ - result = poll(&pfd, 1, TimeoutMs); - - if (result < 0) { - if ((errno == EAGAIN) || (errno == EINTR)) { - /* interrupted */ - } else { - A_ERR("[%s] Socket Poll Failed! : %d \n", __FUNCTION__, errno); - status = A_ERROR; - } - break; - } - - if (result == 0) { - A_ERR("[%s], poll returned with 0 \n",__FUNCTION__); - status = A_ERROR; - break; - } - - if (!(pfd.revents & POLLIN)) { - A_ERR("[%s], POLLIN check failed\n",__FUNCTION__); - status = A_ERROR; - break; - } - /* get the packet */ - eventLen = read(Socket, pBuffer, MaxLength); - if (eventLen == 0) { - /* no event */ - A_INFO("[%s], No Event\n",__FUNCTION__); - status = A_ERROR; - break; - } - if(eventLen > MaxLength) { - A_ERR("[%s] Length longer than expected (%d) : %d \n", __FUNCTION__, MaxLength, - eventLen); - status = A_ERROR; - break; - } - if (eventLen < (1 + HCI_EVENT_HDR_SIZE)) { - A_ERR("[%s] Unknown receive packet! len : %d \n", __FUNCTION__, eventLen); - status = A_ERROR; - break; - } - if (pBuffer[0] != HCI_EVENT_PKT) { - A_ERR("[%s] Unsupported packet type : %d \n", __FUNCTION__, pBuffer[0]); - status = A_ERROR; - break; - } - - eventPtr = &pBuffer[1]; - eventLen--; - eventHdr = (hci_event_hdr *)eventPtr; - eventPtr += HCI_EVENT_HDR_SIZE; - eventLen -= HCI_EVENT_HDR_SIZE; - - if (eventHdr->evt != EventCode) { - /* not interested in this one */ - continue; - } - if(eventPtr == NULL) { - A_ERR("[%s] Socket read points to NULL\n", __FUNCTION__); - status = A_ERROR; - break; - } - if (eventHdr->evt == EVT_CMD_COMPLETE) { - if (eventLen < sizeof(evt_cmd_complete)) { - A_ERR("[%s] EVT_CMD_COMPLETE event is too small! len=%d \n", __FUNCTION__, eventLen); - status = A_ERROR; - break; - } else { - A_UINT16 evOpCode = btohs(BTEV_CMD_COMPLETE_GET_OPCODE(eventPtr)); - /* check for opCode match */ - if (OpCode != evOpCode) { - /* keep searching */ - continue; - } - } - } - /* found it */ - *ppEventPtr = eventPtr; - *pEventLength = eventLen; - - break; - - } - - return status; -} - -static void CheckHciEventFilter(ABF_BT_INFO *pAbfBtInfo) -{ - A_UCHAR buffer[HCI_MAX_EVENT_SIZE]; - A_STATUS status; - A_UCHAR *eventPtr; - int eventLen; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - - do { - - if (!USE_DBUS_FOR_HEADSET_PROFILE(pInfo)) { - A_ERR("Calling CheckHciEventFilter is not valid in this mode! \n"); - break; - } - - status = WaitForHCIEvent(pAbfBtInfo->HCIEventListenerSocket, - 100, - buffer, - sizeof(buffer), - EVT_SYNC_CONN_COMPLETE, - 0, - &eventPtr, - &eventLen); - - if (A_FAILED(status)) { - break; - } - - if (eventPtr == NULL) { - break; - } - - if (eventLen < sizeof(evt_sync_conn_complete)) { - A_ERR("SYNC_CONN_COMPLETE Event is too small! : %d \n", eventLen); - break; - } - - pAbfBtInfo->pInfo->SCOConnectInfo.LinkType = BTEV_GET_BT_CONN_LINK_TYPE(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.TransmissionInterval = BTEV_GET_TRANS_INTERVAL(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.RetransmissionInterval = BTEV_GET_RETRANS_INTERVAL(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.RxPacketLength = BTEV_GET_RX_PKT_LEN(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.TxPacketLength = BTEV_GET_TX_PKT_LEN(eventPtr); - - A_INFO("HCI SYNC_CONN_COMPLETE event captured, conn info (%d, %d, %d, %d, %d) \n", - pAbfBtInfo->pInfo->SCOConnectInfo.LinkType, - pAbfBtInfo->pInfo->SCOConnectInfo.TransmissionInterval, - pAbfBtInfo->pInfo->SCOConnectInfo.RetransmissionInterval, - pAbfBtInfo->pInfo->SCOConnectInfo.RxPacketLength, - pAbfBtInfo->pInfo->SCOConnectInfo.TxPacketLength); - - /* now valid */ - pAbfBtInfo->pInfo->SCOConnectInfo.Valid = TRUE; - - } while (FALSE); - -} - -static void CleanupHciEventFilter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status; - - if (pAbfBtInfo->HCIEventListenerSocket >= 0) { - pAbfBtInfo->HCIFilterThreadShutdown = TRUE; - /* close socket, if there is a thread waiting on this socket, it will error and then exit */ - close(pAbfBtInfo->HCIEventListenerSocket); - pAbfBtInfo->HCIEventListenerSocket = -1; - - if (pAbfBtInfo->HCIFilterThreadCreated) { - A_INFO("[%s] Waiting for HCI filter thread to exit... \n", - __FUNCTION__); - /* wait for thread to exit - * note: JOIN cleans up thread resources as per POSIX spec. */ - status = A_TASK_JOIN(&pAbfBtInfo->hBtHCIFilterThread); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to JOIN HCI filter thread \n", - __FUNCTION__); - } - A_MEMZERO(&pAbfBtInfo->hBtHCIFilterThread,sizeof(pAbfBtInfo->hBtHCIFilterThread)); - pAbfBtInfo->HCIFilterThreadCreated = FALSE; - } - - pAbfBtInfo->HCIFilterThreadShutdown = FALSE; - } - -} - - -static A_STATUS SetupHciEventFilter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status = A_ERROR; - struct hci_filter filterSetting; - struct sockaddr_hci addr; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - do { - - if (pAbfBtInfo->HCIEventListenerSocket >= 0) { - /* close previous */ - CleanupHciEventFilter(pAbfBtInfo); - } - - pAbfBtInfo->HCIEventListenerSocket = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (pAbfBtInfo->HCIEventListenerSocket < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - /* To caputre INQUIRY command capture */ - hci_filter_set_ptype(HCI_COMMAND_PKT, &filterSetting); - - /* capture SYNC_CONN Complete */ - hci_filter_set_event(EVT_SYNC_CONN_COMPLETE, &filterSetting); - - /* Capture INQUIRY_COMPLETE event */ - hci_filter_set_event(EVT_INQUIRY_COMPLETE, &filterSetting); - hci_filter_set_event(EVT_CONN_REQUEST, &filterSetting); - hci_filter_set_event(EVT_PIN_CODE_REQ, &filterSetting); - hci_filter_set_event(EVT_LINK_KEY_REQ, &filterSetting); - hci_filter_set_event(EVT_CONN_COMPLETE, &filterSetting); - hci_filter_set_event(EVT_LINK_KEY_NOTIFY, &filterSetting); - - - - if (!USE_DBUS_FOR_HEADSET_PROFILE(pInfo)) { - /* if we are not using DBUS for the headset profile, we need - * to capture other HCI event packets */ - hci_filter_set_event(EVT_DISCONN_COMPLETE, &filterSetting); - hci_filter_set_event(EVT_CONN_COMPLETE, &filterSetting); - } - - if (setsockopt(pAbfBtInfo->HCIEventListenerSocket, - SOL_HCI, - HCI_FILTER, - &filterSetting, - sizeof(filterSetting)) < 0) { - A_ERR("[%s] Failed to set socket opt: %d \n", __FUNCTION__, errno); - break; - } - - A_MEMZERO(&addr,sizeof(addr)); - /* bind to the current adapter */ - addr.hci_family = AF_BLUETOOTH; - addr.hci_dev = pAbfBtInfo->AdapterId; - - if (bind(pAbfBtInfo->HCIEventListenerSocket, - (struct sockaddr *)&addr, - sizeof(addr)) < 0) { - A_ERR("[%s] Can't bind to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - A_INFO("BT Event Filter Set, Mask: 0x%8.8X:%8.8X \n", - filterSetting.event_mask[1], filterSetting.event_mask[0]); -#ifdef BLUEZ4_3 - if (1) { -#else - if (!USE_DBUS_FOR_HEADSET_PROFILE(pInfo)) { -#endif - /* spawn a thread that will capture HCI events from the adapter */ - status = A_TASK_CREATE(&pAbfBtInfo->hBtHCIFilterThread, HCIFilterThread, pAbfBtInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to spawn a BT thread\n", __FUNCTION__); - break; - } - pAbfBtInfo->HCIFilterThreadCreated = TRUE; - } - - status = A_OK; - - } while (FALSE); - - if (A_FAILED(status)) { - CleanupHciEventFilter(pAbfBtInfo); - } - - return status; -} - - - /* issue HCI command, currently this ONLY supports simple commands that - * only expect a command complete, the event pointer returned points to the command - * complete event structure for the caller to decode */ -static A_STATUS IssueHCICommand(ABF_BT_INFO *pAbfBtInfo, - A_UINT16 OpCode, - A_UCHAR *pCmdData, - int CmdLength, - int EventRecvTimeoutMS, - A_UCHAR *pEventBuffer, - int MaxLength, - A_UCHAR **ppEventPtr, - int *pEventLength) -{ - A_STATUS status = A_ERROR; - A_UCHAR hciType = HCI_COMMAND_PKT; - hci_command_hdr hciCommandHdr; - struct iovec iv[3]; - int ivcount = 0; - int sk,result; - struct hci_filter filterSetting; - struct sockaddr_hci addr; - - do { - - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (sk < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - hciCommandHdr.opcode = htobs(OpCode); - hciCommandHdr.plen= CmdLength; - - iv[0].iov_base = &hciType; - iv[0].iov_len = 1; - ivcount++; - iv[1].iov_base = &hciCommandHdr; - iv[1].iov_len = HCI_COMMAND_HDR_SIZE; - ivcount++; - - if (pCmdData != NULL) { - iv[2].iov_base = pCmdData; - iv[2].iov_len = CmdLength; - ivcount++; - } - - /* setup socket to capture the event */ - if (OpCode == cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES)) { - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - hci_filter_set_event(EVT_READ_REMOTE_FEATURES_COMPLETE, &filterSetting); - } else if (OpCode == cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION)) { - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - hci_filter_set_event(EVT_READ_REMOTE_VERSION_COMPLETE, &filterSetting); - } - else { - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - hci_filter_set_event(EVT_CMD_COMPLETE, &filterSetting); - } - - if (setsockopt(sk, SOL_HCI, HCI_FILTER, &filterSetting, sizeof(filterSetting)) < 0) { - A_ERR("[%s] Failed to set socket opt: %d \n", __FUNCTION__, errno); - break; - } - - A_MEMZERO(&addr,sizeof(addr)); - addr.hci_family = AF_BLUETOOTH; - addr.hci_dev = pAbfBtInfo->AdapterId; - - if (bind(sk,(struct sockaddr *)&addr, sizeof(addr)) < 0) { - A_ERR("[%s] Can't bind to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - while ((result = writev(sk, iv, ivcount)) < 0) { - if (errno == EAGAIN || errno == EINTR) { - continue; - } - break; - } - - if (result <= 0) { - A_ERR("[%s] Failed to write to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - /* To support new HCI Commands */ - switch (OpCode) { - case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES): - status = WaitForHCIEvent(sk, - EventRecvTimeoutMS, - pEventBuffer, - MaxLength, - EVT_READ_REMOTE_FEATURES_COMPLETE, - OpCode, - ppEventPtr, - pEventLength); - break; - case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION): - status = WaitForHCIEvent(sk, - EventRecvTimeoutMS, - pEventBuffer, - MaxLength, - EVT_READ_REMOTE_VERSION_COMPLETE, - OpCode, - ppEventPtr, - pEventLength); - break; - default: - status = WaitForHCIEvent(sk, - EventRecvTimeoutMS, - pEventBuffer, - MaxLength, - EVT_CMD_COMPLETE, - OpCode, - ppEventPtr, - pEventLength); - break; - } - - if (A_FAILED(status)) { - break; - } - - status = A_OK; - - } while (FALSE); - - if (sk >= 0) { - close(sk); - } - - return status; -} - -#define AFH_CHANNEL_MAP_BYTES 10 - -typedef struct _WLAN_CHANNEL_MAP { - A_UCHAR Map[AFH_CHANNEL_MAP_BYTES]; -} WLAN_CHANNEL_MAP; - -#define MAX_WLAN_CHANNELS 14 - -typedef struct _WLAN_CHANNEL_RANGE { - int ChannelNumber; - int Center; /* in Mhz */ -} WLAN_CHANNEL_RANGE; - -const WLAN_CHANNEL_RANGE g_ChannelTable[MAX_WLAN_CHANNELS] = { - { 1 , 2412}, - { 2 , 2417}, - { 3 , 2422}, - { 4 , 2427}, - { 5 , 2432}, - { 6 , 2437}, - { 7 , 2442}, - { 8 , 2447}, - { 9 , 2452}, - { 10 , 2457}, - { 11 , 2462}, - { 12 , 2467}, - { 13 , 2472}, - { 14 , 2484}, -}; - -static WLAN_CHANNEL_MAP g_ChannelMapTable[MAX_WLAN_CHANNELS + 1] = { - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 0 -- no WLAN */ - { {0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 1 */ - { {0x0F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 2 */ - { {0xFF,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 3 */ - { {0xFF,0x3F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 4 */ - { {0xFF,0xFF,0x07,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x7F}}, /* 5 */ - { {0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x7F}}, /* 6 */ - { {0xFF,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x7F}}, /* 7 */ - { {0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFE,0xFF,0x7F}}, /* 8 */ - { {0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0xC0,0xFF,0x7F}}, /* 9 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF8,0x7F}}, /* 10 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x7F}}, /* 11 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x60}}, /* 12 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00}}, /* 13 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}}, /* 14 */ -}; - -#define AFH_COMMAND_COMPLETE_TIMEOUT_MS 2000 - -static int LookUpChannel(int FreqMhz) -{ - int i; - - if (FreqMhz == 0) { - /* not connected */ - return 0; - } - - for (i = 0; i < MAX_WLAN_CHANNELS; i++) { - if (FreqMhz <= g_ChannelTable[i].Center) { - break; - } - } - return (i < MAX_WLAN_CHANNELS) ? g_ChannelTable[i].ChannelNumber : 0; -} - -static A_STATUS IssueAFHChannelClassification(ABF_BT_INFO *pAbfBtInfo, int CurrentWLANChannel) -{ - A_UCHAR evtBuffer[HCI_MAX_EVENT_SIZE]; - A_STATUS status; - A_UCHAR *eventPtr; - int eventLen; - A_UCHAR *pChannelMap; - - A_INFO("WLAN Operating Channel: %d \n", CurrentWLANChannel); - - if (CurrentWLANChannel > MAX_WLAN_CHANNELS) { - /* check if this is expressed in Mhz */ - if (CurrentWLANChannel >= 2412) { - /* convert Mhz into a channel number */ - CurrentWLANChannel = LookUpChannel(CurrentWLANChannel); - } else { - return A_ERROR; - } - } - - pChannelMap = &(g_ChannelMapTable[CurrentWLANChannel].Map[0]); - - do { - - status = IssueHCICommand(pAbfBtInfo, - cmd_opcode_pack(3,0x3F), - pChannelMap, - AFH_CHANNEL_MAP_BYTES, - AFH_COMMAND_COMPLETE_TIMEOUT_MS, - evtBuffer, - sizeof(evtBuffer), - &eventPtr, - &eventLen); - - - if (A_FAILED(status)) { - break; - } - - status = A_ERROR; - - if (eventPtr == NULL) { - A_ERR("[%s] Failed to capture AFH command complete event \n", __FUNCTION__); - break; - } - - if (eventLen < (sizeof(evt_cmd_complete) + 1)) { - A_ERR("[%s] not enough bytes in AFH command complete event %d \n", __FUNCTION__, eventLen); - break; - } - - /* check status parameter that follows the command complete event body */ - if (eventPtr[sizeof(evt_cmd_complete)] != 0) { - A_ERR("[%s] AFH command complete event indicated failure : %d \n", __FUNCTION__, - eventPtr[sizeof(evt_cmd_complete)]); - break; - } - - A_INFO(" AFH Command successfully issued \n"); - //A_DUMP_BUFFER(pChannelMap, AFH_CHANNEL_MAP_BYTES, "AFH Channel Classification Map"); - - status = A_OK; - - } while (FALSE); - - return status; -} - -void IndicateCurrentWLANOperatingChannel(ATHBT_FILTER_INFO *pFilterInfo, int CurrentWLANChannel) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)pFilterInfo->pBtInfo; - ATHBT_FILTER_INFO *pInfo = pAbfBtInfo->pInfo; - - if (NULL == pAbfBtInfo) { - return; - } - - if (pFilterInfo->Flags & ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION) { - IssueAFHChannelClassification(pAbfBtInfo,CurrentWLANChannel); - } - - if(pInfo->Flags & ABF_USE_ONLY_DBUS_FILTERING) { - Abf_IssueAFHViaHciLib(pAbfBtInfo, CurrentWLANChannel); - } -} - -#ifdef BLUEZ4_3 -static void *HCIFilterThread(void *arg) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)arg; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - A_UINT8 buffer[300]; - A_UINT8 *pBuffer; - int eventLen; - - A_INFO("[%s] starting up \n", __FUNCTION__); - - while (1) { - - pBuffer = buffer; - - if (pAbfBtInfo->HCIFilterThreadShutdown) { - break; - } - /* get the packet */ - eventLen = read(pAbfBtInfo->HCIEventListenerSocket, pBuffer, sizeof(buffer)); - - if (eventLen < 0) { - if (!pAbfBtInfo->HCIFilterThreadShutdown) { - A_ERR("[%s] socket error %d \n", __FUNCTION__, eventLen); - } - break; - } - - if (eventLen == 0) { - /* no event */ - continue; - } - - if (eventLen < (1 + HCI_EVENT_HDR_SIZE)) { - A_ERR("[%s] Unknown receive packet! len : %d \n", __FUNCTION__, eventLen); - continue; - } - - /* first byte is a tag for the HCI packet type, we only care about events */ - if (pBuffer[0] == HCI_EVENT_PKT) { - /* pass this raw HCI event to the filter core */ - AthBtFilterHciEvent(pInstance,&pBuffer[1],eventLen - 1); - A_UINT8 *eventCode = &pBuffer[1]; - /* revive deprecated "DiscoveryCompleted" signal in BlueZ 4.x */ - if (*eventCode == EVT_INQUIRY_COMPLETE) { - A_DEBUG("Device Inquiry Completed\n"); - pAbfBtInfo->btInquiryState &= ~(1 << 0); - if(!pAbfBtInfo->btInquiryState) { - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - if (*eventCode == EVT_PIN_CODE_REQ) { - A_DEBUG("Pin Code Request\n"); - pAbfBtInfo->btInquiryState |= (1 << 0xF); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); - } - if (*eventCode == EVT_LINK_KEY_NOTIFY) { - A_DEBUG("link key notify\n"); - pAbfBtInfo->btInquiryState &= ~(1 << 0xF); - if(!pAbfBtInfo->btInquiryState) { - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - - if(*eventCode == EVT_CONN_COMPLETE) { - A_DEBUG("Conn complete\n"); - pAbfBtInfo->btInquiryState &= ~(1 << 2); - if(!pAbfBtInfo->btInquiryState) { - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - /* revive deprecated "DiscoveryStarted" signal by capturing INQUIRY commands */ - } else if (pBuffer[0] == HCI_COMMAND_PKT) { - A_UINT16 *packedOpCode = (A_UINT16 *)&pBuffer[1]; - if(cmd_opcode_ogf(*packedOpCode) == 0x1 && - cmd_opcode_ocf(*packedOpCode) == 0x5 ) - { - A_DEBUG("Bt-Connect\n"); - pAbfBtInfo->btInquiryState |= (1 << 2); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); - } - - - if (*packedOpCode == cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY) - || *packedOpCode == cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY)) { - // AthBtFilterHciEvent(pInstance,&pBuffer[1],eventLen - 1); - A_DEBUG("Device Inquiry Started\n"); - pAbfBtInfo->btInquiryState |= (1 << 0); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); - } else if (*packedOpCode == cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN)) { - /* "Connected" signal is deprecated and won't record BD_ADDR of remote device connected */ - ba2str((const bdaddr_t *)&pBuffer[4], &pAbfBtInfo->DefaultRemoteAudioDeviceAddress[0]); - } - } else { - A_ERR("[%s] Unsupported packet type : %d \n", __FUNCTION__, buffer[0]); - continue; - } - } - - A_INFO("[%s] exiting \n", __FUNCTION__); - - return NULL; -} - -#else - -static void *HCIFilterThread(void *arg) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)arg; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - A_UINT8 buffer[300]; - A_UINT8 *pBuffer; - int eventLen; - - A_INFO("[%s] starting up \n", __FUNCTION__); - - while (1) { - - pBuffer = buffer; - - if (pAbfBtInfo->HCIFilterThreadShutdown) { - break; - } - - /* get the packet */ - eventLen = read(pAbfBtInfo->HCIEventListenerSocket, pBuffer, sizeof(buffer)); - - if (eventLen < 0) { - if (!pAbfBtInfo->HCIFilterThreadShutdown) { - A_ERR("[%s] socket error %d \n", __FUNCTION__, eventLen); - } - break; - } - - if (eventLen == 0) { - /* no event */ - continue; - } - - if (eventLen < (1 + HCI_EVENT_HDR_SIZE)) { - A_ERR("[%s] Unknown receive packet! len : %d \n", __FUNCTION__, eventLen); - continue; - } - - /* first byte is a tag for the HCI packet type, we only care about events */ - if (pBuffer[0] != HCI_EVENT_PKT) { - A_ERR("[%s] Unsupported packet type : %d \n", __FUNCTION__, buffer[0]); - continue; - } - - /* pass this raw HCI event to the filter core */ - AthBtFilterHciEvent(pInstance,&pBuffer[1],eventLen - 1); - } - - A_INFO("[%s] exiting \n", __FUNCTION__); - - return NULL; -} - -#endif - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.h deleted file mode 100644 index 4bc7c55dc0cb..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus.h +++ /dev/null @@ -1,93 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -#ifndef ABTFILT_BTSTACK_DBUS_H_ -#define ABTFILT_BTSTACK_DBUS_H_ -#include "abtfilt_int.h" -#include - -/*-----------------------------------------------------------------------*/ -/* BT Section */ -#define STRING_SIZE_MAX 128 -#define BD_ADDR_SIZE 6 - - -typedef void (* BT_EVENT_HANDLER)(void *,void *); - -typedef enum { - BT_ADAPTER_ADDED = 0, - BT_ADAPTER_REMOVED, - DEVICE_DISCOVERY_STARTED, - DEVICE_DISCOVERY_FINISHED, - REMOTE_DEVICE_CONNECTED, - REMOTE_DEVICE_DISCONNECTED, - AUDIO_DEVICE_ADDED, - AUDIO_DEVICE_REMOVED, - AUDIO_HEADSET_CONNECTED, - AUDIO_HEADSET_DISCONNECTED, - AUDIO_HEADSET_STREAM_STARTED, - AUDIO_HEADSET_STREAM_STOPPED, - AUDIO_GATEWAY_CONNECTED, /* Not Implemented */ - AUDIO_GATEWAY_DISCONNECTED, /* Not Implemented */ - AUDIO_SINK_CONNECTED, - AUDIO_SINK_DISCONNECTED, - AUDIO_SINK_STREAM_STARTED, - AUDIO_SINK_STREAM_STOPPED, - AUDIO_SOURCE_CONNECTED, /* Not Implemented */ - AUDIO_SOURCE_DISCONNECTED, /* Not Implemented */ - BT_EVENTS_NUM_MAX, -} BT_STACK_EVENT; - -typedef struct _ABF_BT_INFO { - ATHBT_FILTER_INFO *pInfo; - A_MUTEX_OBJECT hWaitEventLock; - A_BOOL AdapterAvailable; - DBusConnection *Bus; - A_UINT8 HCIVersion; - A_UINT16 HCIRevision; - A_UINT8 HCI_LMPVersion; - A_UINT16 HCI_LMPSubVersion; - A_UINT8 RemoteDevice[BD_ADDR_SIZE]; - A_UINT8 HCI_DeviceAddress[BD_ADDR_SIZE]; - A_CHAR HCI_AdapterName[STRING_SIZE_MAX]; - A_CHAR HCI_DeviceName[STRING_SIZE_MAX]; - A_CHAR HCI_ManufacturerName[STRING_SIZE_MAX]; - A_CHAR HCI_ProtocolVersion[STRING_SIZE_MAX]; - A_BOOL AdapterCbRegistered; - A_CHAR DefaultAudioDeviceName[STRING_SIZE_MAX]; - A_CHAR DefaultRemoteAudioDeviceAddress[32]; - A_CHAR DefaultRemoteAudioDeviceVersion[32]; - A_UINT8 DefaultAudioDeviceLmpVersion; - A_BOOL DefaultAudioDeviceAvailable; - A_BOOL AudioCbRegistered; - A_UCHAR CurrentSCOLinkType; - int AdapterId; - int HCIEventListenerSocket; - A_TASK_HANDLE hBtHCIFilterThread; - A_BOOL HCIFilterThreadCreated; - A_BOOL HCIFilterThreadShutdown; - BT_EVENT_HANDLER SignalHandlers[BT_EVENTS_NUM_MAX]; - A_BOOL DefaultRemoteAudioDevicePropsValid; - A_BOOL ThreadCreated; - A_UINT32 btInquiryState; -} ABF_BT_INFO; - -#endif /*ABTFILT_BTSTACK_DBUS_H_*/ diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.c deleted file mode 100644 index c9018366e529..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.c +++ /dev/null @@ -1,1855 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Author(s): ="Atheros" -//============================================================================== - -/* - * Bluetooth Filter - BT module - * - */ -static const char athId[] __attribute__ ((unused)) = "$Id: //depot/sw/releases/olca3.1-RC/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.c#1 $"; - -#include "abtfilt_bluez_dbus_glib.h" - -#include -#undef HCI_INQUIRY -#include -#include -#include -#include - -/* Definitions */ -#define BLUEZ_NAME "org.bluez" -#define BLUEZ_PATH "/org/bluez" -#define ADAPTER_INTERFACE "org.bluez.Adapter" -#define MANAGER_INTERFACE "org.bluez.Manager" -#define AUDIO_MANAGER_PATH "/org/bluez/audio" -#define AUDIO_SINK_INTERFACE "org.bluez.audio.Sink" -#define AUDIO_SOURCE_INTERFACE "org.bluez.audio.Source" -#define AUDIO_MANAGER_INTERFACE "org.bluez.audio.Manager" -#define AUDIO_HEADSET_INTERFACE "org.bluez.audio.Headset" -#define AUDIO_GATEWAY_INTERFACE "org.bluez.audio.Gateway" -#define AUDIO_DEVICE_INTERFACE "org.bluez.audio.Device" - -#define BTEV_GET_BT_CONN_LINK_TYPE(p) ((p)[9]) -#define BTEV_GET_TRANS_INTERVAL(p) ((p)[10]) -#define BTEV_GET_RETRANS_INTERVAL(p) ((p)[11]) -#define BTEV_GET_RX_PKT_LEN(p) ((A_UINT16)((p)[12]) | (((A_UINT16)((p)[13])) << 8)) -#define BTEV_GET_TX_PKT_LEN(p) ((A_UINT16)((p)[14]) | (((A_UINT16)((p)[15])) << 8)) -#define BTEV_CMD_COMPLETE_GET_OPCODE(p) ((A_UINT16)((p)[1]) | (((A_UINT16)((p)[2])) << 8)) -#define BTEV_CMD_COMPLETE_GET_STATUS(p) ((p)[3]) - -typedef enum { - BT_ADAPTER_ADDED = 0, - BT_ADAPTER_REMOVED, - DEVICE_DISCOVERY_STARTED, - DEVICE_DISCOVERY_FINISHED, - REMOTE_DEVICE_CONNECTED, - REMOTE_DEVICE_DISCONNECTED, - AUDIO_DEVICE_ADDED, - AUDIO_DEVICE_REMOVED, - AUDIO_HEADSET_CONNECTED, - AUDIO_HEADSET_DISCONNECTED, - AUDIO_HEADSET_STREAM_STARTED, - AUDIO_HEADSET_STREAM_STOPPED, - AUDIO_GATEWAY_CONNECTED, /* Not Implemented */ - AUDIO_GATEWAY_DISCONNECTED, /* Not Implemented */ - AUDIO_SINK_CONNECTED, - AUDIO_SINK_DISCONNECTED, - AUDIO_SINK_STREAM_STARTED, - AUDIO_SINK_STREAM_STOPPED, - AUDIO_SOURCE_CONNECTED, /* Not Implemented */ - AUDIO_SOURCE_DISCONNECTED, /* Not Implemented */ - BT_EVENTS_NUM_MAX, -} BT_STACK_EVENT; - -typedef enum { - PROXY_INVALID = 0, - DEVICE_MANAGER, - DEVICE_ADAPTER, - AUDIO_MANAGER, - AUDIO_HEADSET, - AUDIO_GATEWAY, - AUDIO_SOURCE, - AUDIO_SINK, -} BT_PROXY_TYPE; - -typedef enum { - ARG_INVALID = 0, - ARG_NONE, - ARG_STRING, -} BT_CB_TYPE; - -typedef struct _BT_NOTIFICATION_CONFIG_PARAMS { - const char *name; - BT_PROXY_TYPE proxy; - BT_CB_TYPE arg; -} BT_NOTIFICATION_CONFIG_PARAMS; - -static BT_NOTIFICATION_CONFIG_PARAMS g_NotificationConfig[BT_EVENTS_NUM_MAX] = -{ - /* BT_ADAPTER_ADDED */ - {"AdapterAdded", DEVICE_MANAGER, ARG_STRING}, - /* BT_ADAPTER_REMOVED */ - {"AdapterRemoved", DEVICE_MANAGER, ARG_STRING}, - /* DEVICE_DISCOVERY_STARTED */ - {"DiscoveryStarted", DEVICE_ADAPTER, ARG_NONE}, - /* DEVICE_DISCOVERY_FINISHED */ - {"DiscoveryCompleted", DEVICE_ADAPTER, ARG_NONE}, - /* REMOTE_DEVICE_CONNECTED */ - {"RemoteDeviceConnected", DEVICE_ADAPTER, ARG_STRING}, - /* REMOTE_DEVICE_DISCONNECTED */ - {"RemoteDeviceDisconnected", DEVICE_ADAPTER, ARG_STRING}, - /* AUDIO_DEVICE_ADDED */ - {"DeviceCreated", AUDIO_MANAGER, ARG_STRING}, - /* AUDIO_DEVICE_REMOVED */ - {"DeviceRemoved", AUDIO_MANAGER, ARG_STRING}, - /* AUDIO_HEADSET_CONNECTED */ - {"Connected", AUDIO_HEADSET, ARG_NONE}, - /* AUDIO_HEADSET_DISCONNECTED */ - {"Disconnected", AUDIO_HEADSET, ARG_NONE}, - /* AUDIO_HEADSET_STREAM_STARTED */ - {"Playing", AUDIO_HEADSET, ARG_NONE}, - /* AUDIO_HEADSET_STREAM_STOPPED */ - {"Stopped", AUDIO_HEADSET, ARG_NONE}, - /* AUDIO_GATEWAY_CONNECTED */ - {NULL, PROXY_INVALID, ARG_INVALID}, - /* AUDIO_GATEWAY_DISCONNECTED */ - {NULL, PROXY_INVALID, ARG_INVALID}, - /* AUDIO_SINK_CONNECTED */ - {"Connected", AUDIO_SINK, ARG_NONE}, - /* AUDIO_SINK_DISCONNECTED */ - {"Disconnected", AUDIO_SINK, ARG_NONE}, - /* AUDIO_SINK_STREAM_STARTED */ - {"Playing", AUDIO_SINK, ARG_NONE}, - /* AUDIO_SINK_STREAM_STOPPED */ - {"Stopped", AUDIO_SINK, ARG_NONE}, - /* AUDIO_SOURCE_CONNECTED */ - {NULL, PROXY_INVALID, ARG_INVALID}, - /* AUDIO_SOURCE_DISCONNECTED */ - {NULL, PROXY_INVALID, ARG_INVALID}, -}; - -typedef struct { - char *str; - unsigned int val; -} hci_map; - -static const hci_map ver_map[] = { - { "1.0b", 0x00 }, - { "1.1", 0x01 }, - { "1.2", 0x02 }, - { "2.0", 0x03 }, - { "2.1", 0x04 }, - { NULL } -}; - -/* Function Prototypes */ -static void BtAdapterAdded(DBusGProxy *proxy, const char *string, - gpointer user_data); -static void BtAdapterRemoved(DBusGProxy *proxy, const char *string, - gpointer user_data); -static A_STATUS AcquireBtAdapter(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseBTAdapter(ABF_BT_INFO *pAbfBtInfo); -static void *BtEventThread(void *arg); -static void RegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, - BT_STACK_EVENT event, GCallback handler); -static void DeRegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, - BT_STACK_EVENT event, GCallback handler); -static A_STATUS GetAdapterInfo(ABF_BT_INFO *pAbfBtInfo); -static void RemoteDeviceDisconnected(DBusGProxy *proxy, const char *string, - gpointer user_data); -static void RemoteDeviceConnected(DBusGProxy *proxy, const char *string, - gpointer user_data); -static void AudioDeviceAdded(DBusGProxy *proxy, const char *string, - gpointer user_data); -static void AudioDeviceRemoved(DBusGProxy *proxy, const char *string, - gpointer user_data); -static void DeviceDiscoveryStarted(DBusGProxy *proxy, gpointer user_data); -static void DeviceDiscoveryFinished(DBusGProxy *proxy, gpointer user_data); -static void AudioHeadsetConnected(DBusGProxy *proxy, gpointer user_data); -static void AudioHeadsetDisconnected(DBusGProxy *proxy, gpointer user_data); -static void AudioHeadsetStreamStarted(DBusGProxy *proxy, gpointer user_data); -static void AudioHeadsetStreamStopped(DBusGProxy *proxy, gpointer user_data); -static void AudioGatewayConnected(DBusGProxy *proxy, gpointer user_data); -static void AudioGatewayDisconnected(DBusGProxy *proxy, gpointer user_data); -static void AudioSinkConnected(DBusGProxy *proxy, gpointer user_data); -static void AudioSinkDisconnected(DBusGProxy *proxy, gpointer user_data); -static void AudioSinkStreamStarted(DBusGProxy *proxy, gpointer user_data); -static void AudioSinkStreamStopped(DBusGProxy *proxy, gpointer user_data); -static void AudioSourceConnected(DBusGProxy *proxy, gpointer user_data); -static void AudioSourceDisconnected(DBusGProxy *proxy, gpointer user_data); -static A_STATUS CheckAndAcquireDefaultAdapter(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseDefaultAdapter(ABF_BT_INFO *pAbfBtInfo); -static void AcquireDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo); -static void ReleaseDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo); -static void GetBtAudioConnectionProperties(ABF_BT_INFO *pAbfBtInfo, - ATHBT_STATE_INDICATION Indication); -static A_STATUS SetupHciEventFilter(ABF_BT_INFO *pAbfBtInfo); -static void CheckHciEventFilter(ABF_BT_INFO *pAbfBtInfo); -static A_STATUS IssueHCICommand(ABF_BT_INFO *pAbfBtInfo, - A_UINT16 OpCode, - A_UCHAR *pCmdData, - int CmdLength, - int EventRecvTimeoutMS, - A_UCHAR *pEventBuffer, - int MaxLength, - A_UCHAR **ppEventPtr, - int *pEventLength); - -/* APIs exported to other modules */ -A_STATUS -Abf_BtStackNotificationInit(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 Flags) -{ - A_STATUS status; - GMainLoop *mainloop; - ATHBT_FILTER_INFO *pInfo; - ABF_BT_INFO *pAbfBtInfo; - - pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - if (pInfo->pBtInfo) { - return A_OK; - } - - pAbfBtInfo = (ABF_BT_INFO *)A_MALLOC(sizeof(ABF_BT_INFO)); - A_MEMZERO(pAbfBtInfo,sizeof(ABF_BT_INFO)); - - A_MUTEX_INIT(&pAbfBtInfo->hWaitEventLock); - A_COND_INIT(&pAbfBtInfo->hWaitEvent); - A_MEMZERO(pAbfBtInfo, sizeof(ABF_BT_INFO)); - - pAbfBtInfo->Flags = Flags; - - if (pAbfBtInfo->Flags & ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION) { - A_INFO("AFH Classification Command will be issued on WLAN connect/disconnect \n"); - } - - /* Set up the main loop */ - mainloop = g_main_loop_new(NULL, FALSE); - pAbfBtInfo->AdapterAvailable = FALSE; - pAbfBtInfo->Mainloop = mainloop; - pAbfBtInfo->Loop = TRUE; - pAbfBtInfo->pInfo = pInfo; - pAbfBtInfo->HCIEventListenerSocket = -1; - - /* Spawn a thread which will be used to process events from BT */ - status = A_TASK_CREATE(&pInfo->hBtThread, BtEventThread, pAbfBtInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to spawn a BT thread\n", __FUNCTION__); - return A_ERROR; - } - - pInfo->pBtInfo = pAbfBtInfo; - A_INFO("BT Stack Notification init complete\n"); - - return A_OK; -} - -void -Abf_BtStackNotificationDeInit(ATH_BT_FILTER_INSTANCE *pInstance) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_BT_INFO *pAbfBtInfo = pInfo->pBtInfo; - - if (!pAbfBtInfo) return; - - if (pAbfBtInfo->Mainloop != NULL) { - /* Terminate and wait for the BT Event Handler task to finish */ - A_MUTEX_LOCK(&pAbfBtInfo->hWaitEventLock); - if (pAbfBtInfo->Loop) { - pAbfBtInfo->Loop = FALSE; - A_COND_WAIT(&pAbfBtInfo->hWaitEvent, &pAbfBtInfo->hWaitEventLock, - WAITFOREVER); - } - A_MUTEX_UNLOCK(&pAbfBtInfo->hWaitEventLock); - } - - /* Flush all the BT actions from the filter core TODO */ - - /* Free the remaining resources */ - g_main_loop_unref(pAbfBtInfo->Mainloop); - pAbfBtInfo->AdapterAvailable = FALSE; - pInfo->pBtInfo = NULL; - A_MUTEX_DEINIT(&pAbfBtInfo->hWaitEventLock); - A_COND_DEINIT(&pAbfBtInfo->hWaitEvent); - A_MEMZERO(pAbfBtInfo, sizeof(ABF_BT_INFO)); - A_FREE(pAbfBtInfo); - - A_INFO("BT Stack Notification de-init complete\n"); -} - -/* Internal functions */ - -static gboolean MainLoopQuitCheck(gpointer arg) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)arg; - - /* this is the only way to end a glib main loop - without creating an external g_source, this check is periodically - made to check the shutdown flag */ - if (!pAbfBtInfo->Loop) { - g_main_loop_quit(pAbfBtInfo->Mainloop); - return FALSE; - } - - /* reschedule */ - return TRUE; -} - -static void * -BtEventThread(void *arg) -{ - DBusGConnection *bus; - GError *error = NULL; - DBusGProxy *manager; - GLogLevelFlags fatal_mask; - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)arg; - - A_INFO("Starting the BT Event Handler task\n"); - - g_type_init(); - - fatal_mask = g_log_set_always_fatal(G_LOG_FATAL_MASK); - fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; - g_log_set_always_fatal(fatal_mask); - - do { - bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); - if (!bus) { - A_ERR("[%s] Couldn't connect to system bus: %d\n", - __FUNCTION__, error); - break; - } - - pAbfBtInfo->Bus = bus; - manager = dbus_g_proxy_new_for_name(bus, BLUEZ_NAME, BLUEZ_PATH, - MANAGER_INTERFACE); - if (!manager) { - A_ERR("[%s] Failed to get name owner\n", __FUNCTION__); - dbus_g_connection_unref(bus); - pAbfBtInfo->Bus = NULL; - break; - } - pAbfBtInfo->DeviceManager = manager; - - /* check for default adapter at startup */ - CheckAndAcquireDefaultAdapter(pAbfBtInfo); - - RegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_ADDED, - G_CALLBACK(BtAdapterAdded)); - RegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_REMOVED, - G_CALLBACK(BtAdapterRemoved)); - g_timeout_add(1000, MainLoopQuitCheck, pAbfBtInfo); - g_main_loop_run(pAbfBtInfo->Mainloop); - - DeRegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_ADDED, - G_CALLBACK(BtAdapterAdded)); - DeRegisterBtStackEventCb(pAbfBtInfo, BT_ADAPTER_REMOVED, - G_CALLBACK(BtAdapterRemoved)); - - ReleaseDefaultAdapter(pAbfBtInfo); - - g_object_unref(pAbfBtInfo->DeviceManager); - pAbfBtInfo->DeviceManager = NULL; - - /* Release the system bus */ - dbus_g_connection_unref(bus); - pAbfBtInfo->Bus = NULL; - } while (FALSE); - - /* Clean up the resources allocated in this task */ - A_INFO("Terminating the BT Event Handler task\n"); - A_MUTEX_LOCK(&pAbfBtInfo->hWaitEventLock); - pAbfBtInfo->Loop = FALSE; - A_COND_SIGNAL(&pAbfBtInfo->hWaitEvent); - A_MUTEX_UNLOCK(&pAbfBtInfo->hWaitEventLock); - - return NULL; -} - -static A_STATUS -CheckAndAcquireDefaultAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status = A_OK; - - do { - - if (pAbfBtInfo->AdapterAvailable) { - /* already available */ - break; - } - - /* acquire the adapter */ - status = AcquireBtAdapter(pAbfBtInfo); - - } while (FALSE); - - return status; -} - -static void ReleaseDefaultAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - - if (pAbfBtInfo->AdapterAvailable) { - /* Release the BT adapter */ - ReleaseBTAdapter(pAbfBtInfo); - A_INFO("[%s] BT Adapter Removed\n",pAbfBtInfo->AdapterName); - } - - A_MEMZERO(pAbfBtInfo->AdapterName, sizeof(pAbfBtInfo->AdapterName)); - -} -/* Event Notifications */ -static void -BtAdapterAdded(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - A_DEBUG("BtAdapterAdded Proxy Callback ... \n"); - - /* BUG!!!, the BtAdapterAdded callback is indicated too early by the BT service, on some systems - * the method call to "DefaultAdapter" through the Manager interface will fail because no - * default adapter exist yet even though this callback was indicated (there should be a default) - * - * Workaround is to delay before acquiring the default adapter. - * Acquiring the BT adapter should not be very infrequent though. - * - * */ - sleep(1); - CheckAndAcquireDefaultAdapter((ABF_BT_INFO *)user_data); -} - - -static void -BtAdapterRemoved(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("BtAdapterRemoved Proxy Callback ... \n"); - - if (!pAbfBtInfo->AdapterAvailable) return; - - if (strcmp(string,pAbfBtInfo->AdapterName) == 0) { - /* the adapter we are watching has been removed */ - ReleaseDefaultAdapter(pAbfBtInfo); - } - -} - -static void -DeviceDiscoveryStarted(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Inquiry Started\n"); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); -} - -static void -DeviceDiscoveryFinished(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Inquiry Completed\n"); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); -} - -static void -RemoteDeviceConnected(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Connected: %s\n", string); - A_STR2ADDR(string, pAbfBtInfo->RemoteDevice); - AthBtIndicateState(pInstance, ATH_BT_CONNECT, STATE_ON); -} - -static void -RemoteDeviceDisconnected(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Device Disconnected: %s\n", string); - A_MEMZERO(pAbfBtInfo->RemoteDevice, sizeof(pAbfBtInfo->RemoteDevice)); - AthBtIndicateState(pInstance, ATH_BT_CONNECT, STATE_OFF); -} - -static void ReleaseDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo) -{ - - if (pAbfBtInfo->AudioCbRegistered) { - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_CONNECTED, - G_CALLBACK(AudioHeadsetConnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_DISCONNECTED, - G_CALLBACK(AudioHeadsetDisconnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STARTED, - G_CALLBACK(AudioHeadsetStreamStarted)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STOPPED, - G_CALLBACK(AudioHeadsetStreamStopped)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_CONNECTED, - G_CALLBACK(AudioGatewayConnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_DISCONNECTED, - G_CALLBACK(AudioGatewayDisconnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_CONNECTED, - G_CALLBACK(AudioSinkConnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_DISCONNECTED, - G_CALLBACK(AudioSinkDisconnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STARTED, - G_CALLBACK(AudioSinkStreamStarted)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STOPPED, - G_CALLBACK(AudioSinkStreamStopped)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_CONNECTED, - G_CALLBACK(AudioSourceConnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_DISCONNECTED, - G_CALLBACK(AudioSourceDisconnected)); - pAbfBtInfo->AudioCbRegistered = FALSE; - } - - if (pAbfBtInfo->AudioHeadset != NULL) { - g_object_unref(pAbfBtInfo->AudioHeadset); - pAbfBtInfo->AudioHeadset = NULL; - } - - if (pAbfBtInfo->AudioGateway != NULL) { - g_object_unref(pAbfBtInfo->AudioGateway); - pAbfBtInfo->AudioGateway = NULL; - } - - if (pAbfBtInfo->AudioSource != NULL) { - g_object_unref(pAbfBtInfo->AudioSource); - pAbfBtInfo->AudioSource = NULL; - } - - if (pAbfBtInfo->AudioSink != NULL) { - g_object_unref(pAbfBtInfo->AudioSink); - pAbfBtInfo->AudioSink = NULL; - } - - if (pAbfBtInfo->AudioDevice != NULL) { - g_object_unref(pAbfBtInfo->AudioDevice); - pAbfBtInfo->AudioDevice = NULL; - } - - if (pAbfBtInfo->DefaultAudioDeviceAvailable) { - pAbfBtInfo->DefaultAudioDeviceAvailable = FALSE; - A_DEBUG("Default Audio Device Removed: %s\n", pAbfBtInfo->DefaultAudioDeviceName); - A_MEMZERO(pAbfBtInfo->DefaultAudioDeviceName,sizeof(pAbfBtInfo->DefaultAudioDeviceName)); - } - -} - -static void AcquireDefaultAudioDevice(ABF_BT_INFO *pAbfBtInfo) -{ - A_BOOL success = FALSE; - char *audioDevice; - GError *error = NULL; - - do { - - if (pAbfBtInfo->DefaultAudioDeviceAvailable) { - /* already acquired */ - success = TRUE; - break; - } - - A_INFO("Checking for a default audio device .. \n"); - - if (!dbus_g_proxy_call(pAbfBtInfo->AudioManager, - "DefaultDevice", - &error, - G_TYPE_INVALID, - G_TYPE_STRING, - &audioDevice, - G_TYPE_INVALID)) { - A_ERR("[%s] DefaultDevice method call failed \n", __FUNCTION__); - break; - } - - if (error != NULL) { - A_ERR("[%s] Failed to get default audio device: %s \n", __FUNCTION__, error->message); - g_free(error); - break; - } - - strncpy(pAbfBtInfo->DefaultAudioDeviceName, - audioDevice, - sizeof(pAbfBtInfo->DefaultAudioDeviceName)); - - g_free(audioDevice); - - A_INFO("Default Audio Device: %s \n", pAbfBtInfo->DefaultAudioDeviceName); - - pAbfBtInfo->DefaultAudioDeviceAvailable = TRUE; - - /* get various proxies for the audio device */ - - pAbfBtInfo->AudioHeadset = dbus_g_proxy_new_for_name(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_HEADSET_INTERFACE); - if (NULL == pAbfBtInfo->AudioHeadset) { - A_ERR("[%s] Failed to get audio headset interface \n", __FUNCTION__); - break; - } - - pAbfBtInfo->AudioGateway = dbus_g_proxy_new_for_name(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_GATEWAY_INTERFACE); - if (NULL == pAbfBtInfo->AudioGateway) { - A_ERR("[%s] Failed to get audio gateway interface \n", __FUNCTION__); - break; - } - - pAbfBtInfo->AudioSource = dbus_g_proxy_new_for_name(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_SOURCE_INTERFACE); - - if (NULL == pAbfBtInfo->AudioSource) { - A_ERR("[%s] Failed to get audio source interface \n", __FUNCTION__); - break; - } - - pAbfBtInfo->AudioSink = dbus_g_proxy_new_for_name(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_SINK_INTERFACE); - - if (NULL == pAbfBtInfo->AudioSink) { - A_ERR("[%s] Failed to get audio sink interface \n", __FUNCTION__); - break; - } - - pAbfBtInfo->AudioDevice = dbus_g_proxy_new_for_name(pAbfBtInfo->Bus, - BLUEZ_NAME, - pAbfBtInfo->DefaultAudioDeviceName, - AUDIO_DEVICE_INTERFACE); - - if (NULL == pAbfBtInfo->AudioDevice) { - A_ERR("[%s] Failed to get audio device interface \n", __FUNCTION__); - break; - } - - /* Register for audio specific events */ - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_CONNECTED, - G_CALLBACK(AudioHeadsetConnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_DISCONNECTED, - G_CALLBACK(AudioHeadsetDisconnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STARTED, - G_CALLBACK(AudioHeadsetStreamStarted)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_HEADSET_STREAM_STOPPED, - G_CALLBACK(AudioHeadsetStreamStopped)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_CONNECTED, - G_CALLBACK(AudioGatewayConnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_GATEWAY_DISCONNECTED, - G_CALLBACK(AudioGatewayDisconnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_CONNECTED, - G_CALLBACK(AudioSinkConnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_DISCONNECTED, - G_CALLBACK(AudioSinkDisconnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STARTED, - G_CALLBACK(AudioSinkStreamStarted)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SINK_STREAM_STOPPED, - G_CALLBACK(AudioSinkStreamStopped)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_CONNECTED, - G_CALLBACK(AudioSourceConnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_SOURCE_DISCONNECTED, - G_CALLBACK(AudioSourceDisconnected)); - - pAbfBtInfo->AudioCbRegistered = TRUE; - - success = TRUE; - - } while (FALSE); - - if (!success) { - /* cleanup */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - } -} - -static void -AudioDeviceAdded(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("Audio Device Added: %s\n", string); - /* release current one if any */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - /* re-acquire the new default, it could be the same one */ - AcquireDefaultAudioDevice(pAbfBtInfo); - -} - -static void -AudioDeviceRemoved(DBusGProxy *proxy, const char *string, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - - A_DEBUG("Audio Device Removed: %s\n", string); - - if (strcmp(string,pAbfBtInfo->DefaultAudioDeviceName) == 0) { - /* release current one */ - ReleaseDefaultAudioDevice(pAbfBtInfo); - /* re-acquire the new default (if any) */ - AcquireDefaultAudioDevice(pAbfBtInfo); - } - -} - -static void -AudioHeadsetConnected(DBusGProxy *proxy, gpointer user_data) -{ - A_DEBUG("Audio Headset Connected\n"); -} - -static void -AudioHeadsetDisconnected(DBusGProxy *proxy, gpointer user_data) -{ - A_DEBUG("Audio Headset Disconnected\n"); -} - -static void -AudioHeadsetStreamStarted(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Audio Headset Stream Started\n"); - /* get properties of this headset connection */ - GetBtAudioConnectionProperties(pAbfBtInfo, ATH_BT_SCO); - /* make the indication */ - AthBtIndicateState(pInstance, - pAbfBtInfo->CurrentSCOLinkType == SCO_LINK ? ATH_BT_SCO : ATH_BT_ESCO, - STATE_ON); -} - -static void -AudioHeadsetStreamStopped(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - /* This event can also be used to indicate the SCO state */ - A_DEBUG("Audio Headset Stream Stopped\n"); - AthBtIndicateState(pInstance, - pAbfBtInfo->CurrentSCOLinkType == SCO_LINK ? ATH_BT_SCO : ATH_BT_ESCO, - STATE_OFF); -} - -static void -AudioGatewayConnected(DBusGProxy *proxy, gpointer user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Gateway Connected\n"); -} - -static void -AudioGatewayDisconnected(DBusGProxy *proxy, gpointer user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Gateway disconnected\n"); -} - -static void -AudioSinkConnected(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - A_DEBUG("Audio Sink Connected\n"); - /* get connection properties */ - GetBtAudioConnectionProperties(pAbfBtInfo, ATH_BT_A2DP); -} - -static void -AudioSinkDisconnected(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Audio Sink Disconnected\n"); - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_OFF); -} - -static void -AudioSinkStreamStarted(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - A_DEBUG("Audio Sink Stream Started\n"); - - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_ON); -} - -static void -AudioSinkStreamStopped(DBusGProxy *proxy, gpointer user_data) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)user_data; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - A_DEBUG("Audio Sink Stream Stopped\n"); - AthBtIndicateState(pInstance, ATH_BT_A2DP, STATE_OFF); -} - -static void -AudioSourceConnected(DBusGProxy *proxy, gpointer user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Source Connected\n"); -} - -static void -AudioSourceDisconnected(DBusGProxy *proxy, gpointer user_data) -{ - /* Not yet implemented */ - A_DEBUG("Audio Source Disconnected\n"); -} - -/* (De)Registration */ -static DBusGProxy * -GetDBusProxy(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event) -{ - DBusGProxy *proxy = NULL; - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - - pNotificationConfig = &g_NotificationConfig[event]; - if (pNotificationConfig->proxy == DEVICE_MANAGER) { - proxy = pAbfBtInfo->DeviceManager; - } else if (pNotificationConfig->proxy == DEVICE_ADAPTER) { - proxy = pAbfBtInfo->DeviceAdapter; - } else if (pNotificationConfig->proxy == AUDIO_MANAGER) { - proxy = pAbfBtInfo->AudioManager; - } else if (pNotificationConfig->proxy == AUDIO_HEADSET) { - proxy = pAbfBtInfo->AudioHeadset; - } else if (pNotificationConfig->proxy == AUDIO_SINK) { - proxy = pAbfBtInfo->AudioSink; - } else { - A_ERR("[%s] Unknown proxy %d for event : %d \n", __FUNCTION__, pNotificationConfig->proxy, event); - } - - return proxy; -} - -static void -RegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event, - GCallback handler) -{ - const char *name; - DBusGProxy *proxy; - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - - pNotificationConfig = &g_NotificationConfig[event]; - name = pNotificationConfig->name; - - if (event >= BT_EVENTS_NUM_MAX) { - A_ERR("[%s] Unknown Event: %d\n", __FUNCTION__, event); - return; - } - - if (pNotificationConfig->proxy == PROXY_INVALID) { - /* not supported yet, so ignore registration */ - return; - } - - if ((proxy = GetDBusProxy(pAbfBtInfo, event)) == NULL) { - A_ERR("[%s] Unknown Proxy: %d (event:%d) \n", __FUNCTION__, - pNotificationConfig->proxy, event); - return; - } - - if (pNotificationConfig->arg == ARG_NONE) { - dbus_g_proxy_add_signal(proxy, name, G_TYPE_INVALID); - } else if (pNotificationConfig->arg == ARG_STRING) { - dbus_g_proxy_add_signal(proxy, name, G_TYPE_STRING, - G_TYPE_INVALID); - } else { - A_ERR("[%s] Unkown Arg Type: %d\n", __FUNCTION__, - pNotificationConfig->arg); - return; - } - - dbus_g_proxy_connect_signal(proxy, name, handler, (void *)pAbfBtInfo, - NULL); -} - -static void -DeRegisterBtStackEventCb(ABF_BT_INFO *pAbfBtInfo, BT_STACK_EVENT event, - GCallback handler) -{ - const char *name; - DBusGProxy *proxy; - BT_NOTIFICATION_CONFIG_PARAMS *pNotificationConfig; - - pNotificationConfig = &g_NotificationConfig[event]; - name = pNotificationConfig->name; - - if (event >= BT_EVENTS_NUM_MAX) { - A_ERR("[%s] Unknown Event: %d\n", __FUNCTION__, event); - return; - } - - if (pNotificationConfig->proxy == PROXY_INVALID) { - /* not supported yet, so ignore de-registration */ - return; - } - - if ((proxy = GetDBusProxy(pAbfBtInfo, event)) == NULL) { - A_ERR("[%s] Unknown Proxy: %d\n", __FUNCTION__, - pNotificationConfig->proxy); - return; - } - - dbus_g_proxy_disconnect_signal(proxy, name, handler, (void *)pAbfBtInfo); -} - -/* Misc */ -static A_STATUS -AcquireBtAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - DBusGProxy *DeviceAdapter, *AudioManager; - DBusGConnection *bus = pAbfBtInfo->Bus; - A_STATUS status = A_ERROR; - char *adapterName; - GError *error = NULL; - char *hciName; - - do { - - if (!dbus_g_proxy_call(pAbfBtInfo->DeviceManager, - "DefaultAdapter", - &error, - G_TYPE_INVALID, - G_TYPE_STRING, - &adapterName, - G_TYPE_INVALID)) { - A_ERR("[%s] DefaultAdapter Method call failure \n", __FUNCTION__); - break; - } - - if (error != NULL) { - A_ERR("[%s] Failed to get default adapter: %s \n", __FUNCTION__, error->message); - g_free(error); - break; - } - - strcpy(pAbfBtInfo->AdapterName, adapterName); - - /* assume ID 0 */ - pAbfBtInfo->AdapterId = 0; - - if ((hciName = strstr(pAbfBtInfo->AdapterName, "hci")) != NULL) { - /* get the number following the hci name, this is the ID used for - * socket calls to the HCI layer */ - pAbfBtInfo->AdapterId = (int)hciName[3] - (int)'0'; - if (pAbfBtInfo->AdapterId < 0) { - pAbfBtInfo->AdapterId = 0; - } - } - - if (!A_SUCCESS(SetupHciEventFilter(pAbfBtInfo))) { - break; - } - - g_free(adapterName); - - DeviceAdapter = dbus_g_proxy_new_for_name(bus, BLUEZ_NAME, - pAbfBtInfo->AdapterName, - ADAPTER_INTERFACE); - if (!DeviceAdapter) { - A_ERR("[%s] Failed to get device adapter (%s) \n", __FUNCTION__, pAbfBtInfo->AdapterName); - break; - } - - AudioManager = dbus_g_proxy_new_for_name(bus, BLUEZ_NAME, - AUDIO_MANAGER_PATH, - AUDIO_MANAGER_INTERFACE); - if (!AudioManager) { - A_ERR("[%s] Failed to get name owner\n", __FUNCTION__); - break; - } - - pAbfBtInfo->DeviceAdapter = DeviceAdapter; - pAbfBtInfo->AudioManager = AudioManager; - - GetAdapterInfo(pAbfBtInfo); - - pAbfBtInfo->pInfo->LMPVersion = pAbfBtInfo->LMPVersion; - pAbfBtInfo->AdapterAvailable = TRUE; - - /* Register to get notified of different stack events */ - RegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_STARTED, - G_CALLBACK(DeviceDiscoveryStarted)); - RegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_FINISHED, - G_CALLBACK(DeviceDiscoveryFinished)); - RegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_CONNECTED, - G_CALLBACK(RemoteDeviceConnected)); - RegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_DISCONNECTED, - G_CALLBACK(RemoteDeviceDisconnected)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_ADDED, - G_CALLBACK(AudioDeviceAdded)); - RegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_REMOVED, - G_CALLBACK(AudioDeviceRemoved)); - - pAbfBtInfo->AdapterCbRegistered = TRUE; - - A_INFO("[%s] BT Adapter Added\n",pAbfBtInfo->AdapterName); - - /* acquire default audio device */ - AcquireDefaultAudioDevice(pAbfBtInfo); - - - status = A_OK; - - } while (FALSE); - - return status; -} - -static void -ReleaseBTAdapter(ABF_BT_INFO *pAbfBtInfo) -{ - - if (pAbfBtInfo->AdapterCbRegistered) { - pAbfBtInfo->AdapterCbRegistered = FALSE; - /* Free the resources held for the event handlers */ - DeRegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_STARTED, - G_CALLBACK(DeviceDiscoveryStarted)); - DeRegisterBtStackEventCb(pAbfBtInfo, DEVICE_DISCOVERY_FINISHED, - G_CALLBACK(DeviceDiscoveryFinished)); - DeRegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_CONNECTED, - G_CALLBACK(RemoteDeviceConnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, REMOTE_DEVICE_DISCONNECTED, - G_CALLBACK(RemoteDeviceDisconnected)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_ADDED, - G_CALLBACK(AudioDeviceAdded)); - DeRegisterBtStackEventCb(pAbfBtInfo, AUDIO_DEVICE_REMOVED, - G_CALLBACK(AudioDeviceRemoved)); - } - - ReleaseDefaultAudioDevice(pAbfBtInfo); - - if (pAbfBtInfo->HCIEventListenerSocket >= 0) { - close(pAbfBtInfo->HCIEventListenerSocket); - pAbfBtInfo->HCIEventListenerSocket = -1; - } - - if (pAbfBtInfo->AudioManager != NULL) { - g_object_unref(pAbfBtInfo->AudioManager); - pAbfBtInfo->AudioManager = NULL; - } - - A_MEMZERO(pAbfBtInfo->DeviceAddress, - sizeof(pAbfBtInfo->DeviceAddress)); - A_MEMZERO(pAbfBtInfo->DeviceName, - sizeof(pAbfBtInfo->DeviceName)); - A_MEMZERO(pAbfBtInfo->ManufacturerName, - sizeof(pAbfBtInfo->ManufacturerName)); - A_MEMZERO(pAbfBtInfo->ProtocolVersion, - sizeof(pAbfBtInfo->ProtocolVersion)); - pAbfBtInfo->LMPVersion = 0; - - if (pAbfBtInfo->DeviceAdapter != NULL) { - g_object_unref(pAbfBtInfo->DeviceAdapter); - pAbfBtInfo->DeviceAdapter = NULL; - } - pAbfBtInfo->AdapterAvailable = FALSE; -} - -static A_STATUS -GetAdapterInfo(ABF_BT_INFO *pAbfBtInfo) -{ - int count; - char *reply; - GError *error = NULL; - DBusGProxy *DeviceAdapter; - - if ((DeviceAdapter = pAbfBtInfo->DeviceAdapter) == NULL) return A_ERROR; - - /* Device name */ - if (!dbus_g_proxy_call(DeviceAdapter, "GetName", &error, G_TYPE_INVALID, - G_TYPE_STRING, &reply, G_TYPE_INVALID)) - { - A_ERR("[%s] Failed to complete GetName: %d\n", __FUNCTION__, error); - return A_ERROR; - } - strcpy(pAbfBtInfo->DeviceName, reply); - g_free(reply); - - /* Manufacturer name */ - if (!dbus_g_proxy_call(DeviceAdapter, "GetManufacturer", &error, - G_TYPE_INVALID, G_TYPE_STRING, &reply, - G_TYPE_INVALID)) - { - A_ERR("[%s] Failed to complete GetManufacturer: %d\n", - __FUNCTION__, error); - return A_ERROR; - } - strcpy(pAbfBtInfo->ManufacturerName, reply); - g_free(reply); - - /* Bluetooth protocol Version */ - if (!dbus_g_proxy_call(DeviceAdapter, "GetVersion", &error, G_TYPE_INVALID, - G_TYPE_STRING, &reply, G_TYPE_INVALID)) - { - A_ERR("[%s] Failed to complete GetVersion: %d\n", __FUNCTION__, error); - return A_ERROR; - } - strcpy(pAbfBtInfo->ProtocolVersion, reply); - for (count = 0; - ((count < sizeof(ver_map)/sizeof(hci_map)) && (ver_map[count].str)); - count++) - { - if (strstr(pAbfBtInfo->ProtocolVersion, ver_map[count].str)) { - pAbfBtInfo->LMPVersion = ver_map[count].val; - break; - } - } - g_free(reply); - - /* Device address */ - if (!dbus_g_proxy_call(DeviceAdapter, "GetAddress", &error, G_TYPE_INVALID, - G_TYPE_STRING, &reply, G_TYPE_INVALID)) - { - A_ERR("[%s] Failed to complete GetAddress: %d\n", __FUNCTION__, error); - return A_ERROR; - } - A_STR2ADDR(reply, pAbfBtInfo->DeviceAddress); - g_free(reply); - - A_INFO("BT-HCI Device Address: (%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X)\n", - pAbfBtInfo->DeviceAddress[0], pAbfBtInfo->DeviceAddress[1], - pAbfBtInfo->DeviceAddress[2], pAbfBtInfo->DeviceAddress[3], - pAbfBtInfo->DeviceAddress[4], pAbfBtInfo->DeviceAddress[5]); - A_INFO("BT-HCI Device Name: %s\n", pAbfBtInfo->DeviceName); - A_INFO("BT-HCI Manufacturer Name: %s\n", pAbfBtInfo->ManufacturerName); - A_INFO("BT-HCI Protocol Version: %s\n", pAbfBtInfo->ProtocolVersion); - A_INFO("BT-HCI LMP Version: %d\n", pAbfBtInfo->LMPVersion); - - return A_OK; -} - -#define ABTH_MAX_CONNECTIONS 16 - -static A_STATUS GetConnectedDeviceRole(ABF_BT_INFO *pAbfBtInfo, - A_CHAR *Address, - A_BOOL IsSCO, - A_UCHAR *pRole) -{ - A_STATUS status = A_ERROR; - struct hci_conn_list_req *connList = NULL; - struct hci_conn_info *connInfo = NULL; - int i, sk = -1; - int len; - - do { - - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (sk < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - len = (sizeof(*connInfo)) * ABTH_MAX_CONNECTIONS + sizeof(*connList); - - connList = (struct hci_conn_list_req *)A_MALLOC(len); - - if (connList == NULL) { - break; - } - - A_MEMZERO(connList,len); - - connList->dev_id = pAbfBtInfo->AdapterId; - connList->conn_num = ABTH_MAX_CONNECTIONS; - connInfo = connList->conn_info; - - if (ioctl(sk, HCIGETCONNLIST, (void *)connList)) { - A_ERR("[%s] Failed to get connection list %d \n", __FUNCTION__, errno); - break; - } - - /* walk through connection list */ - for (i = 0; i < connList->conn_num; i++, connInfo++) { - char addr[32]; - - /* convert to a string to compare */ - ba2str(&connInfo->bdaddr, addr); - - if (strcmp(addr,Address) != 0) { - continue; - } - - if (IsSCO) { - /* look for first non-ACL connection */ - if (connInfo->type == ACL_LINK) { - continue; - } - pAbfBtInfo->CurrentSCOLinkType = connInfo->type; - - } else { - /* look for first ACL connection */ - if (connInfo->type != ACL_LINK) { - continue; - } - } - - /* if we get here we have a connection we are interested in */ - if (connInfo->link_mode & HCI_LM_MASTER) { - /* master */ - *pRole = 0; - } else { - /* slave */ - *pRole = 1; - } - - A_INFO("[%s] Found Connection (Link-Type : %d), found role:%d \n", - Address, connInfo->type, *pRole); - break; - } - - if (i == connList->conn_num) { - A_ERR("[%s] Could not find connection info for %s %d \n", __FUNCTION__, Address); - break; - } - - status = A_OK; - - } while (FALSE); - - if (sk >= 0) { - close(sk); - } - - if (connList != NULL) { - A_FREE(connList); - } - - return status; -} - -static void GetBtAudioConnectionProperties(ABF_BT_INFO *pAbfBtInfo, - ATHBT_STATE_INDICATION Indication) -{ - A_UCHAR role = 0; - A_UCHAR lmpversion = 0; - A_CHAR *pDescr = NULL; - char *address = NULL; - char *version = NULL; - GError *error = NULL; - A_STATUS status; - - do { - - /* get remote device address */ - if (!dbus_g_proxy_call(pAbfBtInfo->AudioDevice, - "GetAddress", - &error, - G_TYPE_INVALID, - G_TYPE_STRING, - &address, - G_TYPE_INVALID)) { - A_ERR("[%s] GetAddress method call failed \n", __FUNCTION__); - break; - } - - if (error != NULL) { - A_ERR("[%s] Failed to GetAddress for audio device: %s \n", __FUNCTION__, error->message); - g_free(error); - break; - } - - A_INFO("Connected audio device address: %s \n", address); - - if (!dbus_g_proxy_call(pAbfBtInfo->DeviceAdapter, - "GetRemoteVersion", - &error, - G_TYPE_STRING, - address, - G_TYPE_INVALID, - G_TYPE_STRING, - &version, - G_TYPE_INVALID)) { - A_ERR("[%s] GetRemoteVersion method call failed \n", __FUNCTION__); - break; - } - - if (error != NULL) { - A_ERR("[%s] Failed to GetRemoteVersion for audio device: %s \n", __FUNCTION__, error->message); - g_free(error); - break; - } - - A_INFO("Connected audio device remote version: %s \n", version); - - /* assume 2.1 or later */ - lmpversion = 4; - - if (strstr(version,"1.0") != NULL) { - lmpversion = 0; - } else if (strstr(version,"1.1") != NULL) { - lmpversion = 1; - } else if (strstr(version,"1.2") != NULL) { - lmpversion = 2; - } else if (strstr(version,"2.0") != NULL) { - lmpversion = 3; - } - - /* get role */ - status = GetConnectedDeviceRole(pAbfBtInfo, - address, - Indication == ATH_BT_A2DP ? FALSE : TRUE, - &role); - - if (A_FAILED(status)) { - role = 0; - } - - if (Indication == ATH_BT_A2DP) { - pDescr = "A2DP"; - pAbfBtInfo->pInfo->A2DPConnection_LMPVersion = lmpversion; - pAbfBtInfo->pInfo->A2DPConnection_Role = role; - } else if (Indication == ATH_BT_SCO) { - if (pAbfBtInfo->CurrentSCOLinkType == SCO_LINK) { - pDescr = "SCO"; - } else { - pDescr = "eSCO"; - } - pAbfBtInfo->pInfo->SCOConnection_LMPVersion = lmpversion; - pAbfBtInfo->pInfo->SCOConnection_Role = role; - - /* for SCO connections check if the event filter captured - * the SYNCH connection complete event */ - CheckHciEventFilter(pAbfBtInfo); - - } else { - pDescr = "UNKNOWN!!"; - } - - A_INFO("BT Audio connection properties: (%s) (role: %s, lmp version: %d) \n", - pDescr, role ? "SLAVE" : "MASTER", lmpversion); - - } while (FALSE); - - if (address != NULL) { - g_free(address); - } - - if (version != NULL) { - g_free(version); - } - -} - - -static A_STATUS WaitForHCIEvent(int Socket, - int TimeoutMs, - A_UCHAR *pBuffer, - int MaxLength, - A_UCHAR EventCode, - A_UINT16 OpCode, - A_UCHAR **ppEventPtr, - int *pEventLength) -{ - - int eventLen; - hci_event_hdr *eventHdr; - struct pollfd pfd; - int result; - A_UCHAR *eventPtr; - A_STATUS status = A_OK; - - *ppEventPtr = NULL; - A_MEMZERO(&pfd,sizeof(pfd)); - pfd.fd = Socket; - pfd.events = POLLIN; - - if (EventCode == EVT_CMD_COMPLETE) { - A_INFO("Waiting for HCI CMD Complete Event, Opcode:0x%4.4X (%d MS) \n",OpCode, TimeoutMs); - } else { - A_INFO("Waiting for HCI Event: %d (%d MS) \n",EventCode, TimeoutMs); - } - - while (1) { - - /* check socket for a captured event using a short timeout - * the caller usually calls this function when it knows there - * is an event that is likely to be captured */ - result = poll(&pfd, 1, TimeoutMs); - - if (result < 0) { - if ((errno == EAGAIN) || (errno == EINTR)) { - /* interrupted */ - } else { - A_ERR("[%s] Socket Poll Failed! : %d \n", __FUNCTION__, errno); - status = A_ERROR; - } - break; - } - - if (result == 0) { - /* no event*/ - break; - } - - if (!(pfd.revents & POLLIN)) { - break; - } - /* get the packet */ - eventLen = read(Socket, pBuffer, MaxLength); - - if (eventLen == 0) { - /* no event */ - break; - } - - if (eventLen < (1 + HCI_EVENT_HDR_SIZE)) { - A_ERR("[%s] Unknown receive packet! len : %d \n", __FUNCTION__, eventLen); - status = A_ERROR; - break; - } - - if (pBuffer[0] != HCI_EVENT_PKT) { - A_ERR("[%s] Unsupported packet type : %d \n", __FUNCTION__, pBuffer[0]); - status = A_ERROR; - break; - } - - eventPtr = &pBuffer[1]; - eventLen--; - eventHdr = (hci_event_hdr *)eventPtr; - eventPtr += HCI_EVENT_HDR_SIZE; - eventLen -= HCI_EVENT_HDR_SIZE; - - if (eventHdr->evt != EventCode) { - /* not interested in this one */ - continue; - } - - if (eventHdr->evt == EVT_CMD_COMPLETE) { - if (eventLen < sizeof(evt_cmd_complete)) { - A_ERR("[%s] EVT_CMD_COMPLETE event is too small! len=%d \n", __FUNCTION__, eventLen); - status = A_ERROR; - break; - } else { - A_UINT16 evOpCode = btohs(BTEV_CMD_COMPLETE_GET_OPCODE(eventPtr)); - /* check for opCode match */ - if (OpCode != evOpCode) { - /* keep searching */ - continue; - } - } - } - - /* found it */ - *ppEventPtr = eventPtr; - *pEventLength = eventLen; - - break; - - } - - return status; -} - - - - -static void CheckHciEventFilter(ABF_BT_INFO *pAbfBtInfo) -{ - A_UCHAR buffer[HCI_MAX_EVENT_SIZE]; - A_STATUS status; - A_UCHAR *eventPtr; - int eventLen; - - - do { - - status = WaitForHCIEvent(pAbfBtInfo->HCIEventListenerSocket, - 100, - buffer, - sizeof(buffer), - EVT_SYNC_CONN_COMPLETE, - 0, - &eventPtr, - &eventLen); - - if (A_FAILED(status)) { - break; - } - - if (eventPtr == NULL) { - break; - } - - if (eventLen < sizeof(evt_sync_conn_complete)) { - A_ERR("SYNC_CONN_COMPLETE Event is too small! : %d \n", eventLen); - break; - } - - pAbfBtInfo->pInfo->SCOConnectInfo.LinkType = BTEV_GET_BT_CONN_LINK_TYPE(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.TransmissionInterval = BTEV_GET_TRANS_INTERVAL(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.RetransmissionInterval = BTEV_GET_RETRANS_INTERVAL(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.RxPacketLength = BTEV_GET_RX_PKT_LEN(eventPtr); - pAbfBtInfo->pInfo->SCOConnectInfo.TxPacketLength = BTEV_GET_TX_PKT_LEN(eventPtr); - - A_INFO("HCI SYNC_CONN_COMPLETE event captured, conn info (%d, %d, %d, %d, %d) \n", - pAbfBtInfo->pInfo->SCOConnectInfo.LinkType, - pAbfBtInfo->pInfo->SCOConnectInfo.TransmissionInterval, - pAbfBtInfo->pInfo->SCOConnectInfo.RetransmissionInterval, - pAbfBtInfo->pInfo->SCOConnectInfo.RxPacketLength, - pAbfBtInfo->pInfo->SCOConnectInfo.TxPacketLength); - - /* now valid */ - pAbfBtInfo->pInfo->SCOConnectInfo.Valid = TRUE; - - } while (FALSE); - -} - -static A_STATUS SetupHciEventFilter(ABF_BT_INFO *pAbfBtInfo) -{ - A_STATUS status = A_ERROR; - struct hci_filter filterSetting; - struct sockaddr_hci addr; - - do { - - if (pAbfBtInfo->HCIEventListenerSocket >= 0) { - /* close previous */ - close(pAbfBtInfo->HCIEventListenerSocket); - } - - pAbfBtInfo->HCIEventListenerSocket = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (pAbfBtInfo->HCIEventListenerSocket < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - - /* capture SYNC_CONN Complete */ - hci_filter_set_event(EVT_SYNC_CONN_COMPLETE, &filterSetting); - - if (setsockopt(pAbfBtInfo->HCIEventListenerSocket, - SOL_HCI, - HCI_FILTER, - &filterSetting, - sizeof(filterSetting)) < 0) { - A_ERR("[%s] Failed to set socket opt: %d \n", __FUNCTION__, errno); - break; - } - - A_MEMZERO(&addr,sizeof(addr)); - /* bind to the current adapter */ - addr.hci_family = AF_BLUETOOTH; - addr.hci_dev = pAbfBtInfo->AdapterId; - - if (bind(pAbfBtInfo->HCIEventListenerSocket, - (struct sockaddr *)&addr, - sizeof(addr)) < 0) { - A_ERR("[%s] Can't bind to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - A_INFO("BT Event Filter Set, Mask: 0x%8.8X:%8.8X \n", - filterSetting.event_mask[1], filterSetting.event_mask[0]); - - status = A_OK; - - } while (FALSE); - - if (A_FAILED(status)) { - if (pAbfBtInfo->HCIEventListenerSocket >= 0) { - close(pAbfBtInfo->HCIEventListenerSocket); - pAbfBtInfo->HCIEventListenerSocket = -1; - } - } - - return status; -} - - /* issue HCI command, currently this ONLY supports simple commands that - * only expect a command complete, the event pointer returned points to the command - * complete event structure for the caller to decode */ -static A_STATUS IssueHCICommand(ABF_BT_INFO *pAbfBtInfo, - A_UINT16 OpCode, - A_UCHAR *pCmdData, - int CmdLength, - int EventRecvTimeoutMS, - A_UCHAR *pEventBuffer, - int MaxLength, - A_UCHAR **ppEventPtr, - int *pEventLength) -{ - A_STATUS status = A_ERROR; - A_UCHAR hciType = HCI_COMMAND_PKT; - hci_command_hdr hciCommandHdr; - struct iovec iv[3]; - int ivcount = 0; - int sk,result; - struct hci_filter filterSetting; - struct sockaddr_hci addr; - - do { - - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - - if (sk < 0) { - A_ERR("[%s] Failed to get raw BT socket: %d \n", __FUNCTION__, errno); - break; - } - - hciCommandHdr.opcode = htobs(OpCode); - hciCommandHdr.plen= CmdLength; - - iv[0].iov_base = &hciType; - iv[0].iov_len = 1; - ivcount++; - iv[1].iov_base = &hciCommandHdr; - iv[1].iov_len = HCI_COMMAND_HDR_SIZE; - ivcount++; - - if (pCmdData != NULL) { - iv[2].iov_base = pCmdData; - iv[2].iov_len = CmdLength; - ivcount++; - } - - /* setup socket to capture the event */ - hci_filter_clear(&filterSetting); - hci_filter_set_ptype(HCI_EVENT_PKT, &filterSetting); - hci_filter_set_event(EVT_CMD_COMPLETE, &filterSetting); - - if (setsockopt(sk, SOL_HCI, HCI_FILTER, &filterSetting, sizeof(filterSetting)) < 0) { - A_ERR("[%s] Failed to set socket opt: %d \n", __FUNCTION__, errno); - break; - } - - A_MEMZERO(&addr,sizeof(addr)); - addr.hci_family = AF_BLUETOOTH; - addr.hci_dev = pAbfBtInfo->AdapterId; - - if (bind(sk,(struct sockaddr *)&addr, sizeof(addr)) < 0) { - A_ERR("[%s] Can't bind to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - while ((result = writev(sk, iv, ivcount)) < 0) { - if (errno == EAGAIN || errno == EINTR) { - continue; - } - break; - } - - if (result <= 0) { - A_ERR("[%s] Failed to write to hci:%d (err:%d) \n", __FUNCTION__, pAbfBtInfo->AdapterId, errno); - break; - } - - - status = WaitForHCIEvent(sk, - EventRecvTimeoutMS, - pEventBuffer, - MaxLength, - EVT_CMD_COMPLETE, - OpCode, - ppEventPtr, - pEventLength); - - if (A_FAILED(status)) { - break; - } - - status = A_OK; - - } while (FALSE); - - if (sk >= 0) { - close(sk); - } - - return status; -} - -#define AFH_CHANNEL_MAP_BYTES 10 - -typedef struct _WLAN_CHANNEL_MAP { - A_UCHAR Map[AFH_CHANNEL_MAP_BYTES]; -} WLAN_CHANNEL_MAP; - -#define MAX_WLAN_CHANNELS 14 - -typedef struct _WLAN_CHANNEL_RANGE { - int ChannelNumber; - int Center; /* in Mhz */ -} WLAN_CHANNEL_RANGE; - -const WLAN_CHANNEL_RANGE g_ChannelTable[MAX_WLAN_CHANNELS] = { - { 1 , 2412}, - { 2 , 2417}, - { 3 , 2422}, - { 4 , 2427}, - { 5 , 2432}, - { 6 , 2437}, - { 7 , 2442}, - { 8 , 2447}, - { 9 , 2452}, - { 10 , 2457}, - { 11 , 2462}, - { 12 , 2467}, - { 13 , 2472}, - { 14 , 2484}, -}; - -static WLAN_CHANNEL_MAP g_ChannelMapTable[MAX_WLAN_CHANNELS + 1] = { - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 0 -- no WLAN */ - { {0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 1 */ - { {0x0F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 2 */ - { {0xFF,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 3 */ - { {0xFF,0x3F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 4 */ - { {0xFF,0xFF,0x07,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x7F}}, /* 5 */ - { {0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x7F}}, /* 6 */ - { {0xFF,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x7F}}, /* 7 */ - { {0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFE,0xFF,0x7F}}, /* 8 */ - { {0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0xC0,0xFF,0x7F}}, /* 9 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF8,0x7F}}, /* 10 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x7F}}, /* 11 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x60}}, /* 12 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00}}, /* 13 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}}, /* 14 */ -}; - -#define AFH_COMMAND_COMPLETE_TIMEOUT_MS 2000 - -static int LookUpChannel(int FreqMhz) -{ - int i; - - if (FreqMhz == 0) { - /* not connected */ - return 0; - } - - for (i = 0; i < MAX_WLAN_CHANNELS; i++) { - if (FreqMhz <= g_ChannelTable[i].Center) { - break; - } - } - return (i < MAX_WLAN_CHANNELS) ? g_ChannelTable[i].ChannelNumber : 0; -} - -static A_STATUS IssueAFHChannelClassification(ABF_BT_INFO *pAbfBtInfo, int CurrentWLANChannel) -{ - A_UCHAR evtBuffer[HCI_MAX_EVENT_SIZE]; - A_STATUS status; - A_UCHAR *eventPtr; - int eventLen; - A_UCHAR *pChannelMap; - - A_INFO("WLAN Operating Channel: %d \n", CurrentWLANChannel); - - if (CurrentWLANChannel > MAX_WLAN_CHANNELS) { - /* check if this is expressed in Mhz */ - if (CurrentWLANChannel >= 2412) { - /* convert Mhz into a channel number */ - CurrentWLANChannel = LookUpChannel(CurrentWLANChannel); - } else { - return A_ERROR; - } - } - - pChannelMap = &(g_ChannelMapTable[CurrentWLANChannel].Map[0]); - - do { - - status = IssueHCICommand(pAbfBtInfo, - cmd_opcode_pack(3,0x3F), - pChannelMap, - AFH_CHANNEL_MAP_BYTES, - AFH_COMMAND_COMPLETE_TIMEOUT_MS, - evtBuffer, - sizeof(evtBuffer), - &eventPtr, - &eventLen); - - - if (A_FAILED(status)) { - break; - } - - status = A_ERROR; - - if (eventPtr == NULL) { - A_ERR("[%s] Failed to capture AFH command complete event \n", __FUNCTION__); - break; - } - - if (eventLen < (sizeof(evt_cmd_complete) + 1)) { - A_ERR("[%s] not enough bytes in AFH command complete event %d \n", __FUNCTION__, eventLen); - break; - } - - /* check status parameter that follows the command complete event body */ - if (eventPtr[sizeof(evt_cmd_complete)] != 0) { - A_ERR("[%s] AFH command complete event indicated failure : %d \n", __FUNCTION__, - eventPtr[sizeof(evt_cmd_complete)]); - break; - } - - A_INFO(" AFH Command successfully issued \n"); - //A_DUMP_BUFFER(pChannelMap, AFH_CHANNEL_MAP_BYTES, "AFH Channel Classification Map"); - - status = A_OK; - - } while (FALSE); - - return status; -} - - -void IndicateCurrentWLANOperatingChannel(ATHBT_FILTER_INFO *pFilterInfo, int CurrentWLANChannel) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)pFilterInfo->pBtInfo; - - if (NULL == pAbfBtInfo) { - return; - } - - if (pAbfBtInfo->Flags & ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION) { - IssueAFHChannelClassification(pAbfBtInfo,CurrentWLANChannel); - } -} - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.h deleted file mode 100644 index f9bb3274d811..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_dbus_glib.h +++ /dev/null @@ -1,68 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -#ifndef ABTFILT_BTSTACK_DBUS_GLIB_H_ -#define ABTFILT_BTSTACK_DBUS_GLIB_H_ -#include "abtfilt_int.h" -#include - -/*-----------------------------------------------------------------------*/ -/* BT Section */ -#define STRING_SIZE_MAX 64 -#define BD_ADDR_SIZE 6 - -typedef struct _ABF_BT_INFO { - ATHBT_FILTER_INFO *pInfo; - A_COND_OBJECT hWaitEvent; - A_MUTEX_OBJECT hWaitEventLock; - A_BOOL Loop; - A_BOOL AdapterAvailable; - GMainLoop *Mainloop; - DBusGConnection *Bus; - DBusGProxy *DeviceAdapter; - DBusGProxy *DeviceManager; - DBusGProxy *AudioManager; - DBusGProxy *AudioHeadset; - DBusGProxy *AudioGateway; - DBusGProxy *AudioSink; - DBusGProxy *AudioSource; - DBusGProxy *AudioDevice; - A_UINT8 HCIVersion; - A_UINT16 HCIRevision; - A_UINT8 LMPVersion; - A_UINT16 LMPSubVersion; - A_UINT8 RemoteDevice[BD_ADDR_SIZE]; - A_UINT8 DeviceAddress[BD_ADDR_SIZE]; - A_CHAR AdapterName[STRING_SIZE_MAX]; - A_CHAR DeviceName[STRING_SIZE_MAX]; - A_CHAR ManufacturerName[STRING_SIZE_MAX]; - A_CHAR ProtocolVersion[STRING_SIZE_MAX]; - A_BOOL AdapterCbRegistered; - A_CHAR DefaultAudioDeviceName[STRING_SIZE_MAX]; - A_BOOL DefaultAudioDeviceAvailable; - A_BOOL AudioCbRegistered; - A_UCHAR CurrentSCOLinkType; - int AdapterId; - int HCIEventListenerSocket; - A_UINT32 Flags; -} ABF_BT_INFO; - -#endif /*ABTFILT_BTSTACK_DBUS_GLIB_H_*/ diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_hciutils.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_hciutils.c deleted file mode 100644 index 6939c07ee9f7..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_bluez_hciutils.c +++ /dev/null @@ -1,382 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2011 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -#include "abtfilt_bluez_dbus.h" - -#undef HCI_INQUIRY -#include -#include -#include - -#include "hciutils.h" -#include - -extern ABF_BT_INFO * g_pAbfBtInfo; - -#define ForgetRemoteAudioDevice(pA) \ -{ \ - A_MEMZERO((pA)->DefaultRemoteAudioDeviceAddress,sizeof((pA)->DefaultRemoteAudioDeviceAddress)); \ - (pA)->DefaultRemoteAudioDevicePropsValid = FALSE; \ -} - -#if !defined(STATIC_LINK_HCILIBS) -static void *g_hciHandle; -#endif - -static tHCIUTILS_STATUS (* pfn_HCIUTILS_RegisterHCINotification) ( tHCIUTILS_NOTIFICATION_TYPE t_type, int nOpCode, tHCIUTILS_EVENT_CALLBACK eventNotificationCallback ,void * p_appdata ) = NULL; -static void ( *pfn_HCIUTILS_SendCmd) (tHCIUTILS_HCI_CMD tCmd, void * p_hci_cmd_params) = NULL; -static void (*pfn_HCIUTILS_UnRegisterHCINotification)(tHCIUTILS_NOTIFICATION_TYPE t_type,int nOpCode) = NULL; - -static A_UINT32 hciEventList[] = -{ - HCI_EVT_REMOTE_DEV_LMP_VERSION, /* 0xb*/ - HCI_EVT_REMOTE_DEV_VERSION, /* 0xc */ - EVT_INQUIRY_COMPLETE, - EVT_PIN_CODE_REQ, - EVT_LINK_KEY_NOTIFY, - HCI_EVT_ROLE_CHANGE, /* 0x12*/ - EVT_CONN_COMPLETE, - HCI_EVT_SCO_CONNECT_COMPLETE, - HCI_EVT_DISCONNECT, -}; - -static A_UINT32 hciCmdList[] = -{ - HCI_CMD_OPCODE_INQUIRY_START, - HCI_CMD_OPCODE_INQUIRY_CANCEL, - HCI_CMD_OPCODE_CONNECT, -} ; - -static void eventNotificationCallback ( tHCIUTILS_NOTIFICATION * pEvent) -{ - ABF_BT_INFO *pAbfBtInfo = (ABF_BT_INFO *)g_pAbfBtInfo; - ATHBT_FILTER_INFO *pInfo = pAbfBtInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - if(pEvent->tType == HCIUTILS_COMMAND) { - if(pEvent->nOpCode == HCI_CMD_OPCODE_INQUIRY_START) { - A_DEBUG("Device Inquiry Started \n"); - pAbfBtInfo->btInquiryState |= (1 << 0); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_ON); - } - if(pEvent->nOpCode == HCI_CMD_OPCODE_INQUIRY_CANCEL ) { - A_DEBUG("Device Inquiry cancelled \n"); - if(pAbfBtInfo->btInquiryState) { - pAbfBtInfo->btInquiryState &= ~(1 << 0); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - if(pEvent->nOpCode == HCI_CMD_OPCODE_CONNECT) { - A_DEBUG("Bt-Connect\n"); - } - } - if(pEvent->tType == HCIUTILS_EVENT) { - -#define LMP_FEATURE_ACL_EDR_2MBPS_BYTE_INDEX 3 -#define LMP_FEATURE_ACL_EDR_2MBPS_BIT_MASK 0x2 -#define LMP_FEATURE_ACL_EDR_3MBPS_BYTE_INDEX 3 -#define LMP_FEATURE_ACL_EDR_3MBPS_BIT_MASK 0x4 -#define LMP_FEATURES_LENGTH 8 - if(pEvent->nOpCode == HCI_EVT_REMOTE_DEV_LMP_VERSION) { - A_UINT32 i = 0; - A_UINT32 len = pEvent->n_data_length; - A_UCHAR * eventPtr = (A_UCHAR *)pEvent->p_notification_data_buf; - A_UINT8 *lmp_features; - - /* Process LMP Features */ - - - A_DUMP_BUFFER(eventPtr, len,"Remote Device LMP Features:"); - - eventPtr += 1; - len -= 1 ; - lmp_features = &eventPtr[3]; - A_DUMP_BUFFER(lmp_features, sizeof(lmp_features),"Remote Device LMP Features:"); - - if ((lmp_features[LMP_FEATURE_ACL_EDR_2MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_2MBPS_BIT_MASK) || - (lmp_features[LMP_FEATURE_ACL_EDR_3MBPS_BYTE_INDEX] & LMP_FEATURE_ACL_EDR_3MBPS_BIT_MASK)) - { - A_DEBUG("Device is EDR capable \n"); - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 3; - } else { - A_DEBUG("Device is NOT EDR capable \n"); - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - } - pAbfBtInfo->DefaultRemoteAudioDevicePropsValid = TRUE; - pInfo->A2DPConnection_LMPVersion = pInfo->SCOConnection_LMPVersion = - pAbfBtInfo->DefaultAudioDeviceLmpVersion; - } - if(pEvent->nOpCode == HCI_EVT_REMOTE_DEV_VERSION) { - A_UCHAR * eventPtr = (A_UCHAR *)pEvent->p_notification_data_buf; - A_UINT32 len = pEvent->n_data_length; - - A_DUMP_BUFFER(eventPtr, len,"Remote Device Version"); - eventPtr += 1; - len -= 1; - A_DUMP_BUFFER(eventPtr, len,"Remote Device Version"); - - if (eventPtr[3] == 0) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.0"); - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 0; - A_DEBUG("Its 1.0 \n"); - } else if (eventPtr[3] == 1) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.1"); - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 1; - A_DEBUG("Its 1.1 \n"); - } else if (eventPtr[3] == 2) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "1.2"); - pAbfBtInfo->DefaultAudioDeviceLmpVersion = 2; - A_DEBUG("Its 1.2 \n"); - } else if (eventPtr[3] == 3) { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "2.0"); -/* pAbfBtInfo->DefaultAudioDeviceLmpVersion = 3; */ - A_DEBUG("Its 2.0 \n"); - }else { - strcpy(&pAbfBtInfo->DefaultRemoteAudioDeviceVersion[0], "2.1"); -/* pAbfBtInfo->DefaultAudioDeviceLmpVersion = 4; */ - A_DEBUG("Its 2.1 \n"); - } - - pInfo->A2DPConnection_LMPVersion = pInfo->SCOConnection_LMPVersion = - pAbfBtInfo->DefaultAudioDeviceLmpVersion; - } - if (pEvent->nOpCode == EVT_INQUIRY_COMPLETE) { - A_DEBUG("Device Inquiry Completed\n"); - if(pAbfBtInfo->btInquiryState) { - pAbfBtInfo->btInquiryState &= ~(1 << 0); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - if (pEvent->nOpCode == EVT_PIN_CODE_REQ) { - A_DEBUG("Pin Code Request\n"); - } - - if (pEvent->nOpCode == EVT_LINK_KEY_NOTIFY) { - A_DEBUG("link key notify\n"); - } - if(pEvent->nOpCode == HCI_EVT_ROLE_CHANGE) { - A_DEBUG("Role Change\n"); - A_UCHAR * eventPtr = (A_UCHAR *)pEvent->p_notification_data_buf; - A_UINT32 len = pEvent->n_data_length; - - A_DUMP_BUFFER(eventPtr, len,"Remote Device Role "); - eventPtr += 8; - len -= 8; - if(*eventPtr == 0x00) { - A_DEBUG("ROLE IS MASTER \n"); - pAbfBtInfo->pInfo->A2DPConnection_Role = 0x0; - } - if(*eventPtr == 0x01) { - A_DEBUG("ROLE IS SLAVE \n"); - pAbfBtInfo->pInfo->A2DPConnection_Role = 0x1; - } - } - if(pEvent->nOpCode == EVT_CONN_COMPLETE) { - A_DEBUG("Conn complete\n"); - if(pAbfBtInfo->btInquiryState) { - pAbfBtInfo->btInquiryState &= ~(1 << 1); - AthBtIndicateState(pInstance, ATH_BT_INQUIRY, STATE_OFF); - } - } - - if(pEvent->nOpCode == HCI_EVT_SCO_CONNECT_COMPLETE) { - A_UINT32 len = pEvent->n_data_length; - A_UCHAR * eventPtr = (A_UCHAR*)pEvent->p_notification_data_buf; - - A_DUMP_BUFFER(eventPtr, len,"SCO CONNECT_COMPLETE"); - A_DEBUG("SCO CONNECT COMPLETE \n"); - pInfo->SCOConnection_LMPVersion = - pAbfBtInfo->DefaultAudioDeviceLmpVersion; - - pInfo->SCOConnectInfo.LinkType = eventPtr[10]; - pInfo->SCOConnectInfo.TransmissionInterval = eventPtr[11]; - pInfo->SCOConnectInfo.RetransmissionInterval = eventPtr[12]; - pInfo->SCOConnectInfo.RxPacketLength = eventPtr[13]; - pInfo->SCOConnectInfo.TxPacketLength = eventPtr[15]; - pInfo->SCOConnectInfo.Valid = TRUE; - - A_INFO("HCI SYNC_CONN_COMPLETE event captured, conn info (%d, %d, %d, %d, %d) \n", - pInfo->SCOConnectInfo.LinkType, - pInfo->SCOConnectInfo.TransmissionInterval, - pInfo->SCOConnectInfo.RetransmissionInterval, - pInfo->SCOConnectInfo.RxPacketLength, - pInfo->SCOConnectInfo.TxPacketLength); - - AthBtIndicateState(pInstance, - pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO? ATH_BT_ESCO: ATH_BT_SCO, - STATE_ON); - } - if(pEvent->nOpCode == HCI_EVT_DISCONNECT) { - A_UINT32 bitmap = FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore); - - A_DEBUG("HCI_EVT_DISCONNECT event \n"); - - if( (bitmap & (1 << ATH_BT_SCO))|| (bitmap & (1 << ATH_BT_ESCO))) { - AthBtIndicateState(pInstance, - pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO? ATH_BT_ESCO: ATH_BT_SCO, - STATE_OFF); - } - ForgetRemoteAudioDevice(pAbfBtInfo); - pInfo->SCOConnectInfo.Valid = FALSE; - pAbfBtInfo->pInfo->A2DPConnection_Role = 0x0; - } - } -} - -void -Abf_RegisterToHciLib( ABF_BT_INFO * pAbfBtInfo) -{ - void * handle = 0; - tHCIUTILS_STATUS ret; - - char * pparam = NULL; - int n_opcode = 0, n_type = 0; - int i; - A_INFO("Register To HCI LIB \n"); - - if (pfn_HCIUTILS_RegisterHCINotification) { - for (i=0; i <= 2;i++) { - ret = (*pfn_HCIUTILS_RegisterHCINotification) - ( - HCIUTILS_COMMAND, - hciCmdList[i], - eventNotificationCallback, - (void *) pAbfBtInfo - ); - A_DEBUG("Registered for HCI cmd %x, ret= %d\n", hciCmdList[i],ret); - } - for (i=0; i <= 8; i++) { - ret = (*pfn_HCIUTILS_RegisterHCINotification) - ( - HCIUTILS_EVENT, - hciEventList[i], - eventNotificationCallback, - (void *)pAbfBtInfo - ); - A_DEBUG("Hcievent List[%d] =%x, ret =%x\n",i, hciEventList[i], ret); - } - } -} - -void -Abf_UnRegisterToHciLib( ABF_BT_INFO * pAbfBtInfo) -{ - A_DEBUG("Unregistering HCI library handler\n"); - if(pfn_HCIUTILS_UnRegisterHCINotification) { - int i; - for (i=0; i <= 2;i++) { - (*pfn_HCIUTILS_UnRegisterHCINotification) - ( - HCIUTILS_COMMAND, - hciCmdList[i] - ); - A_DEBUG("Unregistered for HCI cmd %x\n", hciCmdList[i]); - } - for (i=0; i <= 8; i++) { - (*pfn_HCIUTILS_UnRegisterHCINotification) - ( - HCIUTILS_EVENT, - hciEventList[i] - ); - A_DEBUG("Unregistered Hcievent List[%d] =%x\n",i, hciEventList[i]); - } - } -} - -A_STATUS Abf_IssueAFHViaHciLib (ABF_BT_INFO * pAbfBtInfo, - int CurrentWLANChannel) -{ - A_UINT32 center; - tHCIUTILS_HCICMD_SET_AFH_CHANNELS setChannels; - - A_INFO("WLAN Operating Channel: %d \n", CurrentWLANChannel); - - if(!CurrentWLANChannel) { - setChannels.first = 79; - setChannels.last = 79; - center = 0; - }else { - if( (CurrentWLANChannel < 2412) || - (CurrentWLANChannel > 2470)) - { - return A_ERROR; - } - center = CurrentWLANChannel; - center = center - 2400; - setChannels.first = center - 10; - setChannels.last = center + 10; - } - - if (pfn_HCIUTILS_SendCmd) { - (*pfn_HCIUTILS_SendCmd) (HCIUTILS_SET_AFH_CHANNELS, &setChannels); - A_DEBUG("Issue AFH first =%x, last = %x, center =%x\n", - setChannels.first, setChannels.last, center); - } else { - A_ERR( "%s : Fail to issue AFH due to NULL pointer of pfn_HCIUTILS_SendCmd\n", __FUNCTION__); - return A_ERROR; - } - - return A_OK; -} - -A_STATUS Abf_HciLibInit(A_UINT32 *btfiltFlags) -{ -#ifdef STATIC_LINK_HCILIBS - pfn_HCIUTILS_RegisterHCINotification = HCIUTILS_RegisterHCINotification; - pfn_HCIUTILS_SendCmd = HCIUTILS_SendCmd; - pfn_HCIUTILS_UnRegisterHCINotification = HCIUTILS_UnRegisterHCINotification; - /* We don't force to set ONLY DBUS flags here since we are static linking */ - return A_OK; -#else - g_hciHandle = dlopen("hciutils.so", RTLD_NOW); - if( g_hciHandle == NULL){ - A_ERR( "%s : Error loading library hciutils.so %s\n", __FUNCTION__, dlerror()); - return A_ERROR; - } else { - A_DEBUG( "Load hciutils.so successfully\n"); - pfn_HCIUTILS_RegisterHCINotification = dlsym(g_hciHandle, "HCIUTILS_RegisterHCINotification"); - pfn_HCIUTILS_SendCmd = dlsym(g_hciHandle, "HCIUTILS_SendCmd"); - pfn_HCIUTILS_UnRegisterHCINotification = dlsym(g_hciHandle, "HCIUTILS_UnRegisterHCINotification"); - if ( (NULL == pfn_HCIUTILS_RegisterHCINotification) || (NULL == pfn_HCIUTILS_SendCmd) || - (NULL == pfn_HCIUTILS_UnRegisterHCINotification) ) - { - A_ERR("ERROR GETTING HCIUTILS SYMBOLS \n"); - dlclose(g_hciHandle); - g_hciHandle = NULL; - return A_ERROR; - } - /* Make sure we enable ONLY DBUS flags */ - *btfiltFlags |= ABF_USE_ONLY_DBUS_FILTERING; - return A_OK; - } -#endif -} - -void Abf_HciLibDeInit(void) -{ -#ifndef STATIC_LINK_HCILIBS - if(g_hciHandle) { - dlclose(g_hciHandle); - g_hciHandle = NULL; - } -#endif -} - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_core.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_core.c deleted file mode 100644 index 14fd28682b98..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_core.c +++ /dev/null @@ -1,1422 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2011 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -//============================================================================== -/* - * Bluetooth Filter Front End - * - */ - -#include "abtfilt_int.h" - -/* Defines */ -#define MAX_VAL_DATA_LENGTH 128 - -const A_CHAR *g_IndicationStrings[ATH_BT_MAX_STATE_INDICATION] = -{ - "NOP", - "INQUIRY", - "CONNECT", - "SCO", - "ACL", - "A2DP", - "ESCO", -}; - -extern A_FILE_HANDLE gConfigFile; - -/* Function Prototypes */ -static void BtStateActionProper(ATHBT_FILTER_INFO *pInfo, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State); -static void DoBtStateAction(ATHBT_FILTER_INFO *pInfo, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State); -static void AthFilterCmdEventsCallback(void *pContext, - ATHBT_HCI_CTRL_TYPE Type, - unsigned char *pBuffer, int Length); -static void AthFilterIndicateStateCallback(void *pContext, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - unsigned char LMPVersion); -static void AthFilterAclDataOutCallback(void *pContext, - unsigned char *pBuffer, int Length); -static void AthFilterAclDataInCallback(void *pContext, - unsigned char *pBuffer, int Length); -static void ProcessBTActionMessages(ATHBT_FILTER_INFO *pInfo, - BTACTION_QUEUE_PROC Process, - ATHBT_STATE_INDICATION StateToFlush); -static void ExecuteBtAction(ATHBT_FILTER_INFO *pInfo, - BT_ACTION_MSG *pBtActionMsg); -static ATHBT_STATE_INDICATION IndicateA2DP(ATHBT_FILTER_INFO *pInfo , - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - unsigned char *pACLBuffer); -static void *FilterThread(void *arg); -static void SyncBTState(ATHBT_FILTER_INFO *pInfo); -static void ProcessActionOverride(ATHBT_FILTER_INFO *pInfo, - A_CHAR *pIndicationStr, - A_CHAR *pModifyAction, - A_CHAR *pAction); -static void GetActionStringOverrides(ATHBT_FILTER_INFO *pInfo); - -/* APIs exported to other modules */ -void -AthBtFilter_State_Off(ATHBT_FILTER_INFO *pInfo) -{ - /* - * before we exit we need to counter-act the coexistence - * settings. Currently we just indicate that each state is now - * OFF (if they are ON). This state synchronization is typically - * required on HOT-removable BT adapters or where the low level - * adapter can be surprise removed before the BT stack can clean - * up HCI connections and states - */ - if (pInfo->AdapterAvailable) { - int indication, newIndication; - ATHBT_STATE newState; - - /* - * the BT adapter is going away, indicate that all indications - * are now in the OFF state, this may queue up control action - * messages, which is okay - */ - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; - indication++) - { - A_LOCK_FILTER(pInfo); - newIndication = - FCore_FilterIndicatePreciseState(&pInfo->FilterCore, - indication, STATE_OFF, &newState); - A_UNLOCK_FILTER(pInfo); - - if (newIndication == ATH_BT_NOOP) { - continue; - } - - DoBtStateAction(pInfo, indication, newState); - } - - /* issue control actions */ - ProcessBTActionMessages(pInfo, BTACTION_QUEUE_SYNC_STATE, - ATH_BT_NOOP); - } - - -} - -int -AthBtFilter_Attach(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 flags) -{ - int i; - int retVal = -1; - ATHBT_FILTER_INFO *pInfo = NULL; - BT_ACTION_MSG *pBTActionMsg; - A_UINT32 maxBTActionMsgs = MAX_BT_ACTION_MESSAGES; - A_STATUS status; - BT_FILTER_CORE_INFO * pCoreInfo = NULL; - - do { - pInfo = (ATHBT_FILTER_INFO *)A_MALLOC(sizeof(ATHBT_FILTER_INFO) + - maxBTActionMsgs * (sizeof(BT_ACTION_MSG))); - if (NULL == pInfo) { - A_ERR("[%s] Failed to allocate BT filter info\n", __FUNCTION__); - break; - } - A_MEMZERO(pInfo, sizeof(ATHBT_FILTER_INFO)); - - pInstance->pContext = pInfo; - pInfo->pInstance = pInstance; - pInfo->MaxBtActionMessages = (int)maxBTActionMsgs; - pInfo->AdapterAvailable = FALSE; - pInfo->Shutdown = FALSE; - - status = A_MUTEX_INIT(&pInfo->CritSection); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to initialize critical section\n", - __FUNCTION__); - break; - } - - DL_LIST_INIT(&pInfo->BTActionMsgList); - DL_LIST_INIT(&pInfo->FreeActionMsgList); - pCoreInfo = &pInfo->FilterCore; - pCoreInfo->FilterState.btFilterFlags = flags; - - A_DEBUG("Calling Fcore Init\n"); - if (!FCore_Init(pCoreInfo)) { - A_DEBUG(" Fcore Init failed \n"); - break; - } - - GetActionStringOverrides(pInfo); - - status = FCore_RefreshActionList(&pInfo->FilterCore); - if (A_FAILED(status)) { - A_ERR("[%s] Failed refresh action list (status:%d)\n", - __FUNCTION__, status); - break; - } - - /* message buffers are at the end of our context blob */ - pBTActionMsg = (BT_ACTION_MSG *)((A_UCHAR *)pInfo + - sizeof(ATHBT_FILTER_INFO)); - - for (i = 0; i < pInfo->MaxBtActionMessages; i++, pBTActionMsg++) { - /* create the event for blocking requests */ - status = A_COND_INIT(&pBTActionMsg->hWaitEvent); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to allocate BT action event wait object\n", - __FUNCTION__); - /* if we are running out of memory we'll fail farther down */ - break; - } - - status = A_MUTEX_INIT(&pBTActionMsg->hWaitEventLock); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to initialize the mutex\n", __FUNCTION__); - /* if we are running out of memory we'll fail farther down */ - break; - } - - /* free to list */ - FREE_BT_ACTION_MSG(pInfo, pBTActionMsg); - } - - /* create the wake event for our dispatcher thread */ - status = A_COND_INIT(&pInfo->hWakeEvent); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to allocate wakeup event\n", __FUNCTION__); - break; - } - - status = A_MUTEX_INIT(&pInfo->hWakeEventLock); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to initialize critical section\n", - __FUNCTION__); - break; - } - - /* - * get the event types that the filter core can ignore. The BT - * notification side can handle them TODO - */ - pInfo->FilterCore.StateFilterIgnore = 0; - - pInstance->pFilterCmdEvents = AthFilterCmdEventsCallback; - pInstance->pIndicateState = AthFilterIndicateStateCallback; - pInstance->pFilterAclDataOut = AthFilterAclDataOutCallback; - pInstance->pFilterAclDataIn = AthFilterAclDataInCallback; - - /* - * We are fully initialized and ready to filter. The filter core - * needs to stay in sync with the BT radio state until the WLAN - * driver comes up, when the WLAN driver comes on-line the filter - * will issue operating parameters for the current BT radio state - * (see HandleAdapterEvent) - */ - pInstance->FilterEnabled = TRUE; - - status = A_TASK_CREATE(&pInfo->hFilterThread, FilterThread, pInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to create filter thread\n", __FUNCTION__); - break; - } - - pInfo->FilterThreadValid = TRUE; - - retVal = 0; - A_INFO("BT Filter Core init complete\n"); - } while (FALSE); - - if (retVal < 0) { - AthBtFilter_Detach(pInstance); - } - - return retVal; -} - -void -AthBtFilter_Detach(ATH_BT_FILTER_INSTANCE *pInstance) -{ - A_STATUS status; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - BT_ACTION_MSG *pBTActionMsg; - int i; - - /* make sure filter is disabled */ - pInstance->FilterEnabled = FALSE; - - if (NULL == pInfo) { - return; - } - - pInfo->Shutdown = TRUE; - - /* wake filter thread */ - A_MUTEX_LOCK(&pInfo->hWakeEventLock); - A_COND_SIGNAL(&pInfo->hWakeEvent); - A_MUTEX_UNLOCK(&pInfo->hWakeEventLock); - - if (pInfo->FilterThreadValid) { - pInfo->FilterThreadValid = FALSE; - /* wait for thread to exit */ - status = A_TASK_JOIN(&pInfo->hFilterThread); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to JOIN filter thread \n", - __FUNCTION__); - } - } - - A_COND_DEINIT(&pInfo->hWakeEvent); - A_MUTEX_DEINIT(&pInfo->hWakeEventLock); - - pBTActionMsg = (BT_ACTION_MSG *)((A_UCHAR *)pInfo + - sizeof(ATHBT_FILTER_INFO)); - /* close all action message wait objects */ - for (i = 0; i < pInfo->MaxBtActionMessages; i++, pBTActionMsg++) { - A_COND_DEINIT(&pBTActionMsg->hWaitEvent); - A_MUTEX_DEINIT(&pBTActionMsg->hWaitEventLock); - } - - pInstance->pContext = NULL; - A_MUTEX_DEINIT(&pInfo->CritSection); - FCore_Cleanup(&pInfo->FilterCore); - A_FREE(pInfo); - - A_INFO("BT Filter Core de-init complete\n"); -} - -/* Internal functions */ -static void -AdjustBtControlAction(ATHBT_FILTER_INFO *pInfo, - BT_ACTION_MSG *pActionMsg) -{ - -#define A2DP_CONFIG_ALLOW_OPTIMIZATION ( 1 << 0) -#define A2DP_CONFIG_EDR_CAPABLE ( 1 << 1) -#define A2DP_CONFIG_IS_COLOCATED_IS_MASTER ( 1 << 2) -#define A2DP_CONFIG_A2DP_IS_HIGH_PRI ( 1 << 3) - - if (pActionMsg->StateForControlAction != STATE_ON) { - /* nothing to adjust in OFF case */ - return; - } - - if (pActionMsg->ControlAction.Type != BT_CONTROL_ACTION_PARAMS) { - /* only modify action that issues a PARAMS control action */ - return; - } - - if(pInfo->Flags & ABF_WIFI_CHIP_IS_VENUS) { - - if (pActionMsg->IndicationForControlAction == ATH_BT_A2DP) { - WMI_SET_BTCOEX_A2DP_CONFIG_CMD *pA2dpParamsCmd = - (WMI_SET_BTCOEX_A2DP_CONFIG_CMD *) - (pActionMsg->ControlAction.Buffer); - BTCOEX_A2DP_CONFIG *pA2dpGenericConfig = - &pA2dpParamsCmd->a2dpConfig; - BTCOEX_PSPOLLMODE_A2DP_CONFIG * pA2dpPspollConfig = - &pA2dpParamsCmd->a2dppspollConfig; - BTCOEX_OPTMODE_A2DP_CONFIG * pA2dpOptModeConfig = - &pA2dpParamsCmd->a2dpOptConfig; - - pA2dpGenericConfig->a2dpFlags = 0; - /*Role =0 is Master, Role =1, is slave */ - if(pInfo->A2DPConnection_Role == 0) { - pA2dpGenericConfig->a2dpFlags |= A2DP_CONFIG_IS_COLOCATED_IS_MASTER; - }else { - pA2dpGenericConfig->a2dpFlags &= ~A2DP_CONFIG_IS_COLOCATED_IS_MASTER; - } - - switch (pInfo->A2DPConnection_LMPVersion) { - case 0: // 1.0 - case 1: // 1.1 - case 2: // 1.2 - pA2dpPspollConfig->a2dpWlanMaxDur = 30; - pA2dpOptModeConfig->a2dpMaxAggrSize = 1; - pA2dpOptModeConfig->a2dpMinlowRateMbps =52; - pA2dpPspollConfig->a2dpDataRespTimeout = 10; - pA2dpPspollConfig->a2dpMinBurstCnt = 4; - break; - case 3: // 2.0 - case 4: // 2.1 - default: - pA2dpPspollConfig->a2dpDataRespTimeout = 20; - pA2dpPspollConfig->a2dpWlanMaxDur = 50; - pA2dpOptModeConfig->a2dpMaxAggrSize = 16; - pA2dpOptModeConfig->a2dpMinlowRateMbps =36; -#ifdef MSM_7230 - if(pA2dpGenericConfig->a2dpFlag & A2DP_CONFIG_IS_COLOCATED_IS_MASTER) { - pA2dpPspollConfig->a2dpMinBurstCnt = 1; - }else{ - pA2dpPspollConfig->a2dpMinBurstCnt = 2; - } - - -#else - pA2dpPspollConfig->a2dpMinBurstCnt = 2; - -#endif - /* Indicate that remote device is EDR capable */ - pA2dpGenericConfig->a2dpFlags |= A2DP_CONFIG_EDR_CAPABLE; - break; - } - if(pInfo->Flags & ABF_BT_CHIP_IS_ATHEROS) { - pA2dpGenericConfig->a2dpFlags |= A2DP_CONFIG_A2DP_IS_HIGH_PRI ; - /* Enable optmization for all the modes */ - pA2dpGenericConfig->a2dpFlags |= A2DP_CONFIG_ALLOW_OPTIMIZATION; - }else { - /* Enable optmization for only for master role */ - if(pInfo->A2DPConnection_Role == 0) { - pA2dpGenericConfig->a2dpFlags |= A2DP_CONFIG_ALLOW_OPTIMIZATION; - }else { - pA2dpGenericConfig->a2dpFlags &= ~A2DP_CONFIG_ALLOW_OPTIMIZATION; - pA2dpPspollConfig->a2dpWlanMaxDur = 30; - } - - } - pA2dpOptModeConfig->a2dpLowRateCnt =5; - pA2dpOptModeConfig->a2dpHighPktRatio = 5; - pA2dpOptModeConfig->a2dpPktStompCnt = 6; - /* Continuation of addressing EV#80876 and EV#80859. Disabling OPT mode always as - * device is forced to SLAVE */ - pA2dpGenericConfig->a2dpFlags &= ~A2DP_CONFIG_ALLOW_OPTIMIZATION; - - A_DEBUG(("ATHBT: BT PARAMS A2DP Adjustments :\r\n")); - A_DEBUG((" a2dpWlanUsageLimit : %d\r\n"), - pA2dpPspollConfig->a2dpWlanMaxDur); - A_DEBUG((" a2dpBurstCntMin : %d\r\n"), - pA2dpPspollConfig->a2dpMinBurstCnt); - A_DEBUG((" a2dpDataRespTimeout : %d\r\n"), - pA2dpPspollConfig->a2dpDataRespTimeout); - A_DEBUG((" A2DP OptMode Config-MaxAggrSize : %d\r\n"), - pA2dpOptModeConfig->a2dpMaxAggrSize); - A_DEBUG((" A2DP Flags : %d\r\n"), - pA2dpGenericConfig->a2dpFlags); -#if 0 - A_DEBUG((" A2DP OptMode Config - MinLowRateMbps : %d\r\n"), - pA2dpOptModeConfig->a2dpMinlowRateMbps); - A_DEBUG((" A2DP OptMode Config - LowRateCnt : %d\r\n"), - pA2dpOptModeConfig->a2dpLowRateCnt ); - A_DEBUG((" A2DP High Pkt Ratio Config- PktRatio : %d\r\n"), - pA2dpOptModeConfig->a2dpHighPktRatio ); - A_DEBUG((" A2DP High Pkt Ratio Config- StompCnt : %d\r\n"), - pA2dpOptModeConfig->a2dpPktStompCnt ); -#endif - } - /* adjust control action for BT_PARAMS_SCO control action */ - if ((pActionMsg->IndicationForControlAction == ATH_BT_SCO) || - (pActionMsg->IndicationForControlAction == ATH_BT_ESCO)) - { - WMI_SET_BTCOEX_SCO_CONFIG_CMD *pScoParamsCmd = - (WMI_SET_BTCOEX_SCO_CONFIG_CMD *) - (pActionMsg->ControlAction.Buffer); - BTCOEX_SCO_CONFIG *pScoGenericConfig = - &pScoParamsCmd->scoConfig; - BTCOEX_PSPOLLMODE_SCO_CONFIG * pScoPspollConfig = - &pScoParamsCmd->scoPspollConfig; - BTCOEX_OPTMODE_SCO_CONFIG * pScoOptModeConfig = - &pScoParamsCmd->scoOptModeConfig; - BTCOEX_WLANSCAN_SCO_CONFIG * pScoWlanScanConfig = - &pScoParamsCmd->scoWlanScanConfig; - - pScoGenericConfig->scoFlags = 0; - do { - if ((pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO) && - (pInfo->SCOConnectInfo.Valid)) - { - A_UCHAR scoSlots; - /* decode packet length to get packet type */ - if (pInfo->SCOConnectInfo.TxPacketLength <= 30) { - /* EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 60) { - /* 2-EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 90) { - /*3-EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 120) { - /* EV4: */ - scoSlots = 3; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 180) { - /* EV5: */ - scoSlots = 3; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 360) { - /* 2-EV5 */ - scoSlots = 3; - } else { - /* 3-EV5 */ - scoSlots = 3; - } - - scoSlots *= 2; - pScoGenericConfig->scoSlots = scoSlots; - - if (pInfo->SCOConnectInfo.TransmissionInterval >= scoSlots) { - pScoGenericConfig->scoIdleSlots = - pInfo->SCOConnectInfo.TransmissionInterval - scoSlots; - } else { - A_DEBUG(("Invalid scoSlot, got:%d, transInt: %d\n"), - scoSlots, - pInfo->SCOConnectInfo.TransmissionInterval); - } - } else { - /* legacy SCO */ - pScoGenericConfig->scoSlots = 2; - pScoGenericConfig->scoIdleSlots = 4; - } - // pScoGenericConfig->scoFlags |= WMI_SCO_CONFIG_FLAG_ALLOW_OPTIMIZATION; - if(pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO) { - pScoGenericConfig->scoFlags |= WMI_SCO_CONFIG_FLAG_IS_EDR_CAPABLE; - } - if(pScoGenericConfig->scoIdleSlots >= 10) { - pScoPspollConfig->scoPsPollLatencyFraction = 2; - pScoPspollConfig->scoStompDutyCyleVal = 2; - pScoWlanScanConfig->scanInterval = 100; - pScoWlanScanConfig->maxScanStompCnt = 2; - }else { - pScoPspollConfig->scoPsPollLatencyFraction = 1; - pScoPspollConfig->scoStompDutyCyleVal = 5; - pScoWlanScanConfig->scanInterval = 100; - pScoWlanScanConfig->maxScanStompCnt = 4; - } - }while(FALSE); - pScoPspollConfig->scoCyclesForceTrigger = 10; - pScoPspollConfig->scoDataResponseTimeout = 10; - pScoPspollConfig->scoStompDutyCyleMaxVal = 6; - - A_DEBUG(("ATHBT: BT PARAMS SCO adjustment (%s) \n"), - pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO ? "eSCO":"SCO"); - A_DEBUG((" numScoCyclesForceTrigger : %d \n"), - pScoPspollConfig->scoCyclesForceTrigger); - A_DEBUG((" dataResponseTimeout : %d \n"), - pScoPspollConfig->scoDataResponseTimeout = 20); - A_DEBUG((" stompDutyCyleVal : %d \n"), - pScoPspollConfig->scoStompDutyCyleVal); - A_DEBUG((" psPollLatencyFraction : %d \n"), - pScoPspollConfig->scoPsPollLatencyFraction); - A_DEBUG((" noSCOSlots : %d \n"), - pScoGenericConfig->scoSlots); - A_DEBUG((" noIdleSlots : %d \n"), - pScoGenericConfig->scoIdleSlots); - A_DEBUG((" scoFlags : %d \n"), - pScoGenericConfig->scoFlags); - - pScoOptModeConfig->scoStompCntIn100ms = 3; - pScoOptModeConfig->scoContStompMax = 3; - pScoOptModeConfig->scoMinlowRateMbps = 36; - pScoOptModeConfig->scoLowRateCnt = 5; - pScoOptModeConfig->scoHighPktRatio = 5; - - if(pScoGenericConfig->scoIdleSlots >= 10) { - pScoOptModeConfig->scoMaxAggrSize = 8; - }else { - pScoOptModeConfig->scoMaxAggrSize = 1; - } - - } - } - else - { - WMI_SET_BT_PARAMS_CMD *pParamsCmd; - if (pActionMsg->IndicationForControlAction == ATH_BT_A2DP) { - do { - pParamsCmd = - (WMI_SET_BT_PARAMS_CMD *)(pActionMsg->ControlAction.Buffer); - - if (pParamsCmd->paramType != BT_PARAM_A2DP) { - /* only modify A2DP params */ - break; - } - /*Role =0 is Master, Role =1, is slave */ - if(pInfo->A2DPConnection_Role == 0) { - pParamsCmd->info.a2dpParams.isCoLocatedBtRoleMaster = 1; - }else { - pParamsCmd->info.a2dpParams.isCoLocatedBtRoleMaster = 0; - /* workaround for local BT radio that disables EDR - * rates when operating as a slave. We downgrade - * the remote lmp version to protect A2DP as if the radio was 1.2 */ - pInfo->A2DPConnection_LMPVersion = 2; - } - - switch (pInfo->A2DPConnection_LMPVersion) { - case 0: // 1.0 - case 1: // 1.1 - case 2: // 1.2 - pParamsCmd->info.a2dpParams.a2dpWlanUsageLimit = 30; - pParamsCmd->info.a2dpParams.a2dpBurstCntMin = 3; - pParamsCmd->info.a2dpParams.a2dpDataRespTimeout =10; - break; - case 3: // 2.0 - case 4: // 2.1 - default: - if( pParamsCmd->info.a2dpParams.isCoLocatedBtRoleMaster) { - /* allow close range optimization for newer BT radios */ - } - pParamsCmd->info.a2dpParams.a2dpWlanUsageLimit = 100; - pParamsCmd->info.a2dpParams.a2dpBurstCntMin = 1; - pParamsCmd->info.a2dpParams.a2dpDataRespTimeout =10; - break; - } - - A_DEBUG(("ATHBT: BT PARAMS A2DP Adjustments :\r\n")); - A_DEBUG((" a2dpWlanUsageLimit : %d\r\n"), - pParamsCmd->info.a2dpParams.a2dpWlanUsageLimit); - A_DEBUG((" a2dpBurstCntMin : %d\r\n"), - pParamsCmd->info.a2dpParams.a2dpBurstCntMin); - A_DEBUG((" a2dpDataRespTimeout : %d\r\n"), - pParamsCmd->info.a2dpParams.a2dpDataRespTimeout); - }while (FALSE); - } - - /* adjust control action for BT_PARAMS_SCO control action */ - if ((pActionMsg->IndicationForControlAction == ATH_BT_SCO) || - (pActionMsg->IndicationForControlAction == ATH_BT_ESCO)) - { - do { - pParamsCmd = - (WMI_SET_BT_PARAMS_CMD *)(pActionMsg->ControlAction.Buffer); - - if (pParamsCmd->paramType != BT_PARAM_SCO) { - /* only modify SCO params */ - break; - } - - if ((pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO) && - (pInfo->SCOConnectInfo.Valid)) { - A_UCHAR scoSlots; - pInfo->SCOConnectInfo.Valid = FALSE; - /* decode packet length to get packet type */ - if (pInfo->SCOConnectInfo.TxPacketLength <= 30) { - /* EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 60) { - /* 2-EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 90) { - /*3-EV3 */ - scoSlots = 1; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 120) { - /* EV4: */ - scoSlots = 3; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 180) { - /* EV5: */ - scoSlots = 3; - } else if (pInfo->SCOConnectInfo.TxPacketLength <= 360) { - /* 2-EV5 */ - scoSlots = 3; - } else { - /* 3-EV5 */ - scoSlots = 3; - } - - /* account for RX/TX */ - scoSlots *= 2; - pParamsCmd->info.scoParams.noSCOSlots = scoSlots; - - if (pInfo->SCOConnectInfo.TransmissionInterval >= scoSlots) { - pParamsCmd->info.scoParams.noIdleSlots = - pInfo->SCOConnectInfo.TransmissionInterval - scoSlots; - } else { - A_DEBUG(("Invalid scoSlot, got:%d, transInt: %d\n"), - scoSlots, - pInfo->SCOConnectInfo.TransmissionInterval); - } - } else { - /* legacy SCO */ - pParamsCmd->info.scoParams.noSCOSlots = 2; - pParamsCmd->info.scoParams.noIdleSlots = 4; - } - - A_DEBUG(("ATHBT: BT PARAMS SCO adjustment (%s) \n"), - pInfo->SCOConnectInfo.LinkType == BT_LINK_TYPE_ESCO ? "eSCO":"SCO"); - A_DEBUG((" numScoCyclesForceTrigger : %d \n"), - pParamsCmd->info.scoParams.numScoCyclesForceTrigger); - A_DEBUG((" dataResponseTimeout : %d \n"), - pParamsCmd->info.scoParams.dataResponseTimeout); - A_DEBUG((" stompScoRules : %d \n"), - pParamsCmd->info.scoParams.stompScoRules); - A_DEBUG((" stompDutyCyleVal : %d \n"), - pParamsCmd->info.scoParams.stompDutyCyleVal); - A_DEBUG((" psPollLatencyFraction : %d \n"), - pParamsCmd->info.scoParams.psPollLatencyFraction); - A_DEBUG((" noSCOSlots : %d \n"), - pParamsCmd->info.scoParams.noSCOSlots); - A_DEBUG((" noIdleSlots : %d \n"), - pParamsCmd->info.scoParams.noIdleSlots); - } while (FALSE); - } - } -} - -static void -BtStateActionProper(ATHBT_FILTER_INFO *pInfo, - ATHBT_STATE_INDICATION Indication, ATHBT_STATE State) -{ - A_COND_OBJECT *hWait = NULL; - BT_ACTION_MSG *pActionMsg; - DL_LIST *pListEntry; - BT_CONTROL_ACTION_ITEM *pBtControlAction; - int queued = 0; - - A_LOCK_FILTER(pInfo); - - pBtControlAction = FCore_GetControlAction(&pInfo->FilterCore, - Indication, - State, - NULL); - - A_DEBUG("[%s], Indication =%d, state=%d,ControlAction.Length=%d\n", - __FUNCTION__, Indication, State, - ( (pBtControlAction == NULL)? 0 : pBtControlAction->ControlAction.Length)); - - while (pBtControlAction != NULL) { - /* allocate an action message */ - pListEntry = DL_ListRemoveItemFromHead(&pInfo->FreeActionMsgList); - - if (NULL == pListEntry) { - A_DEBUG("action messages exhausted\n"); - break; - } - - pActionMsg = A_CONTAINING_STRUCT(pListEntry, BT_ACTION_MSG, - ListEntry); - - /* save state for later flushing */ - pActionMsg->StateForControlAction = State; - pActionMsg->IndicationForControlAction = Indication; - - /* we need to buffer the control actions */ - A_MEMCPY(&pActionMsg->ControlAction, - &pBtControlAction->ControlAction, - sizeof(pActionMsg->ControlAction)); - - /* When is it ever set to blocking TODO */ - if (pActionMsg->Blocking) { - /* this is the action to wait on */ - hWait = &pActionMsg->hWaitEvent; - A_COND_RESET(hWait); - } - /* allow for adjustments to the control action beyond the defaults */ - AdjustBtControlAction(pInfo, pActionMsg); - - /* queue action */ - QUEUE_BT_ACTION_MSG(pInfo, pActionMsg); - queued++; - - /* get the next action using the current one as a starter */ - pBtControlAction = FCore_GetControlAction(&pInfo->FilterCore, - Indication, - State, - pBtControlAction); - } - - A_UNLOCK_FILTER(pInfo); - - if (queued > 0) { - /* wake thread to process all the queued up actions */ - A_MUTEX_LOCK(&pInfo->hWakeEventLock); - A_COND_SIGNAL(&pInfo->hWakeEvent); - A_MUTEX_UNLOCK(&pInfo->hWakeEventLock); - } - - /* check if we need to block until the dispatch thread issued the - * last action if the adapter becomes unavailable we cannot block - * the thread (queue will stall), so only block if the adapter is - * available and use a reasonable timeout - */ - if (hWait) { - A_COND_WAIT(hWait, &pInfo->CritSection, ACTION_WAIT_TIMEOUT); - } -} - -static void DoBtStateAction(ATHBT_FILTER_INFO *pInfo, ATHBT_STATE_INDICATION Indication, ATHBT_STATE State) -{ - A_UINT32 bitmap = FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore); - - if ((Indication == ATH_BT_INQUIRY) && (State == STATE_ON)) { - int i; - for (i=0; iShutdown) { - return; - } - - /* - * the filter state machine needs to be protected in case the HCI layer - * can process commands and events in an unserialize manner - */ - A_LOCK_FILTER(pInfo); - - if (Type == ATHBT_HCI_COMMAND) { - A_DUMP_BUFFER(pBuffer, Length, "BT HCI Command"); - indication = FCore_FilterBTCommand(&pInfo->FilterCore, pBuffer, - Length, &state); - } else { - A_DUMP_BUFFER(pBuffer, Length, "BT HCI Event"); - indication = FCore_FilterBTEvent(&pInfo->FilterCore, pBuffer, - Length, &state); - /* check SCO and ESCO connection events */ - if ((indication == ATH_BT_SCO) || (indication == ATH_BT_ESCO)) { - if (HCI_GET_EVENT_CODE(pBuffer) == HCI_EVT_SCO_CONNECT_COMPLETE) { - A_DEBUG(("SCO_CONNECT_COMPLETE (%s)\n"), - (state == STATE_ON) ? "ON" : "OFF"); - if (state == STATE_ON) { - /* save these off for the BT Action adjustment */ - pInfo->SCOConnectInfo.LinkType = - GET_BT_CONN_LINK_TYPE(pBuffer); - pInfo->SCOConnectInfo.TransmissionInterval = - GET_TRANS_INTERVAL(pBuffer); - pInfo->SCOConnectInfo.RetransmissionInterval = - GET_RETRANS_INTERVAL(pBuffer); - pInfo->SCOConnectInfo.RxPacketLength = - GET_RX_PKT_LEN(pBuffer); - pInfo->SCOConnectInfo.TxPacketLength = - GET_TX_PKT_LEN(pBuffer); - A_DEBUG(("ATHBT: SCO conn info (%d, %d, %d, %d, %d))\n"), - pInfo->SCOConnectInfo.LinkType, - pInfo->SCOConnectInfo.TransmissionInterval, - pInfo->SCOConnectInfo.RetransmissionInterval, - pInfo->SCOConnectInfo.RxPacketLength, - pInfo->SCOConnectInfo.TxPacketLength); - /* now valid */ - pInfo->SCOConnectInfo.Valid = TRUE; - } else { - /* disconnected, invalidate */ - pInfo->SCOConnectInfo.Valid = FALSE; - } - } - } - } - - A_UNLOCK_FILTER(pInfo); - - if (indication == ATH_BT_NOOP) { - return; - } - - A_DEBUG(("New Indication :%d State:%s (map:0x%X)\n"), - indication, (state == STATE_ON) ? "ON" : "OFF", - FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore)); - - if (pInfo->AdapterAvailable) { - DoBtStateAction(pInfo, indication, state); - } -} - -static ATHBT_STATE_INDICATION -IndicateA2DP(ATHBT_FILTER_INFO *pInfo, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - unsigned char *pACLBuffer) -{ - A_ERR("[%s] Not yet implemented\n", __FUNCTION__); - - return ATH_BT_NOOP; /* TODO */ -} - -static void -AthFilterAclDataOutCallback(void *pContext, unsigned char *pBuffer, int Length) -{ - ATHBT_STATE_INDICATION indication; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pContext; - ATHBT_STATE state; - - if (pInfo->Shutdown) { - return; - } - - A_LOCK_FILTER(pInfo); - - indication = FCore_FilterACLDataOut(&pInfo->FilterCore, - pBuffer, - Length, - &state); - - if (indication == ATH_BT_A2DP) { - indication = IndicateA2DP(pInfo, - ATH_BT_A2DP, - state, - pBuffer); - } - - A_UNLOCK_FILTER(pInfo); - - if (indication == ATH_BT_NOOP) { - return; - } - - A_DEBUG(("New Indication :%d State:%s (map:0x%X)\n"), - indication, (state == STATE_ON) ? "ON" : "OFF", - FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore)); - - if (pInfo->AdapterAvailable) { - DoBtStateAction(pInfo, indication, state); - } - -} - -static void -AthFilterAclDataInCallback(void *pContext, unsigned char *pBuffer, int Length) -{ - ATHBT_STATE_INDICATION indication; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pContext; - ATHBT_STATE state; - - if (pInfo->Shutdown) { - return; - } - - A_LOCK_FILTER(pInfo); - - indication = FCore_FilterACLDataIn(&pInfo->FilterCore, - pBuffer, - Length, - &state); - - if (indication == ATH_BT_A2DP) { - indication = IndicateA2DP(pInfo, - ATH_BT_A2DP, - state, - pBuffer); - } - - A_UNLOCK_FILTER(pInfo); - - if (indication == ATH_BT_NOOP) { - return; - } - - A_DEBUG(("New Indication :%d State:%s (map:0x%X)\n"), - indication, (state == STATE_ON) ? "ON" : "OFF", - FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore)); - - if (pInfo->AdapterAvailable) { - DoBtStateAction(pInfo, indication, state); - } -} - -static void -AthFilterIndicateStateCallback(void *pContext, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, unsigned char LMPVersion) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pContext; - ATHBT_STATE newState; - - if (pInfo->Shutdown) { - return; - } - - A_LOCK_FILTER(pInfo); - Indication = FCore_FilterIndicatePreciseState(&pInfo->FilterCore, - Indication, State, &newState); - A_UNLOCK_FILTER(pInfo); - - if (Indication == ATH_BT_NOOP) { - return; - } - - A_DEBUG(("New Indication :%d State:%s (map:0x%X) \r\n"), - Indication, (newState == STATE_ON) ? "ON" : "OFF", - FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore)); - - if ((newState == STATE_ON) && (LMPVersion < 5)) { - pInfo->LMPVersion = LMPVersion; - } - - if (pInfo->AdapterAvailable) { - DoBtStateAction(pInfo, Indication, newState); - } -} - -static void * -FilterThread(void *pContext) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pContext; - - A_INFO("Starting the BT Filter task\n"); - while (1) { - /* Wait to be woken up the BT thread */ - A_MUTEX_LOCK(&pInfo->hWakeEventLock); - A_COND_WAIT(&pInfo->hWakeEvent, &pInfo->hWakeEventLock, WAITFOREVER); - A_MUTEX_UNLOCK(&pInfo->hWakeEventLock); - - if (pInfo->AdapterAvailable) { - ProcessBTActionMessages(pInfo, BTACTION_QUEUE_NORMAL, ATH_BT_NOOP); - } - - if (pInfo->Shutdown) { - /* - * before we exit we need to counter-act the coexistence - * settings. Currently we just indicate that each state is now - * OFF (if they are ON). This state synchronization is typically - * required on HOT-removable BT adapters or where the low level - * adapter can be surprise removed before the BT stack can clean - * up HCI connections and states - */ - if (pInfo->AdapterAvailable) { - int indication, newIndication; - ATHBT_STATE newState; - - /* - * the BT adapter is going away, indicate that all indications - * are now in the OFF state, this may queue up control action - * messages, which is okay - */ - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; - indication++) - { - A_LOCK_FILTER(pInfo); - newIndication = - FCore_FilterIndicatePreciseState(&pInfo->FilterCore, - indication, STATE_OFF, &newState); - A_UNLOCK_FILTER(pInfo); - - if (newIndication == ATH_BT_NOOP) { - continue; - } - - DoBtStateAction(pInfo, indication, newState); - } - - /* issue control actions */ - ProcessBTActionMessages(pInfo, BTACTION_QUEUE_SYNC_STATE, - ATH_BT_NOOP); - } - - break; - } - } - - A_INFO("Terminating the BT Filter task\n"); - return NULL; -} - -static void -ProcessBTActionMessages(ATHBT_FILTER_INFO *pInfo, - BTACTION_QUEUE_PROC Process, - ATHBT_STATE_INDICATION StateToFlush) -{ - BT_ACTION_MSG *pActionMsg = NULL; - DL_LIST *pListEntry = NULL; - - A_LOCK_FILTER(pInfo); - - while (1) { - /* determine how we want to pull the message out */ - if (BTACTION_QUEUE_FLUSH_STATE == Process) { - if (NULL == pListEntry) { - /* first time through */ - if (!DL_LIST_IS_EMPTY(&pInfo->BTActionMsgList)) { - /* get the entry at the head of the list , don't remove */ - pListEntry = - DL_LIST_GET_ITEM_AT_HEAD(&pInfo->BTActionMsgList); - } - } else { - /* move onto the next one */ - pListEntry = pListEntry->pNext; - if (pListEntry == &pInfo->BTActionMsgList) { - /* reached the end */ - pListEntry = NULL; - } - } - } else { - /* - * for all others we are removing items from the head of the - * queue - */ - pListEntry = DL_ListRemoveItemFromHead(&pInfo->BTActionMsgList); - } - - if (NULL == pListEntry) { - /* queue was empty */ - break; - } - - pActionMsg = A_CONTAINING_STRUCT(pListEntry, BT_ACTION_MSG, ListEntry); - - /* now determine what to do with the message that was found */ - switch (Process) { - case BTACTION_QUEUE_FLUSH_STATE: - /* - * caller wants to just flush action messages matching a - * state - */ - if (pActionMsg->StateForControlAction == StateToFlush) { - A_DEBUG(("Removed action for state=%d from queue\n"), - StateToFlush); - - /* remove from list, it will get freed below */ - DL_ListRemove(&pActionMsg->ListEntry); - - /* - * this would re-start the scan to the head of the list - * each time we found one. This type of flush doesn't - * happen very often so restarting from the head of the - * list and rescanning isn't time consuming - */ - pListEntry = NULL; - } else { - /* not the one we are interested in */ - pActionMsg = NULL; - } - break; - - case BTACTION_QUEUE_NORMAL: - case BTACTION_QUEUE_SYNC_STATE: - /* issue/execute actions */ - A_UNLOCK_FILTER(pInfo); - A_DEBUG(("Processing action for indication=%d (%s) (%s)\n"), - pActionMsg->IndicationForControlAction, - (pActionMsg->StateForControlAction == STATE_ON) ? - "ON" : "OFF", (BTACTION_QUEUE_SYNC_STATE == Process) ? - "Sync State" : "Normal"); - - if (BTACTION_QUEUE_SYNC_STATE == Process) { - /* let's not issue these too fast ... */ - usleep(10000); - } - - ExecuteBtAction(pInfo, pActionMsg); - - if (pActionMsg->Blocking) { - pActionMsg->Blocking = FALSE; - - /* set the event to unblock the caller */ - A_MUTEX_LOCK(&pActionMsg->hWaitEventLock); - A_COND_SIGNAL(&pActionMsg->hWaitEvent); - A_MUTEX_UNLOCK(&pActionMsg->hWaitEventLock); - } - A_LOCK_FILTER(pInfo); - break; - - case BTACTION_QUEUE_FLUSH_ALL: - A_DEBUG(("Flushed action for state=%d from queue\n"), - pActionMsg->StateForControlAction); - /* - * nothing to do here, the action message will get - * recycled below - */ - break; - - default: - break; - } - - if (pActionMsg) { - /* recycle message */ - FREE_BT_ACTION_MSG(pInfo, pActionMsg); - } - } - - A_UNLOCK_FILTER(pInfo); -} - -static void -SyncBTState(ATHBT_FILTER_INFO *pInfo) -{ - int stateIndication; - A_UINT32 stateBitMap; - - A_LOCK_FILTER(pInfo); - stateBitMap = FCore_GetCurrentBTStateBitMap(&pInfo->FilterCore); - A_UNLOCK_FILTER(pInfo); - - /* - * the state bit map is a simple STATE ON/OFF bit map, if we detect - * that one of the states is ON we process the BT action to synchronize - * the WLAN side with the BT radio state - */ - for (stateIndication = 0; stateIndication < ATH_BT_MAX_STATE_INDICATION; - stateIndication++) - { - if (stateBitMap & (1 << stateIndication)) { - /* this state is ON */ - DoBtStateAction(pInfo, stateIndication, STATE_ON); - } - } - -} - -void -HandleAdapterEvent(ATHBT_FILTER_INFO *pInfo, ATH_ADAPTER_EVENT Event) -{ - A_UINT32 btfiltFlags; - switch (Event) { - case ATH_ADAPTER_ARRIVED: - A_INFO("BT Filter Core : WLAN Arrived \n"); - btfiltFlags = pInfo->Flags; - Abf_WlanCheckSettings(pInfo->pWlanInfo->IfName, &btfiltFlags); - if (btfiltFlags != pInfo->Flags) { - A_STATUS status; - BT_FILTER_CORE_INFO *pCoreInfo = &pInfo->FilterCore; - pInfo->Flags &= ~ABF_WIFI_CHIP_IS_VENUS; - pInfo->Flags |= (btfiltFlags & ABF_WIFI_CHIP_IS_VENUS); - pCoreInfo->FilterState.btFilterFlags &= ~ABF_WIFI_CHIP_IS_VENUS; - pCoreInfo->FilterState.btFilterFlags |= (btfiltFlags & ABF_WIFI_CHIP_IS_VENUS); - FCore_ResetActionDescriptors(pCoreInfo); - GetActionStringOverrides(pInfo); - status = FCore_RefreshActionList(pCoreInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed refresh action list (status:%d)\n", - __FUNCTION__, status); - } - } - - pInfo->AdapterAvailable = TRUE; - - Abf_WlanIssueFrontEndConfig(pInfo); - - Abf_WlanGetCurrentWlanOperatingFreq(pInfo); - /* sync BT state */ - SyncBTState(pInfo); - -#if 0 - /* - * the call to sync BT state may queue a bunch of actions to - * the action queue, we want to issues these differently - */ - ProcessBTActionMessages(pInfo, BTACTION_QUEUE_SYNC_STATE, - ATH_BT_NOOP); -#endif - break; - - case ATH_ADAPTER_REMOVED: - A_INFO("BT Filter Core : WLAN removed \n"); - pInfo->AdapterAvailable = FALSE; - - /* flush messages */ - ProcessBTActionMessages(pInfo, BTACTION_QUEUE_FLUSH_ALL, - ATH_BT_NOOP); - break; - default: - break; - } -} - -/* execute the BT action - * this function is called by the single dispatcher thread - */ -static void -ExecuteBtAction(ATHBT_FILTER_INFO *pInfo, BT_ACTION_MSG *pBtActionMsg) -{ - A_UINT32 size; - A_UINT32 controlCode; - A_STATUS status; - - - if(pInfo->Flags & ABF_WIFI_CHIP_IS_VENUS) { - if (pBtActionMsg->ControlAction.Type == BT_CONTROL_ACTION_STATUS) { - /* this action issues a STATUS OID command */ - controlCode = AR6000_XIOCTL_WMI_SET_BT_OPERATING_STATUS; - size = sizeof(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD); - } else { - if(pBtActionMsg->IndicationForControlAction == ATH_BT_SCO || - pBtActionMsg->IndicationForControlAction == ATH_BT_ESCO) - { - controlCode = AR6000_XIOCTL_WMI_SET_BTCOEX_SCO_CONFIG; - size = sizeof(WMI_SET_BTCOEX_SCO_CONFIG_CMD); - } - if(pBtActionMsg->IndicationForControlAction == ATH_BT_A2DP){ - controlCode = AR6000_XIOCTL_WMI_SET_BTCOEX_A2DP_CONFIG; - size = sizeof(WMI_SET_BTCOEX_A2DP_CONFIG_CMD); - } - } - }else { - if (pBtActionMsg->ControlAction.Type == BT_CONTROL_ACTION_STATUS) { - /* this action issues a STATUS OID command */ - controlCode = AR6000_XIOCTL_WMI_SET_BT_STATUS; - } else { - /* this action issues a PARAMS OID command */ - controlCode = AR6000_XIOCTL_WMI_SET_BT_PARAMS; - } - size = sizeof(WMI_SET_BT_PARAMS_CMD); - } - if (pBtActionMsg->ControlAction.Length > size) { - A_ERR("Bad control action length : %d \n", pBtActionMsg->ControlAction.Length); - return; - } - do - { - A_UCHAR buf[sizeof(A_UINT32) + size]; - - A_MEMZERO(buf, sizeof(buf)); - A_MEMCPY(buf, &controlCode, sizeof(A_UINT32)); - A_MEMCPY((buf + sizeof(A_UINT32)), (void *)pBtActionMsg->ControlAction.Buffer, - pBtActionMsg->ControlAction.Length); - status = Abf_WlanDispatchIO(pInfo, AR6000_IOCTL_EXTENDED, (void *)buf, - pBtActionMsg->ControlAction.Length + sizeof(A_UINT32)); - - if (A_FAILED(status)) { - /* these can actually fail if the device powers down */ - A_ERR("[%s] BT Action issue failed, Ioctl: 0x%x, Len: %d\n", - __FUNCTION__, ((int *)buf)[0], - pBtActionMsg->ControlAction.Length); - } else { - A_DEBUG("BT Action issued to WLAN Adapter, Ioctl: 0x%x, Len: %d\n", - ((int *)buf)[0], pBtActionMsg->ControlAction.Length); - A_DUMP_BUFFER(pBtActionMsg->ControlAction.Buffer, - pBtActionMsg->ControlAction.Length, - "BT Control Action"); - } - }while(FALSE); -} - -static void -ProcessActionOverride(ATHBT_FILTER_INFO *pInfo, - A_CHAR *pIndicationStr, - A_CHAR *pModifyAction, - A_CHAR *pAction) -{ - int i; - ATHBT_STATE_INDICATION indication; - ATHBT_STATE state = STATE_MAX; - ATHBT_MODIFY_CONTROL_ACTION modifyAction = - ATHBT_MODIFY_CONTROL_ACTION_NOOP; - char charBuffer[MAX_VAL_DATA_LENGTH]; - - /* - * parse the indication string to figure which indication and state - * to change i.e. -ON or -OFF - */ - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; - indication++) - { - if (strstr(pIndicationStr, g_IndicationStrings[indication]) != NULL) { - /* found one */ - if (strstr(pIndicationStr, "-ON") != NULL) { - state = STATE_ON; - } - - if (strstr(pIndicationStr, "-OFF") != NULL) { - state = STATE_OFF; - } - - if (strstr(pModifyAction, "REPLACE") != NULL) { - modifyAction = ATHBT_MODIFY_CONTROL_ACTION_REPLACE; - } - - if (strstr(pModifyAction, "APPEND") != NULL) { - modifyAction = ATHBT_MODIFY_CONTROL_ACTION_APPEND; - } - - break; - } - } - - if ((indication == ATH_BT_MAX_STATE_INDICATION) || - (state == STATE_MAX) || - (modifyAction == ATHBT_MODIFY_CONTROL_ACTION_NOOP)) - { - return; - } - - A_DEBUG("Found Action override : %s (%s) (%s)\n", - pIndicationStr, pModifyAction, pAction); - - A_MEMZERO(charBuffer, sizeof(charBuffer)); - - for (i = 0; (i < (int)strlen(pAction)) && (i < (MAX_VAL_DATA_LENGTH - 1)); - i++) - { - charBuffer[i] = (char)pAction[i]; - } - - FCore_ModifyControlActionString(&pInfo->FilterCore, - indication, - state, - charBuffer, - i, - modifyAction); -} - -static void -GetActionStringOverrides(ATHBT_FILTER_INFO *pInfo) -{ - A_CHAR *ptr, *indication, *modify, *action; - A_CHAR *string = (A_CHAR *)A_MALLOC(MAX_VAL_DATA_LENGTH); - - if (!(gConfigFile)) return; - - fgets(string, MAX_VAL_DATA_LENGTH, gConfigFile); - while (!(feof(gConfigFile))) { - ptr = string; - indication = strsep(&string, ":"); - modify = strsep(&string, ":"); - action = string; - ProcessActionOverride(pInfo, indication, modify, action); - string = ptr; - fgets(string, MAX_VAL_DATA_LENGTH, gConfigFile); - } - - A_FREE(string); -} diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_int.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_int.h deleted file mode 100644 index a8e51e27e93f..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_int.h +++ /dev/null @@ -1,281 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Author(s): ="Atheros" -//============================================================================== - -/* - * Bluetooth filter internal definitions - * - */ - - -#ifndef ABTFILT_INT_H_ -#define ABTFILT_INT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "a_config.h" -#include "a_osapi.h" -#include "athdefs.h" -#include "a_types.h" -#include "a_debug.h" -#include "dl_list.h" -#include "athbtfilter.h" -#include "btfilter_core.h" -#include "athdrv_linux.h" -#include "wmi.h" - -#ifndef IW_EV_LCP_PK_LEN -#define IW_EV_LCP_PK_LEN (4) -#define IW_EV_POINT_PK_LEN (IW_EV_LCP_PK_LEN + 4) -#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \ - (char *) NULL) -#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \ - IW_EV_POINT_OFF) -#endif - -/* Forward Declarations */ -struct _ABF_BT_INFO; -struct _ABF_WLAN_INFO; - -/*-----------------------------------------------------------------------*/ -/* Utils Section */ - -/* Task Management operations and definitions */ -#define WAITFOREVER -1 -#define A_TASK_HANDLE pthread_t -#define A_COND_OBJECT pthread_cond_t -#define A_MUTEX_OBJECT pthread_mutex_t -#define A_FILE_HANDLE FILE * - -/* Function Prototypes */ -INLINE A_STATUS A_TASK_CREATE(A_TASK_HANDLE *handle, - void *(*func)(void *), void *arg); -INLINE A_STATUS A_TASK_JOIN(A_TASK_HANDLE *handle); -INLINE void A_TASK_CLEANUP(void); - -INLINE A_STATUS A_MUTEX_INIT(A_MUTEX_OBJECT *mutex); -INLINE void A_MUTEX_LOCK(A_MUTEX_OBJECT *mutex); -INLINE void A_MUTEX_UNLOCK(A_MUTEX_OBJECT *mutex); -INLINE void A_MUTEX_DEINIT(A_MUTEX_OBJECT *mutex); - -INLINE A_STATUS A_COND_INIT(A_COND_OBJECT *cond); -INLINE A_STATUS A_COND_WAIT(A_COND_OBJECT *cond, - A_MUTEX_OBJECT *mutex, int timeout); -INLINE void A_COND_SIGNAL(A_COND_OBJECT *cond); -INLINE void A_COND_DEINIT(A_COND_OBJECT *cond); -INLINE A_STATUS A_COND_RESET(A_COND_OBJECT *cond); - -INLINE void A_STR2ADDR(const char *str, A_UINT8 *addr); - -#ifdef ABF_DEBUG -INLINE void A_DBG_INIT(const char *ident, const char *message, ...); -INLINE void A_DEBUG(const char *format, ...); -INLINE void A_INFO(const char *format, ...); -INLINE void A_ERR(const char *format, ...); -INLINE void A_SET_DEBUG(int enable); -INLINE void A_DBG_DEINIT(void); -void A_DUMP_BUFFER(A_UCHAR *buffer, int length, char *pDescription); -void A_DBG_SET_OUTPUT_TO_CONSOLE(void); -#else -#define A_DBG_INIT(args...) -#define A_DEBUG(args...) -#define A_INFO(args...) -#define A_ERR(args...) -#define A_SET_DEBUG(arg) -#define A_DBG_DEINIT() -#define A_DUMP_BUFFER(buffer, length, pDescription) -#define A_DBG_SET_OUTPUT_TO_CONSOLE() - -#endif /* ABF_DEBUG */ -/*-----------------------------------------------------------------------*/ - -/*-----------------------------------------------------------------------*/ -/* Filter Section */ -#define MAX_BT_ACTION_MESSAGES 16 -#define ACTION_WAIT_TIMEOUT 100 - -#define QUEUE_BT_ACTION_MSG(p,a) \ - DL_ListInsertTail(&(p)->BTActionMsgList,&(a)->ListEntry) -#define FREE_BT_ACTION_MSG(p,a) \ - DL_ListInsertTail(&(p)->FreeActionMsgList,&(a)->ListEntry) - -#define A_LOCK_FILTER(p) \ - A_MUTEX_LOCK(&((p)->CritSection)) - -#define A_UNLOCK_FILTER(p) \ - A_MUTEX_UNLOCK(&((p)->CritSection)) - -typedef enum _BTACTION_QUEUE_PROC { - BTACTION_QUEUE_NORMAL = 0, /* normal processing of the action queue */ - BTACTION_QUEUE_FLUSH_ALL = 1, /* flush all actions for shutdown */ - BTACTION_QUEUE_FLUSH_STATE, /* flush all actions associated with a - specific state */ - BTACTION_QUEUE_SYNC_STATE /* issue queued actions when we are - syncing radio state on adapter - available */ -} BTACTION_QUEUE_PROC; - -typedef enum _ATH_ADAPTER_EVENT { - ATH_ADAPTER_ARRIVED = 0, - ATH_ADAPTER_REMOVED = 1, -} ATH_ADAPTER_EVENT; - -typedef struct _BT_ACTION_MSG { - DL_LIST ListEntry; - A_COND_OBJECT hWaitEvent; /* wait object for - blocking requests */ - A_MUTEX_OBJECT hWaitEventLock; - A_BOOL Blocking; /* this action requires - the calling thread to - block until the - dispatcher submits - the command */ - ATHBT_STATE_INDICATION IndicationForControlAction; /* indication - associated - with the - control - action */ - ATHBT_STATE StateForControlAction; - BT_CONTROL_ACTION ControlAction; -} BT_ACTION_MSG; - -typedef struct _ATHBT_SCO_CONNECTION_INFO { - A_BOOL Valid; - A_UCHAR LinkType; - A_UCHAR TransmissionInterval; - A_UCHAR RetransmissionInterval; - A_UINT16 RxPacketLength; - A_UINT16 TxPacketLength; -} ATHBT_SCO_CONNECTION_INFO; - -typedef struct _ATHBT_FILTER_INFO { - ATH_BT_FILTER_INSTANCE *pInstance; - A_UINT32 MaxBtActionMessages; - A_MUTEX_OBJECT CritSection; - DL_LIST BTActionMsgList; - DL_LIST FreeActionMsgList; - BT_FILTER_CORE_INFO FilterCore; - A_BOOL Shutdown; - A_COND_OBJECT hWakeEvent; - A_MUTEX_OBJECT hWakeEventLock; - A_TASK_HANDLE hFilterThread; - A_BOOL FilterThreadValid; - ATHBT_SCO_CONNECTION_INFO SCOConnectInfo; - A_UCHAR LMPVersion; - A_BOOL AdapterAvailable; - A_TASK_HANDLE hBtThread; - A_TASK_HANDLE hWlanThread; - struct _ABF_WLAN_INFO *pWlanInfo; - struct _ABF_BT_INFO *pBtInfo; - A_UCHAR SCOConnection_LMPVersion; /* lmp version of remote SCO device */ - A_UCHAR A2DPConnection_LMPVersion; /* lmp version of remote A2DP device */ - A_UCHAR SCOConnection_Role; /* role of remote SCO device */ - A_UCHAR A2DPConnection_Role; /* role of remote A2DP device */ - A_UINT32 Flags; -} ATHBT_FILTER_INFO; - -/* Function Prototypes */ -void HandleAdapterEvent(ATHBT_FILTER_INFO *pInfo, ATH_ADAPTER_EVENT Event); -/*-----------------------------------------------------------------------*/ - -/*-----------------------------------------------------------------------*/ -/* WLAN Section */ -#define WLAN_ADAPTER_NAME_SIZE_MAX 31 - -#define WLAN_GET_HOME_CHANNEL(pInfo) \ - (pInfo)->pAbfWlanInfo->Channel - -typedef struct _ABF_WLAN_INFO { - ATHBT_FILTER_INFO *pInfo; - A_INT32 Handle; - A_UINT8 PhyCapability; - A_UCHAR AdapterName[WLAN_ADAPTER_NAME_SIZE_MAX+1]; - A_UINT32 HostVersion; - A_UINT32 TargetVersion; - A_CHAR IfName[IFNAMSIZ]; - A_INT32 IfIndex; - A_BOOL Loop; - A_COND_OBJECT hWaitEvent; - A_MUTEX_OBJECT hWaitEventLock; - A_UINT16 Channel; -} ABF_WLAN_INFO; - -/* Function Prototypes */ -void Abf_WlanCheckSettings(A_CHAR *wifname, A_UINT32 *btfiltFlags); -A_STATUS Abf_WlanStackNotificationInit(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 flags); -void Abf_WlanStackNotificationDeInit(ATH_BT_FILTER_INSTANCE *pInstance); -A_STATUS Abf_WlanDispatchIO(ATHBT_FILTER_INFO *pInfo, unsigned long int req, - void *data, int size); -/*-----------------------------------------------------------------------*/ - -/* Function Prototypes */ - -#define ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION (1 << 0) -#define ABF_USE_HCI_FILTER_FOR_HEADSET_PROFILE (1 << 1) -#define ABF_WIFI_CHIP_IS_VENUS (1 << 2) -#define ABF_BT_CHIP_IS_ATHEROS (1 << 3) -#define ABF_USE_ONLY_DBUS_FILTERING (1 << 4) -#define ABF_FE_ANT_IS_SA (1 << 5) - -A_STATUS Abf_BtStackNotificationInit(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 Flags); -void Abf_BtStackNotificationDeInit(ATH_BT_FILTER_INSTANCE *pInstance); - -#ifdef CONFIG_NO_HCILIBS -#define Abf_HciLibInit(_flags) (A_ERROR) -#define Abf_HciLibDeInit() -#define Abf_RegisterToHciLib(_pInfo) -#define Abf_UnRegisterToHciLib(_pInfo) -#define Abf_IssueAFHViaHciLib(_pInfo, _ch) do { } while (0) -#else -A_STATUS Abf_HciLibInit(A_UINT32 *flags); -void Abf_HciLibDeInit(void); -void Abf_RegisterToHciLib(struct _ABF_BT_INFO * pAbfBtInfo); -void Abf_UnRegisterToHciLib(struct _ABF_BT_INFO * pAbfBtInfo); -A_STATUS Abf_IssueAFHViaHciLib (struct _ABF_BT_INFO * pAbfBtInfo, int CurrentWLANChannel); -#endif - -/* WLAN channel number can be expressed as either 1-14 or expressed in Mhz (i.e. 2412) */ -void IndicateCurrentWLANOperatingChannel(ATHBT_FILTER_INFO *pFilterInfo, int CurrentWLANChannel); - -/*-----------------------------------------------------------------------*/ - -A_STATUS Abf_WlanGetSleepState(ATHBT_FILTER_INFO * pInfo); -A_STATUS Abf_WlanGetCurrentWlanOperatingFreq(ATHBT_FILTER_INFO * pInfo); -A_STATUS Abf_WlanIssueFrontEndConfig(ATHBT_FILTER_INFO * pInfo); -#endif /* ABTFILT_INT_H_ */ diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_main.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_main.c deleted file mode 100644 index ceec73e8d4a2..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_main.c +++ /dev/null @@ -1,237 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Author(s): ="Atheros" -//============================================================================== - -/* - * Bluetooth Filter Main Routine - * - */ -#include "abtfilt_int.h" - -const char *progname; -A_CHAR wifname[IFNAMSIZ]; -static ATH_BT_FILTER_INSTANCE g_AthBtFilterInstance; -A_FILE_HANDLE gConfigFile; -static volatile sig_atomic_t terminated; -ATHBT_FILTER_INFO *GpInfo=NULL; -static void -usage(void) -{ - fprintf(stderr, "usage:\n%s [options] \n", progname); - fprintf(stderr, " -n : do not run as a daemon \n"); - fprintf(stderr, " -d : enable debug logging \n"); - fprintf(stderr, " -c : output debug logs to the console \n"); - fprintf(stderr, " -a : issue AFH channel classification when WLAN connects \n"); - fprintf(stderr, " -f : specify configuration file with overrides \n"); - fprintf(stderr, " -z : use HCI filtering for headset profile state notifications (Android-Only) \n"); - fprintf(stderr, " -x : co-located bt is Atheros \n"); - fprintf(stderr, " -w : wlan adapter name (wlan0/eth1, etc.)\n"); - fprintf(stderr, " -b : Use only d-bus filtering (on interfaces which doesnt support hciX\n"); - fprintf(stderr, " -s : Front End is single antenna (if not specified, its assumed to be dual antenna with atleast 25 dB of isolation)\n"); -} - -void -Abf_ShutDown(void) -{ - A_INFO("Shutting Down\n"); - - /* Clean up all the resources */ - Abf_BtStackNotificationDeInit(&g_AthBtFilterInstance); - Abf_WlanStackNotificationDeInit(&g_AthBtFilterInstance); - AthBtFilter_Detach(&g_AthBtFilterInstance); - - A_INFO("Shutting Down Complete\n"); -} - -static void -Abf_SigTerm(int sig) -{ - /* unblock main thread */ - terminated = 1; -} - -int -main(int argc, char *argv[]) -{ - int ret; - char *config_file = NULL; - int opt = 0, daemonize = 1, debug = 0, console_output=0; - progname = argv[0]; - A_STATUS status; - struct sigaction sa; - ATHBT_FILTER_INFO *pInfo; - A_UINT32 btfiltFlags = 0; - - A_MEMZERO(&g_AthBtFilterInstance, sizeof(ATH_BT_FILTER_INSTANCE)); - - /* - * Keep an option to specify the wireless extension. By default, - * assume it to be equal to WIRELESS_EXT TODO - */ - - /* Get user specified options */ - while ((opt = getopt(argc, argv, "bsvandczxf:w:")) != EOF) { - switch (opt) { - case 'n': - daemonize = 0; - break; - - case 'd': - debug = 1; - break; - - case 'f': - if (optarg) { - config_file = strdup(optarg); - } - break; - case 'c': - console_output = 1; - break; - case 'a': - btfiltFlags |= ABF_ENABLE_AFH_CHANNEL_CLASSIFICATION; - break; - case 'z': - btfiltFlags |= ABF_USE_HCI_FILTER_FOR_HEADSET_PROFILE; - break; - case 'v': - btfiltFlags |= ABF_WIFI_CHIP_IS_VENUS ; - A_DEBUG("wifi chip is venus\n"); - break; - case 'x': - btfiltFlags |= ABF_BT_CHIP_IS_ATHEROS ; - A_DEBUG("bt chip is atheros\n"); - break; - case 's': - btfiltFlags |= ABF_FE_ANT_IS_SA ; - A_DEBUG("Front End Antenna Configuration is single antenna \n"); - break; - case 'w': - memset(wifname, '\0', IFNAMSIZ); - strcpy(wifname, optarg); - g_AthBtFilterInstance.pWlanAdapterName = (A_CHAR *)&wifname; - break; - case 'b': - btfiltFlags |= ABF_USE_ONLY_DBUS_FILTERING; - break; - default: - usage(); - exit(1); - } - } - - /* Launch the daemon if desired */ - if (daemonize && daemon(0, console_output ? 1 : 0)) { - printf("Can't daemonize: %s\n", strerror(errno)); - exit(1); - } - - /* Initialize the debug infrastructure */ - A_DBG_INIT("ATHBT", "Ath BT Filter Daemon"); - if (debug) { - if (console_output) { - A_DBG_SET_OUTPUT_TO_CONSOLE(); - } - // setlogmask(LOG_INFO | LOG_DEBUG | LOG_ERR); - A_INFO("Enabling Debug Information\n"); - A_SET_DEBUG(1); - } - - if (config_file) { - A_DEBUG("Config file: %s\n", config_file); - if (!(gConfigFile = fopen(config_file, "r"))) - { - A_ERR("[%s] fopen failed\n", __FUNCTION__); - } - } - - A_MEMZERO(&sa, sizeof(struct sigaction)); - sa.sa_flags = SA_NOCLDSTOP; - sa.sa_handler = Abf_SigTerm; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - - sa.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &sa, NULL); - - Abf_HciLibInit(&btfiltFlags); - - /* Initialize the Filter core */ - do { - Abf_WlanCheckSettings(wifname, &btfiltFlags); - ret = AthBtFilter_Attach(&g_AthBtFilterInstance, btfiltFlags ); - if (ret) { - A_ERR("Filter initialization failed\n"); - break; - } - - /* Initialize the WLAN notification mechanism */ - status = Abf_WlanStackNotificationInit(&g_AthBtFilterInstance, btfiltFlags ); - if (A_FAILED(status)) { - AthBtFilter_Detach(&g_AthBtFilterInstance); - A_ERR("WLAN stack notification init failed\n"); - break; - } - - /* Initialize the BT notification mechanism */ - status = Abf_BtStackNotificationInit(&g_AthBtFilterInstance,btfiltFlags); - if (A_FAILED(status)) { - Abf_WlanStackNotificationDeInit(&g_AthBtFilterInstance); - AthBtFilter_Detach(&g_AthBtFilterInstance); - A_ERR("BT stack notification init failed\n"); - break; - } - - /* Check for errors on the return value TODO */ - pInfo = g_AthBtFilterInstance.pContext; - GpInfo = pInfo; - - A_DEBUG("Service running, waiting for termination .... \n"); - - /* wait for termination signal */ - while (!terminated) { - sleep(1); - } - } while(FALSE); - - /* Initiate the shutdown sequence */ - if(GpInfo != NULL) { - AthBtFilter_State_Off(GpInfo); - } - Abf_ShutDown(); - - Abf_HciLibDeInit(); - /* Shutdown */ - if (gConfigFile) { - fclose(gConfigFile); - } - - if (config_file) { - A_FREE(config_file); - } - - A_DEBUG("Service terminated \n"); - A_MEMZERO(&g_AthBtFilterInstance, sizeof(ATH_BT_FILTER_INSTANCE)); - A_DBG_DEINIT(); - - return 0; -} diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_utils.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_utils.c deleted file mode 100644 index 99b7bab6d3ae..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_utils.c +++ /dev/null @@ -1,320 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Author(s): ="Atheros" -//============================================================================== - -/* - * Bluetooth Filter utils - * - */ -static const char athId[] __attribute__ ((unused)) = "$Id: //depot/sw/releases/olca3.1-RC/host/tools/athbtfilter/bluez/abtfilt_utils.c#2 $"; - -#include "abtfilt_int.h" -#ifdef ANDROID -#include -#endif - -#ifdef ANDROID -#define LOG_TAGS "abtfilt" -#define A_LOG_INFO ANDROID_LOG_INFO -#define A_LOG_ERR ANDROID_LOG_ERROR -#define A_LOG_DEBUG ANDROID_LOG_DEBUG -#define A_VSYSLOG(level, msg, ap) __android_log_vprint(level, LOG_TAGS, msg, ap); -#define A_SYSLOG(level, msg, args...) __android_log_print(level, LOG_TAGS, msg, ##args); -#else -#define A_LOG_INFO LOG_INFO -#define A_LOG_ERR LOG_ERR -#define A_LOG_DEBUG LOG_DEBUG -#define A_VSYSLOG(level, msg, ap) vsyslog(LOG_ERR, msg, ap) -#define A_SYSLOG syslog -#endif - -/* Task specific operations */ -INLINE A_STATUS -A_TASK_CREATE(A_TASK_HANDLE *handle, void *(*func)(void *), void *arg) -{ - int ret; - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - ret = pthread_create(handle, &attr, func, arg); - if (ret) { - A_ERR("%s Failed: %d\n", __FUNCTION__, ret); - return A_ERROR; - } - - pthread_attr_destroy(&attr); - return A_OK; -} - -INLINE A_STATUS -A_TASK_JOIN(A_TASK_HANDLE *handle) -{ - int ret; - - ret = pthread_join(*handle, NULL); - if (ret) { - A_ERR("%s Failed: %d\n", __FUNCTION__, ret); - return A_ERROR; - } - - return A_OK; -} - -INLINE void -A_TASK_CLEANUP(void) -{ - pthread_exit(NULL); -} - -/* Mutual exclusion operations */ -INLINE A_STATUS -A_MUTEX_INIT(A_MUTEX_OBJECT *mutex) -{ - int ret; - - ret = pthread_mutex_init(mutex, NULL); - if (ret) { - A_ERR("%s Failed: %d\n", __FUNCTION__, ret); - return A_ERROR; - } - - return A_OK; -} - -INLINE void -A_MUTEX_LOCK(A_MUTEX_OBJECT *mutex) -{ - pthread_mutex_lock(mutex); -} - -INLINE void -A_MUTEX_UNLOCK(A_MUTEX_OBJECT *mutex) -{ - pthread_mutex_unlock(mutex); -} - -INLINE void -A_MUTEX_DEINIT(A_MUTEX_OBJECT *mutex) -{ - pthread_mutex_destroy(mutex); -} - -/* Conditional Variable operations */ -INLINE A_STATUS -A_COND_INIT(A_COND_OBJECT *cond) -{ - int ret; - - ret = pthread_cond_init(cond, NULL); - if (ret) { - A_ERR("%s Failed: %d\n", __FUNCTION__, ret); - return A_ERROR; - } - - return A_OK; -} - -INLINE A_STATUS -A_COND_WAIT(A_COND_OBJECT *cond, A_MUTEX_OBJECT *mutex, int timeout) -{ - int ret; - struct timespec ts; - - if (timeout != WAITFOREVER) { - /* TODO: support for values equal to or more than a second */ - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_nsec += (timeout * 1000000); - ret = pthread_cond_timedwait(cond, mutex, &ts); - } else { - ret = pthread_cond_wait(cond, mutex); - } - - if (ret) { - A_ERR("%s Failed: %d\n", __FUNCTION__, ret); - return A_ERROR; - } - - return A_OK; -} - -INLINE void -A_COND_SIGNAL(A_COND_OBJECT *cond) -{ - pthread_cond_signal(cond); -} - -INLINE void -A_COND_DEINIT(A_COND_OBJECT *cond) -{ - pthread_cond_destroy(cond); -} - -INLINE A_STATUS -A_COND_RESET(A_COND_OBJECT *cond) -{ - A_COND_DEINIT(cond); - return (A_COND_INIT(cond)); -} - -/* Debug Infrastructure */ -#ifdef ABF_DEBUG -static volatile int debug_enabled = 0; -int dump_console = 0; - -void A_DBG_SET_OUTPUT_TO_CONSOLE(void) -{ - dump_console = 1; -} - - -INLINE void -A_DBG_INIT(const char *ident, const char *message, ...) -{ - va_list ap; - - openlog(ident, LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON); - - va_start(ap, message); - A_VSYSLOG(A_LOG_INFO, message, ap); - va_end(ap); -} - -static void dump_to_console(const char *format, va_list args) -{ - char buffer[384]; - - vsprintf(buffer,format,args); - printf("%s", buffer); - -} - -INLINE void -A_DEBUG(const char *format, ...) -{ - va_list ap; - - if (!debug_enabled) - return; - - va_start(ap, format); - if (dump_console) { - dump_to_console(format,ap); - } else { - A_VSYSLOG(A_LOG_DEBUG, format, ap); - } - - va_end(ap); -} - -INLINE void -A_INFO(const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - if (dump_console) { - dump_to_console(format,ap); - } else { - A_VSYSLOG(A_LOG_INFO, format, ap); - } - va_end(ap); -} - -INLINE void -A_ERR(const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - if (dump_console) { - dump_to_console(format,ap); - } else { - A_VSYSLOG(A_LOG_ERR, format, ap); - A_SYSLOG(A_LOG_ERR, "Last Error: %s\n", strerror(errno)); - } - va_end(ap); -} - -INLINE void -A_SET_DEBUG(int enable) -{ - debug_enabled = enable; -} - -INLINE void -A_DBG_DEINIT(void) -{ - A_SET_DEBUG(0); - closelog(); -} - -void -A_DUMP_BUFFER(A_UCHAR *buffer, int length, char *pDescription) -{ - A_CHAR stream[60]; - int i; - int offset, count; - - if (!debug_enabled) { - return; - } - - A_DEBUG("<---------Dumping %d Bytes : %s ------>\n", length, pDescription); - - count = 0; - offset = 0; - for(i = 0; i < length; i++) { - sprintf(stream + offset, "%2.2X ", buffer[i]); - count ++; - offset += 3; - - if (count == 16) { - count = 0; - offset = 0; - A_DEBUG("[H]: %s\n", stream); - A_MEMZERO(stream, sizeof(stream)); - } - } - - if (offset != 0) { - A_DEBUG("[H]: %s\n", stream); - } - - A_DEBUG("<------------------------------------------------->\n"); -} -#endif /* ABF_DEBUG */ - -INLINE void -A_STR2ADDR(const char *str, A_UINT8 *addr) -{ - const char *ptr = str; - int i; - - for (i = 0; i < 6; i++) { - addr[i] = (A_UINT8) strtol(ptr, NULL, 16); - if (i != 5 && !(ptr = strchr(ptr, ':'))) { - ptr = ":00:00:00:00:00"; - } - ptr++; - } -} diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_wlan.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_wlan.c deleted file mode 100644 index 2b534c99c879..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/abtfilt_wlan.c +++ /dev/null @@ -1,836 +0,0 @@ - -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Bluetooth filter core action tables and action lookup -// -// Author(s): ="Atheros" -//============================================================================== -/* - * Bluetooth Filter - WLAN module - * - */ - -#include "abtfilt_int.h" -#ifdef ANDROID -#include "cutils/properties.h" -#endif - -/* Definitions */ -#define WLAN_EVENT_SIZE_MAX 1024 -#define IW_HEADER_TYPE_POINT 8 - -/* Function Prototypes */ -static void NewLinkEvent(ATH_BT_FILTER_INSTANCE *pInstance, - struct nlmsghdr *h, int len); -static void DelLinkEvent(ATH_BT_FILTER_INSTANCE *pInstance, - struct nlmsghdr *h, int len); -static void WirelessEvent(ATH_BT_FILTER_INSTANCE *pInstance, - char *data, int len); -static A_STATUS WirelessCustomEvent(ATH_BT_FILTER_INSTANCE *pInstance, - char *buf, int len); -static A_STATUS AcquireWlanAdapter(ABF_WLAN_INFO *pAbfWlanInfo); -static void ReleaseWlanAdapter(ABF_WLAN_INFO *pAbfWlanInfo); -static void *WlanEventThread(void *arg); -static A_STATUS GetAdapterInfo(ABF_WLAN_INFO *pAbfWlanInfo); - -/* APIs exported to other modules */ -A_STATUS -Abf_WlanStackNotificationInit(ATH_BT_FILTER_INSTANCE *pInstance, A_UINT32 flags) -{ - A_STATUS status; - ATHBT_FILTER_INFO *pInfo; - ABF_WLAN_INFO *pAbfWlanInfo; - - pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - if (pInfo->pWlanInfo) { - return A_OK; - } - - pAbfWlanInfo = (ABF_WLAN_INFO *)A_MALLOC(sizeof(ABF_WLAN_INFO)); - A_MEMZERO(pAbfWlanInfo,sizeof(ABF_WLAN_INFO)); - - A_MUTEX_INIT(&pAbfWlanInfo->hWaitEventLock); - A_COND_INIT(&pAbfWlanInfo->hWaitEvent); - A_MEMZERO(pAbfWlanInfo, sizeof(ABF_WLAN_INFO)); - pAbfWlanInfo->pInfo = pInfo; - pAbfWlanInfo->Loop = TRUE; - pInfo->pWlanInfo = pAbfWlanInfo; - - /* Spawn a thread which will be used to process events from WLAN */ - status = A_TASK_CREATE(&pInfo->hWlanThread, WlanEventThread, pAbfWlanInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to spawn a WLAN thread\n", __FUNCTION__); - return A_ERROR; - } - - A_INFO("WLAN Stack Notification init complete\n"); - - return A_OK; -} - -void -Abf_WlanStackNotificationDeInit(ATH_BT_FILTER_INSTANCE *pInstance) -{ - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_WLAN_INFO *pAbfWlanInfo = pInfo->pWlanInfo; - - if (!pAbfWlanInfo) return; - - /* Terminate and wait for the WLAN Event Handler task to finish */ - A_MUTEX_LOCK(&pAbfWlanInfo->hWaitEventLock); - if (pAbfWlanInfo->Loop) { - pAbfWlanInfo->Loop = FALSE; - A_COND_WAIT(&pAbfWlanInfo->hWaitEvent, &pAbfWlanInfo->hWaitEventLock, - WAITFOREVER); - } - A_MUTEX_UNLOCK(&pAbfWlanInfo->hWaitEventLock); - - /* Flush all the BT actions from the filter core */ - HandleAdapterEvent(pInfo, ATH_ADAPTER_REMOVED); - pInfo->pWlanInfo = NULL; - A_MUTEX_DEINIT(&pAbfWlanInfo->hWaitEventLock); - A_COND_DEINIT(&pAbfWlanInfo->hWaitEvent); - A_MEMZERO(pAbfWlanInfo, sizeof(ABF_WLAN_INFO)); - A_FREE(pAbfWlanInfo); - - A_INFO("WLAN Stack Notification de-init complete\n"); -} - -A_STATUS -Abf_WlanDispatchIO(ATHBT_FILTER_INFO *pInfo, unsigned long int req, - void *data, int size) -{ - int ret; - struct ifreq ifr; - char ifname[IFNAMSIZ], *ethIf; - ABF_WLAN_INFO *pAbfWlanInfo = pInfo->pWlanInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - - if (!pAbfWlanInfo->Handle) { - /* No adapter to issue ioctl on */ - return A_DEVICE_NOT_FOUND; - } - - /* Get the adpater name from command line if specified */ - if (pInstance->pWlanAdapterName != NULL) { - ethIf = pInstance->pWlanAdapterName; - } else { - if ((ethIf = getenv("NETIF")) == NULL) { - ethIf = pAbfWlanInfo->IfName; - } - } - /* Frame and issue the requested ioctl to the WLAN adapter */ - A_MEMZERO(ifname, IFNAMSIZ); - strcpy(ifname, ethIf); - strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); - ifr.ifr_data = (void *)data; - if ((ret = ioctl(pAbfWlanInfo->Handle, req, &ifr)) < 0) { - A_ERR("[%s] [%s] IOCTL (req:0x%X, data: 0x%X size:%d) call failed!: %d\n", - __FUNCTION__, ifr.ifr_name, req, (A_UINT32)ifr.ifr_data, size, ret); - return A_ERROR; - } - return A_OK; -} - -/* Internal functions */ -static void * -WlanEventThread(void *arg) -{ - int left, ret, sd; - struct timeval tv; - socklen_t fromlen; - struct nlmsghdr *h; - fd_set readfds, tempfds; - char buf[WLAN_EVENT_SIZE_MAX]; - struct sockaddr_nl from, local; - ABF_WLAN_INFO *pAbfWlanInfo = (ABF_WLAN_INFO *)arg; - ATHBT_FILTER_INFO *pInfo = pAbfWlanInfo->pInfo; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - A_STATUS status; - - A_INFO("Starting the WLAN Event Handler task\n"); - - A_INFO("Checking WLAN adapter on startup .. \n"); - - if (!pInstance->pWlanAdapterName) { - Abf_WlanCheckSettings(pAbfWlanInfo->IfName, NULL); - if (pAbfWlanInfo->IfName[0]) { - pAbfWlanInfo->IfIndex = if_nametoindex(pAbfWlanInfo->IfName); - } - } - status = AcquireWlanAdapter(pAbfWlanInfo); - - if (A_FAILED(status)) { - A_INFO("No WLAN adapter on startup (OKAY) \n"); - }else { - /* Communicate this to the Filter task */ - HandleAdapterEvent(pInfo, ATH_ADAPTER_ARRIVED); - A_INFO("WLAN Adapter Added\n"); - } - - - do { - sd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - if (sd < 0) { - A_ERR("[%s] socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE): %d\n", - __FUNCTION__, sd); - break; - } - - A_MEMZERO(&local, sizeof(struct sockaddr_nl)); - local.nl_family = AF_NETLINK; - local.nl_groups = RTMGRP_LINK; - if ((ret = bind(sd, (struct sockaddr *) &local, sizeof(local))) < 0) { - A_ERR("[%s] bind(netlink): %d\n", __FUNCTION__, ret); - close(sd); - break; - } - - FD_ZERO(&readfds); - FD_SET(sd, &readfds); - while (pAbfWlanInfo->Loop) { - A_MEMCPY(&tempfds, &readfds, sizeof(fd_set)); - tv.tv_sec = 1; - tv.tv_usec = 0; - ret = select(sd+1, &tempfds, NULL, NULL, &tv); - if ((ret < 0) && (errno != EINTR)) { - A_ERR("[%s] select failed: %d\n", __FUNCTION__, ret); - break; - } else if ((ret > 0) && (FD_ISSET(sd, &tempfds))) { - fromlen = sizeof(from); - do { - left = recvfrom(sd, buf, sizeof(buf), 0, - (struct sockaddr *) &from, &fromlen); - } while (left == -1 && errno == EINTR); - - if (left < 0) { - A_ERR("[%s] recvfrom(netlink)\n", __FUNCTION__); - continue; - // break; - } - - h = (struct nlmsghdr *) buf; - while (left >= sizeof(*h)) { - int len, plen; - - len = h->nlmsg_len; - plen = len - sizeof(*h); - if (len > left || plen < 0) { - A_ERR("[%s] malformed netlink message\n", __FUNCTION__); - continue; - } - - //A_DEBUG("RTM Message Type: %s\n", - // ((h->nlmsg_type == RTM_NEWLINK) ? - // "RTM_NEWLINK" : ((h->nlmsg_type == RTM_DELLINK) ? - // "RTM_DELLINK" : "RTM_OTHER"))); - switch (h->nlmsg_type) { - case RTM_NEWLINK: - NewLinkEvent(pInstance, h, plen); - break; - case RTM_DELLINK: - DelLinkEvent(pInstance, h, plen); - break; - default: - break; - } - - len = NLMSG_ALIGN(len); - left -= len; - h = (struct nlmsghdr *) ((char *) h + len); - } - } - } - - close(sd); - } while (FALSE); - - /* Clean up the resources allocated in this task */ - A_INFO("Terminating the WLAN Event Handler task\n"); - A_MUTEX_LOCK(&pAbfWlanInfo->hWaitEventLock); - pAbfWlanInfo->Loop = FALSE; - A_COND_SIGNAL(&pAbfWlanInfo->hWaitEvent); - A_MUTEX_UNLOCK(&pAbfWlanInfo->hWaitEventLock); - - return NULL; -} - -A_STATUS -Abf_WlanIssueFrontEndConfig(ATHBT_FILTER_INFO * pInfo) -{ - WMI_SET_BTCOEX_FE_ANT_CMD btcoexFeAntCmd; - WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD btcoexCoLocatedBtCmd; - A_UINT32 buf_fe_ant_cmd[sizeof(A_UINT32) + sizeof(WMI_SET_BTCOEX_FE_ANT_CMD)]; - A_UINT32 buf_co_located_bt_cmd[sizeof(A_UINT32) + sizeof(WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD)]; - A_STATUS status; - - /* Set co-located bt type to 1, generic for any PTA based bluetooth */ - buf_co_located_bt_cmd[0] = AR6000_XIOCTL_WMI_SET_BTCOEX_COLOCATED_BT_DEV; - - btcoexCoLocatedBtCmd.btcoexCoLocatedBTdev = 1; - A_MEMCPY(&buf_co_located_bt_cmd[1], (void *)&btcoexCoLocatedBtCmd, - sizeof(WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD)); - - status = Abf_WlanDispatchIO(pInfo, AR6000_IOCTL_EXTENDED, - (void *)buf_co_located_bt_cmd, - (sizeof(WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD) + sizeof(A_UINT32))); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to issue Co-located BT configuration\n", __FUNCTION__); - return A_ERROR; - } - - if(pInfo->Flags & ABF_FE_ANT_IS_SA) { - /* Indicate front end antenna configuration as single antenna */ - A_INFO("FLAGS = %x, Issue FE antenna configuration as single \n", pInfo->Flags); - btcoexFeAntCmd.btcoexFeAntType = WMI_BTCOEX_FE_ANT_SINGLE; - }else { - A_INFO("FLAGS = %x, Issue FE antenna configuration as dual \n", pInfo->Flags); - btcoexFeAntCmd.btcoexFeAntType = WMI_BTCOEX_FE_ANT_DUAL; - } - - buf_fe_ant_cmd[0] = AR6000_XIOCTL_WMI_SET_BTCOEX_FE_ANT; - - A_MEMCPY(&buf_fe_ant_cmd[1], (void *)&btcoexFeAntCmd, sizeof(WMI_SET_BTCOEX_FE_ANT_CMD)); - - - status = Abf_WlanDispatchIO(pInfo, AR6000_IOCTL_EXTENDED, - (void *)buf_fe_ant_cmd, - (sizeof(WMI_SET_BTCOEX_FE_ANT_CMD) + sizeof(A_UINT32))); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to issue FE ant configuration\n", __FUNCTION__); - return A_ERROR; - } - - return A_OK; - -} - -A_STATUS -Abf_WlanGetSleepState(ATHBT_FILTER_INFO * pInfo) -{ - /* setup ioctl cmd */ - A_UINT32 cmd = AR6000_XIOCTL_GET_WLAN_SLEEP_STATE; - - A_STATUS status = Abf_WlanDispatchIO(pInfo, AR6000_IOCTL_EXTENDED, - (void *)&cmd, - sizeof(A_UINT32)); - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to issue get WLAN sleep state\n", __FUNCTION__); - return A_ERROR; - } - - return A_OK; -} - -A_STATUS -Abf_WlanGetCurrentWlanOperatingFreq( ATHBT_FILTER_INFO * pInfo) -{ - A_STATUS status; - struct iwreq wrq; - char ifname[IFNAMSIZ], *ethIf; - ATH_BT_FILTER_INSTANCE *pInstance = pInfo->pInstance; - ABF_WLAN_INFO *pAbfWlanInfo = pInfo->pWlanInfo; - - /* Get the adpater name from command line if specified */ - if (pInstance->pWlanAdapterName != NULL) { - ethIf = pInstance->pWlanAdapterName; - } else { - if ((ethIf = getenv("NETIF")) == NULL) { - ethIf = pAbfWlanInfo->IfName; - } - } - A_MEMZERO(ifname, IFNAMSIZ); - strcpy(ifname, ethIf); - strncpy(wrq.ifr_name, ifname, sizeof(wrq.ifr_name)); - if ((status = ioctl(pAbfWlanInfo->Handle, SIOCGIWFREQ, &wrq)) < 0) { - return A_ERROR; - } - /*Freq is in Hz, converted into to MhZ */ - pAbfWlanInfo->Channel = (wrq.u.freq.m/100000); - - IndicateCurrentWLANOperatingChannel(pInfo, pAbfWlanInfo->Channel); - return status; -} - -static void -NewLinkEvent(ATH_BT_FILTER_INSTANCE *pInstance, struct nlmsghdr *h, int len) -{ - struct ifinfomsg *ifi; - struct rtattr * attr; - int attrlen, nlmsg_len, rta_len; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_WLAN_INFO *pAbfWlanInfo = (ABF_WLAN_INFO *)pInfo->pWlanInfo; - - if (len < sizeof(*ifi)) { - A_DEBUG("packet too short\n"); - return; - } - - ifi = NLMSG_DATA(h); - - nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg)); - - attrlen = h->nlmsg_len - nlmsg_len; - if (attrlen < 0) { - A_DEBUG("bad attrlen\n"); - return; - } - - attr = (struct rtattr *) (((char *) ifi) + nlmsg_len); - - rta_len = RTA_ALIGN(sizeof(struct rtattr)); - while (RTA_OK(attr, attrlen)) { - if (attr->rta_type == IFLA_WIRELESS) { - /* - * We need to ensure that the event is from the WLAN instance - * that we are interested in TODO - */ - WirelessEvent(pInstance, ((char*)attr) + rta_len, - attr->rta_len - rta_len); - } else if (attr->rta_type == IFLA_IFNAME) { - /* - * Shall be used to get the socket descriptor. Also we should do - * it only until we get the adapter we are interested in - */ - if (!pAbfWlanInfo->Handle) { - A_DEBUG("WLAN Adapter Interface: %s, Len: %d\n", - (((char *)attr) + rta_len), attr->rta_len - rta_len); - A_MEMCPY(pAbfWlanInfo->IfName, ((char *)attr + rta_len), - attr->rta_len - rta_len); - pAbfWlanInfo->IfIndex = if_nametoindex(pAbfWlanInfo->IfName); - } else if (ifi->ifi_change && pAbfWlanInfo->IfIndex == ifi->ifi_index) { - A_CHAR ifName[IFNAMSIZ]; - A_MEMCPY(ifName, ((char *)attr + rta_len), attr->rta_len - rta_len); - if (A_MEMCMP(pAbfWlanInfo->IfName, ifName, sizeof(ifName))!=0) { - A_MEMCPY(pAbfWlanInfo->IfName, ifName, sizeof(ifName)); - } - } - } - attr = RTA_NEXT(attr, attrlen); - } -} - -static void -DelLinkEvent(ATH_BT_FILTER_INSTANCE *pInstance, struct nlmsghdr *h, int len) -{ - A_BOOL found; - struct ifinfomsg *ifi; - struct rtattr * attr; - int attrlen, nlmsg_len, rta_len; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_WLAN_INFO *pAbfWlanInfo = (ABF_WLAN_INFO *)pInfo->pWlanInfo; - - if (!pAbfWlanInfo->Handle) return; - - if (len < sizeof(*ifi)) { - A_DEBUG("packet too short\n"); - return; - } - - ifi = NLMSG_DATA(h); - - nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg)); - - attrlen = h->nlmsg_len - nlmsg_len; - if (attrlen < 0) { - A_DEBUG("bad attrlen\n"); - return; - } - - attr = (struct rtattr *) (((char *) ifi) + nlmsg_len); - - rta_len = RTA_ALIGN(sizeof(struct rtattr)); - found = FALSE; - while (RTA_OK(attr, attrlen)) { - if (attr->rta_type == IFLA_IFNAME) { - /* - * Shall be used to get the socket descriptor. Also we should do - * it only until we get the adapter we are interested in - */ - if (!(strcmp(pAbfWlanInfo->IfName, ((char *)attr + rta_len)))) { - found = TRUE; - } - } - - attr = RTA_NEXT(attr, attrlen); - } - - if (!found) return; - - /* Flush all the BT actions from the filter core */ - HandleAdapterEvent(pInfo, ATH_ADAPTER_REMOVED); - - ReleaseWlanAdapter(pAbfWlanInfo); - - /* Reset the WLAN adapter specific info */ - A_MEMZERO(pAbfWlanInfo->AdapterName, WLAN_ADAPTER_NAME_SIZE_MAX); - pAbfWlanInfo->PhyCapability = 0; - - A_INFO("WLAN Adapter Removed\n"); -} - -static void -WirelessEvent(ATH_BT_FILTER_INSTANCE *pInstance, char *data, int len) -{ - A_STATUS status = A_OK; - struct iw_event iwe_buf, *iwe = &iwe_buf; - char *pos, *end, *custom, *buf; - - pos = data; - end = data + len; - - while ((pos + IW_EV_LCP_PK_LEN <= end) && (status == A_OK)) { - /* Event data may be unaligned, so make a local, aligned copy - * before processing. */ - A_MEMCPY(&iwe_buf, pos, IW_EV_LCP_LEN); - if (iwe->len <= IW_EV_LCP_LEN) { - status = A_ERROR; - break; - } - - custom = pos + IW_EV_POINT_LEN; - if (WIRELESS_EXT > 18 && - (iwe->cmd == IWEVMICHAELMICFAILURE || - iwe->cmd == IWEVCUSTOM || - iwe->cmd == IWEVASSOCREQIE || - iwe->cmd == IWEVASSOCRESPIE || - iwe->cmd == IWEVPMKIDCAND || - iwe->cmd == IWEVGENIE)) { - /* WE-19 removed the pointer from struct iw_point */ - char *dpos = (char *) &iwe_buf.u.data.length; - int dlen = dpos - (char *) &iwe_buf; - A_MEMCPY(dpos, pos + IW_EV_LCP_LEN, - sizeof(struct iw_event) - dlen); - } else { - A_MEMCPY(&iwe_buf, pos, sizeof(struct iw_event)); - custom += IW_EV_POINT_OFF; - } - - switch (iwe->cmd) { - case SIOCGIWAP: - break; - case IWEVCUSTOM: - if (custom + iwe->u.data.length > end) { - A_ERR("[%s:%d] Check Failed\n", __FUNCTION__, __LINE__); - status = A_ERROR; - break; - } - buf = A_MALLOC(iwe->u.data.length + 1); - if (buf == NULL) { - A_ERR("[%s:%d] Check Failed\n", __FUNCTION__, __LINE__); - status = A_ERROR; - break; - } - A_MEMCPY(buf, custom, iwe->u.data.length); - status = WirelessCustomEvent(pInstance, buf, iwe->u.data.length); - A_FREE(buf); - break; - case SIOCGIWSCAN: - break; - case SIOCSIWESSID: - break; - case IWEVGENIE: - if (custom + iwe->u.data.length > end || (iwe->u.data.length < 2)) { - A_ERR("event = IWEVGENIE with wrong length %d remain %d\n", - iwe->u.data.length, (end-custom)); - status = A_ERROR; - break; - } - buf = A_MALLOC(iwe->u.data.length + 1); - if (buf == NULL) { - A_ERR("[%s:%d] Check Failed\n", __FUNCTION__, __LINE__); - status = A_ERROR; - break; - } - A_MEMCPY(buf, custom, iwe->u.data.length); - status = WirelessCustomEvent(pInstance, buf, iwe->u.data.length); - A_FREE(buf); - break; - default: - break; - } - - pos += iwe->len; - } -} - -static A_STATUS -WirelessCustomEvent(ATH_BT_FILTER_INSTANCE *pInstance, char *buf, int len) -{ - char *ptr; - int length, i; - A_UINT16 eventid; - WMI_READY_EVENT *ev1; - WMI_CONNECT_EVENT *ev2; - WMI_REPORT_SLEEP_STATE_EVENT * ev3; - A_STATUS status = A_OK; - ATHBT_FILTER_INFO *pInfo = (ATHBT_FILTER_INFO *)pInstance->pContext; - ABF_WLAN_INFO *pAbfWlanInfo = pInfo->pWlanInfo; - - do { - eventid = *((A_UINT16 *)buf); - ptr = buf + 2; //Skip the event id - length = len - 2; - switch (eventid) { - case (WMI_READY_EVENTID): - if (length < sizeof(WMI_READY_EVENT)) { - A_ERR("[%s:%d] Check Failed\n", __FUNCTION__, __LINE__); - status = A_ERROR; - break; - } - ev1 = (WMI_READY_EVENT *)ptr; - A_MEMCPY(pAbfWlanInfo->AdapterName, ev1->macaddr, ATH_MAC_LEN); - pAbfWlanInfo->PhyCapability = ev1->phyCapability; - A_DEBUG("WMI READY: Capability: %d, Address: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", - pAbfWlanInfo->PhyCapability, - (pAbfWlanInfo->AdapterName[0]), - (pAbfWlanInfo->AdapterName[1]), - (pAbfWlanInfo->AdapterName[2]), - (pAbfWlanInfo->AdapterName[3]), - (pAbfWlanInfo->AdapterName[4]), - (pAbfWlanInfo->AdapterName[5])); - - /* - * Open a handle for the ioctls that will be issued later - * Try 10 times because the driver may not yet be ready to receive - * IOCTLs, so we give the driver time to get ready by looping here - */ - for (i = 0; i <= 10; i++) { - status = AcquireWlanAdapter(pAbfWlanInfo); - if (A_SUCCESS(status)) { - break; /* Break out of FOR loop, but not out of switch case statement */ - } - sleep(1); - } - - if (A_FAILED(status)) { - A_ERR("[%s] Failed to acquire WLAN adapter\n", __FUNCTION__); - break; - } - - /* Communicate this to the Filter task */ - HandleAdapterEvent(pInfo, ATH_ADAPTER_ARRIVED); - A_INFO("WLAN Adapter Added\n"); - break; - case (WMI_CONNECT_EVENTID): - if (length < sizeof(WMI_CONNECT_EVENT)) { - A_ERR("[%s:%d] Check Failed\n", __FUNCTION__, __LINE__); - status = A_ERROR; - break; - } - ev2 = (WMI_CONNECT_EVENT *)ptr; - pAbfWlanInfo->Channel = ev2->u.infra_ibss_bss.channel; - A_DEBUG("WMI CONNECT: Channel: %d\n", ev2->u.infra_ibss_bss.channel); - IndicateCurrentWLANOperatingChannel(pInfo, pAbfWlanInfo->Channel); - break; - case (WMI_DISCONNECT_EVENTID): - A_DEBUG("WMI DISCONNECT: %d\n", len); - IndicateCurrentWLANOperatingChannel(pInfo, 0); - break; - case (WMI_ERROR_REPORT_EVENTID): - A_DEBUG("WMI ERROR REPORT: %d\n", len); - break; - case (WMI_SCAN_COMPLETE_EVENTID): - A_DEBUG("WMI SCAN COMPLETE: %d\n", len); - break; - case (WMI_REPORT_SLEEP_STATE_EVENTID): - A_DEBUG("WMI_REPORT_SLEEP_STATE_EVENTID: %d\n", len); - if(length < sizeof(WMI_REPORT_SLEEP_STATE_EVENT)) { - A_ERR("[%s]Incorrect length passed - length = %d, len =%d\n", __FUNCTION__, length, len); - } - ev3 = (WMI_REPORT_SLEEP_STATE_EVENT *)ptr; - switch(ev3->sleepState) { - case WMI_REPORT_SLEEP_STATUS_IS_DEEP_SLEEP: - HandleAdapterEvent(pInfo, ATH_ADAPTER_REMOVED); - break; - case WMI_REPORT_SLEEP_STATUS_IS_AWAKE: - Abf_WlanIssueFrontEndConfig( pInfo); - HandleAdapterEvent(pInfo, ATH_ADAPTER_ARRIVED); - break; - } - break; - default: - //A_DEBUG("Event: 0x%x, Not Handled\n", eventid); - break; - } - } while (FALSE); - - return status; -} - -static A_STATUS -AcquireWlanAdapter(ABF_WLAN_INFO *pAbfWlanInfo) -{ - int sd; - A_STATUS status; - - if (pAbfWlanInfo->Handle != 0) { - return A_OK; - } - - if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - A_ERR("[%s] Error creating socket: %d\n", __FUNCTION__, sd); - return A_ERROR; - } - - pAbfWlanInfo->Handle = sd; - status = GetAdapterInfo(pAbfWlanInfo); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get Adapter Info\n", __FUNCTION__); - close(sd); - pAbfWlanInfo->Handle = 0; - return A_ERROR; - } else { - /* Try to get RTS to determinate that wlan is enabled */ - A_UCHAR buf[sizeof(int)+sizeof(WMI_SET_RTS_CMD)]; - ((int *)buf)[0] = AR6000_XIOCTL_AP_GET_RTS; - status = Abf_WlanDispatchIO(pAbfWlanInfo->pInfo, AR6000_IOCTL_EXTENDED, - (void *)buf, sizeof(buf)); - if (A_FAILED(status)) { - A_INFO("WMI is ready but wlan is disabled.\n"); - return A_ERROR; - } - } - - return A_OK; -} - -static A_STATUS -GetAdapterInfo(ABF_WLAN_INFO *pAbfWlanInfo) -{ - A_STATUS status; - struct ar6000_version *revinfo; - - revinfo = (struct ar6000_version *)A_MALLOC(sizeof(struct ar6000_version)); - - if (revinfo == NULL) { - A_ERR("[%s] Failed to alloc WLAN revision info\n", __FUNCTION__); - return A_ERROR; - } - - - /* Get the revision info */ - status = Abf_WlanDispatchIO(pAbfWlanInfo->pInfo, AR6000_IOCTL_WMI_GETREV, - (void *)revinfo, sizeof(struct ar6000_version)); - if (A_FAILED(status)) { - A_ERR("[%s] Failed to get WLAN revision\n", __FUNCTION__); - return A_ERROR; - } - - pAbfWlanInfo->HostVersion = revinfo->host_ver; - pAbfWlanInfo->TargetVersion = revinfo->target_ver; - A_INFO("Host Rev: 0x%x(%u.%u.%u.%u), Target Rev: 0x%x(%u.%u.%u.%u)\n", - revinfo->host_ver, - ((revinfo->host_ver)&0xf0000000)>>28, - ((revinfo->host_ver)&0x0f000000)>>24, - ((revinfo->host_ver)&0x00ff0000)>>16, - ((revinfo->host_ver)&0x0000ffff), - revinfo->target_ver, - ((revinfo->target_ver)&0xf0000000)>>28, - ((revinfo->target_ver)&0x0f000000)>>24, - ((revinfo->target_ver)&0x00ff0000)>>16, - ((revinfo->target_ver)&0x0000ffff)); - - A_FREE(revinfo); - - return A_OK; -} - -static void -ReleaseWlanAdapter(ABF_WLAN_INFO *pAbfWlanInfo) -{ - close(pAbfWlanInfo->Handle); - pAbfWlanInfo->Handle = 0; - pAbfWlanInfo->HostVersion = 0; - pAbfWlanInfo->TargetVersion = 0; -} - -void Abf_WlanCheckSettings(A_CHAR *wifname, A_UINT32 *btfiltFlags) -{ - int sd; - A_CHAR ifname[IFNAMSIZ]; -#ifdef ANDROID - char ifprop[PROPERTY_VALUE_MAX]; - if (wifname[0] == '\0' && property_get("wifi.interface", ifprop, NULL)) { - strcpy(wifname, ifprop); - } -#endif - - { - A_BOOL found = FALSE; - A_CHAR linebuf[1024]; - FILE *f = fopen("/proc/net/wireless", "r"); - if (f) { - while(fgets(linebuf, sizeof(linebuf)-1, f)) { - if (strchr(linebuf, ':')) { - char *dest = ifname; - char *p = linebuf; - while(*p && isspace(*p)) ++p; - while (*p && *p != ':') - *dest++ = *p++; - *dest = '\0'; - if (strcmp(wifname, ifname)==0) { - found = TRUE; - break; - } - } - } - if (!found && ifname[0]!='\0') { - strcpy(wifname, ifname); - } - fclose(f); - } - } - A_DEBUG("%s : wlan: %s\n", __FUNCTION__, wifname); - if (wifname[0] == '\0' || !btfiltFlags) { - return; - } - - if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - A_ERR("[%s] Error creating socket: %d\n", __FUNCTION__, sd); - return; - } - - do { - A_UINT32 flags = *btfiltFlags; - struct ifreq ifr; - struct ar6000_version revinfo; - A_MEMZERO(&revinfo, sizeof(revinfo)); - strncpy(ifr.ifr_name, wifname, sizeof(ifr.ifr_name)); - ifr.ifr_data = (void *)&revinfo; - if (ioctl(sd, AR6000_IOCTL_WMI_GETREV, &ifr) < 0) { - break; - } - if ( (revinfo.target_ver & 0xf0000000)==0x30000000) { - *btfiltFlags |= ABF_WIFI_CHIP_IS_VENUS; - } else { - *btfiltFlags &= ~ABF_WIFI_CHIP_IS_VENUS; - } - if (*btfiltFlags != flags) { - A_DEBUG("Change btfilt flags from %u to %u isVenus %d\n", flags, *btfiltFlags, - (*btfiltFlags & ABF_WIFI_CHIP_IS_VENUS) ? "yes" : "no"); - } - } while (0); - close(sd); -} diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btdefs.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btdefs.h deleted file mode 100644 index 0f51e5698ce9..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btdefs.h +++ /dev/null @@ -1,152 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Bluetooth spec definitions -// -// Author(s): ="Atheros" -//============================================================================== - - -#ifndef BTDEFS_H_ -#define BTDEFS_H_ - -#define OGF_SHIFT 10 -#define OGF_MASK 0xFC - -#define MAKE_HCI_COMMAND(ogf,ocf) (((ogf) << OGF_SHIFT) | (ocf)) -#define HCI_GET_OP_CODE(p) (((A_UINT16)((p)[1])) << 8) | ((A_UINT16)((p)[0])) -#define HCI_TEST_OGF(p,ogf) (((p)[1] & OGF_MASK) == ((ogf) << 2)) - -#define HCI_LINK_CONTROL_OGF 0x01 -#define IS_LINK_CONTROL_CMD(p) HCI_TEST_OGF(p,HCI_LINK_CONTROL_OGF) -#define HCI_INQUIRY MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0001) -#define HCI_INQUIRY_CANCEL MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0002) -#define HCI_PER_INQUIRY MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0003) -#define HCI_PER_INQUIRY_CANCEL MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0004) -#define HCI_CREATE_CONNECTION MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0005) -#define HCI_DISCONNECT MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0006) -#define HCI_ADD_SCO MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0007) -#define HCI_ACCEPT_CONN_REQ MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0009) -#define HCI_REJECT_CONN_REQ MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x000A) -#define HCI_SETUP_SCO_CONN MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, 0x0028) /* BT 2.0 */ - -//#define HCI_ MAKE_HCI_COMMAND(HCI_LINK_CONTROL_OGF, x) - -#define HCI_GET_EVENT_CODE(p) ((p)[0]) -#define GET_BT_EVENT_LENGTH(p) ((p)[1]) -#define HCI_EVT_INQUIRY_COMPLETE 0x01 -#define HCI_EVT_CONNECT_COMPLETE 0x03 -#define HCI_EVT_CONNECT_REQUEST 0x04 -#define HCI_EVT_REMOTE_DEV_LMP_VERSION 0x0b -#define HCI_EVT_REMOTE_DEV_VERSION 0x0c -#define HCI_EVT_DISCONNECT 0x05 -#define HCI_EVT_REMOTE_NAME_REQ 0x07 -#define HCI_EVT_ROLE_CHANGE 0x12 -#define HCI_EVT_NUM_COMPLETED_PKTS 0x13 -#define HCI_EVT_MODE_CHANGE 0x14 -#define HCI_EVT_SCO_CONNECT_COMPLETE 0x2C /* new to 2.0 */ - - -#define HCI_CMD_OPCODE_INQUIRY_START 0x401 -#define HCI_CMD_OPCODE_INQUIRY_CANCEL 0x402 -#define HCI_CMD_OPCODE_CONNECT 0x405 - -/* HCI Connection Complete Event macros */ -#define GET_BT_CONN_EVENT_STATUS(p) ((p)[2]) -#define GET_BT_CONN_HANDLE(p) ((A_UINT16)((p)[3]) | (((A_UINT16)((p)[4])) << 8)) -#define GET_BT_CONN_LINK_TYPE(p) ((p)[11]) -#define BT_CONN_EVENT_STATUS_SUCCESS(p) (GET_BT_CONN_EVENT_STATUS(p) == 0) -#define INVALID_BT_CONN_HANDLE 0xFFFF -#define BT_LINK_TYPE_SCO 0x00 -#define BT_LINK_TYPE_ACL 0x01 -#define BT_LINK_TYPE_ESCO 0x02 - - -/* SCO Connection Complete Event macros */ -#define GET_TRANS_INTERVAL(p) ((p)[12]) -#define GET_RETRANS_INTERVAL(p) ((p)[13]) -#define GET_RX_PKT_LEN(p) ((A_UINT16)((p)[14]) | (((A_UINT16)((p)[15])) << 8)) -#define GET_TX_PKT_LEN(p) ((A_UINT16)((p)[16]) | (((A_UINT16)((p)[17])) << 8)) - - -/* L2CAP Definitions */ -#define SIGNALING 0x0001 -#define CONNECTIONLESS 0x0002 -#define NULL_ID 0x0000 - -#define CONNECT_REQ 0x02 -#define CONNECT_RSP 0x03 -#define DISCONNECT_REQ 0x06 -#define DISCONNECT_RSP 0x07 - -#define STATE_SUCCESS 0 -#define STATE_PENDING 1 - -#define STATE_DISCONNECT 0x00 -#define STATE_CONNECTING 0x01 -#define STATE_CONNECTED 0x02 - -#define TYPE_ACPT 0x02 -#define TYPE_REJ 0x03 - -#define A2DP_TYPE 0x0019 -#define RFCOMM_TYPE 0x0003 -#define SDP_TYPE 0x0001 -#define AVDTP_START 0x07 -#define AVDTP_SUSPEND 0x08 -#define AVDTP_CLOSE 0x09 -#define AVDTP_OPEN 0x06 - -#define GETUINT16(p)(((A_UINT16)((p)[1])) << 8) | ((A_UINT16)((p)[0])) - -#include "athstartpack.h" - -typedef PREPACK struct _ACL_HEADER{ - A_UINT16 HANDLE; - A_UINT16 Length; -} POSTPACK ACL_HEADER, *PACL_HEADER; - -typedef PREPACK struct _L2CAP_HEADER{ - A_UINT16 Length; - A_UINT16 CID; -} POSTPACK L2CAP_HEADER, *PL2CAP_HEADER; - -typedef PREPACK struct _L2CAP_CONTROL{ - A_UINT8 CODE; - A_UINT8 ID; - A_UINT16 Length; - A_UINT16 PSM; - A_UINT16 DESTINATION_CID; - A_UINT16 SOURCE_CID; - A_UINT16 RESULT; - A_UINT16 STATUS; -} POSTPACK L2CAP_CONTROL, *PL2CAP_CONTROL; - -typedef PREPACK struct _AVDTP_HEADER{ - A_UINT8 MESSAGE_TYPE; - A_UINT8 CMD_ID; -} POSTPACK AVDTP_HEADER, *PAVDTP_HEADER; - -#include "athendpack.h" - -#endif /*BTDEFS_H_*/ - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_action.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_action.c deleted file mode 100644 index 1a543617923a..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_action.c +++ /dev/null @@ -1,640 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Bluetooth filter core action tables and action lookup -// -// Author(s): ="Atheros" -//============================================================================== - -#include -#include -#include "athdefs.h" -#define ATH_MODULE_NAME btfilt -#include "a_debug.h" -#include "a_types.h" -#include "a_osapi.h" -#include "wmi.h" -#include "athbtfilter.h" -#include "btfilter_core.h" - -#include "abtfilt_int.h" -#define ACTION_NOOP NULL -#define ACTION_TODO_TBD NULL - -static void CleanupModifiedControlActionDescChain(BT_CONTROL_ACTION_DESC *pDesc); - -/* default actions descriptor table - * - * NOTE: the pNext member of each entry must be set to NULL, when this table is copied - * to a RAM table so that the pNext field can be altered at run time in case the entry must be - * extended or overridden by the user */ -static const BT_CONTROL_ACTION_DESC_STATE g_ActionDefaults[ATH_BT_MAX_STATE_INDICATION] = -{ - /* STATE OFF */ /* STATE ON */ - /* ATH_BT_NOOP */ {{{ ACTION_NOOP, 0, NULL }, { ACTION_NOOP, 0, NULL }}}, - /* ATH_BT_INQUIRY */ {{{ "-s 3 2", 0, NULL }, { "-s 3 1", 0, NULL }}}, - /* ATH_BT_CONNECT */ {{{ ACTION_TODO_TBD, 0, NULL }, { ACTION_TODO_TBD, 0, NULL }}}, - /* ATH_BT_SCO */ {{{ "-s 1 2", 0, NULL }, { "-pSCO 10 20 2 0 2 6 1 0 0 60 50 5; -s 1 1", 0, NULL }}}, - /* ATH_BT_ACL */ {{{ ACTION_TODO_TBD, 0, NULL }, { ACTION_TODO_TBD, 0, NULL }}}, - /* ATH_BT_A2DP */ {{{ "-s 2 2", 0, NULL }, { "-pA2DP 30 3 20 0 0 60 50 20; -s 2 1", 0, NULL }}}, - /* ATH_BT_ESCO */ {{{ "-s 4 2", 0, NULL }, { "-pSCO 1 20 2 0 2 6 3 0 0 60 50 5 ; -s 4 1",0, NULL }}}, -}; - - -static const BT_CONTROL_ACTION_DESC_STATE g_ActionDefaultsVenus[ATH_BT_MAX_STATE_INDICATION] = -{ - /* STATE OFF */ /* STATE ON */ - /* ATH_BT_NOOP */ {{{ ACTION_NOOP, 0, NULL }, { ACTION_NOOP, 0, NULL }}}, - /* ATH_BT_INQUIRY */ {{{ "-s 3 2 0", 0, NULL }, { "-s 3 1 0", 0, NULL }}}, - /* ATH_BT_CONNECT */ {{{ ACTION_TODO_TBD, 0, NULL }, { ACTION_TODO_TBD, 0, NULL }}}, - /* ATH_BT_SCO */ {{{ "-s 1 2 0", 0, NULL }, { "-pSCO 2 4 1 0 10 20 2 6 2 3 3 36 5 5 1 100 2; -s 1 1 0 ", 0, NULL }}}, - /* ATH_BT_ACL */ {{{ ACTION_TODO_TBD, 0, NULL }, { ACTION_TODO_TBD, 0, NULL }}}, - /* ATH_BT_A2DP */ {{{ "-s 2 2 0", 0, NULL }, { "-pA2DP 5 0 30 3 20 36 5 5 1 3; -s 2 1 0", 0, NULL }}}, - /* ATH_BT_ESCO */ {{{ "-s 4 2 0", 0, NULL }, { "-pSCO 2 10 1 0 10 20 2 6 2 3 3 36 5 5 1 100 2; -s 4 1 0", 0, NULL }}}, -}; - -typedef enum _BT_COMMAND_TAG { - BT_STATUS_TAG = 0, - BT_PARAM_SCO_TAG = 1, - BT_PARAM_A2DP_TAG, - /* add new tags here */ - BT_COMMAND_TAGS_MAX -} BT_COMMAND_TAG; - - -static const A_CHAR *g_TagStrings[BT_COMMAND_TAGS_MAX] = { - "-s", - "-pSCO", - "-pA2DP", -}; - -static int FindActionString(A_CHAR *pString, A_CHAR **ppStart) -{ - int count = 0; - A_BOOL found = FALSE; - - if (*pString == ';') { - /* skip if this is the first one we hit */ - pString++; - } - - while ((*pString != '\0') && (*pString != ';')) { - if (!found) { - if (*pString == '-') { - /* found start of one action string */ - *ppStart = pString; - found = TRUE; - count++; - } - } else { - count++; - } - pString++; - } - - return count; -} - -#define ACTION_STRING_DELIMIT ' ' - - /* assemble an array of pointers to each argument in the string */ -static int GetArgStrings(A_CHAR *pString, - A_CHAR Delimit, - A_CHAR *pArgArray[], - int MaxArgs) -{ - int totalArgs = 0; - int length; - A_BOOL done = FALSE; - - while (!done && (totalArgs < MaxArgs)) { - - pArgArray[totalArgs] = pString; - length = 0; - - /* walk through the string and assemble substrings */ - while (1) { - - if ((*pString == '\0') || (*pString == Delimit)) { - - if (*pString == '\0') { - /* reached the end of the string */ - done = TRUE; - } else { - /* terminate */ - *pString = (A_CHAR)0; - } - /* advance pass NULL */ - pString++; - - if (length) { - /* only increment arg if we found a non-zero length string */ - totalArgs++; - } - - break; - } - - pString++; - length++; - } - - } - - return totalArgs; -} - -static int GetArguments(A_CHAR *pString, A_INT32 *pArgArray, int MaxArgs) -{ - int i; - int totalArgs; - int argsFound; - A_CHAR *argStrings[BT_ACTION_MAX_ARGS]; - - - totalArgs = GetArgStrings(pString, - ACTION_STRING_DELIMIT, - argStrings, - BT_ACTION_MAX_ARGS); - - argsFound = 0; - - for (i = 0; (i < totalArgs); i++) { - - if (argStrings[i][0] == '-') { - /* skip the action tag */ - continue; - } - if (argsFound < MaxArgs) { - /* got an arg */ - pArgArray[argsFound] = atol(argStrings[i]); - argsFound++; - } - } - - return argsFound; -} - -static A_STATUS BuildActionFromString(BT_FILTER_CORE_INFO * pCore, A_CHAR *pActionString, int Length, - BT_CONTROL_ACTION_ITEM **pControlItem) -{ - A_CHAR stringBuf[BT_ACTION_STRING_MAX_LENGTH + 1]; - int stringLength = min(Length,BT_ACTION_STRING_MAX_LENGTH); - BT_COMMAND_TAG tag = BT_COMMAND_TAGS_MAX; - BT_CONTROL_ACTION_ITEM *pItem = NULL; - A_STATUS status = A_OK; - A_INT32 args[BT_ACTION_MAX_ARGS]; - int argCount; - - - pItem = (BT_CONTROL_ACTION_ITEM *)A_MALLOC(sizeof(BT_CONTROL_ACTION_ITEM)); - - if (NULL == pItem) { - return A_NO_MEMORY; - } - - A_MEMZERO(pItem,sizeof(BT_CONTROL_ACTION_ITEM)); - /* copy string to temp buffer */ - A_MEMCPY(stringBuf, pActionString, stringLength); - stringBuf[stringLength] = '\0'; - - /* Parse string for command type */ - for (tag = 0; tag < BT_COMMAND_TAGS_MAX; tag++) { - if (strstr(stringBuf, g_TagStrings[tag]) != NULL) { - argCount = GetArguments(stringBuf,args,BT_ACTION_MAX_ARGS); - break; - } - } - -/* - * BT STATUS: - * "-s " - * - * BT PARAM SCO: - * "-pSCO - * " - * - * BT PARAM A2DP - * "-pA2DP ControlAction.Type = BT_CONTROL_ACTION_STATUS; - if(pCore->FilterState.btFilterFlags & ABF_WIFI_CHIP_IS_VENUS) { - WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *pOperatingStatus = - (WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *)pItem->ControlAction.Buffer; - - pItem->ControlAction.Length = sizeof(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD); - - if (argCount != 3) { - status = A_EINVAL; - break; - } - - pOperatingStatus->btProfileType = (A_UINT8)args[0]; - pOperatingStatus->btOperatingStatus =(A_UINT8)args[1]; - pOperatingStatus->btLinkId =(A_UINT8)args[2]; - }else { - - WMI_SET_BT_STATUS_CMD *pStatusCmd = (WMI_SET_BT_STATUS_CMD *)pItem->ControlAction.Buffer; - pItem->ControlAction.Length = sizeof(WMI_SET_BT_STATUS_CMD); - - if (argCount != 2) { - status = A_EINVAL; - break; - } - - pStatusCmd->streamType = (A_UINT8)args[0]; - pStatusCmd->status = (A_UINT8)args[1]; - } - break; - - case BT_PARAM_SCO_TAG: - pItem->ControlAction.Type = BT_CONTROL_ACTION_PARAMS; - if(pCore->FilterState.btFilterFlags & ABF_WIFI_CHIP_IS_VENUS) { - WMI_SET_BTCOEX_SCO_CONFIG_CMD * pScoConfigCmd = - (WMI_SET_BTCOEX_SCO_CONFIG_CMD *)pItem->ControlAction.Buffer; - pItem->ControlAction.Length = sizeof(WMI_SET_BTCOEX_SCO_CONFIG_CMD); - BTCOEX_SCO_CONFIG * pScoGenericConfig = &pScoConfigCmd->scoConfig; - BTCOEX_PSPOLLMODE_SCO_CONFIG * pScoPspollConfig = &pScoConfigCmd->scoPspollConfig; - BTCOEX_OPTMODE_SCO_CONFIG * pScoOptModeConfig = &pScoConfigCmd->scoOptModeConfig; - BTCOEX_WLANSCAN_SCO_CONFIG * pScoWlanScanConfig = &pScoConfigCmd->scoWlanScanConfig; - if (argCount != 17) { - status = A_EINVAL; - break; - } - pScoGenericConfig->scoSlots = (A_UINT32) args[0]; - pScoGenericConfig->scoIdleSlots = (A_UINT32) args[1]; - pScoGenericConfig->scoFlags = (A_UINT32) args[2]; - pScoGenericConfig->linkId = (A_UINT32) args[3]; - pScoPspollConfig->scoCyclesForceTrigger = (A_UINT32) args[4]; - pScoPspollConfig->scoDataResponseTimeout = (A_UINT32) args[5]; - pScoPspollConfig->scoStompDutyCyleVal = (A_UINT32) args[6]; - pScoPspollConfig->scoStompDutyCyleMaxVal = (A_UINT32) args[7]; - pScoPspollConfig->scoPsPollLatencyFraction = (A_UINT32) args[8]; - pScoOptModeConfig->scoStompCntIn100ms = (A_UINT32) args[9]; - pScoOptModeConfig->scoContStompMax = (A_UINT32) args[10]; - pScoOptModeConfig->scoMinlowRateMbps = (A_UINT32) args[11]; - pScoOptModeConfig->scoLowRateCnt = (A_UINT32) args[12]; - pScoOptModeConfig->scoHighPktRatio = (A_UINT32) args[13]; - pScoOptModeConfig->scoMaxAggrSize = (A_UINT32) args[14]; - pScoWlanScanConfig->scanInterval = (A_UINT32) args[15]; - pScoWlanScanConfig->maxScanStompCnt = (A_UINT32) args[16]; - } else { - pItem->ControlAction.Type = BT_CONTROL_ACTION_PARAMS; - pItem->ControlAction.Length = sizeof(WMI_SET_BT_PARAMS_CMD); - WMI_SET_BT_PARAMS_CMD *pParamsCmd = - (WMI_SET_BT_PARAMS_CMD *)pItem->ControlAction.Buffer; - - pParamsCmd->paramType = BT_PARAM_SCO; - pParamsCmd->info.scoParams.numScoCyclesForceTrigger = - (A_UINT8)args[0]; - pParamsCmd->info.scoParams.dataResponseTimeout = - (A_UINT8)args[1]; - pParamsCmd->info.scoParams.stompScoRules = - (A_UINT8)args[2]; - pParamsCmd->info.scoParams.scoOptFlags = (A_UINT8)args[3]; - pParamsCmd->info.scoParams.stompDutyCyleVal = - (A_UINT8)args[4]; - pParamsCmd->info.scoParams.stompDutyCyleMaxVal = - (A_UINT8)args[5]; - pParamsCmd->info.scoParams.psPollLatencyFraction = - (A_UINT8)args[6]; - pParamsCmd->info.scoParams.noSCOSlots = (A_UINT8)args[7]; - pParamsCmd->info.scoParams.noIdleSlots = (A_UINT8)args[8]; - /*only a place holder. modify num args if scoOpt flag bits - need to be modified here*/ - pParamsCmd->info.scoParams.scoOptOffRssi= (A_UINT8)args[9]; - pParamsCmd->info.scoParams.scoOptOnRssi = (A_UINT8)args[10]; - pParamsCmd->info.scoParams.scoOptRtsCount =(A_UINT8)args[11]; - } - break; - case BT_PARAM_A2DP_TAG: - pItem->ControlAction.Type = BT_CONTROL_ACTION_PARAMS; - if(pCore->FilterState.btFilterFlags & ABF_WIFI_CHIP_IS_VENUS) { - WMI_SET_BTCOEX_A2DP_CONFIG_CMD * pA2dpConfigCmd = - (WMI_SET_BTCOEX_A2DP_CONFIG_CMD *)pItem->ControlAction.Buffer; - pItem->ControlAction.Length = sizeof(WMI_SET_BTCOEX_A2DP_CONFIG_CMD); - BTCOEX_A2DP_CONFIG * pA2dpGenericConfig = &pA2dpConfigCmd->a2dpConfig; - BTCOEX_PSPOLLMODE_A2DP_CONFIG * pA2dpPspollConfig = &pA2dpConfigCmd->a2dppspollConfig; - BTCOEX_OPTMODE_A2DP_CONFIG * pA2dpOptModeConfig = &pA2dpConfigCmd->a2dpOptConfig; - if (argCount != 10) { - status = A_EINVAL; - break; - } - pA2dpGenericConfig->a2dpFlags = (A_UINT32) args[0]; - pA2dpGenericConfig->linkId = (A_UINT32) args[1]; - pA2dpPspollConfig->a2dpWlanMaxDur = (A_UINT32) args[2]; - pA2dpPspollConfig->a2dpMinBurstCnt = (A_UINT32) args[3]; - pA2dpPspollConfig->a2dpDataRespTimeout = (A_UINT32) args[4]; - pA2dpOptModeConfig->a2dpMinlowRateMbps = (A_UINT32) args[5]; - pA2dpOptModeConfig->a2dpLowRateCnt = (A_UINT32) args[6]; - pA2dpOptModeConfig->a2dpHighPktRatio = (A_UINT32) args[7]; - pA2dpOptModeConfig->a2dpMaxAggrSize = (A_UINT32) args[8]; - pA2dpOptModeConfig->a2dpPktStompCnt = (A_UINT32) args[9]; - }else { - pItem->ControlAction.Type = BT_CONTROL_ACTION_PARAMS; - pItem->ControlAction.Length = sizeof(WMI_SET_BT_PARAMS_CMD); - WMI_SET_BT_PARAMS_CMD *pParamsCmd = - (WMI_SET_BT_PARAMS_CMD *)pItem->ControlAction.Buffer; - if (argCount != 8) { - status = A_EINVAL; - break; - } - pParamsCmd->paramType = BT_PARAM_A2DP; - pParamsCmd->info.a2dpParams.a2dpWlanUsageLimit = (A_UINT8)args[0]; - pParamsCmd->info.a2dpParams.a2dpBurstCntMin = (A_UINT8)args[1]; - pParamsCmd->info.a2dpParams.a2dpDataRespTimeout = (A_UINT8)args[2]; - pParamsCmd->info.a2dpParams.a2dpOptFlags = (A_UINT8)args[3]; - pParamsCmd->info.a2dpParams.isCoLocatedBtRoleMaster = (A_UINT8)args[4]; - pParamsCmd->info.a2dpParams.a2dpOptOffRssi = (A_UINT8)args[5]; - pParamsCmd->info.a2dpParams.a2dpOptOnRssi = (A_UINT8)args[6]; - pParamsCmd->info.a2dpParams.a2dpOptRtsCount = (A_UINT8)args[7]; - } - break; - - default: - break; - - } - - if (A_FAILED(status)) { - A_FREE(pItem); - } else { - *pControlItem = pItem; - } - - return status; -} - -/* assemble the action list based on the descriptor list */ -static A_STATUS AssembleActionList(BT_FILTER_CORE_INFO * pCore, BT_CONTROL_ACTION_DESC *pDesc, DL_LIST *pActionListHead) -{ - BT_CONTROL_ACTION_ITEM *pControlItem; - A_CHAR *pActionString; - A_CHAR *pStringToScan; - int length; - A_STATUS status = A_OK; - - for ( ;((pDesc != NULL) && A_SUCCESS(status)); pDesc = pDesc->pNext) { - if (NULL == pDesc->pActionString) { - continue; - } - /* scan the action string and assemble all actions */ - pStringToScan = pDesc->pActionString; - - while (1) { - - length = FindActionString(pStringToScan, &pActionString); - - if (0 == length) { - break; - } - /* found the string, now build the action */ - status = BuildActionFromString(pCore, pActionString, length , &pControlItem); - - if (A_FAILED(status)) { - break; - } - - /* insert into the list head in FIFO order */ - DL_ListInsertTail(pActionListHead,&pControlItem->ListEntry); - - /* scan the rest of the string */ - pStringToScan = pActionString + length; - } - } - - return status; -} - - -static void CleanListItems(DL_LIST *pListHead) -{ - DL_LIST *pListItem; - BT_CONTROL_ACTION_ITEM *pControlItem; - - while (1) { - pListItem = DL_ListRemoveItemFromHead(pListHead); - if (NULL == pListItem) { - break; - } - pControlItem = A_CONTAINING_STRUCT(pListItem, BT_CONTROL_ACTION_ITEM, ListEntry); - /* free it */ - A_FREE(pControlItem); - } -} - - -static void CleanupActionLists(BT_FILTER_CORE_INFO *pCore) -{ - int indication,state; - - for (state = 0; state < STATE_MAX; state++) { - /* free all action list items */ - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; indication++) { - CleanListItems(&pCore->ActionListsState[indication][state]); - } - } -} - -/* API implementation */ -void FCore_ResetActionDescriptors(BT_FILTER_CORE_INFO *pCore) -{ - int indication,state; - - for (state = 0; state < STATE_MAX; state++) { - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; indication++) { - CleanupModifiedControlActionDescChain(&pCore->ActionDescriptors[indication].Action[state]); - } - } - - if(pCore->FilterState.btFilterFlags & ABF_WIFI_CHIP_IS_VENUS) { - memcpy(pCore->ActionDescriptors, g_ActionDefaultsVenus, sizeof(pCore->ActionDescriptors)); - }else { - memcpy(pCore->ActionDescriptors, g_ActionDefaults, sizeof(pCore->ActionDescriptors)); - } -} - -A_BOOL FCore_Init(BT_FILTER_CORE_INFO *pCore) -{ - int indication,state; - - for (state = 0; state < STATE_MAX; state++) { - /* initialize all action list heads */ - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; indication++) { - DL_LIST_INIT(&pCore->ActionListsState[indication][state]); - } - } - /* load up the default action descriptors */ - FCore_ResetActionDescriptors(pCore); - - pCore->FilterState.ACL_ConnectionHandle = INVALID_BT_CONN_HANDLE; - pCore->FilterState.eSCO_ConnectionHandle = INVALID_BT_CONN_HANDLE; - pCore->FilterState.SCO_ConnectionHandle = INVALID_BT_CONN_HANDLE; - - return TRUE; -} - -/* assembly action lists from the action table, this is called after the OS-porting layer - * has had a chance to alter the action table */ -A_STATUS FCore_RefreshActionList(BT_FILTER_CORE_INFO *pCore) -{ - int indication,state; - A_STATUS status = A_OK; - - /* clean up previous ones */ - CleanupActionLists(pCore); - - for (state = 0; (state < STATE_MAX) && A_SUCCESS(status); state++) { - for (indication = 0; (indication < ATH_BT_MAX_STATE_INDICATION) && A_SUCCESS(status); indication++) { - status = AssembleActionList(pCore, &pCore->ActionDescriptors[indication].Action[state], - &pCore->ActionListsState[indication][state]); - } - } - - if (A_FAILED(status)) { - FCore_Cleanup(pCore); - } - - return status; -} - -void FCore_Cleanup(BT_FILTER_CORE_INFO *pCore) -{ - int indication,state; - - for (state = 0; state < STATE_MAX; state++) { - for (indication = 0; indication < ATH_BT_MAX_STATE_INDICATION; indication++) { - CleanupModifiedControlActionDescChain(&pCore->ActionDescriptors[indication].Action[state]); - } - } - - CleanupActionLists(pCore); -} - - -BT_CONTROL_ACTION_ITEM *FCore_GetControlAction(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - BT_CONTROL_ACTION_ITEM *pStart) -{ - DL_LIST *pListHead; - BT_CONTROL_ACTION_ITEM *pBtControlAction = NULL; - - if (State >= STATE_MAX) { - return NULL; - } - - pListHead = &pCore->ActionListsState[Indication][State]; - - if (NULL == pStart) { - /* caller wants the first item in the list */ - if (pListHead->pNext == pListHead) { - /* list is empty */ - return NULL; - } - pBtControlAction = A_CONTAINING_STRUCT(pListHead->pNext, BT_CONTROL_ACTION_ITEM, ListEntry); - } else { - /* caller wants the next list item */ - if (pStart->ListEntry.pNext == pListHead) { - /* reached the end */ - return NULL; - } - pBtControlAction = A_CONTAINING_STRUCT(pStart->ListEntry.pNext, BT_CONTROL_ACTION_ITEM, ListEntry); - } - - return pBtControlAction; -} - -static void CleanupModifiedControlActionDescChain(BT_CONTROL_ACTION_DESC *pDesc) -{ - BT_CONTROL_ACTION_DESC *pNextDesc; - - while (pDesc) { - pNextDesc = pDesc->pNext; - if (pDesc->Flags & BT_CA_DESC_FLAGS_ALLOCATED) { - A_FREE(pDesc); - } - pDesc = pNextDesc; - } - -} - -A_STATUS FCore_ModifyControlActionString(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - A_CHAR *pAction, - int StringLength, - ATHBT_MODIFY_CONTROL_ACTION ModifyAction) -{ - BT_CONTROL_ACTION_DESC *pNewDesc; - BT_CONTROL_ACTION_DESC *pDescHead; - A_CHAR *pString; - - /* get first entry at the head */ - pDescHead = &pCore->ActionDescriptors[Indication].Action[State]; - - /* allocate and assemble an entry for this action */ - pNewDesc = (BT_CONTROL_ACTION_DESC *)A_MALLOC(sizeof(BT_CONTROL_ACTION_DESC) + StringLength + 1); - - if (NULL == pNewDesc) { - return A_NO_MEMORY; - } - - A_MEMZERO(pNewDesc,sizeof(BT_CONTROL_ACTION_DESC)); - - /* setup and copy string */ - pString = (A_CHAR *)((A_UINT8 *)pNewDesc + sizeof(BT_CONTROL_ACTION_DESC)); - A_MEMCPY(pString,pAction,StringLength); - pString[StringLength] = 0; - pNewDesc->pActionString = pString; - /* mark that it was allocated so we can clean it up later */ - pNewDesc->Flags = BT_CA_DESC_FLAGS_ALLOCATED; - - switch (ModifyAction) { - case ATHBT_MODIFY_CONTROL_ACTION_APPEND: - /* append to the end of the list */ - while (pDescHead->pNext != NULL) { - pDescHead = pDescHead->pNext; - } - pDescHead->pNext = pNewDesc; - break; - - case ATHBT_MODIFY_CONTROL_ACTION_REPLACE: - /* remove any existing replacements or append operations */ - CleanupModifiedControlActionDescChain(pDescHead); - /* ignore the first entry's action string */ - pDescHead->pActionString = NULL; - /* add new replacement */ - pDescHead->pNext = pNewDesc; - break; - - default: - A_FREE(pNewDesc); - break; - } - - - return A_OK; -} diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.c b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.c deleted file mode 100644 index 3d42822bf1c8..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.c +++ /dev/null @@ -1,620 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Bluetooth filter core action tables and action lookup -// -// Author(s): ="Atheros" -//============================================================================== - -#include -#include -#include "athdefs.h" -#define ATH_MODULE_NAME btfilt -#include "a_debug.h" -#include "a_types.h" -#include "a_osapi.h" -#include "wmi.h" -#include "athbtfilter.h" -#include "btfilter_core.h" - -#ifdef DEBUG - -ATH_DEBUG_INSTANTIATE_MODULE_VAR(btfilt, - "btfilt", - "BT Filter Core", - ATH_DEBUG_MASK_DEFAULTS, - 0, - NULL); - -#endif - -#define IS_STATE_FILTER_IGNORED(pCore,indication) ((pCore)->StateFilterIgnore & (1 << (indication))) - -static A_BOOL IsACLSignaling(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length); - -static A_BOOL IsA2DPConnection(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length); - -static void ParseACLPacket(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length); - -static void ProcessA2DPconnection(BT_FILTER_CORE_INFO *pCore, - L2CAP_CONTROL *pL2Ctrl, - A_BOOL IsConnect); - -static ATHBT_STATE_INDICATION A2DP_StateIndication(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState); - -static ATHBT_STATE_INDICATION ProcessA2DPCMD(BT_FILTER_CORE_INFO *pCore, - A_UINT8 CMDID, - ATHBT_STATE *pNewState, - A_BOOL IsACPT); - -ATHBT_STATE_INDICATION FCore_FilterBTCommand(BT_FILTER_CORE_INFO *pCore, A_UINT8 *pBuffer, int Length, ATHBT_STATE *pNewState) -{ - ATHBT_STATE_INDICATION indication = ATH_BT_NOOP; - ATHBT_STATE state = STATE_OFF; - A_UINT16 command; - - - if (!IS_LINK_CONTROL_CMD(pBuffer)) { - /* we only filter link control commands */ - return indication; - } - - command = HCI_GET_OP_CODE(pBuffer); - - switch (command) { - case HCI_INQUIRY : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_INQUIRY)) { - break; - } - indication = ATH_BT_INQUIRY; - state = STATE_ON; - break; - - case HCI_INQUIRY_CANCEL : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_INQUIRY)) { - break; - } - indication = ATH_BT_INQUIRY; - state = STATE_OFF; - break; - - case HCI_CREATE_CONNECTION : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_CONNECT)) { - break; - } - indication = ATH_BT_CONNECT; - state = STATE_ON; - break; - - case HCI_ACCEPT_CONN_REQ : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_CONNECT)) { - break; - } - indication = ATH_BT_CONNECT; - state = STATE_ON; - break; - - case HCI_ADD_SCO : - /* we do not need to handle this command, we can pick up the connection complete event */ - case HCI_DISCONNECT : - /* we don't need to handle this command as we can pick up the disconnect event */ - case HCI_PER_INQUIRY : - case HCI_PER_INQUIRY_CANCEL : - /* we do not handle these currently */ - default : - break; - } - - if (indication != ATH_BT_NOOP) { - /* the HCI filter simply determines the "precise" state and calls the shared function */ - return FCore_FilterIndicatePreciseState(pCore, indication, state, pNewState); - } - - return ATH_BT_NOOP; -} - - -void FilterConnectDisconnectComplete(BT_FILTER_CORE_INFO *pCore, - A_UINT8 LinkType, - A_UINT16 ConnectionHandle, - A_BOOL Connected, - ATHBT_STATE_INDICATION *pIndication, - ATHBT_STATE *pState) -{ - - - do { - if (Connected) { - - if (LinkType == BT_LINK_TYPE_SCO) { - - /* SCO connection */ - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_SCO)) { - break; - } - - pCore->FilterState.SCO_ConnectionHandle = ConnectionHandle; - *pIndication = ATH_BT_SCO; - *pState = STATE_ON; - - } else if (LinkType == BT_LINK_TYPE_ACL) { - - /* ACL connection */ - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_ACL)) { - break; - } - - /**** TODO , currently we do not keep track of ACL connections - at the moment we rely on upper layer stack to detect specific - traffic types like A2DP. Since there can be multiple ACL connections - it is not practical to provide a single action for all ACL connections. - This is just a place holder in case a customer does require specific - actions to take for an ACL connection *****/ - - } else if (LinkType == BT_LINK_TYPE_ESCO) { - - /* eSCO connection */ - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_ESCO)) { - break; - } - - pCore->FilterState.eSCO_ConnectionHandle = ConnectionHandle; - *pIndication = ATH_BT_ESCO; - *pState = STATE_ON; - } - - break; - } - - /* if we get here, we are handling the disconnect case */ - - if (ConnectionHandle == pCore->FilterState.ACL_ConnectionHandle) { - - /*** TODO, we currently do not keep track of these, see note above */ - - } else if (ConnectionHandle == pCore->FilterState.SCO_ConnectionHandle) { - - pCore->FilterState.SCO_ConnectionHandle = INVALID_BT_CONN_HANDLE; - *pIndication = ATH_BT_SCO; - *pState = STATE_OFF; - - } else if (ConnectionHandle == pCore->FilterState.eSCO_ConnectionHandle) { - - pCore->FilterState.eSCO_ConnectionHandle = INVALID_BT_CONN_HANDLE; - *pIndication = ATH_BT_ESCO; - *pState = STATE_OFF; - } - - } while (FALSE); - -} - - -ATHBT_STATE_INDICATION FCore_FilterBTEvent(BT_FILTER_CORE_INFO *pCore, A_UINT8 *pBuffer, int Length, ATHBT_STATE *pNewState) -{ - ATHBT_STATE_INDICATION indication = ATH_BT_NOOP; - ATHBT_STATE state = STATE_OFF; - - switch HCI_GET_EVENT_CODE(pBuffer) { - case HCI_EVT_INQUIRY_COMPLETE : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_INQUIRY)) { - break; - } - indication = ATH_BT_INQUIRY; - state = STATE_OFF; - break; - - case HCI_EVT_CONNECT_COMPLETE : - - if (BT_CONN_EVENT_STATUS_SUCCESS(pBuffer)) { - FilterConnectDisconnectComplete(pCore, - GET_BT_CONN_LINK_TYPE(pBuffer), - GET_BT_CONN_HANDLE(pBuffer), - TRUE, /* connected */ - &indication, - &state); - } - - break; - - case HCI_EVT_CONNECT_REQUEST : - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_CONNECT)) { - break; - } - - indication = ATH_BT_CONNECT; - state = STATE_ON; - break; - - case HCI_EVT_SCO_CONNECT_COMPLETE: - - if (BT_CONN_EVENT_STATUS_SUCCESS(pBuffer)) { - FilterConnectDisconnectComplete(pCore, - GET_BT_CONN_LINK_TYPE(pBuffer), - GET_BT_CONN_HANDLE(pBuffer), - TRUE, /* connected */ - &indication, - &state); - } - - break; - - case HCI_EVT_DISCONNECT : - - FilterConnectDisconnectComplete(pCore, - GET_BT_CONN_LINK_TYPE(pBuffer), - GET_BT_CONN_HANDLE(pBuffer), - FALSE, /* disconnected */ - &indication, - &state); - break; - - case HCI_EVT_REMOTE_NAME_REQ : - - /* TODO */ - break; - - case HCI_EVT_ROLE_CHANGE : - /* TODO */ - break; - - default: - break; - } - - if (indication != ATH_BT_NOOP) { - /* the HCI filter simply determines the "precise" state and calls the shared function */ - return FCore_FilterIndicatePreciseState(pCore, indication, state, pNewState); - } - - return ATH_BT_NOOP; -} - -/* a precise state can be indicated by the porting layer or indicated by the HCI command/event filtering. - * The caller needs to protect this call with a lock */ -ATHBT_STATE_INDICATION FCore_FilterIndicatePreciseState(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE StateOn, - ATHBT_STATE *pNewState) -{ - A_UINT32 bitmap = (1 << Indication); - A_UINT32 oldBitMap; - - oldBitMap = pCore->FilterState.StateBitMap; - - if (StateOn == STATE_ON) { - pCore->FilterState.StateBitMap |= bitmap; - } else { - pCore->FilterState.StateBitMap &= ~bitmap; - } - - if (oldBitMap ^ pCore->FilterState.StateBitMap) { - *pNewState = StateOn; - return Indication; - } else { - /* no state change */ - return ATH_BT_NOOP; - } -} - -A_UINT32 FCore_GetCurrentBTStateBitMap(BT_FILTER_CORE_INFO *pCore) -{ - return pCore->FilterState.StateBitMap; -} - -ATHBT_STATE_INDICATION FCore_FilterACLDataIn(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState) -{ - ATHBT_STATE_INDICATION stateIndication = ATH_BT_NOOP; - - *pNewState = STATE_OFF; - - do { - - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_A2DP)) { - /* we only filter for A2DP stream state if the OS-ported layer - * cannot do it */ - break; - } - - /***** the following code filters for A2DP stream state ONLY *****/ - - /* filter ACL packets for application specific traffic */ - if (IsACLSignaling(pCore,pBuffer,Length)) { - ParseACLPacket(pCore,pBuffer,Length); - } else if ( IsA2DPConnection(pCore,pBuffer,Length)) { - stateIndication = A2DP_StateIndication(pCore,pBuffer,Length,pNewState); - } - - } while (FALSE); - - return stateIndication; -} - -ATHBT_STATE_INDICATION FCore_FilterACLDataOut(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState) -{ - ATHBT_STATE_INDICATION stateIndication = ATH_BT_NOOP; - - *pNewState = STATE_OFF; - - do { - - if (IS_STATE_FILTER_IGNORED(pCore, ATH_BT_A2DP)) { - /* we only filter for A2DP stream state if the OS-ported layer - * cannot do it */ - break; - } - - /***** the following code filters for A2DP stream state ONLY *****/ - - if (IsACLSignaling(pCore,pBuffer,Length)) { - ParseACLPacket(pCore,pBuffer,Length); - } else if (IsA2DPConnection(pCore,pBuffer,Length)) { - stateIndication = A2DP_StateIndication(pCore,pBuffer,Length,pNewState); - } - - } while (FALSE); - - return stateIndication; -} - -static INLINE A_BOOL ParseCAPheader(L2CAP_HEADER *pL2hdr, - A_UINT8 *pBuffer, - int Length) -{ - A_UCHAR *pTemp = pBuffer + sizeof(ACL_HEADER); - - if (Length < (sizeof(ACL_HEADER)+sizeof(L2CAP_HEADER))) { - return FALSE; - } - - pL2hdr->Length = GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - pL2hdr->CID = GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - return TRUE; -} - - -static INLINE A_BOOL ParseCAPCtrl(L2CAP_CONTROL *pL2Ctrl, - A_UINT8 *pBuffer, - int Length) -{ - A_UCHAR *pTemp = pBuffer + sizeof(ACL_HEADER); - - if (Length < (sizeof(ACL_HEADER)+sizeof(L2CAP_HEADER)+sizeof(L2CAP_CONTROL)-6)) { - return FALSE; - } - - pTemp +=sizeof(L2CAP_HEADER); - - pL2Ctrl->CODE = *pTemp++; - pL2Ctrl->ID = *pTemp++; - pL2Ctrl->Length = GETUINT16(pTemp) ; - pTemp += sizeof(A_UINT16); - pL2Ctrl->PSM = pL2Ctrl->DESTINATION_CID=GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - pL2Ctrl->SOURCE_CID = GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - - if (Length >= (sizeof(ACL_HEADER)+sizeof(L2CAP_HEADER)+sizeof(L2CAP_CONTROL)-sizeof(A_UINT16))) { - pL2Ctrl->RESULT = GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - pL2Ctrl->STATUS = GETUINT16(pTemp); - pTemp += sizeof(A_UINT16); - } - - return TRUE; -} - -static A_BOOL IsACLSignaling(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length) -{ - L2CAP_HEADER L2hdr; - - A_MEMZERO(&L2hdr,sizeof(L2CAP_HEADER)); - - if (!ParseCAPheader(&L2hdr,pBuffer,Length)) { - return FALSE; - } - - if (L2hdr.CID == SIGNALING) { - return TRUE; - } - - return FALSE; -} - -static A_BOOL IsA2DPConnection(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length) -{ - L2CAP_HEADER L2hdr; - - A_MEMZERO(&L2hdr,sizeof(L2CAP_HEADER)); - - if (!ParseCAPheader(&L2hdr,pBuffer,Length)) { - /* not L2CAP header */ - return FALSE; - } - - if (pCore->FilterState.AVDTP_state==STATE_CONNECTED && - ((L2hdr.CID==pCore->FilterState.AVDTP_DESTINATION_CID) || - (L2hdr.CID==pCore->FilterState.AVDTP_SOURCE_CID))) { - //ACL normal packet - return TRUE; - } - - return FALSE; -} - -static void ParseACLPacket(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length) -{ - L2CAP_CONTROL L2ctrl; - - A_MEMZERO(&L2ctrl,sizeof(L2CAP_CONTROL)); - - if (!ParseCAPCtrl(&L2ctrl,pBuffer,Length)) { - return; - } - - switch( L2ctrl.CODE) { - case CONNECT_REQ: - case CONNECT_RSP: - ProcessA2DPconnection(pCore,&L2ctrl,TRUE); - break; - case DISCONNECT_REQ: - case DISCONNECT_RSP: - ProcessA2DPconnection(pCore,&L2ctrl,FALSE); - break; - } -} - -static void ProcessA2DPconnection(BT_FILTER_CORE_INFO *pCore, - PL2CAP_CONTROL pL2Ctrl, - A_BOOL IsConnect) -{ - - if (IsConnect) { - if (pL2Ctrl->CODE==CONNECT_REQ) { - if (pCore->FilterState.AVDTP_state==STATE_DISCONNECT) { - pCore->FilterState.AVDTP_state = pL2Ctrl->PSM == - A2DP_TYPE ? STATE_CONNECTING:STATE_DISCONNECT; - } else if (pCore->FilterState.RFCOMM_state==STATE_DISCONNECT) { - pCore->FilterState.RFCOMM_state= pL2Ctrl->PSM == - RFCOMM_TYPE ? STATE_CONNECTING:STATE_DISCONNECT; - } - } else if (pL2Ctrl->CODE==CONNECT_RSP) { - switch (pL2Ctrl->RESULT) { - case STATE_SUCCESS: - if (pCore->FilterState.AVDTP_state == STATE_CONNECTING) { - pCore->FilterState.AVDTP_SOURCE_CID=NULL_ID; - pCore->FilterState.AVDTP_DESTINATION_CID=NULL_ID; - if ( pL2Ctrl->STATUS==STATE_SUCCESS) { - pCore->FilterState.AVDTP_state= STATE_CONNECTED; - pCore->FilterState.AVDTP_SOURCE_CID= pL2Ctrl->SOURCE_CID; - pCore->FilterState.AVDTP_DESTINATION_CID= pL2Ctrl->DESTINATION_CID; - } - } else if (pCore->FilterState.RFCOMM_state == STATE_CONNECTING) { - pCore->FilterState.RFCOMM_SOURCE_CID=NULL_ID; - pCore->FilterState.RFCOMM_DESTINATION_CID=NULL_ID; - if ( pL2Ctrl->STATUS==STATE_SUCCESS) { - pCore->FilterState.RFCOMM_state= STATE_CONNECTED; - pCore->FilterState.RFCOMM_SOURCE_CID= pL2Ctrl->SOURCE_CID; - pCore->FilterState.RFCOMM_DESTINATION_CID= pL2Ctrl->DESTINATION_CID; - } - } - break; - case STATE_PENDING: - break; - default: - pCore->FilterState.RFCOMM_state=STATE_DISCONNECT; - pCore->FilterState.RFCOMM_SOURCE_CID=NULL_ID; - pCore->FilterState.RFCOMM_DESTINATION_CID=NULL_ID; - pCore->FilterState.AVDTP_state=STATE_DISCONNECT; - pCore->FilterState.AVDTP_SOURCE_CID = NULL_ID; - pCore->FilterState.AVDTP_DESTINATION_CID=NULL_ID; - break; - } - } - } else { - pCore->FilterState.AVDTP_state=STATE_DISCONNECT; - pCore->FilterState.RFCOMM_state=STATE_DISCONNECT; - } - -} - - -static ATHBT_STATE_INDICATION A2DP_StateIndication(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState) - -{ - AVDTP_HEADER Avdtphdr; - ATHBT_STATE_INDICATION stateIndication = ATH_BT_NOOP; - A_UCHAR *pTemp = pBuffer+sizeof(ACL_HEADER)+sizeof(L2CAP_HEADER); - - Avdtphdr.MESSAGE_TYPE= (*pTemp++) & 0x03; // get Message Type - Avdtphdr.CMD_ID = (*pTemp++) & 0x3F; //Get command code - - switch (Avdtphdr.MESSAGE_TYPE) { - case TYPE_ACPT: - stateIndication = ProcessA2DPCMD(pCore,Avdtphdr.CMD_ID,pNewState,TRUE); - break; - case TYPE_REJ: - stateIndication = ProcessA2DPCMD(pCore,Avdtphdr.CMD_ID,pNewState,FALSE); - break; - default: - break; - } - - return stateIndication; -} - -static ATHBT_STATE_INDICATION ProcessA2DPCMD(BT_FILTER_CORE_INFO *pCore, - A_UINT8 CMDID, - ATHBT_STATE *pNewState, - A_BOOL IsACPT) - -{ - ATHBT_STATE_INDICATION stateIndication = ATH_BT_NOOP; - - switch(CMDID) { - case AVDTP_START: - stateIndication = ATH_BT_A2DP; - *pNewState = IsACPT ? STATE_ON:STATE_OFF; - break; - case AVDTP_OPEN: - // don't assign any state in here. - break; - case AVDTP_SUSPEND: - stateIndication = ATH_BT_A2DP; - *pNewState = STATE_OFF; - break; - case AVDTP_CLOSE: - stateIndication = ATH_BT_A2DP; - *pNewState = STATE_OFF; - break; - default: - break; - } - - return stateIndication; -} - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.h deleted file mode 100644 index f0230f64e6db..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/btfilter_core.h +++ /dev/null @@ -1,204 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2007 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== -// Internal APIs and definitions for Bluetooth filter core -// -// Author(s): ="Atheros" -//============================================================================== -#ifndef BTFILTER_INTERNAL_H_ -#define BTFILTER_INTERNAL_H_ - -#include "btdefs.h" -#include "athdefs.h" -#include "dl_list.h" -#include "wmi.h" - -typedef enum _BT_CONTROL_ACTION_TYPE { - BT_CONTROL_ACTION_STATUS = 0, - BT_CONTROL_ACTION_PARAMS = 1 -} BT_CONTROL_ACTION_TYPE; - -typedef union _BT_CONTROL_ACTION_BUFFER { - WMI_SET_BT_STATUS_CMD AsStatusCmd; /* parameters for a status command */ - WMI_SET_BT_PARAMS_CMD AsParamCmd; /* parameters for a set params command */ - WMI_SET_BTCOEX_SCO_CONFIG_CMD scoConfigCmd; - WMI_SET_BTCOEX_A2DP_CONFIG_CMD a2dpConfigCmd; -} BT_CONTROL_ACTION_BUFFER; - -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define A_ROUND_UP_PWR2(x, align) (((int) (x) + ((align)-1)) & ~((align)-1)) - -#define MAX_BT_CONTROL_ACTION_DATA_SIZE A_ROUND_UP_PWR2(sizeof(BT_CONTROL_ACTION_BUFFER),4) /* nicely aligned */ - - /* core state flags and variables */ -typedef struct _BT_FILTER_CORE_STATE { - A_UINT16 SCO_ConnectionHandle; - A_UINT16 ACL_ConnectionHandle; - A_UINT16 eSCO_ConnectionHandle; - A_UINT32 StateBitMap; - A_UINT8 AVDTP_state; - A_UINT8 RFCOMM_state; - A_UINT16 AVDTP_SOURCE_CID; - A_UINT16 AVDTP_DESTINATION_CID; - A_UINT16 RFCOMM_SOURCE_CID; - A_UINT16 RFCOMM_DESTINATION_CID; - A_UINT32 btFilterFlags; -} BT_FILTER_CORE_STATE; - -#define BT_ACTION_STRING_MAX_LENGTH 64 /* maximum action string length */ -#define BT_ACTION_MAX_ARGS 18 /* maximum number of numberic arguments */ - -#define BT_CA_DESC_FLAGS_ALLOCATED (1 << 0) - - /* a control action descriptor */ -typedef struct _BT_CONTROL_ACTION_DESC { - A_CHAR *pActionString; /* action string (described below) */ - A_UINT32 Flags; /* flags for this entry */ - struct _BT_CONTROL_ACTION_DESC *pNext; /* link to next action */ -} BT_CONTROL_ACTION_DESC; - - /* control action descriptor containing actions for each state */ -typedef struct _BT_CONTROL_ACTION_DESC_STATE { - BT_CONTROL_ACTION_DESC Action[STATE_MAX]; -} BT_CONTROL_ACTION_DESC_STATE; - - -/* ACTION strings: - * The BT control actions are described in string format. The string is parsed for parameters - * (based on tags and order) and the parameter list passed to a function that assembles the WMI - * commands (status or params) to issue. - * - * The string format is selected to follow the command line ordering from the WMI config application. - * - * - * BT STATUS: - * "-s " - * - * BT PARAM SCO: - * "-pSCO - * " - * - * BT PARAM A2DP: - * "-pA2DP " - * - * BT PARAM MISC - WLAN Tx Protection: - * "-pMISC_TxProtect " - * - * BT PARAM MISC - Coex Policy: - * "-pMISC_Coex " - * - * BT PARAM REGISTERS : - * "-pREGS " - * - * A string may contain multiple commands delimited by a continuation character ';' . For example: - * - * "-pA2DP 100 40 1 ; -s 2 1" - * - * Would issue a BT PARAM-A2DP command followed by a BT STATUS command. - * - */ - -typedef struct _BT_CONTROL_ACTION { - BT_CONTROL_ACTION_TYPE Type; /* the action type (i.e. status, params) */ - A_UCHAR Buffer[MAX_BT_CONTROL_ACTION_DATA_SIZE]; /* buffer holding parameters */ - int Length; /* length of parameters */ -} BT_CONTROL_ACTION; - -typedef struct _BT_CONTROL_ACTION_ITEM { - DL_LIST ListEntry; - BT_CONTROL_ACTION ControlAction; -} BT_CONTROL_ACTION_ITEM; - - /* BT Core state blob */ -typedef struct _BT_FILTER_CORE_INFO { - BT_FILTER_CORE_STATE FilterState; - A_UINT32 StateFilterIgnore; /* bitmap of state to ignore*/ - BT_CONTROL_ACTION_DESC_STATE ActionDescriptors[ATH_BT_MAX_STATE_INDICATION]; - DL_LIST ActionListsState[ATH_BT_MAX_STATE_INDICATION][STATE_MAX]; -} BT_FILTER_CORE_INFO; - -/* filter core APIs called by the OS adaptation layer */ - -A_BOOL FCore_Init(BT_FILTER_CORE_INFO *pCore); -void FCore_Cleanup(BT_FILTER_CORE_INFO *pCore); -void FCore_ResetActionDescriptors(BT_FILTER_CORE_INFO *pCore); - -/* filter BT commands and events and extract current BT radio state - * ***** NOTE: the caller must protect this function with locks to protect internal - * state. This is however stack dependent. Some stacks may serialize HCI command and - * event processing. Some may allow these two operations to overlap. - */ -ATHBT_STATE_INDICATION FCore_FilterBTCommand(BT_FILTER_CORE_INFO *pCore, A_UINT8 *pBuffer, int Length, ATHBT_STATE *pNewState); -ATHBT_STATE_INDICATION FCore_FilterBTEvent(BT_FILTER_CORE_INFO *pCore, A_UINT8 *pBuffer, int Length, ATHBT_STATE *pNewState); - -/* filter ACL IN and OUT data to obtain BT application states - * ***** NOTE: the caller must protect this function with locks to protect internal - * state. - */ -ATHBT_STATE_INDICATION FCore_FilterACLDataOut(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState); - -ATHBT_STATE_INDICATION FCore_FilterACLDataIn(BT_FILTER_CORE_INFO *pCore, - A_UINT8 *pBuffer, - int Length, - ATHBT_STATE *pNewState); - -/* core state reset, usually called when the WLAN side goes away */ -#define FCore_ResetState(p) /* doesn't do anything now */ - -/* get the action list tem for this state indication - * The caller should pass pStart=NULL to obtain the first item. Then using each item returned, - * the caller can set pStart to that item and obtain the *next* item */ -BT_CONTROL_ACTION_ITEM *FCore_GetControlAction(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - BT_CONTROL_ACTION_ITEM *pStart); - -A_STATUS FCore_RefreshActionList(BT_FILTER_CORE_INFO *pCore); - -/* called to indicate the precise state of the BT radio when determined by external means */ -ATHBT_STATE_INDICATION FCore_FilterIndicatePreciseState(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - ATHBT_STATE *pNewState); - -A_UINT32 FCore_GetCurrentBTStateBitMap(BT_FILTER_CORE_INFO *pCore); - -typedef enum _ATHBT_MODIFY_CONTROL_ACTION { - ATHBT_MODIFY_CONTROL_ACTION_NOOP, - ATHBT_MODIFY_CONTROL_ACTION_APPEND, - ATHBT_MODIFY_CONTROL_ACTION_REPLACE -} ATHBT_MODIFY_CONTROL_ACTION; - -/* called to modify a control action string (Replace or Append) */ -A_STATUS FCore_ModifyControlActionString(BT_FILTER_CORE_INFO *pCore, - ATHBT_STATE_INDICATION Indication, - ATHBT_STATE State, - A_CHAR *pAction, - int StringLength, - ATHBT_MODIFY_CONTROL_ACTION ModifyAction); - - -#endif /*BTFILTER_INTERNAL_H_*/ - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/hciutils.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/hciutils.h deleted file mode 100644 index 728776401615..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/hciutils.h +++ /dev/null @@ -1,103 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2011 Atheros Corporation. All rights reserved. -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -//------------------------------------------------------------------------------ -//============================================================================== - -#ifndef __HCI_UTILS_H__ -#define __HCI_UTILS_H__ - - -// -// Return codes -// -typedef enum -{ - HCIUTILS_SUCCESS, // Success - HCIUTILS_FAILURE, // Generic Failure - HCIUTILS_ALREADY_REGISTERED, // Filter already registered - HCIUTILS_OUT_OF_MEMORY //out of memory -}tHCIUTILS_STATUS; - -// -// Notification Type - Or to get notification for both types -// -typedef enum -{ - HCIUTILS_COMMAND=0x1, - HCIUTILS_EVENT =0x2 -}tHCIUTILS_NOTIFICATION_TYPE; - -// -// OpCode to get notifications for all hci commands and events -// -#define HCIUTILS_NOTIFICATION_OPCODE_ALL 0xffff - -typedef struct -{ - tHCIUTILS_NOTIFICATION_TYPE tType; - unsigned short nOpCode; - void * p_notification_data_buf; - int n_data_length; - void * p_appdata; -}tHCIUTILS_NOTIFICATION; - -typedef void ( *tHCIUTILS_EVENT_CALLBACK) ( tHCIUTILS_NOTIFICATION * pEvent); - -tHCIUTILS_STATUS HCIUTILS_RegisterHCINotification - ( - tHCIUTILS_NOTIFICATION_TYPE t_type, - unsigned short nOpCode, - tHCIUTILS_EVENT_CALLBACK eventCallback , - void * p_appdata - ); - -void HCIUTILS_UnRegisterHCINotification - ( - tHCIUTILS_NOTIFICATION_TYPE t_type, - unsigned short nOpCode - ); - -typedef enum -{ - HCIUTILS_SET_AFH_CHANNELS = 0x01, - HCIUTILS_SET_AFH_CHANNEL_ASSESSMENT - -}tHCIUTILS_HCI_CMD; - -typedef struct -{ - unsigned char first; - unsigned char last; -}tHCIUTILS_HCICMD_SET_AFH_CHANNELS; - -typedef struct -{ - int enable_or_disable; -}tHCIUTILS_HCICMD_SET_AFH_CHANNEL_ASSESSMENT; - - -void HCIUTILS_SendCmd - ( - tHCIUTILS_HCI_CMD tCmd, - void * p_hci_cmd_params - ); - - -#endif //__HCI_UTILS_H__ - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/sample.conf b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/sample.conf deleted file mode 100644 index 870c351c2e5c..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/sample.conf +++ /dev/null @@ -1 +0,0 @@ -INQUIRY-OFF:REPLACE:-s 2 2 diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthmonoheadset.py b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthmonoheadset.py deleted file mode 100644 index 2d362153fc18..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthmonoheadset.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/python - -import dbus -import os -import sys - -def printusage(): - print 'bthmonoheadset.py ' - print ' create - create a mono headset' - print ' start - connect and play ' - print ' stop - stop and disconnect' - return - -headsetAddress = os.getenv("BTMONO_HEADSET") - -print 'BT Mono Headset Is : => %s' % headsetAddress - -bus = dbus.SystemBus() -manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager') -bus_id = manager.ActivateService('audio') -audio = dbus.Interface(bus.get_object(bus_id, '/org/bluez/audio'), 'org.bluez.audio.Manager') - -if len(sys.argv) == 1 : - printusage() -elif len(sys.argv) > 1 and sys.argv[1] == 'create' : - path = audio.CreateHeadset(headsetAddress) - audio.ChangeDefaultHeadset(path) - headset = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Headset') - headset.Connect() - print 'Mono headset setup complete' -elif len(sys.argv) > 1 and sys.argv[1] == 'start' : - path = audio.DefaultDevice() - headset = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Headset') - if not headset.IsConnected() : - headset.Connect() - if len(sys.argv) > 2 and sys.argv[2] == 'pcm' : - print "Turning on PCM ...." - try : - headset.Play() - except dbus.exceptions.DBusException: - print 'Play Failed' -elif len(sys.argv) > 1 and sys.argv[1] == 'stop' : - path = audio.DefaultDevice() - headset = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Headset') - try : - headset.Stop() - except dbus.exceptions.DBusException: - print 'Stop Failed' - headset.Disconnect() - print 'Mono headset disconnect complete' -elif len(sys.argv) > 1 and sys.argv[1] == 'delete' : - path = audio.DefaultDevice() - print 'Deleting: %s ' % path - audio.RemoveDevice(path) - - - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthstereoheadset.py b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthstereoheadset.py deleted file mode 100644 index 87ff4ec9ed1d..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/bthstereoheadset.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python - -import dbus -import os -import sys - -def printusage(): - print 'bthstereoheadset.py ' - print ' create - create a stereo headset' - print ' start - connect sink' - print ' stop - disconnect sink' - return - -headsetAddress = os.getenv("BTSTEREO_HEADSET") - -print 'BT Stereo Headset Is : => %s' % headsetAddress - -bus = dbus.SystemBus() -manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager') -bus_id = manager.ActivateService('audio') -audio = dbus.Interface(bus.get_object(bus_id, '/org/bluez/audio'), 'org.bluez.audio.Manager') - -if len(sys.argv) == 1 : - printusage() -elif len(sys.argv) > 1 and sys.argv[1] == 'create' : - path = audio.CreateDevice(headsetAddress) - audio.ChangeDefaultDevice(path) - sink = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Sink') - sink.Connect() - print 'Stereo Headset Connect Done' -elif len(sys.argv) > 1 and sys.argv[1] == 'start' : - path = audio.DefaultDevice() - sink = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Sink') - if not sink.IsConnected() : - sink.Connect() - print 'Audio connected' -elif len(sys.argv) > 1 and sys.argv[1] == 'stop' : - path = audio.DefaultDevice() - sink = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Sink') - try : - sink.Disconnect() - except dbus.exceptions.DBusException: - print 'Disconnect Failed' - print 'Stereo headset disconnect complete' -elif len(sys.argv) > 1 and sys.argv[1] == 'delete' : - path = audio.DefaultDevice() - print 'Deleting: %s ' % path - audio.RemoveDevice(path) - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btmonoloop.sh b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btmonoloop.sh deleted file mode 100644 index 35900e64a89b..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btmonoloop.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -arecord -D bluetooth -f S16_LE | aplay -D bluetooth -f S16_LE - - - - - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btplaywav.sh b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btplaywav.sh deleted file mode 100644 index e79e816f9887..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/btplaywav.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -aplay -D bluetooth $1 - - - - - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/fc9_setup_readme.txt b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/fc9_setup_readme.txt deleted file mode 100644 index 24382f2eaac8..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/fc9_setup_readme.txt +++ /dev/null @@ -1,165 +0,0 @@ -This document provides setup instructions for setting up and testing bluetooth on -a Fedora Core 9 system. - -9/25/2008 - - -Setting up Fedora Core 9 -======================== - -You can try to install FC9 via a DVD onto a hard-drive based system or -create a liveUSB disk (if you use the same PC for testing other versions of -linux). - - -Install to HD from DVD install: - - You can install FC9 from here: http://fedoraproject.org/get-fedora - - -Install FC9-liveCD to USB disk (create a liveUSB): - - **** MAKE SURE YOUR PC CAN BOOT TO USB DISKS, older PCs may not support this in their BIOS ****** - - A 4GB USB drive will be sufficient although 8GB is recommended. - - **** Limitations: - Using LiveUSB has some limitations: - 1. USB flash drives have limited writes (typically 100,000). The swap partition is disabled on - a liveUSB. If you expect to do local compilation and editing you should use a hardisk install - or use a USB-based harddisk (laptop drive size would be okay). - 2. USB HD access is slower than USB disk. But I have not noticed any terrible slowdowns. - - *** If your USB disk has U3 support (Sandisk Cruzer), you must disable it. The disk contains a utility to disable - U3 support. As an added check, you should also re-format the drive (as FAT) after your disable U3. - - Making FAT-based USB image on Windows Host PC : - =============================================== - - A windowsPC Utility is available to install a liveCD ISO image directly onto a USB disk and make the disk - bootable. See: https://fedorahosted.org/liveusb-creator - - This method requires a liveCD ISO file for FC9. FC9 is the current version that - support LiveUSB's persistent data storage. You can install applications, new tools, SDKs etc.. - - You can find the FC9 liveCD here: - - http://fedoraproject.org/get-fedora - - When using the utility, you can setup a persistent area. I recommend at least 2GB (max). - - *********** WARNING WARNING, FAT16 is unreliable and not recommended as a liveUSB boot - disk. Newer version of the liveusb-creator now support installations and syslinux binaries for - EXT2 filesystems. I highly recommend using a liveUSB image on an EXT2 formated USB drive. - - Making Ext2-based USB image on Linux Host (for use on FC9 or later host) : - ============================================================================ - - Get the liveCD ISO image from http://fedoraproject.org/get-fedora - - Install the liveusb-creator utilities (as super user) : - - > yum install liveusb-creator - > yum --enablerepo=rawhide update syslinux - - Partition USB disk: - - > fdisk /dev/ - - <--------- fdisk interactive dump: ----> - Command (m for help): d - Selected partition 1 - - Command (m for help): n - Command action - e extended - p primary partition (1-4) - p - Partition number (1-4): 1 - First cylinder (1-960, default 1): - Using default value 1 - Last cylinder or +size or +sizeM or +sizeK (1-960, default 960): - Using default value 960 - - Command (m for help): t - Selected partition 1 - Hex code (type L to list codes): 83 - - Command (m for help): a - Partition number (1-4): 1 - - Command (m for help): w - The partition table has been altered! - - <-----------------------------------------> - - Format partition as ext2: - - > umount /dev/ - > mkfs.ext2 /dev/ - - Run liveusb-creator GUI application: - - > liveusb-creator - - Select ISO image, kernel type (FC9-i686) and persistent storage size. - - see : https://fedorahosted.org/liveusb-creator - - - -Checking and installing packages: -================================= - -To compile our SDK, certain development packages must be installed. - -Log in as superuser - -execute the following: - - yum install yum-utils rpmdevtools - yum install kernel-devel - yum install gtk2-devel - yum install dbus-glib-devel - yum install bluez-utils-gstreamer - yum install openssl-devel - yum install libpcap-devel - yum install bluez-libs-devel - yum install alsa-lib-devel - yum install dbus-devel - -Some useful utilities: - - yum install telnet-server - yum install iperf - -For compilation of newer BlueZ utilities and BlueZ stack: - - yum install byacc - yum install flex - yum install bison - - -Setting up and BUILDING OLCA -============================= - -1. Export ATH_BUILD_TYPE=LOCAL_FC9_i686 - Export ATH_BUS_TYPE=SDIO - - The default kernel path is set to: - - ATH_LINUXPATH=/lib/modules/2.6.25-14.fc9.i686/build - -2. Set your WORKAREA and build normally. - - -Testing AR6K -============ - -1. Unload sdhci (MMC-stack standard host driver) - - as root, execute "rmmod sdhci" - -2. Set NETIF, WORKAREA, ATH_PLATFORM variables and execute the load script (same procedure as FC3). - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/linux_setup_readme.txt b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/linux_setup_readme.txt deleted file mode 100644 index 95c209fbb2ef..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/testscripts/linux_setup_readme.txt +++ /dev/null @@ -1,188 +0,0 @@ -This document provides setup instructions for setting up and testing bluetooth on -a Fedora Core 9 system. - -Setting up Bluetooth Stack -========================== - -1). The following configurations can be made to /etc/bluetooth/audio.conf - - For HCI devices that use a separate PCM audio path, you must uncomment - - #SCORouting=PCM - - the default is to route audio through the HCI interface (used for USB adapters). - - If you wish to disable role switching (local radio is always master uncomment: - - #Master=true - - To enable A2DP uncomment all lines: - - #[A2DP] - #.. - #.. - -** NOTE **** - - Some linux documents indicate the use of sdpd and bluetoothd-service-audio. These are now deprecated. The hcid application - now functions as an SDP daemon (launched as "hcid -s"). The bluetoothd-service-audio is also deprecated as the hcid - application will load shared libraries (libaudio.so or audio.so) from the /usr/lib/bluetooth/plugin directory. - - -2). Setting up alsa audio devices: - - Create/edit .asoundrc at your home directory ~ - - Add the following: - - pcm.bluetooth { - type bluetooth - } - - -Testing Bluetooth -================== - -*** FC9 ships with BlueZ 3.30 pre-installed. A USB-HCI transport is available in the kernel. -Installing a USB adapter supporting the BT-USB class will automatically be recognized by the BT stack. - - -A). Preparing to add a bluetooth headset - - 1. Make sure HCI adapter is up and running - - For USB, plug in USB-BT adapter. - - For Serial HCI devices (example: csr serial on ttyS0 ): - - hciattach /dev/ttyS0 bcsp 115200 - - hciconfig -a - - 2. Log into FC9 desktop session. Select System->Preference->Internet and Network->Bluetooth - - Set radio button to "Other devices can connect". - - Leave desktop session active. You will need this to enter a pin code because the default PIN code agent is - the GNOME desktop Bluetooth applet. - - - 3. Scan for your headset device: - - > hcitool -i hci0 scan - - make note of the BT address of your headset e.g.: 00:1C:A4:2D:8D:5A - - - *** DEBUGGING BLUEZ stack *** - - You can capture BT stack debug prints (including BT-related dbus prints). - - ** the following can be done as superuser - - 1. Stop Bluetooth service : > service stop bluetooth - 2. launch hcid with debugging enabled : > /usr/sbin/hcid -x -s -n -d - - -B). Pairing Mono headset - - export the following environment variable: - - export BTMONO_HEADSET=00:1C:A4:2D:8D:5A - - run the following python script in $WORKAREA\host\tools\athbtfilter\bluez\testscripts - - > bthmonoheadset.py create - - The desktop applet will ask for a PIN code. Once the pairing has completed you should be able to see "Bonded Devices" - in the Bluetooth applet. You can make this device "TRUSTED" which will store the PIN code and will no longer - require you to input the PIN code. - - To do a quick test (only for BT adapters that route SC(see above).O over HCI): - - > bthmonoheadset.py start - > arecord -D bluetooth -f S16_LE | aplay -D bluetooth -f S16_LE - - This command records the headset microphone input and echos it back to the headset speakers. - - If you have a BT adapter that routes SCO over a PCM interface you can simply turn on the SCO path - using the following command: - - > bthmonoheadset.py start pcm - - To stop: - - > bthmonoheadset.py stop - - **** NOTE: you must configure /etc/bluetooth/audio.conf and set "SCORouting=PCM" (see above) - - You can disconnect the mono headset : - - > bthmonoheadset.py stop - -C). Pairing Stereo headset - - export the following environment variable: - - > export BTSTEREO_HEADSET=00:1C:A4:2D:8D:5A - - run the following python script in $WORKAREA\host\tools\athbtfilter\bluez\testscripts - - > bthstereoheadset.py create - - The desktop applet will ask for a PIN code. Once the pairing has completed you should be able to see "Bonded Devices" - in the Bluetooth applet. You can make this device "TRUSTED" which will store the PIN code and will no longer - require you to input the PIN code. - - To do a quick test: - > bthstereoheadset.py start - > aplay -D bluetooth - - You can disconnect the mono headset : - - > bthstereoheadset.py stop - -Testing Atheros BT Filter -========================= - - The filter resides in $WORKAREA\host\.output\$ATH_PLATFORM\image as 'abtfilt'. - - To operate as a silent daemon execute : > ./abtfilt - To operate the daemon with sysloging: > ./abtfilt -d - To operate the daemon with console logging: > ./abtfilt -c -d - To operate as an ordinary application just add -n to the command line. - - The option "-a" enables the filter to issue the AFH classification HCI command when WLAN connects. - The channel mask is derived from the 2.4 Ghz operating channel (1-14). Upon WLAN disconnect or when - WLAN is switches to 11a, the default AFH classification mask (all channels okay) is issued. - - The following table shows the AFH channel mapping for channels 1-14, channel 0 is a special case - (WLAN disconnected or not operating in 2.4 Ghz band). The channel map is read LSB to the far left - to MSB to the far right and covers the 10 octets defined in the BT specification for the AFH - map. - - LSB ------------------------------------------> MSB - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 0 -- no WLAN */ - { {0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 1 */ - { {0x0F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 2 */ - { {0xFF,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 3 */ - { {0xFF,0x3F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x7F}}, /* 4 */ - { {0xFF,0xFF,0x07,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x7F}}, /* 5 */ - { {0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x7F}}, /* 6 */ - { {0xFF,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x7F}}, /* 7 */ - { {0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFE,0xFF,0x7F}}, /* 8 */ - { {0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0xC0,0xFF,0x7F}}, /* 9 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF8,0x7F}}, /* 10 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x7F}}, /* 11 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x60}}, /* 12 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00}}, /* 13 */ - { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}}, /* 14 */ - - - - - - - - - diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/wireless.h b/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/wireless.h deleted file mode 100644 index 76cca2a6edfa..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/bluez/wireless.h +++ /dev/null @@ -1,1121 +0,0 @@ -/* - * This file define a set of standard wireless extensions - * - * Version : 21 14.3.06 - * - * Authors : Jean Tourrilhes - HPL - - * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved. - */ - -#ifndef _LINUX_WIRELESS_H_LCL -#define _LINUX_WIRELESS_H_LCL - -/************************** DOCUMENTATION **************************/ -/* - * Initial APIs (1996 -> onward) : - * ----------------------------- - * Basically, the wireless extensions are for now a set of standard ioctl - * call + /proc/net/wireless - * - * The entry /proc/net/wireless give statistics and information on the - * driver. - * This is better than having each driver having its entry because - * its centralised and we may remove the driver module safely. - * - * Ioctl are used to configure the driver and issue commands. This is - * better than command line options of insmod because we may want to - * change dynamically (while the driver is running) some parameters. - * - * The ioctl mechanimsm are copied from standard devices ioctl. - * We have the list of command plus a structure descibing the - * data exchanged... - * Note that to add these ioctl, I was obliged to modify : - * # net/core/dev.c (two place + add include) - * # net/ipv4/af_inet.c (one place + add include) - * - * /proc/net/wireless is a copy of /proc/net/dev. - * We have a structure for data passed from the driver to /proc/net/wireless - * Too add this, I've modified : - * # net/core/dev.c (two other places) - * # include/linux/netdevice.h (one place) - * # include/linux/proc_fs.h (one place) - * - * New driver API (2002 -> onward) : - * ------------------------------- - * This file is only concerned with the user space API and common definitions. - * The new driver API is defined and documented in : - * # include/net/iw_handler.h - * - * Note as well that /proc/net/wireless implementation has now moved in : - * # net/core/wireless.c - * - * Wireless Events (2002 -> onward) : - * -------------------------------- - * Events are defined at the end of this file, and implemented in : - * # net/core/wireless.c - * - * Other comments : - * -------------- - * Do not add here things that are redundant with other mechanisms - * (drivers init, ifconfig, /proc/net/dev, ...) and with are not - * wireless specific. - * - * These wireless extensions are not magic : each driver has to provide - * support for them... - * - * IMPORTANT NOTE : As everything in the kernel, this is very much a - * work in progress. Contact me if you have ideas of improvements... - */ - -/***************************** INCLUDES *****************************/ - -/* This header is used in user-space, therefore need to be sanitised - * for that purpose. Those includes are usually not compatible with glibc. - * To know which includes to use in user-space, check iwlib.h. */ -#ifdef __KERNEL__ -#include /* for "caddr_t" et al */ -#include /* for "struct sockaddr" et al */ -#include /* for IFNAMSIZ and co... */ -#endif /* __KERNEL__ */ - -/***************************** VERSION *****************************/ -/* - * This constant is used to know the availability of the wireless - * extensions and to know which version of wireless extensions it is - * (there is some stuff that will be added in the future...) - * I just plan to increment with each new version. - */ -#undef WIRELESS_EXT -#define WIRELESS_EXT 21 - -/* - * Changes : - * - * V2 to V3 - * -------- - * Alan Cox start some incompatibles changes. I've integrated a bit more. - * - Encryption renamed to Encode to avoid US regulation problems - * - Frequency changed from float to struct to avoid problems on old 386 - * - * V3 to V4 - * -------- - * - Add sensitivity - * - * V4 to V5 - * -------- - * - Missing encoding definitions in range - * - Access points stuff - * - * V5 to V6 - * -------- - * - 802.11 support (ESSID ioctls) - * - * V6 to V7 - * -------- - * - define IW_ESSID_MAX_SIZE and IW_MAX_AP - * - * V7 to V8 - * -------- - * - Changed my e-mail address - * - More 802.11 support (nickname, rate, rts, frag) - * - List index in frequencies - * - * V8 to V9 - * -------- - * - Support for 'mode of operation' (ad-hoc, managed...) - * - Support for unicast and multicast power saving - * - Change encoding to support larger tokens (>64 bits) - * - Updated iw_params (disable, flags) and use it for NWID - * - Extracted iw_point from iwreq for clarity - * - * V9 to V10 - * --------- - * - Add PM capability to range structure - * - Add PM modifier : MAX/MIN/RELATIVE - * - Add encoding option : IW_ENCODE_NOKEY - * - Add TxPower ioctls (work like TxRate) - * - * V10 to V11 - * ---------- - * - Add WE version in range (help backward/forward compatibility) - * - Add retry ioctls (work like PM) - * - * V11 to V12 - * ---------- - * - Add SIOCSIWSTATS to get /proc/net/wireless programatically - * - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space - * - Add new statistics (frag, retry, beacon) - * - Add average quality (for user space calibration) - * - * V12 to V13 - * ---------- - * - Document creation of new driver API. - * - Extract union iwreq_data from struct iwreq (for new driver API). - * - Rename SIOCSIWNAME as SIOCSIWCOMMIT - * - * V13 to V14 - * ---------- - * - Wireless Events support : define struct iw_event - * - Define additional specific event numbers - * - Add "addr" and "param" fields in union iwreq_data - * - AP scanning stuff (SIOCSIWSCAN and friends) - * - * V14 to V15 - * ---------- - * - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg - * - Make struct iw_freq signed (both m & e), add explicit padding - * - Add IWEVCUSTOM for driver specific event/scanning token - * - Add IW_MAX_GET_SPY for driver returning a lot of addresses - * - Add IW_TXPOW_RANGE for range of Tx Powers - * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points - * - Add IW_MODE_MONITOR for passive monitor - * - * V15 to V16 - * ---------- - * - Increase the number of bitrates in iw_range to 32 (for 802.11g) - * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a) - * - Reshuffle struct iw_range for increases, add filler - * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses - * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support - * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy" - * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index - * - * V16 to V17 - * ---------- - * - Add flags to frequency -> auto/fixed - * - Document (struct iw_quality *)->updated, add new flags (INVALID) - * - Wireless Event capability in struct iw_range - * - Add support for relative TxPower (yick !) - * - * V17 to V18 (From Jouni Malinen ) - * ---------- - * - Add support for WPA/WPA2 - * - Add extended encoding configuration (SIOCSIWENCODEEXT and - * SIOCGIWENCODEEXT) - * - Add SIOCSIWGENIE/SIOCGIWGENIE - * - Add SIOCSIWMLME - * - Add SIOCSIWPMKSA - * - Add struct iw_range bit field for supported encoding capabilities - * - Add optional scan request parameters for SIOCSIWSCAN - * - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA - * related parameters (extensible up to 4096 parameter values) - * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE, - * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND - * - * V18 to V19 - * ---------- - * - Remove (struct iw_point *)->pointer from events and streams - * - Remove header includes to help user space - * - Increase IW_ENCODING_TOKEN_MAX from 32 to 64 - * - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros - * - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM - * - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros - * - * V20 to V21 - * ---------- - * - Remove (struct net_device *)->get_wireless_stats() - * - Change length in ESSID and NICK to strlen() instead of strlen()+1 - * - Add SIOCSIWMODUL/SIOCGIWMODUL for modulation setting - * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers - * - Add IW_POWER_SAVING power type - * - Power/Retry relative values no longer * 100000 - * - Add bitrate flags for unicast/broadcast - */ - -/**************************** CONSTANTS ****************************/ - -/* -------------------------- IOCTL LIST -------------------------- */ - -/* Wireless Identification */ -#define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */ -#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ -/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. - * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... - * Don't put the name of your driver there, it's useless. */ - -/* Basic operations */ -#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ -#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ -#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ -#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ -#define SIOCSIWMODE 0x8B06 /* set operation mode */ -#define SIOCGIWMODE 0x8B07 /* get operation mode */ -#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ -#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ - -/* Informative stuff */ -#define SIOCSIWRANGE 0x8B0A /* Unused */ -#define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ -#define SIOCSIWPRIV 0x8B0C /* Unused */ -#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ -#define SIOCSIWSTATS 0x8B0E /* Unused */ -#define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */ -/* SIOCGIWSTATS is strictly used between user space and the kernel, and - * is never passed to the driver (i.e. the driver will never see it). */ - -/* Spy support (statistics per MAC address - used for Mobile IP support) */ -#define SIOCSIWSPY 0x8B10 /* set spy addresses */ -#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ -#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */ -#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */ - -/* Access Point manipulation */ -#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ -#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ -#define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */ -#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ -#define SIOCGIWSCAN 0x8B19 /* get scanning results */ - -/* 802.11 specific support */ -#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ -#define SIOCGIWESSID 0x8B1B /* get ESSID */ -#define SIOCSIWNICKN 0x8B1C /* set node name/nickname */ -#define SIOCGIWNICKN 0x8B1D /* get node name/nickname */ -/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit - * within the 'iwreq' structure, so we need to use the 'data' member to - * point to a string in user space, like it is done for RANGE... */ - -/* Other parameters useful in 802.11 and some other devices */ -#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ -#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ -#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ -#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ -#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ -#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ -#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ -#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ -#define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */ -#define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */ - -/* Encoding stuff (scrambling, hardware security, WEP...) */ -#define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */ -#define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */ -/* Power saving stuff (power management, unicast and multicast) */ -#define SIOCSIWPOWER 0x8B2C /* set Power Management settings */ -#define SIOCGIWPOWER 0x8B2D /* get Power Management settings */ -/* Modulation bitmask */ -#define SIOCSIWMODUL 0x8B2E /* set Modulations settings */ -#define SIOCGIWMODUL 0x8B2F /* get Modulations settings */ - -/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM). - * This ioctl uses struct iw_point and data buffer that includes IE id and len - * fields. More than one IE may be included in the request. Setting the generic - * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers - * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers - * are required to report the used IE as a wireless event, e.g., when - * associating with an AP. */ -#define SIOCSIWGENIE 0x8B30 /* set generic IE */ -#define SIOCGIWGENIE 0x8B31 /* get generic IE */ - -/* WPA : IEEE 802.11 MLME requests */ -#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses - * struct iw_mlme */ -/* WPA : Authentication mode parameters */ -#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */ -#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */ - -/* WPA : Extended version of encoding configuration */ -#define SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */ -#define SIOCGIWENCODEEXT 0x8B35 /* get encoding token & mode */ - -/* WPA2 : PMKSA cache management */ -#define SIOCSIWPMKSA 0x8B36 /* PMKSA cache operation */ - -/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */ - -/* These 32 ioctl are wireless device private, for 16 commands. - * Each driver is free to use them for whatever purpose it chooses, - * however the driver *must* export the description of those ioctls - * with SIOCGIWPRIV and *must* use arguments as defined below. - * If you don't follow those rules, DaveM is going to hate you (reason : - * it make mixed 32/64bit operation impossible). - */ -#define SIOCIWFIRSTPRIV 0x8BE0 -#define SIOCIWLASTPRIV 0x8BFF -/* Previously, we were using SIOCDEVPRIVATE, but we now have our - * separate range because of collisions with other tools such as - * 'mii-tool'. - * We now have 32 commands, so a bit more space ;-). - * Also, all 'odd' commands are only usable by root and don't return the - * content of ifr/iwr to user (but you are not obliged to use the set/get - * convention, just use every other two command). More details in iwpriv.c. - * And I repeat : you are not forced to use them with iwpriv, but you - * must be compliant with it. - */ - -/* ------------------------- IOCTL STUFF ------------------------- */ - -/* The first and the last (range) */ -#define SIOCIWFIRST 0x8B00 -#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ -#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) - -/* Even : get (world access), odd : set (root access) */ -#define IW_IS_SET(cmd) (!((cmd) & 0x1)) -#define IW_IS_GET(cmd) ((cmd) & 0x1) - -/* ----------------------- WIRELESS EVENTS ----------------------- */ -/* Those are *NOT* ioctls, do not issue request on them !!! */ -/* Most events use the same identifier as ioctl requests */ - -#define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */ -#define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */ -#define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */ -#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ -#define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */ -#define IWEVGENIE 0x8C05 /* Generic IE (WPA, RSN, WMM, ..) - * (scan results); This includes id and - * length fields. One IWEVGENIE may - * contain more than one IE. Scan - * results may contain one or more - * IWEVGENIE events. */ -#define IWEVMICHAELMICFAILURE 0x8C06 /* Michael MIC failure - * (struct iw_michaelmicfailure) - */ -#define IWEVASSOCREQIE 0x8C07 /* IEs used in (Re)Association Request. - * The data includes id and length - * fields and may contain more than one - * IE. This event is required in - * Managed mode if the driver - * generates its own WPA/RSN IE. This - * should be sent just before - * IWEVREGISTERED event for the - * association. */ -#define IWEVASSOCRESPIE 0x8C08 /* IEs used in (Re)Association - * Response. The data includes id and - * length fields and may contain more - * than one IE. This may be sent - * between IWEVASSOCREQIE and - * IWEVREGISTERED events for the - * association. */ -#define IWEVPMKIDCAND 0x8C09 /* PMKID candidate for RSN - * pre-authentication - * (struct iw_pmkid_cand) */ - -#define IWEVFIRST 0x8C00 -#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) - -/* ------------------------- PRIVATE INFO ------------------------- */ -/* - * The following is used with SIOCGIWPRIV. It allow a driver to define - * the interface (name, type of data) for its private ioctl. - * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV - */ - -#define IW_PRIV_TYPE_MASK 0x7000 /* Type of arguments */ -#define IW_PRIV_TYPE_NONE 0x0000 -#define IW_PRIV_TYPE_BYTE 0x1000 /* Char as number */ -#define IW_PRIV_TYPE_CHAR 0x2000 /* Char as character */ -#define IW_PRIV_TYPE_INT 0x4000 /* 32 bits int */ -#define IW_PRIV_TYPE_FLOAT 0x5000 /* struct iw_freq */ -#define IW_PRIV_TYPE_ADDR 0x6000 /* struct sockaddr */ - -#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed number of args */ - -#define IW_PRIV_SIZE_MASK 0x07FF /* Max number of those args */ - -/* - * Note : if the number of args is fixed and the size < 16 octets, - * instead of passing a pointer we will put args in the iwreq struct... - */ - -/* ----------------------- OTHER CONSTANTS ----------------------- */ - -/* Maximum frequencies in the range struct */ -#define IW_MAX_FREQUENCIES 32 -/* Note : if you have something like 80 frequencies, - * don't increase this constant and don't fill the frequency list. - * The user will be able to set by channel anyway... */ - -/* Maximum bit rates in the range struct */ -#define IW_MAX_BITRATES 32 - -/* Maximum tx powers in the range struct */ -#define IW_MAX_TXPOWER 8 -/* Note : if you more than 8 TXPowers, just set the max and min or - * a few of them in the struct iw_range. */ - -/* Maximum of address that you may set with SPY */ -#define IW_MAX_SPY 8 - -/* Maximum of address that you may get in the - list of access points in range */ -#define IW_MAX_AP 64 - -/* Maximum size of the ESSID and NICKN strings */ -#define IW_ESSID_MAX_SIZE 32 - -/* Modes of operation */ -#define IW_MODE_AUTO 0 /* Let the driver decides */ -#define IW_MODE_ADHOC 1 /* Single cell network */ -#define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */ -#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */ -#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ -#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ -#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ - -/* Statistics flags (bitmask in updated) */ -#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */ -#define IW_QUAL_LEVEL_UPDATED 0x02 -#define IW_QUAL_NOISE_UPDATED 0x04 -#define IW_QUAL_ALL_UPDATED 0x07 -#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */ -#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */ -#define IW_QUAL_LEVEL_INVALID 0x20 -#define IW_QUAL_NOISE_INVALID 0x40 -#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */ -#define IW_QUAL_ALL_INVALID 0x70 - -/* Frequency flags */ -#define IW_FREQ_AUTO 0x00 /* Let the driver decides */ -#define IW_FREQ_FIXED 0x01 /* Force a specific value */ - -/* Maximum number of size of encoding token available - * they are listed in the range structure */ -#define IW_MAX_ENCODING_SIZES 8 - -/* Maximum size of the encoding token in bytes */ -#define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */ - -/* Flags for encoding (along with the token) */ -#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ -#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ -#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ -#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ -#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ -#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ -#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ -#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ -#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ - -/* Power management flags available (along with the value, if any) */ -#define IW_POWER_ON 0x0000 /* No details... */ -#define IW_POWER_TYPE 0xF000 /* Type of parameter */ -#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ -#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ -#define IW_POWER_SAVING 0x4000 /* Value is relative (how aggressive)*/ -#define IW_POWER_MODE 0x0F00 /* Power Management mode */ -#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ -#define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */ -#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ -#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ -#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ -#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */ -#define IW_POWER_MIN 0x0001 /* Value is a minimum */ -#define IW_POWER_MAX 0x0002 /* Value is a maximum */ -#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ - -/* Transmit Power flags available */ -#define IW_TXPOW_TYPE 0x00FF /* Type of value */ -#define IW_TXPOW_DBM 0x0000 /* Value is in dBm */ -#define IW_TXPOW_MWATT 0x0001 /* Value is in mW */ -#define IW_TXPOW_RELATIVE 0x0002 /* Value is in arbitrary units */ -#define IW_TXPOW_RANGE 0x1000 /* Range of value between min/max */ - -/* Retry limits and lifetime flags available */ -#define IW_RETRY_ON 0x0000 /* No details... */ -#define IW_RETRY_TYPE 0xF000 /* Type of parameter */ -#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/ -#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */ -#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */ -#define IW_RETRY_MIN 0x0001 /* Value is a minimum */ -#define IW_RETRY_MAX 0x0002 /* Value is a maximum */ -#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ -#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */ -#define IW_RETRY_LONG 0x0020 /* Value is for long packets */ - -/* Scanning request flags */ -#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */ -#define IW_SCAN_ALL_ESSID 0x0001 /* Scan all ESSIDs */ -#define IW_SCAN_THIS_ESSID 0x0002 /* Scan only this ESSID */ -#define IW_SCAN_ALL_FREQ 0x0004 /* Scan all Frequencies */ -#define IW_SCAN_THIS_FREQ 0x0008 /* Scan only this Frequency */ -#define IW_SCAN_ALL_MODE 0x0010 /* Scan all Modes */ -#define IW_SCAN_THIS_MODE 0x0020 /* Scan only this Mode */ -#define IW_SCAN_ALL_RATE 0x0040 /* Scan all Bit-Rates */ -#define IW_SCAN_THIS_RATE 0x0080 /* Scan only this Bit-Rate */ -/* struct iw_scan_req scan_type */ -#define IW_SCAN_TYPE_ACTIVE 0 -#define IW_SCAN_TYPE_PASSIVE 1 -/* Maximum size of returned data */ -#define IW_SCAN_MAX_DATA 4096 /* In bytes */ - -/* Max number of char in custom event - use multiple of them if needed */ -#define IW_CUSTOM_MAX 256 /* In bytes */ - -/* Generic information element */ -#define IW_GENERIC_IE_MAX 1024 - -/* MLME requests (SIOCSIWMLME / struct iw_mlme) */ -#define IW_MLME_DEAUTH 0 -#define IW_MLME_DISASSOC 1 - -/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */ -#define IW_AUTH_INDEX 0x0FFF -#define IW_AUTH_FLAGS 0xF000 -/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095) - * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the - * parameter that is being set/get to; value will be read/written to - * struct iw_param value field) */ -#define IW_AUTH_WPA_VERSION 0 -#define IW_AUTH_CIPHER_PAIRWISE 1 -#define IW_AUTH_CIPHER_GROUP 2 -#define IW_AUTH_KEY_MGMT 3 -#define IW_AUTH_TKIP_COUNTERMEASURES 4 -#define IW_AUTH_DROP_UNENCRYPTED 5 -#define IW_AUTH_80211_AUTH_ALG 6 -#define IW_AUTH_WPA_ENABLED 7 -#define IW_AUTH_RX_UNENCRYPTED_EAPOL 8 -#define IW_AUTH_ROAMING_CONTROL 9 -#define IW_AUTH_PRIVACY_INVOKED 10 - -/* IW_AUTH_WPA_VERSION values (bit field) */ -#define IW_AUTH_WPA_VERSION_DISABLED 0x00000001 -#define IW_AUTH_WPA_VERSION_WPA 0x00000002 -#define IW_AUTH_WPA_VERSION_WPA2 0x00000004 - -/* IW_AUTH_PAIRWISE_CIPHER and IW_AUTH_GROUP_CIPHER values (bit field) */ -#define IW_AUTH_CIPHER_NONE 0x00000001 -#define IW_AUTH_CIPHER_WEP40 0x00000002 -#define IW_AUTH_CIPHER_TKIP 0x00000004 -#define IW_AUTH_CIPHER_CCMP 0x00000008 -#define IW_AUTH_CIPHER_WEP104 0x00000010 - -/* IW_AUTH_KEY_MGMT values (bit field) */ -#define IW_AUTH_KEY_MGMT_802_1X 1 -#define IW_AUTH_KEY_MGMT_PSK 2 - -/* IW_AUTH_80211_AUTH_ALG values (bit field) */ -#define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001 -#define IW_AUTH_ALG_SHARED_KEY 0x00000002 -#define IW_AUTH_ALG_LEAP 0x00000004 - -/* IW_AUTH_ROAMING_CONTROL values */ -#define IW_AUTH_ROAMING_ENABLE 0 /* driver/firmware based roaming */ -#define IW_AUTH_ROAMING_DISABLE 1 /* user space program used for roaming - * control */ - -/* SIOCSIWENCODEEXT definitions */ -#define IW_ENCODE_SEQ_MAX_SIZE 8 -/* struct iw_encode_ext ->alg */ -#define IW_ENCODE_ALG_NONE 0 -#define IW_ENCODE_ALG_WEP 1 -#define IW_ENCODE_ALG_TKIP 2 -#define IW_ENCODE_ALG_CCMP 3 -/* struct iw_encode_ext ->ext_flags */ -#define IW_ENCODE_EXT_TX_SEQ_VALID 0x00000001 -#define IW_ENCODE_EXT_RX_SEQ_VALID 0x00000002 -#define IW_ENCODE_EXT_GROUP_KEY 0x00000004 -#define IW_ENCODE_EXT_SET_TX_KEY 0x00000008 - -/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */ -#define IW_MICFAILURE_KEY_ID 0x00000003 /* Key ID 0..3 */ -#define IW_MICFAILURE_GROUP 0x00000004 -#define IW_MICFAILURE_PAIRWISE 0x00000008 -#define IW_MICFAILURE_STAKEY 0x00000010 -#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported) - */ - -/* Bit field values for enc_capa in struct iw_range */ -#define IW_ENC_CAPA_WPA 0x00000001 -#define IW_ENC_CAPA_WPA2 0x00000002 -#define IW_ENC_CAPA_CIPHER_TKIP 0x00000004 -#define IW_ENC_CAPA_CIPHER_CCMP 0x00000008 - -/* Event capability macros - in (struct iw_range *)->event_capa - * Because we have more than 32 possible events, we use an array of - * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ -#define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \ - (cmd - SIOCIWFIRSTPRIV + 0x60) : \ - (cmd - SIOCSIWCOMMIT)) -#define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5) -#define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) -/* Event capability constants - event autogenerated by the kernel - * This list is valid for most 802.11 devices, customise as needed... */ -#define IW_EVENT_CAPA_K_0 (IW_EVENT_CAPA_MASK(0x8B04) | \ - IW_EVENT_CAPA_MASK(0x8B06) | \ - IW_EVENT_CAPA_MASK(0x8B1A)) -#define IW_EVENT_CAPA_K_1 (IW_EVENT_CAPA_MASK(0x8B2A)) -/* "Easy" macro to set events in iw_range (less efficient) */ -#define IW_EVENT_CAPA_SET(event_capa, cmd) (event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd)) -#define IW_EVENT_CAPA_SET_KERNEL(event_capa) {event_capa[0] |= IW_EVENT_CAPA_K_0; event_capa[1] |= IW_EVENT_CAPA_K_1; } - -/* Modulations bitmasks */ -#define IW_MODUL_ALL 0x00000000 /* Everything supported */ -#define IW_MODUL_FH 0x00000001 /* Frequency Hopping */ -#define IW_MODUL_DS 0x00000002 /* Original Direct Sequence */ -#define IW_MODUL_CCK 0x00000004 /* 802.11b : 5.5 + 11 Mb/s */ -#define IW_MODUL_11B (IW_MODUL_DS | IW_MODUL_CCK) -#define IW_MODUL_PBCC 0x00000008 /* TI : 5.5 + 11 + 22 Mb/s */ -#define IW_MODUL_OFDM_A 0x00000010 /* 802.11a : 54 Mb/s */ -#define IW_MODUL_11A (IW_MODUL_OFDM_A) -#define IW_MODUL_11AB (IW_MODUL_11B | IW_MODUL_11A) -#define IW_MODUL_OFDM_G 0x00000020 /* 802.11g : 54 Mb/s */ -#define IW_MODUL_11G (IW_MODUL_11B | IW_MODUL_OFDM_G) -#define IW_MODUL_11AG (IW_MODUL_11G | IW_MODUL_11A) -#define IW_MODUL_TURBO 0x00000040 /* ATH : bonding, 108 Mb/s */ -/* In here we should define MIMO stuff. Later... */ -#define IW_MODUL_CUSTOM 0x40000000 /* Driver specific */ - -/* Bitrate flags available */ -#define IW_BITRATE_TYPE 0x00FF /* Type of value */ -#define IW_BITRATE_UNICAST 0x0001 /* Maximum/Fixed unicast bitrate */ -#define IW_BITRATE_BROADCAST 0x0002 /* Fixed broadcast bitrate */ - -/****************************** TYPES ******************************/ - -/* --------------------------- SUBTYPES --------------------------- */ -/* - * Generic format for most parameters that fit in an int - */ -struct iw_param -{ - __s32 value; /* The value of the parameter itself */ - __u8 fixed; /* Hardware should not use auto select */ - __u8 disabled; /* Disable the feature */ - __u16 flags; /* Various specifc flags (if any) */ -}; - -/* - * For all data larger than 16 octets, we need to use a - * pointer to memory allocated in user space. - */ -struct iw_point -{ - void __user *pointer; /* Pointer to the data (in user space) */ - __u16 length; /* number of fields or size in bytes */ - __u16 flags; /* Optional params */ -}; - -/* - * A frequency - * For numbers lower than 10^9, we encode the number in 'm' and - * set 'e' to 0 - * For number greater than 10^9, we divide it by the lowest power - * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... - * The power of 10 is in 'e', the result of the division is in 'm'. - */ -struct iw_freq -{ - __s32 m; /* Mantissa */ - __s16 e; /* Exponent */ - __u8 i; /* List index (when in range struct) */ - __u8 flags; /* Flags (fixed/auto) */ -}; - -/* - * Quality of the link - */ -struct iw_quality -{ - __u8 qual; /* link quality (%retries, SNR, - %missed beacons or better...) */ - __u8 level; /* signal level (dBm) */ - __u8 noise; /* noise level (dBm) */ - __u8 updated; /* Flags to know if updated */ -}; - -/* - * Packet discarded in the wireless adapter due to - * "wireless" specific problems... - * Note : the list of counter and statistics in net_device_stats - * is already pretty exhaustive, and you should use that first. - * This is only additional stats... - */ -struct iw_discarded -{ - __u32 nwid; /* Rx : Wrong nwid/essid */ - __u32 code; /* Rx : Unable to code/decode (WEP) */ - __u32 fragment; /* Rx : Can't perform MAC reassembly */ - __u32 retries; /* Tx : Max MAC retries num reached */ - __u32 misc; /* Others cases */ -}; - -/* - * Packet/Time period missed in the wireless adapter due to - * "wireless" specific problems... - */ -struct iw_missed -{ - __u32 beacon; /* Missed beacons/superframe */ -}; - -/* - * Quality range (for spy threshold) - */ -struct iw_thrspy -{ - struct sockaddr addr; /* Source address (hw/mac) */ - struct iw_quality qual; /* Quality of the link */ - struct iw_quality low; /* Low threshold */ - struct iw_quality high; /* High threshold */ -}; - -/* - * Optional data for scan request - * - * Note: these optional parameters are controlling parameters for the - * scanning behavior, these do not apply to getting scan results - * (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and - * provide a merged results with all BSSes even if the previous scan - * request limited scanning to a subset, e.g., by specifying an SSID. - * Especially, scan results are required to include an entry for the - * current BSS if the driver is in Managed mode and associated with an AP. - */ -struct iw_scan_req -{ - __u8 scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */ - __u8 essid_len; - __u8 num_channels; /* num entries in channel_list; - * 0 = scan all allowed channels */ - __u8 flags; /* reserved as padding; use zero, this may - * be used in the future for adding flags - * to request different scan behavior */ - struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or - * individual address of a specific BSS */ - - /* - * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using - * the current ESSID. This allows scan requests for specific ESSID - * without having to change the current ESSID and potentially breaking - * the current association. - */ - __u8 essid[IW_ESSID_MAX_SIZE]; - - /* - * Optional parameters for changing the default scanning behavior. - * These are based on the MLME-SCAN.request from IEEE Std 802.11. - * TU is 1.024 ms. If these are set to 0, driver is expected to use - * reasonable default values. min_channel_time defines the time that - * will be used to wait for the first reply on each channel. If no - * replies are received, next channel will be scanned after this. If - * replies are received, total time waited on the channel is defined by - * max_channel_time. - */ - __u32 min_channel_time; /* in TU */ - __u32 max_channel_time; /* in TU */ - - struct iw_freq channel_list[IW_MAX_FREQUENCIES]; -}; - -/* ------------------------- WPA SUPPORT ------------------------- */ - -/* - * Extended data structure for get/set encoding (this is used with - * SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_* - * flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and - * only the data contents changes (key data -> this structure, including - * key data). - * - * If the new key is the first group key, it will be set as the default - * TX key. Otherwise, default TX key index is only changed if - * IW_ENCODE_EXT_SET_TX_KEY flag is set. - * - * Key will be changed with SIOCSIWENCODEEXT in all cases except for - * special "change TX key index" operation which is indicated by setting - * key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY. - * - * tx_seq/rx_seq are only used when respective - * IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal - * TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start - * TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally - * used only by an Authenticator (AP or an IBSS station) to get the - * current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and - * RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for - * debugging/testing. - */ -struct iw_encode_ext -{ - __u32 ext_flags; /* IW_ENCODE_EXT_* */ - __u8 tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ - __u8 rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ - struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast - * (group) keys or unicast address for - * individual keys */ - __u16 alg; /* IW_ENCODE_ALG_* */ - __u16 key_len; - __u8 key[0]; -}; - -/* SIOCSIWMLME data */ -struct iw_mlme -{ - __u16 cmd; /* IW_MLME_* */ - __u16 reason_code; - struct sockaddr addr; -}; - -/* SIOCSIWPMKSA data */ -#define IW_PMKSA_ADD 1 -#define IW_PMKSA_REMOVE 2 -#define IW_PMKSA_FLUSH 3 - -#define IW_PMKID_LEN 16 - -struct iw_pmksa -{ - __u32 cmd; /* IW_PMKSA_* */ - struct sockaddr bssid; - __u8 pmkid[IW_PMKID_LEN]; -}; - -/* IWEVMICHAELMICFAILURE data */ -struct iw_michaelmicfailure -{ - __u32 flags; - struct sockaddr src_addr; - __u8 tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ -}; - -/* IWEVPMKIDCAND data */ -#define IW_PMKID_CAND_PREAUTH 0x00000001 /* RNS pre-authentication enabled */ -struct iw_pmkid_cand -{ - __u32 flags; /* IW_PMKID_CAND_* */ - __u32 index; /* the smaller the index, the higher the - * priority */ - struct sockaddr bssid; -}; - -/* ------------------------ WIRELESS STATS ------------------------ */ -/* - * Wireless statistics (used for /proc/net/wireless) - */ -struct iw_statistics -{ - __u16 status; /* Status - * - device dependent for now */ - - struct iw_quality qual; /* Quality of the link - * (instant/mean/max) */ - struct iw_discarded discard; /* Packet discarded counts */ - struct iw_missed miss; /* Packet missed counts */ -}; - -/* ------------------------ IOCTL REQUEST ------------------------ */ -/* - * This structure defines the payload of an ioctl, and is used - * below. - * - * Note that this structure should fit on the memory footprint - * of iwreq (which is the same as ifreq), which mean a max size of - * 16 octets = 128 bits. Warning, pointers might be 64 bits wide... - * You should check this when increasing the structures defined - * above in this file... - */ -union iwreq_data -{ - /* Config - generic */ - char name[IFNAMSIZ]; - /* Name : used to verify the presence of wireless extensions. - * Name of the protocol/provider... */ - - struct iw_point essid; /* Extended network name */ - struct iw_param nwid; /* network id (or domain - the cell) */ - struct iw_freq freq; /* frequency or channel : - * 0-1000 = channel - * > 1000 = frequency in Hz */ - - struct iw_param sens; /* signal level threshold */ - struct iw_param bitrate; /* default bit rate */ - struct iw_param txpower; /* default transmit power */ - struct iw_param rts; /* RTS threshold threshold */ - struct iw_param frag; /* Fragmentation threshold */ - __u32 mode; /* Operation mode */ - struct iw_param retry; /* Retry limits & lifetime */ - - struct iw_point encoding; /* Encoding stuff : tokens */ - struct iw_param power; /* PM duration/timeout */ - struct iw_quality qual; /* Quality part of statistics */ - - struct sockaddr ap_addr; /* Access point address */ - struct sockaddr addr; /* Destination address (hw/mac) */ - - struct iw_param param; /* Other small parameters */ - struct iw_point data; /* Other large parameters */ -}; - -/* - * The structure to exchange data for ioctl. - * This structure is the same as 'struct ifreq', but (re)defined for - * convenience... - * Do I need to remind you about structure size (32 octets) ? - */ -struct iwreq -{ - union - { - char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */ - } ifr_ifrn; - - /* Data part (defined just above) */ - union iwreq_data u; -}; - -/* -------------------------- IOCTL DATA -------------------------- */ -/* - * For those ioctl which want to exchange mode data that what could - * fit in the above structure... - */ - -/* - * Range of parameters - */ - -struct iw_range -{ - /* Informative stuff (to choose between different interface) */ - __u32 throughput; /* To give an idea... */ - /* In theory this value should be the maximum benchmarked - * TCP/IP throughput, because with most of these devices the - * bit rate is meaningless (overhead an co) to estimate how - * fast the connection will go and pick the fastest one. - * I suggest people to play with Netperf or any benchmark... - */ - - /* NWID (or domain id) */ - __u32 min_nwid; /* Minimal NWID we are able to set */ - __u32 max_nwid; /* Maximal NWID we are able to set */ - - /* Old Frequency (backward compat - moved lower ) */ - __u16 old_num_channels; - __u8 old_num_frequency; - - /* Wireless event capability bitmasks */ - __u32 event_capa[6]; - - /* signal level threshold range */ - __s32 sensitivity; - - /* Quality of link & SNR stuff */ - /* Quality range (link, level, noise) - * If the quality is absolute, it will be in the range [0 ; max_qual], - * if the quality is dBm, it will be in the range [max_qual ; 0]. - * Don't forget that we use 8 bit arithmetics... */ - struct iw_quality max_qual; /* Quality of the link */ - /* This should contain the average/typical values of the quality - * indicator. This should be the threshold between a "good" and - * a "bad" link (example : monitor going from green to orange). - * Currently, user space apps like quality monitors don't have any - * way to calibrate the measurement. With this, they can split - * the range between 0 and max_qual in different quality level - * (using a geometric subdivision centered on the average). - * I expect that people doing the user space apps will feedback - * us on which value we need to put in each driver... */ - struct iw_quality avg_qual; /* Quality of the link */ - - /* Rates */ - __u8 num_bitrates; /* Number of entries in the list */ - __s32 bitrate[IW_MAX_BITRATES]; /* list, in bps */ - - /* RTS threshold */ - __s32 min_rts; /* Minimal RTS threshold */ - __s32 max_rts; /* Maximal RTS threshold */ - - /* Frag threshold */ - __s32 min_frag; /* Minimal frag threshold */ - __s32 max_frag; /* Maximal frag threshold */ - - /* Power Management duration & timeout */ - __s32 min_pmp; /* Minimal PM period */ - __s32 max_pmp; /* Maximal PM period */ - __s32 min_pmt; /* Minimal PM timeout */ - __s32 max_pmt; /* Maximal PM timeout */ - __u16 pmp_flags; /* How to decode max/min PM period */ - __u16 pmt_flags; /* How to decode max/min PM timeout */ - __u16 pm_capa; /* What PM options are supported */ - - /* Encoder stuff */ - __u16 encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */ - __u8 num_encoding_sizes; /* Number of entry in the list */ - __u8 max_encoding_tokens; /* Max number of tokens */ - /* For drivers that need a "login/passwd" form */ - __u8 encoding_login_index; /* token index for login token */ - - /* Transmit power */ - __u16 txpower_capa; /* What options are supported */ - __u8 num_txpower; /* Number of entries in the list */ - __s32 txpower[IW_MAX_TXPOWER]; /* list, in bps */ - - /* Wireless Extension version info */ - __u8 we_version_compiled; /* Must be WIRELESS_EXT */ - __u8 we_version_source; /* Last update of source */ - - /* Retry limits and lifetime */ - __u16 retry_capa; /* What retry options are supported */ - __u16 retry_flags; /* How to decode max/min retry limit */ - __u16 r_time_flags; /* How to decode max/min retry life */ - __s32 min_retry; /* Minimal number of retries */ - __s32 max_retry; /* Maximal number of retries */ - __s32 min_r_time; /* Minimal retry lifetime */ - __s32 max_r_time; /* Maximal retry lifetime */ - - /* Frequency */ - __u16 num_channels; /* Number of channels [0; num - 1] */ - __u8 num_frequency; /* Number of entry in the list */ - struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */ - /* Note : this frequency list doesn't need to fit channel numbers, - * because each entry contain its channel index */ - - __u32 enc_capa; /* IW_ENC_CAPA_* bit field */ - - /* More power management stuff */ - __s32 min_pms; /* Minimal PM saving */ - __s32 max_pms; /* Maximal PM saving */ - __u16 pms_flags; /* How to decode max/min PM saving */ - - /* All available modulations for driver (hw may support less) */ - __s32 modul_capa; /* IW_MODUL_* bit field */ - - /* More bitrate stuff */ - __u32 bitrate_capa; /* Types of bitrates supported */ -}; - -/* - * Private ioctl interface information - */ - -struct iw_priv_args -{ - __u32 cmd; /* Number of the ioctl to issue */ - __u16 set_args; /* Type and number of args */ - __u16 get_args; /* Type and number of args */ - char name[IFNAMSIZ]; /* Name of the extension */ -}; - -/* ----------------------- WIRELESS EVENTS ----------------------- */ -/* - * Wireless events are carried through the rtnetlink socket to user - * space. They are encapsulated in the IFLA_WIRELESS field of - * a RTM_NEWLINK message. - */ - -/* - * A Wireless Event. Contains basically the same data as the ioctl... - */ -struct iw_event -{ - __u16 len; /* Real lenght of this stuff */ - __u16 cmd; /* Wireless IOCTL */ - union iwreq_data u; /* IOCTL fixed payload */ -}; - -/* Size of the Event prefix (including padding and alignement junk) */ -#define IW_EV_LCP_LEN (sizeof(struct iw_event) - sizeof(union iwreq_data)) -/* Size of the various events */ -#define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ) -#define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(__u32)) -#define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq)) -#define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param)) -#define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr)) -#define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality)) - -/* iw_point events are special. First, the payload (extra data) come at - * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second, - * we omit the pointer, so start at an offset. */ -#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \ - (char *) NULL) -#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \ - IW_EV_POINT_OFF) - -#endif /* _LINUX_WIRELESS_H */ diff --git a/drivers/net/wireless/ar6003/host/tools/athbtfilter/filter.sh b/drivers/net/wireless/ar6003/host/tools/athbtfilter/filter.sh deleted file mode 100644 index f2386548db3f..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/athbtfilter/filter.sh +++ /dev/null @@ -1,24 +0,0 @@ - -#!/bin/bash - -mkdir ../athbtfilter.bk -cp -r ../athbtfilter ../athbtfilter.bk - -mkdir include -mkdir host -mkdir host/include -mkdir host/os -mkdir host/os/linux -mkdir host/os/linux/include -mkdir host/tools -mkdir host/tools/athbtfilter - -mv bluez host/tools/athbtfilter - -cp Android.mk host -cp Android.mk host/tools -cp Android.mk host/tools/athbtfilter - -cp ../../include/*.h host/include -cp ../../os/linux/include/*.h host/os/linux/include -cp ../../../include/*.h include diff --git a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Android.mk b/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Android.mk deleted file mode 100644 index e05064ce93b6..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Android.mk +++ /dev/null @@ -1,39 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2010 Atheros Corporation. All rights reserved. -# -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/../../include \ - $(LOCAL_PATH)/../../os/linux/include \ - $(LOCAL_PATH)/../../../include \ - -LOCAL_CFLAGS+= -LOCAL_SRC_FILES:= debugctrl.c -LOCAL_MODULE := drvdebugctrl -LOCAL_MODULE_TAGS := debug eng optional -include $(BUILD_EXECUTABLE) - diff --git a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Makefile b/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Makefile deleted file mode 100644 index 75dffd2ae356..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC := $(ATH_CROSS_COMPILE_TYPE)gcc - -all: - $(CC) -g -Wall -I../../include -I../../os/linux/include debugctrl.c -o drvdebugctrl - \ No newline at end of file diff --git a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/debugctrl.c b/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/debugctrl.c deleted file mode 100644 index c0053ff1063d..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/drvdebugctrl/debugctrl.c +++ /dev/null @@ -1,299 +0,0 @@ - -/* - * Copyright (c) 2009 Atheros Communications Inc. - * All rights reserved. - * - * - * -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -const char *prog_name; -struct ifreq ifr; -int sock; - -char module_name[128]; - -const char cmd_args[] = -"arguments:\n\ - --module= , -m name of module (htc,bmi,wmi,wlan) \n\ - --set= , -s set the current debug mask \n\ - --setbit= , -b set a single bit (0..31) \n\ - --clrbit= , -c clear a single bit (0..31) \n\ - --dumpinfo , -d dump info for this module \n\ - --dumpall dump all registered module debug info \n\ - --interface=, -i (e.g. eth1) \n\ -\n"; - -void -usage(void) -{ - fprintf(stderr, "usage:\n%s arguments...\n", prog_name); - fprintf(stderr, "%s\n", cmd_args); - exit(1); -} - -void -do_ioctl(void *ioctl_data) -{ - ifr.ifr_data = (char *)ioctl_data; - - if (ioctl(sock, AR6000_IOCTL_EXTENDED, &ifr) < 0) { - err(1, "%s", ifr.ifr_name); - exit (1); - } -} - -void DumpModuleDebugInfo(char *name) -{ - struct debuginfocmd { - int cmd; - struct drv_debug_module_s modinfo; - } command; - - memset(&command,0,sizeof(command)); - - command.cmd = AR6000_XIOCTL_DUMP_MODULE_DEBUG_INFO; - strncpy(command.modinfo.modulename,name,sizeof(command.modinfo.modulename)); - printf("Dumping module : %s info.... \n",name); - do_ioctl(&command); -} - -void SetDebugBitMask(char *name,unsigned int mask) -{ - struct debuginfocmd { - int cmd; - struct drv_debug_module_s modinfo; - } command; - - memset(&command,0,sizeof(command)); - - command.cmd = AR6000_XIOCTL_MODULE_DEBUG_SET_MASK; - command.modinfo.mask = mask; - strncpy(command.modinfo.modulename,name,sizeof(command.modinfo.modulename)); - printf("Setting module : %s mask to: 0x%X \n", module_name, mask); - do_ioctl(&command); -} - -unsigned int GetDebugBitMask(char *name) -{ - struct debuginfocmd { - int cmd; - struct drv_debug_module_s modinfo; - } command; - - memset(&command,0,sizeof(command)); - - command.cmd = AR6000_XIOCTL_MODULE_DEBUG_GET_MASK; - strncpy(command.modinfo.modulename,name,sizeof(command.modinfo.modulename)); - do_ioctl(&command); - printf("Got module : %s mask : 0x%X \n", module_name, command.modinfo.mask); - return command.modinfo.mask; -} - -void SetDebugBitNo(char *name,unsigned int bit) -{ - unsigned int mask = GetDebugBitMask(name); - - mask |= (1 << bit); - SetDebugBitMask(name, mask); -} - -void ClearDebugBitNo(char *name,unsigned int bit) -{ - unsigned int mask = GetDebugBitMask(name); - - mask &= ~(1 << bit); - SetDebugBitMask(name, mask); -} - -typedef enum { - MASK_ACTION_NONE = 0, - MASK_ACTION_SET_MASK, - MASK_ACTION_SET_BIT, - MASK_ACTION_CLR_BIT, - MASK_ACTION_DUMP_INFO, - MASK_ACTION_DUMP_ALL_INFO -} MASK_ACTION; - -int -main (int argc, char **argv) -{ - - int c; - int gotname = 0; - MASK_ACTION action = MASK_ACTION_NONE; - unsigned int bitmask; - unsigned int bitpos; - - prog_name = argv[0]; - - if (argc == 1) { - usage(); - } - - sock = socket(AF_INET, SOCK_DGRAM, 0); - if (sock < 0) { - err(1, "socket"); - } - - memset(ifr.ifr_name, '\0', sizeof(ifr.ifr_name)); - strcpy(ifr.ifr_name, "eth1"); /* default */ - - while (1) { - int option_index = 0; - static struct option long_options[] = { - {"module", 1, NULL, 'm'}, - {"set", 1, NULL, 's'}, - {"setbit", 1, NULL, 'b'}, - {"clrbit", 1, NULL, 'c'}, - {"interface", 1, NULL, 'i'}, - {"dumpall", 0, NULL, 'a'}, - {"dumpinfo", 0, NULL, 'd'}, - {0, 0, 0, 0} - }; - - c = getopt_long (argc, argv, "m:s:b:c:i:d", - long_options, &option_index); - if (c == -1) { - break; - } - - switch (c) { - - case 'm': - { - strncpy(module_name, optarg, sizeof(module_name)); - gotname = 1; - break; - } - case 's': - { - bitmask = strtoul(optarg, NULL, 0); - action = MASK_ACTION_SET_MASK; - break; - } - - case 'b': - { - bitpos = strtoul(optarg, NULL, 0); - if (bitpos > 31) { - printf(" bit number is too high"); - break; - } - action = MASK_ACTION_SET_BIT; - break; - } - - case 'c': - { - bitpos = strtoul(optarg, NULL, 0); - if (bitpos > 31) { - printf(" bit number is too high"); - break; - } - - action = MASK_ACTION_CLR_BIT; - break; - } - - case 'a': - { - action = MASK_ACTION_DUMP_ALL_INFO; - break; - } - case 'd': - action = MASK_ACTION_DUMP_INFO; - break; - case 'i': - { - memset(ifr.ifr_name, '\0', sizeof(ifr.ifr_name)); - strncpy(ifr.ifr_name, optarg, sizeof(ifr.ifr_name)); - break; - } - - default: - { - usage(); - break; - } - } - } - - if (action == MASK_ACTION_NONE) { - usage(); - exit(1); - } - - if (action != MASK_ACTION_DUMP_ALL_INFO) { - if (!gotname) { - printf("** must specify module name\n"); - usage(); - exit(1); - } - } - - switch (action) { - - case MASK_ACTION_DUMP_ALL_INFO : - DumpModuleDebugInfo("all"); - break; - case MASK_ACTION_DUMP_INFO: - DumpModuleDebugInfo(module_name); - break; - case MASK_ACTION_CLR_BIT : - ClearDebugBitNo(module_name,bitpos); - DumpModuleDebugInfo(module_name); - break; - case MASK_ACTION_SET_BIT : - SetDebugBitNo(module_name,bitpos); - DumpModuleDebugInfo(module_name); - break; - case MASK_ACTION_SET_MASK : - SetDebugBitMask(module_name,bitmask); - DumpModuleDebugInfo(module_name); - break; - default: - break; - } - - - exit(0); -} diff --git a/drivers/net/wireless/ar6003/host/tools/recEvent/Android.mk b/drivers/net/wireless/ar6003/host/tools/recEvent/Android.mk deleted file mode 100644 index 0edeb4aca1ea..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/recEvent/Android.mk +++ /dev/null @@ -1,43 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2010 Atheros Corporation. All rights reserved. -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/../../include \ - $(LOCAL_PATH)/../../os/linux/include \ - $(LOCAL_PATH)/../../../include \ - $(LOCAL_PATH)/../../wlan/include \ - $(KERNEL_HEADER) - -LOCAL_CFLAGS+= -LOCAL_SRC_FILES:= recEvent.c dbgFormatter.c -LOCAL_MODULE := recEvent -LOCAL_MODULE_TAGS := debug eng optional -LOCAL_SHARED_LIBRARIES := libcutils - -include $(BUILD_EXECUTABLE) - - diff --git a/drivers/net/wireless/ar6003/host/tools/recEvent/Makefile b/drivers/net/wireless/ar6003/host/tools/recEvent/Makefile deleted file mode 100644 index efee70986568..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/recEvent/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2005-2007 Atheros Corporation. All rights reserved. -# -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, 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. -# -# -#------------------------------------------------------------------------------ -#============================================================================== -# Author(s): ="Atheros" -#============================================================================== -CC := $(ATH_CROSS_COMPILE_TYPE)gcc -KERNEL_SRC :=$(ATH_LINUXPATH) - -all: - $(CC) -Wall -I./ -I$(KERNEL_SRC)/include -I../../include -I../../../include -I../../wlan/include -I../../os/linux/include recEvent.c dbgFormatter.c -o recEvent diff --git a/drivers/net/wireless/ar6003/host/tools/recEvent/dbgFormatter.c b/drivers/net/wireless/ar6003/host/tools/recEvent/dbgFormatter.c deleted file mode 100644 index b4dd31c111a3..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/recEvent/dbgFormatter.c +++ /dev/null @@ -1,1790 +0,0 @@ -// -// Copyright (c) 2006 Atheros Communications Inc. -// All rights reserved. -// -// -// -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// -// -// - -/* This tool parses the recevent logs stored in the binary format - by the wince athsrc */ -#define WAPI_ENABLE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef int (*DbgCmdFormatter)(char *output, size_t len, const A_UINT8 *); -typedef int (*DbgLogFormatter)(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer); - -struct dbglog_desc { - A_INT32 oid; - const char *desc; - DbgLogFormatter formatter; -}; - -struct module_desc { - int module; - const char *name; - struct dbglog_desc *descs; - size_t len; - int bsearch; -}; - -struct wmi_id_desc { - A_INT32 oid; - const char *desc; - DbgCmdFormatter formatter; - size_t cmdSize; -}; - -#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) -#define CASE_STR_CONST(_s, _n, _val) case _n: (_val) = #_s; break -#define CASE_STR(_x, _val) case _x: (_val) = #_x; break -#define CASE_DEF_STR(_val) default: (_val) = "Unknown"; break -#define BIT_STR(_b, _l, _r, _s, _c, _v) if (((_v) & (_c)) == (_c)) (_r) += snprintf((_b)+(_r), (_l)-(_r), _s) - -#define DBG_DESC(_x) { _x, #_x, NULL } -#define DBG_DESC_FMT(_x) { _x, #_x, _x ## _fmt } - -#define WM_ID_DESC(_x) { _x, #_x, NULL, 0 } -#define WM_ID_DESC_FMT(_x, s) { _x, #_x, _x ## _fmt, s } - -#define MODULE_DESC(_x, _d) { DBGLOG_MODULEID_ ## _x, #_x, _d, ARRAY_SIZE(_d),0} - -extern A_CHAR dbglog_id_tag[DBGLOG_MODULEID_NUM_MAX][DBGLOG_DBGID_NUM_MAX][DBGLOG_DBGID_DEFINITION_LEN_MAX]; -static int check_ids; - -static const char *pmmode2text(A_INT32 mode) -{ - const char *pm; - switch (mode) { - case 1: pm = "sleep"; break; - case 2: pm = "awake"; break; - case 3: pm = "fake_sleep"; break; - default: pm = "unknown"; break; - } - return pm; -} - -#if 0 -static const char *module2text(A_INT32 moduleid) -{ - const char *msg; - switch (moduleid) { - CASE_STR_CONST(INF, DBGLOG_MODULEID_INF, msg); - CASE_STR_CONST(WMI, DBGLOG_MODULEID_WMI, msg); - CASE_STR_CONST(MISC, DBGLOG_MODULEID_MISC, msg); - CASE_STR_CONST(PM, DBGLOG_MODULEID_PM, msg); - CASE_STR_CONST(MGMTBUF, DBGLOG_MODULEID_TXRX_MGMTBUF, msg); - CASE_STR_CONST(TXBUF, DBGLOG_MODULEID_TXRX_TXBUF, msg); - CASE_STR_CONST(RXBUF, DBGLOG_MODULEID_TXRX_RXBUF, msg); - CASE_STR_CONST(WOW, DBGLOG_MODULEID_WOW, msg); - CASE_STR_CONST(WHAL, DBGLOG_MODULEID_WHAL, msg); - CASE_STR_CONST(DC, DBGLOG_MODULEID_DC, msg); - CASE_STR_CONST(CO, DBGLOG_MODULEID_CO, msg); - CASE_STR_CONST(RO, DBGLOG_MODULEID_RO, msg); - CASE_STR_CONST(CM, DBGLOG_MODULEID_CM, msg); - CASE_STR_CONST(MGMT, DBGLOG_MODULEID_MGMT, msg); - CASE_STR_CONST(TMR, DBGLOG_MODULEID_TMR, msg); - CASE_STR_CONST(BTCOEX, DBGLOG_MODULEID_BTCOEX, msg); - CASE_DEF_STR(msg); - } - return msg; -} -#endif - -static const char *pmmodule2text(A_INT32 moduleid) -{ - const char *msg; - switch (moduleid) { - CASE_STR_CONST(CSERV, 1, msg); - CASE_STR_CONST(MLME , 2, msg); - CASE_STR_CONST(TXRX , 3, msg); - CASE_STR_CONST(PM , 4, msg); - CASE_STR_CONST(BT_COEX, 5, msg); - CASE_STR_CONST(CO , 6, msg); - CASE_STR_CONST(DC , 7, msg); - CASE_STR_CONST(RO , 8, msg); - CASE_STR_CONST(CM , 9, msg); - CASE_STR_CONST(RRM , 10, msg); - CASE_STR_CONST(AP , 11, msg); - CASE_STR_CONST(KEYMGMT, 12, msg); - CASE_STR_CONST(CCX , 13, msg); - CASE_STR_CONST(MISC , 14, msg); - CASE_STR_CONST(DFS , 15, msg); - CASE_STR_CONST(TIMER , 16, msg); - CASE_DEF_STR(msg); - } - return msg; -} - -static const char *status2text(A_STATUS status) -{ - const char *msg; - switch (status) { - CASE_STR(A_ERROR, msg); - CASE_STR(A_OK, msg); /* success */ - /* Following values start at 1 */ - CASE_STR(A_DEVICE_NOT_FOUND, msg); /* not able to find PCI device */ - CASE_STR(A_NO_MEMORY, msg); /* not able to allocate memory, msg); not available */ - CASE_STR(A_MEMORY_NOT_AVAIL, msg); /* memory region is not free for mapping */ - CASE_STR(A_NO_FREE_DESC, msg); /* no free descriptors available */ - CASE_STR(A_BAD_ADDRESS, msg); /* address does not match descriptor */ - CASE_STR(A_WIN_DRIVER_ERROR, msg); /* used in NT_HW version, msg); if problem at init */ - CASE_STR(A_REGS_NOT_MAPPED, msg); /* registers not correctly mapped */ - CASE_STR(A_EPERM, msg); /* Not superuser */ - CASE_STR(A_EACCES, msg); /* Access denied */ - CASE_STR(A_ENOENT, msg); /* No such entry, msg); search failed, msg); etc. */ - CASE_STR(A_EEXIST, msg); /* The object already exists (can't create) */ - CASE_STR(A_EFAULT, msg); /* Bad address fault */ - CASE_STR(A_EBUSY, msg); /* Object is busy */ - CASE_STR(A_EINVAL, msg); /* Invalid parameter */ - CASE_STR(A_EMSGSIZE, msg); /* Inappropriate message buffer length */ - CASE_STR(A_ECANCELED, msg); /* Operation canceled */ - CASE_STR(A_ENOTSUP, msg); /* Operation not supported */ - CASE_STR(A_ECOMM, msg); /* Communication error on send */ - CASE_STR(A_EPROTO, msg); /* Protocol error */ - CASE_STR(A_ENODEV, msg); /* No such device */ - CASE_STR(A_EDEVNOTUP, msg); /* device is not UP */ - CASE_STR(A_NO_RESOURCE, msg); /* No resources for requested operation */ - CASE_STR(A_HARDWARE, msg); /* Hardware failure */ - CASE_STR(A_PENDING, msg); /* Asynchronous routine; will send up results la -ter (typically in callback) */ - CASE_STR(A_EBADCHANNEL, msg); /* The channel cannot be used */ - CASE_STR(A_DECRYPT_ERROR, msg); /* Decryption error */ - CASE_STR(A_PHY_ERROR, msg); /* RX PHY error */ - CASE_STR(A_CONSUMED, msg); /* Object was consumed */ - CASE_DEF_STR(msg); - } - return msg; -} - -static const char *btStatus2text(A_INT32 status) -{ - const char *btState; - switch (status) { - CASE_STR_CONST(BT_UNDEF, 1, btState); - CASE_STR_CONST(BT_ON, 2, btState); - CASE_STR_CONST(BT_OFF, 3, btState); - CASE_STR_CONST(BT_IGNORE, 4, btState); - CASE_DEF_STR(btState); - } - return btState; -} - -static int cipher2text(char *buf, size_t len, A_UINT8 cipher) -{ - int ret = 0; - BIT_STR(buf, len, ret, "none ", NONE_CRYPT, cipher); - BIT_STR(buf, len, ret, "wep ", WEP_CRYPT, cipher); - BIT_STR(buf, len, ret, "tkip ", TKIP_CRYPT, cipher); - BIT_STR(buf, len, ret, "aes ", AES_CRYPT, cipher); - buf[(ret>0) ? --ret : ret] = 0; - return ret; -} - -static const char* enable2text(A_INT32 enable) -{ - return enable ? "ENABLE" : "DISABLE"; -} - -static const char* txrxstatus2text(A_INT32 status) -{ - const char *txstatus; - switch (status) { - CASE_STR_CONST(TXRX_ERROR, -1, txstatus); - CASE_STR_CONST(TXRX_OK , 0, txstatus); - CASE_STR_CONST(TXRX_FAILED , 1, txstatus); - CASE_STR_CONST(TXRX_Q_IS_EMPTY , 2, txstatus); - CASE_STR_CONST(TXRX_Q_NOT_DRAINED , 3, txstatus); - CASE_STR_CONST(TXRX_Q_DRAINED_ALL , 4, txstatus); - CASE_STR_CONST(TXRX_Q_DRAIN_PENDING , 5, txstatus); - CASE_STR_CONST(TXRX_IS_MGMT_PKT , 6, txstatus); - CASE_STR_CONST(TXRX_IS_DATA_PKT , 7, txstatus); - CASE_STR_CONST(TXRX_SAVED_AS_FRAG , 8, txstatus); - CASE_STR_CONST(TXRX_Q_IS_PAUSED , 9, txstatus); - CASE_STR_CONST(TXRX_RX_SEND_TO_HOST , 10, txstatus); - CASE_STR_CONST(TXRX_ERROR_PKT_DRAINED , 11, txstatus); - CASE_STR_CONST(TXRX_EOL_EXPIRED , 12, txstatus); - CASE_STR_CONST(TXRX_PS_FILTERED , 13, txstatus); - CASE_STR_CONST(TXRX_RX_SEND_TO_TX , 14, txstatus); - CASE_DEF_STR(txstatus); - } - return txstatus; -} - -static int rxfilter2text(char *buf, size_t blen, A_INT32 rxfilter) -{ - int ret = 0; - BIT_STR(buf, blen, ret, "UCAST " , 0x00000001, rxfilter); - BIT_STR(buf, blen, ret, "MCAST " , 0x00000002, rxfilter); - BIT_STR(buf, blen, ret, "BCAST " , 0x00000004, rxfilter); - BIT_STR(buf, blen, ret, "CONTROL " , 0x00000008, rxfilter); - BIT_STR(buf, blen, ret, "BEACON " , 0x00000010, rxfilter); - BIT_STR(buf, blen, ret, "PROM " , 0x00000020, rxfilter); - BIT_STR(buf, blen, ret, "PROBEREQ ", 0x00000080, rxfilter); - BIT_STR(buf, blen, ret, "MYBEACON ", 0x00000200, rxfilter); - BIT_STR(buf, blen, ret, "COMP_BAR ", 0x00000400, rxfilter); - BIT_STR(buf, blen, ret, "COMP_BA " , 0x00000800, rxfilter); - BIT_STR(buf, blen, ret, "UNCOMP_BA_BAR " , 0x00001000, rxfilter); - BIT_STR(buf, blen, ret, "PS_POLL " , 0x00004000, rxfilter); - BIT_STR(buf, blen, ret, "MCAST_BCAST_ALL " , 0x00008000, rxfilter); - BIT_STR(buf, blen, ret, "FROM_TO_DS " , 0x00020000, rxfilter); - buf[(ret>0) ? --ret : ret] = 0; - return ret; -} - -static int btState2text(char *buf, size_t blen, A_INT32 btState) -{ - int bret = 0; - BIT_STR(buf, blen, bret, "SCO ", (1<<1), btState); - BIT_STR(buf, blen, bret, "A2DP ", (1<<2), btState); - BIT_STR(buf, blen, bret, "SCAN ", (1<<3), btState); - BIT_STR(buf, blen, bret, "ESCO ", (1<<4), btState); - buf[(bret>0) ? --bret : bret] = 0; - return bret; -} - -static int btcoexFlags2text(char *buf, size_t blen, A_INT32 btCoexFlags) -{ - int bret = 0; - BIT_STR(buf, blen, bret, "SCO_ON ", 0x0001, btCoexFlags); - BIT_STR(buf, blen, bret, "A2DP_ON ", 0x0002, btCoexFlags); - BIT_STR(buf, blen, bret, "ACL_ON ", 0x0004, btCoexFlags); - BIT_STR(buf, blen, bret, "INQUIRY_ON ", 0x0008, btCoexFlags); - BIT_STR(buf, blen, bret, "VOIP ", 0x0010, btCoexFlags); - BIT_STR(buf, blen, bret, "RXDATA_PENDING ", 0x0020, btCoexFlags); - BIT_STR(buf, blen, bret, "SLEEP_PENDING ", 0x0040, btCoexFlags); - BIT_STR(buf, blen, bret, "FAKESLEEP_ON ", 0x0080, btCoexFlags); - BIT_STR(buf, blen, bret, "ADD_BA_PENDING ", 0x0100, btCoexFlags); - BIT_STR(buf, blen, bret, "WAKEUP_TIM_INTR ", 0x0200, btCoexFlags); - BIT_STR(buf, blen, bret, "OPT_MODE ", 0x0400, btCoexFlags); - BIT_STR(buf, blen, bret, "FIRST_BMISS ", 0x0800, btCoexFlags); - BIT_STR(buf, blen, bret, "BEACON_PROTECION_ON ", 0x1000, btCoexFlags); - BIT_STR(buf, blen, bret, "WAIT_FOR_NULL_COMP ", 0x4000, btCoexFlags); - BIT_STR(buf, blen, bret, "PROTECT_POST_INQUIRY ", 0x8000, btCoexFlags); - BIT_STR(buf, blen, bret, "DUAL_ANT_ACTIVE ", 0x10000, btCoexFlags); - BIT_STR(buf, blen, bret, "DUAL_ANT_WAKEUP_TIM ", 0x20000, btCoexFlags); - BIT_STR(buf, blen, bret, "STOMP_FOR_DTIM_RECV ", 0x40000, btCoexFlags); - BIT_STR(buf, blen, bret, "ENABLE_COEX_ON_BCN_RECV ", 0x80000, btCoexFlags); - buf[(bret>0) ? --bret : bret] = 0; - return bret; -} - -static int WMI_SET_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_SET_MCAST_FILTER_CMD *cmd = (WMI_SET_MCAST_FILTER_CMD*)cmdbuf; - return snprintf(output, len, "%02X:%02X:%02X:%02X:%02X:%02X", - cmd->multicast_mac[0], cmd->multicast_mac[1], cmd->multicast_mac[2], - cmd->multicast_mac[3], cmd->multicast_mac[4], cmd->multicast_mac[5]); -} - -static int WMI_DEL_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - return WMI_SET_MCAST_FILTER_CMDID_fmt(output, len, cmdbuf); -} - -static int WMI_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_MCAST_FILTER_CMD *cmd = (WMI_MCAST_FILTER_CMD*)cmdbuf; - return snprintf(output, len, "%s", enable2text(cmd->enable)); -} - -static int WMI_START_SCAN_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - int i; - int ret = 0; - WMI_START_SCAN_CMD *cmd = (WMI_START_SCAN_CMD*)cmdbuf; - const char *scanType = (cmd->scanType == WMI_SHORT_SCAN) ? "short" : "long"; - if (cmd->forceFgScan) { - ret += snprintf(output+ret, len-ret, "forceFg "); - } - ret += snprintf(output+ret, len-ret, "hmdwell %u ", cmd->homeDwellTime); - ret += snprintf(output+ret, len-ret, "fscanint %u ", cmd->forceScanInterval); - ret += snprintf(output+ret, len-ret, "%s ", scanType); - for (i=0; inumChannels; ++i) { - ret += snprintf(output+ret, len-ret, "%d ", cmd->channelList[i]); - } - return ret; -} - -static int WMI_CONNECT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_CONNECT_CMD *cmd = (WMI_CONNECT_CMD*)cmdbuf; - char ssid[33]; - char pairwise[128], group[128]; - const char *dot11Auth, *authMode; - memcpy(ssid, cmd->ssid, 32); - ssid[cmd->ssidLength] = 0; - cipher2text(pairwise, sizeof(pairwise), cmd->pairwiseCryptoType); - cipher2text(group, sizeof(group), cmd->groupCryptoType); - - switch (cmd->dot11AuthMode) { - CASE_STR(OPEN_AUTH, dot11Auth); - CASE_STR(SHARED_AUTH, dot11Auth); - CASE_STR(LEAP_AUTH, dot11Auth); - CASE_DEF_STR(dot11Auth); - } - - switch (cmd->authMode) { - CASE_STR(WMI_NONE_AUTH, authMode); - CASE_STR(WMI_WPA_AUTH, authMode); - CASE_STR(WMI_WPA2_AUTH, authMode); - CASE_STR(WMI_WPA_PSK_AUTH, authMode); - CASE_STR(WMI_WPA2_PSK_AUTH, authMode); - CASE_STR(WMI_WPA_AUTH_CCKM, authMode); - CASE_STR(WMI_WPA2_AUTH_CCKM, authMode); - CASE_DEF_STR(authMode); - } - return snprintf(output, len, "'%s' ch %d %s %s uni:%s grp:%s %02X:%02X:%02X:%02X:%02X:%02X ctrl 0x%x", - ssid, cmd->channel, - dot11Auth, authMode, pairwise, group, - cmd->bssid[0], cmd->bssid[1], cmd->bssid[2], - cmd->bssid[3], cmd->bssid[4], cmd->bssid[5], - cmd->ctrl_flags); -} - -static int WMI_SET_BTCOEX_FE_ANT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_SET_BTCOEX_FE_ANT_CMD *cmd = (WMI_SET_BTCOEX_FE_ANT_CMD*)cmdbuf; - const char *fe; - switch (cmd->btcoexFeAntType) { - CASE_STR(WMI_BTCOEX_NOT_ENABLED, fe); - CASE_STR(WMI_BTCOEX_FE_ANT_SINGLE, fe); - CASE_STR(WMI_BTCOEX_FE_ANT_DUAL, fe); - CASE_STR(WMI_BTCOEX_FE_ANT_DUAL_HIGH_ISO, fe); - CASE_DEF_STR(fe); - } - return snprintf(output, len, "%s", fe); -} - -static int WMI_SET_BTCOEX_SCO_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_SET_BTCOEX_SCO_CONFIG_CMD *cmd = (WMI_SET_BTCOEX_SCO_CONFIG_CMD*)cmdbuf; - char scoFlags[512]; - int blen = sizeof(scoFlags); - int bret = 0; - BIT_STR(scoFlags, blen, bret, "OPT ", (1<<0), cmd->scoConfig.scoFlags); - BIT_STR(scoFlags, blen, bret, "EDR ", (1<<1), cmd->scoConfig.scoFlags); - BIT_STR(scoFlags, blen, bret, "MASTER ", (1<<2), cmd->scoConfig.scoFlags); - BIT_STR(scoFlags, blen, bret, "FRM ", (1<<3), cmd->scoConfig.scoFlags); - scoFlags[(bret>0) ? --bret : bret] = 0; - - return snprintf(output, len, "%d/%d slots [%s] ps %u-%u-%u opt %u-%u-%u-%u-%u-%u scan %u/%u", - cmd->scoConfig.scoSlots, cmd->scoConfig.scoIdleSlots, scoFlags, - - cmd->scoPspollConfig.scoCyclesForceTrigger, - cmd->scoPspollConfig.scoDataResponseTimeout, - cmd->scoPspollConfig.scoPsPollLatencyFraction, - - cmd->scoOptModeConfig.scoStompCntIn100ms, - cmd->scoOptModeConfig.scoContStompMax, - cmd->scoOptModeConfig.scoMinlowRateMbps, - cmd->scoOptModeConfig.scoLowRateCnt, - cmd->scoOptModeConfig.scoHighPktRatio, - cmd->scoOptModeConfig.scoMaxAggrSize, - - cmd->scoWlanScanConfig.scanInterval, - cmd->scoWlanScanConfig.maxScanStompCnt); -} - -static int WMI_SET_BTCOEX_A2DP_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - return 0; -} - -static int WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - return 0; -} - -static int WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD *cmd = (WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD*)cmdbuf; - return snprintf(output, len, "pspoll every %u inquiry duration %u", - cmd->btInquiryDataFetchFrequency, - cmd->protectBmissDurPostBtInquiry); -} - -static int WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *cmd = (WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD*)cmdbuf; - const char *profile; - const char *op = (cmd->btOperatingStatus==1) ? "START" : "STOP"; - switch (cmd->btProfileType) { - CASE_STR_CONST(SCO, 1, profile); - CASE_STR_CONST(A2DP, 2, profile); - CASE_STR_CONST(Inquiry, 3, profile); - CASE_STR_CONST(ACL, 4, profile); - CASE_DEF_STR(profile); - } - return snprintf(output, len, "%s %s", profile, op); -} - -static int WMI_SET_LISTEN_INT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_LISTEN_INT_CMD *cmd = (WMI_LISTEN_INT_CMD*)cmdbuf; - return snprintf(output, len, "interval %d numBeacons %d", cmd->listenInterval, cmd->numBeacons); -} - -static int WMI_SET_BSS_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf) -{ - WMI_BSS_FILTER_CMD *cmd = (WMI_BSS_FILTER_CMD*)cmdbuf; - const char *filter; - switch (cmd->bssFilter) { - CASE_STR(NONE_BSS_FILTER, filter); - CASE_STR(ALL_BSS_FILTER, filter); - CASE_STR(PROFILE_FILTER, filter); - CASE_STR(ALL_BUT_PROFILE_FILTER, filter); - CASE_STR(CURRENT_BSS_FILTER, filter); - CASE_STR(ALL_BUT_BSS_FILTER, filter); - CASE_STR(PROBED_SSID_FILTER, filter); - CASE_STR(LAST_BSS_FILTER, filter); - CASE_DEF_STR(filter); - } - return snprintf(output, len, "[%s]", filter); -} - -static int CO_CHANGE_CHANNEL_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 freq = buffer[1]; - A_INT32 duration = buffer[2]; - return snprintf(output, len, "freq %d duration %d", freq, duration); -} - -static int CO_CHANGE_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 stateLog = (numargs==1) ? buffer[1] : buffer[2]; - int op = stateLog & 0xff; - const char *opstr = op ? "set" : "clr"; - int opState = (stateLog >> 8) & 0xff; - int oldState = stateLog >> 16; - int newState = (op) ? (oldState | opState) : (oldState & ~(opState)); - char state[256]; - size_t blen = sizeof(state); - int ret = 0; - BIT_STR(state, blen, ret, "DRAIN_IN_PROGRESS ", 0x01, newState); - BIT_STR(state, blen, ret, "FAKE_SLEEP_ENABLE_IN_PROGRESS ", 0x02, newState); - BIT_STR(state, blen, ret, "FAKE_SLEEP_ENABLED ", 0x04, newState); - BIT_STR(state, blen, ret, "TXQ_PAUSED ", 0x08, newState); - BIT_STR(state, blen, ret, "CHANNEL_CHANGE_IN_PROGRESS ", 0x10, newState); - state[(ret>0) ? --ret : ret] = 0; - - ret = 0; - if (numargs==2) { - ret = snprintf(output+ret, len-ret, "dev %d ", buffer[1]); - } - ret += snprintf(output+ret, len-ret, "0x%x %s 0x%x->0x%x [%s]", - oldState, opstr, opState, newState, state); - return ret; -} - -static int TXRX_MGMTBUF_WLAN_RESET_ON_ERROR_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - if (numargs==1) { - char buf[512]; - A_INT32 rxfilter = buffer[1]; - rxfilter2text(buf, sizeof(buf),rxfilter); - return snprintf(output, len, "rxfilter:[%s]", buf); - } else if (numargs==2) { - return snprintf(output, len, "rstCnt %d caller %p", - buffer[1], (void*)buffer[2]); - } else { - return 0; - } -} -static int TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *mid; - switch (buffer[2]) { - CASE_STR_CONST(CO, 0x001, mid); - CASE_STR_CONST(PM, 0x002, mid); - CASE_STR_CONST(BTCOEX, 0x004, mid); - CASE_DEF_STR(mid); - } - return snprintf(output, len, "wait drain %d ms %s ", buffer[1], mid); -} - -static int TXRX_MGMTBUF_REAPED_BUF_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *txstatus = txrxstatus2text(buffer[2]); - return snprintf(output, len, "mgt %p %s", (void*)buffer[1], txstatus); -} - -static int TXRX_MGMTBUF_DRAINQ_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 hwq = buffer[1]; - A_INT32 depth = buffer[2]; - return snprintf(output, len, "hwq 0x%x depth 0x%x", hwq, depth); -} - -static int DC_RECEIVED_ANY_BEACON_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - if (numargs==1) { - A_INT32 addr3 = buffer[1]; - return snprintf(output, len, "addr3 ??:??:%02X:%02X:%02X:%02X", - (addr3 & 0xff), ((addr3>>8)&0xff), ((addr3>>16)&0xff), ((addr3>>24)&0xff)); - } else if (numargs==2) { - A_UINT64 tsf; - A_UINT8 ie_tstamp[8]; - ie_tstamp[4] = buffer[1] & 0xff; - ie_tstamp[5] = (buffer[1]>>8) & 0xff; - ie_tstamp[6] = (buffer[1]>>16) & 0xff; - ie_tstamp[7] = (buffer[1]>>24) & 0xff; - ie_tstamp[0] = buffer[2] & 0xff; - ie_tstamp[1] = (buffer[2]>>8) & 0xff; - ie_tstamp[2] = (buffer[2]>>16) & 0xff; - ie_tstamp[3] = (buffer[2]>>24) & 0xff; - A_MEMCPY((A_UINT8 *)&tsf, ie_tstamp, sizeof(ie_tstamp)); - return snprintf(output, len, "ie_tsf %llu", tsf); - } - return 0; -} - -static int DC_SET_POWER_MODE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *pm = pmmode2text(buffer[1]); - return snprintf(output, len, "%s caller %p", pm, (void*)buffer[2]); -} - -static int DC_SSID_PROBE_CB_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *txstatus = txrxstatus2text(buffer[1]); - return snprintf(output, len, "%s", txstatus); -} - -static int DC_SEARCH_OPPORTUNITY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *opt; - switch (buffer[1]) { - CASE_STR_CONST(SCAN_IN_PROGRESS, 1, opt); - CASE_STR_CONST(NOT_SCAN_IN_PROGRESS, 0, opt); - CASE_DEF_STR(opt); - } - return snprintf(output, len, "%s", opt); -} - -static int DC_SEND_NEXT_SSID_PROBE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *flags; - switch (buffer[2]) { - CASE_STR(DISABLE_SSID_FLAG, flags); - CASE_STR(SPECIFIC_SSID_FLAG, flags); - CASE_STR(ANY_SSID_FLAG, flags); - CASE_DEF_STR(flags); - } - return snprintf(output, len, "idx %d %s", buffer[1], flags); -} - -static int DC_SCAN_CHAN_FINISH_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_UINT16 freq = buffer[1] & 0xffff; - A_UINT16 status = (buffer[1] >> 16) & 0xffff; - A_INT32 rxfilter = buffer[2]; - char rxfilterMsg[1024]; - rxfilter2text(rxfilterMsg, sizeof(rxfilterMsg), rxfilter); - return snprintf(output, len, "freq %d status %s(%d), %s", - freq, status2text(status), status, rxfilterMsg); -} - -static int DC_SCAN_CHAN_START_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 rxfilter = buffer[2]; - char rxfilterMsg[1024]; - A_UINT16 freq; - A_UINT16 attrib; - const char *probed; - rxfilter2text(rxfilterMsg, sizeof(rxfilterMsg), rxfilter); - freq = buffer[1] & 0xffff; - attrib = (buffer[1] >> 16) & 0xffff; - probed = ((attrib & (0x0100|0x10))==(0x0100|0x10)) && !(attrib & 0x0800) ? "allow" : "not allow"; - - return snprintf(output, len, "freq %d attrib %d probed %s %s", - freq, attrib, probed, rxfilterMsg); -} - -static int DC_START_SEARCH_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - if (numargs==1) { - return snprintf(output, len, "devid %d", buffer[1]); - } else { - A_INT32 stype = buffer[1]; - int ret = 0; - char buf[1024]; - size_t blen = sizeof(buf); - if (stype == 0) { - BIT_STR(buf, blen, ret, "RESET " , 0, stype); - } - BIT_STR(buf, blen, ret, "ALL " , (0x01|0x02|0x04|0x08), stype); - if (((0x01|0x02|0x04|0x08)& stype)!=(0x01|0x02|0x04|0x08)) { - BIT_STR(buf, blen, ret, "POPULAR " , (0x02 | 0x04 | 0x08), stype); - if (((0x02|0x04|0x08)& stype)!=(0x02|0x04|0x08)) { - BIT_STR(buf, blen, ret, "SSIDS " , (0x04 | 0x08), stype); - if (((0x04|0x08)& stype)!=(0x04|0x08)) { - BIT_STR(buf, blen, ret, "PROF_MASK " , (0x08), stype); - } - } - } - - BIT_STR(buf, blen, ret, "MULTI_CHANNEL " , 0x000100, stype); - BIT_STR(buf, blen, ret, "DETERMINISTIC " , 0x000200, stype); - BIT_STR(buf, blen, ret, "PROFILE_MATCH_TERMINATED " , 0x000400, stype); - BIT_STR(buf, blen, ret, "HOME_CHANNEL_SKIP " , 0x000800, stype); - BIT_STR(buf, blen, ret, "CHANNEL_LIST_CONTINUE " , 0x001000, stype); - BIT_STR(buf, blen, ret, "CURRENT_SSID_SKIP " , 0x002000, stype); - BIT_STR(buf, blen, ret, "ACTIVE_PROBE_DISABLE " , 0x004000, stype); - BIT_STR(buf, blen, ret, "CHANNEL_HINT_ONLY " , 0x008000, stype); - BIT_STR(buf, blen, ret, "ACTIVE_CHANNELS_ONLY " , 0x010000, stype); - BIT_STR(buf, blen, ret, "UNUSED1 " , 0x020000, stype); - BIT_STR(buf, blen, ret, "PERIODIC " , 0x040000, stype); - BIT_STR(buf, blen, ret, "FIXED_DURATION " , 0x080000, stype); - BIT_STR(buf, blen, ret, "AP_ASSISTED " , 0x100000, stype); - buf[(ret>0) ? --ret : ret] = 0; - return snprintf(output, len, "%s cb 0x%x", buf, buffer[2]); - } -} - -static int PM_CHAN_OP_REQ_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *start = (buffer[1]==1) ? "start" : "stop"; - A_INT32 chanOpReq = buffer[2]; - return snprintf(output, len, "%s chan OpReq %d", start, chanOpReq); -} - -static int PM_SET_ALL_BEACON_POLICY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *policyMsg; - A_UINT16 policy = buffer[1]; - A_UINT32 cnt = buffer[2]; - switch (policy) { - CASE_STR_CONST(disallow, 1, policyMsg); - CASE_STR_CONST(allow, 2, policyMsg); - CASE_DEF_STR(policyMsg); - } - return snprintf(output, len, "%s beacons filterCnt %d", policyMsg, cnt); -} - -static int PM_SET_MY_BEACON_POLICY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *policyMsg; - A_UINT16 policy = buffer[1] & 0xff; - A_UINT32 bMiss = (buffer[1] >> 8); - A_UINT32 myBeaconCnt = buffer[2]; - switch (policy) { - CASE_STR_CONST(disallow, 1, policyMsg); - CASE_STR_CONST(allow, 2, policyMsg); - CASE_DEF_STR(policyMsg); - } - return snprintf(output, len, "bmiss %d %s during sleep filterCnt %d", bMiss, policyMsg, myBeaconCnt); -} - - -static int PM_SET_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT16 pmStateWakeupCount = (buffer[1] >> 16) & 0xffff; - A_INT16 pmState = buffer[1] & 0xffff; - A_INT16 pmAwakeCount = (buffer[2] >> 16) & 0xffff; - A_INT8 pmSleepCount = (buffer[2] >> 8) & 0xff; - A_INT8 pmOldState = buffer[2] & 0xff; - return snprintf(output, len, "StateWakeupCnt %d AwakeCnt %d, SleepCnt %d, %s to %s", - pmStateWakeupCount, pmAwakeCount, pmSleepCount, - pmmode2text(pmOldState), pmmode2text(pmState)); -} - -static int PM_SET_POWERMODE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_UINT16 wcnt = buffer[1] >> 16; - A_UINT16 fakeSleep = buffer[1] & 0xffff; - A_UINT16 oldPowerMode = buffer[2] >> 16; - A_UINT8 powerMode = (buffer[2] >> 8) & 0xff; - A_UINT8 moduleId = buffer[2] & 0xff; - return snprintf(output, len, "wakeCnt %d fakeSleep %d %s(%d)=>%s(%d) %s(%d)", - wcnt, fakeSleep, pmmode2text(oldPowerMode), oldPowerMode, pmmode2text(powerMode), powerMode, pmmodule2text(moduleId), moduleId); -} - -static int PM_FAKE_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT16 enable = (buffer[1] >> 16) & 0xffff; - const char *state = enable2text(enable); - A_INT8 pmFakeSleepCount = (buffer[1] >> 8) & 0xff; - A_INT8 fakeSleepEnable = (buffer[1] & 0xff); - A_INT16 forceAwake = (buffer[2] >> 16) & 0xffff; - A_INT8 dontWaitForDrain = (buffer[2] >> 8) & 0xff; - A_INT8 module = buffer[2] & 0xff; - return snprintf(output, len, "%s cnt %d hasCnt %d forceAwake %d dontWaitDrain %d %s(%d)", - state, pmFakeSleepCount, fakeSleepEnable, forceAwake, dontWaitForDrain, pmmodule2text(module), module); -} - -static int BTCOEX_DBG_pmwakeupcnt_flags(char *output, size_t len, A_INT32 pmWakeupCnt, A_INT32 btCoexFlags) -{ - int ret = 0; - ret += snprintf(output+ret, len-ret, "coexPmWakeupCnt %d", pmWakeupCnt); - if (btCoexFlags!=-1) { - char buf[512]; - btcoexFlags2text(buf, sizeof(buf), btCoexFlags); - ret += snprintf(output+ret, len-ret, " coex [%s]", buf); - } - return ret; -} - -static int BTCOEX_ACL_COEX_STATUS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 btStatus = (buffer[1] >> 16) & 0xffff; - A_INT32 redoAggr = buffer[1] & 0xffff; - return snprintf(output, len, "%s redoAggr %d", btStatus2text(btStatus), redoAggr); -} - -static int BTCOEX_DBG_PM_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 pmWakeupCnt = buffer[1]; - A_INT32 btCoexFlags = buffer[2]; - return BTCOEX_DBG_pmwakeupcnt_flags(output,len,pmWakeupCnt,btCoexFlags); -} - -static int BTCOEX_PSPOLL_QUEUED_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT16 isEolEnabled = (buffer[1] >> 16) & 0xffff; - A_INT8 bSendAtLowestRate = (buffer[1] >>8) & 0xff; - A_INT8 isPmSleep = (buffer[1]) & 0xff; - return snprintf(output, len, "Eol:%s LowestRate:%s PmSleep:%s", - enable2text(isEolEnabled), enable2text(bSendAtLowestRate), - enable2text(isPmSleep)); -} - -static int BTCOEX_PSPOLL_COMPLETE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - return snprintf(output, len, "%s", txrxstatus2text(buffer[1])); -} - -static int BTCOEX_DBG_PM_AWAKE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - return BTCOEX_DBG_PM_SLEEP_fmt(output,len,numargs,buffer); -} - -static int BTCOEX_DBG_GO_TO_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - return BTCOEX_DBG_pmwakeupcnt_flags(output,len,buffer[1],-1); -} - -static int BTCOEX_WAKEUP_ON_DATA_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - return BTCOEX_DBG_pmwakeupcnt_flags(output,len,buffer[2], buffer[1]); -} - -static int BTCOEX_TIM_NOTIFICATION_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - int ret = 0; - A_INT32 btCoexFlags = buffer[1]; - A_INT32 btStatus = (buffer[2]>>16) & 0xffff; - A_INT32 pmWakeupCnt = (buffer[2] & 0xffff); - ret = BTCOEX_DBG_pmwakeupcnt_flags(output,len, pmWakeupCnt, btCoexFlags); - ret += snprintf(output+ret, len-ret, " %s", btStatus2text(btStatus)); - return ret; -} - -static int BTCOEX_DBG_ALLOW_SCAN_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - char buf[512]; - A_INT32 retStatus = buffer[2]; - A_INT32 btState = buffer[1]; - btState2text(buf, sizeof(buf), btState); - return snprintf(output, len, "state: [%s] allow:%d", buf, retStatus); -} - -static int BTCOEX_DBG_SCAN_REQUEST_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - char buf[512]; - A_INT32 scanReqEnabled = buffer[2]; - A_INT32 btState = buffer[1]; - btState2text(buf, sizeof(buf), btState); - return snprintf(output, len, "state: [%s] scanReqEnabled:%d", buf, scanReqEnabled); -} - -static int BTCOEX_DBG_SET_WLAN_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 btCoexFlags = buffer[2]; - char buf[512]; - const char *wlanState; - switch (buffer[1]) { - CASE_STR_CONST(IDLE , 1, wlanState); - CASE_STR_CONST(CONNECTED , 2, wlanState); - CASE_STR_CONST(SCAN_START , 3, wlanState); - CASE_STR_CONST(CONNECT_START ,4, wlanState); - CASE_STR_CONST(SCAN_END , 5, wlanState); - CASE_STR_CONST(APMODE_STA_CONNECTED , 6, wlanState); - CASE_STR_CONST(APMODE_IDLE , 7, wlanState); - CASE_STR_CONST(APMODE_SWITCH , 8, wlanState); - CASE_STR_CONST(APMODE_TEARDOWN , 9, wlanState); - CASE_DEF_STR(wlanState); - } - btcoexFlags2text(buf, sizeof(buf), btCoexFlags); - return snprintf(output, len, "wlan %s coex [%s]", wlanState, buf); -} - -static int BTCOEX_DBG_BT_INQUIRY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *btState = btStatus2text(buffer[1]); - A_INT32 btCoexFlags = buffer[2]; - char buf[512]; - btcoexFlags2text(buf, sizeof(buf), btCoexFlags); - return snprintf(output, len, "%s coex [%s]", btState, buf); -} - -static int BTCOEX_SET_WEIGHTS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *weights; - switch (buffer[1]) { - CASE_STR_CONST(ALL_BT_TRAFFIC,1,weights); - CASE_STR_CONST(ONLY_HIGH_PRI_BT_TRAFFIC,2,weights); - CASE_STR_CONST(STOMP_ALL_BT_TRAFFIC,3,weights); - CASE_STR_CONST(ONLY_A2DP_TRAFFIC,4,weights); - CASE_STR_CONST(ONLY_HIGH_PRIO_AND_A2DP,5,weights); - CASE_STR_CONST(A2DP_STOMPED,6,weights); - CASE_STR_CONST(ALL_BT_TRAFFIC_WTX,7,weights); - CASE_STR_CONST(ALL_BT_TRAFFIC_WTX_HIGHISO_TXRX,8,weights); - CASE_STR_CONST(HIGH_PRI_TRAFFIC_WTX,9,weights); - CASE_STR_CONST(HIGH_PRI_TRAFFIC_WTX_HIGHISO_TXRX,0xa,weights); - CASE_STR_CONST(MCI_TEST,0xb,weights); - CASE_DEF_STR(weights); - } - - return snprintf(output, len, "%s val 0x%x", weights, buffer[2]); -} - -static int BTCOEX_PM_FAKE_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *enable = enable2text(buffer[1]); - A_STATUS status = buffer[2]; - return snprintf(output, len, "%s -> %s", enable, status2text(status)); -} - -static const struct wmi_id_desc evt_desc[] = { - WM_ID_DESC(WMI_READY_EVENTID), - WM_ID_DESC(WMI_CONNECT_EVENTID), - WM_ID_DESC(WMI_DISCONNECT_EVENTID), - WM_ID_DESC(WMI_BSSINFO_EVENTID), - WM_ID_DESC(WMI_CMDERROR_EVENTID), - WM_ID_DESC(WMI_REGDOMAIN_EVENTID), - WM_ID_DESC(WMI_PSTREAM_TIMEOUT_EVENTID), - WM_ID_DESC(WMI_NEIGHBOR_REPORT_EVENTID), - WM_ID_DESC(WMI_TKIP_MICERR_EVENTID), - WM_ID_DESC(WMI_SCAN_COMPLETE_EVENTID), /* 0x100a */ - WM_ID_DESC(WMI_REPORT_STATISTICS_EVENTID), - WM_ID_DESC(WMI_RSSI_THRESHOLD_EVENTID), - WM_ID_DESC(WMI_ERROR_REPORT_EVENTID), - WM_ID_DESC(WMI_OPT_RX_FRAME_EVENTID), - WM_ID_DESC(WMI_REPORT_ROAM_TBL_EVENTID), - WM_ID_DESC(WMI_EXTENSION_EVENTID), - WM_ID_DESC(WMI_CAC_EVENTID), - WM_ID_DESC(WMI_SNR_THRESHOLD_EVENTID), - WM_ID_DESC(WMI_LQ_THRESHOLD_EVENTID), - WM_ID_DESC(WMI_TX_RETRY_ERR_EVENTID), /* 0x1014 */ - WM_ID_DESC(WMI_REPORT_ROAM_DATA_EVENTID), - WM_ID_DESC(WMI_TEST_EVENTID), - WM_ID_DESC(WMI_APLIST_EVENTID), - WM_ID_DESC(WMI_GET_WOW_LIST_EVENTID), - WM_ID_DESC(WMI_GET_PMKID_LIST_EVENTID), - WM_ID_DESC(WMI_CHANNEL_CHANGE_EVENTID), - WM_ID_DESC(WMI_PEER_NODE_EVENTID), - WM_ID_DESC(WMI_PSPOLL_EVENTID), - WM_ID_DESC(WMI_DTIMEXPIRY_EVENTID), - WM_ID_DESC(WMI_WLAN_VERSION_EVENTID), - WM_ID_DESC(WMI_SET_PARAMS_REPLY_EVENTID), - WM_ID_DESC(WMI_ADDBA_REQ_EVENTID), /*0x1020 */ - WM_ID_DESC(WMI_ADDBA_RESP_EVENTID), - WM_ID_DESC(WMI_DELBA_REQ_EVENTID), - WM_ID_DESC(WMI_TX_COMPLETE_EVENTID), - WM_ID_DESC(WMI_HCI_EVENT_EVENTID), - WM_ID_DESC(WMI_ACL_DATA_EVENTID), - WM_ID_DESC(WMI_REPORT_SLEEP_STATE_EVENTID), - - WM_ID_DESC(WMI_WAPI_REKEY_EVENTID), - - WM_ID_DESC(WMI_REPORT_BTCOEX_STATS_EVENTID), - WM_ID_DESC(WMI_REPORT_BTCOEX_CONFIG_EVENTID), - WM_ID_DESC(WMI_GET_PMK_EVENTID), - - /* DFS Events */ - WM_ID_DESC(WMI_DFS_HOST_ATTACH_EVENTID), - WM_ID_DESC(WMI_DFS_HOST_INIT_EVENTID), - WM_ID_DESC(WMI_DFS_RESET_DELAYLINES_EVENTID), - WM_ID_DESC(WMI_DFS_RESET_RADARQ_EVENTID), - WM_ID_DESC(WMI_DFS_RESET_AR_EVENTID), - WM_ID_DESC(WMI_DFS_RESET_ARQ_EVENTID), /*0x1030*/ - WM_ID_DESC(WMI_DFS_SET_DUR_MULTIPLIER_EVENTID), - WM_ID_DESC(WMI_DFS_SET_BANGRADAR_EVENTID), - WM_ID_DESC(WMI_DFS_SET_DEBUGLEVEL_EVENTID), - WM_ID_DESC(WMI_DFS_PHYERR_EVENTID), - /* CCX Evants */ - WM_ID_DESC(WMI_CCX_RM_STATUS_EVENTID), - - /* P2P Events */ - WM_ID_DESC(WMI_P2P_GO_NEG_RESULT_EVENTID), - - WM_ID_DESC(WMI_WAC_SCAN_DONE_EVENTID), - WM_ID_DESC(WMI_WAC_REPORT_BSS_EVENTID), - WM_ID_DESC(WMI_WAC_START_WPS_EVENTID), - WM_ID_DESC(WMI_WAC_CTRL_REQ_REPLY_EVENTID), - - /*RFKILL Events*/ - WM_ID_DESC(WMI_RFKILL_STATE_CHANGE_EVENTID), - WM_ID_DESC(WMI_RFKILL_GET_MODE_CMD_EVENTID), - - /* More P2P Events */ - WM_ID_DESC(WMI_P2P_GO_NEG_REQ_EVENTID), - WM_ID_DESC(WMI_P2P_INVITE_REQ_EVENTID), - WM_ID_DESC(WMI_P2P_INVITE_RCVD_RESULT_EVENTID), - WM_ID_DESC(WMI_P2P_INVITE_SENT_RESULT_EVENTID), /*1040*/ - WM_ID_DESC(WMI_P2P_PROV_DISC_RESP_EVENTID), - WM_ID_DESC(WMI_P2P_PROV_DISC_REQ_EVENTID), - WM_ID_DESC(WMI_P2P_START_SDPD_EVENTID), - WM_ID_DESC(WMI_P2P_SDPD_RX_EVENTID), -}; - -static const struct wmi_id_desc cmds_desc[] = { - WM_ID_DESC_FMT(WMI_CONNECT_CMDID, sizeof(WMI_CONNECT_CMD)), - WM_ID_DESC(WMI_RECONNECT_CMDID), - WM_ID_DESC(WMI_DISCONNECT_CMDID), - WM_ID_DESC(WMI_SYNCHRONIZE_CMDID), - WM_ID_DESC(WMI_CREATE_PSTREAM_CMDID), - WM_ID_DESC(WMI_DELETE_PSTREAM_CMDID), - WM_ID_DESC_FMT(WMI_START_SCAN_CMDID, sizeof(WMI_START_SCAN_CMD)), - WM_ID_DESC(WMI_SET_SCAN_PARAMS_CMDID), - WM_ID_DESC_FMT(WMI_SET_BSS_FILTER_CMDID, sizeof(WMI_BSS_FILTER_CMD)), - WM_ID_DESC(WMI_SET_PROBED_SSID_CMDID), /* 10 */ - WM_ID_DESC_FMT(WMI_SET_LISTEN_INT_CMDID, sizeof(WMI_LISTEN_INT_CMD)), - WM_ID_DESC(WMI_SET_BMISS_TIME_CMDID), - WM_ID_DESC(WMI_SET_DISC_TIMEOUT_CMDID), - WM_ID_DESC(WMI_GET_CHANNEL_LIST_CMDID), - WM_ID_DESC(WMI_SET_BEACON_INT_CMDID), - WM_ID_DESC(WMI_GET_STATISTICS_CMDID), - WM_ID_DESC(WMI_SET_CHANNEL_PARAMS_CMDID), - WM_ID_DESC(WMI_SET_POWER_MODE_CMDID), - WM_ID_DESC(WMI_SET_IBSS_PM_CAPS_CMDID), - WM_ID_DESC(WMI_SET_POWER_PARAMS_CMDID), /* 20 */ - WM_ID_DESC(WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID), - WM_ID_DESC(WMI_ADD_CIPHER_KEY_CMDID), - WM_ID_DESC(WMI_DELETE_CIPHER_KEY_CMDID), - WM_ID_DESC(WMI_ADD_KRK_CMDID), - WM_ID_DESC(WMI_DELETE_KRK_CMDID), - WM_ID_DESC(WMI_SET_PMKID_CMDID), - WM_ID_DESC(WMI_SET_TX_PWR_CMDID), - WM_ID_DESC(WMI_GET_TX_PWR_CMDID), - WM_ID_DESC(WMI_SET_ASSOC_INFO_CMDID), - WM_ID_DESC(WMI_ADD_BAD_AP_CMDID), /* 30 */ - WM_ID_DESC(WMI_DELETE_BAD_AP_CMDID), - WM_ID_DESC(WMI_SET_TKIP_COUNTERMEASURES_CMDID), - WM_ID_DESC(WMI_RSSI_THRESHOLD_PARAMS_CMDID), - WM_ID_DESC(WMI_TARGET_ERROR_REPORT_BITMASK_CMDID), - WM_ID_DESC(WMI_SET_ACCESS_PARAMS_CMDID), - WM_ID_DESC(WMI_SET_RETRY_LIMITS_CMDID), - WM_ID_DESC(WMI_RESERVED1), - WM_ID_DESC(WMI_RESERVED2), - WM_ID_DESC(WMI_SET_VOICE_PKT_SIZE_CMDID), - WM_ID_DESC(WMI_SET_MAX_SP_LEN_CMDID), /* 40 */ - WM_ID_DESC(WMI_SET_ROAM_CTRL_CMDID), - WM_ID_DESC(WMI_GET_ROAM_TBL_CMDID), - WM_ID_DESC(WMI_GET_ROAM_DATA_CMDID), - WM_ID_DESC(WMI_ENABLE_RM_CMDID), - WM_ID_DESC(WMI_SET_MAX_OFFHOME_DURATION_CMDID), - WM_ID_DESC(WMI_EXTENSION_CMDID), /* Non-wireless extensions */ - WM_ID_DESC(WMI_SNR_THRESHOLD_PARAMS_CMDID), - WM_ID_DESC(WMI_LQ_THRESHOLD_PARAMS_CMDID), - WM_ID_DESC(WMI_SET_LPREAMBLE_CMDID), - WM_ID_DESC(WMI_SET_RTS_CMDID), /* 50 */ - WM_ID_DESC(WMI_CLR_RSSI_SNR_CMDID), - WM_ID_DESC(WMI_SET_FIXRATES_CMDID), - WM_ID_DESC(WMI_GET_FIXRATES_CMDID), - WM_ID_DESC(WMI_SET_AUTH_MODE_CMDID), - WM_ID_DESC(WMI_SET_REASSOC_MODE_CMDID), - WM_ID_DESC(WMI_SET_WMM_CMDID), - WM_ID_DESC(WMI_SET_WMM_TXOP_CMDID), - WM_ID_DESC(WMI_TEST_CMDID), - /* COEX AR6002 only*/ - WM_ID_DESC(WMI_SET_BT_STATUS_CMDID), - WM_ID_DESC(WMI_SET_BT_PARAMS_CMDID), /* 60 */ - - WM_ID_DESC(WMI_SET_KEEPALIVE_CMDID), - WM_ID_DESC(WMI_GET_KEEPALIVE_CMDID), - WM_ID_DESC(WMI_SET_APPIE_CMDID), - WM_ID_DESC(WMI_GET_APPIE_CMDID), - WM_ID_DESC(WMI_SET_WSC_STATUS_CMDID), - - /* Wake on Wireless */ - WM_ID_DESC(WMI_SET_HOST_SLEEP_MODE_CMDID), - WM_ID_DESC(WMI_SET_WOW_MODE_CMDID), - WM_ID_DESC(WMI_GET_WOW_LIST_CMDID), - WM_ID_DESC(WMI_ADD_WOW_PATTERN_CMDID), - WM_ID_DESC(WMI_DEL_WOW_PATTERN_CMDID), /* 70 */ - - WM_ID_DESC(WMI_SET_FRAMERATES_CMDID), - WM_ID_DESC(WMI_SET_AP_PS_CMDID), - WM_ID_DESC(WMI_SET_QOS_SUPP_CMDID), -}; - -static const struct wmi_id_desc cmdxs_desc[] = { - WM_ID_DESC(WMI_SET_BITRATE_CMDID), - WM_ID_DESC(WMI_GET_BITRATE_CMDID), - WM_ID_DESC(WMI_SET_WHALPARAM_CMDID), - - - /*Should add the new command to the tail for compatible with - * etna. - */ - WM_ID_DESC(WMI_SET_MAC_ADDRESS_CMDID), - WM_ID_DESC(WMI_SET_AKMP_PARAMS_CMDID), - WM_ID_DESC(WMI_SET_PMKID_LIST_CMDID), - WM_ID_DESC(WMI_GET_PMKID_LIST_CMDID), - WM_ID_DESC(WMI_ABORT_SCAN_CMDID), - WM_ID_DESC(WMI_SET_TARGET_EVENT_REPORT_CMDID), - - /* Unused */ - WM_ID_DESC(WMI_UNUSED1), - WM_ID_DESC(WMI_UNUSED2), - - /* - * AP mode commands - */ - WM_ID_DESC(WMI_AP_HIDDEN_SSID_CMDID), - WM_ID_DESC(WMI_AP_SET_NUM_STA_CMDID), - WM_ID_DESC(WMI_AP_ACL_POLICY_CMDID), - WM_ID_DESC(WMI_AP_ACL_MAC_LIST_CMDID), - WM_ID_DESC(WMI_AP_CONFIG_COMMIT_CMDID), - WM_ID_DESC(WMI_AP_SET_MLME_CMDID), - WM_ID_DESC(WMI_AP_SET_PVB_CMDID), - WM_ID_DESC(WMI_AP_CONN_INACT_CMDID), - WM_ID_DESC(WMI_AP_PROT_SCAN_TIME_CMDID), - WM_ID_DESC(WMI_AP_SET_COUNTRY_CMDID), - WM_ID_DESC(WMI_AP_SET_DTIM_CMDID), - WM_ID_DESC(WMI_AP_MODE_STAT_CMDID), - - WM_ID_DESC(WMI_SET_IP_CMDID), - WM_ID_DESC(WMI_SET_PARAMS_CMDID), - WM_ID_DESC_FMT(WMI_SET_MCAST_FILTER_CMDID, sizeof(WMI_SET_MCAST_FILTER_CMD)), - WM_ID_DESC_FMT(WMI_DEL_MCAST_FILTER_CMDID, sizeof(WMI_SET_MCAST_FILTER_CMD)), - - WM_ID_DESC(WMI_ALLOW_AGGR_CMDID), - WM_ID_DESC(WMI_ADDBA_REQ_CMDID), - WM_ID_DESC(WMI_DELBA_REQ_CMDID), - WM_ID_DESC(WMI_SET_HT_CAP_CMDID), - WM_ID_DESC(WMI_SET_HT_OP_CMDID), - WM_ID_DESC(WMI_SET_TX_SELECT_RATES_CMDID), - WM_ID_DESC(WMI_SET_TX_SGI_PARAM_CMDID), - WM_ID_DESC(WMI_SET_RATE_POLICY_CMDID), - - WM_ID_DESC(WMI_HCI_CMD_CMDID), - WM_ID_DESC(WMI_RX_FRAME_FORMAT_CMDID), - WM_ID_DESC(WMI_SET_THIN_MODE_CMDID), - WM_ID_DESC(WMI_SET_BT_WLAN_CONN_PRECEDENCE_CMDID), - - WM_ID_DESC(WMI_AP_SET_11BG_RATESET_CMDID), - WM_ID_DESC(WMI_SET_PMK_CMDID), - WM_ID_DESC_FMT(WMI_MCAST_FILTER_CMDID, sizeof(WMI_MCAST_FILTER_CMD)), - /* COEX CMDID AR6003*/ - WM_ID_DESC_FMT(WMI_SET_BTCOEX_FE_ANT_CMDID, sizeof(WMI_SET_BTCOEX_FE_ANT_CMD)), - WM_ID_DESC(WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID), - WM_ID_DESC_FMT(WMI_SET_BTCOEX_SCO_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_SCO_CONFIG_CMD)), - WM_ID_DESC_FMT(WMI_SET_BTCOEX_A2DP_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_A2DP_CONFIG_CMD)), - WM_ID_DESC_FMT(WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD)), - WM_ID_DESC_FMT(WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD)), - WM_ID_DESC(WMI_SET_BTCOEX_DEBUG_CMDID), - WM_ID_DESC_FMT(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID, sizeof(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD)), - WM_ID_DESC(WMI_GET_BTCOEX_STATS_CMDID), - WM_ID_DESC(WMI_GET_BTCOEX_CONFIG_CMDID), - - WM_ID_DESC(WMI_SET_DFS_ENABLE_CMDID), /* F034 */ - WM_ID_DESC(WMI_SET_DFS_MINRSSITHRESH_CMDID), - WM_ID_DESC(WMI_SET_DFS_MAXPULSEDUR_CMDID), - WM_ID_DESC(WMI_DFS_RADAR_DETECTED_CMDID), - - /* P2P CMDS */ - WM_ID_DESC(WMI_P2P_SET_CONFIG_CMDID), /* F038 */ - WM_ID_DESC(WMI_WPS_SET_CONFIG_CMDID), - WM_ID_DESC(WMI_SET_REQ_DEV_ATTR_CMDID), - WM_ID_DESC(WMI_P2P_FIND_CMDID), - WM_ID_DESC(WMI_P2P_STOP_FIND_CMDID), - WM_ID_DESC(WMI_P2P_GO_NEG_START_CMDID), - WM_ID_DESC(WMI_P2P_LISTEN_CMDID), - - WM_ID_DESC(WMI_CONFIG_TX_MAC_RULES_CMDID), - WM_ID_DESC(WMI_SET_PROMISCUOUS_MODE_CMDID),/* F040 */ - WM_ID_DESC(WMI_RX_FRAME_FILTER_CMDID), - WM_ID_DESC(WMI_SET_CHANNEL_CMDID), - - /* WAC commands */ - WM_ID_DESC(WMI_ENABLE_WAC_CMDID), - WM_ID_DESC(WMI_WAC_SCAN_REPLY_CMDID), - WM_ID_DESC(WMI_WAC_CTRL_REQ_CMDID), - WM_ID_DESC(WMI_SET_DIV_PARAMS_CMDID), - - WM_ID_DESC(WMI_GET_PMK_CMDID), - WM_ID_DESC(WMI_SET_PASSPHRASE_CMDID), - WM_ID_DESC(WMI_SEND_ASSOC_RES_CMDID), - WM_ID_DESC(WMI_SET_ASSOC_REQ_RELAY_CMDID), - WM_ID_DESC(WMI_GET_RFKILL_MODE_CMDID), - WM_ID_DESC(WMI_SET_RFKILL_MODE_CMDID), - - /* ACS command, consists of sub-commands */ - WM_ID_DESC(WMI_ACS_CTRL_CMDID), - - /* Ultra low power store / recall commands */ - WM_ID_DESC(WMI_STORERECALL_CONFIGURE_CMDID), - WM_ID_DESC(WMI_STORERECALL_RECALL_CMDID), - WM_ID_DESC(WMI_STORERECALL_HOST_READY_CMDID), - WM_ID_DESC(WMI_FORCE_TARGET_ASSERT_CMDID), - WM_ID_DESC(WMI_SET_EXCESS_TX_RETRY_THRES_CMDID), - - WM_ID_DESC(WMI_P2P_GO_NEG_REQ_RSP_CMDID), /* F053 */ - WM_ID_DESC(WMI_P2P_GRP_INIT_CMDID), - WM_ID_DESC(WMI_P2P_GRP_FORMATION_DONE_CMDID), - WM_ID_DESC(WMI_P2P_INVITE_CMDID), - WM_ID_DESC(WMI_P2P_INVITE_REQ_RSP_CMDID), - WM_ID_DESC(WMI_P2P_PROV_DISC_REQ_CMDID), - WM_ID_DESC(WMI_P2P_SET_CMDID), - - WM_ID_DESC(WMI_AP_SET_APSD_CMDID), /* F05A */ - WM_ID_DESC(WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID), - - WM_ID_DESC(WMI_P2P_SDPD_TX_CMDID), /* F05C */ - WM_ID_DESC(WMI_P2P_STOP_SDPD_CMDID), - WM_ID_DESC(WMI_P2P_CANCEL_CMDID), -}; - -static int dbg_wmi_cmd_params_pos, dbg_wmi_cmd_params_cmdid; -static A_UINT8 *dbg_wmi_cmd_params_buf; - -static int WMI_EVENT_SEND_XTND_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - const char *txt; - A_INT32 evt = buffer[1]; - switch (evt) { - CASE_STR(WMIX_DSETOPENREQ_EVENTID, txt); - CASE_STR(WMIX_DSETCLOSE_EVENTID, txt); - CASE_STR(WMIX_DSETDATAREQ_EVENTID, txt); - CASE_STR(WMIX_GPIO_INTR_EVENTID, txt); - CASE_STR(WMIX_GPIO_DATA_EVENTID, txt); - CASE_STR(WMIX_GPIO_ACK_EVENTID, txt); - CASE_STR(WMIX_HB_CHALLENGE_RESP_EVENTID, txt); - CASE_STR(WMIX_DBGLOG_EVENTID, txt); - CASE_STR(WMIX_PROF_COUNT_EVENTID, txt); - CASE_DEF_STR(txt); - } - return snprintf(output, len, "%s", txt); -} - -static int WMI_EVENT_SEND_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 idx = buffer[1]; - A_INT32 sidx; - if (idx>=(A_INT32)WMI_READY_EVENTID && - idx<(A_INT32)(WMI_READY_EVENTID+ARRAY_SIZE(evt_desc))) { - sidx = idx - WMI_READY_EVENTID; - return snprintf(output, len, "%s", evt_desc[sidx].desc); - } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && - idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) { - sidx = idx - WMI_SET_BITRATE_CMDID; - return snprintf(output, len, "%s", cmdxs_desc[sidx].desc); - } - return 0; -} - - -static int WMI_CMD_RX_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 idx = buffer[1]; - A_INT32 length = buffer[2]; - A_INT32 sidx; - if (idx>=(A_INT32)WMI_CONNECT_CMDID && - idx<(A_INT32)(WMI_CONNECT_CMDID+ARRAY_SIZE(cmds_desc))) { - sidx = idx-WMI_CONNECT_CMDID; - return snprintf(output, len, "%s, len %d", - cmds_desc[sidx].desc, length); - } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && - idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) { - sidx = idx - WMI_SET_BITRATE_CMDID; - return snprintf(output, len, "%s, len %d", - cmdxs_desc[sidx].desc, length); - } - return 0; -} - -static int WMI_CMD_PARAMS_DUMP_START_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - A_INT32 paramslen = buffer[2]; - paramslen += (sizeof(A_INT32) * 2); /* adding pad */ - dbg_wmi_cmd_params_pos = 0; - dbg_wmi_cmd_params_cmdid = buffer[1]; - dbg_wmi_cmd_params_buf = (paramslen>0) ? malloc(paramslen) : NULL; - return 0; -} - -static int WMI_CMD_PARAMS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - if (dbg_wmi_cmd_params_buf == NULL) { - /* partial debug log where there is no START. Skip it*/ - return 0; - } - memcpy(&dbg_wmi_cmd_params_buf[dbg_wmi_cmd_params_pos], &buffer[1], sizeof(A_INT32)); - memcpy(&dbg_wmi_cmd_params_buf[dbg_wmi_cmd_params_pos+4], &buffer[2], sizeof(A_INT32)); - dbg_wmi_cmd_params_pos += (sizeof(A_INT32) * 2); - return 0; -} - -static int WMI_CMD_PARAMS_DUMP_END_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer) -{ - int ret = 0; - A_INT32 idx = dbg_wmi_cmd_params_cmdid; - DbgCmdFormatter cmdFormatter = NULL; - size_t cmdSize; - if (dbg_wmi_cmd_params_buf == NULL) { - /* partial debug log where there is no START. Skip it*/ - return 0; - } - if (idx>=(A_INT32)WMI_CONNECT_CMDID && - idx<(A_INT32)(WMI_CONNECT_CMDID+ARRAY_SIZE(cmds_desc)) ) { - cmdFormatter = cmds_desc[idx-WMI_CONNECT_CMDID].formatter; - cmdSize = cmds_desc[idx-WMI_CONNECT_CMDID].cmdSize; - } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && - idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) { - cmdFormatter = cmdxs_desc[idx-WMI_SET_BITRATE_CMDID].formatter; - cmdSize = cmdxs_desc[idx-WMI_SET_BITRATE_CMDID].cmdSize; - } - if (cmdFormatter) { - ret += snprintf(output+ret, len-ret, " "); - if (dbg_wmi_cmd_params_pos>=cmdSize) { - ret += cmdFormatter(output+ret, len-ret, dbg_wmi_cmd_params_buf); - } else { - ret += snprintf(output+ret, len-ret, "malformed cmd. size too small %d < %d", - dbg_wmi_cmd_params_pos, cmdSize); - } - } - dbg_wmi_cmd_params_pos = 0; - dbg_wmi_cmd_params_cmdid = 0; - free(dbg_wmi_cmd_params_buf); - dbg_wmi_cmd_params_buf = NULL; - return ret; -} - -static struct dbglog_desc wmi_desc[] = { - DBG_DESC(0), - DBG_DESC(WMI_CMD_RX_XTND_PKT_TOO_SHORT), - DBG_DESC(WMI_EXTENDED_CMD_NOT_HANDLED), - DBG_DESC(WMI_CMD_RX_PKT_TOO_SHORT), - DBG_DESC(WMI_CALLING_WMI_EXTENSION_FN), - DBG_DESC(WMI_CMD_NOT_HANDLED), - DBG_DESC(WMI_IN_SYNC), - DBG_DESC(WMI_TARGET_WMI_SYNC_CMD), - DBG_DESC(WMI_SET_SNR_THRESHOLD_PARAMS), - DBG_DESC(WMI_SET_RSSI_THRESHOLD_PARAMS), - DBG_DESC(WMI_SET_LQ_TRESHOLD_PARAMS), - DBG_DESC(WMI_TARGET_CREATE_PSTREAM_CMD), - DBG_DESC(WMI_WI_DTM_INUSE), - DBG_DESC(WMI_TARGET_DELETE_PSTREAM_CMD), - DBG_DESC(WMI_TARGET_IMPLICIT_DELETE_PSTREAM_CMD), - DBG_DESC(WMI_TARGET_GET_BIT_RATE_CMD), - DBG_DESC(WMI_GET_RATE_MASK_CMD_FIX_RATE_MASK_IS), - DBG_DESC(WMI_TARGET_GET_AVAILABLE_CHANNELS_CMD), - DBG_DESC(WMI_TARGET_GET_TX_PWR_CMD), - DBG_DESC(WMI_FREE_EVBUF_WMIBUF), - DBG_DESC(WMI_FREE_EVBUF_DATABUF), - DBG_DESC(WMI_FREE_EVBUF_BADFLAG), - DBG_DESC(WMI_HTC_RX_ERROR_DATA_PACKET), - DBG_DESC(WMI_HTC_RX_SYNC_PAUSING_FOR_MBOX), - DBG_DESC(WMI_INCORRECT_WMI_DATA_HDR_DROPPING_PKT), - DBG_DESC(WMI_SENDING_READY_EVENT), - DBG_DESC(WMI_SETPOWER_MDOE_TO_MAXPERF), - DBG_DESC(WMI_SETPOWER_MDOE_TO_REC), - DBG_DESC(WMI_BSSINFO_EVENT_FROM), - DBG_DESC(WMI_TARGET_GET_STATS_CMD), - DBG_DESC(WMI_SENDING_SCAN_COMPLETE_EVENT), - DBG_DESC(WMI_SENDING_RSSI_INDB_THRESHOLD_EVENT), - DBG_DESC(WMI_SENDING_RSSI_INDBM_THRESHOLD_EVENT), - DBG_DESC(WMI_SENDING_LINK_QUALITY_THRESHOLD_EVENT), - DBG_DESC(WMI_SENDING_ERROR_REPORT_EVENT), - DBG_DESC(WMI_SENDING_CAC_EVENT), - DBG_DESC(WMI_TARGET_GET_ROAM_TABLE_CMD), - DBG_DESC(WMI_TARGET_GET_ROAM_DATA_CMD), - DBG_DESC(WMI_SENDING_GPIO_INTR_EVENT), - DBG_DESC(WMI_SENDING_GPIO_ACK_EVENT), - DBG_DESC(WMI_SENDING_GPIO_DATA_EVENT), - DBG_DESC_FMT(WMI_CMD_RX), - DBG_DESC(WMI_CMD_RX_XTND), - DBG_DESC_FMT(WMI_EVENT_SEND), - DBG_DESC_FMT(WMI_EVENT_SEND_XTND), - DBG_DESC_FMT(WMI_CMD_PARAMS_DUMP_START), - DBG_DESC_FMT(WMI_CMD_PARAMS_DUMP_END), - DBG_DESC_FMT(WMI_CMD_PARAMS), -}; - -static struct dbglog_desc co_desc[] = { - DBG_DESC(0), - DBG_DESC(CO_INIT), - DBG_DESC(CO_ACQUIRE_LOCK), - DBG_DESC(CO_START_OP1), - DBG_DESC(CO_START_OP2), - DBG_DESC(CO_DRAIN_TX_COMPLETE_CB), - DBG_DESC(CO_CHANGE_CHANNEL_CB), - DBG_DESC(CO_RETURN_TO_HOME_CHANNEL), - DBG_DESC(CO_FINISH_OP_TIMEOUT), - DBG_DESC(CO_OP_END), - DBG_DESC(CO_CANCEL_OP), - DBG_DESC_FMT(CO_CHANGE_CHANNEL), - DBG_DESC(CO_RELEASE_LOCK), - DBG_DESC_FMT(CO_CHANGE_STATE), -}; - -static struct dbglog_desc mgmtbuf_desc[] = { - DBG_DESC(0), - DBG_DESC(TXRX_MGMTBUF_ALLOCATE_BUF), - DBG_DESC(TXRX_MGMTBUF_ALLOCATE_SM_BUF), - DBG_DESC(TXRX_MGMTBUF_ALLOCATE_RMBUF), - DBG_DESC(TXRX_MGMTBUF_GET_BUF), - DBG_DESC(TXRX_MGMTBUF_GET_SM_BUF), - DBG_DESC(TXRX_MGMTBUF_QUEUE_BUF_TO_TXQ), - DBG_DESC_FMT(TXRX_MGMTBUF_REAPED_BUF), - DBG_DESC(TXRX_MGMTBUF_REAPED_SM_BUF), - DBG_DESC_FMT(TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN), - DBG_DESC(TXRX_MGMTBUF_WAIT_FOR_TXQ_SFQ_DRAIN), - DBG_DESC(TXRX_MGMTBUF_ENQUEUE_INTO_DATA_SFQ), - DBG_DESC(TXRX_MGMTBUF_DEQUEUE_FROM_DATA_SFQ), - DBG_DESC(TXRX_MGMTBUF_PAUSE_DATA_TXQ), - DBG_DESC(TXRX_MGMTBUF_RESUME_DATA_TXQ), - DBG_DESC(TXRX_MGMTBUF_WAIT_FORTXQ_DRAIN_TIMEOUT), - DBG_DESC_FMT(TXRX_MGMTBUF_DRAINQ), - DBG_DESC(TXRX_MGMTBUF_INDICATE_Q_DRAINED), - DBG_DESC(TXRX_MGMTBUF_ENQUEUE_INTO_HW_SFQ), - DBG_DESC(TXRX_MGMTBUF_DEQUEUE_FROM_HW_SFQ), - DBG_DESC(TXRX_MGMTBUF_PAUSE_HW_TXQ), - DBG_DESC(TXRX_MGMTBUF_RESUME_HW_TXQ), - DBG_DESC(TXRX_MGMTBUF_TEAR_DOWN_BA), - DBG_DESC(TXRX_MGMTBUF_PROCESS_ADDBA_REQ), - DBG_DESC(TXRX_MGMTBUF_PROCESS_DELBA), - DBG_DESC(TXRX_MGMTBUF_PERFORM_BA), - DBG_DESC_FMT(TXRX_MGMTBUF_WLAN_RESET_ON_ERROR), -}; - -static struct dbglog_desc dc_desc[] = { - DBG_DESC(0), - DBG_DESC_FMT(DC_SCAN_CHAN_START), - DBG_DESC_FMT(DC_SCAN_CHAN_FINISH), - DBG_DESC(DC_BEACON_RECEIVE7), - DBG_DESC_FMT(DC_SSID_PROBE_CB), - DBG_DESC_FMT(DC_SEND_NEXT_SSID_PROBE), - DBG_DESC_FMT(DC_START_SEARCH), - DBG_DESC(DC_CANCEL_SEARCH_CB), - DBG_DESC(DC_STOP_SEARCH), - DBG_DESC(DC_END_SEARCH), - DBG_DESC(DC_MIN_CHDWELL_TIMEOUT), - DBG_DESC(DC_START_SEARCH_CANCELED), - DBG_DESC_FMT(DC_SET_POWER_MODE), - DBG_DESC(DC_INIT), - DBG_DESC_FMT(DC_SEARCH_OPPORTUNITY), - DBG_DESC_FMT(DC_RECEIVED_ANY_BEACON), - DBG_DESC(DC_RECEIVED_MY_BEACON), - DBG_DESC(DC_PROFILE_IS_ADHOC_BUT_BSS_IS_INFRA), - DBG_DESC(DC_PS_ENABLED_BUT_ATHEROS_IE_ABSENT), - DBG_DESC(DC_BSS_ADHOC_CHANNEL_NOT_ALLOWED), - DBG_DESC(DC_SET_BEACON_UPDATE), - DBG_DESC(DC_BEACON_UPDATE_COMPLETE), - DBG_DESC(DC_END_SEARCH_BEACON_UPDATE_COMP_CB), - DBG_DESC(DC_BSSINFO_EVENT_DROPPED), - DBG_DESC(DC_IEEEPS_ENABLED_BUT_ATIM_ABSENT), -}; - -static struct dbglog_desc btcoex_desc[] = { - DBG_DESC(0), - DBG_DESC(BTCOEX_STATUS_CMD), - DBG_DESC(BTCOEX_PARAMS_CMD), - DBG_DESC(BTCOEX_ANT_CONFIG), - DBG_DESC(BTCOEX_COLOCATED_BT_DEVICE), - DBG_DESC(BTCOEX_CLOSE_RANGE_SCO_ON), - DBG_DESC(BTCOEX_CLOSE_RANGE_SCO_OFF), - DBG_DESC(BTCOEX_CLOSE_RANGE_A2DP_ON), - DBG_DESC(BTCOEX_CLOSE_RANGE_A2DP_OFF), - DBG_DESC(BTCOEX_A2DP_PROTECT_ON), - DBG_DESC(BTCOEX_A2DP_PROTECT_OFF), - DBG_DESC(BTCOEX_SCO_PROTECT_ON), - DBG_DESC(BTCOEX_SCO_PROTECT_OFF), - DBG_DESC(BTCOEX_CLOSE_RANGE_DETECTOR_START), - DBG_DESC(BTCOEX_CLOSE_RANGE_DETECTOR_STOP), - DBG_DESC(BTCOEX_CLOSE_RANGE_TOGGLE), - DBG_DESC(BTCOEX_CLOSE_RANGE_TOGGLE_RSSI_LRCNT), - DBG_DESC(BTCOEX_CLOSE_RANGE_RSSI_THRESH), - DBG_DESC(BTCOEX_CLOSE_RANGE_LOW_RATE_THRESH), - DBG_DESC(BTCOEX_PTA_PRI_INTR_HANDLER), - DBG_DESC_FMT(BTCOEX_PSPOLL_QUEUED), - DBG_DESC_FMT(BTCOEX_PSPOLL_COMPLETE), - DBG_DESC_FMT(BTCOEX_DBG_PM_AWAKE), - DBG_DESC_FMT(BTCOEX_DBG_PM_SLEEP), - DBG_DESC(BTCOEX_DBG_SCO_COEX_ON), - DBG_DESC(BTCOEX_SCO_DATARECEIVE), - DBG_DESC(BTCOEX_INTR_INIT), - DBG_DESC(BTCOEX_PTA_PRI_DIFF), - DBG_DESC_FMT(BTCOEX_TIM_NOTIFICATION), - DBG_DESC(BTCOEX_SCO_WAKEUP_ON_DATA), - DBG_DESC(BTCOEX_SCO_SLEEP), - DBG_DESC_FMT(BTCOEX_SET_WEIGHTS), - DBG_DESC(BTCOEX_SCO_DATARECEIVE_LATENCY_VAL), - DBG_DESC(BTCOEX_SCO_MEASURE_TIME_DIFF), - DBG_DESC(BTCOEX_SET_EOL_VAL), - DBG_DESC(BTCOEX_OPT_DETECT_HANDLER), - DBG_DESC(BTCOEX_SCO_TOGGLE_STATE), - DBG_DESC(BTCOEX_SCO_STOMP), - DBG_DESC(BTCOEX_NULL_COMP_CALLBACK), - DBG_DESC(BTCOEX_RX_INCOMING), - DBG_DESC(BTCOEX_RX_INCOMING_CTL), - DBG_DESC(BTCOEX_RX_INCOMING_MGMT), - DBG_DESC(BTCOEX_RX_INCOMING_DATA), - DBG_DESC(BTCOEX_RTS_RECEPTION), - DBG_DESC(BTCOEX_FRAME_PRI_LOW_RATE_THRES), - DBG_DESC_FMT(BTCOEX_PM_FAKE_SLEEP), - DBG_DESC_FMT(BTCOEX_ACL_COEX_STATUS), - DBG_DESC(BTCOEX_ACL_COEX_DETECTION), - DBG_DESC(BTCOEX_A2DP_COEX_STATUS), - DBG_DESC(BTCOEX_SCO_STATUS), - DBG_DESC_FMT(BTCOEX_WAKEUP_ON_DATA), - DBG_DESC(BTCOEX_DATARECEIVE), - DBG_DESC(0), - DBG_DESC(BTCOEX_GET_MAX_AGGR_SIZE), - DBG_DESC(BTCOEX_MAX_AGGR_AVAIL_TIME), - DBG_DESC(BTCOEX_DBG_WBTIMER_INTR), - DBG_DESC(0), - DBG_DESC(BTCOEX_DBG_SCO_SYNC), - DBG_DESC(0), - DBG_DESC(BTCOEX_UPLINK_QUEUED_RATE), - DBG_DESC(BTCOEX_DBG_UPLINK_ENABLE_EOL), - DBG_DESC(BTCOEX_UPLINK_FRAME_DURATION), - DBG_DESC(BTCOEX_UPLINK_SET_EOL), - DBG_DESC(BTCOEX_DBG_EOL_EXPIRED), - DBG_DESC(BTCOEX_DBG_DATA_COMPLETE), - DBG_DESC(BTCOEX_UPLINK_QUEUED_TIMESTAMP), - DBG_DESC(BTCOEX_DBG_DATA_COMPLETE_TIME), - DBG_DESC(BTCOEX_DBG_A2DP_ROLE_IS_SLAVE), - DBG_DESC(BTCOEX_DBG_A2DP_ROLE_IS_MASTER), - DBG_DESC(BTCOEX_DBG_UPLINK_SEQ_NUM), - DBG_DESC(BTCOEX_UPLINK_AGGR_SEQ), - DBG_DESC(BTCOEX_DBG_TX_COMP_SEQ_NO), - DBG_DESC(BTCOEX_DBG_MAX_AGGR_PAUSE_STATE), - DBG_DESC(BTCOEX_DBG_ACL_TRAFFIC), - DBG_DESC(BTCOEX_CURR_AGGR_PROP), - DBG_DESC(BTCOEX_DBG_SCO_GET_PER_TIME_DIFF), - DBG_DESC(BTCOEX_PSPOLL_PROCESS), - DBG_DESC(BTCOEX_RETURN_FROM_MAC), - DBG_DESC(BTCOEX_FREED_REQUEUED_CNT), - DBG_DESC(BTCOEX_DBG_TOGGLE_LOW_RATES), - DBG_DESC(BTCOEX_MAC_GOES_TO_SLEEP), - DBG_DESC(BTCOEX_DBG_A2DP_NO_SYNC), - DBG_DESC(BTCOEX_RETURN_FROM_MAC_HOLD_Q_INFO), - DBG_DESC(BTCOEX_RETURN_FROM_MAC_AC), - DBG_DESC(BTCOEX_DBG_DTIM_RECV), - DBG_DESC(0), - DBG_DESC(BTCOEX_IS_PRE_UPDATE), - DBG_DESC(BTCOEX_ENQUEUED_BIT_MAP), - DBG_DESC(BTCOEX_TX_COMPLETE_FIRST_DESC_STATS), - DBG_DESC(BTCOEX_UPLINK_DESC), - DBG_DESC(BTCOEX_SCO_GET_PER_FIRST_FRM_TIMESTAMP), - DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), - DBG_DESC(BTCOEX_DBG_RECV_ACK), - DBG_DESC(BTCOEX_DBG_ADDBA_INDICATION), - DBG_DESC(BTCOEX_TX_COMPLETE_EOL_FAILED), - DBG_DESC(BTCOEX_DBG_A2DP_USAGE_COMPLETE), - DBG_DESC(BTCOEX_DBG_A2DP_STOMP_FOR_BCN_HANDLER), - DBG_DESC(BTCOEX_DBG_A2DP_SYNC_INTR), - DBG_DESC(BTCOEX_DBG_A2DP_STOMP_FOR_BCN_RECEPTION), - DBG_DESC(BTCOEX_FORM_AGGR_CURR_AGGR), - DBG_DESC(BTCOEX_DBG_TOGGLE_A2DP_BURST_CNT), - DBG_DESC(BTCOEX_DBG_BT_TRAFFIC), - DBG_DESC(BTCOEX_DBG_STOMP_BT_TRAFFIC), - DBG_DESC(BTCOEX_RECV_NULL), - DBG_DESC(BTCOEX_DBG_A2DP_MASTER_BT_END), - DBG_DESC(BTCOEX_DBG_A2DP_BT_START), - DBG_DESC(BTCOEX_DBG_A2DP_SLAVE_BT_END), - DBG_DESC(BTCOEX_DBG_A2DP_STOMP_BT), - DBG_DESC_FMT(BTCOEX_DBG_GO_TO_SLEEP), - DBG_DESC(BTCOEX_DBG_A2DP_PKT), - DBG_DESC(BTCOEX_DBG_A2DP_PSPOLL_DATA_RECV), - DBG_DESC(BTCOEX_DBG_A2DP_NULL), - DBG_DESC(BTCOEX_DBG_UPLINK_DATA), - DBG_DESC(BTCOEX_DBG_A2DP_STOMP_LOW_PRIO_NULL), - DBG_DESC(BTCOEX_DBG_ADD_BA_RESP_TIMEOUT), - DBG_DESC(BTCOEX_DBG_TXQ_STATE), - DBG_DESC_FMT(BTCOEX_DBG_ALLOW_SCAN), - DBG_DESC_FMT(BTCOEX_DBG_SCAN_REQUEST), - DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), - DBG_DESC(BTCOEX_A2DP_SLEEP), - DBG_DESC(BTCOEX_DBG_DATA_ACTIV_TIMEOUT), - DBG_DESC(BTCOEX_DBG_SWITCH_TO_PSPOLL_ON_MODE), - DBG_DESC(BTCOEX_DBG_SWITCH_TO_PSPOLL_OFF_MODE), - DBG_DESC(BTCOEX_DATARECEIVE_AGGR), - DBG_DESC(BTCOEX_DBG_DATA_RECV_SLEEPING_PENDING), - DBG_DESC(BTCOEX_DBG_DATARESP_TIMEOUT), - DBG_DESC(BTCOEX_BDG_BMISS), - DBG_DESC(BTCOEX_DBG_DATA_RECV_WAKEUP_TIM), - DBG_DESC(BTCOEX_DBG_SECOND_BMISS), - DBG_DESC(0), - DBG_DESC_FMT(BTCOEX_DBG_SET_WLAN_STATE), - DBG_DESC(BTCOEX_BDG_FIRST_BMISS), - DBG_DESC(BTCOEX_DBG_A2DP_CHAN_OP), - DBG_DESC(BTCOEX_DBG_A2DP_INTR), - DBG_DESC_FMT(BTCOEX_DBG_BT_INQUIRY), - DBG_DESC(BTCOEX_DBG_BT_INQUIRY_DATA_FETCH), - DBG_DESC(BTCOEX_DBG_POST_INQUIRY_FINISH), - DBG_DESC(BTCOEX_DBG_SCO_OPT_MODE_TIMER_HANDLER), - DBG_DESC(BTCOEX_DBG_NULL_FRAME_SLEEP), - DBG_DESC(BTCOEX_DBG_NULL_FRAME_AWAKE), - DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), - DBG_DESC(BTCOEX_DBG_SET_AGGR_SIZE), - DBG_DESC(BTCOEX_DBG_TEAR_BA_TIMEOUT), - DBG_DESC(BTCOEX_DBG_MGMT_FRAME_SEQ_NO), - DBG_DESC(BTCOEX_DBG_SCO_STOMP_HIGH_PRI), - DBG_DESC(BTCOEX_DBG_COLOCATED_BT_DEV), - DBG_DESC(BTCOEX_DBG_FE_ANT_TYPE), - DBG_DESC(BTCOEX_DBG_BT_INQUIRY_CMD), - DBG_DESC(BTCOEX_DBG_SCO_CONFIG), - DBG_DESC(BTCOEX_DBG_SCO_PSPOLL_CONFIG), - DBG_DESC(BTCOEX_DBG_SCO_OPTMODE_CONFIG), - DBG_DESC(BTCOEX_DBG_A2DP_CONFIG), - DBG_DESC(BTCOEX_DBG_A2DP_PSPOLL_CONFIG), - DBG_DESC(BTCOEX_DBG_A2DP_OPTMODE_CONFIG), - DBG_DESC(BTCOEX_DBG_ACLCOEX_CONFIG), - DBG_DESC(BTCOEX_DBG_ACLCOEX_PSPOLL_CONFIG), - DBG_DESC(BTCOEX_DBG_ACLCOEX_OPTMODE_CONFIG), - DBG_DESC(BTCOEX_DBG_DEBUG_CMD), - DBG_DESC(BTCOEX_DBG_SET_BT_OPERATING_STATUS), - DBG_DESC(BTCOEX_DBG_GET_CONFIG), - DBG_DESC(BTCOEX_DBG_GET_STATS), - DBG_DESC(BTCOEX_DBG_BT_OPERATING_STATUS), - DBG_DESC(BTCOEX_DBG_PERFORM_RECONNECT), - DBG_DESC(0), - DBG_DESC(BTCOEX_DBG_ACL_WLAN_MED), - DBG_DESC(BTCOEX_DBG_ACL_BT_MED), - DBG_DESC(BTCOEX_DBG_WLAN_CONNECT), - DBG_DESC(BTCOEX_DBG_A2DP_DUAL_START), - DBG_DESC(BTCOEX_DBG_PMAWAKE_NOTIFY), - DBG_DESC(BTCOEX_DBG_BEACON_SCAN_ENABLE), - DBG_DESC(BTCOEX_DBG_BEACON_SCAN_DISABLE), - DBG_DESC(BTCOEX_DBG_RX_NOTIFY), - DBG_DESC(BTCOEX_SCO_GET_PER_SECOND_FRM_TIMESTAMP), - DBG_DESC(BTCOEX_DBG_TXQ_DETAILS), - DBG_DESC(BTCOEX_DBG_SCO_STOMP_LOW_PRI), - DBG_DESC(BTCOEX_DBG_A2DP_FORCE_SCAN), - DBG_DESC(BTCOEX_DBG_DTIM_STOMP_COMP), - DBG_DESC(BTCOEX_ACL_PRESENCE_TIMER), - DBG_DESC(BTCOEX_DBG_QUEUE_SELF_CTS), - DBG_DESC(BTCOEX_DBG_SELF_CTS_COMP), - DBG_DESC(BTCOEX_DBG_APMODE_WAIT_FOR_CTS_COMP_FAILED), - DBG_DESC(BTCOEX_DBG_APMODE_A2DP_MED_TO_BT), - DBG_DESC(BTCOEX_DBG_APMODE_SET_BTSTATE), - DBG_DESC(BTCOEX_DBG_APMODE_A2DP_STATUS), - DBG_DESC(BTCOEX_DBG_APMODE_SCO_CTS_HANDLER), - DBG_DESC(BTCOEX_DBG_APMODE_SCO_STATUS), - DBG_DESC(BTCOEX_DBG_APMODE_TXQ_DRAINED), - DBG_DESC(BTCOEX_DBG_APMODE_SCO_ARM_TIMER), - DBG_DESC(BTCOEX_DBG_APMODE_SWITCH_MED_TO_WLAN), - DBG_DESC(BTCOEX_APMODE_BCN_TX_HANDLER), - DBG_DESC(BTCOEX_APMODE_BCN_TX), - DBG_DESC(BTCOEX_APMODE_SCO_RTS_HANDLER), -}; - -static struct dbglog_desc pm_desc[] = { - DBG_DESC(0), - DBG_DESC(PM_INIT), - DBG_DESC(PM_ENABLE), - DBG_DESC_FMT(PM_SET_STATE), - DBG_DESC_FMT(PM_SET_POWERMODE), - DBG_DESC(PM_CONN_NOTIFY), - DBG_DESC(PM_REF_COUNT_NEGATIVE), - DBG_DESC(PM_INFRA_STA_APSD_ENABLE), - DBG_DESC(PM_INFRA_STA_UPDATE_APSD_STATE), - DBG_DESC_FMT(PM_CHAN_OP_REQ), - DBG_DESC_FMT(PM_SET_MY_BEACON_POLICY), - DBG_DESC_FMT(PM_SET_ALL_BEACON_POLICY), - DBG_DESC(PM_INFRA_STA_SET_PM_PARAMS1), - DBG_DESC(PM_INFRA_STA_SET_PM_PARAMS2), - DBG_DESC(PM_ADHOC_SET_PM_CAPS_FAIL), - DBG_DESC(PM_ADHOC_UNKNOWN_IBSS_ATTRIB_ID), - DBG_DESC(PM_ADHOC_SET_PM_PARAMS), - DBG_DESC(0), - DBG_DESC(PM_ADHOC_STATE1), - DBG_DESC(PM_ADHOC_STATE2), - DBG_DESC(PM_ADHOC_CONN_MAP), - DBG_DESC_FMT(PM_FAKE_SLEEP), - DBG_DESC(PM_AP_STATE1), - DBG_DESC(PM_AP_SET_PM_PARAMS), - DBG_DESC(PM_P2P_STATE1), -}; - -static struct dbglog_desc dummy_desc[] = { - DBG_DESC(0), -}; - -static struct module_desc modules[] = { - MODULE_DESC(INF, dummy_desc), - MODULE_DESC(WMI, wmi_desc), - MODULE_DESC(MISC, dummy_desc), - MODULE_DESC(PM, pm_desc), - MODULE_DESC(TXRX_MGMTBUF, mgmtbuf_desc), - MODULE_DESC(TXRX_TXBUF, dummy_desc), - MODULE_DESC(TXRX_RXBUF, dummy_desc), - MODULE_DESC(WOW, dummy_desc), - MODULE_DESC(WHAL, dummy_desc), - MODULE_DESC(DC, dc_desc), - MODULE_DESC(CO, co_desc), - MODULE_DESC(RO, dummy_desc), - MODULE_DESC(CM, dummy_desc), - MODULE_DESC(MGMT, dummy_desc), - MODULE_DESC(TMR, dummy_desc), - MODULE_DESC(BTCOEX, btcoex_desc), -}; - -static int compOid(const void *a, const void *b) -{ - return *(A_INT32*)a - *(A_INT32*)b; -} - -static void do_check_ids() -{ - size_t m, d, td; - for (m=0; dbglog_id_tag[m][1][0]!='\0'; ++m) { - size_t mlen; - struct dbglog_desc *dlog; - if (m >= ARRAY_SIZE(modules)) { - printf("module does not matched\n"); - break; - } - dlog = modules[m].descs; - mlen = modules[m].len; - d=td=1; - while (dlog && (d=mlen) { - if (dlog != dummy_desc) { - printf("m %s dbgid %s(%d) is larger than max internal table %d host/firmware mismatch?\n", - modules[m].name, dbglog_id_tag[m][td], td, mlen); - } - break; - } - - if (dbglog_id_tag[m][td][0]=='\0' && dlog[d].oid!=0) { - for (;td < DBGLOG_DBGID_NUM_MAX && dbglog_id_tag[m][td][0]=='\0'; ++td); - } - if (strcmp(dbglog_id_tag[m][td], dlog[d].desc)!=0 && dlog[d].oid!=0) { - printf("debug id does not matched '%s' <> '%s'\n", dbglog_id_tag[m][td], dlog[d].desc); - break; - } else { - if (td!=d && !modules[m].bsearch) { - printf("Module %s debugid %s(%d) mismatched. using binary search for debugid", - modules[m].name, dbglog_id_tag[m][td], td); - modules[m].bsearch = 1; - } - } - ++d; ++td; - } - if (modules[m].bsearch && dlog) { - qsort(dlog, mlen, sizeof(dlog[0]), compOid); - } - } - check_ids = 1; -} - -static DbgLogFormatter getFormatter(A_INT32 moduleid, A_INT32 debugid) -{ - if (!check_ids) { - do_check_ids(); - } - - if ( moduleid < ARRAY_SIZE(modules)) { - const struct module_desc *m = &modules[moduleid]; - if (m->descs ) { - if (m->bsearch){ - struct dbglog_desc *d; - d = (struct dbglog_desc*)bsearch(&debugid, m->descs, m->len, sizeof(m->descs[0]), compOid); - return d ? d->formatter : NULL; - } else if (debugid>0 && debugidlen) { - return m->descs[debugid].formatter; - } - } - } - return NULL; -} - -int dbg_formater(int lv, char *output, size_t len, A_UINT32 ts, A_INT32 *logbuf) -{ - int ret = 0; - A_UINT32 debugid = DBGLOG_GET_DBGID(logbuf[0]); - A_UINT32 moduleid = DBGLOG_GET_MODULEID(logbuf[0]); - A_UINT32 numargs = DBGLOG_GET_NUMARGS(logbuf[0]); - A_UINT32 timestamp = DBGLOG_GET_TIMESTAMP(logbuf[0]); - DbgLogFormatter dbgFormatter = NULL; - - if (numargs>2) { - return ret; - } - - if (lv > 0) { - dbgFormatter = getFormatter(moduleid, debugid); - } - - if (ts>0) { - if (lv == 0) { - ret += snprintf(output+ret, len-ret, "%8d: ", ts); - } else { - ret += strftime(output+ret, len-ret, "%m-%d %H:%M:%S ", gmtime((time_t*)&ts)); - } - } - ret += snprintf(output+ret, len-ret, "%s (%d)", dbglog_id_tag[moduleid][debugid], - timestamp); - if (lv>1 || lv == 0 || !dbgFormatter) { - if (numargs>0) { - ret += snprintf(output+ret, len-ret, ": 0x%x", logbuf[1]); - } - if (numargs>1) { - ret += snprintf(output+ret, len-ret, ", 0x%x", logbuf[2]); - } - if (dbgFormatter && numargs>0 && lv > 0) { - ret += snprintf(output+ret, len-ret, ", "); - } - } else { - ret += snprintf(output+ret, len-ret, ": "); - } - - if (dbgFormatter && lv > 0) { - int pos = ret; - int addlen; - addlen = dbgFormatter(output+ret, len-ret, numargs, logbuf); - if (addlen>0) { - ret += addlen; - } else if (lv<=1) { - /* skip this message */ - (void)pos; - return 0; - } - } - ret += snprintf(output+ret, len-ret, "\n"); - return ret; -} - diff --git a/drivers/net/wireless/ar6003/host/tools/recEvent/recEvent.c b/drivers/net/wireless/ar6003/host/tools/recEvent/recEvent.c deleted file mode 100644 index 161b7453e852..000000000000 --- a/drivers/net/wireless/ar6003/host/tools/recEvent/recEvent.c +++ /dev/null @@ -1,950 +0,0 @@ -/* - * Copyright (c) 2006 Atheros Communications Inc. - * All rights reserved. - * - * - * -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, 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. -// -// - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -extern char *if_indextoname (unsigned int __ifindex, char *__ifname); -#include -#ifdef ANDROID -#include "wireless_copy.h" -#else -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#undef DEBUG -#undef DBGLOG_DEBUG - -#define ID_LEN 2 -#define DBGLOG_FILE "dbglog.h" -#define DBGLOGID_FILE "dbglog_id.h" - -#define GET_CURRENT_TIME(s) do { \ - time_t t; \ - t = time(NULL); \ - s = strtok(ctime(&t), "\n"); \ -} while (0); - -#ifdef ANDROID -#define DEBUG 1 -#include -#endif - - -#define AR6K_DBG_BUFFER_SIZE 256 - -struct dbg_binary_header { - A_UINT8 sig; - A_UINT8 ver; - A_UINT16 len; - A_UINT32 reserved; -}; - -struct dbg_binary_record { - A_UINT32 ts; /* Timestamp of the log */ - A_UINT32 length; /* Length of the log */ - A_UINT8 log[AR6K_DBG_BUFFER_SIZE]; /* log message */ -}; - -static int ATH_WE_VERSION = 0; - -#define SRCDIR_FLAG 0x01 -#define LOGFILE_FLAG 0x02 -#define DBGREC_LIMIT_FLAG 0x04 -#define RESTORE_FLAG 0x08 -#define BINARY_FLAG 0x10 - -const char *progname; -char restorefile[PATH_MAX]; -char dbglogfile[PATH_MAX]; -char dbglogidfile[PATH_MAX]; -char dbglogoutfile[PATH_MAX]; -FILE *fpout; -int dbgRecLimit = 1000000; /* Million records is a good default */ -int optionflag; -char dbglog_id_tag[DBGLOG_MODULEID_NUM_MAX][DBGLOG_DBGID_NUM_MAX][DBGLOG_DBGID_DEFINITION_LEN_MAX]; -const char options[] = -"Options:\n\ --f, --logfile= [Mandatory]\n\ --g, --debug (-gg to print out dbglog info together) [Optional]\n\ --b, --binary\n\ --d, --srcdir= [Mandatory if not binary]\n\ --l, --reclimit= [Optional]\n\ --r, --restore=