135878b55SSascha Wildner /* 235878b55SSascha Wildner * Copyright (c) 2004-2005 HighPoint Technologies, Inc. 335878b55SSascha Wildner * All rights reserved. 435878b55SSascha Wildner * 535878b55SSascha Wildner * Redistribution and use in source and binary forms, with or without 635878b55SSascha Wildner * modification, are permitted provided that the following conditions 735878b55SSascha Wildner * are met: 835878b55SSascha Wildner * 1. Redistributions of source code must retain the above copyright 935878b55SSascha Wildner * notice, this list of conditions and the following disclaimer. 1035878b55SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 1135878b55SSascha Wildner * notice, this list of conditions and the following disclaimer in the 1235878b55SSascha Wildner * documentation and/or other materials provided with the distribution. 1335878b55SSascha Wildner * 1435878b55SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1535878b55SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1635878b55SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1735878b55SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1835878b55SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1935878b55SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2035878b55SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2135878b55SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2235878b55SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2335878b55SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2435878b55SSascha Wildner * SUCH DAMAGE. 2535878b55SSascha Wildner * 2635878b55SSascha Wildner * $FreeBSD: src/sys/dev/hptmv/vdevice.h,v 1.4 2009/04/07 16:38:25 delphij Exp $ 2735878b55SSascha Wildner */ 2835878b55SSascha Wildner 2935878b55SSascha Wildner #ifndef _VDEVICE_H_ 3035878b55SSascha Wildner #define _VDEVICE_H_ 3135878b55SSascha Wildner 3235878b55SSascha Wildner /*************************************************************************** 3335878b55SSascha Wildner * Description: virtual device header 3435878b55SSascha Wildner ***************************************************************************/ 3535878b55SSascha Wildner 3635878b55SSascha Wildner typedef struct _VDevice 3735878b55SSascha Wildner { 3835878b55SSascha Wildner UCHAR VDeviceType; 3935878b55SSascha Wildner UCHAR vf_bootmark: 1; /* is boot device? */ 4035878b55SSascha Wildner UCHAR vf_bootable: 1; /* has active partition */ 4135878b55SSascha Wildner UCHAR vf_online: 1; /* is usable? */ 4235878b55SSascha Wildner UCHAR vf_cache_disk: 1; /* Cache enabled */ 4335878b55SSascha Wildner UCHAR vf_format_v2: 1; /* old array block */ 4435878b55SSascha Wildner UCHAR vf_freed: 1; /* memory free */ 4535878b55SSascha Wildner UCHAR reserve1; 4635878b55SSascha Wildner UCHAR bSerialNumber; /* valid if pParent!=0 */ 4735878b55SSascha Wildner 4835878b55SSascha Wildner PVDevice pParent; /* parent array */ 4935878b55SSascha Wildner PVBus pVBus; /* vbus this device located. Must not be NULL. */ 5035878b55SSascha Wildner 5135878b55SSascha Wildner LBA_T VDeviceCapacity; /* number of blocks */ 5235878b55SSascha Wildner 5335878b55SSascha Wildner LBA_T LockedLba; 5435878b55SSascha Wildner USHORT LockedSectors; 5535878b55SSascha Wildner USHORT ActiveRequests; 5635878b55SSascha Wildner PCommand LockWaitList; 5735878b55SSascha Wildner void (* HPTLIBAPI QuiesceAction)(_VBUS_ARG void *arg); 5835878b55SSascha Wildner void *QuiesceArg; 5935878b55SSascha Wildner void (* HPTLIBAPI flush_callback)(_VBUS_ARG void *arg); 6035878b55SSascha Wildner void *flush_callback_arg; 6135878b55SSascha Wildner 6235878b55SSascha Wildner 6335878b55SSascha Wildner #if defined(_RAID5N_) 6435878b55SSascha Wildner struct stripe **CacheEntry; 6535878b55SSascha Wildner struct range_lock *range_lock; 6635878b55SSascha Wildner #endif 6735878b55SSascha Wildner 6835878b55SSascha Wildner void (* HPTLIBAPI pfnSendCommand)(_VBUS_ARG PCommand pCmd); /* call this to send a command to a VDevice */ 6935878b55SSascha Wildner void (* HPTLIBAPI pfnDeviceFailed)(_VBUS_ARG PVDevice pVDev); /* call this when a VDevice failed */ 7035878b55SSascha Wildner 7135878b55SSascha Wildner union { 7235878b55SSascha Wildner #ifdef SUPPORT_ARRAY 7335878b55SSascha Wildner RaidArray array; 7435878b55SSascha Wildner #endif 7535878b55SSascha Wildner Device disk; 7635878b55SSascha Wildner } u; 7735878b55SSascha Wildner 7835878b55SSascha Wildner } VDevice; 7935878b55SSascha Wildner 80a643c667SSascha Wildner #define ARRAY_VDEV_SIZE (__offsetof(VDevice, u) + sizeof(RaidArray)) 81a643c667SSascha Wildner #define DISK_VDEV_SIZE (__offsetof(VDevice, u) + sizeof(Device)) 8235878b55SSascha Wildner 83a643c667SSascha Wildner #define Map2pVDevice(pDev) ((PVDevice)((UINT_PTR)pDev - __offsetof(VDevice, u.disk))) 8435878b55SSascha Wildner 8535878b55SSascha Wildner /* 8635878b55SSascha Wildner * bUserDeviceMode 8735878b55SSascha Wildner */ 8835878b55SSascha Wildner #define MEMBER_NOT_SET_MODE 0x5F 8935878b55SSascha Wildner 9035878b55SSascha Wildner /* 9135878b55SSascha Wildner * arrayType 9235878b55SSascha Wildner */ 9335878b55SSascha Wildner #define VD_SPARE 0 9435878b55SSascha Wildner #define VD_REMOVABLE 1 9535878b55SSascha Wildner #define VD_ATAPI 2 9635878b55SSascha Wildner #define VD_SINGLE_DISK 3 9735878b55SSascha Wildner 9835878b55SSascha Wildner #define VD_JBOD 4 /* JBOD */ 9935878b55SSascha Wildner #define VD_RAID_0 5 /* RAID 0 stripe */ 10035878b55SSascha Wildner #define VD_RAID_1 6 /* RAID 1 mirror */ 10135878b55SSascha Wildner #define VD_RAID_3 7 /* RAID 3 */ 10235878b55SSascha Wildner #define VD_RAID_5 8 /* RAID 5 */ 10335878b55SSascha Wildner #define VD_MAX_TYPE 8 10435878b55SSascha Wildner 10535878b55SSascha Wildner #ifdef SUPPORT_ARRAY 10635878b55SSascha Wildner #define mIsArray(pVDev) (pVDev->VDeviceType>VD_SINGLE_DISK) 10735878b55SSascha Wildner #else 10835878b55SSascha Wildner #define mIsArray(pVDev) 0 10935878b55SSascha Wildner #endif 11035878b55SSascha Wildner 11135878b55SSascha Wildner extern void (* HPTLIBAPI pfnSendCommand[])(_VBUS_ARG PCommand pCmd); 11235878b55SSascha Wildner extern void (* HPTLIBAPI pfnDeviceFailed[])(_VBUS_ARG PVDevice pVDev); 11335878b55SSascha Wildner void HPTLIBAPI fOsDiskFailed(_VBUS_ARG PVDevice pVDev); 11435878b55SSascha Wildner void HPTLIBAPI fDeviceSendCommand(_VBUS_ARG PCommand pCmd); 11535878b55SSascha Wildner void HPTLIBAPI fSingleDiskFailed(_VBUS_ARG PVDevice pVDev); 11635878b55SSascha Wildner 11735878b55SSascha Wildner /*************************************************************************** 11835878b55SSascha Wildner * Description: RAID Adapter 11935878b55SSascha Wildner ***************************************************************************/ 12035878b55SSascha Wildner 12135878b55SSascha Wildner typedef struct _VBus { 12235878b55SSascha Wildner /* pVDevice[] may be non-continuous */ 12335878b55SSascha Wildner PVDevice pVDevice[MAX_VDEVICE_PER_VBUS]; 12435878b55SSascha Wildner 12535878b55SSascha Wildner UINT nInstances; 12635878b55SSascha Wildner PChipInstance pChipInstance[MAX_CHIP_IN_VBUS]; 12735878b55SSascha Wildner 12835878b55SSascha Wildner void * OsExt; /* for OS private use */ 12935878b55SSascha Wildner 13035878b55SSascha Wildner 13135878b55SSascha Wildner int serial_mode; 13235878b55SSascha Wildner int next_active; 13335878b55SSascha Wildner int working_devs; 13435878b55SSascha Wildner 13535878b55SSascha Wildner 13635878b55SSascha Wildner 13735878b55SSascha Wildner PCommand pFreeCommands; 13835878b55SSascha Wildner DPC_ROUTINE PendingRoutines[MAX_PENDING_ROUTINES]; 13935878b55SSascha Wildner int PendingRoutinesFirst, PendingRoutinesLast; 14035878b55SSascha Wildner DPC_ROUTINE IdleRoutines[MAX_IDLE_ROUTINES]; 14135878b55SSascha Wildner int IdleRoutinesFirst, IdleRoutinesLast; 14235878b55SSascha Wildner 14335878b55SSascha Wildner #ifdef SUPPORT_ARRAY 14435878b55SSascha Wildner PVDevice pFreeArrayLink; 14535878b55SSascha Wildner BYTE _ArrayTables[MAX_ARRAY_PER_VBUS * ARRAY_VDEV_SIZE]; 14635878b55SSascha Wildner #endif 14735878b55SSascha Wildner 14835878b55SSascha Wildner 14935878b55SSascha Wildner #ifdef _RAID5N_ 15035878b55SSascha Wildner struct r5_global_data r5; 15135878b55SSascha Wildner #endif 15235878b55SSascha Wildner 15335878b55SSascha Wildner } VBus; 15435878b55SSascha Wildner 15535878b55SSascha Wildner /* 15635878b55SSascha Wildner * Array members must be on same VBus. 15735878b55SSascha Wildner * The platform dependent part shall select one of the following strategy. 15835878b55SSascha Wildner */ 15935878b55SSascha Wildner #ifdef SET_VBUS_FOR_EACH_IRQ 16035878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) ((pChip1)->bChipIntrNum==(pChip2)->bChipIntrNum) 16135878b55SSascha Wildner #elif defined(SET_VBUS_FOR_EACH_CONTROLLER) 16235878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \ 16335878b55SSascha Wildner ((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev) 16435878b55SSascha Wildner #elif defined(SET_VBUS_FOR_EACH_FUNCTION) 16535878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \ 16635878b55SSascha Wildner ((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev && (pChip1)->pci_func==(pChip2)->pci_func) 16735878b55SSascha Wildner #else 16835878b55SSascha Wildner #error You must set one vbus setting 16935878b55SSascha Wildner #endif 17035878b55SSascha Wildner 17135878b55SSascha Wildner #define FOR_EACH_CHANNEL_ON_VBUS(_pVBus, _pChan) \ 17235878b55SSascha Wildner for (_pChan=pChanStart; _pChan<pChanEnd; _pChan++) \ 17335878b55SSascha Wildner if (_pChan->pChipInstance->pVBus!=_pVBus) ; else 17435878b55SSascha Wildner 17535878b55SSascha Wildner #define FOR_EACH_DEV_ON_VBUS(pVBus, pVDev, i) \ 17635878b55SSascha Wildner for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \ 17735878b55SSascha Wildner if ((pVDev=pVBus->pVDevice[i])==0) continue; else 17835878b55SSascha Wildner 17935878b55SSascha Wildner 18035878b55SSascha Wildner #define FOR_EACH_VBUS(pVBus) \ 18135878b55SSascha Wildner for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \ 18235878b55SSascha Wildner 18335878b55SSascha Wildner #define FOR_EACH_ARRAY_ON_ALL_VBUS(pVBus, pArray, i) \ 18435878b55SSascha Wildner for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \ 18535878b55SSascha Wildner for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) \ 18635878b55SSascha Wildner if ((pArray=((PVDevice)&pVBus->_ArrayTables[i*ARRAY_VDEV_SIZE]))->u.array.dArStamp==0) continue; else 18735878b55SSascha Wildner 18835878b55SSascha Wildner #define FOR_EACH_DEV_ON_ALL_VBUS(pVBus, pVDev, i) \ 18935878b55SSascha Wildner FOR_EACH_VBUS(pVBus) \ 19035878b55SSascha Wildner for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \ 19135878b55SSascha Wildner if ((pVDev=pVBus->pVDevice[i])==0) continue; else 19235878b55SSascha Wildner 19335878b55SSascha Wildner /*************************************************************************** 19435878b55SSascha Wildner * Description: the functions called by IDE layer 19535878b55SSascha Wildner ***************************************************************************/ 19635878b55SSascha Wildner #ifdef SUPPORT_ARRAY 19735878b55SSascha Wildner #define IdeRegisterDevice fCheckArray 19835878b55SSascha Wildner #else 19935878b55SSascha Wildner void HPTLIBAPI IdeRegisterDevice(PDevice pDev); 20035878b55SSascha Wildner #endif 20135878b55SSascha Wildner 20235878b55SSascha Wildner /*************************************************************************** 20335878b55SSascha Wildner * Description: the functions OS must provided 20435878b55SSascha Wildner ***************************************************************************/ 20535878b55SSascha Wildner 20635878b55SSascha Wildner void HPTLIBAPI OsSetDeviceTable(PDevice pDevice, PIDENTIFY_DATA pIdentify); 20735878b55SSascha Wildner 20835878b55SSascha Wildner /* 20935878b55SSascha Wildner * allocate and free data structure 21035878b55SSascha Wildner */ 21135878b55SSascha Wildner PChannel fGetChannelTable(void); 21235878b55SSascha Wildner PDevice fGetDeviceTable(void); 21335878b55SSascha Wildner #define OsGetChannelTable(x, y) fGetChannelTable() 21435878b55SSascha Wildner #define OsGetDeviceTable(x, y) fGetDeviceTable() 21535878b55SSascha Wildner void OsReturnTable(PDevice pDevice); 21635878b55SSascha Wildner /*************************************************************************** 21735878b55SSascha Wildner * Description: the functions Prototype 21835878b55SSascha Wildner ***************************************************************************/ 21935878b55SSascha Wildner /* 22035878b55SSascha Wildner * vdevice.c 22135878b55SSascha Wildner */ 22235878b55SSascha Wildner int Initialize(void); 22335878b55SSascha Wildner int InitializeAllChips(void); 22435878b55SSascha Wildner void InitializeVBus(PVBus pVBus); 22535878b55SSascha Wildner void fRegisterChip(PChipInstance pChip); 22635878b55SSascha Wildner void __fRegisterVDevices(PVBus pVBus); 22735878b55SSascha Wildner void fRegisterVDevices(void); 22835878b55SSascha Wildner void HPTLIBAPI UnregisterVDevice(PVDevice); 22935878b55SSascha Wildner void HPTLIBAPI fCheckBootable(PVDevice pVDev); 23035878b55SSascha Wildner void HPTLIBAPI fFlushVDev(PVDevice pVDev); 23135878b55SSascha Wildner void HPTLIBAPI fFlushVDevAsync(PVDevice pVDev, DPC_PROC done, void *arg); 23235878b55SSascha Wildner void HPTLIBAPI fShutdownVDev(PVDevice pVDev); 23335878b55SSascha Wildner void HPTLIBAPI fResetVBus(_VBUS_ARG0); 23435878b55SSascha Wildner void HPTLIBAPI fCompleteAllCommandsSynchronously(PVBus _vbus_p); 23535878b55SSascha Wildner 236*7323311aSzrj #define RegisterVDevice(pVDev) do { } while (0) 23735878b55SSascha Wildner #define OsRegisterDevice(pVDev) 23835878b55SSascha Wildner #define OsUnregisterDevice(pVDev) 23935878b55SSascha Wildner 24035878b55SSascha Wildner #ifdef SUPPORT_VBUS_CONFIG 24135878b55SSascha Wildner void VBus_Config(PVBus pVBus, char *str); 24235878b55SSascha Wildner #else 24335878b55SSascha Wildner #define VBus_Config(pVBus, str) 24435878b55SSascha Wildner #endif 24535878b55SSascha Wildner 24635878b55SSascha Wildner #pragma pack(1) 24735878b55SSascha Wildner struct fdisk_partition_table 24835878b55SSascha Wildner { 24935878b55SSascha Wildner UCHAR bootid; /* bootable? 0=no, 128=yes */ 25035878b55SSascha Wildner UCHAR beghead; /* beginning head number */ 25135878b55SSascha Wildner UCHAR begsect; /* beginning sector number */ 25235878b55SSascha Wildner UCHAR begcyl; /* 10 bit nmbr, with high 2 bits put in begsect */ 25335878b55SSascha Wildner UCHAR systid; /* Operating System type indicator code */ 25435878b55SSascha Wildner UCHAR endhead; /* ending head number */ 25535878b55SSascha Wildner UCHAR endsect; /* ending sector number */ 25635878b55SSascha Wildner UCHAR endcyl; /* also a 10 bit nmbr, with same high 2 bit trick */ 25735878b55SSascha Wildner ULONG relsect; /* first sector relative to start of disk */ 25835878b55SSascha Wildner ULONG numsect; /* number of sectors in partition */ 25935878b55SSascha Wildner }; 26035878b55SSascha Wildner 26135878b55SSascha Wildner typedef struct _Master_Boot_Record 26235878b55SSascha Wildner { 26335878b55SSascha Wildner UCHAR bootinst[446]; /* space to hold actual boot code */ 26435878b55SSascha Wildner struct fdisk_partition_table parts[4]; 26535878b55SSascha Wildner USHORT signature; /* set to 0xAA55 to indicate PC MBR format */ 26635878b55SSascha Wildner } 26735878b55SSascha Wildner Master_Boot_Record, *PMaster_Boot_Record; 26835878b55SSascha Wildner 26935878b55SSascha Wildner #ifndef SUPPORT_ARRAY 27035878b55SSascha Wildner /* TODO: move it later */ 27135878b55SSascha Wildner #ifdef __BIG_ENDIAN_BITFIELD 27235878b55SSascha Wildner typedef DWORD TIME_RECORD; 27335878b55SSascha Wildner #else 27435878b55SSascha Wildner typedef struct _TIME_RECORD { 27535878b55SSascha Wildner UINT seconds:6; /* 0 - 59 */ 27635878b55SSascha Wildner UINT minutes:6; /* 0 - 59 */ 27735878b55SSascha Wildner UINT month:4; /* 1 - 12 */ 27835878b55SSascha Wildner UINT hours:6; /* 0 - 59 */ 27935878b55SSascha Wildner UINT day:5; /* 1 - 31 */ 28035878b55SSascha Wildner UINT year:5; /* 0=2000, 31=2031 */ 28135878b55SSascha Wildner } TIME_RECORD; 28235878b55SSascha Wildner #endif 28335878b55SSascha Wildner #endif 28435878b55SSascha Wildner 28535878b55SSascha Wildner #pragma pack() 28635878b55SSascha Wildner #endif 287