Home | History | Annotate | Line # | Download | only in ic
adw.h revision 1.7
      1 /*      $NetBSD: adw.h,v 1.7 2000/05/08 17:21: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_pa;  /* Carrier Physical Address */
     58 	u_int32_t	areq_vpa; /* ADW_SCSI_REQ_Q Physical 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_vpa;
     66 /* ----------                                     ---------- */
     67 };
     68 
     69 typedef struct adw_carrier ADW_CARRIER;
     70 
     71 
     72 /*
     73  * Mask used to eliminate low 4 bits of carrier 'next_vpa' field.
     74  */
     75 #define ASC_NEXT_VPA_MASK	0xFFFFFFF0
     76 
     77 #define ASC_RQ_DONE		0x00000001
     78 #define ASC_RQ_GOOD		0x00000002
     79 #define ASC_CQ_STOPPER		0x00000000
     80 
     81 #define ASC_GET_CARRP(carrp) ((carrp) & ASC_NEXT_VPA_MASK)
     82 
     83 
     84 /*
     85  * per request scatter-gather element limit
     86  * We could have up to 256 SG lists.
     87  */
     88 #define ADW_MAX_SG_LIST		255
     89 
     90 /*
     91  * Scatter-Gather Definitions per request.
     92  */
     93 
     94 #define NO_OF_SG_PER_BLOCK	15
     95 
     96 /* Number of SG blocks needed. */
     97 #define ADW_NUM_SG_BLOCK \
     98 	((ADW_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK)
     99 
    100 
    101 struct adw_ccb {
    102 	ADW_SCSI_REQ_Q		scsiq;
    103 	ADW_SG_BLOCK		sg_block[ADW_NUM_SG_BLOCK];
    104 
    105 	struct scsipi_sense_data scsi_sense;
    106 
    107 	TAILQ_ENTRY(adw_ccb)	chain;
    108 	struct adw_ccb		*nexthash;
    109 	u_int32_t		hashkey;
    110 
    111 	struct scsipi_xfer	*xs;	/* the scsipi_xfer for this cmd */
    112 	int			flags;	/* see below */
    113 
    114 	int			timeout;
    115 	/*
    116 	 * This DMA map maps the buffer involved in the transfer.
    117 	 */
    118 	bus_dmamap_t		dmamap_xfer;
    119 };
    120 
    121 typedef struct adw_ccb ADW_CCB;
    122 
    123 /* flags for ADW_CCB */
    124 #define CCB_ALLOC	0x01
    125 #define CCB_ABORTING	0x02
    126 #define CCB_ABORTED	0x04
    127 
    128 
    129 #define ADW_MAX_CARRIER	253	/* Max. number of host commands (253) */
    130 #define ADW_MAX_CCB	63	/* Max. number commands per device (63) */
    131 
    132 struct adw_control {
    133 	ADW_CCB		ccbs[ADW_MAX_CCB];	/* all our control blocks */
    134 	ADW_CARRIER	*carriers;		/* all our carriers */
    135 };
    136 
    137 /*
    138  * Bus Address of a Carrier.
    139  * ba = base_ba + v_address - base_va
    140  */
    141 #define	ADW_CARRIER_BADDR(sc,x)	((sc)->sc_dmamap_carrier->dm_segs[0].ds_addr + \
    142 			(((u_long)x) - ((u_long)(sc)->sc_control->carriers)))
    143 /*
    144  * Virtual Address of a Carrier.
    145  * va = base_va + bus_address - base_ba
    146  */
    147 #define	ADW_CARRIER_VADDR(sc,x)	((ADW_CARRIER *) \
    148 			(((u_int8_t *)(sc)->sc_control->carriers) + \
    149 			((u_long)x) - \
    150 			(sc)->sc_dmamap_carrier->dm_segs[0].ds_addr))
    151 /*
    152  * Offset of a CCB from the beginning of the control DMA mapping.
    153  */
    154 #define	ADW_CCB_OFF(c)	(offsetof(struct adw_control, ccbs[0]) +	\
    155 		    (((u_long)(c)) - ((u_long)&sc->sc_control->ccbs[0])))
    156 
    157 /******************************************************************************/
    158 
    159 int adw_init __P((ADW_SOFTC *sc));
    160 void adw_attach __P((ADW_SOFTC *sc));
    161 int adw_intr __P((void *arg));
    162 ADW_CCB *adw_ccb_phys_kv __P((ADW_SOFTC *, u_int32_t));
    163 ADW_CARRIER *adw_carrier_phys_kv __P((ADW_SOFTC *, u_int32_t));
    164 
    165 /******************************************************************************/
    166 
    167 #endif /* _ADVANSYS_ADW_H_ */
    168