Mercurial > archived > louis > epitech > mq > rathaxes
comparison 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 |
comparison
equal
deleted
inserted
replaced
102:8e8aa342078b | 103:d9af98faac8a |
---|---|
1 # HG changeset patch | 1 # HG changeset patch |
2 # Parent 21cb4b0b59ebfc3350ded6f9cea2b44203437ab2 | 2 # Parent 7a2c9e5880145d2d42cd5bc01dbc2b6e96689934 |
3 | |
3 diff --git a/rathaxes/samples/e1000/device.blt b/rathaxes/samples/e1000/device.blt | 4 diff --git a/rathaxes/samples/e1000/device.blt b/rathaxes/samples/e1000/device.blt |
4 --- a/rathaxes/samples/e1000/device.blt | 5 --- a/rathaxes/samples/e1000/device.blt |
5 +++ b/rathaxes/samples/e1000/device.blt | 6 +++ b/rathaxes/samples/e1000/device.blt |
6 @@ -18,7 +18,7 @@ | 7 @@ -18,7 +18,7 @@ |
7 | 8 |
24 } | 25 } |
25 } | 26 } |
26 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt | 27 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt |
27 --- a/rathaxes/samples/e1000/e1000.blt | 28 --- a/rathaxes/samples/e1000/e1000.blt |
28 +++ b/rathaxes/samples/e1000/e1000.blt | 29 +++ b/rathaxes/samples/e1000/e1000.blt |
29 @@ -249,7 +249,6 @@ | 30 @@ -171,13 +171,17 @@ |
31 | |
32 static int rtx_e1000_tx_ring_tso_cksum_offload(${e1000::TxRing} *self, ${Socket::SKBuff} *skb) | |
33 { | |
34 - ${Socket::AbstractSKBuff} *abs_skb = skb->skbuff; | |
35 - ${cast local.abs_skb as Socket::AbstractSKBuff}; | |
36 - return skb_is_gso(&${local.abs_skb.data}) || ${local.abs_skb.data}.ip_summed == CHECKSUM_PARTIAL; | |
37 + /* XXX We can't use ${skb} here because it's a pointer */ | |
38 + ${Socket::AbstractSKBuff} *k_skb = skb->skbuff; | |
39 + ${cast local.k_skb as Socket::AbstractSKBuff}; | |
40 + return skb_is_gso(${local.k_skb.k_sk_buff}) || ${local.k_skb.k_sk_buff}->ip_summed == CHECKSUM_PARTIAL; | |
41 } | |
42 | |
43 static void rtx_e1000_tx_ring_put(${e1000::TxRing} *self, ${Socket::SKBuff} *skb) | |
44 { | |
45 + /* XXX We can't use ${skb} here because it's a pointer */ | |
46 + ${Socket::AbstractSKBuff} *k_skb = skb->skbuff; | |
47 + ${cast local.k_skb as Socket::AbstractSKBuff}; | |
48 WARN_ON(!skb); | |
49 | |
50 /* | |
51 @@ -188,17 +192,15 @@ | |
52 * code shouldn't be aware of it and use something more | |
53 * abstract. | |
54 */ | |
55 - ${Socket::AbstractSKBuff} *abs_skb = skb->skbuff; | |
56 - ${cast local.abs_skb as Socket::AbstractSKBuff}; | |
57 ${e1000::TxDescriptor} *tx_desc = &self->base[self->tail]; | |
58 tx_desc->lower.data = cpu_to_le32( | |
59 E1000_TXD_CMD_EOP | | |
60 E1000_TXD_CMD_IFCS | | |
61 E1000_TXD_CMD_RS | | |
62 - skb_headlen(&${local.abs_skb.data})); | |
63 + skb_headlen(${local.k_skb.k_sk_buff})); | |
64 tx_desc->upper.data = 0; | |
65 tx_desc->buff_addr = cpu_to_le64(skb->dma_handle); | |
66 - memcpy(&self->skbuffs[self->tail], skb, sizeof(*skb)); | |
67 + memcpy(&self->skbuffs[self->tail], ${local.k_skb.k_sk_buff}, sizeof(*${local.k_skb.k_sk_buff})); | |
68 self->tail = (self->tail + 1) % ${config.tx_ring_size}; | |
69 } | |
70 | |
71 @@ -249,7 +251,6 @@ | |
30 { | 72 { |
31 int bars; | 73 int bars; |
32 unsigned char /* __iomem */ *ioaddr; | 74 unsigned char /* __iomem */ *ioaddr; |
33 - int irq; | 75 - int irq; |
34 | 76 |
35 ${e1000::RxRing} rx_ring; | 77 ${e1000::RxRing} rx_ring; |
36 ${e1000::TxRing} tx_ring; | 78 ${e1000::TxRing} tx_ring; |
37 @@ -267,14 +266,12 @@ | 79 @@ -267,14 +268,12 @@ |
38 | 80 |
39 chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx, | 81 chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx, |
40 Builtin::number bars, | 82 Builtin::number bars, |
41 - Builtin::symbol ioaddr, | 83 - Builtin::symbol ioaddr, |
42 - Builtin::number irq) | 84 - Builtin::number irq) |
48 hw_ctx->ioaddr = ${ioaddr}; | 90 hw_ctx->ioaddr = ${ioaddr}; |
49 - hw_ctx->irq = ${irq}; | 91 - hw_ctx->irq = ${irq}; |
50 } | 92 } |
51 } | 93 } |
52 | 94 |
53 @@ -606,68 +603,6 @@ | 95 @@ -606,68 +605,6 @@ |
54 } | 96 } |
55 } | 97 } |
56 | 98 |
57 - template sequence e1000::setup_interrupt_handler(Ethernet::Device rtx_ether_ctx) | 99 - template sequence e1000::setup_interrupt_handler(Ethernet::Device rtx_ether_ctx) |
58 - { | 100 - { |
117 - } | 159 - } |
118 - | 160 - |
119 template sequence activate_device_interruption(Ethernet::Device rtx_ether_ctx) | 161 template sequence activate_device_interruption(Ethernet::Device rtx_ether_ctx) |
120 { | 162 { |
121 chunk ::CALL() | 163 chunk ::CALL() |
122 @@ -816,12 +751,10 @@ | 164 @@ -798,7 +735,7 @@ |
165 hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base); | |
166 hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096); | |
167 hw_ctx->rx_ring.base = dma_alloc_coherent( | |
168 - &${rtx_ether_ctx.device}, | |
169 + ${rtx_ether_ctx.device}, | |
170 hw_ctx->rx_ring.size, | |
171 &hw_ctx->rx_ring.dma_base, | |
172 GFP_KERNEL); | |
173 @@ -816,12 +753,10 @@ | |
123 * Allocate the skbuffs, map them for DMA, and write their address | 174 * Allocate the skbuffs, map them for DMA, and write their address |
124 * in the corresponding descriptor. | 175 * in the corresponding descriptor. |
125 */ | 176 */ |
126 - ${Ethernet::AbstractDevice} *rtx_ether_dev = ${rtx_ether_ctx.net_device}; | 177 - ${Ethernet::AbstractDevice} *rtx_ether_dev = ${rtx_ether_ctx.net_device}; |
127 - ${cast local.rtx_ether_dev as Ethernet::AbstractDevice}; | 178 - ${cast local.rtx_ether_dev as Ethernet::AbstractDevice}; |
128 for (i = 0; i != ${config.rx_ring_size}; ++i) | 179 for (i = 0; i != ${config.rx_ring_size}; ++i) |
129 { | 180 { |
130 - hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*) netdev_alloc_skb( | 181 - hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*) netdev_alloc_skb( |
131 - &${rtx_ether_dev.netdev}, | 182 - &${rtx_ether_dev.netdev}, |
132 + hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*)netdev_alloc_skb( | 183 + hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*)netdev_alloc_skb( |
133 + ${rtx_ether_ctx.net_device}, | 184 + ${rtx_ether_ctx.net_device.k_net_dev}, /* XXX: .k_net_dev isn't expanded here */ |
134 ${config.rx_buffer_len}); | 185 ${config.rx_buffer_len}); |
135 if (!hw_ctx->rx_ring.skbuffs[i].skbuff) | 186 if (!hw_ctx->rx_ring.skbuffs[i].skbuff) |
136 { | 187 { |
137 @@ -830,7 +763,7 @@ | 188 @@ -829,11 +764,11 @@ |
189 goto err_skbuffs_alloc; | |
138 } | 190 } |
139 hw_ctx->rx_ring.skbuffs[i].dma_handle = dma_map_single( | 191 hw_ctx->rx_ring.skbuffs[i].dma_handle = dma_map_single( |
140 &${rtx_ether_ctx.device}, | 192 - &${rtx_ether_ctx.device}, |
141 - &hw_ctx->rx_ring.skbuffs[i].skbuff->data, | 193 - &hw_ctx->rx_ring.skbuffs[i].skbuff->data, |
194 + ${rtx_ether_ctx.device}, | |
142 + (struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff, /* XXX leaking cast */ | 195 + (struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff, /* XXX leaking cast */ |
143 ${config.rx_buffer_len}, | 196 ${config.rx_buffer_len}, |
144 DMA_FROM_DEVICE); | 197 DMA_FROM_DEVICE); |
145 int dma_error = dma_mapping_error(&${rtx_ether_ctx.device}, | 198 - int dma_error = dma_mapping_error(&${rtx_ether_ctx.device}, |
146 @@ -933,7 +866,8 @@ | 199 + int dma_error = dma_mapping_error(${rtx_ether_ctx.device}, |
200 hw_ctx->rx_ring.skbuffs[i].dma_handle); | |
201 if (dma_error) | |
202 { | |
203 @@ -885,7 +820,7 @@ | |
204 hw_ctx->tx_ring.size = ${config.tx_ring_size} * sizeof(*hw_ctx->tx_ring.base); | |
205 hw_ctx->tx_ring.size = ALIGN(hw_ctx->tx_ring.size, 4096); | |
206 hw_ctx->tx_ring.base = dma_alloc_coherent( | |
207 - &${rtx_ether_ctx.device}, | |
208 + ${rtx_ether_ctx.device}, | |
209 hw_ctx->tx_ring.size, | |
210 &hw_ctx->tx_ring.dma_base, | |
211 GFP_KERNEL); | |
212 @@ -928,15 +863,16 @@ | |
213 while (i--) | |
214 { | |
215 dma_unmap_single( | |
216 - &${rtx_ether_ctx.device}, | |
217 + ${rtx_ether_ctx.device}, | |
218 hw_ctx->rx_ring.skbuffs[i].dma_handle, | |
147 ${config.rx_buffer_len}, | 219 ${config.rx_buffer_len}, |
148 DMA_FROM_DEVICE); | 220 DMA_FROM_DEVICE); |
149 err_skbuffs_map: | 221 err_skbuffs_map: |
150 - dev_kfree_skb(&hw_ctx->rx_ring.skbuffs[i].skbuff->data); | 222 - dev_kfree_skb(&hw_ctx->rx_ring.skbuffs[i].skbuff->data); |
151 + /* XXX leaking cast: */ | 223 + /* XXX leaking cast: */ |
152 + dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff); | 224 + dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff); |
153 } | 225 } |
154 | 226 |
155 dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->rx_ring.size, | 227 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->rx_ring.size, |
156 @@ -1042,9 +976,9 @@ | 228 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size, |
229 hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base); | |
230 err_rx_ring_alloc: | |
231 return -ENOMEM; | |
232 @@ -954,8 +890,13 @@ | |
233 { | |
234 chunk ::CALL() | |
235 { | |
236 - ${e1000::Context} *hw_ctx; | |
237 - hw_ctx = &${rtx_ether_ctx}->hw_ctx; | |
238 + /* | |
239 + * XXX: Not generated if named "hw_ctx" (which is funny because | |
240 + * it's used and works in the template right above this one): | |
241 + */ | |
242 + ${e1000::Context} *hw_ctx_; | |
243 + ${cast local.hw_ctx_ as e1000::Context}; | |
244 + hw_ctx_ = &${rtx_ether_ctx}->hw_ctx; | |
245 | |
246 /* | |
247 * Free the rx ring: | |
248 @@ -965,22 +906,23 @@ | |
249 for (int i = 0; i != ${config.rx_ring_size}; ++i) | |
250 { | |
251 dma_unmap_single( | |
252 - &${rtx_ether_ctx.device}, | |
253 - (dma_addr_t)hw_ctx->rx_ring.skbuffs[i].dma_handle, | |
254 + ${rtx_ether_ctx.device}, | |
255 + (dma_addr_t)hw_ctx_->rx_ring.skbuffs[i].dma_handle, | |
256 ${config.rx_buffer_len}, | |
257 DMA_FROM_DEVICE); | |
258 - dev_kfree_skb(&hw_ctx->rx_ring.skbuffs[i].skbuff->data); | |
259 + /* XXX Go through the rtx types (Socket::SKBuff, AbstractSKBuff) */ | |
260 + dev_kfree_skb(hw_ctx_->rx_ring.skbuffs[i].skbuff); | |
261 } | |
262 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->rx_ring.size, | |
263 - hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base); | |
264 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->rx_ring.size, | |
265 + hw_ctx_->rx_ring.base, hw_ctx_->rx_ring.dma_base); | |
266 ${Log::info("free_rx_tx: rx ring free'ed")}; | |
267 | |
268 /* | |
269 * Free the tx ring: | |
270 * - Free the descriptors array. | |
271 */ | |
272 - dma_free_coherent(&${rtx_ether_ctx.device}, hw_ctx->tx_ring.size, | |
273 - hw_ctx->tx_ring.base, hw_ctx->tx_ring.dma_base); | |
274 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->tx_ring.size, | |
275 + hw_ctx_->tx_ring.base, hw_ctx_->tx_ring.dma_base); | |
276 ${Log::info("free_rx_tx: tx ring free'ed")}; | |
277 } | |
278 } | |
279 @@ -1038,13 +980,13 @@ | |
280 ${local.skb.init(kernel_skb)}; | |
281 hw_ctx = &${rtx_ether_ctx}->hw_ctx; | |
282 tx_ring = &hw_ctx->tx_ring; | |
283 - devp = (${Device::AbstractDevice}*) &${rtx_ether_ctx.device}; | |
284 + devp = (${Device::AbstractDevice}*)${rtx_ether_ctx.device}; | |
157 | 285 |
158 ${Log::info("xmit: skbuff details:")}; | 286 ${Log::info("xmit: skbuff details:")}; |
159 /* | 287 /* |
160 - * skb is not expand on the bound C variable (should be rtx_skbuff), | 288 - * skb is not expand on the bound C variable (should be rtx_skbuff), |
161 - * which is funny because it works for the sequence template call | 289 - * which is funny because it works for the sequence template call |
164 + * rtx_skbuff), which is funny because it works for the | 292 + * rtx_skbuff), which is funny because it works for the |
165 + * sequence template call right after. | 293 + * sequence template call right after. |
166 */ | 294 */ |
167 /* | 295 /* |
168 * XXX: doesn't work (I tried to pass self explicitely too): | 296 * XXX: doesn't work (I tried to pass self explicitely too): |
169 @@ -1077,8 +1011,8 @@ | 297 @@ -1077,8 +1019,8 @@ |
170 | 298 |
171 /* 2. Map the data */ | 299 /* 2. Map the data */ |
172 | 300 |
173 - /* XXX: ${local.skb.map_to(local.devp)}; */ | 301 - /* XXX: ${local.skb.map_to(local.devp)}; */ |
174 - if (rtx_socket_skbuff_map(&skb, &${devp.data}, DMA_TO_DEVICE)) | 302 - if (rtx_socket_skbuff_map(&skb, &${devp.data}, DMA_TO_DEVICE)) |
175 + /* XXX: ${local.skb.map_to(devp.k_device)}; */ | 303 + /* XXX: ${local.skb.map_to(devp.k_device)}; */ |
176 + if (rtx_socket_skbuff_map(&skb, ${devp.k_device}, DMA_TO_DEVICE)) | 304 + if (rtx_socket_skbuff_map(&skb, ${devp.k_device}, DMA_TO_DEVICE)) |
177 { | 305 { |
178 ${Log::info("xmit: can't DMA map a SKbuff")}; | 306 ${Log::info("xmit: can't DMA map a SKbuff")}; |
179 goto err_skb_map_to; | 307 goto err_skb_map_to; |
180 @@ -1097,7 +1031,7 @@ | 308 @@ -1097,7 +1039,7 @@ |
181 err_offload: | 309 err_offload: |
182 err_skb_map_to: | 310 err_skb_map_to: |
183 /* XXX: ${local.skb.unmap_to_and_free(local.dev)}; */ | 311 /* XXX: ${local.skb.unmap_to_and_free(local.dev)}; */ |
184 - rtx_socket_skbuff_unmap_and_free(&skb, &${devp.data}, DMA_TO_DEVICE); | 312 - rtx_socket_skbuff_unmap_and_free(&skb, &${devp.data}, DMA_TO_DEVICE); |
185 + rtx_socket_skbuff_unmap_and_free(&skb, &${devp.k_device}, DMA_TO_DEVICE); | 313 + rtx_socket_skbuff_unmap_and_free(&skb, ${devp.k_device}, DMA_TO_DEVICE); |
186 return NETDEV_TX_OK; | 314 return NETDEV_TX_OK; |
187 } | 315 } |
188 } | 316 } |
189 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti | 317 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti |
190 --- a/rathaxes/samples/e1000/e1000.rti | 318 --- a/rathaxes/samples/e1000/e1000.rti |
280 - device: ${self}->pci_dev->data.dev; | 408 - device: ${self}->pci_dev->data.dev; |
281 + /* | 409 + /* |
282 + * XXX: I'd like to be able to do things like: | 410 + * XXX: I'd like to be able to do things like: |
283 + * device: ${self.pci_dev.k_pci_dev}->dev; | 411 + * device: ${self.pci_dev.k_pci_dev}->dev; |
284 + * | 412 + * |
285 + * Btw, should this be ${PCI::AbstractDevice} instead of directly | 413 + * Also, using ${PCI::AbstractDevice} instead of directly struct |
286 + * struct pci_dev? | 414 + * pci_dev doesn't work. |
287 + */ | 415 + */ |
288 + device: ((struct pci_dev *)(${self})->pci_dev)->dev; | 416 + device: (&((struct pci_dev *)(${self})->pci_dev)->dev); |
289 pci_device: ${self}->pci_dev; | 417 pci_device: ${self}->pci_dev; |
290 net_device: ${self}->net_dev; | 418 net_device: ${self}->net_dev; |
291 - perm_addr: ${self}->net_dev->ndev.perm_addr; | 419 - perm_addr: ${self}->net_dev->ndev.perm_addr; |
292 - dev_addr: ${self}->net_dev->ndev.dev_addr; | 420 - dev_addr: ${self}->net_dev->ndev.dev_addr; |
293 + perm_addr: ((struct net_device *)(${self})->net_dev)->perm_addr; | 421 + perm_addr: ((struct net_device *)(${self})->net_dev)->perm_addr; |
346 + error: | 474 + error: |
347 + return error; | 475 + return error; |
348 } | 476 } |
349 } | 477 } |
350 } | 478 } |
351 @@ -162,11 +210,23 @@ | 479 @@ -162,10 +210,24 @@ |
352 { | 480 { |
353 static int rtx_ethernet_close(struct net_device *dev) | 481 static int rtx_ethernet_close(struct net_device *dev) |
354 { | 482 { |
355 - ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev); | 483 - ${Ethernet::Device} *rtx_ether_ctx = netdev_priv(dev); |
356 + ${Ethernet::AbstractDevice} *rtx_net_dev; | 484 + ${Ethernet::AbstractDevice} *rtx_net_dev; |
359 + ${local.rtx_net_dev.init(local.dev)}; | 487 + ${local.rtx_net_dev.init(local.dev)}; |
360 + } | 488 + } |
361 | 489 |
362 + ${Ethernet::Device} *rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx}; | 490 + ${Ethernet::Device} *rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx}; |
363 ${cast local.rtx_ether_ctx as Ethernet::Device}; | 491 ${cast local.rtx_ether_ctx as Ethernet::Device}; |
492 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; | |
364 + | 493 + |
365 + /* TODO: change this pointcut into a pointcut/adapter/callback: */ | 494 + /* TODO: change this pointcut into a pointcut/adapter/callback: */ |
366 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; | 495 + { |
367 | 496 + ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; |
497 + } | |
498 + | |
368 + free_irq(${local.rtx_ether_ctx.irq}, ${local.rtx_net_dev.k_net_dev}); | 499 + free_irq(${local.rtx_ether_ctx.irq}, ${local.rtx_net_dev.k_net_dev}); |
369 + { | 500 + { |
370 + ${Log::info("interrupt handler free'ed")}; | 501 + ${Log::info("interrupt handler free'ed")}; |
371 + } | 502 + } |
372 + | 503 |
373 return 0; | 504 return 0; |
374 } | 505 } |
375 } | 506 @@ -187,9 +249,13 @@ |
376 @@ -187,9 +247,13 @@ | |
377 { | 507 { |
378 static enum irqreturn rtx_ethernet_interrupt_handler(int irq, void *dev_id) | 508 static enum irqreturn rtx_ethernet_interrupt_handler(int irq, void *dev_id) |
379 { | 509 { |
380 - ${Ethernet::Device} *rtx_ether_ctx = dev_id; | 510 - ${Ethernet::Device} *rtx_ether_ctx = dev_id; |
381 + ${Ethernet::AbstractDevice} *rtx_net_dev = dev_id; | 511 + ${Ethernet::AbstractDevice} *rtx_net_dev = dev_id; |
386 + rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx}; | 516 + rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx}; |
387 + | 517 + |
388 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; | 518 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)}; |
389 | 519 |
390 return IRQ_NONE; | 520 return IRQ_NONE; |
391 @@ -219,23 +283,26 @@ | 521 @@ -219,23 +285,26 @@ |
392 */ | 522 */ |
393 chunk PCI::pci_probe_hook(PCI::Device rtx_pci_dev) | 523 chunk PCI::pci_probe_hook(PCI::Device rtx_pci_dev) |
394 { | 524 { |
395 + ${Ethernet::AbstractDevice} *rtx_net_dev; | 525 + ${Ethernet::AbstractDevice} *rtx_net_dev; |
396 ${Ethernet::Device} *rtx_ether_ctx; | 526 ${Ethernet::Device} *rtx_ether_ctx; |
422 - error = register_netdev(&${local.net_dev.netdev}); | 552 - error = register_netdev(&${local.net_dev.netdev}); |
423 + error = register_netdev(${local.rtx_net_dev.k_net_dev}); | 553 + error = register_netdev(${local.rtx_net_dev.k_net_dev}); |
424 if (error) | 554 if (error) |
425 { | 555 { |
426 ${Log::info("cannot register the driver in the net subsystem")}; | 556 ${Log::info("cannot register the driver in the net subsystem")}; |
427 @@ -247,14 +314,11 @@ | 557 @@ -247,14 +316,11 @@ |
428 * XXX: the cast is here because the compiler resolve the | 558 * XXX: the cast is here because the compiler resolve the |
429 * type of rtx_pci_dev.pci_device to the type of | 559 * type of rtx_pci_dev.pci_device to the type of |
430 * rtx_pci_dev instead of the type of rtx_pci_dev.pci_device. | 560 * rtx_pci_dev instead of the type of rtx_pci_dev.pci_device. |
431 - * | 561 - * |
432 - * Also, I'm getting placeholder in the generated code if | 562 - * Also, I'm getting placeholder in the generated code if |
441 + { /* XXX: I end up with a placeholder if I don't open a scope */ | 571 + { /* XXX: I end up with a placeholder if I don't open a scope */ |
442 + ${local.rtx_ether_ctx.init(local.rtx_net_dev, local.workaround)}; | 572 + ${local.rtx_ether_ctx.init(local.rtx_net_dev, local.workaround)}; |
443 } | 573 } |
444 | 574 |
445 /* Register ourselves in the parent context: */ | 575 /* Register ourselves in the parent context: */ |
446 @@ -267,19 +331,16 @@ | 576 @@ -267,19 +333,16 @@ |
447 */ | 577 */ |
448 int bars = ${rtx_pci_dev.bars}; | 578 int bars = ${rtx_pci_dev.bars}; |
449 unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr}; | 579 unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr}; |
450 - int irq = ${rtx_pci_dev.irq}; | 580 - int irq = ${rtx_pci_dev.irq}; |
451 ${cast local.bars as Builtin::number}; | 581 ${cast local.bars as Builtin::number}; |
463 - ${local.net_dev.netdev}.addr_len); | 593 - ${local.net_dev.netdev}.addr_len); |
464 + ${local.rtx_net_dev.k_net_dev}->addr_len); | 594 + ${local.rtx_net_dev.k_net_dev}->addr_len); |
465 } | 595 } |
466 | 596 |
467 /* This chunk should be removed (see #26) */ | 597 /* This chunk should be removed (see #26) */ |
468 @@ -296,15 +357,15 @@ | 598 @@ -296,15 +359,15 @@ |
469 */ | 599 */ |
470 chunk PCI::pci_remove_hook(PCI::Device rtx_pci_dev) | 600 chunk PCI::pci_remove_hook(PCI::Device rtx_pci_dev) |
471 { | 601 { |
472 - ${Ethernet::Device} *rtx_ether_ctx = ${rtx_pci_dev.context}; | 602 - ${Ethernet::Device} *rtx_ether_ctx = ${rtx_pci_dev.context}; |
473 - ${Ethernet::AbstractDevice} *rtx_ether_dev = (${Ethernet::AbstractDevice}*) ${local.rtx_ether_ctx.net_device}; | 603 - ${Ethernet::AbstractDevice} *rtx_ether_dev = (${Ethernet::AbstractDevice}*) ${local.rtx_ether_ctx.net_device}; |
620 - ${self}->bars = pci_select_bars(&${local.workaround.data}, IORESOURCE_MEM); | 750 - ${self}->bars = pci_select_bars(&${local.workaround.data}, IORESOURCE_MEM); |
621 + ${self}->bars = pci_select_bars(${local.workaround.k_pci_dev}, IORESOURCE_MEM); | 751 + ${self}->bars = pci_select_bars(${local.workaround.k_pci_dev}, IORESOURCE_MEM); |
622 ${self}->ioaddr = NULL; | 752 ${self}->ioaddr = NULL; |
623 ${self}->context = NULL; | 753 ${self}->context = NULL; |
624 } | 754 } |
625 @@ -97,18 +97,18 @@ | 755 @@ -97,20 +97,20 @@ |
626 { | 756 { |
627 ${PCI::AbstractDevice} *select_ioaddr_pdev = ${self}->pdev; | 757 ${PCI::AbstractDevice} *select_ioaddr_pdev = ${self}->pdev; |
628 ${cast local.select_ioaddr_pdev as PCI::AbstractDevice}; | 758 ${cast local.select_ioaddr_pdev as PCI::AbstractDevice}; |
629 - ${self}->ioaddr = pci_ioremap_bar(&${local.select_ioaddr_pdev.data}, ${bar}); | 759 - ${self}->ioaddr = pci_ioremap_bar(&${local.select_ioaddr_pdev.data}, ${bar}); |
630 + ${self}->ioaddr = pci_ioremap_bar(${local.select_ioaddr_pdev.k_pci_dev}, ${bar}); | 760 + ${self}->ioaddr = pci_ioremap_bar(${local.select_ioaddr_pdev.k_pci_dev}, ${bar}); |
639 map | 769 map |
640 { | 770 { |
641 - context: ${self}->context; | 771 - context: ${self}->context; |
642 - device: &${self}->pdev->data.dev; | 772 - device: &${self}->pdev->data.dev; |
643 + rtx_drv_context: ${self}->context; | 773 + rtx_drv_context: ${self}->context; |
644 + device: &((struct pci_dev *)(${self})->pdev->dev); | 774 + device: &((struct pci_dev *)(${self})->pdev)->dev; |
645 pci_device: ${self}->pdev; | 775 pci_device: ${self}->pdev; |
646 irq: ${self}->pdev->data.irq; | 776 - irq: ${self}->pdev->data.irq; |
777 + irq: ((struct pci_dev *)(${self})->pdev)->irq; | |
647 bars: ${self}->bars; | 778 bars: ${self}->bars; |
779 ioaddr: ${self}->ioaddr; | |
780 BAR_0: 0; | |
648 @@ -151,7 +151,7 @@ | 781 @@ -151,7 +151,7 @@ |
649 ${local.rtx_pci_dev.init(local.rtx_pdev)}; | 782 ${local.rtx_pci_dev.init(local.rtx_pdev)}; |
650 } | 783 } |
651 | 784 |
652 - /* ${local.pdev.set_context(local.rtx_pci_dev)}; */ | 785 - /* ${local.pdev.set_context(local.rtx_pci_dev)}; */ |
716 - data: ${self}->data; | 849 - data: ${self}->data; |
717 + k_sk_buff: ((struct sk_buff *)${self}); | 850 + k_sk_buff: ((struct sk_buff *)${self}); |
718 } | 851 } |
719 } | 852 } |
720 | 853 |
721 @@ -131,22 +131,22 @@ | 854 @@ -46,11 +46,12 @@ |
855 */ | |
856 ${Socket::AbstractSKBuff} *skb = self->skbuff; | |
857 ${cast local.skb as Socket::AbstractSKBuff}; | |
858 - ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.skb.data}.protocol) }; | |
859 + ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.skb.k_sk_buff}->protocol) }; | |
860 + | |
861 static const char * const ip_summed_values[] = { | |
862 "none", "unnecessary", "complete", "partial" | |
863 }; | |
864 - struct skb_shared_info *shinfo = skb_shinfo(&${local.skb.data}); | |
865 + struct skb_shared_info *shinfo = skb_shinfo(${local.skb.k_sk_buff}); | |
866 | |
867 pr_info( | |
868 "\t protocol = %#-5x (%s) ip_summed = %d (%s)\n" | |
869 @@ -59,8 +60,8 @@ | |
870 "\t gso_size = %-5u gso_segs = %-5u gso_type = %-5u", | |
871 /* XXX: can't use ${local.ethernet_proto.id} here (issue #52): */ | |
872 ethernet_proto.id, ${local.ethernet_proto.str}, | |
873 - ${local.skb.data}.ip_summed, ip_summed_values[${local.skb.data}.ip_summed], | |
874 - ${local.skb.data}.len, ${local.skb.data}.data_len, skb_headlen(&${local.skb.data}), | |
875 + ${local.skb.k_sk_buff}->ip_summed, ip_summed_values[${local.skb.k_sk_buff}->ip_summed], | |
876 + ${local.skb.k_sk_buff}->len, ${local.skb.k_sk_buff}->data_len, skb_headlen(${local.skb.k_sk_buff}), | |
877 shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type | |
878 ); | |
879 } | |
880 @@ -72,14 +73,13 @@ | |
881 ${Socket::AbstractSKBuff} *skb = self->skbuff; | |
882 ${cast local.skb as Socket::AbstractSKBuff}; | |
883 | |
884 - WARN_ON(!skb); | |
885 - WARN_ON(!${local.skb.data}.data); | |
886 + WARN_ON(!${local.skb.k_sk_buff}); | |
887 WARN_ON(self->dma_handle); | |
888 | |
889 self->dma_handle = dma_map_single( | |
890 dev, | |
891 - &${local.skb.data}.data, | |
892 - skb_headlen(&${local.skb.data}), | |
893 + ${local.skb.k_sk_buff}, | |
894 + skb_headlen(${local.skb.k_sk_buff}), | |
895 direction); | |
896 int err = dma_mapping_error(dev, self->dma_handle); | |
897 if (err) | |
898 @@ -97,18 +97,17 @@ | |
899 ${Socket::AbstractSKBuff} *skb = self->skbuff; | |
900 ${cast local.skb as Socket::AbstractSKBuff}; | |
901 | |
902 - WARN_ON(!${local.skb}); | |
903 - WARN_ON(!${local.skb.data}.data); | |
904 + WARN_ON(!${local.skb.k_sk_buff}); | |
905 | |
906 if (self->dma_handle) | |
907 { | |
908 dma_unmap_single(dev, | |
909 self->dma_handle, | |
910 - skb_headlen(&${local.skb.data}), | |
911 + skb_headlen(${local.skb.k_sk_buff}), | |
912 direction); | |
913 self->dma_handle = 0; | |
914 } | |
915 - dev_kfree_skb_any(&${local.skb.data}); | |
916 + dev_kfree_skb_any(${local.skb.k_sk_buff}); | |
917 self->skbuff = 0; | |
918 } | |
919 } | |
920 @@ -131,22 +130,22 @@ | |
722 | 921 |
723 method map_to(Device::AbstractDevice dev) | 922 method map_to(Device::AbstractDevice dev) |
724 { | 923 { |
725 - rtx_socket_skbuff_map(${self}, &${dev.data}, DMA_TO_DEVICE); | 924 - rtx_socket_skbuff_map(${self}, &${dev.data}, DMA_TO_DEVICE); |
726 + rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE); | 925 + rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE); |
746 | 945 |
747 map | 946 map |
748 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti | 947 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti |
749 --- a/rathaxes/samples/e1000/socket.rti | 948 --- a/rathaxes/samples/e1000/socket.rti |
750 +++ b/rathaxes/samples/e1000/socket.rti | 949 +++ b/rathaxes/samples/e1000/socket.rti |
751 @@ -5,7 +5,7 @@ | 950 @@ -5,7 +5,8 @@ |
752 { | 951 { |
753 chunk LKM::includes(); | 952 chunk LKM::includes(); |
754 decl data_types(); | 953 decl data_types(); |
755 - attribute Builtin::symbol data; | 954 - attribute Builtin::symbol data; |
955 + | |
756 + attribute Builtin::symbol k_sk_buff; | 956 + attribute Builtin::symbol k_sk_buff; |
757 } | 957 } |
758 | 958 |
759 provided type SKBuff | 959 provided type SKBuff |