Deleted Added
full compact
isp_freebsd.h (195534) isp_freebsd.h (196008)
1/* $FreeBSD: head/sys/dev/isp/isp_freebsd.h 195534 2009-07-10 08:18:08Z scottl $ */
1/* $FreeBSD: head/sys/dev/isp/isp_freebsd.h 196008 2009-08-01 01:04:26Z mjacob $ */
2/*-
3 * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions
4 *
2/*-
3 * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions
4 *
5 * Copyright (c) 1997-2006 by Matthew Jacob
5 * Copyright (c) 1997-2008 by Matthew Jacob
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice immediately at the beginning of the file, without modification,
13 * this list of conditions, and the following disclaimer.

--- 13 unchanged lines hidden (view full) ---

27 * SUCH DAMAGE.
28 */
29#ifndef _ISP_FREEBSD_H
30#define _ISP_FREEBSD_H
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/endian.h>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice immediately at the beginning of the file, without modification,
13 * this list of conditions, and the following disclaimer.

--- 13 unchanged lines hidden (view full) ---

27 * SUCH DAMAGE.
28 */
29#ifndef _ISP_FREEBSD_H
30#define _ISP_FREEBSD_H
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/endian.h>
35#if __FreeBSD_version < 500000
36#include <sys/kernel.h>
37#include <sys/queue.h>
38#include <sys/malloc.h>
39#else
40#include <sys/lock.h>
41#include <sys/kernel.h>
42#include <sys/queue.h>
43#include <sys/malloc.h>
44#include <sys/mutex.h>
45#include <sys/condvar.h>
35#include <sys/lock.h>
36#include <sys/kernel.h>
37#include <sys/queue.h>
38#include <sys/malloc.h>
39#include <sys/mutex.h>
40#include <sys/condvar.h>
46#endif
47
48#include <sys/proc.h>
49#include <sys/bus.h>
50
51#include <machine/bus.h>
41
42#include <sys/proc.h>
43#include <sys/bus.h>
44
45#include <machine/bus.h>
52#if __FreeBSD_version < 500000
53#include <machine/clock.h>
54#endif
55#include <machine/cpu.h>
46#include <machine/cpu.h>
47#include <machine/stdarg.h>
56
57#include <cam/cam.h>
58#include <cam/cam_debug.h>
59#include <cam/cam_ccb.h>
60#include <cam/cam_sim.h>
61#include <cam/cam_xpt.h>
62#include <cam/cam_xpt_sim.h>
63#include <cam/cam_debug.h>
64#include <cam/scsi/scsi_all.h>
65#include <cam/scsi/scsi_message.h>
66
67#include "opt_ddb.h"
68#include "opt_isp.h"
69
48
49#include <cam/cam.h>
50#include <cam/cam_debug.h>
51#include <cam/cam_ccb.h>
52#include <cam/cam_sim.h>
53#include <cam/cam_xpt.h>
54#include <cam/cam_xpt_sim.h>
55#include <cam/cam_debug.h>
56#include <cam/scsi/scsi_all.h>
57#include <cam/scsi/scsi_message.h>
58
59#include "opt_ddb.h"
60#include "opt_isp.h"
61
70#if __FreeBSD_version < 500000
71#define ISP_PLATFORM_VERSION_MAJOR 4
72#define ISP_PLATFORM_VERSION_MINOR 17
73#else
74#define ISP_PLATFORM_VERSION_MAJOR 5
75#define ISP_PLATFORM_VERSION_MINOR 9
76#endif
62#define ISP_PLATFORM_VERSION_MAJOR 7
63#define ISP_PLATFORM_VERSION_MINOR 0
77
78/*
79 * Efficiency- get rid of SBus code && tests unless we need them.
80 */
81#ifdef __sparc64__
82#define ISP_SBUS_SUPPORTED 1
83#else
84#define ISP_SBUS_SUPPORTED 0
85#endif
86
64
65/*
66 * Efficiency- get rid of SBus code && tests unless we need them.
67 */
68#ifdef __sparc64__
69#define ISP_SBUS_SUPPORTED 1
70#else
71#define ISP_SBUS_SUPPORTED 0
72#endif
73
87
88#if __FreeBSD_version < 500000
89#define ISP_IFLAGS INTR_TYPE_CAM
90#elif __FreeBSD_version < 700037
91#define ISP_IFLAGS INTR_TYPE_CAM | INTR_ENTROPY
92#else
93#define ISP_IFLAGS INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE
74#define ISP_IFLAGS INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE
94#endif
95
75
96#if __FreeBSD_version < 700000
97typedef void ispfwfunc(int, int, int, const void **);
98#endif
99
100#ifdef ISP_TARGET_MODE
101#define ISP_TARGET_FUNCTIONS 1
76#ifdef ISP_TARGET_MODE
77#define ISP_TARGET_FUNCTIONS 1
102#define ATPDPSIZE 256
78#define ATPDPSIZE 4096
79
80#include <dev/isp/isp_target.h>
81
103typedef struct {
82typedef struct {
83 void * next;
104 uint32_t orig_datalen;
105 uint32_t bytes_xfered;
106 uint32_t last_xframt;
84 uint32_t orig_datalen;
85 uint32_t bytes_xfered;
86 uint32_t last_xframt;
107 uint32_t tag : 16,
108 lun : 13, /* not enough */
87 uint32_t tag;
88 uint32_t lun;
89 uint32_t nphdl;
90 uint32_t sid;
91 uint32_t portid;
92 uint32_t
93 oxid : 16,
94 cdb0 : 8,
95 : 1,
96 dead : 1,
97 tattr : 3,
109 state : 3;
110} atio_private_data_t;
111#define ATPD_STATE_FREE 0
112#define ATPD_STATE_ATIO 1
113#define ATPD_STATE_CAM 2
114#define ATPD_STATE_CTIO 3
115#define ATPD_STATE_LAST_CTIO 4
116#define ATPD_STATE_PDON 5
117
98 state : 3;
99} atio_private_data_t;
100#define ATPD_STATE_FREE 0
101#define ATPD_STATE_ATIO 1
102#define ATPD_STATE_CAM 2
103#define ATPD_STATE_CTIO 3
104#define ATPD_STATE_LAST_CTIO 4
105#define ATPD_STATE_PDON 5
106
107typedef union inot_private_data inot_private_data_t;
108union inot_private_data {
109 inot_private_data_t *next;
110 struct {
111 isp_notify_t nt; /* must be first! */
112 uint8_t data[64]; /* sb QENTRY_LEN, but order of definitions is wrong */
113 uint32_t tag_id, seq_id;
114 } rd;
115};
116
118typedef struct tstate {
117typedef struct tstate {
119 struct tstate *next;
118 SLIST_ENTRY(tstate) next;
120 struct cam_path *owner;
121 struct ccb_hdr_slist atios;
122 struct ccb_hdr_slist inots;
119 struct cam_path *owner;
120 struct ccb_hdr_slist atios;
121 struct ccb_hdr_slist inots;
123 lun_id_t lun;
124 int bus;
125 uint32_t hold;
126 int atio_count;
127 int inot_count;
122 uint32_t hold;
123 int atio_count;
124 int inot_count;
125 inot_private_data_t * restart_queue;
126 inot_private_data_t * ntfree;
127 inot_private_data_t ntpool[ATPDPSIZE];
128 atio_private_data_t * atfree;
129 atio_private_data_t atpool[ATPDPSIZE];
128} tstate_t;
129
130} tstate_t;
131
130#define LUN_HASH_SIZE 32
131#define LUN_HASH_FUNC(isp, port, lun) \
132 ((IS_DUALBUS(isp)) ? \
133 (((lun) & ((LUN_HASH_SIZE >> 1) - 1)) << (port)) : \
134 ((lun) & (LUN_HASH_SIZE - 1)))
132#define LUN_HASH_SIZE 32
133#define LUN_HASH_FUNC(lun) ((lun) & (LUN_HASH_SIZE - 1))
134
135#endif
136
137/*
138 * Per command info.
139 */
140struct isp_pcmd {
141 struct isp_pcmd * next;
142 bus_dmamap_t dmap; /* dma map for this command */
143 struct ispsoftc * isp; /* containing isp */
144 struct callout wdog; /* watchdog timer */
145};
146#define ISP_PCMD(ccb) (ccb)->ccb_h.spriv_ptr1
147#define PISP_PCMD(ccb) ((struct isp_pcmd *)ISP_PCMD(ccb))
148
135#endif
136
137/*
138 * Per command info.
139 */
140struct isp_pcmd {
141 struct isp_pcmd * next;
142 bus_dmamap_t dmap; /* dma map for this command */
143 struct ispsoftc * isp; /* containing isp */
144 struct callout wdog; /* watchdog timer */
145};
146#define ISP_PCMD(ccb) (ccb)->ccb_h.spriv_ptr1
147#define PISP_PCMD(ccb) ((struct isp_pcmd *)ISP_PCMD(ccb))
148
149struct isposinfo {
150 struct ispsoftc * next;
151 bus_space_tag_t bus_tag;
152 bus_space_handle_t bus_handle;
153 bus_dma_tag_t dmat;
154 uint64_t default_port_wwn;
155 uint64_t default_node_wwn;
156 uint32_t default_id;
157 device_t dev;
158 struct cam_sim *sim;
159 struct cam_path *path;
160 struct cam_sim *sim2;
161 struct cam_path *path2;
162 struct intr_config_hook ehook;
163 uint32_t loop_down_time;
164 uint32_t loop_down_limit;
165 uint32_t gone_device_time;
166 uint32_t : 5,
149/*
150 * Per channel information
151 */
152SLIST_HEAD(tslist, tstate);
153
154struct isp_fc {
155 struct cam_sim *sim;
156 struct cam_path *path;
157 struct ispsoftc *isp;
158 struct proc *kproc;
159 bus_dma_tag_t tdmat;
160 bus_dmamap_t tdmap;
161 uint64_t def_wwpn;
162 uint64_t def_wwnn;
163 uint32_t loop_down_time;
164 uint32_t loop_down_limit;
165 uint32_t gone_device_time;
166 uint32_t
167#ifdef ISP_TARGET_MODE
168#ifdef ISP_INTERNAL_TARGET
169 proc_active : 1,
170#endif
171 tm_luns_enabled : 1,
172 tm_enable_defer : 1,
173 tm_enabled : 1,
174#endif
167 simqfrozen : 3,
175 simqfrozen : 3,
176 default_id : 8,
168 hysteresis : 8,
177 hysteresis : 8,
178 role : 2,
169 gdt_running : 1,
170 ldt_running : 1,
179 gdt_running : 1,
180 ldt_running : 1,
171 disabled : 1,
172 fcbsy : 1,
173 mbox_sleeping : 1,
174 mbox_sleep_ok : 1,
175 mboxcmd_done : 1,
176 mboxbsy : 1;
177 struct callout ldt; /* loop down timer */
178 struct callout gdt; /* gone device timer */
179#if __FreeBSD_version < 500000
180 uint32_t splcount;
181 uint32_t splsaved;
182#else
181 loop_dead : 1,
182 fcbsy : 1;
183 struct callout ldt; /* loop down timer */
184 struct callout gdt; /* gone device timer */
185#ifdef ISP_TARGET_MODE
186 struct tslist lun_hash[LUN_HASH_SIZE];
187#ifdef ISP_INTERNAL_TARGET
188 struct proc * target_proc;
189#endif
190#endif
191};
192
193struct isp_spi {
194 struct cam_sim *sim;
195 struct cam_path *path;
196 uint32_t
197#ifdef ISP_TARGET_MODE
198#ifdef ISP_INTERNAL_TARGET
199 proc_active : 1,
200#endif
201 tm_luns_enabled : 1,
202 tm_enable_defer : 1,
203 tm_enabled : 1,
204#endif
205 simqfrozen : 3,
206 role : 3,
207 iid : 4;
208#ifdef ISP_TARGET_MODE
209 struct tslist lun_hash[LUN_HASH_SIZE];
210#ifdef ISP_INTERNAL_TARGET
211 struct proc * target_proc;
212#endif
213#endif
214};
215
216struct isposinfo {
217 /*
218 * Linkage, locking, and identity
219 */
183 struct mtx lock;
220 struct mtx lock;
221 device_t dev;
222 struct cdev * cdev;
223 struct intr_config_hook ehook;
224 struct cam_devq * devq;
225
226 /*
227 * Firmware pointer
228 */
184 const struct firmware * fw;
229 const struct firmware * fw;
185 union {
186 struct {
187 char wwnn[19];
188 char wwpn[19];
189 } fc;
190 } sysctl_info;
191#endif
192 struct proc *kproc;
230
231 /*
232 * DMA related sdtuff
233 */
234 bus_space_tag_t bus_tag;
235 bus_dma_tag_t dmat;
236 bus_space_handle_t bus_handle;
193 bus_dma_tag_t cdmat;
194 bus_dmamap_t cdmap;
237 bus_dma_tag_t cdmat;
238 bus_dmamap_t cdmap;
195#define isp_cdmat isp_osinfo.cdmat
196#define isp_cdmap isp_osinfo.cdmap
239
197 /*
240 /*
198 * Per command information.
241 * Command and transaction related related stuff
199 */
200 struct isp_pcmd * pcmd_pool;
201 struct isp_pcmd * pcmd_free;
202
242 */
243 struct isp_pcmd * pcmd_pool;
244 struct isp_pcmd * pcmd_free;
245
246 uint32_t
203#ifdef ISP_TARGET_MODE
247#ifdef ISP_TARGET_MODE
204#define TM_WILDCARD_ENABLED 0x02
205#define TM_TMODE_ENABLED 0x01
206 uint8_t tmflags[2]; /* two busses */
207#define NLEACT 4
208 union ccb * leact[NLEACT];
209 tstate_t tsdflt[2]; /* two busses */
210 tstate_t *lun_hash[LUN_HASH_SIZE];
211 atio_private_data_t atpdp[ATPDPSIZE];
248 tmwanted : 1,
249 tmbusy : 1,
250#else
251 : 2,
212#endif
252#endif
253 forcemulti : 1,
254 timer_active : 1,
255 autoconf : 1,
256 ehook_active : 1,
257 disabled : 1,
258 mbox_sleeping : 1,
259 mbox_sleep_ok : 1,
260 mboxcmd_done : 1,
261 mboxbsy : 1;
262
263 struct callout tmo; /* general timer */
264
265 /*
266 * misc- needs to be sorted better XXXXXX
267 */
268 int framesize;
269 int exec_throttle;
270 int cont_max;
271
272#ifdef ISP_TARGET_MODE
273 cam_status * rptr;
274#endif
275
276 /*
277 * Per-type private storage...
278 */
279 union {
280 struct isp_fc *fc;
281 struct isp_spi *spi;
282 void *ptr;
283 } pc;
213};
284};
214#define ISP_KT_WCHAN(isp) (&(isp)->isp_osinfo.kproc)
285#define ISP_FC_PC(isp, chan) (&(isp)->isp_osinfo.pc.fc[(chan)])
286#define ISP_SPI_PC(isp, chan) (&(isp)->isp_osinfo.pc.spi[(chan)])
287#define ISP_GET_PC(isp, chan, tag, rslt) \
288 if (IS_SCSI(isp)) { \
289 rslt = ISP_SPI_PC(isp, chan)-> tag; \
290 } else { \
291 rslt = ISP_FC_PC(isp, chan)-> tag; \
292 }
293#define ISP_GET_PC_ADDR(isp, chan, tag, rp) \
294 if (IS_SCSI(isp)) { \
295 rp = &ISP_SPI_PC(isp, chan)-> tag; \
296 } else { \
297 rp = &ISP_FC_PC(isp, chan)-> tag; \
298 }
299#define ISP_SET_PC(isp, chan, tag, val) \
300 if (IS_SCSI(isp)) { \
301 ISP_SPI_PC(isp, chan)-> tag = val; \
302 } else { \
303 ISP_FC_PC(isp, chan)-> tag = val; \
304 }
215
216#define isp_lock isp_osinfo.lock
217#define isp_bus_tag isp_osinfo.bus_tag
218#define isp_bus_handle isp_osinfo.bus_handle
219
220/*
221 * Locking macros...
222 */
305
306#define isp_lock isp_osinfo.lock
307#define isp_bus_tag isp_osinfo.bus_tag
308#define isp_bus_handle isp_osinfo.bus_handle
309
310/*
311 * Locking macros...
312 */
223#if __FreeBSD_version < 500000
224#define ISP_LOCK(isp) \
225 if (isp->isp_osinfo.splcount++ == 0) { \
226 isp->isp_osinfo.splsaved = splcam(); \
227 }
228#define ISP_UNLOCK(isp) \
229 if (isp->isp_osinfo.splcount > 1) { \
230 isp->isp_osinfo.splcount--; \
231 } else { \
232 isp->isp_osinfo.splcount = 0; \
233 splx(isp->isp_osinfo.splsaved); \
234 }
235#elif __FreeBSD_version < 700037
236#define ISP_LOCK(isp) do {} while (0)
237#define ISP_UNLOCK(isp) do {} while (0)
238#else
239#define ISP_LOCK(isp) mtx_lock(&isp->isp_osinfo.lock)
240#define ISP_UNLOCK(isp) mtx_unlock(&isp->isp_osinfo.lock)
313#define ISP_LOCK(isp) mtx_lock(&isp->isp_osinfo.lock)
314#define ISP_UNLOCK(isp) mtx_unlock(&isp->isp_osinfo.lock)
241#endif
242
243/*
244 * Required Macros/Defines
245 */
246
315
316/*
317 * Required Macros/Defines
318 */
319
247#define ISP2100_SCRLEN 0x1000
320#define ISP_FC_SCRLEN 0x1000
248
321
249#define MEMZERO(a, b) memset(a, 0, b)
250#define MEMCPY memcpy
251#define SNPRINTF snprintf
252#define USEC_DELAY DELAY
253#define USEC_SLEEP(isp, x) DELAY(x)
322#define ISP_MEMZERO(a, b) memset(a, 0, b)
323#define ISP_MEMCPY memcpy
324#define ISP_SNPRINTF snprintf
325#define ISP_DELAY DELAY
326#define ISP_SLEEP(isp, x) DELAY(x)
254
327
328#ifndef DIAGNOSTIC
329#define ISP_INLINE __inline
330#else
331#define ISP_INLINE
332#endif
333
255#define NANOTIME_T struct timespec
256#define GET_NANOTIME nanotime
257#define GET_NANOSEC(x) ((x)->tv_sec * 1000000000 + (x)->tv_nsec)
258#define NANOTIME_SUB isp_nanotime_sub
259
260#define MAXISPREQUEST(isp) ((IS_FC(isp) || IS_ULTRA2(isp))? 1024 : 256)
261
262#define MEMORYBARRIER(isp, type, offset, size) \
263switch (type) { \
264case SYNC_SFORDEV: \
265case SYNC_REQUEST: \
334#define NANOTIME_T struct timespec
335#define GET_NANOTIME nanotime
336#define GET_NANOSEC(x) ((x)->tv_sec * 1000000000 + (x)->tv_nsec)
337#define NANOTIME_SUB isp_nanotime_sub
338
339#define MAXISPREQUEST(isp) ((IS_FC(isp) || IS_ULTRA2(isp))? 1024 : 256)
340
341#define MEMORYBARRIER(isp, type, offset, size) \
342switch (type) { \
343case SYNC_SFORDEV: \
344case SYNC_REQUEST: \
266 bus_dmamap_sync(isp->isp_cdmat, isp->isp_cdmap, \
345 bus_dmamap_sync(isp->isp_osinfo.cdmat, \
346 isp->isp_osinfo.cdmap, \
267 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \
268 break; \
269case SYNC_SFORCPU: \
270case SYNC_RESULT: \
347 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \
348 break; \
349case SYNC_SFORCPU: \
350case SYNC_RESULT: \
271 bus_dmamap_sync(isp->isp_cdmat, isp->isp_cdmap, \
351 bus_dmamap_sync(isp->isp_osinfo.cdmat, \
352 isp->isp_osinfo.cdmap, \
272 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \
273 break; \
274case SYNC_REG: \
353 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \
354 break; \
355case SYNC_REG: \
275 bus_space_barrier(isp->isp_bus_tag, \
276 isp->isp_bus_handle, offset, size, \
356 bus_space_barrier(isp->isp_osinfo.bus_tag, \
357 isp->isp_osinfo.bus_handle, offset, size, \
277 BUS_SPACE_BARRIER_READ); \
278 break; \
279default: \
280 break; \
281}
282
283#define MBOX_ACQUIRE isp_mbox_acquire
284#define MBOX_WAIT_COMPLETE isp_mbox_wait_complete
285#define MBOX_NOTIFY_COMPLETE isp_mbox_notify_done
286#define MBOX_RELEASE isp_mbox_release
287
358 BUS_SPACE_BARRIER_READ); \
359 break; \
360default: \
361 break; \
362}
363
364#define MBOX_ACQUIRE isp_mbox_acquire
365#define MBOX_WAIT_COMPLETE isp_mbox_wait_complete
366#define MBOX_NOTIFY_COMPLETE isp_mbox_notify_done
367#define MBOX_RELEASE isp_mbox_release
368
288#define FC_SCRATCH_ACQUIRE(isp) \
289 if (isp->isp_osinfo.fcbsy) { \
290 isp_prt(isp, ISP_LOGWARN, \
291 "FC scratch area busy (line %d)!", __LINE__); \
292 } else \
293 isp->isp_osinfo.fcbsy = 1
294#define FC_SCRATCH_RELEASE(isp) isp->isp_osinfo.fcbsy = 0
369#define FC_SCRATCH_ACQUIRE isp_fc_scratch_acquire
370#define FC_SCRATCH_RELEASE(isp, chan) isp->isp_osinfo.pc.fc[chan].fcbsy = 0
295
296#ifndef SCSI_GOOD
297#define SCSI_GOOD SCSI_STATUS_OK
298#endif
299#ifndef SCSI_CHECK
300#define SCSI_CHECK SCSI_STATUS_CHECK_COND
301#endif
302#ifndef SCSI_BUSY
303#define SCSI_BUSY SCSI_STATUS_BUSY
304#endif
305#ifndef SCSI_QFULL
306#define SCSI_QFULL SCSI_STATUS_QUEUE_FULL
307#endif
308
309#define XS_T struct ccb_scsiio
310#define XS_DMA_ADDR_T bus_addr_t
371
372#ifndef SCSI_GOOD
373#define SCSI_GOOD SCSI_STATUS_OK
374#endif
375#ifndef SCSI_CHECK
376#define SCSI_CHECK SCSI_STATUS_CHECK_COND
377#endif
378#ifndef SCSI_BUSY
379#define SCSI_BUSY SCSI_STATUS_BUSY
380#endif
381#ifndef SCSI_QFULL
382#define SCSI_QFULL SCSI_STATUS_QUEUE_FULL
383#endif
384
385#define XS_T struct ccb_scsiio
386#define XS_DMA_ADDR_T bus_addr_t
387#define XS_GET_DMA64_SEG(a, b, c) \
388{ \
389 ispds64_t *d = a; \
390 bus_dma_segment_t *e = b; \
391 uint32_t f = c; \
392 e += f; \
393 d->ds_base = DMA_LO32(e->ds_addr); \
394 d->ds_basehi = DMA_HI32(e->ds_addr); \
395 d->ds_count = e->ds_len; \
396}
397#define XS_GET_DMA_SEG(a, b, c) \
398{ \
399 ispds_t *d = a; \
400 bus_dma_segment_t *e = b; \
401 uint32_t f = c; \
402 e += f; \
403 d->ds_base = DMA_LO32(e->ds_addr); \
404 d->ds_count = e->ds_len; \
405}
311#define XS_ISP(ccb) cam_sim_softc(xpt_path_sim((ccb)->ccb_h.path))
312#define XS_CHANNEL(ccb) cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
313#define XS_TGT(ccb) (ccb)->ccb_h.target_id
314#define XS_LUN(ccb) (ccb)->ccb_h.target_lun
315
316#define XS_CDBP(ccb) \
317 (((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
318 (ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
319
320#define XS_CDBLEN(ccb) (ccb)->cdb_len
321#define XS_XFRLEN(ccb) (ccb)->dxfer_len
322#define XS_TIME(ccb) (ccb)->ccb_h.timeout
406#define XS_ISP(ccb) cam_sim_softc(xpt_path_sim((ccb)->ccb_h.path))
407#define XS_CHANNEL(ccb) cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
408#define XS_TGT(ccb) (ccb)->ccb_h.target_id
409#define XS_LUN(ccb) (ccb)->ccb_h.target_lun
410
411#define XS_CDBP(ccb) \
412 (((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
413 (ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
414
415#define XS_CDBLEN(ccb) (ccb)->cdb_len
416#define XS_XFRLEN(ccb) (ccb)->dxfer_len
417#define XS_TIME(ccb) (ccb)->ccb_h.timeout
323#define XS_RESID(ccb) (ccb)->resid
418#define XS_GET_RESID(ccb) (ccb)->resid
419#define XS_SET_RESID(ccb, r) (ccb)->resid = r
324#define XS_STSP(ccb) (&(ccb)->scsi_status)
325#define XS_SNSP(ccb) (&(ccb)->sense_data)
326
327#define XS_SNSLEN(ccb) \
328 imin((sizeof((ccb)->sense_data)), ccb->sense_len)
329
330#define XS_SNSKEY(ccb) ((ccb)->sense_data.flags & 0xf)
331#define XS_TAG_P(ccb) \

--- 30 unchanged lines hidden (view full) ---

362 XS_SETERR(ccb, CAM_REQ_INPROG), (ccb)->ccb_h.spriv_field0 = 0
363
364#define XS_SAVE_SENSE(xs, sense_ptr, sense_len) \
365 (xs)->ccb_h.status |= CAM_AUTOSNS_VALID; \
366 memcpy(&(xs)->sense_data, sense_ptr, imin(XS_SNSLEN(xs), sense_len))
367
368#define XS_SET_STATE_STAT(a, b, c)
369
420#define XS_STSP(ccb) (&(ccb)->scsi_status)
421#define XS_SNSP(ccb) (&(ccb)->sense_data)
422
423#define XS_SNSLEN(ccb) \
424 imin((sizeof((ccb)->sense_data)), ccb->sense_len)
425
426#define XS_SNSKEY(ccb) ((ccb)->sense_data.flags & 0xf)
427#define XS_TAG_P(ccb) \

--- 30 unchanged lines hidden (view full) ---

458 XS_SETERR(ccb, CAM_REQ_INPROG), (ccb)->ccb_h.spriv_field0 = 0
459
460#define XS_SAVE_SENSE(xs, sense_ptr, sense_len) \
461 (xs)->ccb_h.status |= CAM_AUTOSNS_VALID; \
462 memcpy(&(xs)->sense_data, sense_ptr, imin(XS_SNSLEN(xs), sense_len))
463
464#define XS_SET_STATE_STAT(a, b, c)
465
370#define DEFAULT_IID(x) (isp)->isp_osinfo.default_id
371#define DEFAULT_LOOPID(x) (isp)->isp_osinfo.default_id
372#define DEFAULT_NODEWWN(isp) (isp)->isp_osinfo.default_node_wwn
373#define DEFAULT_PORTWWN(isp) (isp)->isp_osinfo.default_port_wwn
374#define ISP_NODEWWN(isp) FCPARAM(isp)->isp_wwnn_nvram
375#define ISP_PORTWWN(isp) FCPARAM(isp)->isp_wwpn_nvram
466#define DEFAULT_FRAMESIZE(isp) isp->isp_osinfo.framesize
467#define DEFAULT_EXEC_THROTTLE(isp) isp->isp_osinfo.exec_throttle
376
468
469#define GET_DEFAULT_ROLE(isp, chan) \
470 (IS_FC(isp)? ISP_FC_PC(isp, chan)->role : ISP_SPI_PC(isp, chan)->role)
471#define SET_DEFAULT_ROLE(isp, chan, val) \
472 if (IS_FC(isp)) { \
473 ISP_FC_PC(isp, chan)->role = val; \
474 } else { \
475 ISP_SPI_PC(isp, chan)->role = val; \
476 }
377
477
378#if __FreeBSD_version < 500000
379#if _BYTE_ORDER == _LITTLE_ENDIAN
380#define bswap16 htobe16
381#define bswap32 htobe32
382#else
383#define bswap16 htole16
384#define bswap32 htole32
385#endif
386#endif
478#define DEFAULT_IID(isp, chan) isp->isp_osinfo.pc.spi[chan].iid
387
479
480#define DEFAULT_LOOPID(x, chan) isp->isp_osinfo.pc.fc[chan].default_id
481
482#define DEFAULT_NODEWWN(isp, chan) isp_default_wwn(isp, chan, 0, 1)
483#define DEFAULT_PORTWWN(isp, chan) isp_default_wwn(isp, chan, 0, 0)
484#define ACTIVE_NODEWWN(isp, chan) isp_default_wwn(isp, chan, 1, 1)
485#define ACTIVE_PORTWWN(isp, chan) isp_default_wwn(isp, chan, 1, 0)
486
487
388#if BYTE_ORDER == BIG_ENDIAN
389#ifdef ISP_SBUS_SUPPORTED
390#define ISP_IOXPUT_8(isp, s, d) *(d) = s
391#define ISP_IOXPUT_16(isp, s, d) \
392 *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap16(s)
393#define ISP_IOXPUT_32(isp, s, d) \
394 *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap32(s)
395#define ISP_IOXGET_8(isp, s, d) d = (*((uint8_t *)s))

--- 49 unchanged lines hidden (view full) ---

445/*
446 * Includes of common header files
447 */
448
449#include <dev/isp/ispreg.h>
450#include <dev/isp/ispvar.h>
451#include <dev/isp/ispmbox.h>
452
488#if BYTE_ORDER == BIG_ENDIAN
489#ifdef ISP_SBUS_SUPPORTED
490#define ISP_IOXPUT_8(isp, s, d) *(d) = s
491#define ISP_IOXPUT_16(isp, s, d) \
492 *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap16(s)
493#define ISP_IOXPUT_32(isp, s, d) \
494 *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap32(s)
495#define ISP_IOXGET_8(isp, s, d) d = (*((uint8_t *)s))

--- 49 unchanged lines hidden (view full) ---

545/*
546 * Includes of common header files
547 */
548
549#include <dev/isp/ispreg.h>
550#include <dev/isp/ispvar.h>
551#include <dev/isp/ispmbox.h>
552
453#ifdef ISP_TARGET_MODE
454#include <dev/isp/isp_tpublic.h>
455#endif
456
457/*
458 * isp_osinfo definiitions && shorthand
459 */
460#define SIMQFRZ_RESOURCE 0x1
461#define SIMQFRZ_LOOPDOWN 0x2
462#define SIMQFRZ_TIMED 0x4
463
553/*
554 * isp_osinfo definiitions && shorthand
555 */
556#define SIMQFRZ_RESOURCE 0x1
557#define SIMQFRZ_LOOPDOWN 0x2
558#define SIMQFRZ_TIMED 0x4
559
464#define isp_sim isp_osinfo.sim
465#define isp_path isp_osinfo.path
466#define isp_sim2 isp_osinfo.sim2
467#define isp_path2 isp_osinfo.path2
468#define isp_dev isp_osinfo.dev
469
470/*
471 * prototypes for isp_pci && isp_freebsd to share
472 */
560#define isp_dev isp_osinfo.dev
561
562/*
563 * prototypes for isp_pci && isp_freebsd to share
564 */
473extern void isp_attach(ispsoftc_t *);
565extern int isp_attach(ispsoftc_t *);
566extern void isp_detach(ispsoftc_t *);
474extern void isp_uninit(ispsoftc_t *);
567extern void isp_uninit(ispsoftc_t *);
568extern uint64_t isp_default_wwn(ispsoftc_t *, int, int, int);
475
476/*
477 * driver global data
478 */
479extern int isp_announced;
480extern int isp_fabric_hysteresis;
481extern int isp_loop_down_limit;
482extern int isp_gone_device_time;
483extern int isp_quickboot_time;
569
570/*
571 * driver global data
572 */
573extern int isp_announced;
574extern int isp_fabric_hysteresis;
575extern int isp_loop_down_limit;
576extern int isp_gone_device_time;
577extern int isp_quickboot_time;
578extern int isp_autoconfig;
484
485/*
486 * Platform private flags
487 */
488#define ISP_SPRIV_ERRSET 0x1
579
580/*
581 * Platform private flags
582 */
583#define ISP_SPRIV_ERRSET 0x1
489#define ISP_SPRIV_INWDOG 0x2
490#define ISP_SPRIV_GRACE 0x4
491#define ISP_SPRIV_DONE 0x8
492
584#define ISP_SPRIV_DONE 0x8
585
493#define XS_CMD_S_WDOG(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_INWDOG
494#define XS_CMD_C_WDOG(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_INWDOG
495#define XS_CMD_WDOG_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_INWDOG)
496
497#define XS_CMD_S_GRACE(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_GRACE
498#define XS_CMD_C_GRACE(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_GRACE
499#define XS_CMD_GRACE_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_GRACE)
500
501#define XS_CMD_S_DONE(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_DONE
502#define XS_CMD_C_DONE(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_DONE
503#define XS_CMD_DONE_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_DONE)
504
505#define XS_CMD_S_CLEAR(sccb) (sccb)->ccb_h.spriv_field0 = 0
506
507/*
508 * Platform Library Functions
509 */
510void isp_prt(ispsoftc_t *, int level, const char *, ...) __printflike(3, 4);
511uint64_t isp_nanotime_sub(struct timespec *, struct timespec *);
512int isp_mbox_acquire(ispsoftc_t *);
513void isp_mbox_wait_complete(ispsoftc_t *, mbreg_t *);
514void isp_mbox_notify_done(ispsoftc_t *);
515void isp_mbox_release(ispsoftc_t *);
586#define XS_CMD_S_DONE(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_DONE
587#define XS_CMD_C_DONE(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_DONE
588#define XS_CMD_DONE_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_DONE)
589
590#define XS_CMD_S_CLEAR(sccb) (sccb)->ccb_h.spriv_field0 = 0
591
592/*
593 * Platform Library Functions
594 */
595void isp_prt(ispsoftc_t *, int level, const char *, ...) __printflike(3, 4);
596uint64_t isp_nanotime_sub(struct timespec *, struct timespec *);
597int isp_mbox_acquire(ispsoftc_t *);
598void isp_mbox_wait_complete(ispsoftc_t *, mbreg_t *);
599void isp_mbox_notify_done(ispsoftc_t *);
600void isp_mbox_release(ispsoftc_t *);
601int isp_fc_scratch_acquire(ispsoftc_t *, int);
516int isp_mstohz(int);
517void isp_platform_intr(void *);
518void isp_common_dmateardown(ispsoftc_t *, struct ccb_scsiio *, uint32_t);
519
520/*
521 * Platform Version specific defines
522 */
602int isp_mstohz(int);
603void isp_platform_intr(void *);
604void isp_common_dmateardown(ispsoftc_t *, struct ccb_scsiio *, uint32_t);
605
606/*
607 * Platform Version specific defines
608 */
523#if __FreeBSD_version < 500000
524#define BUS_DMA_ROOTARG(x) NULL
525#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \
526 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z)
527#elif __FreeBSD_version < 700020
528#define BUS_DMA_ROOTARG(x) NULL
529#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \
530 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
531 busdma_lock_mutex, &Giant, z)
532#elif __FreeBSD_version < 700037
533#define BUS_DMA_ROOTARG(x) bus_get_dma_tag(x)
534#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \
535 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
609#define BUS_DMA_ROOTARG(x) bus_get_dma_tag(x)
610#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \
611 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
536 busdma_lock_mutex, &Giant, z)
537#else
538#define BUS_DMA_ROOTARG(x) bus_get_dma_tag(x)
539#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \
540 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
541 busdma_lock_mutex, &isp->isp_osinfo.lock, z)
612 busdma_lock_mutex, &isp->isp_osinfo.lock, z)
542#endif
543
613
544#if __FreeBSD_version < 700031
545#define isp_setup_intr(d, i, f, U, if, ifa, hp) \
546 bus_setup_intr(d, i, f, if, ifa, hp)
547#else
548#define isp_setup_intr bus_setup_intr
614#define isp_setup_intr bus_setup_intr
549#endif
550
615
551#if __FreeBSD_version < 500000
552#define isp_sim_alloc cam_sim_alloc
553#define isp_callout_init(x) callout_init(x)
554#elif __FreeBSD_version < 700037
555#define isp_callout_init(x) callout_init(x, 0)
556#define isp_sim_alloc cam_sim_alloc
557#else
558#define isp_callout_init(x) callout_init(x, 1)
559#define isp_sim_alloc(a, b, c, d, e, f, g, h) \
560 cam_sim_alloc(a, b, c, d, e, &(d)->isp_osinfo.lock, f, g, h)
616#define isp_sim_alloc(a, b, c, d, e, f, g, h) \
617 cam_sim_alloc(a, b, c, d, e, &(d)->isp_osinfo.lock, f, g, h)
561#endif
562
563/* Should be BUS_SPACE_MAXSIZE, but MAXPHYS is larger than BUS_SPACE_MAXSIZE */
618
619/* Should be BUS_SPACE_MAXSIZE, but MAXPHYS is larger than BUS_SPACE_MAXSIZE */
564#define ISP_MAXPHYS (128 * 1024)
565#define ISP_NSEGS ((ISP_MAXPHYS / PAGE_SIZE) + 1)
620#define ISP_NSEGS ((MAXPHYS / PAGE_SIZE) + 1)
566
621
622#define ISP_PATH_PRT(i, l, p, ...) \
623 if ((l) == ISP_LOGALL || ((l)& (i)->isp_dblev) != 0) { \
624 xpt_print(p, __VA_ARGS__); \
625 }
626
567/*
568 * Platform specific inline functions
569 */
627/*
628 * Platform specific inline functions
629 */
570static __inline int isp_get_pcmd(ispsoftc_t *, union ccb *);
571static __inline void isp_free_pcmd(ispsoftc_t *, union ccb *);
572
630
573static __inline int
574isp_get_pcmd(ispsoftc_t *isp, union ccb *ccb)
575{
576 ISP_PCMD(ccb) = isp->isp_osinfo.pcmd_free;
577 if (ISP_PCMD(ccb) == NULL) {
578 return (-1);
579 }
580 isp->isp_osinfo.pcmd_free = ((struct isp_pcmd *)ISP_PCMD(ccb))->next;
581 return (0);
582}
583
584static __inline void
585isp_free_pcmd(ispsoftc_t *isp, union ccb *ccb)
586{
587 ((struct isp_pcmd *)ISP_PCMD(ccb))->next = isp->isp_osinfo.pcmd_free;
588 isp->isp_osinfo.pcmd_free = ISP_PCMD(ccb);
589 ISP_PCMD(ccb) = NULL;
590}
591
592
593/*
594 * ISP General Library functions
595 */
596
597#include <dev/isp/isp_library.h>
598
599#endif /* _ISP_FREEBSD_H */
631/*
632 * ISP General Library functions
633 */
634
635#include <dev/isp/isp_library.h>
636
637#endif /* _ISP_FREEBSD_H */