luckfox-pico-sdk/sysdrv/drv_ko/wifi/ssv6x5x/smac/kssvsmart.c
2023-08-08 20:36:47 +08:00

146 lines
4.3 KiB
C

#include <ssv6200.h>
#ifdef SSV_MAC80211
#include "ssv_mac80211.h"
#else
#include <net/mac80211.h>
#endif
#include <linux/module.h>
#include <smac/dev.h>
#include "kssvsmart.h"
#include "lib.h"
#include "ssv_skb.h"
#include "init.h"
#ifdef CONFIG_SSV_SMARTLINK
#define VALID_SSID_LEN(x) ((x) <= 32)
#define VALID_PASS_LEN(x) ((x) == 0 || ((x) >= 8 && (x) <= 64))//do not support WEP
#define INVALID "invalid"
#define NONE "none"
struct ssv6xxx_si_cfg si_cfg;
int si_st;
char si_status_st[][16] = {
"NG",
"OK",
"PROCESSING",
"MAX"
};
inline void set_si_status(u32 st)
{
si_st = st;
}
int get_si_status(char *input)
{
//printk("%s: %s\n", __FUNCTION__, si_status_st[si_st]);
strcpy(input,si_status_st[si_st]);
return strlen(si_status_st[si_st]);
}
int get_si_ssid(char *input)
{
strcpy(input,si_cfg.ssid);
return strlen(si_cfg.ssid);
}
int get_si_pass(char *input)
{
strcpy(input,si_cfg.password);
return strlen(si_cfg.password);
}
void ssv6xxx_process_si_event(struct ssv_softc *sc, struct sk_buff *skb)
{
struct cfg_host_event *host_event;
struct ssv6xxx_si_cfg *p_si_cfg;
printk("received SOC_EVT_SMART_ICOMM event\n");
host_event = (struct cfg_host_event *)skb->data;
p_si_cfg = (struct ssv6xxx_si_cfg *)&host_event->dat[0];
if (VALID_SSID_LEN(p_si_cfg->ssid_len) && VALID_PASS_LEN(p_si_cfg->password_len)) {
memcpy(&si_cfg.ssid, p_si_cfg->ssid, p_si_cfg->ssid_len);
if (p_si_cfg->password_len != 0)
memcpy(&si_cfg.password, p_si_cfg->password, p_si_cfg->password_len);
else
memcpy(&si_cfg.password, NONE, sizeof(NONE));
si_cfg.ssid_len = p_si_cfg->ssid_len;
si_cfg.password_len = p_si_cfg->password_len;
set_si_status(SI_ST_OK);
printk("SSID: %s, LEN: %d\n", si_cfg.ssid, si_cfg.ssid_len);
printk("PASS: %s, LEN: %d\n", si_cfg.password, si_cfg.password_len);
}
else {
printk("!!! Oops, got invalid value of ssid_len:%d or password_len:%d !!!\n",
p_si_cfg->ssid_len, p_si_cfg->password_len);
set_si_status(SI_ST_NG);
memcpy(&si_cfg.ssid, INVALID, sizeof(INVALID));
memcpy(&si_cfg.password, INVALID, sizeof(INVALID));
}
}
EXPORT_SYMBOL(ssv6xxx_process_si_event);
int ssv6xxx_send_si_cmd(u32 smart_icomm_cmd)
{
struct sk_buff *skb;
struct cfg_host_cmd *host_cmd;
u32 total_ch_cfg_size, i;
struct ssv6xxx_ch_cfg ch;
int ret;
struct ssv_softc *ssv_dbg_sc;
struct ssv_hw *sh;
ssv_dbg_sc = ssv6xxx_driver_attach(SSV_DRVER_NAME);
if(ssv_dbg_sc == NULL)
{
printk("Get ssv_dbg_sc fail!!!\n");
return -1;
}
sh = ssv_dbg_sc->sh;
if (smart_icomm_cmd == START_SMART_ICOMM || smart_icomm_cmd == RESET_SMART_ICOMM)
set_si_status(SI_ST_PROCESSING);
else
set_si_status(SI_ST_OK);
memset(&si_cfg, 0, sizeof(si_cfg));
total_ch_cfg_size = sh->ch_cfg_size * sizeof(struct ssv6xxx_ch_cfg);
skb = ssv_skb_alloc(sh->sc, HOST_CMD_HDR_LEN + sizeof(u32) + sizeof(u32) + total_ch_cfg_size);
if(skb == NULL)
{
printk("ssv command skb_alloc fail!!!\n");
set_si_status(SI_ST_NG);
return -1;
}
skb->data_len = HOST_CMD_HDR_LEN + sizeof(u32) + sizeof(u32) + total_ch_cfg_size;
skb->len = skb->data_len;
host_cmd = (struct cfg_host_cmd *)skb->data;
memset(host_cmd, 0x0, sizeof(struct cfg_host_cmd));
host_cmd->c_type = HOST_CMD;
host_cmd->h_cmd = (u8)SSV6XXX_HOST_CMD_SMART_ICOMM;
host_cmd->len = skb->data_len;
printk("smart icomm, cmd: %d, ch_cfg_size : %d\n", smart_icomm_cmd, sh->ch_cfg_size);
memcpy(host_cmd->un.dat8, &smart_icomm_cmd, sizeof(u32));
memcpy(host_cmd->un.dat8 + sizeof(u32), &sh->ch_cfg_size, sizeof(u32));
memcpy(host_cmd->un.dat8 + sizeof(s32) + sizeof(s32), sh->p_ch_cfg, total_ch_cfg_size);
for (i = 0; i < sh->ch_cfg_size; i++) {
memcpy(&ch, host_cmd->un.dat8+sizeof(u32) + sizeof(u32) + (i * sizeof(struct ssv6xxx_ch_cfg)), sizeof(struct ssv6xxx_ch_cfg));
printk("reg: 0x%08x, ch1: 0x%08x, ch13: 0x%08x\n", ch.reg_addr, ch.ch1_12_value, ch.ch13_14_value);
}
ret = HCI_SEND_CMD(sh, skb);
return ret;
}
EXPORT_SYMBOL(ssv6xxx_send_si_cmd);
#endif //CONFIG_SSV_SMARTLINK