diff -r 780f097b54c5 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Feb 07 17:29:52 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Thu Feb 08 16:44:05 2007 +0100 @@ -2074,8 +2074,97 @@ static struct notifier_block notifier_in .priority = 0 }; +/* ------------------------------------------------------------------ */ + +#ifndef CONFIG_XEN +#include + +#define DRV_NAME "netfront" + +static int rtl8139_taken = 0; + +static void __devexit rtl8139_release(struct pci_dev *pdev) +{ + long ioaddr, iolen; + long mmio_addr, mmio_len; + + ioaddr = pci_resource_start(pdev, 0); + iolen = pci_resource_len(pdev, 0); + mmio_addr = pci_resource_start(pdev, 1); + mmio_len = pci_resource_len(pdev, 1); + + release_region(ioaddr, iolen); + release_mem_region(mmio_addr, mmio_len); + + printk(KERN_INFO DRV_NAME ": released rtl8139 card\n"); + rtl8139_taken--; +} + +static int __devinit rtl8139_grab(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + int ret; + long ioaddr, iolen; + long mmio_addr, mmio_len; + + ret = pci_enable_device(pdev); + if (ret) { + printk(KERN_ERR DRV_NAME ": can't enable device\n"); + return ret; + } + + ioaddr = pci_resource_start(pdev, 0); + iolen = pci_resource_len(pdev, 0); + + mmio_addr = pci_resource_start(pdev, 1); + mmio_len = pci_resource_len(pdev, 1); + + if (request_mem_region(mmio_addr, mmio_len, DRV_NAME) == NULL) + { + printk(KERN_ERR DRV_NAME ": MEM I/O resource 0x%lx @ 0x%lx busy\n", + mmio_addr, mmio_len); + return -EBUSY; + } + + if (request_region(ioaddr, iolen, DRV_NAME) == NULL) + { + printk(KERN_ERR DRV_NAME ": I/O resource 0x%lx @ 0x%lx busy\n", + iolen, ioaddr); + release_mem_region(mmio_addr, mmio_len); + return -EBUSY; + } + + printk(KERN_INFO DRV_NAME ": grabbed rtl8139 card\n"); + rtl8139_taken++; + return 0; +} + +static struct pci_device_id rtl8139_pci_tbl[] __devinitdata = { + { + .vendor = 0x10ec, // Realtek + .device = 0x8139, // 8139 + .subvendor = 0x5853, // XenSource + .subdevice = 0x0001, // #1 + }, + {0,} +}; +MODULE_DEVICE_TABLE(pci, rtl8139_pci_tbl); + +static struct pci_driver rtl8139_grabber = { + .name = DRV_NAME, + .probe = rtl8139_grab, + .remove = __devexit_p(rtl8139_release), + .id_table = rtl8139_pci_tbl, +}; + +#endif + +/* ------------------------------------------------------------------ */ + static int __init netif_init(void) { + int ret; + if (!is_running_on_xen()) return -ENODEV; @@ -2092,6 +2181,14 @@ static int __init netif_init(void) if (is_initial_xendomain()) return 0; +#ifndef CONFIG_XEN + ret = pci_module_init(&rtl8139_grabber); + if (ret) + return ret; + if (!rtl8139_taken) + return -EBUSY; +#endif + IPRINTK("Initialising virtual ethernet driver.\n"); (void)register_inetaddr_notifier(¬ifier_inetdev); @@ -2108,6 +2205,9 @@ static void __exit netif_exit(void) unregister_inetaddr_notifier(¬ifier_inetdev); +#ifndef CONFIG_XEN + pci_unregister_driver(&rtl8139_grabber); +#endif return xenbus_unregister_driver(&netfront); } module_exit(netif_exit);