Home | History | Annotate | Line # | Download | only in pci
      1 /*-
      2  * Copyright (c) 2018 VMware, Inc.
      3  *
      4  * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
      5  */
      6 
      7 /*
      8 
      9 These files are provided under a dual BSD-2 Clause/GPLv2 license. When
     10 using or redistributing this file, you may do so under either license.
     11 
     12 BSD-2 Clause License
     13 
     14 Copyright (c) 2018 VMware, Inc.
     15 
     16 Redistribution and use in source and binary forms, with or without
     17 modification, are permitted provided that the following conditions
     18 are met:
     19 
     20   * Redistributions of source code must retain the above copyright
     21     notice, this list of conditions and the following disclaimer.
     22 
     23   * Redistributions in binary form must reproduce the above copyright
     24     notice, this list of conditions and the following disclaimer in
     25     the documentation and/or other materials provided with the
     26     distribution.
     27 
     28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     31 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     32 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     33 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     34 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     35 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     36 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     37 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     38 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     39 
     40 GPL License Summary
     41 
     42 Copyright (c) 2018 VMware, Inc.
     43 
     44 This program is free software; you can redistribute it and/or modify
     45 it under the terms of version 2 of the GNU General Public License as
     46 published by the Free Software Foundation.
     47 
     48 This program is distributed in the hope that it will be useful, but
     49 WITHOUT ANY WARRANTY; without even the implied warranty of
     50 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     51 General Public License for more details.
     52 
     53 You should have received a copy of the GNU General Public License
     54 along with this program; if not, write to the Free Software
     55 Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
     56 The full GNU General Public License is included in this distribution
     57 in the file called LICENSE.GPL.
     58 
     59 */
     60 
     61 #include <sys/cdefs.h>
     62 __KERNEL_RCSID(0, "$NetBSD: pvscsi.c,v 1.5 2025/09/06 02:56:52 riastradh Exp $");
     63 
     64 #include <sys/param.h>
     65 
     66 #include <sys/buf.h>
     67 #include <sys/bus.h>
     68 #include <sys/cpu.h>
     69 #include <sys/device.h>
     70 #include <sys/kernel.h>
     71 #include <sys/kmem.h>
     72 #include <sys/paravirt_membar.h>
     73 #include <sys/queue.h>
     74 #include <sys/sysctl.h>
     75 #include <sys/systm.h>
     76 
     77 #include <dev/pci/pcireg.h>
     78 #include <dev/pci/pcivar.h>
     79 #include <dev/pci/pcidevs.h>
     80 
     81 #include <dev/scsipi/scsi_all.h>
     82 #include <dev/scsipi/scsi_message.h>
     83 #include <dev/scsipi/scsiconf.h>
     84 #include <dev/scsipi/scsipi_disk.h>
     85 #include <dev/scsipi/scsi_disk.h>
     86 
     87 #include "pvscsi.h"
     88 
     89 #define	PVSCSI_DEFAULT_NUM_PAGES_REQ_RING	8
     90 #define	PVSCSI_SENSE_LENGTH			256
     91 
     92 #define PVSCSI_MAXPHYS				MAXPHYS
     93 #define PVSCSI_MAXPHYS_SEGS			((PVSCSI_MAXPHYS / PAGE_SIZE) + 1)
     94 
     95 #define PVSCSI_CMD_PER_LUN 64
     96 #define PVSCSI_MAX_LUN 8
     97 #define PVSCSI_MAX_TARGET 16
     98 
     99 //#define PVSCSI_DEBUG_LOGGING
    100 
    101 #ifdef PVSCSI_DEBUG_LOGGING
    102 #define	DEBUG_PRINTF(level, dev, fmt, ...)				\
    103 	do {								\
    104 		if (pvscsi_log_level >= (level)) {			\
    105 			aprint_normal_dev((dev), (fmt), ##__VA_ARGS__);	\
    106 		}							\
    107 	} while(0)
    108 #else
    109 #define DEBUG_PRINTF(level, dev, fmt, ...)
    110 #endif /* PVSCSI_DEBUG_LOGGING */
    111 
    112 struct pvscsi_softc;
    113 struct pvscsi_hcb;
    114 struct pvscsi_dma;
    115 
    116 #define VMWARE_PVSCSI_DEVSTR	"VMware Paravirtual SCSI Controller"
    117 
    118 static inline uint32_t pvscsi_reg_read(struct pvscsi_softc *sc,
    119     uint32_t offset);
    120 static inline void pvscsi_reg_write(struct pvscsi_softc *sc, uint32_t offset,
    121     uint32_t val);
    122 static inline uint32_t pvscsi_read_intr_status(struct pvscsi_softc *sc);
    123 static inline void pvscsi_write_intr_status(struct pvscsi_softc *sc,
    124     uint32_t val);
    125 static inline void pvscsi_intr_enable(struct pvscsi_softc *sc);
    126 static inline void pvscsi_intr_disable(struct pvscsi_softc *sc);
    127 static void pvscsi_kick_io(struct pvscsi_softc *sc, uint8_t cdb0);
    128 static void pvscsi_write_cmd(struct pvscsi_softc *sc, uint32_t cmd, void *data,
    129     uint32_t len);
    130 static uint32_t pvscsi_get_max_targets(struct pvscsi_softc *sc);
    131 static int pvscsi_setup_req_call(struct pvscsi_softc *sc, uint32_t enable);
    132 static void pvscsi_setup_rings(struct pvscsi_softc *sc);
    133 static void pvscsi_setup_msg_ring(struct pvscsi_softc *sc);
    134 static int pvscsi_hw_supports_msg(struct pvscsi_softc *sc);
    135 
    136 static void pvscsi_timeout(void *arg);
    137 static void pvscsi_adapter_reset(struct pvscsi_softc *sc);
    138 static void pvscsi_bus_reset(struct pvscsi_softc *sc);
    139 static void pvscsi_device_reset(struct pvscsi_softc *sc, uint32_t target);
    140 static void pvscsi_abort(struct pvscsi_softc *sc, uint32_t target,
    141     struct pvscsi_hcb *hcb);
    142 
    143 static void pvscsi_process_completion(struct pvscsi_softc *sc,
    144     struct pvscsi_ring_cmp_desc *e);
    145 static void pvscsi_process_cmp_ring(struct pvscsi_softc *sc);
    146 static void pvscsi_process_msg(struct pvscsi_softc *sc,
    147     struct pvscsi_ring_msg_desc *e);
    148 static void pvscsi_process_msg_ring(struct pvscsi_softc *sc);
    149 
    150 static void pvscsi_intr_locked(struct pvscsi_softc *sc);
    151 static int pvscsi_intr(void *xsc);
    152 
    153 static void pvscsi_scsipi_request(struct scsipi_channel *,
    154     scsipi_adapter_req_t, void *);
    155 
    156 static inline uint64_t pvscsi_hcb_to_context(struct pvscsi_softc *sc,
    157     struct pvscsi_hcb *hcb);
    158 static inline struct pvscsi_hcb *pvscsi_context_to_hcb(struct pvscsi_softc *sc,
    159     uint64_t context);
    160 static struct pvscsi_hcb * pvscsi_hcb_get(struct pvscsi_softc *sc);
    161 static void pvscsi_hcb_put(struct pvscsi_softc *sc, struct pvscsi_hcb *hcb);
    162 
    163 static void pvscsi_dma_free(struct pvscsi_softc *sc, struct pvscsi_dma *dma);
    164 static int pvscsi_dma_alloc(struct pvscsi_softc *sc, struct pvscsi_dma *dma,
    165     bus_size_t size, bus_size_t alignment);
    166 static int pvscsi_dma_alloc_ppns(struct pvscsi_softc *sc,
    167     struct pvscsi_dma *dma, uint64_t *ppn_list, uint32_t num_pages);
    168 static void pvscsi_dma_free_per_hcb(struct pvscsi_softc *sc,
    169     uint32_t hcbs_allocated);
    170 static int pvscsi_dma_alloc_per_hcb(struct pvscsi_softc *sc);
    171 static void pvscsi_free_rings(struct pvscsi_softc *sc);
    172 static int pvscsi_allocate_rings(struct pvscsi_softc *sc);
    173 static void pvscsi_free_interrupts(struct pvscsi_softc *sc);
    174 static int pvscsi_setup_interrupts(struct pvscsi_softc *sc, const struct pci_attach_args *);
    175 static void pvscsi_free_all(struct pvscsi_softc *sc);
    176 
    177 static void pvscsi_attach(device_t, device_t, void *);
    178 static int pvscsi_detach(device_t, int);
    179 static int pvscsi_probe(device_t, cfdata_t, void *);
    180 
    181 #define pvscsi_get_tunable(_sc, _name, _value)	(_value)
    182 
    183 #ifdef PVSCSI_DEBUG_LOGGING
    184 static int pvscsi_log_level = 1;
    185 #endif
    186 
    187 #define TUNABLE_INT(__x, __d)					\
    188 	err = sysctl_createv(clog, 0, &rnode, &cnode,		\
    189 	    CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,	\
    190 	    #__x, SYSCTL_DESCR(__d),				\
    191 	    NULL, 0, &(pvscsi_ ## __x), sizeof(pvscsi_ ## __x), \
    192 	    CTL_CREATE,	CTL_EOL);				\
    193 	if (err)						\
    194 		goto fail;
    195 
    196 static int pvscsi_request_ring_pages = 0;
    197 static int pvscsi_use_msg = 1;
    198 static int pvscsi_use_msi = 1;
    199 static int pvscsi_use_msix = 1;
    200 static int pvscsi_use_req_call_threshold = 0;
    201 static int pvscsi_max_queue_depth = 0;
    202 
    203 SYSCTL_SETUP(sysctl_hw_pvscsi_setup, "sysctl hw.pvscsi setup")
    204 {
    205 	int err;
    206 	const struct sysctlnode *rnode;
    207 	const struct sysctlnode *cnode;
    208 
    209 	err = sysctl_createv(clog, 0, NULL, &rnode,
    210 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "pvscsi",
    211 	    SYSCTL_DESCR("pvscsi global controls"),
    212 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
    213 
    214 	if (err)
    215 		goto fail;
    216 
    217 #ifdef PVSCSI_DEBUG_LOGGING
    218 	TUNABLE_INT(log_level, "Enable debugging output");
    219 #endif
    220 
    221 	TUNABLE_INT(request_ring_pages, "No. of pages for the request ring");
    222 	TUNABLE_INT(use_msg, "Use message passing");
    223 	TUNABLE_INT(use_msi, "Use MSI interrupt");
    224 	TUNABLE_INT(use_msix, "Use MSXI interrupt");
    225 	TUNABLE_INT(use_req_call_threshold, "Use request limit");
    226 	TUNABLE_INT(max_queue_depth, "Maximum size of request queue");
    227 
    228 	return;
    229 fail:
    230 	aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
    231 }
    232 
    233 struct pvscsi_sg_list {
    234 	struct pvscsi_sg_element sge[PVSCSI_MAX_SG_ENTRIES_PER_SEGMENT];
    235 };
    236 
    237 #define	PVSCSI_ABORT_TIMEOUT	2
    238 #define	PVSCSI_RESET_TIMEOUT	10
    239 
    240 #define	PVSCSI_HCB_NONE		0
    241 #define	PVSCSI_HCB_ABORT	1
    242 #define	PVSCSI_HCB_DEVICE_RESET	2
    243 #define	PVSCSI_HCB_BUS_RESET	3
    244 
    245 struct pvscsi_hcb {
    246 	struct scsipi_xfer 		*xs;
    247 	struct pvscsi_softc		*sc;
    248 
    249 	struct pvscsi_ring_req_desc	*e;
    250 	int				 recovery;
    251 	SLIST_ENTRY(pvscsi_hcb)		 links;
    252 
    253 	bus_dmamap_t			 dma_map;
    254 	bus_addr_t			 dma_map_offset;
    255 	bus_size_t			 dma_map_size;
    256 	void				*sense_buffer;
    257 	bus_addr_t			 sense_buffer_paddr;
    258 	struct pvscsi_sg_list		*sg_list;
    259 	bus_addr_t			 sg_list_paddr;
    260 	bus_addr_t			 sg_list_offset;
    261 };
    262 
    263 struct pvscsi_dma {
    264 	bus_dmamap_t		 map;
    265 	void		        *vaddr;
    266 	bus_addr_t	 	 paddr;
    267 	bus_size_t	 	 size;
    268 	bus_dma_segment_t	 seg[1];
    269 };
    270 
    271 struct pvscsi_softc {
    272 	device_t		 dev;
    273 	kmutex_t		 lock;
    274 
    275 	device_t		 sc_scsibus_dv;
    276 	struct scsipi_adapter	 sc_adapter;
    277 	struct scsipi_channel 	 sc_channel;
    278 
    279 	struct pvscsi_rings_state	*rings_state;
    280 	struct pvscsi_ring_req_desc	*req_ring;
    281 	struct pvscsi_ring_cmp_desc	*cmp_ring;
    282 	struct pvscsi_ring_msg_desc	*msg_ring;
    283 	uint32_t		 hcb_cnt;
    284 	struct pvscsi_hcb	*hcbs;
    285 	SLIST_HEAD(, pvscsi_hcb) free_list;
    286 
    287 	bus_dma_tag_t		sc_dmat;
    288 	bus_space_tag_t		sc_memt;
    289 	bus_space_handle_t	sc_memh;
    290 	bus_size_t		sc_mems;
    291 
    292 	bool		 use_msg;
    293 	uint32_t	 max_targets;
    294 	int		 mm_rid;
    295 	int		 irq_id;
    296 	int		 use_req_call_threshold;
    297 
    298 	pci_chipset_tag_t	 sc_pc;
    299 	pci_intr_handle_t *	 sc_pihp;
    300 	void			*sc_ih;
    301 
    302 	uint64_t	rings_state_ppn;
    303 	uint32_t	req_ring_num_pages;
    304 	uint64_t	req_ring_ppn[PVSCSI_MAX_NUM_PAGES_REQ_RING];
    305 	uint32_t	cmp_ring_num_pages;
    306 	uint64_t	cmp_ring_ppn[PVSCSI_MAX_NUM_PAGES_CMP_RING];
    307 	uint32_t	msg_ring_num_pages;
    308 	uint64_t	msg_ring_ppn[PVSCSI_MAX_NUM_PAGES_MSG_RING];
    309 
    310 	struct	pvscsi_dma rings_state_dma;
    311 	struct	pvscsi_dma req_ring_dma;
    312 	struct	pvscsi_dma cmp_ring_dma;
    313 	struct	pvscsi_dma msg_ring_dma;
    314 
    315 	struct	pvscsi_dma sg_list_dma;
    316 	struct	pvscsi_dma sense_buffer_dma;
    317 };
    318 
    319 CFATTACH_DECL3_NEW(pvscsi, sizeof(struct pvscsi_softc),
    320     pvscsi_probe, pvscsi_attach, pvscsi_detach, NULL, NULL, NULL,
    321     DVF_DETACH_SHUTDOWN);
    322 
    323 #define	PVSCSI_DMA_SYNC_STATE(sc, dma, structptr, member, ops)		      \
    324 	bus_dmamap_sync((sc)->sc_dmat, (dma)->map,			      \
    325 	    /*offset*/offsetof(__typeof__(*(structptr)), member),	      \
    326 	    /*length*/sizeof((structptr)->member),			      \
    327 	    (ops))
    328 
    329 #define	PVSCSI_DMA_SYNC_RING(sc, dma, ring, idx, ops)			      \
    330 	bus_dmamap_sync((sc)->sc_dmat, (dma)->map,			      \
    331 	    /*offset*/sizeof(*(ring)) * (idx),				      \
    332 	    /*length*/sizeof(*(ring)),					      \
    333 	    (ops))
    334 
    335 static inline uint32_t
    336 pvscsi_reg_read(struct pvscsi_softc *sc, uint32_t offset)
    337 {
    338 
    339 	return (bus_space_read_4(sc->sc_memt, sc->sc_memh, offset));
    340 }
    341 
    342 static inline void
    343 pvscsi_reg_write(struct pvscsi_softc *sc, uint32_t offset, uint32_t val)
    344 {
    345 
    346 	bus_space_write_4(sc->sc_memt, sc->sc_memh, offset, val);
    347 }
    348 
    349 static inline uint32_t
    350 pvscsi_read_intr_status(struct pvscsi_softc *sc)
    351 {
    352 
    353 	return (pvscsi_reg_read(sc, PVSCSI_REG_OFFSET_INTR_STATUS));
    354 }
    355 
    356 static inline void
    357 pvscsi_write_intr_status(struct pvscsi_softc *sc, uint32_t val)
    358 {
    359 
    360 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_INTR_STATUS, val);
    361 }
    362 
    363 static inline void
    364 pvscsi_intr_enable(struct pvscsi_softc *sc)
    365 {
    366 	uint32_t mask;
    367 
    368 	mask = PVSCSI_INTR_CMPL_MASK;
    369 	if (sc->use_msg) {
    370 		mask |= PVSCSI_INTR_MSG_MASK;
    371 	}
    372 
    373 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_INTR_MASK, mask);
    374 }
    375 
    376 static inline void
    377 pvscsi_intr_disable(struct pvscsi_softc *sc)
    378 {
    379 
    380 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_INTR_MASK, 0);
    381 }
    382 
    383 static void
    384 pvscsi_kick_io(struct pvscsi_softc *sc, uint8_t cdb0)
    385 {
    386 	struct pvscsi_dma *s_dma;
    387 	struct pvscsi_rings_state *s;
    388 
    389 	DEBUG_PRINTF(2, sc->dev, "%s: cdb0 %#x\n", __func__, cdb0);
    390 	if (cdb0 == SCSI_READ_6_COMMAND  || cdb0 == READ_10  ||
    391 	    cdb0 == READ_12  || cdb0 == READ_16  ||
    392 	    cdb0 == SCSI_WRITE_6_COMMAND || cdb0 == WRITE_10 ||
    393 	    cdb0 == WRITE_12 || cdb0 == WRITE_16) {
    394 		s_dma = &sc->rings_state_dma;
    395 		s = sc->rings_state;
    396 
    397 		/*
    398 		 * Ensure the command has been published before we read
    399 		 * req_cons_idx to test whether we need to kick the
    400 		 * host.
    401 		 */
    402 		paravirt_membar_sync();
    403 
    404 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, req_cons_idx,
    405 		    BUS_DMASYNC_POSTREAD);
    406 		DEBUG_PRINTF(2, sc->dev, "%s req prod %d cons %d\n", __func__,
    407 		    s->req_prod_idx, s->req_cons_idx);
    408 		if (!sc->use_req_call_threshold ||
    409 		    (s->req_prod_idx - s->req_cons_idx) >=
    410 		     s->req_call_threshold) {
    411 			pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_KICK_RW_IO, 0);
    412 			DEBUG_PRINTF(2, sc->dev, "kicked\n");
    413 		} else {
    414 			DEBUG_PRINTF(2, sc->dev, "wtf\n");
    415 		}
    416 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, req_cons_idx,
    417 		    BUS_DMASYNC_PREREAD);
    418 	} else {
    419 		s = sc->rings_state;
    420 		/*
    421 		 * XXX req_cons_idx in debug log might be stale, but no
    422 		 * need for DMA sync otherwise in this branch
    423 		 */
    424 		DEBUG_PRINTF(1, sc->dev, "%s req prod %d cons %d not checked\n", __func__,
    425 		    s->req_prod_idx, s->req_cons_idx);
    426 
    427 		pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_KICK_NON_RW_IO, 0);
    428 	}
    429 }
    430 
    431 static void
    432 pvscsi_write_cmd(struct pvscsi_softc *sc, uint32_t cmd, void *data,
    433 		 uint32_t len)
    434 {
    435 	uint32_t *data_ptr;
    436 	int i;
    437 
    438 	KASSERTMSG(len % sizeof(uint32_t) == 0,
    439 		"command size not a multiple of 4");
    440 
    441 	data_ptr = data;
    442 	len /= sizeof(uint32_t);
    443 
    444 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_COMMAND, cmd);
    445 	for (i = 0; i < len; ++i) {
    446 		pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_COMMAND_DATA,
    447 		   data_ptr[i]);
    448 	}
    449 }
    450 
    451 static inline uint64_t pvscsi_hcb_to_context(struct pvscsi_softc *sc,
    452     struct pvscsi_hcb *hcb)
    453 {
    454 
    455 	/* Offset by 1 because context must not be 0 */
    456 	return (hcb - sc->hcbs + 1);
    457 }
    458 
    459 static inline struct pvscsi_hcb* pvscsi_context_to_hcb(struct pvscsi_softc *sc,
    460     uint64_t context)
    461 {
    462 
    463 	return (sc->hcbs + (context - 1));
    464 }
    465 
    466 static struct pvscsi_hcb *
    467 pvscsi_hcb_get(struct pvscsi_softc *sc)
    468 {
    469 	struct pvscsi_hcb *hcb;
    470 
    471 	KASSERT(mutex_owned(&sc->lock));
    472 
    473 	hcb = SLIST_FIRST(&sc->free_list);
    474 	if (hcb) {
    475 		SLIST_REMOVE_HEAD(&sc->free_list, links);
    476 	}
    477 
    478 	return (hcb);
    479 }
    480 
    481 static void
    482 pvscsi_hcb_put(struct pvscsi_softc *sc, struct pvscsi_hcb *hcb)
    483 {
    484 
    485 	KASSERT(mutex_owned(&sc->lock));
    486 	hcb->xs = NULL;
    487 	hcb->e = NULL;
    488 	hcb->recovery = PVSCSI_HCB_NONE;
    489 	SLIST_INSERT_HEAD(&sc->free_list, hcb, links);
    490 }
    491 
    492 static uint32_t
    493 pvscsi_get_max_targets(struct pvscsi_softc *sc)
    494 {
    495 	uint32_t max_targets;
    496 
    497 	pvscsi_write_cmd(sc, PVSCSI_CMD_GET_MAX_TARGETS, NULL, 0);
    498 
    499 	max_targets = pvscsi_reg_read(sc, PVSCSI_REG_OFFSET_COMMAND_STATUS);
    500 
    501 	if (max_targets == ~0) {
    502 		max_targets = 16;
    503 	}
    504 
    505 	return (max_targets);
    506 }
    507 
    508 static int pvscsi_setup_req_call(struct pvscsi_softc *sc, uint32_t enable)
    509 {
    510 	uint32_t status;
    511 	struct pvscsi_cmd_desc_setup_req_call cmd;
    512 
    513 	if (!pvscsi_get_tunable(sc, "pvscsi_use_req_call_threshold",
    514 	    pvscsi_use_req_call_threshold)) {
    515 		return (0);
    516 	}
    517 
    518 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_COMMAND,
    519 	    PVSCSI_CMD_SETUP_REQCALLTHRESHOLD);
    520 	status = pvscsi_reg_read(sc, PVSCSI_REG_OFFSET_COMMAND_STATUS);
    521 
    522 	if (status != -1) {
    523 		memset(&cmd, 0, sizeof(cmd));
    524 		cmd.enable = enable;
    525 		pvscsi_write_cmd(sc, PVSCSI_CMD_SETUP_REQCALLTHRESHOLD,
    526 		    &cmd, sizeof(cmd));
    527 		status = pvscsi_reg_read(sc, PVSCSI_REG_OFFSET_COMMAND_STATUS);
    528 
    529 		/*
    530 		 * After setup, sync req_call_threshold before use.
    531 		 * After this point it should be stable, so no need to
    532 		 * sync again during use.
    533 		 */
    534 		PVSCSI_DMA_SYNC_STATE(sc, &sc->rings_state_dma,
    535 		    sc->rings_state, req_call_threshold,
    536 		    BUS_DMASYNC_POSTREAD);
    537 
    538 		return (status != 0);
    539 	} else {
    540 		return (0);
    541 	}
    542 }
    543 
    544 static void
    545 pvscsi_dma_free(struct pvscsi_softc *sc, struct pvscsi_dma *dma)
    546 {
    547 
    548 	bus_dmamap_unload(sc->sc_dmat, dma->map);
    549 	bus_dmamem_unmap(sc->sc_dmat, dma->vaddr, dma->size);
    550 	bus_dmamap_destroy(sc->sc_dmat, dma->map);
    551 	bus_dmamem_free(sc->sc_dmat, dma->seg, __arraycount(dma->seg));
    552 
    553 	memset(dma, 0, sizeof(*dma));
    554 }
    555 
    556 static int
    557 pvscsi_dma_alloc(struct pvscsi_softc *sc, struct pvscsi_dma *dma,
    558     bus_size_t size, bus_size_t alignment)
    559 {
    560 	int error;
    561 	int nsegs;
    562 
    563 	memset(dma, 0, sizeof(*dma));
    564 
    565 	error = bus_dmamem_alloc(sc->sc_dmat, size, alignment, 0, dma->seg,
    566 	    __arraycount(dma->seg), &nsegs, BUS_DMA_WAITOK);
    567 	if (error) {
    568 		aprint_normal_dev(sc->dev, "error allocating dma mem, error %d\n",
    569 		    error);
    570 		goto fail;
    571 	}
    572 
    573 	error = bus_dmamem_map(sc->sc_dmat, dma->seg, nsegs, size,
    574 	    &dma->vaddr, BUS_DMA_WAITOK);
    575 	if (error != 0) {
    576 		device_printf(sc->dev, "Failed to map DMA memory\n");
    577 		goto dmamemmap_fail;
    578 	}
    579 
    580 	error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
    581 	    BUS_DMA_WAITOK, &dma->map);
    582 	if (error != 0) {
    583 		device_printf(sc->dev, "Failed to create DMA map\n");
    584 		goto dmamapcreate_fail;
    585 	}
    586 
    587 	error = bus_dmamap_load(sc->sc_dmat, dma->map, dma->vaddr, size,
    588 	    NULL, BUS_DMA_WAITOK);
    589 	if (error) {
    590 		aprint_normal_dev(sc->dev, "error mapping dma mam, error %d\n",
    591 		    error);
    592 		goto dmamapload_fail;
    593 	}
    594 
    595 	dma->paddr = dma->map->dm_segs[0].ds_addr;
    596 	dma->size = size;
    597 
    598 	return 0;
    599 
    600 dmamapload_fail:
    601 	bus_dmamap_destroy(sc->sc_dmat, dma->map);
    602 dmamapcreate_fail:
    603 	bus_dmamem_unmap(sc->sc_dmat, dma->vaddr, dma->size);
    604 dmamemmap_fail:
    605 	bus_dmamem_free(sc->sc_dmat, dma->seg, __arraycount(dma->seg));
    606 fail:
    607 
    608 	return (error);
    609 }
    610 
    611 static int
    612 pvscsi_dma_alloc_ppns(struct pvscsi_softc *sc, struct pvscsi_dma *dma,
    613     uint64_t *ppn_list, uint32_t num_pages)
    614 {
    615 	int error;
    616 	uint32_t i;
    617 	uint64_t ppn;
    618 
    619 	error = pvscsi_dma_alloc(sc, dma, num_pages * PAGE_SIZE, PAGE_SIZE);
    620 	if (error) {
    621 		aprint_normal_dev(sc->dev, "Error allocating pages, error %d\n",
    622 		    error);
    623 		return (error);
    624 	}
    625 
    626 	memset(dma->vaddr, 0, num_pages * PAGE_SIZE);
    627 	bus_dmamap_sync(sc->sc_dmat, dma->map, 0, num_pages * PAGE_SIZE,
    628 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
    629 
    630 	ppn = dma->paddr >> PAGE_SHIFT;
    631 	for (i = 0; i < num_pages; i++) {
    632 		ppn_list[i] = ppn + i;
    633 	}
    634 
    635 	return (0);
    636 }
    637 
    638 static void
    639 pvscsi_dma_free_per_hcb(struct pvscsi_softc *sc, uint32_t hcbs_allocated)
    640 {
    641 	int i;
    642 	struct pvscsi_hcb *hcb;
    643 
    644 	for (i = 0; i < hcbs_allocated; ++i) {
    645 		hcb = sc->hcbs + i;
    646 		bus_dmamap_destroy(sc->sc_dmat, hcb->dma_map);
    647 	};
    648 
    649 	pvscsi_dma_free(sc, &sc->sense_buffer_dma);
    650 	pvscsi_dma_free(sc, &sc->sg_list_dma);
    651 }
    652 
    653 static int
    654 pvscsi_dma_alloc_per_hcb(struct pvscsi_softc *sc)
    655 {
    656 	int i;
    657 	int error;
    658 	struct pvscsi_hcb *hcb;
    659 
    660 	i = 0;
    661 
    662 	error = pvscsi_dma_alloc(sc, &sc->sg_list_dma,
    663 	    sizeof(struct pvscsi_sg_list) * sc->hcb_cnt, 1);
    664 	if (error) {
    665 		aprint_normal_dev(sc->dev,
    666 		    "Error allocation sg list DMA memory, error %d\n", error);
    667 		goto fail;
    668 	}
    669 
    670 	error = pvscsi_dma_alloc(sc, &sc->sense_buffer_dma,
    671 				 PVSCSI_SENSE_LENGTH * sc->hcb_cnt, 1);
    672 	if (error) {
    673 		aprint_normal_dev(sc->dev,
    674 		    "Error allocation buffer DMA memory, error %d\n", error);
    675 		goto fail;
    676 	}
    677 
    678 	for (i = 0; i < sc->hcb_cnt; ++i) {
    679 		hcb = sc->hcbs + i;
    680 
    681 		error = bus_dmamap_create(sc->sc_dmat, PVSCSI_MAXPHYS,
    682 		    PVSCSI_MAXPHYS_SEGS, PVSCSI_MAXPHYS, 0,
    683 		    BUS_DMA_WAITOK, &hcb->dma_map);
    684 		if (error) {
    685 			aprint_normal_dev(sc->dev,
    686 			    "Error creating dma map for hcb %d, error %d\n",
    687 			    i, error);
    688 			goto fail;
    689 		}
    690 
    691 		hcb->sc = sc;
    692 		hcb->dma_map_offset = PVSCSI_SENSE_LENGTH * i;
    693 		hcb->dma_map_size = PVSCSI_SENSE_LENGTH;
    694 		hcb->sense_buffer =
    695 		    (void *)((char *)sc->sense_buffer_dma.vaddr +
    696 		    PVSCSI_SENSE_LENGTH * i);
    697 		hcb->sense_buffer_paddr = sc->sense_buffer_dma.paddr +
    698 		    PVSCSI_SENSE_LENGTH * i;
    699 
    700 		hcb->sg_list =
    701 		    (struct pvscsi_sg_list *)((char *)sc->sg_list_dma.vaddr +
    702 		    sizeof(struct pvscsi_sg_list) * i);
    703 		hcb->sg_list_paddr =
    704 		    sc->sg_list_dma.paddr + sizeof(struct pvscsi_sg_list) * i;
    705 		hcb->sg_list_offset = sizeof(struct pvscsi_sg_list) * i;
    706 	}
    707 
    708 	SLIST_INIT(&sc->free_list);
    709 	for (i = (sc->hcb_cnt - 1); i >= 0; --i) {
    710 		hcb = sc->hcbs + i;
    711 		SLIST_INSERT_HEAD(&sc->free_list, hcb, links);
    712 	}
    713 
    714 fail:
    715 	if (error) {
    716 		pvscsi_dma_free_per_hcb(sc, i);
    717 	}
    718 
    719 	return (error);
    720 }
    721 
    722 static void
    723 pvscsi_free_rings(struct pvscsi_softc *sc)
    724 {
    725 
    726 	bus_dmamap_sync(sc->sc_dmat, sc->rings_state_dma.map,
    727 	    0, sc->rings_state_dma.size,
    728 	    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
    729 	bus_dmamap_sync(sc->sc_dmat, sc->req_ring_dma.map,
    730 	    0, sc->req_ring_dma.size,
    731 	    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
    732 	bus_dmamap_sync(sc->sc_dmat, sc->cmp_ring_dma.map,
    733 	    0, sc->cmp_ring_dma.size,
    734 	    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
    735 
    736 	pvscsi_dma_free(sc, &sc->rings_state_dma);
    737 	pvscsi_dma_free(sc, &sc->req_ring_dma);
    738 	pvscsi_dma_free(sc, &sc->cmp_ring_dma);
    739 	if (sc->use_msg) {
    740 		pvscsi_dma_free(sc, &sc->msg_ring_dma);
    741 	}
    742 }
    743 
    744 static int
    745 pvscsi_allocate_rings(struct pvscsi_softc *sc)
    746 {
    747 	int error;
    748 
    749 	error = pvscsi_dma_alloc_ppns(sc, &sc->rings_state_dma,
    750 	    &sc->rings_state_ppn, 1);
    751 	if (error) {
    752 		aprint_normal_dev(sc->dev,
    753 		    "Error allocating rings state, error = %d\n", error);
    754 		goto fail;
    755 	}
    756 	sc->rings_state = sc->rings_state_dma.vaddr;
    757 
    758 	error = pvscsi_dma_alloc_ppns(sc, &sc->req_ring_dma, sc->req_ring_ppn,
    759 	    sc->req_ring_num_pages);
    760 	if (error) {
    761 		aprint_normal_dev(sc->dev,
    762 		    "Error allocating req ring pages, error = %d\n", error);
    763 		goto fail;
    764 	}
    765 	sc->req_ring = sc->req_ring_dma.vaddr;
    766 
    767 	error = pvscsi_dma_alloc_ppns(sc, &sc->cmp_ring_dma, sc->cmp_ring_ppn,
    768 	    sc->cmp_ring_num_pages);
    769 	if (error) {
    770 		aprint_normal_dev(sc->dev,
    771 		    "Error allocating cmp ring pages, error = %d\n", error);
    772 		goto fail;
    773 	}
    774 	sc->cmp_ring = sc->cmp_ring_dma.vaddr;
    775 
    776 	sc->msg_ring = NULL;
    777 	if (sc->use_msg) {
    778 		error = pvscsi_dma_alloc_ppns(sc, &sc->msg_ring_dma,
    779 		    sc->msg_ring_ppn, sc->msg_ring_num_pages);
    780 		if (error) {
    781 			aprint_normal_dev(sc->dev,
    782 			    "Error allocating cmp ring pages, error = %d\n",
    783 			    error);
    784 			goto fail;
    785 		}
    786 		sc->msg_ring = sc->msg_ring_dma.vaddr;
    787 	}
    788 
    789 fail:
    790 	if (error) {
    791 		pvscsi_free_rings(sc);
    792 	}
    793 	return (error);
    794 }
    795 
    796 static void
    797 pvscsi_setup_rings(struct pvscsi_softc *sc)
    798 {
    799 	struct pvscsi_cmd_desc_setup_rings cmd;
    800 	uint32_t i;
    801 
    802 	memset(&cmd, 0, sizeof(cmd));
    803 
    804 	cmd.rings_state_ppn = sc->rings_state_ppn;
    805 
    806 	cmd.req_ring_num_pages = sc->req_ring_num_pages;
    807 	for (i = 0; i < sc->req_ring_num_pages; ++i) {
    808 		cmd.req_ring_ppns[i] = sc->req_ring_ppn[i];
    809 	}
    810 
    811 	cmd.cmp_ring_num_pages = sc->cmp_ring_num_pages;
    812 	for (i = 0; i < sc->cmp_ring_num_pages; ++i) {
    813 		cmd.cmp_ring_ppns[i] = sc->cmp_ring_ppn[i];
    814 	}
    815 
    816 	pvscsi_write_cmd(sc, PVSCSI_CMD_SETUP_RINGS, &cmd, sizeof(cmd));
    817 
    818 	/*
    819 	 * After setup, sync *_num_entries_log2 before use.  After this
    820 	 * point they should be stable, so no need to sync again during
    821 	 * use.
    822 	 */
    823 	PVSCSI_DMA_SYNC_STATE(sc, &sc->rings_state_dma,
    824 	    sc->rings_state, req_num_entries_log2,
    825 	    BUS_DMASYNC_POSTREAD);
    826 	PVSCSI_DMA_SYNC_STATE(sc, &sc->rings_state_dma,
    827 	    sc->rings_state, cmp_num_entries_log2,
    828 	    BUS_DMASYNC_POSTREAD);
    829 }
    830 
    831 static int
    832 pvscsi_hw_supports_msg(struct pvscsi_softc *sc)
    833 {
    834 	uint32_t status;
    835 
    836 	pvscsi_reg_write(sc, PVSCSI_REG_OFFSET_COMMAND,
    837 	    PVSCSI_CMD_SETUP_MSG_RING);
    838 	status = pvscsi_reg_read(sc, PVSCSI_REG_OFFSET_COMMAND_STATUS);
    839 
    840 	return (status != -1);
    841 }
    842 
    843 static void
    844 pvscsi_setup_msg_ring(struct pvscsi_softc *sc)
    845 {
    846 	struct pvscsi_cmd_desc_setup_msg_ring cmd;
    847 	uint32_t i;
    848 
    849 	KASSERTMSG(sc->use_msg, "msg is not being used");
    850 
    851 	memset(&cmd, 0, sizeof(cmd));
    852 
    853 	cmd.num_pages = sc->msg_ring_num_pages;
    854 	for (i = 0; i < sc->msg_ring_num_pages; ++i) {
    855 		cmd.ring_ppns[i] = sc->msg_ring_ppn[i];
    856 	}
    857 
    858 	pvscsi_write_cmd(sc, PVSCSI_CMD_SETUP_MSG_RING, &cmd, sizeof(cmd));
    859 
    860 	/*
    861 	 * After setup, sync msg_num_entries_log2 before use.  After
    862 	 * this point it should be stable, so no need to sync again
    863 	 * during use.
    864 	 */
    865 	PVSCSI_DMA_SYNC_STATE(sc, &sc->rings_state_dma,
    866 	    sc->rings_state, msg_num_entries_log2,
    867 	    BUS_DMASYNC_POSTREAD);
    868 }
    869 
    870 static void
    871 pvscsi_adapter_reset(struct pvscsi_softc *sc)
    872 {
    873 	aprint_normal_dev(sc->dev, "Adapter Reset\n");
    874 
    875 	pvscsi_write_cmd(sc, PVSCSI_CMD_ADAPTER_RESET, NULL, 0);
    876 #ifdef PVSCSI_DEBUG_LOGGING
    877 	uint32_t val =
    878 #endif
    879 	pvscsi_read_intr_status(sc);
    880 
    881 	DEBUG_PRINTF(2, sc->dev, "adapter reset done: %u\n", val);
    882 }
    883 
    884 static void
    885 pvscsi_bus_reset(struct pvscsi_softc *sc)
    886 {
    887 
    888 	aprint_normal_dev(sc->dev, "Bus Reset\n");
    889 
    890 	pvscsi_write_cmd(sc, PVSCSI_CMD_RESET_BUS, NULL, 0);
    891 	pvscsi_process_cmp_ring(sc);
    892 
    893 	DEBUG_PRINTF(2, sc->dev, "bus reset done\n");
    894 }
    895 
    896 static void
    897 pvscsi_device_reset(struct pvscsi_softc *sc, uint32_t target)
    898 {
    899 	struct pvscsi_cmd_desc_reset_device cmd;
    900 
    901 	memset(&cmd, 0, sizeof(cmd));
    902 
    903 	cmd.target = target;
    904 
    905 	aprint_normal_dev(sc->dev, "Device reset for target %u\n", target);
    906 
    907 	pvscsi_write_cmd(sc, PVSCSI_CMD_RESET_DEVICE, &cmd, sizeof cmd);
    908 	pvscsi_process_cmp_ring(sc);
    909 
    910 	DEBUG_PRINTF(2, sc->dev, "device reset done\n");
    911 }
    912 
    913 static void
    914 pvscsi_abort(struct pvscsi_softc *sc, uint32_t target, struct pvscsi_hcb *hcb)
    915 {
    916 	struct pvscsi_cmd_desc_abort_cmd cmd;
    917 	uint64_t context;
    918 
    919 	pvscsi_process_cmp_ring(sc);
    920 
    921 	if (hcb != NULL) {
    922 		context = pvscsi_hcb_to_context(sc, hcb);
    923 
    924 		memset(&cmd, 0, sizeof cmd);
    925 		cmd.target = target;
    926 		cmd.context = context;
    927 
    928 		aprint_normal_dev(sc->dev, "Abort for target %u context %llx\n",
    929 		    target, (unsigned long long)context);
    930 
    931 		pvscsi_write_cmd(sc, PVSCSI_CMD_ABORT_CMD, &cmd, sizeof(cmd));
    932 		pvscsi_process_cmp_ring(sc);
    933 
    934 		DEBUG_PRINTF(2, sc->dev, "abort done\n");
    935 	} else {
    936 		DEBUG_PRINTF(1, sc->dev,
    937 		    "Target %u hcb %p not found for abort\n", target, hcb);
    938 	}
    939 }
    940 
    941 static int
    942 pvscsi_probe(device_t dev, cfdata_t cf, void *aux)
    943 {
    944 	const struct pci_attach_args *pa = aux;
    945 
    946 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_VMWARE &&
    947 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VMWARE_PVSCSI) {
    948 		return 1;
    949 	}
    950 	return 0;
    951 }
    952 
    953 static void
    954 pvscsi_timeout(void *arg)
    955 {
    956 	struct pvscsi_hcb *hcb = arg;
    957 	struct scsipi_xfer *xs = hcb->xs;
    958 
    959 	if (xs == NULL) {
    960 		/* Already completed */
    961 		return;
    962 	}
    963 
    964 	struct pvscsi_softc *sc = hcb->sc;
    965 
    966 	mutex_enter(&sc->lock);
    967 
    968 	scsipi_printaddr(xs->xs_periph);
    969 	printf("command timeout, CDB: ");
    970 	scsipi_print_cdb(xs->cmd);
    971 	printf("\n");
    972 
    973 	switch (hcb->recovery) {
    974 	case PVSCSI_HCB_NONE:
    975 		hcb->recovery = PVSCSI_HCB_ABORT;
    976 		pvscsi_abort(sc, hcb->e->target, hcb);
    977 		callout_reset(&xs->xs_callout,
    978 		    mstohz(PVSCSI_ABORT_TIMEOUT * 1000),
    979 		    pvscsi_timeout, hcb);
    980 		break;
    981 	case PVSCSI_HCB_ABORT:
    982 		hcb->recovery = PVSCSI_HCB_DEVICE_RESET;
    983 		pvscsi_device_reset(sc, hcb->e->target);
    984 		callout_reset(&xs->xs_callout,
    985 		    mstohz(PVSCSI_RESET_TIMEOUT * 1000),
    986 		    pvscsi_timeout, hcb);
    987 		break;
    988 	case PVSCSI_HCB_DEVICE_RESET:
    989 		hcb->recovery = PVSCSI_HCB_BUS_RESET;
    990 		pvscsi_bus_reset(sc);
    991 		callout_reset(&xs->xs_callout,
    992 		    mstohz(PVSCSI_RESET_TIMEOUT * 1000),
    993 		    pvscsi_timeout, hcb);
    994 		break;
    995 	case PVSCSI_HCB_BUS_RESET:
    996 		pvscsi_adapter_reset(sc);
    997 		break;
    998 	};
    999 	mutex_exit(&sc->lock);
   1000 }
   1001 
   1002 static void
   1003 pvscsi_process_completion(struct pvscsi_softc *sc,
   1004     struct pvscsi_ring_cmp_desc *e)
   1005 {
   1006 	struct pvscsi_hcb *hcb;
   1007 	struct scsipi_xfer *xs;
   1008 	uint32_t error = XS_NOERROR;
   1009 	uint32_t btstat;
   1010 	uint32_t sdstat;
   1011 	int op;
   1012 
   1013 	hcb = pvscsi_context_to_hcb(sc, e->context);
   1014 	xs = hcb->xs;
   1015 
   1016 	callout_stop(&xs->xs_callout);
   1017 
   1018 	btstat = e->host_status;
   1019 	sdstat = e->scsi_status;
   1020 
   1021 	xs->status = sdstat;
   1022 	xs->resid = xs->datalen - e->data_len;
   1023 
   1024 	DEBUG_PRINTF(3, sc->dev,
   1025 	    "command context %llx btstat %d (%#x) sdstat %d (%#x)\n",
   1026 	    (unsigned long long)e->context, btstat, btstat, sdstat, sdstat);
   1027 
   1028 	if ((xs->xs_control & XS_CTL_DATA_IN) == XS_CTL_DATA_IN) {
   1029 		op = BUS_DMASYNC_POSTREAD;
   1030 	} else {
   1031 		op = BUS_DMASYNC_POSTWRITE;
   1032 	}
   1033 	bus_dmamap_sync(sc->sc_dmat, sc->sense_buffer_dma.map,
   1034 	    hcb->dma_map_offset, hcb->dma_map_size, op);
   1035 
   1036 	if (btstat == BTSTAT_SUCCESS && sdstat == SCSI_OK) {
   1037 		DEBUG_PRINTF(3, sc->dev,
   1038 		    "completing command context %llx success\n",
   1039 		    (unsigned long long)e->context);
   1040 		xs->resid = 0;
   1041 	} else {
   1042 		switch (btstat) {
   1043 		case BTSTAT_SUCCESS:
   1044 		case BTSTAT_LINKED_COMMAND_COMPLETED:
   1045 		case BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG:
   1046 			switch (sdstat) {
   1047 			case SCSI_OK:
   1048 				xs->resid = 0;
   1049 				error = XS_NOERROR;
   1050 				break;
   1051 			case SCSI_CHECK:
   1052 				error = XS_SENSE;
   1053 				xs->resid = 0;
   1054 
   1055 				memset(&xs->sense, 0, sizeof(xs->sense));
   1056 				memcpy(&xs->sense, hcb->sense_buffer,
   1057 				    MIN(sizeof(xs->sense), e->sense_len));
   1058 				break;
   1059 			case SCSI_BUSY:
   1060 			case SCSI_QUEUE_FULL:
   1061 				error = XS_NOERROR;
   1062 				break;
   1063 			case SCSI_TERMINATED:
   1064 // 			case SCSI_STATUS_TASK_ABORTED:
   1065 				DEBUG_PRINTF(1, sc->dev,
   1066 				    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1067 				error = XS_DRIVER_STUFFUP;
   1068 				break;
   1069 			default:
   1070 				DEBUG_PRINTF(1, sc->dev,
   1071 				    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1072 				error = XS_DRIVER_STUFFUP;
   1073 				break;
   1074 			}
   1075 			break;
   1076 		case BTSTAT_SELTIMEO:
   1077 			error = XS_SELTIMEOUT;
   1078 			break;
   1079 		case BTSTAT_DATARUN:
   1080 		case BTSTAT_DATA_UNDERRUN:
   1081 //			xs->resid = xs->datalen - c->data_len;
   1082 			error = XS_NOERROR;
   1083 			break;
   1084 		case BTSTAT_ABORTQUEUE:
   1085 		case BTSTAT_HATIMEOUT:
   1086 			error = XS_NOERROR;
   1087 			break;
   1088 		case BTSTAT_NORESPONSE:
   1089 		case BTSTAT_SENTRST:
   1090 		case BTSTAT_RECVRST:
   1091 		case BTSTAT_BUSRESET:
   1092 			error = XS_RESET;
   1093 			break;
   1094 		case BTSTAT_SCSIPARITY:
   1095 			error = XS_DRIVER_STUFFUP;
   1096 			DEBUG_PRINTF(1, sc->dev,
   1097 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1098 			break;
   1099 		case BTSTAT_BUSFREE:
   1100 			error = XS_DRIVER_STUFFUP;
   1101 			DEBUG_PRINTF(1, sc->dev,
   1102 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1103 			break;
   1104 		case BTSTAT_INVPHASE:
   1105 			error = XS_DRIVER_STUFFUP;
   1106 			DEBUG_PRINTF(1, sc->dev,
   1107 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1108 			break;
   1109 		case BTSTAT_SENSFAILED:
   1110 			error = XS_DRIVER_STUFFUP;
   1111 			DEBUG_PRINTF(1, sc->dev,
   1112 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1113 			break;
   1114 		case BTSTAT_LUNMISMATCH:
   1115 		case BTSTAT_TAGREJECT:
   1116 		case BTSTAT_DISCONNECT:
   1117 		case BTSTAT_BADMSG:
   1118 		case BTSTAT_INVPARAM:
   1119 			error = XS_DRIVER_STUFFUP;
   1120 			DEBUG_PRINTF(1, sc->dev,
   1121 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1122 			break;
   1123 		case BTSTAT_HASOFTWARE:
   1124 		case BTSTAT_HAHARDWARE:
   1125 			error = XS_DRIVER_STUFFUP;
   1126 			DEBUG_PRINTF(1, sc->dev,
   1127 			    "xs: %p sdstat=0x%x\n", xs, sdstat);
   1128 			break;
   1129 		default:
   1130 			aprint_normal_dev(sc->dev, "unknown hba status: 0x%x\n",
   1131 			    btstat);
   1132 			error = XS_DRIVER_STUFFUP;
   1133 			break;
   1134 		}
   1135 
   1136 		DEBUG_PRINTF(3, sc->dev,
   1137 		    "completing command context %llx btstat %x sdstat %x - error %x\n",
   1138 		    (unsigned long long)e->context, btstat, sdstat, error);
   1139 	}
   1140 
   1141 	xs->error = error;
   1142 	pvscsi_hcb_put(sc, hcb);
   1143 
   1144 	mutex_exit(&sc->lock);
   1145 
   1146 	scsipi_done(xs);
   1147 
   1148 	mutex_enter(&sc->lock);
   1149 }
   1150 
   1151 static void
   1152 pvscsi_process_cmp_ring(struct pvscsi_softc *sc)
   1153 {
   1154 	struct pvscsi_dma *ring_dma;
   1155 	struct pvscsi_ring_cmp_desc *ring;
   1156 	struct pvscsi_dma *s_dma;
   1157 	struct pvscsi_rings_state *s;
   1158 	struct pvscsi_ring_cmp_desc *e;
   1159 	uint32_t mask;
   1160 
   1161 	KASSERT(mutex_owned(&sc->lock));
   1162 
   1163 	s_dma = &sc->rings_state_dma;
   1164 	s = sc->rings_state;
   1165 	ring_dma = &sc->cmp_ring_dma;
   1166 	ring = sc->cmp_ring;
   1167 	mask = MASK(s->cmp_num_entries_log2);
   1168 
   1169 	for (;;) {
   1170 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, cmp_prod_idx,
   1171 		    BUS_DMASYNC_POSTREAD);
   1172 		size_t crpidx = s->cmp_prod_idx;
   1173 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, cmp_prod_idx,
   1174 		    BUS_DMASYNC_PREREAD);
   1175 
   1176 		if (s->cmp_cons_idx == crpidx)
   1177 			break;
   1178 
   1179 		size_t crcidx = s->cmp_cons_idx & mask;
   1180 
   1181 		PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, crcidx,
   1182 		    BUS_DMASYNC_POSTREAD);
   1183 
   1184 		e = ring + crcidx;
   1185 
   1186 		pvscsi_process_completion(sc, e);
   1187 
   1188 		/*
   1189 		 * ensure completion processing reads happen before write to
   1190 		 * (increment of) cmp_cons_idx
   1191 		 */
   1192 		PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, crcidx,
   1193 		    BUS_DMASYNC_PREREAD);
   1194 
   1195 		/*
   1196 		 * XXX Not actually sure the `device' does DMA for
   1197 		 * s->cmp_cons_idx at all -- qemu doesn't.  If not, we
   1198 		 * can skip these DMA syncs.
   1199 		 */
   1200 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, cmp_cons_idx,
   1201 		    BUS_DMASYNC_POSTWRITE);
   1202 		s->cmp_cons_idx++;
   1203 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, cmp_cons_idx,
   1204 		    BUS_DMASYNC_PREWRITE);
   1205 	}
   1206 }
   1207 
   1208 static void
   1209 pvscsi_process_msg(struct pvscsi_softc *sc, struct pvscsi_ring_msg_desc *e)
   1210 {
   1211 	struct pvscsi_ring_msg_dev_status_changed *desc;
   1212 
   1213 	switch (e->type) {
   1214 	case PVSCSI_MSG_DEV_ADDED:
   1215 	case PVSCSI_MSG_DEV_REMOVED: {
   1216 		desc = (struct pvscsi_ring_msg_dev_status_changed *)e;
   1217 		struct scsibus_softc *ssc = device_private(sc->sc_scsibus_dv);
   1218 
   1219 		aprint_normal_dev(sc->dev, "MSG: device %s at scsi%u:%u:%u\n",
   1220 		    desc->type == PVSCSI_MSG_DEV_ADDED ? "addition" : "removal",
   1221 		    desc->bus, desc->target, desc->lun[1]);
   1222 
   1223 		if (desc->type == PVSCSI_MSG_DEV_ADDED) {
   1224 			if (scsi_probe_bus(ssc,
   1225 			    desc->target, desc->lun[1]) != 0) {
   1226 				aprint_normal_dev(sc->dev,
   1227 				    "Error creating path for dev change.\n");
   1228 				break;
   1229 			}
   1230 		} else {
   1231 			if (scsipi_target_detach(ssc->sc_channel,
   1232 			    desc->target, desc->lun[1],
   1233 			    DETACH_FORCE) != 0) {
   1234 				aprint_normal_dev(sc->dev,
   1235 				    "Error detaching target %d lun %d\n",
   1236 				    desc->target, desc->lun[1]);
   1237 			};
   1238 
   1239 		}
   1240 	} break;
   1241 	default:
   1242 		aprint_normal_dev(sc->dev, "Unknown msg type 0x%x\n", e->type);
   1243 	};
   1244 }
   1245 
   1246 static void
   1247 pvscsi_process_msg_ring(struct pvscsi_softc *sc)
   1248 {
   1249 	struct pvscsi_dma *ring_dma;
   1250 	struct pvscsi_ring_msg_desc *ring;
   1251 	struct pvscsi_dma *s_dma;
   1252 	struct pvscsi_rings_state *s;
   1253 	struct pvscsi_ring_msg_desc *e;
   1254 	uint32_t mask;
   1255 
   1256 	KASSERT(mutex_owned(&sc->lock));
   1257 
   1258 	s_dma = &sc->rings_state_dma;
   1259 	s = sc->rings_state;
   1260 	ring_dma = &sc->msg_ring_dma;
   1261 	ring = sc->msg_ring;
   1262 	mask = MASK(s->msg_num_entries_log2);
   1263 
   1264 	for (;;) {
   1265 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, msg_prod_idx,
   1266 		    BUS_DMASYNC_POSTREAD);
   1267 		size_t mpidx = s->msg_prod_idx;	// dma read (device -> cpu)
   1268 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, msg_prod_idx,
   1269 		    BUS_DMASYNC_PREREAD);
   1270 
   1271 		if (s->msg_cons_idx == mpidx)
   1272 			break;
   1273 
   1274 		size_t mcidx = s->msg_cons_idx & mask;
   1275 
   1276 		PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, mcidx,
   1277 		    BUS_DMASYNC_POSTREAD);
   1278 
   1279 		e = ring + mcidx;
   1280 
   1281 		pvscsi_process_msg(sc, e);
   1282 
   1283 		/*
   1284 		 * ensure message processing reads happen before write to
   1285 		 * (increment of) msg_cons_idx
   1286 		 */
   1287 		PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, mcidx,
   1288 		    BUS_DMASYNC_PREREAD);
   1289 
   1290 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, msg_cons_idx,
   1291 		    BUS_DMASYNC_POSTWRITE);
   1292 		s->msg_cons_idx++;
   1293 		PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, msg_cons_idx,
   1294 		    BUS_DMASYNC_PREWRITE);
   1295 	}
   1296 }
   1297 
   1298 static void
   1299 pvscsi_intr_locked(struct pvscsi_softc *sc)
   1300 {
   1301 	uint32_t val;
   1302 
   1303 	KASSERT(mutex_owned(&sc->lock));
   1304 
   1305 	val = pvscsi_read_intr_status(sc);
   1306 
   1307 	if ((val & PVSCSI_INTR_ALL_SUPPORTED) != 0) {
   1308 		pvscsi_write_intr_status(sc, val & PVSCSI_INTR_ALL_SUPPORTED);
   1309 		pvscsi_process_cmp_ring(sc);
   1310 		if (sc->use_msg) {
   1311 			pvscsi_process_msg_ring(sc);
   1312 		}
   1313 	}
   1314 }
   1315 
   1316 static int
   1317 pvscsi_intr(void *xsc)
   1318 {
   1319 	struct pvscsi_softc *sc;
   1320 
   1321 	sc = xsc;
   1322 
   1323 	mutex_enter(&sc->lock);
   1324 	pvscsi_intr_locked(xsc);
   1325 	mutex_exit(&sc->lock);
   1326 
   1327 	return 1;
   1328 }
   1329 
   1330 static void
   1331 pvscsi_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t
   1332     request, void *arg)
   1333 {
   1334 	struct pvscsi_softc *sc = device_private(chan->chan_adapter->adapt_dev);
   1335 
   1336 	if (request == ADAPTER_REQ_SET_XFER_MODE) {
   1337 		struct scsipi_xfer_mode *xm = arg;
   1338 
   1339 		xm->xm_mode = PERIPH_CAP_TQING;
   1340 		xm->xm_period = 0;
   1341 		xm->xm_offset = 0;
   1342 		scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm);
   1343 		return;
   1344 	} else if (request != ADAPTER_REQ_RUN_XFER) {
   1345 		DEBUG_PRINTF(1, sc->dev, "unhandled %d\n", request);
   1346 		return;
   1347 	}
   1348 
   1349 	/* request is ADAPTER_REQ_RUN_XFER */
   1350 	struct scsipi_xfer *xs = arg;
   1351 	struct scsipi_periph *periph = xs->xs_periph;
   1352 #ifdef SCSIPI_DEBUG
   1353 	periph->periph_dbflags |= SCSIPI_DEBUG_FLAGS;
   1354 #endif
   1355 
   1356 	uint32_t req_num_entries_log2;
   1357 	struct pvscsi_dma *ring_dma;
   1358 	struct pvscsi_ring_req_desc *ring;
   1359 	struct pvscsi_ring_req_desc *e;
   1360 	struct pvscsi_dma *s_dma;
   1361 	struct pvscsi_rings_state *s;
   1362 	struct pvscsi_hcb *hcb;
   1363 
   1364 	if (xs->cmdlen < 0 || xs->cmdlen > sizeof(e->cdb)) {
   1365 		DEBUG_PRINTF(1, sc->dev, "bad cmdlen %zu > %zu\n",
   1366 		    (size_t)xs->cmdlen, sizeof(e->cdb));
   1367 		/* not a temporary condition */
   1368 		xs->error = XS_DRIVER_STUFFUP;
   1369 		scsipi_done(xs);
   1370 		return;
   1371 	}
   1372 
   1373 	ring_dma = &sc->req_ring_dma;
   1374 	ring = sc->req_ring;
   1375 	s_dma = &sc->rings_state_dma;
   1376 	s = sc->rings_state;
   1377 
   1378 	hcb = NULL;
   1379 	req_num_entries_log2 = s->req_num_entries_log2;
   1380 
   1381 	/* Protect against multiple senders */
   1382 	mutex_enter(&sc->lock);
   1383 
   1384 	if (s->req_prod_idx - s->cmp_cons_idx >=
   1385 	    (1 << req_num_entries_log2)) {
   1386 		aprint_normal_dev(sc->dev,
   1387 		    "Not enough room on completion ring.\n");
   1388 		xs->error = XS_RESOURCE_SHORTAGE;
   1389 		goto finish_xs;
   1390 	}
   1391 
   1392 	if (xs->cmdlen > sizeof(e->cdb)) {
   1393 		DEBUG_PRINTF(1, sc->dev, "cdb length %u too large\n",
   1394 		    xs->cmdlen);
   1395 		xs->error = XS_DRIVER_STUFFUP;
   1396 		goto finish_xs;
   1397 	}
   1398 
   1399 	hcb = pvscsi_hcb_get(sc);
   1400 	if (hcb == NULL) {
   1401 		aprint_normal_dev(sc->dev, "No free hcbs.\n");
   1402 		xs->error = XS_RESOURCE_SHORTAGE;
   1403 		goto finish_xs;
   1404 	}
   1405 
   1406 	hcb->xs = xs;
   1407 
   1408 	const size_t rridx = s->req_prod_idx & MASK(req_num_entries_log2);
   1409 	PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, rridx, BUS_DMASYNC_POSTWRITE);
   1410 	e = ring + rridx;
   1411 
   1412 	memset(e, 0, sizeof(*e));
   1413 	e->bus = 0;
   1414 	e->target = periph->periph_target;
   1415 	e->lun[1] = periph->periph_lun;
   1416 	e->data_addr = 0;
   1417 	e->data_len = xs->datalen;
   1418 	e->vcpu_hint = cpu_index(curcpu());
   1419 	e->flags = 0;
   1420 
   1421 	e->cdb_len = xs->cmdlen;
   1422 	memcpy(e->cdb, xs->cmd, xs->cmdlen);
   1423 
   1424 	e->sense_addr = 0;
   1425 	e->sense_len = sizeof(xs->sense);
   1426 	if (e->sense_len > 0) {
   1427 		e->sense_addr = hcb->sense_buffer_paddr;
   1428 	}
   1429 	//e->tag = xs->xs_tag_type;
   1430 	e->tag = MSG_SIMPLE_Q_TAG;
   1431 
   1432 	switch (xs->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) {
   1433 	case XS_CTL_DATA_IN:
   1434 		e->flags |= PVSCSI_FLAG_CMD_DIR_TOHOST;
   1435 		break;
   1436 	case XS_CTL_DATA_OUT:
   1437 		e->flags |= PVSCSI_FLAG_CMD_DIR_TODEVICE;
   1438 		break;
   1439 	default:
   1440 		e->flags |= PVSCSI_FLAG_CMD_DIR_NONE;
   1441 		break;
   1442 	}
   1443 
   1444 	e->context = pvscsi_hcb_to_context(sc, hcb);
   1445 	hcb->e = e;
   1446 
   1447 	DEBUG_PRINTF(3, sc->dev,
   1448 	    " queuing command %02x context %llx\n", e->cdb[0],
   1449 	    (unsigned long long)e->context);
   1450 
   1451 	int flags;
   1452 	flags  = (xs->xs_control & XS_CTL_DATA_IN) ? BUS_DMA_READ : BUS_DMA_WRITE;
   1453 	flags |= (xs->xs_control & XS_CTL_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
   1454 
   1455 	int error = bus_dmamap_load(sc->sc_dmat, hcb->dma_map,
   1456 	    xs->data, xs->datalen, NULL, flags);
   1457 
   1458 	if (error) {
   1459 		if (error == ENOMEM || error == EAGAIN) {
   1460 			xs->error = XS_RESOURCE_SHORTAGE;
   1461 		} else {
   1462 			xs->error = XS_DRIVER_STUFFUP;
   1463 		}
   1464 		DEBUG_PRINTF(1, sc->dev,
   1465 		    "xs: %p load error %d data %p len %d",
   1466                     xs, error, xs->data, xs->datalen);
   1467 		goto error_load;
   1468 	}
   1469 
   1470 	int op = (xs->xs_control & XS_CTL_DATA_IN) ? BUS_DMASYNC_PREREAD :
   1471 	    BUS_DMASYNC_PREWRITE;
   1472 	int nseg = hcb->dma_map->dm_nsegs;
   1473 	bus_dma_segment_t *segs = hcb->dma_map->dm_segs;
   1474 	if (nseg != 0) {
   1475 		if (nseg > 1) {
   1476 			struct pvscsi_sg_element *sge;
   1477 
   1478 			KASSERTMSG(nseg <= PVSCSI_MAX_SG_ENTRIES_PER_SEGMENT,
   1479 			    "too many sg segments");
   1480 
   1481 			sge = hcb->sg_list->sge;
   1482 			e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST;
   1483 
   1484 			for (size_t i = 0; i < nseg; ++i) {
   1485 				sge[i].addr = segs[i].ds_addr;
   1486 				sge[i].length = segs[i].ds_len;
   1487 				sge[i].flags = 0;
   1488 			}
   1489 
   1490 			e->data_addr = hcb->sg_list_paddr;
   1491 
   1492 			bus_dmamap_sync(sc->sc_dmat,
   1493 			    sc->sg_list_dma.map, hcb->sg_list_offset,
   1494 			    sizeof(*sge) * nseg, BUS_DMASYNC_PREWRITE);
   1495 		} else {
   1496 			e->data_addr = segs->ds_addr;
   1497 		}
   1498 
   1499 		bus_dmamap_sync(sc->sc_dmat, hcb->dma_map, 0,
   1500 		    xs->datalen, op);
   1501 	} else {
   1502 		e->data_addr = 0;
   1503 	}
   1504 
   1505 	/*
   1506 	 * Ensure request record writes happen before write to (increment of)
   1507 	 * req_prod_idx.
   1508 	 */
   1509 	PVSCSI_DMA_SYNC_RING(sc, ring_dma, ring, rridx, BUS_DMASYNC_PREWRITE);
   1510 
   1511 	uint8_t cdb0 = e->cdb[0];
   1512 
   1513 	/* handle timeout */
   1514 	if ((xs->xs_control & XS_CTL_POLL) == 0) {
   1515 		int timeout = mstohz(xs->timeout);
   1516 		/* start expire timer */
   1517 		if (timeout == 0)
   1518 			timeout = 1;
   1519 		callout_reset(&xs->xs_callout, timeout, pvscsi_timeout, hcb);
   1520 	}
   1521 
   1522 	PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, req_prod_idx,
   1523 	    BUS_DMASYNC_POSTWRITE);
   1524 	s->req_prod_idx++;
   1525 
   1526 	/*
   1527 	 * Ensure req_prod_idx write (increment) happens before
   1528 	 * IO is kicked (via a write).
   1529 	 */
   1530 	PVSCSI_DMA_SYNC_STATE(sc, s_dma, s, req_prod_idx,
   1531 	    BUS_DMASYNC_PREWRITE);
   1532 
   1533 	pvscsi_kick_io(sc, cdb0);
   1534 	mutex_exit(&sc->lock);
   1535 
   1536 	return;
   1537 
   1538 error_load:
   1539 	pvscsi_hcb_put(sc, hcb);
   1540 
   1541 finish_xs:
   1542 	mutex_exit(&sc->lock);
   1543 	scsipi_done(xs);
   1544 }
   1545 
   1546 static void
   1547 pvscsi_free_interrupts(struct pvscsi_softc *sc)
   1548 {
   1549 
   1550 	if (sc->sc_ih != NULL) {
   1551 		pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
   1552 		sc->sc_ih = NULL;
   1553 	}
   1554 	if (sc->sc_pihp != NULL) {
   1555 		pci_intr_release(sc->sc_pc, sc->sc_pihp, 1);
   1556 		sc->sc_pihp = NULL;
   1557 	}
   1558 }
   1559 
   1560 static int
   1561 pvscsi_setup_interrupts(struct pvscsi_softc *sc, const struct pci_attach_args *pa)
   1562 {
   1563 	int use_msix;
   1564 	int use_msi;
   1565 	int counts[PCI_INTR_TYPE_SIZE];
   1566 
   1567 	for (size_t i = 0; i < PCI_INTR_TYPE_SIZE; i++) {
   1568 		counts[i] = 1;
   1569 	}
   1570 
   1571 	use_msix = pvscsi_get_tunable(sc, "use_msix", pvscsi_use_msix);
   1572 	use_msi = pvscsi_get_tunable(sc, "use_msi", pvscsi_use_msi);
   1573 
   1574 	if (!use_msix) {
   1575 		counts[PCI_INTR_TYPE_MSIX] = 0;
   1576 	}
   1577 	if (!use_msi) {
   1578 		counts[PCI_INTR_TYPE_MSI] = 0;
   1579 	}
   1580 
   1581 	/* Allocate and establish the interrupt. */
   1582 	if (pci_intr_alloc(pa, &sc->sc_pihp, counts, PCI_INTR_TYPE_MSIX)) {
   1583 		aprint_error_dev(sc->dev, "can't allocate handler\n");
   1584 		goto fail;
   1585 	}
   1586 
   1587 	char intrbuf[PCI_INTRSTR_LEN];
   1588 	const pci_chipset_tag_t pc = pa->pa_pc;
   1589 	char const *intrstr = pci_intr_string(pc, sc->sc_pihp[0], intrbuf,
   1590 	    sizeof(intrbuf));
   1591 
   1592 	sc->sc_ih = pci_intr_establish_xname(pc, sc->sc_pihp[0], IPL_BIO,
   1593 	    pvscsi_intr, sc, device_xname(sc->dev));
   1594 	if (sc->sc_ih == NULL) {
   1595 		pci_intr_release(pc, sc->sc_pihp, 1);
   1596 		sc->sc_pihp = NULL;
   1597 		aprint_error_dev(sc->dev, "couldn't establish interrupt");
   1598 		if (intrstr != NULL)
   1599 			aprint_error(" at %s", intrstr);
   1600 		aprint_error("\n");
   1601 		goto fail;
   1602 	}
   1603 	pci_intr_setattr(pc, sc->sc_pihp, PCI_INTR_MPSAFE, true);
   1604 
   1605 	aprint_normal_dev(sc->dev, "interrupting at %s\n", intrstr);
   1606 
   1607 	return (0);
   1608 
   1609 fail:
   1610 	if (sc->sc_ih != NULL) {
   1611 		pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
   1612 		sc->sc_ih = NULL;
   1613 	}
   1614 	if (sc->sc_pihp != NULL) {
   1615 		pci_intr_release(sc->sc_pc, sc->sc_pihp, 1);
   1616 		sc->sc_pihp = NULL;
   1617 	}
   1618 	if (sc->sc_mems) {
   1619 		bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_mems);
   1620 		sc->sc_mems = 0;
   1621 	}
   1622 
   1623 	return 1;
   1624 }
   1625 
   1626 static void
   1627 pvscsi_free_all(struct pvscsi_softc *sc)
   1628 {
   1629 
   1630 	pvscsi_dma_free_per_hcb(sc, sc->hcb_cnt);
   1631 
   1632 	if (sc->hcbs) {
   1633 		kmem_free(sc->hcbs, sc->hcb_cnt * sizeof(*sc->hcbs));
   1634 	}
   1635 
   1636 	pvscsi_free_rings(sc);
   1637 
   1638 	pvscsi_free_interrupts(sc);
   1639 
   1640 	if (sc->sc_mems) {
   1641 		bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_mems);
   1642 		sc->sc_mems = 0;
   1643 	}
   1644 }
   1645 
   1646 static inline void
   1647 pci_enable_busmaster(device_t dev, const pci_chipset_tag_t pc,
   1648     const pcitag_t tag)
   1649 {
   1650 	pcireg_t pci_cmd_word;
   1651 
   1652 	pci_cmd_word = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
   1653 	if (!(pci_cmd_word & PCI_COMMAND_MASTER_ENABLE)) {
   1654 		pci_cmd_word |= PCI_COMMAND_MASTER_ENABLE;
   1655 		pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, pci_cmd_word);
   1656 	}
   1657 }
   1658 
   1659 static void
   1660 pvscsi_attach(device_t parent, device_t dev, void *aux)
   1661 {
   1662 	const struct pci_attach_args *pa = aux;
   1663 	struct pvscsi_softc *sc;
   1664 	int rid;
   1665 	int error;
   1666 	int max_queue_depth;
   1667 	int adapter_queue_size;
   1668 
   1669 	sc = device_private(dev);
   1670 	sc->dev = dev;
   1671 
   1672 	struct scsipi_adapter *adapt = &sc->sc_adapter;
   1673 	struct scsipi_channel *chan = &sc->sc_channel;
   1674 
   1675 	mutex_init(&sc->lock, MUTEX_DEFAULT, IPL_BIO);
   1676 
   1677 	sc->sc_pc = pa->pa_pc;
   1678 	pci_enable_busmaster(dev, pa->pa_pc, pa->pa_tag);
   1679 
   1680 	pci_aprint_devinfo_fancy(pa, "virtual disk controller",
   1681 	    VMWARE_PVSCSI_DEVSTR, true);
   1682 
   1683 	/*
   1684 	 * Map the device.  All devices support memory-mapped acccess.
   1685 	 */
   1686 	bool memh_valid;
   1687 	bus_space_tag_t memt;
   1688 	bus_space_handle_t memh;
   1689 	bus_size_t mems;
   1690 	pcireg_t regt;
   1691 
   1692 	for (rid = PCI_MAPREG_START; rid < PCI_MAPREG_END; rid += sizeof(regt)) {
   1693 		regt = pci_mapreg_type(pa->pa_pc, pa->pa_tag, rid);
   1694 		if (PCI_MAPREG_TYPE(regt) == PCI_MAPREG_TYPE_MEM)
   1695 			break;
   1696 	}
   1697 
   1698 	if (rid >= PCI_MAPREG_END) {
   1699 		aprint_error_dev(dev,
   1700 		    "unable to locate device registers\n");
   1701 	}
   1702 
   1703 	memh_valid = (pci_mapreg_map(pa, rid, regt, 0, &memt, &memh,
   1704 	    NULL, &mems) == 0);
   1705 	if (!memh_valid) {
   1706 		aprint_error_dev(dev,
   1707 		    "unable to map device registers\n");
   1708 		return;
   1709 	}
   1710 	sc->sc_memt = memt;
   1711 	sc->sc_memh = memh;
   1712 	sc->sc_mems = mems;
   1713 
   1714 	if (pci_dma64_available(pa)) {
   1715 		sc->sc_dmat = pa->pa_dmat64;
   1716 		aprint_verbose_dev(sc->dev, "64-bit DMA\n");
   1717 	} else {
   1718 		aprint_verbose_dev(sc->dev, "32-bit DMA\n");
   1719 		sc->sc_dmat = pa->pa_dmat;
   1720 	}
   1721 
   1722 	error = pvscsi_setup_interrupts(sc, pa);
   1723 	if (error) {
   1724 		aprint_normal_dev(dev, "Interrupt setup failed\n");
   1725 		pvscsi_free_all(sc);
   1726 		return;
   1727 	}
   1728 
   1729 	sc->max_targets = pvscsi_get_max_targets(sc);
   1730 
   1731 	sc->use_msg = pvscsi_get_tunable(sc, "use_msg", pvscsi_use_msg) &&
   1732 	    pvscsi_hw_supports_msg(sc);
   1733 	sc->msg_ring_num_pages = sc->use_msg ? 1 : 0;
   1734 
   1735 	sc->req_ring_num_pages = pvscsi_get_tunable(sc, "request_ring_pages",
   1736 	    pvscsi_request_ring_pages);
   1737 	if (sc->req_ring_num_pages <= 0) {
   1738 		if (sc->max_targets <= 16) {
   1739 			sc->req_ring_num_pages =
   1740 			    PVSCSI_DEFAULT_NUM_PAGES_REQ_RING;
   1741 		} else {
   1742 			sc->req_ring_num_pages = PVSCSI_MAX_NUM_PAGES_REQ_RING;
   1743 		}
   1744 	} else if (sc->req_ring_num_pages > PVSCSI_MAX_NUM_PAGES_REQ_RING) {
   1745 		sc->req_ring_num_pages = PVSCSI_MAX_NUM_PAGES_REQ_RING;
   1746 	}
   1747 	sc->cmp_ring_num_pages = sc->req_ring_num_pages;
   1748 
   1749 	max_queue_depth = pvscsi_get_tunable(sc, "max_queue_depth",
   1750 	    pvscsi_max_queue_depth);
   1751 
   1752 	adapter_queue_size = (sc->req_ring_num_pages * PAGE_SIZE) /
   1753 	    sizeof(struct pvscsi_ring_req_desc);
   1754 	if (max_queue_depth > 0) {
   1755 		adapter_queue_size = MIN(adapter_queue_size, max_queue_depth);
   1756 	}
   1757 	adapter_queue_size = MIN(adapter_queue_size,
   1758 	    PVSCSI_MAX_REQ_QUEUE_DEPTH);
   1759 
   1760 	aprint_normal_dev(sc->dev, "Use Msg: %d\n", sc->use_msg);
   1761 	aprint_normal_dev(sc->dev, "Max targets: %d\n", sc->max_targets);
   1762 	aprint_normal_dev(sc->dev, "REQ num pages: %d\n", sc->req_ring_num_pages);
   1763 	aprint_normal_dev(sc->dev, "CMP num pages: %d\n", sc->cmp_ring_num_pages);
   1764 	aprint_normal_dev(sc->dev, "MSG num pages: %d\n", sc->msg_ring_num_pages);
   1765 	aprint_normal_dev(sc->dev, "Queue size: %d\n", adapter_queue_size);
   1766 
   1767 	if (pvscsi_allocate_rings(sc)) {
   1768 		aprint_normal_dev(dev, "ring allocation failed\n");
   1769 		pvscsi_free_all(sc);
   1770 		return;
   1771 	}
   1772 
   1773 	sc->hcb_cnt = adapter_queue_size;
   1774 	sc->hcbs = kmem_zalloc(sc->hcb_cnt * sizeof(*sc->hcbs), KM_SLEEP);
   1775 
   1776 	if (pvscsi_dma_alloc_per_hcb(sc)) {
   1777 		aprint_normal_dev(dev, "error allocating per hcb dma memory\n");
   1778 		pvscsi_free_all(sc);
   1779 		return;
   1780 	}
   1781 
   1782 	pvscsi_adapter_reset(sc);
   1783 
   1784 	/*
   1785 	 * Fill in the scsipi_adapter.
   1786 	 */
   1787 	memset(adapt, 0, sizeof(*adapt));
   1788 	adapt->adapt_dev = sc->dev;
   1789 	adapt->adapt_nchannels = 1;
   1790 	adapt->adapt_openings = MIN(adapter_queue_size, PVSCSI_CMD_PER_LUN);
   1791 	adapt->adapt_max_periph = adapt->adapt_openings;
   1792 	adapt->adapt_request = pvscsi_scsipi_request;
   1793 	adapt->adapt_minphys = minphys;
   1794 
   1795 	/*
   1796 	 * Fill in the scsipi_channel.
   1797 	 */
   1798 	memset(chan, 0, sizeof(*chan));
   1799 	chan->chan_adapter = adapt;
   1800 	chan->chan_bustype = &scsi_bustype;
   1801 	chan->chan_channel = 0;
   1802 	chan->chan_ntargets = MIN(PVSCSI_MAX_TARGET, 16);	/* cap reasonably */
   1803 	chan->chan_nluns = MIN(PVSCSI_MAX_LUN, 1024);		/* cap reasonably */
   1804 	chan->chan_id = PVSCSI_MAX_TARGET;
   1805 	chan->chan_flags = SCSIPI_CHAN_NOSETTLE;
   1806 
   1807 	pvscsi_setup_rings(sc);
   1808 	if (sc->use_msg) {
   1809 		pvscsi_setup_msg_ring(sc);
   1810 	}
   1811 
   1812 	sc->use_req_call_threshold = pvscsi_setup_req_call(sc, 1);
   1813 
   1814 	pvscsi_intr_enable(sc);
   1815 
   1816 	sc->sc_scsibus_dv = config_found(sc->dev, &sc->sc_channel, scsiprint,
   1817 	    CFARGS_NONE);
   1818 
   1819 	return;
   1820 }
   1821 
   1822 static int
   1823 pvscsi_detach(device_t dev, int flags)
   1824 {
   1825 	struct pvscsi_softc *sc;
   1826 
   1827 	sc = device_private(dev);
   1828 
   1829 	pvscsi_intr_disable(sc);
   1830 	pvscsi_adapter_reset(sc);
   1831 
   1832 	pvscsi_free_all(sc);
   1833 
   1834 	mutex_destroy(&sc->lock);
   1835 
   1836 	return (0);
   1837 }
   1838