Cleaned up MODE_SELECT blocksize request
OnReadBuffer uses generic buffer and only transfers actual length
This commit is contained in:
parent
3f279230d9
commit
67d3909dd9
|
@ -72,6 +72,7 @@ byte m_sts; // Status byte
|
|||
byte m_msg; // Message bytes
|
||||
byte m_buf[MAX_BLOCKSIZE]; // General purpose buffer
|
||||
byte m_scsi_buf[SCSI_BUF_SIZE]; // Buffer for SCSI READ/WRITE Buffer
|
||||
unsigned m_scsi_buf_size = 0;
|
||||
byte m_msb[256]; // Command storage bytes
|
||||
SCSI_DEVICE scsi_device_list[NUM_SCSIID][NUM_SCSILUN]; // Maximum number
|
||||
SCSI_INQUIRY_DATA default_hdd, default_optical;
|
||||
|
@ -1597,17 +1598,15 @@ byte onModeSense(SCSI_DEVICE *dev, const byte *cdb)
|
|||
m_buf[a + 1] = 0x16; // Page length
|
||||
if(pageControl != 1) {
|
||||
unsigned cylinders = dev->m_blockcount / (16 * 63);
|
||||
if(pageControl != 1) {
|
||||
m_buf[a + 2] = (byte)(cylinders >> 16); // Cylinders
|
||||
m_buf[a + 3] = (byte)(cylinders >> 8);
|
||||
m_buf[a + 4] = (byte)cylinders;
|
||||
m_buf[a + 5] = 16; //Number of heads
|
||||
} else {
|
||||
m_buf[a + 2] = 0xFF; // Cylinder length
|
||||
m_buf[a + 3] = 0xFF;
|
||||
m_buf[a + 4] = 0xFF;
|
||||
m_buf[a + 5] = 16; //Number of heads
|
||||
}
|
||||
m_buf[a + 2] = (byte)(cylinders >> 16); // Cylinders
|
||||
m_buf[a + 3] = (byte)(cylinders >> 8);
|
||||
m_buf[a + 4] = (byte)cylinders;
|
||||
m_buf[a + 5] = 16; //Number of heads
|
||||
} else {
|
||||
m_buf[a + 2] = 0xFF; // Cylinder length
|
||||
m_buf[a + 3] = 0xFF;
|
||||
m_buf[a + 4] = 0xFF;
|
||||
m_buf[a + 5] = 16; //Number of heads
|
||||
}
|
||||
a += 0x18;
|
||||
if(pageCode != SCSI_SENSE_MODE_ALL) break;
|
||||
|
@ -1759,6 +1758,11 @@ byte onModeSelect(SCSI_DEVICE *dev, const byte *cdb)
|
|||
if(length > 0x800) { length = 0x800; }
|
||||
}
|
||||
|
||||
if(length == 0)
|
||||
{
|
||||
return SCSI_STATUS_GOOD;
|
||||
}
|
||||
|
||||
memset(m_buf, 0, length);
|
||||
readDataPhase(length, m_buf);
|
||||
//Apple HD SC Setup sends:
|
||||
|
@ -1766,27 +1770,23 @@ byte onModeSelect(SCSI_DEVICE *dev, const byte *cdb)
|
|||
//I believe mode page 0 set to 10 00 is Disable Unit Attention
|
||||
//Mode page 1 set to 24 10 08 00 00 00 is TB and PER set, read retry count 16, correction span 8
|
||||
|
||||
// Requested change of blocksize
|
||||
// Only supporting 512 or 2048 for optical devices
|
||||
if(dev->m_type == SCSI_DEVICE_OPTICAL)
|
||||
{
|
||||
// hacky for now
|
||||
for(unsigned i = 0; i < length; i++)
|
||||
// check for a block descriptor
|
||||
if(m_buf[3] == 8)
|
||||
{
|
||||
if(m_buf[i] == 8)
|
||||
// Requested change of blocksize
|
||||
// Only supporting 512 or 2048 for optical devices
|
||||
uint32_t new_block_size = ((uint32_t)m_buf[8] << 16) | ((uint32_t)m_buf[10] << 8) | m_buf[9];
|
||||
switch(new_block_size)
|
||||
{
|
||||
// found the block length so we know the offset
|
||||
// for the desired block length
|
||||
switch(m_buf[i + 7])
|
||||
{
|
||||
// 512
|
||||
case 2: setBlockLength(dev, 512);
|
||||
break;
|
||||
// 2048
|
||||
case 8: setBlockLength(dev, 2048);
|
||||
break;
|
||||
}
|
||||
case 512: setBlockLength(dev, 512);
|
||||
break;
|
||||
|
||||
case 2048: setBlockLength(dev, 2048);
|
||||
break;
|
||||
|
||||
default: LOG("Err BlockSize:"); LOG(new_block_size); LOG(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1869,16 +1869,16 @@ byte onReadBuffer(SCSI_DEVICE *dev, const byte *cdb)
|
|||
|
||||
if (mode == MODE_COMBINED_HEADER_DATA)
|
||||
{
|
||||
byte scsi_buf_response[SCSI_BUF_SIZE + 4];
|
||||
memset(m_buf, 0, 4 + m_scsi_buf_size);
|
||||
// four byte read buffer header
|
||||
scsi_buf_response[0] = 0;
|
||||
scsi_buf_response[1] = (SCSI_BUF_SIZE >> 16) & 0xff;
|
||||
scsi_buf_response[2] = (SCSI_BUF_SIZE >> 8) & 0xff;
|
||||
scsi_buf_response[3] = SCSI_BUF_SIZE & 0xff;
|
||||
m_buf[0] = 0;
|
||||
m_buf[1] = (SCSI_BUF_SIZE >> 16) & 0xff;
|
||||
m_buf[2] = (SCSI_BUF_SIZE >> 8) & 0xff;
|
||||
m_buf[3] = SCSI_BUF_SIZE & 0xff;
|
||||
// actual data
|
||||
memcpy((&scsi_buf_response[4]), m_scsi_buf, SCSI_BUF_SIZE);
|
||||
memcpy((&m_buf[4]), m_scsi_buf, m_scsi_buf_size);
|
||||
|
||||
writeDataPhase(SCSI_BUF_SIZE + 4, scsi_buf_response);
|
||||
writeDataPhase(4 + m_scsi_buf_size, m_buf);
|
||||
|
||||
#if DEBUG > 0
|
||||
for (unsigned i = 0; i < allocLength; i++) {
|
||||
|
@ -1890,7 +1890,7 @@ byte onReadBuffer(SCSI_DEVICE *dev, const byte *cdb)
|
|||
}
|
||||
else if (mode == MODE_DATA)
|
||||
{
|
||||
writeDataPhase(allocLength, m_scsi_buf);
|
||||
writeDataPhase(m_scsi_buf_size, m_scsi_buf);
|
||||
#if DEBUG > 0
|
||||
for (unsigned i = 0; i < allocLength; i++) {
|
||||
LOGHEX(m_scsi_buf[i]);LOG(" ");
|
||||
|
|
Loading…
Reference in New Issue