Re: [PATCH 1 09/25] hpsa: fix physical target reset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 28.10.2015 23:05, Don Brace wrote:
> From: Scott Teel <scott.teel@xxxxxxxx>
>
> Set reset type in device_reset_handler to do either
> logical unit reset for logical devices, or physical
> target reset, for physical devices.
>
> Reviewed-by: Scott Teel <scott.teel@xxxxxxxx>
> Reviewed-by: Justin Lindley <justin.lindley@xxxxxxxx>
> Reviewed-by: Kevin Barnett <kevin.barnett@xxxxxxxx>
> Signed-off-by: Don Brace <don.brace@xxxxxxxx>
> ---
>  drivers/scsi/hpsa.c |   34 ++++++++++++++++++++++++++++------
>  drivers/scsi/hpsa.h |    1 +
>  2 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
> index 08a761c..67136fb 100644
> --- a/drivers/scsi/hpsa.c
> +++ b/drivers/scsi/hpsa.c
> @@ -2746,9 +2746,8 @@ static int hpsa_send_reset(struct ctlr_info *h, unsigned char *scsi3addr,
>  
>  
>  	/* fill_cmd can't fail here, no data buffer to map. */
> -	(void) fill_cmd(c, HPSA_DEVICE_RESET_MSG, h, NULL, 0, 0,
> +	(void) fill_cmd(c, reset_type, h, NULL, 0, 0,
>  			scsi3addr, TYPE_MSG);
> -	c->Request.CDB[1] = reset_type; /* fill_cmd defaults to LUN reset */
>  	rc = hpsa_scsi_do_simple_cmd(h, c, reply_queue, NO_TIMEOUT);
>  	if (rc) {
>  		dev_warn(&h->pdev->dev, "Failed to send reset command\n");
> @@ -5216,6 +5215,7 @@ static int hpsa_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
>  	int rc;
>  	struct ctlr_info *h;
>  	struct hpsa_scsi_dev_t *dev;
> +	u8 reset_type;
>  	char msg[48];
>  
>  	/* find the controller to which the command to be aborted was sent */
> @@ -5254,15 +5254,23 @@ static int hpsa_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
>  	if (is_hba_lunid(dev->scsi3addr))
>  		return SUCCESS;
>  
> -	hpsa_show_dev_msg(KERN_WARNING, h, dev, "resetting");
> +	if (is_logical_dev_addr_mode(dev->scsi3addr))
> +		reset_type = HPSA_DEVICE_RESET_MSG;
> +	else
> +		reset_type = HPSA_PHYS_TARGET_RESET;
> +
> +	sprintf(msg, "resetting %s",
> +		reset_type == HPSA_DEVICE_RESET_MSG ? "logical " : "physical ");
> +	hpsa_show_dev_msg(KERN_WARNING, h, dev, msg);
>  
>  	h->reset_in_progress = 1;
>  
>  	/* send a reset to the SCSI LUN which the command was sent to */
> -	rc = hpsa_do_reset(h, dev, dev->scsi3addr, HPSA_RESET_TYPE_LUN,
> +	rc = hpsa_do_reset(h, dev, dev->scsi3addr, reset_type,
>  			   DEFAULT_REPLY_QUEUE);
> -	snprintf(msg, sizeof(msg), "reset %s",
> -		 rc == 0 ? "completed successfully" : "failed");
> +	sprintf(msg, "reset %s %s",
> +		reset_type == HPSA_DEVICE_RESET_MSG ? "logical " : "physical ",
> +		rc == 0 ? "completed successfully" : "failed");
>  	hpsa_show_dev_msg(KERN_WARNING, h, dev, msg);
>  	h->reset_in_progress = 0;
>  	return rc == 0 ? SUCCESS : FAILED;
> @@ -6379,6 +6387,20 @@ static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
>  	} else if (cmd_type == TYPE_MSG) {
>  		switch (cmd) {
>  
> +		case  HPSA_PHYS_TARGET_RESET:
> +			c->Request.CDBLen = 16;
> +			c->Request.type_attr_dir =
> +				TYPE_ATTR_DIR(cmd_type, ATTR_SIMPLE, XFER_NONE);
> +			c->Request.Timeout = 0; /* Don't time out */
> +			memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB));
> +			c->Request.CDB[0] = HPSA_RESET;
> +			c->Request.CDB[1] = HPSA_TARGET_RESET_TYPE;
> +			/* Physical target reset needs no control bytes 4-7*/
> +			c->Request.CDB[4] = 0x00;
> +			c->Request.CDB[5] = 0x00;
> +			c->Request.CDB[6] = 0x00;
> +			c->Request.CDB[7] = 0x00;
> +			break;
>  		case  HPSA_DEVICE_RESET_MSG:
>  			c->Request.CDBLen = 16;
>  			c->Request.type_attr_dir =
> diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
> index dc113c1a..04f98eb 100644
> --- a/drivers/scsi/hpsa.h
> +++ b/drivers/scsi/hpsa.h
> @@ -285,6 +285,7 @@ struct offline_device_entry {
>  #define HPSA_RESET_TYPE_BUS 0x01
>  #define HPSA_RESET_TYPE_TARGET 0x03
>  #define HPSA_RESET_TYPE_LUN 0x04
> +#define HPSA_PHYS_TARGET_RESET 0x99 /* not defined by cciss spec */

Will this new reset command work for the whole range of hpsa devices?
(and for the older cciss hw - hpsa_allow_any) ?

>  #define HPSA_MSG_SEND_RETRY_LIMIT 10
>  #define HPSA_MSG_SEND_RETRY_INTERVAL_MSECS (10000)
>  
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux