From: Linus Torvalds Date: Tue, 15 Jul 2008 18:18:10 +0000 (-0700) Subject: Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi... X-Git-Tag: v2.6.27-rc1~1076 X-Git-Url: https://repo.jachan.dev/linux.git/commitdiff_plain/b312bf359e20cc39c00d480fd40a24c245d80bf7?hp=-c Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: AHCI: Remove an unnecessary flush from ahci_qc_issue AHCI: speed up resume [libata] Add support for VPD page b1 ata: endianness annotations in pata drivers libata-eh: update atapi_eh_request_sense() to take @dev instead of @qc [libata] sata_svw: update code comments relating to data corruption libata/ahci: enclosure management support libata: improve EH internal command timeout handling libata: use ULONG_MAX to terminate reset timeout table libata: improve EH retry delay handling libata: consistently use msecs for time durations --- b312bf359e20cc39c00d480fd40a24c245d80bf7 diff --combined drivers/ata/libata-scsi.c index 499ccc628d81,479c29e2e25c..f3b4b15a8dc4 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@@ -190,6 -190,85 +190,85 @@@ static void ata_scsi_set_sense(struct s scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq); } + static ssize_t + ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct Scsi_Host *shost = class_to_shost(dev); + struct ata_port *ap = ata_shost_to_port(shost); + if (ap->ops->em_store && (ap->flags & ATA_FLAG_EM)) + return ap->ops->em_store(ap, buf, count); + return -EINVAL; + } + + static ssize_t + ata_scsi_em_message_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *shost = class_to_shost(dev); + struct ata_port *ap = ata_shost_to_port(shost); + + if (ap->ops->em_show && (ap->flags & ATA_FLAG_EM)) + return ap->ops->em_show(ap, buf); + return -EINVAL; + } + DEVICE_ATTR(em_message, S_IRUGO | S_IWUGO, + ata_scsi_em_message_show, ata_scsi_em_message_store); + EXPORT_SYMBOL_GPL(dev_attr_em_message); + + static ssize_t + ata_scsi_em_message_type_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *shost = class_to_shost(dev); + struct ata_port *ap = ata_shost_to_port(shost); + + return snprintf(buf, 23, "%d\n", ap->em_message_type); + } + DEVICE_ATTR(em_message_type, S_IRUGO, + ata_scsi_em_message_type_show, NULL); + EXPORT_SYMBOL_GPL(dev_attr_em_message_type); + + static ssize_t + ata_scsi_activity_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct scsi_device *sdev = to_scsi_device(dev); + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *atadev = ata_scsi_find_dev(ap, sdev); + + if (ap->ops->sw_activity_show && (ap->flags & ATA_FLAG_SW_ACTIVITY)) + return ap->ops->sw_activity_show(atadev, buf); + return -EINVAL; + } + + static ssize_t + ata_scsi_activity_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct scsi_device *sdev = to_scsi_device(dev); + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *atadev = ata_scsi_find_dev(ap, sdev); + enum sw_activity val; + int rc; + + if (ap->ops->sw_activity_store && (ap->flags & ATA_FLAG_SW_ACTIVITY)) { + val = simple_strtoul(buf, NULL, 0); + switch (val) { + case OFF: case BLINK_ON: case BLINK_OFF: + rc = ap->ops->sw_activity_store(atadev, val); + if (!rc) + return count; + else + return rc; + } + } + return -EINVAL; + } + DEVICE_ATTR(sw_activity, S_IWUGO | S_IRUGO, ata_scsi_activity_show, + ata_scsi_activity_store); + EXPORT_SYMBOL_GPL(dev_attr_sw_activity); + static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { @@@ -885,8 -964,7 +964,8 @@@ static int ata_scsi_dev_config(struct s /* set the min alignment and padding */ blk_queue_update_dma_alignment(sdev->request_queue, ATA_DMA_PAD_SZ - 1); - blk_queue_dma_pad(sdev->request_queue, ATA_DMA_PAD_SZ - 1); + blk_queue_update_dma_pad(sdev->request_queue, + ATA_DMA_PAD_SZ - 1); /* configure draining */ buf = kmalloc(ATAPI_MAX_DRAIN, q->bounce_gfp | GFP_KERNEL); @@@ -1779,7 -1857,9 +1858,9 @@@ static unsigned int ata_scsiop_inq_00(s const u8 pages[] = { 0x00, /* page 0x00, this page */ 0x80, /* page 0x80, unit serial no page */ - 0x83 /* page 0x83, device ident page */ + 0x83, /* page 0x83, device ident page */ + 0x89, /* page 0x89, ata info page */ + 0xb1, /* page 0xb1, block device characteristics page */ }; rbuf[3] = sizeof(pages); /* number of supported VPD pages */ @@@ -1900,6 -1980,19 +1981,19 @@@ static unsigned int ata_scsiop_inq_89(s return 0; } + static unsigned int ata_scsiop_inq_b1(struct ata_scsi_args *args, u8 *rbuf) + { + rbuf[1] = 0xb1; + rbuf[3] = 0x3c; + if (ata_id_major_version(args->id) > 7) { + rbuf[4] = args->id[217] >> 8; + rbuf[5] = args->id[217]; + rbuf[7] = args->id[168] & 0xf; + } + + return 0; + } + /** * ata_scsiop_noop - Command handler that simply returns success. * @args: device IDENTIFY data / SCSI command of interest. @@@ -2921,6 -3014,9 +3015,9 @@@ void ata_scsi_simulate(struct ata_devic case 0x89: ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89); break; + case 0xb1: + ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b1); + break; default: ata_scsi_invalid_field(cmd, done); break;