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