diff options
Diffstat (limited to 'drivers/message/i2o/pci.c')
| -rw-r--r-- | drivers/message/i2o/pci.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/drivers/message/i2o/pci.c b/drivers/message/i2o/pci.c index d698d7709c31..4f1515cae5dc 100644 --- a/drivers/message/i2o/pci.c +++ b/drivers/message/i2o/pci.c | |||
| @@ -88,6 +88,11 @@ static int __devinit i2o_pci_alloc(struct i2o_controller *c) | |||
| 88 | struct device *dev = &pdev->dev; | 88 | struct device *dev = &pdev->dev; |
| 89 | int i; | 89 | int i; |
| 90 | 90 | ||
| 91 | if (pci_request_regions(pdev, OSM_DESCRIPTION)) { | ||
| 92 | printk(KERN_ERR "%s: device already claimed\n", c->name); | ||
| 93 | return -ENODEV; | ||
| 94 | } | ||
| 95 | |||
| 91 | for (i = 0; i < 6; i++) { | 96 | for (i = 0; i < 6; i++) { |
| 92 | /* Skip I/O spaces */ | 97 | /* Skip I/O spaces */ |
| 93 | if (!(pci_resource_flags(pdev, i) & IORESOURCE_IO)) { | 98 | if (!(pci_resource_flags(pdev, i) & IORESOURCE_IO)) { |
| @@ -163,6 +168,24 @@ static int __devinit i2o_pci_alloc(struct i2o_controller *c) | |||
| 163 | c->in_port = c->base.virt + I2O_IN_PORT; | 168 | c->in_port = c->base.virt + I2O_IN_PORT; |
| 164 | c->out_port = c->base.virt + I2O_OUT_PORT; | 169 | c->out_port = c->base.virt + I2O_OUT_PORT; |
| 165 | 170 | ||
| 171 | /* Motorola/Freescale chip does not follow spec */ | ||
| 172 | if (pdev->vendor == PCI_VENDOR_ID_MOTOROLA && pdev->device == 0x18c0) { | ||
| 173 | /* Check if CPU is enabled */ | ||
| 174 | if (be32_to_cpu(readl(c->base.virt + 0x10000)) & 0x10000000) { | ||
| 175 | printk(KERN_INFO "%s: MPC82XX needs CPU running to " | ||
| 176 | "service I2O.\n", c->name); | ||
| 177 | i2o_pci_free(c); | ||
| 178 | return -ENODEV; | ||
| 179 | } else { | ||
| 180 | c->irq_status += I2O_MOTOROLA_PORT_OFFSET; | ||
| 181 | c->irq_mask += I2O_MOTOROLA_PORT_OFFSET; | ||
| 182 | c->in_port += I2O_MOTOROLA_PORT_OFFSET; | ||
| 183 | c->out_port += I2O_MOTOROLA_PORT_OFFSET; | ||
| 184 | printk(KERN_INFO "%s: MPC82XX workarounds activated.\n", | ||
| 185 | c->name); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 166 | if (i2o_dma_alloc(dev, &c->status, 8, GFP_KERNEL)) { | 189 | if (i2o_dma_alloc(dev, &c->status, 8, GFP_KERNEL)) { |
| 167 | i2o_pci_free(c); | 190 | i2o_pci_free(c); |
| 168 | return -ENOMEM; | 191 | return -ENOMEM; |
| @@ -298,7 +321,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
| 298 | struct i2o_controller *c; | 321 | struct i2o_controller *c; |
| 299 | int rc; | 322 | int rc; |
| 300 | struct pci_dev *i960 = NULL; | 323 | struct pci_dev *i960 = NULL; |
| 301 | int pci_dev_busy = 0; | 324 | int enabled = pdev->is_enabled; |
| 302 | 325 | ||
| 303 | printk(KERN_INFO "i2o: Checking for PCI I2O controllers...\n"); | 326 | printk(KERN_INFO "i2o: Checking for PCI I2O controllers...\n"); |
| 304 | 327 | ||
| @@ -308,16 +331,12 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
| 308 | return -ENODEV; | 331 | return -ENODEV; |
| 309 | } | 332 | } |
| 310 | 333 | ||
| 311 | if ((rc = pci_enable_device(pdev))) { | 334 | if (!enabled) |
| 312 | printk(KERN_WARNING "i2o: couldn't enable device %s\n", | 335 | if ((rc = pci_enable_device(pdev))) { |
| 313 | pci_name(pdev)); | 336 | printk(KERN_WARNING "i2o: couldn't enable device %s\n", |
| 314 | return rc; | 337 | pci_name(pdev)); |
| 315 | } | 338 | return rc; |
| 316 | 339 | } | |
| 317 | if (pci_request_regions(pdev, OSM_DESCRIPTION)) { | ||
| 318 | printk(KERN_ERR "i2o: device already claimed\n"); | ||
| 319 | return -ENODEV; | ||
| 320 | } | ||
| 321 | 340 | ||
| 322 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { | 341 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { |
| 323 | printk(KERN_WARNING "i2o: no suitable DMA found for %s\n", | 342 | printk(KERN_WARNING "i2o: no suitable DMA found for %s\n", |
| @@ -395,9 +414,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
| 395 | 414 | ||
| 396 | if ((rc = i2o_pci_alloc(c))) { | 415 | if ((rc = i2o_pci_alloc(c))) { |
| 397 | printk(KERN_ERR "%s: DMA / IO allocation for I2O controller " | 416 | printk(KERN_ERR "%s: DMA / IO allocation for I2O controller " |
| 398 | " failed\n", c->name); | 417 | "failed\n", c->name); |
| 399 | if (rc == -ENODEV) | ||
| 400 | pci_dev_busy = 1; | ||
| 401 | goto free_controller; | 418 | goto free_controller; |
| 402 | } | 419 | } |
| 403 | 420 | ||
| @@ -425,7 +442,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
| 425 | i2o_iop_free(c); | 442 | i2o_iop_free(c); |
| 426 | 443 | ||
| 427 | disable: | 444 | disable: |
| 428 | if (!pci_dev_busy) | 445 | if (!enabled) |
| 429 | pci_disable_device(pdev); | 446 | pci_disable_device(pdev); |
| 430 | 447 | ||
| 431 | return rc; | 448 | return rc; |
