1*0e32bd08SSascha Wildner /* 2*0e32bd08SSascha Wildner * Copyright (c) HighPoint Technologies, Inc. 3*0e32bd08SSascha Wildner * All rights reserved. 4*0e32bd08SSascha Wildner * 5*0e32bd08SSascha Wildner * Redistribution and use in source and binary forms, with or without 6*0e32bd08SSascha Wildner * modification, are permitted provided that the following conditions 7*0e32bd08SSascha Wildner * are met: 8*0e32bd08SSascha Wildner * 1. Redistributions of source code must retain the above copyright 9*0e32bd08SSascha Wildner * notice, this list of conditions and the following disclaimer. 10*0e32bd08SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 11*0e32bd08SSascha Wildner * notice, this list of conditions and the following disclaimer in the 12*0e32bd08SSascha Wildner * documentation and/or other materials provided with the distribution. 13*0e32bd08SSascha Wildner * 14*0e32bd08SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*0e32bd08SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*0e32bd08SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*0e32bd08SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*0e32bd08SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*0e32bd08SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*0e32bd08SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*0e32bd08SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*0e32bd08SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*0e32bd08SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*0e32bd08SSascha Wildner * SUCH DAMAGE. 25*0e32bd08SSascha Wildner * 26*0e32bd08SSascha Wildner * $FreeBSD: src/sys/dev/hptrr/os_bsd.h,v 1.3 2010/01/28 08:41:30 mav Exp $ 27*0e32bd08SSascha Wildner */ 28*0e32bd08SSascha Wildner #include <dev/raid/hptrr/hptrr_config.h> 29*0e32bd08SSascha Wildner /* $Id: os_bsd.h,v 1.18 2006/04/11 08:19:02 gmm Exp $ 30*0e32bd08SSascha Wildner * 31*0e32bd08SSascha Wildner * HighPoint RAID Driver for FreeBSD 32*0e32bd08SSascha Wildner * Copyright (C) 2005 HighPoint Technologies, Inc. All Rights Reserved. 33*0e32bd08SSascha Wildner */ 34*0e32bd08SSascha Wildner 35*0e32bd08SSascha Wildner #ifndef _OS_BSD_H 36*0e32bd08SSascha Wildner #define _OS_BSD_H 37*0e32bd08SSascha Wildner 38*0e32bd08SSascha Wildner #ifndef DBG 39*0e32bd08SSascha Wildner #define DBG 0 40*0e32bd08SSascha Wildner #endif 41*0e32bd08SSascha Wildner 42*0e32bd08SSascha Wildner #include <sys/param.h> 43*0e32bd08SSascha Wildner #include <sys/types.h> 44*0e32bd08SSascha Wildner #include <sys/cons.h> 45*0e32bd08SSascha Wildner #include <sys/time.h> 46*0e32bd08SSascha Wildner #include <sys/systm.h> 47*0e32bd08SSascha Wildner 48*0e32bd08SSascha Wildner #include <sys/stat.h> 49*0e32bd08SSascha Wildner #include <sys/malloc.h> 50*0e32bd08SSascha Wildner #include <sys/conf.h> 51*0e32bd08SSascha Wildner #include <sys/libkern.h> 52*0e32bd08SSascha Wildner #include <sys/kernel.h> 53*0e32bd08SSascha Wildner 54*0e32bd08SSascha Wildner #include <sys/kthread.h> 55*0e32bd08SSascha Wildner #include <sys/module.h> 56*0e32bd08SSascha Wildner #include <sys/mplock2.h> 57*0e32bd08SSascha Wildner 58*0e32bd08SSascha Wildner #include <sys/eventhandler.h> 59*0e32bd08SSascha Wildner #include <sys/bus.h> 60*0e32bd08SSascha Wildner #include <sys/device.h> 61*0e32bd08SSascha Wildner #include <sys/taskqueue.h> 62*0e32bd08SSascha Wildner #include <sys/ioccom.h> 63*0e32bd08SSascha Wildner 64*0e32bd08SSascha Wildner #include <sys/rman.h> 65*0e32bd08SSascha Wildner 66*0e32bd08SSascha Wildner #include <vm/vm.h> 67*0e32bd08SSascha Wildner #include <vm/pmap.h> 68*0e32bd08SSascha Wildner 69*0e32bd08SSascha Wildner #include <bus/pci/pcivar.h> 70*0e32bd08SSascha Wildner #include <bus/pci/pcireg.h> 71*0e32bd08SSascha Wildner 72*0e32bd08SSascha Wildner #include <bus/cam/cam.h> 73*0e32bd08SSascha Wildner #include <bus/cam/cam_ccb.h> 74*0e32bd08SSascha Wildner #include <bus/cam/cam_sim.h> 75*0e32bd08SSascha Wildner #include <bus/cam/cam_xpt_periph.h> 76*0e32bd08SSascha Wildner #include <bus/cam/cam_xpt_sim.h> 77*0e32bd08SSascha Wildner #include <bus/cam/cam_debug.h> 78*0e32bd08SSascha Wildner #include <bus/cam/cam_periph.h> 79*0e32bd08SSascha Wildner #include <bus/cam/scsi/scsi_all.h> 80*0e32bd08SSascha Wildner #include <bus/cam/scsi/scsi_message.h> 81*0e32bd08SSascha Wildner 82*0e32bd08SSascha Wildner 83*0e32bd08SSascha Wildner 84*0e32bd08SSascha Wildner typedef struct _INQUIRYDATA { 85*0e32bd08SSascha Wildner u_char DeviceType : 5; 86*0e32bd08SSascha Wildner u_char DeviceTypeQualifier : 3; 87*0e32bd08SSascha Wildner u_char DeviceTypeModifier : 7; 88*0e32bd08SSascha Wildner u_char RemovableMedia : 1; 89*0e32bd08SSascha Wildner u_char Versions; 90*0e32bd08SSascha Wildner u_char ResponseDataFormat; 91*0e32bd08SSascha Wildner u_char AdditionalLength; 92*0e32bd08SSascha Wildner u_char Reserved[2]; 93*0e32bd08SSascha Wildner u_char SoftReset : 1; 94*0e32bd08SSascha Wildner u_char CommandQueue : 1; 95*0e32bd08SSascha Wildner u_char Reserved2 : 1; 96*0e32bd08SSascha Wildner u_char LinkedCommands : 1; 97*0e32bd08SSascha Wildner u_char Synchronous : 1; 98*0e32bd08SSascha Wildner u_char Wide16Bit : 1; 99*0e32bd08SSascha Wildner u_char Wide32Bit : 1; 100*0e32bd08SSascha Wildner u_char RelativeAddressing : 1; 101*0e32bd08SSascha Wildner u_char VendorId[8]; 102*0e32bd08SSascha Wildner u_char ProductId[16]; 103*0e32bd08SSascha Wildner u_char ProductRevisionLevel[4]; 104*0e32bd08SSascha Wildner u_char VendorSpecific[20]; 105*0e32bd08SSascha Wildner u_char Reserved3[40]; 106*0e32bd08SSascha Wildner } 107*0e32bd08SSascha Wildner __attribute__((packed)) 108*0e32bd08SSascha Wildner INQUIRYDATA, *PINQUIRYDATA; 109*0e32bd08SSascha Wildner 110*0e32bd08SSascha Wildner #endif 111*0e32bd08SSascha Wildner 112*0e32bd08SSascha Wildner /* private headers */ 113*0e32bd08SSascha Wildner 114*0e32bd08SSascha Wildner #include <dev/raid/hptrr/osm.h> 115*0e32bd08SSascha Wildner #include <dev/raid/hptrr/him.h> 116*0e32bd08SSascha Wildner #include <dev/raid/hptrr/ldm.h> 117*0e32bd08SSascha Wildner 118*0e32bd08SSascha Wildner /* driver parameters */ 119*0e32bd08SSascha Wildner extern char driver_name[]; 120*0e32bd08SSascha Wildner extern char driver_name_long[]; 121*0e32bd08SSascha Wildner extern char driver_ver[]; 122*0e32bd08SSascha Wildner extern int osm_max_targets; 123*0e32bd08SSascha Wildner 124*0e32bd08SSascha Wildner /* 125*0e32bd08SSascha Wildner * adapter/vbus extensions: 126*0e32bd08SSascha Wildner * each physical controller has an adapter_ext, passed to him.create_adapter() 127*0e32bd08SSascha Wildner * each vbus has a vbus_ext passed to ldm_create_vbus(). 128*0e32bd08SSascha Wildner */ 129*0e32bd08SSascha Wildner #define EXT_TYPE_HBA 1 130*0e32bd08SSascha Wildner #define EXT_TYPE_VBUS 2 131*0e32bd08SSascha Wildner 132*0e32bd08SSascha Wildner typedef struct _hba { 133*0e32bd08SSascha Wildner int ext_type; 134*0e32bd08SSascha Wildner LDM_ADAPTER ldm_adapter; 135*0e32bd08SSascha Wildner device_t pcidev; 136*0e32bd08SSascha Wildner PCI_ADDRESS pciaddr; 137*0e32bd08SSascha Wildner struct _vbus_ext *vbus_ext; 138*0e32bd08SSascha Wildner struct _hba *next; 139*0e32bd08SSascha Wildner 140*0e32bd08SSascha Wildner struct { 141*0e32bd08SSascha Wildner struct resource *res; 142*0e32bd08SSascha Wildner int type; 143*0e32bd08SSascha Wildner int rid; 144*0e32bd08SSascha Wildner void *base; 145*0e32bd08SSascha Wildner } 146*0e32bd08SSascha Wildner pcibar[6]; 147*0e32bd08SSascha Wildner 148*0e32bd08SSascha Wildner struct resource *irq_res; 149*0e32bd08SSascha Wildner void *irq_handle; 150*0e32bd08SSascha Wildner } 151*0e32bd08SSascha Wildner HBA, *PHBA; 152*0e32bd08SSascha Wildner 153*0e32bd08SSascha Wildner typedef struct _os_cmdext { 154*0e32bd08SSascha Wildner struct _vbus_ext *vbus_ext; 155*0e32bd08SSascha Wildner struct _os_cmdext *next; 156*0e32bd08SSascha Wildner union ccb *ccb; 157*0e32bd08SSascha Wildner bus_dmamap_t dma_map; 158*0e32bd08SSascha Wildner SG psg[os_max_sg_descriptors]; 159*0e32bd08SSascha Wildner } 160*0e32bd08SSascha Wildner OS_CMDEXT, *POS_CMDEXT; 161*0e32bd08SSascha Wildner 162*0e32bd08SSascha Wildner typedef struct _vbus_ext { 163*0e32bd08SSascha Wildner int ext_type; 164*0e32bd08SSascha Wildner struct _vbus_ext *next; 165*0e32bd08SSascha Wildner PHBA hba_list; 166*0e32bd08SSascha Wildner struct freelist *freelist_head; 167*0e32bd08SSascha Wildner struct freelist *freelist_dma_head; 168*0e32bd08SSascha Wildner 169*0e32bd08SSascha Wildner struct cam_sim *sim; /* sim for this vbus */ 170*0e32bd08SSascha Wildner struct cam_path *path; /* peripheral, path, tgt, lun with this vbus */ 171*0e32bd08SSascha Wildner struct lock lock; /* general purpose lock */ 172*0e32bd08SSascha Wildner bus_dma_tag_t io_dmat; /* I/O buffer DMA tag */ 173*0e32bd08SSascha Wildner 174*0e32bd08SSascha Wildner POS_CMDEXT cmdext_list; 175*0e32bd08SSascha Wildner 176*0e32bd08SSascha Wildner OSM_TASK *tasks; 177*0e32bd08SSascha Wildner struct task worker; 178*0e32bd08SSascha Wildner 179*0e32bd08SSascha Wildner struct callout timer; 180*0e32bd08SSascha Wildner 181*0e32bd08SSascha Wildner eventhandler_tag shutdown_eh; 182*0e32bd08SSascha Wildner 183*0e32bd08SSascha Wildner /* the LDM vbus instance continues */ 184*0e32bd08SSascha Wildner unsigned long vbus[0] __attribute__((aligned(sizeof(unsigned long)))); 185*0e32bd08SSascha Wildner } 186*0e32bd08SSascha Wildner VBUS_EXT, *PVBUS_EXT; 187*0e32bd08SSascha Wildner 188*0e32bd08SSascha Wildner #define hpt_lock_vbus(vbus_ext) lockmgr(&(vbus_ext)->lock, LK_EXCLUSIVE) 189*0e32bd08SSascha Wildner #define hpt_unlock_vbus(vbus_ext) lockmgr(&(vbus_ext)->lock, LK_RELEASE) 190*0e32bd08SSascha Wildner 191*0e32bd08SSascha Wildner #define HPTRR_DFLTPHYS (64 * 1024) 192*0e32bd08SSascha Wildner 193*0e32bd08SSascha Wildner #define HPT_OSM_TIMEOUT (20*hz) /* timeout value for OS commands */ 194*0e32bd08SSascha Wildner 195*0e32bd08SSascha Wildner #define HPT_DO_IOCONTROL _IOW('H', 0, HPT_IOCTL_PARAM) 196*0e32bd08SSascha Wildner 197*0e32bd08SSascha Wildner #define HPT_SCAN_BUS _IO('H', 1) 198*0e32bd08SSascha Wildner 199*0e32bd08SSascha Wildner #define TASK_ENQUEUE(task) taskqueue_enqueue(taskqueue_swi,(task)); 200*0e32bd08SSascha Wildner 201*0e32bd08SSascha Wildner static __inline int hpt_sleep(PVBUS_EXT vbus_ext, void *ident, int priority, const char *wmesg, int timo) 202*0e32bd08SSascha Wildner { 203*0e32bd08SSascha Wildner return lksleep(ident, &vbus_ext->lock, priority, wmesg, timo); 204*0e32bd08SSascha Wildner } 205