diff options
Diffstat (limited to 'drivers/xen/platform-pci.c')
| -rw-r--r-- | drivers/xen/platform-pci.c | 53 | 
1 files changed, 23 insertions, 30 deletions
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c index c01b5ddce52..3454973dc3b 100644 --- a/drivers/xen/platform-pci.c +++ b/drivers/xen/platform-pci.c @@ -45,7 +45,7 @@ static unsigned long platform_mmio_alloc;  static unsigned long platform_mmiolen;  static uint64_t callback_via; -unsigned long alloc_xen_mmio(unsigned long len) +static unsigned long alloc_xen_mmio(unsigned long len)  {  	unsigned long addr; @@ -84,7 +84,7 @@ static irqreturn_t do_hvm_evtchn_intr(int irq, void *dev_id)  static int xen_allocate_irq(struct pci_dev *pdev)  {  	return request_irq(pdev->irq, do_hvm_evtchn_intr, -			IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TRIGGER_RISING, +			IRQF_NOBALANCING | IRQF_TRIGGER_RISING,  			"xen-platform-pci", pdev);  } @@ -101,20 +101,23 @@ static int platform_pci_resume(struct pci_dev *pdev)  	return 0;  } -static int __devinit platform_pci_init(struct pci_dev *pdev, -				       const struct pci_device_id *ent) +static int platform_pci_init(struct pci_dev *pdev, +			     const struct pci_device_id *ent)  {  	int i, ret; -	long ioaddr, iolen; +	long ioaddr;  	long mmio_addr, mmio_len;  	unsigned int max_nr_gframes; +	unsigned long grant_frames; + +	if (!xen_domain()) +		return -ENODEV;  	i = pci_enable_device(pdev);  	if (i)  		return i;  	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); @@ -125,19 +128,13 @@ static int __devinit platform_pci_init(struct pci_dev *pdev,  		goto pci_out;  	} -	if (request_mem_region(mmio_addr, mmio_len, DRV_NAME) == NULL) { -		dev_err(&pdev->dev, "MEM I/O resource 0x%lx @ 0x%lx busy\n", -		       mmio_addr, mmio_len); -		ret = -EBUSY; +	ret = pci_request_region(pdev, 1, DRV_NAME); +	if (ret < 0)  		goto pci_out; -	} -	if (request_region(ioaddr, iolen, DRV_NAME) == NULL) { -		dev_err(&pdev->dev, "I/O resource 0x%lx @ 0x%lx busy\n", -		       iolen, ioaddr); -		ret = -EBUSY; +	ret = pci_request_region(pdev, 0, DRV_NAME); +	if (ret < 0)  		goto mem_out; -	}  	platform_mmio = mmio_addr;  	platform_mmiolen = mmio_len; @@ -158,26 +155,27 @@ static int __devinit platform_pci_init(struct pci_dev *pdev,  	}  	max_nr_gframes = gnttab_max_grant_frames(); -	xen_hvm_resume_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes); -	ret = gnttab_init(); +	grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes); +	ret = gnttab_setup_auto_xlat_frames(grant_frames);  	if (ret)  		goto out; -	xenbus_probe(NULL); -	ret = xen_setup_shutdown_event(); +	ret = gnttab_init();  	if (ret) -		goto out; +		goto grant_out; +	xenbus_probe(NULL);  	return 0; - +grant_out: +	gnttab_free_auto_xlat_frames();  out: -	release_region(ioaddr, iolen); +	pci_release_region(pdev, 0);  mem_out: -	release_mem_region(mmio_addr, mmio_len); +	pci_release_region(pdev, 1);  pci_out:  	pci_disable_device(pdev);  	return ret;  } -static struct pci_device_id platform_pci_tbl[] __devinitdata = { +static struct pci_device_id platform_pci_tbl[] = {  	{PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM,  		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},  	{0,} @@ -196,11 +194,6 @@ static struct pci_driver platform_driver = {  static int __init platform_pci_module_init(void)  { -	/* no unplug has been done, IGNORE hasn't been specified: just -	 * return now */ -	if (!xen_platform_pci_unplug) -		return -ENODEV; -  	return pci_register_driver(&platform_driver);  }  | 
