diff options
-rw-r--r-- | net/bluetooth/hidp/core.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 481bbb8c7220..3f6ef0630a8e 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -639,13 +639,19 @@ static int hidp_send_frame(struct socket *sock, unsigned char *data, int len) | |||
639 | static void hidp_process_intr_transmit(struct hidp_session *session) | 639 | static void hidp_process_intr_transmit(struct hidp_session *session) |
640 | { | 640 | { |
641 | struct sk_buff *skb; | 641 | struct sk_buff *skb; |
642 | int ret; | ||
642 | 643 | ||
643 | BT_DBG("session %p", session); | 644 | BT_DBG("session %p", session); |
644 | 645 | ||
645 | while ((skb = skb_dequeue(&session->intr_transmit))) { | 646 | while ((skb = skb_dequeue(&session->intr_transmit))) { |
646 | if (hidp_send_frame(session->intr_sock, skb->data, skb->len) < 0) { | 647 | ret = hidp_send_frame(session->intr_sock, skb->data, skb->len); |
648 | if (ret == -EAGAIN) { | ||
647 | skb_queue_head(&session->intr_transmit, skb); | 649 | skb_queue_head(&session->intr_transmit, skb); |
648 | break; | 650 | break; |
651 | } else if (ret < 0) { | ||
652 | hidp_session_terminate(session); | ||
653 | kfree_skb(skb); | ||
654 | break; | ||
649 | } | 655 | } |
650 | 656 | ||
651 | hidp_set_timer(session); | 657 | hidp_set_timer(session); |
@@ -656,13 +662,19 @@ static void hidp_process_intr_transmit(struct hidp_session *session) | |||
656 | static void hidp_process_ctrl_transmit(struct hidp_session *session) | 662 | static void hidp_process_ctrl_transmit(struct hidp_session *session) |
657 | { | 663 | { |
658 | struct sk_buff *skb; | 664 | struct sk_buff *skb; |
665 | int ret; | ||
659 | 666 | ||
660 | BT_DBG("session %p", session); | 667 | BT_DBG("session %p", session); |
661 | 668 | ||
662 | while ((skb = skb_dequeue(&session->ctrl_transmit))) { | 669 | while ((skb = skb_dequeue(&session->ctrl_transmit))) { |
663 | if (hidp_send_frame(session->ctrl_sock, skb->data, skb->len) < 0) { | 670 | ret = hidp_send_frame(session->ctrl_sock, skb->data, skb->len); |
671 | if (ret == -EAGAIN) { | ||
664 | skb_queue_head(&session->ctrl_transmit, skb); | 672 | skb_queue_head(&session->ctrl_transmit, skb); |
665 | break; | 673 | break; |
674 | } else if (ret < 0) { | ||
675 | hidp_session_terminate(session); | ||
676 | kfree_skb(skb); | ||
677 | break; | ||
666 | } | 678 | } |
667 | 679 | ||
668 | hidp_set_timer(session); | 680 | hidp_set_timer(session); |