mirror of
https://github.com/shenmintao/aic8800d80.git
synced 2026-09-26 17:44:16 +00:00
Sync WiFi driver, firmware, and DKMS configuration from the bluetooth
branch (which itself is radxa USB driver_fw + Linux 6.16/6.17/6.19
kernel compat). aic_btusb and Bluetooth-specific install.sh logic
are intentionally excluded from main.
Driver updates:
- Add Linux kernel 6.12-6.19 compatibility support
- Add Linux 6.16 timer_container_of and wakelock API support
- Add Debian 6.1.0-26 backport support
- Add USB device ID 368b:8d81 support
- Add AIC8800DW device support
- Add TP-Link Archer TX1U Nano support (USB_VENDOR_ID_TENDA_V2:0x0110)
- Add TENDA series device support (U2, U11, U11 PRO)
- Add AIC8800FC_CUS1-6 series support
- Add AIC8800M80_CUS0-8 series support
- Add UGREEN AIC8800D80 adapter support
- Add Mercury (TP-Link OEM) support
- Allow 1 or 3 USB interfaces (BT-disabled SKUs report 1)
New compat modules:
- aicwf_compat_8800d80n.{c,h}
- aicwf_compat_8800dln.{c,h}
Firmware:
- New: fw/aic8800/, fw/aic8800D80N/, fw/aic8800D80X2/, fw/aic8800DLN/
- Updated: fw/aic8800D80/, fw/aic8800DC/
install.sh:
- Loop over all fw/aic8800* variants instead of hard-coding aic8800D80
- Install usb_modeswitch/1111_1111 config for "Pandora" clone adapter
- Verify firmware install by counting variants
dkms.conf: pass KDIR explicitly to make for cross-kernel builds.
Excluded from this commit (BT-only, kept on bluetooth branch):
- drivers/aic8800/aic_btusb/
- modprobe/aic8800-bt.conf
- diagnose_bt.sh
- install.sh btusb auto-load / hciconfig / bluez status checks
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
122 lines
3.3 KiB
C
122 lines
3.3 KiB
C
/**
|
|
******************************************************************************
|
|
*
|
|
* rwnx_cmds.h
|
|
*
|
|
* Copyright (C) RivieraWaves 2014-2019
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef _RWNX_CMDS_H_
|
|
#define _RWNX_CMDS_H_
|
|
|
|
#include <linux/spinlock.h>
|
|
#include <linux/completion.h>
|
|
#include <linux/module.h>
|
|
#include "lmac_msg.h"
|
|
|
|
#ifdef CONFIG_RWNX_SDM
|
|
#define RWNX_80211_CMD_TIMEOUT_MS (20 * 300)
|
|
#elif defined(CONFIG_RWNX_FHOST)
|
|
#define RWNX_80211_CMD_TIMEOUT_MS (10000)
|
|
#else
|
|
#define RWNX_80211_CMD_TIMEOUT_MS 4000//500//300
|
|
#endif
|
|
|
|
#define RWNX_CMD_FLAG_NONBLOCK BIT(0)
|
|
#define RWNX_CMD_FLAG_REQ_CFM BIT(1)
|
|
#define RWNX_CMD_FLAG_WAIT_PUSH BIT(2)
|
|
#define RWNX_CMD_FLAG_WAIT_ACK BIT(3)
|
|
#define RWNX_CMD_FLAG_WAIT_CFM BIT(4)
|
|
#define RWNX_CMD_FLAG_DONE BIT(5)
|
|
/* ATM IPC design makes it possible to get the CFM before the ACK,
|
|
* otherwise this could have simply been a state enum */
|
|
#define RWNX_CMD_WAIT_COMPLETE(flags) \
|
|
(!(flags & (RWNX_CMD_FLAG_WAIT_ACK | RWNX_CMD_FLAG_WAIT_CFM)))
|
|
|
|
#define RWNX_CMD_MAX_QUEUED 16//8 AIDEN
|
|
|
|
#ifdef CONFIG_RWNX_FHOST
|
|
#include "ipc_fhost.h"
|
|
#define rwnx_cmd_e2amsg ipc_fhost_msg
|
|
#define rwnx_cmd_a2emsg ipc_fhost_msg
|
|
#define RWNX_CMD_A2EMSG_LEN(m) (m->param_len)
|
|
#define RWNX_CMD_E2AMSG_LEN_MAX IPC_FHOST_MSG_BUF_SIZE
|
|
struct rwnx_term_stream;
|
|
|
|
#else /* !CONFIG_RWNX_FHOST*/
|
|
#include "ipc_shared.h"
|
|
#define rwnx_cmd_e2amsg ipc_e2a_msg
|
|
#define rwnx_cmd_a2emsg lmac_msg
|
|
#define RWNX_CMD_A2EMSG_LEN(m) (sizeof(struct lmac_msg) + m->param_len)
|
|
#define RWNX_CMD_E2AMSG_LEN_MAX (IPC_E2A_MSG_PARAM_SIZE * 4)
|
|
|
|
#endif /* CONFIG_RWNX_FHOST*/
|
|
|
|
struct rwnx_hw;
|
|
struct rwnx_cmd;
|
|
typedef int (*msg_cb_fct)(struct rwnx_hw *rwnx_hw, struct rwnx_cmd *cmd,
|
|
struct rwnx_cmd_e2amsg *msg);
|
|
static inline void put_u16(u8 *buf, u16 data)
|
|
{
|
|
buf[0] = (u8)(data&0x00ff);
|
|
buf[1] = (u8)((data >> 8)&0x00ff);
|
|
}
|
|
|
|
enum rwnx_cmd_mgr_state {
|
|
RWNX_CMD_MGR_STATE_DEINIT,
|
|
RWNX_CMD_MGR_STATE_INITED,
|
|
RWNX_CMD_MGR_STATE_CRASHED,
|
|
};
|
|
|
|
struct rwnx_cmd {
|
|
struct list_head list;
|
|
lmac_msg_id_t id;
|
|
lmac_msg_id_t reqid;
|
|
struct rwnx_cmd_a2emsg *a2e_msg;
|
|
char *e2a_msg;
|
|
u32 tkn;
|
|
u16 flags;
|
|
|
|
struct completion complete;
|
|
u32 result;
|
|
u8 used;
|
|
int array_id;
|
|
#ifdef CONFIG_RWNX_FHOST
|
|
struct rwnx_term_stream *stream;
|
|
#endif
|
|
};
|
|
|
|
struct rwnx_cmd_mgr {
|
|
enum rwnx_cmd_mgr_state state;
|
|
spinlock_t lock;
|
|
u32 next_tkn;
|
|
u32 queue_sz;
|
|
u32 max_queue_sz;
|
|
|
|
struct list_head cmds;
|
|
|
|
int (*queue)(struct rwnx_cmd_mgr *, struct rwnx_cmd *);
|
|
int (*llind)(struct rwnx_cmd_mgr *, struct rwnx_cmd *);
|
|
int (*msgind)(struct rwnx_cmd_mgr *, struct rwnx_cmd_e2amsg *, msg_cb_fct);
|
|
void (*print)(struct rwnx_cmd_mgr *);
|
|
void (*drain)(struct rwnx_cmd_mgr *);
|
|
|
|
struct work_struct cmdWork;
|
|
struct workqueue_struct *cmd_wq;
|
|
};
|
|
|
|
#define WAKE_CMD_WORK(cmd_mgr) \
|
|
do { \
|
|
queue_work((cmd_mgr)->cmd_wq, &cmd_mgr->cmdWork); \
|
|
} while (0)
|
|
|
|
void rwnx_cmd_mgr_init(struct rwnx_cmd_mgr *cmd_mgr);
|
|
void rwnx_cmd_mgr_deinit(struct rwnx_cmd_mgr *cmd_mgr);
|
|
int cmd_mgr_queue_force_defer(struct rwnx_cmd_mgr *cmd_mgr, struct rwnx_cmd *cmd);
|
|
void aicwf_set_cmd_tx(void *dev, struct lmac_msg *msg, uint len);
|
|
void cmd_mgr_task_process(struct work_struct *work);
|
|
|
|
#endif /* _RWNX_CMDS_H_ */
|