annotate rathaxes_sample_e1000_rewrite_device_dependent_code.patch @ 131:c209851a82de

Wip, start a rewrite of the e1000 device dependent code
author Louis Opter <kalessin@kalessin.fr>
date Fri, 03 Jan 2014 15:01:47 +0100
parents
children f2e4dd91dc6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1 # HG changeset patch
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2 # Parent 7d00455945ec97c5851ac0d735da7c3cfbd8e39c
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
3 rathaxes: rewrite/refactor all the e1000 device dependent code
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
4
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
5 diff --git a/notes.txt b/notes.txt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
6 new file mode 100644
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
7 --- /dev/null
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
8 +++ b/notes.txt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
9 @@ -0,0 +1,9 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
10 +- Too much changes to not start over;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
11 +- Lack of methods is extremely annoying and requires a lot of workarounds (e.g:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
12 + see the register read/write/set/unset methods on e1000::Context);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
13 +- I'm using a pointcut inside the ethernet context "decl data_types" to inject
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
14 + my hardware context; it's impossible to get it back without hardcoding stuff,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
15 + because the ethernet subsystem isn't aware of the type of the field (so I
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
16 + can't write an attribute). Being able to just inject a type (instead of a
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
17 + whole structure field) might not be the best solution but would solve this
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
18 + issue/use case.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
19 diff --git a/rathaxes/samples/e1000/CMakeLists.txt b/rathaxes/samples/e1000/CMakeLists.txt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
20 --- a/rathaxes/samples/e1000/CMakeLists.txt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
21 +++ b/rathaxes/samples/e1000/CMakeLists.txt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
22 @@ -9,7 +9,6 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
23 pci.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
24 socket.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
25 ethernet.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
26 - e1000.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
27 BLT
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
28 log.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
29 lkm.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
30 @@ -17,9 +16,8 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
31 dma.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
32 pci.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
33 socket.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
34 - e1000.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
35 ethernet.blt)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
36
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
37 -IF (LINUX_KBUILD_DIR)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
38 - ADD_RATHAXES_LKM(e1000 e1000_src)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
39 -ENDIF (LINUX_KBUILD_DIR)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
40 +#IF (LINUX_KBUILD_DIR)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
41 +# ADD_RATHAXES_LKM(e1000 e1000_src)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
42 +#ENDIF (LINUX_KBUILD_DIR)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
43 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
44 --- a/rathaxes/samples/e1000/e1000.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
45 +++ b/rathaxes/samples/e1000/e1000.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
46 @@ -170,14 +170,15 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
47 for (i = 0; i != ${config.rx_ring_size}; ++i)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
48 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
49 ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i];
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
50 - // XXX #46: ${rtx_ether_ctx.init_rx_skbuff(local.skbuff, config.rx_buffer_len)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
51 - if (rtx_ethernet_init_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
52 + // XXX #46: ${rtx_ether_ctx.alloc_rx_skbuff(local.skbuff, config.rx_buffer_len)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
53 + if (rtx_ethernet_alloc_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
54 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
55 ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
56 goto err_skbuffs_alloc;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
57 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
58 - // XXX #46: ${local.skbuff.map_from(rtx_ether_ctx.device)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
59 - if (rtx_socket_skbuff_map(${local.skbuff}, ${rtx_ether_ctx.device}, RTX_DMA_FROM_DEVICE))
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
60 + /* XXX: recuperer le dma handle et le placer correctement dans le descripteur. */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
61 + ${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)}
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
62 + if (${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)})
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
63 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
64 ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
65 goto err_skbuffs_map;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
66 diff --git a/rathaxes/samples/e1000/e1000ng.blt b/rathaxes/samples/e1000/e1000ng.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
67 new file mode 100755
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
68 --- /dev/null
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
69 +++ b/rathaxes/samples/e1000/e1000ng.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
70 @@ -0,0 +1,717 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
71 +with e1000ng, Ethernet, Socket, DMA, PCI, LKM, Log, Builtin
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
72 +{
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
73 + template type e1000::Register()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
74 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
75 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
76 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
77 + E1000_CTRL = 0x00000, /* Device Control - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
78 + E1000_CTRL_DUP = 0x00004, /* Device Control Duplicate (Shadow) - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
79 + E1000_STATUS = 0x00008, /* Device Status - RO */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
80 + E1000_EEPROM_FLASH = 0x00010, /* EEPROM/Flash Control - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
81 + E1000_EEPROM_READ = 0x00014, /* EEPROM Read - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
82 + E1000_CTRL_EXT = 0x00018, /* Extended Device Control - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
83 + E1000_FLA = 0x0001C, /* Flash Access - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
84 + E1000_MDIC = 0x00020, /* MDI Control - RW */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
85 + E1000_IMS = 0x000D0, /* Interrupt Mask Set */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
86 + E1000_IMC = 0x000D8, /* Interrupt Mask Clear */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
87 + E1000_ICR = 0x000C0, /* Interrupt Cause Read - R/clr */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
88 + E1000_FCAL = 0x00028, /* Flow Control Address Low */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
89 + E1000_FCAH = 0x0002c, /* Flow Control Address High */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
90 + E1000_FCT = 0x00030, /* Flow Control Type */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
91 + E1000_RCTL = 0x00100, /* Receive Control */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
92 + E1000_FCTTV = 0x00170, /* Flow Control Transmit Timer Value */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
93 + E1000_TCTL = 0x00400, /* Transmit Control */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
94 + E1000_CRCERRS = 0x04000, /* CRC Error Count (base address of the statistic register spaces) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
95 + E1000_RAL = 0x05400, /* Receive Address Low */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
96 + E1000_RAH = 0x05404, /* Receive Address High */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
97 + E1000_MTA = 0x05200, /* Multicast Table Array */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
98 + E1000_RDBAL = 0x02800, /* Receive Descriptor Base Address (Low 32 bits) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
99 + E1000_RDBAH = 0x02804, /* Receive Descriptor Base Address (High 32 bits) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
100 + E1000_RDLEN = 0x02808, /* Receive Descriptor Length */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
101 + E1000_RDH = 0x02810, /* Receive Descriptor Head */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
102 + E1000_RDT = 0x02818, /* Receive Descriptor Tail */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
103 + E1000_TDBAL = 0x03800, /* Transmit Descriptor Base Address (Low 32 bits) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
104 + E1000_TDBAH = 0x03804, /* Transmit Descriptor Base Address (High 33 bits) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
105 + E1000_TDLEN = 0x03808, /* Transmit Descriptor Length */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
106 + E1000_TDH = 0x03810, /* Transmit Descriptor Head */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
107 + E1000_TDT = 0x03818, /* Transmit Descriptor Tail */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
108 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
109 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
110 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
111 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
112 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
113 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
114 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
115 + template type e1000::Commands()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
116 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
117 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
118 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
119 + E1000_CMD_FD = 0x00000001, /* Full duplex.0=half; 1=full */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
120 + E1000_CMD_BEM = 0x00000002, /* Endian Mode.0=little,1=big */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
121 + E1000_CMD_PRIOR = 0x00000004, /* Priority on PCI. 0=rx,1=fair */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
122 + E1000_CMD_GIO_MASTER_DISABLE = 0x00000004, /* Blocks new Master requests */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
123 + E1000_CMD_LRST = 0x00000008, /* Link reset. 0=normal,1=reset */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
124 + E1000_CMD_TME = 0x00000010, /* Test mode. 0=normal,1=test */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
125 + E1000_CMD_SLE = 0x00000020, /* Serial Link on 0=dis,1=en */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
126 + E1000_CMD_ASDE = 0x00000020, /* Auto-speed detect enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
127 + E1000_CMD_SLU = 0x00000040, /* Set link up (Force Link) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
128 + E1000_CMD_ILOS = 0x00000080, /* Invert Loss-Of Signal */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
129 + E1000_CMD_SPD_SEL = 0x00000300, /* Speed Select Mask */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
130 + E1000_CMD_SPD_10 = 0x00000000, /* Force 10Mb */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
131 + E1000_CMD_SPD_100 = 0x00000100, /* Force 100Mb */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
132 + E1000_CMD_SPD_1000 = 0x00000200, /* Force 1Gb */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
133 + E1000_CMD_BEM32 = 0x00000400, /* Big Endian 32 mode */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
134 + E1000_CMD_FRCSPD = 0x00000800, /* Force Speed */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
135 + E1000_CMD_FRCDPX = 0x00001000, /* Force Duplex */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
136 + E1000_CMD_D_UD_EN = 0x00002000, /* Dock/Undock enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
137 + E1000_CMD_D_UD_POLARITY = 0x00004000, /* Defined polarity of Dock/Undock indication in SDP[0] */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
138 + E1000_CMD_FORCE_PHY_RESET = 0x00008000, /* Reset both PHY ports, through PHYRST_N pin */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
139 + E1000_CMD_EXT_LINK_EN = 0x00010000, /* enable link status from external LINK_0 and LINK_1 pins */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
140 + E1000_CMD_SWDPIN0 = 0x00040000, /* SWDPIN 0 value */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
141 + E1000_CMD_SWDPIN1 = 0x00080000, /* SWDPIN 1 value */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
142 + E1000_CMD_SWDPIN2 = 0x00100000, /* SWDPIN 2 value */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
143 + E1000_CMD_SWDPIN3 = 0x00200000, /* SWDPIN 3 value */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
144 + E1000_CMD_SWDPIO0 = 0x00400000, /* SWDPIN 0 Input or output */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
145 + E1000_CMD_SWDPIO1 = 0x00800000, /* SWDPIN 1 input or output */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
146 + E1000_CMD_SWDPIO2 = 0x01000000, /* SWDPIN 2 input or output */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
147 + E1000_CMD_SWDPIO3 = 0x02000000, /* SWDPIN 3 input or output */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
148 + E1000_CMD_RST = 0x04000000, /* Global reset */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
149 + E1000_CMD_RFCE = 0x08000000, /* Receive Flow Control enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
150 + E1000_CMD_TFCE = 0x10000000, /* Transmit flow control enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
151 + E1000_CMD_RTE = 0x20000000, /* Routing tag enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
152 + E1000_CMD_VME = 0x40000000, /* IEEE VLAN mode enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
153 + E1000_CMD_PHY_RST = 0x80000000, /* PHY Reset */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
154 + E1000_CMD_SW2FW_INT = 0x02000000, /* Initiate an interrupt to manageability engine */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
155 + E1000_INTR_TXDW = 0x00000001, /* Transmit desc written back */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
156 + E1000_INTR_TXQE = 0x00000002, /* Transmit Queue empty */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
157 + E1000_INTR_LSC = 0x00000004, /* Link Status Change */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
158 + E1000_INTR_RXSEQ = 0x00000008, /* rx sequence error */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
159 + E1000_INTR_RXDMT0 = 0x00000010, /* rx desc min. threshold (0) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
160 + E1000_INTR_RXO = 0x00000040, /* rx overrun */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
161 + E1000_INTR_RXT0 = 0x00000080, /* rx timer intr (ring 0) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
162 + E1000_INTR_MDAC = 0x00000200, /* MDIO access complete */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
163 + E1000_RAH_AV = (1 << 31), /* Set the MAC Address as Valid */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
164 + E1000_RCTL_EN = (1 << 1), /* Receiver Enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
165 + E1000_RCTL_BSEX = (1 << 25), /* Buffer Size Extension */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
166 + E1000_RCTL_BSIZE_256 = ((1 << 16) | (1 << 17)),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
167 + E1000_RCTL_BSIZE_512 = (1 << 17),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
168 + E1000_RCTL_BSIZE_1024 = (1 << 16),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
169 + E1000_RCTL_BSIZE_2048 = 0,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
170 + E1000_RCTL_BSIZE_4096 = (E1000_RCTL_BSEX | (1 << 16) | (1 << 17)),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
171 + E1000_RCTL_BSIZE_8192 = (E1000_RCTL_BSEX | (1 << 17)),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
172 + E1000_RCTL_BSIZE_16384 = (E1000_RCTL_BSEX | (1 << 16)),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
173 + E1000_TCTL_EN = (1 << 1), /* Transmitter Enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
174 + E1000_TCTL_PSP = (1 << 3), /* Pad Short Packet */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
175 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
176 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
177 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
178 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
179 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
180 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
181 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
182 + template type e1000::TxDescriptorFlag()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
183 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
184 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
185 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
186 + E1000_TXD_DTYP_D = 0x00100000, /* Data Descriptor */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
187 + E1000_TXD_DTYP_C = 0x00000000, /* Context Descriptor */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
188 + E1000_TXD_POPTS_IXSM = 0x01, /* Insert IP checksum */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
189 + E1000_TXD_POPTS_TXSM = 0x02, /* Insert TCP/UDP checksum */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
190 + E1000_TXD_CMD_EOP = 0x01000000, /* End of Packet */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
191 + E1000_TXD_CMD_IFCS = 0x02000000, /* Insert FCS (Ethernet CRC) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
192 + E1000_TXD_CMD_IC = 0x04000000, /* Insert Checksum */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
193 + E1000_TXD_CMD_RS = 0x08000000, /* Report Status */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
194 + E1000_TXD_CMD_RPS = 0x10000000, /* Report Packet Sent */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
195 + E1000_TXD_CMD_DEXT = 0x20000000, /* Descriptor extension (0 = legacy) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
196 + E1000_TXD_CMD_VLE = 0x40000000, /* Add VLAN tag */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
197 + E1000_TXD_CMD_IDE = 0x80000000, /* Enable Tidv register */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
198 + E1000_TXD_STAT_DD = 0x00000001, /* Descriptor Done */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
199 + E1000_TXD_STAT_EC = 0x00000002, /* Excess Collisions */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
200 + E1000_TXD_STAT_LC = 0x00000004, /* Late Collisions */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
201 + E1000_TXD_STAT_TU = 0x00000008, /* Transmit underrun */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
202 + E1000_TXD_CMD_TCP = 0x01000000, /* TCP packet */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
203 + E1000_TXD_CMD_IP = 0x02000000, /* IP packet */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
204 + E1000_TXD_CMD_TSE = 0x04000000, /* TCP Seg enable */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
205 + E1000_TXD_STAT_TC = 0x00000004, /* Tx Underrun */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
206 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
207 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
208 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
209 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
210 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
211 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
212 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
213 + template type e1000::RxDescriptor()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
214 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
215 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
216 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
217 + __le64 buff_addr;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
218 + __le16 length;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
219 + __le16 csum;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
220 + unsigned char status;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
221 + unsigned char errors;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
222 + __le16 special;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
223 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
224 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
225 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
226 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
227 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
228 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
229 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
230 + // This is a generic tx descriptor for the e1000. When you use TCP
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
231 + // Segmentation Offload (TSO) the hardware actually uses two types of
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
232 + // tx descriptors in its tx ring:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
233 + // - context descriptors: this descriptor doesn't actually point to data to
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
234 + // send but initialize the offloading engine for the data descriptor that
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
235 + // follow;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
236 + // - data descriptors: this descriptor points to data from the skbuffs.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
237 + template type e1000::TxDescriptor()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
238 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
239 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
240 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
241 + __le64 buff_addr;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
242 + union {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
243 + __le32 data;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
244 + struct {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
245 + __le16 length;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
246 + unsigned char csum_offset; /* CSO */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
247 + unsigned char cmd;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
248 + } fields;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
249 + } lower;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
250 + union {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
251 + __le32 data;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
252 + struct {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
253 + unsigned char status;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
254 + unsigned char csum_start; /* CSS */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
255 + __le16 special;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
256 + } fields;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
257 + } upper;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
258 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
259 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
260 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
261 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
262 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
263 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
264 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
265 + template type e1000::Buffer()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
266 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
267 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
268 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
269 + ${Socket::SKBuff} sk_buff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
270 + ${DMA::DMAHandle} dma;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
271 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
272 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
273 + method init(Socket::SKBuff sk_buff, DMA::DMAHandle dma)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
274 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
275 + ${self.sk_buff} = ${sk_buff};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
276 + ${self.dma} = ${dma};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
277 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
278 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
279 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
280 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
281 + sk_buff: ${self}->sk_buff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
282 + dma: ${self}->dma;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
283 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
284 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
285 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
286 + template type e1000::MMIO
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
287 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
288 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
289 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
290 + unsigned char *io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
291 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
292 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
293 + // XXX: we'll need those functions until we get working methods (#46):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
294 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
295 + chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
296 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
297 + static unsigned int rtx_e1000_reg_read32(${e1000::MMIO}, ${e1000::Register});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
298 + static void rtx_e1000_reg_write32(${e1000:::MMIO}, ${e1000::Register}, ${Builtin::number});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
299 + static void rtx_e1000_reg_set32(${e1000:::MMIO}, ${e1000::Register}, ${Builtin::number});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
300 + static void rtx_e1000_reg_unset32(${e1000:::MMIO}, ${e1000::Register}, ${Builtin::number});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
301 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
302 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
303 + chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
304 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
305 + static unsigned int rtx_e1000_reg_read32(${e1000::MMIO} io, ${e1000::Register} reg)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
306 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
307 + return ioread32(${local.io.io} + reg);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
308 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
309 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
310 + static void rtx_e1000_reg_write32(${e1000:::MMIO} io, ${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
311 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
312 + return iowrite32(value, ${local.io.io} + reg);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
313 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
314 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
315 + static void rtx_e1000_reg_set32(${e1000:::MMIO} io, ${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
316 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
317 + return iowrite32(rtx_e1000_reg_read32(io, reg) | value, ${local.io.io} + reg);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
318 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
319 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
320 + static void rtx_e1000_reg_unset32(${e1000:::MMIO} io, ${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
321 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
322 + return iowrite32(rtx_e1000_reg_read32(io, reg) & ~value, ${local.io.io} + reg);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
323 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
324 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
325 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
326 + method init(Builtin::symbol io)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
327 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
328 + ${self.io} = ${io};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
329 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
330 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
331 + method read32(${e1000::Register} reg)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
332 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
333 + ioread32(${self.io} + ${local.reg});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
334 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
335 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
336 + method write32(${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
337 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
338 + iowrite32(${local.value}, ${self.io} + ${local.reg});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
339 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
340 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
341 + method set32(${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
342 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
343 + iowrite32(ioread32(${self.io} + ${local.reg}) | value, ${self.io} + ${local.reg});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
344 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
345 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
346 + method unset32(${e1000::Register} reg, ${Builtin::number} value)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
347 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
348 + iowrite32(ioread32(${self.io} + ${local.reg}) & ~value, ${self.io} + ${local.reg});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
349 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
350 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
351 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
352 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
353 + io: ((unsigned char *)(${self}));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
354 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
355 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
356 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
357 + template type e1000::Ring()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
358 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
359 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
360 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
361 + ${e1000::MMIO} io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
362 + ${DMA::DMAHandle} dma;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
363 + ${Builtin::symbol.ref} descs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
364 + ${Builtin::number} size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
365 + ${e1000::Buffer.ref} buffs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
366 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
367 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
368 + chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
369 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
370 + static void rtx_e1000_ring_init(${e1000::Ring.ref}, ${e1000::MMIO},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
371 + ${Builtin::number}, ${Builtin::number});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
372 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
373 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
374 + chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
375 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
376 + static void rtx_e1000_ring_init(${e1000::Ring.ref} self,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
377 + ${e1000::MMIO} io,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
378 + ${Builtin::number} desc_count,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
379 + ${Builtin::number} desc_size)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
380 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
381 + memset(self, 0, sizeof(*self));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
382 + self->size = ALIGN(desc_count * desc_size, 4096);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
383 + self->io = io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
384 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
385 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
386 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
387 + method init(e1000::MMIO io, Builtin::number desc_count, Builtin::number desc_size)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
388 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
389 + rtx_e1000_ring_init(&${self}, ${io}, ${desc_count}, ${desc_size});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
390 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
391 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
392 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
393 + template type e1000::RxRing()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
394 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
395 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
396 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
397 + ${e1000::Ring} ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
398 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
399 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
400 + chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
401 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
402 + static int rtx_e1000_alloc_rx_ressources(${e1000::RxRing.ref});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
403 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
404 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
405 + chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
406 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
407 + static int rtx_e1000_alloc_rx_ressources(${e1000::RxRing.ref} self)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
408 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
409 + return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
410 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
411 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
412 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
413 + chunk Ethernet::adapter_init_rx(Ethernet::Device rtx_ether_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
414 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
415 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
416 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
417 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
418 + /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
419 + * Receive initialization (section 14.4):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
420 + *
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
421 + * 1. Program the receive address, in RAL/RAH;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
422 + * 2. Initialize the Multicast Table Array;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
423 + * 3. Program the interrupt mask register (done in
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
424 + * e1000::activate_device_interruption);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
425 + * 4. Allocate the receive descriptor ring and map it to make it
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
426 + * accessible by the device;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
427 + * 5. Write the start address of the ring in RDBAL/RDBAH and set
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
428 + * RDLEN (Receive Descriptor Length) to the size of the ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
429 + * 6. Set the RDH/RDT (Receive Descriptor Head/Tail) indexes to the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
430 + * beginning and end of the ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
431 + * 7. Make sure that RCTL.BSIZE and .BSEX are at 0 to configure the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
432 + * receive buffer size to 2048 bytes (e1000::rx_buffer_len).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
433 + * 8. Set RCTL.EN to enable the receiver.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
434 + *
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
435 + * The ugly casts here are caused by the lack of CNorm unstrict.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
436 + */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
437 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
438 + int i;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
439 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
440 + /* 1. Program the receive address */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
441 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
442 + /* (We should use uint{32,16}_t but CNorm doesn't know them yet) */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
443 + rtx_e1000_register_write32(hw_ctx, E1000_RAL,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
444 + *(unsigned int *)(${rtx_ether_ctx.dev_addr}));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
445 + /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
446 + * The 16 upper bits of RAH also store the AS bits (which should be
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
447 + * 0) and the AV bit (should be 1 to set the address as valid).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
448 + */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
449 + rtx_e1000_register_write32(hw_ctx, E1000_RAH,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
450 + *(unsigned short *)(&${rtx_ether_ctx.dev_addr}[4]));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
451 + rtx_e1000_register_set32(hw_ctx, E1000_RAH, E1000_RAH_AV);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
452 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
453 + ${Log::info("adapter_init_rx: receive address programmed")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
454 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
455 + /* 2. Initialize the MTA */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
456 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
457 + for (i = 0; i != 128; ++i)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
458 + rtx_e1000_register_write32(hw_ctx, E1000_MTA + i * 4, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
459 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
460 + ${Log::info("adapter_init_rx: MTA init done")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
461 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
462 + /* 4. Setup the receive descriptor ring */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
463 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
464 + /* Allocate the descriptors */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
465 + hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
466 + hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
467 + hw_ctx->rx_ring.base = ${DMA::alloc_coherent(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
468 + rtx_ether_ctx.device,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
469 + local.hw_ctx.rx_ring.size,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
470 + local.hw_ctx.rx_ring.dma_base.dma_handle
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
471 + )};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
472 + if (!hw_ctx->rx_ring.base)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
473 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
474 + ${Log::info("adapter_init_rx: cannot allocate the descriptors for the rx ring")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
475 + goto err_rx_ring_alloc;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
476 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
477 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
478 + ${Log::info("adapter_init_rx: rx descriptors allocated")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
479 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
480 + /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
481 + * Allocate the skbuffs, map them for DMA, and write their address
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
482 + * in the corresponding descriptor.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
483 + */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
484 + for (i = 0; i != ${config.rx_ring_size}; ++i)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
485 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
486 + ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i];
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
487 + // XXX #46: ${rtx_ether_ctx.alloc_rx_skbuff(local.skbuff, config.rx_buffer_len)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
488 + if (rtx_ethernet_alloc_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
489 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
490 + ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
491 + goto err_skbuffs_alloc;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
492 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
493 + /* XXX: recuperer le dma handle et le placer correctement dans le descripteur. */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
494 + ${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)}
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
495 + if (${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)})
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
496 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
497 + ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
498 + goto err_skbuffs_map;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
499 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
500 + hw_ctx->rx_ring.base[i].buff_addr = cpu_to_le64(${local.skbuff.sk_buff});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
501 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
502 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
503 + // ${Log::info("adapter_init_rx: skbuffs allocated};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
504 + pr_info("rtx_e1k: adapter_init_rx: skbuffs allocated, headlen=%d", skb_headlen((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i - 1].skbuff));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
505 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
506 + /* 5. Save the emplacement and the size of the ring in RDBA/RDLEN */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
507 + rtx_e1000_register_write32(hw_ctx, E1000_RDBAL, hw_ctx->rx_ring.dma_base & 0xffffffff);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
508 + rtx_e1000_register_write32(hw_ctx, E1000_RDBAH, hw_ctx->rx_ring.dma_base >> 32);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
509 + rtx_e1000_register_write32(hw_ctx, E1000_RDLEN, hw_ctx->rx_ring.size);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
510 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
511 + /* 6. Setup RDH/RDT */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
512 + rtx_e1000_register_write32(hw_ctx, E1000_RDH, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
513 + rtx_e1000_register_write32(hw_ctx, E1000_RDT, ${config.rx_ring_size} - 1);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
514 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
515 + /* 7. Configure the buffer size, */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
516 + rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_BSIZE_${config.rx_buffer_len});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
517 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
518 + /* 8. Enable the receiver */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
519 + rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_EN);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
520 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
521 + ${Log::info("adapter_init_rx: receive registers configured and receiver enabled")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
522 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
523 + /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
524 + * XXX: We can't return here since we are not in a function but
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
525 + * in a chunk of code (injected in a function).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
526 + */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
527 + goto init_rx_ok;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
528 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
529 + err_skbuffs_alloc:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
530 + while (i--) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
531 + dma_unmap_single(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
532 + ${rtx_ether_ctx.device},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
533 + /* XXX Leaking cast because of the array: */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
534 + *((dma_addr_t *)&(hw_ctx->rx_ring.skbuffs[i].dma_handle)),
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
535 + ${config.rx_buffer_len},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
536 + DMA_FROM_DEVICE);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
537 + err_skbuffs_map:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
538 + /* XXX leaking cast: */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
539 + dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
540 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
541 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
542 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
543 + hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
544 + err_rx_ring_alloc:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
545 + /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
546 + * XXX: Likewise, if there is something else to rollback in the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
547 + * enclosing function, this won't be done.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
548 + */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
549 + return -ENOMEM;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
550 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
551 + init_rx_ok: (void)0; /* NOP, to make this a valid label. */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
552 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
553 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
554 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
555 + method init(e1000::MMIO io, Builtin::number desc_count)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
556 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
557 + ${self.ring.init(local.io, local.desc_count, self.desc_size)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
558 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
559 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
560 + method alloc()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
561 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
562 + rtx_e1000_alloc_rx_ressources(${self});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
563 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
564 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
565 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
566 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
567 + descs: ((${self})->descs); // TODO: fix cast pour directement avoir les descs
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
568 + desc_size: sizeof(/* XXX ${e1000::RxDescriptor} */int);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
569 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
570 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
571 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
572 + template type e1000::TxRing()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
573 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
574 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
575 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
576 + ${e1000::Ring} ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
577 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
578 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
579 + chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
580 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
581 + static int rtx_e1000_alloc_tx_ressources(${e1000::TxRing.ref});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
582 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
583 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
584 + chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
585 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
586 + static int rtx_e1000_alloc_tx_ressources(${e1000::TxRing.ref} self)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
587 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
588 + return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
589 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
590 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
591 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
592 + method init(e1000::MMIO io, Builtin::number desc_count)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
593 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
594 + ${self.ring.init(local.io, local.desc_count, self.desc_size)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
595 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
596 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
597 + method alloc()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
598 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
599 + rtx_e1000_alloc_tx_ressources(${self});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
600 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
601 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
602 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
603 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
604 + descs: ((${self})->descs); // TODO: fix cast pour directement avoir les descs
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
605 + desc_size: sizeof(/* XXX ${e1000::TxDescriptor} */int);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
606 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
607 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
608 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
609 + template type e1000::Context()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
610 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
611 + decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
612 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
613 + ${e1000::MMIO} io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
614 + ${e1000::TxRing} tx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
615 + ${e1000::RxRing} rx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
616 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
617 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
618 + chunk LKM::includes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
619 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
620 + #include <linux/types.h>
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
621 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
622 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
623 + chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
624 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
625 + static void rtx_e1000_print_status(${e1000::Context.ref});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
626 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
627 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
628 + chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
629 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
630 + static void rtx_e1000_print_status(${e1000::Context.ref} hw_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
631 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
632 + unsigned int status = rtx_e1000_reg_read32(hw_ctx, E1000_STATUS);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
633 + ${Log::info("card status:")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
634 + // XXX We can't use Log::info below because it just accept a
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
635 + // string (as opposed to a format string with its parameters):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
636 + pr_info("\tRegister value: 0x%x\n", status);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
637 + pr_info("\tMode: %s\n", (status & 1) ? "Full": "Half");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
638 + pr_info("\tLink: %s\n", (status & 2) ? "Up" : "Down");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
639 + pr_info("\tTransmission: %s\n", (status & 4) ? "Paused" : "Ok");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
640 + pr_info("\tInterface: %s\n", (status & 3) == 3 ? "Up" : "Down");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
641 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
642 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
643 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
644 + chunk Ethernet::HardwareContext()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
645 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
646 + ${e1000::Context} hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
647 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
648 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
649 + chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx, Builtin::symbol ioaddr)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
650 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
651 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
652 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
653 + ${local.hw_ctx.io.init(local.ioaddr)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
654 + ${local.hw_ctx.rx_ring.init(local.hw_ctx.io, config.rx_ring_size)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
655 + ${local.hw_ctx.tx_ring.init(local.hw_ctx.io, config.tx_ring_size)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
656 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
657 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
658 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
659 + chunk Ethernet::adapter_reset(Ethernet::Device rtx_ether_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
660 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
661 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
662 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
663 + // XXX #46: ${local.hw_ctx.io.write32(E1000_CTRL, E1000_CMD_RST)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
664 + rtx_e1000_reg_write32(hw_ctx, E1000_CTRL, E1000_CMD_RST);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
665 + udelay(10); // TODO: abstract this too...
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
666 + ${Log::info("adapter has been reset")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
667 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
668 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
669 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
670 + chunk Ethernet::adapter_load_mac_address(Ethernet::Device rtx_ether_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
671 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
672 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
673 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
674 + // Shamelessly borrowed from Minix
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
675 + for (int i = 0; i < 3; ++i) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
676 + rtx_e1000_reg_write32(hw_ctx, E1000_EEPROM_READ, (i << 8) | 1);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
677 + int value;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
678 + do {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
679 + value = rtx_e1000_reg_read32(hw_ctx, E1000_EEPROM_READ);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
680 + } while ((value & (1 << 4)) == 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
681 + value >>= 16;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
682 + // NOTE: I'm not sure if Ethernet::Device should be
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
683 + // accessed directly here. But since we need to take it in
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
684 + // parameter (so we can get back our e1000::Context) it
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
685 + // seems inadequate to set this in another way:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
686 + ${local.rtx_ether_ctx.dev_addr}[i * 2] = value & 0xff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
687 + ${local.rtx_ether_ctx.dev_addr}[i * 2 + 1] = (value >> 8) & 0xff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
688 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
689 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
690 + ${Log::info("mac address loaded from the EEPROM")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
691 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
692 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
693 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
694 + chunk Ethernet::adapter_setup_rx_tx(Ethernet::Device rtx_ether_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
695 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
696 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
697 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
698 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
699 + // "General Configuration" (section 14.3):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
700 + //
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
701 + // - CTRL.ASDE/CTRL.SLU: Let the PHY handle the speed detection &
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
702 + // negociation;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
703 + // - CTRL.LRST/FRCSPD: Unset them to initiate the auto-negociation;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
704 + // - CTRL.PHY_RST: Unset it;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
705 + // - CTRL.ILOS: Unset it (ILOS is Invert Loss Of Signal);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
706 + // - CTRL.VME: Make sure it's not set to disable VLAN support;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
707 + // - Set the control flow registers to 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
708 + // - Finally, initialize all the statistic registers from
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
709 + // E1000_CRCERRS to E1000_TSCTFC.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
710 + //
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
711 + // XXX #46: Use the read/write/set/unset methods on Context
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
712 + rtx_e1000_reg_set32(hw_ctx, E1000_CTRL, E1000_CMD_ASDE|E1000_CMD_SLU);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
713 + rtx_e1000_reg_unset32(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
714 + hw_ctx,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
715 + E1000_CTRL,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
716 + E1000_CMD_LRST|E1000_CMD_FRCSPD|E1000_CMD_PHY_RST|
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
717 + E1000_CMD_ILOS|E1000_CMD_VME
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
718 + );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
719 + rtx_e1000_reg_write32(hw_ctx, E1000_FCAH, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
720 + rtx_e1000_reg_write32(hw_ctx, E1000_FCAL, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
721 + rtx_e1000_reg_write32(hw_ctx, E1000_FCT, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
722 + rtx_e1000_reg_write32(hw_ctx, E1000_FCTTV, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
723 + for (int i = 0; i != 64; ++i)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
724 + rtx_e1000_reg_write32(hw_ctx, E1000_CRCERRS + i * 4, 0);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
725 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
726 + ${Log::info("adapter_setup: general configuration done")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
727 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
728 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
729 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
730 + chunk Ethernet::adapter_enable_interrupts(Ethernet::Device)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
731 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
732 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
733 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
734 + rtx_e1000_reg_write32(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
735 + hw_ctx,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
736 + E1000_IMS,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
737 + E1000_INTR_TXDW|E1000_INTR_TXQE|E1000_INTR_LSC|
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
738 + E1000_INTR_RXO|E1000_INTR_RXT0
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
739 + );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
740 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
741 + // XXX We should probably move that elsewhere (it just used to
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
742 + // be done right after we enabled interrupts when this was
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
743 + // still in lkm.rtx):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
744 + ${local.hw_ctx.print_status()};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
745 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
746 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
747 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
748 + chunk Ethernet::handle_interrupt(Ethernet::Device rtx_ether_ctx)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
749 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
750 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
751 + ${e1000::Context.ref} hw_ctx = &${local.rtx_ether_ctx}->hw_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
752 + unsigned int icr = rtx_e1000_reg_read32(hw_ctx, E1000_ICR);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
753 + pr_info("%s: interrupt received, ICR: 0x%x", ${config.name}, icr);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
754 + if (icr) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
755 + if (icr & E1000_INTR_LSC) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
756 + ${Log::info("handle_interrupt: cable link status changed, dumping card status:")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
757 + ${local.hw_ctx.print_status()};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
758 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
759 + if (icr & (E1000_INTR_TXQE|E1000_INTR_TXDW)) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
760 + ${Log::info("handle_interrupt: TxRing: packet(s) sent")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
761 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
762 + if (icr & E1000_INTR_RXT0) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
763 + ${Log::info("handle_interrupt: RxRing: packet(s) received")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
764 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
765 + if (icr & E1000_INTR_RXO) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
766 + ${Log::info("handle_interrupt: RxRing: overrun")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
767 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
768 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
769 + // XXX: This sucks since we don't know the pointcut context:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
770 + return IRQ_HANDLED;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
771 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
772 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
773 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
774 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
775 + method print_status()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
776 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
777 + rtx_e1000_print_status(${self});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
778 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
779 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
780 + map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
781 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
782 + io: ${self}->io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
783 + rx_ring: ${self}->rx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
784 + tx_ring: ${self}->tx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
785 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
786 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
787 +}
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
788 diff --git a/rathaxes/samples/e1000/e1000ng.rti b/rathaxes/samples/e1000/e1000ng.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
789 new file mode 100755
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
790 --- /dev/null
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
791 +++ b/rathaxes/samples/e1000/e1000ng.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
792 @@ -0,0 +1,122 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
793 +interface e1000ng : Socket, Ethernet, DMA, PCI, LKM, Builtin
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
794 +{
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
795 + required variable Builtin::number rx_ring_size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
796 + required variable Builtin::number tx_ring_size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
797 + required variable Builtin::number rx_buffer_len;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
798 + required variable Builtin::number tx_max_data_per_desc;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
799 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
800 + // Hardware values/data structures, should probably be in the front-end:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
801 + provided type Register { decl data_types(); }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
802 + provided type Command { decl data_types(); }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
803 + provided type TxDescriptorFlag { decl data_types(); }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
804 + provided type RxDescriptor { decl data_types(); }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
805 + provided type TxDescriptor { decl data_types(); }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
806 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
807 + provided type Buffer
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
808 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
809 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
810 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
811 + method init(Socket::SKBuff, DMA::DMAHandle);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
812 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
813 + attribute Socket::SKBuff.ref sk_buff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
814 + attribute DMA::DMAHandle.ref dma;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
815 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
816 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
817 + // I wish we could just leave those methods in the Context type but we also
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
818 + // need them from the rings and that would mean a circular dependency
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
819 + // between the context and the rings and Rathaxes can't handle it.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
820 + provided type MMIO
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
821 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
822 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
823 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
824 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
825 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
826 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
827 + method init(Builtin::symbol);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
828 + method read32(Register);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
829 + method write32(Register, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
830 + method set32(Register, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
831 + method unset32(Register, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
832 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
833 + attribute Builtin::symbol io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
834 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
835 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
836 + provided type Ring
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
837 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
838 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
839 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
840 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
841 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
842 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
843 + method init(MMIO, Builtin::number, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
844 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
845 + attribute MMIO io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
846 + attribute DMA:DMAHandle dma;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
847 + attribute Builtin::number size; // Total size in bytes
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
848 + attribute Builtin::symbol.ref descs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
849 + attribute Buffer.ref buffs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
850 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
851 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
852 + provided type RxRing
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
853 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
854 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
855 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
856 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
857 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
858 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
859 + method init(MMIO, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
860 + method alloc(); // Returns != 0 on failure
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
861 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
862 + attribute RxDescriptor descs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
863 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
864 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
865 + provided type TxRing
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
866 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
867 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
868 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
869 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
870 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
871 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
872 + method init(MMIO, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
873 + method alloc(); // Returns != 0 on failure
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
874 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
875 + attribute TxDescriptor descs;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
876 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
877 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
878 + provided type Context
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
879 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
880 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
881 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
882 + chunk LKM::includes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
883 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
884 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
885 + chunk Ethernet::HardwareContext();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
886 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
887 + // NOTE: Those callbacks/hooks should probably be in the front-end:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
888 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
889 + // Init the hardware context structure, doesn't allocate anything.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
890 + chunk Ethernet::adapter_init_context(Ethernet::Device, Builtin::symbol);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
891 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
892 + // Reset the adapter
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
893 + chunk Ethernet::adapter_reset(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
894 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
895 + // Load the MAC address from the EEPROM and save it into the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
896 + // dev_addr field/attribute of Ethernet::Device.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
897 + chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
898 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
899 + // Prepare the device and the resources for rx/tx.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
900 + chunk Ethernet::adapter_setup_rx_tx(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
901 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
902 + // Enable interrupts.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
903 + chunk Ethernet::adapter_enable_interrupts(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
904 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
905 + // Interrupt handler.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
906 + chunk Ethernet::handle_interrupt(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
907 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
908 + method print_status();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
909 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
910 + attribute MMIO io;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
911 + attribute RxRing.scalar rx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
912 + attribute TxRing.scalar tx_ring;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
913 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
914 +}
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
915 diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
916 --- a/rathaxes/samples/e1000/ethernet.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
917 +++ b/rathaxes/samples/e1000/ethernet.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
918 @@ -106,7 +106,7 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
919 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
920 ${Socket::AbstractSKBuff} k_sk_buff = netdev_alloc_skb(${local.self.net_device.k_net_dev}, ${local.size});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
921 if (${local.k_sk_buff) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
922 - ${local.sk_buff.init(local.k_sk_buff, local.size)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
923 + ${local.sk_buff.init(local.k_sk_buff)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
924 return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
925 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
926 return 1;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
927 @@ -164,34 +164,30 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
928 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
929 static int rtx_ethernet_open(struct net_device *dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
930 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
931 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
932 - * XXX The casts are here because the compiler doesn't resolve
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
933 - * "enclosed" type (e.g: local.var.enclosed) correctly.
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
934 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
935 ${Ethernet::AbstractDevice.ref} rtx_net_dev;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
936 { /* XXX: I end up with a placeholder if I don't open a scope */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
937 ${local.rtx_net_dev.init(local.dev)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
938 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
939 ${Ethernet::Device.ref} rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
940
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
941 - int error;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
942 + ${pointcut Ethernet::adapter_setup_rx_tx(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
943 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
944 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
945 - ${Log::info("installing the interrupt handler")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
946 + ${Log::info("Installing the interrupt handler")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
947 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
948 - error = request_irq(${local.rtx_ether_ctx.irq},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
949 - rtx_ethernet_interrupt_handler,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
950 - IRQF_SHARED,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
951 - ${config.name},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
952 - dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
953 - if (error)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
954 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
955 + int error = request_irq(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
956 + ${local.rtx_ether_ctx.irq},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
957 + rtx_ethernet_interrupt_handler,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
958 + IRQF_SHARED,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
959 + ${config.name},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
960 + dev
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
961 + );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
962 + if (error) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
963 ${Log::info("Cannot register the interrupt handler")};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
964 return error;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
965 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
966 - ${pointcut Ethernet::adapter_setup(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
967 - ${pointcut Ethernet::adapter_init_rx(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
968 - ${pointcut Ethernet::adapter_init_tx(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
969 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
970 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
971 + ${pointcut Ethernet::adapter_enable_interrupts(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
972
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
973 return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
974 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
975 @@ -269,7 +265,7 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
976 ${Ethernet::Device.ref} rtx_ether_ctx;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
977 rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
978
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
979 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
980 + ${pointcut Ethernet::handle_interrupt(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
981
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
982 return IRQ_NONE;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
983 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
984 @@ -342,12 +338,8 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
985 * XXX: the asssignments/casts are here to circumvent
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
986 * typing issues in the compiler (see previous XXX).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
987 */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
988 - int bars = ${rtx_pci_dev.bars};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
989 unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
990 - ${cast local.bars as Builtin::number};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
991 - ${pointcut Ethernet::adapter_init_context(local.rtx_ether_ctx,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
992 - local.bars,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
993 - local.ioaddr)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
994 + ${pointcut Ethernet::adapter_init_context(local.rtx_ether_ctx, local.ioaddr)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
995 ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
996 ${pointcut Ethernet::adapter_load_mac_address(local.rtx_ether_ctx)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
997 memcpy(${local.rtx_ether_ctx.perm_addr},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
998 diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
999 --- a/rathaxes/samples/e1000/ethernet.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1000 +++ b/rathaxes/samples/e1000/ethernet.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1001 @@ -28,8 +28,12 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1002
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1003 provided type Device
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1004 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1005 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1006 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1007 chunk LKM::includes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1008 - decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1009 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1010 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1011 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1012 pointcut Ethernet::HardwareContext();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1013
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1014 method init(Ethernet::AbstractDevice, PCI::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1015 @@ -51,7 +55,7 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1016 attribute Builtin::symbol.scalar irq;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1017 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1018
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1019 - required sequence open(Ethernet::Device)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1020 + provided sequence open(Ethernet::Device)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1021 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1022 provided chunk LKM::includes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1023 provided chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1024 @@ -62,9 +66,8 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1025 * Controller Software Developper manual. (You can find it in the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1026 * doc/hardware directory).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1027 */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1028 - provided pointcut Ethernet::adapter_setup(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1029 - provided pointcut Ethernet::adapter_init_rx(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1030 - provided pointcut Ethernet::adapter_init_tx(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1031 + provided pointcut Ethernet::adapter_setup_rx_tx(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1032 + provided pointcut Ethernet::adapter_enable_interrupts(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1033 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1034
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1035 required sequence send(Ethernet::Device, Socket::AbstractSKBuff)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1036 @@ -79,10 +82,12 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1037 provided chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1038 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1039
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1040 - required sequence interrupt_handler(Ethernet::Device)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1041 + provided sequence interrupt_handler(Ethernet::Device)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1042 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1043 provided chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1044 provided chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1045 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1046 + provided pointcut Ethernet::handle_interrupt(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1047 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1048
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1049 provided sequence init()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1050 @@ -90,9 +95,7 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1051 provided chunk LKM::data();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1052 provided chunk PCI::pci_probe_hook(PCI::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1053
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1054 - provided pointcut Ethernet::adapter_init_context(Ethernet::Device,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1055 - Builtin::number,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1056 - Builtin::symbol);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1057 + provided pointcut Ethernet::adapter_init_context(Ethernet::Device, Builtin::symbol);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1058 provided pointcut Ethernet::adapter_reset(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1059 provided pointcut Ethernet::adapter_load_mac_address(Ethernet::Device);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1060 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1061 diff --git a/rathaxes/samples/e1000/lkm.rtx b/rathaxes/samples/e1000/lkm.rtx
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1062 --- a/rathaxes/samples/e1000/lkm.rtx
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1063 +++ b/rathaxes/samples/e1000/lkm.rtx
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1064 @@ -1,34 +1,5 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1065 device LKM use LKM, PCI, Ethernet, Log, Socket
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1066 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1067 - Ethernet::open(Ethernet::Device dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1068 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1069 - Log::info("opening the device");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1070 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1071 - e1000::activate_device_interruption(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1072 - Log::info("interruption enabled");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1073 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1074 - e1000::print_status(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1075 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1076 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1077 - Ethernet::close(Ethernet::Device dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1078 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1079 - Log::info("closing the device");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1080 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1081 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1082 - * Note: some calls to release resources must be done when IRQs are
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1083 - * enabled (dma_free_coherent() for example). So we have to cleanup our
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1084 - * stuff before free_interrupt_handler().
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1085 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1086 - e1000::free_rx_tx(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1087 - Log::info("free'ed up rx/tx resources");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1088 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1089 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1090 - Ethernet::interrupt_handler(Ethernet::Device dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1091 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1092 - Log::info("got an interruption");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1093 - e1000::handle_interrupt(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1094 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1095 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1096 Ethernet::send(Ethernet::Device dev, Socket::AbstractSKBuff skb)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1097 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1098 Log::info("we have one packet to transmit!");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1099 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1100 --- a/rathaxes/samples/e1000/socket.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1101 +++ b/rathaxes/samples/e1000/socket.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1102 @@ -22,16 +22,12 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1103 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1104 decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1105 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1106 - ${Socket::AbstractSKBuff.ref} skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1107 - ${DMA::AbstractDMAHandle.scalar} dma_handle;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1108 - unsigned int size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1109 + ${Socket::AbstractSKBuff.ref} skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1110 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1111
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1112 chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1113 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1114 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1115 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1116 - static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1117 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1118
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1119 chunk LKM::code()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1120 @@ -63,85 +59,6 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1121 shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1122 );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1123 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1124 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1125 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1126 - ${Device::AbstractDevice.ref} dev,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1127 - ${DMA::DMADirection.scalar} direction)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1128 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1129 - WARN_ON(!${local.self.sk_buff});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1130 - WARN_ON(${local.self.dma_handle});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1131 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1132 - * TODO: we don't support skbuffs with paged data yet (see also
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1133 - * http://vger.kernel.org/~davem/skb_data.html).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1134 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1135 - WARN_ON(skb_is_nonlinear(${local.self.sk_buff.k_sk_buff}));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1136 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1137 - unsigned int len = ${local.self.size};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1138 - ${cast local.len as Builtin::number};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1139 - ${local.self.dma_handle} = ${DMA::map(local.dev, local.self.sk_buff.k_sk_buff, local.len, local.direction)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1140 - int err = ${DMA::mapping_error(local.dev, local.self.dma_handle)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1141 - if (err)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1142 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1143 - ${local.self.dma_handle} = 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1144 - return err;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1145 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1146 - return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1147 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1148 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1149 - static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1150 - ${Device::AbstractDevice.ref} dev,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1151 - ${DMA::DMADirection} direction)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1152 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1153 - WARN_ON(!${local.self.sk_buff});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1154 - WARN_ON(skb_is_nonlinear(${local.self.sk_buff.k_sk_buff});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1155 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1156 - if (${local.self.dma_handle})
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1157 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1158 - unsigned int len = ${local.self.size};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1159 - ${cast local.len as Builtin::number};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1160 - ${DMA::unmap(local.dev, local.self.dma_handle, local.len, local.direction)};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1161 - ${local.self.dma_handle} = 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1162 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1163 - dev_kfree_skb_any(${local.self.sk_buff.k_sk_buff});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1164 - ${local.self.sk_buff} = NULL;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1165 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1166 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1167 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1168 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1169 - * XXX: the rathaxes argument kernel_skb is not actually bound to the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1170 - * correct C variable from Ethernet::send() (so I named it as the C
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1171 - * variable I needed)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1172 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1173 - method init(Socket::AbstractSKBuff kernel_skb, Builtin::number size)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1174 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1175 - ${self.sk_buff} = ${kernel_skb};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1176 - ${self.size} = ${size};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1177 - ${self.dma_handle} = 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1178 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1179 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1180 - method dump_infos()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1181 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1182 - rtx_socket_skbuff_dump_infos(${self});
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1183 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1184 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1185 - method map_to(Device::AbstractDevice dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1186 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1187 - rtx_socket_skbuff_map(${self}, ${dev}, RTX_DMA_TO_DEVICE);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1188 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1189 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1190 - method map_from(Device::AbstractDevice dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1191 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1192 - rtx_socket_skbuff_map(${self}, ${dev}, RTX_DMA_FROM_DEVICE);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1193 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1194 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1195 - method unmap_to_and_free(Device::AbstractDevice dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1196 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1197 - rtx_socket_skbuff_unmap_and_free(${self}, ${dev}, RTX_DMA_TO_DEVICE);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1198 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1199 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1200 - method unmap_from_and_free(Device::AbstractDevice dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1201 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1202 - rtx_socket_skbuff_unmap_and_free(${self}, ${dev}, RTX_DMA_FROM_DEVICE);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1203 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1204
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1205 map
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1206 @@ -151,13 +68,9 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1207 // management can be abstracted from the user. But this is at least
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1208 // useful for internal use:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1209 sk_buff: (${self})->skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1210 - // XXX: We need to cast here so we can do things like
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1211 - // var.dma_handle = 0; but the type shouldn't be hardcoded (at the
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1212 - // same time ${DMA:AbstractDMAHandle} couldn't be used because that
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1213 - // would yield to a struct type which you can't assign directly;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1214 - // but maybe doing the ->data in that case would be acceptable).
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1215 - dma_handle: (*((dma_addr_t *)&(${self})->dma_handle));
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1216 - size: (${self})->size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1217 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1218 + data: ((struct sk_buff *)((${self})->sk_buff))->data;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1219 + len: ((struct sk_buff *)((${self})->sk_buff))->len;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1220 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1221 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1222 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1223 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1224 --- a/rathaxes/samples/e1000/socket.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1225 +++ b/rathaxes/samples/e1000/socket.rti
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1226 @@ -12,20 +12,14 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1227 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1228 chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1229 chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1230 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1231 decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1232 - method init(Socket::AbstractSKBuff, Builtin::number);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1233 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1234 + method init(Socket::AbstractSKBuff);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1235 method dump_infos();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1236 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1237 - * map_to and map_from return a non-zero value on failure (which
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1238 - * doesn't correspond to an errno value):
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1239 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1240 - method map_to(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1241 - method map_from(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1242 - method unmap_to_and_free(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1243 - method unmap_from_and_free(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1244
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1245 - attribute Socket::AbstractSKBuff.ref sk_buff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1246 - attribute DMA::AbstractDMAHandle.scalar dma_handle;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1247 - attribute Builtin::number.scalar size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1248 + attribute Socket::AbstractSKBuff.ref sk_buff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1249 + attribute Builtin::symbol.ref data;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1250 + attribute Builtin::number.scalar len;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1251 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1252 }