From 140edbc7c524de05d65737666194685b241ab3e6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 18 Dec 2024 14:55:43 +0600 Subject: [PATCH] Re-enable logging again XP recognizes the disk now but reports 0 capacity. Windows 2000 SP4 is fine. --- src/scsi/scsi_disk.c | 16 ++-------------- src/usb/usb_msd.c | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index e01151e672..ca5aa267ca 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -1297,9 +1297,6 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb) dev->packet_status = PHASE_COMPLETE; dev->callback = 20.0 * SCSI_TIME; break; - } else if (max_len < 12) { - scsi_disk_data_phase_error(dev); - return; } scsi_disk_buf_alloc(dev, 256); @@ -1307,7 +1304,7 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb) max_len = hdd_image_get_last_sector(dev->id) + 1; memset(dev->temp_buffer, 0, 20); - dev->temp_buffer[3] = 16; + dev->temp_buffer[3] = 8; dev->temp_buffer[4] = (max_len >> 24) & 0xff; dev->temp_buffer[5] = (max_len >> 16) & 0xff; @@ -1318,16 +1315,7 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb) dev->temp_buffer[10] = 2; dev->temp_buffer[11] = 0; - dev->temp_buffer[12] = (max_len >> 24) & 0xff; - dev->temp_buffer[13] = (max_len >> 16) & 0xff; - dev->temp_buffer[14] = (max_len >> 8) & 0xff; - dev->temp_buffer[15] = max_len & 0xff; - dev->temp_buffer[16] = 0; - dev->temp_buffer[17] = 0; - dev->temp_buffer[18] = 2; - dev->temp_buffer[19] = 0; - - len = 20; + len = 12; scsi_disk_set_buf_len(dev, BufLen, &len); diff --git a/src/usb/usb_msd.c b/src/usb/usb_msd.c index 133a6a4e47..783ed82b11 100644 --- a/src/usb/usb_msd.c +++ b/src/usb/usb_msd.c @@ -162,6 +162,7 @@ typedef struct usb_device_msd uint32_t force_stall; } usb_device_msd; +#define ENABLE_USB_MSD_LOG 1 #ifdef ENABLE_USB_MSD_LOG int usb_msd_do_log = ENABLE_USB_MSD_LOG; @@ -361,8 +362,14 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p) scsi_device_command_phase1(&scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun]); usb_msd->current_csw.bCSWStatus = (scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].phase == SCSI_PHASE_STATUS) ? (scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].status == SCSI_STATUS_CHECK_CONDITION) : 2; } else { - if (usb_msd->current_cbw.dCBWDataTransferLength >= scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length) + if (usb_msd->current_cbw.dCBWDataTransferLength >= scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length) { usb_msd->current_csw.dCSWDataResidue = usb_msd->current_cbw.dCBWDataTransferLength - scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length; + if (usb_msd->phase == USB_MSDM_DATAIN) { + scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].sc->temp_buffer = realloc(scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].sc->temp_buffer, usb_msd->current_cbw.dCBWDataTransferLength); + usb_msd->data_in_len = usb_msd->current_cbw.dCBWDataTransferLength; + scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length = usb_msd->data_in_len; + } + } } break; } @@ -404,7 +411,6 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p) usb_msd->phase = USB_MSDM_CSW; usb_msd->current_csw.bCSWStatus = (scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].status == SCSI_STATUS_CHECK_CONDITION); usb_msd->current_csw.dCSWDataResidue = residue; - usb_msd->force_stall = 1; } ret = p->len; break; @@ -477,17 +483,11 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p) if (usb_msd->data_in_len == 0) { usb_msd_log("Transfer finished (data in)\n"); - usb_msd->current_csw.dCSWDataResidue = usb_msd->current_cbw.dCBWDataTransferLength - scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length; scsi_device_command_phase1(&scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun]); - if (usb_msd->current_cbw.dCBWDataTransferLength < scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].buffer_length) - { - usb_msd->current_csw.bCSWStatus = 0x02; - usb_msd->current_csw.dCSWDataResidue = 0; - } else { - usb_msd->current_csw.bCSWStatus = (scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].status == SCSI_STATUS_CHECK_CONDITION); - } + usb_msd->current_csw.bCSWStatus = (scsi_devices[usb_msd->scsi_bus][usb_msd->current_lun].status == SCSI_STATUS_CHECK_CONDITION); usb_msd->phase = USB_MSDM_CSW; - usb_msd->force_stall = 1; +// if (usb_msd->current_csw.dCSWDataResidue) +// usb_msd->force_stall = 1; } break; }