1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * nop (passthrough) Link Layer Control 4 * 5 * Copyright (C) 2012 Intel Corporation. All rights reserved. 6 */ 7 8 #include <linux/types.h> 9 10 #include "llc.h" 11 12 struct llc_nop { 13 struct nfc_hci_dev *hdev; 14 xmit_to_drv_t xmit_to_drv; 15 rcv_to_hci_t rcv_to_hci; 16 int tx_headroom; 17 int tx_tailroom; 18 llc_failure_t llc_failure; 19 }; 20 21 static void *llc_nop_init(struct nfc_hci_dev *hdev, xmit_to_drv_t xmit_to_drv, 22 rcv_to_hci_t rcv_to_hci, int tx_headroom, 23 int tx_tailroom, int *rx_headroom, int *rx_tailroom, 24 llc_failure_t llc_failure) 25 { 26 struct llc_nop *llc_nop; 27 28 *rx_headroom = 0; 29 *rx_tailroom = 0; 30 31 llc_nop = kzalloc(sizeof(struct llc_nop), GFP_KERNEL); 32 if (llc_nop == NULL) 33 return NULL; 34 35 llc_nop->hdev = hdev; 36 llc_nop->xmit_to_drv = xmit_to_drv; 37 llc_nop->rcv_to_hci = rcv_to_hci; 38 llc_nop->tx_headroom = tx_headroom; 39 llc_nop->tx_tailroom = tx_tailroom; 40 llc_nop->llc_failure = llc_failure; 41 42 return llc_nop; 43 } 44 45 static void llc_nop_deinit(struct nfc_llc *llc) 46 { 47 kfree(nfc_llc_get_data(llc)); 48 } 49 50 static int llc_nop_start(struct nfc_llc *llc) 51 { 52 return 0; 53 } 54 55 static int llc_nop_stop(struct nfc_llc *llc) 56 { 57 return 0; 58 } 59 60 static void llc_nop_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb) 61 { 62 struct llc_nop *llc_nop = nfc_llc_get_data(llc); 63 64 llc_nop->rcv_to_hci(llc_nop->hdev, skb); 65 } 66 67 static int llc_nop_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb) 68 { 69 struct llc_nop *llc_nop = nfc_llc_get_data(llc); 70 71 return llc_nop->xmit_to_drv(llc_nop->hdev, skb); 72 } 73 74 static const struct nfc_llc_ops llc_nop_ops = { 75 .init = llc_nop_init, 76 .deinit = llc_nop_deinit, 77 .start = llc_nop_start, 78 .stop = llc_nop_stop, 79 .rcv_from_drv = llc_nop_rcv_from_drv, 80 .xmit_from_hci = llc_nop_xmit_from_hci, 81 }; 82 83 int nfc_llc_nop_register(void) 84 { 85 return nfc_llc_register(LLC_NOP_NAME, &llc_nop_ops); 86 } 87