diff options
| author | Christoph Hellwig <hch@lst.de> | 2007-10-02 16:48:16 -0400 |
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-12 14:55:16 -0400 |
| commit | aed91cb520747d08dd5cb0220d0dd3492bead220 (patch) | |
| tree | 498ad7ea316835b257edc8caaf6b51cc7ee102ee | |
| parent | b8bff2aeafb1959de27bd889d1c103577b36712f (diff) | |
[SCSI] gdth: split out isa probing
(note: this is ontop of Jeff's pci cleanup patch)
Split out isa probing into a helper of it's own. Error handling is
cleaned up, but errors are not propagated yet. Also enclose the isa
probe under the proper CONFIG_ISA symbol instead of the !IA64 hack.
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 | 296 |
1 files changed, 162 insertions, 134 deletions
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index fe5db2da26b7..add2ebbc2939 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -445,13 +445,11 @@ 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_eisa(ushort eisa_adr); | 447 | static int gdth_search_eisa(ushort eisa_adr); |
| 448 | static int gdth_search_isa(ulong32 bios_adr); | ||
| 449 | static int gdth_search_pci(gdth_pci_str *pcistr); | 448 | static int gdth_search_pci(gdth_pci_str *pcistr); |
| 450 | static void gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, | 449 | static void gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, |
| 451 | ushort vendor, ushort dev); | 450 | ushort vendor, ushort dev); |
| 452 | static void gdth_sort_pci(gdth_pci_str *pcistr, int cnt); | 451 | static void gdth_sort_pci(gdth_pci_str *pcistr, int cnt); |
| 453 | static int gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha); | 452 | static int gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha); |
| 454 | static int gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha); | ||
| 455 | static int gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha); | 453 | static int gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha); |
| 456 | 454 | ||
| 457 | static void gdth_enable_int(int hanum); | 455 | static void gdth_enable_int(int hanum); |
| @@ -476,6 +474,9 @@ static void gdth_flush(int hanum); | |||
| 476 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); | 474 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); |
| 477 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); | 475 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); |
| 478 | static void gdth_scsi_done(struct scsi_cmnd *scp); | 476 | static void gdth_scsi_done(struct scsi_cmnd *scp); |
| 477 | #ifdef CONFIG_ISA | ||
| 478 | static int gdth_isa_probe_one(struct scsi_host_template *, ulong32); | ||
| 479 | #endif | ||
| 479 | 480 | ||
| 480 | #ifdef DEBUG_GDTH | 481 | #ifdef DEBUG_GDTH |
| 481 | static unchar DebugState = DEBUG_GDTH; | 482 | static unchar DebugState = DEBUG_GDTH; |
| @@ -584,7 +585,10 @@ static struct timer_list gdth_timer; | |||
| 584 | #define gdth_writew(b,addr) writew((b),(addr)) | 585 | #define gdth_writew(b,addr) writew((b),(addr)) |
| 585 | #define gdth_writel(b,addr) writel((b),(addr)) | 586 | #define gdth_writel(b,addr) writel((b),(addr)) |
| 586 | 587 | ||
| 588 | #ifdef CONFIG_ISA | ||
| 587 | static unchar gdth_drq_tab[4] = {5,6,7,7}; /* DRQ table */ | 589 | static unchar gdth_drq_tab[4] = {5,6,7,7}; /* DRQ table */ |
| 590 | #endif | ||
| 591 | |||
| 588 | static unchar gdth_irq_tab[6] = {0,10,11,12,14,0}; /* IRQ table */ | 592 | static unchar gdth_irq_tab[6] = {0,10,11,12,14,0}; /* IRQ table */ |
| 589 | static unchar gdth_polling; /* polling if TRUE */ | 593 | static unchar gdth_polling; /* polling if TRUE */ |
| 590 | static unchar gdth_from_wait = FALSE; /* gdth_wait() */ | 594 | static unchar gdth_from_wait = FALSE; /* gdth_wait() */ |
| @@ -838,7 +842,7 @@ static int __init gdth_search_eisa(ushort eisa_adr) | |||
| 838 | return 0; | 842 | return 0; |
| 839 | } | 843 | } |
| 840 | 844 | ||
| 841 | 845 | #ifdef CONFIG_ISA | |
| 842 | static int __init gdth_search_isa(ulong32 bios_adr) | 846 | static int __init gdth_search_isa(ulong32 bios_adr) |
| 843 | { | 847 | { |
| 844 | void __iomem *addr; | 848 | void __iomem *addr; |
| @@ -853,7 +857,7 @@ static int __init gdth_search_isa(ulong32 bios_adr) | |||
| 853 | } | 857 | } |
| 854 | return 0; | 858 | return 0; |
| 855 | } | 859 | } |
| 856 | 860 | #endif /* CONFIG_ISA */ | |
| 857 | 861 | ||
| 858 | static int __init gdth_search_pci(gdth_pci_str *pcistr) | 862 | static int __init gdth_search_pci(gdth_pci_str *pcistr) |
| 859 | { | 863 | { |
| @@ -1064,7 +1068,7 @@ static int __init gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha) | |||
| 1064 | return 1; | 1068 | return 1; |
| 1065 | } | 1069 | } |
| 1066 | 1070 | ||
| 1067 | 1071 | #ifdef CONFIG_ISA | |
| 1068 | static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | 1072 | static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) |
| 1069 | { | 1073 | { |
| 1070 | register gdt2_dpram_str __iomem *dp2_ptr; | 1074 | register gdt2_dpram_str __iomem *dp2_ptr; |
| @@ -1163,7 +1167,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | |||
| 1163 | ha->dma64_support = 0; | 1167 | ha->dma64_support = 0; |
| 1164 | return 1; | 1168 | return 1; |
| 1165 | } | 1169 | } |
| 1166 | 1170 | #endif /* CONFIG_ISA */ | |
| 1167 | 1171 | ||
| 1168 | static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) | 1172 | static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) |
| 1169 | { | 1173 | { |
| @@ -4282,6 +4286,7 @@ int __init option_setup(char *str) | |||
| 4282 | return 1; | 4286 | return 1; |
| 4283 | } | 4287 | } |
| 4284 | 4288 | ||
| 4289 | |||
| 4285 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 4290 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) |
| 4286 | static int __init gdth_detect(struct scsi_host_template *shtp) | 4291 | static int __init gdth_detect(struct scsi_host_template *shtp) |
| 4287 | #else | 4292 | #else |
| @@ -4291,7 +4296,6 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) | |||
| 4291 | struct Scsi_Host *shp; | 4296 | struct Scsi_Host *shp; |
| 4292 | gdth_pci_str pcistr[MAXHA]; | 4297 | gdth_pci_str pcistr[MAXHA]; |
| 4293 | gdth_ha_str *ha; | 4298 | gdth_ha_str *ha; |
| 4294 | ulong32 isa_bios; | ||
| 4295 | ushort eisa_slot; | 4299 | ushort eisa_slot; |
| 4296 | int i,hanum,cnt,ctr,err; | 4300 | int i,hanum,cnt,ctr,err; |
| 4297 | unchar b; | 4301 | unchar b; |
| @@ -4328,135 +4332,16 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) | |||
| 4328 | /* As default we do not probe for EISA or ISA controllers */ | 4332 | /* As default we do not probe for EISA or ISA controllers */ |
| 4329 | if (probe_eisa_isa) { | 4333 | if (probe_eisa_isa) { |
| 4330 | /* scanning for controllers, at first: ISA controller */ | 4334 | /* scanning for controllers, at first: ISA controller */ |
| 4331 | for (isa_bios=0xc8000UL; isa_bios<=0xd8000UL; isa_bios+=0x8000UL) { | 4335 | #ifdef CONFIG_ISA |
| 4332 | dma_addr_t scratch_dma_handle; | 4336 | ulong32 isa_bios; |
| 4333 | scratch_dma_handle = 0; | 4337 | for (isa_bios = 0xc8000UL; isa_bios <= 0xd8000UL; |
| 4334 | 4338 | isa_bios += 0x8000UL) { | |
| 4335 | if (gdth_ctr_count >= MAXHA) | 4339 | if (gdth_ctr_count >= MAXHA) |
| 4336 | break; | 4340 | break; |
| 4337 | if (gdth_search_isa(isa_bios)) { /* controller found */ | 4341 | gdth_isa_probe_one(shtp, isa_bios); |
| 4338 | shp = scsi_register(shtp,sizeof(gdth_ext_str)); | ||
| 4339 | if (shp == NULL) | ||
| 4340 | continue; | ||
| 4341 | |||
| 4342 | ha = HADATA(shp); | ||
| 4343 | if (!gdth_init_isa(isa_bios,ha)) { | ||
| 4344 | scsi_unregister(shp); | ||
| 4345 | continue; | ||
| 4346 | } | ||
| 4347 | #ifdef __ia64__ | ||
| 4348 | break; | ||
| 4349 | #else | ||
| 4350 | /* controller found and initialized */ | ||
| 4351 | printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n", | ||
| 4352 | isa_bios,ha->irq,ha->drq); | ||
| 4353 | |||
| 4354 | if (request_irq(ha->irq,gdth_interrupt,IRQF_DISABLED,"gdth",ha)) { | ||
| 4355 | printk("GDT-ISA: Unable to allocate IRQ\n"); | ||
| 4356 | scsi_unregister(shp); | ||
| 4357 | continue; | ||
| 4358 | } | ||
| 4359 | if (request_dma(ha->drq,"gdth")) { | ||
| 4360 | printk("GDT-ISA: Unable to allocate DMA channel\n"); | ||
| 4361 | free_irq(ha->irq,ha); | ||
| 4362 | scsi_unregister(shp); | ||
| 4363 | continue; | ||
| 4364 | } | ||
| 4365 | set_dma_mode(ha->drq,DMA_MODE_CASCADE); | ||
| 4366 | enable_dma(ha->drq); | ||
| 4367 | shp->unchecked_isa_dma = 1; | ||
| 4368 | shp->irq = ha->irq; | ||
| 4369 | shp->dma_channel = ha->drq; | ||
| 4370 | hanum = gdth_ctr_count; | ||
| 4371 | gdth_ctr_tab[gdth_ctr_count++] = shp; | ||
| 4372 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 4373 | |||
| 4374 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 4375 | NUMDATA(shp)->busnum= 0; | ||
| 4376 | |||
| 4377 | ha->pccb = CMDDATA(shp); | ||
| 4378 | ha->ccb_phys = 0L; | ||
| 4379 | ha->pdev = NULL; | ||
| 4380 | ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 4381 | &scratch_dma_handle); | ||
| 4382 | ha->scratch_phys = scratch_dma_handle; | ||
| 4383 | ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 4384 | &scratch_dma_handle); | ||
| 4385 | ha->msg_phys = scratch_dma_handle; | ||
| 4386 | #ifdef INT_COAL | ||
| 4387 | ha->coal_stat = (gdth_coal_status *) | ||
| 4388 | pci_alloc_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
| 4389 | MAXOFFSETS, &scratch_dma_handle); | ||
| 4390 | ha->coal_stat_phys = scratch_dma_handle; | ||
| 4391 | #endif | ||
| 4392 | |||
| 4393 | ha->scratch_busy = FALSE; | ||
| 4394 | ha->req_first = NULL; | ||
| 4395 | ha->tid_cnt = MAX_HDRIVES; | ||
| 4396 | if (max_ids > 0 && max_ids < ha->tid_cnt) | ||
| 4397 | ha->tid_cnt = max_ids; | ||
| 4398 | for (i=0; i<GDTH_MAXCMDS; ++i) | ||
| 4399 | ha->cmd_tab[i].cmnd = UNUSED_CMND; | ||
| 4400 | ha->scan_mode = rescan ? 0x10 : 0; | ||
| 4401 | |||
| 4402 | if (ha->pscratch == NULL || ha->pmsg == NULL || | ||
| 4403 | !gdth_search_drives(hanum)) { | ||
| 4404 | printk("GDT-ISA: Error during device scan\n"); | ||
| 4405 | --gdth_ctr_count; | ||
| 4406 | --gdth_ctr_vcount; | ||
| 4407 | |||
| 4408 | #ifdef INT_COAL | ||
| 4409 | if (ha->coal_stat) | ||
| 4410 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
| 4411 | MAXOFFSETS, ha->coal_stat, | ||
| 4412 | ha->coal_stat_phys); | ||
| 4413 | #endif | ||
| 4414 | if (ha->pscratch) | ||
| 4415 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 4416 | ha->pscratch, ha->scratch_phys); | ||
| 4417 | if (ha->pmsg) | ||
| 4418 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 4419 | ha->pmsg, ha->msg_phys); | ||
| 4420 | |||
| 4421 | free_irq(ha->irq,ha); | ||
| 4422 | scsi_unregister(shp); | ||
| 4423 | continue; | ||
| 4424 | } | ||
| 4425 | if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) | ||
| 4426 | hdr_channel = ha->bus_cnt; | ||
| 4427 | ha->virt_bus = hdr_channel; | ||
| 4428 | |||
| 4429 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) && \ | ||
| 4430 | LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) | ||
| 4431 | shp->highmem_io = 0; | ||
| 4432 | #endif | ||
| 4433 | if (ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) | ||
| 4434 | shp->max_cmd_len = 16; | ||
| 4435 | |||
| 4436 | shp->max_id = ha->tid_cnt; | ||
| 4437 | shp->max_lun = MAXLUN; | ||
| 4438 | shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; | ||
| 4439 | if (virt_ctr) { | ||
| 4440 | virt_ctr = 1; | ||
| 4441 | /* register addit. SCSI channels as virtual controllers */ | ||
| 4442 | for (b = 1; b < ha->bus_cnt + 1; ++b) { | ||
| 4443 | shp = scsi_register(shtp,sizeof(gdth_num_str)); | ||
| 4444 | shp->unchecked_isa_dma = 1; | ||
| 4445 | shp->irq = ha->irq; | ||
| 4446 | shp->dma_channel = ha->drq; | ||
| 4447 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 4448 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 4449 | NUMDATA(shp)->busnum = b; | ||
| 4450 | } | ||
| 4451 | } | ||
| 4452 | |||
| 4453 | spin_lock_init(&ha->smp_lock); | ||
| 4454 | gdth_enable_int(hanum); | ||
| 4455 | #endif /* !__ia64__ */ | ||
| 4456 | } | ||
| 4457 | } | 4342 | } |
| 4343 | #endif | ||
| 4458 | 4344 | ||
| 4459 | /* scanning for EISA controllers */ | ||
| 4460 | for (eisa_slot=0x1000; eisa_slot<=0x8000; eisa_slot+=0x1000) { | 4345 | for (eisa_slot=0x1000; eisa_slot<=0x8000; eisa_slot+=0x1000) { |
| 4461 | dma_addr_t scratch_dma_handle; | 4346 | dma_addr_t scratch_dma_handle; |
| 4462 | scratch_dma_handle = 0; | 4347 | scratch_dma_handle = 0; |
| @@ -4754,7 +4639,7 @@ static int gdth_release(struct Scsi_Host *shp) | |||
| 4754 | if (shp->irq) { | 4639 | if (shp->irq) { |
| 4755 | free_irq(shp->irq,ha); | 4640 | free_irq(shp->irq,ha); |
| 4756 | } | 4641 | } |
| 4757 | #ifndef __ia64__ | 4642 | #ifdef CONFIG_ISA |
| 4758 | if (shp->dma_channel != 0xff) { | 4643 | if (shp->dma_channel != 0xff) { |
| 4759 | free_dma(shp->dma_channel); | 4644 | free_dma(shp->dma_channel); |
| 4760 | } | 4645 | } |
| @@ -5674,6 +5559,149 @@ static Scsi_Host_Template driver_template = { | |||
| 5674 | #endif | 5559 | #endif |
| 5675 | }; | 5560 | }; |
| 5676 | 5561 | ||
| 5562 | #ifdef CONFIG_ISA | ||
| 5563 | static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) | ||
| 5564 | { | ||
| 5565 | struct Scsi_Host *shp; | ||
| 5566 | gdth_ha_str *ha; | ||
| 5567 | dma_addr_t scratch_dma_handle = 0; | ||
| 5568 | int error, hanum, i; | ||
| 5569 | u8 b; | ||
| 5570 | |||
| 5571 | if (!gdth_search_isa(isa_bios)) | ||
| 5572 | return -ENXIO; | ||
| 5573 | |||
| 5574 | shp = scsi_register(shtp, sizeof(gdth_ext_str)); | ||
| 5575 | if (!shp) | ||
| 5576 | return -ENOMEM; | ||
| 5577 | ha = HADATA(shp); | ||
| 5578 | |||
| 5579 | error = -ENODEV; | ||
| 5580 | if (!gdth_init_isa(isa_bios,ha)) | ||
| 5581 | goto out_host_put; | ||
| 5582 | |||
| 5583 | /* controller found and initialized */ | ||
| 5584 | printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n", | ||
| 5585 | isa_bios, ha->irq, ha->drq); | ||
| 5586 | |||
| 5587 | error = request_irq(ha->irq, gdth_interrupt, IRQF_DISABLED, "gdth", ha); | ||
| 5588 | if (error) { | ||
| 5589 | printk("GDT-ISA: Unable to allocate IRQ\n"); | ||
| 5590 | goto out_host_put; | ||
| 5591 | } | ||
| 5592 | |||
| 5593 | error = request_dma(ha->drq, "gdth"); | ||
| 5594 | if (error) { | ||
| 5595 | printk("GDT-ISA: Unable to allocate DMA channel\n"); | ||
| 5596 | goto out_free_irq; | ||
| 5597 | } | ||
| 5598 | |||
| 5599 | set_dma_mode(ha->drq,DMA_MODE_CASCADE); | ||
| 5600 | enable_dma(ha->drq); | ||
| 5601 | shp->unchecked_isa_dma = 1; | ||
| 5602 | shp->irq = ha->irq; | ||
| 5603 | shp->dma_channel = ha->drq; | ||
| 5604 | hanum = gdth_ctr_count; | ||
| 5605 | gdth_ctr_tab[gdth_ctr_count++] = shp; | ||
| 5606 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 5607 | |||
| 5608 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 5609 | NUMDATA(shp)->busnum= 0; | ||
| 5610 | |||
| 5611 | ha->pccb = CMDDATA(shp); | ||
| 5612 | ha->ccb_phys = 0L; | ||
| 5613 | ha->pdev = NULL; | ||
| 5614 | |||
| 5615 | error = -ENOMEM; | ||
| 5616 | |||
| 5617 | ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 5618 | &scratch_dma_handle); | ||
| 5619 | if (!ha->pscratch) | ||
| 5620 | goto out_dec_counters; | ||
| 5621 | ha->scratch_phys = scratch_dma_handle; | ||
| 5622 | |||
| 5623 | ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 5624 | &scratch_dma_handle); | ||
| 5625 | if (!ha->pmsg) | ||
| 5626 | goto out_free_pscratch; | ||
| 5627 | ha->msg_phys = scratch_dma_handle; | ||
| 5628 | |||
| 5629 | #ifdef INT_COAL | ||
| 5630 | ha->coal_stat = pci_alloc_consistent(ha->pdev, | ||
| 5631 | sizeof(gdth_coal_status) * MAXOFFSETS, | ||
| 5632 | &scratch_dma_handle); | ||
| 5633 | if (!ha->coal_stat) | ||
| 5634 | goto out_free_pmsg; | ||
| 5635 | ha->coal_stat_phys = scratch_dma_handle; | ||
| 5636 | #endif | ||
| 5637 | |||
| 5638 | ha->scratch_busy = FALSE; | ||
| 5639 | ha->req_first = NULL; | ||
| 5640 | ha->tid_cnt = MAX_HDRIVES; | ||
| 5641 | if (max_ids > 0 && max_ids < ha->tid_cnt) | ||
| 5642 | ha->tid_cnt = max_ids; | ||
| 5643 | for (i = 0; i < GDTH_MAXCMDS; ++i) | ||
| 5644 | ha->cmd_tab[i].cmnd = UNUSED_CMND; | ||
| 5645 | ha->scan_mode = rescan ? 0x10 : 0; | ||
| 5646 | |||
| 5647 | error = -ENODEV; | ||
| 5648 | if (!gdth_search_drives(hanum)) { | ||
| 5649 | printk("GDT-ISA: Error during device scan\n"); | ||
| 5650 | goto out_free_coal_stat; | ||
| 5651 | } | ||
| 5652 | |||
| 5653 | if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) | ||
| 5654 | hdr_channel = ha->bus_cnt; | ||
| 5655 | ha->virt_bus = hdr_channel; | ||
| 5656 | |||
| 5657 | if (ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) | ||
| 5658 | shp->max_cmd_len = 16; | ||
| 5659 | |||
| 5660 | shp->max_id = ha->tid_cnt; | ||
| 5661 | shp->max_lun = MAXLUN; | ||
| 5662 | shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; | ||
| 5663 | if (virt_ctr) { | ||
| 5664 | virt_ctr = 1; | ||
| 5665 | /* register addit. SCSI channels as virtual controllers */ | ||
| 5666 | for (b = 1; b < ha->bus_cnt + 1; ++b) { | ||
| 5667 | shp = scsi_register(shtp,sizeof(gdth_num_str)); | ||
| 5668 | shp->unchecked_isa_dma = 1; | ||
| 5669 | shp->irq = ha->irq; | ||
| 5670 | shp->dma_channel = ha->drq; | ||
| 5671 | gdth_ctr_vtab[gdth_ctr_vcount++] = shp; | ||
| 5672 | NUMDATA(shp)->hanum = (ushort)hanum; | ||
| 5673 | NUMDATA(shp)->busnum = b; | ||
| 5674 | } | ||
| 5675 | } | ||
| 5676 | |||
| 5677 | spin_lock_init(&ha->smp_lock); | ||
| 5678 | gdth_enable_int(hanum); | ||
| 5679 | |||
| 5680 | return 0; | ||
| 5681 | |||
| 5682 | out_free_coal_stat: | ||
| 5683 | #ifdef INT_COAL | ||
| 5684 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * MAXOFFSETS, | ||
| 5685 | ha->coal_stat, ha->coal_stat_phys); | ||
| 5686 | out_free_pmsg: | ||
| 5687 | #endif | ||
| 5688 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
| 5689 | ha->pmsg, ha->msg_phys); | ||
| 5690 | out_free_pscratch: | ||
| 5691 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
| 5692 | ha->pscratch, ha->scratch_phys); | ||
| 5693 | out_dec_counters: | ||
| 5694 | gdth_ctr_count--; | ||
| 5695 | gdth_ctr_vcount--; | ||
| 5696 | out_free_irq: | ||
| 5697 | free_irq(ha->irq, ha); | ||
| 5698 | out_host_put: | ||
| 5699 | scsi_unregister(shp); | ||
| 5700 | return error; | ||
| 5701 | } | ||
| 5702 | #endif /* CONFIG_ISA */ | ||
| 5703 | |||
| 5704 | |||
| 5677 | #include "scsi_module.c" | 5705 | #include "scsi_module.c" |
| 5678 | #ifndef MODULE | 5706 | #ifndef MODULE |
| 5679 | __setup("gdth=", option_setup); | 5707 | __setup("gdth=", option_setup); |
