Commit c2dce2fa authored by Matthew Wilcox's avatar Matthew Wilcox Committed by James Bottomley

[SCSI] advansys: Shrink advansys_board_found a little more

Move the error reporting into AscInitGetConfig, AdvInitGetConfig and
AscInitSetConfig.
Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 629d688d
...@@ -9321,13 +9321,14 @@ static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base) ...@@ -9321,13 +9321,14 @@ static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base)
} }
#endif /* CONFIG_ISA */ #endif /* CONFIG_ISA */
static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc) static int __devinit AscInitGetConfig(asc_board_t *boardp)
{ {
ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
unsigned short warn_code = 0; unsigned short warn_code = 0;
asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG; asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
if (asc_dvc->err_code != 0) if (asc_dvc->err_code != 0)
return (UW_ERR); return asc_dvc->err_code;
if (AscFindSignature(asc_dvc->iop_base)) { if (AscFindSignature(asc_dvc->iop_base)) {
warn_code |= AscInitAscDvcVar(asc_dvc); warn_code |= AscInitAscDvcVar(asc_dvc);
...@@ -9338,27 +9339,63 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc) ...@@ -9338,27 +9339,63 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc)
} else { } else {
asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
} }
return warn_code;
switch (warn_code) {
case 0: /* No error */
break;
case ASC_WARN_IO_PORT_ROTATE:
ASC_PRINT1("AscInitGetConfig: board %d: I/O port address "
"modified\n", boardp->id);
break;
case ASC_WARN_AUTO_CONFIG:
ASC_PRINT1("AscInitGetConfig: board %d: I/O port increment "
"switch enabled\n", boardp->id);
break;
case ASC_WARN_EEPROM_CHKSUM:
ASC_PRINT1("AscInitGetConfig: board %d: EEPROM checksum "
"error\n", boardp->id);
break;
case ASC_WARN_IRQ_MODIFIED:
ASC_PRINT1("AscInitGetConfig: board %d: IRQ modified\n",
boardp->id);
break;
case ASC_WARN_CMD_QNG_CONFLICT:
ASC_PRINT1("AscInitGetConfig: board %d: tag queuing enabled "
"w/o disconnects\n", boardp->id);
break;
default:
ASC_PRINT2("AscInitGetConfig: board %d: unknown warning: "
"0x%x\n", boardp->id, warn_code);
break;
}
if (asc_dvc->err_code != 0) {
ASC_PRINT3("AscInitGetConfig: board %d error: init_state 0x%x, "
"err_code 0x%x\n", boardp->id, asc_dvc->init_state,
asc_dvc->err_code);
}
return asc_dvc->err_code;
} }
static unsigned short __devinit static int __devinit AscInitSetConfig(struct pci_dev *pdev, asc_board_t *boardp)
AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc)
{ {
ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
PortAddr iop_base = asc_dvc->iop_base; PortAddr iop_base = asc_dvc->iop_base;
unsigned short cfg_msw; unsigned short cfg_msw;
unsigned short warn_code = 0; unsigned short warn_code = 0;
asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG; asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
if (asc_dvc->err_code != 0) if (asc_dvc->err_code != 0)
return UW_ERR; return asc_dvc->err_code;
if (!AscFindSignature(asc_dvc->iop_base)) { if (!AscFindSignature(asc_dvc->iop_base)) {
asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
return 0; return asc_dvc->err_code;
} }
cfg_msw = AscGetChipCfgMsw(iop_base); cfg_msw = AscGetChipCfgMsw(iop_base);
if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK)); cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
warn_code |= ASC_WARN_CFG_MSW_RECOVER; warn_code |= ASC_WARN_CFG_MSW_RECOVER;
AscSetChipCfgMsw(iop_base, cfg_msw); AscSetChipCfgMsw(iop_base, cfg_msw);
} }
...@@ -9409,7 +9446,44 @@ AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc) ...@@ -9409,7 +9446,44 @@ AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc)
#endif /* CONFIG_ISA */ #endif /* CONFIG_ISA */
asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG; asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
return warn_code;
switch (warn_code) {
case 0: /* No error. */
break;
case ASC_WARN_IO_PORT_ROTATE:
ASC_PRINT1("AscInitSetConfig: board %d: I/O port address "
"modified\n", boardp->id);
break;
case ASC_WARN_AUTO_CONFIG:
ASC_PRINT1("AscInitSetConfig: board %d: I/O port increment "
"switch enabled\n", boardp->id);
break;
case ASC_WARN_EEPROM_CHKSUM:
ASC_PRINT1("AscInitSetConfig: board %d: EEPROM checksum "
"error\n", boardp->id);
break;
case ASC_WARN_IRQ_MODIFIED:
ASC_PRINT1("AscInitSetConfig: board %d: IRQ modified\n",
boardp->id);
break;
case ASC_WARN_CMD_QNG_CONFLICT:
ASC_PRINT1("AscInitSetConfig: board %d: tag queuing w/o "
"disconnects\n",
boardp->id);
break;
default:
ASC_PRINT2("AscInitSetConfig: board %d: unknown warning: "
"0x%x\n", boardp->id, warn_code);
break;
}
if (asc_dvc->err_code != 0) {
ASC_PRINT3("AscInitSetConfig: board %d error: init_state 0x%x, "
"err_code 0x%x\n", boardp->id, asc_dvc->init_state,
asc_dvc->err_code);
}
return asc_dvc->err_code;
} }
static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc) static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
...@@ -9596,7 +9670,7 @@ static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc) ...@@ -9596,7 +9670,7 @@ static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
cfg_msw = AscGetChipCfgMsw(iop_base); cfg_msw = AscGetChipCfgMsw(iop_base);
cfg_lsw = AscGetChipCfgLsw(iop_base); cfg_lsw = AscGetChipCfgLsw(iop_base);
if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK)); cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
warn_code |= ASC_WARN_CFG_MSW_RECOVER; warn_code |= ASC_WARN_CFG_MSW_RECOVER;
AscSetChipCfgMsw(iop_base, cfg_msw); AscSetChipCfgMsw(iop_base, cfg_msw);
} }
...@@ -12009,6 +12083,7 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = ...@@ -12009,6 +12083,7 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata =
0 /* 63 reserved */ 0 /* 63 reserved */
}; };
#ifdef CONFIG_PCI
/* /*
* Initialize the ADV_DVC_VAR structure. * Initialize the ADV_DVC_VAR structure.
* *
...@@ -12018,8 +12093,9 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = ...@@ -12018,8 +12093,9 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata =
* then 0 is returned. * then 0 is returned.
*/ */
static int __devinit static int __devinit
AdvInitGetConfig(struct pci_dev *pdev, ADV_DVC_VAR *asc_dvc) AdvInitGetConfig(struct pci_dev *pdev, asc_board_t *boardp)
{ {
ADV_DVC_VAR *asc_dvc = &boardp->dvc_var.adv_dvc_var;
unsigned short warn_code = 0; unsigned short warn_code = 0;
AdvPortAddr iop_base = asc_dvc->iop_base; AdvPortAddr iop_base = asc_dvc->iop_base;
u16 cmd; u16 cmd;
...@@ -12087,8 +12163,19 @@ AdvInitGetConfig(struct pci_dev *pdev, ADV_DVC_VAR *asc_dvc) ...@@ -12087,8 +12163,19 @@ AdvInitGetConfig(struct pci_dev *pdev, ADV_DVC_VAR *asc_dvc)
warn_code |= status; warn_code |= status;
} }
return warn_code; if (warn_code != 0) {
ASC_PRINT2("AdvInitGetConfig: board %d: warning: 0x%x\n",
boardp->id, warn_code);
}
if (asc_dvc->err_code) {
ASC_PRINT2("AdvInitGetConfig: board %d error: err_code 0x%x\n",
boardp->id, asc_dvc->err_code);
}
return asc_dvc->err_code;
} }
#endif
static void AdvBuildCarrierFreelist(struct adv_dvc_var *asc_dvc) static void AdvBuildCarrierFreelist(struct adv_dvc_var *asc_dvc)
{ {
...@@ -15316,22 +15403,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -15316,22 +15403,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
share_irq = 0; share_irq = 0;
break; break;
} }
} else {
/*
* For Wide boards set PCI information before calling
* AdvInitGetConfig().
*/
#ifdef CONFIG_PCI
shost->irq = adv_dvc_varp->irq_no = pdev->irq;
shost->unchecked_isa_dma = FALSE;
share_irq = IRQF_SHARED;
#endif /* CONFIG_PCI */
}
/*
* Read the board configuration.
*/
if (ASC_NARROW_BOARD(boardp)) {
/* /*
* NOTE: AscInitGetConfig() may change the board's * NOTE: AscInitGetConfig() may change the board's
* bus_type value. The bus_type value should no * bus_type value. The bus_type value should no
...@@ -15339,60 +15411,20 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -15339,60 +15411,20 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
* referenced only use the bit-wise AND operator "&". * referenced only use the bit-wise AND operator "&".
*/ */
ASC_DBG(2, "advansys_board_found: AscInitGetConfig()\n"); ASC_DBG(2, "advansys_board_found: AscInitGetConfig()\n");
switch (ret = AscInitGetConfig(asc_dvc_varp)) { err_code = AscInitGetConfig(boardp);
case 0: /* No error */
break;
case ASC_WARN_IO_PORT_ROTATE:
ASC_PRINT1
("AscInitGetConfig: board %d: I/O port address modified\n",
boardp->id);
break;
case ASC_WARN_AUTO_CONFIG:
ASC_PRINT1
("AscInitGetConfig: board %d: I/O port increment switch enabled\n",
boardp->id);
break;
case ASC_WARN_EEPROM_CHKSUM:
ASC_PRINT1
("AscInitGetConfig: board %d: EEPROM checksum error\n",
boardp->id);
break;
case ASC_WARN_IRQ_MODIFIED:
ASC_PRINT1
("AscInitGetConfig: board %d: IRQ modified\n",
boardp->id);
break;
case ASC_WARN_CMD_QNG_CONFLICT:
ASC_PRINT1
("AscInitGetConfig: board %d: tag queuing enabled w/o disconnects\n",
boardp->id);
break;
default:
ASC_PRINT2
("AscInitGetConfig: board %d: unknown warning: 0x%x\n",
boardp->id, ret);
break;
}
if ((err_code = asc_dvc_varp->err_code) != 0) {
ASC_PRINT3
("AscInitGetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
boardp->id,
asc_dvc_varp->init_state, asc_dvc_varp->err_code);
}
} else { } else {
#ifdef CONFIG_PCI
/*
* For Wide boards set PCI information before calling
* AdvInitGetConfig().
*/
shost->irq = adv_dvc_varp->irq_no = pdev->irq;
shost->unchecked_isa_dma = FALSE;
share_irq = IRQF_SHARED;
ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n"); ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n");
ret = AdvInitGetConfig(pdev, adv_dvc_varp); err_code = AdvInitGetConfig(pdev, boardp);
if (ret != 0) { #endif /* CONFIG_PCI */
ASC_PRINT2
("AdvInitGetConfig: board %d: warning: 0x%x\n",
boardp->id, ret);
}
if ((err_code = adv_dvc_varp->err_code) != 0) {
ASC_PRINT2
("AdvInitGetConfig: board %d error: err_code 0x%x\n",
boardp->id, adv_dvc_varp->err_code);
}
} }
if (err_code != 0) if (err_code != 0)
...@@ -15439,47 +15471,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -15439,47 +15471,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
* Modify board configuration. * Modify board configuration.
*/ */
ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n"); ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n");
switch (ret = AscInitSetConfig(pdev, asc_dvc_varp)) { err_code = AscInitSetConfig(pdev, boardp);
case 0: /* No error. */ if (err_code)
break;
case ASC_WARN_IO_PORT_ROTATE:
ASC_PRINT1
("AscInitSetConfig: board %d: I/O port address modified\n",
boardp->id);
break;
case ASC_WARN_AUTO_CONFIG:
ASC_PRINT1
("AscInitSetConfig: board %d: I/O port increment switch enabled\n",
boardp->id);
break;
case ASC_WARN_EEPROM_CHKSUM:
ASC_PRINT1
("AscInitSetConfig: board %d: EEPROM checksum error\n",
boardp->id);
break;
case ASC_WARN_IRQ_MODIFIED:
ASC_PRINT1
("AscInitSetConfig: board %d: IRQ modified\n",
boardp->id);
break;
case ASC_WARN_CMD_QNG_CONFLICT:
ASC_PRINT1
("AscInitSetConfig: board %d: tag queuing w/o disconnects\n",
boardp->id);
break;
default:
ASC_PRINT2
("AscInitSetConfig: board %d: unknown warning: 0x%x\n",
boardp->id, ret);
break;
}
if (asc_dvc_varp->err_code != 0) {
ASC_PRINT3
("AscInitSetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
boardp->id,
asc_dvc_varp->init_state, asc_dvc_varp->err_code);
goto err_free_proc; goto err_free_proc;
}
/* /*
* Finish initializing the 'Scsi_Host' structure. * Finish initializing the 'Scsi_Host' structure.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment