error kIOUSBEndpointCountExceeded al conectar un dispositivo USB

1

Mantengo muchos dispositivos USB conectados a mi MacBook Pro de mediados de 2012 de 15 pulgadas para mi trabajo.

Este MacBook Pro tiene 2 puertos USB externos. Uno de ellos es para un fanático de una computadora portátil, y el otro es un concentrador USB que tiene < a href="http://www.newegg.com/Product/Product.aspx?Item=9SIA1HD1A40110"> otro concentrador USB y el concentrador de mi monitor Dell U2713HM.

Aparentemente, ¿los dispositivos no funcionarían al azar o de lo contrario serían ... ¿detectados a medias? Aparecerían en la lista de dispositivos USB pero no funcionarán correctamente, aunque lo hayan hecho en el pasado. Pasarlas a una instalación de Windows en Parallels tuvo solo la mitad de resultados. A menudo, el dispositivo se detectó en el nivel USB pero falló en el nivel de software. Al enchufarlos en una computadora portátil con Windows, se demostró que funcionaron bien.

Instalé los controladores de registro de IOUSBFamily. El USB Prober.app con el detalle establecido en 5 mostró lo siguiente en el registro al conectar 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

El error está en estas líneas:

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)

Fuente para IOUSBControllerV2.cpp , que arroja ese error. Lamentablemente, ese archivo es bastante antiguo, ya que Apple ya no publica esa fuente. La fuente es para 10.8.4 y estoy en 10.9.4.

El error se define en USB.h como #define kIOUSBEndpointCountExceeded // 0xe0004046 The endpoint was not created because the controller cannot support more endpoints pero, lamentablemente, es solo un pequeño detalle.

El nombre del error sugiere que se trata de un límite de dispositivo excedido (dur), por lo que desconecté muchos dispositivos y, después de conectar uno, se detectó y funcionó bien.

Mis preguntas son:

  • ¿Dónde está la limitación?
  • ¿Está esto documentado?
  • ¿Hay alguna solución?
pregunta Joseph Lennox 02.09.2014 - 20:13

1 respuesta

2

Parcheando el kernel para solucionar el problema

No te recomiendo que hagas esto. Estás editando el binario de un archivo muy importante. Si se ensucia, bueno, ya. Pero esta es la única solución.

Es probable que sea 10.9.4 específico.

La ubicación 0x00016942 de /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBXHCI.kext/Contents/MacOS/AppleUSBXHCI debe contener 66 B9 60 00. que se traduce en mov cx, 60h

Lo edité en 66 B9 *80* 00 y todos mis dispositivos se conectan ahora. Supongo que ir aún más alto, o eliminar la verificación de "erratas", también es seguro. Si tiene problemas, simplemente puede desconectar los dispositivos y reiniciar.

Investigación

Parece que se está rompiendo dentro de la función AppleUSBXHCI::TestConfiguredEpCount en AppleUSBXHCIUIM.cpp .

Que utiliza un valor máximo, que se establece a partir de:

// 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;
}

Las banderas están siendo establecidas por este código

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 es el ID de dispositivo del controlador USB incorporado de mi MacBook Pro

El registro muestra que mi límite máximo está establecido en 96 (alcanza 97 y establece el valor de error que hace que se revierta). Esta fuente es antigua ya que Apple cerró la fuente a IOUSBFamily hace un tiempo, por lo que no hay una manera real de saber de dónde viene el 96, pero la conclusión parece ser que mi núcleo está en una lista negra del núcleo OSX por razones desconocidas. / p>

Apple aumentó el límite en un 50% en 10.8, donde fue de 64, a 96 en 10.9. Esto demuestra que el número es arbitrario. El hardware no cambió, pero hubo un aumento del 50% permitido en el software, eso es un cambio significativo. Pero ¿por qué no 128? ¿Por qué no 95 o 96? Las unidades de poder de dos probablemente tampoco tengan sentido aquí.

Por qué 96 puntos finales es un límite muy bajo

Cada uno de mis concentradores USB tiene 3 controladores USB en su interior. Cada uno admite "Full / Low Speed" y "SuperSpeed". Cada uno de ellos tiene un punto final para la entrada y uno para la salida. 3 concentradores * 3 controladores cada uno * 2 protocolos cada controlador * 2 para IO = 36 puntos finales ... ¡solo en concentradores!

El bluetooth integrado en la computadora portátil usa 8, la cámara HD FaceTime usa 6, un Nexus 4 usa 6.

96 es una cantidad muy baja de puntos finales.

    
respondido por el Joseph Lennox 05.09.2014 - 21:16

Lea otras preguntas en las etiquetas