llc_nop.c (1850B)
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 12struct 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 21static 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 45static void llc_nop_deinit(struct nfc_llc *llc) 46{ 47 kfree(nfc_llc_get_data(llc)); 48} 49 50static int llc_nop_start(struct nfc_llc *llc) 51{ 52 return 0; 53} 54 55static int llc_nop_stop(struct nfc_llc *llc) 56{ 57 return 0; 58} 59 60static 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 67static 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 74static 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 83int nfc_llc_nop_register(void) 84{ 85 return nfc_llc_register(LLC_NOP_NAME, &llc_nop_ops); 86}