mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 22:40:54 -04:00
Merge "soc: qcom: qmi_interface: Add send timeout helper"
This commit is contained in:
commit
af0b277dbf
2 changed files with 31 additions and 11 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue