static BSP_S32 udiAdpIccInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); return ERROR; } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udiIccAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)BSP_ICC_Close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)BSP_ICC_Write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)BSP_ICC_Read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)BSP_ICC_Ioctl; /* 几个 ICC 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < ICC_CHAN_NUM_MAX; u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), UDI_ICC_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), pDrvInterface); } return OK; }
LOCAL BSP_S32 udiAdpUartInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = malloc(sizeof(UDI_DRV_INTEFACE_TABLE)); /* coverity[dead_error_condition] */ if (NULL == pDrvInterface) { /* coverity[dead_error_condition] */ bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_UDI, "NO Mem, line:%d\n", __LINE__, 0,0,0,0,0);/* [false alarm]:Disable fortify false alarm */ /* coverity[dead_error_condition] */ return ERROR;/* [false alarm]:Disable fortify false alarm */ } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = udiUartAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)ioctl; /* 3个 ACM 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < UDI_GET_UART_NUM(); u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_UART, u32Cnt), UDI_USB_ACM_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_UART, u32Cnt), pDrvInterface); } /* pDrvInterface' (line 287) has not been freed or returned */ return OK;/*lint !e429 */ }
LOCAL BSP_S32 udiAdpIccInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = malloc(sizeof(UDI_DRV_INTEFACE_TABLE)); /* coverity[dead_error_condition] */ if (NULL == pDrvInterface) { /* coverity[dead_error_condition] */ bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_UDI, "NO Mem, line:%d\n", __LINE__, 0,0,0,0,0);/* [false alarm]:Disable fortify false alarm */ /* coverity[dead_error_condition] */ return ERROR;/* [false alarm]:Disable fortify false alarm */ } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udiIccAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)BSP_ICC_Close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)BSP_ICC_Write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)BSP_ICC_Read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)BSP_ICC_Ioctl; /* 几个 ICC 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < ICC_CHAN_NUM_MAX; u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), UDI_ICC_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), pDrvInterface); } /*Custodial pointer 'pDrvInterface' (line 342) has not been freed or returned */ return OK; /*lint !e429 */ }
static BSP_S32 udiAdpNcmInit(VOID) { BSP_U32 i; UDI_DRV_INTEFACE_TABLE* pDrvDataInterface = NULL; UDI_DRV_INTEFACE_TABLE* pDrvCtrlInterface = NULL; #ifdef CONFIG_NCM_MBIM_SUPPORT /* M-PDP */ UDI_DEVICE_ID ExNcmDevIdArray[MAX_EX_NCM_INST_NUM] = { UDI_NCM_NDIS1_ID, UDI_NCM_NDIS2_ID, UDI_NCM_NDIS3_ID, UDI_NCM_NDIS4_ID, UDI_NCM_NDIS5_ID, UDI_NCM_NDIS6_ID, UDI_NCM_NDIS7_ID}; BSP_U32 Index = 0; UDI_DRV_INTEFACE_TABLE *ExNcmDevIntf[MAX_EX_NCM_INST_NUM] = {NULL}; #endif /* 构造回调函数指针列表(数据通道) */ pDrvDataInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvDataInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); goto ADP_NCM_INIT_ERR; } memset((VOID*)pDrvDataInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口(数据通道) */ pDrvDataInterface->udi_open_cb = (UDI_OPEN_CB_T)udiNcmAdpOpen; pDrvDataInterface->udi_close_cb = (UDI_CLOSE_CB_T)udiNcmAdpClose; pDrvDataInterface->udi_write_cb = (UDI_WRITE_CB_T)udiNcmAdpWrite; pDrvDataInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)bsp_ncm_ioctl; /* 设置函数指针(数据通道) */ for(i=0; i<UDI_USB_NCM_BOTTOM/2; i++) { (BSP_VOID)BSP_UDI_SetCapability(UDI_NCM_NDIS_ID, UDI_USB_NCM_NDIS_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable(UDI_NCM_NDIS_ID, pDrvDataInterface); } /* 构造回调函数指针列表(控制通道) */ pDrvCtrlInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvCtrlInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); goto ADP_NCM_INIT_ERR; } memset((VOID*)pDrvCtrlInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 构造回调函数指针列表(控制通道) */ pDrvCtrlInterface->udi_open_cb = (UDI_OPEN_CB_T)udiNcmAdpCtrlOpen; pDrvCtrlInterface->udi_close_cb = (UDI_CLOSE_CB_T)udiNcmAdpCtrlClose; pDrvCtrlInterface->udi_write_cb = (UDI_WRITE_CB_T)udiNcmAdpWrite; pDrvCtrlInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)bsp_ncm_ioctl; /* 设置函数指针(数据通道) */ for(i=0; i<UDI_USB_NCM_BOTTOM/2; i++) { (BSP_VOID)BSP_UDI_SetCapability(UDI_NCM_CTRL_ID, UDI_USB_NCM_CTRL_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable(UDI_NCM_CTRL_ID, pDrvCtrlInterface); } #ifdef CONFIG_NCM_MBIM_SUPPORT /* M-PDP */ for (Index = 0; Index < MAX_EX_NCM_INST_NUM; Index++) { /* 构造回调函数指针列表(数据通道) */ ExNcmDevIntf[Index] = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == ExNcmDevIntf[Index]) { printk(KERN_ERR "WinBlue %s, alloc drv intf %u failed\n", __FUNCTION__, Index); goto ADP_NCM_INIT_ERR; } /* 只设置需要实现的几个接口(数据通道) */ ExNcmDevIntf[Index]->udi_open_cb = (UDI_OPEN_CB_T)udiNcmAdpOpen; ExNcmDevIntf[Index]->udi_close_cb = (UDI_CLOSE_CB_T)udiNcmAdpClose; ExNcmDevIntf[Index]->udi_write_cb = (UDI_WRITE_CB_T)udiNcmAdpWrite; ExNcmDevIntf[Index]->udi_ioctl_cb = (UDI_IOCTL_CB_T)bsp_ncm_ioctl; /* 设置函数指针(数据通道) */ (BSP_VOID)BSP_UDI_SetCapability(ExNcmDevIdArray[Index], UDI_USB_NCM_NDIS_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable(ExNcmDevIdArray[Index], ExNcmDevIntf[Index]); } #endif return OK; ADP_NCM_INIT_ERR: if (NULL != pDrvDataInterface) { /* coverity[dead_error_condition] */ kfree(pDrvDataInterface); } /* coverity[dead_error_condition] */ if (NULL != pDrvCtrlInterface) { /* coverity[dead_error_line] */ kfree(pDrvCtrlInterface); } #ifdef CONFIG_NCM_MBIM_SUPPORT /* M-PDP */ printk(KERN_ERR "WinBlue %s free extra ncm dev info\n", __FUNCTION__); for (Index = 0; Index < MAX_EX_NCM_INST_NUM; Index++) { if (NULL != ExNcmDevIntf[Index]) { kfree(ExNcmDevIntf[Index]); } } #endif return ERROR; }
static BSP_S32 udiAdpNcmInit(VOID) { BSP_U32 i; UDI_DRV_INTEFACE_TABLE* pDrvDataInterface = NULL; UDI_DRV_INTEFACE_TABLE* pDrvCtrlInterface = NULL; /* 构造回调函数指针列表(数据通道) */ pDrvDataInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvDataInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); goto ADP_NCM_INIT_ERR; } memset((VOID*)pDrvDataInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口(数据通道) */ pDrvDataInterface->udi_open_cb = (UDI_OPEN_CB_T)udiNcmAdpOpen; pDrvDataInterface->udi_close_cb = (UDI_CLOSE_CB_T)udiNcmAdpClose; pDrvDataInterface->udi_write_cb = (UDI_WRITE_CB_T)udiNcmAdpWrite; pDrvDataInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)bsp_ncm_ioctl; /* 设置函数指针(数据通道) */ for(i=0; i<UDI_USB_NCM_BOTTOM/2; i++) { (BSP_VOID)BSP_UDI_SetCapability(UDI_NCM_NDIS_ID, UDI_USB_NCM_NDIS_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable(UDI_NCM_NDIS_ID, pDrvDataInterface); } /* 构造回调函数指针列表(控制通道) */ pDrvCtrlInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvCtrlInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); goto ADP_NCM_INIT_ERR; } memset((VOID*)pDrvCtrlInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 构造回调函数指针列表(控制通道) */ pDrvCtrlInterface->udi_open_cb = (UDI_OPEN_CB_T)udiNcmAdpCtrlOpen; pDrvCtrlInterface->udi_close_cb = (UDI_CLOSE_CB_T)udiNcmAdpCtrlClose; pDrvCtrlInterface->udi_write_cb = (UDI_WRITE_CB_T)udiNcmAdpWrite; pDrvCtrlInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)bsp_ncm_ioctl; /* 设置函数指针(数据通道) */ for(i=0; i<UDI_USB_NCM_BOTTOM/2; i++) { (BSP_VOID)BSP_UDI_SetCapability(UDI_NCM_CTRL_ID, UDI_USB_NCM_CTRL_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable(UDI_NCM_CTRL_ID, pDrvCtrlInterface); } return OK; ADP_NCM_INIT_ERR: if (NULL != pDrvDataInterface) { /* coverity[dead_error_condition] */ kfree(pDrvDataInterface); } /* coverity[dead_error_condition] */ if (NULL != pDrvCtrlInterface) { /* coverity[dead_error_line] */ kfree(pDrvCtrlInterface); } return ERROR; }
/***************************************************************************** 函 数 名 : udi_acm_init 功能描述 : acm端口注册到udi适配层初始化函数,用于将acm设备回调挂接到udi上 输入参数 : void 输出参数 : 无 返 回 值 : int 成功返回ADP_OK 失败返回ADP_ERROR 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月12日 作 者 : 夏青 00195127 修改内容 : 新生成函数 *****************************************************************************/ int udi_acm_init(void) { int dev_num; int i; UDI_DRV_INTEFACE_TABLE *pDrvInterface = NULL; struct device_node *np = NULL; int phyaddr_from_app = 1;/*默认使用协议栈传下来的物理地址*/ pDrvInterface = (UDI_DRV_INTEFACE_TABLE *)kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE),GFP_KERNEL); if (NULL == pDrvInterface) { ACM_ADP_ERR("kmalloc failed\n"); return ADP_ERROR; } ACM_ADP_DBG("enter\n"); /* 挂接UDI回调函数 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udi_acm_open; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)udi_acm_close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)udi_acm_write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)udi_acm_read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)udi_acm_ioctl; /* 设置acm设备驱动回调函数,3个acm使用同一套驱动指针 */ for (dev_num = UDI_USB_ACM_CTRL; dev_num < UDI_USB_ACM_MAX; dev_num++){ (void)BSP_UDI_SetCapability((UDI_DEVICE_ID_E)UDI_BUILD_DEV_ID(UDI_DEV_USB_ACM, dev_num), UDI_USB_ACM_CAPA); (void)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID_E)UDI_BUILD_DEV_ID(UDI_DEV_USB_ACM, dev_num), pDrvInterface); } np = of_find_compatible_node(NULL, NULL, "hisilicon,hi6xxx-usb-otg"); if (np) { if (of_property_read_u32(np, "huawei,phyaddr_from_app",&phyaddr_from_app)){ printk(KERN_ERR "%s:huawei,phyaddr_from_app read error\n",__FUNCTION__); } printk(KERN_INFO "%s:huawei,phyaddr_from_app %d\n",__FUNCTION__,phyaddr_from_app); } for (i = 0; i < USB_ACM_COM_UDI_NUM; i++) { g_acm_priv[i].tty_name = acm_dev_name[i]; g_acm_priv[i].bopen = ACM_DEV_CLOSE; g_acm_priv[i].readDoneCB = NULL; g_acm_priv[i].writeDoneCB = NULL; g_acm_priv[i].eventCB = NULL; g_acm_priv[i].freeSendbuff = NULL; g_acm_priv[i].acm_ncpy = NULL; g_acm_priv[i].tty = NULL; g_acm_priv[i].acm_ldisc_ctx = NULL; g_acm_priv[i].do_copy = 0; g_acm_priv[i].cur_evt = ACM_EVT_DEV_SUSPEND; g_acm_priv[i].ncopy = 0; g_acm_priv[i].phyaddr_from_app = 0; INIT_WORK(&g_acm_priv[i].notify_work, acm_event_notify); if (ACM_NEED_NCOPY(g_acm_priv[i].tty_name)) { g_acm_priv[i].ncopy = 1; g_acm_priv[i].phyaddr_from_app = phyaddr_from_app; } } atomic_notifier_chain_register(&android_usb_suspend_notifier_list, &acm_suspend_notifier); atomic_notifier_chain_register(&android_usb_resume_notifier_list, &acm_resume_notifier); BSP_ACM_RegCmdHandle((ACM_HANDLE_COMMAND_CB_T)acm_handle_command); return ADP_OK; }