Make linker function declarations a tag

This is similar to Linux's initcall().  Instead of changing the name of
the function, just tag it.  This makes it a little easier to port Linux
drivers too.

The __init tag does nothing right now.  For now, just use it as a
convention.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/drivers/net/bnx2x/bnx2x_dev.c b/kern/drivers/net/bnx2x/bnx2x_dev.c
index eb031a4..b4b0722 100644
--- a/kern/drivers/net/bnx2x/bnx2x_dev.c
+++ b/kern/drivers/net/bnx2x/bnx2x_dev.c
@@ -451,7 +451,8 @@
 	return 0;
 }
 
-linker_func_3(etherbnx2x_link)
+static void __init etherbnx2x_link(void)
 {
 	addethercard("bnx2x", bnx2x_pnp);
 }
+init_func_3(etherbnx2x_link);
diff --git a/kern/drivers/net/ether8139.c b/kern/drivers/net/ether8139.c
index f5761df..199a0c6 100644
--- a/kern/drivers/net/ether8139.c
+++ b/kern/drivers/net/ether8139.c
@@ -801,7 +801,8 @@
 	return 0;
 }
 
-linker_func_3(ether8139link)
+static void __init ether8139link(void)
 {
 	addethercard("rtl8139", rtl8139pnp);
 }
+init_func_3(ether8139link);
diff --git a/kern/drivers/net/ether82563.c b/kern/drivers/net/ether82563.c
index c4c48fc..5a2e1c3 100644
--- a/kern/drivers/net/ether82563.c
+++ b/kern/drivers/net/ether82563.c
@@ -2297,7 +2297,7 @@
 	return pnp(e, i218);
 }
 
-linker_func_3(ether82563link)
+static void __init ether82563link(void)
 {
 	/* recognise lots of model numbers for debugging assistance */
 	addethercard("i82563", i82563pnp);
@@ -2312,3 +2312,4 @@
 	addethercard("i218", i218pnp);
 	addethercard("igbepcie", anypnp);
 }
+init_func_3(ether82563link);
diff --git a/kern/drivers/net/etherigbe.c b/kern/drivers/net/etherigbe.c
index f29869f..13d5463 100644
--- a/kern/drivers/net/etherigbe.c
+++ b/kern/drivers/net/etherigbe.c
@@ -2040,8 +2040,9 @@
 	return 0;
 }
 
-linker_func_3(etherigbelink)
+static void __init etherigbelink()
 {
 	addethercard("i82543", igbepnp);
 	addethercard("igbe", igbepnp);
 }
+init_func_3(etherigbelink);
diff --git a/kern/drivers/net/mlx4/main.c b/kern/drivers/net/mlx4/main.c
index bd8217e..2309a21 100644
--- a/kern/drivers/net/mlx4/main.c
+++ b/kern/drivers/net/mlx4/main.c
@@ -3979,8 +3979,9 @@
 	return 0;
 }
 
-linker_func_3(ethermlx4_link)
+static void __init ethermlx4_link(void)
 {
 	addethercard("mlx4", mlx4_pnp);
 }
+init_func_3(ethermlx4_link);
 #endif
diff --git a/kern/drivers/net/r8169.c b/kern/drivers/net/r8169.c
index b9924e1..4f57342 100644
--- a/kern/drivers/net/r8169.c
+++ b/kern/drivers/net/r8169.c
@@ -8867,7 +8867,8 @@
 	return 0;
 }
 
-linker_func_3(ether_rtl8169_link)
+static void __init ether_rtl8169_link(void)
 {
 	addethercard("r8169", rtl8169_pnp);
 }
+init_func_3(ether_rtl8169_link);
diff --git a/kern/include/linker_func.h b/kern/include/linker_func.h
index 72e3e68..8dd4abb 100644
--- a/kern/include/linker_func.h
+++ b/kern/include/linker_func.h
@@ -9,19 +9,20 @@
  * higher levels.  There is no guarantee of ordering of functions within a
  * level.
  *
- * To use, change your function definition to use the appropriate macro, e.g.
+ * To use, simply add the __init tag and the appropriate init_func_X(func);
  *
- * 		void foo(void)
+ * 		static void foo(void)
  * 		{
  * 			bar();
  * 		}
  *
  * becomes
  *
- * 		linker_func_3(foo)
+ * 		static void __init foo(void)
  * 		{
  * 			bar();
  * 		}
+ * 		init_func_3(foo);
  *
  * And foo() will run during the third level of functions.
  *
@@ -29,6 +30,8 @@
 
 #pragma once
 
+#define __init
+
 #define __linkerfunc1  __attribute__((__section__(".linkerfunc1")))
 #define __linkerfunc2  __attribute__((__section__(".linkerfunc2")))
 #define __linkerfunc3  __attribute__((__section__(".linkerfunc3")))
@@ -36,25 +39,11 @@
 
 typedef void (*linker_func_t)(void);
 
-#define linker_func_1(x)                                                       \
-	void (x)(void);                                                        \
-	linker_func_t __linkerfunc1 __##x = (x);                               \
-	void (x)(void)
-
-#define linker_func_2(x)                                                       \
-	void (x)(void);                                                        \
-	linker_func_t __linkerfunc2 __##x = (x);                               \
-	void (x)(void)
-
-#define linker_func_3(x)                                                       \
-	void (x)(void);                                                        \
-	linker_func_t __linkerfunc3 __##x = (x);                               \
-	void (x)(void)
-
-#define linker_func_4(x)                                                       \
-	void (x)(void);                                                        \
-	linker_func_t __linkerfunc4 __##x = (x);                               \
-	void (x)(void)
+/* Casting for the sake of Linux functions, which return an int. */
+#define init_func_1(x) linker_func_t __linkerfunc1 __##x = (linker_func_t)(x);
+#define init_func_2(x) linker_func_t __linkerfunc2 __##x = (linker_func_t)(x);
+#define init_func_3(x) linker_func_t __linkerfunc3 __##x = (linker_func_t)(x);
+#define init_func_4(x) linker_func_t __linkerfunc4 __##x = (linker_func_t)(x);
 
 extern linker_func_t __linkerfunc1start[];
 extern linker_func_t __linkerfunc1end[];
diff --git a/kern/include/linux_compat.h b/kern/include/linux_compat.h
index 0d9232c..c645057 100644
--- a/kern/include/linux_compat.h
+++ b/kern/include/linux_compat.h
@@ -312,7 +312,6 @@
 #define MODULE_DEVICE_TABLE(...)
 #define THIS_MODULE ((void*)0)
 #define EXPORT_SYMBOL(...)
-#define __init
 #define __exit
 #define module_init(...)
 #define module_exit(...)
diff --git a/kern/src/ktest/net_ktests.c b/kern/src/ktest/net_ktests.c
index 19ef811..ef33ded 100644
--- a/kern/src/ktest/net_ktests.c
+++ b/kern/src/ktest/net_ktests.c
@@ -88,7 +88,8 @@
 
 static int num_ktests = sizeof(ktests) / sizeof(struct ktest);
 
-linker_func_1(register_net_ktests)
+static void __init register_net_ktests(void)
 {
 	REGISTER_KTESTS(ktests, num_ktests);
 }
+init_func_1(register_net_ktests);
diff --git a/kern/src/ktest/pb_ktests.c b/kern/src/ktest/pb_ktests.c
index 9049d16..05d22ea 100644
--- a/kern/src/ktest/pb_ktests.c
+++ b/kern/src/ktest/pb_ktests.c
@@ -2097,110 +2097,9 @@
 	KTEST_REG(percpu_increment,   CONFIG_TEST_percpu_increment),
 };
 static int num_ktests = sizeof(ktests) / sizeof(struct ktest);
-linker_func_1(register_pb_ktests)
+
+static void __init register_pb_ktests(void)
 {
 	REGISTER_KTESTS(ktests, num_ktests);
 }
-
-/* Linker function tests.  Keep them commented, etc. */
-#if 0
-linker_func_1(xme11)
-{
-	printk("xme11\n");
-}
-
-linker_func_1(xme12)
-{
-	printk("xme12\n");
-}
-
-linker_func_1(xme13)
-{
-	printk("xme13\n");
-}
-
-linker_func_1(xme14)
-{
-	printk("xme14\n");
-}
-
-linker_func_1(xme15)
-{
-	printk("xme15\n");
-}
-
-linker_func_2(xme21)
-{
-	printk("xme21\n");
-}
-
-linker_func_2(xme22)
-{
-	printk("xme22\n");
-}
-
-linker_func_2(xme23)
-{
-	printk("xme23\n");
-}
-
-linker_func_2(xme24)
-{
-	printk("xme24\n");
-}
-
-linker_func_2(xme25)
-{
-	printk("xme25\n");
-}
-
-linker_func_3(xme31)
-{
-	printk("xme31\n");
-}
-
-linker_func_3(xme32)
-{
-	printk("xme32\n");
-}
-
-linker_func_3(xme33)
-{
-	printk("xme33\n");
-}
-
-linker_func_3(xme34)
-{
-	printk("xme34\n");
-}
-
-linker_func_3(xme35)
-{
-	printk("xme35\n");
-}
-
-linker_func_4(xme41)
-{
-	printk("xme41\n");
-}
-
-linker_func_4(xme42)
-{
-	printk("xme42\n");
-}
-
-linker_func_4(xme43)
-{
-	printk("xme43\n");
-}
-
-linker_func_4(xme44)
-{
-	printk("xme44\n");
-}
-
-linker_func_4(xme45)
-{
-	printk("xme45\n");
-}
-#endif /* linker func tests */
+init_func_1(register_pb_ktests);
diff --git a/kern/src/net/ethermedium.c b/kern/src/net/ethermedium.c
index c96f463..bb39564 100644
--- a/kern/src/net/ethermedium.c
+++ b/kern/src/net/ethermedium.c
@@ -859,11 +859,12 @@
 	return NULL;
 }
 
-linker_func_4(ethermediumlink)
+static void __init ethermediumlink(void)
 {
 	addipmedium(&ethermedium);
 	addipmedium(&trexmedium);
 }
+init_func_4(ethermediumlink);
 
 static void etherpref2addr(uint8_t * pref, uint8_t * ea)
 {
diff --git a/kern/src/net/loopbackmedium.c b/kern/src/net/loopbackmedium.c
index 4cdf617..25918d5 100644
--- a/kern/src/net/loopbackmedium.c
+++ b/kern/src/net/loopbackmedium.c
@@ -149,7 +149,8 @@
 	.bwrite = loopbackbwrite,
 };
 
-linker_func_4(loopbackmediumlink)
+static void __init loopbackmediumlink(void)
 {
 	addipmedium(&loopbackmedium);
 }
+init_func_4(loopbackmediumlink);