]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cam/cam_compat.h
Upgrade to Unbound 1.5.1. Almost all our local changes to date have been
[FreeBSD/FreeBSD.git] / sys / cam / cam_compat.h
1 /*-
2  * CAM ioctl compatibility shims
3  *
4  * Copyright (c) 2013 Scott Long
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions, and the following disclaimer,
12  *    without modification, immediately at the beginning of the file.
13  * 2. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #ifndef _CAM_CAM_COMPAT_H
32 #define _CAM_CAM_COMPAT_H
33
34 /* No user-servicable parts in here. */
35 #ifdef _KERNEL
36
37 int cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
38     struct thread *td, int(*cbfnp)(struct cdev *, u_long, caddr_t, int,
39     struct thread *));
40
41
42 /* Version 0x16 compatibility */
43 #define CAM_VERSION_0x16        0x16
44
45 /* The size of the union ccb didn't change when going to 0x17 */
46 #define CAMIOCOMMAND_0x16       _IOWR(CAM_VERSION_0x16, 2, union ccb)
47 #define CAMGETPASSTHRU_0x16     _IOWR(CAM_VERSION_0x16, 3, union ccb)
48
49 #define CAM_SCATTER_VALID_0x16  0x00000010
50 #define CAM_SG_LIST_PHYS_0x16   0x00040000
51 #define CAM_DATA_PHYS_0x16      0x00200000
52
53 /* Version 0x17 compatibility */
54 #define CAM_VERSION_0x17        0x17
55
56 struct ccb_hdr_0x17 {
57         cam_pinfo       pinfo;          /* Info for priority scheduling */
58         camq_entry      xpt_links;      /* For chaining in the XPT layer */     
59         camq_entry      sim_links;      /* For chaining in the SIM layer */     
60         camq_entry      periph_links;   /* For chaining in the type driver */
61         u_int32_t       retry_count;
62         void            (*cbfcnp)(struct cam_periph *, union ccb *);
63         xpt_opcode      func_code;      /* XPT function code */
64         u_int32_t       status;         /* Status returned by CAM subsystem */
65         struct          cam_path *path; /* Compiled path for this ccb */
66         path_id_t       path_id;        /* Path ID for the request */
67         target_id_t     target_id;      /* Target device ID */
68         u_int           target_lun;     /* Target LUN number */
69         u_int32_t       flags;          /* ccb_flags */
70         ccb_ppriv_area  periph_priv;
71         ccb_spriv_area  sim_priv;
72         u_int32_t       timeout;        /* Hard timeout value in seconds */
73         struct callout_handle timeout_ch;
74 };
75
76 struct ccb_pathinq_0x17 {
77         struct ccb_hdr_0x17 ccb_h;
78         u_int8_t    version_num;        /* Version number for the SIM/HBA */
79         u_int8_t    hba_inquiry;        /* Mimic of INQ byte 7 for the HBA */
80         u_int8_t    target_sprt;        /* Flags for target mode support */
81         u_int8_t    hba_misc;           /* Misc HBA features */
82         u_int16_t   hba_eng_cnt;        /* HBA engine count */
83                                         /* Vendor Unique capabilities */
84         u_int8_t    vuhba_flags[VUHBALEN];
85         u_int32_t   max_target;         /* Maximum supported Target */
86         u_int32_t   max_lun;            /* Maximum supported Lun */
87         u_int32_t   async_flags;        /* Installed Async handlers */
88         path_id_t   hpath_id;           /* Highest Path ID in the subsystem */
89         target_id_t initiator_id;       /* ID of the HBA on the SCSI bus */
90         char        sim_vid[SIM_IDLEN]; /* Vendor ID of the SIM */
91         char        hba_vid[HBA_IDLEN]; /* Vendor ID of the HBA */
92         char        dev_name[DEV_IDLEN];/* Device name for SIM */
93         u_int32_t   unit_number;        /* Unit number for SIM */
94         u_int32_t   bus_id;             /* Bus ID for SIM */
95         u_int32_t   base_transfer_speed;/* Base bus speed in KB/sec */
96         cam_proto   protocol;
97         u_int       protocol_version;
98         cam_xport   transport;
99         u_int       transport_version;
100         union {
101                 struct ccb_pathinq_settings_spi spi;
102                 struct ccb_pathinq_settings_fc fc;
103                 struct ccb_pathinq_settings_sas sas;
104                 char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE];
105         } xport_specific;
106         u_int           maxio;          /* Max supported I/O size, in bytes. */
107         u_int16_t       hba_vendor;     /* HBA vendor ID */
108         u_int16_t       hba_device;     /* HBA device ID */
109         u_int16_t       hba_subvendor;  /* HBA subvendor ID */
110         u_int16_t       hba_subdevice;  /* HBA subdevice ID */
111 };
112
113 #define CAM_0X17_LEN    (sizeof(union ccb) - sizeof(struct ccb_hdr) + sizeof(struct ccb_hdr_0x17))
114 #define CAM_0X17_DATA_LEN (sizeof(union ccb) - sizeof(struct ccb_hdr_0x17))
115
116 #define CAMIOCOMMAND_0x17       _IOC(IOC_INOUT, CAM_VERSION_0x17, 2, CAM_0X17_LEN)
117 #define CAMGETPASSTHRU_0x17     _IOC(IOC_INOUT, CAM_VERSION_0x17, 3, CAM_0X17_LEN)
118
119 /* Version 0x18 compatibility */
120 #define CAM_VERSION_0x18        0x18
121
122 struct ccb_hdr_0x18 {
123         cam_pinfo       pinfo;          /* Info for priority scheduling */
124         camq_entry      xpt_links;      /* For chaining in the XPT layer */     
125         camq_entry      sim_links;      /* For chaining in the SIM layer */     
126         camq_entry      periph_links;   /* For chaining in the type driver */
127         u_int32_t       retry_count;
128         void            (*cbfcnp)(struct cam_periph *, union ccb *);
129         xpt_opcode      func_code;      /* XPT function code */
130         u_int32_t       status;         /* Status returned by CAM subsystem */
131         struct          cam_path *path; /* Compiled path for this ccb */
132         path_id_t       path_id;        /* Path ID for the request */
133         target_id_t     target_id;      /* Target device ID */
134         u_int           target_lun;     /* Target LUN number */
135         u_int64_t       ext_lun;        /* 64-bit LUN, more or less */
136         u_int32_t       flags;          /* ccb_flags */
137         u_int32_t       xflags;         /* extended ccb_flags */
138         ccb_ppriv_area  periph_priv;
139         ccb_spriv_area  sim_priv;
140         ccb_qos_area    qos;
141         u_int32_t       timeout;        /* Hard timeout value in seconds */
142         struct timeval  softtimeout;    /* Soft timeout value in sec + usec */
143 };
144
145 typedef enum {
146         CAM_EXTLUN_VALID_0x18   = 0x00000001,/* 64bit lun field is valid      */
147 } ccb_xflags_0x18;
148
149 struct dev_match_result_0x18 {
150         dev_match_type          type;
151         union {
152                 struct {
153                         char periph_name[DEV_IDLEN];
154                         u_int32_t unit_number;
155                         path_id_t path_id;
156                         target_id_t target_id;
157                         u_int target_lun;
158                 } periph_result;
159                 struct {
160                         path_id_t       path_id;
161                         target_id_t     target_id;
162                         u_int           target_lun;
163                         cam_proto       protocol;
164                         struct scsi_inquiry_data inq_data;
165                         struct ata_params ident_data;
166                         dev_result_flags flags;
167                 } device_result;
168                 struct bus_match_result bus_result;
169         } result;
170 };
171
172 #define CAM_0X18_LEN    (sizeof(union ccb) - sizeof(struct ccb_hdr) + sizeof(struct ccb_hdr_0x18))
173 #define CAM_0X18_DATA_LEN (sizeof(union ccb) - sizeof(struct ccb_hdr_0x18))
174
175 #define CAMIOCOMMAND_0x18       _IOC(IOC_INOUT, CAM_VERSION_0x18, 2, CAM_0X18_LEN)
176 #define CAMGETPASSTHRU_0x18     _IOC(IOC_INOUT, CAM_VERSION_0x18, 3, CAM_0X18_LEN)
177
178 #endif
179 #endif