/* Send HCI cmd via wl iovar HCI_cmd to the dongle. */ int dhd_bta_docmd(dhd_pub_t *pub, void *cmd_buf, uint cmd_len) { amp_hci_cmd_t *cmd = (amp_hci_cmd_t *)cmd_buf; uint8 buf[BTA_HCI_CMD_MAX_LEN + 16]; uint len = sizeof(buf); wl_ioctl_t ioc; if (cmd_len < HCI_CMD_PREAMBLE_SIZE) return BCME_BADLEN; if ((uint)cmd->plen + HCI_CMD_PREAMBLE_SIZE > cmd_len) return BCME_BADLEN; len = bcm_mkiovar("HCI_cmd", (char *)cmd, (uint)cmd->plen + HCI_CMD_PREAMBLE_SIZE, (char *)buf, len); memset(&ioc, 0, sizeof(ioc)); ioc.cmd = WLC_SET_VAR; ioc.buf = buf; ioc.len = len; ioc.set = TRUE; return dhd_wl_ioctl(pub, &ioc, ioc.buf, ioc.len); }
int dhd_iscan_request(void *dhdp, u16 action) { int rc; wl_iscan_params_t params; dhd_pub_t *dhd = dhd_bus_pub(dhdp); char buf[WLC_IOCTL_SMLEN]; memset(¶ms, 0, sizeof(wl_iscan_params_t)); memcpy(¶ms.params.bssid, ðer_bcast, ETH_ALEN); params.params.bss_type = DOT11_BSSTYPE_ANY; params.params.scan_type = DOT11_SCANTYPE_ACTIVE; params.params.nprobes = -1; params.params.active_time = -1; params.params.passive_time = -1; params.params.home_time = -1; params.params.channel_num = 0; params.version = ISCAN_REQ_VERSION; params.action = action; params.scan_duration = 0; bcm_mkiovar("iscan", (char *)¶ms, sizeof(wl_iscan_params_t), buf, WLC_IOCTL_SMLEN); rc = dhd_wl_ioctl(dhdp, WLC_SET_VAR, buf, WLC_IOCTL_SMLEN); return rc; }
int dhd_wl_ioctl_cmd(dhd_pub_t *dhd_pub, int cmd, void *arg, int len, uint8 set, int ifindex) { wl_ioctl_t ioc; ioc.cmd = cmd; ioc.buf = arg; ioc.len = len; ioc.set = set; return dhd_wl_ioctl(dhd_pub, ifindex, &ioc, arg, len); }
static int dhd_iscan_get_partial_result(void *dhdp, uint *scan_count) { wl_iscan_results_t *list_buf; wl_iscan_results_t list; wl_scan_results_t *results; iscan_buf_t *iscan_cur; int status = -1; dhd_pub_t *dhd = dhd_bus_pub(dhdp); int rc; iscan_cur = dhd_iscan_allocate_buf(dhd, &iscan_chain); if (!iscan_cur) { DHD_ERROR(("%s: Failed to allocate node\n", __func__)); dhd_iscan_free_buf(dhdp, 0); dhd_iscan_request(dhdp, WL_SCAN_ACTION_ABORT); goto fail; } dhd_iscan_lock(); memset(iscan_cur->iscan_buf, 0, WLC_IW_ISCAN_MAXLEN); list_buf = (wl_iscan_results_t *) iscan_cur->iscan_buf; results = &list_buf->results; results->buflen = WL_ISCAN_RESULTS_FIXED_SIZE; results->version = 0; results->count = 0; memset(&list, 0, sizeof(list)); list.results.buflen = WLC_IW_ISCAN_MAXLEN; bcm_mkiovar("iscanresults", (char *)&list, WL_ISCAN_RESULTS_FIXED_SIZE, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN); rc = dhd_wl_ioctl(dhdp, WLC_GET_VAR, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN); results->buflen = results->buflen; results->version = results->version; *scan_count = results->count = results->count; status = list_buf->status; dhd_iscan_unlock(); if (!(*scan_count)) dhd_iscan_free_buf(dhdp, iscan_cur); else dhd_iscan_remove_duplicates(dhdp, iscan_cur); fail: return status; }