INT32 hif_sdio_create_dev_node(void) { INT32 iResult = -1; HIF_SDIO_DBG_FUNC("++"); iResult = register_chrdev(hifSdioMajor, kObjName, &hifDevOps); if (0 > iResult) { HIF_SDIO_ERR_FUNC("register_chrdev failed.\n"); iResult = -1; } else { hifSdioMajor = hifSdioMajor == 0 ? iResult : hifSdioMajor; HIF_SDIO_INFO_FUNC("register_chrdev succeed, mtk_jajor = %d\n", hifSdioMajor); pHifClass = class_create(THIS_MODULE, HifClassName); if (IS_ERR(pHifClass)) { HIF_SDIO_ERR_FUNC("class_create error\n"); iResult = -2; } else { pHifDev = device_create(pHifClass, NULL, MKDEV(hifSdioMajor, 0), NULL, HifClassName, "%d", 0); if (IS_ERR(pHifDev)) { HIF_SDIO_ERR_FUNC("device_create error:%ld\n", PTR_ERR(pHifDev)); iResult = -3; } else { HIF_SDIO_INFO_FUNC("device_create succeed\n"); iResult = 0; } } } return iResult; }
INT32 hifsdiod_start(void) { int iRet = -1; init_waitqueue_head(&gHifsdiodEvent); #if 0 osal_event_init(&gHifsdiodEvent); gConIdQueryThread.pThreadData = (VOID *)NULL; gConIdQueryThread.pThreadFunc = (VOID *)hif_sdio_proc; osal_memcpy(gConIdQueryThread.threadName, gConIdQueryName , osal_strlen(gConIdQueryName)); iRet = osal_thread_create(&gConIdQueryThread); if (iRet < 0) { HIF_SDIO_ERR_FUNC("osal_thread_create fail...\n"); goto ERR_EXIT1; } #else gConIdQueryThread = kthread_create(hif_sdio_proc, NULL, gConIdQueryName); if (NULL == gConIdQueryThread) { HIF_SDIO_ERR_FUNC("osal_thread_create fail...\n"); goto ERR_EXIT1; } #endif #if 0 /* Start STPd thread*/ iRet = osal_thread_run(&gConIdQueryThread); if(iRet < 0) { HIF_SDIO_ERR_FUNC("osal_thread_run FAILS\n"); goto ERR_EXIT1; } #else if (gConIdQueryThread) { wake_up_process(gConIdQueryThread); } else { goto ERR_EXIT1; } #endif iRet = 0; HIF_SDIO_INFO_FUNC("succeed\n"); return iRet; ERR_EXIT1: HIF_SDIO_ERR_FUNC("failed\n"); return iRet; }
INT32 hif_sdio_match_chipid_by_dev_id(const struct sdio_device_id * id) { INT32 maxIndex = sizeof(gChipInfoArray) / sizeof(gChipInfoArray[0]); INT32 index = 0; struct sdio_device_id *localId = NULL; INT32 chipId = -1; for (index = 0; index < maxIndex; index++) { localId = &(gChipInfoArray[index].deviceId); if ((localId->vendor == id->vendor) && (localId->device == id->device)) { chipId = gChipInfoArray[index].chipId; HIF_SDIO_INFO_FUNC ("valid chipId found, index(%d), vendor id(0x%x), device id(0x%x), chip id(0x%x)\n", index, localId->vendor, localId->device, chipId); gComboChipId = chipId; break; } } if (0 > chipId) { HIF_SDIO_ERR_FUNC ("No valid chipId found, vendor id(0x%x), device id(0x%x)\n", id->vendor, id->device); } return chipId; }
INT32 hif_sdio_is_chipid_valid(INT32 chipId) { INT32 index = -1; INT32 left = 0; INT32 middle = 0; INT32 right = sizeof(gChipInfoArray) / sizeof(gChipInfoArray[0]) - 1; if ((chipId < gChipInfoArray[left].chipId) || (chipId > gChipInfoArray[right].chipId)) return index; middle = (left + right) / 2; while (left <= right) { if (chipId > gChipInfoArray[middle].chipId) { left = middle + 1; } else if (chipId < gChipInfoArray[middle].chipId) { right = middle - 1; } else { index = middle; break; } middle = (left + right) / 2; } if (0 > index) { HIF_SDIO_ERR_FUNC("no supported chipid found\n"); } else { HIF_SDIO_INFO_FUNC("index:%d, chipId:0x%x\n", index, gChipInfoArray[index].chipId); } return index; }