diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-01-04 01:31:50 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-01-04 01:31:50 +0000 |
commit | 6599c28df296b0cc7a2554bcc508847368f10603 (patch) | |
tree | b1a48dc1eeb35b90cb7ec196269c501dac5f7135 /sys/dev/ic/ncr5380.doc | |
parent | 795f9738daa07b88bffde42ade5fde624210512a (diff) |
mi 5380 driver
Diffstat (limited to 'sys/dev/ic/ncr5380.doc')
-rw-r--r-- | sys/dev/ic/ncr5380.doc | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/sys/dev/ic/ncr5380.doc b/sys/dev/ic/ncr5380.doc new file mode 100644 index 00000000000..82b8c721b23 --- /dev/null +++ b/sys/dev/ic/ncr5380.doc @@ -0,0 +1,146 @@ +MI 5380 driver +============== + +(What? Documentation? Is this guy nuts? :-) + +Reselection +----------- + +This driver will permit reselection on non-polled commands if +sc->sc_flags & NCR5380_PERMIT_RESELECT is 1. This permits enabling of +reselection on a per-device basis. + +Disconnect/reselect is never permitted for polled commands. + + + +Interfacing the driver to MD code +--------------------------------- + +/sys/dev/ic/ncr5380.c is now stand-alone. DON'T include it after your +MD stuff! + +This allows for more than one 5380-based SCSI board in your system. This is +a real possibility for Amiga generic kernels. + +Your driver's softc structure must have an instance of struct ncr5380_softc +as the first thing in the structure. The MD code must initialize the +following: + +sci_*: pointers to the 5380 registers. All accesses are done through + these pointers. This indirection allows the driver to work with + boards that map the 5380 on even addresses only or do other + wierdnesses. + +int (*sc_pio_out)(sc, phase, datalen, data) +int (*sc_pio_in)(sc, phase, datalen, data) + These point to functions that do programmed I/O transfers to the bus and + from the bus, respectively. Arguments: + + sc points to the softc + phase the current SCSI bus phase + datalen length of data to transfer + data pointer to the buffer + + Both functions must return the number of bytes successfully transferred. + A transfer operation must be aborted if the target requests a different + phase before the transfer completes. + + If you have no special requirements, you can point these to + ncr5380_pio_out() and ncr5380_pio_in() respectively. If your board + can do pseudo-DMA, then you might want to point these to functions + that use this feature. + +void (*sc_dma_alloc)(sc) + This function is called to set up a DMA transfer. You must create and + return a "DMA handle" in sc->sc_dma_hand which identifies the DMA transfer. + The driver will pass you your DMA handle in sc->sc_dma_hand for future + operations. The contents of the DMA handle are immaterial to the MI + code - the DMA handle is for your bookkeeping only. Usually, you + create a structure and point to it here. + + For example, you can record the mapped and unmapped addresses of the + buffer. The Sun driver places an Am9516 UDC control block in the DMA + handle. + + If for some reason you decide not to do DMA for the transfer, make + sc->sc_dma_hand NULL. This might happen if the proposed transfer is + misaligned, or in the wrong type of memory, or... + +void (*sc_dma_start)(sc) + This function starts the transfer. + +void (*sc_dma_stop)(sc) + This function stops a transfer. sc->sc_datalen and sc->sc_dataptr must + be updated to reflect the portion of the DMA already done. + +void (*sc_dma_eop)(sc) + This function is called when the 5380 signals EOP. Either continue + the DMA or stop the DMA. + +void (*sc_dma_free)(sc) + This function frees the current DMA handle. + +u_char *sc_dataptr; +int sc_datalen; + These variables form the active SCSI data pointer. DMA code must start + DMA at the location given, and update the pointer/length in response to + DMA operations. + +u_short sc_dma_flags; + See ncr5380var.h + + + +Writing your DMA code +--------------------- + +DMA on a system with protected or virtual memory is always a problem. Even +though a disk transfer may be logically contiguous, the physical pages backing +the transfer may not be. There are two common solutions to this problem: + +DMA chains: the DMA is broken up into a list of contiguous segments. The first +segment is submitted to the DMA controller, and when it completes, the second +segment is submitted, without stopping the 5380. This is what the sc_dma_eop() +function can do efficiently - if you have a DMA chain, it can quickly load up +the next link in the chain. The sc_dma_alloc() function builds the chain and +sc_dma_free() releases any resources you used to build it. + +DVMA: Direct Virtual Memory Access. In this scheme, DMA requests go through +the MMU. Although you can't page fault, you can program the MMU to remap +things so the DMA controller sees contiguous data. In this mode, sc_dma_alloc() +is used to map the transfer into the address space reserved for DVMA and +sc_dma_free() is used to unmap it. + + +Interrupts +---------- + +ncr5380_sbc_intr() must be called when the 5380 interrupts the host. + +You must write an interrupt routine pretty much from scratch to check for +things generated by MD hardware. + + +Known problems +-------------- + +I'm getting this out now so that other ports can hack on it and integrate it. + +The sun3, DMA/Interrupt appears to be working now, but needs testing. + +Polled commands submitted while non-polled commands are in progress are not +handled correctly. This can happen if reselection is enabled and a new disk +is mounted while an I/O is in progress on another disk. + +The problem is: what to do if you get reselected while doing the selection +for the polled command? Currently, the driver busy waits for the non-polled +command to complete, but this is bogus. I need to complete the non-polled +command in polled mode, then do the polled command. + + +Timeouts in the driver are EXTREMELY sensitive to the characteristics of the +local implementation of delay(). The Sun3 version delays for a minimum of 5us. +However, the driver must assume that delay(1) will delay only 1us. For this +reason, performance on the Sun3 sucks in some places. + |