]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
NFC: Handle Receiver Not Ready LLCP frame
authorSamuel Ortiz <sameo@linux.intel.com>
Mon, 5 Mar 2012 00:03:36 +0000 (01:03 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 6 Mar 2012 20:16:20 +0000 (15:16 -0500)
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/nfc/llcp/llcp.c

index 8510a2fb3da8f0110e65fa8801116373c3ff26fb..bbfaa2750ea88f31384c0046f99c2493ff26677f 100644 (file)
@@ -671,15 +671,15 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
                nfc_llcp_sock_put(llcp_sock);
        }
 
-       if (ns == llcp_sock->recv_n)
-               llcp_sock->recv_n = (llcp_sock->recv_n + 1) % 16;
-       else
-               pr_err("Received out of sequence I PDU\n");
-
        /* Pass the payload upstream */
        if (ptype == LLCP_PDU_I) {
                pr_debug("I frame, queueing on %p\n", &llcp_sock->sk);
 
+               if (ns == llcp_sock->recv_n)
+                       llcp_sock->recv_n = (llcp_sock->recv_n + 1) % 16;
+               else
+                       pr_err("Received out of sequence I PDU\n");
+
                skb_pull(skb, LLCP_HEADER_SIZE + LLCP_SEQUENCE_SIZE);
                if (sock_queue_rcv_skb(&llcp_sock->sk, skb)) {
                        pr_err("receive queue is full\n");
@@ -700,6 +700,11 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
                        }
        }
 
+       if (ptype == LLCP_PDU_RR)
+               llcp_sock->remote_ready = true;
+        else if (ptype == LLCP_PDU_RNR)
+               llcp_sock->remote_ready = false;
+
        nfc_llcp_queue_i_frames(llcp_sock);
 
        release_sock(sk);
@@ -813,6 +818,7 @@ static void nfc_llcp_rx_work(struct work_struct *work)
 
        case LLCP_PDU_I:
        case LLCP_PDU_RR:
+       case LLCP_PDU_RNR:
                pr_debug("I frame\n");
                nfc_llcp_recv_hdlc(local, skb);
                break;