From owner-p4-projects@FreeBSD.ORG Sat May 30 09:30:17 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2E0721065670; Sat, 30 May 2009 09:30:17 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C9729106566C for ; Sat, 30 May 2009 09:30:16 +0000 (UTC) (envelope-from mav@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id B6D218FC0A for ; Sat, 30 May 2009 09:30:16 +0000 (UTC) (envelope-from mav@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n4U9UGvP011109 for ; Sat, 30 May 2009 09:30:16 GMT (envelope-from mav@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n4U9UG4H011107 for perforce@freebsd.org; Sat, 30 May 2009 09:30:16 GMT (envelope-from mav@freebsd.org) Date: Sat, 30 May 2009 09:30:16 GMT Message-Id: <200905300930.n4U9UG4H011107@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mav@freebsd.org using -f From: Alexander Motin To: Perforce Change Reviews Cc: Subject: PERFORCE change 163073 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 30 May 2009 09:30:18 -0000 http://perforce.freebsd.org/chv.cgi?CH=163073 Change 163073 by mav@mav_mavbook on 2009/05/30 09:29:17 Add 28/48-bit commands differentiation. Teach ATA disk driver to use proper ones and AHCI controller to convert them properly to FIS. Add BIO_FLUSH support to ATA disk driver. Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#4 edit .. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#4 edit .. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_da.c#4 edit .. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#6 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#4 (text+ko) ==== @@ -59,28 +59,4 @@ product, revision); } -void -ata_read_write(struct ccb_ataio *ataio, u_int32_t retries, - void (*cbfcnp)(struct cam_periph *, union ccb *), - u_int8_t tag_action, int readop, - u_int64_t lba, u_int32_t block_count, - u_int8_t *data_ptr, u_int32_t dxfer_len, - u_int32_t timeout) -{ - cam_fill_ataio(ataio, - retries, - cbfcnp, - /*flags*/readop ? CAM_DIR_IN : CAM_DIR_OUT, - tag_action, - data_ptr, - dxfer_len, - timeout); - - ataio->cmd.command = readop ? ATA_READ_DMA48 : ATA_WRITE_DMA48; - ataio->cmd.feature = 0; - ataio->cmd.lba = lba; - ataio->cmd.count = block_count; -} - - #endif /* _KERNEL */ ==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#4 (text+ko) ==== @@ -34,21 +34,15 @@ union ccb; struct ata_cmd { - u_int8_t command; /* command reg */ - u_int16_t feature; /* feature reg */ - u_int16_t count; /* count reg */ - u_int64_t lba; /* lba reg */ + u_int8_t command; /* command reg */ + u_int8_t flags; /* ATA command flags */ +#define CAM_ATAIO_48BIT 0x01 /* Command has 48-bit format */ + u_int16_t feature; /* feature reg */ + u_int16_t count; /* count reg */ + u_int64_t lba; /* lba reg */ }; void ata_print_ident(struct ata_params *ident_data); -void -ata_read_write(struct ccb_ataio *ataio, u_int32_t retries, - void (*cbfcnp)(struct cam_periph *, union ccb *), - u_int8_t tag_action, int readop, - u_int64_t lba, u_int32_t block_count, - u_int8_t *data_ptr, u_int32_t dxfer_len, - u_int32_t timeout); - #endif ==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_da.c#4 (text+ko) ==== @@ -68,9 +68,8 @@ typedef enum { DA_FLAG_PACK_INVALID = 0x001, - DA_FLAG_NEW_PACK = 0x002, - DA_FLAG_PACK_LOCKED = 0x004, - DA_FLAG_PACK_REMOVABLE = 0x008, + DA_FLAG_CAN_48BIT = 0x002, + DA_FLAG_CAN_FLUSHCACHE = 0x004, DA_FLAG_TAGGED_QUEUING = 0x010, DA_FLAG_NEED_OTAG = 0x020, DA_FLAG_WENT_IDLE = 0x040, @@ -246,23 +245,9 @@ softc->flags &= ~DA_FLAG_PACK_INVALID; } - error = 0;//dagetcapacity(periph); - - if (error == 0) { - -// if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && -// (softc->quirks & DA_Q_NO_PREVENT) == 0) -// daprevent(periph, PR_PREVENT); - } else - softc->flags &= ~DA_FLAG_OPEN; - cam_periph_unhold(periph); cam_periph_unlock(periph); - - if (error != 0) { - cam_periph_release(periph); - } - return (error); + return (0); } static int @@ -608,8 +593,11 @@ LIST_INIT(&softc->pending_ccbs); softc->state = DA_STATE_NORMAL; bioq_init(&softc->bio_queue); -// if (SID_IS_REMOVABLE(&cgd->inq_data)) -// softc->flags |= DA_FLAG_PACK_REMOVABLE; + + if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) + softc->flags |= DA_FLAG_CAN_48BIT; + if (cgd->ident_data.support.command2 & ATA_SUPPORT_FLUSHCACHE) + softc->flags |= DA_FLAG_CAN_FLUSHCACHE; // if ((cgd->inq_data.flags & SID_CmdQue) != 0) // softc->flags |= DA_FLAG_TAGGED_QUEUING; @@ -652,8 +640,8 @@ softc->disk->d_maxsize = 256*1024; softc->disk->d_unit = periph->unit_number; softc->disk->d_flags = 0; -// if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) -// softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; + if (softc->flags & DA_FLAG_CAN_FLUSHCACHE) + softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; dasetgeom(periph, cgd); dp = &softc->params; @@ -737,6 +725,7 @@ } else if (bp == NULL) { xpt_release_ccb(start_ccb); } else { + struct ccb_ataio *ataio = &start_ccb->ataio; u_int8_t tag_code; bioq_remove(&softc->bio_queue, bp); @@ -751,30 +740,57 @@ switch (bp->bio_cmd) { case BIO_READ: case BIO_WRITE: - ata_read_write(&start_ccb->ataio, - /*retries*/da_retry_count, - /*cbfcnp*/dadone, - /*tag_action*/tag_code, - /*read_op*/bp->bio_cmd == BIO_READ, - /*lba*/bp->bio_pblkno, - /*block_count*/bp->bio_bcount / - softc->params.secsize, - /*data_ptr*/ bp->bio_data, - /*dxfer_len*/ bp->bio_bcount, - /*timeout*/da_default_timeout*1000); + cam_fill_ataio(ataio, + da_retry_count, + dadone, + bp->bio_cmd == BIO_READ ? + CAM_DIR_IN : CAM_DIR_OUT, + tag_code, + bp->bio_data, + bp->bio_bcount, + da_default_timeout*1000); + + ataio->cmd.feature = 0; + ataio->cmd.lba = bp->bio_pblkno; + ataio->cmd.count = bp->bio_bcount / softc->params.secsize; + if ((softc->flags & DA_FLAG_CAN_48BIT) && + (ataio->cmd.lba + ataio->cmd.count >= ATA_MAX_28BIT_LBA || + ataio->cmd.count >= 256)) { + if (bp->bio_cmd == BIO_READ) + ataio->cmd.command = ATA_READ_DMA48; + else + ataio->cmd.command = ATA_WRITE_DMA48; + ataio->cmd.flags = CAM_ATAIO_48BIT; + } else { + if (bp->bio_cmd == BIO_READ) + ataio->cmd.command = ATA_READ_DMA; + else + ataio->cmd.command = ATA_WRITE_DMA; + ataio->cmd.flags = 0; + } + break; -#if 0 case BIO_FLUSH: - scsi_synchronize_cache(&start_ccb->csio, - /*retries*/1, - /*cbfcnp*/dadone, - 0, //MSG_SIMPLE_Q_TAG, - /*begin_lba*/0,/* Cover the whole disk */ - /*lb_count*/0, - SSD_FULL_SIZE, - /*timeout*/da_default_timeout*1000); + cam_fill_ataio(ataio, + 1, + dadone, + CAM_DIR_NONE, + tag_code, + NULL, + 0, + da_default_timeout*1000); + + if (softc->flags & DA_FLAG_CAN_48BIT) { + ataio->cmd.command = ATA_FLUSHCACHE48; + ataio->cmd.flags = CAM_ATAIO_48BIT; + } else { + ataio->cmd.command = ATA_FLUSHCACHE; + ataio->cmd.flags = 0; + } + ataio->cmd.feature = 0; + ataio->cmd.lba = 0; + ataio->cmd.count = 0; break; -#endif } start_ccb->ccb_h.ccb_state = DA_CCB_BUFFER_IO; ==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#6 (text+ko) ==== @@ -709,13 +709,13 @@ if (ccb->ccb_h.func_code == XPT_ATA_IO) { if (bus_dmamap_load(ch->dma.data_tag, slot->dma.data_map, ccb->ataio.data_ptr, ccb->ataio.dxfer_len, - ahci_dmasetprd, slot, BUS_DMA_NOWAIT)) { + ahci_dmasetprd, slot, 0)) { device_printf(dev, "FAILURE - load data\n"); } } else { if (bus_dmamap_load(ch->dma.data_tag, slot->dma.data_map, ccb->csio.data_ptr, ccb->csio.dxfer_len, - ahci_dmasetprd, slot, BUS_DMA_NOWAIT)) { + ahci_dmasetprd, slot, 0)) { device_printf(dev, "FAILURE - load data\n"); } } @@ -1516,7 +1516,6 @@ fis[15] = ATA_A_4BIT; return 20; } else { -// ata_modify_if_48bit(request); fis[0] = 0x27; /* host to device */ // fis[1] = 0x80 | (atadev->unit & 0x0f); fis[1] = 0x80 | (0 & 0x0f); @@ -1526,7 +1525,7 @@ fis[5] = ccb->ataio.cmd.lba >> 8; fis[6] = ccb->ataio.cmd.lba >> 16; fis[7] = ATA_D_LBA; -// if (!(atadev->flags & ATA_D_48BIT_ACTIVE)) + if (!(ccb->ataio.cmd.flags & CAM_ATAIO_48BIT)) fis[7] |= (ATA_D_IBM | (ccb->ataio.cmd.lba >> 24 & 0x0f)); fis[8] = ccb->ataio.cmd.lba >> 24; fis[9] = ccb->ataio.cmd.lba >> 32;