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