Commit 6d20acbf authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "Six fixes: the four driver ones are pretty trivial.

  The larger two core changes are to try to fix various USB attached
  devices which have somewhat eccentric ways of handling the VPD and
  other mode pages which necessitate multiple revalidates (that were
  removed in the interests of efficiency) and updating the heuristic for
  supported VPD pages"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: jazz_esp: Only build if SCSI core is builtin
  scsi: smartpqi: Fix disable_managed_interrupts
  scsi: ufs: Uninitialized variable in ufshcd_devfreq_target()
  scsi: target: pscsi: Fix bio_put() for error case
  scsi: core: Consult supported VPD page list prior to fetching page
  scsi: sd: usb_storage: uas: Access media prior to querying device properties
parents fef85269 9ddf190a
...@@ -1270,7 +1270,7 @@ source "drivers/scsi/arm/Kconfig" ...@@ -1270,7 +1270,7 @@ source "drivers/scsi/arm/Kconfig"
config JAZZ_ESP config JAZZ_ESP
bool "MIPS JAZZ FAS216 SCSI support" bool "MIPS JAZZ FAS216 SCSI support"
depends on MACH_JAZZ && SCSI depends on MACH_JAZZ && SCSI=y
select SCSI_SPI_ATTRS select SCSI_SPI_ATTRS
help help
This is the driver for the onboard SCSI host adapter of MIPS Magnum This is the driver for the onboard SCSI host adapter of MIPS Magnum
......
...@@ -328,21 +328,39 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer, ...@@ -328,21 +328,39 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
return result + 4; return result + 4;
} }
enum scsi_vpd_parameters {
SCSI_VPD_HEADER_SIZE = 4,
SCSI_VPD_LIST_SIZE = 36,
};
static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page) static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page)
{ {
unsigned char vpd_header[SCSI_VPD_HEADER_SIZE] __aligned(4); unsigned char vpd[SCSI_VPD_LIST_SIZE] __aligned(4);
int result; int result;
if (sdev->no_vpd_size) if (sdev->no_vpd_size)
return SCSI_DEFAULT_VPD_LEN; return SCSI_DEFAULT_VPD_LEN;
/*
* Fetch the supported pages VPD and validate that the requested page
* number is present.
*/
if (page != 0) {
result = scsi_vpd_inquiry(sdev, vpd, 0, sizeof(vpd));
if (result < SCSI_VPD_HEADER_SIZE)
return 0;
result -= SCSI_VPD_HEADER_SIZE;
if (!memchr(&vpd[SCSI_VPD_HEADER_SIZE], page, result))
return 0;
}
/* /*
* Fetch the VPD page header to find out how big the page * Fetch the VPD page header to find out how big the page
* is. This is done to prevent problems on legacy devices * is. This is done to prevent problems on legacy devices
* which can not handle allocation lengths as large as * which can not handle allocation lengths as large as
* potentially requested by the caller. * potentially requested by the caller.
*/ */
result = scsi_vpd_inquiry(sdev, vpd_header, page, sizeof(vpd_header)); result = scsi_vpd_inquiry(sdev, vpd, page, SCSI_VPD_HEADER_SIZE);
if (result < 0) if (result < 0)
return 0; return 0;
......
...@@ -3407,6 +3407,24 @@ static bool sd_validate_opt_xfer_size(struct scsi_disk *sdkp, ...@@ -3407,6 +3407,24 @@ static bool sd_validate_opt_xfer_size(struct scsi_disk *sdkp,
return true; return true;
} }
static void sd_read_block_zero(struct scsi_disk *sdkp)
{
unsigned int buf_len = sdkp->device->sector_size;
char *buffer, cmd[10] = { };
buffer = kmalloc(buf_len, GFP_KERNEL);
if (!buffer)
return;
cmd[0] = READ_10;
put_unaligned_be32(0, &cmd[2]); /* Logical block address 0 */
put_unaligned_be16(1, &cmd[7]); /* Transfer 1 logical block */
scsi_execute_cmd(sdkp->device, cmd, REQ_OP_DRV_IN, buffer, buf_len,
SD_TIMEOUT, sdkp->max_retries, NULL);
kfree(buffer);
}
/** /**
* sd_revalidate_disk - called the first time a new disk is seen, * sd_revalidate_disk - called the first time a new disk is seen,
* performs disk spin up, read_capacity, etc. * performs disk spin up, read_capacity, etc.
...@@ -3446,7 +3464,13 @@ static int sd_revalidate_disk(struct gendisk *disk) ...@@ -3446,7 +3464,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
*/ */
if (sdkp->media_present) { if (sdkp->media_present) {
sd_read_capacity(sdkp, buffer); sd_read_capacity(sdkp, buffer);
/*
* Some USB/UAS devices return generic values for mode pages
* until the media has been accessed. Trigger a READ operation
* to force the device to populate mode pages.
*/
if (sdp->read_before_ms)
sd_read_block_zero(sdkp);
/* /*
* set the default to rotational. All non-rotational devices * set the default to rotational. All non-rotational devices
* support the block characteristics VPD page, which will * support the block characteristics VPD page, which will
......
...@@ -6533,8 +6533,11 @@ static void pqi_map_queues(struct Scsi_Host *shost) ...@@ -6533,8 +6533,11 @@ static void pqi_map_queues(struct Scsi_Host *shost)
{ {
struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost); struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT], if (!ctrl_info->disable_managed_interrupts)
return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
ctrl_info->pci_dev, 0); ctrl_info->pci_dev, 0);
else
return blk_mq_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT]);
} }
static inline bool pqi_is_tape_changer_device(struct pqi_scsi_dev *device) static inline bool pqi_is_tape_changer_device(struct pqi_scsi_dev *device)
......
...@@ -907,12 +907,15 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, ...@@ -907,12 +907,15 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
return 0; return 0;
fail: fail:
if (bio) if (bio) {
bio_put(bio); bio_uninit(bio);
kfree(bio);
}
while (req->bio) { while (req->bio) {
bio = req->bio; bio = req->bio;
req->bio = bio->bi_next; req->bio = bio->bi_next;
bio_put(bio); bio_uninit(bio);
kfree(bio);
} }
req->biotail = NULL; req->biotail = NULL;
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
......
...@@ -1469,7 +1469,7 @@ static int ufshcd_devfreq_target(struct device *dev, ...@@ -1469,7 +1469,7 @@ static int ufshcd_devfreq_target(struct device *dev,
int ret = 0; int ret = 0;
struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_hba *hba = dev_get_drvdata(dev);
ktime_t start; ktime_t start;
bool scale_up, sched_clk_scaling_suspend_work = false; bool scale_up = false, sched_clk_scaling_suspend_work = false;
struct list_head *clk_list = &hba->clk_list_head; struct list_head *clk_list = &hba->clk_list_head;
struct ufs_clk_info *clki; struct ufs_clk_info *clki;
unsigned long irq_flags; unsigned long irq_flags;
......
...@@ -179,6 +179,13 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -179,6 +179,13 @@ static int slave_configure(struct scsi_device *sdev)
*/ */
sdev->use_192_bytes_for_3f = 1; sdev->use_192_bytes_for_3f = 1;
/*
* Some devices report generic values until the media has been
* accessed. Force a READ(10) prior to querying device
* characteristics.
*/
sdev->read_before_ms = 1;
/* /*
* Some devices don't like MODE SENSE with page=0x3f, * Some devices don't like MODE SENSE with page=0x3f,
* which is the command used for checking if a device * which is the command used for checking if a device
......
...@@ -878,6 +878,13 @@ static int uas_slave_configure(struct scsi_device *sdev) ...@@ -878,6 +878,13 @@ static int uas_slave_configure(struct scsi_device *sdev)
if (devinfo->flags & US_FL_CAPACITY_HEURISTICS) if (devinfo->flags & US_FL_CAPACITY_HEURISTICS)
sdev->guess_capacity = 1; sdev->guess_capacity = 1;
/*
* Some devices report generic values until the media has been
* accessed. Force a READ(10) prior to querying device
* characteristics.
*/
sdev->read_before_ms = 1;
/* /*
* Some devices don't like MODE SENSE with page=0x3f, * Some devices don't like MODE SENSE with page=0x3f,
* which is the command used for checking if a device * which is the command used for checking if a device
......
...@@ -100,10 +100,6 @@ struct scsi_vpd { ...@@ -100,10 +100,6 @@ struct scsi_vpd {
unsigned char data[]; unsigned char data[];
}; };
enum scsi_vpd_parameters {
SCSI_VPD_HEADER_SIZE = 4,
};
struct scsi_device { struct scsi_device {
struct Scsi_Host *host; struct Scsi_Host *host;
struct request_queue *request_queue; struct request_queue *request_queue;
...@@ -208,6 +204,7 @@ struct scsi_device { ...@@ -208,6 +204,7 @@ struct scsi_device {
unsigned use_10_for_rw:1; /* first try 10-byte read / write */ unsigned use_10_for_rw:1; /* first try 10-byte read / write */
unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */ unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */
unsigned set_dbd_for_ms:1; /* Set "DBD" field in mode sense */ unsigned set_dbd_for_ms:1; /* Set "DBD" field in mode sense */
unsigned read_before_ms:1; /* perform a READ before MODE SENSE */
unsigned no_report_opcodes:1; /* no REPORT SUPPORTED OPERATION CODES */ unsigned no_report_opcodes:1; /* no REPORT SUPPORTED OPERATION CODES */
unsigned no_write_same:1; /* no WRITE SAME command */ unsigned no_write_same:1; /* no WRITE SAME command */
unsigned use_16_for_rw:1; /* Use read/write(16) over read/write(10) */ unsigned use_16_for_rw:1; /* Use read/write(16) over read/write(10) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment