From patchwork Fri Mar 23 07:07:20 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhi Hui Li X-Patchwork-Id: 148386 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BD03EB6EF1 for ; Fri, 23 Mar 2012 18:08:07 +1100 (EST) Received: from localhost ([::1]:44076 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SAybU-0005r4-26 for incoming@patchwork.ozlabs.org; Fri, 23 Mar 2012 03:08:04 -0400 Received: from eggs.gnu.org ([208.118.235.92]:57265) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SAybM-0005qZ-EI for qemu-devel@nongnu.org; Fri, 23 Mar 2012 03:07:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SAybK-0006qV-AW for qemu-devel@nongnu.org; Fri, 23 Mar 2012 03:07:56 -0400 Received: from e23smtp01.au.ibm.com ([202.81.31.143]:50762) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SAybJ-0006pP-H5 for qemu-devel@nongnu.org; Fri, 23 Mar 2012 03:07:54 -0400 Received: from /spool/local by e23smtp01.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 23 Mar 2012 07:00:29 +1000 Received: from d23relay04.au.ibm.com (202.81.31.246) by e23smtp01.au.ibm.com (202.81.31.207) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 23 Mar 2012 07:00:26 +1000 Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q2N71Ofp2801728 for ; Fri, 23 Mar 2012 18:01:29 +1100 Received: from d23av02.au.ibm.com (loopback [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q2N77NNf021708 for ; Fri, 23 Mar 2012 18:07:23 +1100 Received: from mm.cn.ibm.com (mm.cn.ibm.com [9.115.116.105] (may be forged)) by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q2N77L7S021627; Fri, 23 Mar 2012 18:07:22 +1100 From: Li Zhi Hui To: qemu-devel@nongnu.org Date: Fri, 23 Mar 2012 15:07:20 +0800 Message-Id: <1332486440-12512-1-git-send-email-zhihuili@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.4.1 x-cbid: 12032221-1618-0000-0000-0000012219E3 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.81.31.143 Cc: kwolf@redhat.com, zhihuili@linux.vnet.ibm.com, pingfank@linux.vnet.ibm.com, stefanha@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH] Replace bdrv_* to bdrv_aio_* functions in pio mode in fdc.c. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Replace bdrv_* to bdrv_aio_* functions in pio mode in fdc.c. Signed-off-by: Li Zhi Hui --- hw/fdc.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 90 insertions(+), 27 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index a0236b7..5e855fd 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -1301,12 +1301,42 @@ static int fdctrl_transfer_handler (void *opaque, int nchan, return len; } +enum { + FD_DATA_IDLE, + FD_DATA_WORKING, + FD_DATA_FIN, +}; + +int data_status[MAX_FD]; + +static void fdctrl_read_pio_cb(void *opaque, int ret) +{ + FDCtrl *fdctrl = opaque; + FDrive *cur_drv; + + if (ret < 0) { + cur_drv = get_cur_drv(fdctrl); + FLOPPY_DPRINTF("error getting sector %d\n", + fd_sector(cur_drv)); + /* Sure, image size is too small... */ + memset(fdctrl->fifo, 0, FD_SECTOR_LEN); + data_status[fdctrl->cur_drv] = FD_DATA_IDLE; + goto end; + } + data_status[fdctrl->cur_drv] = FD_DATA_FIN; + +end: + return; +} + /* Data register : 0x05 */ static uint32_t fdctrl_read_data(FDCtrl *fdctrl) { FDrive *cur_drv; uint32_t retval = 0; int pos; + QEMUIOVector qiov; + struct iovec iov; cur_drv = get_cur_drv(fdctrl); fdctrl->dsr &= ~FD_DSR_PWRDOWN; @@ -1318,17 +1348,30 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl) if (fdctrl->msr & FD_MSR_NONDMA) { pos %= FD_SECTOR_LEN; if (pos == 0) { - if (fdctrl->data_pos != 0) - if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) { - FLOPPY_DPRINTF("error seeking to next sector %d\n", - fd_sector(cur_drv)); - return 0; + switch (data_status[fdctrl->cur_drv]) { + case FD_DATA_IDLE: + if (fdctrl->data_pos != 0) { + if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) { + FLOPPY_DPRINTF("error seeking to next sector %d\n", + fd_sector(cur_drv)); + goto end; + } } - if (bdrv_read(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) { - FLOPPY_DPRINTF("error getting sector %d\n", - fd_sector(cur_drv)); - /* Sure, image size is too small... */ - memset(fdctrl->fifo, 0, FD_SECTOR_LEN); + iov.iov_base = fdctrl->fifo; + iov.iov_len = FD_SECTOR_LEN; + qemu_iovec_init_external(&qiov, &iov, 1); + bdrv_aio_readv(cur_drv->bs, fd_sector(cur_drv), + &qiov, 1, fdctrl_read_pio_cb, fdctrl); + data_status[fdctrl->cur_drv] = FD_DATA_WORKING; + goto end; + case FD_DATA_WORKING: + goto end; + case FD_DATA_FIN: + data_status[fdctrl->cur_drv] = FD_DATA_IDLE; + break; + default: + data_status[fdctrl->cur_drv] = FD_DATA_IDLE; + goto end; } } } @@ -1347,6 +1390,7 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl) } FLOPPY_DPRINTF("data register: 0x%02x\n", retval); +end: return retval; } @@ -1759,10 +1803,38 @@ static const struct { /* Associate command to an index in the 'handlers' array */ static uint8_t command_to_handler[256]; +static void fdctrl_write_pio_cb(void *opaque, int ret) +{ + FDCtrl *fdctrl = opaque; + FDrive *cur_drv; + + cur_drv = get_cur_drv(fdctrl); + if (ret < 0) { + FLOPPY_ERROR("writing sector %d\n", fd_sector(cur_drv)); + goto end; + } + if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) { + FLOPPY_DPRINTF("error seeking to next sector %d\n", + fd_sector(cur_drv)); + goto end; + } + /* Switch from transfer mode to status mode + * then from status mode to command mode + */ + if (fdctrl->data_pos == fdctrl->data_len) { + fdctrl_stop_transfer(fdctrl, FD_SR0_SEEK, 0x00, 0x00); + } + +end: + return; +} + static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value) { FDrive *cur_drv; int pos; + QEMUIOVector qiov; + struct iovec iov; /* Reset mode */ if (!(fdctrl->dor & FD_DOR_nRESET)) { @@ -1780,25 +1852,16 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value) pos = fdctrl->data_pos++; pos %= FD_SECTOR_LEN; fdctrl->fifo[pos] = value; - if (pos == FD_SECTOR_LEN - 1 || - fdctrl->data_pos == fdctrl->data_len) { + if ((pos == FD_SECTOR_LEN - 1) || + (fdctrl->data_pos == fdctrl->data_len)) { cur_drv = get_cur_drv(fdctrl); - if (bdrv_write(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) { - FLOPPY_ERROR("writing sector %d\n", fd_sector(cur_drv)); - return; - } - if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) { - FLOPPY_DPRINTF("error seeking to next sector %d\n", - fd_sector(cur_drv)); - return; - } + iov.iov_base = fdctrl->fifo; + iov.iov_len = FD_SECTOR_LEN; + qemu_iovec_init_external(&qiov, &iov, 1); + bdrv_aio_writev(cur_drv->bs, fd_sector(cur_drv), + &qiov, 1, fdctrl_write_pio_cb, fdctrl); + return; } - /* Switch from transfer mode to status mode - * then from status mode to command mode - */ - if (fdctrl->data_pos == fdctrl->data_len) - fdctrl_stop_transfer(fdctrl, FD_SR0_SEEK, 0x00, 0x00); - return; } if (fdctrl->data_pos == 0) { /* Command */