kIOUSBEndpointCount Errore superato quando si collega un dispositivo USB


1

Tengo un sacco di dispositivi USB inseriti nel mio MacBook Pro Mid-15 da 15 pollici per il mio lavoro.

Questo MacBook Pro ha 2 porte USB esterne. In uno è per un fan del portatile, e l'altro è un Hub USB che ha un altro hub USB e l'hub del mio monitor Dell U2713HM.

Apparentemente i dispositivi non funzionerebbero a caso o sarebbero altrimenti ... rilevati a metà? Appariranno nell'elenco dei dispositivi USB ma non funzioneranno correttamente, anche se in passato. Passarli attraverso un'installazione di Windows su Parallels aveva solo metà risultati. Spesso il dispositivo è stato rilevato a livello USB ma non è riuscito a livello di software. Inserirli in un laptop Windows dedicato ha dimostrato che funzionavano bene.

Ho installato i driver di registrazione IOUSBFamily. USB Prober.app con dettagli impostati su 5 ha mostrato quanto segue nel registro quando si collega un dispositivo:

Sep  2 10:52:41.274  [5]    AppleUSBHub[0xffffff8026d7f800]::ProcessStatusChanged found (0x       2) in statusChangedBitmap
Sep  2 10:52:41.274  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(+) now (1)
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler: port 1 obtained runLock (_hasExternalConnector: 0)
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler: calling GetPortStatus for port 1
Sep  2 10:52:41.274  [5]    AppleUSBHub[0xffffff8026d7f800]::powerChangeDone - spawning _checkForActivePortsThread
Sep  2 10:52:41.274  [4]    AppleUSBHub[0xffffff8026d7f800]::CheckForActivePorts - this hub does not allow low power, so abandoning
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - Hub 0x14221000 port 1 - Initial status(0x0101)/change(0x0001)
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - change 6 clearing feature 0x10 (kUSBHubPortConnectionChangeFeature)
Sep  2 10:52:41.274  [5]    AppleUSBHub[0xffffff8026d7f800]::ClearPortFeature port/feature (10010) - clearing
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - status(0x0101) - change(0x0000) - before call to (6) handler function
Sep  2 10:52:41.274  [5]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler - handling port 1 changes (0x0101,0x0000)
Sep  2 10:52:41.274  [3]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler port (1) - previous enumeration failed - sleeping 300 ms
Sep  2 10:52:41.575  [5]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler - port 1 - no existing device found on port
Sep  2 10:52:41.575  [4]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler port 1 status(0x0101)/change(0x0000) - no error from GetPortStatus
Sep  2 10:52:41.575  [5]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler - port 1 - device detected, calling AddDevice
Sep  2 10:52:41.575  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(+) now (2)
Sep  2 10:52:41.575  [5]    AppleUSBHubPort[0xffffff802703d200]::DefaultConnectionChangeHandler - port 1 done, ending (_portPMState: 3)
Sep  2 10:52:41.575  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - err (0) on return from  call to (6) handler function
Sep  2 10:52:41.575  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - err = 0 - done, releasing _runLock
Sep  2 10:52:41.575  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(-) now (1)
Sep  2 10:52:41.575  [3]    AppleUSBHub[0xffffff8026d7f800]::DecrementOutstandingIO(1018), outstandingIO(0), _interruptReadPending(false) - rearming read
Sep  2 10:52:41.575  [5]    AppleUSBHub[0xffffff8026d7f800]::DecrementOutstandingIO(1018) - spawning _checkForActivePortsThread
Sep  2 10:52:41.575  [5]    ***** AppleUSBHubPort[0xffffff802703d200]::AddDevice - port 1 on hub at 0x14221000 - start (options: 0x00000000)
Sep  2 10:52:41.575  [4]    AppleUSBHub[0xffffff8026d7f800]::CheckForActivePorts - this hub does not allow low power, so abandoning
Sep  2 10:52:41.575  [5]    ***** AppleUSBHubPort[0xffffff802703d200]::AddDevice - port 1 on hub at 0x14221000 - bus 0xffffff81a6082000 - acquiring dev zero lock
Sep  2 10:52:41.575  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - about to obtain device zero lock
Sep  2 10:52:41.575  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - not already locked - obtaining
Sep  2 10:52:41.575  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - setting _devZeroLock to true
Sep  2 10:52:41.575  [5]    AppleUSBXHCI[0xffffff81a6082000]::AcquireDeviceZero  Acquired devZeroLock
Sep  2 10:52:41.575  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(+) now (2)
Sep  2 10:52:41.576  [5]    ***** AppleUSBHubPort[0xffffff802703d200]::AddDevice - port 1 on hub at 0x14221000 - resetting port
Sep  2 10:52:41.576  [5]    AppleUSBHub[0xffffff8026d7f800]::SetPortFeature port/feature (0x10004) - setting
Sep  2 10:52:41.594  [5]    AppleUSBHub[0xffffff8026d7f800]::ProcessStatusChanged found (0x       2) in statusChangedBitmap
Sep  2 10:52:41.594  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(+) now (3)
Sep  2 10:52:41.594  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler: port 1 obtained runLock (_hasExternalConnector: 0)
Sep  2 10:52:41.594  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler: delaying 100ms before first GetPortStatus after a reset of port 1
Sep  2 10:52:41.595  [5]    ***** AppleUSBHubPort[0xffffff802703d200]::AddDevice - port 1 on hub at 0x14221000 - (err = 0) done - (0x0503, 0x0010), returning
Sep  2 10:52:41.595  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(-) now (2)
Sep  2 10:52:41.694  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler: calling GetPortStatus for port 1
Sep  2 10:52:41.694  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - Hub 0x14221000 port 1 - Initial status(0x0503)/change(0x0010)
Sep  2 10:52:41.694  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - change 2 clearing feature 0x14 (kUSBHubPortResetChangeFeature)
Sep  2 10:52:41.694  [5]    AppleUSBHub[0xffffff8026d7f800]::ClearPortFeature port/feature (10014) - clearing
Sep  2 10:52:41.695  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - status(0x0503) - change(0x0000) - before call to (2) handler function
Sep  2 10:52:41.695  [5]    ***** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - start - status(0x0503) change (0x0000)
Sep  2 10:52:41.695  [3]    **1** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - new delay 300
Sep  2 10:52:41.695  [5]    **1** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - delaying 300 ms
Sep  2 10:52:41.995  [5]    **2** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - found high speed device
Sep  2 10:52:41.995  [5]    **2** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - configuring dev zero
Sep  2 10:52:41.995  [5]    AppleUSBHubPort[0xffffff81a6082000]::DoConfigureDeviceZero - maxPacketSize: 64, speed: 2, hub: 10, port: 1
Sep  2 10:52:41.995  [3]    AppleUSBXHCI[0xffffff81a6082000]::UIM **** - ConfigureDeviceZero maxPacketSize:64, speed:2, hub:10, adj port:1
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::ConfigureDeviceZero, new method called with speed : 2, hub:10, port:1
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::UpdateTopology, high speed ancestor hub:0, port:0
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::DoCreateEP, high speed ancestor hub:0, port:0, address: 0, speed: 2, maxStreams: 0, maxBurst: 0, mult: 0 EP: (0,0,64,0)
Sep  2 10:52:41.995  [1]    AppleUSBXHCI[0xffffff81a6082000]::TestConfiguredEpCount (kIOUSBEndpointCountExceeded) - sub 2 _configuredEndpointCount, was:(97)
Sep  2 10:52:41.995  [1]    AppleUSBXHCI[0xffffff81a6082000]::DoCreateEP - Received a kIOUSBEndpointCountExceeded, Address: 0, Speed: 2:  Endpoint: (0x0, 0x0, 0x40, 0x0)
Sep  2 10:52:41.995  [3]    AppleUSBXHCI[0xffffff81a6082000]::ConfigureDeviceZero (maxPacketSize: 64, Speed: 2) returned 0xe0004046 (Controller does not support more endpoints)
Sep  2 10:52:41.995  [3]    ASM107x[0xffffff802703dc00] DisplayUserNotification type 0x1000007
Sep  2 10:52:41.995  [3]    ASM107x[0xffffff802703dc00]::DisplayUserNotificationForDevice notificationType: 7, port 1
Sep  2 10:52:41.995  [5]    **3** AppleUSBHubPort[0xffffff802703d200]::AddDeviceResetChangeHandler - port 1 on hub at 0x14221000 - failed to create device zero, detach'ing device
Sep  2 10:52:41.995  [5]    AppleUSBHub[0xffffff8026d7f800]::ClearPortFeature port/feature (10001) - clearing
Sep  2 10:52:41.995  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(-) now (1)
Sep  2 10:52:41.995  [3]    AppleUSBXHCI[0xffffff81a6082000]::UIMDeleteEndpoint - fn:0, ep:0, dir:3
Sep  2 10:52:41.995  [3]    AppleUSBXHCI[0xffffff81a6082000]::GetSlotID - functionNumber disabled: 0
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - about to release device zero lock
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - releasing lock
Sep  2 10:52:41.995  [5]    AppleUSBXHCI[0xffffff81a6082000]::ProtectedDevZeroLock - wakeup done
Sep  2 10:52:41.995  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - err (0) on return from  call to (2) handler function
Sep  2 10:52:41.995  [5]    AppleUSBHubPort[0xffffff802703d200]::PortStatusChangedHandler - port 1 - err = 0 - done, releasing _runLock
Sep  2 10:52:41.995  [3]    AppleUSBHub[0xffffff8026d7f800]::ChangeRaisedPowerState(-) now (0)
Sep  2 10:52:41.995  [3]    AppleUSBHub[0xffffff8026d7f800]::DecrementOutstandingIO(1023), outstandingIO(0), _interruptReadPending(false) - rearming read
Sep  2 10:52:41.995  [5]    AppleUSBHub[0xffffff8026d7f800]::powerChangeDone - spawning _checkForActivePortsThread
Sep  2 10:52:41.995  [4]    AppleUSBHub[0xffffff8026d7f800]::CheckForActivePorts - this hub does not allow low power, so abandoning

L'errore è su queste righe:

Sep  2 10:52:41.995  [1]    AppleUSBXHCI[0xffffff81a6082000]::TestConfiguredEpCount (kIOUSBEndpointCountExceeded) - sub 2 _configuredEndpointCount, was:(97)
Sep  2 10:52:41.995  [1]    AppleUSBXHCI[0xffffff81a6082000]::DoCreateEP - Received a kIOUSBEndpointCountExceeded, Address: 0, Speed: 2:  Endpoint: (0x0, 0x0, 0x40, 0x0)

Origine per IOUSBControllerV2.cpp , che genera quell'errore Purtroppo, quel file è piuttosto vecchio, in quanto Apple non rilascia più tale fonte. La fonte è per 10.8.4 e io sono su 10.9.4.

L'errore è definito in USB.h come #define kIOUSBEndpointCountExceeded // 0xe0004046 The endpoint was not created because the controller cannot support more endpoints ma purtroppo questo è solo un piccolo dettaglio.

Il nome dell'errore indica che si tratta di un limite di dispositivo superato (dur), quindi ho scollegato molti dispositivi e, dopo aver collegato solo uno, è stato rilevato e funzionante.

Le mie domande sono:

  • Dov'è la limitazione?
  • È documentato?
  • C'è una soluzione?

Risposte:


2

Patch del kernel per risolvere il problema

Non ti consiglio di farlo. Stai modificando il file binario di un file molto importante. Se ti incasina, beh, sì. Ma questa è l'unica soluzione.

Questo è probabilmente 10.9.4 specifico.

Posizione 0x00016942 di /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBXHCI.kext/Contents/MacOS/AppleUSBXHCI dovrebbe contenere 66 B9 60 00. Ciò si traduce in mov cx, 60h

L'ho modificato 66 B9 *80* 00 e tutti i miei dispositivi ora sono online. Presumo che andare ancora più in alto, o rimuovere del tutto il controllo "errata", sia anche sicuro. Se si verificano problemi, è sufficiente scollegare i dispositivi e riavviare.


Ricerca

Sembra che si stia rompendo all'interno della funzione AppleUSBXHCI::TestConfiguredEpCount nel AppleUSBXHCIUIM.cpp .

Che sta usando un valore massimo, che è impostato da:

// default max number of endpoints we allow to be configured
_maxControllerEndpoints = kMaxXHCIControllerEndpoints;

// this will switch the mux for panther point
EnableXHCIPorts();

if( (_errataBits & kXHCIErrataPPT) != 0)
{   
    // Panther Point - limit endpoints to 64 <rdar://problem/10385765>
    // does this need a separate errata bit?
    _maxControllerEndpoints = 64;
}

I flag vengono impostati da questo codice

static ErrataListEntry  errataList[] = {

    {0x1033, 0x0194, 0, 0xffff, kXHCIErrata_NEC},   // NEC XHCI, check firmware
    {0x1b73, 0x1000, 0, 0xffff, kXHCIErrata_NoMSI}, // Fresco Logic XHCI
    {0x8086, 0x1e31, 0, 0xffff, kXHCIErrataPPT | kXHCIErrataPPTMux | kXHCIErrata_EnableAutoCompliance | kErrataSWAssistXHCIIdle | kXHCIErrata_ParkRing},    // Intel Panther Point
    {0x1b21, 0, 0, 0xffff,  kXHCIErrata_ASMedia},   // ASMedia XHCI
    {0x1b73, 0, 0, 0xffff, kXHCIErrata_FrescoLogic},// Fresco Logic
    {0x1b73, 0x1100, 0, 16, kXHCIErrata_FL1100_Ax}, // Fresco Logic FL1100-Ax
    {0x1b6f, 0x7052, 1, 0xffff, kXHCIErrata_Etron7052}
};

0x1e31 è l'ID dispositivo del controller USB integrato nel mio MacBook Pro!

Il logging mostra che il mio limite massimo è impostato su 96 (colpisce 97 e imposta il valore err che provoca il ripristino). Questa fonte è vecchia come Apple ha chiuso la fonte a IOUSBFamily qualche tempo fa, quindi non c'è un modo reale per dire da dove viene il 96, ma la conclusione sembra essere il mio hub è nero elencato dal kernel OSX per ragioni sconosciute.

Apple ha aumentato il limite del 50% in 10.8, dove era 64, a 96 in 10.9. Questo dimostra che il numero è arbitrario. L'hardware non è cambiato, ma è stato rilevato un aumento del 50% nel software, si tratta di un cambiamento significativo. Ma perché non 128? Perché non 95, o 96? Le unità di potere di due sono probabilmente anche qui prive di significato.


Perché 96 end point è un limite molto basso

Ciascuno dei miei hub USB ha al suo interno 3 controller USB. Ognuno supporta "Full / Low Speed" e "SuperSpeed". Ognuno di questi ha un endpoint per l'input e uno per l'output. 3 hub * 3 controller ciascuno * 2 protocolli per ogni controller * 2 per IO = 36 punti finali ... solo sugli hub!

Il bluetooth integrato nel laptop utilizza 8, la fotocamera HD FaceTime ne utilizza 6, un Nexus 4 ne utilizza 6.

96 è una quantità molto bassa di punti finali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.