summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/brcm63xx-2.6/patches/100-atm_hacks.patch238
1 files changed, 238 insertions, 0 deletions
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 000000000..b0afadd88
--- /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 */