df4d502619
changes: 01 - Enhanced LRO: LRO feature is extended to support multi-buffer mode. Previously, Ethernet frames received in contiguous buffers were offloaded. Now, frames received in multiple non-contiguous buffers can be offloaded, as well. The driver now supports LRO for jumbo frames. 02 - Locks Optimization: The driver code was re-organized to limit the use of locks. Moreover, lock contention was reduced by replacing wait locks with try locks. 03 - Code Optimization: The driver code was re-factored to eliminate some memcpy operations. Fast path loops were optimized. 04 - Tag Creations: Physical Buffer Tags are now optimized based upon frame size. For better performance, Physical Memory Maps are now re-used. 05 - Configuration: Features such as TSO, LRO, and Interrupt Mode can be configured either at load or at run time. Rx buffer mode (mode 1 or mode 2) can be configured at load time through kenv. 06 - Driver Statistics: Run time statistics are enhanced to provide better visibility into the driver performance. 07 - Bug Fixes: The driver contains fixes for the problems discovered and reported since last submission. 08 - MSI support: Added Message Signaled Interrupt feature which currently uses 1 message. 09 Removed feature: Rx 3 buffer mode feature has been removed. Driver now supports 1, 2 and 5 buffer modes of which 2 and 5 buffer modes can be used for header separation. 10 Compiler warning: Fixed compiler warning when compiled for 32 bit system. 11 Copyright notice: Source files are updated with the proper copyright notice. MFC after: 3 days Submitted by: Alicia Pena <Alicia dot Pena at neterion dot com>, Muhammad Shafiq <Muhammad dot Shafiq at neterion dot com>
416 lines
13 KiB
C
416 lines
13 KiB
C
/*-
|
|
* Copyright (c) 2002-2007 Neterion, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef XGE_DEBUG_H
|
|
#define XGE_DEBUG_H
|
|
|
|
#include <dev/nxge/include/xge-os-pal.h>
|
|
|
|
__EXTERN_BEGIN_DECLS
|
|
|
|
/*
|
|
* __FUNCTION__ is, together with __PRETTY_FUNCTION__ or something similar,
|
|
* a gcc extension. we'll have to #ifdef around that, and provide some
|
|
* meaningful replacement for those, so to make some gcc versions happier
|
|
*/
|
|
#ifndef __func__
|
|
#ifdef __FUNCTION__
|
|
#define __func__ __FUNCTION__
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef XGE_DEBUG_FP
|
|
#define XGE_DEBUG_FP_DEVICE 0x1
|
|
#define XGE_DEBUG_FP_CHANNEL 0x2
|
|
#define XGE_DEBUG_FP_FIFO 0x4
|
|
#define XGE_DEBUG_FP_RING 0x8
|
|
#define XGE_DEBUG_FP_ALL 0xff
|
|
#endif
|
|
|
|
/**
|
|
* enum xge_debug_level_e
|
|
* @XGE_NONE: debug disabled
|
|
* @XGE_ERR: all errors going to be logged out
|
|
* @XGE_TRACE: all errors plus all kind of verbose tracing print outs
|
|
* going to be logged out. Very noisy.
|
|
*
|
|
* This enumeration going to be used to switch between different
|
|
* debug levels during runtime if DEBUG macro defined during
|
|
* compilation. If DEBUG macro not defined than code will be
|
|
* compiled out.
|
|
*/
|
|
typedef enum xge_debug_level_e {
|
|
XGE_NONE = 0,
|
|
XGE_TRACE = 1,
|
|
XGE_ERR = 2,
|
|
} xge_debug_level_e;
|
|
|
|
#define XGE_DEBUG_MODULE_MASK_DEF 0x30000030
|
|
#define XGE_DEBUG_LEVEL_DEF XGE_ERR
|
|
|
|
#if defined(XGE_DEBUG_TRACE_MASK) || defined(XGE_DEBUG_ERR_MASK)
|
|
|
|
extern unsigned long *g_module_mask;
|
|
extern int *g_level;
|
|
|
|
#ifndef XGE_DEBUG_TRACE_MASK
|
|
#define XGE_DEBUG_TRACE_MASK 0
|
|
#endif
|
|
|
|
#ifndef XGE_DEBUG_ERR_MASK
|
|
#define XGE_DEBUG_ERR_MASK 0
|
|
#endif
|
|
|
|
/*
|
|
* @XGE_COMPONENT_HAL_CONFIG: do debug for xge core config module
|
|
* @XGE_COMPONENT_HAL_FIFO: do debug for xge core fifo module
|
|
* @XGE_COMPONENT_HAL_RING: do debug for xge core ring module
|
|
* @XGE_COMPONENT_HAL_CHANNEL: do debug for xge core channel module
|
|
* @XGE_COMPONENT_HAL_DEVICE: do debug for xge core device module
|
|
* @XGE_COMPONENT_HAL_DMQ: do debug for xge core DMQ module
|
|
* @XGE_COMPONENT_HAL_UMQ: do debug for xge core UMQ module
|
|
* @XGE_COMPONENT_HAL_SQ: do debug for xge core SQ module
|
|
* @XGE_COMPONENT_HAL_SRQ: do debug for xge core SRQ module
|
|
* @XGE_COMPONENT_HAL_CQRQ: do debug for xge core CRQ module
|
|
* @XGE_COMPONENT_HAL_POOL: do debug for xge core memory pool module
|
|
* @XGE_COMPONENT_HAL_BITMAP: do debug for xge core BITMAP module
|
|
* @XGE_COMPONENT_CORE: do debug for xge KMA core module
|
|
* @XGE_COMPONENT_OSDEP: do debug for xge KMA os dependent parts
|
|
* @XGE_COMPONENT_LL: do debug for xge link layer module
|
|
* @XGE_COMPONENT_ALL: activate debug for all modules with no exceptions
|
|
*
|
|
* This enumeration going to be used to distinguish modules
|
|
* or libraries during compilation and runtime. Makefile must declare
|
|
* XGE_DEBUG_MODULE_MASK macro and set it to proper value.
|
|
*/
|
|
#define XGE_COMPONENT_HAL_CONFIG 0x00000001
|
|
#define XGE_COMPONENT_HAL_FIFO 0x00000002
|
|
#define XGE_COMPONENT_HAL_RING 0x00000004
|
|
#define XGE_COMPONENT_HAL_CHANNEL 0x00000008
|
|
#define XGE_COMPONENT_HAL_DEVICE 0x00000010
|
|
#define XGE_COMPONENT_HAL_MM 0x00000020
|
|
#define XGE_COMPONENT_HAL_QUEUE 0x00000040
|
|
#define XGE_COMPONENT_HAL_INTERRUPT 0x00000080
|
|
#define XGE_COMPONENT_HAL_STATS 0x00000100
|
|
|
|
/* space for CORE_XXX */
|
|
#define XGE_COMPONENT_OSDEP 0x10000000
|
|
#define XGE_COMPONENT_LL 0x20000000
|
|
#define XGE_COMPONENT_ALL 0xffffffff
|
|
|
|
#ifndef XGE_DEBUG_MODULE_MASK
|
|
#error "XGE_DEBUG_MODULE_MASK macro must be defined for DEBUG mode..."
|
|
#endif
|
|
|
|
#ifndef __GNUC__
|
|
#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
|
|
#define xge_trace_aux(fmt) xge_os_vatrace(g_xge_os_tracebuf, fmt)
|
|
#else
|
|
#define xge_trace_aux(fmt) xge_os_vaprintf(fmt)
|
|
#endif
|
|
|
|
/**
|
|
* xge_debug
|
|
* @level: level of debug verbosity.
|
|
* @fmt: printf like format string
|
|
*
|
|
* Provides logging facilities. Can be customized on per-module
|
|
* basis or/and with debug levels. Input parameters, except
|
|
* module and level, are the same as posix printf. This function
|
|
* may be compiled out if DEBUG macro was never defined.
|
|
* See also: xge_debug_level_e{}.
|
|
*/
|
|
#define xge_debug(module, level, fmt) { \
|
|
if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \
|
|
(level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \
|
|
level >= *g_level && module & *(unsigned int *)g_module_mask) { \
|
|
xge_trace_aux(fmt); \
|
|
} \
|
|
}
|
|
#else /* __GNUC__ */
|
|
|
|
#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
|
|
#define xge_trace_aux(fmt...) xge_os_trace(g_xge_os_tracebuf, fmt)
|
|
#else
|
|
#define xge_trace_aux(fmt...) xge_os_printf(fmt)
|
|
#endif
|
|
|
|
#define xge_debug(module, level, fmt...) { \
|
|
if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \
|
|
(level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \
|
|
level >= *g_level && module & *(unsigned int *)g_module_mask) { \
|
|
xge_trace_aux(fmt); \
|
|
} \
|
|
}
|
|
#endif /* __GNUC__ */
|
|
|
|
#if (XGE_COMPONENT_HAL_STATS & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_STATS;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_stats(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_STATS, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_stats(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
/* Interrupt Related */
|
|
#if (XGE_COMPONENT_HAL_INTERRUPT & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_INTERRUPT;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_interrupt(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_INTERRUPT, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_interrupt(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_QUEUE & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_QUEUE;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_queue(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_QUEUE, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_queue(xge_debug_level_e level, char *fmt,
|
|
...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_queue(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_MM & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...)
|
|
{
|
|
u32 module = XGE_COMPONENT_HAL_MM;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_mm(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_MM, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...)
|
|
{}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_mm(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_CONFIG & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_CONFIG;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_config(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_CONFIG, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_config(xge_debug_level_e level, char *fmt,
|
|
...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_config(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_FIFO & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_FIFO;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_fifo(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_FIFO, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_fifo(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_RING & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_RING;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_ring(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_RING, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_ring(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_CHANNEL & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_CHANNEL;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_channel(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_CHANNEL, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_channel(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_HAL_DEVICE & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_HAL_DEVICE;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_device(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_HAL_DEVICE, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_device(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_OSDEP & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {
|
|
u32 module = XGE_COMPONENT_OSDEP;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_osdep(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_OSDEP, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_osdep(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#if (XGE_COMPONENT_LL & XGE_DEBUG_MODULE_MASK)
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...)
|
|
{
|
|
u32 module = XGE_COMPONENT_LL;
|
|
xge_debug(module, level, fmt);
|
|
}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_ll(level, fmt...) \
|
|
xge_debug(XGE_COMPONENT_LL, level, fmt)
|
|
#endif /* __GNUC__ */
|
|
#else
|
|
#ifndef __GNUC__
|
|
static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {}
|
|
#else /* __GNUC__ */
|
|
#define xge_debug_ll(level, fmt...)
|
|
#endif /* __GNUC__ */
|
|
#endif
|
|
|
|
#else
|
|
|
|
static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_hal(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {}
|
|
static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {}
|
|
|
|
#endif /* end of XGE_DEBUG_*_MASK */
|
|
|
|
#ifdef XGE_DEBUG_ASSERT
|
|
|
|
/**
|
|
* xge_assert
|
|
* @test: C-condition to check
|
|
* @fmt: printf like format string
|
|
*
|
|
* This function implements traditional assert. By default assertions
|
|
* are enabled. It can be disabled by defining XGE_DEBUG_ASSERT macro in
|
|
* compilation
|
|
* time.
|
|
*/
|
|
#define xge_assert(test) { \
|
|
if (!(test)) xge_os_bug("bad cond: "#test" at %s:%d\n", \
|
|
__FILE__, __LINE__); }
|
|
#else
|
|
#define xge_assert(test)
|
|
#endif /* end of XGE_DEBUG_ASSERT */
|
|
|
|
__EXTERN_END_DECLS
|
|
|
|
#endif /* XGE_DEBUG_H */
|