Commit 8d6c7eb896fddb4d4361fc97ec90dda41e825df8
1 parent
7bf5be70
receive status register support (aka GRUB netboot fix)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@845 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
2 deletions
hw/ne2000.c
| @@ -118,6 +118,7 @@ typedef struct NE2000State { | @@ -118,6 +118,7 @@ typedef struct NE2000State { | ||
| 118 | uint16_t tcnt; | 118 | uint16_t tcnt; |
| 119 | uint16_t rcnt; | 119 | uint16_t rcnt; |
| 120 | uint32_t rsar; | 120 | uint32_t rsar; |
| 121 | + uint8_t rsr; | ||
| 121 | uint8_t isr; | 122 | uint8_t isr; |
| 122 | uint8_t dcfg; | 123 | uint8_t dcfg; |
| 123 | uint8_t imr; | 124 | uint8_t imr; |
| @@ -212,7 +213,11 @@ static void ne2000_receive(void *opaque, const uint8_t *buf, int size) | @@ -212,7 +213,11 @@ static void ne2000_receive(void *opaque, const uint8_t *buf, int size) | ||
| 212 | next -= (s->stop - s->start); | 213 | next -= (s->stop - s->start); |
| 213 | /* prepare packet header */ | 214 | /* prepare packet header */ |
| 214 | p = s->mem + index; | 215 | p = s->mem + index; |
| 215 | - p[0] = ENRSR_RXOK; /* receive status */ | 216 | + s->rsr = ENRSR_RXOK; /* receive status */ |
| 217 | + /* XXX: check this */ | ||
| 218 | + if (buf[0] & 0x01) | ||
| 219 | + s->rsr |= ENRSR_PHY; | ||
| 220 | + p[0] = s->rsr; | ||
| 216 | p[1] = next >> 8; | 221 | p[1] = next >> 8; |
| 217 | p[2] = total_len; | 222 | p[2] = total_len; |
| 218 | p[3] = total_len >> 8; | 223 | p[3] = total_len >> 8; |
| @@ -232,7 +237,7 @@ static void ne2000_receive(void *opaque, const uint8_t *buf, int size) | @@ -232,7 +237,7 @@ static void ne2000_receive(void *opaque, const uint8_t *buf, int size) | ||
| 232 | size -= len; | 237 | size -= len; |
| 233 | } | 238 | } |
| 234 | s->curpag = next >> 8; | 239 | s->curpag = next >> 8; |
| 235 | - | 240 | + |
| 236 | /* now we can signal we have receive something */ | 241 | /* now we can signal we have receive something */ |
| 237 | s->isr |= ENISR_RX; | 242 | s->isr |= ENISR_RX; |
| 238 | ne2000_update_irq(s); | 243 | ne2000_update_irq(s); |
| @@ -360,6 +365,9 @@ static uint32_t ne2000_ioport_read(void *opaque, uint32_t addr) | @@ -360,6 +365,9 @@ static uint32_t ne2000_ioport_read(void *opaque, uint32_t addr) | ||
| 360 | case EN1_MULT ... EN1_MULT + 7: | 365 | case EN1_MULT ... EN1_MULT + 7: |
| 361 | ret = s->mult[offset - EN1_MULT]; | 366 | ret = s->mult[offset - EN1_MULT]; |
| 362 | break; | 367 | break; |
| 368 | + case EN0_RSR: | ||
| 369 | + ret = s->rsr; | ||
| 370 | + break; | ||
| 363 | default: | 371 | default: |
| 364 | ret = 0x00; | 372 | ret = 0x00; |
| 365 | break; | 373 | break; |