@@ -659,11 +659,16 @@ void send_vfrt_to_pgpe( uint32_t i_vfrt_main_mem_addr )
659
659
break ;
660
660
}
661
661
662
- if ( (i_vfrt_main_mem_addr == g_wof -> curr_vfrt_main_mem_addr ) &&
662
+ // Check if PGPE explicitely requested a new vfrt
663
+ ocb_occflg_t occ_flags = {0 };
664
+ occ_flags .value = in32 (OCB_OCCFLG );
665
+
666
+ if ( ((i_vfrt_main_mem_addr == g_wof -> curr_vfrt_main_mem_addr ) &&
663
667
(g_wof -> req_active_quad_update ==
664
- g_wof -> prev_req_active_quads ) )
668
+ g_wof -> prev_req_active_quads )) &&
669
+ (!occ_flags .fields .active_quad_update ) )
665
670
{
666
- // VFRT and requested active quads are unchanged. Skip
671
+ // VFRT and requested active quads are unchanged.
667
672
break ;
668
673
}
669
674
// Either the Main memory address changed or req active quads changed
@@ -1547,6 +1552,8 @@ void set_clear_wof_disabled( uint8_t i_action,
1547
1552
void disable_wof ( void )
1548
1553
{
1549
1554
errlHndl_t l_errl = NULL ;
1555
+ uint8_t l_prev_state = g_wof -> wof_init_state ;
1556
+
1550
1557
// Disable wof on 405
1551
1558
g_wof -> wof_init_state = WOF_DISABLED ;
1552
1559
@@ -1556,66 +1563,74 @@ void disable_wof( void )
1556
1563
int user_data_rc = 0 ;
1557
1564
do
1558
1565
{
1559
- // Make sure IPC command is idle
1560
- if (async_request_is_idle (& G_wof_control_req .request ))
1566
+ if (l_prev_state >= WOF_CONTROL_ON_SENT_WAITING )
1561
1567
{
1562
-
1563
- // Check to see if a previous wof control IPC message observed an error
1564
- if ( g_wof -> control_ipc_rc != 0 )
1565
- {
1566
- INTR_TRAC_ERR ("Unknown error from wof control IPC message" );
1567
- /** @
1568
- * @errortype
1569
- * @moduleid DISABLE_WOF
1570
- * @reasoncode GPE_REQUEST_RC_FAILURE
1571
- * @userdata1 rc - wof_control rc
1572
- * @userdata2 0
1573
- * @userdata4 OCC_NO_EXTENDED_RC
1574
- * @devdesc OCC Failure from sending wof control
1575
- */
1576
- user_data_rc = g_wof -> control_ipc_rc ;
1577
- g_wof -> control_ipc_rc = 0 ;
1578
- reasonCode = GPE_REQUEST_RC_FAILURE ;
1579
- }
1580
- else
1568
+ // Make sure IPC command is idle
1569
+ if (async_request_is_idle (& G_wof_control_req .request ))
1581
1570
{
1582
- // Set parameters for the GpeRequest
1583
- G_wof_control_parms .action = PGPE_ACTION_WOF_OFF ;
1584
- user_data_rc = pgpe_request_schedule ( & G_wof_control_req );
1585
1571
1586
- if ( user_data_rc != 0 )
1572
+ // Check to see if a previous wof control IPC message observed an error
1573
+ if ( g_wof -> control_ipc_rc != 0 )
1587
1574
{
1575
+ INTR_TRAC_ERR ("Unknown error from wof control IPC message(disable)" );
1576
+ INTR_TRAC_ERR ("Return Code = 0x%x" , g_wof -> control_ipc_rc );
1588
1577
/** @
1589
1578
* @errortype
1590
1579
* @moduleid DISABLE_WOF
1591
- * @reasoncode GPE_REQUEST_SCHEDULE_FAILURE
1592
- * @userdata1 rc - gpe_request_schedule return code
1580
+ * @reasoncode GPE_REQUEST_RC_FAILURE
1581
+ * @userdata1 rc - wof_control rc
1593
1582
* @userdata2 0
1594
1583
* @userdata4 OCC_NO_EXTENDED_RC
1595
- * @devdesc OCC Failed to schedule a GPE job for enabling wof
1584
+ * @devdesc OCC Failure from sending wof control
1596
1585
*/
1597
- reasonCode = GPE_REQUEST_SCHEDULE_FAILURE ;
1598
- INTR_TRAC_ERR ( "disable_wof() - Error when sending WOF Control"
1599
- " OFF IPC command! RC = %x" , user_data_rc ) ;
1586
+ user_data_rc = g_wof -> control_ipc_rc ;
1587
+ g_wof -> control_ipc_rc = 0 ;
1588
+ reasonCode = GPE_REQUEST_RC_FAILURE ;
1600
1589
}
1601
- }
1590
+ else
1591
+ {
1592
+ // Set parameters for the GpeRequest
1593
+ G_wof_control_parms .action = PGPE_ACTION_WOF_OFF ;
1594
+ user_data_rc = pgpe_request_schedule ( & G_wof_control_req );
1602
1595
1603
- if ( user_data_rc != 0 )
1604
- {
1605
- l_errl = createErrl (
1606
- DISABLE_WOF ,
1607
- reasonCode ,
1608
- OCC_NO_EXTENDED_RC ,
1609
- ERRL_SEV_PREDICTIVE ,
1610
- NULL ,
1611
- DEFAULT_TRACE_SIZE ,
1612
- user_data_rc ,
1613
- 0 );
1596
+ if ( user_data_rc != 0 )
1597
+ {
1598
+ /** @
1599
+ * @errortype
1600
+ * @moduleid DISABLE_WOF
1601
+ * @reasoncode GPE_REQUEST_SCHEDULE_FAILURE
1602
+ * @userdata1 rc - gpe_request_schedule return code
1603
+ * @userdata2 0
1604
+ * @userdata4 OCC_NO_EXTENDED_RC
1605
+ * @devdesc OCC Failed to schedule a GPE job for enabling wof
1606
+ */
1607
+ reasonCode = GPE_REQUEST_SCHEDULE_FAILURE ;
1608
+ INTR_TRAC_ERR ("disable_wof() - Error when sending WOF Control"
1609
+ " OFF IPC command! RC = %x" , user_data_rc );
1610
+ }
1611
+ }
1614
1612
1615
- // commit the error log
1616
- commitErrl ( & l_errl );
1613
+ if ( user_data_rc != 0 )
1614
+ {
1615
+ l_errl = createErrl (
1616
+ DISABLE_WOF ,
1617
+ reasonCode ,
1618
+ OCC_NO_EXTENDED_RC ,
1619
+ ERRL_SEV_PREDICTIVE ,
1620
+ NULL ,
1621
+ DEFAULT_TRACE_SIZE ,
1622
+ user_data_rc ,
1623
+ 0 );
1624
+
1625
+ // commit the error log
1626
+ commitErrl ( & l_errl );
1627
+ }
1617
1628
}
1618
1629
}
1630
+ else
1631
+ {
1632
+ INTR_TRAC_IMP ("WOF has not been enabled so no need to disable" );
1633
+ }
1619
1634
}while ( 0 );
1620
1635
}
1621
1636
@@ -1644,7 +1659,8 @@ bool enable_wof( void )
1644
1659
// Check to see if a previous wof control IPC message observed an error
1645
1660
if ( g_wof -> control_ipc_rc != 0 )
1646
1661
{
1647
- INTR_TRAC_ERR ("Unknown error from wof control IPC message" );
1662
+ INTR_TRAC_ERR ("Unknown error from wof control IPC message(enable)" );
1663
+ INTR_TRAC_ERR ("Return Code = 0x%X" , g_wof -> control_ipc_rc );
1648
1664
rc = g_wof -> control_ipc_rc ;
1649
1665
bit_to_set = WOF_RC_CONTROL_REQ_FAILURE ;
1650
1666
g_wof -> control_ipc_rc = 0 ;
0 commit comments