Index: sys/cam/ata/ata_xpt.c =================================================================== --- sys/cam/ata/ata_xpt.c +++ sys/cam/ata/ata_xpt.c @@ -837,6 +837,12 @@ done_ccb->ccb_h.target_id != 15) { path->device->protocol = PROTO_ATA; PROBE_SET_ACTION(softc, PROBE_IDENTIFY); + if (vm_guest == VM_GUEST_HV) { + /* + * XXX: VM for Hyper-V should ignore ATA + */ + goto device_fail; + } } else if (sign == 0x9669 && done_ccb->ccb_h.target_id == 15) { /* Report SIM that PM is present. */ Index: sys/conf/files.amd64 =================================================================== --- sys/conf/files.amd64 +++ sys/conf/files.amd64 @@ -293,7 +293,6 @@ dev/hyperv/netvsc/hv_net_vsc.c optional hyperv dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c optional hyperv dev/hyperv/netvsc/hv_rndis_filter.c optional hyperv -dev/hyperv/stordisengage/hv_ata_pci_disengage.c optional hyperv dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv dev/hyperv/utilities/hv_heartbeat.c optional hyperv dev/hyperv/utilities/hv_kvp.c optional hyperv Index: sys/conf/files.i386 =================================================================== --- sys/conf/files.i386 +++ sys/conf/files.i386 @@ -251,7 +251,6 @@ dev/hyperv/netvsc/hv_net_vsc.c optional hyperv dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c optional hyperv dev/hyperv/netvsc/hv_rndis_filter.c optional hyperv -dev/hyperv/stordisengage/hv_ata_pci_disengage.c optional hyperv dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv dev/hyperv/utilities/hv_heartbeat.c optional hyperv dev/hyperv/utilities/hv_kvp.c optional hyperv Index: sys/dev/hyperv/stordisengage/hv_ata_pci_disengage.c =================================================================== --- sys/dev/hyperv/stordisengage/hv_ata_pci_disengage.c +++ /dev/null @@ -1,157 +0,0 @@ -/*- - * Copyright (c) 1998 - 2008 Søren Schmidt - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/*- - * Copyright (c) 2009-2013 Microsoft Corp. - * Copyright (c) 2012 NetApp Inc. - * Copyright (c) 2012 Citrix Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* prototypes */ -static int hv_ata_pci_probe(device_t dev); -static int hv_ata_pci_attach(device_t dev); -static int hv_ata_pci_detach(device_t dev); - -/* - * generic PCI ATA device probe - */ -static int -hv_ata_pci_probe(device_t dev) -{ - device_t parent = device_get_parent(dev); - int ata_disk_enable; - - ata_disk_enable = 0; - - /* - * Don't probe if not running in a Hyper-V environment - */ - if (vm_guest != VM_GUEST_HV) - return (ENXIO); - - if (device_get_unit(parent) != 0 || device_get_ivars(dev) != 0) - return (ENXIO); - - /* - * On Hyper-V the default is to use the enlightened driver for - * IDE disks. However, if the user wishes to use the native - * ATA driver, the environment variable - * hw_ata.disk_enable must be explicitly set to 1. - */ - if (getenv_int("hw.ata.disk_enable", &ata_disk_enable)) { - if (bootverbose) - device_printf(dev, - "hw.ata.disk_enable flag is disabling Hyper-V" - " ATA driver support\n"); - return (ENXIO); - } - - device_set_desc(dev, "Hyper-V ATA storage disengage driver"); - - return (BUS_PROBE_DEFAULT); -} - -static int -hv_ata_pci_attach(device_t dev) -{ - - return (0); -} - -static int -hv_ata_pci_detach(device_t dev) -{ - - return (0); -} - -static device_method_t hv_ata_pci_methods[] = { - /* device interface */ - DEVMETHOD(device_probe, hv_ata_pci_probe), - DEVMETHOD(device_attach, hv_ata_pci_attach), - DEVMETHOD(device_detach, hv_ata_pci_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - - DEVMETHOD_END -}; - -devclass_t hv_ata_pci_devclass; - -static driver_t hv_ata_pci_disengage_driver = { - "ata", - hv_ata_pci_methods, - 0, -}; - -DRIVER_MODULE(atapci_dis, atapci, hv_ata_pci_disengage_driver, - hv_ata_pci_devclass, NULL, NULL); -MODULE_VERSION(atapci_dis, 1); -MODULE_DEPEND(atapci_dis, ata, 1, 1, 1); Index: sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c =================================================================== --- sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c +++ sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c @@ -2154,28 +2154,58 @@ ccb->ccb_h.status &= ~CAM_STATUS_MASK; if (vm_srb->scsi_status == SCSI_STATUS_OK) { const struct scsi_generic *cmd; - + cmd = (const struct scsi_generic *) + ((ccb->ccb_h.flags & CAM_CDB_POINTER) ? + csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes); if (vm_srb->srb_status != SRB_STATUS_SUCCESS) { - if (vm_srb->srb_status == SRB_STATUS_INVALID_LUN) { - xpt_print(ccb->ccb_h.path, "invalid LUN %d\n", - vm_srb->lun); - } else { - xpt_print(ccb->ccb_h.path, "Unknown SRB flag: %d\n", - vm_srb->srb_status); - } /* * If there are errors, for example, invalid LUN, * host will inform VM through SRB status. */ - ccb->ccb_h.status |= CAM_SEL_TIMEOUT; + if (bootverbose) { + mtx_lock(&sc->hs_lock); + if (vm_srb->srb_status == SRB_STATUS_INVALID_LUN) { + xpt_print(ccb->ccb_h.path, + "invalid LUN %d for op: %s\n", + vm_srb->lun, scsi_op_desc(cmd->opcode, NULL)); + } else { + xpt_print(ccb->ccb_h.path, + "Unknown SRB flag: %d for op: %s\n", + vm_srb->srb_status, scsi_op_desc(cmd->opcode, NULL)); + } + mtx_unlock(&sc->hs_lock); + } + if (storvsc_get_storage_type(sc->hs_dev) == + DRIVER_STORVSC) { + /* + * For a selection timeout, all of the LUNs on + * the target will be gone. It works for SCSI + * disks, but does not work for IDE disks. + */ + ccb->ccb_h.status |= CAM_SEL_TIMEOUT; + } else { + /* + * For CAM_DEV_NOT_THERE, CAM will only get + * rid of the device(s) specified by the path. + */ + ccb->ccb_h.status |= CAM_DEV_NOT_THERE; + } } else { ccb->ccb_h.status |= CAM_REQ_CMP; } - cmd = (const struct scsi_generic *) - ((ccb->ccb_h.flags & CAM_CDB_POINTER) ? - csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes); if (cmd->opcode == INQUIRY) { + const struct scsi_inquiry * inq = + (const struct scsi_inquiry *) + ((ccb->ccb_h.flags & CAM_CDB_POINTER) ? + csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes); + mtx_lock(&sc->hs_lock); + xpt_print(ccb->ccb_h.path, "storvsc inquiry cmd" + " [%x %x %x %x %x %x]\n", inq->opcode, + inq->byte2, inq->page_code, inq->length[0], + inq->length[1], inq->control); + mtx_unlock(&sc->hs_lock); + struct scsi_inquiry_data *inq_data = (struct scsi_inquiry_data *)csio->data_ptr; uint8_t *resp_buf = (uint8_t *)csio->data_ptr; @@ -2189,10 +2219,12 @@ resp_buf_len : resp_xfer_len; if (bootverbose && data_len >= 5) { + mtx_lock(&sc->hs_lock); xpt_print(ccb->ccb_h.path, "storvsc inquiry " "(%d) [%x %x %x %x %x ... ]\n", data_len, resp_buf[0], resp_buf[1], resp_buf[2], resp_buf[3], resp_buf[4]); + mtx_unlock(&sc->hs_lock); } if (vm_srb->srb_status == SRB_STATUS_SUCCESS && data_len > SHORT_INQUIRY_LENGTH) { @@ -2213,9 +2245,11 @@ VMSTOR_PROTOCOL_VERSION_WIN8)) { inq_data->version = SCSI_REV_SPC3; if (bootverbose) { + mtx_lock(&sc->hs_lock); xpt_print(ccb->ccb_h.path, "storvsc upgrades " "SPC2 to SPC3\n"); + mtx_unlock(&sc->hs_lock); } } } Index: sys/modules/hyperv/Makefile =================================================================== --- sys/modules/hyperv/Makefile +++ sys/modules/hyperv/Makefile @@ -1,5 +1,5 @@ # $FreeBSD$ -SUBDIR = vmbus netvsc stordisengage storvsc utilities +SUBDIR = vmbus netvsc storvsc utilities .include Index: sys/modules/hyperv/stordisengage/Makefile =================================================================== --- sys/modules/hyperv/stordisengage/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../../dev/hyperv/stordisengage - -KMOD= hv_ata_pci_disengage -SRCS= hv_ata_pci_disengage.c -SRCS+= ata_if.h bus_if.h device_if.h pci_if.h - -.include