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_MIPS_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 +#include /* 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 */