/* * Function: Initialize * Description: Initialize the WiMAX CommonAPI */ WIMAX_API_RET wimaxcu_initialize(WIMAX_API_DEVICE_ID_P p_device_id) { WIMAX_API_RET wmxStatus; WIMAX_API_HW_DEVICE_ID HwDeviceIdList[MAX_DEVICE]; UINT32 numDevice = MAX_DEVICE; memset(HwDeviceIdList, 0, sizeof(WIMAX_API_HW_DEVICE_ID) * MAX_DEVICE); // open the Common API and initialize iwmax sdk, agents wmxStatus = WiMaxAPIOpen(p_device_id); if (WIMAX_API_RET_SUCCESS != wmxStatus) { return wmxStatus; } // get the list of the device before open the device wmxStatus = GetListDevice(p_device_id, (WIMAX_API_HW_DEVICE_ID_P) HwDeviceIdList, &numDevice); if (WIMAX_API_RET_SUCCESS != wmxStatus) { return wmxStatus; } p_device_id->deviceIndex = HwDeviceIdList[0].deviceIndex; // Open the device to get the permission wmxStatus = WiMaxDeviceOpen(p_device_id); if (WIMAX_API_RET_SUCCESS != wmxStatus) { return wmxStatus; } if (pthread_mutex_init(&g_console_owner_mutex, NULL) != 0) { printf("Internal Error!\n"); return WIMAX_API_RET_FAILED; } if (sem_init(&g_semConnectionUtility, 0, 0) == -1) { printf("Internal Error!\n"); return WIMAX_API_RET_FAILED; } if (sem_init(&g_semRfState, 0, 0) == -1) { printf("Internal Error!\n"); return WIMAX_API_RET_FAILED; } if (sem_init(&g_semConnectCompleted, 0, 0) == -1) { printf("Internal Error!\n"); return WIMAX_API_RET_FAILED; } wmxStatus = SubscribeDeviceStatusChange(p_device_id, &ind_device_update_cb); if (WIMAX_API_RET_SUCCESS != wmxStatus) { PrintWmxStatus(wmxStatus); return WIMAX_API_RET_FAILED; } return WIMAX_API_RET_SUCCESS; }
static void iwmx_sdk_addremove_cb(WIMAX_API_DEVICE_ID *devid, BOOL presence) { unsigned int cnt; WIMAX_API_RET r; WIMAX_API_HW_DEVICE_ID device_id_list[5]; UINT32 device_id_list_size = ARRAY_SIZE(device_id_list); char errstr[512]; UINT32 errstr_size = sizeof(errstr); g_mutex_lock(&add_remove_mutex); nm_log_dbg(LOGD_WIMAX, "cb: handle %u index #%u is %d", devid->sdkHandle, devid->deviceIndex, presence); r = GetListDevice(devid, device_id_list, &device_id_list_size); if (r != WIMAX_API_RET_SUCCESS) { GetErrorString(devid, r, errstr, &errstr_size); nm_log_err(LOGD_WIMAX, "wmxsdk: Cannot obtain list of devices: %d (%s)", r, errstr); goto out; } if (device_id_list_size == 0) { nm_log_dbg(LOGD_WIMAX, "No WiMAX devices reported"); } else { for (cnt = 0; cnt < device_id_list_size; cnt++) { WIMAX_API_HW_DEVICE_ID *dev = device_id_list + cnt; nm_log_dbg(LOGD_WIMAX, "#%u index #%u device %s", cnt, dev->deviceIndex, dev->deviceName); } } if (presence) { WIMAX_API_HW_DEVICE_ID *dev; /* Make sure the wimax NS isn't lying to us */ if (device_id_list_size < devid->deviceIndex) { nm_log_err(LOGD_WIMAX, "wmxsdk: changed device (%u) not in the list? (%u items)", devid->deviceIndex, device_id_list_size); goto out; } /* Add the device to our internal list */ dev = device_id_list + devid->deviceIndex; iwmx_sdk_dev_add(devid->deviceIndex, dev->deviceIndex, dev->deviceName); } else { /* Remove the device from our internal list */ int idx = deviceid_to_index(devid); if (idx >= 0) iwmx_sdk_dev_rm(idx); } out: g_mutex_unlock(&add_remove_mutex); }
/* * Initialize the WiMAX API, register with it, setup callbacks for * device coming up / dissapearing */ int iwmx_sdk_api_init(void) { int result; unsigned int cnt; WIMAX_API_RET r; char errstr[512]; UINT32 errstr_size = sizeof(errstr); WIMAX_API_HW_DEVICE_ID device_id_list[5]; UINT32 device_id_list_size = ARRAY_SIZE(device_id_list); memset(&g_api, 0, sizeof(g_api)); g_api.privilege = WIMAX_API_PRIVILEGE_READ_WRITE; result = -EIO; r = WiMaxAPIOpen(&g_api); if (r != WIMAX_API_RET_SUCCESS) { GetErrorString(&g_api, r, errstr, &errstr_size); nm_log_err(LOGD_WIMAX, "wmxsdk: WiMaxAPIOpen failed with %d (%s)", r, errstr); goto error_wimaxapiopen; } r = SubscribeDeviceInsertRemove(&g_api, iwmx_sdk_addremove_cb); if (r != WIMAX_API_RET_SUCCESS) { GetErrorString(&g_api, r, errstr, &errstr_size); nm_log_err(LOGD_WIMAX, "wmxsdk: insert/remove subscribe failed with %d (%s)", r, errstr); goto error_close; } r = GetListDevice(&g_api, device_id_list, &device_id_list_size); if (r != WIMAX_API_RET_SUCCESS) { GetErrorString(&g_api, r, errstr, &errstr_size); nm_log_err(LOGD_WIMAX, "wmxsdk: Cannot obtain list of devices: %d (%s)", r, errstr); goto error_close; } if (device_id_list_size < g_api.deviceIndex) { nm_log_err(LOGD_WIMAX, "wmxsdk: changed device (%u) not in the list? (%u items)", g_api.deviceIndex, device_id_list_size); } if (device_id_list_size == 0) { nm_log_dbg(LOGD_WIMAX, "No WiMAX devices reported"); } else { for (cnt = 0; cnt < device_id_list_size; cnt++) { WIMAX_API_HW_DEVICE_ID *dev = device_id_list + cnt; nm_log_dbg(LOGD_WIMAX, "#%u index #%u device %s", cnt, dev->deviceIndex, dev->deviceName); iwmx_sdk_dev_add(cnt, dev->deviceIndex, dev->deviceName); } } return 0; error_close: WiMaxAPIClose(&g_api); error_wimaxapiopen: return result; }