Commit 8d6c7eb896fddb4d4361fc97ec90dda41e825df8

Authored by bellard
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;