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 | 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 | 80 | struct qemu_ether_header { |
89 | 81 | uint8_t ether_dhost[6]; |
90 | 82 | uint8_t ether_shost[6]; |
... | ... | @@ -183,223 +175,291 @@ struct pcnet_initblk32 { |
183 | 175 | }; |
184 | 176 | |
185 | 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 | 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 | 282 | "TMD1 : OWN=%d, ERR=%d, FCS=%d, LTI=%d, " \ |
227 | 283 | "ONE=%d, DEF=%d, STP=%d, ENP=%d,\n" \ |
228 | 284 | " BPE=%d, BCNT=%d\n" \ |
229 | 285 | "TMD2 : BUF=%d, UFL=%d, EXD=%d, LCO=%d, " \ |
230 | 286 | "LCA=%d, RTR=%d,\n" \ |
231 | 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 | 310 | "RMD1 : OWN=%d, ERR=%d, FRAM=%d, OFLO=%d, " \ |
244 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 477 | #define CHECK_RMD(ADDR,RES) do { \ |
418 | 478 | struct pcnet_RMD rmd; \ |
419 | 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 | 482 | } while (0) |
423 | 483 | |
424 | 484 | #define CHECK_TMD(ADDR,RES) do { \ |
425 | 485 | struct pcnet_TMD tmd; \ |
426 | 486 | TMDLOAD(&tmd,(ADDR)); \ |
427 | - (RES) |= (tmd.tmd1.ones != 15); \ | |
487 | + (RES) |= (GET_FIELD(tmd.length, TMDL, ONES) != 15); \ | |
428 | 488 | } while (0) |
429 | 489 | |
430 | 490 | #else |
... | ... | @@ -434,8 +494,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
434 | 494 | case 0x00: \ |
435 | 495 | do { \ |
436 | 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 | 499 | (RES) |= (rda[2] & 0xf000)!=0xf000; \ |
440 | 500 | (RES) |= (rda[3] & 0xf000)!=0x0000; \ |
441 | 501 | } while (0); \ |
... | ... | @@ -444,7 +504,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
444 | 504 | case 0x02: \ |
445 | 505 | do { \ |
446 | 506 | uint32_t rda[4]; \ |
447 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | |
507 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ | |
448 | 508 | (void *)&rda[0], sizeof(rda), 0); \ |
449 | 509 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ |
450 | 510 | (RES) |= (rda[2] & 0x0000f000L)!=0x00000000L; \ |
... | ... | @@ -453,7 +513,7 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
453 | 513 | case 0x03: \ |
454 | 514 | do { \ |
455 | 515 | uint32_t rda[4]; \ |
456 | - s->phys_mem_read(s->dma_opaque, (ADDR), \ | |
516 | + s->phys_mem_read(s->dma_opaque, (ADDR), \ | |
457 | 517 | (void *)&rda[0], sizeof(rda), 0); \ |
458 | 518 | (RES) |= (rda[0] & 0x0000f000L)!=0x00000000L; \ |
459 | 519 | (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \ |
... | ... | @@ -467,9 +527,9 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
467 | 527 | case 0x00: \ |
468 | 528 | do { \ |
469 | 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 | 533 | } while (0); \ |
474 | 534 | break; \ |
475 | 535 | case 0x01: \ |
... | ... | @@ -477,8 +537,8 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
477 | 537 | case 0x03: \ |
478 | 538 | do { \ |
479 | 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 | 542 | (RES) |= (xda[1] & 0x0000f000L)!=0x0000f000L; \ |
483 | 543 | } while (0); \ |
484 | 544 | break; \ |
... | ... | @@ -488,15 +548,15 @@ static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd1, |
488 | 548 | #endif |
489 | 549 | |
490 | 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 | 555 | hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2], \ |
496 | 556 | hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \ |
497 | 557 | hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \ |
498 | 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 | 560 | } while (0) |
501 | 561 | |
502 | 562 | #define MULTICAST_FILTER_LEN 8 |
... | ... | @@ -770,7 +830,7 @@ static void pcnet_update_irq(PCNetState *s) |
770 | 830 | static void pcnet_init(PCNetState *s) |
771 | 831 | { |
772 | 832 | int rlen, tlen; |
773 | - uint16_t *padr, *ladrf, mode; | |
833 | + uint16_t padr[3], ladrf[4], mode; | |
774 | 834 | uint32_t rdra, tdra; |
775 | 835 | |
776 | 836 | #ifdef PCNET_DEBUG |
... | ... | @@ -781,22 +841,30 @@ static void pcnet_init(PCNetState *s) |
781 | 841 | struct pcnet_initblk32 initblk; |
782 | 842 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), |
783 | 843 | (uint8_t *)&initblk, sizeof(initblk), 0); |
784 | - mode = initblk.mode; | |
844 | + mode = le16_to_cpu(initblk.mode); | |
785 | 845 | rlen = initblk.rlen >> 4; |
786 | 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 | 854 | rdra = le32_to_cpu(initblk.rdra); |
790 | 855 | tdra = le32_to_cpu(initblk.tdra); |
791 | - s->rdra = PHYSADDR(s,initblk.rdra); | |
792 | - s->tdra = PHYSADDR(s,initblk.tdra); | |
793 | 856 | } else { |
794 | 857 | struct pcnet_initblk16 initblk; |
795 | 858 | s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)), |
796 | 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 | 868 | rdra = le32_to_cpu(initblk.rdra); |
801 | 869 | tdra = le32_to_cpu(initblk.tdra); |
802 | 870 | rlen = rdra >> 29; |
... | ... | @@ -804,22 +872,22 @@ static void pcnet_init(PCNetState *s) |
804 | 872 | rdra &= 0x00ffffff; |
805 | 873 | tdra &= 0x00ffffff; |
806 | 874 | } |
807 | - | |
875 | + | |
808 | 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 | 878 | #endif |
879 | + | |
812 | 880 | CSR_RCVRL(s) = (rlen < 9) ? (1 << rlen) : 512; |
813 | 881 | CSR_XMTRL(s) = (tlen < 9) ? (1 << tlen) : 512; |
814 | 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 | 891 | s->rdra = PHYSADDR(s, rdra); |
824 | 892 | s->tdra = PHYSADDR(s, tdra); |
825 | 893 | |
... | ... | @@ -914,12 +982,12 @@ static void pcnet_rdte_poll(PCNetState *s) |
914 | 982 | if (CSR_CRDA(s)) { |
915 | 983 | struct pcnet_RMD rmd; |
916 | 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 | 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 | 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 | 991 | PRINT_RMD(&rmd); |
924 | 992 | #endif |
925 | 993 | } else { |
... | ... | @@ -929,8 +997,8 @@ static void pcnet_rdte_poll(PCNetState *s) |
929 | 997 | if (CSR_NRDA(s)) { |
930 | 998 | struct pcnet_RMD rmd; |
931 | 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 | 1002 | } else { |
935 | 1003 | CSR_NRBC(s) = CSR_NRST(s) = 0; |
936 | 1004 | } |
... | ... | @@ -943,7 +1011,7 @@ static int pcnet_tdte_poll(PCNetState *s) |
943 | 1011 | if (s->tdra) { |
944 | 1012 | target_phys_addr_t cxda = s->tdra + |
945 | 1013 | (CSR_XMTRL(s) - CSR_XMTRC(s)) * |
946 | - (BCR_SWSTYLE(s) ? 16 : 8 ); | |
1014 | + (BCR_SWSTYLE(s) ? 16 : 8); | |
947 | 1015 | int bad = 0; |
948 | 1016 | CHECK_TMD(PHYSADDR(s, cxda),bad); |
949 | 1017 | if (!bad) { |
... | ... | @@ -955,8 +1023,7 @@ static int pcnet_tdte_poll(PCNetState *s) |
955 | 1023 | } |
956 | 1024 | s->csr[34] = cxda & 0xffff; |
957 | 1025 | s->csr[35] = cxda >> 16; |
958 | -#ifdef PCNET_DEBUG | |
959 | - } else { | |
1026 | +#ifdef PCNET_DEBUG_X | |
960 | 1027 | printf("pcnet: BAD TMD XDA=0x%08x\n", PHYSADDR(s,cxda)); |
961 | 1028 | #endif |
962 | 1029 | } |
... | ... | @@ -967,8 +1034,8 @@ static int pcnet_tdte_poll(PCNetState *s) |
967 | 1034 | |
968 | 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 | 1039 | } else { |
973 | 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 | 1096 | (CSR_RCVRL(s) - rcvrc) * |
1030 | 1097 | (BCR_SWSTYLE(s) ? 16 : 8 ); |
1031 | 1098 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1032 | - if (rmd.rmd1.own) { | |
1099 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { | |
1033 | 1100 | #ifdef PCNET_DEBUG_RMD |
1034 | 1101 | printf("pcnet - scan buffer: RCVRC=%d PREV_RCVRC=%d\n", |
1035 | 1102 | rcvrc, CSR_RCVRC(s)); |
... | ... | @@ -1086,14 +1153,15 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) |
1086 | 1153 | |
1087 | 1154 | RMDLOAD(&rmd, PHYSADDR(s,crda)); |
1088 | 1155 | /*if (!CSR_LAPPEN(s))*/ |
1089 | - rmd.rmd1.stp = 1; | |
1156 | + SET_FIELD(&rmd.status, RMDS, STP, 1); | |
1090 | 1157 | |
1091 | 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 | 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 | 1165 | RMDSTORE(&rmd, PHYSADDR(s,crda)); \ |
1098 | 1166 | pktcount++; \ |
1099 | 1167 | } while (0) |
... | ... | @@ -1102,12 +1170,12 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) |
1102 | 1170 | if ((size > 0) && CSR_NRDA(s)) { |
1103 | 1171 | target_phys_addr_t nrda = CSR_NRDA(s); |
1104 | 1172 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1105 | - if (rmd.rmd1.own) { | |
1173 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { | |
1106 | 1174 | crda = nrda; |
1107 | 1175 | PCNET_RECV_STORE(); |
1108 | 1176 | if ((size > 0) && (nrda=CSR_NNRD(s))) { |
1109 | 1177 | RMDLOAD(&rmd, PHYSADDR(s,nrda)); |
1110 | - if (rmd.rmd1.own) { | |
1178 | + if (GET_FIELD(rmd.status, RMDS, OWN)) { | |
1111 | 1179 | crda = nrda; |
1112 | 1180 | PCNET_RECV_STORE(); |
1113 | 1181 | } |
... | ... | @@ -1119,14 +1187,14 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size) |
1119 | 1187 | |
1120 | 1188 | RMDLOAD(&rmd, PHYSADDR(s,crda)); |
1121 | 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 | 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 | 1199 | RMDSTORE(&rmd, PHYSADDR(s,crda)); |
1132 | 1200 | s->csr[0] |= 0x0400; |
... | ... | @@ -1172,30 +1240,30 @@ static void pcnet_transmit(PCNetState *s) |
1172 | 1240 | if (pcnet_tdte_poll(s)) { |
1173 | 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 | 1245 | #ifdef PCNET_DEBUG_TMD |
1178 | 1246 | printf(" TMDLOAD 0x%08x\n", PHYSADDR(s,CSR_CXDA(s))); |
1179 | 1247 | PRINT_TMD(&tmd); |
1180 | 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 | 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 | 1264 | #ifdef PCNET_DEBUG |
1197 | 1265 | printf("pcnet_transmit size=%d\n", s->xmit_pos); |
1198 | -#endif | |
1266 | +#endif | |
1199 | 1267 | if (CSR_LOOP(s)) |
1200 | 1268 | pcnet_receive(s, s->buffer, s->xmit_pos); |
1201 | 1269 | else |
... | ... | @@ -1206,9 +1274,9 @@ static void pcnet_transmit(PCNetState *s) |
1206 | 1274 | s->xmit_pos = -1; |
1207 | 1275 | } |
1208 | 1276 | |
1209 | - tmd.tmd1.own = 0; | |
1277 | + SET_FIELD(&tmd.status, TMDS, OWN, 0); | |
1210 | 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 | 1280 | s->csr[0] |= 0x0200; /* set TINT */ |
1213 | 1281 | |
1214 | 1282 | if (CSR_XMTRC(s)<=1) |
... | ... | @@ -1221,9 +1289,11 @@ static void pcnet_transmit(PCNetState *s) |
1221 | 1289 | } else |
1222 | 1290 | if (s->xmit_pos >= 0) { |
1223 | 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 | 1297 | TMDSTORE(&tmd, PHYSADDR(s,xmit_cxda)); |
1228 | 1298 | s->csr[0] |= 0x0200; /* set TINT */ |
1229 | 1299 | if (!CSR_DXSUFLO(s)) { | ... | ... |