mirror of https://gitee.com/openkylin/qemu.git
fdc: Switch to byte-based block access
Sector-based blk_write() should die; switch to byte-based blk_pwrite() instead. Likewise for blk_read(). Signed-off-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d00000f901
commit
a7a5b7c0fc
|
@ -223,6 +223,13 @@ static int fd_sector(FDrive *drv)
|
||||||
NUM_SIDES(drv));
|
NUM_SIDES(drv));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns current position, in bytes, for given drive */
|
||||||
|
static int fd_offset(FDrive *drv)
|
||||||
|
{
|
||||||
|
g_assert(fd_sector(drv) < INT_MAX >> BDRV_SECTOR_BITS);
|
||||||
|
return fd_sector(drv) << BDRV_SECTOR_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
/* Seek to a new position:
|
/* Seek to a new position:
|
||||||
* returns 0 if already on right track
|
* returns 0 if already on right track
|
||||||
* returns 1 if track changed
|
* returns 1 if track changed
|
||||||
|
@ -1629,8 +1636,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
||||||
if (fdctrl->data_dir != FD_DIR_WRITE ||
|
if (fdctrl->data_dir != FD_DIR_WRITE ||
|
||||||
len < FD_SECTOR_LEN || rel_pos != 0) {
|
len < FD_SECTOR_LEN || rel_pos != 0) {
|
||||||
/* READ & SCAN commands and realign to a sector for WRITE */
|
/* READ & SCAN commands and realign to a sector for WRITE */
|
||||||
if (blk_read(cur_drv->blk, fd_sector(cur_drv),
|
if (blk_pread(cur_drv->blk, fd_offset(cur_drv),
|
||||||
fdctrl->fifo, 1) < 0) {
|
fdctrl->fifo, BDRV_SECTOR_SIZE) < 0) {
|
||||||
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
/* Sure, image size is too small... */
|
/* Sure, image size is too small... */
|
||||||
|
@ -1657,8 +1664,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
||||||
|
|
||||||
k->read_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos,
|
k->read_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos,
|
||||||
fdctrl->data_pos, len);
|
fdctrl->data_pos, len);
|
||||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv),
|
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv),
|
||||||
fdctrl->fifo, 1) < 0) {
|
fdctrl->fifo, BDRV_SECTOR_SIZE, 0) < 0) {
|
||||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||||
|
@ -1741,7 +1748,8 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl)
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (blk_read(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
if (blk_pread(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||||
|
BDRV_SECTOR_SIZE)
|
||||||
< 0) {
|
< 0) {
|
||||||
FLOPPY_DPRINTF("error getting sector %d\n",
|
FLOPPY_DPRINTF("error getting sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
|
@ -1820,7 +1828,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
|
||||||
}
|
}
|
||||||
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
||||||
if (cur_drv->blk == NULL ||
|
if (cur_drv->blk == NULL ||
|
||||||
blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||||
|
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||||
FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
|
FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
|
||||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2243,8 +2252,8 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value)
|
||||||
if (pos == FD_SECTOR_LEN - 1 ||
|
if (pos == FD_SECTOR_LEN - 1 ||
|
||||||
fdctrl->data_pos == fdctrl->data_len) {
|
fdctrl->data_pos == fdctrl->data_len) {
|
||||||
cur_drv = get_cur_drv(fdctrl);
|
cur_drv = get_cur_drv(fdctrl);
|
||||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||||
< 0) {
|
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue