Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24951fec authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: dfc: Allocate the query grant structures on heap"

parents 50e2ec9c d04b2aa7
Loading
Loading
Loading
Loading
+45 −21
Original line number Diff line number Diff line
@@ -736,11 +736,21 @@ dfc_get_flow_status_req(struct qmi_handle *dfc_handle,
			struct sockaddr_qrtr *ssctl,
			struct dfc_get_flow_status_resp_msg_v01 *resp)
{
	struct dfc_get_flow_status_req_msg_v01 req;
	struct qmi_txn txn;
	struct dfc_get_flow_status_req_msg_v01 *req;
	struct qmi_txn *txn;
	int ret;

	ret = qmi_txn_init(dfc_handle, &txn,
	req = kzalloc(sizeof(*req), GFP_ATOMIC);
	if (!req)
		return -ENOMEM;

	txn = kzalloc(sizeof(*txn), GFP_ATOMIC);
	if (!txn) {
		kfree(req);
		return -ENOMEM;
	}

	ret = qmi_txn_init(dfc_handle, txn,
			   dfc_get_flow_status_resp_msg_v01_ei, resp);
	if (ret < 0) {
		pr_err("%s() Failed init for response, err: %d\n",
@@ -748,19 +758,18 @@ dfc_get_flow_status_req(struct qmi_handle *dfc_handle,
		goto out;
	}

	memset(&req, 0, sizeof(req));
	ret = qmi_send_request(dfc_handle, ssctl, &txn,
	ret = qmi_send_request(dfc_handle, ssctl, txn,
			       QMI_DFC_GET_FLOW_STATUS_REQ_V01,
			       QMI_DFC_GET_FLOW_STATUS_REQ_V01_MAX_MSG_LEN,
			       dfc_get_flow_status_req_msg_v01_ei, &req);
			       dfc_get_flow_status_req_msg_v01_ei, req);
	if (ret < 0) {
		qmi_txn_cancel(&txn);
		qmi_txn_cancel(txn);
		pr_err("%s() Failed sending request, err: %d\n",
			__func__, ret);
		goto out;
	}

	ret = qmi_txn_wait(&txn, DFC_TIMEOUT_MS);
	ret = qmi_txn_wait(txn, DFC_TIMEOUT_MS);
	if (ret < 0) {
		pr_err("%s() Response waiting failed, err: %d\n",
			__func__, ret);
@@ -771,6 +780,8 @@ dfc_get_flow_status_req(struct qmi_handle *dfc_handle,
	}

out:
	kfree(txn);
	kfree(req);
	return ret;
}

@@ -1256,23 +1267,36 @@ void dfc_qmi_wq_flush(struct qmi_info *qmi)
void dfc_qmi_query_flow(void *dfc_data)
{
	struct dfc_qmi_data *data = (struct dfc_qmi_data *)dfc_data;
	struct dfc_get_flow_status_resp_msg_v01 resp;
	struct dfc_svc_ind svc_ind;
	struct dfc_get_flow_status_resp_msg_v01 *resp;
	struct dfc_svc_ind *svc_ind;
	int rc;

	if (!data)
	resp = kzalloc(sizeof(*resp), GFP_ATOMIC);
	if (!resp)
		return;

	rc = dfc_get_flow_status_req(&data->handle, &data->ssctl, &resp);

	if (rc < 0 || !resp.flow_status_valid || resp.flow_status_len < 1 ||
	    resp.flow_status_len > DFC_MAX_BEARERS_V01)
	svc_ind = kzalloc(sizeof(*svc_ind), GFP_ATOMIC);
	if (!svc_ind) {
		kfree(resp);
		return;
	}

	memset(&svc_ind, 0, sizeof(svc_ind));
	svc_ind.dfc_info.flow_status_valid = resp.flow_status_valid;
	svc_ind.dfc_info.flow_status_len = resp.flow_status_len;
	memcpy(svc_ind.dfc_info.flow_status, resp.flow_status,
		sizeof(resp.flow_status[0]) * resp.flow_status_len);
	dfc_do_burst_flow_control(data, &svc_ind);
	if (!data)
		goto done;

	rc = dfc_get_flow_status_req(&data->handle, &data->ssctl, resp);

	if (rc < 0 || !resp->flow_status_valid || resp->flow_status_len < 1 ||
	    resp->flow_status_len > DFC_MAX_BEARERS_V01)
		goto done;

	svc_ind->dfc_info.flow_status_valid = resp->flow_status_valid;
	svc_ind->dfc_info.flow_status_len = resp->flow_status_len;
	memcpy(&svc_ind->dfc_info.flow_status, resp->flow_status,
		sizeof(resp->flow_status[0]) * resp->flow_status_len);
	dfc_do_burst_flow_control(data, svc_ind);

done:
	kfree(svc_ind);
	kfree(resp);
}