From patchwork Tue Jul 14 11:28:33 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arne Fitzenreiter X-Patchwork-Id: 495036 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id AA9D3140319 for ; Tue, 14 Jul 2015 21:34:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753492AbbGNLex (ORCPT ); Tue, 14 Jul 2015 07:34:53 -0400 Received: from mail01.ipfire.org ([178.63.73.247]:56160 "EHLO mail01.ipfire.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753533AbbGNLew (ORCPT ); Tue, 14 Jul 2015 07:34:52 -0400 Received: from SuperSSpeed.localdomain (p5B25D58B.dip0.t-ipconnect.de [91.37.213.139]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail01.ipfire.org (Postfix) with ESMTPSA id DD69D21B2; Tue, 14 Jul 2015 13:28:47 +0200 (CEST) From: Arne Fitzenreiter To: tj@kernel.org Cc: linux-ide@vger.kernel.org, Arne Fitzenreiter Subject: [PATCH 1/2] libata: add ATA_HORKAGE_NOTRIM Date: Tue, 14 Jul 2015 13:28:33 +0200 Message-Id: <1436873314-22563-2-git-send-email-arne_f@ipfire.org> X-Mailer: git-send-email 2.4.4 In-Reply-To: <1436873314-22563-1-git-send-email-arne_f@ipfire.org> References: <1436873314-22563-1-git-send-email-arne_f@ipfire.org> Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org sone disks lose data at trim also with disabled ncq so this add a switch to force disable trim. Signed-off-by:.... --- drivers/ata/libata-scsi.c | 14 ++++++++------ drivers/ata/libata-transport.c | 2 ++ include/linux/libata.h | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 3131adc..cc80e4d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -2569,12 +2569,14 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf) rbuf[15] = lowest_aligned; if (ata_id_has_trim(args->id)) { - rbuf[14] |= 0x80; /* LBPME */ - - if (ata_id_has_zero_after_trim(args->id) && - dev->horkage & ATA_HORKAGE_ZERO_AFTER_TRIM) { - ata_dev_info(dev, "Enabling discard_zeroes_data\n"); - rbuf[14] |= 0x40; /* LBPRZ */ + if (!(dev->horkage & ATA_HORKAGE_NOTRIM)) { + rbuf[14] |= 0x80; /* LBPME */ + + if (ata_id_has_zero_after_trim(args->id) && + dev->horkage & ATA_HORKAGE_ZERO_AFTER_TRIM) { + ata_dev_info(dev, "Enabling discard_zeroes_data\n"); + rbuf[14] |= 0x40; /* LBPRZ */ + } } } } diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c index d6c37bc..3a13c7d 100644 --- a/drivers/ata/libata-transport.c +++ b/drivers/ata/libata-transport.c @@ -569,6 +569,8 @@ show_ata_dev_trim(struct device *dev, if (!ata_id_has_trim(ata_dev->id)) mode = "unsupported"; + else if (ata_dev->horkage & ATA_HORKAGE_NOTRIM) + mode = "forced_unsupported"; else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) mode = "forced_unqueued"; else if (ata_fpdma_dsm_supported(ata_dev)) diff --git a/include/linux/libata.h b/include/linux/libata.h index 36ce37b..5c8bac6 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -431,6 +431,8 @@ enum { ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21), /* some WDs have broken LPM */ ATA_HORKAGE_ZERO_AFTER_TRIM = (1 << 22),/* guarantees zero after trim */ ATA_HORKAGE_NO_NCQ_LOG = (1 << 23), /* don't use NCQ for log read */ + ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */ + /* DMA mask for user DMA control: User visible values; DO NOT renumber */