libata update 20040515-1
PATCH 1/1 libata update 20040515-1
The attached patch is what I sent to Linus earlier day, and should appear upstream vaguely soon.
Patches should be based off of 2.6.6-bk + this patch.
drivers/scsi/ata_piix.c +2 -0
@@ -136,6 +136,7 @@ .phy_reset = piix_pata_phy_reset, + .bmdma_setup = ata_bmdma_setup_pio, .bmdma_start = ata_bmdma_start_pio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
@@ -158,6 +159,7 @@ .phy_reset = piix_sata_phy_reset, + .bmdma_setup = ata_bmdma_setup_pio, .bmdma_start = ata_bmdma_start_pio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
drivers/scsi/libata-core.c +80 -51
305 lines not on this page · raw message
drivers/scsi/libata-scsi.c +16 -47
93 lines not on this page · raw message
drivers/scsi/libata.h +0 -1
@@ -44,7 +44,6 @@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); -extern void atapi_start (struct ata_queued_cmd *qc);/* libata-scsi.c */
drivers/scsi/sata_promise.c +14 -8
@@ -74,6 +74,7 @@static u32 pdc_sata_scr_read (struct ata_port *ap,unsigned int sc_reg);static void pdc_sata_scr_write (struct ata_port *ap,unsigned int sc_reg,u32 val);static int pdc_sata_init_one (struct pci_dev *pdev,const struct pci_device_id *ent); +static void pdc_dma_setup (struct ata_queued_cmd *qc);static void pdc_dma_start (struct ata_queued_cmd *qc);static irqreturn_t pdc_interrupt (int irq,void *dev_instance,struct pt_regs *regs);static void pdc_eng_timeout (struct ata_port *ap);
@@ -111,6 +112,7 @@ .check_status = ata_check_status_mmio, .exec_command = pdc_exec_command_mmio, .phy_reset = pdc_phy_reset, + .bmdma_setup = pdc_dma_setup, .bmdma_start = pdc_dma_start, .fill_sg = pdc_fill_sg, .eng_timeout = pdc_eng_timeout,
@@ -285,8 +287,7 @@u8 err_bit = have_err ?ATA_ERR :0 ;/* get drive status; clear intr; complete txn */ -ata_qc_complete (ata_qc_from_tag (ap, ap->active_tag), -ata_wait_idle (ap) | err_bit,0 ); +ata_qc_complete (qc,ata_wait_idle (ap) | err_bit); }static void pdc_eng_timeout (struct ata_port *ap)
@@ -314,8 +315,7 @@switch (qc->tf.protocol) {case ATA_PROT_DMA :printk (KERN_ERR "ata%u: DMA timeout\n" , ap->id); -ata_qc_complete (ata_qc_from_tag (ap, ap->active_tag), -ata_wait_idle (ap) |ATA_ERR ,0 ); +ata_qc_complete (qc,ata_wait_idle (ap) |ATA_ERR );break ;case ATA_PROT_NODATA :
@@ -324,7 +324,7 @@printk (KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x\n" , ap->id, qc->tf.command, drv_stat); -ata_qc_complete (qc, drv_stat,1 ); +ata_qc_complete (qc, drv_stat);break ;default :
@@ -333,7 +333,7 @@printk (KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n" , ap->id, qc->tf.command, drv_stat); -ata_qc_complete (qc, drv_stat,1 ); +ata_qc_complete (qc, drv_stat);break ; }
@@ -366,7 +366,7 @@DPRINTK ("BUS_NODATA (drv_stat 0x%X)\n" , status);if (have_err) status |=ATA_ERR ; -ata_qc_complete (qc, status,0 ); +ata_qc_complete (qc, status); handled =1 ;break ;
@@ -419,7 +419,7 @@struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag); -if (qc && ((qc->flags &ATA_QCFLAG_POLL ) ==0 )) +if (qc && (!(qc->tf.ctl &ATA_NIEN ))) handled +=pdc_host_intr (ap, qc); } }
@@ -429,6 +429,12 @@VPRINTK ("EXIT\n" );return IRQ_RETVAL (handled); +} + +static void pdc_dma_setup (struct ata_queued_cmd *qc) +{ +/* nothing for now. later, we will call standard +* code in libata-core for ATAPI here */ }static void pdc_dma_start (struct ata_queued_cmd *qc)
drivers/scsi/sata_sil.c +1 -0
@@ -129,6 +129,7 @@ .exec_command = ata_exec_command_mmio, .phy_reset = sata_phy_reset, .post_set_mode = sil_post_set_mode, + .bmdma_setup = ata_bmdma_setup_mmio, .bmdma_start = ata_bmdma_start_mmio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
drivers/scsi/sata_sis.c +1 -0
@@ -98,6 +98,7 @@ .check_status = ata_check_status_pio, .exec_command = ata_exec_command_pio, .phy_reset = sata_phy_reset, + .bmdma_setup = ata_bmdma_setup_pio, .bmdma_start = ata_bmdma_start_pio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
drivers/scsi/sata_svw.c +1 -0
@@ -231,6 +231,7 @@ .check_status = k2_stat_check_status, .exec_command = ata_exec_command_mmio, .phy_reset = sata_phy_reset, + .bmdma_setup = ata_bmdma_setup_mmio, .bmdma_start = ata_bmdma_start_mmio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
drivers/scsi/sata_sx4.c +14 -8
@@ -146,6 +146,7 @@static int pdc_sata_init_one (struct pci_dev *pdev,const struct pci_device_id *ent); +static void pdc20621_dma_setup (struct ata_queued_cmd *qc);static void pdc20621_dma_start (struct ata_queued_cmd *qc);static irqreturn_t pdc20621_interrupt (int irq,void *dev_instance,struct pt_regs *regs);static void pdc_eng_timeout (struct ata_port *ap);
@@ -197,6 +198,7 @@ .check_status = ata_check_status_mmio, .exec_command = pdc_exec_command_mmio, .phy_reset = pdc_20621_phy_reset, + .bmdma_setup = pdc20621_dma_setup, .bmdma_start = pdc20621_dma_start, .fill_sg = pdc20621_fill_sg, .eng_timeout = pdc_eng_timeout,
@@ -568,6 +570,12 @@static inline void pdc20621_dump_hdma (struct ata_queued_cmd *qc) { }#endif /* ATA_VERBOSE_DEBUG */ +static void pdc20621_dma_setup (struct ata_queued_cmd *qc) +{ +/* nothing for now. later, we will call standard +* code in libata-core for ATAPI here */ +} +static void pdc20621_dma_start (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;
@@ -681,7 +689,7 @@ status =ata_busy_wait (ap,ATA_BUSY |ATA_DRQ ,1000 );DPRINTK ("BUS_NODATA (drv_stat 0x%X)\n" , status); -ata_qc_complete (qc, status,0 ); +ata_qc_complete (qc, status); handled =1 ; }else {
@@ -740,7 +748,7 @@struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag); -if (qc && ((qc->flags &ATA_QCFLAG_POLL ) ==0 )) +if (qc && (!(qc->tf.ctl &ATA_NIEN ))) handled +=pdc20621_host_intr (ap, qc, (i >4 ), mmio_base); }
@@ -762,8 +770,7 @@u8 err_bit = have_err ?ATA_ERR :0 ;/* get drive status; clear intr; complete txn */ -ata_qc_complete (ata_qc_from_tag (ap, ap->active_tag), -ata_wait_idle (ap) | err_bit,0 ); +ata_qc_complete (qc,ata_wait_idle (ap) | err_bit); }static void pdc_eng_timeout (struct ata_port *ap)
@@ -791,8 +798,7 @@switch (qc->tf.protocol) {case ATA_PROT_DMA :printk (KERN_ERR "ata%u: DMA timeout\n" , ap->id); -ata_qc_complete (ata_qc_from_tag (ap, ap->active_tag), -ata_wait_idle (ap) |ATA_ERR ,0 ); +ata_qc_complete (qc,ata_wait_idle (ap) |ATA_ERR );break ;case ATA_PROT_NODATA :
@@ -801,7 +807,7 @@printk (KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x\n" , ap->id, qc->tf.command, drv_stat); -ata_qc_complete (qc, drv_stat,1 ); +ata_qc_complete (qc, drv_stat);break ;default :
@@ -810,7 +816,7 @@printk (KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n" , ap->id, qc->tf.command, drv_stat); -ata_qc_complete (qc, drv_stat,1 ); +ata_qc_complete (qc, drv_stat);break ; }
drivers/scsi/sata_via.c +1 -0
@@ -106,6 +106,7 @@ .phy_reset = sata_phy_reset, + .bmdma_setup = ata_bmdma_setup_pio, .bmdma_start = ata_bmdma_start_pio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
drivers/scsi/sata_vsc.c +2 -1
@@ -175,7 +175,7 @@struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag); -if (qc && ((qc->flags &ATA_QCFLAG_POLL ) ==0 )) +if (qc && (!(qc->tf.ctl &ATA_NIEN ))) handled +=ata_host_intr (ap, qc); } }
@@ -213,6 +213,7 @@ .exec_command = ata_exec_command_mmio, .check_status = ata_check_status_mmio, .phy_reset = sata_phy_reset, + .bmdma_setup = ata_bmdma_setup_mmio, .bmdma_start = ata_bmdma_start_mmio, .fill_sg = ata_fill_sg, .eng_timeout = ata_eng_timeout,
include/linux/libata.h +10 -2
@@ -112,7 +112,6 @@ATA_QCFLAG_DMA = (1 <<2 ),/* data delivered via DMA */ ATA_QCFLAG_ATAPI = (1 <<3 ),/* is ATAPI packet command? */ ATA_QCFLAG_SG = (1 <<4 ),/* have s/g table? */ -ATA_QCFLAG_POLL = (1 <<5 ),/* polling, no interrupts */ /* various lengths of time */ ATA_TMOUT_EDD = 5 * HZ, /* hueristic */
@@ -335,6 +334,7 @@void (*phy_reset) (struct ata_port *ap);void (*post_set_mode) (struct ata_port *ap); +void (*bmdma_setup) (struct ata_queued_cmd *qc);void (*bmdma_start) (struct ata_queued_cmd *qc);void (*fill_sg) (struct ata_queued_cmd *qc);void (*eng_timeout) (struct ata_port *ap);
@@ -397,10 +397,12 @@extern void ata_port_stop (struct ata_port *ap);extern irqreturn_t ata_interrupt (int irq,void *dev_instance,struct pt_regs *regs);extern void ata_fill_sg (struct ata_queued_cmd *qc); +extern void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc);extern void ata_bmdma_start_mmio (struct ata_queued_cmd *qc); +extern void ata_bmdma_setup_pio (struct ata_queued_cmd *qc);extern void ata_bmdma_start_pio (struct ata_queued_cmd *qc);extern int pci_test_config_bits (struct pci_dev *pdev,struct pci_bits *bits); -extern void ata_qc_complete (struct ata_queued_cmd *qc,u8 drv_stat,unsigned int done_late); +extern void ata_qc_complete (struct ata_queued_cmd *qc,u8 drv_stat);extern void ata_eng_timeout (struct ata_port *ap); extern int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
@@ -471,6 +473,12 @@ }return status; +} + +static inline void ata_qc_set_polling (struct ata_queued_cmd *qc) +{ + qc->flags &= ~ATA_QCFLAG_DMA ; + qc->tf.ctl |=ATA_NIEN ; } static inline struct ata_queued_cmd *ata_qc_from_tag (struct ata_port *ap,