From f690f2984c870e207f05990eda7ecbd30a3fd8c1 Mon Sep 17 00:00:00 2001 From: gferg <> Date: Wed, 17 Jan 2001 16:36:57 +0000 Subject: [PATCH] new --- .../SCSI-2.4-HOWTO/SCSI-2.4-HOWTO.sgml | 2691 +++++++++++++++++ LDP/howto/docbook/SCSI-2.4-HOWTO/cdrom.jpeg | Bin 0 -> 24091 bytes LDP/howto/docbook/SCSI-2.4-HOWTO/ppscsi.jpeg | Bin 0 -> 7341 bytes .../docbook/SCSI-2.4-HOWTO/scsi-arch.jpeg | Bin 0 -> 29086 bytes 4 files changed, 2691 insertions(+) create mode 100644 LDP/howto/docbook/SCSI-2.4-HOWTO/SCSI-2.4-HOWTO.sgml create mode 100644 LDP/howto/docbook/SCSI-2.4-HOWTO/cdrom.jpeg create mode 100644 LDP/howto/docbook/SCSI-2.4-HOWTO/ppscsi.jpeg create mode 100644 LDP/howto/docbook/SCSI-2.4-HOWTO/scsi-arch.jpeg diff --git a/LDP/howto/docbook/SCSI-2.4-HOWTO/SCSI-2.4-HOWTO.sgml b/LDP/howto/docbook/SCSI-2.4-HOWTO/SCSI-2.4-HOWTO.sgml new file mode 100644 index 00000000..010e8e70 --- /dev/null +++ b/LDP/howto/docbook/SCSI-2.4-HOWTO/SCSI-2.4-HOWTO.sgml @@ -0,0 +1,2691 @@ + + + + + The Linux SCSI subsystem in 2.4 + + + + Douglas + Gilbert + +
+ dgilbert@interlog.com +
+
+
+
+ 2nd January 2001 + + + 2000 + 2001 + Douglas Gilbert + + + + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with no Invariant Sections, with no Front-Cover Texts, and with + no Back-Cover Texts. + + + For an online copy of the license see + + www.fsf.org/copyleft/fdl.html. + + + +
+ + + + + Introduction + +This document describes the SCSI subsystem as the Linux kernel +enters the 2.4 production series. + + +An external view of the SCSI subsystem is the main theme. +Material is included to help the system administration of the Linux SCSI +subsystem. There are also brief descriptions of ioctl()s and interfaces +that may be relevant to those writing applications that use this subsystem. +However internal data structures and design issues are not addressed +[see reference W2]. To unclutter the presentation, +compile options and system calls (including ioctl()s) have been placed in +. Although not strictly part of the SCSI +subsystem, there is also description of raw devices in . + + +This document follows on from one written four years ago by Drew +Eckhardt called the SCSI-HOWTO [see reference W7]. +That document described the SCSI subsystem in Linux kernel 1.2 and 1.3 +series. It is still available from the Linux Documentation Project +[LDP, see reference W8] in its "unmaintained" +section. Both documents have roughly similar structures although Drew's +document has a lot of information on the adapter drivers. + + +The most up to date version of this document can be found at + +www.torque.net/scsi/linux_scsi_24. + + +This document was built on 2nd January 2001. + + + + + Architectural Overview + +The SCSI subsystem has a 3 level architecture with the "upper" level +being closest to the user/kernel interface while the "lower" level +is closest to the hardware. The upper level drivers are commonly known +by a terse two letter abbreviation (e.g. "sd" for SCSI disk driver). +The names of the corresponding module drivers which, for historical +reasons, sometimes differ from the built in driver names are shown in +braces in the following diagram. + + + + + + + + + + + The 3 level driver architecture of the SCSI subsystem. + + + + +The upper level supports the user-kernel interface. In the case of sd and sr +this is a block device interface while for st and sg this is a character +device interface. Any operation using the SCSI subsystem (e.g. reading a +sector from a disk) involves one driver at each of the 3 levels (e.g. sd, +SCSI mid level and aic7xxx drivers). + + +As can be seen from the diagram, the SCSI mid level is common to all +operations. The SCSI mid level defines internal interfaces and provides +common services to the upper and lower level drivers. Ioctls provided by +the mid level are available to the file descriptors belonging to any of +the 4 upper level drivers. + + +The most common operation on a block device is to "mount" a +file system. For a sd device typically a partition is mounted +(e.g. mount -t ext2 /dev/sda6 /home). For a +sr device usually the whole device is mounted (e.g. +mount -t iso9660 /dev/sr0 /mnt/cdrom). The dd + command can be used to read or write from block devices. +In this case the block size argument ("bs") needs to be set to +the block size of the device (e.g. 512 bytes for most disks) +or an integral multiple of that device block size (e.g. 8192 bytes). +A recent addition to the block subsystem allows a device (or partition) +to be mounted more than once, at different mount points. + + +Sd is a member of the generic disk family, as is the hd device from the +IDE subsystem. Apart from mounting sd devices, the fdisk + command is available to view or modify a disk's +partition table. Although the hdparm command is +primarily intended for IDE disks, some options work on SCSI +disks. + + +Sr is a member of the CD-ROM subsystem. Apart from mounting file +systems (e.g. iso9660), audio CDs can also be read. The latter +action does not involve mounting a file +system but typically by invoking some ioctls. General +purpose Linux commands such as dd cannot be +used on audio CDs. + + +St is a char device for reading and writing tapes. Even though +general purpose command like tar and +dd can be used, the mt +command is recommended since it is specially designed for this purpose. + + +Sg is a SCSI command pass through device that uses a char device +interface. General purpose Linux commands should not + be used on sg devices. Applications such +as SANE (for scanners), cdrecord and +cdrdao (for cd writers) and +cdparanoia (for reading audio CDs digitally) use sg. + + + + + Names and Addresses + +This section covers the various naming schemes that exist in Linux +and the SCSI worlds and how they interact. + + + + SCSI Addressing + +Linux has a four level hierarchical addressing scheme for SCSI devices: + +SCSI adapter number {host} +channel number {bus} +id number {target} +lun {lun} + + + +"Lun" is the common SCSI abbreviation of Logical Unit Number. +The terms in braces are the name conventions used by device pseudo file system +(devfs). "Bus" is used in preference to "channel" in the description below. + + +The SCSI adapter number is typically an arbitrary numbering of the adapter +cards on the internal IO buses (e.g. PCI, PCMCIA, ISA etc) of the computer. +Such adapters are sometimes termed as HBAs (host bus adapters). +SCSI adapter numbers are issued by the kernel in ascending order starting +with 0. + + +Each HBA may control one of more SCSI buses. The various types of SCSI +buses are listed in . + + +Each SCSI bus can have multiple SCSI devices connected to it. In SCSI +parlance the HBA is called the "initiator" and takes up one SCSI id +number (typically 7). The initiator + +SCSI standards allow for multiple initiators to be present on a single bus. +This is not well supported in Linux although there are patches around +that improve this situation. + +talks to targets which are commonly +known as SCSI devices (e.g. disks). On SCSI parallel buses the number +of ids is related to the width. 8 bit buses (sometimes called "narrow") +can have 8 SCSI ids of which 1 is taken by the HBA leaving 7 for SCSI +devices. Wide SCSI buses are 16 bits wide and can have a maximum of 15 +SCSI devices (targets) attached. The SCSI 3 draft standard allows a +large number of ids to be present on a SCSI bus. + + +Each SCSI device can contain multiple Logical Unit Numbers (LUNs). These +are typically used by sophisticated tape and cdrom units that support +multiple media. + + +So Linux's flavour of SCSI addressing is a four level hierarchy: + +<scsi(_adapter_number), channel, id, lun> + +Using the naming conventions of devfs this becomes: + +<host, bus, target, lun> + + + + + + Device Names + +Device names can be thought of as gateways to a kernel driver that +controls a device rather than the device itself. Hence there can be +multiple device names some of which may offer slightly different +characteristics, all mapping to the same actual device. + + +The device names of the various SCSI devices are found within the +/dev directory. Traditionally in Linux, SCSI +devices have been identified by their major and minor device number +rather than their SCSI bus addresses (e.g. SCSI target id and LUN). +The device pseudo file system (devfs) moves away from the major and +minor device number scheme and for the SCSI subsystem uses device names +based on the SCSI bus addresses [discussed later in + and ref: W5]. +Alternatively, there is a utility called scsidev +which addresses this issue within the scope of the Linux SCSI subsystem +and thus does not have the same system wide impact as devfs. Scsidev is +discussed later in and ref: +W6. + + +Eight block major numbers are reserved for SCSI disks: 8, 65, 66, 67, 68, +69, 70 and 71. Each major can accommodate 256 minor numbers which, in the +case of SCSI disks, are subdivided as follows: + +[b,8,0] /dev/sda +[b,8,1] /dev/sda1 +.... +[b,8,15] /dev/sda15 +[b,8,16] /dev/sdb +[b,8,17] /dev/sdb1 +.... +[b,8,255] /dev/sdp15 + + + +The disk device names without a trailing digit refer to the whole disk +(e.g. /dev/sda) +while those with a trailing digit refer to one of the 15 allowable +partitions within that disk. + + +The remaining 7 SCSI disk block major numbers follow a similar pattern: + +[b,65,0] /dev/sdq +[b,65,1] /dev/sdq1 +.... +[b,65,159] /dev/sdz15 +[b,65,160] /dev/sdaa +[b,65,161] /dev/sdaa1 +.... +[b,65,255] /dev/sdaf15 +[b,66,0] /dev/sdag +[b,66,1] /dev/sdag1 +.... +[b,66,255] /dev/sdav15 +.... +[b,71,255] /dev/sddx15 + + + +So there are 128 possible disks (i.e. /dev/sda to +/dev/sddx) each having up +to 15 partitions. By way of contrast, the IDE subsystem allows 20 disks +(10 controllers each with 1 master and 1 slave) which can have up to 63 +partitions each. + + +SCSI CD-ROM devices are allocated the block major number of 11. Traditionally +sr has been the device name but scd +probably is more recognizable and is +favoured by several recent distributions. 256 SCSI CD-ROM devices are +allowed: + +[b,11,0] /dev/scd0 [or /dev/sr0] +[b,11,255] /dev/scd255 [or /dev/sr255] + + + +SCSI tape devices are allocated the char major number of 9. Up to 32 tapes +devices are supported each of which can be accessed in one of four modes +(0, 1, 2 and 3), with or without rewind. The devices are allocated as +follows: + +[c,9,0] /dev/st0 [tape 0, mode 0, rewind] +[c,9,1] /dev/st1 [tape 1, mode 0, rewind] +.... +[c,9,31] /dev/st31 [tape 31, mode 0, rewind] +[c,9,32] /dev/st0l [tape 0, mode 1, rewind] +.... +[c,9,63] /dev/st31l [tape 31, mode 1, rewind] +[c,9,64] /dev/st0m [tape 0, mode 2, rewind] +.... +[c,9,96] /dev/st0a [tape 0, mode 3, rewind] +.... +[c,9,127] /dev/st31a [tape 31, mode 3, rewind] +[c,9,128] /dev/nst0 [tape 0, mode 0, no rewind] +.... +[c,9,160] /dev/nst0l [tape 0, mode 1, no rewind] +.... +[c,9,192] /dev/nst0m [tape 0, mode 2, no rewind] +.... +[c,9,224] /dev/nst0a [tape 0, mode 3, no rewind] +.... +[c,9,255] /dev/nst31a [tape 31, mode 3, no rewind] + + + +The SCSI generic (sg) devices are allocated the char major number of 21. +There are 256 possible SCSI generic (sg) devices: + +[c,21,0] /dev/sg0 +[c,21,1] /dev/sg1 +.... +[c,21,255] /dev/sg255 + + + +Note that the SCSI generic device name's use of a trailing letter (e.g. +/dev/sgc) is deprecated. + + +Each SCSI disk (but not each partition), each SCSI CD-ROM and each SCSI +tape is mapped to an sg device. SCSI devices that don't fit into these +three categories (e.g. scanners) also appear as sg devices. + + +Pseudo devices [see ] can cause devices +that are usually not considered as SCSI to appear as SCSI device names. +For example an IDE ATAPI CD-ROM may be picked up by the ide-scsi pseudo +driver and mapped to /dev/scd0 . + + +The linux/Documentation/devices.txt file supplied +within the kernel source is the definitive reference for Linux device +names and their corresponding major and minor number allocations. + + + + + Device Names in devfs + +The device pseudo file system can be mounted as /dev in +which case it replaces the traditional Linux device subdirectory. +Alternatively it can be mounted elsewhere (e.g. /devfs) +and supplement the existing device structure. + + +Without devfs, devices names are typically maintained in the +dev directory +of the root partition. Hence the device names (and their associated +permissions) have file system persistence. The existence of a device name +does not necessarily imply such a device (or even its driver) is present. To +save users having to create device name entries (with the mknod + command) most Linux distributions come with thousands of device +names defined in the /dev directory. When applications +try to open() the device name then a errno value of ENODEV indicates there +is no corresponding device (or driver) currently available. + + +Devfs takes a different approach in which the existence of the device name +is directly related to the presence of the corresponding device (and its +driver). + + +Assuming devfs is mounted on /dev then SCSI devices +have primary device names that might look like this: + +/dev/scsi/host0/bus0/target1/lun0/disc [whole disk] +/dev/scsi/host0/bus0/target1/lun0/part6 [partition 6] +/dev/scsi/host0/bus0/target1/lun0/generic [sg device for disk] + +/dev/scsi/host1/bus0/target2/lun0/cd [CD reader or writer] +/dev/scsi/host1/bus0/target2/lun0/generic [sg device for cd] + +/dev/scsi/host2/bus0/target0/lun0/mt [tape mode 0 rewind] +/dev/scsi/host2/bus0/target0/lun0/mtan [tape mode 3 no rewind] +/dev/scsi/host2/bus0/target0/lun0/generic [sg device for tape] + +The sg device on the third line corresponds to the "whole disk" on the +first line since they have the same SCSI address (i.e. +host0/bus0/target1/lun0). If the sg driver is a module +and it has not yet been loaded (or it has been unloaded) then the +"generic" device names in the above list will not be present. + + +[Notice the spelling of "disc" as the devfs author favours English spelling +over the American variant.] It can be seen that devfs's naming scheme +closely matches the SCSI addressing discussed in +. It is worth noting that the IDE subsystem uses +a similar devfs device naming scheme with the word "scsi" replaced with +"ide". Devfs is discussed further in . + + + + + Device Names in scsidev + +A utility program called scsidev adds device names to +the /dev/scsi directory that reflect the SCSI address +of each device. The first 2 letters of the name are the upper level SCSI +driver name (i.e. either sd, sr, st or sg). The number following the "h" +is the host number while the number following the "-" is meant for +host identification purposes. For PCI adapters this seems to be always +0 while for ISA adapters it is their IO address. [Perhaps this field +could be made more informative or dropped.] The numbers following +the "c", "i" and "l" are channel (bus), target id and lun values +respectively. Raw disks are shown without a trailing partition number +while partitions contained within them are shown with the partition +number following a "p". + + +The scsidev would typically be run as part of the +boot up sequence. It may also be useful to run it after the SCSI +configuration has changed (e.g. adding or removing lower level driver +modules, or the use of the add/remove-single-device command). After +scsidev has been run on my system which contains +2 disks, a cd reader and writer plus a scanner, then the following +names were added in the /dev/scsi directory: + +$ ls -l /dev/scsi/ # abridged +total 0 +brw------- 8, 0 Sep 2 11:56 sdh0-0c0i0l0 +brw------- 8, 1 Sep 2 11:56 sdh0-0c0i0l0p1 +... +brw------- 8, 8 Sep 2 11:56 sdh0-0c0i0l0p8 +brw------- 8, 16 Sep 2 11:56 sdh0-0c0i1l0 +brw------- 8, 17 Sep 2 11:56 sdh0-0c0i1l0p1 +... +brw------- 8, 24 Sep 2 11:56 sdh0-0c0i1l0p8 +crw------- 21, 0 Sep 2 11:56 sgh0-0c0i0l0 +crw------- 21, 1 Sep 2 11:56 sgh0-0c0i1l0 +crw------- 21, 2 Sep 2 11:56 sgh1-0c0i2l0 +crw------- 21, 3 Sep 2 11:56 sgh1-0c0i5l0 +crw------- 21, 4 Sep 2 11:56 sgh1-0c0i6l0 +br-------- 11, 0 Sep 2 11:56 srh1-0c0i2l0 +br-------- 11, 1 Sep 2 11:56 srh1-0c0i6l0 + +The mapping between the SCSI generic device names (sg) and their corresponding +names when controlled by other upper level drivers (i.e. sd, sr or st) can +be seen by looking for name matches when the second letter is ignored. +Hence "sdh0-0c0i0l0" and "sgh0-0c0i0l0" refer to the same device. By process +of elimination the "sgh1-0c0i5l0" filename is the scanner since that class +of devices can only be accessed by via the sg interface. + + +The scsidev package also includes the ability to introduce names like +/dev/scsi/scanner by manipulating the +/etc/scsi.alias configuration file. The package also includes +the useful rescan-scsi-bus.sh utility. +For further information about scsidev see +W6. On my system, both devfs and scsidev +co-exist happily. + + + + + + + Kernel Configuration + +The Linux kernel configuration is usually found in the kernel source in +the file: /usr/src/linux/.config . It is not +recommended to edit this file directly but to use one of these configuration +options: + + make config + - starts a character based questions and answer session + make menuconfig + - starts a "cursors" based configuration tool + make xconfig + - starts a X based configuration tool + + + +The descriptions of these selections that is displayed by the associated +help button can be found in the flat ASCII file: +/usr/src/linux/Documentation/Configure.help + + +Ultimately these configuration tools edit the .config +file. An option will either indicate some driver is built into the +kernel ("=y") or will be built as a module ("=m") or is not selected. +The unselected state can either be indicated by a line starting with +"#" (e.g. "# CONFIG_SCSI is not set") or by the absence of the relevant +line from the .config file. + + +The 3 states of the main selection option for the SCSI subsystem (which +actually selects the SCSI mid level driver) follow. Only one of these +should appear in an actual .config file: + +CONFIG_SCSI=y +CONFIG_SCSI=m +# CONFIG_SCSI is not set + + + +Some other common SCSI configuration option follow: + +CONFIG_BLK_DEV_SD [disk (sd) driver] +CONFIG_SD_EXTRA_DEVS [extra slots for disks added later] +CONFIG_CHR_DEV_ST [tape (st) driver] +CONFIG_BLK_DEV_SR [SCSI cdrom (sr) driver] +CONFIG_BLK_DEV_SR_VENDOR [allow vendor specific cdrom commands] +CONFIG_SR_EXTRA_DEVS [extra slots for cdroms added later] +CONFIG_CHR_DEV_SG [SCSI generic (sg) driver] +CONFIG_DEBUG_QUEUES [for debugging multiple queues] +CONFIG_SCSI_MULTI_LUN [allow probes above lun 0] +CONFIG_SCSI_CONSTANTS [symbolic decode of SCSI errors] +CONFIG_SCSI_LOGGING [allow logging to be runtime selected] + +CONFIG_SCSI_<ll_driver> [numerous lower level adapter drivers] +CONFIG_SCSI_DEBUG [lower level driver for debugging] + +CONFIG_SCSI_PPA [older parallel port zip drives] +CONFIG_SCSI_IMM [newer parallel port zip drives] + +CONFIG_BLK_DEV_IDESCSI [ide-scsi pseudo adapter] +CONFIG_I2O_SCSI [scsi command set over i2o bus] +CONFIG_SCSI_PCMCIA [for SCSI HBAs on PCMCIA bus] +CONFIG_USB_STORAGE [usb "mass storage" type] + + + +If the root file system is on a SCSI disk then it makes sense +to build into the kernel the SCSI mid level, the sd driver and +the host adapter driver that the disk is connected to. In most cases +it is usually safe to build the sr, st and sg drivers as modules so +that they are loaded as required. If a device like a scanner is on +a separate adapter then its driver may well be built as a module. In +this case, that adapter driver will need to be loaded before the +scanner will be recognized. + + +Linux distributions have many of the SCSI subsystem drivers built as +modules since building all of them in would lead to a very +large kernel that would exceed the capabilities of the boot loader. +This leads to a "chicken and the egg" problem in which the SCSI +drivers are needed to load the root file system and vice versa. The +2 phase load used by the initrd device addresses this problem +(see man initrd and man mkinitrd). + + + + + Boot Parameters + +On a PC the motherboard's BIOS together with the SCSI BIOS provided +by most SCSI host adapters takes care of the problem of loading the +boot loader's image from a SCSI disk into memory and executing it. This +may require some settings to be changed in the motherboard's BIOS. When +more than one SCSI adapter is involved, the SCSI BIOS settings may need +to change to indicate which one contains the disk with the boot image. +The boot image make also come from an IDE disk, a bootable CD-ROM or +a floppy. + + +While LILO is the most common boot loader in use with Linux today, other +boot loaders such as "grub" [see +www.gnu.org/software/grub] should be considered +if the root partition is a reiserfs or ext3 partition. + + +Some boot parameters related to the SCSI subsystem: + + single [enter single user mode] + <n> [enter run level <n> {0..6}] + root=/dev/sda6 [*] + root=/dev/scsi/host0/bus0/target0/lun0/part6 [*] + root=/dev/sd/c0b0t0u0p6 [*] + devfs=mount [overrides CONFIG_DEVFS_MOUNT=n] + devfs=nomount [overrides CONFIG_DEVFS_MOUNT=y] + init=<command> [executes <command> rather than init] + quiet [reduce output to console during boot] + debug [increase output to console during boot] + max_scsi_luns=1 [limits SCSI bus scans to lun==0] + +* When devfs is in use the initial read-only mount + of the root partition can be done via the old + /dev/sd<a><n> notation or the new devfs + notation (and two of these are shown). + The joint "root=/dev/sda6 single" may be useful + when disk or adapter changes have broken the + kernel boot load. + +The default argument to the "init" parameter is /sbin/init + (see man (8) init). If files such as /etc/fstab + have incorrect entries, it may be useful to drop directly +into a shell with "init=/bin/bash". However if shared libraries files +or their paths are inappropriate this may also fail. That leaves +"init=/sbin/sash" which is a statically linked shell with many useful +commands (for repairing a system) built in (see man (8) sash). + + +When Linux fails to boot after reporting a message like: + + VFS: Cannot open root device 08:02 + +then the kernel expected to find a root partition on device +/dev/sda2 and did not. The numbers in the +error message are major and minor device numbers (in hex) +[see for +the mapping to device names]. In such situations the "root" boot +option can be useful (also the rdev can be used to +modify where the boot image looks for the root partition). + + +Lilo's configuration file /etc/lilo.conf +can take the "root=" option in two ways. The normal way is a line +like: 'root=/dev/sda2'. +In this case /dev/sda2 is converted into major +and minor numbers based on the state of the system when + the lilo command is executed. This can be +a nuisance, especially if hardware is going to be re-arranged. +The other way is a line of the form: 'append="root=/dev/sda2"' +In this case the /dev/sda2 is passed through +to the kernel the next time it is started. This is the same as +giving the "root=/dev/sda2" string at the kernel boot time prompt. +It is interpreted by the kernel at startup (once the HBAs and their +attached devices have been recognized) and thus is more flexible. + + + + + Modules and their Parameters + +There are many SCSI related modules. The mid and upper level modules +are listed below: + + scsi_mod.o + sd_mod.o + sr_mod.o + st.o + sg.o + + + +Notice that the first 3 have "_mod" appended to their normal driver names. +Lower level drivers tend to use the name (or an abbreviation) of the +HBA's manufacturer (e.g. advansys) +plus optionally the chip number of the major controller chip (e.g. +sym53c8xx for symbios controllers based on the NCR 53c8?? family of chips). + + +All SCSI modules depend on the mid level. This means if the SCSI mid +level is not built into the kernel and if scsi_mod.o +has not already been loaded then a command like modprobe st +will cause the scsi_mod.o module to be loaded. There +could well be other dependencies, for example modprobe sr_mod + will also cause the cdrom module to be loaded if it hasn't been +already. Also if the SCSI mid level is a module, then all other SCSI +subsystem drivers must be modules (this is enforced by the kernel build +configuration tools). + + +Modules can be loaded with the modprobe <module_name> + command which will try to load any modules that the +nominated <module_name> depends on. +Also <module_name> does not need the trailing ".o" extension which +is assumed if not given. The 'insmod <module_name>' command will also try +and load <module_name> but without first loading modules it depends on. +Rules for how modules can cause other modules to be loaded (with +appropriate parameters appended) are usually placed in the file +/etc/modules.conf. [Note that in earlier Linux kernels +this file was often called /etc/conf.modules.] +For further information about the format of this file try +man modules.conf. + + +There is a special relationship between the module parameter +"scsi_hostadapter" and the initrd file system. For more information see +man initrd and man mkinitrd. For +example, after the initial configuration of recent RedHat distributions +on my system the /etc/modules.conf file contains +the line: "alias scsi_hostadapter advansys". My system boots from a +SCSI disk connected to an advansys controller (thanks the BIOS) and the +root file system is also on the same SCSI disk. + + + + + Proc pseudo file system + +The proc pseudo file system provides some useful information about +the SCSI subsystem. [The kernel configuration option is CONFIG_PROC_FS and +in almost all cases prof_fs should be built in.] SCSI specific information +is found under the directory /proc/scsi. Probably +the most commonly accessed entry is cat /proc/scsi/scsi +which lists the attached SCSI devices. See + for more details. + + +The lower level drivers are allocated proc_fs entries of the form: + + /proc/scsi/<driver_name>/<scsi_adapter_number> + +where the <driver_name> is something like "aic7xxx" or "BusLogic". The +<scsi_adapter_number> (also known as the host number) is the same number +that was discussed in the SCSI addressing +section. Note that one driver may control one or more hosts. +What is stored in this file is lower level driver dependent (and in the +case of some adapter drivers it +is possible to set parameters via this file). When reporting problems +to newsgroups or maintainers it is useful to include the output of this +file (e.g. cat /proc/scsi/aic7xxx/0 ). + + +The general information on the proc pseudo file system can be found in +the kernel source file: +/usr/src/linux/Documentation/filesystems/proc.txt. + + +The sg driver provides information about hosts and devices in directory +/proc/scsi/sg . See . + + + + + Mid Level, Unifying layer + +The SCSI mid level is common to all usage of the SCSI subsystem. Probably +its most important roll is to define internal interfaces and services that +are used by all other SCSI drivers. These internal mechanisms are not +discussed in this document [see ref: W2]. + + +The primary kernel configuration parameter "CONFIG_SCSI" determines whether +the mid level is built in (when "=y") or a module (when "=m"). If +"CONFIG_SCSI=m" then all other SCSI subsystem drivers must also be modules. + + +When the mid level is built as a module then it probably never needs to be +loaded explicitly because using 'modprobe' to load any other SCSI subsystem +module will cause the mid level to be loaded first (if it is not already). + + + + boot parameters + +SCSI drivers that are built into the kernel are checked in a pre-determined +order to see if HBAs that they can control are present. The user has no +control over this order which in most cases is +arbitrary but in the case of some older ISA adapters is required to stop +misidentification. + + +scsi_logging=<n> + where <n> is 0 to turn logging off + where <n> is non-zero to turn logging on + +max_scsi_luns=<n> + where <n> is a number between 1 and 8 + +scsihosts=host0:hosts1::host3 + + + +The recently introduced devfs defines a "scsihosts" +boot time parameter to give the user some control over this. See the +devfs documentation [ref: W5] for a description. +The host names given in the list to the "scsihosts" boot option are +the names of lower level drivers (e.g. "scsihosts=advansys:imm::ide-scsi"). +Devfs does not need to be present for "scsihosts" to be used. The +"scsihosts" parameter, if given, is echoed during in the boot up messages. +For example: + +scsi: host order: advansys:imm::ide-scsi + +Also if multiple HBA are present in a system then they are scanned in +a fixed order which experience has shown to be safe. The "scsihosts" +parameter only effects how these HBAs are indexed (i.e. which SCSI +adapter numbers are associated with them by the kernel). + + +A full list of kernel parameters with some explanations can be found +in the file /usr/src/linux/Documentation/kernel-parameters.txt +. + + + + + module parameters + +If SCSI disks are present in the system then it usually is better to +build the mid level driver into the kernel. However if the SCSI +subsystem is only being used periodically (e.g. to burn CD-Rs on +an IDE CD writer) then building the mid level as a module is fine. +The module load time options are the same as the driver's built in +options: + +scsi_logging_level=<n> + where <n> is the logging level mask (0 for logging off) +max_scsi_luns=<n> +scsihosts=host0::host2 + + + + + + proc interface + +To display the SCSI devices currently attached (and recognized) by the SCSI +subsystem use cat /proc/scsi/scsi . + + +The output looks like this: + + Attached devices: + Host: scsi0 Channel: 00 Id: 02 Lun: 00 + Vendor: PIONEER Model: DVD-ROM DVD-303 Rev: 1.10 + Type: CD-ROM ANSI SCSI revision: 02 + Host: scsi1 Channel: 00 Id: 00 Lun: 00 + Vendor: IBM Model: DNES-309170W Rev: SA30 + Type: Direct-Access ANSI SCSI revision: 03 + + + +After the "Attached devices:" line there are 3 lines for each recognized +device. The first of these lines is SCSI address information discussed in +. The following 2 lines of data are +obtained from a INQUIRY +command that was performed on the device when it was attached. See + for the relationship between the ordering of these +devices compared with the sg driver's ordering (which most of the time is +the same). + + +Existing devices can be removed using + echo "scsi remove-single-device <h> <b> <t <l>" + > /proc/scsi/scsi +where the variables are host, bus (channel), target (scsi id) and lun. The +success (or otherwise) of this command can be determined by sending a +subsequent cat /proc/scsi/scsi command. The removal +will fail if the +device is busy (e.g. if a file system on the device is mounted). + + +New devices can be added using + echo "scsi add-single-device <h> <b> <t> <l>" + > /proc/scsi/scsi +where the variables are host, bus (channel), target (scsi id) and lun. The +success (or otherwise) of this command can be determined by sending a +subsequent cat /proc/scsi/scsi command. + + +The SCSI subsystem does not support hot-plugging of SCSI devices (there are +also electrical issues on the associated SCSI bus). It is recommended that +those who use add+remove-single-device make sure that other devices on that +SCSI bus are inactive if re-plugging is going to take place. + + +To output a list of internal SCSI command blocks use + echo "scsi dump <n>" > /proc/scsi/scsi +where the numeric value of <n> doesn't matter. This is probably only of +interest to people chasing down bugs within the SCSI subsystem. + + +To start (or stop) logging information being sent to the console/log use + + echo "scsi log <token> <n>" > /proc/scsi/scsi + +where <token> is one of: {all, none, error, timeout, scan, mlqueue, +mlcomplete, llqueue, llcomplete, hlqueue, hlcomplete, ioctl} +and <n> is a number between 0 and 7. The tokens "all" and "none" don't +take an <n> argument. Prefix meanings: + + hl upper level drivers [exception: sg uses "timeout"] + ml mid level + ll lower level drivers + [adapter drivers often have there own flags] + +The value "0" turns off logging while "7" maximizes the volume of output. +Logging information will only be output if CONFIG_SCSI_LOGGING was selected +in the kernel build. + + + +Warning: "scsi log all" (and several other variants) can cause a logging +infinite loop if the log file (typically /var/log/messages +) lies on a SCSI disk. Either turn off the kernel logging +daemon or direct its output to a non SCSI device. + + + + + + + Upper level drivers + +The upper level drivers maintain the kernel side of the OS interface +for the logical class of devices they represent (e.g. disks). They +are also responsible for managing certain kernel and SCSI subsystem +resources such as kernel memory and SCSI command structures. +Applications in the user space access these drivers by opening a special +file (block or char) typically found in the /dev + directory tree. + + + + Disk driver (sd) + +The sd driver is a block device which means that it is closely associated +with the block subsystem. It also supports the concept of partitions. +[man sd dates from 1992.] + + + + sd boot parameters + +None. + + + + + sd module parameters + +The sd driver takes no parameters when loaded as a module. Note that +its module name is sd_mod.o. + + + + + + CDROM driver (sr or scd) + +The SCSI upper level device name is "sr" while "sr_mod" is the module name. +The device file name is either /dev/sr<n> or +/dev/scd<n>. + + +Following is a diagram illustrating the CDROM subsystem of which sr is a +part: + + + + + + + + + + + The architecture of the CD-ROM subsystem. + + + + +Many modern IDE CDROM players and all DVD players use the ATAPI standard +which then allows them to be controlled by the SCSI subsystem with the +ide-scsi lower level pseudo driver. The default action is for the IDE +subsystem to take ownership of all IDE devices and in this case the default +driver would be ide-cd.o . Once the IDE subsystem +"owns" an ATAPI CDROM player then this excludes the ide-scsi driver from +attaching itself to the same device. In order to change this default +action see the following sections on boot and module parameters. + + + + sr boot parameters + +None but the following is related: +During the boot sequence of the Linux kernel, the IDE devices are scanned +before SCSI devices. This means that if both the ide-cd and ide-scsi drivers +are built in, then the ide-cd driver will claim all CDROM devices on the IDE +bus(-es). To override this action use the boot parameter "hd<x>=scsi" +where <x> is the appropriate drive letter. In this case when the ide-scsi +driver is initialized it will find the unclaimed IDE device and "claim" it +for the SCSI subsystem. + + + + + sr module parameters + +Doing a test to find out if a cdrom drive supports XA mode (mode 2) triggers +firmware bugs on some drives. Consequently the check for XA mode support is +turned off by default. The following module parameter is provided: + + xa_test=<0|1> + +to override the default. [Currently there seems to be no way to turn on +XA mode testing when the sr driver is built into the kernel.] + + +Continuing on with the ATAPI CDROM driver override discussion: for modules +this can also be done with insmod ide-cd ignore=hdb to +exclude that device. Typically the ide-cd module is loaded automatically +so a line in the /etc/modules.conf file like: + + options ide-cd ignore=hdb + +should work. If the ide-scsi module is loaded after that, it will claim hdb. +To check if this has happened examine cat /proc/scsi/scsi. +Note that any other IDE CDROM player apart from the one +connected to /dev/hdb (i.e. first IDE controller, slave +device) will still be controlled by the ide-cd module (and hence the IDE +subsystem). + + + + sr proc interface + +All the following files are readable by all and produce ASCII output +when read: + + /proc/sys/dev/cdrom/autoclose + /proc/sys/dev/cdrom/autoeject + /proc/sys/dev/cdrom/check_media + /proc/sys/dev/cdrom/debug + /proc/sys/dev/cdrom/info + /proc/sys/dev/cdrom/lock + +They reflect the current state of the CDROM subsystem. This location +is part of the procfs's window through to the sysctl configuration +mechanism (see man sysctl). All but +info are writable by the superuser. There is +a column for each CDROM and DVD player in the system in +info (not just SCSI devices). + + +As an +example, the auto eject feature can be turned on by the superuser with +the command echo "1" > /proc/sys/dev/cdrom/autoeject. +This will cause cdroms to be ejected from the drive when unmounted. + + + + + + Tape driver (st) + +The tape driver interface is documented in the file +/usr/src/linux/drivers/scsi/README.st and on the +st(4) man page (type man st). The file +README.st also documents the different parameters and +options of the driver together with the basic mechanisms used in the driver. + + +The tape driver is usually accessed via the mt command +(see man mt). mtx is an associated +program for controlling tape autoloaders +(see +mtx.sourceforge.net). + + + + st boot parameters + + +st=xxx[,yyy] where xxx is one of the following: +buffer_kbs:<n> +write_threshold_kbs:<n> +max_buffers:<n> +max_sg_segs:<n> + +(The old boot parameters st=aa[,bb[,cc[,dd]]] supported but deprecated) + + + + + + st module parameters + + +buffer_kbs=<n> +write_threshold_kbs=<n> +max_buffers=<n> +max_sg_segs=<n> + + + + + + st proc interface + +None. + + + + + + Generic driver (sg) + +See reference W4 for the SCSI Generic (sg) driver +documentation. For SCSI standards see reference +W1 and for a book on the subject of SCSI +programming and pass through mechanisms see reference +B3. + + +Currently the sg documentation focuses on the production version of sg found +in the lk 2.2 series. The abridged form is in the file +scsi-generic.txt which can also be found in the kernel source at +/usr/src/linux/Documentation/scsi-generic.txt. +The web site also contains a longer form called +scsi-generic_long.txt. This documentation describes +what is termed as "version 2" sg. + + +The sg driver in lk 2.4 has the "version 3" sg driver which adds an +additional interface and some new ioctl()s. The most interesting new ioctl() +is SG_IO which sends a SCSI command and waits for its response. The +additions and differences in the version 3 sg driver are documented on +the web site in the file scsi-generic_v3.txt. + + +The abbreviation "sg" is used within the kernel to refer both to the +SCSI generic driver and the scatter-gather capability offered by many +modern IO devices (usually associated with DMA). The context usually +makes it clear which one is being referred to. As an example, note the +contorted sg ioctl() named SG_GET_SG_TABLESIZE where the second "SG" +refers to scatter gather. + + +The public interface for sg is found in the file: +/usr/src/linux/include/scsi/sg.h. Depending on the distribution +this may or may not contain the same information as +/usr/include/scsi/sg.h which is controlled by the GNU library +maintainers. If these 2 files are not the same use the former header +file. Those writing applications based on sg should see its documentation +for more on this matter. + + +The sg driver registers all SCSI devices (with a current maximum of 256) +as they are seen. Each newly registered SCSI device gets allocated the +next available minor device number. At least initially this will be the +same sequence that devices are displayed in mid level's +cat /proc/scsi/scsi. The sg devices device mapping can been +seen with cat /proc/scsi/sg/devices or +cat /proc/scsi/sg/device_strs. Differences between +cat /proc/scsi/scsi and sg orderings will appear when +a low level driver is removed (e.g. rmmod aha1542) or +when a device is removed with remove-single-device. +The sg driver will leave remaining SCSI device mapping to minor device +numbers unchanged. This potentially leaves a "hole" in the sg mapping. +An example follows: + +$ cat /proc/scsi/scsi +Attached devices: +Host: scsi0 Channel: 00 Id: 00 Lun: 00 + Vendor: IBM Model: DNES-309170W Rev: SA30 + Type: Direct-Access ANSI SCSI revision: 03 +Host: scsi1 Channel: 00 Id: 02 Lun: 00 + Vendor: PIONEER Model: DVD-ROM DVD-303 Rev: 1.10 + Type: CD-ROM ANSI SCSI revision: 02 +Host: scsi1 Channel: 00 Id: 06 Lun: 00 + Vendor: YAMAHA Model: CRW4416S Rev: 1.0g + Type: CD-ROM ANSI SCSI revision: 02 + +$ cat /proc/scsi/sg/device_strs +IBM DNES-309170W SA30 +PIONEER DVD-ROM DVD-303 1.10 +YAMAHA CRW4416S 1.0g + +$ echo "scsi remove-single-device 1 0 2 0" > /proc/scsi/scsi + +$ cat /proc/scsi/scsi +Attached devices: +Host: scsi0 Channel: 00 Id: 00 Lun: 00 + Vendor: IBM Model: DNES-309170W Rev: SA30 + Type: Direct-Access ANSI SCSI revision: 03 +Host: scsi1 Channel: 00 Id: 06 Lun: 00 + Vendor: YAMAHA Model: CRW4416S Rev: 1.0g + Type: CD-ROM ANSI SCSI revision: 02 + +$ cat /proc/scsi/sg/device_strs +IBM DNES-309170W SA30 +<no active device> +YAMAHA CRW4416S 1.0g + +Notice how the sg driver maintains the row positions of the remaining +devices in the "device_strs" output. So when the Pioneer +dvd player is removed, a hole opens up in the sg device mapping +which is not reflected in the cat /proc/scsi/scsi +output. That "hole" corresponds to the device name +/dev/sg1. + + +The new sg_io_hdr interface includes a data transfer residual count +field called "resid". Only some lower level adapters support this +feature and those that don't always yield zero in this field. At +the time of writing the advansys, aha152x and the sym53c8xx +drivers support this feature. + + + + sg boot parameters + +The sg driver maintains a reserved buffer for each open file descriptor. +The purpose is to guarantee applications that data transfers up to the +size of the reserved buffer will not fail for lack of kernel memory. This +is important for applications like cdrecord that cannot easily recover +(the CDR) from a ENOMEM error. + + +In the absence of the boot parameter 'sg_def_reserved_size' or the sg module +parameter 'def_reserved_size', then each time a sg file descriptor is opened +the reserved buffer size is inherited from SG_DEF_RESERVED_SIZE which is +defined in include/linux/sg.h. + + +The SG_DEF_RESERVED_SIZE define value can be overridden by this kernel boot +option: + + sg_def_reserved_size=<n> + + + + + + sg module parameters + +When the sg module is loaded the SG_DEF_RESERVED_SIZE define value can be +overridden by supplying this option: + + def_reserved_size=<n> + + + + + + sg proc interface + +All the following files are readable by all and produce ASCII output +when read. The file +'def_reserved_size' is also writable by root. The ASCII output has been +formatted in such a way as to be human and machine readable (and hence +a compromise). Use Unix commands of the form cat device_hdrs devices + to see the output of tables. + + +/proc/scsi/sg/debug [internal state of sg driver] +/proc/scsi/sg/def_reserved_size + [like boot/module load parameter] +/proc/scsi/sg/devices [table of numeric device data] +/proc/scsi/sg/device_hdr [column headers for sg/devices] +/proc/scsi/sg/device_strs [table of strings from INQUIRY] +/proc/scsi/sg/hosts [table of numeric host data] +/proc/scsi/sg/host_hdr [column headers for sg/hosts] +/proc/scsi/sg/host_strs [table of string ids for hosts] +/proc/scsi/sg/version [sg version number and date] + +All the above files are owned by root and readable by all while +def_reserved_size is writable by root. For the +devices and device_strs files +the first row output corresponds to /dev/sg0 +(sg minor device number 0). The second row output corresponds to +/dev/sg1, etc. +For the hosts and host_strs +files the first row output corresponds to host (adapter number) 0, etc. +For numeric tables a missing device or host is indicated by a row +of "-1" values. For string tables a missing device or host is indicated +by a row containing "<no active device/host>". + + + + + + + Lower Level drivers + +There are too many SCSI low level drivers to detail in this document. +Alternatively the reader is given suggestions of places to look for +further information. + + +The source directory for the SCSI subsystem in the Linux kernel is a good place +to start: /usr/src/linux/drivers/scsi. Several drivers +have information in a "readme" file: README.<driver_name> +. Others have extensive information at the top of their ".c" file +This information often includes a version number, change logs and kernel +boot time and module load +time options. Often the latter information can be found in the installation +guides of the various Linux distributions. Sometimes the driver maintainer will +have a web site containing the most recent bug fix information. Official +maintainers are listed in the /usr/src/linux/MAINTAINERS +file. If there is nothing there, look in the relevant ".c" file in the SCSI +subsystem directory. Some old drivers have no active maintainers. In such cases +posting to the linux-scsi newsgroup may help [see N1]. + + +Drew Eckhardt's SCSI-HOWTO document [see reference W7] +goes into much more detail about lower level (adapter) drivers than this +document. Since that SCSI-HOWTO is 4 years old, some things may have changed +and more drivers have been added. + + + + Pseudo drivers + +SCSI can be viewed as a command set and a set of hardware buses that convey +that command set. Those hardware buses can be further divided into those +used exclusively for SCSI (e.g. ultra wide), those shared with other +protocols (e.g. USB, IEEE 1394) and those buses not defined by the various +SCSI standards. In the final category there are several interesting examples +including IDE ATAPI CD writers and PC parallel bus ZIP drives. Such devices +use the SCSI command set (or something very close to it) over a foreign bus. + + +This section briefly outlines various pseudo lower level drivers which essentially +communicate with other Linux subsystems in order to send the SCSI command set +to devices controlled by those other subsystems. This raises some ownership +issues that often confuse users and result in many questions to the +maintainers. + +IDE-SCSI + +From configuration point of view, ide-scsi will grab +and try to control every IDE device which doesn't have a "native" +driver attached (such as ide-cd, ide-tape, etc). So for example, if +both ide-cd and ide-scsi are compiled into the kernel in a system +which has an ATAPI cdrom, ide-cd will get to control it. If only +ide-scsi is compiled in, it will get the device. There are also some +command line parameters to control which driver gets which device. + + + +It was "hdx=ide-scsi / hdx=ide-cdrom / hdx=ide-floppy" in 2.2.x +kernels. In the 2.4 series this has been changed to "hdx=scsi". +Also see this section on cdroms. +[The term "hdx" is used +to refer to one of the IDE devices in {hda, hdb, hdc ...}.] + + +When the driver is running, the device will be accessible using +the SCSI device (/dev/sda, /dev/sr0 +, etc), and not through the corresponding +/dev/hdx device. Still, the /dev/hdx + device will be available, but only for configuration. + + +All the generic IDE configuration parameters (DMA on/off, 32-bit +I/O, unmasking irq's, etc) are available by using the +/dev/hdx device, for example to enable DMA: + + hdparm -d1 /dev/hdx + +Using cat /proc/ide/hdx/settings will show the +available settings. +All the generic IDE driver settings will be available there, as well +as the following "ide-scsi specific" settings: + +bios_cyl +bios_head +bios_sect +transform +log + +The first three choose the virtual geometry that the drive will +return to the sd driver, in case it's a disk drive (ZIP, etc). +"transform" will configure/enable/disable the SCSI to ATAPI CDB +transformation layer: + +bit 0: Enable(1)/Disable(0) transformation for + commands not originated from the sg driver. +bit 1: Enable/Disable transformation for commands + issued using the sg driver. + +"log" will log debugging information. This is useful also to debug +user-space programs using the sg driver, as it will list the CDB +traffic on the bus -- each issued command, along with its completion +status. +To enable/disable a specific settings, use something like: + + echo "log:1" > /proc/ide/hdx/settings + + + +PPA + IMM + +Iomega ZIP drives come in a variety of flavours including parallel +port, SCSI, and ATAPI. The parallel port versions (both old and new) +are driven by ppa and imm respectively. + + + +The parallel port ZIP drives are actually SCSI devices which tunnel +SCSI commands over the parallel port using interfaces called VPI0 +(older-style) and VPI2 (newer-style). The ppa driver is the VPI0 host +implementation and the imm driver is the VPI2 host implementation. + + +The way it works is that the HBA is a chip inside the ZIP drive, so +that the host adapter and the peripheral are in the same actual case. + + +PPSCSI + +The new, not-yet-integrated, architecture for devices that uses SCSI +over a parallel port cable is ppscsi. The ppscsi module provides the +boiler plate code and makes it easy to write implementations for +different interfaces. + + + +Each ppscsi protocol module registers itself with the ppscsi module, +passing in a list of entry points for the various things that are +common to all protocol drivers. + + + + + + + + + + + The structure of the PPSCSI drivers. + + + + +The plan is that the ppscsi architecture will absorb both the ppa and +imm drivers and protocol modules; only vpi0 has been written so far. +See +www.torque.net/parport/ppscsi.html. + + +USB + +USB classifies a group of devices as "mass storage" (e.g. disks) and +interacts with these using the SCSI command set. The module name is +"usb-storage". +See +www.one-eyed-alien.net/~mdharm/linux-usb. + + + +There is also the usb/microtek driver for controlling X6 USB scanners +from Microtek. When configured, the SANE application uses the sg +driver to send SCSI commands over USB to control this scanner. + + +I2O + +See kernel source file /usr/src/linux/drivers/i2o/io2_scsi.c +. + + + +IEEE 1394 + +Support for IEEE 1394 devices that use the SBP-2 protocol is now +becoming available. See the IEEE 1394 paragraph in this +section for some urls. + + + + + + + + Raw devices + +A raw device can be bound to an existing block device (e.g. a disk) and be +used to perform "raw" IO with that existing block device. Such "raw" IO +bypasses the caching that is normally associated with block devices. +Hence a raw device offers a more "direct" route to the physical device +and allows an application more control over the timing of IO to that +physical device. This makes raw devices suitable for complex applications +like Database Management Systems that typically do their own caching. + + +Raw devices are character devices (major number 162). The first +minor number (i.e. 0) is reserved as a control interface and is usually +found at /dev/rawctl. A utility called raw + (see man raw) can be used to bind a raw +device to an existing block device. These "existing block devices" may be +disks or cdroms/dvds whose underlying interface can be anything supported +by Linux (e.g. IDE or SCSI). + + +A sequence of commands listing the raw devices and then binding +a SCSI disk partition followed by binding the whole disk looks +like this on my system: + +$ ls -lR /dev/raw* +crw-r--r-- 1 root root 162, 0 Dec 6 06:54 /dev/rawctl + +/dev/raw: +total 0 +crw-r--r-- 1 root root 162, 1 Dec 6 06:54 raw1 +crw-r--r-- 1 root root 162, 2 Dec 6 06:54 raw2 +crw-r--r-- 1 root root 162, 3 Dec 6 06:54 raw3 +crw-r--r-- 1 root root 162, 4 Dec 6 06:54 raw4 +$ +$ raw -qa +$ +$ raw /dev/raw/raw1 /dev/sda3 +/dev/raw/raw1: bound to major 8, minor 3 +$ raw /dev/raw/raw2 /dev/sda +/dev/raw/raw2: bound to major 8, minor 0 +$ raw -qa +/dev/raw/raw1: bound to major 8, minor 3 +/dev/raw/raw2: bound to major 8, minor 0 + + + +The normal array of system calls for character devices are available on +raw devices. The size of the transfer for read(2) and write(2) must be +an integral multiple of the physical device's block size. For a disk +this will be its sector size which is normally 512 bytes. The data buffer +given to read() and write() system calls must be aligned to the block +size.The lseek(2) call needs to align its file read/write offset to a block +boundary as well. The pread(3) call (see man pread) +combines a read() and a lseek() and can be useful with raw devices (dito with +pwrite() ). Care should be taken with offsets greater than 2 GB (or perhaps +4 GB) on 32 bit architectures where the "off_t" type is 32 bits long. +One solution is to use the _llseek() call (see man llseek). + + +Unix utilities such as recent versions of dd and +lmdd (from the lmbench suite of programs) can be used +to move data to and from "raw" devices as they meet the above-mentioned +block alignment requirements. Recent versions of the sg_dd +command in the sg_utils package can use raw and sg devices. + + + +If a block device is being accessed via a bound raw device and also via +its normal block interface then there is no cache coherency between the +two access mechanisms. For example if /dev/sda1 was +both mounted and being accessed via a bound raw device then there could be +data inconsistencies. + + + + + + Devfs pseudo file system + +The main documentation for devfs can be found at: reference +W5. The devfs name conventions for the +SCSI subsystem are outlined in . +Devfs is selected by the kernel build option CONFIG_DEVFS_FS and whether +it is mounted at boot time (as /dev) or not is +controlled by the kernel build option CONFIG_DEVFS_MOUNT. The latter option +can be overridden by the kernel boot time options "devfs=mount" or +"devfs=nomount", whichever is appropriate. + + +The devfs SCSI node names with their default permissions are: + +disc rw------- whole disk including mbr +part1 rw------- first partition {...p1} +... +part15 rw------- 15th partition {...p15} +cd rw-rw-rw- cd or dvd devices +mt rw-rw-rw- tape mode 0 with rewind {...m0} +mtl rw-rw-rw- tape mode 1 with rewind {...m1} +mtm rw-rw-rw- tape mode 2 with rewind {...m2} +mta rw-rw-rw- tape mode 3 with rewind {...m3} +mtn rw-rw-rw- tape mode 0 with no rewind {...m0n} +mtln rw-rw-rw- tape mode 1 with no rewind {...m1n} +mtmn rw-rw-rw- tape mode 2 with no rewind {...m2n} +mtan rw-rw-rw- tape mode 3 with no rewind {...m3n} +generic rw-r----- + + + +These node names are only present if the corresponding device (or sub-entities +of the device (e.g. partitions)) and driver are present. For example if +there is no sg driver present then there is no "generic" device name. The +strings that appear above in braces are appended to the abridged "c0b0t0u0" +notations outlined below as appropriate. + + +The devfs file names that are block or character special files will be +called the primary device names in this description. The devfs daemon, called +devfsd, introduces many symbolic links to those primary device names. This is +done both for backward compatibility and convenience. These symbolic links +will be called secondary device names. + + +The secondary device names are controlled by the devfsd configuration file +usually found in /etc/devfsd.conf . Following is a +list of secondary device names when the default devfsd.conf file is used: + + +Secondary name slink to this primary device name +-------------------------------------------------------------- +/dev/sda /dev/scsi/host0/bus0/target2/lun0/disc +/dev/sda1 /dev/scsi/host0/bus0/target2/lun0/part1 +/dev/sd/c0b0t2u0 /dev/scsi/host0/bus0/target2/lun0/disc +/dev/sd/c0b0t2u0p1 /dev/scsi/host0/bus0/target2/lun0/part1 +/dev/sr0 /dev/scsi/host0/bus0/target4/lun0/cd +/dev/sr/c0b0t4u0 /dev/scsi/host0/bus0/target4/lun0/cd +/dev/st0 /dev/scsi/host1/bus0/target0/lun0/mt +/dev/nst0a /dev/scsi/host1/bus0/target0/lun0/mtan +/dev/st/c1b0t0u0m0 /dev/scsi/host1/bus0/target0/lun0/mt +/dev/st/c1b0t0u0m3n /dev/scsi/host1/bus0/target0/lun0/mtan +/dev/sg0 /dev/scsi/host0/bus0/target2/lun0/generic +/dev/sg1 /dev/scsi/host0/bus0/target4/lun0/generic +/dev/sg2 /dev/scsi/host1/bus0/target0/lun0/generic +/dev/sg/c0b0t2u0 /dev/scsi/host0/bus0/target2/lun0/generic +/dev/sg/c0b0t4u0 /dev/scsi/host0/bus0/target4/lun0/generic +/dev/sg/c1b0t0u0 /dev/scsi/host1/bus0/target0/lun0/generic + + + +Note that the more common /dev/scd0 variant for SCSI +cdroms is not supported. There are also /dev/discs, +/dev/cdroms and /dev/tapes +directories that contain symbolic links to all devices (i.e. not just +SCSI devices) that fall into that categorization: + + +Secondary name slink to this primary device +------------------------------------------------------------ +/dev/discs/disc0 /dev/ide/host0/bus0/target0/lun0 * +/dev/discs/disc1 /dev/scsi/host0/bus0/target2/lun0 * +/dev/cdroms/cdrom0 /dev/ide/host0/bus1/target1/lun0/cd +/dev/cdroms/cdrom1 /dev/scsi/host0/bus0/target4/lun0/cd +/dev/tapes/tape0 /dev/scsi/host1/bus0/target0/lun0 * + + + +Those entries marked with "*" are directories containing the primary devices. +Note that IDE devices are listed before SCSI devices. These secondary device +names mimic the same persistence rules as the primary device names. So when +a SCSI device (?), or its lower level driver or its upper level driver are +removed then so are the primary and secondary device names associated with it. + + +When devfs is mounted as /dev, the old +"/dev/sda6" type can still be used +in some contexts. This may be convenient if typing is required at the +kernel boot time prompt. For example if a user wants to change the root +partition on a "devfs" machine then any of the following examples +may be used as a kernel boot time option: + + root=/dev/sda6 + root=/dev/scsi/host0/bus0/target0/lun0/part6 + root=/dev/sd/c0b0t0u0p6 + + + +There are many device scanning programs that expect to see the pre-devfs +device names present and it will some time before they become devfs aware. +Also some programs rely on a open of /dev/sg0 +(for example) to load the +sg driver (assuming it is a module and not already loaded). This can +be arranged by an entry in /etc/devfsd.conf file of: + + LOOKUP sg.* MODLOAD + +and the following in /etc/modules.devfs : + + probeall /dev/sg scsi-hosts sg + alias /dev/sg* /dev/sg + + + +The sg device permissions can be changed with this entry in the +/etc/devfsd.conf file: + + REGISTER scsi/host.*/bus.*/target.*/lun.*/generic + PERMISSIONS 0.0 rw-rw-rw- + +See "man devfsd" for more information. + + +An application can determine whether devfs is active by the presence or +otherwise of the file /dev/.devfsd. + + +A feature of a /dev directory based on a persistent file system (e.g. +ext2) is the ability to associate permissions with a device file name +and keep them from one boot to the next. As noted above the default +action of devfs is to assign device file name permissions anew each time +a machine is booted. The PERMISSIONS action in the +/etc/devfsd.conf can be used to assert permissions but +this may be considered a little awkward. The devfs document +(W5) describes a method for getting the best +of both worlds. This technique relies on the recently added feature +in lk 2.4 to mount the same file system at multiple points. + + + + + + Common bus types (SCSI and other) + +A very good overview of the various bus types touched on in this +appendix (both SCSI and others) can be found at + +www.pctechguide.com/04disk2.htm. + +SCSI + +The original SCSI 1 standard (ANSI specification X3.131-1986) introduced +an 8 bit parallel bus that was able to do asynchronous transfers at 1.5 +MegaBytes/sec and synchronous transfers up to 5 MB/sec. SCSI commands are +sent at the asynchronous rate. SCSI data is transferred either at the +asynchronous rate (worst case) or a negotiated synchronous rate (with +5 MB/sec being the best case). + + +FAST SCSI + +The SCSI 2 standard raised the maximum synchronous speed to 10 MB/sec. SCSI 2 +defined several parallel buses: single ended (as used by SCSI 1) and a new +differential bus. The differential bus has better noise immunity and its +maximum bus length is 25 metres (compared with single ended's 6 metres). +Tagged queuing of commands was also added by SCSI 2. + + +WIDE SCSI + +The SCSI 2 standard also increased the width of the bus allowing 16 and 32 bit +"wide" variants. Very little use has been made of the 32 bit width so "wide" +usually refers to a 16 bit wide data path. The maximum number of SCSI devices +that can connect to a parallel SCSI bus is directly related to the bus width +hence "wide" buses allow a maximum of 16 SCSI devices to be connected. +[At least one of those devices must be the SCSI "initiator" which is +usually a host adapter.] + + +ULTRA SCSI + +Traditionally synchronous buses are clocked either on the rising or falling +edge of the clock (which is normally a square wave). A recent trend has been +to clock on both edges and thus double the available bandwidth. This is +how ULTRA SCSI doubles the SCSI 2 "fast" speed to 20 MB/sec. + + +ULTRA WIDE SCSI + +The same "ultra" technique applied to a (16 bit) wide SCSI parallel bus yields +a bandwidth of 40 MB/sec. + + +ULTRA 2 WIDE SCSI + +This variant introduces a new "low voltage" differential signalling (LVD) that +allows the synchronous clock speed to be doubled yielding 80 MB/sec when using +a (16 bit) wide bus. In this case the maximum SCSI bus length is 12 metres. To +be backward compatible with ULTRA WIDE this variant can fall back to "single +ended" operation. This leads to the abbreviation LVD/SE being used by adapter +manufacturers. One shortcoming of this approach is that the presence of one +UW device on a U2W bus will cause all other U2W devices to communicate at +the slower (i.e. UW) rate. Some adapters overcome this by having separate +LVD and SE physical buses on the same logical SCSI bus. + + +ULTRA 160 SCSI + +The fastest parallel SCSI bus currently available is ULTRA 160 which is +also known as ULTRA 3. It uses a 16 bit wide data path, LVD signalling +(see previous entry) and double transition clocking that increases the +maximum synchronous bandwidth to 160 MB/sec. Additional features +include cyclic redundany codes (CRC) to improve data integrity (compared +with a parity bit) and domain validation which lowers transfer rates +if the error rate is too high. Various +manufacturers have got together and maintain a common web site promoting it: + +www.ultra160-scsi.com. Speeds of 320 MB/sec +and 640 MB/sec using the same or similar LVD signalling over a 16 bit +wide data path may soon be standardized. + + +FC-AL + +This stands for Fibre Channel - Arbitrated Loop and may involve dual +2 Gigabit per second single mode fibre optic links spanning 10 +kilometres with throughputs of up to 400 MegaBytes per second. +Often associated with storage area networks (SANs). Up to 126 +devices can be attached to a loop which in turn can be extended +to 16 million devices in public loop mode. The transmission medium +isn't necessarily fibre optic cable: copper (in the form of co-axial +cable) can also be used at lower speeds and for shorter distances. + + +IEEE 1394 + +This standard also goes by the name of "Fire Wire" [trademarked +by Apple] and "iLink" [trademarked by Sony]. It is a serial bus that can run +at up to 400 Megabits/sec. It has a similar but more general architecture than +USB. The IEEE 1394 standard allows for the SCSI command set to be +carried over a 1394 bus. There is a "sbp2_1394" driver now available for +the Linux IEEE 1392 stack. This sbp2_1394 driver is also a SCSI subsystem +lower level driver (so it is functionally similar to the ide-scsi driver). +So IEEE 1394 devices that use the SBP-2 protocol (e.g. disks, cd-rw/dvd +drives, MO drives and scanners) can be accessed via the SCSI subsystem. +See +Linux1394.sourceforge.net +and +firewire.zawa.com/sbp2/ for more information. + + + +NON SCSI buses + +The following buses are not defined by the SCSI standards but are of interest +because they either can carry the SCSI command set, are in some way +related to the Linux SCSI subsystem or supply a similar functionality to +SCSI products. + + + +IDE (ATAPI) + +IDE is the most used disk type on PC systems today. The acronym stands for +Integrated Drive Electronics and as the name suggests it places the bulk +of the IO "intelligence" on the disk controller card rather than spreading +it between the device (most often a disk) and a controller (HBA) as SCSI +does. IDE grew out of the ST506 and ESDI standards in the 1980s. EIDE +(extended IDE) is a related acronym. The standards that cover IDE are +called ATA and can be found at +www.t13.org. The ATA Packet Interface (ATAPI) +extends the disk oriented command set to support CDROM and tape drives. +The ATAPI command set closely resembles the SCSI command set. The +most recent ATA technology is outlined in the next paragraph. + + + +ATA 100 + +The ATA standards used by IDE devices have also been marching through +the adjectives (e.g. fast and ultra) and the numbers (e.g. 2, 33, +66 and 100). The most recent addition is ATA 100 which supports +burst rates of 100 MB/sec and up to 4 (was 2) devices per bus. [PCs often +have 2 ATA buses.] Both ATA 66 and 100 need a special cable. ATA +cables are relatively short precluding IDE devices being external to +the computer. Cable lengths have previously been limited to 18 inches +although 1 metre long cables have now appeared. + + + +USB + +Universal Serial Bus (USB) has a bandwidth of between 1.5 and 12 +Megabits/sec (the latter speed with USB 1.1). Up to 127 devices can +be connected using a series of hubs each of which connects up to 7 +devices (with a 5 metre limit). USB supplies 5 volts at 0.5 amps to +power small devices. USB is "plug and play", hot pluggable and supports +isochronous data transfers (required for audio and video devices that +need guaranteed minimum bandwidth). + + + +PC Parallel port + +The original PC parallel port was uni-directional (towards the printer) +and was capable of about 10 KB/sec. The IEEE 1284 standard in 1994 +introduced 5 modes of data transfer: + +Compatibility mode (forward direction) +Nibble mode (reverse direction) +Byte mode (reverse direction) +EPP mode (bi-directional) +ECP mode (bi-directional) + +Enhanced Parallel Port (EPP) achieves transfer speeds of between 500 KB/sec +and 2 MB/sec and is targeted at CD-ROMs, tapes and hard drives. Extended +Capability Port (ECP) includes run length encoding and support for DMA. +ECP is targeted at fast printers and scanners. + + + +I2O + +"The I2O (Intelligent Input/Output) specification defines a standard +architecture for intelligent I/O that is independent of both the specific +device being controlled and the host operating system (OS)" [from www.i2osig.org]. +It defines a "split driver" model in which the OS Services Module (OSM) +sits between the host OS device interface and the I2O communications layer +while the Hardware Device Module (HDM) sits between the I2O +communications layer and the hardware. The HDM may well run on a +dedicated processor (IOP). + + + + + + + Changes between lk 2.2 and 2.4 + +Significant work has been done to change the single SCSI command queue +used in lk 2.2 to one command queue per device. To make the SCSI subsystem +more SMP friendly the granularity of the locks is much finer grained. In +lk 2.2 the whole subsystem essentially used one lock. + + +Even though it is not part of the SCSI subsystem, the inclusion of devfs +solves many SCSI device addressing problems that existed in the past. +Associated with devfs but very useful even in its absence is the +"scsihosts" kernel boot time (and module load time) option. This option +allows users to have some control over the ordering of multiple SCSI hosts. + + + + Mid level changes + + +SCSI_IOCTL_GET_IDLUN {ioctl, changed} + + + + + + sd changes + + +HDIO_GETGEO_BIG {ioctl, new} +SCSI_EMULATED_HOST {ioctl, new} + + + + + + sr changes + +No sr changes reported. As a related matter, the way in which the +IDE subsystem is informed that an IDE device (e.g. a cd writer) is +to be ignored has changed. [Instructing an IDE device to be ignored +by the IDE subsystem makes it a candidate to be recognized by the +ide-scsi pseudo driver.] Previously a kernel boot time option such as +"hdb=ide-scsi" would instruct the IDE subsystem to ignore the +device at /dev/hdb. In lk 2.4 this has become +"hdb=scsi". + + + + + st changes + +No interface changes. In lk 2.2 the maximum number of extra tape devices +that could be added after boot time was limited to 3. This limitation +has been removed (leaving a maximum of 32 tape devices as noted earlier). + + + + + sg changes + +The main change is the addition of a new interface structure called +"sg_io_hdr". The existing interface structure (called "sg_header") was found +to be inflexible requiring the concaternation of raw data together with +metadata in the read() and write() commands. + +sg_io_hdr {new interface structure} +SG_IO {new ioctl} +direct IO {present but commented out, see ALLOW_DIO} +procfs output {new information in /proc/scsi/sg directory} +boot/module parameters {new} + + + +Up to 64 bytes of sense data can be obtained from the sg_io_hdr interface +structure. Also a residual count associated with the data transfer is +available (if the lower level driver supports it, if not the residual count +will be 0). + + + + + + Performance and Debugging tools +dd + +Very useful for testing the streaming performance of disks and cdroms/dvds. +See man dd for more details. Here is an example for +timing how long a disk takes to read 1 GB (10**9 bytes) starting from block 0: + +$ time dd if=/dev/sda of=/dev/null bs=512 count=1953126 + +If the raw device /dev/raw/raw1 is bound to +/dev/sda then the above line is equivalent to: + +$ time dd if=/dev/raw/raw1 of=/dev/null bs=512 count=1953126 + +This may be slower than expected since one 512 byte sector is being read +at a time. Changing the last 2 arguments to "bs=8k count=122071" should +give better timings for the "raw" dd. + + +lmdd + +This command is part of the lmbench suite of programs and is a variant of the +dd command. It has been tailored for IO measurements +and outputs timing and throughput numbers on completion. Hence the +time command and a calculator are not needed. + + +sg_dd + +This command is part of the sg_utils package (see below) and is another +variant of the dd command in which either the input and/or +output file is a sg or a raw device. The block size argument ("bs") must +match that of the physical device in question. The "skip" and "seek" arguments +can be up to 2**31 - 1 on a 32 bit architecture allowing 1TB disks to be +accessed (2G * 512). The Linux system command llseek() is used to seek with +a 64 bit file read/write offset. The lmdd does not +handle the > 2GB case and the dd command gets creative +with multiple relative seeks. sg_dd has +a "bpt" (blocks per transfer) argument that controls the number of blocks +read or written in each IO transaction. + + +sard + +This utility is modelled on System V Release 4's sar -d for +producing IO statistics for mounted devices and partitions. It has been +developed by Stephen Tweedie and includes the sard utility and a required +kernel patch which expands the output of /proc/partitions +. It can be found at + +ftp.uk.linux.org/pub/linux/sct/fs/profiling. It collects statistics +at a relatively low level (e.g. SCSI mid level) compared to programs +like vmstat. + + + + +vmstat {in most distributions, try "man vmstat"} +scsi_debug {lower level driver for debugging + (no adapter required)} +sg_utils {utilities package for sg: + www.torque.net/sg} +CONFIG_MAGIC_SYSRQ=y + {see /usr/src/linux/Documentation/sysrq.txt} + + + + +When it looks like something has partially locked up the system, the +ps command can be useful for finding out what may be +causing the problem. The following options may be useful for identifying what +part of the kernel may be causing the problem. This information could be +forwarded to the maintainers. + +ps -eo cmd,wchan +ps -eo fname,tty,pid,stat,pcpu,wchan +ps -eo pid,stat,pcpu,nwchan,wchan=WIDE-WCHAN-COLUMN -o args + +The most interesting option for finding the location of the "hang" is +"wchan". If this is a kernel address then ps will +use /proc/ksyms to find the nearest symbolic +location. The "nwchan" option outputs the numerical address of the "hang". + + + + + Compile options and System calls including ioctls + +The compile options in this appendix are those which a system administrator +might conceivably want to change. Naturally the defaults are chosen so the +vast majority of users will not need to modify anything. In some cases setting +kernel build time options, kernel boot time parameters or module load +parameters has the same effect as changing a driver compile time option. + + +System calls act as the interface between application programs and the +kernel and its drivers. In the case of the layered driver architecture that +the SCSI subsystem uses, the upper layer drivers handle most of the +system calls. + + +The SCSI subsystem has a "bubble down" ioctl structure. First the upper level +driver associated with the open file descriptor attempts to decode the ioctl. +If it doesn't recognize it then the ioctl is passed down to the mid level. If +the mid level doesn't recognize it then the ioctl is passed down to the lower +level driver associated with the file descriptor. If the lower level driver +doesn't recognize it then a EINVAL error is generated. + + +Some ioctls are dispatched to related subsystems. + + + + Mid level + +The following header files in the kernel source are relevant to the mid +level: + + /usr/src/linux/include/scsi/scsi.h + /usr/src/linux/include/scsi/scsi_ioctl.h + + + +These files are meant for applications to use (other than parts in +a __KERNEL__ conditional compilation block). They may also be found in +/usr/include/scsi directory but it is best not to trust these versions as +they are maintained with the glibc library and may lag the kernel version +being used. Usually in Linux systems /usr/include/linux +can be relied upon to be a symbolic link to the kernel source's include +area (typically /usr/src/linux/include/linux). This +symbolic link can be used to include the correct scsi_ioctl.h + using the following trick: +#include <linux/../scsi/scsi_ioctl.h> + + +This include file: /usr/src/linux/drivers/scsi/scsi.h +is the key internal header file for the SCSI subsystem. As such it will not +be discussed here other than to point out it has the same file name (but +it's in a different directory) as the include file mentioned at the beginning +of this section. This sometimes causes confusion. + + +The mid level drivers/scsi/scsi_scan.c file +maintains an array of known SCSI devices with idiosyncracies +. [This was known as the "black list" but that was considered +to judgmental.] The array is called "device_list". The various value are: + +BLIST_NOLUN only probe lun 0 +BLIST_FORCELUN force all 8 luns to be probed + +BLIST_BORKEN passes through broken flag to lower +level driver +BLIST_KEY sends magical MODE SENSE (pc=0x2e) to +unlock device +BLIST_SINGLELUN only allow IO on one lun at a time + +BLIST_NOTQ disable tagged queuing + +BLIST_SPARSELUN keep going after lun not found + +BLIST_MAX5LUN only probe up to lun 5 + +BLIST_ISDISK override INQUIRY's type with disk (direct +access) type +BLIST_ISROM override INQUIRY's type with ROM + + + + + + Mid level compile options + +None. + + + + + Mid level ioctls + +See the following files: + +/usr/src/linux/include/scsi/scsi.h + + + +Note that the SCSI status constants defined in include/scsi/scsi.h are +shifted 1 bit right from the values in the SCSI standards: + + +scsi.h constant value SCSI 2 standard value +---------------------------------------------------- +CHECK_CONDITION 0x1 0x2 +CHECK_GOOD 0x2 0x4 +BUSY 0x4 0x8 +.... + + + +Summary of ioctl()s follow: + +SCSI_IOCTL_SEND_COMMAND + This interface is deprecated - users should use + the scsi generic (sg) interface instead, as this + is a more flexible approach to performing + generic SCSI commands on a device. + + The structure that we are passed should look like: + + struct sdata { + unsigned int inlen; [i] Length of data written to device + unsigned int outlen; [i] Length of data read from device + unsigned char cmd[x]; [i] SCSI command (6 <= x <= 12) + [o] Data read from device starts here + [o] On error, sense buffer starts here + unsigned char wdata[y]; [i] Data written to device starts here + }; + Notes: + - The SCSI command length is determined by examining + the 1st byte of the given command. There is no way + to override this. + - Data transfers are limited to PAGE_SIZE (4K on + i386, 8K on alpha). + - The length (x + y) must be at least OMAX_SB_LEN + bytes long to accommodate the sense buffer when + an error occurs. The sense buffer is truncated to + OMAX_SB_LEN (16) bytes so that old code will not + be surprised. + - If a Unix error occurs (e.g. ENOMEM) then the user + will receive a negative return and the Unix error + code in 'errno'. If the SCSI command succeeds then + 0 is returned. Positive numbers returned are the + compacted SCSI error codes (4 bytes in one int) + where the lowest byte is the SCSI status. See the + drivers/scsi/scsi.h file for more information on this. + +SCSI_IOCTL_GET_IDLUN + This ioctl takes a pointer to a "struct scsi_idlun" object + as its third argument. The "struct scsi_idlun" definition + is found in <scsi/scsi.h>. It gets populated with scsi + host, channel, device id and lun data for the given device. + Unfortunately that header file "hides" that structure + behind a "#ifdef __KERNEL__" block. To use this, that + structure needs to be replicated in the user's program. + Something like: + typedef struct my_scsi_idlun { + int four_in_one; /* 4 separate bytes of info + compacted into 1 int */ + int host_unique_id; /* distinguishes adapter cards from + same supplier */ + } My_scsi_idlun; + "four_in_one" is made up as follows: + (scsi_device_id | (lun << 8) | (channel << 16) | + (host << 24)) + These 4 components are assumed (or masked) to be 1 byte each. + +SCSI_IOCTL_GET_BUS_NUMBER + In lk 2.2 and earlier this ioctl was needed to get the + host number. During lk 2.3 development the + SCSI_IOCTL_GET_IDLUN ioctl was changed to include this + information. Hence this ioctl is only needed for + backward compatibility. +SCSI_IOCTL_TAGGED_ENABLE + Probably a remnant of the past when the mid level + addressed such issues. Now this functionality is + controlled by the lower level drivers. Best ignored. +SCSI_IOCTL_TAGGED_DISABLE + See comment for SCSI_IOCTL_TAGGED_ENABLE. +SCSI_IOCTL_PROBE_HOST + This ioctl expects its 3rd argument to be a pointer to + a union that looks like this: + union probe_host { + unsigned int length; /* [i] max length of + output ASCII string */ + char str[length]; /* [o] N.B. may need '\0' + appended */ + }; + The host associated with the device's fd either has a + host dependent information string or failing that its + name, output into the given structure. Note that the + output starts at the beginning of given structure + (overwriting the input length). N.B. A trailing '\0' + may need to be put on the output string if it has been + truncated by the input length. A return value of 1 + indicates the host is present, 0 indicates that the + host isn't present (how can that happen?) and a + negative value indicates an error. + +SCSI_IOCTL_DOORLOCK +SCSI_IOCTL_DOORUNLOCK +SCSI_IOCTL_TEST_UNIT_READY + Returns 0 if the unit (device) is ready, a positive + number if it is not or a negative number when there + is an OS error. + +SCSI_IOCTL_START_UNIT +SCSI_IOCTL_STOP_UNIT +SCSI_EMULATED_HOST {same as SG_EMULATED_HOST <new>} + + + + + + + sd driver + + + + + sd compile options + + +MAX_RETRIES {5} +SD_TIMEOUT {30 seconds} +SD_MOD_TIMEOUT {75 seconds} + + + + + + sd ioctls and user interface + +The relevant files to see: + +include/linux/hdreg.h +include/linux/genhd.h +include/linux/fs.h + + + +A list of ioctl()s follow: + +HDIO_GETGEO_BIG +HDIO_GETGEO [retrieve disk geometry] +BLKGETSIZE [number of sectors in device] +BLKROSET [set read only flag] +BLKROGET [get read only flag] +BLKRASET [set read ahead value] +BLKRAGET [get read ahead value] +BLKFLSBUF [instructs SCSI subsystem to flush buffers] +BLKSSZGET [get device block size] +BLKPG [partition table manipulation] +BLKELVGET [get elevator parameters] +BLKELVSET [set elevator parameters] +BLKRRPART [reread the partition table] + +open() (all flags ignored) +close() +ioctl() (see list above) + + + + + + + sr driver + + + + + sr compile options + +None. + + + + + sr ioctls and user interface + +See the following files: + +/usr/src/linux/include/linux/cdrom.h +/usr/src/linux/drivers/cdrom/cdrom.c [revision history section] +/usr/src/linux/Documentation/cdrom/cdrom-standard.tex + + + +Some of the following ioctls are described in cdrom-standard.tex : + +CDROMCLOSETRAY +CDROM_SET_OPTIONS +CDROM_CLEAR_OPTIONS +CDROM_SELECT_SPEED +CDROM_SELECT_DISC +CDROM_MEDIA_CHANGED +CDROM_DRIVE_STATUS +CDROM_CHANGER_NSLOTS +CDROM_LOCKDOOR +CDROM_DEBUG +CDROM_GET_CAPABILITY +DVD_READ_STRUCT +DVD_WRITE_STRUCT +DVD_AUTH +CDROM_SEND_PACKET +CDROM_NEXT_WRITABLE +CDROM_LAST_WRITTEN + + + +The O_NONBLOCK flag on the open() of scd devices is important. Without it the +open() will wait until there is media in the device before returning. + + +open() O_NONBLOCK +close() +read() +write() +ioctl() + + + + + + + st driver + + + + + st compile options + +Most of the following compile options can be overridden with +boot/module parameters and/or runtime configuration (i.e. ioctls). + + +The following parameters are defined in linux/drivers/scsi/st_options.h + +ST_NOWAIT {0} +ST_IN_FILE_POS {0} +ST_RECOVERED_WRITE_FATAL {0} +ST_DEFAULT_BLOCK {0} +ST_BUFFER_BLOCKS {32} +ST_WRITE_THRESHOLD_BLOCKS {30} +ST_MAX_BUFFERS {4} +ST_MAX_SG {16} +ST_FIRST_SG {8} +ST_FIRST_ORDER {5} +ST_TWO_FM {0} +ST_BUFFER_WRITES {1} +ST_ASYNC_WRITES {1} +ST_READ_AHEAD {1} +ST_AUTO_LOCK {0} +ST_FAST_MTEOM {0} +ST_SCSI2LOGICAL {0} +ST_SYSV {0} + + + +The following parameters are defined in linux/drivers/scsi/st.c + +ST_TIMEOUT {900*HZ} +ST_LONG_TIMEOUT {14000*HZ} + + + + + + st ioctls and user interface + +The Linux tape interface is defined in +/usr/src/linux/include/linux/mtio.h . + + +The following ioctl()s are listed in alphabetical order with a brief +explanation to the right. [See st documentation (especially +man 4 st) for more details.] + +MTIOCTOP [execute tape commands and set drive/driver options] +MTIOCGET [get the status of the drive] +MTIOCPOS [get the current tape location] + +open() O_RDONLY, O_RDWR +close() +read() +write() +ioctl() + + + + + + + sg driver + +The following header files in the kernel source are relevant to the sg driver: + + /usr/src/linux/include/scsi/sg.h + + + +As pointed out previously this is best included in +applications by using: + + #include <linux/../scsi/sg.h> + + + + + sg compile options + +Here are some defines from the sg.h file that the user could conceivably want +to change. The current default values are shown in braces on the right: + + +SG_SCATTER_SZ {32768} +SG_DEF_RESERVED_SIZE {SG_SCATTER_SZ} +SG_DEF_FORCE_LOW_DMA {0} +SG_DEF_FORCE_PACK_ID {0} +SG_DEF_KEP_ORPHAN {0} +SG_MAX_QUEUE {16} +SG_DEFAULT_RETRIES {1} +SG_BIG_BUFF {SG_DEF_RESERVED_SIZE} +SG_DEFAULT_TIMEOUT {60 seconds} +SG_DEF_COMMAND_Q {0 *} +SG_DEF_UNDERRUN_FLAG {0} + +* The per file descriptor copy of this flips to 1 (thus + allowing command queuing) as soon as a write() based + on the newer sg_io_hdr structure is detected. + + + + + + sg ioctls and user interface + +The following ioctl()s are listed in alphabetical order with a brief +explanation to the right. [See sg documentation for more details.] + + +SG_EMULATED_HOST [indicate if adapter is ide-scsi] +SG_GET_COMMAND_Q [command queuing flag state] +SG_GET_KEEP_ORPHAN [interrupted SG_IO keep orphan flag state] +SG_GET_LOW_DMA ["low dma flag" (<= 16 MB on i386) state] +SG_GET_NUM_WAITING [number of responses waiting to be read()] +SG_GET_PACK_ID [pack_id of next to read() response + (-1 if none)] +SG_GET_REQUEST_TABLE [yields array of requests being processed] +SG_GET_RESERVED_SIZE [current size of reserved buffer] +SG_GET_SCSI_ID [a little more info than the mid level's + SCSI_IOCTL_GET_IDLUN ioctl] +SG_GET_SG_TABLESIZE [max entries in host's scatter gather table] +SG_GET_TIMEOUT [yields timeout (unit: jiffies + (10ms on i386))] +SG_GET_TRANSFORM [state of ide-scsi's transform flag] +SG_IO [send given SCSI command and wait for + response] +SG_NEXT_CMD_LEN [change command length of next command] +SG_SCSI_RESET [send a SCSI bus, device or host reset] +SG_SET_COMMAND_Q [set command queuing state {old=0, new=1}] +SG_SET_DEBUG [set debug level {0}] +SG_SET_KEEP_ORPHAN [set SG_IO's keep orphan flag {0}] +SG_SET_FORCE_LOW_DMA [force DMA buffer low (<= 16 MB on i386) + {0}] +SG_SET_FORCE_PACK_ID [so read() can fetch by pack_id {0}] +SG_SET_RESERVED_SIZE [change default buffer size + {SG_DEF_RESERVED_SIZE}] +SG_SET_TIMEOUT [change current timeout {60 secs} ] +SG_SET_TRANSFORM [set ide-scsi's ATAPI transform flag {0}] + +open() [recognized oflags: O_RDONLY, O_RDWR, O_EXCL, + O_NONBLOCK] +close() +read() +write() +ioctl() +poll() [used when in O_NONBLOCK mode] +fasync() [enables generation of SIGIO signal for read()] + + + + + + + + References, Credits and Corrections +WEB + +The following references are found on the web. Please alert the author +if any of these links become stale. + + + +[W1] SCSI (draft) standards, resources: +www.t10.org + + +[W2] Eric Youngdale is the chief architect of the Linux SCSI subsystem: + +www.andante.org/scsi.html + + +[W3] Jens Axboe maintains the cdrom subsystem which includes sr: +www.kernel.dk + + +[W4] The author's scsi generic (sg) site: + +www.torque.net/sg + + +[W5] Richard Gooch's devfs site: + +www.atnf.csiro.au/~rgooch/linux/docs/devfs.html + + +[W6] Kurt Garloff's site (including the scsidev utility): + +www.garloff.de/kurt/linux/ + + +[W7] Drew Eckhardt's SCSI-HOWTO from 1996 (in ASCII): + +metalab.unc.edu/pub/Linux/docs/HOWTO/unmaintained/SCSI-HOWTO + + + +[W8] Linux Documentation Project (LDP): + +linuxdoc.org + + +NEWSGROUPS + +The following entries are actually reflectors rather than newsgroups. +Various web locations archive their contents (e.g. +marc.theaimsgroup.com). + + + +[N1] Linux SCSI reflector: linux-scsi@vger.kernel.org . +This is a relatively low volume (circa 200 postings per month) Linux +SCSI specific group that many of the SCSI subsystem maintainers +monitor. + + +[N2] Linux kernel reflector: linux-kernel@vger.kernel.org . +This is a relatively high volume (circa 5000 postings per month) group +for all aspects of the Linux kernel. The Linux SCSI reflector should +be tried first. + + +BOOKS + +Here are some books that the author found useful. + + + +[B1] "Linux Device Drivers" by A. Rubini [O'Reilly 1998 ISBN 1-56592-292-1] +This is a solid text on Linux device drivers including some information +on the SCSI subsystem. It covers the block subsystem well and has +many char device driver examples. It was written during the Linux 2.1 +kernel development series and is most relevant to the Linux 2.0 and 2.2 +series. There are rumours that a new edition may soon emerge. + + +[B2] "Running Linux" 3rd edition by M. Welsh, M. K. Dalheimer & L. Kaufman + [O'Reilly 1999 ISBN 1-56592-469-X] +This is a classic Linux tome which includes some SCSI configuration info. + + +[B3] "The Programmer's Guide to SCSI" by Brian Sawert [Addison Wesley 1998 + ISBN 0-201-18538-5] +This book covers many SCSI topics, including the pass through mechanisms +of Linux (sg) and ASPI/ASPI32 as used by Windows. + + +CREDITS + +The author is grateful for the following contributions: + +Kai Makisara (st) Kai.Makisara@metla.fi + +Jens Axboe (sr) axboe@suse.de + +Richard Gooch (devfs) rgooch@atnf.csiro.au + +Tim Waugh (ppa, imm, ppscsi + docbook) +twaugh@redhat.com +Gadi Oxman (ide-scsi) +gadio@netvision.net.il + + + + +CORRECTIONS and SUGGESTIONS + +Please send any corrections or suggestions to the author at +dougg@torque.net or dgilbert@interlog.com +. + + + + +
+ diff --git a/LDP/howto/docbook/SCSI-2.4-HOWTO/cdrom.jpeg b/LDP/howto/docbook/SCSI-2.4-HOWTO/cdrom.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..36282009962e0806542ce1dd5a0141dd723f5b85 GIT binary patch literal 24091 zcmeFZ1ymi~wkBExcXxLP?(V@uaEIW*-7OF-!7Xfpy9IZL;O-JUxP^@d3EDg7oO}EJ z`OoeDbocA=`t|FbQG+pdYOh+eYSx_J`sO#+)56m_fT18GF9Se9K>;d|f56i+AO#@6 z!NJ49BEZALBO)Roq2QpRAS0s?Vqv4>kP?xTkrI)RP|&c_Q&2HelaMg*F*37raC38$ z(+i03a|*L^adZ9}1PT!m5d|5A02P&hlahpz^S}G^^aa2~fMSHIgNC94o?${kV?sUk z0^|Sy1q+$&uL=L-1N96V1{Mw;0TBrqazZ@@@C*tX`WXx~EG!HR@e2q_y^xlX zm6KOc*U;3`*3s27Gq-qSX=QEW>gMj@>E-Pc91mE3St;Klw=I1e|gGt3}yHyV6r6V30Q9-f251Okq{<-0wfFH zKLJ7e0XL}$=s1h`^Qb>utU<{&T+geXca1}7N8NY5y&-jh9WnHj?U*T= zwY$_OjwImo{>r{WJwP_q+{n&P0E3+w6v*`iY`~lbJRqf#KO#e}wQ2PPgkX0)0Y9Ew z1>CSgE*4&nEMhwTUDjS33}P`A9=OxMr;_uldqW(R4)tZkLp?q*D!mioW=8oeqpkMf zOrA(4z8T9vztyCRnh7UH*?ak<6r@gdIFJN0L$)A(^hwrt~htHH6~GOCqYJKVr`Asz{ngPG;|Z7nAW z(Qp_UO}yXPl$=1Cxwj*}M9P>=Z{SYiJ`wZdOJiu8LG!MU_VAWYui)f>#J_yf`%G!G zZ6{w2KtExH8=>9^_$7u0l(QYn_3yc zQdiV8RwQNhIfmO%}UHndR_%nfK zU2QiwtTN5}mB3)ia0(1W94NEDocHXsJA-=$(SSyyE*|o-*DA4i6Kxew$iZ zW-BGbYfl@xa%x~8>oC)8whS##B@^1iZ;H%+ms1^_t^zCe7fxfVt~OVf(p}K=_58tUq+FZr+#1P;#>U7Qa@Nb9X~Bj862e6Hah^CYlvA+h5MV z`Uya^40{3~VJu*SV!ESe_b0jao!wibl;~wXOXBKr!Ob#5+ZK_S47fb+&kM^76OBX7 zsT)`Ve5fP!;a!6;QSLZUS$}q(KSeeh-NPk^9A|e&i();439CC+voH&f&>9&M=p+F( zc7OB&gKV^bzntzq!~fUMa_o+ivhdy%LYB)58vm-U(byO+Ie?U=?@5W{lwI43Ayh3Q zpPPSreg9rq_X#l3fkdf@`3PWOo<~GagnZyS&Zf49E;*|jCW4Cc988rJJ?QCRY3ykk z+gf*_hg$Z%+BTU86_gD70|WwHlRLC_VuWj6m#kr7H%Lx#Kxvc^3P^?W^02|&cxunS z>FAibA1XTUn9Q}t63SxO731YGP5_JW1^2^CL`<}ww$B%ArCc(V>cED8;+AR08j3{P zS4>bU0_HyN=;o_vj}9Eq#mE7G_SC&?#rH<_B|R@wgbIpq^N)r$5^B5`Z^B-f##gV< zyt@LUl;t@yI2AVE#Jh8L;a0x4ymR`{zK!L5jzFTwObe|q!Fwc(yqEN>)GBa2|tm+e}a5R$zp50Z;M5yc)Nhe}IpTOY?v zV#7lA)X-k@r01F`NnIYWIANx8)B;01B`{3(jyMSBj6^W%G*L(51UsJ+238W3eSn1K zCjjFK74O~~g*m4FM-_N<*A06!mDAm7(tACP>swGM?A>B= zKrOw z)oeXOevGBG(G}b|g#+%^PS?bpZf2~ic`rTqVfJXu%`&?qfGse$h^fc4Lp=+ZR71-Y zm6-);$V81i5jEM^7zTS!@U@1(-Fq=QvVqXLF*BJN9=T&T@N=P(<6|~6-mebb-n8-G zusA{$z_8dJ1aa+fKn3J}ZC{e39qNH{SiYypWtvYb%Fw<+n*Zu3oK2cXZEFHaKHDtr zA63OkI?{@65@jP5r^>>T9^%bvusyjGxX<--H?)V5aOAs7{I{L-jmNt(JIKx;=;7l~ zfpj6N{Usx7Xm7&HvxoAEB$(HFpR4U7UR?nW{KDGK(tsHxiSn2{rfO?b$!h zx13*F@}J+2rMceoFUN4iFrjOmh91{$-nA=O#;mQ{gJC~bzgAGraO8SfXa#7*Ba5=@ z#9{9|*JoOSOmS(!cAigLo5)Yk+Fy0rx7t}K-kLp}ik3ZiT&cQb$*(p^jBosz>#b2> zg$rA!w)RS5P5l5F`1qOTWRuNt~tj(o^f|ho#G&lA9)@Nm`?2=He zV!d8lnF)}ae6LvG^06`X==5}I@p{Tn@Ddh!eMY`q!inWap>BSV*QYR&U0&^3~J;Qgg5ou7=m$(VI*0{5aEmfF77&^jPw?7+_{&t z>W2#ZoN>Qp6dNqIFTd2>P96_W=^<2i)zB z23r@>)*;%HhQ#6w9~myPCcZI8L-ZP?DH{FTz_x;Opm#+gkGV4ipUqo)>}i$(7?253 zwI)DPz3wv~>ikF*tR{v|GsWzdp{?4|I-OsK&V98jx6)TdxSFprD!*NLEFqe5$m~Gd zS{vhCR#X#T`-z^xkX>#&kMrVdkk9RzI382h89F4L(L>UiuGo)=!xp5ydkE&FoIrd6 z7POQfs9Lhof+85QpZ&9=Wa$u;oP0g6A{;FenQQQdUQ^2)4KU@cUK*BDbB<3p*Bsux z7Z7IIRK{N}t4^6w4_{;NaVgbZ4yADil8n*)i>3oejX4WwIWS|W z&mB*2tnUf1MfS>9M~2 z@S4LK-$fC%r7zE5QKBfQ4BO*6^$iyzRyFj3>bIl}|f8N+3hsSTR)J1QqY-4#GUh*QvP8UuVn zrn%(^DHBW$wQX==o_)dl`GEk~zW%}wvrfnqdFF>NSf;1mvq9WCGU6MlIJieQ<6g12 zm7vqZo&BDP5Z*y!8@1OG_i~I(Nvcn4si9!~C(j7{3?4(dISAgCuo0BVp|DA1fI~d@ zDVB*80+icwn>n0IywrPc4THMq%0ItetHT&z`Hri!EC0cJd!$B|s0y{N){dNE99~x( zR=d5Uab{h&BL95L+AM@Le`ni08lJ3dSfq9Wci`p;5bvC?sCm&T>n)-i_8+9_+6~Z>BQ1oQk{b$nbuBU{RLLM5!E}UmzWO0g3Sc#Cz{oSaim`o z?hCUOEm~h`Qw{XgSTXW+#e?;Sq0&rQFLg4eB#_{sNP^_{XrN8KK}&18D{^Ywtlj*J z3xQnS#k8?iFqv~kigPSHX|U}z-b8So%4;vq*v(y{keW~sEU017l1MZ2n5@9XHuG7F zLc#+HLg7EWtV5sR0UA3(L#6Fr3|Sb= zaVzNj|0MGMipYN*eFguWe)&bi{2oLqg8l@uilMXr8yEb~(!js^{r?Xptc-iI9Xb?@P^<_Xx25Zj=f6Wf3J zRqW(4`3a!WmXHQqA&ghtVb%{i+pO!`ktZO50YbsN*MLx8Tn0}-=e*HuhQ1A-b``Q}g63pFIp7pOjFhHwC>_N!aKZFBS z2;=m}_cu@wi3vg>{T2^oe~T)R<#9#8Z}EWqx1a(E_mH6Q$8dlX(ET4n$}gz-zjRJI z)9za(hkPE`2ii;Sb7iV8hdfM#5~L{9P}KOpW4jO701LShMWr?>`%64mB~CTmcv|NM za@B!4pBYWzJ?sg7Rvq*`*xd`BfqYbI3 z{N{4Mr3@UXNmWQ5`px5h%VR3=64L)d9up^p#r?&v|3|0$J&*lQOsX;f!X|LNYVK@1 zjcFz=FH`28*wxJ_&Ia-06Y>K;ve6)b=Z`C?KcS-koO-Id7b-URrdTHHYe`zZTD~8q z5pi}*P1A)O6q@7_T>+(%ZH_%e6Nd^xq_t-<&80S?I30H|sUC@+R}`pKopB1Sl-g=! z-WaAtkN3JGjItYWzyNk$t^=NA6rHuIIfi{Eexd8l7%TUmRa#Pzzr-_8m@!h{_ld8d ztwSxT>RgG^R?V_e*N1)6lqcusI^a{u{z9MZ)g6;DAtE^MU-`j(RpHQ^Sy%-6Al?Sm zVo#|UCS{KHydcR8LEEM(5omgYIBAXq95Pg(t3#&eg07KMc0L(9L@KS(X9|Hc_;Rh!Dr$js7&mK z{VL#wJ8^UJD8CmTaD?mr1mvdvTEu!n(9K0}=M_@R6ELL&dGI)@;(t3VdNvK=_A~?y zh}P0rvq|HYXs5Yzl7+&)xW)&^$FSR~HTfg==&g2CTYCE9MyETEu*}VRd_7+s5I(LT z%!{!aSbVfLtR+52)IveifX+^XRD~MvWV1F=pR?5}P-OWZ+3v`Bnh?|PIL0>#-xp2J z_qkl9zNzXEZJDod12gE2SblO1LTh=eQS3Nb`o4wAmTs}-SDW6d&TE5)xT2Zl4S+FM*8Fo3 z=o%VRxmcQ#=CEWXyMi1NIN}h0cJ)8syE=}2sD6llC^dU1dICg^tdxb0kMB}eue}du zQa4W8C^zNi6@`%5(3EY2#d-3ZGv%o=I(_J#i$@103dD{MJ$xgU)~P>zoo8GA%7JCQ zv&vqxax?C`XPmc5;YD);RPGyDnivgUoH#Tkz&%-%cG9kb)&BUhofi?TBGT)!N>%q< zA5zJ6a^jzAxFxW*LeZI+6tBJ3j5l{6a_gs>hYFy`tLmQrSLv-fgN`_*(o zbyb9wS%PgNHe0&sDph5IxCLg*yVhOwId9xq6)0&O6(~qxi-ExMOt0j}E^VV*#$T`h zK)|`Ou;LS7Tw3{nGYg4+(l}7bn@U>t=skL%a@aagWebOEIQ);jq$&<3O-#mMcoG*U z{zHzfvtB;EwO|uVGwQ2bHC!m`$wrvY)B+2%es|z|CJ76Ki}lZ zPw@~lk;+(aq~7YRH#*iROtrcewB6+uJU3K{Fq5kzGnzRf6^b$d6%1LMk!e4U!u{mLRbAo} z!L5|2+tA*PaU2IG>Z;Wc)mFkU{m#1A0T^upCPhjCo+3Z+suZ`!&#gTbw>vQ2QE=>V z(!O-)_jJy*Ro6a)%gSlbHS(|YU#<~vxKcO3w=nE|3nqrQqK7ZmqR#mOXV}>@fud)_ z>p4Hq)x#52$&)+aFF4>Z?y^CRUac9c2{4ji#ysCm-XJBHZqjvII0mbduCnBHr0bWs zD4L=^>JXYb;REL!+F}i5F|iLN#L7ICk`xUIx=^ciCD9s9#)~MeF8L(yf`et|%jzEl z*naG0fQ?|uY^^ER5MVgNaTOV1Oy0xK2XZr^i6QKt+9cZWPOUC0^9(E%DB2!uM96!M z)X8lSWaJ4LrFFR2N@>p7xrwlDsm~spHPkjLoew|Y1aQiK0bJw(^VEUJflRU#9ytB9 zdVhg+#bP7nCVACD`)YLNY!7C+FTf>P9Te#`#9|x#1Vbe=LAh(wn-6S7p|D>7?=H;l zaQ?e5=9lBP#bpm%dNp(RQ#LbY@y2a@ywm!F*?Xup(ppPSUwGLSs^BR$w=Y=g+iIKQ z@~sR*oNKEA%TN_Xa$`i1;%5p>6REDdFX$sD>Okm%T(OyA9NIq7BMHsW zE_){^pbmy<$2Lf%R!KNhLrHLRT6M3#{WVGD$=9S^k)B(66f^OtKnD4paVh!( zu_we|T_1%Yqj+x`-N70L>=*uxS0RNgtcB0m9)c=5f2jWr2|Y5+J92-jD`qC^XDU}z zi5a5rpdXHWe*9`u!h?$Qb89m5$e8-Pd$e!QYwTIaOT-`6$J3h(<@8He^M^Hc&hJ0r zx#Sowr1L$`iDcRk62k)`uAeNecB28&JQ)yvpo(&G|pW#U?S#(QG>@LN7i8s4E{Cera&K9+>wHl zaC|L$%wx9_hs?=UmV2!lm|!fbkOXx0taL&oNGhoAFp5je?4X}#t{((n3XL)7bQOz) zZs#s;j5DX6jH67)6TPcf$oS@-<}^MB95Ym~b>HrVSGa$Ij)>gj21j|3w6iZ_bZ_5_pI$gHbofT_*!pfF7?c$J+vO5^3Z-cKsLacJie7b42NdKLLtC*WKA`gBo- zV5P97wcQuZ!vck|Xo7(Vd5c$VjipDc!yE_ygY#R(c2^V`k_m8y$ zBp=LUOwHm1lHhKF;G|*S*#O7CV}$>V%0~<6>O6;rAkV6bf+wJ$R&&g#SMW{9RlLyz zMJ9NWWjzRy9;8;<+%P~?ivbMrf7ud|RzG#T4?GSyVk!wZu$wdL16?eyS*NaM=7^Nf zRi-)Cb2mFq>+B%u>hV`?p<-cl1rl_PAF03&`WfY{99XI~v?gp$uJF`3!nV~AZW|n9 zd@kX97bXFA< zH8zC)3_s9qf$e_8w&_yfl7B|CHo|{XzROvpU?-4x-$jL6gcTUGq z)4`D8M8M-7vzfkr;jdXqeMcp{vkSs+z+`q9mMTjxQOf7w-+{cb&oU$PY>C)H%Imx? z6$u^6sbbcacFIU7qH#4GW5-8$p|&|=WJz3&luzq7Z(Ow|Fa2L3mm11~1$-5y9L^qc zw!Hqn^xJc4wOONiZvI@X~i$+xxUo&A_eVFQ-zVYy$X5Q&?9On zK#R^ZvPnj!mauT7?TsXWjmQO2n7>O$SJn7oD~6$Gr(~p4JxeVYLap!aLm-LowtqP~gPf|U#tn`dY zU&;Xs(SvXHpkc6NLNn7U2R=)%?0tZgy>g#yZ$zl>{Zoi4Y2(jFd+-^`7XMnEy4X({iYKv`k{-n>O z{k2;8`WRvJ59L7dUM8`=w*xC}3;~toxjZ$jh6<-VeIT&M(|3dP1oQ+fbnG3GXcJZ4@G`Tw!~CRlVvJs}$s0m&EF}<%_>m zZjP`V;sLg+sEBE&@di{Dzx8N^C70SJuhGs3^YYj>v`>>+^ZbnBfCUN1*2YjWpk$YZ zYQd`T)22HBWZ}}@0YQG+W#0w+!aKgYRdQ~P;`_X8EM}!}*IEg8yz<(X(Khfq7scRX zcA6_;E#J_2%d{xck&{Q4!;`dHJ|oL5shu`fue0SxlKfNWd8QYI8#mONw%A`_FOnx9 z%FPkeD^aJTE(pE$fc-#S3a3VYKx~OF#iKdOKZjQidt1f=dha845SObu8Re`fj=Y6? zzTt}P*A}zI70DX?65UifDQa?dy6%H|Jdo#9oNSz+ktKE(73udOP1 zqqz1b!amF@6OHGCX&SVh(5f-KXk0yfj3UbKDL0e^4TW^^eWZ_aDp*pxEbzXgR7*;> zMUyEEM@S42lc$5dI&+Iw}SwpBRlvra8ndi*!&?9Yz~5mz%^Et+9@MapLGX4a^s`4hyB zj6^}hW*)@y<6OZ55^DO8^^iR#kD=tI2o+otXtpAc+Zh+c=Vm@=n!n52Pq2+L7k0)P zRN@0JKgeMwq1__R?`y?-4wHT#Qbi3<5~TvQiOOrQEq~6k#3Ag7cdZ(Zhy+F%VvrQ4 zmBLwWg(nH=qv_JB30=iPb-nW|Li?$lzg)HPM6te=#r;z zAc8uCG9Qm3+C^V5@*QQz%(jsAOU$GQgh6!d`_5jYYiEZEI?D!l6+9QMok=a1XoujOCWL;&ah^j$unjNE<3hZMiB&_@VY{ff?b zsiv8$#|D`6qqW|M6i5WeTJ&%-xGN9>V@PTq!cmw!0eKGJvn$^I_k%mQzRS?eB1_tg zhkSgG8Z$qxej1rB7z<^180Z^KUqfWs>Y1XMvLB_yzJ%A_^OMWDvUD5ujSK_=0CZ+< zbHE3DJdc*jP`ZR$WaR2%1uSqbmOKjFya`jW2#y7!DH7w-I8u~`5B>+{3ZvdQo7dEJ z^L~7Gaco!7E6y|$1zK3*(+oQK(ASpl1~TflArOf?=$;AbWxSWI%!?FWg;Em?wANsg zj@L3f>cK0}OBH(idJuJ@Xoh8h4n&>UI^Gbr`b(Wy-YniV2#{Rj?%f7_u>0`@gx=PA z*{W7Ym$@Uyy`JW9VYc7yi1S`kBX6n3iOo#;{_5idl|99(_dz9 z)@+M!ovYR}h?D>uUih(aTHBb}qa^}3raqkyMoZ>R#tSbj%;Gu$P1&ow01q&K>Joc? zE^Bh2ML+GfoWsyG1E#}j_J)Zobu=UYC_lLU>G9Sh=NHsC}Y0p?Uk6j#sae%uM#oM(=1_q&o@wJs@S-%S#@*yW0py~SF#1Yf#Ae59EqPPlUbgo&LepHEqP1(eqObE+B%-|<{>(}j zCjoxoS>RE8Qe1W1XU_QGICO{&AmaN+j^)ICIqagC0H@2WEv_e5Ov zFcx%|*9_LAtYJL0_1{i$%0Q3QnRv4ARPhrYytdpx$NrxB@KEOYntH}K6HKd^!N1mb zRjT`pcZ0N5pQ$vjQl3m4hu8CTE~nsdY3DlJZ2~n~4_xW?K2_uG|&(&i38zP12!s=4h0JzWM52G)FV!Ie2>)0)Wzj35n~@h{zwQ;B1;$EnKcC-s-QMF)RT=9ID4*6Up8r*r6D!QQ>>#nXPH#W`&Yh}@Zb9MV@#68czGbVja>$Xi7G^?hAoW}B+Tw^%*F8K zr<1q{76b+VCjE;&BagUDbHqRN;P~F671!`qwLVh4T~X&)H4nAzeWNSY$pywwmmI9*ovHIvWz#}KCT<)g*y%EerkaR;$3imlBq}he0g>jj zj=MFHJ*mUW_D)rXKZAgVyLb`~M?PEB3N(yb6c;#c_egsi`T7jgnIocv2{T8MNV{Fs z+EVVW*Hq*Ju7m_}73^)SI*HP!N2xpy;ALB%q_g$_POD=OP^k3b-9R!{oMeA#)K*Eq zckz!C6eY6?(Q^6^_4-5k;gleO=>?h(X~WPpxYTgk!kFn7@qK{y`~Iui0Aq$3N07aZ zE<{G|1rtYb(K%+sM{T9W47ZtYZ%h!%1F21!??cKVPk`CaEU~4>zTJmh^vmV@_73fo zJ^v>lS@gA7q>!l1Y}ILbOxC9Umzrr>Hl9)QNpHbhV!O0~=#+d`H}L zJ^Cq@X_&`z#dlS*u?c_bl%{VpLRFJBZ}}Qx8$9+C*FTyT_O|7pT+>K+BX?hbN ze2R-$ZMWHJd~e=x#(cXtf64gTO=oR!9-X1TP%^w%;&!ORm-MQ# zM80sXrS8_&n++QH%v)kLk}U-F(*UElisC|?l-A$EtS;L+5+pf<4A$aFQEdW!CmLIZLX#6)z} zj+IuYHd-aZ&Ld3(6;vEU*rm8`?jnS`y2?%K@ne>MWcW)*Ht63=P1lL=sdqG1hnyq^|`7XwtKI8J8J$LXb2gQcltRk!a$%IZh*m#@;K+c+e!1zxzX72{ZB1jX@_ za}XkN)yd+A{}^oJ5bg9XmLZHu!*q^9d3zQ5}t=7_3A0|s%R#+Gi(dO=SB z@<|)dl?WP2fJ4Nuigt~ZSn zB$zUs_+}qmoSxmc0))b6hV%i%5Q9zrUIvYVWY%~e%n$plT30?r2tIn-hWSzgqCIK@| zE1O7jOURg+Ffy}vF>5pxgUMa*zVaHRy&-r1wlFR=dc{X6dzMa4RrulU;gQ1UQKxA| zOpegCURZeA80Yy4FM9d5Nk7`61N?>t-gDg-Rk76yhP2($(j=Z)CbbuUbRhAyp}ZhuG*gq2dvu%2gjV}wEek?XFa7~0?nD1x5%_0I%;)WMm+i@MtTanA!&SXGid@Y{!1nsH zfho;T>(8Vk_AVcVB{tOV``r;Gi`Tsz+> zqm8qcRf2NtsNa{kuCqpMd00ttFVI zi=f1)v7N?IPX_?Ht-iCi~ z9A5Jn5+ajx?xgV(9O1+df_6JW)g+cT%0;9$LXNnH$`#AjjXp~G5|yvAoSC)9=#%*t zQ@8ElXxGBn0~0jDXzVHAIK3Q(S)_XKLAAmM#D^_0FR|NLIs7>`Cc{XD$b8(&V~>=C zz~Aie#BODm9+x|P11iq_q8G-+=I)ygz7g&QG9I*qj;=kQD`P#{3I&6~I}vh~WSR-| z-rWhI8Zu8nt3bbN93N?J$&HZu8C;RQaB6#bM0cZSJoDsgZHHO28)EISM7?AjvB#@P zxe*eBs#8!>;bGR27Py4C{T=eeXM<5fnIkyuxG-p637M3#g(F_aY(*Iq#2(S%)HOLs3fq7d8)l>SH@42}6+eM^7t|R_C^Us2 zA>k_ z+Zu}zhCyQ%H(t=%G#^Z)sqSb@+d5ZJ#4E0lekZx&6JhGSwZp_id(zeRoo*^+mZTq7 zg~ln%ox|=Z;xx}(oChStaV|5Id+{DQXY9C3Ax)&Zb$2NltPV@0;|Y>n@!0WoVgz@~ z%lu1RW-4EKq|Xqi>insYo2lybOT&*(L?=j0RzW<(s*9g~x{$X3NCHEB26KL5Mc?`G zuJHqGb-`29j4Y0C8jLG6s_5v|BpBYqi@<6_>;pR=q%-Xd~kcTuVvA4B|F*387LB7$-MvT z%f0ts7ctTk+?W@ZvgV%!gEym1ri02`B`6cblD3@=nm^SvcslfJIO`L^hf+@4pMZ~< z??sK<#1mwTte;Jp8?aM}n>%fx2J-hS8$b$ee{974Q&;LF6n&5|-$O>R?&AKuV8Ak% zrZ&}`wCE7Zu*05$zbIYGtrAgziT1hzzt zwoKoJ?b>*1eOrrQ>yYT>#Vnd;Q(0p`wcq8H(O=(0W%<+S%cRhlc>l5i|Ga|}V!dwW z`;x)%9`PDEk}$-2(L+kp$i(R3C44>g*Ir+hX15!nx{4MJs1)g@{T5S&?G7c7vBT&| z}y$ja&TV zlUz}m9fgpxan^6IiyJPC7)-I6+_uW_p$r1WsRW5>AWiXh5Md@hh+%cZ z|BQ=)me|^$GG}R&QwU3F{$FtDzpKiA>+%1+Wt$ty^sf6Y@$3mrTj%LxlBYWz-ZEKXv_An{9}p9wf)F>39Vw z)V0J4(FG0jueu=c8*_3Zl1Bq}ztk!dH++xco?=(HvzP^@K+Ohp6GIB%6Z4Q<8od1NQAGBhvc>5B!8Yqgr2Prlnj5;QS=v;_ zvo!;!CRJpn3VUL&b(I?QbMG>_-(5D!JX5{<)TJ6D&M#p0I^}Pz7JvBppN9XpCW`;| zMgP$t@rR-2jHK#_ETifp5m+7b>kUPREfiZ9D?D1|T?m4iI0zBiMPS|k$-=Qrj0hs& zdFLnP?8qE9ftTWPHbjhTZi0;=K@x;6P(J)8ktF;dZ@~Y97W`=_-ABfm6CP3-=`i2# zAJnF#^sIeyYFiuLu)+*OKUZve*IS0`2V!cfWl@(lwDV$x`fSUwe=TUX0&m+8=3DZ@ z*;|phIT5$`i3ICd&_gD5)u?gk8o6zqT@bB} zdxmN6H`^BN6z5&!b~^o8dUDv0mmQ=a%)Fj0-!vYd@@$t5@C9s!g2rnn196?c?wp{A*0fvx95L=Y0;Zt;{gN zF55{Kv@i5yhm~x+6jkQjTm4yUfCk~MknfQ^Ue$A>Q+Q+*k>J-z@IABMgFZ*i+%2NZb4TwSONCXE+}bVTMJ zy!ei=X3%-?*+8BcCj@Ki!)lrdRO1UxkE~R&XSRanS2YcdYc#QX9E)5lA|dl%d4rUu zLWQb#lyn4aZ=zevRJp40EAW2t1jE&-QD_sRHRE9pZf^5|yYWzdR zSr~DWPF#LWHdYzbN!_hBx_v;I#Ad6l08eXcnwNWUVVg@Ia51^SGwI1hK-p8JT35W3 zN0FXrCVr-s<-KL7{PKMtC^a8zxl1Hn(%0kp(ag{Ift^5|=lPcK&d>?o*=WIPkQ!>) z3QK=Uu65(gXBb`9ay2dF1SjNY&IzwX#tb^DYG;qO|GvZ4OUE#;-VX~DQ6=l^fdNS8 zB5b`4OR*o?Fr7=iK+}7ApsOt~9@bJmTTye6IXfHF7Stj&6QvoYh6Ode=#V(Ug_m-V zC!WW=D+E&}%zyP<-0)=>mTuZFz;f5ng!e)k$TQv4}mXH33(99D!>k@0=ZaiYxbW9h}X9}hr2W`x}bB)T8(hO z^NDh1E*W|%)L6M|)d^aF4<*4Ei8dcY%kTRwKa?_J<1&BwF$|!~Rae!{FmKgX)dfw@ z3m=6c^jbC3q%*9WCj<~xzxLep*Eg7AbFB0A*E=>;*7xeHLJVW6YPf${WXEzYQ(%~K z@zD;2vo`&~wfA=CefY_bu1yg>WnM(|#m@Q@(>nb=j*<&QrCRU6pmv9NKLD7#LPlfOPlm;g2^_9 z`)HS+MV-lC5q2BEs(owrPkTcvVNA`e^9<62j|u6SPyHs_6r

spAh~X109T==c69 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 literal 0 HcmV?d00001 diff --git a/LDP/howto/docbook/SCSI-2.4-HOWTO/scsi-arch.jpeg b/LDP/howto/docbook/SCSI-2.4-HOWTO/scsi-arch.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..db3d557e3545b6f20a7f59b36dbc760c8c277ed9 GIT binary patch literal 29086 zcmeFZ1yo#Jwl2C0cMa}PNN{%v5Ih74Zb5^)2MB}&cL+s*;1Jvkx8Uv;+#$Gz5cE~L z`}FNUectIl_ntRKzdO1ZYt*1>?Ol7WHP>3-ob#LW;p@XHfTJj@APay%AV3xN2RtkQ z(f|q)5;77Z3NkV>Dk=&Z#v@D&baV_7Jbdg&6r@y?6r|+j)L?c-YFbu0a&jht$E=)O zyu7?rj6!09+@kC}yxhNT0zySa#X!d(#>6D%rXi={{%^k?z5uu=pis~bJct&6!v(?P zf*!g6DgXc>!k+fm1OMd(f`dmuL_$VEMMH;msKEi?K=ANz2=IuA2nev=ez5NW1YATs z8ZJpBd^HnfTIWaHZ{xC1=%gy!3Dn0=z&xfdfv9MNM8qVd^bCwlkC}P-_yq)ogr%R# z$jZqpD8A6p)Y8_`)iX1{rcVepx}_uu<-bV4~dYZkI5<7Ik|bC z^9u@#s;Z$iwRQCkjUAm`-95d1{R0z|Q`0lEU+3o6);Bh{ws*em?wy{UUwps(arN{1 zms}tK{?B6lRkGjY!iC8NhkyW&fc#4?5S%Bh!Q&zz(r_W+Nva{6IOEfDzeRZ@6_-`n zj!MU)enMdCGLA+F=3S#d{UzF;B>U$C3;f@b?5~3TFS+Ic40sT1^5Ag+3E;;yQ+5E_ zKiNbdfDOmncnZ(^r3c_5TX=CMKY0JeiFd*albL98S>j+{_gpchSJ z9b|c(X**EkG1!I4!krEQ$BR0eOZVC_7)n99R>s?cuUwfHo1HtLGQjzO z2|i@@)?!@(g9^Xj)tbJ0x~6Gq_cEJe=4>Gh7om_gV89GJImbmo(A@lmTD$AUV|KSg zaYur$C9k8i;1?Ekc?Dcc3v1J5F`jYtXbw@)y}$pl3{UV4*Gf-R!r=^BO#A>qc`lb~ zzll$N+8Nr|8QI>?X!f&dyQO_Yc0Y1I@<|SG>Va-MLFWQ2Y7j760)zOU@J4Ufz=|#ykvtz=I3`s+<87q`{-iNN0dZvo2GX%m zkWb1SHBLSWXN0+#iAUrZeB&p4p&!Z)n2`xZ7RpCjaAs4tc{%Oe)Ei?tJOJIo6(>g1 zv!|sC)<1r<+NYH~S?mP42XDPkO*BccA*ZGv3Rex%DhnJ{YngFK)qL0Gq%%LaS7m*^ zd-%vjc8%UjN`zc^=s@#BFn}cUb+OvP$jer8itW(;*iD~y2=J^4(*KH4ebj=kf_lef-lpe~6ADkOEah$%Go8w840_(R#>k_=`3 zZ0tS}sY+=KwgHyG8jI?DDvxz7KmweecEvo1&w-19(V8)+4~49s?5JX8U2BGCnk!}_ zINm`d)fJQw4-(q5mHMYu^gmN&&YhE&K@Mf~_4Ow+QM_jj-r)ES21`>H1$q|+(d``A zeB-yn^qJYp|B5~20SGG#3A7-a59rmZ=*<|`OVEB=Ln}H3Nw{{!X-{ir;@0+?vewS7&%0=FWw=8LGSf|U2t`6Q zLIY6x*&E2k0Jn^jKre~=AZ6?a0CDUAIOX;4KwW(Rt_gT0Zi%EHfUa38ftXt*v5s%T zvZ;taLe0X@))nv&bx3F$B9n^JI13~2_SNYw-SovmI%C=?&HhLvh{+5e6Uo=qGBSl-yxu4}Y ziDD=RqKXortx_QW!yk3+Oww!F2|3uAg$mck!+e%qLwt3BU%Z>S>yKGiu!*& zCAOnP@6YnWDarzkcaj&q?UyM0bu4vGHq&J7>gDz1SX$E>s5sM49@QsKjwFP{nZ05v zlcaM3R^!IvWb)s;`LM8{3(_^=SpPtGwJP-!`Dmz`iKdiLZOu|G;-o^JvX~tp)D#1{ zdcC(!7E;@!yINo05G-GV9yIkFS9tYGh_x$T2~PnW zufS&-&IDxt&op?-o9=WNHUd|-og)3hMgpB;2QX{|$DO-rj^j^S{s5q^{MvABe{HyC zu$_@WE~IT!Xnphst@i=Q)v6g&MV9zaI^8n9`L&If|Jp_)C2lp{9{tPrL-ZlLfdO2R zLG*eUz#Zw&jD-PQ$xbXR6uOh_>-*7X)$wQdN9amAr>)kTxY?Tl+`Vt(pWNC~wYQzY z!_L}@vb+Z%uUc(`<0ojr|Esq012FN`3V@x{$G-p@-#7m&E*M}7&$-8M`*lvw{yL|7 zsP35?(U{;f{(sf2m{6ScWI5lPA}u78x45a0r;3=vEN%fv2tsBA@UOJGUGHfgfY_b) z55NHn<9(c=Dzc=`k7d|3$=>v74*={UrGnE|l4CR27KNM0NJstdY6f-@<*$n(Bo0`p z?&I{vK>v5>)ql1=^imv3KkxG&I_K>XCXKOtux5LutHBRyXOx4Q(mkuj)EVs*{Y)IOLezFNH~CqGT>Ni|z7C;C=x zrS{E;mQah$-QE%|FLB6uDS$Dc03pzVWT|h>o2jQ|RHtgPMuc~=hOx^NFCS7YB6SD@ zMIPL-3n58OTS7k-zG0dz`ih=(ZxY2BeI50_?2AXuZE8)o#<03K&5T>DDmx)VdjiJT z4iIW1k^FomqHz-8<-wv%dGr7n*43ty(d)=eH#z9S_tfKo8l1ZDg6gU3#FKSA-r$ZO z)X4MkMIWu7Em2TIF0XxZP<$Qcwwn;a04lNIMpo$nz?2>Sr?zuT_5e_eWZajPc1LAL8QG zCxZHPLDHm6kJYwoS)=>zb5(pO<^My|For612;N!}Sp7B`7riiWK3ry{hZ z%NWn>bUA3v`rwwVXtz-_qPO@8GGWb5x=7Rz?Q+KH(&?)ffOSFy-1`GZczl z)G7Gg!**vXwa!9=Zt@lCnC&PqnoD?**Cv*YvVI3CWu0UG!m^$`^<?UXZKIc*zAOr}Yf#)_h6TKwJQz!YvzH6ab*1$08deTB*qZk6`T| zOAOj*`^lJ24;vEA+52!CiQi1z)0NwVQM?D>EA##XAj9YO2sHWt{AQp1Cl-_;;{S9< z1EY)$mOgp`;hFM6ojuamO0I?9w8!+jce*MRhwM&L^CW3~^M@puDSBg-2lelK)J}Ns zIi{Nx{4#r8@eL(yEi5pnJe+WEYMr-4}^-YJm}N(37Y2${e8{;W3c#$=LmyuvQ-63WGBL$c&Yg0lX!;VF%EajW;isj%BG$ZAk?0eigoK22 z7c2OT$!3{yg_5r|W0U3+$KOQ`h47ftg;uRd?IU%nS>HmI&O3}Ndb~@7eErsyIXd=> zSLStA{Hi;5w4j9i6D-oyTu2HyO%9RXrk2gfLB+##-W>VebSbDu=an7C>Cd3g`o2H{0v0OXIEWkhgdz+& z;w>tWC%lJ~i$Y`J7ot%BV_f$47M8SKJ-rpUOS^+%0hIg1ODciU8-cGmXSYN4D|N(6 z(LA#Rl}`{K{mE4Q4Q^^ntR2HPit780$_HSVpw#UVpr(0vTza(A6pSj+Z_O0!42_Cb zGlx%aV=3I2o#g}bbh-qsLWERBXv~eja93)Pdt#u_RU)V&C(keMQ!*s98-XD^(l2Y4 z7RkVMHQq+EetG>UXFuP);b(G3OSb5doo{emx3^U}(GGTxAY)N7WLM@E`i^Q`A%JR* z)?H`E!fQth%4Kvo%R;8uFM;W#N~iz4#Jt2w%}6$`Bmdu573p|Dux zJ;7R_SQUsCt5$_9*+3YS)9zIlXRXDx#9H;dn!XVkPacTtG!yv+7Up9(DlX` zb>XX)-%L=>iVdfYK#FEm_XU}6YI5oLW{mY>lTKtLo_w$L6LQK_|3a_$^DoQvElILg z?B$mHV{>1I*&16)+rLgGb>iS4gNSxsUV2YWx*y{iT2WFprtB-;XoresRDY<9rT@I| z&1gUHiou9(p7RCCs2GbnCS7|S|EX6NZxk^&ln-&rygG^)PIQ#FiHX@if)T-;FN-P| zO6=AEt%oY}@&3&4t&Ok=WONWR??L^k9WR2d2y7pSO0O#$UPLfuC|0&YSRR1dCjEX_ zlK7c*L2QUTEZSr621|mGHMjhS$aw2J=gT zvpSW)F2x~CQf^>ey)f)B##8>(f?mJ1!6>8S&L6V#K0ZPS$awP=TK>GyxZ53D%=$%r z>k*cUk6!-m*J9l_l4f~2`cDyJ9YcefmWm{@#ALR~>D zKkky--^54^4tB)-Mz~C$pa_MwG#PphwcHS9^g`@RBePqxAscKg9)h zZlyho^lgnu!#j>p*p6zDf_K4n=NO^XkZ17qFhHv1HUu%$h*M@jT4=+$6e-go?(ZQ!~o3yOnut_y}Tuv9P38#!6S& z6uzucr`ZsPabn)WC53>4^}*n9V)%m^%xbn(+j5L0Rg4*(*8|qOe`87+G=? zfROQVC+<_aceXwi#U$1WM@);p*Z*w(~21)-^h@H z*FHE`Q1eW`(zvU)w@(Rh;p!W65{5_r z!7&3+iaY@E-s>-K5Dopmeg4zbQov4r(Nm7Qz_PZB7uu3f5D8SYrn1JNwukC#=2onw zoAq&KK&6Iy7e*}4+dUS{W_tww*Ck29{Kby$pS{_fEt#KE4Sra&(8lwYS2N}DA);du-|$+^cE}?X%-h3Ku69Ut8o*Ea%kXnm6+FWn=_0UwK!TVx@(VbDZST9bBE%4wN262J^kT5lh$!dpI4T+bjtZdsU# z_2ztSc)N-4t^K;8QSXbI@vUgpmAPCM=St^V1xjs1gCKVP+pmXHItlHhUE-8eq5}C| z!3g8*rt!-t<#tBvwmOFVA1Bnfx3n1@w!j#0@^HDQFGG(e275>i2(>-R^S`Nh6J{q+ zBc{=#Ly?wqiAS)6i`{-IEhh9tIMfxpXYSSh&}y^ju1Wer z80aNWH;9y7JzWc65}ihT+lME!!D3lAxs#wgm8~=wQLHWsjmv_79=ln{nRfl;w*N{c zco-Lp6(4>sava9x^{!nns3$RRpFi+euB{Q;;t>QF`lwi9@Uc719Izoo9Sx#`PPlIr z?g@C{?`qGxPnW1Y>-R7biI=8U$50pC$9M0w0k-b{hy`P!+Ro(NS8hCE>pb*ZCRV56 z)B{i{Dpt6+tde#~rr_XPy5M;rwcz?La)YEjd*5*Uz@36Lx1-8kVU zrg9@SG0)AXtK6|WLG5%eMf}EVWXrxOhqb**TNLmh6h4Y6>?W@zEsa`qQ8bndTmxfL zt8amjA!z7kWk|2Je3!Y#H!B5%pJ$mB**DeH#@Vxv-?oWcgmSTbGIJIb^N2gv^*;#| zxTR02xz&q=%o~1hj)u&vsjapoK6NqZX@8@AHty8xJQPpKEp4`&4mSlo#+uh_&$=?5 zRIOH`cCcTnTZZy<(h+@-$^)ILkeT-zyYSzBp-lb{o9=g*_xIKj;QcA()1|o3^rXt{ zhJNp?J)SZygi(M~tfoqVwhSS&2;$cs{uXy&gP}xkA8xWUi+0+qqE4J{%Kkh0mesj= ztKU$#PQAI*@Mif4*3%sFs+42O>t!)nGNc5e7c$`S&y(l0k1$*(-_gE#(^H~~oY=V@ zC1sUWIn!)L8AMa%Sv8FaG< zK2};KlRyW0{|N)_2U@f@WPVw9QC^*wy+d&BYXDD20ewsbLi!YF=Vb297nMyR2{MZ<)(tL9Xlbah~TqU@n;NT1Y zu`FSyEYovri>5^|V!g-B-6-Eoa&ZK>SaamS?AlMRlYP@Jq z_1m>!PmW6!nUDE70~6>m@y%%D8G%a|Mm*>XBM{)NbBfh`PovL&dP}HP3xP~5^t+9jP~T{I}4vs zsjlJt=dlGkgFQ&_EcNKrY&Y?qR4I+4L|*ZisIL+fXN{qA`JLXmJ$OPdbP`jf#@LTj zo)tX>!royEQl&Dp)YrAvHKiXBgIDNtvq^d;_=RL*v0mSn<;T1R$mL&c?PF&X5jQr4NM_dXOp@5pwf7Q>^VA_2rRr6Fc3!)TJkasdL-_2Sp0(K|+92p3A0Pj;avxuzq z!qD=6!oy^+5?SLhegOSp`;&KHBx1U*X$p_e%qB8gvudC(vyV<{Bp2ApYNw!o1lsmE zyvtfI#bWYx_H;X2*i%Bv!O$w+0WM2uW4MSn(K6!)P#0rhoSKc{jYBD(wf@hiV2_{@ zXma^lBhEs}vhTa$c(GG_rupZGQKY?fLS_xxbIdJw-&>RO4OW&Fw&v%%&Y#^V%!i|z z!2(^#FgM0)tt|Q<(e8snzB1H4=s~#F=$pnJ_F47^{NDBFU_ZZx6-Xu%i zQ(uoH!gRX2NUJJV{=HZ^Z^B-Y*3QXi0#-is zFo(7K&fp&OWN43q!DCCKB7Q)3))x5-O)_bTj#s`>YDe3GUf$;Q%S(?elYGOl^&oXi zg?N^JrPXrCFiZJ>>c5 z%ul%G_jT=8Z|se}7#P@G57oK0)N~m2SD}tcZOeb?q0{K7ZkRt!fb1k1wph4c*ESSM z7c73YN_k2eG+ml)sF<+qm*M0}EfaZQtn)ELr1ov%=H@C~>J`?qAMS$-@&&EB3*7@Gi@AO$U|-B2oVF#;ZW z=TYfxJrj;aiN}@S(5duYa1LinP;E4B%+i);$8bYM*=}?cTaQvk@4RE3ke5 z=6*~piKgJyl-@414(&7mC+#TcyHpJq?u+V|FuIK zjz?Y*ihz0egunpfz~SGphHx99dAi$Rl%Pdx>-@m9AJH5-d`Z zPTPI1n|i5QSE*D>&tHsMI+tRt#FI9G0qBc-+-~6>RZvov)xT^=_bIfeu8G^47YL1f z&rk3K<5}q^W4A8^gZr)Ar^q4H*acn=-JA6gbbW-{Y2Ev2SC&;7NRWq#=ErJdzcFrw zg$XO7>-4<5lIxxbh8XYWVtu|Y*GLZwH$mzcRV>L3VlaHd)dEc6Lku5)I{!PS=+=qK(!mp)pohK z!Ym}!N%g9if%mp$Sm(wvQsNt87A)4f?RYPfiK)y?Og(WpF}3s&%~7SMpJg!kXRFy` zj`Y_8bos>HPOrZw4*f`{ZS*`Pj$hHNI1Bppqab)Vs3K`VK2-YwNQznjne?x&Lphoy zybG5Vy!}@>kd~GdqRv&k%ssvU7Ezy{1MnxM^59d=(q^s8dy11=&ZlqbqQ#6fHB>nP zxLE)Mv+=O>Sq?>C&R6fpWPh%0wN^NK^=Up8OgHHCtozM`wg@&Arv&@nV0DaY@KFy3 zzViC+1+*&8&H_pV`V`+G9z+%W&Q!KJc04Y>oL61U{TF!uu# zG`d^oscYj8i3> z(592i5Vq!zc(U#d0Zu3)`h<&xJ!t8~cqr6yPbk1}7Ik3`;An*o5M56YK`MD{Zak8Y z`Nq^#;^%x!OCs053_y~^o% zc?MtmE8?CCi?~-z$6#3hNO=`*+=jz8mE@_-ULkKTb8Z>0niXCsh=t@NthVkae*R+o zDIpwEWAxF?7NIwW)w0IvfJTKD9SzC|wjS^`8|JF{qfFv+8`#$%7|T)!_9Jmt@Z!Wq zJ{%Mac~h5lDxS1tO;&Tu+;*#9PkY+jL`HWD^anm+$5KVA~_f+G#uqS=5a(H%C;#aMhdU$VfpGCRQbtW<6yD|6xK(0on9p--8 zs$-)M+d30;w{@-{N{c?H6ryWn?)$QdBa<$P{Ap(AH+=z|J-M!eUt(Gh@-9<{Xpj=5 zT9-O7fcL1m5*?h-R^tFiiLG{D-19ifT!tH&&6He9mQ<~fE}UUfuz>o!UmSb38&@uM zhlW&U+LzXoxgCN=Zyy%=G?1+P{ zEbrtp_*~zCGof_&Ju9aU$6RF-38*rbB!HU79KN8;zf0nb{3PQp$o!WVuIP`mZPPS= zmGEK)s(XBK$2>99ad>2yIR#Ez;8em<{ft0ifh=_RghJ-GfFulDH0oU?Je#R0Jm9@! zKAO2dWLL|d0>7Qbk-=5ZMy4=j6gq}oM(~fcodO11gkd^|+=XyXJh{VNus8mmep=;S2r<~ZW<-LxcoH9B1N3k#{-TK;M7WZeEw+_?rAzEWI=ke z>|&Sgdt%a!>8`)Oy(g!*Mb~G3JnmT4>_T>|F@07^yR_ey{~rg>3LdLNOyjC&Mk`g9 z$kxZJ@x3~#c-M^F(2WTD+Lj}6Emb4Uz2!3MN>mIMYTFw4)Q30jBUV1nQxs{W8;aI- zeL?D|dSc@C&7H76-q@z4=qi11l>eS`Y&t*jb7FKI4^P99LT&#SkX&|A!509)$`0ST z|Kqy-qjJEa_ps&jM{30%dlZU_m=x*_mKg5E=}C)cy=Et5(Ve%D!I36J=cZxg!k?_q zMEN^}=z1^mNAF+&TJO{?NABKrq+ZkzPp{u2S;Pit6J%bRgeIIY>_gS2B{DVnMqz0< z6Femcy49HXI++B!&{kdYnu4JjHqt0l5qu5*Pv@8q81I2iwDQkaERy5ji5=bcbq_Z~ zhH+(+61=&>p6_Tz_(O`GV~y4KA(Oz9CG?Fg3^GfDk3w}#BMU64{l@FxCQQa77ZP;# zdY4+Qpx^Rvgk;93ap~%ZEt9!&ak4dtY=q?oeT1OEZSoV}=AJ&GkWF1XQ*bQ2_^b)W%b>0<2b2i6Fn)o zSfT*I`COOGXrta9N}lQOVWoEXiauI5WV%Z-pBI%Wy3~uH@ghHqs4b+oz12-ZEmZZH zhZk+>Wu1)96q&&}D1_^vx-Nc(SR*l1nzpFfo|uLN zMf0Z)4u7N>!Qh@=%Vo~V<^1*K2>%q#44ZKZy1+m`t8k>V0OX|uJU5;IZe)N8N!eL| zP<=D<+BZA#uG-mGi1HI`*Fl|7wCJ*I26jDaQo#|NG7olFsF|7a#3660NANfpwAdWO zTFx5J4-7WN4>$)CzIlMNkIImH!o6}NPR~>x^SP0_N@8#e; zV&;+U*1*bV^^uDgVm&I^ymIuttaC{|GO?H(P^O_yaz8&Aj>S?DMLU2!1&3<-^;t)+ zN=SR-aA{gi7v4`bzR;g0PN&(XJ7@y5mha920fb=EjFZ^Cj0**MsMz5&ZPcF{vFaq{$t5y{ww<&_wv7}tmpor5$o7QUij)`2cmREz3%Q? zcHT#<9hg-)pW=kX9$jX)(EgcP^dA(Xf4{@Vql^lcdIO!hCCge_erX$TXlQ+T{_Fu* zNP6cAwb5BsdK<5z_!Wj{1Yo!>qZEelkn7rRU&8`mEWZemfBZD&O4_aM=k=__iI2|% z&HmA3C|t0v{I)DSS$fD`!w|Uftl8VFamunmy`QZ@ z9ii+C4n>cwa0;;h-`OK}Zef9C@OkIUOSBr8UrOm0Ar9de>R2nkLDYj$wDbN#>io}= z%KrM<#;tp)(YFlakFX$QuE0k}M`)APPW;!XJl*N(N~{&Whc1?KgEPjq#4WUDf@4LFzjY5K$v0T+)}+UXkQ7tc@9lh;w$*}>uV ziW`Oz14;b0F8!oW34E)$K$>BO#lh5EyRK?=r#*r0`UQNtd@ZaCU1PnMRzbI{U^Na1 z0ih7~2Xl)>EFJ23?X3Ja}Cd%wEZG^MP4uB+CpjiWbbKnf9wq)|nD$+HEn z5b67}^!#2I#^&nxbP^LDH+?xA0zcGA`1O?9qALjec4oO%VG?X)j5 zP4kWtEG>$qC-3xPPVw*in7C4XGLN=`P(Pvwtv6PfzmZ>^HCbIqZ8}D@N~-&zZfLlq zE91;MQjl9+;KCUIARS-{gFbyq7#%)2vX|DFb+?y$0Tm7|&S_0(9r*Gky!2Dw-h@!x z{VEmbn)7aSLdUi8_Pe!xF^02C^wG*L$jKmPWylY!@Zx$R-#UbN6!MElpvwO$F~i_) z=k|jb*?l|A`EboY0rO8DOKfI+Te(DQgK0tS2hfBT2bpWNqz6Z|BZQq*T*ptD~7-4Qn@SE~gHZ9GhqsVMr}mv`Mgi z4apMgZq#pFVg-5R@X$~i$h)Ao`L7F&AOQluFT(%hg(h_OqC3|5;Xv>t=e5}j( zP>qfb^1dIIo_BwkkN;viue~)w)*s0UzSwYpu?lCJmAx6?t<_geeow}n`OLZ_a<~Bj zT}}tfN3e#2sGF_&6v(-Z-`I>rbiZ~8aayKo6i!evz9dv|_J-E%8&HIP>v~6nXwdNG zCMLkirt2O%+@8Tuh|fNbVc_K#pp=DaVkx8eMn!wrSr|j^tL3h9S$5gz_N)r%rhCw#Zv5Pj@o{NUFV` zGwGnSD;cYnr*qh=kAsYyezC#IKMgUDp*HnSjI2@Z6>D zpUra7^dSZ;M*D0!9LV7*Y=|)VT4D#&S2rm&WZ0=!KgE3j+$-VB%AZ(DCy&V7IgX+4$Tu5uV)IDl(disn)qUHw}6-P*m_UP;$d zX|gZ^Wix0-;WmS*!1{#~MzV5VN14~c+W@rvQwd2@g|_LbF^+%T~*m zbh0Yr#gEbQm+#M-OH8%<=ju1jV~YS}NrWiAX7y(7Cr58n9-~2|V115gZ?v zUJMIw-=C?l&&)8USk6D6QdJ_ydJc#&cbi;Ipq4eGuao(B<)(PM4St9goT?Tf{s;h@ z@m}4|ucw65^EQ$l+4(pK=DwEZ;ui zFRln}3q|Yab=Hurg}f=uBzudwW9-hmojmlk!=a=2dwPZ+ez@*df_!Jloawq3T z%21T#-uBR&u)c@uy;B2IwTynN6{uY%tgBBs?`e#h^W)!8tD7p_ildHW&-BD)=>eMp zvG>PL9chaPeaKb6Z|b90_^?n_Fl>};VWBF>uTa(Rkl+ua`nMzeNW;`iZ|!hKXXsn_ zF|kR5W*D0M9*Fr1<&8?7!V}`xi{}hYYfWAj@m%x=rJNX==27;aVYwQ;u5<{SX?X!1 zT*R;2Vs<7()fl4Kli?g8f~@K5+d3(ypPpv+-o!^1g9l1OSc}RQo^!rd)>clrQ5!p= zwd&9@s_DuK>wn?Mt79a56sID%N|lvg?Dev+K{W>3SSp@ZmZ)GqNXef)i(T&`uh#g({~+u>I==x^ReuEqk_}y zzL)bTn%qBA2QY`E9OlvSBR@^Wf8)|uoK4{j?77vGvmg@|`BITXsL9Ea{mH=?rJbyC zgE~NA9aGDmOyS0`1?tID)7{eStnfHYNs0R@s&UB^#PhL>GGDJIqww`DhYL17YUtD< zbU!3Q!_#<@*s1R`A_h?ZY_nYYFim!xPfQ(^^;X*7%-i&aoIa{##)UO>?^}nY2yS4* z2D0EzW&J(nB)GmgZ8a|aY#qI@Jzcq!l^(-^$m3BA8&80MJ;?|xWvu1&+`82dHFnPs!u>pN{$DTOK#Pxo`P;AF;+U@zOv zR-dp3|_171~rm zP1xBE4^5*K80}_E$p118^S&h0*$M zMt?HB7Pt$9IYch(^8mL$ETZ4Gt>3@FtslD*mm2ft^S;$OBiH%{dV7*=PpfF$8-5Cy8n8S@)DC`q zAo|A`xgK_w)tQl@kwTtM%k-iwdUDDV`Y;Lb$fHNs325JVtMT0t-MTS4%Fn{l*4k36 zCz&CcV#s5#kyuwAh3j1fep&;3^c1LnZ~eUEx-RsnnYU3hs4RKy#wWq*l0NRT-|I%( zJQN?y|D5dDa=(zUxX^an8}UcTtc>Avd+zIzqov$f=Dx85j_n{0nz?(diREUE6S5*GvT z;S2nMIwqmL#Eaa5eVG^!0K6n-dGKakUAUle#EU6B!41`-a1I6lmXCtPrTP8a_s72O z+3ZQ4*7g#Y7N?etwboPRsn%aK<4}Zpg$}%SA_(8$hTJgpjB2Kc^s~7O@hP8vp?krj z49)={7HAV5c4_tCLJN@u9o9$G zT`qUGVlTla&iXQ};8`ktla7YselNyVKNa(dipegFU7xrf^QhNyO(aS=(_Y{OwEFxz z!er#zG6uFY{<*gibOWmQ`V2qraf8a!GqVu#z^0CQ%C5f=bJdw0=*$^1r|vBHq9|U#kMHGI}RXiFZ!FnYPu{?&BGWMS`zdA z=Qo#b=dDL8ZBZ+p(JinM;JC*(d`&@WsP4r(8+hKCuOm(r+(1+o-|<6olR5|uiEOZ?yE#FqR|G1CM~PDTmO2aJd}-+s?J+a zGtz&aooeiI>A62*WwvOsc+T8XPN( zar%TjJz?EX@rU|2`w^d#JhZ`Wa6jT|dopD@Cmz*I7PD20>jMY$Os;PyZQzB(v(xgh zGUz^}-jL7Id?J0s*{Xw4sp%bVEXOC^1bCLFLC0g}S#S2BoMBj^kYZ)RjRckHl0(SB z*B;SU@n`l%A8&Fd3VUJf{f-2%5$SjwgK~V)*QfAht6v?H;uZ#64gK*bNrFXG49&nurk{hUadFsGuhEo2q`{HGed7h z(fPZb1(T;k)l*}$Ik`EA_Z$4Otgb()%lPN%EcJr3Jrxcoo=hO3kOvAGXR^OuHOrG- zCLPn|P=hM-=G}xezp(jOZ`}PhA?8yscylKq1?a4v<%?3^EoZ9{!&-UvPBTHJu`Zp+ zI%kgMDG;kjG!*yVLL>9b2fqW%r65aK)ce1h`BJpMCbhC;G{gKsAvykEnIB+j=d$zK zlD~Nm{*qbnPZrP;5@VD+)%p_^`}#g|Ojp0xkxU_HK&OaF^*Q^K5#-F`3^N$d02x*$ z1z#EFHrM=fDUGkUFrtU#5{&49FzJ7$N%ikO{~n)z0o@?f-%5{Ng>OINmG%N?YH#?}brXuwZp47+{o^_=11k9=#_$S>A=; zKKq=*8_IdQ+Z`gj;&o*9rp0(vjT;-V!B}ed531R??7FWjtLV*SR!qT4P3WUTYh^N2 z;yvx!ALT`$j=6t`G^^41*A@S_i7IMZ@`BMypgJ7iG5IZQL2+=S6el$eZrJSj}! ziGR^bezPn7mz|*{URq$Jv#*DM^AWT3`yyl(?KJ*YlC@}{J%E_YI1tOzqnDcOk*1iE z26V!H#Dlp*Tso2G zaez5Wrg`Jehn^#Ba&o{y&ERe}s#(M`r@z?1hK$t=TG!(3n~X)17T)z0J>z2`agVGJ zT=BfGG;D?~ZQb)%RQxDLQ@0{SNOqjJ60sX_(HTU$ZoXK$#I-*HP5s4igAx7*@1JP-`FBNeXe@3~5Kl=GR%ay#XIU<1EcL&3H$is+t z>O229>BOj_)zNodx0@QG1fq9?VT*y~Xxx3GwF6br;lkpZi?t{BA^D36j>yT6eh{94 zo$qQ5$E6dos1eW6;LM04tcYVi6CtGIj&D^3Pv^aMCW}Wp(%Gc}Lv&(#;M5tc7HA!>dFE#x1{2gh=B! z7-RdFW$t?ahg6V8w6$A-H3`hU*M3`DuzbG@Slt>vLpk5cIXSvo4hDEu*wx1@h z^?hIsg5#gaB_|aX``fZCB@#&ABK!m{hnIS)Fw61_l&noW(e-6;Q>;-w&_o&bM?Xi0 zzz;cbx&X-DGG6|d{$Xgkx+(=%kycWNTKhUxr138YWSUdu=C;n!nEYD@`1!9+151cX zAl7a#@Uf->G?8f3YnG@uYf^235kBsyE z!{|0L{^i^P-;7ahzW2J|k^R;zEv#}@ZY@gO5Mx*UoW2`aq^f^-n1h0vsk2?~NB2vP$G(gG?~K#CNBP(uen0qI4$l+b%SZ*%V( z=RM**_r5aT7;ofP));&L*lT@jec$}%oU2-=Op=GrDdvhi-1h>_`d{djzMHG|zU_PD z0MQw>HWYT6`W$8r5;4%OWug1sf59PojeBKRpxqyFz#FM)%v63+>$%FJ`@9q<4fw)I`E6bN?5kSz{|n;c~I4nKluBS&Gt=w~(G7K|yxnp^f!y34RcX~It&)lr+U*Q$k$CkF z)8%@6?UkWFNWTNS7%kw^!viGvM)1v73!lB!+Los@s>{OxAH~NNRnu|PJN9?j zvD(?^fzTnS%v6in2O5;cX2O>j(yz<>1h&FNMWgOV$h8p~2lVMB$sA-59enr|mg&&1 zWJtwdjV{E^>*?vA*uI@il%Z4+6tw!TYb~M#Rs51%c>Qi|E9_Y8&pr1~knCg+)@KV6 z^H$fb=ynz(D0P3^Jb3xJu`%%u%<57DSv#l2SxlE#a+S!SJ@I!HijK1Od415%kT;*&pC#7Z;VH4% ziA&9?lZp2XHYfXb8WMGNBR4!UL%|hvU;k&8FQ$AjNDtCVTIGrL&tDj$2r&+6khp~B z8cpvkLq2qsl^3rUjz@ttqN<@Ibv-j=)ErV!o?hWxfh`#+ffWLKWl1#i1oj%I1UZxs zeVv`H{?is_;)us5cndA?AgZ1dUd$b!f#HGLmrA;S_I;o22vSX@Vcob}(=G1skZxfp z^Ci;+PTUh_@OZl$1_~B@buRj8ap8(joE>=iI-{e0KtwQ3_c62}Ucj-0yRQ>_|0(A! zC4sO`4WtX+Rn}TXiB@CHjAS*%f3qb6C&%`c01fBau$9nmq8Ck*n{B4JS0FV7o_m#< z1vJav7z)PvzgGlHX1lsOY>TNZ-&2O69e)F7#Z*kQ8n6kWKvb20n8VNHNP3cBA<~$+ z;N+b-U?SEfyB(bdt8aY17u=Q&X^{!0D%s4ZN7s2VKh1YQPIQggMcG$8(vJ{{B!tSr z!m8H~f1cN8fYG4N$OJzUWPMn$2cQutgS!Xxi;v*8P1k1D)~)O}n@3q+Ls9?(XSuP3 zv37+Xr_@T#xNCU(pie^NcwZ4bl@e|CRw^Zv8@pckxk6^(a`N zd>TWVYajPw`1eB7qZEK5fHI8HJCeqw-)&62aZj5 zFlL}bxKB;ofV_#S(X2SN^2s=`@|q6 z!Kv8bYmg8Vb3{Q}*+nsu!~VJUU^Pg%-D(t?g3+B5jV-5+82X+^3to3a!R%+htqniaEh(z)uo)9joN4h4DAh>;{ zH60qh*$rhRX9%UBygjpEU10qc3OeX;<&k61dA$GgXy4}459_-)g#<6Fn|dp zN#2I6g3^AJ<)pX

BM`GdOfMXScJ{Tkn!)BEIZNm_JW4WI4t2vVlH|7jKn{iTn)| z1u;zWqxi8A@gNh8SJFB^Zi?qFyOCTqihU>9RHpQs5i31&5{JjSmBHR{l#BU__PNIK z2*J%^GbJZ=<=));b%M#0$%LYI**v-n^_ITQ`mMI6BneSk3}2i)SPZJ^`vsv$r%6e= zqc=?%NUyXRTdBRE7Ht(Uorsb(uD2wlN(eY1$i1R#mm}M)P$*EWT_UH><*UKIXI*j^ zE9c0Z&mGIPFLl{GZ+Yku@{$ z>zP)@j>#x{We}(W`TDyehfa&iK_(Ik%>+l>a-cm;zz6;059!%5X=kHDf8h6_T`=~8 z+>sC+YIXiVJ3y$`omG1&i^z~-*=k1qBH<&s54ei&Jh4r7_wk&7xXG9pVv#8wpJeXd z6mSs|bs?EI1E~7H5VVOwu<5OXzQVPSF{_F!J7Mn^ZgqdpFbwN>n`f$&iv|bCZiBGC z{YHu)^zn1=$s?b7U9Ai+1%I7Bo1X4<851XokwoNU|7n#y-pY_G_yEU`6ZO)GOqn5D z1a-x)Tl{7Q#~1S?O?$a*dW9!m9-RXR;IanUNDil%RRH4mkJN%Xxk5#d%Q0Q`2F}0( z(wTqmJ&HTnw%sjqkInubmY|Wt$iv^})xMrwo8Q)M*7zSzu4M32ev=M>zsPBI%t_D5 z6CNR6KR;zAb9YT^TWxrLMnJ4fh@pBY%-OJdPcJkv35O2-I4;~fTczVUQBoE=IcYfI z2LlKfB6^CXuqZT$#$Dl(;1`^3Y9uTOqJSw90V7^pP^4IrKz@>b*?M?kWK?;IKTonr z=eAs&bHBcXevLKe{zb&)91dz`84eU&#L*4ZXu2kpmv88h;I*%meq%X$k~|>njUTy< zI)B`N&a?<~TBrhdG#PYy+86&Y70_uTY(6f=nP1pqaK`B&Ga4PTLkzvH_Z6C|yVJ%o z(&cc_f$G}lz}z%T0T1r=H%OuFlm@{o+`4{=A?IMQo<`c#E;w%{weYAs_8 zo_LbaU8Sv&=dwz|y{YJ?;dqrwg~8DxC1#ow)8vXtszNj}-FaSfa0}TScM)sO*==CsW$EB1Oki3Wr7ZP{X_>Yeq7)Q)rMvX~6@MKE+@tSPsRq9zE;O2|DD{eUh z<|YeIJW7s|ur_(Us$#;$VJ)>+uFHn{NdrP~-mFn(3nRo0(|L3Fwh@6y9C%`Y@JvG3G2Y}yEK#KA|JQGgV z&uM>}fs*R7>WweOSW7(rt)`;<@*UU}K za`j8A?TpexhZ}!$dNEUunx=Z-9h^t$jZ&^WU>htkVXPjlS;CqDj^+~HM{nQ~W4oO) z{gR#&K)b*MM>jm5m)VtTyijN+*3nb{HI3B1d1gv*x@eh>O5mk`ScZ%+EjmijUEN4m z&5W~Iucntt;WH*Pu5074;A%U?=Z#LKsU+)*p%-ZU*yz#Dlby5cY!{F^#zTYyh1REx zDrGD}vt*RfwOz*CYluL?5+R=(@V$lP^{ssB*eQGwhr~Nsx(vv&Jo*UnI-fm`b~6$8 z5$c58>T@uopFKwAl@3=Aaw552s624NarbH8HB!~D6%dm;yq!8Y{*%cj;-xeF@(eV# z9_hr?<(SP(AJRtYUY@t!%GbOeaNCbkn=I?^kcL6RHm}^bDjqq7TZlo@>U+x*E;QSF zT5aXdNnUt%dg9Wcj2+9IgZ?Nu6K=;Pzt+lp&Ok?$9O_3tC;sxkZJS7BB6tF(5c>w6 z%KiVMdHxF~!`86xJ)8M1NB~Uj0U6C}6If^XhRdFc$+pN%B0t zYZSG>J5zkMRLiX>%lblIuO^4rS^>Ld!zu{2X8J4yfNbq|5AI#aR_773|$t9;_*`UO&V+4VEo^9uB|ObD5<1kn?-AE-sEBUA#V? z@!HO~&0B35F;ZI`9h0o5MEK_YrAa}*BBe~vn z(}Y;D+1Q%Bn{a?Hqp?~$Gp6|#*(EthU}C(TyDqpA1Gyz|Knt=cYcpUcH91GVa>)My zX>5I;J&Iaw%Q5jl4Yc>^b*1hr>t%nZS%GjP*-*gecQDuAwTq-q-H(tX_$XE@>Y}2A>J9L z0P=L7b()F%q+B7|a6!tf+Lk%@w6f|w@%&$}AscVomkbfWJ+PXj^oCpaGz}$mw23w8 zOu|LzI{-FOpjYRu>81K7WPxw1OIJT)&ShCkzj&;j{w+##$%dSCrU(TYoZ}Hs5ySG8 z%SZ2`@aw4_F8MiawW0+!vO`-`BxHr4-jvf~SP=TJ%|i@Vn^FK&J%e)X1XcHNTLcFJ zsJbT?1;dAE-yaClbc0jCqZkR`TM9JjxM+<|C?qeB!zxc0ByfO1(sksQ3*U4a{c8dV zv3ige^)P#6m$vpX=Keydv9&9VDYru8%@`i`xZ~|Lra}sszVcZ&2Hq($h~K|d8R~5b znlvQPM1QbfM?buM5r1jSbWgfCab}Q>=lDjTi9Ja4DM=CqXrtz`y6fAqVa+UbX2bT7 z#=b>K;FRvuH&k?St}L}f8C)@(SFdRnw%CjewrDvPNDwkjn57O6bm!8jR zkxP+^PY^^>SK>fpp|2KpK)-R2cC<+45EhH|><^C;Lvc{<$B?LYf*3vuHx!~1x*FU^ zj7oEIve&WO%v`t<`ZYcUt^>Jw*WUToaysG_+X3`%a*YS%u792;P@;jq*iwt<^n$orD{AhIM>Lkg*$Q6DAjCX~k`l z%`kJYCL^!d^?{clUnRX9ccPGbkJY+jX43x9bz+?M3ph(hW%~Qf-!3w8a=FQ3=?hym zkh@Zfflu`rArd-hKqa2ZdG!$!=Df`TQ+BnrO(drdlha?S#Ejsjn!RW&u(SW{HPYe1 z;~k-|_H=g$Z@7YZb&I9LDo|5B$y?a`Hp zEVPwo@75(Bsp|0gcZNm;amo;8^ijM5yhADBihENYb{AdW|HfHqF2`HU%5)D!*YLyijb!y|{3-5XWFrBb~B z=N>3Rhz5P?nbZFOb@c(Cz<+rB_y#~(z0w8v@17o2CVJ|>`YQM1(-zf4vL{xmZrK5A z%$5-@UdLK>E2LcaiHHXmlTId8>N;RO`M=2!|A8TjK}{i`3t3F0Y&mQ<$-**5yE0>* zQ;AA3f;UqsFB`ytqS86;4-njV?wIzW&+eAh$gXoYoDmsI>HU$?sQ92fO^eXp72mCH zktyelri0G`w`hI-|0?Dp&WGU>)ZKr8<`#h!P)At#1H_s~&7)ZKjT0-wm2$*sE{(v> zs*aA^XQ;PyjC)-6AjmTkuWw+5K!~ja|FU~`n(=(n)nkFbI8;Supe1h?;0pVp6(v1{ ziFkOy3QfOZuSiP>8JP9;NuxU!m;t$pxnuHtpWQD&y+}O7wi=K0*;oWZ;S~@Hq2Cli z#3RH{{9nC9`JI{v+ZFqYVu>Bs!FC&@W0;2%SEU%H3V;1PXO6{r-PtA@6>y}>U3tJ~ z>DTY^XQ$I`e`cUZ*5>_qmyJc zz%2Ojk01Z8e8_EVez?DwvdeiA++ug-$%saXp8x=H;-UYemoPr#>d!0bqFC7142Uh- miR;rfkuS2_aphO}sdp0<$`^{+xCZioQ4s#Y1_}RT@ZSIi%#Y6i literal 0 HcmV?d00001