Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 328278
b: refs/heads/master
c: 67cccfe
h: refs/heads/master
v: v3
  • Loading branch information
Eric Lapuyade authored and Samuel Ortiz committed Sep 24, 2012
1 parent 5dda06f commit e888fa3
Show file tree
Hide file tree
Showing 6 changed files with 293 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f3e8fb552789f4845e60b11c47b676d14b9488e5
refs/heads/master: 67cccfe17d1b3da1ed6c79e643c9be95ebde9642
51 changes: 51 additions & 0 deletions trunk/include/net/nfc/llc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Link Layer Control manager public interface
*
* Copyright (C) 2012 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

#ifndef __NFC_LLC_H_
#define __NFC_LLC_H_

#include <net/nfc/hci.h>
#include <linux/skbuff.h>

typedef void (*rcv_to_hci_t) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
typedef int (*xmit_to_drv_t) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
typedef void (*llc_failure_t) (struct nfc_hci_dev *hdev, int err);

struct nfc_llc;

struct nfc_llc *nfc_llc_allocate(const char *name, 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);
void nfc_llc_free(struct nfc_llc *llc);

void nfc_llc_get_rx_head_tail_room(struct nfc_llc *llc, int *rx_headroom,
int *rx_tailroom);


int nfc_llc_start(struct nfc_llc *llc);
int nfc_llc_stop(struct nfc_llc *llc);
void nfc_llc_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb);
int nfc_llc_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb);

int nfc_llc_init(void);
void nfc_llc_exit(void);

#endif /* __NFC_LLC_H_ */
2 changes: 1 addition & 1 deletion trunk/net/nfc/hci/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@

obj-$(CONFIG_NFC_HCI) += hci.o

hci-y := core.o hcp.o command.o
hci-y := core.o hcp.o command.o llc.o
hci-$(CONFIG_NFC_SHDLC) += shdlc.o
14 changes: 14 additions & 0 deletions trunk/net/nfc/hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

#include <net/nfc/nfc.h>
#include <net/nfc/hci.h>
#include <net/nfc/llc.h>

#include "hci.h"

Expand Down Expand Up @@ -821,4 +822,17 @@ void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb)
}
EXPORT_SYMBOL(nfc_hci_recv_frame);

static int __init nfc_hci_init(void)
{
return nfc_llc_init();
}

static void __exit nfc_hci_exit(void)
{
nfc_llc_exit();
}

module_init(nfc_hci_init);
module_exit(nfc_hci_exit);

MODULE_LICENSE("GPL");
168 changes: 168 additions & 0 deletions trunk/net/nfc/hci/llc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/*
* Link Layer Control manager
*
* Copyright (C) 2012 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

#include <linux/export.h>
#include <net/nfc/llc.h>
#include "llc.h"

static struct list_head llc_engines;

int nfc_llc_init(void)
{
INIT_LIST_HEAD(&llc_engines);

return 0;
}
EXPORT_SYMBOL(nfc_llc_init);

void nfc_llc_exit(void)
{
struct nfc_llc_engine *llc_engine, *n;

list_for_each_entry_safe(llc_engine, n, &llc_engines, entry) {
list_del(&llc_engine->entry);
kfree(llc_engine->name);
kfree(llc_engine);
}
}
EXPORT_SYMBOL(nfc_llc_exit);

int nfc_llc_register(const char *name, struct nfc_llc_ops *ops)
{
struct nfc_llc_engine *llc_engine;

llc_engine = kzalloc(sizeof(struct nfc_llc_engine), GFP_KERNEL);
if (llc_engine == NULL)
return -ENOMEM;

llc_engine->name = kstrdup(name, GFP_KERNEL);
if (llc_engine->name == NULL) {
kfree(llc_engine);
return -ENOMEM;
}
llc_engine->ops = ops;

INIT_LIST_HEAD(&llc_engine->entry);
list_add_tail (&llc_engine->entry, &llc_engines);

return 0;
}
EXPORT_SYMBOL(nfc_llc_register);

static struct nfc_llc_engine *nfc_llc_name_to_engine(const char *name)
{
struct nfc_llc_engine *llc_engine;

list_for_each_entry(llc_engine, &llc_engines, entry) {
if (strcmp(llc_engine->name, name) == 0)
return llc_engine;
}

return NULL;
}

void nfc_llc_unregister(const char *name)
{
struct nfc_llc_engine *llc_engine;

llc_engine = nfc_llc_name_to_engine(name);
if (llc_engine == NULL)
return;

list_del(&llc_engine->entry);
kfree(llc_engine->name);
kfree(llc_engine);
}
EXPORT_SYMBOL(nfc_llc_unregister);

struct nfc_llc *nfc_llc_allocate(const char *name, 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)
{
struct nfc_llc_engine *llc_engine;
struct nfc_llc *llc;

llc_engine = nfc_llc_name_to_engine(name);
if (llc_engine == NULL)
return NULL;

llc = kzalloc(sizeof(struct nfc_llc), GFP_KERNEL);
if (llc == NULL)
return NULL;

llc->data = llc_engine->ops->init(hdev, xmit_to_drv, rcv_to_hci,
tx_headroom, tx_tailroom,
&llc->rx_headroom, &llc->rx_tailroom,
llc_failure);
if (llc->data == NULL) {
kfree(llc);
return NULL;
}
llc->ops = llc_engine->ops;

return llc;
}
EXPORT_SYMBOL(nfc_llc_allocate);

void nfc_llc_free(struct nfc_llc *llc)
{
llc->ops->deinit(llc);
kfree(llc);
}
EXPORT_SYMBOL(nfc_llc_free);

inline void nfc_llc_get_rx_head_tail_room(struct nfc_llc *llc, int *rx_headroom,
int *rx_tailroom)
{
*rx_headroom = llc->rx_headroom;
*rx_tailroom = llc->rx_tailroom;
}
EXPORT_SYMBOL(nfc_llc_get_rx_head_tail_room);

inline int nfc_llc_start(struct nfc_llc *llc)
{
return llc->ops->start(llc);
}
EXPORT_SYMBOL(nfc_llc_start);

inline int nfc_llc_stop(struct nfc_llc *llc)
{
return llc->ops->stop(llc);
}
EXPORT_SYMBOL(nfc_llc_stop);

inline void nfc_llc_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb)
{
llc->ops->rcv_from_drv(llc, skb);
}
EXPORT_SYMBOL(nfc_llc_rcv_from_drv);

inline int nfc_llc_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb)
{
return llc->ops->xmit_from_hci(llc, skb);
}
EXPORT_SYMBOL(nfc_llc_xmit_from_hci);

inline void *nfc_llc_get_data(struct nfc_llc *llc)
{
return llc->data;
}
EXPORT_SYMBOL(nfc_llc_get_data);
58 changes: 58 additions & 0 deletions trunk/net/nfc/hci/llc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Link Layer Control manager
*
* Copyright (C) 2012 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

#ifndef __LOCAL_LLC_H_
#define __LOCAL_LLC_H_

#include <net/nfc/hci.h>
#include <net/nfc/llc.h>
#include <linux/skbuff.h>

struct nfc_llc_ops {
void *(*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);
void (*deinit) (struct nfc_llc *llc);
int (*start) (struct nfc_llc *llc);
int (*stop) (struct nfc_llc *llc);
void (*rcv_from_drv) (struct nfc_llc *llc, struct sk_buff *skb);
int (*xmit_from_hci) (struct nfc_llc *llc, struct sk_buff *skb);
};

struct nfc_llc_engine {
const char *name;
struct nfc_llc_ops *ops;
struct list_head entry;
};

struct nfc_llc {
void *data;
struct nfc_llc_ops *ops;
int rx_headroom;
int rx_tailroom;
};

void *nfc_llc_get_data(struct nfc_llc *llc);

int nfc_llc_register(const char *name, struct nfc_llc_ops *ops);
void nfc_llc_unregister(const char *name);

#endif /* __LOCAL_LLC_H_ */

0 comments on commit e888fa3

Please sign in to comment.