www.pudn.com > ScriptsSample.zip > SSCSI.H


/*--------------------------------------------------*/ 
/*                                                  */ 
/* Module SSCSI.H                                   */ 
/*                                                  */ 
/* SCSI utility routines for Symbios 53C8XX.        */ 
/*                                                  */ 
/* Adapted from Symbios Logic                       */ 
/*    Software Development Kit                      */ 
/*                                                  */ 
/* Project: A Programmer's Guide to SCSI            */ 
/* Copyright (C) 1997, Brian Sawert.                */ 
/* All rights reserved.                             */ 
/*                                                  */ 
/*--------------------------------------------------*/ 
 
 
#ifndef _SSCSI_H 
#define _SSCSI_H 
 
 
/*---------- constant definitions ----------*/ 
 
#define DEF_TIMEOUT           5 
 
// SCSI command definitions 
#define CMD_TEST_UNIT_READY   0x00 
#define CMD_REQUEST_SENSE     0x03 
#define CMD_READ_6            0x08 
#define CMD_INQUIRY           0x12 
#define CMD_READ_CAPACITY     0x25 
 
// SCSI status definitions 
#define STAT_GOOD             0x00 
#define STAT_CHECK_CONDITION  0x02 
#define STAT_BUSY             0x08 
 
// return codes 
enum {ERR_SUCCESS = 0, ERR_SELECT, ERR_SENSE, 
   ERR_TIMEOUT, ERR_OTHER}; 
 
// SCRIPTS table entry definition 
typedef struct { 
   DWORD count;               // byte count 
   DWORD address;             // physical address 
} table_entry; 
 
// SCSI device information 
typedef struct { 
	BYTE targ_id;              // target SCSI ID 
   BYTE dev_type;             // device type 
   DWORD blocks;              // number of blocks 
	WORD blk_size;             // block size 
} scsi_device; 
 
 
/*---------- macro definitions ----------*/ 
 
/*---------- global variables ----------*/ 
 
extern BYTE stat_buf;         // status byte 
extern BYTE datain_buf[];     // data in buffer 
extern BYTE block_buf[];      // block read buffer 
extern BYTE sense_buf[];      // sense data buffer 
extern BYTE sense_key;        // sense data 
extern BYTE sense_asc; 
extern BYTE sense_ascq; 
 
 
/*---------- function declarations ----------*/ 
 
// allocate aligned buffers 
extern DWORD *alloc_buffer(WORD size); 
 
// poll for SCRIPTS completion 
extern int poll_istat(DWORD io_base, DWORD *vector, 
   BYTE *dstat, BYTE *istat, WORD *sist); 
 
// set up script and data buffers 
extern int init_buffers(void); 
 
// check status and sense data 
extern int check_status(pci_device *ppcidev, 
   scsi_device *pscsidev); 
 
// execute Test Unit Ready command 
extern int test_unit_ready(pci_device *ppcidev, 
   scsi_device *pscsidev); 
 
// execute Request Sense command 
extern int request_sense(pci_device *ppcidev, 
   scsi_device *pscsidev); 
 
// execute Inquiry command 
extern int device_inquiry(pci_device *ppcidev, 
   scsi_device *pscsidev); 
 
// execute Read Capacity command 
extern int read_capacity(pci_device *ppcidev, 
   scsi_device *pscsidev); 
 
// execute Read 6 command 
extern int read_block(pci_device *ppcidev, 
   scsi_device *pscsidev, DWORD blk_num, BYTE nblocks); 
 
 
#endif