# HG changeset patch # User lionel auroux # Date 1325966166 -3600 # Node ID ed3247946305f7c3600ff85c6c68df80498d6aff # Parent 7f879b938eade9162bb483d92f89b277ac42aa7e# Parent 8eac832f763dcf7a24f1c1217eef4f9949b7d4cb Merge diff -r 7f879b938ead -r ed3247946305 rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch --- a/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Sat Jan 07 20:46:46 2012 +0100 +++ b/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Sat Jan 07 20:56:06 2012 +0100 @@ -1,10 +1,10 @@ # HG changeset patch -# Parent 873b66890128280637d97a24221258bb297a1ac8 +# Parent 6e00628ccba9fd82577a8a30fe4e730bc982e987 rathaxes: start to implement the PCI registration part in the LKM sample -diff --git a/rathaxes/samples/lkm/CMakeLists.txt b/rathaxes/samples/lkm/CMakeLists.txt ---- a/rathaxes/samples/lkm/CMakeLists.txt -+++ b/rathaxes/samples/lkm/CMakeLists.txt +diff -r 6e00628ccba9 rathaxes/samples/lkm/CMakeLists.txt +--- a/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 19:07:39 2012 +0100 ++++ b/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 19:10:21 2012 +0100 @@ -1,3 +1,7 @@ ADD_RATHAXES_SOURCES(lkm lkm.rtx - RTI log.rti lkm.rti @@ -15,9 +15,9 @@ +# We can't name lkm since it's already used as the target name to generate the +# source (with ADD_RATHAXES_SOURCES). +ADD_RATHAXES_LKM(lkm_hello lkm) -diff --git a/rathaxes/samples/lkm/lkm.blt b/rathaxes/samples/lkm/lkm.blt ---- a/rathaxes/samples/lkm/lkm.blt -+++ b/rathaxes/samples/lkm/lkm.blt +diff -r 6e00628ccba9 rathaxes/samples/lkm/lkm.blt +--- a/rathaxes/samples/lkm/lkm.blt Sat Jan 07 19:07:39 2012 +0100 ++++ b/rathaxes/samples/lkm/lkm.blt Sat Jan 07 19:10:21 2012 +0100 @@ -1,8 +1,10 @@ with LKM { @@ -82,9 +82,9 @@ } } } -diff --git a/rathaxes/samples/lkm/lkm.rti b/rathaxes/samples/lkm/lkm.rti ---- a/rathaxes/samples/lkm/lkm.rti -+++ b/rathaxes/samples/lkm/lkm.rti +diff -r 6e00628ccba9 rathaxes/samples/lkm/lkm.rti +--- a/rathaxes/samples/lkm/lkm.rti Sat Jan 07 19:07:39 2012 +0100 ++++ b/rathaxes/samples/lkm/lkm.rti Sat Jan 07 19:10:21 2012 +0100 @@ -1,8 +1,10 @@ interface LKM { @@ -112,9 +112,9 @@ + provided chunk LKM::code; } } -diff --git a/rathaxes/samples/lkm/lkm.rtx b/rathaxes/samples/lkm/lkm.rtx ---- a/rathaxes/samples/lkm/lkm.rtx -+++ b/rathaxes/samples/lkm/lkm.rtx +diff -r 6e00628ccba9 rathaxes/samples/lkm/lkm.rtx +--- a/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 19:07:39 2012 +0100 ++++ b/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 19:10:21 2012 +0100 @@ -1,19 +1,35 @@ -device LKM use LKM, Log +device LKM use LKM, PCI, Log @@ -152,11 +152,10 @@ + PCI::vendor_id = 0x8086; + PCI::product_id = 0x100f; } -diff --git a/rathaxes/samples/lkm/pci.blt b/rathaxes/samples/lkm/pci.blt -new file mode 100644 ---- /dev/null -+++ b/rathaxes/samples/lkm/pci.blt -@@ -0,0 +1,129 @@ +diff -r 6e00628ccba9 rathaxes/samples/lkm/pci.blt +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/rathaxes/samples/lkm/pci.blt Sat Jan 07 19:10:21 2012 +0100 +@@ -0,0 +1,127 @@ +with PCI, LKM, Log +{ + template type PCI::Device() @@ -206,8 +205,8 @@ + ${PCI::Device} *dev = NULL; + + err = pci_enable_device(pdev); -+// if (err < 0) /* `if' doesn't work */ -+// goto fail; ++ if (err < 0) ++ goto fail; + + ${pointcut ::IMPLEMENTATION}; + @@ -247,7 +246,7 @@ + * CNorm doesn't seem to like "dynamic" arrays (i.e: you always + * have to specify the exact size). + */ -+ static struct pci_device_id rtx_pci_device_table[2] = { ++ static struct pci_device_id rtx_pci_device_table[2] = { + { ${config.vendor_id}, ${config.product_id}, 0, PCI_ANY_ID, PCI_ANY_ID }, + { 0, } + }; @@ -265,16 +264,14 @@ + /* + * So how do we use the return value in the parent context? + */ -+ pci_register_driver(&rtx_pci_driver); -+ /* -+ * if (pci_register_driver(&rtx_pci_driver)) -+ * { -+ * `if' still doesn't work. -+ * -+ * Also, can I call the Log interface from here? -+ * ${Log::info("Message")}; doesn't seem to work. -+ * } -+ */ ++ int error; ++ if ((error = pci_register_driver(&rtx_pci_driver))) ++ { ++ ${Log::info("Cannot register pci driver")}; ++ // should we return here. ++ // error managmement procedure has to be determined ASAP. ++ return error; ++ } + } + } + @@ -286,10 +283,9 @@ + } + } +} -diff --git a/rathaxes/samples/lkm/pci.rti b/rathaxes/samples/lkm/pci.rti -new file mode 100644 ---- /dev/null -+++ b/rathaxes/samples/lkm/pci.rti +diff -r 6e00628ccba9 rathaxes/samples/lkm/pci.rti +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/rathaxes/samples/lkm/pci.rti Sat Jan 07 19:10:21 2012 +0100 @@ -0,0 +1,30 @@ +interface PCI : LKM +{ diff -r 7f879b938ead -r ed3247946305 rathaxes_start_to_implement_sk_buff_in_the_lkm.patch --- a/rathaxes_start_to_implement_sk_buff_in_the_lkm.patch Sat Jan 07 20:46:46 2012 +0100 +++ b/rathaxes_start_to_implement_sk_buff_in_the_lkm.patch Sat Jan 07 20:56:06 2012 +0100 @@ -1,29 +1,132 @@ # HG changeset patch -# Parent c979b95fd7fbc4c38849cf42a458a50d8d2d6901 +# Parent 606e807b8bc7a3a7ea6f1b895bfe909cd7875c2e rathaxes: add sk_buff abstraction and add the implementation of the xmit function for the ethernet system. We have a fully (empty) functionnal ethernet driver -diff -r c979b95fd7fb rathaxes/samples/lkm/CMakeLists.txt ---- a/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 12:15:32 2012 +0100 -+++ b/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 12:46:06 2012 +0100 +diff -r 606e807b8bc7 rathaxes/samples/lkm/CMakeLists.txt +--- a/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 20:02:55 2012 +0100 ++++ b/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 20:48:23 2012 +0100 @@ -1,6 +1,6 @@ ADD_RATHAXES_SOURCES(lkm lkm.rtx - RTI log.rti lkm.rti pci.rti ethernet.rti - BLT log.blt lkm.blt pci.blt ethernet.blt) -+ RTI log.rti lkm.rti pci.rti socket.rti ethernet.rti -+ BLT log.blt lkm.blt pci.blt socket.blt ethernet.blt) ++ RTI log.rti lkm.rti pci.rti socket.rti ethernet.rti e1000.rti ++ BLT log.blt lkm.blt pci.blt socket.blt ethernet.blt e1000.blt) # We can't name lkm since it's already used as the target name to generate the # source (with ADD_RATHAXES_SOURCES). -diff -r c979b95fd7fb rathaxes/samples/lkm/ethernet.blt ---- a/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 12:15:32 2012 +0100 -+++ b/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 12:46:06 2012 +0100 -@@ -1,4 +1,4 @@ --with Ethernet, PCI, LKM -+with Ethernet, Socket, PCI, LKM - { - template type Ethernet::Device() - { -@@ -51,6 +51,24 @@ +diff -r 606e807b8bc7 rathaxes/samples/lkm/e1000.blt +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/rathaxes/samples/lkm/e1000.blt Sat Jan 07 20:48:23 2012 +0100 +@@ -0,0 +1,72 @@ ++with e1000, Ethernet, Socket, PCI, LKM, Log ++{ ++ template type e1000::Context() ++ { ++ chunk LKM::includes() ++ { ++ /* ++ * Force the generation of the structure in the "headers part, we ++ * have to do this since we do not use the structure in this blt ++ * (we hacked a bit and used it in ethernet.blt directly). ++ */ ++ typedef int ${e1000::Context}; /* CNorm __std__ workaround */ ++ ${e1000::Context} force_declaration_in_includes; ++ } ++ ++ chunk ::decl() ++ { ++ struct rtx_e1000_ctx ++ { ++ int bars; ++ unsigned char /* __iomem */ *ioaddr; ++ }; ++ } ++ ++ map ++ { ++ } ++ } ++ ++ template sequence e1000::create() ++ { ++ chunk ::CALL ++ { ++ rtx_ether_ctx->hw_ctx.bars = pci_select_bars(pdev, IORESOURCE_MEM); ++ if (pci_enable_device_mem(pdev)) ++ { ++ ${Log::info("e1000::create: pci_enable_device_mem failed")}; ++ } ++ ++ if (pci_request_selected_regions(pdev, rtx_ether_ctx->hw_ctx.bars, ${config.name})) ++ { ++ ${Log::info("e1000::create: pci_request_selected_regions failed")}; ++ } ++ ++ if (${config.set_master}) ++ { ++ pci_set_master(pdev); ++ } ++ ++ /* 0 here is for BAR_0: */ ++ rtx_ether_ctx->hw_ctx.ioaddr = pci_ioremap_bar(pdev, 0); ++ if (!rtx_ether_ctx->hw_ctx.ioaddr) ++ { ++ ${Log::info("e1000::create: pci_ioremap_bar failed")}; ++ } ++ } ++ } ++ ++ template sequence e1000::destroy() ++ { ++ chunk ::CALL ++ { ++ // XXX: add a check in order to avoid freeing none allocated ++ // resources. ++ struct net_device *net_dev = pci_get_drvdata(pdev); ++ struct rtx_ethernet_dev* rtx_ether_ctx = netdev_priv(net_dev); ++ iounmap(rtx_ether_ctx->hw_ctx.ioaddr); ++ pci_release_selected_regions(pdev, rtx_ether_ctx->hw_ctx.bars); ++ pci_release_region(pdev, 0); ++ } ++ } ++} +diff -r 606e807b8bc7 rathaxes/samples/lkm/e1000.rti +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/rathaxes/samples/lkm/e1000.rti Sat Jan 07 20:48:23 2012 +0100 +@@ -0,0 +1,15 @@ ++interface e1000 : Socket, Ethernet, PCI, LKM ++{ ++ provided type e1000::Context; ++ ++ /* Not sure if we need the argument */ ++ provided sequence e1000::create() ++ { ++ provided chunk ::CALL; ++ } ++ ++ provided sequence e1000::destroy() ++ { ++ provided chunk ::CALL; ++ } ++} +diff -r 606e807b8bc7 rathaxes/samples/lkm/ethernet.blt +--- a/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 20:02:55 2012 +0100 ++++ b/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 20:48:23 2012 +0100 +@@ -18,8 +18,11 @@ + * I think it's useless to use the ${PCI::Device} "abstraction" + * here, since we are already in a Linux specific context here. + */ +- struct pci_dev *pci_dev; +- struct net_device *net_dev; ++ struct pci_dev *pci_dev; ++ struct net_device *net_dev; ++ ++ /* while waiting on issue #8 */ ++ struct rtx_e1000_ctx hw_ctx; + }; + } + +@@ -51,6 +54,24 @@ } } @@ -48,7 +151,7 @@ template sequence Ethernet::close(Ethernet::Device dev) { chunk LKM::prototypes() -@@ -100,7 +118,7 @@ +@@ -100,7 +121,7 @@ { .ndo_open = rtx_ethernet_open, .ndo_stop = rtx_ethernet_close, @@ -57,9 +160,19 @@ }; } -diff -r c979b95fd7fb rathaxes/samples/lkm/ethernet.rti ---- a/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 12:15:32 2012 +0100 -+++ b/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 12:46:06 2012 +0100 +@@ -159,9 +180,6 @@ + { + chunk ::CALL + { +- struct net_device *net_dev; +- +- net_dev = pci_get_drvdata(pdev); // should be ${pdev}, see above + unregister_netdev(net_dev); + /* + * If we had some cleanup todo with struct rtx_ether_ctx we would +diff -r 606e807b8bc7 rathaxes/samples/lkm/ethernet.rti +--- a/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 20:02:55 2012 +0100 ++++ b/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 20:48:23 2012 +0100 @@ -1,4 +1,4 @@ -interface Ethernet : PCI, LKM +interface Ethernet : Socket, PCI, LKM @@ -79,10 +192,10 @@ required sequence Ethernet::close(Ethernet::Device) { provided chunk LKM::prototypes; -diff -r c979b95fd7fb rathaxes/samples/lkm/lkm.rtx ---- a/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 12:15:32 2012 +0100 -+++ b/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 12:46:06 2012 +0100 -@@ -15,6 +15,11 @@ +diff -r 606e807b8bc7 rathaxes/samples/lkm/lkm.rtx +--- a/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 20:02:55 2012 +0100 ++++ b/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 20:48:23 2012 +0100 +@@ -15,15 +15,22 @@ Log::info("Got an interruption"); } @@ -94,9 +207,33 @@ PCI::probe(PCI::Device dev) { Log::info("Probe the device"); -diff -r c979b95fd7fb rathaxes/samples/lkm/socket.blt + Ethernet::init(dev); ++ e1000::create(); + } + + PCI::remove(PCI::Device dev) + { + Log::info("Remove the pci device"); ++ e1000::destroy(); + Ethernet::exit(dev); + } + +@@ -45,10 +52,11 @@ + LKM::name = "hello"; + LKM::author = "Rathaxes"; + LKM::description = "Hello World Loadable Kernel Module (LKM)"; +- LKM::license = "BSD"; ++ LKM::license = "GPL"; + + PCI::vendor_id = 0x8086; + PCI::product_id = 0x100f; ++ PCI::set_master = true; + + Ethernet::ifname = "rtx%d"; + } +diff -r 606e807b8bc7 rathaxes/samples/lkm/socket.blt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/rathaxes/samples/lkm/socket.blt Sat Jan 07 12:46:06 2012 +0100 ++++ b/rathaxes/samples/lkm/socket.blt Sat Jan 07 20:48:23 2012 +0100 @@ -0,0 +1,27 @@ +with Socket, LKM +{ @@ -125,9 +262,9 @@ + } + } +} -diff -r c979b95fd7fb rathaxes/samples/lkm/socket.rti +diff -r 606e807b8bc7 rathaxes/samples/lkm/socket.rti --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/rathaxes/samples/lkm/socket.rti Sat Jan 07 12:46:06 2012 +0100 ++++ b/rathaxes/samples/lkm/socket.rti Sat Jan 07 20:48:23 2012 +0100 @@ -0,0 +1,4 @@ +interface Socket : LKM +{ diff -r 7f879b938ead -r ed3247946305 rathaxes_start_to_implement_the_ethernet_subsystem_in_the_lkm.patch --- a/rathaxes_start_to_implement_the_ethernet_subsystem_in_the_lkm.patch Sat Jan 07 20:46:46 2012 +0100 +++ b/rathaxes_start_to_implement_the_ethernet_subsystem_in_the_lkm.patch Sat Jan 07 20:56:06 2012 +0100 @@ -1,10 +1,10 @@ # HG changeset patch -# Parent 5c8a128a8804aa592e3ccc74e86e109d0b577896 +# Parent 53c073d05449cc4cd6130bd79eb02c07239dd8d8 rathaxes: start to implement the Ethernet subsystem in linux LKM sample -diff -r 5c8a128a8804 rathaxes/samples/lkm/CMakeLists.txt ---- a/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 11:23:27 2012 +0100 -+++ b/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 12:15:32 2012 +0100 +diff -r 53c073d05449 rathaxes/samples/lkm/CMakeLists.txt +--- a/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 19:10:21 2012 +0100 ++++ b/rathaxes/samples/lkm/CMakeLists.txt Sat Jan 07 19:18:24 2012 +0100 @@ -1,6 +1,6 @@ ADD_RATHAXES_SOURCES(lkm lkm.rtx - RTI log.rti lkm.rti pci.rti @@ -14,11 +14,11 @@ # We can't name lkm since it's already used as the target name to generate the # source (with ADD_RATHAXES_SOURCES). -diff -r 5c8a128a8804 rathaxes/samples/lkm/ethernet.blt +diff -r 53c073d05449 rathaxes/samples/lkm/ethernet.blt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 12:15:32 2012 +0100 -@@ -0,0 +1,164 @@ -+with Ethernet, PCI, LKM ++++ b/rathaxes/samples/lkm/ethernet.blt Sat Jan 07 19:18:24 2012 +0100 +@@ -0,0 +1,173 @@ ++with Ethernet, PCI, LKM, Log +{ + template type Ethernet::Device() + { @@ -133,10 +133,16 @@ + typedef int ${Ethernet::Device}; + ${Ethernet::Device} *rtx_ether_ctx; + struct net_device *net_dev; ++ int error; + ++ error = 0; + net_dev = alloc_etherdev(sizeof(*rtx_ether_ctx)); -+ //if (net_dev == NULL) -+ // How should we raise the error in the parent context? ++ if (net_dev == 0) ++ { ++ ${Log::info("Cannot allocate memory")}; ++ // is it the thing to do? ++ return -ENOMEM; ++ } + strlcpy(net_dev->name, ${config.ifname}, sizeof(net_dev->name)); + net_dev->irq = pdev->irq; + // Maybe we should try ${rtx_ether_ctx.init()} here: @@ -156,9 +162,12 @@ + //SET_NETDEV_DEV(net_dev, &${pdev}->dev); + SET_NETDEV_DEV(net_dev, &pdev->dev); + net_dev->netdev_ops = &rtx_ether_ops; -+ -+ /* if (*/register_netdev(net_dev);/*)*/ -+ // Handle the error ++ if ((error = register_netdev(net_dev))) ++ { ++ ${Log::info("Cannot register the driver")}; ++ // is it the thing to do? ++ return error; ++ } + + /* same problem as above with ${pdev} */ + //pci_set_drvdata(${pdev}, net_dev); @@ -182,9 +191,9 @@ + } + } +} -diff -r 5c8a128a8804 rathaxes/samples/lkm/ethernet.rti +diff -r 53c073d05449 rathaxes/samples/lkm/ethernet.rti --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 12:15:32 2012 +0100 ++++ b/rathaxes/samples/lkm/ethernet.rti Sat Jan 07 19:18:24 2012 +0100 @@ -0,0 +1,37 @@ +interface Ethernet : PCI, LKM +{ @@ -223,9 +232,9 @@ + provided chunk ::CALL; + } +} -diff -r 5c8a128a8804 rathaxes/samples/lkm/lkm.rtx ---- a/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 11:23:27 2012 +0100 -+++ b/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 12:15:32 2012 +0100 +diff -r 53c073d05449 rathaxes/samples/lkm/lkm.rtx +--- a/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 19:10:21 2012 +0100 ++++ b/rathaxes/samples/lkm/lkm.rtx Sat Jan 07 19:18:24 2012 +0100 @@ -1,13 +1,30 @@ device LKM use LKM, PCI, Log { @@ -266,9 +275,9 @@ + + Ethernet::ifname = "rtx%d"; } -diff -r 5c8a128a8804 rathaxes/samples/lkm/pci.blt ---- a/rathaxes/samples/lkm/pci.blt Sat Jan 07 11:23:27 2012 +0100 -+++ b/rathaxes/samples/lkm/pci.blt Sat Jan 07 12:15:32 2012 +0100 +diff -r 53c073d05449 rathaxes/samples/lkm/pci.blt +--- a/rathaxes/samples/lkm/pci.blt Sat Jan 07 19:10:21 2012 +0100 ++++ b/rathaxes/samples/lkm/pci.blt Sat Jan 07 19:18:24 2012 +0100 @@ -11,15 +11,12 @@ chunk ::decl() @@ -317,7 +326,7 @@ - ${PCI::Device} *dev = NULL; err = pci_enable_device(pdev); - // if (err < 0) /* `if' doesn't work */ + if (err < 0) @@ -52,8 +55,6 @@ ${pointcut ::IMPLEMENTATION}; @@ -348,17 +357,12 @@ } } } -@@ -88,9 +89,10 @@ - * CNorm doesn't seem to like "dynamic" arrays (i.e: you always +@@ -89,7 +90,7 @@ * have to specify the exact size). */ -- static struct pci_device_id rtx_pci_device_table[2] = { + static struct pci_device_id rtx_pci_device_table[2] = { - { ${config.vendor_id}, ${config.product_id}, 0, PCI_ANY_ID, PCI_ANY_ID }, -- { 0, } -+ static struct pci_device_id rtx_pci_device_table[2] = -+ { + { ${config.vendor_id}, ${config.product_id}, PCI_ANY_ID, PCI_ANY_ID }, -+ { 0, } /* Doesn't work with just { } */ + { 0, } }; - static struct pci_driver rtx_pci_driver = {