Annotation of linux/kernel/blk_drv/scsi/sd.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     sd.c Copyright (C) 1992 Drew Eckhardt 
        !             3:  *     Linux scsi disk driver by
        !             4:  *             Drew Eckhardt 
        !             5:  *
        !             6:  *     <[email protected]>
        !             7:  */
        !             8: 
        !             9: #include <linux/config.h>
        !            10: 
        !            11: #ifdef CONFIG_BLK_DEV_SD
        !            12: #include <linux/string.h>
        !            13: #include <linux/fs.h>
        !            14: #include <linux/kernel.h>
        !            15: #include <linux/sched.h>
        !            16: #include "scsi.h"
        !            17: #include "sd.h"
        !            18: 
        !            19: #define MAJOR_NR 8
        !            20: 
        !            21: #include "../blk.h"
        !            22: 
        !            23: /*
        !            24: static const char RCSid[] = "$Header:";
        !            25: */
        !            26: 
        !            27: #define MAX_RETRIES 5
        !            28: 
        !            29: /*
        !            30:  *     Time out in seconds
        !            31:  */
        !            32: 
        !            33: #define SD_TIMEOUT 100
        !            34: 
        !            35: Partition scsi_disks[MAX_SD << 4];
        !            36: int NR_SD=0;
        !            37: Scsi_Disk rscsi_disks[MAX_SD];
        !            38: static int sd_sizes[MAX_SD << 4];
        !            39: static int this_count;
        !            40: static int the_result;
        !            41: 
        !            42: extern int sd_ioctl(struct inode *, struct file *, unsigned long, unsigned long);
        !            43: 
        !            44: static void sd_release(struct inode * inode, struct file * file)
        !            45: {
        !            46:        sync_dev(inode->i_rdev);
        !            47: }
        !            48: 
        !            49: static struct file_operations sd_fops = {
        !            50:        NULL,                   /* lseek - default */
        !            51:        block_read,             /* read - general block-dev read */
        !            52:        block_write,            /* write - general block-dev write */
        !            53:        NULL,                   /* readdir - bad */
        !            54:        NULL,                   /* select */
        !            55:        sd_ioctl,               /* ioctl */
        !            56:        NULL,                   /* no special open code */
        !            57:        sd_release              /* release */
        !            58: };
        !            59: 
        !            60: /*
        !            61:        The sense_buffer is where we put data for all mode sense commands 
        !            62:        performed.
        !            63: */
        !            64: 
        !            65: static unsigned char sense_buffer[255];
        !            66: 
        !            67: /*
        !            68:        rw_intr is the interrupt routine for the device driver.  It will
        !            69:        be notified on the end of a SCSI read / write, and 
        !            70:        will take on of several actions based on success or failure.
        !            71: */
        !            72: 
        !            73: static void rw_intr (int host, int result)
        !            74: {
        !            75:        if (HOST != host)
        !            76:                panic ("sd.o : rw_intr() recieving interrupt for different host.");
        !            77: 
        !            78: /*
        !            79:        First case : we assume that the command succeeded.  One of two things will
        !            80:        happen here.  Either we will be finished, or there will be more 
        !            81:        sectors that we were unable to read last time.
        !            82: */
        !            83: 
        !            84:        if (!result)
        !            85:                if (!(CURRENT->nr_sectors -= this_count)) {
        !            86:                        end_request(1);
        !            87:                        do_sd_request();
        !            88:                } else {                        
        !            89:                        CURRENT->nr_sectors -= this_count;
        !            90: /*
        !            91:        The CURRENT->nr_sectors field is always done in 512 byte sectors,
        !            92:        even if this really isn't the case.
        !            93: */
        !            94:        
        !            95:                        (char *) CURRENT->buffer += this_count << 9;
        !            96:                        CURRENT->sector += this_count;
        !            97:                        CURRENT->errors = 0;
        !            98:                        do_sd_request();                         
        !            99:                }
        !           100: 
        !           101: /*
        !           102:        Now, if we were good little boys and girls, Santa left us a request 
        !           103:        sense buffer.  We can extract information from this, so we 
        !           104:        can choose a block to remap, etc.
        !           105: */
        !           106: 
        !           107:        else if (driver_byte(result) & DRIVER_SENSE) {
        !           108:                if (sugestion(result) == SUGGEST_REMAP) {
        !           109: #ifdef REMAP
        !           110: /*
        !           111:        Not yet implemented.  A read will fail after being remapped,
        !           112:        a write will call the strategy routine again.
        !           113: */
        !           114: 
        !           115:                        if rscsi_disks[DEVICE_NR(CURRENT->dev)].remap
        !           116:                                {
        !           117:                                result = 0;
        !           118:                                }
        !           119:                        else
        !           120:                        
        !           121: #endif
        !           122:                }
        !           123: /*
        !           124:        If we had an ILLEGAL REQUEST returned, then we may have performed
        !           125:        an unsupported command.  The only thing this should be would be a  ten
        !           126:        byte read where only a six byte read was supportted.  Also, on a 
        !           127:        system where READ CAPACITY failed, we mave have read past the end of the
        !           128:        disk.
        !           129: */
        !           130:        
        !           131:                else if (sense_buffer[7] == ILLEGAL_REQUEST) {
        !           132:                        if (rscsi_disks[DEVICE_NR(CURRENT->dev)].ten) {
        !           133:                                rscsi_disks[DEVICE_NR(CURRENT->dev)].ten = 0;
        !           134:                                do_sd_request();
        !           135:                                result = 0;
        !           136:                        } else {
        !           137:                        }
        !           138:                }
        !           139:        }
        !           140:        if (result) {
        !           141:                printk("SCSI disk error : host %d id %d lun %d return code = %03x\n", 
        !           142:                       rscsi_disks[DEVICE_NR(CURRENT->dev)].device->host_no, 
        !           143:                       rscsi_disks[DEVICE_NR(CURRENT->dev)].device->id,
        !           144:                       rscsi_disks[DEVICE_NR(CURRENT->dev)].device->lun);
        !           145: 
        !           146:                if (driver_byte(result) & DRIVER_SENSE) 
        !           147:                        printk("\tSense class %x, sense error %x, extended sense %x\n",
        !           148:                                sense_class(sense_buffer[0]), 
        !           149:                                sense_error(sense_buffer[0]),
        !           150:                                sense_buffer[2] & 0xf);
        !           151:        
        !           152:                end_request(0);
        !           153:        }
        !           154: }
        !           155: 
        !           156: /*
        !           157:        do_sd_request() is the request handler function for the sd driver.  
        !           158:        Its function in life is to take block device requests, and translate 
        !           159:        them to SCSI commands.
        !           160: */
        !           161:        
        !           162: void do_sd_request (void)
        !           163: {
        !           164:        int dev, block;
        !           165:        unsigned char cmd[10];
        !           166: 
        !           167:        INIT_REQUEST;
        !           168:        dev =  MINOR(CURRENT->dev);
        !           169:        block = CURRENT->sector;
        !           170: 
        !           171: #ifdef DEBUG
        !           172:        printk("Doing sd request, dev = %d, block = %d\n", dev, block);
        !           173: #endif
        !           174: 
        !           175:        if (dev >= (NR_SD << 4) || block + 2 > scsi_disks[dev].nr_sects || 
        !           176:                (dev % 16) > 5)
        !           177:                {
        !           178:                end_request(0)        !           179:                goto repeat;
        !           180:                }
        !           181:        
        !           182:        block += scsi_disks[dev].start_sect;
        !           183:        dev = DEVICE_NR(dev);
        !           184: 
        !           185: #ifdef DEBUG
        !           186:        printk("Real dev = %d, block = %d\n", dev, block);
        !           187: #endif
        !           188: 
        !           189:        if (!rscsi_disks[dev].use)
        !           190:                {
        !           191:                end_request(0);
        !           192:                goto repeat;
        !           193:                }
        !           194:        
        !           195:        this_count = CURRENT->nr_sectors;
        !           196:        switch (CURRENT->cmd)
        !           197:                {
        !           198:                case WRITE : 
        !           199:                        if (!rscsi_disks[dev].device->writeable)
        !           200:                                {
        !           201:                                end_request(0);
        !           202:                                goto repeat;
        !           203:                                } 
        !           204:                        cmd[0] = WRITE_6;
        !           205:                        break;
        !           206:                case READ : 
        !           207:                        cmd[0] = READ_6;
        !           208:                        break;
        !           209:                default : 
        !           210:                        printk ("Unknown sd command %d\r\n", CURRENT->cmd);
        !           211:                        panic("");
        !           212:                }
        !           213:        
        !           214:        cmd[1] = (LUN << 5) & 0xe0;
        !           215: 
        !           216:        if (((this_count > 0xff) ||  (block > 0x1fffff)) && rscsi_disks[dev].ten) 
        !           217:                {
        !           218:                if (this_count > 0xffff)
        !           219:                        this_count = 0xffff;
        !           220: 
        !           221:                cmd[0] += READ_10 - READ_6 ;
        !           222:                cmd[2] = (unsigned char) (block >> 24) & 0xff;
        !           223:                cmd[3] = (unsigned char) (block >> 16) & 0xff;
        !           224:                cmd[4] = (unsigned char) (block >> 8) & 0xff;
        !           225:                cmd[5] = (unsigned char) block & 0xff;
        !           226:                cmd[6] = cmd[9] = 0;
        !           227:                cmd[7] = (unsigned char) (this_count >> 8) & 0xff;
        !           228:                cmd[8] = (unsigned char) this_count & 0xff;
        !           229:                }
        !           230:        else
        !           231:                {
        !           232:                if (this_count > 0xff)
        !           233:                        this_count = 0xff;
        !           234:        
        !           235:                cmd[1] |= (unsigned char) ((block >> 16) & 0x1f);
        !           236:                cmd[2] = (unsigned char) ((block >> 8) & 0xff);
        !           237:                cmd[3] = (unsigned char) block & 0xff;
        !           238:                cmd[4] = (unsigned char) this_count;
        !           239:                cmd[5] = 0;
        !           240:                }
        !           241:                        
        !           242:        scsi_do_cmd (HOST, ID, (void *) cmd, CURRENT->buffer, this_count << 9, 
        !           243:                     rw_intr, SD_TIMEOUT, sense_buffer, MAX_RETRIES);
        !           244: }
        !           245: 
        !           246: static void sd_init_done (int host, int result)
        !           247: {
        !           248:        the_result = result;
        !           249: }
        !           250: 
        !           251: /*
        !           252:        The sd_init() function looks at all SCSI drives present, determines 
        !           253:        their size, and reads partition table entries for them.
        !           254: */
        !           255: 
        !           256: void sd_init(void)
        !           257: {
        !           258:        int i,j,k;
        !           259:        unsigned char cmd[10];
        !           260:        unsigned char buffer[513];
        !           261: 
        !           262:        Partition *p;
        !           263: 
        !           264:        
        !           265:        for (i = 0; i < NR_SD; ++i)
        !           266:                {
        !           267:                cmd[0] = READ_CAPACITY;
        !           268:                rscsi_disks[i].use = 1;
        !           269:                cmd[1] = (rscsi_disks[i].device->lun << 5) & 0xe0;
        !           270:                memset ((void *) &cmd[2], 0, 8);
        !           271:                the_result = -1;
        !           272: #ifdef DEBUG
        !           273:        printk("Read capacity, disk %d at host = %d, id = %d\n", i, 
        !           274:                rscsi_disks[i].device->host_no, rscsi_disks[i].device->id);
        !           275: #endif
        !           276:                scsi_do_cmd (rscsi_disks[i].device->host_no , 
        !           277:                                rscsi_disks[i].device->id, 
        !           278:                                (void *) cmd, (void *) buffer,
        !           279:                                 512, sd_init_done,  SD_TIMEOUT, sense_buffer,
        !           280:                                 MAX_RETRIES);
        !           281: 
        !           282:                while(the_result < 0);
        !           283: /*
        !           284:        The SCSI standard says "READ CAPACITY is necessary for self confuring software"
        !           285:        While not mandatory, support of READ CAPACITY is strongly encouraged.
        !           286: 
        !           287:        We used to die if we couldn't successfully do a READ CAPACITY.  
        !           288:        But, now we go on about our way.  The side effects of this are
        !           289: 
        !           290:        1.  We can't know block size with certainty.  I have said "512 bytes is it"
        !           291:                as this is most common.
        !           292: 
        !           293:        2.  Recovery from when some one attempts to read past the end of the raw device will
        !           294:            be slower.  
        !           295: */
        !           296: 
        !           297:                if (the_result)
        !           298:                        {
        !           299:                        printk ("Warning : SCSI device at host %d, id %d, lun %d failed READ CAPACITY.\n"
        !           300:                                "status = %x, message = %02x, host = %02x, driver = %02x \n",
        !           301:                                rscsi_disks[i].device->host_no, rscsi_disks[i].device->id,
        !           302:                                rscsi_disks[i].device->lun,
        !           303:                                status_byte(the_result),
        !           304:                                msg_byte(the_result),
        !           305:                                host_byte(the_result),
        !           306:                                driver_byte(the_result)
        !           307:                                );
        !           308:                        if (driver_byte(the_result)  & DRIVER_SENSE)  
        !           309:                                printk("Extended sense code = %1x \n", sense_buffer[2] & 0xf);
        !           310:                        else
        !           311:                                printk("Sense not available. \n");
        !           312: 
        !           313:                        printk("Block size assumed to be 512 bytes, disk size 1GB.  \n");
        !           314:                        rscsi_disks[i].capacity = 0x1fffff;
        !           315:                        rscsi_disks[i].sector_size = 512;
        !           316:                        }
        !           317:                else
        !           318:                        {
        !           319:                        rscsi_disks[i].capacity = (buffer[0] << 24) |   
        !           320:                                                  (buffer[1] << 16) |
        !           321:                                                  (buffer[2] << 8) |
        !           322:                                                  buffer[3];
        !           323: 
        !           324:                        if ((rscsi_disks[i].sector_size = (buffer[4] << 24) |
        !           325:                                                     (buffer[5] << 16) |  
        !           326:                                                     (buffer[6] << 8) | 
        !           327:                                                     buffer[7]) != 512)
        !           328:                                {
        !           329:                                printk ("Unsupported sector size %d for sd %d",
        !           330:                                         rscsi_disks[i].sector_size, i);
        !           331:                                rscsi_disks[i].use = 0;
        !           332:                                }
        !           333:                        }
        !           334: 
        !           335:                if (rscsi_disks[i].use)
        !           336:                        {
        !           337:                        scsi_disks[j = (i << 4)].start_sect = 0;
        !           338: 
        !           339:                        sd_sizes[j]=(scsi_disks[j].nr_sects =  rscsi_disks[i].capacity)>>1;
        !           340: #ifdef DEBUG
        !           341:                        printk("/dev/sd%1d size = %d\n", j, sd_sizes[j]);
        !           342: #endif
        !           343:                        cmd[0] = READ_6;
        !           344:                        cmd[2] = cmd[3] = cmd[5] = 0; 
        !           345:                        cmd[4] = 1;
        !           346:                        the_result = -1;
        !           347:        
        !           348:                        scsi_do_cmd (rscsi_disks[i].device->host_no ,  rscsi_disks[i].device->id, 
        !           349:                                (void *) cmd, (void *) buffer, 512, sd_init_done,  SD_TIMEOUT, 
        !           350:                                sense_buffer, MAX_RETRIES);
        !           351:                                        
        !           352:                        while (the_result < 0);
        !           353: 
        !           354: 
        !           355:                        if (the_result || (0xaa55 != *(unsigned short *)(buffer + 510)))
        !           356:                                        {
        !           357:                                        printk ("Cannot read partition table for sd %d"
        !           358:                                                "\n\r",i);
        !           359:                                        rscsi_disks[i].use = 0;                                 
        !           360:                                        }
        !           361:                        else
        !           362:                                for (++j, k=j+4, p=(Partition *) (buffer + 0x1be); j < k; ++j, ++p)
        !           363:                                        {
        !           364:                                        memcpy ((void *) &scsi_disks[j], (void *) p, sizeof(Partition));        
        !           365:                                        sd_sizes[j]=(scsi_disks[j].nr_sects)>>1;
        !           366: #ifdef DEBUG
        !           367:        printk("/dev/sd%1d size = %d (%d blocks), offset = %d\n", j, scsi_disks[j].nr_sects, sd_sizes[j], scsi_disks[j].start_sect);
        !           368: #endif
        !           369:                                        }
        !           370:                
        !           371:                        rscsi_disks[i].ten = 1;
        !           372:                        rscsi_disks[i].remap = 1;
        !           373:                        }
        !           374:                }
        !           375:        blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
        !           376:        blk_size[MAJOR_NR] = sd_sizes;  
        !           377:        blkdev_fops[MAJOR_NR] = &sd_fops; 
        !           378: }      
        !           379: #endif
        !           380: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.