libata: prep for new EH, take 2
PATCH 1/1 libata: prep for new EH, take 2
Hello, Jeff, Alan and Albert.
This is the second take of prep-for-new-EH patchset. Last take[1] contained 14 patches and, except for %04, all patches got ACKed. Changes from the last take are...
* %04 is splitted into two patches #04 clean-up-constants and #05 rename-ATA_FLAG_PORT_DISABLED. And definition of ATA_DFLAG_CFG_MASK is moved into #06 where it's used.
* #15 make-routines-extern patch does not make ata_set_sata_spd() extern anymore. As SATA SPD configuration is moved into hardreset EH doesn't need to access the function directly.
This patchset is against
#upstream [2]
+ improve-ata_bus_probe-failure-handling patchset, take 2 [3]
Thanks.
--
tejun
[1] http://article.gmane.org/gmane.linux.ide/9203
[2] 852ee16a914fb3ada2f81e222677c04defc2f15f
[3] http://article.gmane.org/gmane.linux.ide/9252
PATCH 1/15 libata: report device number when PIO fails
Report device number on PIO failure.
---
drivers/scsi/libata-core.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
531b46c6b78b8b702ffb87b7042816260b54fd23
drivers/scsi/libata-core.c +2 -1
@@ -3904,7 +3904,8 @@ static void ata_pio_error(struct ata_porWARN_ON (qc ==NULL );if (qc->tf.command !=ATA_CMD_PACKET ) -printk (KERN_WARNING "ata%u: PIO error\n" , ap->id); +printk (KERN_WARNING "ata%u: dev %u PIO error\n" , + ap->id, qc->dev->devno);/* make sure qc->err_mask is available to * know what's wrong and recover
Signature · 1 line
1.2.4
PATCH 2/15 libata: ata_dev_revalidate() printk update
In reply to Tejun HeoMake sure ata_dev_revalidate() complains on failures and kill revalidation failure message printed from ata_dev_set_mode().
---
drivers/scsi/libata-core.c | 23 ++++++++++------------- 1 files changed, 10 insertions(+), 13 deletions(-)
e6d04fab401570aa78c946ab3ddf2e923a2f64ac
drivers/scsi/libata-core.c +10 -13
@@ -1961,12 +1961,8 @@ static int ata_dev_set_mode(struct ata_p } rc =ata_dev_revalidate (ap, dev,0 ); -if (rc) { -printk (KERN_ERR -"ata%u: failed to revalidate after set xfermode\n" , - ap->id); +if (rc)return rc; - }DPRINTK ("xfer_shift=%u, xfer_mode=0x%x\n" , dev->xfer_shift, (int )dev->xfer_mode);
@@ -2781,15 +2777,14 @@ static int ata_dev_same_device(struct atint ata_dev_revalidate (struct ata_port *ap,struct ata_device *dev,int post_reset) { -unsigned int class; -u16 *id; +unsigned int class = dev->class; +u16 *id =NULL ;int rc; -if (!ata_dev_enabled (dev)) -return -ENODEV ; - - class = dev->class; - id =NULL ; +if (!ata_dev_enabled (dev)) { + rc = -ENODEV ; + goto fail; + }/* allocate & read ID data */ rc =ata_dev_read_id (ap, dev, &class, post_reset, &id);
@@ -2806,7 +2801,9 @@ int ata_dev_revalidate(struct ata_port * dev->id = id;/* configure device according to the new ID */ -return ata_dev_configure (ap, dev,0 ); + rc =ata_dev_configure (ap, dev,0 ); +if (rc ==0 ) +return 0 ; fail: printk(KERN_ERR "ata%u: dev %u revalidation failed (errno=%d)\n",
Signature · 1 line
1.2.4
PATCH 3/15 libata: ATA_FLAG_IN_EH is not used, kill it
In reply to Tejun HeoKill unused flag ATA_FLAG_IN_EH.
---
drivers/scsi/libata-scsi.c | 17 ++++------------- include/linux/libata.h | 1 - 2 files changed, 4 insertions(+), 14 deletions(-)
ba36d3e3f4b1dba269a1c09f48f3131d287181ca
drivers/scsi/libata-scsi.c +4 -13
@@ -779,20 +779,15 @@ enum scsi_eh_timer_return ata_scsi_timedint ata_scsi_error (struct Scsi_Host *host) { -struct ata_port *ap; -unsigned long flags; +struct ata_port *ap = (struct ata_port *)&host->hostdata[0 ];DPRINTK ("ENTER\n" ); - ap = (struct ata_port *) &host->hostdata[0 ]; +/* synchronize with IRQ handler and port task */ +spin_unlock_wait (&ap->host_set->lock); +ata_port_flush_task (ap); -spin_lock_irqsave (&ap->host_set->lock, flags); -WARN_ON (ap->flags &ATA_FLAG_IN_EH ); - ap->flags |=ATA_FLAG_IN_EH ;WARN_ON (ata_qc_from_tag (ap, ap->active_tag) ==NULL ); -spin_unlock_irqrestore (&ap->host_set->lock, flags); - -ata_port_flush_task (ap); ap->ops->eng_timeout (ap);
@@ -800,10 +795,6 @@ int ata_scsi_error(struct Scsi_Host *hosscsi_eh_flush_done_q (&ap->eh_done_q); -spin_lock_irqsave (&ap->host_set->lock, flags); - ap->flags &= ~ATA_FLAG_IN_EH ; -spin_unlock_irqrestore (&ap->host_set->lock, flags); -DPRINTK ("EXIT\n" );return 0 ; }
include/linux/libata.h +0 -1
@@ -152,7 +152,6 @@ enum {ATA_FLAG_IRQ_MASK = (1 <<14 ),/* Mask IRQ in PIO xfers */ ATA_FLAG_FLUSH_PORT_TASK = (1 <<15 ),/* Flush port task */ -ATA_FLAG_IN_EH = (1 <<16 ),/* EH in progress */ ATA_QCFLAG_ACTIVE = (1 <<1 ),/* cmd not yet ack'd to scsi lyer */ ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */
Signature · 1 line
1.2.4
PATCH 4/15 libata: clean up constants
In reply to Tejun Heo* Reorder ATA_DFLAG_* such that feature flags determined by ata_dev_configure() are on lower bits. Reserve lower eight bits for this purpose and allocate dynamic flags from bit 8.
* Reorder ATA_FLAG_* such that feature flags determined during driver initiailization are on bits 0:15, dynamic flags on 16:23 and LLDD specific flags on 24:31.
* Kill trailing white space and lower-case an one line comment for consistency.
---
include/linux/libata.h | 61 +++++++++++++++++++++++++----------------------- 1 files changed, 32 insertions(+), 29 deletions(-)
709989f4987b39757c9014e6259b3562be502923
include/linux/libata.h +32 -29
@@ -120,9 +120,10 @@ enum {ATA_SHT_USE_CLUSTERING =1 ,/* struct ata_device stuff */ -ATA_DFLAG_LBA48 = (1 <<0 ),/* device supports LBA48 */ -ATA_DFLAG_PIO = (1 <<1 ),/* device currently in PIO mode */ -ATA_DFLAG_LBA = (1 <<2 ),/* device supports LBA */ +ATA_DFLAG_LBA = (1 <<0 ),/* device supports LBA */ +ATA_DFLAG_LBA48 = (1 <<1 ),/* device supports LBA48 */ + +ATA_DFLAG_PIO = (1 <<8 ),/* device currently in PIO mode */ ATA_DEV_UNKNOWN =0 ,/* unknown device */ ATA_DEV_ATA = 1, /* ATA device */
@@ -132,32 +133,34 @@ enum {ATA_DEV_NONE =5 ,/* no device */ /* struct ata_port flags */ -ATA_FLAG_SLAVE_POSS = (1 <<1 ),/* host supports slave dev */ +ATA_FLAG_SLAVE_POSS = (1 <<0 ),/* host supports slave dev */ /* (doesn't imply presence) */ -ATA_FLAG_PORT_DISABLED = (1 <<2 ),/* port is disabled, ignore it */ -ATA_FLAG_SATA = (1 <<3 ), -ATA_FLAG_NO_LEGACY = (1 <<4 ),/* no legacy mode check */ -ATA_FLAG_SRST = (1 <<5 ),/* (obsolete) use ATA SRST, not E.D.D. */ -ATA_FLAG_MMIO = (1 <<6 ),/* use MMIO, not PIO */ -ATA_FLAG_SATA_RESET = (1 <<7 ),/* (obsolete) use COMRESET */ -ATA_FLAG_PIO_DMA = (1 <<8 ),/* PIO cmds via DMA */ -ATA_FLAG_NOINTR = (1 <<9 ),/* FIXME: Remove this once -* proper HSM is in place. */ -ATA_FLAG_DEBUGMSG = (1 <<10 ), -ATA_FLAG_NO_ATAPI = (1 <<11 ),/* No ATAPI support */ - -ATA_FLAG_SUSPENDED = (1 <<12 ),/* port is suspended */ - -ATA_FLAG_PIO_LBA48 = (1 <<13 ),/* Host DMA engine is LBA28 only */ -ATA_FLAG_IRQ_MASK = (1 <<14 ),/* Mask IRQ in PIO xfers */ - -ATA_FLAG_FLUSH_PORT_TASK = (1 <<15 ),/* Flush port task */ - -ATA_QCFLAG_ACTIVE = (1 <<1 ),/* cmd not yet ack'd to scsi lyer */ -ATA_QCFLAG_SG = (1 <<3 ),/* have s/g table? */ -ATA_QCFLAG_SINGLE = (1 <<4 ),/* no s/g, just a single buffer */ +ATA_FLAG_SATA = (1 <<1 ), +ATA_FLAG_NO_LEGACY = (1 <<2 ),/* no legacy mode check */ +ATA_FLAG_MMIO = (1 <<3 ),/* use MMIO, not PIO */ +ATA_FLAG_SRST = (1 <<4 ),/* (obsolete) use ATA SRST, not E.D.D. */ +ATA_FLAG_SATA_RESET = (1 <<5 ),/* (obsolete) use COMRESET */ +ATA_FLAG_NO_ATAPI = (1 <<6 ),/* No ATAPI support */ +ATA_FLAG_PIO_DMA = (1 <<7 ),/* PIO cmds via DMA */ +ATA_FLAG_PIO_LBA48 = (1 <<8 ),/* Host DMA engine is LBA28 only */ +ATA_FLAG_IRQ_MASK = (1 <<9 ),/* Mask IRQ in PIO xfers */ + +ATA_FLAG_NOINTR = (1 <<16 ),/* FIXME: Remove this once +* proper HSM is in place. */ +ATA_FLAG_DEBUGMSG = (1 <<17 ), +ATA_FLAG_FLUSH_PORT_TASK = (1 <<18 ),/* flush port task */ + +ATA_FLAG_PORT_DISABLED = (1 <<19 ),/* port is disabled, ignore it */ +ATA_FLAG_SUSPENDED = (1 <<20 ),/* port is suspended */ + +/* bits 24:31 of ap->flags are reserved for LLDD specific flags */ + +/* struct ata_queued_cmd flags */ +ATA_QCFLAG_ACTIVE = (1 <<0 ),/* cmd not yet ack'd to scsi lyer */ +ATA_QCFLAG_SG = (1 <<1 ),/* have s/g table? */ +ATA_QCFLAG_SINGLE = (1 <<2 ),/* no s/g, just a single buffer */ ATA_QCFLAG_DMAMAP =ATA_QCFLAG_SG |ATA_QCFLAG_SINGLE , -ATA_QCFLAG_EH_SCHEDULED = (1 <<5 ),/* EH scheduled */ +ATA_QCFLAG_EH_SCHEDULED = (1 <<3 ),/* EH scheduled */ /* host set flags */ ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host_set only */
@@ -206,8 +209,8 @@ enum {/* size of buffer to pad xfers ending on unaligned boundaries */ ATA_DMA_PAD_SZ =4 ,ATA_DMA_PAD_BUF_SZ =ATA_DMA_PAD_SZ *ATA_MAX_QUEUE , - -/* Masks for port functions */ + +/* masks for port functions */ ATA_PORT_PRIMARY = (1 <<0 ), ATA_PORT_SECONDARY = (1 << 1),
Signature · 1 line
1.2.4
PATCH 5/15 libata: rename ATA_FLAG_PORT_DISABLED to ATA_FLAG_DISABLED
In reply to Tejun HeoRename ATA_FLAG_PORT_DISABLED to ATA_FLAG_DISABLED for consistency. (ATA_FLAG_* are always about ports).
---
drivers/scsi/libata-core.c | 18 +++++++++--------- drivers/scsi/libata-scsi.c | 2 +- drivers/scsi/pdc_adma.c | 4 ++-- drivers/scsi/sata_mv.c | 2 +- drivers/scsi/sata_nv.c | 2 +- drivers/scsi/sata_promise.c | 2 +- drivers/scsi/sata_qstor.c | 4 ++-- drivers/scsi/sata_sil24.c | 2 +- drivers/scsi/sata_sx4.c | 2 +- drivers/scsi/sata_vsc.c | 2 +- include/linux/libata.h | 2 +- 11 files changed, 21 insertions(+), 21 deletions(-)
2b19632cea54d24625d42ff36b87e89ff36ffe05
drivers/scsi/libata-core.c +9 -9
@@ -1045,7 +1045,7 @@ ata_exec_internal(struct ata_port *ap, s* * Kill the following code as soon as those drivers are fixed. */ -if (ap->flags &ATA_FLAG_PORT_DISABLED ) { +if (ap->flags &ATA_FLAG_DISABLED ) { err_mask |=AC_ERR_SYSTEM ;ata_port_probe (ap); }
@@ -1395,7 +1395,7 @@ static int ata_bus_probe(struct ata_port }else { ap->ops->phy_reset (ap); -if (!(ap->flags &ATA_FLAG_PORT_DISABLED )) +if (!(ap->flags &ATA_FLAG_DISABLED ))for (i =0 ; i <ATA_MAX_DEVICES ; i++) classes[i] = ap->device[i].class;
@@ -1491,7 +1491,7 @@ static int ata_bus_probe(struct ata_portvoid ata_port_probe (struct ata_port *ap) { - ap->flags &= ~ATA_FLAG_PORT_DISABLED ; + ap->flags &= ~ATA_FLAG_DISABLED ; }/**
@@ -1565,7 +1565,7 @@ void __sata_phy_reset(struct ata_port *aelse ata_port_disable (ap); -if (ap->flags &ATA_FLAG_PORT_DISABLED ) +if (ap->flags &ATA_FLAG_DISABLED )return ;if (ata_busy_sleep (ap,ATA_TMOUT_BOOT_QUICK ,ATA_TMOUT_BOOT )) {
@@ -1590,7 +1590,7 @@ void __sata_phy_reset(struct ata_port *avoid sata_phy_reset (struct ata_port *ap) {__sata_phy_reset (ap); -if (ap->flags &ATA_FLAG_PORT_DISABLED ) +if (ap->flags &ATA_FLAG_DISABLED )return ;ata_bus_reset (ap); }
@@ -1629,7 +1629,7 @@ void ata_port_disable(struct ata_port *a { ap->device[0 ].class =ATA_DEV_NONE ; ap->device[1 ].class =ATA_DEV_NONE ; - ap->flags |=ATA_FLAG_PORT_DISABLED ; + ap->flags |=ATA_FLAG_DISABLED ; }/**
@@ -2251,7 +2251,7 @@ static unsigned int ata_bus_softreset(st* Obtains host_set lock. * * SIDE EFFECTS: -* Sets ATA_FLAG_PORT_DISABLED if bus reset fails. +* Sets ATA_FLAG_DISABLED if bus reset fails. */ void ata_bus_reset (struct ata_port *ap)
@@ -4463,7 +4463,7 @@ irqreturn_t ata_interrupt (int irq, void ap = host_set->ports[i];if (ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + !(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag);
@@ -4684,7 +4684,7 @@ static void ata_host_init(struct ata_por host->unique_id = ata_unique_id++; host->max_cmd_len =12 ; - ap->flags =ATA_FLAG_PORT_DISABLED ; + ap->flags =ATA_FLAG_DISABLED ; ap->id = host->unique_id; ap->host = host; ap->ctl =ATA_DEVCTL_OBS ;
drivers/scsi/libata-scsi.c +1 -1
@@ -2728,7 +2728,7 @@ void ata_scsi_scan_host(struct ata_portstruct ata_device *dev;unsigned int i; -if (ap->flags &ATA_FLAG_PORT_DISABLED ) +if (ap->flags &ATA_FLAG_DISABLED )return ;for (i =0 ; i <ATA_MAX_DEVICES ; i++) {
drivers/scsi/pdc_adma.c +2 -2
@@ -456,7 +456,7 @@ static inline unsigned int adma_intr_pktcontinue ; handled =1 ;adma_enter_reg_mode (ap); -if (ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR )) +if (ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))continue ; pp = ap->private_data;if (!pp || pp->state != adma_state_pkt)
@@ -481,7 +481,7 @@ static inline unsigned int adma_intr_mmifor (port_no =0 ; port_no < host_set->n_ports; ++port_no) {struct ata_port *ap; ap = host_set->ports[port_no]; -if (ap && (!(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR )))) { +if (ap && (!(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR )))) {struct ata_queued_cmd *qc;struct adma_port_priv *pp = ap->private_data;if (!pp || pp->state != adma_state_mmio)
drivers/scsi/sata_mv.c +1 -1
@@ -1397,7 +1397,7 @@ static void mv_host_intr(struct ata_host } } -if (ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR )) +if (ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))continue ; err_mask =ac_err_mask (ata_status);
drivers/scsi/sata_nv.c +1 -1
@@ -280,7 +280,7 @@ static irqreturn_t nv_interrupt (int irq ap = host_set->ports[i];if (ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + !(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag);
drivers/scsi/sata_promise.c +1 -1
@@ -534,7 +534,7 @@ static irqreturn_t pdc_interrupt (int ir ap = host_set->ports[i]; tmp = mask & (1 << (i +1 ));if (tmp && ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + !(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag);
drivers/scsi/sata_qstor.c +2 -2
@@ -396,7 +396,7 @@ static inline unsigned int qs_intr_pkt(s sff1, sff0, port_no, sHST, sDST); handled =1 ;if (ap && !(ap->flags & - (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc;struct qs_port_priv *pp = ap->private_data;if (!pp || pp->state != qs_state_pkt)
@@ -429,7 +429,7 @@ static inline unsigned int qs_intr_mmio(struct ata_port *ap; ap = host_set->ports[port_no];if (ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + !(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc;struct qs_port_priv *pp = ap->private_data;if (!pp || pp->state != qs_state_mmio)
drivers/scsi/sata_sil24.c +1 -1
@@ -770,7 +770,7 @@ static irqreturn_t sil24_interrupt(int ifor (i =0 ; i < host_set->n_ports; i++)if (status & (1 << i)) {struct ata_port *ap = host_set->ports[i]; -if (ap && !(ap->flags &ATA_FLAG_PORT_DISABLED )) { +if (ap && !(ap->flags &ATA_FLAG_DISABLED )) {sil24_host_intr (host_set->ports[i]); handled++; }else
drivers/scsi/sata_sx4.c +1 -1
@@ -834,7 +834,7 @@ static irqreturn_t pdc20621_interrupt (i tmp = mask & (1 << i);VPRINTK ("seq %u, port_no %u, ap %p, tmp %x\n" , i, port_no, ap, tmp);if (tmp && ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + !(ap->flags & (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag);
drivers/scsi/sata_vsc.c +1 -1
@@ -222,7 +222,7 @@ static irqreturn_t vsc_sata_interrupt (i ap = host_set->ports[i];if (ap && !(ap->flags & - (ATA_FLAG_PORT_DISABLED |ATA_FLAG_NOINTR ))) { + (ATA_FLAG_DISABLED |ATA_FLAG_NOINTR ))) {struct ata_queued_cmd *qc; qc =ata_qc_from_tag (ap, ap->active_tag);
include/linux/libata.h +1 -1
@@ -150,7 +150,7 @@ enum {ATA_FLAG_DEBUGMSG = (1 <<17 ),ATA_FLAG_FLUSH_PORT_TASK = (1 <<18 ),/* flush port task */ -ATA_FLAG_PORT_DISABLED = (1 <<19 ),/* port is disabled, ignore it */ +ATA_FLAG_DISABLED = (1 <<19 ),/* port is disabled, ignore it */ ATA_FLAG_SUSPENDED = (1 << 20), /* port is suspended *//* bits 24:31 of ap->flags are reserved for LLDD specific flags */
Signature · 1 line
1.2.4
PATCH 6/15 libata: clear only affected flags during ata_dev_configure()
In reply to Tejun Heoata_dev_configure() should not clear dynamic device flags determined elsewhere. Lower eight bits are reserved for feature flags, define ATA_DFLAG_CFG_MASK and clear only those bits before configuring device. Without this patch, ATA_DFLAG_PIO gets turned off during revalidation making PIO mode unuseable.
---
drivers/scsi/libata-core.c | 2 +- include/linux/libata.h | 1 + 2 files changed, 2 insertions(+), 1 deletions(-)
5554fe07da31aea352de83053420138b04dff3cb
drivers/scsi/libata-core.c +1 -1
@@ -1241,7 +1241,7 @@ static int ata_dev_configure(struct ata_ id[84], id[85], id[86], id[87], id[88]);/* initialize to-be-configured parameters */ - dev->flags =0 ; + dev->flags &= ~ATA_DFLAG_CFG_MASK ; dev->max_sectors =0 ; dev->cdb_len =0 ; dev->n_sectors =0 ;
include/linux/libata.h +1 -0
@@ -122,6 +122,7 @@ enum {/* struct ata_device stuff */ ATA_DFLAG_LBA = (1 <<0 ),/* device supports LBA */ ATA_DFLAG_LBA48 = (1 <<1 ),/* device supports LBA48 */ +ATA_DFLAG_CFG_MASK = (1 <<8 ) -1 , ATA_DFLAG_PIO = (1 << 8), /* device currently in PIO mode */
Signature · 1 line
1.2.4
PATCH 7/15 libata: clear ATA_DFLAG_PIO before setting it
In reply to Tejun Heoata_dev_set_mode() is now responsible for managing ATA_DFLAG_PIO. Clear it before setting it.
---
drivers/scsi/libata-core.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
323a4f47e0e9e8b0011cebb706b66e20cdc1d672
drivers/scsi/libata-core.c +1 -0
@@ -1949,6 +1949,7 @@ static int ata_dev_set_mode(struct ata_punsigned int err_mask;int rc; + dev->flags &= ~ATA_DFLAG_PIO ;if (dev->xfer_shift ==ATA_SHIFT_PIO ) dev->flags |=ATA_DFLAG_PIO ;
Signature · 1 line
1.2.4
PATCH 8/15 libata: add ATA_QCFLAG_IO
In reply to Tejun HeoAdd a new qc flag ATA_QCFLAG_IO. This flag gets set for normal IO commands originating from SCSI midlayer. This information will be used by EH to determine transfer speed reconfiguration.
---
drivers/scsi/libata-scsi.c | 1 + include/linux/libata.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-)
c990a902336e539c91d6f030f67d294674065c83
drivers/scsi/libata-scsi.c +1 -0
@@ -1188,6 +1188,7 @@ static unsigned int ata_scsi_rw_xlat(stru64 block;u32 n_block; + qc->flags |=ATA_QCFLAG_IO ; tf->flags |=ATA_TFLAG_ISADDR |ATA_TFLAG_DEVICE ; if (scsicmd[0] == WRITE_10 || scsicmd[0] == WRITE_6 ||
include/linux/libata.h +2 -1
@@ -161,7 +161,8 @@ enum {ATA_QCFLAG_SG = (1 <<1 ),/* have s/g table? */ ATA_QCFLAG_SINGLE = (1 <<2 ),/* no s/g, just a single buffer */ ATA_QCFLAG_DMAMAP =ATA_QCFLAG_SG |ATA_QCFLAG_SINGLE , -ATA_QCFLAG_EH_SCHEDULED = (1 <<3 ),/* EH scheduled */ +ATA_QCFLAG_IO = (1 <<3 ),/* standard IO command */ +ATA_QCFLAG_EH_SCHEDULED = (1 <<4 ),/* EH scheduled */ /* host set flags */ ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host_set only */
Signature · 1 line
1.2.4
PATCH 9/15 libata: pass qc around intead of ap during PIO
In reply to Tejun HeoThe current code passes pointer to ap around and repeatedly performs ata_qc_from_tag() to access the ongoing qc. This is unnatural and makes EH synchronization cumbersome. Make PIO codes deal with qc instead of ap.
---
drivers/scsi/libata-core.c | 71 ++++++++++++++++---------------------------- 1 files changed, 26 insertions(+), 45 deletions(-)
8065c890ce165cfde0fba6454be169be9fbb8151
drivers/scsi/libata-core.c +26 -45
@@ -3411,7 +3411,7 @@ void ata_poll_qc_complete(struct ata_que/** * ata_pio_poll - poll using PIO, depending on current state -* @ap: the target ata_port +* @qc: qc in progress * * LOCKING: * None. (executing in kernel thread context)
@@ -3419,17 +3419,13 @@ void ata_poll_qc_complete(struct ata_que* RETURNS: * timeout value to use */ - -static unsigned long ata_pio_poll (struct ata_port *ap) +static unsigned long ata_pio_poll (struct ata_queued_cmd *qc) { -struct ata_queued_cmd *qc; +struct ata_port *ap = qc->ap;u8 status;unsigned int poll_state =HSM_ST_UNKNOWN ;unsigned int reg_state =HSM_ST_UNKNOWN ; - qc =ata_qc_from_tag (ap, ap->active_tag); -WARN_ON (qc ==NULL ); -switch (ap->hsm_task_state) {case HSM_ST :case HSM_ST_POLL :
@@ -3463,7 +3459,7 @@ static unsigned long ata_pio_poll(struct/** * ata_pio_complete - check if drive is busy or idle -* @ap: the target ata_port +* @qc: qc to complete * * LOCKING: * None. (executing in kernel thread context)
@@ -3471,10 +3467,9 @@ static unsigned long ata_pio_poll(struct* RETURNS: * Non-zero if qc completed, zero otherwise. */ - -static int ata_pio_complete (struct ata_port *ap) +static int ata_pio_complete (struct ata_queued_cmd *qc) { -struct ata_queued_cmd *qc; +struct ata_port *ap = qc->ap;u8 drv_stat;/*
@@ -3495,9 +3490,6 @@ static int ata_pio_complete (struct ata_ } } - qc =ata_qc_from_tag (ap, ap->active_tag); -WARN_ON (qc ==NULL ); - drv_stat =ata_wait_idle (ap);if (!ata_ok (drv_stat)) { qc->err_mask |=__ac_err_mask (drv_stat);
@@ -3833,15 +3825,14 @@ err_out:/** * ata_pio_block - start PIO on a block -* @ap: the target ata_port +* @qc: qc to transfer block for * * LOCKING: * None. (executing in kernel thread context) */ - -static void ata_pio_block (struct ata_port *ap) +static void ata_pio_block (struct ata_queued_cmd *qc) { -struct ata_queued_cmd *qc; +struct ata_port *ap = qc->ap;u8 status;/*
@@ -3863,9 +3854,6 @@ static void ata_pio_block(struct ata_por } } - qc =ata_qc_from_tag (ap, ap->active_tag); -WARN_ON (qc ==NULL ); -/* check error */ if (status & (ATA_ERR |ATA_DF )) { qc->err_mask |=AC_ERR_DEV ;
@@ -3894,12 +3882,9 @@ static void ata_pio_block(struct ata_por } } -static void ata_pio_error (struct ata_port *ap) +static void ata_pio_error (struct ata_queued_cmd *qc) { -struct ata_queued_cmd *qc; - - qc =ata_qc_from_tag (ap, ap->active_tag); -WARN_ON (qc ==NULL ); +struct ata_port *ap = qc->ap;if (qc->tf.command !=ATA_CMD_PACKET ) printk(KERN_WARNING "ata%u: dev %u PIO error\n",
@@ -3917,7 +3902,8 @@ static void ata_pio_error(struct ata_porstatic void ata_pio_task (void *_data) { -struct ata_port *ap = _data; +struct ata_queued_cmd *qc = _data; +struct ata_port *ap = qc->ap;unsigned long timeout;int qc_completed;
@@ -3930,33 +3916,33 @@ fsm_start:return ;case HSM_ST : -ata_pio_block (ap); +ata_pio_block (qc);break ;case HSM_ST_LAST : - qc_completed =ata_pio_complete (ap); + qc_completed =ata_pio_complete (qc);break ;case HSM_ST_POLL :case HSM_ST_LAST_POLL : - timeout =ata_pio_poll (ap); + timeout =ata_pio_poll (qc);break ;case HSM_ST_TMOUT :case HSM_ST_ERR : -ata_pio_error (ap); +ata_pio_error (qc);return ; }if (timeout) -ata_port_queue_task (ap, ata_pio_task, ap, timeout); +ata_port_queue_task (ap, ata_pio_task, qc, timeout);else if (!qc_completed) goto fsm_start; }/** * atapi_packet_task - Write CDB bytes to hardware -* @_data: Port to which ATAPI device is attached. +* @_data: qc in progress * * When device has indicated its readiness to accept * a CDB, this function is called. Send the CDB.
@@ -3967,17 +3953,12 @@ fsm_start:* LOCKING: * Kernel thread context (may sleep) */ -static void atapi_packet_task (void *_data) { -struct ata_port *ap = _data; -struct ata_queued_cmd *qc; +struct ata_queued_cmd *qc = _data; +struct ata_port *ap = qc->ap;u8 status; - qc =ata_qc_from_tag (ap, ap->active_tag); -WARN_ON (qc ==NULL ); -WARN_ON (!(qc->flags &ATA_QCFLAG_ACTIVE )); -/* sleep-wait for BSY to clear */ DPRINTK ("busy wait\n" );if (ata_busy_sleep (ap,ATA_TMOUT_CDB_QUICK ,ATA_TMOUT_CDB )) {
@@ -4017,7 +3998,7 @@ static void atapi_packet_task(void *_dat/* PIO commands are handled by polling */ ap->hsm_task_state =HSM_ST ; -ata_port_queue_task (ap, ata_pio_task, ap,0 ); +ata_port_queue_task (ap, ata_pio_task, qc,0 ); }return ;
@@ -4323,26 +4304,26 @@ unsigned int ata_qc_issue_prot(struct atata_qc_set_polling (qc);ata_tf_to_host (ap, &qc->tf); ap->hsm_task_state =HSM_ST ; -ata_port_queue_task (ap, ata_pio_task, ap,0 ); +ata_port_queue_task (ap, ata_pio_task, qc,0 );break ;case ATA_PROT_ATAPI :ata_qc_set_polling (qc);ata_tf_to_host (ap, &qc->tf); -ata_port_queue_task (ap, atapi_packet_task, ap,0 ); +ata_port_queue_task (ap, atapi_packet_task, qc,0 );break ;case ATA_PROT_ATAPI_NODATA : ap->flags |=ATA_FLAG_NOINTR ;ata_tf_to_host (ap, &qc->tf); -ata_port_queue_task (ap, atapi_packet_task, ap,0 ); +ata_port_queue_task (ap, atapi_packet_task, qc,0 );break ;case ATA_PROT_ATAPI_DMA : ap->flags |=ATA_FLAG_NOINTR ; ap->ops->tf_load (ap, &qc->tf);/* load tf registers */ ap->ops->bmdma_setup (qc);/* set up bmdma */ -ata_port_queue_task (ap, atapi_packet_task, ap,0 ); +ata_port_queue_task (ap, atapi_packet_task, qc,0 );break ;default :
Signature · 1 line
1.2.4
PATCH 10/15 libata: always generate sense if qc->err_mask is non-zero
In reply to Tejun HeoCurrent sense generation code does not generate sense error if status register value doesn't indicate error condition. However, LLDD's may indicate errors which 't show up in status register. Completing such qc's without generating sense results in successful completion of failed commands.
Invoke ata_to_sense_error() regardless of status register if qc->err_mask is not zero such that ata_to_sense_error() generates default sense error.
---
drivers/scsi/libata-scsi.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)
60719165920bbb0902851c862f4c181057f48a64
drivers/scsi/libata-scsi.c +4 -2
@@ -555,7 +555,8 @@ void ata_gen_ata_desc_sense(struct ata_q* Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ -if (tf->command & (ATA_BUSY |ATA_DF |ATA_ERR |ATA_DRQ )) { +if (qc->err_mask || + tf->command & (ATA_BUSY |ATA_DF |ATA_ERR |ATA_DRQ )) {ata_to_sense_error (qc->ap->id, tf->command, tf->feature, &sb[1 ], &sb[2 ], &sb[3 ]); sb[1 ] &=0x0f ;
@@ -630,7 +631,8 @@ void ata_gen_fixed_sense(struct ata_queu* Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ -if (tf->command & (ATA_BUSY |ATA_DF |ATA_ERR |ATA_DRQ )) { +if (qc->err_mask || + tf->command & (ATA_BUSY |ATA_DF |ATA_ERR |ATA_DRQ )) {ata_to_sense_error (qc->ap->id, tf->command, tf->feature, &sb[2 ], &sb[12 ], &sb[13 ]); sb[2 ] &=0x0f ;
Signature · 1 line
1.2.4
PATCH 11/15 libata: don't read TF directly from sense generation functions
In reply to Tejun HeoTF register might not be directly accessible depending on errors. e.g. TF of failed NCQ command is in log page 10h. Make reading TF responsibility of error handlers. For the current EH, simply push TF reading into qc completion functions as they are practically part of EH. New EH will fill qc->tf with status registers before complting qcs.
---
drivers/scsi/libata-scsi.c | 27 +++++++++------------------ 1 files changed, 9 insertions(+), 18 deletions(-)
97b03d7b095baa09504d1c96720d2b45633d9c58
drivers/scsi/libata-scsi.c +9 -18
@@ -546,12 +546,6 @@ void ata_gen_ata_desc_sense(struct ata_q cmd->result = (DRIVER_SENSE <<24 ) |SAM_STAT_CHECK_CONDITION ;/* -* Read the controller registers. -*/ -WARN_ON (qc->ap->ops->tf_read ==NULL ); - qc->ap->ops->tf_read (qc->ap, tf); - -/* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */
@@ -622,12 +616,6 @@ void ata_gen_fixed_sense(struct ata_queu cmd->result = (DRIVER_SENSE <<24 ) |SAM_STAT_CHECK_CONDITION ;/* -* Read the controller registers. -*/ -WARN_ON (qc->ap->ops->tf_read ==NULL ); - qc->ap->ops->tf_read (qc->ap, tf); - -/* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */
@@ -1337,11 +1325,14 @@ static void ata_scsi_qc_complete(struct*/ if (((cdb[0 ] ==ATA_16 ) || (cdb[0 ] ==ATA_12 )) && ((cdb[2 ] &0x20 ) || need_sense)) { + qc->ap->ops->tf_read (qc->ap, &qc->tf);ata_gen_ata_desc_sense (qc); }else {if (!need_sense) { cmd->result =SAM_STAT_GOOD ; }else { + qc->ap->ops->tf_read (qc->ap, &qc->tf); +/* TODO: decide which descriptor format to use * for 48b LBA devices and call that here * instead of the fixed desc, which is only
@@ -2133,13 +2124,15 @@ void ata_scsi_badcmd(struct scsi_cmnd *cstatic void atapi_sense_complete (struct ata_queued_cmd *qc) { -if (qc->err_mask && ((qc->err_mask &AC_ERR_DEV ) ==0 )) +if (qc->err_mask && ((qc->err_mask &AC_ERR_DEV ) ==0 )) {/* FIXME: not quite right; we don't want the * translation of taskfile registers into * a sense descriptors, since that's only * correct for ATA, not ATAPI */ + qc->ap->ops->tf_read (qc->ap, &qc->tf);ata_gen_ata_desc_sense (qc); + } qc->scsidone (qc->scsicmd);ata_qc_free (qc);
@@ -2207,17 +2200,15 @@ static void atapi_qc_complete(struct ata cmd->result =SAM_STAT_CHECK_CONDITION ;atapi_request_sense (qc);return ; - } - -else if (unlikely (err_mask)) + }else if (unlikely (err_mask)) {/* FIXME: not quite right; we don't want the * translation of taskfile registers into * a sense descriptors, since that's only * correct for ATA, not ATAPI */ + qc->ap->ops->tf_read (qc->ap, &qc->tf);ata_gen_ata_desc_sense (qc); - -else { + }else {u8 *scsicmd = cmd->cmnd;if ((scsicmd[0 ] ==INQUIRY ) && ((scsicmd[1 ] &0x03 ) ==0 )) {
Signature · 1 line
1.2.4
PATCH 12/15 libata: add @cdb to ata_exec_internal()
In reply to Tejun HeoAdd @cdb to ata_exec_internal(). It will be used by new EH.
---
drivers/scsi/libata-core.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-)
d73daad1db8fa577219cdcf734046018d9ad45a9
drivers/scsi/libata-core.c +8 -5
@@ -964,6 +964,7 @@ void ata_qc_complete_internal(struct ata* @ap: Port to which the command is sent * @dev: Device to which the command is sent * @tf: Taskfile registers for the command and the result +* @cdb: CDB for packet command * @dma_dir: Data tranfer direction of the command * @buf: Data buffer of the command * @buflen: Length of data buffer
@@ -980,7 +981,7 @@ void ata_qc_complete_internal(struct atastatic unsigned ata_exec_internal (struct ata_port *ap,struct ata_device *dev, -struct ata_taskfile *tf, +struct ata_taskfile *tf,const u8 *cdb,int dma_dir,void *buf,unsigned int buflen) {u8 command = tf->command;
@@ -995,6 +996,8 @@ ata_exec_internal(struct ata_port *ap, sBUG_ON (qc ==NULL ); qc->tf = *tf; +if (cdb) +memcpy (qc->cdb, cdb,ATAPI_CDB_LEN ); qc->dma_dir = dma_dir;if (dma_dir !=DMA_NONE ) {ata_sg_init_one (qc, buf, buflen);
@@ -1144,7 +1147,7 @@ static int ata_dev_read_id(struct ata_po tf.protocol =ATA_PROT_PIO ; - err_mask =ata_exec_internal (ap, dev, &tf,DMA_FROM_DEVICE , + err_mask =ata_exec_internal (ap, dev, &tf,NULL ,DMA_FROM_DEVICE , id,sizeof (id[0 ]) *ATA_ID_WORDS );if (err_mask) { rc = -EIO ;
@@ -2983,7 +2986,7 @@ static unsigned int ata_dev_set_xfermode tf.protocol =ATA_PROT_NODATA ; tf.nsect = dev->xfer_mode; - err_mask =ata_exec_internal (ap, dev, &tf,DMA_NONE ,NULL ,0 ); + err_mask =ata_exec_internal (ap, dev, &tf,NULL ,DMA_NONE ,NULL ,0 );DPRINTK ("EXIT, err_mask=%x\n" , err_mask);return err_mask;
@@ -3023,7 +3026,7 @@ static unsigned int ata_dev_init_params( tf.nsect = sectors; tf.device |= (heads -1 ) &0x0f ;/* max head = num. of heads - 1 */ - err_mask =ata_exec_internal (ap, dev, &tf,DMA_NONE ,NULL ,0 ); + err_mask =ata_exec_internal (ap, dev, &tf,NULL ,DMA_NONE ,NULL ,0 );DPRINTK ("EXIT, err_mask=%x\n" , err_mask);return err_mask;
@@ -4477,7 +4480,7 @@ static int ata_do_simple_cmd(struct ata_ tf.flags |=ATA_TFLAG_DEVICE ; tf.protocol =ATA_PROT_NODATA ; - err =ata_exec_internal (ap, dev, &tf,DMA_NONE ,NULL ,0 ); + err =ata_exec_internal (ap, dev, &tf,NULL ,DMA_NONE ,NULL ,0 );if (err)printk (KERN_ERR "%s: ata command failed: %d\n" , __FUNCTION__, err);
Signature · 1 line
1.2.4
PATCH 13/15 libata: dec scmd->retries for qcs with zero err_mask
In reply to Tejun Heoqcs might get retried because of unrelated failure. e.g. NCQ command failure causes the whole command set to be aborted. Decrement scmd->retries for such retrials to avoid unnecessarily failing commands. Note that scmd->retries will be incremented the first time.
---
drivers/scsi/libata-scsi.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-)
942cb205645187842932b75aa89c4361a4423212
drivers/scsi/libata-scsi.c +5 -2
@@ -831,11 +831,14 @@ void ata_eh_qc_complete(struct ata_queue* should be retried. To be used from EH. * * SCSI midlayer limits the number of retries to scmd->allowed. -* This function might need to adjust scmd->retries for commands -* which get retried due to unrelated NCQ failures. +* scmd->retries is decremented for commands which get retried +* due to unrelated failures (qc->err_mask is zero). */ void ata_eh_qc_retry (struct ata_queued_cmd *qc) { +struct scsi_cmnd *scmd = qc->scsicmd; +if (!qc->err_mask && scmd->retries) + scmd->retries--;__ata_eh_qc_complete (qc); }
Signature · 1 line
1.2.4
PATCH 14/15 libata: separate out libata-eh.c
In reply to Tejun HeoA lot of EH codes are about to be added to libata. Separate out libata-eh.c. ata_scsi_timed_out(), ata_scsi_error(), ata_qc_timeout(), ata_eng_timeout(), ata_eh_qc_complete() and ata_eh_qc_retry() are moved. No code is changed by this patch.
---
drivers/scsi/Makefile | 2 drivers/scsi/libata-core.c | 102 +---------------- drivers/scsi/libata-eh.c | 264 ++++++++++++++++++++++++++++++++++++++++++++ drivers/scsi/libata-scsi.c | 130 ---------------------- drivers/scsi/libata.h | 4 + include/linux/libata.h | 12 +- 6 files changed, 281 insertions(+), 233 deletions(-) create mode 100644 drivers/scsi/libata-eh.c
54c87b2c238b530350be7b7d2edaa7b0edcb99fd
drivers/scsi/Makefile +1 -1
@@ -165,7 +165,7 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \ CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m) zalon7xx-objs := zalon.o ncr53c8xx.o NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o -libata-objs := libata-core.o libata-scsi.o libata-bmdma.o +libata-objs := libata-core.o libata-scsi.o libata-bmdma.o libata-eh.o oktagon_esp_mod-objs := oktagon_esp.o oktagon_io.o # Files generated that shall be removed upon make clean
drivers/scsi/libata-core.c +5 -97
129 lines not on this page · raw message
drivers/scsi/libata-eh.c new file +264 -0
264 lines not on this page · raw message
drivers/scsi/libata-scsi.c +0 -130
142 lines not on this page · raw message
drivers/scsi/libata.h +3 -1
@@ -60,7 +60,6 @@ extern int ata_cmd_ioctl(struct scsi_devextern struct scsi_transport_template ata_scsi_transport_template;extern void ata_scsi_scan_host (struct ata_port *ap); -extern int ata_scsi_error (struct Scsi_Host *host);extern unsigned int ata_scsiop_inq_std (struct ata_scsi_args *args,u8 *rbuf,unsigned int buflen);
@@ -90,4 +89,7 @@ extern void ata_scsi_rbuf_fill(struct atunsigned int (*actor) (struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen)); +/* libata-eh.c */ +extern enum scsi_eh_timer_return ata_scsi_timed_out (struct scsi_cmnd *cmd); +#endif /* __LIBATA_H__ */
include/linux/libata.h +8 -4
@@ -531,9 +531,6 @@ extern void ata_host_set_remove(struct aextern int ata_scsi_detect (struct scsi_host_template *sht);extern int ata_scsi_ioctl (struct scsi_device *dev,int cmd,void __user *arg);extern int ata_scsi_queuecmd (struct scsi_cmnd *cmd,void (*done)(struct scsi_cmnd *)); -extern int ata_scsi_error (struct Scsi_Host *host); -extern void ata_eh_qc_complete (struct ata_queued_cmd *qc); -extern void ata_eh_qc_retry (struct ata_queued_cmd *qc);extern int ata_scsi_release (struct Scsi_Host *host);extern unsigned int ata_host_intr (struct ata_port *ap,struct ata_queued_cmd *qc);extern int ata_scsi_device_resume (struct scsi_device *);
@@ -582,7 +579,6 @@ extern void ata_bmdma_stop(struct ata_quextern u8 ata_bmdma_status (struct ata_port *ap);extern void ata_bmdma_irq_clear (struct ata_port *ap);extern void __ata_qc_complete (struct ata_queued_cmd *qc); -extern void ata_eng_timeout (struct ata_port *ap);extern void ata_scsi_simulate (struct ata_port *ap,struct ata_device *dev,struct scsi_cmnd *cmd,void (*done)(struct scsi_cmnd *));
@@ -637,6 +633,14 @@ extern int pci_test_config_bits(struct pextern unsigned long ata_pci_default_filter (const struct ata_port *,struct ata_device *,unsigned long );#endif /* CONFIG_PCI */ +/* +* EH +*/ +extern int ata_scsi_error (struct Scsi_Host *host); +extern void ata_eng_timeout (struct ata_port *ap); +extern void ata_eh_qc_complete (struct ata_queued_cmd *qc); +extern void ata_eh_qc_retry (struct ata_queued_cmd *qc); +static inline int ata_sg_is_last (struct scatterlist *sg,struct ata_queued_cmd *qc)
Signature · 1 line
1.2.4
PATCH 15/15 libata: make some libata-core routines extern
In reply to Tejun HeoMake libata-core routines which will be used by EH implementation extern.
---
drivers/scsi/libata-core.c | 29 ++++++++++++----------------- drivers/scsi/libata.h | 13 +++++++++++++ 2 files changed, 25 insertions(+), 17 deletions(-)
86167e3b2891b6ab3b751571f108632da3fc0d7b
drivers/scsi/libata-core.c +12 -17
@@ -65,10 +65,6 @@ static unsigned int ata_dev_init_params(struct ata_device *dev, u16 heads, u16 sectors); -static int ata_down_xfermask_limit (struct ata_port *ap,struct ata_device *dev, -int force_pio0); -static int ata_down_sata_spd_limit (struct ata_port *ap); -static int ata_set_mode (struct ata_port *ap,struct ata_device **r_failed_dev);static unsigned int ata_dev_set_xfermode (struct ata_port *ap,struct ata_device *dev);static void ata_dev_xfermask (struct ata_port *ap,struct ata_device *dev);
@@ -412,7 +408,7 @@ static const char *sata_spd_string(unsigreturn spd_str[spd -1 ]; } -static void ata_dev_disable (struct ata_port *ap,struct ata_device *dev) +void ata_dev_disable (struct ata_port *ap,struct ata_device *dev) {if (ata_dev_enabled (dev)) { printk(KERN_WARNING "ata%u: dev %u disabled\n",
@@ -979,10 +975,9 @@ void ata_qc_complete_internal(struct ata* None. Should be called with kernel context, might sleep. */ -static unsigned -ata_exec_internal (struct ata_port *ap,struct ata_device *dev, -struct ata_taskfile *tf,const u8 *cdb, -int dma_dir,void *buf,unsigned int buflen) +unsigned ata_exec_internal (struct ata_port *ap,struct ata_device *dev, +struct ata_taskfile *tf,const u8 *cdb, +int dma_dir,void *buf,unsigned int buflen) {u8 command = tf->command;struct ata_queued_cmd *qc;
@@ -1649,7 +1644,7 @@ void ata_port_disable(struct ata_port *a* RETURNS: * 0 on success, negative errno on failure */ -static int ata_down_sata_spd_limit (struct ata_port *ap) +int ata_down_sata_spd_limit (struct ata_port *ap) {u32 spd, mask;int highbit;
@@ -1709,7 +1704,7 @@ static int __ata_set_sata_spd_needed(str* RETURNS: * 1 if SATA spd configuration is needed, 0 otherwise. */ -static int ata_set_sata_spd_needed (struct ata_port *ap) +int ata_set_sata_spd_needed (struct ata_port *ap) {u32 scontrol;
@@ -1913,8 +1908,8 @@ int ata_timing_compute(struct ata_device* RETURNS: * 0 on success, negative errno on failure */ -static int ata_down_xfermask_limit (struct ata_port *ap,struct ata_device *dev, -int force_pio0) +int ata_down_xfermask_limit (struct ata_port *ap,struct ata_device *dev, +int force_pio0) {unsigned long xfer_mask;int highbit;
@@ -1992,7 +1987,7 @@ static int ata_dev_set_mode(struct ata_p* RETURNS: * 0 on success, negative errno otherwise */ -static int ata_set_mode (struct ata_port *ap,struct ata_device **r_failed_dev) +int ata_set_mode (struct ata_port *ap,struct ata_device **r_failed_dev) {struct ata_device *dev;int i, rc =0 , used_dma =0 , found =0 ;
@@ -2585,9 +2580,9 @@ int ata_std_probe_reset(struct ata_port ata_std_postreset, classes); } -static int ata_do_reset (struct ata_port *ap, -ata_reset_fn_t reset,ata_postreset_fn_t postreset, -int verbose,unsigned int *classes) +int ata_do_reset (struct ata_port *ap, +ata_reset_fn_t reset,ata_postreset_fn_t postreset, +int verbose,unsigned int *classes) {int i, rc;
drivers/scsi/libata.h +13 -0
@@ -45,7 +45,20 @@ extern int libata_fua;extern struct ata_queued_cmd *ata_qc_new_init (struct ata_port *ap,struct ata_device *dev);extern int ata_rwcmd_protocol (struct ata_queued_cmd *qc); +extern void ata_dev_disable (struct ata_port *ap,struct ata_device *dev);extern void ata_port_flush_task (struct ata_port *ap); +extern unsigned ata_exec_internal (struct ata_port *ap,struct ata_device *dev, +struct ata_taskfile *tf,const u8 *cdb, +int dma_dir,void *buf,unsigned int buflen); +extern int ata_down_sata_spd_limit (struct ata_port *ap); +extern int ata_set_sata_spd_needed (struct ata_port *ap); +extern int ata_down_xfermask_limit (struct ata_port *ap,struct ata_device *dev, +int force_pio0); +extern int ata_set_mode (struct ata_port *ap,struct ata_device **r_failed_dev); +extern int ata_do_reset (struct ata_port *ap, +ata_reset_fn_t reset, +ata_postreset_fn_t postreset, +int verbose,unsigned int *classes);extern void ata_qc_free (struct ata_queued_cmd *qc);extern void ata_qc_issue (struct ata_queued_cmd *qc);extern int ata_check_atapi_dma (struct ata_queued_cmd *qc);
Signature · 1 line
1.2.4