From: Alan Cox Hopefully there is a better long term solution but for now lets favour reliability. Signed-off-by: Alan Cox Signed-off-by: Andrew Morton --- drivers/ata/pata_ali.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff -puN drivers/ata/pata_ali.c~pata_ali-lots-of-problems-still-showing-up-with-small-atapi-dma drivers/ata/pata_ali.c --- a/drivers/ata/pata_ali.c~pata_ali-lots-of-problems-still-showing-up-with-small-atapi-dma +++ a/drivers/ata/pata_ali.c @@ -285,6 +285,21 @@ static void ali_lock_sectors(struct ata_ adev->max_sectors = 255; } +/** + * ali_check_atapi_dma - DMA check for most ALi controllers + * @adev: Device + * + * Called to decide whether commands should be sent by DMA or PIO + */ + +static int ali_check_atapi_dma(struct ata_queued_cmd *qc) +{ + /* If its not a media command, its not worth it */ + if (qc->nbytes < 2048) + return -EOPNOTSUPP; + return 0; +} + static struct scsi_host_template ali_sht = { .module = THIS_MODULE, .name = DRV_NAME, @@ -381,6 +396,7 @@ static struct ata_port_operations ali_c2 .mode_filter = ata_pci_default_filter, .tf_load = ata_tf_load, .tf_read = ata_tf_read, + .check_atapi_dma = ali_check_atapi_dma, .check_status = ata_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, @@ -418,6 +434,7 @@ static struct ata_port_operations ali_c5 .mode_filter = ata_pci_default_filter, .tf_load = ata_tf_load, .tf_read = ata_tf_read, + .check_atapi_dma = ali_check_atapi_dma, .check_status = ata_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, _