From owner-svn-src-stable@FreeBSD.ORG Thu Apr 28 07:22:41 2011 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CF64E1065672; Thu, 28 Apr 2011 07:22:41 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A2FD88FC12; Thu, 28 Apr 2011 07:22:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p3S7MfVM010893; Thu, 28 Apr 2011 07:22:41 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p3S7MfO3010889; Thu, 28 Apr 2011 07:22:41 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201104280722.p3S7MfO3010889@svn.freebsd.org> From: Alexander Motin Date: Thu, 28 Apr 2011 07:22:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r221153 - stable/8/sys/cam/ata X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Apr 2011 07:22:42 -0000 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,