1225608Savg/*- 2225608Savg * Data structures and definitions for dealing with the 3225608Savg * Common Access Method Transport (xpt) layer. 4225608Savg * 5227705Spjd * Copyright (c) 1997 Justin T. Gibbs. 6227705Spjd * All rights reserved. 7227705Spjd * 8225608Savg * Redistribution and use in source and binary forms, with or without 9227705Spjd * modification, are permitted provided that the following conditions 10227705Spjd * are met: 11225608Savg * 1. Redistributions of source code must retain the above copyright 12225608Savg * notice, this list of conditions, and the following disclaimer, 13225608Savg * without modification, immediately at the beginning of the file. 14225608Savg * 2. The name of the author may not be used to endorse or promote products 15225608Savg * derived from this software without specific prior written permission. 16225608Savg * 17225608Savg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18254039Savg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19260734Savg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20225608Savg * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 21225608Savg * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22225608Savg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23225608Savg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24225608Savg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25225608Savg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26225608Savg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27225608Savg * SUCH DAMAGE. 28225608Savg * 29 * $FreeBSD: releng/10.3/sys/cam/cam_xpt.h 292348 2015-12-16 19:01:14Z ken $ 30 */ 31 32#ifndef _CAM_CAM_XPT_H 33#define _CAM_CAM_XPT_H 1 34 35/* Forward Declarations */ 36union ccb; 37struct cam_periph; 38struct cam_ed; 39struct cam_sim; 40 41/* 42 * Definition of a CAM path. Paths are created from bus, target, and lun ids 43 * via xpt_create_path and allow for reference to devices without recurring 44 * lookups in the edt. 45 */ 46struct cam_path; 47 48/* Path functions */ 49 50#ifdef _KERNEL 51 52/* 53 * Definition of an async handler callback block. These are used to add 54 * SIMs and peripherals to the async callback lists. 55 */ 56struct async_node { 57 SLIST_ENTRY(async_node) links; 58 u_int32_t event_enable; /* Async Event enables */ 59 u_int32_t event_lock; /* Take SIM lock for handlers. */ 60 void (*callback)(void *arg, u_int32_t code, 61 struct cam_path *path, void *args); 62 void *callback_arg; 63}; 64 65SLIST_HEAD(async_list, async_node); 66SLIST_HEAD(periph_list, cam_periph); 67 68void xpt_action(union ccb *new_ccb); 69void xpt_action_default(union ccb *new_ccb); 70union ccb *xpt_alloc_ccb(void); 71union ccb *xpt_alloc_ccb_nowait(void); 72void xpt_free_ccb(union ccb *free_ccb); 73void xpt_setup_ccb_flags(struct ccb_hdr *ccb_h, 74 struct cam_path *path, 75 u_int32_t priority, 76 u_int32_t flags); 77void xpt_setup_ccb(struct ccb_hdr *ccb_h, 78 struct cam_path *path, 79 u_int32_t priority); 80void xpt_merge_ccb(union ccb *master_ccb, 81 union ccb *slave_ccb); 82cam_status xpt_create_path(struct cam_path **new_path_ptr, 83 struct cam_periph *perph, 84 path_id_t path_id, 85 target_id_t target_id, lun_id_t lun_id); 86cam_status xpt_create_path_unlocked(struct cam_path **new_path_ptr, 87 struct cam_periph *perph, 88 path_id_t path_id, 89 target_id_t target_id, lun_id_t lun_id); 90int xpt_getattr(char *buf, size_t len, const char *attr, 91 struct cam_path *path); 92void xpt_free_path(struct cam_path *path); 93void xpt_path_counts(struct cam_path *path, uint32_t *bus_ref, 94 uint32_t *periph_ref, uint32_t *target_ref, 95 uint32_t *device_ref); 96int xpt_path_comp(struct cam_path *path1, 97 struct cam_path *path2); 98int xpt_path_comp_dev(struct cam_path *path, 99 struct cam_ed *dev); 100void xpt_print_path(struct cam_path *path); 101void xpt_print_device(struct cam_ed *device); 102void xpt_print(struct cam_path *path, const char *fmt, ...); 103int xpt_path_string(struct cam_path *path, char *str, 104 size_t str_len); 105path_id_t xpt_path_path_id(struct cam_path *path); 106target_id_t xpt_path_target_id(struct cam_path *path); 107lun_id_t xpt_path_lun_id(struct cam_path *path); 108int xpt_path_legacy_ata_id(struct cam_path *path); 109struct cam_sim *xpt_path_sim(struct cam_path *path); 110struct cam_periph *xpt_path_periph(struct cam_path *path); 111void xpt_async(u_int32_t async_code, struct cam_path *path, 112 void *async_arg); 113void xpt_rescan(union ccb *ccb); 114void xpt_hold_boot(void); 115void xpt_release_boot(void); 116void xpt_lock_buses(void); 117void xpt_unlock_buses(void); 118struct mtx * xpt_path_mtx(struct cam_path *path); 119#define xpt_path_lock(path) mtx_lock(xpt_path_mtx(path)) 120#define xpt_path_unlock(path) mtx_unlock(xpt_path_mtx(path)) 121#define xpt_path_assert(path, what) mtx_assert(xpt_path_mtx(path), (what)) 122#define xpt_path_owned(path) mtx_owned(xpt_path_mtx(path)) 123#define xpt_path_sleep(path, chan, priority, wmesg, timo) \ 124 msleep((chan), xpt_path_mtx(path), (priority), (wmesg), (timo)) 125cam_status xpt_register_async(int event, ac_callback_t *cbfunc, 126 void *cbarg, struct cam_path *path); 127cam_status xpt_compile_path(struct cam_path *new_path, 128 struct cam_periph *perph, 129 path_id_t path_id, 130 target_id_t target_id, 131 lun_id_t lun_id); 132cam_status xpt_clone_path(struct cam_path **new_path, 133 struct cam_path *path); 134void xpt_copy_path(struct cam_path *new_path, 135 struct cam_path *path); 136 137void xpt_release_path(struct cam_path *path); 138 139#endif /* _KERNEL */ 140 141#endif /* _CAM_CAM_XPT_H */ 142