Added missing update of 'curr_lba' for the harddisk read seek emulation.

Added comments to the MSD / SCSI members similar to usb_cbi.
Now using BXRS_* macros for save/restore.
This commit is contained in:
Volker Ruppert 2015-10-04 08:54:36 +00:00
parent b754d72ab2
commit 12915a48f2
4 changed files with 34 additions and 28 deletions

View File

@ -155,9 +155,9 @@ scsi_device_t::~scsi_device_t(void)
void scsi_device_t::register_state(bx_list_c *parent, const char *name)
{
bx_list_c *list = new bx_list_c(parent, name, "");
new bx_shadow_num_c(list, "sense", &sense);
new bx_shadow_bool_c(list, "locked", &locked);
new bx_shadow_num_c(list, "curr_lba", &curr_lba);
BXRS_DEC_PARAM_SIMPLE(list, sense);
BXRS_PARAM_BOOL(list, locked, locked);
BXRS_DEC_PARAM_SIMPLE(list, curr_lba);
bx_param_bool_c *requests = new bx_param_bool_c(list, "requests", NULL, NULL, 0);
requests->set_sr_handlers(this, scsireq_save_handler, scsireq_restore_handler);
}
@ -395,6 +395,7 @@ void scsi_device_t::scsi_read_complete(void *req, int ret)
return;
}
BX_DEBUG(("data ready tag=0x%x len=%d", r->tag, r->buf_len));
curr_lba = r->sector;
completion(dev, SCSI_REASON_DATA, r->tag, r->buf_len);
}
@ -1029,10 +1030,8 @@ void scsi_device_t::seek_complete(SCSIRequest *r)
r->buf_len = n * 512 * cluster_size;
if (type == SCSIDEV_TYPE_CDROM) {
i = 0;
curr_lba = r->sector;
do {
ret = (int)cdrom->read_block(r->dma_buf + (i * 2048), (Bit32u)(r->sector + i), 2048);
curr_lba++;
} while ((++i < n) && (ret == 1));
if (ret == 0) {
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_MEDIUM_ERROR);

View File

@ -104,22 +104,25 @@ private:
void seek_timer(void);
void seek_complete(SCSIRequest *r);
// members set in constructor
enum scsidev_type type;
device_image_t *hdimage;
cdrom_base_c *cdrom;
SCSIRequest *requests;
int cluster_size;
Bit64u max_lba;
Bit64u curr_lba;
int sense;
int tcq;
scsi_completionfn completion;
void *dev;
bx_bool locked;
bx_bool inserted;
char drive_serial_str[21];
int seek_timer_index;
int statusbar_id;
// members set in constructor / runtime config
Bit64u max_lba;
bx_bool inserted;
// members handled by save/restore
Bit64u curr_lba;
int sense;
bx_bool locked;
SCSIRequest *requests;
};
#endif

View File

@ -405,13 +405,13 @@ void usb_msd_device_c::register_state_specific(bx_list_c *parent)
} else if ((d.type == USB_DEV_TYPE_DISK) && (s.hdimage != NULL)) {
s.hdimage->register_state(s.sr_list);
}
new bx_shadow_num_c(s.sr_list, "mode", &s.mode);
new bx_shadow_num_c(s.sr_list, "scsi_len", &s.scsi_len);
new bx_shadow_num_c(s.sr_list, "usb_len", &s.usb_len);
new bx_shadow_num_c(s.sr_list, "data_len", &s.data_len);
new bx_shadow_num_c(s.sr_list, "residue", &s.residue);
new bx_shadow_num_c(s.sr_list, "tag", &s.tag);
new bx_shadow_num_c(s.sr_list, "result", &s.result);
BXRS_DEC_PARAM_FIELD(s.sr_list, mode, s.mode);
BXRS_DEC_PARAM_FIELD(s.sr_list, scsi_len, s.scsi_len);
BXRS_DEC_PARAM_FIELD(s.sr_list, usb_len, s.usb_len);
BXRS_DEC_PARAM_FIELD(s.sr_list, data_len, s.data_len);
BXRS_DEC_PARAM_FIELD(s.sr_list, residue, s.residue);
BXRS_DEC_PARAM_FIELD(s.sr_list, tag, s.tag);
BXRS_DEC_PARAM_FIELD(s.sr_list, result, s.result);
}
void usb_msd_device_c::handle_reset()

View File

@ -58,27 +58,31 @@ protected:
private:
struct {
Bit8u mode;
Bit32u scsi_len;
Bit8u *scsi_buf;
Bit32u usb_len;
Bit8u *usb_buf;
Bit32u data_len;
Bit32u residue;
Bit32u tag;
int result;
// members set in constructor / init
Bit8u image_mode;
device_image_t *hdimage;
cdrom_base_c *cdrom;
scsi_device_t *scsi_dev;
USBPacket *packet;
bx_list_c *sr_list;
const char *fname;
bx_list_c *config;
char info_txt[BX_PATHNAME_LEN];
char journal[BX_PATHNAME_LEN]; // undoable / volatile disk only
int size; // VVFAT disk only
// members handled by runtime config
bx_bool status_changed;
// members handled by save/restore
Bit8u mode;
Bit32u scsi_len;
Bit32u usb_len;
Bit32u data_len;
Bit32u residue;
Bit32u tag;
int result;
// members not handled by save/restore
Bit8u *scsi_buf;
Bit8u *usb_buf;
USBPacket *packet;
} s;
static const char *cdrom_path_handler(bx_param_string_c *param, int set,