changeset 253 | d37db4dcc88d |
parent 189 | a5496987b1da |
252:0a40b8675b23 | 253:d37db4dcc88d |
---|---|
19 |
19 |
20 /** |
20 /** |
21 @file d_usbcsc.cpp |
21 @file d_usbcsc.cpp |
22 @internalTechnology |
22 @internalTechnology |
23 */ |
23 */ |
24 |
|
25 #include <drivers/usbcsc.h> |
24 #include <drivers/usbcsc.h> |
26 #include "platform.h" |
25 #include "platform.h" |
26 #include "OstTraceDefinitions.h" |
|
27 #ifdef OST_TRACE_COMPILER_IN_USE |
|
28 #include "d_usbcscTraces.h" |
|
29 #endif |
|
30 |
|
27 |
31 |
28 /*****************************************************************************\ |
32 /*****************************************************************************\ |
29 * DUsbcScLogDevice * |
33 * DUsbcScLogDevice * |
30 * * |
34 * * |
31 * Inherits from DLogicalDevice, the USB Shared Chunk LDD factory class * |
35 * Inherits from DLogicalDevice, the USB Shared Chunk LDD factory class * |
65 TInt DUsbcScLogDevice::Install() |
69 TInt DUsbcScLogDevice::Install() |
66 { |
70 { |
67 // Only proceed if we have the Controller underneath us |
71 // Only proceed if we have the Controller underneath us |
68 if (!DUsbClientController::UsbcControllerPointer()) |
72 if (!DUsbClientController::UsbcControllerPointer()) |
69 { |
73 { |
70 __KTRACE_OPT(KPANIC, Kern::Printf("LDD Install: USB Controller Not Present")); |
74 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DUSBCSCLOGDEVICE_INSTALL, "LDD Install: USB Controller Not Present" ); |
75 |
|
71 return KErrGeneral; |
76 return KErrGeneral; |
72 } |
77 } |
73 return SetName(&KUsbScLddName); |
78 return SetName(&KUsbScLddName); |
74 } |
79 } |
75 |
80 |
135 |
140 |
136 // This method requests closing the chunk. |
141 // This method requests closing the chunk. |
137 // Note that nothing may happen immediately, as something else may have the chunk open. |
142 // Note that nothing may happen immediately, as something else may have the chunk open. |
138 void TUsbcScChunkInfo::Close() |
143 void TUsbcScChunkInfo::Close() |
139 { |
144 { |
140 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::Close %d", iChunk->AccessCount())); |
145 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE, "TUsbcScChunkInfo::Close %d", iChunk->AccessCount()); |
141 |
|
142 if (Kern::ChunkClose(iChunk)) |
146 if (Kern::ChunkClose(iChunk)) |
143 { |
147 { |
144 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::Close1")); |
148 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE_DUP1, "TUsbcScChunkInfo::Close1"); |
145 ChunkCleanup(); |
149 ChunkCleanup(); |
146 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::Close2")); |
150 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CLOSE_DUP2, "TUsbcScChunkInfo::Close2"); |
147 } |
151 } |
148 } |
152 } |
149 |
153 |
150 |
154 |
151 TInt TUsbcScChunkInfo::ChunkAlloc(TInt aOffset, TInt aSize) |
155 TInt TUsbcScChunkInfo::ChunkAlloc(TInt aOffset, TInt aSize) |
154 TUint rleMask = ~pageMask; |
158 TUint rleMask = ~pageMask; |
155 TUint pageSize = rleMask+1; |
159 TUint pageSize = rleMask+1; |
156 TInt r; |
160 TInt r; |
157 TLinAddr physAddr; |
161 TLinAddr physAddr; |
158 |
162 |
159 __KTRACE_OPT(KUSB, Kern::Printf("::chunkalloc AllocPhysicalRam aSize %d", aSize)); |
163 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC, "::chunkalloc AllocPhysicalRam aSize %d", aSize); |
160 |
164 |
161 r = Epoc::AllocPhysicalRam(aSize, physAddr); |
165 r = Epoc::AllocPhysicalRam(aSize, physAddr); |
162 __KTRACE_OPT(KUSB, if (r!=KErrNone) Kern::Printf("::chunkalloc AllocPhysicalRam r=%d (Error!)", r)); |
166 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP1, "::chunkalloc AllocPhysicalRam r=%d (Error!)", r); |
167 |
|
163 if (r==KErrNone) |
168 if (r==KErrNone) |
164 { |
169 { |
165 __KTRACE_OPT(KUSB, Kern::Printf("::chunkalloc ChunkCommitPhysical iChunk 0x%x size(%d), aOffset 0x%x, aSize 0x%x phsAddr 0x%x", |
170 OstTraceDefExt5(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP2, "T::chunkalloc ChunkCommitPhysical iChunk 0x%x size(%d), aOffset 0x%x, aSize 0x%x phsAddr 0x%x", (TUint)iChunk, sizeof(DChunk), aOffset, aSize,(TUint)physAddr); |
166 iChunk, sizeof(DChunk), aOffset, aSize,physAddr )); |
|
167 |
|
168 r = Kern::ChunkCommitPhysical(iChunk, aOffset, aSize, physAddr); |
171 r = Kern::ChunkCommitPhysical(iChunk, aOffset, aSize, physAddr); |
169 __KTRACE_OPT(KUSB, if (r!=KErrNone) Kern::Printf("::chunkalloc ChunkCommitPhysical r=%d (Error!)", r)); |
172 if (r!=KErrNone) |
173 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP3, "::chunkalloc ChunkCommitPhysical r=%d (Error!)", r); |
|
174 |
|
170 |
175 |
171 if (r!=KErrNone) |
176 if (r!=KErrNone) |
172 Epoc::FreePhysicalRam(physAddr, aSize); |
177 Epoc::FreePhysicalRam(physAddr, aSize); |
173 else |
178 else |
174 { // record physical address and length in physical map |
179 { // record physical address and length in physical map |
175 TInt rle; |
180 TInt rle; |
176 TInt i=0; |
181 TInt i=0; |
177 for (rle=(aSize>>iPageNtz); rle>0; rle--, i++,physAddr+=pageSize) |
182 for (rle=(aSize>>iPageNtz); rle>0; rle--, i++,physAddr+=pageSize) |
178 { |
183 { |
179 __KTRACE_OPT(KUSB, Kern::Printf("::phys offset 0x%x = 0x%x", |
184 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_CHUNKALLOC_DUP4, "::phys offset 0x%x = 0x%x", |
180 (aOffset>>iPageNtz)+i, (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle))); |
185 (TInt32)((aOffset>>iPageNtz)+i), (TUint32)( (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle))); |
181 iPhysicalMap[(aOffset>>iPageNtz)+i] = (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle); |
186 iPhysicalMap[(aOffset>>iPageNtz)+i] = (physAddr & pageMask) | ((rle>(TInt)rleMask)?(TInt)rleMask:rle); |
182 } |
187 } |
183 } |
188 } |
184 } |
189 } |
185 else if (r==KErrNoMemory) |
190 else if (r==KErrNoMemory) |
216 } |
221 } |
217 |
222 |
218 |
223 |
219 void TUsbcScChunkInfo::ChunkCleanup() |
224 void TUsbcScChunkInfo::ChunkCleanup() |
220 { |
225 { |
221 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::ChunkCleanup()")); |
226 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCCHUNKINFO_CHUNKCLEANUP, "TUsbcScChunkInfo::ChunkCleanup()" ); |
227 |
|
222 TUint physAddr; |
228 TUint physAddr; |
223 TInt length; |
229 TInt length; |
224 TInt offset = 0; |
230 TInt offset = 0; |
225 |
231 |
226 // The part of the field used for the physical page address. |
232 // The part of the field used for the physical page address. |
247 ldd->Close(NULL); |
253 ldd->Close(NULL); |
248 } |
254 } |
249 |
255 |
250 TInt TUsbcScChunkInfo::New(TUsbcScChunkInfo*& aChunk, TInt aSize, DLogicalDevice* aLdd) |
256 TInt TUsbcScChunkInfo::New(TUsbcScChunkInfo*& aChunk, TInt aSize, DLogicalDevice* aLdd) |
251 { |
257 { |
252 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::New totalSize %d", aSize)); |
258 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_NEW, "TUsbcScChunkInfo::New totalSize %d", aSize); |
253 |
259 |
254 aChunk = new TUsbcScChunkInfo(aLdd); |
260 aChunk = new TUsbcScChunkInfo(aLdd); |
255 if (aChunk==NULL) |
261 if (aChunk==NULL) |
256 { |
262 { |
257 return KErrNoMemory; |
263 return KErrNoMemory; |
258 } |
264 } |
263 delete aChunk; |
269 delete aChunk; |
264 aChunk=NULL; |
270 aChunk=NULL; |
265 return r; |
271 return r; |
266 } |
272 } |
267 |
273 |
268 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChunkInfo::New Created at 0x%x", aChunk->iChunkMem )); |
274 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCCHUNKINFO_NEW_DUP1, "TUsbcScChunkInfo::New Created at 0x%x", aChunk->iChunkMem); |
275 |
|
269 return KErrNone; |
276 return KErrNone; |
270 } |
277 } |
271 |
278 |
272 // End TUsbcScChunkInfo |
279 // End TUsbcScChunkInfo |
273 |
280 |
340 if ((iDirection&1)==KUsbcScOut) |
347 if ((iDirection&1)==KUsbcScOut) |
341 { |
348 { |
342 iBufferStart->iHead= iHead; |
349 iBufferStart->iHead= iHead; |
343 iBufferStart->iTail= iHead; // Initially no data! |
350 iBufferStart->iTail= iHead; // Initially no data! |
344 iBufferStart->iBilTail=iHead; |
351 iBufferStart->iBilTail=iHead; |
345 __KTRACE_OPT(KUSB, Kern::Printf("Realize: iHead 0x%x bufferHeader 0x%x", iHead,iBufferStart )); |
352 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_CREATECHUNKBUFFERHEADER, "Realize: iHead 0x%x bufferHeader 0x%x", iHead,(TUint)iBufferStart); |
346 |
|
347 // Dont need to round here, as we will round it up on endpoint change. (configuration) |
353 // Dont need to round here, as we will round it up on endpoint change. (configuration) |
348 } |
354 } |
349 } |
355 } |
350 |
356 |
351 |
357 |
367 This method sets the nessesary paramenters to the buffer, for use for a particular endpoint. |
373 This method sets the nessesary paramenters to the buffer, for use for a particular endpoint. |
368 |
374 |
369 */ |
375 */ |
370 void TUsbcScBuffer::StartEndpoint(TUsbcRequestCallback* aRequestInfo, TUint aFlags) |
376 void TUsbcScBuffer::StartEndpoint(TUsbcRequestCallback* aRequestInfo, TUint aFlags) |
371 { |
377 { |
372 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartEndpoint (0x%x) : ep %d(%d)",this,aRequestInfo->iEndpointNum, aRequestInfo->iRealEpNum)); |
378 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT, "TUsbcScBuffer::StartEndpoint (0x%x) : ep %d(%d)", (TUint)this,aRequestInfo->iEndpointNum, aRequestInfo->iRealEpNum); |
373 |
379 |
374 iCallback=aRequestInfo; |
380 iCallback=aRequestInfo; |
375 iMaxPacketSize = iLdd->iController->EndpointPacketSize(iLdd, aRequestInfo->iRealEpNum); |
381 iMaxPacketSize = iLdd->iController->EndpointPacketSize(iLdd, aRequestInfo->iRealEpNum); |
376 iAlignMask = ~(((iMaxPacketSize+1) & 0xFFFFFFF8)-1); |
382 iAlignMask = ~(((iMaxPacketSize+1) & 0xFFFFFFF8)-1); |
377 iMode = aFlags; |
383 iMode = aFlags; |
378 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartEndpoint : max Packets %d, mask 0x%x flags 0x%x", iMaxPacketSize, iAlignMask, iMode)); |
384 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT_DUP1, "TUsbcScBuffer::StartEndpoint : max Packets %d, mask 0x%x flags 0x%x", iMaxPacketSize, iAlignMask, (TUint)iMode); |
385 |
|
379 if ((iDirection&1)==KUsbcScOut) |
386 if ((iDirection&1)==KUsbcScOut) |
380 { |
387 { |
381 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UsbcScOut\n")); |
388 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTENDPOINT_DUP2, "TUsbcScBuffer::UsbcScOut\n" ); |
389 |
|
382 // Add dummy packet (doesnt have to be aligned, which avoids what if it changes issue) |
390 // Add dummy packet (doesnt have to be aligned, which avoids what if it changes issue) |
383 // And Start next read. |
391 // And Start next read. |
384 iNeedsPacket=KEpIsStarting; |
392 iNeedsPacket=KEpIsStarting; |
385 } |
393 } |
386 } |
394 } |
387 |
395 |
388 |
396 |
389 |
397 |
390 void TUsbcScBuffer::Destroy() |
398 void TUsbcScBuffer::Destroy() |
391 { |
399 { |
392 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::Destroy()")); |
400 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCBUFFER_DESTROY, "TUsbcScBuffer::Destroy()" ); |
401 |
|
393 Cancel(KErrCancel); |
402 Cancel(KErrCancel); |
394 if (iLdd->iController && ((iDirection&1)==KUsbcScOut)) |
403 if (iLdd->iController && ((iDirection&1)==KUsbcScOut)) |
395 { // Me must cancel reads to LDD to, an there will be no list for the callbacks to look into. |
404 { // Me must cancel reads to LDD to, an there will be no list for the callbacks to look into. |
396 iLdd->iController->CancelReadBuffer(iLdd, iCallback->iRealEpNum); |
405 iLdd->iController->CancelReadBuffer(iLdd, iCallback->iRealEpNum); |
397 } |
406 } |
402 |
411 |
403 TInt TUsbcScBuffer::StartDataRead() |
412 TInt TUsbcScBuffer::StartDataRead() |
404 { |
413 { |
405 if (!iMaxPacketSize) |
414 if (!iMaxPacketSize) |
406 { |
415 { |
407 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Not Configured")); |
416 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD, "TUsbcScBuffer::StartDataRead() - Not Configured" ); |
417 |
|
408 return KErrNone; |
418 return KErrNone; |
409 } |
419 } |
410 if (iStatusList.iState!=ENotRunning) |
420 if (iStatusList.iState!=ENotRunning) |
411 { |
421 { |
412 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Already Stated! (%d)",iStatusList.iState)); |
422 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP1, "TUsbcScBuffer::StartDataRead() - Already Stated! (%d)", iStatusList.iState ); |
423 |
|
413 return KErrNone; |
424 return KErrNone; |
414 } |
425 } |
415 |
426 |
416 TInt maxLength; |
427 TInt maxLength; |
417 TInt freeSpace; |
428 TInt freeSpace; |
419 |
430 |
420 // get next request |
431 // get next request |
421 TUsbcScStatusElement* nextJob = iStatusList.Next(); |
432 TUsbcScStatusElement* nextJob = iStatusList.Next(); |
422 if (nextJob == NULL) |
433 if (nextJob == NULL) |
423 { |
434 { |
424 __KTRACE_OPT(KUSB, Kern::Printf("No more jobs")); |
435 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP2, "No more jobs"); |
436 |
|
425 if (iMode && KUsbScCoupledRead) |
437 if (iMode && KUsbScCoupledRead) |
426 return KErrEof; |
438 return KErrEof; |
427 iStatusList.iState=EReadingAhead; |
439 iStatusList.iState=EReadingAhead; |
428 } |
440 } |
429 else |
441 else |
430 iStatusList.iState=EInProgress; |
442 iStatusList.iState=EInProgress; |
431 |
443 |
432 TInt tail = iBufferStart->iTail; |
444 TInt tail = iBufferStart->iTail; |
433 TInt headerSize = sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data. |
445 TInt headerSize = sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data. |
434 maxLength = iChunkInfo->GetPhysical(iHead + headerSize, &physAddr); //returns all the bytes available after iHead + headerSize) |
446 maxLength = iChunkInfo->GetPhysical(iHead + headerSize, &physAddr); //returns all the bytes available after iHead + headerSize) |
435 |
|
436 __ASSERT_DEBUG(maxLength>0,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); |
447 __ASSERT_DEBUG(maxLength>0,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); |
437 |
448 |
438 |
449 |
439 if (tail>iHead) // # # # H _ _ _ T # # # # |
450 if (tail>iHead) // # # # H _ _ _ T # # # # |
440 { |
451 { |
441 __KTRACE_OPT(KUSB,Kern::Printf("TUsbcScBuffer::StartDataRead() - tail 0x%x>head 0x%x, maxlength 0x%x", tail, iHead, maxLength)); |
452 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP3, "TUsbcScBuffer::StartDataRead() - tail 0x%x>head 0x%x, maxlength 0x%x", (TUint)tail, iHead, maxLength); |
442 |
453 |
443 freeSpace = (tail & iAlignMask) - (iHead +headerSize + (~iAlignMask+1) ); // Cant read right up to last buffer, or head/tail will cross. |
454 freeSpace = (tail & iAlignMask) - (iHead +headerSize + (~iAlignMask+1) ); // Cant read right up to last buffer, or head/tail will cross. |
444 |
455 |
445 if (freeSpace<iMinReadSize) |
456 if (freeSpace<iMinReadSize) |
446 { |
457 { |
447 iStatusList.iState=ENotRunning; |
458 iStatusList.iState=ENotRunning; |
448 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataRead() - Stall!!")); |
459 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP4, "TUsbcScBuffer::StartDataRead() - Stall!!"); |
460 |
|
449 return KErrOverflow; // Read STALL !! !! !! |
461 return KErrOverflow; // Read STALL !! !! !! |
450 } |
462 } |
451 |
463 |
452 if (freeSpace<maxLength) |
464 if (freeSpace<maxLength) |
453 maxLength = freeSpace; |
465 maxLength = freeSpace; |
454 } |
466 } |
455 if (maxLength> iMaxReadSize) |
467 if (maxLength> iMaxReadSize) |
456 maxLength = iMaxReadSize; |
468 maxLength = iMaxReadSize; |
457 // else tail<iHead (or empty) _ _ _ T # # # H _ _ _ _ |
469 // else tail<iHead (or empty) _ _ _ T # # # H _ _ _ _ |
458 // We would not have set iHead here if too small. So must be ok. |
470 // We would not have set iHead here if too small. So must be ok. |
459 |
|
460 __ASSERT_DEBUG(maxLength>=iMinReadSize,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); |
471 __ASSERT_DEBUG(maxLength>=iMinReadSize,Kern::Fault("TUsbcScBuffer::StartDataRead(", __LINE__)); |
461 |
472 |
462 TUint8* data = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.b; |
473 TUint8* data = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.b; |
463 // set up callback stucture |
474 // set up callback stucture |
464 |
475 |
466 TInt r; |
477 TInt r; |
467 // Go!! |
478 // Go!! |
468 r = iLdd->iController->SetupReadBuffer(*iCallback); |
479 r = iLdd->iController->SetupReadBuffer(*iCallback); |
469 if (r!=KErrNone) |
480 if (r!=KErrNone) |
470 { |
481 { |
471 __KTRACE_OPT(KUSB,Kern::Printf("SetupReadBuffer Error: %d, RT %d",r, iStatusList.iState)); |
482 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAREAD_DUP5, "SetupReadBuffer Error: %d, RT %d",r, iStatusList.iState); |
472 iStatusList.Complete(r); |
483 iStatusList.Complete(r); |
473 } |
484 } |
474 // After this, TUsbcScEndpoint::RequestCallback is called in a DFC. |
485 // After this, TUsbcScEndpoint::RequestCallback is called in a DFC. |
475 // This in turn calls either TUsbcScBuffer::CompleteRead. |
486 // This in turn calls either TUsbcScBuffer::CompleteRead. |
476 return KErrNone; |
487 return KErrNone; |
477 } |
488 } |
478 |
489 |
479 |
490 |
480 void TUsbcScBuffer::CompleteRead(TBool aStartNextRead) |
491 void TUsbcScBuffer::CompleteRead(TBool aStartNextRead) |
481 { |
492 { |
482 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::CompleteRead buff=%x",this)); |
493 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_COMPLETEREAD, "TUsbcScBuffer::CompleteRead buff=%x",this); |
483 |
494 |
484 // The first packet always contains the total #of bytes |
495 // The first packet always contains the total #of bytes |
485 const TInt byteCount = iCallback->iPacketSize[0]; |
496 const TInt byteCount = iCallback->iPacketSize[0]; |
486 const TInt packetCount = iCallback->iRxPackets; |
497 const TInt packetCount = iCallback->iRxPackets; |
487 iCallback->iRxPackets=0; |
498 iCallback->iRxPackets=0; |
488 TUint flags = 0; |
499 TUint flags = 0; |
497 // This method "submits" the current transfer, and starts off the next read. |
508 // This method "submits" the current transfer, and starts off the next read. |
498 |
509 |
499 void TUsbcScBuffer::UpdateBufferList(TInt aByteCount,TUint aFlags, TBool aStartNextRead) |
510 void TUsbcScBuffer::UpdateBufferList(TInt aByteCount,TUint aFlags, TBool aStartNextRead) |
500 { |
511 { |
501 |
512 |
502 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst aByteCount %d, flags 0x%x iHead 0x%x", aByteCount, aFlags, iHead)); |
513 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST, "TUsbcScBuffer::UpdateBUfferLIst aByteCount %d, flags 0x%x iHead 0x%x", aByteCount, aFlags, (TUint)iHead); |
503 |
514 |
504 TInt headerSize = sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data. |
515 TInt headerSize = sizeof(TUsbcScTransferHeader)-4; // TransferHeader includes 4 bytes of data. |
505 TLinAddr dummy; |
516 TLinAddr dummy; |
506 __KTRACE_OPT(KUSB, Kern::Printf("iHead 0x%x headerSize 0x%x",iHead, headerSize)); |
517 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP1, "iHead 0x%x headerSize 0x%x",iHead, headerSize); |
507 |
|
508 // Find iNext |
518 // Find iNext |
509 |
519 |
510 TInt next = iHead + headerSize + aByteCount; // next unused byte in buffer. |
520 TInt next = iHead + headerSize + aByteCount; // next unused byte in buffer. |
511 TInt maxLength; |
521 TInt maxLength; |
512 |
522 |
515 { |
525 { |
516 // round up. |
526 // round up. |
517 next = (next + headerSize + ~iAlignMask) & iAlignMask; |
527 next = (next + headerSize + ~iAlignMask) & iAlignMask; |
518 maxLength = iChunkInfo->GetPhysical(next, &dummy); |
528 maxLength = iChunkInfo->GetPhysical(next, &dummy); |
519 |
529 |
520 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst next %x buffer end %x min-read: %x maxRun %x", next, iBufferEnd, iMinReadSize, maxLength)); |
530 OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP2, "TUsbcScBuffer::UpdateBUfferLIst next %x buffer end %x min-read: %x maxRun %x", next, iBufferEnd, (TUint)iMinReadSize, (TUint)maxLength); |
531 |
|
521 // At the end of the buffer - wrap it if needbe. |
532 // At the end of the buffer - wrap it if needbe. |
522 if ((TUint)(next + iMinReadSize) > iBufferEnd) |
533 if ((TUint)(next + iMinReadSize) > iBufferEnd) |
523 { |
534 { |
524 next = iFirstPacket; |
535 next = iFirstPacket; |
525 continue; |
536 continue; |
526 } |
537 } |
527 // Not enough space, move onto next block. |
538 // Not enough space, move onto next block. |
528 if (maxLength<iMinReadSize) |
539 if (maxLength<iMinReadSize) |
529 { |
540 { |
530 next+=maxLength; |
541 next+=maxLength; |
531 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst Skip exhausted block. next %x max %d", next, maxLength)); |
542 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP3, "TUsbcScBuffer::UpdateBUfferLIst Skip exhausted block. next %x max %d", next, maxLength); |
543 |
|
532 continue; |
544 continue; |
533 } |
545 } |
534 } |
546 } |
535 while (EFalse); |
547 while (EFalse); |
536 |
548 |
537 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst next (pre deduct): %x, Fill in header at head: 0x%x, BuffStart: 0x%x.", next, iHead, iBufferStart)); |
549 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP4, "TUsbcScBuffer::UpdateBUfferLIst next (pre deduct): %x, Fill in header at head: 0x%x, BuffStart: 0x%x.", next, (TUint)iHead, (TUint)iBufferStart); |
538 |
550 |
539 next -= headerSize; // Move next back from the data start position, to the header start. |
551 next -= headerSize; // Move next back from the data start position, to the header start. |
540 |
552 |
541 TUsbcScTransferHeader* header = (TUsbcScTransferHeader*) (iHead + iChunkAddr); |
553 TUsbcScTransferHeader* header = (TUsbcScTransferHeader*) (iHead + iChunkAddr); |
542 |
554 |
543 // Create Header |
555 // Create Header |
549 header->iBytes=aByteCount; |
561 header->iBytes=aByteCount; |
550 header->iNext=next; |
562 header->iNext=next; |
551 header->iAltSettingSeq=iLdd->iAsSeq; |
563 header->iAltSettingSeq=iLdd->iAsSeq; |
552 header->iAltSetting=iLdd->iAlternateSetting; |
564 header->iAltSetting=iLdd->iAlternateSetting; |
553 header->iFlags=aFlags; |
565 header->iFlags=aFlags; |
554 __KTRACE_OPT(KUSB, Kern::Printf("We set next to 0x%x", next)); |
566 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP5, "We set next to 0x%x", next); |
555 |
567 |
556 iStatusList.iState=ENotRunning; |
568 iStatusList.iState=ENotRunning; |
557 if (next==iBufferStart->iTail) //or (othwise is as good as full) |
569 if (next==iBufferStart->iTail) //or (othwise is as good as full) |
558 { |
570 { |
559 iStalled=next; |
571 iStalled=next; |
560 } |
572 } |
561 else |
573 else |
562 { |
574 { |
563 |
575 |
564 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst StartRead?? ")); |
576 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP6, "TUsbcScBuffer::UpdateBUfferLIst StartRead?? "); |
565 TInt oldHead=iHead; |
577 TInt oldHead=iHead; |
566 iHead = next; |
578 iHead = next; |
567 |
579 |
568 if ((aStartNextRead) && (StartDataRead() == KErrOverflow)) |
580 if ((aStartNextRead) && (StartDataRead() == KErrOverflow)) |
569 { // Oh crumbs, set state as slalled. |
581 { // Oh crumbs, set state as slalled. |
581 } |
593 } |
582 } |
594 } |
583 else |
595 else |
584 { |
596 { |
585 iBufferStart->iHead = next; |
597 iBufferStart->iHead = next; |
586 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::UpdateBUfferLIst Compleating\n")); |
598 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_UPDATEBUFFERLIST_DUP7, "TUsbcScBuffer::UpdateBUfferLIst Compleating\n"); |
599 |
|
587 } |
600 } |
588 // Complete userside |
601 // Complete userside |
589 iStatusList.Complete(); |
602 iStatusList.Complete(); |
590 } |
603 } |
591 } |
604 } |
605 // Add alt setting change packet. |
618 // Add alt setting change packet. |
606 |
619 |
607 |
620 |
608 if (StartDataRead() == KErrOverflow) |
621 if (StartDataRead() == KErrOverflow) |
609 { |
622 { |
610 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::PopStall Warning: Transfer was freed, but still no space!\n")); |
623 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_POPSTALL, "TUsbcScBuffer::PopStall Warning: Transfer was freed, but still no space!\n"); |
624 |
|
611 } |
625 } |
612 |
626 |
613 iBufferStart->iHead = iHead; |
627 iBufferStart->iHead = iHead; |
614 } |
628 } |
615 |
629 |
616 |
630 |
617 |
631 |
618 void TUsbcScBuffer::StartDataWrite() |
632 void TUsbcScBuffer::StartDataWrite() |
619 { |
633 { |
620 |
634 |
621 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite()")); |
635 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCBUFFER_STARTDATAWRITE, "TUsbcScBuffer::StartDataWrite()"); |
636 |
|
622 TUsbcScStatusElement* nextJob = iStatusList.Next(); |
637 TUsbcScStatusElement* nextJob = iStatusList.Next(); |
623 TBool zlpReqd; |
638 TBool zlpReqd; |
624 TInt length; |
639 TInt length; |
625 TUint start; |
640 TUint start; |
626 TUint8* startAddr; |
641 TUint8* startAddr; |
627 TInt maxLength; |
642 TInt maxLength; |
628 TPhysAddr physAddr; |
643 TPhysAddr physAddr; |
629 TInt r; |
644 TInt r; |
630 if (!iMaxPacketSize) |
645 if (!iMaxPacketSize) |
631 { |
646 { |
632 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() - Not Configured")); |
647 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP1, "TUsbcScBuffer::StartDataWrite() - Not Configured"); |
633 return; |
648 return; |
634 } |
649 } |
635 |
650 |
636 if (nextJob == NULL) |
651 if (nextJob == NULL) |
637 { |
652 { |
638 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() - No more jobs d=%d", iDirection)); |
653 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP2, "TUsbcScBuffer::StartDataWrite() - No more jobs d=%d", iDirection); |
639 if (iDirection==KUsbcScBiIn) // assume this is EP0, if this is true. |
654 if (iDirection==KUsbcScBiIn) // assume this is EP0, if this is true. |
640 { |
655 { |
641 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::StartDataWrite() Queue Read on EP0.")); |
656 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP3, "TUsbcScBuffer::StartDataWrite() Queue Read on EP0."); |
642 // Start other read again. |
657 // Start other read again. |
643 iLdd->iBuffers[iLdd->iEP0OutBuff].StartDataRead(); |
658 iLdd->iBuffers[iLdd->iEP0OutBuff].StartDataRead(); |
644 } |
659 } |
645 } |
660 } |
646 else |
661 else |
677 iCallback->SetTxBufferInfo(startAddr, physAddr, length); |
692 iCallback->SetTxBufferInfo(startAddr, physAddr, length); |
678 iCallback->iZlpReqd = zlpReqd; |
693 iCallback->iZlpReqd = zlpReqd; |
679 r = iLdd->iController->SetupWriteBuffer(*iCallback); |
694 r = iLdd->iController->SetupWriteBuffer(*iCallback); |
680 if (r!=KErrNone) |
695 if (r!=KErrNone) |
681 { |
696 { |
682 __KTRACE_OPT(KUSB, Kern::Printf("SetupWriteBUffer Error: %d",r)); |
697 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_STARTDATAWRITE_DUP4, "SetupWriteBUffer Error: %d",r); |
698 |
|
683 iStatusList.Complete(r); |
699 iStatusList.Complete(r); |
684 } |
700 } |
685 } |
701 } |
686 |
702 |
687 } |
703 } |
688 |
704 |
689 void TUsbcScBuffer::CompleteWrite() |
705 void TUsbcScBuffer::CompleteWrite() |
690 { |
706 { |
691 TInt error = iCallback->iError; |
707 TInt error = iCallback->iError; |
692 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::CompleteWrite buff=%x, err=%d",this, error)); |
708 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_COMPLETEWRITE, "TUsbcScBuffer::CompleteWrite buff=%x, err=%d",(TUint)this, error); |
693 iSent+= iCallback->iTxBytes; |
709 iSent+= iCallback->iTxBytes; |
694 |
710 |
695 // More to send? |
711 // More to send? |
696 if (error || iStatusList.iState!=EFramgementInProgress) |
712 if (error || iStatusList.iState!=EFramgementInProgress) |
697 { |
713 { |
737 } |
753 } |
738 } |
754 } |
739 |
755 |
740 void TUsbcScBuffer::SendEp0StatusPacket(TInt aState) |
756 void TUsbcScBuffer::SendEp0StatusPacket(TInt aState) |
741 { |
757 { |
742 __KTRACE_OPT(KUSB, Kern::Printf(" TUsbcScBuffer::SendEp0StatusPacket(%d)", aState)); |
758 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCBUFFER_SENDEP0STATUSPACKET, " TUsbcScBuffer::SendEp0StatusPacket(%d)", aState); |
743 |
759 |
744 // We need to add a packet to the buffer, so we must stop the pending read, and start |
760 // We need to add a packet to the buffer, so we must stop the pending read, and start |
745 // another after we have added out packet. |
761 // another after we have added out packet. |
746 Ep0CancelLddRead(); |
762 Ep0CancelLddRead(); |
747 |
763 |
748 TUint* state = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.i; |
764 TUint* state = ((TUsbcScTransferHeader *) (iHead + iChunkAddr))->iData.i; |
807 return (iLength==0)?NULL:&(iElements[iHead]); |
823 return (iLength==0)?NULL:&(iElements[iHead]); |
808 } |
824 } |
809 |
825 |
810 TInt TUsbcScStatusList ::Add(TRequestStatus* aStatus, TInt aLength, TUint aStart, TUint aFlags) |
826 TInt TUsbcScStatusList ::Add(TRequestStatus* aStatus, TInt aLength, TUint aStart, TUint aFlags) |
811 { |
827 { |
812 __KTRACE_OPT(KUSB,Kern::Printf("Adding request. iLength %d iSize %d", iLength, iSize)); |
828 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_ADD, "Adding request. iLength %d iSize %d", iLength, iSize); |
829 |
|
813 if (iLength<iSize) |
830 if (iLength<iSize) |
814 { |
831 { |
815 TUsbcScStatusElement& e = iElements[((iHead+iLength) & (iSize-1))]; |
832 TUsbcScStatusElement& e = iElements[((iHead+iLength) & (iSize-1))]; |
816 e.iStatus = aStatus; |
833 e.iStatus = aStatus; |
817 e.iLength = aLength; |
834 e.iLength = aLength; |
818 e.iStart = aStart; |
835 e.iStart = aStart; |
819 e.iFlags = aFlags; |
836 e.iFlags = aFlags; |
820 iLength++; |
837 iLength++; |
821 __KTRACE_OPT(KUSB,Kern::Printf("Adding request. new iLength %d", iLength)); |
838 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_ADD_DUP1, "Adding request. new iLength %d", iLength); |
822 |
839 |
823 return KErrNone; |
840 return KErrNone; |
824 } |
841 } |
825 else |
842 else |
826 return KErrInUse; |
843 return KErrInUse; |
827 } |
844 } |
864 |
881 |
865 TInt TUsbcScStatusList::Complete(TInt aError) |
882 TInt TUsbcScStatusList::Complete(TInt aError) |
866 { |
883 { |
867 if (iState==ENotRunning) |
884 if (iState==ENotRunning) |
868 { |
885 { |
869 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScStatusList::Complete() - iState == ENotRunning!")); |
886 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_COMPLETE_TINT, "TUsbcScStatusList::Complete() - iState == ENotRunning!" ); |
887 |
|
870 } |
888 } |
871 else |
889 else |
872 { |
890 { |
873 iState=ENotRunning; |
891 iState=ENotRunning; |
874 if (iLength==0) |
892 if (iLength==0) |
890 |
908 |
891 void TUsbcScStatusList::Complete() |
909 void TUsbcScStatusList::Complete() |
892 { |
910 { |
893 if (iLength==0) |
911 if (iLength==0) |
894 return; |
912 return; |
895 __KTRACE_OPT(KUSB, Kern::Printf("Completing request. iLength %d", iLength)); |
913 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCSTATUSLIST_COMPLETE, "Completing request. iLength %d", iLength); |
896 |
914 |
897 Kern::RequestComplete(iClient, iElements[iHead].iStatus, KErrNone); |
915 Kern::RequestComplete(iClient, iElements[iHead].iStatus, KErrNone); |
898 |
916 |
899 iLength--; |
917 iLength--; |
900 iHead = ((iHead+1) & (iSize-1)); |
918 iHead = ((iHead+1) & (iSize-1)); |
901 } |
919 } |
902 |
|
903 |
|
904 void TUsbcScStatusList::SetClient(DThread& aThread) |
920 void TUsbcScStatusList::SetClient(DThread& aThread) |
905 { |
921 { |
906 iClient = &aThread; |
922 iClient = &aThread; |
907 } |
923 } |
908 |
|
909 |
924 |
910 // End TUsbcScStatusList |
925 // End TUsbcScStatusList |
911 |
926 |
912 /*****************************************************************************\ |
927 /*****************************************************************************\ |
913 * TRealizeInfo * |
928 * TRealizeInfo * |
931 iAlternateSettingList = aAlternateSettingList; |
946 iAlternateSettingList = aAlternateSettingList; |
932 iMaxEndpoints=0; |
947 iMaxEndpoints=0; |
933 iTotalSize =0; |
948 iTotalSize =0; |
934 iTotalBuffers=0; |
949 iTotalBuffers=0; |
935 iAltSettings =0; |
950 iAltSettings =0; |
936 __KTRACE_OPT(KUSB, Kern::Printf("Realize: work out max endpoint")); |
951 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_INIT, "Realize: work out max endpoint" ); |
952 |
|
937 // Work out max endpoints and number of alternate settings. |
953 // Work out max endpoints and number of alternate settings. |
938 |
954 |
939 if (iAlternateSettingList) |
955 if (iAlternateSettingList) |
940 { |
956 { |
941 TUsbcScAlternateSetting* alt = iAlternateSettingList->iHead; |
957 TUsbcScAlternateSetting* alt = iAlternateSettingList->iHead; |
948 alt = alt->iNext; |
964 alt = alt->iNext; |
949 }; |
965 }; |
950 } |
966 } |
951 |
967 |
952 // Alloc some temporary working space for temp endpoint metadata |
968 // Alloc some temporary working space for temp endpoint metadata |
953 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Alloc temp. Maxendpoints %d", iMaxEndpoints)); |
969 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_INIT_DUP1, "Realize: Alloc temp. Maxendpoints %d", iMaxEndpoints); |
970 |
|
954 TInt inout; |
971 TInt inout; |
955 for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++) |
972 for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++) |
956 { |
973 { |
957 iBufs[inout].iEp = (TUsbcScEndpoint **) Kern::AllocZ(iAltSettings*iMaxEndpoints*sizeof(TUsbcScEndpoint *)); |
974 iBufs[inout].iEp = (TUsbcScEndpoint **) Kern::AllocZ(iAltSettings*iMaxEndpoints*sizeof(TUsbcScEndpoint *)); |
958 iBufs[inout].iSizes = (TInt *) Kern::AllocZ(iMaxEndpoints*sizeof(TInt)); |
975 iBufs[inout].iSizes = (TInt *) Kern::AllocZ(iMaxEndpoints*sizeof(TInt)); |
970 // Return KErrArgument if the direction field is neither In or Out. |
987 // Return KErrArgument if the direction field is neither In or Out. |
971 // |
988 // |
972 |
989 |
973 TInt TRealizeInfo::CopyAndSortEndpoints() |
990 TInt TRealizeInfo::CopyAndSortEndpoints() |
974 { |
991 { |
975 __KTRACE_OPT(KUSB, Kern::Printf("Realize: copy And sort")); |
992 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TREALIZEINFO_COPYANDSORTENDPOINTS, "Realize: copy And sort"); |
976 |
993 |
977 TInt altSetting = 0; |
994 TInt altSetting = 0; |
978 TInt endpointOffs; |
995 TInt endpointOffs; |
979 TInt endpoint; |
996 TInt endpoint; |
980 TInt altEp; |
997 TInt altEp; |
985 |
1002 |
986 if (iAlternateSettingList) |
1003 if (iAlternateSettingList) |
987 { |
1004 { |
988 for (alt = iAlternateSettingList->iHead;alt!=NULL;alt = alt->iNext ) |
1005 for (alt = iAlternateSettingList->iHead;alt!=NULL;alt = alt->iNext ) |
989 { |
1006 { |
990 __KTRACE_OPT(KUSB, Kern::Printf("Realize: AlternateSetting %x", alt)); |
1007 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP1, "Realize: AlternateSetting %x", alt); |
991 |
1008 |
992 iBufs[KUsbcScIn].iEps =0; |
1009 iBufs[KUsbcScIn].iEps =0; |
993 iBufs[KUsbcScOut].iEps =0; |
1010 iBufs[KUsbcScOut].iEps =0; |
994 |
1011 |
995 // For alt setting, iterate eps |
1012 // For alt setting, iterate eps |
996 for (altEp=1; altEp <= alt->iNumberOfEndpoints; altEp++) |
1013 for (altEp=1; altEp <= alt->iNumberOfEndpoints; altEp++) |
997 { |
1014 { |
998 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Endpoint to add: %d",altEp)); |
1015 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP2, "Realize: Endpoint to add: %d", altEp); |
999 |
|
1000 TUsbcScEndpoint* nextEp = alt->iEndpoint[altEp]; |
1016 TUsbcScEndpoint* nextEp = alt->iEndpoint[altEp]; |
1001 |
1017 |
1002 __KTRACE_OPT(KUSB, Kern::Printf("Realize: ep Buffer Size: %d",nextEp->EndpointInfo()->iBufferSize)); |
1018 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP3, "Realize: ep Buffer Size: %d",nextEp->EndpointInfo()->iBufferSize); |
1003 |
1019 |
1004 inout = (nextEp->EndpointInfo()->iDir==KUsbEpDirIn)?KUsbcScIn: |
1020 inout = (nextEp->EndpointInfo()->iDir==KUsbEpDirIn)?KUsbcScIn: |
1005 (nextEp->EndpointInfo()->iDir==KUsbEpDirOut)?KUsbcScOut:KUsbcScUnknown; |
1021 (nextEp->EndpointInfo()->iDir==KUsbEpDirOut)?KUsbcScOut:KUsbcScUnknown; |
1006 if (inout==KUsbcScUnknown) |
1022 if (inout==KUsbcScUnknown) |
1007 { |
1023 { |
1008 __KTRACE_OPT(KUSB, Kern::Printf("Realize: KUsbcScUnknown %x",nextEp->EndpointInfo()->iDir)); |
1024 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP4, "Realize: KUsbcScUnknown %x",nextEp->EndpointInfo()->iDir); |
1025 |
|
1009 return KErrArgument; |
1026 return KErrArgument; |
1010 } |
1027 } |
1011 |
1028 |
1012 bufsd = &(iBufs[inout]); |
1029 bufsd = &(iBufs[inout]); |
1013 __KTRACE_OPT(KUSB, Kern::Printf("Realize: ep direction: %x # endpoints %d", inout, bufsd->iEps)); |
1030 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP5, "Realize: ep direction: %x # endpoints %d", inout, bufsd->iEps); |
1014 |
|
1015 |
1031 |
1016 // find and position ep, and insert. |
1032 // find and position ep, and insert. |
1017 |
1033 |
1018 if (bufsd->iEps==0) // First entry. |
1034 if (bufsd->iEps==0) // First entry. |
1019 { |
1035 { |
1020 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Add first endpoint")); |
1036 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP6, "Realize: Add first endpoint"); |
1037 |
|
1021 endpointOffs = altSetting*iMaxEndpoints; |
1038 endpointOffs = altSetting*iMaxEndpoints; |
1022 bufsd->iEp[endpointOffs] = nextEp; |
1039 bufsd->iEp[endpointOffs] = nextEp; |
1023 } |
1040 } |
1024 else |
1041 else |
1025 { |
1042 { |
1028 for (endpoint=bufsd->iEps-1; endpoint>-1; endpoint--) |
1045 for (endpoint=bufsd->iEps-1; endpoint>-1; endpoint--) |
1029 { |
1046 { |
1030 endpointOffs = altSetting*iMaxEndpoints + endpoint; |
1047 endpointOffs = altSetting*iMaxEndpoints + endpoint; |
1031 if (bufsd->iEp[endpointOffs]->EndpointInfo()->iBufferSize < nextEp->EndpointInfo()->iBufferSize) |
1048 if (bufsd->iEp[endpointOffs]->EndpointInfo()->iBufferSize < nextEp->EndpointInfo()->iBufferSize) |
1032 { |
1049 { |
1033 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Shift Endpoint %d", endpoint)); |
1050 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP7, "Realize: Shift Endpoint %d", endpoint); |
1034 |
|
1035 bufsd->iEp[endpointOffs+1] = bufsd->iEp[endpointOffs]; |
1051 bufsd->iEp[endpointOffs+1] = bufsd->iEp[endpointOffs]; |
1036 } |
1052 } |
1037 else |
1053 else |
1038 { |
1054 { |
1039 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Insert After Endpoint %d", endpoint)); |
1055 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_COPYANDSORTENDPOINTS_DUP8, "Realize: Insert After Endpoint %d", endpoint); |
1040 |
|
1041 bufsd->iEp[endpointOffs+1] = nextEp; |
1056 bufsd->iEp[endpointOffs+1] = nextEp; |
1042 placed = ETrue; |
1057 placed = ETrue; |
1043 break; |
1058 break; |
1044 } |
1059 } |
1045 } // end for endpoint |
1060 } // end for endpoint |
1061 // Realize_CopyAndSortEndpoints is used to fill the structure with the informaition |
1076 // Realize_CopyAndSortEndpoints is used to fill the structure with the informaition |
1062 // required. |
1077 // required. |
1063 |
1078 |
1064 void TRealizeInfo::CalcBuffSizes() |
1079 void TRealizeInfo::CalcBuffSizes() |
1065 { |
1080 { |
1066 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Calculate Buffers")); |
1081 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TREALIZEINFO_CALCBUFFSIZES, "Realize: Calculate Buffers" ); |
1067 |
1082 |
1068 TInt endpoint; |
1083 TInt endpoint; |
1069 TInt inout; |
1084 TInt inout; |
1070 TInt altSetting; |
1085 TInt altSetting; |
1071 TUsbcScEndpoint* nextEp; |
1086 TUsbcScEndpoint* nextEp; |
1072 TInt bufferSize; |
1087 TInt bufferSize; |
1073 TEndpointSortBufs* bufsd; |
1088 TEndpointSortBufs* bufsd; |
1074 |
1089 |
1075 for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++) |
1090 for (inout=KUsbcScIn; inout<KUsbcScDirections; inout++) |
1076 { |
1091 { |
1077 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Direction: %d", inout)); |
1092 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP1, "Realize: Direction: %d", inout); |
1078 |
|
1079 |
1093 |
1080 bufsd = &(iBufs[inout]); |
1094 bufsd = &(iBufs[inout]); |
1081 // for each row, ie, buffer, find largest buffer need. |
1095 // for each row, ie, buffer, find largest buffer need. |
1082 for (endpoint=0; endpoint<iMaxEndpoints; endpoint++) |
1096 for (endpoint=0; endpoint<iMaxEndpoints; endpoint++) |
1083 { |
1097 { |
1084 __KTRACE_OPT(KUSB, Kern::Printf("Realize: endpoint %d", endpoint)); |
1098 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP2, "Realize: endpoint %d", endpoint); |
1085 TInt bufMaxSize=0; |
1099 TInt bufMaxSize=0; |
1086 for (altSetting=0; altSetting< iAltSettings; altSetting++) |
1100 for (altSetting=0; altSetting< iAltSettings; altSetting++) |
1087 { |
1101 { |
1088 __KTRACE_OPT(KUSB, Kern::Printf("Realize: altSetting %d", altSetting)); |
1102 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP3, "Realize: altSetting %d", altSetting); |
1089 nextEp= bufsd->iEp[altSetting* iMaxEndpoints + endpoint]; |
1103 nextEp= bufsd->iEp[altSetting* iMaxEndpoints + endpoint]; |
1090 if (nextEp!=NULL) |
1104 if (nextEp!=NULL) |
1091 { |
1105 { |
1092 bufferSize = nextEp->EndpointInfo()->iBufferSize; |
1106 bufferSize = nextEp->EndpointInfo()->iBufferSize; |
1093 __KTRACE_OPT(KUSB, Kern::Printf("Realize: comparing size %d", bufferSize)); |
1107 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP4, "Realize: comparing size %d", bufferSize); |
1094 if (bufferSize> bufMaxSize) |
1108 if (bufferSize> bufMaxSize) |
1095 bufMaxSize = bufferSize; |
1109 bufMaxSize = bufferSize; |
1096 } |
1110 } |
1097 } // for altsetting |
1111 } // for altsetting |
1098 __KTRACE_OPT(KUSB, Kern::Printf("Realize: bufMaxSize %d", bufMaxSize)); |
1112 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_CALCBUFFSIZES_DUP5, "Realize: bufMaxSize %d", bufMaxSize); |
1099 bufsd->iSizes[endpoint] = bufMaxSize; |
1113 bufsd->iSizes[endpoint] = bufMaxSize; |
1100 if (bufMaxSize>0) |
1114 if (bufMaxSize>0) |
1101 { |
1115 { |
1102 iTotalSize += bufsd->iSizes[endpoint]; |
1116 iTotalSize += bufsd->iSizes[endpoint]; |
1103 iTotalBuffers++; |
1117 iTotalBuffers++; |
1146 iAltSettingsTbl->iEpRecordSize = sizeof(TUint); |
1160 iAltSettingsTbl->iEpRecordSize = sizeof(TUint); |
1147 iAltSettingsTbl->iNumOfAltSettings = iAltSettings; |
1161 iAltSettingsTbl->iNumOfAltSettings = iAltSettings; |
1148 |
1162 |
1149 |
1163 |
1150 TInt tableOffset = (TUint) iAltSettingsTbl->iAltTableOffset - (TUint) aChunkInfo->iChunkMem + iAltSettings*sizeof(TInt); |
1164 TInt tableOffset = (TUint) iAltSettingsTbl->iAltTableOffset - (TUint) aChunkInfo->iChunkMem + iAltSettings*sizeof(TInt); |
1151 __KTRACE_OPT(KUSB, Kern::Printf("Realize: table offset: 0x%x, altTble %x iChnkMem %x altSettings %x",tableOffset, iAltSettingsTbl, aChunkInfo->iChunkMem, iAltSettings )); |
1165 OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER, "Realize: table offset: 0x%x, altTble %x iChnkMem %x altSettings %x",tableOffset, (TUint)iAltSettingsTbl, (TUint)aChunkInfo->iChunkMem, iAltSettings); |
1152 |
1166 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER_DUP1, "Realize: populate chunk - create alt settings table"); |
1153 __KTRACE_OPT(KUSB, Kern::Printf("Realize: populate chunk - create alt settings table")); |
|
1154 |
|
1155 // Create alt settings table. Set each element of altsettings table, to each induivatual alt setting table. |
1167 // Create alt settings table. Set each element of altsettings table, to each induivatual alt setting table. |
1156 // then fill in the number of endpoints for that alt setting, in the table. |
1168 // then fill in the number of endpoints for that alt setting, in the table. |
1157 |
1169 |
1158 TInt* noEpForAlt; |
1170 TInt* noEpForAlt; |
1159 TInt altSetting; |
1171 TInt altSetting; |
1161 if (iAlternateSettingList) |
1173 if (iAlternateSettingList) |
1162 { |
1174 { |
1163 alt = iAlternateSettingList->iHead; |
1175 alt = iAlternateSettingList->iHead; |
1164 for (altSetting=0; altSetting<iAltSettings; altSetting++) |
1176 for (altSetting=0; altSetting<iAltSettings; altSetting++) |
1165 { |
1177 { |
1166 __KTRACE_OPT(KUSB, Kern::Printf("Realize: altSetting %d, tableOffset %d", altSetting, tableOffset)); |
1178 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TREALIZEINFO_LAYOUTCHUNKHEADER_DUP2, "Realize: altSetting %d, tableOffset %d", altSetting, tableOffset); |
1167 |
|
1168 iAltSettingsTbl->iAltTableOffset[altSetting] = tableOffset; |
1179 iAltSettingsTbl->iAltTableOffset[altSetting] = tableOffset; |
1169 noEpForAlt = (TInt*) &aChunkInfo->iChunkMem[tableOffset]; |
1180 noEpForAlt = (TInt*) &aChunkInfo->iChunkMem[tableOffset]; |
1170 |
1181 |
1171 *noEpForAlt = alt->iNumberOfEndpoints; // Set NumberofEndpoints field in Altsetting table |
1182 *noEpForAlt = alt->iNumberOfEndpoints; // Set NumberofEndpoints field in Altsetting table |
1172 tableOffset+= sizeof(TInt)+ alt->iNumberOfEndpoints*sizeof(TUsbcScHdrEndpointRecord); |
1183 tableOffset+= sizeof(TInt)+ alt->iNumberOfEndpoints*sizeof(TUsbcScHdrEndpointRecord); |
1213 iChunkInfo(NULL), |
1224 iChunkInfo(NULL), |
1214 iNumBuffers(-1), |
1225 iNumBuffers(-1), |
1215 iBuffers(NULL), |
1226 iBuffers(NULL), |
1216 iEp0Endpoint(NULL) |
1227 iEp0Endpoint(NULL) |
1217 { |
1228 { |
1218 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DLddUsbcScChannel()")); |
1229 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_CONS, "DLddUsbcScChannel::DLddUsbcScChannel()" ); |
1230 |
|
1219 iClient = &Kern::CurrentThread(); |
1231 iClient = &Kern::CurrentThread(); |
1220 iClient->Open(); |
1232 iClient->Open(); |
1221 for (TInt i = 1; i < KUsbcMaxRequests; i++) |
1233 for (TInt i = 1; i < KUsbcMaxRequests; i++) |
1222 { |
1234 { |
1223 iRequestStatus[i] = NULL; |
1235 iRequestStatus[i] = NULL; |
1229 // Destructor |
1241 // Destructor |
1230 // |
1242 // |
1231 |
1243 |
1232 DLddUsbcScChannel::~DLddUsbcScChannel() |
1244 DLddUsbcScChannel::~DLddUsbcScChannel() |
1233 { |
1245 { |
1234 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::~DLddUsbcScChannel()")); |
1246 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES, "DLddUsbcScChannel::~DLddUsbcScChannel()" ); |
1235 if (iController) |
1247 if (iController) |
1236 { |
1248 { |
1237 iController->DeRegisterClient(this); |
1249 iController->DeRegisterClient(this); |
1238 iStatusCallbackInfo.Cancel(); |
1250 iStatusCallbackInfo.Cancel(); |
1239 iEndpointStatusCallbackInfo.Cancel(); |
1251 iEndpointStatusCallbackInfo.Cancel(); |
1250 if (iStatusFifo!=NULL) |
1262 if (iStatusFifo!=NULL) |
1251 { |
1263 { |
1252 delete iStatusFifo; |
1264 delete iStatusFifo; |
1253 } |
1265 } |
1254 } |
1266 } |
1255 __KTRACE_OPT(KUSB, Kern::Printf("Closing buffers")); |
1267 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP1, "Closing buffers" ); |
1256 if (iBuffers) |
1268 if (iBuffers) |
1257 { |
1269 { |
1258 TInt i; |
1270 TInt i; |
1259 for (i=0; i<(iNumBuffers+2); i++) |
1271 for (i=0; i<(iNumBuffers+2); i++) |
1260 { |
1272 { |
1264 } |
1276 } |
1265 |
1277 |
1266 if (iRealizeCalled) |
1278 if (iRealizeCalled) |
1267 { |
1279 { |
1268 // Close Chunk |
1280 // Close Chunk |
1269 __KTRACE_OPT(KUSB, Kern::Printf("iChunkInfo->Close()")); |
1281 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP2, "iChunkInfo->Close()" ); |
1270 iChunkInfo->Close(); |
1282 iChunkInfo->Close(); |
1271 // ChunkInfo will delete itself with DFC, but the pointer here is no longer needed. |
1283 // ChunkInfo will delete itself with DFC, but the pointer here is no longer needed. |
1272 iChunkInfo=NULL; |
1284 iChunkInfo=NULL; |
1273 } |
1285 } |
1274 __KTRACE_OPT(KUSB, Kern::Printf("about to SafeClose")); |
1286 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP3, "about to SafeClose" ); |
1275 Kern::SafeClose((DObject*&)iClient, NULL); |
1287 Kern::SafeClose((DObject*&)iClient, NULL); |
1276 __KTRACE_OPT(KUSB, Kern::Printf("about to SafeClose1")); |
1288 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DLDDUSBCSCCHANNEL_DES_DUP4, "about to SafeClose1" ); |
1277 } |
1289 } |
1278 |
1290 |
1279 |
1291 |
1280 // |
1292 // |
1281 // DoCreate - Create channel |
1293 // DoCreate - Create channel |
1282 // |
1294 // |
1283 |
1295 |
1284 TInt DLddUsbcScChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer) |
1296 TInt DLddUsbcScChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer) |
1285 { |
1297 { |
1286 __KTRACE_OPT(KUSB, Kern::Printf("LDD DoCreateL 1 Ver = %02d %02d %02d", |
1298 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCREATE, "LDD DoCreateL 1 Ver = %02d %02d %02d", |
1287 aVer.iMajor, aVer.iMinor, aVer.iBuild)); |
1299 aVer.iMajor, aVer.iMinor, aVer.iBuild); |
1300 |
|
1288 if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD, |
1301 if (!Kern::CurrentThreadHasCapability(ECapabilityCommDD, |
1289 __PLATSEC_DIAGNOSTIC_STRING("Checked by USBCSC.LDD (USB Driver)"))) |
1302 __PLATSEC_DIAGNOSTIC_STRING("Checked by USBCSC.LDD (USB Driver)"))) |
1290 { |
1303 { |
1291 return KErrPermissionDenied; |
1304 return KErrPermissionDenied; |
1292 } |
1305 } |
1342 |
1355 |
1343 void DLddUsbcScChannel::HandleMsg(TMessageBase* aMsg) |
1356 void DLddUsbcScChannel::HandleMsg(TMessageBase* aMsg) |
1344 { |
1357 { |
1345 TThreadMessage& m = *(TThreadMessage*)aMsg; |
1358 TThreadMessage& m = *(TThreadMessage*)aMsg; |
1346 TInt id = m.iValue; |
1359 TInt id = m.iValue; |
1347 __KTRACE_OPT(KUSB, Kern::Printf("HandleMsg 0x%x", id)); |
1360 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_HANDLEMSG, "HandleMsg 0x%x", id); |
1348 |
1361 |
1349 if (id == (TInt) ECloseMsg) |
1362 if (id == (TInt) ECloseMsg) |
1350 { |
1363 { |
1351 iChannelClosing = ETrue; |
1364 iChannelClosing = ETrue; |
1352 m.Complete(KErrNone, EFalse); |
1365 m.Complete(KErrNone, EFalse); |
1353 return; |
1366 return; |
1354 } |
1367 } |
1355 |
1368 |
1356 TInt r; |
1369 TInt r; |
1357 |
|
1358 if (aMsg->Client() != iClient) |
1370 if (aMsg->Client() != iClient) |
1359 { |
1371 { |
1360 m.Complete(KErrAccessDenied, ETrue); |
1372 m.Complete(KErrAccessDenied, ETrue); |
1361 return; |
1373 return; |
1362 } |
1374 } |
1363 |
|
1364 if (id < 0) |
1375 if (id < 0) |
1365 { |
1376 { |
1366 // DoRequest |
1377 // DoRequest |
1367 TRequestStatus* pS = (TRequestStatus*) m.Ptr0(); |
1378 TRequestStatus* pS = (TRequestStatus*) m.Ptr0(); |
1368 r = DoRequest(~id, pS, m.Ptr1(), m.Ptr2()); |
1379 r = DoRequest(~id, pS, m.Ptr1(), m.Ptr2()); |
1382 } |
1393 } |
1383 } |
1394 } |
1384 // end HandleMsg. |
1395 // end HandleMsg. |
1385 |
1396 |
1386 |
1397 |
1387 #define BREAK_IF_NULL_ARG(a,r) if (a==NULL) { r = KErrArgument; __KTRACE_OPT(KUSB,Kern::Printf("NULL Argument")); break; } |
|
1388 |
|
1389 // |
1398 // |
1390 // DoRequest - Asynchronous requests |
1399 // DoRequest - Asynchronous requests |
1391 // |
1400 // |
1392 // Overrides pure virtual, called by HandleMsg. (Above) |
1401 // Overrides pure virtual, called by HandleMsg. (Above) |
1393 // |
1402 // |
1395 { |
1404 { |
1396 TInt reqNo = aReqNo & RDevUsbcScClient::KFieldIdMask; |
1405 TInt reqNo = aReqNo & RDevUsbcScClient::KFieldIdMask; |
1397 TInt r = KErrNone; // return via request notify |
1406 TInt r = KErrNone; // return via request notify |
1398 TBool needsCompletion =EFalse; |
1407 TBool needsCompletion =EFalse; |
1399 |
1408 |
1400 __KTRACE_OPT(KUSB, Kern::Printf("DoRequest 0x%08x", aReqNo)); |
1409 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST, "DoRequest 0x%08x", aReqNo); |
1401 |
1410 |
1402 if ((reqNo>RDevUsbcScClient::ERequestReadDataNotify) && |
1411 if ((reqNo>RDevUsbcScClient::ERequestReadDataNotify) && |
1403 (reqNo<RDevUsbcScClient::ERequestMaxRequests)) |
1412 (reqNo<RDevUsbcScClient::ERequestMaxRequests)) |
1404 { |
1413 { |
1405 if (iRequestStatus[reqNo]) |
1414 if (iRequestStatus[reqNo]) |
1406 { |
1415 { |
1413 switch (reqNo) |
1422 switch (reqNo) |
1414 { |
1423 { |
1415 case RDevUsbcScClient::ERequestWriteData: |
1424 case RDevUsbcScClient::ERequestWriteData: |
1416 { |
1425 { |
1417 TInt buffer = (aReqNo>>RDevUsbcScClient::KFieldBuffPos)&RDevUsbcScClient::KFieldBuffMask; |
1426 TInt buffer = (aReqNo>>RDevUsbcScClient::KFieldBuffPos)&RDevUsbcScClient::KFieldBuffMask; |
1418 __KTRACE_OPT(KUSB, Kern::Printf("ERequestWriteData")); |
1427 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP1, "ERequestWriteData"); |
1419 BREAK_IF_NULL_ARG(a2,r); |
1428 if (a2 == NULL) |
1429 { |
|
1430 r = KErrArgument; |
|
1431 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP2, "NULL Argument"); |
|
1432 break; |
|
1433 } |
|
1420 |
1434 |
1421 r = DoWriteData( aStatus, buffer, (TInt) a1 /*Start*/, (TInt) a2 /* Length */, |
1435 r = DoWriteData( aStatus, buffer, (TInt) a1 /*Start*/, (TInt) a2 /* Length */, |
1422 aReqNo>>RDevUsbcScClient::KFieldFlagsPos ); // Flags |
1436 aReqNo>>RDevUsbcScClient::KFieldFlagsPos ); // Flags |
1423 break; |
1437 break; |
1424 } |
1438 } |
1425 case RDevUsbcScClient::ERequestReadDataNotify: |
1439 case RDevUsbcScClient::ERequestReadDataNotify: |
1426 { |
1440 { |
1427 __KTRACE_OPT(KUSB, Kern::Printf("ERequestReadDataNotify")); |
1441 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP3, "ERequestReadDataNotify"); |
1428 return DoReadDataNotify(aStatus, (TInt) a1, (TInt) a2); // a1 = aBufferNumber, a2 - aLength; |
1442 return DoReadDataNotify(aStatus, (TInt) a1, (TInt) a2); // a1 = aBufferNumber, a2 - aLength; |
1429 } |
1443 } |
1430 |
1444 |
1431 case RDevUsbcScClient::ERequestAlternateDeviceStatusNotify: |
1445 case RDevUsbcScClient::ERequestAlternateDeviceStatusNotify: |
1432 { |
1446 { |
1433 __KTRACE_OPT(KUSB, Kern::Printf("ERequestAlternateDeviceStatusNotify")); |
1447 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP4, "ERequestAlternateDeviceStatusNotify"); |
1434 BREAK_IF_NULL_ARG(a1,r); |
1448 if (a1 == NULL) |
1449 { |
|
1450 r = KErrArgument; |
|
1451 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP5, "NULL Argument"); |
|
1452 break; |
|
1453 } |
|
1435 iDeviceStatusNeeded = ETrue; |
1454 iDeviceStatusNeeded = ETrue; |
1436 iStatusChangePtr = a1; |
1455 iStatusChangePtr = a1; |
1437 needsCompletion = AlternateDeviceStateTestComplete(); |
1456 needsCompletion = AlternateDeviceStateTestComplete(); |
1438 break; |
1457 break; |
1439 } |
1458 } |
1440 case RDevUsbcScClient::ERequestReEnumerate: |
1459 case RDevUsbcScClient::ERequestReEnumerate: |
1441 { |
1460 { |
1442 __KTRACE_OPT(KUSB, Kern::Printf("ERequestReEnumerate")); |
1461 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP6, "ERequestReEnumerate"); |
1443 // If successful, this will complete via the status notification. |
1462 // If successful, this will complete via the status notification. |
1444 r = iController->ReEnumerate(); |
1463 r = iController->ReEnumerate(); |
1445 break; |
1464 break; |
1446 } |
1465 } |
1447 case RDevUsbcScClient::ERequestEndpointStatusNotify: |
1466 case RDevUsbcScClient::ERequestEndpointStatusNotify: |
1448 { |
1467 { |
1449 __KTRACE_OPT(KUSB, Kern::Printf("ERequestEndpointStatusNotify")); |
1468 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP7, "ERequestEndpointStatusNotify"); |
1450 BREAK_IF_NULL_ARG(a1,r); |
1469 if (a1 == NULL) |
1451 |
1470 { |
1471 r = KErrArgument; |
|
1472 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP8, "NULL Argument"); |
|
1473 break; |
|
1474 } |
|
1452 iEndpointStatusChangePtr = a1; |
1475 iEndpointStatusChangePtr = a1; |
1453 break; |
1476 break; |
1454 } |
1477 } |
1455 case RDevUsbcScClient::ERequestOtgFeaturesNotify: |
1478 case RDevUsbcScClient::ERequestOtgFeaturesNotify: |
1456 { |
1479 { |
1457 __KTRACE_OPT(KUSB, Kern::Printf("ERequestOtgFeaturesNotify")); |
1480 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP9, "ERequestOtgFeaturesNotify"); |
1458 BREAK_IF_NULL_ARG(a1,r); |
1481 if (a1 == NULL) |
1459 |
1482 { |
1483 r = KErrArgument; |
|
1484 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP10, "NULL Argument"); |
|
1485 break; |
|
1486 } |
|
1460 iOtgFeatureChangePtr = a1; |
1487 iOtgFeatureChangePtr = a1; |
1461 break; |
1488 break; |
1462 } |
1489 } |
1463 default: |
1490 default: |
1464 r = KErrNotSupported; |
1491 r = KErrNotSupported; |
1479 // |
1506 // |
1480 // This method sets up the request to facilitate the userside being notifed when new data has been read. |
1507 // This method sets up the request to facilitate the userside being notifed when new data has been read. |
1481 // |
1508 // |
1482 TInt DLddUsbcScChannel::DoReadDataNotify(TRequestStatus* aStatus, TInt aBufferNum, TInt aLength) |
1509 TInt DLddUsbcScChannel::DoReadDataNotify(TRequestStatus* aStatus, TInt aBufferNum, TInt aLength) |
1483 { |
1510 { |
1484 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify(x, %d, 0x%x)", aBufferNum, aLength)); |
1511 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY, " DLddUsbcScChannel::DoReadDataNotify(x, %d, 0x%x)", aBufferNum, aLength); |
1512 |
|
1485 TInt r = KErrNone; |
1513 TInt r = KErrNone; |
1486 // check range |
1514 // check range |
1487 if ((aBufferNum<0) || (aBufferNum>=iNumBuffers)) // Indirectly checks that we are set up. |
1515 if ((aBufferNum<0) || (aBufferNum>=iNumBuffers)) // Indirectly checks that we are set up. |
1488 { |
1516 { |
1489 if (aBufferNum!=KUsbcScEndpointZero) |
1517 if (aBufferNum!=KUsbcScEndpointZero) |
1490 { |
1518 { |
1491 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Number!")); |
1519 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP1, " DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Number!"); |
1520 |
|
1492 return KErrArgument; |
1521 return KErrArgument; |
1493 } |
1522 } |
1494 else |
1523 else |
1495 { |
1524 { |
1496 aBufferNum = iEP0OutBuff; |
1525 aBufferNum = iEP0OutBuff; |
1499 else |
1528 else |
1500 { |
1529 { |
1501 // check direction |
1530 // check direction |
1502 if (iBuffers[aBufferNum].iDirection!=KUsbcScOut) |
1531 if (iBuffers[aBufferNum].iDirection!=KUsbcScOut) |
1503 { |
1532 { |
1504 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Direction!")); |
1533 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP2, " DLddUsbcScChannel::DoReadDataNotify : Bad Buffer Direction!"); |
1505 return KErrNotSupported; |
1534 return KErrNotSupported; |
1506 } |
1535 } |
1507 if (!Configured()) |
1536 if (!Configured()) |
1508 return KErrUsbInterfaceNotReady; |
1537 return KErrUsbInterfaceNotReady; |
1509 } |
1538 } |
1510 SUsbcScBufferHeader* scBuffer = (SUsbcScBufferHeader*) iBuffers[aBufferNum].iBufferStart; |
1539 SUsbcScBufferHeader* scBuffer = (SUsbcScBufferHeader*) iBuffers[aBufferNum].iBufferStart; |
1511 |
1540 |
1512 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoReadDataNotify head %x tail %x", iBuffers[aBufferNum].iHead , scBuffer->iTail )); |
1541 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP3, " DLddUsbcScChannel::DoReadDataNotify head %x tail %x", iBuffers[aBufferNum].iHead , scBuffer->iTail); |
1513 |
|
1514 if (iBuffers[aBufferNum].iHead != scBuffer->iBilTail) |
1542 if (iBuffers[aBufferNum].iHead != scBuffer->iBilTail) |
1515 r = KErrCompletion; |
1543 r = KErrCompletion; |
1516 else |
1544 else |
1517 if (iBuffers[aBufferNum].iStalled) |
1545 if (iBuffers[aBufferNum].iStalled) |
1518 { |
1546 { |
1526 { |
1554 { |
1527 iBuffers[aBufferNum].StartDataRead(); |
1555 iBuffers[aBufferNum].StartDataRead(); |
1528 } |
1556 } |
1529 else |
1557 else |
1530 { |
1558 { |
1531 __KTRACE_OPT(KUSB, Kern::Printf("Job in Progress!")); |
1559 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREADDATANOTIFY_DUP4, "Job in Progress!"); |
1532 } |
1560 } |
1533 return r; |
1561 return r; |
1534 } |
1562 } |
1535 // end DoReadDataNotify. |
1563 // end DoReadDataNotify. |
1536 |
1564 |
1541 // |
1569 // |
1542 // This method sets up the request to write data to USB from userside. |
1570 // This method sets up the request to write data to USB from userside. |
1543 // |
1571 // |
1544 TInt DLddUsbcScChannel::DoWriteData(TRequestStatus* aStatus,TInt aBufferNum, TUint aStart, TUint aLength, TUint aFlags) |
1572 TInt DLddUsbcScChannel::DoWriteData(TRequestStatus* aStatus,TInt aBufferNum, TUint aStart, TUint aLength, TUint aFlags) |
1545 { |
1573 { |
1546 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData(%d, 0x%x, 0x%x, 0x%x)", aBufferNum, aStart, aLength, aFlags)); |
1574 OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA, " DLddUsbcScChannel::DoWriteData(%d, 0x%x, 0x%x, 0x%x)", aBufferNum, aStart, aLength, aFlags); |
1575 |
|
1547 if (!iUserKnowsAltSetting) |
1576 if (!iUserKnowsAltSetting) |
1548 return KErrEof; |
1577 return KErrEof; |
1549 // Check Buffer Number |
1578 // Check Buffer Number |
1550 if ((aBufferNum<0) || (aBufferNum>=iNumBuffers)) |
1579 if ((aBufferNum<0) || (aBufferNum>=iNumBuffers)) |
1551 { |
1580 { |
1552 if ((TUint)aBufferNum!=RDevUsbcScClient::KFieldBuffMask) // KUsbcScEndpointZero & KFieldBuffMas = KFieldBuffMas; |
1581 if ((TUint)aBufferNum!=RDevUsbcScClient::KFieldBuffMask) // KUsbcScEndpointZero & KFieldBuffMas = KFieldBuffMas; |
1553 { |
1582 { |
1554 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData : Bad Buffer Number!")); |
1583 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP1, " DLddUsbcScChannel::DoWriteData : Bad Buffer Number!"); |
1555 return KErrArgument; |
1584 return KErrArgument; |
1556 } |
1585 } |
1557 else |
1586 else |
1558 { |
1587 { |
1559 aBufferNum = iEP0InBuff; |
1588 aBufferNum = iEP0InBuff; |
1562 else |
1591 else |
1563 { |
1592 { |
1564 // check direction |
1593 // check direction |
1565 if (iBuffers[aBufferNum].iDirection!=KUsbcScIn) |
1594 if (iBuffers[aBufferNum].iDirection!=KUsbcScIn) |
1566 { |
1595 { |
1567 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData Bad endpoint Direction")); |
1596 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP2, " DLddUsbcScChannel::DoWriteData Bad endpoint Direction"); |
1568 return KErrArgument; |
1597 return KErrArgument; |
1569 } |
1598 } |
1570 } |
1599 } |
1571 |
1600 |
1572 TUsbcScBuffer& buf=iBuffers[aBufferNum]; |
1601 TUsbcScBuffer& buf=iBuffers[aBufferNum]; |
1573 |
1602 |
1574 if ((aStart< (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr)) || ((aStart+aLength)>iBuffers[aBufferNum].iBufferEnd)) |
1603 if ((aStart< (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr)) || ((aStart+aLength)>iBuffers[aBufferNum].iBufferEnd)) |
1575 { |
1604 { |
1576 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DoWriteData Bad Range aStart or aLength 0x%x > 0x%x + 0x%x < 0x%x", (((TLinAddr) buf.iBufferStart)-buf.iChunkAddr),aStart, aLength, iBuffers[aBufferNum].iBufferEnd )); |
1605 OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP3, "DLddUsbcScChannel::DoWriteData Bad Range aStart or aLength 0x%x > 0x%x + 0x%x < 0x%x", (TInt)(((TLinAddr) buf.iBufferStart)-buf.iChunkAddr),aStart, aLength, iBuffers[aBufferNum].iBufferEnd); |
1577 return KErrArgument; |
1606 return KErrArgument; |
1578 } |
1607 } |
1579 |
1608 |
1580 if ( (aBufferNum != iEP0InBuff) && !Configured()) |
1609 if ( (aBufferNum != iEP0InBuff) && !Configured()) |
1581 return KErrUsbInterfaceNotReady; |
1610 return KErrUsbInterfaceNotReady; |
1582 |
1611 |
1583 if (aStart & ~buf.iAlignMask) |
1612 if (aStart & ~buf.iAlignMask) |
1584 { |
1613 { |
1585 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScBuffer::DoDataWrite: address 0x%x unaligned.",aStart)); |
1614 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP4, "TUsbcScBuffer::DoDataWrite: address 0x%x unaligned.",aStart); |
1615 |
|
1586 return KErrArgument; |
1616 return KErrArgument; |
1587 } |
1617 } |
1588 |
1618 |
1589 TInt r = iBuffers[aBufferNum].iStatusList.Add(aStatus, aLength, aStart, aFlags); //update |
1619 TInt r = iBuffers[aBufferNum].iStatusList.Add(aStatus, aLength, aStart, aFlags); //update |
1590 |
1620 |
1592 { |
1622 { |
1593 iBuffers[aBufferNum].StartDataWrite(); |
1623 iBuffers[aBufferNum].StartDataWrite(); |
1594 } |
1624 } |
1595 else |
1625 else |
1596 { |
1626 { |
1597 __KTRACE_OPT(KUSB, Kern::Printf("Job in Progress!")); |
1627 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOWRITEDATA_DUP5, "Job in Progress!"); |
1598 } |
1628 } |
1599 |
1629 |
1600 |
1630 |
1601 return r; |
1631 return r; |
1602 } |
1632 } |
1609 TInt DLddUsbcScChannel::DoCancel(TInt aReqNo, TUint aBuff, TUint aSpair) |
1639 TInt DLddUsbcScChannel::DoCancel(TInt aReqNo, TUint aBuff, TUint aSpair) |
1610 { |
1640 { |
1611 TInt r = KErrNone; |
1641 TInt r = KErrNone; |
1612 TInt direction=KUsbcScOut; |
1642 TInt direction=KUsbcScOut; |
1613 |
1643 |
1614 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel: 0x%x aBuff 0x%x", aReqNo, aBuff)); |
1644 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL, "DoCancel: 0x%x aBuff 0x%x", aReqNo, aBuff); |
1645 |
|
1615 switch (aReqNo) |
1646 switch (aReqNo) |
1616 { |
1647 { |
1617 case RDevUsbcScClient::ERequestCancel: |
1648 case RDevUsbcScClient::ERequestCancel: |
1618 TInt buffer; |
1649 TInt buffer; |
1619 TInt mask; |
1650 TInt mask; |
1626 |
1657 |
1627 // coverity[missing_break] |
1658 // coverity[missing_break] |
1628 case RDevUsbcScClient::ERequestWriteDataCancel: |
1659 case RDevUsbcScClient::ERequestWriteDataCancel: |
1629 direction = KUsbcScIn; |
1660 direction = KUsbcScIn; |
1630 case RDevUsbcScClient::ERequestReadDataNotifyCancel: |
1661 case RDevUsbcScClient::ERequestReadDataNotifyCancel: |
1631 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Direction %d endpoints: 0x%x",direction, aReqNo)); |
1662 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP1, "DoCancel Direction %d endpoints: 0x%x", direction, aReqNo); |
1632 |
|
1633 if (((TInt)aBuff)==KUsbcScEndpointZero) // EP0 is bi-directional, so pick correct buffer for call type |
1663 if (((TInt)aBuff)==KUsbcScEndpointZero) // EP0 is bi-directional, so pick correct buffer for call type |
1634 { |
1664 { |
1635 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Cancel Endpoint 0/%d",direction)); |
1665 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP2, "DoCancel Cancel Endpoint 0/%d",direction); |
1636 iEp0Endpoint->AbortTransfer(); |
1666 iEp0Endpoint->AbortTransfer(); |
1637 if (direction==KUsbcScIn) |
1667 if (direction==KUsbcScIn) |
1638 aBuff=iEP0InBuff; |
1668 aBuff=iEP0InBuff; |
1639 else |
1669 else |
1640 aBuff=iEP0OutBuff; |
1670 aBuff=iEP0OutBuff; |
1641 } |
1671 } |
1642 else if ((TInt)aBuff >= iNumBuffers) // check buff no range. |
1672 else if ((TInt)aBuff >= iNumBuffers) // check buff no range. |
1643 { |
1673 { |
1644 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Error: Bad buffer number")); |
1674 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP3, "DoCancel Error: Bad buffer number"); |
1645 return KErrArgument; |
1675 return KErrArgument; |
1646 } |
1676 } |
1647 |
1677 |
1648 if ((iBuffers[aBuff].iDirection&1)!=direction) // Does direction match call type? |
1678 if ((iBuffers[aBuff].iDirection&1)!=direction) // Does direction match call type? |
1649 { |
1679 { |
1650 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Error: Bad buffer direction")); |
1680 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP4, "DoCancel Error: Bad buffer direction"); |
1651 return KErrArgument; |
1681 return KErrArgument; |
1652 } |
1682 } |
1653 iBuffers[aBuff].iStatusList.CancelQueued(); |
1683 iBuffers[aBuff].iStatusList.CancelQueued(); |
1654 iBuffers[aBuff].Cancel(KErrCancel); |
1684 iBuffers[aBuff].Cancel(KErrCancel); |
1655 |
1685 |
1656 return KErrNone; |
1686 return KErrNone; |
1657 |
1687 |
1658 case RDevUsbcScClient::ERequestAlternateDeviceStatusNotifyCancel: |
1688 case RDevUsbcScClient::ERequestAlternateDeviceStatusNotifyCancel: |
1659 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo)); |
1689 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP5, "DoCancel: ERequestAlternateDeviceStatusNotify 0x%x", aReqNo); |
1660 iDeviceStatusNeeded = EFalse; |
1690 iDeviceStatusNeeded = EFalse; |
1661 iStatusFifo->FlushQueue(); |
1691 iStatusFifo->FlushQueue(); |
1662 if (iStatusChangePtr) |
1692 if (iStatusChangePtr) |
1663 { |
1693 { |
1664 TInt deviceState = iController->GetDeviceStatus(); |
1694 TInt deviceState = iController->GetDeviceStatus(); |
1668 iStatusChangePtr = NULL; |
1698 iStatusChangePtr = NULL; |
1669 } |
1699 } |
1670 break; |
1700 break; |
1671 |
1701 |
1672 case RDevUsbcScClient::ERequestReEnumerateCancel: |
1702 case RDevUsbcScClient::ERequestReEnumerateCancel: |
1673 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestReEnumerate: 0x%x", aReqNo)); |
1703 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP6, "DoCancel ERequestReEnumerate: 0x%x", aReqNo); |
1674 break; |
1704 break; |
1675 |
1705 |
1676 case RDevUsbcScClient::ERequestEndpointStatusNotifyCancel: |
1706 case RDevUsbcScClient::ERequestEndpointStatusNotifyCancel: |
1677 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo)); |
1707 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP7, "DoCancel ERequestEndpointStatusNotify: 0x%x", aReqNo); |
1678 CancelNotifyEndpointStatus(); |
1708 CancelNotifyEndpointStatus(); |
1679 break; |
1709 break; |
1680 |
1710 |
1681 case RDevUsbcScClient::ERequestOtgFeaturesNotifyCancel: |
1711 case RDevUsbcScClient::ERequestOtgFeaturesNotifyCancel: |
1682 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo)); |
1712 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP8, "DoCancel ERequestOtgFeaturesNotify: 0x%x", aReqNo); |
1683 CancelNotifyOtgFeatures(); |
1713 CancelNotifyOtgFeatures(); |
1684 break; |
1714 break; |
1685 |
1715 |
1686 default: |
1716 default: |
1687 __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo)); |
1717 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCANCEL_DUP9, "DoCancel Unknown! 0x%x", aReqNo); |
1688 return KErrArgument; |
1718 return KErrArgument; |
1689 } |
1719 } |
1690 |
1720 |
1691 Kern::RequestComplete(iClient,iRequestStatus[aReqNo & ~RDevUsbcScClient::ERequestCancel], KErrCancel); |
1721 Kern::RequestComplete(iClient,iRequestStatus[aReqNo & ~RDevUsbcScClient::ERequestCancel], KErrCancel); |
1692 return r; |
1722 return r; |
1732 // |
1762 // |
1733 // Called from HandleMsg. |
1763 // Called from HandleMsg. |
1734 |
1764 |
1735 TInt DLddUsbcScChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2) |
1765 TInt DLddUsbcScChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2) |
1736 { |
1766 { |
1737 __KTRACE_OPT(KUSB, Kern::Printf("DoControl: %d", aFunction)); |
1767 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL, "DoControl: %d", aFunction); |
1738 |
1768 |
1739 TInt r = KErrNone; |
1769 TInt r = KErrNone; |
1740 TInt ep, param; |
1770 TInt ep, param; |
1741 TUsbcScEndpoint* pEndpoint; |
1771 TUsbcScEndpoint* pEndpoint; |
1742 TPtrC8 pZeroDesc(NULL, 0); |
1772 TPtrC8 pZeroDesc(NULL, 0); |
1743 TEndpointDescriptorInfo epInfo; |
1773 TEndpointDescriptorInfo epInfo; |
1746 TUsbcEndpointResource epRes; |
1776 TUsbcEndpointResource epRes; |
1747 |
1777 |
1748 switch (aFunction) |
1778 switch (aFunction) |
1749 { |
1779 { |
1750 case RDevUsbcScClient::EControlEndpointZeroRequestError: |
1780 case RDevUsbcScClient::EControlEndpointZeroRequestError: |
1751 __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroRequestError")); |
1781 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP1, "EControlEndpointZeroRequestError"); |
1752 r = KErrNone; |
1782 r = KErrNone; |
1753 if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)) |
1783 if (iOwnsDeviceControl || (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured)) |
1754 { |
1784 { |
1755 iController->Ep0Stall(this); |
1785 iController->Ep0Stall(this); |
1756 } |
1786 } |
1762 r = KErrUsbInterfaceNotReady; |
1792 r = KErrUsbInterfaceNotReady; |
1763 } |
1793 } |
1764 break; |
1794 break; |
1765 |
1795 |
1766 case RDevUsbcScClient::EControlGetAlternateSetting: |
1796 case RDevUsbcScClient::EControlGetAlternateSetting: |
1767 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetAlternateSetting")); |
1797 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP2, "EControlGetAlternateSetting"); |
1768 if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured) |
1798 if (iValidInterface && iDeviceState == EUsbcDeviceStateConfigured) |
1769 { |
1799 { |
1770 r = iController->GetInterfaceNumber(this, param); |
1800 r = iController->GetInterfaceNumber(this, param); |
1771 if (r == KErrNone) |
1801 if (r == KErrNone) |
1772 { |
1802 { |
1783 r = KErrUsbInterfaceNotReady; |
1813 r = KErrUsbInterfaceNotReady; |
1784 } |
1814 } |
1785 break; |
1815 break; |
1786 |
1816 |
1787 case RDevUsbcScClient::EControlDeviceStatus: |
1817 case RDevUsbcScClient::EControlDeviceStatus: |
1788 __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceStatus")); |
1818 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP3, "EControlDeviceStatus"); |
1789 param = iController->GetDeviceStatus(); |
1819 param = iController->GetDeviceStatus(); |
1790 r = Kern::ThreadRawWrite(iClient, a1, ¶m, sizeof(param), iClient); |
1820 r = Kern::ThreadRawWrite(iClient, a1, ¶m, sizeof(param), iClient); |
1791 if (r != KErrNone) |
1821 if (r != KErrNone) |
1792 PanicClientThread(r); |
1822 PanicClientThread(r); |
1793 break; |
1823 break; |
1794 |
1824 |
1795 case RDevUsbcScClient::EControlEndpointStatus: |
1825 case RDevUsbcScClient::EControlEndpointStatus: |
1796 __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointStatus")); |
1826 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP4, "EControlEndpointStatus"); |
1797 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1827 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1798 { |
1828 { |
1799 pEndpoint = iEndpoint[(TInt)a1]; |
1829 pEndpoint = iEndpoint[(TInt)a1]; |
1800 if (pEndpoint == NULL) |
1830 if (pEndpoint == NULL) |
1801 r = KErrNotSupported; |
1831 r = KErrNotSupported; |
1815 r = KErrUsbInterfaceNotReady; |
1845 r = KErrUsbInterfaceNotReady; |
1816 } |
1846 } |
1817 break; |
1847 break; |
1818 |
1848 |
1819 case RDevUsbcScClient::EControlEndpointCaps: |
1849 case RDevUsbcScClient::EControlEndpointCaps: |
1820 __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointCaps")); |
1850 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP5, "EControlEndpointCaps"); |
1821 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1851 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1822 if (r != KErrNone) |
1852 if (r != KErrNone) |
1823 PanicClientThread(r); |
1853 PanicClientThread(r); |
1824 iController->EndpointCaps(this, *((TDes8*) a1)); |
1854 iController->EndpointCaps(this, *((TDes8*) a1)); |
1825 break; |
1855 break; |
1826 |
1856 |
1827 case RDevUsbcScClient::EControlDeviceCaps: |
1857 case RDevUsbcScClient::EControlDeviceCaps: |
1828 __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceCaps")); |
1858 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP6, "EControlDeviceCaps"); |
1829 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1859 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1830 if (r != KErrNone) |
1860 if (r != KErrNone) |
1831 PanicClientThread(r); |
1861 PanicClientThread(r); |
1832 iController->DeviceCaps(this, *((TDes8*) a1)); |
1862 iController->DeviceCaps(this, *((TDes8*) a1)); |
1833 break; |
1863 break; |
1834 |
1864 |
1835 case RDevUsbcScClient::EControlSendEp0StatusPacket: |
1865 case RDevUsbcScClient::EControlSendEp0StatusPacket: |
1836 __KTRACE_OPT(KUSB, Kern::Printf("EControlSendEp0StatusPacket")); |
1866 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP7, "EControlSendEp0StatusPacket"); |
1837 iController->SendEp0StatusPacket(this); |
1867 iController->SendEp0StatusPacket(this); |
1838 break; |
1868 break; |
1839 |
1869 |
1840 case RDevUsbcScClient::EControlHaltEndpoint: |
1870 case RDevUsbcScClient::EControlHaltEndpoint: |
1841 __KTRACE_OPT(KUSB, Kern::Printf("EControlHaltEndpoint")); |
1871 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP8, "EControlHaltEndpoint"); |
1842 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1872 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1843 { |
1873 { |
1844 r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber()); |
1874 r = iController->HaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber()); |
1845 } |
1875 } |
1846 else |
1876 else |
1851 r = KErrUsbInterfaceNotReady; |
1881 r = KErrUsbInterfaceNotReady; |
1852 } |
1882 } |
1853 break; |
1883 break; |
1854 |
1884 |
1855 case RDevUsbcScClient::EControlClearHaltEndpoint: |
1885 case RDevUsbcScClient::EControlClearHaltEndpoint: |
1856 __KTRACE_OPT(KUSB, Kern::Printf("EControlClearHaltEndpoint")); |
1886 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP9, "EControlClearHaltEndpoint"); |
1857 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1887 if (iValidInterface && ValidEndpoint((TInt) a1)) |
1858 { |
1888 { |
1859 r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber()); |
1889 r = iController->ClearHaltEndpoint(this, iEndpoint[(TInt)a1]->RealEpNumber()); |
1860 } |
1890 } |
1861 else |
1891 else |
1866 r = KErrUsbInterfaceNotReady; |
1896 r = KErrUsbInterfaceNotReady; |
1867 } |
1897 } |
1868 break; |
1898 break; |
1869 |
1899 |
1870 case RDevUsbcScClient::EControlDumpRegisters: |
1900 case RDevUsbcScClient::EControlDumpRegisters: |
1871 __KTRACE_OPT(KUSB, Kern::Printf("EControlDumpRegisters")); |
1901 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP10, "EControlDumpRegisters"); |
1872 iController->DumpRegisters(); |
1902 iController->DumpRegisters(); |
1873 break; |
1903 break; |
1874 |
1904 |
1875 case RDevUsbcScClient::EControlReleaseDeviceControl: |
1905 case RDevUsbcScClient::EControlReleaseDeviceControl: |
1876 __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseDeviceControl")); |
1906 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP11, "EControlReleaseDeviceControl"); |
1877 iController->ReleaseDeviceControl(this); |
1907 iController->ReleaseDeviceControl(this); |
1878 iOwnsDeviceControl = EFalse; |
1908 iOwnsDeviceControl = EFalse; |
1879 break; |
1909 break; |
1880 |
1910 |
1881 case RDevUsbcScClient::EControlEndpointZeroMaxPacketSizes: |
1911 case RDevUsbcScClient::EControlEndpointZeroMaxPacketSizes: |
1882 __KTRACE_OPT(KUSB, Kern::Printf("EControlEndpointZeroMaxPacketSizes")); |
1912 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP12, "EControlEndpointZeroMaxPacketSizes"); |
1883 r = iController->EndpointZeroMaxPacketSizes(); |
1913 r = iController->EndpointZeroMaxPacketSizes(); |
1884 break; |
1914 break; |
1885 |
1915 |
1886 case RDevUsbcScClient::EControlSetEndpointZeroMaxPacketSize: |
1916 case RDevUsbcScClient::EControlSetEndpointZeroMaxPacketSize: |
1887 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointZeroMaxPacketSize")); |
1917 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP13, "EControlSetEndpointZeroMaxPacketSize"); |
1888 r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1)); |
1918 r = iController->SetEndpointZeroMaxPacketSize(reinterpret_cast<TInt>(a1)); |
1889 break; |
1919 break; |
1890 |
1920 |
1891 case RDevUsbcScClient::EControlGetEndpointZeroMaxPacketSize: |
1921 case RDevUsbcScClient::EControlGetEndpointZeroMaxPacketSize: |
1892 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointZeroMaxPacketSize")); |
1922 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP14, "EControlGetEndpointZeroMaxPacketSize"); |
1893 r = iController->Ep0PacketSize(); |
1923 r = iController->Ep0PacketSize(); |
1894 break; |
1924 break; |
1895 |
1925 |
1896 case RDevUsbcScClient::EControlGetDeviceDescriptor: |
1926 case RDevUsbcScClient::EControlGetDeviceDescriptor: |
1897 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptor")); |
1927 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP15, "EControlGetDeviceDescriptor"); |
1898 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1928 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1899 if (r != KErrNone) |
1929 if (r != KErrNone) |
1900 PanicClientThread(r); |
1930 PanicClientThread(r); |
1901 r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1)); |
1931 r = iController->GetDeviceDescriptor(iClient, *((TDes8*) a1)); |
1902 break; |
1932 break; |
1903 |
1933 |
1904 case RDevUsbcScClient::EControlSetDeviceDescriptor: |
1934 case RDevUsbcScClient::EControlSetDeviceDescriptor: |
1905 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceDescriptor")); |
1935 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP16, "EControlSetDeviceDescriptor"); |
1906 BREAK_IF_NULL_ARG(a1,r); |
1936 if (a1 == NULL) |
1937 { |
|
1938 r = KErrArgument; |
|
1939 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP17, "NULL Argument"); |
|
1940 break; |
|
1941 } |
|
1907 r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1)); |
1942 r = iController->SetDeviceDescriptor(iClient, *((TDes8*) a1)); |
1908 break; |
1943 break; |
1909 |
1944 |
1910 case RDevUsbcScClient::EControlGetDeviceDescriptorSize: |
1945 case RDevUsbcScClient::EControlGetDeviceDescriptorSize: |
1911 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceDescriptorSize")); |
1946 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP18, "EControlGetDeviceDescriptorSize"); |
1912 BREAK_IF_NULL_ARG(a1,r); |
1947 if (a1 == NULL) |
1948 { |
|
1949 r = KErrArgument; |
|
1950 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP19, "NULL Argument"); |
|
1951 break; |
|
1952 } |
|
1913 r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1)); |
1953 r = iController->GetDeviceDescriptorSize(iClient, *((TDes8*) a1)); |
1914 break; |
1954 break; |
1915 |
1955 |
1916 case RDevUsbcScClient::EControlGetConfigurationDescriptor: |
1956 case RDevUsbcScClient::EControlGetConfigurationDescriptor: |
1917 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptor")); |
1957 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP20, "EControlGetConfigurationDescriptor"); |
1918 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient); |
1958 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient); |
1919 if (r != KErrNone) |
1959 if (r != KErrNone) |
1920 PanicClientThread(r); |
1960 PanicClientThread(r); |
1921 r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1)); |
1961 r = iController->GetConfigurationDescriptor(iClient, *((TDes8*) a1)); |
1922 break; |
1962 break; |
1923 |
1963 |
1924 case RDevUsbcScClient::EControlGetConfigurationDescriptorSize: |
1964 case RDevUsbcScClient::EControlGetConfigurationDescriptorSize: |
1925 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationDescriptorSize")); |
1965 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP21, "EControlGetConfigurationDescriptorSize"); |
1926 if (a1 != NULL) |
1966 if (a1 != NULL) |
1927 { |
1967 { |
1928 r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1)); |
1968 r = iController->GetConfigurationDescriptorSize(iClient, *((TDes8*) a1)); |
1929 } |
1969 } |
1930 else |
1970 else |
1931 r = KErrArgument; |
1971 r = KErrArgument; |
1932 break; |
1972 break; |
1933 |
1973 |
1934 case RDevUsbcScClient::EControlSetConfigurationDescriptor: |
1974 case RDevUsbcScClient::EControlSetConfigurationDescriptor: |
1935 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationDescriptor")); |
1975 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP22, "EControlSetConfigurationDescriptor"); |
1936 r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1)); |
1976 r = iController->SetConfigurationDescriptor(iClient, *((TDes8*) a1)); |
1937 break; |
1977 break; |
1938 |
1978 |
1939 case RDevUsbcScClient::EControlGetInterfaceDescriptor: |
1979 case RDevUsbcScClient::EControlGetInterfaceDescriptor: |
1940 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptor")); |
1980 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP23, "EControlGetInterfaceDescriptor"); |
1941 r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2)); |
1981 r = iController->GetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2)); |
1942 break; |
1982 break; |
1943 |
1983 |
1944 case RDevUsbcScClient::EControlGetInterfaceDescriptorSize: |
1984 case RDevUsbcScClient::EControlGetInterfaceDescriptorSize: |
1945 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetInterfaceDescriptorSize")); |
1985 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP24, "EControlGetInterfaceDescriptorSize"); |
1946 r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2); |
1986 r = iController->GetInterfaceDescriptorSize(iClient, this, (TInt) a1, *(TDes8*) a2); |
1947 break; |
1987 break; |
1948 |
1988 |
1949 case RDevUsbcScClient::EControlSetInterfaceDescriptor: |
1989 case RDevUsbcScClient::EControlSetInterfaceDescriptor: |
1950 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterfaceDescriptor")); |
1990 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP25, "EControlSetInterfaceDescriptor"); |
1951 r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2)); |
1991 r = iController->SetInterfaceDescriptor(iClient, this, (TInt) a1, *((TDes8*) a2)); |
1952 break; |
1992 break; |
1953 |
1993 |
1954 case RDevUsbcScClient::EControlGetEndpointDescriptor: |
1994 case RDevUsbcScClient::EControlGetEndpointDescriptor: |
1955 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptor")); |
1995 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP26, "EControlGetEndpointDescriptor"); |
1956 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
1996 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
1957 if (r != KErrNone) |
1997 if (r != KErrNone) |
1958 PanicClientThread(r); |
1998 PanicClientThread(r); |
1959 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
1999 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
1960 r = (ep<0)?ep:iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting, |
2000 r = (ep<0)?ep:iController->GetEndpointDescriptor(iClient, this, epInfo.iSetting, |
1961 ep, *(TDes8*) epInfo.iArg); |
2001 ep, *(TDes8*) epInfo.iArg); |
1962 break; |
2002 break; |
1963 |
2003 |
1964 case RDevUsbcScClient::EControlGetEndpointDescriptorSize: |
2004 case RDevUsbcScClient::EControlGetEndpointDescriptorSize: |
1965 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetEndpointDescriptorSize")); |
2005 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP27, "EControlGetEndpointDescriptorSize"); |
1966 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2006 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
1967 if (r != KErrNone) |
2007 if (r != KErrNone) |
1968 PanicClientThread(r); |
2008 PanicClientThread(r); |
1969 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2009 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
1970 r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting, |
2010 r = iController->GetEndpointDescriptorSize(iClient, this, epInfo.iSetting, |
1971 ep, *(TDes8*) epInfo.iArg); |
2011 ep, *(TDes8*) epInfo.iArg); |
1972 break; |
2012 break; |
1973 |
2013 |
1974 case RDevUsbcScClient::EControlSetEndpointDescriptor: |
2014 case RDevUsbcScClient::EControlSetEndpointDescriptor: |
1975 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetEndpointDescriptor")); |
2015 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP28, "EControlSetEndpointDescriptor"); |
1976 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2016 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
1977 if (r != KErrNone) |
2017 if (r != KErrNone) |
1978 PanicClientThread(r); |
2018 PanicClientThread(r); |
1979 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2019 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
1980 r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting, |
2020 r = iController->SetEndpointDescriptor(iClient, this, epInfo.iSetting, |
1981 ep, *(TDes8*)epInfo.iArg); |
2021 ep, *(TDes8*)epInfo.iArg); |
1982 break; |
2022 break; |
1983 |
2023 |
1984 case RDevUsbcScClient::EControlGetDeviceQualifierDescriptor: |
2024 case RDevUsbcScClient::EControlGetDeviceQualifierDescriptor: |
1985 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetDeviceQualifierDescriptor")); |
2025 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP29, "EControlGetDeviceQualifierDescriptor"); |
1986 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
2026 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0, 0, iClient); |
1987 if (r != KErrNone) |
2027 if (r != KErrNone) |
1988 PanicClientThread(r); |
2028 PanicClientThread(r); |
1989 r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1)); |
2029 r = iController->GetDeviceQualifierDescriptor(iClient, *((TDes8*) a1)); |
1990 break; |
2030 break; |
1991 |
2031 |
1992 case RDevUsbcScClient::EControlSetDeviceQualifierDescriptor: |
2032 case RDevUsbcScClient::EControlSetDeviceQualifierDescriptor: |
1993 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceQualifierDescriptor")); |
2033 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP30, "EControlSetDeviceQualifierDescriptor"); |
1994 BREAK_IF_NULL_ARG(a1,r); |
2034 if (a1 == NULL) |
2035 { |
|
2036 r = KErrArgument; |
|
2037 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOREQUEST_DUP31, "NULL Argument"); |
|
2038 break; |
|
2039 } |
|
1995 r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1)); |
2040 r = iController->SetDeviceQualifierDescriptor(iClient, *((TDes8*) a1)); |
1996 break; |
2041 break; |
1997 |
2042 |
1998 case RDevUsbcScClient::EControlGetOtherSpeedConfigurationDescriptor: |
2043 case RDevUsbcScClient::EControlGetOtherSpeedConfigurationDescriptor: |
1999 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtherSpeedConfigurationDescriptor")); |
2044 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP32, "EControlGetOtherSpeedConfigurationDescriptor"); |
2000 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient); |
2045 r = Kern::ThreadDesWrite(iClient, a1, pZeroDesc, 0 , 0, iClient); |
2001 if (r != KErrNone) |
2046 if (r != KErrNone) |
2002 PanicClientThread(r); |
2047 PanicClientThread(r); |
2003 r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1)); |
2048 r = iController->GetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1)); |
2004 break; |
2049 break; |
2005 |
2050 |
2006 case RDevUsbcScClient::EControlSetOtherSpeedConfigurationDescriptor: |
2051 case RDevUsbcScClient::EControlSetOtherSpeedConfigurationDescriptor: |
2007 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtherSpeedConfigurationDescriptor")); |
2052 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP33, "EControlSetOtherSpeedConfigurationDescriptor"); |
2008 r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1)); |
2053 r = iController->SetOtherSpeedConfigurationDescriptor(iClient, *((TDes8*) a1)); |
2009 break; |
2054 break; |
2010 |
2055 |
2011 |
2056 |
2012 case RDevUsbcScClient::EControlGetCSInterfaceDescriptor: |
2057 case RDevUsbcScClient::EControlGetCSInterfaceDescriptor: |
2013 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptor")); |
2058 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP34, "EControlGetCSInterfaceDescriptor"); |
2014 r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2)); |
2059 r = iController->GetCSInterfaceDescriptorBlock(iClient, this, (TInt) a1, *((TDes8*) a2)); |
2015 break; |
2060 break; |
2016 |
2061 |
2017 case RDevUsbcScClient::EControlGetCSInterfaceDescriptorSize: |
2062 case RDevUsbcScClient::EControlGetCSInterfaceDescriptorSize: |
2018 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSInterfaceDescriptorSize")); |
2063 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP35, "EControlGetCSInterfaceDescriptorSize"); |
2019 r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2); |
2064 r = iController->GetCSInterfaceDescriptorBlockSize(iClient, this, (TInt) a1, *(TDes8*) a2); |
2020 break; |
2065 break; |
2021 |
2066 |
2022 case RDevUsbcScClient::EControlGetCSEndpointDescriptor: |
2067 case RDevUsbcScClient::EControlGetCSEndpointDescriptor: |
2023 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptor")); |
2068 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP36, "EControlGetCSEndpointDescriptor"); |
2024 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2069 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2025 if (r != KErrNone) |
2070 if (r != KErrNone) |
2026 PanicClientThread(r); |
2071 PanicClientThread(r); |
2027 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2072 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2028 r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting, |
2073 r = iController->GetCSEndpointDescriptorBlock(iClient, this, epInfo.iSetting, |
2029 ep, *(TDes8*) epInfo.iArg); |
2074 ep, *(TDes8*) epInfo.iArg); |
2030 break; |
2075 break; |
2031 |
2076 |
2032 case RDevUsbcScClient::EControlGetCSEndpointDescriptorSize: |
2077 case RDevUsbcScClient::EControlGetCSEndpointDescriptorSize: |
2033 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetCSEndpointDescriptorSize")); |
2078 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP37, "EControlGetCSEndpointDescriptorSize"); |
2034 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2079 r = Kern::ThreadRawRead(iClient, a1, &epInfo, sizeof(epInfo)); |
2035 if (r != KErrNone) |
2080 if (r != KErrNone) |
2036 PanicClientThread(r); |
2081 PanicClientThread(r); |
2037 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2082 ep = EpFromAlternateSetting(epInfo.iSetting, epInfo.iEndpoint); |
2038 r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting, |
2083 r = iController->GetCSEndpointDescriptorBlockSize(iClient, this, epInfo.iSetting, |
2039 ep, *(TDes8*) epInfo.iArg); |
2084 ep, *(TDes8*) epInfo.iArg); |
2040 break; |
2085 break; |
2041 |
2086 |
2042 case RDevUsbcScClient::EControlSignalRemoteWakeup: |
2087 case RDevUsbcScClient::EControlSignalRemoteWakeup: |
2043 __KTRACE_OPT(KUSB, Kern::Printf("EControlSignalRemoteWakeup")); |
2088 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP38, "EControlSignalRemoteWakeup"); |
2044 r = iController->SignalRemoteWakeup(); |
2089 r = iController->SignalRemoteWakeup(); |
2045 break; |
2090 break; |
2046 |
2091 |
2047 case RDevUsbcScClient::EControlDeviceDisconnectFromHost: |
2092 case RDevUsbcScClient::EControlDeviceDisconnectFromHost: |
2048 __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceDisconnectFromHost")); |
2093 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP39, "EControlDeviceDisconnectFromHost"); |
2049 r = iController->UsbDisconnect(); |
2094 r = iController->UsbDisconnect(); |
2050 break; |
2095 break; |
2051 |
2096 |
2052 case RDevUsbcScClient::EControlDeviceConnectToHost: |
2097 case RDevUsbcScClient::EControlDeviceConnectToHost: |
2053 __KTRACE_OPT(KUSB, Kern::Printf("EControlDeviceConnectToHost")); |
2098 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP40, "EControlDeviceConnectToHost"); |
2054 r = iController->UsbConnect(); |
2099 r = iController->UsbConnect(); |
2055 break; |
2100 break; |
2056 |
2101 |
2057 case RDevUsbcScClient::EControlDevicePowerUpUdc: |
2102 case RDevUsbcScClient::EControlDevicePowerUpUdc: |
2058 __KTRACE_OPT(KUSB, Kern::Printf("EControlDevicePowerUpUdc")); |
2103 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP41, "EControlDevicePowerUpUdc"); |
2059 r = iController->PowerUpUdc(); |
2104 r = iController->PowerUpUdc(); |
2060 break; |
2105 break; |
2061 |
2106 |
2062 case RDevUsbcScClient::EControlSetDeviceControl: |
2107 case RDevUsbcScClient::EControlSetDeviceControl: |
2063 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl")); |
2108 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP42, "EControlSetDeviceControl"); |
2064 r = iController->SetDeviceControl(this); |
2109 r = iController->SetDeviceControl(this); |
2065 if (r == KErrNone) |
2110 if (r == KErrNone) |
2066 { |
2111 { |
2067 iOwnsDeviceControl = ETrue; |
2112 iOwnsDeviceControl = ETrue; |
2068 if (iEp0Endpoint == NULL) |
2113 if (iEp0Endpoint == NULL) |
2069 { |
2114 { |
2070 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetDeviceControl")); |
2115 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP43, "EControlSetDeviceControl"); |
2071 r = SetupEp0(); |
2116 r = SetupEp0(); |
2072 if (r != KErrNone) |
2117 if (r != KErrNone) |
2073 { |
2118 { |
2074 __KTRACE_OPT(KPANIC, Kern::Printf(" Error: SetupEp0() failed")); |
2119 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP44, " Error: SetupEp0() failed"); |
2075 iController->ReleaseDeviceControl(this); |
2120 iController->ReleaseDeviceControl(this); |
2076 iOwnsDeviceControl=EFalse; |
2121 iOwnsDeviceControl=EFalse; |
2077 DestroyEp0(); |
2122 DestroyEp0(); |
2078 } |
2123 } |
2079 } |
2124 } |
2081 else |
2126 else |
2082 r = KErrInUse; |
2127 r = KErrInUse; |
2083 break; |
2128 break; |
2084 |
2129 |
2085 case RDevUsbcScClient::EControlCurrentlyUsingHighSpeed: |
2130 case RDevUsbcScClient::EControlCurrentlyUsingHighSpeed: |
2086 __KTRACE_OPT(KUSB, Kern::Printf("EControlCurrentlyUsingHighSpeed")); |
2131 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP45, "EControlCurrentlyUsingHighSpeed"); |
2087 r = iController->CurrentlyUsingHighSpeed(); |
2132 r = iController->CurrentlyUsingHighSpeed(); |
2088 break; |
2133 break; |
2089 |
2134 |
2090 case RDevUsbcScClient::EControlSetInterface: |
2135 case RDevUsbcScClient::EControlSetInterface: |
2091 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetInterface")); |
2136 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP46, "EControlSetInterface"); |
2092 r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo)); |
2137 r = Kern::ThreadRawRead(iClient, a2, &ifcInfo, sizeof(ifcInfo)); |
2093 if (r != KErrNone) |
2138 if (r != KErrNone) |
2094 PanicClientThread(r); |
2139 PanicClientThread(r); |
2095 r = SetInterface((TInt) a1, &ifcInfo); |
2140 r = SetInterface((TInt) a1, &ifcInfo); |
2096 break; |
2141 break; |
2097 |
2142 |
2098 case RDevUsbcScClient::EControlReleaseInterface: |
2143 case RDevUsbcScClient::EControlReleaseInterface: |
2099 __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface")); |
2144 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP47, "EControlReleaseInterface"); |
2100 if (!iRealizeCalled) |
2145 if (!iRealizeCalled) |
2101 { |
2146 { |
2102 r = iController->ReleaseInterface(this, (TInt) a1); |
2147 r = iController->ReleaseInterface(this, (TInt) a1); |
2103 if (r == KErrNone) |
2148 if (r == KErrNone) |
2104 { |
2149 { |
2105 DestroyInterface((TUint) a1); |
2150 DestroyInterface((TUint) a1); |
2106 } |
2151 } |
2107 else |
2152 else |
2108 { |
2153 { |
2109 __KTRACE_OPT(KPANIC, Kern::Printf(" Error in PIL: LDD interface won't be released.")); |
2154 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP48, " Error in PIL: LDD interface won't be released."); |
2110 } |
2155 } |
2111 } |
2156 } |
2112 else |
2157 else |
2113 r = KErrUsbAlreadyRealized; |
2158 r = KErrUsbAlreadyRealized; |
2114 break; |
2159 break; |
2115 |
2160 |
2116 case RDevUsbcScClient::EControlSetCSInterfaceDescriptor: |
2161 case RDevUsbcScClient::EControlSetCSInterfaceDescriptor: |
2117 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSInterfaceDescriptor")); |
2162 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP49, "EControlSetCSInterfaceDescriptor"); |
2118 r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo)); |
2163 r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo)); |
2119 if (r != KErrNone) |
2164 if (r != KErrNone) |
2120 PanicClientThread(r); |
2165 PanicClientThread(r); |
2121 r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting, |
2166 r = iController->SetCSInterfaceDescriptorBlock(iClient, this, desInfo.iSetting, |
2122 *reinterpret_cast<const TDes8*>(desInfo.iArg), |
2167 *reinterpret_cast<const TDes8*>(desInfo.iArg), |
2123 desInfo.iSize); |
2168 desInfo.iSize); |
2124 break; |
2169 break; |
2125 |
2170 |
2126 case RDevUsbcScClient::EControlSetCSEndpointDescriptor: |
2171 case RDevUsbcScClient::EControlSetCSEndpointDescriptor: |
2127 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetCSEndpointDescriptor")); |
2172 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP50, "EControlSetCSEndpointDescriptor"); |
2128 r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo)); |
2173 r = Kern::ThreadRawRead(iClient, a1, &desInfo, sizeof(desInfo)); |
2129 if (r != KErrNone) |
2174 if (r != KErrNone) |
2130 PanicClientThread(r); |
2175 PanicClientThread(r); |
2131 ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint); |
2176 ep = EpFromAlternateSetting(desInfo.iSetting, desInfo.iEndpoint); |
2132 r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep, |
2177 r = iController->SetCSEndpointDescriptorBlock(iClient, this, desInfo.iSetting, ep, |
2133 *reinterpret_cast<const TDes8*>(desInfo.iArg), |
2178 *reinterpret_cast<const TDes8*>(desInfo.iArg), |
2134 desInfo.iSize); |
2179 desInfo.iSize); |
2135 break; |
2180 break; |
2136 |
2181 |
2137 case RDevUsbcScClient::EControlGetStringDescriptorLangId: |
2182 case RDevUsbcScClient::EControlGetStringDescriptorLangId: |
2138 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptorLangId")); |
2183 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP51, "EControlGetStringDescriptorLangId"); |
2139 r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1)); |
2184 r = iController->GetStringDescriptorLangId(iClient, *((TDes8*) a1)); |
2140 break; |
2185 break; |
2141 |
2186 |
2142 case RDevUsbcScClient::EControlSetStringDescriptorLangId: |
2187 case RDevUsbcScClient::EControlSetStringDescriptorLangId: |
2143 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptorLangId")); |
2188 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP52, "EControlSetStringDescriptorLangId"); |
2144 r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1)); |
2189 r = iController->SetStringDescriptorLangId(reinterpret_cast<TUint>(a1)); |
2145 break; |
2190 break; |
2146 |
2191 |
2147 case RDevUsbcScClient::EControlGetManufacturerStringDescriptor: |
2192 case RDevUsbcScClient::EControlGetManufacturerStringDescriptor: |
2148 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetManufacturerStringDescriptor")); |
2193 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP53, "EControlGetManufacturerStringDescriptor"); |
2149 r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1)); |
2194 r = iController->GetManufacturerStringDescriptor(iClient, *((TPtr8*) a1)); |
2150 break; |
2195 break; |
2151 |
2196 |
2152 case RDevUsbcScClient::EControlSetManufacturerStringDescriptor: |
2197 case RDevUsbcScClient::EControlSetManufacturerStringDescriptor: |
2153 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetManufacturerStringDescriptor")); |
2198 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP54, "EControlSetManufacturerStringDescriptor"); |
2154 r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1)); |
2199 r = iController->SetManufacturerStringDescriptor(iClient, *((TPtr8*) a1)); |
2155 break; |
2200 break; |
2156 |
2201 |
2157 case RDevUsbcScClient::EControlRemoveManufacturerStringDescriptor: |
2202 case RDevUsbcScClient::EControlRemoveManufacturerStringDescriptor: |
2158 __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveManufacturerStringDescriptor")); |
2203 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP55, "EControlRemoveManufacturerStringDescriptor"); |
2159 r = iController->RemoveManufacturerStringDescriptor(); |
2204 r = iController->RemoveManufacturerStringDescriptor(); |
2160 break; |
2205 break; |
2161 |
2206 |
2162 case RDevUsbcScClient::EControlGetProductStringDescriptor: |
2207 case RDevUsbcScClient::EControlGetProductStringDescriptor: |
2163 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetProductStringDescriptor")); |
2208 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP56, "EControlGetProductStringDescriptor"); |
2164 r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1)); |
2209 r = iController->GetProductStringDescriptor(iClient, *((TPtr8*) a1)); |
2165 break; |
2210 break; |
2166 |
2211 |
2167 case RDevUsbcScClient::EControlSetProductStringDescriptor: |
2212 case RDevUsbcScClient::EControlSetProductStringDescriptor: |
2168 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetProductStringDescriptor")); |
2213 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP57, "EControlSetProductStringDescriptor"); |
2169 r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1)); |
2214 r = iController->SetProductStringDescriptor(iClient, *((TPtr8*) a1)); |
2170 break; |
2215 break; |
2171 |
2216 |
2172 case RDevUsbcScClient::EControlRemoveProductStringDescriptor: |
2217 case RDevUsbcScClient::EControlRemoveProductStringDescriptor: |
2173 __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveProductStringDescriptor")); |
2218 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP58, "EControlRemoveProductStringDescriptor"); |
2174 r = iController->RemoveProductStringDescriptor(); |
2219 r = iController->RemoveProductStringDescriptor(); |
2175 break; |
2220 break; |
2176 |
2221 |
2177 case RDevUsbcScClient::EControlGetSerialNumberStringDescriptor: |
2222 case RDevUsbcScClient::EControlGetSerialNumberStringDescriptor: |
2178 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetSerialNumberStringDescriptor")); |
2223 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP59, "EControlGetSerialNumberStringDescriptor"); |
2179 r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1)); |
2224 r = iController->GetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1)); |
2180 break; |
2225 break; |
2181 |
2226 |
2182 case RDevUsbcScClient::EControlSetSerialNumberStringDescriptor: |
2227 case RDevUsbcScClient::EControlSetSerialNumberStringDescriptor: |
2183 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetSerialNumberStringDescriptor")); |
2228 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP60, "EControlSetSerialNumberStringDescriptor"); |
2184 r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1)); |
2229 r = iController->SetSerialNumberStringDescriptor(iClient, *((TPtr8*) a1)); |
2185 break; |
2230 break; |
2186 |
2231 |
2187 case RDevUsbcScClient::EControlRemoveSerialNumberStringDescriptor: |
2232 case RDevUsbcScClient::EControlRemoveSerialNumberStringDescriptor: |
2188 __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveSerialNumberStringDescriptor")); |
2233 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP61, "EControlRemoveSerialNumberStringDescriptor"); |
2189 r = iController->RemoveSerialNumberStringDescriptor(); |
2234 r = iController->RemoveSerialNumberStringDescriptor(); |
2190 break; |
2235 break; |
2191 |
2236 |
2192 case RDevUsbcScClient::EControlGetConfigurationStringDescriptor: |
2237 case RDevUsbcScClient::EControlGetConfigurationStringDescriptor: |
2193 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetConfigurationStringDescriptor")); |
2238 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP62, "EControlGetConfigurationStringDescriptor"); |
2194 r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1)); |
2239 r = iController->GetConfigurationStringDescriptor(iClient, *((TPtr8*) a1)); |
2195 break; |
2240 break; |
2196 |
2241 |
2197 case RDevUsbcScClient::EControlSetConfigurationStringDescriptor: |
2242 case RDevUsbcScClient::EControlSetConfigurationStringDescriptor: |
2198 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetConfigurationStringDescriptor")); |
2243 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP63, "EControlSetConfigurationStringDescriptor"); |
2199 r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1)); |
2244 r = iController->SetConfigurationStringDescriptor(iClient, *((TPtr8*) a1)); |
2200 break; |
2245 break; |
2201 |
2246 |
2202 case RDevUsbcScClient::EControlRemoveConfigurationStringDescriptor: |
2247 case RDevUsbcScClient::EControlRemoveConfigurationStringDescriptor: |
2203 __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveConfigurationStringDescriptor")); |
2248 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP64, "EControlRemoveConfigurationStringDescriptor"); |
2204 r = iController->RemoveConfigurationStringDescriptor(); |
2249 r = iController->RemoveConfigurationStringDescriptor(); |
2205 break; |
2250 break; |
2206 |
2251 |
2207 case RDevUsbcScClient::EControlGetStringDescriptor: |
2252 case RDevUsbcScClient::EControlGetStringDescriptor: |
2208 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetStringDescriptor")); |
2253 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP65, "EControlGetStringDescriptor"); |
2209 r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2)); |
2254 r = iController->GetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2)); |
2210 break; |
2255 break; |
2211 |
2256 |
2212 case RDevUsbcScClient::EControlSetStringDescriptor: |
2257 case RDevUsbcScClient::EControlSetStringDescriptor: |
2213 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetStringDescriptor")); |
2258 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP66, "EControlSetStringDescriptor"); |
2214 r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2)); |
2259 r = iController->SetStringDescriptor(iClient, (TUint8) (TInt) a1, *((TPtr8*) a2)); |
2215 break; |
2260 break; |
2216 |
2261 |
2217 case RDevUsbcScClient::EControlRemoveStringDescriptor: |
2262 case RDevUsbcScClient::EControlRemoveStringDescriptor: |
2218 __KTRACE_OPT(KUSB, Kern::Printf("EControlRemoveStringDescriptor")); |
2263 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP67, "EControlRemoveStringDescriptor"); |
2219 r = iController->RemoveStringDescriptor((TUint8) (TInt) a1); |
2264 r = iController->RemoveStringDescriptor((TUint8) (TInt) a1); |
2220 break; |
2265 break; |
2221 |
2266 |
2222 case RDevUsbcScClient::EControlAllocateEndpointResource: |
2267 case RDevUsbcScClient::EControlAllocateEndpointResource: |
2223 { |
2268 { |
2224 __KTRACE_OPT(KUSB, Kern::Printf("EControlAllocateEndpointResource")); |
2269 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP68, "EControlAllocateEndpointResource"); |
2225 epRes = (TUsbcEndpointResource)((TInt) a2); |
2270 epRes = (TUsbcEndpointResource)((TInt) a2); |
2226 TInt realEp=-1; |
2271 TInt realEp=-1; |
2227 r = GetRealEpForEpResource((TInt)a1, realEp); |
2272 r = GetRealEpForEpResource((TInt)a1, realEp); |
2228 if (r==KErrNone) |
2273 if (r==KErrNone) |
2229 r = iController->AllocateEndpointResource(this, realEp, epRes); |
2274 r = iController->AllocateEndpointResource(this, realEp, epRes); |
2230 break; |
2275 break; |
2231 } |
2276 } |
2232 case RDevUsbcScClient::EControlDeAllocateEndpointResource: |
2277 case RDevUsbcScClient::EControlDeAllocateEndpointResource: |
2233 { |
2278 { |
2234 __KTRACE_OPT(KUSB, Kern::Printf("EControlDeAllocateEndpointResource")); |
2279 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP69, "EControlDeAllocateEndpointResource"); |
2235 epRes = (TUsbcEndpointResource)((TInt) a2); |
2280 epRes = (TUsbcEndpointResource)((TInt) a2); |
2236 TInt realEp=-1; |
2281 TInt realEp=-1; |
2237 r = GetRealEpForEpResource((TInt)a1, realEp); |
2282 r = GetRealEpForEpResource((TInt)a1, realEp); |
2238 if (r==KErrNone) |
2283 if (r==KErrNone) |
2239 r = iController->DeAllocateEndpointResource(this, realEp, epRes); |
2284 r = iController->DeAllocateEndpointResource(this, realEp, epRes); |
2240 break; |
2285 break; |
2241 } |
2286 } |
2242 case RDevUsbcScClient::EControlQueryEndpointResourceUse: |
2287 case RDevUsbcScClient::EControlQueryEndpointResourceUse: |
2243 { |
2288 { |
2244 __KTRACE_OPT(KUSB, Kern::Printf("EControlQueryEndpointResourceUse")); |
2289 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP70, "EControlQueryEndpointResourceUse"); |
2245 epRes = (TUsbcEndpointResource)((TInt) a2); |
2290 epRes = (TUsbcEndpointResource)((TInt) a2); |
2246 TInt realEp=-1; |
2291 TInt realEp=-1; |
2247 r = GetRealEpForEpResource((TInt)a1, realEp); |
2292 r = GetRealEpForEpResource((TInt)a1, realEp); |
2248 if (r==KErrNone) |
2293 if (r==KErrNone) |
2249 r = iController->QueryEndpointResource(this, realEp, epRes); |
2294 r = iController->QueryEndpointResource(this, realEp, epRes); |
2250 break; |
2295 break; |
2251 } |
2296 } |
2252 case RDevUsbcScClient::EControlSetOtgDescriptor: |
2297 case RDevUsbcScClient::EControlSetOtgDescriptor: |
2253 __KTRACE_OPT(KUSB, Kern::Printf("EControlSetOtgDescriptor")); |
2298 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP71, "EControlSetOtgDescriptor"); |
2254 r = iController->SetOtgDescriptor(iClient, *((const TDesC8*)a1)); |
2299 r = iController->SetOtgDescriptor(iClient, *((const TDesC8*)a1)); |
2255 break; |
2300 break; |
2256 |
2301 |
2257 case RDevUsbcScClient::EControlGetOtgDescriptor: |
2302 case RDevUsbcScClient::EControlGetOtgDescriptor: |
2258 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtgDescriptor")); |
2303 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP72, "EControlGetOtgDescriptor"); |
2259 r = iController->GetOtgDescriptor(iClient, *((TDes8*)a1)); |
2304 r = iController->GetOtgDescriptor(iClient, *((TDes8*)a1)); |
2260 break; |
2305 break; |
2261 |
2306 |
2262 case RDevUsbcScClient::EControlGetOtgFeatures: |
2307 case RDevUsbcScClient::EControlGetOtgFeatures: |
2263 __KTRACE_OPT(KUSB, Kern::Printf("EControlGetOtgFeatures")); |
2308 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP73, "EControlGetOtgFeatures"); |
2264 r = iController->GetOtgFeatures(iClient, *((TDes8*)a1)); |
2309 r = iController->GetOtgFeatures(iClient, *((TDes8*)a1)); |
2265 break; |
2310 break; |
2266 |
2311 |
2267 case RDevUsbcScClient::EControlRealizeInterface: |
2312 case RDevUsbcScClient::EControlRealizeInterface: |
2268 __KTRACE_OPT(KUSB, Kern::Printf("EControlRealizeInterface")); |
2313 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP74, "EControlRealizeInterface"); |
2269 r = RealizeInterface(); |
2314 r = RealizeInterface(); |
2270 break; |
2315 break; |
2271 case RDevUsbcScClient::EControlStartNextInAlternateSetting: |
2316 case RDevUsbcScClient::EControlStartNextInAlternateSetting: |
2272 __KTRACE_OPT(KUSB, Kern::Printf("EControlStartNextInAlternateSetting")); |
2317 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP75, "EControlStartNextInAlternateSetting"); |
2273 r = StartNextInAlternateSetting(); |
2318 r = StartNextInAlternateSetting(); |
2274 break; |
2319 break; |
2275 |
2320 |
2276 default: |
2321 default: |
2277 __KTRACE_OPT(KUSB, Kern::Printf("Function code not supported")); |
2322 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOCONTROL_DUP76, "Function code not supported"); |
2278 r = KErrNotSupported; |
2323 r = KErrNotSupported; |
2279 } |
2324 } |
2280 |
2325 |
2281 return r; |
2326 return r; |
2282 } |
2327 } |
2287 // |
2332 // |
2288 // Overriding DObject virtual |
2333 // Overriding DObject virtual |
2289 // |
2334 // |
2290 TInt DLddUsbcScChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/) |
2335 TInt DLddUsbcScChannel::RequestUserHandle(DThread* aThread, TOwnerType /*aType*/) |
2291 { |
2336 { |
2292 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::RequestUserHandle")); |
2337 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_REQUESTUSERHANDLE, "DLddUsbcScChannel::RequestUserHandle" ); |
2293 // The USB client LDD can share across process, but can't use simultanously. |
2338 |
2294 // This mean if transfer the handle to another process, can't access this channel |
2339 // The USB client LDD is not designed for a channel to be shared between |
2295 // in the origin process and any call to the channel will return with KErrAccessDenied. |
2340 // threads. It saves a pointer to the current thread when it is opened, and |
2296 // If there is async request scheduled, can't transfer channel handle to another process |
2341 // uses this to complete any asynchronous requests. |
2297 // and return KErrAccessDenied. |
2342 // It is therefore not acceptable for the handle to be duplicated and used |
2343 // by another thread: |
|
2298 if (aThread == iClient) |
2344 if (aThread == iClient) |
2299 { |
2345 { |
2300 return KErrNone; |
2346 return KErrNone; |
2301 } |
2347 } |
2302 else |
2348 else |
2330 for (TInt i=0; i<(iNumBuffers+2); i++) |
2376 for (TInt i=0; i<(iNumBuffers+2); i++) |
2331 { |
2377 { |
2332 iBuffers[i].iStatusList.SetClient(*iClient); |
2378 iBuffers[i].iStatusList.SetClient(*iClient); |
2333 } |
2379 } |
2334 } |
2380 } |
2335 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::handle %d", iChunkInfo->iChunk->AccessCount())); |
2381 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTUSERHANDLE_DUP1, "DLddUsbcScChannel::handle %d", iChunkInfo->iChunk->AccessCount()); |
2336 return KErrNone; |
2382 return KErrNone; |
2337 } |
2383 } |
2338 } |
2384 } |
2339 |
2385 |
2340 inline TInt DLddUsbcScChannel::GetRealEpForEpResource(TInt aEndpoint, TInt& aRealEp) |
2386 inline TInt DLddUsbcScChannel::GetRealEpForEpResource(TInt aEndpoint, TInt& aRealEp) |
2400 // Read descriptor in |
2446 // Read descriptor in |
2401 TUsbcScInterfaceInfoBuf ifc_info_buf; |
2447 TUsbcScInterfaceInfoBuf ifc_info_buf; |
2402 TUsbcScInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData; |
2448 TUsbcScInterfaceInfoBuf* const ifc_info_buf_ptr = aInfoBuf->iInterfaceData; |
2403 const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr); |
2449 const TInt srcLen = Kern::ThreadGetDesLength(iClient, ifc_info_buf_ptr); |
2404 |
2450 |
2405 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface srcLen = %d len = %d", srcLen, ifc_info_buf.Length() )); |
2451 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE, "SetInterface srcLen = %d len = %d", srcLen, ifc_info_buf.Length()); |
2406 |
2452 |
2407 if (srcLen < ifc_info_buf.Length()) |
2453 if (srcLen < ifc_info_buf.Length()) |
2408 { |
2454 { |
2409 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface can't copy")); |
2455 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP1, "SetInterface can't copy"); |
2410 PanicClientThread(EDesOverflow); |
2456 PanicClientThread(EDesOverflow); |
2411 } |
2457 } |
2412 |
2458 |
2413 TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0); |
2459 TInt r = Kern::ThreadDesRead(iClient, ifc_info_buf_ptr, ifc_info_buf, 0, KChunkShiftBy0); |
2414 if (r != KErrNone) |
2460 if (r != KErrNone) |
2415 { |
2461 { |
2416 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface Copy failed reason=%d", r)); |
2462 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP2, "SetInterface Copy failed reason=%d", r); |
2417 PanicClientThread(r); |
2463 PanicClientThread(r); |
2418 } |
2464 } |
2419 |
2465 |
2420 // The list of endpoints is within the interface info. |
2466 // The list of endpoints is within the interface info. |
2421 TUsbcScEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData; |
2467 TUsbcScEndpointInfo* pEndpointData = ifc_info_buf().iEndpointData; |
2422 |
2468 |
2423 const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed; |
2469 const TInt num_endpoints = ifc_info_buf().iTotalEndpointsUsed; |
2424 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface num_endpoints=%d", num_endpoints)); |
2470 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP3, "SetInterface num_endpoints=%d", num_endpoints); |
2425 if (num_endpoints>KMaxEndpointsPerClient) |
2471 if (num_endpoints>KMaxEndpointsPerClient) |
2426 return KErrOverflow; |
2472 return KErrOverflow; |
2427 |
2473 |
2428 |
2474 |
2429 // Initialize real ep numbers list. |
2475 // Initialize real ep numbers list. |
2432 for (i=0; i<=KMaxEndpointsPerClient; i++) |
2478 for (i=0; i<=KMaxEndpointsPerClient; i++) |
2433 real_ep_numbers[i] = -1; |
2479 real_ep_numbers[i] = -1; |
2434 |
2480 |
2435 |
2481 |
2436 // See if PIL will accept this interface |
2482 // See if PIL will accept this interface |
2437 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface Calling controller")); |
2483 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP4, "SetInterface Calling controller"); |
2438 TUsbcEndpointInfoArray endpointData = TUsbcEndpointInfoArray(ifc_info_buf().iEndpointData); |
2484 TUsbcEndpointInfoArray endpointData = TUsbcEndpointInfoArray(ifc_info_buf().iEndpointData); |
2439 |
2485 |
2440 r = iController->SetInterface(this, |
2486 r = iController->SetInterface(this, |
2441 iClient, |
2487 iClient, |
2442 aInterfaceNumber, |
2488 aInterfaceNumber, |
2445 (TInt) ifc_info_buf().iTotalEndpointsUsed, |
2491 (TInt) ifc_info_buf().iTotalEndpointsUsed, |
2446 endpointData, |
2492 endpointData, |
2447 &real_ep_numbers[0], |
2493 &real_ep_numbers[0], |
2448 ifc_info_buf().iFeatureWord); |
2494 ifc_info_buf().iFeatureWord); |
2449 |
2495 |
2450 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface controller returned %d", r)); |
2496 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP5, "SetInterface controller returned %d", r); |
2451 if (r != KErrNone) |
2497 if (r != KErrNone) |
2452 { |
2498 { |
2453 __KTRACE_OPT(KPANIC, Kern::Printf("SetInterface failed reason=%d", r)); |
2499 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP6, "SetInterface failed reason=%d", r); |
2454 return r; |
2500 return r; |
2455 } |
2501 } |
2456 |
2502 |
2457 // create alternate setting record |
2503 // create alternate setting record |
2458 TUsbcScAlternateSetting* alternateSettingListRec = new TUsbcScAlternateSetting; |
2504 TUsbcScAlternateSetting* alternateSettingListRec = new TUsbcScAlternateSetting; |
2463 } |
2509 } |
2464 |
2510 |
2465 // other endpoints |
2511 // other endpoints |
2466 for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++) |
2512 for (TInt i = 1; i <= num_endpoints; i++, pEndpointData++) |
2467 { |
2513 { |
2468 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d", i)); |
2514 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP7, "SetInterface for ep=%d", i); |
2469 |
|
2470 if ((pEndpointData->iType==KUsbEpTypeControl) |
2515 if ((pEndpointData->iType==KUsbEpTypeControl) |
2471 || (pEndpointData->iDir != KUsbEpDirIn && pEndpointData->iDir != KUsbEpDirOut) |
2516 || (pEndpointData->iDir != KUsbEpDirIn && pEndpointData->iDir != KUsbEpDirOut) |
2472 || (pEndpointData->iSize > 1024) || (pEndpointData->iSize<=0)) |
2517 || (pEndpointData->iSize > 1024) || (pEndpointData->iSize<=0)) |
2473 { |
2518 { |
2474 r = KErrUsbBadEndpoint; |
2519 r = KErrUsbBadEndpoint; |
2495 { |
2540 { |
2496 r = KErrNoMemory; |
2541 r = KErrNoMemory; |
2497 goto CleanUp; |
2542 goto CleanUp; |
2498 } |
2543 } |
2499 |
2544 |
2500 |
2545 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP8, "SetInterface for ep=%d rec=0x%08x ep==0x%08x", |
2501 __KTRACE_OPT(KUSB, Kern::Printf("SetInterface for ep=%d rec=0x%08x ep==0x%08x", |
2546 i, (TUint)alternateSettingListRec, (TUint)ep); |
2502 i, alternateSettingListRec, ep)); |
|
2503 } |
2547 } |
2504 |
2548 |
2505 if (iAlternateSettingList->iHead) |
2549 if (iAlternateSettingList->iHead) |
2506 { |
2550 { |
2507 iAlternateSettingList->iTail->iNext = alternateSettingListRec; |
2551 iAlternateSettingList->iTail->iNext = alternateSettingListRec; |
2531 delete alternateSettingListRec; |
2575 delete alternateSettingListRec; |
2532 //Fall Through |
2576 //Fall Through |
2533 |
2577 |
2534 ReleaseInterface: |
2578 ReleaseInterface: |
2535 #if _DEBUG |
2579 #if _DEBUG |
2580 #ifdef OST_TRACE_COMPILER_IN_USE |
|
2536 TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber); |
2581 TInt r1 = iController->ReleaseInterface(this, aInterfaceNumber); |
2537 __KTRACE_OPT(KUSB, Kern::Printf("Release Interface controller returned %d", r1)); |
2582 #else |
2583 (void) iController->ReleaseInterface(this, aInterfaceNumber); |
|
2584 #endif |
|
2585 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_SETINTERFACE_DUP9, "Release Interface controller returned %d", r1); |
|
2538 #else |
2586 #else |
2539 (void) iController->ReleaseInterface(this, aInterfaceNumber); |
2587 (void) iController->ReleaseInterface(this, aInterfaceNumber); |
2540 #endif |
2588 #endif |
2541 return r; |
2589 return r; |
2542 } |
2590 } |
2550 TUint *mem= NULL; |
2598 TUint *mem= NULL; |
2551 __KTRACE_OPT(KUSB, mem = aMem); |
2599 __KTRACE_OPT(KUSB, mem = aMem); |
2552 if (mem!=NULL) |
2600 if (mem!=NULL) |
2553 { |
2601 { |
2554 TInt j; |
2602 TInt j; |
2555 Kern::Printf("Final chunk header State:"); |
2603 OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, _REALIZEINTERFACE_DUMP, "Final chunk header State:" ); |
2556 for (j=0; j<30; j+=8) |
2604 |
2557 Kern::Printf("%2x: %8x %8x %8x %8x %8x %8x %8x %8x", j, mem[j], mem[j+1], mem[j+2], mem[j+3], mem[j+4], mem[j+5], mem[j+6], mem[j+7] ); |
2605 for (j=0; j<30; j+=8) |
2606 { |
|
2607 OstTrace1(TRACE_NORMAL, _REALIZEINTERFACE_DUMP_DUP1, "%2x", j); |
|
2608 OstTraceExt1(TRACE_NORMAL, _REALIZEINTERFACE_DUMP_DUP2, "%{uint32[]}", TOstArray<TUint>(&mem[j], 8)); |
|
2609 } |
|
2558 }; |
2610 }; |
2559 }; |
2611 }; |
2560 #endif |
2612 #endif |
2561 |
2613 |
2562 |
2614 |
2643 // Create K-side buffer table |
2695 // Create K-side buffer table |
2644 if (!iBuffers) |
2696 if (!iBuffers) |
2645 iBuffers = (TUsbcScBuffer *) Kern::AllocZ(sizeof(TUsbcScBuffer) * (bufInfo.iTotalBuffers+2)); // +2 is for ep0. |
2697 iBuffers = (TUsbcScBuffer *) Kern::AllocZ(sizeof(TUsbcScBuffer) * (bufInfo.iTotalBuffers+2)); // +2 is for ep0. |
2646 if (!iBuffers) |
2698 if (!iBuffers) |
2647 { |
2699 { |
2648 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Error: Alloc iBufers failed!")); |
2700 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE, "Realize: Error: Alloc iBufers failed!" ); |
2701 |
|
2649 errorOrChunk = KErrNoMemory; |
2702 errorOrChunk = KErrNoMemory; |
2650 goto realize_end; |
2703 goto realize_end; |
2651 } |
2704 } |
2652 |
2705 |
2653 |
2706 |
2654 errorOrChunk = SetupEp0(); |
2707 errorOrChunk = SetupEp0(); |
2655 if (errorOrChunk) |
2708 if (errorOrChunk) |
2656 { |
2709 { |
2657 __KTRACE_OPT(KUSB, Kern::Printf("Realize: SetupEp0 . ERROR %d",errorOrChunk)); |
2710 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP1, "Realize: SetupEp0 . ERROR %d",errorOrChunk); |
2658 goto realize_end; |
2711 goto realize_end; |
2659 } |
2712 } |
2660 |
2713 |
2661 ep0Size = iEp0Endpoint->EndpointInfo()->iSize; |
2714 ep0Size = iEp0Endpoint->EndpointInfo()->iSize; |
2662 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0. max packet size %d", ep0Size)); |
2715 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP2, "Realize: Setup EP0. max packet size %d", ep0Size); |
2663 |
|
2664 // Create EP0 buffers |
2716 // Create EP0 buffers |
2665 iEP0OutBuff=bufInfo.iTotalBuffers; |
2717 iEP0OutBuff=bufInfo.iTotalBuffers; |
2666 errorOrChunk = iBuffers[iEP0OutBuff].Construct(KUsbcScBiOut, this, KUsbScEP0OutBufPos, KUsbScEP0OutBufEnd, ep0Size, ep0Size, ep0Size); |
2718 errorOrChunk = iBuffers[iEP0OutBuff].Construct(KUsbcScBiOut, this, KUsbScEP0OutBufPos, KUsbScEP0OutBufEnd, ep0Size, ep0Size, ep0Size); |
2667 if (errorOrChunk) |
2719 if (errorOrChunk) |
2668 { |
2720 { |
2669 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0 Out. ERROR %d",errorOrChunk)); |
2721 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP3, "Realize: Setup EP0 Out. ERROR %d",errorOrChunk); |
2670 goto realize_end; |
2722 goto realize_end; |
2671 } |
2723 } |
2672 |
2724 |
2673 iBuffers[iEP0OutBuff].CreateChunkBufferHeader(); |
2725 iBuffers[iEP0OutBuff].CreateChunkBufferHeader(); |
2674 iBuffers[iEP0OutBuff].iCallback = iEp0Endpoint->iRequestCallbackInfo; |
2726 iBuffers[iEP0OutBuff].iCallback = iEp0Endpoint->iRequestCallbackInfo; |
2679 |
2731 |
2680 iEP0InBuff=bufInfo.iTotalBuffers+1; |
2732 iEP0InBuff=bufInfo.iTotalBuffers+1; |
2681 errorOrChunk = iBuffers[iEP0InBuff].Construct( KUsbcScBiIn , this, KUsbScEP0InBufPos , KUsbScEP0InBufEnd , ep0Size, ep0Size, ep0Size); |
2733 errorOrChunk = iBuffers[iEP0InBuff].Construct( KUsbcScBiIn , this, KUsbScEP0InBufPos , KUsbScEP0InBufEnd , ep0Size, ep0Size, ep0Size); |
2682 if (errorOrChunk) |
2734 if (errorOrChunk) |
2683 { |
2735 { |
2684 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Setup EP0 In. ERROR %d",errorOrChunk)); |
2736 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP4, "Realize: Setup EP0 In. ERROR %d",errorOrChunk); |
2685 goto realize_end; |
2737 goto realize_end; |
2686 } |
2738 } |
2687 |
2739 |
2688 iBuffers[iEP0InBuff].iCallback = iEp0Endpoint->iRequestCallbackInfo; |
2740 iBuffers[iEP0InBuff].iCallback = iEp0Endpoint->iRequestCallbackInfo; |
2689 |
2741 |
2693 |
2745 |
2694 |
2746 |
2695 } // end ep0Size scope |
2747 } // end ep0Size scope |
2696 |
2748 |
2697 // Create resources and tables. . . . . . |
2749 // Create resources and tables. . . . . . |
2698 __KTRACE_OPT(KUSB, Kern::Printf("Realize: Create resources tables")); |
2750 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP5, "Realize: Create resources tables"); |
2699 |
|
2700 { // scope of bufNum |
2751 { // scope of bufNum |
2701 // For each EP buffer |
2752 // For each EP buffer |
2702 TInt buffNum=0; |
2753 TInt buffNum=0; |
2703 TInt buffMinSize; |
2754 TInt buffMinSize; |
2704 TInt endpointNumber; |
2755 TInt endpointNumber; |
2716 TInt needed = bufInfo.iBufs[inout].iSizes[endpoint]; |
2767 TInt needed = bufInfo.iBufs[inout].iSizes[endpoint]; |
2717 if (needed) |
2768 if (needed) |
2718 { |
2769 { |
2719 TInt bufStart = offset; |
2770 TInt bufStart = offset; |
2720 |
2771 |
2721 __KTRACE_OPT(KUSB, Kern::Printf("Realize: buf row:%d inout %d, iBufferOffset[%d+2]=%x",endpoint, inout, buffNum, bufStart)); |
2772 OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP6, "Realize: buf row:%d inout %d, iBufferOffset[%d+2]=%x",endpoint, (TUint)inout, (TUint)buffNum, (TUint)bufStart); |
2722 |
|
2723 bufsd = &(bufInfo.iBufs[inout]); |
2773 bufsd = &(bufInfo.iBufs[inout]); |
2724 // and then point all endpoints that use it, towards it. |
2774 // and then point all endpoints that use it, towards it. |
2725 TInt altSetting; |
2775 TInt altSetting; |
2726 TUint maxReadSize = ~0; |
2776 TUint maxReadSize = ~0; |
2727 for (altSetting=0; altSetting < bufInfo.iAltSettings; altSetting++) |
2777 for (altSetting=0; altSetting < bufInfo.iAltSettings; altSetting++) |
2747 |
2797 |
2748 epRecord->iType = (inout+1) | (epType<<2); |
2798 epRecord->iType = (inout+1) | (epType<<2); |
2749 |
2799 |
2750 if (endpointRecord->EndpointInfo()->iReadSize) |
2800 if (endpointRecord->EndpointInfo()->iReadSize) |
2751 maxReadSize = (maxReadSize <= endpointRecord->EndpointInfo()->iReadSize) ? maxReadSize : endpointRecord->EndpointInfo()->iReadSize; |
2801 maxReadSize = (maxReadSize <= endpointRecord->EndpointInfo()->iReadSize) ? maxReadSize : endpointRecord->EndpointInfo()->iReadSize; |
2752 |
2802 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP7, "Realize: endpointNum %d in altSetting %d, alt table @ %d", |
2753 __KTRACE_OPT(KUSB, Kern::Printf("Realize: endpointNum %d in altSetting %d, alt table @ %d", |
2803 endpointNumber, (TUint)altSetting,bufInfo.iAltSettingsTbl->iAltTableOffset[altSetting]); |
2754 endpointNumber, altSetting,bufInfo.iAltSettingsTbl->iAltTableOffset[altSetting])); |
2804 |
2755 } |
2805 } |
2756 else |
2806 else |
2757 { |
2807 { |
2758 __KTRACE_OPT(KUSB, Kern::Printf("Realize: endpointNum NA in altSetting %d", altSetting)); |
2808 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP8, "Realize: endpointNum NA in altSetting %d", altSetting); |
2759 } |
2809 } |
2760 |
2810 |
2761 } // end for |
2811 } // end for |
2762 |
2812 |
2763 |
2813 |
2825 #ifdef _DEBUG |
2875 #ifdef _DEBUG |
2826 RealizeInterface_Dump((TUint*) iChunkInfo->iChunkMem); // Debug only tracing |
2876 RealizeInterface_Dump((TUint*) iChunkInfo->iChunkMem); // Debug only tracing |
2827 #endif |
2877 #endif |
2828 |
2878 |
2829 realize_end: |
2879 realize_end: |
2830 __KTRACE_OPT(KUSB, Kern::Printf("Realize: cleanup. Err=%d", errorOrChunk)); |
2880 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP9, "Realize: cleanup. Err=%d", errorOrChunk); |
2831 // Here we clean up after either success, or after bailing out early. |
2881 // Here we clean up after either success, or after bailing out early. |
2832 |
2882 |
2833 bufInfo.Free(); |
2883 bufInfo.Free(); |
2834 |
2884 |
2835 if (iChunkInfo) |
2885 if (iChunkInfo) |
2868 |
2918 |
2869 } // endif iChunkInfo |
2919 } // endif iChunkInfo |
2870 if (openedCS) |
2920 if (openedCS) |
2871 NKern::ThreadLeaveCS(); |
2921 NKern::ThreadLeaveCS(); |
2872 |
2922 |
2873 __KTRACE_OPT(KUSB, Kern::Printf("Realize: returning %x (%d)", errorOrChunk, errorOrChunk)); |
2923 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REALIZEINTERFACE_DUP10, "Realize: returning %x (%d)", errorOrChunk, errorOrChunk); |
2874 return errorOrChunk; |
2924 return errorOrChunk; |
2875 } // End RealizeInterface |
2925 } // End RealizeInterface |
2876 |
2926 |
2877 |
2927 |
2878 // |
2928 // |
2879 // DestroyAllInterfaces |
2929 // DestroyAllInterfaces |
2880 // |
2930 // |
2881 |
2931 |
2882 void DLddUsbcScChannel::DestroyAllInterfaces() |
2932 void DLddUsbcScChannel::DestroyAllInterfaces() |
2883 { |
2933 { |
2884 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyAllInterfaces")); |
2934 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES, "DLddUsbcScChannel::DestroyAllInterfaces" ); |
2935 |
|
2885 // Removes all interfaces |
2936 // Removes all interfaces |
2886 if (iAlternateSettingList) |
2937 if (iAlternateSettingList) |
2887 { |
2938 { |
2888 if (iAlternateSettingList->iHead != NULL) |
2939 if (iAlternateSettingList->iHead != NULL) |
2889 { |
2940 { |
2890 TUsbcScAlternateSetting* alternateSettingListRec = iAlternateSettingList->iTail; |
2941 TUsbcScAlternateSetting* alternateSettingListRec = iAlternateSettingList->iTail; |
2891 while (alternateSettingListRec) |
2942 while (alternateSettingListRec) |
2892 { |
2943 { |
2893 iAlternateSettingList->iTail = alternateSettingListRec->iPrevious; |
2944 iAlternateSettingList->iTail = alternateSettingListRec->iPrevious; |
2894 // If this contains NULL now that is only possible if the record to be deleted was at the head |
2945 // If this contains NULL now that is only possible if the record to be deleted was at the head |
2895 __KTRACE_OPT(KUSB, Kern::Printf("Release interface %d \n", alternateSettingListRec->iSetting)); |
2946 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES_DUP1, "Release interface %d \n", alternateSettingListRec->iSetting); |
2896 iController->ReleaseInterface(this, alternateSettingListRec->iSetting); |
2947 iController->ReleaseInterface(this, alternateSettingListRec->iSetting); |
2897 delete alternateSettingListRec; |
2948 delete alternateSettingListRec; |
2898 if (iAlternateSettingList->iTail == NULL) //No more interfaces left |
2949 if (iAlternateSettingList->iTail == NULL) //No more interfaces left |
2899 break; |
2950 break; |
2900 else |
2951 else |
2909 |
2960 |
2910 iNumberOfEndpoints = 0; |
2961 iNumberOfEndpoints = 0; |
2911 iAlternateSettingList = NULL; |
2962 iAlternateSettingList = NULL; |
2912 iValidInterface = EFalse; |
2963 iValidInterface = EFalse; |
2913 |
2964 |
2914 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyAllInterfaces done")); |
2965 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYALLINTERFACES_DUP2, "DLddUsbcScChannel::DestroyAllInterfaces done"); |
2915 } |
2966 } |
2916 |
2967 |
2917 |
2968 |
2918 |
2969 |
2919 |
2970 |
2922 // DestroyInterface |
2973 // DestroyInterface |
2923 // |
2974 // |
2924 |
2975 |
2925 void DLddUsbcScChannel::DestroyInterface(TUint aInterfaceNumber) |
2976 void DLddUsbcScChannel::DestroyInterface(TUint aInterfaceNumber) |
2926 { |
2977 { |
2927 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyInterface \n")); |
2978 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYINTERFACE, "DLddUsbcScChannel::DestroyInterface \n" ); |
2928 |
2979 |
2929 if (iAlternateSetting == aInterfaceNumber) |
2980 if (iAlternateSetting == aInterfaceNumber) |
2930 { |
2981 { |
2931 ResetInterface(KErrUsbInterfaceNotReady); |
2982 ResetInterface(KErrUsbInterfaceNotReady); |
2932 iValidInterface = EFalse; |
2983 iValidInterface = EFalse; |
2952 iAlternateSettingList->iTail = alternateSettingListRecFound->iPrevious; |
3003 iAlternateSettingList->iTail = alternateSettingListRecFound->iPrevious; |
2953 iAlternateSettingList->iTail->iNext = NULL; |
3004 iAlternateSettingList->iTail->iNext = NULL; |
2954 } |
3005 } |
2955 else //Somewhere in the middle (would not expect this in normal operation, but here for completeness) |
3006 else //Somewhere in the middle (would not expect this in normal operation, but here for completeness) |
2956 { |
3007 { |
2957 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DestroyInterface Middle interface!\n")); |
3008 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DESTROYINTERFACE_DUP1, "DLddUsbcScChannel::DestroyInterface Middle interface!\n" ); |
2958 alternateSettingListRec->iPrevious->iNext = alternateSettingListRec->iNext; |
3009 alternateSettingListRec->iPrevious->iNext = alternateSettingListRec->iNext; |
2959 alternateSettingListRec->iNext->iPrevious = alternateSettingListRec->iPrevious; |
3010 alternateSettingListRec->iNext->iPrevious = alternateSettingListRec->iPrevious; |
2960 } |
3011 } |
2961 |
3012 |
2962 delete alternateSettingListRecFound; |
3013 delete alternateSettingListRecFound; |
3002 // DestroyEp0 |
3053 // DestroyEp0 |
3003 // |
3054 // |
3004 |
3055 |
3005 void DLddUsbcScChannel::DestroyEp0() |
3056 void DLddUsbcScChannel::DestroyEp0() |
3006 { |
3057 { |
3007 __KTRACE_OPT(KUSB, Kern::Printf(" DLddUsbcScChannel::DestroyEp0")); |
3058 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DESTROYEP0, "DLddUsbcScChannel::DestroyEp0" ); |
3059 |
|
3008 delete iEp0Endpoint; |
3060 delete iEp0Endpoint; |
3009 iEp0Endpoint = NULL; |
3061 iEp0Endpoint = NULL; |
3010 } |
3062 } |
3011 |
3063 |
3012 |
3064 |
3013 void DLddUsbcScChannel::RequestCallbackEp0(TAny* aDLddUsbcScChannel) |
3065 void DLddUsbcScChannel::RequestCallbackEp0(TAny* aDLddUsbcScChannel) |
3014 { |
3066 { |
3015 DLddUsbcScChannel* channel = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3067 DLddUsbcScChannel* channel = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3016 |
3068 |
3017 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::RequestCallbackEp0")); |
3069 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0, "DLddUsbcScChannel::RequestCallbackEp0" ); |
3070 |
|
3018 |
3071 |
3019 if (channel->ChannelClosing()) |
3072 if (channel->ChannelClosing()) |
3020 { |
3073 { |
3021 __KTRACE_OPT(KUSB, Kern::Printf("Channel Closing: Completion not accepted!")); |
3074 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0_DUP1, "Channel Closing: Completion not accepted!" ); |
3022 return; |
3075 return; |
3023 } |
3076 } |
3024 |
3077 |
3025 switch (channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir) |
3078 switch (channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir) |
3026 { |
3079 { |
3029 return; |
3082 return; |
3030 case EControllerRead: |
3083 case EControllerRead: |
3031 channel->iBuffers[channel->iEP0OutBuff].CompleteRead(); |
3084 channel->iBuffers[channel->iEP0OutBuff].CompleteRead(); |
3032 return; |
3085 return; |
3033 default: |
3086 default: |
3034 Kern::Printf("DLddUsbcScChannel::RequestCallbackEp0 - Unexpected completion direction %d",channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir); |
3087 OstTrace1(TRACE_NORMAL, DLDDUSBCSCCHANNEL_REQUESTCALLBACKEP0_DUP2, "DLddUsbcScChannel::RequestCallbackEp0 - Unexpected completion direction %d",channel->iEp0Endpoint->iRequestCallbackInfo->iTransferDir); |
3035 Kern::Fault("DLddUsbcScChannel::RequestCallbackEp0", __LINE__); |
3088 Kern::Fault("DLddUsbcScChannel::RequestCallbackEp0", __LINE__); |
3036 } |
3089 } |
3037 } |
3090 } |
3038 |
3091 |
3039 |
3092 |
3045 // EndpointStatusChangeCallback |
3098 // EndpointStatusChangeCallback |
3046 // |
3099 // |
3047 |
3100 |
3048 void DLddUsbcScChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcScChannel) |
3101 void DLddUsbcScChannel::EndpointStatusChangeCallback(TAny* aDLddUsbcScChannel) |
3049 { |
3102 { |
3050 __KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback")); |
3103 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK, "DLddUsbcScChannel::EndpointStatusChangeCallback" ); |
3104 |
|
3051 DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3105 DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3052 if (dUsbc->iChannelClosing) |
3106 if (dUsbc->iChannelClosing) |
3053 return; |
3107 return; |
3054 TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State(); |
3108 TUint endpointState = dUsbc->iEndpointStatusCallbackInfo.State(); |
3055 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestEndpointStatusNotify; |
3109 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestEndpointStatusNotify; |
3056 if (dUsbc->iRequestStatus[reqNo]) |
3110 if (dUsbc->iRequestStatus[reqNo]) |
3057 { |
3111 { |
3058 __KTRACE_OPT(KUSB, Kern::Printf("EndpointStatusChangeCallback Notify status")); |
3112 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_ENDPOINTSTATUSCHANGECALLBACK_DUP1, "EndpointStatusChangeCallback Notify status" ); |
3059 DThread* client = dUsbc->iClient; |
3113 DThread* client = dUsbc->iClient; |
3060 // set client descriptor length to zero |
3114 // set client descriptor length to zero |
3061 TInt r = Kern::ThreadRawWrite(client, dUsbc->iEndpointStatusChangePtr, &endpointState, |
3115 TInt r = Kern::ThreadRawWrite(client, dUsbc->iEndpointStatusChangePtr, &endpointState, |
3062 sizeof(TUint), client); |
3116 sizeof(TUint), client); |
3063 if (r != KErrNone) |
3117 if (r != KErrNone) |
3082 TInt i; |
3136 TInt i; |
3083 for (i = 0; |
3137 for (i = 0; |
3084 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState); |
3138 (i < KUsbcDeviceStateRequests) && ((deviceState = dUsbc->iStatusCallbackInfo.State(i)) != EUsbcNoState); |
3085 ++i) |
3139 ++i) |
3086 { |
3140 { |
3087 __KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallBack status=%d", deviceState)); |
3141 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STATUSCHANGECALLBACK, "StatusChangeCallBack status=%d", deviceState); |
3142 |
|
3088 if (deviceState & KUsbAlternateSetting) |
3143 if (deviceState & KUsbAlternateSetting) |
3089 { |
3144 { |
3090 dUsbc->ProcessAlternateSetting(deviceState); |
3145 dUsbc->ProcessAlternateSetting(deviceState); |
3091 } |
3146 } |
3092 else |
3147 else |
3112 } |
3167 } |
3113 |
3168 |
3114 |
3169 |
3115 void DLddUsbcScChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcScChannel) |
3170 void DLddUsbcScChannel::OtgFeatureChangeCallback(TAny* aDLddUsbcScChannel) |
3116 { |
3171 { |
3117 __KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback")); |
3172 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_OTGFEATURECHANGECALLBACK, "DLddUsbcScChannel::OtgFeatureChangeCallback" ); |
3173 |
|
3118 DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3174 DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel; |
3119 if (dUsbc->iChannelClosing) |
3175 if (dUsbc->iChannelClosing) |
3120 return; |
3176 return; |
3121 |
3177 |
3122 TUint8 features; |
3178 TUint8 features; |
3124 dUsbc->iController->GetCurrentOtgFeatures(features); |
3180 dUsbc->iController->GetCurrentOtgFeatures(features); |
3125 |
3181 |
3126 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestOtgFeaturesNotify; |
3182 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestOtgFeaturesNotify; |
3127 if (dUsbc->iRequestStatus[reqNo]) |
3183 if (dUsbc->iRequestStatus[reqNo]) |
3128 { |
3184 { |
3129 __KTRACE_OPT(KUSB, Kern::Printf("OtgFeatureChangeCallback Notify status")); |
3185 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_OTGFEATURECHANGECALLBACK_DUP1, "OtgFeatureChangeCallback Notify status" ); |
3130 TInt r = Kern::ThreadRawWrite(dUsbc->iClient, dUsbc->iOtgFeatureChangePtr, |
3186 TInt r = Kern::ThreadRawWrite(dUsbc->iClient, dUsbc->iOtgFeatureChangePtr, |
3131 &features, sizeof(TUint8), dUsbc->iClient); |
3187 &features, sizeof(TUint8), dUsbc->iClient); |
3132 if (r != KErrNone) |
3188 if (r != KErrNone) |
3133 dUsbc->PanicClientThread(r); |
3189 dUsbc->PanicClientThread(r); |
3134 Kern::RequestComplete(dUsbc->iClient, dUsbc->iRequestStatus[reqNo], r); |
3190 Kern::RequestComplete(dUsbc->iClient, dUsbc->iRequestStatus[reqNo], r); |
3202 { |
3258 { |
3203 return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber(); |
3259 return alternateSettingListRec->iEndpoint[aEndpoint]->RealEpNumber(); |
3204 } |
3260 } |
3205 else |
3261 else |
3206 { |
3262 { |
3207 __KTRACE_OPT(KPANIC, Kern::Printf(" Error: aEndpoint %d wrong for aAlternateSetting %d", |
3263 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_EPFROMALTERNATESETTING, " Error: aEndpoint %d wrong for aAlternateSetting %d", |
3208 aEndpoint, aAlternateSetting)); |
3264 aEndpoint, aAlternateSetting); |
3265 |
|
3209 return KErrNotFound; |
3266 return KErrNotFound; |
3210 } |
3267 } |
3211 } |
3268 } |
3212 alternateSettingListRec = alternateSettingListRec->iNext; |
3269 alternateSettingListRec = alternateSettingListRec->iNext; |
3213 } |
3270 } |
3214 __KTRACE_OPT(KPANIC, Kern::Printf(" Error: no aAlternateSetting %d found", aAlternateSetting)); |
3271 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FATAL, DLDDUSBCSCCHANNEL_EPFROMALTERNATESETTING_DUP1, " Error: no aAlternateSetting %d found", aAlternateSetting); |
3215 return KErrNotFound; |
3272 return KErrNotFound; |
3216 } |
3273 } |
3217 |
3274 |
3218 // |
3275 // |
3219 // ProcessAlternateSetting |
3276 // ProcessAlternateSetting |
3221 |
3278 |
3222 TInt DLddUsbcScChannel::ProcessAlternateSetting(TUint aAlternateSetting) |
3279 TInt DLddUsbcScChannel::ProcessAlternateSetting(TUint aAlternateSetting) |
3223 { |
3280 { |
3224 |
3281 |
3225 TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting); |
3282 TUint newSetting = aAlternateSetting&(~KUsbAlternateSetting); |
3226 __KTRACE_OPT(KUSB, Kern::Printf("ProcessAlternateSetting 0x%08x selecting alternate setting 0x%08x", aAlternateSetting, newSetting)); |
3283 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSALTERNATESETTING, "ProcessAlternateSetting 0x%08x selecting alternate setting 0x%08x", aAlternateSetting, newSetting); |
3284 |
|
3227 iUserKnowsAltSetting=EFalse; |
3285 iUserKnowsAltSetting=EFalse; |
3228 iAlternateSetting = newSetting; |
3286 iAlternateSetting = newSetting; |
3229 iAsSeq++; |
3287 iAsSeq++; |
3230 |
3288 |
3231 ResetInterface(KErrUsbInterfaceChange); // kill any outstanding IN transfers |
3289 ResetInterface(KErrUsbInterfaceChange); // kill any outstanding IN transfers |
3245 // |
3303 // |
3246 // Called from StatusChangeCallback. |
3304 // Called from StatusChangeCallback. |
3247 |
3305 |
3248 TInt DLddUsbcScChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState) |
3306 TInt DLddUsbcScChannel::ProcessDeviceState(TUsbcDeviceState aDeviceState) |
3249 { |
3307 { |
3250 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState)); |
3308 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE, "DLddUsbcScChannel::ProcessDeviceState(%d -> %d)", iDeviceState, aDeviceState); |
3309 |
|
3251 if (iDeviceState == aDeviceState) |
3310 if (iDeviceState == aDeviceState) |
3252 { |
3311 { |
3253 __KTRACE_OPT(KUSB, Kern::Printf(" No state change => nothing to be done.")); |
3312 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP1, " No state change => nothing to be done."); |
3254 return KErrNone; |
3313 return KErrNone; |
3255 } |
3314 } |
3256 if (iDeviceState == EUsbcDeviceStateSuspended) |
3315 if (iDeviceState == EUsbcDeviceStateSuspended) |
3257 { |
3316 { |
3258 __KTRACE_OPT(KUSB, Kern::Printf(" Coming out of Suspend: old state = %d", iOldDeviceState)); |
3317 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP2, " Coming out of Suspend: old state = %d", iOldDeviceState); |
3259 iDeviceState = iOldDeviceState; |
3318 iDeviceState = iOldDeviceState; |
3260 if (iDeviceState == aDeviceState) |
3319 if (iDeviceState == aDeviceState) |
3261 { |
3320 { |
3262 __KTRACE_OPT(KUSB, Kern::Printf(" New state same as before Suspend => nothing to be done.")); |
3321 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP3, " New state same as before Suspend => nothing to be done."); |
3263 return KErrNone; |
3322 return KErrNone; |
3264 } |
3323 } |
3265 } |
3324 } |
3266 TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured); |
3325 TBool renumerateState = (aDeviceState == EUsbcDeviceStateConfigured); |
3267 TBool deconfigured = EFalse; |
3326 TBool deconfigured = EFalse; |
3268 TInt cancellationCode = KErrNone; |
3327 TInt cancellationCode = KErrNone; |
3269 if (aDeviceState == EUsbcDeviceStateSuspended) |
3328 if (aDeviceState == EUsbcDeviceStateSuspended) |
3270 { |
3329 { |
3271 __KTRACE_OPT(KUSB, Kern::Printf(" Suspending...")); |
3330 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP4, " Suspending..."); |
3272 iOldDeviceState = iDeviceState; |
3331 iOldDeviceState = iDeviceState; |
3273 // Put PSL into low power mode here |
3332 // Put PSL into low power mode here |
3274 } |
3333 } |
3275 else |
3334 else |
3276 { |
3335 { |
3298 { |
3357 { |
3299 DeConfigure(cancellationCode); |
3358 DeConfigure(cancellationCode); |
3300 } |
3359 } |
3301 else if (renumerateState) |
3360 else if (renumerateState) |
3302 { |
3361 { |
3303 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChannel:: Reumerated!")); |
3362 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP5, "TUsbcScChannel:: Reumerated!"); |
3304 // Select main interface & latch in new endpoint set |
3363 // Select main interface & latch in new endpoint set |
3305 SelectAlternateSetting(0); |
3364 SelectAlternateSetting(0); |
3306 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScChannel:: StartReads!")); |
3365 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_PROCESSDEVICESTATE_DUP6, "TUsbcScChannel:: StartReads!"); |
3307 StartEpReads(); |
3366 StartEpReads(); |
3308 } |
3367 } |
3309 } |
3368 } |
3310 |
3369 |
3311 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestReEnumerate; |
3370 const TInt reqNo = (TInt) RDevUsbcScClient::ERequestReEnumerate; |
3329 TUint32 deviceState; |
3388 TUint32 deviceState; |
3330 if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone) |
3389 if (iStatusFifo->GetDeviceQueuedStatus(deviceState) == KErrNone) |
3331 { |
3390 { |
3332 // Device state waiting to be sent userside |
3391 // Device state waiting to be sent userside |
3333 completeNow = ETrue; |
3392 completeNow = ETrue; |
3334 __KTRACE_OPT(KUSB, Kern::Printf("StatusChangeCallback Notify status")); |
3393 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_ALTERNATEDEVICESTATETESTCOMPLETE, "StatusChangeCallback Notify status" ); |
3394 |
|
3335 // set client descriptor length to zero |
3395 // set client descriptor length to zero |
3336 TInt r = Kern::ThreadRawWrite(iClient, iStatusChangePtr, &deviceState, |
3396 TInt r = Kern::ThreadRawWrite(iClient, iStatusChangePtr, &deviceState, |
3337 sizeof(TUint32), iClient); |
3397 sizeof(TUint32), iClient); |
3338 if (r != KErrNone) |
3398 if (r != KErrNone) |
3339 PanicClientThread(r); |
3399 PanicClientThread(r); |
3344 } |
3404 } |
3345 |
3405 |
3346 |
3406 |
3347 void DLddUsbcScChannel::DeConfigure(TInt aErrorCode) |
3407 void DLddUsbcScChannel::DeConfigure(TInt aErrorCode) |
3348 { |
3408 { |
3349 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DeConfigure()")); |
3409 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DECONFIGURE, "DLddUsbcScChannel::DeConfigure()" ); |
3410 |
|
3350 // Called after deconfiguration. Cancels transfers on all endpoints. |
3411 // Called after deconfiguration. Cancels transfers on all endpoints. |
3351 ResetInterface(aErrorCode); |
3412 ResetInterface(aErrorCode); |
3352 // Cancel the endpoint status notify request if it is outstanding. |
3413 // Cancel the endpoint status notify request if it is outstanding. |
3353 const TInt KEpNotReq = RDevUsbcScClient::ERequestEndpointStatusNotify; |
3414 const TInt KEpNotReq = RDevUsbcScClient::ERequestEndpointStatusNotify; |
3354 if (iRequestStatus[KEpNotReq]) |
3415 if (iRequestStatus[KEpNotReq]) |
3364 |
3425 |
3365 void DLddUsbcScChannel::StartEpReads() |
3426 void DLddUsbcScChannel::StartEpReads() |
3366 { |
3427 { |
3367 // Queued after enumeration. Starts reads on all endpoints. |
3428 // Queued after enumeration. Starts reads on all endpoints. |
3368 // The endpoint itself decides if it can do a read |
3429 // The endpoint itself decides if it can do a read |
3369 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 1")); |
3430 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_STARTEPREADS, "DLddUsbcScChannel::StartEpReads - 1" ); |
3370 |
3431 |
3371 TInt i; |
3432 TInt i; |
3372 TInt8 needsPacket; |
3433 TInt8 needsPacket; |
3373 |
3434 |
3374 for (i=0; i<iNumBuffers; i++) |
3435 for (i=0; i<iNumBuffers; i++) |
3375 { |
3436 { |
3376 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 2 %d",i)); |
3437 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP1, "DLddUsbcScChannel::StartEpReads - 2 %d", i); |
3377 |
|
3378 needsPacket = iBuffers[i].iNeedsPacket; |
3438 needsPacket = iBuffers[i].iNeedsPacket; |
3379 if (needsPacket) |
3439 if (needsPacket) |
3380 { |
3440 { |
3381 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 3")); |
3441 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP2, "DLddUsbcScChannel::StartEpReads - 3"); |
3382 iBuffers[i].UpdateBufferList(0,0,(needsPacket==TUsbcScBuffer::KEpIsStarting)); |
3442 iBuffers[i].UpdateBufferList(0,0,(needsPacket==TUsbcScBuffer::KEpIsStarting)); |
3383 } |
3443 } |
3384 } |
3444 } |
3385 |
3445 |
3386 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 4")); |
3446 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP3, "DLddUsbcScChannel::StartEpReads - 4"); |
3387 |
|
3388 // now update ep0 |
3447 // now update ep0 |
3389 iBuffers[iEP0OutBuff].Ep0CancelLddRead(); |
3448 iBuffers[iEP0OutBuff].Ep0CancelLddRead(); |
3390 iBuffers[iEP0OutBuff].UpdateBufferList(0,0); |
3449 iBuffers[iEP0OutBuff].UpdateBufferList(0,0); |
3391 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::StartEpReads - 5")); |
3450 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_STARTEPREADS_DUP4, "DLddUsbcScChannel::StartEpReads - 5"); |
3392 |
3451 |
3393 } |
3452 } |
3394 |
3453 |
3395 |
3454 |
3396 void DLddUsbcScChannel::ResetInterface(TInt aErrorCode) |
3455 void DLddUsbcScChannel::ResetInterface(TInt aErrorCode) |
3408 |
3467 |
3409 for (i = 1; i <= iNumberOfEndpoints; i++) |
3468 for (i = 1; i <= iNumberOfEndpoints; i++) |
3410 { |
3469 { |
3411 // Firstly, cancel ('garbge collect') any stale reads/writes into PIL. |
3470 // Firstly, cancel ('garbge collect') any stale reads/writes into PIL. |
3412 |
3471 |
3413 __KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i)); |
3472 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_RESETINTERFACE, "Cancelling transfer ep=%d", i); |
3473 |
|
3414 iEndpoint[i]->AbortTransfer(); |
3474 iEndpoint[i]->AbortTransfer(); |
3415 |
3475 |
3416 // All OUT endpoints need a packet sent, to indicate the termination of the current ep 'pipe'. |
3476 // All OUT endpoints need a packet sent, to indicate the termination of the current ep 'pipe'. |
3417 // This will complete any current read, or will be read later. |
3477 // This will complete any current read, or will be read later. |
3418 // All IN endpoints must be simply cancelled, including anything queued. |
3478 // All IN endpoints must be simply cancelled, including anything queued. |
3437 ((DLddUsbcScChannel*) aDLddUsbcScChannel)->DoEmergencyComplete(); |
3497 ((DLddUsbcScChannel*) aDLddUsbcScChannel)->DoEmergencyComplete(); |
3438 } |
3498 } |
3439 |
3499 |
3440 TInt DLddUsbcScChannel::DoEmergencyComplete() |
3500 TInt DLddUsbcScChannel::DoEmergencyComplete() |
3441 { |
3501 { |
3442 __KTRACE_OPT(KUSB, Kern::Printf("DLddUsbcScChannel::DoEmergencyComplete")); |
3502 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE, "DLddUsbcScChannel::DoEmergencyComplete" ); |
3503 |
|
3443 // cancel any pending DFCs |
3504 // cancel any pending DFCs |
3444 // complete all client requests |
3505 // complete all client requests |
3445 |
3506 |
3446 TUsbcScBuffer* buffer; |
3507 TUsbcScBuffer* buffer; |
3447 TInt i; |
3508 TInt i; |
3460 } |
3521 } |
3461 |
3522 |
3462 // Complete other Eps request |
3523 // Complete other Eps request |
3463 for (i = 1; i <= iNumberOfEndpoints; i++) |
3524 for (i = 1; i <= iNumberOfEndpoints; i++) |
3464 { |
3525 { |
3465 __KTRACE_OPT(KUSB, Kern::Printf("Cancelling transfer ep=%d", i)); |
3526 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE_DUP1, "Cancelling transfer ep=%d", i); |
3466 buffer=iEndpoint[i]->GetBuffer(); |
3527 buffer=iEndpoint[i]->GetBuffer(); |
3467 buffer->iStatusList.CancelQueued(); |
3528 buffer->iStatusList.CancelQueued(); |
3468 buffer->iStatusList.Complete(KErrDisconnected); |
3529 buffer->iStatusList.Complete(KErrDisconnected); |
3469 } |
3530 } |
3470 |
3531 |
3472 |
3533 |
3473 for (TInt i = 0; i < KUsbcMaxRequests; i++) |
3534 for (TInt i = 0; i < KUsbcMaxRequests; i++) |
3474 { |
3535 { |
3475 if (iRequestStatus[i]) |
3536 if (iRequestStatus[i]) |
3476 { |
3537 { |
3477 __KTRACE_OPT(KUSB, Kern::Printf("Complete request 0x%x", iRequestStatus[i])); |
3538 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, DLDDUSBCSCCHANNEL_DOEMERGENCYCOMPLETE_DUP2, "Complete request 0x%x", iRequestStatus[i]); |
3478 Kern::RequestComplete(iClient, iRequestStatus[i], KErrDisconnected); |
3539 Kern::RequestComplete(iClient, iRequestStatus[i], KErrDisconnected); |
3479 } |
3540 } |
3480 } |
3541 } |
3481 iStatusCallbackInfo.Cancel(); |
3542 iStatusCallbackInfo.Cancel(); |
3482 iEndpointStatusCallbackInfo.Cancel(); |
3543 iEndpointStatusCallbackInfo.Cancel(); |
3515 iLdd(aLDD), |
3576 iLdd(aLDD), |
3516 iError(KErrNone), |
3577 iError(KErrNone), |
3517 iBytesTransferred(0), |
3578 iBytesTransferred(0), |
3518 iBuffer(NULL) |
3579 iBuffer(NULL) |
3519 { |
3580 { |
3520 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::TUsbcScEndpoint")); |
3581 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_TUSBCSCENDPOINT_CONS, "TUsbcScEndpoint::TUsbcScEndpoint" ); |
3582 |
|
3521 } |
3583 } |
3522 |
3584 |
3523 |
3585 |
3524 TInt TUsbcScEndpoint::Construct() |
3586 TInt TUsbcScEndpoint::Construct() |
3525 { |
3587 { |
3526 __KTRACE_OPT(KUSB,Kern::Printf("TUsbcScEndpoint::TUsbcScEndpoint iEndpointNumber %d\n",iEndpointNumber)); |
3588 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_CONSTRUCT, "TUsbcScEndpoint::TUsbcScEndpoint iEndpointNumber %d\n",iEndpointNumber); |
3527 |
3589 |
3528 iRequestCallbackInfo = new TUsbcRequestCallback(iLdd, |
3590 iRequestCallbackInfo = new TUsbcRequestCallback(iLdd, |
3529 iEndpointNumber, |
3591 iEndpointNumber, |
3530 (iEndpointNumber==0)?DLddUsbcScChannel::RequestCallbackEp0:TUsbcScEndpoint::RequestCallback, |
3592 (iEndpointNumber==0)?DLddUsbcScChannel::RequestCallbackEp0:TUsbcScEndpoint::RequestCallback, |
3531 (iEndpointNumber==0)? (TAny*) iLdd: (TAny*) this, |
3593 (iEndpointNumber==0)? (TAny*) iLdd: (TAny*) this, |
3532 iLdd->iDfcQ, |
3594 iLdd->iDfcQ, |
3536 } |
3598 } |
3537 |
3599 |
3538 |
3600 |
3539 TUsbcScEndpoint::~TUsbcScEndpoint() |
3601 TUsbcScEndpoint::~TUsbcScEndpoint() |
3540 { |
3602 { |
3541 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::~TUsbcScEndpoint(%d)", iEndpointNumber)); |
3603 OstTraceDef1(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_TUSBCSCENDPOINT_DES, "TUsbcScEndpoint::~TUsbcScEndpoint(%d)", iEndpointNumber); |
3604 |
|
3542 AbortTransfer(); |
3605 AbortTransfer(); |
3543 delete iRequestCallbackInfo; |
3606 delete iRequestCallbackInfo; |
3544 } |
3607 } |
3545 |
3608 |
3546 // This is called by the PIL, on return from a read or write. |
3609 // This is called by the PIL, on return from a read or write. |
3547 // Inturn it calls either the read or write function for that buffer. |
3610 // Inturn it calls either the read or write function for that buffer. |
3548 |
3611 |
3549 void TUsbcScEndpoint::RequestCallback(TAny* aTUsbcScEndpoint) |
3612 void TUsbcScEndpoint::RequestCallback(TAny* aTUsbcScEndpoint) |
3550 { |
3613 { |
3551 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::RequestCallback")); |
3614 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCENDPOINT_REQUESTCALLBACK, "TUsbcScEndpoint::RequestCallback" ); |
3552 |
3615 |
3553 if (((TUsbcScEndpoint*)aTUsbcScEndpoint)->iLdd->ChannelClosing()) |
3616 if (((TUsbcScEndpoint*)aTUsbcScEndpoint)->iLdd->ChannelClosing()) |
3554 { |
3617 { |
3555 __KTRACE_OPT(KUSB, Kern::Printf("Channel Closing: Completion not accepted!")); |
3618 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_REQUESTCALLBACK_DUP1, "Channel Closing: Completion not accepted!" ); |
3556 return; |
3619 return; |
3557 } |
3620 } |
3558 |
3621 |
3559 switch (((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir) |
3622 switch (((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir) |
3560 { |
3623 { |
3563 return; |
3626 return; |
3564 case EControllerRead: |
3627 case EControllerRead: |
3565 ((TUsbcScEndpoint*) aTUsbcScEndpoint)->iBuffer->CompleteRead(); |
3628 ((TUsbcScEndpoint*) aTUsbcScEndpoint)->iBuffer->CompleteRead(); |
3566 return; |
3629 return; |
3567 default: |
3630 default: |
3568 Kern::Printf("TUsbcScEndpoint::RequestCallback - Unexpected compleation direction %d",((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir); |
3631 OstTrace1(TRACE_NORMAL, TUSBCSCENDPOINT_REQUESTCALLBACK_DUP2, "TUsbcScEndpoint::RequestCallback - Unexpected compleation direction %d",((TUsbcScEndpoint*) aTUsbcScEndpoint)->iRequestCallbackInfo->iTransferDir); |
3569 Kern::Fault("TUsbcScEndpoint::RequestCallback", __LINE__); |
3632 Kern::Fault("TUsbcScEndpoint::RequestCallback", __LINE__); |
3570 } |
3633 } |
3571 } |
3634 } |
3572 |
3635 |
3573 |
3636 |
3579 |
3642 |
3580 void TUsbcScEndpoint::AbortTransfer() |
3643 void TUsbcScEndpoint::AbortTransfer() |
3581 { |
3644 { |
3582 if (!iLdd->iRealizeCalled) |
3645 if (!iLdd->iRealizeCalled) |
3583 { |
3646 { |
3584 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d - N.R.",iEndpointNumber, iRealEpNumber)); |
3647 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER, "TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d - N.R.",iEndpointNumber, iRealEpNumber); |
3648 |
|
3585 return; |
3649 return; |
3586 } |
3650 } |
3587 else |
3651 else |
3588 { |
3652 { |
3589 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d",iEndpointNumber, iRealEpNumber)); |
3653 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP1, "TUsbcScEndpoint::AbortTransfer Ep# %d Real Ep # %d",iEndpointNumber, iRealEpNumber); |
3590 } |
3654 } |
3591 |
3655 |
3592 |
3656 |
3593 if (iBuffer && (iBuffer->iStatusList.iState) || (!iRealEpNumber)) |
3657 if (iBuffer && (iBuffer->iStatusList.iState) || (!iRealEpNumber)) |
3594 { |
3658 { |
3598 iController->CancelReadBuffer(iLdd, iRealEpNumber); |
3662 iController->CancelReadBuffer(iLdd, iRealEpNumber); |
3599 else |
3663 else |
3600 { |
3664 { |
3601 if (iEndpointNumber!=0) // endpoint zero starts off not sent in any direction, then keeps changing. |
3665 if (iEndpointNumber!=0) // endpoint zero starts off not sent in any direction, then keeps changing. |
3602 { |
3666 { |
3603 __KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: Invalid Direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber)); |
3667 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP2, "\nTUsbcScEndpoint::AbortTransfer WARNING: Invalid Direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber); |
3604 } |
3668 } |
3605 else |
3669 else |
3606 { |
3670 { |
3607 __KTRACE_OPT(KUSB, Kern::Printf("\nTUsbcScEndpoint::AbortTransfer Can't stop direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber)); |
3671 OstTraceDefExt3(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP3, "\nTUsbcScEndpoint::AbortTransfer Can't stop direction %d on (%d,%d)!\n",iRequestCallbackInfo->iTransferDir,iEndpointNumber, iRealEpNumber); |
3608 } |
3672 } |
3609 } |
3673 } |
3610 } |
3674 } |
3611 else if (!iBuffer) |
3675 else if (!iBuffer) |
3612 { |
3676 { |
3613 __KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: iBuffer is NULL on (%d,%d)\n",iEndpointNumber, iRealEpNumber)); |
3677 OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP4, "\nTUsbcScEndpoint::AbortTransfer WARNING: iBuffer is NULL on (%d,%d)\n",iEndpointNumber, iRealEpNumber); |
3678 |
|
3614 return; |
3679 return; |
3615 } |
3680 } |
3616 |
3681 |
3617 if (iRequestCallbackInfo) |
3682 if (iRequestCallbackInfo) |
3618 iRequestCallbackInfo->iDfc.Cancel(); |
3683 iRequestCallbackInfo->iDfc.Cancel(); |
3619 else |
3684 else |
3620 { |
3685 { |
3621 __KTRACE_OPT(KUSB,Kern::Printf("\nTUsbcScEndpoint::AbortTransfer WARNING: iRequestCallbackInfo is NULL\n")); |
3686 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP5, "\nTUsbcScEndpoint::AbortTransfer WARNING: iRequestCallbackInfo is NULL\n"); |
3687 |
|
3622 } |
3688 } |
3623 |
3689 |
3624 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScEndpoint Done.")); |
3690 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_NORMAL, TUSBCSCENDPOINT_ABORTTRANSFER_DUP6, "TUsbcScEndpoint Done."); |
3625 } |
3691 } |
3626 |
3692 |
3627 // End TUsbcScEndpoint |
3693 // End TUsbcScEndpoint |
3628 |
3694 |
3629 |
3695 |
3648 } |
3714 } |
3649 |
3715 |
3650 |
3716 |
3651 TUsbcScAlternateSetting::~TUsbcScAlternateSetting() |
3717 TUsbcScAlternateSetting::~TUsbcScAlternateSetting() |
3652 { |
3718 { |
3653 __KTRACE_OPT(KUSB, Kern::Printf("TUsbcScAlternateSetting::~TUsbcScAlternateSetting()")); |
3719 OstTraceDef0(OST_TRACE_CATEGORY_RND, TRACE_FLOW, TUSBCSCALTERNATESETTING_TUSBCSCALTERNATESETTING_DES, "TUsbcScAlternateSetting::~TUsbcScAlternateSetting()" ); |
3720 |
|
3654 for (TInt i = 0; i <= KMaxEndpointsPerClient; i++) |
3721 for (TInt i = 0; i <= KMaxEndpointsPerClient; i++) |
3655 { |
3722 { |
3656 delete iEndpoint[i]; |
3723 delete iEndpoint[i]; |
3657 } |
3724 } |
3658 } |
3725 } |