Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 966fbe19 authored by Vincent Pelletier's avatar Vincent Pelletier Committed by Tejun Heo
Browse files

libata: Add atapi_dmadir force flag



Some device require DMADIR to be enabled, but are not detected as such
by atapi_id_dmadir.  One such example is "Asus Serillel 2"
SATA-host-to-PATA-device bridge: the bridge itself requires DMADIR,
even if the bridged device does not.

As atapi_dmadir module parameter can cause problems with some devices
(as per Tejun Heo's memory), enabling it globally may not be possible
depending on the hardware.

This patch adds atapi_dmadir in the form of a "force" horkage value,
allowing global, per-bus and per-device control.

Signed-off-by: default avatarVincent Pelletier <plr.vincent@gmail.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent e628dc99
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1456,6 +1456,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.

			* dump_id: dump IDENTIFY data.

			* atapi_dmadir: Enable ATAPI DMADIR bridge support

			If there are multiple matching configurations changing
			the same attribute, the last one is used.

+2 −1
Original line number Diff line number Diff line
@@ -2395,7 +2395,7 @@ int ata_dev_configure(struct ata_device *dev)
			cdb_intr_string = ", CDB intr";
		}

		if (atapi_dmadir || atapi_id_dmadir(dev->id)) {
		if (atapi_dmadir || (dev->horkage & ATA_HORKAGE_ATAPI_DMADIR) || atapi_id_dmadir(dev->id)) {
			dev->flags |= ATA_DFLAG_DMADIR;
			dma_dir_string = ", DMADIR";
		}
@@ -6496,6 +6496,7 @@ static int __init ata_parse_force_one(char **cur,
		{ "nosrst",	.lflags		= ATA_LFLAG_NO_SRST },
		{ "norst",	.lflags		= ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
		{ "rstonce",	.lflags		= ATA_LFLAG_RST_ONCE },
		{ "atapi_dmadir", .horkage_on	= ATA_HORKAGE_ATAPI_DMADIR },
	};
	char *start = *cur, *p = *cur;
	char *id, *val, *endp;
+1 −0
Original line number Diff line number Diff line
@@ -399,6 +399,7 @@ enum {
	ATA_HORKAGE_BROKEN_FPDMA_AA	= (1 << 15),	/* skip AA */
	ATA_HORKAGE_DUMP_ID	= (1 << 16),	/* dump IDENTIFY data */
	ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17),	/* Set max sects to 65535 */
	ATA_HORKAGE_ATAPI_DMADIR = (1 << 18),	/* device requires dmadir */

	 /* DMA mask for user DMA control: User visible values; DO NOT
	    renumber */