The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/pms/freebsd/driver/ini/src/osapi.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*******************************************************************************
    2 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
    3 *
    4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 
    5 *that the following conditions are met: 
    6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
    7 *following disclaimer. 
    8 *2. Redistributions in binary form must reproduce the above copyright notice, 
    9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
   10 *with the distribution. 
   11 *
   12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
   13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
   14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
   16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
   17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
   18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
   19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
   20 *
   21 * $FreeBSD$
   22 *
   23 *******************************************************************************/
   24 /******************************************************************************
   25 PMC-Sierra TISA Initiator Device Driver for Linux 2.x.x.
   26 
   27 Module Name:  
   28   osapi.c
   29 Abstract:  
   30   Linux iSCSI/FC Initiator driver module itsdk required OS functions
   31 Environment:  
   32   Part of oslayer module, Kernel or loadable module  
   33 
   34 *******************************************************************************
   35 ostiInitiatorEvent()
   36 
   37 Purpose:
   38   TI layer call back to OSlayer to inform events 
   39 Parameters: 
   40   tiRoot_t *ptiRoot (IN)               Pointer to HBA data structure  
   41   tiDeviceHandle_t *ptiDevHandle (IN)  Pointer to device handle
   42   tiIntrEvenType_t evenType (IN)       Event type
   43   tiIntrEventStatus_t evetStatus (IN)  Event status
   44   void *parm (IN)                      pointer to even specific data
   45 Return:
   46 Note:    
   47   TBD, further event process required.
   48 ******************************************************************************/
   49 void ostiInitiatorEvent( tiRoot_t *ptiRoot,
   50                          tiPortalContext_t *ptiPortalContext,
   51                          tiDeviceHandle_t *ptiDevHandle,
   52                          tiIntrEventType_t eventType,
   53                          U32 eventStatus,
   54                          void *parm )
   55 {
   56   ag_portal_data_t *pPortalData;
   57   ag_portal_info_t *pPortalInfo;
   58   struct agtiapi_softc *pCard = TIROOT_TO_CARD( ptiRoot );
   59   ccb_t     *pccb;
   60   ccb_t     *pTMccb;
   61   ccb_t     *ccbIO;
   62 
   63 #ifdef  AGTIAPI_EVENT_LOG
   64   AGTIAPI_PRINTK("Initiator Event:\n");
   65   AGTIAPI_PRINTK("DevHandle %p, eventType 0x%x, eventStatus 0x%x\n", 
   66                  ptiDevHandle, eventType, eventStatus);
   67   AGTIAPI_PRINTK("Parameter: %s\n", (char *)parm);
   68 #endif
   69 
   70   AGTIAPI_PRINTK("ostiInitiatorEvent: eventType 0x%x eventStatus 0x%x\n", eventType, eventStatus);
   71 
   72   switch (eventType)
   73   {
   74   case tiIntrEventTypeCnxError:
   75        if (eventStatus == tiCnxUp)
   76        {
   77          AGTIAPI_PRINTK("tiIntrEventTypeCnxError - tiCnxUp!\n");
   78        } 
   79        if (eventStatus == tiCnxDown)
   80        {
   81          AGTIAPI_PRINTK("tiIntrEventTypeCnxError - tiCnxDown!\n");
   82        } 
   83        break;
   84   case tiIntrEventTypeDiscovery:
   85        pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(ptiPortalContext);
   86        pCard->flags |= AGTIAPI_CB_DONE;
   87        if (eventStatus == tiDiscOK)
   88        {
   89          AGTIAPI_PRINTK("eventStatus - tiDiscOK\n");
   90          AGTIAPI_PRINTK("ostiInitiatorEvent: pcard %d eventStatus - tiDiscOK\n", pCard->cardNo );
   91          PORTAL_STATUS(pPortalData) |= AGTIAPI_DISC_COMPLETE;
   92 #ifndef HOTPLUG_SUPPORT
   93          if (!(pCard->flags & AGTIAPI_INIT_TIME))
   94 #else
   95          if (TRUE)
   96 #endif
   97          {
   98 
   99            agtiapi_GetDevHandle(pCard, &pPortalData->portalInfo, 
  100                                 tiIntrEventTypeDiscovery, tiDiscOK);
  101            PORTAL_STATUS(pPortalData) |=
  102              (AGTIAPI_DISC_DONE | AGTIAPI_PORT_LINK_UP);
  103          }
  104          /* Trigger CheckIOTimeout */
  105          callout_reset(&pCard->IO_timer, 20*hz, agtiapi_CheckIOTimeout, pCard);
  106        }
  107        else if (eventStatus == tiDiscFailed)
  108        {
  109          AGTIAPI_PRINTK("eventStatus - tiDiscFailed\n");
  110          agtiapi_GetDevHandle(pCard, &pPortalData->portalInfo, 
  111                               tiIntrEventTypeDiscovery, tiDiscFailed);
  112          PORTAL_STATUS(pPortalData) &= ~AGTIAPI_DISC_DONE;
  113        }
  114        AGTIAPI_PRINTK("tiIntrEventTypeDiscovery - portal %p, status 0x%x\n",
  115          pPortalData,
  116          PORTAL_STATUS(pPortalData));
  117        break;
  118   case tiIntrEventTypeDeviceChange:
  119        AGTIAPI_PRINTK("tiIntrEventTypeDeviceChange - portal %p es %d\n",
  120                       ptiPortalContext->osData, eventStatus);
  121        pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(ptiPortalContext);
  122        pPortalInfo = &pPortalData->portalInfo;
  123 #ifndef HOTPLUG_SUPPORT
  124        if (!(pCard->flags & AGTIAPI_INIT_TIME))
  125 #else
  126        if (TRUE)
  127 #endif
  128        {
  129          agtiapi_GetDevHandle(pCard, pPortalInfo, tiIntrEventTypeDeviceChange, 
  130                               eventStatus);
  131 //         agtiapi_StartIO(pCard);
  132        }
  133        break;
  134   case tiIntrEventTypeTransportRecovery:
  135        AGTIAPI_PRINTK("tiIntrEventTypeTransportRecovery!\n");
  136        break;
  137   case tiIntrEventTypeTaskManagement:
  138        AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement!\n");
  139        pccb = (pccb_t)((tiIORequest_t *)parm)->osData;
  140        if (pccb->flags & TASK_TIMEOUT)
  141        {
  142          AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM timeout!\n");
  143          agtiapi_FreeTMCCB(pCard, pccb);
  144        }
  145        else
  146        {
  147          pccb->flags |= AGTIAPI_CB_DONE;
  148          if (eventStatus == tiTMOK)
  149          {
  150            pccb->flags |= TASK_SUCCESS;
  151            AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: pTMccb %p flag %x \n",
  152                           pccb, pccb->flags);
  153 
  154            /* Incase of TM_DEV_RESET, issue LocalAbort to abort pending IO */
  155            if (pccb->flags & DEV_RESET) 
  156            {
  157                AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: Target Reset\n");
  158                ccbIO = pccb->pccbIO;
  159                AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: IO to be aborted locally %p flag %x \n",
  160                           ccbIO, ccbIO->flags);
  161                if (ccbIO->startTime == 0) /* IO has been completed. No local abort */
  162                {
  163                }                          
  164                else if (tiINIIOAbort(&pCard->tiRoot, &ccbIO->tiIORequest) != tiSuccess)
  165                {
  166                    AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: Local Abort failed\n");
  167                    /* TODO: call Soft reset here */
  168                }
  169            }
  170           else if (eventStatus == tiTMFailed) 
  171           {
  172                ccbIO = pccb->pccbIO;               
  173                if (ccbIO->startTime == 0) /* IO has been completed. */
  174                {
  175                    AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM failed because IO has been completed! pTMccb %p flag %x \n",
  176                                    pccb, pccb->flags);
  177                }
  178                else
  179                {                                  
  180               AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM failed! pTMccb %p flag %x \n",
  181                              pccb, pccb->flags);
  182                /* TODO:*/
  183               /* if TM_ABORT_TASK, call TM_TARGET_RESET */
  184               /* if TM_TARGET_RESET, call Soft_Reset */
  185                }              
  186           }
  187           /* Free TM_DEV_RESET ccb */
  188           agtiapi_FreeTMCCB(pCard, pccb);
  189          }
  190         }
  191        break;
  192   case tiIntrEventTypeLocalAbort:
  193         AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort!\n");
  194         pccb = (pccb_t)((tiIORequest_t *)parm)->osData;
  195         pccb->flags |= AGTIAPI_CB_DONE;
  196         if (eventStatus == tiAbortOK)
  197         {
  198             AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: taskTag pccb %p flag %x \n",
  199                            pccb, pccb->flags);
  200             /* If this was LocalAbort for TM ABORT_TASK, issue TM_DEV_RESET */
  201             if (pccb->flags & TASK_MANAGEMENT)
  202             {
  203                 if ((pTMccb = agtiapi_GetCCB(pCard)) == NULL)
  204                 {
  205                     AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM resource unavailable!\n");
  206                     /* TODO: SoftReset here? */
  207                 }
  208                 pTMccb->pmcsc = pCard;
  209                 pTMccb->targetId = pccb->targetId;
  210                 pTMccb->devHandle = pccb->devHandle;
  211 
  212                 /* save pending io to issue local abort at Task mgmt CB */
  213                 pTMccb->pccbIO = pccb->pccbIO;
  214                 pTMccb->flags &= ~(TASK_SUCCESS | ACTIVE);
  215                 pTMccb->flags |= DEV_RESET;
  216                 if (tiINITaskManagement(&pCard->tiRoot, 
  217                                         pccb->devHandle,
  218                                         AG_TARGET_WARM_RESET,
  219                                         &pccb->tiSuperScsiRequest.scsiCmnd.lun,
  220                                         &pccb->tiIORequest, 
  221                                         &pTMccb->tiIORequest) 
  222                     == tiSuccess)
  223                 {
  224                     AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM_TARGET_RESET request success ccb %p, pTMccb %p\n", 
  225                                    pccb, pTMccb);
  226                     pTMccb->startTime = ticks;
  227                 }
  228                 else
  229                 {
  230                     AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM_TARGET_RESET request failed ccb %p, pTMccb %p\n", 
  231                                    pccb, pTMccb);
  232                     agtiapi_FreeTMCCB(pCard, pTMccb);
  233                     /* TODO: SoftReset here? */
  234                 }
  235                 /* Free ABORT_TASK TM ccb */
  236                 agtiapi_FreeTMCCB(pCard, pccb);
  237             }
  238         }
  239         else if (eventStatus == tiAbortFailed) 
  240         {
  241             /* TODO: */
  242             /* If TM_ABORT_TASK fails, issue TM_DEV_RESET */
  243             /* if TM_DEV_RESET fails, issue Soft_Reset */
  244             AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: Abort Failed pccb %p\n", pccb);
  245        }
  246        break;
  247   default:
  248        AGTIAPI_PRINTK("tiIntrEventType default!\n");
  249        break;
  250   }
  251 }
  252 
  253 
  254 /******************************************************************************
  255 ostiInitiatorIOCompleted()
  256 
  257 Purpose:
  258   IO request completion call back 
  259 Parameters:
  260   tiRoot_t *ptiRoot (IN)               Pointer to the HBA tiRoot
  261   tiIORequest_t *ptiIORequest (IN)     Pointer to the tiIORequest structure
  262   tiIOStatus_t IOStatus (IN)           I/O complated status  
  263   U32 statusDetail (IN)                Additional information on status
  264   tiSenseData_t *pSensedata (IN)       Sense data buffer pointer
  265   U32 context (IN)                     Interrupt dealing context
  266 Returns:
  267 Note:
  268 ******************************************************************************/
  269 void
  270 ostiInitiatorIOCompleted(tiRoot_t      *ptiRoot, 
  271                                tiIORequest_t *ptiIORequest,
  272                                tiIOStatus_t  IOStatus,
  273                                U32           statusDetail,
  274                                tiSenseData_t *pSenseData,
  275                                U32           context )
  276 {
  277   struct agtiapi_softc  *pCard;
  278   ccb_t      *pccb;
  279 
  280   pCard = TIROOT_TO_CARD(ptiRoot);
  281   pccb = (ccb_t *)ptiIORequest->osData;
  282 
  283   AGTIAPI_IO( "ostiInitiatorIOCompleted: start\n" );
  284 
  285   if (IOStatus == tiIODifError)
  286   {
  287     return;
  288   }
  289   OSTI_OUT_ENTER(ptiRoot);
  290 
  291   pccb->ccbStatus  = (U16)IOStatus;
  292   pccb->scsiStatus = statusDetail;
  293 
  294   if ((IOStatus == tiIOSuccess) && (statusDetail == SCSI_CHECK_CONDITION)) 
  295   {
  296     if (pSenseData == (tiSenseData_t *)agNULL) 
  297     {
  298       AGTIAPI_PRINTK( "ostiInitiatorIOCompleted: "
  299                       "check condition without sense data!\n" );
  300     }
  301     else 
  302     {
  303       union ccb *ccb = pccb->ccb;
  304       struct ccb_scsiio *csio = &ccb->csio;
  305       int sense_len = 0;
  306       if (pccb->senseLen > pSenseData->senseLen)
  307       {
  308         csio->sense_resid = pccb->senseLen - pSenseData->senseLen;
  309       }
  310       else
  311       {
  312         csio->sense_resid = 0;
  313       }
  314       sense_len = MIN( pSenseData->senseLen,
  315                        pccb->senseLen - csio->sense_resid );
  316       bzero(&csio->sense_data, sizeof(csio->sense_data));
  317       AGTIAPI_PRINTK("ostiInitiatorIOCompleted: check condition copying\n");
  318       memcpy( (void *)pccb->pSenseData,
  319               pSenseData->senseData,
  320               sense_len );
  321       agtiapi_hexdump( "ostiInitiatorIOCompleted check condition",
  322                        (bit8 *)&csio->sense_data, sense_len );
  323     }
  324   }
  325   if ((IOStatus == tiIOFailed) && (statusDetail == tiDetailAborted))
  326   {
  327     AGTIAPI_PRINTK("ostiInitiatorIOCompleted - aborted ccb %p, flag %x\n",
  328                    pccb, pccb->flags);
  329     /* indicate aborted IO completion */
  330     pccb->startTime = 0;     
  331     agtiapi_Done(pCard, pccb);
  332   }
  333   else
  334   {
  335 #ifdef AGTIAPI_SA
  336     /* 
  337      * SAS no data command does not trigger interrupt.
  338      * Command is completed in tdlayer and IO completion is called directly.
  339      * The completed IO therefore is not post processed.
  340      * Flag is raised and TDTimer will check and process IO for SAS.
  341      * This is a temporary solution. - Eddie, 07-17-2006
  342      */ 
  343     pCard->flags |= AGTIAPI_FLAG_UP;
  344 #endif
  345     pccb->flags  |= REQ_DONE;
  346     agtiapi_QueueCCB(pCard, &pCard->ccbDoneHead, &pCard->ccbDoneTail
  347                      AG_CARD_LOCAL_LOCK(&pCard->doneLock), pccb);
  348   }
  349   OSTI_OUT_LEAVE(ptiRoot);
  350   return;
  351 }
  352 #ifdef HIALEAH_ENCRYPTION
  353 osGLOBAL void
  354 ostidisableEncryption(tiRoot_t *ptiRoot)
  355 {
  356   struct agtiapi_softc  *pCard;
  357   pCard = TIROOT_TO_CARD(ptiRoot);
  358   pCard->encrypt=agFALSE;
  359 }
  360 #endif
  361 /* device Handle */
  362 osGLOBAL //FORCEINLINE
  363 tiDeviceHandle_t*
  364 ostiGetDevHandleFromSasAddr(
  365   tiRoot_t    *root,
  366   unsigned char *sas_addr
  367 )
  368 {
  369   int i;
  370   unsigned long x;
  371   
  372   ag_portal_data_t           *pPortal = NULL;
  373   tiDeviceHandle_t *devHandle = NULL;
  374   struct agtiapi_softc *pCard = TIROOT_TO_CARD(root);
  375   bit8 sas_addr_hi[4], sas_addr_lo[4];
  376 
  377 
  378   for(i=0; i<4; i++)
  379   {
  380         sas_addr_hi[i] = sas_addr[3-i];
  381   }
  382 
  383   for(i=0; i<4; i++)
  384   {
  385         sas_addr_lo[i] = sas_addr[7-i];
  386   }
  387   
  388     /* Retrieve the handles for each portal */
  389   for (x=0; x < pCard->portCount; x++)
  390   {
  391     pPortal = &pCard->pPortalData[x];
  392     devHandle = tiINIGetExpDeviceHandleBySasAddress(&pCard->tiRoot, 
  393                     &pPortal->portalInfo.tiPortalContext,
  394                                         *(bit32*)sas_addr_hi,
  395                                         *(bit32*)sas_addr_lo,
  396                                         (bit32)1024/*gMaxTargets*/);
  397         if(devHandle != NULL)
  398                 break;
  399   }
  400   return devHandle;
  401 
  402   return NULL;
  403 }
  404 /******************************************************************************
  405 ostiInitiatorSMPCompleted()
  406 
  407 Purpose:
  408   IO request completion call back 
  409 Parameters:
  410   tiRoot_t *ptiRoot (IN)               Pointer to the HBA tiRoot
  411   tiIORequest_t *ptiSMPRequest (IN)    Pointer to the SMP request structure
  412   tiIOStatus_t IOStatus (IN)           I/O complated status  
  413   U32 tiSMPInfoLen (IN)                Number of bytes of response frame len
  414   tiFrameHandle    (IN)                Handle that referes to response frame
  415   U32 context (IN)                     Interrupt dealing context
  416 Returns:
  417 Note:
  418 ******************************************************************************/
  419 void
  420 ostiInitiatorSMPCompleted(tiRoot_t      *ptiRoot, 
  421                           tiIORequest_t *ptiSMPRequest, 
  422                           tiSMPStatus_t  smpStatus, 
  423                           bit32          tiSMPInfoLen,
  424                           void           *tiFrameHandle,
  425                           bit32          context)
  426 {
  427   struct agtiapi_softc  *pCard;
  428   ccb_t      *pccb;
  429   pCard = TIROOT_TO_CARD(ptiRoot);
  430   pccb = (ccb_t *)ptiSMPRequest->osData;
  431   
  432   AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: start\n");
  433   
  434   OSTI_OUT_ENTER(ptiRoot);
  435   pccb->ccbStatus  = (U16)smpStatus;
  436   if(smpStatus != tiSMPSuccess)
  437   {
  438     AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: SMP Error\n");
  439   }
  440   else
  441   {
  442     union ccb *ccb = pccb->ccb;
  443     struct ccb_smpio *csmpio = &ccb->smpio;
  444     memcpy(csmpio->smp_response, tiFrameHandle, tiSMPInfoLen);
  445     csmpio->smp_response_len = tiSMPInfoLen;
  446     agtiapi_hexdump("ostiInitiatorSMPCompleted: Response Payload in CAM", (bit8 *)csmpio->smp_response, csmpio->smp_response_len);  
  447   }
  448   pccb->flags  |= REQ_DONE;
  449   agtiapi_QueueCCB(pCard, &pCard->smpDoneHead, &pCard->smpDoneTail
  450                      AG_CARD_LOCAL_LOCK(&pCard->doneSMPLock), pccb);
  451   AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: Done\n");
  452   OSTI_OUT_LEAVE(ptiRoot);
  453   
  454   return;  
  455 }
  456 
  457 #ifdef FAST_IO_TEST
  458 void
  459 osti_FastIOCb(tiRoot_t      *ptiRoot,
  460               void          *arg,
  461               tiIOStatus_t  IOStatus,
  462               U32           statusDetail)
  463 {
  464   ccb_t     *pccb = (ccb_t*)arg;
  465   ag_card_t *pCard;
  466 
  467   static int callNum = 0;
  468 
  469   callNum++;
  470 
  471   BUG_ON(!pccb);
  472 
  473   if ((callNum % CMDS_PER_IO_DUP) != 0)
  474   {
  475     goto err;
  476   }
  477 
  478   pccb->ccbStatus = IOStatus;
  479   pccb->scsiStatus = statusDetail;
  480 
  481   /* pccb->pSenseData is copied already */
  482 
  483   if (pccb->flags & AGTIAPI_ABORT)
  484   {
  485     AGTIAPI_PRINTK("agtiapi_SuperIOCb: aborted ccb %p, flag %x\n",
  486                    pccb, pccb->flags);
  487     pccb->startTime = 0;     /* indicate aborted IO completion */
  488     BUG_ON(1);
  489     goto err;
  490   }
  491   pCard = TIROOT_TO_CARD(ptiRoot);
  492   pccb->flags |= REQ_DONE;
  493   agtiapi_QueueCCB(pCard, &pCard->ccbDoneHead, &pCard->ccbDoneTail
  494                    AG_CARD_LOCAL_LOCK(&pCard->doneLock), pccb);
  495 err:
  496   return;
  497 } /* osti_FastIOCb */
  498 #endif
  499 
  500 
  501 /******************************************************************************
  502 ostiSingleThreadedEnter()
  503 
  504 Purpose:
  505   Critical region code excution protection.
  506 Parameters:
  507   tiRoot_t *ptiRoot (IN)  Pointer to tiRoot data structure
  508   U32 queueId (IN)     spinlock Id
  509 Returns:
  510 Note:
  511   Lock is held by oslayer.
  512 ******************************************************************************/
  513 void
  514 ostiSingleThreadedEnter(tiRoot_t *ptiRoot, U32 queueId)
  515 {
  516   struct agtiapi_softc *pCard = TIROOT_TO_CARD(ptiRoot);
  517   mtx_lock( &pCard->STLock[queueId] ); // review: need irq save? ##
  518 }
  519 
  520 
  521 /******************************************************************************
  522 ostiSingleThreadedLeave()
  523 
  524 Purpose:
  525   Restore multi-threading environment.
  526 Parameters:
  527   tiRoot_t *ptiRoot (IN)  Pointer to the tiRoot data structure
  528   U32 queueId (IN)     spinlock Id
  529 Returns:
  530 Note:
  531   Lock is held by oslayer.
  532 ******************************************************************************/
  533 void
  534 ostiSingleThreadedLeave(tiRoot_t *ptiRoot, U32 queueId)
  535 {
  536   struct agtiapi_softc *pCard = TIROOT_TO_CARD(ptiRoot);
  537   mtx_unlock( &pCard->STLock[queueId] ); // review: need irq restore? ##
  538 }
  539 
  540 
  541 osGLOBAL tiDeviceHandle_t*
  542 ostiMapToDevHandle(tiRoot_t  *root, 
  543                           bit8      pathId,
  544                           bit8      targetId,
  545                           bit8      LUN
  546                           )
  547 {
  548   tiDeviceHandle_t    *dev      = NULL;
  549   struct agtiapi_softc          *pCard;
  550   bit32               offset;
  551 
  552   pCard = TIROOT_TO_CARD(root);
  553   
  554   offset = pathId * pCard->tgtCount + targetId;
  555 
  556   if (offset > (pCard->tgtCount - 1) )
  557   {
  558     dev = NULL;
  559   }
  560   else
  561   {
  562     dev = pCard->pDevList[offset].pDevHandle;
  563   }
  564   
  565   return dev;
  566 }
  567 
  568 
  569 
  570 #ifdef PERF_COUNT
  571 
  572 #ifdef AGTIAPI_LOCAL_LOCK
  573 #define OSTI_SPIN_LOCK(lock)              spin_lock(lock)
  574 #define OSTI_SPIN_UNLOCK(lock)            spin_unlock(lock)
  575 #else
  576 #define OSTI_SPIN_LOCK(lock)
  577 #define OSTI_SPIN_UNLOCK(lock)
  578 #endif
  579 
  580 
  581 void
  582 ostiEnter(tiRoot_t *ptiRoot, U32 layer, int io)
  583 {
  584   ag_card_t *pCard = ((ag_card_info_t*)ptiRoot->osData)->pCard;
  585   int ini = ((pCard->flags & AGTIAPI_INIT_TIME) == AGTIAPI_INIT_TIME);
  586 
  587   BUG_ON((io != 0 && io != 1) || (layer != 0 && layer != 1 && layer != 2));
  588   if (!ini)
  589   {
  590     unsigned long long cycles = get_cycles();
  591 
  592     OSTI_SPIN_LOCK(&pCard->latLock);
  593     BUG_ON(pCard->callLevel[io] >= sizeof(pCard->layer[0]) /
  594                                      sizeof(pCard->layer[0][0]));
  595     if (pCard->callLevel[io] > 0)
  596     {
  597       unsigned int prev_layer = pCard->layer[io][pCard->callLevel[io] - 1];
  598 
  599       pCard->totalCycles[io][prev_layer] += cycles - 
  600                                              pCard->enterCycles[io][prev_layer];
  601     }
  602     pCard->enterCycles[io][layer] = cycles;
  603     pCard->layer[io][pCard->callLevel[io]] = layer;
  604     pCard->callLevel[io]++;
  605     OSTI_SPIN_UNLOCK(&pCard->latLock);
  606   }
  607 }
  608 
  609 void
  610 ostiLeave(tiRoot_t *ptiRoot, U32 layer, int io)
  611 {
  612   ag_card_t *pCard = ((ag_card_info_t*)ptiRoot->osData)->pCard;
  613   int ini = ((pCard->flags & AGTIAPI_INIT_TIME) == AGTIAPI_INIT_TIME);
  614 
  615   BUG_ON((io != 0 && io != 1) || (layer != 0 && layer != 1 && layer != 2));
  616   if (!ini)
  617   {
  618     unsigned long long cycles = get_cycles();
  619 
  620     OSTI_SPIN_LOCK(&pCard->latLock);
  621     pCard->callLevel[io]--;
  622 
  623     BUG_ON(pCard->callLevel[io] < 0);
  624     BUG_ON(pCard->layer[io][pCard->callLevel[io]] != layer);
  625 
  626     pCard->totalCycles[io][layer] += cycles - pCard->enterCycles[io][layer];
  627     if (pCard->callLevel[io] > 0)
  628       pCard->enterCycles[io][pCard->layer[io][pCard->callLevel[io] - 1]] = 
  629         cycles;
  630     OSTI_SPIN_UNLOCK(&pCard->latLock);
  631   }
  632 }
  633 #endif
  634 
  635 
  636 
  637 osGLOBAL FORCEINLINE bit8 
  638 ostiBitScanForward(
  639                   tiRoot_t   *root,
  640                   bit32      *Index,
  641                   bit32       Mask
  642                   )
  643 {
  644   return 1;
  645   
  646 }
  647 
  648 #ifdef REMOVED
  649 osGLOBAL sbit32 
  650 ostiAtomicIncrement(
  651                    tiRoot_t        *root,
  652                    sbit32 volatile *Addend
  653                    )
  654 {
  655   return 1;
  656 
  657 }
  658 
  659 osGLOBAL sbit32 
  660 ostiAtomicDecrement(
  661                    tiRoot_t        *root,
  662                    sbit32 volatile *Addend
  663                    )
  664 {
  665  
  666   return 1;
  667 
  668 }
  669 
  670 osGLOBAL sbit32 
  671 ostiAtomicBitClear(
  672                  tiRoot_t         *root,
  673                  sbit32 volatile  *Destination,
  674                  sbit32            Value
  675                  )
  676 {
  677  
  678   return 0;
  679  
  680 }
  681 
  682 osGLOBAL sbit32 
  683 ostiAtomicBitSet(
  684                 tiRoot_t         *root,
  685                 sbit32 volatile  *Destination,
  686                 sbit32            Value
  687                 )
  688 {
  689   return 0;
  690 
  691   /*
  692    set_bit(Value, (volatile unsigned long *)Destination);
  693    return 0;
  694   */
  695 }
  696 
  697 osGLOBAL sbit32 
  698 ostiAtomicExchange(
  699                    tiRoot_t        *root,
  700                    sbit32 volatile *Target,
  701                    sbit32           Value
  702                    )
  703 {
  704   return 0;
  705   
  706 }
  707 #endif
  708 
  709 osGLOBAL FORCEINLINE sbit32 
  710 ostiInterlockedExchange(
  711                        tiRoot_t        *root,
  712                        sbit32 volatile *Target,
  713                        sbit32           Value
  714                        )
  715 {
  716   return 0;
  717 }
  718 
  719 osGLOBAL FORCEINLINE sbit32 
  720 ostiInterlockedIncrement(
  721                        tiRoot_t        *root,
  722                        sbit32 volatile *Addend
  723                        )
  724 {
  725   return 0;
  726 }
  727 
  728 osGLOBAL FORCEINLINE sbit32 
  729 ostiInterlockedDecrement(
  730                          tiRoot_t         *root,
  731                          sbit32 volatile  *Addend
  732                          )
  733 {
  734   return 0;
  735 }
  736 
  737 osGLOBAL FORCEINLINE sbit32 
  738 ostiInterlockedAnd(
  739                    tiRoot_t         *root,
  740                    sbit32 volatile  *Destination,
  741                    sbit32            Value
  742                    )
  743 {
  744   return 0;
  745 }
  746 
  747 osGLOBAL FORCEINLINE sbit32 
  748 ostiInterlockedOr(
  749                    tiRoot_t         *root,
  750                    sbit32 volatile  *Destination,
  751                    sbit32            Value
  752                    )
  753 {
  754   return 0;
  755 }
  756 
  757 // this is just stub code to allow compile and use of the module ...
  758 // now that a call to this function has been added with windows specific
  759 // intentions.
  760 osGLOBAL bit32
  761 ostiSetDeviceQueueDepth( tiRoot_t *tiRoot,
  762                          tiIORequest_t  *tiIORequest,
  763                          bit32           QueueDepth
  764                          )
  765 {
  766   bit32 retVal = 0;
  767   ccb_t *pccb = (ccb_t *) tiIORequest->osData;
  768   tiDeviceHandle_t *tiDeviceHandle = pccb->devHandle;
  769   ag_device_t *pDevice = (ag_device_t *)tiDeviceHandle->osData;
  770   AGTIAPI_PRINTK( "ostiSetDeviceQueueDepth stub only: root%p, req%p, qdeep%d\n",
  771                   tiRoot, tiIORequest, QueueDepth );
  772   pDevice->qdepth = QueueDepth;
  773   return retVal;
  774 }
  775 
  776 
  777 // this is just stub code to allow compile and use of the module ...
  778 // now that a call to this function has been added with windows specific
  779 // intentions.
  780 osGLOBAL void
  781 ostiGetSenseKeyCount(tiRoot_t  *root,
  782                      bit32      fIsClear,
  783                      void      *SenseKeyCount,
  784                      bit32      length
  785                      )
  786 {
  787   AGTIAPI_PRINTK( "ostiGetSenseKeyCount stub only: rt%p, fcl%d, kyCt%p, ln%d\n",
  788                   root, fIsClear, SenseKeyCount, length );
  789 }
  790 
  791 osGLOBAL void
  792 ostiGetSCSIStatusCount(tiRoot_t  *root, 
  793                               bit32      fIsClear,
  794                               void      *ScsiStatusCount,
  795                               bit32      length
  796                               )
  797 {
  798  AGTIAPI_PRINTK( "ostiGetSCSIStatusCount: stub only rt%p, fcl%d, kyCt%p, ln%d\n",
  799                  root, fIsClear, ScsiStatusCount, length );
  800 
  801 }
  802 
  803 osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot )
  804 {
  805   ostiChipReadBit32Ext(tiRoot, 0, 0x5C);
  806 
  807 }
  808 
  809 osGLOBAL bit32 
  810 ostiNumOfLUNIOCTLreq(  tiRoot_t          *root,
  811                               void              *param1,
  812                               void              *param2,
  813                               void              **tiRequestBody,
  814                               tiIORequest_t     **tiIORequest
  815                               ) 
  816 {
  817   bit32         status = IOCTL_CALL_SUCCESS;
  818   pccb_t pccb;
  819   AGTIAPI_PRINTK("ostiNumOfLUNIOCTLreq: start\n");
  820   struct agtiapi_softc *pCard = TIROOT_TO_CARD(root);
  821     /* get a ccb */
  822   if ((pccb = agtiapi_GetCCB(pCard)) == NULL)
  823   {
  824     printf("ostiNumOfLUNIOCTLreq - GetCCB ERROR\n");
  825     status = IOCTL_CALL_FAIL;
  826     //BUG_ON(1);
  827   }
  828 
  829   *tiIORequest = (tiIORequest_t*)&pccb->tiIORequest;
  830   *tiRequestBody = &pccb->tdIOReqBody;
  831   AGTIAPI_PRINTK("ostiNumOfLUNIOCTLreq:end\n");
  832   return status;
  833 }
  834 

Cache object: 06e1ae44e7d3a9e0328f2f6238fac5ba


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.