System for host accessing local memory by asserting address signal corresponding to host adapter and data signal indicating address of location in local memory

Information

  • Patent Grant
  • 5734924
  • Patent Number
    5,734,924
  • Date Filed
    Friday, August 27, 1993
    31 years ago
  • Date Issued
    Tuesday, March 31, 1998
    26 years ago
Abstract
A host adapter contains a RISC processor, a local memory, and a memory management unit that permits the RISC processor and a host computer system to access a local memory. The host computer system writes command descriptions directly into the local RAM. The RISC processor retrieves and processes the command descriptions. The local RAM may be divided into numbered command description blocks having a fixed size and format. In standard bus protocols, such as SCSI-2, block numbers are used as tag messages. Such tag messages allow the host adapter to quickly identify information used when an SCSI I/O request is resumed. The command description blocks may be linked into lists, including an active list containing command description blocks that are ready for the RISC processor and a free list containing command description blocks that are available for use by the host computer.
Description

CROSS-REFERENCES TO RELATED APPLICATIONS
This application is related to, and incorporates by reference, U.S. patent application entitled "SCSI BUS CONTROLLER WITH STORAGE FOR PERIPHERAL DEVICE CONFIGURATION DATA", and U.S. patent application entitled "METHOD AND CIRCUIT FOR RESOLVING I/O PORT ADDRESS CONFLICTS", both filed on the same date as the present application.
A portion of the disclosure of this patent document contains material which is subject to copyright protection. The copyright owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure, as it appears in the Patent and Trademark Office patent file or records, but otherwise reserves all copyright rights whatsoever.
BACKGROUND OF THE INVENTION
1. Field of the Invention
This invention relates to communications between a host computer and attached devices, and in particular relates to an host adapter which employs an embedded RISC (Reduced Instruction Set Computing) processor and a partitioned local memory to provide an interface between a computer coupled to a first bus, such as a VESA bus, and peripheral devices coupled to a second bus, such as an SCSI (Small Computer System Interface) bus or a ISA bus.
2. Description of Related Art
Standard buses, such as ISA, EISA, VESA, PCI, and SCSI buses, are commonly used to create interfaces between the mother board of a computer and add-on devices. Often adapters are required between a first type of bus and a second type of bus. FIG. 1 shows a system with mother board 110 of a host computer 100 that communicates with devices 121-123 through local bus 120. Each device 121-123 occupies a portion of the address space of host computer 100 and is identified by a base I/O port address.
The mother board 110 contains an adapter 115 (or interface circuitry) for operating local bus 120. Adapter 115 implements the protocols of bus 120 and generates signals which direct communications to the correct target device 121-123.
Device 123 is an adapter between local bus 120 and SCSI bus 130. Peripherals 131-133 on SCSI bus 130 are daisy chained together and are identified by device IDs within the range from 0 to 7 or 15 if an SCSI-2 bus is used. SCSI controller 150 issues SCSI I/O requests to the attached devices 131-133 according to device ID.
Typically, host computer 100 communicates with devices 121-123 and 131-133 by sending commands and I/O requests, such as a requests for a block of data from a hard disk, through the appropriate adapters 115 and/or 150. Most adapters require supervision by the mother board 110, although some functions can be completed by adapter 115 or 150 without supervision. It is desirable to provide adapters 115 and 150 that need minimal supervision, so that host computer 100 can perform other operations while adapters 115 and 150 process I/O requests.
SCSI controllers illustrate prior art host adapters. With one prior art SCSI controller, mother board 110 of host computer 100 sends an I/O request to SCSI controller 150 by writing to a set of registers in controller 150. SCSI controller 150 may have several sets of registers. Each set of registers typically contains the number of bytes that can be addressed by the mother board 110. For example, if local bus 120 is a VESA bus, each device (or card) 121-123 attached to bus 120 occupies 16 bytes of the host computer's address space, and SCSI controller 150 would have one or more 16-byte register sets. The number of simultaneous I/O requests that an SCSI controller can handle is typically limited by the number of register sets.
A problem with using registers to hold the I/O requests is that the expense of registers permits only a few register sets per a controller. In the register implementation, if a host computer has tens or hundreds of simultaneous I/O requests, the mother board must wait until a preceding SCSI I/O request is completed before sending a new I/O request. Further, a single register set may be too small to contain a description of a complicated I/O request. For complicated I/O requests, typically, further information must be requested from the host computer, which interrupts host computer operations and slows operations of the host computer, the adapter, and any devices attached to the host computer.
In another prior art SCSI system, mother board 110 writes a description of an I/O request into main memory then provides a pointer to the description. SCSI adapter 123 uses the pointer to access the command description when local bus 120 is available. Typically, SCSI adapter 123 copies the description from main memory on mother board 110 into registers in SCSI controller 150. Using main memory permits the mother board to write as many command descriptions as are need (limited by the size of the main memory). However, copying creates traffic on local bus 120 and slows execution of the I/O requested because when SCSI bus 130 is available bus 120 may not be.
Adapter 115 that couples mother board 110 to an ISA, EISA, PCI, or other standard local bus 120 experiences similar problems. In particular, adapter 115 often monitors and controls several simultaneous commands and I/O requests. If host computer 100 has another I/O request while adapter 115 is busy or has reached its capacity, host computer 100 must wait.
Host adapters are needed which economically handle hundreds of simultaneous commands and I/O requests, which minimize host supervision, and which minimize copying of data.
SUMMARY OF THE INVENTION
In accordance with the present invention, circuits and methods are provided for multi-threaded communications between a host computer system and devices on a bus. According to one embodiment of the invention, a host adapter contains a dedicated processor and a memory management unit that permits the processor and the host computer system to directly access a local memory. The host computer system writes command descriptions into the local memory of the processor where the command descriptions are retrieved and processed by the processor. RAM inexpensively provides storage for hundreds of command descriptions so that the host computer will rarely be delayed by limited capacity in the adapter. Further, the command description can be sufficiently complete that the processor can transmit the command to a target device and process the command with minimal host intervention.
Typically, the local memory is divided into command description blocks having a predefined size and format so that the starting local addresses of the command description blocks are multiples of a fixed quantity. The command description blocks can be numbered, and the numbers, instead of longer local addresses, can be used to identify the command description blocks. In standard bus protocols, for example SCSI-2, the block numbers can be used as tag messages. Such tag messages allow the host adapter to quickly identify the block needed when an SCSI I/O request is resumed.
The command description blocks can be linked into lists, such as an active list containing command description blocks that are ready for the processor to process and a free list containing command description blocks that are available for use by the host computer. The processor can monitor the free list for command description blocks written by the host computer then move the written blocks to the active list. Completed command description blocks can be moved from the active list to the end of the free list and can be used to pass to the host computer information concerning the completed command. The free and active list permits commands to be processed and completed in random order to increase flexibility and performance.





BRIEF DESCRIPTION OF THE DRAWINGS
FIG. 1 shows a system in which a host computer communicates with peripherals attached to an SCSI bus.
FIG. 2A shows an host adapter according to an embodiment of the present invention which uses a processor and a partitioned local memory to provide a multi-threaded interface age between a host bus and a device bus.
FIG. 2B shows an SCSI host adapter according to an embodiment of the present invention.
FIG. 3 shows a block diagram of a portion of a local memory control circuit for an SCSI host adapter according to an embodiment of the present invention.
FIG. 4 shows a memory map of local memory of an SCSI controller according to an embodiment of the present invention.
FIG. 5 shows a block diagram of registers used by a processor to provide a local address pointing to a location in a command description block.
FIG. 6 shows an example free list and active list used during operation of a controller according to an embodiment of the present invention.
FIGS. 7A, 7B, and 7C show changes in the free list and active list as I/O requests are added and processed.
FIG. 8 shows a diagram of the I/O lines of an SCSI controller IC according to an embodiment of the present invention.
FIGS. 9-18 show block and circuit diagrams for the SCSI controller of FIG. 8.
FIGS. 19-25 show block and circuit diagrams of some of the blocks shown in FIGS. 9-18.
Similar or identical items in different Figures have the same reference numerals or characters.





DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS
Embodiments of the present invention provide multi-threaded control of devices such as peripheral devices attached to an SCSI bus or IDE cards attached to an AT bus.
FIG. 2A shows an adapter according to an embodiment of the present invention. The adapter is typically employed on the mother board of a host computer or on a card which plugs into a slot coupled to host bus 120. The adapter creates an interface between host bus 120 and device bus 130. Typically, the host bus is a VESA, ISA, EISA, or PCI bus so that the adapter is in the address space of the host computer. Device bus 130 is for coupling to several devices, such as IDE cards or peripheral devices. Device bus 130 can be but is not limited to an ISA, EISA, or SCSI bus.
In one specific embodiment, host bus 120 is a VESA bus and device bus 130 is an ISA bus. VESA bus 120 provides a fast data transfer rate between the host computer and the adapter. ISA bus 130 provides a slower data transfer rate to one or more plug-in cards (IDE devices). In another specific embodiment disclosed in greater detail below, host bus 120 is a VESA bus and device bus 130 is an SCSI bus.
The adapter shown in FIG. 2A includes a host bus interface 260 and a device bus interface 250. Interfaces 250 and 260 create and receive signals for implementing the necessary protocols on busses 130 and 120 respectively. Many types of such interface circuits are known in the art. A FIFO block 220 is provided to buffer data transfers such direct data transfer between host bus 120 and device bus 130. FIFO block 220 may be omitted in some embodiments.
A processor 210 controls the bus interfaces 250 and 260 according to a program stored in local memory 280. Processor 210 is shown as a RISC processor but any appropriate processor as controller may be employed. The instruction set and the circuitry of processor 210 can be tailored for the functions provided and in particular, can be tailored for control of busses 120 and 130.
A local memory interface 230 permits a host computer, through host bus 120 and host bus interface 260, to directly access local memory. The host computer writes command descriptions into local memory 280. Processor 210 retrieves and processes the command descriptions. Local memory 280 is typical RAM that provides space for hundreds of command descriptions.
This embodiment of the invention provides several advantages when compared to adapters that employ registers or adapters that read command descriptions from main memory. Because local RAM is relatively inexpensively, space for hundreds of command description can be provided, and the command descriptions can be as long as necessary. The host computer writes the description directly into memory 280 and does not need to wait when registers are filled with unprocessed commands. Multiple commands for each device can be queued for execution. There is no need for the host computer to poll the adapter to check whether a new command can be written and no delay before the host computer recognizes that another command can be written. The commands can be sent by the adapter as soon as device bus 130 and the target device are free. There is no delay waiting for host bus 120 to become free so that the adapter can request needed information. Because memory 280 is local, processor 210 does not create traffic on host bus 120 to access and execute the command descriptions. The adapter can use local memory 280 to save information when a command is disconnected and retrieve information when a command is resumed, so that the adapter can efficiently monitor and control simultaneous commands without host intervention.
The ability to handle multiple commands is important for SCSI host adapters. As shown in FIG. 1, peripherals 131-133 on SCSI bus 130 are daisy chained together and identified by device IDs within the range from 0 to 7 or 15 if an SCSI-2 bus is used. SCSI controller 150 identifies SCSI I/O requests to the attached devices 131-133 by device ID. ANSI X3.131-1986, which is incorporated herein by reference in its entirety, defines the original SCSI protocol, referred to herein as SCSI-1. SCSI-1 permits a single active I/O request per device for a total of seven active I/O requests from the host computer. In addition, the host computer may have several I/O requests that must wait until a prior I/O requests is completed.
A newer version of the SCSI protocol, referred to herein as SCSI-2, is defined by ANSI X3.131-1993, which is also incorporated by reference in its entirety. SCSI-2 permits multiple active I/O requests for each device. SCSI-2 I/O requests are identified by device ID and an 8-bit tag message. Accordingly, the host computer can issue up to 15.times.256=3840 simultaneous I/O requests all of which have been started on an SCSI bus. Multiple I/O requests provide SCSI-2 with greater versatility and faster response times than SCSI-1.
FIG. 2B shows a block diagram of an SCSI host adapter according to an embodiment of the present invention. The host adapter includes three separate ICs, an SCSI controller 200, local memory 280, and an EEPROM 290. In other embodiments, all the circuitry can be combined on a single IC (integrated circuit) or divided into several separate ICs.
SCSI controller 200 can be part of an adapter card, such as adapter card 123 in FIG. 1, which connects to a local bus 120 and an SCIS bus 130 or may be provided directly on the mother board of a host computer where the SCSI controller 200 communicates with a CPU through a local bus on the mother board. Local memory 280 and EEPROM 290 are local to SCSI controller 200 meaning that SCSI controller 200 can access memory 280 and EEPROM 290 directly using local addresses without using a shared local bus 120 of a host computer. Local storage provides faster access without using the resources of bus 120 or the host computer.
SCSI controller 200 contains a host bus interface 260 which receives and transmits signals on local bus 120. Local bus 120 is a VESA bus but other types of bus, for example an ISA, EISA, or PCI bus, may be used. Typically, host bus interface 260 contains a slave mode control circuit 261 to communicate with a host computer that acts as bus master. Slave mode control circuit 261 includes address decode circuit 262 which interprets an I/O port address provided on bus 120 to determine if data from the host computer is directed to controller 200. Data latch and control circuit 263 is used to latch data that is directed to controller 200. DMA control circuit 264 is provided so that host bus interface 260 can perform as bus master of local bus 120 during a DMA transfer to the host computer. DMA control circuit 264 includes a host address counter 265 to contain the address in main memory, a host transfer counter 266 for holding a count of the number of bytes transferred, and host bus master mode control circuit 267 to implement the protocol necessary to act as master of bus 120. The specific structure of host bus interface 260 depends on the kind of local bus 120 and protocols implemented.
FIFO block 220 provides host FIFO 221, SCSI FIFO 222, and FIFO control circuit 223 which buffer data transfers. FIFO block 220 is typically used to compensate for lack of synchronization of buses 120 and 130 and difference in data handling rates of host bus interface 260 and SCSI interface 250. Such FIFO blocks are often used for DMA operations and are well known in the art.
EEPROM interface 240 provides an interface to non-volatile memory, EEPROM 290. EEPROM interface 240 includes an initialization state machine 241 which provides initialization functions, an EEPROM control circuit 242 which provides control signals for reading from and writing to EEPROM 290, and a configuration register 243 and a data shift register 244 used in an I/O port address selection circuit such as the address selection circuits described in U.S. patent application entitled "METHOD AND CIRCUIT FOR RESOLVING I/O PORT ADDRESS CONFLICTS". During initialization, EEPROM interface 240 provides configuration data such as an I/O port base address that host bus interface 260 compares to addresses provided on bus 120.
SCSI interface 250 creates and receives signals on SCSI bus 130 and implements handshaking signals defined by SCSI protocols. SCSI interface 250 includes a transfer handshake circuit 251 which includes synchronous handshake circuit 252 and asynchronous handshake circuit 253 that generates signals and timing for synchronous and asynchronous data transfers. Included in synchronous handshake circuit 252 are a local storage circuit 254 for containing offset and rate data for the SCSI devices and a offset control circuit 255 for keeping a count of unacknowledged bytes sent to an SCSI device. Control circuits 256 and 257 control the SCSI phase for arbitration, selection, and reselection according to the SCSI protocol.
Processor 210 and the host computer access local memory 280 through local memory interface 230. Local memory interface 230 includes a memory management unit 231 for providing control signals for local memory 280 and a data multiplexer 232 and address control 233 for selecting whether processor 210 or the host computer has access to memory 280.
Memory 280 is typically RAM and partitioned to provide space for code and variables and space for command description blocks (CDBs) which describe SCSI I/O requests. Partitioning can be implemented in software by defining addresses which divide memory 280 into sections or implemented in hardware using separate RAM ICs for different memory areas in local memory 280.
Typically, a device driver program executed by the host computer implements the conventions necessary for communication between the host computer and controller 200. During start-up, the device driver program loads program code for processor 210 into local memory 280. During operation, the device driver program writes I/O request descriptions for SCSI controller 200 into a command description block in local memory 280. Data is written to SCSI controller 200 and local memory 280 through VESA bus 120 using I/O port addresses which correspond to SCSI controller 200. For a VESA bus, controller 200 occupies sixteen I/O port addresses. To write to local memory 280, the host computer writes a local address and data to one or more of the I/O port addresses.
The local address indicates a location in local memory 280 and is written into a host address register 234 inside local memory interface 230. Data from the host computer goes directly into local memory 280 at the local address indicated by host address register 234. For writing blocks of data, host address register 234 can be automatically incremented (or decremented) by local memory interface 230 after (or before) every write to local memory 280 so that a single local address is sufficient for writing a string of data to local memory 280.
The host computer reads from local memory 280 by writing a local address to the I/O port address that corresponds to host address register 234 then reading from an I/O port address that corresponds to local memory 280. To make reading of data blocks faster, local memory interface 230 automatically increments (or decrements) host address register 234 after (or before) every read from local memory 280.
Appendix I describes an assignment of I/O port addresses in one embodiment of the present invention. As shown in appendix I, a word size register can be at an even address and a byte size register at an odd address even though the addresses of the registers seem to overlap. Words at base I/O port address plus eight and base I/O port address plus ten are data and local address used to read or write to local memory 280. In the local address word, fourteen bits are the local address. The high bits may be used for other purposes such as to indicate whether data is written to or read from local memory 280.
Processor 210 also writes to and reads from local memory 280. FIG. 3 illustrates how local memory interface 230 controls access to local memory 280. Address multiplexer 235 selects between two address sources, the host address register 234 or processor 210. Select signals for multiplexer 235 are provided by memory management unit 231 on the basis of a priority system. In one embodiment, the host computer is always given highest priority so that when the host computer and processor 210 simultaneously attempt to access memory 280, memory management unit 231 provides select signals granting access to the host computer.
Data input multiplexer 232 selects the input data bus from which data is written to local memory 280. When the host computer supplies the address, VESA bus 120 supplies the data. When processor 210 supplies the local address, data can come from registers in processor 210 or from the SCSI bus 130 via SCSI interface 250. Accordingly, data from the SCSI bus 130 can be saved into local memory 280 without first loading the data into a register in processor 210.
Output data from local memory 280 is also controlled by the supplier of the local address. When host address register 234 supplies the local address, data is provided to the host computer on VESA bus 120. When processor 210 supplies the address, data is routed either to a register in processor 210 or to SCSI data bus 130.
FIG. 4 shows a partitioning of local memory according to one embodiment of the present invention. In FIG. 4, the high addresses, $4000-$7FFF, of local memory are dedicated to two hundred and fifty six 64-byte command description blocks CDB.sub.0 -CDB.sub.255. Each command description block CDB.sub.n has a block number n, where 0.ltoreq.n.ltoreq.255, and a starting local address $4000+(n.times.$40). More generally, any starting address and any size command description block can used in other embodiments. Low addresses, $0000-$3FFF, contain local variables and a program used by processor 210. If two separate RAMs are provided, one for CDB memory and another for program memory, 14 bit addresses and enable signals for each RAM are sufficient to access local memory 280.
The host computer writes I/O request descriptions into command description blocks CDB.sub.n. 64-byte command description blocks provide enough memory to store information necessary to describe most SCSI I/O requests. For complicated scatter or gather operations, two or more CDBs can be linked together to describe a single I/O request. Larger or smaller CDB could be employed, but when the size of the CDB is a power of two, the block number n can provide a portion of the starting address of a CDB. CDB starting address are easily calculated by arithmetically shifting the block number n to the left and adding a constant if necessary.
Processor 210 is dedicated to operations of the controller 200 and may be custom designed with a reduced instruction set tailored for SCSI operations and manipulating CDBs. Processor 210 includes an execution state machine 211, an arithmetic logic unit 212, an instruction decode circuit 213, multiplexers 214, and a register set 215.
FIG. 5 shows three registers from register set 215, instruction register 510, index register 520, and CDB pointer register 530, used by processor 210 to determine an address in a CDB. CDB pointer register 530 holds a block number n which indicates a CDB and provides bits six through thirteen of a 14-bit local address. CDB pointer register 530 can be written to from SCSI interface 250, from local memory 280, or by the host computer.
When SCSI controller 200 operates SCSI-2 peripherals on SCSI bus 130, multiple I/O commands may be sent to a single SCSI-2 peripheral device. A device ID and an 8-bit tag message passed between controller 200 and the SCSI-2 device identify each command. A block number which identifies a command description block can be used as the tag message. This provides quick identification of the correct CDB when an I/O command is resumed. The tag message can be directly loaded into CDB pointer register 530 from SCSI bus 130 when an I/O request is resumed.
Least significant bits zero through five of a local address are an offset within a CDB and are provided either by index register 520 or instruction register 510. Multiplexer 540 selects which of the registers 510 or 520 provides the least significant bits. The selection depends on the instruction in instruction register 510. For some instructions, the offset is incorporated in the instructions, and instruction register 510 provides bits zero to five. For other instructions, index register 520 provides the least significant bits of the address in a CDB. The offset in index register 520 can be increment or decremented before or after a read or write to a command description block. Appendix II provides a description of the instruction set used in one embodiment of the present invention.
Each CDB contains fields for information which describes an I/O request and fields used by processor 210 while an I/O request is active. Some of the fields in each CDB may contain include:
1) Forward and backward pointers that link the CDBs into linked lists;
2) An SCSI device ID indicating a target SCSI peripheral device to which the request is directed;
3) SCSI command and length bytes indicating the operation and the number of bytes in a requested I/O;
4) A main memory address and length which indicate where data transfer is directed;
5) A pointer to an additional CDB for a scatter-gather address list used when data transfer is directed at several locations in main memory;
6) A main memory address for sense data if check status is returned;
7) Completion status bytes for indicating how much of the requested I/O is complete;
8) A status byte for indicating the status, EMPTY, READY, SG.sub.-- LIST, ACTIVE, DISCONNECT, or DONE, of the CDB; and
9) A storage area used during a disconnect for data needed when an I/O request is resumed.
Processor 210 and the host computer keep track of which CDBs contain descriptions of I/O requests and which CDBs are available for new command descriptions. A specific method of monitoring CDBs is described below. Many other systems are possible and within the scope of the present invention.
CDBs may be organized into a free list of CDBs available for new command descriptions and an active list of CDBs containing descriptions being processed by processor 210. Initially, all of the CDBs in local memory 280 are in the free list and have a status byte set to EMPTY, a forward pointer which points to the next CDB in order of CDB number, and a backward pointer which points to the previous CDB. CDB.sub.255 points forward to CDB.sub.255 and CDB.sub.0 points backward to CDB.sub.0 indicating the ends of the lists. Driver software in the host computer initializes a variable first.sub.-- empty.sub.-- CDB to zero indicating the first CDB to which the host computer can write and a variable last.sub.-- empty.sub.-- CDB to 255.
When the host computer has an I/O request to send on an SCSI bus, the device driver writes to the command description block indicated by variable first.sub.-- empty.sub.-- CDB, changes the status byte of the CDB to READY, then changes variable first.sub.-- empty.sub.-- CDB to the next CDB in the free list. Processor 210 periodically checks the free list for CDBs with status READY and moves the ready CDBs to the active list. The active list can be for example a circular linked list. After an I/O request described by a CDB in the active list is completed, the CDB can be removed from the active list and inserted at the end of the free list. An interrupt to the host computer is generated so that the host computer checks the CDB at the end of the free list and reads status information of the completed I/O request. The host computer then changes the status byte of the CDB to empty and changes variable last.sub.-- empty.sub.-- CDB.
After controller 200 handles several I/O requests, the order of the CDBs can be mixed so that forward and backward pointers need not point to an adjacent CDBs. FIG. 6 shows an example of a free list and an active list containing ten command description blocks CDB.sub.0 -CDB.sub.9. The CDBs have addresses in memory ordered according to the block number 0-9. The status of each CDB (CDB.sub.0 -CDB.sub.9) is indicated as READY, EMPTY, DONE, ACTIVE, or SG.sub.0 LIST. The logical order of the CDBs in the free list and active list is indicated by arrows in FIG. 6 which point from one CDB to the next CDB in the respective lists. For example, in FIG. 6, CDB.sub.1 is one forward of CDB.sub.5 in the free list, even though the CDBs are widely separated in address.
Processor 210 uses local variables first.sub.-- free.sub.-- CDB and last.sub.-- free.sub.-- CDB which have initial values 0 and 255 respectively to track of the ends of the free list. The first.sub.-- free.sub.-- CDB and last.sub.-- free.sub.-- CDB variables are closely related to but not always equal to the first.sub.-- empty.sub.-- CDB and last.sub.-- empty.sub.-- CDB variables kept by a device driver in main memory. The active list contains CDBs being processed by processor 210. At most one CDB in the active list can have status ACTIVE. Status ACTIVE indicates the command described in the CDB is currently using SCSI bus 130. All other CDBs in the active list are READY indicating an I/O request identified by processor 210 but not yet initiated on SCSI bus 130, DISCONNECT indicating an I/O request was initiated but the target device disconnected before completing the I/O request, or SG.sub.-- LIST indicating a CDB containing information to be used during scatter-gather functions of an ACTIVE, READY, or DISCONNECT CDB. As shown in FIG. 6, SG.sub.-- LIST command description blocks CDB.sub.4 and CDB.sub.6 are not part of the circular structure of the active list, but rather are pointed to by a scatter-gather pointer in CDB.sub.9.
The free list contains CDBs that processor 210 has not yet identified as requiring any action. These include EMPTY CDBs that contain no command description, READY and SG LIST CDBs written by the host computer but not yet identified by processor 210, and DONE CDBs that processor 210 placed at the end of the free list after completion of a requested I/O.
FIGS. 7A, 7B, and 7C provide examples of how the free list and active list shown in FIG. 6 change as I/O requests are processed. When the host computer has a new I/O request, the device driver writes an I/O request description to the command description block pointed to by variable first.sub.-- empty.sub.-- CDB, CDB.sub.7 in FIG. 6. If the I/O request has long list of addresses and transfer amounts for a scatter-gather operation, the host computer writes a scatter-gather list in the following command description block, CDB.sub.2, and sets a scatter gather pointer in CDB.sub.7 to point to CDB.sub.2. As many additional CDBs as necessary may be used for a scatter gather list. Once the I/O request description is finished, the host computer changes the status byte of the CDB.sub.7 to READY, changes the status byte of the CDB.sub.2 to SG.sub.-- LIST, and changes variable first.sub.-- empty.sub.-- CDB to point to a CDB one forward, CDB.sub.5 as shown in FIG. 7A.
The host computer may write further I/O requests, for example in CDB.sub.5 and CDB.sub.1, until variable first.sub.-- empty.sub.-- CDB equals variable last.sub.-- empty.sub.-- CDB. Since 256 CDBs are provided in the embodiment of FIG. 2B, this should rarely happen, but more that 256 CDBs can be provided if necessary to avoid delays while a host computers waits for an empty CDB.
Processor 210 monitors the status bytes of CDBs in the free list starting with the CDB indicated by variable first.sub.-- free.sub.-- CDB, CDB.sub.7. When processor 210 finds that the status of CDB.sub.7 is READY, the controller moves variable first.sub.-- free.sub.-- CDB forward and moves the READY command description block CDB.sub.7 into the active list as shown in FIG. 7B. CDB.sub.7 is inserted into the active list by changing the forward pointer of CDB.sub.7 to point to the ACTIVE command description block CDB.sub.0 and the backward pointer of CDB.sub.7 to point to CDB.sub.3. The backward pointer of CDB.sub.0 and the forward pointer of CDB.sub.3 are changed to point to CDB.sub.7. The SG.sub.-- LIST command description block CDB.sub.2 is removed for the free list and is already pointed to by a scatter-gather pointer in command description block CDB.sub.7.
CDBs in the active list, CDB.sub.0, CDB.sub.9, CDB.sub.3, and CDB.sub.7 in FIG. 7B, are processed by processor 210 and SCSI interface 250. When the ACTIVE CDB is complete or disconnected, SCSI bus 130 becomes free. If no device on SCSI bus 130 attempts reselection of a disconnected I/O request, processor 210 searches the active list for a ready CDB to initiate on the SCSI bus 130. As described in U.S. Pat. Application entitled "SCSI BUS CONTROLLER WITH STORAGE FOR PERIPHERAL DEVICE CONFIGURATION DATA", processor 210 can check the capabilities of a device targeted by a CDB. In particular, processor 210 can check to see if the target device is SCSI-2 compatible. If not, a CDB may be delayed until a previous CDB for the same device is completed. For SCSI-2 peripherals, processor 210 initiates an I/O request on SCSI bus 130 and provides the block number as a tag message.
After an SCSI I/O request is initiated, the target device often disconnects while processing the request. This frees SCSI bus 130 for other uses. Processor 210 saves information needed to resume the I/O requested in the disconnected CDB then changes the status of the CDB to DISCONNECT. For example, processor 210 may save a main memory address and a remaining transfer count for an I/O request in the CDB describing the disconnected I/O request.
When a peripheral is ready to reselect an I/O request and SCSI bus 130 is free, the peripheral initiates SCSI handshaking which is responded to by SCSI interface 250. SCSI-2 peripheral devices return a device number and a tag message. The tag message is the block number of the resumed CDB. Processor 210 can quickly identify the address of the CDB from the tag message. With 256 CDBs, the CDBs are in one to one correspondence with the possible tag messages. SCSI-1 devices provide a device ID but do not provide a tag message. Processor 210 searches the active list of CDBs for the one disconnected CDB with the device ID.
When a requested I/O is completed, processor 210 sets the status of the completed CDB to DONE, inserts the CDB at the end of the free list, and changes variable last.sub.-- free.sub.-- CDB to point to the inserted CDB. For example, if the ACTIVE command description block, CDB.sub.0 in FIG. 7B, is completed, CDB.sub.0 is moved to the end of the free list and the active list is reconnect into a loop as shown in FIG. 7C. Moving a CDB to the end of the free list can require the changing forward or backward pointers in up to four CDBs, the CDB moved, the last CDB in the free list, and the two CDBs in active list which are one forward or backward of the moved CDB.
Processor 210 generates an interrupt for the host computer requesting that the host computer check completed CDB's. If two CDBs are completed within a short time, a single interrupt can request that the host computer check all the completed CDBs. The host computer checks the completion status of the DONE CDBs and SG.sub.-- LIST CDBs forward of the CDB indicated by variable last.sub.-- empty.sub.-- CDB, changes the status byte of the CDBs to EMPTY, clears scatter-gather pointers, then updates variable last.sub.-- empty.sub.-- CDB.
Handling of the CDBs and SCSI interface 250 is the primary function of processor 210. Accordingly, the instruction set of processor 210 can be tailored for these tasks and the circuity of processor 210 can be tailored to implement the instruction set. Appendix II discloses an instruction set for one embodiment of processor 210 for use in an SCSI host adapter in accordance with the present invention. A program, in the language of Appendix II, which implements the above disclosed handling of CDBs and SCSI interface 250 is disclosed in Appendix III.
Specific Embodiment of an SCSI Controller
FIG. 8 shows I/O pins of an SCSI controller chip SEAL.sub.-- 1 according to an embodiment of the present invention. Controller chip SEAL.sub.-- 1 has a 24-bit address bus ADR and a 32-bit data bus DAT for connection to a VESA bus of a host computer. A 4-bit byte enable bus BE selects the bytes on data bus DAT which are used by controller SEAL.sub.-- 1. Standard VESA bus control signals as define in the VESA specification are handled on lines LADSN (local bus address strobe), LB 16N (local bus size 16-bit), LCLK (local CPU clock), LGNTN (local bus grant), BLSTN (burst transfer last), BRDYN (burst transfer ready), LREQN (local bus request), HINT (host interrupt), LDEVN (local bus device acknowledge), LRDYN (local bus device ready), RDYRN (ready return), ADSN (address data strobe), WRN (read or write status), MION (memory or I/O status), DCN (data or code status), and RTSN (system reset).
Line ATOSL carries a signal that enables or disable automatic I/O port address selection as describe in U.S. patent application entitled "METHOD AND CIRCUIT FOR RESOLVING I/O PORT ADDRESS CONFLICTS", attorney docket No. M-2563.
I/O) pins for connections to an external local memory (RAM or EEPROM) are provided by a 16-bit local data bus MD and a 14-bit local address bus MA. Lines EECS, CEON, and CE1N are used select whether an external EEPROM chip, a first RAM chip, or a second RAM chip are accessed through data bus MD and address bus MA. Lines CK50M and MWRN carry a clock signal and a read-write signal for local memory.
SCSI interface is provided through an 8-bit SCSI data bus SCD and SCSI handshake lines ATNB (attention), BSYB (busy), ACKB (acknowledge), RSTB (reset), MSGB (message), SELB (selection), CDB (command or data), REQB (request), and IOB (I/O). Line SCDP controls parity checks of the SCSI protocol. Such signals are well known in the art and described by ANSI X3.131-1993 and ANSI X3.131-1986.
Lines BIOSN, ROMEN, and RAMEN control whether a basic input output system (BIOS) for the controller chip is loaded from local memory and whether a RAM or ROM bios is used. Such BIOS are well known and described for example in the IBM PC/AT Technical Reference Manual published by IBM in 1983.
FIGS. 9-18 show block and circuit diagrams of controller chip SEAL.sub.-- 1. FIGS. 9-13 show I/O buffers for the I/O pins disclosed in regard to FIG. 8. In FIGS. 9-13 buffers IBT and IBS are input buffers. Buffers IBTP1 are input buffers with pull-ups to stop the input from floating. Buffers UO1, UO2, UO3, and UO4 are output buffers. Buffer UB4 is bidirectional. Buffers UT2P2 and UT3P2 are input-output buffers with a pull-up on the input. Drivers DV1 and DV2 are predrivers for output signals.
FIG. 10 also includes a 16-bit to 32-bit multiplexer 1510 and a 32-bit to 16-bit multiplexer 1520 which selectably connect data bus DAT to internal data buses SYSDI, SYSDIL, SYSDO, SYSDOL, and SYSDOLA. In FIG. 13, blocks DO.sub.-- DI are historesis buffers, and parity generator PRTY.sub.-- OUT generates a signal indicating the parity of SCSI output data.
FIG. 14 shows blocks representing a host bus interface BIU and a RISC processor RISC with accompanying logic and lines for signals internal to the controller chip SEAL.sub.-- 1. Block A139 is a standard 2-to -4 decoder with identification number A139 from "SLA1000 Series Gate Array Family Cell Library" available from S-MOS Systems, Inc. (the S-MOS library). Block 910 is a 32-bit enable which enables or disable signals to internal data bus SYSDI.
Host bus interface BIU implements the protocols necessary for communications on a VESA bus and connects to a VESA bus through the buffers shown in FIGS. 9-11. Such bus interface circuits are well known in the art and provided on a number of commercially available devices which the attach to VESA buses.
Processor RISC is tailored for control of an SCSI bus and for using the local memory and command description blocks as describe above. A more detailed block diagram of processor RISC is shown in FIG. 19. The primary blocks making up processor RISC are instruction decoding block DECODE, a state machine block RISC.sub.-- ST, and processor register block RISC.sub.-- REG. Complete description of the blocks DECODE, RISC.sub.-- ST, and RISC.sub.-- REG are provided in Appendix IV as VHDL programs.
FIG. 15 shows circuit blocks E2P.sub.-- CTL is CTL REG, REG.sub.-- DEC, LM.sub.-- CTL, and T244. T244 is an 8-bit register from the S-MOS library. Block E2P.sub.-- CTL controls an interface to external EEPROM including a circuit for selecting an I/O port address. The circuitry of block E2P.sub.-- CTL is shown in the FIG. 4, of U.S. patent application entitled "METHOD AND CIRCUIT FOR RESOLVING I/O PORT ADDRESS CONFLICTS", attorney docket No. M-2563 and described in detail therein.
Blocks CTL.sub.-- REG and REG.sub.-- DEC are control registers and register decoders. Block REG.sub.-- DEC implements the I/O port addresses as described in appendix I. A complete description of block REG.sub.-- DEC is provided as a VHDL program in appendix IV. A schematic of block CTL.sub.-- REG is shown in FIG. 20 with a gate level schematic of the timer block TIMER from FIG. 20 is shown in FIG. 21.
Local memory control LM.sub.-- CTL in FIG. 15 provides and interface to local RAM attached to the I/O buses MA and MD. Local memory control LM.sub.-- CTL accesses local RAM through data buses MDO and MDI and address bus MEMADR through the buffer circuitry of FIG. 12. Processor RISC from FIG. 14 access local RAM by providing an address on bus R.sub.-- LM.sub.-- ADR and writing data on bus R.sub.-- MDI or reading data from bus MEM.sub.-- OUT. A host computer can also accesses the local RAM through local memory control LM.sub.-- CTL. Signals indicating a local address or data are provided by the host computer on I/O bus DAT and to local memory control LM.sub.-- CTL though the buffer circuitry of FIG. 10 via bus SYSDOL. A local address is stored in a register internal to local memory control LM.sub.-- CTL. Data is written through LM.sub.-- CTL to local memory via bus MDI. Data is read by the host computer via bus SYSDIL and the buffer circuitry of FIG. 10. A complete description of block LM.sub.-- CTL is provided in Appendix IV as a VHDL program.
FIGS. 16 and 17 show elements of an SCSI interface. SCSI interfaces are well known in the art and commercially available in products such as the AIC-7780 from Adaptec, Inc. and the NRC 53C820 which are both SCSI controller chips. In FIGS. 16 and 17, blocks T244, BLT8, T373T, and T240 are respectively a buffer, a bus latch, a latch, and a tri-state buffer from the S-MOS library. Blocks SC.sub.-- PRTY.sub.-- IN, SCSIBLK, and SC.sub.-- CTL respectively perform parity checks, produce and receive SCSI handshake signals, and control SCSI phase. A gate level schematic of block SC.sub.-- PRTY.sub.-- IN of FIG. 16 is shown in FIG. 24. A schematic of block SC.sub.-- CTL of FIG. 17 is shown in FIG. 25.
FIGS. 22 and 23 show a schematic of block SCSIBLK of FIG. 16. Block ENC3T9 is a selector which selects either MDI�2:0! or SYSDI�10:8! to supply a device ID to block ARBPRO. Block ARBPRO checks priority of the SCSI controller and other SCSI devices during the SCSI arbitration phase. In particular, block ARBPRO compares signals on bus SCDAT, the SCSI data bus, to signals on bus OWN ID to determine which device wins the arbitration. If the SCSI controller has higher priority, a signal on line ARBWINN indicates the controller won the arbitration. During selection phase, block ARBPRO checks if the number of bits set on the SCSI data bus is valid, two and only two. A device ID register in block ARBPRO indicates with which SCSI device the controller will comunicate. A signal on line WRDEVID writes a device ID from bus DIDI into the device ID register. If SELTEDB pulses, a device ID from bus SCDAT is written to the device ID register.
Block SELARB controls sequencing of arbitration and selection phases and detects SCSI bus free phase. The bus free phase is indicated by a signal on line BUSFREE. Arbiration is begun by a signal on line ENABSELB. The well known states in SCSI specification are implemented according to clock signals.
Block HDSHK in FIG. 23 provides both asynchronous and synchronous SCSI handshake signals. A signal on line ENHDSHK begin SCSI Handshake protocols for both synchronous and asynchronous transfer. A signal on line ENSYNC differentiates synchronized or asynchronized handshake. For synchronous transfers, signals on bus RATE�2:0! determines the synchronous transfer speed. Line OFSSTPB carries a signal that stops synchronous transfer if the offset counter status does not allow further synchronous data transfer.
For asynchronous, input SCSI request or acknowledge signals are provided on line REQACKI. Output SCSI acknowledge or request signals are provided on line REQACKO. Signals on line XFERCYC provide to the FIFO signals indicating data transfer. RQAKI is a one clock period pulse after detection of a signal on REQACKI used for internal logic.
Block OFSRATE in FIG. 23 is a local storage circuit that provides SCSI device offset and synchronous transfer rate information. Block OFSRATE is shown in FIG. 2 of U.S. patent application entitled "SCSI BUS CONTROLLER WITH STORAGE FOR PERIPHERAL DEVICE CONFIGURATION DATA", attorney docket No. M-2564.
FIG. 18 shows blocks CNTR.sub.-- DEC, EPTRCNT, CNT.sub.-- OUT, CNT.sub.-- IN.sub.-- MUX, and FF.sub.-- CTL which implement an SCSI FIFO buffer, a host FIFO buffer, and control circuitry for DMA transfers. Such FIFO buffers are well known in the art, and in particular, are in the commercially available AIC-7780 and NRC 53C 820 chips mentioned above.
Although the present invention has been described with reference to particular embodiments, the description is only an example of the invention's application and should not be taken as a limitation. The scope of the present invention is defined by the following claims. ##SPC1##
Claims
  • 1. A host adapter comprising:
  • a host bus interface circuit for sending and receiving signals on local bus of a host computer;
  • a device bus interface for sending and receiving signals on a device bus which couples to one or more peripheral devices;
  • a processor operably coupled to the host bus interface circuit and to the device bus interface; and
  • a local memory control circuit for accessing a local memory of the host adapter, the local memory control circuit being coupled to the processor and to the host bus interface circuit, wherein:
  • the processor and the host computer can access a local memory through the local memory control circuit and exchange data which describes a command to a peripheral device on the device bus;
  • the host computer accesses the local memory by asserting on the local bus an address signal corresponding to the host adapter and a data signal indicating an address of a storage location in the local memory;
  • the local memory control circuit includes a host address register coupled to the host bus interface circuit, wherein the host address register stores the address of the storage location identified by the data signal from the host computer; and
  • the local memory control circuit provides, the address from the host address register as a local address during data transfer between the host computer and the local memory.
  • 2. The host adapter of claim 1, further comprising a local memory attached to local memory control circuit, wherein a portion of the local memory is partitioned into a plurality of command description blocks, each command description block being a set of storage locations dedicated for containing a description of a command to a peripheral device on the device bus.
  • 3. The host adapter of claim 2, wherein the command description blocks are logically ordered into a list and each of the command description blocks comprises:
  • a storage location for containing a forward pointer which indicates a local address of a next command description block in the list; and
  • a storage location for containing a backward pointer which indicates a local address of a previous command description block in the list.
  • 4. The host adapter of claim 2, wherein:
  • a first set of the command description blocks are logically ordered into a first list and a second set of the command description blocks are logically ordered into a second list;
  • the first list contains command description blocks that contain descriptions of commands for peripheral devices on the device bus; and
  • the second list contains command description blocks that are available for the host computer to write a description of a command.
  • 5. The host adapter of claim 2, wherein:
  • the processor further comprises a first register for a command description block number; and
  • the first register provides to the memory interface circuit a signal indicating a set of bits in a starting address of a command description block which corresponds to the command description block number.
  • 6. The host adapter of claim 5, wherein the processor further comprises:
  • a second register for holding an instruction to be executed by the processor;
  • a third register for holding an index value; and
  • a multiplexer having input leads coupled to the second register and to the third register, select leads coupled to the second register, and output leads coupled to the memory interface circuit to provide an address offset within a command description block.
  • 7. A host adapter comprising:
  • a host bus interface circuit for sending and receiving signals on a local bus of a host computer;
  • a device bus interface comprising an SCSI interface circuit for sending and receiving signals to one or more peripheral devices on an SCSI bus;
  • a processor operably coupled to the host bus interface circuit and to the device bus interface; and
  • a local memory control circuit for accessing a local memory of the host adapter, the local memory control circuit being coupled to the processor and to the host bus interface circuit, wherein the processor and the host computer can access a local memory through the local memory control circuit and exchange data which describes a command to a peripheral device on the SCSI bus, and wherein the host computer accesses the local memory by asserting on the local bus an address signal corresponding to the host adapter and a data signal indicating an address of a storage location in the local memory.
  • 8. The host adapter of claim 7, further comprising a local memory attached to local memory control circuit, wherein a portion of the local memory is partitioned into a plurality of command description blocks each command description block containing a set of storage locations dedicated for a description of a command to a peripheral device on the SCSI bus.
  • 9. The host adapter of claim 8, wherein the command description blocks are logically ordered into a list and each of the command description blocks comprises:
  • a storage location for a forward pointer which indicates the local address of the next command description block in the list; and
  • a storage location for a backward pointer which indicates the local address of the previous command description block in the list.
  • 10. The host adapter of claim 8, wherein:
  • a first set of the command description blocks are logically ordered into a first list and a second set of the command description blocks that are logically ordered into a second list;
  • the first list contains command description blocks that contain descriptions of commands to peripheral devices on the SCSI bus; and
  • the second list contains command description blocks that are available for the host computer to write a description of a command.
  • 11. The host adapter of claim 8, wherein:
  • the processor further comprises a first register for a command description block number; and
  • the first register provides to the memory interface circuit a signal indicating a set of bits in a starting address of a command description block which corresponds to the command description block number.
  • 12. The host adapter of claim 11, wherein the SCSI interface circuit comprises means for writing an SCSI-2 tag message from a peripheral device on the SCSI bus into the first register of the processor.
  • 13. The host adapter of claim 11, wherein the processor further comprises:
  • a second register for holding an instruction to be executed by the processor;
  • a third register for holding an index value; and
  • a multiplexer having input leads coupled to the second register and to the third register, select leads coupled to the second register, and output leads coupled to the memory interface circuit, the multiplexer providing an address offset within a command description block.
  • 14. The adapter of claim 7, wherein:
  • the local memory control circuit includes a host address register coupled to the host bus interface circuit, wherein the host address register stores the address of the storage location identified by the data signal from the host computer; and
  • the local memory control circuit provides, the address from the host address register as a local address during data transfer between the host computer and the local memory.
  • 15. A method for providing communications between a host computer and peripheral devices attached to a device bus, comprising the step of:
  • providing an adapter including a host bus interface coupled to the host computer, a device bus interface coupled to the device bus, a local memory, and a processor;
  • allocating space in the local memory for command description blocks;
  • listing empty command description blocks in a free list;
  • having the host computer write an address value into a register in the host bus interface, wherein the address value identifies one of the command description blocks which was allocated in the local memory and listed in the free list;
  • having the host computer write data via the host interface into the local memory, wherein the address value in the register selects the command description block into which the data is written, and wherein the data describes a command for a peripheral device on the device bus and indicates that the command description block is ready to be processed;
  • having the processor check the free list for ready command description blocks;
  • having the processor move any ready command description blocks from the free list to an active list; and
  • having the processor control the device bus interface to process a command as described in a command description block listed in the active list.
  • 16. The method of 15, further comprising the steps of:
  • having the processor change the data in a command description block to indicate that a command indicated by the command description block is complete;
  • having the processor move the complete command description block from the active list to the free list;
  • having the host computer check completed command description block and change the data in the command description block to indicate that the command description block is empty.
  • 17. The method of claim 15, wherein the step of having the processor move a ready command description blocks from the free list to an active list further comprises inserting the command description block into an active list that is circular linked list.
  • 18. The method of claim 15, wherein the step of having the host computer write data into a command description block listed the free list further comprises:
  • writing additional data into a second command description block, wherein the additional data describes additional parameters of the command described by data written into the first command description block; and
  • writing a pointer to the second command description block into the first command description block.
  • 19. The method of claim 15, wherein:
  • the device bus is an SCSI bus;
  • the command description block are numbered; and
  • the step of having the processor control the device bus interface to process a command further comprises transmitting the number of command description block as an SCSI-2 tag message.
  • 20. The host adapter of claim 2, wherein each command description block contains 2.sup.N storage locations and has a starting address which differs by 2.sup.N from a starting address of a command description block which is adjacent in the local memory.
  • 21. The host adapter of claim 8, wherein each command description block contains 2.sup.N storage locations and has a starting address which differs by 2.sup.N from a starting address of a command description block which is adjacent in the local memory.
  • 22. A host adapter comprising:
  • a host bus interface circuit for connection to a local bus of a host computer, the host bus interface including an address decode circuit and a data latch circuit, wherein the data latch circuit latches data from the local bus in response to the address decode circuit identifying that an address signal on the local bus corresponds to a port address of the host adapter;
  • a device bus interface for sending and receiving signals on a device bus which couples to one or more peripheral devices;
  • a processor operably coupled to the host bus interface circuit and to the device bus interface; and
  • a local memory control circuit coupled to the processor and to the host bus interface circuit, the local memory control circuit including a host address register coupled to receive data from the data latch circuit and a multiplexer having a first input bus coupled to the host address register and a second input bus coupled to the processor, wherein multiplexer selects either the host address register or the processor as the source of a local address for a local memory.
  • 23. The host adapter of claim 22, further comprising a local memory attached to local memory control circuit, wherein a first portion of the local memory is dedicated for a program to be executed by the processor, and a second portion of the local memory is partitioned into a plurality of command description blocks, each command description block being a set of storage locations dedicated for data relating to a command to a peripheral device on the device bus.
  • 24. The host adapter of claim 23, wherein the local memory further comprises a third portion containing a list of the command description blocks to which the host computer may write.
US Referenced Citations (13)
Number Name Date Kind
4268906 Bourke et al. May 1981
4371932 Dinwiddie, Jr. et al. Feb 1983
4901232 Harrington et al. Feb 1990
4939644 Harrington et al. Jul 1990
4975829 Clarey et al. Dec 1990
5008808 Fries et al. Apr 1991
5014094 Itoh May 1991
5031091 Wakatsuki et al. Jul 1991
5131081 MacKenna et al. Jul 1992
5155857 Kunisaki et al. Oct 1992
5222221 Hori et al. Jun 1993
5421014 Bucher May 1995
5448702 Garcia, Jr. et al. Sep 1995
Non-Patent Literature Citations (1)
Entry
Texas Instruments SN75C091A SCSI Bus Controller Data Manual, Texas Instruments, Inc., 1990.