1 /* $OpenBSD: cacvar.h,v 1.1 2000/12/17 21:35:06 mickey Exp $ */ 2 /* $NetBSD: cacvar.h,v 1.7 2000/10/19 14:28:47 ad Exp $ */ 3 4 /*- 5 * Copyright (c) 2000 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Andrew Doran. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 #ifndef _IC_CACVAR_H_ 41 #define _IC_CACVAR_H_ 42 43 #define CAC_MAX_CCBS 20 44 #define CAC_MAX_XFER (0xffff * 512) 45 #define CAC_SG_SIZE 32 46 #define CAC_SECTOR_SIZE 512 47 48 #define cac_inb(sc, port) \ 49 bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, port) 50 #define cac_inw(sc, port) \ 51 bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, port) 52 #define cac_inl(sc, port) \ 53 bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, port) 54 #define cac_outb(sc, port, val) \ 55 bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, port, val) 56 #define cac_outw(sc, port, val) \ 57 bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, port, val) 58 #define cac_outl(sc, port, val) \ 59 bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, port, val) 60 61 /* 62 * Stupid macros to deal with alignment/endianness issues. 63 */ 64 65 #define CAC_GET1(x) \ 66 (((u_char *)&(x))[0]) 67 #define CAC_GET2(x) \ 68 (((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) 69 #define CAC_GET4(x) \ 70 ((((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) | \ 71 (((u_char *)&(x))[0] << 16 | (((u_char *)&(x))[1] << 24))) 72 73 struct cac_ccb { 74 /* Data the controller will touch - 276 bytes */ 75 struct cac_hdr ccb_hdr; 76 struct cac_req ccb_req; 77 struct cac_sgb ccb_seg[CAC_SG_SIZE]; 78 79 /* Data the controller won't touch */ 80 int ccb_flags; 81 int ccb_datasize; 82 paddr_t ccb_paddr; 83 bus_dmamap_t ccb_dmamap_xfer; 84 SIMPLEQ_ENTRY(cac_ccb) ccb_chain; 85 struct scsi_xfer *ccb_xs; 86 }; 87 88 #define CAC_CCB_DATA_IN 0x0001 /* Map describes inbound xfer */ 89 #define CAC_CCB_DATA_OUT 0x0002 /* Map describes outbound xfer */ 90 #define CAC_CCB_ACTIVE 0x0004 /* Command submitted to controller */ 91 92 struct cac_softc; 93 94 struct cac_linkage { 95 struct cac_ccb *(*cl_completed)(struct cac_softc *); 96 int (*cl_fifo_full)(struct cac_softc *); 97 void (*cl_intr_enable)(struct cac_softc *, int); 98 int (*cl_intr_pending)(struct cac_softc *); 99 void (*cl_submit)(struct cac_softc *, struct cac_ccb *); 100 }; 101 102 struct cac_softc { 103 struct device sc_dv; 104 bus_space_tag_t sc_iot; 105 bus_space_handle_t sc_ioh; 106 bus_dma_tag_t sc_dmat; 107 bus_dmamap_t sc_dmamap; 108 int sc_nunits; 109 void *sc_ih; 110 struct scsi_link sc_link; 111 const struct cac_linkage *sc_cl; 112 caddr_t sc_ccbs; 113 paddr_t sc_ccbs_paddr; 114 SIMPLEQ_HEAD(, cac_ccb) sc_ccb_free; 115 SIMPLEQ_HEAD(, cac_ccb) sc_ccb_queue; 116 struct cac_drive_info *sc_dinfos; 117 }; 118 119 int cac_init __P((struct cac_softc *, int)); 120 int cac_intr __P((void *)); 121 122 extern const struct cac_linkage cac_l0; 123 124 #endif /* !_IC_CACVAR_H_ */ 125