Chapter 12. Common Access Method SCSI Controllers

Written by Sergey Babkin.
Modifications for Handbook made by Murray Stokely.
Table of Contents
12.1. Synopsis
12.2. General Architecture
12.3. Polling
12.4. Asynchronous Events
12.5. Interrupts
12.6. Errors Summary
12.7. Timeout Handling

12.1. Synopsis

This document assumes that the reader has a general understanding of device drivers in FreeBSD and of the SCSI protocol. Much of the information in this document was extracted from the drivers:

  • ncr (/sys/pci/ncr.c) by Wolfgang Stanglmeier and Stefan Esser

  • sym (/sys/dev/sym/sym_hipd.c) by Gerard Roudier

  • aic7xxx (/sys/dev/aic7xxx/aic7xxx.c) by Justin T. Gibbs

and from the CAM code itself (by Justin T. Gibbs, see /sys/cam/*). When some solution looked the most logical and was essentially verbatim extracted from the code by Justin T. Gibbs, I marked it as recommended.

The document is illustrated with examples in pseudo-code. Although sometimes the examples have many details and look like real code, it is still pseudo-code. It was written to demonstrate the concepts in an understandable way. For a real driver other approaches may be more modular and efficient. It also abstracts from the hardware details, as well as issues that would cloud the demonstrated concepts or that are supposed to be described in the other chapters of the developers handbook. Such details are commonly shown as calls to functions with descriptive names, comments or pseudo-statements. Fortunately real life full-size examples with all the details can be found in the real drivers.

All FreeBSD documents are available for download at

Questions that are not answered by the documentation may be sent to <>.
Send questions about this document to <>.