AmendHub

Download:

akuker

/

scsi_test

/

amendments

/

1

Initial Commit


akuker made amendment 1 over 2 years ago
--- DoListSCSIDevices.c Sun Aug 21 20:30:09 2022 +++ DoListSCSIDevices.c Sun Aug 21 20:30:09 2022 @@ -0,0 +1,192 @@ +/* DoListSCSIDevices.c */ +/* + * DoListSCSIDevices.c + * Copyright © 1992-94 Apple Computer Inc. All Rights Reserved. + * + * Find all SCSI devices. The alogrithm first asks the SCSI Manager for the + * number of busses, then loops through each bus for each device and LUN. + * old SCSI Manager. This is made complex by the flexible SCSI Manager 4.3 + * architecture: it is possible for the asynchronous SCSI Manager to only + * be available on a third-party bus interface, for example. Because of this, + * we must always scan the bus using the original SCSI Manager even if the + * asynchronous manager is present. + */ +//#include "SCSISimpleSample.h" + + + + +/* + * These definitions are only for the code files. + */ +#ifndef THINK_C /* MPW includes */ +#include <Errors.h> +#include <Script.h> +#include <Types.h> +#include <Resources.h> +#include <QuickDraw.h> +#include <Fonts.h> +#include <Events.h> +#include <Windows.h> +#include <ToolUtils.h> +#include <Memory.h> +#include <Menus.h> +#include <Lists.h> +#include <Printing.h> +#include <Dialogs.h> +#include <Packages.h> +#endif + + + +#include "scsi_test.h" +#include "MacSCSICommand.h" +//#include "LogManager.h" + +void +DoListSCSIDevices(void) +{ + OSErr status; + unsigned short lastHostBus; + unsigned short initiatorID; + unsigned short bus; + unsigned short targetID; + unsigned short LUN; + DeviceIdent scsiDevice; + SCSIGetVirtualIDInfoPB scsiGetVirtualIDInfo; + short deviceCount; + unsigned short maxTarget; + Boolean useAsynchManager; + Str255 work; + + LOG("\pList all SCSI Devices"); + deviceCount = 0; + /* + * If we have the asynchronous SCSI Manager, find out how many busses + * are present on this system. If not, force a "single bus" scan, since + * DoSCSICommandWithSense ignores the hostBus information if it is + * forced into "old-style" calls. + */ + if (gEnableNewSCSIManager) + status = SCSIGetHighHostBusAdaptor(&lastHostBus); + else { + status = noErr; + lastHostBus = 0; /* Force one bus only */ + } + if (status == noErr) { + for (bus = 0; bus <= lastHostBus; bus++) { + /* + * Look at this SCSI bus. This would be a good place to allocate + * the SCSIExecIO command block. In this sample, however, it's + * allocated on each call to AsyncSCSI, though this is inefficient. + * Note that it is possible to have busses with no devices. This + * is true for Apple Macintosh models with two busses (such as + * the Quadra 950 and PowerMac 8100). Also, if you install a + * third-party bus adaptor that supports the asynchronous SCSI + * Manager on a machine with two busses, it would be assigned + * bus 2 (with busses 0 and 1 referencing the internal system + * busses). In this case, a system could have no devices on bus + * 0 or 1. + */ + *((long *) &scsiDevice) = 0; + scsiDevice.bus = bus; + /* + * Check whether we can access this scsi device. SCSIBusAPI will + * return an error status if this bus is inaccessable (i.e. no bus + * or other trouble). If it returns noErr, useAsyncManager will + * be TRUE if the asynchronous SCSI Manager is supported for this + * bus, and FALSE if it can only be accessed through the original + * SCSI Manager. This would indicate that a third-party bus + * interface patched the original SCSI Manager traps (i.e., + * patched SCSIGet, SCSISelect, etc). + */ + status = SCSIBusAPI(scsiDevice, &useAsynchManager); + if (status == noErr) { + if (useAsynchManager) + status = SCSIGetInitiatorID(scsiDevice, &initiatorID); + else { + initiatorID = 7; /* Asynch manager is disabled */ + } + } + if (status != noErr) + continue; + /* + * SCSIGetInitiatorID returned the bus ID of the Macintosh. This + * is almost always seven, but only the SCSI Manager knows for + * sure. Note that, by getting the Macintosh bus ID dynamically, + * we prepare the code for a future system that permitted more + * than one Macintosh on the same SCSI bus. + */ + status = SCSIGetMaxTargetID(scsiDevice, &maxTarget); + for (targetID = 0; targetID <= maxTarget; targetID++) { + if (targetID != initiatorID) { + scsiDevice.targetID = targetID; + for (LUN = 0; LUN <= gMaxLogicalUnit; LUN++) { + /* + * Try to send a command to this LUN. If it fails, + * don't try for higher-valued LUNs. + * SCSICheckForDevicePresent looks, carefully, at the + * returned error to distinguish between missing + * devices and devices that are present, but unable to + * respond, such as CD-ROM players with no disk + * inserted. This call to SCSICheckForDevicePresent + * will use the asynchronous SCSI Manager if it can. + * + * Note that, if the asynchronous manager is not + * available, we can still check for non-zero LUNs by + * using the old method of stuffing the LUN into the + * command block, however this is not supported in + * this example. + */ + scsiDevice.LUN = LUN; + if (SCSICheckForDevicePresent( + scsiDevice, useAsynchManager) == FALSE) + break; /* Don't look for LUNs */ + else { + ++deviceCount; /* Found a device */ + DoGetDriveInfo(scsiDevice, TRUE, useAsynchManager); + } /* Check status */ + } /* LUN loop */ + } /* Not the initiator id */ + } /* Target loop */ + } /* Bus loop */ + /* + * Now, we need to look at the hard-wired SCSI drive addresses and + * check whether a third-party hardware interface that does not use + * the asynchronous SCSI Manager recognizes this address. If + * gEnableNewSCSIManager is FALSE, the above loop called the original + * SCSI Manager, so we don't have to try it again. In this sequence, + * we hard-wire the initiator ID to seven, as there is no supported + * way to determine it from the SCSI Manager or operating system. + */ + if (gEnableNewSCSIManager) { + scsiDevice.bus = 0; + for (targetID = 0; targetID <= 6; targetID++) { + CLEAR(scsiGetVirtualIDInfo); + scsiGetVirtualIDInfo.scsiPBLength = sizeof scsiGetVirtualIDInfo; + scsiGetVirtualIDInfo.scsiOldCallID = targetID; + status = SCSIAction((SCSI_PB *) &scsiGetVirtualIDInfo); + if (status != noErr) { + /* + * The asynchronous SCSI Manager does not know about this + * target ID. Check whether it exists (forcing the request + * to use the original SCSI Manager). + */ + scsiDevice.targetID = targetID; + for (LUN = 0; LUN <= gMaxLogicalUnit; LUN++) { + scsiDevice.LUN = LUN; + if (SCSICheckForDevicePresent(scsiDevice, FALSE) == FALSE) + break; /* Don't look for LUNs */ + else { + ++deviceCount; /* Found a device */ + DoGetDriveInfo(scsiDevice, TRUE, FALSE); + } /* Check status */ + } + } + } + } + } /* Found a host adaptor */ + NumToString(deviceCount, work); + AppendPascalString(work, "\p SCSI Devices"); + LOG(work); +}