Changeset 673

Show
Ignore:
Timestamp:
11/01/07 09:04:02 (16 years ago)
Author:
ppalmers
Message:

fix bus reset behavior

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/libieee1394/configrom.cpp

    r644 r673  
    228228    struct config_csr_info* csr_info = (struct config_csr_info*) private_data; 
    229229 
    230     if ( !csr_info->service->read( csr_info->nodeId, 
     230    int nb_retries = 5; 
     231 
     232    while ( !csr_info->service->read( csr_info->nodeId, 
    231233                                   addr, 
    232234                                   (size_t)length/4, 
    233                                    ( quadlet_t* )buffer) ) 
    234     { 
    235         //debugOutput( DEBUG_LEVEL_VERBOSE, "ConfigRom: Read failed\n"); 
    236         return -1; 
    237     } 
    238  
    239     return 0; 
     235                                   ( quadlet_t* )buffer) && nb_retries-- ) 
     236    {// failed, retry 
     237    } 
     238 
     239    if (nb_retries) return 0; // success 
     240    else return -1; // failure 
    240241} 
    241242 
     
    442443ConfigRom::updatedNodeId() 
    443444{ 
    444     struct csr1212_csr* csr = 0; 
     445    debugOutput( DEBUG_LEVEL_VERBOSE,  
     446                 "Checking for updated node id for device with GUID 0x%016llX...\n", 
     447                 getGuid()); 
     448 
     449    struct csr1212_csr* csr = NULL; 
    445450    for ( fb_nodeid_t nodeId = 0; 
    446451          nodeId < m_1394Service->getNodeCount(); 
     
    450455        csr_info.service = m_1394Service; 
    451456        csr_info.nodeId = 0xffc0 | nodeId; 
     457        debugOutput( DEBUG_LEVEL_VERBOSE, "Looking at node %d...\n", nodeId); 
    452458 
    453459        csr = csr1212_create_csr( &configrom_csr1212_ops, 
     
    456462 
    457463        if (!csr || csr1212_parse_csr( csr ) != CSR1212_SUCCESS) { 
     464            debugWarning( "Failed to get/parse CSR\n"); 
    458465            if (csr) { 
    459466                csr1212_destroy_csr(csr); 
     467                csr = NULL; 
    460468            } 
    461469            continue; 
    462470        } 
    463  
    464471 
    465472        octlet_t guid = 
     
    467474            | CSR1212_BE32_TO_CPU(csr->bus_info_data[4]); 
    468475 
     476        debugOutput( DEBUG_LEVEL_VERBOSE, 
     477                        " Node has GUID 0x%016llX\n", 
     478                        guid); 
     479 
    469480        if ( guid == getGuid() ) { 
     481            debugOutput( DEBUG_LEVEL_VERBOSE, "GUID matches ours\n"); 
    470482            if ( nodeId != getNodeId() ) { 
    471483                debugOutput( DEBUG_LEVEL_VERBOSE, 
    472                              "Device with GUID 0x%08x%08x changed node id " 
     484                             "Device with GUID 0x%016llX changed node id " 
    473485                             "from %d to %d\n", 
    474                              ( unsigned int ) ( getGuid() >> 32 ), 
    475                              ( unsigned int ) ( getGuid() & 0xffffffff ), 
     486                             getGuid(), 
    476487                             getNodeId(), 
    477488                             nodeId ); 
    478489                m_nodeId = nodeId; 
     490            } else { 
     491                debugOutput( DEBUG_LEVEL_VERBOSE, 
     492                             "Device with GUID 0x%016llX kept node id %d\n", 
     493                             getGuid(), 
     494                             getNodeId()); 
    479495            } 
    480496            if (csr) { 
    481497                csr1212_destroy_csr(csr); 
     498                csr = NULL; 
    482499            } 
    483500            return true; 
     
    503520    printf( "Config ROM\n" ); 
    504521    printf( "\tCurrent Node Id:\t%d\n",       getNodeId() ); 
    505     printf( "\tGUID:\t\t\t0x%08x%08x\n", 
    506             ( unsigned int )( getGuid() >> 32 ), 
    507             ( unsigned int ) ( getGuid() & 0xffffffff ) ); 
     522    printf( "\tGUID:\t\t\t0x%016llX\n",       getGuid()); 
    508523    printf( "\tVendor Name:\t\t%s\n",         getVendorName().c_str() ); 
    509524    printf( "\tModel Name:\t\t%s\n",          getModelName().c_str() ); 
  • trunk/libffado/src/libieee1394/configrom.h

    r644 r673  
    105105                   Ieee1394Service& ieee1394Service ); 
    106106 
     107    void setVerboseLevel(int level) { 
     108        setDebugLevel(level); 
     109        Element::setVerboseLevel(level); 
     110    } 
     111 
    107112 protected: 
    108113    void processUnitDirectory( struct csr1212_csr*    csr, 
  • trunk/libffado/src/libieee1394/ieee1394service.cpp

    r560 r673  
    361361{ 
    362362    m_generation = generation; 
     363    quadlet_t buf=0; 
     364 
     365    // do a simple read on ourself in order to update the internal structures 
     366    // this avoids failures after a bus reset 
     367    read_quadlet( getLocalNodeId() & 0xFFC0, 
     368                  CSR_REGISTER_BASE | CSR_CYCLE_TIME, 
     369                  &buf ); 
    363370 
    364371    for ( reset_handler_vec_t::iterator it = m_busResetHandlers.begin();