1 /* $NetBSD: fw_port.h,v 1.20 2006/11/16 01:32:59 christos Exp $ */
2 /*
3 * Copyright (c) 2004 KIYOHARA Takashi
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 *
27 */
28
29 #ifndef _FW_PORT_H
30 #define _FW_PORT_H
31
32 #ifdef _KERNEL
33
34 #if defined(__FreeBSD__)
35 #ifdef __DragonFly__
36 #define OS_STR "DragonFly"
37 #define OS_VER __DragonFly_cc_version
38 #define OS_VER_STR "DragonFly-1"
39 #define PROJECT_STR "DragonFly Project"
40 #else
41 #define OS_STR "FreeBSD"
42 #define OS_VER __FreeBSD_version
43 #define OS_VER_STR "FreeBSD-5"
44 #define PROJECT_STR "FreeBSD Project"
45 #endif
46
47 #if defined(__DragonFly__) || __FreeBSD_version < 500000
48 #define dev2unit(x) ((minor(x) & 0xff) | (minor(x) >> 8))
49 #define unit2minor(x) (((x) & 0xff) | (((x) << 8) & ~0xffff))
50 #endif
51
52 #ifdef __DragonFly__
53 typedef d_thread_t fw_proc;
54 typedef d_thread_t fw_thread;
55 #include <sys/select.h>
56 #define M_DONTWAIT MB_DONTWAIT
57 #elif __FreeBSD_version >= 500000
58 typedef struct thread fw_proc;
59 typedef struct thread fw_thread;
60 #include <sys/selinfo.h>
61 #else
62 typedef struct proc fw_thread;
63 typedef struct proc fw_proc;
64 #include <sys/select.h>
65 #endif
66
67
68 #if defined(__DragonFly__) || __FreeBSD_version < 500000
69 #define CALLOUT_INIT(x) callout_init(x)
70 #define DEV_T dev_t
71 #define FW_LOCK
72 #define FW_UNLOCK
73 #define THREAD_CREATE(f, sc, p, name, arg) \
74 kthread_create(f, (void *)sc, p, name, arg)
75 #define THREAD_EXIT(x) kthread_exit()
76 #else
77 #define CALLOUT_INIT(x) callout_init(x, 0 /* mpsafe */)
78 #define DEV_T struct cdev *
79 #define FW_LOCK mtx_lock(&Giant)
80 #define FW_UNLOCK mtx_unlock(&Giant)
81 #define THREAD_CREATE(f, sc, p, name, arg) \
82 kthread_create(f, (void *)sc, p, 0, 0, name, arg)
83 #define THREAD_EXIT(x) kthread_exit(x)
84 #endif
85 #define fw_kthread_create(func, arg) \
86 func((arg))
87
88 /*
89 * fw attach macro for FreeBSD
90 */
91 #define FW_ATTACH(dname) \
92 static int \
93 __CONCAT(dname,_attach)(device_t dev)
94 #define FW_ATTACH_START(dname, sc, fwa) \
95 struct __CONCAT(dname,_softc) *sc = \
96 ((struct __CONCAT(dname,_softc) *)device_get_softc(dev)); \
97 __attribute__((__unused__))struct fw_attach_args *fwa = \
98 device_get_ivars(dev)
99 #define FW_ATTACH_RETURN(r) return (r)
100
101 /*
102 * fw detach macro for FreeBSD
103 */
104 #define FW_DETACH(dname) \
105 static int \
106 __CONCAT(dname,_detach)(device_t dev)
107 #define FW_DETACH_START(dname, sc) \
108 struct __CONCAT(dname,_softc) *sc = \
109 ((struct __CONCAT(dname,_softc) *)device_get_softc(dev))
110
111 /*
112 * fw intr macro for FreeBSD
113 */
114 #define FW_INTR(fwohci) \
115 void \
116 fwohci_intr(void *arg)
117 #define FW_INTR_RETURN(r) return
118
119 /*
120 * fw open macro for FreeBSD
121 */
122 #define FW_OPEN(dname) \
123 int \
124 __CONCAT(dname,_open)(DEV_T dev, int flags, int fmt, fw_proc *td)
125 #define FW_OPEN_START \
126 int unit = DEV2UNIT(dev); \
127 __attribute__((__unused__))struct firewire_softc *sc = \
128 devclass_get_softc(firewire_devclass, unit)
129
130 /*
131 * fw close macro for FreeBSD
132 */
133 #define FW_CLOSE(dname) \
134 int \
135 __CONCAT(dname,_close)(DEV_T dev, int flags, \
136 int fmt, fw_proc *td)
137 #define FW_CLOSE_START
138
139 /*
140 * fw read macro for FreeBSD
141 */
142 #define FW_READ(dname) \
143 int \
144 __CONCAT(dname,_read)(DEV_T dev, struct uio *uio, int ioflag)
145 #define FW_READ_START
146
147 /*
148 * fw write macro for FreeBSD
149 */
150 #define FW_WRITE(dname) \
151 int \
152 __CONCAT(dname,_write)(DEV_T dev, struct uio *uio, int ioflag)
153 #define FW_WRITE_START
154
155 /*
156 * fw ioctl macro for FreeBSD
157 */
158 #define FW_IOCTL(dname) \
159 int \
160 __CONCAT(dname,_ioctl) \
161 (DEV_T dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
162 #define FW_IOCTL_START \
163 int unit = DEV2UNIT(dev); \
164 __attribute__((__unused__))struct firewire_softc *sc = \
165 devclass_get_softc(firewire_devclass, unit)
166
167
168 /*
169 * fw poll macro for FreeBSD
170 */
171 #define FW_POLL(dname) \
172 int \
173 __CONCAT(dname,_poll)(DEV_T dev, int events, fw_proc *td)
174 #define FW_POLL_START
175
176 /*
177 * fw mmap macro for FreeBSD
178 */
179 #if defined(__DragonFly__) || __FreeBSD_version < 500102
180 #define FW_MMAP(dname) \
181 int \
182 __CONCAT(dname,_mmap)(DEV_T dev, vm_offset_t offset, int nproto)
183 #else
184 #define FW_MMAP(dname) \
185 int \
186 __CONCAT(dname,_mmap) \
187 (DEV_T dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto)
188 #endif
189 #define FW_MMAP_START
190
191 /*
192 * fw strategy macro for FreeBSD
193 */
194 #define FW_STRATEGY_START \
195 DEV_T dev = bp->bio_dev; \
196 int unit = DEV2UNIT(dev); \
197 __attribute__((__unused__))struct firewire_softc *sc = \
198 devclass_get_softc(firewire_devclass, unit)
199
200 /*
201 * if macro for FreeBSD
202 */
203 #define IF_STOP(dname) \
204 static void \
205 __CONCAT(dname,_stop)(struct __CONCAT(dname,_softc) *fwip)
206 #define IF_STOP_START(dname, ifp, sc) \
207 struct ifnet *ifp = &(sc)->fwip_if
208 #define IF_DETACH_START(dname, sc) \
209 struct __CONCAT(dname,_softc) *sc = \
210 (struct __CONCAT(dname,_softc) *)device_get_softc(dev)
211 #define IF_INIT(dname) \
212 static void \
213 __CONCAT(dname,_init)(void *arg)
214 #define IF_INIT_START(dname, sc, ifp) \
215 struct __CONCAT(dname,_softc) *sc = \
216 ((struct fwip_eth_softc *)arg)->fwip; \
217 struct ifnet *ifp = &(sc)->fwip_if
218 #define IF_INIT_RETURN(r) return
219 #define IF_IOCTL_START(dname, sc) \
220 struct __CONCAT(dname,_softc) *sc = \
221 ((struct fwip_eth_softc *)ifp->if_softc)->fwip
222
223 /*
224 * fwohci macro for FreeBSD
225 */
226 #define FWOHCI_INIT_END
227 #define FWOHCI_DETACH() \
228 int \
229 fwohci_detach(struct fwohci_softc *sc, device_t dev)
230 #define FWOHCI_DETACH_START
231 #define FWOHCI_DETACH_END
232 #define FWOHCI_STOP() \
233 int \
234 fwohci_stop(struct fwohci_softc *sc, device_t dev)
235 #define FWOHCI_STOP_START
236 #define FWOHCI_STOP_RETURN(r) return (r)
237
238 /*
239 * firewire macro for FreeBSD
240 */
241 #define FIREWIRE_ATTACH_START \
242 device_t pa = device_get_parent(dev); \
243 struct firewire_comm *fc = (struct firewire_comm *)device_get_softc(pa)
244 #define FWDEV_DESTROYDEV(sc) \
245 do { \
246 int err; \
247 if ((err = fwdev_destroydev((sc))) != 0) \
248 return err; \
249 } while (/*CONSTCOND*/0)
250 #define FIREWIRE_GENERIC_ATTACH \
251 do { \
252 /* Locate our children */ \
253 bus_generic_probe(dev); \
254 \
255 /* launch attachement of the added children */ \
256 bus_generic_attach(dev); \
257 } while (/*CONSTCOND*/0)
258 #define FIREWIRE_GENERIC_DETACH \
259 do { \
260 int err; \
261 if ((err = bus_generic_detach(dev)) != 0) \
262 return err; \
263 } while (/*CONSTCOND*/0)
264 #define FIREWIRE_SBP_ATTACH \
265 do { \
266 fwa.fwdev = fwdev; \
267 fwdev->sbp = device_add_child(fc->bdev, fwa.name, -1); \
268 if (fwdev->sbp) { \
269 device_set_ivars(fwdev->sbp, &fwa); \
270 device_probe_and_attach(fwdev->sbp); \
271 } \
272 } while (/*CONSTCOND*/0)
273 #define FIREWIRE_SBP_DETACH \
274 do { \
275 if (device_detach(fwdev->sbp) != 0) \
276 return; \
277 } while (/*CONSTCOND*/0)
278 #define FIREWIRE_CHILDREN_FOREACH_FUNC(func, fdc) \
279 do { \
280 device_t *devlistp; \
281 int i, devcnt; \
282 \
283 if (device_get_children(fc->bdev, &devlistp, &devcnt) == 0) { \
284 for( i = 0 ; i < devcnt ; i++) \
285 if (device_get_state(devlistp[i]) >= \
286 DS_ATTACHED) { \
287 (fdc) = device_get_softc(devlistp[i]);\
288 if ((fdc)->func != NULL) \
289 (fdc)->func((fdc)); \
290 } \
291 free(devlistp, M_TEMP); \
292 } \
293 } while (/*CONSTCOND*/0)
294
295 /*
296 * sbp macro for FreeBSD
297 */
298 #define SBP_ATTACH_START \
299 struct cam_devq *devq; \
300 \
301 bzero(sbp, sizeof(struct sbp_softc)); \
302 sbp->fd.dev = dev
303 #define SBP_SCSIBUS_ATTACH \
304 do { \
305 sbp->sim = cam_sim_alloc(sbp_action, sbp_poll, "sbp", sbp, \
306 device_get_unit(dev), \
307 /*untagged*/ 1, \
308 /*tagged*/ SBP_QUEUE_LEN - 1, \
309 devq); \
310 \
311 if (sbp->sim == NULL) { \
312 cam_simq_free(devq); \
313 return ENXIO; \
314 } \
315 \
316 if (xpt_bus_register(sbp->sim, /*bus*/0) != CAM_SUCCESS) \
317 goto fail; \
318 \
319 if (xpt_create_path( \
320 &sbp->path, xpt_periph, cam_sim_path(sbp->sim), \
321 CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {\
322 xpt_bus_deregister(cam_sim_path(sbp->sim)); \
323 goto fail; \
324 } \
325 xpt_async(AC_BUS_RESET, sbp->path, /*arg*/ NULL); \
326 } while (/*CONSTCOND*/0)
327 #define SBP_DEVICE(d) ((d)->path)
328 #define SBP_DEVICE_FREEZE(d, x) xpt_freeze_devq((d)->path, (x))
329 #define SBP_DEVICE_THAW(d, x) xpt_release_devq((d)->path, (x), TRUE)
330 #define SBP_BUS_FREEZE(b) \
331 do { \
332 if (((b)->sim->flags & SIMQ_FREEZED) == 0) { \
333 xpt_freeze_simq((b)->sim, /*count*/1); \
334 (b)->sim->flags |= SIMQ_FREEZED; \
335 } \
336 } while (/*CONSTCOND*/0)
337 #define SBP_BUS_THAW(b) \
338 do { \
339 xpt_release_simq((b)->sim, /*run queue*/TRUE); \
340 (b)->sim->flags &= ~SIMQ_FREEZED; \
341 } while (/*CONSTCOND*/0)
342 #define SBP_DEVICE_PREATTACH()
343
344 /*
345 * fwip macro for FreeBSD
346 */
347 #define FWIP_ATTACH_START \
348 int unit = device_get_unit(dev); \
349 struct fw_hwaddr *hwaddr = &fwip->fw_softc.fwcom.fc_hwaddr
350 #define FWIP_ATTACH_SETUP bzero(fwip, sizeof(struct fwip_softc))
351
352 #define FWDEV_MAKEDEV(sc) fwdev_makedev(sc)
353
354 #define FIREWIRE_IFATTACH(ifp, ha) \
355 firewire_ifattach((ifp), (ha))
356 #define FIREWIRE_IFDETACH(ifp) firewire_ifdetach((ifp));
357 #define FIREWIRE_BUSRESET(ifp) firewire_busreset((ifp))
358 #define FIREWIRE_INPUT(ifp, m, src) \
359 firewire_input((ifp), (m), (src))
360 #define FWIP_INIT(sc) fwip_init(&(sc)->fw_softc)
361 #define FWIP_STOP(sc) fwip_stop((sc))
362 #define FIREWIRE_IOCTL(ifp, cmd, data) \
363 firewire_ioctl((ifp), (cmd), (data))
364 #define IF_INITNAME(ifp, dev, unit) \
365 if_initname((ifp), device_get_name((dev)), (unit));
366 #define SET_IFFUNC(ifp, start, ioctl, init, stop) \
367 do { \
368 (ifp)->if_start = (start); \
369 (ifp)->if_ioctl = (ioctl); \
370 (ifp)->if_init = (init); \
371 } while (/*CONSTCOND*/0)
372
373 /*
374 * fwdev macro for FreeBSD
375 */
376 #define FWDEV_OPEN_START \
377 if (DEV_FWMEM(dev)) \
378 return fwmem_open(dev, flags, fmt, td)
379 #define FWDEV_CLOSE_START \
380 if (DEV_FWMEM(dev)) \
381 return fwmem_close(dev, flags, fmt, td)
382 #define FWDEV_READ_START \
383 if (DEV_FWMEM(dev)) \
384 return physio(dev, uio, ioflag)
385 #define FWDEV_WRITE_START \
386 if (DEV_FWMEM(dev)) \
387 return physio(dev, uio, ioflag)
388 #define FWDEV_IOCTL_START \
389 if (DEV_FWMEM(dev)) \
390 return fwmem_ioctl(dev, cmd, data, flag, td)
391 #define FWDEV_IOCTL_REDIRECT fc->ioctl (dev, cmd, data, flag, td)
392 #define FWDEV_POLL_START \
393 if (DEV_FWMEM(dev)) \
394 return fwmem_poll(dev, events, td)
395 #if defined(__DragonFly__) || __FreeBSD_version < 500102
396 #define FWDEV_MMAP_START \
397 if (DEV_FWMEM(dev)) \
398 return fwmem_mmap(dev, offset, nproto)
399 #else
400 #define FWDEV_MMAP_START \
401 if (DEV_FWMEM(dev)) \
402 return fwmem_mmap(dev, offset, paddr, nproto)
403 #endif
404 #define FWDEV_STRATEGY_START \
405 if (DEV_FWMEM(dev)) { \
406 fwmem_strategy(bp); \
407 return; \
408 }
409
410 #define XS_REQ_INVALID CAM_REQ_INVALID
411 #define XS_SCSI_BUS_RESET CAM_SCSI_BUS_RESET
412 #define XS_BDR_SENT CAM_BDR_SENT
413 #define XS_DEV_NOT_THERE CAM_DEV_NOT_THERE
414 #define XS_CMD_TIMEOUT CAM_CMD_TIMEOUT
415 #define XS_REQUEUE_REQ CAM_REQUEUE_REQ
416 #define XS_REQ_CMP CAM_REQ_CMP
417 #define XS_REQ_CMP_ERR CAM_REQ_CMP_ERR
418 #define XS_UA_ABORT CAM_UA_ABORT
419 #define XS_SENSE (CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID)
420
421 typedef union ccb sbp_scsi_xfer;
422 typedef struct scsi_inquiry_data sbp_scsi_inquiry_data;
423
424 #define SCSI_XFER_TARGET(x) ((x)->ccb_h.target_id)
425 #define SCSI_XFER_LUN(x) ((x)->ccb_h.target_lun)
426 #define SCSI_XFER_ERROR(x) ((x)->ccb_h.status)
427 #define SCSI_XFER_DIR(x) ((x)->ccb_h.flags & CAM_DIR_MASK)
428 #define SCSI_XFER_DATA_IN CAM_DIR_IN
429 #define SCSI_XFER_CALLOUT(x) ((x)->ccb_h.timeout_ch)
430 #define SCSI_XFER_TIMEOUT(x) ((x)->ccb_h.timeout)
431 #define SCSI_XFER_OPECODE(x) ((x)->csio.cdb_io.cdb_bytes[0])
432 #define SCSI_XFER_STATUS(x) ((x)->csio.scsi_status)
433 #define SCSI_XFER_EVPD(x) ((x)->csio.cdb_io.cdb_bytes[1] & SI_EVPD)
434 #define SCSI_XFER_CMDLEN(x) ((x)->csio.cdb_len)
435 #define SCSI_XFER_CMD(x) \
436 (((x)->csio.ccb_h.flags & CAM_CDB_POINTER) ?\
437 (void *)(x)->csio.cdb_io.cdb_ptr : \
438 (void *)&(x)->csio.cdb_io.cdb_bytes)
439 #define SCSI_XFER_DATALEN(x) ((x)->csio.dxfer_len)
440 #define SCSI_XFER_DATA(x) ((x)->csio.data_ptr)
441 #define SCSI_XFER_SENSELEN(x) ((x)->csio.sense_len)
442 #define SCSI_SENSE_DATA(x) (&(x)->csio.sense_data)
443 #define SCSI_INQUIRY_DATA(x) ((x)->csio.data_ptr)
444 #define SCSI_XFER_FUNCCODE(x) ((x)->ccb_h.func_code)
445 #define SCSI_XFER_10BCMD_DUMP(x) \
446 ((x)->csio.cdb_io.cdb_bytes[0]), \
447 ((x)->csio.cdb_io.cdb_bytes[1]), \
448 ((x)->csio.cdb_io.cdb_bytes[2]), \
449 ((x)->csio.cdb_io.cdb_bytes[3]), \
450 ((x)->csio.cdb_io.cdb_bytes[4]), \
451 ((x)->csio.cdb_io.cdb_bytes[5]), \
452 ((x)->csio.cdb_io.cdb_bytes[6]), \
453 ((x)->csio.cdb_io.cdb_bytes[7]), \
454 ((x)->csio.cdb_io.cdb_bytes[8]), \
455 ((x)->csio.cdb_io.cdb_bytes[9])
456 #define SCSI_XFER_REQUEST_COMPLETE(x)
457 #define SCSI_TRANSFER_DONE(x) xpt_done((x))
458 #ifdef SID_TYPE
459 #undef SID_TYPE
460 #define SID_TYPE 0x1f
461 #endif
462
463 #define NOT_LUN_WILDCARD(l) ((l) != CAM_LUN_WILDCARD)
464 #define CAM_XFER_FLAGS(x) ((x)->csio.ccb_h.flags)
465
466 #define mstohz(ms) \
467 (__predict_false((ms) >= 0x20000) ? \
468 (((ms) + 0u) / 1000u) * hz : \
469 (((ms) + 0u) * hz) / 1000u)
470
471 #define config_pending_incr()
472 #define config_pending_decr()
473
474 /*
475 * bus_dma macros for FreeBSD
476 */
477 typedef bus_dma_tag_t fw_bus_dma_tag_t;
478
479 #if defined(__FreeBSD__) && __FreeBSD_version >= 501102
480 #define fw_bus_dma_tag_create(t, \
481 a, b, laddr, haddr, ffunc, farg, s, ns, mxss, f, lfunc, larg, tp)\
482 bus_dma_tag_create((t), (a), (b), (laddr), (haddr), \
483 (ffunc), (farg), (s), (ns), (mxss), (f), (lfunc), (larg), (tp))
484 #else
485 #define fw_bus_dma_tag_create(t, a, b, \
486 laddr, haddr, ffunc, farg, s, ns, mxss, f, lfunc, larg, tp) \
487 bus_dma_tag_create((t), (a), (b), (laddr), (haddr), \
488 (ffunc), (farg), (s), (ns), (mxss), (f), (tp))
489 #endif
490 #define fw_bus_dma_tag_destroy(t) \
491 bus_dma_tag_destroy((t))
492 #define fw_bus_dmamap_create(t, f, mp) \
493 bus_dmamap_create((t), 0, (mp))
494 #define fw_bus_dmamap_destroy((t), (m)) \
495 bus_dmamap_destroy((t), (m))
496 #define fw_bus_dmamap_load(t, m, b, l, func, a, f) \
497 bus_dmamap_load((t), (m), (b), (l), (func), (a), 0)
498 #define fw_bus_dmamap_load_mbuf(t, m, b, func, a, f) \
499 bus_dmamap_load((t), (m), (b), (func), (a), 0)
500 #define fw_bus_dmamap_unload(t, m) \
501 bus_dmamap_unload((t), (m))
502 #if __FreeBSD_version < 500000
503 #define fw_bus_dmamap_sync(t, m, op) \
504 do { \
505 switch ((op)) { \
506 (BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE): \
507 bus_dmamap_sync((t), (m), BUS_DMASYNC_PREWRITE);\
508 bus_dmamap_sync((t), (m), BUS_DMASYNC_PREREAD); \
509 break; \
510 (BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE): \
511 /* BUS_DMASYNC_POSTWRITE is probably a no-op. */\
512 bus_dmamap_sync((t), (m), BUS_DMASYNC_POSTREAD);\
513 break; \
514 default: \
515 bus_dmamap_sync((t), (m), (op)); \
516 } \
517 } while (/*CONSTCOND*/0)
518 #else
519 #define fw_bus_dmamap_sync(t, m, op) \
520 bus_dmamap_sync((t), (m), (op))
521 #endif
522 #define fw_bus_dmamem_alloc(t, vp, f, mp) \
523 bus_dmamem_alloc((t), (vp), (f), (mp))
524 #define fw_bus_dmamem_free(t, v, m) \
525 bus_dmamem_free((t), (v), (m))
526
527 #define splfw() splimp()
528 #define splfwnet() splimp()
529 #define splfwsbp() splcam()
530
531
532 #elif defined(__NetBSD__)
533 #define OS_STR "NetBSD"
534 #define OS_VER __NetBSD_Version__
535 #define OS_VER_STR "NetBSD-2"
536 #define PROJECT_STR "NetBSD Project"
537
538 #define SSD_CURRENT_ERROR 0x70
539 #define SSD_DEFERRED_ERROR 0x71
540
541 #define T_RBC T_SIMPLE_DIRECT
542
543 #define SCSI_STATUS_CHECK_COND SCSI_CHECK
544 #define SCSI_STATUS_BUSY SCSI_BUSY
545 #define SCSI_STATUS_CMD_TERMINATED SCSI_TERMINATED
546
547 #define GIANT_REQUIRED
548 #define IFF_NEEDSGIANT 0
549
550 #define MTAG_FIREWIRE 1394
551 #define MTAG_FIREWIRE_HWADDR 0
552 #define MTAG_FIREWIRE_SENDER_EUID 1
553
554 #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
555
556 #define DFLTPHYS (64 * 1024) /* fake */
557
558 #define dev2unit minor
559 #define unit2minor(x) (((x) & 0xff) | (((x) << 12) & ~0xfffff)) /* XXX */
560
561 typedef struct lwp fw_proc;
562 typedef struct proc fw_thread;
563 #include <sys/select.h>
564
565 #define CALLOUT_INIT(x) callout_init(x)
566 #define DEV_T dev_t
567 #define FW_LOCK
568 #define FW_UNLOCK
569 #define THREAD_CREATE(f, sc, p, name, arg) \
570 kthread_create1(f, (void *)sc, p, name, arg)
571 #define THREAD_EXIT(x) kthread_exit(x)
572 #define fw_kthread_create(func, arg) \
573 kthread_create((func), (arg))
574
575 struct fwbus_attach_args {
576 const char *name;
577 };
578
579
580 /*
581 * fw attach macro for NetBSD
582 */
583 #define FW_ATTACH(dname) \
584 void \
585 __CONCAT(dname,attach) \
586 (struct device *parent, struct device *self, void *aux)
587 #define FW_ATTACH_START(dname, sc, fwa) \
588 struct __CONCAT(dname,_softc) *sc = \
589 (struct __CONCAT(dname,_softc) *)self; \
590 __attribute__((__unused__))struct fw_attach_args *fwa = \
591 (struct fw_attach_args *)aux
592 #define FW_ATTACH_RETURN(r) return
593
594 /*
595 * fw detach macro for NetBSD
596 */
597 #define FW_DETACH(dname) \
598 int \
599 __CONCAT(dname,detach)(struct device *self, int flags)
600 #define FW_DETACH_START(dname, sc) \
601 struct __CONCAT(dname,_softc) *sc = \
602 (struct __CONCAT(dname,_softc) *)self
603
604 /*
605 * fw intr macro for NetBSD
606 */
607 #define FW_INTR(fwohci) \
608 int \
609 fwohci_intr(void *arg)
610 #define FW_INTR_RETURN(r) return (r)
611
612 /*
613 * fw open macro for NetBSD
614 */
615 #define FW_OPEN(dname) \
616 int \
617 __CONCAT(dname,_open)(dev_t _dev, int flags, int fmt, \
618 fw_proc *td)
619 #define FW_OPEN_START \
620 struct firewire_softc *sc, *dev; \
621 \
622 sc = dev = device_lookup(&ieee1394if_cd, DEV2UNIT(_dev)); \
623 if (dev == NULL) \
624 return ENXIO
625
626 /*
627 * fw close macro for NetBSD
628 */
629 #define FW_CLOSE(dname) \
630 int \
631 __CONCAT(dname,_close)(dev_t _dev, int flags, \
632 int fmt, fw_proc *td)
633 #define FW_CLOSE_START \
634 int unit = DEV2UNIT(_dev); \
635 struct firewire_softc *dev = device_lookup(&ieee1394if_cd, unit); \
636 \
637 if (dev == NULL) \
638 return ENXIO
639
640 /*
641 * fw read macro for NetBSD
642 */
643 #define FW_READ(dname) \
644 int \
645 __CONCAT(dname,_read)(dev_t _dev, struct uio *uio, int ioflag)
646 #define FW_READ_START \
647 int unit = DEV2UNIT(_dev); \
648 struct firewire_softc *dev; \
649 \
650 dev = device_lookup(&ieee1394if_cd, unit); \
651 if (dev == NULL) \
652 return ENXIO
653
654 /*
655 * fw write macro for NetBSD
656 */
657 #define FW_WRITE(dname) \
658 int \
659 __CONCAT(dname,_write)(dev_t _dev, struct uio *uio, int ioflag)
660 #define FW_WRITE_START \
661 int unit = DEV2UNIT(_dev); \
662 struct firewire_softc *dev; \
663 \
664 dev = device_lookup(&ieee1394if_cd, unit); \
665 if (dev == NULL) \
666 return ENXIO
667
668 /*
669 * fw ioctl macro for NetBSD
670 */
671 #define FW_IOCTL(dname) \
672 int \
673 __CONCAT(dname,_ioctl) \
674 (dev_t _dev, u_long cmd, caddr_t data, \
675 int flag, fw_proc *td)
676 #define FW_IOCTL_START \
677 int unit = DEV2UNIT(_dev); \
678 struct firewire_softc *sc, *dev; \
679 \
680 sc = dev = device_lookup(&ieee1394if_cd, unit); \
681 if (dev == NULL) \
682 return ENXIO
683
684 /*
685 * fw poll macro for NetBSD
686 */
687 #define FW_POLL(dname) \
688 int \
689 __CONCAT(dname,_poll)(dev_t _dev, int events, \
690 fw_proc *td)
691 #define FW_POLL_START \
692 int unit = DEV2UNIT(_dev); \
693 struct firewire_softc *dev; \
694 \
695 dev = device_lookup(&ieee1394if_cd, unit); \
696 if (dev == NULL) \
697 return ENXIO
698
699 /*
700 * fw mmap macro for NetBSD
701 */
702 #define FW_MMAP(dname) \
703 paddr_t \
704 __CONCAT(dname,_mmap)(dev_t _dev, off_t offset, \
705 int nproto)
706 #define FW_MMAP_START \
707 int unit = DEV2UNIT(_dev); \
708 struct firewire_softc *dev; \
709 \
710 dev = device_lookup(&ieee1394if_cd, unit); \
711 if (dev == NULL) \
712 return ENXIO
713
714 /*
715 * fw strategy macro for NetBSD
716 */
717 #define FW_STRATEGY_START \
718 dev_t _dev = bp->bio_dev; \
719 int unit = DEV2UNIT(_dev); \
720 struct firewire_softc *sc, *dev; \
721 \
722 sc = dev = device_lookup(&ieee1394if_cd, unit); \
723 if (dev == NULL) \
724 return
725
726 /*
727 * if macro for NetBSD
728 */
729 #define IF_STOP(dname) \
730 void \
731 __CONCAT(dname,_stop)(struct ifnet *ifp, int disable)
732 #define IF_STOP_START(dname, ifp, sc) \
733 struct __CONCAT(dname,_softc) *sc = \
734 ((struct fwip_eth_softc *)(ifp)->if_softc)->fwip
735 #define IF_DETACH_START(dname, sc) \
736 struct __CONCAT(dname,_softc) *sc = \
737 (struct __CONCAT(dname,_softc) *)self
738 #define IF_INIT(dname) \
739 int \
740 __CONCAT(dname,_init)(struct ifnet *ifp)
741 #define IF_INIT_START(dname, sc, ifp) \
742 struct __CONCAT(dname,_softc) *sc = \
743 ((struct fwip_eth_softc *)ifp->if_softc)->fwip
744 #define IF_INIT_RETURN(r) return (r)
745 #define IF_IOCTL_START(dname, sc) \
746 struct __CONCAT(dname,_softc) *sc = \
747 ((struct fwip_eth_softc *)ifp->if_softc)->fwip
748
749 /*
750 * fwohci macro for NetBSD
751 */
752 #define FWOHCI_INIT_END \
753 do { \
754 struct fwbus_attach_args faa; \
755 faa.name = "ieee1394if"; \
756 sc->sc_shutdownhook = shutdownhook_establish(fwohci_stop, sc);\
757 sc->sc_powerhook = powerhook_establish(sc->fc._dev.dv_xname, \
758 fwohci_power, sc); \
759 sc->fc.bdev = config_found(sc->fc.dev, &faa, fwohci_print); \
760 } while (/*CONSTCOND*/0)
761 #define FWOHCI_DETACH() \
762 int \
763 fwohci_detach(struct fwohci_softc *sc, int flags)
764 #define FWOHCI_DETACH_START \
765 if (sc->fc.bdev != NULL) \
766 config_detach(sc->fc.bdev, flags)
767 #define FWOHCI_DETACH_END \
768 if (sc->sc_powerhook != NULL) \
769 powerhook_disestablish(sc->sc_powerhook); \
770 if (sc->sc_shutdownhook != NULL) \
771 shutdownhook_disestablish(sc->sc_shutdownhook)
772 #define FWOHCI_STOP() \
773 void \
774 fwohci_stop(void *arg)
775 #define FWOHCI_STOP_START struct fwohci_softc *sc = arg
776 #define FWOHCI_STOP_RETURN(r) return
777
778 /*
779 * firewire macro for NetBSD
780 */
781 #define FIREWIRE_ATTACH_START \
782 struct firewire_comm *fc = (struct firewire_comm *)parent; \
783 \
784 aprint_normal(": IEEE1394 bus\n"); \
785 \
786 fc->bdev = (struct device *)sc; \
787 sc->dev = &sc->_dev; \
788 SLIST_INIT(&sc->devlist)
789 #define FWDEV_DESTROYDEV(sc)
790 #define FIREWIRE_GENERIC_ATTACH \
791 do { \
792 struct fw_attach_args faa; \
793 struct firewire_dev_list *devlist, *elm; \
794 \
795 devlist = malloc( \
796 sizeof (struct firewire_dev_list), M_DEVBUF, M_NOWAIT); \
797 if (devlist == NULL) \
798 break; \
799 \
800 faa.name = "fwip"; \
801 faa.fc = fc; \
802 faa.fwdev = NULL; \
803 devlist->dev = config_found(sc->dev, &faa, firewire_print); \
804 if (devlist->dev == NULL) { \
805 free(devlist, M_DEVBUF); \
806 break; \
807 } \
808 \
809 if (SLIST_EMPTY(&sc->devlist)) \
810 SLIST_INSERT_HEAD(&sc->devlist, devlist, link); \
811 else { \
812 for (elm = SLIST_FIRST(&sc->devlist); \
813 SLIST_NEXT(elm, link) != NULL; \
814 elm = SLIST_NEXT(elm, link)); \
815 SLIST_INSERT_AFTER(elm, devlist, link); \
816 } \
817 } while (/*CONSTCOND*/0)
818 #define FIREWIRE_GENERIC_DETACH \
819 do { \
820 struct firewire_dev_list *devlist; \
821 int err; \
822 \
823 while ((devlist = SLIST_FIRST(&sc->devlist)) != NULL) { \
824 if ((err = config_detach(devlist->dev, flags)) != 0) \
825 return err; \
826 SLIST_REMOVE( \
827 &sc->devlist, devlist, firewire_dev_list, link); \
828 free(devlist, M_DEVBUF); \
829 } \
830 } while (/*CONSTCOND*/0)
831 #define FIREWIRE_SBP_ATTACH \
832 do { \
833 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
834 struct firewire_dev_list *devlist, *elm; \
835 int locs[IEEE1394IFCF_NLOCS]; \
836 \
837 devlist = malloc( \
838 sizeof (struct firewire_dev_list), M_DEVBUF, M_NOWAIT); \
839 if (devlist == NULL) { \
840 printf("memory allocation failed\n"); \
841 break; \
842 } \
843 \
844 locs[IEEE1394IFCF_EUIHI] = fwdev->eui.hi; \
845 locs[IEEE1394IFCF_EUILO] = fwdev->eui.lo; \
846 \
847 fwa.fwdev = fwdev; \
848 fwdev->sbp = config_found_sm_loc(sc->dev, "ieee1394if", \
849 locs, &fwa, firewire_print, config_stdsubmatch); \
850 if (fwdev->sbp == NULL) { \
851 free(devlist, M_DEVBUF); \
852 break; \
853 } \
854 \
855 devlist->fwdev = fwdev; \
856 devlist->dev = fwdev->sbp; \
857 \
858 if (SLIST_EMPTY(&sc->devlist)) \
859 SLIST_INSERT_HEAD(&sc->devlist, devlist, link); \
860 else { \
861 for (elm = SLIST_FIRST(&sc->devlist); \
862 SLIST_NEXT(elm, link) != NULL; \
863 elm = SLIST_NEXT(elm, link)); \
864 SLIST_INSERT_AFTER(elm, devlist, link); \
865 } \
866 } while (/*CONSTCOND*/0)
867 #define FIREWIRE_SBP_DETACH \
868 do { \
869 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
870 struct firewire_dev_list *devlist; \
871 \
872 SLIST_FOREACH(devlist, &sc->devlist, link) { \
873 if (devlist->fwdev != fwdev) \
874 continue; \
875 SLIST_REMOVE( \
876 &sc->devlist, devlist, firewire_dev_list, link); \
877 free(devlist, M_DEVBUF); \
878 \
879 if (config_detach(fwdev->sbp, DETACH_FORCE) != 0) \
880 return; \
881 } \
882 } while (/*CONSTCOND*/0)
883 #define FIREWIRE_CHILDREN_FOREACH_FUNC(func, fdc) \
884 do { \
885 struct firewire_dev_list *devlist; \
886 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
887 \
888 if (!SLIST_EMPTY(&sc->devlist)) { \
889 SLIST_FOREACH(devlist, &sc->devlist, link) { \
890 (fdc) = \
891 (struct firewire_dev_comm *)devlist->dev; \
892 if ((fdc)->func != NULL) \
893 (fdc)->func((fdc)); \
894 } \
895 } \
896 } while (/*CONSTCOND*/0)
897
898 /*
899 * sbp macro for NetBSD
900 */
901 #define SBP_ATTACH_START \
902 do { \
903 aprint_normal(": SBP-2/SCSI over IEEE1394\n"); \
904 \
905 sbp->fd.dev = &sbp->fd._dev; \
906 } while (/*CONSTCOND*/0)
907 #define SBP_SCSIBUS_ATTACH \
908 do { \
909 struct scsipi_adapter *sc_adapter = &sbp->sc_adapter; \
910 struct scsipi_channel *sc_channel = &sbp->sc_channel; \
911 struct sbp_target *target = &sbp->target; \
912 \
913 sc_adapter->adapt_dev = sbp->fd.dev; \
914 sc_adapter->adapt_nchannels = 1; \
915 sc_adapter->adapt_max_periph = 1; \
916 sc_adapter->adapt_request = sbp_scsipi_request; \
917 sc_adapter->adapt_minphys = sbp_minphys; \
918 sc_adapter->adapt_openings = 8; \
919 /*Start with some. Grow as needed.*/\
920 \
921 sc_channel->chan_adapter = sc_adapter; \
922 sc_channel->chan_bustype = &scsi_bustype; \
923 sc_channel->chan_defquirks = PQUIRK_ONLYBIG; \
924 sc_channel->chan_channel = 0; \
925 sc_channel->chan_flags = \
926 SCSIPI_CHAN_CANGROW | SCSIPI_CHAN_NOSETTLE; \
927 \
928 /* We set nluns 0 now */ \
929 sc_channel->chan_ntargets = 1; \
930 sc_channel->chan_nluns = target->num_lun; \
931 sc_channel->chan_id = 1; \
932 \
933 if ((sbp->sc_bus = \
934 config_found(sbp->fd.dev, sc_channel, scsiprint)) == \
935 NULL) { \
936 device_printf(sbp->fd.dev, "attach failed\n"); \
937 return; \
938 } \
939 } while (/*CONSTCOND*/0)
940 #define SBP_DEVICE(d) ((d)->periph)
941 #define SBP_DEVICE_FREEZE(d, x) scsipi_periph_freeze((d)->periph, (x));
942 #define SBP_DEVICE_THAW(d, x) \
943 do { \
944 if ((d)->periph) \
945 scsipi_periph_thaw((d)->periph, (x)); \
946 /* XXXX */ \
947 scsipi_channel_thaw(&(d)->target->sbp->sc_channel, 0); \
948 } while (/*CONSTCOND*/0)
949 #define SBP_BUS_FREEZE(b) scsipi_channel_freeze(&(b)->sc_channel, 1)
950 #define SBP_BUS_THAW(b) scsipi_channel_thaw(&(b)->sc_channel, 1)
951 #define SBP_DEVICE_PREATTACH() \
952 if (!sbp->proc) \
953 fw_kthread_create(fw_kthread_create0, sbp)
954
955 /*
956 * fwip macro for NetBSD
957 */
958 #define FWIP_ATTACH_START \
959 device_t dev = &fwip->fd._dev; \
960 struct fw_hwaddr *hwaddr = \
961 (struct fw_hwaddr *)&fwip->fw_softc.fwcom.ic_hwaddr
962 #define FWIP_ATTACH_SETUP aprint_normal(": IP over IEEE1394\n")
963
964 #define FWDEV_MAKEDEV(sc)
965 #define FIREWIRE_IFATTACH(ifp, ha) \
966 do { \
967 if_attach((ifp)); \
968 ieee1394_ifattach((ifp), (const struct ieee1394_hwaddr *)(ha));\
969 } while (/*CONSTCOND*/0)
970 #define FIREWIRE_IFDETACH(ifp) \
971 do { \
972 ieee1394_ifdetach((ifp)); \
973 if_detach((ifp)); \
974 } while (/*CONSTCOND*/0)
975 #define FIREWIRE_BUSRESET(ifp) ieee1394_drain((ifp))
976 #define FIREWIRE_INPUT(ifp, m, src) \
977 ieee1394_input((ifp), (m), (src))
978 #define FWIP_INIT(sc) fwip_init(&(sc)->fwip_if)
979 #define FWIP_STOP(sc) fwip_stop(&(sc)->fwip_if, 1)
980 #define FIREWIRE_IOCTL(ifp, cmd, data) \
981 ieee1394_ioctl((ifp), (cmd), (data))
982 #define IF_INITNAME(ifp, dev, unit) \
983 strcpy((ifp)->if_xname, (dev)->dv_xname);
984 #define SET_IFFUNC(ifp, start, ioctl, init, stop) \
985 do { \
986 (ifp)->if_start = (start); \
987 (ifp)->if_ioctl = (ioctl); \
988 (ifp)->if_init = (init); \
989 (ifp)->if_stop = (stop); \
990 } while (/*CONSTCOND*/0)
991
992 /*
993 * fwdev macro for NetBSD
994 */
995 #define FWDEV_OPEN_START \
996 if (DEV_FWMEM(_dev)) \
997 return fwmem_open(_dev, flags, fmt, td)
998 #define FWDEV_CLOSE_START \
999 if (DEV_FWMEM(_dev)) \
1000 return fwmem_close(_dev, flags, fmt, td)
1001 #define FWDEV_READ_START \
1002 if (DEV_FWMEM(_dev)) \
1003 return physio(fw_strategy, NULL, _dev, ioflag, minphys, uio)
1004 #define FWDEV_WRITE_START \
1005 if (DEV_FWMEM(_dev)) \
1006 return physio(fw_strategy, NULL, _dev, ioflag, minphys, uio)
1007 #define FWDEV_IOCTL_START \
1008 if (DEV_FWMEM(_dev)) \
1009 return fwmem_ioctl(_dev, cmd, data, flag, td)
1010 #define FWDEV_IOCTL_REDIRECT fc->ioctl (_dev, cmd, data, flag, td)
1011 #define FWDEV_POLL_START \
1012 if (DEV_FWMEM(_dev)) \
1013 return fwmem_poll(_dev, events, td)
1014 #define FWDEV_MMAP_START \
1015 if (DEV_FWMEM(_dev)) \
1016 return fwmem_mmap(_dev, offset, nproto)
1017 #define FWDEV_STRATEGY_START \
1018 if (DEV_FWMEM(_dev)) { \
1019 fwmem_strategy(bp); \
1020 return; \
1021 }
1022
1023 #define XS_REQ_INVALID XS_DRIVER_STUFFUP
1024 #define XS_SCSI_BUS_RESET XS_RESET
1025 #define XS_BDR_SENT XS_RESET
1026 #define XS_DEV_NOT_THERE XS_DRIVER_STUFFUP
1027 #define XS_CMD_TIMEOUT XS_TIMEOUT
1028 #define XS_REQUEUE_REQ XS_REQUEUE
1029 #define XS_REQ_CMP XS_NOERROR
1030 #define XS_REQ_CMP_ERR XS_DRIVER_STUFFUP
1031 #define XS_UA_ABORT XS_DRIVER_STUFFUP
1032
1033 typedef struct scsipi_xfer sbp_scsi_xfer;
1034 typedef struct scsipi_inquiry_data sbp_scsi_inquiry_data;
1035
1036 #define SCSI_XFER_TARGET(x) ((x)->xs_periph->periph_target)
1037 #define SCSI_XFER_LUN(x) ((x)->xs_periph->periph_lun)
1038 #define SCSI_XFER_ERROR(x) ((x)->error)
1039 #define SCSI_XFER_DIR(x) \
1040 ((x)->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT))
1041 #define SCSI_XFER_DATA_IN XS_CTL_DATA_IN
1042 #define SCSI_XFER_CALLOUT(x) ((x)->xs_callout)
1043 #define SCSI_XFER_TIMEOUT(x) ((x)->timeout)
1044 #define SCSI_XFER_OPECODE(x) ((x)->cmd->opcode)
1045 #define SCSI_XFER_STATUS(x) ((x)->xs_status)
1046 #define SCSI_XFER_EVPD(x) ((x)->cmd->bytes[0] & SI_EVPD)
1047 #define SI_EVPD 0x01
1048 #define SCSI_XFER_CMDLEN(x) ((x)->cmdlen)
1049 #define SCSI_XFER_CMD(x) ((x)->cmd)
1050 #define SCSI_XFER_DATALEN(x) ((x)->datalen)
1051 #define SCSI_XFER_DATA(x) ((x)->data)
1052 #define SCSI_XFER_SENSELEN(x) (0 /* XXXXX */)
1053 #define SCSI_SENSE_DATA(x) (&(x)->sense.scsi_sense)
1054 #define SCSI_INQUIRY_DATA(x) ((x)->data)
1055 #define SCSI_XFER_FUNCCODE(x) XPT_SCSI_IO
1056 #define SCSI_XFER_10BCMD_DUMP(x)\
1057 ((x)->cmd->opcode), \
1058 ((x)->cmd->bytes[0]), \
1059 ((x)->cmd->bytes[1]), \
1060 ((x)->cmd->bytes[2]), \
1061 ((x)->cmd->bytes[3]), \
1062 ((x)->cmd->bytes[4]), \
1063 ((x)->cmd->bytes[5]), \
1064 ((x)->cmd->bytes[6]), \
1065 ((x)->cmd->bytes[7]), \
1066 ((x)->cmd->bytes[8])
1067 #define SCSI_XFER_REQUEST_COMPLETE(x) \
1068 ((x)->resid = 0)
1069 #define SCSI_TRANSFER_DONE(x) scsipi_done((x))
1070
1071 #define NOT_LUN_WILDCARD(l) (1)
1072 #define CAM_XFER_FLAGS(x) (0) /* XXX */
1073 #define CAM_SCATTER_VALID (0) /* XXX */
1074 #define CAM_DATA_PHYS (0) /* XXX */
1075 #define XPT_SCSI_IO (1) /* XXX */
1076
1077
1078 #define splfw() splvm()
1079 #define splfwnet() splnet()
1080 #define splfwsbp() splbio()
1081 #define splsoftvm() splbio()
1082
1083 #define roundup2(x, y) roundup((x), (y))
1084 #ifndef rounddown
1085 #define rounddown(x, y) ((x) / (y) * (y))
1086 #endif
1087
1088 #define timevalcmp(tv1, tv2, op) timercmp((tv1), (tv2), op)
1089 #define timevalsub(tv1, tv2) timersub((tv1), (tv2), (tv1))
1090
1091 #define device_get_nameunit(dev) (dev)->dv_xname
1092 #define device_get_unit(dev) device_unit((dev))
1093
1094 /*
1095 * queue macros for NetBSD
1096 */
1097 #define STAILQ_LAST(head, type, field) \
1098 (STAILQ_EMPTY((head)) ? NULL : \
1099 (struct type *) \
1100 ((char *)(head)->stqh_last - (size_t)&((struct type *)0)->field))
1101
1102 #define TASK_INIT(task, priority, func, context)
1103
1104
1105 struct fw_hwaddr {
1106 uint32_t sender_unique_ID_hi;
1107 uint32_t sender_unique_ID_lo;
1108 uint8_t sender_max_rec;
1109 uint8_t sspd;
1110 uint16_t sender_unicast_FIFO_hi;
1111 uint32_t sender_unicast_FIFO_lo;
1112 };
1113
1114
1115 /*
1116 * mbuf macros for NetBSD
1117 */
1118 #include <sys/mbuf.h>
1119 #define M_TRYWAIT M_WAITOK
1120
1121 #define m_tag_alloc(cookie, type, len, wait) \
1122 m_tag_get((type), (len), (wait))
1123 #define m_tag_locate(m, cookie, type, t) \
1124 m_tag_find((m), (type), (t))
1125
1126 /*
1127 * bus_dma macros for NetBSD
1128 */
1129 #include <machine/bus.h>
1130 struct fw_bus_dma_tag {
1131 bus_dma_tag_t tag;
1132 bus_size_t alignment;
1133 bus_size_t boundary;
1134 bus_size_t size;
1135 int nsegments;
1136 bus_size_t maxsegsz;
1137 int flags;
1138 };
1139 typedef struct fw_bus_dma_tag *fw_bus_dma_tag_t;
1140 typedef int bus_dmasync_op_t;
1141 typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
1142 typedef void
1143 bus_dmamap_callback2_t(void *, bus_dma_segment_t *, int, bus_size_t, int);
1144
1145 #define fw_bus_dma_tag_create( \
1146 p, a, b, la, ha, ffunc, farg, maxsz, \
1147 nseg, maxsegsz, f, lfunc, larg, dmat) \
1148 \
1149 _fw_bus_dma_tag_create((p), (a), (b), (la), (ha), \
1150 (ffunc), (farg), (maxsz), (nseg), (maxsegsz), (f), (dmat))
1151
1152 static __inline int
1153 _fw_bus_dma_tag_create(bus_dma_tag_t parent,
1154 bus_size_t alignment, bus_size_t boundary,
1155 bus_addr_t lowaddr, bus_addr_t highaddr,
1156 void *filtfunc, void *filtfuncarg,
1157 bus_size_t maxsize, int nsegments, bus_size_t maxsegsz,
1158 int flags, fw_bus_dma_tag_t *fwdmat)
1159 {
1160 fw_bus_dma_tag_t tag;
1161
1162 tag = malloc(sizeof (struct fw_bus_dma_tag), M_DEVBUF, M_NOWAIT);
1163 if (tag == NULL)
1164 return ENOMEM;
1165
1166 /* XXXX */
1167 #define BUS_SPACE_MAXADDR_32BIT 0
1168 #define BUS_SPACE_MAXADDR 0
1169
1170 tag->tag = parent;
1171 tag->alignment = alignment;
1172 tag->boundary = boundary;
1173 tag->size = maxsize;
1174 tag->nsegments = nsegments;
1175 tag->maxsegsz = maxsegsz;
1176 tag->flags = flags;
1177
1178 *fwdmat = tag;
1179
1180 return 0;
1181 }
1182 #define fw_bus_dma_tag_destroy(ft) \
1183 free(ft, M_DEVBUF)
1184 #define fw_bus_dmamap_create(ft, f, mp) \
1185 bus_dmamap_create((ft)->tag, (ft)->size,\
1186 (ft)->nsegments, (ft)->maxsegsz, (ft)->boundary, (f), (mp))
1187 #define fw_bus_dmamap_destroy(ft, m) \
1188 bus_dmamap_destroy((ft)->tag, (m))
1189 static __inline int
1190 fw_bus_dmamap_load(fw_bus_dma_tag_t ft, bus_dmamap_t m,
1191 void *b, bus_size_t l, bus_dmamap_callback_t *func, void *a, int f)
1192 {
1193 int lf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
1194 BUS_DMA_READ | BUS_DMA_WRITE |
1195 BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
1196 int err = bus_dmamap_load(ft->tag, m, b, l, NULL, lf);
1197 (func)(a, m->dm_segs, m->dm_nsegs, err);
1198 return err;
1199 }
1200 static __inline int
1201 fw_bus_dmamap_load_mbuf(fw_bus_dma_tag_t ft, bus_dmamap_t m,
1202 struct mbuf *b, bus_dmamap_callback2_t *func, void *a, int f)
1203 {
1204 int lf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
1205 BUS_DMA_READ | BUS_DMA_WRITE |
1206 BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
1207 int err = bus_dmamap_load_mbuf(ft->tag, m, b, lf);
1208 (func)(a, m->dm_segs, m->dm_nsegs, m->dm_mapsize, err);
1209 return err;
1210 }
1211 #define fw_bus_dmamap_unload(ft, m) \
1212 bus_dmamap_unload((ft)->tag, (m))
1213 #define fw_bus_dmamap_sync(ft, m, op) \
1214 bus_dmamap_sync((ft)->tag, (m), 0, (m)->dm_mapsize, (op))
1215 static __inline int
1216 fw_bus_dmamem_alloc(fw_bus_dma_tag_t ft, void **vp, int f, bus_dmamap_t *mp)
1217 {
1218 bus_dma_segment_t segs;
1219 int nsegs, err;
1220 int af, mf, cf;
1221
1222 af = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
1223 BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
1224 err = bus_dmamem_alloc(ft->tag, ft->size,
1225 ft->alignment, ft->boundary, &segs, ft->nsegments, &nsegs, af);
1226 if (err) {
1227 printf("fw_bus_dmamem_alloc: failed(1)\n");
1228 return err;
1229 }
1230
1231 mf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT |
1232 BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4 |
1233 BUS_DMA_COHERENT | BUS_DMA_NOCACHE);
1234 err = bus_dmamem_map(ft->tag,
1235 &segs, nsegs, ft->size, (caddr_t *)vp, mf);
1236 if (err) {
1237 printf("fw_bus_dmamem_alloc: failed(2)\n");
1238 bus_dmamem_free(ft->tag, &segs, nsegs);
1239 return err;
1240 }
1241
1242 if (*mp != NULL)
1243 return err;
1244
1245 cf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW |
1246 BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
1247 err = bus_dmamap_create(ft->tag,
1248 ft->size, nsegs, ft->maxsegsz, ft->boundary, cf, mp);
1249 if (err) {
1250 printf("fw_bus_dmamem_alloc: failed(3)\n");
1251 bus_dmamem_unmap(ft->tag, (caddr_t)*vp, ft->size);
1252 bus_dmamem_free(ft->tag, &segs, nsegs);\
1253 }
1254
1255 return err;
1256 }
1257 #define fw_bus_dmamem_free(ft, v, m) \
1258 do { \
1259 bus_dmamem_unmap((ft)->tag, (v), (ft)->size); \
1260 bus_dmamem_free((ft)->tag, (m)->dm_segs, (m)->dm_nsegs);\
1261 bus_dmamap_destroy((ft)->tag, (m)); \
1262 } while (/*CONSTCOND*/0)
1263
1264
1265 #define device_printf(dev, fmt, ...) \
1266 do { \
1267 aprint_normal("%s: ", (dev)->dv_xname); \
1268 aprint_normal((fmt) ,##__VA_ARGS__); \
1269 } while (/*CONSTCOND*/0)
1270
1271
1272 #define CTR0(m, format)
1273 #define CTR1(m, format, p1)
1274
1275
1276 #define OHCI_CSR_WRITE(sc, reg, val) \
1277 bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
1278
1279 /*
1280 * XXXXXXXXXXX
1281 */
1282 #define atomic_set_int(P, V) (*(u_int*)(P) |= (V))
1283
1284 #endif
1285 #endif
1286 #if defined(__NetBSD__)
1287 #define vm_offset_t caddr_t
1288 #endif
1289 #endif
Cache object: 6eae1badef915593b6c955426346e134
|