| From 670a641420a3d9586eebe7429dfeec4e7ed447aa Mon Sep 17 00:00:00 2001 | 
 | From: Asai Thambi S P <asamymuthupa@micron.com> | 
 | Date: Wed, 16 Apr 2014 20:27:54 -0700 | 
 | Subject: mtip32xx: Increase timeout for STANDBY IMMEDIATE command | 
 |  | 
 | From: Asai Thambi S P <asamymuthupa@micron.com> | 
 |  | 
 | commit 670a641420a3d9586eebe7429dfeec4e7ed447aa upstream. | 
 |  | 
 | Increased timeout for STANDBY IMMEDIATE command to 2 minutes. | 
 |  | 
 | Signed-off-by: Selvan Mani <smani@micron.com> | 
 | Signed-off-by: Asai Thambi S P <asamymuthupa@micron.com> | 
 | Signed-off-by: Jens Axboe <axboe@fb.com> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 |  | 
 | --- | 
 |  drivers/block/mtip32xx/mtip32xx.c |   66 ++++++++++++++++++++------------------ | 
 |  1 file changed, 35 insertions(+), 31 deletions(-) | 
 |  | 
 | --- a/drivers/block/mtip32xx/mtip32xx.c | 
 | +++ b/drivers/block/mtip32xx/mtip32xx.c | 
 | @@ -1529,6 +1529,37 @@ static inline void ata_swap_string(u16 * | 
 |  		be16_to_cpus(&buf[i]); | 
 |  } | 
 |   | 
 | +static void mtip_set_timeout(struct driver_data *dd, | 
 | +					struct host_to_dev_fis *fis, | 
 | +					unsigned int *timeout, u8 erasemode) | 
 | +{ | 
 | +	switch (fis->command) { | 
 | +	case ATA_CMD_DOWNLOAD_MICRO: | 
 | +		*timeout = 120000; /* 2 minutes */ | 
 | +		break; | 
 | +	case ATA_CMD_SEC_ERASE_UNIT: | 
 | +	case 0xFC: | 
 | +		if (erasemode) | 
 | +			*timeout = ((*(dd->port->identify + 90) * 2) * 60000); | 
 | +		else | 
 | +			*timeout = ((*(dd->port->identify + 89) * 2) * 60000); | 
 | +		break; | 
 | +	case ATA_CMD_STANDBYNOW1: | 
 | +		*timeout = 120000;  /* 2 minutes */ | 
 | +		break; | 
 | +	case 0xF7: | 
 | +	case 0xFA: | 
 | +		*timeout = 60000;  /* 60 seconds */ | 
 | +		break; | 
 | +	case ATA_CMD_SMART: | 
 | +		*timeout = 15000;  /* 15 seconds */ | 
 | +		break; | 
 | +	default: | 
 | +		*timeout = MTIP_IOCTL_COMMAND_TIMEOUT_MS; | 
 | +		break; | 
 | +	} | 
 | +} | 
 | + | 
 |  /* | 
 |   * Request the device identity information. | 
 |   * | 
 | @@ -1644,6 +1675,7 @@ static int mtip_standby_immediate(struct | 
 |  	int rv; | 
 |  	struct host_to_dev_fis	fis; | 
 |  	unsigned long start; | 
 | +	unsigned int timeout; | 
 |   | 
 |  	/* Build the FIS. */ | 
 |  	memset(&fis, 0, sizeof(struct host_to_dev_fis)); | 
 | @@ -1651,6 +1683,8 @@ static int mtip_standby_immediate(struct | 
 |  	fis.opts	= 1 << 7; | 
 |  	fis.command	= ATA_CMD_STANDBYNOW1; | 
 |   | 
 | +	mtip_set_timeout(port->dd, &fis, &timeout, 0); | 
 | + | 
 |  	start = jiffies; | 
 |  	rv = mtip_exec_internal_command(port, | 
 |  					&fis, | 
 | @@ -1659,7 +1693,7 @@ static int mtip_standby_immediate(struct | 
 |  					0, | 
 |  					0, | 
 |  					GFP_ATOMIC, | 
 | -					15000); | 
 | +					timeout); | 
 |  	dbg_printk(MTIP_DRV_NAME "Time taken to complete standby cmd: %d ms\n", | 
 |  			jiffies_to_msecs(jiffies - start)); | 
 |  	if (rv) | 
 | @@ -2202,36 +2236,6 @@ static unsigned int implicit_sector(unsi | 
 |  	} | 
 |  	return rv; | 
 |  } | 
 | -static void mtip_set_timeout(struct driver_data *dd, | 
 | -					struct host_to_dev_fis *fis, | 
 | -					unsigned int *timeout, u8 erasemode) | 
 | -{ | 
 | -	switch (fis->command) { | 
 | -	case ATA_CMD_DOWNLOAD_MICRO: | 
 | -		*timeout = 120000; /* 2 minutes */ | 
 | -		break; | 
 | -	case ATA_CMD_SEC_ERASE_UNIT: | 
 | -	case 0xFC: | 
 | -		if (erasemode) | 
 | -			*timeout = ((*(dd->port->identify + 90) * 2) * 60000); | 
 | -		else | 
 | -			*timeout = ((*(dd->port->identify + 89) * 2) * 60000); | 
 | -		break; | 
 | -	case ATA_CMD_STANDBYNOW1: | 
 | -		*timeout = 120000;  /* 2 minutes */ | 
 | -		break; | 
 | -	case 0xF7: | 
 | -	case 0xFA: | 
 | -		*timeout = 60000;  /* 60 seconds */ | 
 | -		break; | 
 | -	case ATA_CMD_SMART: | 
 | -		*timeout = 15000;  /* 15 seconds */ | 
 | -		break; | 
 | -	default: | 
 | -		*timeout = MTIP_IOCTL_COMMAND_TIMEOUT_MS; | 
 | -		break; | 
 | -	} | 
 | -} | 
 |   | 
 |  /* | 
 |   * Executes a taskfile |