1 /*     $NetBSD: scsiio.h,v 1.13 2020/05/18 09:52:30 rkujawa Exp $        */
2 
3 #ifndef _SYS_SCSIIO_H_
4 #define _SYS_SCSIIO_H_
5 
6 
7 #include <sys/types.h>
8 #include <sys/ioctl.h>
9 
10 #define   SENSEBUFLEN 48
11 
12 typedef struct      scsireq {
13           u_long    flags;              /* info about the request status and type */
14           u_long    timeout;
15           u_char    cmd[16];
16           u_char    cmdlen;
17           void *    databuf;  /* address in user space of buffer */
18           u_long    datalen;  /* size of user buffer (request) */
19           u_long    datalen_used;       /* size of user buffer (used)*/
20           u_char    sense[SENSEBUFLEN]; /* returned sense will be in here */
21           u_char    senselen; /* sensedata request size (MAX of SENSEBUFLEN)*/
22           u_char    senselen_used;      /* return value only */
23           u_char    status;             /* what the scsi status was from the adapter */
24           u_char    retsts;             /* the return status for the command */
25           int       error;              /* error bits */
26 } scsireq_t;
27 
28 /* bit definitions for flags */
29 #define SCCMD_READ            0x00000001
30 #define SCCMD_WRITE           0x00000002
31 #define SCCMD_IOV             0x00000004
32 #define SCCMD_ESCAPE                    0x00000010
33 #define SCCMD_TARGET                    0x00000020
34 
35 
36 /* definitions for the return status (retsts) */
37 #define SCCMD_OK    0x00
38 #define SCCMD_TIMEOUT         0x01
39 #define SCCMD_BUSY  0x02
40 #define SCCMD_SENSE 0x03
41 #define SCCMD_UNKNOWN         0x04
42 
43 #define SCIOCCOMMAND          _IOWR('Q', 1, scsireq_t)
44 
45 #define SC_DB_CMDS  0x00000001          /* show all scsi cmds and errors */
46 #define SC_DB_FLOW  0x00000002          /* show routines entered      */
47 #define SC_DB_FLOW2 0x00000004          /* show path INSIDE routines  */
48 #define SC_DB_DMA   0x00000008          /* show DMA segments etc      */
49 #define SCIOCDEBUG  _IOW('Q', 2, int)   /* from 0 to 15 */
50 
51 struct    oscsi_addr {
52           int       scbus;              /* -1 if wildcard */
53           int       target;             /* -1 if wildcard */
54           int       lun;                /* -1 if wildcard */
55 };
56 
57 struct    scsi_addr {
58           int type;       /* bus type */
59 #define TYPE_SCSI 0
60 #define TYPE_ATAPI 1
61           union {
62                     struct oscsi_addr scsi;
63                     struct _atapi {
64                               int atbus;  /* -1 if wildcard */
65                               int drive;  /* -1 if wildcard */
66                     } atapi;
67           } addr;
68 };
69 
70 /*
71  * SCSI device ioctls
72  */
73 
74 #define SCIOCIDENTIFY         _IOR('Q', 4, struct scsi_addr) /* where are you? */
75 #define  OSCIOCIDENTIFY       _IOR('Q', 4, struct oscsi_addr)
76 #define SCIOCDECONFIG         _IO('Q', 5)         /* please disappear */
77 #define SCIOCRECONFIG         _IO('Q', 6)         /* please check again */
78 #define SCIOCRESET  _IO('Q', 7)         /* reset the device */
79 
80 /*
81  * SCSI bus ioctls
82  */
83 
84 /* Scan bus for new devices. */
85 struct scbusioscan_args {
86           int       sa_target;          /* target to scan; -1 for wildcard */
87           int       sa_lun;             /* lun to scan; -1 for wildcard */
88 };
89 #define   SCBUSIOSCAN         _IOW('U', 0, struct scbusioscan_args)
90 
91 #define   SCBUSIORESET        _IO('U', 1)         /* reset SCSI bus */
92 
93 struct scbusiodetach_args {
94           int       sa_target;          /* target to scan; -1 for wildcard */
95           int       sa_lun;             /* lun to scan; -1 for wildcard */
96 };
97 #define   SCBUSIODETACH       _IOW('U', 2, struct scbusiodetach_args)
98 
99 /* enable/disable device properties */
100 struct scbusaccel_args {
101           int       sa_target;          /* target to set property on */
102           int       sa_lun;             /* lun to set property on */
103           int       sa_flags; /* flags to set or clear */
104 };
105 #define   SC_ACCEL_SYNC       0x01      /* enable sync mode */
106 #define   SC_ACCEL_WIDE       0x02      /* enable wide transfers */
107 #define   SC_ACCEL_TAGS       0x04      /* enable tagged queuing */
108 #define   SCBUSACCEL          _IOW('U', 2, struct scbusaccel_args)
109 
110 #define   SCBUSIOLLSCAN       _IO('U', 3)         /* perform low-level scan */
111 
112 #endif /* _SYS_SCSIIO_H_ */
113