annotate rathaxes_trying_to_fix_the_abstract_type_nightmare_in_e1000.patch @ 103:d9af98faac8a

Wip on abstract type nightmare
author Louis Opter <louis@lse.epita.fr>
date Tue, 19 Mar 2013 23:16:02 -0700
parents 8e8aa342078b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
1 # HG changeset patch
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
2 # Parent 7a2c9e5880145d2d42cd5bc01dbc2b6e96689934
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
3
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
4 diff --git a/rathaxes/samples/e1000/device.blt b/rathaxes/samples/e1000/device.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
5 --- a/rathaxes/samples/e1000/device.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
6 +++ b/rathaxes/samples/e1000/device.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
7 @@ -18,7 +18,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
8
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
9 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
10 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
11 - data: ${self}->data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
12 + k_device: ((struct device *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
13 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
14 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
15 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
16 diff --git a/rathaxes/samples/e1000/device.rti b/rathaxes/samples/e1000/device.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
17 --- a/rathaxes/samples/e1000/device.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
18 +++ b/rathaxes/samples/e1000/device.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
19 @@ -5,6 +5,6 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
20 decl data_types();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
21 chunk LKM::includes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
22 method init();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
23 - attribute Builtin::symbol data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
24 + attribute Builtin::symbol k_device;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
25 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
26 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
27 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
28 --- a/rathaxes/samples/e1000/e1000.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
29 +++ b/rathaxes/samples/e1000/e1000.blt
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
30 @@ -171,13 +171,17 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
31
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
32 static int rtx_e1000_tx_ring_tso_cksum_offload(${e1000::TxRing} *self, ${Socket::SKBuff} *skb)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
33 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
34 - ${Socket::AbstractSKBuff} *abs_skb = skb->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
35 - ${cast local.abs_skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
36 - return skb_is_gso(&${local.abs_skb.data}) || ${local.abs_skb.data}.ip_summed == CHECKSUM_PARTIAL;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
37 + /* XXX We can't use ${skb} here because it's a pointer */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
38 + ${Socket::AbstractSKBuff} *k_skb = skb->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
39 + ${cast local.k_skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
40 + return skb_is_gso(${local.k_skb.k_sk_buff}) || ${local.k_skb.k_sk_buff}->ip_summed == CHECKSUM_PARTIAL;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
41 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
42
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
43 static void rtx_e1000_tx_ring_put(${e1000::TxRing} *self, ${Socket::SKBuff} *skb)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
44 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
45 + /* XXX We can't use ${skb} here because it's a pointer */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
46 + ${Socket::AbstractSKBuff} *k_skb = skb->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
47 + ${cast local.k_skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
48 WARN_ON(!skb);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
49
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
50 /*
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
51 @@ -188,17 +192,15 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
52 * code shouldn't be aware of it and use something more
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
53 * abstract.
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
54 */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
55 - ${Socket::AbstractSKBuff} *abs_skb = skb->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
56 - ${cast local.abs_skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
57 ${e1000::TxDescriptor} *tx_desc = &self->base[self->tail];
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
58 tx_desc->lower.data = cpu_to_le32(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
59 E1000_TXD_CMD_EOP |
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
60 E1000_TXD_CMD_IFCS |
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
61 E1000_TXD_CMD_RS |
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
62 - skb_headlen(&${local.abs_skb.data}));
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
63 + skb_headlen(${local.k_skb.k_sk_buff}));
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
64 tx_desc->upper.data = 0;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
65 tx_desc->buff_addr = cpu_to_le64(skb->dma_handle);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
66 - memcpy(&self->skbuffs[self->tail], skb, sizeof(*skb));
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
67 + memcpy(&self->skbuffs[self->tail], ${local.k_skb.k_sk_buff}, sizeof(*${local.k_skb.k_sk_buff}));
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
68 self->tail = (self->tail + 1) % ${config.tx_ring_size};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
69 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
70
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
71 @@ -249,7 +251,6 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
72 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
73 int bars;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
74 unsigned char /* __iomem */ *ioaddr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
75 - int irq;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
76
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
77 ${e1000::RxRing} rx_ring;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
78 ${e1000::TxRing} tx_ring;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
79 @@ -267,14 +268,12 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
80
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
81 chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
82 Builtin::number bars,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
83 - Builtin::symbol ioaddr,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
84 - Builtin::number irq)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
85 + Builtin::symbol ioaddr)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
86 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
87 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
88 ${e1000::Context} *hw_ctx = &${rtx_ether_ctx}->hw_ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
89 hw_ctx->bars = ${bars};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
90 hw_ctx->ioaddr = ${ioaddr};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
91 - hw_ctx->irq = ${irq};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
92 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
93 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
94
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
95 @@ -606,68 +605,6 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
96 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
97 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
98
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
99 - template sequence e1000::setup_interrupt_handler(Ethernet::Device rtx_ether_ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
100 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
101 - chunk LKM::includes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
102 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
103 - #include <linux/interrupt.h>
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
104 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
105 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
106 - chunk LKM::prototypes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
107 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
108 - static int e1000_setup_interrupt_handler(${Ethernet::Device} *);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
109 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
110 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
111 - chunk LKM::code()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
112 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
113 - static int e1000_setup_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
114 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
115 - int error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
116 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
117 - error = request_irq(rtx_ether_ctx->hw_ctx.irq,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
118 - rtx_ethernet_interrupt_handler,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
119 - IRQF_SHARED,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
120 - ${config.name},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
121 - rtx_ether_ctx);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
122 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
123 - if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
124 - ${Log::info("cannot register the interrupt handler")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
125 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
126 - return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
127 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
128 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
129 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
130 - chunk ::CALL()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
131 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
132 - int error = e1000_setup_interrupt_handler(${rtx_ether_ctx});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
133 - if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
134 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
135 - return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
136 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
137 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
138 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
139 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
140 - template sequence free_interrupt_handler(Ethernet::Device rtx_ether_ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
141 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
142 - chunk prototypes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
143 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
144 - static void e1000_free_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
145 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
146 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
147 - chunk code()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
148 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
149 - static void e1000_free_interrupt_handler(${Ethernet::Device} *rtx_ether_ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
150 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
151 - free_irq(rtx_ether_ctx->hw_ctx.irq, rtx_ether_ctx);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
152 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
153 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
154 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
155 - chunk ::CALL()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
156 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
157 - e1000_free_interrupt_handler(${rtx_ether_ctx});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
158 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
159 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
160 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
161 template sequence activate_device_interruption(Ethernet::Device rtx_ether_ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
162 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
163 chunk ::CALL()
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
164 @@ -798,7 +735,7 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
165 hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
166 hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
167 hw_ctx->rx_ring.base = dma_alloc_coherent(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
168 - &${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
169 + ${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
170 hw_ctx->rx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
171 &hw_ctx->rx_ring.dma_base,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
172 GFP_KERNEL);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
173 @@ -816,12 +753,10 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
174 * Allocate the skbuffs, map them for DMA, and write their address
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
175 * in the corresponding descriptor.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
176 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
177 - ${Ethernet::AbstractDevice} *rtx_ether_dev = ${rtx_ether_ctx.net_device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
178 - ${cast local.rtx_ether_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
179 for (i = 0; i != ${config.rx_ring_size}; ++i)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
180 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
181 - hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*) netdev_alloc_skb(
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
182 - &${rtx_ether_dev.netdev},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
183 + hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*)netdev_alloc_skb(
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
184 + ${rtx_ether_ctx.net_device.k_net_dev}, /* XXX: .k_net_dev isn't expanded here */
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
185 ${config.rx_buffer_len});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
186 if (!hw_ctx->rx_ring.skbuffs[i].skbuff)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
187 {
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
188 @@ -829,11 +764,11 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
189 goto err_skbuffs_alloc;
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
190 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
191 hw_ctx->rx_ring.skbuffs[i].dma_handle = dma_map_single(
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
192 - &${rtx_ether_ctx.device},
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
193 - &hw_ctx->rx_ring.skbuffs[i].skbuff->data,
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
194 + ${rtx_ether_ctx.device},
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
195 + (struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff, /* XXX leaking cast */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
196 ${config.rx_buffer_len},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
197 DMA_FROM_DEVICE);
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
198 - int dma_error = dma_mapping_error(&${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
199 + int dma_error = dma_mapping_error(${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
200 hw_ctx->rx_ring.skbuffs[i].dma_handle);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
201 if (dma_error)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
202 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
203 @@ -885,7 +820,7 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
204 hw_ctx->tx_ring.size = ${config.tx_ring_size} * sizeof(*hw_ctx->tx_ring.base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
205 hw_ctx->tx_ring.size = ALIGN(hw_ctx->tx_ring.size, 4096);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
206 hw_ctx->tx_ring.base = dma_alloc_coherent(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
207 - &${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
208 + ${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
209 hw_ctx->tx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
210 &hw_ctx->tx_ring.dma_base,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
211 GFP_KERNEL);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
212 @@ -928,15 +863,16 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
213 while (i--)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
214 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
215 dma_unmap_single(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
216 - &${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
217 + ${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
218 hw_ctx->rx_ring.skbuffs[i].dma_handle,
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
219 ${config.rx_buffer_len},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
220 DMA_FROM_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
221 err_skbuffs_map:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
222 - dev_kfree_skb(&hw_ctx->rx_ring.skbuffs[i].skbuff->data);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
223 + /* XXX leaking cast: */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
224 + dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
225 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
226
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
227 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
228 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
229 hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
230 err_rx_ring_alloc:
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
231 return -ENOMEM;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
232 @@ -954,8 +890,13 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
233 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
234 chunk ::CALL()
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
235 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
236 - ${e1000::Context} *hw_ctx;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
237 - hw_ctx = &${rtx_ether_ctx}->hw_ctx;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
238 + /*
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
239 + * XXX: Not generated if named "hw_ctx" (which is funny because
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
240 + * it's used and works in the template right above this one):
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
241 + */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
242 + ${e1000::Context} *hw_ctx_;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
243 + ${cast local.hw_ctx_ as e1000::Context};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
244 + hw_ctx_ = &${rtx_ether_ctx}->hw_ctx;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
245
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
246 /*
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
247 * Free the rx ring:
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
248 @@ -965,22 +906,23 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
249 for (int i = 0; i != ${config.rx_ring_size}; ++i)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
250 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
251 dma_unmap_single(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
252 - &${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
253 - (dma_addr_t)hw_ctx->rx_ring.skbuffs[i].dma_handle,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
254 + ${rtx_ether_ctx.device},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
255 + (dma_addr_t)hw_ctx_->rx_ring.skbuffs[i].dma_handle,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
256 ${config.rx_buffer_len},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
257 DMA_FROM_DEVICE);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
258 - dev_kfree_skb(&hw_ctx->rx_ring.skbuffs[i].skbuff->data);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
259 + /* XXX Go through the rtx types (Socket::SKBuff, AbstractSKBuff) */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
260 + dev_kfree_skb(hw_ctx_->rx_ring.skbuffs[i].skbuff);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
261 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
262 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
263 - hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
264 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->rx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
265 + hw_ctx_->rx_ring.base, hw_ctx_->rx_ring.dma_base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
266 ${Log::info("free_rx_tx: rx ring free'ed")};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
267
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
268 /*
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
269 * Free the tx ring:
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
270 * - Free the descriptors array.
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
271 */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
272 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->tx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
273 - hw_ctx->tx_ring.base, hw_ctx->tx_ring.dma_base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
274 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->tx_ring.size,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
275 + hw_ctx_->tx_ring.base, hw_ctx_->tx_ring.dma_base);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
276 ${Log::info("free_rx_tx: tx ring free'ed")};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
277 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
278 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
279 @@ -1038,13 +980,13 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
280 ${local.skb.init(kernel_skb)};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
281 hw_ctx = &${rtx_ether_ctx}->hw_ctx;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
282 tx_ring = &hw_ctx->tx_ring;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
283 - devp = (${Device::AbstractDevice}*) &${rtx_ether_ctx.device};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
284 + devp = (${Device::AbstractDevice}*)${rtx_ether_ctx.device};
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
285
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
286 ${Log::info("xmit: skbuff details:")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
287 /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
288 - * skb is not expand on the bound C variable (should be rtx_skbuff),
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
289 - * which is funny because it works for the sequence template call
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
290 - * right after.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
291 + * skb does not expand on the bound C variable (should be
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
292 + * rtx_skbuff), which is funny because it works for the
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
293 + * sequence template call right after.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
294 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
295 /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
296 * XXX: doesn't work (I tried to pass self explicitely too):
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
297 @@ -1077,8 +1019,8 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
298
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
299 /* 2. Map the data */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
300
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
301 - /* XXX: ${local.skb.map_to(local.devp)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
302 - if (rtx_socket_skbuff_map(&skb, &${devp.data}, DMA_TO_DEVICE))
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
303 + /* XXX: ${local.skb.map_to(devp.k_device)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
304 + if (rtx_socket_skbuff_map(&skb, ${devp.k_device}, DMA_TO_DEVICE))
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
305 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
306 ${Log::info("xmit: can't DMA map a SKbuff")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
307 goto err_skb_map_to;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
308 @@ -1097,7 +1039,7 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
309 err_offload:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
310 err_skb_map_to:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
311 /* XXX: ${local.skb.unmap_to_and_free(local.dev)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
312 - rtx_socket_skbuff_unmap_and_free(&skb, &${devp.data}, DMA_TO_DEVICE);
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
313 + rtx_socket_skbuff_unmap_and_free(&skb, ${devp.k_device}, DMA_TO_DEVICE);
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
314 return NETDEV_TX_OK;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
315 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
316 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
317 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
318 --- a/rathaxes/samples/e1000/e1000.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
319 +++ b/rathaxes/samples/e1000/e1000.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
320 @@ -13,8 +13,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
321 /* Callbacks/Hooks which should probably be in the front-end: */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
322 chunk Ethernet::adapter_init_context(Ethernet::Device,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
323 Builtin::number,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
324 - Builtin::symbol,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
325 - Builtin::number);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
326 + Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
327 chunk Ethernet::adapter_reset(Ethernet::Device);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
328 chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
329 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
330 @@ -85,21 +84,6 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
331 provided chunk ::CALL();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
332 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
333
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
334 - provided sequence setup_interrupt_handler(Ethernet::Device)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
335 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
336 - provided chunk LKM::includes(); // works without this one
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
337 - provided chunk LKM::prototypes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
338 - provided chunk LKM::code();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
339 - provided chunk ::CALL();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
340 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
341 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
342 - provided sequence free_interrupt_handler(Ethernet::Device)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
343 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
344 - provided chunk LKM::prototypes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
345 - provided chunk LKM::code();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
346 - provided chunk ::CALL();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
347 - }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
348 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
349 provided sequence activate_device_interruption(Ethernet::Device)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
350 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
351 provided chunk ::CALL();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
352 diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
353 --- a/rathaxes/samples/e1000/ethernet.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
354 +++ b/rathaxes/samples/e1000/ethernet.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
355 @@ -1,4 +1,4 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
356 -with Ethernet, PCI, LKM, Log
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
357 +with Ethernet, PCI, LKM, Log, Builtin
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
358 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
359 template type Ethernet::ProtocolId()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
360 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
361 @@ -51,7 +51,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
362 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
363 decl data_types()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
364 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
365 - struct net_device ndev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
366 + struct net_device data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
367 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
368
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
369 chunk LKM::includes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
370 @@ -59,9 +59,15 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
371 #include <linux/netdevice.h>
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
372 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
373
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
374 + method init(Builtin::symbol dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
375 + {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
376 + ${self} = (${Ethernet::AbstractDevice} *)${dev};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
377 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
378 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
379 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
380 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
381 - netdev: ${self}->ndev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
382 + k_net_dev: ((struct net_device *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
383 + rtx_ether_ctx: netdev_priv((struct net_device *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
384 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
385 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
386
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
387 @@ -88,29 +94,43 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
388 #include <linux/etherdevice.h>
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
389 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
390
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
391 - method init(Ethernet::AbstractDevice net_dev, PCI::AbstractDevice pci_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
392 + /* XXX: if the first arg is not called rtx_net_dev, it breaks. */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
393 + method init(Ethernet::AbstractDevice rtx_net_dev, PCI::AbstractDevice pci_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
394 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
395 - ${self} = netdev_priv(&${net_dev.netdev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
396 + ${self} = ${rtx_net_dev.rtx_ether_ctx};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
397 /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
398 * We can use -> because we know that ${self} will be always a
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
399 * pointer, but the ambiguity sucks.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
400 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
401 ${self}->pci_dev = ${pci_dev};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
402 - ${self}->net_dev = ${net_dev};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
403 + ${self}->net_dev = ${rtx_net_dev};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
404 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
405
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
406 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
407 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
408 - device: ${self}->pci_dev->data.dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
409 + /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
410 + * XXX: I'd like to be able to do things like:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
411 + * device: ${self.pci_dev.k_pci_dev}->dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
412 + *
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
413 + * Also, using ${PCI::AbstractDevice} instead of directly struct
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
414 + * pci_dev doesn't work.
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
415 + */
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
416 + device: (&((struct pci_dev *)(${self})->pci_dev)->dev);
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
417 pci_device: ${self}->pci_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
418 net_device: ${self}->net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
419 - perm_addr: ${self}->net_dev->ndev.perm_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
420 - dev_addr: ${self}->net_dev->ndev.dev_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
421 + perm_addr: ((struct net_device *)(${self})->net_dev)->perm_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
422 + dev_addr: ((struct net_device *)(${self})->net_dev)->dev_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
423 + irq: ((struct pci_dev *)(${self})->pci_dev)->irq;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
424 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
425 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
426
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
427 template sequence Ethernet::open(Ethernet::Device dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
428 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
429 + chunk LKM::includes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
430 + {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
431 + #include <linux/interrupt.h>
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
432 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
433 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
434 chunk LKM::prototypes()
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
435 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
436 static int rtx_ethernet_open(struct net_device *);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
437 @@ -120,12 +140,40 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
438 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
439 static int rtx_ethernet_open(struct net_device *dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
440 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
441 - ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
442 + /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
443 + * XXX The casts are here because the compiler doesn't resolve
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
444 + * "enclosed" type (e.g: local.var.enclosed) correctly.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
445 + */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
446 + ${Ethernet::AbstractDevice} *rtx_net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
447 + ${cast local.rtx_net_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
448 + { /* XXX: I end up with a placeholder if I don't open a scope */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
449 + ${local.rtx_net_dev.init(local.dev)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
450 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
451
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
452 + ${Ethernet::Device} *rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
453 ${cast local.rtx_ether_ctx as Ethernet::Device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
454 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
455 + int error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
456 + {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
457 + ${Log::info("installing the interrupt handler")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
458 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
459 + error = request_irq(${local.rtx_ether_ctx.irq},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
460 + rtx_ethernet_interrupt_handler,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
461 + IRQF_SHARED,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
462 + ${config.name},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
463 + ${local.rtx_net_dev.k_net_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
464 + if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
465 + {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
466 + ${Log::info("Cannot register the interrupt handler")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
467 + goto error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
468 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
469 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
470 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
471
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
472 return 0;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
473 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
474 + error:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
475 + return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
476 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
477 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
478 }
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
479 @@ -162,10 +210,24 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
480 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
481 static int rtx_ethernet_close(struct net_device *dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
482 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
483 - ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
484 + ${Ethernet::AbstractDevice} *rtx_net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
485 + ${cast local.rtx_net_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
486 + { /* XXX: I end up with a placeholder if I don't open a scope */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
487 + ${local.rtx_net_dev.init(local.dev)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
488 + }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
489
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
490 + ${Ethernet::Device} *rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
491 ${cast local.rtx_ether_ctx as Ethernet::Device};
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
492 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
493 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
494 + /* TODO: change this pointcut into a pointcut/adapter/callback: */
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
495 + {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
496 + ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
497 + }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
498 +
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
499 + free_irq(${local.rtx_ether_ctx.irq}, ${local.rtx_net_dev.k_net_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
500 + {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
501 + ${Log::info("interrupt handler free'ed")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
502 + }
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
503
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
504 return 0;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
505 }
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
506 @@ -187,9 +249,13 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
507 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
508 static enum irqreturn rtx_ethernet_interrupt_handler(int irq, void *dev_id)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
509 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
510 - ${Ethernet::Device} *rtx_ether_ctx = dev_id;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
511 + ${Ethernet::AbstractDevice} *rtx_net_dev = dev_id;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
512 + ${cast local.rtx_net_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
513
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
514 + ${Ethernet::Device} *rtx_ether_ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
515 ${cast local.rtx_ether_ctx as Ethernet::Device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
516 + rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
517 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
518 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
519
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
520 return IRQ_NONE;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
521 @@ -219,23 +285,26 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
522 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
523 chunk PCI::pci_probe_hook(PCI::Device rtx_pci_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
524 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
525 + ${Ethernet::AbstractDevice} *rtx_net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
526 ${Ethernet::Device} *rtx_ether_ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
527 - ${Ethernet::AbstractDevice} *net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
528 - ${cast local.net_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
529 + ${cast local.rtx_net_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
530
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
531 - net_dev = (${Ethernet::AbstractDevice}*) alloc_etherdev(sizeof(*rtx_ether_ctx));
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
532 - if (!net_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
533 + /* Cast the result back into our "transparent wrapper" type */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
534 + rtx_net_dev = (${Ethernet::AbstractDevice}*)alloc_etherdev(sizeof(*rtx_ether_ctx));
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
535 + if (!rtx_net_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
536 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
537 ${Log::info("cannot allocate the ethernet device context")};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
538 error = -ENOMEM;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
539 goto fail;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
540 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
541 - SET_NETDEV_DEV(&${local.net_dev.netdev}, ${rtx_pci_dev.device});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
542 - strlcpy(${local.net_dev.netdev}.name, ${config.ifname}, sizeof(${local.net_dev.netdev}.name));
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
543 - ${local.net_dev.netdev}.irq = ${rtx_pci_dev.irq};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
544 - ${local.net_dev.netdev}.netdev_ops = &rtx_ether_ops;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
545 + SET_NETDEV_DEV(${local.rtx_net_dev.k_net_dev}, ${rtx_pci_dev.device});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
546 + strlcpy(${local.rtx_net_dev.k_net_dev}->name,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
547 + ${config.ifname},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
548 + sizeof(${local.rtx_net_dev.k_net_dev}->name));
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
549 + ${local.rtx_net_dev.k_net_dev}->irq = ${rtx_pci_dev.irq};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
550 + ${local.rtx_net_dev.k_net_dev}->netdev_ops = &rtx_ether_ops;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
551
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
552 - error = register_netdev(&${local.net_dev.netdev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
553 + error = register_netdev(${local.rtx_net_dev.k_net_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
554 if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
555 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
556 ${Log::info("cannot register the driver in the net subsystem")};
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
557 @@ -247,14 +316,11 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
558 * XXX: the cast is here because the compiler resolve the
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
559 * type of rtx_pci_dev.pci_device to the type of
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
560 * rtx_pci_dev instead of the type of rtx_pci_dev.pci_device.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
561 - *
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
562 - * Also, I'm getting placeholder in the generated code if
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
563 - * I don't open a scope here.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
564 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
565 - {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
566 - ${PCI::AbstractDevice} *rtx_pdev = ${rtx_pci_dev.pci_device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
567 - ${cast local.rtx_pdev as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
568 - ${local.rtx_ether_ctx.init(local.net_dev, local.rtx_pdev)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
569 + ${PCI::AbstractDevice} *workaround = ${rtx_pci_dev.pci_device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
570 + ${cast local.workaround as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
571 + { /* XXX: I end up with a placeholder if I don't open a scope */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
572 + ${local.rtx_ether_ctx.init(local.rtx_net_dev, local.workaround)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
573 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
574
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
575 /* Register ourselves in the parent context: */
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
576 @@ -267,19 +333,16 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
577 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
578 int bars = ${rtx_pci_dev.bars};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
579 unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
580 - int irq = ${rtx_pci_dev.irq};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
581 ${cast local.bars as Builtin::number};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
582 - ${cast local.irq as Builtin::number};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
583 ${cast local.rtx_ether_ctx as Ethernet::Device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
584 ${pointcut Ethernet::adapter_init_context(local.rtx_ether_ctx,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
585 local.bars,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
586 - local.ioaddr,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
587 - local.irq)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
588 + local.ioaddr)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
589 ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
590 ${pointcut Ethernet::adapter_load_mac_address(local.rtx_ether_ctx)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
591 memcpy(${local.rtx_ether_ctx.perm_addr},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
592 ${local.rtx_ether_ctx.dev_addr},
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
593 - ${local.net_dev.netdev}.addr_len);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
594 + ${local.rtx_net_dev.k_net_dev}->addr_len);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
595 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
596
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
597 /* This chunk should be removed (see #26) */
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
598 @@ -296,15 +359,15 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
599 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
600 chunk PCI::pci_remove_hook(PCI::Device rtx_pci_dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
601 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
602 - ${Ethernet::Device} *rtx_ether_ctx = ${rtx_pci_dev.context};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
603 - ${Ethernet::AbstractDevice} *rtx_ether_dev = (${Ethernet::AbstractDevice}*) ${local.rtx_ether_ctx.net_device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
604 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
605 + ${Ethernet::Device} *rtx_ether_ctx = ${rtx_pci_dev.rtx_drv_context};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
606 + ${cast local.rtx_ether_ctx as Ethernet::Device}; /* XXX */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
607 BUG_ON(!rtx_ether_ctx);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
608
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
609 - ${cast local.rtx_ether_ctx as Ethernet::Device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
610 - ${cast local.rtx_ether_dev as Ethernet::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
611 - unregister_netdev(&${local.rtx_ether_dev.netdev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
612 - free_netdev(&${local.rtx_ether_dev.netdev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
613 + ${Ethernet::AbstractDevice} *rtx_net_dev = ${local.rtx_ether_ctx.net_device};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
614 + ${cast local.rtx_net_dev as Ethernet::AbstractDevice}; /* XXX */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
615 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
616 + unregister_netdev(${local.rtx_net_dev.k_net_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
617 + free_netdev(${local.rtx_net_dev.k_net_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
618 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
619
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
620 /* This chunk should be removed (see #26) */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
621 diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
622 --- a/rathaxes/samples/e1000/ethernet.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
623 +++ b/rathaxes/samples/e1000/ethernet.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
624 @@ -16,8 +16,15 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
625 provided type AbstractDevice
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
626 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
627 chunk LKM::includes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
628 + method init(Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
629 decl data_types();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
630 - attribute Builtin::symbol netdev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
631 +
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
632 + attribute Builtin::symbol k_net_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
633 + /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
634 + * XXX: should be a Ethernet::Device, but that causes a circular
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
635 + * dependency.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
636 + */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
637 + attribute Builtin::symbol rtx_ether_ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
638 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
639
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
640 provided type Device
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
641 @@ -34,12 +41,14 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
642 * I'd like to use better names here, but I'd like to understand the
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
643 * difference between the two first:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
644 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
645 - attribute Builtin::symbol perm_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
646 - attribute Builtin::symbol dev_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
647 + attribute Builtin::symbol perm_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
648 + attribute Builtin::symbol dev_addr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
649 + attribute Builtin::symbol irq;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
650 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
651
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
652 required sequence open(Ethernet::Device)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
653 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
654 + provided chunk LKM::includes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
655 provided chunk LKM::prototypes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
656 provided chunk LKM::code();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
657 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
658 @@ -69,8 +78,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
659
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
660 provided pointcut Ethernet::adapter_init_context(Ethernet::Device,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
661 Builtin::number,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
662 - Builtin::symbol,
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
663 - Builtin::number);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
664 + Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
665 provided pointcut Ethernet::adapter_reset(Ethernet::Device);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
666 provided pointcut Ethernet::adapter_load_mac_address(Ethernet::Device);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
667 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
668 diff --git a/rathaxes/samples/e1000/lkm.rtx b/rathaxes/samples/e1000/lkm.rtx
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
669 --- a/rathaxes/samples/e1000/lkm.rtx
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
670 +++ b/rathaxes/samples/e1000/lkm.rtx
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
671 @@ -4,13 +4,6 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
672 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
673 Log::info("opening the device");
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
674
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
675 - /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
676 - * Maybe e1000::create_device should be called from here, to be
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
677 - * more coherent.
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
678 - */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
679 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
680 - e1000::setup_interrupt_handler(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
681 - Log::info("interrupt handler installed");
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
682
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
683 e1000::set_up_device(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
684 Log::info("device activated");
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
685 @@ -32,9 +25,6 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
686 */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
687 e1000::free_rx_tx(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
688 Log::info("free'ed up rx/tx resources");
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
689 -
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
690 - e1000::free_interrupt_handler(dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
691 - Log::info("interrupt handler free'ed");
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
692 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
693
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
694 Ethernet::interrupt_handler(Ethernet::Device dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
695 diff --git a/rathaxes/samples/e1000/pci.blt b/rathaxes/samples/e1000/pci.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
696 --- a/rathaxes/samples/e1000/pci.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
697 +++ b/rathaxes/samples/e1000/pci.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
698 @@ -16,15 +16,15 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
699 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
700 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
701
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
702 - method set_context(Builtin::symbol ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
703 + method set_rtx_context(Builtin::symbol ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
704 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
705 - pci_set_drvdata(&${self}->data, ${ctx});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
706 + pci_set_drvdata(${self.k_pci_dev}, ${ctx});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
707 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
708
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
709 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
710 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
711 - data: ${self}->data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
712 - drv_data: pci_get_drvdata(&${self}->data);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
713 + k_pci_dev: ((struct pci_dev *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
714 + rtx_pci_ctx: pci_get_drvdata((struct pci_dev *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
715 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
716 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
717
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
718 @@ -52,13 +52,13 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
719 int error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
720 ${PCI::AbstractDevice} *enable_pdev = self->pdev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
721 ${cast local.enable_pdev as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
722 - error = pci_enable_device(&${local.enable_pdev.data});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
723 + error = pci_enable_device(${local.enable_pdev.k_pci_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
724 if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
725 return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
726 - error = pci_request_selected_regions(&${local.enable_pdev.data}, self->bars, ${config.name});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
727 + error = pci_request_selected_regions(${local.enable_pdev.k_pci_dev}, self->bars, ${config.name});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
728 if (error)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
729 return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
730 - pci_set_master(&${local.enable_pdev.data});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
731 + pci_set_master(${local.enable_pdev.k_pci_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
732 return 0;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
733 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
734
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
735 @@ -68,8 +68,8 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
736 ${cast local.disable_pdev as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
737 if (self->ioaddr)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
738 iounmap(self->ioaddr);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
739 - pci_release_selected_regions(&${local.disable_pdev.data}, self->bars);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
740 - pci_disable_device(&${local.disable_pdev.data});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
741 + pci_release_selected_regions(${local.disable_pdev.k_pci_dev}, self->bars);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
742 + pci_disable_device(${local.disable_pdev.k_pci_dev});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
743 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
744 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
745
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
746 @@ -78,7 +78,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
747 ${PCI::AbstractDevice} * workaround = (${PCI::AbstractDevice}*)pdev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
748 ${cast local.workaround as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
749 ${self}->pdev = ${pdev};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
750 - ${self}->bars = pci_select_bars(&${local.workaround.data}, IORESOURCE_MEM);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
751 + ${self}->bars = pci_select_bars(${local.workaround.k_pci_dev}, IORESOURCE_MEM);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
752 ${self}->ioaddr = NULL;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
753 ${self}->context = NULL;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
754 }
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
755 @@ -97,20 +97,20 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
756 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
757 ${PCI::AbstractDevice} *select_ioaddr_pdev = ${self}->pdev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
758 ${cast local.select_ioaddr_pdev as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
759 - ${self}->ioaddr = pci_ioremap_bar(&${local.select_ioaddr_pdev.data}, ${bar});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
760 + ${self}->ioaddr = pci_ioremap_bar(${local.select_ioaddr_pdev.k_pci_dev}, ${bar});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
761 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
762
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
763 - method set_context(Builtin::symbol ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
764 + method set_rtx_drv_context(Builtin::symbol ctx)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
765 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
766 ${self}->context = ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
767 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
768
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
769 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
770 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
771 - context: ${self}->context;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
772 - device: &${self}->pdev->data.dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
773 + rtx_drv_context: ${self}->context;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
774 + device: &((struct pci_dev *)(${self})->pdev)->dev;
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
775 pci_device: ${self}->pdev;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
776 - irq: ${self}->pdev->data.irq;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
777 + irq: ((struct pci_dev *)(${self})->pdev)->irq;
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
778 bars: ${self}->bars;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
779 ioaddr: ${self}->ioaddr;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
780 BAR_0: 0;
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
781 @@ -151,7 +151,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
782 ${local.rtx_pci_dev.init(local.rtx_pdev)};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
783 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
784
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
785 - /* ${local.pdev.set_context(local.rtx_pci_dev)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
786 + /* ${local.pdev.set_rtx_context(local.rtx_pci_dev)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
787 pci_set_drvdata(pdev, rtx_pci_dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
788
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
789 /* ${local.rtx_pci_dev.enable()}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
790 @@ -184,7 +184,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
791 return 0;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
792
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
793 fail:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
794 - /* ${local.pdev.set_context(NULL)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
795 + /* ${local.pdev.set_rtx_drv_context(NULL)}; */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
796 pci_set_drvdata(pdev, NULL);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
797 kfree(rtx_pci_dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
798 return error;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
799 @@ -210,7 +210,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
800 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
801 ${PCI::AbstractDevice} *rtx_pdev = (${PCI::AbstractDevice}*)pdev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
802 ${cast local.rtx_pdev as PCI::AbstractDevice};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
803 - ${PCI::Device} *rtx_pci_dev = ${rtx_pdev.drv_data};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
804 + ${PCI::Device} *rtx_pci_dev = ${rtx_pdev.rtx_pci_ctx};
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
805
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
806 BUG_ON(!rtx_pci_dev);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
807
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
808 diff --git a/rathaxes/samples/e1000/pci.rti b/rathaxes/samples/e1000/pci.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
809 --- a/rathaxes/samples/e1000/pci.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
810 +++ b/rathaxes/samples/e1000/pci.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
811 @@ -10,10 +10,15 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
812
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
813 chunk LKM::includes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
814 method init(PCI::AbstractDevice);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
815 - method set_context(Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
816 + /*
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
817 + * XXX: the argument should be a PCI::Device but that causes a circular
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
818 + * dependency:
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
819 + */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
820 + method set_rtx_context(Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
821
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
822 - attribute Builtin::symbol data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
823 - attribute Builtin::symbol drv_data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
824 + attribute Builtin::symbol k_pci_dev;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
825 + /* XXX: should be PCI::Device (see above point) */
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
826 + attribute Builtin::symbol rtx_pci_ctx;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
827 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
828
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
829 provided type PCI::Device
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
830 @@ -27,9 +32,9 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
831 method enable();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
832 method disable();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
833 method select_ioaddr(Builtin::number);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
834 - method set_context(Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
835 + method set_rtx_drv_context(Builtin::symbol);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
836
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
837 - attribute Builtin::symbol context;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
838 + attribute Builtin::symbol rtx_drv_context;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
839 attribute Device::AbstractDevice device;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
840 attribute PCI::AbstractDevice pci_device;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
841 attribute Builtin::symbol ioaddr;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
842 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
843 --- a/rathaxes/samples/e1000/socket.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
844 +++ b/rathaxes/samples/e1000/socket.blt
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
845 @@ -14,7 +14,7 @@
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
846
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
847 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
848 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
849 - data: ${self}->data;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
850 + k_sk_buff: ((struct sk_buff *)${self});
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
851 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
852 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
853
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
854 @@ -46,11 +46,12 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
855 */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
856 ${Socket::AbstractSKBuff} *skb = self->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
857 ${cast local.skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
858 - ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.skb.data}.protocol) };
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
859 + ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.skb.k_sk_buff}->protocol) };
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
860 +
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
861 static const char * const ip_summed_values[] = {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
862 "none", "unnecessary", "complete", "partial"
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
863 };
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
864 - struct skb_shared_info *shinfo = skb_shinfo(&${local.skb.data});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
865 + struct skb_shared_info *shinfo = skb_shinfo(${local.skb.k_sk_buff});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
866
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
867 pr_info(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
868 "\t protocol = %#-5x (%s) ip_summed = %d (%s)\n"
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
869 @@ -59,8 +60,8 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
870 "\t gso_size = %-5u gso_segs = %-5u gso_type = %-5u",
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
871 /* XXX: can't use ${local.ethernet_proto.id} here (issue #52): */
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
872 ethernet_proto.id, ${local.ethernet_proto.str},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
873 - ${local.skb.data}.ip_summed, ip_summed_values[${local.skb.data}.ip_summed],
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
874 - ${local.skb.data}.len, ${local.skb.data}.data_len, skb_headlen(&${local.skb.data}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
875 + ${local.skb.k_sk_buff}->ip_summed, ip_summed_values[${local.skb.k_sk_buff}->ip_summed],
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
876 + ${local.skb.k_sk_buff}->len, ${local.skb.k_sk_buff}->data_len, skb_headlen(${local.skb.k_sk_buff}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
877 shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
878 );
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
879 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
880 @@ -72,14 +73,13 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
881 ${Socket::AbstractSKBuff} *skb = self->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
882 ${cast local.skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
883
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
884 - WARN_ON(!skb);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
885 - WARN_ON(!${local.skb.data}.data);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
886 + WARN_ON(!${local.skb.k_sk_buff});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
887 WARN_ON(self->dma_handle);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
888
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
889 self->dma_handle = dma_map_single(
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
890 dev,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
891 - &${local.skb.data}.data,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
892 - skb_headlen(&${local.skb.data}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
893 + ${local.skb.k_sk_buff},
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
894 + skb_headlen(${local.skb.k_sk_buff}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
895 direction);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
896 int err = dma_mapping_error(dev, self->dma_handle);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
897 if (err)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
898 @@ -97,18 +97,17 @@
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
899 ${Socket::AbstractSKBuff} *skb = self->skbuff;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
900 ${cast local.skb as Socket::AbstractSKBuff};
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
901
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
902 - WARN_ON(!${local.skb});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
903 - WARN_ON(!${local.skb.data}.data);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
904 + WARN_ON(!${local.skb.k_sk_buff});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
905
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
906 if (self->dma_handle)
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
907 {
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
908 dma_unmap_single(dev,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
909 self->dma_handle,
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
910 - skb_headlen(&${local.skb.data}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
911 + skb_headlen(${local.skb.k_sk_buff}),
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
912 direction);
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
913 self->dma_handle = 0;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
914 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
915 - dev_kfree_skb_any(&${local.skb.data});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
916 + dev_kfree_skb_any(${local.skb.k_sk_buff});
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
917 self->skbuff = 0;
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
918 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
919 }
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
920 @@ -131,22 +130,22 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
921
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
922 method map_to(Device::AbstractDevice dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
923 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
924 - rtx_socket_skbuff_map(${self}, &${dev.data}, DMA_TO_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
925 + rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
926 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
927
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
928 method map_from(Device::AbstractDevice dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
929 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
930 - rtx_socket_skbuff_map(${self}, &${dev.data}, DMA_FROM_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
931 + rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_FROM_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
932 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
933
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
934 method unmap_to_and_free(Device::AbstractDevice dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
935 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
936 - rtx_socket_skbuff_unmap_and_free(${self}, &${dev.data}, DMA_TO_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
937 + rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_TO_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
938 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
939
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
940 method unmap_from_and_free(Device::AbstractDevice dev)
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
941 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
942 - rtx_socket_skbuff_unmap_and_free(${self}, &${dev.data}, DMA_FROM_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
943 + rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_FROM_DEVICE);
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
944 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
945
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
946 map
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
947 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
948 --- a/rathaxes/samples/e1000/socket.rti
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
949 +++ b/rathaxes/samples/e1000/socket.rti
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
950 @@ -5,7 +5,8 @@
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
951 {
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
952 chunk LKM::includes();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
953 decl data_types();
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
954 - attribute Builtin::symbol data;
103
d9af98faac8a Wip on abstract type nightmare
Louis Opter <louis@lse.epita.fr>
parents: 102
diff changeset
955 +
102
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
956 + attribute Builtin::symbol k_sk_buff;
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
957 }
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
958
8e8aa342078b Close the series on the slides and backup some wip on the abstract type nightmare in e1000
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
959 provided type SKBuff