Files
刘可亮 3e10f578d3 v1.2.2
2025-10-21 13:59:50 +08:00

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