From 9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 Mon Sep 17 00:00:00 2001 From: Yunhong Jiang Date: Tue, 4 Aug 2015 12:17:53 -0700 Subject: Add the rt linux 4.1.3-rt3 as base Import the rt linux 4.1.3-rt3 as OPNFV kvm base. It's from git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt and the base is: commit 0917f823c59692d751951bf5ea699a2d1e2f26a2 Author: Sebastian Andrzej Siewior Date: Sat Jul 25 12:13:34 2015 +0200 Prepare v4.1.3-rt3 Signed-off-by: Sebastian Andrzej Siewior We lose all the git history this way and it's not good. We should apply another opnfv project repo in future. Change-Id: I87543d81c9df70d99c5001fbdf646b202c19f423 Signed-off-by: Yunhong Jiang --- kernel/include/linux/hdlc.h | 120 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 kernel/include/linux/hdlc.h (limited to 'kernel/include/linux/hdlc.h') diff --git a/kernel/include/linux/hdlc.h b/kernel/include/linux/hdlc.h new file mode 100644 index 000000000..1acb1445e --- /dev/null +++ b/kernel/include/linux/hdlc.h @@ -0,0 +1,120 @@ +/* + * Generic HDLC support routines for Linux + * + * Copyright (C) 1999-2005 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + */ +#ifndef __HDLC_H +#define __HDLC_H + + +#include +#include +#include +#include + +/* This structure is a private property of HDLC protocols. + Hardware drivers have no interest here */ + +struct hdlc_proto { + int (*open)(struct net_device *dev); + void (*close)(struct net_device *dev); + void (*start)(struct net_device *dev); /* if open & DCD */ + void (*stop)(struct net_device *dev); /* if open & !DCD */ + void (*detach)(struct net_device *dev); + int (*ioctl)(struct net_device *dev, struct ifreq *ifr); + __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev); + int (*netif_rx)(struct sk_buff *skb); + netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev); + struct module *module; + struct hdlc_proto *next; /* next protocol in the list */ +}; + + +/* Pointed to by netdev_priv(dev) */ +typedef struct hdlc_device { + /* used by HDLC layer to take control over HDLC device from hw driver*/ + int (*attach)(struct net_device *dev, + unsigned short encoding, unsigned short parity); + + /* hardware driver must handle this instead of dev->hard_start_xmit */ + netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev); + + /* Things below are for HDLC layer internal use only */ + const struct hdlc_proto *proto; + int carrier; + int open; + spinlock_t state_lock; + void *state; + void *priv; +} hdlc_device; + + + +/* Exported from hdlc module */ + +/* Called by hardware driver when a user requests HDLC service */ +int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); + +/* Must be used by hardware driver on module startup/exit */ +#define register_hdlc_device(dev) register_netdev(dev) +void unregister_hdlc_device(struct net_device *dev); + + +void register_hdlc_protocol(struct hdlc_proto *proto); +void unregister_hdlc_protocol(struct hdlc_proto *proto); + +struct net_device *alloc_hdlcdev(void *priv); + +static inline struct hdlc_device* dev_to_hdlc(struct net_device *dev) +{ + return netdev_priv(dev); +} + +static __inline__ void debug_frame(const struct sk_buff *skb) +{ + int i; + + for (i=0; i < skb->len; i++) { + if (i == 100) { + printk("...\n"); + return; + } + printk(" %02X", skb->data[i]); + } + printk("\n"); +} + + +/* Must be called by hardware driver when HDLC device is being opened */ +int hdlc_open(struct net_device *dev); +/* Must be called by hardware driver when HDLC device is being closed */ +void hdlc_close(struct net_device *dev); +/* May be used by hardware driver */ +int hdlc_change_mtu(struct net_device *dev, int new_mtu); +/* Must be pointed to by hw driver's dev->netdev_ops->ndo_start_xmit */ +netdev_tx_t hdlc_start_xmit(struct sk_buff *skb, struct net_device *dev); + +int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto, + size_t size); +/* May be used by hardware driver to gain control over HDLC device */ +void detach_hdlc_protocol(struct net_device *dev); + +static __inline__ __be16 hdlc_type_trans(struct sk_buff *skb, + struct net_device *dev) +{ + hdlc_device *hdlc = dev_to_hdlc(dev); + + skb->dev = dev; + skb_reset_mac_header(skb); + + if (hdlc->proto->type_trans) + return hdlc->proto->type_trans(skb, dev); + else + return htons(ETH_P_HDLC); +} + +#endif /* __HDLC_H */ -- cgit 1.2.3-korg