if (err)
                goto err_clear_state_opened_flag;
 
-       priv->profile->update_rx(priv);
+       err = priv->profile->update_rx(priv);
+       if (err)
+               goto err_close_channels;
+
        mlx5e_selq_apply(&priv->selq);
        mlx5e_activate_priv_channels(priv);
        mlx5e_apply_traps(priv, true);
        mlx5e_queue_update_stats(priv);
        return 0;
 
+err_close_channels:
+       mlx5e_close_channels(&priv->channels);
 err_clear_state_opened_flag:
        clear_bit(MLX5E_STATE_OPENED, &priv->state);
        mlx5e_selq_cancel(&priv->selq);
 
        if (err)
                goto err_remove_fs_underlay_qp;
 
-       epriv->profile->update_rx(epriv);
+       err = epriv->profile->update_rx(epriv);
+       if (err)
+               goto err_close_channels;
+
        mlx5e_activate_priv_channels(epriv);
 
        mutex_unlock(&epriv->state_lock);
        return 0;
 
+err_close_channels:
+       mlx5e_close_channels(&epriv->channels);
 err_remove_fs_underlay_qp:
        mlx5_fs_remove_rx_underlay_qpn(mdev, ipriv->qpn);
 err_reset_qp:
 
                mlx5_core_warn(mdev, "opening child channels failed, %d\n", err);
                goto err_clear_state_opened_flag;
        }
-       epriv->profile->update_rx(epriv);
+       err = epriv->profile->update_rx(epriv);
+       if (err)
+               goto err_close_channels;
        mlx5e_activate_priv_channels(epriv);
        mutex_unlock(&epriv->state_lock);
 
        return 0;
 
+err_close_channels:
+       mlx5e_close_channels(&epriv->channels);
 err_clear_state_opened_flag:
        mlx5e_destroy_tis(mdev, epriv->tisn[0][0]);
 err_remove_rx_uderlay_qp: