|
@@ -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)
|
|
} 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
|
|
|
|
-AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc)
|
|
|
|
|
|
+static int __devinit AscInitSetConfig(struct pci_dev *pdev, asc_board_t *boardp)
|
|
{
|
|
{
|
|
|
|
+ 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)
|
|
#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)
|
|
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 =
|
|
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 =
|
|
* 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)
|
|
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)
|
|
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)
|
|
* 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)) {
|
|
|
|
- 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);
|
|
|
|
- }
|
|
|
|
|
|
+ err_code = AscInitGetConfig(boardp);
|
|
} 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);
|
|
|
|
- if (ret != 0) {
|
|
|
|
- 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);
|
|
|
|
- }
|
|
|
|
|
|
+ err_code = AdvInitGetConfig(pdev, boardp);
|
|
|
|
+#endif /* CONFIG_PCI */
|
|
}
|
|
}
|
|
|
|
|
|
if (err_code != 0)
|
|
if (err_code != 0)
|
|
@@ -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)) {
|
|
|
|
- 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, 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);
|
|
|
|
|
|
+ err_code = AscInitSetConfig(pdev, boardp);
|
|
|
|
+ if (err_code)
|
|
goto err_free_proc;
|
|
goto err_free_proc;
|
|
- }
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* Finish initializing the 'Scsi_Host' structure.
|
|
* Finish initializing the 'Scsi_Host' structure.
|