svn commit: r221153 - stable/8/sys/cam/ata
Alexander Motin
mav at FreeBSD.org
Thu Apr 28 07:22:41 UTC 2011
Author: mav
Date: Thu Apr 28 07:22:41 2011
New Revision: 221153
URL: http://svn.freebsd.org/changeset/base/221153
Log:
MFC r220886:
Add basic support for DMA-capable ATA disks on DMA-incapable controller.
This is really rare situation these days, but still may happen in embedded.
Modified:
stable/8/sys/cam/ata/ata_all.h
stable/8/sys/cam/ata/ata_da.c
stable/8/sys/cam/ata/ata_xpt.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/cam/ata/ata_all.h
==============================================================================
--- stable/8/sys/cam/ata/ata_all.h Thu Apr 28 07:21:01 2011 (r221152)
+++ stable/8/sys/cam/ata/ata_all.h Thu Apr 28 07:22:41 2011 (r221153)
@@ -35,6 +35,8 @@ struct ccb_ataio;
struct cam_periph;
union ccb;
+#define SID_DMA 0x10 /* Abuse inq_flags bit to track enabled DMA. */
+
struct ata_cmd {
u_int8_t flags; /* ATA command flags */
#define CAM_ATAIO_48BIT 0x01 /* Command has 48-bit format */
Modified: stable/8/sys/cam/ata/ata_da.c
==============================================================================
--- stable/8/sys/cam/ata/ata_da.c Thu Apr 28 07:21:01 2011 (r221152)
+++ stable/8/sys/cam/ata/ata_da.c Thu Apr 28 07:22:41 2011 (r221153)
@@ -737,7 +737,8 @@ adaregister(struct cam_periph *periph, v
bioq_init(&softc->bio_queue);
bioq_init(&softc->trim_queue);
- if (cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA)
+ if (cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA &&
+ (cgd->inq_flags & SID_DMA))
softc->flags |= ADA_FLAG_CAN_DMA;
if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48)
softc->flags |= ADA_FLAG_CAN_48BIT;
@@ -746,7 +747,7 @@ adaregister(struct cam_periph *periph, v
if (cgd->ident_data.support.command1 & ATA_SUPPORT_POWERMGT)
softc->flags |= ADA_FLAG_CAN_POWERMGT;
if (cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ &&
- cgd->inq_flags & SID_CmdQue)
+ (cgd->inq_flags & SID_DMA) && (cgd->inq_flags & SID_CmdQue))
softc->flags |= ADA_FLAG_CAN_NCQ;
if (cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) {
softc->flags |= ADA_FLAG_CAN_TRIM;
Modified: stable/8/sys/cam/ata/ata_xpt.c
==============================================================================
--- stable/8/sys/cam/ata/ata_xpt.c Thu Apr 28 07:21:01 2011 (r221152)
+++ stable/8/sys/cam/ata/ata_xpt.c Thu Apr 28 07:22:41 2011 (r221153)
@@ -388,6 +388,11 @@ negotiate:
/* If SIM disagree - renegotiate. */
if (mode != wantmode)
goto negotiate;
+ /* Remember what transport thinks about DMA. */
+ if (mode < ATA_DMA)
+ path->device->inq_flags &= ~SID_DMA;
+ else
+ path->device->inq_flags |= SID_DMA;
cam_fill_ataio(ataio,
1,
probedone,
More information about the svn-src-all
mailing list