NFC changes for 3.4
Subsystems (2)
cover NFC changes for 3.4
Hi John,
This is my NFC patchset for the next merge window.
I was hoping to include our HCI implementation, but it may have to wait a few more days.
Anyway, the below patchset provides mostly LLCP fixes and enhancements. It also implements the few missing NFC data exports from the pn533 driver, adds a new powered netink attribute, and fixes the whole NFC code identation.
You can apply them manually or pull from here:
git://git.kernel.org/pub/scm/linux/kernel/git/sameo/nfc-3.0.git nfc-next
it should apply cleanly on top of wireless-next.
Samuel Ortiz (22):
NFC: Export NFCID1 from pn533
NFC: Add device powered netlink attribute
NFC: Factorize the I frame queueing routine
NFC: Handle Receiver Not Ready LLCP frame
NFC: LLCP socket sendmsg implemetation
NFC: Fix bitops usage in LLCP
NFC: Clear pn533 target structure
NFC: Clear LLCP SDPs whan MAC goes down
NFC: Set the right LLCP N(R) value for I frames
NFC: Send LLCP RR frames to acknowledge received I frames
NFC: Set MIU and RW values from CONNECT and CC LLCP frames
NFC: Fragment LLCP I frames
NFC: Export sensf from pn533
NFC: Export Jewel/Topaz ID from pn533
NFC: Export NFCID when detecting a p2p target with pn533
NFC: Unlink LLCP child sockets from llcp_sock_release
NFC: SN is not an invalid GT value
NFC: Remove the rf mode parameter from the DEP link up routine
NFC: Fix LLCP sockets releasing path
NFC: LLCP code identation fixes
NFC: Core code identation fixes
NFC: NCI code identation fixes
drivers/nfc/pn533.c | 31 ++++---- include/linux/nfc.h | 1 + include/net/nfc/nci_core.h | 10 +- include/net/nfc/nfc.h | 30 +++---- net/nfc/af_nfc.c | 2 +- net/nfc/core.c | 50 +++++------ net/nfc/llcp/commands.c | 163 ++++++++++++++++++++++++++++++++---- net/nfc/llcp/llcp.c | 201 +++++++++++++++++++++++++++----------------- net/nfc/llcp/llcp.h | 12 ++- net/nfc/llcp/sock.c | 120 ++++++++++++++++---------- net/nfc/nci/core.c | 113 ++++++++++++------------- net/nfc/nci/data.c | 28 +++--- net/nfc/nci/ntf.c | 75 ++++++++--------- net/nfc/nci/rsp.c | 17 ++-- net/nfc/netlink.c | 71 +++++++-------- net/nfc/nfc.h | 18 ++-- net/nfc/rawsock.c | 16 ++-- 17 files changed, 573 insertions(+), 385 deletions(-)
Signature · 1 line
1.7.7.3
PATCH 1/22 NFC: Export NFCID1 from pn533
--- drivers/nfc/pn533.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/nfc/pn533.c +2 -0
@@ -736,6 +736,8 @@ static int pn533_target_found_type_a(struct nfc_target *nfc_tgt, u8 *tgt_data, nfc_tgt->sens_res =be16_to_cpu (tgt_type_a->sens_res); nfc_tgt->sel_res = tgt_type_a->sel_res; + nfc_tgt->nfcid1_len = tgt_type_a->nfcid_len; +memcpy (nfc_tgt->nfcid1, tgt_type_a->nfcid_data, nfc_tgt->nfcid1_len);return 0 ; }
Signature · 1 line
1.7.7.3
PATCH 2/22 NFC: Add device powered netlink attribute
In reply to Samuel OrtizFor user space to know if a device is up or down.
--- include/linux/nfc.h | 1 + net/nfc/netlink.c | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-)
include/linux/nfc.h +1 -0
@@ -107,6 +107,7 @@ enum nfc_attrs {NFC_ATTR_TARGET_SENSF_RES ,NFC_ATTR_COMM_MODE ,NFC_ATTR_RF_MODE , +NFC_ATTR_DEVICE_POWERED ,/* private: internal use only */ __NFC_ATTR_AFTER_LAST };
net/nfc/netlink.c +3 -0
@@ -48,6 +48,7 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = { [NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 }, [NFC_ATTR_COMM_MODE] = { .type = NLA_U8 }, [NFC_ATTR_RF_MODE] = { .type = NLA_U8 }, + [NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 }, }; static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
@@ -200,6 +201,7 @@ int nfc_genl_device_added(struct nfc_dev *dev)NLA_PUT_STRING (msg,NFC_ATTR_DEVICE_NAME ,nfc_device_name (dev));NLA_PUT_U32 (msg,NFC_ATTR_DEVICE_INDEX , dev->idx);NLA_PUT_U32 (msg,NFC_ATTR_PROTOCOLS , dev->supported_protocols); +NLA_PUT_U8 (msg,NFC_ATTR_DEVICE_POWERED , dev->dev_up);genlmsg_end (msg, hdr);
@@ -261,6 +263,7 @@ static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev,NLA_PUT_STRING (msg,NFC_ATTR_DEVICE_NAME ,nfc_device_name (dev));NLA_PUT_U32 (msg,NFC_ATTR_DEVICE_INDEX , dev->idx);NLA_PUT_U32 (msg,NFC_ATTR_PROTOCOLS , dev->supported_protocols); +NLA_PUT_U8 (msg,NFC_ATTR_DEVICE_POWERED , dev->dev_up);return genlmsg_end (msg, hdr);
Signature · 1 line
1.7.7.3
PATCH 3/22 NFC: Factorize the I frame queueing routine
In reply to Samuel OrtizThis one will be called from the I frame command sending.
--- net/nfc/llcp/llcp.c | 45 ++++++++++++++++++++++++++++----------------- net/nfc/llcp/llcp.h | 1 + 2 files changed, 29 insertions(+), 17 deletions(-)
net/nfc/llcp/llcp.c +28 -17
@@ -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);
net/nfc/llcp/llcp.h +1 -0
@@ -165,6 +165,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local, struct nfc_llcp_sock *sock);u8 nfc_llcp_get_local_ssap (struct nfc_llcp_local *local);void nfc_llcp_put_ssap (struct nfc_llcp_local *local,u8 ssap); +void nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock);/* Sock API */ struct sock *nfc_llcp_sock_alloc (struct socket *sock,int type,gfp_t gfp);
Signature · 1 line
1.7.7.3
PATCH 4/22 NFC: Handle Receiver Not Ready LLCP frame
In reply to Samuel Ortiz--- net/nfc/llcp/llcp.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)
net/nfc/llcp/llcp.c +11 -5
@@ -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 ;
Signature · 1 line
1.7.7.3
PATCH 5/22 NFC: LLCP socket sendmsg implemetation
In reply to Samuel Ortiz--- net/nfc/llcp/commands.c | 31 +++++++++++++++++++++++++++++++ net/nfc/llcp/llcp.h | 2 ++ net/nfc/llcp/sock.c | 30 +++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 1 deletions(-)
net/nfc/llcp/commands.c +31 -0
@@ -397,3 +397,34 @@ int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)return 0 ; } + +int nfc_llcp_send_i_frame (struct nfc_llcp_sock *sock, +struct msghdr *msg,size_t len) +{ +struct sk_buff *pdu; +struct sock *sk; + +pr_debug ("Send I frame\n" ); + + pdu =llcp_allocate_pdu (sock,LLCP_PDU_I , len +LLCP_SEQUENCE_SIZE ); +if (pdu ==NULL ) +return -ENOMEM ; + +skb_put (pdu,LLCP_SEQUENCE_SIZE ); + +if (memcpy_fromiovec (skb_put (pdu, len), msg->msg_iov, len)) { +kfree_skb (pdu); +return -EFAULT ; + } + +skb_queue_head (&sock->tx_queue, pdu); + + sk = &sock->sk; +lock_sock (sk); + +nfc_llcp_queue_i_frames (sock); + +release_sock (sk); + +return 0 ; +}
net/nfc/llcp/llcp.h +2 -0
@@ -188,6 +188,8 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);int nfc_llcp_send_cc (struct nfc_llcp_sock *sock);int nfc_llcp_send_dm (struct nfc_llcp_local *local,u8 ssap,u8 dsap,u8 reason);int nfc_llcp_send_disconnect (struct nfc_llcp_sock *sock); +int nfc_llcp_send_i_frame (struct nfc_llcp_sock *sock, +struct msghdr *msg,size_t len);/* Socket API */ int __init nfc_llcp_sock_init (void );
net/nfc/llcp/sock.c +29 -1
@@ -482,6 +482,34 @@ error:return ret; } +static int llcp_sock_sendmsg (struct kiocb *iocb,struct socket *sock, +struct msghdr *msg,size_t len) +{ +struct sock *sk = sock->sk; +struct nfc_llcp_sock *llcp_sock =nfc_llcp_sock (sk); +int ret; + +pr_debug ("sock %p sk %p" , sock, sk); + + ret =sock_error (sk); +if (ret) +return ret; + +if (msg->msg_flags &MSG_OOB ) +return -EOPNOTSUPP ; + +lock_sock (sk); + +if (sk->sk_state !=LLCP_CONNECTED ) { +release_sock (sk); +return -ENOTCONN ; + } + +release_sock (sk); + +return nfc_llcp_send_i_frame (llcp_sock, msg, len); +} +static int llcp_sock_recvmsg (struct kiocb *iocb,struct socket *sock,struct msghdr *msg,size_t len,int flags) {
@@ -567,7 +595,7 @@ static const struct proto_ops llcp_sock_ops = { .shutdown = sock_no_shutdown, .setsockopt = sock_no_setsockopt, .getsockopt = sock_no_getsockopt, - .sendmsg = sock_no_sendmsg, + .sendmsg = llcp_sock_sendmsg, .recvmsg = llcp_sock_recvmsg, .mmap = sock_no_mmap, };
Signature · 1 line
1.7.7.3
PATCH 6/22 NFC: Fix bitops usage in LLCP
In reply to Samuel Ortiz--- net/nfc/llcp/llcp.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-)
net/nfc/llcp/llcp.c +10 -10
@@ -176,7 +176,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,return LLCP_SAP_MAX ; } -set_bit (BIT (ssap), &local->local_wks); +set_bit (ssap, &local->local_wks);mutex_unlock (&local->sdp_lock);return ssap;
@@ -195,25 +195,25 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,pr_debug ("SDP ssap %d\n" ,LLCP_WKS_NUM_SAP + ssap); -set_bit (BIT (ssap), &local->local_sdp); +set_bit (ssap, &local->local_sdp);mutex_unlock (&local->sdp_lock);return LLCP_WKS_NUM_SAP + ssap; }else if (sock->ssap !=0 ) {if (sock->ssap <LLCP_WKS_NUM_SAP ) { -if (!(local->local_wks &BIT (sock->ssap))) { -set_bit (BIT (sock->ssap), &local->local_wks); +if (!test_bit (sock->ssap, &local->local_wks)) { +set_bit (sock->ssap, &local->local_wks);mutex_unlock (&local->sdp_lock);return sock->ssap; } }else if (sock->ssap <LLCP_SDP_NUM_SAP ) { -if (!(local->local_sdp & -BIT (sock->ssap -LLCP_WKS_NUM_SAP ))) { -set_bit (BIT (sock->ssap -LLCP_WKS_NUM_SAP ), - &local->local_sdp); +if (!test_bit (sock->ssap -LLCP_WKS_NUM_SAP , + &local->local_sdp)) { +set_bit (sock->ssap -LLCP_WKS_NUM_SAP , + &local->local_sdp);mutex_unlock (&local->sdp_lock);return sock->ssap;
@@ -238,7 +238,7 @@ u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local)return LLCP_SAP_MAX ; } -set_bit (BIT (local_ssap), &local->local_sap); +set_bit (local_ssap, &local->local_sap);mutex_unlock (&local->sdp_lock);
@@ -265,7 +265,7 @@ void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap)mutex_lock (&local->sdp_lock); -clear_bit (1 << local_ssap, sdp); +clear_bit (local_ssap, sdp);mutex_unlock (&local->sdp_lock); }
Signature · 1 line
1.7.7.3
PATCH 7/22 NFC: Clear pn533 target structure
In reply to Samuel OrtizThe polled target structure should be memset to 0 in order to avoid sel_res and sens_res garbage.
--- drivers/nfc/pn533.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/nfc/pn533.c +2 -0
@@ -904,6 +904,8 @@ static int pn533_target_found(struct pn533 *dev,if (resp->tg !=1 )return -EPROTO ; +memset (&nfc_tgt,0 ,sizeof (struct nfc_target )); + target_data_len = resp_len -sizeof (struct pn533_poll_response );switch (dev->poll_mod_curr) {
Signature · 1 line
1.7.7.3
PATCH 8/22 NFC: Clear LLCP SDPs whan MAC goes down
In reply to Samuel Ortiz--- net/nfc/llcp/llcp.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
net/nfc/llcp/llcp.c +13 -0
@@ -97,6 +97,17 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)mutex_unlock (&local->socket_lock); } +static void nfc_llcp_clear_sdp (struct nfc_llcp_local *local) +{ +mutex_lock (&local->sdp_lock); + + local->local_wks =0 ; + local->local_sdp =0 ; + local->local_sap =0 ; + +mutex_unlock (&local->sdp_lock); +} +static void nfc_llcp_timeout_work (struct work_struct *work) { struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
@@ -857,6 +868,8 @@ void nfc_llcp_mac_is_down(struct nfc_dev *dev)if (local ==NULL )return ; +nfc_llcp_clear_sdp (local); +/* Close and purge all existing sockets */ nfc_llcp_socket_release (local); }
Signature · 1 line
1.7.7.3
PATCH 9/22 NFC: Set the right LLCP N(R) value for I frames
In reply to Samuel Ortiz--- net/nfc/llcp/llcp.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
net/nfc/llcp/llcp.c +1 -1
@@ -419,7 +419,7 @@ static u8 nfc_llcp_nr(struct sk_buff *pdu)static void nfc_llcp_set_nrns (struct nfc_llcp_sock *sock,struct sk_buff *pdu) { - pdu->data[2 ] = (sock->send_n <<4 ) | ((sock->recv_n -1 ) %16 ); + pdu->data[2 ] = (sock->send_n <<4 ) | (sock->recv_n %16 ); sock->send_n = (sock->send_n +1 ) %16 ; sock->recv_ack_n = (sock->recv_n -1 ) %16 ; }
Signature · 1 line
1.7.7.3
PATCH 10/22 NFC: Send LLCP RR frames to acknowledge received I frames
In reply to Samuel OrtizIn order to acknowledge an I frame, we have to either queue pending local I frames or queue a receiver ready frame.
--- net/nfc/llcp/commands.c | 24 ++++++++++++++++++++++++ net/nfc/llcp/llcp.c | 9 +++++++-- net/nfc/llcp/llcp.h | 3 ++- 3 files changed, 33 insertions(+), 3 deletions(-)
net/nfc/llcp/commands.c +24 -0
@@ -428,3 +428,27 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,return 0 ; } + +int nfc_llcp_send_rr (struct nfc_llcp_sock *sock) +{ +struct sk_buff *skb; +struct nfc_llcp_local *local; + +pr_debug ("Send rr nr %d\n" , sock->recv_n); + + local = sock->local; +if (local ==NULL ) +return -ENODEV ; + + skb =llcp_allocate_pdu (sock,LLCP_PDU_RR ,LLCP_SEQUENCE_SIZE ); +if (skb ==NULL ) +return -ENOMEM ; + +skb_put (skb,LLCP_SEQUENCE_SIZE ); + + skb->data[2 ] = sock->recv_n %16 ; + +skb_queue_head (&local->tx_queue, skb); + +return 0 ; +}
net/nfc/llcp/llcp.c +7 -2
@@ -627,8 +627,9 @@ fail: } -void nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock) +int nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock) { +int nr_frames =0 ;struct nfc_llcp_local *local = sock->local; pr_debug("Remote ready %d tx queue len %d remote rw %d",
@@ -651,7 +652,10 @@ void nfc_llcp_queue_i_frames(struct nfc_llcp_sock *sock)skb_queue_tail (&local->tx_queue, pdu);skb_queue_tail (&sock->tx_pending_queue, pending_pdu); + nr_frames++; } + +return nr_frames; } static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
@@ -716,7 +720,8 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,else if (ptype ==LLCP_PDU_RNR ) llcp_sock->remote_ready = false; -nfc_llcp_queue_i_frames (llcp_sock); +if (nfc_llcp_queue_i_frames (llcp_sock) ==0 ) +nfc_llcp_send_rr (llcp_sock);release_sock (sk);nfc_llcp_sock_put (llcp_sock);
net/nfc/llcp/llcp.h +2 -1
@@ -165,7 +165,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local, struct nfc_llcp_sock *sock);u8 nfc_llcp_get_local_ssap (struct nfc_llcp_local *local);void nfc_llcp_put_ssap (struct nfc_llcp_local *local,u8 ssap); -void nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock); +int nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock);/* Sock API */ struct sock *nfc_llcp_sock_alloc (struct socket *sock,int type,gfp_t gfp);
@@ -190,6 +190,7 @@ int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);int nfc_llcp_send_disconnect (struct nfc_llcp_sock *sock);int nfc_llcp_send_i_frame (struct nfc_llcp_sock *sock,struct msghdr *msg,size_t len); +int nfc_llcp_send_rr (struct nfc_llcp_sock *sock);/* Socket API */ int __init nfc_llcp_sock_init (void );
Signature · 1 line
1.7.7.3
PATCH 11/22 NFC: Set MIU and RW values from CONNECT and CC LLCP frames
In reply to Samuel OrtizWe use the maximum values for the LLCP Maximum Information Unit and Receive Window Size.
--- net/nfc/llcp/commands.c | 48 ++++++++++++++++++++++++++++++++++++++++++++-- net/nfc/llcp/llcp.h | 4 +++ 2 files changed, 49 insertions(+), 3 deletions(-)
net/nfc/llcp/commands.c +45 -3
@@ -284,6 +284,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)struct nfc_llcp_local *local;struct sk_buff *skb;u8 *service_name_tlv =NULL , service_name_tlv_length; +u8 *miux_tlv =NULL , miux_tlv_length; +u8 *rw_tlv =NULL , rw_tlv_length, rw; +__be16 miux;int err;u16 size =0 ;
@@ -301,6 +304,14 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock) size += service_name_tlv_length; } + miux =cpu_to_be16 (LLCP_MAX_MIUX ); + miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , &miux_tlv_length); + size += miux_tlv_length; + + rw =LLCP_MAX_RW ; + rw_tlv =nfc_llcp_build_tlv (LLCP_TLV_RW , &rw,0 , &rw_tlv_length); + size += rw_tlv_length; +pr_debug ("SKB size %d SN length %zu\n" , size, sock->service_name_len); skb =llcp_allocate_pdu (sock,LLCP_PDU_CONNECT , size);
@@ -313,6 +324,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock) skb =llcp_add_tlv (skb, service_name_tlv, service_name_tlv_length); + skb =llcp_add_tlv (skb, miux_tlv, miux_tlv_length); + skb =llcp_add_tlv (skb, rw_tlv, rw_tlv_length); +skb_queue_tail (&local->tx_queue, skb);return 0 ;
@@ -321,6 +335,8 @@ error_tlv:pr_err ("error %d\n" , err);kfree (service_name_tlv); +kfree (miux_tlv); +kfree (rw_tlv);return err; }
@@ -329,6 +345,11 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock) {struct nfc_llcp_local *local;struct sk_buff *skb; +u8 *miux_tlv =NULL , miux_tlv_length; +u8 *rw_tlv =NULL , rw_tlv_length, rw; +__be16 miux; +int err; +u16 size =0 ;pr_debug ("Sending CC\n" );
@@ -336,13 +357,34 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)if (local ==NULL )return -ENODEV ; - skb =llcp_allocate_pdu (sock,LLCP_PDU_CC ,0 ); -if (skb ==NULL ) -return -ENOMEM ; + miux =cpu_to_be16 (LLCP_MAX_MIUX ); + miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , &miux_tlv_length); + size += miux_tlv_length; + + rw =LLCP_MAX_RW ; + rw_tlv =nfc_llcp_build_tlv (LLCP_TLV_RW , &rw,0 , &rw_tlv_length); + size += rw_tlv_length; + + skb =llcp_allocate_pdu (sock,LLCP_PDU_CC , size); +if (skb ==NULL ) { + err = -ENOMEM ; + goto error_tlv; + } + + skb =llcp_add_tlv (skb, miux_tlv, miux_tlv_length); + skb =llcp_add_tlv (skb, rw_tlv, rw_tlv_length);skb_queue_tail (&local->tx_queue, skb);return 0 ; + +error_tlv: +pr_err ("error %d\n" , err); + +kfree (miux_tlv); +kfree (rw_tlv); + +return err; }int nfc_llcp_send_dm (struct nfc_llcp_local *local,u8 ssap,u8 dsap,u8 reason)
net/nfc/llcp/llcp.h +4 -0
@@ -28,6 +28,10 @@ enum llcp_state {#define LLCP_DEFAULT_RW 1#define LLCP_DEFAULT_MIU 128 +#define LLCP_MAX_LTO 0xff +#define LLCP_MAX_RW 15 +#define LLCP_MAX_MIUX 0x7ff +#define LLCP_WKS_NUM_SAP 16#define LLCP_SDP_NUM_SAP 16#define LLCP_LOCAL_NUM_SAP 32
Signature · 1 line
1.7.7.3
PATCH 12/22 NFC: Fragment LLCP I frames
In reply to Samuel OrtizBased on the receiver MIU, we have to fragment the frame to be transmitted.
--- net/nfc/llcp/commands.c | 57 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 43 insertions(+), 14 deletions(-)
net/nfc/llcp/commands.c +43 -14
@@ -444,29 +444,58 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, struct msghdr *msg, size_t len) {struct sk_buff *pdu; -struct sock *sk; +struct sock *sk = &sock->sk; +struct nfc_llcp_local *local; +size_t frag_len =0 , remaining_len; +u8 *msg_data, *msg_ptr; -pr_debug ("Send I frame\n" ); +pr_debug ("Send I frame len %zd\n" , len); - pdu =llcp_allocate_pdu (sock,LLCP_PDU_I , len +LLCP_SEQUENCE_SIZE ); -if (pdu ==NULL ) -return -ENOMEM ; + local = sock->local; +if (local ==NULL ) +return -ENODEV ; -skb_put (pdu,LLCP_SEQUENCE_SIZE ); + msg_data =kzalloc (len,GFP_KERNEL ); +if (msg_data ==NULL ) +return -ENOMEM ; -if (memcpy_fromiovec (skb_put (pdu, len), msg->msg_iov, len)) { -kfree_skb (pdu); -return -EFAULT ; +if (memcpy_fromiovec (msg_data, msg->msg_iov, len)) { +kfree (msg_data); +return -EFAULT ; } -skb_queue_head (&sock->tx_queue, pdu); + remaining_len = len; + msg_ptr = msg_data; + +while (remaining_len >0 ) { + + frag_len =min_t (u16, local->remote_miu, remaining_len); - sk = &sock->sk; -lock_sock (sk); +pr_debug ("Fragment %zd bytes remaining %zd" , + frag_len, remaining_len); -nfc_llcp_queue_i_frames (sock); + pdu =llcp_allocate_pdu (sock,LLCP_PDU_I , + frag_len +LLCP_SEQUENCE_SIZE ); +if (pdu ==NULL ) +return -ENOMEM ; + +skb_put (pdu,LLCP_SEQUENCE_SIZE ); + +memcpy (skb_put (pdu, frag_len), msg_ptr, frag_len); + +skb_queue_head (&sock->tx_queue, pdu); + +lock_sock (sk); + +nfc_llcp_queue_i_frames (sock); + +release_sock (sk); + + remaining_len -= frag_len; + msg_ptr += len; + } -release_sock (sk); +kfree (msg_data);return 0 ; }
Signature · 1 line
1.7.7.3
PATCH 13/22 NFC: Export sensf from pn533
In reply to Samuel Ortizsensf is the detection response for Felica NFC tags.
--- drivers/nfc/pn533.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
drivers/nfc/pn533.c +3 -0
@@ -783,6 +783,9 @@ static int pn533_target_found_felica(struct nfc_target *nfc_tgt, u8 *tgt_data,else nfc_tgt->supported_protocols =NFC_PROTO_FELICA_MASK ; +memcpy (nfc_tgt->sensf_res, &tgt_felica->opcode,9 ); + nfc_tgt->sensf_res_len =9 ; +return 0 ; }
Signature · 1 line
1.7.7.3
PATCH 14/22 NFC: Export Jewel/Topaz ID from pn533
In reply to Samuel OrtizThe jewel ID is the NFCID1 for Topaz NFC tags.
--- drivers/nfc/pn533.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/nfc/pn533.c +2 -0
@@ -828,6 +828,8 @@ static int pn533_target_found_jewel(struct nfc_target *nfc_tgt, u8 *tgt_data, nfc_tgt->supported_protocols =NFC_PROTO_JEWEL_MASK ; nfc_tgt->sens_res =be16_to_cpu (tgt_jewel->sens_res); + nfc_tgt->nfcid1_len =4 ; +memcpy (nfc_tgt->nfcid1, tgt_jewel->jewelid, nfc_tgt->nfcid1_len);return 0 ; }
Signature · 1 line
1.7.7.3
PATCH 15/22 NFC: Export NFCID when detecting a p2p target with pn533
In reply to Samuel Ortiz--- drivers/nfc/pn533.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/nfc/pn533.c +2 -0
@@ -1316,6 +1316,8 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,nfc_dev_dbg (&dev->interface->dev,"Creating new target" ); nfc_target.supported_protocols =NFC_PROTO_NFC_DEP_MASK ; + nfc_target.nfcid1_len =10 ; +memcpy (nfc_target.nfcid1, resp->nfcid3t, nfc_target.nfcid1_len); rc =nfc_targets_found (dev->nfc_dev, &nfc_target,1 );if (rc)return 0 ;
Signature · 1 line
1.7.7.3
PATCH 16/22 NFC: Unlink LLCP child sockets from llcp_sock_release
In reply to Samuel OrtizThe parent socket (the bound one) could be freed before its children, so we should unlink the children without trying to reach it through the parent.
--- net/nfc/llcp/sock.c | 16 +++------------- 1 files changed, 3 insertions(+), 13 deletions(-)
net/nfc/llcp/sock.c +3 -13
@@ -327,20 +327,10 @@ static int llcp_sock_release(struct socket *sock)mutex_lock (&local->socket_lock); -if (llcp_sock == local->sockets[llcp_sock->ssap]) { +if (llcp_sock == local->sockets[llcp_sock->ssap]) local->sockets[llcp_sock->ssap] =NULL ; - }else { -struct nfc_llcp_sock *parent, *s, *n; - - parent = local->sockets[llcp_sock->ssap]; - -list_for_each_entry_safe (s, n, &parent->list, list) -if (llcp_sock == s) { -list_del (&s->list); -break ; - } - - } +else +list_del (&llcp_sock->list);mutex_unlock (&local->socket_lock);
Signature · 1 line
1.7.7.3
PATCH 17/22 NFC: SN is not an invalid GT value
In reply to Samuel OrtizWe just don't do anything with it when parsing the general bytes. We handle it from the CONNECT reception code.
--- net/nfc/llcp/commands.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
net/nfc/llcp/commands.c +2 -0
@@ -152,6 +152,8 @@ int nfc_llcp_parse_tlv(struct nfc_llcp_local *local,case LLCP_TLV_RW : local->remote_rw =llcp_tlv_rw (tlv);break ; +case LLCP_TLV_SN : +break ;default :pr_err ("Invalid gt tlv value 0x%x\n" , type);break ;
Signature · 1 line
1.7.7.3
PATCH 18/22 NFC: Remove the rf mode parameter from the DEP link up routine
In reply to Samuel OrtizWhen calling nfc_dep_link_up, we implicitely are in initiator mode. Which means we also can provide the general bytes as a function argument, as all drivers will eventually request them.
--- drivers/nfc/pn533.c | 20 +++++--------------- include/net/nfc/nfc.h | 6 ++---- net/nfc/core.c | 22 +++++++++++----------- net/nfc/llcp/llcp.c | 2 +- net/nfc/netlink.c | 11 +++-------- net/nfc/nfc.h | 5 ++--- 6 files changed, 24 insertions(+), 42 deletions(-)
drivers/nfc/pn533.c +5 -15
@@ -1340,21 +1340,15 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, }static int pn533_dep_link_up (struct nfc_dev *nfc_dev,int target_idx, -u8 comm_mode,u8 rf_mode) +u8 comm_mode,u8 * gb,size_t gb_len) {struct pn533 *dev =nfc_get_drvdata (nfc_dev);struct pn533_cmd_jump_dep *cmd; -u8 cmd_len, local_gt_len, *local_gt; +u8 cmd_len;int rc;nfc_dev_dbg (&dev->interface->dev,"%s" , __func__); -if (rf_mode ==NFC_RF_TARGET ) { -nfc_dev_err (&dev->interface->dev,"Target mode not supported" ); -return -EOPNOTSUPP ; - } - -if (dev->poll_mod_count) {nfc_dev_err (&dev->interface->dev,"Cannot bring the DEP link up while polling" );
@@ -1367,11 +1361,7 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, int target_idx,return -EBUSY ; } - local_gt =nfc_get_local_general_bytes (dev->nfc_dev, &local_gt_len); -if (local_gt_len >NFC_MAX_GT_LEN ) -return -EINVAL ; - - cmd_len =sizeof (struct pn533_cmd_jump_dep ) + local_gt_len; + cmd_len =sizeof (struct pn533_cmd_jump_dep ) + gb_len; cmd =kzalloc (cmd_len,GFP_KERNEL );if (cmd ==NULL )return -ENOMEM ;
@@ -1380,9 +1370,9 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, int target_idx, cmd->active = !comm_mode; cmd->baud =0 ; -if (local_gt !=NULL ) { +if (gb !=NULL && gb_len >0 ) { cmd->next =4 ;/* We have some Gi */ -memcpy (cmd->gt, local_gt, local_gt_len); +memcpy (cmd->gt, gb, gb_len); }else { cmd->next =0 ; }
include/net/nfc/nfc.h +2 -4
@@ -53,8 +53,8 @@ struct nfc_ops {int (*dev_down)(struct nfc_dev *dev);int (*start_poll)(struct nfc_dev *dev,u32 protocols);void (*stop_poll)(struct nfc_dev *dev); -int (*dep_link_up)(struct nfc_dev *dev,int target_idx, -u8 comm_mode,u8 rf_mode); +int (*dep_link_up)(struct nfc_dev *dev,int target_idx,u8 comm_mode, +u8 *gb,size_t gb_len);int (*dep_link_down)(struct nfc_dev *dev);int (*activate_target)(struct nfc_dev *dev,u32 target_idx,u32 protocol);
@@ -179,8 +179,6 @@ struct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp);int nfc_set_remote_general_bytes (struct nfc_dev *dev,u8 *gt,u8 gt_len); -u8 *nfc_get_local_general_bytes (struct nfc_dev *dev,u8 *gt_len); -int nfc_targets_found (struct nfc_dev *dev,struct nfc_target *targets,int ntargets);
net/nfc/core.c +11 -11
@@ -181,13 +181,13 @@ error:return rc; } -int nfc_dep_link_up (struct nfc_dev *dev,int target_index, -u8 comm_mode,u8 rf_mode) +int nfc_dep_link_up (struct nfc_dev *dev,int target_index,u8 comm_mode) {int rc =0 ; +u8 *gb; +size_t gb_len; -pr_debug ("dev_name=%s comm:%d rf:%d\n" , -dev_name (&dev->dev), comm_mode, rf_mode); +pr_debug ("dev_name=%s comm %d\n" ,dev_name (&dev->dev), comm_mode);if (!dev->ops->dep_link_up)return -EOPNOTSUPP ;
@@ -204,7 +204,13 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, goto error; } - rc = dev->ops->dep_link_up (dev, target_index, comm_mode, rf_mode); + gb =nfc_llcp_general_bytes (dev, &gb_len); +if (gb_len >NFC_MAX_GT_LEN ) { + rc = -EINVAL ; + goto error; + } + + rc = dev->ops->dep_link_up (dev, target_index, comm_mode, gb, gb_len); error:device_unlock (&dev->dev);
@@ -367,12 +373,6 @@ int nfc_set_remote_general_bytes(struct nfc_dev *dev, u8 *gb, u8 gb_len) }EXPORT_SYMBOL (nfc_set_remote_general_bytes); -u8 *nfc_get_local_general_bytes (struct nfc_dev *dev,u8 *gt_len) -{ -return nfc_llcp_general_bytes (dev, gt_len); -} -EXPORT_SYMBOL (nfc_get_local_general_bytes); -/** * nfc_alloc_send_skb - allocate a skb for data exchange responses *
net/nfc/llcp/llcp.c +1 -1
@@ -281,7 +281,7 @@ void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap)mutex_unlock (&local->sdp_lock); } -u8 *nfc_llcp_general_bytes (struct nfc_dev *dev,u8 *general_bytes_len) +u8 *nfc_llcp_general_bytes (struct nfc_dev *dev,size_t *general_bytes_len) {struct nfc_llcp_local *local;
net/nfc/netlink.c +3 -8
@@ -542,13 +542,12 @@ static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info)struct nfc_dev *dev;int rc, tgt_idx;u32 idx; -u8 comm, rf; +u8 comm;pr_debug ("DEP link up\n" );if (!info->attrs[NFC_ATTR_DEVICE_INDEX ] || - !info->attrs[NFC_ATTR_COMM_MODE ] || - !info->attrs[NFC_ATTR_RF_MODE ]) + !info->attrs[NFC_ATTR_COMM_MODE ])return -EINVAL ; idx =nla_get_u32 (info->attrs[NFC_ATTR_DEVICE_INDEX ]);
@@ -558,19 +557,15 @@ static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info) tgt_idx =nla_get_u32 (info->attrs[NFC_ATTR_TARGET_INDEX ]); comm =nla_get_u8 (info->attrs[NFC_ATTR_COMM_MODE ]); - rf =nla_get_u8 (info->attrs[NFC_ATTR_RF_MODE ]);if (comm !=NFC_COMM_ACTIVE && comm !=NFC_COMM_PASSIVE )return -EINVAL ; -if (rf !=NFC_RF_INITIATOR && comm !=NFC_RF_TARGET ) -return -EINVAL ; - dev =nfc_get_device (idx);if (!dev)return -ENODEV ; - rc =nfc_dep_link_up (dev, tgt_idx, comm, rf); + rc =nfc_dep_link_up (dev, tgt_idx, comm);nfc_put_device (dev);
net/nfc/nfc.h +2 -3
@@ -54,7 +54,7 @@ void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx,int nfc_llcp_register_device (struct nfc_dev *dev);void nfc_llcp_unregister_device (struct nfc_dev *dev);int nfc_llcp_set_remote_gb (struct nfc_dev *dev,u8 *gb,u8 gb_len); -u8 *nfc_llcp_general_bytes (struct nfc_dev *dev,u8 *general_bytes_len); +u8 *nfc_llcp_general_bytes (struct nfc_dev *dev,size_t *general_bytes_len);int __init nfc_llcp_init (void );void nfc_llcp_exit (void );
@@ -160,8 +160,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 protocols);int nfc_stop_poll (struct nfc_dev *dev); -int nfc_dep_link_up (struct nfc_dev *dev,int target_idx, -u8 comm_mode,u8 rf_mode); +int nfc_dep_link_up (struct nfc_dev *dev,int target_idx,u8 comm_mode);int nfc_dep_link_down (struct nfc_dev *dev);
Signature · 1 line
1.7.7.3
PATCH 19/22 NFC: Fix LLCP sockets releasing path
In reply to Samuel OrtizThe socket local pointer needs to be set to NULL when the adapter is removed or the MAC goes down.
If the socket release code is called after such an event, the socket reference count still needs to be decreased in order for the socket to eventually be freed.
--- net/nfc/llcp/llcp.c | 15 +++++++++++---- net/nfc/llcp/sock.c | 23 +++++++++++++++-------- 2 files changed, 26 insertions(+), 12 deletions(-)
net/nfc/llcp/llcp.c +11 -4
@@ -47,7 +47,7 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)/* Release all child sockets */ list_for_each_entry_safe (s, n, &parent->list, list) { -list_del (&s->list); +list_del_init (&s->list); sk = &s->sk;lock_sock (sk);
@@ -56,9 +56,12 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)nfc_put_device (s->dev); sk->sk_state =LLCP_CLOSED ; -sock_set_flag (sk,SOCK_DEAD );release_sock (sk); + +sock_orphan (sk); + + s->local =NULL ; } parent_sk = &parent->sk;
@@ -77,11 +80,12 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)nfc_llcp_accept_unlink (accept_sk); accept_sk->sk_state =LLCP_CLOSED ; -sock_set_flag (accept_sk,SOCK_DEAD );release_sock (accept_sk);sock_orphan (accept_sk); + + lsk->local =NULL ; } }
@@ -89,9 +93,12 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local)nfc_put_device (parent->dev); parent_sk->sk_state =LLCP_CLOSED ; -sock_set_flag (parent_sk,SOCK_DEAD );release_sock (parent_sk); + +sock_orphan (parent_sk); + + parent->local =NULL ; }mutex_unlock (&local->socket_lock);
net/nfc/llcp/sock.c +15 -8
@@ -315,6 +315,7 @@ static int llcp_sock_release(struct socket *sock)struct sock *sk = sock->sk;struct nfc_llcp_local *local;struct nfc_llcp_sock *llcp_sock =nfc_llcp_sock (sk); +int err =0 ;if (!sk)return 0 ;
@@ -322,15 +323,17 @@ static int llcp_sock_release(struct socket *sock)pr_debug ("%p\n" , sk); local = llcp_sock->local; -if (local ==NULL ) -return -ENODEV ; +if (local ==NULL ) { + err = -ENODEV ; + goto out; + }mutex_lock (&local->socket_lock);if (llcp_sock == local->sockets[llcp_sock->ssap]) local->sockets[llcp_sock->ssap] =NULL ;else -list_del (&llcp_sock->list); +list_del_init (&llcp_sock->list);mutex_unlock (&local->socket_lock);
@@ -354,9 +357,7 @@ static int llcp_sock_release(struct socket *sock)release_sock (accept_sk); -sock_set_flag (sk,SOCK_DEAD );sock_orphan (accept_sk); -sock_put (accept_sk); } }
@@ -367,14 +368,13 @@ static int llcp_sock_release(struct socket *sock) sk->sk_state == LLCP_LISTEN)nfc_llcp_put_ssap (llcp_sock->local, llcp_sock->ssap); -sock_set_flag (sk,SOCK_DEAD ); -release_sock (sk); +out:sock_orphan (sk);sock_put (sk); -return 0 ; +return err; } static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
@@ -645,6 +645,8 @@ struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp)void nfc_llcp_sock_free (struct nfc_llcp_sock *sock) { +struct nfc_llcp_local *local = sock->local; +kfree (sock->service_name);skb_queue_purge (&sock->tx_queue);
@@ -653,6 +655,11 @@ void nfc_llcp_sock_free(struct nfc_llcp_sock *sock)list_del_init (&sock->accept_queue); +if (local !=NULL && sock == local->sockets[sock->ssap]) + local->sockets[sock->ssap] =NULL ; +else +list_del_init (&sock->list); + sock->parent =NULL ; }
Signature · 1 line
1.7.7.3
PATCH 20/22 NFC: LLCP code identation fixes
In reply to Samuel Ortiz--- net/nfc/llcp/commands.c | 39 +++++++++++--------- net/nfc/llcp/llcp.c | 93 ++++++++++++++++++++++++----------------------- net/nfc/llcp/llcp.h | 6 ++-- net/nfc/llcp/sock.c | 55 +++++++++++++++------------- 4 files changed, 100 insertions(+), 93 deletions(-)
net/nfc/llcp/commands.c +21 -18
@@ -118,7 +118,7 @@ u8 *nfc_llcp_build_tlv(u8 type, u8 *value, u8 value_length, u8 *tlv_length) }int nfc_llcp_parse_tlv (struct nfc_llcp_local *local, -u8 *tlv_array,u16 tlv_array_len) +u8 *tlv_array,u16 tlv_array_len) {u8 *tlv = tlv_array, type, length, offset =0 ;
@@ -164,15 +164,15 @@ int nfc_llcp_parse_tlv(struct nfc_llcp_local *local, }pr_debug ("version 0x%x miu %d lto %d opt 0x%x wks 0x%x rw %d\n" , - local->remote_version, local->remote_miu, - local->remote_lto, local->remote_opt, - local->remote_wks, local->remote_rw); + local->remote_version, local->remote_miu, + local->remote_lto, local->remote_opt, + local->remote_wks, local->remote_rw);return 0 ; }static struct sk_buff *llcp_add_header (struct sk_buff *pdu, -u8 dsap,u8 ssap,u8 ptype) +u8 dsap,u8 ssap,u8 ptype) {u8 header[2 ];
@@ -188,7 +188,8 @@ static struct sk_buff *llcp_add_header(struct sk_buff *pdu,return pdu; } -static struct sk_buff *llcp_add_tlv (struct sk_buff *pdu,u8 *tlv,u8 tlv_length) +static struct sk_buff *llcp_add_tlv (struct sk_buff *pdu,u8 *tlv, +u8 tlv_length) {/* XXX Add an skb length check */
@@ -201,7 +202,7 @@ static struct sk_buff *llcp_add_tlv(struct sk_buff *pdu, u8 *tlv, u8 tlv_length) }static struct sk_buff *llcp_allocate_pdu (struct nfc_llcp_sock *sock, -u8 cmd,u16 size) +u8 cmd,u16 size) {struct sk_buff *skb;int err;
@@ -210,7 +211,7 @@ static struct sk_buff *llcp_allocate_pdu(struct nfc_llcp_sock *sock,return NULL ; skb =nfc_alloc_send_skb (sock->dev, &sock->sk,MSG_DONTWAIT , - size +LLCP_HEADER_SIZE , &err); + size +LLCP_HEADER_SIZE , &err);if (skb ==NULL ) {pr_err ("Could not allocate PDU\n" );return NULL ;
@@ -278,7 +279,7 @@ int nfc_llcp_send_symm(struct nfc_dev *dev) skb =llcp_add_header (skb,0 ,0 ,LLCP_PDU_SYMM );return nfc_data_exchange (dev, local->target_idx, skb, - nfc_llcp_recv, local); + nfc_llcp_recv, local); }int nfc_llcp_send_connect (struct nfc_llcp_sock *sock)
@@ -300,14 +301,15 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)if (sock->service_name !=NULL ) { service_name_tlv =nfc_llcp_build_tlv (LLCP_TLV_SN , - sock->service_name, - sock->service_name_len, - &service_name_tlv_length); + sock->service_name, + sock->service_name_len, + &service_name_tlv_length); size += service_name_tlv_length; } miux =cpu_to_be16 (LLCP_MAX_MIUX ); - miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , &miux_tlv_length); + miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , + &miux_tlv_length); size += miux_tlv_length; rw =LLCP_MAX_RW ;
@@ -324,7 +326,7 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)if (service_name_tlv !=NULL ) skb =llcp_add_tlv (skb, service_name_tlv, - service_name_tlv_length); + service_name_tlv_length); skb =llcp_add_tlv (skb, miux_tlv, miux_tlv_length); skb =llcp_add_tlv (skb, rw_tlv, rw_tlv_length);
@@ -360,7 +362,8 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)return -ENODEV ; miux =cpu_to_be16 (LLCP_MAX_MIUX ); - miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , &miux_tlv_length); + miux_tlv =nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 *)&miux,0 , + &miux_tlv_length); size += miux_tlv_length; rw =LLCP_MAX_RW ;
@@ -443,7 +446,7 @@ int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock) }int nfc_llcp_send_i_frame (struct nfc_llcp_sock *sock, -struct msghdr *msg,size_t len) +struct msghdr *msg,size_t len) {struct sk_buff *pdu;struct sock *sk = &sock->sk;
@@ -462,8 +465,8 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,return -ENOMEM ;if (memcpy_fromiovec (msg_data, msg->msg_iov, len)) { -kfree (msg_data); -return -EFAULT ; +kfree (msg_data); +return -EFAULT ; } remaining_len = len;
net/nfc/llcp/llcp.c +47 -46
307 lines not on this page · raw message
net/nfc/llcp/llcp.h +3 -3
@@ -166,7 +166,7 @@ struct nfc_llcp_sock {struct nfc_llcp_local *nfc_llcp_find_local (struct nfc_dev *dev);u8 nfc_llcp_get_sdp_ssap (struct nfc_llcp_local *local, -struct nfc_llcp_sock *sock); +struct nfc_llcp_sock *sock);u8 nfc_llcp_get_local_ssap (struct nfc_llcp_local *local);void nfc_llcp_put_ssap (struct nfc_llcp_local *local,u8 ssap);int nfc_llcp_queue_i_frames (struct nfc_llcp_sock *sock);
@@ -180,7 +180,7 @@ struct sock *nfc_llcp_accept_dequeue(struct sock *sk, struct socket *newsock);/* TLV API */ int nfc_llcp_parse_tlv (struct nfc_llcp_local *local, -u8 *tlv_array,u16 tlv_array_len); +u8 *tlv_array,u16 tlv_array_len);/* Commands API */ void nfc_llcp_recv (void *data,struct sk_buff *skb,int err);
@@ -193,7 +193,7 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);int nfc_llcp_send_dm (struct nfc_llcp_local *local,u8 ssap,u8 dsap,u8 reason);int nfc_llcp_send_disconnect (struct nfc_llcp_sock *sock);int nfc_llcp_send_i_frame (struct nfc_llcp_sock *sock, -struct msghdr *msg,size_t len); +struct msghdr *msg,size_t len);int nfc_llcp_send_rr (struct nfc_llcp_sock *sock);/* Socket API */
net/nfc/llcp/sock.c +29 -26
188 lines not on this page · raw message
Signature · 1 line
1.7.7.3
PATCH 21/22 NFC: Core code identation fixes
In reply to Samuel Ortiz--- include/net/nfc/nfc.h | 24 ++++++++++---------- net/nfc/af_nfc.c | 2 +- net/nfc/core.c | 28 ++++++++++------------- net/nfc/netlink.c | 57 +++++++++++++++++++++++------------------------- net/nfc/nfc.h | 13 +++++------ net/nfc/rawsock.c | 16 +++++++------- 6 files changed, 66 insertions(+), 74 deletions(-)
include/net/nfc/nfc.h +12 -12
@@ -57,11 +57,11 @@ struct nfc_ops { u8 *gb, size_t gb_len);int (*dep_link_down)(struct nfc_dev *dev);int (*activate_target)(struct nfc_dev *dev,u32 target_idx, -u32 protocol); +u32 protocol);void (*deactivate_target)(struct nfc_dev *dev,u32 target_idx);int (*data_exchange)(struct nfc_dev *dev,u32 target_idx, -struct sk_buff *skb,data_exchange_cb_t cb, -void *cb_context); +struct sk_buff *skb,data_exchange_cb_t cb, +void *cb_context); };#define NFC_TARGET_IDX_ANY -1
@@ -110,9 +110,9 @@ struct nfc_dev {extern struct class nfc_class;struct nfc_dev *nfc_allocate_device (struct nfc_ops *ops, -u32 supported_protocols, -int tx_headroom, -int tx_tailroom); +u32 supported_protocols, +int tx_headroom, +int tx_tailroom);/** * nfc_free_device - free nfc device
@@ -135,7 +135,7 @@ void nfc_unregister_device(struct nfc_dev *dev);* @dev: The parent device */ static inline void nfc_set_parent_dev (struct nfc_dev *nfc_dev, -struct device *dev) +struct device *dev) { nfc_dev->dev.parent = dev; }
@@ -172,15 +172,15 @@ static inline const char *nfc_device_name(struct nfc_dev *dev) }struct sk_buff *nfc_alloc_send_skb (struct nfc_dev *dev,struct sock *sk, -unsigned int flags,unsigned int size, -unsigned int *err); +unsigned int flags,unsigned int size, +unsigned int *err);struct sk_buff *nfc_alloc_recv_skb (unsigned int size,gfp_t gfp);int nfc_set_remote_general_bytes (struct nfc_dev *dev, -u8 *gt,u8 gt_len); +u8 *gt,u8 gt_len); -int nfc_targets_found (struct nfc_dev *dev,struct nfc_target *targets, -int ntargets); +int nfc_targets_found (struct nfc_dev *dev, +struct nfc_target *targets,int ntargets);int nfc_dep_link_is_up (struct nfc_dev *dev,u32 target_idx,u8 comm_mode,u8 rf_mode);
net/nfc/af_nfc.c +1 -1
@@ -30,7 +30,7 @@ static DEFINE_RWLOCK(proto_tab_lock);static const struct nfc_protocol *proto_tab[NFC_SOCKPROTO_MAX ];static int nfc_sock_create (struct net *net,struct socket *sock,int proto, -int kern) +int kern) {int rc = -EPROTONOSUPPORT ;
net/nfc/core.c +12 -16
@@ -256,7 +256,7 @@ error: }int nfc_dep_link_is_up (struct nfc_dev *dev,u32 target_idx, -u8 comm_mode,u8 rf_mode) +u8 comm_mode,u8 rf_mode) { dev->dep_link_up = true; dev->dep_rf_mode = rf_mode;
@@ -336,10 +336,8 @@ error:* * The user must wait for the callback before calling this function again. */ -int nfc_data_exchange (struct nfc_dev *dev,u32 target_idx, -struct sk_buff *skb, -data_exchange_cb_t cb, -void *cb_context) +int nfc_data_exchange (struct nfc_dev *dev,u32 target_idx,struct sk_buff *skb, +data_exchange_cb_t cb,void *cb_context) {int rc;
@@ -363,8 +361,7 @@ error:int nfc_set_remote_general_bytes (struct nfc_dev *dev,u8 *gb,u8 gb_len) { -pr_debug ("dev_name=%s gb_len=%d\n" , -dev_name (&dev->dev), gb_len); +pr_debug ("dev_name=%s gb_len=%d\n" ,dev_name (&dev->dev), gb_len);if (gb_len >NFC_MAX_GT_LEN )return -EINVAL ;
@@ -380,8 +377,8 @@ EXPORT_SYMBOL(nfc_set_remote_general_bytes);* @gfp: gfp flags */ struct sk_buff *nfc_alloc_send_skb (struct nfc_dev *dev,struct sock *sk, -unsigned int flags,unsigned int size, -unsigned int *err) +unsigned int flags,unsigned int size, +unsigned int *err) {struct sk_buff *skb;unsigned int total_size;
@@ -428,8 +425,8 @@ EXPORT_SYMBOL(nfc_alloc_recv_skb);* are found. After calling this function, the device driver must stop * polling for targets. */ -int nfc_targets_found (struct nfc_dev *dev,struct nfc_target *targets, -int n_targets) +int nfc_targets_found (struct nfc_dev *dev, +struct nfc_target *targets,int n_targets) {pr_debug ("dev_name=%s n_targets=%d\n" ,dev_name (&dev->dev), n_targets);
@@ -441,7 +438,7 @@ int nfc_targets_found(struct nfc_dev *dev, struct nfc_target *targets,kfree (dev->targets); dev->targets =kmemdup (targets, n_targets *sizeof (struct nfc_target ), -GFP_ATOMIC ); +GFP_ATOMIC );if (!dev->targets) { dev->n_targets =0 ;
@@ -501,15 +498,14 @@ struct nfc_dev *nfc_get_device(unsigned idx)* @supported_protocols: NFC protocols supported by the device */ struct nfc_dev *nfc_allocate_device (struct nfc_ops *ops, -u32 supported_protocols, -int tx_headroom, -int tx_tailroom) +u32 supported_protocols, +int tx_headroom,int tx_tailroom) {static atomic_t dev_no =ATOMIC_INIT (0 );struct nfc_dev *dev;if (!ops->start_poll || !ops->stop_poll || !ops->activate_target || - !ops->deactivate_target || !ops->data_exchange) + !ops->deactivate_target || !ops->data_exchange)return NULL ;if (!supported_protocols)
net/nfc/netlink.c +27 -30
181 lines not on this page · raw message
net/nfc/nfc.h +6 -7
@@ -32,7 +32,7 @@ struct nfc_protocol {struct proto *proto;struct module *owner;int (*create)(struct net *net,struct socket *sock, -const struct nfc_protocol *nfc_proto); +const struct nfc_protocol *nfc_proto); };struct nfc_rawsock {
@@ -65,7 +65,7 @@ static inline void nfc_llcp_mac_is_down(struct nfc_dev *dev) }static inline void nfc_llcp_mac_is_up (struct nfc_dev *dev,u32 target_idx, -u8 comm_mode,u8 rf_mode) +u8 comm_mode,u8 rf_mode) { }
@@ -78,7 +78,8 @@ static inline void nfc_llcp_unregister_device(struct nfc_dev *dev) { } -static inline int nfc_llcp_set_remote_gb (struct nfc_dev *dev,u8 *gb,u8 gb_len) +static inline int nfc_llcp_set_remote_gb (struct nfc_dev *dev, +u8 *gb,u8 gb_len) {return 0 ; }
@@ -168,9 +169,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol);int nfc_deactivate_target (struct nfc_dev *dev,u32 target_idx); -int nfc_data_exchange (struct nfc_dev *dev,u32 target_idx, -struct sk_buff *skb, -data_exchange_cb_t cb, -void *cb_context); +int nfc_data_exchange (struct nfc_dev *dev,u32 target_idx,struct sk_buff *skb, +data_exchange_cb_t cb,void *cb_context);#endif /* __LOCAL_NFC_H */
net/nfc/rawsock.c +8 -8
@@ -63,7 +63,7 @@ static int rawsock_release(struct socket *sock) }static int rawsock_connect (struct socket *sock,struct sockaddr *_addr, -int len,int flags) +int len,int flags) {struct sock *sk = sock->sk;struct sockaddr_nfc *addr = (struct sockaddr_nfc *)_addr;
@@ -73,7 +73,7 @@ static int rawsock_connect(struct socket *sock, struct sockaddr *_addr,pr_debug ("sock=%p sk=%p flags=%d\n" , sock, sk, flags);if (!addr || len <sizeof (struct sockaddr_nfc ) || - addr->sa_family !=AF_NFC ) + addr->sa_family !=AF_NFC )return -EINVAL ; pr_debug("addr dev_idx=%u target_idx=%u protocol=%u\n",
@@ -120,7 +120,7 @@ static int rawsock_add_header(struct sk_buff *skb) }static void rawsock_data_exchange_complete (void *context,struct sk_buff *skb, -int err) +int err) {struct sock *sk = (struct sock *) context;
@@ -173,7 +173,7 @@ static void rawsock_tx_work(struct work_struct *work)sock_hold (sk); rc =nfc_data_exchange (dev, target_idx, skb, - rawsock_data_exchange_complete, sk); + rawsock_data_exchange_complete, sk);if (rc) {rawsock_report_error (sk, rc);sock_put (sk);
@@ -181,7 +181,7 @@ static void rawsock_tx_work(struct work_struct *work) }static int rawsock_sendmsg (struct kiocb *iocb,struct socket *sock, -struct msghdr *msg,size_t len) +struct msghdr *msg,size_t len) {struct sock *sk = sock->sk;struct nfc_dev *dev =nfc_rawsock (sk)->dev;
@@ -218,7 +218,7 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock, }static int rawsock_recvmsg (struct kiocb *iocb,struct socket *sock, -struct msghdr *msg,size_t len,int flags) +struct msghdr *msg,size_t len,int flags) {int noblock = flags &MSG_DONTWAIT ;struct sock *sk = sock->sk;
@@ -274,7 +274,7 @@ static void rawsock_destruct(struct sock *sk)if (sk->sk_state ==TCP_ESTABLISHED ) {nfc_deactivate_target (nfc_rawsock (sk)->dev, -nfc_rawsock (sk)->target_idx); +nfc_rawsock (sk)->target_idx);nfc_put_device (nfc_rawsock (sk)->dev); }
@@ -287,7 +287,7 @@ static void rawsock_destruct(struct sock *sk) }static int rawsock_create (struct net *net,struct socket *sock, -const struct nfc_protocol *nfc_proto) +const struct nfc_protocol *nfc_proto) {struct sock *sk;
Signature · 1 line
1.7.7.3
PATCH 22/22 NFC: NCI code identation fixes
In reply to Samuel Ortiz--- include/net/nfc/nci_core.h | 10 ++-- net/nfc/nci/core.c | 113 +++++++++++++++++++++----------------------- net/nfc/nci/data.c | 28 +++++----- net/nfc/nci/ntf.c | 75 ++++++++++++++--------------- net/nfc/nci/rsp.c | 17 +++---- 5 files changed, 116 insertions(+), 127 deletions(-)
include/net/nfc/nci_core.h +5 -5
@@ -141,17 +141,17 @@ struct nci_dev {/* ----- NCI Devices ----- */ struct nci_dev *nci_allocate_device (struct nci_ops *ops, -__u32 supported_protocols, -int tx_headroom, -int tx_tailroom); +__u32 supported_protocols, +int tx_headroom, +int tx_tailroom);void nci_free_device (struct nci_dev *ndev);int nci_register_device (struct nci_dev *ndev);void nci_unregister_device (struct nci_dev *ndev);int nci_recv_frame (struct sk_buff *skb);static inline struct sk_buff *nci_skb_alloc (struct nci_dev *ndev, -unsigned int len, -gfp_t how) +unsigned int len, +gfp_t how) {struct sk_buff *skb;
net/nfc/nci/core.c +54 -59
308 lines not on this page · raw message
net/nfc/nci/data.c +14 -14
@@ -35,8 +35,7 @@#include <linux/nfc.h> /* Complete data exchange transaction and forward skb to nfc core */ -void nci_data_exchange_complete (struct nci_dev *ndev, -struct sk_buff *skb, +void nci_data_exchange_complete (struct nci_dev *ndev,struct sk_buff *skb,int err) {data_exchange_cb_t cb = ndev->data_exchange_cb;
@@ -67,9 +66,9 @@ void nci_data_exchange_complete(struct nci_dev *ndev,/* ----------------- NCI TX Data ----------------- */ static inline void nci_push_data_hdr (struct nci_dev *ndev, -__u8 conn_id, -struct sk_buff *skb, -__u8 pbf) +__u8 conn_id, +struct sk_buff *skb, +__u8 pbf) {struct nci_data_hdr *hdr;int plen = skb->len;
@@ -86,8 +85,8 @@ static inline void nci_push_data_hdr(struct nci_dev *ndev, }static int nci_queue_tx_data_frags (struct nci_dev *ndev, -__u8 conn_id, -struct sk_buff *skb) { +__u8 conn_id, +struct sk_buff *skb) {int total_len = skb->len;unsigned char *data = skb->data;unsigned long flags;
@@ -105,8 +104,8 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev,min_t (int, total_len, ndev->max_data_pkt_payload_size); skb_frag =nci_skb_alloc (ndev, - (NCI_DATA_HDR_SIZE + frag_len), -GFP_KERNEL ); + (NCI_DATA_HDR_SIZE + frag_len), +GFP_KERNEL );if (skb_frag ==NULL ) { rc = -ENOMEM ; goto free_exit;
@@ -118,7 +117,8 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev,/* second, set the header */ nci_push_data_hdr (ndev, conn_id, skb_frag, - ((total_len == frag_len) ? (NCI_PBF_LAST ) : (NCI_PBF_CONT ))); + ((total_len == frag_len) ? + (NCI_PBF_LAST ) : (NCI_PBF_CONT )));__skb_queue_tail (&frags_q, skb_frag);
@@ -186,8 +186,8 @@ exit:/* ----------------- NCI RX Data ----------------- */ static void nci_add_rx_data_frag (struct nci_dev *ndev, -struct sk_buff *skb, -__u8 pbf) +struct sk_buff *skb, +__u8 pbf) {int reassembly_len;int err =0 ;
@@ -211,8 +211,8 @@ static void nci_add_rx_data_frag(struct nci_dev *ndev,/* second, combine the two fragments */ memcpy (skb_push (skb, reassembly_len), - ndev->rx_data_reassembly->data, - reassembly_len); + ndev->rx_data_reassembly->data, + reassembly_len);/* third, free old reassembly */ kfree_skb (ndev->rx_data_reassembly);
net/nfc/nci/ntf.c +35 -40
241 lines not on this page · raw message
net/nfc/nci/rsp.c +8 -9
@@ -67,19 +67,18 @@ static void nci_core_init_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb) ndev->num_supported_rf_interfaces = rsp_1->num_supported_rf_interfaces;if (ndev->num_supported_rf_interfaces > -NCI_MAX_SUPPORTED_RF_INTERFACES ) { +NCI_MAX_SUPPORTED_RF_INTERFACES ) { ndev->num_supported_rf_interfaces =NCI_MAX_SUPPORTED_RF_INTERFACES ; }memcpy (ndev->supported_rf_interfaces, - rsp_1->supported_rf_interfaces, - ndev->num_supported_rf_interfaces); + rsp_1->supported_rf_interfaces, + ndev->num_supported_rf_interfaces); rsp_2 = (void *) (skb->data +6 + rsp_1->num_supported_rf_interfaces); - ndev->max_logical_connections = - rsp_2->max_logical_connections; + ndev->max_logical_connections = rsp_2->max_logical_connections; ndev->max_routing_table_size =__le16_to_cpu (rsp_2->max_routing_table_size); ndev->max_ctrl_pkt_payload_len =
@@ -121,7 +120,7 @@ exit: }static void nci_rf_disc_map_rsp_packet (struct nci_dev *ndev, -struct sk_buff *skb) +struct sk_buff *skb) {__u8 status = skb->data[0 ];
@@ -143,7 +142,7 @@ static void nci_rf_disc_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb) }static void nci_rf_disc_select_rsp_packet (struct nci_dev *ndev, -struct sk_buff *skb) +struct sk_buff *skb) {__u8 status = skb->data[0 ];
@@ -155,7 +154,7 @@ static void nci_rf_disc_select_rsp_packet(struct nci_dev *ndev, }static void nci_rf_deactivate_rsp_packet (struct nci_dev *ndev, -struct sk_buff *skb) +struct sk_buff *skb) {__u8 status = skb->data[0 ];
@@ -163,7 +162,7 @@ static void nci_rf_deactivate_rsp_packet(struct nci_dev *ndev,/* If target was active, complete the request only in deactivate_ntf */ if ((status !=NCI_STATUS_OK ) || - (atomic_read (&ndev->state) !=NCI_POLL_ACTIVE )) { + (atomic_read (&ndev->state) !=NCI_POLL_ACTIVE )) {nci_clear_target_list (ndev);atomic_set (&ndev->state,NCI_IDLE );nci_req_complete (ndev, status);
Signature · 1 line
1.7.7.3