From d4a1bd480003f3e1a0590bc46fbcb24f05652ca7 Mon Sep 17 00:00:00 2001
From: tzh <tanzhtanzh@gmail.com>
Date: Thu, 15 Aug 2024 06:56:47 +0000
Subject: [PATCH] feat(wfit/bt): update aic8800 wifi/bt drive and hal

---
 longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c |  773 ++++++++++++++++-------------------------------------------
 1 files changed, 210 insertions(+), 563 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c
old mode 100644
new mode 100755
index 73cc600..0a4fdac
--- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c
+++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c
@@ -16,7 +16,6 @@
 #include "reg_access.h"
 #include "hal_desc.h"
 #include "rwnx_main.h"
-#include "rwnx_pci.h"
 #ifndef CONFIG_RWNX_FHOST
 #include "ipc_host.h"
 #endif /* !CONFIG_RWNX_FHOST */
@@ -30,8 +29,8 @@
 #include "aicwf_usb.h"
 #endif
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
+#ifdef AICWF_PCIE_SUPPORT
+#include "rwnx_pci.h"
 #endif
 
 struct rwnx_plat *g_rwnx_plat;
@@ -225,489 +224,232 @@
 	return err;
 }
 #endif
-#endif /* !CONFIG_ROM_PATCH_EN */
 
-#if 0
-#ifndef CONFIG_RWNX_TL4
-#define IHEX_REC_DATA           0
-#define IHEX_REC_EOF            1
-#define IHEX_REC_EXT_SEG_ADD    2
-#define IHEX_REC_START_SEG_ADD  3
-#define IHEX_REC_EXT_LIN_ADD    4
-#define IHEX_REC_START_LIN_ADD  5
+typedef struct {
+	txpwr_idx_conf_t txpwr_idx;
+	txpwr_ofst_conf_t txpwr_ofst;
+} nvram_info_t;
 
-/**
- * rwnx_plat_ihex_fw_upload() - Load the requested intel hex 8 FW into embedded side.
- *
- * @rwnx_plat: pointer to platform structure
- * @fw_addr: Virtual address where the fw must be loaded
- * @filename: Name of the fw.
- *
- * Load a fw, stored as a ihex file, into the specified address.
- */
-static int rwnx_plat_ihex_fw_upload(struct rwnx_plat *rwnx_plat, u8 *fw_addr,
-									char *filename)
+nvram_info_t nvram_info = {
+	.txpwr_idx = {
+		.enable           = 1,
+		.dsss             = 9,
+		.ofdmlowrate_2g4  = 8,
+		.ofdm64qam_2g4    = 8,
+		.ofdm256qam_2g4   = 8,
+		.ofdm1024qam_2g4  = 8,
+		.ofdmlowrate_5g   = 11,
+		.ofdm64qam_5g     = 10,
+		.ofdm256qam_5g    = 9,
+		.ofdm1024qam_5g   = 9
+	},
+	.txpwr_ofst = {
+		.enable       = 1,
+		.chan_1_4     = 0,
+		.chan_5_9     = 0,
+		.chan_10_13   = 0,
+		.chan_36_64   = 0,
+		.chan_100_120 = 0,
+		.chan_122_140 = 0,
+		.chan_142_165 = 0,
+	},
+};
+
+void get_userconfig_txpwr_idx(txpwr_idx_conf_t *txpwr_idx)
 {
-	const struct firmware *fw;
-	struct device *dev = rwnx_platform_get_dev(rwnx_plat);
-	u8 const *src, *end;
-	u32 *dst;
-	u16 haddr, segaddr, addr;
-	u32 hwaddr;
-	u8 load_fw, byte_count, checksum, csum, rec_type;
-	int err, rec_idx;
-	char hex_buff[9];
-
-	err = request_firmware(&fw, filename, dev);
-	if (err) {
-		return err;
-	}
-
-	/* Copy the file on the Embedded side */
-	dev_dbg(dev, "\n### Now copy %s firmware, @ = %p\n", filename, fw_addr);
-
-	src = fw->data;
-	end = src + (unsigned int)fw->size;
-	haddr = 0;
-	segaddr = 0;
-	load_fw = 1;
-	err = -EINVAL;
-	rec_idx = 0;
-	hwaddr = 0;
-
-#define IHEX_READ8(_val, _cs) {                  \
-		hex_buff[2] = 0;                         \
-		strncpy(hex_buff, src, 2);               \
-		if (kstrtou8(hex_buff, 16, &_val))       \
-			goto end;                            \
-		src += 2;                                \
-		if (_cs)                                 \
-			csum += _val;                        \
-	}
-
-#define IHEX_READ16(_val) {                        \
-		hex_buff[4] = 0;                           \
-		strncpy(hex_buff, src, 4);                 \
-		if (kstrtou16(hex_buff, 16, &_val))        \
-			goto end;                              \
-		src += 4;                                  \
-		csum += (_val & 0xff) + (_val >> 8);       \
-	}
-
-#define IHEX_READ32(_val) {                              \
-		hex_buff[8] = 0;                                 \
-		strncpy(hex_buff, src, 8);                       \
-		if (kstrtouint(hex_buff, 16, &_val))             \
-			goto end;                                    \
-		src += 8;                                        \
-		csum += (_val & 0xff) + ((_val >> 8) & 0xff) +   \
-			((_val >> 16) & 0xff) + (_val >> 24);        \
-	}
-
-#define IHEX_READ32_PAD(_val, _nb) {                    \
-		memset(hex_buff, '0', 8);                       \
-		hex_buff[8] = 0;                                \
-		strncpy(hex_buff, src, (2 * _nb));              \
-		if (kstrtouint(hex_buff, 16, &_val))            \
-			goto end;                                   \
-		src += (2 * _nb);                               \
-		csum += (_val & 0xff) + ((_val >> 8) & 0xff) +  \
-			((_val >> 16) & 0xff) + (_val >> 24);       \
+	memcpy(txpwr_idx, &(nvram_info.txpwr_idx), sizeof(txpwr_idx_conf_t));
 }
 
-	/* loop until end of file is read*/
-	while (load_fw) {
-		rec_idx++;
-		csum = 0;
+void get_userconfig_txpwr_ofst(txpwr_ofst_conf_t *txpwr_ofst)
+{
+	memcpy(txpwr_ofst, &(nvram_info.txpwr_ofst), sizeof(txpwr_ofst_conf_t));
+}
 
-		/* Find next colon start code */
-		while (*src != ':') {
-			src++;
-			if ((src + 3) >= end) /* 3 = : + rec_len */
-				goto end;
-		}
-		src++;
+#define MATCH_NODE(type, node, cfg_key) {cfg_key, offsetof(type, node)}
 
-		/* Read record len */
-		IHEX_READ8(byte_count, 1);
-		if ((src + (byte_count * 2) + 8) >= end) /* 8 = rec_addr + rec_type + chksum */
-			goto end;
+struct parse_match_t {
+	char keyname[64];
+	int  offset;
+};
 
-		/* Read record addr */
-		IHEX_READ16(addr);
+static const char *parse_key_prefix[] = {
+	[0x01] = "module0_",
+	[0x21] = "module1_",
+};
 
-		/* Read record type */
-		IHEX_READ8(rec_type, 1);
+static const struct parse_match_t parse_match_tab[] = {
+	MATCH_NODE(nvram_info_t, txpwr_idx.enable,           "enable"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.dsss,             "dsss"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdmlowrate_2g4,  "ofdmlowrate_2g4"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm64qam_2g4,    "ofdm64qam_2g4"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm256qam_2g4,   "ofdm256qam_2g4"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm1024qam_2g4,  "ofdm1024qam_2g4"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdmlowrate_5g,   "ofdmlowrate_5g"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm64qam_5g,     "ofdm64qam_5g"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm256qam_5g,    "ofdm256qam_5g"),
+	MATCH_NODE(nvram_info_t, txpwr_idx.ofdm1024qam_5g,   "ofdm1024qam_5g"),
 
-		switch (rec_type) {
-		case IHEX_REC_DATA:
-		{
-			/* Update destination address */
-			dst = (u32 *) (fw_addr + hwaddr + addr);
+	MATCH_NODE(nvram_info_t, txpwr_ofst.enable,          "ofst_enable"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_1_4,        "ofst_chan_1_4"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_5_9,        "ofst_chan_5_9"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_10_13,      "ofst_chan_10_13"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_36_64,      "ofst_chan_36_64"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_100_120,    "ofst_chan_100_120"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_122_140,    "ofst_chan_122_140"),
+	MATCH_NODE(nvram_info_t, txpwr_ofst.chan_142_165,    "ofst_chan_142_165"),
+};
 
-			while (byte_count) {
-				u32 val;
-				if (byte_count >= 4) {
-					IHEX_READ32(val);
-					byte_count -= 4;
-				} else {
-					IHEX_READ32_PAD(val, byte_count);
-					byte_count = 0;
-				}
-				*dst++ = __swab32(val);
+static int parse_key_val(const char *str, const char *key, char *val)
+{
+	const char *p = NULL;
+	const char *dst = NULL;
+	int keysize = 0;
+	int bufsize = 0;
+
+	if (str == NULL || key == NULL || val == NULL)
+		return -1;
+
+	keysize = strlen(key);
+	bufsize = strlen(str);
+	if (bufsize <= keysize)
+		return -1;
+
+	p = str;
+	while (*p != 0 && *p == ' ')
+		p++;
+
+	if (*p == '#')
+		return -1;
+
+	if (str + bufsize - p <= keysize)
+		return -1;
+
+	if (strncmp(p, key, keysize) != 0)
+		return -1;
+
+	p += keysize;
+
+	while (*p != 0 && *p == ' ')
+		p++;
+
+	if (*p != '=')
+		return -1;
+
+	p++;
+	while (*p != 0 && *p == ' ')
+		p++;
+
+	if (*p == '"')
+		p++;
+
+	dst = p;
+	while (*p != 0)
+		p++;
+
+	p--;
+	while (*p == ' ')
+		p--;
+
+	if (*p == '"')
+		p--;
+
+	while (*p == '\r' || *p == '\n')
+		p--;
+
+	p++;
+	strncpy(val, dst, p -dst);
+	val[p - dst] = 0;
+	return 0;
+}
+
+void rwnx_plat_userconfig_parsing(struct rwnx_hw *rwnx_hw, char *buffer, int size)
+{
+	char conf[100], keyname[64];
+	char *line;
+	char *data;
+	int  i = 0, err, len = 0;
+	long val;
+
+	if (size <= 0) {
+		pr_err("Config buffer size %d error\n", size);
+		return;
+	}
+
+	if (rwnx_hw->vendor_info > (sizeof(parse_key_prefix) / sizeof(parse_key_prefix[0]) - 1)) {
+		pr_err("Unsuppor vendor info config\n");
+		return;
+	}
+
+	data = vmalloc(size + 1);
+	if (!data) {
+		pr_err("vmalloc fail\n");
+		return;
+	}
+
+	memcpy(data, buffer, size);
+	buffer = data;
+
+	while (1) {
+		line = buffer;
+		if (*line == 0)
+			break;
+
+		while (*buffer != '\r' && *buffer != '\n' && *buffer != 0 && len++ < size)
+			buffer++;
+
+		while ((*buffer == '\r' || *buffer == '\n') && len++ < size)
+			*buffer++ = 0;
+
+		if (len >= size)
+			*buffer = 0;
+
+		// store value to data struct
+		for (i = 0; i < sizeof(parse_match_tab) / sizeof(parse_match_tab[0]); i++) {
+			sprintf(&keyname[0], "%s%s", parse_key_prefix[rwnx_hw->vendor_info], parse_match_tab[i].keyname);
+			if (parse_key_val(line, keyname, conf) == 0) {
+				err = kstrtol(conf, 0, &val);
+				*(unsigned char *)((unsigned long)&nvram_info + parse_match_tab[i].offset) = val;
+				printk("%s, %s = %ld\n",  __func__, parse_match_tab[i].keyname, val);
+				break;
 			}
-			break;
 		}
-		case IHEX_REC_EOF:
-		{
-			load_fw = 0;
-			err = 0;
-			break;
-		}
-		case IHEX_REC_EXT_SEG_ADD: /* Extended Segment Address */
-		{
-			IHEX_READ16(segaddr);
-			hwaddr = (haddr << 16) + (segaddr << 4);
-			break;
-		}
-		case IHEX_REC_EXT_LIN_ADD: /* Extended Linear Address */
-		{
-			IHEX_READ16(haddr);
-			hwaddr = (haddr << 16) + (segaddr << 4);
-			break;
-		}
-		case IHEX_REC_START_LIN_ADD: /* Start Linear Address */
-		{
-			u32 val;
-			IHEX_READ32(val); /* need to read for checksum */
-			break;
-		}
-		case IHEX_REC_START_SEG_ADD:
-		default:
-		{
-			dev_err(dev, "ihex: record type %d not supported\n", rec_type);
-			load_fw = 0;
-		}
-		}
+	}
+	vfree(data);
+}
 
-		/* Read and compare checksum */
-		IHEX_READ8(checksum, 0);
-		if (checksum != (u8)(~csum + 1))
-			goto end;
+#define FW_USERCONFIG_NAME       "aic_userconfig.txt"
+
+int rwnx_plat_userconfig_upload_android(struct rwnx_hw *rwnx_hw, char *filename)
+{
+	int size;
+	char *dst = NULL;
+
+	const struct firmware *fw = NULL;
+	int ret = request_firmware(&fw, filename, NULL);
+
+	printk("userconfig file path:%s \r\n", filename);
+
+	if (ret < 0) {
+		printk("Load %s fail\n", filename);
+		return ret;
 	}
 
-#undef IHEX_READ8
-#undef IHEX_READ16
-#undef IHEX_READ32
-#undef IHEX_READ32_PAD
+	size = fw->size;
+	dst = (char *)fw->data;
 
-end:
-	release_firmware(fw);
-
-	if (err)
-		dev_err(dev, "%s: Invalid ihex record around line %d\n", filename, rec_idx);
-
-	return err;
-}
-#endif /* CONFIG_RWNX_TL4 */
-
-#ifndef CONFIG_RWNX_SDM
-/**
- * rwnx_plat_get_rf() - Retrun the RF used in the platform
- *
- * @rwnx_plat: pointer to platform structure
- */
-static u32 rwnx_plat_get_rf(struct rwnx_plat *rwnx_plat)
-{
-	u32 ver;
-	ver = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, MDM_HDMCONFIG_ADDR);
-
-	ver = __MDM_PHYCFG_FROM_VERS(ver);
-	WARN(((ver != MDM_PHY_CONFIG_TRIDENT) &&
-		  (ver != MDM_PHY_CONFIG_ELMA) &&
-		  (ver != MDM_PHY_CONFIG_KARST)),
-		 "bad phy version 0x%08x\n", ver);
-
-	return ver;
-}
-
-/**
- * rwnx_plat_stop_agcfsm() - Stop a AGC state machine
- *
- * @rwnx_plat: pointer to platform structure
- * @agg_reg: Address of the agccntl register (within RWNX_ADDR_SYSTEM)
- * @agcctl: Updated with value of the agccntl rgister before stop
- * @memclk: Updated with value of the clock register before stop
- * @agc_ver: Version of the AGC load procedure
- * @clkctrladdr: Indicates which AGC clock register should be accessed
- */
-static void rwnx_plat_stop_agcfsm(struct rwnx_plat *rwnx_plat, int agc_reg,
-								  u32 *agcctl, u32 *memclk, u8 agc_ver,
-								  u32 clkctrladdr)
-{
-	/* First read agcctnl and clock registers */
-	*memclk = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, clkctrladdr);
-
-	/* Stop state machine : xxAGCCNTL0[AGCFSMRESET]=1 */
-	*agcctl = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
-	RWNX_REG_WRITE((*agcctl) | BIT(12), rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
-
-	/* Force clock */
-	if (agc_ver > 0) {
-		/* CLKGATEFCTRL0[AGCCLKFORCE]=1 */
-		RWNX_REG_WRITE((*memclk) | BIT(29), rwnx_plat, RWNX_ADDR_SYSTEM,
-					   clkctrladdr);
-	} else {
-		/* MEMCLKCTRL0[AGCMEMCLKCTRL]=0 */
-		RWNX_REG_WRITE((*memclk) & ~BIT(3), rwnx_plat, RWNX_ADDR_SYSTEM,
-					   clkctrladdr);
-	}
-}
-
-
-/**
- * rwnx_plat_start_agcfsm() - Restart a AGC state machine
- *
- * @rwnx_plat: pointer to platform structure
- * @agg_reg: Address of the agccntl register (within RWNX_ADDR_SYSTEM)
- * @agcctl: value of the agccntl register to restore
- * @memclk: value of the clock register to restore
- * @agc_ver: Version of the AGC load procedure
- * @clkctrladdr: Indicates which AGC clock register should be accessed
- */
-static void rwnx_plat_start_agcfsm(struct rwnx_plat *rwnx_plat, int agc_reg,
-								   u32 agcctl, u32 memclk, u8 agc_ver,
-								   u32 clkctrladdr)
-{
-
-	/* Release clock */
-	if (agc_ver > 0)
-		/* CLKGATEFCTRL0[AGCCLKFORCE]=0 */
-		RWNX_REG_WRITE(memclk & ~BIT(29), rwnx_plat, RWNX_ADDR_SYSTEM,
-					   clkctrladdr);
-	else
-		/* MEMCLKCTRL0[AGCMEMCLKCTRL]=1 */
-		RWNX_REG_WRITE(memclk | BIT(3), rwnx_plat, RWNX_ADDR_SYSTEM,
-					   clkctrladdr);
-
-	/* Restart state machine: xxAGCCNTL0[AGCFSMRESET]=0 */
-	RWNX_REG_WRITE(agcctl & ~BIT(12), rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
-}
-#endif
-
-/**
- * rwnx_plat_fcu_load() - Load FCU (Fith Chain Unit) ucode
- *
- * @rwnx_hw: main driver data
- *
- * c.f Modem UM (AGC/CCA initialization)
- */
-static int rwnx_plat_fcu_load(struct rwnx_hw *rwnx_hw)
-{
-	int ret = 0;
-#ifndef CONFIG_RWNX_SDM
-	struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
-	u32 agcctl, memclk;
-
-#ifndef CONFIG_RWNX_FHOST
-	/* By default, we consider that there is only one RF in the system */
-	rwnx_hw->phy.cnt = 1;
-#endif // CONFIG_RWNX_FHOST
-
-	if (rwnx_plat_get_rf(rwnx_plat) != MDM_PHY_CONFIG_ELMA)
-		/* No FCU for PHYs other than Elma */
-		return 0;
-
-	agcctl = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXAGCCNTL_ADDR);
-	if (!__RIU_FCU_PRESENT(agcctl))
-		/* No FCU present in this version */
-		return 0;
-
-#ifndef CONFIG_RWNX_FHOST
-	/* FCU is present */
-	if (rwnx_hw->band_5g_support) {
-		rwnx_hw->phy.cnt = 2;
-		rwnx_hw->phy.sec_chan.band = NL80211_BAND_5GHZ;
-		rwnx_hw->phy.sec_chan.type = PHY_CHNL_BW_20;
-		rwnx_hw->phy.sec_chan.prim20_freq = 5500;
-		rwnx_hw->phy.sec_chan.center_freq1 = 5500;
-		rwnx_hw->phy.sec_chan.center_freq2 = 0;
-	}
-#endif // CONFIG_RWNX_FHOST
-
-	rwnx_plat_stop_agcfsm(rwnx_plat, FCU_RWNXFCAGCCNTL_ADDR, &agcctl, &memclk, 0,
-						  MDM_MEMCLKCTRL0_ADDR);
-
-	ret = rwnx_plat_bin_fw_upload(rwnx_plat,
-							  RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_FCU_UCODE_ADDR),
-							  RWNX_FCU_FW_NAME);
-
-	rwnx_plat_start_agcfsm(rwnx_plat, FCU_RWNXFCAGCCNTL_ADDR, agcctl, memclk, 0,
-						   MDM_MEMCLKCTRL0_ADDR);
-#endif
-
-	return ret;
-}
-
-/**
- * rwnx_is_new_agc_load() - Return is new agc clock register should be used
- *
- * @rwnx_plat: platform data
- * @rf: rf in used
- *
- * c.f Modem UM (AGC/CCA initialization)
- */
-#ifndef CONFIG_RWNX_SDM
-static u8 rwnx_get_agc_load_version(struct rwnx_plat *rwnx_plat, u32 rf, u32 *clkctrladdr)
-{
-	u8 agc_load_ver = 0;
-	u32 agc_ver;
-	u32 regval;
-
-	/* Trident and Elma PHY use old method */
-	if (rf !=  MDM_PHY_CONFIG_KARST) {
-		*clkctrladdr = MDM_MEMCLKCTRL0_ADDR;
-		return 0;
-	}
-
-	/* Get the FPGA signature */
-	regval = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, SYSCTRL_SIGNATURE_ADDR);
-
-	if (__FPGA_TYPE(regval) == 0xC0CA)
-		*clkctrladdr = CRM_CLKGATEFCTRL0_ADDR;
-	else
-		*clkctrladdr = MDM_CLKGATEFCTRL0_ADDR;
-
-	/* Read RIU version register */
-	agc_ver = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXVERSION_ADDR);
-	agc_load_ver = __RIU_AGCLOAD_FROM_VERS(agc_ver);
-
-	return agc_load_ver;
-}
-#endif /* CONFIG_RWNX_SDM */
-
-/**
- * rwnx_plat_agc_load() - Load AGC ucode
- *
- * @rwnx_plat: platform data
- * c.f Modem UM (AGC/CCA initialization)
- */
-static int rwnx_plat_agc_load(struct rwnx_plat *rwnx_plat)
-{
-	int ret = 0;
-#ifndef CONFIG_RWNX_SDM
-	u32 agc = 0, agcctl, memclk;
-	u32 clkctrladdr;
-	u32 rf = rwnx_plat_get_rf(rwnx_plat);
-	u8 agc_ver;
-
-	switch (rf) {
-	case MDM_PHY_CONFIG_TRIDENT:
-		agc = AGC_RWNXAGCCNTL_ADDR;
-		break;
-	case MDM_PHY_CONFIG_ELMA:
-	case MDM_PHY_CONFIG_KARST:
-		agc = RIU_RWNXAGCCNTL_ADDR;
-		break;
-	default:
+	if (size <= 0) {
+		printk("wrong size of firmware file\n");
+		release_firmware(fw);
 		return -1;
 	}
 
-	agc_ver = rwnx_get_agc_load_version(rwnx_plat, rf, &clkctrladdr);
+	rwnx_plat_userconfig_parsing(rwnx_hw, (char *)dst, size);
 
-	rwnx_plat_stop_agcfsm(rwnx_plat, agc, &agcctl, &memclk, agc_ver, clkctrladdr);
-
-	ret = rwnx_plat_bin_fw_upload(rwnx_plat,
-							  RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_AGC_UCODE_ADDR),
-							  RWNX_AGC_FW_NAME);
-
-	if (!ret && (agc_ver == 1)) {
-		/* Run BIST to ensure that the AGC RAM was correctly loaded */
-		RWNX_REG_WRITE(BIT(28), rwnx_plat, RWNX_ADDR_SYSTEM,
-					   RIU_RWNXDYNAMICCONFIG_ADDR);
-		while (RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXDYNAMICCONFIG_ADDR) & BIT(28)) {
-			;
-		}
-
-		if (!(RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM,
-							RIU_AGCMEMBISTSTAT_ADDR) & BIT(0))) {
-			dev_err(rwnx_platform_get_dev(rwnx_plat),
-					"AGC RAM not loaded correctly 0x%08x\n",
-					RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM,
-								  RIU_AGCMEMSIGNATURESTAT_ADDR));
-			ret = -EIO;
-		}
-	}
-
-	rwnx_plat_start_agcfsm(rwnx_plat, agc, agcctl, memclk, agc_ver, clkctrladdr);
-
-#endif
-	return ret;
-}
-
-/**
- * rwnx_ldpc_load() - Load LDPC RAM
- *
- * @rwnx_hw: Main driver data
- * c.f Modem UM (LDPC initialization)
- */
-static int rwnx_ldpc_load(struct rwnx_hw *rwnx_hw)
-{
-#ifndef CONFIG_RWNX_SDM
-	struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
-	u32 rf = rwnx_plat_get_rf(rwnx_plat);
-	u32 phy_feat = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, MDM_HDMCONFIG_ADDR);
-
-	if ((rf !=  MDM_PHY_CONFIG_KARST) ||
-		(phy_feat & (MDM_LDPCDEC_BIT | MDM_LDPCENC_BIT)) !=
-		(MDM_LDPCDEC_BIT | MDM_LDPCENC_BIT)) {
-		goto disable_ldpc;
-	}
-
-	if (rwnx_plat_bin_fw_upload(rwnx_plat,
-							RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_LDPC_RAM_ADDR),
-							RWNX_LDPC_RAM_NAME)) {
-		goto disable_ldpc;
-	}
+	release_firmware(fw);
 
 	return 0;
-
-disable_ldpc:
-	rwnx_hw->mod_params->ldpc_on = false;
-
-#endif /* CONFIG_RWNX_SDM */
-	return 0;
 }
 
-/**
- * rwnx_plat_lmac_load() - Load FW code
- *
- * @rwnx_plat: platform data
- */
-static int rwnx_plat_lmac_load(struct rwnx_plat *rwnx_plat)
-{
-	int ret;
-
-	#ifdef CONFIG_RWNX_TL4
-	ret = rwnx_plat_tl4_fw_upload(rwnx_plat,
-								  RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
-								  RWNX_MAC_FW_NAME);
-	#else
-	ret = rwnx_plat_ihex_fw_upload(rwnx_plat,
-								   RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
-								   RWNX_MAC_FW_NAME);
-	if (ret == -ENOENT) {
-		ret = rwnx_plat_bin_fw_upload(rwnx_plat,
-									  RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
-									  RWNX_MAC_FW_NAME2);
-	}
-	#endif
-
-	return ret;
-}
-#endif
-
-#ifndef CONFIG_ROM_PATCH_EN
 /**
  * rwnx_plat_fmac_load() - Load FW code
  *
@@ -718,42 +460,10 @@
 	int ret = 0;
 
 	RWNX_DBG(RWNX_FN_ENTRY_STR);
-	#if defined(CONFIG_NANOPI_M4) || defined(CONFIG_PLATFORM_ALLWINNER)
-	//ret = rwnx_plat_bin_fw_upload_android(rwnx_hw, RAM_FMAC_FW_ADDR, RWNX_MAC_FW_NAME2);
-	#else
-	ret = rwnx_plat_bin_fw_upload_2(rwnx_hw,
-								  RAM_FMAC_FW_ADDR,
-								  RWNX_MAC_FW_NAME2);
-	#endif
+	ret = rwnx_plat_userconfig_upload_android(rwnx_hw, FW_USERCONFIG_NAME);
 	return ret;
 }
 #endif /* !CONFIG_ROM_PATCH_EN */
-
-#if 0
-/**
- * rwnx_plat_mpif_sel() - Select the MPIF according to the FPGA signature
- *
- * @rwnx_plat: platform data
- */
-static void rwnx_plat_mpif_sel(struct rwnx_plat *rwnx_plat)
-{
-#ifndef CONFIG_RWNX_SDM
-	u32 regval;
-	u32 type;
-
-	/* Get the FPGA signature */
-	regval = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, SYSCTRL_SIGNATURE_ADDR);
-	type = __FPGA_TYPE(regval);
-
-	/* Check if we need to switch to the old MPIF or not */
-	if ((type != 0xCAFE) && (type != 0XC0CA) && (regval & 0xF) < 0x3) {
-		/* A old FPGA A is used, so configure the FPGA B to use the old MPIF */
-		RWNX_REG_WRITE(0x3, rwnx_plat, RWNX_ADDR_SYSTEM, FPGAB_MPIF_SEL_ADDR);
-	}
-#endif
-}
-#endif
-
 
 /**
  * rwnx_platform_reset() - Reset the platform
@@ -982,79 +692,21 @@
  */
 int rwnx_platform_on(struct rwnx_hw *rwnx_hw, void *config)
 {
-	#ifndef CONFIG_ROM_PATCH_EN
-	#ifdef CONFIG_DOWNLOAD_FW
 	int ret;
-	#endif
-	#endif
 	struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
+	(void)ret;
 
 	RWNX_DBG(RWNX_FN_ENTRY_STR);
 
 	if (rwnx_plat->enabled)
 		return 0;
 
-	#if 0
-	if (rwnx_platform_reset(rwnx_plat))
-		return -1;
-
-	rwnx_plat_mpif_sel(rwnx_plat);
-
-	ret = rwnx_plat_fcu_load(rwnx_hw);
-	if (ret)
-		return ret;
-	ret = rwnx_plat_agc_load(rwnx_plat);
-	if (ret)
-		return ret;
-	ret = rwnx_ldpc_load(rwnx_hw);
-	if (ret)
-		return ret;
-	ret = rwnx_plat_lmac_load(rwnx_plat);
-	if (ret)
-		return ret;
-
-	shared_ram = RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, SHARED_RAM_START_ADDR);
-	ret = rwnx_ipc_init(rwnx_hw, shared_ram);
-	if (ret)
-		return ret;
-
-	ret = rwnx_plat->enable(rwnx_hw);
-	if (ret)
-		return ret;
-	RWNX_REG_WRITE(BOOTROM_ENABLE, rwnx_plat,
-				   RWNX_ADDR_SYSTEM, SYSCTRL_MISC_CNTL_ADDR);
-
-	#if 0
-	ret = rwnx_fw_trace_config_filters(rwnx_get_shared_trace_buf(rwnx_hw),
-											rwnx_ipc_fw_trace_desc_get(rwnx_hw),
-											rwnx_hw->mod_params->ftl);
-	if (ret)
-	#endif
-
-	#ifndef CONFIG_RWNX_FHOST
-	{
-		ret = rwnx_check_fw_compatibility(rwnx_hw);
-		if (ret) {
-			rwnx_hw->plat->disable(rwnx_hw);
-			tasklet_kill(&rwnx_hw->task);
-			rwnx_ipc_deinit(rwnx_hw);
-			return ret;
-		}
-	}
-	#endif /* !CONFIG_RWNX_FHOST */
-
-	if (config)
-		rwnx_term_restore_config(rwnx_plat, config);
-
-	rwnx_ipc_start(rwnx_hw);
-	#else
 	#ifndef CONFIG_ROM_PATCH_EN
 	#ifdef CONFIG_DOWNLOAD_FW
 	ret = rwnx_plat_fmac_load(rwnx_hw);
 	if (ret)
 		return ret;
 	#endif /* !CONFIG_ROM_PATCH_EN */
-	#endif
 	#endif
 
 	rwnx_plat->enabled = true;
@@ -1075,6 +727,7 @@
 void rwnx_platform_off(struct rwnx_hw *rwnx_hw, void **config)
 {
 #if defined(AICWF_USB_SUPPORT) || defined(AICWF_SDIO_SUPPORT)
+	tasklet_kill(&rwnx_hw->task);
 	rwnx_hw->plat->enabled = false;
 	return ;
 #endif
@@ -1085,22 +738,12 @@
 		return;
 	}
 
-#ifdef AICWF_PCIE_SUPPORT
-	rwnx_ipc_stop(rwnx_hw);
-#endif
-
 	if (config)
 		*config = rwnx_term_save_config(rwnx_hw->plat);
 
 	rwnx_hw->plat->disable(rwnx_hw);
 
 	tasklet_kill(&rwnx_hw->task);
-
-#ifdef AICWF_PCIE_SUPPORT
-	rwnx_ipc_deinit(rwnx_hw);
-#endif
-
-
 	rwnx_platform_reset(rwnx_hw->plat);
 
 	rwnx_hw->plat->enabled = false;
@@ -1148,6 +791,7 @@
 #endif
 }
 
+#ifdef AICWF_PCIE_SUPPORT
 /**
  * rwnx_platform_register_drv() - Register all possible platform drivers
  */
@@ -1164,6 +808,7 @@
 {
 	return rwnx_pci_unregister_drv();
 }
+#endif
 
 struct device *rwnx_platform_get_dev(struct rwnx_plat *rwnx_plat)
 {
@@ -1173,7 +818,9 @@
 #ifdef AICWF_USB_SUPPORT
 	return rwnx_plat->usbdev->dev;
 #endif
+#ifdef AICWF_PCIE_SUPPORT
 	return &(rwnx_plat->pci_dev->dev);
+#endif
 }
 
 

--
Gitblit v1.6.2