From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 18/25] fdc: rewrite seek and DSKCHG bit handling
Date: Mon, 9 Jul 2012 16:16:21 +0200 [thread overview]
Message-ID: <1341843388-5663-19-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1341843388-5663-1-git-send-email-kwolf@redhat.com>
From: Pavel Hrdina <phrdina@redhat.com>
This bit is cleared on every successful seek to a different track (cylinder).
The seek is also called on revalidate or on read/write/format commands which
also clear the DSKCHG bit.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
hw/fdc.c | 79 ++++++++++++++++++++++++++++++++-----------------------------
1 files changed, 41 insertions(+), 38 deletions(-)
diff --git a/hw/fdc.c b/hw/fdc.c
index 5b3224b..0270264 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -153,8 +153,12 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
}
#endif
drv->head = head;
- if (drv->track != track)
+ if (drv->track != track) {
+ if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {
+ drv->media_changed = 0;
+ }
ret = 1;
+ }
drv->track = track;
drv->sect = sect;
}
@@ -170,9 +174,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
static void fd_recalibrate(FDrive *drv)
{
FLOPPY_DPRINTF("recalibrate\n");
- drv->head = 0;
- drv->track = 0;
- drv->sect = 1;
+ fd_seek(drv, 0, 0, 1, 1);
}
/* Revalidate a disk drive after a disk change */
@@ -711,14 +713,6 @@ static void fdctrl_raise_irq(FDCtrl *fdctrl, uint8_t status0)
qemu_set_irq(fdctrl->irq, 1);
fdctrl->sra |= FD_SRA_INTPEND;
}
- if (status0 & FD_SR0_SEEK) {
- FDrive *cur_drv;
- /* A seek clears the disk change line (if a disk is inserted) */
- cur_drv = get_cur_drv(fdctrl);
- if (cur_drv->bs != NULL && bdrv_is_inserted(cur_drv->bs)) {
- cur_drv->media_changed = 0;
- }
- }
fdctrl->reset_sensei = 0;
fdctrl->status0 = status0;
@@ -997,7 +991,10 @@ static void fdctrl_unimplemented(FDCtrl *fdctrl, int direction)
fdctrl_set_fifo(fdctrl, 1, 0);
}
-/* Seek to next sector */
+/* Seek to next sector
+ * returns 0 when end of track reached (for DBL_SIDES on head 1)
+ * otherwise returns 1
+ */
static int fdctrl_seek_to_next_sect(FDCtrl *fdctrl, FDrive *cur_drv)
{
FLOPPY_DPRINTF("seek to next sector (%d %02x %02x => %d)\n",
@@ -1005,30 +1002,39 @@ static int fdctrl_seek_to_next_sect(FDCtrl *fdctrl, FDrive *cur_drv)
fd_sector(cur_drv));
/* XXX: cur_drv->sect >= cur_drv->last_sect should be an
error in fact */
- if (cur_drv->sect >= cur_drv->last_sect ||
- cur_drv->sect == fdctrl->eot) {
- cur_drv->sect = 1;
+ uint8_t new_head = cur_drv->head;
+ uint8_t new_track = cur_drv->track;
+ uint8_t new_sect = cur_drv->sect;
+
+ int ret = 1;
+
+ if (new_sect >= cur_drv->last_sect ||
+ new_sect == fdctrl->eot) {
+ new_sect = 1;
if (FD_MULTI_TRACK(fdctrl->data_state)) {
- if (cur_drv->head == 0 &&
+ if (new_head == 0 &&
(cur_drv->flags & FDISK_DBL_SIDES) != 0) {
- cur_drv->head = 1;
+ new_head = 1;
} else {
- cur_drv->head = 0;
- cur_drv->track++;
- if ((cur_drv->flags & FDISK_DBL_SIDES) == 0)
- return 0;
+ new_head = 0;
+ new_track++;
+ if ((cur_drv->flags & FDISK_DBL_SIDES) == 0) {
+ ret = 0;
+ }
}
} else {
- cur_drv->track++;
- return 0;
+ new_track++;
+ ret = 0;
+ }
+ if (ret == 1) {
+ FLOPPY_DPRINTF("seek to next track (%d %02x %02x => %d)\n",
+ new_head, new_track, new_sect, fd_sector(cur_drv));
}
- FLOPPY_DPRINTF("seek to next track (%d %02x %02x => %d)\n",
- cur_drv->head, cur_drv->track,
- cur_drv->sect, fd_sector(cur_drv));
} else {
- cur_drv->sect++;
+ new_sect++;
}
- return 1;
+ fd_seek(cur_drv, new_head, new_track, new_sect, 1);
+ return ret;
}
/* Callback for transfer end (stop or abort) */
@@ -1626,11 +1632,7 @@ static void fdctrl_handle_seek(FDCtrl *fdctrl, int direction)
/* The seek command just sends step pulses to the drive and doesn't care if
* there is a medium inserted of if it's banging the head against the drive.
*/
- if (fdctrl->fifo[2] > cur_drv->max_track) {
- cur_drv->track = cur_drv->max_track;
- } else {
- cur_drv->track = fdctrl->fifo[2];
- }
+ fd_seek(cur_drv, cur_drv->head, fdctrl->fifo[2], cur_drv->sect, 1);
/* Raise Interrupt */
fdctrl_raise_irq(fdctrl, FD_SR0_SEEK);
}
@@ -1695,9 +1697,10 @@ static void fdctrl_handle_relative_seek_out(FDCtrl *fdctrl, int direction)
SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
cur_drv = get_cur_drv(fdctrl);
if (fdctrl->fifo[2] + cur_drv->track >= cur_drv->max_track) {
- cur_drv->track = cur_drv->max_track - 1;
+ fd_seek(cur_drv, cur_drv->head, cur_drv->max_track - 1,
+ cur_drv->sect, 1);
} else {
- cur_drv->track += fdctrl->fifo[2];
+ fd_seek(cur_drv, cur_drv->head, fdctrl->fifo[2], cur_drv->sect, 1);
}
fdctrl_reset_fifo(fdctrl);
/* Raise Interrupt */
@@ -1711,9 +1714,9 @@ static void fdctrl_handle_relative_seek_in(FDCtrl *fdctrl, int direction)
SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
cur_drv = get_cur_drv(fdctrl);
if (fdctrl->fifo[2] > cur_drv->track) {
- cur_drv->track = 0;
+ fd_seek(cur_drv, cur_drv->head, 0, cur_drv->sect, 1);
} else {
- cur_drv->track -= fdctrl->fifo[2];
+ fd_seek(cur_drv, cur_drv->head, fdctrl->fifo[2], cur_drv->sect, 1);
}
fdctrl_reset_fifo(fdctrl);
/* Raise Interrupt */
--
1.7.6.5
next prev parent reply other threads:[~2012-07-09 14:17 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-09 14:16 [Qemu-devel] [PULL 00/25] Block patches Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 01/25] qcow2: fix #ifdef'd qcow2_check_refcounts() callers Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 02/25] qcow2: preserve free_byte_offset when qcow2_alloc_bytes() fails Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 03/25] blockdev: warn when copy_on_read=on and readonly=on Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 04/25] sheepdog: fix dprintf format strings Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 05/25] sheepdog: restart I/O when socket becomes ready in do_co_req() Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 06/25] sheepdog: use coroutine based socket functions in coroutine context Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 07/25] sheepdog: make sure we don't free aiocb before sending all requests Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 08/25] sheepdog: split outstanding list into inflight and pending Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 09/25] sheepdog: traverse pending_list from the first for each time Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 10/25] blkdebug: remove sync i/o events Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 11/25] blkdebug: tiny cleanup Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 12/25] blkdebug: pass getlength to underlying file Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 13/25] blkdebug: store list of active rules Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 14/25] blkdebug: optionally tie errors to a specific sector Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 15/25] raw: hook into blkdebug Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 16/25] block: copy over job and dirty bitmap fields in bdrv_append Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 17/25] block: introduce bdrv_swap, implement bdrv_append on top of it Kevin Wolf
2012-07-09 14:16 ` Kevin Wolf [this message]
2012-07-09 14:16 ` [Qemu-devel] [PATCH 19/25] fdc: fix interrupt handling Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 20/25] fdc_test: update media_change test Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 21/25] fdc_test: introduce test_sense_interrupt Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 22/25] fdc: Drop broken code for user-defined floppy geometry Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 23/25] fdc: Move floppy geometry guessing back from block.c Kevin Wolf
2012-07-09 15:01 ` Anthony Liguori
2012-07-09 15:24 ` Kevin Wolf
2012-07-09 15:45 ` Anthony Liguori
2012-07-09 16:07 ` Markus Armbruster
2012-07-09 16:46 ` Eric Blake
2012-07-09 17:01 ` Anthony Liguori
2012-07-10 7:41 ` Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 24/25] qtest: Tidy up temporary files properly Kevin Wolf
2012-07-09 14:16 ` [Qemu-devel] [PATCH 25/25] block: Factor bdrv_read_unthrottled() out of guess_disk_lchs() Kevin Wolf
2012-07-09 16:49 ` [Qemu-devel] [PULL 00/25] Block patches Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1341843388-5663-19-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).