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:
parent
b754d72ab2
commit
12915a48f2
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user