Also add siginfo glue, BOOT_CONFIG, and various other changes.
-# $OpenBSD: DISKLESS,v 1.8 1997/01/12 15:12:13 downsj Exp $
-# $NetBSD: DISKLESS,v 1.11 1996/12/11 09:10:38 thorpej Exp $
+# $OpenBSD: DISKLESS,v 1.9 1997/02/03 04:47:05 downsj Exp $
+# $NetBSD: GENERIC,v 1.23 1997/01/31 06:12:57 thorpej Exp $
#
-# Diskless HP 9000/300-series workstation.
+# Generic kernel - one size fits all.
#
-machine "hp300"
-
-cpu "HP320"
-cpu "HP330" # includes 318, 319
-cpu "HP340"
-cpu "HP350"
-cpu "HP360"
-cpu "HP370"
-cpu "HP375" # includes 345, 400t, 400s
-cpu "HP380" # includes 425t, 425s, 433s
-ident DISKLESS
+
+# Include attributes common to all hp300s
+include "arch/hp300/conf/std.hp300"
+
+# Include all GENERIC option
+include "../../../conf/GENERIC"
+
+# Support for various CPU types
+option HP320
+option HP330 # includes 318, 319
+option HP340
+option HP350
+option HP360
+option HP370
+option HP375 # includes 345, 400t, 400s
+option HP380 # includes 425t, 425s, 433s
# Need to set locally
-timezone 8 dst
maxusers 8
-# Standard system options
-options SWAPPAGER # swap pager (anonymous and swap space)
-options DEVPAGER # device pager (mapped devices)
-options "COMPAT_43" # compatibility with 4.3BSD interfaces
-options "COMPAT_44" # compatibility with 4.4BSD binaries
-options "COMPAT_09" # compatibility with NetBSD 0.9
-options "COMPAT_10" # compatibility with NetBSD 1.0
-options COMPAT_M68K4K # NetBSD compatibility
-options SYSVSHM # System V-style shared memory
-options SYSVSEM # System V-style semaphores
-options SYSVMSG # System V-style message queues
-options KTRACE # system call tracing support
-options "NKMEMCLUSTERS=1024" # # 4K pages in kernel malloc pool
-
-# Filesystem options
-options FIFO # POSIX fifo support (in all filesystems)
-options NFSCLIENT # Network filesystem client
-options UNION # Union filesystem (req. for FDESC)
-options KERNFS # kernel data-structure filesystem
-options FDESC # user file descriptor filesystem
-options PROCFS # /proc filesystem
-options MFS # Memory-based filesystem
-
-# Networking options
-options INET # Internet protocols
-#options "TCP_COMPAT_42" # compatibility with 4.2BSD TCP/IP
-options NMBCLUSTERS="512" # Just a little extra
-
# Options for HP hardware
-options FPSP # floating point interface for 68040
-options USELEDS # make the lights twinkle
-#options PANICBUTTON # two fast <reset>s on HIL dump kernel
-options UK_KEYBOARD # include United Kingdom HIL keymap
-options SE_KEYBOARD # include Swedish HIL keymap
+option FPSP # floating point interface for 68040
+option USELEDS # make the lights twinkle
+option COMPAT_NOLABEL # defaults for unlabeled disks
+#option PANICBUTTON # two fast <reset>s on HIL dump kernel
+#option CONSCODE="9" # force console at this select code
+option UK_KEYBOARD # include United Kingdom HIL keymap
+option SE_KEYBOARD # include Swedish HIL keymap
+
+# This option enables a different copyin/copyout that uses page
+# mapping for large copies.
+#option MAPPEDCOPY # different copyin/copyout for large copies
#
# HP-UX binary compatibility.
# NOTE: THIS IS STILL VERY EXPERIMENTAL. YOUR MILEAGE MAY VARY.
#
-options COMPAT_HPUX # HP-UX binary compatibility
+option COMPAT_HPUX # HP-UX binary compatibility
+
+option COMPAT_M68K4K # compat. with NetBSD/m68k4k binaries
+
+# Verbose descriptions of unconfigured DIO devices
+# (Warning: this compiles in a large string table)
+option DIOVERBOSE # recognize "unknown" DIO devices
+
+config bsd swap generic
+
+mainbus0 at root # root "bus"
+
+intio0 at mainbus0 # internal i/o space
+dio0 at mainbus0 # DIO/DIO-II bus
+
+# Davinci framebuffer
+dvbox* at intio?
+dvbox* at dio? scode ?
+
+# Gatorbox framebuffer
+gbox* at intio?
+gbox* at dio? scode ?
-#options "COMPAT_M68K4K" # compat. with NetBSD/m68k4k binaries
+# Hyperion framebuffer
+hyper* at dio? scode ?
-# Debugging options
-options DDB # Kernel Dynamic Debugger
+# Renaissance framebuffer
+rbox* at intio?
+rbox* at dio? scode ?
-config bsd swap nfs
+# Topcat/catseye framebuffers
+topcat* at intio?
+topcat* at dio? scode ?
-device dca0 at scode9 flags 1
-device dca1 at scode? flags 1
+# Framebuffer abstraction
+grf* at dvbox?
+grf* at gbox?
+grf* at hyper?
+grf* at rbox?
+grf* at topcat?
-device dcm0 at scode? flags 0xe
-device dcm1 at scode? flags 0xe
+# Internal Terminal Emulator
+ite* at grf?
-device le0 at scode?
-device le1 at scode?
+dca0 at dio? scode 9 flags 1 # DCA serial interfaces
+dca* at dio? scode ?
-device grf0 at scode?
-device grf1 at scode?
+dcm* at dio? scode ? flags 0xe # DCM 4- or 8-port serial interfaces
-pseudo-device pty 64 # pseudo ptys
-pseudo-device bpfilter 16 # Berkeley packet filter
-pseudo-device vnd 4 # vnode pseudo-disks
-pseudo-device ite # terminal emulation on grf
-pseudo-device loop # loopback network interface
-pseudo-device ether # basic ethernet support
+le* at dio? scode ? # LANCE ethernet interfaces
-# $OpenBSD: GENERIC,v 1.11 1997/01/18 08:16:56 downsj Exp $
-# $NetBSD: GENERIC,v 1.16 1996/12/11 09:10:40 thorpej Exp $
+# $OpenBSD: GENERIC,v 1.12 1997/02/03 04:47:05 downsj Exp $
+# $NetBSD: GENERIC,v 1.23 1997/01/31 06:12:57 thorpej Exp $
#
# Generic kernel - one size fits all.
#
-machine "hp300"
-
-cpu "HP320"
-cpu "HP330" # includes 318, 319
-cpu "HP340"
-cpu "HP350"
-cpu "HP360"
-cpu "HP370"
-cpu "HP375" # includes 345, 400t, 400s
-cpu "HP380" # includes 425t, 425s, 433s
-ident GENERIC
+
+# Include attributes common to all hp300s
+include "arch/hp300/conf/std.hp300"
+
+# Include all GENERIC option
+include "../../../conf/GENERIC"
+
+# Support for various CPU types
+option HP320
+option HP330 # includes 318, 319
+option HP340
+option HP350
+option HP360
+option HP370
+option HP375 # includes 345, 400t, 400s
+option HP380 # includes 425t, 425s, 433s
# Need to set locally
-timezone 8 dst
maxusers 32
-# Standard system options
-options SWAPPAGER # swap pager (anonymous and swap space)
-options DEVPAGER # device pager (mapped devices)
-options "COMPAT_43" # compatibility with 4.3BSD interfaces
-options "COMPAT_44" # compatibility with 4.4BSD binaries
-options "COMPAT_09" # compatibility with NetBSD 0.9
-options "COMPAT_10" # compatibility with NetBSD 1.0
-options COMPAT_M68K4K # NetBSD compatibility
-options SYSVSHM # System V-style shared memory
-options SYSVSEM # System V-style semaphores
-options SYSVMSG # System V-style message queues
-options KTRACE # system call tracing support
-options "NKMEMCLUSTERS=1024" # 4K pages in kernel malloc pool
-
-# Filesystem options
-options FIFO # POSIX fifo support (in all filesystems)
-options FFS,QUOTA # fast filesystem with user and group quotas
-options "CD9660" # CD-ROM ISO-9660 filesystem
-options NFSSERVER # Network filesystem server
-options NFSCLIENT # Network filesystem client
-options UNION # Union filesystem (req. for FDESC)
-options KERNFS # kernel data-structure filesystem
-options FDESC # user file descriptor filesystem
-options PROCFS # /proc filesystem
-options PORTAL # create sockets with open(2)
-options UMAPFS # NULLFS + uid and gid remapping
-options NULLFS # loopback file system
-options MFS # Memory-based filesystem
-
-# Networking options
-options INET # Internet protocols
-#options GATEWAY # IP forwarding + larger mb_map
-options MROUTING # Multicast routing
-options IPFILTER # IP packet filter for security
-#options "TCP_COMPAT_42" # compatibility with 4.2BSD TCP/IP
-
# Options for HP hardware
-options FPSP # floating point interface for 68040
-options USELEDS # make the lights twinkle
-options COMPAT_NOLABEL # defaults for unlabeled disks
-#options PANICBUTTON # two fast <reset>s on HIL dump kernel
-#options CONSCODE="9" # force console at this select code
-options UK_KEYBOARD # include United Kingdom HIL keymap
-options SE_KEYBOARD # include Swedish HIL keymap
+option FPSP # floating point interface for 68040
+option USELEDS # make the lights twinkle
+option COMPAT_NOLABEL # defaults for unlabeled disks
+#option PANICBUTTON # two fast <reset>s on HIL dump kernel
+#option CONSCODE="9" # force console at this select code
+option UK_KEYBOARD # include United Kingdom HIL keymap
+option SE_KEYBOARD # include Swedish HIL keymap
+
+# This option enables a different copyin/copyout that uses page
+# mapping for large copies.
+#option MAPPEDCOPY # different copyin/copyout for large copies
#
# HP-UX binary compatibility.
# NOTE: THIS IS STILL VERY EXPERIMENTAL. YOUR MILEAGE MAY VARY.
#
-options COMPAT_HPUX # HP-UX binary compatibility
+option COMPAT_HPUX # HP-UX binary compatibility
+
+option COMPAT_M68K4K # compat. with NetBSD/m68k4k binaries
-# Debugging options
-options DDB # Kernel Dynamic Debugger
+# Verbose descriptions of unconfigured DIO devices
+# (Warning: this compiles in a large string table)
+option DIOVERBOSE # recognize "unknown" DIO devices
config bsd swap generic
-master hpib0 at scode7
-master hpib1 at scode?
-master hpib2 at scode?
-master hpib3 at scode?
-disk rd0 at hpib? slave ?
-disk rd1 at hpib? slave ?
-disk rd2 at hpib? slave ?
-disk rd3 at hpib? slave ?
-disk rd4 at hpib? slave ?
-disk rd5 at hpib? slave ?
-disk rd6 at hpib? slave ?
-tape ct0 at hpib0 slave ?
-tape ct1 at hpib0 slave ? flags 1
-tape mt0 at hpib0 slave ?
-device ppi0 at hpib0 slave 5
-
-master scsi0 at scode?
-master scsi1 at scode?
-master scsi2 at scode?
-master scsi3 at scode?
-disk sd0 at scsi? slave ?
-disk sd1 at scsi? slave ?
-disk sd2 at scsi? slave ?
-disk sd3 at scsi? slave ?
-disk sd4 at scsi? slave ?
-disk sd5 at scsi? slave ?
-disk sd6 at scsi? slave ?
-disk sd7 at scsi? slave ?
-disk sd8 at scsi? slave ?
-disk sd9 at scsi? slave ?
-tape st0 at scsi? slave ?
-tape st1 at scsi? slave ?
-
-device dca0 at scode9 flags 1
-device dca1 at scode?
-
-device dcm0 at scode? flags 0xe
-device dcm1 at scode? flags 0xe
-
-device le0 at scode?
-device le1 at scode?
-
-device grf0 at scode?
-device grf1 at scode?
-
-pseudo-device pty 64 # pseudo ptys
-pseudo-device sl 4 # SLIP network interfaces
-pseudo-device ppp 4 # PPP network interfaces
-pseudo-device bpfilter 16 # Berkeley packet filter
-pseudo-device vnd 4 # vnode pseudo-disks
-pseudo-device ccd 4 # concatenated disk devices
-pseudo-device ite # terminal emulation on grf
-pseudo-device loop # loopback network interface
-pseudo-device ether # basic ethernet support
+mainbus0 at root # root "bus"
+
+intio0 at mainbus0 # internal i/o space
+dio0 at mainbus0 # DIO/DIO-II bus
+
+# Davinci framebuffer
+dvbox* at intio?
+dvbox* at dio? scode ?
+
+# Gatorbox framebuffer
+gbox* at intio?
+gbox* at dio? scode ?
+
+# Hyperion framebuffer
+hyper* at dio? scode ?
+
+# Renaissance framebuffer
+rbox* at intio?
+rbox* at dio? scode ?
+
+# Topcat/catseye framebuffers
+topcat* at intio?
+topcat* at dio? scode ?
+
+# Framebuffer abstraction
+grf* at dvbox?
+grf* at gbox?
+grf* at hyper?
+grf* at rbox?
+grf* at topcat?
+
+# Internal Terminal Emulator
+ite* at grf?
+
+dca0 at dio? scode 9 flags 1 # DCA serial interfaces
+dca* at dio? scode ?
+
+dcm* at dio? scode ? flags 0xe # DCM 4- or 8-port serial interfaces
+
+le* at dio? scode ? # LANCE ethernet interfaces
+
+nhpib0 at dio? scode 7 # slow internal HP-IB
+nhpib* at dio? scode ?
+
+fhpib* at dio? scode ? # `fast' HP-IB
+
+hpibbus0 at nhpib0
+hpibbus* at nhpib?
+hpibbus* at fhpib?
+
+rd* at hpibbus? slave ? punit ? # HP-IB disks
+ct* at hpibbus? slave ? punit ? # HP-IB cartridge tapes
+mt* at hpibbus? slave ? punit ? # HP-IB 9-track tape
+ppi0 at hpibbus0 slave 5 punit 0 # HP-IB plotter
+
+oscsi* at dio? scode ? # Old HP SCSI
+
+sd* at oscsi? target ? lun ? # SCSI disks
+st* at oscsi? target ? lun ? # SCSI tapes
+ac* at oscsi? target ? lun ? # SCSI changers
-# $OpenBSD: Makefile.hp300,v 1.11 1997/01/18 15:30:10 niklas Exp $
+# $OpenBSD: Makefile.hp300,v 1.12 1997/02/03 04:47:06 downsj Exp $
# $NetBSD: Makefile.hp300,v 1.45 1996/12/01 06:12:30 jonathan Exp $
# Makefile for OpenBSD
ioconf.o: ioconf.c
${NORMAL_C}
-vers.o: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP}
+newvers: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP}
sh $S/conf/newvers.sh
${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c vers.c
+++ /dev/null
-# $OpenBSD: NEWCONFIG,v 1.1 1997/01/12 15:12:14 downsj Exp $
-# $NetBSD: NEWCONFIG,v 1.1 1996/12/17 08:40:56 thorpej Exp $
-#
-# "Generic" kernel for new-style config.
-#
-
-# Include attributes common to all hp300s
-include "arch/hp300/conf/std.hp300"
-
-# Support for various CPU types
-options HP320
-options HP330 # includes 318, 319
-options HP340
-options HP350
-options HP360
-options HP370
-options HP375 # includes 345, 400t, 400s
-options HP380 # includes 425t, 425s, 433s
-
-# Need to set locally
-maxusers 32
-
-# Standard system options
-options COMPAT_43 # compatibility with 4.3BSD interfaces
-options COMPAT_44 # compatibility with 4.4BSD binaries
-options COMPAT_09 # compatibility with NetBSD 0.9
-options COMPAT_10 # compatibility with NetBSD 1.0
-options COMPAT_11 # compatibility with NetBSD 1.1
-options COMPAT_12 # compatibility with NetBSD 1.2
-options SYSVSHM # System V-style shared memory
-options SYSVSEM # System V-style semaphores
-options SYSVMSG # System V-style message queues
-options KTRACE # system call tracing support
-options "NKMEMCLUSTERS=1024" # # 4K pages in kernel malloc pool
-
-# Filesystem options
-options FIFO # POSIX fifo support (in all filesystems)
-options FFS,QUOTA # fast filesystem with user and group quotas
-options CD9660 # CD-ROM ISO-9660 filesystem
-options NFSSERVER # Network filesystem server
-options NFSCLIENT # Network filesystem client
-options UNION # Union filesystem (req. for FDESC)
-options KERNFS # kernel data-structure filesystem
-options FDESC # user file descriptor filesystem
-options PROCFS # /proc filesystem
-options MFS # Memory-based filesystem
-
-# Networking options
-options INET # Internet protocols
-options GATEWAY # IP forwarding + larger mb_map
-options MROUTING # Multicast routing
-options TCP_COMPAT_42 # compatibility with 4.2BSD TCP/IP
-
-# Options for HP hardware
-options FPSP # floating point interface for 68040
-options USELEDS # make the lights twinkle
-options COMPAT_NOLABEL # defaults for unlabeled disks
-#options PANICBUTTON # two fast <reset>s on HIL dump kernel
-#options CONSCODE="9" # force console at this select code
-options UK_KEYBOARD # include United Kingdom HIL keymap
-options SE_KEYBOARD # include Swedish HIL keymap
-
-# This option enables a different copyin/copyout that uses page
-# mapping for large copies.
-#options MAPPEDCOPY # different copyin/copyout for large copies
-
-#
-# HP-UX binary compatibility.
-# NOTE: THIS IS STILL VERY EXPERIMENTAL. YOUR MILEAGE MAY VARY.
-#
-options COMPAT_HPUX # HP-UX binary compatibility
-
-options COMPAT_M68K4K # compat. with NetBSD/m68k4k binaries
-
-# Debugging options
-options DIAGNOSTIC # Extra kernel sanity checks
-#options DEBUG # Enable misc. kernel debugging code
-options DDB # Kernel Dynamic Debugger
-
-config netbsd swap generic
-
-mainbus0 at root # root "bus"
-
-intio0 at mainbus0 # internal i/o space
-dio0 at mainbus0 # DIO/DIO-II bus
-
-# Davinci framebuffer
-dvbox* at intio?
-dvbox* at dio? scode ?
-
-# Gatorbox framebuffer
-gbox* at intio?
-gbox* at dio? scode ?
-
-# Hyperion framebuffer
-hyper* at dio? scode ?
-
-# Renaissance framebuffer
-rbox* at intio?
-rbox* at dio? scode ?
-
-# Topcat/catseye framebuffers
-topcat* at intio?
-topcat* at dio? scode ?
-
-# Framebuffer abstraction
-grf* at dvbox?
-grf* at gbox?
-grf* at hyper?
-grf* at rbox?
-grf* at topcat?
-
-# Internal Terminal Emulator
-ite* at grf?
-
-dca0 at dio? scode 9 flags 1 # DCA serial interfaces
-dca* at dio? scode ?
-
-dcm* at dio? scode ? flags 0xe # DCM 4- or 8-port serial interfaces
-
-le* at dio? scode ? # LANCE ethernet interfaces
-
-#nhpib0 at dio? scode 7 # slow internal HP-IB
-#nhpib* at dio? scode ?
-
-#fhpib* at dio? scode ? # `fast' HP-IB
-
-#hpibbus* at nhpib?
-#hpibbus* at fhpib?
-
-#rd* at hpibbus? slave ? punit ? # HP-IB disks
-#ct* at hpibbus? slave ? punit ? # HP-IB cartridge tapes
-#mt* at hpibbus? slave ? punit ? # HP-IB 9-track tape
-#ppi0 at hpibbus0 slave 5 punit 0 # HP-IB plotter
-
-#oscsi* at dio? scode ? # Old HP SCSI
-
-#sd* at oscsi? target ? lun ? # SCSI disks
-#st* at oscsi? target ? lun ? # SCSI tapes
-#ac* at oscsi? target ? lun ? # SCSI changers
-
-pseudo-device pty 64 # pseudo ptys
-pseudo-device sl 4 # SLIP network interfaces
-pseudo-device ppp 4 # PPP network interfaces
-pseudo-device bpfilter 16 # Berkeley packet filter
-pseudo-device vnd 4 # vnode pseudo-disks
-pseudo-device ccd 4 # concatenated disk devices
-pseudo-device loop # loopback network interface
+++ /dev/null
-ct 0
-mt 1
-rd 2
-sd 4
-ccd 5
-vnd 6
-# $OpenBSD: files.hp300,v 1.1 1997/01/12 15:12:15 downsj Exp $
-# $NetBSD: files.hp300,v 1.20 1996/12/17 08:40:57 thorpej Exp $
+# $OpenBSD: files.hp300,v 1.2 1997/02/03 04:47:08 downsj Exp $
+# $NetBSD: files.hp300,v 1.22 1997/01/30 22:11:19 scottr Exp $
#
# hp300-specific configuration info
device ct: tape
attach ct at hpibbus
file arch/hp300/dev/ct.c ct needs-flag
+major {ct = 0}
device mt: tape
attach mt at hpibbus
file arch/hp300/dev/mt.c mt needs-flag
+major {mt = 1}
device rd: disk
attach rd at hpibbus
file arch/hp300/dev/rd.c rd needs-flag
file arch/hp300/dev/rd_compat.c rd # XXX
+major {rd = 2}
device ppi
attach ppi at hpibbus
# Old HP SCSI layer
device oscsi { target = -1, lun = -1 }
attach oscsi at dio
-file arch/hp300/dev/scsi.c scsi
+file arch/hp300/dev/scsi.c oscsi
# Old HP SCSI devices
device sd: disk
attach sd at oscsi
file arch/hp300/dev/sd.c sd needs-flag
file arch/hp300/dev/sd_compat.c sd # XXX
+major {sd = 4}
device st: tape
attach st at oscsi
file kludge_for_in_proto.c hy needs-flag
+major {vnd = 6}
+
#
# HP-UX binary compatibility
#
+++ /dev/null
-# $OpenBSD: files.hp300.oldconf,v 1.6 1997/01/12 15:12:15 downsj Exp $
-# $NetBSD: files.hp300.oldconf,v 1.30 1997/01/05 04:41:48 thorpej Exp $
-#
-arch/hp300/hp300/autoconf.c standard
-arch/hp300/hp300/clock.c standard
-arch/hp300/hp300/conf.c standard
-arch/hp300/hp300/db_memrw.c optional ddb
-arch/hp300/hp300/dkbad.c standard
-arch/hp300/hp300/kgdb_glue.c optional kgdb compile-with "${NORMAL_C} -fno-defer-pop"
-arch/hp300/hp300/kgdb_stub.c optional kgdb
-arch/hp300/hp300/machdep.c standard
-arch/hp300/hp300/isr.c standard
-arch/hp300/hp300/mem.c standard
-arch/hp300/hp300/pmap.c standard
-arch/hp300/hp300/pmap_bootstrap.c standard
-arch/hp300/hp300/sys_machdep.c standard
-arch/hp300/hp300/trap.c standard
-arch/hp300/hp300/vm_machdep.c standard
-arch/hp300/hp300/disksubr.c standard
-arch/hp300/dev/dio.c standard
-arch/hp300/dev/grf_conf.c optional grf
-arch/hp300/dev/grf_dv.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/grf_gb.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/grf_hy.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/grf_machdep.c optional grf
-arch/hp300/dev/grf_rb.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/grf_tc.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/dcm.c optional dcm device-driver
-arch/hp300/dev/if_le.c optional le device-driver
-dev/ic/am7990.c optional le device-driver
-arch/hp300/dev/dma.c standard
-arch/hp300/dev/hpib.c optional hpib
-arch/hp300/dev/fhpib.c optional hpib device-driver
-arch/hp300/dev/nhpib.c optional hpib device-driver
-arch/hp300/dev/ct.c optional ct needs-count # XXX? d-d?
-arch/hp300/dev/mt.c optional mt needs-count # XXX? d-d?
-arch/hp300/dev/ppi.c optional ppi device-driver
-arch/hp300/dev/rd.c optional rd needs-count # XXX? d-d?
-arch/hp300/dev/rd_compat.c optional rd compat_nolabel
-arch/hp300/dev/scsi.c optional scsi device-driver
-arch/hp300/dev/ac.c optional ac needs-count # XXX? d-d?
-arch/hp300/dev/sd.c optional sd needs-count # XXX? d-d?
-arch/hp300/dev/sd_compat.c optional sd compat_nolabel
-arch/hp300/dev/st.c optional st needs-count # XXX? d-d?
-arch/hp300/dev/dca.c optional dca device-driver
-arch/hp300/dev/grf.c optional grf needs-count # XXX? d-d?
-arch/hp300/dev/hil.c standard
-arch/hp300/dev/hil_keymaps.c standard
-arch/hp300/dev/ite.c optional ite needs-count # XXX? d-d?
-arch/hp300/dev/ite_subr.c optional ite needs-count # XXX? d-d?
-arch/m68k/m68k/copy.s standard
-dev/cons.c standard
-dev/cninit.c standard
-thisisfor_in_proto.c optional hy
-
-#
-# Compatibility modules
-#
-
-# HPUX Binary Compatibility (COMPAT_HPUX)
-# XXX: Cannot use an include directive yet. When the upgrade to the
-# new config is complete, the include line should be uncommented
-# and the others should be removed
-#
-# include "../../../compat/hpux/files.hpux"
-
-compat/hpux/hpux_compat.c optional compat_hpux
-compat/hpux/hpux_file.c optional compat_hpux
-compat/hpux/hpux_exec.c optional compat_hpux
-compat/hpux/hpux_net.c optional compat_hpux
-compat/hpux/hpux_sig.c optional compat_hpux
-compat/hpux/hpux_syscalls.c optional compat_hpux
-compat/hpux/hpux_sysent.c optional compat_hpux
-compat/hpux/hpux_tty.c optional compat_hpux
-arch/hp300/hp300/hpux_machdep.c optional compat_hpux
-# $OpenBSD: std.hp300,v 1.1 1997/01/12 15:12:16 downsj Exp $
-# $NetBSD: std.hp300,v 1.1 1996/12/17 08:40:58 thorpej Exp $
+# $OpenBSD: std.hp300,v 1.2 1997/02/03 04:47:09 downsj Exp $
+# $NetBSD: std.hp300,v 1.2 1997/01/30 09:55:45 thorpej Exp $
#
# Options/devices that all hp300s should have
#
machine hp300 m68k
-# XXX new config glue, for now
-options NEWCONFIG
-
-options SWAPPAGER # swap pager (anonymous and swap space)
-options VNODEPAGER # vnode pager (mapped files)
-options DEVPAGER # device pager (mapped devices)
-
-options EXEC_AOUT # support for exec'ing a.out
-options EXEC_SCRIPT # support for #! scripts
+#option SWAPPAGER # swap pager (anonymous and swap space)
+#option VNODEPAGER # vnode pager (mapped files)
+#option DEVPAGER # device pager (mapped devices)
-# $OpenBSD: Makefile,v 1.1 1997/01/12 15:12:17 downsj Exp $
-# $NetBSD: Makefile,v 1.1 1996/12/17 08:40:59 thorpej Exp $
+# $OpenBSD: Makefile,v 1.2 1997/02/03 04:47:10 downsj Exp $
+# $NetBSD: Makefile,v 1.2 1997/01/30 09:18:33 thorpej Exp $
AWK= awk
-/* $OpenBSD: ac.c,v 1.4 1997/01/12 15:12:17 downsj Exp $
-/* $NetBSD: ac.c,v 1.6 1996/10/13 03:14:05 christos Exp $ */
+/* $OpenBSD: ac.c,v 1.5 1997/02/03 04:47:11 downsj Exp $
+/* $NetBSD: ac.c,v 1.7 1997/01/30 09:14:10 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1991 University of Utah.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* never uses it.
*/
-#include "ac.h"
-#if NAC > 0
-
#include <sys/param.h>
#include <sys/buf.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
+#include <sys/device.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/scsireg.h>
+#include <hp300/dev/scsivar.h>
+
#include <hp300/dev/acioctl.h>
#include <hp300/dev/acvar.h>
-extern int scsi_test_unit_rdy();
-extern int scsi_request_sense();
-extern int scsiustart();
-extern int scsigo();
-extern void scsifree();
-extern void scsireset();
-extern void scsi_delay();
-extern void scsi_str __P((char *, char *, size_t));
+int acmatch __P((struct device *, void *, void *));
+void acattach __P((struct device *, struct device *, void *));
-extern int scsi_immed_command();
-
-int acmatch(), acstart(), acgo(), acintr();
-void acattach();
+struct cfattach ac_ca = {
+ sizeof(struct ac_softc), acmatch, acattach
+};
-struct driver acdriver = {
- acmatch, acattach, "ac", acstart, acgo, acintr,
+struct cfdriver ac_cd = {
+ NULL, "ac", DV_DULL
};
-struct ac_softc ac_softc[NAC];
-static struct buf acbuf[NAC];
-static struct scsi_fmt_cdb accmd[NAC];
+void acstart __P((void *));
+void acgo __P((void *));
+void acintr __P((void *, int));
#ifdef DEBUG
int ac_debug = 0x0000;
#endif
int
-acmatch(hd)
- register struct hp_device *hd;
+acmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- int unit = hd->hp_unit;
- register struct ac_softc *sc = &ac_softc[unit];
+ struct oscsi_attach_args *osa = aux;
- sc->sc_hd = hd;
- sc->sc_punit = hd->hp_flags & 7;
- if (acident(sc, hd, 0) < 0)
+ if (osa->osa_inqbuf->type != 8 || osa->osa_inqbuf->qual != 0x80 ||
+ osa->osa_inqbuf->version != 2)
return (0);
return (1);
}
void
-acattach(hd)
- register struct hp_device *hd;
-{
- int unit = hd->hp_unit;
- register struct ac_softc *sc = &ac_softc[unit];
-
- (void)acident(sc, hd, 1); /* XXX Ick. */
-
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_unit = unit;
- sc->sc_dq.dq_ctlr = hd->hp_ctlr;
- sc->sc_dq.dq_slave = hd->hp_slave;
- sc->sc_dq.dq_driver = &acdriver;
- sc->sc_bp = &acbuf[unit];
- sc->sc_cmd = &accmd[unit];
- sc->sc_flags = ACF_ALIVE;
-}
-
-acident(sc, hd, verbose)
- register struct ac_softc *sc;
- register struct hp_device *hd;
- int verbose;
+acattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- int unit;
- register int ctlr, slave;
- int i, stat;
- int tries = 5;
- struct scsi_inquiry inqbuf;
- char vendor[9], product[17], revision[5];
- static struct scsi_fmt_cdb inq = {
- 6,
- CMD_INQUIRY, 0, 0, 0, sizeof(inqbuf), 0
- };
-
- ctlr = hd->hp_ctlr;
- slave = hd->hp_slave;
- unit = sc->sc_punit;
- scsi_delay(-1);
-
- /*
- * See if device is ready
- */
- while ((i = scsi_test_unit_rdy(ctlr, slave, unit)) != 0) {
- if (i == -1 || --tries < 0)
- /* doesn't exist or not a CCS device */
- goto failed;
- if (i == STS_CHECKCOND) {
- u_char sensebuf[128];
- struct scsi_xsense *sp;
-
- scsi_request_sense(ctlr, slave, unit,
- sensebuf, sizeof(sensebuf));
- sp = (struct scsi_xsense *) sensebuf;
- if (sp->class == 7 && sp->key == 6)
- /* drive doing an RTZ -- give it a while */
- DELAY(1000000);
- }
- DELAY(1000);
+ struct ac_softc *sc = (struct ac_softc *)self;
+ struct oscsi_attach_args *osa = aux;
+
+ printf("\n");
+
+ sc->sc_target = osa->osa_target;
+ sc->sc_lun = osa->osa_lun;
+
+ /* Initialize SCSI queue entry. */
+ sc->sc_sq.sq_softc = sc;
+ sc->sc_sq.sq_target = sc->sc_target;
+ sc->sc_sq.sq_lun = sc->sc_lun;
+ sc->sc_sq.sq_start = acstart;
+ sc->sc_sq.sq_go = acgo;
+ sc->sc_sq.sq_intr = acintr;
+
+ sc->sc_bp = (struct buf *)malloc(sizeof(struct buf),
+ M_DEVBUF, M_NOWAIT);
+ sc->sc_cmd = (struct scsi_fmt_cdb *)malloc(sizeof(struct scsi_fmt_cdb),
+ M_DEVBUF, M_NOWAIT);
+
+ if (sc->sc_bp == NULL || sc->sc_cmd == NULL) {
+ printf("%s: memory allocation failed\n", sc->sc_dev.dv_xname);
+ return;
}
- /*
- * Find out if it is an autochanger
- */
- if (scsi_immed_command(ctlr, slave, unit, &inq,
- (u_char *)&inqbuf, sizeof(inqbuf), B_READ))
- goto failed;
- if (inqbuf.type != 8 || inqbuf.qual != 0x80 || inqbuf.version != 2)
- goto failed;
-
- /*
- * Get a usable id string
- */
- bzero(vendor, sizeof(vendor));
- bzero(product, sizeof(product));
- bzero(revision, sizeof(revision));
- scsi_str(inqbuf.vendor_id, vendor, sizeof(inqbuf.vendor_id));
- scsi_str(inqbuf.product_id, product, sizeof(inqbuf.product_id));
- scsi_str(inqbuf.rev, revision, sizeof(inqbuf.rev));
-
- if (verbose)
- printf(": <%s, %s, %s>\n", vendor, product, revision);
-
- scsi_delay(0);
- return(inqbuf.type);
-failed:
- scsi_delay(0);
- return(-1);
+ sc->sc_flags = ACF_ALIVE;
}
/*ARGSUSED*/
struct proc *p;
{
register int unit = minor(dev);
- register struct ac_softc *sc = &ac_softc[unit];
+ struct ac_softc *sc;
int error = 0;
- if (unit >= NAC || (sc->sc_flags & ACF_ALIVE) == 0)
- return(ENXIO);
+ if (unit >= ac_cd.cd_ndevs ||
+ (sc = ac_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & ACF_ALIVE) == 0)
+ return (ENXIO);
+
if (sc->sc_flags & ACF_OPEN)
- return(EBUSY);
+ return (EBUSY);
+
/*
* Since acgeteinfo can block we mark the changer open now.
*/
sc->sc_flags &= ~ACF_OPEN;
return(EIO);
}
- return(0);
+ return (0);
}
/*ARGSUSED*/
int flag, mode;
struct proc *p;
{
- struct ac_softc *sc = &ac_softc[minor(dev)];
+ struct ac_softc *sc = ac_cd.cd_devs[minor(dev)];
sc->sc_flags &= ~ACF_OPEN;
+ return (0);
}
#define ACRESLEN(ep) \
int flag;
struct proc *p;
{
- register struct ac_softc *sc = &ac_softc[minor(dev)];
+ struct ac_softc *sc = ac_cd.cd_devs[minor(dev)];
char *dp;
int dlen, error = 0;
int buflen;
{
int unit = minor(dev);
- register struct ac_softc *sc = &ac_softc[unit];
+ struct ac_softc *sc = ac_cd.cd_devs[unit];
register struct buf *bp = sc->sc_bp;
register struct scsi_fmt_cdb *cmd = sc->sc_cmd;
int error;
bp->b_resid = 0;
bp->b_blkno = 0;
bp->b_error = 0;
- if (scsireq(&sc->sc_dq))
- acstart(unit);
+ if (scsireq(sc->sc_dev.dv_parent, &sc->sc_sq))
+ acstart(sc);
error = biowait(bp);
sc->sc_flags &= ~ACF_ACTIVE;
return (error);
}
-acstart(unit)
- int unit;
+void
+acstart(arg)
+ void *arg;
{
+ struct ac_softc *sc = arg;
+
#ifdef DEBUG
if (ac_debug & ACD_FOLLOW)
printf("acstart(unit=%x)\n", unit);
#endif
- if (scsiustart(ac_softc[unit].sc_hd->hp_ctlr))
- acgo(unit);
+ if (scsiustart(sc->sc_dev.dv_parent->dv_unit))
+ acgo(arg);
}
-acgo(unit)
- int unit;
+void
+acgo(arg)
+ void *arg;
{
- register struct ac_softc *sc = &ac_softc[unit];
+ struct ac_softc *sc = arg;
register struct buf *bp = sc->sc_bp;
- struct hp_device *hp = sc->sc_hd;
int stat;
#ifdef DEBUG
if (ac_debug & ACD_FOLLOW)
printf("acgo(unit=%x): ", unit);
#endif
- stat = scsigo(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
- bp, sc->sc_cmd, 0);
+ stat = scsigo(sc->sc_dev.dv_parent->dv_unit, sc->sc_target,
+ sc->sc_lun, bp, sc->sc_cmd, 0);
#ifdef DEBUG
if (ac_debug & ACD_FOLLOW)
printf("scsigo returns %x\n", stat);
bp->b_error = EIO;
bp->b_flags |= B_ERROR;
(void) biodone(bp);
- scsifree(&sc->sc_dq);
+ scsifree(sc->sc_dev.dv_parent, &sc->sc_sq);
}
}
+void
acintr(arg, stat)
void *arg;
int stat;
register struct buf *bp = sc->sc_bp;
u_char sensebuf[78];
struct scsi_xsense *sp;
- int unit = sc->sc_hd->hp_unit;
+ int unit = sc->sc_dev.dv_unit;
#ifdef DEBUG
if (ac_debug & ACD_FOLLOW)
bp->b_resid = 0;
break;
case STS_CHECKCOND:
- scsi_request_sense(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- sc->sc_punit, sensebuf, sizeof sensebuf);
+ scsi_request_sense(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, sensebuf, sizeof sensebuf);
sp = (struct scsi_xsense *)sensebuf;
printf("%s: acintr sense key=%x, ac=%x, acq=%x\n",
- sc->sc_hd->hp_xname, sp->key, sp->info4, sp->len);
+ sc->sc_dev.dv_xname, sp->key, sp->info4, sp->len);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
break;
default:
- printf("%s: acintr unknown status 0x%x\n", sc->sc_hd->hp_xname,
+ printf("%s: acintr unknown status 0x%x\n", sc->sc_dev.dv_xname,
stat);
break;
}
(void) biodone(sc->sc_bp);
- scsifree(&sc->sc_dq);
+ scsifree(sc->sc_dev.dv_parent, &sc->sc_sq);
}
acgeteinfo(dev)
dev_t dev;
{
- register struct ac_softc *sc = &ac_softc[minor(dev)];
+ struct ac_softc *sc = ac_cd.cd_devs[minor(dev)];
register char *bp;
char msbuf[48];
int error;
#endif
}
}
-#endif
-/* $OpenBSD: acvar.h,v 1.2 1997/01/12 15:12:19 downsj Exp $ */
-/* $NetBSD: acvar.h,v 1.2 1994/10/26 07:23:27 cgd Exp $ */
+/* $OpenBSD: acvar.h,v 1.3 1997/02/03 04:47:11 downsj Exp $ */
+/* $NetBSD: acvar.h,v 1.3 1997/01/30 09:14:11 thorpej Exp $ */
/*
* Copyright (c) 1991 University of Utah.
*/
struct ac_softc {
- struct hp_device *sc_hd;
+ struct device sc_dev;
+ int sc_target;
+ int sc_lun;
int sc_flags;
struct buf *sc_bp;
struct scsi_fmt_cdb *sc_cmd;
struct acinfo sc_einfo;
- short sc_punit;
short sc_picker;
- struct devqueue sc_dq;
+ struct scsiqueue sc_sq;
};
#define ACF_ALIVE 0x01
-/* $OpenBSD: ct.c,v 1.5 1997/01/12 15:12:19 downsj Exp $ */
-/* $NetBSD: ct.c,v 1.18 1996/10/14 07:14:11 thorpej Exp $ */
+/* $OpenBSD: ct.c,v 1.6 1997/02/03 04:47:12 downsj Exp $ */
+/* $NetBSD: ct.c,v 1.19 1997/01/30 09:14:12 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* @(#)ct.c 8.2 (Berkeley) 1/12/94
*/
-#include "ct.h"
-#if NCT > 0
/*
* CS80 cartridge tape driver (9144, 88140, 9145)
*
#include <sys/mtio.h>
#include <sys/tprintf.h>
#include <sys/proc.h>
+#include <sys/device.h>
+#include <sys/conf.h>
+
+#include <hp300/dev/hpibvar.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/ctreg.h>
/* number of eof marks to remember */
#define EOFS 128
-int ctmatch(), ctstart(), ctgo(), ctintr();
-void ctattach(), ctstrategy(), ctdone();
-struct driver ctdriver = {
- ctmatch, ctattach, "ct", ctstart, ctgo, ctintr,
-};
-
struct ct_softc {
- struct hp_device *sc_hd;
+ struct device sc_dev;
+ int sc_slave; /* HP-IB slave ID */
+ int sc_punit; /* physical unit */
struct ct_iocmd sc_ioc;
struct ct_rscmd sc_rsc;
struct ct_stat sc_stat;
struct ct_ulcmd sc_ul;
struct ct_wfmcmd sc_wfm;
struct ct_clearcmd sc_clear;
+ struct buf sc_tab;
struct buf *sc_bp;
+ struct buf sc_bufstore; /* XXX */
int sc_blkno;
int sc_cmd;
int sc_resid;
char *sc_addr;
int sc_flags;
short sc_type;
- short sc_punit;
tpr_t sc_tpr;
- struct devqueue sc_dq;
+ struct hpibqueue sc_hq; /* entry on hpib job queue */
int sc_eofp;
int sc_eofs[EOFS];
-} ct_softc[NCT];
+};
/* flags */
#define CTF_OPEN 0x01
#define CTF_CANSTREAM 0x200
#define CTF_WRTTN 0x400
+int ctmatch __P((struct device *, void *, void *));
+void ctattach __P((struct device *, struct device *, void *));
+
+struct cfattach ct_ca = {
+ sizeof(struct ct_softc), ctmatch, ctattach
+};
+
+struct cfdriver ct_cd = {
+ NULL, "ct", DV_TAPE
+};
+
+int ctident __P((struct device *, struct ct_softc *,
+ struct hpibbus_attach_args *));
+
+void ctreset __P((struct ct_softc *));
+void ctaddeof __P((struct ct_softc *));
+void ctustart __P((struct ct_softc *));
+void cteof __P((struct ct_softc *, struct buf *));
+void ctdone __P((struct ct_softc *, struct buf *));
+
+void ctstart __P((void *));
+void ctgo __P((void *));
+void ctintr __P((void *));
+
+void ctcommand __P((dev_t, int, int));
+
+cdev_decl(ct);
+bdev_decl(ct);
+
struct ctinfo {
short hwid;
short punit;
};
int nctinfo = sizeof(ctinfo) / sizeof(ctinfo[0]);
-struct buf cttab[NCT];
-struct buf ctbuf[NCT];
-
#define CT_NOREW 4
#define CT_STREAM 8
#define UNIT(x) (minor(x) & 3)
#endif
int
-ctmatch(hd)
- register struct hp_device *hd;
+ctmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct ct_softc *sc = &ct_softc[hd->hp_unit];
- register struct buf *bp;
+ struct hpibbus_attach_args *ha = aux;
- for (bp = cttab; bp < &cttab[NCT]; bp++)
- bp->b_actb = &bp->b_actf;
- sc->sc_hd = hd;
- sc->sc_punit = ctpunit(hd->hp_flags);
- if (ctident(sc, hd, 0) < 0)
- return (0);
-
- return (1);
+ return (ctident(parent, NULL, ha));
}
void
-ctattach(hd)
- register struct hp_device *hd;
+ctattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- struct ct_softc *sc = &ct_softc[hd->hp_unit];
+ struct ct_softc *sc = (struct ct_softc *)self;
+ struct hpibbus_attach_args *ha = aux;
- (void)ctident(sc, hd, 1); /* XXX Ick. */
+ if (ctident(parent, sc, ha) == 0) {
+ printf("\n%s: didn't respond to describe command!\n",
+ sc->sc_dev.dv_xname);
+ return;
+ }
- ctreset(sc, hd);
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_ctlr = hd->hp_ctlr;
- sc->sc_dq.dq_unit = hd->hp_unit;
- sc->sc_dq.dq_slave = hd->hp_slave;
- sc->sc_dq.dq_driver = &ctdriver;
- sc->sc_flags |= CTF_ALIVE;
+ sc->sc_slave = ha->ha_slave;
+ sc->sc_punit = ha->ha_punit;
+
+ sc->sc_tab.b_actb = &sc->sc_tab.b_actf;
+
+ /* Initialize hpib job queue entry. */
+ sc->sc_hq.hq_softc = sc;
+ sc->sc_hq.hq_slave = sc->sc_slave;
+ sc->sc_hq.hq_start = ctstart;
+ sc->sc_hq.hq_go = ctgo;
+ sc->sc_hq.hq_intr = ctintr;
- /* XXX Set device class. */
- hd->hp_dev.dv_class = DV_TAPE;
+ ctreset(sc);
+ sc->sc_flags |= CTF_ALIVE;
}
int
-ctident(sc, hd, verbose)
- register struct ct_softc *sc;
- register struct hp_device *hd;
- int verbose;
+ctident(parent, sc, ha)
+ struct device *parent;
+ struct ct_softc *sc;
+ struct hpibbus_attach_args *ha;
{
struct ct_describe desc;
u_char stat, cmd[3];
char name[7];
- int id, i;
+ int i, id, n, type, canstream;
- /*
- * Read device id and verify that:
- * 1. It is a CS80 device
- * 2. It is one of our recognized tape devices
- * 3. It has the proper physical unit number
- */
- id = hpibid(hd->hp_ctlr, hd->hp_slave);
- if ((id & 0x200) == 0)
- return(-1);
- for (i = 0; i < nctinfo; i++)
- if (id == ctinfo[i].hwid)
+ type = canstream = 0;
+
+ /* Verify that we have a CS80 device. */
+ if ((ha->ha_id & 0x200) == 0)
+ return (0);
+
+ /* Is it one of the tapes we support? */
+ for (id = 0; id < nctinfo; id++)
+ if (ha->ha_id == ctinfo[id].hwid)
break;
- if (i == nctinfo || sc->sc_punit != ctinfo[i].punit)
- return(-1);
- id = i;
+ if (id == nctinfo)
+ return (0);
+
+ ha->ha_punit = ctinfo[id].punit;
/*
- * Collect device description.
- * Right now we only need this to differentiate 7945 from 7946.
- * Note that we always issue the describe command to unit 0.
+ * So far, so good. Get drive parameters. Note command
+ * is always issued to unit 0.
*/
cmd[0] = C_SUNIT(0);
cmd[1] = C_SVOL(0);
cmd[2] = C_DESC;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, cmd, sizeof(cmd));
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_EXEC, &desc, 37);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(parent->dv_unit, ha->ha_slave, C_CMD, cmd, sizeof(cmd));
+ hpibrecv(parent->dv_unit, ha->ha_slave, C_EXEC, &desc, 37);
+ hpibrecv(parent->dv_unit, ha->ha_slave, C_QSTAT, &stat, sizeof(stat));
+
bzero(name, sizeof(name));
- if (!stat) {
- register int n = desc.d_name;
+ if (stat == 0) {
+ n = desc.d_name;
for (i = 5; i >= 0; i--) {
name[i] = (n & 0xf) + '0';
n >>= 4;
}
}
- switch (ctinfo[id].hwid) {
+
+ switch (ha->ha_id) {
case CT7946ID:
if (bcmp(name, "079450", 6) == 0)
- return(-1); /* not really a 7946 */
+ return (0); /* not really a 7946 */
/* fall into... */
case CT9144ID:
case CT9145ID:
- sc->sc_type = CT9144;
- sc->sc_flags |= CTF_CANSTREAM;
+ type = CT9144;
+ canstream = 1;
break;
case CT7912PID:
case CT7914PID:
- sc->sc_type = CT88140;
+ type = CT88140;
break;
}
- if (verbose)
+
+ if (sc != NULL) {
+ sc->sc_type = type;
+ sc->sc_flags = canstream ? CTF_CANSTREAM : 0;
printf(": %s %stape\n", ctinfo[id].desc,
- (sc->sc_flags & CTF_CANSTREAM) ? "streaming " : " ");
- return(id);
+ canstream ? "streaming " : "");
+ }
+
+ return (1);
}
-ctreset(sc, hd)
- register struct ct_softc *sc;
- register struct hp_device *hd;
+void
+ctreset(sc)
+ struct ct_softc *sc;
{
+ int ctlr, slave;
u_char stat;
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_slave;
+
sc->sc_clear.unit = C_SUNIT(sc->sc_punit);
sc->sc_clear.cmd = C_CLEAR;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_TCMD, &sc->sc_clear,
- sizeof(sc->sc_clear));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_TCMD, &sc->sc_clear, sizeof(sc->sc_clear));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
sc->sc_src.unit = C_SUNIT(CTCTLR);
sc->sc_src.nop = C_NOP;
sc->sc_src.cmd = C_SREL;
sc->sc_src.param = C_REL;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, &sc->sc_src,
- sizeof(sc->sc_src));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_src, sizeof(sc->sc_src));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
sc->sc_ssmc.unit = C_SUNIT(sc->sc_punit);
sc->sc_ssmc.cmd = C_SSM;
sc->sc_ssmc.refm = REF_MASK;
sc->sc_ssmc.fefm = FEF_MASK;
sc->sc_ssmc.aefm = AEF_MASK;
sc->sc_ssmc.iefm = IEF_MASK;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, &sc->sc_ssmc,
- sizeof(sc->sc_ssmc));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_ssmc, sizeof(sc->sc_ssmc));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
sc->sc_soptc.unit = C_SUNIT(sc->sc_punit);
sc->sc_soptc.nop = C_NOP;
sc->sc_soptc.cmd = C_SOPT;
sc->sc_soptc.opt = C_SPAR;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, &sc->sc_soptc,
- sizeof(sc->sc_soptc));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_soptc, sizeof(sc->sc_soptc));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
}
/*ARGSUSED*/
+int
ctopen(dev, flag, type, p)
dev_t dev;
int flag, type;
struct proc *p;
{
- register struct ct_softc *sc = &ct_softc[UNIT(dev)];
+ struct ct_softc *sc;
u_char stat;
- int cc;
+ int cc, ctlr, slave;
+
+ if (UNIT(dev) >= ct_cd.cd_ndevs ||
+ (sc = ct_cd.cd_devs[UNIT(dev)]) == NULL ||
+ (sc->sc_flags & CTF_ALIVE) == 0)
+ return (ENXIO);
- if (UNIT(dev) >= NCT || (sc->sc_flags & CTF_ALIVE) == 0)
- return(ENXIO);
if (sc->sc_flags & CTF_OPEN)
- return(EBUSY);
+ return (EBUSY);
+
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_slave;
+
sc->sc_soptc.unit = C_SUNIT(sc->sc_punit);
sc->sc_soptc.nop = C_NOP;
sc->sc_soptc.cmd = C_SOPT;
sc->sc_soptc.opt = C_SPAR | C_IMRPT;
else
sc->sc_soptc.opt = C_SPAR;
+
/*
* Check the return of hpibsend() and hpibswait().
* Drive could be loading/unloading a tape. If not checked,
* driver hangs.
*/
- cc = hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- C_CMD, &sc->sc_soptc, sizeof(sc->sc_soptc));
+ cc = hpibsend(ctlr, slave, C_CMD, &sc->sc_soptc, sizeof(sc->sc_soptc));
if (cc != sizeof(sc->sc_soptc))
- return(EBUSY);
- hpibswait(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave);
- cc = hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_QSTAT,
- &stat, sizeof(stat));
+ return (EBUSY);
+
+ hpibswait(ctlr, slave);
+ cc = hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
if (cc != sizeof(stat))
return(EBUSY);
+
sc->sc_tpr = tprintf_open(p);
sc->sc_flags |= CTF_OPEN;
return(0);
}
/*ARGSUSED*/
-ctclose(dev, flag)
+int
+ctclose(dev, flag, fmt, p)
dev_t dev;
- int flag;
+ int flag, fmt;
+ struct proc *p;
{
- register struct ct_softc *sc = &ct_softc[UNIT(dev)];
+ struct ct_softc *sc = ct_cd.cd_devs[UNIT(dev)];
if ((sc->sc_flags & (CTF_WRT|CTF_WRTTN)) == (CTF_WRT|CTF_WRTTN) &&
(sc->sc_flags & CTF_EOT) == 0 ) { /* XXX return error if EOT ?? */
#ifdef DEBUG
if(ctdebug & CT_BSF)
printf("%s: ctclose backup eofs prt %d blk %d\n",
- sc->sc_hd->hp_xname, sc->sc_eofp,
+ sc->sc_dev.dv_xname, sc->sc_eofp,
sc->sc_eofs[sc->sc_eofp]);
#endif
}
return(0); /* XXX */
}
+void
ctcommand(dev, cmd, cnt)
dev_t dev;
int cmd;
register int cnt;
{
- register struct ct_softc *sc = &ct_softc[UNIT(dev)];
- register struct buf *bp = &ctbuf[UNIT(dev)];
+ struct ct_softc *sc = ct_cd.cd_devs[UNIT(dev)];
+ register struct buf *bp = &sc->sc_bufstore;
register struct buf *nbp = 0;
if (cmd == MTBSF && sc->sc_eofp == EOFS - 1) {
#ifdef DEBUG
if (ctdebug & CT_BSF)
printf("%s: backup eof pos %d blk %d\n",
- sc->sc_hd->hp_xname, sc->sc_eofp,
+ sc->sc_dev.dv_xname, sc->sc_eofp,
sc->sc_eofs[sc->sc_eofp]);
#endif
}
{
register struct buf *dp;
register int s, unit;
+ struct ct_softc *sc;
unit = UNIT(bp->b_dev);
- dp = &cttab[unit];
+ sc = ct_cd.cd_devs[unit];
+
+ dp = &sc->sc_tab;
bp->b_actf = NULL;
s = splbio();
bp->b_actb = dp->b_actb;
- *dp->b_actb = bp;
+ *(dp->b_actb) = bp;
dp->b_actb = &bp->b_actf;
if (dp->b_active == 0) {
dp->b_active = 1;
- ctustart(unit);
+ ctustart(sc);
}
splx(s);
}
-ctustart(unit)
- register int unit;
+void
+ctustart(sc)
+ struct ct_softc *sc;
{
- register struct ct_softc *sc = &ct_softc[unit];
register struct buf *bp;
- bp = cttab[unit].b_actf;
+ bp = sc->sc_tab.b_actf;
sc->sc_addr = bp->b_un.b_addr;
sc->sc_resid = bp->b_bcount;
- if (hpibreq(&sc->sc_dq))
- ctstart(unit);
+ if (hpibreq(sc->sc_dev.dv_parent, &sc->sc_hq))
+ ctstart(sc);
}
-ctstart(unit)
- register int unit;
+void
+ctstart(arg)
+ void *arg;
{
- register struct ct_softc *sc = &ct_softc[unit];
- register struct buf *bp, *dp;
- register int i;
+ struct ct_softc *sc = arg;
+ struct buf *bp, *dp;
+ int i, ctlr, slave;
- bp = cttab[unit].b_actf;
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_slave;
+
+ bp = sc->sc_tab.b_actf;
if ((sc->sc_flags & CTF_CMD) && sc->sc_bp == bp) {
switch(sc->sc_cmd) {
-
case MTFSF:
bp->b_flags |= B_READ;
goto mustio;
sc->sc_blkno = 0;
sc->sc_ul.unit = C_SUNIT(sc->sc_punit);
sc->sc_ul.cmd = C_UNLOAD;
- hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- C_CMD, &sc->sc_ul, sizeof(sc->sc_ul));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_ul,
+ sizeof(sc->sc_ul));
break;
case MTWEOF:
sc->sc_flags |= CTF_WRT;
sc->sc_wfm.unit = C_SUNIT(sc->sc_punit);
sc->sc_wfm.cmd = C_WFM;
- hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- C_CMD, &sc->sc_wfm, sizeof(sc->sc_wfm));
- ctaddeof(unit);
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_wfm,
+ sizeof(sc->sc_wfm));
+ ctaddeof(sc);
break;
case MTBSR:
#ifdef DEBUG
if(ctdebug & CT_BSF)
printf("%s: clearing eofs\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
#endif
for (i=0; i<EOFS; i++)
sc->sc_eofs[i] = 0;
sc->sc_ioc.len = 0;
sc->sc_ioc.nop3 = C_NOP;
sc->sc_ioc.cmd = C_READ;
- hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- C_CMD, &sc->sc_ioc, sizeof(sc->sc_ioc));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_ioc,
+ sizeof(sc->sc_ioc));
break;
}
- }
- else {
+ } else {
mustio:
if ((bp->b_flags & B_READ) &&
sc->sc_flags & (CTF_BEOF|CTF_EOT)) {
#ifdef DEBUG
if (ctdebug & CDB_FILES)
- printf("ctstart: before flags %x\n", sc->sc_flags);
+ printf("ctstart: before flags %x\n",
+ sc->sc_flags);
#endif
if (sc->sc_flags & CTF_BEOF) {
sc->sc_flags &= ~CTF_BEOF;
sc->sc_flags |= CTF_AEOF;
#ifdef DEBUG
if (ctdebug & CDB_FILES)
- printf("ctstart: after flags %x\n", sc->sc_flags);
+ printf("ctstart: after flags %x\n",
+ sc->sc_flags);
#endif
}
bp->b_resid = bp->b_bcount;
- ctdone(unit, bp);
+ ctdone(sc, bp);
return;
}
sc->sc_flags |= CTF_IO;
sc->sc_ioc.cmd = C_WRITE;
sc->sc_flags |= (CTF_WRT | CTF_WRTTN);
}
- hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_CMD,
- &sc->sc_ioc, sizeof(sc->sc_ioc));
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_ioc, sizeof(sc->sc_ioc));
}
- hpibawait(sc->sc_hd->hp_ctlr);
+ hpibawait(ctlr);
}
-ctgo(unit)
- register int unit;
+void
+ctgo(arg)
+ void *arg;
{
- register struct ct_softc *sc = &ct_softc[unit];
+ struct ct_softc *sc = arg;
register struct buf *bp;
int rw;
- bp = cttab[unit].b_actf;
+ bp = sc->sc_tab.b_actf;
rw = bp->b_flags & B_READ;
- hpibgo(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_EXEC,
- sc->sc_addr, sc->sc_resid, rw, rw != 0);
+ hpibgo(sc->sc_dev.dv_parent->dv_unit, sc->sc_slave, C_EXEC,
+ sc->sc_addr, sc->sc_resid, rw, rw != 0);
}
/*
* Hideous grue to handle EOF/EOT (mostly for reads)
*/
+void
cteof(sc, bp)
register struct ct_softc *sc;
register struct buf *bp;
#endif
}
-int
+/* ARGSUSED */
+void
ctintr(arg)
void *arg;
{
register struct ct_softc *sc = arg;
- register struct buf *bp, *dp;
+ register struct buf *bp;
u_char stat;
- int unit = sc->sc_hd->hp_unit;
+ int ctlr, slave, unit;
+
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_slave;
+ unit = sc->sc_dev.dv_unit;
- bp = cttab[unit].b_actf;
+ bp = sc->sc_tab.b_actf;
if (bp == NULL) {
- printf("%s: bp == NULL\n", sc->sc_hd->hp_xname);
+ printf("%s: bp == NULL\n", sc->sc_dev.dv_xname);
return;
}
if (sc->sc_flags & CTF_IO) {
sc->sc_flags &= ~CTF_IO;
- if (hpibustart(sc->sc_hd->hp_ctlr))
- ctgo(unit);
+ if (hpibustart(ctlr))
+ ctgo(sc);
return;
}
if ((sc->sc_flags & CTF_STATWAIT) == 0) {
- if (hpibpptest(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave) == 0) {
+ if (hpibpptest(ctlr, slave) == 0) {
sc->sc_flags |= CTF_STATWAIT;
- hpibawait(sc->sc_hd->hp_ctlr);
+ hpibawait(ctlr);
return;
}
} else
sc->sc_flags &= ~CTF_STATWAIT;
- hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_QSTAT, &stat, 1);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
#ifdef DEBUG
if (ctdebug & CDB_FILES)
printf("ctintr: before flags %x\n", sc->sc_flags);
if (stat) {
sc->sc_rsc.unit = C_SUNIT(sc->sc_punit);
sc->sc_rsc.cmd = C_STATUS;
- hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_CMD,
- &sc->sc_rsc, sizeof(sc->sc_rsc));
- hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_EXEC,
- &sc->sc_stat, sizeof(sc->sc_stat));
- hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave, C_QSTAT,
- &stat, 1);
+ hpibsend(ctlr, slave, C_CMD, &sc->sc_rsc, sizeof(sc->sc_rsc));
+ hpibrecv(ctlr, slave, C_EXEC, &sc->sc_stat,
+ sizeof(sc->sc_stat));
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
#ifdef DEBUG
if (ctdebug & CDB_FILES)
printf("ctintr: return stat 0x%x, A%x F%x blk %d\n",
if (stat == 0) {
if (sc->sc_stat.c_aef & (AEF_EOF | AEF_EOV)) {
cteof(sc, bp);
- ctaddeof(unit);
+ ctaddeof(sc);
goto done;
}
if (sc->sc_stat.c_fef & FEF_PF) {
- ctreset(sc, sc->sc_hd);
- ctstart(unit);
+ ctreset(sc);
+ ctstart(sc);
return;
}
if (sc->sc_stat.c_fef & FEF_REXMT) {
- ctstart(unit);
+ ctstart(sc);
return;
}
if (sc->sc_stat.c_aef & 0x5800) {
if (sc->sc_stat.c_aef & 0x4000)
tprintf(sc->sc_tpr,
"%s: uninitialized media\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (sc->sc_stat.c_aef & 0x1000)
tprintf(sc->sc_tpr,
"%s: not ready\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (sc->sc_stat.c_aef & 0x0800)
tprintf(sc->sc_tpr,
"%s: write protect\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
} else {
printf("%s err: v%d u%d ru%d bn%d, ",
- sc->sc_hd->hp_xname,
+ sc->sc_dev.dv_xname,
(sc->sc_stat.c_vu>>4)&0xF,
sc->sc_stat.c_vu&0xF,
sc->sc_stat.c_pend,
}
} else
printf("%s: request status failed\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
goto done;
case MTFSF:
sc->sc_flags &= ~(CTF_BEOF|CTF_AEOF);
sc->sc_blkno += CTBTOK(sc->sc_resid);
- ctstart(unit);
+ ctstart(sc);
return;
case MTBSF:
sc->sc_flags &= ~(CTF_AEOF|CTF_BEOF|CTF_EOT);
if (ctdebug & CDB_FILES)
printf("ctintr: after flags %x\n", sc->sc_flags);
#endif
- ctdone(unit, bp);
+ ctdone(sc, bp);
}
void
-ctdone(unit, bp)
- int unit;
+ctdone(sc, bp)
+ struct ct_softc *sc;
register struct buf *bp;
{
- register struct ct_softc *sc = &ct_softc[unit];
register struct buf *dp;
- if (dp = bp->b_actf)
+ if ((dp = bp->b_actf) != NULL)
dp->b_actb = bp->b_actb;
else
- cttab[unit].b_actb = bp->b_actb;
+ sc->sc_tab.b_actb = bp->b_actb;
*bp->b_actb = dp;
biodone(bp);
- hpibfree(&sc->sc_dq);
- if (cttab[unit].b_actf == NULL) {
- cttab[unit].b_active = 0;
+ hpibfree(sc->sc_dev.dv_parent, &sc->sc_hq);
+ if (sc->sc_tab.b_actf == NULL) {
+ sc->sc_tab.b_active = 0;
return;
}
- ctustart(unit);
+ ctustart(sc);
}
int
}
/*ARGSUSED*/
+int
ctioctl(dev, cmd, data, flag, p)
dev_t dev;
- int cmd, flag;
+ u_long cmd;
+ int flag;
caddr_t data;
struct proc *p;
{
return(0);
}
-/*ARGSUSED*/
-ctdump(dev)
+/* ARGSUSED */
+int
+ctdump(dev, blkno, va, size)
dev_t dev;
+ daddr_t blkno;
+ caddr_t va;
+ size_t size;
{
- return(ENXIO);
+
+ return (ENODEV);
}
-ctaddeof(unit)
- int unit;
+void
+ctaddeof(sc)
+ struct ct_softc *sc;
{
- register struct ct_softc *sc = &ct_softc[unit];
-
+
if (sc->sc_eofp == EOFS - 1)
sc->sc_eofs[EOFS - 1]++;
else {
#ifdef DEBUG
if (ctdebug & CT_BSF)
printf("%s: add eof pos %d blk %d\n",
- sc->sc_hd->hp_xname, sc->sc_eofp,
+ sc->sc_dev.dv_xname, sc->sc_eofp,
sc->sc_eofs[sc->sc_eofp]);
#endif
}
-#endif
-/* $OpenBSD: dca.c,v 1.6 1997/01/12 15:12:21 downsj Exp $ */
-/* $NetBSD: dca.c,v 1.31 1996/12/17 08:41:00 thorpej Exp $ */
+/* $OpenBSD: dca.c,v 1.7 1997/02/03 04:47:13 downsj Exp $ */
+/* $NetBSD: dca.c,v 1.32 1997/01/30 09:18:34 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Jason R. Thorpe. All rights reserved.
#include <dev/cons.h>
-#ifndef NEWCONFIG
-#include <hp300/dev/device.h>
-#endif
-
#include <hp300/dev/dioreg.h>
#include <hp300/dev/diovar.h>
#include <hp300/dev/diodevs.h>
struct dca_softc {
struct device sc_dev; /* generic device glue */
-#ifndef NEWCONFIG
- struct hp_device *sc_hd; /* device info */
-#endif
struct dcadevice *sc_dca; /* pointer to hardware */
struct tty *sc_tty; /* our tty instance */
int sc_oflows; /* overflow counter */
};
-#ifdef NEWCONFIG
-int dcamatch __P((struct device *, struct cfdata *, void *));
+int dcamatch __P((struct device *, void *, void *));
void dcaattach __P((struct device *, struct device *, void *));
struct cfattach dca_ca = {
struct cfdriver dca_cd = {
NULL, "dca", DV_TTY
};
-#else /* ! NEWCONFIG */
-int dcamatch();
-void dcaattach();
-struct driver dcadriver = {
- dcamatch, dcaattach, "dca",
-};
-
-#include "dca.h"
-struct dca_softc dca_softc[NDCA];
-#endif /* NEWCONFIG */
void dcastart();
int dcaparam();
void dcainit __P((struct dcadevice *, int));
-#ifdef NEWCONFIG
int
dcamatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
return (0);
}
-#else /* ! NEWCONFIG */
-int
-dcamatch(hd)
- register struct hp_device *hd;
-{
- struct dcadevice *dca = (struct dcadevice *)hd->hp_addr;
- struct dca_softc *sc = &dca_softc[hd->hp_unit];
- if (dca->dca_id != DCAID0 &&
- dca->dca_id != DCAREMID0 &&
- dca->dca_id != DCAID1 &&
- dca->dca_id != DCAREMID1)
- return (0);
-
- hd->hp_ipl = DCAIPL(dca->dca_ic);
- sc->sc_hd = hd;
-
- return (1);
-}
-#endif /* NEWCONFIG */
-
-#ifdef NEWCONFIG
void
dcaattach(parent, self, aux)
struct device *parent, *self;
int unit = self->dv_unit;
int scode = da->da_scode;
int ipl;
-#else /* ! NEWCONFIG */
-void
-dcaattach(hd)
- register struct hp_device *hd;
-{
- int unit = hd->hp_unit;
- struct dcadevice *dca = (struct dcadevice *)hd->hp_addr;
- struct dca_softc *sc = &dca_softc[unit];
- int scode = hd->hp_args->hw_sc;
- int ipl = hd->hp_ipl;
-#endif /* NEWCONFIG */
if (scode == conscode) {
dca = (struct dcadevice *)conaddr;
*/
cn_tab->cn_dev = makedev(dcamajor, unit);
} else {
-#ifdef NEWCONFIG
dca = (struct dcadevice *)iomap(dio_scodetopa(da->da_scode),
da->da_size);
if (dca == NULL) {
sc->sc_dev.dv_xname);
return;
}
-#endif /* NEWCONFIG */
}
sc->sc_dca = dca;
-#ifdef NEWCONFIG
ipl = DIO_IPL(dca);
printf(" ipl %d", ipl);
-#else /* ! NEWCONFIG */
- /* XXX Set the device class. */
- hd->hp_dev.dv_class = DV_TTY;
- bcopy(&hd->hp_dev, &sc->sc_dev, sizeof(struct device));
-#endif /* NEWCONFIG */
dca->dca_reset = 0xFF;
DELAY(100);
(sc->sc_flags & DCA_HASFIFO) ? ISRPRI_TTY : ISRPRI_TTYNOBUF);
sc->sc_flags |= DCA_ACTIVE;
-#ifdef NEWCONFIG
if (self->dv_cfdata->cf_flags)
-#else
- if (hd->hp_flags)
-#endif
sc->sc_flags |= DCA_SOFTCAR;
/* Enable interrupts. */
u_char code;
int s, error = 0;
-#ifdef NEWCONFIG
if (unit >= dca_cd.cd_ndevs ||
(sc = dca_cd.cd_devs[unit]) == NULL)
return (ENXIO);
-#else
- if (unit >= NDCA)
- return (ENXIO);
- sc = &dca_softc[unit];
-#endif /* NEWCONFIG */
if ((sc->sc_flags & DCA_ACTIVE) == 0)
return (ENXIO);
unit = DCAUNIT(dev);
-#ifdef NEWCONFIG
sc = dca_cd.cd_devs[unit];
-#else
- sc = &dca_softc[unit];
-#endif
dca = sc->sc_dca;
tp = sc->sc_tty;
struct tty *tp;
int error, of;
-#ifdef NEWCONFIG
sc = dca_cd.cd_devs[unit];
-#else
- sc = &dca_softc[unit];
-#endif
tp = sc->sc_tty;
of = sc->sc_oflows;
struct uio *uio;
int flag;
{
-#ifdef NEWCONFIG
struct dca_softc *sc = dca_cd.cd_devs[DCAUNIT(dev)];
struct tty *tp = sc->sc_tty;
-#else
- struct tty *tp = dca_softc[DCAUNIT(dev)].sc_tty;
-#endif
return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
dcatty(dev)
dev_t dev;
{
-#ifdef NEWCONFIG
struct dca_softc *sc = dca_cd.cd_devs[DCAUNIT(dev)];
-#else
- struct dca_softc *sc = &dca_softc[DCAUNIT(dev)];
-#endif
return (sc->sc_tty);
}
struct proc *p;
{
int unit = DCAUNIT(dev);
-#ifdef NEWCONFIG
struct dca_softc *sc = dca_cd.cd_devs[unit];
-#else
- struct dca_softc *sc = &dca_softc[unit];
-#endif
struct tty *tp = sc->sc_tty;
struct dcadevice *dca = sc->sc_dca;
int error;
register struct termios *t;
{
int unit = DCAUNIT(tp->t_dev);
-#ifdef NEWCONFIG
struct dca_softc *sc = dca_cd.cd_devs[unit];
-#else
- struct dca_softc *sc = &dca_softc[unit];
-#endif
struct dcadevice *dca = sc->sc_dca;
int cfcr, cflag = t->c_cflag;
int ospeed = ttspeedtab(t->c_ospeed, dcaspeedtab);
register struct tty *tp;
{
int s, c, unit = DCAUNIT(tp->t_dev);
-#ifdef NEWCONFIG
struct dca_softc *sc = dca_cd.cd_devs[unit];
-#else
- struct dca_softc *sc = &dca_softc[unit];
-#endif
struct dcadevice *dca = sc->sc_dca;
s = spltty();
-/* $OpenBSD: dcm.c,v 1.6 1997/01/12 15:12:22 downsj Exp $ */
-/* $NetBSD: dcm.c,v 1.34 1996/12/17 08:41:01 thorpej Exp $ */
+/* $OpenBSD: dcm.c,v 1.7 1997/02/03 04:47:15 downsj Exp $ */
+/* $NetBSD: dcm.c,v 1.35 1997/01/30 09:11:24 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Jason R. Thorpe. All rights reserved.
#include <dev/cons.h>
-#ifndef NEWCONFIG
-#include <hp300/dev/device.h>
-#endif
-
#include <hp300/dev/dioreg.h>
#include <hp300/dev/diovar.h>
#include <hp300/dev/diodevs.h>
struct dcm_softc {
struct device sc_dev; /* generic device glue */
-#ifndef NEWCONFIG
- struct hp_device *sc_hd; /* device info */
-#endif
struct dcmdevice *sc_dcm; /* pointer to hardware */
struct tty *sc_tty[NDCMPORT]; /* our tty instances */
struct modemreg *sc_modem[NDCMPORT]; /* modem control */
#endif
};
-#ifdef NEWCONFIG
-int dcmmatch __P((struct device *, struct cfdata *, void *));
+int dcmmatch __P((struct device *, void *, void *));
void dcmattach __P((struct device *, struct device *, void *));
struct cfattach dcm_ca = {
struct cfdriver dcm_cd = {
NULL, "dcm", DV_TTY
};
-#else /* ! NEWCONFIG */
-int dcmmatch();
-void dcmattach();
-
-struct driver dcmdriver = {
- dcmmatch, dcmattach, "dcm",
-};
-
-#include "dcm.h"
-struct dcm_softc dcm_softc[NDCM];
-#endif /* NEWCONFIG */
int dcmparam();
void dcmstart();
int dcmselftest __P((struct dcm_softc *));
-#ifdef NEWCONFIG
int
dcmmatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
return (0);
}
-#else /* ! NEWCONFIG */
-int
-dcmmatch(hd)
- register struct hp_device *hd;
-{
- struct dcm_softc *sc = &dcm_softc[hd->hp_unit];
- struct dcmdevice *dcm = (struct dcmdevice *)hd->hp_addr;
-
- if ((dcm->dcm_rsid & 0x1f) != DCMID)
- return (0);
-
- sc->sc_hd = hd;
- hd->hp_ipl = DCMIPL(dcm->dcm_ic);
-}
-#endif /* NEWCONFIG */
-#ifdef NEWCONFIG
void
dcmattach(parent, self, aux)
struct device *parent, *self;
int brd = self->dv_unit;
int scode = da->da_scode;
int i, mbits, ipl;
-#else /* ! NEWCONFIG */
-void
-dcmattach(hd)
- register struct hp_device *hd;
-{
- struct dcm_softc *sc = &dcm_softc[hd->hp_unit];
- struct dcmdevice *dcm = (struct dcmdevice *)hd->hp_addr;
- int brd = hd->hp_unit;
- int scode = hd->hp_args->hw_sc;
- int i, mbits, ipl = hd->hp_ipl;
-#endif /* NEWCONFIG */
if (scode == conscode) {
dcm = (struct dcmdevice *)conaddr;
*/
cn_tab->cn_dev = makedev(dcmmajor, (brd << 2) | DCMCONSPORT);
} else {
-#ifdef NEWCONFIG
dcm = (struct dcmdevice *)iomap(dio_scodetopa(da->da_scode),
da->da_size);
if (dcm == NULL) {
sc->sc_dev.dv_xname);
return;
}
-#endif
}
sc->sc_dcm = dcm;
-#ifdef NEWCONFIG
ipl = DIO_IPL(dcm);
printf(" ipl %d", ipl);
-#else /* ! NEWCONFIG */
- /* XXX Set the device class. */
- hd->hp_dev.dv_class = DV_TTY;
- bcopy(&hd->hp_dev, &sc->sc_dev, sizeof(struct device));
-#endif /* NEWCONFIG */
if (dcmselftest(sc)) {
printf("\n%s: self-test failed\n", sc->sc_dev.dv_xname);
}
/* Extract configuration info from flags. */
-#ifdef NEWCONFIG
sc->sc_softCAR = self->dv_cfdata->cf_flags & DCM_SOFTCAR;
sc->sc_flags = self->dv_cfdata->cf_flags & DCM_FLAGMASK;
-#else
- sc->sc_softCAR = (hd->hp_flags & DCM_SOFTCAR);
- sc->sc_flags = (hd->hp_flags & DCM_FLAGMASK);
-#endif /* NEWCONFIG */
/* Mark our unit as configured. */
sc->sc_flags |= DCM_ACTIVE;
brd = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
if (brd >= dcm_cd.cd_ndevs || port >= NDCMPORT ||
(sc = dcm_cd.cd_devs[brd]) == NULL)
return (ENXIO);
-#else /* ! NEWCONFIG */
- if ((brd >= NDCM) || (port >= NDCMPORT))
- return (ENXIO);
- sc = &dcm_softc[brd];
-#endif /* NEWCONFIG */
if ((sc->sc_flags & DCM_ACTIVE) == 0)
return (ENXIO);
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
tp = sc->sc_tty[port];
(*linesw[tp->t_line].l_close)(tp, flag);
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
tp = sc->sc_tty[port];
return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
tp = sc->sc_tty[port];
return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
return (sc->sc_tty[port]);
}
port = DCMPORT(unit);
board = DCMBOARD(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
dcm = sc->sc_dcm;
tp = sc->sc_tty[port];
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
dcm = sc->sc_dcm;
/* check requested parameters */
board = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[board];
-#else
- sc = &dcm_softc[board];
-#endif
dcm = sc->sc_dcm;
s = spltty();
brd = DCMBOARD(unit);
port = DCMPORT(unit);
-#ifdef NEWCONFIG
sc = dcm_cd.cd_devs[brd];
-#else
- sc = &dcm_softc[brd];
-#endif
dcm = sc->sc_dcm;
#ifdef DEBUG
dcmsetischeme(brd, flags)
int brd, flags;
{
-#ifdef NEWCONFIG
struct dcm_softc *sc = dcm_cd.cd_devs[brd];
-#else
- struct dcm_softc *sc = &dcm_softc[brd];
-#endif
struct dcmdevice *dcm = sc->sc_dcm;
struct dcmischeme *dis = &sc->sc_scheme;
int i;
{
struct dcmdevice *dcm = sc->sc_dcm;
int i, timo = 0;
- int s, brd, mbits;
+ int s, brd, mbits, rv;
- s = spltty();
+ rv = 1;
+
+ s = splhigh();
dcm->dcm_rsid = DCMRS;
DELAY(50000); /* 5000 is not long enough */
dcm->dcm_rsid = 0;
dcm->dcm_ic = IC_IE;
dcm->dcm_cr = CR_SELFT;
- while ((dcm->dcm_ic & IC_IR) == 0)
+ while ((dcm->dcm_ic & IC_IR) == 0) {
if (++timo == 20000)
- return (1);
+ goto out;
+ DELAY(1);
+ }
DELAY(50000); /* XXX why is this needed ???? */
- while ((dcm->dcm_iir & IIR_SELFT) == 0)
+ while ((dcm->dcm_iir & IIR_SELFT) == 0) {
if (++timo == 400000)
- return (1);
+ goto out;
+ DELAY(1);
+ }
DELAY(50000); /* XXX why is this needed ???? */
if (dcm->dcm_stcon != ST_OK) {
#if 0
printf("dcm%d: self test failed: %x\n",
brd, dcm->dcm_stcon);
#endif
- return (1);
+ goto out;
}
dcm->dcm_ic = IC_ID;
- splx(s);
+ rv = 0;
- return (0);
+ out:
+ splx(s);
+ return (rv);
}
/*
+++ /dev/null
-/* $OpenBSD: device.h,v 1.4 1997/01/12 15:12:24 downsj Exp $ */
-/* $NetBSD: device.h,v 1.9 1996/10/20 23:47:40 thorpej Exp $ */
-
-/*
- * Copyright (c) 1982, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)device.h 8.1 (Berkeley) 6/10/93
- */
-
-#include <sys/device.h>
-
-struct driver {
- int (*d_match)();
- void (*d_attach)();
- char *d_name;
- int (*d_start)();
- int (*d_go)();
- int (*d_intr)();
- int (*d_done)();
-};
-
-struct hp_hw {
- caddr_t hw_pa; /* physical address of control space */
- int hw_size; /* size of control space */
- caddr_t hw_kva; /* kernel virtual address of control space */
- short hw_id; /* HW returned id */
- short hw_secid; /* secondary HW id (displays) */
- short hw_type; /* type (defined below) */
- short hw_sc; /* select code (if applicable) */
-};
-
-struct hp_ctlr {
- struct driver *hp_driver;
- int hp_unit;
- int hp_alive;
- char *hp_addr;
- int hp_flags;
- int hp_ipl;
- struct hp_hw *hp_args;
- char hp_xname[8];
- struct device hp_dev;
-};
-
-struct hp_device {
- struct driver *hp_driver;
- struct driver *hp_cdriver;
- int hp_unit;
- int hp_ctlr;
- int hp_slave;
- char *hp_addr;
- int hp_dk;
- int hp_flags;
- int hp_alive;
- int hp_ipl;
- struct hp_hw *hp_args;
- struct device hp_dev;
-};
-
-/* XXX until the code is cleaed up */
-#define hp_xname hp_dev.dv_xname
-
-/* XXX This needs to die. */
-struct devqueue {
- struct devqueue *dq_forw;
- struct devqueue *dq_back;
- int dq_ctlr;
- int dq_unit;
- int dq_slave;
- void *dq_softc;
- struct driver *dq_driver;
-};
-
-#define MAXCTLRS 16 /* Size of HW table (arbitrary) */
-#define MAXSLAVES 8 /* Slaves per controller (HPIB/SCSI limit) */
-
-/* bus types */
-#define B_MASK 0xE000
-#define B_DIO 0x2000
-#define B_DIOII 0x4000
-#define B_VME 0x6000
-/* controller types */
-#define C_MASK 0x8F
-#define C_FLAG 0x80
-#define C_HPIB 0x81
-#define C_SCSI 0x82
-#define C_VME 0x83
-/* device types (controllers with no slaves) */
-#define D_MASK 0x8F
-#define D_BITMAP 0x01
-#define D_LAN 0x02
-#define D_FPA 0x03
-#define D_KEYBOARD 0x04
-#define D_COMMDCA 0x05
-#define D_COMMDCM 0x06
-#define D_COMMDCL 0x07
-#define D_PPORT 0x08
-#define D_MISC 0x7F
-
-#define HW_ISCTLR(hw) ((hw)->hw_type & C_FLAG)
-#define HW_ISDIOII(hw) ((hw)->hw_type & B_DIOII)
-#define HW_ISHPIB(hw) (((hw)->hw_type & C_MASK) == C_HPIB)
-#define HW_ISSCSI(hw) (((hw)->hw_type & C_MASK) == C_SCSI)
-#define HW_ISDEV(hw,d) (((hw)->hw_type & D_MASK) == (d))
-
-#ifdef _KERNEL
-#ifdef hp300
-extern struct hp_hw sc_table[];
-extern struct hp_ctlr hp_cinit[];
-extern struct hp_device hp_dinit[];
-extern caddr_t sctopa(), iomap();
-#endif
-#endif
#! /usr/bin/awk -f
#
-# $OpenBSD: devlist2h.awk,v 1.1 1997/01/12 15:12:24 downsj Exp $
-# $NetBSD: devlist2h.awk,v 1.1 1996/12/17 08:41:02 thorpej Exp $
+# $OpenBSD: devlist2h.awk,v 1.2 1997/02/03 04:47:16 downsj Exp $
+# $NetBSD: devlist2h.awk,v 1.2 1997/01/30 09:18:36 thorpej Exp $
#
# Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
# Copyright (c) 1995, 1996 Christopher G. Demetriou
-/* $OpenBSD: dio.c,v 1.2 1997/01/13 18:03:53 downsj Exp $ */
-/* $NetBSD: dio.c,v 1.1 1996/12/17 08:41:02 thorpej Exp $ */
+/* $OpenBSD: dio.c,v 1.3 1997/02/03 04:47:17 downsj Exp $ */
+/* $NetBSD: dio.c,v 1.3 1997/01/30 09:18:37 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
int dio_scodesize __P((struct dio_attach_args *));
char *dio_devinfo __P((struct dio_attach_args *, char *, size_t));
-#ifdef NEWCONFIG
-int diomatch __P((struct device *, struct cfdata *, void *));
+int diomatch __P((struct device *, void *, void *));
void dioattach __P((struct device *, struct device *, void *));
int dioprint __P((void *, const char *));
-int diosubmatch __P((struct device *, struct cfdata *, void *));
+int diosubmatch __P((struct device *, void *, void *));
struct cfattach dio_ca = {
sizeof(struct device), diomatch, dioattach
int
diomatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
static int dio_matched = 0;
}
int
-diosubmatch(parent, cf, aux)
+diosubmatch(parent, match, aux)
struct device *parent;
- struct cfdata *cf;
- void *aux;
+ void *match, *aux;
{
+ struct cfdata *cf = match;
struct dio_attach_args *da = aux;
if (cf->diocf_scode != DIO_UNKNOWN_SCODE &&
printf(" scode %d", da->da_scode);
return (UNCONF);
}
-#endif /* NEWCONFIG */
/*
* Convert a select code to a system physical address.
else if (DIO_ISDIO(scode))
rval = DIO_BASE + (scode * DIO_DEVSIZE);
else if (DIO_ISDIOII(scode))
- rval = DIOII_BASE + ((scode - 132) * DIOII_DEVSIZE);
+ rval = DIOII_BASE + ((scode - DIOII_SCBASE) * DIOII_DEVSIZE);
else
rval = 0;
-$OpenBSD: diodevs,v 1.1 1997/01/12 15:12:25 downsj Exp $
-$NetBSD: diodevs,v 1.1 1996/12/17 08:41:03 thorpej Exp $
+$OpenBSD: diodevs,v 1.2 1997/02/03 04:47:18 downsj Exp $
+$NetBSD: diodevs,v 1.2 1997/01/30 09:18:38 thorpej Exp $
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
- * NetBSD: diodevs,v 1.1 1996/12/17 08:41:03 thorpej Exp
+ * NetBSD: diodevs,v 1.2 1997/01/30 09:18:38 thorpej Exp
*/
/*-
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
- * NetBSD: diodevs,v 1.1 1996/12/17 08:41:03 thorpej Exp
+ * NetBSD: diodevs,v 1.2 1997/01/30 09:18:38 thorpej Exp
*/
/*-
-/* $OpenBSD: dioreg.h,v 1.1 1997/01/12 15:12:26 downsj Exp $ */
-/* $NetBSD: dioreg.h,v 1.1 1996/12/17 08:41:04 thorpej Exp $ */
+/* $OpenBSD: dioreg.h,v 1.2 1997/02/03 04:47:20 downsj Exp $ */
+/* $NetBSD: dioreg.h,v 1.3 1997/01/30 09:18:40 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
*/
#define DIO_SCMAX(machineid) ((machineid) == HP_320 ? 32 : 256)
+/*
+ * Base of DIO-II select codes.
+ */
+#define DIOII_SCBASE 132
+
/*
* Macro that returns true if a select code lies within
* the select code `hole'.
* Macros to determine if device is DIO or DIO-II.
*/
#define DIO_ISDIO(scode) ((scode) >= 0 && (scode) < 32)
-#define DIO_ISDIOII(scode) ((scode) >= 132 && (scode) < 256)
+#define DIO_ISDIOII(scode) ((scode) >= DIOII_SCBASE && (scode) < 256)
/*
* Macro to determine if device is a framebuffer, given the
-/* $OpenBSD: diovar.h,v 1.1 1997/01/12 15:12:27 downsj Exp $ */
-/* $NetBSD: diovar.h,v 1.1 1996/12/17 08:41:05 thorpej Exp $ */
+/* $OpenBSD: diovar.h,v 1.2 1997/02/03 04:47:21 downsj Exp $ */
+/* $NetBSD: diovar.h,v 1.2 1997/01/30 09:18:41 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
-/* $OpenBSD: dma.c,v 1.4 1997/01/12 15:12:28 downsj Exp $ */
-/* $NetBSD: dma.c,v 1.10 1996/12/09 03:09:51 thorpej Exp $ */
+/* $OpenBSD: dma.c,v 1.5 1997/02/03 04:47:22 downsj Exp $ */
+/* $NetBSD: dma.c,v 1.11 1997/01/30 09:04:33 thorpej Exp $ */
/*
- * Copyright (c) 1995, 1996 Jason R. Thorpe. All rights reserved.
+ * Copyright (c) 1995, 1996, 1997
+ * Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
#include <sys/time.h>
#include <sys/kernel.h>
#include <sys/proc.h>
+#include <sys/device.h>
#include <machine/cpu.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/dmareg.h>
#include <hp300/dev/dmavar.h>
#include <hp300/hp300/isr.h>
-extern void _insque();
-extern void _remque();
extern u_int kvtop();
extern void PCIA();
};
struct dma_channel {
+ struct dmaqueue *dm_job; /* current job */
struct dma_softc *dm_softc; /* pointer back to softc */
struct dmadevice *dm_hwaddr; /* registers if DMA_C */
struct dmaBdevice *dm_Bhwaddr; /* registers if not DMA_C */
char dm_flags; /* misc. flags */
u_short dm_cmd; /* DMA controller command */
- struct dma_chain *dm_cur; /* current segment */
- struct dma_chain *dm_last; /* last segment */
+ int dm_cur; /* current segment */
+ int dm_last; /* last segment */
struct dma_chain dm_chain[DMAMAXIO]; /* all segments */
};
char *sc_xname; /* XXX external name */
struct dmareg *sc_dmareg; /* pointer to our hardware */
struct dma_channel sc_chan[NDMACHAN]; /* 2 channels */
+ TAILQ_HEAD(, dmaqueue) sc_queue; /* job queue */
char sc_type; /* A, B, or C */
int sc_ipl; /* our interrupt level */
void *sc_ih; /* interrupt cookie */
#define DMAF_VCFLUSH 0x02
#define DMAF_NOINTR 0x04
-struct devqueue dmachan[NDMACHAN + 1];
int dmaintr __P((void *));
#ifdef DEBUG
sc->sc_type = (rev == 'B') ? DMA_B : DMA_C;
+ TAILQ_INIT(&sc->sc_queue);
+
for (i = 0; i < NDMACHAN; i++) {
dc = &sc->sc_chan[i];
dc->dm_softc = sc;
+ dc->dm_job = NULL;
switch (i) {
case 0:
dc->dm_hwaddr = &dma->dma_chan0;
panic("dmainit: more than 2 channels?");
/* NOTREACHED */
}
- dmachan[i].dq_forw = dmachan[i].dq_back = &dmachan[i];
}
- dmachan[i].dq_forw = dmachan[i].dq_back = &dmachan[i];
+
#ifdef DEBUG
/* make sure timeout is really not needed */
timeout(dmatimeout, sc, 30 * hz);
int
dmareq(dq)
- register struct devqueue *dq;
+ struct dmaqueue *dq;
{
- register int i;
- register int chan;
- register int s = splbio();
+ struct dma_softc *sc = &Dma_softc;
+ int i, chan, s;
+
+#if 1
+ s = splhigh(); /* XXXthorpej */
+#else
+ s = splbio();
+#endif
- chan = dq->dq_ctlr;
- i = NDMACHAN;
- while (--i >= 0) {
+ chan = dq->dq_chan;
+ for (i = NDMACHAN - 1; i >= 0; i--) {
+ /*
+ * Can we use this channel?
+ */
if ((chan & (1 << i)) == 0)
continue;
- if (dmachan[i].dq_forw != &dmachan[i])
+
+ /*
+ * We can use it; is it busy?
+ */
+ if (sc->sc_chan[i].dm_job != NULL)
continue;
- insque(dq, &dmachan[i]);
- dq->dq_ctlr = i;
+
+ /*
+ * Not busy; give the caller this channel.
+ */
+ sc->sc_chan[i].dm_job = dq;
+ dq->dq_chan = i;
splx(s);
- return(1);
+ return (1);
}
- insque(dq, dmachan[NDMACHAN].dq_back);
+
+ /*
+ * Couldn't get a channel now; put this in the queue.
+ */
+ TAILQ_INSERT_TAIL(&sc->sc_queue, dq, dq_list);
splx(s);
- return(0);
+ return (0);
}
void
dmafree(dq)
- register struct devqueue *dq;
+ struct dmaqueue *dq;
{
- int unit = dq->dq_ctlr;
+ int unit = dq->dq_chan;
struct dma_softc *sc = &Dma_softc;
- register struct dma_channel *dc = &sc->sc_chan[unit];
- register struct devqueue *dn;
- register int chan, s;
+ struct dma_channel *dc = &sc->sc_chan[unit];
+ struct dmaqueue *dn;
+ int chan, s;
+#if 1
+ s = splhigh(); /* XXXthorpej */
+#else
s = splbio();
+#endif
+
#ifdef DEBUG
dmatimo[unit] = 0;
#endif
+
DMA_CLEAR(dc);
#if defined(HP360) || defined(HP370) || defined(HP380)
/*
dc->dm_flags &= ~DMAF_VCFLUSH;
}
#endif
- remque(dq);
+ /*
+ * Channel is now free. Look for another job to run on this
+ * channel.
+ */
+ dc->dm_job = NULL;
chan = 1 << unit;
- for (dn = dmachan[NDMACHAN].dq_forw;
- dn != &dmachan[NDMACHAN]; dn = dn->dq_forw) {
- if (dn->dq_ctlr & chan) {
- remque((caddr_t)dn);
- insque((caddr_t)dn, (caddr_t)dq->dq_back);
+ for (dn = sc->sc_queue.tqh_first; dn != NULL;
+ dn = dn->dq_list.tqe_next) {
+ if (dn->dq_chan & chan) {
+ /* Found one... */
+ TAILQ_REMOVE(&sc->sc_queue, dn, dq_list);
+ dc->dm_job = dn;
+ dn->dq_chan = dq->dq_chan;
splx(s);
- dn->dq_ctlr = dq->dq_ctlr;
- (dn->dq_driver->d_start)(dn->dq_unit);
+
+ /* Start the initiator. */
+ (*dn->dq_start)(dn->dq_softc);
return;
}
}
{
struct dma_softc *sc = &Dma_softc;
register struct dma_channel *dc = &sc->sc_chan[unit];
- register struct dma_chain *dcp;
register char *dmaend = NULL;
- register int tcount;
+ register int seg, tcount;
if (count > MAXPHYS)
panic("dmago: count > MAXPHYS");
/*
* Build the DMA chain
*/
- for (dcp = dc->dm_chain; count > 0; dcp++) {
- dcp->dc_addr = (char *) kvtop(addr);
+ for (seg = 0; count > 0; seg++) {
+ dc->dm_chain[seg].dc_addr = (char *) kvtop(addr);
#if defined(HP380)
/*
* Push back dirty cache lines
*/
if (mmutype == MMU_68040)
- DCFP(dcp->dc_addr);
+ DCFP(dc->dm_chain[seg].dc_addr);
#endif
if (count < (tcount = NBPG - ((int)addr & PGOFSET)))
tcount = count;
- dcp->dc_count = tcount;
+ dc->dm_chain[seg].dc_count = tcount;
addr += tcount;
count -= tcount;
if (flags & DMAGO_LWORD)
tcount >>= 2;
else if (flags & DMAGO_WORD)
tcount >>= 1;
- if (dcp->dc_addr == dmaend
+
+ /*
+ * Try to compact the DMA transfer if the pages are adjacent.
+ * Note: this will never happen on the first iteration.
+ */
+ if (dc->dm_chain[seg].dc_addr == dmaend
#if defined(HP320)
/* only 16-bit count on 98620B */
&& (sc->sc_type != DMA_B ||
- (dcp-1)->dc_count + tcount <= 65536)
+ dc->dm_chain[seg - 1].dc_count + tcount <= 65536)
#endif
) {
#ifdef DEBUG
dmahits[unit]++;
#endif
- dmaend += dcp->dc_count;
- (--dcp)->dc_count += tcount;
+ dmaend += dc->dm_chain[seg].dc_count;
+ dc->dm_chain[--seg].dc_count += tcount;
} else {
#ifdef DEBUG
dmamisses[unit]++;
#endif
- dmaend = dcp->dc_addr + dcp->dc_count;
- dcp->dc_count = tcount;
+ dmaend = dc->dm_chain[seg].dc_addr +
+ dc->dm_chain[seg].dc_count;
+ dc->dm_chain[seg].dc_count = tcount;
}
}
- dc->dm_cur = dc->dm_chain;
- dc->dm_last = --dcp;
+ dc->dm_cur = 0;
+ dc->dm_last = --seg;
dc->dm_flags = 0;
/*
* Set up the command word based on flags
dc->dm_flags |= DMAF_NOINTR;
}
#ifdef DEBUG
- if (dmadebug & DDB_IO)
+ if (dmadebug & DDB_IO) {
if ((dmadebug&DDB_WORD) && (dc->dm_cmd&DMA_WORD) ||
(dmadebug&DDB_LWORD) && (dc->dm_cmd&DMA_LWORD)) {
printf("dmago: cmd %x, flags %x\n",
dc->dm_cmd, dc->dm_flags);
- for (dcp = dc->dm_chain; dcp <= dc->dm_last; dcp++)
- printf(" %d: %d@%x\n", dcp-dc->dm_chain,
- dcp->dc_count, dcp->dc_addr);
+ for (seg = 0; seg <= dc->dm_last; seg++)
+ printf(" %d: %d@%x\n", seg,
+ dc->dm_chain[seg].dc_count,
+ dc->dm_chain[seg].dc_addr);
}
+ }
dmatimo[unit] = 1;
#endif
DMA_ARM(dc);
{
struct dma_softc *sc = &Dma_softc;
register struct dma_channel *dc = &sc->sc_chan[unit];
- register struct devqueue *dq;
+ struct dmaqueue *dq;
#ifdef DEBUG
if (dmadebug & DDB_FOLLOW)
* has freed the dma channel. So, ignore the intr if there's
* nothing on the queue.
*/
- dq = dmachan[unit].dq_forw;
- if (dq != &dmachan[unit])
- (dq->dq_driver->d_done)(dq->dq_unit);
+ if (dc->dm_job != NULL)
+ (*dc->dm_job->dq_done)(dc->dm_job->dq_softc);
}
int
if (dmadebug & DDB_IO) {
if ((dmadebug&DDB_WORD) && (dc->dm_cmd&DMA_WORD) ||
(dmadebug&DDB_LWORD) && (dc->dm_cmd&DMA_LWORD))
- printf("dmaintr: unit %d stat %x next %d\n",
- i, stat, (dc->dm_cur-dc->dm_chain)+1);
+ printf("dmaintr: flags %x unit %d stat %x next %d\n",
+ dc->dm_flags, i, stat, dc->dm_cur + 1);
}
if (stat & DMA_ARMED)
printf("%s, chan %d: intr when armed\n",
sc->sc_xname, i);
#endif
- if (++dc->dm_cur <= dc->dm_last) {
+ /*
+ * Load the next segemnt, or finish up if we're done.
+ */
+ dc->dm_cur++;
+ if (dc->dm_cur <= dc->dm_last) {
#ifdef DEBUG
dmatimo[i] = 1;
#endif
/*
- * Last chain segment, disable DMA interrupt.
+ * If we're the last segment, disable the
+ * completion interrupt, if necessary.
*/
if (dc->dm_cur == dc->dm_last &&
(dc->dm_flags & DMAF_NOINTR))
s = splbio();
if (dmatimo[i]) {
if (dmatimo[i] > 1)
- printf("%s: timeout #%d\n", sc->sc_xname,
- i, dmatimo[i]-1);
+ printf("%s: chan %d timeout #%d\n",
+ sc->sc_xname, i, dmatimo[i]-1);
dmatimo[i]++;
}
splx(s);
-/* $OpenBSD: dmareg.h,v 1.3 1997/01/12 15:12:28 downsj Exp $ */
-/* $NetBSD: dmareg.h,v 1.7 1996/12/09 06:18:13 thorpej Exp $ */
+/* $OpenBSD: dmareg.h,v 1.4 1997/02/03 04:47:22 downsj Exp $ */
+/* $NetBSD: dmareg.h,v 1.8 1997/01/30 09:04:34 thorpej Exp $ */
/*
* Copyright (c) 1982, 1990, 1993
#define DMA_ARM(dc) \
if (dc->dm_softc->sc_type == DMA_B) { \
register struct dmaBdevice *dma = dc->dm_Bhwaddr; \
- dma->dmaB_addr = dc->dm_cur->dc_addr; \
- dma->dmaB_count = dc->dm_cur->dc_count - 1; \
+ dma->dmaB_addr = dc->dm_chain[dc->dm_cur].dc_addr; \
+ dma->dmaB_count = dc->dm_chain[dc->dm_cur].dc_count - 1; \
dma->dmaB_cmd = dc->dm_cmd; \
} else { \
register struct dmadevice *dma = dc->dm_hwaddr; \
- dma->dma_addr = dc->dm_cur->dc_addr; \
- dma->dma_count = dc->dm_cur->dc_count - 1; \
+ dma->dma_addr = dc->dm_chain[dc->dm_cur].dc_addr; \
+ dma->dma_count = dc->dm_chain[dc->dm_cur].dc_count - 1; \
dma->dma_cmd = dc->dm_cmd; \
}
#else
#define DMA_ARM(dc) \
{ \
register struct dmadevice *dma = dc->dm_hwaddr; \
- dma->dma_addr = dc->dm_cur->dc_addr; \
- dma->dma_count = dc->dm_cur->dc_count - 1; \
+ dma->dma_addr = dc->dm_chain[dc->dm_cur].dc_addr; \
+ dma->dma_count = dc->dm_chain[dc->dm_cur].dc_count - 1; \
dma->dma_cmd = dc->dm_cmd; \
}
#endif
-/* $OpenBSD: dmavar.h,v 1.2 1997/01/12 15:12:29 downsj Exp $ */
-/* $NetBSD: dmavar.h,v 1.6 1996/12/09 03:09:51 thorpej Exp $ */
+/* $OpenBSD: dmavar.h,v 1.3 1997/02/03 04:47:23 downsj Exp $ */
+/* $NetBSD: dmavar.h,v 1.7 1997/01/30 09:04:35 thorpej Exp $ */
/*
+ * Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* @(#)dmavar.h 8.1 (Berkeley) 6/10/93
*/
+#include <sys/queue.h>
+
/* dmago flags */
#define DMAGO_BYTE 0x00 /* do byte (8 bit) transfers */
#define DMAGO_WORD 0x01 /* do word (16 bit) transfers */
#define DMA0 0x1
#define DMA1 0x2
+/*
+ * A DMA queue entry. Initiator drivers each have one of these,
+ * used to queue access to the DMA controller.
+ */
+struct dmaqueue {
+ TAILQ_ENTRY(dmaqueue) dq_list; /* entry on the queue */
+ int dq_chan; /* OR of channels initiator can use */
+ void *dq_softc; /* initiator's softc */
+
+ /*
+ * These functions are called to start the initiator when
+ * it has been given the DMA controller, and to stop the
+ * initiator when the DMA controller has stopped.
+ */
+ void (*dq_start) __P((void *));
+ void (*dq_done) __P((void *));
+};
+
#ifdef _KERNEL
extern void dmago(), dmafree();
extern int dmareq();
-/* $OpenBSD: fhpib.c,v 1.5 1997/01/12 15:12:29 downsj Exp $ */
-/* $NetBSD: fhpib.c,v 1.13 1996/10/13 03:14:10 christos Exp $ */
+/* $OpenBSD: fhpib.c,v 1.6 1997/02/03 04:47:24 downsj Exp $ */
+/* $NetBSD: fhpib.c,v 1.14 1997/01/30 09:06:53 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
/*
* 98625A/B HPIB driver
*/
-#include "hpib.h"
-#if NHPIB > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/buf.h>
+#include <sys/device.h>
+
+#include <machine/autoconf.h>
+
+#include <hp300/hp300/isr.h>
+
+#include <hp300/dev/dioreg.h>
+#include <hp300/dev/diovar.h>
+#include <hp300/dev/diodevs.h>
+
+#include <hp300/dev/dmavar.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/fhpibreg.h>
#include <hp300/dev/hpibvar.h>
-#include <hp300/dev/dmavar.h>
/*
* Inline version of fhpibwait to be used in places where
int doworddma = 1; /* non-zero if we should attempt word dma */
int doppollint = 1; /* use ppoll interrupts instead of watchdog */
int fhpibppolldelay = 50;
-
-long fhpibbadint[2] = { 0 };
-long fhpibtransfer[NHPIB] = { 0 };
-long fhpibnondma[NHPIB] = { 0 };
-long fhpibworddma[NHPIB] = { 0 };
-long fhpibppollfail[NHPIB] = { 0 };
#endif
-int fhpibcmd[NHPIB];
+void fhpibifc __P((struct fhpibdevice *));
+void fhpibdmadone __P((void *));
+int fhpibwait __P((struct fhpibdevice *, int));
-void fhpibreset __P((int));
-int fhpibsend __P((int, int, int, void *, int));
-int fhpibrecv __P((int, int, int, void *, int));
-int fhpibppoll __P((int));
+void fhpibreset __P((struct hpibbus_softc *));
+int fhpibsend __P((struct hpibbus_softc *, int, int, void *, int));
+int fhpibrecv __P((struct hpibbus_softc *, int, int, void *, int));
+int fhpibppoll __P((struct hpibbus_softc *));
void fhpibppwatch __P((void *));
-void fhpibgo __P((int, int, int, void *, int, int, int));
-void fhpibdone __P((int));
+void fhpibgo __P((struct hpibbus_softc *, int, int, void *, int, int, int));
+void fhpibdone __P((struct hpibbus_softc *));
int fhpibintr __P((void *));
/*
fhpibintr
};
+struct fhpib_softc {
+ struct device sc_dev; /* generic device glue */
+ struct fhpibdevice *sc_regs; /* device registers */
+ int sc_cmd;
+ struct hpibbus_softc *sc_hpibbus; /* XXX */
+};
+
+int fhpibmatch __P((struct device *, void *, void *));
+void fhpibattach __P((struct device *, struct device *, void *));
+
+struct cfattach fhpib_ca = {
+ sizeof(struct fhpib_softc), fhpibmatch, fhpibattach
+};
+
+struct cfdriver fhpib_cd = {
+ NULL, "fhpib", DV_DULL
+};
+
int
-fhpibtype(hc)
- register struct hp_ctlr *hc;
+fhpibmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
- register struct fhpibdevice *hd = (struct fhpibdevice *)hc->hp_addr;
+ struct dio_attach_args *da = aux;
- if (hd->hpib_cid != HPIBC)
- return (0);
+ if (da->da_id == DIO_DEVICE_ID_FHPIB)
+ return (1);
- hs->sc_type = HPIBC;
- hc->hp_ipl = HPIB_IPL(hd->hpib_ids);
-
- return (1);
+ return (0);
}
void
-fhpibattach(hc)
- struct hp_ctlr *hc;
+fhpibattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
+ struct fhpib_softc *sc = (struct fhpib_softc *)self;
+ struct dio_attach_args *da = aux;
+ struct hpibdev_attach_args ha;
+ int ipl;
+
+ sc->sc_regs = (struct fhpibdevice *)iomap(dio_scodetopa(da->da_scode),
+ da->da_size);
+ if (sc->sc_regs == NULL) {
+ printf("\n%s: can't map registers\n", self->dv_xname);
+ return;
+ }
+
+ ipl = DIO_IPL(sc->sc_regs);
+ printf(" ipl %d: %s\n", ipl, DIO_DEVICE_DESC_FHPIB);
- if (hs->sc_type != HPIBC)
- panic("fhpibattach: unknown type 0x%x", hs->sc_type);
- /* NOTREACHED */
+ /* Establish the interrupt handler. */
+ (void) isrlink(fhpibintr, sc, ipl, ISRPRI_BIO);
+ dmacomputeipl();
- hs->sc_ba = HPIBC_BA;
- hs->sc_descrip = "98625A or 98625B fast HP-IB";
- hs->sc_controller = &fhpib_controller;
+ ha.ha_ops = &fhpib_controller;
+ ha.ha_type = HPIBC; /* XXX */
+ ha.ha_ba = HPIBC_BA;
+ ha.ha_softcpp = &sc->sc_hpibbus; /* XXX */
+ (void)config_found(self, &ha, hpibdevprint);
}
void
-fhpibreset(unit)
- int unit;
+fhpibreset(hs)
+ struct hpibbus_softc *hs;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ struct fhpibdevice *hd = sc->sc_regs;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_cid = 0xFF;
DELAY(100);
hd->hpib_cmd = CT_8BIT;
hs->sc_flags |= HPIBF_DMA16;
#ifdef DEBUG
if (fhpibdebug & FDB_DMA)
- printf("fhpibtype: unit %d has word dma\n", unit);
+ printf("fhpibtype: %s has word dma\n",
+ sc->sc_dev.dv_xname);
#endif
}
}
+void
fhpibifc(hd)
register struct fhpibdevice *hd;
{
}
int
-fhpibsend(unit, slave, sec, ptr, origcnt)
- int unit, slave, sec, origcnt;
+fhpibsend(hs, slave, sec, ptr, origcnt)
+ struct hpibbus_softc *hs;
+ int slave, sec, origcnt;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ struct fhpibdevice *hd = sc->sc_regs;
register int cnt = origcnt;
register int timo;
char *addr = ptr;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_stat = 0;
hd->hpib_imask = IM_IDLE | IM_ROOM;
if (fhpibwait(hd, IM_IDLE) < 0)
#ifdef DEBUG
if (fhpibdebug & FDB_FAIL) {
printf("%s: fhpibsend failed: slave %d, sec %x, ",
- hs->sc_hc->hp_xname, slave, sec);
+ sc->sc_dev.dv_xname, slave, sec);
printf("sent %d of %d bytes\n", origcnt-cnt-1, origcnt);
}
#endif
}
int
-fhpibrecv(unit, slave, sec, ptr, origcnt)
- int unit, slave, sec, origcnt;
+fhpibrecv(hs, slave, sec, ptr, origcnt)
+ struct hpibbus_softc *hs;
+ int slave, sec, origcnt;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ struct fhpibdevice *hd = sc->sc_regs;
register int cnt = origcnt;
register int timo;
char *addr = ptr;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
/*
* Slave < 0 implies continuation of a previous receive
* that probably timed out.
#ifdef DEBUG
if (fhpibdebug & FDB_FAIL) {
printf("%s: fhpibrecv failed: slave %d, sec %x, ",
- hs->sc_hc->hp_xname, slave, sec);
+ sc->sc_dev.dv_xname, slave, sec);
printf("got %d of %d bytes\n", origcnt-cnt-1, origcnt);
}
#endif
}
void
-fhpibgo(unit, slave, sec, ptr, count, rw, timo)
- int unit, slave, sec, count, rw, timo;
+fhpibgo(hs, slave, sec, ptr, count, rw, timo)
+ struct hpibbus_softc *hs;
+ int slave, sec, count, rw, timo;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ register struct fhpibdevice *hd = sc->sc_regs;
register int i;
char *addr = ptr;
int flags = 0;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
hs->sc_flags |= HPIBF_IO;
if (timo)
hs->sc_flags |= HPIBF_TIMO;
hs->sc_count = count;
hs->sc_addr = addr;
#ifdef DEBUG
- fhpibtransfer[unit]++;
+ /* fhpibtransfer[unit]++; XXX */
#endif
if ((hs->sc_flags & HPIBF_DMA16) &&
((int)addr & 1) == 0 && count && (count & 1) == 0
#endif
) {
#ifdef DEBUG
- fhpibworddma[unit]++;
+ /* fhpibworddma[unit]++; XXX */
#endif
flags |= DMAGO_WORD;
hd->hpib_latch = 0;
flags |= DMAGO_PRI;
#endif
if (hs->sc_flags & HPIBF_READ) {
- fhpibcmd[unit] = CT_REN | CT_8BIT;
+ sc->sc_cmd = CT_REN | CT_8BIT;
hs->sc_curcnt = count;
- dmago(hs->sc_dq.dq_ctlr, addr, count, flags|DMAGO_READ);
- if (fhpibrecv(unit, slave, sec, 0, 0) < 0) {
+ dmago(hs->sc_dq->dq_chan, addr, count, flags|DMAGO_READ);
+ if (fhpibrecv(hs, slave, sec, 0, 0) < 0) {
#ifdef DEBUG
printf("fhpibgo: recv failed, retrying...\n");
#endif
- (void) fhpibrecv(unit, slave, sec, 0, 0);
+ (void) fhpibrecv(hs, slave, sec, 0, 0);
}
i = hd->hpib_cmd;
- hd->hpib_cmd = fhpibcmd[unit];
- hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) |
+ hd->hpib_cmd = sc->sc_cmd;
+ hd->hpib_ie = IDS_DMA(hs->sc_dq->dq_chan) |
((flags & DMAGO_WORD) ? IDS_WDMA : 0);
return;
}
- fhpibcmd[unit] = CT_REN | CT_8BIT | CT_FIFOSEL;
+ sc->sc_cmd = CT_REN | CT_8BIT | CT_FIFOSEL;
if (count < hpibdmathresh) {
#ifdef DEBUG
- fhpibnondma[unit]++;
+ /* fhpibnondma[unit]++; XXX */
if (flags & DMAGO_WORD)
- fhpibworddma[unit]--;
+ /* fhpibworddma[unit]--; XXX */ ;
#endif
hs->sc_curcnt = count;
- (void) fhpibsend(unit, slave, sec, addr, count);
- fhpibdone(unit);
+ (void) fhpibsend(hs, slave, sec, addr, count);
+ fhpibdone(hs);
return;
}
count -= (flags & DMAGO_WORD) ? 2 : 1;
hs->sc_curcnt = count;
- dmago(hs->sc_dq.dq_ctlr, addr, count, flags);
- if (fhpibsend(unit, slave, sec, 0, 0) < 0) {
+ dmago(hs->sc_dq->dq_chan, addr, count, flags);
+ if (fhpibsend(hs, slave, sec, 0, 0) < 0) {
#ifdef DEBUG
printf("fhpibgo: send failed, retrying...\n");
#endif
- (void) fhpibsend(unit, slave, sec, 0, 0);
+ (void) fhpibsend(hs, slave, sec, 0, 0);
}
i = hd->hpib_cmd;
- hd->hpib_cmd = fhpibcmd[unit];
- hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | IDS_WRITE |
+ hd->hpib_cmd = sc->sc_cmd;
+ hd->hpib_ie = IDS_DMA(hs->sc_dq->dq_chan) | IDS_WRITE |
((flags & DMAGO_WORD) ? IDS_WDMA : 0);
}
fhpibdmadone(arg)
void *arg;
{
- register int unit;
- register struct hpib_softc *hs;
+ register struct hpibbus_softc *hs = arg;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
int s = splbio();
- unit = (int)arg;
- hs = &hpib_softc[unit];
if (hs->sc_flags & HPIBF_IO) {
- register struct fhpibdevice *hd;
- register struct devqueue *dq;
+ register struct fhpibdevice *hd = sc->sc_regs;
+ register struct hpibqueue *hq;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_imask = 0;
hd->hpib_cid = 0xFF;
DELAY(100);
fhpibifc(hd);
hd->hpib_ie = IDS_IE;
hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
- dmafree(&hs->sc_dq);
- dq = hs->sc_sq.dq_forw;
- (dq->dq_driver->d_intr)(dq->dq_softc);
+ dmafree(hs->sc_dq);
+
+ hq = hs->sc_queue.tqh_first;
+ (hq->hq_intr)(hq->hq_softc);
}
- (void) splx(s);
+ splx(s);
}
void
-fhpibdone(unit)
- int unit;
+fhpibdone(hs)
+ struct hpibbus_softc *hs;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ register struct fhpibdevice *hd = sc->sc_regs;
register char *addr;
register int cnt;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
cnt = hs->sc_curcnt;
hs->sc_addr += cnt;
hs->sc_count -= cnt;
if (hs->sc_flags & HPIBF_READ) {
hd->hpib_imask = IM_IDLE | IM_BYTE;
if (hs->sc_flags & HPIBF_TIMO)
- timeout(fhpibdmadone, (void *)unit, hz >> 2);
+ timeout(fhpibdmadone, hs, hz >> 2);
} else {
cnt = hs->sc_count;
if (cnt) {
fhpibintr(arg)
void *arg;
{
- register struct hpib_softc *hs = arg;
- register struct fhpibdevice *hd;
- register struct devqueue *dq;
- register int stat0, unit = hs->sc_hc->hp_unit;
+ struct fhpib_softc *sc = arg;
+ register struct hpibbus_softc *hs = sc->sc_hpibbus;
+ register struct fhpibdevice *hd = sc->sc_regs;
+ register struct hpibqueue *hq;
+ register int stat0, unit = sc->sc_dev.dv_unit;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
stat0 = hd->hpib_ids;
if ((stat0 & (IDS_IE|IDS_IR)) != (IDS_IE|IDS_IR)) {
#ifdef DEBUG
if ((fhpibdebug & FDB_FAIL) && (stat0 & IDS_IR) &&
(hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) != HPIBF_IO)
printf("%s: fhpibintr: bad status %x\n",
- hs->sc_hc->hp_xname, stat0);
- fhpibbadint[0]++;
+ sc->sc_dev.dv_xname, stat0);
+ /* fhpibbadint[0]++; XXX */
#endif
return(0);
}
if ((hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) == HPIBF_IO) {
#ifdef DEBUG
- fhpibbadint[1]++;
+ /* fhpibbadint[1]++; XXX */
#endif
return(0);
}
if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit)
printf("fhpibintr: flags %x\n", hs->sc_flags);
#endif
- dq = hs->sc_sq.dq_forw;
+ hq = hs->sc_queue.tqh_first;
if (hs->sc_flags & HPIBF_IO) {
if (hs->sc_flags & HPIBF_TIMO)
- untimeout(fhpibdmadone, (void *)unit);
+ untimeout(fhpibdmadone, hs);
stat0 = hd->hpib_cmd;
- hd->hpib_cmd = fhpibcmd[unit] & ~CT_8BIT;
+ hd->hpib_cmd = sc->sc_cmd & ~CT_8BIT;
hd->hpib_stat = 0;
hd->hpib_cmd = CT_REN | CT_8BIT;
stat0 = hd->hpib_intr;
hd->hpib_imask = 0;
hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
- dmafree(&hs->sc_dq);
- (dq->dq_driver->d_intr)(dq->dq_softc);
+ dmafree(hs->sc_dq);
+ (hq->hq_intr)(hq->hq_softc);
} else if (hs->sc_flags & HPIBF_PPOLL) {
stat0 = hd->hpib_intr;
#ifdef DEBUG
if ((fhpibdebug & FDB_FAIL) &&
doppollint && (stat0 & IM_PPRESP) == 0)
printf("%s: fhpibintr: bad intr reg %x\n",
- hs->sc_hc->hp_xname, stat0);
+ sc->sc_dev.dv_xname, stat0);
#endif
hd->hpib_stat = 0;
hd->hpib_imask = 0;
#ifdef DEBUG
- stat0 = fhpibppoll(unit);
+ stat0 = fhpibppoll(hs);
if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit)
printf("fhpibintr: got PPOLL status %x\n", stat0);
- if ((stat0 & (0x80 >> dq->dq_slave)) == 0) {
+ if ((stat0 & (0x80 >> hq->hq_slave)) == 0) {
/*
* XXX give it another shot (68040)
*/
- fhpibppollfail[unit]++;
+ /* fhpibppollfail[unit]++; XXX */
DELAY(fhpibppolldelay);
- stat0 = fhpibppoll(unit);
- if ((stat0 & (0x80 >> dq->dq_slave)) == 0 &&
+ stat0 = fhpibppoll(hs);
+ if ((stat0 & (0x80 >> hq->hq_slave)) == 0 &&
(fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit)
printf("fhpibintr: PPOLL: unit %d slave %d stat %x\n",
unit, dq->dq_slave, stat0);
}
#endif
hs->sc_flags &= ~HPIBF_PPOLL;
- (dq->dq_driver->d_intr)(dq->dq_softc);
+ (hq->hq_intr)(hq->hq_softc);
}
return(1);
}
int
-fhpibppoll(unit)
- int unit;
+fhpibppoll(hs)
+ struct hpibbus_softc *hs;
{
- register struct fhpibdevice *hd;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ register struct fhpibdevice *hd = sc->sc_regs;
register int ppoll;
- hd = (struct fhpibdevice *)hpib_softc[unit].sc_hc->hp_addr;
hd->hpib_stat = 0;
hd->hpib_psense = 0;
hd->hpib_pmask = 0xFF;
fhpibppwatch(arg)
void *arg;
{
- register int unit;
- register struct hpib_softc *hs;
- register struct fhpibdevice *hd;
+ register struct hpibbus_softc *hs = arg;
+ struct fhpib_softc *sc = (struct fhpib_softc *)hs->sc_dev.dv_parent;
+ register struct fhpibdevice *hd = sc->sc_regs;
register int slave;
- unit = (int)arg;
- hs = &hpib_softc[unit];
if ((hs->sc_flags & HPIBF_PPOLL) == 0)
return;
- hd = (struct fhpibdevice *)hs->sc_hc->hp_addr;
- slave = (0x80 >> hs->sc_sq.dq_forw->dq_slave);
+ slave = (0x80 >> hs->sc_queue.tqh_first->hq_slave);
#ifdef DEBUG
if (!doppollint) {
- if (fhpibppoll(unit) & slave) {
+ if (fhpibppoll(hs) & slave) {
hd->hpib_stat = ST_IENAB;
hd->hpib_imask = IM_IDLE | IM_ROOM;
} else
- timeout(fhpibppwatch, (void *)unit, 1);
+ timeout(fhpibppwatch, sc, 1);
return;
}
- if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit)
- printf("fhpibppwatch: sense request on %d\n", unit);
+ if ((fhpibdebug & FDB_PPOLL) && sc->sc_dev.dv_unit == fhpibdebugunit)
+ printf("fhpibppwatch: sense request on %s\n",
+ sc->sc_dev.dv_xname);
#endif
hd->hpib_psense = ~slave;
hd->hpib_pmask = slave;
hd->hpib_imask = IM_PPRESP | IM_PABORT;
hd->hpib_ie = IDS_IE;
}
-#endif /* NHPIB > 0 */
-/* $OpenBSD: grf.c,v 1.4 1997/01/12 15:12:31 downsj Exp $ */
-/* $NetBSD: grf.c,v 1.22 1997/01/10 00:07:27 scottr Exp $ */
+/* $OpenBSD: grf.c,v 1.5 1997/02/03 04:47:25 downsj Exp $ */
+/* $NetBSD: grf.c,v 1.23 1997/01/30 09:18:42 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
#if NITE > 0
#include <hp300/dev/itevar.h>
#else
-#define iteon(u,f) 0 /* normally returns int */
+#define iteon(u,f) 0 /* noramlly returns int */
#define iteoff(u,f)
#endif /* NITE > 0 */
/* prototypes for the devsw entry points */
cdev_decl(grf);
-#ifdef NEWCONFIG
-int grfmatch __P((struct device *, struct cfdata *, void *));
+int grfmatch __P((struct device *, void *, void *));
void grfattach __P((struct device *, struct device *, void *));
struct cfattach grf_ca = {
};
int grfprint __P((void *, const char *));
-#else /* ! NEWCONFIG */
-#include "grf.h"
-struct grf_softc grf_softc[NGRF];
-#endif /* NEWCONFIG */
/*
* Frambuffer state information, statically allocated for benefit
#define GDB_LOCK 0x08
#endif
-#ifdef NEWCONFIG
int
grfmatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
return (1);
return (UNCONF);
}
-#endif /* NEWCONFIG */
/*ARGSUSED*/
int
struct grf_data *gp;
int error = 0;
-#ifdef NEWCONFIG
if (unit >= grf_cd.cd_ndevs ||
(sc = grf_cd.cd_devs[unit]) == NULL)
return (ENXIO);
-#else
- if (unit >= NGRF)
- return(ENXIO);
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
struct grf_softc *sc;
struct grf_data *gp;
-#ifdef NEWCONFIG
sc = grf_cd.cd_devs[unit];
-#else
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
struct grf_data *gp;
int error, unit = GRFUNIT(dev);
-#ifdef NEWCONFIG
sc = grf_cd.cd_devs[unit];
-#else
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
dev_t dev;
int off, prot;
{
-#ifdef NEWCONFIG
struct grf_softc *sc = grf_cd.cd_devs[GRFUNIT(dev)];
-#else
- struct grf_softc *sc = &grf_softc[GRFUNIT(dev)];
-#endif
return (grfaddr(sc, off));
}
struct grf_softc *sc;
struct grf_data *gp;
-#ifdef NEWCONFIG
sc = grf_cd.cd_devs[unit];
-#else
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
/*
struct grf_data *gp;
int error;
-#ifdef NEWCONFIG
sc = grf_cd.cd_devs[unit];
-#else
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
(void) grfunmap(dev, (caddr_t)0, curproc);
(dev&GRFOVDEV) ? GM_GRFOVOFF : GM_GRFOFF,
(caddr_t)0);
/* XXX: see comment for iteoff above */
- iteon(sc->sc_ite->sc_data, 2);
+ (void) iteon(sc->sc_ite->sc_data, 2);
return(error);
}
caddr_t data;
struct proc *p;
{
-#ifdef NEWCONFIG
struct grf_softc *sc = grf_cd.cd_devs[GRFUNIT(dev)];
-#else
- struct grf_softc *sc = &grf_softc[GRFUNIT(dev)];
-#endif
struct grf_data *gp = sc->sc_data;
int error;
struct grf_data *gp;
int newdev;
-#ifdef NEWCONFIG
if (unit >= grf_cd.cd_ndevs ||
(sc = grf_cd.cd_devs[unit]) == NULL)
return (bsdtohpuxdev(dev));
-#else
- if (unit >= NGRF)
- return (bsdtohpuxdev(dev));
- sc = &grf_softc[unit];
-#endif
gp = sc->sc_data;
if ((gp->g_flags & GF_ALIVE) == 0)
caddr_t *addrp;
struct proc *p;
{
-#ifdef NEWCONFIG
struct grf_softc *sc = grf_cd.cd_devs[GRFUNIT(dev)];
-#else
- struct grf_softc *sc = &grf_softc[GRFUNIT(dev)];
-#endif
struct grf_data *gp = sc->sc_data;
int len, error;
struct vnode vn;
caddr_t addr;
struct proc *p;
{
-#ifdef NEWCONFIG
struct grf_softc *sc = grf_cd.cd_devs[GRFUNIT(dev)];
-#else
- struct grf_softc *sc = &grf_softc[GRFUNIT(dev)];
-#endif
struct grf_data *gp = sc->sc_data;
vm_size_t size;
int rv;
+++ /dev/null
-/* $OpenBSD: grf_conf.c,v 1.3 1997/01/12 15:12:31 downsj Exp $ */
-/* $NetBSD: grf_conf.c,v 1.4 1996/12/17 08:41:06 thorpej Exp $ */
-
-/*
- * XXX This file is old config only!
- */
-
-/*
- * Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
- * Copyright (c) 1991 University of Utah.
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * the Systems Programming Group of the University of Utah Computer
- * Science Department.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: Utah $Hdr: grf_conf.c 1.2 92/01/22$
- *
- * @(#)grf_conf.c 8.1 (Berkeley) 6/10/93
- */
-
-/*
- * XXX this information could be generated by config.
- */
-#include "grf.h"
-#if NGRF > 0
-
-#include <sys/types.h>
-#include <sys/device.h>
-
-#include <hp300/dev/grfioctl.h> /* XXX */
-#include <hp300/dev/grfvar.h>
-
-extern struct grfsw dvbox_grfsw;
-extern struct grfsw gbox_grfsw;
-extern struct grfsw hyper_grfsw;
-extern struct grfsw rbox_grfsw;
-extern struct grfsw topcat_grfsw;
-extern struct grfsw lrcatseye_grfsw;
-extern struct grfsw hrcatseye_grfsw;
-extern struct grfsw hrmcatseye_grfsw;
-
-struct grfsw *grfsw[] = {
- &topcat_grfsw,
- &gbox_grfsw,
- &rbox_grfsw,
- &lrcatseye_grfsw,
- &hrcatseye_grfsw,
- &hrmcatseye_grfsw,
- &dvbox_grfsw,
- &hyper_grfsw,
-};
-int ngrfsw = sizeof(grfsw) / sizeof(grfsw[0]);
-#endif /* NGRF > 0 */
-/* $OpenBSD: grf_dv.c,v 1.3 1997/01/12 15:12:32 downsj Exp $ */
-/* $NetBSD: grf_dv.c,v 1.9 1996/12/17 08:41:07 thorpej Exp $ */
+/* $OpenBSD: grf_dv.c,v 1.4 1997/02/03 04:47:26 downsj Exp $ */
+/* $NetBSD: grf_dv.c,v 1.10 1997/01/30 09:18:45 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
int dv_mode __P((struct grf_data *, int, caddr_t));
void dv_reset __P((struct dvboxfb *));
-#ifdef NEWCONFIG
-int dvbox_intio_match __P((struct device *, struct cfdata *, void *));
+int dvbox_intio_match __P((struct device *, void *, void *));
void dvbox_intio_attach __P((struct device *, struct device *, void *));
-int dvbox_dio_match __P((struct device *, struct cfdata *, void *));
+int dvbox_dio_match __P((struct device *, void *, void *));
void dvbox_dio_attach __P((struct device *, struct device *, void *));
struct cfattach dvbox_intio_ca = {
struct cfdriver dvbox_cd = {
NULL, "dvbox", DV_DULL
};
-#endif /* NEWCONFIG */
/* DaVinci grf switch */
struct grfsw dvbox_grfsw = {
};
#endif /* NITE > 0 */
-#ifdef NEWCONFIG
int
dvbox_intio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct intio_attach_args *ia = aux;
struct grfreg *grf;
int
dvbox_dio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
grfdev_attach(sc, dv_init, grf, &dvbox_grfsw);
}
-#endif /* NEWCONFIG */
/*
* Initialize hardware.
-/* $OpenBSD: grf_gb.c,v 1.3 1997/01/12 15:12:33 downsj Exp $ */
-/* $NetBSD: grf_gb.c,v 1.9 1996/12/17 08:41:08 thorpej Exp $ */
+/* $OpenBSD: grf_gb.c,v 1.4 1997/02/03 04:47:27 downsj Exp $ */
+/* $NetBSD: grf_gb.c,v 1.10 1997/01/30 09:18:45 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
int gb_mode __P((struct grf_data *gp, int, caddr_t));
void gb_microcode __P((struct gboxfb *));
-#ifdef NEWCONFIG
-int gbox_intio_match __P((struct device *, struct cfdata *, void *));
+int gbox_intio_match __P((struct device *, void *, void *));
void gbox_intio_attach __P((struct device *, struct device *, void *));
-int gbox_dio_match __P((struct device *, struct cfdata *, void *));
+int gbox_dio_match __P((struct device *, void *, void *));
void gbox_dio_attach __P((struct device *, struct device *, void *));
struct cfattach gbox_intio_ca = {
struct cfdriver gbox_cd = {
NULL, "gbox", DV_DULL
};
-#endif /* NEWCONFIG */
/* Gatorbox grf switch */
struct grfsw gbox_grfsw = {
};
#endif /* NITE > 0 */
-#ifdef NEWCONFIG
int
gbox_intio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct intio_attach_args *ia = aux;
struct grfreg *grf;
int
gbox_dio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
grfdev_attach(sc, gb_init, grf, &gbox_grfsw);
}
-#endif /* NEWCONFIG */
/*
* Initialize hardware.
-/* $OpenBSD: grf_hy.c,v 1.3 1997/01/12 15:12:35 downsj Exp $ */
-/* $NetBSD: grf_hy.c,v 1.7 1996/12/17 08:41:09 thorpej Exp $ */
+/* $OpenBSD: grf_hy.c,v 1.4 1997/02/03 04:47:28 downsj Exp $ */
+/* $NetBSD: grf_hy.c,v 1.8 1997/01/30 09:18:47 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
int hy_mode __P((struct grf_data *gp, int, caddr_t));
void hyper_ite_fontinit __P((struct ite_data *));
-#ifdef NEWCONFIG
-int hyper_dio_match __P((struct device *, struct cfdata *, void *));
+int hyper_dio_match __P((struct device *, void *, void *));
void hyper_dio_attach __P((struct device *, struct device *, void *));
struct cfattach hyper_dio_ca = {
struct cfdriver hyper_cd = {
NULL, "hyper", DV_DULL
};
-#endif /* NEWCONFIG */
/* Hyperion grf switch */
struct grfsw hyper_grfsw = {
};
#endif /* NITE > 0 */
-#ifdef NEWCONFIG
int
hyper_dio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
grfdev_attach(sc, hy_init, grf, &hyper_grfsw);
}
-#endif /* NEWCONFIG */
/*
* Initialize hardware.
+++ /dev/null
-/* $OpenBSD: grf_machdep.c,v 1.4 1997/01/12 15:12:36 downsj Exp $ */
-/* $NetBSD: grf_machdep.c,v 1.7 1996/12/17 08:41:09 thorpej Exp $ */
-
-/*
- * XXX This file is old config only!
- */
-
-/*
- * Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
- * Copyright (c) 1991 University of Utah.
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * the Systems Programming Group of the University of Utah Computer
- * Science Department.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: Utah $Hdr: grf_machdep.c 1.1 92/01/21
- *
- * @(#)grf_machdep.c 8.2 (Berkeley) 1/12/94
- */
-
-/*
- * Graphics display driver for the HP300/400 DIO/DIO-II based machines.
- * This is the hardware-dependent configuration portion of the driver.
- */
-
-#include "grf.h"
-#if NGRF > 0
-
-#include <sys/param.h>
-#include <sys/malloc.h>
-#include <sys/systm.h>
-
-#include <machine/autoconf.h>
-
-#include <hp300/dev/device.h>
-#include <hp300/dev/grfioctl.h>
-#include <hp300/dev/grfvar.h>
-#include <hp300/dev/grfreg.h>
-
-#include <hp300/dev/itevar.h>
-
-#include "ite.h"
-
-int grfmatch();
-void grfattach();
-
-int grfinit __P((struct hp_device *, struct grf_data *, int));
-
-struct driver grfdriver = { grfmatch, grfattach, "grf" };
-
-int
-grfmatch(hd)
- struct hp_device *hd;
-{
- struct grf_softc *sc = &grf_softc[hd->hp_unit];
- int scode;
-
- if (hd->hp_args->hw_pa == (caddr_t)GRFIADDR) /* XXX */
- scode = -1;
- else
- scode = hd->hp_args->hw_sc;
-
- if (scode == conscode) {
- /*
- * We've already been initialized.
- */
- sc->sc_data = &grf_cn;
- return (1);
- }
-
- /*
- * Allocate storage space for the grf_data.
- */
- sc->sc_data = (struct grf_data *)malloc(sizeof(struct grf_data),
- M_DEVBUF, M_NOWAIT);
- if (sc->sc_data == NULL) {
- printf("grfmatch: malloc for grf_data failed\n");
- return (0);
- }
- bzero(sc->sc_data, sizeof(struct grf_data));
-
- return (grfinit(hd, sc->sc_data, scode));
-}
-
-void
-grfattach(hd)
- struct hp_device *hd;
-{
- struct grf_softc *sc = &grf_softc[hd->hp_unit];
- struct grf_data *gp = sc->sc_data;
- int scode, isconsole;
-
- if (hd->hp_args->hw_pa == (caddr_t)GRFIADDR) /* XXX */
- scode = -1;
- else
- scode = hd->hp_args->hw_sc;
-
- if (scode == conscode)
- isconsole = 1;
- else
- isconsole = 0;
-
- sc->sc_scode = scode;
-
- printf(": %d x %d ", gp->g_display.gd_dwidth,
- gp->g_display.gd_dheight);
- if (gp->g_display.gd_colors == 2)
- printf("monochrome");
- else
- printf("%d color", gp->g_display.gd_colors);
- printf(" %s display", gp->g_sw->gd_desc);
- if (isconsole)
- printf(" (console)");
- printf("\n");
-
-#if NITE > 0
- /* XXX hack */
- ite_attach_grf(hd->hp_unit, isconsole);
-#endif /* NITE > 0 */
-}
-
-int
-grfinit(hd, gp, scode)
- struct hp_device *hd;
- struct grf_data *gp;
- int scode;
-{
- register struct grfsw *gsw;
- struct grfreg *gr;
- caddr_t addr = hd->hp_addr;
- int i;
-
- gr = (struct grfreg *) addr;
- if (gr->gr_id != GRFHWID)
- return(0);
- for (i = 0; i < ngrfsw; ++i) {
- gsw = grfsw[i];
- if (gsw->gd_hwid == gr->gr_id2)
- break;
- }
- if ((i < ngrfsw) && (*gsw->gd_init)(gp, scode, addr)) {
- gp->g_sw = gsw;
- gp->g_display.gd_id = gsw->gd_swid;
- gp->g_flags = GF_ALIVE;
- return(1);
- }
- return(0);
-}
-#endif /* NGRF > 0 */
-/* $OpenBSD: grf_rb.c,v 1.3 1997/01/12 15:12:36 downsj Exp $ */
-/* $NetBSD: grf_rb.c,v 1.9 1996/12/17 08:41:10 thorpej Exp $ */
+/* $OpenBSD: grf_rb.c,v 1.4 1997/02/03 04:47:30 downsj Exp $ */
+/* $NetBSD: grf_rb.c,v 1.10 1997/01/30 09:18:48 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
int rb_init __P((struct grf_data *gp, int, caddr_t));
int rb_mode __P((struct grf_data *gp, int, caddr_t));
-#ifdef NEWCONFIG
-int rbox_intio_match __P((struct device *, struct cfdata *, void *));
+int rbox_intio_match __P((struct device *, void *, void *));
void rbox_intio_attach __P((struct device *, struct device *, void *));
-int rbox_dio_match __P((struct device *, struct cfdata *, void *));
+int rbox_dio_match __P((struct device *, void *, void *));
void rbox_dio_attach __P((struct device *, struct device *, void *));
struct cfattach rbox_intio_ca = {
struct cfdriver rbox_cd = {
NULL, "rbox", DV_DULL
};
-#endif /* NEWCONFIG */
/* Renaissance grf switch */
struct grfsw rbox_grfsw = {
};
#endif /* NITE > 0 */
-#ifdef NEWCONFIG
int
rbox_intio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct intio_attach_args *ia = aux;
struct grfreg *grf;
int
rbox_dio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
grfdev_attach(sc, rb_init, grf, &rbox_grfsw);
}
-#endif /* NEWCONFIG */
/*
* Initialize hardware.
-/* $OpenBSD: grf_subr.c,v 1.1 1997/01/12 15:12:38 downsj Exp $ */
-/* $NetBSD: grf_subr.c,v 1.1 1996/12/17 08:41:11 thorpej Exp $ */
+/* $OpenBSD: grf_subr.c,v 1.2 1997/02/03 04:47:30 downsj Exp $ */
+/* $NetBSD: grf_subr.c,v 1.2 1997/01/30 09:18:49 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
-/* $OpenBSD: grf_tc.c,v 1.3 1997/01/12 15:12:38 downsj Exp $ */
-/* $NetBSD: grf_tc.c,v 1.9 1996/12/17 08:41:12 thorpej Exp $ */
+/* $OpenBSD: grf_tc.c,v 1.4 1997/02/03 04:47:31 downsj Exp $ */
+/* $NetBSD: grf_tc.c,v 1.10 1997/01/30 09:18:50 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
int tc_init __P((struct grf_data *, int, caddr_t));
int tc_mode __P((struct grf_data *, int, caddr_t));
-#ifdef NEWCONFIG
void topcat_common_attach __P((struct grfdev_softc *, caddr_t, u_int8_t));
-int topcat_intio_match __P((struct device *, struct cfdata *, void *));
+int topcat_intio_match __P((struct device *, void *, void *));
void topcat_intio_attach __P((struct device *, struct device *, void *));
-int topcat_dio_match __P((struct device *, struct cfdata *, void *));
+int topcat_dio_match __P((struct device *, void *, void *));
void topcat_dio_attach __P((struct device *, struct device *, void *));
struct cfattach topcat_intio_ca = {
struct cfdriver topcat_cd = {
NULL, "topcat", DV_DULL
};
-#endif /* NEWCONFIG */
/* Topcat (bobcat) grf switch */
struct grfsw topcat_grfsw = {
};
#endif /* NITE > 0 */
-#ifdef NEWCONFIG
int
topcat_intio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct intio_attach_args *ia = aux;
struct grfreg *grf;
int
topcat_dio_match(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
grfdev_attach(sc, tc_init, grf, sw);
}
-#endif /* NEWCONFIG */
/*
* Initialize hardware.
-/* $OpenBSD: grfvar.h,v 1.3 1997/01/12 15:12:41 downsj Exp $ */
-/* $NetBSD: grfvar.h,v 1.8 1996/12/17 08:41:12 thorpej Exp $ */
+/* $OpenBSD: grfvar.h,v 1.4 1997/02/03 04:47:32 downsj Exp $ */
+/* $NetBSD: grfvar.h,v 1.9 1997/01/30 09:18:51 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
#ifdef _KERNEL
extern struct grf_data grf_cn; /* grf_data for console device */
-#ifndef NEWCONFIG
-extern struct grf_softc grf_softc[];
-extern struct grfsw *grfsw[];
-extern int ngrfsw;
-#endif /* ! NEWCONFIG */
-#ifdef NEWCONFIG
void grfdev_attach __P((struct grfdev_softc *,
int (*init)(struct grf_data *, int, caddr_t),
caddr_t, struct grfsw *));
-#endif /* NEWCONFIG */
#endif /* _KERNEL */
-/* $OpenBSD: hpib.c,v 1.5 1997/01/12 15:12:45 downsj Exp $ */
-/* $NetBSD: hpib.c,v 1.12 1996/12/09 03:16:27 thorpej Exp $ */
+/* $OpenBSD: hpib.c,v 1.6 1997/02/03 04:47:33 downsj Exp $ */
+/* $NetBSD: hpib.c,v 1.13 1997/01/30 09:06:51 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
*/
/*
- * HPIB driver
+ * HP-IB bus driver
*/
-#include "hpib.h"
-#if NHPIB > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/buf.h>
+#include <sys/malloc.h>
+#include <sys/device.h>
-#include <hp300/dev/device.h>
-#include <hp300/dev/hpibvar.h>
#include <hp300/dev/dmavar.h>
+#include <hp300/dev/hpibvar.h>
+
#include <machine/cpu.h>
#include <hp300/hp300/isr.h>
-int hpibmatch __P((struct hp_ctlr *));
-void hpibattach __P((struct hp_ctlr *));
-void hpibstart __P((int));
-void hpibgo __P((int, int, int, void *, int, int, int));
-void hpibdone __P((int));
-int hpibintr __P((void *));
-
-struct driver hpibdriver = {
- hpibmatch,
- hpibattach,
- "hpib",
- (int(*)())hpibstart, /* XXX */
- (int(*)())hpibgo, /* XXX */
- hpibintr,
- (int(*)())hpibdone, /* XXX */
+int hpibbusmatch __P((struct device *, void *, void *));
+void hpibbusattach __P((struct device *, struct device *, void *));
+
+struct cfattach hpibbus_ca = {
+ sizeof(struct hpibbus_softc), hpibbusmatch, hpibbusattach
};
-struct hpib_softc hpib_softc[NHPIB];
+struct cfdriver hpibbus_cd = {
+ NULL, "hpibbus", DV_DULL
+};
-extern int nhpibtype __P((struct hp_ctlr *)); /* XXX */
-extern int fhpibtype __P((struct hp_ctlr *)); /* XXX */
-extern void nhpibattach __P((struct hp_ctlr *)); /* XXX */
-extern void fhpibattach __P((struct hp_ctlr *)); /* XXX */
+void hpibbus_attach_children __P((struct hpibbus_softc *));
+int hpibbussearch __P((struct device *, void *, void *));
+int hpibbusprint __P((void *, const char *));
+
+int hpibbus_alloc __P((struct hpibbus_softc *, int, int));
+void hpibbus_free __P((struct hpibbus_softc *, int, int));
+
+void hpibstart __P((void *));
+void hpibdone __P((void *));
int hpibtimeout = 100000; /* # of status tests before we give up */
int hpibidtimeout = 10000; /* # of status tests for hpibid() calls */
int hpibdmathresh = 3; /* byte count beyond which to attempt dma */
+/*
+ * HP-IB is essentially an IEEE 488 bus, with an HP command
+ * set (CS/80 on `newer' devices, Amigo on before-you-were-born
+ * devices) thrown on top. Devices that respond to CS/80 (and
+ * probably Amigo, too) are tagged with a 16-bit ID.
+ *
+ * HP-IB has a 2-level addressing scheme; slave, the analog
+ * of a SCSI ID, and punit, the analog of a SCSI LUN. Unforunately,
+ * IDs are on a per-slave basis; punits are often used for disk
+ * drives that have an accompanying tape drive on the second punit.
+ *
+ * In addition, not all HP-IB devices speak CS/80 or Amigo.
+ * Examples of such devices are HP-IB plotters, which simply
+ * take raw plotter commands over 488. These devices do not
+ * have ID tags, and often the host cannot even tell if such
+ * a device is attached to the system!
+ *
+ * These two nasty bits mean that we have to treat HP-IB as
+ * an indirect bus. However, since we are given some ID
+ * information, it is unreasonable to disallow cloning of
+ * CS/80 devices.
+ *
+ * To deal with all of this, we use the semi-twisted scheme
+ * in hpibbus_attach_children(). For each HP-IB slave, we loop
+ * through all of the possibly-configured children, allowing
+ * them to modify the punit parameter (but NOT the slave!).
+ *
+ * This is evil, but what can you do?
+ */
+
int
-hpibmatch(hc)
- register struct hp_ctlr *hc;
+hpibbusmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- struct hp_hw *hw = hc->hp_args;
- extern caddr_t internalhpib;
-
- /* Special case for internal HP-IB. */
- if ((hw->hw_sc == 7) && internalhpib)
- goto hwid_ok;
-
- switch (hw->hw_id) {
- case 8: /* 98625B */
- case 128: /* 98624A */
- hwid_ok:
- if (nhpibtype(hc) || fhpibtype(hc))
- return (1);
- }
- return (0);
+ return (1);
}
void
-hpibattach(hc)
- struct hp_ctlr *hc;
+hpibbusattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
+ struct hpibbus_softc *sc = (struct hpibbus_softc *)self;
+ struct hpibdev_attach_args *ha = aux;
+
+ printf("\n");
+
+ /* Get the operations vector for the controller. */
+ sc->sc_ops = ha->ha_ops;
+ sc->sc_type = ha->ha_type; /* XXX */
+ sc->sc_ba = ha->ha_ba;
+ *(ha->ha_softcpp) = sc; /* XXX */
+
+ hpibreset(self->dv_unit); /* XXX souldn't be here */
/*
- * Call the appropriate "attach" routine for this controller.
- * The type is set in the "type" routine.
- *
- * XXX This is, by the way, exactly backwards.
+ * Initialize the DMA queue entry.
*/
- switch (hs->sc_type) {
- case HPIBA:
- case HPIBB:
- nhpibattach(hc);
- break;
-
- case HPIBC:
- fhpibattach(hc);
- break;
-
- default:
- panic("hpibattach: unknown type 0x%x", hs->sc_type);
- /* NOTREACHED */
+ sc->sc_dq = (struct dmaqueue *)malloc(sizeof(struct dmaqueue),
+ M_DEVBUF, M_NOWAIT);
+ if (sc->sc_dq == NULL) {
+ printf("%s: can't allocate DMA queue entry\n", self->dv_xname);
+ return;
}
+ sc->sc_dq->dq_softc = sc;
+ sc->sc_dq->dq_start = hpibstart;
+ sc->sc_dq->dq_done = hpibdone;
+
+ /* Initialize the slave request queue. */
+ TAILQ_INIT(&sc->sc_queue);
+
+ /* Attach any devices on the bus. */
+ hpibbus_attach_children(sc);
+}
+
+void
+hpibbus_attach_children(sc)
+ struct hpibbus_softc *sc;
+{
+ struct hpibbus_attach_args ha;
+ int slave;
+
+ for (slave = 0; slave < 8; slave++) {
+ /*
+ * Get the ID tag for the device, if any.
+ * Plotters won't identify themselves, and
+ * get the same value as non-existent devices.
+ */
+ ha.ha_id = hpibid(sc->sc_dev.dv_unit, slave);
+
+ ha.ha_slave = slave; /* not to be modified by children */
+ ha.ha_punit = 0; /* children modify this */
+
+ /*
+ * Search though all configured children for this bus.
+ */
+ (void)config_search(hpibbussearch, &sc->sc_dev, &ha);
+ }
+}
+
+int
+hpibbussearch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ struct cfdata *cf = match;
+ struct hpibbus_softc *sc = (struct hpibbus_softc *)parent;
+ struct hpibbus_attach_args *ha = aux;
+
+ /* Make sure this is in a consistent state. */
+ ha->ha_punit = 0;
+
+ if ((*cf->cf_attach->ca_match)(parent, cf, ha) > 0) {
+ /*
+ * The device probe has succeeded, and filled in
+ * the punit information. Make sure the configuration
+ * allows for this slave/punit combination.
+ */
+ if (cf->hpibbuscf_slave != HPIBBUS_SLAVE_UNK &&
+ cf->hpibbuscf_slave != ha->ha_slave)
+ goto out;
+ if (cf->hpibbuscf_punit != HPIBBUS_PUNIT_UNK &&
+ cf->hpibbuscf_punit != ha->ha_punit)
+ goto out;
+
+ /*
+ * Allocate the device's address from the bus's
+ * resource map.
+ */
+ if (hpibbus_alloc(sc, ha->ha_slave, ha->ha_punit))
+ goto out;
+
+ /*
+ * This device is allowed; attach it.
+ */
+ config_attach(parent, cf, ha, hpibbusprint);
+ }
+ out:
+ return (0);
+}
- hs->sc_hc = hc;
- hs->sc_dq.dq_unit = hc->hp_unit;
- hs->sc_dq.dq_driver = &hpibdriver;
- hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
+int
+hpibbusprint(aux, pnp)
+ void *aux;
+ const char *pnp;
+{
+ struct hpibbus_attach_args *ha = aux;
- /* Establish the interrupt handler. */
- (void) isrlink(hpibintr, hs, hc->hp_ipl, ISRPRI_BIO);
- dmacomputeipl();
+ printf(" slave %d punit %d", ha->ha_slave, ha->ha_punit);
+ return (UNCONF);
+}
- /* Reset the controller, display what we've seen, and we're done. */
- hpibreset(hc->hp_unit);
- printf(": %s\n", hs->sc_descrip);
+int
+hpibdevprint(aux, pnp)
+ void *aux;
+ const char *pnp;
+{
+
+ /* only hpibbus's can attach to hpibdev's -- easy. */
+ if (pnp != NULL)
+ printf("hpibbus at %s", pnp);
+ return (UNCONF);
}
void
hpibreset(unit)
register int unit;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- (hpib_softc[unit].sc_controller->hpib_reset)(unit);
+ (*sc->sc_ops->hpib_reset)(sc);
}
int
-hpibreq(dq)
- register struct devqueue *dq;
+hpibreq(pdev, hq)
+ struct device *pdev;
+ struct hpibqueue *hq;
{
- register struct devqueue *hq;
+ struct hpibbus_softc *sc = (struct hpibbus_softc *)pdev;
+ int s;
- hq = &hpib_softc[dq->dq_ctlr].sc_sq;
- insque(dq, hq->dq_back);
- if (dq->dq_back == hq)
- return(1);
- return(0);
+ s = splhigh(); /* XXXthorpej */
+ TAILQ_INSERT_TAIL(&sc->sc_queue, hq, hq_list);
+ splx(s);
+
+ if (sc->sc_queue.tqh_first == hq)
+ return (1);
+
+ return (0);
}
void
-hpibfree(dq)
- register struct devqueue *dq;
+hpibfree(pdev, hq)
+ struct device *pdev;
+ struct hpibqueue *hq;
{
- register struct devqueue *hq;
+ struct hpibbus_softc *sc = (struct hpibbus_softc *)pdev;
+ int s;
- hq = &hpib_softc[dq->dq_ctlr].sc_sq;
- remque(dq);
- if ((dq = hq->dq_forw) != hq)
- (dq->dq_driver->d_start)(dq->dq_unit);
+ s = splhigh(); /* XXXthorpej */
+ TAILQ_REMOVE(&sc->sc_queue, hq, hq_list);
+ splx(s);
+
+ if ((hq = sc->sc_queue.tqh_first) != NULL)
+ (*hq->hq_start)(hq->hq_softc);
}
int
int unit, slave, sec, cnt;
void *addr;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- return ((hpib_softc[unit].sc_controller->hpib_send)(unit, slave,
- sec, addr, cnt));
+ return ((*sc->sc_ops->hpib_send)(sc, slave, sec, addr, cnt));
}
int
int unit, slave, sec, cnt;
void *addr;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- return ((hpib_softc[unit].sc_controller->hpib_recv)(unit, slave,
- sec, addr, cnt));
+ return ((*sc->sc_ops->hpib_recv)(sc, slave, sec, addr, cnt));
}
int
register int unit;
int slave;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- return ((hpib_softc[unit].sc_controller->hpib_ppoll)(unit) &
- (0x80 >> slave));
+ return ((*sc->sc_ops->hpib_ppoll)(sc) & (0x80 >> slave));
}
void
hpibppclear(unit)
int unit;
{
- hpib_softc[unit].sc_flags &= ~HPIBF_PPOLL;
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
+
+ sc->sc_flags &= ~HPIBF_PPOLL;
}
hpibawait(unit)
int unit;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- hs->sc_flags |= HPIBF_PPOLL;
- (hs->sc_controller->hpib_ppwatch)((void *)unit);
+ sc->sc_flags |= HPIBF_PPOLL;
+ (*sc->sc_ops->hpib_ppwatch)(sc);
}
int
register int unit;
int slave;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
register int timo = hpibtimeout;
- register int mask, (*ppoll) __P((int));
+ register int mask, (*ppoll) __P((struct hpibbus_softc *));
- ppoll = hpib_softc[unit].sc_controller->hpib_ppoll;
+ ppoll = sc->sc_ops->hpib_ppoll;
mask = 0x80 >> slave;
- while (((ppoll)(unit) & mask) == 0)
+ while (((*ppoll)(sc) & mask) == 0) {
if (--timo == 0) {
- printf("%s: swait timeout\n",
- hpib_softc[unit].sc_hc->hp_xname);
+ printf("%s: swait timeout\n", sc->sc_dev.dv_xname);
return(-1);
}
+ }
return(0);
}
hpibustart(unit)
int unit;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- if (hs->sc_type == HPIBA)
- hs->sc_dq.dq_ctlr = DMA0;
+ if (sc->sc_type == HPIBA)
+ sc->sc_dq->dq_chan = DMA0;
else
- hs->sc_dq.dq_ctlr = DMA0 | DMA1;
- if (dmareq(&hs->sc_dq))
+ sc->sc_dq->dq_chan = DMA0 | DMA1;
+ if (dmareq(sc->sc_dq))
return(1);
return(0);
}
void
-hpibstart(unit)
- int unit;
+hpibstart(arg)
+ void *arg;
{
- register struct devqueue *dq;
-
- dq = hpib_softc[unit].sc_sq.dq_forw;
- (dq->dq_driver->d_go)(dq->dq_unit);
+ struct hpibbus_softc *sc = arg;
+ register struct hpibqueue *hq;
+
+ hq = sc->sc_queue.tqh_first;
+ (*hq->hq_go)(hq->hq_softc);
}
void
-hpibgo(unit, slave, sec, addr, count, rw, timo)
- int unit, slave, sec, count, rw, timo;
- void *addr;
+hpibgo(unit, slave, sec, vbuf, count, rw, timo)
+ int unit, slave, sec;
+ void *vbuf;
+ int count, rw, timo;
{
+ struct hpibbus_softc *sc = hpibbus_cd.cd_devs[unit];
- (hpib_softc[unit].sc_controller->hpib_go)(unit, slave, sec,
- addr, count, rw, timo);
+ (*sc->sc_ops->hpib_go)(sc, slave, sec, vbuf, count, rw, timo);
}
void
-hpibdone(unit)
- register int unit;
+hpibdone(arg)
+ void *arg;
{
+ struct hpibbus_softc *sc = arg;
- (hpib_softc[unit].sc_controller->hpib_done)(unit);
+ (*sc->sc_ops->hpib_done)(sc);
}
int
hpibintr(arg)
void *arg;
{
- struct hpib_softc *hs = arg;
+ struct hpibbus_softc *sc = arg;
+
+ return ((sc->sc_ops->hpib_intr)(arg));
+}
+
+int
+hpibbus_alloc(sc, slave, punit)
+ struct hpibbus_softc *sc;
+ int slave, punit;
+{
+
+ if (slave >= HPIB_NSLAVES ||
+ punit >= HPIB_NPUNITS)
+ panic("hpibbus_alloc: device address out of range");
+
+ if (sc->sc_rmap[slave][punit] == 0) {
+ sc->sc_rmap[slave][punit] = 1;
+ return (0);
+ }
+ return (1);
+}
+
+void
+hpibbus_free(sc, slave, punit)
+ struct hpibbus_softc *sc;
+ int slave, punit;
+{
+
+ if (slave >= HPIB_NSLAVES ||
+ punit >= HPIB_NPUNITS)
+ panic("hpibbus_free: device address out of range");
+
+#ifdef DIAGNOSTIC
+ if (sc->sc_rmap[slave][punit] == 0)
+ panic("hpibbus_free: not allocated");
+#endif
- return ((hs->sc_controller->hpib_intr)(arg));
+ sc->sc_rmap[slave][punit] = 0;
}
-#endif /* NHPIB > 0 */
-/* $OpenBSD: hpibvar.h,v 1.4 1997/01/12 15:12:45 downsj Exp $ */
-/* $NetBSD: hpibvar.h,v 1.8 1996/02/14 02:44:31 thorpej Exp $ */
+/* $OpenBSD: hpibvar.h,v 1.5 1997/02/03 04:47:34 downsj Exp $ */
+/* $NetBSD: hpibvar.h,v 1.9 1997/01/30 09:06:52 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* @(#)hpibvar.h 8.1 (Berkeley) 6/10/93
*/
+#include <sys/queue.h>
+
#define HPIB_IPL(x) ((((x) >> 4) & 0x3) + 3)
#define HPIBA 32
#define C_UNT_P 0xdf /* with odd parity */
#define C_SCG 0x60 /* Secondary group commands */
-struct hpib_softc {
- struct hp_ctlr *sc_hc;
- struct hpib_controller *sc_controller;
- char *sc_descrip;
- int sc_flags;
- struct devqueue sc_dq;
- struct devqueue sc_sq;
- int sc_ba;
- int sc_type;
- char *sc_addr;
- int sc_count;
- int sc_curcnt;
-};
+struct hpibbus_softc;
/*
* Each of the HP-IB controller drivers fills in this structure, which
* is used by the indirect driver to call controller-specific functions.
*/
struct hpib_controller {
- void (*hpib_reset) __P((int));
- int (*hpib_send) __P((int, int, int, void *, int));
- int (*hpib_recv) __P((int, int, int, void *, int));
- int (*hpib_ppoll) __P((int));
+ void (*hpib_reset) __P((struct hpibbus_softc *));
+ int (*hpib_send) __P((struct hpibbus_softc *,
+ int, int, void *, int));
+ int (*hpib_recv) __P((struct hpibbus_softc *,
+ int, int, void *, int));
+ int (*hpib_ppoll) __P((struct hpibbus_softc *));
void (*hpib_ppwatch) __P((void *));
- void (*hpib_go) __P((int, int, int, void *, int, int, int));
- void (*hpib_done) __P((int));
+ void (*hpib_go) __P((struct hpibbus_softc *,
+ int, int, void *, int, int, int));
+ void (*hpib_done) __P((struct hpibbus_softc *));
int (*hpib_intr) __P((void *));
};
+/*
+ * Attach an HP-IB bus to an HP-IB controller.
+ */
+struct hpibdev_attach_args {
+ struct hpib_controller *ha_ops; /* controller ops vector */
+ int ha_type; /* XXX */
+ int ha_ba;
+ struct hpibbus_softc **ha_softcpp; /* XXX */
+};
+
+/*
+ * Attach an HP-IB device to an HP-IB bus.
+ */
+struct hpibbus_attach_args {
+ u_int16_t ha_id; /* device id */
+ int ha_slave; /* HP-IB bus slave */
+ int ha_punit; /* physical unit on slave */
+};
+
+/* Locator short-hand */
+#define hpibbuscf_slave cf_loc[0]
+#define hpibbuscf_punit cf_loc[1]
+
+#define HPIBBUS_SLAVE_UNK -1
+#define HPIBBUS_PUNIT_UNK -1
+
+#define HPIB_NSLAVES 8 /* number of slaves on a bus */
+#define HPIB_NPUNITS 2 /* number of punits per slave */
+
+/*
+ * An HP-IB job queue entry. Slave drivers have one of these used
+ * to queue requests with the controller.
+ */
+struct hpibqueue {
+ TAILQ_ENTRY(hpibqueue) hq_list; /* entry on queue */
+ void *hq_softc; /* slave's softc */
+ int hq_slave; /* slave on bus */
+
+ /*
+ * Callbacks used to start and stop the slave driver.
+ */
+ void (*hq_start) __P((void *));
+ void (*hq_go) __P((void *));
+ void (*hq_intr) __P((void *));
+};
+
+struct dmaqueue;
+
+/*
+ * Software state per HP-IB bus.
+ */
+struct hpibbus_softc {
+ struct device sc_dev; /* generic device glue */
+ struct hpib_controller *sc_ops; /* controller ops vector */
+ volatile int sc_flags; /* misc flags */
+ struct dmaqueue *sc_dq;
+ TAILQ_HEAD(, hpibqueue) sc_queue;
+ int sc_ba;
+ int sc_type;
+ char *sc_addr;
+ int sc_count;
+ int sc_curcnt;
+
+ /*
+ * HP-IB is an indirect bus; this cheezy resource map
+ * keeps track of slave/punit allocations.
+ */
+ char sc_rmap[HPIB_NSLAVES][HPIB_NPUNITS];
+};
+
/* sc_flags */
#define HPIBF_IO 0x1
#define HPIBF_DONE 0x2
#define HPIBF_DMA16 0x8000
#ifdef _KERNEL
-extern struct hpib_softc hpib_softc[];
extern caddr_t internalhpib;
extern int hpibtimeout;
extern int hpibdmathresh;
void hpibreset __P((int));
int hpibsend __P((int, int, int, void *, int));
int hpibrecv __P((int, int, int, void *, int));
+void hpibgo __P((int, int, int, void *, int, int, int));
+void hpibppclear __P((int));
+
+int hpibreq __P((struct device *, struct hpibqueue *));
+void hpibfree __P((struct device *, struct hpibqueue *));
+
+int hpibintr __P((void *));
+int hpibdevprint __P((void *, const char *));
#endif
-/* $OpenBSD: if_le.c,v 1.6 1997/01/12 15:12:46 downsj Exp $ */
-/* $NetBSD: if_le.c,v 1.36 1996/12/17 08:41:13 thorpej Exp $ */
+/* $OpenBSD: if_le.c,v 1.7 1997/02/03 04:47:35 downsj Exp $ */
+/* $NetBSD: if_le.c,v 1.37 1997/01/30 09:18:53 thorpej Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
#include <hp300/hp300/led.h>
#endif
-#ifndef NEWCONFIG
-#include <hp300/dev/device.h>
-#endif
-
#include <dev/ic/am7990reg.h>
#include <dev/ic/am7990var.h>
#include <hp300/dev/if_lereg.h>
#include <hp300/dev/if_levar.h>
-#ifdef NEWCONFIG
-int lematch __P((struct device *, struct cfdata *, void *));
+int lematch __P((struct device *, void *, void *));
void leattach __P((struct device *, struct device *, void *));
struct cfattach le_ca = {
sizeof(struct le_softc), lematch, leattach
};
-#else /* ! NEWCONFIG */
-#include "le.h"
-struct le_softc le_softc[NLE];
-
-int lematch __P((struct hp_device *));
-void leattach __P((struct hp_device *));
-
-struct driver ledriver = {
- lematch, leattach, "le",
-};
-#endif /* NEWCONFIG */
int leintr __P((void *));
return (val);
}
-#ifdef NEWCONFIG
int
lematch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
struct dio_attach_args *da = aux;
return (1);
return (0);
}
-#else /* ! NEWCONFIG */
-int
-lematch(hd)
- struct hp_device *hd;
-{
- register struct lereg0 *ler0;
- struct le_softc *lesc = &le_softc[hd->hp_unit];
-
- ler0 = (struct lereg0 *)(lestd[0] + (int)hd->hp_addr);
- if (ler0->ler0_id != LEID)
- return (0);
-
- hd->hp_ipl = LE_IPL(ler0->ler0_status);
- lesc->sc_hd = hd;
-
- return (1);
-}
-#endif /* NEWCONFIG */
/*
* Interface exists: make available by filling in network interface
* record. System will initialize the interface when it is ready
* to accept packets.
*/
-#ifdef NEWCONFIG
void
leattach(parent, self, aux)
struct device *parent, *self;
void *aux;
-#else /* ! NEWCONFIG */
-void
-leattach(hd)
- struct hp_device *hd;
-#endif /* NEWCONFIG */
{
register struct lereg0 *ler0;
-#ifdef NEWCONFIG
struct dio_attach_args *da = aux;
struct le_softc *lesc = (struct le_softc *)self;
caddr_t addr;
-#else
- struct le_softc *lesc = &le_softc[hd->hp_unit];
- caddr_t addr = hd->hp_addr;
-#endif /* NEWCONFIG */
struct am7990_softc *sc = &lesc->sc_am7990;
char *cp;
int i, ipl;
-#ifdef NEWCONFIG
addr = iomap(dio_scodetopa(da->da_scode), da->da_size);
if (addr == 0) {
printf("\n%s: can't map LANCE registers\n",
sc->sc_dev.dv_xname);
return;
}
-#endif /* NEWCONFIG */
ler0 = lesc->sc_r0 = (struct lereg0 *)(lestd[0] + (int)addr);
ler0->ler0_id = 0xFF;
DELAY(100);
-#ifdef NEWCONFIG
ipl = DIO_IPL(addr);
printf(" ipl %d", ipl);
-#else /* ! NEWCONFIG */
- /* XXXX kluge for now */
- hd->hp_dev.dv_class = DV_IFNET;
- bcopy(&hd->hp_dev, &sc->sc_dev, sizeof(struct device));
- ipl = hd->hp_ipl;
-#endif /* NEWCONFIG */
lesc->sc_r1 = (struct lereg1 *)(lestd[1] + (int)addr);
sc->sc_mem = (void *)(lestd[2] + (int)addr);
-/* $OpenBSD: if_levar.h,v 1.3 1997/01/12 15:12:47 downsj Exp $ */
-/* $NetBSD: if_levar.h,v 1.5 1996/12/17 08:41:14 thorpej Exp $ */
+/* $OpenBSD: if_levar.h,v 1.4 1997/02/03 04:47:36 downsj Exp $ */
+/* $NetBSD: if_levar.h,v 1.6 1997/01/30 09:18:54 thorpej Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
struct le_softc {
struct am7990_softc sc_am7990; /* glue to MI code */
-#ifndef NEWCONFIG
- struct hp_device *sc_hd;
-#endif
struct isr sc_isr;
struct lereg0 *sc_r0; /* DIO registers */
struct lereg1 *sc_r1; /* LANCE registers */
-/* $OpenBSD: intio.c,v 1.1 1997/01/12 15:12:47 downsj Exp $ */
-/* $NetBSD: intio.c,v 1.1 1996/12/17 08:41:15 thorpej Exp $ */
+/* $OpenBSD: intio.c,v 1.2 1997/02/03 04:47:36 downsj Exp $ */
+/* $NetBSD: intio.c,v 1.2 1997/01/30 09:18:54 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
#include <hp300/dev/intiovar.h>
-int intiomatch __P((struct device *, struct cfdata *, void *));
+int intiomatch __P((struct device *, void *, void *));
void intioattach __P((struct device *, struct device *, void *));
int intioprint __P((void *, const char *));
-int intiosearch __P((struct device *, struct cfdata *, void *));
+int intiosearch __P((struct device *, void *, void *));
struct cfattach intio_ca = {
sizeof(struct device), intiomatch, intioattach
int
intiomatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
static int intio_matched = 0;
}
int
-intiosearch(parent, cf, aux)
+intiosearch(parent, match, aux)
struct device *parent;
- struct cfdata *cf;
- void *aux;
+ void *match, *aux;
{
+ struct cfdata *cf = match;
struct intio_attach_args ia;
bzero(&ia, sizeof(ia));
-/* $OpenBSD: intiovar.h,v 1.1 1997/01/12 15:12:48 downsj Exp $ */
-/* $NetBSD: intiovar.h,v 1.1 1996/12/17 08:41:15 thorpej Exp $ */
+/* $OpenBSD: intiovar.h,v 1.2 1997/02/03 04:47:37 downsj Exp $ */
+/* $NetBSD: intiovar.h,v 1.2 1997/01/30 09:18:55 thorpej Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
-/* $OpenBSD: ite.c,v 1.6 1997/01/12 15:12:49 downsj Exp $ */
-/* $NetBSD: ite.c,v 1.34 1996/12/17 08:41:16 thorpej Exp $ */
+/* $OpenBSD: ite.c,v 1.7 1997/02/03 04:47:38 downsj Exp $ */
+/* $NetBSD: ite.c,v 1.35 1997/01/30 09:18:56 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
struct ite_data *kbd_ite = NULL;
-#ifdef NEWCONFIG
-int itematch __P((struct device *, struct cfdata *, void *));
+int itematch __P((struct device *, void *, void *));
void iteattach __P((struct device *, struct device *, void *));
struct cfattach ite_ca = {
struct cfdriver ite_cd = {
NULL, "ite", DV_TTY
};
-#else /* ! NEWCONFIG */
-#include "grf.h"
-struct ite_softc ite_softc[NGRF];
-#endif /* NEWCONFIG */
/*
* Terminal emulator state information, statically allocated
(*(sp)->ite_cursor)((ip), MOVE_CURSOR); \
}
-#ifdef NEWCONFIG
int
itematch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
return (1);
printf("\n");
}
-#else /* ! NEWCONFIG */
-/*
- * Dummy for pseudo-device config.
- */
-/*ARGSUSED*/
-void
-iteattach(n)
- int n;
-{
-}
-
-/*
- * Allocate storage for ite data structures.
- * XXX This is a kludge and will go away with new config.
- */
-void
-ite_attach_grf(unit, isconsole)
- int unit, isconsole;
-{
- struct ite_softc *ite = &ite_softc[unit];
- struct grf_softc *grf = &grf_softc[unit];
-
- /*
- * Check to see if our structure is pre-allocated.
- */
- if (isconsole) {
- ite->sc_data = &ite_cn;
-
- /*
- * We didn't know which unit this would be during
- * the console probe, so we have to fixup cn_dev here.
- */
- cn_tab->cn_dev = makedev(ite_major(), unit);
- } else {
- ite->sc_data =
- (struct ite_data *)malloc(sizeof(struct ite_data),
- M_DEVBUF, M_NOWAIT);
- if (ite->sc_data == NULL) {
- printf("ite_attach_grf: malloc for ite_data failed\n");
- return;
- }
- bzero(ite->sc_data, sizeof(struct ite_data));
- }
-
- /*
- * Cross-reference the ite and the grf.
- */
- ite->sc_grf = grf;
- grf->sc_ite = ite;
-
- printf("ite%d at grf%d: attached\n", unit, unit);
-}
-#endif /* NEWCONFIG */
/*
* Perform functions necessary to setup device as a terminal emulator.
int error;
int first = 0;
-#ifdef NEWCONFIG
if (unit >= ite_cd.cd_ndevs ||
(sc = ite_cd.cd_devs[unit]) == NULL)
return (ENXIO);
-#else
- if (unit >= NGRF)
- return (ENXIO);
- sc = &ite_softc[unit];
-#endif
ip = sc->sc_data;
if (ip->tty == NULL) {
int flag, mode;
struct proc *p;
{
-#ifdef NEWCONFIG
struct ite_softc *sc = ite_cd.cd_devs[ITEUNIT(dev)];
-#else
- struct ite_softc *sc = &ite_softc[ITEUNIT(dev)];
-#endif
struct ite_data *ip = sc->sc_data;
struct tty *tp = ip->tty;
struct uio *uio;
int flag;
{
-#ifdef NEWCONFIG
struct ite_softc *sc = ite_cd.cd_devs[ITEUNIT(dev)];
-#else
- struct ite_softc *sc = &ite_softc[ITEUNIT(dev)];
-#endif
struct tty *tp = sc->sc_data->tty;
return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
struct uio *uio;
int flag;
{
-#ifdef NEWCONFIG
struct ite_softc *sc = ite_cd.cd_devs[ITEUNIT(dev)];
-#else
- struct ite_softc *sc = &ite_softc[ITEUNIT(dev)];
-#endif
struct tty *tp = sc->sc_data->tty;
return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
itetty(dev)
dev_t dev;
{
-#ifdef NEWCONFIG
struct ite_softc *sc = ite_cd.cd_devs[ITEUNIT(dev)];
-#else
- struct ite_softc *sc = &ite_softc[ITEUNIT(dev)];
-#endif
return (sc->sc_data->tty);
}
int flag;
struct proc *p;
{
-#ifdef NEWCONFIG
struct ite_softc *sc = ite_cd.cd_devs[ITEUNIT(dev)];
-#else
- struct ite_softc *sc = &ite_softc[ITEUNIT(dev)];
-#endif
struct ite_data *ip = sc->sc_data;
struct tty *tp = ip->tty;
int error;
struct ite_softc *sc;
struct ite_data *ip;
-#ifdef NEWCONFIG
sc = ite_cd.cd_devs[ITEUNIT(tp->t_dev)];
-#else
- sc = &ite_softc[ITEUNIT(tp->t_dev)];
-#endif
ip = sc->sc_data;
/*
-/* $OpenBSD: itevar.h,v 1.5 1997/01/12 15:12:52 downsj Exp $ */
-/* $NetBSD: itevar.h,v 1.12 1997/01/09 01:07:59 scottr Exp $ */
+/* $OpenBSD: itevar.h,v 1.6 1997/02/03 04:47:39 downsj Exp $ */
+/* $NetBSD: itevar.h,v 1.13 1997/01/30 09:18:57 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
struct ite_data *sc_data; /* terminal state info */
struct grf_softc *sc_grf; /* pointer to framebuffer */
};
-#endif
+#endif /* _KERNEL */
/* Flags */
#define ITE_ALIVE 0x01 /* hardware exists */
-/* $OpenBSD: mt.c,v 1.4 1997/01/12 15:12:54 downsj Exp $ */
-/* $NetBSD: mt.c,v 1.6 1996/10/14 07:14:18 thorpej Exp $ */
+/* $OpenBSD: mt.c,v 1.5 1997/02/03 04:47:39 downsj Exp $ */
+/* $NetBSD: mt.c,v 1.7 1997/01/30 09:14:14 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1992, The University of Utah and
* the Computer Systems Laboratory at the University of Utah (CSL).
* All rights reserved.
* Modified for 4.4BSD by Mark Davies and Andrew Vignaux, Department of
* Computer Science, Victoria University of Wellington
*/
-#include "mt.h"
-#if NMT > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/tty.h>
#include <sys/kernel.h>
#include <sys/tprintf.h>
+#include <sys/device.h>
+#include <sys/conf.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/hpibvar.h>
-#include <hp300/dev/mtreg.h>
+#include <hp300/dev/mtreg.h>
struct mtinfo {
u_short hwid;
int nmtinfo = sizeof(mtinfo) / sizeof(mtinfo[0]);
struct mt_softc {
- struct hp_device *sc_hd;
- short sc_hpibno; /* logical HPIB this slave it attached to */
- short sc_slave; /* HPIB slave address (0-6) */
+ struct device sc_dev;
+ int sc_hpibno; /* logical HPIB this slave it attached to */
+ int sc_slave; /* HPIB slave address (0-6) */
short sc_flags; /* see below */
u_char sc_lastdsj; /* place for DSJ in mtreaddsj() */
u_char sc_lastecmd; /* place for End Command in mtreaddsj() */
struct mt_stat sc_stat;/* status bytes last read from device */
short sc_density; /* current density of tape (mtio.h format) */
short sc_type; /* tape drive model (hardware IDs) */
- struct devqueue sc_dq; /* HPIB device queue member */
+ struct hpibqueue sc_hq; /* HPIB device queue member */
tpr_t sc_ttyp;
-} mt_softc[NMT];
-struct buf mttab[NMT];
-struct buf mtbuf[NMT];
+ struct buf sc_tab; /* buf queue */
+ struct buf sc_bufstore; /* XXX buffer storage */
+};
#ifdef DEBUG
int mtdebug = 0;
#define B_CMD B_XXX /* command buf instead of data */
#define b_cmd b_blkno /* blkno holds cmd when B_CMD */
-int mtmatch(), mtintr();
-void mtattach(), mtustart(), mtstart(), mtgo(), mtstrategy();
-struct driver mtdriver = {
- mtmatch, mtattach, "mt", (int (*)()) mtstart, (int (*)()) mtgo, mtintr,
+int mtmatch __P((struct device *, void *, void *));
+void mtattach __P((struct device *, struct device *, void *));
+
+struct cfattach mt_ca = {
+ sizeof(struct mt_softc), mtmatch, mtattach
};
+struct cfdriver mt_cd = {
+ NULL, "mt", DV_TAPE
+};
+
+int mtident __P((struct mt_softc *, struct hpibbus_attach_args *));
+void mtustart __P((struct mt_softc *));
+int mtreaddsj __P((struct mt_softc *, int));
+int mtcommand __P((dev_t, int, int));
+void spl_mtintr __P((void *));
+void spl_mtstart __P((void *));
+
+void mtstart __P((void *));
+void mtgo __P((void *));
+void mtintr __P((void *));
+
+bdev_decl(mt);
+cdev_decl(mt);
+
int
-mtmatch(hd)
- register struct hp_device *hd;
+mtmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register int unit;
- register int hpibno = hd->hp_ctlr;
- register int slave = hd->hp_slave;
- register struct mt_softc *sc = &mt_softc[hd->hp_unit];
- register int id;
- register struct buf *bp;
-
- sc->sc_hd = hd;
+ struct hpibbus_attach_args *ha = aux;
- for (bp = mttab; bp < &mttab[NMT]; bp++)
- bp->b_actb = &bp->b_actf;
- unit = hpibid(hpibno, slave);
- for (id = 0; id < nmtinfo; id++)
- if (unit == mtinfo[id].hwid)
- return (1);
- return (0); /* not a known HP magtape */
+ return (mtident(NULL, ha));
}
void
-mtattach(hd)
- register struct hp_device *hd;
+mtattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- register int unit;
- register int hpibno = hd->hp_ctlr;
- register int slave = hd->hp_slave;
- register struct mt_softc *sc;
- register int id;
- register struct buf *bp;
+ struct mt_softc *sc = (struct mt_softc *)self;
+ struct hpibbus_attach_args *ha = aux;
+ int unit, hpibno, slave;
- /* XXX Ick. */
- unit = hpibid(hpibno, slave);
- for (id = 0; id < nmtinfo; id++)
- if (unit == mtinfo[id].hwid)
- break;
+ if (mtident(sc, ha) == 0) {
+ printf("\n%s: impossible!\n", sc->sc_dev.dv_xname);
+ return;
+ }
+
+ unit = self->dv_unit;
+ hpibno = parent->dv_unit;
+ slave = ha->ha_slave;
- unit = hd->hp_unit;
- sc = &mt_softc[unit];
- sc->sc_type = mtinfo[id].hwid;
- printf(": %s tape\n", mtinfo[id].desc);
+ sc->sc_tab.b_actb = &sc->sc_tab.b_actf;
sc->sc_hpibno = hpibno;
sc->sc_slave = slave;
sc->sc_flags = MTF_EXISTS;
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_ctlr = hpibno;
- sc->sc_dq.dq_unit = unit;
- sc->sc_dq.dq_slave = slave;
- sc->sc_dq.dq_driver = &mtdriver;
-
- /* XXX Set device class. */
- hd->hp_dev.dv_class = DV_TAPE;
+
+ /* Initialize hpib job queue entry. */
+ sc->sc_hq.hq_softc = sc;
+ sc->sc_hq.hq_slave = sc->sc_slave;
+ sc->sc_hq.hq_start = mtstart;
+ sc->sc_hq.hq_go = mtgo;
+ sc->sc_hq.hq_intr = mtintr;
+}
+
+int
+mtident(sc, ha)
+ struct mt_softc *sc;
+ struct hpibbus_attach_args *ha;
+{
+ int i;
+
+ for (i = 0; i < nmtinfo; i++) {
+ if (ha->ha_id == mtinfo[i].hwid) {
+ if (sc != NULL) {
+ sc->sc_type = mtinfo[i].hwid;
+ printf(": %s tape\n", mtinfo[i].desc);
+ }
+ return (1);
+ }
+ }
+ return (0);
}
/*
* performed, unless "ecmd" is zero. Returns DSJ value, -1 on failure
* and -2 on "temporary" failure.
*/
-mtreaddsj(unit, ecmd)
- register int unit;
+int
+mtreaddsj(sc, ecmd)
+ struct mt_softc *sc;
int ecmd;
{
- register struct mt_softc *sc = &mt_softc[unit];
int retval;
if (sc->sc_flags & MTF_STATTIMEO)
goto getstats;
retval = hpibrecv(sc->sc_hpibno,
- (sc->sc_flags & MTF_DSJTIMEO) ? -1 : sc->sc_slave,
- MTT_DSJ, &(sc->sc_lastdsj), 1);
+ (sc->sc_flags & MTF_DSJTIMEO) ? -1 : sc->sc_slave,
+ MTT_DSJ, &(sc->sc_lastdsj), 1);
sc->sc_flags &= ~MTF_DSJTIMEO;
if (retval != 1) {
- dlog(LOG_DEBUG, "mt%d can't hpibrecv DSJ\n", unit);
+ dlog(LOG_DEBUG, "%s can't hpibrecv DSJ",
+ sc->sc_dev.dv_xname);
if (sc->sc_recvtimeo == 0)
sc->sc_recvtimeo = hz;
if (--sc->sc_recvtimeo == 0)
}
sc->sc_recvtimeo = 0;
sc->sc_statindex = 0;
- dlog(LOG_DEBUG, "mt%d readdsj: 0x%x\n", unit, sc->sc_lastdsj);
+ dlog(LOG_DEBUG, "%s readdsj: 0x%x", sc->sc_dev.dv_xname,
+ sc->sc_lastdsj);
sc->sc_lastecmd = ecmd;
switch (sc->sc_lastdsj) {
case 0:
break;
default:
- log(LOG_ERR, "mt%d readdsj: DSJ 0x%x\n", unit, sc->sc_lastdsj);
+ log(LOG_ERR, "%s readdsj: DSJ 0x%x\n", sc->sc_dev.dv_xname,
+ sc->sc_lastdsj);
return (-1);
}
getstats:
retval = hpibrecv(sc->sc_hpibno,
- (sc->sc_flags & MTF_STATCONT) ? -1 : sc->sc_slave,
- MTT_STAT, ((char *)&(sc->sc_stat)) + sc->sc_statindex,
- sizeof(sc->sc_stat) - sc->sc_statindex);
+ (sc->sc_flags & MTF_STATCONT) ? -1 : sc->sc_slave,
+ MTT_STAT, ((char *)&(sc->sc_stat)) + sc->sc_statindex,
+ sizeof(sc->sc_stat) - sc->sc_statindex);
sc->sc_flags &= ~(MTF_STATTIMEO | MTF_STATCONT);
if (retval != sizeof(sc->sc_stat) - sc->sc_statindex) {
if (sc->sc_recvtimeo == 0)
sc->sc_flags |= MTF_STATTIMEO;
return (-2);
}
- log(LOG_ERR, "mt%d readdsj: can't read status\n", unit);
+ log(LOG_ERR, "%s readdsj: can't read status",
+ sc->sc_dev.dv_xname);
return (-1);
}
sc->sc_recvtimeo = 0;
sc->sc_statindex = 0;
- dlog(LOG_DEBUG, "mt%d readdsj: status is %x %x %x %x %x %x\n", unit,
- sc->sc_stat1, sc->sc_stat2, sc->sc_stat3,
- sc->sc_stat4, sc->sc_stat5, sc->sc_stat6);
+ dlog(LOG_DEBUG, "%s readdsj: status is %x %x %x %x %x %x",
+ sc->sc_dev.dv_xname,
+ sc->sc_stat1, sc->sc_stat2, sc->sc_stat3,
+ sc->sc_stat4, sc->sc_stat5, sc->sc_stat6);
if (sc->sc_lastecmd)
(void) hpibsend(sc->sc_hpibno, sc->sc_slave,
- MTL_ECMD, &(sc->sc_lastecmd), 1);
+ MTL_ECMD, &(sc->sc_lastecmd), 1);
return ((int) sc->sc_lastdsj);
}
+int
mtopen(dev, flag, mode, p)
dev_t dev;
int flag, mode;
struct proc *p;
{
register int unit = UNIT(dev);
- register struct mt_softc *sc = &mt_softc[unit];
+ struct mt_softc *sc;
register int req_den;
int error;
- dlog(LOG_DEBUG, "mt%d open: flags 0x%x\n", unit, sc->sc_flags);
- if (unit >= NMT || (sc->sc_flags & MTF_EXISTS) == 0)
+ if (unit >= mt_cd.cd_ndevs ||
+ (sc = mt_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & MTF_EXISTS) == 0)
return (ENXIO);
+
+ dlog(LOG_DEBUG, "%s open: flags 0x%x", sc->sc_dev.dv_xname,
+ sc->sc_flags);
if (sc->sc_flags & MTF_OPEN)
return (EBUSY);
sc->sc_flags |= MTF_OPEN;
goto errout;
if (!(sc->sc_flags & MTF_REW))
break;
- if (tsleep((caddr_t) &lbolt, PCATCH | (PZERO + 1), "mt", 0) != 0) {
+ if (tsleep((caddr_t) &lbolt, PCATCH | (PZERO + 1),
+ "mt", 0) != 0) {
error = EINTR;
goto errout;
}
goto errout;
}
if (!(sc->sc_stat1 & SR1_ONLINE)) {
- uprintf("%s: not online\n", sc->sc_hd->hp_xname);
+ uprintf("%s: not online\n", sc->sc_dev.dv_xname);
error = EIO;
goto errout;
}
if (!(sc->sc_stat1 & SR1_BOT)) {
if (sc->sc_density != req_den) {
uprintf("%s: can't change density mid-tape\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
error = EIO;
goto errout;
}
return (error);
}
-mtclose(dev, flag)
+int
+mtclose(dev, flag, fmt, p)
dev_t dev;
- int flag;
+ int flag, fmt;
+ struct proc *p;
{
- register struct mt_softc *sc = &mt_softc[UNIT(dev)];
+ struct mt_softc *sc = mt_cd.cd_devs[UNIT(dev)];
if (sc->sc_flags & MTF_WRT) {
(void) mtcommand(dev, MTWEOF, 2);
return (0);
}
+int
mtcommand(dev, cmd, cnt)
dev_t dev;
int cmd;
int cnt;
{
- register struct buf *bp = &mtbuf[UNIT(dev)];
+ struct mt_softc *sc = mt_cd.cd_devs[UNIT(dev)];
+ struct buf *bp = &sc->sc_bufstore;
int error = 0;
#if 1
register int s;
unit = UNIT(bp->b_dev);
- sc = &mt_softc[unit];
- dlog(LOG_DEBUG, "mt%d strategy\n", unit);
+ sc = mt_cd.cd_devs[unit];
+ dlog(LOG_DEBUG, "%s strategy", sc->sc_dev.dv_xname);
if ((bp->b_flags & (B_CMD | B_READ)) == 0) {
#define WRITE_BITS_IGNORED 8
#if 0
if (bp->b_bcount & ((1 << WRITE_BITS_IGNORED) - 1)) {
tprintf(sc->sc_ttyp,
"%s: write record must be multiple of %d\n",
- sc->sc_hd->hp_xname, 1 << WRITE_BITS_IGNORED);
+ sc->sc_dev.dv_xname, 1 << WRITE_BITS_IGNORED);
goto error;
}
#endif
if (bp->b_bcount > s) {
tprintf(sc->sc_ttyp,
"%s: write record (%d) too big: limit (%d)\n",
- sc->sc_hd->hp_xname, bp->b_bcount, s);
+ sc->sc_dev.dv_xname, bp->b_bcount, s);
error:
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
return;
}
}
- dp = &mttab[unit];
+ dp = &sc->sc_tab;
bp->b_actf = NULL;
s = splbio();
bp->b_actb = dp->b_actb;
dp->b_actb = &bp->b_actf;
if (dp->b_active == 0) {
dp->b_active = 1;
- mtustart(unit);
+ mtustart(sc);
}
splx(s);
}
void
-mtustart(unit)
- register int unit;
+mtustart(sc)
+ struct mt_softc *sc;
{
- dlog(LOG_DEBUG, "mt%d ustart\n", unit);
- if (hpibreq(&(mt_softc[unit].sc_dq)))
- mtstart(unit);
+ dlog(LOG_DEBUG, "%s ustart", sc->sc_dev.dv_xname);
+ if (hpibreq(sc->sc_dev.dv_parent, &sc->sc_hq))
+ mtstart(sc);
}
-#define hpibppclear(unit) \
- { hpib_softc[unit].sc_flags &= ~HPIBF_PPOLL; }
-
void
spl_mtintr(arg)
void *arg;
}
void
-spl_mtstart(unit)
- int unit;
+spl_mtstart(arg)
+ void *arg;
{
int s = splbio();
- mtstart(unit);
+ mtstart(arg);
(void) splx(s);
}
void
-mtstart(unit)
- register int unit;
+mtstart(arg)
+ void *arg;
{
- register struct mt_softc *sc = &mt_softc[unit];
+ struct mt_softc *sc = arg;
register struct buf *bp, *dp;
short cmdcount = 1;
u_char cmdbuf[2];
- dlog(LOG_DEBUG, "mt%d start\n", unit);
+ dlog(LOG_DEBUG, "%s start", sc->sc_dev.dv_xname);
sc->sc_flags &= ~MTF_WRT;
- bp = mttab[unit].b_actf;
+ bp = sc->sc_tab.b_actf;
if ((sc->sc_flags & MTF_ALIVE) == 0 &&
((bp->b_flags & B_CMD) == 0 || bp->b_cmd != MTRESET))
goto fatalerror;
if (sc->sc_flags & MTF_REW) {
if (!hpibpptest(sc->sc_hpibno, sc->sc_slave))
goto stillrew;
- switch (mtreaddsj(unit, MTE_DSJ_FORCE|MTE_COMPLETE|MTE_IDLE)) {
+ switch (mtreaddsj(sc, MTE_DSJ_FORCE|MTE_COMPLETE|MTE_IDLE)) {
case 0:
case 1:
stillrew:
* but not otherwise.
*/
if (sc->sc_flags & (MTF_DSJTIMEO | MTF_STATTIMEO)) {
- timeout(spl_mtstart, (void *)unit, hz >> 5);
+ timeout(spl_mtstart, sc, hz >> 5);
return;
}
case 2:
* NOP is supposed to set status bits.
* Force readdsj to do it.
*/
- switch (mtreaddsj(unit,
- MTE_DSJ_FORCE | MTE_COMPLETE | MTE_IDLE)) {
+ switch (mtreaddsj(sc,
+ MTE_DSJ_FORCE | MTE_COMPLETE | MTE_IDLE)) {
default:
goto done;
break;
case -2:
- timeout(spl_mtstart, (void *)unit, hz >> 5);
+ timeout(spl_mtstart, sc, hz >> 5);
return;
}
* 3) interrupt will read DSJ (and END COMPLETE-IDLE)
*/
if (hpibsend(sc->sc_hpibno, sc->sc_slave, -2, NULL, 0)){
- log(LOG_ERR, "mt%d can't reset\n", unit);
+ log(LOG_ERR, "%s can't reset",
+ sc->sc_dev.dv_xname);
goto fatalerror;
}
- timeout(spl_mtintr, (void *)sc, 4 * hz);
+ timeout(spl_mtintr, sc, 4 * hz);
hpibawait(sc->sc_hpibno, sc->sc_slave);
return;
if (dp = bp->b_actf)
dp->b_actb = bp->b_actb;
else
- mttab[unit].b_actb = bp->b_actb;
+ sc->sc_tab.b_actb = bp->b_actb;
*bp->b_actb = dp;
- hpibfree(&(sc->sc_dq));
+ hpibfree(sc->sc_dev.dv_parent, &sc->sc_hq);
if ((bp = dp) == NULL)
- mttab[unit].b_active = 0;
+ sc->sc_tab.b_active = 0;
else
- mtustart(unit);
+ mtustart(sc);
}
/*
* -- ajv@comp.vuw.ac.nz
*/
void
-mtgo(unit)
- register int unit;
+mtgo(arg)
+ void *arg;
{
- register struct mt_softc *sc = &mt_softc[unit];
- register struct buf *bp;
+ struct mt_softc *sc = arg;
+ struct buf *bp;
int rw;
- dlog(LOG_DEBUG, "mt%d go\n", unit);
- bp = mttab[unit].b_actf;
+ dlog(LOG_DEBUG, "%s go", sc->sc_dev.dv_xname);
+ bp = sc->sc_tab.b_actf;
rw = bp->b_flags & B_READ;
hpibgo(sc->sc_hpibno, sc->sc_slave, rw ? MTT_READ : MTL_WRITE,
- bp->b_un.b_addr, bp->b_bcount, rw, rw != 0);
+ bp->b_un.b_addr, bp->b_bcount, rw, rw != 0);
}
-int
+void
mtintr(arg)
void *arg;
{
- register struct mt_softc *sc = arg;
- register struct buf *bp, *dp;
- register int i;
- int unit = sc->sc_hd->hp_unit;
- u_char cmdbuf[4];
+ struct mt_softc *sc = arg;
+ struct buf *bp, *dp;
+ int i;
+ u_char cmdbuf[4];
- bp = mttab[unit].b_actf;
+ bp = sc->sc_tab.b_actf;
if (bp == NULL) {
- log(LOG_ERR, "mt%d intr: bp == NULL\n", unit);
+ log(LOG_ERR, "%s intr: bp == NULL", sc->sc_dev.dv_xname);
return;
}
- dlog(LOG_DEBUG, "mt%d intr\n", unit);
+
+ dlog(LOG_DEBUG, "%s intr", sc->sc_dev.dv_xname);
+
/*
* Some operation completed. Read status bytes and report errors.
* Clear EOF flags here `cause they're set once on specific conditions
cmdbuf[0] = MTE_STOP;
(void) hpibsend(sc->sc_hpibno, sc->sc_slave, MTL_ECMD,cmdbuf,1);
}
- switch (mtreaddsj(unit, 0)) {
+ switch (mtreaddsj(sc, 0)) {
case 0:
break;
* to the request for DSJ. It's probably just "busy" figuring
* it out and will know in a little bit...
*/
- timeout(spl_mtintr, (void *)sc, hz >> 5);
+ timeout(spl_mtintr, sc, hz >> 5);
return;
default:
- log(LOG_ERR, "mt%d intr: can't get drive stat\n", unit);
+ log(LOG_ERR, "%s intr: can't get drive stat",
+ sc->sc_dev.dv_xname);
goto error;
}
if (sc->sc_stat1 & (SR1_ERR | SR1_REJECT)) {
i = sc->sc_stat4 & SR4_ERCLMASK;
- log(LOG_ERR, "%s: %s error, retry %d, SR2/3 %x/%x, code %d\n",
- sc->sc_hd->hp_xname, i == SR4_DEVICE ? "device" :
+ log(LOG_ERR, "%s: %s error, retry %d, SR2/3 %x/%x, code %d",
+ sc->sc_dev.dv_xname, i == SR4_DEVICE ? "device" :
(i == SR4_PROTOCOL ? "protocol" :
(i == SR4_SELFTEST ? "selftest" : "unknown")),
sc->sc_stat4 & SR4_RETRYMASK, sc->sc_stat2,
sc->sc_stat3, sc->sc_stat5);
if ((bp->b_flags & B_CMD) && bp->b_cmd == MTRESET)
- untimeout(spl_mtintr, (void *)sc);
+ untimeout(spl_mtintr, sc);
if (sc->sc_stat3 & SR3_POWERUP)
sc->sc_flags &= MTF_OPEN | MTF_EXISTS;
goto error;
*/
if (sc->sc_stat1 & SR1_SOFTERR) {
log(LOG_WARNING, "%s: soft error, retry %d\n",
- sc->sc_hd->hp_xname, sc->sc_stat4 & SR4_RETRYMASK);
+ sc->sc_dev.dv_xname, sc->sc_stat4 & SR4_RETRYMASK);
sc->sc_stat1 &= ~SR1_SOFTERR;
}
/*
if (sc->sc_flags & MTF_IO) {
sc->sc_flags &= ~MTF_IO;
if (hpibustart(sc->sc_hpibno))
- mtgo(unit);
+ mtgo(sc);
return;
}
/*
sc->sc_flags |= MTF_HITBOF;
}
if (bp->b_cmd == MTRESET) {
- untimeout(spl_mtintr, (void *)sc);
+ untimeout(spl_mtintr, sc);
sc->sc_flags |= MTF_ALIVE;
}
} else {
if (i == 0)
sc->sc_flags |= MTF_HITEOF;
bp->b_resid = bp->b_bcount - i;
- dlog(LOG_DEBUG, "mt%d intr: bcount %d, resid %d\n",
- unit, bp->b_bcount, bp->b_resid);
+ dlog(LOG_DEBUG, "%s intr: bcount %d, resid %d",
+ sc->sc_dev.dv_xname, bp->b_bcount, bp->b_resid);
} else {
tprintf(sc->sc_ttyp,
"%s: record (%d) larger than wanted (%d)\n",
- sc->sc_hd->hp_xname, i, bp->b_bcount);
+ sc->sc_dev.dv_xname, i, bp->b_bcount);
error:
sc->sc_flags &= ~MTF_IO;
bp->b_error = EIO;
if (dp = bp->b_actf)
dp->b_actb = bp->b_actb;
else
- mttab[unit].b_actb = bp->b_actb;
+ sc->sc_tab.b_actb = bp->b_actb;
*bp->b_actb = dp;
- hpibfree(&(sc->sc_dq));
+ hpibfree(sc->sc_dev.dv_parent, &sc->sc_hq);
#if 0
- if (bp /*mttab[unit].b_actf*/ == NULL)
+ if (bp /*sc->sc_tab.b_actf*/ == NULL)
#else
- if (mttab[unit].b_actf == NULL)
+ if (sc->sc_tab.b_actf == NULL)
#endif
- mttab[unit].b_active = 0;
+ sc->sc_tab.b_active = 0;
else
- mtustart(unit);
+ mtustart(sc);
}
-mtread(dev, uio)
+int
+mtread(dev, uio, flags)
dev_t dev;
struct uio *uio;
+ int flags;
{
- return(physio(mtstrategy, &mtbuf[UNIT(dev)], dev, B_READ, minphys, uio));
+ struct mt_softc *sc = mt_cd.cd_devs[UNIT(dev)];
+
+ return(physio(mtstrategy, &sc->sc_bufstore,
+ dev, B_READ, minphys, uio));
}
-mtwrite(dev, uio)
+int
+mtwrite(dev, uio, flags)
dev_t dev;
struct uio *uio;
+ int flags;
{
- return(physio(mtstrategy, &mtbuf[UNIT(dev)], dev, B_WRITE, minphys, uio));
+ struct mt_softc *sc = mt_cd.cd_devs[UNIT(dev)];
+
+ return(physio(mtstrategy, &sc->sc_bufstore,
+ dev, B_WRITE, minphys, uio));
}
-mtioctl(dev, cmd, data, flag)
+int
+mtioctl(dev, cmd, data, flag, p)
dev_t dev;
u_long cmd;
caddr_t data;
int flag;
+ struct proc *p;
{
register struct mtop *op;
int cnt;
}
/*ARGSUSED*/
-mtdump(dev)
+int
+mtdump(dev, blkno, va, size)
dev_t dev;
+ daddr_t blkno;
+ caddr_t va;
+ size_t size;
{
- return(ENXIO);
+ return (ENODEV);
}
-
-#endif /* NMT > 0 */
-/* $OpenBSD: nhpib.c,v 1.5 1997/01/12 15:12:56 downsj Exp $ */
-/* $NetBSD: nhpib.c,v 1.13 1996/10/13 03:14:19 christos Exp $ */
+/* $OpenBSD: nhpib.c,v 1.6 1997/02/03 04:47:40 downsj Exp $ */
+/* $NetBSD: nhpib.c,v 1.14 1997/01/30 09:06:54 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
/*
* Internal/98624 HPIB driver
*/
-#include "hpib.h"
-#if NHPIB > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/buf.h>
+#include <sys/device.h>
+
+#include <machine/autoconf.h>
+
+#include <hp300/hp300/isr.h>
+
+#include <hp300/dev/dioreg.h>
+#include <hp300/dev/diovar.h>
+#include <hp300/dev/diodevs.h>
+
+#include <hp300/dev/dmavar.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/nhpibreg.h>
#include <hp300/dev/hpibvar.h>
-#include <hp300/dev/dmavar.h>
/*
* ODD parity table for listen and talk addresses and secondary commands.
0370,0171,0172,0373,0174,0375,0376,0177
};
-void nhpibreset __P((int));
-int nhpibsend __P((int, int, int, void *, int));
-int nhpibrecv __P((int, int, int, void *, int));
-int nhpibppoll __P((int));
+void nhpibifc __P((struct nhpibdevice *));
+void nhpibreadtimo __P((void *));
+int nhpibwait __P((struct nhpibdevice *, int));
+
+void nhpibreset __P((struct hpibbus_softc *));
+int nhpibsend __P((struct hpibbus_softc *, int, int, void *, int));
+int nhpibrecv __P((struct hpibbus_softc *, int, int, void *, int));
+int nhpibppoll __P((struct hpibbus_softc *));
void nhpibppwatch __P((void *));
-void nhpibgo __P((int, int, int, void *, int, int, int));
-void nhpibdone __P((int));
+void nhpibgo __P((struct hpibbus_softc *, int, int, void *, int, int, int));
+void nhpibdone __P((struct hpibbus_softc *));
int nhpibintr __P((void *));
/*
nhpibintr
};
+struct nhpib_softc {
+ struct device sc_dev; /* generic device glue */
+ struct nhpibdevice *sc_regs; /* device registers */
+ struct hpibbus_softc *sc_hpibbus; /* XXX */
+};
+
+int nhpibmatch __P((struct device *, void *, void *));
+void nhpibattach __P((struct device *, struct device *, void *));
+
+struct cfattach nhpib_ca = {
+ sizeof(struct nhpib_softc), nhpibmatch, nhpibattach
+};
+
+struct cfdriver nhpib_cd = {
+ NULL, "nhpib", DV_DULL
+};
+
int
-nhpibtype(hc)
- register struct hp_ctlr *hc;
+nhpibmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
- register struct nhpibdevice *hd = (struct nhpibdevice *)hc->hp_addr;
+ struct dio_attach_args *da = aux;
- if (hc->hp_addr == internalhpib) {
- hs->sc_type = HPIBA;
- hc->hp_ipl = HPIBA_IPL;
+ /*
+ * Internal HP-IB doesn't always return a device ID,
+ * so we rely on the sysflags.
+ */
+ if (da->da_scode == 7 && internalhpib)
return (1);
- } else if (hd->hpib_cid == HPIBB) {
- hs->sc_type = HPIBB;
- hc->hp_ipl = HPIB_IPL(hd->hpib_ids);
+
+ if (da->da_id == DIO_DEVICE_ID_NHPIB)
return (1);
- }
- return(0);
+ return (0);
}
void
-nhpibattach(hc)
- register struct hp_ctlr *hc;
+nhpibattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
- register struct nhpibdevice *hd = (struct nhpibdevice *)hc->hp_addr;
-
- switch (hs->sc_type) {
- case HPIBA:
- hs->sc_ba = HPIBA_BA;
- hs->sc_descrip = "Internal HP-IB";
- break;
-
- case HPIBB:
- hs->sc_ba = hd->hpib_csa & CSA_BA;
- hs->sc_descrip = "98624 HP-IB";
- break;
-
- default:
- panic("nhpibattach: unknown type 0x%x", hs->sc_type);
- /* NOTREACHED */
+ struct nhpib_softc *sc = (struct nhpib_softc *)self;
+ struct dio_attach_args *da = aux;
+ struct hpibdev_attach_args ha;
+ const char *desc;
+ int ipl, type = HPIBA;
+
+ sc->sc_regs = (struct nhpibdevice *)iomap(dio_scodetopa(da->da_scode),
+ da->da_size);
+ if (sc->sc_regs == NULL) {
+ printf("\n%s: can't map registers\n", self->dv_xname);
+ return;
}
- hs->sc_controller = &nhpib_controller;
+ ipl = DIO_IPL(sc->sc_regs);
+
+ if (da->da_scode == 7 && internalhpib)
+ desc = DIO_DEVICE_DESC_IHPIB;
+ else if (da->da_id == DIO_DEVICE_ID_NHPIB) {
+ type = HPIBB;
+ desc = DIO_DEVICE_DESC_NHPIB;
+ } else
+ desc = "unknown HP-IB!";
+
+ printf(" ipl %d: %s\n", ipl, desc);
+
+ /* Establish the interrupt handler. */
+ (void) isrlink(nhpibintr, sc, ipl, ISRPRI_BIO);
+ dmacomputeipl();
+
+ ha.ha_ops = &nhpib_controller;
+ ha.ha_type = type; /* XXX */
+ ha.ha_ba = (type == HPIBA) ? HPIBA_BA :
+ (sc->sc_regs->hpib_csa & CSA_BA);
+ ha.ha_softcpp = &sc->sc_hpibbus; /* XXX */
+ (void)config_found(self, &ha, hpibdevprint);
}
void
-nhpibreset(unit)
- int unit;
+nhpibreset(hs)
+ struct hpibbus_softc *hs;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct nhpibdevice *hd;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_acr = AUX_SSWRST;
hd->hpib_ar = hs->sc_ba;
hd->hpib_lim = LIS_ERR;
DELAY(100000);
}
+void
nhpibifc(hd)
register struct nhpibdevice *hd;
{
}
int
-nhpibsend(unit, slave, sec, ptr, origcnt)
- int unit, slave, sec, origcnt;
+nhpibsend(hs, slave, sec, ptr, origcnt)
+ struct hpibbus_softc *hs;
+ int slave, sec, origcnt;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct nhpibdevice *hd;
- register int cnt = origcnt;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
+ int cnt = origcnt;
char *addr = ptr;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_acr = AUX_TCA;
hd->hpib_data = C_UNL_P;
if (nhpibwait(hd, MIS_BO))
}
int
-nhpibrecv(unit, slave, sec, ptr, origcnt)
- int unit, slave, sec, origcnt;
+nhpibrecv(hs, slave, sec, ptr, origcnt)
+ struct hpibbus_softc *hs;
+ int slave, sec, origcnt;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct nhpibdevice *hd;
- register int cnt = origcnt;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
+ int cnt = origcnt;
char *addr = ptr;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
/*
* Slave < 0 implies continuation of a previous receive
* that probably timed out.
}
void
-nhpibgo(unit, slave, sec, ptr, count, rw, timo)
- int unit, slave, sec, count, rw, timo;
+nhpibgo(hs, slave, sec, ptr, count, rw, timo)
+ struct hpibbus_softc *hs;
+ int slave, sec, count, rw, timo;
void *ptr;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct nhpibdevice *hd;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
char *addr = ptr;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
hs->sc_flags |= HPIBF_IO;
if (timo)
hs->sc_flags |= HPIBF_TIMO;
hs->sc_addr = addr;
if (hs->sc_flags & HPIBF_READ) {
hs->sc_curcnt = count;
- dmago(hs->sc_dq.dq_ctlr, addr, count, DMAGO_BYTE|DMAGO_READ);
- nhpibrecv(unit, slave, sec, 0, 0);
+ dmago(hs->sc_dq->dq_chan, addr, count, DMAGO_BYTE|DMAGO_READ);
+ nhpibrecv(hs, slave, sec, 0, 0);
hd->hpib_mim = MIS_END;
} else {
hd->hpib_mim = 0;
if (count < hpibdmathresh) {
hs->sc_curcnt = count;
- nhpibsend(unit, slave, sec, addr, count);
- nhpibdone(unit);
+ nhpibsend(hs, slave, sec, addr, count);
+ nhpibdone(hs);
return;
}
hs->sc_curcnt = --count;
- dmago(hs->sc_dq.dq_ctlr, addr, count, DMAGO_BYTE);
- nhpibsend(unit, slave, sec, 0, 0);
+ dmago(hs->sc_dq->dq_chan, addr, count, DMAGO_BYTE);
+ nhpibsend(hs, slave, sec, 0, 0);
}
- hd->hpib_ie = IDS_IE | IDS_DMA(hs->sc_dq.dq_ctlr);
+ hd->hpib_ie = IDS_IE | IDS_DMA(hs->sc_dq->dq_chan);
}
/*
nhpibreadtimo(arg)
void *arg;
{
- int unit;
- register struct hpib_softc *hs;
+ struct hpibbus_softc *hs = arg;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
int s = splbio();
- unit = (int)arg;
- hs = &hpib_softc[unit];
if (hs->sc_flags & HPIBF_IO) {
- register struct nhpibdevice *hd;
- register struct devqueue *dq;
+ register struct nhpibdevice *hd = sc->sc_regs;
+ register struct hpibqueue *hq;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
hd->hpib_mim = 0;
hd->hpib_acr = AUX_TCA;
hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
- dmafree(&hs->sc_dq);
- dq = hs->sc_sq.dq_forw;
- (dq->dq_driver->d_intr)(dq->dq_softc);
+ dmafree(hs->sc_dq);
+
+ hq = hs->sc_queue.tqh_first;
+ (hq->hq_intr)(hq->hq_softc);
}
- (void) splx(s);
+ splx(s);
}
void
-nhpibdone(unit)
- register int unit;
+nhpibdone(hs)
+ struct hpibbus_softc *hs;
{
- register struct hpib_softc *hs = &hpib_softc[unit];
- register struct nhpibdevice *hd;
- register int cnt;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
+ int cnt;
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
cnt = hs->sc_curcnt;
hs->sc_addr += cnt;
hs->sc_count -= cnt;
if (hs->sc_flags & HPIBF_READ) {
if ((hs->sc_flags & HPIBF_TIMO) &&
(hd->hpib_ids & IDS_IR) == 0)
- timeout(nhpibreadtimo, (void *)unit, hz >> 2);
+ timeout(nhpibreadtimo, hs, hz >> 2);
} else {
if (hs->sc_count == 1) {
(void) nhpibwait(hd, MIS_BO);
nhpibintr(arg)
void *arg;
{
- register struct hpib_softc *hs = arg;
- register struct nhpibdevice *hd;
- register struct devqueue *dq;
- register int stat0;
- int stat1, unit = hs->sc_hc->hp_unit;
+ struct nhpib_softc *sc = arg;
+ struct hpibbus_softc *hs = sc->sc_hpibbus;
+ struct nhpibdevice *hd = sc->sc_regs;
+ struct hpibqueue *hq;
+ int stat0;
+ int stat1;
#ifdef lint
if (stat1 = unit) return(1);
#endif
- hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
if ((hd->hpib_ids & IDS_IR) == 0)
return(0);
stat0 = hd->hpib_mis;
stat1 = hd->hpib_lis;
- dq = hs->sc_sq.dq_forw;
+
+ hq = hs->sc_queue.tqh_first;
+
if (hs->sc_flags & HPIBF_IO) {
hd->hpib_mim = 0;
if ((hs->sc_flags & HPIBF_DONE) == 0) {
hs->sc_flags &= ~HPIBF_TIMO;
- dmastop(hs->sc_dq.dq_ctlr);
+ dmastop(hs->sc_dq->dq_chan);
} else if (hs->sc_flags & HPIBF_TIMO)
- untimeout(nhpibreadtimo, (void *)unit);
+ untimeout(nhpibreadtimo, hs);
hd->hpib_acr = AUX_TCA;
hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
- dmafree(&hs->sc_dq);
- (dq->dq_driver->d_intr)(dq->dq_softc);
+
+ dmafree(hs->sc_dq);
+ (hq->hq_intr)(hq->hq_softc);
} else if (hs->sc_flags & HPIBF_PPOLL) {
hd->hpib_mim = 0;
- stat0 = nhpibppoll(unit);
- if (stat0 & (0x80 >> dq->dq_slave)) {
+ stat0 = nhpibppoll(hs);
+ if (stat0 & (0x80 >> hq->hq_slave)) {
hs->sc_flags &= ~HPIBF_PPOLL;
- (dq->dq_driver->d_intr)(dq->dq_softc);
+ (hq->hq_intr)(hq->hq_softc);
}
#ifdef DEBUG
else
printf("%s: PPOLL intr bad status %x\n",
- hs->sc_hc->hp_xname, stat0);
+ hs->sc_dev.dv_xname, stat0);
#endif
}
return(1);
}
int
-nhpibppoll(unit)
- int unit;
+nhpibppoll(hs)
+ struct hpibbus_softc *hs;
{
- register struct nhpibdevice *hd;
- register int ppoll;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
+ struct nhpibdevice *hd = sc->sc_regs;
+ int ppoll;
- hd = (struct nhpibdevice *)hpib_softc[unit].sc_hc->hp_addr;
hd->hpib_acr = AUX_SPP;
DELAY(25);
ppoll = hd->hpib_cpt;
nhpibppwatch(arg)
void *arg;
{
- register struct hpib_softc *hs;
- register int unit;
+ struct hpibbus_softc *hs = arg;
+ struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
extern int cold;
- unit = (int)arg;
- hs = &hpib_softc[unit];
if ((hs->sc_flags & HPIBF_PPOLL) == 0)
return;
again:
- if (nhpibppoll(unit) & (0x80 >> hs->sc_sq.dq_forw->dq_slave))
- ((struct nhpibdevice *)hs->sc_hc->hp_addr)->hpib_mim = MIS_BO;
+ if (nhpibppoll(hs) & (0x80 >> hs->sc_queue.tqh_first->hq_slave))
+ sc->sc_regs->hpib_mim = MIS_BO;
else if (cold)
/* timeouts not working yet */
goto again;
else
- timeout(nhpibppwatch, (void *)unit, 1);
+ timeout(nhpibppwatch, hs, 1);
}
-#endif /* NHPIB > 0 */
-/* $OpenBSD: ppi.c,v 1.4 1997/01/12 15:12:57 downsj Exp $ */
-/* $NetBSD: ppi.c,v 1.10 1996/10/13 03:14:20 christos Exp $ */
+/* $OpenBSD: ppi.c,v 1.5 1997/02/03 04:47:41 downsj Exp $ */
+/* $NetBSD: ppi.c,v 1.11 1997/01/30 09:14:16 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Printer/Plotter HPIB interface
*/
-#include "ppi.h"
-#if NPPI > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/uio.h>
#include <sys/malloc.h>
+#include <sys/device.h>
+#include <sys/conf.h>
-#include <hp300/dev/device.h>
-#include <hp300/dev/ppiioctl.h>
+#include <hp300/dev/hpibvar.h>
-int ppimatch(), ppistart();
-void ppiattach(), ppitimo();
-struct driver ppidriver = {
- ppimatch, ppiattach, "ppi", ppistart,
-};
+#include <hp300/dev/ppiioctl.h>
struct ppi_softc {
+ struct device sc_dev;
int sc_flags;
- struct devqueue sc_dq;
- struct hp_device *sc_hd;
+ struct hpibqueue sc_hq; /* HP-IB job queue entry */
struct ppiparam sc_param;
#define sc_burst sc_param.burst
#define sc_timo sc_param.timo
#define sc_delay sc_param.delay
int sc_sec;
-} ppi_softc[NPPI];
+ int sc_slave; /* HP-IB slave address */
+};
/* sc_flags values */
#define PPIF_ALIVE 0x01
#define PPIF_TIMO 0x08
#define PPIF_DELAY 0x10
+int ppimatch __P((struct device *, void *, void *));
+void ppiattach __P((struct device *, struct device *, void *));
+
+struct cfattach ppi_ca = {
+ sizeof(struct ppi_softc), ppimatch, ppiattach
+};
+
+struct cfdriver ppi_cd = {
+ NULL, "ppi", DV_DULL
+};
+
+void ppistart __P((void *));
+void ppinoop __P((void *));
+
+void ppitimo __P((void *));
+int ppirw __P((dev_t, struct uio *));
+int ppihztoms __P((int));
+int ppimstohz __P((int));
+
+bdev_decl(ppi);
+cdev_decl(ppi);
+
#define UNIT(x) minor(x)
#ifdef DEBUG
#endif
int
-ppimatch(hd)
- register struct hp_device *hd;
+ppimatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct ppi_softc *sc = &ppi_softc[hd->hp_unit];
+ struct cfdata *cf = match;
+ struct hpibbus_attach_args *ha = aux;
+
+ /*
+ * The printer/plotter doesn't return an ID tag.
+ * The check below prevents us from matching a CS80
+ * device by mistake.
+ */
+ if (ha->ha_id & 0x200)
+ return (0);
-#ifdef DEBUG
- if ((ppidebug & PDB_NOCHECK) == 0)
-#endif
/*
- * XXX: the printer/plotter doesn't seem to really return
- * an ID but this will at least prevent us from mistaking
- * a cs80 disk or tape for a ppi device.
+ * To prevent matching all unused slots on the bus, we
+ * don't allow wildcarded locators.
*/
- if (hpibid(hd->hp_ctlr, hd->hp_slave) & 0x200)
+ if (cf->hpibbuscf_slave == HPIBBUS_SLAVE_UNK ||
+ cf->hpibbuscf_punit == HPIBBUS_PUNIT_UNK)
return (0);
- sc->sc_hd = hd;
return (1);
}
void
-ppiattach(hd)
- register struct hp_device *hd;
+ppiattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- struct ppi_softc *sc = &ppi_softc[hd->hp_unit];
+ struct ppi_softc *sc = (struct ppi_softc *)self;
+ struct hpibbus_attach_args *ha = aux;
printf("\n");
+ sc->sc_slave = ha->ha_slave;
+
+ /* Initialize the hpib queue entry. */
+ sc->sc_hq.hq_softc = sc;
+ sc->sc_hq.hq_slave = sc->sc_slave;
+ sc->sc_hq.hq_start = ppistart;
+ sc->sc_hq.hq_go = ppinoop;
+ sc->sc_hq.hq_intr = ppinoop;
+
sc->sc_flags = PPIF_ALIVE;
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_ctlr = hd->hp_ctlr;
- sc->sc_dq.dq_unit = hd->hp_unit;
- sc->sc_dq.dq_slave = hd->hp_slave;
- sc->sc_dq.dq_driver = &ppidriver;
}
-ppiopen(dev, flags)
+void
+ppinoop(arg)
+ void *arg;
+{
+ /* Noop! */
+}
+
+int
+ppiopen(dev, flags, fmt, p)
dev_t dev;
+ int flags, fmt;
+ struct proc *p;
{
register int unit = UNIT(dev);
- register struct ppi_softc *sc = &ppi_softc[unit];
+ struct ppi_softc *sc;
+
+ if (unit >= ppi_cd.cd_ndevs ||
+ (sc = ppi_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & PPIF_ALIVE) == 0)
+ return (ENXIO);
- if (unit >= NPPI || (sc->sc_flags & PPIF_ALIVE) == 0)
- return(ENXIO);
#ifdef DEBUG
if (ppidebug & PDB_FOLLOW)
printf("ppiopen(%x, %x): flags %x\n",
dev, flags, sc->sc_flags);
#endif
if (sc->sc_flags & PPIF_OPEN)
- return(EBUSY);
+ return (EBUSY);
sc->sc_flags |= PPIF_OPEN;
sc->sc_burst = PPI_BURST;
sc->sc_timo = ppimstohz(PPI_TIMO);
return(0);
}
-ppiclose(dev, flags)
+int
+ppiclose(dev, flags, fmt, p)
dev_t dev;
+ int flags, fmt;
+ struct proc *p;
{
register int unit = UNIT(dev);
- register struct ppi_softc *sc = &ppi_softc[unit];
+ struct ppi_softc *sc = ppi_cd.cd_devs[unit];
#ifdef DEBUG
if (ppidebug & PDB_FOLLOW)
return(0);
}
-ppistart(unit)
- int unit;
+void
+ppistart(arg)
+ void *arg;
{
+ struct ppi_softc *sc = arg;
+
#ifdef DEBUG
if (ppidebug & PDB_FOLLOW)
printf("ppistart(%x)\n", unit);
#endif
- ppi_softc[unit].sc_flags &= ~PPIF_DELAY;
- wakeup(&ppi_softc[unit]);
- return (0);
+ sc->sc_flags &= ~PPIF_DELAY;
+ wakeup(sc);
}
void
-ppitimo(unit)
- int unit;
+ppitimo(arg)
+ void *arg;
{
+ struct ppi_softc *sc = arg;
+
#ifdef DEBUG
if (ppidebug & PDB_FOLLOW)
- printf("ppitimo(%x)\n", unit);
+ printf("ppitimo(%x)\n", sc->sc_dev.dv_unit);
#endif
- ppi_softc[unit].sc_flags &= ~(PPIF_UIO|PPIF_TIMO);
- wakeup(&ppi_softc[unit]);
+ sc->sc_flags &= ~(PPIF_UIO|PPIF_TIMO);
+ wakeup(sc);
}
-ppiread(dev, uio)
+int
+ppiread(dev, uio, flags)
dev_t dev;
struct uio *uio;
+ int flags;
{
#ifdef DEBUG
return (ppirw(dev, uio));
}
-ppiwrite(dev, uio)
+int
+ppiwrite(dev, uio, flags)
dev_t dev;
struct uio *uio;
+ int flags;
{
#ifdef DEBUG
return (ppirw(dev, uio));
}
+int
ppirw(dev, uio)
dev_t dev;
register struct uio *uio;
{
int unit = UNIT(dev);
- register struct ppi_softc *sc = &ppi_softc[unit];
+ struct ppi_softc *sc = ppi_cd.cd_devs[unit];
register int s, len, cnt;
register char *cp;
int error = 0, gotdata = 0;
- int buflen;
+ int buflen, ctlr, slave;
char *buf;
if (uio->uio_resid == 0)
return(0);
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_slave;
+
#ifdef DEBUG
if (ppidebug & (PDB_FOLLOW|PDB_IO))
printf("ppirw(%x, %x, %c): burst %d, timo %d, resid %x\n",
sc->sc_flags |= PPIF_UIO;
if (sc->sc_timo > 0) {
sc->sc_flags |= PPIF_TIMO;
- timeout(ppitimo, (void *)unit, sc->sc_timo);
+ timeout(ppitimo, sc, sc->sc_timo);
}
while (uio->uio_resid > 0) {
len = min(buflen, uio->uio_resid);
}
again:
s = splbio();
- if ((sc->sc_flags & PPIF_UIO) && hpibreq(&sc->sc_dq) == 0)
+ if ((sc->sc_flags & PPIF_UIO) &&
+ hpibreq(sc->sc_dev.dv_parent, &sc->sc_hq) == 0)
sleep(sc, PRIBIO+1);
/*
* Check if we timed out during sleep or uiomove
sc->sc_flags);
#endif
if (sc->sc_flags & PPIF_TIMO) {
- untimeout(ppitimo, (void *)unit);
+ untimeout(ppitimo, sc);
sc->sc_flags &= ~PPIF_TIMO;
}
splx(s);
* Perform the operation
*/
if (uio->uio_rw == UIO_WRITE)
- cnt = hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- sc->sc_sec, cp, len);
+ cnt = hpibsend(ctlr, slave, sc->sc_sec, cp, len);
else
- cnt = hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- sc->sc_sec, cp, len);
+ cnt = hpibrecv(ctlr, slave, sc->sc_sec, cp, len);
s = splbio();
- hpibfree(&sc->sc_dq);
+ hpibfree(sc->sc_dev.dv_parent, &sc->sc_hq);
#ifdef DEBUG
if (ppidebug & PDB_IO)
printf("ppirw: %s(%d, %d, %x, %x, %d) -> %d\n",
uio->uio_rw == UIO_READ ? "recv" : "send",
- sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
- sc->sc_sec, cp, len, cnt);
+ ctlr, slave, sc->sc_sec, cp, len, cnt);
#endif
splx(s);
if (uio->uio_rw == UIO_READ) {
*/
if (sc->sc_delay > 0) {
sc->sc_flags |= PPIF_DELAY;
- timeout((void (*)__P((void *)))ppistart, (void *)unit,
- sc->sc_delay);
+ timeout(ppistart, sc, sc->sc_delay);
error = tsleep(sc, PCATCH|PZERO+1, "hpib", 0);
if (error) {
splx(s);
}
s = splsoftclock();
if (sc->sc_flags & PPIF_TIMO) {
- untimeout(ppitimo, (void *)unit);
+ untimeout(ppitimo, sc);
sc->sc_flags &= ~PPIF_TIMO;
}
if (sc->sc_flags & PPIF_DELAY) {
- untimeout((void (*)__P((void *)))ppistart, (void *)unit);
+ untimeout(ppistart, sc);
sc->sc_flags &= ~PPIF_DELAY;
}
splx(s);
return (error);
}
+int
ppiioctl(dev, cmd, data, flag, p)
dev_t dev;
- int cmd;
+ u_long cmd;
caddr_t data;
int flag;
struct proc *p;
{
- struct ppi_softc *sc = &ppi_softc[UNIT(dev)];
+ struct ppi_softc *sc = ppi_cd.cd_devs[UNIT(dev)];
struct ppiparam *pp, *upp;
int error = 0;
return (error);
}
+int
ppihztoms(h)
int h;
{
return(m);
}
+int
ppimstohz(m)
int m;
{
}
return(h);
}
-#endif
-/* $OpenBSD: rd.c,v 1.7 1997/01/12 15:12:58 downsj Exp $ */
-/* $NetBSD: rd.c,v 1.26 1997/01/07 09:29:32 thorpej Exp $ */
+/* $OpenBSD: rd.c,v 1.8 1997/02/03 04:47:42 downsj Exp $ */
+/* $NetBSD: rd.c,v 1.27 1997/01/30 09:14:17 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1982, 1990, 1993
* The Regents of the University of California. All rights reserved.
/*
* CS80/SS80 disk driver
*/
-#include "rd.h"
-#if NRD > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/disk.h>
#include <sys/ioctl.h>
#include <sys/fcntl.h>
+#include <sys/device.h>
+#include <sys/conf.h>
+
+#include <hp300/dev/hpibvar.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/rdreg.h>
#include <hp300/dev/rdvar.h>
+
#ifdef USELEDS
#include <hp300/hp300/led.h>
#endif
#include <vm/vm_prot.h>
#include <vm/pmap.h>
-int rdmatch(), rdstart(), rdgo(), rdintr();
-void rdattach(), rdstrategy();
-struct driver rddriver = {
- rdmatch, rdattach, "rd", rdstart, rdgo, rdintr,
+int rdmatch __P((struct device *, void *, void *));
+void rdattach __P((struct device *, struct device *, void *));
+
+struct cfattach rd_ca = {
+ sizeof(struct rd_softc), rdmatch, rdattach
+};
+
+struct cfdriver rd_cd = {
+ NULL, "rd", DV_DISK
};
-struct rd_softc rd_softc[NRD];
-struct buf rdtab[NRD];
+int rdident __P((struct device *, struct rd_softc *,
+ struct hpibbus_attach_args *));
+void rdreset __P((struct rd_softc *));
+void rdustart __P((struct rd_softc *));
+int rdgetinfo __P((dev_t));
+void rdrestart __P((void *));
+struct buf *rdfinish __P((struct rd_softc *, struct buf *));
+
+void rdstart __P((void *));
+void rdintr __P((void *));
+void rdgo __P((void *));
+
+bdev_decl(rd);
+cdev_decl(rd);
+
int rderrthresh = RDRETRY-1; /* when to start reporting errors */
#ifdef DEBUG
0, 0
};
-struct rdstats rdstats[NRD];
int rddebug = 0x80;
#define RDB_FOLLOW 0x01
#define RDB_STATUS 0x02
int numrdidentinfo = sizeof(rdidentinfo) / sizeof(rdidentinfo[0]);
int
-rdmatch(hd)
- register struct hp_device *hd;
+rdmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct rd_softc *rs = &rd_softc[hd->hp_unit];
+ struct cfdata *cf = match;
+ struct hpibbus_attach_args *ha = aux;
- rs->sc_hd = hd;
- rs->sc_punit = rdpunit(hd->hp_flags);
- rs->sc_type = rdident(rs, hd, 0);
- if (rs->sc_type < 0) {
+ /*
+ * Set punit if operator specified one in the kernel
+ * configuration file.
+ */
+ if (cf->hpibbuscf_punit != HPIBBUS_PUNIT_UNK &&
+ cf->hpibbuscf_punit < HPIB_NPUNITS)
+ ha->ha_punit = cf->hpibbuscf_punit;
+
+ if (rdident(parent, NULL, ha) == 0) {
/*
- * XXX Some ancient drives may be slow to respond, so
- * probe them again.
+ * XXX Some aging HP-IB drives are slow to
+ * XXX respond; give them a chance to catch
+ * XXX up and probe them again.
*/
- DELAY(10000);
- rs->sc_type = rdident(rs, hd, 0);
- if (rs->sc_type < 0)
- return (0);
+ delay(10000);
+ ha->ha_id = hpibid(parent->dv_unit, ha->ha_slave);
+ return (rdident(parent, NULL, ha));
}
+ return (1);
+}
- /* XXX set up the external name */
- bzero(rs->sc_xname, sizeof(rs->sc_xname));
- sprintf(rs->sc_xname, "rd%d", hd->hp_unit);
+void
+rdattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct rd_softc *sc = (struct rd_softc *)self;
+ struct hpibbus_attach_args *ha = aux;
+
+ if (rdident(parent, sc, ha) == 0) {
+ printf("\n%s: didn't respond to describe command!\n",
+ sc->sc_dev.dv_xname);
+ return;
+ }
/*
* Initialize and attach the disk structure.
*/
- bzero(&rs->sc_dkdev, sizeof(rs->sc_dkdev));
- rs->sc_dkdev.dk_name = rs->sc_xname;
- disk_attach(&rs->sc_dkdev);
-
- return (1);
-}
+ bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
+ sc->sc_dkdev.dk_name = sc->sc_dev.dv_xname;
+ disk_attach(&sc->sc_dkdev);
-void
-rdattach(hd)
- register struct hp_device *hd;
-{
- register struct rd_softc *rs = &rd_softc[hd->hp_unit];
+ sc->sc_slave = ha->ha_slave;
+ sc->sc_punit = ha->ha_punit;
- (void)rdident(rs, hd, 1); /* XXX Ick. */
+ /* Initialize the hpib job queue entry */
+ sc->sc_hq.hq_softc = sc;
+ sc->sc_hq.hq_slave = sc->sc_slave;
+ sc->sc_hq.hq_start = rdstart;
+ sc->sc_hq.hq_go = rdgo;
+ sc->sc_hq.hq_intr = rdintr;
- rs->sc_dq.dq_softc = rs;
- rs->sc_dq.dq_ctlr = hd->hp_ctlr;
- rs->sc_dq.dq_unit = hd->hp_unit;
- rs->sc_dq.dq_slave = hd->hp_slave;
- rs->sc_dq.dq_driver = &rddriver;
- rs->sc_flags = RDF_ALIVE;
+ sc->sc_flags = RDF_ALIVE;
#ifdef DEBUG
/* always report errors */
if (rddebug & RDB_ERROR)
rderrthresh = 0;
#endif
- /* XXX Set device class. */
- hd->hp_dev.dv_class = DV_DISK;
+ dk_establish(&sc->sc_dkdev, &sc->sc_dev); /* XXX */
}
int
-rdident(rs, hd, verbose)
- struct rd_softc *rs;
- struct hp_device *hd;
- int verbose;
+rdident(parent, sc, ha)
+ struct device *parent;
+ struct rd_softc *sc;
+ struct hpibbus_attach_args *ha;
{
- struct rd_describe *desc = &rs->sc_rddesc;
+ struct rd_softc rsc;
+ struct rd_describe *desc = sc != NULL ? &sc->sc_rddesc : NULL;
u_char stat, cmd[3];
- int unit, lunit;
char name[7];
- register int ctlr, slave, id, i;
+ int i, id, n, ctlr, slave;
+
+ ctlr = parent->dv_unit;
+ slave = ha->ha_slave;
- ctlr = hd->hp_ctlr;
- slave = hd->hp_slave;
- unit = rs->sc_punit;
- lunit = hd->hp_unit;
+ /* Verify that we have a CS80 device. */
+ if ((ha->ha_id & 0x200) == 0)
+ return (0);
+
+ /* Is it one of the disks we support? */
+ for (id = 0; id < numrdidentinfo; id++)
+ if (ha->ha_id == rdidentinfo[id].ri_hwid)
+ break;
+ if (id == numrdidentinfo || ha->ha_punit > rdidentinfo[id].ri_maxunum)
+ return (0);
/*
- * Grab device id and make sure:
- * 1. It is a CS80 device.
- * 2. It is one of the types we support.
- * 3. If it is a 7946, we are accessing the disk unit (0)
+ * If we're just probing for the device, that's all the
+ * work we need to do.
*/
- id = hpibid(ctlr, slave);
-#ifdef DEBUG
- if (rddebug & RDB_IDENT)
- printf("hpibid(%d, %d) -> %x\n", ctlr, slave, id);
-#endif
- if ((id & 0x200) == 0)
- return(-1);
- for (i = 0; i < numrdidentinfo; i++)
- if (id == rdidentinfo[i].ri_hwid)
- break;
- if (i == numrdidentinfo || unit > rdidentinfo[i].ri_maxunum)
- return(-1);
- id = i;
+ if (sc == NULL)
+ return (1);
/*
- * Reset drive and collect device description.
- * Don't really use the description info right now but
- * might come in handy in the future (for disk labels).
+ * Reset device and collect description
*/
- rdreset(rs, hd);
- cmd[0] = C_SUNIT(unit);
+ rdreset(sc);
+ cmd[0] = C_SUNIT(ha->ha_punit);
cmd[1] = C_SVOL(0);
cmd[2] = C_DESC;
hpibsend(ctlr, slave, C_CMD, cmd, sizeof(cmd));
hpibrecv(ctlr, slave, C_EXEC, desc, 37);
hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
- bzero(name, sizeof(name));
- if (!stat) {
- register int n = desc->d_name;
+ bzero(name, sizeof(name));
+ if (stat == 0) {
+ n = desc->d_name;
for (i = 5; i >= 0; i--) {
name[i] = (n & 0xf) + '0';
n >>= 4;
}
}
+
#ifdef DEBUG
if (rddebug & RDB_IDENT) {
- printf("rd%d: name: %x ('%s')\n",
- lunit, desc->d_name, name);
+ printf("\n%s: name: %x ('%s')\n",
+ sc->sc_dev.dv_xname, desc->d_name, name);
printf(" iuw %x, maxxfr %d, ctype %d\n",
- desc->d_iuw, desc->d_cmaxxfr, desc->d_ctype);
+ desc->d_iuw, desc->d_cmaxxfr, desc->d_ctype);
printf(" utype %d, bps %d, blkbuf %d, burst %d, blktime %d\n",
- desc->d_utype, desc->d_sectsize,
- desc->d_blkbuf, desc->d_burstsize, desc->d_blocktime);
+ desc->d_utype, desc->d_sectsize,
+ desc->d_blkbuf, desc->d_burstsize, desc->d_blocktime);
printf(" avxfr %d, ort %d, atp %d, maxint %d, fv %x, rv %x\n",
- desc->d_uavexfr, desc->d_retry, desc->d_access,
- desc->d_maxint, desc->d_fvbyte, desc->d_rvbyte);
+ desc->d_uavexfr, desc->d_retry, desc->d_access,
+ desc->d_maxint, desc->d_fvbyte, desc->d_rvbyte);
printf(" maxcyl/head/sect %d/%d/%d, maxvsect %d, inter %d\n",
- desc->d_maxcyl, desc->d_maxhead, desc->d_maxsect,
- desc->d_maxvsectl, desc->d_interleave);
+ desc->d_maxcyl, desc->d_maxhead, desc->d_maxsect,
+ desc->d_maxvsectl, desc->d_interleave);
+ printf("%s", sc->sc_dev.dv_xname);
}
#endif
+
/*
* Take care of a couple of anomolies:
* 1. 7945A and 7946A both return same HW id
* 2. 9122S and 9134D both return same HW id
* 3. 9122D and 9134L both return same HW id
*/
- switch (rdidentinfo[id].ri_hwid) {
+ switch (ha->ha_id) {
case RD7946AID:
if (bcmp(name, "079450", 6) == 0)
id = RD7945A;
id = RD9134D;
break;
}
+
+ sc->sc_type = id;
+
/*
* XXX We use DEV_BSIZE instead of the sector size value pulled
- * off the driver because all of this code assumes 512 byte
- * blocks. ICK!
+ * XXX off the driver because all of this code assumes 512 byte
+ * XXX blocks. ICK!
*/
- if (verbose) {
- printf(": %s\n", rdidentinfo[id].ri_desc);
- printf("%s: %d cylinders, %d heads, %d blocks, %d bytes/block\n",
- rs->sc_hd->hp_xname, rdidentinfo[id].ri_ncyl,
- rdidentinfo[id].ri_ntpc, rdidentinfo[id].ri_nblocks,
- DEV_BSIZE);
- }
- return(id);
+ printf(": %s\n", rdidentinfo[id].ri_desc);
+ printf("%s: %d cylinders, %d heads, %d blocks, %d bytes/block\n",
+ sc->sc_dev.dv_xname, rdidentinfo[id].ri_ncyl,
+ rdidentinfo[id].ri_ntpc, rdidentinfo[id].ri_nblocks,
+ DEV_BSIZE);
+
+ return (1);
}
-rdreset(rs, hd)
+void
+rdreset(rs)
register struct rd_softc *rs;
- register struct hp_device *hd;
{
+ int ctlr = rs->sc_dev.dv_parent->dv_unit;
+ int slave = rs->sc_slave;
u_char stat;
rs->sc_clear.c_unit = C_SUNIT(rs->sc_punit);
rs->sc_clear.c_cmd = C_CLEAR;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_TCMD, &rs->sc_clear,
- sizeof(rs->sc_clear));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_TCMD, &rs->sc_clear, sizeof(rs->sc_clear));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
rs->sc_src.c_unit = C_SUNIT(RDCTLR);
rs->sc_src.c_nop = C_NOP;
rs->sc_src.c_cmd = C_SREL;
rs->sc_src.c_param = C_REL;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, &rs->sc_src,
- sizeof(rs->sc_src));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_CMD, &rs->sc_src, sizeof(rs->sc_src));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
+
rs->sc_ssmc.c_unit = C_SUNIT(rs->sc_punit);
rs->sc_ssmc.c_cmd = C_SSM;
rs->sc_ssmc.c_refm = REF_MASK;
rs->sc_ssmc.c_fefm = FEF_MASK;
rs->sc_ssmc.c_aefm = AEF_MASK;
rs->sc_ssmc.c_iefm = IEF_MASK;
- hpibsend(hd->hp_ctlr, hd->hp_slave, C_CMD, &rs->sc_ssmc,
- sizeof(rs->sc_ssmc));
- hpibswait(hd->hp_ctlr, hd->hp_slave);
- hpibrecv(hd->hp_ctlr, hd->hp_slave, C_QSTAT, &stat, sizeof(stat));
+ hpibsend(ctlr, slave, C_CMD, &rs->sc_ssmc, sizeof(rs->sc_ssmc));
+ hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, sizeof(stat));
#ifdef DEBUG
- rdstats[hd->hp_unit].rdresets++;
+ rs->sc_stats.rdresets++;
#endif
}
dev_t dev;
{
int unit = rdunit(dev);
- register struct rd_softc *rs = &rd_softc[unit];
+ struct rd_softc *rs = rd_cd.cd_devs[unit];
register struct disklabel *lp = rs->sc_dkdev.dk_label;
register struct partition *pi;
char *msg, *readdisklabel();
return(0);
pi = lp->d_partitions;
- printf("%s: WARNING: %s, ", rs->sc_hd->hp_xname, msg);
+ printf("%s: WARNING: %s, ", rs->sc_dev.dv_xname, msg);
#ifdef COMPAT_NOLABEL
printf("using old default partitioning\n");
rdmakedisklabel(unit, lp);
struct proc *p;
{
register int unit = rdunit(dev);
- register struct rd_softc *rs = &rd_softc[unit];
+ register struct rd_softc *rs;
int error, mask, part;
- if (unit >= NRD || (rs->sc_flags & RDF_ALIVE) == 0)
- return(ENXIO);
+ if (unit >= rd_cd.cd_ndevs ||
+ (rs = rd_cd.cd_devs[unit]) == NULL ||
+ (rs->sc_flags & RDF_ALIVE) == 0)
+ return (ENXIO);
/*
* Wait for any pending opens/closes to complete
struct proc *p;
{
int unit = rdunit(dev);
- register struct rd_softc *rs = &rd_softc[unit];
+ struct rd_softc *rs = rd_cd.cd_devs[unit];
register struct disk *dk = &rs->sc_dkdev;
int mask, s;
if (dk->dk_openmask == 0) {
rs->sc_flags |= RDF_CLOSING;
s = splbio();
- while (rdtab[unit].b_active) {
+ while (rs->sc_tab.b_active) {
rs->sc_flags |= RDF_WANTED;
- sleep((caddr_t)&rdtab[unit], PRIBIO);
+ sleep((caddr_t)&rs->sc_tab, PRIBIO);
}
splx(s);
rs->sc_flags &= ~(RDF_CLOSING|RDF_WLABEL);
register struct buf *bp;
{
int unit = rdunit(bp->b_dev);
- register struct rd_softc *rs = &rd_softc[unit];
- register struct buf *dp = &rdtab[unit];
+ struct rd_softc *rs = rd_cd.cd_devs[unit];
+ register struct buf *dp = &rs->sc_tab;
register struct partition *pinfo;
register daddr_t bn;
register int sz, s;
disksort(dp, bp);
if (dp->b_active == 0) {
dp->b_active = 1;
- rdustart(unit);
+ rdustart(rs);
}
splx(s);
return;
void *arg;
{
int s = splbio();
- rdustart((int)arg);
+ rdustart((struct rd_softc *)arg);
splx(s);
}
-rdustart(unit)
- register int unit;
+void
+rdustart(rs)
+ struct rd_softc *rs;
{
register struct buf *bp;
- register struct rd_softc *rs = &rd_softc[unit];
- bp = rdtab[unit].b_actf;
+ bp = rs->sc_tab.b_actf;
rs->sc_addr = bp->b_un.b_addr;
rs->sc_resid = bp->b_bcount;
- if (hpibreq(&rs->sc_dq))
- rdstart(unit);
+ if (hpibreq(rs->sc_dev.dv_parent, &rs->sc_hq))
+ rdstart(rs);
}
struct buf *
-rdfinish(unit, rs, bp)
- int unit;
+rdfinish(rs, bp)
register struct rd_softc *rs;
register struct buf *bp;
{
- register struct buf *dp = &rdtab[unit];
+ register struct buf *dp = &rs->sc_tab;
dp->b_errcnt = 0;
dp->b_actf = bp->b_actf;
bp->b_resid = 0;
biodone(bp);
- hpibfree(&rs->sc_dq);
+ hpibfree(rs->sc_dev.dv_parent, &rs->sc_hq);
if (dp->b_actf)
- return(dp->b_actf);
+ return (dp->b_actf);
dp->b_active = 0;
if (rs->sc_flags & RDF_WANTED) {
rs->sc_flags &= ~RDF_WANTED;
wakeup((caddr_t)dp);
}
- return(NULL);
+ return (NULL);
}
-rdstart(unit)
- register int unit;
+void
+rdstart(arg)
+ void *arg;
{
- register struct rd_softc *rs = &rd_softc[unit];
- register struct buf *bp = rdtab[unit].b_actf;
- register struct hp_device *hp = rs->sc_hd;
- register int part;
+ struct rd_softc *rs = arg;
+ register struct buf *bp = rs->sc_tab.b_actf;
+ register int part, ctlr, slave;
+
+ ctlr = rs->sc_dev.dv_parent->dv_unit;
+ slave = rs->sc_slave;
again:
#ifdef DEBUG
if (rddebug & RDB_FOLLOW)
- printf("rdstart(%d): bp %x, %c\n", unit, bp,
+ printf("rdstart(%s): bp %x, %c\n", sc->sc_dev.dv_xname, bp,
(bp->b_flags & B_READ) ? 'R' : 'W');
#endif
part = rdpart(bp->b_dev);
#ifdef DEBUG
if (rddebug & RDB_IO)
printf("rdstart: hpibsend(%x, %x, %x, %x, %x)\n",
- hp->hp_ctlr, hp->hp_slave, C_CMD,
+ ctlr, slave, C_CMD,
&rs->sc_ioc.c_unit, sizeof(rs->sc_ioc)-2);
#endif
- if (hpibsend(hp->hp_ctlr, hp->hp_slave, C_CMD, &rs->sc_ioc.c_unit,
+ if (hpibsend(ctlr, slave, C_CMD, &rs->sc_ioc.c_unit,
sizeof(rs->sc_ioc)-2) == sizeof(rs->sc_ioc)-2) {
/* Instrumentation. */
#ifdef DEBUG
if (rddebug & RDB_IO)
- printf("rdstart: hpibawait(%x)\n", hp->hp_ctlr);
+ printf("rdstart: hpibawait(%x)\n", ctlr);
#endif
- hpibawait(hp->hp_ctlr);
+ hpibawait(ctlr);
return;
}
/*
#ifdef DEBUG
if (rddebug & RDB_ERROR)
printf("%s: rdstart: cmd %x adr %d blk %d len %d ecnt %d\n",
- rs->sc_hd->hp_xname, rs->sc_ioc.c_cmd, rs->sc_ioc.c_addr,
- bp->b_blkno, rs->sc_resid, rdtab[unit].b_errcnt);
- rdstats[unit].rdretries++;
+ rs->sc_dev.dv_xname, rs->sc_ioc.c_cmd, rs->sc_ioc.c_addr,
+ bp->b_blkno, rs->sc_resid, rs->sc_tab.b_errcnt);
+ rs->sc_stats.rdretries++;
#endif
rs->sc_flags &= ~RDF_SEEK;
- rdreset(rs, hp);
- if (rdtab[unit].b_errcnt++ < RDRETRY)
+ rdreset(rs);
+ if (rs->sc_tab.b_errcnt++ < RDRETRY)
goto again;
printf("%s: rdstart err: cmd 0x%x sect %d blk %d len %d\n",
- rs->sc_hd->hp_xname, rs->sc_ioc.c_cmd, rs->sc_ioc.c_addr,
+ rs->sc_dev.dv_xname, rs->sc_ioc.c_cmd, rs->sc_ioc.c_addr,
bp->b_blkno, rs->sc_resid);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
- bp = rdfinish(unit, rs, bp);
+ bp = rdfinish(rs, bp);
if (bp) {
rs->sc_addr = bp->b_un.b_addr;
rs->sc_resid = bp->b_bcount;
- if (hpibreq(&rs->sc_dq))
+ if (hpibreq(rs->sc_dev.dv_parent, &rs->sc_hq))
goto again;
}
}
-rdgo(unit)
- register int unit;
+void
+rdgo(arg)
+ void *arg;
{
- register struct rd_softc *rs = &rd_softc[unit];
- register struct hp_device *hp = rs->sc_hd;
- struct buf *bp = rdtab[unit].b_actf;
- int rw;
+ struct rd_softc *rs = arg;
+ struct buf *bp = rs->sc_tab.b_actf;
+ int rw, ctlr, slave;
+
+ ctlr = rs->sc_dev.dv_parent->dv_unit;
+ slave = rs->sc_slave;
rw = bp->b_flags & B_READ;
if (inledcontrol == 0)
ledcontrol(0, 0, LED_DISK);
#endif
- hpibgo(hp->hp_ctlr, hp->hp_slave, C_EXEC,
- rs->sc_addr, rs->sc_resid, rw, rw != 0);
+ hpibgo(ctlr, slave, C_EXEC, rs->sc_addr, rs->sc_resid, rw, rw != 0);
}
+/* ARGSUSED */
+void
rdintr(arg)
void *arg;
{
register struct rd_softc *rs = arg;
- int unit = rs->sc_hd->hp_unit;
- register struct buf *bp = rdtab[unit].b_actf;
- register struct hp_device *hp = rs->sc_hd;
+ int unit = rs->sc_dev.dv_unit;
+ register struct buf *bp = rs->sc_tab.b_actf;
u_char stat = 13; /* in case hpibrecv fails */
- int rv, restart;
-
+ int rv, restart, ctlr, slave;
+
+ ctlr = rs->sc_dev.dv_parent->dv_unit;
+ slave = rs->sc_slave;
+
#ifdef DEBUG
if (rddebug & RDB_FOLLOW)
printf("rdintr(%d): bp %x, %c, flags %x\n", unit, bp,
(bp->b_flags & B_READ) ? 'R' : 'W', rs->sc_flags);
if (bp == NULL) {
- printf("%s: bp == NULL\n", rs->sc_hd->hp_xname);
+ printf("%s: bp == NULL\n", rs->sc_dev.dv_xname);
return;
}
#endif
if (rs->sc_flags & RDF_SEEK) {
rs->sc_flags &= ~RDF_SEEK;
- if (hpibustart(hp->hp_ctlr))
- rdgo(unit);
+ if (hpibustart(ctlr))
+ rdgo(rs);
return;
}
if ((rs->sc_flags & RDF_SWAIT) == 0) {
#ifdef DEBUG
- rdstats[unit].rdpolltries++;
+ rs->sc_stats.rdpolltries++;
#endif
- if (hpibpptest(hp->hp_ctlr, hp->hp_slave) == 0) {
+ if (hpibpptest(ctlr, slave) == 0) {
#ifdef DEBUG
- rdstats[unit].rdpollwaits++;
+ rs->sc_stats.rdpollwaits++;
#endif
/* Instrumentation. */
disk_busy(&rs->sc_dkdev);
rs->sc_flags |= RDF_SWAIT;
- hpibawait(hp->hp_ctlr);
+ hpibawait(ctlr);
return;
}
} else
rs->sc_flags &= ~RDF_SWAIT;
- rv = hpibrecv(hp->hp_ctlr, hp->hp_slave, C_QSTAT, &stat, 1);
+ rv = hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
if (rv != 1 || stat) {
#ifdef DEBUG
if (rddebug & RDB_ERROR)
#endif
restart = rderror(unit);
#ifdef DEBUG
- rdstats[unit].rdretries++;
+ rs->sc_stats.rdretries++;
#endif
- if (rdtab[unit].b_errcnt++ < RDRETRY) {
+ if (rs->sc_tab.b_errcnt++ < RDRETRY) {
if (restart)
- rdstart(unit);
+ rdstart(rs);
return;
}
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
}
- if (rdfinish(unit, rs, bp))
- rdustart(unit);
+ if (rdfinish(rs, bp))
+ rdustart(rs);
}
+int
rdstatus(rs)
register struct rd_softc *rs;
{
u_char stat;
int rv;
- c = rs->sc_hd->hp_ctlr;
- s = rs->sc_hd->hp_slave;
+ c = rs->sc_dev.dv_parent->dv_unit;
+ s = rs->sc_slave;
rs->sc_rsc.c_unit = C_SUNIT(rs->sc_punit);
rs->sc_rsc.c_sram = C_SRAM;
rs->sc_rsc.c_ram = C_RAM;
* Returns 1 if request should be restarted,
* 0 if we should just quietly give up.
*/
+int
rderror(unit)
int unit;
{
- struct rd_softc *rs = &rd_softc[unit];
+ struct rd_softc *rs = rd_cd.cd_devs[unit];
register struct rd_stat *sp;
struct buf *bp;
daddr_t hwbn, pbn;
if (rdstatus(rs)) {
#ifdef DEBUG
- printf("%s: couldn't get status\n", rs->sc_hd->hp_xname);
+ printf("%s: couldn't get status\n", rs->sc_dev.dv_xname);
#endif
- rdreset(rs, rs->sc_hd);
+ rdreset(rs);
return(1);
}
sp = &rs->sc_stat;
if (sp->c_fef & FEF_REXMT)
return(1);
if (sp->c_fef & FEF_PF) {
- rdreset(rs, rs->sc_hd);
+ rdreset(rs);
return(1);
}
/*
*/
if (sp->c_fef & FEF_IMR) {
extern int hz;
- int rdtimo = RDWAITC << rdtab[unit].b_errcnt;
+ int rdtimo = RDWAITC << rs->sc_tab.b_errcnt;
#ifdef DEBUG
printf("%s: internal maintenance, %d second timeout\n",
- rs->sc_hd->hp_xname, rdtimo);
- rdstats[unit].rdtimeouts++;
+ rs->sc_dev.dv_xname, rdtimo);
+ rs->sc_stats.rdtimeouts++;
#endif
- hpibfree(&rs->sc_dq);
- timeout(rdrestart, (void *)unit, rdtimo * hz);
+ hpibfree(rs->sc_dev.dv_parent, &rs->sc_hq);
+ timeout(rdrestart, rs, rdtimo * hz);
return(0);
}
/*
* threshhold. By default, this will only report after the
* retry limit has been exceeded.
*/
- if (rdtab[unit].b_errcnt < rderrthresh)
+ if (rs->sc_tab.b_errcnt < rderrthresh)
return(1);
/*
* Note that not all errors report a block number, in that case
* we just use b_blkno.
*/
- bp = rdtab[unit].b_actf;
+ bp = rs->sc_tab.b_actf;
pbn = rs->sc_dkdev.dk_label->d_partitions[rdpart(bp->b_dev)].p_offset;
if ((sp->c_fef & FEF_CU) || (sp->c_fef & FEF_DR) ||
(sp->c_ief & IEF_RRMASK)) {
* out b_blkno which is just the beginning block number
* of the transfer, not necessary where the error occured.
*/
- printf("rd%d%c: hard error sn%d\n",
- rdunit(bp->b_dev), 'a'+rdpart(bp->b_dev), pbn);
+ printf("%s%c: hard error sn%d\n", rs->sc_dev.dv_xname,
+ 'a'+rdpart(bp->b_dev), pbn);
/*
* Now report the status as returned by the hardware with
* attempt at interpretation (unless debugging).
*/
- printf("rd%d %s error:",
- unit, (bp->b_flags & B_READ) ? "read" : "write");
+ printf("%s %s error:", rs->sc_dev.dv_xname,
+ (bp->b_flags & B_READ) ? "read" : "write");
#ifdef DEBUG
if (rddebug & RDB_ERROR) {
/* status info */
int
rdioctl(dev, cmd, data, flag, p)
dev_t dev;
- int cmd;
+ u_long cmd;
caddr_t data;
int flag;
struct proc *p;
{
int unit = rdunit(dev);
- register struct rd_softc *sc = &rd_softc[unit];
+ struct rd_softc *sc = rd_cd.cd_devs[unit];
register struct disklabel *lp = sc->sc_dkdev.dk_label;
int error, flags;
dev_t dev;
{
register int unit = rdunit(dev);
- register struct rd_softc *rs = &rd_softc[unit];
+ struct rd_softc *rs;
int psize, didopen = 0;
- if (unit >= NRD || (rs->sc_flags & RDF_ALIVE) == 0)
- return(-1);
+ if (unit >= rd_cd.cd_ndevs ||
+ (rs = rd_cd.cd_devs[unit]) == NULL ||
+ (rs->sc_flags & RDF_ALIVE) == 0)
+ return (-1);
/*
* We get called very early on (via swapconf)
int totwrt; /* total number of sectors left to write */
int nwrt; /* current number of sectors to write */
int unit, part;
+ int ctlr, slave;
struct rd_softc *rs;
- struct hp_device *hp;
struct disklabel *lp;
char stat;
part = rdpart(dev);
/* Make sure dump device is ok. */
- if (unit >= NRD)
- return (ENXIO);
- rs = &rd_softc[unit];
- if ((rs->sc_flags & RDF_ALIVE) == 0)
+ if (unit >= rd_cd.cd_ndevs ||
+ (rs = rd_cd.cd_devs[unit]) == NULL ||
+ (rs->sc_flags & RDF_ALIVE) == 0)
return (ENXIO);
- hp = rs->sc_hd;
+
+ ctlr = rs->sc_dev.dv_parent->dv_unit;
+ slave = rs->sc_slave;
/*
* Convert to disk sectors. Request must be a multiple of size.
rs->sc_ioc.c_slen = C_SLEN;
rs->sc_ioc.c_len = nwrt * sectorsize;
rs->sc_ioc.c_cmd = C_WRITE;
- hpibsend(hp->hp_ctlr, hp->hp_slave, C_CMD,
- &rs->sc_ioc.c_unit, sizeof(rs->sc_ioc)-2);
- if (hpibswait(hp->hp_ctlr, hp->hp_slave))
+ hpibsend(ctlr, slave, C_CMD, &rs->sc_ioc.c_unit,
+ sizeof(rs->sc_ioc)-2);
+ if (hpibswait(ctlr, slave))
return (EIO);
/*
* Send the data.
*/
- hpibsend(hp->hp_ctlr, hp->hp_slave, C_EXEC, va,
- nwrt * sectorsize);
- (void) hpibswait(hp->hp_ctlr, hp->hp_slave);
- hpibrecv(hp->hp_ctlr, hp->hp_slave, C_QSTAT, &stat, 1);
+ hpibsend(ctlr, slave, C_EXEC, va, nwrt * sectorsize);
+ (void) hpibswait(ctlr, slave);
+ hpibrecv(ctlr, slave, C_QSTAT, &stat, 1);
if (stat)
return (EIO);
#else /* RD_DUMP_NOT_TRUSTED */
/* Let's just talk about this first... */
- printf("%s: dump addr %p, blk %d\n", hp->hp_xname,
+ printf("%s: dump addr %p, blk %d\n", sc->sc_dev.dv_xname,
va, blkno);
delay(500 * 1000); /* half a second */
#endif /* RD_DUMP_NOT_TRUSTED */
rddoingadump = 0;
return (0);
}
-#endif
-/* $OpenBSD: rd_compat.c,v 1.4 1997/01/12 15:12:59 downsj Exp $ */
-/* $NetBSD: rd_compat.c,v 1.5 1996/01/07 22:02:14 thorpej Exp $ */
+/* $OpenBSD: rd_compat.c,v 1.5 1997/02/03 04:47:43 downsj Exp $ */
+/* $NetBSD: rd_compat.c,v 1.6 1997/01/30 09:14:18 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
/*
* Compatibility for CS80 disks without disklabels.
*/
-#include "rd.h"
-#if NRD > 0
#include <sys/param.h>
#include <sys/disklabel.h>
#include <sys/disk.h>
-#include <hp300/dev/device.h>
+#include <sys/device.h>
+#include <sys/buf.h> /* XXX */
+
+#include <hp300/dev/hpibvar.h>
+
#include <hp300/dev/rdreg.h>
#include <hp300/dev/rdvar.h>
int unit;
struct disklabel *lp;
{
- register struct rd_softc *rs = &rd_softc[unit];
+ extern struct cfdriver rd_cd;
+ register struct rd_softc *rs = rd_cd.cd_devs[unit];
register struct rdcompatinfo *ci = &rdcompatinfo[rs->sc_type];
struct rdidentinfo *ri = &rdidentinfo[rs->sc_type];
register struct partition *pi;
pi++;
}
}
-#endif
-/* $OpenBSD: rdvar.h,v 1.5 1997/01/12 15:13:00 downsj Exp $ */
-/* $NetBSD: rdvar.h,v 1.5 1996/06/06 16:17:42 thorpej Exp $ */
+/* $OpenBSD: rdvar.h,v 1.6 1997/02/03 04:47:43 downsj Exp $ */
+/* $NetBSD: rdvar.h,v 1.6 1997/01/30 09:14:19 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
int ri_nblocks; /* DEV_BSIZE blocks on disk */
};
+struct rdstats {
+ long rdretries;
+ long rdresets;
+ long rdtimeouts;
+ long rdpolltries;
+ long rdpollwaits;
+};
+
struct rd_softc {
- struct hp_device *sc_hd;
+ struct device sc_dev;
struct disk sc_dkdev;
- char sc_xname[8];
+ int sc_slave; /* HP-IB slave */
+ int sc_punit; /* physical unit on slave */
int sc_flags;
short sc_type;
- short sc_punit;
char *sc_addr;
int sc_resid;
struct rd_describe sc_rddesc;
- struct devqueue sc_dq;
+ struct hpibqueue sc_hq; /* hpib job queue entry */
struct rd_iocmd sc_ioc;
struct rd_rscmd sc_rsc;
struct rd_stat sc_stat;
struct rd_ssmcmd sc_ssmc;
struct rd_srcmd sc_src;
struct rd_clearcmd sc_clear;
+ struct buf sc_tab; /* buffer queue */
+ struct rdstats sc_stats;
};
/* sc_flags values */
#define RDF_WANTED 0x20
#define RDF_WLABEL 0x40
-struct rdstats {
- long rdretries;
- long rdresets;
- long rdtimeouts;
- long rdpolltries;
- long rdpollwaits;
-};
-
#define rdunit(x) (minor(x) >> 3)
#define rdpart(x) (minor(x) & 0x7)
#define rdpunit(x) ((x) & 7)
#ifdef _KERNEL
extern struct rdidentinfo rdidentinfo[];
-extern struct rd_softc rd_softc[];
#endif
-/* $OpenBSD: scsi.c,v 1.5 1997/01/12 15:13:01 downsj Exp $ */
-/* $NetBSD: scsi.c,v 1.13 1996/12/09 03:16:26 thorpej Exp $ */
+/* $OpenBSD: scsi.c,v 1.6 1997/02/03 04:47:44 downsj Exp $ */
+/* $NetBSD: scsi.c,v 1.15 1997/01/30 09:08:55 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
/*
* HP9000/3xx 98658 SCSI host adaptor driver.
*/
-#include "scsi.h"
-#if NSCSI > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/buf.h>
+#include <sys/device.h>
#include <machine/cpu.h>
-#include <hp300/dev/device.h>
+#include <hp300/dev/dioreg.h>
+#include <hp300/dev/diovar.h>
+#include <hp300/dev/diodevs.h>
+
+#include <hp300/dev/dmavar.h>
+
#include <hp300/dev/scsivar.h>
#include <hp300/dev/scsireg.h>
-#include <hp300/dev/dmavar.h>
#include <hp300/hp300/isr.h>
+struct scsi_softc {
+ struct device sc_dev; /* generic device glue */
+ volatile struct scsidevice *sc_regs; /* card registers */
+ struct dmaqueue sc_dq; /* our entry in DMA job queue */
+ TAILQ_HEAD(, scsiqueue) sc_queue; /* job queue */
+ u_char sc_flags;
+ u_char sc_sync;
+ u_char sc_scsi_addr;
+ u_char sc_scsiid; /* XXX unencoded copy of sc_scsi_addr */
+ u_char sc_stat[2];
+ u_char sc_msg[7];
+};
+
+/* sc_flags */
+#define SCSI_IO 0x80 /* DMA I/O in progress */
+#define SCSI_DMA32 0x40 /* 32-bit DMA should be used */
+#define SCSI_HAVEDMA 0x04 /* controller has DMA channel */
+#ifdef DEBUG
+#define SCSI_PAD 0x02 /* 'padded' transfer in progress */
+#endif
+#define SCSI_ALIVE 0x01 /* controller initialized */
+
/*
* SCSI delays
* In u-seconds, primarily for state changes on the SPC.
#define SCSI_DATA_WAIT 10000 /* wait per data in/out step */
#define SCSI_INIT_WAIT 50000 /* wait per step (both) during init */
-extern void _insque();
-extern void _remque();
-
-int scsimatch(), scsigo(), scsixfer();
-void scsiattach(), scsistart(), scsidone(), scsifree(), scsireset();
+void scsidone __P((void *));
+void scsistart __P((void *));
int scsiintr __P((void *));
-struct driver scsidriver = {
- scsimatch, scsiattach, "scsi", (int (*)())scsistart, scsigo, scsiintr,
- (int (*)())scsidone,
+
+int scsimatch __P((struct device *, void *, void *));
+void scsiattach __P((struct device *, struct device *, void *));
+
+struct cfattach oscsi_ca = {
+ sizeof(struct scsi_softc), scsimatch, scsiattach
};
-struct scsi_softc scsi_softc[NSCSI];
+struct cfdriver oscsi_cd = {
+ NULL, "oscsi", DV_DULL
+};
+
+int scsisubmatch __P((struct device *, void *, void *));
+void scsi_attach_children __P((struct scsi_softc *));
int scsi_cmd_wait = SCSI_CMD_WAIT;
int scsi_data_wait = SCSI_DATA_WAIT;
int startlen; /* XXX - kludge till I understand whats *supposed* to happen */
u_char junk;
- printf("%s: ", hs->sc_hc->hp_xname);
+ printf("%s: ", hs->sc_dev.dv_xname);
if (target != -1)
printf("targ %d ", target);
printf("abort from %s: phase=0x%x, ssts=0x%x, ints=0x%x\n",
*/
if (len < 0 && hs)
printf("%s: abort failed. phase=0x%x, ssts=0x%x\n",
- hs->sc_hc->hp_xname, hd->scsi_psns, hd->scsi_ssts);
+ hs->sc_dev.dv_xname, hd->scsi_psns, hd->scsi_ssts);
if (! ((junk = hd->scsi_ints) & INTS_RESEL)) {
hd->scsi_sctl |= SCTL_CTRLRST;
}
int
-scsimatch(hc)
- register struct hp_ctlr *hc;
+scsimatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct scsi_softc *hs = &scsi_softc[hc->hp_unit];
- register struct scsidevice *hd = (struct scsidevice *)hc->hp_addr;
- struct hp_hw *hw = hc->hp_args;
-
- /*
- * This is probably a little redundant, but what the heck.
- */
- switch (hw->hw_id) {
- case 7:
- case 7+32:
- case 7+64:
- case 7+96:
- if ((hd->scsi_id & ID_MASK) != SCSI_ID)
- return (0);
+ struct dio_attach_args *da = aux;
- hc->hp_ipl = SCSI_IPL(hd->scsi_csr);
+ switch (da->da_id) {
+ case DIO_DEVICE_ID_SCSI0:
+ case DIO_DEVICE_ID_SCSI1:
+ case DIO_DEVICE_ID_SCSI2:
+ case DIO_DEVICE_ID_SCSI3:
return (1);
- /* NOTREACHED */
}
return (0);
}
void
-scsiattach(hc)
- struct hp_ctlr *hc;
+scsiattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- register struct scsi_softc *hs = &scsi_softc[hc->hp_unit];
- register struct scsidevice *hd = (struct scsidevice *)hc->hp_addr;
+ struct scsi_softc *hs = (struct scsi_softc *)self;
+ struct dio_attach_args *da = aux;
+ struct scsidevice *hd;
+ int ipl, unit = self->dv_unit;
- hs->sc_hc = hc;
- hs->sc_dq.dq_unit = hc->hp_unit;
- hs->sc_dq.dq_driver = &scsidriver;
- hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
+ /*
+ * Set up DMA job queue entry.
+ */
+ hs->sc_dq.dq_softc = hs;
+ hs->sc_dq.dq_start = scsistart;
+ hs->sc_dq.dq_done = scsidone;
+
+ /* Initialize request queue. */
+ TAILQ_INIT(&hs->sc_queue);
+
+ /* Map the device. */
+ hd = (struct scsidevice *)iomap(dio_scodetopa(da->da_scode),
+ da->da_size);
+ if (hd == NULL) {
+ printf("\n%s: can't map registers\n", self->dv_xname);
+ return;
+ }
+ ipl = DIO_IPL(hd);
+
+ hs->sc_regs = hd;
/* Establish the interrupt handler. */
- (void) isrlink(scsiintr, hs, hc->hp_ipl, ISRPRI_BIO);
+ (void) isrlink(scsiintr, hs, ipl, ISRPRI_BIO);
dmacomputeipl();
/* Reset the controller. */
- scsireset(hc->hp_unit);
+ scsireset(unit);
/*
* Print information about what we've found.
* Should we do this for all wait? Should we do this at all?
*/
scsi_init_wait *= (cpuspeed / 8);
+
+ /*
+ * Find and attach devices on the SCSI bus.
+ */
+ scsi_attach_children(hs);
+}
+
+void
+scsi_attach_children(sc)
+ struct scsi_softc *sc;
+{
+ struct oscsi_attach_args osa;
+ struct scsi_inquiry inqbuf;
+ int target, lun;
+
+ /*
+ * Look for devices on the SCSI bus.
+ */
+
+ for (target = 0; target < 8; target++) {
+ /* Skip target used by controller. */
+ if (target == sc->sc_scsiid)
+ continue;
+
+ for (lun = 0; lun < 1 /* XXX */; lun++) {
+ bzero(&inqbuf, sizeof(inqbuf));
+ if (scsi_probe_device(sc->sc_dev.dv_unit,
+ target, lun, &inqbuf, sizeof(inqbuf))) {
+ /*
+ * XXX First command on some tapes
+ * XXX always fails. (Or, at least,
+ * XXX that's what the old Utah "st"
+ * XXX driver claimed.)
+ */
+ bzero(&inqbuf, sizeof(inqbuf));
+ if (scsi_probe_device(sc->sc_dev.dv_unit,
+ target, lun, &inqbuf, sizeof(inqbuf)))
+ continue;
+ }
+
+ /*
+ * There is a device here; find a driver
+ * to match it.
+ */
+ osa.osa_target = target;
+ osa.osa_lun = lun;
+ osa.osa_inqbuf = &inqbuf;
+ (void)config_found_sm(&sc->sc_dev, &osa,
+ scsi_print, scsisubmatch);
+ }
+ }
+}
+
+int
+scsisubmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ struct cfdata *cf = match;
+ struct oscsi_attach_args *osa = aux;
+
+ if (cf->cf_loc[0] != -1 &&
+ cf->cf_loc[0] != osa->osa_target)
+ return (0);
+
+ if (cf->cf_loc[1] != -1 &&
+ cf->cf_loc[1] != osa->osa_lun)
+ return (0);
+
+ return ((*cf->cf_attach->ca_match)(parent, match, aux));
+}
+
+int
+scsi_print(aux, pnp)
+ void *aux;
+ const char *pnp;
+{
+ struct oscsi_attach_args *osa = aux;
+ struct scsi_inquiry *inqbuf = osa->osa_inqbuf;
+ char vendor[9], product[17], revision[5];
+
+ if (pnp == NULL)
+ printf(" targ %d lun %d: ", osa->osa_target, osa->osa_lun);
+
+ bzero(vendor, sizeof(vendor));
+ bzero(product, sizeof(product));
+ bzero(revision, sizeof(revision));
+ switch (inqbuf->version) {
+ case 1:
+ case 2:
+ scsi_str(inqbuf->vendor_id, vendor, sizeof(inqbuf->vendor_id));
+ scsi_str(inqbuf->product_id, product,
+ sizeof(inqbuf->product_id));
+ scsi_str(inqbuf->rev, revision, sizeof(inqbuf->rev));
+ printf("<%s, %s, %s>", vendor, product, revision);
+ if (inqbuf->version == 2)
+ printf(" (SCSI-2)");
+ break;
+ default:
+ printf("type 0x%x, qual 0x%x, ver %d",
+ inqbuf->type, inqbuf->qual, inqbuf->version);
+ }
+ if (pnp != NULL)
+ printf(" at %s targ %d lun %d",
+ pnp, osa->osa_target, osa->osa_lun);
+
+ return (UNCONF);
}
void
scsireset(unit)
- register int unit;
+ int unit;
{
- register struct scsi_softc *hs = &scsi_softc[unit];
- volatile register struct scsidevice *hd =
- (struct scsidevice *)hs->sc_hc->hp_addr;
+ struct scsi_softc *hs = oscsi_cd.cd_devs[unit];
+ volatile register struct scsidevice *hd = hs->sc_regs;
u_int i;
if (hs->sc_flags & SCSI_ALIVE)
volatile register struct scsidevice *hd;
u_char ints;
{
- int unit = hs->sc_hc->hp_unit;
+ int unit = hs->sc_dev.dv_unit;
char *sep = "";
- printf("%s: ", hs->sc_hc->hp_xname);
+ printf("%s: ", hs->sc_dev.dv_xname);
if (ints & INTS_RST) {
DELAY(100);
if (hd->scsi_hconf & HCONF_SD)
int len;
u_char xferphase;
{
- volatile register struct scsidevice *hd =
- (struct scsidevice *)hs->sc_hc->hp_addr;
+ volatile register struct scsidevice *hd = hs->sc_regs;
u_char phase, ints;
register int wait;
default:
printf("%s: unexpected phase %d in icmd from %d\n",
- hs->sc_hc->hp_xname, phase, target);
+ hs->sc_dev.dv_xname, phase, target);
goto abort;
}
/* wait for last command to complete */
default:
printf("%s: unexpected phase %d in finishxfer from %d\n",
- hs->sc_hc->hp_xname, phase, target);
+ hs->sc_dev.dv_xname, phase, target);
goto abort;
}
if (ints = hd->scsi_ints) {
scsi_test_unit_rdy(ctlr, slave, unit)
int ctlr, slave, unit;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
static struct scsi_cdb6 cdb = { CMD_TEST_UNIT_READY };
cdb.lun = unit;
u_char *buf;
unsigned len;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
static struct scsi_cdb6 cdb = { CMD_REQUEST_SENSE };
cdb.lun = unit;
u_char *buf;
u_int len;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
cdb->cdb[1] |= unit << 5;
return (scsiicmd(hs, slave, cdb->cdb, cdb->len, buf, len,
daddr_t blk;
int bshift;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
struct scsi_cdb10 cdb;
int stat;
int old_wait = scsi_data_wait;
daddr_t blk;
int bshift;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
struct scsi_cdb10 cdb;
int stat;
int old_wait = scsi_data_wait;
}
int
-scsireq(dq)
- register struct devqueue *dq;
+scsireq(pdev, sq)
+ struct device *pdev;
+ struct scsiqueue *sq;
{
- register struct devqueue *hq;
+ struct scsi_softc *hs = (struct scsi_softc *)pdev;
+ int s;
- hq = &scsi_softc[dq->dq_ctlr].sc_sq;
- insque(dq, hq->dq_back);
- if (dq->dq_back == hq)
- return(1);
- return(0);
+ s = splhigh(); /* XXXthorpej */
+ TAILQ_INSERT_TAIL(&hs->sc_queue, sq, sq_list);
+ splx(s);
+
+ if (hs->sc_queue.tqh_first == sq)
+ return (1);
+
+ return (0);
}
int
scsiustart(unit)
int unit;
{
- register struct scsi_softc *hs = &scsi_softc[unit];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[unit];
- hs->sc_dq.dq_ctlr = DMA0 | DMA1;
+ hs->sc_dq.dq_chan = DMA0 | DMA1;
hs->sc_flags |= SCSI_HAVEDMA;
if (dmareq(&hs->sc_dq))
return(1);
}
void
-scsistart(unit)
- int unit;
+scsistart(arg)
+ void *arg;
{
- register struct devqueue *dq;
-
- dq = scsi_softc[unit].sc_sq.dq_forw;
- (dq->dq_driver->d_go)(dq->dq_unit);
+ struct scsi_softc *hs = arg;
+ struct scsiqueue *sq;
+
+ sq = hs->sc_queue.tqh_first;
+ (sq->sq_go)(sq->sq_softc);
}
int
struct scsi_fmt_cdb *cdb;
int pad;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
- volatile register struct scsidevice *hd =
- (struct scsidevice *)hs->sc_hc->hp_addr;
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
+ volatile register struct scsidevice *hd = hs->sc_regs;
int i, dmaflags;
u_char phase, ints, cmd;
default:
printf("%s: unexpected phase %d in go from %d\n",
- hs->sc_hc->hp_xname, phase, slave);
+ hs->sc_dev.dv_xname, phase, slave);
goto abort;
}
while ((ints = hd->scsi_ints) == 0) {
dmaflags |= DMAGO_LWORD;
} else
dmaflags |= DMAGO_WORD;
- dmago(hs->sc_dq.dq_ctlr, bp->b_un.b_addr, bp->b_bcount, dmaflags);
+ dmago(hs->sc_dq.dq_chan, bp->b_un.b_addr, bp->b_bcount, dmaflags);
if (bp->b_flags & B_READ) {
cmd |= CSR_DMAIN;
* DMA enable bits must be set after size and direction bits.
*/
hd->scsi_csr = cmd;
- hd->scsi_csr |= (CSR_DE0 << hs->sc_dq.dq_ctlr);
+ hd->scsi_csr |= (CSR_DE0 << hs->sc_dq.dq_chan);
/*
* Setup the SPC for the transfer. We don't want to take
* first a command complete then a service required interrupt
hs->sc_flags |= SCSI_PAD;
if (i & 1)
printf("%s: odd byte count: %d bytes @ %d\n",
- hs->sc_hc->hp_xname, i, bp->b_cylin);
+ hs->sc_dev.dv_xname, i, bp->b_cylin);
#endif
} else
i += 4;
}
void
-scsidone(unit)
- register int unit;
+scsidone(arg)
+ void *arg;
{
- volatile register struct scsidevice *hd =
- (struct scsidevice *)scsi_softc[unit].sc_hc->hp_addr;
+ struct scsi_softc *hs = arg;
+ volatile register struct scsidevice *hd = hs->sc_regs;
#ifdef DEBUG
if (scsi_debug)
- printf("%s: done called!\n", scsi_softc[unit].sc_hc->hp_xname);
+ printf("%s: done called!\n", hs->sc_dev.dv_xname);
#endif
/* dma operation is done -- turn off card dma */
hd->scsi_csr &=~ (CSR_DE1|CSR_DE0);
void *arg;
{
register struct scsi_softc *hs = arg;
- volatile register struct scsidevice *hd =
- (struct scsidevice *)hs->sc_hc->hp_addr;
+ volatile register struct scsidevice *hd = hs->sc_regs;
register u_char ints;
- register struct devqueue *dq;
- int unit = hs->sc_hc->hp_unit;
+ register struct scsiqueue *sq;
+ int unit = hs->sc_dev.dv_unit;
if ((hd->scsi_csr & (CSR_IE|CSR_IR)) != (CSR_IE|CSR_IR))
return (0);
+ sq = hs->sc_queue.tqh_first;
+
ints = hd->scsi_ints;
if ((ints & INTS_SRV_REQ) && (hs->sc_flags & SCSI_IO)) {
/*
len -= 4;
hs->sc_flags &=~ SCSI_PAD;
#endif
- dq = hs->sc_sq.dq_forw;
- finishxfer(hs, hd, dq->dq_slave);
+ finishxfer(hs, hd, sq->sq_target);
hs->sc_flags &=~ (SCSI_IO|SCSI_HAVEDMA);
dmafree(&hs->sc_dq);
- (dq->dq_driver->d_intr)(dq->dq_softc, hs->sc_stat[0]);
+ (sq->sq_intr)(sq->sq_softc, hs->sc_stat[0]);
} else {
/* Something unexpected happened -- deal with it. */
hd->scsi_ints = ints;
hd->scsi_csr = 0;
scsierror(hs, hd, ints);
- scsiabort(dq->dq_slave, hs, hd, "intr");
+ scsiabort(sq->sq_target, hs, hd, "intr");
if (hs->sc_flags & SCSI_IO) {
hs->sc_flags &=~ (SCSI_IO|SCSI_HAVEDMA);
dmafree(&hs->sc_dq);
- dq = hs->sc_sq.dq_forw;
- (dq->dq_driver->d_intr)(dq->dq_softc, -1);
+ (sq->sq_intr)(sq->sq_softc, -1);
}
}
return(1);
}
void
-scsifree(dq)
- register struct devqueue *dq;
+scsifree(pdev, sq)
+ struct device *pdev;
+ struct scsiqueue *sq;
{
- register struct devqueue *hq;
+ struct scsi_softc *hs = (struct scsi_softc *)pdev;
+ int s;
+
+ s = splhigh(); /* XXXthorpej */
+ TAILQ_REMOVE(&hs->sc_queue, sq, sq_list);
+ splx(s);
- hq = &scsi_softc[dq->dq_ctlr].sc_sq;
- remque(dq);
- if ((dq = hq->dq_forw) != hq)
- (dq->dq_driver->d_start)(dq->dq_unit);
+ if ((sq = hs->sc_queue.tqh_first) != NULL)
+ (*sq->sq_start)(sq->sq_softc);
}
/*
u_char *buf;
u_int len;
{
- register struct scsi_softc *hs = &scsi_softc[ctlr];
+ struct scsi_softc *hs = oscsi_cd.cd_devs[ctlr];
struct scsi_cdb6 cdb;
u_char iphase;
int stat;
bcopy(src, dst, len);
dst[len] = '\0';
}
-#endif
+
+/*
+ * Probe for a device at the given ctlr/target/lun, and fill in the inqbuf.
+ */
+int
+scsi_probe_device(ctlr, targ, lun, inqbuf, inqlen)
+ int ctlr, targ, lun;
+ struct scsi_inquiry *inqbuf;
+ int inqlen;
+{
+ static struct scsi_fmt_cdb inq = {
+ 6, CMD_INQUIRY, 0, 0, 0, 0, 0
+ };
+ int i, tries = 10, isrm = 0;
+
+ inq.cdb[4] = inqlen & 0xff;
+
+ scsi_delay(-1);
+
+ /*
+ * See if the unit exists.
+ */
+ while ((i = scsi_test_unit_rdy(ctlr, targ, lun)) != 0) {
+ if (i == -1 || --tries < 0) {
+ if (isrm)
+ break;
+ /* doesn't exist or not a CCS device */
+ goto failed;
+ }
+ if (i == STS_CHECKCOND) {
+ u_char sensebuf[128];
+ struct scsi_xsense *sp =
+ (struct scsi_xsense *)sensebuf;
+
+ scsi_request_sense(ctlr, targ, lun, sensebuf,
+ sizeof(sensebuf));
+ if (sp->class == 7) {
+ switch (sp->key) {
+ /*
+ * Not ready -- might be removable media
+ * device with no media. Assume as much,
+ * if it really isn't, the inquiry command
+ * below will fail.
+ */
+ case 2:
+ isrm = 1;
+ break;
+ /* drive doing an RTZ -- give it a while */
+ case 6:
+ delay(1000000);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ delay(1000);
+ }
+
+ /*
+ * Find out about the device.
+ */
+ if (scsi_immed_command(ctlr, targ, lun, &inq, (u_char *)inqbuf,
+ inqlen, B_READ))
+ goto failed;
+
+ scsi_delay(0);
+ return (0);
+
+ failed:
+ scsi_delay(0);
+ return (-1);
+}
-/* $OpenBSD: scsivar.h,v 1.3 1997/01/12 15:13:02 downsj Exp $ */
-/* $NetBSD: scsivar.h,v 1.5 1995/12/02 18:22:14 thorpej Exp $ */
+/* $OpenBSD: scsivar.h,v 1.4 1997/02/03 04:47:45 downsj Exp $ */
+/* $NetBSD: scsivar.h,v 1.6 1997/01/30 09:08:56 thorpej Exp $ */
/*
+ * Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* @(#)scsivar.h 8.1 (Berkeley) 6/10/93
*/
-struct scsi_softc {
- struct hp_ctlr *sc_hc;
- struct devqueue sc_dq;
- struct devqueue sc_sq;
- u_char sc_flags;
- u_char sc_sync;
- u_char sc_scsi_addr;
- u_char sc_scsiid; /* XXX unencoded copy of sc_scsi_addr */
- u_char sc_stat[2];
- u_char sc_msg[7];
+#include <sys/queue.h>
+
+/*
+ * A SCSI job queue entry. Target drivers each have of of these,
+ * used to queue requests with the initiator.
+ */
+struct scsiqueue {
+ TAILQ_ENTRY(scsiqueue) sq_list; /* entry on queue */
+ void *sq_softc; /* target's softc */
+ int sq_target; /* target on bus */
+ int sq_lun; /* lun on target */
+
+ /*
+ * Callbacks used to start and stop the target driver.
+ */
+ void (*sq_start) __P((void *));
+ void (*sq_go) __P((void *));
+ void (*sq_intr) __P((void *, int));
};
-/* sc_flags */
-#define SCSI_IO 0x80 /* DMA I/O in progress */
-#define SCSI_DMA32 0x40 /* 32-bit DMA should be used */
-#define SCSI_HAVEDMA 0x04 /* controller has DMA channel */
-#ifdef DEBUG
-#define SCSI_PAD 0x02 /* 'padded' transfer in progress */
-#endif
-#define SCSI_ALIVE 0x01 /* controller initialized */
+struct scsi_inquiry;
+struct scsi_fmt_cdb;
+
+struct oscsi_attach_args {
+ int osa_target; /* target */
+ int osa_lun; /* logical unit */
+ /* inquiry data */
+ struct scsi_inquiry *osa_inqbuf;
+};
+
+int scsi_probe_device __P((int, int, int, struct scsi_inquiry *, int));
+int scsi_print __P((void *, const char *));
+
+void scsireset __P((int));
+int scsireq __P((struct device *, struct scsiqueue *));
+void scsifree __P((struct device *, struct scsiqueue *));
+int scsigo __P((int, int, int, struct buf *, struct scsi_fmt_cdb *, int));
+int scsi_request_sense __P((int, int, int, u_char *, u_int));
+int scsiustart __P((int));
+int scsi_tt_write __P((int, int, int, u_char *, u_int, daddr_t, int));
+int scsi_tt_oddio __P((int, int, int, u_char *, u_int, int, int));
+int scsi_immed_command __P((int, int, int, struct scsi_fmt_cdb *,
+ u_char *, u_int, int));
+void scsi_str __P((char *, char *, size_t));
+int scsi_test_unit_rdy __P((int, int, int));
-/* $OpenBSD: sd.c,v 1.6 1997/01/12 15:13:03 downsj Exp $ */
-/* $NetBSD: sd.c,v 1.28 1997/01/07 09:29:30 thorpej Exp $ */
+/* $OpenBSD: sd.c,v 1.7 1997/02/03 04:47:47 downsj Exp $ */
+/* $NetBSD: sd.c,v 1.29 1997/01/30 09:14:20 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
/*
* SCSI CCS (Command Command Set) disk driver.
*/
-#include "sd.h"
-#if NSD > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/ioctl.h>
#include <sys/fcntl.h>
+#include <sys/device.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/scsireg.h>
+#include <hp300/dev/scsivar.h>
+
#include <hp300/dev/sdvar.h>
+
#ifdef USELEDS
#include <hp300/hp300/led.h>
#endif
#include <vm/vm_prot.h>
#include <vm/pmap.h>
-extern int scsi_test_unit_rdy();
-extern int scsi_request_sense();
-extern int scsi_inquiry();
-extern int scsi_read_capacity();
-extern int scsi_tt_write();
-extern int scsireq();
-extern int scsiustart();
-extern int scsigo();
-extern void scsifree();
-extern void scsireset();
-extern void scsi_delay();
-extern void scsi_str __P((char *, char *, size_t));
-
extern void disksort();
extern void biodone();
extern int physio();
extern void TBIS();
-int sdmatch();
-void sdattach(), sdstrategy(), sdstart(), sdustart(), sdgo(), sdintr();
+int sdmatch __P((struct device *, void *, void *));
+void sdattach __P((struct device *, struct device *, void *));
-struct driver sddriver = {
- sdmatch, sdattach, "sd", (int (*)())sdstart,
- (int (*)())sdgo, (int (*)())sdintr,
+struct cfattach sd_ca = {
+ sizeof(struct sd_softc), sdmatch, sdattach
};
+struct cfdriver sd_cd = {
+ NULL, "sd", DV_DISK
+};
+
+void sdstrategy __P((struct buf *));
+void sdustart __P((int));
+
+void sdstart __P((void *));
+void sdgo __P((void *));
+void sdintr __P((void *, int));
+
+int sdgetcapacity __P((struct sd_softc *, dev_t));
+
+static void sdgetgeom __P((struct sd_softc *));
+
#ifdef DEBUG
int sddebug = 1;
#define SDB_ERROR 0x01
#define SDB_CAPACITY 0x04
#endif
-struct sd_softc sd_softc[NSD];
-struct sdstats sdstats[NSD];
-struct buf sdtab[NSD];
-struct scsi_fmt_cdb sdcmd[NSD];
-struct scsi_fmt_sense sdsense[NSD];
-
static struct scsi_fmt_cdb sd_read_cmd = { 10, CMD_READ_EXT };
static struct scsi_fmt_cdb sd_write_cmd = { 10, CMD_WRITE_EXT };
/*f0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-static struct scsi_inquiry inqbuf;
-static struct scsi_fmt_cdb inq = {
- 6,
- CMD_INQUIRY, 0, 0, 0, sizeof(inqbuf), 0
-};
-
/*
* Perform a mode-sense on page 0x04 (rigid geometry).
*/
static void
-sdgetgeom(sc, hd)
+sdgetgeom(sc)
struct sd_softc *sc;
- struct hp_device *hd;
{
struct scsi_mode_sense_geom {
struct scsi_modesense_hdr header;
};
int ctlr, slave, unit;
- ctlr = hd->hp_ctlr;
- slave = hd->hp_slave;
- unit = sc->sc_punit;
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_target;
+ unit = sc->sc_lun;
+ scsi_delay(-1); /* XXX */
(void)scsi_immed_command(ctlr, slave, unit, &modesense_geom,
(u_char *)&sensebuf, sizeof(sensebuf), B_READ);
+ scsi_delay(0); /* XXX */
sc->sc_heads = sensebuf.geom.heads;
sc->sc_cyls = (sensebuf.geom.cyl_ub << 16) |
(sensebuf.geom.cyl_mb << 8) | sensebuf.geom.cyl_lb;
}
-static int
-sdident(sc, hd, verbose)
- struct sd_softc *sc;
- struct hp_device *hd;
- int verbose;
+int
+sdmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- int unit;
- register int ctlr, slave;
- register int i;
- register int tries = 10;
- char vendor[9], product[17], revision[5];
- int isrm = 0;
-
- ctlr = hd->hp_ctlr;
- slave = hd->hp_slave;
- unit = sc->sc_punit;
- scsi_delay(-1);
+ struct oscsi_attach_args *osa = aux;
- /*
- * See if unit exists and is a disk then read block size & nblocks.
- */
- while ((i = scsi_test_unit_rdy(ctlr, slave, unit)) != 0) {
- if (i == -1 || --tries < 0) {
- if (isrm)
- break;
- /* doesn't exist or not a CCS device */
- goto failed;
- }
- if (i == STS_CHECKCOND) {
- u_char sensebuf[128];
- struct scsi_xsense *sp = (struct scsi_xsense *)sensebuf;
-
- scsi_request_sense(ctlr, slave, unit, sensebuf,
- sizeof(sensebuf));
- if (sp->class == 7)
- switch (sp->key) {
- /*
- * Not ready -- might be removable media
- * device with no media. Assume as much,
- * if it really isn't, the inquiry commmand
- * below will fail.
- */
- case 2:
- isrm = 1;
- break;
- /* drive doing an RTZ -- give it a while */
- case 6:
- DELAY(1000000);
- break;
- default:
- break;
- }
- }
- DELAY(1000);
- }
- /*
- * Find out about device
- */
- if (scsi_immed_command(ctlr, slave, unit, &inq,
- (u_char *)&inqbuf, sizeof(inqbuf), B_READ))
- goto failed;
- switch (inqbuf.type) {
+ switch (osa->osa_inqbuf->type) {
case 0: /* disk */
case 4: /* WORM */
case 5: /* CD-ROM */
case 7: /* Magneto-optical */
break;
default: /* not a disk */
- goto failed;
+ return 0;
}
- /*
- * Get a usable id string
- */
- bzero(vendor, sizeof(vendor));
- bzero(product, sizeof(product));
- bzero(revision, sizeof(revision));
- switch (inqbuf.version) {
- case 1:
- case 2:
- scsi_str(inqbuf.vendor_id, vendor, sizeof(inqbuf.vendor_id));
- scsi_str(inqbuf.product_id, product,
- sizeof(inqbuf.product_id));
- scsi_str(inqbuf.rev, revision, sizeof(inqbuf.rev));
- break;
- default:
- bcopy("UNKNOWN", vendor, 8);
- bcopy("DRIVE TYPE", product, 11);
- }
- if (inqbuf.qual & 0x80)
- sc->sc_flags |= SDF_RMEDIA;
- if (sdgetcapacity(sc, hd, NODEV) < 0)
- goto failed;
-
- switch (inqbuf.version) {
- case 1:
- case 2:
- if (verbose) {
- printf(": <%s, %s, %s>", vendor, product, revision);
- if (inqbuf.version == 2)
- printf(" (SCSI-2)");
- }
- break;
- default:
- if (verbose)
- printf(": type 0x%x, qual 0x%x, ver %d",
- inqbuf.type, inqbuf.qual, inqbuf.version);
- break;
- }
- if (verbose)
- printf("\n");
-
- if (verbose) {
- /*
- * Print out some additional information.
- */
- printf("%s: ", hd->hp_xname);
- switch (inqbuf.type) {
- case 4:
- printf("WORM, ");
- break;
-
- case 5:
- printf("CD-ROM, ");
- break;
+ return (1);
+}
- case 7:
- printf("Magneto-optical, ");
- break;
+void
+sdattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct sd_softc *sc = (struct sd_softc *)self;
+ struct oscsi_attach_args *osa = aux;
- default:
- printf("%d cylinders, %d heads, ",
- sc->sc_cyls, sc->sc_heads);
- }
+ /*
+ * XXX formerly 0 meant unused but now pid 0 can legitimately
+ * use this interface (sdgetcapacity).
+ */
+ sc->sc_format_pid = -1;
+ sc->sc_flags = 0;
- if (sc->sc_blks)
- printf("%d blocks, %d bytes/block\n",
- sc->sc_blks >> sc->sc_bshift, sc->sc_blksize);
- else
- printf("drive empty\n");
- }
+ sc->sc_target = osa->osa_target;
+ sc->sc_lun = osa->osa_lun;
+ sc->sc_type = osa->osa_inqbuf->type;
- scsi_delay(0);
- return(inqbuf.type);
-failed:
- scsi_delay(0);
- return(-1);
-}
+ if (osa->osa_inqbuf->qual & 0x80)
+ sc->sc_flags |= SDF_RMEDIA;
-int
-sdmatch(hd)
- register struct hp_device *hd;
-{
- register struct sd_softc *sc = &sd_softc[hd->hp_unit];
+ printf("\n");
- /* XXX set up external name */
- bzero(sc->sc_xname, sizeof(sc->sc_xname));
- sprintf(sc->sc_xname, "sd%d", hd->hp_unit);
+ /* Initialize the SCSI queue entry. */
+ sc->sc_sq.sq_softc = sc;
+ sc->sc_sq.sq_target = sc->sc_target;
+ sc->sc_sq.sq_lun = sc->sc_lun;
+ sc->sc_sq.sq_start = sdstart;
+ sc->sc_sq.sq_go = sdgo;
+ sc->sc_sq.sq_intr = sdintr;
- /* Initialize the disk structure. */
- bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
- sc->sc_dkdev.dk_name = sc->sc_xname;
+ if (sdgetcapacity(sc, NODEV) < 0) {
+ printf("%s: getcapacity failed!\n", sc->sc_dev.dv_xname);
+ return;
+ }
- sc->sc_hd = hd;
- sc->sc_flags = 0;
/*
- * XXX formerly 0 meant unused but now pid 0 can legitimately
- * use this interface (sdgetcapacity).
+ * Print out some additional information.
*/
- sc->sc_format_pid = -1;
- sc->sc_punit = sdpunit(hd->hp_flags);
- sc->sc_type = sdident(sc, hd, 0);
- if (sc->sc_type < 0)
- return (0);
+ printf("%s: ", sc->sc_dev.dv_xname);
+ switch (sc->sc_type) {
+ case 4:
+ printf("WORM, ");
+ break;
- return (1);
-}
+ case 5:
+ printf("CD-ROM, ");
+ break;
-void
-sdattach(hd)
- register struct hp_device *hd;
-{
- struct sd_softc *sc = &sd_softc[hd->hp_unit];
+ case 7:
+ printf("Magneto-optical, ");
+ break;
- (void)sdident(sc, hd, 1); /* XXX Ick. */
+ default:
+ printf("%d cylinders, %d heads, ",
+ sc->sc_cyls, sc->sc_heads);
+ }
+ if (sc->sc_blks)
+ printf("%d blocks, %d bytes/block\n",
+ sc->sc_blks >> sc->sc_bshift, sc->sc_blksize);
+ else
+ printf("drive empty\n");
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_ctlr = hd->hp_ctlr;
- sc->sc_dq.dq_unit = hd->hp_unit;
- sc->sc_dq.dq_slave = hd->hp_slave;
- sc->sc_dq.dq_driver = &sddriver;
+ /* Initialize the disk structure. */
+ sc->sc_dkdev.dk_name = sc->sc_dev.dv_xname;
/* Attach the disk. */
disk_attach(&sc->sc_dkdev);
- sc->sc_flags |= SDF_ALIVE;
+ dk_establish(&sc->sc_dkdev, &sc->sc_dev); /* XXX */
- /* XXX Set device class. */
- hd->hp_dev.dv_class = DV_DISK;
+ sc->sc_flags |= SDF_ALIVE;
}
void
-sdreset(sc, hd)
+sdreset(sc)
register struct sd_softc *sc;
- register struct hp_device *hd;
{
- sdstats[hd->hp_unit].sdresets++;
+ sc->sc_stats.sdresets++;
}
/*
* due to missing media.
*/
int
-sdgetcapacity(sc, hd, dev)
+sdgetcapacity(sc, dev)
struct sd_softc *sc;
- struct hp_device *hd;
dev_t dev;
{
static struct scsi_fmt_cdb cap = {
capbuf = malloc(capbufsize, M_DEVBUF, M_WAITOK);
if (dev == NODEV) {
- i = scsi_immed_command(hd->hp_ctlr, hd->hp_slave, sc->sc_punit,
- &cap, capbuf, capbufsize, B_READ);
+ scsi_delay(-1); /* XXX */
+ i = scsi_immed_command(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, &cap, capbuf,
+ capbufsize, B_READ);
+ scsi_delay(0); /* XXX */
} else {
struct buf *bp;
panic("sdgetcapacity");
bp = malloc(sizeof *bp, M_DEVBUF, M_WAITOK);
sc->sc_format_pid = curproc->p_pid;
- bcopy((caddr_t)&cap, (caddr_t)&sdcmd[hd->hp_unit], sizeof cap);
+ bcopy(&cap, &sc->sc_cmdstore, sizeof cap);
bp->b_dev = dev;
bp->b_flags = B_READ | B_BUSY;
bp->b_un.b_addr = (caddr_t)capbuf;
bp->b_bcount = capbufsize;
sdstrategy(bp);
- i = biowait(bp) ? sdsense[hd->hp_unit].status : 0;
+ i = biowait(bp) ? sc->sc_sensestore.status : 0;
free(bp, M_DEVBUF);
sc->sc_format_pid = -1;
}
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
printf("%s: read_capacity returns %d\n",
- hd->hp_xname, i);
+ sc->sc_dev.dv_xname, i);
#endif
free(capbuf, M_DEVBUF);
return (-1);
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
printf("%s: removable media not present\n",
- hd->hp_xname);
+ sc->sc_dev.dv_xname);
#endif
free(capbuf, M_DEVBUF);
return (1);
if (sc->sc_blksize != DEV_BSIZE) {
if (sc->sc_blksize < DEV_BSIZE) {
printf("%s: need at least %d byte blocks - %s\n",
- hd->hp_xname, DEV_BSIZE, "drive ignored");
+ sc->sc_dev.dv_xname, DEV_BSIZE, "drive ignored");
return (-1);
}
for (i = sc->sc_blksize; i > DEV_BSIZE; i >>= 1)
}
#ifdef DEBUG
if (sddebug & SDB_CAPACITY)
- printf("%s: blks=%d, blksize=%d, bshift=%d\n", hd->hp_xname,
- sc->sc_blks, sc->sc_blksize, sc->sc_bshift);
+ printf("%s: blks=%d, blksize=%d, bshift=%d\n",
+ sc->sc_dev.dv_xname, sc->sc_blks, sc->sc_blksize,
+ sc->sc_bshift);
#endif
- sdgetgeom(sc, hd);
+ sdgetgeom(sc);
return (0);
}
dev_t dev;
{
int unit = sdunit(dev);
- register struct sd_softc *sc = &sd_softc[unit];
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register struct disklabel *lp = sc->sc_dkdev.dk_label;
register struct partition *pi;
char *msg, *readdisklabel();
* now.
*/
if ((sc->sc_flags & SDF_RMEDIA) || sc->sc_blks == 0) {
- switch (sdgetcapacity(sc, sc->sc_hd, dev)) {
+ switch (sdgetcapacity(sc, dev)) {
case 0:
break;
case -1:
}
pi = lp->d_partitions;
- printf("%s: WARNING: %s, ", sc->sc_hd->hp_xname, msg);
+ printf("%s: WARNING: %s, ", sc->sc_dev.dv_xname, msg);
#ifdef COMPAT_NOLABEL
if (usedefault) {
printf("using old default partitioning\n");
struct proc *p;
{
register int unit = sdunit(dev);
- register struct sd_softc *sc = &sd_softc[unit];
+ struct sd_softc *sc;
int error, mask, part;
- if (unit >= NSD || (sc->sc_flags & SDF_ALIVE) == 0)
- return(ENXIO);
+ if (unit >= sd_cd.cd_ndevs ||
+ (sc = sd_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & SDF_ALIVE) == 0)
+ return (ENXIO);
/*
* Wait for any pending opens/closes to complete
struct proc *p;
{
int unit = sdunit(dev);
- register struct sd_softc *sc = &sd_softc[unit];
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register struct disk *dk = &sc->sc_dkdev;
int mask, s;
if (dk->dk_openmask == 0) {
sc->sc_flags |= SDF_CLOSING;
s = splbio();
- while (sdtab[unit].b_active) {
+ while (sc->sc_tab.b_active) {
sc->sc_flags |= SDF_WANTED;
- sleep((caddr_t)&sdtab[unit], PRIBIO);
+ sleep((caddr_t)&sc->sc_tab, PRIBIO);
}
splx(s);
sc->sc_flags &= ~(SDF_CLOSING|SDF_WLABEL|SDF_ERROR);
register struct buf *bp;
register int bsize;
{
+ struct sd_softc *sc = sd_cd.cd_devs[sdunit(bp->b_dev)];
register struct buf *cbp = (struct buf *)malloc(sizeof(struct buf),
M_DEVBUF, M_WAITOK);
caddr_t cbuf = (caddr_t)malloc(bsize, M_DEVBUF, M_WAITOK);
register int count;
if (boff || resid < bsize) {
- sdstats[sdunit(bp->b_dev)].sdpartials++;
+ sc->sc_stats.sdpartials++;
count = min(resid, bsize - boff);
cbp->b_flags = B_BUSY | B_PHYS | B_READ;
cbp->b_blkno = bn - btodb(boff);
register struct buf *bp;
{
int unit = sdunit(bp->b_dev);
- register struct sd_softc *sc = &sd_softc[unit];
- register struct buf *dp = &sdtab[unit];
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
+ register struct buf *dp = &sc->sc_tab;
register struct partition *pinfo;
register daddr_t bn;
register int sz, s;
sdustart(unit)
register int unit;
{
- if (scsireq(&sd_softc[unit].sc_dq))
- sdstart(unit);
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
+
+ if (scsireq(sc->sc_dev.dv_parent, &sc->sc_sq))
+ sdstart(sc);
}
/*
* >0 if a fatal error
*/
static int
-sderror(unit, sc, hp, stat)
- int unit, stat;
- register struct sd_softc *sc;
- register struct hp_device *hp;
+sderror(sc, stat)
+ struct sd_softc *sc;
+ int stat;
{
int cond = 1;
- sdsense[unit].status = stat;
+ sc->sc_sensestore.status = stat;
if (stat & STS_CHECKCOND) {
struct scsi_xsense *sp;
- scsi_request_sense(hp->hp_ctlr, hp->hp_slave,
- sc->sc_punit, sdsense[unit].sense,
- sizeof(sdsense[unit].sense));
- sp = (struct scsi_xsense *)sdsense[unit].sense;
- printf("%s: scsi sense class %d, code %d", hp->hp_xname,
+ scsi_request_sense(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, sc->sc_sensestore.sense,
+ sizeof(sc->sc_sensestore.sense));
+ sp = (struct scsi_xsense *)(sc->sc_sensestore.sense);
+ printf("%s: scsi sense class %d, code %d", sc->sc_dev.dv_xname,
sp->class, sp->code);
if (sp->class == 7) {
printf(", key %d", sp->key);
}
static void
-sdfinish(unit, sc, bp)
- int unit;
- register struct sd_softc *sc;
- register struct buf *bp;
+sdfinish(sc, bp)
+ struct sd_softc *sc;
+ struct buf *bp;
{
- register struct buf *dp = &sdtab[unit];
+ register struct buf *dp = &sc->sc_tab;
dp->b_errcnt = 0;
dp->b_actf = bp->b_actf;
bp->b_resid = 0;
biodone(bp);
- scsifree(&sc->sc_dq);
+ scsifree(sc->sc_dev.dv_parent, &sc->sc_sq);
if (dp->b_actf)
- sdustart(unit);
+ sdustart(sc->sc_dev.dv_unit);
else {
dp->b_active = 0;
if (sc->sc_flags & SDF_WANTED) {
}
void
-sdstart(unit)
- register int unit;
+sdstart(arg)
+ void *arg;
{
- register struct sd_softc *sc = &sd_softc[unit];
- register struct hp_device *hp = sc->sc_hd;
+ struct sd_softc *sc = arg;
/*
* we have the SCSI bus -- in format mode, we may or may not need dma
* so check now.
*/
- if (sc->sc_format_pid >= 0 && legal_cmds[sdcmd[unit].cdb[0]] > 0) {
- register struct buf *bp = sdtab[unit].b_actf;
+ if (sc->sc_format_pid >= 0 && legal_cmds[sc->sc_cmdstore.cdb[0]] > 0) {
+ register struct buf *bp = sc->sc_tab.b_actf;
register int sts;
- sdtab[unit].b_errcnt = 0;
+ sc->sc_tab.b_errcnt = 0;
while (1) {
- sts = scsi_immed_command(hp->hp_ctlr, hp->hp_slave,
- sc->sc_punit, &sdcmd[unit],
- bp->b_un.b_addr, bp->b_bcount,
- bp->b_flags & B_READ);
- sdsense[unit].status = sts;
+ sts = scsi_immed_command(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, &sc->sc_cmdstore,
+ bp->b_un.b_addr, bp->b_bcount,
+ bp->b_flags & B_READ);
+ sc->sc_sensestore.status = sts;
if ((sts & 0xfe) == 0 ||
- (sts = sderror(unit, sc, hp, sts)) == 0)
+ (sts = sderror(sc, sts)) == 0)
break;
- if (sts > 0 || sdtab[unit].b_errcnt++ >= SDRETRY) {
+ if (sts > 0 || sc->sc_tab.b_errcnt++ >= SDRETRY) {
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
break;
}
}
- sdfinish(unit, sc, bp);
+ sdfinish(sc, bp);
- } else if (scsiustart(hp->hp_ctlr))
- sdgo(unit);
+ } else if (scsiustart(sc->sc_dev.dv_parent->dv_unit))
+ sdgo(sc);
}
void
-sdgo(unit)
- register int unit;
+sdgo(arg)
+ void *arg;
{
- register struct sd_softc *sc = &sd_softc[unit];
- register struct hp_device *hp = sc->sc_hd;
- register struct buf *bp = sdtab[unit].b_actf;
+ struct sd_softc *sc = arg;
+ register struct buf *bp = sc->sc_tab.b_actf;
register int pad;
register struct scsi_fmt_cdb *cmd;
if (sc->sc_format_pid >= 0) {
- cmd = &sdcmd[unit];
+ cmd = &sc->sc_cmdstore;
pad = 0;
} else {
/*
if (sc->sc_flags & SDF_ERROR) {
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
- sdfinish(unit, sc, bp);
+ sdfinish(sc, bp);
return;
}
cmd = bp->b_flags & B_READ? &sd_read_cmd : &sd_write_cmd;
#ifdef DEBUG
if (pad)
printf("%s: partial block xfer -- %x bytes\n",
- sc->sc_hd->hp_xname, bp->b_bcount);
+ sc->sc_dev.dv_xname, bp->b_bcount);
#endif
- sdstats[unit].sdtransfers++;
+ sc->sc_stats.sdtransfers++;
}
#ifdef USELEDS
if (inledcontrol == 0)
ledcontrol(0, 0, LED_DISK);
#endif
- if (scsigo(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
+ if (scsigo(sc->sc_dev.dv_parent->dv_unit, sc->sc_target, sc->sc_lun,
bp, cmd, pad) == 0) {
/* Instrumentation. */
disk_busy(&sc->sc_dkdev);
#ifdef DEBUG
if (sddebug & SDB_ERROR)
printf("%s: sdstart: %s adr %d blk %d len %d ecnt %d\n",
- sc->sc_hd->hp_xname,
+ sc->sc_dev.dv_xname,
bp->b_flags & B_READ? "read" : "write",
bp->b_un.b_addr, bp->b_cylin, bp->b_bcount,
- sdtab[unit].b_errcnt);
+ sc->sc_tab.b_errcnt);
#endif
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
- sdfinish(unit, sc, bp);
+ sdfinish(sc, bp);
}
void
int stat;
{
register struct sd_softc *sc = arg;
- int unit = sc->sc_hd->hp_unit;
- register struct buf *bp = sdtab[unit].b_actf;
- register struct hp_device *hp = sc->sc_hd;
+ int unit = sc->sc_dev.dv_unit;
+ register struct buf *bp = sc->sc_tab.b_actf;
int cond;
if (bp == NULL) {
- printf("%s: bp == NULL\n", sc->sc_hd->hp_xname);
+ printf("%s: bp == NULL\n", sc->sc_dev.dv_xname);
return;
}
#ifdef DEBUG
if (sddebug & SDB_ERROR)
printf("%s: sdintr: bad scsi status 0x%x\n",
- sc->sc_hd->hp_xname, stat);
+ sc->sc_dev.dv_xname, stat);
#endif
- cond = sderror(unit, sc, hp, stat);
+ cond = sderror(sc, stat);
if (cond) {
- if (cond < 0 && sdtab[unit].b_errcnt++ < SDRETRY) {
+ if (cond < 0 && sc->sc_tab.b_errcnt++ < SDRETRY) {
#ifdef DEBUG
if (sddebug & SDB_ERROR)
printf("%s: retry #%d\n",
- sc->sc_hd->hp_xname,
- sdtab[unit].b_errcnt);
+ sc->sc_dev.dv_xname,
+ sc->sc_tab.b_errcnt);
#endif
- sdstart(unit);
+ sdstart(sc);
return;
}
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
}
}
- sdfinish(unit, sc, bp);
+ sdfinish(sc, bp);
}
int
int flags;
{
register int unit = sdunit(dev);
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register int pid;
- if ((pid = sd_softc[unit].sc_format_pid) >= 0 &&
+ if ((pid = sc->sc_format_pid) >= 0 &&
pid != uio->uio_procp->p_pid)
return (EPERM);
int flags;
{
register int unit = sdunit(dev);
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register int pid;
- if ((pid = sd_softc[unit].sc_format_pid) >= 0 &&
+ if ((pid = sc->sc_format_pid) >= 0 &&
pid != uio->uio_procp->p_pid)
return (EPERM);
struct proc *p;
{
int unit = sdunit(dev);
- register struct sd_softc *sc = &sd_softc[unit];
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register struct disklabel *lp = sc->sc_dkdev.dk_label;
int error, flags;
return (EPERM);
if (legal_cmds[((struct scsi_fmt_cdb *)data)->cdb[0]] == 0)
return (EINVAL);
- bcopy(data, (caddr_t)&sdcmd[unit], sizeof(sdcmd[0]));
+ bcopy(data, &sc->sc_cmdstore, sizeof(struct scsi_fmt_cdb));
return (0);
case SDIOCSENSE:
* return the SCSI sense data saved after the last
* operation that completed with "check condition" status.
*/
- bcopy((caddr_t)&sdsense[unit], data, sizeof(sdsense[0]));
+ bcopy(&sc->sc_sensestore, data, sizeof(sc->sc_sensestore));
return (0);
}
dev_t dev;
{
register int unit = sdunit(dev);
- register struct sd_softc *sc = &sd_softc[unit];
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
int psize, didopen = 0;
- if (unit >= NSD || (sc->sc_flags & SDF_ALIVE) == 0)
- return(-1);
+ if (unit >= sd_cd.cd_ndevs ||
+ (sc = sd_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & SDF_ALIVE) == 0)
+ return (-1);
/*
* We get called very early on (via swapconf)
int nwrt; /* current number of sectors to write */
int unit, part;
struct sd_softc *sc;
- struct hp_device *hp;
struct disklabel *lp;
daddr_t baddr;
char stat;
part = sdpart(dev);
/* Make sure device is ok. */
- if (unit >= NSD)
- return (ENXIO);
- sc = &sd_softc[unit];
- if ((sc->sc_flags & SDF_ALIVE) == 0)
+ if (unit >= sd_cd.cd_ndevs ||
+ (sc = sd_cd.cd_devs[unit]) == NULL ||
+ (sc->sc_flags & SDF_ALIVE) == 0)
return (ENXIO);
- hp = sc->sc_hd;
/*
* Convert to disk sectors. Request must be a multiple of size.
* Send the data. Note the `0' argument for bshift;
* we've done the necessary conversion above.
*/
- stat = scsi_tt_write(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
- va, nwrt * sectorsize, blkno, 0);
+ stat = scsi_tt_write(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, va, nwrt * sectorsize,
+ blkno, 0);
if (stat) {
printf("\nsddump: scsi write error 0x%x\n", stat);
return (EIO);
}
#else /* SD_DUMP_NOT_TRUSTED */
/* Lets just talk about it first. */
- printf("%s: dump addr %p, blk %d\n", hp->hp_xname,
+ printf("%s: dump addr %p, blk %d\n", sc->sc_dev.dv_xname,
va, blkno);
delay(500 * 1000); /* half a second */
#endif /* SD_DUMP_NOT_TRUSTED */
sddoingadump = 0;
return (0);
}
-#endif
-/* $OpenBSD: sd_compat.c,v 1.3 1997/01/12 15:13:04 downsj Exp $ */
-/* $NetBSD: sd_compat.c,v 1.4 1996/01/07 22:02:20 thorpej Exp $ */
+/* $OpenBSD: sd_compat.c,v 1.4 1997/02/03 04:47:47 downsj Exp $ */
+/* $NetBSD: sd_compat.c,v 1.5 1997/01/30 09:14:21 thorpej Exp $ */
/*
* Copyright (c) 1990, 1993
/*
* Compatibility for SCSI disks without labels.
*/
-#include "sd.h"
-#if NSD > 0
#include <sys/param.h>
#include <sys/disklabel.h>
#include <sys/disk.h>
-#include <hp300/dev/device.h>
+#include <sys/device.h>
+#include <sys/buf.h> /* XXX */
+
+#include <hp300/dev/scsireg.h> /* XXX */
+#include <hp300/dev/scsivar.h>
#include <hp300/dev/sdvar.h>
/*
};
int sdnumdefaultpart = sizeof(sddefaultpart)/sizeof(sddefaultpart[0]);
-extern struct sd_softc sd_softc[];
-
sdmakedisklabel(unit, lp)
int unit;
register struct disklabel *lp;
{
- register struct sd_softc *sc = &sd_softc[unit];
+ extern struct cfdriver sd_cd;
+ struct sd_softc *sc = sd_cd.cd_devs[unit];
register struct partition *pi, *dpi;
register int dcount;
pi[5].p_offset = pi[5].p_size = 0;
}
}
-#endif
-/* $OpenBSD: sdvar.h,v 1.5 1997/01/12 15:13:04 downsj Exp $ */
-/* $NetBSD: sdvar.h,v 1.5 1996/06/06 16:17:45 thorpej Exp $ */
+/* $OpenBSD: sdvar.h,v 1.6 1997/02/03 04:47:48 downsj Exp $ */
+/* $NetBSD: sdvar.h,v 1.6 1997/01/30 09:14:22 thorpej Exp $ */
/*
* Copyright (c) 1990, 1993
* @(#)sdvar.h 8.1 (Berkeley) 6/10/93
*/
+struct sdstats {
+ long sdresets;
+ long sdtransfers;
+ long sdpartials;
+};
+
struct sd_softc {
- struct hp_device *sc_hd;
+ struct device sc_dev;
struct disk sc_dkdev;
- char sc_xname[8];
- struct devqueue sc_dq;
+ struct scsiqueue sc_sq;
int sc_format_pid; /* process using "format" mode */
short sc_flags;
short sc_type; /* drive type */
- short sc_punit; /* physical unit (scsi lun) */
+ int sc_target; /* SCSI target */
+ int sc_lun; /* SCSI lun */
u_short sc_bshift; /* convert device blocks to DEV_BSIZE blks */
u_int sc_blks; /* number of blocks on device */
int sc_blksize; /* device block size in bytes */
u_int sc_heads; /* number of heads (tracks) */
u_int sc_cyls; /* number of cylinders */
+ struct buf sc_tab; /* buffer queue */
+ struct sdstats sc_stats; /* debugging stats */
+ struct scsi_fmt_cdb sc_cmdstore;
+ struct scsi_fmt_sense sc_sensestore;
};
/* sc_flags values */
#define SDF_RMEDIA 0x20
#define SDF_ERROR 0x40
-struct sdstats {
- long sdresets;
- long sdtransfers;
- long sdpartials;
-};
-
#define sdunit(x) (minor(x) >> 3)
#define sdpart(x) (minor(x) & 0x7)
#define sdpunit(x) ((x) & 7)
-/* $OpenBSD: st.c,v 1.5 1997/01/12 15:13:05 downsj Exp $ */
-/* $NetBSD: st.c,v 1.18 1996/10/14 07:14:21 thorpej Exp $ */
+/* $OpenBSD: st.c,v 1.6 1997/02/03 04:47:49 downsj Exp $ */
+/* $NetBSD: st.c,v 1.19 1997/01/30 09:14:23 thorpej Exp $ */
/*
+ * Copyright (c) 1996, 1997 Jason R. Thorpe. All rights reserved.
* Copyright (c) 1990 University of Utah.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* support for the block device not implemented
*/
-#include "st.h"
-#if NST > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/buf.h>
#include <sys/mtio.h>
#include <sys/kernel.h>
#include <sys/tprintf.h>
+#include <sys/device.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/scsireg.h>
+#include <hp300/dev/scsivar.h>
+
#include <hp300/dev/stvar.h>
-extern int scsi_test_unit_rdy();
-extern int scsi_request_sense();
-extern int scsiustart();
-extern int scsigo();
-extern void scsifree();
-extern void scsireset();
-extern void scsi_delay();
-extern int scsi_tt_oddio();
-extern void scsi_str __P((char *, char *, size_t));
-
-extern int scsi_immed_command();
-
-int stmatch(), ststart(), stgo(), stintr();
-void stattach();
-struct driver stdriver = {
- stmatch, stattach, "st", ststart, stgo, stintr,
+struct st_xsense {
+ struct scsi_xsense sc_xsense; /* data from sense */
+ struct exb_xsense exb_xsense; /* additional info from exabyte */
};
struct st_softc {
- struct hp_device *sc_hd;
- struct devqueue sc_dq;
+ struct device sc_dev;
+ struct scsiqueue sc_sq;
long sc_blkno; /* (possible block device support?) */
long sc_resid; /* (possible block device support?) */
int sc_flags;
int sc_filepos; /* file position on tape */
long sc_numblks; /* number of blocks on tape */
short sc_type; /* ansi scsi type */
- short sc_punit; /* physical unit (scsi lun) */
+ int sc_target;
+ int sc_lun;
short sc_tapeid; /* tape drive id */
char sc_datalen[32]; /* additional data length on some commands */
short sc_tticntdwn; /* interrupts between TTi display updates */
tpr_t sc_ctty;
struct buf *sc_bp;
u_char sc_cmd;
-} st_softc[NST];
+ struct st_xsense sc_sense;
+ struct scsi_fmt_cdb sc_cmdstore;
+ struct buf sc_tab; /* buffer queue */
+ struct buf sc_bufstore; /* XXX buffer storage */
+};
/* softc flags */
#define STF_ALIVE 0x0001
#define STF_LEOT 0x0020
#define STF_MOVED 0x0040
-struct st_mode st_mode[NST];
+int stmatch __P((struct device *, void *, void *));
+void stattach __P((struct device *, struct device *, void *));
-/*
- * Maybe this should not be global, but gives chance to get
- * tape remaining, Rewrites/ECC, etc outside the driver
- */
-static struct st_xsense {
- struct scsi_xsense sc_xsense; /* data from sense */
- struct exb_xsense exb_xsense; /* additional info from exabyte */
-} st_xsense[NST];
+struct cfattach st_ca = {
+ sizeof(struct st_softc), stmatch, stattach
+};
-static struct scsi_fmt_cdb stcmd[NST];
+struct cfdriver st_cd = {
+ NULL, "st", DV_TAPE
+};
+
+void stustart __P((int));
+
+void ststart __P((void *));
+void stgo __P((void *));
+void stintr __P((void *, int));
static struct scsi_fmt_cdb st_read_cmd = { 6, CMD_READ };
static struct scsi_fmt_cdb st_write_cmd = { 6, CMD_WRITE };
-struct buf sttab[NST];
-struct buf stbuf[NST];
-
#define UNIT(x) (minor(x) & 3)
#define stpunit(x) ((x) & 7)
#endif
int
-stmatch(hd)
- register struct hp_device *hd;
+stmatch(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
{
- register struct st_softc *sc = &st_softc[hd->hp_unit];
- register struct buf *bp;
+ struct oscsi_attach_args *osa = aux;
- for (bp = sttab; bp < &sttab[NST]; bp++)
- bp->b_actb = &bp->b_actf;
- sc->sc_hd = hd;
- sc->sc_punit = stpunit(hd->hp_flags);
- sc->sc_type = stident(sc, hd, 0);
- if (sc->sc_type < 0)
+ if ((osa->osa_inqbuf->type != 0x01 || /* sequential access device */
+ osa->osa_inqbuf->qual != 0x80 || /* removable media */
+ (osa->osa_inqbuf->version != 0x01 &&
+ osa->osa_inqbuf->version != 0x02)) &&
+ (osa->osa_inqbuf->type != 0x01 || /* M4 ??! */
+ /*
+ * the M4 is a little too smart (ass?) for its own good:
+ * qual codes:
+ * 0x80: you can take the tape out (unit not online)
+ * 0xf8: online and at 6250bpi
+ * 0xf9: online and at 1600bpi
+ */
+ osa->osa_inqbuf->version != 0x09)) /* M4 tape */
return (0);
return (1);
}
void
-stattach(hd)
- register struct hp_device *hd;
-{
- struct st_softc *sc = &st_softc[hd->hp_unit];
-
- (void)stident(sc, hd, 1); /* XXX Ick. */
-
- sc->sc_dq.dq_softc = sc;
- sc->sc_dq.dq_ctlr = hd->hp_ctlr;
- sc->sc_dq.dq_unit = hd->hp_unit;
- sc->sc_dq.dq_slave = hd->hp_slave;
- sc->sc_dq.dq_driver = &stdriver;
- sc->sc_blkno = 0;
- sc->sc_flags = STF_ALIVE;
-
- /* XXX Set device class. */
- hd->hp_dev.dv_class = DV_TAPE;
-}
-
-int
-stident(sc, hd, verbose)
- register struct st_softc *sc;
- register struct hp_device *hd;
- int verbose;
+stattach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
{
- int unit;
- int ctlr, slave;
- int i, stat, inqlen;
+ struct st_softc *sc = (struct st_softc *)self;
+ struct oscsi_attach_args *osa = aux;
char vendor[9], product[17], revision[5];
+ int stat;
static int havest = 0;
- struct st_inquiry {
- struct scsi_inquiry inqbuf;
- struct exb_inquiry exb_inquiry;
- } st_inqbuf;
- static struct scsi_fmt_cdb st_inq = {
- 6,
- CMD_INQUIRY, 0, 0, 0, sizeof(st_inqbuf), 0
- };
- ctlr = hd->hp_ctlr;
- slave = hd->hp_slave;
- unit = sc->sc_punit;
- scsi_delay(-1);
+ printf("\n");
- inqlen = 0x05; /* min */
- st_inq.cdb[4] = 0x05;
- stat = scsi_immed_command(ctlr, slave, unit, &st_inq,
- (u_char *)&st_inqbuf, inqlen, B_READ);
- /* do twice as first command on some scsi tapes always fails */
- stat = scsi_immed_command(ctlr, slave, unit, &st_inq,
- (u_char *)&st_inqbuf, inqlen, B_READ);
- if (stat == -1)
- goto failed;
-
- if ((st_inqbuf.inqbuf.type != 0x01 || /* sequential access device */
- st_inqbuf.inqbuf.qual != 0x80 || /* removable media */
- (st_inqbuf.inqbuf.version != 0x01 && /* current ANSI SCSI spec */
- st_inqbuf.inqbuf.version != 0x02)) /* 0x02 is for HP DAT */
- &&
- (st_inqbuf.inqbuf.type != 0x01 || /* M4 ??! */
- /*
- * the M4 is a little too smart (ass?) for its own good:
- * qual codes:
- * 0x80: you can take the tape out (unit not online)
- * 0xf8: online and at 6250bpi
- * 0xf9: online and at 1600bpi
- */
- st_inqbuf.inqbuf.version != 0x09)) /* M4 tape */
-{
-printf("st: wrong specs: type %x qual %x version %d\n", st_inqbuf.inqbuf.type,
-st_inqbuf.inqbuf.qual, st_inqbuf.inqbuf.version);
- goto failed;
-}
-
- /* now get additonal info */
- inqlen = 0x05 + st_inqbuf.inqbuf.len;
- st_inq.cdb[4] = inqlen;
- bzero(&st_inqbuf, sizeof(st_inqbuf));
- stat = scsi_immed_command(ctlr, slave, unit, &st_inq,
- (u_char *)&st_inqbuf, inqlen, B_READ);
+ sc->sc_tab.b_actb = &sc->sc_tab.b_actf;
bzero(vendor, sizeof(vendor));
bzero(product, sizeof(product));
bzero(revision, sizeof(revision));
- if (st_inqbuf.inqbuf.len >= 28) {
- scsi_str(st_inqbuf.inqbuf.vendor_id, vendor,
- sizeof(st_inqbuf.inqbuf.vendor_id));
- scsi_str(st_inqbuf.inqbuf.product_id, product,
- sizeof(st_inqbuf.inqbuf.product_id));
- scsi_str(st_inqbuf.inqbuf.rev, revision,
- sizeof(st_inqbuf.inqbuf.rev));
- if (verbose)
- printf(": <%s, %s, %s>\n", vendor, product, revision);
- }
- if (stat == 0xff) {
- printf("st%d: Can't handle this tape drive\n", hd->hp_unit);
- goto failed;
- }
+ scsi_str(osa->osa_inqbuf->vendor_id, vendor,
+ sizeof(osa->osa_inqbuf->vendor_id));
+ scsi_str(osa->osa_inqbuf->product_id, product,
+ sizeof(osa->osa_inqbuf->product_id));
+ scsi_str(osa->osa_inqbuf->rev, revision,
+ sizeof(osa->osa_inqbuf->rev));
+
+ sc->sc_target = osa->osa_target;
+ sc->sc_lun = osa->osa_lun;
+
+ /* Initialize SCSI queue entry. */
+ sc->sc_sq.sq_softc = sc;
+ sc->sc_sq.sq_target = sc->sc_target;
+ sc->sc_sq.sq_lun = sc->sc_lun;
+ sc->sc_sq.sq_start = ststart;
+ sc->sc_sq.sq_go = stgo;
+ sc->sc_sq.sq_intr = stintr;
if (bcmp("EXB-8200", product, 8) == 0) {
sc->sc_tapeid = MT_ISEXABYTE;
sc->sc_datalen[CMD_MODE_SENSE] = 12;
} else if (bcmp("HP35450A", product, 8) == 0) {
/* XXX "extra" stat makes the HP drive happy at boot time */
- stat = scsi_test_unit_rdy(ctlr, slave, unit);
+ stat = scsi_test_unit_rdy(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun);
sc->sc_tapeid = MT_ISHPDAT;
sc->sc_datalen[CMD_REQUEST_SENSE] = 14;
sc->sc_datalen[CMD_INQUIRY] = 36;
sc->sc_datalen[CMD_MODE_SELECT] = 12;
sc->sc_datalen[CMD_MODE_SENSE] = 12;
} else {
- if (verbose)
- printf("%s: Unsupported tape device, faking it\n",
- sc->sc_hd->hp_xname);
+ printf("%s: Unsupported tape device, faking it\n",
+ sc->sc_dev.dv_xname);
sc->sc_tapeid = MT_ISAR;
sc->sc_datalen[CMD_REQUEST_SENSE] = 8;
sc->sc_datalen[CMD_INQUIRY] = 5;
sc->sc_filepos = 0;
/* load xsense */
- stxsense(ctlr, slave, unit, sc);
-
+ scsi_delay(-1);
+ stxsense(sc->sc_dev.dv_parent->dv_unit, sc->sc_target, sc->sc_lun, sc);
scsi_delay(0);
+
/* XXX if we have a tape, we must up the delays in the HA driver */
if (!havest) {
havest = 1;
scsi_delay(20000);
}
- return(st_inqbuf.inqbuf.type);
-failed:
- scsi_delay(0);
- return(-1);
+
+ sc->sc_blkno = 0;
+ sc->sc_flags = STF_ALIVE;
}
stopen(dev, flag, type, p)
int flag, type;
struct proc *p;
{
- register struct st_softc *sc = &st_softc[UNIT(dev)];
+ register struct st_softc *sc;
register struct st_xsense *xsense;
register int count;
register int stat;
CMD_MODE_SENSE, 0, 0, 0, sizeof(mode), 0
};
- ctlr = sc->sc_dq.dq_ctlr;
- slave = sc->sc_dq.dq_slave;
- unit = sc->sc_punit;
- xsense = &st_xsense[UNIT(dev)];
+ if (UNIT(dev) > st_cd.cd_ndevs ||
+ (sc = st_cd.cd_devs[UNIT(dev)]) == NULL ||
+ (sc->sc_flags & STF_ALIVE) == 0)
+ return (ENXIO);
- if (UNIT(dev) > NST || (sc->sc_flags & STF_ALIVE) == 0)
- return(ENXIO);
if (sc->sc_flags & STF_OPEN)
- return(EBUSY);
+ return (EBUSY);
+
+ ctlr = sc->sc_dev.dv_parent->dv_unit;
+ slave = sc->sc_target;
+ unit = sc->sc_lun;
+ xsense = &sc->sc_sense;
/*
* Be prepared to print error messages
#endif
if (stat == STS_CHECKCOND) {
stxsense(ctlr, slave, unit, sc);
- prtkey(UNIT(dev), sc);
+ prtkey(sc);
}
if (stat)
return(EIO);
xsense->exb_xsense.tnp)
uprintf("cartridge unloading\n");
else
- prtkey(UNIT(dev), sc);
+ prtkey(sc);
break;
case MT_ISMFOUR:
case MT_ISAR:
if (stat == STS_CHECKCOND) {
stxsense(ctlr, slave, unit, sc);
if (xsense->sc_xsense.key)
- prtkey(UNIT(dev), sc);
+ prtkey(sc);
} else {
sc->sc_filepos = 0; /* new tape */
stat = 0;
if (stat == STS_CHECKCOND) {
stxsense(ctlr, slave, unit, sc);
if (xsense->sc_xsense.key)
- prtkey(UNIT(dev), sc);
+ prtkey(sc);
}
break;
default:
- uprintf("%s: not ready\n", sc->sc_hd->hp_xname);
- prtkey(UNIT(dev), sc);
+ uprintf("%s: not ready\n", sc->sc_dev.dv_xname);
+ prtkey(sc);
break;
}
}
sc->sc_filepos = 0;
#ifdef DEBUG
if (st_debug & ST_FMKS)
- printf("%s: open filepos = %d\n", sc->sc_hd->hp_xname,
+ printf("%s: open filepos = %d\n", sc->sc_dev.dv_xname,
sc->sc_filepos);
#endif
dev_t dev;
int flag;
{
- register struct st_softc *sc = &st_softc[UNIT(dev)];
+ struct st_softc *sc = st_cd.cd_devs[UNIT(dev)];
register int hit = 0;
if ((sc->sc_flags & (STF_WMODE|STF_WRTTN)) == (STF_WMODE|STF_WRTTN)) {
stcommand(dev, MTFSR, 0);
#endif
/* make stats available */
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave, sc->sc_punit, sc);
+ stxsense(sc->sc_dev.dv_parent->dv_unit, sc->sc_target, sc->sc_lun, sc);
sc->sc_flags &= ~(STF_OPEN|STF_WMODE|STF_WRTTN);
tprintf_close(sc->sc_ctty);
ststrategy(bp)
register struct buf *bp;
{
+ struct st_softc *sc;
struct buf *dp;
int unit, s;
unit = UNIT(bp->b_dev);
- dp = &sttab[unit];
+ sc = st_cd.cd_devs[unit];
+
+ dp = &sc->sc_tab;
bp->b_actf = NULL;
s = splbio();
bp->b_actb = dp->b_actb;
splx(s);
}
+void
stustart(unit)
int unit;
{
- if (scsireq(&st_softc[unit].sc_dq))
- ststart(unit);
+ struct st_softc *sc = st_cd.cd_devs[unit];
+
+ if (scsireq(sc->sc_dev.dv_parent, &sc->sc_sq))
+ ststart(sc);
}
-ststart(unit)
- int unit;
+void
+ststart(arg)
+ void *arg;
{
- struct hp_device *hp = st_softc[unit].sc_hd;
+ struct st_softc *sc = arg;
- if (scsiustart(hp->hp_ctlr))
- stgo(unit);
+ if (scsiustart(sc->sc_dev.dv_parent->dv_unit))
+ stgo(arg);
}
-stgo(unit)
- int unit;
+void
+stgo(arg)
+ void *arg;
{
- register struct st_softc *sc = &st_softc[unit];
+ struct st_softc *sc = arg;
register struct scsi_fmt_cdb *cmd;
- register struct buf *bp = sttab[unit].b_actf;
- struct hp_device *hp = sc->sc_hd;
+ register struct buf *bp = sc->sc_tab.b_actf;
int pad, stat;
long nblks;
if (sc->sc_flags & STF_CMD) {
- cmd = &stcmd[unit];
+ cmd = &sc->sc_cmdstore;
pad = 0;
} else {
cmd = bp->b_flags & B_READ ? &st_read_cmd : &st_write_cmd;
if (bp->b_bcount % sc->sc_blklen) {
tprintf(sc->sc_ctty,
"%s: I/O not block aligned %d/%ld\n",
- sc->sc_hd->hp_xname, sc->sc_blklen,
+ sc->sc_dev.dv_xname, sc->sc_blklen,
bp->b_bcount);
cmd->cdb[1] &= 0xfe; /* force error */
}
#ifdef DEBUG
if (st_debug & ST_ODDIO)
printf("%s: stgo: odd count %d using manual transfer\n",
- sc->sc_hd->hp_xname, bp->b_bcount);
+ sc->sc_dev.dv_xname, bp->b_bcount);
#endif
- stat = scsi_tt_oddio(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
- bp->b_un.b_addr, bp->b_bcount,
- bp->b_flags, 1);
+ stat = scsi_tt_oddio(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, bp->b_un.b_addr, bp->b_bcount,
+ bp->b_flags, 1);
if (stat == 0) {
bp->b_resid = 0;
- stfinish(unit, sc, bp);
+ stfinish(sc, bp);
}
} else
- stat = scsigo(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
- bp, cmd, pad);
+ stat = scsigo(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, bp, cmd, pad);
if (stat) {
bp->b_error = EIO;
bp->b_flags |= B_ERROR;
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave,
- sc->sc_punit, sc);
- sterror(unit, sc, stat);
- stfinish(unit, sc, bp);
+ stxsense(sc->sc_dev.dv_parent->dv_unit, sc->sc_target,
+ sc->sc_lun, sc);
+ sterror(sc, stat);
+ stfinish(sc, bp);
}
}
-stfinish(unit, sc, bp)
- int unit;
+stfinish(sc, bp)
struct st_softc *sc;
struct buf *bp;
{
register struct buf *dp;
- sttab[unit].b_errcnt = 0;
+ sc->sc_tab.b_errcnt = 0;
if (dp = bp->b_actf)
dp->b_actb = bp->b_actb;
else
- sttab[unit].b_actb = bp->b_actb;
+ sc->sc_tab.b_actb = bp->b_actb;
*bp->b_actb = dp;
iodone(bp);
- scsifree(&sc->sc_dq);
- if (sttab[unit].b_actf)
- stustart(unit);
+ scsifree(sc->sc_dev.dv_parent, &sc->sc_sq);
+ if (sc->sc_tab.b_actf)
+ stustart(sc->sc_dev.dv_unit);
else
- sttab[unit].b_active = 0;
+ sc->sc_tab.b_active = 0;
}
int
int flag;
struct proc *p;
{
- register struct st_softc *sc = &st_softc[UNIT(dev)];
+ struct st_softc *sc = st_cd.cd_devs[UNIT(dev)];
register int cnt;
register struct mtget *mtget;
- register struct st_xsense *xp = &st_xsense[UNIT(dev)];
+ register struct st_xsense *xp = &sc->sc_sense;
register struct mtop *op;
long resid;
/* drive status */
case MTIOCGET:
mtget = (struct mtget *)data;
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave,
- sc->sc_punit, sc);
+ stxsense(sc->sc_dev.dv_parent->dv_unit, sc->sc_target,
+ sc->sc_lun, sc);
mtget->mt_type = sc->sc_tapeid;
mtget->mt_dsreg = 0;
mtget->mt_erreg = ((xp->sc_xsense.valid << 15) |
return(0);
}
+void
stintr(arg, stat)
void *arg;
int stat;
{
register struct st_softc *sc = arg;
- int unit = sc->sc_hd->hp_unit;
- register struct st_xsense *xp = &st_xsense[unit];
- register struct buf *bp = sttab[unit].b_actf;
- struct hp_device *hp = sc->sc_hd;
+ int unit = sc->sc_dev.dv_unit;
+ register struct st_xsense *xp = &sc->sc_sense;
+ register struct buf *bp = sc->sc_tab.b_actf;
#ifdef DEBUG
if (bp == NULL) {
- printf("%s: bp == NULL\n", sc->sc_hd->hp_xname);
+ printf("%s: bp == NULL\n", sc->sc_dev.dv_xname);
return;
}
#endif
/* more status */
case STS_CHECKCOND:
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave,
- sc->sc_punit, sc);
+ stxsense(sc->sc_dev.dv_parent->dv_unit, sc->sc_target,
+ sc->sc_lun, sc);
if (xp->sc_xsense.valid) {
bp->b_resid = (u_long)((xp->sc_xsense.info1 << 24) |
(xp->sc_xsense.info2 << 16) |
&& xp->sc_xsense.key != XSK_NOTUSED1
&& xp->sc_xsense.key != XSK_NOTUSEDC
&& xp->sc_xsense.key != XSK_NOTUSEDE) {
- sterror(unit, sc, stat);
+ sterror(sc, stat);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
break;
if (sc->sc_blklen) {
tprintf(sc->sc_ctty,
"%s: Incorrect Length Indicator, blkcnt diff %d\n",
- sc->sc_hd->hp_xname,
+ sc->sc_dev.dv_xname,
sc->sc_blklen - bp->b_resid);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
if (!st_dmaoddretry) {
tprintf(sc->sc_ctty,
"%s: Odd length read %d\n",
- sc->sc_hd->hp_xname,
+ sc->sc_dev.dv_xname,
bp->b_bcount - bp->b_resid);
bp->b_error = EIO;
bp->b_flags |= B_ERROR;
#ifdef DEBUG
if (st_debug & ST_ODDIO)
printf("%s: stintr odd count %d, do BSR then oddio\n",
- sc->sc_hd->hp_xname,
+ sc->sc_dev.dv_xname,
bp->b_bcount - bp->b_resid);
#endif
- stat = scsi_tt_oddio(hp->hp_ctlr, hp->hp_slave,
- sc->sc_punit, 0, -1, 0, 0);
+ stat =
+ scsi_tt_oddio(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, 0, -1, 0, 0);
if (stat == 0)
- stat = scsi_tt_oddio(hp->hp_ctlr,
- hp->hp_slave,
- sc->sc_punit,
- bp->b_un.b_addr,
- bp->b_bcount - bp->b_resid,
- bp->b_flags, 0);
+ stat = scsi_tt_oddio(
+ sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun,
+ bp->b_un.b_addr,
+ bp->b_bcount - bp->b_resid,
+ bp->b_flags, 0);
if (stat) {
bp->b_error = EIO;
bp->b_flags |= B_ERROR;
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave,
- sc->sc_punit, sc);
- sterror(unit, sc, stat);
+ stxsense(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, sc);
+ sterror(sc, stat);
}
}
break;
break;
}
tprintf(sc->sc_ctty, "%s: unknown scsi error\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
bp->b_flags |= B_ERROR;
bp->b_error = EIO;
break;
default:
- printf("%s: stintr unknown stat 0x%x\n", sc->sc_hd->hp_xname,
+ printf("%s: stintr unknown stat 0x%x\n", sc->sc_dev.dv_xname,
stat);
break;
}
* Mostly for TTi we, get a stxsense call in open and close.
*/
if (sc->sc_tticntdwn-- == 0) {
- stxsense(sc->sc_dq.dq_ctlr, sc->sc_dq.dq_slave,
- sc->sc_punit, sc);
+ stxsense(sc->sc_dev.dv_parent->dv_unit,
+ sc->sc_target, sc->sc_lun, sc);
sc->sc_tticntdwn = 100;
}
#endif
u_int command;
int cnt;
{
- register struct st_softc *sc = &st_softc[UNIT(dev)];
- register struct buf *bp = &stbuf[UNIT(dev)];
- register struct scsi_fmt_cdb *cmd = &stcmd[UNIT(dev)];
+ struct st_softc *sc = st_cd.cd_devs[UNIT(dev)];
+ register struct buf *bp = &sc->sc_bufstore;
+ register struct scsi_fmt_cdb *cmd = &sc->sc_cmdstore;
register cmdcnt;
int s;
cmd->len = 6; /* all tape commands are cdb6 */
- cmd->cdb[1] = sc->sc_punit;
+ cmd->cdb[1] = sc->sc_lun;
cmd->cdb[2] = cmd->cdb[3] = cmd->cdb[4] = cmd->cdb[5] = 0;
cmdcnt = 0;
break;
default:
printf("%s: stcommand bad command 0x%x\n",
- sc->sc_hd->hp_xname, command);
+ sc->sc_dev.dv_xname, command);
}
sc->sc_flags |= STF_CMD;
#ifdef DEBUG
if (st_debug & ST_FMKS)
printf("%s: stcommand filepos %d cmdcnt %d cnt %d\n",
- sc->sc_hd->hp_xname, sc->sc_filepos, cmdcnt, cnt);
+ sc->sc_dev.dv_xname, sc->sc_filepos, cmdcnt, cnt);
#endif
s = splbio();
while (bp->b_flags & B_BUSY) {
sc->sc_flags &= ~(STF_CMD|STF_WRTTN);
}
-sterror(unit, sc, stat)
- int unit, stat;
+sterror(sc, stat)
struct st_softc *sc;
+ int stat;
{
/* stxsense must have been called before sterror() */
if (stat & STS_CHECKCOND)
- prtkey(unit, sc);
+ prtkey(sc);
else if (stat)
tprintf(sc->sc_ctty,
- "%s: bad scsi status 0x%x\n", sc->sc_hd->hp_xname,
+ "%s: bad scsi status 0x%x\n", sc->sc_dev.dv_xname,
stat);
if ((sc->sc_flags & STF_CMD) && sc->sc_cmd == CMD_SPACE) /* fsf */
u_char *sensebuf;
unsigned len;
- sensebuf = (u_char *)&st_xsense[sc->sc_dq.dq_unit];
+ sensebuf = (u_char *)&sc->sc_sense;
len = sc->sc_datalen[CMD_REQUEST_SENSE];
scsi_request_sense(ctlr, slave, unit, sensebuf, len);
}
-prtkey(unit, sc)
- int unit;
+prtkey(sc)
struct st_softc *sc;
{
- register struct st_xsense *xp = &st_xsense[unit];
+ register struct st_xsense *xp = &sc->sc_sense;
switch (xp->sc_xsense.key) {
case XSK_NOSENCE:
break;
case XSK_REVERVED:
tprintf(sc->sc_ctty, "%s: Reserved sense key 0x%x\n",
- sc->sc_hd->hp_xname, xp->sc_xsense.key);
+ sc->sc_dev.dv_xname, xp->sc_xsense.key);
break;
case XSK_NOTRDY:
- tprintf(sc->sc_ctty, "%s: NOT READY\n", sc->sc_hd->hp_xname);
+ tprintf(sc->sc_ctty, "%s: NOT READY\n", sc->sc_dev.dv_xname);
break;
case XSK_MEDERR:
- tprintf(sc->sc_ctty, "%s: MEDIUM ERROR\n", sc->sc_hd->hp_xname);
+ tprintf(sc->sc_ctty, "%s: MEDIUM ERROR\n", sc->sc_dev.dv_xname);
break;
case XSK_HRDWERR:
tprintf(sc->sc_ctty, "%s: HARDWARE ERROR\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
break;
case XSK_ILLREQ:
tprintf(sc->sc_ctty, "%s: ILLEGAL REQUEST\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
break;
case XSK_UNTATTEN:
tprintf(sc->sc_ctty, "%s: UNIT ATTENTION\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
break;
case XSK_DATAPROT:
- tprintf(sc->sc_ctty, "%s: DATA PROTECT\n", sc->sc_hd->hp_xname);
+ tprintf(sc->sc_ctty, "%s: DATA PROTECT\n", sc->sc_dev.dv_xname);
break;
case XSK_BLNKCHK:
- tprintf(sc->sc_ctty, "%s: BLANK CHECK\n", sc->sc_hd->hp_xname);
+ tprintf(sc->sc_ctty, "%s: BLANK CHECK\n", sc->sc_dev.dv_xname);
break;
case XSK_VENDOR:
tprintf(sc->sc_ctty, "%s: VENDER UNIQUE SENSE KEY ",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
switch (sc->sc_tapeid) {
case MT_ISEXABYTE:
tprintf(sc->sc_ctty, "Exabyte: ");
}
break;
case XSK_CPYABORT:
- tprintf(sc->sc_ctty, "%s: COPY ABORTED\n", sc->sc_hd->hp_xname);
+ tprintf(sc->sc_ctty, "%s: COPY ABORTED\n", sc->sc_dev.dv_xname);
break;
case XSK_ABORTCMD:
tprintf(sc->sc_ctty, "%s: ABORTED COMMAND\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
break;
case XSK_VOLOVER:
tprintf(sc->sc_ctty, "%s: VOLUME OVERFLOW\n",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
break;
default:
tprintf(sc->sc_ctty, "%s: unknown sense key 0x%x\n",
- sc->sc_hd->hp_xname, xp->sc_xsense.key);
+ sc->sc_dev.dv_xname, xp->sc_xsense.key);
}
if (sc->sc_tapeid == MT_ISEXABYTE) {
if (xp->exb_xsense.bpe)
tprintf(sc->sc_ctty, "%s: Bus Parity Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.fpe)
tprintf(sc->sc_ctty,
"%s: Formatted Buffer Parity Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.eco)
tprintf(sc->sc_ctty, "%s: Error Counter Overflow",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.tme)
tprintf(sc->sc_ctty, "%s: Tape Motion Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.xfr)
tprintf(sc->sc_ctty, "%s: Transfer About Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.tmd)
tprintf(sc->sc_ctty, "%s: Tape Mark Detect Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.fmke)
tprintf(sc->sc_ctty, "%s: Filemark Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.ure)
tprintf(sc->sc_ctty, "%s: Under Run Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.sse)
tprintf(sc->sc_ctty, "%s: Servo System Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.fe)
tprintf(sc->sc_ctty, "%s: Formatter Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.wseb)
tprintf(sc->sc_ctty, "%s: WSEB Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
if (xp->exb_xsense.wseo)
tprintf(sc->sc_ctty, "%s: WSEO Error",
- sc->sc_hd->hp_xname);
+ sc->sc_dev.dv_xname);
}
}
mode->ex.motionthres, mode->ex.reconthres, mode->ex.gapthres);
}
#endif /* DEBUG */
-
-#endif
-/* $OpenBSD: autoconf.c,v 1.9 1997/01/18 06:43:05 downsj Exp $ */
-/* $NetBSD: autoconf.c,v 1.29 1996/12/17 08:41:19 thorpej Exp $ */
+/* $OpenBSD: autoconf.c,v 1.10 1997/02/03 04:47:54 downsj Exp $ */
+/* $NetBSD: autoconf.c,v 1.31 1997/01/31 01:49:41 thorpej Exp $ */
/*
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
#include <sys/dmap.h>
#include <sys/reboot.h>
#include <sys/device.h>
+#include <sys/mount.h>
#include <sys/queue.h>
#include <dev/cons.h>
#include <hp300/dev/diovar.h>
#include <hp300/dev/diodevs.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/grfreg.h>
#include <hp300/dev/hilreg.h>
+#include <hp300/dev/hpibvar.h>
+#include <hp300/dev/scsivar.h>
+
/*
* The following several variables are related to
* the configuration process, and are used in initializing
ddlist_t dev_data_list_hpib; /* hpib controller dev_datas */
ddlist_t dev_data_list_scsi; /* scsi controller dev_datas */
-#if 1 /* XXX for now */
-struct scsi_link {
- int target;
- int lun;
-};
-
-struct scsibus_attach_args {
- struct scsi_link *sa_scsi_link;
-};
-
-struct hpib_attach_args {
- int ha_slave;
- int ha_punit;
-};
-#endif /* XXX */
-
-#ifndef NEWCONFIG /* XXX */
-struct hp_hw sc_table[MAXCTLRS];
-
-#ifdef DEBUG
-int acdebug = 0;
-#endif
-
-struct devicelist alldevs;
-struct evcntlist allevents;
-
-struct dio_attach_args hp300_dio_attach_args;
-struct scsi_link hp300_scsi_link;
-struct scsibus_attach_args hp300_scsibus_attach_args;
-struct hpib_attach_args hp300_hpib_attach_args;
-#endif /* ! NEWCONFIG */
-
void setroot __P((void));
void swapconf __P((void));
void findbootdev __P((void));
static char *findblkname __P((int));
static int getstr __P((char *cp, int size));
-#ifdef NEWCONFIG
-int mainbusmatch __P((struct device *, struct cfdata *, void *));
+int mainbusmatch __P((struct device *, void *, void *));
void mainbusattach __P((struct device *, struct device *, void *));
-int mainbussearch __P((struct device *, struct cfdata *, void *));
+int mainbussearch __P((struct device *, void *, void *));
struct cfattach mainbus_ca = {
sizeof(struct device), mainbusmatch, mainbusattach
int
mainbusmatch(parent, match, aux)
struct device *parent;
- struct cfdata *match;
- void *aux;
+ void *match, *aux;
{
static int mainbus_matched = 0;
}
int
-mainbussearch(parent, cf, aux)
+mainbussearch(parent, match, aux)
struct device *parent;
- struct cfdata *cf;
- void *aux;
+ void *match, *aux;
{
+ struct cfdata *cf = match;
if ((*cf->cf_attach->ca_match)(parent, cf, NULL) > 0)
config_attach(parent, cf, NULL, NULL);
return (0);
}
-#endif /* NEWCONFIG */
/*
* Determine the device configuration for the running system.
void
configure()
{
- register struct hp_hw *hw;
- int found;
-
/*
* Initialize the dev_data_lists.
*/
hilinit(0, HILADDR);
dmainit();
-#ifdef NEWCONFIG
(void)splhigh();
if (config_rootfound("mainbus", "mainbus") == NULL)
panic("no mainbus found");
(void)spl0();
-#else
- /*
- * Find out what hardware is attached to the machine.
- */
- find_devs();
-
- /*
- * Look over each hardware device actually found and attempt
- * to match it with an ioconf.c table entry.
- */
- for (hw = sc_table; hw->hw_type; hw++) {
- if (HW_ISCTLR(hw))
- found = find_controller(hw);
- else
- found = find_device(hw);
-
- if (!found) {
- extern char *dio_devinfo __P((struct dio_attach_args *,
- char *, size_t));
- int sc = hw->hw_sc;
- char descbuf[80];
-
- bzero(&hp300_dio_attach_args,
- sizeof(hp300_dio_attach_args));
- hp300_dio_attach_args.da_scode = sc;
- hp300_dio_attach_args.da_id = hw->hw_id;
- hp300_dio_attach_args.da_secid = hw->hw_secid;
- printf("%s", dio_devinfo(&hp300_dio_attach_args,
- descbuf, sizeof(descbuf)));
- if (sc >= 0 && sc < 256)
- printf(" at scode %d", sc);
- else
- printf(" csr at 0x%lx", (u_long)hw->hw_pa);
- printf(" not configured\n");
- }
- }
-#endif /* NEWCONFIG */
isrprintlevels();
goto linkup;
}
- if (bcmp(dev->dv_xname, "hpib", 4) == 0 ||
- bcmp(dev->dv_xname, "scsi", 4) == 0) {
+ if (bcmp(dev->dv_xname, "fhpib", 5) == 0 ||
+ bcmp(dev->dv_xname, "nhpib", 5) == 0 ||
+ bcmp(dev->dv_xname, "oscsi", 5) == 0) {
struct dio_attach_args *da = aux;
dd->dd_scode = da->da_scode;
}
if (bcmp(dev->dv_xname, "rd", 2) == 0) {
- struct hpib_attach_args *ha = aux;
+ struct hpibbus_attach_args *ha = aux;
dd->dd_slave = ha->ha_slave;
dd->dd_punit = ha->ha_punit;
}
if (bcmp(dev->dv_xname, "sd", 2) == 0) {
- struct scsibus_attach_args *sa = aux;
+ struct oscsi_attach_args *osa = aux;
- dd->dd_slave = sa->sa_scsi_link->target;
- dd->dd_punit = sa->sa_scsi_link->lun;
+ dd->dd_slave = osa->osa_target;
+ dd->dd_punit = osa->osa_lun;
goto linkup;
}
linkup:
LIST_INSERT_HEAD(&dev_data_list, dd, dd_list);
- if (bcmp(dev->dv_xname, "hpib", 4) == 0) {
+ if (bcmp(dev->dv_xname, "fhpib", 5) == 0 ||
+ bcmp(dev->dv_xname, "nhpib", 5) == 0) {
dev_data_insert(dd, &dev_data_list_hpib);
return;
}
- if (bcmp(dev->dv_xname, "scsi", 4) == 0) {
+ if (bcmp(dev->dv_xname, "oscsi", 5) == 0) {
dev_data_insert(dd, &dev_data_list_scsi);
return;
}
*/
for (dd = dev_data_list.lh_first; dd != NULL;
dd = dd->dd_list.le_next) {
- if (dd->dd_dev->dv_parent == cdd->dd_dev &&
- dd->dd_slave == slave &&
+ /*
+ * XXX We don't yet have the extra bus indirection
+ * XXX for SCSI, so we have to do a little bit of
+ * XXX extra work.
+ */
+ if (bcmp(dd->dd_dev->dv_xname, "sd", 2) == 0) {
+ /*
+ * "sd" -> "oscsi"
+ */
+ if (dd->dd_dev->dv_parent != cdd->dd_dev)
+ continue;
+ } else {
+ /*
+ * "rd" -> "hpibbus" -> "fhpib"
+ */
+ if (dd->dd_dev->dv_parent->dv_parent != cdd->dd_dev)
+ continue;
+ }
+
+ if (dd->dd_slave == slave &&
dd->dd_punit == punit) {
/*
* Found it!
cdd = dev_data_lookup(root_device->dv_parent);
switch (type) {
case 2:
+ /*
+ * "rd" -> "hpibbus" -> "fhpib"
+ */
for (cdd = dev_data_list_hpib.lh_first, ctlr = 0;
cdd != NULL; cdd = cdd->dd_clist.le_next, ctlr++) {
- if (cdd->dd_dev == root_device->dv_parent) {
+ if (cdd->dd_dev == root_device->dv_parent->dv_parent) {
/*
* Found it!
*/
break;
case 4:
+ /*
+ * "sd" -> "oscsi"
+ */
for (cdd = dev_data_list_scsi.lh_first, ctlr = 0;
cdd != NULL; cdd = cdd->dd_clist.le_next, ctlr++) {
if (cdd->dd_dev == root_device->dv_parent) {
ix = btoc(kva - extiobase) + 1;
rmfree(extiomap, btoc(size), ix);
}
-
-/**********************************************************************
- * Old-style device configuration code
- **********************************************************************/
-
-#ifndef NEWCONFIG
-
-/*
- * Duplicate of the same in subr_autoconf.c
- */
-void
-config_init()
-{
-
- TAILQ_INIT(&alldevs);
- TAILQ_INIT(&allevents);
-}
-
-#define dr_type(d, s) \
- (strcmp((d)->d_name, (s)) == 0)
-
-#define same_hw_ctlr(hw, hc) \
- (HW_ISHPIB(hw) && dr_type((hc)->hp_driver, "hpib") || \
- HW_ISSCSI(hw) && dr_type((hc)->hp_driver, "scsi"))
-
-find_controller(hw)
- register struct hp_hw *hw;
-{
- register struct hp_ctlr *hc;
- struct hp_ctlr *match_c;
- caddr_t oaddr;
- int sc;
-
-#ifdef DEBUG
- if (acdebug)
- printf("find_controller: hw: id%x at sc%d (%x), type %x...",
- hw->hw_id, hw->hw_sc, hw->hw_kva, hw->hw_type);
-#endif
- sc = hw->hw_sc;
- match_c = NULL;
- for (hc = hp_cinit; hc->hp_driver; hc++) {
- if (hc->hp_alive)
- continue;
- /*
- * Make sure we are looking at the right
- * controller type.
- */
- if (!same_hw_ctlr(hw, hc))
- continue;
- /*
- * Exact match; all done
- */
- if ((int)hc->hp_addr == sc) {
- match_c = hc;
- break;
- }
- /*
- * Wildcard; possible match so remember first instance
- * but continue looking for exact match.
- */
- if (hc->hp_addr == NULL && match_c == NULL)
- match_c = hc;
- }
-#ifdef DEBUG
- if (acdebug) {
- if (match_c)
- printf("found %s%d\n",
- match_c->hp_driver->d_name,
- match_c->hp_unit);
- else
- printf("not found\n");
- }
-#endif
- /*
- * Didn't find an ioconf entry for this piece of hardware,
- * just ignore it.
- */
- if (match_c == NULL)
- return(0);
- /*
- * Found a configuration match, now let's see if the hardware
- * agrees with us. If it does, attach it.
- */
- hc = match_c;
- oaddr = hc->hp_addr;
- hc->hp_addr = hw->hw_kva;
- hc->hp_args = hw;
- if ((*hc->hp_driver->d_match)(hc)) {
- hc->hp_alive = 1;
-
- /*
- * Fill in fake device structure.
- */
- bzero(&hc->hp_dev, sizeof(hc->hp_dev));
- hc->hp_dev.dv_unit = hc->hp_unit;
- sprintf(hc->hp_dev.dv_xname, "%s%d", hc->hp_driver->d_name,
- hc->hp_unit);
- hc->hp_dev.dv_class = DV_DULL; /* all controllers are dull */
- TAILQ_INSERT_TAIL(&alldevs, &hc->hp_dev, dv_list);
-
- /* Print what we've found. */
- printf("%s at ", hc->hp_xname);
- sc = hw->hw_sc;
- if (sc >= 0 && sc < 256)
- printf("scode %d", sc);
- else
- printf("addr 0x%lx,", (u_long)hw->hw_pa);
- printf(" ipl %d", hc->hp_ipl);
- if (hc->hp_flags)
- printf(" flags 0x%x", hc->hp_flags);
-
- /*
- * Call device "attach" routine. It will print the
- * newline for us.
- */
- (*hc->hp_driver->d_attach)(hc);
-
- /*
- * Register device. Do this after attach because
- * we need dv_class.
- */
- hp300_dio_attach_args.da_scode = sc;
- device_register(&hc->hp_dev, &hp300_dio_attach_args);
-
- find_slaves(hc); /* XXX do this in attach? */
- } else
- hc->hp_addr = oaddr;
- return(1);
-}
-
-find_device(hw)
- register struct hp_hw *hw;
-{
- register struct hp_device *hd;
- struct hp_device *match_d;
- caddr_t oaddr;
- int sc;
-
-#ifdef DEBUG
- if (acdebug)
- printf("find_device: hw: id%x at sc%d (%x), type %x...",
- hw->hw_id, hw->hw_sc, hw->hw_kva, hw->hw_type);
-#endif
- match_d = NULL;
- for (hd = hp_dinit; hd->hp_driver; hd++) {
- if (hd->hp_alive)
- continue;
- /* Must not be a slave */
- if (hd->hp_cdriver)
- continue;
- /*
- * XXX: A graphics device that was found as part of the
- * console init will have the hp_addr field already set
- * (i.e. no longer the select code). Gotta perform a
- * slightly different check for an exact match.
- */
- if (HW_ISDEV(hw, D_BITMAP) && hd->hp_addr >= intiobase) {
- /* must be an exact match */
- if (hd->hp_addr == hw->hw_kva) {
- match_d = hd;
- break;
- }
- continue;
- }
- sc = (int) hd->hp_addr;
- /*
- * Exact match; all done.
- */
- if (sc > 0 && sc == hw->hw_sc) {
- match_d = hd;
- break;
- }
- /*
- * Wildcard; possible match so remember first instance
- * but continue looking for exact match.
- */
- if (sc == 0 && same_hw_device(hw, hd) && match_d == NULL)
- match_d = hd;
- }
-#ifdef DEBUG
- if (acdebug) {
- if (match_d)
- printf("found %s%d\n",
- match_d->hp_driver->d_name,
- match_d->hp_unit);
- else
- printf("not found\n");
- }
-#endif
- /*
- * Didn't find an ioconf entry for this piece
- * of hardware, just ignore it.
- */
- if (match_d == NULL)
- return(0);
- /*
- * Found a configuration match, now let's see if the hardware
- * agrees with us. If it does, attach it.
- */
- hd = match_d;
- oaddr = hd->hp_addr;
- hd->hp_addr = hw->hw_kva;
- hd->hp_args = hw;
- if ((*hd->hp_driver->d_match)(hd)) {
- hd->hp_alive = 1;
-
- /*
- * Fill in fake device structure.
- */
- bzero(&hd->hp_dev, sizeof(sizeof hd->hp_dev));
- hd->hp_dev.dv_unit = hd->hp_unit;
- sprintf(hd->hp_dev.dv_xname, "%s%d", hd->hp_driver->d_name,
- hd->hp_unit);
- /*
- * Default to dull, driver attach will override if
- * necessary.
- */
- hd->hp_dev.dv_class = DV_DULL;
- TAILQ_INSERT_TAIL(&alldevs, &hd->hp_dev, dv_list);
-
- /* Print what we've found. */
- printf("%s at ", hd->hp_xname);
- sc = hw->hw_sc;
- if (sc >= 0 && sc < 256)
- printf("scode %d", sc);
- else
- printf("addr 0x%lx", (u_long)hw->hw_pa);
- if (hd->hp_ipl)
- printf(" ipl %d", hd->hp_ipl);
- if (hd->hp_flags)
- printf(" flags 0x%x", hd->hp_flags);
-
- /*
- * Call device "attach" routine. It will print the
- * newline for us.
- */
- (*hd->hp_driver->d_attach)(hd);
-
- /*
- * Register device. Do this after attach because we
- * need dv_class.
- */
- hp300_dio_attach_args.da_scode = sc;
- device_register(&hd->hp_dev, &hp300_dio_attach_args);
- } else
- hd->hp_addr = oaddr;
- return(1);
-}
-
-find_slaves(hc)
- struct hp_ctlr *hc;
-{
- /*
- * The SCSI bus is structured very much like the HP-IB
- * except that the host adaptor is slave 7 so we only want
- * to look at the first 6 slaves.
- */
- if (dr_type(hc->hp_driver, "hpib"))
- find_busslaves(hc, 0, MAXSLAVES-1);
- else if (dr_type(hc->hp_driver, "scsi"))
-#ifdef SCSI_REVPRI
- /*
- * Later releases of the HP boot ROM start searching for
- * boot devices starting with slave 6 and working down.
- * This is apparently the order in which priority is given
- * to slaves on the host adaptor.
- */
- find_busslaves(hc, MAXSLAVES-2, 0);
-#else
- find_busslaves(hc, 0, MAXSLAVES-2);
-#endif
-}
-
-/*
- * Search each BUS controller found for slaves attached to it.
- * The bad news is that we don't know how to uniquely identify all slaves
- * (e.g. PPI devices on HP-IB). The good news is that we can at least
- * differentiate those from slaves we can identify. At worst (a totally
- * wildcarded entry) this will cause us to locate such a slave at the first
- * unused position instead of where it really is. To save grief, non-
- * identifing devices should always be fully qualified.
- */
-find_busslaves(hc, startslave, endslave)
- register struct hp_ctlr *hc;
- int startslave, endslave;
-{
- register int s;
- register struct hp_device *hd;
- struct hp_device *match_s;
- int new_s, new_c, old_s, old_c;
- int rescan;
-
-#define NEXTSLAVE(s) (startslave < endslave ? (s)++ : (s)--)
-#define LASTSLAVE(s) (startslave < endslave ? (s)-- : (s)++)
-#ifdef DEBUG
- if (acdebug)
- printf("find_busslaves: for %s\n", hc->hp_xname);
-#endif
- NEXTSLAVE(endslave);
- for (s = startslave; s != endslave; NEXTSLAVE(s)) {
- rescan = 1;
- match_s = NULL;
- for (hd = hp_dinit; hd->hp_driver; hd++) {
- /*
- * Rule out the easy ones:
- * 1. slave already assigned or not a slave
- * 2. not of the proper type
- * 3. controller specified but not this one
- * 4. slave specified but not this one
- */
- if (hd->hp_alive || hd->hp_cdriver == NULL)
- continue;
- if (!dr_type(hc->hp_driver, hd->hp_cdriver->d_name))
- continue;
- if (hd->hp_ctlr >= 0 && hd->hp_ctlr != hc->hp_unit)
- continue;
- if (hd->hp_slave >= 0 && hd->hp_slave != s)
- continue;
- /*
- * Case 0: first possible match.
- * Remember it and keep looking for better.
- */
- if (match_s == NULL) {
- match_s = hd;
- new_c = hc->hp_unit;
- new_s = s;
- continue;
- }
- /*
- * Case 1: exact match.
- * All done. Note that we do not attempt any other
- * matches if this one fails. This allows us to
- * "reserve" locations for dynamic addition of
- * disk/tape drives by fully qualifing the location.
- */
- if (hd->hp_slave == s && hd->hp_ctlr == hc->hp_unit) {
- match_s = hd;
- rescan = 0;
- break;
- }
- /*
- * Case 2: right controller, wildcarded slave.
- * Remember first and keep looking for an exact match.
- */
- if (hd->hp_ctlr == hc->hp_unit &&
- match_s->hp_ctlr < 0) {
- match_s = hd;
- new_s = s;
- continue;
- }
- /*
- * Case 3: right slave, wildcarded controller.
- * Remember and keep looking for a better match.
- */
- if (hd->hp_slave == s &&
- match_s->hp_ctlr < 0 && match_s->hp_slave < 0) {
- match_s = hd;
- new_c = hc->hp_unit;
- continue;
- }
- /*
- * OW: we had a totally wildcarded spec.
- * If we got this far, we have found a possible
- * match already (match_s != NULL) so there is no
- * reason to remember this one.
- */
- continue;
- }
- /*
- * Found a match. We need to set hp_ctlr/hp_slave properly
- * for the init routines but we also need to remember all
- * the old values in case this doesn't pan out.
- */
- if (match_s) {
- hd = match_s;
- old_c = hd->hp_ctlr;
- old_s = hd->hp_slave;
- if (hd->hp_ctlr < 0)
- hd->hp_ctlr = new_c;
- if (hd->hp_slave < 0)
- hd->hp_slave = new_s;
-#ifdef DEBUG
- if (acdebug)
- printf("looking for %s%d at slave %d...",
- hd->hp_driver->d_name,
- hd->hp_unit, hd->hp_slave);
-#endif
-
- if ((*hd->hp_driver->d_match)(hd)) {
-#ifdef DEBUG
- if (acdebug)
- printf("found\n");
-#endif
- /*
- * Fill in fake device strcuture.
- */
- bzero(&hd->hp_dev, sizeof(hd->hp_dev));
- hd->hp_dev.dv_unit = hd->hp_unit;
- sprintf(hd->hp_dev.dv_xname, "%s%d",
- hd->hp_driver->d_name,
- hd->hp_unit);
- /*
- * Default to dull, driver attach will
- * override if necessary.
- */
- hd->hp_dev.dv_class = DV_DULL;
- hd->hp_dev.dv_parent = &hc->hp_dev;
- TAILQ_INSERT_TAIL(&alldevs, &hd->hp_dev,
- dv_list);
-
- /*
- * Print what we've found. Note that
- * for `slave' devices, the flags are
- * overloaded with the phys. unit
- * locator. They aren't used for anything
- * else, so we always treat them as
- * such. This is a hack to make things
- * a little more clear to folks configuring
- * kernels and reading boot messages.
- */
- printf("%s at %s slave %d punit %d",
- hd->hp_xname, hc->hp_xname,
- hd->hp_slave, hd->hp_flags);
- hd->hp_alive = 1;
- rescan = 1;
-
- /*
- * Call the device "attach" routine.
- * It will print the newline for us.
- */
- (*hd->hp_driver->d_attach)(hd);
-
- /*
- * Register device. Do this after attach
- * because we need dv_class.
- */
- if (dr_type(hc->hp_driver, "scsi")) {
- hp300_scsi_link.target = hd->hp_slave;
- hp300_scsi_link.lun = hd->hp_flags;
- hp300_scsibus_attach_args.sa_scsi_link=
- &hp300_scsi_link;
- device_register(&hd->hp_dev,
- &hp300_scsibus_attach_args);
- } else {
- hp300_hpib_attach_args.ha_slave =
- hd->hp_slave;
- hp300_hpib_attach_args.ha_punit =
- hd->hp_flags;
- device_register(&hd->hp_dev,
- &hp300_hpib_attach_args);
- }
- } else {
-#ifdef DEBUG
- if (acdebug)
- printf("not found\n");
-#endif
- hd->hp_ctlr = old_c;
- hd->hp_slave = old_s;
- }
- /*
- * XXX: This should be handled better.
- * Re-scan a slave. There are two reasons to do this.
- * 1. It is possible to have both a tape and disk
- * (e.g. 7946) or two disks (e.g. 9122) at the
- * same slave address. Here we need to rescan
- * looking only at entries with a different
- * physical unit number (hp_flags).
- * 2. It is possible that an init failed because the
- * slave was there but of the wrong type. In this
- * case it may still be possible to match the slave
- * to another ioconf entry of a different type.
- * Here we need to rescan looking only at entries
- * of different types.
- * In both cases we avoid looking at undesirable
- * ioconf entries of the same type by setting their
- * alive fields to -1.
- */
- if (rescan) {
- for (hd = hp_dinit; hd->hp_driver; hd++) {
- if (hd->hp_alive)
- continue;
- if (match_s->hp_alive == 1) { /* 1 */
- if (hd->hp_flags == match_s->hp_flags)
- hd->hp_alive = -1;
- } else { /* 2 */
- if (hd->hp_driver == match_s->hp_driver)
- hd->hp_alive = -1;
- }
- }
- LASTSLAVE(s);
- continue;
- }
- }
- /*
- * Reset bogon alive fields prior to attempting next slave
- */
- for (hd = hp_dinit; hd->hp_driver; hd++)
- if (hd->hp_alive == -1)
- hd->hp_alive = 0;
- }
-#undef NEXTSLAVE
-#undef LASTSLAVE
-}
-
-same_hw_device(hw, hd)
- struct hp_hw *hw;
- struct hp_device *hd;
-{
- int found = 0;
-
- switch (hw->hw_type & ~B_MASK) {
- case C_HPIB:
- found = dr_type(hd->hp_driver, "hpib");
- break;
- case C_SCSI:
- found = dr_type(hd->hp_driver, "scsi");
- break;
- case D_BITMAP:
- found = dr_type(hd->hp_driver, "grf");
- break;
- case D_LAN:
- found = dr_type(hd->hp_driver, "le");
- break;
- case D_COMMDCA:
- found = dr_type(hd->hp_driver, "dca");
- break;
- case D_COMMDCL:
- found = dr_type(hd->hp_driver, "dcl");
- break;
- case D_COMMDCM:
- found = dr_type(hd->hp_driver, "dcm");
- break;
- default:
- break;
- }
- return(found);
-}
-
-char notmappedmsg[] = "WARNING: no space to map IO card, ignored\n";
-
-/*
- * Scan the IO space looking for devices.
- */
-find_devs()
-{
- short sc;
- u_char *id_reg;
- register caddr_t addr;
- register struct hp_hw *hw = sc_table;
- int didmap, sctop;
-
- /*
- * Probe all select codes + internal display addr
- */
- sctop = DIO_SCMAX(machineid);
- for (sc = -1; sc < sctop; sc++) {
- /*
- * Invalid select codes
- */
- if (sc >= 32 && sc < 132)
- continue;
-
- if (sc == -1) {
- hw->hw_pa = (caddr_t) GRFIADDR;
- addr = (caddr_t) IIOV(hw->hw_pa);
- didmap = 0;
- } else if (sc == 7 && internalhpib) {
- hw->hw_pa = (caddr_t)DIO_IHPIBADDR;
- addr = internalhpib = (caddr_t) IIOV(hw->hw_pa);
- didmap = 0;
- } else if (sc == conscode) {
- /*
- * If this is the console, it's already been
- * mapped, and the address is known.
- */
- hw->hw_pa = dio_scodetopa(sc);
- addr = conaddr;
- didmap = 0;
- } else {
- hw->hw_pa = dio_scodetopa(sc);
- addr = iomap(hw->hw_pa, NBPG);
- if (addr == 0) {
- printf(notmappedmsg);
- continue;
- }
- didmap = 1;
- }
- if (badaddr(addr)) {
- if (didmap)
- iounmap(addr, NBPG);
- continue;
- }
-
- hw->hw_size = DIO_SIZE(sc, addr);
- hw->hw_kva = addr;
- hw->hw_id = DIO_ID(addr);
- if (DIO_ISFRAMEBUFFER(hw->hw_id))
- hw->hw_secid = DIO_SECID(addr);
- hw->hw_sc = sc;
-
- /*
- * Internal HP-IB on some machines (345/375) doesn't return
- * consistant id info so we use the info gleaned from the
- * boot ROMs SYSFLAG.
- */
- if (sc == 7 && internalhpib) {
- hw->hw_type = C_HPIB;
- hw++;
- continue;
- }
- /*
- * XXX: the following could be in a big static table
- */
- switch (hw->hw_id) {
- /* Null device? */
- case 0:
- break;
- /* 98644A */
- case 2:
- case 2+128:
- hw->hw_type = D_COMMDCA;
- break;
- /* 98622A */
- case 3:
- hw->hw_type = D_MISC;
- break;
- /* 98623A */
- case 4:
- hw->hw_type = D_MISC;
- break;
- /* 98642A */
- case 5:
- case 5+128:
- hw->hw_type = D_COMMDCM;
- break;
- /* 345/375 builtin parallel port */
- case 6:
- hw->hw_type = D_PPORT;
- break;
- /* 98625A */
- case 7:
- case 7+32:
- case 7+64:
- case 7+96:
- hw->hw_type = C_SCSI;
- break;
- /* 98625B */
- case 8:
- hw->hw_type = C_HPIB;
- break;
- /* 98287A */
- case 9:
- hw->hw_type = D_KEYBOARD;
- break;
- /* 98635A */
- case 10:
- hw->hw_type = D_FPA;
- break;
- /* timer */
- case 11:
- hw->hw_type = D_MISC;
- break;
- /* 98640A */
- case 18:
- hw->hw_type = D_MISC;
- break;
- /* 98643A */
- case 21:
- hw->hw_type = D_LAN;
- break;
- /* 98659A */
- case 22:
- hw->hw_type = D_MISC;
- break;
- /* 237 display */
- case 25:
- hw->hw_type = D_BITMAP;
- break;
- /* quad-wide card */
- case 26:
- hw->hw_type = D_MISC;
- hw->hw_size *= 4;
- sc += 3;
- break;
- /* 98253A */
- case 27:
- hw->hw_type = D_MISC;
- break;
- /* 98627A */
- case 28:
- hw->hw_type = D_BITMAP;
- break;
- /* 98633A */
- case 29:
- hw->hw_type = D_BITMAP;
- break;
- /* 98259A */
- case 30:
- hw->hw_type = D_MISC;
- break;
- /* 8741 */
- case 31:
- hw->hw_type = D_MISC;
- break;
- /* 98577A */
- case 49:
- hw->hw_type = C_VME;
- if (sc < 132) {
- hw->hw_size *= 2;
- sc++;
- }
- break;
- /* 98628A */
- case 52:
- case 52+128:
- hw->hw_type = D_COMMDCL;
- break;
- /* bitmap display */
- case 57:
- hw->hw_type = D_BITMAP;
- hw->hw_secid = id_reg[0x15];
- switch (hw->hw_secid) {
- /* 98700/98710 */
- case 1:
- break;
- /* 98544-547 topcat */
- case 2:
- break;
- /* 98720/721 renassiance */
- case 4:
- if (sc < 132) {
- hw->hw_size *= 2;
- sc++;
- }
- break;
- /* 98548-98556 catseye */
- case 5:
- case 6:
- case 7:
- case 9:
- break;
- /* 98730/731 davinci */
- case 8:
- if (sc < 132) {
- hw->hw_size *= 2;
- sc++;
- }
- break;
- /* A1096A hyperion */
- case 14:
- break;
- /* 987xx */
- default:
- break;
- }
- break;
- /* 98644A */
- case 66:
- case 66+128:
- hw->hw_type = D_COMMDCA;
- break;
- /* 98624A */
- case 128:
- hw->hw_type = C_HPIB;
- break;
- default:
- hw->hw_type = D_MISC;
- break;
- }
- /*
- * Re-map to proper size
- */
- if (didmap) {
- iounmap(addr, NBPG);
- addr = iomap(hw->hw_pa, hw->hw_size);
- if (addr == 0) {
- printf(notmappedmsg);
- continue;
- }
- hw->hw_kva = addr;
- }
- /*
- * Encode bus type
- */
- if (sc >= 132)
- hw->hw_type |= B_DIOII;
- else
- hw->hw_type |= B_DIO;
- hw++;
- }
-}
-#endif /* ! NEWCONFIG */
-/* $OpenBSD: conf.c,v 1.10 1997/01/18 08:17:46 downsj Exp $ */
+/* $OpenBSD: conf.c,v 1.11 1997/02/03 04:47:55 downsj Exp $ */
/* $NetBSD: conf.c,v 1.34 1996/12/17 08:41:20 thorpej Exp $ */
/*-
#define dcmcnpollc nullcnpollc
cons_decl(dcm);
-#ifdef NEWCONFIG
#include "dvbox.h"
#include "gbox.h"
#include "hyper.h"
#include "rbox.h"
#include "topcat.h"
-#else /* ! NEWCONFIG */
-#if NGRF > 0
-#define NDVBOX 1
-#define NGBOX 1
-#define NHYPER 1
-#define NRBOX 1
-#define NTOPCAT 1
-#endif /* NGRF > 0 */
-#endif /* NEWCONFIG */
struct consdev constab[] = {
#if NITE > 0
-/* $OpenBSD: locore.s,v 1.7 1997/01/12 15:13:22 downsj Exp $ */
+/* $OpenBSD: locore.s,v 1.8 1997/02/03 04:47:56 downsj Exp $ */
/* $NetBSD: locore.s,v 1.62 1996/11/06 20:19:30 cgd Exp $ */
/*
+ * Copyright (c) 1997 Theo de Raadt
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed under OpenBSD by
+ * Theo de Raadt.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
* Copyright (c) 1994, 1995 Gordon W. Ross
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1980, 1990, 1993
* sp+0 -> signal number
* sp+4 signal specific code
* sp+8 pointer to signal context frame (scp)
- * sp+12 address of handler
- * sp+16 saved hardware state
+ * sp+12 pointer to siginfo (sip)
+ * sp+16 address of handler
+ * sp+20 saved hardware state
* .
* .
* scp+0-> beginning of signal context frame
.globl _sigcode, _esigcode, _sigcodetrap
.data
_sigcode:
- movl sp@(12),a0 | signal handler addr (4 bytes)
+ movl sp@(16),a0 | signal handler addr (4 bytes)
jsr a0@ | call signal handler (2 bytes)
addql #4,sp | pop signo (2 bytes)
_sigcodetrap:
-/* $OpenBSD: machdep.c,v 1.11 1997/01/16 20:43:33 kstailey Exp $ */
+/* $OpenBSD: machdep.c,v 1.12 1997/02/03 04:47:58 downsj Exp $ */
/* $NetBSD: machdep.c,v 1.77 1996/12/11 16:49:23 thorpej Exp $ */
/*
+ * Copyright (c) 1997 Theo de Raadt
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed under OpenBSD by
+ * Theo de Raadt.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1982, 1986, 1990, 1993
* The Regents of the University of California. All rights reserved.
/*
* Configure the system.
*/
+ if (boothowto & RB_CONFIG) {
+#ifdef BOOT_CONFIG
+ user_config();
+#else
+ printf("kernel does not support -c; continuing..\n");
+#endif
+ }
configure();
}
int sf_signum; /* signo for handler */
int sf_code; /* additional info for handler */
struct sigcontext *sf_scp; /* context ptr for handler */
+ siginfo_t *sf_sip;
sig_t sf_handler; /* handler addr for u_sigc */
struct sigstate sf_state; /* state of the hardware */
struct sigcontext sf_sc; /* actual context */
+ siginfo_t sf_si;
};
#ifdef COMPAT_HPUX
int hsf_signum;
int hsf_code;
struct sigcontext *hsf_scp;
+ int hsf_nothing;
struct hpuxsigcontext hsf_sc;
int hsf_regs[15];
};
* Send an interrupt to process.
*/
void
-sendsig(catcher, sig, mask, code)
+sendsig(catcher, sig, mask, code, type, val)
sig_t catcher;
int sig, mask;
u_long code;
+ int type;
+ union sigval val;
{
register struct proc *p = curproc;
register struct sigframe *fp, *kfp;
kfp->sf_code = code;
kfp->sf_scp = &fp->sf_sc;
kfp->sf_handler = catcher;
+ kfp->sf_sip = NULL;
+
/*
* Save necessary hardware state. Currently this includes:
* - general registers
kfp->sf_sc.sc_ap = (int)&fp->sf_state;
kfp->sf_sc.sc_pc = frame->f_pc;
kfp->sf_sc.sc_ps = frame->f_sr;
+
+ if (psp->ps_siginfo & sigmask(sig)) {
+ kfp->sf_sip = &kfp->sf_si;
+ initsiginfo(kfp->sf_sip, sig, code, type, val);
+ }
+
#ifdef COMPAT_HPUX
/*
* Create an HP-UX style sigcontext structure and associated goo
/* Finally, halt/reboot the system. */
if (howto & RB_HALT) {
- printf("System halted.\n\n");
- asm(" stop #0x2700");
- /* NOTREACHED */
+ printf("System halted. Hit any key to reboot.\n\n");
+ (void)cngetc();
}
printf("rebooting...\n");
-/* $OpenBSD: trap.c,v 1.4 1997/01/12 15:13:28 downsj Exp $ */
+/* $OpenBSD: trap.c,v 1.5 1997/02/03 04:47:59 downsj Exp $ */
/* $NetBSD: trap.c,v 1.47 1996/10/14 20:06:31 thorpej Exp $ */
/*
+ * Copyright (c) 1997 Theo de Raadt
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed under OpenBSD by
+ * Theo de Raadt.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1982, 1986, 1990, 1993
* The Regents of the University of California. All rights reserved.
} else if (sig = writeback(fp, fromtrap)) {
beenhere = 1;
oticks = p->p_sticks;
- trapsignal(p, sig, faultaddr);
+ trapsignal(p, sig, T_MMUFLT, SEGV_MAPERR, (caddr_t)faultaddr);
goto again;
}
}
register int i, s;
u_int ucode;
u_quad_t sticks;
+ int typ = 0;
cnt.v_trap++;
p = curproc;
return;
case T_BUSERR|T_USER: /* bus error */
+ typ = BUS_OBJERR;
+ ucode = code & ~T_USER;
+ i = SIGBUS;
+ break;
case T_ADDRERR|T_USER: /* address error */
- ucode = v;
+ typ = BUS_ADRALN;
+ ucode = code & ~T_USER;
i = SIGBUS;
break;
p->p_sigmask &= ~i;
i = SIGILL;
ucode = frame.f_format; /* XXX was ILL_RESAD_FAULT */
+ typ = ILL_COPROC;
break;
#ifdef FPCOPROC
case T_COPERR|T_USER: /* user coprocessor violation */
/* What is a proper response here? */
+ typ = FPE_FLTINV;
ucode = 0;
i = SIGFPE;
break;
* 3 bits of the status register are defined as 0 so there is
* no clash.
*/
+ typ = FPE_FLTRES;
ucode = code;
i = SIGFPE;
break;
frame.f_format == 2 ? "instruction" : "data type",
frame.f_pc, frame.f_fmt2.f_iaddr);
/* XXX need to FRESTORE */
+ typ = FPE_FLTINV;
i = SIGFPE;
break;
#endif
case T_ILLINST|T_USER: /* illegal instruction fault */
#ifdef COMPAT_HPUX
if (p->p_emul == &emul_hpux) {
+ typ = 0;
ucode = HPUX_ILL_ILLINST_TRAP;
i = SIGILL;
break;
}
- /* fall through */
#endif
+ ucode = frame.f_format; /* XXX was ILL_PRIVIN_FAULT */
+ typ = ILL_ILLOPC;
+ i = SIGILL;
+ break;
case T_PRIVINST|T_USER: /* privileged instruction fault */
#ifdef COMPAT_HPUX
if (p->p_emul == &emul_hpux)
else
#endif
ucode = frame.f_format; /* XXX was ILL_PRIVIN_FAULT */
+ typ = ILL_PRVOPC;
i = SIGILL;
break;
else
#endif
ucode = frame.f_format; /* XXX was FPE_INTDIV_TRAP */
+ typ = FPE_INTDIV;
i = SIGFPE;
break;
}
#endif
ucode = frame.f_format; /* XXX was FPE_SUBRNG_TRAP */
+ typ = FPE_FLTSUB;
i = SIGFPE;
break;
}
#endif
ucode = frame.f_format; /* XXX was FPE_INTOVF_TRAP */
+ typ = FPE_FLTOVF;
i = SIGFPE;
break;
#endif
frame.f_sr &= ~PSL_T;
i = SIGTRAP;
+ typ = TRAP_TRACE;
break;
case T_ASTFLT: /* system async trap, cannot happen */
type, code);
goto dopanic;
}
- ucode = v;
+ frame.f_pad = code & 0xffff;
+ ucode = T_MMUFLT;
+ typ = SEGV_MAPERR;
i = SIGSEGV;
break;
}
}
- trapsignal(p, i, ucode);
+ trapsignal(p, i, ucode, typ, (caddr_t)v);
if ((type & T_USER) == 0)
return;
out:
-/* $OpenBSD: autoconf.h,v 1.2 1997/01/12 15:13:31 downsj Exp $ */
+/* $OpenBSD: autoconf.h,v 1.3 1997/02/03 04:48:00 downsj Exp $ */
/* $NetBSD: autoconf.h,v 1.3 1996/03/03 16:49:17 thorpej Exp $ */
/*-
void console_scan __P((int (*)(int, caddr_t, void *), void *));
caddr_t iomap __P((caddr_t, int));
void iounmap __P((caddr_t, int));
+
+struct device;
+void device_register __P((struct device *, void *));
#endif /* _KERNEL */
-/* $OpenBSD: autoconf.c,v 1.2 1997/01/17 08:32:38 downsj Exp $ */
-/* $NetBSD: autoconf.c,v 1.11 1996/10/14 07:26:06 thorpej Exp $ */
+/* $OpenBSD: autoconf.c,v 1.3 1997/02/03 04:48:01 downsj Exp $ */
+/* $NetBSD: autoconf.c,v 1.12 1997/01/30 10:32:51 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
#include <hp300/stand/samachdep.h>
#include <hp300/stand/rominfo.h>
+#include <hp300/stand/device.h>
-#include <hp300/dev/device.h>
-#include <hp300/dev/grfvar.h>
#include <hp300/dev/grfreg.h>
/*
-/* $OpenBSD: dcm.c,v 1.3 1997/01/17 08:32:43 downsj Exp $ */
-/* $NetBSD: dcm.c,v 1.9 1996/02/27 22:11:44 scottr Exp $ */
+/* $OpenBSD: dcm.c,v 1.4 1997/02/03 04:48:02 downsj Exp $ */
+/* $NetBSD: dcm.c,v 1.10 1997/01/30 10:32:52 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
#include <sys/param.h>
#include <dev/cons.h>
-#include <hp300/dev/device.h>
#include <hp300/dev/dcmreg.h>
+
#include <hp300/stand/consdefs.h>
#include <hp300/stand/samachdep.h>
+#include <hp300/stand/device.h>
struct dcmdevice *dcmcnaddr = NULL;
--- /dev/null
+/* $OpenBSD: device.h,v 1.1 1997/02/03 04:48:03 downsj Exp $ */
+/* $NetBSD: device.h,v 1.1 1997/01/30 10:31:44 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1982, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)device.h 8.1 (Berkeley) 6/10/93
+ */
+
+struct hp_hw {
+ caddr_t hw_pa; /* physical address of control space */
+ int hw_size; /* size of control space */
+ caddr_t hw_kva; /* kernel virtual address of control space */
+ short hw_id; /* HW returned id */
+ short hw_secid; /* secondary HW id (displays) */
+ short hw_type; /* type (defined below) */
+ short hw_sc; /* select code (if applicable) */
+};
+
+#define MAXCTLRS 16 /* Size of HW table (arbitrary) */
+#define MAXSLAVES 8 /* Slaves per controller (HPIB/SCSI limit) */
+
+/* bus types */
+#define B_MASK 0xE000
+#define B_DIO 0x2000
+#define B_DIOII 0x4000
+#define B_VME 0x6000
+/* controller types */
+#define C_MASK 0x8F
+#define C_FLAG 0x80
+#define C_HPIB 0x81
+#define C_SCSI 0x82
+#define C_VME 0x83
+/* device types (controllers with no slaves) */
+#define D_MASK 0x8F
+#define D_BITMAP 0x01
+#define D_LAN 0x02
+#define D_FPA 0x03
+#define D_KEYBOARD 0x04
+#define D_COMMDCA 0x05
+#define D_COMMDCM 0x06
+#define D_COMMDCL 0x07
+#define D_PPORT 0x08
+#define D_MISC 0x7F
+
+#define HW_ISCTLR(hw) ((hw)->hw_type & C_FLAG)
+#define HW_ISDIOII(hw) ((hw)->hw_type & B_DIOII)
+#define HW_ISHPIB(hw) (((hw)->hw_type & C_MASK) == C_HPIB)
+#define HW_ISSCSI(hw) (((hw)->hw_type & C_MASK) == C_SCSI)
+#define HW_ISDEV(hw,d) (((hw)->hw_type & D_MASK) == (d))
-/* $OpenBSD: hil.c,v 1.2 1997/01/17 08:32:44 downsj Exp $ */
-/* $NetBSD: hil.c,v 1.5 1994/10/26 07:27:19 cgd Exp $ */
+/* $OpenBSD: hil.c,v 1.3 1997/02/03 04:48:03 downsj Exp $ */
+/* $NetBSD: hil.c,v 1.6 1997/01/30 10:32:53 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
/*
* Keyboard routines for the standalone ITE.
*/
+
#include "samachdep.h"
#ifdef ITECONSOLE
#include <sys/param.h>
+#include <sys/device.h> /* XXX */
#include <hp300/dev/hilreg.h>
#include <hp300/dev/kbdmap.h>
#include <hp300/dev/itevar.h>
-/* $OpenBSD: hpib.c,v 1.2 1997/01/17 08:32:45 downsj Exp $ */
-/* $NetBSD: hpib.c,v 1.4 1994/10/26 07:27:21 cgd Exp $ */
+/* $OpenBSD: hpib.c,v 1.3 1997/02/03 04:48:04 downsj Exp $ */
+/* $NetBSD: hpib.c,v 1.5 1997/01/30 10:32:53 thorpej Exp $ */
/*
* Copyright (c) 1982, 1990, 1993
*/
#include <sys/param.h>
#include <sys/reboot.h>
-#include <hp300/dev/device.h>
-#include "hpibvar.h"
+#include <hp300/stand/device.h>
+#include <hp300/stand/hpibvar.h>
#include "stand.h"
#include "samachdep.h"
-/* $OpenBSD: if_le.c,v 1.5 1997/01/17 08:32:46 downsj Exp $ */
-/* $NetBSD: if_le.c,v 1.8 1996/01/01 18:10:54 thorpej Exp $ */
+/* $OpenBSD: if_le.c,v 1.6 1997/02/03 04:48:05 downsj Exp $ */
+/* $NetBSD: if_le.c,v 1.9 1997/01/30 10:32:54 thorpej Exp $ */
/*
* Copyright (c) 1993 Adam Glass
#include <lib/libsa/stand.h>
#include <lib/libsa/netif.h>
-#include <hp300/dev/device.h>
+#include <hp300/stand/device.h>
#include <hp300/stand/if_lereg.h>
#include "samachdep.h"
-/* $OpenBSD: ite.c,v 1.3 1997/01/17 08:32:48 downsj Exp $ */
-/* $NetBSD: ite.c,v 1.11 1996/03/03 04:23:33 thorpej Exp $ */
+/* $OpenBSD: ite.c,v 1.4 1997/02/03 04:48:06 downsj Exp $ */
+/* $NetBSD: ite.c,v 1.12 1997/01/30 10:32:55 thorpej Exp $ */
/*
* Copyright (c) 1988 University of Utah.
#include <sys/param.h>
#include <dev/cons.h>
-#include <hp300/dev/device.h>
-#include <hp300/stand/itevar.h>
+
#include <hp300/dev/grfreg.h>
+
+#include <hp300/stand/device.h>
+#include <hp300/stand/itevar.h>
#include <hp300/stand/consdefs.h>
#include <hp300/stand/samachdep.h>
-/* $OpenBSD: netio.c,v 1.2 1997/01/17 08:32:54 downsj Exp $ */
-/* $NetBSD: netio.c,v 1.4 1996/10/06 19:07:00 thorpej Exp $ */
+/* $OpenBSD: netio.c,v 1.3 1997/02/03 04:48:06 downsj Exp $ */
+/* $NetBSD: netio.c,v 1.5 1997/01/30 10:32:56 thorpej Exp $ */
/*
* Copyright (c) 1995, 1996 Jason R. Thorpe
char *devname; /* Device part of file name (or NULL). */
{
int error = 0;
-
+
/* On first open, do netif open, mount, etc. */
if (open_count == 0) {
/* Find network interface. */
-/* $OpenBSD: scsi.c,v 1.2 1997/01/17 08:32:58 downsj Exp $ */
-/* $NetBSD: scsi.c,v 1.6 1996/12/17 09:21:42 thorpej Exp $ */
+/* $OpenBSD: scsi.c,v 1.3 1997/02/03 04:48:07 downsj Exp $ */
+/* $NetBSD: scsi.c,v 1.7 1997/01/30 10:32:57 thorpej Exp $ */
/*
* This is reported to fix some odd failures when disklabeling
#include <sys/param.h>
#include <sys/reboot.h>
-#include <hp300/dev/device.h>
+
#define _IOCTL_
#include <hp300/dev/scsireg.h>
-#include "scsivar.h"
+
+#include <hp300/stand/device.h>
+#include <hp300/stand/scsivar.h>
#include "stand.h"
#include "samachdep.h"
-/* $OpenBSD: uboot.c,v 1.1 1997/01/17 08:36:53 downsj Exp $ */
+/* $OpenBSD: uboot.c,v 1.2 1997/02/03 04:48:08 downsj Exp $ */
/* $NetBSD: uboot.c,v 1.2 1996/10/14 07:33:45 thorpej Exp $ */
/*-
printf("\n>> OpenBSD UNIFIED BOOT HP9000/%s CPU\n",
getmachineid());
- printf(">> $OpenBSD: uboot.c,v 1.1 1997/01/17 08:36:53 downsj Exp $\n");
+ printf(">> $OpenBSD: uboot.c,v 1.2 1997/02/03 04:48:08 downsj Exp $\n");
printf(">> Enter \"reset\" to reset system.\n");
bdev = B_TYPE(bootdev);
{
char c, *ptr = line;
- printf("Boot: [[[%s%d%c:]%s][-s][-a][-d]] :- ",
+ printf("Boot: [[[%s%d%c:]%s][-acds]] :- ",
devsw[bdev].dv_name, bctlr + (8 * badapt), 'a' + bpart, name);
if (tgets(line)) {
case 'a':
*howto |= RB_ASKNAME;
continue;
- case 's':
- *howto |= RB_SINGLE;
+ case 'b':
+ *howto |= RB_HALT;
+ continue;
+ case 'c':
+ *howto |= RB_CONFIG;
continue;
case 'd':
*howto |= RB_KDB;
continue;
- case 'b':
- *howto |= RB_HALT;
+ case 's':
+ *howto |= RB_SINGLE;
continue;
}
else {