diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-01-30 11:46:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-01-30 11:46:17 -0500 |
commit | 8c8c4bafc3a20a6fb9078315ff865bc42276f9ba (patch) | |
tree | 5ea72d40c55890b3c1c944fa4ef8dd386e6e7ba5 /drivers/ata | |
parent | ad2e62a038c392a3453712fbb42fd71faacc203a (diff) | |
parent | 78981a7c6c34bddbb90da72cf6ce10953e84aad8 (diff) |
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
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/ahci.c | 2 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 2 | ||||
-rw-r--r-- | drivers/ata/libata-eh.c | 2 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 60 | ||||
-rw-r--r-- | drivers/ata/pata_sil680.c | 2 |
5 files changed, 53 insertions, 15 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 28a82e3403f1..48616c6fee9d 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1282,7 +1282,7 @@ static void ahci_thaw(struct ata_port *ap) | |||
1282 | /* clear IRQ */ | 1282 | /* clear IRQ */ |
1283 | tmp = readl(port_mmio + PORT_IRQ_STAT); | 1283 | tmp = readl(port_mmio + PORT_IRQ_STAT); |
1284 | writel(tmp, port_mmio + PORT_IRQ_STAT); | 1284 | writel(tmp, port_mmio + PORT_IRQ_STAT); |
1285 | writel(1 << ap->id, mmio + HOST_IRQ_STAT); | 1285 | writel(1 << ap->port_no, mmio + HOST_IRQ_STAT); |
1286 | 1286 | ||
1287 | /* turn IRQ back on */ | 1287 | /* turn IRQ back on */ |
1288 | writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); | 1288 | writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index a388a8df0043..cf707029352e 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -1037,7 +1037,7 @@ static unsigned int ata_id_xfermask(const u16 *id) | |||
1037 | * the PIO timing number for the maximum. Turn it into | 1037 | * the PIO timing number for the maximum. Turn it into |
1038 | * a mask. | 1038 | * a mask. |
1039 | */ | 1039 | */ |
1040 | u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF; | 1040 | u8 mode = (id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF; |
1041 | if (mode < 5) /* Valid PIO range */ | 1041 | if (mode < 5) /* Valid PIO range */ |
1042 | pio_mask = (2 << mode) - 1; | 1042 | pio_mask = (2 << mode) - 1; |
1043 | else | 1043 | else |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 56cf59b60ec4..748435807d68 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1796,7 +1796,7 @@ static int ata_eh_suspend(struct ata_port *ap, struct ata_device **r_failed_dev) | |||
1796 | *r_failed_dev = dev; | 1796 | *r_failed_dev = dev; |
1797 | 1797 | ||
1798 | DPRINTK("EXIT\n"); | 1798 | DPRINTK("EXIT\n"); |
1799 | return 0; | 1799 | return rc; |
1800 | } | 1800 | } |
1801 | 1801 | ||
1802 | /** | 1802 | /** |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 7cc5a4a910a4..73902d335767 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -273,8 +273,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
273 | { | 273 | { |
274 | int rc = 0; | 274 | int rc = 0; |
275 | u8 scsi_cmd[MAX_COMMAND_SIZE]; | 275 | u8 scsi_cmd[MAX_COMMAND_SIZE]; |
276 | u8 args[7]; | 276 | u8 args[7], *sensebuf = NULL; |
277 | struct scsi_sense_hdr sshdr; | 277 | int cmd_result; |
278 | 278 | ||
279 | if (arg == NULL) | 279 | if (arg == NULL) |
280 | return -EINVAL; | 280 | return -EINVAL; |
@@ -282,10 +282,14 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
282 | if (copy_from_user(args, arg, sizeof(args))) | 282 | if (copy_from_user(args, arg, sizeof(args))) |
283 | return -EFAULT; | 283 | return -EFAULT; |
284 | 284 | ||
285 | sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); | ||
286 | if (!sensebuf) | ||
287 | return -ENOMEM; | ||
288 | |||
285 | memset(scsi_cmd, 0, sizeof(scsi_cmd)); | 289 | memset(scsi_cmd, 0, sizeof(scsi_cmd)); |
286 | scsi_cmd[0] = ATA_16; | 290 | scsi_cmd[0] = ATA_16; |
287 | scsi_cmd[1] = (3 << 1); /* Non-data */ | 291 | scsi_cmd[1] = (3 << 1); /* Non-data */ |
288 | /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */ | 292 | scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */ |
289 | scsi_cmd[4] = args[1]; | 293 | scsi_cmd[4] = args[1]; |
290 | scsi_cmd[6] = args[2]; | 294 | scsi_cmd[6] = args[2]; |
291 | scsi_cmd[8] = args[3]; | 295 | scsi_cmd[8] = args[3]; |
@@ -295,11 +299,46 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
295 | 299 | ||
296 | /* Good values for timeout and retries? Values below | 300 | /* Good values for timeout and retries? Values below |
297 | from scsi_ioctl_send_command() for default case... */ | 301 | from scsi_ioctl_send_command() for default case... */ |
298 | if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr, | 302 | cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0, |
299 | (10*HZ), 5)) | 303 | sensebuf, (10*HZ), 5, 0); |
304 | |||
305 | if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */ | ||
306 | u8 *desc = sensebuf + 8; | ||
307 | cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */ | ||
308 | |||
309 | /* If we set cc then ATA pass-through will cause a | ||
310 | * check condition even if no error. Filter that. */ | ||
311 | if (cmd_result & SAM_STAT_CHECK_CONDITION) { | ||
312 | struct scsi_sense_hdr sshdr; | ||
313 | scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE, | ||
314 | &sshdr); | ||
315 | if (sshdr.sense_key==0 && | ||
316 | sshdr.asc==0 && sshdr.ascq==0) | ||
317 | cmd_result &= ~SAM_STAT_CHECK_CONDITION; | ||
318 | } | ||
319 | |||
320 | /* Send userspace ATA registers */ | ||
321 | if (sensebuf[0] == 0x72 && /* format is "descriptor" */ | ||
322 | desc[0] == 0x09) {/* code is "ATA Descriptor" */ | ||
323 | args[0] = desc[13]; /* status */ | ||
324 | args[1] = desc[3]; /* error */ | ||
325 | args[2] = desc[5]; /* sector count (0:7) */ | ||
326 | args[3] = desc[7]; /* lbal */ | ||
327 | args[4] = desc[9]; /* lbam */ | ||
328 | args[5] = desc[11]; /* lbah */ | ||
329 | args[6] = desc[12]; /* select */ | ||
330 | if (copy_to_user(arg, args, sizeof(args))) | ||
331 | rc = -EFAULT; | ||
332 | } | ||
333 | } | ||
334 | |||
335 | if (cmd_result) { | ||
300 | rc = -EIO; | 336 | rc = -EIO; |
337 | goto error; | ||
338 | } | ||
301 | 339 | ||
302 | /* Need code to retrieve data from check condition? */ | 340 | error: |
341 | kfree(sensebuf); | ||
303 | return rc; | 342 | return rc; |
304 | } | 343 | } |
305 | 344 | ||
@@ -983,11 +1022,10 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc) | |||
983 | } | 1022 | } |
984 | 1023 | ||
985 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ | 1024 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ |
986 | } else { | 1025 | } else |
987 | tf->nsect = 0; /* time period value (0 implies now) */ | 1026 | /* Issue ATA STANDBY IMMEDIATE command */ |
988 | tf->command = ATA_CMD_STANDBY; | 1027 | tf->command = ATA_CMD_STANDBYNOW1; |
989 | /* Consider: ATA STANDBY IMMEDIATE command */ | 1028 | |
990 | } | ||
991 | /* | 1029 | /* |
992 | * Standby and Idle condition timers could be implemented but that | 1030 | * Standby and Idle condition timers could be implemented but that |
993 | * would require libata to implement the Power condition mode page | 1031 | * would require libata to implement the Power condition mode page |
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index 32cf0bfa8921..e8dfd8fc3ff7 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
@@ -135,7 +135,7 @@ static void sil680_error_handler(struct ata_port *ap) | |||
135 | static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev) | 135 | static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev) |
136 | { | 136 | { |
137 | static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 }; | 137 | static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 }; |
138 | static u16 speed_t[5] = { 0x328A, 0x1281, 0x1281, 0x10C3, 0x10C1 }; | 138 | static u16 speed_t[5] = { 0x328A, 0x2283, 0x1281, 0x10C3, 0x10C1 }; |
139 | 139 | ||
140 | unsigned long tfaddr = sil680_selreg(ap, 0x02); | 140 | unsigned long tfaddr = sil680_selreg(ap, 0x02); |
141 | unsigned long addr = sil680_seldev(ap, adev, 0x04); | 141 | unsigned long addr = sil680_seldev(ap, adev, 0x04); |