/** * mei_reset - resets host and fw. * * @dev: the device structure * @interrupts_enabled: if interrupt should be enabled after reset. */ void mei_reset(struct mei_device *dev, int interrupts_enabled) { bool unexpected; if (dev->dev_state == MEI_DEV_RECOVERING_FROM_RESET) return; unexpected = (dev->dev_state != MEI_DEV_INITIALIZING && dev->dev_state != MEI_DEV_DISABLED && dev->dev_state != MEI_DEV_POWER_DOWN && dev->dev_state != MEI_DEV_POWER_UP); mei_hw_reset(dev, interrupts_enabled); if (dev->dev_state != MEI_DEV_INITIALIZING) { if (dev->dev_state != MEI_DEV_DISABLED && dev->dev_state != MEI_DEV_POWER_DOWN) dev->dev_state = MEI_DEV_RESETING; mei_cl_all_disconnect(dev); /* remove entry if already in list */ dev_dbg(&dev->pdev->dev, "remove iamthif and wd from the file list.\n"); mei_cl_unlink(&dev->wd_cl); if (dev->open_handle_count > 0) dev->open_handle_count--; mei_cl_unlink(&dev->iamthif_cl); if (dev->open_handle_count > 0) dev->open_handle_count--; mei_amthif_reset_params(dev); memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); } dev->me_clients_num = 0; dev->rd_msg_hdr = 0; dev->wd_pending = false; if (unexpected) dev_warn(&dev->pdev->dev, "unexpected reset: dev_state = %s\n", mei_dev_state_str(dev->dev_state)); /* wake up all readings so they can be interrupted */ mei_cl_all_read_wakeup(dev); /* remove all waiting requests */ mei_cl_all_write_clear(dev); }
/** * mei_reset - resets host and fw. * * @dev: the device structure * @interrupts_enabled: if interrupt should be enabled after reset. */ void mei_reset(struct mei_device *dev, int interrupts_enabled) { bool unexpected; unexpected = (dev->dev_state != MEI_DEV_INITIALIZING && dev->dev_state != MEI_DEV_DISABLED && dev->dev_state != MEI_DEV_POWER_DOWN && dev->dev_state != MEI_DEV_POWER_UP); mei_hw_reset(dev, interrupts_enabled); dev->hbm_state = MEI_HBM_IDLE; if (dev->dev_state != MEI_DEV_INITIALIZING && dev->dev_state != MEI_DEV_POWER_UP) { if (dev->dev_state != MEI_DEV_DISABLED && dev->dev_state != MEI_DEV_POWER_DOWN) dev->dev_state = MEI_DEV_RESETTING; mei_cl_all_disconnect(dev); /* remove entry if already in list */ dev_dbg(&dev->pdev->dev, "remove iamthif and wd from the file list.\n"); mei_cl_unlink(&dev->wd_cl); if (dev->open_handle_count > 0) dev->open_handle_count--; mei_cl_unlink(&dev->iamthif_cl); if (dev->open_handle_count > 0) dev->open_handle_count--; mei_amthif_reset_params(dev); memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); } dev->me_clients_num = 0; dev->rd_msg_hdr = 0; dev->wd_pending = false; if (unexpected) dev_warn(&dev->pdev->dev, "unexpected reset: dev_state = %s\n", mei_dev_state_str(dev->dev_state)); if (!interrupts_enabled) { dev_dbg(&dev->pdev->dev, "intr not enabled end of reset\n"); return; } mei_hw_start(dev); dev_dbg(&dev->pdev->dev, "link is established start sending messages.\n"); /* link is established * start sending messages. */ dev->dev_state = MEI_DEV_INIT_CLIENTS; mei_hbm_start_req(dev); /* wake up all readings so they can be interrupted */ mei_cl_all_read_wakeup(dev); /* remove all waiting requests */ mei_cl_all_write_clear(dev); }