Loading drivers/net/wireless/cnss2/main.c +18 −1 Original line number Diff line number Diff line Loading @@ -1039,19 +1039,34 @@ static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; if (test_bit(CNSS_FW_READY, &plat_priv->driver_state) || test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) || test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) { cnss_pr_dbg("Device is already active, ignore calibration\n"); goto out; } set_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); reinit_completion(&plat_priv->cal_complete); ret = cnss_bus_dev_powerup(plat_priv); if (ret) if (ret) { complete(&plat_priv->cal_complete); clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); } out: return ret; } static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv) { if (!test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state)) return 0; plat_priv->cal_done = true; cnss_wlfw_wlan_mode_send_sync(plat_priv, CNSS_OFF); cnss_bus_dev_shutdown(plat_priv); complete(&plat_priv->cal_complete); clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); return 0; Loading Loading @@ -1637,6 +1652,7 @@ static int cnss_probe(struct platform_device *plat_dev) ret); init_completion(&plat_priv->power_up_complete); init_completion(&plat_priv->cal_complete); mutex_init(&plat_priv->dev_lock); cnss_pr_info("Platform driver probed successfully.\n"); Loading Loading @@ -1672,6 +1688,7 @@ static int cnss_remove(struct platform_device *plat_dev) { struct cnss_plat_data *plat_priv = platform_get_drvdata(plat_dev); complete_all(&plat_priv->cal_complete); complete_all(&plat_priv->power_up_complete); device_init_wakeup(&plat_dev->dev, false); unregister_pm_notifier(&cnss_pm_notifier); Loading drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ struct cnss_plat_data { atomic_t pm_count; struct timer_list fw_boot_timer; struct completion power_up_complete; struct completion cal_complete; struct mutex dev_lock; /* mutex for register access through debugfs */ u32 diag_reg_read_addr; u32 diag_reg_read_mem_type; Loading drivers/net/wireless/cnss2/pci.c +18 −0 Original line number Diff line number Diff line Loading @@ -706,6 +706,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) int ret = 0; struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); struct cnss_pci_data *pci_priv; unsigned int timeout; if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); Loading @@ -723,10 +724,27 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) return -EEXIST; } if (!test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state)) goto register_driver; cnss_pr_dbg("Start to wait for calibration to complete\n"); timeout = cnss_get_boot_timeout(&pci_priv->pci_dev->dev); ret = wait_for_completion_timeout(&plat_priv->cal_complete, msecs_to_jiffies(timeout) << 2); if (!ret) { cnss_pr_err("Timeout waiting for calibration to complete\n"); ret = -EAGAIN; goto out; } register_driver: ret = cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_REGISTER_DRIVER, CNSS_EVENT_SYNC_UNINTERRUPTIBLE, driver_ops); out: return ret; } EXPORT_SYMBOL(cnss_wlan_register_driver); Loading drivers/net/wireless/cnss2/qmi.c +27 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,8 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) req->fw_init_done_enable = 1; req->pin_connect_result_enable_valid = 1; req->pin_connect_result_enable = 1; req->cal_done_enable_valid = 1; req->cal_done_enable = 1; ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_ind_register_resp_msg_v01_ei, resp); Loading Loading @@ -1185,6 +1187,24 @@ static void cnss_wlfw_pin_result_ind_cb(struct qmi_handle *qmi_wlfw, ind_msg->rf_pin_result); } static void cnss_wlfw_cal_done_ind_cb(struct qmi_handle *qmi_wlfw, struct sockaddr_qrtr *sq, struct qmi_txn *txn, const void *data) { struct cnss_plat_data *plat_priv = container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); cnss_pr_dbg("Received QMI WLFW calibration done indication\n"); if (!txn) { cnss_pr_err("Spurious indication\n"); return; } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE, 0, NULL); } static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = { { .type = QMI_INDICATION, Loading Loading @@ -1222,6 +1242,13 @@ static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = { sizeof(struct wlfw_pin_connect_result_ind_msg_v01), .fn = cnss_wlfw_pin_result_ind_cb }, { .type = QMI_INDICATION, .msg_id = QMI_WLFW_CAL_DONE_IND_V01, .ei = wlfw_cal_done_ind_msg_v01_ei, .decoded_size = sizeof(struct wlfw_cal_done_ind_msg_v01), .fn = cnss_wlfw_cal_done_ind_cb }, {} }; Loading Loading
drivers/net/wireless/cnss2/main.c +18 −1 Original line number Diff line number Diff line Loading @@ -1039,19 +1039,34 @@ static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; if (test_bit(CNSS_FW_READY, &plat_priv->driver_state) || test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) || test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) { cnss_pr_dbg("Device is already active, ignore calibration\n"); goto out; } set_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); reinit_completion(&plat_priv->cal_complete); ret = cnss_bus_dev_powerup(plat_priv); if (ret) if (ret) { complete(&plat_priv->cal_complete); clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); } out: return ret; } static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv) { if (!test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state)) return 0; plat_priv->cal_done = true; cnss_wlfw_wlan_mode_send_sync(plat_priv, CNSS_OFF); cnss_bus_dev_shutdown(plat_priv); complete(&plat_priv->cal_complete); clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state); return 0; Loading Loading @@ -1637,6 +1652,7 @@ static int cnss_probe(struct platform_device *plat_dev) ret); init_completion(&plat_priv->power_up_complete); init_completion(&plat_priv->cal_complete); mutex_init(&plat_priv->dev_lock); cnss_pr_info("Platform driver probed successfully.\n"); Loading Loading @@ -1672,6 +1688,7 @@ static int cnss_remove(struct platform_device *plat_dev) { struct cnss_plat_data *plat_priv = platform_get_drvdata(plat_dev); complete_all(&plat_priv->cal_complete); complete_all(&plat_priv->power_up_complete); device_init_wakeup(&plat_dev->dev, false); unregister_pm_notifier(&cnss_pm_notifier); Loading
drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ struct cnss_plat_data { atomic_t pm_count; struct timer_list fw_boot_timer; struct completion power_up_complete; struct completion cal_complete; struct mutex dev_lock; /* mutex for register access through debugfs */ u32 diag_reg_read_addr; u32 diag_reg_read_mem_type; Loading
drivers/net/wireless/cnss2/pci.c +18 −0 Original line number Diff line number Diff line Loading @@ -706,6 +706,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) int ret = 0; struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); struct cnss_pci_data *pci_priv; unsigned int timeout; if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); Loading @@ -723,10 +724,27 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) return -EEXIST; } if (!test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state)) goto register_driver; cnss_pr_dbg("Start to wait for calibration to complete\n"); timeout = cnss_get_boot_timeout(&pci_priv->pci_dev->dev); ret = wait_for_completion_timeout(&plat_priv->cal_complete, msecs_to_jiffies(timeout) << 2); if (!ret) { cnss_pr_err("Timeout waiting for calibration to complete\n"); ret = -EAGAIN; goto out; } register_driver: ret = cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_REGISTER_DRIVER, CNSS_EVENT_SYNC_UNINTERRUPTIBLE, driver_ops); out: return ret; } EXPORT_SYMBOL(cnss_wlan_register_driver); Loading
drivers/net/wireless/cnss2/qmi.c +27 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,8 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) req->fw_init_done_enable = 1; req->pin_connect_result_enable_valid = 1; req->pin_connect_result_enable = 1; req->cal_done_enable_valid = 1; req->cal_done_enable = 1; ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_ind_register_resp_msg_v01_ei, resp); Loading Loading @@ -1185,6 +1187,24 @@ static void cnss_wlfw_pin_result_ind_cb(struct qmi_handle *qmi_wlfw, ind_msg->rf_pin_result); } static void cnss_wlfw_cal_done_ind_cb(struct qmi_handle *qmi_wlfw, struct sockaddr_qrtr *sq, struct qmi_txn *txn, const void *data) { struct cnss_plat_data *plat_priv = container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); cnss_pr_dbg("Received QMI WLFW calibration done indication\n"); if (!txn) { cnss_pr_err("Spurious indication\n"); return; } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE, 0, NULL); } static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = { { .type = QMI_INDICATION, Loading Loading @@ -1222,6 +1242,13 @@ static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = { sizeof(struct wlfw_pin_connect_result_ind_msg_v01), .fn = cnss_wlfw_pin_result_ind_cb }, { .type = QMI_INDICATION, .msg_id = QMI_WLFW_CAL_DONE_IND_V01, .ei = wlfw_cal_done_ind_msg_v01_ei, .decoded_size = sizeof(struct wlfw_cal_done_ind_msg_v01), .fn = cnss_wlfw_cal_done_ind_cb }, {} }; Loading