]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
cdrom: support read sub-channel command in LBA format
authorvchannaiah <vanitha.channaiah@in.bosch.com>
Wed, 29 Jun 2016 12:18:25 +0000 (08:18 -0400)
committerJens Axboe <axboe@fb.com>
Tue, 12 Jul 2016 15:24:50 +0000 (08:24 -0700)
userspace application can send READ_SUB_CHANNEL command with time bit
enabled and disabled. The time bit allows selection of address reporting
format. If the time bit is disabled the response is in logical block
address(CDROM_LBA) format, represented as a 32-bit integer with ms-byte
first. If the time bit is enabled the response is in time format i.e.,
minutes, second, frame (CDROM_MSF) format.

Signed-off-by: vchannaiah <vanitha.channaiah@in.bosch.com>
Signed-off-by: Mahendran Kuppusamy <mahendran.kuppusamy@in.bosch.com>
[veeraiyan.chidambaram@in.bosch.com: updated Documentation/ioctl/cdrom.txt]
Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Documentation/ioctl/cdrom.txt
drivers/cdrom/cdrom.c

index 59df81c8da2b86dd71394ccb85ab34bc1cba4595..a4d62a9d677120bf16903aa1d046c1d55f8faef5 100644 (file)
@@ -340,7 +340,8 @@ CDROMSUBCHNL                        Read subchannel data (struct cdrom_subchnl)
          EINVAL        format not CDROM_MSF or CDROM_LBA
 
        notes:
-         Format is converted to CDROM_MSF on return
+         Format is converted to CDROM_MSF or CDROM_LBA
+         as per user request on return
 
 
 
index 1b257ea9776ae596ed3164bc11a37d325c47d989..5d475b3a0b2e96660d6474b90cfc7daa7b5a0aff 100644 (file)
@@ -2032,7 +2032,7 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
 
        init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
        cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
-       cgc.cmd[1] = 2;     /* MSF addressing */
+       cgc.cmd[1] = subchnl->cdsc_format;/* MSF or LBA addressing */
        cgc.cmd[2] = 0x40;  /* request subQ data */
        cgc.cmd[3] = mcn ? 2 : 1;
        cgc.cmd[8] = 16;
@@ -2041,17 +2041,27 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
                return ret;
 
        subchnl->cdsc_audiostatus = cgc.buffer[1];
-       subchnl->cdsc_format = CDROM_MSF;
        subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
        subchnl->cdsc_trk = cgc.buffer[6];
        subchnl->cdsc_ind = cgc.buffer[7];
 
-       subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
-       subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
-       subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
-       subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
-       subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
-       subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
+       if (subchnl->cdsc_format == CDROM_LBA) {
+               subchnl->cdsc_absaddr.lba = ((cgc.buffer[8] << 24) |
+                                               (cgc.buffer[9] << 16) |
+                                               (cgc.buffer[10] << 8) |
+                                               (cgc.buffer[11]));
+               subchnl->cdsc_reladdr.lba = ((cgc.buffer[12] << 24) |
+                                               (cgc.buffer[13] << 16) |
+                                               (cgc.buffer[14] << 8) |
+                                               (cgc.buffer[15]));
+       } else {
+               subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
+               subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
+               subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
+               subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
+               subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
+               subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
+       }
 
        return 0;
 }
@@ -3022,7 +3032,7 @@ static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi,
        if (!((requested == CDROM_MSF) ||
              (requested == CDROM_LBA)))
                return -EINVAL;
-       q.cdsc_format = CDROM_MSF;
+
        ret = cdrom_read_subchannel(cdi, &q, 0);
        if (ret)
                return ret;