1 2 Driver Theory of Operation Manual 3 41. Introduction 5 6This is a short text document that will describe the background, goals 7for, and current theory of operation for the joint Fibre Channel/SCSI 8HBA driver for QLogic hardware. 9 10Because this driver is an ongoing project, do not expect this manual 11to remain entirely up to date. Like a lot of software engineering, the 12ultimate documentation is the driver source. However, this manual should 13serve as a solid basis for attempting to understand where the driver 14started and what is trying to be accomplished with the current source. 15 16The reader is expected to understand the basics of SCSI and Fibre Channel 17and to be familiar with the range of platforms that Solaris, Linux and 18the variant "BSD" Open Source systems are available on. A glossary and 19a few references will be placed at the end of the document. 20 21There will be references to functions and structures within the body of 22this document. These can be easily found within the source using editor 23tags or grep. There will be few code examples here as the code already 24exists where the reader can easily find it. 25 262. A Brief History for this Driver 27 28This driver originally started as part of work funded by NASA Ames 29Research Center's Numerical Aerodynamic Simulation center ("NAS" for 30short) for the QLogic PCI 1020 and 1040 SCSI Host Adapters as part of my 31work at porting the NetBSD Operating System to the Alpha architectures 32(specifically the AlphaServer 8200 and 8400 platforms). In short, it 33started just as simple single SCSI HBA driver for just the purpose of 34running off a SCSI disk. This work took place starting in January, 1997. 35 36Because the first implementation was for NetBSD, which runs on a very 37large number of platforms, and because NetBSD supported both systems with 38SBus cards (e.g., Sun SPARC systems) as well as systems with PCI cards, 39and because the QLogic SCSI cards came in both SBus and PCI versions, the 40initial implementation followed the very thoughtful NetBSD design tenet 41of splitting drivers into what are called MI (for Machine Independent) 42and MD (Machine Dependent) portions. The original design therefore was 43from the premise that the driver would drive both SBus and PCI card 44variants. These busses are similar but have quite different constraints, 45and while the QLogic SBus and PCI cards are very similar, there are some 46significant differences. 47 48After this initial goal had been met, there began to be some talk about 49looking into implementing Fibre Channel mass storage at NAS. At this time 50the QLogic 2100 FC/AL HBA was about to become available. After looking at 51the way it was designed I concluded that it was so darned close to being 52just like the SCSI HBAs that it would be insane to *not* leverage off of 53the existing driver. So, we ended up with a driver for NetBSD that drove 54PCI and SBus SCSI cards, and now also drove the QLogic 2100 FC-AL HBA. 55 56After this, ports to non-NetBSD platforms became interesting as well. 57This took the driver out of the interest with NAS and into interested 58support from a number of other places. Since the original NetBSD 59development, the driver has been ported to FreeBSD, OpenBSD, Linux, 60Solaris, and two proprietary systems. Following from the original MI/MD 61design of NetBSD, a rather successful attempt has been made to keep the 62Operating System Platform differences segregated and to a minimum. 63 64Along the way, support for the 2200 as well as full fabric and target 65mode support has been added, and 2300 support as well as an FC-IP stack 66are planned. 67 683. Driver Design Goals 69 70The driver has not started out as one normally would do such an effort. 71Normally you design via top-down methodologies and set an initial goal 72and meet it. This driver has had a design goal that changes from almost 73the very first. This has been an extremely peculiar, if not risque, 74experience. As a consequence, this section of this document contains 75a bit of "reconstruction after the fact" in that the design goals are 76as I perceive them to be now- not necessarily what they started as. 77 78The primary design goal now is to have a driver that can run both the 79SCSI and Fibre Channel SCSI prototocols on multiple OS platforms with 80as little OS platform support code as possible. 81 82The intended support targets for SCSI HBAs is to support the single and 83dual channel PCI Ultra2 and PCI Ultra3 cards as well as the older PCI 84Ultra single channel cards and SBus cards. 85 86The intended support targets for Fibre Channel HBAs is the 2100, 2200 87and 2300 PCI cards. 88 89Fibre Channel support should include complete fabric and public loop 90as well as private loop and private loop, direct-attach topologies. 91FC-IP support is also a goal. 92 93For both SCSI and Fibre Channel, simultaneous target/initiator mode support 94is a goal. 95 96Pure, raw, performance is not a primary goal of this design. This design, 97because it has a tremendous amount of code common across multiple 98platforms, will undoubtedly never be able to beat the performance of a 99driver that is specifically designed for a single platform and a single 100card. However, it is a good strong secondary goal to make the performance 101penalties in this design as small as possible. 102 103Another primary aim, which almost need not be stated, is that the 104implementation of platform differences must not clutter up the common 105code with platform specific defines. Instead, some reasonable layering 106semantics are defined such that platform specifics can be kept in the 107platform specific code. 108 1094. QLogic Hardware Architecture 110 111In order to make the design of this driver more intelligible, some 112description of the Qlogic hardware architecture is in order. This will 113not be an exhaustive description of how this card works, but will 114note enough of the important features so that the driver design is 115hopefully clearer. 116 1174.1 Basic QLogic hardware 118 119The QLogic HBA cards all contain a tiny 16-bit RISC-like processor and 120varying sizes of SRAM. Each card contains a Bus Interface Unit (BIU) 121as appropriate for the host bus (SBus or PCI). The BIUs allow access 122to a set of dual-ranked 16 bit incoming and outgoing mailbox registers 123as well as access to control registers that control the RISC or access 124other portions of the card (e.g., Flash BIOS). The term 'dual-ranked' 125means that at the same host visible address if you write a mailbox 126register, that is a write to an (incoming, to the HBA) mailbox register, 127while a read to the same address reads another (outgoing, to the HBA) 128mailbox register with completely different data. Each HBA also then has 129core and auxiliary logic which either is used to interface to a SCSI bus 130(or to external bus drivers that connect to a SCSI bus), or to connect 131to a Fibre Channel bus. 132 1334.2 Basic Control Interface 134 135There are two principle I/O control mechanisms by which the driver 136communicates with and controls the QLogic HBA. The first mechanism is to 137use the incoming mailbox registers to interrupt and issue commands to 138the RISC processor (with results usually, but not always, ending up in 139the ougtoing mailbox registers). The second mechanism is to establish, 140via mailbox commands, circular request and response queues in system 141memory that are then shared between the QLogic and the driver. The 142request queue is used to queue requests (e.g., I/O requests) for the 143QLogic HBA's RISC engine to copy into the HBA memory and process. The 144result queue is used by the QLogic HBA's RISC engine to place results of 145requests read from the request queue, as well as to place notification 146of asynchronous events (e.g., incoming commands in target mode). 147 148To give a bit more precise scale to the preceding description, the QLogic 149HBA has 8 dual-ranked 16 bit mailbox registers, mostly for out-of-band 150control purposes. The QLogic HBA then utilizes a circular request queue 151of 64 byte fixed size Queue Entries to receive normal initiator mode 152I/O commands (or continue target mode requests). The request queue may 153be up to 256 elements for the QLogic 1020 and 1040 chipsets, but may 154be quite larger for the QLogic 12X0/12160 SCSI and QLogic 2X00 Fibre 155Channel chipsets. 156 157In addition to synchronously initiated usage of mailbox commands by 158the host system, the QLogic may also deliver asynchronous notifications 159solely in outgoing mailbox registers. These asynchronous notifications in 160mailboxes may be things like notification of SCSI Bus resets, or that the 161Fabric Name server has sent a change notification, or even that a specific 162I/O command completed without error (this is called 'Fast Posting' 163and saves the QLogic HBA from having to write a response queue entry). 164 165The QLogic HBA is an interrupting card, and when servicing an interrupt 166you really only have to check for either a mailbox interrupt or an 167interrupt notification that the response queue has an entry to 168be dequeued. 169 1704.3 Fibre Channel SCSI out of SCSI 171 172QLogic took the approach in introducing the 2X00 cards to just treat 173FC-AL as a 'fat' SCSI bus (a SCSI bus with more than 15 targets). All 174of the things that you really need to do with Fibre Channel with respect 175to providing FC-4 services on top of a Class 3 connection are performed 176by the RISC engine on the QLogic card itself. This means that from 177an HBA driver point of view, very little needs to change that would 178distinguish addressing a Fibre Channel disk from addressing a plain 179old SCSI disk. 180 181However, in the details it's not *quite* that simple. For example, in 182order to manage Fabric Connections, the HBA driver has to do explicit 183binding of entities it's queried from the name server to specific 'target' 184ids (targets, in this case, being a virtual entity). 185 186Still- the HBA firmware does really nearly all of the tedious management 187of Fibre Channel login state. The corollary to this sometimes is the 188lack of ability to say why a particular login connection to a Fibre 189Channel disk is not working well. 190 191There are clear limits with the QLogic card in managing fabric devices. 192The QLogic manages local loop devices (LoopID or Target 0..126) itself, 193but for the management of fabric devices, it has an absolute limit of 194253 simultaneous connections (256 entries less 3 reserved entries). 195 1965. Driver Architecture 197 1985.1 Driver Assumptions 199 200The first basic assumption for this driver is that the requirements for 201a SCSI HBA driver for any system is that of a 2 or 3 layer model where 202there are SCSI target device drivers (drivers which drive SCSI disks, 203SCSI tapes, and so on), possibly a middle services layer, and a bottom 204layer that manages the transport of SCSI CDB's out a SCSI bus (or across 205Fibre Channel) to a SCSI device. It's assumed that each SCSI command is 206a separate structure (or pointer to a structure) that contains the SCSI 207CDB and a place to store SCSI Status and SCSI Sense Data. 208 209This turns out to be a pretty good assumption. All of the Open Source 210systems (*BSD and Linux) and most of the proprietary systems have this 211kind of structure. This has been the way to manage SCSI subsystems for 212at least ten years. 213 214There are some additional basic assumptions that this driver makes- primarily 215in the arena of basic simple services like memory zeroing, memory copying, 216delay, sleep, microtime functions. It doesn't assume much more than this. 217 2185.2 Overall Driver Architecture 219 220The driver is split into a core (machine independent) module and platform 221and bus specific outer modules (machine dependent). 222 223The core code (in the files isp.c, isp_inline.h, ispvar.h, ispreg.h and 224ispmbox.h) handles: 225 226 + Chipset recognition and reset and firmware download (isp_reset) 227 + Board Initialization (isp_init) 228 + First level interrupt handling (response retrieval) (isp_intr) 229 + A SCSI command queueing entry point (isp_start) 230 + A set of control services accessed either via local requirements within 231 the core module or via an externally visible control entry point 232 (isp_control). 233 234The platform/bus specific modules (and definitions) depend on each 235platform, and they provide both definitions and functions for the core 236module's use. Generally a platform module set is split into a bus 237dependent module (where configuration is begun from and bus specific 238support functions reside) and relatively thin platform specific layer 239which serves as the interconnect with the rest of this platform's SCSI 240subsystem. 241 242For ease of bus specific access issues, a centralized soft state 243structure is maintained for each HBA instance (struct ispsoftc). This 244soft state structure contains a machine/bus dependent vector (mdvec) 245for functions that read and write hardware registers, set up DMA for the 246request/response queues and fibre channel scratch area, set up and tear 247down DMA mappings for a SCSI command, provide a pointer to firmware to 248load, and other minor things. 249 250The machine dependent outer module must provide functional entry points 251for the core module: 252 253 + A SCSI command completion handoff point (isp_done) 254 + An asynchronous event handler (isp_async) 255 + A logging/printing function (isp_prt) 256 257The machine dependent outer module code must also provide a set of 258abstracting definitions which is what the core module utilizes heavily 259to do its job. These are discussed in detail in the comments in the 260file ispvar.h, but to give a sense of the range of what is required, 261let's illustrate two basic classes of these defines. 262 263The first class are "structure definition/access" class. An 264example of these would be: 265 266 XS_T Platform SCSI transaction type (i.e., command for HBA) 267 .. 268 XS_TGT(xs) gets the target from an XS_T 269 .. 270 XS_TAG_TYPE(xs) which type of tag to use 271 .. 272 273The second class are 'functional' class definitions. Some examples of 274this class are: 275 276 MEMZERO(dst, src) platform zeroing function 277 .. 278 MBOX_WAIT_COMPLETE(struct ispsoftc *) wait for mailbox cmd to be done 279 280Note that the former is likely to be simple replacement with bzero or 281memset on most systems, while the latter could be quite complex. 282 283This soft state structure also contains different parameter information 284based upon whether this is a SCSI HBA or a Fibre Channel HBA (which is 285filled in by the code module). 286 287In order to clear up what is undoubtedly a seeming confusion of 288interconnects, a description of the typical flow of code that performs 289boards initialization and command transactions may help. 290 2915.3 Initialization Code Flow 292 293Typically a bus specific module for a platform (e.g., one that wants 294to configure a PCI card) is entered via that platform's configuration 295methods. If this module recognizes a card and can utilize or construct the 296space for the HBA instance softc, it does so, and initializes the machine 297dependent vector as well as any other platform specific information that 298can be hidden in or associated with this structure. 299 300Configuration at this point usually involves mapping in board registers 301and registering an interrupt. It's quite possible that the core module's 302isp_intr function is adequate to be the interrupt entry point, but often 303it's more useful have a bus specific wrapper module that calls isp_intr. 304 305After mapping and interrupt registry is done, isp_reset is called. 306Part of the isp_reset call may cause callbacks out to the bus dependent 307module to perform allocation and/or mapping of Request and Response 308queues (as well as a Fibre Channel scratch area if this is a Fibre 309Channel HBA). The reason this is considered 'bus dependent' is that 310only the bus dependent module may have the information that says how 311one could perform I/O mapping and dependent (e.g., on a Solaris system) 312on the Request and Response queues. Another callback can enable the *use* 313of interrupts should this platform be able to finish configuration in 314interrupt driven mode. 315 316If isp_reset is successful at resetting the QLogic chipset and downloading 317new firmware (if available) and setting it running, isp_init is called. If 318isp_init is successful in doing initial board setups (including reading 319NVRAM from the QLogic card), then this bus specicic module will call the 320platform dependent module that takes the appropriate steps to 'register' 321this HBA with this platform's SCSI subsystem. Examining either the 322OpenBSD or the NetBSD isp_pci.c or isp_sbus.c files may assist the reader 323here in clarifying some of this. 324 3255.4 Initiator Mode Command Code Flow 326 327A successful execution of isp_init will lead to the driver 'registering' 328itself with this platform's SCSI subsystem. One assumed action for this 329is the registry of a function that the SCSI subsystem for this platform 330will call when it has a SCSI command to run. 331 332The platform specific module function that receives this will do whatever 333it needs to prepare this command for execution in the core module. This 334sounds vague, but it's also very flexible. In principle, this could be 335a complete marshalling/demarshalling of this platform's SCSI command 336structure (should it be impossible to represent in an XS_T). In addition, 337this function can also block commands from running (if, e.g., Fibre 338Channel loop state would preclude successful starting of the command). 339 340When it's ready to do so, the function isp_start is called with this 341command. This core module tries to allocate request queue space for 342this command. It also calls through the machine dependent vector 343function to make sure any DMA mapping for this command is done. 344 345Now, DMA mapping here is possibly a misnomer, as more than just 346DMA mapping can be done in this bus dependent function. This is 347also the place where any endian byte-swizzling will be done. At any 348rate, this function is called last because the process of establishing 349DMA addresses for any command may in fact consume more Request Queue 350entries than there are currently available. If the mapping and other 351functions are successful, the QLogic mailbox inbox pointer register 352is updated to indicate to the QLogic that it has a new request to 353read. 354 355If this function is unsuccessful, policy as to what to do at this point is 356left to the machine dependent platform function which called isp_start. In 357some platforms, temporary resource shortages can be handled by the main 358SCSI subsystem. In other platforms, the machine dependent code has to 359handle this. 360 361In order to keep track of commands that are in progress, the soft state 362structure contains an array of 'handles' that are associated with each 363active command. When you send a command to the QLogic firmware, a portion 364of the Request Queue entry can contain a non-zero handle identifier so 365that at a later point in time in reading either a Response Queue entry 366or from a Fast Posting mailbox completion interrupt, you can take this 367handle to find the command you were waiting on. It should be noted that 368this is probably one of the most dangerous areas of this driver. Corrupted 369handles will lead to system panics. 370 371At some later point in time an interrupt will occur. Eventually, 372isp_intr will be called. This core module will determine what the cause 373of the interrupt is, and if it is for a completing command. That is, 374it'll determine the handle and fetch the pointer to the command out of 375storage within the soft state structure. Skipping over a lot of details, 376the machine dependent code supplied function isp_done is called with the 377pointer to the completing command. This would then be the glue layer that 378informs the SCSI subsystem for this platform that a command is complete. 379 3805.5 Asynchronous Events 381 382Interrupts occur for events other than commands (mailbox or request queue 383started commands) completing. These are called Asynchronous Mailbox 384interrupts. When some external event causes the SCSI bus to be reset, 385or when a Fibre Channel loop changes state (e.g., a LIP is observed), 386this generates such an asynchronous event. 387 388Each platform module has to provide an isp_async entry point that will 389handle a set of these. This isp_async entry point also handles things 390which aren't properly async events but are simply natural outgrowths 391of code flow for another core function (see discussion on fabric device 392management below). 393 3945.6 Target Mode Code Flow 395 396This section could use a lot of expansion, but this covers the basics. 397 398The QLogic cards, when operating in target mode, follow a code flow that is 399essentially the inverse of that for intiator mode describe above. In this 400scenario, an interrupt occurs, and present on the Response Queue is a 401queue entry element defining a new command arriving from an initiator. 402 403This is passed to possibly external target mode handler. This driver 404provides some handling for this in a core module, but also leaves 405things open enough that a completely different target mode handler 406may accept this incoming queue entry. 407 408The external target mode handler then turns around forms up a response 409to this 'response' that just arrived which is then placed on the Request 410Queue and handled very much like an initiator mode command (i.e., calling 411the bus dependent DMA mapping function). If this entry completes the 412command, no more need occur. But often this handles only part of the 413requested command, so the QLogic firmware will rewrite the response 414to the initial 'response' again onto the Response Queue, whereupon the 415target mode handler will respond to that, and so on until the command 416is completely handled. 417 418Because almost no platform provides basic SCSI Subsystem target mode 419support, this design has been left extremely open ended, and as such 420it's a bit hard to describe in more detail than this. 421 4225.7 Locking Assumptions 423 424The observant reader by now is likely to have asked the question, "but what 425about locking? Or interrupt masking" by now. 426 427The basic assumption about this is that the core module does not know 428anything directly about locking or interrupt masking. It may assume that 429upon entry (e.g., via isp_start, isp_control, isp_intr) that appropriate 430locking and interrupt masking has been done. 431 432The platform dependent code may also therefore assume that if it is 433called (e.g., isp_done or isp_async) that any locking or masking that 434was in place upon the entry to the core module is still there. It is up 435to the platform dependent code to worry about avoiding any lock nesting 436issues. As an example of this, the Linux implementation simply queues 437up commands completed via the callout to isp_done, which it then pushes 438out to the SCSI subsystem after a return from it's calling isp_intr is 439executed (and locks dropped appropriately, as well as avoidance of deep 440interrupt stacks). 441 442Recent changes in the design have now eased what had been an original 443requirement that the while in the core module no locks or interrupt 444masking could be dropped. It's now up to each platform to figure out how 445to implement this. This is principally used in the execution of mailbox 446commands (which are principally used for Loop and Fabric management via 447the isp_control function). 448 4495.8 SCSI Specifics 450 451The driver core or platform dependent architecture issues that are specific 452to SCSI are few. There is a basic assumption that the QLogic firmware 453supported Automatic Request sense will work- there is no particular provision 454for disabling it's usage on a per-command basis. 455 4565.9 Fibre Channel Specifics 457 458Fibre Channel presents an interesting challenge here. The QLogic firmware 459architecture for dealing with Fibre Channel as just a 'fat' SCSI bus 460is fine on the face of it, but there are some subtle and not so subtle 461problems here. 462 4635.9.1 Firmware State 464 465Part of the initialization (isp_init) for Fibre Channel HBAs involves 466sending a command (Initialize Control Block) that establishes Node 467and Port WWNs as well as topology preferences. After this occurs, 468the QLogic firmware tries to traverese through serveral states: 469 470 FW_CONFIG_WAIT 471 FW_WAIT_AL_PA 472 FW_WAIT_LOGIN 473 FW_READY 474 FW_LOSS_OF_SYNC 475 FW_ERROR 476 FW_REINIT 477 FW_NON_PART 478 479It starts with FW_CONFIG_WAIT, attempts to get an AL_PA (if on an FC-AL 480loop instead of being connected as an N-port), waits to log into all 481FC-AL loop entities and then hopefully transitions to FW_READY state. 482 483Clearly, no command should be attempted prior to FW_READY state is 484achieved. The core internal function isp_fclink_test (reachable via 485isp_control with the ISPCTL_FCLINK_TEST function code). This function 486also determines connection topology (i.e., whether we're attached to a 487fabric or not). 488 4895.9.2. Loop State Transitions- From Nil to Ready 490 491Once the firmware has transitioned to a ready state, then the state of the 492connection to either arbitrated loop or to a fabric has to be ascertained, 493and the identity of all loop members (and fabric members validated). 494 495This can be very complicated, and it isn't made easy in that the QLogic 496firmware manages PLOGI and PRLI to devices that are on a local loop, but 497it is the driver that must manage PLOGI/PRLI with devices on the fabric. 498 499In order to manage this state an eight level staging of current "Loop" 500(where "Loop" is taken to mean FC-AL or N- or F-port connections) states 501in the following ascending order: 502 503 LOOP_NIL 504 LOOP_LIP_RCVD 505 LOOP_PDB_RCVD 506 LOOP_SCANNING_FABRIC 507 LOOP_FSCAN_DONE 508 LOOP_SCANNING_LOOP 509 LOOP_LSCAN_DONE 510 LOOP_SYNCING_PDB 511 LOOP_READY 512 513When the core code initializes the QLogic firmware, it sets the loop 514state to LOOP_NIL. The first 'LIP Received' asynchronous event sets state 515to LOOP_LIP_RCVD. This should be followed by a "Port Database Changed" 516asynchronous event which will set the state to LOOP_PDB_RCVD. Each of 517these states, when entered, causes an isp_async event call to the 518machine dependent layers with the ISPASYNC_CHANGE_NOTIFY code. 519 520After the state of LOOP_PDB_RCVD is reached, the internal core function 521isp_scan_fabric (reachable via isp_control(..ISPCTL_SCAN_FABRIC)) will, 522if the connection is to a fabric, use Simple Name Server mailbox mediated 523commands to dump the entire fabric contents. For each new entity, an 524isp_async event will be generated that says a Fabric device has arrived 525(ISPASYNC_FABRIC_DEV). The function that isp_async must perform in this 526step is to insert possibly remove devices that it wants to have the 527QLogic firmware log into (at LOOP_SYNCING_PDB state level)). 528 529After this has occurred, the state LOOP_FSCAN_DONE is set, and then the 530internal function isp_scan_loop (isp_control(...ISPCTL_SCAN_LOOP)) can 531be called which will then scan for any local (FC-AL) entries by asking 532for each possible local loop id the QLogic firmware for a Port Database 533entry. It's at this level some entries cached locally are purged 534or shifting loopids are managed (see section 5.9.4). 535 536The final step after this is to call the internal function isp_pdb_sync 537(isp_control(..ISPCTL_PDB_SYNC)). The purpose of this function is to 538then perform the PLOGI/PRLI functions for fabric devices. The next state 539entered after this is LOOP_READY, which means that the driver is ready 540to process commands to send to Fibre Channel devices. 541 5425.9.3 Fibre Channel variants of Initiator Mode Code Flow 543 544The code flow in isp_start for Fibre Channel devices is the same as it is 545for SCSI devices, but with a notable exception. 546 547Maintained within the fibre channel specific portion of the driver soft 548state structure is a distillation of the existing population of both 549local loop and fabric devices. Because Loop IDs can shift on a local 550loop but we wish to retain a 'constant' Target ID (see 5.9.4), this 551is indexed directly via the Target ID for the command (XS_TGT(xs)). 552 553If there is a valid entry for this Target ID, the command is started 554(with the stored 'Loop ID'). If not the command is completed with 555the error that is just like a SCSI Selection Timeout error. 556 557This code is currently somewhat in transition. Some platforms to 558do firmware and loop state management (as described above) at this 559point. Other platforms manage this from the machine dependent layers. The 560important function to watch in this respect is isp_fc_runstate (in 561isp_inline.h). 562 5635.9.4 "Target" in Fibre Channel is a fixed virtual construct 564 565Very few systems can cope with the notion that "Target" for a disk 566device can change while you're using it. But one of the properties of 567for arbitrated loop is that the physical bus address for a loop member 568(the AL_PA) can change depending on when and how things are inserted in 569the loop. 570 571To illustrate this, let's take an example. Let's say you start with a 572loop that has 5 disks in it. At boot time, the system will likely find 573them and see them in this order: 574 575disk# Loop ID Target ID 576disk0 0 0 577disk1 1 1 578disk2 2 2 579disk3 3 3 580disk4 4 4 581 582The driver uses 'Loop ID' when it forms requests to send a comamnd to 583each disk. However, it reports to NetBSD that things exist as 'Target 584ID'. As you can see here, there is perfect correspondence between disk, 585Loop ID and Target ID. 586 587Let's say you add a new disk between disk2 and disk3 while things are 588running. You don't really often see this, but you *could* see this where 589the loop has to renegotiate, and you end up with: 590 591disk# Loop ID Target ID 592disk0 0 0 593disk1 1 1 594disk2 2 2 595diskN 3 ? 596disk3 4 ? 597disk4 5 ? 598 599Clearly, you don't want disk3 and disk4's "Target ID" to change while you're 600running since currently mounted filesystems will get trashed. 601 602What the driver is supposed to do (this is the function of isp_scan_loop), 603is regenerate things such that the following then occurs: 604 605disk# Loop ID Target ID 606disk0 0 0 607disk1 1 1 608disk2 2 2 609diskN 3 5 610disk3 4 3 611disk4 5 4 612 613So, "Target" is a virtual entity that is maintained while you're running. 614 6156. Glossary 616 617HBA - Host Bus Adapter 618 619SCSI - Small Computer 620 6217. References 622 623Various URLs of interest: 624 625http://www.netbsd.org - NetBSD's Web Page 626http://www.openbsd.org - OpenBSD's Web Page 627https://www.freebsd.org - FreeBSD's Web Page 628 629http://www.t10.org - ANSI SCSI Commitee's Web Page 630 (SCSI Specs) 631http://www.t11.org - NCITS Device Interface Web Page 632 (Fibre Channel Specs) 633 634