1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _ATA_FSM_H 28 #define _ATA_FSM_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 35 /* 36 * 37 * The interrupt reason can be interpreted from other bits as follows: 38 * 39 * IO CoD DRQ 40 * -- --- --- 41 * 0 0 1 == 1 Data to device 42 * 0 1 0 == 2 Idle 43 * 0 1 1 == 3 Send ATAPI CDB to device 44 * 1 0 1 == 5 Data from device 45 * 1 1 0 == 6 Status ready 46 * 1 1 1 == 7 Future use 47 * 48 */ 49 50 /* 51 * This macro encodes the interrupt reason into a one byte 52 * event code which is used to index the FSM tables 53 */ 54 #define ATAPI_EVENT(drq, intr) \ 55 (((unsigned char)((drq) & ATS_DRQ) >> 3) \ 56 | (((intr) & (ATI_IO | ATI_COD)) << 1)) 57 58 /* 59 * These are the names for the encoded ATAPI events 60 */ 61 #define ATAPI_EVENT_0 0 62 #define ATAPI_EVENT_IDLE ATAPI_EVENT(0, ATI_COD) 63 #define ATAPI_EVENT_2 2 64 #define ATAPI_EVENT_STATUS ATAPI_EVENT(0, ATI_IO | ATI_COD) 65 #define ATAPI_EVENT_PIO_OUT ATAPI_EVENT(ATS_DRQ, 0) 66 #define ATAPI_EVENT_CDB ATAPI_EVENT(ATS_DRQ, ATI_COD) 67 #define ATAPI_EVENT_PIO_IN ATAPI_EVENT(ATS_DRQ, ATI_IO) 68 #define ATAPI_EVENT_UNKNOWN ATAPI_EVENT(ATS_DRQ, (ATI_IO | ATI_COD)) 69 70 #define ATAPI_NEVENTS 8 71 72 /* 73 * Actions for the ATAPI PIO FSM 74 * 75 */ 76 77 enum { 78 A_UNK, /* invalid event detected */ 79 A_NADA, /* do nothing */ 80 A_CDB, /* send the CDB */ 81 A_IN, /* transfer data out to the device */ 82 A_OUT, /* transfer data in from the device */ 83 A_IDLE, /* unexpected idle phase */ 84 A_RE, /* read the error code register */ 85 A_REX /* alternate read the error code register */ 86 }; 87 88 /* 89 * States for the ATAPI PIO FSM 90 */ 91 92 enum { 93 S_IDLE, /* idle or fatal error state */ 94 S_CMD, /* command byte sent */ 95 S_CDB, /* CDB sent */ 96 S_IN, /* transferring data in from device */ 97 S_OUT, /* transferring data out to device */ 98 S_DMA, /* dma transfer active */ 99 100 ATAPI_NSTATES 101 }; 102 103 #define S_X S_IDLE /* alias for idle */ 104 105 /* 106 * controller and device functions 107 */ 108 enum { 109 ATA_FSM_START0, 110 ATA_FSM_START1, 111 ATA_FSM_INTR, 112 ATA_FSM_FINI, 113 ATA_FSM_RESET, 114 115 ATA_CTLR_NFUNCS 116 }; 117 118 119 /* 120 * FSM return codes 121 */ 122 enum { 123 ATA_FSM_RC_OKAY, 124 ATA_FSM_RC_BUSY, 125 ATA_FSM_RC_INTR, 126 ATA_FSM_RC_FINI 127 }; 128 129 /* 130 * states for the controller FSM 131 */ 132 enum { 133 AS_IDLE, 134 AS_ACTIVE0, 135 AS_ACTIVE1, 136 137 ATA_CTLR_NSTATES 138 }; 139 140 /* 141 * actions for the controller FSM 142 */ 143 enum { 144 AC_NADA, 145 AC_START, 146 AC_INTR, 147 AC_FINI, 148 AC_BUSY, 149 AC_RESET_I, 150 AC_RESET_A 151 }; 152 153 #ifdef __cplusplus 154 } 155 #endif 156 157 #endif /* _ATA_FSM_H */ 158