Commit 6d2980f515c005091de0b9f4fe526e749f62c380
1 parent
94fc95cd
Fix unportable bitfields use which broke pcnet for big endian hosts.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2469 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
339 additions
and
269 deletions
hw/pcnet.c
@@ -77,14 +77,6 @@ struct PCNetState_st { | @@ -77,14 +77,6 @@ struct PCNetState_st { | ||
77 | void *dma_opaque; | 77 | void *dma_opaque; |
78 | }; | 78 | }; |
79 | 79 | ||
80 | -/* XXX: using bitfields for target memory structures is almost surely | ||
81 | - not portable, so it should be suppressed ASAP */ | ||
82 | -#ifdef __GNUC__ | ||
83 | -#define PACKED_FIELD(A) A __attribute__ ((packed)) | ||
84 | -#else | ||
85 | -#error FixMe | ||
86 | -#endif | ||
87 | - | ||
88 | struct qemu_ether_header { | 80 | struct qemu_ether_header { |
89 | uint8_t ether_dhost[6]; | 81 | uint8_t ether_dhost[6]; |
90 | uint8_t ether_shost[6]; | 82 | uint8_t ether_shost[6]; |
@@ -183,223 +175,291 @@ struct pcnet_initblk32 { | @@ -183,223 +175,291 @@ struct pcnet_initblk32 { | ||
183 | }; | 175 | }; |
184 | 176 | ||
185 | struct pcnet_TMD { | 177 | struct pcnet_TMD { |
186 | - struct { | ||
187 | - unsigned tbadr:32; | ||
188 | - } tmd0; | ||
189 | - struct { | ||
190 | - unsigned PACKED_FIELD(bcnt:12), PACKED_FIELD(ones:4), PACKED_FIELD(res:7), PACKED_FIELD(bpe:1); | ||
191 | - unsigned PACKED_FIELD(enp:1), PACKED_FIELD(stp:1), PACKED_FIELD(def:1), PACKED_FIELD(one:1); | ||
192 | - unsigned PACKED_FIELD(ltint:1), PACKED_FIELD(nofcs:1), PACKED_FIELD(err:1), PACKED_FIELD(own:1); | ||
193 | - } tmd1; | ||
194 | - struct { | ||
195 | - unsigned PACKED_FIELD(trc:4), PACKED_FIELD(res:12); | ||
196 | - unsigned PACKED_FIELD(tdr:10), PACKED_FIELD(rtry:1), PACKED_FIELD(lcar:1); | ||
197 | - unsigned PACKED_FIELD(lcol:1), PACKED_FIELD(exdef:1), PACKED_FIELD(uflo:1), PACKED_FIELD(buff:1); | ||
198 | - } tmd2; | ||
199 | - struct { | ||
200 | - unsigned res:32; | ||
201 | - } tmd3; | 178 | + uint32_t tbadr; |
179 | + int16_t length; | ||
180 | + int16_t status; | ||
181 | + uint32_t misc; | ||
182 | + uint32_t res; | ||
202 | }; | 183 | }; |
203 | 184 | ||
185 | +#define TMDL_BCNT_MASK 0x0fff | ||
186 | +#define TMDL_BCNT_SH 0 | ||
187 | +#define TMDL_ONES_MASK 0xf000 | ||
188 | +#define TMDL_ONES_SH 12 | ||
189 | + | ||
190 | +#define TMDS_BPE_MASK 0x0080 | ||
191 | +#define TMDS_BPE_SH 7 | ||
192 | +#define TMDS_ENP_MASK 0x0100 | ||
193 | +#define TMDS_ENP_SH 8 | ||
194 | +#define TMDS_STP_MASK 0x0200 | ||
195 | +#define TMDS_STP_SH 9 | ||
196 | +#define TMDS_DEF_MASK 0x0400 | ||
197 | +#define TMDS_DEF_SH 10 | ||
198 | +#define TMDS_ONE_MASK 0x0800 | ||
199 | +#define TMDS_ONE_SH 11 | ||
200 | +#define TMDS_LTINT_MASK 0x1000 | ||
201 | +#define TMDS_LTINT_SH 12 | ||
202 | +#define TMDS_NOFCS_MASK 0x2000 | ||
203 | +#define TMDS_NOFCS_SH 13 | ||
204 | +#define TMDS_ERR_MASK 0x4000 | ||
205 | +#define TMDS_ERR_SH 14 | ||
206 | +#define TMDS_OWN_MASK 0x8000 | ||
207 | +#define TMDS_OWN_SH 15 | ||
208 | + | ||
209 | +#define TMDM_TRC_MASK 0x0000000f | ||
210 | +#define TMDM_TRC_SH 0 | ||
211 | +#define TMDM_TDR_MASK 0x03ff0000 | ||
212 | +#define TMDM_TDR_SH 16 | ||
213 | +#define TMDM_RTRY_MASK 0x04000000 | ||
214 | +#define TMDM_RTRY_SH 26 | ||
215 | +#define TMDM_LCAR_MASK 0x08000000 | ||
216 | +#define TMDM_LCAR_SH 27 | ||
217 | +#define TMDM_LCOL_MASK 0x10000000 | ||
218 | +#define TMDM_LCOL_SH 28 | ||
219 | +#define TMDM_EXDEF_MASK 0x20000000 | ||
220 | +#define TMDM_EXDEF_SH 29 | ||
221 | +#define TMDM_UFLO_MASK 0x40000000 | ||
222 | +#define TMDM_UFLO_SH 30 | ||
223 | +#define TMDM_BUFF_MASK 0x80000000 | ||
224 | +#define TMDM_BUFF_SH 31 | ||
225 | + | ||
204 | struct pcnet_RMD { | 226 | struct pcnet_RMD { |
205 | - struct { | ||
206 | - unsigned rbadr:32; | ||
207 | - } rmd0; | ||
208 | - struct { | ||
209 | - unsigned PACKED_FIELD(bcnt:12), PACKED_FIELD(ones:4), PACKED_FIELD(res:4); | ||
210 | - unsigned PACKED_FIELD(bam:1), PACKED_FIELD(lafm:1), PACKED_FIELD(pam:1), PACKED_FIELD(bpe:1); | ||
211 | - unsigned PACKED_FIELD(enp:1), PACKED_FIELD(stp:1), PACKED_FIELD(buff:1), PACKED_FIELD(crc:1); | ||
212 | - unsigned PACKED_FIELD(oflo:1), PACKED_FIELD(fram:1), PACKED_FIELD(err:1), PACKED_FIELD(own:1); | ||
213 | - } rmd1; | ||
214 | - struct { | ||
215 | - unsigned PACKED_FIELD(mcnt:12), PACKED_FIELD(zeros:4); | ||
216 | - unsigned PACKED_FIELD(rpc:8), PACKED_FIELD(rcc:8); | ||
217 | - } rmd2; | ||
218 | - struct { | ||
219 | - unsigned res:32; | ||
220 | - } rmd3; | 227 | + uint32_t rbadr; |
228 | + int16_t buf_length; | ||
229 | + int16_t status; | ||
230 | + uint32_t msg_length; | ||
231 | + uint32_t res; | ||
221 | }; | 232 | }; |
222 | 233 | ||
223 | - | ||
224 | -#define PRINT_TMD(T) printf( \ | ||
225 | - "TMD0 : TBADR=0x%08x\n" \ | 234 | +#define RMDL_BCNT_MASK 0x0fff |
235 | +#define RMDL_BCNT_SH 0 | ||
236 | +#define RMDL_ONES_MASK 0xf000 | ||
237 | +#define RMDL_ONES_SH 12 | ||
238 | + | ||
239 | +#define RMDS_BAM_MASK 0x0010 | ||
240 | +#define RMDS_BAM_SH 4 | ||
241 | +#define RMDS_LFAM_MASK 0x0020 | ||
242 | +#define RMDS_LFAM_SH 5 | ||
243 | +#define RMDS_PAM_MASK 0x0040 | ||
244 | +#define RMDS_PAM_SH 6 | ||
245 | +#define RMDS_BPE_MASK 0x0080 | ||
246 | +#define RMDS_BPE_SH 7 | ||
247 | +#define RMDS_ENP_MASK 0x0100 | ||
248 | +#define RMDS_ENP_SH 8 | ||
249 | +#define RMDS_STP_MASK 0x0200 | ||
250 | +#define RMDS_STP_SH 9 | ||
251 | +#define RMDS_BUFF_MASK 0x0400 | ||
252 | +#define RMDS_BUFF_SH 10 | ||
253 | +#define RMDS_CRC_MASK 0x0800 | ||
254 | +#define RMDS_CRC_SH 11 | ||
255 | +#define RMDS_OFLO_MASK 0x1000 | ||
256 | +#define RMDS_OFLO_SH 12 | ||
257 | +#define RMDS_FRAM_MASK 0x2000 | ||
258 | +#define RMDS_FRAM_SH 13 | ||
259 | +#define RMDS_ERR_MASK 0x4000 | ||
260 | +#define RMDS_ERR_SH 14 | ||
261 | +#define RMDS_OWN_MASK 0x8000 | ||
262 | +#define RMDS_OWN_SH 15 | ||
263 | + | ||
264 | +#define RMDM_MCNT_MASK 0x00000fff | ||
265 | +#define RMDM_MCNT_SH 0 | ||
266 | +#define RMDM_ZEROS_MASK 0x0000f000 | ||
267 | +#define RMDM_ZEROS_SH 12 | ||
268 | +#define RMDM_RPC_MASK 0x00ff0000 | ||
269 | +#define RMDM_RPC_SH 16 | ||
270 | +#define RMDM_RCC_MASK 0xff000000 | ||
271 | +#define RMDM_RCC_SH 24 | ||
272 | + | ||
273 | +#define SET_FIELD(regp, name, field, value) \ | ||
274 | + (*(regp) = (*(regp) & ~(name ## _ ## field ## _MASK)) \ | ||
275 | + | ((value) << name ## _ ## field ## _SH)) | ||
276 | + | ||
277 | +#define GET_FIELD(reg, name, field) \ | ||
278 | + (((reg) & name ## _ ## field ## _MASK) >> name ## _ ## field ## _SH) | ||
279 | + | ||
280 | +#define PRINT_TMD(T) printf( \ | ||
281 | + "TMD0 : TBADR=0x%08x\n" \ | ||
226 | "TMD1 : OWN=%d, ERR=%d, FCS=%d, LTI=%d, " \ | 282 | "TMD1 : OWN=%d, ERR=%d, FCS=%d, LTI=%d, " \ |
227 | "ONE=%d, DEF=%d, STP=%d, ENP=%d,\n" \ | 283 | "ONE=%d, DEF=%d, STP=%d, ENP=%d,\n" \ |
228 | " BPE=%d, BCNT=%d\n" \ | 284 | " BPE=%d, BCNT=%d\n" \ |
229 | "TMD2 : BUF=%d, UFL=%d, EXD=%d, LCO=%d, " \ | 285 | "TMD2 : BUF=%d, UFL=%d, EXD=%d, LCO=%d, " \ |
230 | "LCA=%d, RTR=%d,\n" \ | 286 | "LCA=%d, RTR=%d,\n" \ |
231 | " TDR=%d, TRC=%d\n", \ | 287 | " TDR=%d, TRC=%d\n", \ |
232 | - (T)->tmd0.tbadr, \ | ||
233 | - (T)->tmd1.own, (T)->tmd1.err, (T)->tmd1.nofcs, \ | ||
234 | - (T)->tmd1.ltint, (T)->tmd1.one, (T)->tmd1.def, \ | ||
235 | - (T)->tmd1.stp, (T)->tmd1.enp, (T)->tmd1.bpe, \ | ||
236 | - 4096-(T)->tmd1.bcnt, \ | ||
237 | - (T)->tmd2.buff, (T)->tmd2.uflo, (T)->tmd2.exdef,\ | ||
238 | - (T)->tmd2.lcol, (T)->tmd2.lcar, (T)->tmd2.rtry, \ | ||
239 | - (T)->tmd2.tdr, (T)->tmd2.trc) | ||
240 | - | ||
241 | -#define PRINT_RMD(R) printf( \ | ||
242 | - "RMD0 : RBADR=0x%08x\n" \ | 288 | + (T)->tbadr, \ |
289 | + GET_FIELD((T)->status, TMDS, OWN), \ | ||
290 | + GET_FIELD((T)->status, TMDS, ERR), \ | ||
291 | + GET_FIELD((T)->status, TMDS, NOFCS), \ | ||
292 | + GET_FIELD((T)->status, TMDS, LTINT), \ | ||
293 | + GET_FIELD((T)->status, TMDS, ONE), \ | ||
294 | + GET_FIELD((T)->status, TMDS, DEF), \ | ||
295 | + GET_FIELD((T)->status, TMDS, STP), \ | ||
296 | + GET_FIELD((T)->status, TMDS, ENP), \ | ||
297 | + GET_FIELD((T)->status, TMDS, BPE), \ | ||
298 | + 4096-GET_FIELD((T)->length, TMDL, BCNT), \ | ||
299 | + GET_FIELD((T)->misc, TMDM, BUFF), \ | ||
300 | + GET_FIELD((T)->misc, TMDM, UFLO), \ | ||
301 | + GET_FIELD((T)->misc, TMDM, EXDEF), \ | ||
302 | + GET_FIELD((T)->misc, TMDM, LCOL), \ | ||
303 | + GET_FIELD((T)->misc, TMDM, LCAR), \ | ||
304 | + GET_FIELD((T)->misc, TMDM, RTRY), \ | ||
305 | + GET_FIELD((T)->misc, TMDM, TDR), \ | ||
306 | + GET_FIELD((T)->misc, TMDM, TRC)) | ||
307 | + | ||
308 | +#define PRINT_RMD(R) printf( \ | ||
309 | + "RMD0 : RBADR=0x%08x\n" \ | ||
243 | "RMD1 : OWN=%d, ERR=%d, FRAM=%d, OFLO=%d, " \ | 310 | "RMD1 : OWN=%d, ERR=%d, FRAM=%d, OFLO=%d, " \ |
244 | "CRC=%d, BUFF=%d, STP=%d, ENP=%d,\n " \ | 311 | "CRC=%d, BUFF=%d, STP=%d, ENP=%d,\n " \ |
245 | - "BPE=%d, PAM=%d, LAFM=%d, BAM=%d, ONES=%d, BCNT=%d\n" \ | 312 | + "BPE=%d, PAM=%d, LAFM=%d, BAM=%d, ONES=%d, BCNT=%d\n" \ |
246 | "RMD2 : RCC=%d, RPC=%d, MCNT=%d, ZEROS=%d\n", \ | 313 | "RMD2 : RCC=%d, RPC=%d, MCNT=%d, ZEROS=%d\n", \ |
247 | - (R)->rmd0.rbadr, \ | ||
248 | - (R)->rmd1.own, (R)->rmd1.err, (R)->rmd1.fram, \ | ||
249 | - (R)->rmd1.oflo, (R)->rmd1.crc, (R)->rmd1.buff, \ | ||
250 | - (R)->rmd1.stp, (R)->rmd1.enp, (R)->rmd1.bpe, \ | ||
251 | - (R)->rmd1.pam, (R)->rmd1.lafm, (R)->rmd1.bam, \ | ||
252 | - (R)->rmd1.ones, 4096-(R)->rmd1.bcnt, \ | ||
253 | - (R)->rmd2.rcc, (R)->rmd2.rpc, (R)->rmd2.mcnt, \ | ||
254 | - (R)->rmd2.zeros) | ||
255 | - | ||
256 | -static inline void pcnet_tmd_load(PCNetState *s, struct pcnet_TMD *tmd1, | 314 | + (R)->rbadr, \ |
315 | + GET_FIELD((R)->status, RMDS, OWN), \ | ||
316 | + GET_FIELD((R)->status, RMDS, ERR), \ | ||
317 | + GET_FIELD((R)->status, RMDS, FRAM), \ | ||
318 | + GET_FIELD((R)->status, RMDS, OFLO), \ | ||
319 | + GET_FIELD((R)->status, RMDS, CRC), \ | ||
320 | + GET_FIELD((R)->status, RMDS, BUFF), \ | ||
321 | + GET_FIELD((R)->status, RMDS, STP), \ | ||
322 | + GET_FIELD((R)->status, RMDS, ENP), \ | ||
323 | + GET_FIELD((R)->status, RMDS, BPE), \ | ||
324 | + GET_FIELD((R)->status, RMDS, PAM), \ | ||
325 | + GET_FIELD((R)->status, RMDS, LFAM), \ | ||
326 | + GET_FIELD((R)->status, RMDS, BAM), \ | ||
327 | + GET_FIELD((R)->buf_length, RMDL, ONES), \ | ||
328 | + 4096-GET_FIELD((R)->buf_length, RMDL, BCNT), \ | ||
329 | + GET_FIELD((R)->msg_length, RMDM, RCC), \ | ||
330 | + GET_FIELD((R)->msg_length, RMDM, RPC), \ | ||
331 | + GET_FIELD((R)->msg_length, RMDM, MCNT), \ | ||
332 | + GET_FIELD((R)->msg_length, RMDM, ZEROS)) | ||
333 | + | ||
334 | +static inline void pcnet_tmd_load(PCNetState *s, struct pcnet_TMD *tmd, | ||
257 | target_phys_addr_t addr) | 335 | target_phys_addr_t addr) |
258 | { | 336 | { |
259 | - uint32_t *tmd = (uint32_t *)tmd1; | ||
260 | - | ||
261 | - if (!BCR_SWSTYLE(s)) { | ||
262 | - uint16_t xda[4]; | ||
263 | - s->phys_mem_read(s->dma_opaque, addr, | ||
264 | - (void *)&xda[0], sizeof(xda), 0); | ||
265 | - le16_to_cpus(&xda[0]); | ||
266 | - le16_to_cpus(&xda[1]); | ||
267 | - le16_to_cpus(&xda[2]); | ||
268 | - le16_to_cpus(&xda[3]); | ||
269 | - tmd[0] = (xda[0]&0xffff) | | ||
270 | - ((xda[1]&0x00ff) << 16); | ||
271 | - tmd[1] = (xda[2]&0xffff)| | ||
272 | - ((xda[1] & 0xff00) << 16); | ||
273 | - tmd[2] = | ||
274 | - (xda[3] & 0xffff) << 16; | ||
275 | - tmd[3] = 0; | 337 | + if (!BCR_SSIZE32(s)) { |
338 | + struct { | ||
339 | + uint32_t tbadr; | ||
340 | + int16_t length; | ||
341 | + int16_t status; | ||
342 | + } xda; | ||
343 | + s->phys_mem_read(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0); | ||
344 | + tmd->tbadr = le32_to_cpu(xda.tbadr) & 0xffffff; | ||
345 | + tmd->length = le16_to_cpu(xda.length); | ||
346 | + tmd->status = (le32_to_cpu(xda.tbadr) >> 16) & 0xff00; | ||
347 | + tmd->misc = le16_to_cpu(xda.status) << 16; | ||
348 | + tmd->res = 0; | ||
276 | } else { | 349 | } else { |
277 | - uint32_t xda[4]; | ||
278 | - s->phys_mem_read(s->dma_opaque, addr, | ||
279 | - (void *)&xda[0], sizeof(xda), 0); | ||
280 | - le32_to_cpus(&xda[0]); | ||
281 | - le32_to_cpus(&xda[1]); | ||
282 | - le32_to_cpus(&xda[2]); | ||
283 | - le32_to_cpus(&xda[3]); | ||
284 | - if (BCR_SWSTYLE(s) != 3) { | ||
285 | - memcpy(tmd, xda, sizeof(xda)); | ||
286 | - } else { | ||
287 | - tmd[0] = xda[2]; | ||
288 | - tmd[1] = xda[1]; | ||
289 | - tmd[2] = xda[0]; | ||
290 | - tmd[3] = xda[3]; | 350 | + s->phys_mem_read(s->dma_opaque, addr, (void *)tmd, sizeof(*tmd), 0); |
351 | + le32_to_cpus(&tmd->tbadr); | ||
352 | + le16_to_cpus(&tmd->length); | ||
353 | + le16_to_cpus(&tmd->status); | ||
354 | + le32_to_cpus(&tmd->misc); | ||
355 | + le32_to_cpus(&tmd->res); | ||
356 | + if (BCR_SWSTYLE(s) == 3) { | ||
357 | + uint32_t tmp = tmd->tbadr; | ||
358 | + tmd->tbadr = tmd->misc; | ||
359 | + tmd->misc = tmp; | ||
291 | } | 360 | } |
292 | } | 361 | } |
293 | } | 362 | } |
294 | 363 | ||
295 | -static inline void pcnet_tmd_store(PCNetState *s, const struct pcnet_TMD *tmd1, | 364 | +static inline void pcnet_tmd_store(PCNetState *s, const struct pcnet_TMD *tmd, |
296 | target_phys_addr_t addr) | 365 | target_phys_addr_t addr) |
297 | { | 366 | { |
298 | - const uint32_t *tmd = (const uint32_t *)tmd1; | ||
299 | - if (!BCR_SWSTYLE(s)) { | ||
300 | - uint16_t xda[4]; | ||
301 | - xda[0] = tmd[0] & 0xffff; | ||
302 | - xda[1] = ((tmd[0]>>16)&0x00ff) | | ||
303 | - ((tmd[1]>>16)&0xff00); | ||
304 | - xda[2] = tmd[1] & 0xffff; | ||
305 | - xda[3] = tmd[2] >> 16; | ||
306 | - cpu_to_le16s(&xda[0]); | ||
307 | - cpu_to_le16s(&xda[1]); | ||
308 | - cpu_to_le16s(&xda[2]); | ||
309 | - cpu_to_le16s(&xda[3]); | ||
310 | - s->phys_mem_write(s->dma_opaque, addr, | ||
311 | - (void *)&xda[0], sizeof(xda), 0); | 367 | + if (!BCR_SSIZE32(s)) { |
368 | + struct { | ||
369 | + uint32_t tbadr; | ||
370 | + int16_t length; | ||
371 | + int16_t status; | ||
372 | + } xda; | ||
373 | + xda.tbadr = cpu_to_le32((tmd->tbadr & 0xffffff) | | ||
374 | + ((tmd->status & 0xff00) << 16)); | ||
375 | + xda.length = cpu_to_le16(tmd->length); | ||
376 | + xda.status = cpu_to_le16(tmd->misc >> 16); | ||
377 | + s->phys_mem_write(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0); | ||
312 | } else { | 378 | } else { |
313 | - uint32_t xda[4]; | ||
314 | - if (BCR_SWSTYLE(s) != 3) { | ||
315 | - memcpy(xda, tmd, sizeof(xda)); | ||
316 | - } else { | ||
317 | - xda[0] = tmd[2]; | ||
318 | - xda[1] = tmd[1]; | ||
319 | - xda[2] = tmd[0]; | ||
320 | - xda[3] = tmd[3]; | 379 | + struct { |
380 | + uint32_t tbadr; | ||
381 | + int16_t length; | ||
382 | + int16_t status; | ||
383 | + uint32_t misc; | ||
384 | + uint32_t res; | ||
385 | + } xda; | ||
386 | + xda.tbadr = cpu_to_le32(tmd->tbadr); | ||
387 | + xda.length = cpu_to_le16(tmd->length); | ||
388 | + xda.status = cpu_to_le16(tmd->status); | ||
389 | + xda.misc = cpu_to_le32(tmd->misc); | ||
390 | + xda.res = cpu_to_le32(tmd->res); | ||
391 | + if (BCR_SWSTYLE(s) == 3) { | ||
392 | + uint32_t tmp = xda.tbadr; | ||
393 | + xda.tbadr = xda.misc; | ||
394 | + xda.misc = tmp; | ||
321 | } | 395 | } |
322 | - cpu_to_le32s(&xda[0]); | ||
323 | - cpu_to_le32s(&xda[1]); | ||
324 | - cpu_to_le32s(&xda[2]); | ||
325 | - cpu_to_le32s(&xda[3]); | ||
326 | - s->phys_mem_write(s->dma_opaque, addr, | ||
327 | - (void *)&xda[0], sizeof(xda), 0); | 396 | + s->phys_mem_write(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0); |
328 | } | 397 | } |
329 | } | 398 | } |
330 | 399 | ||
331 | -static inline void pcnet_rmd_load(PCNetState *s, struct pcnet_RMD *rmd1, | 400 | +static inline void pcnet_rmd_load(PCNetState *s, struct pcnet_RMD *rmd, |
332 | target_phys_addr_t addr) | 401 | target_phys_addr_t addr) |
333 | { | 402 | { |
334 | - uint32_t *rmd = (uint32_t *)rmd1; | ||
335 | - | ||
336 | - if (!BCR_SWSTYLE(s)) { | ||
337 | - uint16_t rda[4]; | ||
338 | - s->phys_mem_read(s->dma_opaque, addr, | ||
339 | - (void *)&rda[0], sizeof(rda), 0); | ||
340 | - le16_to_cpus(&rda[0]); | ||
341 | - le16_to_cpus(&rda[1]); | ||
342 | - le16_to_cpus(&rda[2]); | ||
343 | - le16_to_cpus(&rda[3]); | ||
344 | - rmd[0] = (rda[0]&0xffff)| | ||
345 | - ((rda[1] & 0x00ff) << 16); | ||
346 | - rmd[1] = (rda[2]&0xffff)| | ||
347 | - ((rda[1] & 0xff00) << 16); | ||
348 | - rmd[2] = rda[3] & 0xffff; | ||
349 | - rmd[3] = 0; | 403 | + if (!BCR_SSIZE32(s)) { |
404 | + struct { | ||
405 | + uint32_t rbadr; | ||
406 | + int16_t buf_length; | ||
407 | + int16_t msg_length; | ||
408 | + } rda; | ||
409 | + s->phys_mem_read(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0); | ||
410 | + rmd->rbadr = le32_to_cpu(rda.rbadr) & 0xffffff; | ||
411 | + rmd->buf_length = le16_to_cpu(rda.buf_length); | ||
412 | + rmd->status = (le32_to_cpu(rda.rbadr) >> 16) & 0xff00; | ||
413 | + rmd->msg_length = le16_to_cpu(rda.msg_length); | ||
414 | + rmd->res = 0; | ||
350 | } else { | 415 | } else { |
351 | - uint32_t rda[4]; | ||
352 | - s->phys_mem_read(s->dma_opaque, addr, | ||
353 | - (void *)&rda[0], sizeof(rda), 0); | ||
354 | - le32_to_cpus(&rda[0]); | ||
355 | - le32_to_cpus(&rda[1]); | ||
356 | - le32_to_cpus(&rda[2]); | ||
357 | - le32_to_cpus(&rda[3]); | ||
358 | - if (BCR_SWSTYLE(s) != 3) { | ||
359 | - memcpy(rmd, rda, sizeof(rda)); | ||
360 | - } else { | ||
361 | - rmd[0] = rda[2]; | ||
362 | - rmd[1] = rda[1]; | ||
363 | - rmd[2] = rda[0]; | ||
364 | - rmd[3] = rda[3]; | 416 | + s->phys_mem_read(s->dma_opaque, addr, (void *)rmd, sizeof(*rmd), 0); |
417 | + le32_to_cpus(&rmd->rbadr); | ||
418 | + le16_to_cpus(&rmd->buf_length); | ||
419 | + le16_to_cpus(&rmd->status); | ||
420 | + le32_to_cpus(&rmd->msg_length); | ||
421 | + le32_to_cpus(&rmd->res); | ||
422 | + if (BCR_SWSTYLE(s) == 3) { | ||
423 | + uint32_t tmp = rmd->rbadr; | ||
424 | + rmd->rbadr = rmd->msg_length; | ||
425 | + rmd->msg_length = tmp; | ||
365 | } | 426 | } |
366 | } | 427 | } |
367 | } | 428 | } |
368 | 429 | ||
369 | -static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | 430 | +static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd, |
370 | target_phys_addr_t addr) | 431 | target_phys_addr_t addr) |
371 | { | 432 | { |
372 | - const uint32_t *rmd = (const uint32_t *)rmd1; | ||
373 | - | ||
374 | - if (!BCR_SWSTYLE(s)) { | ||
375 | - uint16_t rda[4]; | ||
376 | - rda[0] = rmd[0] & 0xffff; | ||
377 | - rda[1] = ((rmd[0]>>16)&0xff)| | ||
378 | - ((rmd[1]>>16)&0xff00); | ||
379 | - rda[2] = rmd[1] & 0xffff; | ||
380 | - rda[3] = rmd[2] & 0xffff; | ||
381 | - cpu_to_le16s(&rda[0]); | ||
382 | - cpu_to_le16s(&rda[1]); | ||
383 | - cpu_to_le16s(&rda[2]); | ||
384 | - cpu_to_le16s(&rda[3]); | ||
385 | - s->phys_mem_write(s->dma_opaque, addr, | ||
386 | - (void *)&rda[0], sizeof(rda), 0); | 433 | + if (!BCR_SSIZE32(s)) { |
434 | + struct { | ||
435 | + uint32_t rbadr; | ||
436 | + int16_t buf_length; | ||
437 | + int16_t msg_length; | ||
438 | + } rda; | ||
439 | + rda.rbadr = cpu_to_le32((rmd->rbadr & 0xffffff) | | ||
440 | + ((rmd->status & 0xff00) << 16)); | ||
441 | + rda.buf_length = cpu_to_le16(rmd->buf_length); | ||
442 | + rda.msg_length = cpu_to_le16(rmd->msg_length); | ||
443 | + s->phys_mem_write(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0); | ||
387 | } else { | 444 | } else { |
388 | - uint32_t rda[4]; | ||
389 | - if (BCR_SWSTYLE(s) != 3) { | ||
390 | - memcpy(rda, rmd, sizeof(rda)); | ||
391 | - } else { | ||
392 | - rda[0] = rmd[2]; | ||
393 | - rda[1] = rmd[1]; | ||
394 | - rda[2] = rmd[0]; | ||
395 | - rda[3] = rmd[3]; | 445 | + struct { |
446 | + uint32_t rbadr; | ||
447 | + int16_t buf_length; | ||
448 | + int16_t status; | ||
449 | + uint32_t msg_length; | ||
450 | + uint32_t res; | ||
451 | + } rda; | ||
452 | + rda.rbadr = cpu_to_le32(rmd->rbadr); | ||
453 | + rda.buf_length = cpu_to_le16(rmd->buf_length); | ||
454 | + rda.status = cpu_to_le16(rmd->status); | ||
455 | + rda.msg_length = cpu_to_le32(rmd->msg_length); | ||
456 | + rda.res = cpu_to_le32(rmd->res); | ||
457 | + if (BCR_SWSTYLE(s) == 3) { | ||
458 | + uint32_t tmp = rda.rbadr; | ||
459 | + rda.rbadr = rda.msg_length; | ||
460 | + rda.msg_length = tmp; | ||
396 | } | 461 | } |
397 | - cpu_to_le32s(&rda[0]); | ||
398 | - cpu_to_le32s(&rda[1]); | ||
399 | - cpu_to_le32s(&rda[2]); | ||
400 | - cpu_to_le32s(&rda[3]); | ||
401 | - s->phys_mem_write(s->dma_opaque, addr, | ||
402 | - (void *)&rda[0], sizeof(rda), 0); | 462 | + s->phys_mem_write(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0); |
403 | } | 463 | } |
404 | } | 464 | } |
405 | 465 | ||
@@ -417,14 +477,14 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -417,14 +477,14 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
417 | #define CHECK_RMD(ADDR,RES) do { \ | 477 | #define CHECK_RMD(ADDR,RES) do { \ |
418 | struct pcnet_RMD rmd; \ | 478 | struct pcnet_RMD rmd; \ |
419 | RMDLOAD(&rmd,(ADDR)); \ | 479 | RMDLOAD(&rmd,(ADDR)); \ |
420 | - (RES) |= (rmd.rmd1.ones != 15) \ | ||
421 | - || (rmd.rmd2.zeros != 0); \ | 480 | + (RES) |= (GET_FIELD(rmd.buf_length, RMDL, ONES) != 15) \ |
481 | + || (GET_FIELD(rmd.msg_length, RMDM, ZEROS) != 0); \ | ||
422 | } while (0) | 482 | } while (0) |
423 | 483 | ||
424 | #define CHECK_TMD(ADDR,RES) do { \ | 484 | #define CHECK_TMD(ADDR,RES) do { \ |
425 | struct pcnet_TMD tmd; \ | 485 | struct pcnet_TMD tmd; \ |
426 | TMDLOAD(&tmd,(ADDR)); \ | 486 | TMDLOAD(&tmd,(ADDR)); \ |
427 | - (RES) |= (tmd.tmd1.ones != 15); \ | 487 | + (RES) |= (GET_FIELD(tmd.length, TMDL, ONES) != 15); \ |
428 | } while (0) | 488 | } while (0) |
429 | 489 | ||
430 | #else | 490 | #else |
@@ -434,8 +494,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -434,8 +494,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
434 | case 0x00: \ | 494 | case 0x00: \ |
435 | do { \ | 495 | do { \ |
436 | uint16_t rda[4]; \ | 496 | uint16_t rda[4]; \ |
437 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | ||
438 | - (void *)&rda[0], sizeof(rda), 0); \ | 497 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ |
498 | + (void *)&rda[0], sizeof(rda), 0); \ | ||
439 | (RES) |= (rda[2] & 0xf000)!=0xf000; \ | 499 | (RES) |= (rda[2] & 0xf000)!=0xf000; \ |
440 | (RES) |= (rda[3] & 0xf000)!=0x0000; \ | 500 | (RES) |= (rda[3] & 0xf000)!=0x0000; \ |
441 | } while (0); \ | 501 | } while (0); \ |
@@ -444,7 +504,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -444,7 +504,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
444 | case 0x02: \ | 504 | case 0x02: \ |
445 | do { \ | 505 | do { \ |
446 | uint32_t rda[4]; \ | 506 | uint32_t rda[4]; \ |
447 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | 507 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ |
448 | (void *)&rda[0], sizeof(rda), 0); \ | 508 | (void *)&rda[0], sizeof(rda), 0); \ |
449 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ | 509 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ |
450 | (RES) |= (rda[2] & 0x0000f000L)!=0x00000000L; \ | 510 | (RES) |= (rda[2] & 0x0000f000L)!=0x00000000L; \ |
@@ -453,7 +513,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -453,7 +513,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
453 | case 0x03: \ | 513 | case 0x03: \ |
454 | do { \ | 514 | do { \ |
455 | uint32_t rda[4]; \ | 515 | uint32_t rda[4]; \ |
456 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | 516 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ |
457 | (void *)&rda[0], sizeof(rda), 0); \ | 517 | (void *)&rda[0], sizeof(rda), 0); \ |
458 | (RES) |= (rda[0] & 0x0000f000L)!=0x00000000L; \ | 518 | (RES) |= (rda[0] & 0x0000f000L)!=0x00000000L; \ |
459 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ | 519 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ |
@@ -467,9 +527,9 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -467,9 +527,9 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
467 | case 0x00: \ | 527 | case 0x00: \ |
468 | do { \ | 528 | do { \ |
469 | uint16_t xda[4]; \ | 529 | uint16_t xda[4]; \ |
470 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | ||
471 | - (void *)&xda[0], sizeof(xda), 0); \ | ||
472 | - (RES) |= (xda[2] & 0xf000)!=0xf000;\ | 530 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ |
531 | + (void *)&xda[0], sizeof(xda), 0); \ | ||
532 | + (RES) |= (xda[2] & 0xf000)!=0xf000; \ | ||
473 | } while (0); \ | 533 | } while (0); \ |
474 | break; \ | 534 | break; \ |
475 | case 0x01: \ | 535 | case 0x01: \ |
@@ -477,8 +537,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -477,8 +537,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
477 | case 0x03: \ | 537 | case 0x03: \ |
478 | do { \ | 538 | do { \ |
479 | uint32_t xda[4]; \ | 539 | uint32_t xda[4]; \ |
480 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | ||
481 | - (void *)&xda[0], sizeof(xda), 0); \ | 540 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ |
541 | + (void *)&xda[0], sizeof(xda), 0); \ | ||
482 | (RES) |= (xda[1] & 0x0000f000L)!=0x0000f000L; \ | 542 | (RES) |= (xda[1] & 0x0000f000L)!=0x0000f000L; \ |
483 | } while (0); \ | 543 | } while (0); \ |
484 | break; \ | 544 | break; \ |
@@ -488,15 +548,15 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | @@ -488,15 +548,15 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, | ||
488 | #endif | 548 | #endif |
489 | 549 | ||
490 | #define PRINT_PKTHDR(BUF) do { \ | 550 | #define PRINT_PKTHDR(BUF) do { \ |
491 | - struct qemu_ether_header *hdr = (void *)(BUF); \ | ||
492 | - printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, " \ | ||
493 | - "shost=%02x:%02x:%02x:%02x:%02x:%02x, " \ | ||
494 | - "type=0x%04x\n", \ | 551 | + struct qemu_ether_header *hdr = (void *)(BUF); \ |
552 | + printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, " \ | ||
553 | + "shost=%02x:%02x:%02x:%02x:%02x:%02x, " \ | ||
554 | + "type=0x%04x\n", \ | ||
495 | hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2], \ | 555 | hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2], \ |
496 | hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \ | 556 | hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \ |
497 | hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \ | 557 | hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \ |
498 | hdr->ether_shost[3],hdr->ether_shost[4],hdr->ether_shost[5], \ | 558 | hdr->ether_shost[3],hdr->ether_shost[4],hdr->ether_shost[5], \ |
499 | - be16_to_cpu(hdr->ether_type)); \ | 559 | + be16_to_cpu(hdr->ether_type)); \ |
500 | } while (0) | 560 | } while (0) |
501 | 561 | ||
502 | #define MULTICAST_FILTER_LEN 8 | 562 | #define MULTICAST_FILTER_LEN 8 |
@@ -770,7 +830,7 @@ static void pcnet_update_irq(PCNetState *s) | @@ -770,7 +830,7 @@ static void pcnet_update_irq(PCNetState *s) | ||
770 | static void pcnet_init(PCNetState *s) | 830 | static void pcnet_init(PCNetState *s) |
771 | { | 831 | { |
772 | int rlen, tlen; | 832 | int rlen, tlen; |
773 | - uint16_t *padr, *ladrf, mode; | 833 | + uint16_t padr[3], ladrf[4], mode; |
774 | uint32_t rdra, tdra; | 834 | uint32_t rdra, tdra; |
775 | 835 | ||
776 | #ifdef PCNET_DEBUG | 836 | #ifdef PCNET_DEBUG |
@@ -781,22 +841,30 @@ static void pcnet_init(PCNetState *s) | @@ -781,22 +841,30 @@ static void pcnet_init(PCNetState *s) | ||
781 | struct pcnet_initblk32 initblk; | 841 | struct pcnet_initblk32 initblk; |
782 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), | 842 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), |
783 | (uint8_t *)&initblk, sizeof(initblk), 0); | 843 | (uint8_t *)&initblk, sizeof(initblk), 0); |
784 | - mode = initblk.mode; | 844 | + mode = le16_to_cpu(initblk.mode); |
785 | rlen = initblk.rlen >> 4; | 845 | rlen = initblk.rlen >> 4; |
786 | tlen = initblk.tlen >> 4; | 846 | tlen = initblk.tlen >> 4; |
787 | - ladrf = initblk.ladrf; | ||
788 | - padr = initblk.padr; | 847 | + ladrf[0] = le16_to_cpu(initblk.ladrf[0]); |
848 | + ladrf[1] = le16_to_cpu(initblk.ladrf[1]); | ||
849 | + ladrf[2] = le16_to_cpu(initblk.ladrf[2]); | ||
850 | + ladrf[3] = le16_to_cpu(initblk.ladrf[3]); | ||
851 | + padr[0] = le16_to_cpu(initblk.padr[0]); | ||
852 | + padr[1] = le16_to_cpu(initblk.padr[1]); | ||
853 | + padr[2] = le16_to_cpu(initblk.padr[2]); | ||
789 | rdra = le32_to_cpu(initblk.rdra); | 854 | rdra = le32_to_cpu(initblk.rdra); |
790 | tdra = le32_to_cpu(initblk.tdra); | 855 | tdra = le32_to_cpu(initblk.tdra); |
791 | - s->rdra = PHYSADDR(s,initblk.rdra); | ||
792 | - s->tdra = PHYSADDR(s,initblk.tdra); | ||
793 | } else { | 856 | } else { |
794 | struct pcnet_initblk16 initblk; | 857 | struct pcnet_initblk16 initblk; |
795 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), | 858 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), |
796 | (uint8_t *)&initblk, sizeof(initblk), 0); | 859 | (uint8_t *)&initblk, sizeof(initblk), 0); |
797 | - mode = initblk.mode; | ||
798 | - ladrf = initblk.ladrf; | ||
799 | - padr = initblk.padr; | 860 | + mode = le16_to_cpu(initblk.mode); |
861 | + ladrf[0] = le16_to_cpu(initblk.ladrf[0]); | ||
862 | + ladrf[1] = le16_to_cpu(initblk.ladrf[1]); | ||
863 | + ladrf[2] = le16_to_cpu(initblk.ladrf[2]); | ||
864 | + ladrf[3] = le16_to_cpu(initblk.ladrf[3]); | ||
865 | + padr[0] = le16_to_cpu(initblk.padr[0]); | ||
866 | + padr[1] = le16_to_cpu(initblk.padr[1]); | ||
867 | + padr[2] = le16_to_cpu(initblk.padr[2]); | ||
800 | rdra = le32_to_cpu(initblk.rdra); | 868 | rdra = le32_to_cpu(initblk.rdra); |
801 | tdra = le32_to_cpu(initblk.tdra); | 869 | tdra = le32_to_cpu(initblk.tdra); |
802 | rlen = rdra >> 29; | 870 | rlen = rdra >> 29; |
@@ -804,22 +872,22 @@ static void pcnet_init(PCNetState *s) | @@ -804,22 +872,22 @@ static void pcnet_init(PCNetState *s) | ||
804 | rdra &= 0x00ffffff; | 872 | rdra &= 0x00ffffff; |
805 | tdra &= 0x00ffffff; | 873 | tdra &= 0x00ffffff; |
806 | } | 874 | } |
807 | - | 875 | + |
808 | #if defined(PCNET_DEBUG) | 876 | #if defined(PCNET_DEBUG) |
809 | - printf("rlen=%d tlen=%d\n", | ||
810 | - rlen, tlen); | 877 | + printf("rlen=%d tlen=%d\n", rlen, tlen); |
811 | #endif | 878 | #endif |
879 | + | ||
812 | CSR_RCVRL(s) = (rlen < 9) ? (1 << rlen) : 512; | 880 | CSR_RCVRL(s) = (rlen < 9) ? (1 << rlen) : 512; |
813 | CSR_XMTRL(s) = (tlen < 9) ? (1 << tlen) : 512; | 881 | CSR_XMTRL(s) = (tlen < 9) ? (1 << tlen) : 512; |
814 | s->csr[ 6] = (tlen << 12) | (rlen << 8); | 882 | s->csr[ 6] = (tlen << 12) | (rlen << 8); |
815 | - s->csr[15] = le16_to_cpu(mode); | ||
816 | - s->csr[ 8] = le16_to_cpu(ladrf[0]); | ||
817 | - s->csr[ 9] = le16_to_cpu(ladrf[1]); | ||
818 | - s->csr[10] = le16_to_cpu(ladrf[2]); | ||
819 | - s->csr[11] = le16_to_cpu(ladrf[3]); | ||
820 | - s->csr[12] = le16_to_cpu(padr[0]); | ||
821 | - s->csr[13] = le16_to_cpu(padr[1]); | ||
822 | - s->csr[14] = le16_to_cpu(padr[2]); | 883 | + s->csr[15] = mode; |
884 | + s->csr[ 8] = ladrf[0]; | ||
885 | + s->csr[ 9] = ladrf[1]; | ||
886 | + s->csr[10] = ladrf[2]; | ||
887 | + s->csr[11] = ladrf[3]; | ||
888 | + s->csr[12] = padr[0]; | ||
889 | + s->csr[13] = padr[1]; | ||
890 | + s->csr[14] = padr[2]; | ||
823 | s->rdra = PHYSADDR(s, rdra); | 891 | s->rdra = PHYSADDR(s, rdra); |
824 | s->tdra = PHYSADDR(s, tdra); | 892 | s->tdra = PHYSADDR(s, tdra); |
825 | 893 | ||
@@ -914,12 +982,12 @@ static void pcnet_rdte_poll(PCNetState *s) | @@ -914,12 +982,12 @@ static void pcnet_rdte_poll(PCNetState *s) | ||
914 | if (CSR_CRDA(s)) { | 982 | if (CSR_CRDA(s)) { |
915 | struct pcnet_RMD rmd; | 983 | struct pcnet_RMD rmd; |
916 | RMDLOAD(&rmd, PHYSADDR(s,CSR_CRDA(s))); | 984 | RMDLOAD(&rmd, PHYSADDR(s,CSR_CRDA(s))); |
917 | - CSR_CRBC(s) = rmd.rmd1.bcnt; | ||
918 | - CSR_CRST(s) = ((uint32_t *)&rmd)[1] >> 16; | 985 | + CSR_CRBC(s) = GET_FIELD(rmd.buf_length, RMDL, BCNT); |
986 | + CSR_CRST(s) = rmd.status; | ||
919 | #ifdef PCNET_DEBUG_RMD_X | 987 | #ifdef PCNET_DEBUG_RMD_X |
920 | - printf("CRDA=0x%08x CRST=0x%04x RCVRC=%d RMD1=0x%08x RMD2=0x%08x\n", | 988 | + printf("CRDA=0x%08x CRST=0x%04x RCVRC=%d RMDL=0x%04x RMDS=0x%04x RMDM=0x%08x\n", |
921 | PHYSADDR(s,CSR_CRDA(s)), CSR_CRST(s), CSR_RCVRC(s), | 989 | PHYSADDR(s,CSR_CRDA(s)), CSR_CRST(s), CSR_RCVRC(s), |
922 | - ((uint32_t *)&rmd)[1], ((uint32_t *)&rmd)[2]); | 990 | + rmd.buf_length, rmd.status, rmd.msg_length); |
923 | PRINT_RMD(&rmd); | 991 | PRINT_RMD(&rmd); |
924 | #endif | 992 | #endif |
925 | } else { | 993 | } else { |
@@ -929,8 +997,8 @@ static void pcnet_rdte_poll(PCNetState *s) | @@ -929,8 +997,8 @@ static void pcnet_rdte_poll(PCNetState *s) | ||
929 | if (CSR_NRDA(s)) { | 997 | if (CSR_NRDA(s)) { |
930 | struct pcnet_RMD rmd; | 998 | struct pcnet_RMD rmd; |
931 | RMDLOAD(&rmd, PHYSADDR(s,CSR_NRDA(s))); | 999 | RMDLOAD(&rmd, PHYSADDR(s,CSR_NRDA(s))); |
932 | - CSR_NRBC(s) = rmd.rmd1.bcnt; | ||
933 | - CSR_NRST(s) = ((uint32_t *)&rmd)[1] >> 16; | 1000 | + CSR_NRBC(s) = GET_FIELD(rmd.buf_length, RMDL, BCNT); |
1001 | + CSR_NRST(s) = rmd.status; | ||
934 | } else { | 1002 | } else { |
935 | CSR_NRBC(s) = CSR_NRST(s) = 0; | 1003 | CSR_NRBC(s) = CSR_NRST(s) = 0; |
936 | } | 1004 | } |
@@ -943,7 +1011,7 @@ static int pcnet_tdte_poll(PCNetState *s) | @@ -943,7 +1011,7 @@ static int pcnet_tdte_poll(PCNetState *s) | ||
943 | if (s->tdra) { | 1011 | if (s->tdra) { |
944 | target_phys_addr_t cxda = s->tdra + | 1012 | target_phys_addr_t cxda = s->tdra + |
945 | (CSR_XMTRL(s) - CSR_XMTRC(s)) * | 1013 | (CSR_XMTRL(s) - CSR_XMTRC(s)) * |
946 | - (BCR_SWSTYLE(s) ? 16 : 8 ); | 1014 | + (BCR_SWSTYLE(s) ? 16 : 8); |
947 | int bad = 0; | 1015 | int bad = 0; |
948 | CHECK_TMD(PHYSADDR(s, cxda),bad); | 1016 | CHECK_TMD(PHYSADDR(s, cxda),bad); |
949 | if (!bad) { | 1017 | if (!bad) { |
@@ -955,8 +1023,7 @@ static int pcnet_tdte_poll(PCNetState *s) | @@ -955,8 +1023,7 @@ static int pcnet_tdte_poll(PCNetState *s) | ||
955 | } | 1023 | } |
956 | s->csr[34] = cxda & 0xffff; | 1024 | s->csr[34] = cxda & 0xffff; |
957 | s->csr[35] = cxda >> 16; | 1025 | s->csr[35] = cxda >> 16; |
958 | -#ifdef PCNET_DEBUG | ||
959 | - } else { | 1026 | +#ifdef PCNET_DEBUG_X |
960 | printf("pcnet: BAD TMD XDA=0x%08x\n", PHYSADDR(s,cxda)); | 1027 | printf("pcnet: BAD TMD XDA=0x%08x\n", PHYSADDR(s,cxda)); |
961 | #endif | 1028 | #endif |
962 | } | 1029 | } |
@@ -967,8 +1034,8 @@ static int pcnet_tdte_poll(PCNetState *s) | @@ -967,8 +1034,8 @@ static int pcnet_tdte_poll(PCNetState *s) | ||
967 | 1034 | ||
968 | TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s))); | 1035 | TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s))); |
969 | 1036 | ||
970 | - CSR_CXBC(s) = tmd.tmd1.bcnt; | ||
971 | - CSR_CXST(s) = ((uint32_t *)&tmd)[1] >> 16; | 1037 | + CSR_CXBC(s) = GET_FIELD(tmd.length, TMDL, BCNT); |
1038 | + CSR_CXST(s) = tmd.status; | ||
972 | } else { | 1039 | } else { |
973 | CSR_CXBC(s) = CSR_CXST(s) = 0; | 1040 | CSR_CXBC(s) = CSR_CXST(s) = 0; |
974 | } | 1041 | } |
@@ -1029,7 +1096,7 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | @@ -1029,7 +1096,7 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | ||
1029 | (CSR_RCVRL(s) - rcvrc) * | 1096 | (CSR_RCVRL(s) - rcvrc) * |
1030 | (BCR_SWSTYLE(s) ? 16 : 8 ); | 1097 | (BCR_SWSTYLE(s) ? 16 : 8 ); |
1031 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); | 1098 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1032 | - if (rmd.rmd1.own) { | 1099 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { |
1033 | #ifdef PCNET_DEBUG_RMD | 1100 | #ifdef PCNET_DEBUG_RMD |
1034 | printf("pcnet - scan buffer: RCVRC=%d PREV_RCVRC=%d\n", | 1101 | printf("pcnet - scan buffer: RCVRC=%d PREV_RCVRC=%d\n", |
1035 | rcvrc, CSR_RCVRC(s)); | 1102 | rcvrc, CSR_RCVRC(s)); |
@@ -1086,14 +1153,15 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | @@ -1086,14 +1153,15 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | ||
1086 | 1153 | ||
1087 | RMDLOAD(&rmd, PHYSADDR(s,crda)); | 1154 | RMDLOAD(&rmd, PHYSADDR(s,crda)); |
1088 | /*if (!CSR_LAPPEN(s))*/ | 1155 | /*if (!CSR_LAPPEN(s))*/ |
1089 | - rmd.rmd1.stp = 1; | 1156 | + SET_FIELD(&rmd.status, RMDS, STP, 1); |
1090 | 1157 | ||
1091 | #define PCNET_RECV_STORE() do { \ | 1158 | #define PCNET_RECV_STORE() do { \ |
1092 | - int count = MIN(4096 - rmd.rmd1.bcnt,size); \ | ||
1093 | - target_phys_addr_t rbadr = PHYSADDR(s, rmd.rmd0.rbadr); \ | ||
1094 | - s->phys_mem_write(s->dma_opaque, rbadr, src, count, CSR_BSWP(s)); \ | 1159 | + int count = MIN(4096 - GET_FIELD(rmd.buf_length, RMDL, BCNT),size); \ |
1160 | + target_phys_addr_t rbadr = PHYSADDR(s, rmd.rbadr); \ | ||
1161 | + s->phys_mem_write(s->dma_opaque, rbadr, src, count, CSR_BSWP(s)); \ | ||
1095 | src += count; size -= count; \ | 1162 | src += count; size -= count; \ |
1096 | - rmd.rmd2.mcnt = count; rmd.rmd1.own = 0; \ | 1163 | + SET_FIELD(&rmd.msg_length, RMDM, MCNT, count); \ |
1164 | + SET_FIELD(&rmd.status, RMDS, OWN, 0); \ | ||
1097 | RMDSTORE(&rmd, PHYSADDR(s,crda)); \ | 1165 | RMDSTORE(&rmd, PHYSADDR(s,crda)); \ |
1098 | pktcount++; \ | 1166 | pktcount++; \ |
1099 | } while (0) | 1167 | } while (0) |
@@ -1102,12 +1170,12 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | @@ -1102,12 +1170,12 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | ||
1102 | if ((size > 0) && CSR_NRDA(s)) { | 1170 | if ((size > 0) && CSR_NRDA(s)) { |
1103 | target_phys_addr_t nrda = CSR_NRDA(s); | 1171 | target_phys_addr_t nrda = CSR_NRDA(s); |
1104 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); | 1172 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1105 | - if (rmd.rmd1.own) { | 1173 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { |
1106 | crda = nrda; | 1174 | crda = nrda; |
1107 | PCNET_RECV_STORE(); | 1175 | PCNET_RECV_STORE(); |
1108 | if ((size > 0) && (nrda=CSR_NNRD(s))) { | 1176 | if ((size > 0) && (nrda=CSR_NNRD(s))) { |
1109 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); | 1177 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1110 | - if (rmd.rmd1.own) { | 1178 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { |
1111 | crda = nrda; | 1179 | crda = nrda; |
1112 | PCNET_RECV_STORE(); | 1180 | PCNET_RECV_STORE(); |
1113 | } | 1181 | } |
@@ -1119,14 +1187,14 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | @@ -1119,14 +1187,14 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) | ||
1119 | 1187 | ||
1120 | RMDLOAD(&rmd, PHYSADDR(s,crda)); | 1188 | RMDLOAD(&rmd, PHYSADDR(s,crda)); |
1121 | if (size == 0) { | 1189 | if (size == 0) { |
1122 | - rmd.rmd1.enp = 1; | ||
1123 | - rmd.rmd1.pam = !CSR_PROM(s) && is_padr; | ||
1124 | - rmd.rmd1.lafm = !CSR_PROM(s) && is_ladr; | ||
1125 | - rmd.rmd1.bam = !CSR_PROM(s) && is_bcast; | 1190 | + SET_FIELD(&rmd.status, RMDS, ENP, 1); |
1191 | + SET_FIELD(&rmd.status, RMDS, PAM, !CSR_PROM(s) && is_padr); | ||
1192 | + SET_FIELD(&rmd.status, RMDS, LFAM, !CSR_PROM(s) && is_ladr); | ||
1193 | + SET_FIELD(&rmd.status, RMDS, BAM, !CSR_PROM(s) && is_bcast); | ||
1126 | } else { | 1194 | } else { |
1127 | - rmd.rmd1.oflo = 1; | ||
1128 | - rmd.rmd1.buff = 1; | ||
1129 | - rmd.rmd1.err = 1; | 1195 | + SET_FIELD(&rmd.status, RMDS, OFLO, 1); |
1196 | + SET_FIELD(&rmd.status, RMDS, BUFF, 1); | ||
1197 | + SET_FIELD(&rmd.status, RMDS, ERR, 1); | ||
1130 | } | 1198 | } |
1131 | RMDSTORE(&rmd, PHYSADDR(s,crda)); | 1199 | RMDSTORE(&rmd, PHYSADDR(s,crda)); |
1132 | s->csr[0] |= 0x0400; | 1200 | s->csr[0] |= 0x0400; |
@@ -1172,30 +1240,30 @@ static void pcnet_transmit(PCNetState *s) | @@ -1172,30 +1240,30 @@ static void pcnet_transmit(PCNetState *s) | ||
1172 | if (pcnet_tdte_poll(s)) { | 1240 | if (pcnet_tdte_poll(s)) { |
1173 | struct pcnet_TMD tmd; | 1241 | struct pcnet_TMD tmd; |
1174 | 1242 | ||
1175 | - TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s))); | 1243 | + TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s))); |
1176 | 1244 | ||
1177 | #ifdef PCNET_DEBUG_TMD | 1245 | #ifdef PCNET_DEBUG_TMD |
1178 | printf(" TMDLOAD 0x%08x\n", PHYSADDR(s,CSR_CXDA(s))); | 1246 | printf(" TMDLOAD 0x%08x\n", PHYSADDR(s,CSR_CXDA(s))); |
1179 | PRINT_TMD(&tmd); | 1247 | PRINT_TMD(&tmd); |
1180 | #endif | 1248 | #endif |
1181 | - if (tmd.tmd1.stp) { | ||
1182 | - s->xmit_pos = 0; | ||
1183 | - if (!tmd.tmd1.enp) { | ||
1184 | - s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tmd0.tbadr), | ||
1185 | - s->buffer, 4096 - tmd.tmd1.bcnt, | ||
1186 | - CSR_BSWP(s)); | ||
1187 | - s->xmit_pos += 4096 - tmd.tmd1.bcnt; | ||
1188 | - } | 1249 | + if (GET_FIELD(tmd.status, TMDS, STP)) { |
1250 | + s->xmit_pos = 0; | ||
1251 | + if (!GET_FIELD(tmd.status, TMDS, ENP)) { | ||
1252 | + int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT); | ||
1253 | + s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr), | ||
1254 | + s->buffer, bcnt, CSR_BSWP(s)); | ||
1255 | + s->xmit_pos += bcnt; | ||
1256 | + } | ||
1189 | xmit_cxda = PHYSADDR(s,CSR_CXDA(s)); | 1257 | xmit_cxda = PHYSADDR(s,CSR_CXDA(s)); |
1190 | } | 1258 | } |
1191 | - if (tmd.tmd1.enp && (s->xmit_pos >= 0)) { | ||
1192 | - s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tmd0.tbadr), | ||
1193 | - s->buffer + s->xmit_pos, 4096 - tmd.tmd1.bcnt, | ||
1194 | - CSR_BSWP(s)); | ||
1195 | - s->xmit_pos += 4096 - tmd.tmd1.bcnt; | 1259 | + if (GET_FIELD(tmd.status, TMDS, ENP) && (s->xmit_pos >= 0)) { |
1260 | + int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT); | ||
1261 | + s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr), | ||
1262 | + s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s)); | ||
1263 | + s->xmit_pos += bcnt; | ||
1196 | #ifdef PCNET_DEBUG | 1264 | #ifdef PCNET_DEBUG |
1197 | printf("pcnet_transmit size=%d\n", s->xmit_pos); | 1265 | printf("pcnet_transmit size=%d\n", s->xmit_pos); |
1198 | -#endif | 1266 | +#endif |
1199 | if (CSR_LOOP(s)) | 1267 | if (CSR_LOOP(s)) |
1200 | pcnet_receive(s, s->buffer, s->xmit_pos); | 1268 | pcnet_receive(s, s->buffer, s->xmit_pos); |
1201 | else | 1269 | else |
@@ -1206,9 +1274,9 @@ static void pcnet_transmit(PCNetState *s) | @@ -1206,9 +1274,9 @@ static void pcnet_transmit(PCNetState *s) | ||
1206 | s->xmit_pos = -1; | 1274 | s->xmit_pos = -1; |
1207 | } | 1275 | } |
1208 | 1276 | ||
1209 | - tmd.tmd1.own = 0; | 1277 | + SET_FIELD(&tmd.status, TMDS, OWN, 0); |
1210 | TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s))); | 1278 | TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s))); |
1211 | - if (!CSR_TOKINTD(s) || (CSR_LTINTEN(s) && tmd.tmd1.ltint)) | 1279 | + if (!CSR_TOKINTD(s) || (CSR_LTINTEN(s) && GET_FIELD(tmd.status, TMDS, LTINT))) |
1212 | s->csr[0] |= 0x0200; /* set TINT */ | 1280 | s->csr[0] |= 0x0200; /* set TINT */ |
1213 | 1281 | ||
1214 | if (CSR_XMTRC(s)<=1) | 1282 | if (CSR_XMTRC(s)<=1) |
@@ -1221,9 +1289,11 @@ static void pcnet_transmit(PCNetState *s) | @@ -1221,9 +1289,11 @@ static void pcnet_transmit(PCNetState *s) | ||
1221 | } else | 1289 | } else |
1222 | if (s->xmit_pos >= 0) { | 1290 | if (s->xmit_pos >= 0) { |
1223 | struct pcnet_TMD tmd; | 1291 | struct pcnet_TMD tmd; |
1224 | - TMDLOAD(&tmd, PHYSADDR(s,xmit_cxda)); | ||
1225 | - tmd.tmd2.buff = tmd.tmd2.uflo = tmd.tmd1.err = 1; | ||
1226 | - tmd.tmd1.own = 0; | 1292 | + TMDLOAD(&tmd, PHYSADDR(s,xmit_cxda)); |
1293 | + SET_FIELD(&tmd.misc, TMDM, BUFF, 1); | ||
1294 | + SET_FIELD(&tmd.misc, TMDM, UFLO, 1); | ||
1295 | + SET_FIELD(&tmd.status, TMDS, ERR, 1); | ||
1296 | + SET_FIELD(&tmd.status, TMDS, OWN, 0); | ||
1227 | TMDSTORE(&tmd, PHYSADDR(s,xmit_cxda)); | 1297 | TMDSTORE(&tmd, PHYSADDR(s,xmit_cxda)); |
1228 | s->csr[0] |= 0x0200; /* set TINT */ | 1298 | s->csr[0] |= 0x0200; /* set TINT */ |
1229 | if (!CSR_DXSUFLO(s)) { | 1299 | if (!CSR_DXSUFLO(s)) { |