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:
[PATCH] pata-qdi: fix le32 in data_xfer
[libata] sata_promise: add PCI ID
[PATCH] libata: return sense data in HDIO_DRIVE_CMD ioctl
[PATCH] libata: Don't believe bogus claims in the older PIO mode register

+46 -9
+5 -1
drivers/ata/libata-core.c
··· 870 870 * the PIO timing number for the maximum. Turn it into 871 871 * a mask. 872 872 */ 873 - pio_mask = (2 << (id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ; 873 + u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF; 874 + if (mode < 5) /* Valid PIO range */ 875 + pio_mask = (2 << mode) - 1; 876 + else 877 + pio_mask = 1; 874 878 875 879 /* But wait.. there's more. Design your standards by 876 880 * committee and you too can get a free iordy field to
+39 -7
drivers/ata/libata-scsi.c
··· 164 164 { 165 165 int rc = 0; 166 166 u8 scsi_cmd[MAX_COMMAND_SIZE]; 167 - u8 args[4], *argbuf = NULL; 167 + u8 args[4], *argbuf = NULL, *sensebuf = NULL; 168 168 int argsize = 0; 169 - struct scsi_sense_hdr sshdr; 170 169 enum dma_data_direction data_dir; 170 + int cmd_result; 171 171 172 172 if (arg == NULL) 173 173 return -EINVAL; 174 174 175 175 if (copy_from_user(args, arg, sizeof(args))) 176 176 return -EFAULT; 177 + 178 + sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); 179 + if (!sensebuf) 180 + return -ENOMEM; 177 181 178 182 memset(scsi_cmd, 0, sizeof(scsi_cmd)); 179 183 ··· 195 191 data_dir = DMA_FROM_DEVICE; 196 192 } else { 197 193 scsi_cmd[1] = (3 << 1); /* Non-data */ 198 - /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */ 194 + scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */ 199 195 data_dir = DMA_NONE; 200 196 } 201 197 ··· 214 210 215 211 /* Good values for timeout and retries? Values below 216 212 from scsi_ioctl_send_command() for default case... */ 217 - if (scsi_execute_req(scsidev, scsi_cmd, data_dir, argbuf, argsize, 218 - &sshdr, (10*HZ), 5)) { 213 + cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize, 214 + sensebuf, (10*HZ), 5, 0); 215 + 216 + if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */ 217 + u8 *desc = sensebuf + 8; 218 + cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */ 219 + 220 + /* If we set cc then ATA pass-through will cause a 221 + * check condition even if no error. Filter that. */ 222 + if (cmd_result & SAM_STAT_CHECK_CONDITION) { 223 + struct scsi_sense_hdr sshdr; 224 + scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE, 225 + &sshdr); 226 + if (sshdr.sense_key==0 && 227 + sshdr.asc==0 && sshdr.ascq==0) 228 + cmd_result &= ~SAM_STAT_CHECK_CONDITION; 229 + } 230 + 231 + /* Send userspace a few ATA registers (same as drivers/ide) */ 232 + if (sensebuf[0] == 0x72 && /* format is "descriptor" */ 233 + desc[0] == 0x09 ) { /* code is "ATA Descriptor" */ 234 + args[0] = desc[13]; /* status */ 235 + args[1] = desc[3]; /* error */ 236 + args[2] = desc[5]; /* sector count (0:7) */ 237 + if (copy_to_user(arg, args, sizeof(args))) 238 + rc = -EFAULT; 239 + } 240 + } 241 + 242 + 243 + if (cmd_result) { 219 244 rc = -EIO; 220 245 goto error; 221 246 } 222 - 223 - /* Need code to retrieve data from check condition? */ 224 247 225 248 if ((argbuf) 226 249 && copy_to_user(arg + sizeof(args), argbuf, argsize)) 227 250 rc = -EFAULT; 228 251 error: 252 + kfree(sensebuf); 229 253 kfree(argbuf); 230 254 return rc; 231 255 }
+1 -1
drivers/ata/pata_qdi.c
··· 141 141 memcpy(&pad, buf + buflen - slop, slop); 142 142 outl(le32_to_cpu(pad), ap->ioaddr.data_addr); 143 143 } else { 144 - pad = cpu_to_le16(inl(ap->ioaddr.data_addr)); 144 + pad = cpu_to_le32(inl(ap->ioaddr.data_addr)); 145 145 memcpy(buf + buflen - slop, &pad, slop); 146 146 } 147 147 }
+1
drivers/ata/sata_promise.c
··· 260 260 #if 0 261 261 { PCI_VDEVICE(PROMISE, 0x3570), board_20771 }, 262 262 #endif 263 + { PCI_VDEVICE(PROMISE, 0x3577), board_20771 }, 263 264 264 265 { } /* terminate list */ 265 266 };