wcnss: Build and dlopen wcnss_qmi_client as a shared library
* Allows us to decouple QMI from wcnss_service for those devices that
rely on QMI features for wcnss.
Change-Id: I30a1f9a8760dcd19761d473cedb2104b7b33069c
wcnss_qmi: Allow targets to provide custom libwcnss_qmi
Change-Id: I9aedd4b8633a81ecb3cd292299826e3daca60656
wcnss_service: Fix build fail when WCNSS_QMI_OSS is defined
Change-Id: I9b14f384901586df5c5e255b15cbeeba20bb6277
diff --git a/wcnss-service/Android.mk b/wcnss-service/Android.mk
index fd33ee1..68faddb 100644
--- a/wcnss-service/Android.mk
+++ b/wcnss-service/Android.mk
@@ -9,6 +9,9 @@
LOCAL_SRC_FILES := wcnss_service.c
LOCAL_SHARED_LIBRARIES := libc libcutils libutils liblog
ifeq ($(strip $(TARGET_USES_QCOM_WCNSS_QMI)),true)
+ifeq ($(TARGET_USES_WCNSS_MAC_ADDR_REV),true)
+LOCAL_CFLAGS += -DWCNSS_QMI_MAC_ADDR_REV
+endif
LOCAL_CFLAGS += -DWCNSS_QMI
ifeq ($(filter 10% Q% q%,$(TARGET_PLATFORM_VERSION)),)
#For Android R and above, assuming not compiling on Q and lower
diff --git a/wcnss-service/wcnss_service.c b/wcnss-service/wcnss_service.c
index e2a67af..fcdec48 100644
--- a/wcnss-service/wcnss_service.c
+++ b/wcnss-service/wcnss_service.c
@@ -45,6 +45,9 @@
#include "wcnss_qmi_client.h"
#include "mdm_detect.h"
#endif
+#ifdef WCNSS_QMI_OSS
+#include <dlfcn.h>
+#endif
#define SUCCESS 0
#define FAILED -1
@@ -81,7 +84,7 @@
#define HEXA_A 10
#define HEX_BASE 16
-#ifdef WCNSS_QMI
+#if defined (WCNSS_QMI) || defined(WCNSS_QMI_OSS)
#define WLAN_ADDR_SIZE 6
unsigned char wlan_nv_mac_addr[WLAN_ADDR_SIZE];
#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
@@ -390,7 +393,7 @@
}
-#ifdef WCNSS_QMI
+#if defined(WCNSS_QMI) || defined(WCNSS_QMI_OSS)
void setup_wcnss_parameters(int *cal, int nv_mac_addr)
#else
void setup_wcnss_parameters(int *cal)
@@ -427,7 +430,7 @@
}
}
-#ifdef WCNSS_QMI
+#if defined(WCNSS_QMI) || defined (WCNSS_QMI_OSS)
if (SUCCESS == nv_mac_addr)
{
pos = 0;
@@ -721,12 +724,66 @@
}
+#ifdef WCNSS_QMI_OSS
+static void *wcnss_qmi_handle = NULL;
+static int (*wcnss_init_qmi)(void) = NULL;
+static int (*wcnss_qmi_get_wlan_address)(unsigned char *) = NULL;
+static void (*wcnss_qmi_deinit)(void) = NULL;
+
+static int setup_wcnss_qmi(void)
+{
+ const char *error = NULL;
+
+ /* initialize the DMS client and request the wlan mac address */
+ wcnss_qmi_handle = dlopen("libwcnss_qmi.so", RTLD_NOW);
+ if (!wcnss_qmi_handle) {
+ ALOGE("Failed to open libwcnss_qmi.so: %s", dlerror());
+ goto dlopen_err;
+ }
+
+ dlerror();
+
+ wcnss_init_qmi = dlsym(wcnss_qmi_handle, "wcnss_init_qmi");
+ if ((error = dlerror()) != NULL) {
+ ALOGE("Failed to resolve function: %s: %s",
+ "wcnss_init_qmi", error);
+ goto dlsym_err;
+ }
+
+ dlerror();
+
+ wcnss_qmi_get_wlan_address = dlsym(wcnss_qmi_handle,
+ "wcnss_qmi_get_wlan_address");
+ if ((error = dlerror()) != NULL) {
+ ALOGE("Failed to resolve function: %s: %s",
+ "wcnss_qmi_get_wlan_address", error);
+ goto dlsym_err;
+ }
+
+ dlerror();
+
+ wcnss_qmi_deinit = dlsym(wcnss_qmi_handle, "wcnss_qmi_deinit");
+ if ((error = dlerror()) != NULL) {
+ ALOGE("Failed to resolve function: %s: %s",
+ "wcnss_qmi_deinit", error);
+ goto dlsym_err;
+ }
+
+ return SUCCESS;
+
+dlsym_err:
+ dlclose(wcnss_qmi_handle);
+dlopen_err:
+ return FAILED;
+}
+#endif
+
int main(int argc, char *argv[])
{
UNUSED(argc), UNUSED(argv);
int rc;
int fd_dev, ret_cal;
-#ifdef WCNSS_QMI
+#if defined(WCNSS_QMI) || defined(WCNSS_QMI_OSS)
int nv_mac_addr = FAILED;
struct dev_info mdm_detect_info;
int nom = 0;
@@ -734,6 +791,28 @@
setup_wlan_config_file();
+#ifdef WCNSS_QMI_OSS
+ /* dlopen WCNSS QMI lib */
+
+ rc = setup_wcnss_qmi();
+ if (rc == SUCCESS) {
+ if (SUCCESS == (*wcnss_init_qmi)()) {
+ rc = (*wcnss_qmi_get_wlan_address)(wlan_nv_mac_addr);
+ if (rc == SUCCESS) {
+ nv_mac_addr = SUCCESS;
+ ALOGE("WLAN MAC Addr:" MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(wlan_nv_mac_addr));
+ } else
+ ALOGE("Failed to Get MAC addr from modem");
+
+ (*wcnss_qmi_deinit)();
+ }
+ else
+ ALOGE("Failed to Initialize wcnss QMI Interface");
+ } else {
+ ALOGE("Failed to Initialize wcnss QMI interface library");
+ }
+#endif
#ifdef WCNSS_QMI
/* Call ESOC API to get the number of modems.
If the number of modems is not zero, only then proceed
@@ -780,7 +859,7 @@
dynamic_nv_replace();
-#ifdef WCNSS_QMI
+#if defined(WCNSS_QMI) || defined(WCNSS_QMI_OSS)
setup_wcnss_parameters(&ret_cal, nv_mac_addr);
#else
setup_wcnss_parameters(&ret_cal);
@@ -812,5 +891,9 @@
close(fd_dev);
+#ifdef WCNSS_QMI_OSS
+ dlclose(wcnss_qmi_handle);
+#endif
+
return rc;
}