Mercurial > archived > louis > epitech > mq > rathaxes
comparison wip.patch @ 130:6359457dce75
wip
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Sun, 01 Dec 2013 17:39:26 -0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
129:518d9c8ac70c | 130:6359457dce75 |
---|---|
1 # HG changeset patch | |
2 # Parent ead0d8be18437dcd68451112be0652dfdec884b5 | |
3 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt | |
4 --- a/rathaxes/samples/e1000/e1000.blt | |
5 +++ b/rathaxes/samples/e1000/e1000.blt | |
6 @@ -150,17 +150,10 @@ | |
7 /* Allocate the descriptors */ | |
8 hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base); | |
9 hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096); | |
10 - hw_ctx->rx_ring.base = dma_alloc_coherent( | |
11 - ${rtx_ether_ctx.device}, | |
12 - hw_ctx->rx_ring.size, | |
13 - &hw_ctx->rx_ring.dma_base, | |
14 - GFP_KERNEL); | |
15 - /* XXX | |
16 - * The first arg is recognized as Ethernet::Device instead of | |
17 - * Device::AbstractDevice. | |
18 - */ | |
19 hw_ctx->rx_ring.base = ${DMA::alloc_coherent( | |
20 - rtx_ether_ctx.device, local.hw_ctx.rx_ring.size, local.hw_ctx.rx_ring.dma_base.dma_handle | |
21 + rtx_ether_ctx.device, | |
22 + local.hw_ctx.rx_ring.size, | |
23 + local.hw_ctx.rx_ring.dma_base.dma_handle | |
24 )}; | |
25 if (!hw_ctx->rx_ring.base) | |
26 { | |
27 @@ -176,19 +169,13 @@ | |
28 */ | |
29 for (i = 0; i != ${config.rx_ring_size}; ++i) | |
30 { | |
31 - // XXX #46: ${Socket::SKBuff.ref} skbuff = ${rtx_ether_ctx.net_device.alloc_rx_skbuff(config.rx_buffer_len)}; | |
32 - ${Socket::AbstractSKBuff.ref} k_sk_buff = (${Socket::AbstractSKBuff.ref})netdev_alloc_skb( | |
33 - ${rtx_ether_ctx.net_device.k_net_dev}, ${config.rx_buffer_len} | |
34 - ); | |
35 - if (!k_sk_buff) | |
36 + ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i]; | |
37 + // XXX #46: ${rtx_ether_ctx.init_rx_skbuff(local.skbuff, config.rx_buffer_len)}; | |
38 + if (rtx_ethernet_init_rx_skbuff(${local.skbuff}, ${config.rx_buffer_len})) | |
39 { | |
40 ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")}; | |
41 goto err_skbuffs_alloc; | |
42 } | |
43 - ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i]; | |
44 - // XXX breaks rtxGen: ${local.skbuff.init(local.k_sk_buff)}; | |
45 - skbuff->skbuff = k_sk_buff; | |
46 - *(dma_addr_t *)&(skbuff->dma_handle) = 0; | |
47 // XXX #46: ${local.skbuff.map_from(rtx_ether_ctx.device)}; | |
48 if (rtx_socket_skbuff_map(${local.skbuff}, ${rtx_ether_ctx.device}, RTX_DMA_FROM_DEVICE)) | |
49 { | |
50 @@ -199,7 +186,7 @@ | |
51 } | |
52 | |
53 // ${Log::info("adapter_init_rx: skbuffs allocated}; | |
54 - pr_info("adapter_init_rx: skbuffs allocated, headlen=%d", skb_headlen((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff)); | |
55 + pr_info("rtx_e1k: adapter_init_rx: skbuffs allocated, headlen=%d", skb_headlen((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i - 1].skbuff)); | |
56 | |
57 /* 5. Save the emplacement and the size of the ring in RDBA/RDLEN */ | |
58 rtx_e1000_register_write32(hw_ctx, E1000_RDBAL, hw_ctx->rx_ring.dma_base & 0xffffffff); | |
59 @@ -565,7 +552,7 @@ | |
60 map | |
61 { | |
62 rx_ring: ((${self})->rx_ring); | |
63 - //tx_ring: ((${self})->tx_ring); | |
64 + //tx_ring: ((${self})->tx_ring); XXX Circular dep with Context | |
65 } | |
66 } | |
67 | |
68 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti | |
69 --- a/rathaxes/samples/e1000/e1000.rti | |
70 +++ b/rathaxes/samples/e1000/e1000.rti | |
71 @@ -48,6 +48,8 @@ | |
72 chunk Ethernet::adapter_setup(Ethernet::Device); | |
73 | |
74 attribute RxRing.scalar rx_ring; | |
75 + /* XXX: circular dependency with Contex: */ | |
76 + //attribute TxRing.scalar tx_ring; | |
77 } | |
78 | |
79 provided type TxRing | |
80 diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt | |
81 --- a/rathaxes/samples/e1000/ethernet.blt | |
82 +++ b/rathaxes/samples/e1000/ethernet.blt | |
83 @@ -95,6 +95,24 @@ | |
84 #include <linux/etherdevice.h> | |
85 } | |
86 | |
87 + chunk LKM::prototypes() | |
88 + { | |
89 + static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref}, ${Socket::SKBuff.ref}, ${Builtin::number}); | |
90 + } | |
91 + | |
92 + chunk LKM::code() | |
93 + { | |
94 + static int rtx_ethernet_alloc_rx_skbuff(${Ethernet::Device.ref} self, ${Socket::SKBuff.ref} sk_buff, ${Builtin::number} size) | |
95 + { | |
96 + ${Socket::AbstractSKBuff} k_sk_buff = netdev_alloc_skb(${local.self.net_device.k_net_dev}, ${local.size}); | |
97 + if (${local.k_sk_buff) { | |
98 + ${local.sk_buff.init(local.k_sk_buff, local.size)}; | |
99 + return 0; | |
100 + } | |
101 + return 1; | |
102 + } | |
103 + } | |
104 + | |
105 /* XXX: if the first arg is not called rtx_net_dev, it breaks. */ | |
106 method init(Ethernet::AbstractDevice rtx_net_dev, PCI::AbstractDevice pci_dev) | |
107 { | |
108 @@ -107,9 +125,9 @@ | |
109 ${self}->net_dev = ${rtx_net_dev}; | |
110 } | |
111 | |
112 - method alloc_rx_skbuff(Builtin::number size) | |
113 + method alloc_rx_skbuff(Socket::SKBuff sk_buff, Builtin::number size) | |
114 { | |
115 - (${Socket::Skbuff.ref})netdev_alloc_skb(${self}, ${size}); | |
116 + rtx_ethernet_alloc_rx_skbuff(${self}, ${sk_buff}, ${size}); | |
117 } | |
118 | |
119 map | |
120 diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti | |
121 --- a/rathaxes/samples/e1000/ethernet.rti | |
122 +++ b/rathaxes/samples/e1000/ethernet.rti | |
123 @@ -33,7 +33,11 @@ | |
124 pointcut Ethernet::HardwareContext(); | |
125 | |
126 method init(Ethernet::AbstractDevice, PCI::AbstractDevice); | |
127 - method alloc_rx_skbuff(Builtin::number); /* -> Socket::Skbuff.ref */ | |
128 + /* | |
129 + * Alloc (the AbstractSKBuff inside) the given SKBuff and initialize | |
130 + * the SKBuff, return 1 if the allocation failed, 0 on success. | |
131 + */ | |
132 + method alloc_rx_skbuff(Socket::SKBuff, Builtin::number); | |
133 | |
134 attribute Device::AbstractDevice.ref device; | |
135 attribute PCI::AbstractDevice.ref pci_device; | |
136 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt | |
137 --- a/rathaxes/samples/e1000/socket.blt | |
138 +++ b/rathaxes/samples/e1000/socket.blt | |
139 @@ -24,6 +24,7 @@ | |
140 { | |
141 ${Socket::AbstractSKBuff.ref} skbuff; | |
142 ${DMA::AbstractDMAHandle.scalar} dma_handle; | |
143 + unsigned int size; | |
144 } | |
145 | |
146 chunk LKM::prototypes() | |
147 @@ -69,8 +70,13 @@ | |
148 { | |
149 WARN_ON(!${local.self.sk_buff}); | |
150 WARN_ON(${local.self.dma_handle}); | |
151 + /* | |
152 + * TODO: we don't support skbuffs with paged data yet (see also | |
153 + * http://vger.kernel.org/~davem/skb_data.html). | |
154 + */ | |
155 + WARN_ON(skb_is_nonlinear(${local.self.sk_buff.k_sk_buff})); | |
156 | |
157 - unsigned int len = skb_headlen(${local.self.sk_buff.k_sk_buff}); | |
158 + unsigned int len = ${local.self.size}; | |
159 ${cast local.len as Builtin::number}; | |
160 ${local.self.dma_handle} = ${DMA::map(local.dev, local.self.sk_buff.k_sk_buff, local.len, local.direction)}; | |
161 int err = ${DMA::mapping_error(local.dev, local.self.dma_handle)}; | |
162 @@ -87,10 +93,11 @@ | |
163 ${DMA::DMADirection} direction) | |
164 { | |
165 WARN_ON(!${local.self.sk_buff}); | |
166 + WARN_ON(skb_is_nonlinear(${local.self.sk_buff.k_sk_buff}); | |
167 | |
168 if (${local.self.dma_handle}) | |
169 { | |
170 - unsigned int len = skb_headlen(${local.self.sk_buff.k_sk_buff}); | |
171 + unsigned int len = ${local.self.size}; | |
172 ${cast local.len as Builtin::number}; | |
173 ${DMA::unmap(local.dev, local.self.dma_handle, local.len, local.direction)}; | |
174 ${local.self.dma_handle} = 0; | |
175 @@ -105,13 +112,14 @@ | |
176 * correct C variable from Ethernet::send() (so I named it as the C | |
177 * variable I needed) | |
178 */ | |
179 - method init(Socket::AbstractSKBuff kernel_skb) | |
180 + method init(Socket::AbstractSKBuff kernel_skb, Builtin::number size) | |
181 { | |
182 ${self.sk_buff} = ${kernel_skb}; | |
183 + ${self.size} = ${size}; | |
184 ${self.dma_handle} = 0; | |
185 } | |
186 | |
187 - method dump_infos() | |
188 + method dump_infos() | |
189 { | |
190 rtx_socket_skbuff_dump_infos(${self}); | |
191 } | |
192 @@ -149,6 +157,7 @@ | |
193 // would yield to a struct type which you can't assign directly; | |
194 // but maybe doing the ->data in that case would be acceptable). | |
195 dma_handle: (*((dma_addr_t *)&(${self})->dma_handle)); | |
196 + size: (${self})->size; | |
197 } | |
198 } | |
199 } | |
200 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti | |
201 --- a/rathaxes/samples/e1000/socket.rti | |
202 +++ b/rathaxes/samples/e1000/socket.rti | |
203 @@ -13,7 +13,7 @@ | |
204 chunk LKM::prototypes(); | |
205 chunk LKM::code(); | |
206 decl data_types(); | |
207 - method init(Socket::AbstractSKBuff); | |
208 + method init(Socket::AbstractSKBuff, Builtin::number); | |
209 method dump_infos(); | |
210 /* | |
211 * map_to and map_from return a non-zero value on failure (which | |
212 @@ -26,5 +26,6 @@ | |
213 | |
214 attribute Socket::AbstractSKBuff.ref sk_buff; | |
215 attribute DMA::AbstractDMAHandle.scalar dma_handle; | |
216 + attribute Builtin::number.scalar size; | |
217 } | |
218 } |