PDC202xx_old driver is broken in Linux 2.6

At some point, I started noticing my system (MSI BXMaster) would completely freeze under heavy disk load. After watching the logs, I would see something akin to the following:

Mar 11 17:27:19 dbz kernel: hdg: dma_timer_expiry: dma status == 0x60
Mar 11 17:27:19 dbz kernel: hdg: DMA timeout retry
Mar 11 17:27:19 dbz kernel: PDC202XX: Secondary channel reset.
Mar 11 17:27:19 dbz kernel: PDC202XX: Primary channel reset.
Mar 11 17:27:19 dbz kernel: hdg: timeout waiting for DMA
Mar 11 17:27:40 dbz kernel: hdg: dma_timer_expiry: dma status == 0x60
Mar 11 17:27:40 dbz kernel: hdg: DMA timeout retry
Mar 11 17:27:40 dbz kernel: PDC202XX: Secondary channel reset.
Mar 11 17:27:40 dbz kernel: PDC202XX: Primary channel reset.
Mar 11 17:27:40 dbz kernel: hdg: timeout waiting for DMA
Mar 11 17:28:02 dbz kernel: hdg: dma_timer_expiry: dma status == 0x60
Mar 11 17:28:02 dbz kernel: hdg: DMA timeout retry
Mar 11 17:28:02 dbz kernel: PDC202XX: Secondary channel reset.
Mar 11 17:28:02 dbz kernel: PDC202XX: Primary channel reset.
Mar 11 17:28:02 dbz kernel: hdg: timeout waiting for DMA
Mar 11 17:28:22 dbz kernel: hdg: dma_timer_expiry: dma status == 0x60
Mar 11 17:28:22 dbz kernel: hdg: DMA timeout retry
Mar 11 17:28:22 dbz kernel: PDC202XX: Secondary channel reset.
Mar 11 17:28:22 dbz kernel: PDC202XX: Primary channel reset.
Mar 11 17:28:22 dbz kernel: hdg: timeout waiting for DMA

Well, I was unable to find a 2.6 kernel that would work reliabily on my Promise chip (PDC20265), I went back several versions.

The fix is to NOT use the pdc202xx_old driver, but instead use the libata driver for old Promise chips (CONFIG_PATA_PDC_OLD=y). You will probably need to recompile your kernel for this because distribution kernels are not using libata yet.

Also, this will change your disk devices from /dev/hdX to /dev/sdX so be sure to update your /etc/fstab correspondingly.

If your distribution kernel includes CONFIG_PATA_PDC_OLD=m, you can use this by adding it to the initrd image. For initramfs-tools, the file /etc/initramfs-tools/modules should exist. Edit it, and add “pata_pdc202xx_old” without the quotes on a new line. Run update-initramfs -k all -u and you should be all set. This preloads the libata driver during the initrd, so that the faulty pdc202xx_old driver cannot be loaded later.

Leave a Reply