xgehal-channel.c revision 7eced415e5dd557aef2d78483b5a7785f0e13670
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright (c) 2002-2006 Neterion, Inc.
*/
#include "xgehal-channel.h"
#include "xgehal-fifo.h"
#include "xgehal-ring.h"
#include "xgehal-device.h"
#include "xgehal-regs.h"
/*
* __hal_channel_dtr_next_reservelist
*
* Walking through the all available DTRs.
*/
static xge_hal_status_e
{
}
return XGE_HAL_OK;
}
/*
* __hal_channel_dtr_next_freelist
*
* Walking through the "freed" DTRs.
*/
static xge_hal_status_e
{
}
return XGE_HAL_OK;
}
/*
* __hal_channel_dtr_next_not_completed - Get the _next_ posted but
* not completed descriptor.
*
* Walking through the "not completed" DTRs.
*/
static xge_hal_status_e
{
/* LINTED E_FUNC_SET_NOT_USED */
}
return XGE_HAL_OK;
}
{
int size = 0;
switch(type) {
size = sizeof(xge_hal_fifo_t);
break;
size = sizeof(xge_hal_ring_t);
break;
default :
break;
}
/* allocate FIFO channel */
return NULL;
}
return channel;
}
{
int size = 0;
size = sizeof(xge_hal_fifo_t);
break;
size = sizeof(xge_hal_ring_t);
break;
break;
default:
break;
}
}
{
channel->reserve_top = 0;
sizeof(void*)*channel->reserve_max);
return XGE_HAL_ERR_OUT_OF_MEMORY;
}
sizeof(void*)*channel->reserve_max);
return XGE_HAL_ERR_OUT_OF_MEMORY;
}
sizeof(void*)*channel->reserve_max);
channel->post_index = 0;
channel->compl_index = 0;
sizeof(void*)*channel->reserve_max);
return XGE_HAL_ERR_OUT_OF_MEMORY;
#if defined(XGE_HAL_RX_MULTI_FREE_IRQ) || defined(XGE_HAL_TX_MULTI_FREE_IRQ)
#endif
return XGE_HAL_OK;
}
{
/* undo changes made at channel_initialize() */
sizeof(void*)*channel->reserve_max);
}
sizeof(void*)*channel->reserve_max);
}
sizeof(void*)*channel->reserve_max);
}
#if defined(XGE_HAL_RX_MULTI_FREE_IRQ) || defined(XGE_HAL_TX_MULTI_FREE_IRQ)
#endif
}
/**
* xge_hal_channel_open - Open communication channel.
* @devh: HAL device, pointer to xge_hal_device_t structure.
* @attr: Contains attributes required to open
* the channel.
* @channelh: The channel handle. On success (XGE_HAL_OK) HAL fills
* this "out" parameter with a valid channel handle.
* @reopen: See xge_hal_channel_reopen_e{}.
*
* Open communication channel with the device.
*
* HAL uses (persistent) channel configuration to allocate both channel
* and Xframe Tx and Rx descriptors.
* Notes:
* 1) The channel config data is fed into HAL prior to
* xge_hal_channel_open().
*
* 2) The corresponding hardware queues must be already configured and
* enabled.
*
* 3) Either down or up queue may be omitted, in which case the channel
* is treated as _unidirectional_.
*
* 4) Post and completion queue may be the same, in which case the channel
* is said to have "in-band completions".
*
* Note that free_channels list is not protected. i.e. caller must provide
* safe context.
*
* Returns: XGE_HAL_OK - success.
* XGE_HAL_ERR_CHANNEL_NOT_FOUND - Unable to locate the channel.
* XGE_HAL_ERR_OUT_OF_MEMORY - Memory allocation failed.
*
* See also: xge_hal_channel_attr_t{}.
* Usage: See ex_open{}.
*/
{
int i;
/* find channel */
break;
}
}
return XGE_HAL_ERR_CHANNEL_NOT_FOUND;
}
if (reopen == XGE_HAL_CHANNEL_OC_NORMAL) {
/* allocate memory, initialize pointers, etc */
break;
break;
break;
default:
break;
}
if (status == XGE_HAL_OK) {
for (i = 0; i < channel->reserve_initial; i++) {
channel->reserve_arr[i];
}
}
else
return status;
} else {
for (i = 0; i < channel->reserve_initial; i++) {
}
channel->reserve_top = 0;
channel->post_index = 0;
channel->compl_index = 0;
reopen);
if (status != XGE_HAL_OK)
return status;
}
}
/* move channel to the open state list */
break;
break;
break;
default:
break;
}
channel->terminating = 0;
/*
* The magic check the argument validity, has to be
* removed before 03/01/2005.
*/
return XGE_HAL_OK;
}
/**
* xge_hal_channel_abort - Abort the channel.
* @channelh: Channel handle.
* @reopen: See xge_hal_channel_reopen_e{}.
*
* Terminate (via xge_hal_channel_dtr_term_f{}) all channel descriptors.
* Currently used internally only by HAL, as part of its
* xge_hal_channel_close() and xge_hal_channel_open() in case
* of fatal error.
*
* See also: xge_hal_channel_dtr_term_f{}.
*/
{
#ifdef XGE_OS_MEMORY_CHECK
int check_cnt = 0;
#endif
int free_length_sav;
int reserve_top_sav;
return;
}
#ifdef XGE_OS_MEMORY_CHECK
#ifdef XGE_DEBUG_ASSERT
} else {
}
}
#endif
check_cnt++;
#endif
}
XGE_HAL_OK) {
#ifdef XGE_OS_MEMORY_CHECK
#ifdef XGE_DEBUG_ASSERT
} else {
->allocated);
}
}
#endif
check_cnt++;
#endif
}
XGE_HAL_OK) {
#ifdef XGE_OS_MEMORY_CHECK
#ifdef XGE_DEBUG_ASSERT
} else {
}
}
#endif
check_cnt++;
#endif
}
#ifdef XGE_OS_MEMORY_CHECK
#endif
}
/**
* xge_hal_channel_close - Close communication channel.
* @channelh: The channel handle.
* @reopen: See xge_hal_channel_reopen_e{}.
*
* Will close previously opened channel and deallocate associated resources.
* Channel must be opened otherwise assert will be generated.
* Note that free_channels list is not protected. i.e. caller must provide
* safe context.
*/
{
/* sanity check: make sure channel is not in free list */
return;
}
}
if (reopen == XGE_HAL_CHANNEL_OC_NORMAL) {
/* de-allocate */
break;
break;
break;
default:
break;
}
}
/* move channel back to free state list */
/* clear msix_idx in case of following HW reset */
}
}