mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 02:04:05 +08:00
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev: libata: fix translation for START STOP UNIT libata-scsi: ata_task_ioctl should return ATA registers from sense data pata_platform: set_mode fix ata_if_xfermask() word 51 fix pata_sil680: PIO1 taskfile transfers overclocking fix (repost) libata: fix ata_eh_suspend() return value ahci: port_no should be used when clearing IRQ in ahci_thaw() Fix trivial conflict in drivers/ata/pata_platform.c manually
This commit is contained in:
commit
8c8c4bafc3
@ -1282,7 +1282,7 @@ static void ahci_thaw(struct ata_port *ap)
|
|||||||
/* clear IRQ */
|
/* clear IRQ */
|
||||||
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
||||||
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
||||||
writel(1 << ap->id, mmio + HOST_IRQ_STAT);
|
writel(1 << ap->port_no, mmio + HOST_IRQ_STAT);
|
||||||
|
|
||||||
/* turn IRQ back on */
|
/* turn IRQ back on */
|
||||||
writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
|
writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
|
||||||
|
@ -1037,7 +1037,7 @@ static unsigned int ata_id_xfermask(const u16 *id)
|
|||||||
* the PIO timing number for the maximum. Turn it into
|
* the PIO timing number for the maximum. Turn it into
|
||||||
* a mask.
|
* a mask.
|
||||||
*/
|
*/
|
||||||
u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF;
|
u8 mode = (id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF;
|
||||||
if (mode < 5) /* Valid PIO range */
|
if (mode < 5) /* Valid PIO range */
|
||||||
pio_mask = (2 << mode) - 1;
|
pio_mask = (2 << mode) - 1;
|
||||||
else
|
else
|
||||||
|
@ -1796,7 +1796,7 @@ static int ata_eh_suspend(struct ata_port *ap, struct ata_device **r_failed_dev)
|
|||||||
*r_failed_dev = dev;
|
*r_failed_dev = dev;
|
||||||
|
|
||||||
DPRINTK("EXIT\n");
|
DPRINTK("EXIT\n");
|
||||||
return 0;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -273,8 +273,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
||||||
u8 args[7];
|
u8 args[7], *sensebuf = NULL;
|
||||||
struct scsi_sense_hdr sshdr;
|
int cmd_result;
|
||||||
|
|
||||||
if (arg == NULL)
|
if (arg == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -282,10 +282,14 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|||||||
if (copy_from_user(args, arg, sizeof(args)))
|
if (copy_from_user(args, arg, sizeof(args)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
|
||||||
|
if (!sensebuf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
||||||
scsi_cmd[0] = ATA_16;
|
scsi_cmd[0] = ATA_16;
|
||||||
scsi_cmd[1] = (3 << 1); /* Non-data */
|
scsi_cmd[1] = (3 << 1); /* Non-data */
|
||||||
/* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
|
scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
|
||||||
scsi_cmd[4] = args[1];
|
scsi_cmd[4] = args[1];
|
||||||
scsi_cmd[6] = args[2];
|
scsi_cmd[6] = args[2];
|
||||||
scsi_cmd[8] = args[3];
|
scsi_cmd[8] = args[3];
|
||||||
@ -295,11 +299,46 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|||||||
|
|
||||||
/* Good values for timeout and retries? Values below
|
/* Good values for timeout and retries? Values below
|
||||||
from scsi_ioctl_send_command() for default case... */
|
from scsi_ioctl_send_command() for default case... */
|
||||||
if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
|
cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
|
||||||
(10*HZ), 5))
|
sensebuf, (10*HZ), 5, 0);
|
||||||
rc = -EIO;
|
|
||||||
|
|
||||||
/* Need code to retrieve data from check condition? */
|
if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
|
||||||
|
u8 *desc = sensebuf + 8;
|
||||||
|
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
|
||||||
|
|
||||||
|
/* If we set cc then ATA pass-through will cause a
|
||||||
|
* check condition even if no error. Filter that. */
|
||||||
|
if (cmd_result & SAM_STAT_CHECK_CONDITION) {
|
||||||
|
struct scsi_sense_hdr sshdr;
|
||||||
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
||||||
|
&sshdr);
|
||||||
|
if (sshdr.sense_key==0 &&
|
||||||
|
sshdr.asc==0 && sshdr.ascq==0)
|
||||||
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send userspace ATA registers */
|
||||||
|
if (sensebuf[0] == 0x72 && /* format is "descriptor" */
|
||||||
|
desc[0] == 0x09) {/* code is "ATA Descriptor" */
|
||||||
|
args[0] = desc[13]; /* status */
|
||||||
|
args[1] = desc[3]; /* error */
|
||||||
|
args[2] = desc[5]; /* sector count (0:7) */
|
||||||
|
args[3] = desc[7]; /* lbal */
|
||||||
|
args[4] = desc[9]; /* lbam */
|
||||||
|
args[5] = desc[11]; /* lbah */
|
||||||
|
args[6] = desc[12]; /* select */
|
||||||
|
if (copy_to_user(arg, args, sizeof(args)))
|
||||||
|
rc = -EFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd_result) {
|
||||||
|
rc = -EIO;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
kfree(sensebuf);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -983,11 +1022,10 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
|
tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
|
||||||
} else {
|
} else
|
||||||
tf->nsect = 0; /* time period value (0 implies now) */
|
/* Issue ATA STANDBY IMMEDIATE command */
|
||||||
tf->command = ATA_CMD_STANDBY;
|
tf->command = ATA_CMD_STANDBYNOW1;
|
||||||
/* Consider: ATA STANDBY IMMEDIATE command */
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Standby and Idle condition timers could be implemented but that
|
* Standby and Idle condition timers could be implemented but that
|
||||||
* would require libata to implement the Power condition mode page
|
* would require libata to implement the Power condition mode page
|
||||||
|
@ -135,7 +135,7 @@ static void sil680_error_handler(struct ata_port *ap)
|
|||||||
static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 };
|
static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 };
|
||||||
static u16 speed_t[5] = { 0x328A, 0x1281, 0x1281, 0x10C3, 0x10C1 };
|
static u16 speed_t[5] = { 0x328A, 0x2283, 0x1281, 0x10C3, 0x10C1 };
|
||||||
|
|
||||||
unsigned long tfaddr = sil680_selreg(ap, 0x02);
|
unsigned long tfaddr = sil680_selreg(ap, 0x02);
|
||||||
unsigned long addr = sil680_seldev(ap, adev, 0x04);
|
unsigned long addr = sil680_seldev(ap, adev, 0x04);
|
||||||
|
Loading…
Reference in New Issue
Block a user