Commit 4a9c9687c62f10bdd9a4ba24933f3d4830d4a6b9

Authored by bellard
1 parent 73c11f63

PCI irq support


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@822 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 12 additions and 26 deletions
hw/ne2000.c
... ... @@ -125,6 +125,7 @@ typedef struct NE2000State {
125 125 uint8_t curpag;
126 126 uint8_t mult[8]; /* multicast mask array */
127 127 int irq;
  128 + PCIDevice *pci_dev;
128 129 NetDriverState *nd;
129 130 uint8_t mem[NE2000_MEM_SIZE];
130 131 } NE2000State;
... ... @@ -153,10 +154,13 @@ static void ne2000_update_irq(NE2000State *s)
153 154 printf("NE2000: Set IRQ line %d to %d (%02x %02x)\n",
154 155 s->irq, isr ? 1 : 0, s->isr, s->imr);
155 156 #endif
156   - if (isr)
157   - pic_set_irq(s->irq, 1);
158   - else
159   - pic_set_irq(s->irq, 0);
  157 + if (s->irq == 16) {
  158 + /* PCI irq */
  159 + pci_set_irq(s->pci_dev, 0, (isr != 0));
  160 + } else {
  161 + /* ISA irq */
  162 + pic_set_irq(s->irq, (isr != 0));
  163 + }
160 164 }
161 165  
162 166 /* return the max buffer size if the NE2000 can receive more data */
... ... @@ -581,21 +585,6 @@ typedef struct PCINE2000State {
581 585 NE2000State ne2000;
582 586 } PCINE2000State;
583 587  
584   -static uint32_t ne2000_read_config(PCIDevice *d,
585   - uint32_t address, int len)
586   -{
587   - uint32_t val;
588   - val = 0;
589   - memcpy(&val, d->config + address, len);
590   - return val;
591   -}
592   -
593   -static void ne2000_write_config(PCIDevice *d,
594   - uint32_t address, uint32_t val, int len)
595   -{
596   - memcpy(d->config + address, &val, len);
597   -}
598   -
599 588 static void ne2000_map(PCIDevice *pci_dev, int region_num,
600 589 uint32_t addr, uint32_t size, int type)
601 590 {
... ... @@ -624,8 +613,7 @@ void pci_ne2000_init(NetDriverState *nd)
624 613  
625 614 d = (PCINE2000State *)pci_register_device("NE2000", sizeof(PCINE2000State),
626 615 0, -1,
627   - ne2000_read_config,
628   - ne2000_write_config);
  616 + NULL, NULL);
629 617 pci_conf = d->dev.config;
630 618 pci_conf[0x00] = 0xec; // Realtek 8029
631 619 pci_conf[0x01] = 0x10;
... ... @@ -634,15 +622,13 @@ void pci_ne2000_init(NetDriverState *nd)
634 622 pci_conf[0x0a] = 0x00; // ethernet network controller
635 623 pci_conf[0x0b] = 0x02;
636 624 pci_conf[0x0e] = 0x00; // header_type
637   -
638   - /* XXX: do that in the BIOS */
639   - pci_conf[0x3c] = 11; // interrupt line
640   - pci_conf[0x3d] = 1; // interrupt pin
  625 + pci_conf[0x3d] = 1; // interrupt pin 0
641 626  
642 627 pci_register_io_region((PCIDevice *)d, 0, 0x100,
643 628 PCI_ADDRESS_SPACE_IO, ne2000_map);
644 629 s = &d->ne2000;
645   - s->irq = 11;
  630 + s->irq = 16; // PCI interrupt
  631 + s->pci_dev = (PCIDevice *)d;
646 632 s->nd = nd;
647 633 ne2000_reset(s);
648 634 qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
... ...