root/usr/src/uts/sun/sys/dada/dada_pkt.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 1996, 1999-2000, 2002 Sun Microsystems, Inc.
 * All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_DADA_DADA_PKT_H
#define _SYS_DADA_DADA_PKT_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#include <sys/dada/dada_types.h>

#ifdef  __cplusplus
extern "C" {
#endif


/*
 * DCD pkt definition.
 *
 *      This structure defined the packet which is allocated by a library
 *      function and handed to a target driver. The target driver fills
 *      in some information, and passes it to the library for transport
 *      to an addressed DCD devices. The host adapter found by the library
 *      fills in some other information as the command is processed. When
 *      the command completes (or can be taken  no further) the function
 *      specified in the pkt is called with a pointer to the packet as
 *      argument. For fields within the packet, the target driver can
 *      determine the success or failure of the command.
 */


struct  dcd_pkt {
        uchar_t         *pkt_cdbp;              /* pointer to command block */
        uchar_t         *pkt_scbp;              /* ptr to status block */
        int             pkt_flags;              /* Pkt flags */
        int             pkt_time;               /* Completion timeout */
        int             pkt_scblen;             /* Scb length */
        int             pkt_cdblen;             /* Length of cdb */
        uint_t          pkt_state;              /* State of command */
        uint_t          pkt_statistics;         /* Statistics */
        uint_t          pkt_reason;             /* reason or error stat */
        uint_t          pkt_secleft;            /* remaining sectors */
        void            (*pkt_comp)();          /* Pkt Completion routine */
        ssize_t         pkt_resid;              /* bytes not transfered */
        daddr32_t       pkt_startsec;           /* Starting sector */
        ataopaque_t     pkt_private;            /* Target drivers priV data */
        ataopaque_t     pkt_ha_private;         /* HBA private data */
        ataopaque_t     pkt_passthru;           /* pass through command ptr */
        struct  dcd_address     pkt_address;    /* destination address */
        uint_t          version_no;             /* Version Number of this */
        ushort_t        reserved[2];            /* Reserved for future */
};

/*
 * definition for the pkt_flags field.
 */

/*
 * Following defines are generic.
 */

#define FLAG_NOINTR     0x0001  /* Run command with no cmd completion */
                                /* callback; command has been complted */
                                /* up return from dcd_transport(9F)   */

#define FLAG_NODICON    0x0002  /* Even is overlap is possible donot do it */
#define FLAG_NOPARITY   0x0008  /* Run command without parity checking */
#define FLAG_FORCENOINTR\
                        0x0010  /* Force command with to run in polled mode */

#define FLAG_IMMEDIATE_CB\
                        0x0800  /* Immediate callback on command completion */


/*
 * The following flags are they needed ???
 */
#define FLAG_SILENT     0x00010000
#define FLAG_DIAGNOSE   0x00020000
#define FLAG_ISOLATE    0x00040000


/*
 * Definitions for pkt_reason field.
 */

/*
 * Following defines are generic.
 */
#define CMD_CMPLT       0       /* no transport errors - normal completion */
#define CMD_INCOMPLETE  1       /* transport stopped with not normal state */
#define CMD_DMA_DERR    2       /* dama direction error occurred */
#define CMD_TRAN_ERR    3       /* Unspecified transport error */
#define CMD_RESET       4       /* Target completed hard reset sequence */
#define CMD_ABORTED     5       /* Command transport aborted on request */
#define CMD_TIMEOUT     6       /* Command timedout */
#define CMD_DATA_OVR    7       /* Data Overrun */
#define CMD_CMD_OVR     8       /* Command Overrun  - Not used */
#define CMD_STS_OVR     9       /* Status Overrun - Not used */
#define CMD_FATAL       10      /* There is a fatal error */


/*
 * definitions for pkt_state field.
 */
#define STATE_SENT_CMD          0x04    /* Command successsully sent */
#define STATE_XFERRED_DATA      0x08    /* Data Transfer took place */
#define STATE_GOT_STATUS        0x10    /* Status got */


/*
 * Definitions for pkt_statistics field
 */

/*
 * Following defines are generic.
 */

#define STAT_ATA_BUS_RESET      0x08    /* TBD */
#define STAT_ATA_DEV_RESET      0x10    /* TBD */
#define STAT_ATA_ABORTED        0x20    /* Command was aborted */
#define STAT_ATA_TERMINATED     0x80    /* Command was terminated */
#define STAT_ATA_TIMEOUT        0x40    /* Command experienced a timeout */


/*
 * Following filds are appropriate depending on feature used.
 */
#define STAT_ATA_DISCON 0x01    /* Command is doing overlap processing */
#define STAT_ATA_SYNC   0x02    /* May be used for DMA transfers */
#define STAT_ATA_PERR   0x04    /* Command experienced a parity error */


/*
 * Definitions for what dcd_transport returns
 */
#define TRAN_ACCEPT     1
#define TRAN_BUSY       0
#define TRAN_BADPKT     -1
#define TRAN_FATAL_ERROR -2     /* The hba cannot accept any pkt */


#ifdef _KERNEL
/*
 * Kernel function declarations
 */

#define ata_pkt_transport       dcd_transport

#ifdef  __STDC__
extern int dcd_transport(struct dcd_pkt *);
#else   /* __STDC__ */
extern int dcd_transport();
#endif  /* __STDC__ */

#define DCD_POLL_TIMEOUT        60

#endif  /* _KERNEL */

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_DADA_DADA_PKT_H */