root/usr/src/uts/intel/io/dktp/controller/ata/ata_fsm.h
/*
 * 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
 * or http://www.opensolaris.org/os/licensing.
 * 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 1997 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _ATA_FSM_H
#define _ATA_FSM_H

#ifdef  __cplusplus
extern "C" {
#endif


/*
 *
 * The interrupt reason can be interpreted from other bits as follows:
 *
 *  IO  CoD  DRQ
 *  --  ---  ---
 *   0    0    1  == 1 Data to device
 *   0    1    0  == 2 Idle
 *   0    1    1  == 3 Send ATAPI CDB to device
 *   1    0    1  == 5 Data from device
 *   1    1    0  == 6 Status ready
 *   1    1    1  == 7 Future use
 *
 */

/*
 * This macro encodes the interrupt reason into a one byte
 * event code which is used to index the FSM tables
 */
#define ATAPI_EVENT(drq, intr)  \
        (((unsigned char)((drq) & ATS_DRQ) >> 3) \
        | (((intr) & (ATI_IO | ATI_COD)) << 1))

/*
 * These are the names for the encoded ATAPI events
 */
#define ATAPI_EVENT_0           0
#define ATAPI_EVENT_IDLE        ATAPI_EVENT(0, ATI_COD)
#define ATAPI_EVENT_2           2
#define ATAPI_EVENT_STATUS      ATAPI_EVENT(0, ATI_IO | ATI_COD)
#define ATAPI_EVENT_PIO_OUT     ATAPI_EVENT(ATS_DRQ, 0)
#define ATAPI_EVENT_CDB         ATAPI_EVENT(ATS_DRQ, ATI_COD)
#define ATAPI_EVENT_PIO_IN      ATAPI_EVENT(ATS_DRQ, ATI_IO)
#define ATAPI_EVENT_UNKNOWN     ATAPI_EVENT(ATS_DRQ, (ATI_IO | ATI_COD))

#define ATAPI_NEVENTS           8

/*
 * Actions for the ATAPI PIO FSM
 *
 */

enum {
        A_UNK,          /* invalid event detected */
        A_NADA,         /* do nothing */
        A_CDB,          /* send the CDB */
        A_IN,           /* transfer data out to the device */
        A_OUT,          /* transfer data in from the device */
        A_IDLE,         /* unexpected idle phase */
        A_RE,           /* read the error code register */
        A_REX           /* alternate read the error code register */
};

/*
 * States for the ATAPI PIO FSM
 */

enum {
        S_IDLE,         /* idle or fatal error state */
        S_CMD,          /* command byte sent */
        S_CDB,          /* CDB sent */
        S_IN,           /* transferring data in from device */
        S_OUT,          /* transferring data out to device */
        S_DMA,          /* dma transfer active */

        ATAPI_NSTATES
};

#define S_X     S_IDLE  /* alias for idle */

/*
 * controller and device functions
 */
enum {
        ATA_FSM_START0,
        ATA_FSM_START1,
        ATA_FSM_INTR,
        ATA_FSM_FINI,
        ATA_FSM_RESET,

        ATA_CTLR_NFUNCS
};


/*
 * FSM return codes
 */
enum {
        ATA_FSM_RC_OKAY,
        ATA_FSM_RC_BUSY,
        ATA_FSM_RC_INTR,
        ATA_FSM_RC_FINI
};

/*
 * states for the controller FSM
 */
enum {
        AS_IDLE,
        AS_ACTIVE0,
        AS_ACTIVE1,

        ATA_CTLR_NSTATES
};

/*
 * actions for the controller FSM
 */
enum {
        AC_NADA,
        AC_START,
        AC_INTR,
        AC_FINI,
        AC_BUSY,
        AC_RESET_I,
        AC_RESET_A
};

#ifdef  __cplusplus
}
#endif

#endif /* _ATA_FSM_H */