Author: gkruse Date: 2006-08-23 04:18:02 +0200 (Wed, 23 Aug 2006) New Revision: 167 Modified: trunk/Sources/Core/WaveNet.mm trunk/Sources/Driver/USBIntersilJack/USBIntersil.h trunk/Sources/Driver/USBIntersilJack/USBIntersil.mm Log: Clear the pipe as we should if IOKit reports it is stalled. Maybe we should pay attention to what IOKit is telling us instead of just failing miserably. In my tests, this keeps km from hanging about 50% of the time when a stall occurs vs 100% previously. Not much of an improvement but it is one. Modified: trunk/Sources/Core/WaveNet.mm =================================================================== --- trunk/Sources/Core/WaveNet.mm 2006-08-22 13:53:32 UTC (rev 166) +++ trunk/Sources/Core/WaveNet.mm 2006-08-23 02:18:02 UTC (rev 167) @@ -932,7 +932,7 @@ NSAssert(_ivData[body[3]], @"unable to allocate weak container"); } @synchronized (_ivData[body[3]]) { - [_ivData[body[3]] setBytes:&body[4] forIV:&body[0]]; + [_ivData[body[3]] setBytes:&body[4] forIV:&body[0]];//look here! } } } Modified: trunk/Sources/Driver/USBIntersilJack/USBIntersil.h =================================================================== --- trunk/Sources/Driver/USBIntersilJack/USBIntersil.h 2006-08-22 13:53:32 UTC (rev 166) +++ trunk/Sources/Driver/USBIntersilJack/USBIntersil.h 2006-08-23 02:18:02 UTC (rev 167) @@ -101,7 +101,7 @@ CFRunLoopSourceRef _runLoopSource; io_iterator_t _deviceAddedIter; io_iterator_t _deviceRemovedIter; - IOUSBInterfaceInterface** _interface; + IOUSBInterfaceInterface192** _interface; union _usbout _outputBuffer; union _usbin _inputBuffer; union _usbin _recieveBuffer; Modified: trunk/Sources/Driver/USBIntersilJack/USBIntersil.mm =================================================================== --- trunk/Sources/Driver/USBIntersilJack/USBIntersil.mm 2006-08-22 13:53:32 UTC (rev 166) +++ trunk/Sources/Driver/USBIntersilJack/USBIntersil.mm 2006-08-23 02:18:02 UTC (rev 167) @@ -599,7 +599,7 @@ kr = (*_interface)->WritePipe(_interface, kOutPipe, &_outputBuffer, size); if (kr != kIOReturnSuccess) { if (kr==wlcDeviceGone) _devicePresent = false; - else NSLog(@"USBIntersilJack::unable to write to USB Device(%08x)\n", kr); + NSLog(@"USBIntersilJack::unable to write to USB Device(%08x)\n", kr); return kr; } @@ -629,7 +629,13 @@ pthread_mutex_unlock(&me->_recv_mutex); return; } else { - NSLog(@"error from async interruptRecieved (%08x)\n", result); + if (result == kIOReturnOverrun) { //for some reason we overran the device buffer + NSLog(@"USBIntersilJack::Data overrun, attempting to clear the pipe stall"); + result = (*me->_interface)->ClearPipeStallBothEnds(me->_interface, kInPipe); //3 appears to be the interrupt pipe + } + else { + NSLog(@"USBIntersilJack::Unhandled error from async interrupt recieved, please report on http://trac.kismac.de (%08x)\n", result); + } if (me->_devicePresent) goto readon; } } @@ -707,13 +713,21 @@ bzero(&me->_recieveBuffer, sizeof(me->_recieveBuffer)); kr = (*me->_interface)->ReadPipeAsync((me->_interface), kInPipe, &me->_recieveBuffer, sizeof(me->_recieveBuffer), (IOAsyncCallback1)_interruptRecieved, refCon); if (kIOReturnSuccess != kr) { - NSLog(@"unable to do async interrupt read (%08x). this means the card is stopped!\n", kr); + NSLog(@"USBIntersilJack::Unable to do async interrupt read (%08x). The card is stopped!\n", kr); + if (kr == kIOReturnNoDevice) { + NSLog(@"USBIntersilJack::There is no connection to an IOService,"); + _devicePresent = false; + } + if (kr == kIOReturnNotOpen) { + NSLog(@"USBIntersilJack::Pipe not open for exclusive access."); + _devicePresent = false; + } + //we should never get here because some devices don't like to be inited more than once, however this might do something good // I haven't been able to reproduce the error that caused it to hit this point in the code again since adding the following lines // however, when it hit this point previously, the only solution was to kill and relaunch KisMAC, so at least this won't make anything worse NSLog(@"Attempting to re-initialise adapter..."); if (me->_init() != kIOReturnSuccess) NSLog(@"USBIntersilJack::_interruptReceived: _init() failed\n"); } - } #pragma mark - @@ -748,7 +762,7 @@ io_iterator_t iterator; io_service_t usbInterface; IOCFPlugInInterface **plugInInterface = NULL; - IOUSBInterfaceInterface **intf = NULL; + IOUSBInterfaceInterface192 **intf = NULL; HRESULT res; SInt32 score; UInt8 intfClass;