forked from luck/tmp_suning_uos_patched
cdrom: support read sub-channel command in LBA format
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>
This commit is contained in:
parent
54adc01055
commit
bf294e833b
|
@ -340,7 +340,8 @@ CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)
|
||||||
EINVAL format not CDROM_MSF or CDROM_LBA
|
EINVAL format not CDROM_MSF or CDROM_LBA
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
Format is converted to CDROM_MSF on return
|
Format is converted to CDROM_MSF or CDROM_LBA
|
||||||
|
as per user request on return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2032,7 +2032,7 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
|
||||||
|
|
||||||
init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
|
init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
|
||||||
cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
|
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[2] = 0x40; /* request subQ data */
|
||||||
cgc.cmd[3] = mcn ? 2 : 1;
|
cgc.cmd[3] = mcn ? 2 : 1;
|
||||||
cgc.cmd[8] = 16;
|
cgc.cmd[8] = 16;
|
||||||
|
@ -2041,17 +2041,27 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
subchnl->cdsc_audiostatus = cgc.buffer[1];
|
subchnl->cdsc_audiostatus = cgc.buffer[1];
|
||||||
subchnl->cdsc_format = CDROM_MSF;
|
|
||||||
subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
|
subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
|
||||||
subchnl->cdsc_trk = cgc.buffer[6];
|
subchnl->cdsc_trk = cgc.buffer[6];
|
||||||
subchnl->cdsc_ind = cgc.buffer[7];
|
subchnl->cdsc_ind = cgc.buffer[7];
|
||||||
|
|
||||||
subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
|
if (subchnl->cdsc_format == CDROM_LBA) {
|
||||||
subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
|
subchnl->cdsc_absaddr.lba = ((cgc.buffer[8] << 24) |
|
||||||
subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
|
(cgc.buffer[9] << 16) |
|
||||||
subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
|
(cgc.buffer[10] << 8) |
|
||||||
subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
|
(cgc.buffer[11]));
|
||||||
subchnl->cdsc_absaddr.msf.frame = 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3022,7 +3032,7 @@ static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi,
|
||||||
if (!((requested == CDROM_MSF) ||
|
if (!((requested == CDROM_MSF) ||
|
||||||
(requested == CDROM_LBA)))
|
(requested == CDROM_LBA)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
q.cdsc_format = CDROM_MSF;
|
|
||||||
ret = cdrom_read_subchannel(cdi, &q, 0);
|
ret = cdrom_read_subchannel(cdi, &q, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user