xref: /openbmc/linux/drivers/scsi/sd.c (revision 24669f75a3231fa37444977c92d1f4838bec1233)
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/config.h>
361da177e4SLinus Torvalds #include <linux/module.h>
371da177e4SLinus Torvalds #include <linux/fs.h>
381da177e4SLinus Torvalds #include <linux/kernel.h>
391da177e4SLinus Torvalds #include <linux/sched.h>
401da177e4SLinus Torvalds #include <linux/mm.h>
411da177e4SLinus Torvalds #include <linux/bio.h>
421da177e4SLinus Torvalds #include <linux/genhd.h>
431da177e4SLinus Torvalds #include <linux/hdreg.h>
441da177e4SLinus Torvalds #include <linux/errno.h>
451da177e4SLinus Torvalds #include <linux/idr.h>
461da177e4SLinus Torvalds #include <linux/interrupt.h>
471da177e4SLinus Torvalds #include <linux/init.h>
481da177e4SLinus Torvalds #include <linux/blkdev.h>
491da177e4SLinus Torvalds #include <linux/blkpg.h>
501da177e4SLinus Torvalds #include <linux/kref.h>
511da177e4SLinus Torvalds #include <linux/delay.h>
520b950672SArjan van de Ven #include <linux/mutex.h>
531da177e4SLinus Torvalds #include <asm/uaccess.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 
651da177e4SLinus Torvalds #include "scsi_logging.h"
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds /*
681da177e4SLinus Torvalds  * More than enough for everybody ;)  The huge number of majors
691da177e4SLinus Torvalds  * is a leftover from 16bit dev_t days, we don't really need that
701da177e4SLinus Torvalds  * much numberspace.
711da177e4SLinus Torvalds  */
721da177e4SLinus Torvalds #define SD_MAJORS	16
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds /*
751da177e4SLinus Torvalds  * This is limited by the naming scheme enforced in sd_probe,
761da177e4SLinus Torvalds  * add another character to it if you really need more disks.
771da177e4SLinus Torvalds  */
781da177e4SLinus Torvalds #define SD_MAX_DISKS	(((26 * 26) + 26 + 1) * 26)
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds /*
811da177e4SLinus Torvalds  * Time out in seconds for disks and Magneto-opticals (which are slower).
821da177e4SLinus Torvalds  */
831da177e4SLinus Torvalds #define SD_TIMEOUT		(30 * HZ)
841da177e4SLinus Torvalds #define SD_MOD_TIMEOUT		(75 * HZ)
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds /*
871da177e4SLinus Torvalds  * Number of allowed retries
881da177e4SLinus Torvalds  */
891da177e4SLinus Torvalds #define SD_MAX_RETRIES		5
901da177e4SLinus Torvalds #define SD_PASSTHROUGH_RETRIES	1
911da177e4SLinus Torvalds 
9248970800SAl Viro /*
9348970800SAl Viro  * Size of the initial data buffer for mode and read capacity data
9448970800SAl Viro  */
9548970800SAl Viro #define SD_BUF_SIZE		512
9648970800SAl Viro 
971da177e4SLinus Torvalds static void scsi_disk_release(struct kref *kref);
981da177e4SLinus Torvalds 
991da177e4SLinus Torvalds struct scsi_disk {
1001da177e4SLinus Torvalds 	struct scsi_driver *driver;	/* always &sd_template */
1011da177e4SLinus Torvalds 	struct scsi_device *device;
1021da177e4SLinus Torvalds 	struct kref	kref;
1031da177e4SLinus Torvalds 	struct gendisk	*disk;
1041da177e4SLinus Torvalds 	unsigned int	openers;	/* protected by BKL for now, yuck */
1051da177e4SLinus Torvalds 	sector_t	capacity;	/* size in 512-byte sectors */
1061da177e4SLinus Torvalds 	u32		index;
1071da177e4SLinus Torvalds 	u8		media_present;
1081da177e4SLinus Torvalds 	u8		write_prot;
1091da177e4SLinus Torvalds 	unsigned	WCE : 1;	/* state of disk WCE bit */
1101da177e4SLinus Torvalds 	unsigned	RCD : 1;	/* state of disk RCD bit, unused */
111007365adSTejun Heo 	unsigned	DPOFUA : 1;	/* state of disk DPOFUA bit */
1121da177e4SLinus Torvalds };
1131da177e4SLinus Torvalds 
1141da177e4SLinus Torvalds static DEFINE_IDR(sd_index_idr);
1151da177e4SLinus Torvalds static DEFINE_SPINLOCK(sd_index_lock);
1161da177e4SLinus Torvalds 
1171da177e4SLinus Torvalds /* This semaphore is used to mediate the 0->1 reference get in the
1181da177e4SLinus Torvalds  * face of object destruction (i.e. we can't allow a get on an
1191da177e4SLinus Torvalds  * object after last put) */
1200b950672SArjan van de Ven static DEFINE_MUTEX(sd_ref_mutex);
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds static int sd_revalidate_disk(struct gendisk *disk);
1231da177e4SLinus Torvalds static void sd_rw_intr(struct scsi_cmnd * SCpnt);
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds static int sd_probe(struct device *);
1261da177e4SLinus Torvalds static int sd_remove(struct device *);
1271da177e4SLinus Torvalds static void sd_shutdown(struct device *dev);
1281da177e4SLinus Torvalds static void sd_rescan(struct device *);
1291da177e4SLinus Torvalds static int sd_init_command(struct scsi_cmnd *);
1301da177e4SLinus Torvalds static int sd_issue_flush(struct device *, sector_t *);
131461d4e90STejun Heo static void sd_prepare_flush(request_queue_t *, struct request *);
1321da177e4SLinus Torvalds static void sd_read_capacity(struct scsi_disk *sdkp, char *diskname,
133ea73a9f2SJames Bottomley 			     unsigned char *buffer);
1341da177e4SLinus Torvalds 
1351da177e4SLinus Torvalds static struct scsi_driver sd_template = {
1361da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
1371da177e4SLinus Torvalds 	.gendrv = {
1381da177e4SLinus Torvalds 		.name		= "sd",
1391da177e4SLinus Torvalds 		.probe		= sd_probe,
1401da177e4SLinus Torvalds 		.remove		= sd_remove,
1411da177e4SLinus Torvalds 		.shutdown	= sd_shutdown,
1421da177e4SLinus Torvalds 	},
1431da177e4SLinus Torvalds 	.rescan			= sd_rescan,
1441da177e4SLinus Torvalds 	.init_command		= sd_init_command,
1451da177e4SLinus Torvalds 	.issue_flush		= sd_issue_flush,
1461da177e4SLinus Torvalds };
1471da177e4SLinus Torvalds 
1481da177e4SLinus Torvalds /*
1491da177e4SLinus Torvalds  * Device no to disk mapping:
1501da177e4SLinus Torvalds  *
1511da177e4SLinus Torvalds  *       major         disc2     disc  p1
1521da177e4SLinus Torvalds  *   |............|.............|....|....| <- dev_t
1531da177e4SLinus Torvalds  *    31        20 19          8 7  4 3  0
1541da177e4SLinus Torvalds  *
1551da177e4SLinus Torvalds  * Inside a major, we have 16k disks, however mapped non-
1561da177e4SLinus Torvalds  * contiguously. The first 16 disks are for major0, the next
1571da177e4SLinus Torvalds  * ones with major1, ... Disk 256 is for major0 again, disk 272
1581da177e4SLinus Torvalds  * for major1, ...
1591da177e4SLinus Torvalds  * As we stay compatible with our numbering scheme, we can reuse
1601da177e4SLinus Torvalds  * the well-know SCSI majors 8, 65--71, 136--143.
1611da177e4SLinus Torvalds  */
1621da177e4SLinus Torvalds static int sd_major(int major_idx)
1631da177e4SLinus Torvalds {
1641da177e4SLinus Torvalds 	switch (major_idx) {
1651da177e4SLinus Torvalds 	case 0:
1661da177e4SLinus Torvalds 		return SCSI_DISK0_MAJOR;
1671da177e4SLinus Torvalds 	case 1 ... 7:
1681da177e4SLinus Torvalds 		return SCSI_DISK1_MAJOR + major_idx - 1;
1691da177e4SLinus Torvalds 	case 8 ... 15:
1701da177e4SLinus Torvalds 		return SCSI_DISK8_MAJOR + major_idx - 8;
1711da177e4SLinus Torvalds 	default:
1721da177e4SLinus Torvalds 		BUG();
1731da177e4SLinus Torvalds 		return 0;	/* shut up gcc */
1741da177e4SLinus Torvalds 	}
1751da177e4SLinus Torvalds }
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,kref)
1781da177e4SLinus Torvalds 
1791da177e4SLinus Torvalds static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
1801da177e4SLinus Torvalds {
1811da177e4SLinus Torvalds 	return container_of(disk->private_data, struct scsi_disk, driver);
1821da177e4SLinus Torvalds }
1831da177e4SLinus Torvalds 
18439b7f1e2SAlan Stern static struct scsi_disk *__scsi_disk_get(struct gendisk *disk)
1851da177e4SLinus Torvalds {
1861da177e4SLinus Torvalds 	struct scsi_disk *sdkp = NULL;
1871da177e4SLinus Torvalds 
18839b7f1e2SAlan Stern 	if (disk->private_data) {
1891da177e4SLinus Torvalds 		sdkp = scsi_disk(disk);
19039b7f1e2SAlan Stern 		if (scsi_device_get(sdkp->device) == 0)
1911da177e4SLinus Torvalds 			kref_get(&sdkp->kref);
19239b7f1e2SAlan Stern 		else
19339b7f1e2SAlan Stern 			sdkp = NULL;
19439b7f1e2SAlan Stern 	}
19539b7f1e2SAlan Stern 	return sdkp;
19639b7f1e2SAlan Stern }
19739b7f1e2SAlan Stern 
19839b7f1e2SAlan Stern static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
19939b7f1e2SAlan Stern {
20039b7f1e2SAlan Stern 	struct scsi_disk *sdkp;
20139b7f1e2SAlan Stern 
2020b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
20339b7f1e2SAlan Stern 	sdkp = __scsi_disk_get(disk);
2040b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
2051da177e4SLinus Torvalds 	return sdkp;
20639b7f1e2SAlan Stern }
2071da177e4SLinus Torvalds 
20839b7f1e2SAlan Stern static struct scsi_disk *scsi_disk_get_from_dev(struct device *dev)
20939b7f1e2SAlan Stern {
21039b7f1e2SAlan Stern 	struct scsi_disk *sdkp;
21139b7f1e2SAlan Stern 
2120b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
21339b7f1e2SAlan Stern 	sdkp = dev_get_drvdata(dev);
21439b7f1e2SAlan Stern 	if (sdkp)
21539b7f1e2SAlan Stern 		sdkp = __scsi_disk_get(sdkp->disk);
2160b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
2171da177e4SLinus Torvalds 	return sdkp;
2181da177e4SLinus Torvalds }
2191da177e4SLinus Torvalds 
2201da177e4SLinus Torvalds static void scsi_disk_put(struct scsi_disk *sdkp)
2211da177e4SLinus Torvalds {
2221da177e4SLinus Torvalds 	struct scsi_device *sdev = sdkp->device;
2231da177e4SLinus Torvalds 
2240b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
2251da177e4SLinus Torvalds 	kref_put(&sdkp->kref, scsi_disk_release);
2261da177e4SLinus Torvalds 	scsi_device_put(sdev);
2270b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
2281da177e4SLinus Torvalds }
2291da177e4SLinus Torvalds 
2301da177e4SLinus Torvalds /**
2311da177e4SLinus Torvalds  *	sd_init_command - build a scsi (read or write) command from
2321da177e4SLinus Torvalds  *	information in the request structure.
2331da177e4SLinus Torvalds  *	@SCpnt: pointer to mid-level's per scsi command structure that
2341da177e4SLinus Torvalds  *	contains request and into which the scsi command is written
2351da177e4SLinus Torvalds  *
2361da177e4SLinus Torvalds  *	Returns 1 if successful and 0 if error (or cannot be done now).
2371da177e4SLinus Torvalds  **/
2381da177e4SLinus Torvalds static int sd_init_command(struct scsi_cmnd * SCpnt)
2391da177e4SLinus Torvalds {
2401da177e4SLinus Torvalds 	struct scsi_device *sdp = SCpnt->device;
2411da177e4SLinus Torvalds 	struct request *rq = SCpnt->request;
242776b23a0SChristoph Hellwig 	struct gendisk *disk = rq->rq_disk;
243776b23a0SChristoph Hellwig 	sector_t block = rq->sector;
244776b23a0SChristoph Hellwig 	unsigned int this_count = SCpnt->request_bufflen >> 9;
245776b23a0SChristoph Hellwig 	unsigned int timeout = sdp->timeout;
2461da177e4SLinus Torvalds 
2471da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(1, printk("sd_init_command: disk=%s, block=%llu, "
2481da177e4SLinus Torvalds 			    "count=%d\n", disk->disk_name,
2491da177e4SLinus Torvalds 			 (unsigned long long)block, this_count));
2501da177e4SLinus Torvalds 
2511da177e4SLinus Torvalds 	if (!sdp || !scsi_device_online(sdp) ||
2521da177e4SLinus Torvalds  	    block + rq->nr_sectors > get_capacity(disk)) {
2531da177e4SLinus Torvalds 		SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n",
2541da177e4SLinus Torvalds 				 rq->nr_sectors));
2551da177e4SLinus Torvalds 		SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
2561da177e4SLinus Torvalds 		return 0;
2571da177e4SLinus Torvalds 	}
2581da177e4SLinus Torvalds 
2591da177e4SLinus Torvalds 	if (sdp->changed) {
2601da177e4SLinus Torvalds 		/*
2611da177e4SLinus Torvalds 		 * quietly refuse to do anything to a changed disc until
2621da177e4SLinus Torvalds 		 * the changed bit has been reset
2631da177e4SLinus Torvalds 		 */
2641da177e4SLinus Torvalds 		/* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */
2651da177e4SLinus Torvalds 		return 0;
2661da177e4SLinus Torvalds 	}
2671da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(2, printk("%s : block=%llu\n",
2681da177e4SLinus Torvalds 				   disk->disk_name, (unsigned long long)block));
2691da177e4SLinus Torvalds 
2701da177e4SLinus Torvalds 	/*
2711da177e4SLinus Torvalds 	 * If we have a 1K hardware sectorsize, prevent access to single
2721da177e4SLinus Torvalds 	 * 512 byte sectors.  In theory we could handle this - in fact
2731da177e4SLinus Torvalds 	 * the scsi cdrom driver must be able to handle this because
2741da177e4SLinus Torvalds 	 * we typically use 1K blocksizes, and cdroms typically have
2751da177e4SLinus Torvalds 	 * 2K hardware sectorsizes.  Of course, things are simpler
2761da177e4SLinus Torvalds 	 * with the cdrom, since it is read-only.  For performance
2771da177e4SLinus Torvalds 	 * reasons, the filesystems should be able to handle this
2781da177e4SLinus Torvalds 	 * and not force the scsi disk driver to use bounce buffers
2791da177e4SLinus Torvalds 	 * for this.
2801da177e4SLinus Torvalds 	 */
2811da177e4SLinus Torvalds 	if (sdp->sector_size == 1024) {
2821da177e4SLinus Torvalds 		if ((block & 1) || (rq->nr_sectors & 1)) {
2831da177e4SLinus Torvalds 			printk(KERN_ERR "sd: Bad block number requested");
2841da177e4SLinus Torvalds 			return 0;
2851da177e4SLinus Torvalds 		} else {
2861da177e4SLinus Torvalds 			block = block >> 1;
2871da177e4SLinus Torvalds 			this_count = this_count >> 1;
2881da177e4SLinus Torvalds 		}
2891da177e4SLinus Torvalds 	}
2901da177e4SLinus Torvalds 	if (sdp->sector_size == 2048) {
2911da177e4SLinus Torvalds 		if ((block & 3) || (rq->nr_sectors & 3)) {
2921da177e4SLinus Torvalds 			printk(KERN_ERR "sd: Bad block number requested");
2931da177e4SLinus Torvalds 			return 0;
2941da177e4SLinus Torvalds 		} else {
2951da177e4SLinus Torvalds 			block = block >> 2;
2961da177e4SLinus Torvalds 			this_count = this_count >> 2;
2971da177e4SLinus Torvalds 		}
2981da177e4SLinus Torvalds 	}
2991da177e4SLinus Torvalds 	if (sdp->sector_size == 4096) {
3001da177e4SLinus Torvalds 		if ((block & 7) || (rq->nr_sectors & 7)) {
3011da177e4SLinus Torvalds 			printk(KERN_ERR "sd: Bad block number requested");
3021da177e4SLinus Torvalds 			return 0;
3031da177e4SLinus Torvalds 		} else {
3041da177e4SLinus Torvalds 			block = block >> 3;
3051da177e4SLinus Torvalds 			this_count = this_count >> 3;
3061da177e4SLinus Torvalds 		}
3071da177e4SLinus Torvalds 	}
3081da177e4SLinus Torvalds 	if (rq_data_dir(rq) == WRITE) {
3091da177e4SLinus Torvalds 		if (!sdp->writeable) {
3101da177e4SLinus Torvalds 			return 0;
3111da177e4SLinus Torvalds 		}
3121da177e4SLinus Torvalds 		SCpnt->cmnd[0] = WRITE_6;
3131da177e4SLinus Torvalds 		SCpnt->sc_data_direction = DMA_TO_DEVICE;
3141da177e4SLinus Torvalds 	} else if (rq_data_dir(rq) == READ) {
3151da177e4SLinus Torvalds 		SCpnt->cmnd[0] = READ_6;
3161da177e4SLinus Torvalds 		SCpnt->sc_data_direction = DMA_FROM_DEVICE;
3171da177e4SLinus Torvalds 	} else {
3181da177e4SLinus Torvalds 		printk(KERN_ERR "sd: Unknown command %lx\n", rq->flags);
3191da177e4SLinus Torvalds /* overkill 	panic("Unknown sd command %lx\n", rq->flags); */
3201da177e4SLinus Torvalds 		return 0;
3211da177e4SLinus Torvalds 	}
3221da177e4SLinus Torvalds 
3231da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n",
3241da177e4SLinus Torvalds 		disk->disk_name, (rq_data_dir(rq) == WRITE) ?
3251da177e4SLinus Torvalds 		"writing" : "reading", this_count, rq->nr_sectors));
3261da177e4SLinus Torvalds 
3271da177e4SLinus Torvalds 	SCpnt->cmnd[1] = 0;
3281da177e4SLinus Torvalds 
3291da177e4SLinus Torvalds 	if (block > 0xffffffff) {
3301da177e4SLinus Torvalds 		SCpnt->cmnd[0] += READ_16 - READ_6;
331007365adSTejun Heo 		SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0;
3321da177e4SLinus Torvalds 		SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
3331da177e4SLinus Torvalds 		SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0;
3341da177e4SLinus Torvalds 		SCpnt->cmnd[4] = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0;
3351da177e4SLinus Torvalds 		SCpnt->cmnd[5] = sizeof(block) > 4 ? (unsigned char) (block >> 32) & 0xff : 0;
3361da177e4SLinus Torvalds 		SCpnt->cmnd[6] = (unsigned char) (block >> 24) & 0xff;
3371da177e4SLinus Torvalds 		SCpnt->cmnd[7] = (unsigned char) (block >> 16) & 0xff;
3381da177e4SLinus Torvalds 		SCpnt->cmnd[8] = (unsigned char) (block >> 8) & 0xff;
3391da177e4SLinus Torvalds 		SCpnt->cmnd[9] = (unsigned char) block & 0xff;
3401da177e4SLinus Torvalds 		SCpnt->cmnd[10] = (unsigned char) (this_count >> 24) & 0xff;
3411da177e4SLinus Torvalds 		SCpnt->cmnd[11] = (unsigned char) (this_count >> 16) & 0xff;
3421da177e4SLinus Torvalds 		SCpnt->cmnd[12] = (unsigned char) (this_count >> 8) & 0xff;
3431da177e4SLinus Torvalds 		SCpnt->cmnd[13] = (unsigned char) this_count & 0xff;
3441da177e4SLinus Torvalds 		SCpnt->cmnd[14] = SCpnt->cmnd[15] = 0;
3451da177e4SLinus Torvalds 	} else if ((this_count > 0xff) || (block > 0x1fffff) ||
3461da177e4SLinus Torvalds 		   SCpnt->device->use_10_for_rw) {
3471da177e4SLinus Torvalds 		if (this_count > 0xffff)
3481da177e4SLinus Torvalds 			this_count = 0xffff;
3491da177e4SLinus Torvalds 
3501da177e4SLinus Torvalds 		SCpnt->cmnd[0] += READ_10 - READ_6;
351007365adSTejun Heo 		SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0;
3521da177e4SLinus Torvalds 		SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff;
3531da177e4SLinus Torvalds 		SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff;
3541da177e4SLinus Torvalds 		SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff;
3551da177e4SLinus Torvalds 		SCpnt->cmnd[5] = (unsigned char) block & 0xff;
3561da177e4SLinus Torvalds 		SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
3571da177e4SLinus Torvalds 		SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff;
3581da177e4SLinus Torvalds 		SCpnt->cmnd[8] = (unsigned char) this_count & 0xff;
3591da177e4SLinus Torvalds 	} else {
360007365adSTejun Heo 		if (unlikely(blk_fua_rq(rq))) {
361007365adSTejun Heo 			/*
362007365adSTejun Heo 			 * This happens only if this drive failed
363007365adSTejun Heo 			 * 10byte rw command with ILLEGAL_REQUEST
364007365adSTejun Heo 			 * during operation and thus turned off
365007365adSTejun Heo 			 * use_10_for_rw.
366007365adSTejun Heo 			 */
367007365adSTejun Heo 			printk(KERN_ERR "sd: FUA write on READ/WRITE(6) drive\n");
368007365adSTejun Heo 			return 0;
369007365adSTejun Heo 		}
370007365adSTejun Heo 
3711da177e4SLinus Torvalds 		SCpnt->cmnd[1] |= (unsigned char) ((block >> 16) & 0x1f);
3721da177e4SLinus Torvalds 		SCpnt->cmnd[2] = (unsigned char) ((block >> 8) & 0xff);
3731da177e4SLinus Torvalds 		SCpnt->cmnd[3] = (unsigned char) block & 0xff;
3741da177e4SLinus Torvalds 		SCpnt->cmnd[4] = (unsigned char) this_count;
3751da177e4SLinus Torvalds 		SCpnt->cmnd[5] = 0;
3761da177e4SLinus Torvalds 	}
3771da177e4SLinus Torvalds 	SCpnt->request_bufflen = SCpnt->bufflen =
3781da177e4SLinus Torvalds 			this_count * sdp->sector_size;
3791da177e4SLinus Torvalds 
3801da177e4SLinus Torvalds 	/*
3811da177e4SLinus Torvalds 	 * We shouldn't disconnect in the middle of a sector, so with a dumb
3821da177e4SLinus Torvalds 	 * host adapter, it's safe to assume that we can at least transfer
3831da177e4SLinus Torvalds 	 * this many bytes between each connect / disconnect.
3841da177e4SLinus Torvalds 	 */
3851da177e4SLinus Torvalds 	SCpnt->transfersize = sdp->sector_size;
3861da177e4SLinus Torvalds 	SCpnt->underflow = this_count << 9;
3871da177e4SLinus Torvalds 	SCpnt->allowed = SD_MAX_RETRIES;
3881da177e4SLinus Torvalds 	SCpnt->timeout_per_command = timeout;
3891da177e4SLinus Torvalds 
3901da177e4SLinus Torvalds 	/*
3911da177e4SLinus Torvalds 	 * This is the completion routine we use.  This is matched in terms
3921da177e4SLinus Torvalds 	 * of capability to this function.
3931da177e4SLinus Torvalds 	 */
3941da177e4SLinus Torvalds 	SCpnt->done = sd_rw_intr;
3951da177e4SLinus Torvalds 
3961da177e4SLinus Torvalds 	/*
3971da177e4SLinus Torvalds 	 * This indicates that the command is ready from our end to be
3981da177e4SLinus Torvalds 	 * queued.
3991da177e4SLinus Torvalds 	 */
4001da177e4SLinus Torvalds 	return 1;
4011da177e4SLinus Torvalds }
4021da177e4SLinus Torvalds 
4031da177e4SLinus Torvalds /**
4041da177e4SLinus Torvalds  *	sd_open - open a scsi disk device
4051da177e4SLinus Torvalds  *	@inode: only i_rdev member may be used
4061da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
4071da177e4SLinus Torvalds  *
4081da177e4SLinus Torvalds  *	Returns 0 if successful. Returns a negated errno value in case
4091da177e4SLinus Torvalds  *	of error.
4101da177e4SLinus Torvalds  *
4111da177e4SLinus Torvalds  *	Note: This can be called from a user context (e.g. fsck(1) )
4121da177e4SLinus Torvalds  *	or from within the kernel (e.g. as a result of a mount(1) ).
4131da177e4SLinus Torvalds  *	In the latter case @inode and @filp carry an abridged amount
4141da177e4SLinus Torvalds  *	of information as noted above.
4151da177e4SLinus Torvalds  **/
4161da177e4SLinus Torvalds static int sd_open(struct inode *inode, struct file *filp)
4171da177e4SLinus Torvalds {
4181da177e4SLinus Torvalds 	struct gendisk *disk = inode->i_bdev->bd_disk;
4191da177e4SLinus Torvalds 	struct scsi_disk *sdkp;
4201da177e4SLinus Torvalds 	struct scsi_device *sdev;
4211da177e4SLinus Torvalds 	int retval;
4221da177e4SLinus Torvalds 
4231da177e4SLinus Torvalds 	if (!(sdkp = scsi_disk_get(disk)))
4241da177e4SLinus Torvalds 		return -ENXIO;
4251da177e4SLinus Torvalds 
4261da177e4SLinus Torvalds 
4271da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("sd_open: disk=%s\n", disk->disk_name));
4281da177e4SLinus Torvalds 
4291da177e4SLinus Torvalds 	sdev = sdkp->device;
4301da177e4SLinus Torvalds 
4311da177e4SLinus Torvalds 	/*
4321da177e4SLinus Torvalds 	 * If the device is in error recovery, wait until it is done.
4331da177e4SLinus Torvalds 	 * If the device is offline, then disallow any access to it.
4341da177e4SLinus Torvalds 	 */
4351da177e4SLinus Torvalds 	retval = -ENXIO;
4361da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdev))
4371da177e4SLinus Torvalds 		goto error_out;
4381da177e4SLinus Torvalds 
4391da177e4SLinus Torvalds 	if (sdev->removable || sdkp->write_prot)
4401da177e4SLinus Torvalds 		check_disk_change(inode->i_bdev);
4411da177e4SLinus Torvalds 
4421da177e4SLinus Torvalds 	/*
4431da177e4SLinus Torvalds 	 * If the drive is empty, just let the open fail.
4441da177e4SLinus Torvalds 	 */
4451da177e4SLinus Torvalds 	retval = -ENOMEDIUM;
4461da177e4SLinus Torvalds 	if (sdev->removable && !sdkp->media_present &&
4471da177e4SLinus Torvalds 	    !(filp->f_flags & O_NDELAY))
4481da177e4SLinus Torvalds 		goto error_out;
4491da177e4SLinus Torvalds 
4501da177e4SLinus Torvalds 	/*
4511da177e4SLinus Torvalds 	 * If the device has the write protect tab set, have the open fail
4521da177e4SLinus Torvalds 	 * if the user expects to be able to write to the thing.
4531da177e4SLinus Torvalds 	 */
4541da177e4SLinus Torvalds 	retval = -EROFS;
4551da177e4SLinus Torvalds 	if (sdkp->write_prot && (filp->f_mode & FMODE_WRITE))
4561da177e4SLinus Torvalds 		goto error_out;
4571da177e4SLinus Torvalds 
4581da177e4SLinus Torvalds 	/*
4591da177e4SLinus Torvalds 	 * It is possible that the disk changing stuff resulted in
4601da177e4SLinus Torvalds 	 * the device being taken offline.  If this is the case,
4611da177e4SLinus Torvalds 	 * report this to the user, and don't pretend that the
4621da177e4SLinus Torvalds 	 * open actually succeeded.
4631da177e4SLinus Torvalds 	 */
4641da177e4SLinus Torvalds 	retval = -ENXIO;
4651da177e4SLinus Torvalds 	if (!scsi_device_online(sdev))
4661da177e4SLinus Torvalds 		goto error_out;
4671da177e4SLinus Torvalds 
4681da177e4SLinus Torvalds 	if (!sdkp->openers++ && sdev->removable) {
4691da177e4SLinus Torvalds 		if (scsi_block_when_processing_errors(sdev))
4701da177e4SLinus Torvalds 			scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
4711da177e4SLinus Torvalds 	}
4721da177e4SLinus Torvalds 
4731da177e4SLinus Torvalds 	return 0;
4741da177e4SLinus Torvalds 
4751da177e4SLinus Torvalds error_out:
4761da177e4SLinus Torvalds 	scsi_disk_put(sdkp);
4771da177e4SLinus Torvalds 	return retval;
4781da177e4SLinus Torvalds }
4791da177e4SLinus Torvalds 
4801da177e4SLinus Torvalds /**
4811da177e4SLinus Torvalds  *	sd_release - invoked when the (last) close(2) is called on this
4821da177e4SLinus Torvalds  *	scsi disk.
4831da177e4SLinus Torvalds  *	@inode: only i_rdev member may be used
4841da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
4851da177e4SLinus Torvalds  *
4861da177e4SLinus Torvalds  *	Returns 0.
4871da177e4SLinus Torvalds  *
4881da177e4SLinus Torvalds  *	Note: may block (uninterruptible) if error recovery is underway
4891da177e4SLinus Torvalds  *	on this disk.
4901da177e4SLinus Torvalds  **/
4911da177e4SLinus Torvalds static int sd_release(struct inode *inode, struct file *filp)
4921da177e4SLinus Torvalds {
4931da177e4SLinus Torvalds 	struct gendisk *disk = inode->i_bdev->bd_disk;
4941da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
4951da177e4SLinus Torvalds 	struct scsi_device *sdev = sdkp->device;
4961da177e4SLinus Torvalds 
4971da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("sd_release: disk=%s\n", disk->disk_name));
4981da177e4SLinus Torvalds 
4991da177e4SLinus Torvalds 	if (!--sdkp->openers && sdev->removable) {
5001da177e4SLinus Torvalds 		if (scsi_block_when_processing_errors(sdev))
5011da177e4SLinus Torvalds 			scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
5021da177e4SLinus Torvalds 	}
5031da177e4SLinus Torvalds 
5041da177e4SLinus Torvalds 	/*
5051da177e4SLinus Torvalds 	 * XXX and what if there are packets in flight and this close()
5061da177e4SLinus Torvalds 	 * XXX is followed by a "rmmod sd_mod"?
5071da177e4SLinus Torvalds 	 */
5081da177e4SLinus Torvalds 	scsi_disk_put(sdkp);
5091da177e4SLinus Torvalds 	return 0;
5101da177e4SLinus Torvalds }
5111da177e4SLinus Torvalds 
512a885c8c4SChristoph Hellwig static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
5131da177e4SLinus Torvalds {
5141da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk);
5151da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
5161da177e4SLinus Torvalds 	struct Scsi_Host *host = sdp->host;
5171da177e4SLinus Torvalds 	int diskinfo[4];
5181da177e4SLinus Torvalds 
5191da177e4SLinus Torvalds 	/* default to most commonly used values */
5201da177e4SLinus Torvalds         diskinfo[0] = 0x40;	/* 1 << 6 */
5211da177e4SLinus Torvalds        	diskinfo[1] = 0x20;	/* 1 << 5 */
5221da177e4SLinus Torvalds        	diskinfo[2] = sdkp->capacity >> 11;
5231da177e4SLinus Torvalds 
5241da177e4SLinus Torvalds 	/* override with calculated, extended default, or driver values */
5251da177e4SLinus Torvalds 	if (host->hostt->bios_param)
5261da177e4SLinus Torvalds 		host->hostt->bios_param(sdp, bdev, sdkp->capacity, diskinfo);
5271da177e4SLinus Torvalds 	else
5281da177e4SLinus Torvalds 		scsicam_bios_param(bdev, sdkp->capacity, diskinfo);
5291da177e4SLinus Torvalds 
530a885c8c4SChristoph Hellwig 	geo->heads = diskinfo[0];
531a885c8c4SChristoph Hellwig 	geo->sectors = diskinfo[1];
532a885c8c4SChristoph Hellwig 	geo->cylinders = diskinfo[2];
5331da177e4SLinus Torvalds 	return 0;
5341da177e4SLinus Torvalds }
5351da177e4SLinus Torvalds 
5361da177e4SLinus Torvalds /**
5371da177e4SLinus Torvalds  *	sd_ioctl - process an ioctl
5381da177e4SLinus Torvalds  *	@inode: only i_rdev/i_bdev members may be used
5391da177e4SLinus Torvalds  *	@filp: only f_mode and f_flags may be used
5401da177e4SLinus Torvalds  *	@cmd: ioctl command number
5411da177e4SLinus Torvalds  *	@arg: this is third argument given to ioctl(2) system call.
5421da177e4SLinus Torvalds  *	Often contains a pointer.
5431da177e4SLinus Torvalds  *
5441da177e4SLinus Torvalds  *	Returns 0 if successful (some ioctls return postive numbers on
5451da177e4SLinus Torvalds  *	success as well). Returns a negated errno value in case of error.
5461da177e4SLinus Torvalds  *
5471da177e4SLinus Torvalds  *	Note: most ioctls are forward onto the block subsystem or further
5481da177e4SLinus Torvalds  *	down in the scsi subsytem.
5491da177e4SLinus Torvalds  **/
5501da177e4SLinus Torvalds static int sd_ioctl(struct inode * inode, struct file * filp,
5511da177e4SLinus Torvalds 		    unsigned int cmd, unsigned long arg)
5521da177e4SLinus Torvalds {
5531da177e4SLinus Torvalds 	struct block_device *bdev = inode->i_bdev;
5541da177e4SLinus Torvalds 	struct gendisk *disk = bdev->bd_disk;
5551da177e4SLinus Torvalds 	struct scsi_device *sdp = scsi_disk(disk)->device;
5561da177e4SLinus Torvalds 	void __user *p = (void __user *)arg;
5571da177e4SLinus Torvalds 	int error;
5581da177e4SLinus Torvalds 
5591da177e4SLinus Torvalds 	SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n",
5601da177e4SLinus Torvalds 						disk->disk_name, cmd));
5611da177e4SLinus Torvalds 
5621da177e4SLinus Torvalds 	/*
5631da177e4SLinus Torvalds 	 * If we are in the middle of error recovery, don't let anyone
5641da177e4SLinus Torvalds 	 * else try and use this device.  Also, if error recovery fails, it
5651da177e4SLinus Torvalds 	 * may try and take the device offline, in which case all further
5661da177e4SLinus Torvalds 	 * access to the device is prohibited.
5671da177e4SLinus Torvalds 	 */
5681da177e4SLinus Torvalds 	error = scsi_nonblockable_ioctl(sdp, cmd, p, filp);
5691da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdp) || !error)
5701da177e4SLinus Torvalds 		return error;
5711da177e4SLinus Torvalds 
5721da177e4SLinus Torvalds 	/*
5731da177e4SLinus Torvalds 	 * Send SCSI addressing ioctls directly to mid level, send other
5741da177e4SLinus Torvalds 	 * ioctls to block level and then onto mid level if they can't be
5751da177e4SLinus Torvalds 	 * resolved.
5761da177e4SLinus Torvalds 	 */
5771da177e4SLinus Torvalds 	switch (cmd) {
5781da177e4SLinus Torvalds 		case SCSI_IOCTL_GET_IDLUN:
5791da177e4SLinus Torvalds 		case SCSI_IOCTL_GET_BUS_NUMBER:
5801da177e4SLinus Torvalds 			return scsi_ioctl(sdp, cmd, p);
5811da177e4SLinus Torvalds 		default:
5821da177e4SLinus Torvalds 			error = scsi_cmd_ioctl(filp, disk, cmd, p);
5831da177e4SLinus Torvalds 			if (error != -ENOTTY)
5841da177e4SLinus Torvalds 				return error;
5851da177e4SLinus Torvalds 	}
5861da177e4SLinus Torvalds 	return scsi_ioctl(sdp, cmd, p);
5871da177e4SLinus Torvalds }
5881da177e4SLinus Torvalds 
5891da177e4SLinus Torvalds static void set_media_not_present(struct scsi_disk *sdkp)
5901da177e4SLinus Torvalds {
5911da177e4SLinus Torvalds 	sdkp->media_present = 0;
5921da177e4SLinus Torvalds 	sdkp->capacity = 0;
5931da177e4SLinus Torvalds 	sdkp->device->changed = 1;
5941da177e4SLinus Torvalds }
5951da177e4SLinus Torvalds 
5961da177e4SLinus Torvalds /**
5971da177e4SLinus Torvalds  *	sd_media_changed - check if our medium changed
5981da177e4SLinus Torvalds  *	@disk: kernel device descriptor
5991da177e4SLinus Torvalds  *
6001da177e4SLinus Torvalds  *	Returns 0 if not applicable or no change; 1 if change
6011da177e4SLinus Torvalds  *
6021da177e4SLinus Torvalds  *	Note: this function is invoked from the block subsystem.
6031da177e4SLinus Torvalds  **/
6041da177e4SLinus Torvalds static int sd_media_changed(struct gendisk *disk)
6051da177e4SLinus Torvalds {
6061da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
6071da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
6081da177e4SLinus Torvalds 	int retval;
6091da177e4SLinus Torvalds 
6101da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("sd_media_changed: disk=%s\n",
6111da177e4SLinus Torvalds 						disk->disk_name));
6121da177e4SLinus Torvalds 
6131da177e4SLinus Torvalds 	if (!sdp->removable)
6141da177e4SLinus Torvalds 		return 0;
6151da177e4SLinus Torvalds 
6161da177e4SLinus Torvalds 	/*
6171da177e4SLinus Torvalds 	 * If the device is offline, don't send any commands - just pretend as
6181da177e4SLinus Torvalds 	 * if the command failed.  If the device ever comes back online, we
6191da177e4SLinus Torvalds 	 * can deal with it then.  It is only because of unrecoverable errors
6201da177e4SLinus Torvalds 	 * that we would ever take a device offline in the first place.
6211da177e4SLinus Torvalds 	 */
6221da177e4SLinus Torvalds 	if (!scsi_device_online(sdp))
6231da177e4SLinus Torvalds 		goto not_present;
6241da177e4SLinus Torvalds 
6251da177e4SLinus Torvalds 	/*
6261da177e4SLinus Torvalds 	 * Using TEST_UNIT_READY enables differentiation between drive with
6271da177e4SLinus Torvalds 	 * no cartridge loaded - NOT READY, drive with changed cartridge -
6281da177e4SLinus Torvalds 	 * UNIT ATTENTION, or with same cartridge - GOOD STATUS.
6291da177e4SLinus Torvalds 	 *
6301da177e4SLinus Torvalds 	 * Drives that auto spin down. eg iomega jaz 1G, will be started
6311da177e4SLinus Torvalds 	 * by sd_spinup_disk() from sd_revalidate_disk(), which happens whenever
6321da177e4SLinus Torvalds 	 * sd_revalidate() is called.
6331da177e4SLinus Torvalds 	 */
6341da177e4SLinus Torvalds 	retval = -ENODEV;
6351da177e4SLinus Torvalds 	if (scsi_block_when_processing_errors(sdp))
6361da177e4SLinus Torvalds 		retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES);
6371da177e4SLinus Torvalds 
6381da177e4SLinus Torvalds 	/*
6391da177e4SLinus Torvalds 	 * Unable to test, unit probably not ready.   This usually
6401da177e4SLinus Torvalds 	 * means there is no disc in the drive.  Mark as changed,
6411da177e4SLinus Torvalds 	 * and we will figure it out later once the drive is
6421da177e4SLinus Torvalds 	 * available again.
6431da177e4SLinus Torvalds 	 */
6441da177e4SLinus Torvalds 	if (retval)
6451da177e4SLinus Torvalds 		 goto not_present;
6461da177e4SLinus Torvalds 
6471da177e4SLinus Torvalds 	/*
6481da177e4SLinus Torvalds 	 * For removable scsi disk we have to recognise the presence
6491da177e4SLinus Torvalds 	 * of a disk in the drive. This is kept in the struct scsi_disk
6501da177e4SLinus Torvalds 	 * struct and tested at open !  Daniel Roche (dan@lectra.fr)
6511da177e4SLinus Torvalds 	 */
6521da177e4SLinus Torvalds 	sdkp->media_present = 1;
6531da177e4SLinus Torvalds 
6541da177e4SLinus Torvalds 	retval = sdp->changed;
6551da177e4SLinus Torvalds 	sdp->changed = 0;
6561da177e4SLinus Torvalds 
6571da177e4SLinus Torvalds 	return retval;
6581da177e4SLinus Torvalds 
6591da177e4SLinus Torvalds not_present:
6601da177e4SLinus Torvalds 	set_media_not_present(sdkp);
6611da177e4SLinus Torvalds 	return 1;
6621da177e4SLinus Torvalds }
6631da177e4SLinus Torvalds 
6641da177e4SLinus Torvalds static int sd_sync_cache(struct scsi_device *sdp)
6651da177e4SLinus Torvalds {
6661da177e4SLinus Torvalds 	int retries, res;
667ea73a9f2SJames Bottomley 	struct scsi_sense_hdr sshdr;
6681da177e4SLinus Torvalds 
6691da177e4SLinus Torvalds 	if (!scsi_device_online(sdp))
6701da177e4SLinus Torvalds 		return -ENODEV;
6711da177e4SLinus Torvalds 
6721da177e4SLinus Torvalds 
6731da177e4SLinus Torvalds 	for (retries = 3; retries > 0; --retries) {
6741da177e4SLinus Torvalds 		unsigned char cmd[10] = { 0 };
6751da177e4SLinus Torvalds 
6761da177e4SLinus Torvalds 		cmd[0] = SYNCHRONIZE_CACHE;
6771da177e4SLinus Torvalds 		/*
6781da177e4SLinus Torvalds 		 * Leave the rest of the command zero to indicate
6791da177e4SLinus Torvalds 		 * flush everything.
6801da177e4SLinus Torvalds 		 */
681ea73a9f2SJames Bottomley 		res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
682ea73a9f2SJames Bottomley 				       SD_TIMEOUT, SD_MAX_RETRIES);
683ea73a9f2SJames Bottomley 		if (res == 0)
6841da177e4SLinus Torvalds 			break;
6851da177e4SLinus Torvalds 	}
6861da177e4SLinus Torvalds 
687ea73a9f2SJames Bottomley 	if (res) {		printk(KERN_WARNING "FAILED\n  status = %x, message = %02x, "
6881da177e4SLinus Torvalds 				    "host = %d, driver = %02x\n  ",
6891da177e4SLinus Torvalds 				    status_byte(res), msg_byte(res),
6901da177e4SLinus Torvalds 				    host_byte(res), driver_byte(res));
6911da177e4SLinus Torvalds 			if (driver_byte(res) & DRIVER_SENSE)
692ea73a9f2SJames Bottomley 				scsi_print_sense_hdr("sd", &sshdr);
6931da177e4SLinus Torvalds 	}
6941da177e4SLinus Torvalds 
6951da177e4SLinus Torvalds 	return res;
6961da177e4SLinus Torvalds }
6971da177e4SLinus Torvalds 
6981da177e4SLinus Torvalds static int sd_issue_flush(struct device *dev, sector_t *error_sector)
6991da177e4SLinus Torvalds {
70039b7f1e2SAlan Stern 	int ret = 0;
7011da177e4SLinus Torvalds 	struct scsi_device *sdp = to_scsi_device(dev);
70239b7f1e2SAlan Stern 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
7031da177e4SLinus Torvalds 
7041da177e4SLinus Torvalds 	if (!sdkp)
7051da177e4SLinus Torvalds                return -ENODEV;
7061da177e4SLinus Torvalds 
70739b7f1e2SAlan Stern 	if (sdkp->WCE)
70839b7f1e2SAlan Stern 		ret = sd_sync_cache(sdp);
70939b7f1e2SAlan Stern 	scsi_disk_put(sdkp);
71039b7f1e2SAlan Stern 	return ret;
7111da177e4SLinus Torvalds }
7121da177e4SLinus Torvalds 
713461d4e90STejun Heo static void sd_prepare_flush(request_queue_t *q, struct request *rq)
7141da177e4SLinus Torvalds {
7151da177e4SLinus Torvalds 	memset(rq->cmd, 0, sizeof(rq->cmd));
716461d4e90STejun Heo 	rq->flags |= REQ_BLOCK_PC;
7171da177e4SLinus Torvalds 	rq->timeout = SD_TIMEOUT;
7181da177e4SLinus Torvalds 	rq->cmd[0] = SYNCHRONIZE_CACHE;
719461d4e90STejun Heo 	rq->cmd_len = 10;
7201da177e4SLinus Torvalds }
7211da177e4SLinus Torvalds 
7221da177e4SLinus Torvalds static void sd_rescan(struct device *dev)
7231da177e4SLinus Torvalds {
72439b7f1e2SAlan Stern 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
72539b7f1e2SAlan Stern 
72639b7f1e2SAlan Stern 	if (sdkp) {
7271da177e4SLinus Torvalds 		sd_revalidate_disk(sdkp->disk);
72839b7f1e2SAlan Stern 		scsi_disk_put(sdkp);
72939b7f1e2SAlan Stern 	}
7301da177e4SLinus Torvalds }
7311da177e4SLinus Torvalds 
7321da177e4SLinus Torvalds 
7331da177e4SLinus Torvalds #ifdef CONFIG_COMPAT
7341da177e4SLinus Torvalds /*
7351da177e4SLinus Torvalds  * This gets directly called from VFS. When the ioctl
7361da177e4SLinus Torvalds  * is not recognized we go back to the other translation paths.
7371da177e4SLinus Torvalds  */
7381da177e4SLinus Torvalds static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
7391da177e4SLinus Torvalds {
7401da177e4SLinus Torvalds 	struct block_device *bdev = file->f_dentry->d_inode->i_bdev;
7411da177e4SLinus Torvalds 	struct gendisk *disk = bdev->bd_disk;
7421da177e4SLinus Torvalds 	struct scsi_device *sdev = scsi_disk(disk)->device;
7431da177e4SLinus Torvalds 
7441da177e4SLinus Torvalds 	/*
7451da177e4SLinus Torvalds 	 * If we are in the middle of error recovery, don't let anyone
7461da177e4SLinus Torvalds 	 * else try and use this device.  Also, if error recovery fails, it
7471da177e4SLinus Torvalds 	 * may try and take the device offline, in which case all further
7481da177e4SLinus Torvalds 	 * access to the device is prohibited.
7491da177e4SLinus Torvalds 	 */
7501da177e4SLinus Torvalds 	if (!scsi_block_when_processing_errors(sdev))
7511da177e4SLinus Torvalds 		return -ENODEV;
7521da177e4SLinus Torvalds 
7531da177e4SLinus Torvalds 	if (sdev->host->hostt->compat_ioctl) {
7541da177e4SLinus Torvalds 		int ret;
7551da177e4SLinus Torvalds 
7561da177e4SLinus Torvalds 		ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
7571da177e4SLinus Torvalds 
7581da177e4SLinus Torvalds 		return ret;
7591da177e4SLinus Torvalds 	}
7601da177e4SLinus Torvalds 
7611da177e4SLinus Torvalds 	/*
7621da177e4SLinus Torvalds 	 * Let the static ioctl translation table take care of it.
7631da177e4SLinus Torvalds 	 */
7641da177e4SLinus Torvalds 	return -ENOIOCTLCMD;
7651da177e4SLinus Torvalds }
7661da177e4SLinus Torvalds #endif
7671da177e4SLinus Torvalds 
7681da177e4SLinus Torvalds static struct block_device_operations sd_fops = {
7691da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
7701da177e4SLinus Torvalds 	.open			= sd_open,
7711da177e4SLinus Torvalds 	.release		= sd_release,
7721da177e4SLinus Torvalds 	.ioctl			= sd_ioctl,
773a885c8c4SChristoph Hellwig 	.getgeo			= sd_getgeo,
7741da177e4SLinus Torvalds #ifdef CONFIG_COMPAT
7751da177e4SLinus Torvalds 	.compat_ioctl		= sd_compat_ioctl,
7761da177e4SLinus Torvalds #endif
7771da177e4SLinus Torvalds 	.media_changed		= sd_media_changed,
7781da177e4SLinus Torvalds 	.revalidate_disk	= sd_revalidate_disk,
7791da177e4SLinus Torvalds };
7801da177e4SLinus Torvalds 
7811da177e4SLinus Torvalds /**
7821da177e4SLinus Torvalds  *	sd_rw_intr - bottom half handler: called when the lower level
7831da177e4SLinus Torvalds  *	driver has completed (successfully or otherwise) a scsi command.
7841da177e4SLinus Torvalds  *	@SCpnt: mid-level's per command structure.
7851da177e4SLinus Torvalds  *
7861da177e4SLinus Torvalds  *	Note: potentially run from within an ISR. Must not block.
7871da177e4SLinus Torvalds  **/
7881da177e4SLinus Torvalds static void sd_rw_intr(struct scsi_cmnd * SCpnt)
7891da177e4SLinus Torvalds {
7901da177e4SLinus Torvalds 	int result = SCpnt->result;
7911da177e4SLinus Torvalds 	int this_count = SCpnt->bufflen;
7921da177e4SLinus Torvalds 	int good_bytes = (result == 0 ? this_count : 0);
7931da177e4SLinus Torvalds 	sector_t block_sectors = 1;
7941da177e4SLinus Torvalds 	u64 first_err_block;
7951da177e4SLinus Torvalds 	sector_t error_sector;
7961da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
7971da177e4SLinus Torvalds 	int sense_valid = 0;
7981da177e4SLinus Torvalds 	int sense_deferred = 0;
7991da177e4SLinus Torvalds 	int info_valid;
8001da177e4SLinus Torvalds 
8011da177e4SLinus Torvalds 	if (result) {
8021da177e4SLinus Torvalds 		sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr);
8031da177e4SLinus Torvalds 		if (sense_valid)
8041da177e4SLinus Torvalds 			sense_deferred = scsi_sense_is_deferred(&sshdr);
8051da177e4SLinus Torvalds 	}
8061da177e4SLinus Torvalds 
8071da177e4SLinus Torvalds #ifdef CONFIG_SCSI_LOGGING
8081da177e4SLinus Torvalds 	SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: %s: res=0x%x\n",
8091da177e4SLinus Torvalds 				SCpnt->request->rq_disk->disk_name, result));
8101da177e4SLinus Torvalds 	if (sense_valid) {
8111da177e4SLinus Torvalds 		SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: sb[respc,sk,asc,"
8121da177e4SLinus Torvalds 				"ascq]=%x,%x,%x,%x\n", sshdr.response_code,
8131da177e4SLinus Torvalds 				sshdr.sense_key, sshdr.asc, sshdr.ascq));
8141da177e4SLinus Torvalds 	}
8151da177e4SLinus Torvalds #endif
8161da177e4SLinus Torvalds 	/*
8171da177e4SLinus Torvalds 	   Handle MEDIUM ERRORs that indicate partial success.  Since this is a
8181da177e4SLinus Torvalds 	   relatively rare error condition, no care is taken to avoid
8191da177e4SLinus Torvalds 	   unnecessary additional work such as memcpy's that could be avoided.
8201da177e4SLinus Torvalds 	 */
821776b23a0SChristoph Hellwig 	if (driver_byte(result) != 0 &&
8221da177e4SLinus Torvalds 		 sense_valid && !sense_deferred) {
8231da177e4SLinus Torvalds 		switch (sshdr.sense_key) {
8241da177e4SLinus Torvalds 		case MEDIUM_ERROR:
8251da177e4SLinus Torvalds 			if (!blk_fs_request(SCpnt->request))
8261da177e4SLinus Torvalds 				break;
8271da177e4SLinus Torvalds 			info_valid = scsi_get_sense_info_fld(
8281da177e4SLinus Torvalds 				SCpnt->sense_buffer, SCSI_SENSE_BUFFERSIZE,
8291da177e4SLinus Torvalds 				&first_err_block);
8301da177e4SLinus Torvalds 			/*
8311da177e4SLinus Torvalds 			 * May want to warn and skip if following cast results
8321da177e4SLinus Torvalds 			 * in actual truncation (if sector_t < 64 bits)
8331da177e4SLinus Torvalds 			 */
8341da177e4SLinus Torvalds 			error_sector = (sector_t)first_err_block;
8351da177e4SLinus Torvalds 			if (SCpnt->request->bio != NULL)
8361da177e4SLinus Torvalds 				block_sectors = bio_sectors(SCpnt->request->bio);
8371da177e4SLinus Torvalds 			switch (SCpnt->device->sector_size) {
8381da177e4SLinus Torvalds 			case 1024:
8391da177e4SLinus Torvalds 				error_sector <<= 1;
8401da177e4SLinus Torvalds 				if (block_sectors < 2)
8411da177e4SLinus Torvalds 					block_sectors = 2;
8421da177e4SLinus Torvalds 				break;
8431da177e4SLinus Torvalds 			case 2048:
8441da177e4SLinus Torvalds 				error_sector <<= 2;
8451da177e4SLinus Torvalds 				if (block_sectors < 4)
8461da177e4SLinus Torvalds 					block_sectors = 4;
8471da177e4SLinus Torvalds 				break;
8481da177e4SLinus Torvalds 			case 4096:
8491da177e4SLinus Torvalds 				error_sector <<=3;
8501da177e4SLinus Torvalds 				if (block_sectors < 8)
8511da177e4SLinus Torvalds 					block_sectors = 8;
8521da177e4SLinus Torvalds 				break;
8531da177e4SLinus Torvalds 			case 256:
8541da177e4SLinus Torvalds 				error_sector >>= 1;
8551da177e4SLinus Torvalds 				break;
8561da177e4SLinus Torvalds 			default:
8571da177e4SLinus Torvalds 				break;
8581da177e4SLinus Torvalds 			}
8591da177e4SLinus Torvalds 
8601da177e4SLinus Torvalds 			error_sector &= ~(block_sectors - 1);
8611da177e4SLinus Torvalds 			good_bytes = (error_sector - SCpnt->request->sector) << 9;
8621da177e4SLinus Torvalds 			if (good_bytes < 0 || good_bytes >= this_count)
8631da177e4SLinus Torvalds 				good_bytes = 0;
8641da177e4SLinus Torvalds 			break;
8651da177e4SLinus Torvalds 
8661da177e4SLinus Torvalds 		case RECOVERED_ERROR: /* an error occurred, but it recovered */
8671da177e4SLinus Torvalds 		case NO_SENSE: /* LLDD got sense data */
8681da177e4SLinus Torvalds 			/*
8691da177e4SLinus Torvalds 			 * Inform the user, but make sure that it's not treated
8701da177e4SLinus Torvalds 			 * as a hard error.
8711da177e4SLinus Torvalds 			 */
8721da177e4SLinus Torvalds 			scsi_print_sense("sd", SCpnt);
8731da177e4SLinus Torvalds 			SCpnt->result = 0;
8741da177e4SLinus Torvalds 			memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
8751da177e4SLinus Torvalds 			good_bytes = this_count;
8761da177e4SLinus Torvalds 			break;
8771da177e4SLinus Torvalds 
8781da177e4SLinus Torvalds 		case ILLEGAL_REQUEST:
8791da177e4SLinus Torvalds 			if (SCpnt->device->use_10_for_rw &&
8801da177e4SLinus Torvalds 			    (SCpnt->cmnd[0] == READ_10 ||
8811da177e4SLinus Torvalds 			     SCpnt->cmnd[0] == WRITE_10))
8821da177e4SLinus Torvalds 				SCpnt->device->use_10_for_rw = 0;
8831da177e4SLinus Torvalds 			if (SCpnt->device->use_10_for_ms &&
8841da177e4SLinus Torvalds 			    (SCpnt->cmnd[0] == MODE_SENSE_10 ||
8851da177e4SLinus Torvalds 			     SCpnt->cmnd[0] == MODE_SELECT_10))
8861da177e4SLinus Torvalds 				SCpnt->device->use_10_for_ms = 0;
8871da177e4SLinus Torvalds 			break;
8881da177e4SLinus Torvalds 
8891da177e4SLinus Torvalds 		default:
8901da177e4SLinus Torvalds 			break;
8911da177e4SLinus Torvalds 		}
8921da177e4SLinus Torvalds 	}
8931da177e4SLinus Torvalds 	/*
8941da177e4SLinus Torvalds 	 * This calls the generic completion function, now that we know
8951da177e4SLinus Torvalds 	 * how many actual sectors finished, and how many sectors we need
8961da177e4SLinus Torvalds 	 * to say have failed.
8971da177e4SLinus Torvalds 	 */
8981da177e4SLinus Torvalds 	scsi_io_completion(SCpnt, good_bytes, block_sectors << 9);
8991da177e4SLinus Torvalds }
9001da177e4SLinus Torvalds 
901ea73a9f2SJames Bottomley static int media_not_present(struct scsi_disk *sdkp,
902ea73a9f2SJames Bottomley 			     struct scsi_sense_hdr *sshdr)
9031da177e4SLinus Torvalds {
9041da177e4SLinus Torvalds 
905ea73a9f2SJames Bottomley 	if (!scsi_sense_valid(sshdr))
9061da177e4SLinus Torvalds 		return 0;
9071da177e4SLinus Torvalds 	/* not invoked for commands that could return deferred errors */
908ea73a9f2SJames Bottomley 	if (sshdr->sense_key != NOT_READY &&
909ea73a9f2SJames Bottomley 	    sshdr->sense_key != UNIT_ATTENTION)
9101da177e4SLinus Torvalds 		return 0;
911ea73a9f2SJames Bottomley 	if (sshdr->asc != 0x3A) /* medium not present */
9121da177e4SLinus Torvalds 		return 0;
913ea73a9f2SJames Bottomley 
9141da177e4SLinus Torvalds 	set_media_not_present(sdkp);
9151da177e4SLinus Torvalds 	return 1;
9161da177e4SLinus Torvalds }
9171da177e4SLinus Torvalds 
9181da177e4SLinus Torvalds /*
9191da177e4SLinus Torvalds  * spinup disk - called only in sd_revalidate_disk()
9201da177e4SLinus Torvalds  */
9211da177e4SLinus Torvalds static void
922ea73a9f2SJames Bottomley sd_spinup_disk(struct scsi_disk *sdkp, char *diskname)
923ea73a9f2SJames Bottomley {
9241da177e4SLinus Torvalds 	unsigned char cmd[10];
9254451e472SAlan Stern 	unsigned long spintime_expire = 0;
9261da177e4SLinus Torvalds 	int retries, spintime;
9271da177e4SLinus Torvalds 	unsigned int the_result;
9281da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
9291da177e4SLinus Torvalds 	int sense_valid = 0;
9301da177e4SLinus Torvalds 
9311da177e4SLinus Torvalds 	spintime = 0;
9321da177e4SLinus Torvalds 
9331da177e4SLinus Torvalds 	/* Spin up drives, as required.  Only do this at boot time */
9341da177e4SLinus Torvalds 	/* Spinup needs to be done for module loads too. */
9351da177e4SLinus Torvalds 	do {
9361da177e4SLinus Torvalds 		retries = 0;
9371da177e4SLinus Torvalds 
9381da177e4SLinus Torvalds 		do {
9391da177e4SLinus Torvalds 			cmd[0] = TEST_UNIT_READY;
9401da177e4SLinus Torvalds 			memset((void *) &cmd[1], 0, 9);
9411da177e4SLinus Torvalds 
942ea73a9f2SJames Bottomley 			the_result = scsi_execute_req(sdkp->device, cmd,
943ea73a9f2SJames Bottomley 						      DMA_NONE, NULL, 0,
944ea73a9f2SJames Bottomley 						      &sshdr, SD_TIMEOUT,
945ea73a9f2SJames Bottomley 						      SD_MAX_RETRIES);
9461da177e4SLinus Torvalds 
9471da177e4SLinus Torvalds 			if (the_result)
948ea73a9f2SJames Bottomley 				sense_valid = scsi_sense_valid(&sshdr);
9491da177e4SLinus Torvalds 			retries++;
9501da177e4SLinus Torvalds 		} while (retries < 3 &&
9511da177e4SLinus Torvalds 			 (!scsi_status_is_good(the_result) ||
9521da177e4SLinus Torvalds 			  ((driver_byte(the_result) & DRIVER_SENSE) &&
9531da177e4SLinus Torvalds 			  sense_valid && sshdr.sense_key == UNIT_ATTENTION)));
9541da177e4SLinus Torvalds 
9551da177e4SLinus Torvalds 		/*
9561da177e4SLinus Torvalds 		 * If the drive has indicated to us that it doesn't have
9571da177e4SLinus Torvalds 		 * any media in it, don't bother with any of the rest of
9581da177e4SLinus Torvalds 		 * this crap.
9591da177e4SLinus Torvalds 		 */
960ea73a9f2SJames Bottomley 		if (media_not_present(sdkp, &sshdr))
9611da177e4SLinus Torvalds 			return;
9621da177e4SLinus Torvalds 
9631da177e4SLinus Torvalds 		if ((driver_byte(the_result) & DRIVER_SENSE) == 0) {
9641da177e4SLinus Torvalds 			/* no sense, TUR either succeeded or failed
9651da177e4SLinus Torvalds 			 * with a status error */
9661da177e4SLinus Torvalds 			if(!spintime && !scsi_status_is_good(the_result))
9671da177e4SLinus Torvalds 				printk(KERN_NOTICE "%s: Unit Not Ready, "
9681da177e4SLinus Torvalds 				       "error = 0x%x\n", diskname, the_result);
9691da177e4SLinus Torvalds 			break;
9701da177e4SLinus Torvalds 		}
9711da177e4SLinus Torvalds 
9721da177e4SLinus Torvalds 		/*
9731da177e4SLinus Torvalds 		 * The device does not want the automatic start to be issued.
9741da177e4SLinus Torvalds 		 */
9751da177e4SLinus Torvalds 		if (sdkp->device->no_start_on_add) {
9761da177e4SLinus Torvalds 			break;
9771da177e4SLinus Torvalds 		}
9781da177e4SLinus Torvalds 
9791da177e4SLinus Torvalds 		/*
9801da177e4SLinus Torvalds 		 * If manual intervention is required, or this is an
9811da177e4SLinus Torvalds 		 * absent USB storage device, a spinup is meaningless.
9821da177e4SLinus Torvalds 		 */
9831da177e4SLinus Torvalds 		if (sense_valid &&
9841da177e4SLinus Torvalds 		    sshdr.sense_key == NOT_READY &&
9851da177e4SLinus Torvalds 		    sshdr.asc == 4 && sshdr.ascq == 3) {
9861da177e4SLinus Torvalds 			break;		/* manual intervention required */
9871da177e4SLinus Torvalds 
9881da177e4SLinus Torvalds 		/*
9891da177e4SLinus Torvalds 		 * Issue command to spin up drive when not ready
9901da177e4SLinus Torvalds 		 */
9911da177e4SLinus Torvalds 		} else if (sense_valid && sshdr.sense_key == NOT_READY) {
9921da177e4SLinus Torvalds 			if (!spintime) {
9931da177e4SLinus Torvalds 				printk(KERN_NOTICE "%s: Spinning up disk...",
9941da177e4SLinus Torvalds 				       diskname);
9951da177e4SLinus Torvalds 				cmd[0] = START_STOP;
9961da177e4SLinus Torvalds 				cmd[1] = 1;	/* Return immediately */
9971da177e4SLinus Torvalds 				memset((void *) &cmd[2], 0, 8);
9981da177e4SLinus Torvalds 				cmd[4] = 1;	/* Start spin cycle */
999ea73a9f2SJames Bottomley 				scsi_execute_req(sdkp->device, cmd, DMA_NONE,
1000ea73a9f2SJames Bottomley 						 NULL, 0, &sshdr,
10011da177e4SLinus Torvalds 						 SD_TIMEOUT, SD_MAX_RETRIES);
10024451e472SAlan Stern 				spintime_expire = jiffies + 100 * HZ;
10031da177e4SLinus Torvalds 				spintime = 1;
10044451e472SAlan Stern 			}
10051da177e4SLinus Torvalds 			/* Wait 1 second for next try */
10061da177e4SLinus Torvalds 			msleep(1000);
10071da177e4SLinus Torvalds 			printk(".");
10084451e472SAlan Stern 
10094451e472SAlan Stern 		/*
10104451e472SAlan Stern 		 * Wait for USB flash devices with slow firmware.
10114451e472SAlan Stern 		 * Yes, this sense key/ASC combination shouldn't
10124451e472SAlan Stern 		 * occur here.  It's characteristic of these devices.
10134451e472SAlan Stern 		 */
10144451e472SAlan Stern 		} else if (sense_valid &&
10154451e472SAlan Stern 				sshdr.sense_key == UNIT_ATTENTION &&
10164451e472SAlan Stern 				sshdr.asc == 0x28) {
10174451e472SAlan Stern 			if (!spintime) {
10184451e472SAlan Stern 				spintime_expire = jiffies + 5 * HZ;
10194451e472SAlan Stern 				spintime = 1;
10204451e472SAlan Stern 			}
10214451e472SAlan Stern 			/* Wait 1 second for next try */
10224451e472SAlan Stern 			msleep(1000);
10231da177e4SLinus Torvalds 		} else {
10241da177e4SLinus Torvalds 			/* we don't understand the sense code, so it's
10251da177e4SLinus Torvalds 			 * probably pointless to loop */
10261da177e4SLinus Torvalds 			if(!spintime) {
10271da177e4SLinus Torvalds 				printk(KERN_NOTICE "%s: Unit Not Ready, "
10281da177e4SLinus Torvalds 					"sense:\n", diskname);
1029ea73a9f2SJames Bottomley 				scsi_print_sense_hdr("", &sshdr);
10301da177e4SLinus Torvalds 			}
10311da177e4SLinus Torvalds 			break;
10321da177e4SLinus Torvalds 		}
10331da177e4SLinus Torvalds 
10344451e472SAlan Stern 	} while (spintime && time_before_eq(jiffies, spintime_expire));
10351da177e4SLinus Torvalds 
10361da177e4SLinus Torvalds 	if (spintime) {
10371da177e4SLinus Torvalds 		if (scsi_status_is_good(the_result))
10381da177e4SLinus Torvalds 			printk("ready\n");
10391da177e4SLinus Torvalds 		else
10401da177e4SLinus Torvalds 			printk("not responding...\n");
10411da177e4SLinus Torvalds 	}
10421da177e4SLinus Torvalds }
10431da177e4SLinus Torvalds 
10441da177e4SLinus Torvalds /*
10451da177e4SLinus Torvalds  * read disk capacity
10461da177e4SLinus Torvalds  */
10471da177e4SLinus Torvalds static void
10481da177e4SLinus Torvalds sd_read_capacity(struct scsi_disk *sdkp, char *diskname,
1049ea73a9f2SJames Bottomley 		 unsigned char *buffer)
1050ea73a9f2SJames Bottomley {
10511da177e4SLinus Torvalds 	unsigned char cmd[16];
10521da177e4SLinus Torvalds 	int the_result, retries;
10531da177e4SLinus Torvalds 	int sector_size = 0;
10541da177e4SLinus Torvalds 	int longrc = 0;
10551da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
10561da177e4SLinus Torvalds 	int sense_valid = 0;
1057ea73a9f2SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
10581da177e4SLinus Torvalds 
10591da177e4SLinus Torvalds repeat:
10601da177e4SLinus Torvalds 	retries = 3;
10611da177e4SLinus Torvalds 	do {
10621da177e4SLinus Torvalds 		if (longrc) {
10631da177e4SLinus Torvalds 			memset((void *) cmd, 0, 16);
10641da177e4SLinus Torvalds 			cmd[0] = SERVICE_ACTION_IN;
10651da177e4SLinus Torvalds 			cmd[1] = SAI_READ_CAPACITY_16;
10661da177e4SLinus Torvalds 			cmd[13] = 12;
10671da177e4SLinus Torvalds 			memset((void *) buffer, 0, 12);
10681da177e4SLinus Torvalds 		} else {
10691da177e4SLinus Torvalds 			cmd[0] = READ_CAPACITY;
10701da177e4SLinus Torvalds 			memset((void *) &cmd[1], 0, 9);
10711da177e4SLinus Torvalds 			memset((void *) buffer, 0, 8);
10721da177e4SLinus Torvalds 		}
10731da177e4SLinus Torvalds 
1074ea73a9f2SJames Bottomley 		the_result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE,
1075ea73a9f2SJames Bottomley 					      buffer, longrc ? 12 : 8, &sshdr,
1076ea73a9f2SJames Bottomley 					      SD_TIMEOUT, SD_MAX_RETRIES);
10771da177e4SLinus Torvalds 
1078ea73a9f2SJames Bottomley 		if (media_not_present(sdkp, &sshdr))
10791da177e4SLinus Torvalds 			return;
10801da177e4SLinus Torvalds 
10811da177e4SLinus Torvalds 		if (the_result)
1082ea73a9f2SJames Bottomley 			sense_valid = scsi_sense_valid(&sshdr);
10831da177e4SLinus Torvalds 		retries--;
10841da177e4SLinus Torvalds 
10851da177e4SLinus Torvalds 	} while (the_result && retries);
10861da177e4SLinus Torvalds 
10871da177e4SLinus Torvalds 	if (the_result && !longrc) {
10881da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s : READ CAPACITY failed.\n"
10891da177e4SLinus Torvalds 		       "%s : status=%x, message=%02x, host=%d, driver=%02x \n",
10901da177e4SLinus Torvalds 		       diskname, diskname,
10911da177e4SLinus Torvalds 		       status_byte(the_result),
10921da177e4SLinus Torvalds 		       msg_byte(the_result),
10931da177e4SLinus Torvalds 		       host_byte(the_result),
10941da177e4SLinus Torvalds 		       driver_byte(the_result));
10951da177e4SLinus Torvalds 
10961da177e4SLinus Torvalds 		if (driver_byte(the_result) & DRIVER_SENSE)
1097ea73a9f2SJames Bottomley 			scsi_print_sense_hdr("sd", &sshdr);
10981da177e4SLinus Torvalds 		else
10991da177e4SLinus Torvalds 			printk("%s : sense not available. \n", diskname);
11001da177e4SLinus Torvalds 
11011da177e4SLinus Torvalds 		/* Set dirty bit for removable devices if not ready -
11021da177e4SLinus Torvalds 		 * sometimes drives will not report this properly. */
11031da177e4SLinus Torvalds 		if (sdp->removable &&
11041da177e4SLinus Torvalds 		    sense_valid && sshdr.sense_key == NOT_READY)
11051da177e4SLinus Torvalds 			sdp->changed = 1;
11061da177e4SLinus Torvalds 
11071da177e4SLinus Torvalds 		/* Either no media are present but the drive didn't tell us,
11081da177e4SLinus Torvalds 		   or they are present but the read capacity command fails */
11091da177e4SLinus Torvalds 		/* sdkp->media_present = 0; -- not always correct */
11101da177e4SLinus Torvalds 		sdkp->capacity = 0x200000; /* 1 GB - random */
11111da177e4SLinus Torvalds 
11121da177e4SLinus Torvalds 		return;
11131da177e4SLinus Torvalds 	} else if (the_result && longrc) {
11141da177e4SLinus Torvalds 		/* READ CAPACITY(16) has been failed */
11151da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s : READ CAPACITY(16) failed.\n"
11161da177e4SLinus Torvalds 		       "%s : status=%x, message=%02x, host=%d, driver=%02x \n",
11171da177e4SLinus Torvalds 		       diskname, diskname,
11181da177e4SLinus Torvalds 		       status_byte(the_result),
11191da177e4SLinus Torvalds 		       msg_byte(the_result),
11201da177e4SLinus Torvalds 		       host_byte(the_result),
11211da177e4SLinus Torvalds 		       driver_byte(the_result));
11221da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s : use 0xffffffff as device size\n",
11231da177e4SLinus Torvalds 		       diskname);
11241da177e4SLinus Torvalds 
11251da177e4SLinus Torvalds 		sdkp->capacity = 1 + (sector_t) 0xffffffff;
11261da177e4SLinus Torvalds 		goto got_data;
11271da177e4SLinus Torvalds 	}
11281da177e4SLinus Torvalds 
11291da177e4SLinus Torvalds 	if (!longrc) {
11301da177e4SLinus Torvalds 		sector_size = (buffer[4] << 24) |
11311da177e4SLinus Torvalds 			(buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
11321da177e4SLinus Torvalds 		if (buffer[0] == 0xff && buffer[1] == 0xff &&
11331da177e4SLinus Torvalds 		    buffer[2] == 0xff && buffer[3] == 0xff) {
11341da177e4SLinus Torvalds 			if(sizeof(sdkp->capacity) > 4) {
11351da177e4SLinus Torvalds 				printk(KERN_NOTICE "%s : very big device. try to use"
11361da177e4SLinus Torvalds 				       " READ CAPACITY(16).\n", diskname);
11371da177e4SLinus Torvalds 				longrc = 1;
11381da177e4SLinus Torvalds 				goto repeat;
11391da177e4SLinus Torvalds 			}
11401da177e4SLinus Torvalds 			printk(KERN_ERR "%s: too big for this kernel.  Use a "
11411da177e4SLinus Torvalds 			       "kernel compiled with support for large block "
11421da177e4SLinus Torvalds 			       "devices.\n", diskname);
11431da177e4SLinus Torvalds 			sdkp->capacity = 0;
11441da177e4SLinus Torvalds 			goto got_data;
11451da177e4SLinus Torvalds 		}
11461da177e4SLinus Torvalds 		sdkp->capacity = 1 + (((sector_t)buffer[0] << 24) |
11471da177e4SLinus Torvalds 			(buffer[1] << 16) |
11481da177e4SLinus Torvalds 			(buffer[2] << 8) |
11491da177e4SLinus Torvalds 			buffer[3]);
11501da177e4SLinus Torvalds 	} else {
11511da177e4SLinus Torvalds 		sdkp->capacity = 1 + (((u64)buffer[0] << 56) |
11521da177e4SLinus Torvalds 			((u64)buffer[1] << 48) |
11531da177e4SLinus Torvalds 			((u64)buffer[2] << 40) |
11541da177e4SLinus Torvalds 			((u64)buffer[3] << 32) |
11551da177e4SLinus Torvalds 			((sector_t)buffer[4] << 24) |
11561da177e4SLinus Torvalds 			((sector_t)buffer[5] << 16) |
11571da177e4SLinus Torvalds 			((sector_t)buffer[6] << 8)  |
11581da177e4SLinus Torvalds 			(sector_t)buffer[7]);
11591da177e4SLinus Torvalds 
11601da177e4SLinus Torvalds 		sector_size = (buffer[8] << 24) |
11611da177e4SLinus Torvalds 			(buffer[9] << 16) | (buffer[10] << 8) | buffer[11];
11621da177e4SLinus Torvalds 	}
11631da177e4SLinus Torvalds 
11641da177e4SLinus Torvalds 	/* Some devices return the total number of sectors, not the
11651da177e4SLinus Torvalds 	 * highest sector number.  Make the necessary adjustment. */
11661da177e4SLinus Torvalds 	if (sdp->fix_capacity)
11671da177e4SLinus Torvalds 		--sdkp->capacity;
11681da177e4SLinus Torvalds 
11691da177e4SLinus Torvalds got_data:
11701da177e4SLinus Torvalds 	if (sector_size == 0) {
11711da177e4SLinus Torvalds 		sector_size = 512;
11721da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s : sector size 0 reported, "
11731da177e4SLinus Torvalds 		       "assuming 512.\n", diskname);
11741da177e4SLinus Torvalds 	}
11751da177e4SLinus Torvalds 
11761da177e4SLinus Torvalds 	if (sector_size != 512 &&
11771da177e4SLinus Torvalds 	    sector_size != 1024 &&
11781da177e4SLinus Torvalds 	    sector_size != 2048 &&
11791da177e4SLinus Torvalds 	    sector_size != 4096 &&
11801da177e4SLinus Torvalds 	    sector_size != 256) {
11811da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s : unsupported sector size "
11821da177e4SLinus Torvalds 		       "%d.\n", diskname, sector_size);
11831da177e4SLinus Torvalds 		/*
11841da177e4SLinus Torvalds 		 * The user might want to re-format the drive with
11851da177e4SLinus Torvalds 		 * a supported sectorsize.  Once this happens, it
11861da177e4SLinus Torvalds 		 * would be relatively trivial to set the thing up.
11871da177e4SLinus Torvalds 		 * For this reason, we leave the thing in the table.
11881da177e4SLinus Torvalds 		 */
11891da177e4SLinus Torvalds 		sdkp->capacity = 0;
11901da177e4SLinus Torvalds 		/*
11911da177e4SLinus Torvalds 		 * set a bogus sector size so the normal read/write
11921da177e4SLinus Torvalds 		 * logic in the block layer will eventually refuse any
11931da177e4SLinus Torvalds 		 * request on this device without tripping over power
11941da177e4SLinus Torvalds 		 * of two sector size assumptions
11951da177e4SLinus Torvalds 		 */
11961da177e4SLinus Torvalds 		sector_size = 512;
11971da177e4SLinus Torvalds 	}
11981da177e4SLinus Torvalds 	{
11991da177e4SLinus Torvalds 		/*
12001da177e4SLinus Torvalds 		 * The msdos fs needs to know the hardware sector size
12011da177e4SLinus Torvalds 		 * So I have created this table. See ll_rw_blk.c
12021da177e4SLinus Torvalds 		 * Jacques Gelinas (Jacques@solucorp.qc.ca)
12031da177e4SLinus Torvalds 		 */
12041da177e4SLinus Torvalds 		int hard_sector = sector_size;
12057a691bd3SJames Bottomley 		sector_t sz = (sdkp->capacity/2) * (hard_sector/256);
12061da177e4SLinus Torvalds 		request_queue_t *queue = sdp->request_queue;
12077a691bd3SJames Bottomley 		sector_t mb = sz;
12081da177e4SLinus Torvalds 
12091da177e4SLinus Torvalds 		blk_queue_hardsect_size(queue, hard_sector);
12101da177e4SLinus Torvalds 		/* avoid 64-bit division on 32-bit platforms */
12117a691bd3SJames Bottomley 		sector_div(sz, 625);
12121da177e4SLinus Torvalds 		mb -= sz - 974;
12131da177e4SLinus Torvalds 		sector_div(mb, 1950);
12141da177e4SLinus Torvalds 
12151da177e4SLinus Torvalds 		printk(KERN_NOTICE "SCSI device %s: "
12161da177e4SLinus Torvalds 		       "%llu %d-byte hdwr sectors (%llu MB)\n",
12171da177e4SLinus Torvalds 		       diskname, (unsigned long long)sdkp->capacity,
12181da177e4SLinus Torvalds 		       hard_sector, (unsigned long long)mb);
12191da177e4SLinus Torvalds 	}
12201da177e4SLinus Torvalds 
12211da177e4SLinus Torvalds 	/* Rescale capacity to 512-byte units */
12221da177e4SLinus Torvalds 	if (sector_size == 4096)
12231da177e4SLinus Torvalds 		sdkp->capacity <<= 3;
12241da177e4SLinus Torvalds 	else if (sector_size == 2048)
12251da177e4SLinus Torvalds 		sdkp->capacity <<= 2;
12261da177e4SLinus Torvalds 	else if (sector_size == 1024)
12271da177e4SLinus Torvalds 		sdkp->capacity <<= 1;
12281da177e4SLinus Torvalds 	else if (sector_size == 256)
12291da177e4SLinus Torvalds 		sdkp->capacity >>= 1;
12301da177e4SLinus Torvalds 
12311da177e4SLinus Torvalds 	sdkp->device->sector_size = sector_size;
12321da177e4SLinus Torvalds }
12331da177e4SLinus Torvalds 
12341da177e4SLinus Torvalds /* called with buffer of length 512 */
12351da177e4SLinus Torvalds static inline int
1236ea73a9f2SJames Bottomley sd_do_mode_sense(struct scsi_device *sdp, int dbd, int modepage,
1237ea73a9f2SJames Bottomley 		 unsigned char *buffer, int len, struct scsi_mode_data *data,
1238ea73a9f2SJames Bottomley 		 struct scsi_sense_hdr *sshdr)
12391da177e4SLinus Torvalds {
1240ea73a9f2SJames Bottomley 	return scsi_mode_sense(sdp, dbd, modepage, buffer, len,
12411cf72699SJames Bottomley 			       SD_TIMEOUT, SD_MAX_RETRIES, data,
1242ea73a9f2SJames Bottomley 			       sshdr);
12431da177e4SLinus Torvalds }
12441da177e4SLinus Torvalds 
12451da177e4SLinus Torvalds /*
12461da177e4SLinus Torvalds  * read write protect setting, if possible - called only in sd_revalidate_disk()
124748970800SAl Viro  * called with buffer of length SD_BUF_SIZE
12481da177e4SLinus Torvalds  */
12491da177e4SLinus Torvalds static void
12501da177e4SLinus Torvalds sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname,
1251ea73a9f2SJames Bottomley 			   unsigned char *buffer)
1252ea73a9f2SJames Bottomley {
12531da177e4SLinus Torvalds 	int res;
1254ea73a9f2SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
12551da177e4SLinus Torvalds 	struct scsi_mode_data data;
12561da177e4SLinus Torvalds 
12571da177e4SLinus Torvalds 	set_disk_ro(sdkp->disk, 0);
1258ea73a9f2SJames Bottomley 	if (sdp->skip_ms_page_3f) {
12591da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s: assuming Write Enabled\n", diskname);
12601da177e4SLinus Torvalds 		return;
12611da177e4SLinus Torvalds 	}
12621da177e4SLinus Torvalds 
1263ea73a9f2SJames Bottomley 	if (sdp->use_192_bytes_for_3f) {
1264ea73a9f2SJames Bottomley 		res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 192, &data, NULL);
12651da177e4SLinus Torvalds 	} else {
12661da177e4SLinus Torvalds 		/*
12671da177e4SLinus Torvalds 		 * First attempt: ask for all pages (0x3F), but only 4 bytes.
12681da177e4SLinus Torvalds 		 * We have to start carefully: some devices hang if we ask
12691da177e4SLinus Torvalds 		 * for more than is available.
12701da177e4SLinus Torvalds 		 */
1271ea73a9f2SJames Bottomley 		res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 4, &data, NULL);
12721da177e4SLinus Torvalds 
12731da177e4SLinus Torvalds 		/*
12741da177e4SLinus Torvalds 		 * Second attempt: ask for page 0 When only page 0 is
12751da177e4SLinus Torvalds 		 * implemented, a request for page 3F may return Sense Key
12761da177e4SLinus Torvalds 		 * 5: Illegal Request, Sense Code 24: Invalid field in
12771da177e4SLinus Torvalds 		 * CDB.
12781da177e4SLinus Torvalds 		 */
12791da177e4SLinus Torvalds 		if (!scsi_status_is_good(res))
1280ea73a9f2SJames Bottomley 			res = sd_do_mode_sense(sdp, 0, 0, buffer, 4, &data, NULL);
12811da177e4SLinus Torvalds 
12821da177e4SLinus Torvalds 		/*
12831da177e4SLinus Torvalds 		 * Third attempt: ask 255 bytes, as we did earlier.
12841da177e4SLinus Torvalds 		 */
12851da177e4SLinus Torvalds 		if (!scsi_status_is_good(res))
1286ea73a9f2SJames Bottomley 			res = sd_do_mode_sense(sdp, 0, 0x3F, buffer, 255,
1287ea73a9f2SJames Bottomley 					       &data, NULL);
12881da177e4SLinus Torvalds 	}
12891da177e4SLinus Torvalds 
12901da177e4SLinus Torvalds 	if (!scsi_status_is_good(res)) {
12911da177e4SLinus Torvalds 		printk(KERN_WARNING
12921da177e4SLinus Torvalds 		       "%s: test WP failed, assume Write Enabled\n", diskname);
12931da177e4SLinus Torvalds 	} else {
12941da177e4SLinus Torvalds 		sdkp->write_prot = ((data.device_specific & 0x80) != 0);
12951da177e4SLinus Torvalds 		set_disk_ro(sdkp->disk, sdkp->write_prot);
12961da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s: Write Protect is %s\n", diskname,
12971da177e4SLinus Torvalds 		       sdkp->write_prot ? "on" : "off");
12981da177e4SLinus Torvalds 		printk(KERN_DEBUG "%s: Mode Sense: %02x %02x %02x %02x\n",
12991da177e4SLinus Torvalds 		       diskname, buffer[0], buffer[1], buffer[2], buffer[3]);
13001da177e4SLinus Torvalds 	}
13011da177e4SLinus Torvalds }
13021da177e4SLinus Torvalds 
13031da177e4SLinus Torvalds /*
13041da177e4SLinus Torvalds  * sd_read_cache_type - called only from sd_revalidate_disk()
130548970800SAl Viro  * called with buffer of length SD_BUF_SIZE
13061da177e4SLinus Torvalds  */
13071da177e4SLinus Torvalds static void
13081da177e4SLinus Torvalds sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
1309ea73a9f2SJames Bottomley 		   unsigned char *buffer)
1310631e8a13SAl Viro  {
13111da177e4SLinus Torvalds 	int len = 0, res;
1312ea73a9f2SJames Bottomley 	struct scsi_device *sdp = sdkp->device;
13131da177e4SLinus Torvalds 
1314631e8a13SAl Viro  	int dbd;
1315631e8a13SAl Viro  	int modepage;
13161da177e4SLinus Torvalds 	struct scsi_mode_data data;
13171da177e4SLinus Torvalds 	struct scsi_sense_hdr sshdr;
13181da177e4SLinus Torvalds 
1319ea73a9f2SJames Bottomley 	if (sdp->skip_ms_page_8)
13201da177e4SLinus Torvalds 		goto defaults;
13211da177e4SLinus Torvalds 
1322ea73a9f2SJames Bottomley 	if (sdp->type == TYPE_RBC) {
1323631e8a13SAl Viro  		modepage = 6;
1324631e8a13SAl Viro  		dbd = 8;
1325631e8a13SAl Viro  	} else {
1326631e8a13SAl Viro  		modepage = 8;
1327631e8a13SAl Viro  		dbd = 0;
1328631e8a13SAl Viro  	}
1329631e8a13SAl Viro  
13301da177e4SLinus Torvalds 	/* cautiously ask */
1331ea73a9f2SJames Bottomley 	res = sd_do_mode_sense(sdp, dbd, modepage, buffer, 4, &data, &sshdr);
13321da177e4SLinus Torvalds 
13331da177e4SLinus Torvalds 	if (!scsi_status_is_good(res))
13341da177e4SLinus Torvalds 		goto bad_sense;
13351da177e4SLinus Torvalds 
13361da177e4SLinus Torvalds 	/* that went OK, now ask for the proper length */
13371da177e4SLinus Torvalds 	len = data.length;
13381da177e4SLinus Torvalds 
13391da177e4SLinus Torvalds 	/*
13401da177e4SLinus Torvalds 	 * We're only interested in the first three bytes, actually.
13411da177e4SLinus Torvalds 	 * But the data cache page is defined for the first 20.
13421da177e4SLinus Torvalds 	 */
13431da177e4SLinus Torvalds 	if (len < 3)
13441da177e4SLinus Torvalds 		goto bad_sense;
13451da177e4SLinus Torvalds 	if (len > 20)
13461da177e4SLinus Torvalds 		len = 20;
13471da177e4SLinus Torvalds 
13481da177e4SLinus Torvalds 	/* Take headers and block descriptors into account */
13491da177e4SLinus Torvalds 	len += data.header_length + data.block_descriptor_length;
135048970800SAl Viro 	if (len > SD_BUF_SIZE)
135148970800SAl Viro 		goto bad_sense;
13521da177e4SLinus Torvalds 
13531da177e4SLinus Torvalds 	/* Get the data */
1354ea73a9f2SJames Bottomley 	res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr);
13551da177e4SLinus Torvalds 
13561da177e4SLinus Torvalds 	if (scsi_status_is_good(res)) {
13571da177e4SLinus Torvalds 		const char *types[] = {
13581da177e4SLinus Torvalds 			"write through", "none", "write back",
13591da177e4SLinus Torvalds 			"write back, no read (daft)"
13601da177e4SLinus Torvalds 		};
13611da177e4SLinus Torvalds 		int ct = 0;
1362631e8a13SAl Viro  		int offset = data.header_length + data.block_descriptor_length;
13631da177e4SLinus Torvalds 
136448970800SAl Viro 		if (offset >= SD_BUF_SIZE - 2) {
136548970800SAl Viro 			printk(KERN_ERR "%s: malformed MODE SENSE response",
136648970800SAl Viro 				diskname);
136748970800SAl Viro 			goto defaults;
136848970800SAl Viro 		}
136948970800SAl Viro 
1370631e8a13SAl Viro  		if ((buffer[offset] & 0x3f) != modepage) {
1371631e8a13SAl Viro  			printk(KERN_ERR "%s: got wrong page\n", diskname);
1372631e8a13SAl Viro  			goto defaults;
1373631e8a13SAl Viro  		}
1374631e8a13SAl Viro  
1375631e8a13SAl Viro  		if (modepage == 8) {
1376631e8a13SAl Viro  			sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
1377631e8a13SAl Viro  			sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0);
1378631e8a13SAl Viro  		} else {
1379631e8a13SAl Viro  			sdkp->WCE = ((buffer[offset + 2] & 0x01) == 0);
1380631e8a13SAl Viro  			sdkp->RCD = 0;
1381631e8a13SAl Viro  		}
13821da177e4SLinus Torvalds 
1383007365adSTejun Heo 		sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
1384007365adSTejun Heo 		if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
1385007365adSTejun Heo 			printk(KERN_NOTICE "SCSI device %s: uses "
1386007365adSTejun Heo 			       "READ/WRITE(6), disabling FUA\n", diskname);
1387007365adSTejun Heo 			sdkp->DPOFUA = 0;
1388007365adSTejun Heo 		}
1389007365adSTejun Heo 
13901da177e4SLinus Torvalds 		ct =  sdkp->RCD + 2*sdkp->WCE;
13911da177e4SLinus Torvalds 
1392007365adSTejun Heo 		printk(KERN_NOTICE "SCSI device %s: drive cache: %s%s\n",
1393007365adSTejun Heo 		       diskname, types[ct],
1394007365adSTejun Heo 		       sdkp->DPOFUA ? " w/ FUA" : "");
13951da177e4SLinus Torvalds 
13961da177e4SLinus Torvalds 		return;
13971da177e4SLinus Torvalds 	}
13981da177e4SLinus Torvalds 
13991da177e4SLinus Torvalds bad_sense:
1400ea73a9f2SJames Bottomley 	if (scsi_sense_valid(&sshdr) &&
14011da177e4SLinus Torvalds 	    sshdr.sense_key == ILLEGAL_REQUEST &&
14021da177e4SLinus Torvalds 	    sshdr.asc == 0x24 && sshdr.ascq == 0x0)
14031da177e4SLinus Torvalds 		printk(KERN_NOTICE "%s: cache data unavailable\n",
14041da177e4SLinus Torvalds 		       diskname);	/* Invalid field in CDB */
14051da177e4SLinus Torvalds 	else
14061da177e4SLinus Torvalds 		printk(KERN_ERR "%s: asking for cache data failed\n",
14071da177e4SLinus Torvalds 		       diskname);
14081da177e4SLinus Torvalds 
14091da177e4SLinus Torvalds defaults:
14101da177e4SLinus Torvalds 	printk(KERN_ERR "%s: assuming drive cache: write through\n",
14111da177e4SLinus Torvalds 	       diskname);
14121da177e4SLinus Torvalds 	sdkp->WCE = 0;
14131da177e4SLinus Torvalds 	sdkp->RCD = 0;
141448970800SAl Viro 	sdkp->DPOFUA = 0;
14151da177e4SLinus Torvalds }
14161da177e4SLinus Torvalds 
14171da177e4SLinus Torvalds /**
14181da177e4SLinus Torvalds  *	sd_revalidate_disk - called the first time a new disk is seen,
14191da177e4SLinus Torvalds  *	performs disk spin up, read_capacity, etc.
14201da177e4SLinus Torvalds  *	@disk: struct gendisk we care about
14211da177e4SLinus Torvalds  **/
14221da177e4SLinus Torvalds static int sd_revalidate_disk(struct gendisk *disk)
14231da177e4SLinus Torvalds {
14241da177e4SLinus Torvalds 	struct scsi_disk *sdkp = scsi_disk(disk);
14251da177e4SLinus Torvalds 	struct scsi_device *sdp = sdkp->device;
14261da177e4SLinus Torvalds 	unsigned char *buffer;
1427461d4e90STejun Heo 	unsigned ordered;
14281da177e4SLinus Torvalds 
14291da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("sd_revalidate_disk: disk=%s\n", disk->disk_name));
14301da177e4SLinus Torvalds 
14311da177e4SLinus Torvalds 	/*
14321da177e4SLinus Torvalds 	 * If the device is offline, don't try and read capacity or any
14331da177e4SLinus Torvalds 	 * of the other niceties.
14341da177e4SLinus Torvalds 	 */
14351da177e4SLinus Torvalds 	if (!scsi_device_online(sdp))
14361da177e4SLinus Torvalds 		goto out;
14371da177e4SLinus Torvalds 
143848970800SAl Viro 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL | __GFP_DMA);
14391da177e4SLinus Torvalds 	if (!buffer) {
14401da177e4SLinus Torvalds 		printk(KERN_WARNING "(sd_revalidate_disk:) Memory allocation "
14411da177e4SLinus Torvalds 		       "failure.\n");
1442ea73a9f2SJames Bottomley 		goto out;
14431da177e4SLinus Torvalds 	}
14441da177e4SLinus Torvalds 
14451da177e4SLinus Torvalds 	/* defaults, until the device tells us otherwise */
14461da177e4SLinus Torvalds 	sdp->sector_size = 512;
14471da177e4SLinus Torvalds 	sdkp->capacity = 0;
14481da177e4SLinus Torvalds 	sdkp->media_present = 1;
14491da177e4SLinus Torvalds 	sdkp->write_prot = 0;
14501da177e4SLinus Torvalds 	sdkp->WCE = 0;
14511da177e4SLinus Torvalds 	sdkp->RCD = 0;
14521da177e4SLinus Torvalds 
1453ea73a9f2SJames Bottomley 	sd_spinup_disk(sdkp, disk->disk_name);
14541da177e4SLinus Torvalds 
14551da177e4SLinus Torvalds 	/*
14561da177e4SLinus Torvalds 	 * Without media there is no reason to ask; moreover, some devices
14571da177e4SLinus Torvalds 	 * react badly if we do.
14581da177e4SLinus Torvalds 	 */
14591da177e4SLinus Torvalds 	if (sdkp->media_present) {
1460ea73a9f2SJames Bottomley 		sd_read_capacity(sdkp, disk->disk_name, buffer);
146138d76df2SAlan Stern 		sd_read_write_protect_flag(sdkp, disk->disk_name, buffer);
1462ea73a9f2SJames Bottomley 		sd_read_cache_type(sdkp, disk->disk_name, buffer);
14631da177e4SLinus Torvalds 	}
14641da177e4SLinus Torvalds 
1465461d4e90STejun Heo 	/*
1466461d4e90STejun Heo 	 * We now have all cache related info, determine how we deal
1467461d4e90STejun Heo 	 * with ordered requests.  Note that as the current SCSI
1468461d4e90STejun Heo 	 * dispatch function can alter request order, we cannot use
1469461d4e90STejun Heo 	 * QUEUE_ORDERED_TAG_* even when ordered tag is supported.
1470461d4e90STejun Heo 	 */
1471461d4e90STejun Heo 	if (sdkp->WCE)
1472007365adSTejun Heo 		ordered = sdkp->DPOFUA
1473007365adSTejun Heo 			? QUEUE_ORDERED_DRAIN_FUA : QUEUE_ORDERED_DRAIN_FLUSH;
1474461d4e90STejun Heo 	else
1475461d4e90STejun Heo 		ordered = QUEUE_ORDERED_DRAIN;
1476461d4e90STejun Heo 
1477461d4e90STejun Heo 	blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush);
1478461d4e90STejun Heo 
14791da177e4SLinus Torvalds 	set_capacity(disk, sdkp->capacity);
14801da177e4SLinus Torvalds 	kfree(buffer);
14811da177e4SLinus Torvalds 
14821da177e4SLinus Torvalds  out:
14831da177e4SLinus Torvalds 	return 0;
14841da177e4SLinus Torvalds }
14851da177e4SLinus Torvalds 
14861da177e4SLinus Torvalds /**
14871da177e4SLinus Torvalds  *	sd_probe - called during driver initialization and whenever a
14881da177e4SLinus Torvalds  *	new scsi device is attached to the system. It is called once
14891da177e4SLinus Torvalds  *	for each scsi device (not just disks) present.
14901da177e4SLinus Torvalds  *	@dev: pointer to device object
14911da177e4SLinus Torvalds  *
14921da177e4SLinus Torvalds  *	Returns 0 if successful (or not interested in this scsi device
14931da177e4SLinus Torvalds  *	(e.g. scanner)); 1 when there is an error.
14941da177e4SLinus Torvalds  *
14951da177e4SLinus Torvalds  *	Note: this function is invoked from the scsi mid-level.
14961da177e4SLinus Torvalds  *	This function sets up the mapping between a given
14971da177e4SLinus Torvalds  *	<host,channel,id,lun> (found in sdp) and new device name
14981da177e4SLinus Torvalds  *	(e.g. /dev/sda). More precisely it is the block device major
14991da177e4SLinus Torvalds  *	and minor number that is chosen here.
15001da177e4SLinus Torvalds  *
15011da177e4SLinus Torvalds  *	Assume sd_attach is not re-entrant (for time being)
15021da177e4SLinus Torvalds  *	Also think about sd_attach() and sd_remove() running coincidentally.
15031da177e4SLinus Torvalds  **/
15041da177e4SLinus Torvalds static int sd_probe(struct device *dev)
15051da177e4SLinus Torvalds {
15061da177e4SLinus Torvalds 	struct scsi_device *sdp = to_scsi_device(dev);
15071da177e4SLinus Torvalds 	struct scsi_disk *sdkp;
15081da177e4SLinus Torvalds 	struct gendisk *gd;
15091da177e4SLinus Torvalds 	u32 index;
15101da177e4SLinus Torvalds 	int error;
15111da177e4SLinus Torvalds 
15121da177e4SLinus Torvalds 	error = -ENODEV;
1513631e8a13SAl Viro  	if (sdp->type != TYPE_DISK && sdp->type != TYPE_MOD && sdp->type != TYPE_RBC)
15141da177e4SLinus Torvalds 		goto out;
15151da177e4SLinus Torvalds 
15169ccfc756SJames Bottomley 	SCSI_LOG_HLQUEUE(3, sdev_printk(KERN_INFO, sdp,
15179ccfc756SJames Bottomley 					"sd_attach\n"));
15181da177e4SLinus Torvalds 
15191da177e4SLinus Torvalds 	error = -ENOMEM;
1520*24669f75SJes Sorensen 	sdkp = kzalloc(sizeof(*sdkp), GFP_KERNEL);
15211da177e4SLinus Torvalds 	if (!sdkp)
15221da177e4SLinus Torvalds 		goto out;
15231da177e4SLinus Torvalds 
15241da177e4SLinus Torvalds 	kref_init(&sdkp->kref);
15251da177e4SLinus Torvalds 
15261da177e4SLinus Torvalds 	gd = alloc_disk(16);
15271da177e4SLinus Torvalds 	if (!gd)
15281da177e4SLinus Torvalds 		goto out_free;
15291da177e4SLinus Torvalds 
15301da177e4SLinus Torvalds 	if (!idr_pre_get(&sd_index_idr, GFP_KERNEL))
15311da177e4SLinus Torvalds 		goto out_put;
15321da177e4SLinus Torvalds 
15331da177e4SLinus Torvalds 	spin_lock(&sd_index_lock);
15341da177e4SLinus Torvalds 	error = idr_get_new(&sd_index_idr, NULL, &index);
15351da177e4SLinus Torvalds 	spin_unlock(&sd_index_lock);
15361da177e4SLinus Torvalds 
15371da177e4SLinus Torvalds 	if (index >= SD_MAX_DISKS)
15381da177e4SLinus Torvalds 		error = -EBUSY;
15391da177e4SLinus Torvalds 	if (error)
15401da177e4SLinus Torvalds 		goto out_put;
15411da177e4SLinus Torvalds 
154239b7f1e2SAlan Stern 	get_device(&sdp->sdev_gendev);
15431da177e4SLinus Torvalds 	sdkp->device = sdp;
15441da177e4SLinus Torvalds 	sdkp->driver = &sd_template;
15451da177e4SLinus Torvalds 	sdkp->disk = gd;
15461da177e4SLinus Torvalds 	sdkp->index = index;
15471da177e4SLinus Torvalds 	sdkp->openers = 0;
15481da177e4SLinus Torvalds 
15491da177e4SLinus Torvalds 	if (!sdp->timeout) {
1550631e8a13SAl Viro  		if (sdp->type != TYPE_MOD)
15511da177e4SLinus Torvalds 			sdp->timeout = SD_TIMEOUT;
15521da177e4SLinus Torvalds 		else
15531da177e4SLinus Torvalds 			sdp->timeout = SD_MOD_TIMEOUT;
15541da177e4SLinus Torvalds 	}
15551da177e4SLinus Torvalds 
15561da177e4SLinus Torvalds 	gd->major = sd_major((index & 0xf0) >> 4);
15571da177e4SLinus Torvalds 	gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00);
15581da177e4SLinus Torvalds 	gd->minors = 16;
15591da177e4SLinus Torvalds 	gd->fops = &sd_fops;
15601da177e4SLinus Torvalds 
15611da177e4SLinus Torvalds 	if (index < 26) {
15621da177e4SLinus Torvalds 		sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
15631da177e4SLinus Torvalds 	} else if (index < (26 + 1) * 26) {
15641da177e4SLinus Torvalds 		sprintf(gd->disk_name, "sd%c%c",
15651da177e4SLinus Torvalds 			'a' + index / 26 - 1,'a' + index % 26);
15661da177e4SLinus Torvalds 	} else {
15671da177e4SLinus Torvalds 		const unsigned int m1 = (index / 26 - 1) / 26 - 1;
15681da177e4SLinus Torvalds 		const unsigned int m2 = (index / 26 - 1) % 26;
15691da177e4SLinus Torvalds 		const unsigned int m3 =  index % 26;
15701da177e4SLinus Torvalds 		sprintf(gd->disk_name, "sd%c%c%c",
15711da177e4SLinus Torvalds 			'a' + m1, 'a' + m2, 'a' + m3);
15721da177e4SLinus Torvalds 	}
15731da177e4SLinus Torvalds 
15741da177e4SLinus Torvalds 	strcpy(gd->devfs_name, sdp->devfs_name);
15751da177e4SLinus Torvalds 
15761da177e4SLinus Torvalds 	gd->private_data = &sdkp->driver;
1577461d4e90STejun Heo 	gd->queue = sdkp->device->request_queue;
15781da177e4SLinus Torvalds 
15791da177e4SLinus Torvalds 	sd_revalidate_disk(gd);
15801da177e4SLinus Torvalds 
15811da177e4SLinus Torvalds 	gd->driverfs_dev = &sdp->sdev_gendev;
15821da177e4SLinus Torvalds 	gd->flags = GENHD_FL_DRIVERFS;
15831da177e4SLinus Torvalds 	if (sdp->removable)
15841da177e4SLinus Torvalds 		gd->flags |= GENHD_FL_REMOVABLE;
15851da177e4SLinus Torvalds 
15861da177e4SLinus Torvalds 	dev_set_drvdata(dev, sdkp);
15871da177e4SLinus Torvalds 	add_disk(gd);
15881da177e4SLinus Torvalds 
15899ccfc756SJames Bottomley 	sdev_printk(KERN_NOTICE, sdp, "Attached scsi %sdisk %s\n",
15909ccfc756SJames Bottomley 		    sdp->removable ? "removable " : "", gd->disk_name);
15911da177e4SLinus Torvalds 
15921da177e4SLinus Torvalds 	return 0;
15931da177e4SLinus Torvalds 
15941da177e4SLinus Torvalds out_put:
15951da177e4SLinus Torvalds 	put_disk(gd);
15961da177e4SLinus Torvalds out_free:
15971da177e4SLinus Torvalds 	kfree(sdkp);
15981da177e4SLinus Torvalds out:
15991da177e4SLinus Torvalds 	return error;
16001da177e4SLinus Torvalds }
16011da177e4SLinus Torvalds 
16021da177e4SLinus Torvalds /**
16031da177e4SLinus Torvalds  *	sd_remove - called whenever a scsi disk (previously recognized by
16041da177e4SLinus Torvalds  *	sd_probe) is detached from the system. It is called (potentially
16051da177e4SLinus Torvalds  *	multiple times) during sd module unload.
16061da177e4SLinus Torvalds  *	@sdp: pointer to mid level scsi device object
16071da177e4SLinus Torvalds  *
16081da177e4SLinus Torvalds  *	Note: this function is invoked from the scsi mid-level.
16091da177e4SLinus Torvalds  *	This function potentially frees up a device name (e.g. /dev/sdc)
16101da177e4SLinus Torvalds  *	that could be re-used by a subsequent sd_probe().
16111da177e4SLinus Torvalds  *	This function is not called when the built-in sd driver is "exit-ed".
16121da177e4SLinus Torvalds  **/
16131da177e4SLinus Torvalds static int sd_remove(struct device *dev)
16141da177e4SLinus Torvalds {
16151da177e4SLinus Torvalds 	struct scsi_disk *sdkp = dev_get_drvdata(dev);
16161da177e4SLinus Torvalds 
16171da177e4SLinus Torvalds 	del_gendisk(sdkp->disk);
16181da177e4SLinus Torvalds 	sd_shutdown(dev);
161939b7f1e2SAlan Stern 
16200b950672SArjan van de Ven 	mutex_lock(&sd_ref_mutex);
162139b7f1e2SAlan Stern 	dev_set_drvdata(dev, NULL);
16221da177e4SLinus Torvalds 	kref_put(&sdkp->kref, scsi_disk_release);
16230b950672SArjan van de Ven 	mutex_unlock(&sd_ref_mutex);
16241da177e4SLinus Torvalds 
16251da177e4SLinus Torvalds 	return 0;
16261da177e4SLinus Torvalds }
16271da177e4SLinus Torvalds 
16281da177e4SLinus Torvalds /**
16291da177e4SLinus Torvalds  *	scsi_disk_release - Called to free the scsi_disk structure
16301da177e4SLinus Torvalds  *	@kref: pointer to embedded kref
16311da177e4SLinus Torvalds  *
16320b950672SArjan van de Ven  *	sd_ref_mutex must be held entering this routine.  Because it is
16331da177e4SLinus Torvalds  *	called on last put, you should always use the scsi_disk_get()
16341da177e4SLinus Torvalds  *	scsi_disk_put() helpers which manipulate the semaphore directly
16351da177e4SLinus Torvalds  *	and never do a direct kref_put().
16361da177e4SLinus Torvalds  **/
16371da177e4SLinus Torvalds static void scsi_disk_release(struct kref *kref)
16381da177e4SLinus Torvalds {
16391da177e4SLinus Torvalds 	struct scsi_disk *sdkp = to_scsi_disk(kref);
16401da177e4SLinus Torvalds 	struct gendisk *disk = sdkp->disk;
16411da177e4SLinus Torvalds 
16421da177e4SLinus Torvalds 	spin_lock(&sd_index_lock);
16431da177e4SLinus Torvalds 	idr_remove(&sd_index_idr, sdkp->index);
16441da177e4SLinus Torvalds 	spin_unlock(&sd_index_lock);
16451da177e4SLinus Torvalds 
16461da177e4SLinus Torvalds 	disk->private_data = NULL;
16471da177e4SLinus Torvalds 	put_disk(disk);
164839b7f1e2SAlan Stern 	put_device(&sdkp->device->sdev_gendev);
16491da177e4SLinus Torvalds 
16501da177e4SLinus Torvalds 	kfree(sdkp);
16511da177e4SLinus Torvalds }
16521da177e4SLinus Torvalds 
16531da177e4SLinus Torvalds /*
16541da177e4SLinus Torvalds  * Send a SYNCHRONIZE CACHE instruction down to the device through
16551da177e4SLinus Torvalds  * the normal SCSI command structure.  Wait for the command to
16561da177e4SLinus Torvalds  * complete.
16571da177e4SLinus Torvalds  */
16581da177e4SLinus Torvalds static void sd_shutdown(struct device *dev)
16591da177e4SLinus Torvalds {
16601da177e4SLinus Torvalds 	struct scsi_device *sdp = to_scsi_device(dev);
166139b7f1e2SAlan Stern 	struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
16621da177e4SLinus Torvalds 
16631da177e4SLinus Torvalds 	if (!sdkp)
16641da177e4SLinus Torvalds 		return;         /* this can happen */
16651da177e4SLinus Torvalds 
166639b7f1e2SAlan Stern 	if (sdkp->WCE) {
16671da177e4SLinus Torvalds 		printk(KERN_NOTICE "Synchronizing SCSI cache for disk %s: \n",
16681da177e4SLinus Torvalds 				sdkp->disk->disk_name);
16691da177e4SLinus Torvalds 		sd_sync_cache(sdp);
16701da177e4SLinus Torvalds 	}
167139b7f1e2SAlan Stern 	scsi_disk_put(sdkp);
167239b7f1e2SAlan Stern }
16731da177e4SLinus Torvalds 
16741da177e4SLinus Torvalds /**
16751da177e4SLinus Torvalds  *	init_sd - entry point for this driver (both when built in or when
16761da177e4SLinus Torvalds  *	a module).
16771da177e4SLinus Torvalds  *
16781da177e4SLinus Torvalds  *	Note: this function registers this driver with the scsi mid-level.
16791da177e4SLinus Torvalds  **/
16801da177e4SLinus Torvalds static int __init init_sd(void)
16811da177e4SLinus Torvalds {
16821da177e4SLinus Torvalds 	int majors = 0, i;
16831da177e4SLinus Torvalds 
16841da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));
16851da177e4SLinus Torvalds 
16861da177e4SLinus Torvalds 	for (i = 0; i < SD_MAJORS; i++)
16871da177e4SLinus Torvalds 		if (register_blkdev(sd_major(i), "sd") == 0)
16881da177e4SLinus Torvalds 			majors++;
16891da177e4SLinus Torvalds 
16901da177e4SLinus Torvalds 	if (!majors)
16911da177e4SLinus Torvalds 		return -ENODEV;
16921da177e4SLinus Torvalds 
16931da177e4SLinus Torvalds 	return scsi_register_driver(&sd_template.gendrv);
16941da177e4SLinus Torvalds }
16951da177e4SLinus Torvalds 
16961da177e4SLinus Torvalds /**
16971da177e4SLinus Torvalds  *	exit_sd - exit point for this driver (when it is a module).
16981da177e4SLinus Torvalds  *
16991da177e4SLinus Torvalds  *	Note: this function unregisters this driver from the scsi mid-level.
17001da177e4SLinus Torvalds  **/
17011da177e4SLinus Torvalds static void __exit exit_sd(void)
17021da177e4SLinus Torvalds {
17031da177e4SLinus Torvalds 	int i;
17041da177e4SLinus Torvalds 
17051da177e4SLinus Torvalds 	SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
17061da177e4SLinus Torvalds 
17071da177e4SLinus Torvalds 	scsi_unregister_driver(&sd_template.gendrv);
17081da177e4SLinus Torvalds 	for (i = 0; i < SD_MAJORS; i++)
17091da177e4SLinus Torvalds 		unregister_blkdev(sd_major(i), "sd");
17101da177e4SLinus Torvalds }
17111da177e4SLinus Torvalds 
17121da177e4SLinus Torvalds MODULE_LICENSE("GPL");
17131da177e4SLinus Torvalds MODULE_AUTHOR("Eric Youngdale");
17141da177e4SLinus Torvalds MODULE_DESCRIPTION("SCSI disk (sd) driver");
17151da177e4SLinus Torvalds 
17161da177e4SLinus Torvalds module_init(init_sd);
17171da177e4SLinus Torvalds module_exit(exit_sd);
1718