]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ata: pata_via: Force PIO for ATAPI devices on VT6415/VT6330
authorTasos Sahanidis <tasos@tasossah.com>
Mon, 19 May 2025 08:49:45 +0000 (11:49 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:04:13 +0000 (11:04 +0100)
commit d29fc02caad7f94b62d56ee1b01c954f9c961ba7 upstream.

The controller has a hardware bug that can hard hang the system when
doing ATAPI DMAs without any trace of what happened. Depending on the
device attached, it can also prevent the system from booting.

In this case, the system hangs when reading the ATIP from optical media
with cdrecord -vvv -atip on an _NEC DVD_RW ND-4571A 1-01 and an
Optiarc DVD RW AD-7200A 1.06 attached to an ASRock 990FX Extreme 4,
running at UDMA/33.

The issue can be reproduced by running the same command with a cygwin
build of cdrecord on WinXP, although it requires more attempts to cause
it. The hang in that case is also resolved by forcing PIO. It doesn't
appear that VIA has produced any drivers for that OS, thus no known
workaround exists.

HDDs attached to the controller do not suffer from any DMA issues.

Cc: stable@vger.kernel.org
Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/916677
Signed-off-by: Tasos Sahanidis <tasos@tasossah.com>
Link: https://lore.kernel.org/r/20250519085508.1398701-1-tasos@tasossah.com
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/ata/pata_via.c

index 38044e67979515da17036516b929b153b0a96c10..e5c4d954514d5bde7b0e12707787d523f3c824f4 100644 (file)
@@ -368,7 +368,8 @@ static unsigned long via_mode_filter(struct ata_device *dev, unsigned long mask)
        }
 
        if (dev->class == ATA_DEV_ATAPI &&
-           dmi_check_system(no_atapi_dma_dmi_table)) {
+           (dmi_check_system(no_atapi_dma_dmi_table) ||
+            config->id == PCI_DEVICE_ID_VIA_6415)) {
                ata_dev_warn(dev, "controller locks up on ATAPI DMA, forcing PIO\n");
                mask &= ATA_MASK_PIO;
        }