xref: /openbmc/linux/drivers/scsi/sd.c (revision 8f76d151b010980d137bfdc736d1d8f64b489165)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  *      sd.c Copyright (C) 1992 Drew Eckhardt
31da177e4SLinus Torvalds  *           Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  *      Linux scsi disk driver
61da177e4SLinus Torvalds  *              Initial versions: Drew Eckhardt
71da177e4SLinus Torvalds  *              Subsequent revisions: Eric Youngdale
81da177e4SLinus Torvalds  *	Modification history:
91da177e4SLinus Torvalds  *       - Drew Eckhardt <drew@colorado.edu> original
101da177e4SLinus Torvalds  *       - Eric Youngdale <eric@andante.org> add scatter-gather, multiple
111da177e4SLinus Torvalds  *         outstanding request, and other enhancements.
121da177e4SLinus Torvalds  *         Support loadable low-level scsi drivers.
131da177e4SLinus Torvalds  *       - Jirka Hanika <geo@ff.cuni.cz> support more scsi disks using
141da177e4SLinus Torvalds  *         eight major numbers.
151da177e4SLinus Torvalds  *       - Richard Gooch <rgooch@atnf.csiro.au> support devfs.
161da177e4SLinus Torvalds  *	 - Torben Mathiasen <tmm@image.dk> Resource allocation fixes in
171da177e4SLinus Torvalds  *	   sd_init and cleanups.
181da177e4SLinus Torvalds  *	 - Alex Davis <letmein@erols.com> Fix problem where partition info
191da177e4SLinus Torvalds  *	   not being read in sd_open. Fix problem where removable media
201da177e4SLinus Torvalds  *	   could be ejected after sd_open.
211da177e4SLinus Torvalds  *	 - Douglas Gilbert <dgilbert@interlog.com> cleanup for lk 2.5.x
221da177e4SLinus Torvalds  *	 - Badari Pulavarty <pbadari@us.ibm.com>, Matthew Wilcox
231da177e4SLinus Torvalds  *	   <willy@debian.org>, Kurt Garloff <garloff@suse.de>:
241da177e4SLinus Torvalds  *	   Support 32k/1M disks.
251da177e4SLinus Torvalds  *
261da177e4SLinus Torvalds  *	Logging policy (needs CONFIG_SCSI_LOGGING defined):
271da177e4SLinus Torvalds  *	 - setting up transfer: SCSI_LOG_HLQUEUE levels 1 and 2
281da177e4SLinus Torvalds  *	 - end of transfer (bh + scsi_lib): SCSI_LOG_HLCOMPLETE level 1
291da177e4SLinus Torvalds  *	 - entering sd_ioctl: SCSI_LOG_IOCTL level 1
301da177e4SLinus Torvalds  *	 - entering other commands: SCSI_LOG_HLQUEUE level 3
311da177e4SLinus Torvalds  *	Note: when the logging level is set by the user, it must be greater
321da177e4SLinus Torvalds  *	than the level indicated above to trigger output.
331da177e4SLinus Torvalds  */
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds #include <linux/module.h>
361da177e4SLinus Torvalds #include <linux/fs.h>
371da177e4SLinus Torvalds #include <linux/kernel.h>
381da177e4SLinus Torvalds #include <linux/mm.h>
391da177e4SLinus Torvalds #include <linux/bio.h>
401da177e4SLinus Torvalds #include <linux/genhd.h>
411da177e4SLinus Torvalds #include <linux/hdreg.h>
421da177e4SLinus Torvalds #include <linux/errno.h>
431da177e4SLinus Torvalds #include <linux/idr.h>
441da177e4SLinus Torvalds #include <linux/interrupt.h>
451da177e4SLinus Torvalds #include <linux/init.h>
461da177e4SLinus Torvalds #include <linux/blkdev.h>
471da177e4SLinus Torvalds #include <linux/blkpg.h>
481da177e4SLinus Torvalds #include <linux/delay.h>
490b950672SArjan van de Ven #include <linux/mutex.h>
507404ad3bSJames Bottomley #include <linux/string_helpers.h>
514ace92fcSArjan van de Ven #include <linux/async.h>
521da177e4SLinus Torvalds #include <asm/uaccess.h>
53*8f76d151SDave Hansen #include <asm/unaligned.h>
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds #include <scsi/scsi.h>
561da177e4SLinus Torvalds #include <scsi/scsi_cmnd.h>
571da177e4SLinus Torvalds #include <scsi/scsi_dbg.h>
581da177e4SLinus Torvalds #include <scsi/scsi_device.h>
591da177e4SLinus Torvalds #include <scsi/scsi_driver.h>
601da177e4SLinus Torvalds #include <scsi/scsi_eh.h>
611da177e4SLinus Torvalds #include <scsi/scsi_host.h>
621da177e4SLinus Torvalds #include <scsi/scsi_ioctl.h>
631da177e4SLinus Torvalds #include <scsi/scsicam.h>
641da177e4SLinus Torvalds 
65aa91696eSMartin K. Petersen #include "sd.h"
661da177e4SLinus Torvalds #include "scsi_logging.h"
671da177e4SLinus Torvalds 
68f018fa55SRene Herman MODULE_AUTHOR("Eric Youngdale");
69f018fa55SRene Herman MODULE_DESCRIPTION("SCSI disk (sd) driver");
70f018fa55SRene Herman MODULE_LICENSE("GPL");
71f018fa55SRene Herman 
72f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK0_MAJOR);
73f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK1_MAJOR);
74f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK2_MAJOR);
75f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK3_MAJOR);
76f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK4_MAJOR);
77f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK5_MAJOR);
78f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK6_MAJOR);
79f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK7_MAJOR);
80f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK8_MAJOR);
81f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK9_MAJOR);
82f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK10_MAJOR);
83f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK11_MAJOR);
84f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK12_MAJOR);
85f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK13_MAJOR);
86f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK14_MAJOR);
87f018fa55SRene Herman MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_DISK15_MAJOR);
88d7b8bcb0SMichael Tokarev MODULE_ALIAS_SCSI_DEVICE(TYPE_DISK);
89d7b8bcb0SMichael Tokarev MODULE_ALIAS_SCSI_DEVICE(TYPE_MOD);
90d7b8bcb0SMichael Tokarev MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC);
91f018fa55SRene Herman 
92870d6656STejun Heo #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
93f615b48cSTejun Heo #define SD_MINORS	16
94870d6656STejun Heo #else
953e1a7ff8STejun Heo #define SD_MINORS	0
96870d6656STejun Heo #endif
97870d6656STejun Heo 
987b3d9545SLinus Torvalds static int  sd_revalidate_disk(struct gendisk *);
997b3d9545SLinus Torvalds static int  sd_probe(struct device *);
1007b3d9545SLinus Torvalds static int  sd_remove(struct device *);
1017b3d9545SLinus Torvalds static void sd_shutdown(struct device *);
1027b3d9545SLinus Torvalds static int sd_suspend(struct device *, pm_message_t state);
1037b3d9545SLinus Torvalds static int sd_resume(struct device *);
1047b3d9545SLinus Torvalds static void sd_rescan(struct device *);
1057b3d9545SLinus Torvalds static int sd_done(struct scsi_cmnd *);
1067b3d9545SLinus Torvalds static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer);
107ee959b00STony Jones static void scsi_disk_release(struct device *cdev);
1087b3d9545SLinus Torvalds static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *);
1097b3d9545SLinus Torvalds static void sd_print_result(struct scsi_disk *, int);
1107b3d9545SLinus Torvalds 
1114034cc68STejun Heo static DEFINE_SPINLOCK(sd_index_lock);
112f27bac27STejun Heo static DEFINE_IDA(sd_index_ida);
1131da177e4SLinus Torvalds 
1141da177e4SLinus Torvalds /* This semaphore is used to mediate the 0->1 reference get in the
1151da177e4SLinus Torvalds  * face of object destruction (i.e. we can't allow a get on an
1161da177e4SLinus Torvalds  * object after last put) */
1170b950672SArjan van de Ven static DEFINE_MUTEX(sd_ref_mutex);
1181da177e4SLinus Torvalds 
1196bdaa1f1SJames Bottomley static const char *sd_cache_types[] = {
1206bdaa1f1SJames Bottomley 	"write through", "none", "write back",
1216bdaa1f1SJames Bottomley 	"write back, no read (daft)"
1226bdaa1f1SJames Bottomley };
1236bdaa1f1SJames Bottomley 
124ee959b00STony Jones static ssize_t
125ee959b00STony Jones sd_store_cache_type(struct device *dev, struct device_attribute *attr,
126ee959b00STony Jones 		    const char *buf, size_t count)
1276bdaa1f1SJames Bottomley {
1286bdaa1f1SJames Bottomley 	int i, ct = -1, rcd, wce, sp;
129ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
1306bdaa1f1SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
1316bdaa1f1SJames Bottomley 	char buffer[64];
1326bdaa1f1SJames Bottomley 	char *buffer_data;
1336bdaa1f1SJames Bottomley 	struct scsi_mode_data data;
1346bdaa1f1SJames Bottomley 	struct scsi_sense_hdr sshdr;
1356bdaa1f1SJames Bottomley 	int len;
1366bdaa1f1SJames Bottomley 
1376bdaa1f1SJames Bottomley 	if (sdp->type != TYPE_DISK)
1386bdaa1f1SJames Bottomley 		/* no cache control on RBC devices; theoretically they
1396bdaa1f1SJames Bottomley 		 * can do it, but there's probably so many exceptions
1406bdaa1f1SJames Bottomley 		 * it's not worth the risk */
1416bdaa1f1SJames Bottomley 		return -EINVAL;
1426bdaa1f1SJames Bottomley 
1436391a113STobias Klauser 	for (i = 0; i < ARRAY_SIZE(sd_cache_types); i++) {
1446bdaa1f1SJames Bottomley 		const int len = strlen(sd_cache_types[i]);
1456bdaa1f1SJames Bottomley 		if (strncmp(sd_cache_types[i], buf, len) == 0 &&
1466bdaa1f1SJames Bottomley 		    buf[len] == '\n') {
1476bdaa1f1SJames Bottomley 			ct = i;
1486bdaa1f1SJames Bottomley 			break;
1496bdaa1f1SJames Bottomley 		}
1506bdaa1f1SJames Bottomley 	}
1516bdaa1f1SJames Bottomley 	if (ct < 0)
1526bdaa1f1SJames Bottomley 		return -EINVAL;
1536bdaa1f1SJames Bottomley 	rcd = ct & 0x01 ? 1 : 0;
1546bdaa1f1SJames Bottomley 	wce = ct & 0x02 ? 1 : 0;
1556bdaa1f1SJames Bottomley 	if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT,
1566bdaa1f1SJames Bottomley 			    SD_MAX_RETRIES, &data, NULL))
1576bdaa1f1SJames Bottomley 		return -EINVAL;
158a9312fb8SAndrew Morton 	len = min_t(size_t, sizeof(buffer), data.length - data.header_length -
1596bdaa1f1SJames Bottomley 		  data.block_descriptor_length);
1606bdaa1f1SJames Bottomley 	buffer_data = buffer + data.header_length +
1616bdaa1f1SJames Bottomley 		data.block_descriptor_length;
1626bdaa1f1SJames Bottomley 	buffer_data[2] &= ~0x05;
1636bdaa1f1SJames Bottomley 	buffer_data[2] |= wce << 2 | rcd;
1646bdaa1f1SJames Bottomley 	sp = buffer_data[0] & 0x80 ? 1 : 0;
1656bdaa1f1SJames Bottomley 
1666bdaa1f1SJames Bottomley 	if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, SD_TIMEOUT,
1676bdaa1f1SJames Bottomley 			     SD_MAX_RETRIES, &data, &sshdr)) {
1686bdaa1f1SJames Bottomley 		if (scsi_sense_valid(&sshdr))
169e73aec82SMartin K. Petersen 			sd_print_sense_hdr(sdkp, &sshdr);
1706bdaa1f1SJames Bottomley 		return -EINVAL;
1716bdaa1f1SJames Bottomley 	}
172f98a8caeSAndrew Patterson 	revalidate_disk(sdkp->disk);
1736bdaa1f1SJames Bottomley 	return count;
1746bdaa1f1SJames Bottomley }
1756bdaa1f1SJames Bottomley 
176ee959b00STony Jones static ssize_t
177ee959b00STony Jones sd_store_manage_start_stop(struct device *dev, struct device_attribute *attr,
178c3c94c5aSTejun Heo 			   const char *buf, size_t count)
179c3c94c5aSTejun Heo {
180ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
181c3c94c5aSTejun Heo 	struct scsi_device *sdp = sdkp->device;
182c3c94c5aSTejun Heo 
183c3c94c5aSTejun Heo 	if (!capable(CAP_SYS_ADMIN))
184c3c94c5aSTejun Heo 		return -EACCES;
185c3c94c5aSTejun Heo 
186c3c94c5aSTejun Heo 	sdp->manage_start_stop = simple_strtoul(buf, NULL, 10);
187c3c94c5aSTejun Heo 
188c3c94c5aSTejun Heo 	return count;
189c3c94c5aSTejun Heo }
190c3c94c5aSTejun Heo 
191ee959b00STony Jones static ssize_t
192ee959b00STony Jones sd_store_allow_restart(struct device *dev, struct device_attribute *attr,
193ee959b00STony Jones 		       const char *buf, size_t count)
194a144c5aeSBrian King {
195ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
196a144c5aeSBrian King 	struct scsi_device *sdp = sdkp->device;
197a144c5aeSBrian King 
198a144c5aeSBrian King 	if (!capable(CAP_SYS_ADMIN))
199a144c5aeSBrian King 		return -EACCES;
200a144c5aeSBrian King 
201a144c5aeSBrian King 	if (sdp->type != TYPE_DISK)
202a144c5aeSBrian King 		return -EINVAL;
203a144c5aeSBrian King 
204a144c5aeSBrian King 	sdp->allow_restart = simple_strtoul(buf, NULL, 10);
205a144c5aeSBrian King 
206a144c5aeSBrian King 	return count;
207a144c5aeSBrian King }
208a144c5aeSBrian King 
209ee959b00STony Jones static ssize_t
210ee959b00STony Jones sd_show_cache_type(struct device *dev, struct device_attribute *attr,
211ee959b00STony Jones 		   char *buf)
2126bdaa1f1SJames Bottomley {
213ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
2146bdaa1f1SJames Bottomley 	int ct = sdkp->RCD + 2*sdkp->WCE;
2156bdaa1f1SJames Bottomley 
2166bdaa1f1SJames Bottomley 	return snprintf(buf, 40, "%s\n", sd_cache_types[ct]);
2176bdaa1f1SJames Bottomley }
2186bdaa1f1SJames Bottomley 
219ee959b00STony Jones static ssize_t
220ee959b00STony Jones sd_show_fua(struct device *dev, struct device_attribute *attr, char *buf)
2216bdaa1f1SJames Bottomley {
222ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
2236bdaa1f1SJames Bottomley 
2246bdaa1f1SJames Bottomley 	return snprintf(buf, 20, "%u\n", sdkp->DPOFUA);
2256bdaa1f1SJames Bottomley }
2266bdaa1f1SJames Bottomley 
227ee959b00STony Jones static ssize_t
228ee959b00STony Jones sd_show_manage_start_stop(struct device *dev, struct device_attribute *attr,
229ee959b00STony Jones 			  char *buf)
230c3c94c5aSTejun Heo {
231ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
232c3c94c5aSTejun Heo 	struct scsi_device *sdp = sdkp->device;
233c3c94c5aSTejun Heo 
234c3c94c5aSTejun Heo 	return snprintf(buf, 20, "%u\n", sdp->manage_start_stop);
235c3c94c5aSTejun Heo }
236c3c94c5aSTejun Heo 
237ee959b00STony Jones static ssize_t
238ee959b00STony Jones sd_show_allow_restart(struct device *dev, struct device_attribute *attr,
239ee959b00STony Jones 		      char *buf)
240a144c5aeSBrian King {
241ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
242a144c5aeSBrian King 
243a144c5aeSBrian King 	return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart);
244a144c5aeSBrian King }
245a144c5aeSBrian King 
246e0597d70SMartin K. Petersen static ssize_t
247e0597d70SMartin K. Petersen sd_show_protection_type(struct device *dev, struct device_attribute *attr,
248e0597d70SMartin K. Petersen 			char *buf)
249e0597d70SMartin K. Petersen {
250e0597d70SMartin K. Petersen 	struct scsi_disk *sdkp = to_scsi_disk(dev);
251e0597d70SMartin K. Petersen 
252e0597d70SMartin K. Petersen 	return snprintf(buf, 20, "%u\n", sdkp->protection_type);
253e0597d70SMartin K. Petersen }
254e0597d70SMartin K. Petersen 
255e0597d70SMartin K. Petersen static ssize_t
256e0597d70SMartin K. Petersen sd_show_app_tag_own(struct device *dev, struct device_attribute *attr,
257e0597d70SMartin K. Petersen 		    char *buf)
258e0597d70SMartin K. Petersen {
259e0597d70SMartin K. Petersen 	struct scsi_disk *sdkp = to_scsi_disk(dev);
260e0597d70SMartin K. Petersen 
261e0597d70SMartin K. Petersen 	return snprintf(buf, 20, "%u\n", sdkp->ATO);
262e0597d70SMartin K. Petersen }
263e0597d70SMartin K. Petersen 
264ee959b00STony Jones static struct device_attribute sd_disk_attrs[] = {
2656bdaa1f1SJames Bottomley 	__ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type,
2666bdaa1f1SJames Bottomley 	       sd_store_cache_type),
2676bdaa1f1SJames Bottomley 	__ATTR(FUA, S_IRUGO, sd_show_fua, NULL),
268a144c5aeSBrian King 	__ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart,
269a144c5aeSBrian King 	       sd_store_allow_restart),
270c3c94c5aSTejun Heo 	__ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop,
271c3c94c5aSTejun Heo 	       sd_store_manage_start_stop),
272e0597d70SMartin K. Petersen 	__ATTR(protection_type, S_IRUGO, sd_show_protection_type, NULL),
273e0597d70SMartin K. Petersen 	__ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL),
2746bdaa1f1SJames Bottomley 	__ATTR_NULL,
2756bdaa1f1SJames Bottomley };
2766bdaa1f1SJames Bottomley 
2776bdaa1f1SJames Bottomley static struct class sd_disk_class = {
2786bdaa1f1SJames Bottomley 	.name		= "scsi_disk",
2796bdaa1f1SJames Bottomley 	.owner		= THIS_MODULE,
280ee959b00STony Jones 	.dev_release	= scsi_disk_release,
281ee959b00STony Jones 	.dev_attrs	= sd_disk_attrs,
2826bdaa1f1SJames Bottomley };
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds static struct scsi_driver sd_template = {
2851da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
2861da177e4SLinus Torvalds 	.gendrv = {
2871da177e4SLinus Torvalds 		.name		= "sd",
2881da177e4SLinus Torvalds 		.probe		= sd_probe,
2891da177e4SLinus Torvalds 		.remove		= sd_remove,
290c3c94c5aSTejun Heo 		.suspend	= sd_suspend,
291c3c94c5aSTejun Heo 		.resume		= sd_resume,
2921da177e4SLinus Torvalds 		.shutdown	= sd_shutdown,
2931da177e4SLinus Torvalds 	},
2941da177e4SLinus Torvalds 	.rescan			= sd_rescan,
2957b3d9545SLinus Torvalds 	.done			= sd_done,
2961da177e4SLinus Torvalds };
2971da177e4SLinus Torvalds 
2981da177e4SLinus Torvalds /*
2991da177e4SLinus Torvalds  * Device no to disk mapping:
3001da177e4SLinus Torvalds  *
3011da177e4SLinus Torvalds  *       major         disc2     disc  p1
3021da177e4SLinus Torvalds  *   |............|.............|....|....| <- dev_t
3031da177e4SLinus Torvalds  *    31        20 19          8 7  4 3  0
3041da177e4SLinus Torvalds  *
3051da177e4SLinus Torvalds  * Inside a major, we have 16k disks, however mapped non-
3061da177e4SLinus Torvalds  * contiguously. The first 16 disks are for major0, the next
3071da177e4SLinus Torvalds  * ones with major1, ... Disk 256 is for major0 again, disk 272
3081da177e4SLinus Torvalds  * for major1, ...
3091da177e4SLinus Torvalds  * As we stay compatible with our numbering scheme, we can reuse
3101da177e4SLinus Torvalds  * the well-know SCSI majors 8, 65--71, 136--143.
3111da177e4SLinus Torvalds  */
3121da177e4SLinus Torvalds static int sd_major(int major_idx)
3131da177e4SLinus Torvalds {
3141da177e4SLinus Torvalds 	switch (major_idx) {
3151da177e4SLinus Torvalds 	case 0:
3161da177e4SLinus Torvalds 		return SCSI_DISK0_MAJOR;
3171da177e4SLinus Torvalds 	case 1 ... 7:
3181da177e4SLinus Torvalds 		return SCSI_DISK1_MAJOR + major_idx - 1;
3191da177e4SLinus Torvalds 	case 8 ... 15:
3201da177e4SLinus Torvalds 		return SCSI_DISK8_MAJOR + major_idx - 8;
3211da177e4SLinus Torvalds 	default:
3221da177e4SLinus Torvalds 		BUG();
3231da177e4SLinus Torvalds 		return 0;	/* shut up gcc */
3241da177e4SLinus Torvalds 	}
3251da177e4SLinus Torvalds }
3261da177e4SLinus Torvalds 
32739b7f1e2SAlan Stern static struct scsi_disk *__scsi_disk_get(struct gendisk *disk)
3281da177e4SLinus Torvalds {
3291da177e4SLinus Torvalds 	struct scsi_disk *sdkp = NULL;
3301da177e4SLinus Torvalds 
33139b7f1e2SAlan Stern 	if (disk->private_data) {
3321da177e4SLinus Torvalds 		sdkp = scsi_disk(disk);
33339b7f1e2SAlan Stern 		if (scsi_device_get(sdkp->device) == 0)
334ee959b00STony Jones 			get_device(&sdkp->dev);
33539b7f1e2SAlan Stern 		else
33639b7f1e2SAlan Stern 			sdkp = NULL;
33739b7f1e2SAlan Stern 	}
33839b7f1e2SAlan Stern 	return sdkp;
33939b7f1e2SAlan Stern }
34039b7f1e2SAlan Stern 
34139b7f1e2SAlan Stern static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
34239b7f1e2SAlan Stern {
34339b7f1e2SAlan Stern 	struct scsi_disk *sdkp;
34439b7f1e2SAlan Stern 
3450b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
34639b7f1e2SAlan Stern 	sdkp = __scsi_disk_get(disk);
3470b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
3481da177e4SLinus Torvalds 	return sdkp;
34939b7f1e2SAlan Stern }
3501da177e4SLinus Torvalds 
35139b7f1e2SAlan Stern static struct scsi_disk *scsi_disk_get_from_dev(struct device *dev)
35239b7f1e2SAlan Stern {
35339b7f1e2SAlan Stern 	struct scsi_disk *sdkp;
35439b7f1e2SAlan Stern 
3550b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
35639b7f1e2SAlan Stern 	sdkp = dev_get_drvdata(dev);
35739b7f1e2SAlan Stern 	if (sdkp)
35839b7f1e2SAlan Stern 		sdkp = __scsi_disk_get(sdkp->disk);
3590b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
3601da177e4SLinus Torvalds 	return sdkp;
3611da177e4SLinus Torvalds }
3621da177e4SLinus Torvalds 
3631da177e4SLinus Torvalds static void scsi_disk_put(struct scsi_disk *sdkp)
3641da177e4SLinus Torvalds {
3651da177e4SLinus Torvalds 	struct scsi_device *sdev = sdkp->device;
3661da177e4SLinus Torvalds 
3670b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
368ee959b00STony Jones 	put_device(&sdkp->dev);
3691da177e4SLinus Torvalds 	scsi_device_put(sdev);
3700b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
3711da177e4SLinus Torvalds }
3721da177e4SLinus Torvalds 
3731da177e4SLinus Torvalds /**
3741da177e4SLinus Torvalds  *	sd_init_command - build a scsi (read or write) command from
3751da177e4SLinus Torvalds  *	information in the request structure.
3761da177e4SLinus Torvalds  *	@SCpnt: pointer to mid-level's per scsi command structure that
3771da177e4SLinus Torvalds  *	contains request and into which the scsi command is written
3781da177e4SLinus Torvalds  *
3791da177e4SLinus Torvalds  *	Returns 1 if successful and 0 if error (or cannot be done now).
3801da177e4SLinus Torvalds  **/
3817f9a6bc4SJames Bottomley static int sd_prep_fn(struct request_queue *q, struct request *rq)
3821da177e4SLinus Torvalds {
3837f9a6bc4SJames Bottomley 	struct scsi_cmnd *SCpnt;
3847f9a6bc4SJames Bottomley 	struct scsi_device *sdp = q->queuedata;
385776b23a0SChristoph Hellwig 	struct gendisk *disk = rq->rq_disk;
386af55ff67SMartin K. Petersen 	struct scsi_disk *sdkp;
387776b23a0SChristoph Hellwig 	sector_t block = rq->sector;
38818351070SLinus Torvalds 	sector_t threshold;
3897f9a6bc4SJames Bottomley 	unsigned int this_count = rq->nr_sectors;
390bd623e79SMartin K. Petersen 	int ret, host_dif;
3917f9a6bc4SJames Bottomley 
3927f9a6bc4SJames Bottomley 	if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
3937f9a6bc4SJames Bottomley 		ret = scsi_setup_blk_pc_cmnd(sdp, rq);
3947f9a6bc4SJames Bottomley 		goto out;
3957f9a6bc4SJames Bottomley 	} else if (rq->cmd_type != REQ_TYPE_FS) {
3967f9a6bc4SJames Bottomley 		ret = BLKPREP_KILL;
3977f9a6bc4SJames Bottomley 		goto out;
3987f9a6bc4SJames Bottomley 	}
3997f9a6bc4SJames Bottomley 	ret = scsi_setup_fs_cmnd(sdp, rq);
4007f9a6bc4SJames Bottomley 	if (ret != BLKPREP_OK)
4017f9a6bc4SJames Bottomley 		goto out;
4027f9a6bc4SJames Bottomley 	SCpnt = rq->special;
403af55ff67SMartin K. Petersen 	sdkp = scsi_disk(disk);
4047f9a6bc4SJames Bottomley 
4057f9a6bc4SJames Bottomley 	/* from here on until we're complete, any goto out
4067f9a6bc4SJames Bottomley 	 * is used for a killable error condition */
4077f9a6bc4SJames Bottomley 	ret = BLKPREP_KILL;
4081da177e4SLinus Torvalds 
409fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
410fa0d34beSMartin K. Petersen 					"sd_init_command: block=%llu, "
411fa0d34beSMartin K. Petersen 					"count=%d\n",
412fa0d34beSMartin K. Petersen 					(unsigned long long)block,
413fa0d34beSMartin K. Petersen 					this_count));
4141da177e4SLinus Torvalds 
4151da177e4SLinus Torvalds 	if (!sdp || !scsi_device_online(sdp) ||
4161da177e4SLinus Torvalds  	    block + rq->nr_sectors > get_capacity(disk)) {
417fa0d34beSMartin K. Petersen 		SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
418fa0d34beSMartin K. Petersen 						"Finishing %ld sectors\n",
4191da177e4SLinus Torvalds 						rq->nr_sectors));
420fa0d34beSMartin K. Petersen 		SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
421fa0d34beSMartin K. Petersen 						"Retry with 0x%p\n", SCpnt));
4227f9a6bc4SJames Bottomley 		goto out;
4231da177e4SLinus Torvalds 	}
4241da177e4SLinus Torvalds 
4251da177e4SLinus Torvalds 	if (sdp->changed) {
4261da177e4SLinus Torvalds 		/*
4271da177e4SLinus Torvalds 		 * quietly refuse to do anything to a changed disc until
4281da177e4SLinus Torvalds 		 * the changed bit has been reset
4291da177e4SLinus Torvalds 		 */
4301da177e4SLinus Torvalds 		/* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */
4317f9a6bc4SJames Bottomley 		goto out;
4321da177e4SLinus Torvalds 	}
4337f9a6bc4SJames Bottomley 
434a0899d4dSHans de Goede 	/*
43518351070SLinus Torvalds 	 * Some SD card readers can't handle multi-sector accesses which touch
43618351070SLinus Torvalds 	 * the last one or two hardware sectors.  Split accesses as needed.
437a0899d4dSHans de Goede 	 */
43818351070SLinus Torvalds 	threshold = get_capacity(disk) - SD_LAST_BUGGY_SECTORS *
43918351070SLinus Torvalds 		(sdp->sector_size / 512);
44018351070SLinus Torvalds 
44118351070SLinus Torvalds 	if (unlikely(sdp->last_sector_bug && block + this_count > threshold)) {
44218351070SLinus Torvalds 		if (block < threshold) {
44318351070SLinus Torvalds 			/* Access up to the threshold but not beyond */
44418351070SLinus Torvalds 			this_count = threshold - block;
44518351070SLinus Torvalds 		} else {
44618351070SLinus Torvalds 			/* Access only a single hardware sector */
44718351070SLinus Torvalds 			this_count = sdp->sector_size / 512;
44818351070SLinus Torvalds 		}
44918351070SLinus Torvalds 	}
450a0899d4dSHans de Goede 
451fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, "block=%llu\n",
452fa0d34beSMartin K. Petersen 					(unsigned long long)block));
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds 	/*
4551da177e4SLinus Torvalds 	 * If we have a 1K hardware sectorsize, prevent access to single
4561da177e4SLinus Torvalds 	 * 512 byte sectors.  In theory we could handle this - in fact
4571da177e4SLinus Torvalds 	 * the scsi cdrom driver must be able to handle this because
4581da177e4SLinus Torvalds 	 * we typically use 1K blocksizes, and cdroms typically have
4591da177e4SLinus Torvalds 	 * 2K hardware sectorsizes.  Of course, things are simpler
4601da177e4SLinus Torvalds 	 * with the cdrom, since it is read-only.  For performance
4611da177e4SLinus Torvalds 	 * reasons, the filesystems should be able to handle this
4621da177e4SLinus Torvalds 	 * and not force the scsi disk driver to use bounce buffers
4631da177e4SLinus Torvalds 	 * for this.
4641da177e4SLinus Torvalds 	 */
4651da177e4SLinus Torvalds 	if (sdp->sector_size == 1024) {
4661da177e4SLinus Torvalds 		if ((block & 1) || (rq->nr_sectors & 1)) {
467e73aec82SMartin K. Petersen 			scmd_printk(KERN_ERR, SCpnt,
468e73aec82SMartin K. Petersen 				    "Bad block number requested\n");
4697f9a6bc4SJames Bottomley 			goto out;
4701da177e4SLinus Torvalds 		} else {
4711da177e4SLinus Torvalds 			block = block >> 1;
4721da177e4SLinus Torvalds 			this_count = this_count >> 1;
4731da177e4SLinus Torvalds 		}
4741da177e4SLinus Torvalds 	}
4751da177e4SLinus Torvalds 	if (sdp->sector_size == 2048) {
4761da177e4SLinus Torvalds 		if ((block & 3) || (rq->nr_sectors & 3)) {
477e73aec82SMartin K. Petersen 			scmd_printk(KERN_ERR, SCpnt,
478e73aec82SMartin K. Petersen 				    "Bad block number requested\n");
4797f9a6bc4SJames Bottomley 			goto out;
4801da177e4SLinus Torvalds 		} else {
4811da177e4SLinus Torvalds 			block = block >> 2;
4821da177e4SLinus Torvalds 			this_count = this_count >> 2;
4831da177e4SLinus Torvalds 		}
4841da177e4SLinus Torvalds 	}
4851da177e4SLinus Torvalds 	if (sdp->sector_size == 4096) {
4861da177e4SLinus Torvalds 		if ((block & 7) || (rq->nr_sectors & 7)) {
487e73aec82SMartin K. Petersen 			scmd_printk(KERN_ERR, SCpnt,
488e73aec82SMartin K. Petersen 				    "Bad block number requested\n");
4897f9a6bc4SJames Bottomley 			goto out;
4901da177e4SLinus Torvalds 		} else {
4911da177e4SLinus Torvalds 			block = block >> 3;
4921da177e4SLinus Torvalds 			this_count = this_count >> 3;
4931da177e4SLinus Torvalds 		}
4941da177e4SLinus Torvalds 	}
4951da177e4SLinus Torvalds 	if (rq_data_dir(rq) == WRITE) {
4961da177e4SLinus Torvalds 		if (!sdp->writeable) {
4977f9a6bc4SJames Bottomley 			goto out;
4981da177e4SLinus Torvalds 		}
4991da177e4SLinus Torvalds 		SCpnt->cmnd[0] = WRITE_6;
5001da177e4SLinus Torvalds 		SCpnt->sc_data_direction = DMA_TO_DEVICE;
501af55ff67SMartin K. Petersen 
502af55ff67SMartin K. Petersen 		if (blk_integrity_rq(rq) &&
503af55ff67SMartin K. Petersen 		    sd_dif_prepare(rq, block, sdp->sector_size) == -EIO)
504af55ff67SMartin K. Petersen 			goto out;
505af55ff67SMartin K. Petersen 
5061da177e4SLinus Torvalds 	} else if (rq_data_dir(rq) == READ) {
5071da177e4SLinus Torvalds 		SCpnt->cmnd[0] = READ_6;
5081da177e4SLinus Torvalds 		SCpnt->sc_data_direction = DMA_FROM_DEVICE;
5091da177e4SLinus Torvalds 	} else {
510e73aec82SMartin K. Petersen 		scmd_printk(KERN_ERR, SCpnt, "Unknown command %x\n", rq->cmd_flags);
5117f9a6bc4SJames Bottomley 		goto out;
5121da177e4SLinus Torvalds 	}
5131da177e4SLinus Torvalds 
514fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
515fa0d34beSMartin K. Petersen 					"%s %d/%ld 512 byte blocks.\n",
516fa0d34beSMartin K. Petersen 					(rq_data_dir(rq) == WRITE) ?
517fa0d34beSMartin K. Petersen 					"writing" : "reading", this_count,
518fa0d34beSMartin K. Petersen 					rq->nr_sectors));
5191da177e4SLinus Torvalds 
520af55ff67SMartin K. Petersen 	/* Set RDPROTECT/WRPROTECT if disk is formatted with DIF */
521bd623e79SMartin K. Petersen 	host_dif = scsi_host_dif_capable(sdp->host, sdkp->protection_type);
522bd623e79SMartin K. Petersen 	if (host_dif)
523af55ff67SMartin K. Petersen 		SCpnt->cmnd[1] = 1 << 5;
524af55ff67SMartin K. Petersen 	else
5251da177e4SLinus Torvalds 		SCpnt->cmnd[1] = 0;
5261da177e4SLinus Torvalds 
5271da177e4SLinus Torvalds 	if (block > 0xffffffff) {
5281da177e4SLinus Torvalds 		SCpnt->cmnd[0] += READ_16 - READ_6;
529007365adSTejun Heo 		SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0;
5301da177e4SLinus Torvalds 		SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
5311da177e4SLinus Torvalds 		SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0;
5321da177e4SLinus Torvalds 		SCpnt->cmnd[4] = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0;
5331da177e4SLinus Torvalds 		SCpnt->cmnd[5] = sizeof(block) > 4 ? (unsigned char) (block >> 32) & 0xff : 0;
5341da177e4SLinus Torvalds 		SCpnt->cmnd[6] = (unsigned char) (block >> 24) & 0xff;
5351da177e4SLinus Torvalds 		SCpnt->cmnd[7] = (unsigned char) (block >> 16) & 0xff;
5361da177e4SLinus Torvalds 		SCpnt->cmnd[8] = (unsigned char) (block >> 8) & 0xff;
5371da177e4SLinus Torvalds 		SCpnt->cmnd[9] = (unsigned char) block & 0xff;
5381da177e4SLinus Torvalds 		SCpnt->cmnd[10] = (unsigned char) (this_count >> 24) & 0xff;
5391da177e4SLinus Torvalds 		SCpnt->cmnd[11] = (unsigned char) (this_count >> 16) & 0xff;
5401da177e4SLinus Torvalds 		SCpnt->cmnd[12] = (unsigned char) (this_count >> 8) & 0xff;
5411da177e4SLinus Torvalds 		SCpnt->cmnd[13] = (unsigned char) this_count & 0xff;
5421da177e4SLinus Torvalds 		SCpnt->cmnd[14] = SCpnt->cmnd[15] = 0;
5431da177e4SLinus Torvalds 	} else if ((this_count > 0xff) || (block > 0x1fffff) ||
544af55ff67SMartin K. Petersen 		   scsi_device_protection(SCpnt->device) ||
5451da177e4SLinus Torvalds 		   SCpnt->device->use_10_for_rw) {
5461da177e4SLinus Torvalds 		if (this_count > 0xffff)
5471da177e4SLinus Torvalds 			this_count = 0xffff;
5481da177e4SLinus Torvalds 
5491da177e4SLinus Torvalds 		SCpnt->cmnd[0] += READ_10 - READ_6;
550007365adSTejun Heo 		SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0;
5511da177e4SLinus Torvalds 		SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff;
5521da177e4SLinus Torvalds 		SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff;
5531da177e4SLinus Torvalds 		SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff;
5541da177e4SLinus Torvalds 		SCpnt->cmnd[5] = (unsigned char) block & 0xff;
5551da177e4SLinus Torvalds 		SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
5561da177e4SLinus Torvalds 		SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff;
5571da177e4SLinus Torvalds 		SCpnt->cmnd[8] = (unsigned char) this_count & 0xff;
5581da177e4SLinus Torvalds 	} else {
559007365adSTejun Heo 		if (unlikely(blk_fua_rq(rq))) {
560007365adSTejun Heo 			/*
561007365adSTejun Heo 			 * This happens only if this drive failed
562007365adSTejun Heo 			 * 10byte rw command with ILLEGAL_REQUEST
563007365adSTejun Heo 			 * during operation and thus turned off
564007365adSTejun Heo 			 * use_10_for_rw.
565007365adSTejun Heo 			 */
566e73aec82SMartin K. Petersen 			scmd_printk(KERN_ERR, SCpnt,
567e73aec82SMartin K. Petersen 				    "FUA write on READ/WRITE(6) drive\n");
5687f9a6bc4SJames Bottomley 			goto out;
569007365adSTejun Heo 		}
570007365adSTejun Heo 
5711da177e4SLinus Torvalds 		SCpnt->cmnd[1] |= (unsigned char) ((block >> 16) & 0x1f);
5721da177e4SLinus Torvalds 		SCpnt->cmnd[2] = (unsigned char) ((block >> 8) & 0xff);
5731da177e4SLinus Torvalds 		SCpnt->cmnd[3] = (unsigned char) block & 0xff;
5741da177e4SLinus Torvalds 		SCpnt->cmnd[4] = (unsigned char) this_count;
5751da177e4SLinus Torvalds 		SCpnt->cmnd[5] = 0;
5761da177e4SLinus Torvalds 	}
57730b0c37bSBoaz Harrosh 	SCpnt->sdb.length = this_count * sdp->sector_size;
5781da177e4SLinus Torvalds 
579af55ff67SMartin K. Petersen 	/* If DIF or DIX is enabled, tell HBA how to handle request */
580bd623e79SMartin K. Petersen 	if (host_dif || scsi_prot_sg_count(SCpnt))
5819e06688eSMartin K. Petersen 		sd_dif_op(SCpnt, host_dif, scsi_prot_sg_count(SCpnt),
5829e06688eSMartin K. Petersen 			  sdkp->protection_type);
583af55ff67SMartin K. Petersen 
5841da177e4SLinus Torvalds 	/*
5851da177e4SLinus Torvalds 	 * We shouldn't disconnect in the middle of a sector, so with a dumb
5861da177e4SLinus Torvalds 	 * host adapter, it's safe to assume that we can at least transfer
5871da177e4SLinus Torvalds 	 * this many bytes between each connect / disconnect.
5881da177e4SLinus Torvalds 	 */
5891da177e4SLinus Torvalds 	SCpnt->transfersize = sdp->sector_size;
5901da177e4SLinus Torvalds 	SCpnt->underflow = this_count << 9;
5911da177e4SLinus Torvalds 	SCpnt->allowed = SD_MAX_RETRIES;
5921da177e4SLinus Torvalds 
5931da177e4SLinus Torvalds 	/*
5941da177e4SLinus Torvalds 	 * This indicates that the command is ready from our end to be
5951da177e4SLinus Torvalds 	 * queued.
5961da177e4SLinus Torvalds 	 */
5977f9a6bc4SJames Bottomley 	ret = BLKPREP_OK;
5987f9a6bc4SJames Bottomley  out:
5997f9a6bc4SJames Bottomley 	return scsi_prep_return(q, rq, ret);
6001da177e4SLinus Torvalds }
6011da177e4SLinus Torvalds 
6021da177e4SLinus Torvalds /**
6031da177e4SLinus Torvalds  *	sd_open - open a scsi disk device
6041da177e4SLinus Torvalds  *	@inode: only i_rdev member may be used
6051da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
6061da177e4SLinus Torvalds  *
6071da177e4SLinus Torvalds  *	Returns 0 if successful. Returns a negated errno value in case
6081da177e4SLinus Torvalds  *	of error.
6091da177e4SLinus Torvalds  *
6101da177e4SLinus Torvalds  *	Note: This can be called from a user context (e.g. fsck(1) )
6111da177e4SLinus Torvalds  *	or from within the kernel (e.g. as a result of a mount(1) ).
6121da177e4SLinus Torvalds  *	In the latter case @inode and @filp carry an abridged amount
6131da177e4SLinus Torvalds  *	of information as noted above.
6141da177e4SLinus Torvalds  **/
6150338e291SAl Viro static int sd_open(struct block_device *bdev, fmode_t mode)
6161da177e4SLinus Torvalds {
6170338e291SAl Viro 	struct scsi_disk *sdkp = scsi_disk_get(bdev->bd_disk);
6181da177e4SLinus Torvalds 	struct scsi_device *sdev;
6191da177e4SLinus Torvalds 	int retval;
6201da177e4SLinus Torvalds 
6210338e291SAl Viro 	if (!sdkp)
6221da177e4SLinus Torvalds 		return -ENXIO;
6231da177e4SLinus Torvalds 
624fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n"));
6251da177e4SLinus Torvalds 
6261da177e4SLinus Torvalds 	sdev = sdkp->device;
6271da177e4SLinus Torvalds 
6281da177e4SLinus Torvalds 	/*
6291da177e4SLinus Torvalds 	 * If the device is in error recovery, wait until it is done.
6301da177e4SLinus Torvalds 	 * If the device is offline, then disallow any access to it.
6311da177e4SLinus Torvalds 	 */
6321da177e4SLinus Torvalds 	retval = -ENXIO;
6331da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdev))
6341da177e4SLinus Torvalds 		goto error_out;
6351da177e4SLinus Torvalds 
6361da177e4SLinus Torvalds 	if (sdev->removable || sdkp->write_prot)
6370338e291SAl Viro 		check_disk_change(bdev);
6381da177e4SLinus Torvalds 
6391da177e4SLinus Torvalds 	/*
6401da177e4SLinus Torvalds 	 * If the drive is empty, just let the open fail.
6411da177e4SLinus Torvalds 	 */
6421da177e4SLinus Torvalds 	retval = -ENOMEDIUM;
6430338e291SAl Viro 	if (sdev->removable && !sdkp->media_present && !(mode & FMODE_NDELAY))
6441da177e4SLinus Torvalds 		goto error_out;
6451da177e4SLinus Torvalds 
6461da177e4SLinus Torvalds 	/*
6471da177e4SLinus Torvalds 	 * If the device has the write protect tab set, have the open fail
6481da177e4SLinus Torvalds 	 * if the user expects to be able to write to the thing.
6491da177e4SLinus Torvalds 	 */
6501da177e4SLinus Torvalds 	retval = -EROFS;
6510338e291SAl Viro 	if (sdkp->write_prot && (mode & FMODE_WRITE))
6521da177e4SLinus Torvalds 		goto error_out;
6531da177e4SLinus Torvalds 
6541da177e4SLinus Torvalds 	/*
6551da177e4SLinus Torvalds 	 * It is possible that the disk changing stuff resulted in
6561da177e4SLinus Torvalds 	 * the device being taken offline.  If this is the case,
6571da177e4SLinus Torvalds 	 * report this to the user, and don't pretend that the
6581da177e4SLinus Torvalds 	 * open actually succeeded.
6591da177e4SLinus Torvalds 	 */
6601da177e4SLinus Torvalds 	retval = -ENXIO;
6611da177e4SLinus Torvalds 	if (!scsi_device_online(sdev))
6621da177e4SLinus Torvalds 		goto error_out;
6631da177e4SLinus Torvalds 
6641da177e4SLinus Torvalds 	if (!sdkp->openers++ && sdev->removable) {
6651da177e4SLinus Torvalds 		if (scsi_block_when_processing_errors(sdev))
6661da177e4SLinus Torvalds 			scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
6671da177e4SLinus Torvalds 	}
6681da177e4SLinus Torvalds 
6691da177e4SLinus Torvalds 	return 0;
6701da177e4SLinus Torvalds 
6711da177e4SLinus Torvalds error_out:
6721da177e4SLinus Torvalds 	scsi_disk_put(sdkp);
6731da177e4SLinus Torvalds 	return retval;
6741da177e4SLinus Torvalds }
6751da177e4SLinus Torvalds 
6761da177e4SLinus Torvalds /**
6771da177e4SLinus Torvalds  *	sd_release - invoked when the (last) close(2) is called on this
6781da177e4SLinus Torvalds  *	scsi disk.
6791da177e4SLinus Torvalds  *	@inode: only i_rdev member may be used
6801da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
6811da177e4SLinus Torvalds  *
6821da177e4SLinus Torvalds  *	Returns 0.
6831da177e4SLinus Torvalds  *
6841da177e4SLinus Torvalds  *	Note: may block (uninterruptible) if error recovery is underway
6851da177e4SLinus Torvalds  *	on this disk.
6861da177e4SLinus Torvalds  **/
6870338e291SAl Viro static int sd_release(struct gendisk *disk, fmode_t mode)
6881da177e4SLinus Torvalds {
6891da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
6901da177e4SLinus Torvalds 	struct scsi_device *sdev = sdkp->device;
6911da177e4SLinus Torvalds 
69256937f7bSJames Bottomley 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n"));
6931da177e4SLinus Torvalds 
6941da177e4SLinus Torvalds 	if (!--sdkp->openers && sdev->removable) {
6951da177e4SLinus Torvalds 		if (scsi_block_when_processing_errors(sdev))
6961da177e4SLinus Torvalds 			scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
6971da177e4SLinus Torvalds 	}
6981da177e4SLinus Torvalds 
6991da177e4SLinus Torvalds 	/*
7001da177e4SLinus Torvalds 	 * XXX and what if there are packets in flight and this close()
7011da177e4SLinus Torvalds 	 * XXX is followed by a "rmmod sd_mod"?
7021da177e4SLinus Torvalds 	 */
7031da177e4SLinus Torvalds 	scsi_disk_put(sdkp);
7041da177e4SLinus Torvalds 	return 0;
7051da177e4SLinus Torvalds }
7061da177e4SLinus Torvalds 
707a885c8c4SChristoph Hellwig static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
7081da177e4SLinus Torvalds {
7091da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk);
7101da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
7111da177e4SLinus Torvalds 	struct Scsi_Host *host = sdp->host;
7121da177e4SLinus Torvalds 	int diskinfo[4];
7131da177e4SLinus Torvalds 
7141da177e4SLinus Torvalds 	/* default to most commonly used values */
7151da177e4SLinus Torvalds         diskinfo[0] = 0x40;	/* 1 << 6 */
7161da177e4SLinus Torvalds        	diskinfo[1] = 0x20;	/* 1 << 5 */
7171da177e4SLinus Torvalds        	diskinfo[2] = sdkp->capacity >> 11;
7181da177e4SLinus Torvalds 
7191da177e4SLinus Torvalds 	/* override with calculated, extended default, or driver values */
7201da177e4SLinus Torvalds 	if (host->hostt->bios_param)
7211da177e4SLinus Torvalds 		host->hostt->bios_param(sdp, bdev, sdkp->capacity, diskinfo);
7221da177e4SLinus Torvalds 	else
7231da177e4SLinus Torvalds 		scsicam_bios_param(bdev, sdkp->capacity, diskinfo);
7241da177e4SLinus Torvalds 
725a885c8c4SChristoph Hellwig 	geo->heads = diskinfo[0];
726a885c8c4SChristoph Hellwig 	geo->sectors = diskinfo[1];
727a885c8c4SChristoph Hellwig 	geo->cylinders = diskinfo[2];
7281da177e4SLinus Torvalds 	return 0;
7291da177e4SLinus Torvalds }
7301da177e4SLinus Torvalds 
7311da177e4SLinus Torvalds /**
7321da177e4SLinus Torvalds  *	sd_ioctl - process an ioctl
7331da177e4SLinus Torvalds  *	@inode: only i_rdev/i_bdev members may be used
7341da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
7351da177e4SLinus Torvalds  *	@cmd: ioctl command number
7361da177e4SLinus Torvalds  *	@arg: this is third argument given to ioctl(2) system call.
7371da177e4SLinus Torvalds  *	Often contains a pointer.
7381da177e4SLinus Torvalds  *
7391da177e4SLinus Torvalds  *	Returns 0 if successful (some ioctls return postive numbers on
7401da177e4SLinus Torvalds  *	success as well). Returns a negated errno value in case of error.
7411da177e4SLinus Torvalds  *
7421da177e4SLinus Torvalds  *	Note: most ioctls are forward onto the block subsystem or further
7433a4fa0a2SRobert P. J. Day  *	down in the scsi subsystem.
7441da177e4SLinus Torvalds  **/
7450338e291SAl Viro static int sd_ioctl(struct block_device *bdev, fmode_t mode,
7461da177e4SLinus Torvalds 		    unsigned int cmd, unsigned long arg)
7471da177e4SLinus Torvalds {
7481da177e4SLinus Torvalds 	struct gendisk *disk = bdev->bd_disk;
7491da177e4SLinus Torvalds 	struct scsi_device *sdp = scsi_disk(disk)->device;
7501da177e4SLinus Torvalds 	void __user *p = (void __user *)arg;
7511da177e4SLinus Torvalds 	int error;
7521da177e4SLinus Torvalds 
7531da177e4SLinus Torvalds 	SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n",
7541da177e4SLinus Torvalds 						disk->disk_name, cmd));
7551da177e4SLinus Torvalds 
7561da177e4SLinus Torvalds 	/*
7571da177e4SLinus Torvalds 	 * If we are in the middle of error recovery, don't let anyone
7581da177e4SLinus Torvalds 	 * else try and use this device.  Also, if error recovery fails, it
7591da177e4SLinus Torvalds 	 * may try and take the device offline, in which case all further
7601da177e4SLinus Torvalds 	 * access to the device is prohibited.
7611da177e4SLinus Torvalds 	 */
76283ff6fe8SAl Viro 	error = scsi_nonblockable_ioctl(sdp, cmd, p,
763fd4ce1acSChristoph Hellwig 					(mode & FMODE_NDELAY) != 0);
7641da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdp) || !error)
7651da177e4SLinus Torvalds 		return error;
7661da177e4SLinus Torvalds 
7671da177e4SLinus Torvalds 	/*
7681da177e4SLinus Torvalds 	 * Send SCSI addressing ioctls directly to mid level, send other
7691da177e4SLinus Torvalds 	 * ioctls to block level and then onto mid level if they can't be
7701da177e4SLinus Torvalds 	 * resolved.
7711da177e4SLinus Torvalds 	 */
7721da177e4SLinus Torvalds 	switch (cmd) {
7731da177e4SLinus Torvalds 		case SCSI_IOCTL_GET_IDLUN:
7741da177e4SLinus Torvalds 		case SCSI_IOCTL_GET_BUS_NUMBER:
7751da177e4SLinus Torvalds 			return scsi_ioctl(sdp, cmd, p);
7761da177e4SLinus Torvalds 		default:
7770338e291SAl Viro 			error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
7781da177e4SLinus Torvalds 			if (error != -ENOTTY)
7791da177e4SLinus Torvalds 				return error;
7801da177e4SLinus Torvalds 	}
7811da177e4SLinus Torvalds 	return scsi_ioctl(sdp, cmd, p);
7821da177e4SLinus Torvalds }
7831da177e4SLinus Torvalds 
7841da177e4SLinus Torvalds static void set_media_not_present(struct scsi_disk *sdkp)
7851da177e4SLinus Torvalds {
7861da177e4SLinus Torvalds 	sdkp->media_present = 0;
7871da177e4SLinus Torvalds 	sdkp->capacity = 0;
7881da177e4SLinus Torvalds 	sdkp->device->changed = 1;
7891da177e4SLinus Torvalds }
7901da177e4SLinus Torvalds 
7911da177e4SLinus Torvalds /**
7921da177e4SLinus Torvalds  *	sd_media_changed - check if our medium changed
7931da177e4SLinus Torvalds  *	@disk: kernel device descriptor
7941da177e4SLinus Torvalds  *
7951da177e4SLinus Torvalds  *	Returns 0 if not applicable or no change; 1 if change
7961da177e4SLinus Torvalds  *
7971da177e4SLinus Torvalds  *	Note: this function is invoked from the block subsystem.
7981da177e4SLinus Torvalds  **/
7991da177e4SLinus Torvalds static int sd_media_changed(struct gendisk *disk)
8001da177e4SLinus Torvalds {
8011da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
8021da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
803001aac25SJames Bottomley 	struct scsi_sense_hdr *sshdr = NULL;
8041da177e4SLinus Torvalds 	int retval;
8051da177e4SLinus Torvalds 
806fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_media_changed\n"));
8071da177e4SLinus Torvalds 
8081da177e4SLinus Torvalds 	if (!sdp->removable)
8091da177e4SLinus Torvalds 		return 0;
8101da177e4SLinus Torvalds 
8111da177e4SLinus Torvalds 	/*
8121da177e4SLinus Torvalds 	 * If the device is offline, don't send any commands - just pretend as
8131da177e4SLinus Torvalds 	 * if the command failed.  If the device ever comes back online, we
8141da177e4SLinus Torvalds 	 * can deal with it then.  It is only because of unrecoverable errors
8151da177e4SLinus Torvalds 	 * that we would ever take a device offline in the first place.
8161da177e4SLinus Torvalds 	 */
817285e9670SKay Sievers 	if (!scsi_device_online(sdp)) {
818285e9670SKay Sievers 		set_media_not_present(sdkp);
819285e9670SKay Sievers 		retval = 1;
820285e9670SKay Sievers 		goto out;
821285e9670SKay Sievers 	}
8221da177e4SLinus Torvalds 
8231da177e4SLinus Torvalds 	/*
8241da177e4SLinus Torvalds 	 * Using TEST_UNIT_READY enables differentiation between drive with
8251da177e4SLinus Torvalds 	 * no cartridge loaded - NOT READY, drive with changed cartridge -
8261da177e4SLinus Torvalds 	 * UNIT ATTENTION, or with same cartridge - GOOD STATUS.
8271da177e4SLinus Torvalds 	 *
8281da177e4SLinus Torvalds 	 * Drives that auto spin down. eg iomega jaz 1G, will be started
8291da177e4SLinus Torvalds 	 * by sd_spinup_disk() from sd_revalidate_disk(), which happens whenever
8301da177e4SLinus Torvalds 	 * sd_revalidate() is called.
8311da177e4SLinus Torvalds 	 */
8321da177e4SLinus Torvalds 	retval = -ENODEV;
833285e9670SKay Sievers 
834001aac25SJames Bottomley 	if (scsi_block_when_processing_errors(sdp)) {
835001aac25SJames Bottomley 		sshdr  = kzalloc(sizeof(*sshdr), GFP_KERNEL);
836001aac25SJames Bottomley 		retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES,
837001aac25SJames Bottomley 					      sshdr);
838001aac25SJames Bottomley 	}
8391da177e4SLinus Torvalds 
8401da177e4SLinus Torvalds 	/*
8411da177e4SLinus Torvalds 	 * Unable to test, unit probably not ready.   This usually
8421da177e4SLinus Torvalds 	 * means there is no disc in the drive.  Mark as changed,
8431da177e4SLinus Torvalds 	 * and we will figure it out later once the drive is
8441da177e4SLinus Torvalds 	 * available again.
8451da177e4SLinus Torvalds 	 */
846001aac25SJames Bottomley 	if (retval || (scsi_sense_valid(sshdr) &&
847001aac25SJames Bottomley 		       /* 0x3a is medium not present */
848001aac25SJames Bottomley 		       sshdr->asc == 0x3a)) {
849285e9670SKay Sievers 		set_media_not_present(sdkp);
850285e9670SKay Sievers 		retval = 1;
851285e9670SKay Sievers 		goto out;
852285e9670SKay Sievers 	}
8531da177e4SLinus Torvalds 
8541da177e4SLinus Torvalds 	/*
8551da177e4SLinus Torvalds 	 * For removable scsi disk we have to recognise the presence
8561da177e4SLinus Torvalds 	 * of a disk in the drive. This is kept in the struct scsi_disk
8571da177e4SLinus Torvalds 	 * struct and tested at open !  Daniel Roche (dan@lectra.fr)
8581da177e4SLinus Torvalds 	 */
8591da177e4SLinus Torvalds 	sdkp->media_present = 1;
8601da177e4SLinus Torvalds 
8611da177e4SLinus Torvalds 	retval = sdp->changed;
8621da177e4SLinus Torvalds 	sdp->changed = 0;
863285e9670SKay Sievers out:
864285e9670SKay Sievers 	if (retval != sdkp->previous_state)
865285e9670SKay Sievers 		sdev_evt_send_simple(sdp, SDEV_EVT_MEDIA_CHANGE, GFP_KERNEL);
866285e9670SKay Sievers 	sdkp->previous_state = retval;
867001aac25SJames Bottomley 	kfree(sshdr);
8681da177e4SLinus Torvalds 	return retval;
8691da177e4SLinus Torvalds }
8701da177e4SLinus Torvalds 
871e73aec82SMartin K. Petersen static int sd_sync_cache(struct scsi_disk *sdkp)
8721da177e4SLinus Torvalds {
8731da177e4SLinus Torvalds 	int retries, res;
874e73aec82SMartin K. Petersen 	struct scsi_device *sdp = sdkp->device;
875ea73a9f2SJames Bottomley 	struct scsi_sense_hdr sshdr;
8761da177e4SLinus Torvalds 
8771da177e4SLinus Torvalds 	if (!scsi_device_online(sdp))
8781da177e4SLinus Torvalds 		return -ENODEV;
8791da177e4SLinus Torvalds 
8801da177e4SLinus Torvalds 
8811da177e4SLinus Torvalds 	for (retries = 3; retries > 0; --retries) {
8821da177e4SLinus Torvalds 		unsigned char cmd[10] = { 0 };
8831da177e4SLinus Torvalds 
8841da177e4SLinus Torvalds 		cmd[0] = SYNCHRONIZE_CACHE;
8851da177e4SLinus Torvalds 		/*
8861da177e4SLinus Torvalds 		 * Leave the rest of the command zero to indicate
8871da177e4SLinus Torvalds 		 * flush everything.
8881da177e4SLinus Torvalds 		 */
889ea73a9f2SJames Bottomley 		res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
890f4f4e47eSFUJITA Tomonori 				       SD_TIMEOUT, SD_MAX_RETRIES, NULL);
891ea73a9f2SJames Bottomley 		if (res == 0)
8921da177e4SLinus Torvalds 			break;
8931da177e4SLinus Torvalds 	}
8941da177e4SLinus Torvalds 
895e73aec82SMartin K. Petersen 	if (res) {
896e73aec82SMartin K. Petersen 		sd_print_result(sdkp, res);
8971da177e4SLinus Torvalds 		if (driver_byte(res) & DRIVER_SENSE)
898e73aec82SMartin K. Petersen 			sd_print_sense_hdr(sdkp, &sshdr);
8991da177e4SLinus Torvalds 	}
9001da177e4SLinus Torvalds 
9013721050aSTejun Heo 	if (res)
9023721050aSTejun Heo 		return -EIO;
9033721050aSTejun Heo 	return 0;
9041da177e4SLinus Torvalds }
9051da177e4SLinus Torvalds 
906165125e1SJens Axboe static void sd_prepare_flush(struct request_queue *q, struct request *rq)
9071da177e4SLinus Torvalds {
9084aff5e23SJens Axboe 	rq->cmd_type = REQ_TYPE_BLOCK_PC;
9091da177e4SLinus Torvalds 	rq->timeout = SD_TIMEOUT;
9101da177e4SLinus Torvalds 	rq->cmd[0] = SYNCHRONIZE_CACHE;
911461d4e90STejun Heo 	rq->cmd_len = 10;
9121da177e4SLinus Torvalds }
9131da177e4SLinus Torvalds 
9141da177e4SLinus Torvalds static void sd_rescan(struct device *dev)
9151da177e4SLinus Torvalds {
91639b7f1e2SAlan Stern 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
91739b7f1e2SAlan Stern 
91839b7f1e2SAlan Stern 	if (sdkp) {
919f98a8caeSAndrew Patterson 		revalidate_disk(sdkp->disk);
92039b7f1e2SAlan Stern 		scsi_disk_put(sdkp);
92139b7f1e2SAlan Stern 	}
9221da177e4SLinus Torvalds }
9231da177e4SLinus Torvalds 
9241da177e4SLinus Torvalds 
9251da177e4SLinus Torvalds #ifdef CONFIG_COMPAT
9261da177e4SLinus Torvalds /*
9271da177e4SLinus Torvalds  * This gets directly called from VFS. When the ioctl
9281da177e4SLinus Torvalds  * is not recognized we go back to the other translation paths.
9291da177e4SLinus Torvalds  */
9300338e291SAl Viro static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
9310338e291SAl Viro 			   unsigned int cmd, unsigned long arg)
9321da177e4SLinus Torvalds {
9330338e291SAl Viro 	struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
9341da177e4SLinus Torvalds 
9351da177e4SLinus Torvalds 	/*
9361da177e4SLinus Torvalds 	 * If we are in the middle of error recovery, don't let anyone
9371da177e4SLinus Torvalds 	 * else try and use this device.  Also, if error recovery fails, it
9381da177e4SLinus Torvalds 	 * may try and take the device offline, in which case all further
9391da177e4SLinus Torvalds 	 * access to the device is prohibited.
9401da177e4SLinus Torvalds 	 */
9411da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdev))
9421da177e4SLinus Torvalds 		return -ENODEV;
9431da177e4SLinus Torvalds 
9441da177e4SLinus Torvalds 	if (sdev->host->hostt->compat_ioctl) {
9451da177e4SLinus Torvalds 		int ret;
9461da177e4SLinus Torvalds 
9471da177e4SLinus Torvalds 		ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
9481da177e4SLinus Torvalds 
9491da177e4SLinus Torvalds 		return ret;
9501da177e4SLinus Torvalds 	}
9511da177e4SLinus Torvalds 
9521da177e4SLinus Torvalds 	/*
9531da177e4SLinus Torvalds 	 * Let the static ioctl translation table take care of it.
9541da177e4SLinus Torvalds 	 */
9551da177e4SLinus Torvalds 	return -ENOIOCTLCMD;
9561da177e4SLinus Torvalds }
9571da177e4SLinus Torvalds #endif
9581da177e4SLinus Torvalds 
9591da177e4SLinus Torvalds static struct block_device_operations sd_fops = {
9601da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
9610338e291SAl Viro 	.open			= sd_open,
9620338e291SAl Viro 	.release		= sd_release,
9630338e291SAl Viro 	.locked_ioctl		= sd_ioctl,
964a885c8c4SChristoph Hellwig 	.getgeo			= sd_getgeo,
9651da177e4SLinus Torvalds #ifdef CONFIG_COMPAT
9660338e291SAl Viro 	.compat_ioctl		= sd_compat_ioctl,
9671da177e4SLinus Torvalds #endif
9681da177e4SLinus Torvalds 	.media_changed		= sd_media_changed,
9691da177e4SLinus Torvalds 	.revalidate_disk	= sd_revalidate_disk,
9701da177e4SLinus Torvalds };
9711da177e4SLinus Torvalds 
972af55ff67SMartin K. Petersen static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
973af55ff67SMartin K. Petersen {
974af55ff67SMartin K. Petersen 	u64 start_lba = scmd->request->sector;
975af55ff67SMartin K. Petersen 	u64 end_lba = scmd->request->sector + (scsi_bufflen(scmd) / 512);
976af55ff67SMartin K. Petersen 	u64 bad_lba;
977af55ff67SMartin K. Petersen 	int info_valid;
978af55ff67SMartin K. Petersen 
979af55ff67SMartin K. Petersen 	if (!blk_fs_request(scmd->request))
980af55ff67SMartin K. Petersen 		return 0;
981af55ff67SMartin K. Petersen 
982af55ff67SMartin K. Petersen 	info_valid = scsi_get_sense_info_fld(scmd->sense_buffer,
983af55ff67SMartin K. Petersen 					     SCSI_SENSE_BUFFERSIZE,
984af55ff67SMartin K. Petersen 					     &bad_lba);
985af55ff67SMartin K. Petersen 	if (!info_valid)
986af55ff67SMartin K. Petersen 		return 0;
987af55ff67SMartin K. Petersen 
988af55ff67SMartin K. Petersen 	if (scsi_bufflen(scmd) <= scmd->device->sector_size)
989af55ff67SMartin K. Petersen 		return 0;
990af55ff67SMartin K. Petersen 
991af55ff67SMartin K. Petersen 	if (scmd->device->sector_size < 512) {
992af55ff67SMartin K. Petersen 		/* only legitimate sector_size here is 256 */
993af55ff67SMartin K. Petersen 		start_lba <<= 1;
994af55ff67SMartin K. Petersen 		end_lba <<= 1;
995af55ff67SMartin K. Petersen 	} else {
996af55ff67SMartin K. Petersen 		/* be careful ... don't want any overflows */
997af55ff67SMartin K. Petersen 		u64 factor = scmd->device->sector_size / 512;
998af55ff67SMartin K. Petersen 		do_div(start_lba, factor);
999af55ff67SMartin K. Petersen 		do_div(end_lba, factor);
1000af55ff67SMartin K. Petersen 	}
1001af55ff67SMartin K. Petersen 
1002af55ff67SMartin K. Petersen 	/* The bad lba was reported incorrectly, we have no idea where
1003af55ff67SMartin K. Petersen 	 * the error is.
1004af55ff67SMartin K. Petersen 	 */
1005af55ff67SMartin K. Petersen 	if (bad_lba < start_lba  || bad_lba >= end_lba)
1006af55ff67SMartin K. Petersen 		return 0;
1007af55ff67SMartin K. Petersen 
1008af55ff67SMartin K. Petersen 	/* This computation should always be done in terms of
1009af55ff67SMartin K. Petersen 	 * the resolution of the device's medium.
1010af55ff67SMartin K. Petersen 	 */
1011af55ff67SMartin K. Petersen 	return (bad_lba - start_lba) * scmd->device->sector_size;
1012af55ff67SMartin K. Petersen }
1013af55ff67SMartin K. Petersen 
10141da177e4SLinus Torvalds /**
10157b3d9545SLinus Torvalds  *	sd_done - bottom half handler: called when the lower level
10161da177e4SLinus Torvalds  *	driver has completed (successfully or otherwise) a scsi command.
10171da177e4SLinus Torvalds  *	@SCpnt: mid-level's per command structure.
10181da177e4SLinus Torvalds  *
10191da177e4SLinus Torvalds  *	Note: potentially run from within an ISR. Must not block.
10201da177e4SLinus Torvalds  **/
10217b3d9545SLinus Torvalds static int sd_done(struct scsi_cmnd *SCpnt)
10221da177e4SLinus Torvalds {
10231da177e4SLinus Torvalds 	int result = SCpnt->result;
1024af55ff67SMartin K. Petersen 	unsigned int good_bytes = result ? 0 : scsi_bufflen(SCpnt);
10251da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
10261da177e4SLinus Torvalds 	int sense_valid = 0;
10271da177e4SLinus Torvalds 	int sense_deferred = 0;
10281da177e4SLinus Torvalds 
10291da177e4SLinus Torvalds 	if (result) {
10301da177e4SLinus Torvalds 		sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr);
10311da177e4SLinus Torvalds 		if (sense_valid)
10321da177e4SLinus Torvalds 			sense_deferred = scsi_sense_is_deferred(&sshdr);
10331da177e4SLinus Torvalds 	}
10341da177e4SLinus Torvalds #ifdef CONFIG_SCSI_LOGGING
1035fa0d34beSMartin K. Petersen 	SCSI_LOG_HLCOMPLETE(1, scsi_print_result(SCpnt));
10361da177e4SLinus Torvalds 	if (sense_valid) {
1037fa0d34beSMartin K. Petersen 		SCSI_LOG_HLCOMPLETE(1, scmd_printk(KERN_INFO, SCpnt,
10387b3d9545SLinus Torvalds 						   "sd_done: sb[respc,sk,asc,"
1039fa0d34beSMartin K. Petersen 						   "ascq]=%x,%x,%x,%x\n",
1040fa0d34beSMartin K. Petersen 						   sshdr.response_code,
1041fa0d34beSMartin K. Petersen 						   sshdr.sense_key, sshdr.asc,
1042fa0d34beSMartin K. Petersen 						   sshdr.ascq));
10431da177e4SLinus Torvalds 	}
10441da177e4SLinus Torvalds #endif
104503aba2f7SLuben Tuikov 	if (driver_byte(result) != DRIVER_SENSE &&
104603aba2f7SLuben Tuikov 	    (!sense_valid || sense_deferred))
104703aba2f7SLuben Tuikov 		goto out;
104803aba2f7SLuben Tuikov 
10491da177e4SLinus Torvalds 	switch (sshdr.sense_key) {
105003aba2f7SLuben Tuikov 	case HARDWARE_ERROR:
10511da177e4SLinus Torvalds 	case MEDIUM_ERROR:
1052af55ff67SMartin K. Petersen 		good_bytes = sd_completed_bytes(SCpnt);
10531da177e4SLinus Torvalds 		break;
105403aba2f7SLuben Tuikov 	case RECOVERED_ERROR:
1055af55ff67SMartin K. Petersen 		good_bytes = scsi_bufflen(SCpnt);
1056af55ff67SMartin K. Petersen 		break;
105710dab226SJamie Wellnitz 	case NO_SENSE:
105810dab226SJamie Wellnitz 		/* This indicates a false check condition, so ignore it.  An
105910dab226SJamie Wellnitz 		 * unknown amount of data was transferred so treat it as an
106010dab226SJamie Wellnitz 		 * error.
106110dab226SJamie Wellnitz 		 */
106210dab226SJamie Wellnitz 		scsi_print_sense("sd", SCpnt);
106310dab226SJamie Wellnitz 		SCpnt->result = 0;
106410dab226SJamie Wellnitz 		memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
106510dab226SJamie Wellnitz 		break;
1066af55ff67SMartin K. Petersen 	case ABORTED_COMMAND:
1067af55ff67SMartin K. Petersen 		if (sshdr.asc == 0x10) { /* DIF: Disk detected corruption */
1068af55ff67SMartin K. Petersen 			scsi_print_result(SCpnt);
1069af55ff67SMartin K. Petersen 			scsi_print_sense("sd", SCpnt);
1070af55ff67SMartin K. Petersen 			good_bytes = sd_completed_bytes(SCpnt);
1071af55ff67SMartin K. Petersen 		}
10721da177e4SLinus Torvalds 		break;
10731da177e4SLinus Torvalds 	case ILLEGAL_REQUEST:
1074af55ff67SMartin K. Petersen 		if (sshdr.asc == 0x10) { /* DIX: HBA detected corruption */
1075af55ff67SMartin K. Petersen 			scsi_print_result(SCpnt);
1076af55ff67SMartin K. Petersen 			scsi_print_sense("sd", SCpnt);
1077af55ff67SMartin K. Petersen 			good_bytes = sd_completed_bytes(SCpnt);
1078af55ff67SMartin K. Petersen 		}
10791da177e4SLinus Torvalds 		break;
10801da177e4SLinus Torvalds 	default:
10811da177e4SLinus Torvalds 		break;
10821da177e4SLinus Torvalds 	}
108303aba2f7SLuben Tuikov  out:
1084af55ff67SMartin K. Petersen 	if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt))
1085af55ff67SMartin K. Petersen 		sd_dif_complete(SCpnt, good_bytes);
1086af55ff67SMartin K. Petersen 
10877b3d9545SLinus Torvalds 	return good_bytes;
10881da177e4SLinus Torvalds }
10891da177e4SLinus Torvalds 
1090ea73a9f2SJames Bottomley static int media_not_present(struct scsi_disk *sdkp,
1091ea73a9f2SJames Bottomley 			     struct scsi_sense_hdr *sshdr)
10921da177e4SLinus Torvalds {
10931da177e4SLinus Torvalds 
1094ea73a9f2SJames Bottomley 	if (!scsi_sense_valid(sshdr))
10951da177e4SLinus Torvalds 		return 0;
10961da177e4SLinus Torvalds 	/* not invoked for commands that could return deferred errors */
1097ea73a9f2SJames Bottomley 	if (sshdr->sense_key != NOT_READY &&
1098ea73a9f2SJames Bottomley 	    sshdr->sense_key != UNIT_ATTENTION)
10991da177e4SLinus Torvalds 		return 0;
1100ea73a9f2SJames Bottomley 	if (sshdr->asc != 0x3A) /* medium not present */
11011da177e4SLinus Torvalds 		return 0;
1102ea73a9f2SJames Bottomley 
11031da177e4SLinus Torvalds 	set_media_not_present(sdkp);
11041da177e4SLinus Torvalds 	return 1;
11051da177e4SLinus Torvalds }
11061da177e4SLinus Torvalds 
11071da177e4SLinus Torvalds /*
11081da177e4SLinus Torvalds  * spinup disk - called only in sd_revalidate_disk()
11091da177e4SLinus Torvalds  */
11101da177e4SLinus Torvalds static void
1111e73aec82SMartin K. Petersen sd_spinup_disk(struct scsi_disk *sdkp)
1112ea73a9f2SJames Bottomley {
11131da177e4SLinus Torvalds 	unsigned char cmd[10];
11144451e472SAlan Stern 	unsigned long spintime_expire = 0;
11151da177e4SLinus Torvalds 	int retries, spintime;
11161da177e4SLinus Torvalds 	unsigned int the_result;
11171da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
11181da177e4SLinus Torvalds 	int sense_valid = 0;
11191da177e4SLinus Torvalds 
11201da177e4SLinus Torvalds 	spintime = 0;
11211da177e4SLinus Torvalds 
11221da177e4SLinus Torvalds 	/* Spin up drives, as required.  Only do this at boot time */
11231da177e4SLinus Torvalds 	/* Spinup needs to be done for module loads too. */
11241da177e4SLinus Torvalds 	do {
11251da177e4SLinus Torvalds 		retries = 0;
11261da177e4SLinus Torvalds 
11271da177e4SLinus Torvalds 		do {
11281da177e4SLinus Torvalds 			cmd[0] = TEST_UNIT_READY;
11291da177e4SLinus Torvalds 			memset((void *) &cmd[1], 0, 9);
11301da177e4SLinus Torvalds 
1131ea73a9f2SJames Bottomley 			the_result = scsi_execute_req(sdkp->device, cmd,
1132ea73a9f2SJames Bottomley 						      DMA_NONE, NULL, 0,
1133ea73a9f2SJames Bottomley 						      &sshdr, SD_TIMEOUT,
1134f4f4e47eSFUJITA Tomonori 						      SD_MAX_RETRIES, NULL);
11351da177e4SLinus Torvalds 
1136b4d38e38SAlan Stern 			/*
1137b4d38e38SAlan Stern 			 * If the drive has indicated to us that it
1138b4d38e38SAlan Stern 			 * doesn't have any media in it, don't bother
1139b4d38e38SAlan Stern 			 * with any more polling.
1140b4d38e38SAlan Stern 			 */
1141b4d38e38SAlan Stern 			if (media_not_present(sdkp, &sshdr))
1142b4d38e38SAlan Stern 				return;
1143b4d38e38SAlan Stern 
11441da177e4SLinus Torvalds 			if (the_result)
1145ea73a9f2SJames Bottomley 				sense_valid = scsi_sense_valid(&sshdr);
11461da177e4SLinus Torvalds 			retries++;
11471da177e4SLinus Torvalds 		} while (retries < 3 &&
11481da177e4SLinus Torvalds 			 (!scsi_status_is_good(the_result) ||
11491da177e4SLinus Torvalds 			  ((driver_byte(the_result) & DRIVER_SENSE) &&
11501da177e4SLinus Torvalds 			  sense_valid && sshdr.sense_key == UNIT_ATTENTION)));
11511da177e4SLinus Torvalds 
11521da177e4SLinus Torvalds 		if ((driver_byte(the_result) & DRIVER_SENSE) == 0) {
11531da177e4SLinus Torvalds 			/* no sense, TUR either succeeded or failed
11541da177e4SLinus Torvalds 			 * with a status error */
1155e73aec82SMartin K. Petersen 			if(!spintime && !scsi_status_is_good(the_result)) {
1156e73aec82SMartin K. Petersen 				sd_printk(KERN_NOTICE, sdkp, "Unit Not Ready\n");
1157e73aec82SMartin K. Petersen 				sd_print_result(sdkp, the_result);
1158e73aec82SMartin K. Petersen 			}
11591da177e4SLinus Torvalds 			break;
11601da177e4SLinus Torvalds 		}
11611da177e4SLinus Torvalds 
11621da177e4SLinus Torvalds 		/*
11631da177e4SLinus Torvalds 		 * The device does not want the automatic start to be issued.
11641da177e4SLinus Torvalds 		 */
116533dd6f92SMatthew Wilcox 		if (sdkp->device->no_start_on_add)
11661da177e4SLinus Torvalds 			break;
11671da177e4SLinus Torvalds 
116833dd6f92SMatthew Wilcox 		if (sense_valid && sshdr.sense_key == NOT_READY) {
116933dd6f92SMatthew Wilcox 			if (sshdr.asc == 4 && sshdr.ascq == 3)
11701da177e4SLinus Torvalds 				break;	/* manual intervention required */
117133dd6f92SMatthew Wilcox 			if (sshdr.asc == 4 && sshdr.ascq == 0xb)
117233dd6f92SMatthew Wilcox 				break;	/* standby */
117333dd6f92SMatthew Wilcox 			if (sshdr.asc == 4 && sshdr.ascq == 0xc)
117433dd6f92SMatthew Wilcox 				break;	/* unavailable */
11751da177e4SLinus Torvalds 			/*
11761da177e4SLinus Torvalds 			 * Issue command to spin up drive when not ready
11771da177e4SLinus Torvalds 			 */
11781da177e4SLinus Torvalds 			if (!spintime) {
1179e73aec82SMartin K. Petersen 				sd_printk(KERN_NOTICE, sdkp, "Spinning up disk...");
11801da177e4SLinus Torvalds 				cmd[0] = START_STOP;
11811da177e4SLinus Torvalds 				cmd[1] = 1;	/* Return immediately */
11821da177e4SLinus Torvalds 				memset((void *) &cmd[2], 0, 8);
11831da177e4SLinus Torvalds 				cmd[4] = 1;	/* Start spin cycle */
1184d2886ea3SStefan Richter 				if (sdkp->device->start_stop_pwr_cond)
1185d2886ea3SStefan Richter 					cmd[4] |= 1 << 4;
1186ea73a9f2SJames Bottomley 				scsi_execute_req(sdkp->device, cmd, DMA_NONE,
1187ea73a9f2SJames Bottomley 						 NULL, 0, &sshdr,
1188f4f4e47eSFUJITA Tomonori 						 SD_TIMEOUT, SD_MAX_RETRIES,
1189f4f4e47eSFUJITA Tomonori 						 NULL);
11904451e472SAlan Stern 				spintime_expire = jiffies + 100 * HZ;
11911da177e4SLinus Torvalds 				spintime = 1;
11924451e472SAlan Stern 			}
11931da177e4SLinus Torvalds 			/* Wait 1 second for next try */
11941da177e4SLinus Torvalds 			msleep(1000);
11951da177e4SLinus Torvalds 			printk(".");
11964451e472SAlan Stern 
11974451e472SAlan Stern 		/*
11984451e472SAlan Stern 		 * Wait for USB flash devices with slow firmware.
11994451e472SAlan Stern 		 * Yes, this sense key/ASC combination shouldn't
12004451e472SAlan Stern 		 * occur here.  It's characteristic of these devices.
12014451e472SAlan Stern 		 */
12024451e472SAlan Stern 		} else if (sense_valid &&
12034451e472SAlan Stern 				sshdr.sense_key == UNIT_ATTENTION &&
12044451e472SAlan Stern 				sshdr.asc == 0x28) {
12054451e472SAlan Stern 			if (!spintime) {
12064451e472SAlan Stern 				spintime_expire = jiffies + 5 * HZ;
12074451e472SAlan Stern 				spintime = 1;
12084451e472SAlan Stern 			}
12094451e472SAlan Stern 			/* Wait 1 second for next try */
12104451e472SAlan Stern 			msleep(1000);
12111da177e4SLinus Torvalds 		} else {
12121da177e4SLinus Torvalds 			/* we don't understand the sense code, so it's
12131da177e4SLinus Torvalds 			 * probably pointless to loop */
12141da177e4SLinus Torvalds 			if(!spintime) {
1215e73aec82SMartin K. Petersen 				sd_printk(KERN_NOTICE, sdkp, "Unit Not Ready\n");
1216e73aec82SMartin K. Petersen 				sd_print_sense_hdr(sdkp, &sshdr);
12171da177e4SLinus Torvalds 			}
12181da177e4SLinus Torvalds 			break;
12191da177e4SLinus Torvalds 		}
12201da177e4SLinus Torvalds 
12214451e472SAlan Stern 	} while (spintime && time_before_eq(jiffies, spintime_expire));
12221da177e4SLinus Torvalds 
12231da177e4SLinus Torvalds 	if (spintime) {
12241da177e4SLinus Torvalds 		if (scsi_status_is_good(the_result))
12251da177e4SLinus Torvalds 			printk("ready\n");
12261da177e4SLinus Torvalds 		else
12271da177e4SLinus Torvalds 			printk("not responding...\n");
12281da177e4SLinus Torvalds 	}
12291da177e4SLinus Torvalds }
12301da177e4SLinus Torvalds 
1231e0597d70SMartin K. Petersen 
1232e0597d70SMartin K. Petersen /*
1233e0597d70SMartin K. Petersen  * Determine whether disk supports Data Integrity Field.
1234e0597d70SMartin K. Petersen  */
1235e0597d70SMartin K. Petersen void sd_read_protection_type(struct scsi_disk *sdkp, unsigned char *buffer)
1236e0597d70SMartin K. Petersen {
1237e0597d70SMartin K. Petersen 	struct scsi_device *sdp = sdkp->device;
1238e0597d70SMartin K. Petersen 	u8 type;
1239e0597d70SMartin K. Petersen 
1240e0597d70SMartin K. Petersen 	if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0)
1241e0597d70SMartin K. Petersen 		type = 0;
1242e0597d70SMartin K. Petersen 	else
1243e0597d70SMartin K. Petersen 		type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */
1244e0597d70SMartin K. Petersen 
1245be922f47SMartin K. Petersen 	sdkp->protection_type = type;
1246be922f47SMartin K. Petersen 
1247e0597d70SMartin K. Petersen 	switch (type) {
1248e0597d70SMartin K. Petersen 	case SD_DIF_TYPE0_PROTECTION:
1249e0597d70SMartin K. Petersen 	case SD_DIF_TYPE1_PROTECTION:
1250e0597d70SMartin K. Petersen 	case SD_DIF_TYPE3_PROTECTION:
1251e0597d70SMartin K. Petersen 		break;
1252e0597d70SMartin K. Petersen 
1253e0597d70SMartin K. Petersen 	case SD_DIF_TYPE2_PROTECTION:
1254e0597d70SMartin K. Petersen 		sd_printk(KERN_ERR, sdkp, "formatted with DIF Type 2 "	\
1255e0597d70SMartin K. Petersen 			  "protection which is currently unsupported. "	\
1256e0597d70SMartin K. Petersen 			  "Disabling disk!\n");
1257e0597d70SMartin K. Petersen 		goto disable;
1258e0597d70SMartin K. Petersen 
1259e0597d70SMartin K. Petersen 	default:
1260e0597d70SMartin K. Petersen 		sd_printk(KERN_ERR, sdkp, "formatted with unknown "	\
1261e0597d70SMartin K. Petersen 			  "protection type %d. Disabling disk!\n", type);
1262e0597d70SMartin K. Petersen 		goto disable;
1263e0597d70SMartin K. Petersen 	}
1264e0597d70SMartin K. Petersen 
1265e0597d70SMartin K. Petersen 	return;
1266e0597d70SMartin K. Petersen 
1267e0597d70SMartin K. Petersen disable:
1268e0597d70SMartin K. Petersen 	sdkp->capacity = 0;
1269e0597d70SMartin K. Petersen }
1270e0597d70SMartin K. Petersen 
12710da205e0SMatthew Wilcox static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
12720da205e0SMatthew Wilcox 			struct scsi_sense_hdr *sshdr, int sense_valid,
12730da205e0SMatthew Wilcox 			int the_result)
1274ea73a9f2SJames Bottomley {
12750da205e0SMatthew Wilcox 	sd_print_result(sdkp, the_result);
12760da205e0SMatthew Wilcox 	if (driver_byte(the_result) & DRIVER_SENSE)
12770da205e0SMatthew Wilcox 		sd_print_sense_hdr(sdkp, sshdr);
12780da205e0SMatthew Wilcox 	else
12790da205e0SMatthew Wilcox 		sd_printk(KERN_NOTICE, sdkp, "Sense not available.\n");
12801da177e4SLinus Torvalds 
12810da205e0SMatthew Wilcox 	/*
12820da205e0SMatthew Wilcox 	 * Set dirty bit for removable devices if not ready -
12830da205e0SMatthew Wilcox 	 * sometimes drives will not report this properly.
12840da205e0SMatthew Wilcox 	 */
12850da205e0SMatthew Wilcox 	if (sdp->removable &&
12860da205e0SMatthew Wilcox 	    sense_valid && sshdr->sense_key == NOT_READY)
12870da205e0SMatthew Wilcox 		sdp->changed = 1;
12880da205e0SMatthew Wilcox 
12890da205e0SMatthew Wilcox 	/*
12900da205e0SMatthew Wilcox 	 * We used to set media_present to 0 here to indicate no media
12910da205e0SMatthew Wilcox 	 * in the drive, but some drives fail read capacity even with
12920da205e0SMatthew Wilcox 	 * media present, so we can't do that.
12930da205e0SMatthew Wilcox 	 */
12940da205e0SMatthew Wilcox 	sdkp->capacity = 0; /* unknown mapped to zero - as usual */
12951da177e4SLinus Torvalds }
12961da177e4SLinus Torvalds 
12970da205e0SMatthew Wilcox #define RC16_LEN 32
12980da205e0SMatthew Wilcox #if RC16_LEN > SD_BUF_SIZE
12990da205e0SMatthew Wilcox #error RC16_LEN must not be more than SD_BUF_SIZE
13000da205e0SMatthew Wilcox #endif
13010da205e0SMatthew Wilcox 
13020da205e0SMatthew Wilcox static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
13030da205e0SMatthew Wilcox 						unsigned char *buffer)
13040da205e0SMatthew Wilcox {
13050da205e0SMatthew Wilcox 	unsigned char cmd[16];
13060da205e0SMatthew Wilcox 	struct scsi_sense_hdr sshdr;
13070da205e0SMatthew Wilcox 	int sense_valid = 0;
13080da205e0SMatthew Wilcox 	int the_result;
13090da205e0SMatthew Wilcox 	int retries = 3;
13100da205e0SMatthew Wilcox 	unsigned long long lba;
13110da205e0SMatthew Wilcox 	unsigned sector_size;
13120da205e0SMatthew Wilcox 
13130da205e0SMatthew Wilcox 	do {
13140da205e0SMatthew Wilcox 		memset(cmd, 0, 16);
13150da205e0SMatthew Wilcox 		cmd[0] = SERVICE_ACTION_IN;
13160da205e0SMatthew Wilcox 		cmd[1] = SAI_READ_CAPACITY_16;
13170da205e0SMatthew Wilcox 		cmd[13] = RC16_LEN;
13180da205e0SMatthew Wilcox 		memset(buffer, 0, RC16_LEN);
13190da205e0SMatthew Wilcox 
1320ea73a9f2SJames Bottomley 		the_result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE,
13210da205e0SMatthew Wilcox 					buffer, RC16_LEN, &sshdr,
1322f4f4e47eSFUJITA Tomonori 					SD_TIMEOUT, SD_MAX_RETRIES, NULL);
13231da177e4SLinus Torvalds 
1324ea73a9f2SJames Bottomley 		if (media_not_present(sdkp, &sshdr))
13250da205e0SMatthew Wilcox 			return -ENODEV;
13261da177e4SLinus Torvalds 
13272b301307SMatthew Wilcox 		if (the_result) {
1328ea73a9f2SJames Bottomley 			sense_valid = scsi_sense_valid(&sshdr);
13292b301307SMatthew Wilcox 			if (sense_valid &&
13302b301307SMatthew Wilcox 			    sshdr.sense_key == ILLEGAL_REQUEST &&
13312b301307SMatthew Wilcox 			    (sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
13322b301307SMatthew Wilcox 			    sshdr.ascq == 0x00)
13332b301307SMatthew Wilcox 				/* Invalid Command Operation Code or
13342b301307SMatthew Wilcox 				 * Invalid Field in CDB, just retry
13352b301307SMatthew Wilcox 				 * silently with RC10 */
13362b301307SMatthew Wilcox 				return -EINVAL;
13372b301307SMatthew Wilcox 		}
13381da177e4SLinus Torvalds 		retries--;
13391da177e4SLinus Torvalds 
13401da177e4SLinus Torvalds 	} while (the_result && retries);
13411da177e4SLinus Torvalds 
13420da205e0SMatthew Wilcox 	if (the_result) {
1343e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "READ CAPACITY(16) failed\n");
13440da205e0SMatthew Wilcox 		read_capacity_error(sdkp, sdp, &sshdr, sense_valid, the_result);
13450da205e0SMatthew Wilcox 		return -EINVAL;
13461da177e4SLinus Torvalds 	}
13471da177e4SLinus Torvalds 
1348*8f76d151SDave Hansen 	sector_size = get_unaligned_be32(&buffer[8]);
1349*8f76d151SDave Hansen 	lba = get_unaligned_be64(&buffer[0]);
1350e0597d70SMartin K. Petersen 
1351e0597d70SMartin K. Petersen 	sd_read_protection_type(sdkp, buffer);
13520da205e0SMatthew Wilcox 
13530da205e0SMatthew Wilcox 	if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) {
13540da205e0SMatthew Wilcox 		sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
13550da205e0SMatthew Wilcox 			"kernel compiled with support for large block "
13560da205e0SMatthew Wilcox 			"devices.\n");
13570da205e0SMatthew Wilcox 		sdkp->capacity = 0;
13580da205e0SMatthew Wilcox 		return -EOVERFLOW;
13590da205e0SMatthew Wilcox 	}
13600da205e0SMatthew Wilcox 
13610da205e0SMatthew Wilcox 	sdkp->capacity = lba + 1;
13620da205e0SMatthew Wilcox 	return sector_size;
13630da205e0SMatthew Wilcox }
13640da205e0SMatthew Wilcox 
13650da205e0SMatthew Wilcox static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
13660da205e0SMatthew Wilcox 						unsigned char *buffer)
13670da205e0SMatthew Wilcox {
13680da205e0SMatthew Wilcox 	unsigned char cmd[16];
13690da205e0SMatthew Wilcox 	struct scsi_sense_hdr sshdr;
13700da205e0SMatthew Wilcox 	int sense_valid = 0;
13710da205e0SMatthew Wilcox 	int the_result;
13720da205e0SMatthew Wilcox 	int retries = 3;
13730da205e0SMatthew Wilcox 	sector_t lba;
13740da205e0SMatthew Wilcox 	unsigned sector_size;
13750da205e0SMatthew Wilcox 
13760da205e0SMatthew Wilcox 	do {
13770da205e0SMatthew Wilcox 		cmd[0] = READ_CAPACITY;
13780da205e0SMatthew Wilcox 		memset(&cmd[1], 0, 9);
13790da205e0SMatthew Wilcox 		memset(buffer, 0, 8);
13800da205e0SMatthew Wilcox 
13810da205e0SMatthew Wilcox 		the_result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE,
13820da205e0SMatthew Wilcox 					buffer, 8, &sshdr,
13830da205e0SMatthew Wilcox 					SD_TIMEOUT, SD_MAX_RETRIES, NULL);
13840da205e0SMatthew Wilcox 
13850da205e0SMatthew Wilcox 		if (media_not_present(sdkp, &sshdr))
13860da205e0SMatthew Wilcox 			return -ENODEV;
13870da205e0SMatthew Wilcox 
13880da205e0SMatthew Wilcox 		if (the_result)
13890da205e0SMatthew Wilcox 			sense_valid = scsi_sense_valid(&sshdr);
13900da205e0SMatthew Wilcox 		retries--;
13910da205e0SMatthew Wilcox 
13920da205e0SMatthew Wilcox 	} while (the_result && retries);
13930da205e0SMatthew Wilcox 
13940da205e0SMatthew Wilcox 	if (the_result) {
13950da205e0SMatthew Wilcox 		sd_printk(KERN_NOTICE, sdkp, "READ CAPACITY failed\n");
13960da205e0SMatthew Wilcox 		read_capacity_error(sdkp, sdp, &sshdr, sense_valid, the_result);
13970da205e0SMatthew Wilcox 		return -EINVAL;
13980da205e0SMatthew Wilcox 	}
13990da205e0SMatthew Wilcox 
1400*8f76d151SDave Hansen 	sector_size = get_unaligned_be32(&buffer[4]);
1401*8f76d151SDave Hansen 	lba = get_unaligned_be32(&buffer[0]);
14020da205e0SMatthew Wilcox 
14030da205e0SMatthew Wilcox 	if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
14040da205e0SMatthew Wilcox 		sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
14050da205e0SMatthew Wilcox 			"kernel compiled with support for large block "
14060da205e0SMatthew Wilcox 			"devices.\n");
14070da205e0SMatthew Wilcox 		sdkp->capacity = 0;
14080da205e0SMatthew Wilcox 		return -EOVERFLOW;
14090da205e0SMatthew Wilcox 	}
14100da205e0SMatthew Wilcox 
14110da205e0SMatthew Wilcox 	sdkp->capacity = lba + 1;
14120da205e0SMatthew Wilcox 	return sector_size;
14130da205e0SMatthew Wilcox }
14140da205e0SMatthew Wilcox 
14152b301307SMatthew Wilcox static int sd_try_rc16_first(struct scsi_device *sdp)
14162b301307SMatthew Wilcox {
14172b301307SMatthew Wilcox 	if (sdp->scsi_level > SCSI_SPC_2)
14182b301307SMatthew Wilcox 		return 1;
14192b301307SMatthew Wilcox 	if (scsi_device_protection(sdp))
14202b301307SMatthew Wilcox 		return 1;
14212b301307SMatthew Wilcox 	return 0;
14222b301307SMatthew Wilcox }
14232b301307SMatthew Wilcox 
14240da205e0SMatthew Wilcox /*
14250da205e0SMatthew Wilcox  * read disk capacity
14260da205e0SMatthew Wilcox  */
14270da205e0SMatthew Wilcox static void
14280da205e0SMatthew Wilcox sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
14290da205e0SMatthew Wilcox {
14300da205e0SMatthew Wilcox 	int sector_size;
14310da205e0SMatthew Wilcox 	struct scsi_device *sdp = sdkp->device;
143270a9b873SMartin K. Petersen 	sector_t old_capacity = sdkp->capacity;
14330da205e0SMatthew Wilcox 
14342b301307SMatthew Wilcox 	if (sd_try_rc16_first(sdp)) {
14350da205e0SMatthew Wilcox 		sector_size = read_capacity_16(sdkp, sdp, buffer);
14360da205e0SMatthew Wilcox 		if (sector_size == -EOVERFLOW)
14370da205e0SMatthew Wilcox 			goto got_data;
14382b301307SMatthew Wilcox 		if (sector_size == -ENODEV)
14392b301307SMatthew Wilcox 			return;
14402b301307SMatthew Wilcox 		if (sector_size < 0)
14412b301307SMatthew Wilcox 			sector_size = read_capacity_10(sdkp, sdp, buffer);
14420da205e0SMatthew Wilcox 		if (sector_size < 0)
14430da205e0SMatthew Wilcox 			return;
14440da205e0SMatthew Wilcox 	} else {
14450da205e0SMatthew Wilcox 		sector_size = read_capacity_10(sdkp, sdp, buffer);
14460da205e0SMatthew Wilcox 		if (sector_size == -EOVERFLOW)
14470da205e0SMatthew Wilcox 			goto got_data;
14480da205e0SMatthew Wilcox 		if (sector_size < 0)
14490da205e0SMatthew Wilcox 			return;
14500da205e0SMatthew Wilcox 		if ((sizeof(sdkp->capacity) > 4) &&
14510da205e0SMatthew Wilcox 		    (sdkp->capacity > 0xffffffffULL)) {
14520da205e0SMatthew Wilcox 			int old_sector_size = sector_size;
14530da205e0SMatthew Wilcox 			sd_printk(KERN_NOTICE, sdkp, "Very big device. "
14540da205e0SMatthew Wilcox 					"Trying to use READ CAPACITY(16).\n");
14550da205e0SMatthew Wilcox 			sector_size = read_capacity_16(sdkp, sdp, buffer);
14560da205e0SMatthew Wilcox 			if (sector_size < 0) {
14570da205e0SMatthew Wilcox 				sd_printk(KERN_NOTICE, sdkp,
14580da205e0SMatthew Wilcox 					"Using 0xffffffff as device size\n");
14590da205e0SMatthew Wilcox 				sdkp->capacity = 1 + (sector_t) 0xffffffff;
14600da205e0SMatthew Wilcox 				sector_size = old_sector_size;
14610da205e0SMatthew Wilcox 				goto got_data;
14620da205e0SMatthew Wilcox 			}
14630da205e0SMatthew Wilcox 		}
14641da177e4SLinus Torvalds 	}
14651da177e4SLinus Torvalds 
14665c211caaSAlan Stern 	/* Some devices are known to return the total number of blocks,
14675c211caaSAlan Stern 	 * not the highest block number.  Some devices have versions
14685c211caaSAlan Stern 	 * which do this and others which do not.  Some devices we might
14695c211caaSAlan Stern 	 * suspect of doing this but we don't know for certain.
14705c211caaSAlan Stern 	 *
14715c211caaSAlan Stern 	 * If we know the reported capacity is wrong, decrement it.  If
14725c211caaSAlan Stern 	 * we can only guess, then assume the number of blocks is even
14735c211caaSAlan Stern 	 * (usually true but not always) and err on the side of lowering
14745c211caaSAlan Stern 	 * the capacity.
14755c211caaSAlan Stern 	 */
14765c211caaSAlan Stern 	if (sdp->fix_capacity ||
14775c211caaSAlan Stern 	    (sdp->guess_capacity && (sdkp->capacity & 0x01))) {
14785c211caaSAlan Stern 		sd_printk(KERN_INFO, sdkp, "Adjusting the sector count "
14795c211caaSAlan Stern 				"from its reported value: %llu\n",
14805c211caaSAlan Stern 				(unsigned long long) sdkp->capacity);
148161bf54b7SOliver Neukum 		--sdkp->capacity;
148261bf54b7SOliver Neukum 	}
148361bf54b7SOliver Neukum 
14841da177e4SLinus Torvalds got_data:
14851da177e4SLinus Torvalds 	if (sector_size == 0) {
14861da177e4SLinus Torvalds 		sector_size = 512;
1487e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "Sector size 0 reported, "
1488e73aec82SMartin K. Petersen 			  "assuming 512.\n");
14891da177e4SLinus Torvalds 	}
14901da177e4SLinus Torvalds 
14911da177e4SLinus Torvalds 	if (sector_size != 512 &&
14921da177e4SLinus Torvalds 	    sector_size != 1024 &&
14931da177e4SLinus Torvalds 	    sector_size != 2048 &&
14941da177e4SLinus Torvalds 	    sector_size != 4096 &&
14951da177e4SLinus Torvalds 	    sector_size != 256) {
1496e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "Unsupported sector size %d.\n",
1497e73aec82SMartin K. Petersen 			  sector_size);
14981da177e4SLinus Torvalds 		/*
14991da177e4SLinus Torvalds 		 * The user might want to re-format the drive with
15001da177e4SLinus Torvalds 		 * a supported sectorsize.  Once this happens, it
15011da177e4SLinus Torvalds 		 * would be relatively trivial to set the thing up.
15021da177e4SLinus Torvalds 		 * For this reason, we leave the thing in the table.
15031da177e4SLinus Torvalds 		 */
15041da177e4SLinus Torvalds 		sdkp->capacity = 0;
15051da177e4SLinus Torvalds 		/*
15061da177e4SLinus Torvalds 		 * set a bogus sector size so the normal read/write
15071da177e4SLinus Torvalds 		 * logic in the block layer will eventually refuse any
15081da177e4SLinus Torvalds 		 * request on this device without tripping over power
15091da177e4SLinus Torvalds 		 * of two sector size assumptions
15101da177e4SLinus Torvalds 		 */
15111da177e4SLinus Torvalds 		sector_size = 512;
15121da177e4SLinus Torvalds 	}
15137404ad3bSJames Bottomley 	blk_queue_hardsect_size(sdp->request_queue, sector_size);
15141da177e4SLinus Torvalds 
15157404ad3bSJames Bottomley 	{
15167404ad3bSJames Bottomley 		char cap_str_2[10], cap_str_10[10];
1517520a2c27SH. Peter Anvin 		u64 sz = (u64)sdkp->capacity << ilog2(sector_size);
15187404ad3bSJames Bottomley 
15197404ad3bSJames Bottomley 		string_get_size(sz, STRING_UNITS_2, cap_str_2,
15207404ad3bSJames Bottomley 				sizeof(cap_str_2));
15217404ad3bSJames Bottomley 		string_get_size(sz, STRING_UNITS_10, cap_str_10,
15227404ad3bSJames Bottomley 				sizeof(cap_str_10));
15231da177e4SLinus Torvalds 
152470a9b873SMartin K. Petersen 		if (sdkp->first_scan || old_capacity != sdkp->capacity)
1525e73aec82SMartin K. Petersen 			sd_printk(KERN_NOTICE, sdkp,
15267404ad3bSJames Bottomley 				  "%llu %d-byte hardware sectors: (%s/%s)\n",
1527e73aec82SMartin K. Petersen 				  (unsigned long long)sdkp->capacity,
15287404ad3bSJames Bottomley 				  sector_size, cap_str_10, cap_str_2);
15291da177e4SLinus Torvalds 	}
15301da177e4SLinus Torvalds 
15311da177e4SLinus Torvalds 	/* Rescale capacity to 512-byte units */
15321da177e4SLinus Torvalds 	if (sector_size == 4096)
15331da177e4SLinus Torvalds 		sdkp->capacity <<= 3;
15341da177e4SLinus Torvalds 	else if (sector_size == 2048)
15351da177e4SLinus Torvalds 		sdkp->capacity <<= 2;
15361da177e4SLinus Torvalds 	else if (sector_size == 1024)
15371da177e4SLinus Torvalds 		sdkp->capacity <<= 1;
15381da177e4SLinus Torvalds 	else if (sector_size == 256)
15391da177e4SLinus Torvalds 		sdkp->capacity >>= 1;
15401da177e4SLinus Torvalds 
15411da177e4SLinus Torvalds 	sdkp->device->sector_size = sector_size;
15421da177e4SLinus Torvalds }
15431da177e4SLinus Torvalds 
15441da177e4SLinus Torvalds /* called with buffer of length 512 */
15451da177e4SLinus Torvalds static inline int
1546ea73a9f2SJames Bottomley sd_do_mode_sense(struct scsi_device *sdp, int dbd, int modepage,
1547ea73a9f2SJames Bottomley 		 unsigned char *buffer, int len, struct scsi_mode_data *data,
1548ea73a9f2SJames Bottomley 		 struct scsi_sense_hdr *sshdr)
15491da177e4SLinus Torvalds {
1550ea73a9f2SJames Bottomley 	return scsi_mode_sense(sdp, dbd, modepage, buffer, len,
15511cf72699SJames Bottomley 			       SD_TIMEOUT, SD_MAX_RETRIES, data,
1552ea73a9f2SJames Bottomley 			       sshdr);
15531da177e4SLinus Torvalds }
15541da177e4SLinus Torvalds 
15551da177e4SLinus Torvalds /*
15561da177e4SLinus Torvalds  * read write protect setting, if possible - called only in sd_revalidate_disk()
155748970800SAl Viro  * called with buffer of length SD_BUF_SIZE
15581da177e4SLinus Torvalds  */
15591da177e4SLinus Torvalds static void
1560e73aec82SMartin K. Petersen sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
1561ea73a9f2SJames Bottomley {
15621da177e4SLinus Torvalds 	int res;
1563ea73a9f2SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
15641da177e4SLinus Torvalds 	struct scsi_mode_data data;
156570a9b873SMartin K. Petersen 	int old_wp = sdkp->write_prot;
15661da177e4SLinus Torvalds 
15671da177e4SLinus Torvalds 	set_disk_ro(sdkp->disk, 0);
1568ea73a9f2SJames Bottomley 	if (sdp->skip_ms_page_3f) {
1569e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "Assuming Write Enabled\n");
15701da177e4SLinus Torvalds 		return;
15711da177e4SLinus Torvalds 	}
15721da177e4SLinus Torvalds 
1573ea73a9f2SJames Bottomley 	if (sdp->use_192_bytes_for_3f) {
1574ea73a9f2SJames Bottomley 		res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 192, &data, NULL);
15751da177e4SLinus Torvalds 	} else {
15761da177e4SLinus Torvalds 		/*
15771da177e4SLinus Torvalds 		 * First attempt: ask for all pages (0x3F), but only 4 bytes.
15781da177e4SLinus Torvalds 		 * We have to start carefully: some devices hang if we ask
15791da177e4SLinus Torvalds 		 * for more than is available.
15801da177e4SLinus Torvalds 		 */
1581ea73a9f2SJames Bottomley 		res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 4, &data, NULL);
15821da177e4SLinus Torvalds 
15831da177e4SLinus Torvalds 		/*
15841da177e4SLinus Torvalds 		 * Second attempt: ask for page 0 When only page 0 is
15851da177e4SLinus Torvalds 		 * implemented, a request for page 3F may return Sense Key
15861da177e4SLinus Torvalds 		 * 5: Illegal Request, Sense Code 24: Invalid field in
15871da177e4SLinus Torvalds 		 * CDB.
15881da177e4SLinus Torvalds 		 */
15891da177e4SLinus Torvalds 		if (!scsi_status_is_good(res))
1590ea73a9f2SJames Bottomley 			res = sd_do_mode_sense(sdp, 0, 0, buffer, 4, &data, NULL);
15911da177e4SLinus Torvalds 
15921da177e4SLinus Torvalds 		/*
15931da177e4SLinus Torvalds 		 * Third attempt: ask 255 bytes, as we did earlier.
15941da177e4SLinus Torvalds 		 */
15951da177e4SLinus Torvalds 		if (!scsi_status_is_good(res))
1596ea73a9f2SJames Bottomley 			res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 255,
1597ea73a9f2SJames Bottomley 					       &data, NULL);
15981da177e4SLinus Torvalds 	}
15991da177e4SLinus Torvalds 
16001da177e4SLinus Torvalds 	if (!scsi_status_is_good(res)) {
1601e73aec82SMartin K. Petersen 		sd_printk(KERN_WARNING, sdkp,
1602e73aec82SMartin K. Petersen 			  "Test WP failed, assume Write Enabled\n");
16031da177e4SLinus Torvalds 	} else {
16041da177e4SLinus Torvalds 		sdkp->write_prot = ((data.device_specific & 0x80) != 0);
16051da177e4SLinus Torvalds 		set_disk_ro(sdkp->disk, sdkp->write_prot);
160670a9b873SMartin K. Petersen 		if (sdkp->first_scan || old_wp != sdkp->write_prot) {
1607e73aec82SMartin K. Petersen 			sd_printk(KERN_NOTICE, sdkp, "Write Protect is %s\n",
16081da177e4SLinus Torvalds 				  sdkp->write_prot ? "on" : "off");
1609e73aec82SMartin K. Petersen 			sd_printk(KERN_DEBUG, sdkp,
1610e73aec82SMartin K. Petersen 				  "Mode Sense: %02x %02x %02x %02x\n",
1611e73aec82SMartin K. Petersen 				  buffer[0], buffer[1], buffer[2], buffer[3]);
16121da177e4SLinus Torvalds 		}
16131da177e4SLinus Torvalds 	}
161470a9b873SMartin K. Petersen }
16151da177e4SLinus Torvalds 
16161da177e4SLinus Torvalds /*
16171da177e4SLinus Torvalds  * sd_read_cache_type - called only from sd_revalidate_disk()
161848970800SAl Viro  * called with buffer of length SD_BUF_SIZE
16191da177e4SLinus Torvalds  */
16201da177e4SLinus Torvalds static void
1621e73aec82SMartin K. Petersen sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
1622631e8a13SAl Viro  {
16231da177e4SLinus Torvalds 	int len = 0, res;
1624ea73a9f2SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
16251da177e4SLinus Torvalds 
1626631e8a13SAl Viro  	int dbd;
1627631e8a13SAl Viro  	int modepage;
16281da177e4SLinus Torvalds 	struct scsi_mode_data data;
16291da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
163070a9b873SMartin K. Petersen 	int old_wce = sdkp->WCE;
163170a9b873SMartin K. Petersen 	int old_rcd = sdkp->RCD;
163270a9b873SMartin K. Petersen 	int old_dpofua = sdkp->DPOFUA;
16331da177e4SLinus Torvalds 
1634ea73a9f2SJames Bottomley 	if (sdp->skip_ms_page_8)
16351da177e4SLinus Torvalds 		goto defaults;
16361da177e4SLinus Torvalds 
1637ea73a9f2SJames Bottomley 	if (sdp->type == TYPE_RBC) {
1638631e8a13SAl Viro  		modepage = 6;
1639631e8a13SAl Viro  		dbd = 8;
1640631e8a13SAl Viro  	} else {
1641631e8a13SAl Viro  		modepage = 8;
1642631e8a13SAl Viro  		dbd = 0;
1643631e8a13SAl Viro  	}
1644631e8a13SAl Viro  
16451da177e4SLinus Torvalds 	/* cautiously ask */
1646ea73a9f2SJames Bottomley 	res = sd_do_mode_sense(sdp, dbd, modepage, buffer, 4, &data, &sshdr);
16471da177e4SLinus Torvalds 
16481da177e4SLinus Torvalds 	if (!scsi_status_is_good(res))
16491da177e4SLinus Torvalds 		goto bad_sense;
16501da177e4SLinus Torvalds 
16516d73c851SAl Viro 	if (!data.header_length) {
16526d73c851SAl Viro 		modepage = 6;
1653e73aec82SMartin K. Petersen 		sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n");
16546d73c851SAl Viro 	}
16556d73c851SAl Viro 
16561da177e4SLinus Torvalds 	/* that went OK, now ask for the proper length */
16571da177e4SLinus Torvalds 	len = data.length;
16581da177e4SLinus Torvalds 
16591da177e4SLinus Torvalds 	/*
16601da177e4SLinus Torvalds 	 * We're only interested in the first three bytes, actually.
16611da177e4SLinus Torvalds 	 * But the data cache page is defined for the first 20.
16621da177e4SLinus Torvalds 	 */
16631da177e4SLinus Torvalds 	if (len < 3)
16641da177e4SLinus Torvalds 		goto bad_sense;
16651da177e4SLinus Torvalds 	if (len > 20)
16661da177e4SLinus Torvalds 		len = 20;
16671da177e4SLinus Torvalds 
16681da177e4SLinus Torvalds 	/* Take headers and block descriptors into account */
16691da177e4SLinus Torvalds 	len += data.header_length + data.block_descriptor_length;
167048970800SAl Viro 	if (len > SD_BUF_SIZE)
167148970800SAl Viro 		goto bad_sense;
16721da177e4SLinus Torvalds 
16731da177e4SLinus Torvalds 	/* Get the data */
1674ea73a9f2SJames Bottomley 	res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr);
16751da177e4SLinus Torvalds 
16761da177e4SLinus Torvalds 	if (scsi_status_is_good(res)) {
1677631e8a13SAl Viro  		int offset = data.header_length + data.block_descriptor_length;
16781da177e4SLinus Torvalds 
167948970800SAl Viro 		if (offset >= SD_BUF_SIZE - 2) {
1680e73aec82SMartin K. Petersen 			sd_printk(KERN_ERR, sdkp, "Malformed MODE SENSE response\n");
168148970800SAl Viro 			goto defaults;
168248970800SAl Viro 		}
168348970800SAl Viro 
1684631e8a13SAl Viro  		if ((buffer[offset] & 0x3f) != modepage) {
1685e73aec82SMartin K. Petersen 			sd_printk(KERN_ERR, sdkp, "Got wrong page\n");
1686631e8a13SAl Viro  			goto defaults;
1687631e8a13SAl Viro  		}
1688631e8a13SAl Viro  
1689631e8a13SAl Viro  		if (modepage == 8) {
1690631e8a13SAl Viro  			sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
1691631e8a13SAl Viro  			sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0);
1692631e8a13SAl Viro  		} else {
1693631e8a13SAl Viro  			sdkp->WCE = ((buffer[offset + 2] & 0x01) == 0);
1694631e8a13SAl Viro  			sdkp->RCD = 0;
1695631e8a13SAl Viro  		}
16961da177e4SLinus Torvalds 
1697007365adSTejun Heo 		sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
1698007365adSTejun Heo 		if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
1699e73aec82SMartin K. Petersen 			sd_printk(KERN_NOTICE, sdkp,
1700e73aec82SMartin K. Petersen 				  "Uses READ/WRITE(6), disabling FUA\n");
1701007365adSTejun Heo 			sdkp->DPOFUA = 0;
1702007365adSTejun Heo 		}
1703007365adSTejun Heo 
170470a9b873SMartin K. Petersen 		if (sdkp->first_scan || old_wce != sdkp->WCE ||
170570a9b873SMartin K. Petersen 		    old_rcd != sdkp->RCD || old_dpofua != sdkp->DPOFUA)
1706e73aec82SMartin K. Petersen 			sd_printk(KERN_NOTICE, sdkp,
1707e73aec82SMartin K. Petersen 				  "Write cache: %s, read cache: %s, %s\n",
1708fd44bab5SLuben Tuikov 				  sdkp->WCE ? "enabled" : "disabled",
1709fd44bab5SLuben Tuikov 				  sdkp->RCD ? "disabled" : "enabled",
1710fd44bab5SLuben Tuikov 				  sdkp->DPOFUA ? "supports DPO and FUA"
1711fd44bab5SLuben Tuikov 				  : "doesn't support DPO or FUA");
17121da177e4SLinus Torvalds 
17131da177e4SLinus Torvalds 		return;
17141da177e4SLinus Torvalds 	}
17151da177e4SLinus Torvalds 
17161da177e4SLinus Torvalds bad_sense:
1717ea73a9f2SJames Bottomley 	if (scsi_sense_valid(&sshdr) &&
17181da177e4SLinus Torvalds 	    sshdr.sense_key == ILLEGAL_REQUEST &&
17191da177e4SLinus Torvalds 	    sshdr.asc == 0x24 && sshdr.ascq == 0x0)
1720e73aec82SMartin K. Petersen 		/* Invalid field in CDB */
1721e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
17221da177e4SLinus Torvalds 	else
1723e73aec82SMartin K. Petersen 		sd_printk(KERN_ERR, sdkp, "Asking for cache data failed\n");
17241da177e4SLinus Torvalds 
17251da177e4SLinus Torvalds defaults:
1726e73aec82SMartin K. Petersen 	sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
17271da177e4SLinus Torvalds 	sdkp->WCE = 0;
17281da177e4SLinus Torvalds 	sdkp->RCD = 0;
172948970800SAl Viro 	sdkp->DPOFUA = 0;
17301da177e4SLinus Torvalds }
17311da177e4SLinus Torvalds 
1732e0597d70SMartin K. Petersen /*
1733e0597d70SMartin K. Petersen  * The ATO bit indicates whether the DIF application tag is available
1734e0597d70SMartin K. Petersen  * for use by the operating system.
1735e0597d70SMartin K. Petersen  */
1736e0597d70SMartin K. Petersen void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
1737e0597d70SMartin K. Petersen {
1738e0597d70SMartin K. Petersen 	int res, offset;
1739e0597d70SMartin K. Petersen 	struct scsi_device *sdp = sdkp->device;
1740e0597d70SMartin K. Petersen 	struct scsi_mode_data data;
1741e0597d70SMartin K. Petersen 	struct scsi_sense_hdr sshdr;
1742e0597d70SMartin K. Petersen 
1743e0597d70SMartin K. Petersen 	if (sdp->type != TYPE_DISK)
1744e0597d70SMartin K. Petersen 		return;
1745e0597d70SMartin K. Petersen 
1746e0597d70SMartin K. Petersen 	if (sdkp->protection_type == 0)
1747e0597d70SMartin K. Petersen 		return;
1748e0597d70SMartin K. Petersen 
1749e0597d70SMartin K. Petersen 	res = scsi_mode_sense(sdp, 1, 0x0a, buffer, 36, SD_TIMEOUT,
1750e0597d70SMartin K. Petersen 			      SD_MAX_RETRIES, &data, &sshdr);
1751e0597d70SMartin K. Petersen 
1752e0597d70SMartin K. Petersen 	if (!scsi_status_is_good(res) || !data.header_length ||
1753e0597d70SMartin K. Petersen 	    data.length < 6) {
1754e0597d70SMartin K. Petersen 		sd_printk(KERN_WARNING, sdkp,
1755e0597d70SMartin K. Petersen 			  "getting Control mode page failed, assume no ATO\n");
1756e0597d70SMartin K. Petersen 
1757e0597d70SMartin K. Petersen 		if (scsi_sense_valid(&sshdr))
1758e0597d70SMartin K. Petersen 			sd_print_sense_hdr(sdkp, &sshdr);
1759e0597d70SMartin K. Petersen 
1760e0597d70SMartin K. Petersen 		return;
1761e0597d70SMartin K. Petersen 	}
1762e0597d70SMartin K. Petersen 
1763e0597d70SMartin K. Petersen 	offset = data.header_length + data.block_descriptor_length;
1764e0597d70SMartin K. Petersen 
1765e0597d70SMartin K. Petersen 	if ((buffer[offset] & 0x3f) != 0x0a) {
1766e0597d70SMartin K. Petersen 		sd_printk(KERN_ERR, sdkp, "ATO Got wrong page\n");
1767e0597d70SMartin K. Petersen 		return;
1768e0597d70SMartin K. Petersen 	}
1769e0597d70SMartin K. Petersen 
1770e0597d70SMartin K. Petersen 	if ((buffer[offset + 5] & 0x80) == 0)
1771e0597d70SMartin K. Petersen 		return;
1772e0597d70SMartin K. Petersen 
1773e0597d70SMartin K. Petersen 	sdkp->ATO = 1;
1774e0597d70SMartin K. Petersen 
1775e0597d70SMartin K. Petersen 	return;
1776e0597d70SMartin K. Petersen }
1777e0597d70SMartin K. Petersen 
17781da177e4SLinus Torvalds /**
17791da177e4SLinus Torvalds  *	sd_revalidate_disk - called the first time a new disk is seen,
17801da177e4SLinus Torvalds  *	performs disk spin up, read_capacity, etc.
17811da177e4SLinus Torvalds  *	@disk: struct gendisk we care about
17821da177e4SLinus Torvalds  **/
17831da177e4SLinus Torvalds static int sd_revalidate_disk(struct gendisk *disk)
17841da177e4SLinus Torvalds {
17851da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
17861da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
17871da177e4SLinus Torvalds 	unsigned char *buffer;
1788461d4e90STejun Heo 	unsigned ordered;
17891da177e4SLinus Torvalds 
1790fa0d34beSMartin K. Petersen 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
1791fa0d34beSMartin K. Petersen 				      "sd_revalidate_disk\n"));
17921da177e4SLinus Torvalds 
17931da177e4SLinus Torvalds 	/*
17941da177e4SLinus Torvalds 	 * If the device is offline, don't try and read capacity or any
17951da177e4SLinus Torvalds 	 * of the other niceties.
17961da177e4SLinus Torvalds 	 */
17971da177e4SLinus Torvalds 	if (!scsi_device_online(sdp))
17981da177e4SLinus Torvalds 		goto out;
17991da177e4SLinus Torvalds 
1800a6123f14SBernhard Walle 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
18011da177e4SLinus Torvalds 	if (!buffer) {
1802e73aec82SMartin K. Petersen 		sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "
1803e73aec82SMartin K. Petersen 			  "allocation failure.\n");
1804ea73a9f2SJames Bottomley 		goto out;
18051da177e4SLinus Torvalds 	}
18061da177e4SLinus Torvalds 
1807e73aec82SMartin K. Petersen 	sd_spinup_disk(sdkp);
18081da177e4SLinus Torvalds 
18091da177e4SLinus Torvalds 	/*
18101da177e4SLinus Torvalds 	 * Without media there is no reason to ask; moreover, some devices
18111da177e4SLinus Torvalds 	 * react badly if we do.
18121da177e4SLinus Torvalds 	 */
18131da177e4SLinus Torvalds 	if (sdkp->media_present) {
1814e73aec82SMartin K. Petersen 		sd_read_capacity(sdkp, buffer);
1815e73aec82SMartin K. Petersen 		sd_read_write_protect_flag(sdkp, buffer);
1816e73aec82SMartin K. Petersen 		sd_read_cache_type(sdkp, buffer);
1817e0597d70SMartin K. Petersen 		sd_read_app_tag_own(sdkp, buffer);
18181da177e4SLinus Torvalds 	}
18191da177e4SLinus Torvalds 
182070a9b873SMartin K. Petersen 	sdkp->first_scan = 0;
182170a9b873SMartin K. Petersen 
1822461d4e90STejun Heo 	/*
1823461d4e90STejun Heo 	 * We now have all cache related info, determine how we deal
1824461d4e90STejun Heo 	 * with ordered requests.  Note that as the current SCSI
1825461d4e90STejun Heo 	 * dispatch function can alter request order, we cannot use
1826461d4e90STejun Heo 	 * QUEUE_ORDERED_TAG_* even when ordered tag is supported.
1827461d4e90STejun Heo 	 */
1828461d4e90STejun Heo 	if (sdkp->WCE)
1829007365adSTejun Heo 		ordered = sdkp->DPOFUA
1830007365adSTejun Heo 			? QUEUE_ORDERED_DRAIN_FUA : QUEUE_ORDERED_DRAIN_FLUSH;
1831461d4e90STejun Heo 	else
1832461d4e90STejun Heo 		ordered = QUEUE_ORDERED_DRAIN;
1833461d4e90STejun Heo 
1834461d4e90STejun Heo 	blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush);
1835461d4e90STejun Heo 
18361da177e4SLinus Torvalds 	set_capacity(disk, sdkp->capacity);
18371da177e4SLinus Torvalds 	kfree(buffer);
18381da177e4SLinus Torvalds 
18391da177e4SLinus Torvalds  out:
18401da177e4SLinus Torvalds 	return 0;
18411da177e4SLinus Torvalds }
18421da177e4SLinus Torvalds 
18431da177e4SLinus Torvalds /**
18443e1a7ff8STejun Heo  *	sd_format_disk_name - format disk name
18453e1a7ff8STejun Heo  *	@prefix: name prefix - ie. "sd" for SCSI disks
18463e1a7ff8STejun Heo  *	@index: index of the disk to format name for
18473e1a7ff8STejun Heo  *	@buf: output buffer
18483e1a7ff8STejun Heo  *	@buflen: length of the output buffer
18493e1a7ff8STejun Heo  *
18503e1a7ff8STejun Heo  *	SCSI disk names starts at sda.  The 26th device is sdz and the
18513e1a7ff8STejun Heo  *	27th is sdaa.  The last one for two lettered suffix is sdzz
18523e1a7ff8STejun Heo  *	which is followed by sdaaa.
18533e1a7ff8STejun Heo  *
18543e1a7ff8STejun Heo  *	This is basically 26 base counting with one extra 'nil' entry
18553e1a7ff8STejun Heo  *	at the beggining from the second digit on and can be
18563e1a7ff8STejun Heo  *	determined using similar method as 26 base conversion with the
18573e1a7ff8STejun Heo  *	index shifted -1 after each digit is computed.
18583e1a7ff8STejun Heo  *
18593e1a7ff8STejun Heo  *	CONTEXT:
18603e1a7ff8STejun Heo  *	Don't care.
18613e1a7ff8STejun Heo  *
18623e1a7ff8STejun Heo  *	RETURNS:
18633e1a7ff8STejun Heo  *	0 on success, -errno on failure.
18643e1a7ff8STejun Heo  */
18653e1a7ff8STejun Heo static int sd_format_disk_name(char *prefix, int index, char *buf, int buflen)
18663e1a7ff8STejun Heo {
18673e1a7ff8STejun Heo 	const int base = 'z' - 'a' + 1;
18683e1a7ff8STejun Heo 	char *begin = buf + strlen(prefix);
18693e1a7ff8STejun Heo 	char *end = buf + buflen;
18703e1a7ff8STejun Heo 	char *p;
18713e1a7ff8STejun Heo 	int unit;
18723e1a7ff8STejun Heo 
18733e1a7ff8STejun Heo 	p = end - 1;
18743e1a7ff8STejun Heo 	*p = '\0';
18753e1a7ff8STejun Heo 	unit = base;
18763e1a7ff8STejun Heo 	do {
18773e1a7ff8STejun Heo 		if (p == begin)
18783e1a7ff8STejun Heo 			return -EINVAL;
18793e1a7ff8STejun Heo 		*--p = 'a' + (index % unit);
18803e1a7ff8STejun Heo 		index = (index / unit) - 1;
18813e1a7ff8STejun Heo 	} while (index >= 0);
18823e1a7ff8STejun Heo 
18833e1a7ff8STejun Heo 	memmove(begin, p, end - p);
18843e1a7ff8STejun Heo 	memcpy(buf, prefix, strlen(prefix));
18853e1a7ff8STejun Heo 
18863e1a7ff8STejun Heo 	return 0;
18873e1a7ff8STejun Heo }
18883e1a7ff8STejun Heo 
18894ace92fcSArjan van de Ven /*
18904ace92fcSArjan van de Ven  * The asynchronous part of sd_probe
18914ace92fcSArjan van de Ven  */
18924ace92fcSArjan van de Ven static void sd_probe_async(void *data, async_cookie_t cookie)
18934ace92fcSArjan van de Ven {
18944ace92fcSArjan van de Ven 	struct scsi_disk *sdkp = data;
18954ace92fcSArjan van de Ven 	struct scsi_device *sdp;
18964ace92fcSArjan van de Ven 	struct gendisk *gd;
18974ace92fcSArjan van de Ven 	u32 index;
18984ace92fcSArjan van de Ven 	struct device *dev;
18994ace92fcSArjan van de Ven 
19004ace92fcSArjan van de Ven 	sdp = sdkp->device;
19014ace92fcSArjan van de Ven 	gd = sdkp->disk;
19024ace92fcSArjan van de Ven 	index = sdkp->index;
19034ace92fcSArjan van de Ven 	dev = &sdp->sdev_gendev;
19044ace92fcSArjan van de Ven 
19054ace92fcSArjan van de Ven 	if (!sdp->request_queue->rq_timeout) {
19064ace92fcSArjan van de Ven 		if (sdp->type != TYPE_MOD)
19074ace92fcSArjan van de Ven 			blk_queue_rq_timeout(sdp->request_queue, SD_TIMEOUT);
19084ace92fcSArjan van de Ven 		else
19094ace92fcSArjan van de Ven 			blk_queue_rq_timeout(sdp->request_queue,
19104ace92fcSArjan van de Ven 					     SD_MOD_TIMEOUT);
19114ace92fcSArjan van de Ven 	}
19124ace92fcSArjan van de Ven 
19134ace92fcSArjan van de Ven 	device_initialize(&sdkp->dev);
19144ace92fcSArjan van de Ven 	sdkp->dev.parent = &sdp->sdev_gendev;
19154ace92fcSArjan van de Ven 	sdkp->dev.class = &sd_disk_class;
1916cd764695SLinus Torvalds 	dev_set_name(&sdkp->dev, dev_name(&sdp->sdev_gendev));
19174ace92fcSArjan van de Ven 
19184ace92fcSArjan van de Ven 	if (device_add(&sdkp->dev))
19194ace92fcSArjan van de Ven 		goto out_free_index;
19204ace92fcSArjan van de Ven 
19214ace92fcSArjan van de Ven 	get_device(&sdp->sdev_gendev);
19224ace92fcSArjan van de Ven 
19234ace92fcSArjan van de Ven 	if (index < SD_MAX_DISKS) {
19244ace92fcSArjan van de Ven 		gd->major = sd_major((index & 0xf0) >> 4);
19254ace92fcSArjan van de Ven 		gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00);
19264ace92fcSArjan van de Ven 		gd->minors = SD_MINORS;
19274ace92fcSArjan van de Ven 	}
19284ace92fcSArjan van de Ven 	gd->fops = &sd_fops;
19294ace92fcSArjan van de Ven 	gd->private_data = &sdkp->driver;
19304ace92fcSArjan van de Ven 	gd->queue = sdkp->device->request_queue;
19314ace92fcSArjan van de Ven 
193270a9b873SMartin K. Petersen 	/* defaults, until the device tells us otherwise */
193370a9b873SMartin K. Petersen 	sdp->sector_size = 512;
193470a9b873SMartin K. Petersen 	sdkp->capacity = 0;
193570a9b873SMartin K. Petersen 	sdkp->media_present = 1;
193670a9b873SMartin K. Petersen 	sdkp->write_prot = 0;
193770a9b873SMartin K. Petersen 	sdkp->WCE = 0;
193870a9b873SMartin K. Petersen 	sdkp->RCD = 0;
193970a9b873SMartin K. Petersen 	sdkp->ATO = 0;
194070a9b873SMartin K. Petersen 	sdkp->first_scan = 1;
194170a9b873SMartin K. Petersen 
19424ace92fcSArjan van de Ven 	sd_revalidate_disk(gd);
19434ace92fcSArjan van de Ven 
19444ace92fcSArjan van de Ven 	blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
19454ace92fcSArjan van de Ven 
19464ace92fcSArjan van de Ven 	gd->driverfs_dev = &sdp->sdev_gendev;
19474ace92fcSArjan van de Ven 	gd->flags = GENHD_FL_EXT_DEVT | GENHD_FL_DRIVERFS;
19484ace92fcSArjan van de Ven 	if (sdp->removable)
19494ace92fcSArjan van de Ven 		gd->flags |= GENHD_FL_REMOVABLE;
19504ace92fcSArjan van de Ven 
19514ace92fcSArjan van de Ven 	dev_set_drvdata(dev, sdkp);
19524ace92fcSArjan van de Ven 	add_disk(gd);
19534ace92fcSArjan van de Ven 	sd_dif_config_host(sdkp);
19544ace92fcSArjan van de Ven 
19554ace92fcSArjan van de Ven 	sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n",
19564ace92fcSArjan van de Ven 		  sdp->removable ? "removable " : "");
19574ace92fcSArjan van de Ven 
19584ace92fcSArjan van de Ven 	return;
19594ace92fcSArjan van de Ven 
19604ace92fcSArjan van de Ven  out_free_index:
19614ace92fcSArjan van de Ven 	ida_remove(&sd_index_ida, index);
19624ace92fcSArjan van de Ven }
19634ace92fcSArjan van de Ven 
19643e1a7ff8STejun Heo /**
19651da177e4SLinus Torvalds  *	sd_probe - called during driver initialization and whenever a
19661da177e4SLinus Torvalds  *	new scsi device is attached to the system. It is called once
19671da177e4SLinus Torvalds  *	for each scsi device (not just disks) present.
19681da177e4SLinus Torvalds  *	@dev: pointer to device object
19691da177e4SLinus Torvalds  *
19701da177e4SLinus Torvalds  *	Returns 0 if successful (or not interested in this scsi device
19711da177e4SLinus Torvalds  *	(e.g. scanner)); 1 when there is an error.
19721da177e4SLinus Torvalds  *
19731da177e4SLinus Torvalds  *	Note: this function is invoked from the scsi mid-level.
19741da177e4SLinus Torvalds  *	This function sets up the mapping between a given
19751da177e4SLinus Torvalds  *	<host,channel,id,lun> (found in sdp) and new device name
19761da177e4SLinus Torvalds  *	(e.g. /dev/sda). More precisely it is the block device major
19771da177e4SLinus Torvalds  *	and minor number that is chosen here.
19781da177e4SLinus Torvalds  *
19791da177e4SLinus Torvalds  *	Assume sd_attach is not re-entrant (for time being)
19801da177e4SLinus Torvalds  *	Also think about sd_attach() and sd_remove() running coincidentally.
19811da177e4SLinus Torvalds  **/
19821da177e4SLinus Torvalds static int sd_probe(struct device *dev)
19831da177e4SLinus Torvalds {
19841da177e4SLinus Torvalds 	struct scsi_device *sdp = to_scsi_device(dev);
19851da177e4SLinus Torvalds 	struct scsi_disk *sdkp;
19861da177e4SLinus Torvalds 	struct gendisk *gd;
19871da177e4SLinus Torvalds 	u32 index;
19881da177e4SLinus Torvalds 	int error;
19891da177e4SLinus Torvalds 
19901da177e4SLinus Torvalds 	error = -ENODEV;
1991631e8a13SAl Viro  	if (sdp->type != TYPE_DISK && sdp->type != TYPE_MOD && sdp->type != TYPE_RBC)
19921da177e4SLinus Torvalds 		goto out;
19931da177e4SLinus Torvalds 
19949ccfc756SJames Bottomley 	SCSI_LOG_HLQUEUE(3, sdev_printk(KERN_INFO, sdp,
19959ccfc756SJames Bottomley 					"sd_attach\n"));
19961da177e4SLinus Torvalds 
19971da177e4SLinus Torvalds 	error = -ENOMEM;
199824669f75SJes Sorensen 	sdkp = kzalloc(sizeof(*sdkp), GFP_KERNEL);
19991da177e4SLinus Torvalds 	if (!sdkp)
20001da177e4SLinus Torvalds 		goto out;
20011da177e4SLinus Torvalds 
2002689d6facSTejun Heo 	gd = alloc_disk(SD_MINORS);
20031da177e4SLinus Torvalds 	if (!gd)
20041da177e4SLinus Torvalds 		goto out_free;
20051da177e4SLinus Torvalds 
2006f27bac27STejun Heo 	do {
2007f27bac27STejun Heo 		if (!ida_pre_get(&sd_index_ida, GFP_KERNEL))
20081da177e4SLinus Torvalds 			goto out_put;
20091da177e4SLinus Torvalds 
20104034cc68STejun Heo 		spin_lock(&sd_index_lock);
2011f27bac27STejun Heo 		error = ida_get_new(&sd_index_ida, &index);
20124034cc68STejun Heo 		spin_unlock(&sd_index_lock);
2013f27bac27STejun Heo 	} while (error == -EAGAIN);
20141da177e4SLinus Torvalds 
20151da177e4SLinus Torvalds 	if (error)
20161da177e4SLinus Torvalds 		goto out_put;
20171da177e4SLinus Torvalds 
20183e1a7ff8STejun Heo 	error = sd_format_disk_name("sd", index, gd->disk_name, DISK_NAME_LEN);
20193e1a7ff8STejun Heo 	if (error)
2020f27bac27STejun Heo 		goto out_free_index;
2021f27bac27STejun Heo 
20221da177e4SLinus Torvalds 	sdkp->device = sdp;
20231da177e4SLinus Torvalds 	sdkp->driver = &sd_template;
20241da177e4SLinus Torvalds 	sdkp->disk = gd;
20251da177e4SLinus Torvalds 	sdkp->index = index;
20261da177e4SLinus Torvalds 	sdkp->openers = 0;
2027c02e6002SKay Sievers 	sdkp->previous_state = 1;
20281da177e4SLinus Torvalds 
20294ace92fcSArjan van de Ven 	async_schedule(sd_probe_async, sdkp);
20301da177e4SLinus Torvalds 
20311da177e4SLinus Torvalds 	return 0;
20321da177e4SLinus Torvalds 
2033f27bac27STejun Heo  out_free_index:
20344034cc68STejun Heo 	spin_lock(&sd_index_lock);
2035f27bac27STejun Heo 	ida_remove(&sd_index_ida, index);
20364034cc68STejun Heo 	spin_unlock(&sd_index_lock);
20371da177e4SLinus Torvalds  out_put:
20381da177e4SLinus Torvalds 	put_disk(gd);
20391da177e4SLinus Torvalds  out_free:
20401da177e4SLinus Torvalds 	kfree(sdkp);
20411da177e4SLinus Torvalds  out:
20421da177e4SLinus Torvalds 	return error;
20431da177e4SLinus Torvalds }
20441da177e4SLinus Torvalds 
20451da177e4SLinus Torvalds /**
20461da177e4SLinus Torvalds  *	sd_remove - called whenever a scsi disk (previously recognized by
20471da177e4SLinus Torvalds  *	sd_probe) is detached from the system. It is called (potentially
20481da177e4SLinus Torvalds  *	multiple times) during sd module unload.
20491da177e4SLinus Torvalds  *	@sdp: pointer to mid level scsi device object
20501da177e4SLinus Torvalds  *
20511da177e4SLinus Torvalds  *	Note: this function is invoked from the scsi mid-level.
20521da177e4SLinus Torvalds  *	This function potentially frees up a device name (e.g. /dev/sdc)
20531da177e4SLinus Torvalds  *	that could be re-used by a subsequent sd_probe().
20541da177e4SLinus Torvalds  *	This function is not called when the built-in sd driver is "exit-ed".
20551da177e4SLinus Torvalds  **/
20561da177e4SLinus Torvalds static int sd_remove(struct device *dev)
20571da177e4SLinus Torvalds {
20581da177e4SLinus Torvalds 	struct scsi_disk *sdkp = dev_get_drvdata(dev);
20591da177e4SLinus Torvalds 
2060ee959b00STony Jones 	device_del(&sdkp->dev);
20611da177e4SLinus Torvalds 	del_gendisk(sdkp->disk);
20621da177e4SLinus Torvalds 	sd_shutdown(dev);
206339b7f1e2SAlan Stern 
20640b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
206539b7f1e2SAlan Stern 	dev_set_drvdata(dev, NULL);
2066ee959b00STony Jones 	put_device(&sdkp->dev);
20670b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
20681da177e4SLinus Torvalds 
20691da177e4SLinus Torvalds 	return 0;
20701da177e4SLinus Torvalds }
20711da177e4SLinus Torvalds 
20721da177e4SLinus Torvalds /**
20731da177e4SLinus Torvalds  *	scsi_disk_release - Called to free the scsi_disk structure
2074ee959b00STony Jones  *	@dev: pointer to embedded class device
20751da177e4SLinus Torvalds  *
20760b950672SArjan van de Ven  *	sd_ref_mutex must be held entering this routine.  Because it is
20771da177e4SLinus Torvalds  *	called on last put, you should always use the scsi_disk_get()
20781da177e4SLinus Torvalds  *	scsi_disk_put() helpers which manipulate the semaphore directly
2079ee959b00STony Jones  *	and never do a direct put_device.
20801da177e4SLinus Torvalds  **/
2081ee959b00STony Jones static void scsi_disk_release(struct device *dev)
20821da177e4SLinus Torvalds {
2083ee959b00STony Jones 	struct scsi_disk *sdkp = to_scsi_disk(dev);
20841da177e4SLinus Torvalds 	struct gendisk *disk = sdkp->disk;
20851da177e4SLinus Torvalds 
20864034cc68STejun Heo 	spin_lock(&sd_index_lock);
2087f27bac27STejun Heo 	ida_remove(&sd_index_ida, sdkp->index);
20884034cc68STejun Heo 	spin_unlock(&sd_index_lock);
20891da177e4SLinus Torvalds 
20901da177e4SLinus Torvalds 	disk->private_data = NULL;
20911da177e4SLinus Torvalds 	put_disk(disk);
209239b7f1e2SAlan Stern 	put_device(&sdkp->device->sdev_gendev);
20931da177e4SLinus Torvalds 
20941da177e4SLinus Torvalds 	kfree(sdkp);
20951da177e4SLinus Torvalds }
20961da177e4SLinus Torvalds 
2097cc5d2c8cSJames Bottomley static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
2098c3c94c5aSTejun Heo {
2099c3c94c5aSTejun Heo 	unsigned char cmd[6] = { START_STOP };	/* START_VALID */
2100c3c94c5aSTejun Heo 	struct scsi_sense_hdr sshdr;
2101cc5d2c8cSJames Bottomley 	struct scsi_device *sdp = sdkp->device;
2102c3c94c5aSTejun Heo 	int res;
2103c3c94c5aSTejun Heo 
2104c3c94c5aSTejun Heo 	if (start)
2105c3c94c5aSTejun Heo 		cmd[4] |= 1;	/* START */
2106c3c94c5aSTejun Heo 
2107d2886ea3SStefan Richter 	if (sdp->start_stop_pwr_cond)
2108d2886ea3SStefan Richter 		cmd[4] |= start ? 1 << 4 : 3 << 4;	/* Active or Standby */
2109d2886ea3SStefan Richter 
2110c3c94c5aSTejun Heo 	if (!scsi_device_online(sdp))
2111c3c94c5aSTejun Heo 		return -ENODEV;
2112c3c94c5aSTejun Heo 
2113c3c94c5aSTejun Heo 	res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
2114f4f4e47eSFUJITA Tomonori 			       SD_TIMEOUT, SD_MAX_RETRIES, NULL);
2115c3c94c5aSTejun Heo 	if (res) {
2116cc5d2c8cSJames Bottomley 		sd_printk(KERN_WARNING, sdkp, "START_STOP FAILED\n");
2117cc5d2c8cSJames Bottomley 		sd_print_result(sdkp, res);
2118c3c94c5aSTejun Heo 		if (driver_byte(res) & DRIVER_SENSE)
2119cc5d2c8cSJames Bottomley 			sd_print_sense_hdr(sdkp, &sshdr);
2120c3c94c5aSTejun Heo 	}
2121c3c94c5aSTejun Heo 
2122c3c94c5aSTejun Heo 	return res;
2123c3c94c5aSTejun Heo }
2124c3c94c5aSTejun Heo 
21251da177e4SLinus Torvalds /*
21261da177e4SLinus Torvalds  * Send a SYNCHRONIZE CACHE instruction down to the device through
21271da177e4SLinus Torvalds  * the normal SCSI command structure.  Wait for the command to
21281da177e4SLinus Torvalds  * complete.
21291da177e4SLinus Torvalds  */
21301da177e4SLinus Torvalds static void sd_shutdown(struct device *dev)
21311da177e4SLinus Torvalds {
213239b7f1e2SAlan Stern 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
21331da177e4SLinus Torvalds 
21341da177e4SLinus Torvalds 	if (!sdkp)
21351da177e4SLinus Torvalds 		return;         /* this can happen */
21361da177e4SLinus Torvalds 
213739b7f1e2SAlan Stern 	if (sdkp->WCE) {
2138e73aec82SMartin K. Petersen 		sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n");
2139e73aec82SMartin K. Petersen 		sd_sync_cache(sdkp);
21401da177e4SLinus Torvalds 	}
2141c3c94c5aSTejun Heo 
2142cc5d2c8cSJames Bottomley 	if (system_state != SYSTEM_RESTART && sdkp->device->manage_start_stop) {
2143cc5d2c8cSJames Bottomley 		sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
2144cc5d2c8cSJames Bottomley 		sd_start_stop_device(sdkp, 0);
2145c3c94c5aSTejun Heo 	}
2146c3c94c5aSTejun Heo 
214739b7f1e2SAlan Stern 	scsi_disk_put(sdkp);
214839b7f1e2SAlan Stern }
21491da177e4SLinus Torvalds 
2150c3c94c5aSTejun Heo static int sd_suspend(struct device *dev, pm_message_t mesg)
2151c3c94c5aSTejun Heo {
2152c3c94c5aSTejun Heo 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
215309ff92feSAlan Stern 	int ret = 0;
2154c3c94c5aSTejun Heo 
2155c3c94c5aSTejun Heo 	if (!sdkp)
2156c3c94c5aSTejun Heo 		return 0;	/* this can happen */
2157c3c94c5aSTejun Heo 
2158c3c94c5aSTejun Heo 	if (sdkp->WCE) {
2159cc5d2c8cSJames Bottomley 		sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n");
2160c3c94c5aSTejun Heo 		ret = sd_sync_cache(sdkp);
2161c3c94c5aSTejun Heo 		if (ret)
216209ff92feSAlan Stern 			goto done;
2163c3c94c5aSTejun Heo 	}
2164c3c94c5aSTejun Heo 
21653a2d5b70SRafael J. Wysocki 	if ((mesg.event & PM_EVENT_SLEEP) && sdkp->device->manage_start_stop) {
2166cc5d2c8cSJames Bottomley 		sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
2167cc5d2c8cSJames Bottomley 		ret = sd_start_stop_device(sdkp, 0);
2168c3c94c5aSTejun Heo 	}
2169c3c94c5aSTejun Heo 
217009ff92feSAlan Stern done:
217109ff92feSAlan Stern 	scsi_disk_put(sdkp);
217209ff92feSAlan Stern 	return ret;
2173c3c94c5aSTejun Heo }
2174c3c94c5aSTejun Heo 
2175c3c94c5aSTejun Heo static int sd_resume(struct device *dev)
2176c3c94c5aSTejun Heo {
2177c3c94c5aSTejun Heo 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
217809ff92feSAlan Stern 	int ret = 0;
2179c3c94c5aSTejun Heo 
2180cc5d2c8cSJames Bottomley 	if (!sdkp->device->manage_start_stop)
218109ff92feSAlan Stern 		goto done;
2182c3c94c5aSTejun Heo 
2183cc5d2c8cSJames Bottomley 	sd_printk(KERN_NOTICE, sdkp, "Starting disk\n");
218409ff92feSAlan Stern 	ret = sd_start_stop_device(sdkp, 1);
2185c3c94c5aSTejun Heo 
218609ff92feSAlan Stern done:
218709ff92feSAlan Stern 	scsi_disk_put(sdkp);
218809ff92feSAlan Stern 	return ret;
2189c3c94c5aSTejun Heo }
2190c3c94c5aSTejun Heo 
21911da177e4SLinus Torvalds /**
21921da177e4SLinus Torvalds  *	init_sd - entry point for this driver (both when built in or when
21931da177e4SLinus Torvalds  *	a module).
21941da177e4SLinus Torvalds  *
21951da177e4SLinus Torvalds  *	Note: this function registers this driver with the scsi mid-level.
21961da177e4SLinus Torvalds  **/
21971da177e4SLinus Torvalds static int __init init_sd(void)
21981da177e4SLinus Torvalds {
21995e4009baSJeff Garzik 	int majors = 0, i, err;
22001da177e4SLinus Torvalds 
22011da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));
22021da177e4SLinus Torvalds 
22031da177e4SLinus Torvalds 	for (i = 0; i < SD_MAJORS; i++)
22041da177e4SLinus Torvalds 		if (register_blkdev(sd_major(i), "sd") == 0)
22051da177e4SLinus Torvalds 			majors++;
22061da177e4SLinus Torvalds 
22071da177e4SLinus Torvalds 	if (!majors)
22081da177e4SLinus Torvalds 		return -ENODEV;
22091da177e4SLinus Torvalds 
22105e4009baSJeff Garzik 	err = class_register(&sd_disk_class);
22115e4009baSJeff Garzik 	if (err)
22125e4009baSJeff Garzik 		goto err_out;
22136bdaa1f1SJames Bottomley 
22145e4009baSJeff Garzik 	err = scsi_register_driver(&sd_template.gendrv);
22155e4009baSJeff Garzik 	if (err)
22165e4009baSJeff Garzik 		goto err_out_class;
22175e4009baSJeff Garzik 
22185e4009baSJeff Garzik 	return 0;
22195e4009baSJeff Garzik 
22205e4009baSJeff Garzik err_out_class:
22215e4009baSJeff Garzik 	class_unregister(&sd_disk_class);
22225e4009baSJeff Garzik err_out:
22235e4009baSJeff Garzik 	for (i = 0; i < SD_MAJORS; i++)
22245e4009baSJeff Garzik 		unregister_blkdev(sd_major(i), "sd");
22255e4009baSJeff Garzik 	return err;
22261da177e4SLinus Torvalds }
22271da177e4SLinus Torvalds 
22281da177e4SLinus Torvalds /**
22291da177e4SLinus Torvalds  *	exit_sd - exit point for this driver (when it is a module).
22301da177e4SLinus Torvalds  *
22311da177e4SLinus Torvalds  *	Note: this function unregisters this driver from the scsi mid-level.
22321da177e4SLinus Torvalds  **/
22331da177e4SLinus Torvalds static void __exit exit_sd(void)
22341da177e4SLinus Torvalds {
22351da177e4SLinus Torvalds 	int i;
22361da177e4SLinus Torvalds 
22371da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
22381da177e4SLinus Torvalds 
22391da177e4SLinus Torvalds 	scsi_unregister_driver(&sd_template.gendrv);
22405e4009baSJeff Garzik 	class_unregister(&sd_disk_class);
22415e4009baSJeff Garzik 
22421da177e4SLinus Torvalds 	for (i = 0; i < SD_MAJORS; i++)
22431da177e4SLinus Torvalds 		unregister_blkdev(sd_major(i), "sd");
22441da177e4SLinus Torvalds }
22451da177e4SLinus Torvalds 
22461da177e4SLinus Torvalds module_init(init_sd);
22471da177e4SLinus Torvalds module_exit(exit_sd);
2248e73aec82SMartin K. Petersen 
2249e73aec82SMartin K. Petersen static void sd_print_sense_hdr(struct scsi_disk *sdkp,
2250e73aec82SMartin K. Petersen 			       struct scsi_sense_hdr *sshdr)
2251e73aec82SMartin K. Petersen {
2252e73aec82SMartin K. Petersen 	sd_printk(KERN_INFO, sdkp, "");
2253e73aec82SMartin K. Petersen 	scsi_show_sense_hdr(sshdr);
2254e73aec82SMartin K. Petersen 	sd_printk(KERN_INFO, sdkp, "");
2255e73aec82SMartin K. Petersen 	scsi_show_extd_sense(sshdr->asc, sshdr->ascq);
2256e73aec82SMartin K. Petersen }
2257e73aec82SMartin K. Petersen 
2258e73aec82SMartin K. Petersen static void sd_print_result(struct scsi_disk *sdkp, int result)
2259e73aec82SMartin K. Petersen {
2260e73aec82SMartin K. Petersen 	sd_printk(KERN_INFO, sdkp, "");
2261e73aec82SMartin K. Petersen 	scsi_show_result(result);
2262e73aec82SMartin K. Petersen }
2263e73aec82SMartin K. Petersen 
2264