[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible
From: |
Programmingkid |
Subject: |
Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4 |
Date: |
Tue, 29 Dec 2015 19:05:26 -0500 |
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 <address@hidden>
>>
>> ---
>> 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.
- [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/29
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Mark Cave-Ayland, 2015/12/29
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4,
Programmingkid <=
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/29
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Mark Cave-Ayland, 2015/12/30
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/30
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Mark Cave-Ayland, 2015/12/30
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/30
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Mark Cave-Ayland, 2015/12/31
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/31
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Mark Cave-Ayland, 2015/12/31
- Re: [Qemu-devel] [PATCH] Make rtl8139 network interface card compatible with Mac OS 10.4, Programmingkid, 2015/12/31