-diff -urN linux-2.4.25/drivers/atm/Makefile linux-2.4.25-atmdd/drivers/atm/Makefile
---- linux-2.4.25/drivers/atm/Makefile 2004-02-23 15:18:29.000000000 +0100
-+++ linux-2.4.25-atmdd/drivers/atm/Makefile 2004-02-29 22:51:26.000000000 +0100
-@@ -31,6 +31,7 @@
- endif
-
- obj-$(CONFIG_ATM_DUMMY) += adummy.o
-+obj-$(CONFIG_ATM_DD) += atmdd.o
- obj-$(CONFIG_ATM_TCP) += atmtcp.o
- obj-$(CONFIG_ATM_FIRESTREAM) += firestream.o
- obj-$(CONFIG_ATM_LANAI) += lanai.o
-diff -urN linux-2.4.25/drivers/atm/Kconfig linux-2.4.25-atmdd/drivers/atm/Kconfig
---- linux-2.4.25/drivers/atm/Kcnfig 2003-08-25 13:44:41.000000000 +0200
-+++ linux-2.4.25-atmdd/drivers/atm/Kconfig 2004-02-29 22:52:59.000000000 +0100
-@@ -4,6 +4,14 @@
- default y
+diff -urNp -x '*.orig' linux-4.9/drivers/atm/Kconfig linux-4.9/drivers/atm/Kconfig
+--- linux-4.9/drivers/atm/Kconfig 2021-02-24 15:42:15.767446799 +0100
++++ linux-4.9/drivers/atm/Kconfig 2021-02-24 15:42:29.767884184 +0100
+@@ -14,6 +14,14 @@ menuconfig ATM_DRIVERS
if ATM_DRIVERS && NETDEVICES && ATM
-+
+
+config ATM_DD
+ tristate "ATM loopback"
+ depends on INET && ATM
+ This is an example atm driver. It does not require any actual ATM
+ hardware. It supports AAL5 and AAL0. Frames are merely looped back
+ to the sender on the same VC they were sent.
-
++
config ATM_DUMMY
tristate "Dummy ATM driver"
-diff -urN linux-2.4.25/drivers/atm/atmdd.c linux-2.4.25-atmdd/drivers/atm/atmdd.c
---- linux-2.4.25/drivers/atm/atmdd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.25-atmdd/drivers/atm/atmdd.c 2004-02-29 22:58:11.000000000 +0100
+ help
+diff -urNp -x '*.orig' linux-4.9/drivers/atm/Makefile linux-4.9/drivers/atm/Makefile
+--- linux-4.9/drivers/atm/Makefile 2016-12-11 20:17:54.000000000 +0100
++++ linux-4.9/drivers/atm/Makefile 2021-02-24 15:42:29.767884184 +0100
+@@ -25,6 +25,7 @@ ifeq ($(CONFIG_ATM_IDT77252_USE_SUNI),y)
+ endif
+
+ obj-$(CONFIG_ATM_DUMMY) += adummy.o
++obj-$(CONFIG_ATM_DD) += atmdd.o
+ obj-$(CONFIG_ATM_TCP) += atmtcp.o
+ obj-$(CONFIG_ATM_FIRESTREAM) += firestream.o
+ obj-$(CONFIG_ATM_LANAI) += lanai.o
+diff -urNp -x '*.orig' linux-4.9/drivers/atm/atmdd.c linux-4.9/drivers/atm/atmdd.c
+--- linux-4.9/drivers/atm/atmdd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-4.9/drivers/atm/atmdd.c 2021-02-24 15:42:29.767884184 +0100
@@ -0,0 +1,921 @@
+/*
+#######################################################################
+static int myatmdd_open(struct atm_vcc *vcc);
+static void myatmdd_close(struct atm_vcc *vcc);
+static int myatmdd_ioctl(struct atm_dev *dev, unsigned int cmd,void *arg);
-+static int myatmdd_setsockopt(struct atm_vcc *vcc,int level,int optname, void *optval,int optlen);
-+static int myatmdd_getsockopt(struct atm_vcc *vcc,int level,int optname, void *optval,int optlen);
++static int myatmdd_setsockopt(struct atm_vcc *vcc,int level,int optname, void __user *optval,unsigned int optlen);
++static int myatmdd_getsockopt(struct atm_vcc *vcc,int level,int optname, void __user *optval,int optlen);
+static int myatmdd_send(struct atm_vcc *vcc,struct sk_buff *skb);
+static int myatmdd_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flgs);
+static int myatmdd_proc_read(struct atm_dev *dev,loff_t *pos,char *page);
+ return -EINVAL;
+}
+
-+static int myatmdd_getsockopt(struct atm_vcc *vcc,int level,int optname, void *optval,int optlen)
++static int myatmdd_getsockopt(struct atm_vcc *vcc,int level,int optname, void __user *optval,int optlen)
+{
+ return -EINVAL;
+}
+
-+static int myatmdd_setsockopt(struct atm_vcc *vcc,int level,int optname, void *optval,int optlen)
++static int myatmdd_setsockopt(struct atm_vcc *vcc,int level,int optname, void __user *optval,unsigned int optlen)
+{
+ return -EINVAL;
+}
+ return -ENOMEM;
+
+ /* Register the new device */
-+ myatmdd_dev = atm_dev_register(MYATMDD,&myatmdd_ops,-1,NULL);
++ myatmdd_dev = atm_dev_register(MYATMDD,NULL,&myatmdd_ops,-1,NULL);
+
+ /* Were we able to register this device? */
+ if (myatmdd_dev == NULL)