181966bceSXin LI /*- 2718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3718cf2ccSPedro F. Giffuni * 4f29c86f1SXin LI * Copyright (c) 2005-2011 HighPoint Technologies, Inc. 581966bceSXin LI * All rights reserved. 681966bceSXin LI * 781966bceSXin LI * Redistribution and use in source and binary forms, with or without 881966bceSXin LI * modification, are permitted provided that the following conditions 981966bceSXin LI * are met: 1081966bceSXin LI * 1. Redistributions of source code must retain the above copyright 1181966bceSXin LI * notice, this list of conditions and the following disclaimer. 1281966bceSXin LI * 2. Redistributions in binary form must reproduce the above copyright 1381966bceSXin LI * notice, this list of conditions and the following disclaimer in the 1481966bceSXin LI * documentation and/or other materials provided with the distribution. 1581966bceSXin LI * 1681966bceSXin LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1781966bceSXin LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1881966bceSXin LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1981966bceSXin LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2081966bceSXin LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2181966bceSXin LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2281966bceSXin LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2381966bceSXin LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2481966bceSXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2581966bceSXin LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2681966bceSXin LI * SUCH DAMAGE. 2781966bceSXin LI * 2881966bceSXin LI * $FreeBSD$ 2981966bceSXin LI */ 3081966bceSXin LI 3181966bceSXin LI #include <dev/hpt27xx/hpt27xx_config.h> 3281966bceSXin LI 3381966bceSXin LI #ifndef _OS_BSD_H 3481966bceSXin LI #define _OS_BSD_H 3581966bceSXin LI 3681966bceSXin LI #ifndef DBG 3781966bceSXin LI #define DBG 0 3881966bceSXin LI #endif 3981966bceSXin LI 4081966bceSXin LI #include <sys/param.h> 4181966bceSXin LI #include <sys/types.h> 4281966bceSXin LI #include <sys/cons.h> 4381966bceSXin LI #include <sys/time.h> 4481966bceSXin LI #include <sys/systm.h> 4581966bceSXin LI 4681966bceSXin LI #include <sys/stat.h> 4781966bceSXin LI #include <sys/malloc.h> 4881966bceSXin LI #include <sys/conf.h> 4981966bceSXin LI #include <sys/libkern.h> 5081966bceSXin LI #include <sys/kernel.h> 5181966bceSXin LI 5281966bceSXin LI #include <sys/kthread.h> 5381966bceSXin LI #include <sys/mutex.h> 5481966bceSXin LI #include <sys/module.h> 5581966bceSXin LI 5681966bceSXin LI #include <sys/eventhandler.h> 5781966bceSXin LI #include <sys/bus.h> 5881966bceSXin LI #include <sys/taskqueue.h> 5981966bceSXin LI #include <sys/ioccom.h> 6081966bceSXin LI 6181966bceSXin LI #include <machine/resource.h> 6281966bceSXin LI #include <machine/pci_cfgreg.h> 6381966bceSXin LI #include <machine/bus.h> 6481966bceSXin LI #include <machine/stdarg.h> 6581966bceSXin LI #include <sys/rman.h> 6681966bceSXin LI 6781966bceSXin LI #include <vm/vm.h> 6881966bceSXin LI #include <vm/pmap.h> 6981966bceSXin LI 7081966bceSXin LI #include <dev/pci/pcireg.h> 7181966bceSXin LI #include <dev/pci/pcivar.h> 7281966bceSXin LI 7381966bceSXin LI #include <cam/cam.h> 7481966bceSXin LI #include <cam/cam_ccb.h> 7581966bceSXin LI #include <cam/cam_sim.h> 7681966bceSXin LI #include <cam/cam_xpt_sim.h> 7781966bceSXin LI #include <cam/cam_debug.h> 7881966bceSXin LI #include <cam/cam_xpt_periph.h> 7981966bceSXin LI #include <cam/cam_periph.h> 8081966bceSXin LI #include <cam/scsi/scsi_all.h> 8181966bceSXin LI #include <cam/scsi/scsi_message.h> 8281966bceSXin LI 8381966bceSXin LI 8481966bceSXin LI typedef struct _INQUIRYDATA { 8581966bceSXin LI u_char DeviceType : 5; 8681966bceSXin LI u_char DeviceTypeQualifier : 3; 8781966bceSXin LI u_char DeviceTypeModifier : 7; 8881966bceSXin LI u_char RemovableMedia : 1; 8981966bceSXin LI u_char Versions; 9081966bceSXin LI u_char ResponseDataFormat; 9181966bceSXin LI u_char AdditionalLength; 9281966bceSXin LI u_char Reserved[2]; 9381966bceSXin LI u_char SoftReset : 1; 9481966bceSXin LI u_char CommandQueue : 1; 9581966bceSXin LI u_char Reserved2 : 1; 9681966bceSXin LI u_char LinkedCommands : 1; 9781966bceSXin LI u_char Synchronous : 1; 9881966bceSXin LI u_char Wide16Bit : 1; 9981966bceSXin LI u_char Wide32Bit : 1; 10081966bceSXin LI u_char RelativeAddressing : 1; 10181966bceSXin LI u_char VendorId[8]; 10281966bceSXin LI u_char ProductId[16]; 10381966bceSXin LI u_char ProductRevisionLevel[4]; 10481966bceSXin LI u_char VendorSpecific[20]; 10581966bceSXin LI u_char Reserved3[40]; 10681966bceSXin LI } 10781966bceSXin LI __attribute__((packed)) 10881966bceSXin LI INQUIRYDATA, *PINQUIRYDATA; 10981966bceSXin LI 11081966bceSXin LI #endif 11181966bceSXin LI 11281966bceSXin LI /* private headers */ 11381966bceSXin LI 11481966bceSXin LI #include <dev/hpt27xx/osm.h> 11581966bceSXin LI #include <dev/hpt27xx/him.h> 11681966bceSXin LI #include <dev/hpt27xx/ldm.h> 11781966bceSXin LI 11881966bceSXin LI /* driver parameters */ 1198ec81e39SXin LI extern const char driver_name[]; 1208ec81e39SXin LI extern const char driver_name_long[]; 1218ec81e39SXin LI extern const char driver_ver[]; 12281966bceSXin LI extern int osm_max_targets; 12381966bceSXin LI 12481966bceSXin LI /* 12581966bceSXin LI * adapter/vbus extensions: 12681966bceSXin LI * each physical controller has an adapter_ext, passed to him.create_adapter() 12781966bceSXin LI * each vbus has a vbus_ext passed to ldm_create_vbus(). 12881966bceSXin LI */ 12981966bceSXin LI #define EXT_TYPE_HBA 1 13081966bceSXin LI #define EXT_TYPE_VBUS 2 13181966bceSXin LI 13281966bceSXin LI typedef struct _hba { 13381966bceSXin LI int ext_type; 13481966bceSXin LI LDM_ADAPTER ldm_adapter; 13581966bceSXin LI device_t pcidev; 13681966bceSXin LI PCI_ADDRESS pciaddr; 13781966bceSXin LI struct _vbus_ext *vbus_ext; 13881966bceSXin LI struct _hba *next; 13981966bceSXin LI 14081966bceSXin LI struct { 14181966bceSXin LI struct resource *res; 14281966bceSXin LI int type; 14381966bceSXin LI int rid; 14481966bceSXin LI void *base; 14581966bceSXin LI } 14681966bceSXin LI pcibar[6]; 14781966bceSXin LI 14881966bceSXin LI struct resource *irq_res; 14981966bceSXin LI void *irq_handle; 15081966bceSXin LI } 15181966bceSXin LI HBA, *PHBA; 15281966bceSXin LI 15381966bceSXin LI typedef struct _os_cmdext { 15481966bceSXin LI struct _vbus_ext *vbus_ext; 15581966bceSXin LI struct _os_cmdext *next; 15681966bceSXin LI union ccb *ccb; 15781966bceSXin LI bus_dmamap_t dma_map; 158f29c86f1SXin LI #if (__FreeBSD_version >= 1000510) 159238b419fSJohn Baldwin struct callout timeout; 160f29c86f1SXin LI #endif 16181966bceSXin LI SG psg[os_max_sg_descriptors]; 16281966bceSXin LI } 16381966bceSXin LI OS_CMDEXT, *POS_CMDEXT; 16481966bceSXin LI 16581966bceSXin LI typedef struct _vbus_ext { 16681966bceSXin LI int ext_type; 16781966bceSXin LI struct _vbus_ext *next; 16881966bceSXin LI PHBA hba_list; 16981966bceSXin LI struct freelist *freelist_head; 17081966bceSXin LI struct freelist *freelist_dma_head; 17181966bceSXin LI 17281966bceSXin LI struct cam_sim *sim; /* sim for this vbus */ 17381966bceSXin LI struct cam_path *path; /* peripheral, path, tgt, lun with this vbus */ 17481966bceSXin LI struct mtx lock; /* general purpose lock */ 17581966bceSXin LI bus_dma_tag_t io_dmat; /* I/O buffer DMA tag */ 17681966bceSXin LI 17781966bceSXin LI POS_CMDEXT cmdext_list; 17881966bceSXin LI 17981966bceSXin LI OSM_TASK *tasks; 18081966bceSXin LI struct task worker; 181f29c86f1SXin LI #if (__FreeBSD_version >= 1000510) 182238b419fSJohn Baldwin struct callout timer; 183f29c86f1SXin LI #else 184f29c86f1SXin LI struct callout_handle timer; 185f29c86f1SXin LI #endif 18681966bceSXin LI eventhandler_tag shutdown_eh; 18781966bceSXin LI 18881966bceSXin LI /* the LDM vbus instance continues */ 18981966bceSXin LI unsigned long vbus[0] __attribute__((aligned(sizeof(unsigned long)))); 19081966bceSXin LI } 19181966bceSXin LI VBUS_EXT, *PVBUS_EXT; 19281966bceSXin LI 19381966bceSXin LI #define hpt_lock_vbus(vbus_ext) mtx_lock(&(vbus_ext)->lock) 19481966bceSXin LI #define hpt_unlock_vbus(vbus_ext) mtx_unlock(&(vbus_ext)->lock) 195238b419fSJohn Baldwin #define hpt_assert_vbus_locked(vbus_ext) mtx_assert(&(vbus_ext)->lock, MA_OWNED) 19681966bceSXin LI 19781966bceSXin LI 19881966bceSXin LI #define HPT_OSM_TIMEOUT (20*hz) /* timeout value for OS commands */ 19981966bceSXin LI 20081966bceSXin LI #define HPT_DO_IOCONTROL _IOW('H', 0, HPT_IOCTL_PARAM) 20181966bceSXin LI 20281966bceSXin LI #define HPT_SCAN_BUS _IO('H', 1) 20381966bceSXin LI 204f29c86f1SXin LI #if __FreeBSD_version < 1000510 205f29c86f1SXin LI #define TASK_ENQUEUE(task) taskqueue_enqueue(taskqueue_swi_giant,(task)); 206f29c86f1SXin LI #else 20781966bceSXin LI #define TASK_ENQUEUE(task) taskqueue_enqueue(taskqueue_swi,(task)); 208f29c86f1SXin LI #endif 20981966bceSXin LI 21081966bceSXin LI static __inline int hpt_sleep(PVBUS_EXT vbus_ext, void *ident, int priority, const char *wmesg, int timo) 21181966bceSXin LI { 21281966bceSXin LI return msleep(ident, &vbus_ext->lock, priority, wmesg, timo); 21381966bceSXin LI } 214f29c86f1SXin LI 215