hyperv/storvsc: Force SPC3 for CDROM attached.

This unbreaks the CDROM attaching on GEN2 VMs.  On GEN1 VMs, CDROM is
attached to emulated ATA controller.

PR:		220790
Submitted by:	Hongjiang Zhang <honzhan microsoft com>
MFC after:	3 days
Sponsored by:	Microsoft
Differential Revision:	https://reviews.freebsd.org/D11634
This commit is contained in:
Sepherosa Ziehau 2017-07-20 07:13:26 +00:00
parent 5e6f40bdef
commit 6478f3180c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=321286

View file

@ -2209,6 +2209,23 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
resp_buf[0], resp_buf[1], resp_buf[2],
resp_buf[3], resp_buf[4]);
}
/*
* XXX: Hyper-V (since win2012r2) responses inquiry with
* unknown version (0) for GEN-2 DVD device.
* Manually set the version number to SPC3 in order to
* ask CAM to continue probing with "PROBE_REPORT_LUNS".
* see probedone() in scsi_xpt.c
*/
if (SID_TYPE(inq_data) == T_CDROM &&
inq_data->version == 0 &&
(vmstor_proto_version >= VMSTOR_PROTOCOL_VERSION_WIN8)) {
inq_data->version = SCSI_REV_SPC3;
if (bootverbose) {
xpt_print(ccb->ccb_h.path,
"set version from 0 to %d\n",
inq_data->version);
}
}
/*
* XXX: Manually fix the wrong response returned from WS2012
*/
@ -2218,7 +2235,7 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
vmstor_proto_version == VMSTOR_PROTOCOL_VERSION_WIN7)) {
if (data_len >= 4 &&
(resp_buf[2] == 0 || resp_buf[3] == 0)) {
resp_buf[2] = 5; // verion=5 means SPC-3
resp_buf[2] = SCSI_REV_SPC3;
resp_buf[3] = 2; // resp fmt must be 2
if (bootverbose)
xpt_print(ccb->ccb_h.path,