Mercurial > archived > louis > epitech > mq > rathaxes
diff rathaxes_e1000_move_the_interrupt_init_and_cleanup_into_ethernet.patch @ 104:c4c33ac02b93
First try at splitting the type nightmare and the refactoring
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Fri, 22 Mar 2013 00:06:00 -0700 |
parents | |
children | fb20f01ea997 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rathaxes_e1000_move_the_interrupt_init_and_cleanup_into_ethernet.patch Fri Mar 22 00:06:00 2013 -0700 @@ -0,0 +1,266 @@ +# HG changeset patch +# Parent 68c4f142af579e558314cdeebd091fc5abd62014 + +diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt +--- a/rathaxes/samples/e1000/e1000.blt ++++ b/rathaxes/samples/e1000/e1000.blt +@@ -249,7 +249,6 @@ + { + int bars; + unsigned char /* __iomem */ *ioaddr; +- int irq; + + ${e1000::RxRing} rx_ring; + ${e1000::TxRing} tx_ring; +@@ -267,14 +266,12 @@ + + chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx, + Builtin::number bars, +- Builtin::symbol ioaddr, +- Builtin::number irq) ++ Builtin::symbol ioaddr) + { + { + ${e1000::Context} *hw_ctx = &${rtx_ether_ctx}->hw_ctx; + hw_ctx->bars = ${bars}; + hw_ctx->ioaddr = ${ioaddr}; +- hw_ctx->irq = ${irq}; + } + } + +@@ -606,68 +603,6 @@ + } + } + +- template sequence e1000::setup_interrupt_handler(Ethernet::Device rtx_ether_ctx) +- { +- chunk LKM::includes() +- { +- #include <linux/interrupt.h> +- } +- +- chunk LKM::prototypes() +- { +- static int e1000_setup_interrupt_handler(${Ethernet::Device} *); +- } +- +- chunk LKM::code() +- { +- static int e1000_setup_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx) +- { +- int error; +- +- error = request_irq(rtx_ether_ctx->hw_ctx.irq, +- rtx_ethernet_interrupt_handler, +- IRQF_SHARED, +- ${config.name}, +- rtx_ether_ctx); +- +- if (error) +- ${Log::info("cannot register the interrupt handler")}; +- +- return error; +- } +- } +- +- chunk ::CALL() +- { +- int error = e1000_setup_interrupt_handler(${rtx_ether_ctx}); +- if (error) +- { +- return error; +- } +- } +- } +- +- template sequence free_interrupt_handler(Ethernet::Device rtx_ether_ctx) +- { +- chunk prototypes() +- { +- static void e1000_free_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx); +- } +- +- chunk code() +- { +- static void e1000_free_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx) +- { +- free_irq(rtx_ether_ctx->hw_ctx.irq, rtx_ether_ctx); +- } +- } +- +- chunk ::CALL() +- { +- e1000_free_interrupt_handler(${rtx_ether_ctx}); +- } +- } +- + template sequence activate_device_interruption(Ethernet::Device rtx_ether_ctx) + { + chunk ::CALL() +diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti +--- a/rathaxes/samples/e1000/e1000.rti ++++ b/rathaxes/samples/e1000/e1000.rti +@@ -13,8 +13,7 @@ + /* Callbacks/Hooks which should probably be in the front-end: */ + chunk Ethernet::adapter_init_context(Ethernet::Device, + Builtin::number, +- Builtin::symbol, +- Builtin::number); ++ Builtin::symbol); + chunk Ethernet::adapter_reset(Ethernet::Device); + chunk Ethernet::adapter_load_mac_address(Ethernet::Device); + } +@@ -85,21 +84,6 @@ + provided chunk ::CALL(); + } + +- provided sequence setup_interrupt_handler(Ethernet::Device) +- { +- provided chunk LKM::includes(); // works without this one +- provided chunk LKM::prototypes(); +- provided chunk LKM::code(); +- provided chunk ::CALL(); +- } +- +- provided sequence free_interrupt_handler(Ethernet::Device) +- { +- provided chunk LKM::prototypes(); +- provided chunk LKM::code(); +- provided chunk ::CALL(); +- } +- + provided sequence activate_device_interruption(Ethernet::Device) + { + provided chunk ::CALL(); +diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt +--- a/rathaxes/samples/e1000/ethernet.blt ++++ b/rathaxes/samples/e1000/ethernet.blt +@@ -1,4 +1,4 @@ +-with Ethernet, PCI, LKM, Log ++with Ethernet, PCI, LKM, Log, Builtin + { + template type Ethernet::ProtocolId() + { +@@ -111,6 +111,11 @@ + + template sequence Ethernet::open(Ethernet::Device dev) + { ++ chunk LKM::includes() ++ { ++ #include <linux/interrupt.h> ++ } ++ + chunk LKM::prototypes() + { + static int rtx_ethernet_open(struct net_device *); +@@ -123,9 +128,28 @@ + ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev); + + ${cast local.rtx_ether_ctx as Ethernet::Device}; ++ ++ int error; ++ { ++ ${Log::info("installing the interrupt handler")}; ++ } ++ error = request_irq(${local.rtx_ether_ctx.irq}, ++ rtx_ethernet_interrupt_handler, ++ IRQF_SHARED, ++ ${config.name}, ++ ${local.rtx_net_dev.k_net_dev}); ++ if (error) ++ { ++ ${Log::info("Cannot register the interrupt handler")}; ++ goto error; ++ } ++ + ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; + + return 0; ++ ++ error: ++ return error; + } + } + } +@@ -165,7 +189,16 @@ + ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev); + + ${cast local.rtx_ether_ctx as Ethernet::Device}; +- ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; ++ ++ /* TODO: change this pointcut into a pointcut/adapter/callback: */ ++ { ++ ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; ++ } ++ ++ free_irq(${local.rtx_ether_ctx.irq}, ${local.rtx_net_dev.k_net_dev}); ++ { ++ ${Log::info("interrupt handler free'ed")}; ++ } + + return 0; + } +@@ -267,14 +300,11 @@ + */ + int bars = ${rtx_pci_dev.bars}; + unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr}; +- int irq = ${rtx_pci_dev.irq}; + ${cast local.bars as Builtin::number}; +- ${cast local.irq as Builtin::number}; + ${cast local.rtx_ether_ctx as Ethernet::Device}; + ${pointcut Ethernet::adapter_init_context(local.rtx_ether_ctx, + local.bars, +- local.ioaddr, +- local.irq)}; ++ local.ioaddr)}; + ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)}; + ${pointcut Ethernet::adapter_load_mac_address(local.rtx_ether_ctx)}; + memcpy(${local.rtx_ether_ctx.perm_addr}, +diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti +--- a/rathaxes/samples/e1000/ethernet.rti ++++ b/rathaxes/samples/e1000/ethernet.rti +@@ -40,6 +40,7 @@ + + required sequence open(Ethernet::Device) + { ++ provided chunk LKM::includes(); + provided chunk LKM::prototypes(); + provided chunk LKM::code(); + } +@@ -69,8 +70,7 @@ + + provided pointcut Ethernet::adapter_init_context(Ethernet::Device, + Builtin::number, +- Builtin::symbol, +- Builtin::number); ++ Builtin::symbol); + provided pointcut Ethernet::adapter_reset(Ethernet::Device); + provided pointcut Ethernet::adapter_load_mac_address(Ethernet::Device); + } +diff --git a/rathaxes/samples/e1000/lkm.rtx b/rathaxes/samples/e1000/lkm.rtx +--- a/rathaxes/samples/e1000/lkm.rtx ++++ b/rathaxes/samples/e1000/lkm.rtx +@@ -4,13 +4,6 @@ + { + Log::info("opening the device"); + +- /* +- * Maybe e1000::create_device should be called from here, to be +- * more coherent. +- */ +- +- e1000::setup_interrupt_handler(dev); +- Log::info("interrupt handler installed"); + + e1000::set_up_device(dev); + Log::info("device activated"); +@@ -32,9 +25,6 @@ + */ + e1000::free_rx_tx(dev); + Log::info("free'ed up rx/tx resources"); +- +- e1000::free_interrupt_handler(dev); +- Log::info("interrupt handler free'ed"); + } + + Ethernet::interrupt_handler(Ethernet::Device dev)