a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER START
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The contents of this file are subject to the terms of the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Common Development and Distribution License (the "License").
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You may not use this file except in compliance with the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a23fd118e437af0a7877dd313db8fdaa3537c675yl * or http://www.opensolaris.org/os/licensing.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See the License for the specific language governing permissions
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and limitations under the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * When distributing Covered Code, include this CDDL HEADER in each
a23fd118e437af0a7877dd313db8fdaa3537c675yl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * If applicable, add the following below this CDDL HEADER, with the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * fields enclosed by brackets "[]" replaced with your own identifying
a23fd118e437af0a7877dd313db8fdaa3537c675yl * information: Portions Copyright [yyyy] [name of copyright owner]
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER END
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl * Copyright (c) 2002-2006 Neterion, Inc.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Use is subject to license terms.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifndef XGE_HAL_CHANNEL_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_CHANNEL_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xge-os-pal.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xge-list.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-types.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-stats.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl__EXTERN_BEGIN_DECLS
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * enum xge_hal_channel_type_e - Enumerated channel types.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_TYPE_FIFO: fifo.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_TYPE_RING: ring.
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @XGE_HAL_CHANNEL_TYPE_SEND_QUEUE: Send Queue
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @XGE_HAL_CHANNEL_TYPE_RECEIVE_QUEUE: Receive Queue
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @XGE_HAL_CHANNEL_TYPE_COMPLETION_QUEUE: Receive queue completion queue
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @XGE_HAL_CHANNEL_TYPE_UP_MESSAGE_QUEUE: Up message queue
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @XGE_HAL_CHANNEL_TYPE_DOWN_MESSAGE_QUEUE: Down message queue
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_TYPE_MAX: Maximum number of HAL-supported
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (and recognized) channel types. Currently: two.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Enumerated channel types. Currently there are only two link-layer
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channels - Xframe fifo and Xframe ring. In the future the list will grow.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef enum xge_hal_channel_type_e {
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_TYPE_FIFO,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_TYPE_RING,
8347601bcb0a439f6e50fc36b4039a73d08700e1yl XGE_HAL_CHANNEL_TYPE_SEND_QUEUE,
7eced415e5dd557aef2d78483b5a7785f0e13670xw XGE_HAL_CHANNEL_TYPE_RECEIVE_QUEUE,
7eced415e5dd557aef2d78483b5a7785f0e13670xw XGE_HAL_CHANNEL_TYPE_COMPLETION_QUEUE,
8347601bcb0a439f6e50fc36b4039a73d08700e1yl XGE_HAL_CHANNEL_TYPE_UP_MESSAGE_QUEUE,
8347601bcb0a439f6e50fc36b4039a73d08700e1yl XGE_HAL_CHANNEL_TYPE_DOWN_MESSAGE_QUEUE,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_TYPE_MAX
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_channel_type_e;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * enum xge_hal_channel_flag_e - Channel flags.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_FLAG_NONE: zero (nil) flag.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_FLAG_USE_TX_LOCK: use lock when posting transmit
a23fd118e437af0a7877dd313db8fdaa3537c675yl * descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_FLAG_FREE_RXD: to-be-defined.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Channel opening flags. Reserved for future usage.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef enum xge_hal_channel_flag_e {
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_FLAG_NONE = 0x0,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_FLAG_USE_TX_LOCK = 0x1,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng XGE_HAL_CHANNEL_FLAG_FREE_RXD = 0x2,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng XGE_HAL_CHANNEL_FLAG_USE_RX_POLLING = 0x4
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_channel_flag_e;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * enum xge_hal_dtr_state_e - Descriptor (DTR) state.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_DTR_STATE_NONE: Invalid state.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_DTR_STATE_AVAIL: Descriptor is available for reservation
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (via xge_hal_fifo_dtr_reserve(), xge_hal_ring_dtr_reserve(), etc.).
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_DTR_STATE_POSTED: Descriptor is posted for processing by the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * device.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_DTR_STATE_FREED: Descriptor is free and can be reused for
a23fd118e437af0a7877dd313db8fdaa3537c675yl * filling-in and posting later.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Xframe/HAL descriptor states. For more on descriptor states and transitions
a23fd118e437af0a7877dd313db8fdaa3537c675yl * please refer to ch_intern{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_channel_dtr_term_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef enum xge_hal_dtr_state_e {
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_DTR_STATE_NONE = 0,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_DTR_STATE_AVAIL = 1,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_DTR_STATE_POSTED = 2,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_DTR_STATE_FREED = 3
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_dtr_state_e;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * enum xge_hal_channel_reopen_e - Channel open, close, or reopen option.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_RESET_ONLY: Do not (de)allocate channel; used with
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_open(), xge_hal_channel_close().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @XGE_HAL_CHANNEL_OC_NORMAL: Do (de)allocate channel; used with
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_open(), xge_hal_channel_close().
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Enumerates options used with channel open and close operations.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The @XGE_HAL_CHANNEL_RESET_ONLY can be used when resetting the device;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * in this case there is actually no need to free and then again malloc
a23fd118e437af0a7877dd313db8fdaa3537c675yl * the memory (including DMA-able memory) used for channel operation.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef enum xge_hal_channel_reopen_e {
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_RESET_ONLY = 1,
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_HAL_CHANNEL_OC_NORMAL = 2
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_channel_reopen_e;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * function xge_hal_channel_callback_f - Channel callback.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @channelh: Channel "containing" 1 or more completed descriptors.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dtrh: First completed descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @t_code: Transfer code, as per Xframe User Guide.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Returned by HAL.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @host_control: Opaque 64bit data stored by ULD inside the Xframe
a23fd118e437af0a7877dd313db8fdaa3537c675yl * descriptor prior to posting the latter on the channel
a23fd118e437af0a7877dd313db8fdaa3537c675yl * via xge_hal_fifo_dtr_post() or xge_hal_ring_dtr_post().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The @host_control is returned as is to the ULD with each
a23fd118e437af0a7877dd313db8fdaa3537c675yl * completed descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @userdata: Opaque per-channel data specified at channel open
a23fd118e437af0a7877dd313db8fdaa3537c675yl * time, via xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Channel completion callback (type declaration). A single per-channel
a23fd118e437af0a7877dd313db8fdaa3537c675yl * callback is specified at channel open time, via
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Typically gets called as part of the processing of the Interrupt
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Service Routine.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Channel callback gets called by HAL if, and only if, there is at least
a23fd118e437af0a7877dd313db8fdaa3537c675yl * one new completion on a given ring or fifo channel. Upon processing the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * first @dtrh ULD is _supposed_ to continue consuming completions
8347601bcb0a439f6e50fc36b4039a73d08700e1yl * using�one of the following HAL APIs:
a23fd118e437af0a7877dd313db8fdaa3537c675yl * - xge_hal_fifo_dtr_next_completed()
a23fd118e437af0a7877dd313db8fdaa3537c675yl * or
a23fd118e437af0a7877dd313db8fdaa3537c675yl * - xge_hal_ring_dtr_next_completed().
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Note that failure to process new completions in a timely fashion
a23fd118e437af0a7877dd313db8fdaa3537c675yl * leads to XGE_HAL_INF_OUT_OF_DESCRIPTORS condition.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Non-zero @t_code means failure to process (transmit or receive, depending
a23fd118e437af0a7877dd313db8fdaa3537c675yl * on the channel type) the descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * In the "transmit" case the failure could happen, for instance, when the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * link is down, in which case Xframe completes the descriptor because it
a23fd118e437af0a7877dd313db8fdaa3537c675yl * is not able to send the data out.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * For details please refer to Xframe User Guide.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_fifo_dtr_next_completed(),
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_ring_dtr_next_completed(), xge_hal_channel_dtr_term_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef xge_hal_status_e (*xge_hal_channel_callback_f)
a23fd118e437af0a7877dd313db8fdaa3537c675yl (xge_hal_channel_h channelh, xge_hal_dtr_h dtrh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl u8 t_code, void *userdata);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * function xge_hal_channel_dtr_init_f - Initialize descriptor callback.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @channelh: Channel "containing" the @dtrh descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dtrh: Descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @index: Index of the descriptor in the channel's set of descriptors.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @userdata: Per-channel user data (a.k.a. context) specified at
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channel open time, via xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reopen: See xge_hal_channel_reopen_e{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Initialize descriptor callback. Unless NULL is specified in the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_attr_t{} structure passed to xge_hal_channel_open()),
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL invokes the callback as part of the xge_hal_channel_open()
a23fd118e437af0a7877dd313db8fdaa3537c675yl * implementation.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * For the ring type of channel the ULD is expected to fill in this descriptor
a23fd118e437af0a7877dd313db8fdaa3537c675yl * with buffer(s) and control information.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * For the fifo type of channel the ULD could use the callback to
a23fd118e437af0a7877dd313db8fdaa3537c675yl * pre-set DMA mappings and/or alignment buffers.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_channel_attr_t{}, xge_hal_channel_dtr_term_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef xge_hal_status_e (*xge_hal_channel_dtr_init_f)
a23fd118e437af0a7877dd313db8fdaa3537c675yl (xge_hal_channel_h channelh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_dtr_h dtrh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int index,
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *userdata,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_reopen_e reopen);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * function xge_hal_channel_dtr_term_f - Terminate descriptor callback.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @channelh: Channel "containing" the @dtrh descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dtrh: First completed descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @state: One of the xge_hal_dtr_state_e{} enumerated states.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @userdata: Per-channel user data (a.k.a. context) specified at
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channel open time, via xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reopen: See xge_hal_channel_reopen_e{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Terminate descriptor callback. Unless NULL is specified in the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_attr_t{} structure passed to xge_hal_channel_open()),
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL invokes the callback as part of closing the corresponding
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channel, prior to de-allocating the channel and associated data
a23fd118e437af0a7877dd313db8fdaa3537c675yl * structures (including descriptors).
a23fd118e437af0a7877dd313db8fdaa3537c675yl * ULD should utilize the callback to (for instance) unmap
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and free DMA data buffers associated with the posted (state =
a23fd118e437af0a7877dd313db8fdaa3537c675yl * XGE_HAL_DTR_STATE_POSTED) descriptors,
a23fd118e437af0a7877dd313db8fdaa3537c675yl * as well as other relevant cleanup functions.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_channel_attr_t{}, xge_hal_channel_dtr_init_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef void (*xge_hal_channel_dtr_term_f) (xge_hal_channel_h channelh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_dtr_h dtrh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_dtr_state_e state,
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *userdata,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_reopen_e reopen);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * struct xge_hal_channel_attr_t - Channel open "template".
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @type: xge_hal_channel_type_e channel type.
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @vp_id: Virtual path id
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @post_qid: Queue ID to post descriptors. For the link layer this
a23fd118e437af0a7877dd313db8fdaa3537c675yl * number should be in the 0..7 range.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @compl_qid: Completion queue ID. Must be set to zero for the link layer.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @callback: Channel completion callback. HAL invokes the callback when there
a23fd118e437af0a7877dd313db8fdaa3537c675yl * are new completions on that channel. In many implementations
a23fd118e437af0a7877dd313db8fdaa3537c675yl * the @callback executes in the hw interrupt context.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dtr_init: Channel's descriptor-initialize callback.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See xge_hal_channel_dtr_init_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * If not NULL, HAL invokes the callback when opening
a23fd118e437af0a7877dd313db8fdaa3537c675yl * the channel via xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dtr_term: Channel's descriptor-terminate callback. If not NULL,
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL invokes the callback when closing the corresponding channel.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also xge_hal_channel_dtr_term_f{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @userdata: User-defined "context" of _that_ channel. Passed back to the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * user as one of the @callback, @dtr_init, and @dtr_term arguments.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @per_dtr_space: If specified (i.e., greater than zero): extra space
a23fd118e437af0a7877dd313db8fdaa3537c675yl * reserved by HAL per each transmit or receive (depending on the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channel type) descriptor. Can be used to store,
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and retrieve on completion, information specific
a23fd118e437af0a7877dd313db8fdaa3537c675yl * to the upper-layer.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @flags: xge_hal_channel_flag_e enumerated flags.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Channel open "template". User fills the structure with channel
a23fd118e437af0a7877dd313db8fdaa3537c675yl * attributes and passes it to xge_hal_channel_open().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Usage: See ex_open{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef struct xge_hal_channel_attr_t {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_type_e type;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int post_qid;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int compl_qid;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_callback_f callback;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_dtr_init_f dtr_init;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_dtr_term_f dtr_term;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *userdata;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int per_dtr_space;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_flag_e flags;
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_channel_attr_t;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_t
a23fd118e437af0a7877dd313db8fdaa3537c675yl * ---------- complete/free section ---------------
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @item: List item; used to maintain a list of open channels.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @callback: Channel completion callback. See
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_callback_f.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @compl_index: Completion index. At any point in time points on the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * position in the channel, which will contain next
a23fd118e437af0a7877dd313db8fdaa3537c675yl * to-be-completed descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @length: Channel length. Currently allocated number of descriptors.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The channel length "grows" when more descriptors get allocated.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See _hal_mempool_grow.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @free_arr: Free array. Contains completed descriptors that were freed
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (i.e., handed over back to HAL) by ULD.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See xge_hal_fifo_dtr_free(), xge_hal_ring_dtr_free().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @free_lock: Lock to protect @free_arr.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * ----------- reserve/post section ---------------
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @post_index: Post index. At any point in time points on the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * position in the channel, which'll contain next to-be-posted
a23fd118e437af0a7877dd313db8fdaa3537c675yl * descriptor.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @post_lock: Lock to serialize multiple concurrent "posters" of descriptors
a23fd118e437af0a7877dd313db8fdaa3537c675yl * on the given channel.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_arr: Reserve array. Contains descriptors that can be reserved
a23fd118e437af0a7877dd313db8fdaa3537c675yl * by ULD for the subsequent send or receive operation.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See xge_hal_fifo_dtr_reserve(),
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_ring_dtr_reserve().
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_length: Length of the @reserve_arr. The length dynamically
a23fd118e437af0a7877dd313db8fdaa3537c675yl * changes: it decrements each time descriptor is reserved.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_lock: Lock to serialize multiple concurrent threads accessing
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_arr.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_threshold: Reserve threshold. Minimal number of free descriptors
a23fd118e437af0a7877dd313db8fdaa3537c675yl * that ought to be preserved in the channel at all times.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Note that @reserve_threshold >= 0 &&
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_threshold < @reserve_max.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * ------------ common section --------------------
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @devh: Device handle. HAL device object that contains _this_ channel.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @dmah: Channel's DMA address. Used to synchronize (to/from device)
a23fd118e437af0a7877dd313db8fdaa3537c675yl * descriptors.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @regh0: Base address of the device memory space handle. Copied from HAL device
a23fd118e437af0a7877dd313db8fdaa3537c675yl * at channel open time.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @regh1: Base address of the device memory space handle. Copied from HAL device
a23fd118e437af0a7877dd313db8fdaa3537c675yl * at channel open time.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @userdata: Per-channel opaque (void*) user-defined context, which may be
a23fd118e437af0a7877dd313db8fdaa3537c675yl * upper-layer driver object, ULP connection, etc.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Once channel is open, @userdata is passed back to user via
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_callback_f.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @work_arr: Work array. Contains descriptors posted to the channel.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Note that at any point in time @work_arr contains 3 types of
a23fd118e437af0a7877dd313db8fdaa3537c675yl * descriptors:
a23fd118e437af0a7877dd313db8fdaa3537c675yl * 1) posted but not yet consumed by Xframe device;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * 2) consumed but not yet completed;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * 3) completed but not yet freed
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (via xge_hal_fifo_dtr_free() or xge_hal_ring_dtr_free())
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @saved_arr: Array used internally to optimize channel full-duplex
a23fd118e437af0a7877dd313db8fdaa3537c675yl * operation.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @stats: Channel statistcis. Includes HAL internal counters, including
a23fd118e437af0a7877dd313db8fdaa3537c675yl * for instance, number of times out-of-descriptors
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (see XGE_HAL_INF_OUT_OF_DESCRIPTORS) condition happened.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * ------------- "slow" section ------------------
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @type: Channel type. See xge_hal_channel_type_e{}.
7eced415e5dd557aef2d78483b5a7785f0e13670xw * @vp_id: Virtual path id
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @post_qid: Identifies Xframe queue used for posting descriptors.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @compl_qid: Identifies Xframe completion queue.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @flags: Channel flags. See xge_hal_channel_flag_e{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_initial: Initial number of descriptors allocated at channel open
a23fd118e437af0a7877dd313db8fdaa3537c675yl * time (see xge_hal_channel_open()). The number of
a23fd118e437af0a7877dd313db8fdaa3537c675yl * channel descriptors can grow at runtime
a23fd118e437af0a7877dd313db8fdaa3537c675yl * up to @reserve_max value.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @reserve_max: Maximum number of channel descriptors. See @reserve_initial.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @is_open: True, if channel is open; false - otherwise.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @per_dtr_space: Per-descriptor space (in bytes) that channel user can utilize
a23fd118e437af0a7877dd313db8fdaa3537c675yl * to store per-operation control information.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL channel object. HAL devices (see xge_hal_device_t{}) contains
a23fd118e437af0a7877dd313db8fdaa3537c675yl * zero or more channels. HAL channel contains zero or more descriptors. The
a23fd118e437af0a7877dd313db8fdaa3537c675yl * latter are used by ULD(s) to manage the device and/or send and receive data
a23fd118e437af0a7877dd313db8fdaa3537c675yl * to remote peer(s) via the channel.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_channel_type_e{}, xge_hal_channel_flag_e,
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_channel_callback_f{}
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef struct {
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* complete/free section */
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_list_t item;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_callback_f callback;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **free_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int length;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int free_length;
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#if defined(XGE_HAL_RX_MULTI_FREE_IRQ) || defined(XGE_HAL_TX_MULTI_FREE_IRQ) || \
8347601bcb0a439f6e50fc36b4039a73d08700e1yl defined(XGE_HAL_RX_MULTI_FREE) || defined(XGE_HAL_TX_MULTI_FREE)
a23fd118e437af0a7877dd313db8fdaa3537c675yl spinlock_t free_lock;
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl int compl_index;
8347601bcb0a439f6e50fc36b4039a73d08700e1yl unsigned int usage_cnt;
8347601bcb0a439f6e50fc36b4039a73d08700e1yl unsigned int poll_bytes;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* reserve/post data path section */
7eced415e5dd557aef2d78483b5a7785f0e13670xw int terminating;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __XGE_WIN__
a23fd118e437af0a7877dd313db8fdaa3537c675yl int __xge_os_attr_cacheline_aligned
a23fd118e437af0a7877dd313db8fdaa3537c675yl post_index;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl int post_index
a23fd118e437af0a7877dd313db8fdaa3537c675yl __xge_os_attr_cacheline_aligned;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl spinlock_t reserve_lock;
a23fd118e437af0a7877dd313db8fdaa3537c675yl spinlock_t post_lock;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **reserve_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_length;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_threshold;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_top;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int unused1;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* common section */
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_device_h devh;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_dev_h pdev;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_reg_h regh0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_reg_h regh1;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *userdata;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **work_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **saved_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **orig_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_stats_channel_info_t stats;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* slow section */
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_type_e type;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int post_qid;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int compl_qid;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_flag_e flags;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_initial;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_max;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int is_open;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int per_dtr_space;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_dtr_term_f dtr_term;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_dtr_init_f dtr_init;
7eced415e5dd557aef2d78483b5a7785f0e13670xw /* MSI stuff */
a23fd118e437af0a7877dd313db8fdaa3537c675yl u32 msi_msg;
a23fd118e437af0a7877dd313db8fdaa3537c675yl u8 rti;
a23fd118e437af0a7877dd313db8fdaa3537c675yl u8 tti;
a23fd118e437af0a7877dd313db8fdaa3537c675yl u16 unused2;
7eced415e5dd557aef2d78483b5a7785f0e13670xw /* MSI-X stuff */
a23fd118e437af0a7877dd313db8fdaa3537c675yl u64 msix_address;
a23fd118e437af0a7877dd313db8fdaa3537c675yl u32 msix_data;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int msix_idx;
7eced415e5dd557aef2d78483b5a7785f0e13670xw volatile int in_interrupt;
8347601bcb0a439f6e50fc36b4039a73d08700e1yl unsigned int magic;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __XGE_WIN__
a23fd118e437af0a7877dd313db8fdaa3537c675yl} __xge_os_attr_cacheline_aligned xge_hal_channel_t ;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_channel_t __xge_os_attr_cacheline_aligned;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ========================== CHANNEL PRIVATE API ========================= */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_status_e
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_initialize(xge_hal_channel_h channelh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_attr_t *attr, void **reserve_arr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int reserve_initial, int reserve_max, int reserve_threshold);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid __hal_channel_terminate(xge_hal_channel_h channelh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_channel_t*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_allocate(xge_hal_device_h devh, int post_qid,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_type_e type);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid __hal_channel_free(xge_hal_channel_t *channel);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#if defined(XGE_DEBUG_FP) && (XGE_DEBUG_FP & XGE_DEBUG_FP_CHANNEL)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __HAL_STATIC_CHANNEL
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __HAL_INLINE_CHANNEL
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL xge_hal_status_e
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_alloc(xge_hal_channel_h channelh, xge_hal_dtr_h *dtrh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_post(xge_hal_channel_h channelh, xge_hal_dtr_h dtrh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_try_complete(xge_hal_channel_h channelh, xge_hal_dtr_h *dtrh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_complete(xge_hal_channel_h channelh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_free(xge_hal_channel_h channelh, xge_hal_dtr_h dtrh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_dealloc(xge_hal_channel_h channelh, xge_hal_dtr_h dtrh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_channel_dtr_restore(xge_hal_channel_h channelh, xge_hal_dtr_h dtrh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int offset);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ========================== CHANNEL PUBLIC API ========================= */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL int
8347601bcb0a439f6e50fc36b4039a73d08700e1ylxge_hal_channel_dtr_count(xge_hal_channel_h channelh);
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL void*
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_channel_userdata(xge_hal_channel_h channelh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL int
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_channel_id(xge_hal_channel_h channelh);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl__HAL_STATIC_CHANNEL __HAL_INLINE_CHANNEL int
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_check_alignment(dma_addr_t dma_pointer, int size, int alignment,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int copy_size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else /* XGE_FASTPATH_EXTERN */
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __HAL_STATIC_CHANNEL static
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __HAL_INLINE_CHANNEL inline
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-channel-fp.c"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif /* XGE_FASTPATH_INLINE */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_status_e
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_channel_open(xge_hal_device_h hldev, xge_hal_channel_attr_t *attr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_h *channel,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_reopen_e reopen);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid xge_hal_channel_close(xge_hal_channel_h channelh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_reopen_e reopen);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid xge_hal_channel_abort(xge_hal_channel_h channelh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_channel_reopen_e reopen);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl__EXTERN_END_DECLS
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif /* XGE_HAL_CHANNEL_H */