xref: /freebsd/sys/cam/cam_periph.h (revision 87cfaf0e1fbd38cf7f9843ec462b5401e914f4d1)
18b8a9b1dSJustin T. Gibbs /*
28b8a9b1dSJustin T. Gibbs  * Data structures and definitions for CAM peripheral ("type") drivers.
38b8a9b1dSJustin T. Gibbs  *
48b8a9b1dSJustin T. Gibbs  * Copyright (c) 1997, 1998 Justin T. Gibbs.
58b8a9b1dSJustin T. Gibbs  * All rights reserved.
68b8a9b1dSJustin T. Gibbs  *
78b8a9b1dSJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
88b8a9b1dSJustin T. Gibbs  * modification, are permitted provided that the following conditions
98b8a9b1dSJustin T. Gibbs  * are met:
108b8a9b1dSJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
118b8a9b1dSJustin T. Gibbs  *    notice, this list of conditions, and the following disclaimer,
128b8a9b1dSJustin T. Gibbs  *    without modification, immediately at the beginning of the file.
138b8a9b1dSJustin T. Gibbs  * 2. The name of the author may not be used to endorse or promote products
148b8a9b1dSJustin T. Gibbs  *    derived from this software without specific prior written permission.
158b8a9b1dSJustin T. Gibbs  *
168b8a9b1dSJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178b8a9b1dSJustin T. Gibbs  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188b8a9b1dSJustin T. Gibbs  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198b8a9b1dSJustin T. Gibbs  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
208b8a9b1dSJustin T. Gibbs  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218b8a9b1dSJustin T. Gibbs  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228b8a9b1dSJustin T. Gibbs  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238b8a9b1dSJustin T. Gibbs  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248b8a9b1dSJustin T. Gibbs  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258b8a9b1dSJustin T. Gibbs  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268b8a9b1dSJustin T. Gibbs  * SUCH DAMAGE.
278b8a9b1dSJustin T. Gibbs  *
2887cfaf0eSJustin T. Gibbs  *      $Id: cam_periph.h,v 1.3 1998/10/22 22:16:48 ken Exp $
298b8a9b1dSJustin T. Gibbs  */
308b8a9b1dSJustin T. Gibbs 
318b8a9b1dSJustin T. Gibbs #ifndef _CAM_CAM_PERIPH_H
328b8a9b1dSJustin T. Gibbs #define _CAM_CAM_PERIPH_H 1
338b8a9b1dSJustin T. Gibbs 
348b8a9b1dSJustin T. Gibbs #include <sys/queue.h>
358b8a9b1dSJustin T. Gibbs 
368b8a9b1dSJustin T. Gibbs #ifdef KERNEL
378b8a9b1dSJustin T. Gibbs 
388b8a9b1dSJustin T. Gibbs extern struct linker_set periphdriver_set;
398b8a9b1dSJustin T. Gibbs 
408b8a9b1dSJustin T. Gibbs typedef void (periph_init_t)(void); /*
418b8a9b1dSJustin T. Gibbs 				     * Callback informing the peripheral driver
428b8a9b1dSJustin T. Gibbs 				     * it can perform it's initialization since
438b8a9b1dSJustin T. Gibbs 				     * the XPT is now fully initialized.
448b8a9b1dSJustin T. Gibbs 				     */
458b8a9b1dSJustin T. Gibbs typedef periph_init_t *periph_init_func_t;
468b8a9b1dSJustin T. Gibbs 
478b8a9b1dSJustin T. Gibbs struct periph_driver {
488b8a9b1dSJustin T. Gibbs 	periph_init_func_t	 init;
498b8a9b1dSJustin T. Gibbs 	char			 *driver_name;
508b8a9b1dSJustin T. Gibbs 	TAILQ_HEAD(,cam_periph)	 units;
518b8a9b1dSJustin T. Gibbs 	u_int			 generation;
528b8a9b1dSJustin T. Gibbs };
538b8a9b1dSJustin T. Gibbs 
548b8a9b1dSJustin T. Gibbs typedef enum {
558b8a9b1dSJustin T. Gibbs 	CAM_PERIPH_BIO,
568b8a9b1dSJustin T. Gibbs 	CAM_PERIPH_NET
578b8a9b1dSJustin T. Gibbs } cam_periph_type;
588b8a9b1dSJustin T. Gibbs 
598b8a9b1dSJustin T. Gibbs /* Generically usefull offsets into the peripheral private area */
608b8a9b1dSJustin T. Gibbs #define ppriv_ptr0 periph_priv.entries[0].ptr
618b8a9b1dSJustin T. Gibbs #define ppriv_ptr1 periph_priv.entries[1].ptr
628b8a9b1dSJustin T. Gibbs #define ppriv_field0 periph_priv.entries[0].field
638b8a9b1dSJustin T. Gibbs #define ppriv_field1 periph_priv.entries[1].field
648b8a9b1dSJustin T. Gibbs 
658b8a9b1dSJustin T. Gibbs typedef void		periph_start_t (struct cam_periph *periph,
668b8a9b1dSJustin T. Gibbs 					union ccb *start_ccb);
678b8a9b1dSJustin T. Gibbs typedef cam_status	periph_ctor_t (struct cam_periph *periph,
688b8a9b1dSJustin T. Gibbs 				       void *arg);
69ee9c90c7SKenneth D. Merry typedef void		periph_oninv_t (struct cam_periph *periph);
708b8a9b1dSJustin T. Gibbs typedef void		periph_dtor_t (struct cam_periph *periph);
718b8a9b1dSJustin T. Gibbs struct cam_periph {
728b8a9b1dSJustin T. Gibbs 	cam_pinfo		 pinfo;
738b8a9b1dSJustin T. Gibbs 	periph_start_t		*periph_start;
74ee9c90c7SKenneth D. Merry 	periph_oninv_t		*periph_oninval;
758b8a9b1dSJustin T. Gibbs 	periph_dtor_t		*periph_dtor;
768b8a9b1dSJustin T. Gibbs 	char			*periph_name;
778b8a9b1dSJustin T. Gibbs 	struct cam_path		*path;	/* Compiled path to device */
788b8a9b1dSJustin T. Gibbs 	void			*softc;
798b8a9b1dSJustin T. Gibbs 	u_int32_t		 unit_number;
808b8a9b1dSJustin T. Gibbs 	cam_periph_type		 type;
818b8a9b1dSJustin T. Gibbs 	u_int32_t		 flags;
828b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_RUNNING		0x01
838b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_LOCKED		0x02
848b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_LOCK_WANTED		0x04
858b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_INVALID		0x08
868b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_NEW_DEV_FOUND	0x10
8760a899a0SKenneth D. Merry #define CAM_PERIPH_RECOVERY_INPROG	0x20
888b8a9b1dSJustin T. Gibbs 	u_int32_t		 immediate_priority;
898b8a9b1dSJustin T. Gibbs 	u_int32_t		 refcount;
908b8a9b1dSJustin T. Gibbs 	SLIST_HEAD(, ccb_hdr)	 ccb_list;	/* For "immediate" requests */
918b8a9b1dSJustin T. Gibbs 	SLIST_ENTRY(cam_periph)  periph_links;
928b8a9b1dSJustin T. Gibbs 	TAILQ_ENTRY(cam_periph)  unit_links;
938b8a9b1dSJustin T. Gibbs 	ac_callback_t		*deferred_callback;
948b8a9b1dSJustin T. Gibbs 	ac_code			 deferred_ac;
958b8a9b1dSJustin T. Gibbs };
968b8a9b1dSJustin T. Gibbs 
978b8a9b1dSJustin T. Gibbs #define CAM_PERIPH_MAXMAPS	2
988b8a9b1dSJustin T. Gibbs 
998b8a9b1dSJustin T. Gibbs struct cam_periph_map_info {
1008b8a9b1dSJustin T. Gibbs 	int		num_bufs_used;
1018b8a9b1dSJustin T. Gibbs 	struct buf	*bp[CAM_PERIPH_MAXMAPS];
1028b8a9b1dSJustin T. Gibbs };
1038b8a9b1dSJustin T. Gibbs 
104ee9c90c7SKenneth D. Merry cam_status cam_periph_alloc(periph_ctor_t *periph_ctor,
105ee9c90c7SKenneth D. Merry 			    periph_oninv_t *periph_oninvalidate,
106ee9c90c7SKenneth D. Merry 			    periph_dtor_t *periph_dtor,
107ee9c90c7SKenneth D. Merry 			    periph_start_t *periph_start,
1088b8a9b1dSJustin T. Gibbs 			    char *name, cam_periph_type type, struct cam_path *,			    ac_callback_t *, ac_code, void *arg);
1098b8a9b1dSJustin T. Gibbs struct cam_periph *cam_periph_find(struct cam_path *path, char *name);
1108b8a9b1dSJustin T. Gibbs int		cam_periph_lock(struct cam_periph *periph, int priority);
1118b8a9b1dSJustin T. Gibbs void		cam_periph_unlock(struct cam_periph *periph);
1128b8a9b1dSJustin T. Gibbs cam_status	cam_periph_acquire(struct cam_periph *periph);
1138b8a9b1dSJustin T. Gibbs void		cam_periph_release(struct cam_periph *periph);
1148b8a9b1dSJustin T. Gibbs void		cam_periph_invalidate(struct cam_periph *periph);
1158b8a9b1dSJustin T. Gibbs int		cam_periph_mapmem(union ccb *ccb,
1168b8a9b1dSJustin T. Gibbs 				  struct cam_periph_map_info *mapinfo);
1178b8a9b1dSJustin T. Gibbs void		cam_periph_unmapmem(union ccb *ccb,
1188b8a9b1dSJustin T. Gibbs 				    struct cam_periph_map_info *mapinfo);
1198b8a9b1dSJustin T. Gibbs union ccb	*cam_periph_getccb(struct cam_periph *periph,
1208b8a9b1dSJustin T. Gibbs 				   u_int32_t priority);
1218b8a9b1dSJustin T. Gibbs void		cam_periph_ccbwait(union ccb *ccb);
1228b8a9b1dSJustin T. Gibbs int		cam_periph_runccb(union ccb *ccb,
1238b8a9b1dSJustin T. Gibbs 				  int (*error_routine)(union ccb *ccb,
1248b8a9b1dSJustin T. Gibbs 						       cam_flags camflags,
1258b8a9b1dSJustin T. Gibbs 						       u_int32_t sense_flags),
1268b8a9b1dSJustin T. Gibbs 				  cam_flags camflags, u_int32_t sense_flags,
1278b8a9b1dSJustin T. Gibbs 				  struct devstat *ds);
1288b8a9b1dSJustin T. Gibbs int		cam_periph_ioctl(struct cam_periph *periph, int cmd,
1298b8a9b1dSJustin T. Gibbs 				 caddr_t addr,
1308b8a9b1dSJustin T. Gibbs 				 int (*error_routine)(union ccb *ccb,
1318b8a9b1dSJustin T. Gibbs 						      cam_flags camflags,
1328b8a9b1dSJustin T. Gibbs 						      u_int32_t sense_flags));
13387cfaf0eSJustin T. Gibbs void		cam_freeze_devq(struct cam_path *path);
1348b8a9b1dSJustin T. Gibbs u_int32_t	cam_release_devq(struct cam_path *path, u_int32_t relsim_flags,
1358b8a9b1dSJustin T. Gibbs 				 u_int32_t opening_reduction, u_int32_t timeout,
1368b8a9b1dSJustin T. Gibbs 				 int getcount_only);
13787cfaf0eSJustin T. Gibbs void		cam_periph_async(struct cam_periph *periph, u_int32_t code,
13887cfaf0eSJustin T. Gibbs 		 		 struct cam_path *path, void *arg);
13987cfaf0eSJustin T. Gibbs void		cam_periph_bus_settle(struct cam_periph *periph,
14087cfaf0eSJustin T. Gibbs 				      u_int bus_settle_ms);
14187cfaf0eSJustin T. Gibbs void		cam_periph_freeze_after_event(struct cam_periph *periph,
14287cfaf0eSJustin T. Gibbs 					      struct timeval* event_time,
14387cfaf0eSJustin T. Gibbs 					      u_int duration_ms);
1448b8a9b1dSJustin T. Gibbs int		cam_periph_error(union ccb *ccb, cam_flags camflags,
1458b8a9b1dSJustin T. Gibbs 				 u_int32_t sense_flags, union ccb *save_ccb);
1468b8a9b1dSJustin T. Gibbs 
1478b8a9b1dSJustin T. Gibbs #endif /* KERNEL */
1488b8a9b1dSJustin T. Gibbs #endif /* _CAM_CAM_PERIPH_H */
149