14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner
214e1bc9a0SAchim Leubner *******************************************************************************/
224e1bc9a0SAchim Leubner
234e1bc9a0SAchim Leubner
244e1bc9a0SAchim Leubner MALLOC_DEFINE( M_PMC_OSTI, "osti_cacheable", "allocated from ostiAllocMemory as cacheable memory" );
254e1bc9a0SAchim Leubner
264e1bc9a0SAchim Leubner
274e1bc9a0SAchim Leubner /******************************************************************************
284e1bc9a0SAchim Leubner ostiAllocMemory()
294e1bc9a0SAchim Leubner Purpose:
304e1bc9a0SAchim Leubner TD layer calls to get dma memory
314e1bc9a0SAchim Leubner Parameters:
324e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer refers to the current root
334e1bc9a0SAchim Leubner void **osMemHandle (IN_OUT) Pointer To OS Mem handle to fill in
344e1bc9a0SAchim Leubner void **agVirtAddr (IN_OUT) Pointer to allocated memory address
354e1bc9a0SAchim Leubner U32 *agPhysUpper32 (IN_OUT) Pointer to Up 32 bit mem phys addr.
364e1bc9a0SAchim Leubner U32 *agPhysLower32 (IN_OUT) Pointer to low 32 bit mem phys addr.
374e1bc9a0SAchim Leubner U32 alignment (IN) Alignment requirement
384e1bc9a0SAchim Leubner U32 allocLength (IN) Required memory length
394e1bc9a0SAchim Leubner agBOOLEAN isChacheable (IN) Required memory type
404e1bc9a0SAchim Leubner Return:
414e1bc9a0SAchim Leubner tiSuccess - success
424e1bc9a0SAchim Leubner tiMemoryTooLarge - requested memory size too large
434e1bc9a0SAchim Leubner tiMemoryNotAvail - no dma memory available
444e1bc9a0SAchim Leubner Note:
454e1bc9a0SAchim Leubner for sata use.
464e1bc9a0SAchim Leubner where a cacheable allocation inherently may be swapped, the values
474e1bc9a0SAchim Leubner agPhysUpper32 and agPhysLower32 are understood to mean nothing when the
484e1bc9a0SAchim Leubner value isCacheable is set to true. these phys values must not be used by
494e1bc9a0SAchim Leubner the caller.
504e1bc9a0SAchim Leubner ******************************************************************************/
ostiAllocMemory(tiRoot_t * ptiRoot,void ** osMemHandle,void ** agVirtAddr,U32 * agPhysUpper32,U32 * agPhysLower32,U32 alignment,U32 allocLength,agBOOLEAN isCacheable)514e1bc9a0SAchim Leubner osGLOBAL U32 ostiAllocMemory( tiRoot_t *ptiRoot,
524e1bc9a0SAchim Leubner void **osMemHandle,
534e1bc9a0SAchim Leubner void **agVirtAddr,
544e1bc9a0SAchim Leubner U32 *agPhysUpper32,
554e1bc9a0SAchim Leubner U32 *agPhysLower32,
564e1bc9a0SAchim Leubner U32 alignment,
574e1bc9a0SAchim Leubner U32 allocLength,
584e1bc9a0SAchim Leubner agBOOLEAN isCacheable )
594e1bc9a0SAchim Leubner {
604e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo = TIROOT_TO_CARDINFO( ptiRoot );
614e1bc9a0SAchim Leubner ag_dma_addr_t *pMem;
624e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
634e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
644e1bc9a0SAchim Leubner
654e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiAllocMemory: debug, cache? %d size %d alloc algn %d ### \n",
664e1bc9a0SAchim Leubner isCacheable, allocLength, alignment );
674e1bc9a0SAchim Leubner
684e1bc9a0SAchim Leubner if( pCardInfo->topOfFreeDynamicMem == 0 ) {
694e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiAllocMemory: No space left, increase "
704e1bc9a0SAchim Leubner "AGTIAPI_DYNAMIC_MAX! ERROR\n" );
714e1bc9a0SAchim Leubner return tiMemoryNotAvail;
724e1bc9a0SAchim Leubner }
734e1bc9a0SAchim Leubner
744e1bc9a0SAchim Leubner pMem = pCardInfo->freeDynamicMem[pCardInfo->topOfFreeDynamicMem - 1];
754e1bc9a0SAchim Leubner
764e1bc9a0SAchim Leubner // where this memory has bee preallocated, be sure requirements do not
774e1bc9a0SAchim Leubner // exceed the limits of resources available
784e1bc9a0SAchim Leubner if( allocLength > 4096 ) {
794e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiAllocMemory: no-cache size 0x%x alloc NOT AVAILABLE\n",
804e1bc9a0SAchim Leubner allocLength );
814e1bc9a0SAchim Leubner return tiMemoryNotAvail;
824e1bc9a0SAchim Leubner }
834e1bc9a0SAchim Leubner if( alignment > 32 ) {
844e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiAllocMemory: no-cache alignment 0x%x NOT AVAILABLE\n",
854e1bc9a0SAchim Leubner alignment );
864e1bc9a0SAchim Leubner return tiMemoryNotAvail;
874e1bc9a0SAchim Leubner }
884e1bc9a0SAchim Leubner
894e1bc9a0SAchim Leubner pMem->dmaPhysAddr = pMem->nocache_busaddr;
904e1bc9a0SAchim Leubner pMem->dmaVirtAddr = pMem->nocache_mem;
914e1bc9a0SAchim Leubner pMem->memSize = allocLength;
924e1bc9a0SAchim Leubner *agVirtAddr = pMem->dmaVirtAddr;
934e1bc9a0SAchim Leubner
944e1bc9a0SAchim Leubner *agPhysUpper32 = HIGH_32_BITS( pMem->dmaPhysAddr );
954e1bc9a0SAchim Leubner *agPhysLower32 = LOW_32_BITS( pMem->dmaPhysAddr );
964e1bc9a0SAchim Leubner
974e1bc9a0SAchim Leubner mtx_lock(&pCard->memLock);
984e1bc9a0SAchim Leubner pCardInfo->topOfFreeDynamicMem--;
994e1bc9a0SAchim Leubner *osMemHandle = (void *)pMem; // virtAddr;
1004e1bc9a0SAchim Leubner mtx_unlock(&pCard->memLock);
1014e1bc9a0SAchim Leubner
1024e1bc9a0SAchim Leubner return tiSuccess;
1034e1bc9a0SAchim Leubner }
1044e1bc9a0SAchim Leubner
1054e1bc9a0SAchim Leubner /******************************************************************************
1064e1bc9a0SAchim Leubner ostiIOCTLWaitForSignal()
1074e1bc9a0SAchim Leubner Purpose:
1084e1bc9a0SAchim Leubner Function to wait semaphore during ioctl
1094e1bc9a0SAchim Leubner Parameters:
1104e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to the current HBA
1114e1bc9a0SAchim Leubner void **agParam1 (IN_OUT) Pointer to context to be passed
1124e1bc9a0SAchim Leubner void **agParam2 (IN_OUT) Pointer to context to be passed
1134e1bc9a0SAchim Leubner void **agParam (IN_OUT) Pointer to context to be passed
1144e1bc9a0SAchim Leubner Return:
1154e1bc9a0SAchim Leubner Note:
1164e1bc9a0SAchim Leubner ******************************************************************************/
1174e1bc9a0SAchim Leubner osGLOBAL void
ostiIOCTLWaitForSignal(tiRoot_t * ptiRoot,void * agParam1,void * agParam2,void * agParam3)1184e1bc9a0SAchim Leubner ostiIOCTLWaitForSignal(tiRoot_t *ptiRoot,
1194e1bc9a0SAchim Leubner void *agParam1,
1204e1bc9a0SAchim Leubner void *agParam2,
1214e1bc9a0SAchim Leubner void *agParam3)
1224e1bc9a0SAchim Leubner {
1234e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
1244e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
1254e1bc9a0SAchim Leubner
1264e1bc9a0SAchim Leubner pCard->down_count++;
1274e1bc9a0SAchim Leubner sema_wait (pCard->pIoctlSem);
1284e1bc9a0SAchim Leubner }
1294e1bc9a0SAchim Leubner
1304e1bc9a0SAchim Leubner /* Below function has to be changed to use wait for completion */
1314e1bc9a0SAchim Leubner osGLOBAL void
ostiIOCTLWaitForComplete(tiRoot_t * ptiRoot,void * agParam1,void * agParam2,void * agParam3)1324e1bc9a0SAchim Leubner ostiIOCTLWaitForComplete(tiRoot_t *ptiRoot,
1334e1bc9a0SAchim Leubner void *agParam1,
1344e1bc9a0SAchim Leubner void *agParam2,
1354e1bc9a0SAchim Leubner void *agParam3)
1364e1bc9a0SAchim Leubner {
1374e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
1384e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
1394e1bc9a0SAchim Leubner
1404e1bc9a0SAchim Leubner pCard->down_count++;
1414e1bc9a0SAchim Leubner sema_wait (pCard->pIoctlSem);
1424e1bc9a0SAchim Leubner }
1434e1bc9a0SAchim Leubner
1444e1bc9a0SAchim Leubner
1454e1bc9a0SAchim Leubner /******************************************************************************
1464e1bc9a0SAchim Leubner ostiChipConfigReadBit32()
1474e1bc9a0SAchim Leubner Purpose:
1484e1bc9a0SAchim Leubner Read 32-bit value from PCI configuration register
1494e1bc9a0SAchim Leubner Parameters:
1504e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
1514e1bc9a0SAchim Leubner U32 chipConfigOffset (IN) Offset to PCI configuration register
1524e1bc9a0SAchim Leubner Return:
1534e1bc9a0SAchim Leubner 32 bit data
1544e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipConfigReadBit32(tiRoot_t * ptiRoot,U32 chipConfigOffset)1554e1bc9a0SAchim Leubner U32 ostiChipConfigReadBit32( tiRoot_t *ptiRoot, U32 chipConfigOffset )
1564e1bc9a0SAchim Leubner {
1574e1bc9a0SAchim Leubner device_t lDev = TIROOT_TO_PCIDEV(ptiRoot);
1584e1bc9a0SAchim Leubner u_int32_t lData = 0;
1594e1bc9a0SAchim Leubner
1604e1bc9a0SAchim Leubner lData = pci_read_config( lDev, chipConfigOffset, 4 );
1614e1bc9a0SAchim Leubner
1624e1bc9a0SAchim Leubner return (U32)lData;
1634e1bc9a0SAchim Leubner }
1644e1bc9a0SAchim Leubner
1654e1bc9a0SAchim Leubner
1664e1bc9a0SAchim Leubner /******************************************************************************
1674e1bc9a0SAchim Leubner ostiChipConfigWriteBit32()
1684e1bc9a0SAchim Leubner Purpose:
1694e1bc9a0SAchim Leubner Write 32-bit value to PCI configuration register
1704e1bc9a0SAchim Leubner Parameters:
1714e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
1724e1bc9a0SAchim Leubner U32 chipConfigOffset (IN) Offset to PCI configuration register
1734e1bc9a0SAchim Leubner U32 chipConfigValue (IN) Value to be written
1744e1bc9a0SAchim Leubner Return: none
1754e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipConfigWriteBit32(tiRoot_t * ptiRoot,U32 chipConfigOffset,U32 chipConfigValue)1764e1bc9a0SAchim Leubner void ostiChipConfigWriteBit32( tiRoot_t *ptiRoot,
1774e1bc9a0SAchim Leubner U32 chipConfigOffset,
1784e1bc9a0SAchim Leubner U32 chipConfigValue )
1794e1bc9a0SAchim Leubner {
1804e1bc9a0SAchim Leubner device_t lDev = TIROOT_TO_PCIDEV(ptiRoot);
1814e1bc9a0SAchim Leubner pci_write_config( lDev, chipConfigOffset, chipConfigValue, 4 );
1824e1bc9a0SAchim Leubner }
1834e1bc9a0SAchim Leubner
1844e1bc9a0SAchim Leubner /******************************************************************************
1854e1bc9a0SAchim Leubner ostiChipReadBit32()
1864e1bc9a0SAchim Leubner Purpose:
1874e1bc9a0SAchim Leubner Read 32-bit value from PCI address register
1884e1bc9a0SAchim Leubner Parameters:
1894e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
1904e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
1914e1bc9a0SAchim Leubner Return:
1924e1bc9a0SAchim Leubner 32 bit data
1934e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipReadBit32(tiRoot_t * ptiRoot,U32 chipOffset)1944e1bc9a0SAchim Leubner U32 ostiChipReadBit32(tiRoot_t *ptiRoot, U32 chipOffset)
1954e1bc9a0SAchim Leubner {
1964e1bc9a0SAchim Leubner U32 data;
1974e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
1984e1bc9a0SAchim Leubner
1994e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2004e1bc9a0SAchim Leubner data = *(U32 *)(pCardInfo->pciMemVirtAddr + chipOffset);
2014e1bc9a0SAchim Leubner return data;
2024e1bc9a0SAchim Leubner }
2034e1bc9a0SAchim Leubner
2044e1bc9a0SAchim Leubner /******************************************************************************
2054e1bc9a0SAchim Leubner ostiChipWriteBit32()
2064e1bc9a0SAchim Leubner Purpose:
2074e1bc9a0SAchim Leubner Write 32-bit value to PCI address register
2084e1bc9a0SAchim Leubner Parameters:
2094e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
2104e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
2114e1bc9a0SAchim Leubner U32 chipValue (IN) Value to be written
2124e1bc9a0SAchim Leubner Return: none
2134e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipWriteBit32(tiRoot_t * ptiRoot,U32 chipOffset,U32 chipValue)2144e1bc9a0SAchim Leubner void ostiChipWriteBit32( tiRoot_t *ptiRoot, U32 chipOffset, U32 chipValue )
2154e1bc9a0SAchim Leubner {
2164e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
2174e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2184e1bc9a0SAchim Leubner *(U32 *)(pCardInfo->pciMemVirtAddr + chipOffset) = chipValue;
2194e1bc9a0SAchim Leubner }
2204e1bc9a0SAchim Leubner
2214e1bc9a0SAchim Leubner /******************************************************************************
2224e1bc9a0SAchim Leubner ostiChipReadBit32Ext()
2234e1bc9a0SAchim Leubner Purpose:
2244e1bc9a0SAchim Leubner Read 32-bit value from PCI address register
2254e1bc9a0SAchim Leubner Parameters:
2264e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
2274e1bc9a0SAchim Leubner busBaseNumber PCI BAR number
2284e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
2294e1bc9a0SAchim Leubner Return:
2304e1bc9a0SAchim Leubner 32 bit data
2314e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipReadBit32Ext(tiRoot_t * ptiRoot,U32 busBaseNumber,U32 chipOffset)2324e1bc9a0SAchim Leubner U32 ostiChipReadBit32Ext( tiRoot_t *ptiRoot,
2334e1bc9a0SAchim Leubner U32 busBaseNumber,
2344e1bc9a0SAchim Leubner U32 chipOffset )
2354e1bc9a0SAchim Leubner {
2364e1bc9a0SAchim Leubner U32 data;
2374e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
2384e1bc9a0SAchim Leubner
2394e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2404e1bc9a0SAchim Leubner data = *(U32 *)((pCardInfo->pciMemVirtAddrSpc[busBaseNumber]) + chipOffset );
2414e1bc9a0SAchim Leubner return data;
2424e1bc9a0SAchim Leubner }
2434e1bc9a0SAchim Leubner
2444e1bc9a0SAchim Leubner /******************************************************************************
2454e1bc9a0SAchim Leubner ostiChipWriteBit32Ext()
2464e1bc9a0SAchim Leubner Purpose:
2474e1bc9a0SAchim Leubner Write 32-bit value to PCI address register
2484e1bc9a0SAchim Leubner Parameters:
2494e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
2504e1bc9a0SAchim Leubner busBaseNumber PCI BAR number
2514e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
2524e1bc9a0SAchim Leubner U32 chipValue (IN) Value to be written
2534e1bc9a0SAchim Leubner Return: none
2544e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipWriteBit32Ext(tiRoot_t * ptiRoot,U32 busBaseNumber,U32 chipOffset,U32 aData)2554e1bc9a0SAchim Leubner void ostiChipWriteBit32Ext( tiRoot_t *ptiRoot,
2564e1bc9a0SAchim Leubner U32 busBaseNumber,
2574e1bc9a0SAchim Leubner U32 chipOffset,
2584e1bc9a0SAchim Leubner U32 aData )
2594e1bc9a0SAchim Leubner {
2604e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
2614e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2624e1bc9a0SAchim Leubner *(U32 *)((pCardInfo->pciMemVirtAddrSpc[busBaseNumber]) + chipOffset ) = aData;
2634e1bc9a0SAchim Leubner }
2644e1bc9a0SAchim Leubner
2654e1bc9a0SAchim Leubner /******************************************************************************
2664e1bc9a0SAchim Leubner ostiChipReadBit8()
2674e1bc9a0SAchim Leubner Purpose:
2684e1bc9a0SAchim Leubner Read 8-bit value from PCI address register
2694e1bc9a0SAchim Leubner Parameters:
2704e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
2714e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
2724e1bc9a0SAchim Leubner Return:
2734e1bc9a0SAchim Leubner 8 bit data
2744e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipReadBit8(tiRoot_t * ptiRoot,U32 chipOffset)2754e1bc9a0SAchim Leubner U08 ostiChipReadBit8( tiRoot_t *ptiRoot, U32 chipOffset )
2764e1bc9a0SAchim Leubner {
2774e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
2784e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2794e1bc9a0SAchim Leubner return *(U08 *)( pCardInfo->pciMemVirtAddr + chipOffset );
2804e1bc9a0SAchim Leubner }
2814e1bc9a0SAchim Leubner
2824e1bc9a0SAchim Leubner /******************************************************************************
2834e1bc9a0SAchim Leubner ostiChipWriteBit8()
2844e1bc9a0SAchim Leubner Purpose:
2854e1bc9a0SAchim Leubner Write 8-bit value to PCI address register
2864e1bc9a0SAchim Leubner Parameters:
2874e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to tiRoot structure
2884e1bc9a0SAchim Leubner U32 chipOffset (IN) Offset to PCI configuration register
2894e1bc9a0SAchim Leubner U8 chipValue (IN) Value to be written
2904e1bc9a0SAchim Leubner Return: none
2914e1bc9a0SAchim Leubner ******************************************************************************/
ostiChipWriteBit8(tiRoot_t * ptiRoot,U32 chipOffset,U08 chipValue)2924e1bc9a0SAchim Leubner void ostiChipWriteBit8( tiRoot_t *ptiRoot, U32 chipOffset, U08 chipValue )
2934e1bc9a0SAchim Leubner {
2944e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo;
2954e1bc9a0SAchim Leubner pCardInfo = TIROOT_TO_CARDINFO(ptiRoot);
2964e1bc9a0SAchim Leubner *(U08 *)( pCardInfo->pciMemVirtAddr + chipOffset ) = chipValue;
2974e1bc9a0SAchim Leubner }
2984e1bc9a0SAchim Leubner
2994e1bc9a0SAchim Leubner
ostiFlashReadBlock(tiRoot_t * ptiRoot,U32 offset,void * bufPtr,U32 nbytes)3004e1bc9a0SAchim Leubner void ostiFlashReadBlock(tiRoot_t *ptiRoot,
3014e1bc9a0SAchim Leubner U32 offset,
3024e1bc9a0SAchim Leubner void *bufPtr,
3034e1bc9a0SAchim Leubner U32 nbytes)
3044e1bc9a0SAchim Leubner {
3054e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiFlashReadBlock: No support for iscsi device\n" );
3064e1bc9a0SAchim Leubner }
3074e1bc9a0SAchim Leubner
3084e1bc9a0SAchim Leubner /******************************************************************************
3094e1bc9a0SAchim Leubner ostiFreeMemory()
3104e1bc9a0SAchim Leubner Purpose:
3114e1bc9a0SAchim Leubner TD layer calls to free allocated dma memory
3124e1bc9a0SAchim Leubner Parameters:
3134e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer refers to the current root
3144e1bc9a0SAchim Leubner void *osMemHandle (IN) Pointer to OS mem handle to be released
3154e1bc9a0SAchim Leubner u32 allocLength (IN) Aloocated memory length in byte
3164e1bc9a0SAchim Leubner Return:
3174e1bc9a0SAchim Leubner tiSuccess - success
3184e1bc9a0SAchim Leubner tiInvalidHandle - handle is invalid
3194e1bc9a0SAchim Leubner ******************************************************************************/
ostiFreeMemory(tiRoot_t * ptiRoot,void * osMemHandle,U32 allocLength)3204e1bc9a0SAchim Leubner osGLOBAL U32 ostiFreeMemory( tiRoot_t *ptiRoot,
3214e1bc9a0SAchim Leubner void *osMemHandle,
3224e1bc9a0SAchim Leubner U32 allocLength )
3234e1bc9a0SAchim Leubner {
3244e1bc9a0SAchim Leubner ag_card_info_t *pCardInfo = TIROOT_TO_CARDINFO( ptiRoot );
3254e1bc9a0SAchim Leubner ag_dma_addr_t *pMem = (ag_dma_addr_t*)osMemHandle;
3264e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
3274e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
3284e1bc9a0SAchim Leubner
3294e1bc9a0SAchim Leubner if( !osMemHandle ) {
3304e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiFreeMemory: NULL handle ERROR\n" );
3314e1bc9a0SAchim Leubner return tiInvalidHandle;
3324e1bc9a0SAchim Leubner }
3334e1bc9a0SAchim Leubner
334*531a12d9SJose Luis Duran AGTIAPI_PRINTK( "ostiFreeMemory: debug message %p ### \n",
3354e1bc9a0SAchim Leubner (void*)pMem->dmaPhysAddr );
3364e1bc9a0SAchim Leubner
3374e1bc9a0SAchim Leubner // mark as unused
3384e1bc9a0SAchim Leubner pMem->memSize = 0;
3394e1bc9a0SAchim Leubner pMem->dmaVirtAddr = NULL;
3404e1bc9a0SAchim Leubner pMem->dmaPhysAddr = 0;
3414e1bc9a0SAchim Leubner
3424e1bc9a0SAchim Leubner if (pCardInfo->topOfFreeDynamicMem == AGTIAPI_DYNAMIC_MAX) {
3434e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "ostiFreeMemory: too many free slots ERROR\n" );
3444e1bc9a0SAchim Leubner return tiInvalidHandle;
3454e1bc9a0SAchim Leubner }
3464e1bc9a0SAchim Leubner
3474e1bc9a0SAchim Leubner mtx_lock(&pCard->memLock);
3484e1bc9a0SAchim Leubner pCardInfo->freeDynamicMem[pCardInfo->topOfFreeDynamicMem++] = pMem;
3494e1bc9a0SAchim Leubner mtx_unlock(&pCard->memLock);
3504e1bc9a0SAchim Leubner
3514e1bc9a0SAchim Leubner return tiSuccess;
3524e1bc9a0SAchim Leubner }
3534e1bc9a0SAchim Leubner
3544e1bc9a0SAchim Leubner
3554e1bc9a0SAchim Leubner /******************************************************************************
3564e1bc9a0SAchim Leubner ostiMakeParamString()
3574e1bc9a0SAchim Leubner Purpose:
3584e1bc9a0SAchim Leubner Utility function to simplify flow in ostiGetTransportParam(). Produces
3594e1bc9a0SAchim Leubner a string handle constructed from ostiGetTransportParam() values:
3604e1bc9a0SAchim Leubner key, subkey1, subkey2, subkey3, subkey4, subkey5, and valueName.
3614e1bc9a0SAchim Leubner Parameters:
3624e1bc9a0SAchim Leubner S08 *aKey (IN) Pointer to 1st level parameter string
3634e1bc9a0SAchim Leubner S08 *aSubkey1 (IN) Pointer to 2nd level parameter string
3644e1bc9a0SAchim Leubner S08 *aSubkey2 (IN) Pointer to 3rd level parameter string
3654e1bc9a0SAchim Leubner S08 *aSubkey3 (IN) Pointer to 4th level parameter string
3664e1bc9a0SAchim Leubner S08 *aSubkey4 (IN) Pointer to 5th level parameter string
3674e1bc9a0SAchim Leubner S08 *aSubkey5 (IN) Pointer to 6th level parameter string
3684e1bc9a0SAchim Leubner S08 *aValueName (IN) Pointer to name string of the value under keys
3694e1bc9a0SAchim Leubner S08 *aFullKey (OUT) Pointer to returned key-value-handle buffer
3704e1bc9a0SAchim Leubner U32 *apLenFullKey (OUT) String length in the key-value-handle buffer
3714e1bc9a0SAchim Leubner Return:
3724e1bc9a0SAchim Leubner tiSuccess - Success
3734e1bc9a0SAchim Leubner tiError - Failed
3744e1bc9a0SAchim Leubner Note:
3754e1bc9a0SAchim Leubner If all input strings are NULL, tiError will return with zero in apLenFullKey
3764e1bc9a0SAchim Leubner *****************************************************************************/
ostiMakeParamString(S08 * aKey,S08 * aSubkey1,S08 * aSubkey2,S08 * aSubkey3,S08 * aSubkey4,S08 * aSubkey5,S08 * aValueName,S08 * aFullKey,U32 * apLenFullKey)3774e1bc9a0SAchim Leubner inline static U32 ostiMakeParamString( S08 *aKey,
3784e1bc9a0SAchim Leubner S08 *aSubkey1,
3794e1bc9a0SAchim Leubner S08 *aSubkey2,
3804e1bc9a0SAchim Leubner S08 *aSubkey3,
3814e1bc9a0SAchim Leubner S08 *aSubkey4,
3824e1bc9a0SAchim Leubner S08 *aSubkey5,
3834e1bc9a0SAchim Leubner S08 *aValueName,
3844e1bc9a0SAchim Leubner S08 *aFullKey,
3854e1bc9a0SAchim Leubner U32 *apLenFullKey )
3864e1bc9a0SAchim Leubner {
3874e1bc9a0SAchim Leubner // preliminary sanity checks
3884e1bc9a0SAchim Leubner if( agNULL == aKey ) {
3894e1bc9a0SAchim Leubner *apLenFullKey = 0;
3904e1bc9a0SAchim Leubner printf( "ostiGetTransportParam called with no key. how odd.\n" );
3914e1bc9a0SAchim Leubner return tiError;
3924e1bc9a0SAchim Leubner }
3934e1bc9a0SAchim Leubner if( agNULL == aValueName ) {
3944e1bc9a0SAchim Leubner *apLenFullKey = 0;
3954e1bc9a0SAchim Leubner printf( "ostiGetTransportParam called with no value-name. how odd.\n" );
3964e1bc9a0SAchim Leubner return tiError;
3974e1bc9a0SAchim Leubner }
3984e1bc9a0SAchim Leubner
3994e1bc9a0SAchim Leubner strcpy( aFullKey, "DPMC_" ); // start at the beginning of the string
4004e1bc9a0SAchim Leubner strcat( aFullKey, aKey );
4014e1bc9a0SAchim Leubner
4024e1bc9a0SAchim Leubner int lIdx;
4034e1bc9a0SAchim Leubner S08 *lStrIdx = agNULL;
4044e1bc9a0SAchim Leubner for( lIdx = 1; lIdx <= 5; lIdx++ ) {
4054e1bc9a0SAchim Leubner if( 1 == lIdx) lStrIdx = aSubkey1;
4064e1bc9a0SAchim Leubner if( 2 == lIdx) lStrIdx = aSubkey2;
4074e1bc9a0SAchim Leubner if( 3 == lIdx) lStrIdx = aSubkey3;
4084e1bc9a0SAchim Leubner if( 4 == lIdx) lStrIdx = aSubkey4;
4094e1bc9a0SAchim Leubner if( 5 == lIdx) lStrIdx = aSubkey5;
4104e1bc9a0SAchim Leubner if( agNULL == lStrIdx ) break; // no more key information
4114e1bc9a0SAchim Leubner // append key information
4124e1bc9a0SAchim Leubner strcat( aFullKey, "_" );
4134e1bc9a0SAchim Leubner strcat( aFullKey, lStrIdx );
4144e1bc9a0SAchim Leubner }
4154e1bc9a0SAchim Leubner
4164e1bc9a0SAchim Leubner // only the value name is left to append
4174e1bc9a0SAchim Leubner strcat( aFullKey, "_" );
4184e1bc9a0SAchim Leubner strcat( aFullKey, aValueName );
4194e1bc9a0SAchim Leubner
4204e1bc9a0SAchim Leubner *apLenFullKey = strlen( aFullKey ); // 58 is max len seen; June 11, 2012
4214e1bc9a0SAchim Leubner // printf( "ostiMakeParamString: x%d out-str:%s\n", // debug print
4224e1bc9a0SAchim Leubner // *apLenFullKey, aFullKey );
4234e1bc9a0SAchim Leubner
4244e1bc9a0SAchim Leubner return tiSuccess; // ship it chief
4254e1bc9a0SAchim Leubner }
4264e1bc9a0SAchim Leubner
4274e1bc9a0SAchim Leubner
4284e1bc9a0SAchim Leubner /******************************************************************************
4294e1bc9a0SAchim Leubner ostiGetTransportParam()
4304e1bc9a0SAchim Leubner Purpose:
4314e1bc9a0SAchim Leubner Call back function from lower layer to get parameters.
4324e1bc9a0SAchim Leubner Parameters:
4334e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to driver root data structure
4344e1bc9a0SAchim Leubner S08 *key (IN) Pointer to 1st level parameter
4354e1bc9a0SAchim Leubner S08 *subkey1 (IN) Pointer to 2nd level parameter
4364e1bc9a0SAchim Leubner S08 *subkey2 (IN) Pointer to 3rd level parameter
4374e1bc9a0SAchim Leubner S08 *subkey3 (IN) Pointer to 4th level parameter
4384e1bc9a0SAchim Leubner S08 *subkey4 (IN) Pointer to 5th level parameter
4394e1bc9a0SAchim Leubner S08 *subkey5 (IN) Pointer to 6th level parameter
4404e1bc9a0SAchim Leubner S08 *valueName (IN) Pointer to name of the value under keys
4414e1bc9a0SAchim Leubner S08 *buffer (OUT) Pointer to returned information buffer
4424e1bc9a0SAchim Leubner U32 bufferLen (OUT) Buffer length
4434e1bc9a0SAchim Leubner U32 *lenReceived (OUT) String length in the buffer
4444e1bc9a0SAchim Leubner Return:
4454e1bc9a0SAchim Leubner tiSuccess - Success
4464e1bc9a0SAchim Leubner Other - Failed
4474e1bc9a0SAchim Leubner Note:
4484e1bc9a0SAchim Leubner The scheme of searching adjustable parameter tree is the following:
4494e1bc9a0SAchim Leubner key
4504e1bc9a0SAchim Leubner - subkey1
4514e1bc9a0SAchim Leubner - subkey2
4524e1bc9a0SAchim Leubner - subkey3
4534e1bc9a0SAchim Leubner - subkey4
4544e1bc9a0SAchim Leubner - subkey5
4554e1bc9a0SAchim Leubner - value
4564e1bc9a0SAchim Leubner If no match in any case, tiError will return with zero length.
4574e1bc9a0SAchim Leubner
4584e1bc9a0SAchim Leubner Where there is no indication of max key and subkey length,
4594e1bc9a0SAchim Leubner an upper limit guess of 200 is used.
4604e1bc9a0SAchim Leubner Perhaps a prudent revision would be to add some argument(s) to be
4614e1bc9a0SAchim Leubner able to manage/check these "key" string lengths.
4624e1bc9a0SAchim Leubner This function does no checking of buffer being a valid pointer.
4634e1bc9a0SAchim Leubner *****************************************************************************/
ostiGetTransportParam(tiRoot_t * ptiRoot,S08 * key,S08 * subkey1,S08 * subkey2,S08 * subkey3,S08 * subkey4,S08 * subkey5,S08 * valueName,S08 * buffer,U32 bufferLen,U32 * lenReceived)4644e1bc9a0SAchim Leubner U32 ostiGetTransportParam( tiRoot_t *ptiRoot,
4654e1bc9a0SAchim Leubner S08 *key,
4664e1bc9a0SAchim Leubner S08 *subkey1,
4674e1bc9a0SAchim Leubner S08 *subkey2,
4684e1bc9a0SAchim Leubner S08 *subkey3,
4694e1bc9a0SAchim Leubner S08 *subkey4,
4704e1bc9a0SAchim Leubner S08 *subkey5,
4714e1bc9a0SAchim Leubner S08 *valueName,
4724e1bc9a0SAchim Leubner S08 *buffer,
4734e1bc9a0SAchim Leubner U32 bufferLen,
4744e1bc9a0SAchim Leubner U32 *lenReceived )
4754e1bc9a0SAchim Leubner {
4764e1bc9a0SAchim Leubner S08 lFullKey[200];
4774e1bc9a0SAchim Leubner U32 lLenFullKey = 0;
4784e1bc9a0SAchim Leubner *lenReceived = 0;
4794e1bc9a0SAchim Leubner
4804e1bc9a0SAchim Leubner if( bufferLen > 1 )
4814e1bc9a0SAchim Leubner strcpy( buffer, "" );
4824e1bc9a0SAchim Leubner else {
4834e1bc9a0SAchim Leubner printf( "ostiGetTransportParam: buffer too small at only %d",
4844e1bc9a0SAchim Leubner bufferLen );
4854e1bc9a0SAchim Leubner return tiError; // not a reasonable buffer to work with
4864e1bc9a0SAchim Leubner }
4874e1bc9a0SAchim Leubner ostiMakeParamString( key, subkey1, subkey2, subkey3, subkey4, subkey5,
4884e1bc9a0SAchim Leubner valueName, lFullKey, &lLenFullKey );
4894e1bc9a0SAchim Leubner if( lLenFullKey ) // clean ParamString extraction
4904e1bc9a0SAchim Leubner TUNABLE_STR_FETCH( lFullKey, buffer, bufferLen );
4914e1bc9a0SAchim Leubner else
4924e1bc9a0SAchim Leubner return tiError; // not working out, bail now
4934e1bc9a0SAchim Leubner
4944e1bc9a0SAchim Leubner *lenReceived = strlen( buffer );
4954e1bc9a0SAchim Leubner
4964e1bc9a0SAchim Leubner //if( *lenReceived ) // handy debug print
4974e1bc9a0SAchim Leubner // printf( "ostiGetTransportParam: sz%d val:%s hdl-str:%s\n",
4984e1bc9a0SAchim Leubner // *lenReceived, buffer, lFullKey );
4994e1bc9a0SAchim Leubner
5004e1bc9a0SAchim Leubner return tiSuccess; // ship it chief
5014e1bc9a0SAchim Leubner }
5024e1bc9a0SAchim Leubner
5034e1bc9a0SAchim Leubner
5044e1bc9a0SAchim Leubner /******************************************************************************
5054e1bc9a0SAchim Leubner ostiIOCTLClearSignal()
5064e1bc9a0SAchim Leubner
5074e1bc9a0SAchim Leubner Purpose:
5084e1bc9a0SAchim Leubner Function to clear or reset semaphore during ioctl
5094e1bc9a0SAchim Leubner Parameters:
5104e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to the current HBA
5114e1bc9a0SAchim Leubner void **agParam1 (IN_OUT) Pointer to context to be passed
5124e1bc9a0SAchim Leubner void **agParam2 (IN_OUT) Pointer to context to be passed
5134e1bc9a0SAchim Leubner void **agParam (IN_OUT) Pointer to context to be passed
5144e1bc9a0SAchim Leubner Return:
5154e1bc9a0SAchim Leubner Note:
5164e1bc9a0SAchim Leubner TBD, need more work for card based semaphore. Also needs to
5174e1bc9a0SAchim Leubner consider the calling sequence.
5184e1bc9a0SAchim Leubner ******************************************************************************/
5194e1bc9a0SAchim Leubner osGLOBAL void
ostiIOCTLClearSignal(tiRoot_t * ptiRoot,void ** agParam1,void ** agParam2,void ** agParam3)5204e1bc9a0SAchim Leubner ostiIOCTLClearSignal(tiRoot_t *ptiRoot,
5214e1bc9a0SAchim Leubner void **agParam1,
5224e1bc9a0SAchim Leubner void **agParam2,
5234e1bc9a0SAchim Leubner void **agParam3)
5244e1bc9a0SAchim Leubner {
5254e1bc9a0SAchim Leubner }
5264e1bc9a0SAchim Leubner
5274e1bc9a0SAchim Leubner
5284e1bc9a0SAchim Leubner /******************************************************************************
5294e1bc9a0SAchim Leubner ostiIOCTLSetSignal() ### function currently stubbed out
5304e1bc9a0SAchim Leubner Purpose:
5314e1bc9a0SAchim Leubner Function to set semaphore during ioctl
5324e1bc9a0SAchim Leubner Parameters:
5334e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to the current HBA
5344e1bc9a0SAchim Leubner void **agParam1 (IN_OUT) Pointer to context to be passed
5354e1bc9a0SAchim Leubner void **agParam2 (IN_OUT) Pointer to context to be passed
5364e1bc9a0SAchim Leubner void **agParam (IN_OUT) Pointer to context to be passed
5374e1bc9a0SAchim Leubner Return:
5384e1bc9a0SAchim Leubner Note:
5394e1bc9a0SAchim Leubner ******************************************************************************/
5404e1bc9a0SAchim Leubner osGLOBAL void
ostiIOCTLSetSignal(tiRoot_t * ptiRoot,void * agParam1,void * agParam2,void * agParam3)5414e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot_t *ptiRoot,
5424e1bc9a0SAchim Leubner void *agParam1,
5434e1bc9a0SAchim Leubner void *agParam2,
5444e1bc9a0SAchim Leubner void *agParam3)
5454e1bc9a0SAchim Leubner {
5464e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
5474e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
5484e1bc9a0SAchim Leubner if (pCard->down_count != pCard->up_count)
5494e1bc9a0SAchim Leubner {
5504e1bc9a0SAchim Leubner pCard->up_count++;
5514e1bc9a0SAchim Leubner sema_post (pCard->pIoctlSem);
5524e1bc9a0SAchim Leubner }
5534e1bc9a0SAchim Leubner }
5544e1bc9a0SAchim Leubner
5554e1bc9a0SAchim Leubner osGLOBAL void
ostiIOCTLComplete(tiRoot_t * ptiRoot,void * agParam1,void * agParam2,void * agParam3)5564e1bc9a0SAchim Leubner ostiIOCTLComplete(tiRoot_t *ptiRoot,
5574e1bc9a0SAchim Leubner void *agParam1,
5584e1bc9a0SAchim Leubner void *agParam2,
5594e1bc9a0SAchim Leubner void *agParam3)
5604e1bc9a0SAchim Leubner {
5614e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
5624e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
5634e1bc9a0SAchim Leubner if (pCard->down_count != pCard->up_count)
5644e1bc9a0SAchim Leubner {
5654e1bc9a0SAchim Leubner pCard->up_count++;
5664e1bc9a0SAchim Leubner sema_post (pCard->pIoctlSem);
5674e1bc9a0SAchim Leubner }
5684e1bc9a0SAchim Leubner }
5694e1bc9a0SAchim Leubner
5704e1bc9a0SAchim Leubner /******************************************************************************
5714e1bc9a0SAchim Leubner ostiPortEvent()
5724e1bc9a0SAchim Leubner Purpose:
5734e1bc9a0SAchim Leubner Call back function to inform OS the events of port state change.
5744e1bc9a0SAchim Leubner Parameters:
5754e1bc9a0SAchim Leubner tiRoot_t *ptiRoot(IN) Pointer to driver root data structure
5764e1bc9a0SAchim Leubner tiPortEvent_t eventType (IN) Type of port event:
5774e1bc9a0SAchim Leubner tiPortPanic
5784e1bc9a0SAchim Leubner tiPortResetComplete
5794e1bc9a0SAchim Leubner tiPortNameServerDown
5804e1bc9a0SAchim Leubner tiPortLinkDown
5814e1bc9a0SAchim Leubner tiPortLinkUp
5824e1bc9a0SAchim Leubner tiPortStarted
5834e1bc9a0SAchim Leubner tiPortStopped
5844e1bc9a0SAchim Leubner tiPortShutdown
5854e1bc9a0SAchim Leubner tiPortInitComplete
5864e1bc9a0SAchim Leubner void *pParm(IN) Pointer to event specific structure
5874e1bc9a0SAchim Leubner Return:
5884e1bc9a0SAchim Leubner None
5894e1bc9a0SAchim Leubner ******************************************************************************/
5904e1bc9a0SAchim Leubner void
ostiPortEvent(tiRoot_t * ptiRoot,tiPortEvent_t eventType,U32 status,void * pParm)5914e1bc9a0SAchim Leubner ostiPortEvent(tiRoot_t *ptiRoot,
5924e1bc9a0SAchim Leubner tiPortEvent_t eventType,
5934e1bc9a0SAchim Leubner U32 status,
5944e1bc9a0SAchim Leubner void *pParm)
5954e1bc9a0SAchim Leubner {
5964e1bc9a0SAchim Leubner struct agtiapi_softc *pCard;
5974e1bc9a0SAchim Leubner ag_portal_data_t *pPortalData;
5984e1bc9a0SAchim Leubner
5994e1bc9a0SAchim Leubner AGTIAPI_PRINTK("ostiPortEvent: start eventType 0x%x\n", eventType);
6004e1bc9a0SAchim Leubner
6014e1bc9a0SAchim Leubner pCard = TIROOT_TO_CARD(ptiRoot);
6024e1bc9a0SAchim Leubner
6034e1bc9a0SAchim Leubner switch (eventType)
6044e1bc9a0SAchim Leubner {
6054e1bc9a0SAchim Leubner case tiPortStarted:
6064e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_CB_DONE;
6074e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6084e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) |= AGTIAPI_PORT_START;
6094e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortStarted - portal %p, status %x\n",
6104e1bc9a0SAchim Leubner pPortalData, PORTAL_STATUS(pPortalData));
6114e1bc9a0SAchim Leubner break;
6124e1bc9a0SAchim Leubner case tiPortLinkDown:
6134e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6144e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) &= ~AGTIAPI_PORT_LINK_UP;
6154e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortLinkDown - portal %p\n", pPortalData);
6164e1bc9a0SAchim Leubner break;
6174e1bc9a0SAchim Leubner case tiPortLinkUp:
6184e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6194e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) |= AGTIAPI_PORT_LINK_UP;
6204e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortLinkUp - portal %p\n", pPortalData);
6214e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
6224e1bc9a0SAchim Leubner #ifndef HOTPLUG_SUPPORT
6234e1bc9a0SAchim Leubner if (!(pCard->flags & AGTIAPI_INIT_TIME))
6244e1bc9a0SAchim Leubner #endif
6254e1bc9a0SAchim Leubner // agtiapi_StartIO(pCard);
6264e1bc9a0SAchim Leubner #endif
6274e1bc9a0SAchim Leubner break;
6284e1bc9a0SAchim Leubner case tiPortDiscoveryReady:
6294e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_CB_DONE;
6304e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6314e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) |= AGTIAPI_PORT_DISC_READY;
6324e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortDiscoveryReady - portal %p, status 0x%x\n",
6334e1bc9a0SAchim Leubner pPortalData, PORTAL_STATUS(pPortalData));
6344e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
6354e1bc9a0SAchim Leubner #ifndef HOTPLUG_SUPPORT
6364e1bc9a0SAchim Leubner if (!(pCard->flags & AGTIAPI_INIT_TIME))
6374e1bc9a0SAchim Leubner #endif
6384e1bc9a0SAchim Leubner tiINIDiscoverTargets(&pCard->tiRoot,
6394e1bc9a0SAchim Leubner &pPortalData->portalInfo.tiPortalContext,
6404e1bc9a0SAchim Leubner FORCE_PERSISTENT_ASSIGN_MASK);
6414e1bc9a0SAchim Leubner #endif
6424e1bc9a0SAchim Leubner break;
6434e1bc9a0SAchim Leubner case tiPortNameServerDown:
6444e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortNameSeverDown\n");
6454e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6464e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) &= ~AGTIAPI_NAME_SERVER_UP;
6474e1bc9a0SAchim Leubner break;
6484e1bc9a0SAchim Leubner case tiPortPanic:
6494e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortPanic\n");
6504e1bc9a0SAchim Leubner AGTIAPI_PRINTK( "## PortEvent\n" );
6514e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_PORT_PANIC;
6524e1bc9a0SAchim Leubner break;
6534e1bc9a0SAchim Leubner case tiPortResetComplete:
6544e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortResetComplete\n");
6554e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_CB_DONE;
6564e1bc9a0SAchim Leubner if (status == tiSuccess)
6574e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_RESET_SUCCESS;
6584e1bc9a0SAchim Leubner break;
6594e1bc9a0SAchim Leubner case tiPortShutdown:
6604e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortShutdown\n");
6614e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_CB_DONE;
6624e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_PORT_SHUTDOWN;
6634e1bc9a0SAchim Leubner break;
6644e1bc9a0SAchim Leubner case tiPortStopped:
6654e1bc9a0SAchim Leubner pCard->flags |= AGTIAPI_CB_DONE;
6664e1bc9a0SAchim Leubner pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(pParm);
6674e1bc9a0SAchim Leubner PORTAL_STATUS(pPortalData) |= AGTIAPI_PORT_STOPPED;
6684e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortStopped - portal %p\n", pPortalData);
6694e1bc9a0SAchim Leubner break;
6704e1bc9a0SAchim Leubner case tiEncryptOperation:
6714e1bc9a0SAchim Leubner break;
6724e1bc9a0SAchim Leubner case tiModePageOperation:
6734e1bc9a0SAchim Leubner break;
6744e1bc9a0SAchim Leubner default:
6754e1bc9a0SAchim Leubner AGTIAPI_PRINTK("PortEvent - %d (Unknown)\n", eventType);
6764e1bc9a0SAchim Leubner break;
6774e1bc9a0SAchim Leubner }
6784e1bc9a0SAchim Leubner return;
6794e1bc9a0SAchim Leubner }
6804e1bc9a0SAchim Leubner
6814e1bc9a0SAchim Leubner
6824e1bc9a0SAchim Leubner /******************************************************************************
6834e1bc9a0SAchim Leubner ostiStallThread()
6844e1bc9a0SAchim Leubner Purpose:
6854e1bc9a0SAchim Leubner Stall the thread (busy wait) for a number of microseconds.
6864e1bc9a0SAchim Leubner Parameters:
6874e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to the tiRoot data structure
6884e1bc9a0SAchim Leubner U32 microseconds (IN) Micro-seconds to be hold
6894e1bc9a0SAchim Leubner Returns: none
6904e1bc9a0SAchim Leubner ******************************************************************************/
ostiStallThread(tiRoot_t * ptiRoot,U32 microseconds)6914e1bc9a0SAchim Leubner void ostiStallThread( tiRoot_t *ptiRoot, U32 microseconds )
6924e1bc9a0SAchim Leubner {
6934e1bc9a0SAchim Leubner DELAY( microseconds );
6944e1bc9a0SAchim Leubner }
6954e1bc9a0SAchim Leubner
6964e1bc9a0SAchim Leubner
6974e1bc9a0SAchim Leubner /******************************************************************************
6984e1bc9a0SAchim Leubner ostiTimeStamp() ### stubbed out for now
6994e1bc9a0SAchim Leubner Purpose:
7004e1bc9a0SAchim Leubner Time stamp
7014e1bc9a0SAchim Leubner Parameters:
7024e1bc9a0SAchim Leubner tiRoot_t *ptiRoot (IN) Pointer to the tiRoot data structure
7034e1bc9a0SAchim Leubner Returns:
7044e1bc9a0SAchim Leubner Time stamp in milisecond
7054e1bc9a0SAchim Leubner ******************************************************************************/
7064e1bc9a0SAchim Leubner U32
ostiTimeStamp(tiRoot_t * ptiRoot)7074e1bc9a0SAchim Leubner ostiTimeStamp(tiRoot_t *ptiRoot)
7084e1bc9a0SAchim Leubner {
7094e1bc9a0SAchim Leubner return 0;
7104e1bc9a0SAchim Leubner }
7114e1bc9a0SAchim Leubner
7124e1bc9a0SAchim Leubner // meant as stubbed out 64 bit version.
ostiTimeStamp64(tiRoot_t * ptiRoot)7134e1bc9a0SAchim Leubner U64 ostiTimeStamp64( tiRoot_t *ptiRoot )
7144e1bc9a0SAchim Leubner {
7154e1bc9a0SAchim Leubner U64 retVal;
7164e1bc9a0SAchim Leubner retVal = ostiTimeStamp( ptiRoot );
7174e1bc9a0SAchim Leubner return retVal;
7184e1bc9a0SAchim Leubner }
7194e1bc9a0SAchim Leubner
7204e1bc9a0SAchim Leubner /******************************************************************************
7214e1bc9a0SAchim Leubner ostiCacheFlush() ### stubbed out for now
7224e1bc9a0SAchim Leubner ostiCacheInvalidate()
7234e1bc9a0SAchim Leubner ostiCachePreFlush()
7244e1bc9a0SAchim Leubner
7254e1bc9a0SAchim Leubner Purpose:
7264e1bc9a0SAchim Leubner Cache-coherency APIs
7274e1bc9a0SAchim Leubner Parameters:
7284e1bc9a0SAchim Leubner
7294e1bc9a0SAchim Leubner Returns:
7304e1bc9a0SAchim Leubner
7314e1bc9a0SAchim Leubner Note:
7324e1bc9a0SAchim Leubner These 3 functions are to support new cache coherency applications.
7334e1bc9a0SAchim Leubner Currently the APIs are implemented in FC for PPC platform. The
7344e1bc9a0SAchim Leubner define CACHED_DMA enable for dma_cache_sync function call. However
7354e1bc9a0SAchim Leubner this define is restricted for certain version of linux, such as
7364e1bc9a0SAchim Leubner Linux 2.6.x and above, and certain platform such as PPC.
7374e1bc9a0SAchim Leubner
7384e1bc9a0SAchim Leubner DO NOT define the CACHED_DMA if the cache coherency is not required
7394e1bc9a0SAchim Leubner or the environment does not match.
7404e1bc9a0SAchim Leubner ******************************************************************************/
ostiCacheFlush(tiRoot_t * ptiRoot,void * osMemHandle,void * virtPtr,bit32 length)7414e1bc9a0SAchim Leubner osGLOBAL void ostiCacheFlush(
7424e1bc9a0SAchim Leubner tiRoot_t *ptiRoot,
7434e1bc9a0SAchim Leubner void *osMemHandle,
7444e1bc9a0SAchim Leubner void *virtPtr,
7454e1bc9a0SAchim Leubner bit32 length
7464e1bc9a0SAchim Leubner )
7474e1bc9a0SAchim Leubner {
7484e1bc9a0SAchim Leubner }
7494e1bc9a0SAchim Leubner
ostiCacheInvalidate(tiRoot_t * ptiRoot,void * osMemHandle,void * virtPtr,bit32 length)7504e1bc9a0SAchim Leubner osGLOBAL void ostiCacheInvalidate(
7514e1bc9a0SAchim Leubner tiRoot_t *ptiRoot,
7524e1bc9a0SAchim Leubner void *osMemHandle,
7534e1bc9a0SAchim Leubner void *virtPtr,
7544e1bc9a0SAchim Leubner bit32 length
7554e1bc9a0SAchim Leubner )
7564e1bc9a0SAchim Leubner {
7574e1bc9a0SAchim Leubner }
7584e1bc9a0SAchim Leubner
ostiCachePreFlush(tiRoot_t * tiRoot,void * osMemHandle,void * virtPtr,bit32 length)7594e1bc9a0SAchim Leubner osGLOBAL void ostiCachePreFlush(
7604e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
7614e1bc9a0SAchim Leubner void *osMemHandle,
7624e1bc9a0SAchim Leubner void *virtPtr,
7634e1bc9a0SAchim Leubner bit32 length
7644e1bc9a0SAchim Leubner )
7654e1bc9a0SAchim Leubner {
7664e1bc9a0SAchim Leubner }
7674e1bc9a0SAchim Leubner
7684e1bc9a0SAchim Leubner
7694e1bc9a0SAchim Leubner /*
7704e1bc9a0SAchim Leubner added for SAS/SATA
7714e1bc9a0SAchim Leubner this is called by ossaInterrruptEnable
7724e1bc9a0SAchim Leubner */
ostiInterruptEnable(tiRoot_t * ptiRoot,bit32 channelNum)7734e1bc9a0SAchim Leubner GLOBAL void ostiInterruptEnable( tiRoot_t *ptiRoot, bit32 channelNum )
7744e1bc9a0SAchim Leubner {
7754e1bc9a0SAchim Leubner // yep, really nothing.
7764e1bc9a0SAchim Leubner }
7774e1bc9a0SAchim Leubner
7784e1bc9a0SAchim Leubner /*
7794e1bc9a0SAchim Leubner this is called by ossaInterrruptDisable
7804e1bc9a0SAchim Leubner */
ostiInterruptDisable(tiRoot_t * ptiRoot,bit32 channelNum)7814e1bc9a0SAchim Leubner GLOBAL void ostiInterruptDisable( tiRoot_t *ptiRoot, bit32 channelNum )
7824e1bc9a0SAchim Leubner {
7834e1bc9a0SAchim Leubner // yep, really nothing.
7844e1bc9a0SAchim Leubner }
7854e1bc9a0SAchim Leubner
786