Commit 1542dec1 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:
  pata_platform: Remove CONFIG_HAVE_PATA_PLATFORM's dependencies.
  pata_hpt37x: actually limit HPT370 to UltraDMA/66
  pata_hpt3x2n: coding style cleanup
  pata_hpt37x: coding style cleanup
  pata_hpt366: coding style cleanup
  pata_hpt3x2n: calculate average f_CNT
  pata_hpt3x2n: clarify about HPT371N support
  pata_hpt{37x|3x2n}: SATA mode filtering
  [libata] avoid needlessly passing around ptr to SCSI completion func
  [libata] new driver acard_ahci, for ATP8620 host controller
parents facc7a96 2ad2c320
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
# SATA/PATA driver configuration # SATA/PATA driver configuration
# #
config HAVE_PATA_PLATFORM
bool
help
This is an internal configuration node for any machine that
uses pata-platform driver to enable the relevant driver in the
configuration structure without having to submit endless patches
to update the PATA_PLATFORM entry.
menuconfig ATA menuconfig ATA
tristate "Serial ATA and Parallel ATA drivers" tristate "Serial ATA and Parallel ATA drivers"
depends on HAS_IOMEM depends on HAS_IOMEM
...@@ -90,6 +98,14 @@ config SATA_INIC162X ...@@ -90,6 +98,14 @@ config SATA_INIC162X
help help
This option enables support for Initio 162x Serial ATA. This option enables support for Initio 162x Serial ATA.
config SATA_ACARD_AHCI
tristate "ACard AHCI variant (ATP 8620)"
depends on PCI
help
This option enables support for Acard.
If unsure, say N.
config SATA_SIL24 config SATA_SIL24
tristate "Silicon Image 3124/3132 SATA support" tristate "Silicon Image 3124/3132 SATA support"
depends on PCI depends on PCI
...@@ -400,11 +416,11 @@ config PATA_HPT37X ...@@ -400,11 +416,11 @@ config PATA_HPT37X
If unsure, say N. If unsure, say N.
config PATA_HPT3X2N config PATA_HPT3X2N
tristate "HPT 372N/302N PATA support" tristate "HPT 371N/372N/302N PATA support"
depends on PCI depends on PCI
help help
This option enables support for the N variant HPT PATA This option enables support for the N variant HPT PATA
controllers via the new ATA layer controllers via the new ATA layer.
If unsure, say N. If unsure, say N.
...@@ -765,14 +781,6 @@ config PATA_PCMCIA ...@@ -765,14 +781,6 @@ config PATA_PCMCIA
If unsure, say N. If unsure, say N.
config HAVE_PATA_PLATFORM
bool
help
This is an internal configuration node for any machine that
uses pata-platform driver to enable the relevant driver in the
configuration structure without having to submit endless patches
to update the PATA_PLATFORM entry.
config PATA_PLATFORM config PATA_PLATFORM
tristate "Generic platform device PATA support" tristate "Generic platform device PATA support"
depends on EMBEDDED || PPC || HAVE_PATA_PLATFORM depends on EMBEDDED || PPC || HAVE_PATA_PLATFORM
......
...@@ -3,6 +3,7 @@ obj-$(CONFIG_ATA) += libata.o ...@@ -3,6 +3,7 @@ obj-$(CONFIG_ATA) += libata.o
# non-SFF interface # non-SFF interface
obj-$(CONFIG_SATA_AHCI) += ahci.o libahci.o obj-$(CONFIG_SATA_AHCI) += ahci.o libahci.o
obj-$(CONFIG_SATA_ACARD_AHCI) += acard-ahci.o libahci.o
obj-$(CONFIG_SATA_AHCI_PLATFORM) += ahci_platform.o libahci.o obj-$(CONFIG_SATA_AHCI_PLATFORM) += ahci_platform.o libahci.o
obj-$(CONFIG_SATA_FSL) += sata_fsl.o obj-$(CONFIG_SATA_FSL) += sata_fsl.o
obj-$(CONFIG_SATA_INIC162X) += sata_inic162x.o obj-$(CONFIG_SATA_INIC162X) += sata_inic162x.o
......
This diff is collapsed.
...@@ -311,6 +311,8 @@ extern struct device_attribute *ahci_sdev_attrs[]; ...@@ -311,6 +311,8 @@ extern struct device_attribute *ahci_sdev_attrs[];
extern struct ata_port_operations ahci_ops; extern struct ata_port_operations ahci_ops;
void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
u32 opts);
void ahci_save_initial_config(struct device *dev, void ahci_save_initial_config(struct device *dev,
struct ahci_host_priv *hpriv, struct ahci_host_priv *hpriv,
unsigned int force_port_map, unsigned int force_port_map,
...@@ -326,6 +328,7 @@ int ahci_stop_engine(struct ata_port *ap); ...@@ -326,6 +328,7 @@ int ahci_stop_engine(struct ata_port *ap);
void ahci_start_engine(struct ata_port *ap); void ahci_start_engine(struct ata_port *ap);
int ahci_check_ready(struct ata_link *link); int ahci_check_ready(struct ata_link *link);
int ahci_kick_engine(struct ata_port *ap); int ahci_kick_engine(struct ata_port *ap);
int ahci_port_resume(struct ata_port *ap);
void ahci_set_em_messages(struct ahci_host_priv *hpriv, void ahci_set_em_messages(struct ahci_host_priv *hpriv,
struct ata_port_info *pi); struct ata_port_info *pi);
int ahci_reset_em(struct ata_host *host); int ahci_reset_em(struct ata_host *host);
......
...@@ -87,10 +87,7 @@ static int ahci_hardreset(struct ata_link *link, unsigned int *class, ...@@ -87,10 +87,7 @@ static int ahci_hardreset(struct ata_link *link, unsigned int *class,
static void ahci_postreset(struct ata_link *link, unsigned int *class); static void ahci_postreset(struct ata_link *link, unsigned int *class);
static void ahci_error_handler(struct ata_port *ap); static void ahci_error_handler(struct ata_port *ap);
static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
static int ahci_port_resume(struct ata_port *ap);
static void ahci_dev_config(struct ata_device *dev); static void ahci_dev_config(struct ata_device *dev);
static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
u32 opts);
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
#endif #endif
...@@ -1133,7 +1130,7 @@ static unsigned int ahci_dev_classify(struct ata_port *ap) ...@@ -1133,7 +1130,7 @@ static unsigned int ahci_dev_classify(struct ata_port *ap)
return ata_dev_classify(&tf); return ata_dev_classify(&tf);
} }
static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
u32 opts) u32 opts)
{ {
dma_addr_t cmd_tbl_dma; dma_addr_t cmd_tbl_dma;
...@@ -1145,6 +1142,7 @@ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, ...@@ -1145,6 +1142,7 @@ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
pp->cmd_slot[tag].tbl_addr = cpu_to_le32(cmd_tbl_dma & 0xffffffff); pp->cmd_slot[tag].tbl_addr = cpu_to_le32(cmd_tbl_dma & 0xffffffff);
pp->cmd_slot[tag].tbl_addr_hi = cpu_to_le32((cmd_tbl_dma >> 16) >> 16); pp->cmd_slot[tag].tbl_addr_hi = cpu_to_le32((cmd_tbl_dma >> 16) >> 16);
} }
EXPORT_SYMBOL_GPL(ahci_fill_cmd_slot);
int ahci_kick_engine(struct ata_port *ap) int ahci_kick_engine(struct ata_port *ap)
{ {
...@@ -1918,7 +1916,7 @@ static void ahci_pmp_detach(struct ata_port *ap) ...@@ -1918,7 +1916,7 @@ static void ahci_pmp_detach(struct ata_port *ap)
writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
} }
static int ahci_port_resume(struct ata_port *ap) int ahci_port_resume(struct ata_port *ap)
{ {
ahci_power_up(ap); ahci_power_up(ap);
ahci_start_port(ap); ahci_start_port(ap);
...@@ -1930,6 +1928,7 @@ static int ahci_port_resume(struct ata_port *ap) ...@@ -1930,6 +1928,7 @@ static int ahci_port_resume(struct ata_port *ap)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(ahci_port_resume);
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
......
...@@ -346,12 +346,11 @@ struct device_attribute *ata_common_sdev_attrs[] = { ...@@ -346,12 +346,11 @@ struct device_attribute *ata_common_sdev_attrs[] = {
}; };
EXPORT_SYMBOL_GPL(ata_common_sdev_attrs); EXPORT_SYMBOL_GPL(ata_common_sdev_attrs);
static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, static void ata_scsi_invalid_field(struct scsi_cmnd *cmd)
void (*done)(struct scsi_cmnd *))
{ {
ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0); ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0);
/* "Invalid field in cbd" */ /* "Invalid field in cbd" */
done(cmd); cmd->scsi_done(cmd);
} }
/** /**
...@@ -719,7 +718,6 @@ EXPORT_SYMBOL_GPL(ata_scsi_ioctl); ...@@ -719,7 +718,6 @@ EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
* ata_scsi_qc_new - acquire new ata_queued_cmd reference * ata_scsi_qc_new - acquire new ata_queued_cmd reference
* @dev: ATA device to which the new command is attached * @dev: ATA device to which the new command is attached
* @cmd: SCSI command that originated this ATA command * @cmd: SCSI command that originated this ATA command
* @done: SCSI command completion function
* *
* Obtain a reference to an unused ata_queued_cmd structure, * Obtain a reference to an unused ata_queued_cmd structure,
* which is the basic libata structure representing a single * which is the basic libata structure representing a single
...@@ -736,21 +734,20 @@ EXPORT_SYMBOL_GPL(ata_scsi_ioctl); ...@@ -736,21 +734,20 @@ EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
* Command allocated, or %NULL if none available. * Command allocated, or %NULL if none available.
*/ */
static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
struct scsi_cmnd *cmd, struct scsi_cmnd *cmd)
void (*done)(struct scsi_cmnd *))
{ {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
qc = ata_qc_new_init(dev); qc = ata_qc_new_init(dev);
if (qc) { if (qc) {
qc->scsicmd = cmd; qc->scsicmd = cmd;
qc->scsidone = done; qc->scsidone = cmd->scsi_done;
qc->sg = scsi_sglist(cmd); qc->sg = scsi_sglist(cmd);
qc->n_elem = scsi_sg_count(cmd); qc->n_elem = scsi_sg_count(cmd);
} else { } else {
cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1); cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
done(cmd); cmd->scsi_done(cmd);
} }
return qc; return qc;
...@@ -1735,7 +1732,6 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) ...@@ -1735,7 +1732,6 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
* ata_scsi_translate - Translate then issue SCSI command to ATA device * ata_scsi_translate - Translate then issue SCSI command to ATA device
* @dev: ATA device to which the command is addressed * @dev: ATA device to which the command is addressed
* @cmd: SCSI command to execute * @cmd: SCSI command to execute
* @done: SCSI command completion function
* @xlat_func: Actor which translates @cmd to an ATA taskfile * @xlat_func: Actor which translates @cmd to an ATA taskfile
* *
* Our ->queuecommand() function has decided that the SCSI * Our ->queuecommand() function has decided that the SCSI
...@@ -1759,7 +1755,6 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) ...@@ -1759,7 +1755,6 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
* needs to be deferred. * needs to be deferred.
*/ */
static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
void (*done)(struct scsi_cmnd *),
ata_xlat_func_t xlat_func) ata_xlat_func_t xlat_func)
{ {
struct ata_port *ap = dev->link->ap; struct ata_port *ap = dev->link->ap;
...@@ -1768,7 +1763,7 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -1768,7 +1763,7 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
VPRINTK("ENTER\n"); VPRINTK("ENTER\n");
qc = ata_scsi_qc_new(dev, cmd, done); qc = ata_scsi_qc_new(dev, cmd);
if (!qc) if (!qc)
goto err_mem; goto err_mem;
...@@ -1804,14 +1799,14 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -1804,14 +1799,14 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
early_finish: early_finish:
ata_qc_free(qc); ata_qc_free(qc);
qc->scsidone(cmd); cmd->scsi_done(cmd);
DPRINTK("EXIT - early finish (good or error)\n"); DPRINTK("EXIT - early finish (good or error)\n");
return 0; return 0;
err_did: err_did:
ata_qc_free(qc); ata_qc_free(qc);
cmd->result = (DID_ERROR << 16); cmd->result = (DID_ERROR << 16);
qc->scsidone(cmd); cmd->scsi_done(cmd);
err_mem: err_mem:
DPRINTK("EXIT - internal\n"); DPRINTK("EXIT - internal\n");
return 0; return 0;
...@@ -3116,7 +3111,6 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap, ...@@ -3116,7 +3111,6 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap,
} }
static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
void (*done)(struct scsi_cmnd *),
struct ata_device *dev) struct ata_device *dev)
{ {
u8 scsi_op = scmd->cmnd[0]; u8 scsi_op = scmd->cmnd[0];
...@@ -3150,9 +3144,9 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, ...@@ -3150,9 +3144,9 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
} }
if (xlat_func) if (xlat_func)
rc = ata_scsi_translate(dev, scmd, done, xlat_func); rc = ata_scsi_translate(dev, scmd, xlat_func);
else else
ata_scsi_simulate(dev, scmd, done); ata_scsi_simulate(dev, scmd);
return rc; return rc;
...@@ -3160,7 +3154,7 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, ...@@ -3160,7 +3154,7 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n", DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
scmd->cmd_len, scsi_op, dev->cdb_len); scmd->cmd_len, scsi_op, dev->cdb_len);
scmd->result = DID_ERROR << 16; scmd->result = DID_ERROR << 16;
done(scmd); scmd->scsi_done(scmd);
return 0; return 0;
} }
...@@ -3199,7 +3193,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) ...@@ -3199,7 +3193,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
dev = ata_scsi_find_dev(ap, scsidev); dev = ata_scsi_find_dev(ap, scsidev);
if (likely(dev)) if (likely(dev))
rc = __ata_scsi_queuecmd(cmd, cmd->scsi_done, dev); rc = __ata_scsi_queuecmd(cmd, dev);
else { else {
cmd->result = (DID_BAD_TARGET << 16); cmd->result = (DID_BAD_TARGET << 16);
cmd->scsi_done(cmd); cmd->scsi_done(cmd);
...@@ -3214,7 +3208,6 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) ...@@ -3214,7 +3208,6 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
* ata_scsi_simulate - simulate SCSI command on ATA device * ata_scsi_simulate - simulate SCSI command on ATA device
* @dev: the target device * @dev: the target device
* @cmd: SCSI command being sent to device. * @cmd: SCSI command being sent to device.
* @done: SCSI command completion function.
* *
* Interprets and directly executes a select list of SCSI commands * Interprets and directly executes a select list of SCSI commands
* that can be handled internally. * that can be handled internally.
...@@ -3223,8 +3216,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) ...@@ -3223,8 +3216,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
* spin_lock_irqsave(host lock) * spin_lock_irqsave(host lock)
*/ */
void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
void (*done)(struct scsi_cmnd *))
{ {
struct ata_scsi_args args; struct ata_scsi_args args;
const u8 *scsicmd = cmd->cmnd; const u8 *scsicmd = cmd->cmnd;
...@@ -3233,17 +3225,17 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3233,17 +3225,17 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
args.dev = dev; args.dev = dev;
args.id = dev->id; args.id = dev->id;
args.cmd = cmd; args.cmd = cmd;
args.done = done; args.done = cmd->scsi_done;
switch(scsicmd[0]) { switch(scsicmd[0]) {
/* TODO: worth improving? */ /* TODO: worth improving? */
case FORMAT_UNIT: case FORMAT_UNIT:
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
break; break;
case INQUIRY: case INQUIRY:
if (scsicmd[1] & 2) /* is CmdDt set? */ if (scsicmd[1] & 2) /* is CmdDt set? */
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */ else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std); ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
else switch (scsicmd[2]) { else switch (scsicmd[2]) {
...@@ -3269,7 +3261,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3269,7 +3261,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b2); ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b2);
break; break;
default: default:
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
break; break;
} }
break; break;
...@@ -3281,7 +3273,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3281,7 +3273,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
case MODE_SELECT: /* unconditionally return */ case MODE_SELECT: /* unconditionally return */
case MODE_SELECT_10: /* bad-field-in-cdb */ case MODE_SELECT_10: /* bad-field-in-cdb */
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
break; break;
case READ_CAPACITY: case READ_CAPACITY:
...@@ -3292,7 +3284,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3292,7 +3284,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16) if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap); ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
else else
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
break; break;
case REPORT_LUNS: case REPORT_LUNS:
...@@ -3302,7 +3294,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3302,7 +3294,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
case REQUEST_SENSE: case REQUEST_SENSE:
ata_scsi_set_sense(cmd, 0, 0, 0); ata_scsi_set_sense(cmd, 0, 0, 0);
cmd->result = (DRIVER_SENSE << 24); cmd->result = (DRIVER_SENSE << 24);
done(cmd); cmd->scsi_done(cmd);
break; break;
/* if we reach this, then writeback caching is disabled, /* if we reach this, then writeback caching is disabled,
...@@ -3324,14 +3316,14 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, ...@@ -3324,14 +3316,14 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4])) if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
ata_scsi_rbuf_fill(&args, ata_scsiop_noop); ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
else else
ata_scsi_invalid_field(cmd, done); ata_scsi_invalid_field(cmd);
break; break;
/* all other commands */ /* all other commands */
default: default:
ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0); ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
/* "Invalid command operation code" */ /* "Invalid command operation code" */
done(cmd); cmd->scsi_done(cmd);
break; break;
} }
} }
...@@ -3858,7 +3850,6 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure); ...@@ -3858,7 +3850,6 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
/** /**
* ata_sas_queuecmd - Issue SCSI cdb to libata-managed device * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
* @cmd: SCSI command to be sent * @cmd: SCSI command to be sent
* @done: Completion function, called when command is complete
* @ap: ATA port to which the command is being sent * @ap: ATA port to which the command is being sent
* *
* RETURNS: * RETURNS:
...@@ -3866,18 +3857,17 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure); ...@@ -3866,18 +3857,17 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
* 0 otherwise. * 0 otherwise.
*/ */
int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
struct ata_port *ap)
{ {
int rc = 0; int rc = 0;
ata_scsi_dump_cdb(ap, cmd); ata_scsi_dump_cdb(ap, cmd);
if (likely(ata_dev_enabled(ap->link.device))) if (likely(ata_dev_enabled(ap->link.device)))
rc = __ata_scsi_queuecmd(cmd, done, ap->link.device); rc = __ata_scsi_queuecmd(cmd, ap->link.device);
else { else {
cmd->result = (DID_BAD_TARGET << 16); cmd->result = (DID_BAD_TARGET << 16);
done(cmd); cmd->scsi_done(cmd);
} }
return rc; return rc;
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_hpt366" #define DRV_NAME "pata_hpt366"
#define DRV_VERSION "0.6.8" #define DRV_VERSION "0.6.9"
struct hpt_clock { struct hpt_clock {
u8 xfer_mode; u8 xfer_mode;
...@@ -110,18 +110,23 @@ static const struct hpt_clock hpt366_25[] = { ...@@ -110,18 +110,23 @@ static const struct hpt_clock hpt366_25[] = {
{ 0, 0x01208585 } { 0, 0x01208585 }
}; };
static const char *bad_ata33[] = { static const char * const bad_ata33[] = {
"Maxtor 92720U8", "Maxtor 92040U6", "Maxtor 91360U4", "Maxtor 91020U3", "Maxtor 90845U3", "Maxtor 90650U2", "Maxtor 92720U8", "Maxtor 92040U6", "Maxtor 91360U4", "Maxtor 91020U3",
"Maxtor 91360D8", "Maxtor 91190D7", "Maxtor 91020D6", "Maxtor 90845D5", "Maxtor 90680D4", "Maxtor 90510D3", "Maxtor 90340D2", "Maxtor 90845U3", "Maxtor 90650U2",
"Maxtor 91152D8", "Maxtor 91008D7", "Maxtor 90845D6", "Maxtor 90840D6", "Maxtor 90720D5", "Maxtor 90648D5", "Maxtor 90576D4", "Maxtor 91360D8", "Maxtor 91190D7", "Maxtor 91020D6", "Maxtor 90845D5",
"Maxtor 90680D4", "Maxtor 90510D3", "Maxtor 90340D2",
"Maxtor 91152D8", "Maxtor 91008D7", "Maxtor 90845D6", "Maxtor 90840D6",
"Maxtor 90720D5", "Maxtor 90648D5", "Maxtor 90576D4",
"Maxtor 90510D4", "Maxtor 90510D4",
"Maxtor 90432D3", "Maxtor 90288D2", "Maxtor 90256D2", "Maxtor 90432D3", "Maxtor 90288D2", "Maxtor 90256D2",
"Maxtor 91000D8", "Maxtor 90910D8", "Maxtor 90875D7", "Maxtor 90840D7", "Maxtor 90750D6", "Maxtor 90625D5", "Maxtor 90500D4", "Maxtor 91000D8", "Maxtor 90910D8", "Maxtor 90875D7", "Maxtor 90840D7",
"Maxtor 91728D8", "Maxtor 91512D7", "Maxtor 91303D6", "Maxtor 91080D5", "Maxtor 90845D4", "Maxtor 90680D4", "Maxtor 90648D3", "Maxtor 90432D2", "Maxtor 90750D6", "Maxtor 90625D5", "Maxtor 90500D4",
"Maxtor 91728D8", "Maxtor 91512D7", "Maxtor 91303D6", "Maxtor 91080D5",
"Maxtor 90845D4", "Maxtor 90680D4", "Maxtor 90648D3", "Maxtor 90432D2",
NULL NULL
}; };
static const char *bad_ata66_4[] = { static const char * const bad_ata66_4[] = {
"IBM-DTLA-307075", "IBM-DTLA-307075",
"IBM-DTLA-307060", "IBM-DTLA-307060",
"IBM-DTLA-307045", "IBM-DTLA-307045",
...@@ -140,12 +145,13 @@ static const char *bad_ata66_4[] = { ...@@ -140,12 +145,13 @@ static const char *bad_ata66_4[] = {
NULL NULL
}; };
static const char *bad_ata66_3[] = { static const char * const bad_ata66_3[] = {
"WDC AC310200R", "WDC AC310200R",
NULL NULL
}; };
static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr, const char *list[]) static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
const char * const list[])
{ {
unsigned char model_num[ATA_ID_PROD_LEN + 1]; unsigned char model_num[ATA_ID_PROD_LEN + 1];
int i = 0; int i = 0;
...@@ -288,6 +294,7 @@ static struct ata_port_operations hpt366_port_ops = { ...@@ -288,6 +294,7 @@ static struct ata_port_operations hpt366_port_ops = {
static void hpt36x_init_chipset(struct pci_dev *dev) static void hpt36x_init_chipset(struct pci_dev *dev)
{ {
u8 drive_fast; u8 drive_fast;
pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4)); pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4));
pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78); pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78);
pci_write_config_byte(dev, PCI_MIN_GNT, 0x08); pci_write_config_byte(dev, PCI_MIN_GNT, 0x08);
...@@ -349,7 +356,7 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -349,7 +356,7 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* PCI clocking determines the ATA timing values to use */ /* PCI clocking determines the ATA timing values to use */
/* info_hpt366 is safe against re-entry so we can scribble on it */ /* info_hpt366 is safe against re-entry so we can scribble on it */
switch((reg1 & 0x700) >> 8) { switch ((reg1 & 0x700) >> 8) {
case 9: case 9:
hpriv = &hpt366_40; hpriv = &hpt366_40;
break; break;
......
This diff is collapsed.
/* /*
* Libata driver for the highpoint 372N and 302N UDMA66 ATA controllers. * Libata driver for the HighPoint 371N, 372N, and 302N UDMA66 ATA controllers.
* *
* This driver is heavily based upon: * This driver is heavily based upon:
* *
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org>
* Portions Copyright (C) 2001 Sun Microsystems, Inc. * Portions Copyright (C) 2001 Sun Microsystems, Inc.
* Portions Copyright (C) 2003 Red Hat Inc * Portions Copyright (C) 2003 Red Hat Inc
* Portions Copyright (C) 2005-2009 MontaVista Software, Inc. * Portions Copyright (C) 2005-2010 MontaVista Software, Inc.
* *
* *
* TODO * TODO
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_hpt3x2n" #define DRV_NAME "pata_hpt3x2n"
#define DRV_VERSION "0.3.10" #define DRV_VERSION "0.3.13"
enum { enum {
HPT_PCI_FAST = (1 << 31), HPT_PCI_FAST = (1 << 31),
...@@ -103,7 +103,7 @@ static u32 hpt3x2n_find_mode(struct ata_port *ap, int speed) ...@@ -103,7 +103,7 @@ static u32 hpt3x2n_find_mode(struct ata_port *ap, int speed)
{ {
struct hpt_clock *clocks = hpt3x2n_clocks; struct hpt_clock *clocks = hpt3x2n_clocks;
while(clocks->xfer_speed) { while (clocks->xfer_speed) {
if (clocks->xfer_speed == speed) if (clocks->xfer_speed == speed)
return clocks->timing; return clocks->timing;
clocks++; clocks++;
...@@ -112,6 +112,22 @@ static u32 hpt3x2n_find_mode(struct ata_port *ap, int speed) ...@@ -112,6 +112,22 @@ static u32 hpt3x2n_find_mode(struct ata_port *ap, int speed)
return 0xffffffffU; /* silence compiler warning */ return 0xffffffffU; /* silence compiler warning */
} }
/**
* hpt372n_filter - mode selection filter
* @adev: ATA device
* @mask: mode mask
*
* The Marvell bridge chips used on the HighPoint SATA cards do not seem
* to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes...
*/
static unsigned long hpt372n_filter(struct ata_device *adev, unsigned long mask)
{
if (ata_id_is_sata(adev->id))
mask &= ~((0xE << ATA_SHIFT_UDMA) | ATA_MASK_MWDMA);
return mask;
}
/** /**
* hpt3x2n_cable_detect - Detect the cable type * hpt3x2n_cable_detect - Detect the cable type
* @ap: ATA port to detect on * @ap: ATA port to detect on
...@@ -153,6 +169,7 @@ static int hpt3x2n_pre_reset(struct ata_link *link, unsigned long deadline) ...@@ -153,6 +169,7 @@ static int hpt3x2n_pre_reset(struct ata_link *link, unsigned long deadline)
{ {
struct ata_port *ap = link->ap; struct ata_port *ap = link->ap;
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
/* Reset the state machine */ /* Reset the state machine */
pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37); pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37);
udelay(100); udelay(100);
...@@ -328,10 +345,10 @@ static struct scsi_host_template hpt3x2n_sht = { ...@@ -328,10 +345,10 @@ static struct scsi_host_template hpt3x2n_sht = {
}; };
/* /*
* Configuration for HPT3x2n. * Configuration for HPT302N/371N.
*/ */
static struct ata_port_operations hpt3x2n_port_ops = { static struct ata_port_operations hpt3xxn_port_ops = {
.inherits = &ata_bmdma_port_ops, .inherits = &ata_bmdma_port_ops,
.bmdma_stop = hpt3x2n_bmdma_stop, .bmdma_stop = hpt3x2n_bmdma_stop,
...@@ -345,6 +362,15 @@ static struct ata_port_operations hpt3x2n_port_ops = { ...@@ -345,6 +362,15 @@ static struct ata_port_operations hpt3x2n_port_ops = {
.prereset = hpt3x2n_pre_reset, .prereset = hpt3x2n_pre_reset,
}; };
/*
* Configuration for HPT372N. Same as 302N/371N but we have a mode filter.
*/
static struct ata_port_operations hpt372n_port_ops = {
.inherits = &hpt3xxn_port_ops,
.mode_filter = &hpt372n_filter,
};
/** /**
* hpt3xn_calibrate_dpll - Calibrate the DPLL loop * hpt3xn_calibrate_dpll - Calibrate the DPLL loop
* @dev: PCI device * @dev: PCI device
...@@ -359,12 +385,12 @@ static int hpt3xn_calibrate_dpll(struct pci_dev *dev) ...@@ -359,12 +385,12 @@ static int hpt3xn_calibrate_dpll(struct pci_dev *dev)
u32 reg5c; u32 reg5c;
int tries; int tries;
for(tries = 0; tries < 0x5000; tries++) { for (tries = 0; tries < 0x5000; tries++) {
udelay(50); udelay(50);
pci_read_config_byte(dev, 0x5b, &reg5b); pci_read_config_byte(dev, 0x5b, &reg5b);
if (reg5b & 0x80) { if (reg5b & 0x80) {
/* See if it stays set */ /* See if it stays set */
for(tries = 0; tries < 0x1000; tries ++) { for (tries = 0; tries < 0x1000; tries++) {
pci_read_config_byte(dev, 0x5b, &reg5b); pci_read_config_byte(dev, 0x5b, &reg5b);
/* Failed ? */ /* Failed ? */
if ((reg5b & 0x80) == 0) if ((reg5b & 0x80) == 0)
...@@ -372,7 +398,7 @@ static int hpt3xn_calibrate_dpll(struct pci_dev *dev) ...@@ -372,7 +398,7 @@ static int hpt3xn_calibrate_dpll(struct pci_dev *dev)
} }
/* Turn off tuning, we have the DPLL set */ /* Turn off tuning, we have the DPLL set */
pci_read_config_dword(dev, 0x5c, &reg5c); pci_read_config_dword(dev, 0x5c, &reg5c);
pci_write_config_dword(dev, 0x5c, reg5c & ~ 0x100); pci_write_config_dword(dev, 0x5c, reg5c & ~0x100);
return 1; return 1;
} }
} }
...@@ -388,8 +414,19 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev) ...@@ -388,8 +414,19 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev)
fcnt = inl(iobase + 0x90); /* Not PCI readable for some chips */ fcnt = inl(iobase + 0x90); /* Not PCI readable for some chips */
if ((fcnt >> 12) != 0xABCDE) { if ((fcnt >> 12) != 0xABCDE) {
printk(KERN_WARNING "hpt3xn: BIOS clock data not set.\n"); int i;
return 33; /* Not BIOS set */ u16 sr;
u32 total = 0;
printk(KERN_WARNING "pata_hpt3x2n: BIOS clock data not set.\n");
/* This is the process the HPT371 BIOS is reported to use */
for (i = 0; i < 128; i++) {
pci_read_config_word(pdev, 0x78, &sr);
total += sr & 0x1FF;
udelay(15);
}
fcnt = total / 128;
} }
fcnt &= 0x1FF; fcnt &= 0x1FF;
...@@ -431,21 +468,27 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev) ...@@ -431,21 +468,27 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev)
* HPT372N 9 (HPT372N) * UDMA133 * HPT372N 9 (HPT372N) * UDMA133
* *
* (1) UDMA133 support depends on the bus clock * (1) UDMA133 support depends on the bus clock
*
* To pin down HPT371N
*/ */
static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
/* HPT372N and friends - UDMA133 */ /* HPT372N - UDMA133 */
static const struct ata_port_info info = { static const struct ata_port_info info_hpt372n = {
.flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = ATA_PIO4,
.mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6,
.port_ops = &hpt372n_port_ops
};
/* HPT302N and HPT371N - UDMA133 */
static const struct ata_port_info info_hpt3xxn = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = ATA_PIO4, .pio_mask = ATA_PIO4,
.mwdma_mask = ATA_MWDMA2, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &hpt3x2n_port_ops .port_ops = &hpt3xxn_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info_hpt3xxn, NULL };
u8 rev = dev->revision; u8 rev = dev->revision;
u8 irqmask; u8 irqmask;
unsigned int pci_mhz; unsigned int pci_mhz;
...@@ -459,29 +502,35 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -459,29 +502,35 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
if (rc) if (rc)
return rc; return rc;
switch(dev->device) { switch (dev->device) {
case PCI_DEVICE_ID_TTI_HPT366: case PCI_DEVICE_ID_TTI_HPT366:
/* 372N if rev >= 6 */
if (rev < 6) if (rev < 6)
return -ENODEV; return -ENODEV;
break; goto hpt372n;
case PCI_DEVICE_ID_TTI_HPT371: case PCI_DEVICE_ID_TTI_HPT371:
/* 371N if rev >= 2 */
if (rev < 2) if (rev < 2)
return -ENODEV; return -ENODEV;
/* 371N if rev > 1 */
break; break;
case PCI_DEVICE_ID_TTI_HPT372: case PCI_DEVICE_ID_TTI_HPT372:
/* 372N if rev >= 2*/ /* 372N if rev >= 2 */
if (rev < 2) if (rev < 2)
return -ENODEV; return -ENODEV;
break; goto hpt372n;
case PCI_DEVICE_ID_TTI_HPT302: case PCI_DEVICE_ID_TTI_HPT302:
/* 302N if rev >= 2 */
if (rev < 2) if (rev < 2)
return -ENODEV; return -ENODEV;
break; break;
case PCI_DEVICE_ID_TTI_HPT372N: case PCI_DEVICE_ID_TTI_HPT372N:
hpt372n:
ppi[0] = &info_hpt372n;
break; break;
default: default:
printk(KERN_ERR "pata_hpt3x2n: PCI table is bogus please report (%d).\n", dev->device); printk(KERN_ERR
"pata_hpt3x2n: PCI table is bogus please report (%d).\n",
dev->device);
return -ENODEV; return -ENODEV;
} }
...@@ -509,8 +558,10 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -509,8 +558,10 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
pci_write_config_byte(dev, 0x50, mcr1); pci_write_config_byte(dev, 0x50, mcr1);
} }
/* Tune the PLL. HPT recommend using 75 for SATA, 66 for UDMA133 or /*
50 for UDMA100. Right now we always use 66 */ * Tune the PLL. HPT recommend using 75 for SATA, 66 for UDMA133 or
* 50 for UDMA100. Right now we always use 66
*/
pci_mhz = hpt3x2n_pci_clock(dev); pci_mhz = hpt3x2n_pci_clock(dev);
...@@ -522,7 +573,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -522,7 +573,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
pci_write_config_byte(dev, 0x5B, 0x21); pci_write_config_byte(dev, 0x5B, 0x21);
/* Unlike the 37x we don't try jiggling the frequency */ /* Unlike the 37x we don't try jiggling the frequency */
for(adjust = 0; adjust < 8; adjust++) { for (adjust = 0; adjust < 8; adjust++) {
if (hpt3xn_calibrate_dpll(dev)) if (hpt3xn_calibrate_dpll(dev))
break; break;
pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low); pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low);
...@@ -534,8 +585,11 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -534,8 +585,11 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using 66MHz DPLL.\n", printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using 66MHz DPLL.\n",
pci_mhz); pci_mhz);
/* Set our private data up. We only need a few flags so we use
it directly */ /*
* Set our private data up. We only need a few flags
* so we use it directly.
*/
if (pci_mhz > 60) if (pci_mhz > 60)
hpriv = (void *)(PCI66 | USE_DPLL); hpriv = (void *)(PCI66 | USE_DPLL);
...@@ -579,7 +633,7 @@ static void __exit hpt3x2n_exit(void) ...@@ -579,7 +633,7 @@ static void __exit hpt3x2n_exit(void)
} }
MODULE_AUTHOR("Alan Cox"); MODULE_AUTHOR("Alan Cox");
MODULE_DESCRIPTION("low-level driver for the Highpoint HPT3x2n/30x"); MODULE_DESCRIPTION("low-level driver for the Highpoint HPT3xxN");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, hpt3x2n); MODULE_DEVICE_TABLE(pci, hpt3x2n);
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
......
...@@ -5748,7 +5748,7 @@ static int ipr_queuecommand_lck(struct scsi_cmnd *scsi_cmd, ...@@ -5748,7 +5748,7 @@ static int ipr_queuecommand_lck(struct scsi_cmnd *scsi_cmd,
} }
if (ipr_is_gata(res) && res->sata_port) if (ipr_is_gata(res) && res->sata_port)
return ata_sas_queuecmd(scsi_cmd, done, res->sata_port->ap); return ata_sas_queuecmd(scsi_cmd, res->sata_port->ap);
ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
ioarcb = &ipr_cmd->ioarcb; ioarcb = &ipr_cmd->ioarcb;
......
...@@ -211,8 +211,7 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd, ...@@ -211,8 +211,7 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd,
unsigned long flags; unsigned long flags;
spin_lock_irqsave(dev->sata_dev.ap->lock, flags); spin_lock_irqsave(dev->sata_dev.ap->lock, flags);
res = ata_sas_queuecmd(cmd, scsi_done, res = ata_sas_queuecmd(cmd, dev->sata_dev.ap);
dev->sata_dev.ap);
spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags); spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags);
goto out; goto out;
} }
......
...@@ -996,8 +996,7 @@ extern int ata_sas_port_init(struct ata_port *); ...@@ -996,8 +996,7 @@ extern int ata_sas_port_init(struct ata_port *);
extern int ata_sas_port_start(struct ata_port *ap); extern int ata_sas_port_start(struct ata_port *ap);
extern void ata_sas_port_stop(struct ata_port *ap); extern void ata_sas_port_stop(struct ata_port *ap);
extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *); extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
struct ata_port *ap);
extern int sata_scr_valid(struct ata_link *link); extern int sata_scr_valid(struct ata_link *link);
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
extern int sata_scr_write(struct ata_link *link, int reg, u32 val); extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
...@@ -1040,8 +1039,7 @@ extern unsigned int ata_do_dev_read_id(struct ata_device *dev, ...@@ -1040,8 +1039,7 @@ extern unsigned int ata_do_dev_read_id(struct ata_device *dev,
struct ata_taskfile *tf, u16 *id); struct ata_taskfile *tf, u16 *id);
extern void ata_qc_complete(struct ata_queued_cmd *qc); extern void ata_qc_complete(struct ata_queued_cmd *qc);
extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active); extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active);
extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd);
void (*done)(struct scsi_cmnd *));
extern int ata_std_bios_param(struct scsi_device *sdev, extern int ata_std_bios_param(struct scsi_device *sdev,
struct block_device *bdev, struct block_device *bdev,
sector_t capacity, int geom[]); sector_t capacity, int geom[]);
......
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