static int wpa_driver_tista_config_power_management(void *priv, TPowerMgr_PowerMode *mode, u8 is_set) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; if(is_set) /* set power mode */ { if((mode->PowerMode) < POWER_MODE_MAX) { if(0 != wpa_driver_tista_private_send(priv, TIWLN_802_11_POWER_MODE_SET, mode, sizeof(TPowerMgr_PowerMode), NULL, 0)) { wpa_printf(MSG_ERROR, "ERROR - Failed to set power mode"); return -1; } } else { wpa_printf(MSG_ERROR, "ERROR - Invalid Power Mode"); return -1; } } else /* get power mode */ { if(0 != wpa_driver_tista_private_send(priv, TIWLN_802_11_POWER_MODE_GET, NULL, 0, mode, sizeof(TPowerMgr_PowerMode))) { wpa_printf(MSG_ERROR, "ERROR - Failed to get power mode"); return -1; } } wpa_printf(MSG_DEBUG, "wpa_driver_tista_config_power_management success"); return 0; }
static int wpa_driver_tista_enable_bt_coe(void *priv, u32 mode) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 mode_set = mode; /* Mapping the mode between UI enum and driver enum */ switch(mode_set) { case BLUETOOTH_COEXISTENCE_MODE_ENABLED: mode_set = SG_OPPORTUNISTIC; break; case BLUETOOTH_COEXISTENCE_MODE_SENSE: mode_set = SG_PROTECTIVE; break; case BLUETOOTH_COEXISTENCE_MODE_DISABLED: mode_set = SG_DISABLE; break; default: wpa_printf(MSG_DEBUG, "wpa_driver_tista_enable_bt_coe - Unknown Mode"); return -1; break; } if(0 != wpa_driver_tista_private_send(priv, SOFT_GEMINI_SET_ENABLE, &mode_set, sizeof(u32), NULL, 0)) { wpa_printf(MSG_ERROR, "ERROR - Failed to enable BtCoe"); return -1; } wpa_printf(MSG_DEBUG, "wpa_driver_tista_enable_bt_coe success"); return 0; }
static int wpa_driver_tista_get_rssi(void *priv, int *rssi_data, int *rssi_beacon) { u8 bssid[ETH_ALEN]; struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; TCuCommon_RoamingStatisticsTable buffer; os_memset(&buffer, 0, sizeof(TCuCommon_RoamingStatisticsTable)); *rssi_data = 0; *rssi_beacon = 0; if (wpa_driver_tista_get_bssid(priv, bssid) == 0 && os_memcmp(bssid, "\x00\x00\x00\x00\x00\x00", ETH_ALEN) != 0) { if(0 != wpa_driver_tista_private_send(priv, TIWLN_802_11_RSSI, NULL, 0, &buffer, sizeof(TCuCommon_RoamingStatisticsTable))) { wpa_printf(MSG_ERROR, "ERROR - Failed to get rssi level"); return -1; } *rssi_data = (s8)buffer.rssi; *rssi_beacon = (s8)buffer.rssiBeacon; wpa_printf(MSG_DEBUG, "wpa_driver_tista_get_rssi data %d beacon %d success", *rssi_data, *rssi_beacon); } else { wpa_printf(MSG_DEBUG, "no WiFi link."); return -1; } return 0; }
/*----------------------------------------------------------------------------- Routine Name: wpa_driver_tista_scan Routine Description: request scan from driver Arguments: priv - pointer to private data structure ssid - ssid buffer ssid_len - length of ssid Return Value: 0 on success, -1 on failure -----------------------------------------------------------------------------*/ static int wpa_driver_tista_scan( void *priv, const u8 *ssid, size_t ssid_len ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx); struct wpa_ssid *issid; scan_Params_t scanParams; int scan_type, res, timeout, scan_probe_flag = 0; wpa_printf(MSG_DEBUG, "%s", __func__); TI_CHECK_DRIVER( drv->driver_is_loaded, -1 ); #if 1 os_memset(&scanParams, 0, sizeof(scan_Params_t)); /* Initialize scan parameters */ scan_type = drv->scan_type; if (wpa_s->prev_scan_ssid != BROADCAST_SSID_SCAN) { if (wpa_s->prev_scan_ssid->scan_ssid) { scan_type = SCAN_TYPE_NORMAL_ACTIVE; scan_probe_flag = 1; } } scanParams.scanType = scan_type; scanParams.numOfChannels = drv->scan_channels; scanParams.probeReqNumber = SCAN_DEFAULT_PROBE_REQUEST_NUM; scanParams.probeRequestRate = RATE_MASK_UNSPECIFIED; /* Let the FW select */; scanParams.desiredSsid.len = 0; drv->force_merge_flag = 0; /* Set merge flag */ if ((scan_probe_flag && ssid) && (ssid_len > 0 && ssid_len <= sizeof(scanParams.desiredSsid.str))) { os_memcpy(scanParams.desiredSsid.str, ssid, ssid_len); if (ssid_len < sizeof(scanParams.desiredSsid.str)) scanParams.desiredSsid.str[ssid_len] = '\0'; scanParams.desiredSsid.len = ssid_len; drv->force_merge_flag = 1; } drv->last_scan = scan_type; /* Remember scan type for last scan */ res = wpa_driver_tista_private_send(priv, TIWLN_802_11_START_OS_SCAN_SET, &scanParams, sizeof(scanParams), NULL, 0); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to do tista scan!"); else wpa_printf(MSG_DEBUG, "wpa_driver_tista_scan OS_SCAN success"); timeout = 30; wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d sec", res, timeout); eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv->wext, drv->ctx); eloop_register_timeout(timeout, 0, wpa_driver_wext_scan_timeout, drv->wext, drv->ctx); return res; #else return wpa_driver_wext_scan(drv->wext, ssid, ssid_len); #endif }
static int wpa_driver_tista_set_operstate(void *priv, int state) { struct wpa_driver_ti_data *drv = priv; wpa_printf(MSG_DEBUG, "%s: operstate %d (%s)", __func__, /*drv->operstate,*/ state, state ? "UP" : "DORMANT"); TI_CHECK_DRIVER( drv->driver_is_loaded, -1 ); /* Dm: drv->operstate = state; */ wpa_driver_tista_private_send(priv, RSN_PORT_STATUS_PARAM, &state, sizeof(state), NULL, 0); return wpa_driver_wext_set_operstate(drv->wext, state); }
static int wpa_driver_tista_driver_rx_data_filter_statistics( void *priv, TCuCommon_RxDataFilteringStatistics *stats ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; int res; res = wpa_driver_tista_private_send(priv, TIWLN_GET_RX_DATA_FILTERS_STATISTICS, NULL, 0, stats, sizeof(TCuCommon_RxDataFilteringStatistics)); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to get RX data filter statistics!"); else wpa_printf(MSG_DEBUG, "%s success", __func__); return res; }
static int wpa_driver_tista_driver_disable_rx_data_filter( void *priv ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 val = FALSE; int res; res = wpa_driver_tista_private_send(priv, TIWLN_ENABLE_DISABLE_RX_DATA_FILTERS, &val, sizeof(u32), NULL, 0); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to disable RX data filter!"); else wpa_printf(MSG_DEBUG, "%s success", __func__); return res; }
static u8 wpa_driver_tista_get_rate( void *priv) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u8 val=0; int res; res = wpa_driver_tista_private_send(priv, TIWLN_802_11_CURRENT_RATES_GET, NULL, 0, &val, sizeof(u8)); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to get current rate"); else wpa_printf(MSG_DEBUG, "%s success: rate=%u", __func__, val); return (RATE_2_MBPS(val)); }
static int wpa_driver_tista_get_bt_coe_status(void *priv, u32 *mode) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 mode_get = 0; if(0 != wpa_driver_tista_private_send(priv, SOFT_GEMINI_GET_CONFIG, NULL, 0, &mode_get, sizeof(u32))) { wpa_printf(MSG_ERROR, "ERROR - Failed to get bt coe status"); return -1; } *mode = mode_get; wpa_printf(MSG_DEBUG, "wpa_driver_tista_get_bt_coe_status mode %d success", *mode); return 0; }
static int wpa_driver_tista_set_driver_ip(void *priv, u32 ip) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 staIp; int res; staIp = ip; res = wpa_driver_tista_private_send(priv, SITE_MGR_SET_WLAN_IP_PARAM, &ip, 4, NULL, 0); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to set driver ip!"); else wpa_printf(MSG_DEBUG, "%s success", __func__); return res; }
static int wpa_driver_tista_driver_stop( void *priv ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 uDummyBuf; s32 res; res = wpa_driver_tista_private_send(priv, DRIVER_STOP_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0); if (0 != res) { wpa_printf(MSG_ERROR, "ERROR - Failed to stop driver!"); wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED"); } else wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_stop success"); return res; }
static int wpa_driver_tista_driver_start( void *priv ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u32 uDummyBuf; s32 res; res = wpa_driver_tista_private_send(priv, DRIVER_START_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0); if (0 != res) { wpa_printf(MSG_ERROR, "ERROR - Failed to start driver!"); wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED"); } else { os_sleep(0, WPA_DRIVER_WEXT_WAIT_US); /* delay 400 ms */ wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_start success"); } return res; }
static int wpa_driver_tista_driver_rx_data_filter( void *priv, TRxDataFilterRequest *dfreq_ptr, u8 is_add ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; int cmd, res; if (is_add) { /* add rx data filter */ cmd = TIWLN_ADD_RX_DATA_FILTER; wpa_printf(MSG_DEBUG, "Add RX data filter"); } else { /* remove rx data filter */ cmd = TIWLN_REMOVE_RX_DATA_FILTER; wpa_printf(MSG_DEBUG, "Remove RX data filter"); } res = wpa_driver_tista_private_send(priv, cmd, dfreq_ptr, sizeof(TRxDataFilterRequest), NULL, 0); if (0 != res) wpa_printf(MSG_ERROR, "ERROR - Failed to handle rx data filter command!"); else wpa_printf(MSG_DEBUG, "%s success", __func__); return res; }
/*----------------------------------------------------------------------------- Routine Name: wpa_driver_tista_get_mac_addr Routine Description: return WLAN MAC address Arguments: priv - pointer to private data structure Return Value: pointer to BSSID -----------------------------------------------------------------------------*/ const u8 *wpa_driver_tista_get_mac_addr( void *priv ) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; u8 mac[ETH_ALEN] = {0}; TI_CHECK_DRIVER( drv->driver_is_loaded, NULL ); if(0 != wpa_driver_tista_private_send(priv, CTRL_DATA_MAC_ADDRESS, NULL, 0, mac, ETH_ALEN)) { wpa_printf(MSG_ERROR, "ERROR - Failed to get mac address!"); os_memset(drv->own_addr, 0, ETH_ALEN); } else { os_memcpy(drv->own_addr, mac, ETH_ALEN); wpa_printf(MSG_DEBUG, "Macaddr = " MACSTR, MAC2STR(drv->own_addr)); } wpa_printf(MSG_DEBUG, "wpa_driver_tista_get_mac_addr success"); return (const u8 *)&drv->own_addr; }
/*----------------------------------------------------------------------------- Routine Name: wpa_driver_tista_set_probe_req_ie Routine Description: set probe request ie for WSC mode change Arguments: priv - pointer to private data structure ies - probe_req_ie data ies_len - ie data length Return Value: actual buffer length - success, -1 - failure -----------------------------------------------------------------------------*/ static int wpa_driver_tista_set_probe_req_ie(void *priv, const u8* ies, size_t ies_len) { struct wpa_driver_ti_data *drv = (struct wpa_driver_ti_data *)priv; #ifdef CONFIG_WPS TWscMode WscModeStruct; TI_CHECK_DRIVER( drv->driver_is_loaded, -1 ); if ((!ies || (0 == ies_len)) && (NULL == drv->probe_req_ie)) { return 0; } if (ies && drv->probe_req_ie) { size_t len = wpabuf_len(drv->probe_req_ie); u8* data = (u8*)wpabuf_head(drv->probe_req_ie); if ((ies_len == len) && (0 == os_memcmp(ies, data, ies_len))) { return 0; } } os_memset(&WscModeStruct, 0, sizeof(TWscMode)); if (!ies || (0 == ies_len)) { WscModeStruct.WSCMode = TIWLN_SIMPLE_CONFIG_OFF; } else { const size_t head_len = 6; /* probeReqIe head: dd xx 00 50 f2 04 */ u8 *pos, *end; u16 password_id = 0; size_t min_len = 0; pos = (u8*)ies + head_len; /* Find the WSC mode in probe_req_ie by password_id */ end = (u8*)ies + ies_len; while (pos < end) { if (ATTR_DEV_PASSWORD_ID == WPA_GET_BE16(pos)) { password_id = WPA_GET_BE16(pos+4); break; } pos += (4 + WPA_GET_BE16(pos+2)); } WscModeStruct.WSCMode = (DEV_PW_PUSHBUTTON == password_id)?TIWLN_SIMPLE_CONFIG_PBC_METHOD:TIWLN_SIMPLE_CONFIG_PIN_METHOD; pos = (u8*)ies + head_len; min_len = ies_len - head_len; if (min_len > sizeof(WscModeStruct.probeReqWSCIE)) { min_len = sizeof(WscModeStruct.probeReqWSCIE); } os_memcpy(WscModeStruct.probeReqWSCIE, pos, min_len); } wpa_hexdump(MSG_DEBUG, "SetProbeReqIe:WscModeStruct", (u8*)&WscModeStruct, sizeof(TWscMode)); if(0 == wpa_driver_tista_private_send(priv, SITE_MGR_SIMPLE_CONFIG_MODE, (void*)&WscModeStruct, sizeof(TWscMode), NULL, 0)) { /* Update the cached probe req ie */ wpabuf_free(drv->probe_req_ie); drv->probe_req_ie = NULL; if (ies && ies_len) { drv->probe_req_ie = wpabuf_alloc(sizeof(WscModeStruct.probeReqWSCIE)); if (drv->probe_req_ie) { wpabuf_put_data(drv->probe_req_ie, ies, ies_len); } } } else { wpa_printf(MSG_ERROR, "ERROR - Failed to set wsc mode!"); return -1; } #endif return 0; }