First run at an E1000 driver, with various LWIP fixes.
[akaros.git] / kern / arch / i686 / init.c
1 /* See COPYRIGHT for copyright information. */
2
3 #ifdef __SHARC__
4 #pragma nosharc
5 #endif
6
7 #include <smp.h>
8
9 #include <arch/rl8168.h>
10 #include <arch/ne2k.h>
11 #include <arch/e1000.h>
12 #include <arch/mptables.h>
13 #include <arch/pci.h>
14 #include <arch/ioapic.h>
15
16 void arch_init()
17 {
18         mptables_parse();
19         pci_init();
20         ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
21                 
22         // TODO: move these back to regular init.  requires fixing the 
23         // __CONFIG_NETWORKING__ inits to not need multiple cores running.
24         // this returns when all other cores are done and ready to receive IPIs
25         #ifdef __CONFIG_SINGLE_CORE__
26                 smp_percpu_init();
27         #else
28                 smp_boot();
29         #endif
30         proc_init();
31
32         /* EXPERIMENTAL NETWORK FUNCTIONALITY
33          * To enable, define __CONFIG_NETWORKING__ in your Makelocal
34          * If enabled, will load the rl8168 driver (if device exists)
35          * and will a boot into userland matrix, so remote syscalls can be performed.
36          * If in simulation, will do some debugging information with the ne2k device
37          *
38          * Note: If you use this, you should also define the mac address of the 
39          * teathered machine via USER_MAC_ADDRESS in Makelocal.
40          *
41          * Additionally, you should have a look at the syscall server in the tools directory
42          */
43         #ifdef __CONFIG_NETWORKING__
44         #ifdef __CONFIG_SINGLE_CORE__
45                 warn("You currently can't have networking if you boot into single core mode!!\n");
46         #else
47                 rl8168_init();          
48                 ne2k_init();
49                 e1000_init();
50         #endif // __CONFIG_SINGLE_CORE__
51         #endif // __CONFIG_NETWORKING__
52 }
53