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 1336*6d73c851SAl Viro if (!data.header_length) { 1337*6d73c851SAl Viro modepage = 6; 1338*6d73c851SAl Viro printk(KERN_ERR "%s: missing header in MODE_SENSE response\n", 1339*6d73c851SAl Viro diskname); 1340*6d73c851SAl Viro } 1341*6d73c851SAl Viro 13421da177e4SLinus Torvalds /* that went OK, now ask for the proper length */ 13431da177e4SLinus Torvalds len = data.length; 13441da177e4SLinus Torvalds 13451da177e4SLinus Torvalds /* 13461da177e4SLinus Torvalds * We're only interested in the first three bytes, actually. 13471da177e4SLinus Torvalds * But the data cache page is defined for the first 20. 13481da177e4SLinus Torvalds */ 13491da177e4SLinus Torvalds if (len < 3) 13501da177e4SLinus Torvalds goto bad_sense; 13511da177e4SLinus Torvalds if (len > 20) 13521da177e4SLinus Torvalds len = 20; 13531da177e4SLinus Torvalds 13541da177e4SLinus Torvalds /* Take headers and block descriptors into account */ 13551da177e4SLinus Torvalds len += data.header_length + data.block_descriptor_length; 135648970800SAl Viro if (len > SD_BUF_SIZE) 135748970800SAl Viro goto bad_sense; 13581da177e4SLinus Torvalds 13591da177e4SLinus Torvalds /* Get the data */ 1360ea73a9f2SJames Bottomley res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); 13611da177e4SLinus Torvalds 13621da177e4SLinus Torvalds if (scsi_status_is_good(res)) { 13631da177e4SLinus Torvalds const char *types[] = { 13641da177e4SLinus Torvalds "write through", "none", "write back", 13651da177e4SLinus Torvalds "write back, no read (daft)" 13661da177e4SLinus Torvalds }; 13671da177e4SLinus Torvalds int ct = 0; 1368631e8a13SAl Viro int offset = data.header_length + data.block_descriptor_length; 13691da177e4SLinus Torvalds 137048970800SAl Viro if (offset >= SD_BUF_SIZE - 2) { 137148970800SAl Viro printk(KERN_ERR "%s: malformed MODE SENSE response", 137248970800SAl Viro diskname); 137348970800SAl Viro goto defaults; 137448970800SAl Viro } 137548970800SAl Viro 1376631e8a13SAl Viro if ((buffer[offset] & 0x3f) != modepage) { 1377631e8a13SAl Viro printk(KERN_ERR "%s: got wrong page\n", diskname); 1378631e8a13SAl Viro goto defaults; 1379631e8a13SAl Viro } 1380631e8a13SAl Viro 1381631e8a13SAl Viro if (modepage == 8) { 1382631e8a13SAl Viro sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); 1383631e8a13SAl Viro sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0); 1384631e8a13SAl Viro } else { 1385631e8a13SAl Viro sdkp->WCE = ((buffer[offset + 2] & 0x01) == 0); 1386631e8a13SAl Viro sdkp->RCD = 0; 1387631e8a13SAl Viro } 13881da177e4SLinus Torvalds 1389007365adSTejun Heo sdkp->DPOFUA = (data.device_specific & 0x10) != 0; 1390007365adSTejun Heo if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { 1391007365adSTejun Heo printk(KERN_NOTICE "SCSI device %s: uses " 1392007365adSTejun Heo "READ/WRITE(6), disabling FUA\n", diskname); 1393007365adSTejun Heo sdkp->DPOFUA = 0; 1394007365adSTejun Heo } 1395007365adSTejun Heo 13961da177e4SLinus Torvalds ct = sdkp->RCD + 2*sdkp->WCE; 13971da177e4SLinus Torvalds 1398007365adSTejun Heo printk(KERN_NOTICE "SCSI device %s: drive cache: %s%s\n", 1399007365adSTejun Heo diskname, types[ct], 1400007365adSTejun Heo sdkp->DPOFUA ? " w/ FUA" : ""); 14011da177e4SLinus Torvalds 14021da177e4SLinus Torvalds return; 14031da177e4SLinus Torvalds } 14041da177e4SLinus Torvalds 14051da177e4SLinus Torvalds bad_sense: 1406ea73a9f2SJames Bottomley if (scsi_sense_valid(&sshdr) && 14071da177e4SLinus Torvalds sshdr.sense_key == ILLEGAL_REQUEST && 14081da177e4SLinus Torvalds sshdr.asc == 0x24 && sshdr.ascq == 0x0) 14091da177e4SLinus Torvalds printk(KERN_NOTICE "%s: cache data unavailable\n", 14101da177e4SLinus Torvalds diskname); /* Invalid field in CDB */ 14111da177e4SLinus Torvalds else 14121da177e4SLinus Torvalds printk(KERN_ERR "%s: asking for cache data failed\n", 14131da177e4SLinus Torvalds diskname); 14141da177e4SLinus Torvalds 14151da177e4SLinus Torvalds defaults: 14161da177e4SLinus Torvalds printk(KERN_ERR "%s: assuming drive cache: write through\n", 14171da177e4SLinus Torvalds diskname); 14181da177e4SLinus Torvalds sdkp->WCE = 0; 14191da177e4SLinus Torvalds sdkp->RCD = 0; 142048970800SAl Viro sdkp->DPOFUA = 0; 14211da177e4SLinus Torvalds } 14221da177e4SLinus Torvalds 14231da177e4SLinus Torvalds /** 14241da177e4SLinus Torvalds * sd_revalidate_disk - called the first time a new disk is seen, 14251da177e4SLinus Torvalds * performs disk spin up, read_capacity, etc. 14261da177e4SLinus Torvalds * @disk: struct gendisk we care about 14271da177e4SLinus Torvalds **/ 14281da177e4SLinus Torvalds static int sd_revalidate_disk(struct gendisk *disk) 14291da177e4SLinus Torvalds { 14301da177e4SLinus Torvalds struct scsi_disk *sdkp = scsi_disk(disk); 14311da177e4SLinus Torvalds struct scsi_device *sdp = sdkp->device; 14321da177e4SLinus Torvalds unsigned char *buffer; 1433461d4e90STejun Heo unsigned ordered; 14341da177e4SLinus Torvalds 14351da177e4SLinus Torvalds SCSI_LOG_HLQUEUE(3, printk("sd_revalidate_disk: disk=%s\n", disk->disk_name)); 14361da177e4SLinus Torvalds 14371da177e4SLinus Torvalds /* 14381da177e4SLinus Torvalds * If the device is offline, don't try and read capacity or any 14391da177e4SLinus Torvalds * of the other niceties. 14401da177e4SLinus Torvalds */ 14411da177e4SLinus Torvalds if (!scsi_device_online(sdp)) 14421da177e4SLinus Torvalds goto out; 14431da177e4SLinus Torvalds 144448970800SAl Viro buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL | __GFP_DMA); 14451da177e4SLinus Torvalds if (!buffer) { 14461da177e4SLinus Torvalds printk(KERN_WARNING "(sd_revalidate_disk:) Memory allocation " 14471da177e4SLinus Torvalds "failure.\n"); 1448ea73a9f2SJames Bottomley goto out; 14491da177e4SLinus Torvalds } 14501da177e4SLinus Torvalds 14511da177e4SLinus Torvalds /* defaults, until the device tells us otherwise */ 14521da177e4SLinus Torvalds sdp->sector_size = 512; 14531da177e4SLinus Torvalds sdkp->capacity = 0; 14541da177e4SLinus Torvalds sdkp->media_present = 1; 14551da177e4SLinus Torvalds sdkp->write_prot = 0; 14561da177e4SLinus Torvalds sdkp->WCE = 0; 14571da177e4SLinus Torvalds sdkp->RCD = 0; 14581da177e4SLinus Torvalds 1459ea73a9f2SJames Bottomley sd_spinup_disk(sdkp, disk->disk_name); 14601da177e4SLinus Torvalds 14611da177e4SLinus Torvalds /* 14621da177e4SLinus Torvalds * Without media there is no reason to ask; moreover, some devices 14631da177e4SLinus Torvalds * react badly if we do. 14641da177e4SLinus Torvalds */ 14651da177e4SLinus Torvalds if (sdkp->media_present) { 1466ea73a9f2SJames Bottomley sd_read_capacity(sdkp, disk->disk_name, buffer); 146738d76df2SAlan Stern sd_read_write_protect_flag(sdkp, disk->disk_name, buffer); 1468ea73a9f2SJames Bottomley sd_read_cache_type(sdkp, disk->disk_name, buffer); 14691da177e4SLinus Torvalds } 14701da177e4SLinus Torvalds 1471461d4e90STejun Heo /* 1472461d4e90STejun Heo * We now have all cache related info, determine how we deal 1473461d4e90STejun Heo * with ordered requests. Note that as the current SCSI 1474461d4e90STejun Heo * dispatch function can alter request order, we cannot use 1475461d4e90STejun Heo * QUEUE_ORDERED_TAG_* even when ordered tag is supported. 1476461d4e90STejun Heo */ 1477461d4e90STejun Heo if (sdkp->WCE) 1478007365adSTejun Heo ordered = sdkp->DPOFUA 1479007365adSTejun Heo ? QUEUE_ORDERED_DRAIN_FUA : QUEUE_ORDERED_DRAIN_FLUSH; 1480461d4e90STejun Heo else 1481461d4e90STejun Heo ordered = QUEUE_ORDERED_DRAIN; 1482461d4e90STejun Heo 1483461d4e90STejun Heo blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush); 1484461d4e90STejun Heo 14851da177e4SLinus Torvalds set_capacity(disk, sdkp->capacity); 14861da177e4SLinus Torvalds kfree(buffer); 14871da177e4SLinus Torvalds 14881da177e4SLinus Torvalds out: 14891da177e4SLinus Torvalds return 0; 14901da177e4SLinus Torvalds } 14911da177e4SLinus Torvalds 14921da177e4SLinus Torvalds /** 14931da177e4SLinus Torvalds * sd_probe - called during driver initialization and whenever a 14941da177e4SLinus Torvalds * new scsi device is attached to the system. It is called once 14951da177e4SLinus Torvalds * for each scsi device (not just disks) present. 14961da177e4SLinus Torvalds * @dev: pointer to device object 14971da177e4SLinus Torvalds * 14981da177e4SLinus Torvalds * Returns 0 if successful (or not interested in this scsi device 14991da177e4SLinus Torvalds * (e.g. scanner)); 1 when there is an error. 15001da177e4SLinus Torvalds * 15011da177e4SLinus Torvalds * Note: this function is invoked from the scsi mid-level. 15021da177e4SLinus Torvalds * This function sets up the mapping between a given 15031da177e4SLinus Torvalds * <host,channel,id,lun> (found in sdp) and new device name 15041da177e4SLinus Torvalds * (e.g. /dev/sda). More precisely it is the block device major 15051da177e4SLinus Torvalds * and minor number that is chosen here. 15061da177e4SLinus Torvalds * 15071da177e4SLinus Torvalds * Assume sd_attach is not re-entrant (for time being) 15081da177e4SLinus Torvalds * Also think about sd_attach() and sd_remove() running coincidentally. 15091da177e4SLinus Torvalds **/ 15101da177e4SLinus Torvalds static int sd_probe(struct device *dev) 15111da177e4SLinus Torvalds { 15121da177e4SLinus Torvalds struct scsi_device *sdp = to_scsi_device(dev); 15131da177e4SLinus Torvalds struct scsi_disk *sdkp; 15141da177e4SLinus Torvalds struct gendisk *gd; 15151da177e4SLinus Torvalds u32 index; 15161da177e4SLinus Torvalds int error; 15171da177e4SLinus Torvalds 15181da177e4SLinus Torvalds error = -ENODEV; 1519631e8a13SAl Viro if (sdp->type != TYPE_DISK && sdp->type != TYPE_MOD && sdp->type != TYPE_RBC) 15201da177e4SLinus Torvalds goto out; 15211da177e4SLinus Torvalds 15229ccfc756SJames Bottomley SCSI_LOG_HLQUEUE(3, sdev_printk(KERN_INFO, sdp, 15239ccfc756SJames Bottomley "sd_attach\n")); 15241da177e4SLinus Torvalds 15251da177e4SLinus Torvalds error = -ENOMEM; 152624669f75SJes Sorensen sdkp = kzalloc(sizeof(*sdkp), GFP_KERNEL); 15271da177e4SLinus Torvalds if (!sdkp) 15281da177e4SLinus Torvalds goto out; 15291da177e4SLinus Torvalds 15301da177e4SLinus Torvalds kref_init(&sdkp->kref); 15311da177e4SLinus Torvalds 15321da177e4SLinus Torvalds gd = alloc_disk(16); 15331da177e4SLinus Torvalds if (!gd) 15341da177e4SLinus Torvalds goto out_free; 15351da177e4SLinus Torvalds 15361da177e4SLinus Torvalds if (!idr_pre_get(&sd_index_idr, GFP_KERNEL)) 15371da177e4SLinus Torvalds goto out_put; 15381da177e4SLinus Torvalds 15391da177e4SLinus Torvalds spin_lock(&sd_index_lock); 15401da177e4SLinus Torvalds error = idr_get_new(&sd_index_idr, NULL, &index); 15411da177e4SLinus Torvalds spin_unlock(&sd_index_lock); 15421da177e4SLinus Torvalds 15431da177e4SLinus Torvalds if (index >= SD_MAX_DISKS) 15441da177e4SLinus Torvalds error = -EBUSY; 15451da177e4SLinus Torvalds if (error) 15461da177e4SLinus Torvalds goto out_put; 15471da177e4SLinus Torvalds 154839b7f1e2SAlan Stern get_device(&sdp->sdev_gendev); 15491da177e4SLinus Torvalds sdkp->device = sdp; 15501da177e4SLinus Torvalds sdkp->driver = &sd_template; 15511da177e4SLinus Torvalds sdkp->disk = gd; 15521da177e4SLinus Torvalds sdkp->index = index; 15531da177e4SLinus Torvalds sdkp->openers = 0; 15541da177e4SLinus Torvalds 15551da177e4SLinus Torvalds if (!sdp->timeout) { 1556631e8a13SAl Viro if (sdp->type != TYPE_MOD) 15571da177e4SLinus Torvalds sdp->timeout = SD_TIMEOUT; 15581da177e4SLinus Torvalds else 15591da177e4SLinus Torvalds sdp->timeout = SD_MOD_TIMEOUT; 15601da177e4SLinus Torvalds } 15611da177e4SLinus Torvalds 15621da177e4SLinus Torvalds gd->major = sd_major((index & 0xf0) >> 4); 15631da177e4SLinus Torvalds gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); 15641da177e4SLinus Torvalds gd->minors = 16; 15651da177e4SLinus Torvalds gd->fops = &sd_fops; 15661da177e4SLinus Torvalds 15671da177e4SLinus Torvalds if (index < 26) { 15681da177e4SLinus Torvalds sprintf(gd->disk_name, "sd%c", 'a' + index % 26); 15691da177e4SLinus Torvalds } else if (index < (26 + 1) * 26) { 15701da177e4SLinus Torvalds sprintf(gd->disk_name, "sd%c%c", 15711da177e4SLinus Torvalds 'a' + index / 26 - 1,'a' + index % 26); 15721da177e4SLinus Torvalds } else { 15731da177e4SLinus Torvalds const unsigned int m1 = (index / 26 - 1) / 26 - 1; 15741da177e4SLinus Torvalds const unsigned int m2 = (index / 26 - 1) % 26; 15751da177e4SLinus Torvalds const unsigned int m3 = index % 26; 15761da177e4SLinus Torvalds sprintf(gd->disk_name, "sd%c%c%c", 15771da177e4SLinus Torvalds 'a' + m1, 'a' + m2, 'a' + m3); 15781da177e4SLinus Torvalds } 15791da177e4SLinus Torvalds 15801da177e4SLinus Torvalds gd->private_data = &sdkp->driver; 1581461d4e90STejun Heo gd->queue = sdkp->device->request_queue; 15821da177e4SLinus Torvalds 15831da177e4SLinus Torvalds sd_revalidate_disk(gd); 15841da177e4SLinus Torvalds 15851da177e4SLinus Torvalds gd->driverfs_dev = &sdp->sdev_gendev; 15861da177e4SLinus Torvalds gd->flags = GENHD_FL_DRIVERFS; 15871da177e4SLinus Torvalds if (sdp->removable) 15881da177e4SLinus Torvalds gd->flags |= GENHD_FL_REMOVABLE; 15891da177e4SLinus Torvalds 15901da177e4SLinus Torvalds dev_set_drvdata(dev, sdkp); 15911da177e4SLinus Torvalds add_disk(gd); 15921da177e4SLinus Torvalds 15939ccfc756SJames Bottomley sdev_printk(KERN_NOTICE, sdp, "Attached scsi %sdisk %s\n", 15949ccfc756SJames Bottomley sdp->removable ? "removable " : "", gd->disk_name); 15951da177e4SLinus Torvalds 15961da177e4SLinus Torvalds return 0; 15971da177e4SLinus Torvalds 15981da177e4SLinus Torvalds out_put: 15991da177e4SLinus Torvalds put_disk(gd); 16001da177e4SLinus Torvalds out_free: 16011da177e4SLinus Torvalds kfree(sdkp); 16021da177e4SLinus Torvalds out: 16031da177e4SLinus Torvalds return error; 16041da177e4SLinus Torvalds } 16051da177e4SLinus Torvalds 16061da177e4SLinus Torvalds /** 16071da177e4SLinus Torvalds * sd_remove - called whenever a scsi disk (previously recognized by 16081da177e4SLinus Torvalds * sd_probe) is detached from the system. It is called (potentially 16091da177e4SLinus Torvalds * multiple times) during sd module unload. 16101da177e4SLinus Torvalds * @sdp: pointer to mid level scsi device object 16111da177e4SLinus Torvalds * 16121da177e4SLinus Torvalds * Note: this function is invoked from the scsi mid-level. 16131da177e4SLinus Torvalds * This function potentially frees up a device name (e.g. /dev/sdc) 16141da177e4SLinus Torvalds * that could be re-used by a subsequent sd_probe(). 16151da177e4SLinus Torvalds * This function is not called when the built-in sd driver is "exit-ed". 16161da177e4SLinus Torvalds **/ 16171da177e4SLinus Torvalds static int sd_remove(struct device *dev) 16181da177e4SLinus Torvalds { 16191da177e4SLinus Torvalds struct scsi_disk *sdkp = dev_get_drvdata(dev); 16201da177e4SLinus Torvalds 16211da177e4SLinus Torvalds del_gendisk(sdkp->disk); 16221da177e4SLinus Torvalds sd_shutdown(dev); 162339b7f1e2SAlan Stern 16240b950672SArjan van de Ven mutex_lock(&sd_ref_mutex); 162539b7f1e2SAlan Stern dev_set_drvdata(dev, NULL); 16261da177e4SLinus Torvalds kref_put(&sdkp->kref, scsi_disk_release); 16270b950672SArjan van de Ven mutex_unlock(&sd_ref_mutex); 16281da177e4SLinus Torvalds 16291da177e4SLinus Torvalds return 0; 16301da177e4SLinus Torvalds } 16311da177e4SLinus Torvalds 16321da177e4SLinus Torvalds /** 16331da177e4SLinus Torvalds * scsi_disk_release - Called to free the scsi_disk structure 16341da177e4SLinus Torvalds * @kref: pointer to embedded kref 16351da177e4SLinus Torvalds * 16360b950672SArjan van de Ven * sd_ref_mutex must be held entering this routine. Because it is 16371da177e4SLinus Torvalds * called on last put, you should always use the scsi_disk_get() 16381da177e4SLinus Torvalds * scsi_disk_put() helpers which manipulate the semaphore directly 16391da177e4SLinus Torvalds * and never do a direct kref_put(). 16401da177e4SLinus Torvalds **/ 16411da177e4SLinus Torvalds static void scsi_disk_release(struct kref *kref) 16421da177e4SLinus Torvalds { 16431da177e4SLinus Torvalds struct scsi_disk *sdkp = to_scsi_disk(kref); 16441da177e4SLinus Torvalds struct gendisk *disk = sdkp->disk; 16451da177e4SLinus Torvalds 16461da177e4SLinus Torvalds spin_lock(&sd_index_lock); 16471da177e4SLinus Torvalds idr_remove(&sd_index_idr, sdkp->index); 16481da177e4SLinus Torvalds spin_unlock(&sd_index_lock); 16491da177e4SLinus Torvalds 16501da177e4SLinus Torvalds disk->private_data = NULL; 16511da177e4SLinus Torvalds put_disk(disk); 165239b7f1e2SAlan Stern put_device(&sdkp->device->sdev_gendev); 16531da177e4SLinus Torvalds 16541da177e4SLinus Torvalds kfree(sdkp); 16551da177e4SLinus Torvalds } 16561da177e4SLinus Torvalds 16571da177e4SLinus Torvalds /* 16581da177e4SLinus Torvalds * Send a SYNCHRONIZE CACHE instruction down to the device through 16591da177e4SLinus Torvalds * the normal SCSI command structure. Wait for the command to 16601da177e4SLinus Torvalds * complete. 16611da177e4SLinus Torvalds */ 16621da177e4SLinus Torvalds static void sd_shutdown(struct device *dev) 16631da177e4SLinus Torvalds { 16641da177e4SLinus Torvalds struct scsi_device *sdp = to_scsi_device(dev); 166539b7f1e2SAlan Stern struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); 16661da177e4SLinus Torvalds 16671da177e4SLinus Torvalds if (!sdkp) 16681da177e4SLinus Torvalds return; /* this can happen */ 16691da177e4SLinus Torvalds 167039b7f1e2SAlan Stern if (sdkp->WCE) { 16711da177e4SLinus Torvalds printk(KERN_NOTICE "Synchronizing SCSI cache for disk %s: \n", 16721da177e4SLinus Torvalds sdkp->disk->disk_name); 16731da177e4SLinus Torvalds sd_sync_cache(sdp); 16741da177e4SLinus Torvalds } 167539b7f1e2SAlan Stern scsi_disk_put(sdkp); 167639b7f1e2SAlan Stern } 16771da177e4SLinus Torvalds 16781da177e4SLinus Torvalds /** 16791da177e4SLinus Torvalds * init_sd - entry point for this driver (both when built in or when 16801da177e4SLinus Torvalds * a module). 16811da177e4SLinus Torvalds * 16821da177e4SLinus Torvalds * Note: this function registers this driver with the scsi mid-level. 16831da177e4SLinus Torvalds **/ 16841da177e4SLinus Torvalds static int __init init_sd(void) 16851da177e4SLinus Torvalds { 16861da177e4SLinus Torvalds int majors = 0, i; 16871da177e4SLinus Torvalds 16881da177e4SLinus Torvalds SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n")); 16891da177e4SLinus Torvalds 16901da177e4SLinus Torvalds for (i = 0; i < SD_MAJORS; i++) 16911da177e4SLinus Torvalds if (register_blkdev(sd_major(i), "sd") == 0) 16921da177e4SLinus Torvalds majors++; 16931da177e4SLinus Torvalds 16941da177e4SLinus Torvalds if (!majors) 16951da177e4SLinus Torvalds return -ENODEV; 16961da177e4SLinus Torvalds 16971da177e4SLinus Torvalds return scsi_register_driver(&sd_template.gendrv); 16981da177e4SLinus Torvalds } 16991da177e4SLinus Torvalds 17001da177e4SLinus Torvalds /** 17011da177e4SLinus Torvalds * exit_sd - exit point for this driver (when it is a module). 17021da177e4SLinus Torvalds * 17031da177e4SLinus Torvalds * Note: this function unregisters this driver from the scsi mid-level. 17041da177e4SLinus Torvalds **/ 17051da177e4SLinus Torvalds static void __exit exit_sd(void) 17061da177e4SLinus Torvalds { 17071da177e4SLinus Torvalds int i; 17081da177e4SLinus Torvalds 17091da177e4SLinus Torvalds SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n")); 17101da177e4SLinus Torvalds 17111da177e4SLinus Torvalds scsi_unregister_driver(&sd_template.gendrv); 17121da177e4SLinus Torvalds for (i = 0; i < SD_MAJORS; i++) 17131da177e4SLinus Torvalds unregister_blkdev(sd_major(i), "sd"); 17141da177e4SLinus Torvalds } 17151da177e4SLinus Torvalds 17161da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 17171da177e4SLinus Torvalds MODULE_AUTHOR("Eric Youngdale"); 17181da177e4SLinus Torvalds MODULE_DESCRIPTION("SCSI disk (sd) driver"); 17191da177e4SLinus Torvalds 17201da177e4SLinus Torvalds module_init(init_sd); 17211da177e4SLinus Torvalds module_exit(exit_sd); 1722