master
  1/*	$NetBSD: scsipiconf.h,v 1.130 2019/03/28 10:44:29 kardel Exp $	*/
  2
  3/*-
  4 * Copyright (c) 1998, 1999, 2000, 2004 The NetBSD Foundation, Inc.
  5 * All rights reserved.
  6 *
  7 * This code is derived from software contributed to The NetBSD Foundation
  8 * by Charles M. Hannum; by Jason R. Thorpe of the Numerical Aerospace
  9 * Simulation Facility, NASA Ames Research Center.
 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 *
 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 30 * POSSIBILITY OF SUCH DAMAGE.
 31 */
 32
 33/*
 34 * Originally written by Julian Elischer (julian@tfs.com)
 35 * for TRW Financial Systems for use under the MACH(2.5) operating system.
 36 *
 37 * TRW Financial Systems, in accordance with their agreement with Carnegie
 38 * Mellon University, makes this software available to CMU to distribute
 39 * or use in any manner that they see fit as long as this message is kept with
 40 * the software. For this reason TFS also grants any other persons or
 41 * organisations permission to use or modify this software.
 42 *
 43 * TFS supplies this software to be publicly redistributed
 44 * on the understanding that TFS is not responsible for the correct
 45 * functioning of this software in any circumstances.
 46 *
 47 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
 48 */
 49
 50#ifndef _DEV_SCSIPI_SCSIPICONF_H_
 51#define _DEV_SCSIPI_SCSIPICONF_H_
 52
 53typedef	int	boolean;
 54
 55#include <sys/callout.h>
 56#include <sys/queue.h>
 57#include <sys/condvar.h>
 58#include <dev/scsipi/scsi_spc.h>
 59#include <dev/scsipi/scsipi_debug.h>
 60
 61struct buf;
 62struct proc;
 63struct device;
 64struct scsipi_channel;
 65struct scsipi_periph;
 66struct scsipi_xfer;
 67
 68/*
 69 * The following defines the scsipi_xfer queue.
 70 */
 71TAILQ_HEAD(scsipi_xfer_queue, scsipi_xfer);
 72
 73struct scsipi_generic {
 74	u_int8_t opcode;
 75	u_int8_t bytes[15];
 76};
 77
 78
 79/*
 80 * scsipi_async_event_t:
 81 *
 82 *	Asynchronous events from the adapter to the mid-layer and
 83 *	peripheral.
 84 *
 85 *	Arguments:
 86 *
 87 *	ASYNC_EVENT_MAX_OPENINGS	scsipi_max_openings * -- max
 88 *					openings, device specified in
 89 *					parameters
 90 *
 91 *	ASYNC_EVENT_XFER_MODE		scsipi_xfer_mode * -- xfer mode
 92 *					parameters changed for I_T Nexus
 93 *	ASYNC_EVENT_RESET		NULL - channel has been reset
 94 */
 95typedef enum {
 96	ASYNC_EVENT_MAX_OPENINGS,	/* set max openings on periph */
 97	ASYNC_EVENT_XFER_MODE,		/* xfer mode update for I_T */
 98	ASYNC_EVENT_RESET		/* channel reset */
 99} scsipi_async_event_t;
100
101/*
102 * scsipi_max_openings:
103 *
104 *	Argument for an ASYNC_EVENT_MAX_OPENINGS event.
105 */
106struct scsipi_max_openings {
107	int	mo_target;		/* openings are for this target... */
108	int	mo_lun;			/* ...and this lun */
109	int	mo_openings;		/* openings value */
110};
111
112/*
113 * scsipi_xfer_mode:
114 *
115 *	Argument for an ASYNC_EVENT_XFER_MODE event.
116 */
117struct scsipi_xfer_mode {
118	int	xm_target;		/* target, for I_T Nexus */
119	int	xm_mode;		/* PERIPH_CAP* bits */
120	int	xm_period;		/* sync period */
121	int	xm_offset;		/* sync offset */
122};
123
124
125/*
126 * scsipi_adapter_req_t:
127 *
128 *	Requests that can be made of an adapter.
129 *
130 *	Arguments:
131 *
132 *	ADAPTER_REQ_RUN_XFER		scsipi_xfer * -- the xfer which
133 *					is to be run
134 *
135 *	ADAPTER_REQ_GROW_RESOURCES	no argument
136 *
137 *	ADAPTER_REQ_SET_XFER_MODE	scsipi_xfer_mode * -- set the xfer
138 *					mode for the I_T Nexus according to
139 *					this
140 */
141typedef enum {
142	ADAPTER_REQ_RUN_XFER,		/* run a scsipi_xfer */
143	ADAPTER_REQ_GROW_RESOURCES,	/* grow xfer execution resources */
144	ADAPTER_REQ_SET_XFER_MODE	/* set xfer mode */
145} scsipi_adapter_req_t;
146
147#ifdef _KERNEL
148/*
149 * scsipi_periphsw:
150 *
151 *	Callbacks into periph driver from midlayer.
152 *
153 *	psw_error	Called by the bustype's interpret-sense routine
154 *			to do periph-specific sense handling.
155 *
156 *	psw_start	Called by midlayer to restart a device once
157 *			more command openings become available.
158 *
159 *	psw_async	Called by midlayer when an asynchronous event
160 *			from the adapter occurs.
161 *
162 *	psw_done	Called by the midlayer when an xfer has completed.
163 */
164struct scsipi_periphsw {
165	int	(*psw_error)(struct scsipi_xfer *);
166	void	(*psw_start)(struct scsipi_periph *);
167	int	(*psw_async)(struct scsipi_periph *,
168		    scsipi_async_event_t, void *);
169	void	(*psw_done)(struct scsipi_xfer *, int);
170};
171
172struct disk_parms;
173struct scsipi_inquiry_pattern;
174
175/*
176 * scsipi_adapter:
177 *
178 *	This structure describes an instance of a SCSIPI adapter.
179 *
180 *	Note that `adapt_openings' is used by (the common case of) adapters
181 *	which have per-adapter resources.  If an adapter's command resources
182 *	are associated with a channel, then the `chan_openings' below will
183 *	be used instead.
184 *
185 *	Note that all adapter entry points take a pointer to a channel,
186 *	as an adapter may have more than one channel, and the channel
187 *	structure contains the channel number.
188 */
189struct scsipi_adapter {
190	device_t adapt_dev;	/* pointer to adapter's device */
191	int	adapt_nchannels;	/* number of adapter channels */
192	volatile int	adapt_refcnt;		/* adapter's reference count */
193	int	adapt_openings;		/* total # of command openings */
194	int	adapt_max_periph;	/* max openings per periph */
195	int	adapt_flags;
196
197	void	(*adapt_request)(struct scsipi_channel *,
198		    scsipi_adapter_req_t, void *);
199	void	(*adapt_minphys)(struct buf *);
200	int	(*adapt_ioctl)(struct scsipi_channel *, u_long,
201		    void *, int, struct proc *);
202	int	(*adapt_enable)(device_t, int);
203	int	(*adapt_getgeom)(struct scsipi_periph *,
204			struct disk_parms *, u_long);
205	int	(*adapt_accesschk)(struct scsipi_periph *,
206			struct scsipi_inquiry_pattern *);
207
208	kmutex_t adapt_mtx;
209	volatile int	adapt_running;	/* how many users of mutex */
210};
211
212/* adapt_flags */
213#define SCSIPI_ADAPT_POLL_ONLY	0x01 /* Adaptor can't do interrupts. */
214#define SCSIPI_ADAPT_MPSAFE     0x02 /* Adaptor doesn't need kernel lock */
215
216void scsipi_adapter_minphys(struct scsipi_channel *, struct buf *);
217void scsipi_adapter_request(struct scsipi_channel *,
218	scsipi_adapter_req_t, void *);
219int scsipi_adapter_ioctl(struct scsipi_channel *, u_long,
220	void *, int, struct proc *);
221int scsipi_adapter_enable(struct scsipi_adapter *, int);
222#endif
223
224
225/*
226 * scsipi_bustype:
227 *
228 *	This structure describes a SCSIPI bus type.
229 *	The bustype_type member is shared with struct ata_bustype
230 *	(because we can ata, atapi or scsi busses to the same controller)
231 */
232struct scsipi_bustype {
233	int	bustype_type;		/* symbolic name of type */
234
235	void	(*bustype_cmd)(struct scsipi_xfer *);
236	int	(*bustype_interpret_sense)(struct scsipi_xfer *);
237	void	(*bustype_printaddr)(struct scsipi_periph *);
238	void	(*bustype_kill_pending)(struct scsipi_periph *);
239	void	(*bustype_async_event_xfer_mode)(struct scsipi_channel *,
240		    void *);
241};
242
243/* bustype_type */
244/* type is stored in the first byte */
245#define SCSIPI_BUSTYPE_TYPE_SHIFT 0
246#define SCSIPI_BUSTYPE_TYPE(x) (((x) >> SCSIPI_BUSTYPE_TYPE_SHIFT) & 0xff)
247#define	SCSIPI_BUSTYPE_SCSI	0 /* parallel SCSI */
248#define	SCSIPI_BUSTYPE_ATAPI	1
249/* #define SCSIPI_BUSTYPE_ATA	2 */
250/* subtype is stored in the second byte */
251#define SCSIPI_BUSTYPE_SUBTYPE_SHIFT 8
252#define SCSIPI_BUSTYPE_SUBTYPE(x) (((x) >> SCSIPI_BUSTYPE_SUBTYPE_SHIFT) & 0xff)
253
254#define SCSIPI_BUSTYPE_BUSTYPE(t, s) \
255    ((t) << SCSIPI_BUSTYPE_TYPE_SHIFT | (s) << SCSIPI_BUSTYPE_SUBTYPE_SHIFT)
256/* subtypes are defined in each bus type headers */
257
258/*
259 * scsipi_channel:
260 *
261 *	This structure describes a single channel of a SCSIPI adapter.
262 *	An adapter may have one or more channels.  See the comment above
263 *	regarding the resource counter.
264 *	Note: chan_bustype has to be first member, as its bustype_type member
265 * 	is shared with the aa_bustype member of struct ata_atapi_attach.
266 */
267
268#define	SCSIPI_CHAN_PERIPH_BUCKETS	16
269#define	SCSIPI_CHAN_PERIPH_HASHMASK	(SCSIPI_CHAN_PERIPH_BUCKETS - 1)
270
271#ifdef _KERNEL
272struct scsipi_channel {
273	const struct scsipi_bustype *chan_bustype; /* channel's bus type */
274	const char *chan_name;	/* this channel's name */
275
276	struct scsipi_adapter *chan_adapter; /* pointer to our adapter */
277
278	/* Periphs for this channel. */
279	LIST_HEAD(, scsipi_periph) chan_periphtab[SCSIPI_CHAN_PERIPH_BUCKETS];
280
281	int	chan_channel;		/* channel number */
282	int	chan_flags;		/* channel flags */
283	int	chan_openings;		/* number of command openings */
284	int	chan_max_periph;	/* max openings per periph */
285
286	int	chan_ntargets;		/* number of targets */
287	int	chan_nluns;		/* number of luns */
288	int	chan_id;		/* adapter's ID for this channel */
289
290	int	chan_defquirks;		/* default device's quirks */
291
292	struct lwp *chan_dthread;	/* discovery thread */
293	struct lwp *chan_thread;	/* completion thread */
294	int	chan_tflags;		/* flags for the completion thread */
295
296	int	chan_qfreeze;		/* freeze count for queue */
297
298	/* Job queue for this channel. */
299	struct scsipi_xfer_queue chan_queue;
300
301	/* Completed (async) jobs. */
302	struct scsipi_xfer_queue chan_complete;
303
304	/* callback we may have to call from completion thread */
305	void (*chan_callback)(struct scsipi_channel *, void *);
306	void *chan_callback_arg;
307
308	/* callback we may have to call after forking the kthread */
309	void (*chan_init_cb)(struct scsipi_channel *, void *);
310	void *chan_init_cb_arg;
311
312	kcondvar_t chan_cv_comp;
313	kcondvar_t chan_cv_thr;
314	kcondvar_t chan_cv_xs;
315
316#define chan_cv_complete(ch) (&(ch)->chan_cv_comp)
317#define chan_cv_thread(ch) (&(ch)->chan_cv_thr)
318};
319
320#define chan_running(ch) ((ch)->chan_adapter->adapt_running)
321#define chan_mtx(ch) (&(ch)->chan_adapter->adapt_mtx)
322#endif
323
324/* chan_flags */
325#define	SCSIPI_CHAN_OPENINGS	0x01	/* use chan_openings */
326#define	SCSIPI_CHAN_CANGROW	0x02	/* channel can grow resources */
327#define	SCSIPI_CHAN_NOSETTLE	0x04	/* don't wait for devices to settle */
328#define	SCSIPI_CHAN_TACTIVE	0x08	/* completion thread is active */
329
330/* chan thread flags (chan_tflags) */
331#define	SCSIPI_CHANT_SHUTDOWN	0x01	/* channel is shutting down */
332#define	SCSIPI_CHANT_CALLBACK	0x02	/* has to call chan_callback() */
333#define	SCSIPI_CHANT_KICK	0x04	/* need to run queues */
334#define	SCSIPI_CHANT_GROWRES	0x08	/* call ADAPTER_REQ_GROW_RESOURCES */
335
336#define	SCSIPI_CHAN_MAX_PERIPH(chan)					\
337	(((chan)->chan_flags & SCSIPI_CHAN_OPENINGS) ?			\
338	 (chan)->chan_max_periph : (chan)->chan_adapter->adapt_max_periph)
339
340
341#define	scsipi_printaddr(periph)					\
342	(*(periph)->periph_channel->chan_bustype->bustype_printaddr)((periph))
343
344#define	scsipi_periph_bustype(periph)					\
345	(periph)->periph_channel->chan_bustype->bustype_type
346
347
348/*
349 * Number of tag words in a periph structure:
350 *
351 *	n_tag_words = ((256 / NBBY) / sizeof(u_int32_t))
352 */
353#define	PERIPH_NTAGWORDS	((256 / 8) / sizeof(u_int32_t))
354
355#ifdef _KERNEL
356/*
357 * scsipi_opcodes:
358 *      This optionally allocated structure documents
359 *      valid opcodes and timeout values for the respective
360 *      opcodes overriding the requested timeouts.
361 *      It is created when SCSI_MAINTENANCE_IN/
362 *      RSOC_REPORT_SUPPORTED_OPCODES can provide information
363 *      at attach time.
364 */
365struct scsipi_opcodes 
366{
367	struct scsipi_opinfo
368	{
369		long          ti_timeout;	/* timeout in seconds (> 0 => VALID) */
370		unsigned long ti_flags;
371#define SCSIPI_TI_VALID  0x0001	        /* valid op code */
372#define SCSIPI_TI_LOGGED 0x8000	        /* override logged during debug */
373	} opcode_info[0x100];
374};
375
376/*
377 * scsipi_periph:
378 *
379 *	This structure describes the path between a peripheral device
380 *	and an adapter.  It contains a pointer to the adapter channel
381 *	which in turn contains a pointer to the adapter.
382 *
383 * XXX Given the way NetBSD's autoconfiguration works, this is ...
384 * XXX nasty.
385 *
386 *	Well, it's a lot nicer than it used to be, but there could
387 *	still be an improvement.
388 */
389struct scsipi_periph {
390	device_t periph_dev;	/* pointer to peripheral's device */
391	struct scsipi_channel *periph_channel; /* channel we're connected to */
392
393					/* link in channel's table of periphs */
394	LIST_ENTRY(scsipi_periph) periph_hash;
395
396	const struct scsipi_periphsw *periph_switch; /* peripheral's entry
397							points */
398	int	periph_openings;	/* max # of outstanding commands */
399	int	periph_active;		/* current # of outstanding commands */
400	int	periph_sent;		/* current # of commands sent to adapt*/
401
402	int	periph_mode;		/* operation modes, CAP bits */
403	int	periph_period;		/* sync period (factor) */
404	int	periph_offset;		/* sync offset */
405
406	/*
407	 * Information gleaned from the inquiry data.
408	 */
409	u_int8_t periph_type;		/* basic device type */
410	int	periph_cap;		/* capabilities */
411	int	periph_quirks;		/* device's quirks */
412
413	int	periph_flags;		/* misc. flags */
414	int	periph_dbflags;		/* debugging flags */
415
416	int	periph_target;		/* target ID (drive # on ATAPI) */
417	int	periph_lun;		/* LUN (not used on ATAPI) */
418
419	int	periph_version;		/* ANSI SCSI version */
420
421	int	periph_qfreeze;		/* queue freeze count */
422
423	/* available opcodes and timeout information */
424	struct scsipi_opcodes *periph_opcs;
425	
426	/* Bitmap of free command tags. */
427	u_int32_t periph_freetags[PERIPH_NTAGWORDS];
428
429	/* Pending scsipi_xfers on this peripheral. */
430	struct scsipi_xfer_queue periph_xferq;
431
432	callout_t periph_callout;
433
434	/* xfer which has a pending CHECK_CONDITION */
435	struct scsipi_xfer *periph_xscheck;
436
437	kcondvar_t periph_cv;
438#define periph_cv_periph(p) (&(p)->periph_cv)
439#define periph_cv_active(p) (&(p)->periph_cv)
440};
441#endif
442
443/*
444 * Macro to return the current xfer mode of a periph.
445 */
446#define	PERIPH_XFER_MODE(periph)					\
447	(((periph)->periph_flags & PERIPH_MODE_VALID) ?			\
448	 (periph)->periph_mode : 0)
449
450/* periph_cap */
451#define	PERIPH_CAP_ANEC		0x0001	/* async event notification */
452#define	PERIPH_CAP_TERMIOP	0x0002	/* terminate i/o proc. messages */
453#define	PERIPH_CAP_RELADR	0x0004	/* relative addressing */
454#define	PERIPH_CAP_WIDE32	0x0008	/* wide-32 transfers */
455#define	PERIPH_CAP_WIDE16	0x0010	/* wide-16 transfers */
456		/*	XXX	0x0020	   reserved for ATAPI_CFG_DRQ_MASK */
457		/*	XXX	0x0040	   reserved for ATAPI_CFG_DRQ_MASK */
458#define	PERIPH_CAP_SYNC		0x0080	/* synchronous transfers */
459#define	PERIPH_CAP_LINKCMDS	0x0100	/* linked commands */
460#define	PERIPH_CAP_TQING	0x0200	/* tagged queueing */
461#define	PERIPH_CAP_SFTRESET	0x0400	/* soft RESET condition response */
462#define	PERIPH_CAP_CMD16	0x0800	/* 16 byte commands (ATAPI) */
463#define	PERIPH_CAP_DT		0x1000	/* supports DT clock */
464#define	PERIPH_CAP_QAS		0x2000	/* supports quick arbit. and select. */
465#define	PERIPH_CAP_IUS		0x4000	/* supports information unit xfers */
466
467/* periph_flags */
468#define	PERIPH_REMOVABLE	0x0001	/* media is removable */
469#define	PERIPH_MEDIA_LOADED	0x0002	/* media is loaded */
470#define	PERIPH_WAITING		0x0004	/* process waiting for opening */
471#define	PERIPH_OPEN		0x0008	/* device is open */
472#define	PERIPH_WAITDRAIN	0x0010	/* waiting for pending xfers to drain */
473#define	PERIPH_GROW_OPENINGS	0x0020	/* allow openings to grow */
474#define	PERIPH_MODE_VALID	0x0040	/* periph_mode is valid */
475#define	PERIPH_RECOVERING	0x0080	/* periph is recovering */
476#define	PERIPH_RECOVERY_ACTIVE	0x0100	/* a recovery command is active */
477#define PERIPH_KEEP_LABEL	0x0200	/* retain label after 'full' close */
478#define	PERIPH_SENSE		0x0400	/* periph has sense pending */
479#define PERIPH_UNTAG		0x0800	/* untagged command running */
480
481/* periph_quirks */
482#define	PQUIRK_AUTOSAVE		0x00000001	/* do implicit SAVE POINTERS */
483#define	PQUIRK_NOSYNC		0x00000002	/* does not grok SDTR */
484#define	PQUIRK_NOWIDE		0x00000004	/* does not grok WDTR */
485#define	PQUIRK_NOTAG		0x00000008	/* does not grok tagged cmds */
486#define	PQUIRK_NOLUNS		0x00000010	/* DTWT with LUNs */
487#define	PQUIRK_FORCELUNS	0x00000020	/* prehistoric device groks
488						   LUNs */
489#define	PQUIRK_NOMODESENSE	0x00000040	/* device doesn't do MODE SENSE
490						   properly */
491#define	PQUIRK_NOSYNCCACHE	0x00000100	/* do not issue SYNC CACHE */
492#define	PQUIRK_LITTLETOC	0x00000400	/* audio TOC is little-endian */
493#define	PQUIRK_NOCAPACITY	0x00000800	/* no READ CD CAPACITY */
494#define	PQUIRK_NOTUR		0x00001000	/* no TEST UNIT READY */
495#define	PQUIRK_NODOORLOCK	0x00002000	/* can't lock door */
496#define	PQUIRK_NOSENSE		0x00004000	/* can't REQUEST SENSE */
497#define PQUIRK_ONLYBIG		0x00008000	/* only use SCSI_{R,W}_BIG */
498#define PQUIRK_NOBIGMODESENSE	0x00040000	/* has no big mode-sense op */
499#define PQUIRK_CAP_SYNC		0x00080000	/* SCSI device with ST sync op*/
500#define PQUIRK_CAP_WIDE16	0x00100000	/* SCSI device with ST wide op*/
501#define PQUIRK_CAP_NODT		0x00200000	/* signals DT, but can't. */
502#define PQUIRK_START		0x00400000	/* needs start before tur */
503#define	PQUIRK_NOFUA		0x00800000	/* does not grok FUA */
504#define PQUIRK_NOREPSUPPOPC     0x01000000      /* does not grok
505						   REPORT SUPPORTED OPCODES
506						   to fetch device timeouts */
507/*
508 * Error values an adapter driver may return
509 */
510typedef enum {
511	XS_NOERROR,		/* there is no error, (sense is invalid)  */
512	XS_SENSE,		/* Check the returned sense for the error */
513	XS_SHORTSENSE,		/* Check the ATAPI sense for the error	  */
514	XS_DRIVER_STUFFUP,	/* Driver failed to perform operation     */
515	XS_RESOURCE_SHORTAGE,	/* adapter resource shortage		  */
516	XS_SELTIMEOUT,		/* The device timed out.. turned off?     */
517	XS_TIMEOUT,		/* The Timeout reported was caught by SW  */
518	XS_BUSY,		/* The device busy, try again later?      */
519	XS_RESET,		/* bus was reset; possible retry command  */
520	XS_REQUEUE		/* requeue this command */
521} scsipi_xfer_result_t;
522
523#ifdef _KERNEL
524/*
525 * Each scsipi transaction is fully described by one of these structures
526 * It includes information about the source of the command and also the
527 * device and adapter for which the command is destined.
528 *
529 * Before the HBA is given this transaction, channel_q is the linkage on
530 * the related channel's chan_queue.
531 *
532 * When the this transaction is taken off the channel's chan_queue and
533 * the HBA's request entry point is called with this transaction, the
534 * HBA can use the channel_q tag for whatever it likes until it calls
535 * scsipi_done for this transaction, at which time it has to stop
536 * using channel_q.
537 *
538 * After scsipi_done is called with this transaction and if there was an
539 * error on it, channel_q then becomes the linkage on the related channel's
540 * chan_complete cqueue.
541 *
542 * The device_q member is maintained by the scsipi middle layer.  When
543 * a device issues a command, the xfer is placed on that device's
544 * pending commands queue.  When an xfer is done and freed, it is taken
545 * off the device's queue.  This allows for a device to wait for all of
546 * its pending commands to complete.
547 */
548struct scsipi_xfer {
549	TAILQ_ENTRY(scsipi_xfer) channel_q; /* entry on channel queue */
550	TAILQ_ENTRY(scsipi_xfer) device_q;  /* device's pending xfers */
551	callout_t xs_callout;		/* callout for adapter use */
552	int	xs_control;		/* control flags */
553	volatile int xs_status;		/* status flags */
554	struct scsipi_periph *xs_periph;/* peripheral doing the xfer */
555	int	xs_retries;		/* the number of times to retry */
556	int	xs_requeuecnt;		/* number of requeues */
557	int	timeout;		/* in milliseconds */
558	struct	scsipi_generic *cmd;	/* The scsipi command to execute */
559	int	cmdlen;			/* how long it is */
560	u_char	*data;			/* DMA address OR a uio address */
561	int	datalen;		/* data len (blank if uio) */
562	int	resid;			/* how much buffer was not touched */
563	scsipi_xfer_result_t error;	/* an error value */
564	struct	buf *bp;		/* If we need to associate with */
565					/* a buf */
566	union {
567		struct  scsi_sense_data scsi_sense; /* 32 bytes */
568		u_int32_t atapi_sense;
569	} sense;
570
571	struct scsipi_xfer *xs_sensefor;/* we are requesting sense for this */
572					/* xfer */
573
574	u_int8_t status;		/* SCSI status */
575
576	/*
577	 * Info for tagged command queueing.  This may or may not
578	 * be used by a given adapter driver.  These are the same
579	 * as the bytes in the tag message.
580	 */
581	u_int8_t xs_tag_type;		/* tag type */
582	u_int8_t xs_tag_id;		/* tag ID */
583
584	struct	scsipi_generic cmdstore
585	    __aligned(4);		/* stash the command in here */
586
587#define xs_cv(xs) (&(xs)->xs_periph->periph_channel->chan_cv_xs)
588};
589#endif
590
591/*
592 * scsipi_xfer control flags
593 *
594 * To do:
595 *
596 *	- figure out what to do with XS_CTL_ESCAPE
597 *
598 *	- replace XS_CTL_URGENT with an `xs_priority' field?
599 */
600#define	XS_CTL_NOSLEEP		0x00000001	/* don't sleep */
601#define	XS_CTL_POLL		0x00000002	/* poll for completion */
602#define	XS_CTL_DISCOVERY	0x00000004	/* doing device discovery */
603#define	XS_CTL_ASYNC		0x00000008	/* command completes
604						   asynchronously */
605#define	XS_CTL_USERCMD		0x00000010	/* user issued command */
606#define	XS_CTL_SILENT		0x00000020	/* don't print sense info */
607#define	XS_CTL_IGNORE_NOT_READY	0x00000040	/* ignore NOT READY */
608#define	XS_CTL_IGNORE_MEDIA_CHANGE 					\
609				0x00000080	/* ignore media change */
610#define	XS_CTL_IGNORE_ILLEGAL_REQUEST					\
611				0x00000100	/* ignore ILLEGAL REQUEST */
612#define	XS_CTL_SILENT_NODEV	0x00000200	/* don't print sense info
613						   if sense info is nodev */
614#define	XS_CTL_RESET		0x00000400	/* reset the device */
615#define	XS_CTL_DATA_UIO		0x00000800	/* xs_data points to uio */
616#define	XS_CTL_DATA_IN		0x00001000	/* data coming into memory */
617#define	XS_CTL_DATA_OUT		0x00002000	/* data going out of memory */
618#define	XS_CTL_TARGET		0x00004000	/* target mode operation */
619#define	XS_CTL_ESCAPE		0x00008000	/* escape operation */
620#define	XS_CTL_URGENT		0x00010000	/* urgent (recovery)
621						   operation */
622#define	XS_CTL_SIMPLE_TAG	0x00020000	/* use a Simple Tag */
623#define	XS_CTL_ORDERED_TAG	0x00040000	/* use an Ordered Tag */
624#define	XS_CTL_HEAD_TAG		0x00080000	/* use a Head of Queue Tag */
625#define	XS_CTL_THAW_PERIPH	0x00100000	/* thaw periph once enqueued */
626#define	XS_CTL_FREEZE_PERIPH	0x00200000	/* freeze periph when done */
627#define XS_CTL_REQSENSE		0x00800000	/* xfer is a request sense */
628
629#define	XS_CTL_TAGMASK	(XS_CTL_SIMPLE_TAG|XS_CTL_ORDERED_TAG|XS_CTL_HEAD_TAG)
630
631#define	XS_CTL_TAGTYPE(xs)	((xs)->xs_control & XS_CTL_TAGMASK)
632
633/*
634 * scsipi_xfer status flags
635 */
636#define	XS_STS_DONE		0x00000001	/* scsipi_xfer is done */
637#define	XS_STS_PRIVATE		0xf0000000	/* reserved for HBA's use */
638
639/*
640 * This describes matching information for scsipi_inqmatch().  The more things
641 * match, the higher the configuration priority.
642 */
643struct scsipi_inquiry_pattern {
644	u_int8_t type;
645	boolean removable;
646	const char *vendor;
647	const char *product;
648	const char *revision;
649};
650
651/*
652 * This is used to pass information from the high-level configuration code
653 * to the device-specific drivers.
654 */
655struct scsipibus_attach_args {
656	struct scsipi_periph *sa_periph;
657	struct scsipi_inquiry_pattern sa_inqbuf;
658	struct scsipi_inquiry_data *sa_inqptr;
659	union {				/* bus-type specific infos */
660		u_int8_t scsi_version;	/* SCSI version */
661	} scsipi_info;
662};
663
664/*
665 * this describes a quirk entry
666 */
667struct scsi_quirk_inquiry_pattern {
668	struct scsipi_inquiry_pattern pattern;
669	int quirks;
670};
671
672/*
673 * Default number of retries, used for generic routines.
674 */
675#define SCSIPIRETRIES 4
676
677
678#ifdef _KERNEL
679void	scsipi_init(void);
680void	scsipi_ioctl_init(void);
681void	scsipi_load_verbose(void);
682int	scsipi_command(struct scsipi_periph *, struct scsipi_generic *, int,
683	    u_char *, int, int, int, struct buf *, int);
684void	scsipi_create_completion_thread(void *);
685const void *scsipi_inqmatch(struct scsipi_inquiry_pattern *, const void *,
686	    size_t, size_t, int *);
687const char *scsipi_dtype(int);
688int	scsipi_execute_xs(struct scsipi_xfer *);
689int	scsipi_test_unit_ready(struct scsipi_periph *, int);
690int	scsipi_prevent(struct scsipi_periph *, int, int);
691int	scsipi_inquire(struct scsipi_periph *,
692	    struct scsipi_inquiry_data *, int);
693int	scsipi_mode_select(struct scsipi_periph *, int,
694	    struct scsi_mode_parameter_header_6 *, int, int, int, int);
695int	scsipi_mode_select_big(struct scsipi_periph *, int,
696	    struct scsi_mode_parameter_header_10 *, int, int, int, int);
697int	scsipi_mode_sense(struct scsipi_periph *, int, int,
698	    struct scsi_mode_parameter_header_6 *, int, int, int, int);
699int	scsipi_mode_sense_big(struct scsipi_periph *, int, int,
700	    struct scsi_mode_parameter_header_10 *, int, int, int, int);
701int	scsipi_start(struct scsipi_periph *, int, int);
702void	scsipi_done(struct scsipi_xfer *);
703void	scsipi_user_done(struct scsipi_xfer *);
704int	scsipi_interpret_sense(struct scsipi_xfer *);
705void	scsipi_wait_drain(struct scsipi_periph *);
706void	scsipi_kill_pending(struct scsipi_periph *);
707void    scsipi_get_opcodeinfo(struct scsipi_periph *periph);
708void    scsipi_free_opcodeinfo(struct scsipi_periph *periph);
709struct scsipi_periph *scsipi_alloc_periph(int);
710void	scsipi_free_periph(struct scsipi_periph *);
711
712/* Function pointers for scsiverbose module */
713extern int	(*scsipi_print_sense)(struct scsipi_xfer *, int);
714extern void	(*scsipi_print_sense_data)(struct scsi_sense_data *, int);
715
716int     scsipi_print_sense_stub(struct scsipi_xfer *, int);
717void    scsipi_print_sense_data_stub(struct scsi_sense_data *, int);
718
719extern int	scsi_verbose_loaded;
720
721void	scsipi_print_cdb(struct scsipi_generic *cmd);
722int	scsipi_thread_call_callback(struct scsipi_channel *,
723	    void (*callback)(struct scsipi_channel *, void *),
724	    void *);
725void	scsipi_async_event(struct scsipi_channel *,
726	    scsipi_async_event_t, void *);
727int	scsipi_do_ioctl(struct scsipi_periph *, dev_t, u_long, void *,
728	    int, struct lwp *);
729
730void	scsipi_set_xfer_mode(struct scsipi_channel *, int, int);
731
732int	scsipi_channel_init(struct scsipi_channel *);
733void	scsipi_channel_shutdown(struct scsipi_channel *);
734
735void	scsipi_insert_periph(struct scsipi_channel *,
736	    struct scsipi_periph *);
737void	scsipi_remove_periph(struct scsipi_channel *,
738	    struct scsipi_periph *);
739struct scsipi_periph *scsipi_lookup_periph(struct scsipi_channel *,
740	    int, int);
741struct scsipi_periph *scsipi_lookup_periph_locked(struct scsipi_channel *,
742	    int, int);
743int	scsipi_target_detach(struct scsipi_channel *, int, int, int);
744
745int	scsipi_adapter_addref(struct scsipi_adapter *);
746void	scsipi_adapter_delref(struct scsipi_adapter *);
747
748void	scsipi_channel_freeze(struct scsipi_channel *, int);
749void	scsipi_channel_thaw(struct scsipi_channel *, int);
750void	scsipi_channel_timed_thaw(void *);
751
752void	scsipi_periph_freeze(struct scsipi_periph *, int);
753void	scsipi_periph_thaw(struct scsipi_periph *, int);
754void	scsipi_periph_timed_thaw(void *);
755
756void	scsipi_periph_freeze_locked(struct scsipi_periph *, int);
757void	scsipi_periph_thaw_locked(struct scsipi_periph *, int);
758
759int	scsipi_sync_period_to_factor(int);
760int	scsipi_sync_factor_to_period(int);
761int	scsipi_sync_factor_to_freq(int);
762
763void	show_scsipi_xs(struct scsipi_xfer *);
764void	show_scsipi_cmd(struct scsipi_xfer *);
765void	show_mem(u_char *, int);
766#endif /* _KERNEL */
767
768static __inline void
769_lto2b(u_int32_t val, u_int8_t *bytes)
770{
771
772	bytes[0] = (val >> 8) & 0xff;
773	bytes[1] = val & 0xff;
774}
775
776static __inline void
777_lto3b(u_int32_t val, u_int8_t *bytes)
778{
779
780	bytes[0] = (val >> 16) & 0xff;
781	bytes[1] = (val >> 8) & 0xff;
782	bytes[2] = val & 0xff;
783}
784
785static __inline void
786_lto4b(u_int32_t val, u_int8_t *bytes)
787{
788
789	bytes[0] = (val >> 24) & 0xff;
790	bytes[1] = (val >> 16) & 0xff;
791	bytes[2] = (val >> 8) & 0xff;
792	bytes[3] = val & 0xff;
793}
794
795static __inline void
796_lto8b(u_int64_t val, u_int8_t *bytes)
797{
798
799	bytes[0] = (val >> 56) & 0xff;
800	bytes[1] = (val >> 48) & 0xff;
801	bytes[2] = (val >> 40) & 0xff;
802	bytes[3] = (val >> 32) & 0xff;
803	bytes[4] = (val >> 24) & 0xff;
804	bytes[5] = (val >> 16) & 0xff;
805	bytes[6] = (val >> 8)  & 0xff;
806	bytes[7] = val         & 0xff;
807}
808
809static __inline u_int32_t
810_2btol(const u_int8_t *bytes)
811{
812	u_int32_t rv;
813
814	rv = (bytes[0] << 8) |
815	     bytes[1];
816	return (rv);
817}
818
819static __inline u_int32_t
820_3btol(const u_int8_t *bytes)
821{
822	u_int32_t rv;
823
824	rv = (bytes[0] << 16) |
825	     (bytes[1] << 8) |
826	     bytes[2];
827	return (rv);
828}
829
830static __inline u_int32_t
831_4btol(const u_int8_t *bytes)
832{
833	u_int32_t rv;
834
835	rv = ((u_int32_t)bytes[0] << 24) |
836	     ((u_int32_t)bytes[1] << 16) |
837	     ((u_int32_t)bytes[2] << 8) |
838	     (u_int32_t)bytes[3];
839	return (rv);
840}
841
842static __inline u_int64_t
843_5btol(const u_int8_t *bytes)
844{
845	u_int64_t rv;
846
847	rv = ((u_int64_t)bytes[0] << 32) |
848	     ((u_int64_t)bytes[1] << 24) |
849	     ((u_int64_t)bytes[2] << 16) |
850	     ((u_int64_t)bytes[3] << 8) |
851	     (u_int64_t)bytes[4];
852	return (rv);
853}
854
855static __inline u_int64_t
856_8btol(const u_int8_t *bytes)
857{
858	u_int64_t rv;
859
860	rv = ((u_int64_t)bytes[0] << 56) |
861	     ((u_int64_t)bytes[1] << 48) |
862	     ((u_int64_t)bytes[2] << 40) |
863	     ((u_int64_t)bytes[3] << 32) |
864	     ((u_int64_t)bytes[4] << 24) |
865	     ((u_int64_t)bytes[5] << 16) |
866	     ((u_int64_t)bytes[6] << 8) |
867	     (u_int64_t)bytes[7];
868	return (rv);
869}
870
871static __inline void
872_lto2l(u_int32_t val, u_int8_t *bytes)
873{
874
875	bytes[0] = val & 0xff;
876	bytes[1] = (val >> 8) & 0xff;
877}
878
879static __inline void
880_lto3l(u_int32_t val, u_int8_t *bytes)
881{
882
883	bytes[0] = val & 0xff;
884	bytes[1] = (val >> 8) & 0xff;
885	bytes[2] = (val >> 16) & 0xff;
886}
887
888static __inline void
889_lto4l(u_int32_t val, u_int8_t *bytes)
890{
891
892	bytes[0] = val & 0xff;
893	bytes[1] = (val >> 8) & 0xff;
894	bytes[2] = (val >> 16) & 0xff;
895	bytes[3] = (val >> 24) & 0xff;
896}
897
898static __inline u_int32_t
899_2ltol(const u_int8_t *bytes)
900{
901	u_int32_t rv;
902
903	rv = bytes[0] |
904	     (bytes[1] << 8);
905	return (rv);
906}
907
908static __inline u_int32_t
909_3ltol(const u_int8_t *bytes)
910{
911	u_int32_t rv;
912
913	rv = bytes[0] |
914	     (bytes[1] << 8) |
915	     (bytes[2] << 16);
916	return (rv);
917}
918
919static __inline u_int32_t
920_4ltol(const u_int8_t *bytes)
921{
922	u_int32_t rv;
923
924	rv = (u_int32_t)bytes[0] |
925	     ((u_int32_t)bytes[1] << 8) |
926	     ((u_int32_t)bytes[2] << 16) |
927	     ((u_int32_t)bytes[3] << 24);
928	return (rv);
929}
930
931#endif /* _DEV_SCSIPI_SCSIPICONF_H_ */