lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20080217023231.a9af2f21@mailhost.serverengines.com>
Date:	Sat, 16 Feb 2008 18:32:31 -0800
From:	"Subbu Seetharaman" <subbus@...verengines.com>
To:	netdev@...r.kernel.org
Subject: [PATHCH 5/16]  ServerEngines 10Gb NIC driver

beclib header and functions.

----------------
diff -uprN orig/linux-2.6.24.2/drivers/message/beclib/beclib_ll_bmap_nic.h benet/linux-2.6.24.2/drivers/message/beclib/beclib_ll_bmap_nic.h
--- orig/linux-2.6.24.2/drivers/message/beclib/beclib_ll_bmap_nic.h	1970-01-01 05:30:00.000000000 +0530
+++ benet/linux-2.6.24.2/drivers/message/beclib/beclib_ll_bmap_nic.h	2008-02-14 15:23:07.802206648 +0530
@@ -0,0 +1,1720 @@
+/*
+ * Copyright (C) 2005 - 2008 ServerEngines
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or at your option any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor
+ * Boston, MA 02110-1301 USA
+ *
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called GPL.
+ *
+ * Contact Information:
+ * linux-drivers@...verengines.com
+ *
+ * ServerEngines
+ * 209 N. Fair Oaks Ave
+ * Sunnyvale, CA 94085
+ *
+ */
+/*
+ * Autogenerated by srcgen version: 0127
+ */
+#ifndef __beclib_ll_bmap_h__
+#define __beclib_ll_bmap_h__
+#include "setypes.h"
+
+#undef SG_PACK
+#if defined(SG_PRAGMA_PACK)
+#pragma pack(push, 1)
+#define SG_PACK
+#elif defined(SG_ATTRIBUTE_PACK)
+#define SG_PACK __attribute__ ((packed))
+#else
+#define SG_PACK
+#endif
+
+#ifndef SG_C_ASSERT
+#define SG_C_ASSERT(_name_, _condition_)
+#endif
+
+/*
+ *-----------------------------------------------------
+ * Function: be_initialize_library
+ *   Call to initialize the static library. This initializes the debug traces.
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *-----------------------------------------------------
+ */
+BESTATUS be_initialize_library(void
+    );
+
+/*
+ *---------------------------------------------------
+ * Function: be_function_and_chip_create
+ *   Create both function and chip object with one call.
+ *   The lower level API will rarely *   use more than one function object.
+ * sa_dev          - Previously created device.
+ * function_type   -
+ * mailbox_sgl     - SGL with length equal to sizeof(MCC_MAILBOX). This must be
+ *                   physically contiguous. The starting address must be
+ *                   aligned to 16 byte boundary.
+ * emulation_sgl   - SGL with length equal to one page . Must be physically
+ *                   contiguous. Starting address must be 16 byte aligned.
+ * function_object - On input, a pointer to an allocated function object. On
+ *                   output, it is initialized. This is an opaque object.
+ *                   Do not access the members.
+ * chip            - On input this is a pointer to an allocated chip object.
+ * 		     On output, it is initialized. This is an opaque object.
+ * 		     Do not access the members.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------
+ */
+BESTATUS
+be_function_and_chip_create(IN SA_DEV *sa_dev,
+			    IN u32 function_type,
+			    IN PSA_SGL mailbox_sgl,
+			    IN PSA_SGL emulation_sgl,
+			    OUT PBE_FUNCTION_OBJECT function_object,
+			    OUT PBE_CHIP_OBJECT chip);
+
+/*
+ *---------------------------------------------------
+ * Function: be_function_object_create
+ *   Create function object .
+ * sa_dev          - Previously created device.
+ * function_type   -
+ * mailbox_sgl     - SGL with length equal to sizeof(MCC_MAILBOX).
+ * 		     This must be physically contiguous. The starting
+ * 		     address must be aligned to 16 byte boundary.
+ * function_object - On input this is a pointer to an allocated function
+ * 		     object. On output, it is initialized. This is an
+ * 		     opaque object. Do not access the members.
+ * chip            - On input this is a pointer to an allocated chip object.
+ * 		     On output, it is initialized. This is an opaque object.
+ * 		     Do not access the members.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *----------------------------------------------------
+ */
+BESTATUS
+be_function_object_create(IN SA_DEV *sa_dev,
+			  IN u32 function_type,
+			  IN PSA_SGL mailbox_sgl,
+			  OUT PBE_FUNCTION_OBJECT function_object,
+			  OUT PBE_CHIP_OBJECT chip);
+
+/*
+ *-----------------------------------------------
+ * Function: be_chip_object_create
+ *   Create chip object .
+ * chip          - On input this is a pointer to an allocated chip object.
+ * 		   On output, it is initialized. This is an opaque object.
+ * 		   Do not access the members.
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_chip_object_create(OUT PBE_CHIP_OBJECT chip);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_and_chip_destroy
+ *   This destroys the function and chip object created by the
+ *   be_function_and_chip_create function. It assumes that all
+ *   sub-objects created for this function have already been
+ *   destroyed -- it asserts if this is not true. This function is called by
+ *   be_function_cleanup -- Use be_function_cleanup to automatically cleanup all
+ *   sub-objects.
+ * function_object - Previously created function object.
+ * chip            - Previously created chip object.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_and_chip_destroy(IN PBE_FUNCTION_OBJECT function_object,
+			     IN PBE_CHIP_OBJECT chip);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_object_destroy
+ *   This destroys the function object created by the
+ *   be_function_object_create function.  It assumes that all
+ *   sub-objects created for this function have already been destroyed
+ *   -- it asserts if this is not true. This function is called by
+ *   be_function_cleanup --
+ *   Use be_function_cleanup to automatically cleanup all sub-objects.
+ * function_object - Previously created function object.
+ * chip            - Previously created chip object.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_object_destroy(IN PBE_FUNCTION_OBJECT function_object,
+			   IN PBE_CHIP_OBJECT chip);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_chip_object_destroy
+ *   This destroys the chip object created by the
+ *   be_chip_object_create function. It assumes that all sub-objects
+ *   created for this chip have already been destroyed -- it
+ *   asserts if this is not true. This function is called by
+ *   be_function_cleanup -- Use be_function_cleanup to automatically
+ *   cleanup all sub-objects.
+ * chip          - Previously created chip object.
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_chip_object_destroy(IN PBE_CHIP_OBJECT chip);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_cleanup
+ *   This function destroys all objects that reference the function
+ *   object including the all queues  (mcc, etx, erx, iscsi/wrbq/defq, eq)  -
+ *   iscsi ooo buffers  - software jell buffers (during emulation)  -
+ *   template header buffers (if host based)  - WDMA
+ *   zero buffer (during emulation)  - vlan tags  - multicast addresses  - rss
+ *   configuration  - wake on lan entries (ACPI)  - chip object  -
+ *   function_object  All objects are destroyed with synchronous ioctls
+ *   that poll for their completions. This
+ *   function is optional, all objects can be explicitly cleaned up.
+ * function_object - Previously created function object
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_function_cleanup(PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_get_function_number
+ *   Returns the PCI function number.
+ * function_object        - Previously created function object
+ * return function_number -
+ *---------------------------------------------------------------
+ */
+u32
+be_function_get_function_number(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_get_function_type
+ *   Returns the function type.
+ * function_object      -
+ * return function_type -
+ *---------------------------------------------------------------
+ */
+u32 be_function_get_function_type(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_is_iscsi
+ *   Returns TRUE for the ISCSI function.
+ * function_object -
+ * return is_iscsi -
+ *---------------------------------------------------------------
+ */
+STATIC INLINE boolean
+be_function_is_iscsi(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_is_networking
+ *   Returns TRUE for the networking function.
+ * function_object      -
+ * return is_networking -
+ *---------------------------------------------------------------
+ */
+STATIC INLINE boolean
+be_function_is_networking(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_copy_stats
+ *   Copies the function object stats into the memory supplied by the caller.
+ * function_object    - The previously created function object.
+ * stats              - Pointer to a stat struct. The stats are copied.
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+STATIC INLINE void
+be_function_copy_stats(IN PBE_FUNCTION_OBJECT function_object,
+		       OUT PBECLIB_FUNCTION_STATS stats);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_iscsi_ooo_buffers_post
+ *   Posts out-of-order buffers to BladeEngine.
+ * function_object -
+ * page_count      -
+ * sgl             -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_iscsi_ooo_buffers_post(IN PBE_FUNCTION_OBJECT function_object,
+				   IN u32 page_count, IN PSA_SGL sgl);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_iscsi_ooo_buffers_remove
+ *   Removes the out-of-order buffers from the chip. The caller may
+ *   free the memory when this function completes. All iSCSI connections
+ *   must be closed first. This function is called as part of
+ *   be_function_cleanup.
+ * function_object -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_iscsi_ooo_buffers_remove(IN PBE_FUNCTION_OBJECT
+				     function_object);
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_nop
+ *   Issues a NOP command to the MCC ring. The command is completed with
+ *   a successful status. This can be used to pend operations until
+ *   a short time in the future, since the callback function will
+ *   be invoked upon command completion. The returned status
+ *   will be BE_PENDING if the command was issued successfully.
+ * function_object    -
+ * callback           - Callback function invoked when the NOP completes.
+ * callback_context   - Passed to the callback function.
+ * queue_context      - Optional. Pointer to a previously allocated struct.
+ * 			If the MCC WRB ring is full, this structure is
+ * 			used to queue the operation. It will be posted
+ * 			to the MCC ring when space becomes available. All
+ *                      queued commands will be posted to the ring in
+ *                      the order they are received. It is always valid
+ *                      to pass a pointer to a generic BE_GENERIC_QUEUE_CONTEXT.
+ *                      However, the specific context structs are
+ *                      generally smaller than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success. BE_PENDING
+ * 			(postive value) if the IOCTL completion is
+ * 			pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_nop(IN PBE_FUNCTION_OBJECT function_object,
+		IN MCC_WRB_CQE_CALLBACK callback,
+		IN PVOID callback_context,
+		IN PBE_NOP_QUEUE_CONTEXT queue_context);
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_get_fw_version
+ *   Retrieves the firmware version on the adpater. If the callback
+ *   is NULL this call executes synchronously. If the callback is
+ *   not NULL, the returned status will be BE_PENDING if the
+ *   command was issued successfully.
+ * function_object    -
+ * fw_version         - Pointer to response buffer if callback is NULL.
+ * callback           - Callback function invoked when the IOCTL completes.
+ * callback_context   - Passed to the callback function.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_get_fw_version(IN PBE_FUNCTION_OBJECT function_object,
+			   OUT IOCTL_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD
+			   * fw_version, IN MCC_WRB_CQE_CALLBACK callback,
+			   IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_manage_FAT_log
+ *   This routine can be used to manage the BladeEngine Fault Analysis
+ *   Tool (FAT) log.  This includes querying the FAT log size,
+ *   retrieving the FAT log, and clearing the FAT log. The log data
+ *   can be anaylzed by BladeEngine support tools to diagnose faults.
+ *   Only host domains (domain 0) may issue this request.
+ * function_object   -
+ * sgl               - SGL representing the FAT log buffer landing space.
+ * 			The SGL should be page aligned. It does not
+ * 			require a virtual address.
+ * num_pages         - The number of pages in the SGL. A value of zero (0)
+ * 			implies no FAT log data transfer will take place.
+ * 			The num_pages is limited to 27 pages.
+ * page_offset       - The page_offset specifies the starting page
+ * 			offset when retrieving the FAT log. For example,
+ * 			a value of 0 requests data starting at byte
+ * 			offset 0 of the FAT log. Likewise, a value
+ * 			of 5 requests data starting at byte offset 20480 of
+ * 			the FAT log. A caller may choose to issue multiple
+ * 			queries when the FAT log buffer size is larger
+ *                     than the number of pages specified.
+ * clear_log         - Set to clear the log.
+ * log_size          - The size of the BladeEngine FAT log in bytes.
+ * bytes_transferred - The number of FAT log data bytes transferred.
+ * return status     - BE_SUCCESS (0) on success. Negative error code
+ * 			on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_manage_FAT_log(IN PBE_FUNCTION_OBJECT function_object,
+			   IN PSA_SGL sgl,
+			   IN u32 num_pages,
+			   IN u32 page_offset,
+			   IN boolean clear_log,
+			   OUT u32 *log_size,
+			   OUT u32 *bytes_transferred);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_query_firmware_config
+ *   Queries the firmware configuration currently loaded. This
+ *   configuration includes information regarding the EP processor
+ *   configuration for various Upper Layer Protocols.
+ * function_object -
+ * config          - The configuration parameters currently loaded by firmware.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_query_firmware_config(IN PBE_FUNCTION_OBJECT function_object,
+				  OUT BE_FIRMWARE_CONFIG *config);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_config_red
+ *   This function configures global and/or ULP specific Random Early Drop (RED)
+ *   functionality.
+ * function_object    -
+ * parameters         - The RED parameters. Only parameters for the
+ * 			chutes owned by the
+ *                      current PCI function are applied.
+ * callback           - Optional callback function.
+ * callback_context   - Optional context for callback function.
+ * queue_context      - Optional context for queueing the IOCTL.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_config_red(IN PBE_FUNCTION_OBJECT function_object,
+		       IN PBE_RED_PARAMETERS parameters,
+		       IN MCC_WRB_CQE_CALLBACK callback,
+		       IN PVOID callback_context,
+		       IN PBE_CONFIG_RED_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_config_port_equalization
+ *   This function configures or returns the XAUI port equalization
+ *   parameters of BladeEngine.
+ * function_object    -
+ * parameters         - XAUI port equalization parameters.
+ * write              - Set (1) to write the parameters, otherwise
+ * 			clear (0) to read the
+ *                      parameters.
+ * callback           - Optional callback function.
+ * callback_context   - Optional context for callback function.
+ * queue_context      - Optional context for queueing the IOCTL.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_config_port_equalization(IN PBE_FUNCTION_OBJECT
+				     function_object,
+				     IN OUT
+				     PIOCTL_COMMON_PORT_EQUALIZATION_PARAMS
+				     parameters, IN boolean write,
+				     IN MCC_WRB_CQE_CALLBACK callback,
+				     IN PVOID callback_context,
+				     IN
+				     PBE_CONFIG_PORT_EQUALIXATION_QUEUE_CONTEXT
+				     queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_passthru_ioctl
+ *   This routine issues an embedded IOCTL in pass-through mode.
+ * function_object  -
+ * payload          - The embedded payload for the MCC_WRB structure.
+ * 			The input buffer is
+ *                    overwritten with response data.
+ * callback         - Callback function invoked when the IOCTL completes.
+ * callback_context - Callback context passed to the callback function.
+ * return status    - BE_SUCCESS (0) on success. Negative error code on
+ * 			failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_passthru_ioctl(IN PBE_FUNCTION_OBJECT function_object,
+			   IN OUT MCC_WRB_PAYLOAD *payload,
+			   IN MCC_WRB_CQE_CALLBACK callback,
+			   IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_modify_delay
+ *   Changes the EQ delay for a group of EQs.
+ * function_object    -
+ * num_eq             - The number of EQs in the eq_array to adjust.
+ * 			This also is the number of delay values in the
+ * 			eq_delay_array.
+ * eq_array           - Array of BE_EQ_OBJECT pointers to adjust.
+ * eq_delay_array     - Array of "num_eq" timer delays in units of
+ * 			microseconds. The be_eq_query_delay_range ioctl
+ * 			returns the resolution and range of legal EQ delays.
+ * callback           -
+ * callback_context   -
+ * queue_context      - Optional. Pointer to a previously allocated struct.
+ * 			If the MCC WRB ring is full, this structure is
+ * 			used to queue the operation. It will be posted to
+ * 			the MCC ring when space becomes available. All
+ *                      queued commands will be posted to the ring
+ *                      in the order they are received. It is always
+ *                      valid to pass a pointer to a generic
+ *                      BE_GENERIC_QUEUE_CONTEXT. However, the
+ *                      specific context structs
+ *                      are generally smaller than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eq_modify_delay(IN PBE_FUNCTION_OBJECT function_object,
+		   IN u32 num_eq,
+		   IN BE_EQ_OBJECT **eq_array,
+		   IN u32 *eq_delay_array,
+		   IN MCC_WRB_CQE_CALLBACK callback,
+		   IN PVOID callback_context,
+		   IN PBE_EQ_MODIFY_DELAY_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_query_delay_range
+ *   Queries the resolution and range allowed for EQ delay. This is
+ *   a constant set by the firmware, so it may be queried one time
+ *   at system boot. It is the same for all EQs.  This is a synchronous IOCTL.
+ * function_object     -
+ * eq_delay_resolution - Resolution of EQ delay in microseconds.
+ * eq_delay_max        - Max value of EQ delay in microseconds.
+ * return status       - BE_SUCCESS (0) on success. Negative error code
+ * 			on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eq_query_delay_range(IN PBE_FUNCTION_OBJECT function_object,
+			OUT u32 *eq_delay_resolution,
+			OUT u32 *eq_delay_max);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_create
+ *   Creates an eq_object. This is a synchronous IOCTL.
+ * function_object -
+ * sgl             - No virtual address required.
+ * eqe_size        - EQ entry size in bytes. Either 4 or 16.
+ * num_entries     - Power of 2, fom 256 to 4k.
+ * watermark       - Eventable CQs only. CEV_WMARK_* or ~0UL for no watermark.
+ * timer_delay     - Interrupt timer delay. ~0UL disables timer. Otherwise,
+ * 			it is eq_delay_resolution units up to eq_delay_max
+ * 			decimal. The resolution and max are queried from
+ * 			be_eq_query_delay_range. e.g. If an 16 us delay
+ * 			is required, timer_delay should be
+ * 			8us/eq_delay_resolution.
+ * eq_object       - Created EQ object.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eq_create(IN PBE_FUNCTION_OBJECT function_object,
+	     IN PSA_SGL sgl,
+	     IN u32 eqe_size,
+	     IN u32 num_entries,
+	     IN u32 watermark,
+	     IN u32 timer_delay, OUT BE_EQ_OBJECT *eq_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_fake_create
+ *   Creates an eq_object that does not have an associated memory
+ *   ring. The object is used to generate an interrupt from software.
+ *   The EQ will interrupt the host every time the EQ is rearmed,
+ *   after the EQ delay expires. The EQ should always be rearmed with a
+ *   num_popped count of 0 in the doorbell register.
+ *   The be_function_enable_interrupts function will cause an
+ *   immediate interrupt from this EQ. This is a synchronous IOCTL.
+ * function_object -
+ * timer_delay     - Interrupt timer delay. ~0UL disables timer.
+ * 			Otherwise, it is eq_delay_resolution units up to
+ * 			eq_delay_max decimal. The resolution and max are
+ * 			queried from be_eq_query_delay_range. e.g. If an
+ * 			16 us delay is required, timer_delay should be
+ * 			16 us/eq_delay_resolution.
+ * eq_object       - Created EQ object.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eq_fake_create(IN PBE_FUNCTION_OBJECT function_object,
+		  IN u32 timer_delay, OUT BE_EQ_OBJECT *eq_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_destroy
+ *   Destroys an eq_object. This function is called as part of
+ *   be_function_cleanup.
+ * eq            -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_eq_destroy(IN BE_EQ_OBJECT *eq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eq_get_id
+ *   Return the allocated ID that must be used to ring the doorbell for the EQ.
+ *---------------------------------------------------------------
+ */
+u32 be_eq_get_id(IN BE_EQ_OBJECT *eq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_cq_create
+ *   Creates a CQ. This uses a synchronous IOCTL.
+ * function_object     -
+ * sgl                 - No virtual address required, except for MCC CQ.
+ * length              - Length is bytes of queue. Number of entries is
+ * 			power of 2, from 256 to 1k.  solicited_eventable -
+ * 			If TRUE, only CQEs with solicited event bit cause
+ * 			eqe write.
+ * no_delay            - If eventable, TRUE means force interrupt
+ * 			immediately (ignore watermark & timer).
+ * wm_thresh           - If eventable, watermark encodings CEV_WMARK_* or
+ * 			~0UL for no watermark.
+ * eq_object           - Optional, if set this is an eventable CQ.
+ * cq_object           - Created CQ object.
+ * return status       - BE_SUCCESS (0) on success.
+ * 			Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_cq_create(IN PBE_FUNCTION_OBJECT function_object,
+	     IN PSA_SGL sgl,
+	     IN u32 length,
+	     IN boolean solicited_eventable,
+	     IN boolean no_delay,
+	     IN u32 wm_thresh,
+	     IN PBE_EQ_OBJECT eq_object, OUT PBE_CQ_OBJECT cq_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_cq_destroy
+ *   Destroys a CQ. All clients that reference this CQ must
+ *   be destroyed first. This function is called as part of
+ *   be_function_cleanup.
+ * cq            -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_cq_destroy(IN BE_CQ_OBJECT *cq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_cq_get_id
+ *   Returns the allocated CQ id used for ringing the doorbell.
+ * cq        -
+ * return id -
+ *---------------------------------------------------------------
+ */
+u32 be_cq_get_id(IN BE_CQ_OBJECT *cq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_mcc_ring_create
+ *   This creates a MCC ring and switches from mailbox mode to ring mode.
+ *   The number of outstanding MCC commands is the minimum of the
+ *   number of entries in the ring and the number of context structures
+ *   (i.e. num_context_entries). BECLIB uses the context entries to
+ *   track outstanding MCC WRBs since they may complete out-of-order. You may
+ *   provide zero context entries, which will limit BECLIB to one
+ *   MCC WRB at a time.
+ * function_object     -
+ * sgl                 - A virtual address is required.
+ * length              - length in bytes
+ * context_array       - Array of context structs. Each outstanding MCC WRB
+ * 			 requires a context entry. BECLIB has 1 by
+ * 			 default. The context array allows you to post
+ * 			 more -- this must be non-pageable memory, but it is
+ *                       not used for DMA. Most likely the number of
+ *                       context structs will match the size of the
+ *                       MCC ring. Since commands complete out-of-order,
+ *                       this lets beclib fully utilize the ring. However,
+ *                       the size may be either lower or higher than
+ *                       the ring size.  num_context_entries - number of
+ *                       context structs
+ * cq                  - Associated completion queue created with an SGL
+ * 			 with a mapped virtual address
+ * mcc                 - On input this is a pointer to an allocated
+ * 			 MCC_OBJECT On ouput this is a created MCC object.
+ * 			 This is an opaque object. Do not reference any
+ * 			 members.
+ * return status       - BE_SUCCESS (0) on success.
+ * 			 Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_mcc_ring_create(IN PBE_FUNCTION_OBJECT function_object,
+		   IN PSA_SGL sgl,
+		   IN u32 length,
+		   IN PBE_MCC_WRB_CONTEXT context_array,
+		   IN u32 num_context_entries,
+		   IN PBE_CQ_OBJECT cq, OUT PBE_MCC_OBJECT mcc);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_mcc_ring_destroy
+ *   Cleans up MCC ring and switches to mailbox mode. This function is
+ *   called as part of be_function_cleanup.
+ * mcc_object    -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_mcc_ring_destroy(IN PBE_MCC_OBJECT mcc_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_mcc_process_cq
+ *   Processes mcc completions. This should be called from
+ *   the interrupt or DPC to process the MCC cq, when a corresponding
+ *   event queue entry is received. It can also be called to
+ *   poll the CQ from a timer routine for non-eventable completions.
+ *   Keep in mind, only one thread can be inside beclib at any
+ *   given time. That means this function must be
+ *   serialized with the posting of MCC WRBs.
+ * mcc_object    -
+ * rearm         - rearm should be TRUE only if called due to EQE
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_mcc_process_cq(IN BE_MCC_OBJECT *mcc_object, IN boolean rearm);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_mcc_add_async_event_callback
+ * mcc_object       -
+ * callback         - Function callback invoked when an asynchronous event
+ * 			is received on the MCC cq. It follows the prototype:
+ *  typedef void (BECALL *MCC_ASYNC_EVENT_CALLBACK) (PVOID context,
+ *  				u32 event_code, PVOID event);
+ *
+ *  			The context parameter is a copy of the
+ *  			callback_context pointer provided to this function.
+ *  			The event_code is the code from the common
+ *  			portion of the event entry. The event
+ *  			parameter is a pointer to the 16 byte async
+ *  			event message.
+ * callback_context - Passed to the callback function.
+ * return status    - BE_SUCCESS (0) on success. Negative error code on
+ * 			failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_mcc_add_async_event_callback(IN BE_MCC_OBJECT *mcc_object,
+				IN MCC_ASYNC_EVENT_CALLBACK callback,
+				IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_pci_soft_reset
+ *   This function is called to issue a BladeEngine soft reset. Callers
+ *   should acquire the soft reset semaphore before calling this function.
+ *   Additionaly, callers should ensure they cannot be pre-empted while
+ *   the routine executes. Upon completion of this routine, callers
+ *   should release the reset semaphore. This routine implicitly waits
+ *   for BladeEngine POST to complete.
+ * function_object -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_pci_soft_reset(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_acquire_reset_semaphore
+ *   Acquires the reset semaphore. If success is returned, the caller owns
+ *   the reset semaphore. Otherwise the caller does not own the
+ *   reset semaphore. Callers must acquire the reset semaphore before
+ *   inducing a BladeEngine runtime reset. Callers must also
+ *   release the reset semaphore once they are done with a soft reset.
+ *   Release of the reset semaphore is accomplished with
+ *   be_release_reset_semaphore.
+ * function_object -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_acquire_reset_semaphore(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_release_reset_semaphore
+ *   Releases the reset semaphore. Callers must release the reset
+ *   semaphore once they are done with a soft reset.
+ * function_object    -
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+void be_release_reset_semaphore(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_drive_POST
+ *   This function is called to drive BladeEngine POST. The
+ *   caller should ensure they cannot be pre-empted while this routine
+ *   executes.
+ * function_object -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_drive_POST(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_defq_create
+ *   Creates a default PDU ring for the current protection domain. Each queue
+ *   contains 8 byte physical addresses to default PDU buffers.
+ * function_object       -
+ * sgl                   - no virtual address required
+ * length                - bytes in total ring
+ * default_buffer_length - bytes in each buffer posted to ring
+ * cq_object             - cq that will receive completions
+ * defq                  -
+ * return status         - BE_SUCCESS (0) on success. Negative
+ * 				error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_iscsi_defq_create(IN PBE_FUNCTION_OBJECT function_object,
+		     IN PSA_SGL sgl,
+		     IN u32 length,
+		     IN u32 default_buffer_length,
+		     IN PBE_CQ_OBJECT cq_object,
+		     OUT PBE_DEFAULT_PDU_QUEUE_OBJECT defq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_defq_destroy
+ *   Destroys the default queue. All connections for the PD should
+ *   be torn down first.  This function is called as part of
+ *   be_function_cleanup.
+ * defq          -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_iscsi_defq_destroy(PBE_DEFAULT_PDU_QUEUE_OBJECT defq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_defq_get_id
+ *   Gets the allocated ID for this queue. The id is used to
+ *   ring the doorbell to post buffers to the default queue.
+ * defq      -
+ * return id -
+ *---------------------------------------------------------------
+ */
+u32 be_iscsi_defq_get_id(IN PBE_DEFAULT_PDU_QUEUE_OBJECT defq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_wrb_queue_create
+ *   Creates a WRB ring. Use the "get_cid" function to query
+ *   the corresponding cid for the ring.
+ * function_object -
+ * sgl             -
+ * num_entries     - max = 32k / sizeof(ISCSI_INITIATOR_WRB)
+ * wrbq            -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_iscsi_wrb_queue_create(PBE_FUNCTION_OBJECT function_object,
+			  PSA_SGL sgl,
+			  u32 num_entries,
+			  PBE_ISCSI_WRB_QUEUE_OBJECT wrbq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_wrb_queue_destroy
+ *   Destroys the wrb ring. Make sure the connection is torn down
+ *   before destroying the ring. This function is called as part
+ *   of be_function_cleanup.
+ * wrbq          -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_iscsi_wrb_queue_destroy(IN PBE_ISCSI_WRB_QUEUE_OBJECT wrbq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_wrbq_get_cid
+ *   Queries the allocated cid for the wrbq.
+ * wrbq       -
+ * return cid -
+ *---------------------------------------------------------------
+ */
+u32 be_iscsi_wrbq_get_cid(IN PBE_ISCSI_WRB_QUEUE_OBJECT wrbq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_post_sgl_pages
+ *   Posts memory for iSCSI SGLs to the chip for the given
+ *   protection domain. The memory may be posted with multiple calls
+ *   to this function by incrementing the page_offset.  The SGL
+ *   does not require a valid virtual address. The SGL should be page aligned.
+ *   This must be done before any connections are offloaded.
+ *   1 page table must be posted to the chip per 2MB of frags.
+ * function_object -
+ * sgl             - memory is posted starting with page 0 in this sgl
+ * page_offset     - offset on the chip where the pages are mapped
+ * num_pages       - number of pages to post from the current sgl
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_iscsi_post_sgl_pages(IN PBE_FUNCTION_OBJECT function_object,
+			IN PSA_SGL sgl,
+			IN u32 page_offset, IN u32 num_pages);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_iscsi_remove_sgl_pages
+ *   Removes all the sgl memory for the given protection domain. This
+ *   function is called as part of be_function_cleanup.
+ * function_object -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_iscsi_remove_sgl_pages(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_sq_create
+ *   Creates an ethernet send ring.
+ * function_object -
+ * sgl             - no virtual address required
+ * length_in_bytes -
+ * type            - The type of ring to create.
+ * ulp             - The requested ULP number for the ring. This
+ * 			should be zero based, i.e. 0,1,2. This must be valid
+ * 			NIC ULP based on the firmware config.  All
+ * 			doorbells for this ring must be sent to this ULP. The
+ * 			first network ring allocated for each ULP are
+ * 			igher performance than subsequent rings.
+ * cq_object       - cq object for completions
+ * eth_sq          -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_sq_create(IN PBE_FUNCTION_OBJECT function_object,
+		 IN PSA_SGL sgl,
+		 IN u32 length_in_bytes,
+		 IN u32 type,
+		 IN u32 ulp,
+		 IN PBE_CQ_OBJECT cq_object, OUT PBE_ETHSQ_OBJECT eth_sq);
+
+/*
+ * This is a set of optional parameters for be_eth_sq_create_ex. Certain
+ * ring types require additional parameters provided in this struct.
+ */
+typedef struct _BE_ETH_SQ_PARAMETERS {
+	u32 port;
+	u32 rsvd0[2];
+} SG_PACK BE_ETH_SQ_PARAMETERS, *PBE_ETH_SQ_PARAMETERS;
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_sq_create_ex
+ *   Creates an ethernet send ring - extended version with additional parameters
+ * function_object -
+ * sgl             - no virtual address required
+ * length_in_bytes -
+ * type            - The type of ring to create.
+ * ulp             - The requested ULP number for the ring. This
+ * 			should be zero based, i.e. 0,1,2. This must be
+ * 			valid NIC ULP based on the firmware config.
+ * 			All doorbells for this ring must be sent to
+ * 			this ULP. The first network ring allocated for
+ * 			each ULP are higher performance than subsequent rings.
+ * cq_object       - cq object for completions
+ * ex_parameters   - Additional parameters (that may increase in future
+ * 			revisions). These parameters are only used for
+ * 			certain ring types -- see BE_ETH_SQ_PARAMETER
+ * 			for details.
+ * eth_sq          -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_sq_create_ex(IN PBE_FUNCTION_OBJECT function_object,
+		    IN PSA_SGL sgl,
+		    IN u32 length_in_bytes,
+		    IN u32 type,
+		    IN u32 ulp,
+		    IN PBE_CQ_OBJECT cq_object,
+		    IN BE_ETH_SQ_PARAMETERS *ex_parameters,
+		    OUT PBE_ETHSQ_OBJECT eth_sq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_sq_destroy
+ *   Destroys an ethernet send ring. The driver must wait for
+ *   all send completions before destroying the ring. This function
+ *   is called as part of be_function_cleanup.
+ * eth_sq        -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_eth_sq_destroy(IN PBE_ETHSQ_OBJECT eth_sq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_sq_get_id
+ *   Query the allocated id for the send ring. This ID is used
+ *   to ring the doorbell.
+ * eth_sq    -
+ * return id -
+ *---------------------------------------------------------------
+ */
+u32 be_eth_sq_get_id(IN PBE_ETHSQ_OBJECT eth_sq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_set_flow_control
+ *   This function sets the flow control characteristics of BladeEngine.
+ * function_object -
+ * txfc_enable     -
+ * rxfc_enable     -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_set_flow_control(IN PBE_FUNCTION_OBJECT function_object,
+			IN boolean txfc_enable, IN boolean rxfc_enable);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_get_flow_control
+ *   This function gets the flow control characteristics of BladeEngine.
+ * function_object -
+ * txfc_enable     -
+ * rxfc_enable     -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_get_flow_control(IN PBE_FUNCTION_OBJECT function_object,
+			IN boolean *txfc_enable,
+			IN boolean *rxfc_enable);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_set_qos
+ *   This function sets the ethernet transmit Quality of Service (QoS)
+ *   characteristics of BladeEngine for the domain. All ethernet transmit
+ *   rings of the domain will evenly share the bandwidth. The exeception
+ *   to sharing is the host primary (super) ethernet transmit
+ *   ring as well as the host ethernet forwarding ring for missed offload
+ *   data.
+ * function_object -
+ * max_bps         - the maximum bits per second in units of
+ * 			10 Mbps (valid 0-100)
+ * max_pps         - the maximum packets per second in units
+ * 			of 1 Kpps (0 indicates no limit)
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_set_qos(IN PBE_FUNCTION_OBJECT function_object,
+	       IN u32 max_bps, IN u32 max_pps);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_get_qos
+ *   This function retrieves the ethernet transmit Quality of Service (QoS)
+ *   characteristics for the domain.
+ * function_object -
+ * max_bps         - the maximum bits per second in units of 10
+ * 			Mbps (valid 0-100)
+ * max_pps         - the maximum packets per second in units of
+ * 			1 Kpps (0 indicates no limit)
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_get_qos(IN PBE_FUNCTION_OBJECT function_object,
+	       IN u32 *max_bps, IN u32 *max_pps);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_set_frame_size
+ *   This function sets the ethernet maximum frame size. The
+ *   previous values are returned.
+ * function_object -
+ * tx_frame_size   - maximum transmit frame size in bytes
+ * rx_frame_size   - maximum receive frame size in bytes
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_set_frame_size(IN PBE_FUNCTION_OBJECT function_object,
+		      IN OUT u32 *tx_frame_size,
+		      IN OUT u32 *rx_frame_size);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_create
+ *   Creates an ethernet receive ring for posting rx buffers. Each
+ *   buffer posted to the ring should be the size indicated from
+ *   calling the be_eth_rq_get_frag_size function.
+ *   Only the host protection domain can receive broadcast/multicast
+ *   frames. It can choose to receive the CQ entries for these
+ *   frames on a separate completion queue, or it can
+ *   use the same CQ. This is determines by the bcmc_cq_object parameter.
+ * function_object -
+ * sgl             -
+ * cq_object       -
+ * bcmc_cq_object  - optional
+ * eth_rq          -
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_rq_create(IN PBE_FUNCTION_OBJECT function_object,
+		 IN PSA_SGL sgl,
+		 IN PBE_CQ_OBJECT cq_object,
+		 IN PBE_CQ_OBJECT bcmc_cq_object,
+		 OUT PBE_ETHRQ_OBJECT eth_rq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_destroy
+ *   Destroys an ethernet receive ring. This function is called as part of
+ *   be_function_cleanup.
+ * eth_rq        -
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS be_eth_rq_destroy(IN PBE_ETHRQ_OBJECT eth_rq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_destroy_options
+ *   Destroys an ethernet receive ring with finer granularity
+ *   options than the standard be_eth_rq_destroy() API function.
+ * eth_rq           -
+ * flush            - Set to 1 to flush the ring, set to 0 to
+ * 			bypass the flush and force invalidation.
+ * callback         - Callback function on completion
+ * callback_context - Callback context
+ * return status    - BE_SUCCESS (0) on success. Negative error
+ * 			code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_rq_destroy_options(IN PBE_ETHRQ_OBJECT eth_rq,
+			  IN boolean flush,
+			  IN MCC_WRB_CQE_CALLBACK callback,
+			  IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_destroy_async
+ *   Same as be_eth_rq_destroy, but this version allows an async callback.
+ * eth_rq             -
+ * callback           -
+ * callback_context   -
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_rq_destroy_async(IN PBE_ETHRQ_OBJECT eth_rq,
+			IN MCC_WRB_CQE_CALLBACK callback,
+			IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_get_id
+ *   Queries the allocated ID for the ethernet receive ring.
+ *   This should be used for ringing the doorbell to post buffers.
+ * EthRq     -
+ * return id -
+ *---------------------------------------------------------------
+ */
+u32 be_eth_rq_get_id(IN PBE_ETHRQ_OBJECT EthRq);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_set_frag_size
+ *   Changes the global ethernet receive fragment size. This
+ *   is very expensive and should rarely be done.  This function may
+ *   require a reboot for the fragsize to take affect. If the function
+ *   succeeds, and the returned actual_frag_size_bytes does not match
+ *   new_frag_size_bytes, then the driver must continue to use
+ *   the actual_frag_size_bytes until the next reboot.
+ * function_object        -
+ * new_frag_size_bytes    - New frag size to set. This must be a
+ * 				power of 2, from 128 to 16k.
+ * actual_frag_size_bytes - The current actual frag size. If the function
+ * 				succeeds, and this differs from the
+ * 				new_frag_size_bytes, then the new frag
+ * 				size will be applied after a reboot.
+ * 				The driver must use this size.
+ * return status          - BE_SUCCESS (0) on success. Negative error
+ * 				code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_rq_set_frag_size(IN PBE_FUNCTION_OBJECT function_object,
+			IN u32 new_frag_size_bytes,
+			OUT u32 *actual_frag_size_bytes);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_eth_rq_get_frag_size
+ *   Queries the global ethernet receive fragment size. All drivers
+ *   should query the frag size and use the specified size.
+ *   Alternatively, they should use the maximum fragment size.
+ * function_object -
+ * frag_size_bytes - The current actual frag size. If the function
+ * 			succeeds, and this differs from the
+ * 			new_frag_size_bytes, then the new frag size will be
+ * 			applied after a reboot. The driver must use this size.
+ * return status   - BE_SUCCESS (0) on success. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_eth_rq_get_frag_size(IN PBE_FUNCTION_OBJECT function_object,
+			OUT u32 *frag_size_bytes);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_prepare_embedded_ioctl
+ *   Use the BE_FUNCTION_PREPARE_EMBEDDED_IOCTL macro, instead of calling this
+ *   function directly.
+ * function_object -
+ * wrb             -
+ * payload_length  -
+ * request_length  -
+ * response_length -
+ * opcode          -
+ * subsystem       -
+ * return ioctl    -
+ *---------------------------------------------------------------
+ */
+PVOID
+be_function_prepare_embedded_ioctl(IN PBE_FUNCTION_OBJECT function_object,
+				   IN PMCC_WRB wrb,
+				   IN u32 payload_length,
+				   IN u32 request_length,
+				   IN u32 response_length,
+				   IN u32 opcode, IN u32 subsystem);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_prepare_nonembedded_ioctl
+ *   Use the BE_FUNCTION_PREPARE_NONEMBEDDED_IOCTL macro, instead of
+ *   calling this function
+ *   directly.
+ * function_object -
+ * wrb             -
+ * ioctl_header_va -
+ * ioctl_header_pa -
+ * payload_length  -
+ * request_length  -
+ * response_length -
+ * opcode          -
+ * subsystem       -
+ * return ioctl    -
+ *---------------------------------------------------------------
+ */
+PVOID
+be_function_prepare_nonembedded_ioctl(IN PBE_FUNCTION_OBJECT
+				      function_object, IN PMCC_WRB wrb,
+				      IN PVOID ioctl_header_va,
+				      IN u64 ioctl_header_pa,
+				      IN u32 payload_length,
+				      IN u32 request_length,
+				      IN u32 response_length,
+				      IN u32 opcode, IN u32 subsystem);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_lock_mcc
+ *   Acquires the MCC posting lock. This lock must be held while calling
+ *   be_function_post_mcc_wrb. If using the be_function_peek_mcc_wrb,
+ *   the caller should acquire the lock before the peek function
+ *   call and hold it until after the post function call. Additionally,
+ *   the "peeked" WRB should not be accessed after this lock
+ *   is released since another thread may reuse the WRB.
+ * function_object    -
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+void be_function_lock_mcc(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_unlock_mcc
+ *   Releases the MCC posting lock acquired by calling be_function_lock_mcc.
+ * function_object    -
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+void be_function_unlock_mcc(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_peek_mcc_wrb
+ *   Returns a pointer to the next WRB to post, either the mailbox
+ *   buffer or the next WRB in the ring. When using this function,
+ *   the caller must ensure that no other thread
+ *   will post an MCC wrb until after this WRB is posted.
+ * function_object -
+ * return wrb      - Pointer to the next WRB to post, NULL on failure.
+ *---------------------------------------------------------------
+ */
+PMCC_WRB be_function_peek_mcc_wrb(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_post_mcc_wrb
+ *   Posts a WRB to either mailbox or mcc ring. The wrb pointer
+ *   may be the pointer returned by the be_function_peek_mcc_wrb function.
+ *   It not, the wrb is copied into the ring/mailbox. The callback may
+ *   be NULL, in which case the function will not return until the
+ *   WRB completes. It will poll the mailbox status or MCC CQ in that case.
+ *   Other outstanding MCC WRBs may be completed in this context
+ *   if the callback is NULL.  This function (nor any other synchronous
+ *   IOCTL function) may be called from an MCC_WRB_CQE_CALLBACK context.
+ *   Only asynchronous IOCTLs may be posted during the completion of
+ *   another IOCTL. Otherwise, the software will deadlock.
+ * funcobj            -
+ * wrb                -
+ * callback           -
+ * callback_context   -
+ * optional_ioctl_va  -
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_function_post_mcc_wrb(IN PBE_FUNCTION_OBJECT funcobj,
+			 IN PMCC_WRB wrb,
+			 IN MCC_WRB_CQE_CALLBACK callback,
+			 IN PVOID callback_context,
+			 IN PVOID optional_ioctl_va);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_mac_address_read_write
+ *   Reads or writes the MAC address.
+ * function_object    -
+ * port1              - Specifies port 0 or 1
+ * mac1               - Specifies addres 0 or 1 (BE has 2 per port)
+ * mgmt               - Specifies the management port. If TRUE, the
+ * 			port1 and mac1
+ *                      parameters are ignored.
+ * write              - If TRUE, the MAC address is set.
+ * permanent          - If TRUE, the MAC read is the permanent address
+ * mac_address        - Address to set, or address returned.
+ * callback           - optional
+ * callback_context   - optional
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_mac_address_read_write(IN PBE_FUNCTION_OBJECT function_object,
+			      IN boolean port1,
+			      IN boolean mac1,
+			      IN boolean mgmt,
+			      IN boolean write,
+			      IN boolean permanent,
+			      IN OUT PSA_MAC_ADDRESS mac_address,
+			      IN MCC_WRB_CQE_CALLBACK callback,
+			      IN PVOID callback_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_multicast_config
+ *   Writes all multicast addresses for this protection domain.
+ *   This function is called as part of be_function_cleanup to
+ *   remove all multicast filters.
+ * function_object    -
+ * promiscuous        - TRUE, enables promiscuous mode where all multicast
+ * 			packets are passed up. Allows supporting >32
+ * 			multicast addresses.
+ * num                - number of mac addresses in the table. Max=32.
+ * mac_table          -
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated
+ * 			struct. If the MCC WRB ring is full, this
+ * 			structure is used to queue the operation. It
+ *                      will be posted to the MCC ring when space
+ *                      becomes available. All queued commands will be
+ *                      posted to the ring in the order they are
+ *                      received. It is always valid to pass a pointer
+ *                      to a generic BE_GENERIC_QUEUE_CONTEXT. However, the
+ *                      specific context structs are generally smaller
+ *                      than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_multicast_config(IN PBE_FUNCTION_OBJECT function_object,
+			IN boolean promiscuous,
+			IN u32 num,
+			IN SA_MAC_ADDRESS *mac_table,
+			IN MCC_WRB_CQE_CALLBACK callback,
+			IN PVOID callback_context,
+			IN PBE_MULTICAST_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_vlan_config
+ *   Writes all vlan tags for this protection domain. This function
+ *   is called as part of be_function_cleanup to remove all vlan filters.
+ * function_object    -
+ * promiscuous        - TRUE, enables promiscuous mode where all
+ * 			vlan packets are passed up the stack. Allows
+ * 			supporting >32 vlan tags.
+ * num                - Number of vlan tags in the array.
+ * vlan_tag_array     -
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated struct.
+ * 			If the MCC WRB ring is full, this structure is used
+ * 			to queue the operation. It will be posted to the
+ * 			MCC ring when space becomes available. All
+ *                      queued commands will be posted to the ring in
+ *                      the order they are received. It is always valid
+ *                      to pass a pointer to a generic
+ *                      BE_GENERIC_QUEUE_CONTEXT. However, the specific
+ *                      context structs are generally smaller than
+ *                      the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_vlan_config(IN PBE_FUNCTION_OBJECT function_object,
+		   IN boolean promiscuous,
+		   IN u32 num,
+		   IN u16 *vlan_tag_array,
+		   IN MCC_WRB_CQE_CALLBACK callback,
+		   IN PVOID callback_context,
+		   IN PBE_VLAN_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_wake_on_lan_config
+ *   Configures wake-on-lan for the controller. Wake-on-lan is only
+ *   supported for the host system virtual machine - wake-on-lan is not
+ *   supported per protection domain. To enable magic packet
+ *   reception, use null pointer arguments for pattern & pattern mask,
+ *   set magic_packet_enable to true, and set the port enables
+ *   to true. To disable magic packet reception, use null pointer
+ *   arguments for pattern & pattern mask, set magic_packet_enable to true,
+ *   and set the port enables to false. To remove a pattern, set both
+ *   enable_port0 and enable_port1 to FALSE, and provide the index
+ *   you previously used to enable the pattern. This function is
+ *   not called as part of be_function_cleanup to remove all wake-on-lan
+ *   patterns, since be_function_cleanup could be called when the
+ *   system wants to wake up on a magic or interesting packet.
+ * function_object     -
+ * enable_port0        - If TRUE, enable this pattern for port0.
+ * enable_port1        - If TRUE, enable this pattern for port1.
+ * magic_packet_enable - If TRUE, enable magic packet for the enabled ports.
+ * index               - index 0-3 for the packet to program
+ * pattern             - 128 byte magic pattern
+ * pattern_mask        - 128 bit mask indicating which bytes in the
+ * 			pattern should be matched.
+ * callback            - optional
+ * callback_context    - optional
+ * queue_context       - Optional. Pointer to a previously allocated struct.
+ * 			 If the MCC WRB ring is full, this structure is
+ * 			 used to queue the operation. It will be posted
+ * 			 to the MCC ring when space becomes available.
+ * 			 All queued commands will be posted to the
+ * 			 ring in the order they are received. It is
+ * 			 always valid to pass a pointer to a generic
+ * 			 BE_GENERIC_QUEUE_CONTEXT. However, the specific
+ * 			 context structs are generally smaller than
+ * 			 the generic struct.
+ * return pend_status  - BE_SUCCESS (0) on success. BE_PENDING
+ * 			 (postive value) if the IOCTL completion
+ * 			 is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_wake_on_lan_config(IN PBE_FUNCTION_OBJECT function_object,
+			  IN boolean enable_port0,
+			  IN boolean enable_port1,
+			  IN boolean magic_packet_enable,
+			  IN u32 index,
+			  IN PVOID pattern,
+			  IN PVOID pattern_mask,
+			  IN MCC_WRB_CQE_CALLBACK callback,
+			  IN PVOID callback_context,
+			  IN PBE_WAKE_ON_LAN_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_rss_config
+ *   Configures Receive Side Scaling for the host networking function.
+ *   This function is called as part of be_function_cleanup
+ *   to disable RSS.
+ * function_object    -
+ * rss_type           - Use enumeration ENABLE_RSS_ENUM.
+ * num_cq             - Number of RSS CQs. 0, 2, 3, or 4
+ * cq_id_array        - Array of num_cq IDs for RSS CQs.
+ * default_cq_id      - CQ id for the default non-RSS ethernet CQ.
+ * flush_mask         - Mask of CQ ids to flush.
+ * hash               - 16 byte hash.
+ * cpu_table_length   - bytes (power of 2 from 2 to 128)
+ * cpu_table          - cpu_table_length bytes. Each byte
+ * 			indicates a CPU from 0 to num_cq-1.
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated
+ * 			struct. If the MCC WRB ring is full, this
+ * 			structure is used to queue the operation. It
+ *                      will be posted to the MCC ring when space
+ *                      becomes available. All queued commands will be
+ *                      posted to the ring in the order they are
+ *                      received. It is always valid to pass
+ *                      a pointer to a generic BE_GENERIC_QUEUE_CONTEXT.
+ *                      However, the specific context structs
+ *                      are generally smaller than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success. BE_PENDING
+ * 			(postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_rss_config(IN PBE_FUNCTION_OBJECT function_object,
+		  IN u32 rss_type,
+		  IN u32 num_cq,
+		  IN u32 *cq_id_array,
+		  IN u32 default_cq_id,
+		  IN u32 flush_mask,
+		  IN PVOID hash,
+		  IN u32 cpu_table_length,
+		  IN u8 *cpu_table,
+		  IN MCC_WRB_CQE_CALLBACK callback,
+		  IN PVOID callback_context,
+		  IN PBE_RSS_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_link_status
+ *   Queries the link status.
+ * function_object    -
+ * link_status        - returned status
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated struct.
+ * 			If the MCC WRB ring is full, this structure is
+ * 			used to queue the operation. It will be posted
+ * 			to the MCC ring when space becomes available. All
+ *                      queued commands will be posted to the ring in
+ *                      the order they are received. It is always valid
+ *                      to pass a pointer to a generic
+ *                      BE_GENERIC_QUEUE_CONTEXT. However, the specific
+ *                      context structs are generally smaller than
+ *                      the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_link_status(IN PBE_FUNCTION_OBJECT function_object,
+		   OUT BE_LINK_STATUS *link_status,
+		   IN MCC_WRB_CQE_CALLBACK callback,
+		   IN PVOID callback_context,
+		   IN PBE_LINK_STATUS_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_query_eth_statistics
+ *   Queries the ethernet statistics. The resulting statistics are
+ *   stored in the ioctl response buffer.
+ * function_object    -
+ * va_for_ioctl       - Virtual address of the IOCTL buffer. This buffer must be
+ *                      physically contiguous.
+ * pa_for_ioctl       - Physical address of the IOCTL buffer. This buffer must
+ * 			be physically contiguous.
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated
+ * 			struct. If the MCC WRB ring is full, this
+ * 			structure is used to queue the operation.
+ * 			It will be posted to the MCC ring when space
+ * 			becomes available. All queued commands will be posted
+ * 			to the ring in the order they are received.
+ * 			It is always valid to pass a pointer to a
+ * 			generic BE_GENERIC_QUEUE_CONTEXT. However, the
+ * 			specific context structs are generally smaller than
+ * 			the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success. BE_PENDING (postive value)
+ * 			if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_query_eth_statistics(IN PBE_FUNCTION_OBJECT function_object,
+			    IN IOCTL_ETH_GET_STATISTICS *va_for_ioctl,
+			    IN u64 pa_for_ioctl,
+			    IN MCC_WRB_CQE_CALLBACK callback,
+			    IN PVOID callback_context,
+			    IN PBE_ETH_STATS_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_promiscuous
+ *   Enables or disables promiscuous mode for each MAC port.
+ * function_object    -
+ * enable_port0       - Enable/Disable promiscuous mode on port 0.
+ * enable_port1       - Enable/Disable promiscuous mode on port 1.
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated
+ * 			struct. If the MCC WRB ring is full, this
+ * 			structure is used to queue the operation.
+ * 			It will be posted to the MCC ring when space
+ * 			becomes available. All queued commands will be
+ * 			posted to the ring in the order they are
+ * 			received. It is always valid to pass a
+ * 			pointer to a generic BE_GENERIC_QUEUE_CONTEXT.
+ * 			However, the specific context structs are
+ * 			generally smaller than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success.
+ * 			BE_PENDING (postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_promiscuous(IN PBE_FUNCTION_OBJECT function_object,
+		   IN boolean enable_port0,
+		   IN boolean enable_port1,
+		   IN MCC_WRB_CQE_CALLBACK callback,
+		   IN PVOID callback_context,
+		   IN PBE_PROMISCUOUS_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_force_failover
+ *   Forces failure of all traffic to the specified MAC port. Use
+ *   the be_rxf_link_status to query to active port. Automatic failover
+ *   feature of BladeEngine is implicitly disabled with this call.
+ * function_object    -
+ * port               - Port to use, 0 or 1.
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated
+ * 			BE_QUEUE_CONTEXT struct. If the MCC WRB ring
+ * 			is full, this structure is used to queue
+ * 			the operation. It will be posted to the
+ * 			MCC ring when space becomes available. All
+ * 			queued commands will be posted to the ring in
+ * 			the order they are received.
+ * return pend_status - BE_SUCCESS (0) on success. BE_PENDING
+ * 			(postive value) if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_force_failover(IN PBE_FUNCTION_OBJECT function_object,
+		      IN u32 port,
+		      IN MCC_WRB_CQE_CALLBACK callback,
+		      IN PVOID callback_context,
+		      IN PBE_FORCE_FAILOVER_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_rxf_filter_config
+ *   Configures BladeEngine ethernet receive filter settings.
+ * function_object    -
+ * settings           - Pointer to the requested filter settings.
+ * 			The response from BladeEngine will be placed back
+ * 			in this structure.
+ * callback           - optional
+ * callback_context   - optional
+ * queue_context      - Optional. Pointer to a previously allocated struct.
+ * 			If the MCC WRB ring is full, this structure is
+ * 			used to queue the operation. It will be posted to
+ * 			the MCC ring when space becomes available. All
+ * 			queued commands will be posted to the ring in
+ * 			the order they are received. It is always valid
+ * 			to pass a pointer to a generic
+ * 			BE_GENERIC_QUEUE_CONTEXT. However, the
+ * 			specific context structs are generally
+ * 			smaller than the generic struct.
+ * return pend_status - BE_SUCCESS (0) on success. BE_PENDING (postive value)
+ * 			if the IOCTL
+ *                      completion is pending. Negative error code on failure.
+ *---------------------------------------------------------------
+ */
+BESTATUS
+be_rxf_filter_config(IN PBE_FUNCTION_OBJECT function_object,
+		     IN OUT NTWK_RX_FILTER_SETTINGS *settings,
+		     IN MCC_WRB_CQE_CALLBACK callback,
+		     IN PVOID callback_context,
+		     IN PBE_RXF_FILTER_QUEUE_CONTEXT queue_context);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_enable_interrupts
+ *   Enables interrupts for the given PCI function.
+ * function_object    -
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+void be_function_enable_interrupts(IN PBE_FUNCTION_OBJECT function_object);
+
+/*
+ *---------------------------------------------------------------
+ * Function: be_function_disable_interrupts
+ *   Disables interrupts for the given PCI function.
+ * function_object    -
+ * return return_type -
+ *---------------------------------------------------------------
+ */
+void
+be_function_disable_interrupts(IN PBE_FUNCTION_OBJECT function_object);
+
+#ifdef SG_PRAGMA_PACK
+#pragma pack(pop)
+#endif
+
+#endif /* __beclib_ll_bmap_h__ */
diff -uprN orig/linux-2.6.24.2/drivers/message/beclib/bestatus.h benet/linux-2.6.24.2/drivers/message/beclib/bestatus.h
--- orig/linux-2.6.24.2/drivers/message/beclib/bestatus.h	1970-01-01 05:30:00.000000000 +0530
+++ benet/linux-2.6.24.2/drivers/message/beclib/bestatus.h	2008-02-14 15:23:07.802206648 +0530
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2005 - 2008 ServerEngines
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or at your option any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor
+ * Boston, MA 02110-1301 USA
+ *
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called GPL.
+ *
+ * Contact Information:
+ * linux-drivers@...verengines.com
+ *
+ * ServerEngines
+ * 209 N. Fair Oaks Ave
+ * Sunnyvale, CA 94085
+ *
+ */
+#ifndef _BESTATUS_H_
+#define _BESTATUS_H_
+
+#define BE_SUCCESS                      ((SA_STATUS)0x00000000L)
+
+/*
+ * MessageId: BE_PENDING
+ *  The BladeEngine Driver call succeeded, and pended operation.
+ */
+#define BE_PENDING                       ((SA_STATUS)0x20070001L)
+#define BE_STATUS_PENDING                (BE_PENDING)
+
+/*
+ * MessageId: BE_NOT_OK
+ *  An error occurred.
+ */
+#define BE_NOT_OK                        ((SA_STATUS)0xE0070002L)
+
+/*
+ * MessageId: BE_STATUS_SYSTEM_RESOURCES
+ *  Insufficient host system resources exist to complete the API.
+ */
+#define BE_STATUS_SYSTEM_RESOURCES       ((SA_STATUS)0xE0070003L)
+
+/*
+ * MessageId: BE_STATUS_CHIP_RESOURCES
+ *  Insufficient chip resources exist to complete the API.
+ */
+#define BE_STATUS_CHIP_RESOURCES         ((SA_STATUS)0xE0070004L)
+
+/*
+ * MessageId: BE_STATUS_NO_RESOURCE
+ *  Insufficient resources to complete request.
+ */
+#define BE_STATUS_NO_RESOURCE            ((SA_STATUS)0xE0070005L)
+
+/*
+ * MessageId: BE_STATUS_BUSY
+ *  Resource is currently busy.
+ */
+#define BE_STATUS_BUSY                   ((SA_STATUS)0xE0070006L)
+
+/*
+ * MessageId: BE_STATUS_INVALID_PARAMETER
+ *  Invalid Parameter in request.
+ */
+#define BE_STATUS_INVALID_PARAMETER      ((SA_STATUS)0xE0000007L)
+
+/*
+ * MessageId: BE_STATUS_NOT_SUPPORTED
+ *  Requested operation is not supported.
+ */
+#define BE_STATUS_NOT_SUPPORTED          ((SA_STATUS)0xE000000DL)
+
+/*
+ * ***************************************************************************
+ *                     E T H E R N E T   S T A T U S
+ * ***************************************************************************
+ */
+
+/*
+ * MessageId: BE_ETH_TX_ERROR
+ *  The Ethernet device driver failed to transmit a packet.
+ */
+#define BE_ETH_TX_ERROR                  ((SA_STATUS)0xE0070101L)
+
+/*
+ * ***************************************************************************
+ *                     S H A R E D   S T A T U S
+ * ***************************************************************************
+ */
+
+/*
+ * MessageId: BE_STATUS_VBD_INVALID_VERSION
+ *  The device driver is not compatible with this version of the VBD.
+ */
+#define BE_STATUS_INVALID_VERSION    ((SA_STATUS)0xE0070402L)
+
+/*
+ * MessageId: BE_STATUS_DOMAIN_DENIED
+ *  The operation failed to complete due to insufficient access
+ *  rights for the requesting domain.
+ */
+#define BE_STATUS_DOMAIN_DENIED          ((SA_STATUS)0xE0070403L)
+
+/*
+ * MessageId: BE_STATUS_TCP_NOT_STARTED
+ *  The embedded TCP/IP stack has not been started.
+ */
+#define BE_STATUS_TCP_NOT_STARTED        ((SA_STATUS)0xE0070409L)
+
+/*
+ * MessageId: BE_STATUS_NO_MCC_WRB
+ *  No free MCC WRB are available for posting the request.
+ */
+#define BE_STATUS_NO_MCC_WRB                 ((SA_STATUS)0xE0070414L)
+
+#endif /* _BESTATUS_ */
diff -uprN orig/linux-2.6.24.2/drivers/message/beclib/beregister.h benet/linux-2.6.24.2/drivers/message/beclib/beregister.h
--- orig/linux-2.6.24.2/drivers/message/beclib/beregister.h	1970-01-01 05:30:00.000000000 +0530
+++ benet/linux-2.6.24.2/drivers/message/beclib/beregister.h	2008-02-14 15:23:07.803206496 +0530
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2005 - 2008 ServerEngines
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or at your option any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor
+ * Boston, MA 02110-1301 USA
+ *
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called GPL.
+ *
+ * Contact Information:
+ * linux-drivers@...verengines.com
+ *
+ * ServerEngines
+ * 209 N. Fair Oaks Ave
+ * Sunnyvale, CA 94085
+ *
+ */
+#ifndef __BEREGISTER_H__
+#define __BEREGISTER_H__
+
+/*!
+
+@...ef
+    This macro zeros out a data structure whose contents happen to be
+    exactly 32-bits. Many controller registers have bit map structures
+    defined to represent them and this routine allows for easy and correct
+    initialization of the register to 0.
+
+@...am
+    reg         - Pointer to the 32-bit structure to zero out.
+
+@...urn
+
+@...e
+    IRQL: any
+
+*/
+
+/*
+ *
+ * Macros for reading/writing a protection domain or CSR registers
+ * in BladeEngine.
+ */
+#define PD_READ(_fo_, _field_)     				\
+	BePdRead((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PROTECTION_DOMAIN_DBMAP, _field_),	\
+	SA_DBG_CSTR(#_field_))
+
+#define PD_WRITE(_fo_, _field_, _value_)			\
+	BePdWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PROTECTION_DOMAIN_DBMAP, _field_),	\
+	(_value_).dw, SA_DBG_CSTR(#_field_))			\
+
+#define PD_WRITE_CONST(_fo_, _field_, _value_)			\
+	BePdWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PROTECTION_DOMAIN_DBMAP, _field_),	\
+	(_value_), SA_DBG_CSTR(#_field_))
+
+#define CSR_READ(_fo_, _field_)				\
+	BeCsrRead((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(BLADE_ENGINE_CSRMAP, _field_),	\
+	SA_DBG_CSTR(#_field_))				\
+
+#define CSR_WRITE(_fo_, _field_, _value_)			\
+	BeCsrWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(BLADE_ENGINE_CSRMAP, _field_),	\
+	(_value_).dw, SA_DBG_CSTR(#_field_))
+
+#define CSR_WRITE_CONST(_fo_, _field_, _value_)		\
+	BeCsrWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(BLADE_ENGINE_CSRMAP, _field_),	\
+	 (_value_), SA_DBG_CSTR(#_field_))
+/*
+ *
+ * Macros for reading/writing a protection domain or
+ * CSR registers in BladeEngine.
+ */
+#define PCICFG0_READ(_fo_, _field_)				\
+	BePciCfgRead((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PCICFG0_CSRMAP, _field_),		\
+	SA_DBG_CSTR(#_field_))
+
+#define PCICFG0_WRITE(_fo_, _field_, _value_)                  \
+	BePciCfgWrite((_fo_)->sa_dev,                           \
+	SA_FIELD_OFFSET(PCICFG0_CSRMAP, _field_),             \
+	(_value_).dw, SA_DBG_CSTR (#_field_))
+
+
+#define PCICFG0_WRITE_CONST(_fo_, _field_, _value_)		\
+	BePciCfgWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PCICFG0_CSRMAP, _field_),		\
+	(_value_), SA_DBG_CSTR(#_field_))
+
+#define PCICFG1_READ(_fo_, _field_)				\
+	BePciCfgRead((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PCICFG1_CSRMAP, _field_),		\
+	SA_DBG_CSTR(#_field_))
+
+#define PCICFG1_WRITE(_fo_, _field_, _value_)			\
+	BePciCfgWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PCICFG1_CSRMAP, _field_),		\
+	(_value_).dw, SA_DBG_CSTR(#_field_))
+
+#define PCICFG1_WRITE_CONST(_fo_, _field_, _value_)		\
+	BePciCfgWrite((_fo_)->sa_dev,				\
+	SA_FIELD_OFFSET(PCICFG1_CSRMAP, _field_),		\
+	(_value_), SA_DBG_CSTR(#_field_))
+
+#define RXULP_PD_WRITE(_function_object_, _ulp_number_, _value_)              \
+	switch (_ulp_number_) {              				\
+	case 0:                                                               \
+		PD_WRITE((_function_object_), iscsi_default_pdu_db,	\
+			(_value_));  \
+		break;          \
+	case 1:                                                               \
+		PD_WRITE((_function_object_), rdma_rq_db, (_value_));  \
+		break;        \
+	case 2:                                                               \
+		PD_WRITE((_function_object_), tpm_rq_db, (_value_)); \
+		break;     \
+	default:                                                              \
+		BREAKPOINT();                                                 \
+    }                                                                         \
+
+
+#define TXULP_PD_WRITE(_function_object_, _ulp_number_, _value_)           \
+	switch (_ulp_number_) {                                                \
+	case 0:                                                            \
+		PD_WRITE((_function_object_), iscsi_wrb_post_db, (_value_));  \
+		break;                                                         \
+	case 1:                                                            \
+		PD_WRITE((_function_object_), rdma_sq_db, (_value_));         \
+		break;                                                         \
+	case 2:                                                            \
+		PD_WRITE((_function_object_), etx_sq_db, (_value_));          \
+		break;                                                         \
+	default:                                                           \
+		BREAKPOINT();              \
+	    } 				\
+
+
+/*!
+
+@...ef
+    This routine reads from a register located within the protection domain
+    doorbell space for a given function object.
+
+@...am
+    FuncObj     - Pointer to the function object to read from.
+
+@...am
+    Offset      - The Offset(in bytes) to read from within the
+			function's PD space.
+
+@...urn
+    The value read.
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    u32 BePdRead(IN PSA_DEV sa_dev, IN u32 offset, IN const c8 *dbg_name)
+{
+	u32 v;
+	ASSERT(offset < sizeof(PROTECTION_DOMAIN_DBMAP));
+	v = sa_dev_read_u32(sa_dev, sa_get_pd_bar(sa_dev), offset);
+	TRACE(DL_HW, "PD Read.  offset:0x%04x value:0x%08x (%s)", offset,
+	      v, dbg_name);
+	return v;
+}
+
+/*!
+
+@...ef
+    This routine writes to a register located within the protection domain
+    doorbell space for a given function object.
+
+@...am
+    FuncObj     - Pointer to the function object to read from.
+
+@...am
+    Offset      - The Offset (in bytes) to write to within the
+			function's PD space.
+
+@...am
+    Value       - The value to write to the register.
+
+@...urn
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    void
+BePdWrite(IN PSA_DEV sa_dev,
+	  IN u32 offset, IN u32 value, IN const c8 *dbg_name)
+{
+	ASSERT(offset < sizeof(PROTECTION_DOMAIN_DBMAP));
+
+	TRACE(DL_HW, "PD Write. offset:0x%04x value:0x%08x (%s)", offset,
+	      value, dbg_name);
+	sa_dev_write_u32(sa_dev, sa_get_pd_bar(sa_dev), offset, value);
+}
+
+/*!
+
+@...ef
+    This routine reads from a register located within the CSR space for a
+    given function object.
+
+@...am
+    sa_dev - Context for this set of register space
+
+@...am
+    Offset          - The Offset (in bytes) to read from within
+			the function's CSR space.
+
+@...urn
+    The value read.
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    u32 BeCsrRead(IN PSA_DEV sa_dev, IN u32 offset, IN const c8 *dbg_name)
+{
+	u32 value;
+	u32 bar;
+
+	ASSERT(offset < sizeof(BLADE_ENGINE_CSRMAP));
+
+	bar = sa_get_csr_bar(sa_dev);
+	value = sa_dev_read_u32(sa_dev, bar, offset);
+
+	TRACE(DL_HW, "CSR Read.  offset:0x%04x value:0x%08x (%s)", offset,
+	      value, dbg_name);
+
+	return value;
+}
+
+/*!
+
+@...ef
+    This routine writes to a register located within the CSR
+    space for a given function object.
+
+@...am
+    sa_dev - Context for this set of register space
+
+@...am
+    Offset          - The Offset (in bytes) to write to within
+			the function's CSR space.
+
+@...am
+    Value           - The value to write to the register.
+
+@...urn
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    void
+BeCsrWrite(IN PSA_DEV sa_dev,
+	   IN u32 offset, IN u32 value, IN const c8 *dbg_name)
+{
+	ASSERT(offset < sizeof(BLADE_ENGINE_CSRMAP));
+
+	TRACE(DL_HW, "CSR Write. offset:0x%04x value:0x%08x (%s)", offset,
+	      value, dbg_name);
+
+	sa_dev_write_u32(sa_dev, sa_get_csr_bar(sa_dev), offset, value);
+}
+
+/*!
+
+@...ef
+    This routine reads from a register located within the pci cfg
+    space for a given function object.
+
+@...am
+    sa_dev - Context for this set of register space
+
+@...am
+    Offset          - The Offset (in bytes) to read from within
+			the function's pci cfg space.
+
+@...urn
+    The value read.
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    u32
+BePciCfgRead(IN PSA_DEV sa_dev, IN u32 offset, IN const c8 *dbg_name)
+{
+	u32 value;
+
+	ASSERT(offset < sizeof(BLADE_ENGINE_CSRMAP));
+
+	value = sa_dev_read_u32(sa_dev, sa_get_pci_bar(sa_dev), offset);
+
+	TRACE(DL_HW, "PCICFG Read.  offset:0x%04x value:0x%08x (%s)",
+	      offset, value, dbg_name);
+
+	return value;
+}
+
+/*!
+
+@...ef
+    This routine writes to a register located within the pci cfg
+    space for a given function object.
+
+@...am
+    sa_dev - Context for this set of register space
+
+@...am
+    Offset          - The Offset (in bytes) to write to within
+		the function's pci cfg space.
+
+@...am
+    Value           - The value to write to the register.
+
+@...urn
+
+@...e
+    IRQL: any
+
+*/
+STATIC INLINE
+    void
+BePciCfgWrite(IN PSA_DEV sa_dev,
+	      IN u32 offset, IN u32 value, IN const c8 *dbg_name)
+{
+
+	ASSERT(offset < sizeof(BLADE_ENGINE_CSRMAP));
+
+	TRACE(DL_HW, "PCICFG Write. offset:0x%04x value:0x%08x (%s)",
+	      offset, value, dbg_name);
+
+	sa_dev_write_u32(sa_dev, sa_get_pci_bar(sa_dev), offset, value);
+
+}
+
+#endif /* __BEREGISTER_H__ */
diff -uprN orig/linux-2.6.24.2/drivers/message/beclib/main_ll.c benet/linux-2.6.24.2/drivers/message/beclib/main_ll.c
--- orig/linux-2.6.24.2/drivers/message/beclib/main_ll.c	1970-01-01 05:30:00.000000000 +0530
+++ benet/linux-2.6.24.2/drivers/message/beclib/main_ll.c	2008-02-14 15:23:07.803206496 +0530
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2005 - 2008 ServerEngines
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or at your option any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor
+ * Boston, MA 02110-1301 USA
+ *
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called GPL.
+ *
+ * Contact Information:
+ * linux-drivers@...verengines.com
+ *
+ * ServerEngines
+ * 209 N. Fair Oaks Ave
+ * Sunnyvale, CA 94085
+ *
+ */
+#include "pch.h"
+
+/*!
+@...ef
+    System-invoked entry point for system DLL.
+    This routine gets called once per system instantiation, is
+    responsible for registering the the driver's entry points.
+    Initialization and configuration occur elsewhere.
+@...urn
+    SA_SUCCESS if ok.
+@...e
+    IRQL: PASSIVE_LEVEL
+    We cannot touch registers in this routine
+*/
+BESTATUS be_initialize_library(void)
+{
+	SA_TRACE(DL_NOTE, "Built on " __DATE__ " " __TIME__);
+
+	sa_trace_set_debug_level_string(DL_HW, "hw");
+
+	return BE_SUCCESS;
+}
diff -uprN orig/linux-2.6.24.2/drivers/message/beclib/chipobj_ll.c benet/linux-2.6.24.2/drivers/message/beclib/chipobj_ll.c
--- orig/linux-2.6.24.2/drivers/message/beclib/chipobj_ll.c	1970-01-01 05:30:00.000000000 +0530
+++ benet/linux-2.6.24.2/drivers/message/beclib/chipobj_ll.c	2008-02-14 15:23:07.804206344 +0530
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2005 - 2008 ServerEngines
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or at your option any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, 5th Floor
+ * Boston, MA 02110-1301 USA
+ *
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called GPL.
+ *
+ * Contact Information:
+ * linux-drivers@...verengines.com
+ *
+ * ServerEngines
+ * 209 N. Fair Oaks Ave
+ * Sunnyvale, CA 94085
+ *
+ */
+#include "pch.h"
+
+BESTATUS be_chip_create(OUT PBE_CHIP_OBJECT chip)
+{
+	BESTATUS status = BE_SUCCESS;
+	SA_TRACE_ENTRY();
+
+	ASSERT(chip);
+	SA_ZERO_MEM(chip);
+
+	TRACE(DL_INFO, "Create chip object. object:0x%p", chip);
+
+	chip->magic = BE_CHIP_MAGIC;
+	chip->ref_count = 0;
+
+	sa_initialize_list_head(&chip->function_list_head);
+
+	be_lock_init(&chip->lock);
+	/*be_blocking_lock_init (&chip->blocking_lock); */
+
+	return status;
+}
+
+void be_chip_destroy(PBE_CHIP_OBJECT chip)
+{
+	SA_TRACE_ENTRY();
+	CHIP_ASSERT(chip);
+	ASSERT(chip->ref_count == 0);
+
+	SA_ZERO_MEM(chip);
+	TRACE(DL_INFO, "destroying chip %p", chip);
+}
+
+BESTATUS
+be_chip_insert_function_object(IN PBE_CHIP_OBJECT chip_object,
+			       IN PBE_FUNCTION_OBJECT function_object)
+{
+	SA_TRACE_ENTRY();
+
+	CHIP_ASSERT(chip_object);
+	FUNCTION_ASSERT(function_object);
+
+	TRACE(DL_INFO, "Insert function into chip object.");
+
+	ASSERT(function_object->parent_chip == NULL ||
+	       function_object->parent_chip == chip_object);
+	function_object->parent_chip = chip_object;
+
+	be_chip_lock(chip_object);
+
+	chip_object->ref_count++;
+	sa_insert_tail_list(&chip_object->function_list_head,
+			    &function_object->function_list);
+
+	be_chip_unlock(chip_object);
+
+	return BE_SUCCESS;
+}
+
+void
+be_chip_remove_function_object(IN PBE_CHIP_OBJECT chip_object,
+			       IN PBE_FUNCTION_OBJECT function_object)
+{
+	SA_TRACE_ENTRY();
+
+	CHIP_ASSERT(chip_object);
+	FUNCTION_ASSERT(function_object);
+
+	function_object->parent_chip = NULL;
+
+	be_chip_lock(chip_object);
+
+	ASSERT(chip_object->ref_count > 0);
+	ASSERT(!sa_is_list_empty(&chip_object->function_list_head));
+
+	chip_object->ref_count--;
+	sa_remove_entry_list(&function_object->function_list);
+
+	be_chip_unlock(chip_object);
+}
+
+/*!
+
+@...ef
+    This routine serializes access to resources maintained
+    through a chip object.
+
+@...am
+    ChipObject      - The chip object to acquire the lock for.
+
+@...urn
+
+@...e
+    IRQL < DISPATCH_LEVEL
+
+*/
+void be_chip_lock(IN PBE_CHIP_OBJECT chip_object)
+{
+	be_lock_acquire(&chip_object->lock);
+}
+
+/*!
+@...ef
+    This routine removes serialization done by ChipObjectLock.
+@...am
+    ChipObject      - The chip object to drop the lock for.
+@...urn
+@...e
+    IRQL < DISPATCH_LEVEL
+*/
+void be_chip_unlock(IN PBE_CHIP_OBJECT chip_object)
+{
+	be_lock_release(&chip_object->lock);
+}

___________________________________________________________________________________
This message, together with any attachment(s), contains confidential and proprietary information of
ServerEngines Corporation and is intended only for the designated recipient(s) named above. Any unauthorized
review, printing, retention, copying, disclosure or distribution is strictly prohibited.  If you are not the
intended recipient of this message, please immediately advise the sender by reply email message and
delete all copies of this message and any attachment(s). Thank you.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ