diff -ur --new-file old/atm/BUGS new/atm/BUGS
--- old/atm/BUGS	Fri Nov  6 16:36:58 1998
+++ new/atm/BUGS	Sat Dec  5 01:40:57 1998
@@ -1,6 +1,10 @@
-Known bugs and restrictions in version 0.51
+Known bugs and restrictions in version 0.52
 ===========================================
 
+ - ENI driver: closing an AAL0 socket while data is arriving at a high rate
+   hangs in the close system call
+ - mpcd: adds an MPOA Egress Cache Tag Extension in the MPOA Cache Imposition
+   Replies it sends even if the extension is missing from the incoming Request
  - ANS: libresolve conflicts with libc on some systems
  - ENI driver loses synchronization on some systems, leading to panics or hung
    VCs (these may be two distinct problems)
diff -ur --new-file old/atm/CHANGES new/atm/CHANGES
--- old/atm/CHANGES	Fri Nov  6 16:36:22 1998
+++ new/atm/CHANGES	Sat Dec  5 01:44:40 1998
@@ -1,3 +1,31 @@
+Version 0.51 to 0.52 (5-DEC-1998)
+====================
+
+Bug fixes
+---------
+
+ - atmsigd crashed when receiving STATUS ENQUIRY for call in Null state
+   (reported by Heikki Vatiainen)
+ - outbound endpoint reference didin't have the 16th bit toggled (fixed by
+   Andrew Lunn)
+ - lec.c: fixed a bug in kernel which could cause kernel part to deadlock when
+   signalling was not started successfully (by Heikki Vatiainen)
+ - MPOA: bug fixes and other changes, see atm/mpoa/CHANGELOG (by Heikki
+   Vatiainen)
+
+New features
+------------
+
+ - LANE: both kernel & daemon: support for ELANs which have MTUs greater than
+   1516 (by Eric H. Kinzie)
+ - MPOA: can now ask LECS for configuratino information (by Heikki Vatiainen)
+
+Other changes
+-------------
+
+ - zeppelin.8: updated (Heikki Vatiainen)
+
+
 Version 0.50 to 0.51 (6-NOV-1998)
 ====================
 
diff -ur --new-file old/atm/README new/atm/README
--- old/atm/README	Fri Nov  6 16:36:27 1998
+++ new/atm/README	Sat Dec  5 01:27:05 1998
@@ -1,4 +1,4 @@
-ATM on Linux, release 0.51 (alpha)        by Werner Almesberger, EPFL ICA
+ATM on Linux, release 0.52 (alpha)        by Werner Almesberger, EPFL ICA
 ============================================== Werner.Almesberger@epfl.ch
 
 This is experimental software. There are known major bugs and certainly
diff -ur --new-file old/atm/USAGE new/atm/USAGE
--- old/atm/USAGE	Fri Nov  6 16:37:41 1998
+++ new/atm/USAGE	Sat Dec  5 01:58:08 1998
@@ -1,4 +1,4 @@
-Usage instructions  -  ATM on Linux, release 0.51
+Usage instructions  -  ATM on Linux, release 0.52
 -------------------------------------------------
 
 For updates of ATM on Linux, please check the Web page at  
@@ -17,7 +17,7 @@
 In order to install this package, you need 
 
   - the package itself  
-    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.51.tar.gz  
+    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.52.tar.gz  
   - the Linux kernel, version 2.1.126, e.g. from  
     ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.126.tar.gz  
   - Perl, version 4 or 5 
@@ -33,7 +33,7 @@
 all the files listed above there. Then extract the ATM on Linux 
 distribution:
 
-tar xfz atm-0.51.tar.gz
+tar xfz atm-0.52.tar.gz
 
 and the kernel source:
 
diff -ur --new-file old/atm/VERSION new/atm/VERSION
--- old/atm/VERSION	Thu Nov  5 18:26:42 1998
+++ new/atm/VERSION	Sat Dec  5 01:27:00 1998
@@ -1 +1 @@
-0.51
+0.52
diff -ur --new-file old/atm/atm.patch new/atm/atm.patch
--- old/atm/atm.patch	Tue Nov  3 18:56:14 1998
+++ new/atm/atm.patch	Sat Dec  5 01:58:02 1998
@@ -14524,8 +14524,8 @@
 +};
 +#endif /* _ATMLEC_H_ */
 --- /dev/null	Tue Jan  1 05:00:00 1980
-+++ work/include/linux/atmmpc.h	Sun Nov  1 15:31:53 1998
-@@ -0,0 +1,99 @@
++++ work/include/linux/atmmpc.h	Sat Dec  5 01:45:34 1998
+@@ -0,0 +1,124 @@
 +#ifndef _ATMMPC_H_
 +#define _ATMMPC_H_
 +
@@ -14565,6 +14565,15 @@
 +        uint16_t  holding_time;
 +} eg_ctrl_info;
 +
++struct mpc_parameters{
++        uint16_t mpc_p1;   /* Shortcut-Setup Frame Count    */
++        uint16_t mpc_p2;   /* Shortcut-Setup Frame Time     */
++        uint8_t mpc_p3[8]; /* Flow-detection Protocols      */
++        uint16_t mpc_p4;   /* MPC Initial Retry Time        */
++        uint16_t mpc_p5;   /* MPC Retry Time Maximum        */
++        uint16_t mpc_p6;   /* Hold Down Time                */      
++};
++
 +struct k_message{
 +        uint16_t type;
 +        uint32_t ip_mask;
@@ -14572,6 +14581,7 @@
 +        union {
 +                in_ctrl_info in_info;
 +                eg_ctrl_info eg_info;
++                struct mpc_parameters params;
 +        } content;
 +        struct atm_qos qos;       
 +} k_message;
@@ -14584,6 +14594,16 @@
 +        uint8_t  type[2]; /* Ether type (for IP)              (0x0800)   */
 +};
 +
++/* TLVs this MPC recognizes */
++#define TLV_MPOA_DEVICE_TYPE         0x00a03e2a  
++
++/* MPOA device types in MPOA Device Type TLV */
++#define NON_MPOA    0
++#define MPS         1
++#define MPC         2
++#define MPS_AND_MPC 3
++
++
 +/* MPC parameter defaults */
 +
 +#define MPC_P1 10  /* Shortcut-Setup Frame Count  */ 
@@ -14603,11 +14623,11 @@
 +
 +#define SND_MPOA_RES_RQST    201
 +#define SET_MPS_CTRL_ADDR    202
-+#define SND_MPOA_RES_RTRY    203 /* Different type in a retry due to req id.*/
++#define SND_MPOA_RES_RTRY    203 /* Different type in a retry due to req id         */
 +#define STOP_KEEP_ALIVE_SM   204
 +#define EGRESS_ENTRY_REMOVED 205
 +#define SND_EGRESS_PURGE     206
-+#define DIE                  207
++#define DIE                  207 /* tell the daemon to exit()                       */
 +#define DATA_PLANE_PURGE     208 /* Data plane purge because of egress cache hit miss or dead MPS */
 +#define OPEN_INGRESS_SVC     209
 +
@@ -14619,10 +14639,15 @@
 +#define EGRESS_PURGE_RCVD     104
 +#define MPS_DEATH             105
 +#define CACHE_IMPOS_RCVD      106
-+#define SET_MPC_CTRL_ADDR     107 /* Our MPC's control ATM address           */
++#define SET_MPC_CTRL_ADDR     107 /* Our MPC's control ATM address   */
 +#define SET_MPS_MAC_ADDR      108
 +#define CLEAN_UP_AND_EXIT     109
-+       
++#define SET_MPC_PARAMS        110 /* MPC configuration parameters    */
++
++/* Message types - bidirectional */       
++
++#define RELOAD                301 /* kill -HUP the daemon for reload */
++
 +#endif /* _ATMMPC_H_ */
 +
 --- /dev/null	Tue Jan  1 05:00:00 1980
@@ -17969,8 +17994,8 @@
 +
 +#endif
 --- /dev/null	Tue Jan  1 05:00:00 1980
-+++ work/net/atm/lec.c	Tue Nov  3 18:41:56 1998
-@@ -0,0 +1,2043 @@
++++ work/net/atm/lec.c	Sat Dec  5 01:49:36 1998
+@@ -0,0 +1,2054 @@
 +/*
 + * lec.c: Lan Emulation driver 
 + * Marko Kiiskila carnil@cs.tut.fi
@@ -18093,6 +18118,7 @@
 +        if (!priv->lecd) {
 +                printk("%s:No lecd attached\n",dev->name);
 +                priv->stats.tx_errors++;
++                dev->tbusy = 1;
 +                return -EUNATCH;
 +        } 
 +        if (dev->tbusy) {
@@ -18541,6 +18567,15 @@
 +        return 0;
 +}
 +
++/* shamelessly stolen from drivers/net/net_init.c */
++static int lec_change_mtu(struct device *dev, int new_mtu)
++{
++        if ((new_mtu < 68) || (new_mtu > 18190))
++                return -EINVAL;
++        dev->mtu = new_mtu;
++        return 0;
++}
++
 +static int 
 +lec_init(struct device *dev)
 +{
@@ -18551,6 +18586,7 @@
 +        memset(dev->priv,0,sizeof(struct lec_priv));
 +
 +        ether_setup(dev);
++        dev->change_mtu = lec_change_mtu;
 +        dev->hard_header = lec_hard_header;
 +        dev->rebuild_header = lec_rebuild_header;
 +        dev->hard_header_cache = NULL;
@@ -20278,8 +20314,8 @@
 +
 +#endif
 --- /dev/null	Tue Jan  1 05:00:00 1980
-+++ work/net/atm/mpc.c	Sun Nov  1 15:31:53 1998
-@@ -0,0 +1,1485 @@
++++ work/net/atm/mpc.c	Sat Dec  5 01:50:04 1998
+@@ -0,0 +1,1519 @@
 +#include <linux/kernel.h>
 +#include <linux/string.h>
 +#include <linux/timer.h>
@@ -20338,11 +20374,13 @@
 +static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc);
 +static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc);
 +static void mps_death(struct k_message *msg, struct mpoa_client *mpc);
-+static void clean_up(struct k_message *msg, struct mpoa_client *mpc);
++static void clean_up(struct k_message *msg, struct mpoa_client *mpc, int action);
 +static void MPOA_cache_impos_rcvd(struct k_message *msg, struct mpoa_client *mpc);
 +static void set_mpc_ctrl_addr_rcvd(struct k_message *mesg, struct mpoa_client *mpc);
 +static void set_mps_mac_addr_rcvd(struct k_message *mesg, struct mpoa_client *mpc);
 +
++static uint8_t *copy_macs(struct mpoa_client *mpc, uint8_t *router_mac,
++                          uint8_t *tlvs, uint8_t mps_macs, uint8_t device_type);
 +static void purge_egress_shortcut(struct atm_vcc *vcc, eg_cache_entry *entry);
 +
 +static void send_set_mps_ctrl_addr(char *addr, struct mpoa_client *mpc);
@@ -20630,7 +20668,7 @@
 +}
 +
 +/*
-+ * lec device calls this via its dev->priv->lan2_ops->associate_indicator()
++ * lec device calls this via its dev->priv->lane2_ops->associate_indicator()
 + * when it sees a TLV in LE_ARP packet.
 + * We fill in the pointer above when we see a LANE2 lec initializing
 + * See LANE2 spec 3.1.5
@@ -20665,37 +20703,6 @@
 +                        printk("mpoa: (%s) lane2_assoc_ind: TLV type was 0, returning\n", dev->name);
 +                        return;
 +		}
-+		/* Sampo-Add: start */
-+		switch(type){
-+		        case TLV_SC_SETUP_FRAME_COUNT:
-+			        mpc->parameters.mpc_p1 = (*(tlvs+1)<<8) | (*tlvs);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p1 = %d\n",mpc->parameters.mpc_p1);
-+				break;				  
-+		        case TLV_SC_SETUP_FRAME_TIME:
-+			        mpc->parameters.mpc_p2 = (*(tlvs+1)<<8) | (*tlvs);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p2 = %d\n",mpc->parameters.mpc_p2);
-+				break;
-+		        case TLV_FLOW_DETECTION_PROTOCOLS:
-+			        memcpy(mpc->parameters.mpc_p3, tlvs, length);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p3 = %s\n",mpc->parameters.mpc_p3);
-+				break;
-+		        case TLV_MPC_ININTIAL_RETRY_TIME:
-+			        mpc->parameters.mpc_p4 = (*(tlvs+1)<<8) | (*tlvs);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p4 = %d\n",mpc->parameters.mpc_p4);
-+				break;
-+		        case TLV_MPC_RETRY_TIME_MAXIMUM:
-+			        mpc->parameters.mpc_p5 = (*(tlvs+1)<<8) | (*tlvs);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p5 = %d\n",mpc->parameters.mpc_p5);
-+				break;
-+                        case TLV_HOLD_DOWN_TIME:
-+			        mpc->parameters.mpc_p6 = (*(tlvs+1)<<8) | (*tlvs);
-+				printk("mpoa: lane2_assoc_ind(): MPC_p6 = %d\n",mpc->parameters.mpc_p6);
-+				break;
-+		        default:
-+			        break;
-+			  
-+		}
-+		/* Sampo-Add: end */
 +
 +                if (type != TLV_MPOA_DEVICE_TYPE) {
 +                        tlvs += length;
@@ -20730,25 +20737,8 @@
 +                /* ok, now we can go and tell our daemon the control address of MPS */
 +                send_set_mps_ctrl_addr(tlvs, mpc);
 +                
-+                tlvs += 20; if (mpoa_device_type == MPS_AND_MPC) tlvs += 20;
-+                /* collect the MPS MAC addresses */
-+                if (mpc->number_of_mps_macs < number_of_mps_macs) {
-+                        kfree(mpc->mps_macs); /* need more space */
-+                        mpc->mps_macs = kmalloc(number_of_mps_macs*ETH_ALEN, GFP_KERNEL);
-+                        if (mpc->mps_macs == NULL) {
-+                                printk("mpoa: (%s) lane2_assoc_ind: out of mem\n", dev->name);
-+                                return;
-+                        }
-+                }
-+
-+                /* be careful not to zero out any command line MACs */
-+                if (number_of_mps_macs > 0) {
-+                        mpc->number_of_mps_macs = number_of_mps_macs;
-+                        while (number_of_mps_macs > 0) {
-+                                memcpy(mpc->mps_macs, tlvs, ETH_ALEN);
-+                                tlvs += ETH_ALEN; number_of_mps_macs--;
-+                        }
-+                }
++                tlvs = copy_macs(mpc, mac_addr, tlvs, number_of_mps_macs, mpoa_device_type);
++                if (tlvs == NULL) return;
 +        }
 +        if (end_of_tlvs - tlvs != 0)
 +                printk("mpoa: (%s) lane2_assoc_ind: ignoring %d bytes of trailing TLV carbage\n",
@@ -20756,6 +20746,41 @@
 +        return;
 +}
 +
++/*
++ * store either advertizing router's MAC address
++ * or the MAC address(es) in this TLV
++ */
++static uint8_t *copy_macs(struct mpoa_client *mpc, uint8_t *router_mac,
++                          uint8_t *tlvs, uint8_t mps_macs, uint8_t device_type)
++{
++        int num_macs;
++        num_macs = (mps_macs > 1) ? mps_macs : 1;
++
++        if (mpc->number_of_mps_macs != num_macs) {
++                kfree(mpc->mps_macs);
++                mpc->number_of_mps_macs = num_macs;
++                mpc->mps_macs = kmalloc(num_macs*ETH_ALEN, GFP_KERNEL);
++                if (mpc->mps_macs == NULL) {
++                        printk("mpoa: (%s) copy_macs: out of mem\n", mpc->dev->name);
++                        return NULL;
++                }
++        }
++
++        /* copy the advertizing routers MAC address */
++        memcpy(mpc->mps_macs, router_mac, ETH_ALEN);
++        
++        tlvs += 20; if (device_type == MPS_AND_MPC) tlvs += 20;
++        /*
++         * collect the MPS MAC addresses.
++         * however, it is possible that TLV includes no MACs
++         */
++        if (mps_macs > 0)
++                memcpy(mpc->mps_macs, tlvs, mps_macs*ETH_ALEN);
++        tlvs += mps_macs*ETH_ALEN;
++
++        return tlvs;
++}
++