SunSolve Internal

Infodoc ID   Synopsis   Date
14075   General SCSI FAQ/PSD   12 Jul 2000

Status Issued

Description Top


    

General SCSI FAQ/PSD

* SCSI Primer

* Which scsi patch do I need for Solaris 2.x?

* What patch fixes "esp0: bad sequence step (0x7) in selection"?

* What are the work arounds for using the DG raid box?

* Was the 2.1GB drive supported in 4.1.3?

* Are there any problems known to SCSI engineering regarding STK 3480

tape devices?

* At what revision was the Open Toolkit command probe-scsi-all added to

the system PROM's?

* How can I get more bytes of request sense data using auto-request

sense?

* Are there plans to merge esp/sd accounting?

* What kind of problems are encountered porting Solaris 2.3 sparc target

driver to 2.4 x86? Are there any changes on DDI/DKI for x86? Any

transition documentation exists?

* What is the recommended way to set initiator ids for a multi-initiator

scsi bus?

* How is the devices directory configured for 4.x? For 5.x?

* What are the advantages of synchronous over asynchronous SCSI? How can

one tell if a disk is running synchronous or not?

* Can I write a device driver in C++?

* Is there documentation available for the uscsi interface? Can I use it

targets other than disk/tape/CD-ROM?

* Why do we need scsi_reset_delay set to a high value (e.g. 10000)?

* Why do we always offer only 5MB/sec transfer rate during negotiation?

* Why do we sometimes not try for synchronous data transfer?

* How can I implement scatter-gather from a non-contiguous set of

descriptors of virtual memory buffers to the raw disk driver?

* What are the SCSI devices supported in Solaris?

* How is data integrity ensured on various components of a SCSI disk?

(memory, controller, disk, etc.)

* Are read/writes on SCSI device files interruptible?

* Do you support SCSI Processor Devices, or just the usual SCSI device

types like Direct-Access Devices (hard disks) and Sequential-Access

Devices (tape drives)?

* What is the version of the C compiler used to create sd,st,esp,isp?

* Are there any problems using C compiler 3.0.1 to compile scsi drivers?

_______________________________________________________________________________

SCSI Primer

_______________________________________________________________________________

(non-fast) fast fast/wide

================== ===================== =====================

SCSI-1/SCSI-2 SCSI-2 SCSI-2

<= 5MB/sec throughput <= 10MB/sec throughput <= 20 MB/sec

_______________________________________________________________________________

narrow wide

================== =====================

SCSI-1 SCSI-2 (?)

8-bit 16-bit

8 address lines 16 address lines

up to 8 devices, up to 16 devices,

id 0-6 targets, id 0-6 targets,

id 7 initiator id 7 initiator,

id 8-15 targets

50 pin "A" cable 68 pin "P" cable

In multi-initiator systems, the scsi id 6 is usually the second initiator,

as that has the second highest priority on both the narrow and wide buses.

_______________________________________________________________________________

Sun Default SCSI id's:

desktops: SS10 and older

0 - second disk drive (on old machines, the main boot disk) on desktop

machines this is "disk3" (OBP)

3 - main boot disk and in OBP, "disk0" and "disk"

servers and desktops SS20 and later:

0 - main boot disk OBP "disk" and "disk0"

both:

4,5 - tape drives

6 - cdrom

7 - initiator id

_______________________________________________________________________________

single-ended differential

================== =====================

SCSI-1/SCSI-2 SCSI-2

superior signal quality

<= 6m total cable length <= 25m total cable length

_______________________________________________________________________________

Any combination of narrow/wide with single-ended/differential

with non-fast/fast is possible.

Fast/wide combo yields up to 20MB/sec throughput.

_______________________________________________________________________________

Sun SBus host adapters

ESP Sport8 FSBE fast, narrow, single-ended

DSBE fast, narrow, differential

ISP Sport16 SWIS fast, wide, single-ended, "intelligent"

DWIS fast, wide, differential, "intelligent"

FAS366 Happy Meal TBD fast, wide, single-ended?, "semi-intelligent"

_______________________________________________________________________________

* Which scsi patch do I need for 2.x?

o Solaris 2.3

+ 101378-17 or greater (isp, esp, sd)

o Solaris 2.4

+ 102509-04 or greater (esp, isp)

+ 102329-03 (Fidelity point patch for st (fast/wide support.

Needs isp patch above))

+ 102035-01 (main line st - soft error reporting fix)

* What patch fixes "esp0: bad sequence step (0x7) in selection"?

This was fixed in 2.3

* What are the work arounds for using the DG raid box?

DG raid box has multiple logical unit (disks) per target. DG raid box

firmware seems to be unfair in handling the tagged io requests: it

returns QUEUE FULL for a lun because other luns took away all the

possible queue space (seem to be 100 in total). There may be zero

outstanding commands to the lun, still it reports QFULL status. The esp

driver does not expect to see queue full on a device with no commands

outstanding, and hence stops sending further requests to it thereby

leading to hangs.

The following workarounds can be used:

o Disable tag queuing, the problem will go away

o There is a patched version of DG disk firmware; it works around the

problem by reporting BUSY instead of QFULL; esp/sd drivers retry

after busy conditions, so this fixes the problem.

o Tune sd_max_throttle in sd driver in such a way that total number

of requests does not exceed 100 per target (i.e for all lun in

that target). For example, add the following in /etc/system:

set sd:sd_max_throttle=16

For DG raid with 6 luns this will work OK (6*16 = 96 < 100). We can

set sd_max_throttle=8 to support more luns.

* Was the 2.1GB drive supported in 4.1.3?

Yes, the 2.1GB drive is fully supported in a 4.1.3 system. The 2.9GB

drive is not officially supported, but it seems to work in 4.1.3. Note

that the filesystems are limited to 2GB size in 4.x. The new 9GB drive

is not supported and will not work in 4.x systems.

* Are there any problems known to SCSI engineering regarding STK 3480

tape devices?

There were problems with those drives because they were using implied

and not explicit restore data pointer messages which caused SCSI bus

resets. The patches listed above will have the fixes for Solaris 2.3

and 2.4. No patch is needed for Solaris 2.5 and later.

* At what revision was the Open Toolkit command probe-scsi-all added to

the system PROM's?

The command works on all SPARC 10s and later SPARC 2s. Not supported

until OpenBoot 2.6.

* How can I get more bytes of request sense data using auto-request sense?

Currently not supported. We may add a new capability for specifying the

sense length but note that some HBAs have built-in fixed sense length

(eg. isp).

* Are there plans to merge esp/sd accounting?

The kernel statistics in esp are far more accurate than in sd but

seriously affect performance. There are no plans to support kernel

statistics in HBAs.

* What kind of problems are encountered porting Solaris 2.3 sparc target

driver to 2.4 x86? Are there any changes on DDI/DKI for x86? Any

transition documentation exists ?

Refer to DDK CD-ROM which included the Writing Device Driver guide and

some sample drivers.

* What is the recommended way to set initiator ids for a multi-initiator

scsi bus?

If a SCSI bus is shared between two hosts, then one of the hosts need

to change its initiator id from the default value of 7. So, with one

host taking the default of 7, you may set the initiator id on other

host to 6. When the host id is different from 7, you will see a message

from the esp driver attach function when unix is booted up on a system.

....

SunOS Release 5.4 Version on494_prealpha8 [UNIX(R) System V Release 4.0]

Copyright (c) 1983-1993, Sun Microsystems, Inc.

esp1:initiator SCSI ID now 6

esp2:initiator SCSI ID now 6

configuring network interfaces: le0.

.....

1. Global change: Using openboot PROM

This is the simplest way of changing the id. You have to be in the

open boot prom prompt for making this change. The change will

remain intact until another change and will be effective across

system reboots and power on/off.

ok setenv scsi-initiator-id 6 - change it from 7 to 6

ok printenv - This will show you the list of prom

environment variables

Note:This will set the value to 6 for all the scsi buses in the

system.

2. Specific bus id change using openboot PROM

This is useful in certain cases, for example if you have CDROM

drive at id 6 in the first scsi bus. In this case you may want the

global setting to be 6 and then override the first bus id with the

value of 7.

ok show-devs

ok cd /sbus@1,f8000000/esp@0,800000

ok pwd

/sbus@1,f8000000/esp@0,800000

ok " /sbus@1,f8000000/esp@0,800000"

ok select-dev

ok 6 XDRINT " scsi-initiator-id" ATTRIBUTE /* for id 6 */

ok 7 XDRINT " scsi-initiator-id" ATTRIBUTE /* for id 7 */

ok

ok .attributes /* to verify the settings */

scsi-initiator-id 00000007

device_type scsi

clock-frequency 017d7840

intr 00000003 00000000

reg 00000000 00800000 00000040

name esp

interrupts 00000003

ok

Note: To effect a permanent change of the id for a particular scsi

port, you may have to put these commands in nvram (see nvedit

and nvstore words).

3. Global change: Using esp/isp.conf file

While booting the kernel, the esp and isp attach routines can set

the desired initiator ids based on the specification from the

corresponding driver.conf file.

To achieve a global change of initiator id to 6, for example, you

can include this line in /kernel/drv/esp.conf file

scsi-initiator-id = 6

Note: This change is effective only when unix takes control.

Earlier OBP may have had different settings as given in 1 and 2.

4. Specific bus id change using esp/isp.conf file. You can override

the value for a particular bus, say for example by adding the

following in esp.conf file:

name="esp" parent="/sbus@1,f8000000"

reg=0x0,0x800000,0x40

scsi-initiator-id=7;

Note: You have to specify the exact path name for parent and also

the reg details. The property value is effective only when there

is a unique match. You can obtain this info from "prntconf -v".

5. Recommendation:

Initiator id 6 does not work for SS1000. The cdrom is target 6 and

there are no target switches.

The isp/esp .conf files are not an option. There are

upgrade/install problems with this solution, because the

install/upgrade code will use initiator 7, since it does not know

to pick up the new .conf files.

So that brings us back to the OBP methods of changing the

initiator id's.

SS1000 - set one machine at 4 and the other at 7.

SS2000 - set one machine at 6 and the other at 7.

move the tape to 4 and the the cdrom to 5

make sure all other disks are between 0-5.

I think it is simpler to set the scsi-initiator-id OBP environment

variable and not mess with the /devices properties.

* How is the devices directory configured for 4.x? For 5.x?

In 5.x, there are 2 device directories:

o /devices - contain the physical device name found in the device

tree.

o /dev - these are logical devices, actually just links to physical

devices

The devices in these directories are configured at boot time, when you

type 'boot -r' at the Open Boot prompt. This will start the re-creation

of the device tree and the configuration of the /devices and /dev

directories is done automatically.

In 4.x, there is no device trees and the physical devices are stored in

/dev.

The configuration file /sys/sun4m/conf/GENERIC (or the name of your

kernel configuration file) have to be modified to add the new device,

and the kernel have to be recompiled. There is no 'boot -r' under 4.x.

* What are the advantages of synchronous over asynchronous SCSI? How can

one tell if a disk is running synchronous or not?

In async scsi, each byte is requested/acknowledged before the next byte

is transferred. This results in slower transfer rates especially over

long scsi cables where propagations delays may be significant.

In sync scsi, initiator-target negotiate a data-transfer rate and an

offset between request/ACK. The offset allows several outstanding REQS

and bytes may be sent before ACKs are received, up to the offset

specified. Hence, this may lead to higher tranfer-rate. Also, fast scsi

option is also negotiated during synchronous negotiation. Most drives

these days support synchronous mode.

To find out if the disk is running sync or async (without kadb or a

scsi analyzer), use 'prtconf -v' and look for the properties:

name length <0> -- .

name length <0> -- .

name length <4>

The value of the sync-speed property is the current xfer rate in KB.

If the target is async, there is not sync-speed property.

* Can I write a device driver in C++?

You may be able to, but it isn't supported. For one thing, the system

header files are not guaranteed to work with both __cplusplus and

_KERNEL set.

Another reason is that unlike C, C++ requires significant runtime

support. Object constructors and destructors... object

initialization... This must come from somewhere and libC isn't

available in the kernel. You can avoid this requirement by avoiding

most uses of objects, but if you do that, why use C++ at all?

* Is there documentation available for the uscsi interface? Can I use it

targets other than disk/tape/CD-ROM?

Yes, look at /usr/include/sys/scsi/impl/uscsi.h for details on

uscsi_cmd struct. There is also a man page on uscsi available upon

request.

A user application can send SCSI commands to a target using the USCSI

ioctl interface. It is an undocumented and unsupported interface and it

will probably stay that way -- however, it should not go away in the near

future, since some of our internal applications also use it.

If, however, the target is not a disk/cdrom, but some robot or other

SCSI target, the sd driver may not recognize that device. In that case,

I would recommend you to use one of our sample drivers (bst.c/sst.c -

provided in Driver Writing Kit) and suitably tailor the xx_attach()

routine in that driver to recognize that kind of device.

* Why do we need scsi_reset_delay set to a high value (e.g. 10000)?

The scsi_reset_delay is an option that can be set through /etc/system,

very much like the more known scsi_options entry:

set scsi_reset_delay=10000

scsi_reset_delay of 10000 ms is required for some crummy old cdroms

that are inaccessible for a long time after a bus reset. Normally that

is not fatal but when the CDROM is the boot device, it probably is.

* Why do we always offer only 5MB/sec transfer rate during negotiation?

The host adapter negotiates the transfer rate with a target. There is

the possibility that the target can only do 5MB/s. But it is also

possible that you don't have a scsi host adapter capable of doing fast

scsi, the FAS based controllers negotiate 10MB/s. The SS5, SS10, FSBE,

and DSBE have FAS based controllers and support fast scsi.

One less likely factor is that you have scsi_options set to an

incorrect value -- make sure the options sync and fast are set (0x3f8

enables all scsi options).

* Why do we sometimes not try for synchronous data transfer?

All currently supported host adapters negotiate for synchronous data

transfer. The two most common situations where synchronous data

transfer are not enabled are: during boot time and when the bus is so

noisy that the SCSI bus only works reliably if we back down to

asynchronous mode.

There are two more remote possibilities: one that the disk doesn't

support synchronous data transfer (very unlikely these days), and the

other possibility is that scsi_options is set to an incorrect value

(0x3f8 enables all scsi options).

* How can I implement scatter-gather from a non-contiguous set of

descriptors of virtual memory buffers to the raw disk driver?

There are some problems getting the stuff done on Solaris. First it

might be easy on LynxOS. You take the scatter gather list and 'feed' it

into the DMA chip. If the DMA chip supports chaining, you are done. You

get one interrupt once the whole list is xferred. On Solaris/SPARC we

have some problems:

1. There is no interface for SCSA/DDI that allows you to pass in

pieces of memory which are discontiguous in the virtual address

range. Something like scsi_init_pkt for uio(9S) structures or

ddi_dma_uio_setup might help.

2. Or SPARC SCSI hbas can deal with memory xfers where the IO mapping

is contiguous. What we need here is something like the

ddi_dma_nextwin/ddi_dma_nextseg support in the SCSI hba. The DDI

could send the segment list to the hba and the hba would walk the

whole list and callback once the whole list is xferred. It would

be like we handle DMA windows right now but without having the

requirement of having a contiguous I/O mapping.

3. To solve 2, the DDI has to map the scatter-gather list in some

contiguous I/O mapping to express it by a tuple. Now this can only

be done if the buffers in the scatter-gather list are page-aligned

and cover a whole page. The first buffer could start anywhere

within a page but must end at a page boundary, all middle buffers

must start and end at a page boundary, and the last buffer has to

start at a page boundary but can end anywhere within a page. So

without having the correct layout of the buffers, it's impossible

to setup just *one* I/O mapping.

To summarize: We need 1. We need also 3. 2 is pretty easy because

the nextwin/nextseg support is already in the DDI code.

* What are the SCSI devices supported in Solaris?

The answer here is a summary of the SCSI Handbook which provides a more

detailed answer. The SCSI Handbook has complete matrices of

chips/HBAs/platforms/OS version/devices supported.

Table 1: Chips used in Sun SCSI products

Chips Platforms

-------------------------------------------------------

ESP100, 53C90 SS1, SS1+, IPC

ESP100A, 53C90A SS2, IPX, Sport8

ESP236 Galaxy, SBE

FAS101, MACIO Classic, LX, SS10, SS20, and SS5

FAS236 Galaxy, DSBE, FSBE

ISP1000 DWIS, SWIS

Table 2: Platforms and their motherboard SCSI chips

Platform Chip Transfer Active termination

name rate (MB/s) required?

----------------------------------------------------------------------

1 SE1E (4/e) 53C90 5 no

2 Classic (4/15) MACIO 10 yes

3 SLC (4/20) 53C90A 5 no

4 ELC (4/25) 53C90 5 no

5 LX (4/30) MACIO 10 yes

6 IPC (4/40) 53C90A 5 no

7 IPX (4/50) 53C90A 5 no

8 SS1 (4/60) 53C90 5 no

9 SS1+ (4/65) 53C90A 5 no

10 SS2 (4/75) 53C90A 5 no

11 SS10 (4/80) MACIO 10 yes

12 SS10SX (4/80SX) FAS236 10 yes

13 SparcServer630 FAS236 10 yes

14 SparcServer670 FAS236 10 yes

15 SparcServer690 FAS236 10 yes

16 SS5 MACIO 10 yes

17 SS20 MACIO 10 yes

18 SS1000 FAS236 10 yes

19 SS2000 * no motherboard SCSI

Table 3: Sbus HBA cards and supported platforms

HBA Chip Transfer Platforms

rate (MB/s)

----------------------------------------------------------------------

SSHA (Sport8) 53C90A 5 IPC, IPX, SS1, SS1+, SS2,

Classic, LX, SS10, SS10SX,

SS5, SS20.

SBE ESP236 5 SS10, SS10SX, SS20,

SparcServer6X0, SS1000.

FSBE FAS236 10 IPC, IPX, SS1, SS1+, SS2,

Classic, LX, SS10, SS10SX,

SS5, SS20, SparcServer6X0,

SS1000, SC2000.

DSBE FAS236 10 SS10, SS10SX, SS5, SS20,

SparcServer6X0, SS1000,

SC2000

DWIS ISP1000 20 (wide) SS1000, SC2000

SWIS ISP1000 20 (wide) SS1000

4.x support

o FAS101 on motherboard (early SS10) supported in 4.1.3 and above

o MACIO (FAS101) on motherboard supported in 4.1.4 and above

o FAS236 on motherboard supported in 4.1.2 and above

o SSHA supported in 4.0.3 and above

o SBE supported in 4.1.2 and above

o FSBE and DSBE supported in 4.1.3 and above

o 4.x doesn't support SS1000 and SC2000 servers.

5.x support

o FAS101 on motherboard (early SS10) supported in 2.1 and above

o MACIO (FAS101) on Classic/LX motherboard supported in 2.1 and above

o MACIO (FAS101) on on all other platforms supported in 2.3 (E2 with

supplement B) and above

o FAS236 on motherboard supported in 2.2 and above

o SSHA supported in 2.0 and above

o SBE supported in 2.0 and above

o FSBE and DSBE supported in 2.0 and above

o DWIS supported in 2.3 and above

o SWIS supported in 2.3 E3 and above

* How is data integrity ensured on various components of a SCSI disk?

(memory, controller, disk, etc.)

First of all, SCSI drivers don't do any data checking while transferring

data. SCSI hardware provides Parity checking. Here, some type of ECC is

used to store data on SCSI device and the SCSI bus uses a parity bit.

However, one can install additional pseudo-drivers like Online

DiskSuite or Veritas RAID software, which will try to make mirrors, or

encode the ECC into the RAID system. Basically, these software modules

sit between our SCSI drivers and the OS (which sends io requests) and

tries to do fault tolerance via diff mechanisms like mirroring or

RAID-5 ... In that case, SCSI drivers get additional requests for

mirrored data or ECC data to be written to disks.

The most valuable aspect is that Sun qualifies SCSI devices to ensure

that the sequence between the REQ/ACK handshakes meet SCSI

specification requirements.

* Are read/writes on SCSI device files interruptible?

No, the scsi disk and tape operations are not interruptible unlike the

tty operations. The application (for example tar, dd etc..) would

receive the ^C and other signals and might stop issuing further

read/write requests to scsi drivers.

* Do you support SCSI Processor Devices, or just the usual SCSI device

types like Direct-Access Devices (hard disks) and Sequential-Access

Devices (tape drives)?

Sun scsi drivers include support for direct access devices (disks),

sequential devices (tapes) and CDROM devices. There is no direct

support for processor devices

* What is the version of the C compiler used to create sd,st,esp,isp? Are

there any problems using C compiler 3.0.1 to compile scsi drivers?

SunPro 2.0.1. This is because the later compiler optimizations are too

aggressive and toss structures/variables that are not used directly by

the source code, but are used by hardware of the machine.

Applies To Hardware
Attachments (none)

Top

SunWeb Home SunWeb Search SunSolve Home Simple Search

Sun Proprietary/Confidential: Internal Use Only
Feedback to SunSolve Team