annotate rathaxes_sample_e1000_rewrite_device_dependent_code.patch @ 142:cbff597d307e default tip

Wip doc
author Louis Opter <louis@lse.epita.fr>
date Sun, 09 Feb 2014 15:48:57 -0800
parents a291b41efb69
children
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
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2 # Parent 06f2b107580ea4f01d8e9333161d1e1b5f0de759
131
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
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
9 @@ -0,0 +1,54 @@
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
10 +Remarks for David & Lionel:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
11 +
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
12 +- 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
13 +- 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
14 + 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
15 +- 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
16 + 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
17 + 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
18 + 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
19 + whole structure field) might not be the best solution but would solve this
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
20 + issue/use case;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
21 +- Can I use the same name for a pointcut and a sequence (e.g: Ethernet::send
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
22 + bot a sequence name and a pointcut same thing for the interrupt handler);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
23 +- Lack of support for circular dependencies make some code annoying or
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
24 + incorrect (circular dependencies between abstract and concrete types via the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
25 + attribute or circular dependencies between the rings and the hardware
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
26 + context);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
27 +- It would be really cool to passthrough the comments;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
28 +- Not being able to use a Rathaxes type in the attributes is really annoying
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
29 + and forces me to hardcode a lot of stuff;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
30 +- Pointcuts are scoped by subsystems which is kinda weird because different
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
31 + subsystems are going to share the same pointcuts (i.e: the PCI and USB
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
32 + susystem are going to expose the same pointcuts that can be used by the
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
33 + Ethernet subsystem);
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
34 +- The compiler adds a & when I try to expand e1000::Context.io_addr regardless
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
35 + of whether the attribute is declared as Builtin::symbol.ref or .scalar;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
36 +- No understanding of arrays, e.g: ${local.self.ring.buffs[local.i].sk_buffs}
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
37 + (I'm not saying this is the right syntax).
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
38 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
39 +Todo/Totry:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
40 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
41 +- Use the rtx_ether_ctx attribute on AbstractDevice to initialize Device
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
42 + objects in ethernet.bl;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
43 +- Worry about the code being executed concurrently, e.g: what happens if the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
44 + interrupt handler is called right before we disable it in the close path?
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
45 +- Why the DMA sequences are taking an AbstractDMAHandle instead of a DMAHandle?
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
46 +- Right now the Ethernet subsystem hooks into the PCI subsystem via the
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
47 + Ethernet::init sequence, maybe the content of this sequence should be moved
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
48 + under the Ethernet::Device type definition (maybe we could solve the
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
49 + free_netdev call in case of failure at the same time);
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
50 +- Likewise sequences in the PCI subsystem could be moved to the PCI::Device
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
51 + type definition;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
52 +- PCI::Device.device should be PCI::Device.k_device;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
53 +- The Ethernet's chunk for PCI::pci_remove_hook should probably call cleanup
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
54 + functions from the Context and the Rings, unless the kernel alway calls
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
55 + rtx_ethernet_close first automatically.
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
56 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
57 +Questions:
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
58 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
59 +Compiler bugs:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
60 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
61 +- Trying to expand a type that doesn't exists crashes the compiler instead of
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
62 + displaying something more useful (took me 15 minutes to figure out that I
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
63 + typed 3 colons instead of 2 in a placeholder).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
64 diff --git a/rathaxes/compiler/passes/back/rtxIntrospect.inc.cws b/rathaxes/compiler/passes/back/rtxIntrospect.inc.cws
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
65 --- a/rathaxes/compiler/passes/back/rtxIntrospect.inc.cws
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
66 +++ b/rathaxes/compiler/passes/back/rtxIntrospect.inc.cws
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
67 @@ -890,6 +890,8 @@
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
68 local to_remove;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
69 foreach placeHolder in local_node.body.compile
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
70 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
71 + if (!placeHolder.node.body.type)
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
72 + traceLine(RED + "BUG: placeHolder.node.body.type is missing in rtxIntrospect_walk<\"__rtx_chunk__\">, placeHolder = " + toString(placeHolder) + DEFAULT_COLOR);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
73 if (rtxIntrospect_InferPlaceHolderTypes<placeHolder.node.body.type>(placeHolder.node.body, local_node) == false)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
74 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
75 pushItem to_remove;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
76 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
77 --- 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
78 +++ b/rathaxes/samples/e1000/CMakeLists.txt
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
79 @@ -17,8 +17,8 @@
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
80 dma.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
81 pci.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
82 socket.blt
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
83 - e1000.blt
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
84 - ethernet.blt)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
85 + ethernet.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
86 + e1000.blt)
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
87
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
88 IF (LINUX_KBUILD_DIR)
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
89 ADD_RATHAXES_LKM(e1000 e1000_src)
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
90 diff --git a/rathaxes/samples/e1000/dma.blt b/rathaxes/samples/e1000/dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
91 --- a/rathaxes/samples/e1000/dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
92 +++ b/rathaxes/samples/e1000/dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
93 @@ -1,4 +1,4 @@
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
94 -with DMA, Builtin, LKM, Device
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
95 +with Builtin, LKM, Device, DMA
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
96 {
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
97 template type DMA::AbstractDMAHandle()
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
98 {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
99 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
100 --- 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
101 +++ b/rathaxes/samples/e1000/e1000.blt
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
102 @@ -1,564 +1,8 @@
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
103 -with e1000, Ethernet, Socket, DMA, PCI, LKM, Log, Builtin
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
104 +with LKM, e1000, Ethernet, Socket, Device, DMA, PCI, Log, Builtin
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
105 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
106 - template type e1000::RxDescriptor()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
107 + template type e1000::Register()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
108 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
109 - decl data_types()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
110 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
111 - __le64 buff_addr;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
112 - __le16 length;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
113 - __le16 csum;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
114 - unsigned char status;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
115 - unsigned char errors;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
116 - __le16 special;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
117 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
118 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
119 - chunk LKM::includes()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
120 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
121 - #include <linux/types.h>
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
122 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
123 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
124 - method init()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
125 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
126 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
127 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
128 - map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
129 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
130 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
131 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
132 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
133 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
134 - * This is a generic tx descriptor for the e1000. When you use TCP
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
135 - * Segmentation Offload (TSO) the hardware actually uses two types of
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
136 - * tx descriptors in its tx ring:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
137 - * - context descriptors: this descriptor doesn't actually point to data to
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
138 - * send but initialize the offloading engine for the data descriptor that
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
139 - * follow;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
140 - * - data descriptors: this descriptor points to data from the skbuffs.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
141 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
142 - template type e1000::TxDescriptor()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
143 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
144 - decl data_types()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
145 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
146 - __le64 buff_addr;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
147 - union
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
148 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
149 - __le32 data;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
150 - struct
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
151 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
152 - __le16 length;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
153 - unsigned char csum_offset; /* CSO */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
154 - unsigned char cmd;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
155 - } fields;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
156 - } lower;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
157 - union
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
158 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
159 - __le32 data;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
160 - struct
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
161 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
162 - unsigned char status;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
163 - unsigned char csum_start; /* CSS */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
164 - __le16 special;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
165 - } fields;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
166 - } upper;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
167 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
168 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
169 - method init()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
170 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
171 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
172 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
173 - map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
174 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
175 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
176 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
177 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
178 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
179 - * Ring of e1000::RxDescriptors and their corresponding skbuffs.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
180 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
181 - * - size: total size of the ring in bytes.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
182 - * - base: address of the ring (we can't use the typedef here until we get
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
183 - * CNorm unstrict);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
184 - * - dma_base: (physical) address of the ring where the device can access
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
185 - * the different descriptors;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
186 - * - skbuffs: array of the skbuffs and their dma (physical) address
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
187 - * associated with each descriptor.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
188 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
189 - template type e1000::RxRing()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
190 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
191 - decl data_types()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
192 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
193 - unsigned int size;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
194 - ${e1000::RxDescriptor.ref} base;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
195 - dma_addr_t dma_base;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
196 - ${Socket::SKBuff} skbuffs[${config.rx_ring_size}];
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
197 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
198 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
199 - method init()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
200 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
201 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
202 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
203 - chunk Ethernet::adapter_init_rx(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
204 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
205 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
206 - ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
207 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
208 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
209 - * Receive initialization (section 14.4):
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
210 - *
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
211 - * 1. Program the receive address, in RAL/RAH;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
212 - * 2. Initialize the Multicast Table Array;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
213 - * 3. Program the interrupt mask register (done in
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
214 - * e1000::activate_device_interruption);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
215 - * 4. Allocate the receive descriptor ring and map it to make it
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
216 - * accessible by the device;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
217 - * 5. Write the start address of the ring in RDBAL/RDBAH and set
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
218 - * RDLEN (Receive Descriptor Length) to the size of the ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
219 - * 6. Set the RDH/RDT (Receive Descriptor Head/Tail) indexes to the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
220 - * beginning and end of the ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
221 - * 7. Make sure that RCTL.BSIZE and .BSEX are at 0 to configure the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
222 - * receive buffer size to 2048 bytes (e1000::rx_buffer_len).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
223 - * 8. Set RCTL.EN to enable the receiver.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
224 - *
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
225 - * The ugly casts here are caused by the lack of CNorm unstrict.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
226 - */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
227 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
228 - int i;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
229 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
230 - /* 1. Program the receive address */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
231 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
232 - /* (We should use uint{32,16}_t but CNorm doesn't know them yet) */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
233 - rtx_e1000_register_write32(hw_ctx, E1000_RAL,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
234 - *(unsigned int *)(${rtx_ether_ctx.dev_addr}));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
235 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
236 - * The 16 upper bits of RAH also store the AS bits (which should be
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
237 - * 0) and the AV bit (should be 1 to set the address as valid).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
238 - */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
239 - rtx_e1000_register_write32(hw_ctx, E1000_RAH,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
240 - *(unsigned short *)(&${rtx_ether_ctx.dev_addr}[4]));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
241 - rtx_e1000_register_set32(hw_ctx, E1000_RAH, E1000_RAH_AV);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
242 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
243 - ${Log::info("adapter_init_rx: receive address programmed")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
244 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
245 - /* 2. Initialize the MTA */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
246 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
247 - for (i = 0; i != 128; ++i)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
248 - rtx_e1000_register_write32(hw_ctx, E1000_MTA + i * 4, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
249 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
250 - ${Log::info("adapter_init_rx: MTA init done")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
251 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
252 - /* 4. Setup the receive descriptor ring */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
253 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
254 - /* Allocate the descriptors */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
255 - hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
256 - hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
257 - hw_ctx->rx_ring.base = ${DMA::alloc_coherent(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
258 - rtx_ether_ctx.device,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
259 - local.hw_ctx.rx_ring.size,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
260 - local.hw_ctx.rx_ring.dma_base.dma_handle
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
261 - )};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
262 - if (!hw_ctx->rx_ring.base)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
263 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
264 - ${Log::info("adapter_init_rx: cannot allocate the descriptors for the rx ring")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
265 - goto err_rx_ring_alloc;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
266 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
267 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
268 - ${Log::info("adapter_init_rx: rx descriptors allocated")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
269 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
270 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
271 - * Allocate the skbuffs, map them for DMA, and write their address
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
272 - * in the corresponding descriptor.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
273 - */
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
274 - for (i = 0; i != ${config.rx_ring_size}; ++i)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
275 - {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
276 - ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i];
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
277 - // XXX #46: ${rtx_ether_ctx.init_rx_skbuff(local.skbuff, config.rx_buffer_len)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
278 - if (rtx_ethernet_init_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
279 - {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
280 - ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
281 - goto err_skbuffs_alloc;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
282 - }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
283 - // XXX #46: ${local.skbuff.map_from(rtx_ether_ctx.device)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
284 - if (rtx_socket_skbuff_map(${local.skbuff}, ${rtx_ether_ctx.device}, RTX_DMA_FROM_DEVICE))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
285 - {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
286 - ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
287 - goto err_skbuffs_map;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
288 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
289 - hw_ctx->rx_ring.base[i].buff_addr = cpu_to_le64(${local.skbuff.sk_buff});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
290 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
291 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
292 - // ${Log::info("adapter_init_rx: skbuffs allocated};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
293 - pr_info("rtx_e1k: adapter_init_rx: skbuffs allocated, headlen=%d", skb_headlen((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i - 1].skbuff));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
294 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
295 - /* 5. Save the emplacement and the size of the ring in RDBA/RDLEN */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
296 - rtx_e1000_register_write32(hw_ctx, E1000_RDBAL, hw_ctx->rx_ring.dma_base & 0xffffffff);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
297 - rtx_e1000_register_write32(hw_ctx, E1000_RDBAH, hw_ctx->rx_ring.dma_base >> 32);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
298 - rtx_e1000_register_write32(hw_ctx, E1000_RDLEN, hw_ctx->rx_ring.size);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
299 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
300 - /* 6. Setup RDH/RDT */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
301 - rtx_e1000_register_write32(hw_ctx, E1000_RDH, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
302 - rtx_e1000_register_write32(hw_ctx, E1000_RDT, ${config.rx_ring_size} - 1);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
303 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
304 - /* 7. Configure the buffer size, */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
305 - rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_BSIZE_${config.rx_buffer_len});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
306 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
307 - /* 8. Enable the receiver */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
308 - rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_EN);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
309 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
310 - ${Log::info("adapter_init_rx: receive registers configured and receiver enabled")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
311 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
312 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
313 - * XXX: We can't return here since we are not in a function but
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
314 - * in a chunk of code (injected in a function).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
315 - */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
316 - goto init_rx_ok;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
317 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
318 - err_skbuffs_alloc:
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
319 - while (i--)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
320 - {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
321 - dma_unmap_single(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
322 - ${rtx_ether_ctx.device},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
323 - /* XXX Leaking cast because of the array: */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
324 - *((dma_addr_t *)&(hw_ctx->rx_ring.skbuffs[i].dma_handle)),
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
325 - ${config.rx_buffer_len},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
326 - DMA_FROM_DEVICE);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
327 - err_skbuffs_map:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
328 - /* XXX leaking cast: */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
329 - dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
330 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
331 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
332 - dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
333 - hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
334 - err_rx_ring_alloc:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
335 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
336 - * XXX: Likewise, if there is something else to rollback in the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
337 - * enclosing function, this won't be done.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
338 - */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
339 - return -ENOMEM;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
340 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
341 - init_rx_ok: (void)0; /* NOP, to make this a valid label. */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
342 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
343 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
344 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
345 - map
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
346 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
347 - size: ((${self}).size);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
348 - dma_base: ((${self}).dma_base);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
349 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
350 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
351 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
352 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
353 - * Ring of e1000::TxDescriptors, this is a bit similar to the Rx ring except
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
354 - * that we don't really have to manage the skbuffs themselves (they are
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
355 - * given to use by the kernel).
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
356 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
357 - * - size: total size of the ring in bytes.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
358 - * - base: address of the ring (we can't use the typedef here until we get
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
359 - * CNorm unstrict);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
360 - * - dma_base: (physical) address of the ring where the device can access
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
361 - * the different descriptors;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
362 - * - skbuffs: the skbuffs associated with each descriptor of the ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
363 - * - head: index on the head of the ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
364 - * - tail: index on the tail of the ring.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
365 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
366 - * Keep in mind that the head and tail fields are, obviously, not
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
367 - * synchronized with TDT/TDH on the device.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
368 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
369 - template type e1000::TxRing()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
370 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
371 - decl data_types()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
372 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
373 - unsigned int size;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
374 - /* XXX: can't use ${e1000::TxDescriptor} here: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
375 - ${e1000::TxDescriptor.ref} base; /* rename to descs */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
376 - dma_addr_t dma_base;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
377 - ${Socket::SKBuff} skbuffs[${config.tx_ring_size}];
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
378 - unsigned short head;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
379 - unsigned short tail;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
380 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
381 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
382 - chunk LKM::prototypes()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
383 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
384 - static void rtx_e1000_tx_ring_clean(${e1000::TxRing.ref});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
385 - static unsigned int rtx_e1000_tx_ring_descriptors_remaining(${e1000::TxRing.ref});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
386 - static int rtx_e1000_tx_ring_tso_cksum_offload(${e1000::TxRing.ref}, ${Socket::SKBuff.ref});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
387 - static void rtx_e1000_tx_ring_put(${e1000::TxRing.ref}, ${Socket::SKBuff.ref});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
388 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
389 - static void rtx_e1000_tx_ring_start_xmit(${e1000::TxRing.ref}, /*const*/ ${e1000::Context.ref});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
390 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
391 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
392 - chunk LKM::code()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
393 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
394 - static void rtx_e1000_tx_ring_clean(${e1000::TxRing.ref} self)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
395 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
396 - ${e1000::TxDescriptor.ref} tx_desc;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
397 - bool done;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
398 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
399 - for (; self->head != self->tail; self->head++)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
400 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
401 - tx_desc = &self->base[self->head];
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
402 - done = tx_desc->upper.fields.status & E1000_TXD_STAT_DD;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
403 - if (!done)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
404 - break ;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
405 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
406 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
407 - pr_info("%s: tx_ring_clean: moving head to %d/%d", ${config.name}, self->head, ${config.tx_ring_size});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
408 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
409 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
410 - static unsigned int rtx_e1000_tx_ring_descriptors_remaining(${e1000::TxRing.ref} self)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
411 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
412 - if (self->tail == self->head) /* ring is empty */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
413 - return 256; /* XXX: ${config.tx_ring_size}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
414 - if (self->tail > self->head)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
415 - /* XXX: ${config.tx_ring_size} */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
416 - return 256 - (self->tail - self->head);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
417 - return self->head - self->tail;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
418 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
419 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
420 - static int rtx_e1000_tx_ring_tso_cksum_offload(${e1000::TxRing.ref} self, ${Socket::SKBuff.ref} skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
421 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
422 - ${Socket::AbstractSKBuff.ref} k_skb = skb->skbuff;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
423 - return skb_is_gso(${local.k_skb.k_sk_buff}) || ${local.k_skb.k_sk_buff}->ip_summed == CHECKSUM_PARTIAL;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
424 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
425 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
426 - static void rtx_e1000_tx_ring_put(${e1000::TxRing.ref} self, ${Socket::SKBuff.ref} skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
427 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
428 - WARN_ON(!skb);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
429 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
430 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
431 - * Mark it as the last buffer (EOP) and ask the card to
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
432 - * insert the Ethernet FCS (Frame Check Sequence).
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
433 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
434 - * XXX: it sucks to use skb_headlen() here (this part of the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
435 - * code shouldn't be aware of it and use something more
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
436 - * abstract.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
437 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
438 - ${Socket::AbstractSKBuff.ref} k_skb = skb->skbuff;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
439 - ${e1000::TxDescriptor.ref} tx_desc = &self->base[self->tail];
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
440 - tx_desc->lower.data = cpu_to_le32(
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
441 - E1000_TXD_CMD_EOP |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
442 - E1000_TXD_CMD_IFCS |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
443 - E1000_TXD_CMD_RS |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
444 - skb_headlen(${local.k_skb.k_sk_buff}));
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
445 - tx_desc->upper.data = 0;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
446 - tx_desc->buff_addr = cpu_to_le64(${local.skb.dma_handle.k_dma_handle});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
447 - memcpy(&self->skbuffs[self->tail], ${local.k_skb.k_sk_buff}, sizeof(*${local.k_skb.k_sk_buff}));
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
448 - self->tail = (self->tail + 1) % ${config.tx_ring_size};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
449 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
450 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
451 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
452 - static void rtx_e1000_tx_ring_start_xmit(${e1000::TxRing.ref} self, /*const*/ ${e1000::Context.ref} hw_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
453 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
454 - pr_info("%s: start_xmit: moving tail to %d/%d", ${config.name}, self->tail, ${config.tx_ring_size});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
455 - rtx_e1000_register_write32(hw_ctx, E1000_TDT, self->tail);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
456 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
457 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
458 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
459 - chunk Ethernet::adapter_init_tx(Ethernet::Device rtx_ether_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
460 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
461 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
462 - ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
463 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
464 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
465 - * Transmission initialization (section 14.5):
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
466 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
467 - * 1. Allocate the transmit descriptors ring and map it to make it
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
468 - * accessible by the device;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
469 - * 2. Write the start address of the ring in TDBAL/TDBAH and set
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
470 - * TDLEN to the size of the ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
471 - * 3. Set the TDH/TDT indexes to the beginning and end of the ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
472 - * 4. Set TCTL.PSP to pad short packets and TCTL.EN to enable the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
473 - * transmitter.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
474 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
475 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
476 - /* 1. Allocate the tx ring */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
477 - hw_ctx->tx_ring.size = ${config.tx_ring_size} * sizeof(*hw_ctx->tx_ring.base);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
478 - hw_ctx->tx_ring.size = ALIGN(hw_ctx->tx_ring.size, 4096);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
479 - hw_ctx->tx_ring.base = dma_alloc_coherent(
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
480 - ${rtx_ether_ctx.device},
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
481 - hw_ctx->tx_ring.size,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
482 - &hw_ctx->tx_ring.dma_base,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
483 - GFP_KERNEL);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
484 - if (!hw_ctx->rx_ring.base)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
485 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
486 - ${Log::info("adapter_init_tx: cannot allocate the descriptors for the tx ring")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
487 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
488 - * XXX: If there is something else to rollback in the enclosing
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
489 - * function, this won't be done.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
490 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
491 - return -ENOMEM;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
492 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
493 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
494 - ${Log::info("adapter_init_tx: tx descriptors allocated")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
495 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
496 - /* 2. Save the emplacement and the size of the ring in TDBA/TDLEN */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
497 - rtx_e1000_register_write32(hw_ctx, E1000_TDBAL, hw_ctx->tx_ring.dma_base & 0xffffffff);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
498 - rtx_e1000_register_write32(hw_ctx, E1000_TDBAH, hw_ctx->tx_ring.dma_base >> 32);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
499 - rtx_e1000_register_write32(hw_ctx, E1000_TDLEN, hw_ctx->tx_ring.size);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
500 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
501 - /* 3. Setup TDH/TDT to zero: the queue is empty */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
502 - rtx_e1000_register_write32(hw_ctx, E1000_TDH, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
503 - rtx_e1000_register_write32(hw_ctx, E1000_TDT, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
504 - hw_ctx->tx_ring.head = 0;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
505 - hw_ctx->tx_ring.tail = 0;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
506 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
507 - /* 4. Set TCTL.PSP and enable the transmitter */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
508 - rtx_e1000_register_set32(hw_ctx, E1000_TCTL, E1000_TCTL_PSP|E1000_TCTL_EN);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
509 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
510 - ${Log::info("adapter_init_tx: transmit registers configured and transmitter enabled")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
511 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
512 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
513 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
514 - method clean()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
515 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
516 - rtx_e1000_tx_ring_clean(${self});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
517 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
518 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
519 - method descriptors_remaining()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
520 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
521 - rtx_e1000_tx_ring_descriptors_remaining(${self});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
522 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
523 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
524 - method tso_cksum_offload(Socket::SKBuff skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
525 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
526 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
527 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
528 - method put(Socket::SKBuff skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
529 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
530 - rtx_e1000_tx_ring_put(${self}, &${skb});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
531 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
532 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
533 - method start_xmit(e1000::Context ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
534 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
535 - rtx_e1000_tx_ring_start_xmit(${self}, ${ctx});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
536 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
537 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
538 - method init()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
539 - {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
540 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
541 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
542 - map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
543 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
544 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
545 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
546 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
547 - template type e1000::Context()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
548 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
549 - decl data_types()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
550 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
551 - int bars;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
552 - unsigned char /* __iomem */ *ioaddr;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
553 - ${e1000::RxRing.scalar} rx_ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
554 - ${e1000::TxRing.scalar} tx_ring;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
555 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
556 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
557 - chunk Ethernet::HardwareContext()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
558 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
559 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
560 - * Force the generation of the structure in the "headers" part, we
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
561 - * have to do this since we do not use the structure in this blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
562 - * (we hacked a bit and used it in ethernet.blt directly).
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
563 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
564 - ${e1000::Context} hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
565 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
566 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
567 - chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
568 - Builtin::number bars,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
569 - Builtin::symbol ioaddr)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
570 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
571 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
572 - ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
573 - hw_ctx->bars = ${bars};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
574 - hw_ctx->ioaddr = ${ioaddr};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
575 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
576 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
577 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
578 - chunk Ethernet::adapter_reset(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
579 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
580 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
581 - /* XXX Naming this variable 'hw_ctx' kicks the decl out of the generated code */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
582 - ${e1000::Context.ref} tmp_hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
583 - rtx_e1000_register_write32(tmp_hw_ctx, E1000_CTRL, E1000_CMD_RST);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
584 - udelay(10);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
585 - }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
586 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
587 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
588 - chunk Ethernet::adapter_load_mac_address(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
589 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
590 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
591 - ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
592 - /* Shamelessly borrowed from Minix */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
593 - for (int i = 0; i < 3; ++i)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
594 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
595 - rtx_e1000_register_write32(hw_ctx, E1000_EEPROM_READ, (i << 8) | 1);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
596 - int value;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
597 - do
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
598 - value = rtx_e1000_register_read32(hw_ctx, E1000_EEPROM_READ);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
599 - while ((value & (1 << 4)) == 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
600 - value >>= 16;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
601 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
602 - * NOTE: I'm not sure if Ethernet::Device should be
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
603 - * accessed directly here. But since we need to take it in
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
604 - * parameter (so we can get back our e1000::Context) it
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
605 - * seems inadequate to set this in another way:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
606 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
607 - ${rtx_ether_ctx.dev_addr}[i * 2] = value & 0xff;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
608 - ${rtx_ether_ctx.dev_addr}[i * 2 + 1] = (value >> 8) & 0xff;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
609 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
610 - ${Log::info("e1000::create: mac address loaded from the EEPROM")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
611 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
612 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
613 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
614 - chunk Ethernet::adapter_setup(Ethernet::Device rtx_ether_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
615 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
616 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
617 - ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
618 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
619 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
620 - * "General Configuration" (section 14.3):
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
621 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
622 - * - CTRL.ASDE/CTRL.SLU: Let the PHY handle the speed detection &
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
623 - * negociation;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
624 - * - CTRL.LRST/FRCSPD: Unset them to initiate the auto-negociation;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
625 - * - CTRL.PHY_RST: Unset it;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
626 - * - CTRL.ILOS: Unset it (ILOS is Invert Loss Of Signal);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
627 - * - CTRL.VME: Make sure it's not set to disable VLAN support;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
628 - * - Set the control flow registers to 0;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
629 - * - Finally, initialize all the statistic registers from
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
630 - * E1000_CRCERRS to E1000_TSCTFC.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
631 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
632 - rtx_e1000_register_set32(hw_ctx, E1000_CTRL,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
633 - E1000_CMD_ASDE |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
634 - E1000_CMD_SLU);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
635 - rtx_e1000_register_unset32(hw_ctx, E1000_CTRL,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
636 - E1000_CMD_LRST |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
637 - E1000_CMD_FRCSPD |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
638 - E1000_CMD_PHY_RST |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
639 - E1000_CMD_ILOS |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
640 - E1000_CMD_VME);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
641 - rtx_e1000_register_write32(hw_ctx, E1000_FCAH, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
642 - rtx_e1000_register_write32(hw_ctx, E1000_FCAL, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
643 - rtx_e1000_register_write32(hw_ctx, E1000_FCT, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
644 - rtx_e1000_register_write32(hw_ctx, E1000_FCTTV, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
645 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
646 - * XXX: Using int i clashes with another int i from the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
647 - * "parent" chunk:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
648 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
649 - for (int j = 0; j != 64; ++j)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
650 - rtx_e1000_register_write32(hw_ctx, E1000_CRCERRS + j * 4, 0);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
651 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
652 - ${Log::info("adapter_setup: general configuration done")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
653 - }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
654 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
655 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
656 - map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
657 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
658 - rx_ring: ((${self})->rx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
659 - //tx_ring: ((${self})->tx_ring); XXX Circular dep with Context
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
660 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
661 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
662 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
663 - template type e1000::Register()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
664 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
665 - decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
666 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
667 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
668 E1000_CTRL = 0x00000, /* Device Control - RW */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
669 E1000_CTRL_DUP = 0x00004, /* Device Control Duplicate (Shadow) - RW */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
670 @@ -593,19 +37,14 @@
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
671 E1000_TDT = 0x03818, /* Transmit Descriptor Tail */
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
672 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
673
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
674 - method init(Builtin::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
675 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
676 - ${self} = ${value};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
677 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
678 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
679 map
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
680 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
681 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
682 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
683
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
684 - template type e1000::Commands()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
685 + template type e1000::Command()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
686 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
687 - decl data_types()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
688 + decl data_types()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
689 {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
690 E1000_CMD_FD = 0x00000001, /* Full duplex.0=half; 1=full */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
691 E1000_CMD_BEM = 0x00000002, /* Endian Mode.0=little,1=big */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
692 @@ -670,9 +109,9 @@
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
693 }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
694 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
695
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
696 - template type e1000::TxDescriptorFlags()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
697 + template type e1000::TxDescriptorFlag()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
698 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
699 - decl data_types()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
700 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
701 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
702 E1000_TXD_DTYP_D = 0x00100000, /* Data Descriptor */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
703 E1000_TXD_DTYP_C = 0x00000000, /* Context Descriptor */
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
704 @@ -701,326 +140,721 @@
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
705 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
706 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
707
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
708 - /* TODO: make that a method of e1000::Context */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
709 - template sequence e1000::print_status(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
710 + template type e1000::RxDescriptor()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
711 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
712 - chunk LKM::prototypes()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
713 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
714 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
715 + __le64 buff_addr;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
716 + __le16 length;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
717 + __le16 csum;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
718 + unsigned char status;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
719 + unsigned char errors;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
720 + __le16 special;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
721 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
722 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
723 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
724 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
725 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
726 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
727 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
728 + // This is a generic tx descriptor for the e1000. When you use TCP
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
729 + // Segmentation Offload (TSO) the hardware actually uses two types of
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
730 + // tx descriptors in its tx ring:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
731 + // - context descriptors: this descriptor doesn't actually point to data to
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
732 + // send but initialize the offloading engine for the data descriptor that
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
733 + // follow;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
734 + // - data descriptors: this descriptor points to data from the skbuffs.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
735 + template type e1000::TxDescriptor()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
736 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
737 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
738 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
739 + __le64 buff_addr;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
740 + union {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
741 + __le32 data;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
742 + struct {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
743 + __le16 length;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
744 + unsigned char csum_offset; /* CSO */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
745 + unsigned char cmd;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
746 + } fields;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
747 + } lower;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
748 + union {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
749 + __le32 data;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
750 + struct {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
751 + unsigned char status;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
752 + unsigned char csum_start; /* CSS */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
753 + __le16 special;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
754 + } fields;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
755 + } upper;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
756 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
757 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
758 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
759 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
760 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
761 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
762 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
763 + template type e1000::Buffer()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
764 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
765 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
766 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
767 + ${Socket::SKBuff} sk_buff;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
768 + ${DMA::DMAHandle} dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
769 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
770 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
771 + method init(Socket::SKBuff sk_buff, DMA::DMAHandle dma)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
772 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
773 + ${self.sk_buff} = ${sk_buff};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
774 + ${self.dma} = ${dma};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
775 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
776 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
777 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
778 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
779 + sk_buff: ${self}->sk_buff;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
780 + dma: ${self}->dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
781 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
782 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
783 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
784 + template type e1000::Context()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
785 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
786 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
787 + {
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
788 + ${Ethernet::Device.ref} net_dev;
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
789 + // XXX should be annoted with __iomem:
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
790 + unsigned char *io_addr;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
791 + // XXX Forced to hardcode the type because there is a circular
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
792 + // dependency between the rings and the context.
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
793 + rtxType_e1000_TxRing tx_ring;
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
794 + rtxType_e1000_RxRing rx_ring;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
795 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
796 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
797 + chunk LKM::includes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
798 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
799 + #include <linux/types.h>
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
800 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
801 +
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
802 + chunk LKM::prototypes()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
803 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
804 static void rtx_e1000_print_status(${e1000::Context.ref});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
805 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
806 + // XXX Needed until we can call methods (issue #46):
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
807 + static unsigned int rtx_e1000_reg_read32(${e1000::Context}, ${e1000::Register});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
808 + static void rtx_e1000_reg_write32(${e1000::Context}, ${e1000::Register}, unsigned int);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
809 + static void rtx_e1000_reg_set32(${e1000::Context}, ${e1000::Register}, unsigned int);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
810 + static void rtx_e1000_reg_unset32(${e1000::Context}, ${e1000::Register}, unsigned int);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
811 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
812
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
813 - chunk LKM::code()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
814 + chunk LKM::code()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
815 {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
816 - static void rtx_e1000_print_status(${e1000::Context.ref} hw_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
817 + static void rtx_e1000_print_status(${e1000::Context.ref} self)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
818 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
819 - unsigned int status = rtx_e1000_register_read32(hw_ctx, E1000_STATUS);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
820 - ${Log::info("card status:")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
821 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
822 - * we can't use Log::info below because it just accept a string
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
823 - * (as opposed to a format string with its parameters).
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
824 - */
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
825 + unsigned int status = rtx_e1000_reg_read32(${local.self}, E1000_STATUS);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
826 + ${Log::info("card status:")};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
827 + // XXX We can't use Log::info below because it just accepts a
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
828 + // string (as opposed to a format string with its arguments):
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
829 pr_info("\tRegister value: 0x%x\n", status);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
830 pr_info("\tMode: %s\n", (status & 1) ? "Full": "Half");
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
831 pr_info("\tLink: %s\n", (status & 2) ? "Up" : "Down");
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
832 pr_info("\tTransmission: %s\n", (status & 4) ? "Paused" : "Ok");
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
833 pr_info("\tInterface: %s\n", (status & 3) == 3 ? "Up" : "Down");
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
834 }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
835 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
836 + static unsigned int rtx_e1000_reg_read32(${e1000::Context} self, ${e1000::Register} reg)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
837 + {
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
838 + // XXX The compiler generates &self->io_addr instead of
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
839 + // self->io_addr if I use ${local.self.io_addr}:
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
840 + return ioread32(self->io_addr + reg);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
841 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
842 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
843 + static void rtx_e1000_reg_write32(${e1000::Context} self,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
844 + ${e1000::Register} reg,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
845 + unsigned int value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
846 + {
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
847 + return iowrite32(value, self->io_addr + reg);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
848 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
849 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
850 + static void rtx_e1000_reg_set32(${e1000::Context} self,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
851 + ${e1000::Register} reg,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
852 + unsigned int value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
853 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
854 + return iowrite32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
855 + rtx_e1000_reg_read32(${local.self}, reg) | value,
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
856 + self->io_addr + reg
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
857 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
858 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
859 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
860 + static void rtx_e1000_reg_unset32(${e1000::Context} self,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
861 + ${e1000::Register} reg,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
862 + unsigned int value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
863 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
864 + return iowrite32(rtx_e1000_reg_read32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
865 + ${local.self}, reg) & ~value,
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
866 + self->io_addr + reg
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
867 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
868 + }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
869 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
870
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
871 - chunk ::CALL()
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
872 + method init(Ethernet::Device rtx_ether_ctx, Builtin::symbol io_addr)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
873 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
874 - rtx_e1000_print_status(&${rtx_ether_ctx}->hw_ctx);
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
875 + ${self.net_dev} = ${rtx_ether_ctx};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
876 + ${self.io_addr} = ${io_addr};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
877 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
878 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
879 + method reg_read32(e1000::Register reg)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
880 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
881 + ioread32(${self.io_addr} + ${local.reg});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
882 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
883 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
884 + method reg_write32(e1000::Register reg, Builtin::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
885 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
886 + iowrite32(${value}, ${self.io_addr} + ${reg});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
887 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
888 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
889 + method reg_set32(e1000::Register reg, Builtin::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
890 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
891 + iowrite32(ioread32(${self.io_addr} + ${reg}) | ${value}, ${self.io_addr} + ${reg});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
892 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
893 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
894 + method reg_unset32(e1000::Register reg, Builtin::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
895 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
896 + iowrite32(ioread32(${self.io_addr} + ${reg}) & ~${value}, ${self.io_addr} + ${reg});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
897 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
898 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
899 + chunk Ethernet::HardwareContext()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
900 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
901 + ${e1000::Context} hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
902 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
903 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
904 + chunk Ethernet::adapter_init_context(Ethernet::Device rtx_ether_ctx, Builtin::symbol io_addr)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
905 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
906 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
907 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
908 + // XXX doesn't work: ${local.hw_ctx.init(rtx_ether_ctx, io_addr)};
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
909 + ${local.hw_ctx.net_dev} = ${rtx_ether_ctx};
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
910 + ${local.hw_ctx.io_addr} = ${io_addr};
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
911 + // XXX doesn't work: ${local.hw_ctx.rx_ring.init(local.hw_ctx, config.rx_ring_size)};
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
912 + rtx_e1000_ring_init(
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
913 + &${local.hw_ctx.rx_ring},
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
914 + ${config.rx_ring_size},
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
915 + sizeof(rtxType_e1000_RxDescriptor)
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
916 + );
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
917 + // XXX doesn't work: ${local.hw_ctx.tx_ring.init(local.hw_ctx, config.tx_ring_size)};
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
918 + rtx_e1000_ring_init(
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
919 + &${local.hw_ctx.tx_ring},
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
920 + ${config.tx_ring_size},
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
921 + sizeof(rtxType_e1000_TxDescriptor)
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
922 + );
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
923 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
924 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
925 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
926 + chunk Ethernet::adapter_reset(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
927 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
928 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
929 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
930 + // XXX #46: ${local.hw_ctx.io.write32(E1000_CTRL, E1000_CMD_RST)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
931 + rtx_e1000_reg_write32(hw_ctx, E1000_CTRL, E1000_CMD_RST);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
932 + udelay(10); // TODO: abstract udelay too...
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
933 + ${Log::info("adapter has been reset")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
934 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
935 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
936 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
937 + chunk Ethernet::adapter_load_mac_address(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
938 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
939 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
940 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
941 + // Shamelessly borrowed from Minix
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
942 + for (int i = 0; i < 3; ++i) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
943 + rtx_e1000_reg_write32(hw_ctx, E1000_EEPROM_READ, (i << 8) | 1);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
944 + int value;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
945 + do {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
946 + value = rtx_e1000_reg_read32(hw_ctx, E1000_EEPROM_READ);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
947 + } while ((value & (1 << 4)) == 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
948 + value >>= 16;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
949 + // NOTE: I'm not sure if Ethernet::Device should be
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
950 + // accessed directly here. But since we need to take it in
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
951 + // parameter (so we can get back our e1000::Context) it
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
952 + // seems inadequate to set this in another way:
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
953 + ${rtx_ether_ctx.dev_addr}[i * 2] = value & 0xff;
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
954 + ${rtx_ether_ctx.dev_addr}[i * 2 + 1] = (value >> 8) & 0xff;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
955 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
956 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
957 + ${Log::info("mac address loaded from the EEPROM")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
958 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
959 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
960 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
961 + // For e1000, this part is documented in the Intel Gigabit Ethernet
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
962 + // Controller Software Developper manual. (You can find it in the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
963 + // doc/hardware directory).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
964 + chunk Ethernet::adapter_setup_rx_tx(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
965 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
966 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
967 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
968 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
969 + // "General Configuration" (section 14.3):
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
970 + //
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
971 + // - CTRL.ASDE/CTRL.SLU: Let the PHY handle the speed detection &
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
972 + // negociation;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
973 + // - CTRL.LRST/FRCSPD: Unset them to initiate the auto-negociation;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
974 + // - CTRL.PHY_RST: Unset it;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
975 + // - CTRL.ILOS: Unset it (ILOS is Invert Loss Of Signal);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
976 + // - CTRL.VME: Make sure it's not set to disable VLAN support;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
977 + // - Set the control flow registers to 0;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
978 + // - Finally, initialize all the statistic registers from
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
979 + // E1000_CRCERRS to E1000_TSCTFC.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
980 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
981 + // XXX #46: Use the read/write/set/unset methods on Context
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
982 + rtx_e1000_reg_set32(hw_ctx, E1000_CTRL, E1000_CMD_ASDE|E1000_CMD_SLU);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
983 + rtx_e1000_reg_unset32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
984 + hw_ctx,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
985 + E1000_CTRL,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
986 + E1000_CMD_LRST|E1000_CMD_FRCSPD|E1000_CMD_PHY_RST|
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
987 + E1000_CMD_ILOS|E1000_CMD_VME
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
988 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
989 + rtx_e1000_reg_write32(hw_ctx, E1000_FCAH, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
990 + rtx_e1000_reg_write32(hw_ctx, E1000_FCAL, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
991 + rtx_e1000_reg_write32(hw_ctx, E1000_FCT, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
992 + rtx_e1000_reg_write32(hw_ctx, E1000_FCTTV, 0);
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
993 + // XXX int i leaks from another chunk and will not be generated
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
994 + // here, let's use a different index name:
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
995 + for (int j = 0; j != 64; ++j)
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
996 + rtx_e1000_reg_write32(hw_ctx, E1000_CRCERRS + j * 4, 0);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
997 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
998 + ${Log::info("adapter_setup_rx_tx: general configuration done")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
999 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1000 + int err;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1001 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1002 + err = rtx_e1000_rx_ring_alloc_resources(&hw_ctx->rx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1003 + if (err)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1004 + goto err_alloc_rx_ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1005 + rtx_e1000_rx_ring_configure(&hw_ctx->rx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1006 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1007 + err = rtx_e1000_tx_ring_alloc_resources(&hw_ctx->tx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1008 + if (err)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1009 + goto err_alloc_tx_ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1010 + rtx_e1000_tx_ring_configure(&hw_ctx->tx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1011 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1012 + err_alloc_tx_ring:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1013 + rtx_e1000_rx_ring_free_resources(&hw_ctx->rx_ring);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1014 + err_alloc_rx_ring:
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1015 + // XXX Can't return here since we don't know the context,
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1016 + // anyway, hardcoded goto:
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1017 + goto rtx_ethernet_open_fail;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1018 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1019 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1020 +
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1021 + chunk Ethernet::adapter_enable_interrupts(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1022 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1023 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1024 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1025 + rtx_e1000_reg_write32(
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1026 + ${local.hw_ctx},
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1027 + E1000_IMS,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1028 + E1000_INTR_TXDW|E1000_INTR_TXQE|E1000_INTR_LSC|
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1029 + E1000_INTR_RXO|E1000_INTR_RXT0
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1030 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1031 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1032 + // XXX We should probably move that elsewhere (it just used to
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1033 + // be done right after we enabled interrupts when this was
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1034 + // still in lkm.rtx):
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1035 + // XXX #46: ${local.hw_ctx.print_status()};
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1036 + rtx_e1000_print_status(${local.hw_ctx});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1037 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1038 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1039 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1040 + chunk Ethernet::adapter_disable_interrupts(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1041 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1042 + { ${Log::info("adapter_disable_interrupts: TBD...")}; }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1043 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1044 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1045 + chunk Ethernet::adapter_handle_interrupt(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1046 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1047 + {
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1048 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1049 + unsigned int icr = rtx_e1000_reg_read32(hw_ctx, E1000_ICR);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1050 + pr_info("%s: interrupt received, ICR: 0x%x", ${config.name}, icr);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1051 + if (icr) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1052 + if (icr & E1000_INTR_LSC) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1053 + ${Log::info("handle_interrupt: cable link status changed, dumping card status:")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1054 + // XXX #46: ${local.hw_ctx.print_status()};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1055 + rtx_e1000_print_status(hw_ctx);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1056 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1057 + if (icr & (E1000_INTR_TXQE|E1000_INTR_TXDW)) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1058 + ${Log::info("handle_interrupt: TxRing: packet(s) sent")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1059 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1060 + if (icr & E1000_INTR_RXT0) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1061 + ${Log::info("handle_interrupt: RxRing: packet(s) received")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1062 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1063 + if (icr & E1000_INTR_RXO) {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1064 + ${Log::info("handle_interrupt: RxRing: overrun")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1065 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1066 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1067 + // XXX: This sucks since we don't know the pointcut context:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1068 + return IRQ_HANDLED;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1069 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1070 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1071 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1072 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1073 + chunk Ethernet::adapter_xmit(Ethernet::Device rtx_ether_ctx, Socket::SKBuff rtx_skb)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1074 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1075 + { ${Log::info("adapter_xmit: TBD...")}; }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1076 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1077 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1078 + chunk Ethernet::adapter_disable_rx(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1079 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1080 + { ${Log::info("adapter_disable_rx: TBD..")}; }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1081 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1082 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1083 + chunk Ethernet::adapter_disable_tx(Ethernet::Device rtx_ether_ctx)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1084 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1085 + { ${Log::info("adapter_disable_tx: TBD..")}; }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1086 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1087 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1088 + chunk Ethernet::adapter_free_rx_tx(Ethernet::Device rtx_ether_ctx)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1089 + {
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1090 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1091 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1092 + { ${Log::info("adapter_free_rx_tx: TBD..")}; }
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1093 +
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1094 + rtx_e1000_rx_ring_free_resources(${local.hw_ctx.rx_ring});
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1095 + rtx_e1000_tx_ring_free_ressources(${local.hw_ctx.tx_ring});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1096 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1097 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1098 + method print_status()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1099 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1100 + rtx_e1000_print_status(${self});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1101 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1102 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1103 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1104 + {
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1105 + io_addr: ${self}->io_addr;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1106 + rx_ring: ${self}->rx_ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1107 + tx_ring: ${self}->tx_ring;
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1108 + net_dev: ${self}->net_dev;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1109 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1110 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1111
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1112 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1113 - * We should have been able to do something along those lines, but
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1114 - * it didn't work so we made the call manually.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1115 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1116 - * Ideally:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1117 - * ${e1000::register_read32(rtx_ether_ctx->hw_ctx, E1000_STATUS)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1118 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1119 - * Ideally2, not sure about the syntax on the register parameter:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1120 - * ${e1000::register_read32(rtx_ether_ctx->hw_ctx, ${e1000::Register.E1000_STATUS})};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1121 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1122 - * "Acceptable":
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1123 - * ${e1000::Register} reg_status;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1124 - * ${e1000.init(E1000_STATUS); // didn't work, so we used the next line
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1125 - * reg_status = E1000_STATUS;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1126 - * ${e1000::register_read32(rtx_ether_ctx->hw_ctx, reg_status)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1127 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1128 - * TODO: make them methods of e1000::Context
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1129 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1130 - template sequence e1000::register_read32(e1000::Context ctx, e1000::Register reg_offset)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1131 + template type e1000::Ring()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1132 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1133 - chunk LKM::prototypes()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1134 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1135 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1136 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1137 - static unsigned int rtx_e1000_register_read32(/*const*/ ${e1000::Context.ref}, unsigned int);
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1138 + ${e1000::Context.ref} hw_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1139 + ${DMA::DMAHandle} dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1140 + unsigned int size;
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1141 + void *descs;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1142 + ${e1000::Buffer.ref} buffs;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1143 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1144
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1145 - chunk LKM::code()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1146 + chunk LKM::prototypes()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1147 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1148 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1149 - static unsigned int rtx_e1000_register_read32(/*const*/ ${e1000::Context.ref} ctx, unsigned int reg_offset)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1150 + static void rtx_e1000_ring_init(${e1000::Ring.ref}, ${e1000::Context}, int, int);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1151 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1152 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1153 + chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1154 + {
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1155 + static void rtx_e1000_ring_init(${e1000::Ring.ref} self, ${e1000::Context.ref} hw_ctx,
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1156 + int desc_count, int desc_size)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1157 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1158 - return ioread32(ctx->ioaddr + reg_offset);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1159 + BUG_ON(desc_count <= 0 || desc_size <= 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1160 + memset(self, 0, sizeof(*self));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1161 + self->size = ALIGN(desc_count * desc_size, 4096);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1162 + self->hw_ctx = hw_ctx;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1163 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1164 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1165
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1166 - chunk ::CALL()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1167 + method init(e1000::Context hw_ctx, Builtin::number desc_count, Builtin::number desc_size)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1168 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1169 - rtx_e1000_register_read32(${ctx}, ${reg_offset});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1170 + rtx_e1000_ring_init(&${self}, ${hw_ctx}, ${desc_count}, ${desc_size});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1171 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1172 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1173 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1174 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1175 + hw_ctx: ${self}->hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1176 + dma: ${self}->dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1177 + size: ${self}->size;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1178 + descs: ${self}->descs;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1179 + buffs: ${self}->buffs;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1180 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1181 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1182
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1183 - template sequence e1000::register_write32(e1000::Context ctx, e1000::Register reg_offset, ::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1184 + template type e1000::RxRing()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1185 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1186 - chunk LKM::prototypes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1187 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1188 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1189 - /* FIXME: See issue #54 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1190 - static void rtx_e1000_register_write32(/*const*/ ${e1000::Context.ref}, unsigned int, unsigned int);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1191 + ${e1000::Ring} ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1192 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1193
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1194 - chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1195 + chunk LKM::prototypes()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1196 {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1197 - /* FIXME: See issue #54 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1198 - static void rtx_e1000_register_write32(/*const*/ ${e1000::Context.ref} ctx, unsigned int reg_offset, unsigned int value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1199 + static int rtx_e1000_rx_ring_alloc_resources(${e1000::RxRing.ref});
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1200 + static void rtx_e1000_rx_ring_free_resources(${e1000::RxRing.ref});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1201 + static void rtx_e1000_rx_ring_configure(${e1000::RxRing.ref});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1202 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1203 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1204 + chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1205 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1206 + static int rtx_e1000_rx_ring_alloc_resources(${e1000::RxRing.ref} self)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1207 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1208 - iowrite32(value, ctx->ioaddr + reg_offset);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1209 + // 4. Setup the receive descriptor ring
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1210 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1211 + int i;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1212 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1213 + // Allocate the descriptors
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1214 + ${local.self.descs} = ${DMA::alloc_coherent(
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1215 + local.self.hw_ctx.net_dev.device, local.self.size,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1216 + local.self.dma.dma_handle
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1217 + )};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1218 +
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1219 + if (!${local.self.descs}) {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1220 + ${Log::info("adapter_init_rx: cannot allocate the descriptors for the rx ring")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1221 + goto err_rx_ring_alloc;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1222 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1223 +
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1224 + // XXX The generated code is totally wrong if this is not scoped:
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1225 + { ${Log::info("adapter_init_rx: rx descriptors allocated")}; }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1226 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1227 + // Allocate the skbuffs, map them for DMA, and write their address
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1228 + // in the corresponding descriptor.
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1229 + for (i = 0; i != ${config.rx_ring_size}; ++i) {
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1230 + // XXX No support for arrays:
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1231 + ${e1000::Buffer.ref} buff = &${local.self.buffs}[i];
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1232 + // XXX #46: ${rtx_ether_ctx.alloc_rx_skbuff(local.buff.skbuff, config.rx_buffer_len)};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1233 + if (rtx_ethernet_alloc_rx_skbuff(&${local.buff.sk_buff}, ${config.rx_buffer_len})) {
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1234 + ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1235 + goto err_skbuffs_alloc;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1236 + }
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1237 + // XXX I couldn't manage to get this call working:
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1238 + //${local.buff.dma.dma_handle} = ${DMA::map(
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1239 + // local.self.hw_ctx.net_dev.device, local.buff.sk_buff.data,
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1240 + // config.rx_buffer_len, RTX_DMA_FROM_DEVICE
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1241 + //)};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1242 + ${local.buff.dma.dma_handle.k_dma_handle} = dma_map_single(
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1243 + ${local.self.hw_ctx.net_dev.device.k_device}, ${local.buff.sk_buff.data},
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1244 + ${config.rx_buffer_len}, RTX_DMA_FROM_DEVICE
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1245 + );
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1246 + int err = ${DMA::mapping_error(
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1247 + local.self.hw_ctx.net_dev.device, local.buff.dma.dma_handle
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1248 + )};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1249 + if (err) {
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1250 + ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1251 + goto err_skbuffs_map;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1252 + }
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1253 + ${local.self.descs}[i].buff_addr = cpu_to_le64(${local.buff.dma.dma_handle.k_dma_handle});
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1254 + }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1255 +
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1256 + { ${Log::info("adapter_init_rx: skbuffs allocated")}; }
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1257 +
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1258 + return 0;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1259 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1260 + err_skbuffs_alloc:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1261 + while (i--) {
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1262 + ${e1000::Buffer.ref} buff = &${local.self.buffs}[i];
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1263 + // XXX I couldn't manage to get this call working
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1264 + //${DMA::unmap(
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1265 + // local.self.hw_ctx.net_dev.device,
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1266 + // local.buff.dma.dma_handle,
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1267 + // config.rx_buffer_len,
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1268 + // RTX_DMA_FROM_DEVICE
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1269 + //)};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1270 + dma_unmap_single(
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1271 + ${local.self.hw_ctx.net_dev.device.k_device},
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1272 + ${local.buff.dma.dma_handle.k_dma_handle},
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1273 + ${config.rx_buffer_len},
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1274 + RTX_DMA_FROM_DEVICE
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1275 + );
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1276 + err_skbuffs_map:
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1277 + // XXX #46: ${local.buff.sk_buff.free()};
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1278 + dev_kfree_skb(${local.buff.sk_buff.sk_buff.k_sk_buff});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1279 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1280 +
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1281 + void *descs = ${local.self.descs};
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1282 + ${cast local.descs as Builtin::symbol.ref};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1283 + ${DMA::free_coherent(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1284 + local.self.hw_ctx.net_dev.device, local.self.size,
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1285 + local.descs, local.self.dma.dma_handle
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1286 + )};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1287 + err_rx_ring_alloc:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1288 + return -ENOMEM;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1289 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1290 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1291 + static void rtx_e1000_rx_ring_free_resources(${e1000::RxRing.ref} self)
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1292 + {
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1293 + ${Log::info("e1000_rx_ring_free_resources: TBD...")};
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1294 + }
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1295 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1296 + static void rtx_e1000_rx_ring_configure(${e1000::RxRing.ref} self)
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1297 + {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1298 + // Receive initialization (section 14.4):
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1299 + //
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1300 + // 1. Program the receive address, in RAL/RAH;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1301 + // 2. Initialize the Multicast Table Array;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1302 + // 3. Program the interrupt mask register (done in
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1303 + // e1000::activate_device_interruption);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1304 + // 4. Allocate the receive descriptor ring and map it to make it
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1305 + // accessible by the device;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1306 + // 5. Write the start address of the ring in RDBAL/RDBAH and set
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1307 + // RDLEN (Receive Descriptor Length) to the size of the ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1308 + // 6. Set the RDH/RDT (Receive Descriptor Head/Tail) indexes to the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1309 + // beginning and end of the ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1310 + // 7. Make sure that RCTL.BSIZE and .BSEX are at 0 to configure the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1311 + // receive buffer size to 2048 bytes (e1000::rx_buffer_len).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1312 + // 8. Set RCTL.EN to enable the receiver.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1313 + //
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1314 + // The ugly casts here are caused by the lack of CNorm unstrict.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1315 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1316 + int i;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1317 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1318 + // 1. Program the receive address
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1319 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1320 + // (We should use uint{32,16}_t but CNorm doesn't know them yet)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1321 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1322 + ${local.self.hw_ctx}, E1000_RAL,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1323 + *(unsigned int *)(${local.self.hw_ctx.net_dev.dev_addr})
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1324 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1325 + // The 16 upper bits of RAH also store the AS bits (which should be
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1326 + // 0) and the AV bit (should be 1 to set the address as valid).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1327 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1328 + ${local.self.hw_ctx}, E1000_RAH,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1329 + *(unsigned short *)(&${local.self.hw_ctx.net_dev.dev_addr}[4])
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1330 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1331 + rtx_e1000_reg_set32(${local.self.hw_ctx}, E1000_RAH, E1000_RAH_AV);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1332 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1333 + ${Log::info("rx_ring_configure: receive address programmed")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1334 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1335 + // 2. Initialize the MTA
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1336 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1337 + for (i = 0; i != 128; ++i) // TODO Remove that hardcoded 128
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1338 + rtx_e1000_reg_write32(${local.self.hw_ctx}, E1000_MTA + i * 4, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1339 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1340 + ${Log::info("rx_ring_configure: MTA init done")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1341 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1342 + // 5. Save the emplacement and the size of the ring in RDBA/RDLEN
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1343 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1344 + ${local.self.hw_ctx}, E1000_RDBAL,
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1345 + ${local.self.dma.dma_handle.k_dma_handle} & 0xffffffff
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1346 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1347 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1348 + ${local.self.hw_ctx}, E1000_RDBAH,
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1349 + ${local.self.dma.dma_handle.k_dma_handle} >> 32
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1350 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1351 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1352 + ${local.self.hw_ctx}, E1000_RDLEN,
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1353 + ${local.self.size}
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1354 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1355 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1356 + // 6. Setup RDH/RDT
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1357 + rtx_e1000_reg_write32(${local.self.hw_ctx}, E1000_RDH, 0);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1358 + rtx_e1000_reg_write32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1359 + ${local.self.hw_ctx}, E1000_RDT,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1360 + ${config.rx_ring_size} - 1
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1361 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1362 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1363 + // 7. Configure the buffer size
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1364 + rtx_e1000_reg_set32(
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1365 + ${local.self.hw_ctx}, E1000_RCTL,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1366 + E1000_RCTL_BSIZE_${config.rx_buffer_len}
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1367 + );
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1368 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1369 + // 8. Enable the receiver
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1370 + rtx_e1000_reg_set32(${local.self.hw_ctx}, E1000_RCTL, E1000_RCTL_EN);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1371 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1372 + ${Log::info("rx_ring_configure: receive registers configured and receiver enabled")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1373 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1374 + return 0;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1375 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1376 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1377
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1378 - chunk ::CALL()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1379 + method init(e1000::Context hw_ctx, Builtin::number desc_count)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1380 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1381 - rtx_e1000_register_write32(${ctx}, ${reg_offset}, ${value});
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1382 + // XXX doesn't work: ${self.ring.init(hw_ctx, desc_count, self.desc_size)};
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1383 + rtx_e1000_ring_init(&${self}, ${hw_ctx}, ${desc_count}, ${self.desc_size});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1384 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1385 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1386 + method alloc()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1387 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1388 + rtx_e1000_rx_ring_alloc_resources(${self});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1389 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1390 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1391 + method free()
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1392 + {
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1393 + rtx_e1000_rx_ring_free_resources(${self});
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1394 + }
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1395 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1396 + method configure()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1397 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1398 + rtx_e1000_rx_ring_configure(${self});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1399 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1400 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1401 + map
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1402 + {
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1403 + hw_ctx: ${self}->ring.hw_ctx;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1404 + dma: ${self}->ring.dma;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1405 + size: ${self}->ring.size;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1406 + descs: ${self}->ring.descs;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1407 + buffs: ${self}->ring.buffs;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1408 + desc_size: sizeof(rtxType_e1000_RxDescriptor); // XXX hardcoded
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1409 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1410 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1411
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1412 - template sequence e1000::register_set32(e1000::Context ctx, e1000::Register reg_offset, ::number value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1413 + template type e1000::TxRing()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1414 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1415 - chunk LKM::prototypes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1416 + decl data_types()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1417 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1418 - /* FIXME: See issue #54 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1419 - static void rtx_e1000_register_set32(/*const*/ ${e1000::Context.ref}, unsigned int, unsigned int);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1420 + ${e1000::Ring} ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1421 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1422
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1423 - chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1424 + chunk LKM::prototypes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1425 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1426 - /* FIXME: See issue #54 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1427 - static void rtx_e1000_register_set32(/*const*/ ${e1000::Context.ref} ctx, unsigned int reg_offset, unsigned int value)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1428 + static int rtx_e1000_tx_ring_alloc_resources(${e1000::TxRing.ref});
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1429 + static void rtx_e1000_tx_ring_free_resources(${e1000::TxRing.ref});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1430 + static void rtx_e1000_tx_ring_configure(${e1000::TxRing.ref});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1431 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1432 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1433 + chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1434 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1435 + static int rtx_e1000_tx_ring_alloc_resources(${e1000::TxRing.ref} self)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1436 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1437 - iowrite32(rtx_e1000_register_read32(ctx, reg_offset) | value, ctx->ioaddr + reg_offset);
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1438 + ${Log::info("e1000_tx_ring_alloc_resources: TBD...")};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1439 + return 0;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1440 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1441 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1442 + static void rtx_e1000_tx_ring_free_resources(${e1000::TxRing.ref} self)
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1443 + {
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1444 + ${Log::info("e1000_tx_ring_free_resources: TBD...")};
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1445 + }
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1446 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1447 + static void rtx_e1000_tx_ring_configure(${e1000::TxRing.ref} self)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1448 + {
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1449 + ${Log::info("e1000_tx_ring_configure: TBD...")};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1450 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1451 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1452
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1453 - chunk ::CALL()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1454 + method init(e1000::Context hw_ctx, Builtin::number desc_count)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1455 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1456 - rtx_e1000_register_set32(${ctx}, ${reg_offset}, ${value});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1457 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1458 - }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1459 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1460 - template sequence e1000::register_unset32(e1000::Context ctx, e1000::Register reg_offset, ::number value)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1461 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1462 - chunk LKM::prototypes()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1463 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1464 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1465 - static void rtx_e1000_register_unset32(/*const*/ ${e1000::Context.ref}, unsigned int, unsigned int);
135
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1466 + // XXX doesn't work: ${self.ring.init(hw_ctx, desc_count, self.desc_size)};
9c6ae3a2e180 Wip, fixes + workarounds
Louis Opter <kalessin@kalessin.fr>
parents: 134
diff changeset
1467 + rtx_e1000_ring_init(&${self}, ${hw_ctx}, ${desc_count}, ${self.desc_size});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1468 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1469
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1470 - chunk LKM::code()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1471 + method alloc()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1472 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1473 - /* FIXME: See issue #54 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1474 - static void rtx_e1000_register_unset32(/*const*/ ${e1000::Context.ref} ctx, unsigned int reg_offset, unsigned int value)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1475 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1476 - iowrite32(rtx_e1000_register_read32(ctx, reg_offset) & ~value, ctx->ioaddr + reg_offset);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1477 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1478 + rtx_e1000_tx_ring_alloc_resources(${self});
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1479 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1480
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1481 - chunk ::CALL()
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1482 + method free()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1483 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1484 - rtx_e1000_register_unset32(${ctx}, ${reg_offset}, ${value});
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1485 + rtx_e1000_tx_ring_free_resources(${self});
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1486 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1487 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1488
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1489 - template sequence activate_device_interruption(Ethernet::Device rtx_ether_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1490 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1491 - chunk ::CALL()
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1492 + method configure()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1493 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1494 - rtx_e1000_register_write32(&${rtx_ether_ctx}->hw_ctx, E1000_IMS,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1495 - E1000_INTR_TXDW |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1496 - E1000_INTR_TXQE |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1497 - E1000_INTR_LSC |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1498 - E1000_INTR_RXO |
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1499 - E1000_INTR_RXT0);
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1500 + rtx_e1000_tx_ring_configure(${self});
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1501 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1502 - }
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1503
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1504 - /* TODO:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1505 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1506 - * Refactor into two methods (one in RxRing and one in TxRing) and make use
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1507 - * of the new methods in Socket::SKBuff.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1508 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1509 - template sequence free_rx_tx(Ethernet::Device rtx_ether_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1510 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1511 - chunk ::CALL()
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1512 + map
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1513 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1514 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1515 - * XXX: Not generated if named "hw_ctx" (which is funny because
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1516 - * it's used and works in the template right above this one):
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1517 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1518 - ${e1000::Context.ref} hw_ctx_;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1519 - hw_ctx_ = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1520 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1521 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1522 - * Free the rx ring:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1523 - * - Unmap and free the skbuffs;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1524 - * - Free the descriptors array.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1525 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1526 - for (int i = 0; i != ${config.rx_ring_size}; ++i)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1527 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1528 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1529 - * XXX Leaking casts:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1530 - *
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1531 - * We should go through the rtx types (Socket::SKBuff,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1532 - * AbstractSKBuff), but we can't because of the array here,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1533 - * which is not supported by the compiler.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1534 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1535 - dma_unmap_single(
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1536 - ${rtx_ether_ctx.device},
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1537 - *((dma_addr_t *)&(hw_ctx_->rx_ring.skbuffs[i].dma_handle)),
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1538 - ${config.rx_buffer_len},
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1539 - DMA_FROM_DEVICE);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1540 - dev_kfree_skb((struct sk_buff *)hw_ctx_->rx_ring.skbuffs[i].skbuff);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1541 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1542 - dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->rx_ring.size,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1543 - hw_ctx_->rx_ring.base, hw_ctx_->rx_ring.dma_base);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1544 - ${Log::info("free_rx_tx: rx ring free'ed")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1545 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1546 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1547 - * Free the tx ring:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1548 - * - Free the descriptors array.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1549 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1550 - dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->tx_ring.size,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1551 - hw_ctx_->tx_ring.base, hw_ctx_->tx_ring.dma_base);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1552 - ${Log::info("free_rx_tx: tx ring free'ed")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1553 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1554 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1555 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1556 - template sequence handle_interrupt(Ethernet::Device rtx_ether_ctx)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1557 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1558 - chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1559 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1560 - unsigned int icr = rtx_e1000_register_read32(&${rtx_ether_ctx}->hw_ctx, E1000_ICR);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1561 - pr_info("%s: interrupt received, ICR: 0x%x", ${config.name}, icr);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1562 - if (icr)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1563 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1564 - if (icr & E1000_INTR_LSC)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1565 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1566 - ${Log::info("handle_interrupt: cable link status changed, dumping card status:")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1567 - ${e1000::print_status(rtx_ether_ctx)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1568 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1569 - if (icr & (E1000_INTR_TXQE|E1000_INTR_TXDW))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1570 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1571 - ${Log::info("handle_interrupt: TxRing: packet(s) sent")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1572 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1573 - * XXX Do a Rathaxes call (how can I bind
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1574 - * "&${rtx_ether_ctx}->hw_ctx.tx_ring" to e1000::TxRing easily?)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1575 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1576 - rtx_e1000_tx_ring_clean(&${rtx_ether_ctx}->hw_ctx.tx_ring);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1577 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1578 - if (icr & E1000_INTR_RXT0)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1579 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1580 - ${Log::info("handle_interrupt: RxRing: packet(s) received")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1581 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1582 - if (icr & E1000_INTR_RXO)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1583 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1584 - ${Log::info("handle_interrupt: RxRing: overrun")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1585 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1586 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1587 - return IRQ_HANDLED;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1588 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1589 - }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1590 - }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1591 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1592 - template sequence e1000::xmit(Ethernet::Device rtx_ether_ctx, Socket::AbstractSKBuff kernel_skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1593 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1594 - chunk ::CALL()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1595 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1596 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1597 - * Put packets on the TX ring, must return NETDEV_TX_OK or
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1598 - * NETDEV_TX_BUSY.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1599 - */
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1600 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1601 - ${Socket::SKBuff} skb;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1602 - ${e1000::Context.ref} hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1603 - ${e1000::TxRing.ref} tx_ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1604 - ${Device::AbstractDevice.ref} devp;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1605 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1606 - ${local.skb.init(kernel_skb)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1607 - hw_ctx = &${rtx_ether_ctx}->hw_ctx;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1608 - tx_ring = &hw_ctx->tx_ring;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1609 - devp = (${Device::AbstractDevice.ref})${rtx_ether_ctx.device};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1610 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1611 - ${Log::info("xmit: skbuff details:")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1612 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1613 - * skb does not expand on the bound C variable (should be
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1614 - * rtx_skbuff), which is funny because it works for the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1615 - * sequence template call right after.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1616 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1617 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1618 - * XXX: doesn't work (I tried to pass self explicitely too):
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1619 - * ${local.skb.dump_infos()};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1620 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1621 - rtx_socket_skbuff_dump_infos(&skb);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1622 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1623 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1624 - * The transmission is going to be several steps:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1625 - * 1. TCP Segmentation Offload & Checksum Offloading: pick a
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1626 - * descriptor from the tx ring and fill it as a context
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1627 - * descriptor to allow the card to slice into several packets
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1628 - * according to the MSS;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1629 - * 2. DMA Map the skbuff data as slices of 4096;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1630 - * 3. Signal the hardware that data is available via a tx desc.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1631 - */
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1632 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1633 - /* XXX: same thing wanted to use: ${local.tx_ring.descriptors_remaining()} */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1634 - if (!rtx_e1000_tx_ring_descriptors_remaining(tx_ring))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1635 - return NETDEV_TX_BUSY;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1636 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1637 - /* 1. Offloading */
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1638 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1639 - /* XXX: ${local.tx_ring.tso_cksum_offload(skb)}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1640 - if (rtx_e1000_tx_ring_tso_cksum_offload(tx_ring, &skb))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1641 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1642 - ${Log::info("xmit: the packet needs to be fragmented and/or checksummed but this not implemented yet!")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1643 - goto err_offload;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1644 - }
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1645 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1646 - /* 2. Map the data */
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1647 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1648 - /* XXX: ${local.skb.map_to(devp.k_device)}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1649 - if (rtx_socket_skbuff_map(&skb, ${devp.k_device}, DMA_TO_DEVICE))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1650 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1651 - ${Log::info("xmit: can't DMA map a SKbuff")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1652 - goto err_skb_map_to;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1653 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1654 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1655 - /* 3. Update the TX Ring and signal the hardware */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1656 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1657 - /* XXX: ${local.tx_ring.put(skb)}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1658 - rtx_e1000_tx_ring_put(tx_ring, &skb);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1659 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1660 - /* XXX: ${local.tx_ring.start_xmit(hw_ctx)}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1661 - rtx_e1000_tx_ring_start_xmit(tx_ring, hw_ctx);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1662 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1663 - return NETDEV_TX_OK;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1664 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1665 - err_offload:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1666 - err_skb_map_to:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1667 - /* XXX: ${local.skb.unmap_to_and_free(local.dev)}; */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1668 - rtx_socket_skbuff_unmap_and_free(&skb, ${devp.k_device}, DMA_TO_DEVICE);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1669 - return NETDEV_TX_OK;
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1670 + hw_ctx: ${self}->ring.hw_ctx;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1671 + dma: ${self}->ring.dma;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1672 + size: ${self}->ring.size;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1673 + descs: ${self}->ring.descs;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1674 + buffs: ${self}->ring.buffs;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
1675 + desc_size: sizeof(rtxType_e1000_TxDescriptor); // XXX hardcoded
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1676 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1677 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1678 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1679 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1680 --- a/rathaxes/samples/e1000/e1000.rti
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1681 +++ b/rathaxes/samples/e1000/e1000.rti
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1682 @@ -1,157 +1,125 @@
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1683 -interface e1000 : Socket, Ethernet, DMA, PCI, LKM, Builtin
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1684 +interface e1000 : Socket, Ethernet, Device, DMA, PCI, LKM, Builtin
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1685 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1686 - required variable Builtin::number rx_ring_size;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1687 - required variable Builtin::number tx_ring_size;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1688 - required variable Builtin::number rx_buffer_len;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1689 - required variable Builtin::number tx_max_data_per_desc;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1690 + 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
1691 + 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
1692 + 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
1693 + required variable Builtin::number tx_max_data_per_desc;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1694
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1695 - provided type RxDescriptor
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1696 + // 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
1697 + 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
1698 + 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
1699 + 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
1700 + 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
1701 + 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
1702 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1703 + provided type Buffer
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1704 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1705 - chunk LKM::includes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1706 decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1707 - method init();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1708 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1709 + 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
1710 +
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1711 + attribute Socket::SKBuff.scalar sk_buff;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
1712 + attribute DMA::DMAHandle.scalar dma;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1713 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1714
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1715 - provided type TxDescriptor
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1716 + provided type Context
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1717 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1718 decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1719 - method init();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1720 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1721 + chunk LKM::includes();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1722 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1723 + chunk LKM::code();
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1724 + chunk Ethernet::HardwareContext();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1725 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1726 + // NOTE: Those callbacks/hooks should probably be in the front-end:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1727 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1728 + chunk Ethernet::adapter_init_context(Ethernet::Device, Builtin::symbol);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1729 + chunk Ethernet::adapter_reset(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1730 + chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1731 + chunk Ethernet::adapter_setup_rx_tx(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1732 + chunk Ethernet::adapter_enable_interrupts(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1733 + chunk Ethernet::adapter_disable_interrupts(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1734 + chunk Ethernet::adapter_handle_interrupt(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1735 + chunk Ethernet::adapter_xmit(Ethernet::Device, Socket::SKBuff);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1736 + chunk Ethernet::adapter_disable_rx(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1737 + chunk Ethernet::adapter_disable_tx(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1738 + chunk Ethernet::adapter_free_rx_tx(Ethernet::Device);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1739 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1740 + method init(Ethernet::Device net_dev, Builtin::symbol);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1741 + method print_status();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1742 + method reg_read32(Register);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1743 + method reg_write32(Register, Builtin::number);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1744 + method reg_set32(Register, Builtin::number);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1745 + method reg_unset32(Register, Builtin::number);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1746 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1747 + // XXX: Circular dependency with the rings, this will prevent us to
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1748 + // call methods even when issue $46 is resolved, it also forces us to
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1749 + // hardcode generated types in the definition of the type, and they
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1750 + // can't be "dereferenced" (e.g: local.hw_ctx.rx_ring.desc_size can't
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1751 + // work since local.hw_ctx.rx_ring is just going to be a symbol).
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1752 + attribute Builtin::symbol.scalar rx_ring;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1753 + attribute Builtin::symbol.scalar tx_ring;
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
1754 + attribute Builtin::symbol.ref io_addr;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1755 + attribute Ethernet::Device.ref net_dev;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1756 + }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1757 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1758 + provided type Ring
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1759 + {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1760 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1761 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1762 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1763 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1764 +
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1765 + method init(e1000::Context, Builtin::number, Builtin::number);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1766 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1767 + // Keep a backref to The context since it's going to be needed for of
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1768 + // operations involving the ethernet device, flags on the context, etc.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1769 + attribute Context.ref hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1770 + attribute DMA::DMAHandle.scalar dma;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1771 + attribute Builtin::number.scalar size; // Total size in bytes
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1772 + attribute Builtin::symbol.ref descs;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1773 + attribute Buffer.ref buffs;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1774 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1775
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1776 provided type RxRing
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1777 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1778 decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1779 - method init();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1780
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1781 - /* XXX: Callback that should be in the front-end: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1782 - chunk Ethernet::adapter_init_rx(Ethernet::Device);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1783 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1784 + chunk LKM::code();
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1785
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1786 - attribute DMA::DMAHandle.scalar dma_base;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1787 + method init(e1000::Context, Builtin::number);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1788 + method alloc(); // Returns != 0 on failure
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1789 + method free();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1790 + method configure();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1791 +
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1792 + // Re-expose all the Ring attributes + the size of a single descriptor:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1793 + attribute Context.ref hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1794 + attribute DMA::DMAHandle.scalar dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1795 attribute Builtin::number.scalar size;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1796 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1797 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1798 - provided type Context
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1799 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1800 - chunk Ethernet::HardwareContext();
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1801 - decl data_types();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1802 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1803 - /* XXX:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1804 - * These callbacks/Hooks which should probably be in the front-end.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1805 - * Also, I'm not too happy about the names, it's difficult to make
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1806 - * the difference between the probe and open parts.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1807 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1808 - chunk Ethernet::adapter_init_context(Ethernet::Device,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1809 - Builtin::number,
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1810 - Builtin::symbol);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1811 - chunk Ethernet::adapter_reset(Ethernet::Device);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1812 - chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1813 - chunk Ethernet::adapter_setup(Ethernet::Device);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1814 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1815 - attribute RxRing.scalar rx_ring;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1816 - /* XXX: circular dependency with Contex: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1817 - //attribute TxRing.scalar tx_ring;
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1818 + attribute RxDescriptor.ref descs;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1819 + attribute Builtin::number.scalar desc_size;
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1820 + attribute Buffer.ref buffs;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1821 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1822
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1823 provided type TxRing
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1824 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1825 + decl data_types();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1826 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1827 chunk LKM::prototypes();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1828 chunk LKM::code();
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1829 - decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1830 - method init();
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1831
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1832 - /* XXX: Callback that should be in the front-end: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1833 - chunk Ethernet::adapter_init_tx(Ethernet::Device);
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1834 + method init(e1000::Context, Builtin::number);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1835 + method alloc(); // Returns != 0 on failure
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1836 + method free();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1837 + method configure();
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1838
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1839 - /* Clean the ring (i.e: move the head closer to the tail): */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1840 - method clean();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1841 - /* Return the number of clean descriptors left in the ring: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1842 - method descriptors_remaining();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1843 - method tso_cksum_offload(Socket::SKBuff);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1844 - method put(Socket::SKBuff);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1845 - /* Signal the device that new dirty descriptors are on the ring: */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1846 - method start_xmit(e1000::Context);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1847 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1848 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1849 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1850 - * These two types should actually be registers definitions in the frontend:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1851 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1852 - provided type Register
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1853 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1854 - decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1855 - method init(Builtin::number);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1856 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1857 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1858 - provided type Commands
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1859 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1860 - decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1861 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1862 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1863 - provided type TxDescriptorFlags
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1864 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1865 - decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1866 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1867 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1868 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1869 - * This should take an e1000::Context as the first argument but this was
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1870 - * not working as wished.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1871 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1872 - provided sequence print_status(Ethernet::Device)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1873 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1874 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1875 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1876 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1877 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1878 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1879 - provided sequence activate_device_interruption(Ethernet::Device)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1880 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1881 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1882 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1883 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1884 - provided sequence set_up_device(Ethernet::Device)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1885 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1886 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1887 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1888 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1889 - provided sequence free_rx_tx(Ethernet::Device dev)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1890 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1891 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1892 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1893 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1894 - provided sequence handle_interrupt(Ethernet::Device)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1895 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1896 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1897 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1898 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1899 - provided sequence xmit(Ethernet::Device, Socket::AbstractSKBuff)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1900 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1901 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1902 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1903 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1904 - provided sequence register_read32(e1000::Context, e1000::Register)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1905 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1906 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1907 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1908 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1909 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1910 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1911 - provided sequence register_write32(e1000::Context, e1000::Register, ::number)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1912 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1913 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1914 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1915 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1916 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1917 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1918 - provided sequence register_set32(e1000::Context, e1000::Register, ::number)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1919 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1920 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1921 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1922 - provided chunk ::CALL();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1923 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1924 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1925 - provided sequence register_unset32(e1000::Context, e1000::Register, ::number)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1926 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1927 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1928 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1929 - provided chunk ::CALL();
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1930 + // Re-expose all the Ring attributes + the size of a single descriptor:
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1931 + attribute Context.ref hw_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1932 + attribute DMA::DMAHandle.scalar dma;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1933 + attribute Builtin::number.scalar size;
136
8229a46ec658 Wip, it generates now…
Louis Opter <louis@lse.epita.fr>
parents: 135
diff changeset
1934 + attribute TxDescriptor.ref descs;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1935 + attribute Builtin::number.scalar desc_size;
134
Louis Opter <kalessin@kalessin.fr>
parents: 133
diff changeset
1936 + attribute Buffer.ref buffs;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1937 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1938 }
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1939 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
1940 --- 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
1941 +++ b/rathaxes/samples/e1000/ethernet.blt
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1942 @@ -1,4 +1,4 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1943 -with Ethernet, PCI, LKM, Log, Builtin
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1944 +with LKM, Socket, PCI, Log, Builtin, Ethernet
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1945 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1946 template type Ethernet::ProtocolId()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1947 {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1948 @@ -9,7 +9,7 @@
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1949
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1950 chunk LKM::prototypes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1951 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1952 - static const char *rtx_ethernet_protocol_id_to_str(unsigned short);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1953 + static const char *rtx_ethernet_protocol_id_to_str(unsigned short);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1954 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1955
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1956 chunk LKM::data()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1957 @@ -28,7 +28,7 @@
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1958
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1959 chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1960 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1961 - static const char *rtx_ethernet_protocol_id_to_str(unsigned short proto_id)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1962 + static const char *rtx_ethernet_protocol_id_to_str(unsigned short proto_id)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1963 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1964 for (int i = 0;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
1965 i != sizeof(rtx_ethernet_proto_table) / sizeof(rtx_ethernet_proto_table[0]);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1966 @@ -61,7 +61,7 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1967
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1968 method init(Builtin::symbol dev)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1969 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1970 - ${self} = (${Ethernet::AbstractDevice} *)${dev};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1971 + ${self} = (${Ethernet::AbstractDevice.ref})${dev};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1972 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1973
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1974 map
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1975 @@ -97,16 +97,19 @@
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1976
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1977 chunk LKM::prototypes()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1978 {
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1979 - static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref}, ${Socket::SKBuff.ref}, ${Builtin::number});
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1980 + static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref}, ${Socket::SKBuff.ref}, unsigned int);
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1981 }
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1982
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1983 chunk LKM::code()
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1984 {
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1985 - static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref} self, ${Socket::SKBuff.ref} sk_buff, ${Builtin::number} size)
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
1986 + static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref} self, ${Socket::SKBuff.ref} sk_buff, unsigned int size)
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1987 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1988 - ${Socket::AbstractSKBuff} k_sk_buff = netdev_alloc_skb(${local.self.net_device.k_net_dev}, ${local.size});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1989 - if (${local.k_sk_buff) {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1990 - ${local.sk_buff.init(local.k_sk_buff, local.size)};
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1991 + ${Socket::AbstractSKBuff.ref} k_skb = netdev_alloc_skb(${local.self.net_device.k_net_dev}, ${local.size});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1992 + if (${local.k_skb}) {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1993 + // XXX meh, can't use the init method since we get a copy
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1994 + // of the pointer, so we have to do this which is
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1995 + // inconsistent with the rest of code:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
1996 + sk_buff->skbuff = k_skb;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1997 return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1998 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
1999 return 1;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2000 @@ -148,7 +151,7 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2001 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2002 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2003
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2004 - template sequence Ethernet::open(Ethernet::Device dev)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2005 + template sequence Ethernet::open()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2006 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2007 chunk LKM::includes()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2008 {
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2009 @@ -157,100 +160,115 @@
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2010
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2011 chunk LKM::prototypes()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2012 {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2013 - static int rtx_ethernet_open(struct net_device *);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2014 + static int rtx_ethernet_open(struct net_device *);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2015 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2016
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2017 chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2018 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2019 - static int rtx_ethernet_open(struct net_device *dev)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2020 + static int rtx_ethernet_open(struct net_device *dev)
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2021 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2022 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2023 - * 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
2024 - * "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
2025 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2026 ${Ethernet::AbstractDevice.ref} rtx_net_dev;
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2027 - { /* XXX: I end up with a placeholder if I don't open a scope */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2028 - ${local.rtx_net_dev.init(local.dev)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2029 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2030 + ${local.rtx_net_dev.init(local.dev)};
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2031 ${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
2032
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2033 - int error;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2034 - {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2035 - ${Log::info("installing the interrupt handler")};
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2036 - }
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2037 - 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
2038 - rtx_ethernet_interrupt_handler,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2039 - IRQF_SHARED,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2040 - ${config.name},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2041 - dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2042 - if (error)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2043 - {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2044 + ${pointcut Ethernet::adapter_setup_rx_tx(local.rtx_ether_ctx)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2045 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2046 + ${Log::info("Installing the interrupt handler")};
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2047 + int error = request_irq(
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2048 + ${local.rtx_ether_ctx.irq},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2049 + rtx_ethernet_interrupt_handler,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2050 + IRQF_SHARED,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2051 + ${config.name},
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2052 + dev
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2053 + );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2054 + if (error) {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2055 ${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
2056 return error;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2057 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2058 - ${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
2059 - ${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
2060 - ${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
2061 - ${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
2062 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2063 + ${pointcut Ethernet::adapter_enable_interrupts(local.rtx_ether_ctx)};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2064 +
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2065 + return 0;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2066 +
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2067 + rtx_ethernet_open_fail:
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2068 + return -EIO; // XXX Probably not appropriate.
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2069 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2070 + }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2071 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2072 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2073 + chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2074 + {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2075 + }
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2076 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2077 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2078 + template sequence Ethernet::send()
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2079 + {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2080 + chunk LKM::prototypes()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2081 + {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2082 + static int rtx_ethernet_xmit(struct sk_buff *skb, struct net_device *dev);
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2083 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2084 +
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2085 + chunk LKM::code()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2086 + {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2087 + static int rtx_ethernet_xmit(struct sk_buff *k_skb, struct net_device *net_dev)
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2088 + {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2089 + ${Ethernet::Device.ref} rtx_ether_ctx = netdev_priv(net_dev);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2090 + ${Socket::SKBuff.ref} rtx_skb;
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2091 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2092 + ${cast local.k_skb as Socket::AbstractSKBuff.ref};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2093 + ${local.rtx_skb.init(local.k_skb)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2094 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2095 + ${Log::info("we have one packet to transmit!")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2096 + ${pointcut Ethernet::adapter_xmit(local.rtx_ether_ctx, local.rtx_skb)};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2097 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2098 + }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2099 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2100 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2101 + chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2102 + {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2103 + }
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2104 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2105 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2106 + template sequence Ethernet::close()
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2107 + {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2108 + chunk LKM::prototypes()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2109 + {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2110 + static int rtx_ethernet_close(struct net_device *);
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2111 + }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2112 +
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2113 + chunk LKM::code()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2114 + {
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2115 + static int rtx_ethernet_close(struct net_device *net_dev)
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2116 + {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2117 + ${cast local.net_dev as Ethernet::AbstractDevice.ref};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2118 + ${Ethernet::Device.ref} rtx_ether_ctx = ${local.net_dev.rtx_ether_ctx};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2119 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2120 + ${pointcut Ethernet::adapter_disable_rx(local.rtx_ether_ctx)};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2121 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2122 + netif_tx_disable(net_dev);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2123 + ${pointcut Ethernet::adapter_disable_tx(local.rtx_ether_ctx)};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2124 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2125 + ${pointcut Ethernet::adapter_disable_interrupts(local.rtx_ether_ctx)};
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2126 + free_irq(${local.rtx_ether_ctx.irq}, dev);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2127 + ${Log::info("interrupt handler free'ed")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2128 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2129 + // TODO/XXX: There is definitely more stuff to do around here
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2130 + // (e.g: clean the rings, flush some stuff...)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2131 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2132 + ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2133 + ${pointcut Ethernet::adapter_free_rx_tx(local.rtx_ether_ctx)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2134
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2135 return 0;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2136 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2137 }
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2138 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2139
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2140 - template sequence Ethernet::send(Ethernet::Device dev, Socket::AbstractSKBuff skb)
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2141 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2142 - chunk LKM::prototypes()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2143 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2144 + chunk ::CALL()
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2145 {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2146 - static int rtx_ethernet_xmit(struct sk_buff* skb, struct net_device *dev);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2147 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2148 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2149 - chunk LKM::code()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2150 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2151 - static int rtx_ethernet_xmit(struct sk_buff* kernel_skb, struct net_device *net_dev)
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2152 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2153 - ${Ethernet::Device.ref} rtx_ether_ctx = netdev_priv(net_dev);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2154 - ${Socket::AbstractSKBuff.ref} rtx_skb = (${Socket::AbstractSKBuff.ref}) kernel_skb;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2155 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2156 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx, local.rtx_skb)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2157 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2158 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2159 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2160
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2161 - template sequence Ethernet::close(Ethernet::Device dev)
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2162 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2163 - chunk LKM::prototypes()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2164 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2165 - static int rtx_ethernet_close(struct net_device *);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2166 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2167 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2168 - chunk LKM::code()
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2169 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2170 - static int rtx_ethernet_close(struct net_device *dev)
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2171 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2172 - ${Ethernet::AbstractDevice.ref} rtx_net_dev;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2173 - { /* XXX: I end up with a placeholder if I don't open a scope */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2174 - ${local.rtx_net_dev.init(local.dev)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2175 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2176 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2177 - ${Ethernet::Device.ref} rtx_ether_ctx = ${local.rtx_net_dev.rtx_ether_ctx};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2178 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2179 - /* TODO: change this pointcut into a pointcut/adapter/callback: */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2180 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2181 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2182 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2183 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2184 - free_irq(${local.rtx_ether_ctx.irq}, dev);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2185 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2186 - ${Log::info("interrupt handler free'ed")};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2187 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2188 -
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2189 - return 0;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2190 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2191 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2192 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2193 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2194 - template sequence Ethernet::interrupt_handler(Ethernet::Device dev)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2195 + template sequence Ethernet::interrupt_handler()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2196 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2197 /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2198 * We can't use the irqreturn_t type here because CNornm doesn't know
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2199 @@ -258,29 +276,34 @@
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2200 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2201 chunk LKM::prototypes()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2202 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2203 - static enum irqreturn rtx_ethernet_interrupt_handler(int, void *);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2204 + static enum irqreturn rtx_ethernet_interrupt_handler(int, void *);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2205 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2206
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2207 chunk LKM::code()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2208 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2209 - static enum irqreturn rtx_ethernet_interrupt_handler(int irq, void *dev_id)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2210 + static enum irqreturn rtx_ethernet_interrupt_handler(int irq, void *dev_id)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2211 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2212 ${Ethernet::AbstractDevice.ref} rtx_net_dev = dev_id;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2213 ${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
2214 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
2215
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2216 - ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2217 + ${pointcut Ethernet::adapter_handle_interrupt(local.rtx_ether_ctx)};
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2218
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2219 return IRQ_NONE;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2220 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2221 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2222 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2223 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2224 + chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2225 + {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2226 + }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2227 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2228
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2229 template sequence Ethernet::init()
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2230 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2231 chunk LKM::data()
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2232 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2233 - static const struct net_device_ops rtx_ether_ops =
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2234 + static const struct net_device_ops rtx_ether_ops =
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2235 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2236 .ndo_open = rtx_ethernet_open,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2237 .ndo_stop = rtx_ethernet_close,
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2238 @@ -288,74 +311,65 @@
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2239 };
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2240 }
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2241
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2242 - /*
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2243 - * NOTE: for now, the error handling is leaking from PCI::probe(), but
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2244 - * it's better than doing it at all.
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2245 - *
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2246 - * XXX: the chunk argument isn't correctly expanded by the
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2247 - * compiler I have to use the same name as the actual C
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2248 - * variable:
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2249 - */
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2250 + // NOTE: for now, the error handling is leaking from PCI::probe(), but
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2251 + // it's better than not doing it at all.
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2252 + //
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2253 + // XXX: the chunk argument isn't correctly expanded by the compiler I
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2254 + // have to use the same name as the actual C variable:
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2255 chunk PCI::pci_probe_hook(PCI::Device rtx_pci_dev)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2256 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2257 - ${Ethernet::AbstractDevice.ref} rtx_net_dev;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2258 - ${Ethernet::Device.ref} rtx_ether_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2259 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2260 + ${Ethernet::AbstractDevice.ref} rtx_net_dev;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2261 + ${Ethernet::Device.ref} rtx_ether_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2262
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2263 - rtx_net_dev = (${Ethernet::AbstractDevice.ref})alloc_etherdev(sizeof(*rtx_ether_ctx));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2264 - if (!rtx_net_dev)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2265 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2266 - ${Log::info("cannot allocate the ethernet device context")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2267 - error = -ENOMEM;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2268 - goto fail;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2269 + rtx_net_dev = (${Ethernet::AbstractDevice.ref})alloc_etherdev(sizeof(*rtx_ether_ctx));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2270 + if (!rtx_net_dev)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2271 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2272 + ${Log::info("cannot allocate the ethernet device context")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2273 + error = -ENOMEM;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2274 + goto fail;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2275 + }
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2276 + // XXX Past this point we should have another label to do
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2277 + // free_netdev(rtx_net_dev) in case of failure but we don't
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2278 + // have a nice way of doing that.
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2279 + SET_NETDEV_DEV(${local.rtx_net_dev.k_net_dev}, ${rtx_pci_dev.device});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2280 + strlcpy(${local.rtx_net_dev.k_net_dev}->name,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2281 + ${config.ifname},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2282 + sizeof(${local.rtx_net_dev.k_net_dev}->name));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2283 + ${local.rtx_net_dev.k_net_dev}->irq = ${rtx_pci_dev.irq};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2284 + ${local.rtx_net_dev.k_net_dev}->netdev_ops = &rtx_ether_ops;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2285 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2286 + error = register_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2287 + if (error)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2288 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2289 + ${Log::info("cannot register the driver in the net subsystem")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2290 + goto fail;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2291 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2292 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2293 + /* Initialize our context held by the net_device structure */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2294 + { /* XXX: I end up with a placeholder if I don't open a scope */
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2295 + ${local.rtx_ether_ctx.init(local.rtx_net_dev, rtx_pci_dev.pci_device)};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2296 + }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2297 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2298 + /* Register ourselves in the parent context: */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2299 + /* ${rtx_pci_dev.set_context(local.rtx_ether_ctx)}; */
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2300 + ${rtx_pci_dev.rtx_drv_context} = rtx_ether_ctx;
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2301 +
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2302 + /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2303 + * XXX: the asssignments/casts are here to circumvent
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2304 + * typing issues in the compiler (see previous XXX).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2305 + */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2306 + unsigned char /* __iomem */ *io_addr = ${rtx_pci_dev.ioaddr};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2307 + ${pointcut Ethernet::adapter_init_context(local.rtx_ether_ctx, local.io_addr)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2308 + ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2309 + ${pointcut Ethernet::adapter_load_mac_address(local.rtx_ether_ctx)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2310 + memcpy(${local.rtx_ether_ctx.perm_addr},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2311 + ${local.rtx_ether_ctx.dev_addr},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2312 + ${local.rtx_net_dev.k_net_dev}->addr_len);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2313 }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2314 - SET_NETDEV_DEV(${local.rtx_net_dev.k_net_dev}, ${rtx_pci_dev.device});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2315 - strlcpy(${local.rtx_net_dev.k_net_dev}->name,
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2316 - ${config.ifname},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2317 - sizeof(${local.rtx_net_dev.k_net_dev}->name));
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2318 - ${local.rtx_net_dev.k_net_dev}->irq = ${rtx_pci_dev.irq};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2319 - ${local.rtx_net_dev.k_net_dev}->netdev_ops = &rtx_ether_ops;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2320 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2321 - error = register_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2322 - if (error)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2323 - {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2324 - ${Log::info("cannot register the driver in the net subsystem")};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2325 - goto fail;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2326 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2327 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2328 - /* Initialize our context held by the net_device structure */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2329 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2330 - * XXX: the cast is here because the compiler resolve the
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2331 - * type of rtx_pci_dev.pci_device to the type of
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2332 - * rtx_pci_dev instead of the type of rtx_pci_dev.pci_device.
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2333 - */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2334 - ${PCI::AbstractDevice.ref} workaround = ${rtx_pci_dev.pci_device};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2335 - ${cast local.workaround as PCI::AbstractDevice};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2336 - { /* XXX: I end up with a placeholder if I don't open a scope */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2337 - ${local.rtx_ether_ctx.init(local.rtx_net_dev, local.workaround)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2338 - }
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2339 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2340 - /* Register ourselves in the parent context: */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2341 - /* ${rtx_pci_dev.set_context(local.rtx_ether_ctx)}; */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2342 - ${rtx_pci_dev}->context = rtx_ether_ctx;
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2343 -
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2344 - /*
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2345 - * XXX: the asssignments/casts are here to circumvent
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2346 - * typing issues in the compiler (see previous XXX).
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2347 - */
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2348 - int bars = ${rtx_pci_dev.bars};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2349 - unsigned char /* __iomem */ *ioaddr = ${rtx_pci_dev.ioaddr};
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2350 - ${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
2351 - ${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
2352 - local.bars,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2353 - local.ioaddr)};
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2354 - ${pointcut Ethernet::adapter_reset(local.rtx_ether_ctx)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2355 - ${pointcut Ethernet::adapter_load_mac_address(local.rtx_ether_ctx)};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2356 - memcpy(${local.rtx_ether_ctx.perm_addr},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2357 - ${local.rtx_ether_ctx.dev_addr},
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2358 - ${local.rtx_net_dev.k_net_dev}->addr_len);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2359 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2360
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2361 - /* This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2362 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2363 chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2364 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2365 }
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2366 @@ -369,15 +383,17 @@
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2367 */
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2368 chunk PCI::pci_remove_hook(PCI::Device rtx_pci_dev)
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2369 {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2370 - ${Ethernet::Device.ref} rtx_ether_ctx = ${rtx_pci_dev.rtx_drv_context};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2371 - BUG_ON(!rtx_ether_ctx);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2372 + {
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2373 + ${Ethernet::Device.ref} rtx_ether_ctx = ${rtx_pci_dev.rtx_drv_context};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2374 + BUG_ON(!rtx_ether_ctx);
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2375
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2376 - ${Ethernet::AbstractDevice.ref} rtx_net_dev = ${local.rtx_ether_ctx.net_device};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2377 - unregister_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2378 - free_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2379 + ${Ethernet::AbstractDevice.ref} rtx_net_dev = ${local.rtx_ether_ctx.net_device};
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2380 + unregister_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2381 + free_netdev(${local.rtx_net_dev.k_net_dev});
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2382 + }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2383 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2384
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2385 - /* This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2386 + /* XXX This chunk should be removed (see #26) */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2387 chunk ::CALL()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2388 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2389 }
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2390 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
2391 --- 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
2392 +++ b/rathaxes/samples/e1000/ethernet.rti
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2393 @@ -2,16 +2,16 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2394 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2395 required variable Builtin::string ifname;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2396
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2397 - provided type ProtocolId
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2398 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2399 - chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2400 - chunk LKM::data();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2401 - chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2402 - decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2403 + provided type ProtocolId
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2404 + {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2405 + chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2406 + chunk LKM::data();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2407 + chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2408 + decl data_types();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2409
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2410 - attribute Builtin::number.scalar id;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2411 - attribute Builtin::string.scalar str;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2412 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2413 + attribute Builtin::number.scalar id;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2414 + attribute Builtin::string.scalar str;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2415 + }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2416
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2417 provided type AbstractDevice
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2418 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2419 @@ -28,72 +28,88 @@
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2420
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2421 provided type Device
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2422 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2423 + decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2424 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2425 chunk LKM::includes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2426 - decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2427 + chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2428 + chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2429 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2430 pointcut Ethernet::HardwareContext();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2431
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2432 method init(Ethernet::AbstractDevice, PCI::AbstractDevice);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2433 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2434 - * Alloc (the AbstractSKBuff inside) the given SKBuff and initialize
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2435 - * the SKBuff, return 1 if the allocation failed, 0 on success.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2436 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2437 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2438 + // Alloc (the AbstractSKBuff inside) the given SKBuff and initialize
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2439 + // the SKBuff, return 1 if the allocation failed, 0 on success:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2440 method alloc_rx_skbuff(Socket::SKBuff, Builtin::number);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2441
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2442 attribute Device::AbstractDevice.ref device;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2443 attribute PCI::AbstractDevice.ref pci_device;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2444 attribute Ethernet::AbstractDevice.ref net_device;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2445 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2446 - * I'd like to use better names here, but I'd like to understand the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2447 - * difference between the two first:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2448 - */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2449 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2450 + // I'd like to use better names here, but I'd like to understand the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2451 + // difference between the two first:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2452 attribute Builtin::symbol.ref perm_addr;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2453 attribute Builtin::symbol.ref dev_addr;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2454 attribute Builtin::symbol.scalar irq;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2455 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2456
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2457 - required sequence open(Ethernet::Device)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2458 + provided sequence open()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2459 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2460 - provided chunk LKM::includes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2461 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2462 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2463 + provided chunk LKM::includes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2464 + provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2465 + provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2466
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2467 - /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2468 - * For e1000, this part is documented in the Intel Gigabit Ethernet
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2469 - * Controller Software Developper manual. (You can find it in the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2470 - * doc/hardware directory).
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2471 - */
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2472 - 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
2473 - 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
2474 - provided pointcut Ethernet::adapter_init_tx(Ethernet::Device);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2475 + // Prepare the device and the resources for rx/tx:
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2476 + provided pointcut Ethernet::adapter_setup_rx_tx(Ethernet::Device);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2477 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2478 + // Enable interrupts:
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2479 + 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
2480 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2481
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2482 - required sequence send(Ethernet::Device, Socket::AbstractSKBuff)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2483 + provided sequence send()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2484 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2485 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2486 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2487 + provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2488 + provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2489 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2490 + // Put a packet on the tx ring and signal the device:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2491 + provided pointcut Ethernet::adapter_xmit(Ethernet::Device, Socket::SKBuff);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2492 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2493
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2494 - required sequence close(Ethernet::Device)
133
dbb4a3b383cb Wip on build
Louis Opter <kalessin@kalessin.fr>
parents: 132
diff changeset
2495 + provided sequence close()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2496 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2497 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2498 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2499 + provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2500 + provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2501 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2502 + provided pointcut Ethernet::adapter_disable_rx(Ethernet::Device);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2503 + provided pointcut Ethernet::adapter_disable_tx(Ethernet::Device);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2504 + provided pointcut Ethernet::adapter_disable_interrupts(Ethernet::Device);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2505 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2506 + // Clean and free all resources on the rx/tx rings:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2507 + provided pointcut Ethernet::adapter_free_rx_tx(Ethernet::Device);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2508 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2509
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2510 - required sequence interrupt_handler(Ethernet::Device)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2511 + provided sequence interrupt_handler()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2512 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2513 - provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2514 - provided chunk LKM::code();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2515 + provided chunk LKM::prototypes();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2516 + provided chunk LKM::code();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2517 +
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2518 + // Interrupt handler:
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2519 + provided pointcut Ethernet::adapter_handle_interrupt(Ethernet::Device);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2520 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2521
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2522 - provided sequence init()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2523 + provided sequence init()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2524 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2525 - provided chunk LKM::data();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2526 - provided chunk PCI::pci_probe_hook(PCI::Device);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2527 + provided chunk LKM::data();
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2528 + provided chunk PCI::pci_probe_hook(PCI::Device);
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2529
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2530 - 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
2531 - Builtin::number,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2532 - Builtin::symbol);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2533 + // Init the hardware context structure, doesn't allocate anything:
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2534 + provided pointcut Ethernet::adapter_init_context(Ethernet::Device, Builtin::symbol);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2535 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2536 + // Reset the adapter:
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2537 provided pointcut Ethernet::adapter_reset(Ethernet::Device);
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2538 +
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2539 + // Load the MAC address from the EEPROM and save it into the
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2540 + // dev_addr field/attribute of Ethernet::Device:
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2541 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
2542 }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2543
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2544 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
2545 --- 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
2546 +++ b/rathaxes/samples/e1000/lkm.rtx
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2547 @@ -1,40 +1,5 @@
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2548 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
2549 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2550 - Ethernet::open(Ethernet::Device dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2551 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2552 - Log::info("opening the device");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2553 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2554 - e1000::activate_device_interruption(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2555 - Log::info("interruption enabled");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2556 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2557 - e1000::print_status(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2558 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2559 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2560 - Ethernet::close(Ethernet::Device dev)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2561 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2562 - Log::info("closing the device");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2563 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2564 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2565 - * 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
2566 - * 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
2567 - * stuff before free_interrupt_handler().
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2568 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2569 - e1000::free_rx_tx(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2570 - 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
2571 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2572 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2573 - 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
2574 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2575 - Log::info("got an interruption");
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2576 - e1000::handle_interrupt(dev);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2577 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2578 -
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2579 - Ethernet::send(Ethernet::Device dev, Socket::AbstractSKBuff skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2580 - {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2581 - Log::info("we have one packet to transmit!");
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2582 - e1000::xmit(dev, skb);
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2583 - }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2584 -
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2585 LKM::init()
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2586 {
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2587 Log::info("loading module");
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2588 @@ -50,7 +15,7 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2589 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2590 LKM::name = "rtx_e1k";
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2591 LKM::author = "Rathaxes";
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2592 - LKM::description = "Hello World Loadable Kernel Module (LKM)";
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2593 + LKM::description = "Rathaxes Intel PCI Gigabit NIC sample driver";
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2594 LKM::license = "GPL";
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2595
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2596 /*
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2597 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/old_e1000.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2598 copy from rathaxes/samples/e1000/e1000.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2599 copy to rathaxes/samples/e1000/old_e1000.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2600 --- a/rathaxes/samples/e1000/e1000.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2601 +++ b/rathaxes/samples/e1000/old_e1000.blt
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2602 @@ -170,14 +170,15 @@
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2603 for (i = 0; i != ${config.rx_ring_size}; ++i)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2604 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2605 ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i];
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2606 - // XXX #46: ${rtx_ether_ctx.init_rx_skbuff(local.skbuff, config.rx_buffer_len)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2607 - if (rtx_ethernet_init_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2608 + // XXX #46: ${rtx_ether_ctx.alloc_rx_skbuff(local.skbuff, config.rx_buffer_len)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2609 + if (rtx_ethernet_alloc_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len}))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2610 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2611 ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2612 goto err_skbuffs_alloc;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2613 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2614 - // XXX #46: ${local.skbuff.map_from(rtx_ether_ctx.device)};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2615 - if (rtx_socket_skbuff_map(${local.skbuff}, ${rtx_ether_ctx.device}, RTX_DMA_FROM_DEVICE))
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2616 + /* XXX: recuperer le dma handle et le placer correctement dans le descripteur. */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2617 + ${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)}
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2618 + if (${DMA::map(local.rtx_ether_ctx.device, local.skbuff.data, local.skbuff.len, RTX_DMA_FROM_DEVICE)})
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2619 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2620 ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2621 goto err_skbuffs_map;
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2622 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/old_e1000.rti
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2623 copy from rathaxes/samples/e1000/e1000.rti
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2624 copy to rathaxes/samples/e1000/old_e1000.rti
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2625 diff --git a/rathaxes/samples/e1000/pci.blt b/rathaxes/samples/e1000/pci.blt
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2626 --- a/rathaxes/samples/e1000/pci.blt
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2627 +++ b/rathaxes/samples/e1000/pci.blt
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2628 @@ -1,4 +1,4 @@
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2629 -with PCI, LKM, Log
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2630 +with LKM, Log, PCI
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2631 {
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2632 template type PCI::AbstractDevice()
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2633 {
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2634 @@ -73,9 +73,8 @@
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2635
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2636 method init(PCI::AbstractDevice pdev)
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2637 {
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2638 - ${PCI::AbstractDevice.ref} workaround = (${PCI::AbstractDevice.ref})pdev;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2639 ${self}->pdev = ${pdev};
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2640 - ${self}->bars = pci_select_bars(${local.workaround.k_pci_dev}, IORESOURCE_MEM);
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2641 + ${self}->bars = pci_select_bars(${pdev.k_pci_dev}, IORESOURCE_MEM);
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2642 ${self}->ioaddr = NULL;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2643 ${self}->context = NULL;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2644 }
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2645 @@ -92,13 +91,12 @@
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2646
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2647 method select_ioaddr(Builtin::number bar)
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2648 {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2649 - ${PCI::AbstractDevice.ref} select_ioaddr_pdev = ${self}->pdev;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2650 - ${self}->ioaddr = pci_ioremap_bar(${local.select_ioaddr_pdev.k_pci_dev}, ${bar});
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2651 + ${self.ioaddr} = pci_ioremap_bar(${self.pci_device.k_pci_dev}, ${bar});
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2652 }
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2653
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2654 method set_rtx_drv_context(Builtin::symbol ctx)
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2655 {
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2656 - ${self}->context = ctx;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2657 + ${self.rtx_drv_context} = ${ctx};
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2658 }
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2659
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2660 map
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2661 @@ -127,7 +125,7 @@
137
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2662 const struct pci_device_id *pdev_id)
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2663 {
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2664 int error;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2665 - ${PCI::Device.ref} rtx_pci_dev;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2666 + ${PCI::Device.ref} rtx_pci_dev = NULL;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2667 ${PCI::AbstractDevice.ref} rtx_pdev = (${PCI::AbstractDevice.ref})pdev;
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2668
8bbdb488f6fe Wip, cleaning up the probe function
Louis Opter <kalessin@kalessin.fr>
parents: 136
diff changeset
2669 rtx_pci_dev = kmalloc(sizeof(*rtx_pci_dev), GFP_KERNEL);
138
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2670 @@ -138,13 +136,7 @@
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2671 goto fail;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2672 }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2673
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2674 - /*
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2675 - * XXX: I'm getting placeholder in the generated code if I don't
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2676 - * open a scope here:
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2677 - */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2678 - {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2679 - ${local.rtx_pci_dev.init(local.rtx_pdev)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2680 - }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2681 + ${local.rtx_pci_dev.init(local.rtx_pdev)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2682
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2683 /* ${local.pdev.set_rtx_context(local.rtx_pci_dev)}; */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2684 pci_set_drvdata(pdev, rtx_pci_dev);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2685 @@ -157,14 +149,14 @@
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2686 goto fail;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2687 }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2688
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2689 - /* ${local.rtx_pci_dev.select_ioaddr(local.rtx_pci_dev.BAR_0)}; */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2690 - rtx_pci_dev->ioaddr = pci_ioremap_bar(
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2691 + // XXX #46: ${local.rtx_pci_dev.select_ioaddr(local.rtx_pci_dev.BAR_0)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2692 + ${local.rtx_pci_dev.ioaddr} = pci_ioremap_bar(
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2693 pdev, ${local.rtx_pci_dev.BAR_0}
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2694 );
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2695 if (!${local.rtx_pci_dev.ioaddr})
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2696 {
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2697 ${Log::info("can't map the device address space")};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2698 - error = 1; /* XXX anything more approriate? */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2699 + error = -EIO; /* XXX anything more approriate? */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2700 goto fail;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2701 }
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2702
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2703 @@ -173,7 +165,7 @@
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2704 return 0;
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2705
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2706 fail:
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2707 - /* ${local.pdev.set_rtx_drv_context(NULL)}; */
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2708 + // ${local.pdev.set_rtx_drv_context(NULL)};
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2709 pci_set_drvdata(pdev, NULL);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2710 kfree(rtx_pci_dev);
Louis Opter <kalessin@kalessin.fr>
parents: 137
diff changeset
2711 return error;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2712 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
2713 --- 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
2714 +++ b/rathaxes/samples/e1000/socket.blt
140
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2715 @@ -1,4 +1,4 @@
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2716 -with Socket, LKM, Device, DMA, Ethernet
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2717 +with LKM, Device, DMA, Ethernet, Socket
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2718 {
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2719 template type Socket::AbstractSKBuff()
Louis Opter <louis@lse.epita.fr>
parents: 139
diff changeset
2720 {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2721 @@ -22,16 +22,12 @@
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2722 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2723 decl data_types()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2724 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2725 - ${Socket::AbstractSKBuff.ref} skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2726 - ${DMA::AbstractDMAHandle.scalar} dma_handle;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2727 - unsigned int size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2728 + ${Socket::AbstractSKBuff.ref} skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2729 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2730
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2731 chunk LKM::prototypes()
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2732 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2733 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
2734 - 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
2735 - 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
2736 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2737
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2738 chunk LKM::code()
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2739 @@ -52,96 +48,32 @@
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2740 * arguments yet.
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2741 */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2742 pr_info(
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2743 - "\t protocol = %#-5x (%s) ip_summed = %d (%s)\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2744 - "\t len = %-5u data_len = %-5u head_len = %-5u\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2745 - "\t nr_frags = %u\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2746 - "\t gso_size = %-5u gso_segs = %-5u gso_type = %-5u",
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2747 - /* XXX: can't use ${local.ethernet_proto.id} here (issue #52): */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2748 - ethernet_proto.id, ${local.ethernet_proto.str},
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2749 - ${local.self.sk_buff.k_sk_buff}->ip_summed, ip_summed_values[${local.self.sk_buff.k_sk_buff}->ip_summed],
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2750 - ${local.self.sk_buff.k_sk_buff}->len, ${local.self.sk_buff.k_sk_buff}->data_len, skb_headlen(${local.self.sk_buff.k_sk_buff}),
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2751 - shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2752 + "\t protocol = %#-5x (%s) ip_summed = %d (%s)\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2753 + "\t len = %-5u data_len = %-5u head_len = %-5u\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2754 + "\t nr_frags = %u\n"
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2755 + "\t gso_size = %-5u gso_segs = %-5u gso_type = %-5u",
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2756 + /* XXX: can't use ${local.ethernet_proto.id} here (issue #52): */
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2757 + ethernet_proto.id, ${local.ethernet_proto.str},
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2758 + ${local.self.sk_buff.k_sk_buff}->ip_summed, ip_summed_values[${local.self.sk_buff.k_sk_buff}->ip_summed],
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2759 + ${local.self.sk_buff.k_sk_buff}->len, ${local.self.sk_buff.k_sk_buff}->data_len, skb_headlen(${local.self.sk_buff.k_sk_buff}),
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2760 + shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2761 );
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2762 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2763 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2764 - 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
2765 - ${Device::AbstractDevice.ref} dev,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2766 - ${DMA::DMADirection.scalar} direction)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2767 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2768 - 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
2769 - 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
2770 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2771 - * 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
2772 - * 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
2773 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2774 - 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
2775 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2776 - 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
2777 - ${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
2778 - ${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
2779 - 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
2780 - if (err)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2781 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2782 - ${local.self.dma_handle} = 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2783 - return err;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2784 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2785 - return 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2786 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2787 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2788 - 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
2789 - ${Device::AbstractDevice.ref} dev,
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2790 - ${DMA::DMADirection} direction)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2791 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2792 - 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
2793 - 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
2794 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2795 - if (${local.self.dma_handle})
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2796 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2797 - 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
2798 - ${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
2799 - ${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
2800 - ${local.self.dma_handle} = 0;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2801 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2802 - 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
2803 - ${local.self.sk_buff} = NULL;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2804 - }
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2805 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2806
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2807 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2808 - * 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
2809 - * 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
2810 - * variable I needed)
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2811 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2812 - method init(Socket::AbstractSKBuff kernel_skb, Builtin::number size)
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2813 + method init(Socket::AbstractSKBuff k_skb)
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2814 {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2815 - ${self.sk_buff} = ${kernel_skb};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2816 - ${self.size} = ${size};
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2817 - ${self.dma_handle} = 0;
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2818 + ${self} = (${Socket::SKBuff.ref})(${k_skb});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2819 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2820
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2821 - method dump_infos()
132
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2822 + method dump_infos()
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2823 {
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2824 rtx_socket_skbuff_dump_infos(${self});
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2825 }
f2e4dd91dc6f Wip, leave some "functions" empty but start some build tests
Louis Opter <kalessin@kalessin.fr>
parents: 131
diff changeset
2826
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2827 - method map_to(Device::AbstractDevice dev)
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2828 + method free()
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2829 {
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2830 - 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
2831 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2832 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2833 - 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
2834 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2835 - 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
2836 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2837 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2838 - 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
2839 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2840 - 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
2841 - }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2842 -
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2843 - 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
2844 - {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2845 - rtx_socket_skbuff_unmap_and_free(${self}, ${dev}, RTX_DMA_FROM_DEVICE);
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2846 + dev_kfree_skb(${self.sk_buff.k_sk_buff});
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2847 }
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2848
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2849 map
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2850 @@ -151,13 +83,9 @@
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2851 // 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
2852 // useful for internal use:
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2853 sk_buff: (${self})->skbuff;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2854 - // 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
2855 - // 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
2856 - // 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
2857 - // 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
2858 - // 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
2859 - 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
2860 - size: (${self})->size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2861 +
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2862 + data: ((struct sk_buff *)((${self})->skbuff))->data;
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2863 + len: ((struct sk_buff *)((${self})->skbuff))->len;
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2864 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2865 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2866 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2867 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
2868 --- 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
2869 +++ b/rathaxes/samples/e1000/socket.rti
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2870 @@ -12,20 +12,15 @@
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2871 {
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2872 chunk LKM::prototypes();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2873 chunk LKM::code();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2874 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2875 decl data_types();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2876 - 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
2877 +
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2878 + method init(Socket::AbstractSKBuff);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2879 method dump_infos();
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2880 - /*
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2881 - * 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
2882 - * 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
2883 - */
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2884 - method map_to(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2885 - method map_from(Device::AbstractDevice);
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2886 - 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
2887 - method unmap_from_and_free(Device::AbstractDevice);
139
ab3a2aa22f95 Wip on cleaning up the existing code, now starting to build with gcc
Louis Opter <kalessin@kalessin.fr>
parents: 138
diff changeset
2888 + method free();
131
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2889
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2890 - 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
2891 - 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
2892 - attribute Builtin::number.scalar size;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2893 + 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
2894 + attribute Builtin::symbol.ref data;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2895 + attribute Builtin::number.scalar len;
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2896 }
c209851a82de Wip, start a rewrite of the e1000 device dependent code
Louis Opter <kalessin@kalessin.fr>
parents:
diff changeset
2897 }