From 5d4a0559eb91cc68a0844c0776e05b2fa75ba5d3 Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
Date: Mon, 8 Jan 2007 09:51:40 +0000
Subject: [PATCH] Backport linux-atm api from 2.6.8.1 for brcm63xx

SVN-Revision: 6029
---
 .../brcm63xx-2.6/patches/100-atm_hacks.patch  | 238 ++++++++++++++++++
 1 file changed, 238 insertions(+)
 create mode 100644 target/linux/brcm63xx-2.6/patches/100-atm_hacks.patch

diff --git a/target/linux/brcm63xx-2.6/patches/100-atm_hacks.patch b/target/linux/brcm63xx-2.6/patches/100-atm_hacks.patch
new file mode 100644
index 0000000000..b0afadd88a
--- /dev/null
+++ b/target/linux/brcm63xx-2.6/patches/100-atm_hacks.patch
@@ -0,0 +1,238 @@
+diff -urN linux-2.6.19.1/include/linux/atm.h linux-2.6.19.1.new/include/linux/atm.h
+--- linux-2.6.19.1/include/linux/atm.h	2006-12-11 20:32:53.000000000 +0100
++++ linux-2.6.19.1.new/include/linux/atm.h	2007-01-07 18:38:50.000000000 +0100
+@@ -48,6 +48,9 @@
+ #define ATM_AAL2	2		/* AAL2 (VBR) */
+ #define ATM_AAL34	3		/* AAL3/4 (data) */
+ #define ATM_AAL5	5		/* AAL5 (data) */
++#if defined(CONFIG_MIPS_BCM963XX)
++#define ATM_BCM_AAL0    14              /* "raw" ATM cells */
++#endif
+ 
+ /*
+  * socket option name coding functions
+diff -urN linux-2.6.19.1/include/linux/atmbr2684.h linux-2.6.19.1.new/include/linux/atmbr2684.h
+--- linux-2.6.19.1/include/linux/atmbr2684.h	2006-12-11 20:32:53.000000000 +0100
++++ linux-2.6.19.1.new/include/linux/atmbr2684.h	2007-01-07 18:24:01.000000000 +0100
+@@ -78,6 +78,10 @@
+ 	__u8	vpn_id[7];
+ 	int	send_padding;	/* unsupported */
+ 	int	min_size;	/* we will pad smaller packets than this */
++#if defined(CONFIG_MIPS_BCM963XX)
++#define FILTER_PPPOE	1
++	int	proto_filter;	/* protocol filter flag, current only PPPoE */
++#endif
+ };
+ 
+ /*
+diff -urN linux-2.6.19.1/include/linux/atmdev.h linux-2.6.19.1.new/include/linux/atmdev.h
+--- linux-2.6.19.1/include/linux/atmdev.h	2006-12-11 20:32:53.000000000 +0100
++++ linux-2.6.19.1.new/include/linux/atmdev.h	2007-01-07 18:37:34.000000000 +0100
+@@ -29,6 +29,10 @@
+ #define ATM_DS3_PCR	(8000*12)
+ 			/* DS3: 12 cells in a 125 usec time slot */
+ 
++#if defined(CONFIG_MIPS_BCM963XX)
++#define atm_sk(__sk) ((struct atm_vcc *)(__sk)->sk_protinfo)
++#define ATM_SD(s)      (atm_sk((s)->sk))
++#endif
+ 
+ #define __AAL_STAT_ITEMS \
+     __HANDLE_ITEM(tx);			/* TX okay */ \
+@@ -111,6 +115,9 @@
+ #define ATM_BACKEND_RAW		0	
+ #define ATM_BACKEND_PPP		1	/* PPPoATM - RFC2364 */
+ #define ATM_BACKEND_BR2684	2	/* Bridged RFC1483/2684 */
++#if defined(CONFIG_MIPS_BCM963XX)
++#define ATM_BACKEND_RT2684      3       /* Routed RFC1483/2684 */
++#endif
+ 
+ /* for ATM_GETTYPE */
+ #define ATM_ITFTYP_LEN	8	/* maximum length of interface type name */
+@@ -274,6 +281,9 @@
+ 
+ 
+ enum {
++#if defined(CONFIG_MIPS_BCM963XX)
++	ATM_DF_CLOSE,           /* close device when last VCC is closed */
++#endif
+ 	ATM_DF_REMOVED,		/* device was removed from atm_devs list */
+ };
+ 
+@@ -285,8 +295,10 @@
+ #define ATM_ATMOPT_CLP	1	/* set CLP bit */
+ 
+ struct atm_vcc {
++#if !defined(CONFIG_MIPS_BCM963XX)
+ 	/* struct sock has to be the first member of atm_vcc */
+ 	struct sock	sk;
++#endif
+ 	unsigned long	flags;		/* VCC flags (ATM_VF_*) */
+ 	short		vpi;		/* VPI and VCI (types must be equal */
+ 					/* with sockaddr) */
+@@ -303,6 +315,9 @@
+ 	void		*dev_data;	/* per-device data */
+ 	void		*proto_data;	/* per-protocol data */
+ 	struct k_atm_aal_stats *stats;	/* pointer to AAL stats group */
++#if defined(CONFIG_MIP_BCM963XX)
++	struct sock	*sk;		/* socket backpointer */
++#endif
+ 	/* SVC part --- may move later ------------------------------------- */
+ 	short		itf;		/* interface number */
+ 	struct sockaddr_atmsvc local;
+@@ -332,7 +347,11 @@
+ 
+ struct atm_dev_addr {
+ 	struct sockaddr_atmsvc addr;	/* ATM address */
++#if defined(CONFIG_MIPS_BCM963XX)
++	struct atm_dev_addr *next;      /* next address */
++#else
+ 	struct list_head entry;		/* next address */
++#endif
+ };
+ 
+ enum atm_addr_type_t { ATM_ADDR_LOCAL, ATM_ADDR_LECS };
+@@ -346,8 +365,12 @@
+ 	void		*dev_data;	/* per-device data */
+ 	void		*phy_data;	/* private PHY date */
+ 	unsigned long	flags;		/* device flags (ATM_DF_*) */
++#if defined(CONFIG_MIPS_BCM963XX)
++	struct atm_dev_addr *local;     /* local ATM addresses */
++#else
+ 	struct list_head local;		/* local ATM addresses */
+ 	struct list_head lecs;		/* LECS ATM addresses learned via ILMI */
++#endif
+ 	unsigned char	esi[ESI_LEN];	/* ESI ("MAC" addr) */
+ 	struct atm_cirange ci_range;	/* VPI/VCI range */
+ 	struct k_atm_dev_stats stats;	/* statistics */
+@@ -359,7 +382,9 @@
+ 	struct proc_dir_entry *proc_entry; /* proc entry */
+ 	char *proc_name;		/* proc entry name */
+ #endif
++#if !defined(CONFIG_MIPS_BCM963XX)
+ 	struct class_device class_dev;	/* sysfs class device */
++#endif
+ 	struct list_head dev_list;	/* linkage */
+ };
+ 
+@@ -416,7 +441,13 @@
+     int number,unsigned long *flags); /* number == -1: pick first available */
+ struct atm_dev *atm_dev_lookup(int number);
+ void atm_dev_deregister(struct atm_dev *dev);
++#if defined(CONFIG_MIPS_BCM963XX)
++void shutdown_atm_dev(struct atm_dev *dev);
++#endif
+ void vcc_insert_socket(struct sock *sk);
++#if defined(CONFIG_MIPS_BCM963XX)
++void vcc_remove_socket(struct sock *sk);
++#endif
+ 
+ 
+ /*
+@@ -432,20 +463,33 @@
+ 
+ static inline void atm_force_charge(struct atm_vcc *vcc,int truesize)
+ {
++#if defined(CONFIG_MIPS_BCM963XX)
++	atomic_add(truesize, &vcc->sk->sk_rmem_alloc);
++#else
+ 	atomic_add(truesize, &sk_atm(vcc)->sk_rmem_alloc);
++#endif
+ }
+ 
+ 
+ static inline void atm_return(struct atm_vcc *vcc,int truesize)
+ {
++#if defined(CONFIG_MIPS_BCM963XX)
++	atomic_sub(truesize, &vcc->sk->sk_rmem_alloc);
++#else
+ 	atomic_sub(truesize, &sk_atm(vcc)->sk_rmem_alloc);
++#endif
+ }
+ 
+ 
+ static inline int atm_may_send(struct atm_vcc *vcc,unsigned int size)
+ {
++#if defined(CONFIG_MIPS_BCM963XX)
++	return (size + atomic_read(&vcc->sk->sk_wmem_alloc)) <
++		vcc->sk->sk_sndbuf;
++#else
+ 	return (size + atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) <
+ 	       sk_atm(vcc)->sk_sndbuf;
++#endif
+ }
+ 
+ 
+@@ -457,12 +501,20 @@
+ 
+ static inline void atm_dev_put(struct atm_dev *dev)
+ {
++#if defined(CONFIG_MIPS_BCM963XX)
++	atomic_dec(&dev->refcnt);
++	
++	if ((atomic_read(&dev->refcnt) == 1) &&
++	     test_bit(ATM_DF_CLOSE,&dev->flags))
++		shutdown_atm_dev(dev);
++#else
+ 	if (atomic_dec_and_test(&dev->refcnt)) {
+ 		BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags));
+ 		if (dev->ops->dev_close)
+ 			dev->ops->dev_close(dev);
+ 		class_device_put(&dev->class_dev);
+ 	}
++#endif
+ }
+ 
+ 
+diff -urN linux-2.6.19.1/include/linux/atmrt2684.h linux-2.6.19.1.new/include/linux/atmrt2684.h
+--- linux-2.6.19.1/include/linux/atmrt2684.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.19.1.new/include/linux/atmrt2684.h	2007-01-07 18:40:39.000000000 +0100
+@@ -0,0 +1,48 @@
++#ifndef _LINUX_ATMRT2684_H
++#define _LINUX_ATMRT2684_H
++
++#include <linux/atm.h>
++#include <linux/if.h>		/* For IFNAMSIZ */
++
++#define RT2684_ENCAPS_NULL	(0)	/* VC-mux */
++#define RT2684_ENCAPS_LLC	(1)
++#define RT2684_ENCAPS_AUTODETECT (2)	/* Unsuported */
++
++/*
++ * This is for the ATM_NEWBACKENDIF call - these are like socket families:
++ * the first element of the structure is the backend number and the rest
++ * is per-backend specific
++ */
++struct atm_newif_rt2684 {
++	atm_backend_t	backend_num;	/* ATM_BACKEND_RT2684 */
++	char		ifname[IFNAMSIZ];
++};
++
++/*
++ * This structure is used to specify a rt2684 interface - either by a
++ * positive integer (returned by ATM_NEWBACKENDIF) or the interfaces name
++ */
++#define RT2684_FIND_BYNOTHING	(0)
++#define RT2684_FIND_BYNUM	(1)
++#define RT2684_FIND_BYIFNAME	(2)
++struct rt2684_if_spec {
++	int method;			/* RT2684_FIND_* */
++	union {
++		char		ifname[IFNAMSIZ];
++		int		devnum;
++	} spec;
++};
++
++/*
++ * This is for the ATM_SETBACKEND call - these are like socket families:
++ * the first element of the structure is the backend number and the rest
++ * is per-backend specific
++ */
++struct atm_backend_rt2684 {
++	atm_backend_t	backend_num;	/* ATM_BACKEND_RT2684 */
++	struct rt2684_if_spec ifspec;
++	unsigned char	encaps;		/* RT2684_ENCAPS_* */
++};
++
++
++#endif /* _LINUX_ATMRT2684_H */
-- 
2.30.2