From 6064eb5972091a21e199944289d8b7df02d3a51d Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 1 Sep 2014 17:31:20 +0300 Subject: [PATCH] Removed obsolete SCSI buffer size checks, scsi_emulate_analyze() increases buffer size automatically when needed. --- blkdev.cpp | 16 ---------------- scsi.cpp | 21 ++++++++++++++------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/blkdev.cpp b/blkdev.cpp index 7bc46e1b..2896b934 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -1223,8 +1223,6 @@ static int scsi_read_cd_data (int unitnum, uae_u8 *scsi_data, uae_u32 offset, ua *scsi_len = 0; return 0; } else { - if (len * di->bytespersector > SCSI_DEFAULT_DATA_BUFFER_SIZE) - return -3; if (offset >= di->sectorspertrack * di->cylinders * di->trackspercylinder) return -1; int v = cmd_readx (unitnum, scsi_data, offset, len) * di->bytespersector; @@ -1548,8 +1546,6 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, goto outofbounds; if (v == -2) goto readerr; - if (v == -3) - goto toolarge; } else { goto notdatatrack; } @@ -1583,8 +1579,6 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, goto outofbounds; if (v == -2) goto readerr; - if (v == -3) - goto toolarge; } else { goto notdatatrack; } @@ -1606,8 +1600,6 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, goto outofbounds; if (v == -2) goto readerr; - if (v == -3) - goto toolarge; } else { goto notdatatrack; } @@ -1988,14 +1980,6 @@ outofbounds: s[12] = 0x21; /* LOGICAL BLOCK OUT OF RANGE */ ls = 0x12; break; -toolarge: - write_log (_T("CDEMU: too large scsi data tranfer %d > %d\n"), len, dlen); - status = 2; /* CHECK CONDITION */ - s[0] = 0x70; - s[2] = 2; /* NOT READY */ - s[12] = 0x11; /* UNRECOVERED READ ERROR */ - ls = 0x12; - break; errreq: lr = -1; status = 2; /* CHECK CONDITION */ diff --git a/scsi.cpp b/scsi.cpp index 32199c86..e5cb5021 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -63,7 +63,7 @@ static int scsi_data_dir(struct scsi_data *sd) void scsi_emulate_analyze (struct scsi_data *sd) { - int cmd_len, data_len, data_len2; + int cmd_len, data_len, data_len2, tmp_len; data_len = sd->data_len; data_len2 = 0; @@ -71,30 +71,37 @@ void scsi_emulate_analyze (struct scsi_data *sd) sd->cmd_len = cmd_len; switch (sd->cmd[0]) { - case 0x08: + case 0x08: // READ(6) data_len2 = sd->cmd[4] * sd->blocksize; scsi_grow_buffer(sd, data_len2); break; - case 0x28: + case 0x28: // READ(10) data_len2 = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize; scsi_grow_buffer(sd, data_len2); break; - case 0xa8: + case 0xa8: // READ(12) data_len2 = ((sd->cmd[6] << 24) | (sd->cmd[7] << 16) | (sd->cmd[8] << 8) | (sd->cmd[9] << 0)) * (uae_s64)sd->blocksize; scsi_grow_buffer(sd, data_len2); break; - case 0x0a: + case 0x0a: // WRITE(6) data_len = sd->cmd[4] * sd->blocksize; scsi_grow_buffer(sd, data_len); break; - case 0x2a: + case 0x2a: // WRITE(10) data_len = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize; scsi_grow_buffer(sd, data_len); break; - case 0xaa: + case 0xaa: // WRITE(12) data_len = ((sd->cmd[6] << 24) | (sd->cmd[7] << 16) | (sd->cmd[8] << 8) | (sd->cmd[9] << 0)) * (uae_s64)sd->blocksize; scsi_grow_buffer(sd, data_len); break; + case 0xbe: // READ CD + case 0xb9: // READ CD MSF + tmp_len = (sd->cmd[6] << 16) | (sd->cmd[7] << 8) | sd->cmd[8]; + // max block transfer size, it is usually smaller. + tmp_len *= 2352 + 96; + scsi_grow_buffer(sd, tmp_len); + break; case 0x2f: // VERIFY if (sd->cmd[1] & 2) { sd->data_len = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize; -- 2.47.3