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 | |
| 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')
| -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); | 
