/******************************************************************************* *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. * *Redistribution and use in source and binary forms, with or without modification, are permitted provided *that the following conditions are met: *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the *following disclaimer. *2. Redistributions in binary form must reproduce the above copyright notice, *this list of conditions and the following disclaimer in the documentation and/or other materials provided *with the distribution. * *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * $FreeBSD$ * *******************************************************************************/ /****************************************************************************** PMC-Sierra TISA Initiator Device Driver for Linux 2.x.x. Module Name: osapi.c Abstract: Linux iSCSI/FC Initiator driver module itsdk required OS functions Environment: Part of oslayer module, Kernel or loadable module ******************************************************************************* ostiInitiatorEvent() Purpose: TI layer call back to OSlayer to inform events Parameters: tiRoot_t *ptiRoot (IN) Pointer to HBA data structure tiDeviceHandle_t *ptiDevHandle (IN) Pointer to device handle tiIntrEvenType_t evenType (IN) Event type tiIntrEventStatus_t evetStatus (IN) Event status void *parm (IN) pointer to even specific data Return: Note: TBD, further event process required. ******************************************************************************/ void ostiInitiatorEvent( tiRoot_t *ptiRoot, tiPortalContext_t *ptiPortalContext, tiDeviceHandle_t *ptiDevHandle, tiIntrEventType_t eventType, U32 eventStatus, void *parm ) { ag_portal_data_t *pPortalData; ag_portal_info_t *pPortalInfo; struct agtiapi_softc *pCard = TIROOT_TO_CARD( ptiRoot ); ccb_t *pccb; ccb_t *pTMccb; ccb_t *ccbIO; #ifdef AGTIAPI_EVENT_LOG AGTIAPI_PRINTK("Initiator Event:\n"); AGTIAPI_PRINTK("DevHandle %p, eventType 0x%x, eventStatus 0x%x\n", ptiDevHandle, eventType, eventStatus); AGTIAPI_PRINTK("Parameter: %s\n", (char *)parm); #endif AGTIAPI_PRINTK("ostiInitiatorEvent: eventType 0x%x eventStatus 0x%x\n", eventType, eventStatus); switch (eventType) { case tiIntrEventTypeCnxError: if (eventStatus == tiCnxUp) { AGTIAPI_PRINTK("tiIntrEventTypeCnxError - tiCnxUp!\n"); } if (eventStatus == tiCnxDown) { AGTIAPI_PRINTK("tiIntrEventTypeCnxError - tiCnxDown!\n"); } break; case tiIntrEventTypeDiscovery: pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(ptiPortalContext); pCard->flags |= AGTIAPI_CB_DONE; if (eventStatus == tiDiscOK) { AGTIAPI_PRINTK("eventStatus - tiDiscOK\n"); AGTIAPI_PRINTK("ostiInitiatorEvent: pcard %d eventStatus - tiDiscOK\n", pCard->cardNo ); PORTAL_STATUS(pPortalData) |= AGTIAPI_DISC_COMPLETE; #ifndef HOTPLUG_SUPPORT if (!(pCard->flags & AGTIAPI_INIT_TIME)) #else if (TRUE) #endif { agtiapi_GetDevHandle(pCard, &pPortalData->portalInfo, tiIntrEventTypeDiscovery, tiDiscOK); PORTAL_STATUS(pPortalData) |= (AGTIAPI_DISC_DONE | AGTIAPI_PORT_LINK_UP); } /* Trigger CheckIOTimeout */ callout_reset(&pCard->IO_timer, 20*hz, agtiapi_CheckIOTimeout, pCard); } else if (eventStatus == tiDiscFailed) { AGTIAPI_PRINTK("eventStatus - tiDiscFailed\n"); agtiapi_GetDevHandle(pCard, &pPortalData->portalInfo, tiIntrEventTypeDiscovery, tiDiscFailed); PORTAL_STATUS(pPortalData) &= ~AGTIAPI_DISC_DONE; } AGTIAPI_PRINTK("tiIntrEventTypeDiscovery - portal %p, status 0x%x\n", pPortalData, PORTAL_STATUS(pPortalData)); break; case tiIntrEventTypeDeviceChange: AGTIAPI_PRINTK("tiIntrEventTypeDeviceChange - portal %p es %d\n", ptiPortalContext->osData, eventStatus); pPortalData = PORTAL_CONTEXT_TO_PORTALDATA(ptiPortalContext); pPortalInfo = &pPortalData->portalInfo; #ifndef HOTPLUG_SUPPORT if (!(pCard->flags & AGTIAPI_INIT_TIME)) #else if (TRUE) #endif { agtiapi_GetDevHandle(pCard, pPortalInfo, tiIntrEventTypeDeviceChange, eventStatus); // agtiapi_StartIO(pCard); } break; case tiIntrEventTypeTransportRecovery: AGTIAPI_PRINTK("tiIntrEventTypeTransportRecovery!\n"); break; case tiIntrEventTypeTaskManagement: AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement!\n"); pccb = (pccb_t)((tiIORequest_t *)parm)->osData; if (pccb->flags & TASK_TIMEOUT) { AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM timeout!\n"); agtiapi_FreeTMCCB(pCard, pccb); } else { pccb->flags |= AGTIAPI_CB_DONE; if (eventStatus == tiTMOK) { pccb->flags |= TASK_SUCCESS; AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: pTMccb %p flag %x \n", pccb, pccb->flags); /* Incase of TM_DEV_RESET, issue LocalAbort to abort pending IO */ if (pccb->flags & DEV_RESET) { AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: Target Reset\n"); ccbIO = pccb->pccbIO; AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: IO to be aborted locally %p flag %x \n", ccbIO, ccbIO->flags); if (ccbIO->startTime == 0) /* IO has been completed. No local abort */ { } else if (tiINIIOAbort(&pCard->tiRoot, &ccbIO->tiIORequest) != tiSuccess) { AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: Local Abort failed\n"); /* TODO: call Soft reset here */ } } else if (eventStatus == tiTMFailed) { ccbIO = pccb->pccbIO; if (ccbIO->startTime == 0) /* IO has been completed. */ { AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM failed because IO has been completed! pTMccb %p flag %x \n", pccb, pccb->flags); } else { AGTIAPI_PRINTK("tiIntrEventTypeTaskManagement: TM failed! pTMccb %p flag %x \n", pccb, pccb->flags); /* TODO:*/ /* if TM_ABORT_TASK, call TM_TARGET_RESET */ /* if TM_TARGET_RESET, call Soft_Reset */ } } /* Free TM_DEV_RESET ccb */ agtiapi_FreeTMCCB(pCard, pccb); } } break; case tiIntrEventTypeLocalAbort: AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort!\n"); pccb = (pccb_t)((tiIORequest_t *)parm)->osData; pccb->flags |= AGTIAPI_CB_DONE; if (eventStatus == tiAbortOK) { AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: taskTag pccb %p flag %x \n", pccb, pccb->flags); /* If this was LocalAbort for TM ABORT_TASK, issue TM_DEV_RESET */ if (pccb->flags & TASK_MANAGEMENT) { if ((pTMccb = agtiapi_GetCCB(pCard)) == NULL) { AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM resource unavailable!\n"); /* TODO: SoftReset here? */ } pTMccb->pmcsc = pCard; pTMccb->targetId = pccb->targetId; pTMccb->devHandle = pccb->devHandle; /* save pending io to issue local abort at Task mgmt CB */ pTMccb->pccbIO = pccb->pccbIO; pTMccb->flags &= ~(TASK_SUCCESS | ACTIVE); pTMccb->flags |= DEV_RESET; if (tiINITaskManagement(&pCard->tiRoot, pccb->devHandle, AG_TARGET_WARM_RESET, &pccb->tiSuperScsiRequest.scsiCmnd.lun, &pccb->tiIORequest, &pTMccb->tiIORequest) == tiSuccess) { AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM_TARGET_RESET request success ccb %p, pTMccb %p\n", pccb, pTMccb); pTMccb->startTime = ticks; } else { AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: TM_TARGET_RESET request failed ccb %p, pTMccb %p\n", pccb, pTMccb); agtiapi_FreeTMCCB(pCard, pTMccb); /* TODO: SoftReset here? */ } /* Free ABORT_TASK TM ccb */ agtiapi_FreeTMCCB(pCard, pccb); } } else if (eventStatus == tiAbortFailed) { /* TODO: */ /* If TM_ABORT_TASK fails, issue TM_DEV_RESET */ /* if TM_DEV_RESET fails, issue Soft_Reset */ AGTIAPI_PRINTK("tiIntrEventTypeLocalAbort: Abort Failed pccb %p\n", pccb); } break; default: AGTIAPI_PRINTK("tiIntrEventType default!\n"); break; } } /****************************************************************************** ostiInitiatorIOCompleted() Purpose: IO request completion call back Parameters: tiRoot_t *ptiRoot (IN) Pointer to the HBA tiRoot tiIORequest_t *ptiIORequest (IN) Pointer to the tiIORequest structure tiIOStatus_t IOStatus (IN) I/O complated status U32 statusDetail (IN) Additional information on status tiSenseData_t *pSensedata (IN) Sense data buffer pointer U32 context (IN) Interrupt dealing context Returns: Note: ******************************************************************************/ void ostiInitiatorIOCompleted(tiRoot_t *ptiRoot, tiIORequest_t *ptiIORequest, tiIOStatus_t IOStatus, U32 statusDetail, tiSenseData_t *pSenseData, U32 context ) { struct agtiapi_softc *pCard; ccb_t *pccb; pCard = TIROOT_TO_CARD(ptiRoot); pccb = (ccb_t *)ptiIORequest->osData; AGTIAPI_IO( "ostiInitiatorIOCompleted: start\n" ); if (IOStatus == tiIODifError) { return; } OSTI_OUT_ENTER(ptiRoot); pccb->ccbStatus = (U16)IOStatus; pccb->scsiStatus = statusDetail; if ((IOStatus == tiIOSuccess) && (statusDetail == SCSI_CHECK_CONDITION)) { if (pSenseData == (tiSenseData_t *)agNULL) { AGTIAPI_PRINTK( "ostiInitiatorIOCompleted: " "check condition without sense data!\n" ); } else { union ccb *ccb = pccb->ccb; struct ccb_scsiio *csio = &ccb->csio; int sense_len = 0; if (pccb->senseLen > pSenseData->senseLen) { csio->sense_resid = pccb->senseLen - pSenseData->senseLen; } else { csio->sense_resid = 0; } sense_len = MIN( pSenseData->senseLen, pccb->senseLen - csio->sense_resid ); bzero(&csio->sense_data, sizeof(csio->sense_data)); AGTIAPI_PRINTK("ostiInitiatorIOCompleted: check condition copying\n"); memcpy( (void *)pccb->pSenseData, pSenseData->senseData, sense_len ); agtiapi_hexdump( "ostiInitiatorIOCompleted check condition", (bit8 *)&csio->sense_data, sense_len ); } } if ((IOStatus == tiIOFailed) && (statusDetail == tiDetailAborted)) { AGTIAPI_PRINTK("ostiInitiatorIOCompleted - aborted ccb %p, flag %x\n", pccb, pccb->flags); /* indicate aborted IO completion */ pccb->startTime = 0; agtiapi_Done(pCard, pccb); } else { #ifdef AGTIAPI_SA /* * SAS no data command does not trigger interrupt. * Command is completed in tdlayer and IO completion is called directly. * The completed IO therefore is not post processed. * Flag is raised and TDTimer will check and process IO for SAS. * This is a temporary solution. - Eddie, 07-17-2006 */ pCard->flags |= AGTIAPI_FLAG_UP; #endif pccb->flags |= REQ_DONE; agtiapi_QueueCCB(pCard, &pCard->ccbDoneHead, &pCard->ccbDoneTail AG_CARD_LOCAL_LOCK(&pCard->doneLock), pccb); } OSTI_OUT_LEAVE(ptiRoot); return; } #ifdef HIALEAH_ENCRYPTION osGLOBAL void ostidisableEncryption(tiRoot_t *ptiRoot) { struct agtiapi_softc *pCard; pCard = TIROOT_TO_CARD(ptiRoot); pCard->encrypt=agFALSE; } #endif /* device Handle */ osGLOBAL //FORCEINLINE tiDeviceHandle_t* ostiGetDevHandleFromSasAddr( tiRoot_t *root, unsigned char *sas_addr ) { int i; unsigned long x; ag_portal_data_t *pPortal = NULL; tiDeviceHandle_t *devHandle = NULL; struct agtiapi_softc *pCard = TIROOT_TO_CARD(root); bit8 sas_addr_hi[4], sas_addr_lo[4]; for(i=0; i<4; i++) { sas_addr_hi[i] = sas_addr[3-i]; } for(i=0; i<4; i++) { sas_addr_lo[i] = sas_addr[7-i]; } /* Retrieve the handles for each portal */ for (x=0; x < pCard->portCount; x++) { pPortal = &pCard->pPortalData[x]; devHandle = tiINIGetExpDeviceHandleBySasAddress(&pCard->tiRoot, &pPortal->portalInfo.tiPortalContext, *(bit32*)sas_addr_hi, *(bit32*)sas_addr_lo, (bit32)1024/*gMaxTargets*/); if(devHandle != NULL) break; } return devHandle; return NULL; } /****************************************************************************** ostiInitiatorSMPCompleted() Purpose: IO request completion call back Parameters: tiRoot_t *ptiRoot (IN) Pointer to the HBA tiRoot tiIORequest_t *ptiSMPRequest (IN) Pointer to the SMP request structure tiIOStatus_t IOStatus (IN) I/O complated status U32 tiSMPInfoLen (IN) Number of bytes of response frame len tiFrameHandle (IN) Handle that referes to response frame U32 context (IN) Interrupt dealing context Returns: Note: ******************************************************************************/ void ostiInitiatorSMPCompleted(tiRoot_t *ptiRoot, tiIORequest_t *ptiSMPRequest, tiSMPStatus_t smpStatus, bit32 tiSMPInfoLen, void *tiFrameHandle, bit32 context) { struct agtiapi_softc *pCard; ccb_t *pccb; pCard = TIROOT_TO_CARD(ptiRoot); pccb = (ccb_t *)ptiSMPRequest->osData; AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: start\n"); OSTI_OUT_ENTER(ptiRoot); pccb->ccbStatus = (U16)smpStatus; if(smpStatus != tiSMPSuccess) { AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: SMP Error\n"); } else { union ccb *ccb = pccb->ccb; struct ccb_smpio *csmpio = &ccb->smpio; memcpy(csmpio->smp_response, tiFrameHandle, tiSMPInfoLen); csmpio->smp_response_len = tiSMPInfoLen; agtiapi_hexdump("ostiInitiatorSMPCompleted: Response Payload in CAM", (bit8 *)csmpio->smp_response, csmpio->smp_response_len); } pccb->flags |= REQ_DONE; agtiapi_QueueCCB(pCard, &pCard->smpDoneHead, &pCard->smpDoneTail AG_CARD_LOCAL_LOCK(&pCard->doneSMPLock), pccb); AGTIAPI_PRINTK("ostiInitiatorSMPCompleted: Done\n"); OSTI_OUT_LEAVE(ptiRoot); return; } #ifdef FAST_IO_TEST void osti_FastIOCb(tiRoot_t *ptiRoot, void *arg, tiIOStatus_t IOStatus, U32 statusDetail) { ccb_t *pccb = (ccb_t*)arg; ag_card_t *pCard; static int callNum = 0; callNum++; BUG_ON(!pccb); if ((callNum % CMDS_PER_IO_DUP) != 0) { goto err; } pccb->ccbStatus = IOStatus; pccb->scsiStatus = statusDetail; /* pccb->pSenseData is copied already */ if (pccb->flags & AGTIAPI_ABORT) { AGTIAPI_PRINTK("agtiapi_SuperIOCb: aborted ccb %p, flag %x\n", pccb, pccb->flags); pccb->startTime = 0; /* indicate aborted IO completion */ BUG_ON(1); goto err; } pCard = TIROOT_TO_CARD(ptiRoot); pccb->flags |= REQ_DONE; agtiapi_QueueCCB(pCard, &pCard->ccbDoneHead, &pCard->ccbDoneTail AG_CARD_LOCAL_LOCK(&pCard->doneLock), pccb); err: return; } /* osti_FastIOCb */ #endif /****************************************************************************** ostiSingleThreadedEnter() Purpose: Critical region code excution protection. Parameters: tiRoot_t *ptiRoot (IN) Pointer to tiRoot data structure U32 queueId (IN) spinlock Id Returns: Note: Lock is held by oslayer. ******************************************************************************/ void ostiSingleThreadedEnter(tiRoot_t *ptiRoot, U32 queueId) { struct agtiapi_softc *pCard = TIROOT_TO_CARD(ptiRoot); mtx_lock( &pCard->STLock[queueId] ); // review: need irq save? ## } /****************************************************************************** ostiSingleThreadedLeave() Purpose: Restore multi-threading environment. Parameters: tiRoot_t *ptiRoot (IN) Pointer to the tiRoot data structure U32 queueId (IN) spinlock Id Returns: Note: Lock is held by oslayer. ******************************************************************************/ void ostiSingleThreadedLeave(tiRoot_t *ptiRoot, U32 queueId) { struct agtiapi_softc *pCard = TIROOT_TO_CARD(ptiRoot); mtx_unlock( &pCard->STLock[queueId] ); // review: need irq restore? ## } osGLOBAL tiDeviceHandle_t* ostiMapToDevHandle(tiRoot_t *root, bit8 pathId, bit8 targetId, bit8 LUN ) { tiDeviceHandle_t *dev = NULL; struct agtiapi_softc *pCard; bit32 offset; pCard = TIROOT_TO_CARD(root); offset = pathId * pCard->tgtCount + targetId; if (offset > (pCard->tgtCount - 1) ) { dev = NULL; } else { dev = pCard->pDevList[offset].pDevHandle; } return dev; } #ifdef PERF_COUNT #ifdef AGTIAPI_LOCAL_LOCK #define OSTI_SPIN_LOCK(lock) spin_lock(lock) #define OSTI_SPIN_UNLOCK(lock) spin_unlock(lock) #else #define OSTI_SPIN_LOCK(lock) #define OSTI_SPIN_UNLOCK(lock) #endif void ostiEnter(tiRoot_t *ptiRoot, U32 layer, int io) { ag_card_t *pCard = ((ag_card_info_t*)ptiRoot->osData)->pCard; int ini = ((pCard->flags & AGTIAPI_INIT_TIME) == AGTIAPI_INIT_TIME); BUG_ON((io != 0 && io != 1) || (layer != 0 && layer != 1 && layer != 2)); if (!ini) { unsigned long long cycles = get_cycles(); OSTI_SPIN_LOCK(&pCard->latLock); BUG_ON(pCard->callLevel[io] >= sizeof(pCard->layer[0]) / sizeof(pCard->layer[0][0])); if (pCard->callLevel[io] > 0) { unsigned int prev_layer = pCard->layer[io][pCard->callLevel[io] - 1]; pCard->totalCycles[io][prev_layer] += cycles - pCard->enterCycles[io][prev_layer]; } pCard->enterCycles[io][layer] = cycles; pCard->layer[io][pCard->callLevel[io]] = layer; pCard->callLevel[io]++; OSTI_SPIN_UNLOCK(&pCard->latLock); } } void ostiLeave(tiRoot_t *ptiRoot, U32 layer, int io) { ag_card_t *pCard = ((ag_card_info_t*)ptiRoot->osData)->pCard; int ini = ((pCard->flags & AGTIAPI_INIT_TIME) == AGTIAPI_INIT_TIME); BUG_ON((io != 0 && io != 1) || (layer != 0 && layer != 1 && layer != 2)); if (!ini) { unsigned long long cycles = get_cycles(); OSTI_SPIN_LOCK(&pCard->latLock); pCard->callLevel[io]--; BUG_ON(pCard->callLevel[io] < 0); BUG_ON(pCard->layer[io][pCard->callLevel[io]] != layer); pCard->totalCycles[io][layer] += cycles - pCard->enterCycles[io][layer]; if (pCard->callLevel[io] > 0) pCard->enterCycles[io][pCard->layer[io][pCard->callLevel[io] - 1]] = cycles; OSTI_SPIN_UNLOCK(&pCard->latLock); } } #endif osGLOBAL FORCEINLINE bit8 ostiBitScanForward( tiRoot_t *root, bit32 *Index, bit32 Mask ) { return 1; } #ifdef REMOVED osGLOBAL sbit32 ostiAtomicIncrement( tiRoot_t *root, sbit32 volatile *Addend ) { return 1; } osGLOBAL sbit32 ostiAtomicDecrement( tiRoot_t *root, sbit32 volatile *Addend ) { return 1; } osGLOBAL sbit32 ostiAtomicBitClear( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ) { return 0; } osGLOBAL sbit32 ostiAtomicBitSet( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ) { return 0; /* set_bit(Value, (volatile unsigned long *)Destination); return 0; */ } osGLOBAL sbit32 ostiAtomicExchange( tiRoot_t *root, sbit32 volatile *Target, sbit32 Value ) { return 0; } #endif osGLOBAL FORCEINLINE sbit32 ostiInterlockedExchange( tiRoot_t *root, sbit32 volatile *Target, sbit32 Value ) { return 0; } osGLOBAL FORCEINLINE sbit32 ostiInterlockedIncrement( tiRoot_t *root, sbit32 volatile *Addend ) { return 0; } osGLOBAL FORCEINLINE sbit32 ostiInterlockedDecrement( tiRoot_t *root, sbit32 volatile *Addend ) { return 0; } osGLOBAL FORCEINLINE sbit32 ostiInterlockedAnd( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ) { return 0; } osGLOBAL FORCEINLINE sbit32 ostiInterlockedOr( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ) { return 0; } // this is just stub code to allow compile and use of the module ... // now that a call to this function has been added with windows specific // intentions. osGLOBAL bit32 ostiSetDeviceQueueDepth( tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, bit32 QueueDepth ) { bit32 retVal = 0; ccb_t *pccb = (ccb_t *) tiIORequest->osData; tiDeviceHandle_t *tiDeviceHandle = pccb->devHandle; ag_device_t *pDevice = (ag_device_t *)tiDeviceHandle->osData; AGTIAPI_PRINTK( "ostiSetDeviceQueueDepth stub only: root%p, req%p, qdeep%d\n", tiRoot, tiIORequest, QueueDepth ); pDevice->qdepth = QueueDepth; return retVal; } // this is just stub code to allow compile and use of the module ... // now that a call to this function has been added with windows specific // intentions. osGLOBAL void ostiGetSenseKeyCount(tiRoot_t *root, bit32 fIsClear, void *SenseKeyCount, bit32 length ) { AGTIAPI_PRINTK( "ostiGetSenseKeyCount stub only: rt%p, fcl%d, kyCt%p, ln%d\n", root, fIsClear, SenseKeyCount, length ); } osGLOBAL void ostiGetSCSIStatusCount(tiRoot_t *root, bit32 fIsClear, void *ScsiStatusCount, bit32 length ) { AGTIAPI_PRINTK( "ostiGetSCSIStatusCount: stub only rt%p, fcl%d, kyCt%p, ln%d\n", root, fIsClear, ScsiStatusCount, length ); } osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot ) { ostiChipReadBit32Ext(tiRoot, 0, 0x5C); } osGLOBAL bit32 ostiNumOfLUNIOCTLreq( tiRoot_t *root, void *param1, void *param2, void **tiRequestBody, tiIORequest_t **tiIORequest ) { bit32 status = IOCTL_CALL_SUCCESS; pccb_t pccb; AGTIAPI_PRINTK("ostiNumOfLUNIOCTLreq: start\n"); struct agtiapi_softc *pCard = TIROOT_TO_CARD(root); /* get a ccb */ if ((pccb = agtiapi_GetCCB(pCard)) == NULL) { printf("ostiNumOfLUNIOCTLreq - GetCCB ERROR\n"); status = IOCTL_CALL_FAIL; //BUG_ON(1); } *tiIORequest = (tiIORequest_t*)&pccb->tiIORequest; *tiRequestBody = &pccb->tdIOReqBody; AGTIAPI_PRINTK("ostiNumOfLUNIOCTLreq:end\n"); return status; }