Merge "net: qrtr: Handle -EAGAIN from MHI layer"
This commit is contained in:
commit
b61d559c7c
@ -20,6 +20,7 @@ struct qrtr_mhi_dev {
|
||||
struct mhi_device *mhi_dev;
|
||||
struct device *dev;
|
||||
struct completion prepared;
|
||||
struct completion ringfull;
|
||||
};
|
||||
|
||||
/* From MHI to QRTR */
|
||||
@ -43,10 +44,13 @@ static void qcom_mhi_qrtr_ul_callback(struct mhi_device *mhi_dev,
|
||||
struct mhi_result *mhi_res)
|
||||
{
|
||||
struct sk_buff *skb = mhi_res->buf_addr;
|
||||
struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev);
|
||||
|
||||
if (skb->sk)
|
||||
sock_put(skb->sk);
|
||||
consume_skb(skb);
|
||||
|
||||
complete_all(&qdev->ringfull);
|
||||
}
|
||||
|
||||
/* Send data over MHI */
|
||||
@ -83,14 +87,16 @@ static int __qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
|
||||
|
||||
static int qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
|
||||
{
|
||||
struct qrtr_mhi_dev *qdev = container_of(ep, struct qrtr_mhi_dev, ep);
|
||||
int rc;
|
||||
int retry = 5;
|
||||
|
||||
do {
|
||||
rc = __qcom_mhi_qrtr_send(ep, skb);
|
||||
if (rc == -EAGAIN)
|
||||
usleep_range(1000, 2000);
|
||||
} while (rc == -EAGAIN && --retry);
|
||||
if (rc == -EAGAIN) {
|
||||
reinit_completion(&qdev->ringfull);
|
||||
wait_for_completion(&qdev->ringfull);
|
||||
}
|
||||
} while (rc == -EAGAIN);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -139,6 +145,7 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev,
|
||||
qdev->dev = &mhi_dev->dev;
|
||||
qdev->ep.xmit = qcom_mhi_qrtr_send;
|
||||
init_completion(&qdev->prepared);
|
||||
init_completion(&qdev->ringfull);
|
||||
|
||||
dev_set_drvdata(&mhi_dev->dev, qdev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user