FreeBSD kernel CAM code
cam_xpt.h
Go to the documentation of this file.
1/*-
2 * Data structures and definitions for dealing with the
3 * Common Access Method Transport (xpt) layer.
4 *
5 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
6 *
7 * Copyright (c) 1997 Justin T. Gibbs.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions, and the following disclaimer,
15 * without modification, immediately at the beginning of the file.
16 * 2. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * $FreeBSD$
32 */
33
34#ifndef _CAM_CAM_XPT_H
35#define _CAM_CAM_XPT_H 1
36
37#ifdef _KERNEL
38#include <sys/cdefs.h>
39#include <cam/cam_ccb.h>
40#endif
41
42/* Forward Declarations */
43union ccb;
44struct cam_periph;
45struct cam_ed;
46struct cam_sim;
47struct sbuf;
48
49/*
50 * Definition of a CAM path. Paths are created from bus, target, and lun ids
51 * via xpt_create_path and allow for reference to devices without recurring
52 * lookups in the edt.
53 */
54struct cam_path;
55
56/* Path functions */
57
58#ifdef _KERNEL
59
60/*
61 * Definition of an async handler callback block. These are used to add
62 * SIMs and peripherals to the async callback lists.
63 */
64struct async_node {
66 u_int32_t event_enable; /* Async Event enables */
67 u_int32_t event_lock; /* Take SIM lock for handlers. */
68 void (*callback)(void *arg, u_int32_t code,
69 struct cam_path *path, void *args);
71};
72
74SLIST_HEAD(periph_list, cam_periph);
75
76void xpt_action(union ccb *new_ccb);
77void xpt_action_default(union ccb *new_ccb);
78union ccb *xpt_alloc_ccb(void);
79union ccb *xpt_alloc_ccb_nowait(void);
80void xpt_free_ccb(union ccb *free_ccb);
82 struct cam_path *path,
83 u_int32_t priority,
84 u_int32_t flags);
85void xpt_setup_ccb(struct ccb_hdr *ccb_h,
86 struct cam_path *path,
87 u_int32_t priority);
88void xpt_merge_ccb(union ccb *dst_ccb,
89 union ccb *src_ccb);
90cam_status xpt_create_path(struct cam_path **new_path_ptr,
91 struct cam_periph *perph,
92 path_id_t path_id,
93 target_id_t target_id, lun_id_t lun_id);
94cam_status xpt_create_path_unlocked(struct cam_path **new_path_ptr,
95 struct cam_periph *perph,
96 path_id_t path_id,
97 target_id_t target_id, lun_id_t lun_id);
98int xpt_getattr(char *buf, size_t len, const char *attr,
99 struct cam_path *path);
100void xpt_free_path(struct cam_path *path);
101void xpt_path_counts(struct cam_path *path, uint32_t *bus_ref,
102 uint32_t *periph_ref, uint32_t *target_ref,
103 uint32_t *device_ref);
104int xpt_path_comp(struct cam_path *path1,
105 struct cam_path *path2);
106int xpt_path_comp_dev(struct cam_path *path,
107 struct cam_ed *dev);
108int xpt_path_string(struct cam_path *path, char *str,
109 size_t str_len);
110int xpt_path_sbuf(struct cam_path *path, struct sbuf *sb);
113lun_id_t xpt_path_lun_id(struct cam_path *path);
114struct cam_sim *xpt_path_sim(struct cam_path *path);
115struct cam_periph *xpt_path_periph(struct cam_path *path);
116device_t xpt_path_sim_device(const struct cam_path *path);
117void xpt_print_path(struct cam_path *path);
118void xpt_print_device(struct cam_ed *device);
119void xpt_print(struct cam_path *path, const char *fmt, ...);
120void xpt_async(u_int32_t async_code, struct cam_path *path,
121 void *async_arg);
122void xpt_rescan(union ccb *ccb);
123void xpt_hold_boot(void);
124void xpt_release_boot(void);
125void xpt_lock_buses(void);
126void xpt_unlock_buses(void);
127struct mtx * xpt_path_mtx(struct cam_path *path);
128#define xpt_path_lock(path) mtx_lock(xpt_path_mtx(path))
129#define xpt_path_unlock(path) mtx_unlock(xpt_path_mtx(path))
130#define xpt_path_assert(path, what) mtx_assert(xpt_path_mtx(path), (what))
131#define xpt_path_owned(path) mtx_owned(xpt_path_mtx(path))
132#define xpt_path_sleep(path, chan, priority, wmesg, timo) \
133 msleep((chan), xpt_path_mtx(path), (priority), (wmesg), (timo))
135 void *cbarg, struct cam_path *path);
136cam_status xpt_compile_path(struct cam_path *new_path,
137 struct cam_periph *perph,
138 path_id_t path_id,
139 target_id_t target_id,
140 lun_id_t lun_id);
141int xpt_clone_path(struct cam_path **new_path,
142 struct cam_path *path);
143
144void xpt_release_path(struct cam_path *path);
145
146const char * xpt_action_name(uint32_t action);
147void xpt_pollwait(union ccb *start_ccb, uint32_t timeout);
148uint32_t xpt_poll_setup(union ccb *start_ccb);
149void xpt_sim_poll(struct cam_sim *sim);
150
151/*
152 * Perform a path inquiry at the request priority. The bzero may be
153 * unnecessary.
154 */
155static inline void
156xpt_path_inq(struct ccb_pathinq *cpi, struct cam_path *path)
157{
158
159 bzero(cpi, sizeof(*cpi));
162 xpt_action((union ccb *)cpi);
163}
164
165#endif /* _KERNEL */
166
167#endif /* _CAM_CAM_XPT_H */
#define CAM_PRIORITY_NORMAL
Definition: cam.h:92
u_int path_id_t
Definition: cam.h:42
cam_status
Definition: cam.h:132
u_int target_id_t
Definition: cam.h:43
u_int64_t lun_id_t
Definition: cam.h:44
void ac_callback_t(void *softc, u_int32_t code, struct cam_path *path, void *args)
Definition: cam_ccb.h:883
@ XPT_PATH_INQ
Definition: cam_ccb.h:147
int xpt_path_comp_dev(struct cam_path *path, struct cam_ed *dev)
Definition: cam_xpt.c:3752
union ccb * xpt_alloc_ccb(void)
Definition: cam_xpt.c:4612
void xpt_sim_poll(struct cam_sim *sim)
Definition: cam_xpt.c:3165
void xpt_print_path(struct cam_path *path)
Definition: cam_xpt.c:3786
struct mtx * xpt_path_mtx(struct cam_path *path)
Definition: cam_xpt.c:5328
int xpt_path_string(struct cam_path *path, char *str, size_t str_len)
Definition: cam_xpt.c:3833
void xpt_merge_ccb(union ccb *dst_ccb, union ccb *src_ccb)
Definition: cam_xpt.c:3480
cam_status xpt_create_path(struct cam_path **new_path_ptr, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id)
Definition: cam_xpt.c:3527
int xpt_getattr(char *buf, size_t len, const char *attr, struct cam_path *path)
Definition: cam_xpt.c:1243
void xpt_setup_ccb_flags(struct ccb_hdr *ccb_h, struct cam_path *path, u_int32_t priority, u_int32_t flags)
Definition: cam_xpt.c:3496
void xpt_unlock_buses(void)
Definition: cam_xpt.c:5322
void xpt_print(struct cam_path *path, const char *fmt,...)
Definition: cam_xpt.c:3814
void xpt_pollwait(union ccb *start_ccb, uint32_t timeout)
Definition: cam_xpt.c:3214
void xpt_rescan(union ccb *ccb)
Definition: cam_xpt.c:840
void xpt_release_path(struct cam_path *path)
Definition: cam_xpt.c:3654
void xpt_action_default(union ccb *new_ccb)
Definition: cam_xpt.c:2613
int xpt_path_comp(struct cam_path *path1, struct cam_path *path2)
Definition: cam_xpt.c:3718
path_id_t xpt_path_path_id(struct cam_path *path)
Definition: cam_xpt.c:3880
void xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg)
Definition: cam_xpt.c:4350
void xpt_lock_buses(void)
Definition: cam_xpt.c:5316
void xpt_setup_ccb(struct ccb_hdr *ccb_h, struct cam_path *path, u_int32_t priority)
Definition: cam_xpt.c:3520
cam_status xpt_register_async(int event, ac_callback_t *cbfunc, void *cbarg, struct cam_path *path)
Definition: cam_xpt.c:5213
uint32_t xpt_poll_setup(union ccb *start_ccb)
Definition: cam_xpt.c:3180
lun_id_t xpt_path_lun_id(struct cam_path *path)
Definition: cam_xpt.c:3895
struct cam_sim * xpt_path_sim(struct cam_path *path)
Definition: cam_xpt.c:3904
union ccb * xpt_alloc_ccb_nowait(void)
Definition: cam_xpt.c:4621
void xpt_print_device(struct cam_ed *device)
Definition: cam_xpt.c:3799
void xpt_free_path(struct cam_path *path)
Definition: cam_xpt.c:3672
int xpt_clone_path(struct cam_path **new_path, struct cam_path *path)
Definition: cam_xpt.c:3635
void xpt_release_boot(void)
Definition: cam_xpt.c:5157
int xpt_path_sbuf(struct cam_path *path, struct sbuf *sb)
Definition: cam_xpt.c:3845
cam_status xpt_compile_path(struct cam_path *new_path, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id)
Definition: cam_xpt.c:3559
struct cam_periph * xpt_path_periph(struct cam_path *path)
Definition: cam_xpt.c:3911
SLIST_HEAD(async_list, async_node)
cam_status xpt_create_path_unlocked(struct cam_path **new_path_ptr, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id)
Definition: cam_xpt.c:3549
const char * xpt_action_name(uint32_t action)
Definition: cam_xpt.c:5608
target_id_t xpt_path_target_id(struct cam_path *path)
Definition: cam_xpt.c:3886
static void xpt_path_inq(struct ccb_pathinq *cpi, struct cam_path *path)
Definition: cam_xpt.h:156
device_t xpt_path_sim_device(const struct cam_path *path)
Return the device_t associated with the path.
Definition: cam_xpt.c:5551
void xpt_action(union ccb *new_ccb)
Definition: cam_xpt.c:2601
void xpt_hold_boot(void)
Definition: cam_xpt.c:5148
void xpt_free_ccb(union ccb *free_ccb)
Definition: cam_xpt.c:4630
void xpt_path_counts(struct cam_path *path, uint32_t *bus_ref, uint32_t *periph_ref, uint32_t *target_ref, uint32_t *device_ref)
Definition: cam_xpt.c:3681
void * callback_arg
Definition: cam_xpt.h:70
void(* callback)(void *arg, u_int32_t code, struct cam_path *path, void *args)
Definition: cam_xpt.h:68
u_int32_t event_enable
Definition: cam_xpt.h:66
SLIST_ENTRY(async_node) links
u_int32_t event_lock
Definition: cam_xpt.h:67
struct cam_path * path
Definition: cam_periph.h:124
xpt_opcode func_code
Definition: cam_ccb.h:362
struct ccb_hdr ccb_h
Definition: cam_ccb.h:661
Definition: cam_ccb.h:1345
struct ccb_hdr ccb_h
Definition: cam_ccb.h:1346