mirror of
https://gitee.com/Vancouver2017/luban-lite.git
synced 2025-12-25 05:28:55 +00:00
394 lines
15 KiB
C
394 lines
15 KiB
C
|
|
#ifdef __RTOS__
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/unaligned.h>
|
|
#include <linux/bitops.h>
|
|
#include <linux/jiffies.h>
|
|
#include <linux/string.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/completion.h>
|
|
|
|
#include <linux/rcu.h>
|
|
#include "hgic.h"
|
|
#include "hgic_def.h"
|
|
|
|
|
|
extern struct hgic_fwctrl *hgic_get_ctrl(char *ifname);
|
|
|
|
int hgics_cmd(char *ifname, u32 ifidx, u32 cmd, u32 param1, u32 param2)
|
|
{
|
|
struct hgic_fwctrl *ctrl = NULL;
|
|
ctrl = hgic_get_ctrl(ifname);
|
|
if (!ctrl) {
|
|
hgic_err("Can not find drv ctrl,netif name %s\n", ifname);
|
|
return -1;
|
|
}
|
|
return hgic_ioctl(ctrl, ifidx, cmd, param1, param2);
|
|
}
|
|
|
|
int hgics_netdev_send_hci_data(u8 *ifname, u8 type, u8 *data, u32 data_len)
|
|
{
|
|
struct hgic_fwctrl *ctrl = NULL;
|
|
ctrl = hgic_get_ctrl(ifname);
|
|
if (!ctrl) {
|
|
hgic_err("Can not find drv ctrl,netif name %s\n", ifname);
|
|
return -1;
|
|
}
|
|
return hgic_fwctrl_send_hci_data(ctrl, type, data, data_len);
|
|
}
|
|
|
|
int hgic_ioctl(struct hgic_fwctrl *fwctrl, u32 ifidx, u32 cmd, u32 param1, u32 param2)
|
|
{
|
|
int ret = 0;
|
|
struct hgic_bus *bus = NULL;
|
|
u8 val[2] = {0};
|
|
|
|
switch (cmd) {
|
|
case HGIC_CMD_DEV_OPEN:
|
|
ret = hgic_fwctrl_open_dev(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_DEV_CLOSE:
|
|
ret = hgic_fwctrl_close_dev(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_SET_MAC:
|
|
ret = hgic_fwctrl_set_mac(fwctrl, ifidx, (u8 *)param1);
|
|
if (!ret) {
|
|
ret = eth_mac_addr(net_device_get_by_name(hgic_param_ifname(0)), (u8 *)param1);
|
|
}
|
|
break;
|
|
case HGIC_CMD_SET_SSID:
|
|
ret = hgic_fwctrl_set_ssid(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_BSSID:
|
|
ret = hgic_fwctrl_set_bssid(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_COUNTRY:
|
|
ret = hgic_fwctrl_set_countryregion(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_CHANNEL:
|
|
ret = hgic_fwctrl_set_channel(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_CENTER_FREQ:
|
|
ret = hgic_fwctrl_set_center_freq(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_RTS_THRESHOLD:
|
|
ret = hgic_fwctrl_set_rts_threshold(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_FRG_THRESHOLD:
|
|
ret = hgic_fwctrl_set_frag_threshold(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_KEY_MGMT:
|
|
ret = hgic_fwctrl_set_key_mgmt(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_WPA_PSK:
|
|
ret = hgic_fwctrl_set_wpa_psk(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
//HGIC_CMD_SET_KEY, // 13
|
|
case HGIC_CMD_SCAN:
|
|
ret = hgic_fwctrl_scan(fwctrl, ifidx,param1);
|
|
break;
|
|
case HGIC_CMD_GET_SCAN_LIST:
|
|
ret = hgic_fwctrl_get_scan_list(fwctrl, ifidx, (u8 *)param1, param2);
|
|
if (ret > 0) { ret /= sizeof(struct hgic_bss_info); }
|
|
break;
|
|
case HGIC_CMD_SET_BSSID_FILTER:
|
|
ret = hgic_fwctrl_set_bssid_filter(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
//HGIC_CMD_DISCONNECT, // 17
|
|
case HGIC_CMD_GET_BSSID:
|
|
ret = hgic_fwctrl_get_bssid(fwctrl, ifidx, (u8 *)param1,param2);
|
|
break;
|
|
case HGIC_CMD_SET_WBNAT:
|
|
ret = hgic_fwctrl_set_wbnat(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_STATUS:
|
|
ret = hgic_fwctrl_get_status(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_LISTEN_INTERVAL:
|
|
ret = hgic_fwctrl_set_listen_interval(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_TX_POWER:
|
|
ret = hgic_fwctrl_set_txpower(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_TX_POWER:
|
|
ret = hgic_fwctrl_get_txpower(fwctrl, ifidx);
|
|
break;
|
|
//HGIC_CMD_SET_TX_LCOUNT, // 24
|
|
//HGIC_CMD_SET_TX_SCOUNT, // 25
|
|
//HGIC_CMD_ADD_STA, // 26
|
|
//HGIC_CMD_REMOVE_STA, // 27
|
|
case HGIC_CMD_SET_TX_BW:
|
|
ret = hgic_fwctrl_set_tx_bw(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_TX_MCS:
|
|
ret = hgic_fwctrl_set_tx_mcs(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_FREQ_RANGE:
|
|
ret = hgic_fwctrl_set_freq_range(fwctrl, ifidx, *(u32 *)param1, *(u32 *)(param1 + 4), *(u32 *)(param1 + 8));
|
|
break;
|
|
case HGIC_CMD_ACS_ENABLE:
|
|
ret = hgic_fwctrl_set_acs(fwctrl, ifidx, param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_PRIMARY_CHAN:
|
|
ret = hgic_fwctrl_set_primary_chan(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_BG_RSSI:
|
|
ret = hgic_fwctrl_set_bgrssi(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_BSS_BW:
|
|
ret = hgic_fwctrl_set_bss_bw(fwctrl, ifidx, param1);
|
|
break;
|
|
//HGIC_CMD_TESTMODE_CMD, // 35
|
|
//HGIC_CMD_SET_AID, // 36
|
|
//HGIC_CMD_GET_FW_STATE, // 37
|
|
//HGIC_CMD_SET_TXQ_PARAM, // 38
|
|
case HGIC_CMD_SET_CHAN_LIST:
|
|
ret = hgic_fwctrl_set_chan_list(fwctrl, ifidx, (u16 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_GET_CONN_STATE:
|
|
ret = (hgic_fwctrl_get_conn_state(fwctrl, ifidx) == 9);
|
|
break;
|
|
case HGIC_CMD_SET_WORK_MODE:
|
|
ret = hgic_fwctrl_set_mode(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_PAIRED_STATIONS:
|
|
ret = hgic_fwctrl_set_paired_stas(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_GET_FW_INFO:
|
|
ret = hgic_fwctrl_get_fwinfo(fwctrl, ifidx, (struct hgic_fw_info *)param1);
|
|
break;
|
|
case HGIC_CMD_PAIRING:
|
|
ret = hgic_fwctrl_set_pairing(fwctrl, ifidx, (u8)param1);
|
|
break;
|
|
case HGIC_CMD_GET_TEMPERATURE:
|
|
ret = hgic_fwctrl_get_temperature(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_ENTER_SLEEP:
|
|
bus = hgic_get_bus(hgic_param_ifname(0));
|
|
if (param1) {
|
|
ret = hgic_fwctrl_enter_sleep(fwctrl, ifidx, (u8)param1);
|
|
if (!ret) {
|
|
if(bus) {
|
|
set_bit(HGIC_BUS_FLAGS_SLEEP, &bus->flags);
|
|
}
|
|
}
|
|
} else {
|
|
if (bus) {
|
|
if (test_bit(HGIC_BUS_FLAGS_SLEEP, &bus->flags)) {
|
|
clear_bit(HGIC_BUS_FLAGS_SLEEP, &bus->flags);
|
|
if (bus->reinit) {
|
|
ret = bus->reinit(bus);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
//HGIC_CMD_OTA, // 47
|
|
case HGIC_CMD_GET_SSID:
|
|
ret = hgic_fwctrl_get_ssid(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_GET_WPA_PSK:
|
|
ret = hgic_fwctrl_get_wpapsk(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_GET_SIGNAL:
|
|
ret = 0;
|
|
break;
|
|
case HGIC_CMD_GET_TX_BITRATE:
|
|
ret = 0;
|
|
break;
|
|
case HGIC_CMD_SET_BEACON_INT:
|
|
ret = hgic_fwctrl_set_beacon_int(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_STA_LIST:
|
|
ret = hgic_fwctrl_get_sta_list(fwctrl, ifidx, (u8 *)param1, param2);
|
|
if (ret > 0) { ret /= 6; }
|
|
break;
|
|
case HGIC_CMD_SAVE_CFG:
|
|
ret = hgic_fwctrl_save_cfg(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_JOIN_GROUP:
|
|
ret = hgic_fwctrl_join_group(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_ETHER_TYPE:
|
|
ret = hgic_fwctrl_set_ethertype(fwctrl, ifidx, (u16)param1);
|
|
break;
|
|
case HGIC_CMD_GET_STA_COUNT:
|
|
ret = hgic_fwctrl_get_sta_count(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_SET_HEARTBEAT_INT:
|
|
ret = hgic_fwctrl_set_beacon_int(fwctrl, ifidx, param1);
|
|
break;
|
|
//HGIC_CMD_SET_MCAST_KEY, // 59
|
|
case HGIC_CMD_SET_AGG_CNT:
|
|
ret = hgic_fwctrl_set_agg_cnt(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_AGG_CNT:
|
|
ret = hgic_fwctrl_get_agg_cnt(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_GET_BSS_BW:
|
|
ret = hgic_fwctrl_get_bss_bw(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_GET_FREQ_RANGE:
|
|
ret = hgic_fwctrl_get_freq_range(fwctrl, ifidx, (u32 *)param1,
|
|
(u32 *)(param1 + 4), (u32 *)(param1 + 8));
|
|
break;
|
|
case HGIC_CMD_GET_CHAN_LIST:
|
|
ret = hgic_fwctrl_get_chan_list(fwctrl, ifidx, (u16 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_RADIO_ONOFF:
|
|
ret = hgic_fwctrl_radio_onoff(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_PS_HEARTBEAT:
|
|
ret = hgic_fwctrl_set_ps_heartbeat(fwctrl, ifidx, ((u32 *)param1)[0],
|
|
((u32 *)param1)[1], ((u32 *)param1)[2], ((u32 *)param1)[3]);
|
|
break;
|
|
case HGIC_CMD_SET_WAKEUP_STA:
|
|
ret = hgic_fwctrl_wakeup_sta(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_PS_HEARTBEAT_RESP:
|
|
ret = hgic_fwctrl_set_ps_heartbeat_resp(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_PS_WAKEUP_DATA:
|
|
ret = hgic_fwctrl_set_ps_wakeup_data(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_PS_CONNECT:
|
|
ret = hgic_fwctrl_set_ps_connect(fwctrl, ifidx, param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_BSS_MAX_IDLE:
|
|
ret = hgic_fwctrl_set_bss_max_idle(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_WKIO_MODE:
|
|
ret = hgic_fwctrl_set_wkio_mode(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_DTIM_PERIOD:
|
|
ret = hgic_fwctrl_set_dtim_period(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_PS_MODE:
|
|
ret = hgic_fwctrl_set_ps_mode(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_LOAD_DEF:
|
|
ret = hgic_fwctrl_set_load_def(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_DISASSOC_STA:
|
|
ret = hgic_fwctrl_disassoc_sta(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_APLOST_TIME:
|
|
ret = hgic_fwctrl_set_aplost_time(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_WAKEUP_REASON:
|
|
ret = hgic_fwctrl_get_wkreason(fwctrl, ifidx);
|
|
break;
|
|
case HGIC_CMD_UNPAIR:
|
|
ret = hgic_fwctrl_unpair(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_AUTO_CHAN_SWITCH:
|
|
ret = hgic_fwctrl_set_auto_chswitch(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_REASSOC_WKHOST:
|
|
ret = hgic_fwctrl_set_reassoc_wkhost(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_WAKEUP_IO:
|
|
ret = hgic_fwctrl_set_wakeup_io(fwctrl, ifidx, param1, param2);
|
|
break;
|
|
case HGIC_CMD_DBGINFO_OUTPUT:
|
|
ret = hgic_fwctrl_set_dbginfo_output(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_SYSDBG:
|
|
ret = hgic_fwctrl_set_sysdbg(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_AUTO_SLEEP_TIME:
|
|
ret = hgic_fwctrl_set_autosleep_time(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_GET_KEY_MGMT:
|
|
ret = hgic_fwctrl_get_key_mgmt(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SET_PAIR_AUTOSTOP:
|
|
ret = hgic_fwctrl_set_pair_autostop(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_SUPER_PWR:
|
|
ret = hgic_fwctrl_set_super_pwr(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_REPEATER_SSID:
|
|
ret = hgic_fwctrl_set_repeater_ssid(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SET_REPEATER_PSK:
|
|
ret = hgic_fwctrl_set_repeater_psk(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_CFG_AUTO_SAVE:
|
|
ret = hgic_fwctrl_set_auto_save(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_BLENC_EN:
|
|
val[0] = param1;
|
|
val[1] = param2;
|
|
ret = hgic_fwctrl_set_blenc_en(fwctrl, ifidx, val);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_DATA:
|
|
ret = hgic_fwctrl_blenc_send_data(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_DEVADDR:
|
|
ret = hgic_fwctrl_blenc_set_devaddr(fwctrl, ifidx, (u8 *)param1);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_ADVDATA:
|
|
ret = hgic_fwctrl_blenc_set_advdata(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_SCANRESP:
|
|
ret = hgic_fwctrl_blenc_set_scanresp(fwctrl, ifidx, (u8 *)param1, param2);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_ADVINTERVAL:
|
|
ret = hgic_fwctrl_blenc_set_advinterval(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SEND_BLENC_STARTADV:
|
|
ret = hgic_fwctrl_blenc_start_adv(fwctrl, ifidx, param1);
|
|
break;
|
|
case HGIC_CMD_SET_BLENC_ADVFILTER:
|
|
ret = hgic_fwctrl_set_blenc_adv_filter(fwctrl, ifidx, param1);
|
|
break;
|
|
default:
|
|
hgic_err("not support cmd: %d\r\n", cmd);
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int hgic_iwpriv_set_blenc(struct hgic_fwctrl *ctrl, u8 ifidx, char *data, u32 count)
|
|
{
|
|
int ret = 0;
|
|
u8 vals[2];
|
|
char *args;
|
|
u32 argcnt = 0;
|
|
|
|
if (memcmp(data, "EN:", 3) == 0) {
|
|
args = data + 3;
|
|
hgic_pick_values(u8, args, vals, 2);
|
|
ret = hgic_fwctrl_set_blenc_en(ctrl, ifidx, vals);
|
|
} else if (memcmp(data, "DATA:", 5) == 0) {
|
|
ret = hgic_fwctrl_blenc_send_data(ctrl, ifidx, data + 5, count - 5);
|
|
} else if (memcmp(data, "DEV_ADDR:", 9) == 0) {
|
|
ret = hgic_fwctrl_blenc_set_devaddr(ctrl, ifidx, data + 9);
|
|
} else if (memcmp(data, "ADV_DATA:", 9) == 0) {
|
|
ret = hgic_fwctrl_blenc_set_advdata(ctrl, ifidx, data + 9, count - 9);
|
|
} else if (memcmp(data, "SCAN_RESP:", 10) == 0) {
|
|
ret = hgic_fwctrl_blenc_set_scanresp(ctrl, ifidx, data + 10, count - 10);
|
|
} else if (memcmp(data, "ADV_INT:", 8) == 0) {
|
|
ret = hgic_fwctrl_blenc_set_advinterval(ctrl, ifidx, simple_strtol(data + 8, 0, 10));
|
|
} else if (memcmp(data, "ADV_EN:", 7) == 0) {
|
|
ret = hgic_fwctrl_blenc_start_adv(ctrl, ifidx, simple_strtol(data + 7, 0, 10));
|
|
} else if (memcmp(data, "HCI_DATA:", 9) == 0) {
|
|
ret = hgic_fwctrl_send_hci_data(ctrl, data[9], data + 10, count - 10);
|
|
} else if (memcmp(data, "ADV_FILTER:", 11) == 0) {
|
|
ret = hgic_fwctrl_set_blenc_adv_filter(ctrl, ifidx, simple_strtol(data + 11, 0, 10));
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret ? -EINVAL : 0;
|
|
}
|
|
|
|
|
|
#endif
|
|
|