mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
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));
|
||||
}
|
||||
|
||||
/* 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:
|
||||
* returns 0 if already on right track
|
||||
* 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 ||
|
||||
len < FD_SECTOR_LEN || rel_pos != 0) {
|
||||
/* READ & SCAN commands and realign to a sector for WRITE */
|
||||
if (blk_read(cur_drv->blk, fd_sector(cur_drv),
|
||||
fdctrl->fifo, 1) < 0) {
|
||||
if (blk_pread(cur_drv->blk, fd_offset(cur_drv),
|
||||
fdctrl->fifo, BDRV_SECTOR_SIZE) < 0) {
|
||||
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
/* 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,
|
||||
fdctrl->data_pos, len);
|
||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv),
|
||||
fdctrl->fifo, 1) < 0) {
|
||||
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv),
|
||||
fdctrl->fifo, BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
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));
|
||||
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) {
|
||||
FLOPPY_DPRINTF("error getting sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
@ -1820,7 +1828,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
|
||||
}
|
||||
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
||||
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));
|
||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||
} else {
|
||||
@ -2243,8 +2252,8 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value)
|
||||
if (pos == FD_SECTOR_LEN - 1 ||
|
||||
fdctrl->data_pos == fdctrl->data_len) {
|
||||
cur_drv = get_cur_drv(fdctrl);
|
||||
if (blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
||||
< 0) {
|
||||
if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
|
||||
BDRV_SECTOR_SIZE, 0) < 0) {
|
||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||
fd_sector(cur_drv));
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user