2023-05-16 09:13:19 +00:00
|
|
|
#ifndef _HUGE_IC_DEF_H_
|
|
|
|
#define _HUGE_IC_DEF_H_
|
|
|
|
#include "hgic.h"
|
|
|
|
#include "version.h"
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#define HGIC_VERSION "v2.2.1"
|
2023-05-16 09:13:19 +00:00
|
|
|
|
|
|
|
#ifndef SVN_VERSION
|
|
|
|
#error "SVN_VERSION undefined"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define VERSOIN_SHOW(name) do{\
|
|
|
|
printk("** HUGE-IC WLAN Card Driver("name") "HGIC_VERSION"-"SVN_VERSION"\r\n");\
|
|
|
|
}while(0)
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#define HGIC_WDEV_ID_AP 2
|
2023-05-16 09:13:19 +00:00
|
|
|
#define HGIC_WDEV_ID_STA 1
|
|
|
|
#define HGIC_SCAN_MAX_NUM 32
|
|
|
|
|
|
|
|
#define HGIC_HDR_TX_MAGIC 0x1A2B
|
|
|
|
#define HGIC_HDR_RX_MAGIC 0x2B1A
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#define HGIC_VENDOR_ID (0xA012)
|
|
|
|
#define HGIC_WLAN_4002 (0x4002)
|
|
|
|
#define HGIC_WLAN_4104 (0x4104)
|
|
|
|
#define HGIC_WLAN_8400 (0x8400)
|
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
|
|
|
|
#define HGIC_CTRL_TIMEOUT 100
|
|
|
|
#define HGIC_CMD_PRIORITY 0
|
|
|
|
#define HGIC_TX_WINDOW 20
|
|
|
|
#define HGIC_TX_COOKIE_MASK 0x7FFF
|
|
|
|
#define HGIC_BLOCK_ACK_CNT 256
|
|
|
|
|
|
|
|
#define hgic_dbg(fmt, ...) printk("%s:%d::"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
|
|
|
#define hgic_err(fmt, ...) printk("%s:%d::"fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
|
|
|
|
|
|
|
#define hgic_enter() printk("enter %s\r\n", __FUNCTION__)
|
|
|
|
#define hgic_leave() printk("leave %s\r\n", __FUNCTION__)
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#ifndef ARRAYSIZE
|
|
|
|
#define ARRAYSIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
|
|
|
|
#endif
|
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#define HGIC_CMD_TIMEOUT 500
|
|
|
|
#define HGIC_TX_TIMEOUT 10
|
2024-06-04 02:02:04 +00:00
|
|
|
#define HGIC_DETECT_TIMER 2000
|
2023-05-16 09:13:19 +00:00
|
|
|
|
|
|
|
enum hgic_bus_type {
|
|
|
|
HGIC_BUS_SDIO = 0x1,
|
|
|
|
HGIC_BUS_USB,
|
|
|
|
HGIC_BUS_HWSIM,
|
|
|
|
HGIC_BUS_WLOE,
|
|
|
|
HGIC_BUS_SDSPI,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum hgic_hdr_flags2 {
|
|
|
|
HGIC_HDR_FLAGS2_AFT_BEACON = BIT(0),
|
|
|
|
};
|
|
|
|
|
|
|
|
enum hgic_bus_flag {
|
|
|
|
HGIC_BUS_FLAGS_DISABLE_REINIT,
|
|
|
|
HGIC_BUS_FLAGS_SLEEP,
|
|
|
|
HGIC_BUS_FLAGS_INBOOT,
|
|
|
|
HGIC_BUS_FLAGS_NOPOLL,
|
2023-10-12 23:37:43 +00:00
|
|
|
HGIC_BUS_FLAGS_SOFTFC,
|
|
|
|
HGIC_BUS_FLAGS_ERROR,
|
2023-05-16 09:13:19 +00:00
|
|
|
};
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#define hgic_pick_values(pick_type, str, array, size) do{\
|
|
|
|
char *__ptr = NULL;\
|
2023-12-28 01:01:47 +00:00
|
|
|
char *__str = str; \
|
2023-10-12 23:37:43 +00:00
|
|
|
memset(array, 0, size*sizeof(pick_type));\
|
|
|
|
if((str) && strlen((str)) > 0){\
|
2023-12-28 01:01:47 +00:00
|
|
|
while ((__ptr = strsep((char **)&(__str), ",")) != NULL) {\
|
2023-10-12 23:37:43 +00:00
|
|
|
if (argcnt >= size) break;\
|
|
|
|
array[argcnt++] = (pick_type)simple_strtol(__ptr, 0, 0);\
|
|
|
|
}\
|
|
|
|
}\
|
|
|
|
}while(0)
|
2023-05-16 09:13:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
//ack packet
|
|
|
|
struct hgic_dack_hdr {
|
|
|
|
struct hgic_hdr hdr;
|
|
|
|
uint16_t cookies[0];
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
struct hgic_nlmsg_hdr {
|
|
|
|
struct hgic_hdr hdr;
|
|
|
|
uint32_t group;
|
|
|
|
uint32_t portid;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hgic_bootdl_resp_hdr {
|
|
|
|
struct hgic_hdr hdr;
|
|
|
|
unsigned char cmd;
|
|
|
|
unsigned char rsp;
|
|
|
|
unsigned char rsp_data[4];
|
|
|
|
unsigned char reserved;
|
|
|
|
unsigned char check;
|
|
|
|
} __attribute__((packed));
|
|
|
|
|
|
|
|
|
|
|
|
struct hgic_bootdl_cmd_hdr {
|
|
|
|
struct hgic_hdr hdr;
|
|
|
|
unsigned char cmd;
|
|
|
|
unsigned char cmd_len;
|
|
|
|
unsigned char cmd_flag;
|
|
|
|
unsigned char addr[4];
|
|
|
|
unsigned char len[4];
|
|
|
|
unsigned char check;
|
|
|
|
} __attribute__((packed));
|
|
|
|
|
|
|
|
struct hgic_ota_hdr {
|
|
|
|
unsigned int version;
|
|
|
|
unsigned int off;
|
|
|
|
unsigned int tot_len;
|
|
|
|
unsigned short len;
|
|
|
|
unsigned short checksum;
|
|
|
|
unsigned short chipid;
|
|
|
|
unsigned short err_code;
|
|
|
|
unsigned char data[0];
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
enum hgic_rom_cmd {
|
|
|
|
HGIC_ROM_CMD_ENTER = 0,
|
|
|
|
HGIC_ROM_CMD_LDFW,
|
|
|
|
HGIC_ROM_CMD_RUN,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hgic_fw_ldinfo {
|
|
|
|
unsigned int run_addr;
|
|
|
|
unsigned int encrypt: 1,
|
|
|
|
resv: 31;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hgic_rom_hdr {
|
|
|
|
unsigned char cmd;
|
|
|
|
unsigned char subcmd;
|
|
|
|
unsigned char data[0];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hgic_sta_status {
|
|
|
|
unsigned short aid;
|
|
|
|
unsigned char addr[6];
|
|
|
|
char rssi;
|
|
|
|
char evm;
|
|
|
|
char evm_std;
|
|
|
|
unsigned char tx_mcs;
|
|
|
|
unsigned char tx_bw;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hgic_fw_status {
|
|
|
|
unsigned short rxq;
|
|
|
|
unsigned short txq;
|
|
|
|
unsigned short acq[4];
|
|
|
|
unsigned short sta_count;
|
|
|
|
struct hgic_sta_status sta[0];
|
|
|
|
};
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
enum HGIC_BUS_BOOTDL_CKSUM {
|
2023-05-16 09:13:19 +00:00
|
|
|
HGIC_BUS_BOOTDL_CHECK_SUM = 0,
|
|
|
|
HGIC_BUS_BOOTDL_CHECK_CRC8,
|
|
|
|
HGIC_BUS_BOOTDL_CHECK_0XFD,
|
|
|
|
HGIC_BUS_BOOTDL_CHECK_OFF = 0xFF
|
|
|
|
} ;
|
|
|
|
|
|
|
|
struct hgic_bus {
|
|
|
|
int type;
|
|
|
|
int dev_id;
|
|
|
|
int drv_tx_headroom;
|
|
|
|
void *bus_priv;
|
|
|
|
unsigned long flags;
|
|
|
|
int bootdl_pktlen;
|
|
|
|
int bootdl_cksum;
|
|
|
|
int blk_size;
|
2023-10-12 23:37:43 +00:00
|
|
|
int (*probe)(void *dev, struct hgic_bus *bus);
|
2023-05-16 09:13:19 +00:00
|
|
|
int (*tx_packet)(void *bus, struct sk_buff *skb);
|
|
|
|
void (*tx_complete)(void *hg, struct sk_buff *skb, int success);
|
2023-10-12 23:37:43 +00:00
|
|
|
int (*rx_packet)(void *hg, u8 *data, int len);
|
2023-05-16 09:13:19 +00:00
|
|
|
int (*reinit)(void *bus);
|
2023-10-12 23:37:43 +00:00
|
|
|
void (*probe_post)(void *priv);
|
|
|
|
void (*remove)(void *priv);
|
|
|
|
int (*suspend)(void *priv);
|
|
|
|
int (*resume)(void *priv);
|
2023-05-16 09:13:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef __RTOS__
|
|
|
|
#define ALLOC_ORDERED_WORKQUEUE alloc_ordered_workqueue
|
|
|
|
#define ALLOC_NETDEV_MQS alloc_netdev_mqs
|
|
|
|
#define netif_queue_stopped(n) (0)
|
|
|
|
#define netif_start_queue(n)
|
|
|
|
#define netif_stop_queue(n)
|
|
|
|
#else
|
|
|
|
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,36)
|
|
|
|
#define ALLOC_ORDERED_WORKQUEUE alloc_ordered_workqueue
|
|
|
|
#else
|
|
|
|
#define ALLOC_ORDERED_WORKQUEUE(n,f) create_singlethread_workqueue(n)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)
|
|
|
|
#define ALLOC_NETDEV_MQS(size,name,setup,txqs,rxqs) alloc_netdev_mqs(size,name,0,setup,txqs,rxqs)
|
|
|
|
#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36)
|
|
|
|
#define ALLOC_NETDEV_MQS(size,name,setup,txqs,rxqs) alloc_netdev_mq(size,name,setup,txqs)
|
|
|
|
#else
|
|
|
|
#define ALLOC_NETDEV_MQS(size,name,setup,txqs,rxqs) alloc_netdev_mqs(size,name,setup,txqs,rxqs)
|
|
|
|
#endif
|
|
|
|
|
2023-10-12 23:37:43 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,42)
|
|
|
|
#define _KERNEL_READ(fp, buff, size) ({ \
|
|
|
|
ssize_t __ret__ = 0; \
|
|
|
|
unsigned long long offset = 0;\
|
|
|
|
__ret__ = kernel_read(fp, buff, size, &offset); \
|
|
|
|
__ret__;\
|
|
|
|
})
|
2023-05-16 09:13:19 +00:00
|
|
|
#else
|
2023-10-12 23:37:43 +00:00
|
|
|
#define _KERNEL_READ(fp, buff, size) kernel_read(fp, 0, buff, size)
|
2023-05-16 09:13:19 +00:00
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-11-05 21:03:29 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0)
|
2023-05-16 09:13:19 +00:00
|
|
|
#define setup_timer(a, b, c) timer_setup(a, b, 0)
|
|
|
|
#define init_timer(...)
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
|
|
|
|
#define ACCESS_OK(type, addr, size) access_ok(addr, size)
|
2023-10-12 23:37:43 +00:00
|
|
|
#define DEV_OPEN(x) do { rtnl_lock(); dev_open(x, NULL); rtnl_unlock(); } while(0)
|
|
|
|
#define DEV_CLOSE(x) do { rtnl_lock(); dev_close(x); rtnl_unlock(); } while(0)
|
2023-05-16 09:13:19 +00:00
|
|
|
#else
|
|
|
|
#define ACCESS_OK(type, addr, size) access_ok(type, addr, size)
|
2023-10-12 23:37:43 +00:00
|
|
|
#define DEV_OPEN(x) do { rtnl_lock(); dev_open(x); rtnl_unlock(); } while(0)
|
|
|
|
#define DEV_CLOSE(x) do { rtnl_lock(); dev_close(x); rtnl_unlock(); } while(0)
|
2023-05-16 09:13:19 +00:00
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) && defined CONFIG_HGIC_2G
|
|
|
|
#define IEEE80211_NUM_BANDS NUM_NL80211_BANDS
|
|
|
|
#define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ
|
|
|
|
#define IEEE80211_BAND_5GHZ NL80211_BAND_5GHZ
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#ifndef IEEE80211_NUM_ACS
|
|
|
|
#define IEEE80211_NUM_ACS 4
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) && defined CONFIG_HGIC_2G
|
|
|
|
#define vht_nss nss
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) && defined CONFIG_HGIC_2G
|
|
|
|
#define IEEE80211_CHAN_NO_IBSS IEEE80211_CHAN_NO_IR
|
|
|
|
#define IEEE80211_CHAN_PASSIVE_SCAN IEEE80211_CHAN_NO_IR
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,5,0)
|
|
|
|
#define proc_ops file_operations
|
|
|
|
#define proc_open open
|
|
|
|
#define proc_read read
|
|
|
|
#define proc_lseek llseek
|
|
|
|
#define proc_write write
|
|
|
|
#define proc_release release
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
|
|
|
|
#define ieee80211_free_txskb(hw, skb) dev_kfree_skb_any(skb)
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
|
|
|
|
#define RX_FLAG_MACTIME_START RX_FLAG_MACTIME_MPDU
|
|
|
|
#define IEEE80211_ITERATE_ACTIVE_INTERFACES_ATOMIC(hw, flags, iterator, vif) ieee80211_iterate_active_interfaces_atomic(hw, iterator, vif)
|
|
|
|
#else
|
|
|
|
#define IEEE80211_ITERATE_ACTIVE_INTERFACES_ATOMIC(hw, flags, iterator, vif) ieee80211_iterate_active_interfaces_atomic(hw, flags, iterator, vif)
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
2023-05-16 09:13:19 +00:00
|
|
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
|
|
|
|
static inline void *__PDE_DATA(const struct inode *inode)
|
|
|
|
{
|
|
|
|
return PDE(inode)->data;
|
|
|
|
}
|
|
|
|
static inline void *PDE_DATA(const struct inode *inode)
|
|
|
|
{
|
|
|
|
return __PDE_DATA(inode);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
2023-10-12 23:37:43 +00:00
|
|
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,2,0)
|
|
|
|
#define tasklet_hrtimer hrtimer
|
|
|
|
#define tasklet_hrtimer_cancel hrtimer_cancel
|
|
|
|
#define tasklet_hrtimer_start hrtimer_start
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef int (*hgic_probe)(void *dev, struct hgic_bus *bus);
|
|
|
|
extern int hgic_sdio_init(hgic_probe probe, u32 max_pkt);
|
|
|
|
extern void hgic_sdio_exit(void);
|
|
|
|
extern int hgic_usb_init(hgic_probe probe, u32 max_pkt);
|
|
|
|
extern void hgic_usb_exit(void);
|
2023-05-16 09:13:19 +00:00
|
|
|
#endif
|