2.6.x libata fixes, and ULi ctlr update
PATCH 1/1 2.6.x libata fixes, and ULi ctlr update
see attached changelog and patch.
Please do a
bk pull bk://gkernel.bkbits.net/libata-2.6
This will update the following files:
drivers/scsi/libata-core.c | 52 ++++++++++++++++++++++++++------------------- drivers/scsi/libata-scsi.c | 5 ++++ drivers/scsi/libata.h | 1 drivers/scsi/sata_uli.c | 51 +++++++++++++++++++------------------------- include/linux/libata.h | 2 + 5 files changed, 62 insertions(+), 49 deletions(-)
through these ChangeSets:
<albertcc:tw.ibm.com>:
o [libata] verify ATAPI DMA for a given request is OK
o [libata] PIO error handling improvement
o [libata] use PIO mode for request sense
<stkn:gentoo.org>:
o [libata] add #include (fixes 2.4 alpha build)
Jeff Garzik:
o [libata sata_uli] add 5281 support, fix SATA phy setup for others
drivers/scsi/libata-core.c +31 -21
@@ -28,6 +28,7 @@#include <linux/pci.h> #include <linux/init.h> #include <linux/list.h> +#include <linux/mm.h> #include <linux/highmem.h> #include <linux/spinlock.h> #include <linux/blkdev.h>
@@ -1919,7 +1920,24 @@if (idx) ap->prd[idx -1 ].flags_len |=cpu_to_le32 (ATA_PRD_EOT ); } +/** +* ata_check_atapi_dma - Check whether ATAPI DMA can be supported +* @qc: Metadata associated with taskfile to check +* +* LOCKING: +* RETURNS: 0 when ATAPI DMA can be used +* nonzero otherwise +*/ +int ata_check_atapi_dma (struct ata_queued_cmd *qc) +{ +struct ata_port *ap = qc->ap; +int rc =0 ;/* Assume ATAPI DMA is OK by default */ + +if (ap->ops->check_atapi_dma) + rc = ap->ops->check_atapi_dma (qc); +return rc; +}/** * ata_qc_prep - Prepare taskfile for submission * @qc: Metadata associated with taskfile to be prepared
@@ -2369,6 +2387,9 @@unsigned long timeout =0 ;switch (ap->pio_task_state) { +case PIO_ST_IDLE : +return ; +case PIO_ST :ata_pio_block (ap);break ;
@@ -2385,18 +2406,14 @@case PIO_ST_TMOUT :case PIO_ST_ERR :ata_pio_error (ap); -break ; +return ; } -if ((ap->pio_task_state !=PIO_ST_IDLE ) && - (ap->pio_task_state !=PIO_ST_TMOUT ) && - (ap->pio_task_state !=PIO_ST_ERR )) { -if (timeout) -queue_delayed_work (ata_wq, &ap->pio_task, - timeout); -else -queue_work (ata_wq, &ap->pio_task); - } +if (timeout) +queue_delayed_work (ata_wq, &ap->pio_task, + timeout); +else +queue_work (ata_wq, &ap->pio_task); } static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
@@ -2405,7 +2422,6 @@DECLARE_COMPLETION (wait);struct ata_queued_cmd *qc;unsigned long flags; -int using_pio = dev->flags &ATA_DFLAG_PIO ;int rc;DPRINTK ("ATAPI request sense\n" );
@@ -2426,16 +2442,10 @@ qc->tf.flags |=ATA_TFLAG_ISADDR |ATA_TFLAG_DEVICE ; qc->tf.command =ATA_CMD_PACKET ; -if (using_pio) { - qc->tf.protocol =ATA_PROT_ATAPI ; - qc->tf.lbam = (8 *1024 ) &0xff ; - qc->tf.lbah = (8 *1024 ) >>8 ; - - qc->nbytes =SCSI_SENSE_BUFFERSIZE ; - }else { - qc->tf.protocol =ATA_PROT_ATAPI_DMA ; - qc->tf.feature |=ATAPI_PKT_DMA ; - } + qc->tf.protocol =ATA_PROT_ATAPI ; + qc->tf.lbam = (8 *1024 ) &0xff ; + qc->tf.lbah = (8 *1024 ) >>8 ; + qc->nbytes =SCSI_SENSE_BUFFERSIZE ; qc->waiting = &wait; qc->complete_fn = ata_qc_complete_noop;
drivers/scsi/libata-scsi.c +5 -0
@@ -1294,6 +1294,11 @@int using_pio = (dev->flags &ATA_DFLAG_PIO );int nodata = (cmd->sc_data_direction ==SCSI_DATA_NONE ); +if (!using_pio) +/* Check whether ATAPI DMA is safe */ +if (ata_check_atapi_dma (qc)) + using_pio =1 ; +memcpy (&qc->cdb, scsicmd, qc->ap->cdb_len); qc->complete_fn = atapi_qc_complete;
drivers/scsi/libata.h +1 -0
@@ -38,6 +38,7 @@extern struct ata_queued_cmd *ata_qc_new_init (struct ata_port *ap,struct ata_device *dev);extern int ata_qc_issue (struct ata_queued_cmd *qc); +extern int ata_check_atapi_dma (struct ata_queued_cmd *qc);extern void ata_dev_select (struct ata_port *ap,unsigned int device,unsigned int wait,unsigned int can_sleep);extern void ata_tf_to_host_nolock (struct ata_port *ap,struct ata_taskfile *tf);
drivers/scsi/sata_uli.c +23 -28
113 lines not on this page · raw message
include/linux/libata.h +2 -0
@@ -339,6 +339,8 @@void (*phy_reset) (struct ata_port *ap);void (*post_set_mode) (struct ata_port *ap); +int (*check_atapi_dma) (struct ata_queued_cmd *qc); +void (*bmdma_setup) (struct ata_queued_cmd *qc);void (*bmdma_start) (struct ata_queued_cmd *qc);