From 110a140209ccfefe01417f82a3d06e96edf303d9 Mon Sep 17 00:00:00 2001 From: Portisch Date: Tue, 11 May 2021 07:32:52 +0200 Subject: [PATCH] Revert "qca9377-aml: update driver" This reverts commit 1ce43a39f43e1395147ab6825ab295587e9ad7bb. Partially revert driver update to stay compatible with multible QCA drivers in image. --- .../amlogic/qca9377-aml/package.mk | 21 +- ...firmware-handling-to-support-chips-u.patch | 538 ++++++++++++++++++ ...ml-001-fix-amlogic-4.9-compatibility.patch | 42 ++ 3 files changed, 589 insertions(+), 12 deletions(-) create mode 100644 projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-3.14/qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch create mode 100644 projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-001-fix-amlogic-4.9-compatibility.patch diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/package.mk b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/package.mk index f3fb030312f..688d99bcb4e 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/package.mk +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/package.mk @@ -3,12 +3,12 @@ # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="qca9377-aml" -PKG_VERSION="b16df7d323458c461c9f6487af9afbf83bba3459" -PKG_SHA256="397676ef19c1f4c7efa4c177e3c866632948bcdea1bf04e9707ba0707b6025c5" +PKG_VERSION="311e24939b53d0cbaf303cde3ed1dc22349602a9" +PKG_SHA256="238e0174ec5ca3f87c184fade5eb7d1e4522d6af279aac6bd87f8bab24fc13ad" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" -PKG_SITE="https://github.com/CoreELEC/qca9377-aml" -PKG_URL="https://github.com/CoreELEC/qca9377-aml/archive/${PKG_VERSION}.tar.gz" +PKG_SITE="https://boundarydevices.com/new-silex-wifi-802-11ac-bt4-1-module/" +PKG_URL="https://github.com/boundarydevices/qcacld-2.0/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain linux" PKG_NEED_UNPACK="${LINUX_DEPENDS}" PKG_LONGDESC="qca9377 Linux Driver" @@ -18,8 +18,8 @@ PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS="$LINUX" post_unpack() { - sed -i 's,-Wall,,g; s,-Werror,,g' ${PKG_BUILD}/AIO/drivers/qcacld-new/Kbuild - sed -i 's,CDEFINES :=,CDEFINES := -Wno-misleading-indentation -Wno-unused-variable -Wno-unused-function,g' ${PKG_BUILD}/AIO/drivers/qcacld-new/Kbuild + sed -i 's,-Wall,,g; s,-Werror,,g' ${PKG_BUILD}/Kbuild + sed -i 's,CDEFINES :=,CDEFINES := -Wno-misleading-indentation -Wno-unused-variable -Wno-unused-function,g' ${PKG_BUILD}/Kbuild } pre_make_target() { @@ -28,15 +28,12 @@ pre_make_target() { } make_target() { - cd AIO/build - make KERNELPATH="$(kernel_path)" \ + make KERNEL_SRC="$(kernel_path)" \ ARCH=${TARGET_KERNEL_ARCH} \ - CROSS_COMPILE=${TARGET_KERNEL_PREFIX} \ - INSTALL_ROOT=${PKG_BUILD} \ - CONFIG_BUILDROOT=y + CROSS_COMPILE=${TARGET_KERNEL_PREFIX} } makeinstall_target() { mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} - cp ${PKG_BUILD}/lib/modules/wlan.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}/wlan-${PKG_NAME}.ko + cp ${PKG_BUILD}/wlan.ko ${INSTALL}/$(get_full_module_dir)/${PKG_NAME}/wlan-${PKG_NAME}.ko } diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-3.14/qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-3.14/qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch new file mode 100644 index 00000000000..87f428b5900 --- /dev/null +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-3.14/qca9377-aml-001-Modify-SDIO-and-firmware-handling-to-support-chips-u.patch @@ -0,0 +1,538 @@ +From 7d4ee23fb20cc5e17d8d79db20a0d6704ac3df6c Mon Sep 17 00:00:00 2001 +From: kszaq +Date: Tue, 10 Jan 2017 22:43:12 +0100 +Subject: [PATCH] Modify SDIO and firmware handling to support chips used in + Amlogic devices + +--- + CORE/HDD/src/wlan_hdd_cfg.c | 10 +- + CORE/HDD/src/wlan_hdd_main.c | 180 ++++++++++++++++++++- + CORE/SERVICES/BMI/ol_fw.c | 8 +- + CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c | 6 - + .../sdio/linux/native_sdio/include/hif_internal.h | 2 +- + CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c | 62 +++---- + 6 files changed, 209 insertions(+), 59 deletions(-) + +diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c +index 14524ef..439b18a 100644 +--- a/CORE/HDD/src/wlan_hdd_cfg.c ++++ b/CORE/HDD/src/wlan_hdd_cfg.c +@@ -60,6 +60,8 @@ + #include + #include + ++extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); ++ + static char *mac_param; + module_param_named(mac, mac_param, charp, S_IRUGO); + MODULE_PARM_DESC(mac, "mac address override"); +@@ -4411,11 +4413,11 @@ VOS_STATUS hdd_parse_config_ini(hdd_context_t* pHddCtx) + + memset(cfgIniTable, 0, sizeof(cfgIniTable)); + +- status = request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); ++ status = qca_request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev); + + if(status) + { +- printk("%s: request_firmware failed %d",__func__, status); ++ printk("%s: qca_request_firmware failed %d",__func__, status); + vos_status = VOS_STATUS_E_FAILURE; + goto config_exit; + } +@@ -5104,11 +5106,11 @@ VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx) + } + + memset(macTable, 0, sizeof(macTable)); +- status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); ++ status = qca_request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); + + if (status) + { +- hddLog(VOS_TRACE_LEVEL_WARN, "%s: request_firmware failed %d", ++ hddLog(VOS_TRACE_LEVEL_WARN, "%s: qca_request_firmware failed %d", + __func__, status); + vos_status = VOS_STATUS_E_FAILURE; + return vos_status; +diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c +index 00db789..7926902 100644 +--- a/CORE/HDD/src/wlan_hdd_main.c ++++ b/CORE/HDD/src/wlan_hdd_main.c +@@ -239,6 +239,163 @@ static VOS_STATUS hdd_parse_ese_beacon_req(tANI_U8 *pValue, + /* + * Android DRIVER command structures + */ ++//tkun add ++ typedef char A_CHAR; ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) ++ #define GET_INODE_FROM_FILEP(filp) \ ++ (filp)->f_path.dentry->d_inode ++ #else ++ #define GET_INODE_FROM_FILEP(filp) \ ++ (filp)->f_dentry->d_inode ++ #endif ++// #define A_MALLOC(size) kmalloc((size), GFP_KERNEL) ++ #define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC) ++// #define A_FREE(addr) kfree(addr);addr=NULL; ++//#define A_MEMCPY(dst, src, len) memcpy((dst), (src), (len)) ++// #define A_MEMZERO(addr, len) memset((addr), 0, (len)) ++ #define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len)) ++ #define A_ROUND_UP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) ++ ++ char qcafwpath[256] = "/lib/firmware"; ++ ++ int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length) ++ { ++ int ret = 0; ++ struct file *filp = (struct file *)-ENOENT; ++ mm_segment_t oldfs; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ ++ // printk("%s: filename %s \n",__func__,filename); ++ do { ++ int mode = (wbuf) ? O_RDWR : O_RDONLY; ++ filp = filp_open(filename, mode, S_IRUSR); ++ if (IS_ERR(filp) || !filp->f_op) { ++ printk("%s: file %s filp_open error\n", __FUNCTION__, filename); ++ ret = -ENOENT; ++ break; ++ } ++ ++ if (length==0) { ++ /* Read the length of the file only */ ++ struct inode *inode; ++ ++ inode = GET_INODE_FROM_FILEP(filp); ++ if (!inode) { ++ // printk("%s: Get inode from %s failed\n", __FUNCTION__, filen ame); ++ ret = -ENOENT; ++ break; ++ } ++ ret = i_size_read(inode->i_mapping->host); ++ break; ++ } ++ ++ if (wbuf) { ++ if ( (ret=filp->f_op->write(filp, wbuf, length, &filp->f_pos)) < 0) { ++// printk("%s: Write %u bytes to file %s error %d\n", __FUNCTION__, ++ // length, filename, ret); ++ break; ++ } ++ } else { ++ if ( (ret=filp->f_op->read(filp, rbuf, length, &filp->f_pos)) < 0) { ++// printk ("%s: Read %u bytes from file %s error %d\n", __FUNCTION__, ++ // length, filename, ret); ++ break; ++ } ++ } ++ } while (0); ++ ++ if (!IS_ERR(filp)) { ++ filp_close(filp, NULL); ++ } ++ set_fs(oldfs); ++ ++ return ret; ++ } ++ ++ ++ int android_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device) ++ { ++ int ret = 0; ++ struct firmware *firmware; ++ char filename[256]; ++ const char *raw_filename = name; ++ *firmware_p = firmware = A_MALLOC(sizeof(*firmware)); ++ if (!firmware) ++ return -ENOMEM; ++ A_MEMZERO(firmware, sizeof(*firmware)); ++ do { ++ size_t length, bufsize, bmisize; ++ ++ if (snprintf(filename, sizeof(filename), "%s/%s", qcafwpath, ++ raw_filename) >= sizeof(filename)) { ++ printk("snprintf: %s/%s\n", qcafwpath, raw_filename); ++ ret = -1; ++ break; ++ } ++ if ( (ret=android_readwrite_file(filename, NULL, NULL, 0)) < 0) { ++ break; ++ } else { ++ length = ret; ++ } ++ ++ if (strcmp(raw_filename, "softmac") == 0) { ++ bufsize = length = 17; ++ } else { ++ bufsize = ALIGN(length, PAGE_SIZE); ++ bmisize = A_ROUND_UP(length, 4); ++ bufsize = max(bmisize, bufsize); ++ } ++ firmware->data = vmalloc(bufsize); ++ firmware->size = length; ++ ++ // printk("AR6K: %s(): raw_filename=%s, bufsize=%d\n", __FUNCTION__, ra w_filename, bufsize); ++ ++ if (!firmware->data) { ++ printk("%s: Cannot allocate buffer for firmware\n", __FUNCTION__); ++ ret = -ENOMEM; ++ break; ++ } ++ ++ if ( (ret=android_readwrite_file(filename, (char*)firmware->data, NULL, length)) != length) { ++// printk("%s: file read error, ret %d request %d\n", __FUNCTION__,ret,length); ++// ret = -1; ++ break; ++ } ++ ++ } while (0); ++ ++ if (ret<0) { ++ if (firmware) { ++ if (firmware->data) ++ vfree(firmware->data); ++ A_FREE(firmware); ++ } ++ *firmware_p = NULL; ++ } else { ++ ret = 0; ++ } ++ return ret; ++ } ++ ++ void android_release_firmware(const struct firmware *firmware) ++ { ++ if (firmware) { ++ if (firmware->data) ++ vfree(firmware->data); ++ kfree(firmware); ++ } ++ } ++extern int qca_request_firmware(const struct firmware **firmware_p,const char *name,struct device *device) ++ { ++ // int uevent = 1; ++ ++ //return _request_firmware(firmware_p, name, device, uevent, false); ++ ++ return android_request_firmware(firmware_p, name,device); ++ ++ ++ } + struct android_wifi_reassoc_params { + unsigned char bssid[18]; + int channel; +@@ -7801,7 +7958,7 @@ VOS_STATUS hdd_get_cfg_file_size(v_VOID_t *pCtx, char *pFileName, v_SIZE_t *pBuf + + ENTER(); + +- status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); ++ status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + + if(status || !pHddCtx->fw || !pHddCtx->fw->data) { + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); +@@ -7842,7 +7999,7 @@ VOS_STATUS hdd_read_cfg_file(v_VOID_t *pCtx, char *pFileName, + + ENTER(); + +- status = request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); ++ status = qca_request_firmware(&pHddCtx->fw, pFileName, pHddCtx->parent_dev); + + if(status || !pHddCtx->fw || !pHddCtx->fw->data) { + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: CFG download failed",__func__); +@@ -12886,15 +13043,34 @@ static int hdd_driver_init( void) + \return - 0 for success, non zero for failure + + --------------------------------------------------------------------------*/ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) ++extern int wifi_setup_dt(void); ++extern void wifi_teardown_dt(void); ++#endif ++extern void extern_wifi_set_enable(int is_on); ++extern void sdio_reinit(void); ++ + #ifdef MODULE + static int __init hdd_module_init ( void) + { ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) ++ wifi_setup_dt(); ++#endif ++ extern_wifi_set_enable(0); ++ mdelay(200); ++ extern_wifi_set_enable(1); ++ mdelay(200); ++sdio_reinit(); ++ + return hdd_driver_init(); + } + #else /* #ifdef MODULE */ + static int __init hdd_module_init ( void) + { + /* Driver initialization is delayed to fwpath_changed_handler */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) ++wifi_teardown_dt(); ++#endif + return 0; + } + #endif /* #ifdef MODULE */ +diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c +index 466dbbc..95f1aee 100644 +--- a/CORE/SERVICES/BMI/ol_fw.c ++++ b/CORE/SERVICES/BMI/ol_fw.c +@@ -118,7 +118,7 @@ static int ol_get_fw_files_for_target(struct ol_fw_files *pfw_files, + return 0; + } + #endif +- ++extern int qca_request_firmware(const struct firmware **firmware_p, const char *name,struct device *device); + #ifdef HIF_USB + static A_STATUS ol_usb_extra_initialization(struct ol_softc *scn); + #endif +@@ -164,7 +164,7 @@ static int ol_transfer_single_bin_file(struct ol_softc *scn, + __func__)); + } + +- if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) ++ if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + { + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, + ("%s: Failed to get %s\n", +@@ -492,7 +492,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, + break; + } + +- if (request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) ++ if (qca_request_firmware(&fw_entry, filename, scn->sc_osdev->device) != 0) + { + printk("%s: Failed to get %s\n", __func__, filename); + +@@ -506,7 +506,7 @@ static int ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file, + filename = scn->fw_files.board_data; + printk("%s: Trying to load default %s\n", + __func__, filename); +- if (request_firmware(&fw_entry, filename, ++ if (qca_request_firmware(&fw_entry, filename, + scn->sc_osdev->device) != 0) { + printk("%s: Failed to get %s\n", + __func__, filename); +diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +index c99020e..6bafed8 100644 +--- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c ++++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +@@ -234,12 +234,6 @@ ath_hif_sdio_remove(void *context, void *hif_handle) + { + ENTER(); + +- if (!sc) { +- VOS_TRACE(VOS_MODULE_ID_HIF, VOS_TRACE_LEVEL_ERROR, +- "Global SDIO context is NULL"); +- return A_ERROR; +- } +- + athdiag_procfs_remove(); + + #ifndef TARGET_DUMP_FOR_NON_QC_PLATFORM +diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h +index 382e38c..234bc09 100644 +--- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h ++++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h +@@ -112,7 +112,7 @@ struct hif_device { + A_BOOL swap_mailbox; + }; + +-#define HIF_DMA_BUFFER_SIZE (4 * 1024) ++#define HIF_DMA_BUFFER_SIZE (56 * 1024) + #define CMD53_FIXED_ADDRESS 1 + #define CMD53_INCR_ADDRESS 2 + +diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +index 1c54002..03401fd 100644 +--- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c ++++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +@@ -64,7 +64,8 @@ + ((request->request & HIF_WRITE)&& \ + (request->address >= 0x1000 && request->address < 0x1FFFF)) + #endif +-unsigned int mmcbusmode = 0; ++//unsigned int mmcbusmode = 0; ++unsigned int mmcbusmode = 5; + module_param(mmcbusmode, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(mmcbusmode, "Set MMC driver Bus Mode: 1-SDR12, 2-SDR25, 3-SDR50, 4-DDR50, 5-SDR104"); + EXPORT_SYMBOL(mmcbusmode); +@@ -74,7 +75,9 @@ module_param(mmcbuswidth, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(mmcbuswidth, "Set MMC driver Bus Width: 1-1Bit, 4-4Bit, 8-8Bit"); + EXPORT_SYMBOL(mmcbuswidth); + +-unsigned int mmcclock = 0; ++//unsigned int mmcclock = 0; ++//unsigned int mmcclock = 166666666; ++unsigned int mmcclock = 200000000; + module_param(mmcclock, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(mmcclock, "Set MMC driver Clock value"); + EXPORT_SYMBOL(mmcclock); +@@ -95,7 +98,7 @@ unsigned int asyncintdelay = 2; + module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 2 is default, vaild values are 1 and 2"); + #else +-unsigned int asyncintdelay = 0; ++unsigned int asyncintdelay = 2; + module_param(asyncintdelay, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(asyncintdelay, "Delay clock count for aysnc interrupt, 0 is default, vaild values are 1 and 2"); + #endif +@@ -412,12 +415,6 @@ __HIFReadWrite(HIF_DEVICE *device, + tbuffer = device->dma_buffer; + /* copy the write data to the dma buffer */ + AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); +- if (length > HIF_DMA_BUFFER_SIZE) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, +- ("AR6000: Invalid write length: %d\n", length)); +- status = A_EINVAL; +- break; +- } + memcpy(tbuffer, buffer, length); + bounced = TRUE; + } else { +@@ -440,12 +437,6 @@ __HIFReadWrite(HIF_DEVICE *device, + if (BUFFER_NEEDS_BOUNCE(buffer)) { + AR_DEBUG_ASSERT(device->dma_buffer != NULL); + AR_DEBUG_ASSERT(length <= HIF_DMA_BUFFER_SIZE); +- if (length > HIF_DMA_BUFFER_SIZE) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, +- ("AR6000: Invalid read length: %d\n", length)); +- status = A_EINVAL; +- break; +- } + tbuffer = device->dma_buffer; + bounced = TRUE; + } else { +@@ -695,7 +686,7 @@ static int async_task(void *param) + complete_and_exit(&device->async_completion, 0); + return 0; + } +-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) ++#if 1 + static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, A_UINT32 flags, A_UINT32 *resp) + { + struct mmc_command cmd; +@@ -719,6 +710,7 @@ static A_INT32 IssueSDCommand(HIF_DEVICE *device, A_UINT32 opcode, A_UINT32 arg, + return err; + } + #endif ++//extern int sdio_reset_comm(struct mmc_card *card); + A_STATUS ReinitSDIO(HIF_DEVICE *device) + { + A_INT32 err = 0; +@@ -733,10 +725,12 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + host = card->host; + + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: +ReinitSDIO \n")); ++ ++// err = sdio_reset_comm(card); ++#if 1 + sdio_claim_host(func); + + do { +-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) + /* 2.6.32 kernel does part of the SDIO initalization upon resume */ + A_BOOL lt_2_6_32 = (LINUX_VERSION_CODEocr) { +- /* Issue CMD5, arg = 0 */ +- err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); +- break; +- } +- host->ocr = resp; +- } + + /* Issue CMD5, arg = ocr. Wait till card is ready */ + for (i=0;i<100;i++) { +- err = IssueSDCommand(device, SD_IO_SEND_OP_COND, host->ocr, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); ++ err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); + if (err) { + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); + break; +@@ -828,7 +813,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + break; + } + } +-#endif ++ + /* Enable high speed */ + if (card->host->caps & MMC_CAP_SD_HIGHSPEED) { + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("ReinitSDIO: Set high speed mode\n")); +@@ -891,7 +876,7 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + + sdio_release_host(func); + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: -ReinitSDIO \n")); +- ++#endif + return (err) ? A_ERROR : A_OK; + } + +@@ -1320,6 +1305,7 @@ static int hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id + /* + TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Power Manage work. + */ ++#if 1 + { + A_UINT32 clock, clock_set = 12500000; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) +@@ -1576,7 +1562,7 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe + + sdio_release_host(func); + } +- ++#endif + spin_lock_init(&device->lock); + + spin_lock_init(&device->asynclock); +@@ -2068,12 +2054,10 @@ static int hifDeviceSuspend(struct device *dev) + return -1; + } + } else { +- if (wma_suspend_target(temp_module, 0)) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("PDEV Suspend Failed\n")); +- return -1; +- } ++ if (wma_suspend_target(temp_module, 0)) { ++ printk(KERN_ERR "wma_suspend_target failed.\n"); ++ } + } +- + if (pm_flag & MMC_PM_WAKE_SDIO_IRQ){ + AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("hifDeviceSuspend: wow enter\n")); + config = HIF_DEVICE_POWER_DOWN; +@@ -2293,9 +2277,7 @@ static HIF_DEVICE * + addHifDevice(struct sdio_func *func) + { + HIF_DEVICE *hifdevice = NULL; +-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) + int ret = 0; +-#endif + ENTER(); + AR_DEBUG_ASSERT(func != NULL); + hifdevice = (HIF_DEVICE *)A_MALLOC(sizeof(HIF_DEVICE)); +@@ -2308,13 +2290,9 @@ addHifDevice(struct sdio_func *func) + hifdevice->func = func; + hifdevice->powerConfig = HIF_DEVICE_POWER_UP; + hifdevice->DeviceState = HIF_DEVICE_STATE_ON; +-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && !defined(WITH_BACKPORTS) + ret = sdio_set_drvdata(func, hifdevice); ++ + EXIT("status %d", ret); +-#else +- sdio_set_drvdata(func, hifdevice); +- EXIT(); +-#endif + return hifdevice; + } + +-- +2.7.4 + diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-001-fix-amlogic-4.9-compatibility.patch b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-001-fix-amlogic-4.9-compatibility.patch new file mode 100644 index 00000000000..af7ad41d06b --- /dev/null +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/qca9377-aml/patches/amlogic-4.9/qca9377-aml-001-fix-amlogic-4.9-compatibility.patch @@ -0,0 +1,42 @@ +From 3b0a139cea3a9b45db94923d4acba93b0267fc25 Mon Sep 17 00:00:00 2001 +From: Arthur Liberman +Date: Fri, 17 Jul 2020 19:09:18 +0300 +Subject: [PATCH] Fix build on Amlogic's 4.9 kernel + +--- + CORE/HDD/src/wlan_hdd_main.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c +index 00db78995..2afe68e23 100644 +--- a/CORE/HDD/src/wlan_hdd_main.c ++++ b/CORE/HDD/src/wlan_hdd_main.c +@@ -13015,9 +13015,15 @@ static void __exit hdd_module_exit(void) + hdd_driver_exit(); + } + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)) ++#define KERNEL_PARAM const struct kernel_param ++#else ++#define KERNEL_PARAM struct kernel_param ++#endif ++ + #ifdef MODULE + static int fwpath_changed_handler(const char *kmessage, +- struct kernel_param *kp) ++ KERNEL_PARAM *kp) + { + return param_set_copystring(kmessage, kp); + } +@@ -13072,7 +13078,7 @@ static int kickstart_driver(void) + + --------------------------------------------------------------------------*/ + static int fwpath_changed_handler(const char *kmessage, +- struct kernel_param *kp) ++ KERNEL_PARAM *kp) + { + int ret; + +-- +2.20.1 +