scfdscp.c revision c2c6897e1a5682452b38f92bc27270708f1e033c
/*
* 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
*/
/*
* All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* DSCP control table
*/
mkey_t scf_dscp_mkey_search[] = {
DSCP_KEY, /* DSCP mailbox interface key */
DKMD_KEY /* DKMD mailbox interface key */
/* Add mailbox key */
};
/*
* SCF driver system control intafece function
*/
void scf_dscp_init(void);
void scf_dscp_fini(void);
/*
* Timeout function : from SCF driver timer contorol function
*/
void scf_dscp_ack_tout(void);
void scf_dscp_end_tout(void);
void scf_dscp_busy_tout(void);
void scf_dscp_callback_tout(void);
void scf_dscp_callback(void);
void scf_dscp_init_tout(void);
/*
* Interrupt function : from scf_dscp_intr()
*/
/*
*/
/*
* Tx subroutine function
*/
void scf_dscp_send_matrix(void);
/*
* Rx subroutine function
*/
void scf_dscp_recv_matrix(void);
/*
* subroutine function
*/
void scf_dscp_dscbuff_free_all(void);
uint16_t scf_dscp_sram_get(void);
/*
* DSCP Driver interface function
*/
/*
* scf_mb_init()
*
* Description: Initialize the mailbox and register a callback for receiving
* events related to the specified mailbox.
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - mailbox key
* event_handler- handler to be called for all events related
* to a mailbox. It should be called back with
* the event type and the registered argument.
*
* arg - A callback argument to be passed back to the
* event_handler.
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned, some of the notable error values
* are given below.
* EINVAL - Invalid values.
* EEXIST - Already OPEN.
* EIO - DSCP I/F path not available.
*/
int
{
#define SCF_FUNC_NAME "scf_mb_init() "
int path_ret; /* SCF path status return value */
int ret = 0; /* Return value */
int tm_stop_cnt;
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_init;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_init;
}
/* Check "event_handler" address */
if (event_handler == NULL) {
/* Invalid "event_handler" */
&event_handler, sizeof (event_handler));
goto END_mb_init;
}
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_HALT) {
/* SCF path status is halt */
sizeof (path_ret));
goto END_mb_init;
}
/* Check main status */
/* Main status != A0 */
goto END_mb_init;
}
/* Initialize flag */
/* Get TxDSC address */
/* Make Tx descriptor : INIT_REQ */
/* Update Tx descriptor offset */
} else {
}
/* Update Tx descriptor count */
/* Change TxDSC status (SB2) */
/* Call send matrix */
/* Change main status (B0) */
/* Save parameter */
/*
* END_mb_init
*/
/* Collect the timers which need to be stopped */
/* Unlock driver mutex */
/* Timer stop */
if (tm_stop_cnt != 0) {
}
return (ret);
}
/*
* scf_mb_fini()
*
* Description: Cleanup the mailbox and unregister an event_handler,
* if it is registered.
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - mailbox key
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned, some of the notable error values
* are given below.
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
*/
int
{
#define SCF_FUNC_NAME "scf_mb_fini() "
int path_ret; /* SCF path status return value */
int ret = 0; /* Return value */
int tm_stop_cnt;
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_fini;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_fini;
}
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_HALT) {
/* SCF path status is halt */
/* TxDSC buffer release */
/* RxDSC buffer release */
/* All queing event release */
/* All receive buffer release */
/* event_handler and arg NULL */
/* Change main status (A0) */
}
goto END_mb_fini;
}
/* Check main status */
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/* Get TxDSC address */
/* Make Tx descriptor : FINI_REQ */
/* Update Tx descriptor offset */
} else {
}
/* Update Tx descriptor count */
/* Change TxDSC status (SB2) */
/* Call send matrix */
/* Change main status (D0) */
/* TxEND(FINI) receive wait */
sizeof (kcondvar_t));
}
/* TxDSC buffer release */
/* RxDSC buffer release */
/* All queing event release */
/* All receive buffer release */
/* event_handler and arg NULL */
/* Change main status (A0) */
break;
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* TxDSC buffer release */
/* RxDSC buffer release */
/* All queing event release */
/* All receive buffer release */
/* event_handler and arg NULL */
/* Change main status (A0) */
break;
case SCF_ST_IDLE: /* Main status (A0) */
/* Main status == A0 is NOP */
break;
default:
/* Not open */
break;
}
/*
* END_mb_fini
*/
/* Collect the timers which need to be stopped */
/* Unlock driver mutex */
/* Timer stop */
if (tm_stop_cnt != 0) {
}
return (ret);
}
/*
* scf_mb_putmsg()
*
* Description: Send a message via the mailbox identified by mkey. The message
* need to be sent either completely or none. That is, no partial
* messages should be sent.
*
* If a 0 timeout value is specified, then it should act as
* a non-blocking interface, that is, it should either send
* the message immediately or return appropriate error.
* If a timeout value is specified, then it can blocked
* until either the message is sent successfully or timedout.
*
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - Unique key corresponding to a mailbox.
* data_len - Total length of the data to be sent.
* timeout - timeout value in milliseconds. If 0 specified, no waiting
* is required.
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned, some of the notable error values
* are given below.
*
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
* EBUSY - Driver is BUSY.
* ENOSPC - Not enough space to send the message.
* EIO - DSCP I/F path not available.
*/
/* ARGSUSED */
int
{
#define SCF_FUNC_NAME "scf_mb_putmsg() "
int ii; /* Working value : counter */
int path_ret; /* SCF path status return value */
int ret = 0; /* Return value */
int tm_stop_cnt;
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_putmsg;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_putmsg;
}
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_HALT) {
/* SCF path status halt */
sizeof (path_ret));
goto END_mb_putmsg;
}
/* Check main status */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/* Check "data_len" is "maxdatalen" */
/* Invalid "data_len" */
goto END_mb_putmsg;
}
/* Check "data_len" is 0 */
if (data_len == 0) {
goto END_mb_putmsg;
}
/*
* Check "num_sg" is not 0, and "sgp" is not NULL
*/
/* Invalid "num_sg" or "sgp" */
goto END_mb_putmsg;
}
/* Get total data length : "num_sg" */
/*
* Add total data length
*/
} else {
/* Invalid "sgp" */
goto END_mb_putmsg;
}
}
/*
* Check "data_len" and "wkleng"
*/
/* Invalid "data_len" */
goto END_mb_putmsg;
}
/*
* Check Tx SRAM space
*/
if (scf_dscp_comtbl.tx_dsc_count >=
/* No space of Tx SRAM */
sizeof (scf_dscp_comtbl.tx_dsc_count));
/* putmsg ENOSPC counter up */
goto END_mb_putmsg;
}
/* Tx buffer allocation */
/* Get Tx SRAM offset */
/* Check Tx SRAM offset */
if (wkoffset == TX_SRAM_GET_ERROR) {
/* Tx SRAM offset failure */
/* Send data release */
/* putmsg busy counter up */
goto END_mb_putmsg;
}
/* Get TxDSC address */
/* Make Tx descriptor : DATA_REQ */
/* Data copy to Tx buffer */
}
}
/* Update Tx descriptor offset */
} else {
}
/* Update Tx descriptor count */
/* Change TxDSC status (SB0) */
/* Call send matrix */
/* Tx DATA_REQ counter */
break;
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* Main status == C1 is NOP */
break;
default:
/* Not open */
break;
}
/*
* END_mb_putmsg
*/
/* Collect the timers which need to be stopped */
/* Unlock driver mutex */
/* Timer stop */
if (tm_stop_cnt != 0) {
}
return (ret);
}
/*
* scf_mb_canget()
*
* Description: Checks if a message received in the specified mailbox.
* If there is a message received, then the length of the
* message is passed via the argument data_lenp. Otherwise,
* return an appropriate error value.
*
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - Unique key corresponding to a mailbox.
* data_lenp - A pointer to uint32_t, in which the size of the message
* is returned.
*
* Return Values: returns 0 if a message is present, otherwise an appropriate
* errno value is returned.
*
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
* ENOMSG - No message available.
* EIO - DSCP I/F path not available.
*/
int
{
#define SCF_FUNC_NAME "scf_mb_canget() "
int path_ret; /* SCF path status return value */
int ret = 0; /* Return value */
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_canget;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_canget;
}
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_HALT) {
/* SCF path status halt */
sizeof (path_ret));
goto END_mb_canget;
}
/* Check main status */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* Check "data_lenp" address */
/* Invalid "data_lenp" */
goto END_mb_canget;
}
/* Check receive data count */
/* Set receive data length */
} else {
/* Set receive data length is 0 : No messages */
*data_lenp = 0;
}
break;
default:
/* Not open */
break;
}
/*
* END_mb_canget
*/
/* Unlock driver mutex */
return (ret);
}
/*
* scf_mb_getmsg()
*
* Description: Get a message from the specified mailbox. A message need to
* be received either completely or none, that is, no partial
* messages should be received.
*
* If a 0 timeout value is specified, then it should act as a
* non-blocking interface, that is, it should either return
* a message from the mailbox or return appropriate error.
* If a timeout value is specified, then it can blocked
* until either the message is received successfully or timedout.
*
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - Unique key corresponding to a mailbox.
* timeout - timeout value in milliseconds. If 0 specified, no waiting
* is required.
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned, some of the notable error values
* are given below.
*
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
* EMSGSIZE - Specified receive data size unmatched.
* ENOMSG - No message available.
* EIO - DSCP I/F path not available.
*/
/* ARGSUSED */
int
{
#define SCF_FUNC_NAME "scf_mb_getmsg() "
int ii; /* Working value : counter */
int path_ret; /* SCF path status return value */
int ret = 0; /* Return value */
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_getmsg;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_getmsg;
}
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_HALT) {
/* SCF path status halt */
sizeof (path_ret));
goto END_mb_getmsg;
}
case SCF_ST_ESTABLISHED: /* Main status (C0) */
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* Check "data_len" */
if ((data_len == 0) ||
/* Unmatched "data_len" */
goto END_mb_getmsg;
}
/* Is num_sg and sgp valid? */
/* Invalid "num_sg" or "sgp" */
goto END_mb_getmsg;
}
/* Is there receive data? */
/* No message */
goto END_mb_getmsg;
}
/* Get total data length : "num_sg" */
/*
* Add total data length
*/
} else {
/* Invalid "sgp" */
goto END_mb_getmsg;
}
}
/* Check "data_len" and "wkleng" */
/* Unmatched "data_len" */
goto END_mb_getmsg;
}
/* Get receive data queue address */
/* Check "data_len" and receive data length */
/* Unmatched data_len */
goto END_mb_getmsg;
}
/* Data copy to "sgp" */
}
}
/* Receve data release */
/* Update receive data queue */
} else {
}
/* Update receive data queue count */
break;
default:
/* Not open */
break;
}
/*
* END_mb_getmsg
*/
/* Unlock driver mutex */
return (ret);
}
/*
* scf_mb_flush()
*
* Description: Flush messages from a specified mailbox.
*
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - Unique key corresponding to a mailbox.
* flush_type - Specifies what type of flush is desired.
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned.
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
*/
int
{
#define SCF_FUNC_NAME "scf_mb_flush() "
int ret = 0; /* Return value */
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_flush;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_flush;
}
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
switch (flush_type) {
case MB_FLUSH_SEND:
case MB_FLUSH_RECEIVE:
case MB_FLUSH_ALL:
if (flush_type != MB_FLUSH_RECEIVE) {
/* TxDSC buffer release */
}
if (flush_type != MB_FLUSH_SEND) {
/* RxDSC buffer release */
/* All queing event release */
/* All receive buffer release */
}
break;
default:
/* Invalid "flush_type" */
&flush_type, sizeof (flush_type));
break;
}
break;
default:
/* Not open */
break;
}
/*
* END_mb_flush
*/
/* Unlock driver mutex */
return (ret);
}
/*
* scf_mb_ctrl()
*
* Description: This interface provides a way to obtain any specific
* properties of a mailbox, such as maximum size of the
* message which could be transmitted/received etc.
*
* Arguments:
*
* target_id - The target_id of the peer. It must be 0 on a Domain.
* mkey - Unique key corresponding to a mailbox.
* op - an operation.
* arg - argument specific to the operation.
*
* Return Values: returns 0 on success, otherwise any meaningful errno
* values are returned.
*
* EINVAL - Invalid values.
* EBADF - Specified target_id is not OPEN.
* ENOTSUP - Not supported.
*/
int
{
#define SCF_FUNC_NAME "scf_mb_ctrl() "
int ret = 0; /* Return value */
mkey);
/* Lock driver mutex */
/* Check target_id */
if (target_id != 0) {
/* Invalid "target_id" */
sizeof (target_id));
goto END_mb_ctrl;
}
/* Get main table address from "mkey" */
/* Check mainp address */
/* Invalid "mkey" */
sizeof (mkey));
goto END_mb_ctrl;
}
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* Check "arg" address */
/* Invalid "arg" */
goto END_mb_ctrl;
}
/* Check "op" */
switch (op) {
case SCF_MBOP_MAXMSGSIZE:
/*
* data size
*/
sizeof (scf_dscp_comtbl.maxdatalen));
break;
default:
/* Not support */
sizeof (op));
break;
}
break;
default:
/* Not open */
break;
}
/*
* END_mb_ctrl
*/
/* Unlock driver mutex */
return (ret);
}
/*
* SCF driver system control intafece function
*/
/*
* scf_dscp_init()
*
* Description: DSCP control area initialization processing.
*
*/
void
scf_dscp_init(void)
{
#define SCF_FUNC_NAME "scf_dscp_init() "
int ii; /* Working value : counter */
int jj; /* Working value : counter */
/*
* DSCP common table initialization
*/
/* Set size value */
/* Set max count */
/* Set re-try max count */
KM_SLEEP);
KM_SLEEP);
/* Tx SRAM table allocation */
KM_SLEEP);
/*
* TxDSC table initialization
*/
/* Get TxDSC table address */
/* Init SRAM offset */
}
/* Set Tx offset */
scf_dscp_comtbl.tx_first = 0;
scf_dscp_comtbl.tx_put = 0;
scf_dscp_comtbl.tx_get = 0;
/*
* Tx STAM offset initialization
*/
/* Get Tx SRAM table address */
/* Init SRAM offset */
}
/* Set Tx SRAM offset */
/*
* RxDSC table initialization
*/
/* Set Rx offset */
scf_dscp_comtbl.rx_first = 0;
scf_dscp_comtbl.rx_put = 0;
scf_dscp_comtbl.rx_get = 0;
/*
* Main table initialization
*/
/* Get Top main table address */
/* Check main table */
/* Set table id */
/* Set fint() condition variable */
mainp->ev_quesize =
KM_SLEEP);
mainp->rd_datasize =
KM_SLEEP);
/* Event queue initialization */
}
/* Receive data queue initialization */
}
/* Initialize success flag ON */
}
/*
* scf_dscp_fini()
*
* Description: DSCP control area release processing.
*
*/
void
scf_dscp_fini(void)
{
#define SCF_FUNC_NAME "scf_dscp_fini() "
int ii; /* Working value : counter */
/*
* Main table resources release
*/
/* Get Top main table address */
/* Check main table */
/* All receive buffer release */
/* Check fint() condition variable */
/* Destroy fint() condition variable */
}
/* Check event queue table allocation */
/* Event queue table release */
}
/* Check receive data table queue allocation */
/* Receive data queue table release */
}
}
/*
* DSCP common table resources release
*/
/* All timer stop */
/* All DSC buffer release */
/* Check TxDSC table allocation */
/* TxDSC table release */
}
/* Check RxDSC table allocation */
/* RxDSC table release */
}
/* Check Tx SRAM table allocation */
/* Tx SRAM table release */
}
/* Initialize success flag ON */
}
/*
* scf_dscp_start()
*
* Description: DSCP interface start processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_start() "
int ii; /* Working value : counter */
factor);
/* Check local control data flag */
/* Get local data TxDSC address */
/* Change TxDSC status (SA0) */
/* TxREQ send exec flag OFF */
}
/* Check pending send TxDSC */
if (scf_dscp_comtbl.tx_dsc_count != 0) {
/* Get TxDSC address */
/* Check TxDSC status */
case SCF_TX_ST_TXREQ_SEND_WAIT: /* TxDSC status (SB2) */
/* Check send data length */
/* Try again SRAM transfer */
/* Change TxDSC status (SB0) */
}
break;
case SCF_TX_ST_TXACK_RECV_WAIT: /* TxDSC status (SC0) */
case SCF_TX_ST_TXEND_RECV_WAIT: /* TxDSC status (SC1) */
/* Try again TxREQ send */
/* Change TxDSC status (SB2) */
break;
default:
/* TxDSC status != SB2 or SC0 or SC1 is NOP */
break;
}
}
/* Check pending RxDSC */
while (scf_dscp_comtbl.rx_dsc_count != 0) {
/* Get RxDSC address */
/* Check receive data */
/* Receive data release */
}
/* Change RxDSC status (RA0) */
/* Update Rx descriptor offset */
} else {
}
/* Update Rx descriptor count */
/* RxREQ receive exec flag OFF */
}
/* Check SCF path change */
if (factor == FACTOR_PATH_CHG) {
/* Tx re-try counter initialization */
/*
* SCF path change flag ON :
* local control data send(DSCP_PATH)
*/
} else {
/* SCF online processing */
/* Get Top main table address */
/* Check main table */
/* Check main status */
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/*
* Connect check flag ON :
* local control data send(CONN_CHK)
*/
break;
default:
/* Connect check flag OFF */
break;
}
}
}
/* Call send matrix */
/* Call receive matrix */
}
/*
* scf_dscp_stop()
*
* Description: DSCP interface stop processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_stop() "
int ii; /* Working value : counter */
factor);
/* Check stop factor */
/* memo counter up */
/* Get Top main table address */
/* Check main table */
/* Check main status */
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/* SCF_MB_DISC_ERROR event queuing */
/* Change main status (C1) */
break;
/* Main status (D0) */
/* Signal to fini() wait */
break;
default:
/* Main status != B0 or C0 or D0 is NOP */
break;
}
}
}
/* Tx timer stop */
}
/*
* scf_dscp_intr()
*
* Description: The corresponding function is called according to the
* interruption factor from SCF.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_intr() "
/* Working value : Interrupt check flag */
/* Get DSR register */
/* DSR register interrupt clear */
/* Regster read sync */
/* SRAM trace */
/* Call TxACK interrupt processing */
}
/* Get TxDSR register */
sizeof (statep->reg_txdsr_c_flag));
sizeof (statep->reg_txdsr_c_offset));
/* SRAM trace */
/* Call TxEND interrupt processing */
}
/* Get RxDCR register */
sizeof (statep->reg_rxdcr_c_flag));
sizeof (statep->reg_rxdcr_c_offset));
sizeof (statep->reg_rxdcr_c_length));
/* SRAM trace */
/* Call RxRERQ interrupt processing */
}
statep->no_int_dsr_cnt++;
}
}
/*
* Timeout function : from SCF driver timer contorol function
*/
/*
* scf_dscp_ack_tout()
*
* Description: TxACK reception surveillance timeout processing is performed.
* SCF path change factor.
*
*/
void
scf_dscp_ack_tout(void)
{
#define SCF_FUNC_NAME "scf_dscp_ack_tout() "
int path_ret; /* SCF path status return value */
/* Check TxREQ send exec */
goto END_dscp_ack_tout;
}
/* memo counter up */
/* TxREQ send exec flag OFF */
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Check TxDSC status */
/* TxDSC status (SC0) */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* Call send matrix */
} else {
/* TxACK re-try timeout error */
sizeof (scf_dscp_comtbl.tx_ackto_retry_cnt));
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_ONLINE) {
"%s,DSCP ack response timeout "
"occurred. "
"DSCP command = 0x%02x\n",
/* SRAM trace */
/* SCF path change */
}
}
}
/*
* END_dscp_ack_tout
*/
}
/*
* scf_dscp_end_tout()
*
* Description: TxEND reception surveillance timeout processing is performed.
* SCF path change factor.
*
*/
void
scf_dscp_end_tout(void)
{
#define SCF_FUNC_NAME "scf_dscp_end_tout() "
int path_ret; /* SCF path status return value */
/* Check TxREQ send exec */
goto END_dscp_end_tout;
}
/* memo counter up */
/* TxREQ send exec flag OFF */
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Check TxDSC status */
/* TxDSC status (SC1) */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* Call send matrix */
} else {
/* TxEND re-try timeout error */
sizeof (scf_dscp_comtbl.tx_endto_retry_cnt));
/* Get SCF path status */
/* Check SCF path status */
if (path_ret == SCF_PATH_ONLINE) {
"%s,DSCP end response timeout "
"occurred. "
"DSCP command = 0x%02x\n",
/* SRAM trace */
/* SCF path change */
}
}
}
/*
* END_dscp_end_tout
*/
}
/*
* scf_dscp_busy_tout()
*
* Description: Busy timeout performs TxREQ transmission again.
*
*/
void
scf_dscp_busy_tout(void)
{
#define SCF_FUNC_NAME "scf_dscp_busy_tout() "
/* Check pending send TxDSC or local control TxDSC */
if ((scf_dscp_comtbl.tx_dsc_count == 0) &&
goto END_dscp_busy_tout;
}
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Check TxDSC status */
/* TxDSC status (SB2) */
/* Call send matrix */
}
/*
* END_dscp_busy_tout
*/
}
/*
* scf_dscp_callback_tout()
*
* Description: Callbak timeout performs soft interrupt again.
*
*/
void
scf_dscp_callback_tout(void)
{
#define SCF_FUNC_NAME "scf_dscp_callback_tout() "
/* Soft interrupt : call scf_dscp_callback() */
}
/* Callback timer start */
}
/*
* scf_dscp_init_tout()
*
* Description: INIT_REQ retray timeout performs TxREQ transmission again.
*
*/
void
scf_dscp_init_tout(void)
{
#define SCF_FUNC_NAME "scf_dscp_init_tout() "
/* Check pending send TxDSC or local control TxDSC */
if ((scf_dscp_comtbl.tx_dsc_count == 0) &&
goto END_dscp_init_tout;
}
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Check TxDSC status */
/* TxDSC status (SB2) */
/* Call send matrix */
}
/*
* END_dscp_init_tout
*/
}
/*
* scf_dscp_callback()
*
* Description: Event queue is taken out and a callback entry is called.
*
*/
void
scf_dscp_callback(void)
{
#define SCF_FUNC_NAME "scf_dscp_callback() "
/* Working value : event_handler */
void (*wkevent_handler)(scf_event_t, void *);
void *wkarg; /* Working value : arg */
/* Working value : next event processing check flag */
int event_flag = FLAG_OFF;
int ii; /* Working value : counter */
/* Check callback entry exec flag */
goto END_dscp_callback;
}
/* Set callback entry exec flag */
/*
* CALLBACK_START
*/
/* Get Top main table address */
/* Check all main table */
/* Check event count */
/* Next event processing flag ON */
/* Get event info */
/* Update event queue offset */
} else {
}
/* Update event queue count */
/* Get callback enntry and arg */
/* Check event_handler address */
if (wkevent_handler != NULL) {
/* Check main status */
case SCF_ST_ESTABLISHED:
/* Main status (C0) */
case SCF_ST_EST_FINI_WAIT:
/* Main status (C1) */
/* Unlock driver mutex */
/* Call event handler */
sizeof (wkmevent));
"DSCP callback mevent = %d",
wkmevent);
/* Lock driver mutex */
break;
default:
/*
* Main status != C0 or C1 is NOP
*/
break;
}
}
}
}
/* Check next event processing */
if (event_flag == FLAG_ON) {
goto CALLBACK_START;
}
/* Clear callback entry exec flag */
/*
* END_dscp_callback
*/
/* CALLBACK timer stop */
}
/*
* Interrupt function : from scf_dscp_intr()
*/
/*
* scf_dscp_txack_recv()
*
* Description: TxACK reception processing is performed.
*
*/
/* ARGSUSED */
void
{
#define SCF_FUNC_NAME "scf_dscp_txack_recv() "
/* Check TxREQ send exec */
goto END_dscp_txack_recv;
}
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Check TxDSC status */
/* TxDSC status (SC0) */
/* Error counter initialization */
/* TxACK timer stop */
/* TxEND timer start */
/* Change TxDSC status (SC1) */
}
/*
* END_dscp_txack_recv
*/
}
/*
* scf_dscp_txend_recv()
*
* Description: TxEND reception is received and processing is carried out by
* completion information.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_txend_recv() "
/* Working value : TxDSC release check flag */
int norel_txdsc = FLAG_OFF;
/* Working value : SCF path change flag */
int path_change = FLAG_OFF;
int ii; /* Working value : counter */
/* Check TxREQ send exec */
goto END_dscp_txend_recv;
}
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* Save TxDSR status information in TxDSC */
/* Check TxREQ offset and TxEND offset */
goto END_dscp_txend_recv;
}
/* TxACK and TxEND timer stop */
/* Get main table address from "id" */
/*
* Check mainp address or local control data(DSCP_PATH)
*/
goto END_dscp_txend_recv;
}
/* Check TxDSC status */
/* TxDSC status (SC0) */
/* TxDSC status (SC1) */
/* Check TxREQ end status */
case DSC_STATUS_NORMAL: /* Normal end */
/* Error counter initialization */
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
}
break;
case DSC_STATUS_BUF_BUSY: /* Buffer busy */
/* memo counter up */
/* TxREQ code check */
/* Check main status */
/* TxREQ busy timer start */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
}
break;
}
/* Check re-try counter */
if ((scf_dscp_comtbl.tx_busy_retry_cnt <
/* re-try count up */
/* TxREQ busy timer start */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Buffer busy end re-try error */
"%s,Buffer busy occurred in XSCF. "
"DSCP command = 0x%02x\n",
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* DSCP path change send flag ON */
}
}
break;
case DSC_STATUS_INTERFACE: /* Interface error */
/* memo counter up */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Interface error end re-try error */
"%s,Detected the interface error by "
"XSCF. DSCP command = 0x%02x\n",
/* Set hard error flag */
/* SCF path change flag ON */
}
break;
case DSC_STATUS_CONN_NAK: /* Connection refusal */
/* memo counter up */
/* TxREQ code check */
/* Check main status */
/* TxREQ busy timer start */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
}
break;
}
/* Check re-try counter */
if ((scf_dscp_comtbl.tx_nak_retry_cnt <
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Connection refusal end re-try error */
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* Set hard error flag */
/* SCF path change flag ON */
}
}
break;
case DSC_STATUS_E_NOT_SUPPORT: /* Not support */
/* memo counter up */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Not support end re-try error */
"%s,Detected the not support command "
"by XSCF. DSCP command = 0x%02x\n",
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* DSCP path change send flag ON */
}
}
break;
case DSC_STATUS_E_PARAM: /* Parameter error */
/* memo counter up */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Parameter error end re-try error */
"%s,Detected the invalid parameter by "
"XSCF. DSCP command = 0x%02x\n",
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* DSCP path change send flag ON */
}
}
break;
case DSC_STATUS_E_SEQUENCE: /* Sequence error */
/* memo counter up */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Sequence error end re-try error */
"%s,Detected the sequence error by "
"XSCF. DSCP command = 0x%02x\n",
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* DSCP path change send flag ON */
}
}
break;
default: /* Other status */
/* memo counter up */
/* Check re-try counter */
/* re-try count up */
/* Change TxDSC status (SB2) */
/* TxDSC not release */
} else {
/* Other error end re-try error */
"%s,Invalid status value was notified "
"from XSCF. DSCP command = 0x%02x, "
"Status value = 0x%02x\n",
(uchar_t)
/* Check local control data(DSCP_PATH) */
/* TxEND notice to main matrix */
} else {
/* DSCP path change send flag ON */
}
}
break;
}
break;
default:
/* TxDSC status != SC0 or SC1 is NOP */
break;
}
/* Check TxDSC not release */
if (norel_txdsc == FLAG_OFF) {
/* Check send data */
/* Send data release */
}
/* Check SRAM data */
/* Send SRAM data release */
}
/* Change TxDSC status (SA0) */
/* Check use local control TxDSC flag */
/* Update Tx descriptor offset */
} else {
}
/* Update Tx descriptor count */
/* Get Top main table address */
/* Check main table */
/* Check putmsg busy release */
/* putmsg busy flag OFF */
/* TxREL_BUSY notice to main matrix */
}
}
} else {
/* Initialize use local control TxDSC flag */
/* DSCP path change send flag OFF */
}
}
/* TxREQ send exec flag OFF */
/* Check SCF path change flag */
if (path_change == FLAG_OFF) {
/* Call send matrix */
} else {
/* SCF path change */
}
/*
* END_dscp_txend_recv
*/
}
/*
* scf_dscp_rxreq_recv()
*
* Description: TxREQ reception notifies to a main control matrix.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxreq_recv() "
/* Check pending RxDSC */
if (scf_dscp_comtbl.rx_dsc_count == 0) {
/* Get RxDSC address */
/* Save RxDCR information in RxDSC */
/* Update Rx descriptor offset */
} else {
}
/* Update Rx descriptor count */
/* RxREQ receive exec flag ON */
/* Get main table address from "id" */
/* Check mainp address and offset */
/* RxREQ notice to main matrix */
} else {
/* Invalid "id" or "offset" */
/* Set end status : Parameter error */
/* Change RxDSC status (RB3) */
/* Call receive matrix */
}
}
}
/*
*/
/*
* scf_dscp_txend_notice()
*
* Description: The TxEND reception is notified of by Tx matrix and handle it
* with data code.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_txend_notice() "
/* Check local control data flag */
/* Get TxDSC address */
} else {
/* Get local data TxDSC address */
}
/* TxREQ code check */
case DSC_CNTL_INIT_REQ: /* INIT_REQ */
/* Check main status */
/* Main status (B0) */
/* Check end status */
/* SCF_MB_CONN_OK event queuing */
/* Change main status (C0) */
} else {
/* Not normal end status */
/* SCF_MB_DISC_ERROR event queuing */
/* Change main status (C1) */
}
}
break;
case DSC_CNTL_FINI_REQ: /* FINI_REQ */
/* Check main status */
/* Main status (D0) */
/* Signal to fini() wait */
sizeof (kcondvar_t));
}
break;
case DSC_CNTL_CONN_CHK: /* CONN_CHK */
/* Check main status */
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/* CONN_CHK flag OFF */
/* Check end status */
/* SCF_MB_DISC_ERROR event queuing */
/* Change main status (C1) */
}
break;
default:
/* Main status != B0 or C0 is NOP */
break;
}
break;
case DSC_CNTL_DATA_REQ: /* DATA_REQ */
/* Tx DATA_REQ ok counter up */
break;
default:
/* Undefine TxREQ code is NOP */
break;
}
}
/*
* scf_dscp_txrelbusy_notice()
*
* Description: Tx busy release is notified of by Tx matrix and perform event
* queue processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_txrelbusy_notice() "
/* Check main status */
/* SCF_MB_SPACE event queuing */
}
}
/*
* scf_dscp_rxreq_notice()
*
* Description: The RxREQ reception is notified of by Rx matrix and handle it
* with data code.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxreq_notice() "
/* Get RxDSC address */
/* RxREQ code check */
case DSC_CNTL_INIT_REQ: /* INIT_REQ */
/* Set end status : Not support */
/* Change RxDSC status (RB3) */
/* Call receive matrix */
break;
case DSC_CNTL_FINI_REQ: /* FINI_REQ */
/* Check main status */
case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
/* SCF_MB_DISC_ERROR event queuing */
/* Change main status (C1) */
break;
default:
/* Main status != B0 or C0 is NOP */
break;
}
/* Set end status : Normal end */
/* Change RxDSC status (RB3) */
/* Call receive matrix */
break;
case DSC_CNTL_DATA_REQ: /* DATA_REQ */
/* Rx DATA_REQ counter up */
/* Check receive data length */
/* Check receive data queue space */
/* Set end status : Normal end */
/* Check main status */
/* Main status (C0) */
/* Change RxDSC status (RB0) */
} else {
/* Change RxDSC status (RB3) */
}
} else {
/* No space of receive data queue */
/* Set end status : Buffer busy */
/* Change RxDSC status (RB3) */
}
} else {
/* Invalid deta length */
/* Set end status : Parameter error */
/* Change RxDSC status (RB3) */
}
/* Call receive matrix */
break;
case DSC_CNTL_CONN_CHK: /* CONN_CHK */
/* Check main status */
/* Main status (C0) */
/* Set end status : Normal end */
} else {
/* Set end status : Connection refusal */
}
/* Change RxDSC status (RB3) */
/* Call receive matrix */
break;
default:
/* Invalid RxREQ code */
/* Set end status : Parameter error */
/* Change RxDSC status (RB3) */
/* Call receive matrix */
break;
}
}
/*
* scf_dscp_rxdata_notice()
*
* Description: It is notified from a Rx control matrix, the received data are
* read from SRAM,
* and the notice of a receive data event is performed.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxdata_notice() "
/* Get RxDSC address */
/* Check main status */
case SCF_ST_ESTABLISHED: /* Main status (C0) */
case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */
/* Check receive data queue space */
/* Receive data queing */
/* Update receive data queue offset */
} else {
}
/* Update receive data queue count */
/* SCF_MB_MSG_DATA event queuing */
/* Rx DATA_REQ ok counter up */
} else {
/* No space of receive data queue */
"No space of receive data queue");
/* Check receive data */
/* Receive data release */
}
/* Set end status : Buffer busy */
/* Change RxDSC status (RB3) */
}
break;
case SCF_ST_CLOSE_TXEND_RECV_WAIT: /* Main status (D0) */
/* Check receive data */
/* Receive data release */
}
/* Set end status : Normal end */
/* Change RxDSC status (RB3) */
break;
default:
/* Check receive data */
/* Receive data release */
}
/* Set end status : Sequence error */
/* Change RxDSC status (RB3) */
break;
}
}
/*
* Tx subroutine function
*/
/*
* scf_dscp_send_matrix()
*
* Description: The Request to Send by a Tx descriptor state is performed.
*
*/
void
scf_dscp_send_matrix(void)
{
#define SCF_FUNC_NAME "scf_dscp_send_matrix() "
/* Working value : next processing check flag */
int next_send_req = FLAG_OFF;
int path_ret; /* SCF path status return value */
int timer_ret; /* Timer check return value */
int ii; /* Working value : counter */
/*
* SEND_MATRIX_START
*/
/* Check use local control TxDSC send */
/* Check DSCP path change data send */
/* Set use local control TxDSC flag */
/* Get local data TxDSC address */
/* Make Tx descriptor : DSCP_PATH */
/* Change TxDSC status (SB2) */
/* Initialize use local control TxDSC flag */
/* Get TxDSC address */
/* Get top main table address */
/*
* Check DSCP connect data send and not local
* control TxDSC send
*/
FLAG_ON)) {
break;
}
/* Check main status */
/* Main status (B0) */
case SCF_ST_ESTABLISHED:
/* Main status (C0) */
/*
* Set use local control TxDSC flag
*/
/*
* Get local data TxDSC address
*/
/*
* Make Tx descriptor : CONN_CHK
*/
/* Change TxDSC status (SB2) */
break;
default:
/*
* Clear DSCP connect check flag
*/
break;
}
}
} else {
/* Get local data TxDSC address */
}
/* Check pending send TxDSC or local control TxDSC */
if ((scf_dscp_comtbl.tx_dsc_count == 0) &&
goto END_dscp_send_matrix;
}
/* Get SCF path status */
/* Check TxDSC status */
case SCF_TX_ST_IDLE: /* TxDSC status (SA0) */
/* TxDSC status == SA0 is next processing */
/* Update Tx descriptor offset */
} else {
}
/* Update Tx descriptor count */
} else {
/* Initialize use local control TxDSC flag */
}
/* Next processing flag ON */
break;
case SCF_TX_ST_SRAM_TRANS_WAIT: /* TxDSC status (SB0) */
/* Check SCF path status */
if (path_ret != SCF_PATH_ONLINE) {
break;
}
/* Data copy to SRAM */
}
/* Change TxDSC status (SB2) */
/* Next processing flag ON */
break;
case SCF_TX_ST_TXREQ_SEND_WAIT: /* TxDSC status (SB2) */
/* Get timer status */
/* Check TxREQ busy timer exec */
if (timer_ret == SCF_TIMER_EXEC) {
break;
}
/* Check INIT_REQ retry timer exec */
if (timer_ret == SCF_TIMER_EXEC) {
break;
}
/* Check SCF path status */
if (path_ret != SCF_PATH_ONLINE) {
break;
}
/* Check TxREQ send exec */
/* TxREQ send */
/* Check send data length */
/* TxACK timer start */
/*
* Change TxDSC status (SC0)
*/
} else {
/* TxEND timer start */
/*
* Change TxDSC status (SC1)
*/
}
}
break;
default:
/* TxDSC status != SA0 or SB0 or SB2 is NOP */
break;
}
/* Check next send processing */
if (next_send_req == FLAG_ON) {
goto SEND_MATRIX_START;
}
/*
* END_dscp_send_matrix
*/
}
/*
* scf_dscp_txreq_send()
*
* Description: TxREQ is transmitted by hard access.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_txreq_send() "
/* Set control flag */
/* Write TxDCR register */
sizeof (statep->reg_txdcr_c_offset));
sizeof (statep->reg_txdcr_c_length));
/* Write DCR register : TxREQ interrupt */
/* Register read sync */
/* TxREQ send exec flag ON */
/* SRAM trace */
} else {
}
}
}
/*
* Rx subroutine function
*/
/*
* scf_dscp_recv_matrix()
*
* Description: TxREQ received performs the corresponding response request.
*
*/
void
scf_dscp_recv_matrix(void)
{
#define SCF_FUNC_NAME "scf_dscp_recv_matrix() "
/* Working value : next receive processing check flag */
int next_resp_req = FLAG_OFF;
int path_ret; /* SCF path status return value */
int ii; /* Working value : counter */
/*
* RECV_MATRIX_START
*/
/* Check pending RxDSC */
if (scf_dscp_comtbl.rx_dsc_count == 0) {
goto END_dscp_recv_matrix;
}
/* Get RxDSC address */
/* Get SCF path status */
/* Check RxDSC status */
case SCF_RX_ST_RXACK_SEND_WAIT: /* RxDSC status (RB0) */
/* Check SCF path status */
if (path_ret != SCF_PATH_ONLINE) {
break;
}
/* Check receive data length */
/* Rx buffer allocation */
/* Set Rx buffer address */
/* RxACK send */
/* Change RxDSC status (RB1) */
} else {
/* Change RxDSC status (RB3) */
break;
}
/* Next receive processing flag ON */
break;
case SCF_RX_ST_SRAM_TRANS_WAIT: /* RxDSC status (RB1) */
/* Check SCF path status */
if (path_ret != SCF_PATH_ONLINE) {
break;
}
/* Get main table address from "id" */
/* Check mainp address */
/* Data copy from SRAM */
}
/* Set end status : Normal end */
/* Change RxDSC status (RB3) */
/* STAM trace */
wk_in_p =
} else {
}
}
/* Receive data notice to main matrix */
} else {
/* Invalid "id" */
/* Set end status : Parameter error */
/* Change RxDSC status (RB3) */
}
/* Next receive processing flag ON */
break;
case SCF_RX_ST_RXEND_SEND_WAIT: /* RxDSC status (RB3) */
/* Is SCF path online? */
if (path_ret != SCF_PATH_ONLINE) {
break;
}
/* RxEND send */
/* Change RxDSC status (RA0) */
/* Update Rx descriptor offset */
} else {
}
/* Update Rx descriptor count */
/* RxREQ receive exec flag OFF */
break;
default:
/* RxDSC status == RA0 is NOP */
break;
}
/* Check next receive processing */
if (next_resp_req == FLAG_ON) {
goto RECV_MATRIX_START;
}
/*
* END_dscp_recv_matrix
*/
}
/*
* scf_dscp_rxack_send()
*
* Description: RxACK is transmitted by hard access.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxack_send() "
/* Write DCR register : RxACK interrupt */
/* Register read sync */
/* SRAM trace */
}
/*
* scf_dscp_rxend_send()
*
* Description: RxEND is transmitted by hard access.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxend_send() "
/* Write RxDSR register */
sizeof (statep->reg_rxdsr_c_flag));
sizeof (statep->reg_rxdsr_c_offset));
/* Write DCR register : RxEND interrupt */
/* Register read sync */
/* SRAM trace */
}
/*
* subroutine function
*/
/*
* scf_dscp_dscbuff_free_all()
*
* Description: All descripter buffer release processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_dscbuff_free_all() "
int ii; /* Working value : counter */
/* Get TxDSC address */
/* Check TxDSC */
dsc_p++) {
/* Check TxDSC status */
continue;
}
/* TxDSC status not (SA0) */
/* Check send data */
/* Send data release */
}
/* Check SRAM data */
/* Send SRAM data release */
}
/* Change TxDSC status (SA0) */
}
/* Tx flag initialization */
/* Tx re-try counter initialization */
}
/* Get RxDSC address */
/* Check RxDSC */
dsc_p++) {
/* Check RxDSC status */
continue;
}
/* RxDSC status not (RA0) */
/* Check receive data */
/* Receive data release */
}
/* Change RxDSC status (RA0) */
}
/* Rx flag initialization */
}
}
/*
* scf_dscp_txdscbuff_free()
*
* Description: Tx descripter buffer release processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_txdscbuff_free() "
int ii; /* Working value : counter */
/* Get TxDSC offser */
/* Check TxDSC */
/* Get TxDSC address */
/* Update Tx descriptor offset */
} else {
wkget++;
}
/* Check main use data */
continue;
}
/* Check TxDSC status */
/* TxDSC status not (SB0) */
/* TxDSC status not (SB2) */
/* Check send data */
/* Send data release */
}
/* Check SRAM data */
/* Send SRAM data release */
}
/* Change TxDSC status (SA0) */
break;
default:
/* TxDSC status != SB0 or SB2 is NOP */
break;
}
}
}
/*
* scf_dscp_rxdscbuff_free()
*
* Description: Rx descripter buffer release processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rxdscbuff_free() "
int ii; /* Working value : counter */
/* Get RxDSC offser */
/* Check RxDSC */
/* Get RxDSC address */
/* Update Rx descriptor offset */
} else {
wkget++;
}
/* Check main use data */
continue;
}
/* Check RxDSC status */
/* TxDSC status not (RA0) */
/* Check receive data */
/* Receive data release */
}
/* Change RxDSC status (RA0) */
/* Rx flag initialization */
break;
}
}
}
/*
* scf_dscp_rdata_free()
*
* Description: All receive data buffer release processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_rdata_free() "
/* Current receive data queue address */
/* Get receive data queue address */
/* Check receive data buffer */
/* Receve data release */
}
/* Update receive data queue */
} else {
}
/* Update receive data queue count */
}
}
/*
* scf_dscp_event_queue()
*
* Description: Event queueing processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_event_queue() "
/* Check DISC ERROR event */
if (mevent == SCF_MB_DISC_ERROR) {
/* TxDSC buffer release */
/* RxDSC buffer release */
/* All queing event release */
/* All receive buffer release */
}
/* Event queing */
/* Update event queue offset */
} else {
}
/* Update event queue count */
/* Soft interrupt : call scf_dscp_callback() */
}
/* Callback timer start */
}
/*
* scf_dscp_event_queue_free()
*
* Description: Event queue release processing.
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_event_queue_free() "
/* All queing event release */
}
/*
* scf_dscp_mkey2mainp()
*
* Description: Get MAIN control table address processing by mkey.
*
*/
{
#define SCF_FUNC_NAME "scf_dscp_mkey2mainp() "
/* Return value : Main table address */
int ii; /* Working value : counter */
/* Check "mkey" at search table */
/* Set mainp address */
break;
}
}
return (mainp);
}
/*
* scf_dscp_id2mainp()
*
* Description: Get MAIN control table address processing by id.
*
*/
{
#define SCF_FUNC_NAME "scf_dscp_id2mainp() "
/* Return value : Main table address */
/* Check "id" */
/* Set mainp address */
}
return (mainp);
}
/*
* scf_dscp_sram_get()
*
* Description: Tx SRAM alloc processing.
*
*/
scf_dscp_sram_get(void)
{
#define SCF_FUNC_NAME "scf_dscp_sram_get() "
int ii; /* Working value : counter */
/* Return value : Tx SRAM offset */
/* Check Tx SRAM space */
if (scf_dscp_comtbl.tx_sram_count >=
goto END_dscp_sram_get;
}
/* Check all Tx SRAM table */
/* Get Tx SRAM table address */
/* Update Tx SRAM offset */
if (scf_dscp_comtbl.tx_sram_put ==
} else {
}
/* Check Tx SRAM use */
/* Tx SRAM use flag ON */
/* Get Tx SRAM offset */
/* Update Tx SRAM count */
break;
}
}
/*
* END_dscp_sram_get
*/
offset);
return (offset);
}
/*
* scf_dscp_sram_free()
*
* Description: Tx SRAM release processing
*
*/
void
{
#define SCF_FUNC_NAME "scf_dscp_sram_free() "
offset);
/* "offset" to Tx SRAM get offset */
/* Check Tx SRAM get offset */
/* Get Tx SRAM table address */
/* Check "offset" */
/* Tx SRAM use flag OFF */
/* Update Tx SRAM count */
}
}
}