@@ -436,11 +436,8 @@ Cru::ReportInfo CruBar::report()
436436 uint32_t ponStatusRegister = getPonStatusRegister ();
437437 uint32_t onuAddress = getOnuAddress ();
438438 uint16_t cruId = getCruId ();
439- bool dynamicOffset = datapathWrapper.getDynamicOffsetEnabled (0 ) && datapathWrapper.getDynamicOffsetEnabled (1 ); // should be enabled for both wrappers
440- uint32_t triggerWindowSize = datapathWrapper.getTriggerWindowSize (0 );
441- if (triggerWindowSize != datapathWrapper.getTriggerWindowSize (1 )) { // in case trigger window size is different between wrappers
442- triggerWindowSize = 4096 ; // invalid trigger window size to force reconfigure
443- }
439+ bool dynamicOffset = datapathWrapper.getDynamicOffsetEnabled (mEndpoint );
440+ uint32_t triggerWindowSize = datapathWrapper.getTriggerWindowSize (mEndpoint );
444441
445442 Cru::ReportInfo reportInfo = {
446443 linkMap,
@@ -488,11 +485,11 @@ Cru::PacketMonitoringInfo CruBar::monitorPackets()
488485 return { linkPacketInfoMap, wrapperPacketInfoMap };
489486}
490487
491- void CruBar::reconfigure ()
488+ // / Configures the CRU according to the parameters passed on init
489+ void CruBar::configure (bool force)
492490{
493491 // Get current info
494492 Cru::ReportInfo reportInfo = report ();
495-
496493 populateLinkMap (mLinkMap );
497494
498495 if (static_cast <uint32_t >(mClock ) == reportInfo.ttcClock &&
@@ -501,86 +498,95 @@ void CruBar::reconfigure()
501498 checkPonUpstreamStatusExpected (reportInfo.ponStatusRegister , reportInfo.onuAddress ) &&
502499 mCruId == reportInfo.cruId &&
503500 mDynamicOffset == reportInfo.dynamicOffset &&
504- mTriggerWindowSize == reportInfo.triggerWindowSize ) {
501+ mTriggerWindowSize == reportInfo.triggerWindowSize &&
502+ !force) {
505503 log (" No need to reconfigure further" );
506- } else {
507- log (" Reconfiguring" );
508- configure ();
504+ return ;
509505 }
510- }
511506
512- // / Configures the CRU according to the parameters passed on init
513- void CruBar::configure ()
514- {
515- if (mLinkMap .empty ()) {
516- populateLinkMap (mLinkMap );
517- }
507+ log (" Reconfiguring" );
518508
519- /* TTC */
520509 Ttc ttc = Ttc (mPdaBar );
510+ DatapathWrapper datapathWrapper = DatapathWrapper (mPdaBar );
521511
522- log (" Setting the clock" );
523- ttc.setClock (mClock );
512+ /* TTC */
513+ if (static_cast <uint32_t >(mClock ) != reportInfo.ttcClock || force) {
514+ log (" Setting the clock" );
515+ ttc.setClock (mClock );
516+
517+ log (" Calibrating TTC" );
518+ if (mClock == Clock::Ttc) {
519+ ttc.calibrateTtc ();
520+
521+ if (!checkPonUpstreamStatusExpected (reportInfo.ponStatusRegister , reportInfo.onuAddress ) || force) {
522+ ttc.resetFpll ();
523+ if (!ttc.configurePonTx (mOnuAddress )) {
524+ log (" PON TX fPLL phase scan failed" , InfoLogger::InfoLogger::Error);
525+ }
526+ }
527+ }
524528
525- log (" Calibrating TTC " );
526- if ( mClock == Clock::Ttc) {
527- ttc. calibrateTtc ( );
529+ log (" Calibrating the fPLLs " );
530+ Cru::fpllref ( mLinkMap , mPdaBar , 2 );
531+ Cru::fpllcal ( mLinkMap , mPdaBar );
528532 }
529533
530- if (mPonUpstream ) {
531- ttc.resetFpll ();
532- if (!ttc.configurePonTx (mOnuAddress )) {
533- log (" PON TX fPLL phase scan failed" , InfoLogger::InfoLogger::Error);
534- }
534+ if (static_cast <uint32_t >(mDownstreamData ) != reportInfo.downstreamData || force) {
535+ log (" Setting downstream data" );
536+ ttc.selectDownstreamData (mDownstreamData );
535537 }
536538
537- log (" Setting downstream data" );
538- ttc.selectDownstreamData (mDownstreamData );
539-
540539 /* GBT */
541- log (" Calibrating GBT" );
542- Gbt gbt = Gbt (mPdaBar , mLinkMap , mWrapperCount );
543- gbt.calibrateGbt ();
544-
545- /* BSP */
546- setCruId (mCruId );
547-
548- disableDataTaking ();
549-
550- DatapathWrapper datapathWrapper = DatapathWrapper (mPdaBar );
551-
552- // Disable DWRAPPER datagenerator (in case of restart)
553- datapathWrapper.resetDataGeneratorPulse ();
554- datapathWrapper.useDataGeneratorSource (false );
555- datapathWrapper.enableDataGenerator (false );
556- // Disable all links
557- datapathWrapper.setLinksEnabled (0 , 0x0 );
558- datapathWrapper.setLinksEnabled (1 , 0x0 );
559-
560- log (" Enabling links and setting datapath mode and flow control" );
561- for (auto const & el : mLinkMap ) {
562- auto & link = el.second ;
563- if (link.enabled ) {
564- datapathWrapper.setLinkEnabled (link);
565- datapathWrapper.setDatapathMode (link, mDatapathMode );
540+ if (!std::equal (mLinkMap .begin (), mLinkMap .end (), reportInfo.linkMap .begin ()) || force) {
541+ log (" Calibrating GBT" );
542+ Gbt gbt = Gbt (mPdaBar , mLinkMap , mWrapperCount );
543+
544+ /* BSP */
545+ disableDataTaking ();
546+
547+ // Disable DWRAPPER datagenerator (in case of restart)
548+ datapathWrapper.resetDataGeneratorPulse ();
549+ datapathWrapper.useDataGeneratorSource (false );
550+ datapathWrapper.enableDataGenerator (false );
551+ // Disable all links
552+ // datapathWrapper.setLinksEnabled(0, 0x0);
553+ // datapathWrapper.setLinksEnabled(1, 0x0);
554+
555+ log (" Enabling links and setting datapath mode and flow control" );
556+ for (auto const & el : mLinkMap ) {
557+ auto & link = el.second ;
558+ auto & linkPrevState = reportInfo.linkMap .at (el.first );
559+ if (linkPrevState != link || force) {
560+ // link mismatch
561+ // -> toggle enabled status
562+ if (link.enabled != linkPrevState.enabled || force) {
563+ gbt.calibrateGbt ({ std::pair<int , Link>(el.first , el.second ) });
564+ // toggle enable/disable
565+ if (linkPrevState.enabled ) {
566+ datapathWrapper.setLinkDisabled (link);
567+ } else {
568+ datapathWrapper.setLinkEnabled (link);
569+ }
570+ }
571+ datapathWrapper.setDatapathMode (link, mDatapathMode );
572+ }
573+ datapathWrapper.setFlowControl (link.dwrapper , mAllowRejection ); // Set flow control anyway as it's per dwrapper
566574 }
567- datapathWrapper.setFlowControl (link.dwrapper , mAllowRejection ); // Set flow control anyway as it's per dwrapper
568575 }
569576
570- log (" Setting trigger window size" );
571- datapathWrapper.setTriggerWindowSize (0 , mTriggerWindowSize );
572- datapathWrapper.setTriggerWindowSize (1 , mTriggerWindowSize );
577+ /* BSP */
578+ if (mCruId != reportInfo.cruId || force) {
579+ setCruId (mCruId );
580+ }
573581
574- log (" Setting packet arbitration" );
575- datapathWrapper.setPacketArbitration (mWrapperCount , 0 );
582+ if (mTriggerWindowSize != reportInfo.triggerWindowSize || force) {
583+ log (" Setting trigger window size" );
584+ datapathWrapper.setTriggerWindowSize (mEndpoint , mTriggerWindowSize );
585+ }
576586
577- if (mDynamicOffset ) {
578- log (" Setting dynamic offset" );
579- datapathWrapper.setDynamicOffset (0 , true );
580- datapathWrapper.setDynamicOffset (1 , true );
581- } else {
582- datapathWrapper.setDynamicOffset (0 , false );
583- datapathWrapper.setDynamicOffset (1 , false );
587+ if (mDynamicOffset != reportInfo.dynamicOffset || force) {
588+ log (" Toggling fixed/dynamic offset" );
589+ datapathWrapper.setDynamicOffset (mEndpoint , mDynamicOffset );
584590 }
585591
586592 log (" CRU configuration done." );
@@ -671,7 +677,6 @@ void CruBar::populateLinkMap(std::map<int, Link>& linkMap)
671677
672678 Gbt gbt = Gbt (mPdaBar , linkMap, mWrapperCount );
673679
674- log (" Configuring GBT" );
675680 for (auto & el : linkMap) {
676681 auto & link = el.second ;
677682
0 commit comments