]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Report that we can read all flavours of DVD. Why not?
authormav <mav@FreeBSD.org>
Tue, 29 Sep 2015 10:44:37 +0000 (10:44 +0000)
committermav <mav@FreeBSD.org>
Tue, 29 Sep 2015 10:44:37 +0000 (10:44 +0000)
sys/cam/ctl/ctl.c

index 9181d3e133b2c9b34f865006592a9cf915f838e1..a050534d323f7683ac3866f1bfb8f60c419e4033 100644 (file)
@@ -10271,6 +10271,10 @@ ctl_get_config(struct ctl_scsiio *ctsio)
            sizeof(struct scsi_get_config_feature) + 8 +
            sizeof(struct scsi_get_config_feature) +
            sizeof(struct scsi_get_config_feature) + 4 +
+           sizeof(struct scsi_get_config_feature) + 4 +
+           sizeof(struct scsi_get_config_feature) + 4 +
+           sizeof(struct scsi_get_config_feature) + 4 +
+           sizeof(struct scsi_get_config_feature) + 4 +
            sizeof(struct scsi_get_config_feature) + 4;
        ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
        ctsio->kern_sg_entries = 0;
@@ -10284,8 +10288,16 @@ ctl_get_config(struct ctl_scsiio *ctsio)
                scsi_ulto2b(0x0010, hdr->current_profile);
        feature = (struct scsi_get_config_feature *)(hdr + 1);
 
-       if (starting > 0x001f)
+       if (starting > 0x003b)
                goto done;
+       if (starting > 0x003a)
+               goto f3b;
+       if (starting > 0x002b)
+               goto f3a;
+       if (starting > 0x002a)
+               goto f2b;
+       if (starting > 0x001f)
+               goto f2a;
        if (starting > 0x001e)
                goto f1f;
        if (starting > 0x001d)
@@ -10382,6 +10394,48 @@ f1f:   /* DVD Read */
        feature = (struct scsi_get_config_feature *)
            &feature->feature_data[feature->add_length];
 
+f2a:   /* DVD+RW */
+       scsi_ulto2b(0x002A, feature->feature_code);
+       feature->flags = 0x04;
+       if ((lun->flags & CTL_LUN_NO_MEDIA) == 0)
+               feature->flags |= SGC_F_CURRENT;
+       feature->add_length = 4;
+       feature->feature_data[0] = 0x00;
+       feature->feature_data[1] = 0x00;
+       feature = (struct scsi_get_config_feature *)
+           &feature->feature_data[feature->add_length];
+
+f2b:   /* DVD+R */
+       scsi_ulto2b(0x002B, feature->feature_code);
+       feature->flags = 0x00;
+       if ((lun->flags & CTL_LUN_NO_MEDIA) == 0)
+               feature->flags |= SGC_F_CURRENT;
+       feature->add_length = 4;
+       feature->feature_data[0] = 0x00;
+       feature = (struct scsi_get_config_feature *)
+           &feature->feature_data[feature->add_length];
+
+f3a:   /* DVD+RW Dual Layer */
+       scsi_ulto2b(0x003A, feature->feature_code);
+       feature->flags = 0x00;
+       if ((lun->flags & CTL_LUN_NO_MEDIA) == 0)
+               feature->flags |= SGC_F_CURRENT;
+       feature->add_length = 4;
+       feature->feature_data[0] = 0x00;
+       feature->feature_data[1] = 0x00;
+       feature = (struct scsi_get_config_feature *)
+           &feature->feature_data[feature->add_length];
+
+f3b:   /* DVD+R Dual Layer */
+       scsi_ulto2b(0x003B, feature->feature_code);
+       feature->flags = 0x00;
+       if ((lun->flags & CTL_LUN_NO_MEDIA) == 0)
+               feature->flags |= SGC_F_CURRENT;
+       feature->add_length = 4;
+       feature->feature_data[0] = 0x00;
+       feature = (struct scsi_get_config_feature *)
+           &feature->feature_data[feature->add_length];
+
 done:
        data_len = (uint8_t *)feature - (uint8_t *)hdr;
        if (rt == SGC_RT_SPECIFIC && data_len > 4) {