kernel: Remove some old ISA only drivers. This commits removes the following old ISA specific drivers, most of which have been removed in FreeBSD, too: aha(4) - Adaptec 154xA, 154xB, 154xC, 154xCF and 154xCP SCSI cards asc(4) - GI1904-based hand scanner ctx - ImageNation CORTEX-I Frame Grabber dgb(4) - DigiBoard serial cards (digi(4) driver remains) el(4) - 3Com Etherlink 3C501 NIC gpib - National Instruments AT-GPIB and AT-GPIB/TNT boards gsc(4) - Genius GS-4500 hand scanner ie(4) - Intel i82586 based 8 and 16 bit ISA ethernet cards labpc(4) - National Instruments LABPC and LABPC+ driver le(4) - DEC EtherWORKS II/III ethernet cards mse(4) - Bus and InPort mouse driver rc(4) - RISCom/8 multiport serial cards rdp(4) - RealTek RTL8002 based pocket ethernet adapters spigot - Creative Labs Spigot video acquisition board tw(4) - TW-523 X-10 interface wl(4) - T1 speed ISA/radio LAN card wt(4) - Archive/Wangtek cartridge tape driver Along with those, a number of associated programs are removed, too: sasc(1) sgsc(1) wlconfig(8) xten(1) xtend(8)
Change the kernel dev_t, representing a pointer to a specinfo structure, to cdev_t. Change struct specinfo to struct cdev. The name 'cdev' was taken from FreeBSD. Remove the dev_t shim for the kernel. This commit generally removes the overloading of 'dev_t' between userland and the kernel. Also fix a bug in libkvm where a kernel dev_t (now cdev_t) was not being properly converted to a userland dev_t.
MASSIVE reorganization of the device operations vector. Change cdevsw to dev_ops. dev_ops is a syslink-compatible operations vector structure similar to the vop_ops structure used by vnodes. Remove a huge number of instances where a thread pointer is still being passed as an argument to various device ops and other related routines. The device OPEN and IOCTL calls now take a ucred instead of a thread pointer, and the CLOSE call no longer takes a thread pointer.
Replace the the buffer cache's B_READ, B_WRITE, B_FORMAT, and B_FREEBUF b_flags with a separate b_cmd field. Use b_cmd to test for I/O completion as well (getting rid of B_DONE in the process). This further simplifies the setup required to issue a buffer cache I/O. Remove a redundant header file, bus/isa/i386/isa_dma.h and merge any discrepancies into bus/isa/isavar.h. Give ISADMA_READ/WRITE/RAW their own independant flag definitions instead of trying to overload them on top of B_READ, B_WRITE, and B_RAW. Add a routine isa_dmabp() which takes a struct buf pointer and returns the ISA dma flags associated with the operation. Remove the 'clear_modify' argument to vfs_busy_pages(). Instead, vfs_busy_pages() asserts that the buffer's b_cmd is valid and then uses it to determine the action it must take.
Make the entire BUF/BIO system BIO-centric instead of BUF-centric. Vnode and device strategy routines now take a BIO and must pass that BIO to biodone(). All code which previously managed a BUF undergoing I/O now manages a BIO. The new BIO-centric algorithms allow BIOs to be stacked, where each layer represents a block translation, completion callback, or caller or device private data. This information is no longer overloaded within the BUF. Translation layer linkages remain intact as a 'cache' after I/O has completed. The VOP and DEV strategy routines no longer make assumptions as to which translated block number applies to them. The use the block number in the BIO specifically passed to them. Change the 'untranslated' constant to NOOFFSET (for bio_offset), and (daddr_t)-1 (for bio_blkno). Rip out all code that previously set the translated block number to the untranslated block number to indicate that the translation had not been made. Rip out all the cluster linkage fields for clustered VFS and clustered paging operations. Clustering now occurs in a private BIO layer using private fields within the BIO. Reformulate the vn_strategy() and dev_dstrategy() abstraction(s). These routines no longer assume that bp->b_vp == the vp of the VOP operation, and the dev_t is no longer stored in the struct buf. Instead, only the vp passed to vn_strategy() (and related *_strategy() routines for VFS ops), and the dev_t passed to dev_dstrateg() (and related *_strategy() routines for device ops) is used by the VFS or DEV code. This will allow an arbitrary number of translation layers in the future. Create an independant per-BIO tracking entity, struct bio_track, which is used to determine when I/O is in-progress on the associated device or vnode. NOTE: Unlike FreeBSD's BIO work, our struct BUF is still used to hold the fields describing the data buffer, resid, and error state. Major-testing-by: Stefan Krueger
Major cleanup of the interrupt registration subsystem. * Collapse the separate registrations in the kernel interrupt thread and i386 layers into a single machine-independant kernel interrupt thread layer in kern/kern_intr.c. Get rid of the i386 layer's 'MUX' code entirely. * Have the interrupt vector assembly code (icu_vector.s and apic_vector.s) call a machine-independant function in the kernel interrupt thread layer to figure out how to process an interrupt. * Move a lot of assembly into the new C interrupt processing function. * Add support for INTR_MPSAFE. If a device driver registers an interrupt as being MPSAFE, the Big Giant Lock will not be obtained or required. * Temporarily just schedule the ithread if a FAST interrupt cannot be executed due to its serializer being locked. * Add LWKT serialization support for a non-blocking 'try' function. * Get rid of ointhand2_t and adjust all old ISA code to use inthand2_t. * Supply a frame pointer as a pointer rather then embedding it on th stack. * Allow FAST and SLOW interrupts to be mixed on the same IRQ, though this will not necessarily result in optimal operation. * Remove direct APIC/ICU vector calls from the apic/icu vector assembly code. Everything goes through the new routine in kern/kern_intr.c now. * Add a new flag, INTR_NOPOLL. Interrupts registered with the flag will not be polled by the upcoming emergency general interrupt polling sysctl (e.g. ATA cannot be safely polled due to the way ATA register access interferes with ATA DMA). * Remove most of the distinction in the i386 assembly layers between FAST and SLOW interrupts (part 1/2). * Revamp the interrupt name array returned to userland to list multiple drivers associated with the same IRQ.
Device layer rollup commit. * cdevsw_add() is now required. cdevsw_add() and cdevsw_remove() may specify a mask/match indicating the range of supported minor numbers. Multiple cdevsw_add()'s using the same major number, but distinctly different ranges, may be issued. All devices that failed to call cdevsw_add() before now do. * cdevsw_remove() now automatically marks all devices within its supported range as being destroyed. * vnode->v_rdev is no longer resolved when the vnode is created. Instead, only v_udev (a newly added field) is resolved. v_rdev is resolved when the vnode is opened and cleared on the last close. * A great deal of code was making rather dubious assumptions with regards to the validity of devices associated with vnodes, primarily due to the persistence of a device structure due to being indexed by (major, minor) instead of by (cdevsw, major, minor). In particular, if you run a program which connects to a USB device and then you pull the USB device and plug it back in, the vnode subsystem will continue to believe that the device is open when, in fact, it isn't (because it was destroyed and recreated). In particular, note that all the VFS mount procedures now check devices via v_udev instead of v_rdev prior to calling VOP_OPEN(), since v_rdev is NULL prior to the first open. * The disk layer's device interaction has been rewritten. The disk layer (i.e. the slice and disklabel management layer) no longer overloads its data onto the device structure representing the underlying physical disk. Instead, the disk layer uses the new cdevsw_add() functionality to register its own cdevsw using the underlying device's major number, and simply does NOT register the underlying device's cdevsw. No confusion is created because the device hash is now based on (cdevsw,major,minor) rather then (major,minor). NOTE: This also means that underlying raw disk devices may use the entire device minor number instead of having to reserve the bits used by the disk layer, and also means that can we (theoretically) stack a fully disklabel-supported 'disk' on top of any block device. * The new reference counting scheme prevents this by associating a device with a cdevsw and disconnecting the device from its cdevsw when the cdevsw is removed. Additionally, all udev2dev() lookups run through the cdevsw mask/match and only successfully find devices still associated with an active cdevsw. * Major work on MFS: MFS no longer shortcuts vnode and device creation. It now creates a real vnode and a real device and implements real open and close VOPs. Additionally, due to the disk layer changes, MFS is no longer limited to 255 mounts. The new limit is 16 million. Since MFS creates a real device node, mount_mfs will now create a real /dev/mfs<PID> device that can be read from userland (e.g. so you can dump an MFS filesystem). * BUF AND DEVICE STRATEGY changes. The struct buf contains a b_dev field. In order to properly handle stacked devices we now require that the b_dev field be initialized before the device strategy routine is called. This required some additional work in various VFS implementations. To enforce this requirement, biodone() now sets b_dev to NODEV. The new disk layer will adjust b_dev before forwarding a request to the actual physical device. * A bug in the ISO CD boot sequence which resulted in a panic has been fixed. Testing by: lots of people, but David Rhodus found the most aggregious bugs.
device switch 1/many: Remove d_autoq, add d_clone (where d_autoq was). d_autoq was used to allow the device port dispatch to mix old-style synchronous calls with new style messaging calls within a particular device. It was never used for that purpose. d_clone will be more fully implemented as work continues. We are going to install d_port in the dev_t (struct specinfo) structure itself and d_clone will be needed to allow devices to 'revector' the port on a minor-number by minor-number basis, in particular allowing minor numbers to be directly dispatched to distinct threads. This is something we will be needing later on.