Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7bb24eb authored by Stephen M. Cameron's avatar Stephen M. Cameron Committed by James Bottomley
Browse files

[SCSI] hpsa: allow VPD page zero to be queried



Code was confused and assumed that page zero was not
VPD page and all non-zero pages were VPD pages.

Signed-off-by: default avatarStephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent e863d68e
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -183,8 +183,9 @@ static void cmd_special_free(struct ctlr_info *h, struct CommandList *c);
static struct CommandList *cmd_alloc(struct ctlr_info *h);
static struct CommandList *cmd_alloc(struct ctlr_info *h);
static struct CommandList *cmd_special_alloc(struct ctlr_info *h);
static struct CommandList *cmd_special_alloc(struct ctlr_info *h);
static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
	void *buff, size_t size, u8 page_code, unsigned char *scsi3addr,
	void *buff, size_t size, u16 page_code, unsigned char *scsi3addr,
	int cmd_type);
	int cmd_type);
#define VPD_PAGE (1 << 8)


static int hpsa_scsi_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd);
static int hpsa_scsi_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd);
static void hpsa_scan_start(struct Scsi_Host *);
static void hpsa_scan_start(struct Scsi_Host *);
@@ -1878,7 +1879,7 @@ static void hpsa_scsi_interpret_error(struct CommandList *cp)
}
}


static int hpsa_scsi_do_inquiry(struct ctlr_info *h, unsigned char *scsi3addr,
static int hpsa_scsi_do_inquiry(struct ctlr_info *h, unsigned char *scsi3addr,
			unsigned char page, unsigned char *buf,
			u16 page, unsigned char *buf,
			unsigned char bufsize)
			unsigned char bufsize)
{
{
	int rc = IO_OK;
	int rc = IO_OK;
@@ -1948,7 +1949,7 @@ static void hpsa_get_raid_level(struct ctlr_info *h,
	buf = kzalloc(64, GFP_KERNEL);
	buf = kzalloc(64, GFP_KERNEL);
	if (!buf)
	if (!buf)
		return;
		return;
	rc = hpsa_scsi_do_inquiry(h, scsi3addr, 0xC1, buf, 64);
	rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | 0xC1, buf, 64);
	if (rc == 0)
	if (rc == 0)
		*raid_level = buf[8];
		*raid_level = buf[8];
	if (*raid_level > RAID_UNKNOWN)
	if (*raid_level > RAID_UNKNOWN)
@@ -2077,7 +2078,7 @@ static void hpsa_get_ioaccel_status(struct ctlr_info *h,
	if (!buf)
	if (!buf)
		return;
		return;
	rc = hpsa_scsi_do_inquiry(h, scsi3addr,
	rc = hpsa_scsi_do_inquiry(h, scsi3addr,
			HPSA_VPD_LV_IOACCEL_STATUS, buf, 64);
			VPD_PAGE | HPSA_VPD_LV_IOACCEL_STATUS, buf, 64);
	if (rc != 0)
	if (rc != 0)
		goto out;
		goto out;


@@ -2110,7 +2111,7 @@ static int hpsa_get_device_id(struct ctlr_info *h, unsigned char *scsi3addr,
	buf = kzalloc(64, GFP_KERNEL);
	buf = kzalloc(64, GFP_KERNEL);
	if (!buf)
	if (!buf)
		return -1;
		return -1;
	rc = hpsa_scsi_do_inquiry(h, scsi3addr, 0x83, buf, 64);
	rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | 0x83, buf, 64);
	if (rc == 0)
	if (rc == 0)
		memcpy(device_id, &buf[8], buflen);
		memcpy(device_id, &buf[8], buflen);
	kfree(buf);
	kfree(buf);
@@ -4629,7 +4630,7 @@ static int hpsa_send_host_reset(struct ctlr_info *h, unsigned char *scsi3addr,
}
}


static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
	void *buff, size_t size, u8 page_code, unsigned char *scsi3addr,
	void *buff, size_t size, u16 page_code, unsigned char *scsi3addr,
	int cmd_type)
	int cmd_type)
{
{
	int pci_dir = XFER_NONE;
	int pci_dir = XFER_NONE;
@@ -4652,9 +4653,9 @@ static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
		switch (cmd) {
		switch (cmd) {
		case HPSA_INQUIRY:
		case HPSA_INQUIRY:
			/* are we trying to read a vital product page */
			/* are we trying to read a vital product page */
			if (page_code != 0) {
			if (page_code & VPD_PAGE) {
				c->Request.CDB[1] = 0x01;
				c->Request.CDB[1] = 0x01;
				c->Request.CDB[2] = page_code;
				c->Request.CDB[2] = (page_code & 0xff);
			}
			}
			c->Request.CDBLen = 6;
			c->Request.CDBLen = 6;
			c->Request.Type.Attribute = ATTR_SIMPLE;
			c->Request.Type.Attribute = ATTR_SIMPLE;