Pārlūkot izejas kodu

Use the LUN provided in IDENTIFY messages in preference to the CDB.

This fixes extra LUNS being seen by VMS.
Michael McMaster 11 gadi atpakaļ
vecāks
revīzija
36c758aa37

+ 3 - 0
lib/SCSI2SD/CHANGELOG

@@ -1,3 +1,6 @@
+201407XX		3.6
+	- Fix handling requests for LUNs other than 0 from SCSI-2 hosts.
+
 20140718		3.5.2
 	- Fix blank SCSI ID in scsi2sd-config output.
 

+ 2 - 2
lib/SCSI2SD/software/SCSI2SD/src/config.c

@@ -28,7 +28,7 @@
 
 // CYDEV_EEPROM_ROW_SIZE == 16.
 static const char magic[CYDEV_EEPROM_ROW_SIZE] = "codesrc_00000002";
-static const uint16_t FIRMWARE_VERSION = 0x0352;
+static const uint16_t FIRMWARE_VERSION = 0x0360;
 
 // Config shadow RAM (copy of EEPROM)
 static Config shadow =
@@ -36,7 +36,7 @@ static Config shadow =
 	0, // SCSI ID
 	" codesrc", // vendor  (68k Apple Drive Setup: Set to " SEAGATE")
 	"         SCSI2SD", //prodId (68k Apple Drive Setup: Set to "          ST225N")
-	" 3.5", // revision (68k Apple Drive Setup: Set to "1.0 ")
+	" 3.6", // revision (68k Apple Drive Setup: Set to "1.0 ")
 	1, // enable parity
 	1, // enable unit attention,
 	0, // RESERVED

+ 1 - 2
lib/SCSI2SD/software/SCSI2SD/src/diagnostic.c

@@ -123,9 +123,8 @@ void scsiReceiveDiagnostic()
 	}
 
 	{
-		uint8 lun = scsiDev.cdb[1] >> 5;
 		// Set the first byte to indicate LUN presence.
-		if (lun) // We only support lun 0
+		if (scsiDev.lun) // We only support lun 0
 		{
 			scsiDev.data[0] = 0x7F;
 		}

+ 1 - 2
lib/SCSI2SD/software/SCSI2SD/src/inquiry.c

@@ -95,7 +95,6 @@ void scsiInquiry()
 {
 	uint8 evpd = scsiDev.cdb[1] & 1; // enable vital product data.
 	uint8 pageCode = scsiDev.cdb[2];
-	uint8 lun = scsiDev.cdb[1] >> 5;
 	uint32 allocationLength = scsiDev.cdb[4];
 	if (allocationLength == 0) allocationLength = 256;
 	
@@ -180,7 +179,7 @@ void scsiInquiry()
 	}
 
 	// Set the first byte to indicate LUN presence.
-	if (lun) // We only support lun 0
+	if (scsiDev.lun) // We only support lun 0
 	{
 		scsiDev.data[0] = 0x7F;
 	}

+ 13 - 9
lib/SCSI2SD/software/SCSI2SD/src/scsi.c

@@ -225,7 +225,6 @@ static void process_Command()
 {
 	int group;
 	uint8 command;
-	uint8 lun;
 	uint8 control;
 
 	scsiEnterPhase(COMMAND);
@@ -239,7 +238,13 @@ static void process_Command()
 	scsiRead(scsiDev.cdb + 1, scsiDev.cdbLen - 1);
 
 	command = scsiDev.cdb[0];
-	lun = scsiDev.cdb[1] >> 5;
+
+	// Prefer LUN's set by IDENTIFY messages for newer hosts.
+	if (scsiDev.lun < 0)
+	{
+		scsiDev.lun = scsiDev.cdb[1] >> 5;
+	}
+
 	control = scsiDev.cdb[scsiDev.cdbLen - 1];
 
 	scsiDev.cmdCount++;
@@ -313,7 +318,7 @@ static void process_Command()
 
 		enter_Status(CHECK_CONDITION);
 	}
-	else if (lun)
+	else if (scsiDev.lun)
 	{
 		scsiDev.sense.code = ILLEGAL_REQUEST;
 		scsiDev.sense.asc = LOGICAL_UNIT_NOT_SUPPORTED;
@@ -424,6 +429,7 @@ static void scsiReset()
 	scsiDev.phase = BUS_FREE;
 	scsiDev.atnFlag = 0;
 	scsiDev.resetFlag = 0;
+	scsiDev.lun = -1;
 
 	if (scsiDev.unitAttention != POWER_ON_RESET)
 	{
@@ -458,6 +464,7 @@ static void enter_SelectionPhase()
 	scsiDev.dataLen = 0;
 	scsiDev.status = GOOD;
 	scsiDev.phase = SELECTION;
+	scsiDev.lun = -1;
 
 	transfer.blocks = 0;
 	transfer.currentBlock = 0;
@@ -626,15 +633,12 @@ static void process_MessageOut()
 		// IDENTIFY
 		// We don't disconnect, so ignore disconnect privilege.
 		if ((scsiDev.msgOut & 0x18) || // Reserved bits set.
-			(scsiDev.msgOut & 0x20)  || // We don't have any target routines!
-			(scsiDev.msgOut & 0x7) // We only support LUN 0!
-			)
+			(scsiDev.msgOut & 0x20))  // We don't have any target routines!
 		{
-			//scsiDev.sense.code = ILLEGAL_REQUEST;
-			//scsiDev.sense.asc = INVALID_BITS_IN_IDENTIFY_MESSAGE;
-			//enter_Status(CHECK_CONDITION);
 			messageReject();
 		}
+
+		scsiDev.lun = scsiDev.msgOut & 0x7;
 		//scsiDev.allowDisconnect = scsiDev.msgOut & 0x40;
 	}
 	else if (scsiDev.msgOut >= 0x20 && scsiDev.msgOut <= 0x2F)

+ 1 - 0
lib/SCSI2SD/software/SCSI2SD/src/scsi.h

@@ -84,6 +84,7 @@ typedef struct
 
 	uint8 cdb[12]; // command descriptor block
 	uint8 cdbLen; // 6, 10, or 12 byte message.
+	int8 lun; // Target lun, set by IDENTIFY message.
 
 	// Only let the reserved initiator talk to us.
 	// A 3rd party may be sending the RESERVE/RELEASE commands