libata: add @is_cmd to ata_tf_to_fis()
Add @is_cmd to ata_tf_to_fis(). This controls bit 7 of the second byte which tells the device whether this H2D FIS is for a command or not. This cleans up ahci a bit and will be used by PMP. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
fe36cb53cf
commit
9977126c4b
@ -1020,8 +1020,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class,
|
|||||||
cmd_fis_len | AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY);
|
cmd_fis_len | AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY);
|
||||||
|
|
||||||
tf.ctl |= ATA_SRST;
|
tf.ctl |= ATA_SRST;
|
||||||
ata_tf_to_fis(&tf, fis, 0);
|
ata_tf_to_fis(&tf, 0, 0, fis);
|
||||||
fis[1] &= ~(1 << 7); /* turn off Command FIS bit */
|
|
||||||
|
|
||||||
writel(1, port_mmio + PORT_CMD_ISSUE);
|
writel(1, port_mmio + PORT_CMD_ISSUE);
|
||||||
|
|
||||||
@ -1039,8 +1038,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class,
|
|||||||
ahci_fill_cmd_slot(pp, 0, cmd_fis_len);
|
ahci_fill_cmd_slot(pp, 0, cmd_fis_len);
|
||||||
|
|
||||||
tf.ctl &= ~ATA_SRST;
|
tf.ctl &= ~ATA_SRST;
|
||||||
ata_tf_to_fis(&tf, fis, 0);
|
ata_tf_to_fis(&tf, 0, 0, fis);
|
||||||
fis[1] &= ~(1 << 7); /* turn off Command FIS bit */
|
|
||||||
|
|
||||||
writel(1, port_mmio + PORT_CMD_ISSUE);
|
writel(1, port_mmio + PORT_CMD_ISSUE);
|
||||||
readl(port_mmio + PORT_CMD_ISSUE); /* flush */
|
readl(port_mmio + PORT_CMD_ISSUE); /* flush */
|
||||||
@ -1088,7 +1086,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
|
|||||||
/* clear D2H reception area to properly wait for D2H FIS */
|
/* clear D2H reception area to properly wait for D2H FIS */
|
||||||
ata_tf_init(ap->device, &tf);
|
ata_tf_init(ap->device, &tf);
|
||||||
tf.command = 0x80;
|
tf.command = 0x80;
|
||||||
ata_tf_to_fis(&tf, d2h_fis, 0);
|
ata_tf_to_fis(&tf, 0, 0, d2h_fis);
|
||||||
|
|
||||||
rc = sata_std_hardreset(ap, class, deadline);
|
rc = sata_std_hardreset(ap, class, deadline);
|
||||||
|
|
||||||
@ -1205,7 +1203,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
|||||||
*/
|
*/
|
||||||
cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ;
|
cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ;
|
||||||
|
|
||||||
ata_tf_to_fis(&qc->tf, cmd_tbl, 0);
|
ata_tf_to_fis(&qc->tf, 0, 1, cmd_tbl);
|
||||||
if (is_atapi) {
|
if (is_atapi) {
|
||||||
memset(cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32);
|
memset(cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32);
|
||||||
memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len);
|
memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len);
|
||||||
|
@ -111,8 +111,9 @@ MODULE_VERSION(DRV_VERSION);
|
|||||||
/**
|
/**
|
||||||
* ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
|
* ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
|
||||||
* @tf: Taskfile to convert
|
* @tf: Taskfile to convert
|
||||||
* @fis: Buffer into which data will output
|
|
||||||
* @pmp: Port multiplier port
|
* @pmp: Port multiplier port
|
||||||
|
* @is_cmd: This FIS is for command
|
||||||
|
* @fis: Buffer into which data will output
|
||||||
*
|
*
|
||||||
* Converts a standard ATA taskfile to a Serial ATA
|
* Converts a standard ATA taskfile to a Serial ATA
|
||||||
* FIS structure (Register - Host to Device).
|
* FIS structure (Register - Host to Device).
|
||||||
@ -120,12 +121,13 @@ MODULE_VERSION(DRV_VERSION);
|
|||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* Inherited from caller.
|
||||||
*/
|
*/
|
||||||
|
void ata_tf_to_fis(const struct ata_taskfile *tf, u8 pmp, int is_cmd, u8 *fis)
|
||||||
void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp)
|
|
||||||
{
|
{
|
||||||
fis[0] = 0x27; /* Register - Host to Device FIS */
|
fis[0] = 0x27; /* Register - Host to Device FIS */
|
||||||
fis[1] = (pmp & 0xf) | (1 << 7); /* Port multiplier number,
|
fis[1] = pmp & 0xf; /* Port multiplier number*/
|
||||||
bit 7 indicates Command FIS */
|
if (is_cmd)
|
||||||
|
fis[1] |= (1 << 7); /* bit 7 indicates Command FIS */
|
||||||
|
|
||||||
fis[2] = tf->command;
|
fis[2] = tf->command;
|
||||||
fis[3] = tf->feature;
|
fis[3] = tf->feature;
|
||||||
|
|
||||||
|
@ -337,7 +337,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
|||||||
buf[28] = dflags;
|
buf[28] = dflags;
|
||||||
|
|
||||||
/* frame information structure (FIS) */
|
/* frame information structure (FIS) */
|
||||||
ata_tf_to_fis(&qc->tf, &buf[32], 0);
|
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
||||||
|
@ -699,7 +699,7 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
prb->ctrl = cpu_to_le16(ctrl);
|
prb->ctrl = cpu_to_le16(ctrl);
|
||||||
ata_tf_to_fis(&qc->tf, prb->fis, 0);
|
ata_tf_to_fis(&qc->tf, 0, 1, prb->fis);
|
||||||
|
|
||||||
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
||||||
sil24_fill_sg(qc, sge);
|
sil24_fill_sg(qc, sge);
|
||||||
|
@ -764,7 +764,8 @@ extern unsigned int ata_dev_try_classify(struct ata_port *, unsigned int, u8 *);
|
|||||||
*/
|
*/
|
||||||
extern void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
|
extern void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
extern void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
extern void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
extern void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp);
|
extern void ata_tf_to_fis(const struct ata_taskfile *tf,
|
||||||
|
u8 pmp, int is_cmd, u8 *fis);
|
||||||
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
||||||
extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
|
extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
|
||||||
extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
|
extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
|
||||||
|
Loading…
Reference in New Issue
Block a user