Home | History | Annotate | Line # | Download | only in ic
adw.h revision 1.8
      1 /*      $NetBSD: adw.h,v 1.8 2000/05/10 21:22:34 dante Exp $        */
      2 
      3 /*
      4  * Generic driver definitions and exported functions for the Advanced
      5  * Systems Inc. SCSI controllers
      6  *
      7  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
      8  * All rights reserved.
      9  *
     10  * Author: Baldassare Dante Profeta <dante (at) mclink.it>
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions and the following disclaimer.
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  * 3. All advertising materials mentioning features or use of this software
     21  *    must display the following acknowledgement:
     22  *        This product includes software developed by the NetBSD
     23  *        Foundation, Inc. and its contributors.
     24  * 4. Neither the name of The NetBSD Foundation nor the names of its
     25  *    contributors may be used to endorse or promote products derived
     26  *    from this software without specific prior written permission.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     29  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     31  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     32  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     34  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     35  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     36  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     37  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     38  * POSSIBILITY OF SUCH DAMAGE.
     39  */
     40 
     41 #ifndef _ADVANSYS_WIDE_H_
     42 #define _ADVANSYS_WIDE_H_
     43 
     44 /******************************************************************************/
     45 
     46 typedef int (* ADW_ISR_CALLBACK) (ADW_SOFTC *, ADW_SCSI_REQ_Q *);
     47 typedef void (* ADW_ASYNC_CALLBACK) (ADW_SOFTC *, u_int8_t);
     48 
     49 
     50 /*
     51  * ADW_CARRIER must be exactly 16 BYTES
     52  * Every adw_carrier structure _MUST_ always be aligned on a 16 bytes boundary
     53  */
     54 struct adw_carrier {
     55 /* ---------- the microcode wants the field below ---------- */
     56 	u_int32_t	carr_id;  /* Carrier ID */
     57 	u_int32_t	carr_ba;  /* Carrier Bus Address */
     58 	u_int32_t	areq_ba;  /* ADW_SCSI_REQ_Q Bus Address */
     59 	/*
     60 	 * next_vpa [31:4]	Carrier Physical Next Pointer
     61 	 *
     62 	 * next_vpa [3:1]	Reserved Bits
     63 	 * next_vpa [0]		Done Flag set in Response Queue.
     64 	 */
     65 	u_int32_t	next_ba;  /* see next_ba flags below */
     66 /* ----------                                     ---------- */
     67 };
     68 
     69 typedef struct adw_carrier ADW_CARRIER;
     70 
     71 /*
     72  * next_ba flags
     73  */
     74 #define ASC_RQ_DONE		0x00000001
     75 #define ASC_RQ_GOOD		0x00000002
     76 #define ASC_CQ_STOPPER		0x00000000
     77 
     78 /*
     79  * Mask used to eliminate low 4 bits of carrier 'next_vpa' field.
     80  */
     81 #define ASC_NEXT_BA_MASK	0xFFFFFFF0
     82 #define ASC_GET_CARRP(carrp)	((carrp) & ASC_NEXT_BA_MASK)
     83 
     84 
     85 /*
     86  * per request scatter-gather element limit
     87  * We could have up to 256 SG lists.
     88  */
     89 #define ADW_MAX_SG_LIST		255
     90 
     91 /*
     92  * Scatter-Gather Definitions per request.
     93  */
     94 
     95 #define NO_OF_SG_PER_BLOCK	15
     96 
     97 /* Number of SG blocks needed. */
     98 #define ADW_NUM_SG_BLOCK \
     99 	((ADW_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK)
    100 
    101 
    102 struct adw_ccb {
    103 	ADW_SCSI_REQ_Q		scsiq;
    104 	ADW_SG_BLOCK		sg_block[ADW_NUM_SG_BLOCK];
    105 
    106 	struct scsipi_sense_data scsi_sense;
    107 
    108 	TAILQ_ENTRY(adw_ccb)	chain;
    109 	struct adw_ccb		*nexthash;
    110 	u_int32_t		hashkey;
    111 
    112 	struct scsipi_xfer	*xs;	/* the scsipi_xfer for this cmd */
    113 	int			flags;	/* see below */
    114 
    115 	int			timeout;
    116 	/*
    117 	 * This DMA map maps the buffer involved in the transfer.
    118 	 */
    119 	bus_dmamap_t		dmamap_xfer;
    120 };
    121 
    122 typedef struct adw_ccb ADW_CCB;
    123 
    124 /* flags for ADW_CCB */
    125 #define CCB_ALLOC	0x01
    126 #define CCB_ABORTING	0x02
    127 #define CCB_ABORTED	0x04
    128 
    129 
    130 #define ADW_MAX_CARRIER	253	/* Max. number of host commands (253) */
    131 #define ADW_MAX_CCB	63	/* Max. number commands per device (63) */
    132 
    133 struct adw_control {
    134 	ADW_CCB		ccbs[ADW_MAX_CCB];	/* all our control blocks */
    135 	ADW_CARRIER	*carriers;		/* all our carriers */
    136 };
    137 
    138 /*
    139  * Bus Address of a Carrier.
    140  * ba = base_ba + v_address - base_va
    141  */
    142 #define	ADW_CARRIER_BADDR(sc,x)	((sc)->sc_dmamap_carrier->dm_segs[0].ds_addr + \
    143 			(((u_long)x) - ((u_long)(sc)->sc_control->carriers)))
    144 /*
    145  * Virtual Address of a Carrier.
    146  * va = base_va + bus_address - base_ba
    147  */
    148 #define	ADW_CARRIER_VADDR(sc,x)	((ADW_CARRIER *) \
    149 			(((u_int8_t *)(sc)->sc_control->carriers) + \
    150 			((u_long)x) - \
    151 			(sc)->sc_dmamap_carrier->dm_segs[0].ds_addr))
    152 /*
    153  * Offset of a CCB from the beginning of the control DMA mapping.
    154  */
    155 #define	ADW_CCB_OFF(c)	(offsetof(struct adw_control, ccbs[0]) +	\
    156 		    (((u_long)(c)) - ((u_long)&sc->sc_control->ccbs[0])))
    157 
    158 /******************************************************************************/
    159 
    160 int adw_init __P((ADW_SOFTC *sc));
    161 void adw_attach __P((ADW_SOFTC *sc));
    162 int adw_intr __P((void *arg));
    163 ADW_CCB *adw_ccb_phys_kv __P((ADW_SOFTC *, u_int32_t));
    164 ADW_CARRIER *adw_carrier_phys_kv __P((ADW_SOFTC *, u_int32_t));
    165 
    166 /******************************************************************************/
    167 
    168 #endif /* _ADVANSYS_ADW_H_ */
    169