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