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
|