SCSI Inquiry Data

2.8k Views Asked by At

I am new to SCSI Programming and hence sorry for asking basic question. I sent SCSI Inquiry command to a Tape Device through 6 byte CDB

ccb = (Exec_IO_CCB *)( buffer + header_size );

ccb->ccb_length = sizeof(Exec_IO_CCB);

ccb->cam_opcode = 0x1;

ccb->connect_id = 0;

ccb->sense_buf_ptr = (long)(header_size + ccb->ccb_length);

ccb->sense_buf_length = MAX_SENSE_LEN;

ccb->time_out = CAM_TIMEOUT;

ccb->cdb_length = 6;

/* For INQUIRY sets cam_flags and cdb[0] */

ccb->cam_flags = NO_DATA;

ccb->cdb[0] = INQUIRY; /* 0x12 SCSI Opcode for Inquiry Command */

ccb->cdb[1] = 0;

ccb->cdb[2] = 0;

ccb->cdb[3] = 0;

ccb->cdb[4] = 3200;

ccb->cdb[5] = 0;

The SCSI Command is successful . How do i capture the output of INQUIRY command so that i can get Vendor ID / Product ID ??

I have declared the Execute I/O SCSI buffer as follows

typedef struct {

long        ccb_address;            /* Address of this CCB               */
short       ccb_length;             /* CAM Control Block Length          */
char        cam_opcode;             /* CAM Operation Code                */
char        status;                 /* CAM Status                        */
long        connect_id;             /* Connect ID - no fields supported  */
long        cam_flags;              /* CAM Flags                         */
long        pd_pointer;             /* Peripheral driver pointer         */
long        next_ccb_ptr;           /* Next CCB Pointer                  */
long        req_map_info;           /* Request mapping information       */
long        call_on_comp;           /* Callback on completion            */
long        data_buf_ptr;           /* Data Buffer Pointer               */
long        data_xfer_length;       /* Data transfer length              */
long        sense_buf_ptr;          /* Sense information buffer pointer  */
char        sense_buf_length;       /* Sense information buffer length   */
char        cdb_length;             /* Command Descriptor Block (CDB)    **
                                    **  length                           */
short       num_sg_entries;         /* Number of scatter/gather entries  */
long        vendor_unique;          /* Vendor Unique field               */
char        scsi_status;            /* SCSI status                       */
char        auto_resid;             /* Auto sense residual length        */
short       reserved;               /* Reserved                          */
long        resid_length;           /* Residual length                   */
char        cdb[12];                /* Command Descriptor Block (CDB)    */
long        time_out;               /* Time-out value                    */
long        msg_buf_ptr;            /* Message buffer pointer            */
short       msg_buf_length;         /* Message buffer length             */
short       vu_flags;               /* Vendor-unique flags               */
char        tag_queue_act;          /* Tagged Queue action               */
char        tag_id;                 /* Tag ID (target only)              */
char        init_id;                /* Initiator ID (target only)        */
char        reserved2;              /* Reserved                          */

} Exec_IO_CCB;

This structure will never capture SCSI Output ?

I have declared the Inquiry Structure as follows . But I am not sure how Inquire command will populate Inquiry_Data structure data ??

typedef struct {

short data_valid;           /* Flag that indicates whether or not the */
                            /*   structure has been filled in with    */
                            /*   inquiry data from the device.        */
byte  periph_qual;
byte  periph_dev_type;
byte  rmb;
byte  iso_version;
byte  ecma_version;
byte  ansi_version;
byte  resp_data_format;
byte  rel_adr;
byte  sync;
byte  linked;
byte  cmd_que;
byte  sft_rst;
char  vendor_id[9];
char  prod_id[17];
char  prod_rev[5];
char  reserved;

} Inquiry_Data;

1

There are 1 best solutions below

3
On

The first thing that you have assigned a short to cdb[4], but cdb[4] is a byte. The assignment probably put a 0 there since the compiler would truncate. Since bytes 3 and 4 are the allocation length you have told the target not to send anything. Maybe you ment to assign 32 to cdb[4]; but since your Inquiry_Data structure is 44 bytes you probably want to assign 44 to cdb[4].