Lines Matching +full:byte +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/crc-ccitt.h>
29 * called byte stuffing has been introduced.
31 * if byte == ST21NFCA_SOF_EOF or ST21NFCA_ESCAPE_BYTE_STUFFING
32 * - insert ST21NFCA_ESCAPE_BYTE_STUFFING (escape byte)
33 * - xor byte with ST21NFCA_BYTE_STUFFING_MASK
83 16, 1, (skb)->data, (skb)->len, 0); \
97 int i, r = -1; in st21nfca_hci_platform_init()
100 r = i2c_master_send(phy->i2c_dev, reboot_cmd, in st21nfca_hci_platform_init()
110 r = -1; in st21nfca_hci_platform_init()
112 r = i2c_master_recv(phy->i2c_dev, tmp, in st21nfca_hci_platform_init()
125 return -ENODEV; in st21nfca_hci_platform_init()
135 gpiod_set_value(phy->gpiod_ena, 1); in st21nfca_hci_i2c_enable()
136 phy->powered = 1; in st21nfca_hci_i2c_enable()
137 phy->run_mode = ST21NFCA_HCI_MODE; in st21nfca_hci_i2c_enable()
148 gpiod_set_value(phy->gpiod_ena, 0); in st21nfca_hci_i2c_disable()
150 phy->powered = 0; in st21nfca_hci_i2c_disable()
160 crc = crc_ccitt(0xffff, skb->data, skb->len); in st21nfca_hci_add_len_crc()
173 skb_trim(skb, skb->len - ST21NFCA_FRAME_TAILROOM); in st21nfca_hci_remove_len_crc()
183 int r = -1, i, j; in st21nfca_hci_i2c_write()
185 struct i2c_client *client = phy->i2c_dev; in st21nfca_hci_i2c_write()
190 if (phy->hard_fault != 0) in st21nfca_hci_i2c_write()
191 return phy->hard_fault; in st21nfca_hci_i2c_write()
194 * Compute CRC before byte stuffing computation on frame in st21nfca_hci_i2c_write()
195 * Note st21nfca_hci_add_len_crc is doing a byte stuffing in st21nfca_hci_i2c_write()
206 * Compute byte stuffing in st21nfca_hci_i2c_write()
207 * if byte == ST21NFCA_SOF_EOF or ST21NFCA_ESCAPE_BYTE_STUFFING in st21nfca_hci_i2c_write()
208 * insert ST21NFCA_ESCAPE_BYTE_STUFFING (escape byte) in st21nfca_hci_i2c_write()
209 * xor byte with ST21NFCA_BYTE_STUFFING_MASK in st21nfca_hci_i2c_write()
211 tmp[0] = skb->data[0]; in st21nfca_hci_i2c_write()
212 for (i = 1, j = 1; i < skb->len - 1; i++, j++) { in st21nfca_hci_i2c_write()
213 if (skb->data[i] == ST21NFCA_SOF_EOF in st21nfca_hci_i2c_write()
214 || skb->data[i] == ST21NFCA_ESCAPE_BYTE_STUFFING) { in st21nfca_hci_i2c_write()
217 tmp[j] = skb->data[i] ^ ST21NFCA_BYTE_STUFFING_MASK; in st21nfca_hci_i2c_write()
219 tmp[j] = skb->data[i]; in st21nfca_hci_i2c_write()
222 tmp[j] = skb->data[i]; in st21nfca_hci_i2c_write()
229 mutex_lock(&phy->phy_lock); in st21nfca_hci_i2c_write()
235 mutex_unlock(&phy->phy_lock); in st21nfca_hci_i2c_write()
239 r = -EREMOTEIO; in st21nfca_hci_i2c_write()
251 int len = 0; in get_frame_size() local
253 if (buf[len + 1] == ST21NFCA_SOF_EOF) in get_frame_size()
256 for (len = 1; len < buflen && buf[len] != ST21NFCA_SOF_EOF; len++) in get_frame_size()
259 return len; in get_frame_size()
266 crc = crc_ccitt(0xffff, buf, buflen - 2); in check_crc()
269 if (buf[buflen - 2] != (crc & 0xff) || buf[buflen - 1] != (crc >> 8)) { in check_crc()
271 ": CRC error 0x%x != 0x%x 0x%x\n", crc, buf[buflen - 1], in check_crc()
272 buf[buflen - 2]); in check_crc()
277 return -EPERM; in check_crc()
284 * Received data include byte stuffing, crc and sof/eof
287 * frame size without sof/eof, header and byte stuffing
288 * -EBADMSG : frame was incorrect and discarded
294 if (skb->len < 1 || (skb->len > 1 && skb->data[1] != 0)) in st21nfca_hci_i2c_repack()
295 return -EBADMSG; in st21nfca_hci_i2c_repack()
297 size = get_frame_size(skb->data, skb->len); in st21nfca_hci_i2c_repack()
300 /* remove ST21NFCA byte stuffing for upper layer */ in st21nfca_hci_i2c_repack()
301 for (i = 1, j = 0; i < skb->len; i++) { in st21nfca_hci_i2c_repack()
302 if (skb->data[i + j] == in st21nfca_hci_i2c_repack()
304 skb->data[i] = skb->data[i + j + 1] in st21nfca_hci_i2c_repack()
309 skb->data[i] = skb->data[i + j]; in st21nfca_hci_i2c_repack()
311 /* remove byte stuffing useless byte */ in st21nfca_hci_i2c_repack()
312 skb_trim(skb, i - j); in st21nfca_hci_i2c_repack()
316 r = check_crc(skb->data, skb->len); in st21nfca_hci_i2c_repack()
318 return -EBADMSG; in st21nfca_hci_i2c_repack()
322 /* remove crc. Byte Stuffing is already removed here */ in st21nfca_hci_i2c_repack()
323 skb_trim(skb, skb->len - 2); in st21nfca_hci_i2c_repack()
324 return skb->len; in st21nfca_hci_i2c_repack()
336 * -EAGAIN : if received frame is incomplete (not find ST21NFCA_SOF_EOF
338 * -EREMOTEIO : i2c read error (fatal)
339 * -EBADMSG : frame was incorrect and discarded
341 * -EIO : if no ST21NFCA_SOF_EOF is found after reaching
348 u8 len; in st21nfca_hci_i2c_read() local
350 struct i2c_client *client = phy->i2c_dev; in st21nfca_hci_i2c_read()
352 if (phy->current_read_len < ARRAY_SIZE(len_seq)) { in st21nfca_hci_i2c_read()
353 len = len_seq[phy->current_read_len]; in st21nfca_hci_i2c_read()
361 mutex_lock(&phy->phy_lock); in st21nfca_hci_i2c_read()
363 r = i2c_master_recv(client, buf, len); in st21nfca_hci_i2c_read()
367 mutex_unlock(&phy->phy_lock); in st21nfca_hci_i2c_read()
369 if (r != len) { in st21nfca_hci_i2c_read()
370 phy->current_read_len = 0; in st21nfca_hci_i2c_read()
371 return -EREMOTEIO; in st21nfca_hci_i2c_read()
378 if (!phy->current_read_len && !IS_START_OF_FRAME(buf)) { in st21nfca_hci_i2c_read()
380 phy->current_read_len = 0; in st21nfca_hci_i2c_read()
381 return -EIO; in st21nfca_hci_i2c_read()
382 } else if (phy->current_read_len && IS_START_OF_FRAME(buf)) { in st21nfca_hci_i2c_read()
389 phy->current_read_len = 0; in st21nfca_hci_i2c_read()
392 skb_put_data(skb, buf, len); in st21nfca_hci_i2c_read()
394 if (skb->data[skb->len - 1] == ST21NFCA_SOF_EOF) { in st21nfca_hci_i2c_read()
395 phy->current_read_len = 0; in st21nfca_hci_i2c_read()
398 phy->current_read_len++; in st21nfca_hci_i2c_read()
399 return -EAGAIN; in st21nfca_hci_i2c_read()
401 return -EIO; in st21nfca_hci_i2c_read()
406 * seems. The frame format is data-crc, and corruption can occur anywhere
424 if (!phy || irq != phy->i2c_dev->irq) { in st21nfca_hci_irq_thread_fn()
429 if (phy->hard_fault != 0) in st21nfca_hci_irq_thread_fn()
432 r = st21nfca_hci_i2c_read(phy, phy->pending_skb); in st21nfca_hci_irq_thread_fn()
433 if (r == -EREMOTEIO) { in st21nfca_hci_irq_thread_fn()
434 phy->hard_fault = r; in st21nfca_hci_irq_thread_fn()
436 nfc_hci_recv_frame(phy->hdev, NULL); in st21nfca_hci_irq_thread_fn()
439 } else if (r == -EAGAIN || r == -EIO) { in st21nfca_hci_irq_thread_fn()
441 } else if (r == -EBADMSG && phy->crc_trials < ARRAY_SIZE(wait_tab)) { in st21nfca_hci_irq_thread_fn()
451 msleep(wait_tab[phy->crc_trials]); in st21nfca_hci_irq_thread_fn()
452 phy->crc_trials++; in st21nfca_hci_irq_thread_fn()
453 phy->current_read_len = 0; in st21nfca_hci_irq_thread_fn()
454 kfree_skb(phy->pending_skb); in st21nfca_hci_irq_thread_fn()
461 nfc_hci_recv_frame(phy->hdev, phy->pending_skb); in st21nfca_hci_irq_thread_fn()
462 phy->crc_trials = 0; in st21nfca_hci_irq_thread_fn()
464 kfree_skb(phy->pending_skb); in st21nfca_hci_irq_thread_fn()
467 phy->pending_skb = alloc_skb(ST21NFCA_HCI_LLC_MAX_SIZE * 2, GFP_KERNEL); in st21nfca_hci_irq_thread_fn()
468 if (phy->pending_skb == NULL) { in st21nfca_hci_irq_thread_fn()
469 phy->hard_fault = -ENOMEM; in st21nfca_hci_irq_thread_fn()
470 nfc_hci_recv_frame(phy->hdev, NULL); in st21nfca_hci_irq_thread_fn()
485 { "enable-gpios", &enable_gpios, 1 },
491 struct device *dev = &client->dev; in st21nfca_hci_i2c_probe()
495 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in st21nfca_hci_i2c_probe()
496 nfc_err(&client->dev, "Need I2C_FUNC_I2C\n"); in st21nfca_hci_i2c_probe()
497 return -ENODEV; in st21nfca_hci_i2c_probe()
500 phy = devm_kzalloc(&client->dev, sizeof(struct st21nfca_i2c_phy), in st21nfca_hci_i2c_probe()
503 return -ENOMEM; in st21nfca_hci_i2c_probe()
505 phy->i2c_dev = client; in st21nfca_hci_i2c_probe()
506 phy->pending_skb = alloc_skb(ST21NFCA_HCI_LLC_MAX_SIZE * 2, GFP_KERNEL); in st21nfca_hci_i2c_probe()
507 if (phy->pending_skb == NULL) in st21nfca_hci_i2c_probe()
508 return -ENOMEM; in st21nfca_hci_i2c_probe()
510 phy->current_read_len = 0; in st21nfca_hci_i2c_probe()
511 phy->crc_trials = 0; in st21nfca_hci_i2c_probe()
512 mutex_init(&phy->phy_lock); in st21nfca_hci_i2c_probe()
520 phy->gpiod_ena = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in st21nfca_hci_i2c_probe()
521 if (IS_ERR(phy->gpiod_ena)) { in st21nfca_hci_i2c_probe()
523 r = PTR_ERR(phy->gpiod_ena); in st21nfca_hci_i2c_probe()
527 phy->se_status.is_ese_present = in st21nfca_hci_i2c_probe()
528 device_property_read_bool(&client->dev, "ese-present"); in st21nfca_hci_i2c_probe()
529 phy->se_status.is_uicc_present = in st21nfca_hci_i2c_probe()
530 device_property_read_bool(&client->dev, "uicc-present"); in st21nfca_hci_i2c_probe()
534 nfc_err(&client->dev, "Unable to reboot st21nfca\n"); in st21nfca_hci_i2c_probe()
538 r = devm_request_threaded_irq(&client->dev, client->irq, NULL, in st21nfca_hci_i2c_probe()
543 nfc_err(&client->dev, "Unable to register IRQ handler\n"); in st21nfca_hci_i2c_probe()
551 &phy->hdev, in st21nfca_hci_i2c_probe()
552 &phy->se_status); in st21nfca_hci_i2c_probe()
559 kfree_skb(phy->pending_skb); in st21nfca_hci_i2c_probe()
567 st21nfca_hci_remove(phy->hdev); in st21nfca_hci_i2c_remove()
569 if (phy->powered) in st21nfca_hci_i2c_remove()
571 kfree_skb(phy->pending_skb); in st21nfca_hci_i2c_remove()
587 { .compatible = "st,st21nfca-i2c", },