@@ -2374,7 +2374,13 @@ ice_get_set_tx_topo(struct ice_hw *hw, u8 *buf, u16 buf_size,
23742374 * The function will apply the new Tx topology from the package buffer
23752375 * if available.
23762376 *
2377- * Return: zero when update was successful, negative values otherwise.
2377+ * Return:
2378+ * * 0 - Successfully applied topology configuration.
2379+ * * -EBUSY - Failed to acquire global configuration lock.
2380+ * * -EEXIST - Topology configuration has already been applied.
2381+ * * -EIO - Unable to apply topology configuration.
2382+ * * -ENODEV - Failed to re-initialize device after applying configuration.
2383+ * * Other negative error codes indicate unexpected failures.
23782384 */
23792385int ice_cfg_tx_topo (struct ice_hw * hw , const void * buf , u32 len )
23802386{
@@ -2407,7 +2413,7 @@ int ice_cfg_tx_topo(struct ice_hw *hw, const void *buf, u32 len)
24072413
24082414 if (status ) {
24092415 ice_debug (hw , ICE_DBG_INIT , "Get current topology is failed\n" );
2410- return status ;
2416+ return - EIO ;
24112417 }
24122418
24132419 /* Is default topology already applied ? */
@@ -2494,31 +2500,45 @@ int ice_cfg_tx_topo(struct ice_hw *hw, const void *buf, u32 len)
24942500 ICE_GLOBAL_CFG_LOCK_TIMEOUT );
24952501 if (status ) {
24962502 ice_debug (hw , ICE_DBG_INIT , "Failed to acquire global lock\n" );
2497- return status ;
2503+ return - EBUSY ;
24982504 }
24992505
25002506 /* Check if reset was triggered already. */
25012507 reg = rd32 (hw , GLGEN_RSTAT );
25022508 if (reg & GLGEN_RSTAT_DEVSTATE_M ) {
2503- /* Reset is in progress, re-init the HW again */
25042509 ice_debug (hw , ICE_DBG_INIT , "Reset is in progress. Layer topology might be applied already\n" );
25052510 ice_check_reset (hw );
2506- return 0 ;
2511+ /* Reset is in progress, re-init the HW again */
2512+ goto reinit_hw ;
25072513 }
25082514
25092515 /* Set new topology */
25102516 status = ice_get_set_tx_topo (hw , new_topo , size , NULL , NULL , true);
25112517 if (status ) {
2512- ice_debug (hw , ICE_DBG_INIT , "Failed setting Tx topology\n" );
2513- return status ;
2518+ ice_debug (hw , ICE_DBG_INIT , "Failed to set Tx topology, status %pe\n" ,
2519+ ERR_PTR (status ));
2520+ /* only report -EIO here as the caller checks the error value
2521+ * and reports an informational error message informing that
2522+ * the driver failed to program Tx topology.
2523+ */
2524+ status = - EIO ;
25142525 }
25152526
2516- /* New topology is updated, delay 1 second before issuing the CORER */
2527+ /* Even if Tx topology config failed, we need to CORE reset here to
2528+ * clear the global configuration lock. Delay 1 second to allow
2529+ * hardware to settle then issue a CORER
2530+ */
25172531 msleep (1000 );
25182532 ice_reset (hw , ICE_RESET_CORER );
2519- /* CORER will clear the global lock, so no explicit call
2520- * required for release.
2521- */
2533+ ice_check_reset (hw );
2534+
2535+ reinit_hw :
2536+ /* Since we triggered a CORER, re-initialize hardware */
2537+ ice_deinit_hw (hw );
2538+ if (ice_init_hw (hw )) {
2539+ ice_debug (hw , ICE_DBG_INIT , "Failed to re-init hardware after setting Tx topology\n" );
2540+ return - ENODEV ;
2541+ }
25222542
2523- return 0 ;
2543+ return status ;
25242544}
0 commit comments