LCOV - code coverage report
Current view: top level - drivers/scsi - sr.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 235 476 49.4 %
Date: 2022-03-28 13:20:08 Functions: 14 22 63.6 %
Branches: 63 206 30.6 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  *  sr.c Copyright (C) 1992 David Giller
       4                 :            :  *           Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
       5                 :            :  *
       6                 :            :  *  adapted from:
       7                 :            :  *      sd.c Copyright (C) 1992 Drew Eckhardt
       8                 :            :  *      Linux scsi disk driver by
       9                 :            :  *              Drew Eckhardt <drew@colorado.edu>
      10                 :            :  *
      11                 :            :  *      Modified by Eric Youngdale ericy@andante.org to
      12                 :            :  *      add scatter-gather, multiple outstanding request, and other
      13                 :            :  *      enhancements.
      14                 :            :  *
      15                 :            :  *      Modified by Eric Youngdale eric@andante.org to support loadable
      16                 :            :  *      low-level scsi drivers.
      17                 :            :  *
      18                 :            :  *      Modified by Thomas Quinot thomas@melchior.cuivre.fdn.fr to
      19                 :            :  *      provide auto-eject.
      20                 :            :  *
      21                 :            :  *      Modified by Gerd Knorr <kraxel@cs.tu-berlin.de> to support the
      22                 :            :  *      generic cdrom interface
      23                 :            :  *
      24                 :            :  *      Modified by Jens Axboe <axboe@suse.de> - Uniform sr_packet()
      25                 :            :  *      interface, capabilities probe additions, ioctl cleanups, etc.
      26                 :            :  *
      27                 :            :  *      Modified by Richard Gooch <rgooch@atnf.csiro.au> to support devfs
      28                 :            :  *
      29                 :            :  *      Modified by Jens Axboe <axboe@suse.de> - support DVD-RAM
      30                 :            :  *      transparently and lose the GHOST hack
      31                 :            :  *
      32                 :            :  *      Modified by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
      33                 :            :  *      check resource allocation in sr_init and some cleanups
      34                 :            :  */
      35                 :            : 
      36                 :            : #include <linux/module.h>
      37                 :            : #include <linux/fs.h>
      38                 :            : #include <linux/kernel.h>
      39                 :            : #include <linux/mm.h>
      40                 :            : #include <linux/bio.h>
      41                 :            : #include <linux/compat.h>
      42                 :            : #include <linux/string.h>
      43                 :            : #include <linux/errno.h>
      44                 :            : #include <linux/cdrom.h>
      45                 :            : #include <linux/interrupt.h>
      46                 :            : #include <linux/init.h>
      47                 :            : #include <linux/blkdev.h>
      48                 :            : #include <linux/blk-pm.h>
      49                 :            : #include <linux/mutex.h>
      50                 :            : #include <linux/slab.h>
      51                 :            : #include <linux/pm_runtime.h>
      52                 :            : #include <linux/uaccess.h>
      53                 :            : 
      54                 :            : #include <scsi/scsi.h>
      55                 :            : #include <scsi/scsi_dbg.h>
      56                 :            : #include <scsi/scsi_device.h>
      57                 :            : #include <scsi/scsi_driver.h>
      58                 :            : #include <scsi/scsi_cmnd.h>
      59                 :            : #include <scsi/scsi_eh.h>
      60                 :            : #include <scsi/scsi_host.h>
      61                 :            : #include <scsi/scsi_ioctl.h>      /* For the door lock/unlock commands */
      62                 :            : 
      63                 :            : #include "scsi_logging.h"
      64                 :            : #include "sr.h"
      65                 :            : 
      66                 :            : 
      67                 :            : MODULE_DESCRIPTION("SCSI cdrom (sr) driver");
      68                 :            : MODULE_LICENSE("GPL");
      69                 :            : MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR);
      70                 :            : MODULE_ALIAS_SCSI_DEVICE(TYPE_ROM);
      71                 :            : MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM);
      72                 :            : 
      73                 :            : #define SR_DISKS        256
      74                 :            : 
      75                 :            : #define SR_CAPABILITIES \
      76                 :            :         (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
      77                 :            :          CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
      78                 :            :          CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \
      79                 :            :          CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
      80                 :            :          CDC_MRW|CDC_MRW_W|CDC_RAM)
      81                 :            : 
      82                 :            : static DEFINE_MUTEX(sr_mutex);
      83                 :            : static int sr_probe(struct device *);
      84                 :            : static int sr_remove(struct device *);
      85                 :            : static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt);
      86                 :            : static int sr_done(struct scsi_cmnd *);
      87                 :            : static int sr_runtime_suspend(struct device *dev);
      88                 :            : 
      89                 :            : static const struct dev_pm_ops sr_pm_ops = {
      90                 :            :         .runtime_suspend        = sr_runtime_suspend,
      91                 :            : };
      92                 :            : 
      93                 :            : static struct scsi_driver sr_template = {
      94                 :            :         .gendrv = {
      95                 :            :                 .name           = "sr",
      96                 :            :                 .owner          = THIS_MODULE,
      97                 :            :                 .probe          = sr_probe,
      98                 :            :                 .remove         = sr_remove,
      99                 :            :                 .pm             = &sr_pm_ops,
     100                 :            :         },
     101                 :            :         .init_command           = sr_init_command,
     102                 :            :         .done                   = sr_done,
     103                 :            : };
     104                 :            : 
     105                 :            : static unsigned long sr_index_bits[SR_DISKS / BITS_PER_LONG];
     106                 :            : static DEFINE_SPINLOCK(sr_index_lock);
     107                 :            : 
     108                 :            : /* This semaphore is used to mediate the 0->1 reference get in the
     109                 :            :  * face of object destruction (i.e. we can't allow a get on an
     110                 :            :  * object after last put) */
     111                 :            : static DEFINE_MUTEX(sr_ref_mutex);
     112                 :            : 
     113                 :            : static int sr_open(struct cdrom_device_info *, int);
     114                 :            : static void sr_release(struct cdrom_device_info *);
     115                 :            : 
     116                 :            : static void get_sectorsize(struct scsi_cd *);
     117                 :            : static void get_capabilities(struct scsi_cd *);
     118                 :            : 
     119                 :            : static unsigned int sr_check_events(struct cdrom_device_info *cdi,
     120                 :            :                                     unsigned int clearing, int slot);
     121                 :            : static int sr_packet(struct cdrom_device_info *, struct packet_command *);
     122                 :            : 
     123                 :            : static const struct cdrom_device_ops sr_dops = {
     124                 :            :         .open                   = sr_open,
     125                 :            :         .release                = sr_release,
     126                 :            :         .drive_status           = sr_drive_status,
     127                 :            :         .check_events           = sr_check_events,
     128                 :            :         .tray_move              = sr_tray_move,
     129                 :            :         .lock_door              = sr_lock_door,
     130                 :            :         .select_speed           = sr_select_speed,
     131                 :            :         .get_last_session       = sr_get_last_session,
     132                 :            :         .get_mcn                = sr_get_mcn,
     133                 :            :         .reset                  = sr_reset,
     134                 :            :         .audio_ioctl            = sr_audio_ioctl,
     135                 :            :         .capability             = SR_CAPABILITIES,
     136                 :            :         .generic_packet         = sr_packet,
     137                 :            : };
     138                 :            : 
     139                 :            : static void sr_kref_release(struct kref *kref);
     140                 :            : 
     141                 :        360 : static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
     142                 :            : {
     143                 :        360 :         return container_of(disk->private_data, struct scsi_cd, driver);
     144                 :            : }
     145                 :            : 
     146                 :          0 : static int sr_runtime_suspend(struct device *dev)
     147                 :            : {
     148         [ #  # ]:          0 :         struct scsi_cd *cd = dev_get_drvdata(dev);
     149                 :            : 
     150         [ #  # ]:          0 :         if (!cd)        /* E.g.: runtime suspend following sr_remove() */
     151                 :            :                 return 0;
     152                 :            : 
     153         [ #  # ]:          0 :         if (cd->media_present)
     154                 :            :                 return -EBUSY;
     155                 :            :         else
     156                 :          0 :                 return 0;
     157                 :            : }
     158                 :            : 
     159                 :            : /*
     160                 :            :  * The get and put routines for the struct scsi_cd.  Note this entity
     161                 :            :  * has a scsi_device pointer and owns a reference to this.
     162                 :            :  */
     163                 :            : static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk)
     164                 :            : {
     165                 :            :         struct scsi_cd *cd = NULL;
     166                 :            : 
     167                 :            :         mutex_lock(&sr_ref_mutex);
     168                 :            :         if (disk->private_data == NULL)
     169                 :            :                 goto out;
     170                 :            :         cd = scsi_cd(disk);
     171                 :            :         kref_get(&cd->kref);
     172                 :            :         if (scsi_device_get(cd->device)) {
     173                 :            :                 kref_put(&cd->kref, sr_kref_release);
     174                 :            :                 cd = NULL;
     175                 :            :         }
     176                 :            :  out:
     177                 :            :         mutex_unlock(&sr_ref_mutex);
     178                 :            :         return cd;
     179                 :            : }
     180                 :            : 
     181                 :        450 : static void scsi_cd_put(struct scsi_cd *cd)
     182                 :            : {
     183                 :        450 :         struct scsi_device *sdev = cd->device;
     184                 :            : 
     185                 :        450 :         mutex_lock(&sr_ref_mutex);
     186                 :        450 :         kref_put(&cd->kref, sr_kref_release);
     187                 :        450 :         scsi_device_put(sdev);
     188                 :        450 :         mutex_unlock(&sr_ref_mutex);
     189                 :        450 : }
     190                 :            : 
     191                 :        300 : static unsigned int sr_get_events(struct scsi_device *sdev)
     192                 :            : {
     193                 :        300 :         u8 buf[8];
     194                 :        300 :         u8 cmd[] = { GET_EVENT_STATUS_NOTIFICATION,
     195                 :            :                      1,                 /* polled */
     196                 :            :                      0, 0,              /* reserved */
     197                 :            :                      1 << 4,              /* notification class: media */
     198                 :            :                      0, 0,              /* reserved */
     199                 :            :                      0, sizeof(buf),    /* allocation length */
     200                 :            :                      0,                 /* control */
     201                 :            :         };
     202                 :        300 :         struct event_header *eh = (void *)buf;
     203                 :        300 :         struct media_event_desc *med = (void *)(buf + 4);
     204                 :        300 :         struct scsi_sense_hdr sshdr;
     205                 :        300 :         int result;
     206                 :            : 
     207                 :        300 :         result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, sizeof(buf),
     208                 :            :                                   &sshdr, SR_TIMEOUT, MAX_RETRIES, NULL);
     209   [ -  +  -  - ]:        300 :         if (scsi_sense_valid(&sshdr) && sshdr.sense_key == UNIT_ATTENTION)
     210                 :            :                 return DISK_EVENT_MEDIA_CHANGE;
     211                 :            : 
     212   [ +  -  +  - ]:        300 :         if (result || be16_to_cpu(eh->data_len) < sizeof(*med))
     213                 :            :                 return 0;
     214                 :            : 
     215         [ +  - ]:        300 :         if (eh->nea || eh->notification_class != 0x4)
     216                 :            :                 return 0;
     217                 :            : 
     218         [ +  - ]:        300 :         if (med->media_event_code == 1)
     219                 :            :                 return DISK_EVENT_EJECT_REQUEST;
     220         [ -  + ]:        300 :         else if (med->media_event_code == 2)
     221                 :          0 :                 return DISK_EVENT_MEDIA_CHANGE;
     222                 :            :         return 0;
     223                 :            : }
     224                 :            : 
     225                 :            : /*
     226                 :            :  * This function checks to see if the media has been changed or eject
     227                 :            :  * button has been pressed.  It is possible that we have already
     228                 :            :  * sensed a change, or the drive may have sensed one and not yet
     229                 :            :  * reported it.  The past events are accumulated in sdev->changed and
     230                 :            :  * returned together with the current state.
     231                 :            :  */
     232                 :        300 : static unsigned int sr_check_events(struct cdrom_device_info *cdi,
     233                 :            :                                     unsigned int clearing, int slot)
     234                 :            : {
     235                 :        300 :         struct scsi_cd *cd = cdi->handle;
     236                 :        300 :         bool last_present;
     237                 :        300 :         struct scsi_sense_hdr sshdr;
     238                 :        300 :         unsigned int events;
     239                 :        300 :         int ret;
     240                 :            : 
     241                 :            :         /* no changer support */
     242         [ +  - ]:        300 :         if (CDSL_CURRENT != slot)
     243                 :            :                 return 0;
     244                 :            : 
     245                 :        300 :         events = sr_get_events(cd->device);
     246                 :        300 :         cd->get_event_changed |= events & DISK_EVENT_MEDIA_CHANGE;
     247                 :            : 
     248                 :            :         /*
     249                 :            :          * If earlier GET_EVENT_STATUS_NOTIFICATION and TUR did not agree
     250                 :            :          * for several times in a row.  We rely on TUR only for this likely
     251                 :            :          * broken device, to prevent generating incorrect media changed
     252                 :            :          * events for every open().
     253                 :            :          */
     254         [ -  + ]:        300 :         if (cd->ignore_get_event) {
     255                 :          0 :                 events &= ~DISK_EVENT_MEDIA_CHANGE;
     256                 :          0 :                 goto do_tur;
     257                 :            :         }
     258                 :            : 
     259                 :            :         /*
     260                 :            :          * GET_EVENT_STATUS_NOTIFICATION is enough unless MEDIA_CHANGE
     261                 :            :          * is being cleared.  Note that there are devices which hang
     262                 :            :          * if asked to execute TUR repeatedly.
     263                 :            :          */
     264         [ +  + ]:        300 :         if (cd->device->changed) {
     265                 :         30 :                 events |= DISK_EVENT_MEDIA_CHANGE;
     266                 :         30 :                 cd->device->changed = 0;
     267                 :         30 :                 cd->tur_changed = true;
     268                 :            :         }
     269                 :            : 
     270         [ +  + ]:        300 :         if (!(clearing & DISK_EVENT_MEDIA_CHANGE))
     271                 :            :                 return events;
     272                 :        180 : do_tur:
     273                 :            :         /* let's see whether the media is there with TUR */
     274                 :        180 :         last_present = cd->media_present;
     275                 :        180 :         ret = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
     276                 :            : 
     277                 :            :         /*
     278                 :            :          * Media is considered to be present if TUR succeeds or fails with
     279                 :            :          * sense data indicating something other than media-not-present
     280                 :            :          * (ASC 0x3a).
     281                 :            :          */
     282   [ +  -  +  - ]:        360 :         cd->media_present = scsi_status_is_good(ret) ||
     283         [ -  + ]:        180 :                 (scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
     284                 :            : 
     285         [ +  + ]:        180 :         if (last_present != cd->media_present)
     286                 :         30 :                 cd->device->changed = 1;
     287                 :            : 
     288         [ +  + ]:        180 :         if (cd->device->changed) {
     289                 :         30 :                 events |= DISK_EVENT_MEDIA_CHANGE;
     290                 :         30 :                 cd->device->changed = 0;
     291                 :         30 :                 cd->tur_changed = true;
     292                 :            :         }
     293                 :            : 
     294         [ +  - ]:        180 :         if (cd->ignore_get_event)
     295                 :            :                 return events;
     296                 :            : 
     297                 :            :         /* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */
     298         [ +  + ]:        180 :         if (!cd->tur_changed) {
     299         [ -  + ]:        150 :                 if (cd->get_event_changed) {
     300         [ #  # ]:          0 :                         if (cd->tur_mismatch++ > 8) {
     301                 :          0 :                                 sr_printk(KERN_WARNING, cd,
     302                 :            :                                           "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
     303                 :          0 :                                 cd->ignore_get_event = true;
     304                 :            :                         }
     305                 :            :                 } else {
     306                 :        150 :                         cd->tur_mismatch = 0;
     307                 :            :                 }
     308                 :            :         }
     309                 :        180 :         cd->tur_changed = false;
     310                 :        180 :         cd->get_event_changed = false;
     311                 :            : 
     312                 :        180 :         return events;
     313                 :            : }
     314                 :            : 
     315                 :            : /*
     316                 :            :  * sr_done is the interrupt routine for the device driver.
     317                 :            :  *
     318                 :            :  * It will be notified on the end of a SCSI read / write, and will take one
     319                 :            :  * of several actions based on success or failure.
     320                 :            :  */
     321                 :          0 : static int sr_done(struct scsi_cmnd *SCpnt)
     322                 :            : {
     323                 :          0 :         int result = SCpnt->result;
     324         [ #  # ]:          0 :         int this_count = scsi_bufflen(SCpnt);
     325         [ #  # ]:          0 :         int good_bytes = (result == 0 ? this_count : 0);
     326                 :          0 :         int block_sectors = 0;
     327                 :          0 :         long error_sector;
     328                 :          0 :         struct scsi_cd *cd = scsi_cd(SCpnt->request->rq_disk);
     329                 :            : 
     330                 :            : #ifdef DEBUG
     331                 :            :         scmd_printk(KERN_INFO, SCpnt, "done: %x\n", result);
     332                 :            : #endif
     333                 :            : 
     334                 :            :         /*
     335                 :            :          * Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial
     336                 :            :          * success.  Since this is a relatively rare error condition, no
     337                 :            :          * care is taken to avoid unnecessary additional work such as
     338                 :            :          * memcpy's that could be avoided.
     339                 :            :          */
     340         [ #  # ]:          0 :         if (driver_byte(result) != 0 &&         /* An error occurred */
     341         [ #  # ]:          0 :             (SCpnt->sense_buffer[0] & 0x7f) == 0x70) { /* Sense current */
     342      [ #  #  # ]:          0 :                 switch (SCpnt->sense_buffer[2]) {
     343                 :          0 :                 case MEDIUM_ERROR:
     344                 :            :                 case VOLUME_OVERFLOW:
     345                 :            :                 case ILLEGAL_REQUEST:
     346         [ #  # ]:          0 :                         if (!(SCpnt->sense_buffer[0] & 0x90))
     347                 :            :                                 break;
     348                 :          0 :                         error_sector = (SCpnt->sense_buffer[3] << 24) |
     349                 :          0 :                                 (SCpnt->sense_buffer[4] << 16) |
     350                 :          0 :                                 (SCpnt->sense_buffer[5] << 8) |
     351                 :          0 :                                 SCpnt->sense_buffer[6];
     352         [ #  # ]:          0 :                         if (SCpnt->request->bio != NULL)
     353                 :          0 :                                 block_sectors =
     354                 :          0 :                                         bio_sectors(SCpnt->request->bio);
     355         [ #  # ]:          0 :                         if (block_sectors < 4)
     356                 :          0 :                                 block_sectors = 4;
     357         [ #  # ]:          0 :                         if (cd->device->sector_size == 2048)
     358                 :          0 :                                 error_sector <<= 2;
     359                 :          0 :                         error_sector &= ~(block_sectors - 1);
     360                 :          0 :                         good_bytes = (error_sector -
     361         [ #  # ]:          0 :                                       blk_rq_pos(SCpnt->request)) << 9;
     362         [ #  # ]:          0 :                         if (good_bytes < 0 || good_bytes >= this_count)
     363                 :          0 :                                 good_bytes = 0;
     364                 :            :                         /*
     365                 :            :                          * The SCSI specification allows for the value
     366                 :            :                          * returned by READ CAPACITY to be up to 75 2K
     367                 :            :                          * sectors past the last readable block.
     368                 :            :                          * Therefore, if we hit a medium error within the
     369                 :            :                          * last 75 2K sectors, we decrease the saved size
     370                 :            :                          * value.
     371                 :            :                          */
     372         [ #  # ]:          0 :                         if (error_sector < get_capacity(cd->disk) &&
     373         [ #  # ]:          0 :                             cd->capacity - error_sector < 4 * 75)
     374                 :          0 :                                 set_capacity(cd->disk, error_sector);
     375                 :            :                         break;
     376                 :            : 
     377                 :          0 :                 case RECOVERED_ERROR:
     378                 :          0 :                         good_bytes = this_count;
     379                 :          0 :                         break;
     380                 :            : 
     381                 :            :                 default:
     382                 :            :                         break;
     383                 :            :                 }
     384                 :          0 :         }
     385                 :            : 
     386                 :          0 :         return good_bytes;
     387                 :            : }
     388                 :            : 
     389                 :          0 : static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt)
     390                 :            : {
     391                 :          0 :         int block = 0, this_count, s_size;
     392                 :          0 :         struct scsi_cd *cd;
     393                 :          0 :         struct request *rq = SCpnt->request;
     394                 :          0 :         blk_status_t ret;
     395                 :            : 
     396                 :          0 :         ret = scsi_init_io(SCpnt);
     397         [ #  # ]:          0 :         if (ret != BLK_STS_OK)
     398                 :          0 :                 goto out;
     399                 :          0 :         cd = scsi_cd(rq->rq_disk);
     400                 :            : 
     401                 :            :         /* from here on until we're complete, any goto out
     402                 :            :          * is used for a killable error condition */
     403                 :          0 :         ret = BLK_STS_IOERR;
     404                 :            : 
     405                 :          0 :         SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
     406                 :          0 :                 "Doing sr request, block = %d\n", block));
     407                 :            : 
     408   [ #  #  #  # ]:          0 :         if (!cd->device || !scsi_device_online(cd->device)) {
     409                 :          0 :                 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
     410                 :          0 :                         "Finishing %u sectors\n", blk_rq_sectors(rq)));
     411                 :          0 :                 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
     412                 :          0 :                         "Retry with 0x%p\n", SCpnt));
     413                 :          0 :                 goto out;
     414                 :            :         }
     415                 :            : 
     416         [ #  # ]:          0 :         if (cd->device->changed) {
     417                 :            :                 /*
     418                 :            :                  * quietly refuse to do anything to a changed disc until the
     419                 :            :                  * changed bit has been reset
     420                 :            :                  */
     421                 :          0 :                 goto out;
     422                 :            :         }
     423                 :            : 
     424                 :            :         /*
     425                 :            :          * we do lazy blocksize switching (when reading XA sectors,
     426                 :            :          * see CDROMREADMODE2 ioctl) 
     427                 :            :          */
     428                 :          0 :         s_size = cd->device->sector_size;
     429         [ #  # ]:          0 :         if (s_size > 2048) {
     430         [ #  # ]:          0 :                 if (!in_interrupt())
     431                 :          0 :                         sr_set_blocklength(cd, 2048);
     432                 :            :                 else
     433                 :          0 :                         scmd_printk(KERN_INFO, SCpnt,
     434                 :            :                                     "can't switch blocksize: in interrupt\n");
     435                 :            :         }
     436                 :            : 
     437   [ #  #  #  # ]:          0 :         if (s_size != 512 && s_size != 1024 && s_size != 2048) {
     438                 :          0 :                 scmd_printk(KERN_ERR, SCpnt, "bad sector size %d\n", s_size);
     439                 :          0 :                 goto out;
     440                 :            :         }
     441                 :            : 
     442      [ #  #  # ]:          0 :         switch (req_op(rq)) {
     443                 :          0 :         case REQ_OP_WRITE:
     444         [ #  # ]:          0 :                 if (!cd->writeable)
     445                 :          0 :                         goto out;
     446                 :          0 :                 SCpnt->cmnd[0] = WRITE_10;
     447                 :          0 :                 cd->cdi.media_written = 1;
     448                 :          0 :                 break;
     449                 :          0 :         case REQ_OP_READ:
     450                 :          0 :                 SCpnt->cmnd[0] = READ_10;
     451                 :          0 :                 break;
     452                 :          0 :         default:
     453                 :          0 :                 blk_dump_rq_flags(rq, "Unknown sr command");
     454                 :          0 :                 goto out;
     455                 :            :         }
     456                 :            : 
     457                 :            :         {
     458                 :          0 :                 struct scatterlist *sg;
     459                 :          0 :                 int i, size = 0, sg_count = scsi_sg_count(SCpnt);
     460                 :            : 
     461         [ #  # ]:          0 :                 scsi_for_each_sg(SCpnt, sg, sg_count, i)
     462                 :          0 :                         size += sg->length;
     463                 :            : 
     464         [ #  # ]:          0 :                 if (size != scsi_bufflen(SCpnt)) {
     465                 :          0 :                         scmd_printk(KERN_ERR, SCpnt,
     466                 :            :                                 "mismatch count %d, bytes %d\n",
     467                 :            :                                 size, scsi_bufflen(SCpnt));
     468         [ #  # ]:          0 :                         if (scsi_bufflen(SCpnt) > size)
     469                 :          0 :                                 SCpnt->sdb.length = size;
     470                 :            :                 }
     471                 :            :         }
     472                 :            : 
     473                 :            :         /*
     474                 :            :          * request doesn't start on hw block boundary, add scatter pads
     475                 :            :          */
     476         [ #  # ]:          0 :         if (((unsigned int)blk_rq_pos(rq) % (s_size >> 9)) ||
     477         [ #  # ]:          0 :             (scsi_bufflen(SCpnt) % s_size)) {
     478                 :          0 :                 scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
     479                 :          0 :                 goto out;
     480                 :            :         }
     481                 :            : 
     482         [ #  # ]:          0 :         this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
     483                 :            : 
     484                 :            : 
     485                 :          0 :         SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
     486                 :            :                                         "%s %d/%u 512 byte blocks.\n",
     487                 :            :                                         (rq_data_dir(rq) == WRITE) ?
     488                 :            :                                         "writing" : "reading",
     489                 :          0 :                                         this_count, blk_rq_sectors(rq)));
     490                 :            : 
     491                 :          0 :         SCpnt->cmnd[1] = 0;
     492         [ #  # ]:          0 :         block = (unsigned int)blk_rq_pos(rq) / (s_size >> 9);
     493                 :            : 
     494         [ #  # ]:          0 :         if (this_count > 0xffff) {
     495                 :          0 :                 this_count = 0xffff;
     496                 :          0 :                 SCpnt->sdb.length = this_count * s_size;
     497                 :            :         }
     498                 :            : 
     499                 :          0 :         SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff;
     500                 :          0 :         SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff;
     501                 :          0 :         SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff;
     502                 :          0 :         SCpnt->cmnd[5] = (unsigned char) block & 0xff;
     503                 :          0 :         SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
     504                 :          0 :         SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff;
     505                 :          0 :         SCpnt->cmnd[8] = (unsigned char) this_count & 0xff;
     506                 :            : 
     507                 :            :         /*
     508                 :            :          * We shouldn't disconnect in the middle of a sector, so with a dumb
     509                 :            :          * host adapter, it's safe to assume that we can at least transfer
     510                 :            :          * this many bytes between each connect / disconnect.
     511                 :            :          */
     512                 :          0 :         SCpnt->transfersize = cd->device->sector_size;
     513                 :          0 :         SCpnt->underflow = this_count << 9;
     514                 :          0 :         SCpnt->allowed = MAX_RETRIES;
     515                 :            : 
     516                 :            :         /*
     517                 :            :          * This indicates that the command is ready from our end to be
     518                 :            :          * queued.
     519                 :            :          */
     520                 :          0 :         ret = BLK_STS_OK;
     521                 :          0 :  out:
     522                 :          0 :         return ret;
     523                 :            : }
     524                 :            : 
     525                 :         90 : static int sr_block_open(struct block_device *bdev, fmode_t mode)
     526                 :            : {
     527                 :         90 :         struct scsi_cd *cd;
     528                 :         90 :         struct scsi_device *sdev;
     529                 :         90 :         int ret = -ENXIO;
     530                 :            : 
     531                 :         90 :         cd = scsi_cd_get(bdev->bd_disk);
     532         [ -  + ]:         90 :         if (!cd)
     533                 :          0 :                 goto out;
     534                 :            : 
     535                 :         90 :         sdev = cd->device;
     536                 :         90 :         scsi_autopm_get_device(sdev);
     537                 :         90 :         check_disk_change(bdev);
     538                 :            : 
     539                 :         90 :         mutex_lock(&sr_mutex);
     540                 :         90 :         ret = cdrom_open(&cd->cdi, bdev, mode);
     541                 :         90 :         mutex_unlock(&sr_mutex);
     542                 :            : 
     543                 :         90 :         scsi_autopm_put_device(sdev);
     544         [ +  - ]:         90 :         if (ret)
     545                 :          0 :                 scsi_cd_put(cd);
     546                 :            : 
     547                 :         90 : out:
     548                 :         90 :         return ret;
     549                 :            : }
     550                 :            : 
     551                 :         90 : static void sr_block_release(struct gendisk *disk, fmode_t mode)
     552                 :            : {
     553                 :         90 :         struct scsi_cd *cd = scsi_cd(disk);
     554                 :         90 :         mutex_lock(&sr_mutex);
     555                 :         90 :         cdrom_release(&cd->cdi, mode);
     556                 :         90 :         scsi_cd_put(cd);
     557                 :         90 :         mutex_unlock(&sr_mutex);
     558                 :         90 : }
     559                 :            : 
     560                 :        270 : static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
     561                 :            :                           unsigned long arg)
     562                 :            : {
     563                 :        270 :         struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
     564                 :        270 :         struct scsi_device *sdev = cd->device;
     565                 :        270 :         void __user *argp = (void __user *)arg;
     566                 :        270 :         int ret;
     567                 :            : 
     568                 :        270 :         mutex_lock(&sr_mutex);
     569                 :            : 
     570                 :        270 :         ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
     571                 :        270 :                         (mode & FMODE_NDELAY) != 0);
     572         [ -  + ]:        270 :         if (ret)
     573                 :          0 :                 goto out;
     574                 :            : 
     575                 :        270 :         scsi_autopm_get_device(sdev);
     576                 :            : 
     577                 :            :         /*
     578                 :            :          * Send SCSI addressing ioctls directly to mid level, send other
     579                 :            :          * ioctls to cdrom/block level.
     580                 :            :          */
     581         [ -  + ]:        270 :         switch (cmd) {
     582                 :          0 :         case SCSI_IOCTL_GET_IDLUN:
     583                 :            :         case SCSI_IOCTL_GET_BUS_NUMBER:
     584                 :          0 :                 ret = scsi_ioctl(sdev, cmd, argp);
     585                 :          0 :                 goto put;
     586                 :            :         }
     587                 :            : 
     588                 :        270 :         ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
     589         [ +  - ]:        270 :         if (ret != -ENOSYS)
     590                 :        270 :                 goto put;
     591                 :            : 
     592                 :          0 :         ret = scsi_ioctl(sdev, cmd, argp);
     593                 :            : 
     594                 :        270 : put:
     595                 :        270 :         scsi_autopm_put_device(sdev);
     596                 :            : 
     597                 :        270 : out:
     598                 :        270 :         mutex_unlock(&sr_mutex);
     599                 :        270 :         return ret;
     600                 :            : }
     601                 :            : 
     602                 :            : #ifdef CONFIG_COMPAT
     603                 :          0 : static int sr_block_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
     604                 :            :                           unsigned long arg)
     605                 :            : {
     606                 :          0 :         struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
     607                 :          0 :         struct scsi_device *sdev = cd->device;
     608                 :          0 :         void __user *argp = compat_ptr(arg);
     609                 :          0 :         int ret;
     610                 :            : 
     611                 :          0 :         mutex_lock(&sr_mutex);
     612                 :            : 
     613                 :          0 :         ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
     614                 :          0 :                         (mode & FMODE_NDELAY) != 0);
     615         [ #  # ]:          0 :         if (ret)
     616                 :          0 :                 goto out;
     617                 :            : 
     618                 :          0 :         scsi_autopm_get_device(sdev);
     619                 :            : 
     620                 :            :         /*
     621                 :            :          * Send SCSI addressing ioctls directly to mid level, send other
     622                 :            :          * ioctls to cdrom/block level.
     623                 :            :          */
     624         [ #  # ]:          0 :         switch (cmd) {
     625                 :          0 :         case SCSI_IOCTL_GET_IDLUN:
     626                 :            :         case SCSI_IOCTL_GET_BUS_NUMBER:
     627                 :          0 :                 ret = scsi_compat_ioctl(sdev, cmd, argp);
     628                 :          0 :                 goto put;
     629                 :            :         }
     630                 :            : 
     631                 :          0 :         ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, (unsigned long)argp);
     632         [ #  # ]:          0 :         if (ret != -ENOSYS)
     633                 :          0 :                 goto put;
     634                 :            : 
     635                 :          0 :         ret = scsi_compat_ioctl(sdev, cmd, argp);
     636                 :            : 
     637                 :          0 : put:
     638                 :          0 :         scsi_autopm_put_device(sdev);
     639                 :            : 
     640                 :          0 : out:
     641                 :          0 :         mutex_unlock(&sr_mutex);
     642                 :          0 :         return ret;
     643                 :            : 
     644                 :            : }
     645                 :            : #endif
     646                 :            : 
     647                 :        300 : static unsigned int sr_block_check_events(struct gendisk *disk,
     648                 :            :                                           unsigned int clearing)
     649                 :            : {
     650                 :        300 :         unsigned int ret = 0;
     651                 :        300 :         struct scsi_cd *cd;
     652                 :            : 
     653                 :        300 :         cd = scsi_cd_get(disk);
     654         [ +  - ]:        300 :         if (!cd)
     655                 :            :                 return 0;
     656                 :            : 
     657         [ +  - ]:        300 :         if (!atomic_read(&cd->device->disk_events_disable_depth))
     658                 :        300 :                 ret = cdrom_check_events(&cd->cdi, clearing);
     659                 :            : 
     660                 :        300 :         scsi_cd_put(cd);
     661                 :        300 :         return ret;
     662                 :            : }
     663                 :            : 
     664                 :         60 : static int sr_block_revalidate_disk(struct gendisk *disk)
     665                 :            : {
     666                 :         60 :         struct scsi_sense_hdr sshdr;
     667                 :         60 :         struct scsi_cd *cd;
     668                 :            : 
     669                 :         60 :         cd = scsi_cd_get(disk);
     670         [ +  - ]:         60 :         if (!cd)
     671                 :            :                 return -ENXIO;
     672                 :            : 
     673                 :            :         /* if the unit is not ready, nothing more to do */
     674         [ +  - ]:         60 :         if (scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
     675                 :         60 :                 goto out;
     676                 :            : 
     677                 :          0 :         sr_cd_check(&cd->cdi);
     678                 :          0 :         get_sectorsize(cd);
     679                 :         60 : out:
     680                 :         60 :         scsi_cd_put(cd);
     681                 :         60 :         return 0;
     682                 :            : }
     683                 :            : 
     684                 :            : static const struct block_device_operations sr_bdops =
     685                 :            : {
     686                 :            :         .owner          = THIS_MODULE,
     687                 :            :         .open           = sr_block_open,
     688                 :            :         .release        = sr_block_release,
     689                 :            :         .ioctl          = sr_block_ioctl,
     690                 :            : #ifdef CONFIG_COMPAT
     691                 :            :         .compat_ioctl   = sr_block_compat_ioctl,
     692                 :            : #endif
     693                 :            :         .check_events   = sr_block_check_events,
     694                 :            :         .revalidate_disk = sr_block_revalidate_disk,
     695                 :            : };
     696                 :            : 
     697                 :         90 : static int sr_open(struct cdrom_device_info *cdi, int purpose)
     698                 :            : {
     699                 :         90 :         struct scsi_cd *cd = cdi->handle;
     700                 :         90 :         struct scsi_device *sdev = cd->device;
     701                 :         90 :         int retval;
     702                 :            : 
     703                 :            :         /*
     704                 :            :          * If the device is in error recovery, wait until it is done.
     705                 :            :          * If the device is offline, then disallow any access to it.
     706                 :            :          */
     707                 :         90 :         retval = -ENXIO;
     708         [ -  + ]:         90 :         if (!scsi_block_when_processing_errors(sdev))
     709                 :          0 :                 goto error_out;
     710                 :            : 
     711                 :            :         return 0;
     712                 :            : 
     713                 :            : error_out:
     714                 :          0 :         return retval;  
     715                 :            : }
     716                 :            : 
     717                 :         90 : static void sr_release(struct cdrom_device_info *cdi)
     718                 :            : {
     719                 :         90 :         struct scsi_cd *cd = cdi->handle;
     720                 :            : 
     721         [ -  + ]:         90 :         if (cd->device->sector_size > 2048)
     722                 :          0 :                 sr_set_blocklength(cd, 2048);
     723                 :            : 
     724                 :         90 : }
     725                 :            : 
     726                 :         90 : static int sr_probe(struct device *dev)
     727                 :            : {
     728                 :         90 :         struct scsi_device *sdev = to_scsi_device(dev);
     729                 :         90 :         struct gendisk *disk;
     730                 :         90 :         struct scsi_cd *cd;
     731                 :         90 :         int minor, error;
     732                 :            : 
     733                 :         90 :         scsi_autopm_get_device(sdev);
     734                 :         90 :         error = -ENODEV;
     735         [ +  + ]:         90 :         if (sdev->type != TYPE_ROM && sdev->type != TYPE_WORM)
     736                 :         60 :                 goto fail;
     737                 :            : 
     738                 :         30 :         error = -ENOMEM;
     739                 :         30 :         cd = kzalloc(sizeof(*cd), GFP_KERNEL);
     740         [ -  + ]:         30 :         if (!cd)
     741                 :          0 :                 goto fail;
     742                 :            : 
     743                 :         30 :         kref_init(&cd->kref);
     744                 :            : 
     745                 :         30 :         disk = alloc_disk(1);
     746         [ -  + ]:         30 :         if (!disk)
     747                 :          0 :                 goto fail_free;
     748                 :            : 
     749                 :         30 :         spin_lock(&sr_index_lock);
     750                 :         30 :         minor = find_first_zero_bit(sr_index_bits, SR_DISKS);
     751         [ -  + ]:         30 :         if (minor == SR_DISKS) {
     752                 :          0 :                 spin_unlock(&sr_index_lock);
     753                 :          0 :                 error = -EBUSY;
     754                 :          0 :                 goto fail_put;
     755                 :            :         }
     756                 :         30 :         __set_bit(minor, sr_index_bits);
     757                 :         30 :         spin_unlock(&sr_index_lock);
     758                 :            : 
     759                 :         30 :         disk->major = SCSI_CDROM_MAJOR;
     760                 :         30 :         disk->first_minor = minor;
     761                 :         30 :         sprintf(disk->disk_name, "sr%d", minor);
     762                 :         30 :         disk->fops = &sr_bdops;
     763                 :         30 :         disk->flags = GENHD_FL_CD | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
     764                 :         30 :         disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST;
     765                 :         30 :         disk->event_flags = DISK_EVENT_FLAG_POLL | DISK_EVENT_FLAG_UEVENT;
     766                 :            : 
     767                 :         30 :         blk_queue_rq_timeout(sdev->request_queue, SR_TIMEOUT);
     768                 :            : 
     769                 :         30 :         cd->device = sdev;
     770                 :         30 :         cd->disk = disk;
     771                 :         30 :         cd->driver = &sr_template;
     772                 :         30 :         cd->disk = disk;
     773                 :         30 :         cd->capacity = 0x1fffff;
     774                 :         30 :         cd->device->changed = 1;  /* force recheck CD type */
     775                 :         30 :         cd->media_present = 1;
     776                 :         30 :         cd->use = 1;
     777                 :         30 :         cd->readcd_known = 0;
     778                 :         30 :         cd->readcd_cdda = 0;
     779                 :            : 
     780                 :         30 :         cd->cdi.ops = &sr_dops;
     781                 :         30 :         cd->cdi.handle = cd;
     782                 :         30 :         cd->cdi.mask = 0;
     783                 :         30 :         cd->cdi.capacity = 1;
     784                 :         30 :         sprintf(cd->cdi.name, "sr%d", minor);
     785                 :            : 
     786                 :         30 :         sdev->sector_size = 2048;    /* A guess, just in case */
     787                 :            : 
     788                 :            :         /* FIXME: need to handle a get_capabilities failure properly ?? */
     789                 :         30 :         get_capabilities(cd);
     790                 :         30 :         sr_vendor_init(cd);
     791                 :            : 
     792                 :         30 :         set_capacity(disk, cd->capacity);
     793                 :         30 :         disk->private_data = &cd->driver;
     794                 :         30 :         disk->queue = sdev->request_queue;
     795                 :         30 :         cd->cdi.disk = disk;
     796                 :            : 
     797         [ -  + ]:         30 :         if (register_cdrom(&cd->cdi))
     798                 :          0 :                 goto fail_put;
     799                 :            : 
     800                 :            :         /*
     801                 :            :          * Initialize block layer runtime PM stuffs before the
     802                 :            :          * periodic event checking request gets started in add_disk.
     803                 :            :          */
     804                 :         30 :         blk_pm_runtime_init(sdev->request_queue, dev);
     805                 :            : 
     806                 :         30 :         dev_set_drvdata(dev, cd);
     807                 :         30 :         disk->flags |= GENHD_FL_REMOVABLE;
     808                 :         30 :         device_add_disk(&sdev->sdev_gendev, disk, NULL);
     809                 :            : 
     810                 :         30 :         sdev_printk(KERN_DEBUG, sdev,
     811                 :            :                     "Attached scsi CD-ROM %s\n", cd->cdi.name);
     812                 :         30 :         scsi_autopm_put_device(cd->device);
     813                 :            : 
     814                 :         30 :         return 0;
     815                 :            : 
     816                 :          0 : fail_put:
     817                 :          0 :         put_disk(disk);
     818                 :          0 : fail_free:
     819                 :          0 :         kfree(cd);
     820                 :         60 : fail:
     821                 :         60 :         scsi_autopm_put_device(sdev);
     822                 :         60 :         return error;
     823                 :            : }
     824                 :            : 
     825                 :            : 
     826                 :          0 : static void get_sectorsize(struct scsi_cd *cd)
     827                 :            : {
     828                 :          0 :         unsigned char cmd[10];
     829                 :          0 :         unsigned char buffer[8];
     830                 :          0 :         int the_result, retries = 3;
     831                 :          0 :         int sector_size;
     832                 :          0 :         struct request_queue *queue;
     833                 :            : 
     834                 :          0 :         do {
     835                 :          0 :                 cmd[0] = READ_CAPACITY;
     836                 :          0 :                 memset((void *) &cmd[1], 0, 9);
     837                 :          0 :                 memset(buffer, 0, sizeof(buffer));
     838                 :            : 
     839                 :            :                 /* Do the command and wait.. */
     840                 :          0 :                 the_result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE,
     841                 :            :                                               buffer, sizeof(buffer), NULL,
     842                 :            :                                               SR_TIMEOUT, MAX_RETRIES, NULL);
     843                 :            : 
     844                 :          0 :                 retries--;
     845                 :            : 
     846         [ #  # ]:          0 :         } while (the_result && retries);
     847                 :            : 
     848                 :            : 
     849         [ #  # ]:          0 :         if (the_result) {
     850                 :          0 :                 cd->capacity = 0x1fffff;
     851                 :          0 :                 sector_size = 2048;     /* A guess, just in case */
     852                 :            :         } else {
     853                 :          0 :                 long last_written;
     854                 :            : 
     855                 :          0 :                 cd->capacity = 1 + ((buffer[0] << 24) | (buffer[1] << 16) |
     856                 :          0 :                                     (buffer[2] << 8) | buffer[3]);
     857                 :            :                 /*
     858                 :            :                  * READ_CAPACITY doesn't return the correct size on
     859                 :            :                  * certain UDF media.  If last_written is larger, use
     860                 :            :                  * it instead.
     861                 :            :                  *
     862                 :            :                  * http://bugzilla.kernel.org/show_bug.cgi?id=9668
     863                 :            :                  */
     864         [ #  # ]:          0 :                 if (!cdrom_get_last_written(&cd->cdi, &last_written))
     865                 :          0 :                         cd->capacity = max_t(long, cd->capacity, last_written);
     866                 :            : 
     867                 :          0 :                 sector_size = (buffer[4] << 24) |
     868                 :          0 :                     (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
     869   [ #  #  #  # ]:          0 :                 switch (sector_size) {
     870                 :            :                         /*
     871                 :            :                          * HP 4020i CD-Recorder reports 2340 byte sectors
     872                 :            :                          * Philips CD-Writers report 2352 byte sectors
     873                 :            :                          *
     874                 :            :                          * Use 2k sectors for them..
     875                 :            :                          */
     876                 :          0 :                 case 0:
     877                 :            :                 case 2340:
     878                 :            :                 case 2352:
     879                 :          0 :                         sector_size = 2048;
     880                 :            :                         /* fall through */
     881                 :          0 :                 case 2048:
     882                 :          0 :                         cd->capacity *= 4;
     883                 :            :                         /* fall through */
     884                 :            :                 case 512:
     885                 :            :                         break;
     886                 :          0 :                 default:
     887                 :          0 :                         sr_printk(KERN_INFO, cd,
     888                 :            :                                   "unsupported sector size %d.", sector_size);
     889                 :          0 :                         cd->capacity = 0;
     890                 :            :                 }
     891                 :            : 
     892                 :          0 :                 cd->device->sector_size = sector_size;
     893                 :            : 
     894                 :            :                 /*
     895                 :            :                  * Add this so that we have the ability to correctly gauge
     896                 :            :                  * what the device is capable of.
     897                 :            :                  */
     898                 :          0 :                 set_capacity(cd->disk, cd->capacity);
     899                 :            :         }
     900                 :            : 
     901                 :          0 :         queue = cd->device->request_queue;
     902                 :          0 :         blk_queue_logical_block_size(queue, sector_size);
     903                 :            : 
     904                 :          0 :         return;
     905                 :            : }
     906                 :            : 
     907                 :         30 : static void get_capabilities(struct scsi_cd *cd)
     908                 :            : {
     909                 :         30 :         unsigned char *buffer;
     910                 :         30 :         struct scsi_mode_data data;
     911                 :         30 :         struct scsi_sense_hdr sshdr;
     912                 :         30 :         unsigned int ms_len = 128;
     913                 :         30 :         int rc, n;
     914                 :            : 
     915                 :         30 :         static const char *loadmech[] =
     916                 :            :         {
     917                 :            :                 "caddy",
     918                 :            :                 "tray",
     919                 :            :                 "pop-up",
     920                 :            :                 "",
     921                 :            :                 "changer",
     922                 :            :                 "cartridge changer",
     923                 :            :                 "",
     924                 :            :                 ""
     925                 :            :         };
     926                 :            : 
     927                 :            : 
     928                 :            :         /* allocate transfer buffer */
     929                 :         30 :         buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
     930         [ -  + ]:         30 :         if (!buffer) {
     931                 :          0 :                 sr_printk(KERN_ERR, cd, "out of memory.\n");
     932                 :          0 :                 return;
     933                 :            :         }
     934                 :            : 
     935                 :            :         /* eat unit attentions */
     936                 :         30 :         scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
     937                 :            : 
     938                 :            :         /* ask for mode page 0x2a */
     939                 :         30 :         rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
     940                 :            :                              SR_TIMEOUT, 3, &data, NULL);
     941                 :            : 
     942   [ -  +  +  - ]:         30 :         if (!scsi_status_is_good(rc) || data.length > ms_len ||
     943         [ -  + ]:         30 :             data.header_length + data.block_descriptor_length > data.length) {
     944                 :            :                 /* failed, drive doesn't have capabilities mode page */
     945                 :          0 :                 cd->cdi.speed = 1;
     946                 :          0 :                 cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
     947                 :            :                                  CDC_DVD | CDC_DVD_RAM |
     948                 :            :                                  CDC_SELECT_DISC | CDC_SELECT_SPEED |
     949                 :            :                                  CDC_MRW | CDC_MRW_W | CDC_RAM);
     950                 :          0 :                 kfree(buffer);
     951                 :          0 :                 sr_printk(KERN_INFO, cd, "scsi-1 drive");
     952                 :          0 :                 return;
     953                 :            :         }
     954                 :            : 
     955                 :         30 :         n = data.header_length + data.block_descriptor_length;
     956                 :         30 :         cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
     957                 :         30 :         cd->readcd_known = 1;
     958                 :         30 :         cd->readcd_cdda = buffer[n + 5] & 0x01;
     959                 :            :         /* print some capability bits */
     960   [ +  -  -  +  :        120 :         sr_printk(KERN_INFO, cd,
          -  +  +  -  +  
                      - ]
     961                 :            :                   "scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n",
     962                 :            :                   ((buffer[n + 14] << 8) + buffer[n + 15]) / 176,
     963                 :            :                   cd->cdi.speed,
     964                 :            :                   buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
     965                 :            :                   buffer[n + 3] & 0x20 ? "dvd-ram " : "",
     966                 :            :                   buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
     967                 :            :                   buffer[n + 4] & 0x20 ? "xa/form2 " : "",      /* can read xa/from2 */
     968                 :            :                   buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
     969                 :            :                   loadmech[buffer[n + 6] >> 5]);
     970         [ -  + ]:         30 :         if ((buffer[n + 6] >> 5) == 0)
     971                 :            :                 /* caddy drives can't close tray... */
     972                 :          0 :                 cd->cdi.mask |= CDC_CLOSE_TRAY;
     973         [ -  + ]:         30 :         if ((buffer[n + 2] & 0x8) == 0)
     974                 :            :                 /* not a DVD drive */
     975                 :          0 :                 cd->cdi.mask |= CDC_DVD;
     976         [ +  - ]:         30 :         if ((buffer[n + 3] & 0x20) == 0)
     977                 :            :                 /* can't write DVD-RAM media */
     978                 :         30 :                 cd->cdi.mask |= CDC_DVD_RAM;
     979         [ +  - ]:         30 :         if ((buffer[n + 3] & 0x10) == 0)
     980                 :            :                 /* can't write DVD-R media */
     981                 :         30 :                 cd->cdi.mask |= CDC_DVD_R;
     982         [ +  - ]:         30 :         if ((buffer[n + 3] & 0x2) == 0)
     983                 :            :                 /* can't write CD-RW media */
     984                 :         30 :                 cd->cdi.mask |= CDC_CD_RW;
     985         [ +  - ]:         30 :         if ((buffer[n + 3] & 0x1) == 0)
     986                 :            :                 /* can't write CD-R media */
     987                 :         30 :                 cd->cdi.mask |= CDC_CD_R;
     988         [ -  + ]:         30 :         if ((buffer[n + 6] & 0x8) == 0)
     989                 :            :                 /* can't eject */
     990                 :          0 :                 cd->cdi.mask |= CDC_OPEN_TRAY;
     991                 :            : 
     992         [ -  + ]:         30 :         if ((buffer[n + 6] >> 5) == mechtype_individual_changer ||
     993                 :            :             (buffer[n + 6] >> 5) == mechtype_cartridge_changer)
     994                 :          0 :                 cd->cdi.capacity =
     995                 :          0 :                     cdrom_number_of_slots(&cd->cdi);
     996         [ +  - ]:         30 :         if (cd->cdi.capacity <= 1)
     997                 :            :                 /* not a changer */
     998                 :         30 :                 cd->cdi.mask |= CDC_SELECT_DISC;
     999                 :            :         /*else    I don't think it can close its tray
    1000                 :            :                 cd->cdi.mask |= CDC_CLOSE_TRAY; */
    1001                 :            : 
    1002                 :            :         /*
    1003                 :            :          * if DVD-RAM, MRW-W or CD-RW, we are randomly writable
    1004                 :            :          */
    1005         [ +  - ]:         30 :         if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) !=
    1006                 :            :                         (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) {
    1007                 :         30 :                 cd->writeable = 1;
    1008                 :            :         }
    1009                 :            : 
    1010                 :         30 :         kfree(buffer);
    1011                 :            : }
    1012                 :            : 
    1013                 :            : /*
    1014                 :            :  * sr_packet() is the entry point for the generic commands generated
    1015                 :            :  * by the Uniform CD-ROM layer.
    1016                 :            :  */
    1017                 :         30 : static int sr_packet(struct cdrom_device_info *cdi,
    1018                 :            :                 struct packet_command *cgc)
    1019                 :            : {
    1020                 :         30 :         struct scsi_cd *cd = cdi->handle;
    1021                 :         30 :         struct scsi_device *sdev = cd->device;
    1022                 :            : 
    1023   [ -  +  -  - ]:         30 :         if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)
    1024                 :            :                 return -EDRIVE_CANT_DO_THIS;
    1025                 :            : 
    1026         [ -  + ]:         30 :         if (cgc->timeout <= 0)
    1027                 :          0 :                 cgc->timeout = IOCTL_TIMEOUT;
    1028                 :            : 
    1029                 :         30 :         sr_do_ioctl(cd, cgc);
    1030                 :            : 
    1031                 :         30 :         return cgc->stat;
    1032                 :            : }
    1033                 :            : 
    1034                 :            : /**
    1035                 :            :  *      sr_kref_release - Called to free the scsi_cd structure
    1036                 :            :  *      @kref: pointer to embedded kref
    1037                 :            :  *
    1038                 :            :  *      sr_ref_mutex must be held entering this routine.  Because it is
    1039                 :            :  *      called on last put, you should always use the scsi_cd_get()
    1040                 :            :  *      scsi_cd_put() helpers which manipulate the semaphore directly
    1041                 :            :  *      and never do a direct kref_put().
    1042                 :            :  **/
    1043                 :          0 : static void sr_kref_release(struct kref *kref)
    1044                 :            : {
    1045                 :          0 :         struct scsi_cd *cd = container_of(kref, struct scsi_cd, kref);
    1046                 :          0 :         struct gendisk *disk = cd->disk;
    1047                 :            : 
    1048                 :          0 :         spin_lock(&sr_index_lock);
    1049                 :          0 :         clear_bit(MINOR(disk_devt(disk)), sr_index_bits);
    1050                 :          0 :         spin_unlock(&sr_index_lock);
    1051                 :            : 
    1052                 :          0 :         unregister_cdrom(&cd->cdi);
    1053                 :            : 
    1054                 :          0 :         disk->private_data = NULL;
    1055                 :            : 
    1056                 :          0 :         put_disk(disk);
    1057                 :            : 
    1058                 :          0 :         kfree(cd);
    1059                 :          0 : }
    1060                 :            : 
    1061                 :          0 : static int sr_remove(struct device *dev)
    1062                 :            : {
    1063                 :          0 :         struct scsi_cd *cd = dev_get_drvdata(dev);
    1064                 :            : 
    1065                 :          0 :         scsi_autopm_get_device(cd->device);
    1066                 :            : 
    1067                 :          0 :         del_gendisk(cd->disk);
    1068                 :          0 :         dev_set_drvdata(dev, NULL);
    1069                 :            : 
    1070                 :          0 :         mutex_lock(&sr_ref_mutex);
    1071                 :          0 :         kref_put(&cd->kref, sr_kref_release);
    1072                 :          0 :         mutex_unlock(&sr_ref_mutex);
    1073                 :            : 
    1074                 :          0 :         return 0;
    1075                 :            : }
    1076                 :            : 
    1077                 :         30 : static int __init init_sr(void)
    1078                 :            : {
    1079                 :         30 :         int rc;
    1080                 :            : 
    1081                 :         30 :         rc = register_blkdev(SCSI_CDROM_MAJOR, "sr");
    1082         [ +  - ]:         30 :         if (rc)
    1083                 :            :                 return rc;
    1084                 :         30 :         rc = scsi_register_driver(&sr_template.gendrv);
    1085         [ -  + ]:         30 :         if (rc)
    1086                 :          0 :                 unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
    1087                 :            : 
    1088                 :            :         return rc;
    1089                 :            : }
    1090                 :            : 
    1091                 :          0 : static void __exit exit_sr(void)
    1092                 :            : {
    1093                 :          0 :         scsi_unregister_driver(&sr_template.gendrv);
    1094                 :          0 :         unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
    1095                 :          0 : }
    1096                 :            : 
    1097                 :            : module_init(init_sr);
    1098                 :            : module_exit(exit_sr);
    1099                 :            : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14