246 |
static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
247 |
{ |
{ |
248 |
NE2000State *s = opaque; |
NE2000State *s = opaque; |
249 |
int offset, page; |
int offset, page, index; |
250 |
|
|
251 |
addr &= 0xf; |
addr &= 0xf; |
252 |
#ifdef DEBUG_NE2000 |
#ifdef DEBUG_NE2000 |
264 |
ne2000_update_irq(s); |
ne2000_update_irq(s); |
265 |
} |
} |
266 |
if (val & E8390_TRANS) { |
if (val & E8390_TRANS) { |
267 |
qemu_send_packet(s->nd, s->mem + (s->tpsr << 8), s->tcnt); |
index = (s->tpsr << 8); |
268 |
|
/* XXX: next 2 lines are a hack to make netware 3.11 work */ |
269 |
|
if (index >= NE2000_PMEM_END) |
270 |
|
index -= NE2000_PMEM_SIZE; |
271 |
|
/* fail safe: check range on the transmitted length */ |
272 |
|
if (index + s->tcnt <= NE2000_PMEM_END) { |
273 |
|
qemu_send_packet(s->nd, s->mem + index, s->tcnt); |
274 |
|
} |
275 |
/* signal end of transfert */ |
/* signal end of transfert */ |
276 |
s->tsr = ENTSR_PTX; |
s->tsr = ENTSR_PTX; |
277 |
s->isr |= ENISR_TX; |
s->isr |= ENISR_TX; |
278 |
|
s->cmd &= ~E8390_TRANS; |
279 |
ne2000_update_irq(s); |
ne2000_update_irq(s); |
280 |
} |
} |
281 |
} |
} |