xref: /freebsd-src/sys/dev/pms/freebsd/driver/common/lxosapi.c (revision 531a12d90d7dc547981a151e3e1fdd0c45e970c5)
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