Commit ededa4d3 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  libata: fix ATAPI draining
  libata: update atapi_eh_request_sense() such that lbam/lbah contains buffer size
  libata-acpi: implement _GTF command filtering
  libata-acpi: improve _GTF execution error handling and reporting
  libata-acpi: improve ACPI disabling
  libata-acpi: implement dev->gtf_cache and evaluate _GTF right after _STM during resume
  libata-acpi: implement and use ata_acpi_init_gtm()
  libata-acpi: add new hooks ata_acpi_dissociate() and ata_acpi_on_disable()
  libata: ata_dev_disable() should be called from EH context
  libata: add more opcodes to ata.h
  libata: update ata_*_printk() macros such that level can be a variable
  libata-acpi: adjust constness in ata_acpi_gtm/stm() parameters
  sata_mv: improve warnings about Highpoint RocketRAID 23xx cards
  libata: add ST3160023AS / 3.42 to NCQ blacklist
  libata: clear link->eh_info.serror from ata_std_postreset()
  sata_sil: fix spurious IRQ handling
parents 64396acc 140b5e59
This diff is collapsed.
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/cdrom.h>
#include "libata.h" #include "libata.h"
...@@ -622,6 +623,7 @@ void ata_dev_disable(struct ata_device *dev) ...@@ -622,6 +623,7 @@ void ata_dev_disable(struct ata_device *dev)
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
if (ata_msg_drv(dev->link->ap)) if (ata_msg_drv(dev->link->ap))
ata_dev_printk(dev, KERN_WARNING, "disabled\n"); ata_dev_printk(dev, KERN_WARNING, "disabled\n");
ata_acpi_on_disable(dev);
ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 |
ATA_DNXFER_QUIET); ATA_DNXFER_QUIET);
dev->class++; dev->class++;
...@@ -3923,6 +3925,7 @@ void ata_std_postreset(struct ata_link *link, unsigned int *classes) ...@@ -3923,6 +3925,7 @@ void ata_std_postreset(struct ata_link *link, unsigned int *classes)
/* clear SError */ /* clear SError */
if (sata_scr_read(link, SCR_ERROR, &serror) == 0) if (sata_scr_read(link, SCR_ERROR, &serror) == 0)
sata_scr_write(link, SCR_ERROR, serror); sata_scr_write(link, SCR_ERROR, serror);
link->eh_info.serror = 0;
/* is double-select really necessary? */ /* is double-select really necessary? */
if (classes[0] != ATA_DEV_NONE) if (classes[0] != ATA_DEV_NONE)
...@@ -4149,6 +4152,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { ...@@ -4149,6 +4152,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "HITACHI HDS7250SASUN500G*", NULL, ATA_HORKAGE_NONCQ }, { "HITACHI HDS7250SASUN500G*", NULL, ATA_HORKAGE_NONCQ },
{ "HITACHI HDS7225SBSUN250G*", NULL, ATA_HORKAGE_NONCQ }, { "HITACHI HDS7225SBSUN250G*", NULL, ATA_HORKAGE_NONCQ },
{ "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ },
{ "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ },
/* Blacklist entries taken from Silicon Image 3124/3132 /* Blacklist entries taken from Silicon Image 3124/3132
Windows driver .inf file - also several Linux problem reports */ Windows driver .inf file - also several Linux problem reports */
...@@ -4648,6 +4652,43 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc) ...@@ -4648,6 +4652,43 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc)
return 0; return 0;
} }
/**
* atapi_qc_may_overflow - Check whether data transfer may overflow
* @qc: ATA command in question
*
* ATAPI commands which transfer variable length data to host
* might overflow due to application error or hardare bug. This
* function checks whether overflow should be drained and ignored
* for @qc.
*
* LOCKING:
* None.
*
* RETURNS:
* 1 if @qc may overflow; otherwise, 0.
*/
static int atapi_qc_may_overflow(struct ata_queued_cmd *qc)
{
if (qc->tf.protocol != ATA_PROT_ATAPI &&
qc->tf.protocol != ATA_PROT_ATAPI_DMA)
return 0;
if (qc->tf.flags & ATA_TFLAG_WRITE)
return 0;
switch (qc->cdb[0]) {
case READ_10:
case READ_12:
case WRITE_10:
case WRITE_12:
case GPCMD_READ_CD:
case GPCMD_READ_CD_MSF:
return 0;
}
return 1;
}
/** /**
* ata_std_qc_defer - Check whether a qc needs to be deferred * ata_std_qc_defer - Check whether a qc needs to be deferred
* @qc: ATA command in question * @qc: ATA command in question
...@@ -5136,23 +5177,19 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc) ...@@ -5136,23 +5177,19 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
* Inherited from caller. * Inherited from caller.
* *
*/ */
static int __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
{ {
int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
struct scatterlist *sg = qc->__sg;
struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem);
struct ata_port *ap = qc->ap; struct ata_port *ap = qc->ap;
struct ata_eh_info *ehi = &qc->dev->link->eh_info;
struct scatterlist *sg;
struct page *page; struct page *page;
unsigned char *buf; unsigned char *buf;
unsigned int offset, count; unsigned int offset, count;
int no_more_sg = 0;
if (qc->curbytes + bytes >= qc->nbytes)
ap->hsm_task_state = HSM_ST_LAST;
next_sg: next_sg:
if (unlikely(no_more_sg)) { sg = qc->cursg;
if (unlikely(!sg)) {
/* /*
* The end of qc->sg is reached and the device expects * The end of qc->sg is reached and the device expects
* more data to transfer. In order not to overrun qc->sg * more data to transfer. In order not to overrun qc->sg
...@@ -5161,21 +5198,28 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) ...@@ -5161,21 +5198,28 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
* - for write case, padding zero data to the device * - for write case, padding zero data to the device
*/ */
u16 pad_buf[1] = { 0 }; u16 pad_buf[1] = { 0 };
unsigned int words = bytes >> 1;
unsigned int i; unsigned int i;
if (words) /* warning if bytes > 1 */ if (bytes > qc->curbytes - qc->nbytes + ATAPI_MAX_DRAIN) {
ata_dev_printk(qc->dev, KERN_WARNING, ata_ehi_push_desc(ehi, "too much trailing data "
"%u bytes trailing data\n", bytes); "buf=%u cur=%u bytes=%u",
qc->nbytes, qc->curbytes, bytes);
return -1;
}
for (i = 0; i < words; i++) /* overflow is exptected for misc ATAPI commands */
if (bytes && !atapi_qc_may_overflow(qc))
ata_dev_printk(qc->dev, KERN_WARNING, "ATAPI %u bytes "
"trailing data (cdb=%02x nbytes=%u)\n",
bytes, qc->cdb[0], qc->nbytes);
for (i = 0; i < (bytes + 1) / 2; i++)
ap->ops->data_xfer(qc->dev, (unsigned char *)pad_buf, 2, do_write); ap->ops->data_xfer(qc->dev, (unsigned char *)pad_buf, 2, do_write);
ap->hsm_task_state = HSM_ST_LAST; qc->curbytes += bytes;
return;
}
sg = qc->cursg; return 0;
}
page = sg_page(sg); page = sg_page(sg);
offset = sg->offset + qc->cursg_ofs; offset = sg->offset + qc->cursg_ofs;
...@@ -5210,19 +5254,20 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) ...@@ -5210,19 +5254,20 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
} }
bytes -= count; bytes -= count;
if ((count & 1) && bytes)
bytes--;
qc->curbytes += count; qc->curbytes += count;
qc->cursg_ofs += count; qc->cursg_ofs += count;
if (qc->cursg_ofs == sg->length) { if (qc->cursg_ofs == sg->length) {
if (qc->cursg == lsg)
no_more_sg = 1;
qc->cursg = sg_next(qc->cursg); qc->cursg = sg_next(qc->cursg);
qc->cursg_ofs = 0; qc->cursg_ofs = 0;
} }
if (bytes) if (bytes)
goto next_sg; goto next_sg;
return 0;
} }
/** /**
...@@ -5265,7 +5310,8 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc) ...@@ -5265,7 +5310,8 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes); VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes);
__atapi_pio_bytes(qc, bytes); if (__atapi_pio_bytes(qc, bytes))
goto err_out;
ata_altstatus(ap); /* flush */ ata_altstatus(ap); /* flush */
return; return;
...@@ -7208,18 +7254,14 @@ static void ata_port_detach(struct ata_port *ap) ...@@ -7208,18 +7254,14 @@ static void ata_port_detach(struct ata_port *ap)
ata_port_wait_eh(ap); ata_port_wait_eh(ap);
/* EH is now guaranteed to see UNLOADING, so no new device /* EH is now guaranteed to see UNLOADING - EH context belongs
* will be attached. Disable all existing devices. * to us. Disable all existing devices.
*/ */
spin_lock_irqsave(ap->lock, flags);
ata_port_for_each_link(link, ap) { ata_port_for_each_link(link, ap) {
ata_link_for_each_dev(dev, link) ata_link_for_each_dev(dev, link)
ata_dev_disable(dev); ata_dev_disable(dev);
} }
spin_unlock_irqrestore(ap->lock, flags);
/* Final freeze & EH. All in-flight commands are aborted. EH /* Final freeze & EH. All in-flight commands are aborted. EH
* will be skipped and retrials will be terminated with bad * will be skipped and retrials will be terminated with bad
* target. * target.
...@@ -7251,6 +7293,9 @@ void ata_host_detach(struct ata_host *host) ...@@ -7251,6 +7293,9 @@ void ata_host_detach(struct ata_host *host)
for (i = 0; i < host->n_ports; i++) for (i = 0; i < host->n_ports; i++)
ata_port_detach(host->ports[i]); ata_port_detach(host->ports[i]);
/* the host is dead now, dissociate ACPI */
ata_acpi_dissociate(host);
} }
/** /**
......
...@@ -1264,8 +1264,8 @@ static unsigned int atapi_eh_request_sense(struct ata_queued_cmd *qc) ...@@ -1264,8 +1264,8 @@ static unsigned int atapi_eh_request_sense(struct ata_queued_cmd *qc)
tf.feature |= ATAPI_PKT_DMA; tf.feature |= ATAPI_PKT_DMA;
} else { } else {
tf.protocol = ATA_PROT_ATAPI; tf.protocol = ATA_PROT_ATAPI;
tf.lbam = (8 * 1024) & 0xff; tf.lbam = SCSI_SENSE_BUFFERSIZE;
tf.lbah = (8 * 1024) >> 8; tf.lbah = 0;
} }
return ata_exec_internal(dev, &tf, cdb, DMA_FROM_DEVICE, return ata_exec_internal(dev, &tf, cdb, DMA_FROM_DEVICE,
......
...@@ -108,15 +108,19 @@ extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); ...@@ -108,15 +108,19 @@ extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm);
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
extern void ata_acpi_associate_sata_port(struct ata_port *ap); extern void ata_acpi_associate_sata_port(struct ata_port *ap);
extern void ata_acpi_associate(struct ata_host *host); extern void ata_acpi_associate(struct ata_host *host);
extern void ata_acpi_dissociate(struct ata_host *host);
extern int ata_acpi_on_suspend(struct ata_port *ap); extern int ata_acpi_on_suspend(struct ata_port *ap);
extern void ata_acpi_on_resume(struct ata_port *ap); extern void ata_acpi_on_resume(struct ata_port *ap);
extern int ata_acpi_on_devcfg(struct ata_device *adev); extern int ata_acpi_on_devcfg(struct ata_device *dev);
extern void ata_acpi_on_disable(struct ata_device *dev);
#else #else
static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { } static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { }
static inline void ata_acpi_associate(struct ata_host *host) { } static inline void ata_acpi_associate(struct ata_host *host) { }
static inline void ata_acpi_dissociate(struct ata_host *host) { }
static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
static inline void ata_acpi_on_resume(struct ata_port *ap) { } static inline void ata_acpi_on_resume(struct ata_port *ap) { }
static inline int ata_acpi_on_devcfg(struct ata_device *adev) { return 0; } static inline int ata_acpi_on_devcfg(struct ata_device *dev) { return 0; }
static inline void ata_acpi_on_disable(struct ata_device *dev) { }
#endif #endif
/* libata-scsi.c */ /* libata-scsi.c */
......
...@@ -2506,11 +2506,31 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) ...@@ -2506,11 +2506,31 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
if (pdev->vendor == PCI_VENDOR_ID_TTI && if (pdev->vendor == PCI_VENDOR_ID_TTI &&
(pdev->device == 0x2300 || pdev->device == 0x2310)) (pdev->device == 0x2300 || pdev->device == 0x2310))
{ {
printk(KERN_WARNING "sata_mv: Highpoint RocketRAID BIOS" /*
" will CORRUPT DATA on attached drives when" * Highpoint RocketRAID PCIe 23xx series cards:
" configured as \"Legacy\". BEWARE!\n"); *
printk(KERN_WARNING "sata_mv: Use BIOS \"JBOD\" volumes" * Unconfigured drives are treated as "Legacy"
" instead for safety.\n"); * by the BIOS, and it overwrites sector 8 with
* a "Lgcy" metadata block prior to Linux boot.
*
* Configured drives (RAID or JBOD) leave sector 8
* alone, but instead overwrite a high numbered
* sector for the RAID metadata. This sector can
* be determined exactly, by truncating the physical
* drive capacity to a nice even GB value.
*
* RAID metadata is at: (dev->n_sectors & ~0xfffff)
*
* Warn the user, lest they think we're just buggy.
*/
printk(KERN_WARNING DRV_NAME ": Highpoint RocketRAID"
" BIOS CORRUPTS DATA on all attached drives,"
" regardless of if/how they are configured."
" BEWARE!\n");
printk(KERN_WARNING DRV_NAME ": For data safety, do not"
" use sectors 8-9 on \"Legacy\" drives,"
" and avoid the final two gigabytes on"
" all RocketRAID BIOS initialized drives.\n");
} }
case chip_6042: case chip_6042:
hpriv->ops = &mv6xxx_ops; hpriv->ops = &mv6xxx_ops;
......
...@@ -390,23 +390,19 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) ...@@ -390,23 +390,19 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
sil_scr_read(ap, SCR_ERROR, &serror); sil_scr_read(ap, SCR_ERROR, &serror);
sil_scr_write(ap, SCR_ERROR, serror); sil_scr_write(ap, SCR_ERROR, serror);
/* Trigger hotplug and accumulate SError only if the /* Sometimes spurious interrupts occur, double check
* port isn't already frozen. Otherwise, PHY events * it's PHYRDY CHG.
* during hardreset makes controllers with broken SIEN
* repeat probing needlessly.
*/ */
if (!(ap->pflags & ATA_PFLAG_FROZEN)) { if (serror & SERR_PHYRDY_CHG) {
ata_ehi_hotplugged(&ap->link.eh_info);
ap->link.eh_info.serror |= serror; ap->link.eh_info.serror |= serror;
goto freeze;
} }
goto freeze; if (!(bmdma2 & SIL_DMA_COMPLETE))
return;
} }
if (unlikely(!qc)) if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) {
goto freeze;
if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) {
/* this sometimes happens, just clear IRQ */ /* this sometimes happens, just clear IRQ */
ata_chk_status(ap); ata_chk_status(ap);
return; return;
......
...@@ -190,6 +190,8 @@ enum { ...@@ -190,6 +190,8 @@ enum {
ATA_CMD_READ_LOG_EXT = 0x2f, ATA_CMD_READ_LOG_EXT = 0x2f,
ATA_CMD_PMP_READ = 0xE4, ATA_CMD_PMP_READ = 0xE4,
ATA_CMD_PMP_WRITE = 0xE8, ATA_CMD_PMP_WRITE = 0xE8,
ATA_CMD_CONF_OVERLAY = 0xB1,
ATA_CMD_SEC_FREEZE_LOCK = 0xF5,
/* READ_LOG_EXT pages */ /* READ_LOG_EXT pages */
ATA_LOG_SATA_NCQ = 0x10, ATA_LOG_SATA_NCQ = 0x10,
...@@ -239,6 +241,19 @@ enum { ...@@ -239,6 +241,19 @@ enum {
SATA_AN = 0x05, /* Asynchronous Notification */ SATA_AN = 0x05, /* Asynchronous Notification */
SATA_DIPM = 0x03, /* Device Initiated Power Management */ SATA_DIPM = 0x03, /* Device Initiated Power Management */
/* feature values for SET_MAX */
ATA_SET_MAX_ADDR = 0x00,
ATA_SET_MAX_PASSWD = 0x01,
ATA_SET_MAX_LOCK = 0x02,
ATA_SET_MAX_UNLOCK = 0x03,
ATA_SET_MAX_FREEZE_LOCK = 0x04,
/* feature values for DEVICE CONFIGURATION OVERLAY */
ATA_DCO_RESTORE = 0xC0,
ATA_DCO_FREEZE_LOCK = 0xC1,
ATA_DCO_IDENTIFY = 0xC2,
ATA_DCO_SET = 0xC3,
/* ATAPI stuff */ /* ATAPI stuff */
ATAPI_PKT_DMA = (1 << 0), ATAPI_PKT_DMA = (1 << 0),
ATAPI_DMADIR = (1 << 2), /* ATAPI data dir: ATAPI_DMADIR = (1 << 2), /* ATAPI data dir:
......
...@@ -119,6 +119,8 @@ enum { ...@@ -119,6 +119,8 @@ enum {
ATA_DEF_BUSY_WAIT = 10000, ATA_DEF_BUSY_WAIT = 10000,
ATA_SHORT_PAUSE = (HZ >> 6) + 1, ATA_SHORT_PAUSE = (HZ >> 6) + 1,
ATAPI_MAX_DRAIN = 16 << 10,
ATA_SHT_EMULATED = 1, ATA_SHT_EMULATED = 1,
ATA_SHT_CMD_PER_LUN = 1, ATA_SHT_CMD_PER_LUN = 1,
ATA_SHT_THIS_ID = -1, ATA_SHT_THIS_ID = -1,
...@@ -211,7 +213,7 @@ enum { ...@@ -211,7 +213,7 @@ enum {
ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */
ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */
ATA_PFLAG_GTM_VALID = (1 << 19), /* acpi_gtm data valid */ ATA_PFLAG_INIT_GTM_VALID = (1 << 19), /* initial gtm data valid */
/* struct ata_queued_cmd flags */ /* struct ata_queued_cmd flags */
ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */ ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */
...@@ -498,6 +500,7 @@ struct ata_device { ...@@ -498,6 +500,7 @@ struct ata_device {
struct scsi_device *sdev; /* attached SCSI device */ struct scsi_device *sdev; /* attached SCSI device */
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle; acpi_handle acpi_handle;
union acpi_object *gtf_cache;
#endif #endif
/* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
u64 n_sectors; /* size of device, if ATA */ u64 n_sectors; /* size of device, if ATA */
...@@ -653,7 +656,7 @@ struct ata_port { ...@@ -653,7 +656,7 @@ struct ata_port {
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle; acpi_handle acpi_handle;
struct ata_acpi_gtm acpi_gtm; struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
#endif #endif
u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */
}; };
...@@ -939,10 +942,20 @@ enum { ...@@ -939,10 +942,20 @@ enum {
/* libata-acpi.c */ /* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
{
if (ap->pflags & ATA_PFLAG_INIT_GTM_VALID)
return &ap->__acpi_init_gtm;
return NULL;
}
extern int ata_acpi_cbl_80wire(struct ata_port *ap); extern int ata_acpi_cbl_80wire(struct ata_port *ap);
int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm); int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm);
int ata_acpi_gtm(const struct ata_port *ap, struct ata_acpi_gtm *stm); int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm);
#else #else
static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
{
return NULL;
}
static inline int ata_acpi_cbl_80wire(struct ata_port *ap) { return 0; } static inline int ata_acpi_cbl_80wire(struct ata_port *ap) { return 0; }
#endif #endif
...@@ -1013,18 +1026,18 @@ extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, ...@@ -1013,18 +1026,18 @@ extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
* printk helpers * printk helpers
*/ */
#define ata_port_printk(ap, lv, fmt, args...) \ #define ata_port_printk(ap, lv, fmt, args...) \
printk(lv"ata%u: "fmt, (ap)->print_id , ##args) printk("%sata%u: "fmt, lv, (ap)->print_id , ##args)
#define ata_link_printk(link, lv, fmt, args...) do { \ #define ata_link_printk(link, lv, fmt, args...) do { \
if ((link)->ap->nr_pmp_links) \ if ((link)->ap->nr_pmp_links) \
printk(lv"ata%u.%02u: "fmt, (link)->ap->print_id, \ printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \
(link)->pmp , ##args); \ (link)->pmp , ##args); \
else \ else \
printk(lv"ata%u: "fmt, (link)->ap->print_id , ##args); \ printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
} while(0) } while(0)
#define ata_dev_printk(dev, lv, fmt, args...) \ #define ata_dev_printk(dev, lv, fmt, args...) \
printk(lv"ata%u.%02u: "fmt, (dev)->link->ap->print_id, \ printk("%sata%u.%02u: "fmt, lv, (dev)->link->ap->print_id, \
(dev)->link->pmp + (dev)->devno , ##args) (dev)->link->pmp + (dev)->devno , ##args)
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment