@ -616,6 +616,33 @@ fail:
}
void nfc_llcp_queue_i_frames ( struct nfc_llcp_sock * sock )
{
struct nfc_llcp_local * local = sock - > local ;
pr_debug ( " Remote ready %d tx queue len %d remote rw %d " ,
sock - > remote_ready , skb_queue_len ( & sock - > tx_pending_queue ) ,
local - > remote_rw ) ;
/* Try to queue some I frames for transmission */
while ( sock - > remote_ready & &
skb_queue_len ( & sock - > tx_pending_queue ) < local - > remote_rw ) {
struct sk_buff * pdu , * pending_pdu ;
pdu = skb_dequeue ( & sock - > tx_queue ) ;
if ( pdu = = NULL )
break ;
/* Update N(S)/N(R) */
nfc_llcp_set_nrns ( sock , pdu ) ;
pending_pdu = skb_clone ( pdu , GFP_KERNEL ) ;
skb_queue_tail ( & local - > tx_queue , pdu ) ;
skb_queue_tail ( & sock - > tx_pending_queue , pending_pdu ) ;
}
}
static void nfc_llcp_recv_hdlc ( struct nfc_llcp_local * local ,
struct sk_buff * skb )
{
@ -673,23 +700,7 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
}
}
/* Queue some I frames for transmission */
while ( llcp_sock - > remote_ready & &
skb_queue_len ( & llcp_sock - > tx_pending_queue ) < = local - > remote_rw ) {
struct sk_buff * pdu , * pending_pdu ;
pdu = skb_dequeue ( & llcp_sock - > tx_queue ) ;
if ( pdu = = NULL )
break ;
/* Update N(S)/N(R) */
nfc_llcp_set_nrns ( llcp_sock , pdu ) ;
pending_pdu = skb_clone ( pdu , GFP_KERNEL ) ;
skb_queue_tail ( & local - > tx_queue , pdu ) ;
skb_queue_tail ( & llcp_sock - > tx_pending_queue , pending_pdu ) ;
}
nfc_llcp_queue_i_frames ( llcp_sock ) ;
release_sock ( sk ) ;
nfc_llcp_sock_put ( llcp_sock ) ;