/****************************************************************************** ** ** FILE NAME : ifx_ppa_api_qos.c ** PROJECT : UEIP ** MODULES : PPA API (Routing/Bridging Acceleration APIs) ** ** DATE : 11 DEC 2009 ** AUTHOR : Shao Guohua ** DESCRIPTION : PPA Protocol Stack QOS API Implementation ** COPYRIGHT : Copyright (c) 2009 ** Lantiq Deutschland GmbH ** Am Campeon 3; 85579 Neubiberg, Germany ** ** For licensing information, see the file 'LICENSE' in the root folder of ** this software module. ** ** HISTORY ** $Date $Author $Comment ** 11 DEC 2009 Shao Guohua Initiate Version *******************************************************************************/ #include //#include //#include //#include //#include //#include //#include //#if defined(CONFIG_IFX_PPA_API_PROC) //#include //#endif //#include //#include //#include //#include //#include /* * PPA Specific Head File */ #include #include #include "ifx_ppa_api_misc.h" #include "ifx_ppa_api_netif.h" #include "ifx_ppa_api_session.h" #include "ifx_ppa_api_qos.h" #ifdef CONFIG_IFX_PPA_QOS int32_t ifx_ppa_get_qos_qnum( uint32_t portid, uint32_t flag) { return ifx_ppa_drv_get_qos_qnum(portid, flag); } int32_t ppa_ioctl_get_qos_qnum(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { int res = IFX_FAILURE; ppa_memset(&cmd_info->qnum_info, 0, sizeof(cmd_info->qnum_info) ); if ( copy_from_user( &cmd_info->qnum_info, (void *)arg, sizeof(cmd_info->qnum_info)) != 0 ) return IFX_FAILURE; cmd_info->qnum_info.queue_num = ifx_ppa_drv_get_qos_qnum(cmd_info->qnum_info.portid, cmd_info->qnum_info.flags); res = IFX_SUCCESS; if ( ppa_copy_to_user( (void *)arg, &cmd_info->qnum_info, sizeof(cmd_info->qnum_info)) != 0 ) return IFX_FAILURE; return res; } int32_t ifx_ppa_get_qos_mib( uint32_t portid, uint32_t queueid, PPA_QOS_MIB *mib, uint32_t flag) { return ifx_ppa_drv_get_qos_mib(portid, queueid, mib, flag); } int32_t ppa_ioctl_get_qos_mib(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { int res = IFX_FAILURE; ppa_memset(&cmd_info->qnum_info, 0, sizeof(cmd_info->qos_mib_info) ); if ( copy_from_user( &cmd_info->qos_mib_info, (void *)arg, sizeof(cmd_info->qos_mib_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_drv_get_qos_mib(cmd_info->qos_mib_info.portid, cmd_info->qos_mib_info.queueid, &cmd_info->qos_mib_info.mib, cmd_info->qos_mib_info.flags); if ( ppa_copy_to_user( (void *)arg, &cmd_info->qos_mib_info, sizeof(cmd_info->qos_mib_info)) != 0 ) return IFX_FAILURE; return res; } #ifdef CONFIG_IFX_PPA_QOS_WFQ int32_t ifx_ppa_set_qos_wfq( uint32_t portid, uint32_t queueid, uint32_t weight_level, uint32_t flag ) { return ifx_ppa_drv_set_qos_wfq( portid, queueid, weight_level, flag); } int32_t ifx_ppa_get_qos_wfq( uint32_t portid, uint32_t queueid, uint32_t *weight_level, uint32_t flag) { return ifx_ppa_drv_get_qos_wfq( portid, queueid, weight_level, flag); } int32_t ifx_ppa_reset_qos_wfq( uint32_t portid, uint32_t queueid, uint32_t flag) { return ifx_ppa_drv_reset_qos_wfq(portid, queueid, flag); } int32_t ifx_ppa_set_ctrl_qos_wfq(uint32_t portid, uint32_t f_enable, uint32_t flag) { int i; int max_queue = ifx_ppa_drv_get_qos_qnum(portid, flag); if( max_queue <= 0 ) return IFX_FAILURE; ifx_ppa_drv_set_ctrl_qos_wfq(portid, f_enable, flag); for( i=0; iqos_ctrl_info, 0, sizeof(cmd_info->qos_ctrl_info) ); if ( ppa_copy_from_user( &cmd_info->qos_ctrl_info, (void *)arg, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_set_ctrl_qos_wfq(cmd_info->qos_ctrl_info.portid, cmd_info->qos_ctrl_info.enable, cmd_info->qos_ctrl_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_set_ctrl_qos_wfq fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_get_ctrl_qos_wfq(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_ctrl_info, 0, sizeof(cmd_info->qos_ctrl_info) ); if ( ppa_copy_from_user( &cmd_info->qos_ctrl_info, (void *)arg, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_get_ctrl_qos_wfq(cmd_info->qos_ctrl_info.portid, &cmd_info->qos_ctrl_info.enable, cmd_info->qos_ctrl_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_get_ctrl_qos_wfq fail"); res = IFX_FAILURE; } if ( ppa_copy_to_user( (void *)arg, &cmd_info->qos_ctrl_info, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; return res; } int32_t ppa_ioctl_set_qos_wfq(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int32_t res; ppa_memset(&cmd_info->qos_wfq_info, 0, sizeof(cmd_info->qos_wfq_info) ); if ( ppa_copy_from_user( &cmd_info->qos_wfq_info, (void *)arg, sizeof(cmd_info->qos_wfq_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_set_qos_wfq(cmd_info->qos_wfq_info.portid, cmd_info->qos_wfq_info.queueid, cmd_info->qos_wfq_info.weight, cmd_info->qos_wfq_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_set_qos_wfq fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_reset_qos_wfq(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_wfq_info, 0, sizeof(cmd_info->qos_wfq_info) ); if ( ppa_copy_from_user( &cmd_info->qos_wfq_info, (void *)arg, sizeof(cmd_info->qos_wfq_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_reset_qos_wfq(cmd_info->qos_wfq_info.portid, cmd_info->qos_wfq_info.queueid, cmd_info->qos_wfq_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_reset_qos_wfq fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_get_qos_wfq(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_wfq_info, 0, sizeof(cmd_info->qos_wfq_info) ); if ( ppa_copy_from_user( &cmd_info->qos_wfq_info, (void *)arg, sizeof(cmd_info->qos_wfq_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_get_qos_wfq(cmd_info->qos_wfq_info.portid, cmd_info->qos_wfq_info.queueid, &cmd_info->qos_wfq_info.weight, cmd_info->qos_wfq_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_get_qos_wfq fail"); res = IFX_FAILURE; } if ( ppa_copy_to_user( (void *)arg, &cmd_info->qos_wfq_info, sizeof(cmd_info->qos_wfq_info)) != 0 ) return IFX_FAILURE; return res; } EXPORT_SYMBOL(ifx_ppa_set_ctrl_qos_wfq); EXPORT_SYMBOL(ifx_ppa_get_ctrl_qos_wfq); EXPORT_SYMBOL(ifx_ppa_set_qos_wfq); EXPORT_SYMBOL(ifx_ppa_get_qos_wfq); EXPORT_SYMBOL(ifx_ppa_reset_qos_wfq); EXPORT_SYMBOL(ppa_ioctl_set_ctrl_qos_wfq); EXPORT_SYMBOL(ppa_ioctl_get_ctrl_qos_wfq); EXPORT_SYMBOL(ppa_ioctl_set_qos_wfq); EXPORT_SYMBOL(ppa_ioctl_reset_qos_wfq); EXPORT_SYMBOL(ppa_ioctl_get_qos_wfq); #endif //end of CONFIG_IFX_PPA_QOS_WFQ #ifdef CONFIG_IFX_PPA_QOS_RATE_SHAPING int32_t ifx_ppa_set_ctrl_qos_rate(uint32_t portid, uint32_t f_enable, uint32_t flag) { uint32_t i; int max_queue = ifx_ppa_drv_get_qos_qnum(portid, flag); if( max_queue <= 0 ) return IFX_FAILURE; ifx_ppa_drv_set_ctrl_qos_rate(portid, f_enable, flag); for( i=0; iqos_ctrl_info, 0, sizeof(cmd_info->qos_ctrl_info) ); if ( ppa_copy_from_user( &cmd_info->qos_ctrl_info, (void *)arg, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_set_ctrl_qos_rate(cmd_info->qos_ctrl_info.portid, cmd_info->qos_ctrl_info.enable, cmd_info->qos_ctrl_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_set_ctrl_qos_rate fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_get_ctrl_qos_rate(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_ctrl_info, 0, sizeof(cmd_info->qos_ctrl_info) ); if ( ppa_copy_from_user( &cmd_info->qos_ctrl_info, (void *)arg, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_get_ctrl_qos_rate(cmd_info->qos_ctrl_info.portid, &cmd_info->qos_ctrl_info.enable, cmd_info->qos_ctrl_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_get_ctrl_qos_rate fail"); res = IFX_FAILURE; } if ( ppa_copy_to_user( (void *)arg, &cmd_info->qos_ctrl_info, sizeof(cmd_info->qos_ctrl_info)) != 0 ) return IFX_FAILURE; return res; } int32_t ppa_ioctl_set_qos_rate(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int32_t res; ppa_memset(&cmd_info->qos_rate_info, 0, sizeof(cmd_info->qos_rate_info) ); if ( ppa_copy_from_user( &cmd_info->qos_rate_info, (void *)arg, sizeof(cmd_info->qos_rate_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_set_qos_rate(cmd_info->qos_rate_info.portid, cmd_info->qos_rate_info.queueid, cmd_info->qos_rate_info.rate, cmd_info->qos_rate_info.burst, cmd_info->qos_rate_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_set_qos_rate fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_reset_qos_rate(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_rate_info, 0, sizeof(cmd_info->qos_rate_info) ); if ( ppa_copy_from_user( &cmd_info->qos_rate_info, (void *)arg, sizeof(cmd_info->qos_rate_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_reset_qos_rate(cmd_info->qos_rate_info.portid, cmd_info->qos_rate_info.queueid, cmd_info->qos_rate_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ifx_ppa_reset_rate fail"); res = IFX_FAILURE; } return res; } int32_t ppa_ioctl_get_qos_rate(unsigned int cmd, unsigned long arg, PPA_CMD_DATA * cmd_info) { /*note, arg is a pointer from ioctl, not normally pointer */ int res = IFX_FAILURE; ppa_memset(&cmd_info->qos_rate_info, 0, sizeof(cmd_info->qos_rate_info) ); if ( ppa_copy_from_user( &cmd_info->qos_rate_info, (void *)arg, sizeof(cmd_info->qos_rate_info)) != 0 ) return IFX_FAILURE; res = ifx_ppa_get_qos_rate(cmd_info->qos_rate_info.portid, cmd_info->qos_rate_info.queueid, &cmd_info->qos_rate_info.rate, &cmd_info->qos_rate_info.burst, cmd_info->qos_rate_info.flags); if ( res != IFX_SUCCESS ) { ppa_debug(DBG_ENABLE_MASK_QOS, "ppa_ioctl_get_qos_rate fail"); res = IFX_FAILURE; } if ( ppa_copy_to_user( (void *)arg, &cmd_info->qos_rate_info, sizeof(cmd_info->qos_rate_info)) != 0 ) return IFX_FAILURE; return res; } EXPORT_SYMBOL(ifx_ppa_set_ctrl_qos_rate); EXPORT_SYMBOL(ifx_ppa_get_ctrl_qos_rate); EXPORT_SYMBOL(ifx_ppa_set_qos_rate); EXPORT_SYMBOL(ifx_ppa_get_qos_rate); EXPORT_SYMBOL(ifx_ppa_reset_qos_rate); EXPORT_SYMBOL(ppa_ioctl_set_ctrl_qos_rate); EXPORT_SYMBOL(ppa_ioctl_get_ctrl_qos_rate); EXPORT_SYMBOL(ppa_ioctl_set_qos_rate); EXPORT_SYMBOL(ppa_ioctl_reset_qos_rate); EXPORT_SYMBOL(ppa_ioctl_get_qos_rate); #endif //end of CONFIG_IFX_PPA_QOS_RATE_SHAPING EXPORT_SYMBOL(ifx_ppa_get_qos_qnum); EXPORT_SYMBOL(ppa_ioctl_get_qos_qnum); EXPORT_SYMBOL(ifx_ppa_get_qos_mib); EXPORT_SYMBOL(ppa_ioctl_get_qos_mib); #endif //end of CONFIG_IFX_PPA_QOS