Changeset 25432

Show
Ignore:
Timestamp:
05/10/08 16:09:44 (6 days ago)
Author:
mmlr
Message:
* Clear the endpoints of an alternate interface that is going away before
  updating the active pointer as otherwise the endpoints of the new alternate
  would have been cleared instead of the old one (leaking endpoints).
* Only clear and re-initialize the endpoints of the interface we are setting
  an alterntate. Otherwise we tear down all the device endpoints which would
  result in a bad situation for composite devices where multiple drivers may
  use different functions (through different interfaces) of a device side by
  side.
* Minor cleanup.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • haiku/trunk/src/add-ons/kernel/bus_managers/usb/Device.cpp

    r24804 r25432  
    371371 
    372372        // Initialize all the endpoints that are now active 
    373         InitEndpoints(); 
     373        InitEndpoints(-1); 
    374374 
    375375        // Wait some for the configuration being finished 
     
    381381 
    382382void 
    383 Device::InitEndpoints(
     383Device::InitEndpoints(int32 interfaceIndex
    384384{ 
    385385        int8 hubAddress = 0; 
     
    388388 
    389389        for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) { 
     390                if (interfaceIndex >= 0 && j != (size_t)interfaceIndex) 
     391                        continue; 
     392 
    390393                usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active; 
    391394                for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) { 
     
    424427        } 
    425428} 
     429 
    426430 
    427431status_t 
     
    451455        if (!fCurrentConfiguration) 
    452456                return B_OK; 
    453         ClearEndpoints(); 
    454  
     457 
     458        ClearEndpoints(-1); 
    455459        fCurrentConfiguration = NULL; 
    456460        return B_OK; 
     
    459463 
    460464void 
    461 Device::ClearEndpoints(
     465Device::ClearEndpoints(int32 interfaceIndex
    462466{ 
    463467        for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) { 
     468                if (interfaceIndex >= 0 && j != (size_t)interfaceIndex) 
     469                        continue; 
     470 
    464471                usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active; 
    465472                for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) { 
     
    475482Device::SetAltInterface(const usb_interface_info *interface) 
    476483{ 
     484        uint8 interfaceNumber = interface->descr->interface_number; 
    477485        // Tell the device to set the alternate settings 
    478486        status_t result = fDefaultPipe->SendRequest( 
     
    480488                USB_REQUEST_SET_INTERFACE,                                                      // request 
    481489                interface->descr->alternate_setting,                            // value 
    482                 interface->descr->interface_number,                                   // index 
     490                interfaceNumber,                                                                      // index 
    483491                0,                                                                                                      // length 
    484492                NULL,                                                                                           // buffer 
     
    489497                return result; 
    490498 
    491         // Update descriptor 
     499        // Clear the no longer active endpoints 
     500        ClearEndpoints(interfaceNumber); 
     501 
     502        // Update the active pointer of the interface list 
    492503        usb_interface_list *interfaceList 
    493                 = &fCurrentConfiguration->interface[interface->descr->interface_number]; 
     504                = &fCurrentConfiguration->interface[interfaceNumber]; 
    494505        interfaceList->active 
    495506                = &interfaceList->alt[interface->descr->alternate_setting]; 
    496507 
    497         ClearEndpoints(); 
    498         InitEndpoints(); 
    499  
     508        // Initialize the new endpoints 
     509        InitEndpoints(interfaceNumber); 
    500510        return result; 
    501511} 
  • haiku/trunk/src/add-ons/kernel/bus_managers/usb/usb_p.h

    r24894 r25432  
    444444                status_t                                                SetAltInterface(const usb_interface_info *interface); 
    445445 
    446                 void                                                    InitEndpoints(); 
    447                 void                                                    ClearEndpoints(); 
     446                void                                                    InitEndpoints(int32 interfaceIndex); 
     447                void                                                    ClearEndpoints(int32 interfaceIndex); 
    448448 
    449449virtual status_t                                                ReportDevice(