aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc/st21nfca
diff options
context:
space:
mode:
authorChristophe Ricard <christophe.ricard@gmail.com>2014-04-24 17:19:31 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-05-04 18:15:26 -0400
commite1fb97b9256f383ed9553a1fc0b1576dfc88d582 (patch)
treedca71a5de67cfb2aa92d0bad7cad900e9c67830f /drivers/nfc/st21nfca
parent3096e25a3e40b73afd59e46f3bf8d84f919992a1 (diff)
NFC: st21nfca: Fix st21nfca_hci_remove_len_crc tail room handling
There is no byte stuffing when data are stored in skb. TAILROOM is 2 byte crc + 1 byte eof. st21nfca_hci_remove_len_crc was doing an incorrect operation on the TAILROOM data. If shdlc timer T2 is triggered, it will request to send the same data. Before every hci data was lost after st21nfca_hci_remove_len_crc. Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc/st21nfca')
-rw-r--r--drivers/nfc/st21nfca/i2c.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index 4df15ef2528a..e29351ca7dd1 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -48,11 +48,11 @@
48#define ST21NFCA_BYTE_STUFFING_MASK 0x20 48#define ST21NFCA_BYTE_STUFFING_MASK 0x20
49#define ST21NFCA_ESCAPE_BYTE_STUFFING 0x7d 49#define ST21NFCA_ESCAPE_BYTE_STUFFING 0x7d
50 50
51/* SOF + 00 fill size */ 51/* SOF + 00 */
52#define ST21NFCA_FRAME_HEADROOM 2 52#define ST21NFCA_FRAME_HEADROOM 2
53 53
54/* 4 bytes crc (worst case byte stuffing) + EOF */ 54/* 2 bytes crc + EOF */
55#define ST21NFCA_FRAME_TAILROOM 5 55#define ST21NFCA_FRAME_TAILROOM 3
56 56
57#define ST21NFCA_HCI_I2C_DRIVER_NAME "st21nfca_hci_i2c" 57#define ST21NFCA_HCI_I2C_DRIVER_NAME "st21nfca_hci_i2c"
58 58
@@ -166,9 +166,8 @@ static void st21nfca_hci_i2c_disable(void *phy_id)
166 phy->powered = 0; 166 phy->powered = 0;
167} 167}
168 168
169static int st21nfca_hci_add_len_crc(struct sk_buff *skb) 169static void st21nfca_hci_add_len_crc(struct sk_buff *skb)
170{ 170{
171 int ret = 2;
172 u16 crc; 171 u16 crc;
173 u8 tmp; 172 u8 tmp;
174 173
@@ -182,14 +181,12 @@ static int st21nfca_hci_add_len_crc(struct sk_buff *skb)
182 181
183 tmp = (crc >> 8) & 0x00ff; 182 tmp = (crc >> 8) & 0x00ff;
184 *skb_put(skb, 1) = tmp; 183 *skb_put(skb, 1) = tmp;
185
186 return ret;
187} 184}
188 185
189static void st21nfca_hci_remove_len_crc(struct sk_buff *skb, int crc_len) 186static void st21nfca_hci_remove_len_crc(struct sk_buff *skb)
190{ 187{
191 skb_pull(skb, ST21NFCA_FRAME_HEADROOM); 188 skb_pull(skb, ST21NFCA_FRAME_HEADROOM);
192 skb_trim(skb, crc_len); 189 skb_trim(skb, skb->len - ST21NFCA_FRAME_TAILROOM);
193} 190}
194 191
195/* 192/*
@@ -199,7 +196,7 @@ static void st21nfca_hci_remove_len_crc(struct sk_buff *skb, int crc_len)
199 */ 196 */
200static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb) 197static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb)
201{ 198{
202 int r = -1, i, j, len; 199 int r = -1, i, j;
203 struct st21nfca_i2c_phy *phy = phy_id; 200 struct st21nfca_i2c_phy *phy = phy_id;
204 struct i2c_client *client = phy->i2c_dev; 201 struct i2c_client *client = phy->i2c_dev;
205 u8 tmp[ST21NFCA_HCI_LLC_MAX_SIZE * 2]; 202 u8 tmp[ST21NFCA_HCI_LLC_MAX_SIZE * 2];
@@ -215,7 +212,7 @@ static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb)
215 * Note st21nfca_hci_add_len_crc is doing a byte stuffing 212 * Note st21nfca_hci_add_len_crc is doing a byte stuffing
216 * on its own value 213 * on its own value
217 */ 214 */
218 len = st21nfca_hci_add_len_crc(skb); 215 st21nfca_hci_add_len_crc(skb);
219 216
220 /* add ST21NFCA_SOF_EOF on tail */ 217 /* add ST21NFCA_SOF_EOF on tail */
221 *skb_put(skb, 1) = ST21NFCA_SOF_EOF; 218 *skb_put(skb, 1) = ST21NFCA_SOF_EOF;
@@ -259,7 +256,7 @@ static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb)
259 r = 0; 256 r = 0;
260 } 257 }
261 258
262 st21nfca_hci_remove_len_crc(skb, len); 259 st21nfca_hci_remove_len_crc(skb);
263 260
264 return r; 261 return r;
265} 262}