1 /* $OpenBSD: dptvar.h,v 1.2 2002/03/14 01:26:54 millert Exp $ */
2 /* $NetBSD: dptvar.h,v 1.5 1999/10/23 16:26:32 ad Exp $ */
3
4 /*
5 * Copyright (c) 1999 Andy Doran <ad@NetBSD.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31 #ifndef _IC_DPTVAR_H_
32 #define _IC_DPTVAR_H_ 1
33 #ifdef _KERNEL
34
35 #define CCB_OFF(sc,m) ((u_long)(m) - (u_long)((sc)->sc_ccbs))
36
37 #define CCB_ALLOC 0x01 /* CCB allocated */
38 #define CCB_ABORT 0x02 /* abort has been issued on this CCB */
39 #define CCB_INTR 0x04 /* HBA interrupted for this CCB */
40 #define CCB_PRIVATE 0x08 /* ours; don't talk to scsipi when done */
41
42 struct dpt_ccb {
43 struct eata_cp ccb_eata_cp; /* EATA command packet */
44 struct eata_sg ccb_sg[DPT_SG_SIZE]; /* SG element list */
45 volatile int ccb_flg; /* CCB flags */
46 int ccb_timeout; /* timeout in ms */
47 u_int32_t ccb_ccbpa; /* physical addr of this CCB */
48 bus_dmamap_t ccb_dmamap_xfer; /* dmamap for data xfers */
49 int ccb_hba_status; /* from status packet */
50 int ccb_scsi_status; /* from status packet */
51 int ccb_id; /* unique ID of this CCB */
52 TAILQ_ENTRY(dpt_ccb) ccb_chain; /* link to next CCB */
53 #ifdef __NetBSD__
54 struct scsipi_sense_data ccb_sense; /* SCSI sense data on error */
55 struct scsipi_xfer *ccb_xs; /* initiating SCSI command */
56 #endif /* __NetBSD__ */
57 #ifdef __OpenBSD__
58 struct scsi_sense_data ccb_sense;
59 struct scsi_xfer *ccb_xs;
60 #endif /* __OpenBSD__ */
61 };
62
63 struct dpt_softc {
64 struct device sc_dv; /* generic device data */
65 bus_space_handle_t sc_ioh; /* bus space handle */
66 #ifdef __NetBSD__
67 struct scsipi_adapter sc_adapter;/* scsipi adapter */
68 struct scsipi_link sc_link[3]; /* prototype link for each channel */
69 #endif /* __NetBSD__ */
70 #ifdef __OpenBSD__
71 struct scsi_adapter sc_adapter;/* scsipi adapter */
72 struct scsi_link sc_link[3]; /* prototype link for each channel */
73 #endif /* __OpenBSD__ */
74 struct eata_cfg sc_ec; /* EATA configuration data */
75 bus_space_tag_t sc_iot; /* bus space tag */
76 bus_dma_tag_t sc_dmat; /* bus DMA tag */
77 bus_dmamap_t sc_dmamap_ccb; /* maps the CCBs */
78 void *sc_ih; /* interrupt handler cookie */
79 void *sc_sdh; /* shutdown hook */
80 struct dpt_ccb *sc_ccbs; /* all our CCBs */
81 struct eata_sp *sc_statpack; /* EATA status packet */
82 int sc_spoff; /* status packet offset in dmamap */
83 u_int32_t sc_sppa; /* status packet physical address */
84 caddr_t sc_scr; /* scratch area */
85 int sc_scrlen; /* scratch area length */
86 int sc_scroff; /* scratch area offset in dmamap */
87 u_int32_t sc_scrpa; /* scratch area physical address */
88 int sc_hbaid[3]; /* ID of HBA on each channel */
89 int sc_nccbs; /* number of CCBs available */
90 int sc_open; /* device is open */
91 TAILQ_HEAD(, dpt_ccb) sc_free_ccb;/* free ccb list */
92 #ifdef __NetBSD__
93 TAILQ_HEAD(, scsipi_xfer) sc_queue;/* pending commands */
94 #endif /* __NetBSD__ */
95 #ifdef __OpenBSD__
96 LIST_HEAD(, scsi_xfer) sc_queue;/* pending commands */
97 struct scsi_xfer *sc_queuelast;
98 #endif /* __NetBSD__ */
99 };
100
101 int dpt_intr(void *);
102 int dpt_readcfg(struct dpt_softc *);
103 void dpt_init(struct dpt_softc *, const char *);
104 void dpt_shutdown(void *);
105 void dpt_timeout(void *);
106 void dpt_minphys(struct buf *);
107 #ifdef __NetBSD__
108 int dpt_scsi_cmd(struct scsipi_xfer *);
109 #endif /* __NetBSD__ */
110 #ifdef __OpenBSD__
111 int dpt_scsi_cmd(struct scsi_xfer *);
112 #endif /* __OpenBSD__ */
113 int dpt_wait(struct dpt_softc *, u_int8_t, u_int8_t, int);
114 int dpt_poll(struct dpt_softc *, struct dpt_ccb *);
115 int dpt_cmd(struct dpt_softc *, struct eata_cp *, u_int32_t, int, int);
116 void dpt_hba_inquire(struct dpt_softc *, struct eata_inquiry_data **);
117 void dpt_reset_ccb(struct dpt_softc *, struct dpt_ccb *);
118 void dpt_free_ccb(struct dpt_softc *, struct dpt_ccb *);
119 void dpt_done_ccb(struct dpt_softc *, struct dpt_ccb *);
120 int dpt_init_ccb(struct dpt_softc *, struct dpt_ccb *);
121 int dpt_create_ccbs(struct dpt_softc *, struct dpt_ccb *, int);
122 struct dpt_ccb *dpt_alloc_ccb(struct dpt_softc *, int);
123 #ifdef DEBUG
124 void dpt_dump_sp(struct eata_sp *);
125 #endif
126
127 #endif /* _KERNEL */
128 #endif /* !defined _IC_DPTVAR_H_ */