示例#1
0
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 */
}
示例#4
0
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;
}