int hw_atl_utils_soft_reset(struct aq_hw_s *self) { int k; u32 boot_exit_code = 0; for (k = 0; k < 1000; ++k) { u32 flb_status = aq_hw_read_reg(self, HW_ATL_MPI_DAISY_CHAIN_STATUS); boot_exit_code = aq_hw_read_reg(self, HW_ATL_MPI_BOOT_EXIT_CODE); if (flb_status != 0x06000000 || boot_exit_code != 0) break; } if (k == 1000) { aq_pr_err("Neither RBL nor FLB firmware started\n"); return -EOPNOTSUPP; } self->rbl_enabled = (boot_exit_code != 0); if (self->rbl_enabled) return hw_atl_utils_soft_reset_rbl(self); else return hw_atl_utils_soft_reset_flb(self); }
int hw_atl_utils_soft_reset(struct aq_hw_s *self) { int err = 0; int k; u32 boot_exit_code = 0; for (k = 0; k < 1000; ++k) { u32 flb_status = aq_hw_read_reg(self, HW_ATL_MPI_DAISY_CHAIN_STATUS); boot_exit_code = aq_hw_read_reg(self, HW_ATL_MPI_BOOT_EXIT_CODE); if (flb_status != 0x06000000 || boot_exit_code != 0) break; } if (k == 1000) { PMD_DRV_LOG(ERR, "Neither RBL nor FLB firmware started\n"); return -EOPNOTSUPP; } self->rbl_enabled = (boot_exit_code != 0); /* FW 1.x may bootup in an invalid POWER state (WOL feature). * We should work around this by forcing its state back to DEINIT */ if (!hw_atl_utils_ver_match(HW_ATL_FW_VER_1X, aq_hw_read_reg(self, HW_ATL_MPI_FW_VERSION))) { hw_atl_utils_mpi_set_state(self, MPI_DEINIT); AQ_HW_WAIT_FOR((aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR) & HW_ATL_MPI_STATE_MSK) == MPI_DEINIT, 10, 1000U); } if (self->rbl_enabled) err = hw_atl_utils_soft_reset_rbl(self); else err = hw_atl_utils_soft_reset_flb(self); return err; }