| 1 |
/* |
| 2 |
File: SCSIFindDevices.h |
| 3 |
|
| 4 |
Contains: Include the O.S. files in a specific order to make sure that we have |
| 5 |
a definition for the _SCSIAtomic trap. |
| 6 |
|
| 7 |
Written by: |
| 8 |
|
| 9 |
Copyright: Copyright © 1992-1999 by Apple Computer, Inc., All Rights Reserved. |
| 10 |
|
| 11 |
You may incorporate this Apple sample source code into your program(s) without |
| 12 |
restriction. This Apple sample source code has been provided "AS IS" and the |
| 13 |
responsibility for its operation is yours. You are not permitted to redistribute |
| 14 |
this Apple sample source code as "Apple sample source code" after having made |
| 15 |
changes. If you're going to re-distribute the source, we require that you make |
| 16 |
it clear in the source that the code was descended from Apple sample source |
| 17 |
code, but that you've made changes. |
| 18 |
|
| 19 |
Change History (most recent first): |
| 20 |
7/14/1999 Karl Groethe Updated for Metrowerks Codewarror Pro 2.1 |
| 21 |
|
| 22 |
|
| 23 |
*/ |
| 24 |
#include <Traps.h> |
| 25 |
#ifndef _SCSIAtomic |
| 26 |
#define _SCSIAtomic 0xA089 |
| 27 |
#endif |
| 28 |
/* |
| 29 |
* This uses the new "common" SCSI.h which is not yet in the public |
| 30 |
* header folders. |
| 31 |
*/ |
| 32 |
#include "SCSI.h" |
| 33 |
|
| 34 |
/* |
| 35 |
* This is a parameter block for SCSIFindNextDevice that contains the data shared |
| 36 |
* with the calling program and the internal state that the function needs to |
| 37 |
* sequence between each device. If SCSIFindNextDevice succeeds, the device |
| 38 |
* inquiry data is stored in the record. |
| 39 |
*/ |
| 40 |
struct SCSIFindDevicesRec { |
| 41 |
/* Public variables */ |
| 42 |
DeviceIdent deviceID; /* <-> Bus/target/LUN */ |
| 43 |
short maxLUN; /* -> Maximum logical units */ |
| 44 |
Boolean isAsyncSCSIPresent; /* <- TRUE if SCSI Manager 4.3 */ |
| 45 |
long refNum; /* Reserved for the caller */ |
| 46 |
long actualInquirySize; /* <- data length in inquiry */ |
| 47 |
struct SCSI_Inquiry_Data { /* <- Inquiry returns this */ |
| 48 |
unsigned char devType; /* 0 Device type, */ |
| 49 |
unsigned char devTypeMod; /* 1 Device type modifier */ |
| 50 |
unsigned char version; /* 2 ISO/ECMA/ANSI version */ |
| 51 |
unsigned char format; /* 3 Response data format */ |
| 52 |
unsigned char length; /* 4 Additional Length */ |
| 53 |
unsigned char reserved5; /* 5 Reserved */ |
| 54 |
unsigned char reserved6; /* 6 Reserved */ |
| 55 |
unsigned char flags; /* 7 Capability flags */ |
| 56 |
unsigned char vendor[8]; /* 8-15 Vendor-specific */ |
| 57 |
unsigned char product[16]; /* 16-31 Product id */ |
| 58 |
unsigned char revision[4]; /* 32-35 Product revision */ |
| 59 |
unsigned char vendorSpecific[20]; /* 36-55 Vendor stuff */ |
| 60 |
unsigned char moreReserved[40]; /* 56-95 Reserved */ |
| 61 |
} inquiry; |
| 62 |
/* Private variables */ |
| 63 |
short state; /* Control overall operation */ |
| 64 |
unsigned short lastHostBus; /* Host bus iteration limit */ |
| 65 |
Boolean useAsynchSCSI; /* Is asynch ok on this bus? */ |
| 66 |
unsigned short initiatorID; /* Host processor bus ID */ |
| 67 |
unsigned short maxTargetID; /* Max target on this bus */ |
| 68 |
short maxBusLUN; /* Max LUN on this bus */ |
| 69 |
Boolean enableATN; /* Select with ATN on this bus? */ |
| 70 |
unsigned long execIOPBSize; /* SCSIAction pb size */ |
| 71 |
SCSIExecIOPB *scsiExecIOPB; /* Set on bus-by-bus basis */ |
| 72 |
}; |
| 73 |
typedef struct SCSIFindDevicesRec SCSIFindDevicesRec, *SCSIFindDevicesPtr; |
| 74 |
/* |
| 75 |
* Notes on the above: |
| 76 |
* Public variables: |
| 77 |
* deviceID This is the current SCSI device. If deviceID.bus == 0xFF |
| 78 |
* SCSIFindNextDevice will initialize itself. |
| 79 |
* maxLUN Set to zero to ignore logical units or seven to test |
| 80 |
* all targets for multiple logical units. Beware: some |
| 81 |
* devices fail miserably if a non-zero logical unit is |
| 82 |
* selected. |
| 83 |
* isAsyncSCSIPresent Set TRUE after the first call to SCSIFindNextDevice if |
| 84 |
* the asynchronous SCSI Manager (SCSI Manager 4.3) is |
| 85 |
* running. |
| 86 |
* actualInquirySize If the function succeeds, it returns the Device Inquiry |
| 87 |
* information in the inquiry field. actualInquirySize |
| 88 |
* is the length of the data that was returned. |
| 89 |
* inquiry This is the device information returned on success. |
| 90 |
* Private variables: |
| 91 |
* state This manages the overall code flow in the subroutine. |
| 92 |
* lastHostBus The highest host bus on this system (if asynch present) |
| 93 |
* useAsynchSCSI TRUE if the asynchronous SCSI Manager works on this bus |
| 94 |
* initiatorID The bus ID of the Macintosh. Normally 7 |
| 95 |
* maxTargetID The maximum target bus ID on this host bus. |
| 96 |
* enableATN Enable "select with attention" if set. This works around |
| 97 |
* a bug on un-patched Quadra 660-av and 840-av systems. |
| 98 |
* execIOPBSize The size of the SCSI parameter block. |
| 99 |
* scsiExecIOPB A pointer to the SCSI parameter block. |
| 100 |
*/ |
| 101 |
|
| 102 |
/* |
| 103 |
* SCSIFindNextDevice: |
| 104 |
* Scan the SCSI bus(es) for the next device. This will scan all buses, all |
| 105 |
* targets, and all logical units in order. To initialize, set deviceID.bus to |
| 106 |
* 0xFF and maxLUN to zero or seven as needed. |
| 107 |
* SCSIFindNextDevice allocates memory. |
| 108 |
* |
| 109 |
* Return: |
| 110 |
* noErr The deviceID field contains the next SCSI device and |
| 111 |
* the inquiry structure contains device-specific information. |
| 112 |
* eofErr The last device has been found. This is a normal status. |
| 113 |
* other errors Something horrible happened, such as a memory error. |
| 114 |
* (If your application calls SCSIFindNextDevice after any |
| 115 |
* error status, it will start from the beginning.) |
| 116 |
*/ |
| 117 |
OSErr SCSIFindNextDevice( |
| 118 |
SCSIFindDevicesPtr scsiFindDevicesPtr |
| 119 |
); |