summaryrefslogtreecommitdiff
path: root/driver/e1000.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/e1000.c')
-rw-r--r--driver/e1000.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/driver/e1000.c b/driver/e1000.c
index 35e106e..4c6b8de 100644
--- a/driver/e1000.c
+++ b/driver/e1000.c
@@ -5,9 +5,14 @@
//registers etc. verified from pdf at https://pdos.csail.mit.edu/6.828/2006/readings/hardware/8254x_GBe_SDM.pdf
#include <stdint.h>
+
#include "log.h"
#include "e1000.h"
#include "kmalloc.h"
+#include "netdev.h"
+#include "arp.h"
+
+#include "lib/string/string.h"
#define REG_CTRL 0x0000 // device control R/W
#define REG_CTRL_LRST 1<<3 // Link Reset / transition to 0 to initiates auto-negotiation
@@ -130,6 +135,10 @@
#define E1000_NUM_RX_DESC 32
#define E1000_NUM_TX_DESC 8
+// TODO: move all global stuff to some struct so we can run multiple e1000 cards!
+//
+struct netdev dev; ///TODO not global!
+
struct e1000_rx_desc {
volatile uint32_t addr_lo; // 4
volatile uint32_t addr_hi; // 4
@@ -413,6 +422,7 @@ void e1000_handleReceive()
uint16_t len = rx_descs[rx_cur]->length;
// Here you should inject the received packet into your network stack
+ arp_incoming(&dev,buf);
rx_descs[rx_cur]->status = 0;
old_cur = rx_cur;
@@ -472,8 +482,11 @@ void e1000_linkdown()
}
-bool e1000_init(uint32_t base)
+struct netdev e1000_init(uint32_t base)
{
+ dev.ip=0;
+ dev.hwaddr[0]=dev.hwaddr[1]=dev.hwaddr[2]=dev.hwaddr[3]=dev.hwaddr[4]=dev.hwaddr[5]=0;
+
klog("init E1000");
klog("interrupt mask: 0x%08X",readCommand(REG_IMS));
klog("device status: 0x%08X",readCommand(REG_STATUS));
@@ -485,10 +498,14 @@ bool e1000_init(uint32_t base)
if(base!=0){ mem_base=base;}
detectEEProm();
- if (! readMACAddress()) return false;
+ if (! readMACAddress()) return dev;
klog("mac : %02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],mac[6]);
+ memcpy(dev.hwaddr,mac,6); // use mac obtained from device
+ dev.ip=(192<<0)+(168<<8)+(0<<16)+(20<<24); // 192.168.0.20 // TODO: not hardcode!
+ dev.transmit=e1000_sendPacket;
+
// clear multicast table
for(int i = 0; i < 0x80; i++)writeCommand(REG_MTA + i*4, 0);
@@ -498,10 +515,10 @@ bool e1000_init(uint32_t base)
txinit();
rxinit();
-
+
klog("E1000 initialized");
- return true;
+ return dev;
}
void e1000_irq (int irq)
{