/*
 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

/*
 *
 * This file schDebug.cc contains some debug functions.
 *
 * Author:      Sandesh Goel
 * Date:        02/25/02
 * History:-
 * Date            Modified by    Modification Information
 * --------------------------------------------------------------------
 *
 */


#include "vos_trace.h"
#include "schDebug.h"
#define LOG_SIZE 256

void schLog(tpAniSirGlobal pMac, tANI_U32 loglevel, const char *pString, ...)
{

       VOS_TRACE_LEVEL  vosDebugLevel;
       char    logBuffer[LOG_SIZE];
       va_list marker;

      /* getting proper Debug level*/
       vosDebugLevel = getVosDebugLevel(loglevel);

      /* extracting arguments from pstring */
       va_start( marker, pString );
       vsnprintf(logBuffer, LOG_SIZE, pString, marker);
       VOS_TRACE(VOS_MODULE_ID_PE, vosDebugLevel, "%s", logBuffer);
       va_end( marker );
 }



// --------------------------------------------------------------------
