On Dec 29, 2015, at 4:04 PM, Mark Cave-Ayland wrote: > On 29/12/15 17:59, Programmingkid wrote: > >> This patch solves the few problems that needed to be solved in order for a >> Mac OS 10.4 guest to use the rtl8139 nic. >> >> The pci_dma_read() function would only return zero when a MemoryRegion object >> was not enabled. Enabling the object makes the pci_dma_read() function work >> correctly. >> >> The Linux rtl8139 driver needs base address register zero set to PIO. This >> conflicts with Mac OS 10.4's driver needing base address register zero set to >> MMIO. So a macro has been added that allows the user to decide which >> operating >> system this network interface card will be compatible with. Note: Windows >> XP's >> driver works regardless of the macro setting. >> >> Signed-off-by: John Arbuckle <programmingk...@gmail.com> >> >> --- >> hw/net/rtl8139.c | 15 ++++++++++++++- >> include/hw/pci/pci.h | 1 + >> 2 files changed, 15 insertions(+), 1 deletions(-) >> >> diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c >> index 90ef72b..e17a471 100644 >> --- a/hw/net/rtl8139.c >> +++ b/hw/net/rtl8139.c >> @@ -64,6 +64,14 @@ >> /* debug RTL8139 card */ >> //#define DEBUG_RTL8139 1 >> >> +/* >> + * The driver that ships with Mac OS 10.4 has to have its base address >> register >> + * 0 set to MMIO space. This directly conflicts with the Linux driver that >> + * needs the PIO set to base address register 0. Mac OS 10.5 or higher does >> not >> + * need this macro set. >> + */ >> +/* #define MAC_OS_10_4_DRIVER_COMPATIBILITY 1 */ >> + >> #define PCI_PERIOD 30 /* 30 ns period = 33.333333 Mhz frequency */ >> >> #define SET_MASKED(input, mask, curr) \ >> @@ -3444,9 +3452,14 @@ static void pci_rtl8139_realize(PCIDevice *dev, Error >> **errp) >> "rtl8139", 0x100); >> memory_region_init_io(&s->bar_mem, OBJECT(s), &rtl8139_mmio_ops, s, >> "rtl8139", 0x100); >> + >> +#ifdef MAC_OS_10_4_DRIVER_COMPATIBILITY >> + pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar_mem); >> + pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->bar_io); >> +#else >> pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->bar_io); >> pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar_mem); >> - >> +#endif >> qemu_macaddr_default_if_unset(&s->conf.macaddr); >> >> /* prepare eeprom */ >> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h >> index 379b6e1..8e95c75 100644 >> --- a/include/hw/pci/pci.h >> +++ b/include/hw/pci/pci.h >> @@ -699,6 +699,7 @@ static inline int pci_dma_rw(PCIDevice *dev, dma_addr_t >> addr, >> static inline int pci_dma_read(PCIDevice *dev, dma_addr_t addr, >> void *buf, dma_addr_t len) >> { >> + memory_region_set_enabled(&dev->bus_master_enable_region, true); >> return pci_dma_rw(dev, addr, buf, len, DMA_DIRECTION_TO_DEVICE); >> } > > Can you provide more information about how you tested this patch? The > ordering of the BARs is interesting - according to > http://www.opensource.apple.com/source/AppleRTL8139Ethernet/AppleRTL8139Ethernet-141/RTL8139.cpp > the driver tries to map the BARs like this: > > > // Get the virtual address mapping of CSR registers located at > // Base Address Range 0 (0x10). > > csrMap = pciNub->mapDeviceMemoryWithRegister( kIOPCIConfigBaseAddress1 ); > > if ( 0 == csrMap ) > break; > > > Now according to > http://www.opensource.apple.com/source/IOPCIFamily/IOPCIFamily-151.5/IOKit/pci/IOPCIDevice.h > kIOPCIConfigBaseAddress1 is actually BAR1 rather than BAR0, although in > rtl8139.c both bar_mem and bar_io access the chip registers so I'm not > sure why this would fail - can you try and trace the accesses through to > determine exactly why the NIC doesn't work with the current BAR ordering?
I did add printf statements to the rtl8139_ioport_write() and rtl8139_ioport_read() functions, but they are never touched by the Mac OS X driver. All that happens is the driver's initAdapter() code would cause the driver to stop working. This is the code: if ( csrRead8( RTL_CM ) & R_CM_RST ) { // FIXME: need more robust recovery (retry?) IOLog("%s: chip reset timed out\n", getName()); return false; } The Darwin PPC iso you have might have the driver on it already. If you or anybody else needs help to test out the driver, just email me for help.