# HG changeset patch # User Louis Opter # Date 1326037778 -3600 # Node ID 87704b867fb065e95d6d8f10da1b575630518a05 # Parent 0ff39df29c46939a724b9e98b348b9e133fdbdb1 First attempt at loading the mac address diff -r 0ff39df29c46 -r 87704b867fb0 rathaxes_add_lkm_ethernet_sample.patch --- a/rathaxes_add_lkm_ethernet_sample.patch Sun Jan 08 15:52:18 2012 +0100 +++ b/rathaxes_add_lkm_ethernet_sample.patch Sun Jan 08 16:49:38 2012 +0100 @@ -37,7 +37,7 @@ new file mode 100644 --- /dev/null +++ b/rathaxes/samples/lkm/e1000.blt -@@ -0,0 +1,267 @@ +@@ -0,0 +1,284 @@ +with e1000, Ethernet, Socket, PCI, LKM, Log +{ + template type e1000::Context() @@ -189,12 +189,29 @@ + ${Log::info("e1000::create: pci_ioremap_bar failed")}; + } + ++ /* Reset the card */ + rtx_e1000_print_status(&rtx_ether_ctx->hw_ctx); -+ /* Reset the card */ -+ rtx_e1000_register_write32(&rtx_ether_ctx->hw_ctx, E1000_CTRL, E1000_CMD_RST); -+ rtx_e1000_print_status(&rtx_ether_ctx->hw_ctx); ++ udelay(10); + + /* Now we can load its mac address */ ++ int i = 0; ++ for (i = 0 /* < this is not generated! */; i < 3; ++i) ++ { ++ rtx_e1000_register_write32(&rtx_ether_ctx->hw_ctx, E1000_EEPROM_READ, (i << 8) | 1); ++ ++ int value; ++ /* Should be a do { } while(); but the compiler doesn't do { } while(); yet. */ ++ value = rtx_e1000_register_read32(&rtx_ether_ctx->hw_ctx, E1000_EEPROM_READ); ++ while ((value & (1 << 4)) == 0) ++ value = rtx_e1000_register_read32(&rtx_ether_ctx->hw_ctx, E1000_EEPROM_READ); ++ ++ rtx_ether_ctx->net_dev->dev_addr[i * 2] = value & 0xff; ++ rtx_ether_ctx->net_dev->dev_addr[i * 2 + 1] = (value >> 8) & 0xff; ++ } ++ ++ memcpy(rtx_ether_ctx->net_dev->perm_addr, ++ rtx_ether_ctx->net_dev->dev_addr, ++ rtx_ether_ctx->net_dev->addr_len); + } + + chunk ::CALL