mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-23 11:18:54 +00:00
3be4cb0b4a
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>
196 lines
5.7 KiB
C
196 lines
5.7 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_LIST_H
|
|
#define XGE_LIST_H
|
|
|
|
#include <dev/nxge/include/xge-debug.h>
|
|
|
|
__EXTERN_BEGIN_DECLS
|
|
|
|
/**
|
|
* struct xge_list_t - List item.
|
|
* @prev: Previous list item.
|
|
* @next: Next list item.
|
|
*
|
|
* Item of a bi-directional linked list.
|
|
*/
|
|
typedef struct xge_list_t {
|
|
struct xge_list_t* prev;
|
|
struct xge_list_t* next;
|
|
} xge_list_t;
|
|
|
|
/**
|
|
* xge_list_init - Initialize linked list.
|
|
* header: first element of the list (head)
|
|
*
|
|
* Initialize linked list.
|
|
* See also: xge_list_t{}.
|
|
*/
|
|
static inline void xge_list_init (xge_list_t *header)
|
|
{
|
|
header->next = header;
|
|
header->prev = header;
|
|
}
|
|
|
|
/**
|
|
* xge_list_is_empty - Is the list empty?
|
|
* header: first element of the list (head)
|
|
*
|
|
* Determine whether the bi-directional list is empty. Return '1' in
|
|
* case of 'empty'.
|
|
* See also: xge_list_t{}.
|
|
*/
|
|
static inline int xge_list_is_empty(xge_list_t *header)
|
|
{
|
|
xge_assert(header != NULL);
|
|
|
|
return header->next == header;
|
|
}
|
|
|
|
/**
|
|
* xge_list_first_get - Return the first item from the linked list.
|
|
* header: first element of the list (head)
|
|
*
|
|
* Returns the next item from the header.
|
|
* Returns NULL if the next item is header itself
|
|
* See also: xge_list_remove(), xge_list_insert(), xge_list_t{}.
|
|
*/
|
|
static inline xge_list_t *xge_list_first_get(xge_list_t *header)
|
|
{
|
|
xge_assert(header != NULL);
|
|
xge_assert(header->next != NULL);
|
|
xge_assert(header->prev != NULL);
|
|
|
|
if(header->next == header)
|
|
return NULL;
|
|
else
|
|
return header->next;
|
|
}
|
|
|
|
/**
|
|
* xge_list_remove - Remove the specified item from the linked list.
|
|
* item: element of the list
|
|
*
|
|
* Remove item from a list.
|
|
* See also: xge_list_insert(), xge_list_t{}.
|
|
*/
|
|
static inline void xge_list_remove(xge_list_t *item)
|
|
{
|
|
xge_assert(item != NULL);
|
|
xge_assert(item->next != NULL);
|
|
xge_assert(item->prev != NULL);
|
|
|
|
item->next->prev = item->prev;
|
|
item->prev->next = item->next;
|
|
#ifdef XGE_DEBUG_ASSERT
|
|
item->next = item->prev = NULL;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* xge_list_insert - Insert a new item after the specified item.
|
|
* new_item: new element of the list
|
|
* prev_item: element of the list after which the new element is
|
|
* inserted
|
|
*
|
|
* Insert new item (new_item) after given item (prev_item).
|
|
* See also: xge_list_remove(), xge_list_insert_before(), xge_list_t{}.
|
|
*/
|
|
static inline void xge_list_insert (xge_list_t *new_item,
|
|
xge_list_t *prev_item)
|
|
{
|
|
xge_assert(new_item != NULL);
|
|
xge_assert(prev_item != NULL);
|
|
xge_assert(prev_item->next != NULL);
|
|
|
|
new_item->next = prev_item->next;
|
|
new_item->prev = prev_item;
|
|
prev_item->next->prev = new_item;
|
|
prev_item->next = new_item;
|
|
}
|
|
|
|
/**
|
|
* xge_list_insert_before - Insert a new item before the specified item.
|
|
* new_item: new element of the list
|
|
* next_item: element of the list after which the new element is inserted
|
|
*
|
|
* Insert new item (new_item) before given item (next_item).
|
|
*/
|
|
static inline void xge_list_insert_before (xge_list_t *new_item,
|
|
xge_list_t *next_item)
|
|
{
|
|
xge_assert(new_item != NULL);
|
|
xge_assert(next_item != NULL);
|
|
xge_assert(next_item->next != NULL);
|
|
|
|
new_item->next = next_item;
|
|
new_item->prev = next_item->prev;
|
|
next_item->prev->next = new_item;
|
|
next_item->prev = new_item;
|
|
}
|
|
|
|
#define xge_list_for_each(_p, _h) \
|
|
for (_p = (_h)->next, xge_os_prefetch(_p->next); _p != (_h); \
|
|
_p = _p->next, xge_os_prefetch(_p->next))
|
|
|
|
#define xge_list_for_each_safe(_p, _n, _h) \
|
|
for (_p = (_h)->next, _n = _p->next; _p != (_h); \
|
|
_p = _n, _n = _p->next)
|
|
|
|
#ifdef __GNUC__
|
|
/**
|
|
* xge_container_of - Given a member, return the containing structure.
|
|
* @ptr: the pointer to the member.
|
|
* @type: the type of the container struct this is embedded in.
|
|
* @member: the name of the member within the struct.
|
|
*
|
|
* Cast a member of a structure out to the containing structure.
|
|
*/
|
|
#define xge_container_of(ptr, type, member) ({ \
|
|
__typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
|
(type *)(void *)( (char *)__mptr - ((size_t) &((type *)0)->member) );})
|
|
#else
|
|
/* type unsafe version */
|
|
#define xge_container_of(ptr, type, member) \
|
|
((type*)(void*)((char*)(ptr) - ((size_t) &((type *)0)->member)))
|
|
#endif
|
|
|
|
/**
|
|
* xge_offsetof - Offset of the member in the containing structure.
|
|
* @t: struct name.
|
|
* @m: the name of the member within the struct.
|
|
*
|
|
* Return the offset of the member @m in the structure @t.
|
|
*/
|
|
#define xge_offsetof(t, m) ((size_t) (&((t *)0)->m))
|
|
|
|
__EXTERN_END_DECLS
|
|
|
|
#endif /* XGE_LIST_H */
|