]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Add CD/DVD Capabilities and Mechanical Status Page.
authormav <mav@FreeBSD.org>
Tue, 29 Sep 2015 09:09:37 +0000 (09:09 +0000)
committermav <mav@FreeBSD.org>
Tue, 29 Sep 2015 09:09:37 +0000 (09:09 +0000)
This page is obsolete since MMC-4, but still used by some software.

sys/cam/ctl/ctl.c
sys/cam/ctl/ctl_private.h
sys/cam/scsi/scsi_cd.h

index 97147f1cbafc8a9168120b17b04c67d7cc7a61be..9181d3e133b2c9b34f865006592a9cf915f838e1 100644 (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: {
index 63709ab0e04184d324aa5661fbdbb3a446197160..04fab607e44bcc4d65217994e22390cdf436fcf0 100644 (file)
 #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];
 };
index e14140445e6ded6fec34fb26a06f1cdd1ac0bdfc..cf8baaf7ed7874a40db26815f9f368e5d99182a4 100644 (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;