Merge "soc: qcom: qmi_interface: Add send timeout helper"

This commit is contained in:
qctecmdr 2019-09-26 17:08:56 -07:00 • committed by Gerrit - the friendly Code Review server
commit af0b277dbf
2 changed files with 31 additions and 11 deletions

View file

@ -448,24 +448,27 @@ static void qmi_handle_net_reset(struct qmi_handle *qmi)
struct sockaddr_qrtr sq;
struct qmi_service *svc;
struct socket *sock;
long timeo = qmi->sock->sk->sk_sndtimeo;
sock = qmi_sock_create(qmi, &sq);
if (IS_ERR(sock))
return;
mutex_lock(&qmi->sock_lock);
sock_release(qmi->sock);
qmi->sock = NULL;
mutex_unlock(&qmi->sock_lock);
qmi_recv_del_server(qmi, -1, -1);
if (qmi->ops.net_reset)
qmi->ops.net_reset(qmi);
mutex_lock(&qmi->sock_lock);
/* Already qmi_handle_release() started */
if (!qmi->sock) {
sock_release(sock);
return;
}
sock_release(qmi->sock);
qmi->sock = sock;
qmi->sq = sq;
qmi->sock->sk->sk_sndtimeo = timeo;
mutex_unlock(&qmi->sock_lock);
list_for_each_entry(svc, &qmi->lookups, list_node)
@ -619,6 +622,21 @@ static struct socket *qmi_sock_create(struct qmi_handle *qmi,
return sock;
}
/**
* qmi_set_sndtimeo() - set the sk_sndtimeo of the qmi handle
* @qmi: QMI client handle
* @timeo: timeout in jiffies.
*
* This sets the timeout for the blocking socket send in qmi send.
*/
void qmi_set_sndtimeo(struct qmi_handle *qmi, long timeo)
{
mutex_lock(&qmi->sock_lock);
qmi->sock->sk->sk_sndtimeo = timeo;
mutex_unlock(&qmi->sock_lock);
}
EXPORT_SYMBOL(qmi_set_sndtimeo);
/**
* qmi_handle_init() - initialize a QMI client handle
* @qmi: QMI handle to initialize
@ -695,23 +713,24 @@ EXPORT_SYMBOL(qmi_handle_init);
*/
void qmi_handle_release(struct qmi_handle *qmi)
{
struct socket *sock = qmi->sock;
struct socket *sock;
struct qmi_service *svc, *tmp;
struct qmi_txn *txn;
int txn_id;
mutex_lock(&qmi->sock_lock);
sock = qmi->sock;
write_lock_bh(&sock->sk->sk_callback_lock);
sock->sk->sk_user_data = NULL;
write_unlock_bh(&sock->sk->sk_callback_lock);
cancel_work_sync(&qmi->work);
qmi_recv_del_server(qmi, -1, -1);
mutex_lock(&qmi->sock_lock);
sock_release(sock);
qmi->sock = NULL;
mutex_unlock(&qmi->sock_lock);
cancel_work_sync(&qmi->work);
qmi_recv_del_server(qmi, -1, -1);
destroy_workqueue(qmi->wq);
mutex_lock(&qmi->txn_lock);

View file

@ -268,5 +268,6 @@ int qmi_txn_init(struct qmi_handle *qmi, struct qmi_txn *txn,
struct qmi_elem_info *ei, void *c_struct);
int qmi_txn_wait(struct qmi_txn *txn, unsigned long timeout);
void qmi_txn_cancel(struct qmi_txn *txn);
void qmi_set_sndtimeo(struct qmi_handle *qmi, long timeo);
#endif