aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/advansys.c236
1 files changed, 100 insertions, 136 deletions
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index a4091ab8d363..93bf3ec514b8 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -66,8 +66,7 @@
66 * 5. check DMA mapping functions for failure 66 * 5. check DMA mapping functions for failure
67 * 6. Use scsi_transport_spi 67 * 6. Use scsi_transport_spi
68 * 7. advansys_info is not safe against multiple simultaneous callers 68 * 7. advansys_info is not safe against multiple simultaneous callers
69 * 8. Kill boardp->id 69 * 8. Add module_param to override ISA/VLB ioport array
70 * 9. Add module_param to override ISA/VLB ioport array
71 */ 70 */
72#warning this driver is still not properly converted to the DMA API 71#warning this driver is still not properly converted to the DMA API
73 72
@@ -2416,7 +2415,6 @@ typedef struct adv_req {
2416 */ 2415 */
2417struct asc_board { 2416struct asc_board {
2418 struct device *dev; 2417 struct device *dev;
2419 int id; /* Board Id */
2420 uint flags; /* Board flags */ 2418 uint flags; /* Board flags */
2421 unsigned int irq; 2419 unsigned int irq;
2422 union { 2420 union {
@@ -2467,9 +2465,6 @@ struct asc_board {
2467 dvc_var.adv_dvc_var) 2465 dvc_var.adv_dvc_var)
2468#define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev) 2466#define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
2469 2467
2470/* Number of boards detected in system. */
2471static int asc_board_count;
2472
2473/* Overrun buffer used by all narrow boards. */ 2468/* Overrun buffer used by all narrow boards. */
2474static uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 }; 2469static uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
2475 2470
@@ -2848,9 +2843,8 @@ static const char *advansys_info(struct Scsi_Host *shost)
2848 } 2843 }
2849 } else { 2844 } else {
2850 busname = "?"; 2845 busname = "?";
2851 ASC_PRINT2("advansys_info: board %d: unknown " 2846 shost_printk(KERN_ERR, shost, "unknown bus "
2852 "bus type %d\n", boardp->id, 2847 "type %d\n", asc_dvc_varp->bus_type);
2853 asc_dvc_varp->bus_type);
2854 } 2848 }
2855 sprintf(info, 2849 sprintf(info,
2856 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X", 2850 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
@@ -4382,7 +4376,6 @@ static void AscSetBank(PortAddr iop_base, uchar bank)
4382 val &= ~CC_BANK_ONE; 4376 val &= ~CC_BANK_ONE;
4383 } 4377 }
4384 AscSetChipControl(iop_base, val); 4378 AscSetChipControl(iop_base, val);
4385 return;
4386} 4379}
4387 4380
4388static void AscSetChipIH(PortAddr iop_base, ushort ins_code) 4381static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
@@ -4390,7 +4383,6 @@ static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
4390 AscSetBank(iop_base, 1); 4383 AscSetBank(iop_base, 1);
4391 AscWriteChipIH(iop_base, ins_code); 4384 AscWriteChipIH(iop_base, ins_code);
4392 AscSetBank(iop_base, 0); 4385 AscSetBank(iop_base, 0);
4393 return;
4394} 4386}
4395 4387
4396static int AscStartChip(PortAddr iop_base) 4388static int AscStartChip(PortAddr iop_base)
@@ -4475,7 +4467,6 @@ static void AscEnableInterrupt(PortAddr iop_base)
4475 4467
4476 cfg = AscGetChipCfgLsw(iop_base); 4468 cfg = AscGetChipCfgLsw(iop_base);
4477 AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON); 4469 AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
4478 return;
4479} 4470}
4480 4471
4481static void AscDisableInterrupt(PortAddr iop_base) 4472static void AscDisableInterrupt(PortAddr iop_base)
@@ -4484,7 +4475,6 @@ static void AscDisableInterrupt(PortAddr iop_base)
4484 4475
4485 cfg = AscGetChipCfgLsw(iop_base); 4476 cfg = AscGetChipCfgLsw(iop_base);
4486 AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON)); 4477 AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
4487 return;
4488} 4478}
4489 4479
4490static uchar AscReadLramByte(PortAddr iop_base, ushort addr) 4480static uchar AscReadLramByte(PortAddr iop_base, ushort addr)
@@ -4542,7 +4532,6 @@ static void AscWriteLramWord(PortAddr iop_base, ushort addr, ushort word_val)
4542{ 4532{
4543 AscSetChipLramAddr(iop_base, addr); 4533 AscSetChipLramAddr(iop_base, addr);
4544 AscSetChipLramData(iop_base, word_val); 4534 AscSetChipLramData(iop_base, word_val);
4545 return;
4546} 4535}
4547 4536
4548static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val) 4537static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
@@ -4560,7 +4549,6 @@ static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
4560 word_data |= ((ushort)byte_val & 0x00FF); 4549 word_data |= ((ushort)byte_val & 0x00FF);
4561 } 4550 }
4562 AscWriteLramWord(iop_base, addr, word_data); 4551 AscWriteLramWord(iop_base, addr, word_data);
4563 return;
4564} 4552}
4565 4553
4566/* 4554/*
@@ -4588,7 +4576,6 @@ AscMemWordCopyPtrToLram(PortAddr iop_base,
4588 outpw(iop_base + IOP_RAM_DATA, 4576 outpw(iop_base + IOP_RAM_DATA,
4589 ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]); 4577 ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
4590 } 4578 }
4591 return;
4592} 4579}
4593 4580
4594/* 4581/*
@@ -4608,7 +4595,6 @@ AscMemDWordCopyPtrToLram(PortAddr iop_base,
4608 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]); /* LSW */ 4595 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]); /* LSW */
4609 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]); /* MSW */ 4596 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]); /* MSW */
4610 } 4597 }
4611 return;
4612} 4598}
4613 4599
4614/* 4600/*
@@ -4630,7 +4616,6 @@ AscMemWordCopyPtrFromLram(PortAddr iop_base,
4630 d_buffer[i] = word & 0xff; 4616 d_buffer[i] = word & 0xff;
4631 d_buffer[i + 1] = (word >> 8) & 0xff; 4617 d_buffer[i + 1] = (word >> 8) & 0xff;
4632 } 4618 }
4633 return;
4634} 4619}
4635 4620
4636static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words) 4621static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words)
@@ -8397,8 +8382,6 @@ static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
8397 boardp->adv_reqp = reqp; 8382 boardp->adv_reqp = reqp;
8398 8383
8399 ASC_DBG(1, "done\n"); 8384 ASC_DBG(1, "done\n");
8400
8401 return;
8402} 8385}
8403 8386
8404/* 8387/*
@@ -8569,7 +8552,6 @@ static void AscAckInterrupt(PortAddr iop_base)
8569 } 8552 }
8570 } 8553 }
8571 AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag); 8554 AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
8572 return;
8573} 8555}
8574 8556
8575static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time) 8557static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
@@ -9325,8 +9307,6 @@ static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
9325 } 9307 }
9326 9308
9327 asc_scsi_done(scp); 9309 asc_scsi_done(scp);
9328
9329 return;
9330} 9310}
9331 9311
9332static int AscIsrQDone(ASC_DVC_VAR *asc_dvc) 9312static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
@@ -10055,9 +10035,9 @@ static int asc_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
10055 scp->sc_data_direction); 10035 scp->sc_data_direction);
10056 10036
10057 if (use_sg > scp->device->host->sg_tablesize) { 10037 if (use_sg > scp->device->host->sg_tablesize) {
10058 ASC_PRINT3("asc_build_req: board %d: use_sg %d > " 10038 scmd_printk(KERN_ERR, scp, "use_sg %d > "
10059 "sg_tablesize %d\n", boardp->id, use_sg, 10039 "sg_tablesize %d\n", use_sg,
10060 scp->device->host->sg_tablesize); 10040 scp->device->host->sg_tablesize);
10061 dma_unmap_sg(boardp->dev, slp, scp->use_sg, 10041 dma_unmap_sg(boardp->dev, slp, scp->use_sg,
10062 scp->sc_data_direction); 10042 scp->sc_data_direction);
10063 scp->result = HOST_BYTE(DID_ERROR); 10043 scp->result = HOST_BYTE(DID_ERROR);
@@ -10332,8 +10312,8 @@ adv_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
10332 scp->sc_data_direction); 10312 scp->sc_data_direction);
10333 10313
10334 if (use_sg > ADV_MAX_SG_LIST) { 10314 if (use_sg > ADV_MAX_SG_LIST) {
10335 ASC_PRINT3("adv_build_req: board %d: use_sg %d > " 10315 scmd_printk(KERN_ERR, scp, "use_sg %d > "
10336 "ADV_MAX_SG_LIST %d\n", boardp->id, use_sg, 10316 "ADV_MAX_SG_LIST %d\n", use_sg,
10337 scp->device->host->sg_tablesize); 10317 scp->device->host->sg_tablesize);
10338 dma_unmap_sg(boardp->dev, slp, scp->use_sg, 10318 dma_unmap_sg(boardp->dev, slp, scp->use_sg,
10339 scp->sc_data_direction); 10319 scp->sc_data_direction);
@@ -11174,14 +11154,14 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
11174 ASC_STATS(scp->device->host, exe_busy); 11154 ASC_STATS(scp->device->host, exe_busy);
11175 break; 11155 break;
11176 case ASC_ERROR: 11156 case ASC_ERROR:
11177 ASC_PRINT2("asc_execute_scsi_cmnd: board %d: ExeScsiQueue() " 11157 scmd_printk(KERN_ERR, scp, "ExeScsiQueue() ASC_ERROR, "
11178 "ASC_ERROR, err_code 0x%x\n", boardp->id, err_code); 11158 "err_code 0x%x\n", err_code);
11179 ASC_STATS(scp->device->host, exe_error); 11159 ASC_STATS(scp->device->host, exe_error);
11180 scp->result = HOST_BYTE(DID_ERROR); 11160 scp->result = HOST_BYTE(DID_ERROR);
11181 break; 11161 break;
11182 default: 11162 default:
11183 ASC_PRINT2("asc_execute_scsi_cmnd: board %d: ExeScsiQueue() " 11163 scmd_printk(KERN_ERR, scp, "ExeScsiQueue() unknown, "
11184 "unknown, err_code 0x%x\n", boardp->id, err_code); 11164 "err_code 0x%x\n", err_code);
11185 ASC_STATS(scp->device->host, exe_unknown); 11165 ASC_STATS(scp->device->host, exe_unknown);
11186 scp->result = HOST_BYTE(DID_ERROR); 11166 scp->result = HOST_BYTE(DID_ERROR);
11187 break; 11167 break;
@@ -11314,7 +11294,6 @@ static void __devinit AscEnableIsaDma(uchar dma_channel)
11314 outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4))); 11294 outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4)));
11315 outp(0x00D4, (ushort)(dma_channel - 4)); 11295 outp(0x00D4, (ushort)(dma_channel - 4));
11316 } 11296 }
11317 return;
11318} 11297}
11319#endif /* CONFIG_ISA */ 11298#endif /* CONFIG_ISA */
11320 11299
@@ -11613,7 +11592,6 @@ static int __devinit AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
11613static void __devinit AscWaitEEPWrite(void) 11592static void __devinit AscWaitEEPWrite(void)
11614{ 11593{
11615 mdelay(20); 11594 mdelay(20);
11616 return;
11617} 11595}
11618 11596
11619static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg) 11597static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
@@ -11936,9 +11914,10 @@ static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
11936 return (warn_code); 11914 return (warn_code);
11937} 11915}
11938 11916
11939static int __devinit AscInitGetConfig(struct asc_board *boardp) 11917static int __devinit AscInitGetConfig(struct Scsi_Host *shost)
11940{ 11918{
11941 ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var; 11919 struct asc_board *board = shost_priv(shost);
11920 ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
11942 unsigned short warn_code = 0; 11921 unsigned short warn_code = 0;
11943 11922
11944 asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG; 11923 asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
@@ -11959,43 +11938,40 @@ static int __devinit AscInitGetConfig(struct asc_board *boardp)
11959 case 0: /* No error */ 11938 case 0: /* No error */
11960 break; 11939 break;
11961 case ASC_WARN_IO_PORT_ROTATE: 11940 case ASC_WARN_IO_PORT_ROTATE:
11962 ASC_PRINT1("AscInitGetConfig: board %d: I/O port address " 11941 shost_printk(KERN_WARNING, shost, "I/O port address "
11963 "modified\n", boardp->id); 11942 "modified\n");
11964 break; 11943 break;
11965 case ASC_WARN_AUTO_CONFIG: 11944 case ASC_WARN_AUTO_CONFIG:
11966 ASC_PRINT1("AscInitGetConfig: board %d: I/O port increment " 11945 shost_printk(KERN_WARNING, shost, "I/O port increment switch "
11967 "switch enabled\n", boardp->id); 11946 "enabled\n");
11968 break; 11947 break;
11969 case ASC_WARN_EEPROM_CHKSUM: 11948 case ASC_WARN_EEPROM_CHKSUM:
11970 ASC_PRINT1("AscInitGetConfig: board %d: EEPROM checksum " 11949 shost_printk(KERN_WARNING, shost, "EEPROM checksum error\n");
11971 "error\n", boardp->id);
11972 break; 11950 break;
11973 case ASC_WARN_IRQ_MODIFIED: 11951 case ASC_WARN_IRQ_MODIFIED:
11974 ASC_PRINT1("AscInitGetConfig: board %d: IRQ modified\n", 11952 shost_printk(KERN_WARNING, shost, "IRQ modified\n");
11975 boardp->id);
11976 break; 11953 break;
11977 case ASC_WARN_CMD_QNG_CONFLICT: 11954 case ASC_WARN_CMD_QNG_CONFLICT:
11978 ASC_PRINT1("AscInitGetConfig: board %d: tag queuing enabled " 11955 shost_printk(KERN_WARNING, shost, "tag queuing enabled w/o "
11979 "w/o disconnects\n", boardp->id); 11956 "disconnects\n");
11980 break; 11957 break;
11981 default: 11958 default:
11982 ASC_PRINT2("AscInitGetConfig: board %d: unknown warning: " 11959 shost_printk(KERN_WARNING, shost, "unknown warning: 0x%x\n",
11983 "0x%x\n", boardp->id, warn_code); 11960 warn_code);
11984 break; 11961 break;
11985 } 11962 }
11986 11963
11987 if (asc_dvc->err_code != 0) { 11964 if (asc_dvc->err_code != 0)
11988 ASC_PRINT3("AscInitGetConfig: board %d error: init_state 0x%x, " 11965 shost_printk(KERN_ERR, shost, "error 0x%x at init_state "
11989 "err_code 0x%x\n", boardp->id, asc_dvc->init_state, 11966 "0x%x\n", asc_dvc->err_code, asc_dvc->init_state);
11990 asc_dvc->err_code);
11991 }
11992 11967
11993 return asc_dvc->err_code; 11968 return asc_dvc->err_code;
11994} 11969}
11995 11970
11996static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct asc_board *boardp) 11971static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
11997{ 11972{
11998 ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var; 11973 struct asc_board *board = shost_priv(shost);
11974 ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
11999 PortAddr iop_base = asc_dvc->iop_base; 11975 PortAddr iop_base = asc_dvc->iop_base;
12000 unsigned short cfg_msw; 11976 unsigned short cfg_msw;
12001 unsigned short warn_code = 0; 11977 unsigned short warn_code = 0;
@@ -12060,37 +12036,32 @@ static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct asc_board *bo
12060 case 0: /* No error. */ 12036 case 0: /* No error. */
12061 break; 12037 break;
12062 case ASC_WARN_IO_PORT_ROTATE: 12038 case ASC_WARN_IO_PORT_ROTATE:
12063 ASC_PRINT1("AscInitSetConfig: board %d: I/O port address " 12039 shost_printk(KERN_WARNING, shost, "I/O port address "
12064 "modified\n", boardp->id); 12040 "modified\n");
12065 break; 12041 break;
12066 case ASC_WARN_AUTO_CONFIG: 12042 case ASC_WARN_AUTO_CONFIG:
12067 ASC_PRINT1("AscInitSetConfig: board %d: I/O port increment " 12043 shost_printk(KERN_WARNING, shost, "I/O port increment switch "
12068 "switch enabled\n", boardp->id); 12044 "enabled\n");
12069 break; 12045 break;
12070 case ASC_WARN_EEPROM_CHKSUM: 12046 case ASC_WARN_EEPROM_CHKSUM:
12071 ASC_PRINT1("AscInitSetConfig: board %d: EEPROM checksum " 12047 shost_printk(KERN_WARNING, shost, "EEPROM checksum error\n");
12072 "error\n", boardp->id);
12073 break; 12048 break;
12074 case ASC_WARN_IRQ_MODIFIED: 12049 case ASC_WARN_IRQ_MODIFIED:
12075 ASC_PRINT1("AscInitSetConfig: board %d: IRQ modified\n", 12050 shost_printk(KERN_WARNING, shost, "IRQ modified\n");
12076 boardp->id);
12077 break; 12051 break;
12078 case ASC_WARN_CMD_QNG_CONFLICT: 12052 case ASC_WARN_CMD_QNG_CONFLICT:
12079 ASC_PRINT1("AscInitSetConfig: board %d: tag queuing w/o " 12053 shost_printk(KERN_WARNING, shost, "tag queuing w/o "
12080 "disconnects\n", 12054 "disconnects\n");
12081 boardp->id);
12082 break; 12055 break;
12083 default: 12056 default:
12084 ASC_PRINT2("AscInitSetConfig: board %d: unknown warning: " 12057 shost_printk(KERN_WARNING, shost, "unknown warning: 0x%x\n",
12085 "0x%x\n", boardp->id, warn_code); 12058 warn_code);
12086 break; 12059 break;
12087 } 12060 }
12088 12061
12089 if (asc_dvc->err_code != 0) { 12062 if (asc_dvc->err_code != 0)
12090 ASC_PRINT3("AscInitSetConfig: board %d error: init_state 0x%x, " 12063 shost_printk(KERN_ERR, shost, "error 0x%x at init_state "
12091 "err_code 0x%x\n", boardp->id, asc_dvc->init_state, 12064 "0x%x\n", asc_dvc->err_code, asc_dvc->init_state);
12092 asc_dvc->err_code);
12093 }
12094 12065
12095 return asc_dvc->err_code; 12066 return asc_dvc->err_code;
12096} 12067}
@@ -13390,9 +13361,10 @@ static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
13390 * then 0 is returned. 13361 * then 0 is returned.
13391 */ 13362 */
13392static int __devinit 13363static int __devinit
13393AdvInitGetConfig(struct pci_dev *pdev, struct asc_board *boardp) 13364AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
13394{ 13365{
13395 ADV_DVC_VAR *asc_dvc = &boardp->dvc_var.adv_dvc_var; 13366 struct asc_board *board = shost_priv(shost);
13367 ADV_DVC_VAR *asc_dvc = &board->dvc_var.adv_dvc_var;
13396 unsigned short warn_code = 0; 13368 unsigned short warn_code = 0;
13397 AdvPortAddr iop_base = asc_dvc->iop_base; 13369 AdvPortAddr iop_base = asc_dvc->iop_base;
13398 u16 cmd; 13370 u16 cmd;
@@ -13458,15 +13430,12 @@ AdvInitGetConfig(struct pci_dev *pdev, struct asc_board *boardp)
13458 warn_code |= status; 13430 warn_code |= status;
13459 } 13431 }
13460 13432
13461 if (warn_code != 0) { 13433 if (warn_code != 0)
13462 ASC_PRINT2("AdvInitGetConfig: board %d: warning: 0x%x\n", 13434 shost_printk(KERN_WARNING, shost, "warning: 0x%x\n", warn_code);
13463 boardp->id, warn_code);
13464 }
13465 13435
13466 if (asc_dvc->err_code) { 13436 if (asc_dvc->err_code)
13467 ASC_PRINT2("AdvInitGetConfig: board %d error: err_code 0x%x\n", 13437 shost_printk(KERN_ERR, shost, "error code 0x%x\n",
13468 boardp->id, asc_dvc->err_code); 13438 asc_dvc->err_code);
13469 }
13470 13439
13471 return asc_dvc->err_code; 13440 return asc_dvc->err_code;
13472} 13441}
@@ -13499,9 +13468,10 @@ static struct scsi_host_template advansys_template = {
13499 .use_clustering = ENABLE_CLUSTERING, 13468 .use_clustering = ENABLE_CLUSTERING,
13500}; 13469};
13501 13470
13502static int __devinit 13471static int __devinit advansys_wide_init_chip(struct Scsi_Host *shost)
13503advansys_wide_init_chip(struct asc_board *boardp, ADV_DVC_VAR *adv_dvc_varp)
13504{ 13472{
13473 struct asc_board *board = shost_priv(shost);
13474 struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var;
13505 int req_cnt = 0; 13475 int req_cnt = 0;
13506 adv_req_t *reqp = NULL; 13476 adv_req_t *reqp = NULL;
13507 int sg_cnt = 0; 13477 int sg_cnt = 0;
@@ -13512,10 +13482,10 @@ advansys_wide_init_chip(struct asc_board *boardp, ADV_DVC_VAR *adv_dvc_varp)
13512 * Allocate buffer carrier structures. The total size 13482 * Allocate buffer carrier structures. The total size
13513 * is about 4 KB, so allocate all at once. 13483 * is about 4 KB, so allocate all at once.
13514 */ 13484 */
13515 boardp->carrp = kmalloc(ADV_CARRIER_BUFSIZE, GFP_KERNEL); 13485 board->carrp = kmalloc(ADV_CARRIER_BUFSIZE, GFP_KERNEL);
13516 ASC_DBG(1, "carrp 0x%p\n", boardp->carrp); 13486 ASC_DBG(1, "carrp 0x%p\n", board->carrp);
13517 13487
13518 if (!boardp->carrp) 13488 if (!board->carrp)
13519 goto kmalloc_failed; 13489 goto kmalloc_failed;
13520 13490
13521 /* 13491 /*
@@ -13523,7 +13493,7 @@ advansys_wide_init_chip(struct asc_board *boardp, ADV_DVC_VAR *adv_dvc_varp)
13523 * board. The total size is about 16 KB, so allocate all at once. 13493 * board. The total size is about 16 KB, so allocate all at once.
13524 * If the allocation fails decrement and try again. 13494 * If the allocation fails decrement and try again.
13525 */ 13495 */
13526 for (req_cnt = adv_dvc_varp->max_host_qng; req_cnt > 0; req_cnt--) { 13496 for (req_cnt = adv_dvc->max_host_qng; req_cnt > 0; req_cnt--) {
13527 reqp = kmalloc(sizeof(adv_req_t) * req_cnt, GFP_KERNEL); 13497 reqp = kmalloc(sizeof(adv_req_t) * req_cnt, GFP_KERNEL);
13528 13498
13529 ASC_DBG(1, "reqp 0x%p, req_cnt %d, bytes %lu\n", reqp, req_cnt, 13499 ASC_DBG(1, "reqp 0x%p, req_cnt %d, bytes %lu\n", reqp, req_cnt,
@@ -13536,31 +13506,31 @@ advansys_wide_init_chip(struct asc_board *boardp, ADV_DVC_VAR *adv_dvc_varp)
13536 if (!reqp) 13506 if (!reqp)
13537 goto kmalloc_failed; 13507 goto kmalloc_failed;
13538 13508
13539 boardp->orig_reqp = reqp; 13509 board->orig_reqp = reqp;
13540 13510
13541 /* 13511 /*
13542 * Allocate up to ADV_TOT_SG_BLOCK request structures for 13512 * Allocate up to ADV_TOT_SG_BLOCK request structures for
13543 * the Wide board. Each structure is about 136 bytes. 13513 * the Wide board. Each structure is about 136 bytes.
13544 */ 13514 */
13545 boardp->adv_sgblkp = NULL; 13515 board->adv_sgblkp = NULL;
13546 for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) { 13516 for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
13547 sgp = kmalloc(sizeof(adv_sgblk_t), GFP_KERNEL); 13517 sgp = kmalloc(sizeof(adv_sgblk_t), GFP_KERNEL);
13548 13518
13549 if (!sgp) 13519 if (!sgp)
13550 break; 13520 break;
13551 13521
13552 sgp->next_sgblkp = boardp->adv_sgblkp; 13522 sgp->next_sgblkp = board->adv_sgblkp;
13553 boardp->adv_sgblkp = sgp; 13523 board->adv_sgblkp = sgp;
13554 13524
13555 } 13525 }
13556 13526
13557 ASC_DBG(1, "sg_cnt %d * %u = %u bytes\n", sg_cnt, sizeof(adv_sgblk_t), 13527 ASC_DBG(1, "sg_cnt %d * %u = %u bytes\n", sg_cnt, sizeof(adv_sgblk_t),
13558 (unsigned)(sizeof(adv_sgblk_t) * sg_cnt)); 13528 (unsigned)(sizeof(adv_sgblk_t) * sg_cnt));
13559 13529
13560 if (!boardp->adv_sgblkp) 13530 if (!board->adv_sgblkp)
13561 goto kmalloc_failed; 13531 goto kmalloc_failed;
13562 13532
13563 adv_dvc_varp->carrier_buf = boardp->carrp; 13533 adv_dvc->carrier_buf = board->carrp;
13564 13534
13565 /* 13535 /*
13566 * Point 'adv_reqp' to the request structures and 13536 * Point 'adv_reqp' to the request structures and
@@ -13571,30 +13541,29 @@ advansys_wide_init_chip(struct asc_board *boardp, ADV_DVC_VAR *adv_dvc_varp)
13571 for (; req_cnt > 0; req_cnt--) { 13541 for (; req_cnt > 0; req_cnt--) {
13572 reqp[req_cnt - 1].next_reqp = &reqp[req_cnt]; 13542 reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
13573 } 13543 }
13574 boardp->adv_reqp = &reqp[0]; 13544 board->adv_reqp = &reqp[0];
13575 13545
13576 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 13546 if (adv_dvc->chip_type == ADV_CHIP_ASC3550) {
13577 ASC_DBG(2, "AdvInitAsc3550Driver()\n"); 13547 ASC_DBG(2, "AdvInitAsc3550Driver()\n");
13578 warn_code = AdvInitAsc3550Driver(adv_dvc_varp); 13548 warn_code = AdvInitAsc3550Driver(adv_dvc);
13579 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { 13549 } else if (adv_dvc->chip_type == ADV_CHIP_ASC38C0800) {
13580 ASC_DBG(2, "AdvInitAsc38C0800Driver()\n"); 13550 ASC_DBG(2, "AdvInitAsc38C0800Driver()\n");
13581 warn_code = AdvInitAsc38C0800Driver(adv_dvc_varp); 13551 warn_code = AdvInitAsc38C0800Driver(adv_dvc);
13582 } else { 13552 } else {
13583 ASC_DBG(2, "AdvInitAsc38C1600Driver()\n"); 13553 ASC_DBG(2, "AdvInitAsc38C1600Driver()\n");
13584 warn_code = AdvInitAsc38C1600Driver(adv_dvc_varp); 13554 warn_code = AdvInitAsc38C1600Driver(adv_dvc);
13585 } 13555 }
13586 err_code = adv_dvc_varp->err_code; 13556 err_code = adv_dvc->err_code;
13587 13557
13588 if (warn_code || err_code) { 13558 if (warn_code || err_code) {
13589 ASC_PRINT3("advansys_wide_init_chip: board %d error: warn 0x%x," 13559 shost_printk(KERN_WARNING, shost, "error: warn 0x%x, error "
13590 " error 0x%x\n", boardp->id, warn_code, err_code); 13560 "0x%x\n", warn_code, err_code);
13591 } 13561 }
13592 13562
13593 goto exit; 13563 goto exit;
13594 13564
13595 kmalloc_failed: 13565 kmalloc_failed:
13596 ASC_PRINT1("advansys_wide_init_chip: board %d error: kmalloc() " 13566 shost_printk(KERN_ERR, shost, "error: kmalloc() failed\n");
13597 "failed\n", boardp->id);
13598 err_code = ADV_ERROR; 13567 err_code = ADV_ERROR;
13599 exit: 13568 exit:
13600 return err_code; 13569 return err_code;
@@ -13622,7 +13591,6 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13622 ADV_DVC_VAR *adv_dvc_varp = NULL; 13591 ADV_DVC_VAR *adv_dvc_varp = NULL;
13623 int share_irq, warn_code, ret; 13592 int share_irq, warn_code, ret;
13624 13593
13625 boardp->id = asc_board_count++;
13626 pdev = (bus_type == ASC_IS_PCI) ? to_pci_dev(boardp->dev) : NULL; 13594 pdev = (bus_type == ASC_IS_PCI) ? to_pci_dev(boardp->dev) : NULL;
13627 13595
13628 if (ASC_NARROW_BOARD(boardp)) { 13596 if (ASC_NARROW_BOARD(boardp)) {
@@ -13653,10 +13621,10 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13653 boardp->ioremap_addr = ioremap(pci_resource_start(pdev, 1), 13621 boardp->ioremap_addr = ioremap(pci_resource_start(pdev, 1),
13654 boardp->asc_n_io_port); 13622 boardp->asc_n_io_port);
13655 if (!boardp->ioremap_addr) { 13623 if (!boardp->ioremap_addr) {
13656 ASC_PRINT3 13624 shost_printk(KERN_ERR, shost, "ioremap(%x, %d) "
13657 ("advansys_board_found: board %d: ioremap(%x, %d) returned NULL\n", 13625 "returned NULL\n",
13658 boardp->id, pci_resource_start(pdev, 1), 13626 pci_resource_start(pdev, 1),
13659 boardp->asc_n_io_port); 13627 boardp->asc_n_io_port);
13660 ret = -ENODEV; 13628 ret = -ENODEV;
13661 goto err_shost; 13629 goto err_shost;
13662 } 13630 }
@@ -13682,8 +13650,8 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13682 */ 13650 */
13683 boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL); 13651 boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL);
13684 if (!boardp->prtbuf) { 13652 if (!boardp->prtbuf) {
13685 ASC_PRINT2("advansys_board_found: board %d: kmalloc(%d) " 13653 shost_printk(KERN_ERR, shost, "kmalloc(%d) returned NULL\n",
13686 "returned NULL\n", boardp->id, ASC_PRTBUF_SIZE); 13654 ASC_PRTBUF_SIZE);
13687 ret = -ENOMEM; 13655 ret = -ENOMEM;
13688 goto err_unmap; 13656 goto err_unmap;
13689 } 13657 }
@@ -13716,9 +13684,8 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13716 break; 13684 break;
13717#endif /* CONFIG_PCI */ 13685#endif /* CONFIG_PCI */
13718 default: 13686 default:
13719 ASC_PRINT2 13687 shost_printk(KERN_ERR, shost, "unknown adapter type: "
13720 ("advansys_board_found: board %d: unknown adapter type: %d\n", 13688 "%d\n", asc_dvc_varp->bus_type);
13721 boardp->id, asc_dvc_varp->bus_type);
13722 shost->unchecked_isa_dma = TRUE; 13689 shost->unchecked_isa_dma = TRUE;
13723 share_irq = 0; 13690 share_irq = 0;
13724 break; 13691 break;
@@ -13731,7 +13698,7 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13731 * referenced only use the bit-wise AND operator "&". 13698 * referenced only use the bit-wise AND operator "&".
13732 */ 13699 */
13733 ASC_DBG(2, "AscInitGetConfig()\n"); 13700 ASC_DBG(2, "AscInitGetConfig()\n");
13734 ret = AscInitGetConfig(boardp) ? -ENODEV : 0; 13701 ret = AscInitGetConfig(shost) ? -ENODEV : 0;
13735 } else { 13702 } else {
13736#ifdef CONFIG_PCI 13703#ifdef CONFIG_PCI
13737 /* 13704 /*
@@ -13742,7 +13709,7 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13742 share_irq = IRQF_SHARED; 13709 share_irq = IRQF_SHARED;
13743 ASC_DBG(2, "AdvInitGetConfig()\n"); 13710 ASC_DBG(2, "AdvInitGetConfig()\n");
13744 13711
13745 ret = AdvInitGetConfig(pdev, boardp) ? -ENODEV : 0; 13712 ret = AdvInitGetConfig(pdev, shost) ? -ENODEV : 0;
13746#endif /* CONFIG_PCI */ 13713#endif /* CONFIG_PCI */
13747 } 13714 }
13748 13715
@@ -13790,7 +13757,7 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
13790 * Modify board configuration. 13757 * Modify board configuration.
13791 */ 13758 */
13792 ASC_DBG(2, "AscInitSetConfig()\n"); 13759 ASC_DBG(2, "AscInitSetConfig()\n");
13793 ret = AscInitSetConfig(pdev, boardp) ? -ENODEV : 0; 13760 ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0;
13794 if (ret) 13761 if (ret)
13795 goto err_free_proc; 13762 goto err_free_proc;
13796 } else { 13763 } else {
@@ -14024,9 +13991,9 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
14024 shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel; 13991 shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
14025 ret = request_dma(shost->dma_channel, DRV_NAME); 13992 ret = request_dma(shost->dma_channel, DRV_NAME);
14026 if (ret) { 13993 if (ret) {
14027 ASC_PRINT3 13994 shost_printk(KERN_ERR, shost, "request_dma() "
14028 ("advansys_board_found: board %d: request_dma() %d failed %d\n", 13995 "%d failed %d\n",
14029 boardp->id, shost->dma_channel, ret); 13996 shost->dma_channel, ret);
14030 goto err_free_proc; 13997 goto err_free_proc;
14031 } 13998 }
14032 AscEnableIsaDma(shost->dma_channel); 13999 AscEnableIsaDma(shost->dma_channel);
@@ -14042,17 +14009,14 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
14042 14009
14043 if (ret) { 14010 if (ret) {
14044 if (ret == -EBUSY) { 14011 if (ret == -EBUSY) {
14045 ASC_PRINT2 14012 shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
14046 ("advansys_board_found: board %d: request_irq(): IRQ 0x%x already in use.\n", 14013 "already in use\n", boardp->irq);
14047 boardp->id, boardp->irq);
14048 } else if (ret == -EINVAL) { 14014 } else if (ret == -EINVAL) {
14049 ASC_PRINT2 14015 shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
14050 ("advansys_board_found: board %d: request_irq(): IRQ 0x%x not valid.\n", 14016 "not valid\n", boardp->irq);
14051 boardp->id, boardp->irq);
14052 } else { 14017 } else {
14053 ASC_PRINT3 14018 shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
14054 ("advansys_board_found: board %d: request_irq(): IRQ 0x%x failed with %d\n", 14019 "failed with %d\n", boardp->irq, ret);
14055 boardp->id, boardp->irq, ret);
14056 } 14020 }
14057 goto err_free_dma; 14021 goto err_free_dma;
14058 } 14022 }
@@ -14065,15 +14029,15 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
14065 warn_code = AscInitAsc1000Driver(asc_dvc_varp); 14029 warn_code = AscInitAsc1000Driver(asc_dvc_varp);
14066 14030
14067 if (warn_code || asc_dvc_varp->err_code) { 14031 if (warn_code || asc_dvc_varp->err_code) {
14068 ASC_PRINT4("advansys_board_found: board %d error: " 14032 shost_printk(KERN_ERR, shost, "error: init_state 0x%x, "
14069 "init_state 0x%x, warn 0x%x, error 0x%x\n", 14033 "warn 0x%x, error 0x%x\n",
14070 boardp->id, asc_dvc_varp->init_state, 14034 asc_dvc_varp->init_state, warn_code,
14071 warn_code, asc_dvc_varp->err_code); 14035 asc_dvc_varp->err_code);
14072 if (asc_dvc_varp->err_code) 14036 if (asc_dvc_varp->err_code)
14073 ret = -ENODEV; 14037 ret = -ENODEV;
14074 } 14038 }
14075 } else { 14039 } else {
14076 if (advansys_wide_init_chip(boardp, adv_dvc_varp)) 14040 if (advansys_wide_init_chip(shost))
14077 ret = -ENODEV; 14041 ret = -ENODEV;
14078 } 14042 }
14079 14043