From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60035) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TYi0I-0000Ww-St for qemu-devel@nongnu.org; Wed, 14 Nov 2012 13:48:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TYi0F-0000YK-Ow for qemu-devel@nongnu.org; Wed, 14 Nov 2012 13:48:02 -0500 Received: from mx1.redhat.com ([209.132.183.28]:61047) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TYi0F-0000YE-Gt for qemu-devel@nongnu.org; Wed, 14 Nov 2012 13:47:59 -0500 From: Kevin Wolf Date: Wed, 14 Nov 2012 19:47:20 +0100 Message-Id: <1352918847-3696-20-git-send-email-kwolf@redhat.com> In-Reply-To: <1352918847-3696-1-git-send-email-kwolf@redhat.com> References: <1352918847-3696-1-git-send-email-kwolf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 19/26] fdc: implement VERIFY command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Herv=C3=A9 Poussineau VERIFY command is like a READ command, except that read data is not transfered by DMA. As DMA engine is not used, so we have to start data transfer ourselves. Signed-off-by: Herv=C3=A9 Poussineau Signed-off-by: Kevin Wolf --- hw/fdc.c | 25 ++++++++++++++++++------- 1 files changed, 18 insertions(+), 7 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index 525ba20..3a82ed1 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -349,6 +349,7 @@ enum { FD_DIR_SCANE =3D 2, FD_DIR_SCANL =3D 3, FD_DIR_SCANH =3D 4, + FD_DIR_VERIFY =3D 5, }; =20 enum { @@ -1266,14 +1267,21 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl,= int direction) if (((direction =3D=3D FD_DIR_SCANE || direction =3D=3D FD_DIR_S= CANL || direction =3D=3D FD_DIR_SCANH) && dma_mode =3D=3D 0) || (direction =3D=3D FD_DIR_WRITE && dma_mode =3D=3D 2) || - (direction =3D=3D FD_DIR_READ && dma_mode =3D=3D 1)) { + (direction =3D=3D FD_DIR_READ && dma_mode =3D=3D 1) || + (direction =3D=3D FD_DIR_VERIFY)) { /* No access is allowed until DMA transfer has completed */ fdctrl->msr &=3D ~FD_MSR_RQM; - /* Now, we just have to wait for the DMA controller to - * recall us... - */ - DMA_hold_DREQ(fdctrl->dma_chann); - DMA_schedule(fdctrl->dma_chann); + if (direction !=3D FD_DIR_VERIFY) { + /* Now, we just have to wait for the DMA controller to + * recall us... + */ + DMA_hold_DREQ(fdctrl->dma_chann); + DMA_schedule(fdctrl->dma_chann); + } else { + /* Start transfer */ + fdctrl_transfer_handler(fdctrl, fdctrl->dma_chann, 0, + fdctrl->data_len); + } return; } else { FLOPPY_DPRINTF("bad dma_mode=3D%d direction=3D%d\n", dma_mod= e, @@ -1376,6 +1384,9 @@ static int fdctrl_transfer_handler (void *opaque, i= nt nchan, goto transfer_error; } break; + case FD_DIR_VERIFY: + /* VERIFY commands */ + break; default: /* SCAN commands */ { @@ -1858,7 +1869,7 @@ static const struct { { FD_CMD_SAVE, 0xff, "SAVE", 0, fdctrl_handle_save }, /* part of REA= D DELETED DATA */ { FD_CMD_READ_DELETED, 0x1f, "READ DELETED DATA", 8, fdctrl_start_tr= ansfer_del, FD_DIR_READ }, { FD_CMD_SCAN_EQUAL, 0x1f, "SCAN EQUAL", 8, fdctrl_start_transfer, F= D_DIR_SCANE }, - { FD_CMD_VERIFY, 0x1f, "VERIFY", 8, fdctrl_unimplemented }, + { FD_CMD_VERIFY, 0x1f, "VERIFY", 8, fdctrl_start_transfer, FD_DIR_VE= RIFY }, { FD_CMD_SCAN_LOW_OR_EQUAL, 0x1f, "SCAN LOW OR EQUAL", 8, fdctrl_sta= rt_transfer, FD_DIR_SCANL }, { FD_CMD_SCAN_HIGH_OR_EQUAL, 0x1f, "SCAN HIGH OR EQUAL", 8, fdctrl_s= tart_transfer, FD_DIR_SCANH }, { FD_CMD_WRITE_DELETED, 0x3f, "WRITE DELETED DATA", 8, fdctrl_start_= transfer_del, FD_DIR_WRITE }, --=20 1.7.6.5