Add CD/DVD Capabilities and Mechanical Status Page.

This page is obsolete since MMC-4, but still used by some software.
This commit is contained in:
Alexander Motin 2015-09-29 09:09:37 +00:00
parent 85dafc6977
commit d6e7f6e741
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=288358
3 changed files with 102 additions and 0 deletions

View File

@ -354,6 +354,52 @@ const static struct ctl_logical_block_provisioning_page lbp_page_changeable = {{
}
};
const static struct scsi_cddvd_capabilities_page cddvd_page_default = {
/*page_code*/SMS_CDDVD_CAPS_PAGE,
/*page_length*/sizeof(struct scsi_cddvd_capabilities_page) - 2,
/*caps1*/0x3f,
/*caps2*/0x00,
/*caps3*/0xf0,
/*caps4*/0x00,
/*caps5*/0x29,
/*caps6*/0x00,
/*obsolete*/{0, 0},
/*nvol_levels*/{0, 0},
/*buffer_size*/{8, 0},
/*obsolete2*/{0, 0},
/*reserved*/0,
/*digital*/0,
/*obsolete3*/0,
/*copy_management*/0,
/*reserved2*/0,
/*rotation_control*/0,
/*cur_write_speed*/0,
/*num_speed_descr*/0,
};
const static struct scsi_cddvd_capabilities_page cddvd_page_changeable = {
/*page_code*/SMS_CDDVD_CAPS_PAGE,
/*page_length*/sizeof(struct scsi_cddvd_capabilities_page) - 2,
/*caps1*/0,
/*caps2*/0,
/*caps3*/0,
/*caps4*/0,
/*caps5*/0,
/*caps6*/0,
/*obsolete*/{0, 0},
/*nvol_levels*/{0, 0},
/*buffer_size*/{0, 0},
/*obsolete2*/{0, 0},
/*reserved*/0,
/*digital*/0,
/*obsolete3*/0,
/*copy_management*/0,
/*reserved2*/0,
/*rotation_control*/0,
/*cur_write_speed*/0,
/*num_speed_descr*/0,
};
SYSCTL_NODE(_kern_cam, OID_AUTO, ctl, CTLFLAG_RD, 0, "CAM Target Layer");
static int worker_threads = -1;
SYSCTL_INT(_kern_cam_ctl, OID_AUTO, worker_threads, CTLFLAG_RDTUN,
@ -4119,6 +4165,23 @@ ctl_init_page_index(struct ctl_lun *lun)
}}
break;
}
case SMS_CDDVD_CAPS_PAGE:{
memcpy(&lun->mode_pages.cddvd_page[CTL_PAGE_DEFAULT],
&cddvd_page_default,
sizeof(cddvd_page_default));
memcpy(&lun->mode_pages.cddvd_page[
CTL_PAGE_CHANGEABLE], &cddvd_page_changeable,
sizeof(cddvd_page_changeable));
memcpy(&lun->mode_pages.cddvd_page[CTL_PAGE_SAVED],
&cddvd_page_default,
sizeof(cddvd_page_default));
memcpy(&lun->mode_pages.cddvd_page[CTL_PAGE_CURRENT],
&lun->mode_pages.cddvd_page[CTL_PAGE_SAVED],
sizeof(cddvd_page_default));
page_index->page_data =
(uint8_t *)lun->mode_pages.cddvd_page;
break;
}
case SMS_VENDOR_SPECIFIC_PAGE:{
switch (page_index->subpage) {
case DBGCNF_SUBPAGE_CODE: {

View File

@ -40,6 +40,10 @@
#ifndef _CTL_PRIVATE_H_
#define _CTL_PRIVATE_H_
#include <cam/scsi/scsi_all.h>
#include <cam/scsi/scsi_cd.h>
#include <cam/scsi/scsi_da.h>
/*
* SCSI vendor and product names.
*/
@ -286,6 +290,9 @@ static const struct ctl_page_index page_index_template[] = {
{SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF, 0x02,
sizeof(struct ctl_logical_block_provisioning_page), NULL,
CTL_PAGE_FLAG_DIRECT, NULL, NULL},
{SMS_CDDVD_CAPS_PAGE, 0,
sizeof(struct scsi_cddvd_capabilities_page), NULL,
CTL_PAGE_FLAG_CDROM, NULL, NULL},
{SMS_VENDOR_SPECIFIC_PAGE | SMPH_SPF, DBGCNF_SUBPAGE_CODE,
sizeof(struct copan_debugconf_subpage), NULL, CTL_PAGE_FLAG_ALL,
ctl_debugconf_sp_sense_handler, ctl_debugconf_sp_select_handler},
@ -303,6 +310,7 @@ struct ctl_mode_pages {
struct scsi_control_ext_page control_ext_page[4];
struct scsi_info_exceptions_page ie_page[4];
struct ctl_logical_block_provisioning_page lbp_page[4];
struct scsi_cddvd_capabilities_page cddvd_page[4];
struct copan_debugconf_subpage debugconf_subpage[4];
struct ctl_page_index index[CTL_NUM_MODE_PAGES];
};

View File

@ -783,6 +783,37 @@ struct cd_audio_page
#define RIGHT_PORT 1
};
struct scsi_cddvd_capabilities_page_sd {
uint8_t reserved;
uint8_t rotation_control;
uint8_t write_speed_supported[2];
};
struct scsi_cddvd_capabilities_page {
uint8_t page_code;
#define SMS_CDDVD_CAPS_PAGE 0x2a
uint8_t page_length;
uint8_t caps1;
uint8_t caps2;
uint8_t caps3;
uint8_t caps4;
uint8_t caps5;
uint8_t caps6;
uint8_t obsolete[2];
uint8_t nvol_levels[2];
uint8_t buffer_size[2];
uint8_t obsolete2[2];
uint8_t reserved;
uint8_t digital;
uint8_t obsolete3;
uint8_t copy_management;
uint8_t reserved2;
uint8_t rotation_control;
uint8_t cur_write_speed;
uint8_t num_speed_descr;
struct scsi_cddvd_capabilities_page_sd speed_descr[];
};
union cd_pages
{
struct cd_audio_page audio;