| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * nop (passthrough) Link Layer Control |
| * |
| * Copyright (C) 2012 Intel Corporation. All rights reserved. |
| */ |
| |
| #include <linux/types.h> |
| |
| #include "llc.h" |
| |
| struct llc_nop { |
| struct nfc_hci_dev *hdev; |
| xmit_to_drv_t xmit_to_drv; |
| rcv_to_hci_t rcv_to_hci; |
| int tx_headroom; |
| int tx_tailroom; |
| llc_failure_t llc_failure; |
| }; |
| |
| static void *llc_nop_init(struct nfc_hci_dev *hdev, xmit_to_drv_t xmit_to_drv, |
| rcv_to_hci_t rcv_to_hci, int tx_headroom, |
| int tx_tailroom, int *rx_headroom, int *rx_tailroom, |
| llc_failure_t llc_failure) |
| { |
| struct llc_nop *llc_nop; |
| |
| *rx_headroom = 0; |
| *rx_tailroom = 0; |
| |
| llc_nop = kzalloc(sizeof(struct llc_nop), GFP_KERNEL); |
| if (llc_nop == NULL) |
| return NULL; |
| |
| llc_nop->hdev = hdev; |
| llc_nop->xmit_to_drv = xmit_to_drv; |
| llc_nop->rcv_to_hci = rcv_to_hci; |
| llc_nop->tx_headroom = tx_headroom; |
| llc_nop->tx_tailroom = tx_tailroom; |
| llc_nop->llc_failure = llc_failure; |
| |
| return llc_nop; |
| } |
| |
| static void llc_nop_deinit(struct nfc_llc *llc) |
| { |
| kfree(nfc_llc_get_data(llc)); |
| } |
| |
| static int llc_nop_start(struct nfc_llc *llc) |
| { |
| return 0; |
| } |
| |
| static int llc_nop_stop(struct nfc_llc *llc) |
| { |
| return 0; |
| } |
| |
| static void llc_nop_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb) |
| { |
| struct llc_nop *llc_nop = nfc_llc_get_data(llc); |
| |
| llc_nop->rcv_to_hci(llc_nop->hdev, skb); |
| } |
| |
| static int llc_nop_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb) |
| { |
| struct llc_nop *llc_nop = nfc_llc_get_data(llc); |
| |
| return llc_nop->xmit_to_drv(llc_nop->hdev, skb); |
| } |
| |
| static struct nfc_llc_ops llc_nop_ops = { |
| .init = llc_nop_init, |
| .deinit = llc_nop_deinit, |
| .start = llc_nop_start, |
| .stop = llc_nop_stop, |
| .rcv_from_drv = llc_nop_rcv_from_drv, |
| .xmit_from_hci = llc_nop_xmit_from_hci, |
| }; |
| |
| int nfc_llc_nop_register(void) |
| { |
| return nfc_llc_register(LLC_NOP_NAME, &llc_nop_ops); |
| } |