SCSI_PROBE(9F)          Kernel Functions for Drivers          SCSI_PROBE(9F)
NAME
       scsi_probe - utility for probing a scsi device
SYNOPSIS
       #include <sys/scsi/scsi.h>       
int scsi_probe(
struct scsi_device *devp, 
int (*waitfunc);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI).
PARAMETERS
       devp                    Pointer to a 
scsi_device(9S) structure       
waitfunc                    NULL_FUNC or 
SLEEP_FUNCDESCRIPTION
       scsi_probe() determines whether a 
target/lun is present and sets up
       the 
scsi_device structure with inquiry data.       
scsi_probe() uses the SCSI Inquiry command to test if the device
       exists.  It can retry the Inquiry command as appropriate. If       
scsi_probe() is successful, it will allocate space for the       
scsi_inquiry structure and assign the address to the 
sd_inq member of
       the 
scsi_device(9S) structure. 
scsi_probe() will then fill in this       
scsi_inquiry(9S) structure and return 
SCSIPROBE_EXISTS. If       
scsi_probe() is unsuccessful, it returns 
SCSIPROBE_NOMEM in spite of
       callback set to 
SLEEP_FUNC.       
scsi_unprobe(9F) is used to undo the effect of 
scsi_probe().
       If the target is a non-CCS device, 
SCSIPROBE_NONCCS will be returned.       
waitfunc indicates what the allocator routines should do when
       resources are not available; the valid values are:       
NULL_FUNC                      Do not wait for resources. Return 
SCSIPROBE_NOMEM or                      
SCSIPROBE_FAILURE       SLEEP_FUNC                      Wait indefinitely for resources.
RETURN VALUES
       scsi_probe() returns:       
SCSIPROBE_BUSY                              Device exists but is currently busy.       
SCSIPROBE_EXISTS                              Device exists and inquiry data is valid.       
SCSIPROBE_FAILURE                              Polled command failure.       
SCSIPROBE_NOMEM                              No space available for structures.       
SCSIPROBE_NOMEM_CB                              No space available for structures but callback
                              request has been queued.       
SCSIPROBE_NONCCS                              Device exists but inquiry data is not valid.       
SCSIPROBE_NORESP                              Device does not respond to an INQUIRY.
CONTEXT
       scsi_probe() is normally called from the target driver's 
probe(9E) or       
attach(9E) routine. In any case, this routine should not be called
       from interrupt context, because it can sleep waiting for memory to be
       allocated.
EXAMPLES
       Example 1: Using scsi_probe()
             switch (scsi_probe(devp, NULL_FUNC)) {
             default:
             case SCSIPROBE_NORESP:
             case SCSIPROBE_NONCCS:
             case SCSIPROBE_NOMEM:
             case SCSIPROBE_FAILURE:
             case SCSIPROBE_BUSY:
                     break;
             case SCSIPROBE_EXISTS:
                     switch (devp->sd_inq->inq_dtype) {
                     case DTYPE_DIRECT:
                             rval = DDI_PROBE_SUCCESS;
                             break;
                     case DTYPE_RODIRECT:
                             rval = DDI_PROBE_SUCCESS;
                             break;
                     case DTYPE_NOTPRESENT:
                     default:
                             break;
                     }
             }
             scsi_unprobe(devp);
SEE ALSO
       attach(9E), 
probe(9E), 
scsi_slave(9F), 
scsi_unprobe(9F),       
scsi_unslave(9F), 
scsi_device(9S), 
scsi_inquiry(9S)       ANSI Small Computer System Interface-2 (SCSI-2)       Writing Device DriversNOTES
       A 
waitfunc function other than 
NULL_FUNC or 
SLEEP_FUNC is not
       supported and may have unexpected results.
                              February 26, 2002               SCSI_PROBE(9F)