|  | @@ -111,93 +111,12 @@ static void enter_Status(uint8 status)
 | 
											
												
													
														|  |  	scsiDev.status = status;
 |  |  	scsiDev.status = status;
 | 
											
												
													
														|  |  	scsiDev.phase = STATUS;
 |  |  	scsiDev.phase = STATUS;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  	scsiDev.lastStatus = scsiDev.status;
 |  |  	scsiDev.lastStatus = scsiDev.status;
 | 
											
												
													
														|  |  	scsiDev.lastSense = scsiDev.sense.code;
 |  |  	scsiDev.lastSense = scsiDev.sense.code;
 | 
											
												
													
														|  | -	#endif
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -static void doReselectTest()
 |  | 
 | 
											
												
													
														|  | -{
 |  | 
 | 
											
												
													
														|  | -	scsiDev.needReconnect = 0;
 |  | 
 | 
											
												
													
														|  | -	scsiEnterPhase(MESSAGE_IN);
 |  | 
 | 
											
												
													
														|  | -	scsiWriteByte(0x02); // save data pointer
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	// TODO check if this message was rejected.
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	scsiWriteByte(0x04); // disconnect msg.
 |  | 
 | 
											
												
													
														|  | -	enter_BusFree();
 |  | 
 | 
											
												
													
														|  | -	
 |  | 
 | 
											
												
													
														|  | -	CyDelay(100);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	while (1)
 |  | 
 | 
											
												
													
														|  | -	{
 |  | 
 | 
											
												
													
														|  | -		int sel = SCSI_ReadPin(SCSI_In_SEL);
 |  | 
 | 
											
												
													
														|  | -		int bsy = SCSI_ReadPin(SCSI_In_BSY);
 |  | 
 | 
											
												
													
														|  | -		if (!sel && !bsy)
 |  | 
 | 
											
												
													
														|  | -		{
 |  | 
 | 
											
												
													
														|  | -			// TODO wait bus settle delay
 |  | 
 | 
											
												
													
														|  | -			CyDelayUs(1); // TODO bus free delay  800ns
 |  | 
 | 
											
												
													
														|  | -			
 |  | 
 | 
											
												
													
														|  | -			// Arbitrate.
 |  | 
 | 
											
												
													
														|  | -			ledOn();
 |  | 
 | 
											
												
													
														|  | -			SCSI_Out_Bits_Write(scsiDev.scsiIdMask);
 |  | 
 | 
											
												
													
														|  | -			SCSI_Out_Ctl_Write(1); // Write bits manually.
 |  | 
 | 
											
												
													
														|  | -			SCSI_SetPin(SCSI_Out_BSY);
 |  | 
 | 
											
												
													
														|  | -			
 |  | 
 | 
											
												
													
														|  | -			CyDelayUs(3); // arbitrate delay. 2.4us.
 |  | 
 | 
											
												
													
														|  | -			
 |  | 
 | 
											
												
													
														|  | -			uint8_t dbx = scsiReadDBxPins();
 |  | 
 | 
											
												
													
														|  | -			sel = SCSI_ReadPin(SCSI_In_SEL);
 |  | 
 | 
											
												
													
														|  | -			if (sel || ((dbx ^ scsiDev.scsiIdMask) > scsiDev.scsiIdMask))
 |  | 
 | 
											
												
													
														|  | -			{
 |  | 
 | 
											
												
													
														|  | -				// Lost arbitration.
 |  | 
 | 
											
												
													
														|  | -				SCSI_Out_Ctl_Write(0);
 |  | 
 | 
											
												
													
														|  | -				SCSI_ClearPin(SCSI_Out_BSY);
 |  | 
 | 
											
												
													
														|  | -				ledOff();
 |  | 
 | 
											
												
													
														|  | -			}
 |  | 
 | 
											
												
													
														|  | -			else
 |  | 
 | 
											
												
													
														|  | -			{
 |  | 
 | 
											
												
													
														|  | -				// Won arbitration	
 |  | 
 | 
											
												
													
														|  | -				SCSI_SetPin(SCSI_Out_SEL);
 |  | 
 | 
											
												
													
														|  | -				CyDelayUs(1); // Bus clear + Bus settle.
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -				// Reselection phase
 |  | 
 | 
											
												
													
														|  | -				scsiEnterPhase(__scsiphase_io); // TODO get rid of delay
 |  | 
 | 
											
												
													
														|  | -				SCSI_Out_Bits_Write(scsiDev.scsiIdMask | (1 << scsiDev.initiatorId));
 |  | 
 | 
											
												
													
														|  | -				CyDelayCycles(4); // 2 deskew delays
 |  | 
 | 
											
												
													
														|  | -				SCSI_ClearPin(SCSI_Out_BSY);
 |  | 
 | 
											
												
													
														|  | -				CyDelayUs(1);  // Bus Settle Delay
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -				bsy = SCSI_ReadPin(SCSI_In_BSY);
 |  | 
 | 
											
												
													
														|  | -				while (!bsy) { bsy = SCSI_ReadPin(SCSI_In_BSY); } // Wait for initiator.
 |  | 
 | 
											
												
													
														|  | -				SCSI_SetPin(SCSI_Out_BSY);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -				// Prepare for the initial IDENTIFY message.
 |  | 
 | 
											
												
													
														|  | -				scsiEnterPhase(MESSAGE_IN);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -				SCSI_Out_Ctl_Write(0);
 |  | 
 | 
											
												
													
														|  | -				SCSI_ClearPin(SCSI_Out_SEL);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -				// Send identify command
 |  | 
 | 
											
												
													
														|  | -				scsiWriteByte(0x80);
 |  | 
 | 
											
												
													
														|  | -				break;
 |  | 
 | 
											
												
													
														|  | -			}
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	// Continue with status.
 |  | 
 | 
											
												
													
														|  | -	
 |  | 
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static void process_Status()
 |  |  static void process_Status()
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -	if (scsiDev.status == GOOD && scsiDev.needReconnect && scsiDev.allowDisconnect)
 |  | 
 | 
											
												
													
														|  | -	{
 |  | 
 | 
											
												
													
														|  | -	//	doReselectTest();
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  |  	scsiEnterPhase(STATUS);
 |  |  	scsiEnterPhase(STATUS);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	uint8 message;
 |  |  	uint8 message;
 | 
											
										
											
												
													
														|  | @@ -222,10 +141,8 @@ static void process_Status()
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	scsiWriteByte(scsiDev.status);
 |  |  	scsiWriteByte(scsiDev.status);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  	scsiDev.lastStatus = scsiDev.status;
 |  |  	scsiDev.lastStatus = scsiDev.status;
 | 
											
												
													
														|  |  	scsiDev.lastSense = scsiDev.sense.code;
 |  |  	scsiDev.lastSense = scsiDev.sense.code;
 | 
											
												
													
														|  | -	#endif
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	// Command Complete occurs AFTER a valid status has been
 |  |  	// Command Complete occurs AFTER a valid status has been
 | 
											
												
													
														|  |  	// sent. then we go bus-free.
 |  |  	// sent. then we go bus-free.
 | 
											
										
											
												
													
														|  | @@ -325,17 +242,13 @@ static void process_Command()
 | 
											
												
													
														|  |  	lun = scsiDev.cdb[1] >> 5;
 |  |  	lun = scsiDev.cdb[1] >> 5;
 | 
											
												
													
														|  |  	control = scsiDev.cdb[scsiDev.cdbLen - 1];
 |  |  	control = scsiDev.cdb[scsiDev.cdbLen - 1];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  	scsiDev.cmdCount++;
 |  |  	scsiDev.cmdCount++;
 | 
											
												
													
														|  | -	#endif
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if (scsiDev.resetFlag)
 |  |  	if (scsiDev.resetFlag)
 | 
											
												
													
														|  |  	{
 |  |  	{
 | 
											
												
													
														|  | -#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  		// Don't log bogus commands
 |  |  		// Don't log bogus commands
 | 
											
												
													
														|  |  		scsiDev.cmdCount--;
 |  |  		scsiDev.cmdCount--;
 | 
											
												
													
														|  |  		memset(scsiDev.cdb, 0xff, sizeof(scsiDev.cdb));
 |  |  		memset(scsiDev.cdb, 0xff, sizeof(scsiDev.cdb));
 | 
											
												
													
														|  | -#endif
 |  | 
 | 
											
												
													
														|  |  		return;
 |  |  		return;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	else if (scsiDev.parityError)
 |  |  	else if (scsiDev.parityError)
 | 
											
										
											
												
													
														|  | @@ -501,9 +414,7 @@ static void doReserveRelease()
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static void scsiReset()
 |  |  static void scsiReset()
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  	scsiDev.rstCount++;
 |  |  	scsiDev.rstCount++;
 | 
											
												
													
														|  | -#endif
 |  | 
 | 
											
												
													
														|  |  	ledOff();
 |  |  	ledOff();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	scsiPhyReset();
 |  |  	scsiPhyReset();
 | 
											
										
											
												
													
														|  | @@ -513,7 +424,6 @@ static void scsiReset()
 | 
											
												
													
														|  |  	scsiDev.phase = BUS_FREE;
 |  |  	scsiDev.phase = BUS_FREE;
 | 
											
												
													
														|  |  	scsiDev.atnFlag = 0;
 |  |  	scsiDev.atnFlag = 0;
 | 
											
												
													
														|  |  	scsiDev.resetFlag = 0;
 |  |  	scsiDev.resetFlag = 0;
 | 
											
												
													
														|  | -	scsiDev.needReconnect = 0;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if (scsiDev.unitAttention != POWER_ON_RESET)
 |  |  	if (scsiDev.unitAttention != POWER_ON_RESET)
 | 
											
												
													
														|  |  	{
 |  |  	{
 | 
											
										
											
												
													
														|  | @@ -548,8 +458,6 @@ static void enter_SelectionPhase()
 | 
											
												
													
														|  |  	scsiDev.dataLen = 0;
 |  |  	scsiDev.dataLen = 0;
 | 
											
												
													
														|  |  	scsiDev.status = GOOD;
 |  |  	scsiDev.status = GOOD;
 | 
											
												
													
														|  |  	scsiDev.phase = SELECTION;
 |  |  	scsiDev.phase = SELECTION;
 | 
											
												
													
														|  | -	scsiDev.needReconnect = 0;
 |  | 
 | 
											
												
													
														|  | -	scsiDev.allowDisconnect = 0;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	transfer.blocks = 0;
 |  |  	transfer.blocks = 0;
 | 
											
												
													
														|  |  	transfer.currentBlock = 0;
 |  |  	transfer.currentBlock = 0;
 | 
											
										
											
												
													
														|  | @@ -593,9 +501,7 @@ static void process_SelectionPhase()
 | 
											
												
													
														|  |  		SCSI_SetPin(SCSI_Out_BSY);
 |  |  		SCSI_SetPin(SCSI_Out_BSY);
 | 
											
												
													
														|  |  		ledOn();
 |  |  		ledOn();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  		scsiDev.selCount++;
 |  |  		scsiDev.selCount++;
 | 
											
												
													
														|  | -		#endif
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		// Wait until the end of the selection phase.
 |  |  		// Wait until the end of the selection phase.
 | 
											
												
													
														|  |  		while (!scsiDev.resetFlag)
 |  |  		while (!scsiDev.resetFlag)
 | 
											
										
											
												
													
														|  | @@ -643,9 +549,7 @@ static void process_MessageOut()
 | 
											
												
													
														|  |  	scsiDev.atnFlag = 0;
 |  |  	scsiDev.atnFlag = 0;
 | 
											
												
													
														|  |  	scsiDev.parityError = 0;
 |  |  	scsiDev.parityError = 0;
 | 
											
												
													
														|  |  	scsiDev.msgOut = scsiReadByte();
 |  |  	scsiDev.msgOut = scsiReadByte();
 | 
											
												
													
														|  | -#ifdef MM_DEBUG
 |  | 
 | 
											
												
													
														|  |  	scsiDev.msgCount++;
 |  |  	scsiDev.msgCount++;
 | 
											
												
													
														|  | -#endif
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if (scsiDev.parityError)
 |  |  	if (scsiDev.parityError)
 | 
											
												
													
														|  |  	{
 |  |  	{
 | 
											
										
											
												
													
														|  | @@ -731,7 +635,7 @@ static void process_MessageOut()
 | 
											
												
													
														|  |  			//enter_Status(CHECK_CONDITION);
 |  |  			//enter_Status(CHECK_CONDITION);
 | 
											
												
													
														|  |  			messageReject();
 |  |  			messageReject();
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  | -		scsiDev.allowDisconnect = scsiDev.msgOut & 0x40;
 |  | 
 | 
											
												
													
														|  | 
 |  | +		//scsiDev.allowDisconnect = scsiDev.msgOut & 0x40;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	else if (scsiDev.msgOut >= 0x20 && scsiDev.msgOut <= 0x2F)
 |  |  	else if (scsiDev.msgOut >= 0x20 && scsiDev.msgOut <= 0x2F)
 | 
											
												
													
														|  |  	{
 |  |  	{
 |