@@ -63,6 +63,17 @@ static int nfcmrvl_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
63
63
if (!test_bit (NFCMRVL_NCI_RUNNING , & priv -> flags ))
64
64
return - EBUSY ;
65
65
66
+ if (priv -> hci_muxed ) {
67
+ unsigned char * hdr ;
68
+ unsigned char len = skb -> len ;
69
+
70
+ hdr = (char * ) skb_push (skb , NFCMRVL_HCI_EVENT_HEADER_SIZE );
71
+ hdr [0 ] = NFCMRVL_HCI_COMMAND_CODE ;
72
+ hdr [1 ] = NFCMRVL_HCI_OGF ;
73
+ hdr [2 ] = NFCMRVL_HCI_OCF ;
74
+ hdr [3 ] = len ;
75
+ }
76
+
66
77
return priv -> if_ops -> nci_send (priv , skb );
67
78
}
68
79
@@ -80,10 +91,12 @@ static struct nci_ops nfcmrvl_nci_ops = {
80
91
81
92
struct nfcmrvl_private * nfcmrvl_nci_register_dev (void * drv_data ,
82
93
struct nfcmrvl_if_ops * ops ,
83
- struct device * dev )
94
+ struct device * dev ,
95
+ unsigned int flags )
84
96
{
85
97
struct nfcmrvl_private * priv ;
86
98
int rc ;
99
+ int headroom = 0 ;
87
100
u32 protocols ;
88
101
89
102
priv = kzalloc (sizeof (* priv ), GFP_KERNEL );
@@ -93,14 +106,19 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
93
106
priv -> drv_data = drv_data ;
94
107
priv -> if_ops = ops ;
95
108
priv -> dev = dev ;
109
+ priv -> hci_muxed = (flags & NFCMRVL_DEV_FLAG_HCI_MUXED ) ? 1 : 0 ;
110
+
111
+ if (priv -> hci_muxed )
112
+ headroom = NFCMRVL_HCI_EVENT_HEADER_SIZE ;
96
113
97
114
protocols = NFC_PROTO_JEWEL_MASK
98
115
| NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK
99
116
| NFC_PROTO_ISO14443_MASK
100
117
| NFC_PROTO_ISO14443_B_MASK
101
118
| NFC_PROTO_NFC_DEP_MASK ;
102
119
103
- priv -> ndev = nci_allocate_device (& nfcmrvl_nci_ops , protocols , 0 , 0 );
120
+ priv -> ndev = nci_allocate_device (& nfcmrvl_nci_ops , protocols ,
121
+ headroom , 0 );
104
122
if (!priv -> ndev ) {
105
123
nfc_err (dev , "nci_allocate_device failed\n" );
106
124
rc = - ENOMEM ;
@@ -144,6 +162,19 @@ int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, void *data, int count)
144
162
return - ENOMEM ;
145
163
146
164
memcpy (skb_put (skb , count ), data , count );
165
+
166
+ if (priv -> hci_muxed ) {
167
+ if (skb -> data [0 ] == NFCMRVL_HCI_EVENT_CODE &&
168
+ skb -> data [1 ] == NFCMRVL_HCI_NFC_EVENT_CODE ) {
169
+ /* Data packet, let's extract NCI payload */
170
+ skb_pull (skb , NFCMRVL_HCI_EVENT_HEADER_SIZE );
171
+ } else {
172
+ /* Skip this packet */
173
+ kfree_skb (skb );
174
+ return 0 ;
175
+ }
176
+ }
177
+
147
178
nci_recv_frame (priv -> ndev , skb );
148
179
149
180
return count ;
0 commit comments