diff options
| author | Christoph Hellwig <hch@lst.de> | 2007-10-02 16:51:06 -0400 |
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-12 14:55:24 -0400 |
| commit | 8514ef27ee462747454f26a77982f670d9c3c391 (patch) | |
| tree | 70778e7bdc51994ef8e5097e19e3087de4ceaa74 | |
| parent | 706a5d456762e77e199903e55377a9c00814c007 (diff) | |
[SCSI] gdth: split out pci probing
Split out per-device pci probing and put it under proper CONFIG_PCI.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
| -rw-r--r-- | drivers/scsi/gdth.c | 312 |
1 files changed, 167 insertions, 145 deletions
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 05108ea1d833..9e4dd48899b6 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -444,12 +444,6 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, | |||
| 444 | static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp); | 444 | static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp); |
| 445 | static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive); | 445 | static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive); |
| 446 | 446 | ||
| 447 | static int gdth_search_pci(gdth_pci_str *pcistr); | ||
| 448 | static void gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, | ||
| 449 | ushort vendor, ushort dev); | ||
| 450 | static void gdth_sort_pci(gdth_pci_str *pcistr, int cnt); | ||
| 451 | static int gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha); | ||
| 452 | |||
| 453 | static void gdth_enable_int(int hanum); | 447 | static void gdth_enable_int(int hanum); |
| 454 | static int gdth_get_status(unchar *pIStatus,int irq); | 448 | static int gdth_get_status(unchar *pIStatus,int irq); |
| 455 | static int gdth_test_busy(int hanum); | 449 | static int gdth_test_busy(int hanum); |
| @@ -478,6 +472,9 @@ static int gdth_isa_probe_one(struct scsi_host_template *, ulong32); | |||
| 478 | #ifdef CONFIG_EISA | 472 | #ifdef CONFIG_EISA |
| 479 | static int gdth_eisa_probe_one(struct scsi_host_template *, ushort); | 473 | static int gdth_eisa_probe_one(struct scsi_host_template *, ushort); |
| 480 | #endif | 474 | #endif |
| 475 | #ifdef CONFIG_PCI | ||
| 476 | static int gdth_pci_probe_one(struct scsi_host_template *, gdth_pci_str *, int); | ||
| 477 | #endif | ||
| 481 | 478 | ||
| 482 | #ifdef DEBUG_GDTH | 479 | #ifdef DEBUG_GDTH |
| 483 | static unchar DebugState = DEBUG_GDTH; | 480 | static unchar DebugState = DEBUG_GDTH; |
| @@ -862,6 +859,10 @@ static int __init gdth_search_isa(ulong32 bios_adr) | |||
| 862 | } | 859 | } |
| 863 | #endif /* CONFIG_ISA */ | 860 | #endif /* CONFIG_ISA */ |
| 864 | 861 | ||
| 862 | #ifdef CONFIG_PCI | ||
| 863 | static void gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, | ||
| 864 | ushort vendor, ushort dev); | ||
| 865 | |||
| 865 | static int __init gdth_search_pci(gdth_pci_str *pcistr) | 866 | static int __init gdth_search_pci(gdth_pci_str *pcistr) |
| 866 | { | 867 | { |
| 867 | ushort device, cnt; | 868 | ushort device, cnt; |
| @@ -940,7 +941,6 @@ static void __init gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, | |||
| 940 | } | 941 | } |
| 941 | } | 942 | } |
| 942 | 943 | ||
| 943 | |||
| 944 | static void __init gdth_sort_pci(gdth_pci_str *pcistr, int cnt) | 944 | static void __init gdth_sort_pci(gdth_pci_str *pcistr, int cnt) |
| 945 | { | 945 | { |
| 946 | gdth_pci_str temp; | 946 | gdth_pci_str temp; |
| @@ -977,6 +977,7 @@ static void __init gdth_sort_pci(gdth_pci_str *pcistr, int cnt) | |||
| 977 | } | 977 | } |
| 978 | } while (changed); | 978 | } while (changed); |
| 979 | } | 979 | } |
| 980 | #endif /* CONFIG_PCI */ | ||
| 980 | 981 | ||
| 981 | #ifdef CONFIG_EISA | 982 | #ifdef CONFIG_EISA |
| 982 | static int __init gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha) | 983 | static int __init gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha) |
| @@ -1173,6 +1174,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | |||
| 1173 | } | 1174 | } |
| 1174 | #endif /* CONFIG_ISA */ | 1175 | #endif /* CONFIG_ISA */ |
| 1175 | 1176 | ||
| 1177 | #ifdef CONFIG_PCI | ||
| 1176 | static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) | 1178 | static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) |
| 1177 | { | 1179 | { |
| 1178 | register gdt6_dpram_str __iomem *dp6_ptr; | 1180 | register gdt6_dpram_str __iomem *dp6_ptr; |
| @@ -1555,7 +1557,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) | |||
| 1555 | 1557 | ||
| 1556 | return 1; | 1558 | return 1; |
| 1557 | } | 1559 | } |
| 1558 | 1560 | #endif /* CONFIG_PCI */ | |
| 1559 | 1561 | ||
| 1560 | /* controller protocol functions */ | 1562 | /* controller protocol functions */ |
| 1561 | 1563 | ||
| @@ -4297,13 +4299,6 @@ static int __init gdth_detect(struct scsi_host_template *shtp) | |||
| 4297 | static int __init gdth_detect(Scsi_Host_Template *shtp) | 4299 | static int __init gdth_detect(Scsi_Host_Template *shtp) |
| 4298 | #endif | 4300 | #endif |
| 4299 | { | 4301 | { |
| 4300 | struct Scsi_Host *shp; | ||
| 4301 | gdth_pci_str pcistr[MAXHA]; | ||
| 4302 | gdth_ha_str *ha; | ||
| 4303 | int i,hanum,cnt,ctr,err; | ||
| 4304 | unchar b; | ||
| 4305 | |||
| 4306 | |||
| 4307 | #ifdef DEBUG_GDTH | 4302 | #ifdef DEBUG_GDTH |
| 4308 | printk("GDT: This driver contains debugging information !! Trace level = %d\n", | 4303 | printk("GDT: This driver contains debugging information !! Trace level = %d\n", |
| 4309 | DebugState); | 4304 | DebugState); |
| @@ -4329,7 +4324,7 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) | |||
| 4329 | 4324 | ||
| 4330 | printk("GDT-HA: Storage RAID Controller Driver. Version: %s\n",GDTH_VERSION_STR); | 4325 | printk("GDT-HA: Storage RAID Controller Driver. Version: %s\n",GDTH_VERSION_STR); |
| 4331 | /* initializations */ | 4326 | /* initializations */ |
| 4332 | gdth_polling = TRUE; b = 0; | 4327 | gdth_polling = TRUE; |
| 4333 | gdth_clear_events(); | 4328 | gdth_clear_events(); |
| 4334 | 4329 | ||
| 4335 | /* As default we do not probe for EISA or ISA controllers */ | 4330 | /* As default we do not probe for EISA or ISA controllers */ |
| @@ -4356,143 +4351,22 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) | |||
| 4356 | #endif | 4351 | #endif |
| 4357 | } | 4352 | } |
| 4358 | 4353 | ||
| 4354 | #ifdef CONFIG_PCI | ||
| 4359 | /* scanning for PCI controllers */ | 4355 | /* scanning for PCI controllers */ |
| 4356 | { | ||
| 4357 | gdth_pci_str pcistr[MAXHA]; | ||
| 4358 | int cnt,ctr; | ||
| 4359 | |||
| 4360 | cnt = gdth_search_pci(pcistr); | 4360 | cnt = gdth_search_pci(pcistr); |
| 4361 | printk("GDT-HA: Found %d PCI Storage RAID Controllers\n",cnt); | 4361 | printk("GDT-HA: Found %d PCI Storage RAID Controllers\n",cnt); |
| 4362 | gdth_sort_pci(pcistr,cnt); | 4362 | gdth_sort_pci(pcistr,cnt); |
| 4363 | for (ctr = 0; ctr < cnt; ++ctr) { | 4363 | for (ctr = 0; ctr < cnt; ++ctr) { |
| 4364 | dma_addr_t scratch_dma_handle; | ||
| 4365 | scratch_dma_handle = 0; | ||
| 4366 | |||
| 4367 | if (gdth_ctr_count >= MAXHA) | 4364 | if (gdth_ctr_count >= MAXHA) |
| 4368 | break; | 4365 | break; |
| 4369 | shp = scsi_register(shtp,sizeof(gdth_ext_str)); | 4366 | gdth_pci_probe_one(shtp, pcistr, ctr); |
| 4370 | if (shp == NULL) | ||
| 4371 | continue; | ||
| 4372 | |||
| 4373 | ha = HADATA(shp); | ||
| 4374 | if (!gdth_init_pci(&pcistr[ctr],ha)) { | ||
| 4375 | scsi_unregister(shp); | ||
| 4376 | continue; | ||
| 4377 | } | ||
| 4378 | /* controller found and initialized */ | ||
| 4379 | printk("Configuring GDT-PCI HA at %d/%d IRQ %u\n", | ||
| 4380 | pcistr[ctr].pdev->bus->number, | ||
| 4381 | PCI_SLOT(pcistr[ctr].pdev->devfn), ha->irq); | ||
| 4382 | |||
| 4383 | if (request_irq(ha->irq, gdth_interrupt, | ||
| 4384 | IRQF_DISABLED|IRQF_SHARED, "gdth", ha)) | ||
| 4385 | { | ||
| 4386 | printk("GDT-PCI: Unable to allocate IRQ\n"); | ||
| 4387 | scsi_unregister(shp); | ||
| 4388 | continue; | ||
| 4389 | } | ||
| 4390 | shp->unchecked_isa_dma = 0; | ||
| 4391 | shp->irq = ha->irq; | ||
| 4392 | shp->dma_channel = 0xff; | ||
| 4393 | hanum = gdth_ctr_count; | ||
| 4394 | gdth_ctr_tab[gdth_ctr_count++] = shp; | ||
| 4395 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 4396 | |||
| 4397 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 4398 | NUMDATA(shp)->busnum= 0; | ||
| 4399 | |||
| 4400 | ha->pccb = CMDDATA(shp); | ||
| 4401 | ha->ccb_phys = 0L; | ||
| 4402 | |||
| 4403 | ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 4404 | &scratch_dma_handle); | ||
| 4405 | ha->scratch_phys = scratch_dma_handle; | ||
| 4406 | ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 4407 | &scratch_dma_handle); | ||
| 4408 | ha->msg_phys = scratch_dma_handle; | ||
| 4409 | #ifdef INT_COAL | ||
| 4410 | ha->coal_stat = (gdth_coal_status *) | ||
| 4411 | pci_alloc_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
| 4412 | MAXOFFSETS, &scratch_dma_handle); | ||
| 4413 | ha->coal_stat_phys = scratch_dma_handle; | ||
| 4414 | #endif | ||
| 4415 | ha->scratch_busy = FALSE; | ||
| 4416 | ha->req_first = NULL; | ||
| 4417 | ha->tid_cnt = pcistr[ctr].pdev->device >= 0x200 ? MAXID : MAX_HDRIVES; | ||
| 4418 | if (max_ids > 0 && max_ids < ha->tid_cnt) | ||
| 4419 | ha->tid_cnt = max_ids; | ||
| 4420 | for (i=0; i<GDTH_MAXCMDS; ++i) | ||
| 4421 | ha->cmd_tab[i].cmnd = UNUSED_CMND; | ||
| 4422 | ha->scan_mode = rescan ? 0x10 : 0; | ||
| 4423 | |||
| 4424 | err = FALSE; | ||
| 4425 | if (ha->pscratch == NULL || ha->pmsg == NULL || | ||
| 4426 | !gdth_search_drives(hanum)) { | ||
| 4427 | err = TRUE; | ||
| 4428 | } else { | ||
| 4429 | if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) | ||
| 4430 | hdr_channel = ha->bus_cnt; | ||
| 4431 | ha->virt_bus = hdr_channel; | ||
| 4432 | |||
| 4433 | |||
| 4434 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) | ||
| 4435 | scsi_set_pci_device(shp, pcistr[ctr].pdev); | ||
| 4436 | #endif | ||
| 4437 | if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT)|| | ||
| 4438 | /* 64-bit DMA only supported from FW >= x.43 */ | ||
| 4439 | (!ha->dma64_support)) { | ||
| 4440 | if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { | ||
| 4441 | printk(KERN_WARNING "GDT-PCI %d: Unable to set 32-bit DMA\n", hanum); | ||
| 4442 | err = TRUE; | ||
| 4443 | } | ||
| 4444 | } else { | ||
| 4445 | shp->max_cmd_len = 16; | ||
| 4446 | if (!pci_set_dma_mask(pcistr[ctr].pdev, DMA_64BIT_MASK)) { | ||
| 4447 | printk("GDT-PCI %d: 64-bit DMA enabled\n", hanum); | ||
| 4448 | } else if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { | ||
| 4449 | printk(KERN_WARNING "GDT-PCI %d: Unable to set 64/32-bit DMA\n", hanum); | ||
| 4450 | err = TRUE; | ||
| 4451 | } | ||
| 4452 | } | ||
| 4453 | } | ||
| 4454 | |||
| 4455 | if (err) { | ||
| 4456 | printk("GDT-PCI %d: Error during device scan\n", hanum); | ||
| 4457 | --gdth_ctr_count; | ||
| 4458 | --gdth_ctr_vcount; | ||
| 4459 | #ifdef INT_COAL | ||
| 4460 | if (ha->coal_stat) | ||
| 4461 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
| 4462 | MAXOFFSETS, ha->coal_stat, | ||
| 4463 | ha->coal_stat_phys); | ||
| 4464 | #endif | ||
| 4465 | if (ha->pscratch) | ||
| 4466 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 4467 | ha->pscratch, ha->scratch_phys); | ||
| 4468 | if (ha->pmsg) | ||
| 4469 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 4470 | ha->pmsg, ha->msg_phys); | ||
| 4471 | free_irq(ha->irq,ha); | ||
| 4472 | scsi_unregister(shp); | ||
| 4473 | continue; | ||
| 4474 | } | ||
| 4475 | |||
| 4476 | shp->max_id = ha->tid_cnt; | ||
| 4477 | shp->max_lun = MAXLUN; | ||
| 4478 | shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; | ||
| 4479 | if (virt_ctr) { | ||
| 4480 | virt_ctr = 1; | ||
| 4481 | /* register addit. SCSI channels as virtual controllers */ | ||
| 4482 | for (b = 1; b < ha->bus_cnt + 1; ++b) { | ||
| 4483 | shp = scsi_register(shtp,sizeof(gdth_num_str)); | ||
| 4484 | shp->unchecked_isa_dma = 0; | ||
| 4485 | shp->irq = ha->irq; | ||
| 4486 | shp->dma_channel = 0xff; | ||
| 4487 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 4488 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 4489 | NUMDATA(shp)->busnum = b; | ||
| 4490 | } | ||
| 4491 | } | ||
| 4492 | |||
| 4493 | spin_lock_init(&ha->smp_lock); | ||
| 4494 | gdth_enable_int(hanum); | ||
| 4495 | } | 4367 | } |
| 4368 | } | ||
| 4369 | #endif /* CONFIG_PCI */ | ||
| 4496 | 4370 | ||
| 4497 | TRACE2(("gdth_detect() %d controller detected\n",gdth_ctr_count)); | 4371 | TRACE2(("gdth_detect() %d controller detected\n",gdth_ctr_count)); |
| 4498 | if (gdth_ctr_count > 0) { | 4372 | if (gdth_ctr_count > 0) { |
| @@ -5735,6 +5609,154 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, | |||
| 5735 | } | 5609 | } |
| 5736 | #endif /* CONFIG_EISA */ | 5610 | #endif /* CONFIG_EISA */ |
| 5737 | 5611 | ||
| 5612 | #ifdef CONFIG_PCI | ||
| 5613 | static int gdth_pci_probe_one(struct scsi_host_template *shtp, | ||
| 5614 | gdth_pci_str *pcistr, int ctr) | ||
| 5615 | { | ||
| 5616 | struct Scsi_Host *shp; | ||
| 5617 | gdth_ha_str *ha; | ||
| 5618 | dma_addr_t scratch_dma_handle = 0; | ||
| 5619 | int error, hanum, i; | ||
| 5620 | u8 b; | ||
| 5621 | |||
| 5622 | shp = scsi_register(shtp,sizeof(gdth_ext_str)); | ||
| 5623 | if (!shp) | ||
| 5624 | return -ENOMEM; | ||
| 5625 | ha = HADATA(shp); | ||
| 5626 | |||
| 5627 | error = -ENODEV; | ||
| 5628 | if (!gdth_init_pci(&pcistr[ctr],ha)) | ||
| 5629 | goto out_host_put; | ||
| 5630 | |||
| 5631 | /* controller found and initialized */ | ||
| 5632 | printk("Configuring GDT-PCI HA at %d/%d IRQ %u\n", | ||
| 5633 | pcistr[ctr].pdev->bus->number, | ||
| 5634 | PCI_SLOT(pcistr[ctr].pdev->devfn), | ||
| 5635 | ha->irq); | ||
| 5636 | |||
| 5637 | error = request_irq(ha->irq, gdth_interrupt, | ||
| 5638 | IRQF_DISABLED|IRQF_SHARED, "gdth", ha); | ||
| 5639 | if (error) { | ||
| 5640 | printk("GDT-PCI: Unable to allocate IRQ\n"); | ||
| 5641 | goto out_host_put; | ||
| 5642 | } | ||
| 5643 | |||
| 5644 | shp->unchecked_isa_dma = 0; | ||
| 5645 | shp->irq = ha->irq; | ||
| 5646 | shp->dma_channel = 0xff; | ||
| 5647 | hanum = gdth_ctr_count; | ||
| 5648 | gdth_ctr_tab[gdth_ctr_count++] = shp; | ||
| 5649 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 5650 | |||
| 5651 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 5652 | NUMDATA(shp)->busnum= 0; | ||
| 5653 | |||
| 5654 | ha->pccb = CMDDATA(shp); | ||
| 5655 | ha->ccb_phys = 0L; | ||
| 5656 | |||
| 5657 | error = -ENOMEM; | ||
| 5658 | |||
| 5659 | ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 5660 | &scratch_dma_handle); | ||
| 5661 | if (!ha->pscratch) | ||
| 5662 | goto out_free_irq; | ||
| 5663 | ha->scratch_phys = scratch_dma_handle; | ||
| 5664 | |||
| 5665 | ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 5666 | &scratch_dma_handle); | ||
| 5667 | if (!ha->pmsg) | ||
| 5668 | goto out_free_pscratch; | ||
| 5669 | ha->msg_phys = scratch_dma_handle; | ||
| 5670 | |||
| 5671 | #ifdef INT_COAL | ||
| 5672 | ha->coal_stat = pci_alloc_consistent(ha->pdev, | ||
| 5673 | sizeof(gdth_coal_status) * MAXOFFSETS, | ||
| 5674 | &scratch_dma_handle); | ||
| 5675 | if (!ha->coal_stat) | ||
| 5676 | goto out_free_pmsg; | ||
| 5677 | ha->coal_stat_phys = scratch_dma_handle; | ||
| 5678 | #endif | ||
| 5679 | |||
| 5680 | ha->scratch_busy = FALSE; | ||
| 5681 | ha->req_first = NULL; | ||
| 5682 | ha->tid_cnt = pcistr[ctr].pdev->device >= 0x200 ? MAXID : MAX_HDRIVES; | ||
| 5683 | if (max_ids > 0 && max_ids < ha->tid_cnt) | ||
| 5684 | ha->tid_cnt = max_ids; | ||
| 5685 | for (i = 0; i < GDTH_MAXCMDS; ++i) | ||
| 5686 | ha->cmd_tab[i].cmnd = UNUSED_CMND; | ||
| 5687 | ha->scan_mode = rescan ? 0x10 : 0; | ||
| 5688 | |||
| 5689 | error = -ENODEV; | ||
| 5690 | if (!gdth_search_drives(hanum)) { | ||
| 5691 | printk("GDT-PCI %d: Error during device scan\n", hanum); | ||
| 5692 | goto out_free_coal_stat; | ||
| 5693 | } | ||
| 5694 | |||
| 5695 | if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) | ||
| 5696 | hdr_channel = ha->bus_cnt; | ||
| 5697 | ha->virt_bus = hdr_channel; | ||
| 5698 | |||
| 5699 | /* 64-bit DMA only supported from FW >= x.43 */ | ||
| 5700 | if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) || | ||
| 5701 | !ha->dma64_support) { | ||
| 5702 | if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { | ||
| 5703 | printk(KERN_WARNING "GDT-PCI %d: " | ||
| 5704 | "Unable to set 32-bit DMA\n", hanum); | ||
| 5705 | goto out_free_coal_stat; | ||
| 5706 | } | ||
| 5707 | } else { | ||
| 5708 | shp->max_cmd_len = 16; | ||
| 5709 | if (!pci_set_dma_mask(pcistr[ctr].pdev, DMA_64BIT_MASK)) { | ||
| 5710 | printk("GDT-PCI %d: 64-bit DMA enabled\n", hanum); | ||
| 5711 | } else if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { | ||
| 5712 | printk(KERN_WARNING "GDT-PCI %d: " | ||
| 5713 | "Unable to set 64/32-bit DMA\n", hanum); | ||
| 5714 | goto out_free_coal_stat; | ||
| 5715 | } | ||
| 5716 | } | ||
| 5717 | |||
| 5718 | shp->max_id = ha->tid_cnt; | ||
| 5719 | shp->max_lun = MAXLUN; | ||
| 5720 | shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; | ||
| 5721 | if (virt_ctr) { | ||
| 5722 | virt_ctr = 1; | ||
| 5723 | /* register addit. SCSI channels as virtual controllers */ | ||
| 5724 | for (b = 1; b < ha->bus_cnt + 1; ++b) { | ||
| 5725 | shp = scsi_register(shtp,sizeof(gdth_num_str)); | ||
| 5726 | shp->unchecked_isa_dma = 0; | ||
| 5727 | shp->irq = ha->irq; | ||
| 5728 | shp->dma_channel = 0xff; | ||
| 5729 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 5730 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 5731 | NUMDATA(shp)->busnum = b; | ||
| 5732 | } | ||
| 5733 | } | ||
| 5734 | |||
| 5735 | spin_lock_init(&ha->smp_lock); | ||
| 5736 | gdth_enable_int(hanum); | ||
| 5737 | return 0; | ||
| 5738 | |||
| 5739 | out_free_coal_stat: | ||
| 5740 | #ifdef INT_COAL | ||
| 5741 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * MAXOFFSETS, | ||
| 5742 | ha->coal_stat, ha->coal_stat_phys); | ||
| 5743 | out_free_pmsg: | ||
| 5744 | #endif | ||
| 5745 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 5746 | ha->pmsg, ha->msg_phys); | ||
| 5747 | out_free_pscratch: | ||
| 5748 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 5749 | ha->pscratch, ha->scratch_phys); | ||
| 5750 | out_free_irq: | ||
| 5751 | free_irq(ha->irq, ha); | ||
| 5752 | gdth_ctr_count--; | ||
| 5753 | gdth_ctr_vcount--; | ||
| 5754 | out_host_put: | ||
| 5755 | scsi_unregister(shp); | ||
| 5756 | return error; | ||
| 5757 | } | ||
| 5758 | #endif /* CONFIG_PCI */ | ||
| 5759 | |||
| 5738 | #include "scsi_module.c" | 5760 | #include "scsi_module.c" |
| 5739 | #ifndef MODULE | 5761 | #ifndef MODULE |
| 5740 | __setup("gdth=", option_setup); | 5762 | __setup("gdth=", option_setup); |
