Lines Matching +full:db4 +full:- +full:db7
3 FlashPoint.c -- FlashPoint SCCB Manager for Linux
11 Copyright 1995-1996 by Mylex Corporation. All Rights Reserved
14 and a BSD-style copyright; see LICENSE.FlashPoint for details.
229 unsigned char niSysConf; /* Adapter Configuration byte -
231 unsigned char niScsiConf; /* SCSI Configuration byte -
233 unsigned char niScamConf; /* SCAM Configuration byte -
235 unsigned char niAdapId; /* Host Adapter ID -
276 #define TYPE_CODE0 0x63 /*Level2 Mstr (bits 7-6), */
278 #define SLV_TYPE_CODE0 0xA3 /*Priority Bit set (bits 7-6), */
437 #define XFER_HOST_DMA 0x00 /* 0 0 0 Transfer Host -> DMA */
438 #define XFER_DMA_HOST 0x01 /* 0 0 1 Transfer DMA -> Host */
733 #define NTCMD 0x02 /*Non- Tagged Command start */
920 ' ', 'B', 'T', '-', '9', '3', '0',
930 /*---------------------------------------------------------------------
936 *---------------------------------------------------------------------*/
947 ioport = pCardInfo->si_baseaddr; in FlashPoint_ProbeHostAdapter()
964 the bits(0-3) must be all ZERO for compatible with in FlashPoint_ProbeHostAdapter()
988 pCurrNvRam->niBaseAddr = ioport; in FlashPoint_ProbeHostAdapter()
1000 pCardInfo->si_id = pCurrNvRam->niAdapId; in FlashPoint_ProbeHostAdapter()
1002 pCardInfo->si_id = in FlashPoint_ProbeHostAdapter()
1008 pCardInfo->si_lun = 0x00; in FlashPoint_ProbeHostAdapter()
1009 pCardInfo->si_fw_revision = ORION_FW_REV; in FlashPoint_ProbeHostAdapter()
1019 temp = (unsigned short)pCurrNvRam->niSyncTbl[id]; in FlashPoint_ProbeHostAdapter()
1036 case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */ in FlashPoint_ProbeHostAdapter()
1038 case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */ in FlashPoint_ProbeHostAdapter()
1040 case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */ in FlashPoint_ProbeHostAdapter()
1055 pCardInfo->si_per_targ_init_sync = temp2; in FlashPoint_ProbeHostAdapter()
1056 pCardInfo->si_per_targ_no_disc = temp3; in FlashPoint_ProbeHostAdapter()
1057 pCardInfo->si_per_targ_wide_nego = temp4; in FlashPoint_ProbeHostAdapter()
1058 pCardInfo->si_per_targ_fast_nego = temp5; in FlashPoint_ProbeHostAdapter()
1059 pCardInfo->si_per_targ_ultra_nego = temp6; in FlashPoint_ProbeHostAdapter()
1062 i = pCurrNvRam->niSysConf; in FlashPoint_ProbeHostAdapter()
1068 ScamFlg = pCurrNvRam->niScamConf; in FlashPoint_ProbeHostAdapter()
1073 pCardInfo->si_flags = 0x0000; in FlashPoint_ProbeHostAdapter()
1076 pCardInfo->si_flags |= SCSI_PARITY_ENA; in FlashPoint_ProbeHostAdapter()
1079 pCardInfo->si_flags |= SOFT_RESET; in FlashPoint_ProbeHostAdapter()
1082 pCardInfo->si_flags |= EXTENDED_TRANSLATION; in FlashPoint_ProbeHostAdapter()
1085 pCardInfo->si_flags |= FLAG_SCAM_ENABLED; in FlashPoint_ProbeHostAdapter()
1088 pCardInfo->si_flags |= FLAG_SCAM_LEVEL2; in FlashPoint_ProbeHostAdapter()
1104 pCardInfo->si_flags |= SUPPORT_16TAR_32LUN; in FlashPoint_ProbeHostAdapter()
1106 pCardInfo->si_card_family = HARPOON_FAMILY; in FlashPoint_ProbeHostAdapter()
1107 pCardInfo->si_bustype = BUSTYPE_PCI; in FlashPoint_ProbeHostAdapter()
1110 pCardInfo->si_card_model[0] = '9'; in FlashPoint_ProbeHostAdapter()
1111 switch (pCurrNvRam->niModel & 0x0f) { in FlashPoint_ProbeHostAdapter()
1113 pCardInfo->si_card_model[1] = '3'; in FlashPoint_ProbeHostAdapter()
1114 pCardInfo->si_card_model[2] = '0'; in FlashPoint_ProbeHostAdapter()
1117 pCardInfo->si_card_model[1] = '5'; in FlashPoint_ProbeHostAdapter()
1118 pCardInfo->si_card_model[2] = '0'; in FlashPoint_ProbeHostAdapter()
1121 pCardInfo->si_card_model[1] = '3'; in FlashPoint_ProbeHostAdapter()
1122 pCardInfo->si_card_model[2] = '2'; in FlashPoint_ProbeHostAdapter()
1125 pCardInfo->si_card_model[1] = '5'; in FlashPoint_ProbeHostAdapter()
1126 pCardInfo->si_card_model[2] = '2'; in FlashPoint_ProbeHostAdapter()
1131 pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8); in FlashPoint_ProbeHostAdapter()
1134 pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF); in FlashPoint_ProbeHostAdapter()
1135 pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8); in FlashPoint_ProbeHostAdapter()
1138 if (pCardInfo->si_card_model[1] == '3') { in FlashPoint_ProbeHostAdapter()
1140 pCardInfo->si_flags |= LOW_BYTE_TERM; in FlashPoint_ProbeHostAdapter()
1141 } else if (pCardInfo->si_card_model[2] == '0') { in FlashPoint_ProbeHostAdapter()
1145 pCardInfo->si_flags |= LOW_BYTE_TERM; in FlashPoint_ProbeHostAdapter()
1148 pCardInfo->si_flags |= HIGH_BYTE_TERM; in FlashPoint_ProbeHostAdapter()
1166 pCardInfo->si_flags |= LOW_BYTE_TERM; in FlashPoint_ProbeHostAdapter()
1168 pCardInfo->si_flags |= HIGH_BYTE_TERM; in FlashPoint_ProbeHostAdapter()
1175 pCardInfo->si_XlatInfo[i] = in FlashPoint_ProbeHostAdapter()
1179 /* return with -1 if no sort, else return with in FlashPoint_ProbeHostAdapter()
1180 logical card number sorted by BIOS (zero-based) */ in FlashPoint_ProbeHostAdapter()
1182 pCardInfo->si_relative_cardnum = in FlashPoint_ProbeHostAdapter()
1184 char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1); in FlashPoint_ProbeHostAdapter()
1197 pCardInfo->si_present = 0x01; in FlashPoint_ProbeHostAdapter()
1202 /*---------------------------------------------------------------------
1208 *---------------------------------------------------------------------*/
1219 ioport = pCardInfo->si_baseaddr; in FlashPoint_HardwareResetHostAdapter()
1240 if (CurrCard->ioPort == in FlashPoint_HardwareResetHostAdapter()
1242 CurrCard->pNvRamInfo = in FlashPoint_HardwareResetHostAdapter()
1246 CurrCard->cardIndex = thisCard; in FlashPoint_HardwareResetHostAdapter()
1247 CurrCard->cardInfo = pCardInfo; in FlashPoint_HardwareResetHostAdapter()
1253 pCurrNvRam = CurrCard->pNvRamInfo; in FlashPoint_HardwareResetHostAdapter()
1256 ScamFlg = pCurrNvRam->niScamConf; in FlashPoint_HardwareResetHostAdapter()
1267 for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) { in FlashPoint_HardwareResetHostAdapter()
1272 WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id); in FlashPoint_HardwareResetHostAdapter()
1273 CurrCard->ourId = pCardInfo->si_id; in FlashPoint_HardwareResetHostAdapter()
1275 i = (unsigned char)pCardInfo->si_flags; in FlashPoint_HardwareResetHostAdapter()
1289 if (!(pCardInfo->si_flags & SOFT_RESET)) { in FlashPoint_HardwareResetHostAdapter()
1293 FPT_scini(thisCard, pCardInfo->si_id, 0); in FlashPoint_HardwareResetHostAdapter()
1296 if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS) in FlashPoint_HardwareResetHostAdapter()
1297 CurrCard->globalFlags |= F_NO_FILTER; in FlashPoint_HardwareResetHostAdapter()
1300 if (pCurrNvRam->niSysConf & 0x10) in FlashPoint_HardwareResetHostAdapter()
1301 CurrCard->globalFlags |= F_GREEN_PC; in FlashPoint_HardwareResetHostAdapter()
1304 CurrCard->globalFlags |= F_GREEN_PC; in FlashPoint_HardwareResetHostAdapter()
1307 /* Set global flag to indicate Re-Negotiation to be done on all in FlashPoint_HardwareResetHostAdapter()
1310 if (pCurrNvRam->niScsiConf & 0x04) in FlashPoint_HardwareResetHostAdapter()
1311 CurrCard->globalFlags |= F_DO_RENEGO; in FlashPoint_HardwareResetHostAdapter()
1314 CurrCard->globalFlags |= F_DO_RENEGO; in FlashPoint_HardwareResetHostAdapter()
1318 if (pCurrNvRam->niScsiConf & 0x08) in FlashPoint_HardwareResetHostAdapter()
1319 CurrCard->globalFlags |= F_CONLUN_IO; in FlashPoint_HardwareResetHostAdapter()
1322 CurrCard->globalFlags |= F_CONLUN_IO; in FlashPoint_HardwareResetHostAdapter()
1325 temp = pCardInfo->si_per_targ_no_disc; in FlashPoint_HardwareResetHostAdapter()
1338 temp = (unsigned short)pCurrNvRam->niSyncTbl[id]; in FlashPoint_HardwareResetHostAdapter()
1349 if (pCardInfo->si_per_targ_init_sync & sync_bit_map) { in FlashPoint_HardwareResetHostAdapter()
1365 /* if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) || in FlashPoint_HardwareResetHostAdapter()
1368 if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) { in FlashPoint_HardwareResetHostAdapter()
1403 pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo; in FlashPoint_ReleaseHostAdapter()
1406 FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel); in FlashPoint_ReleaseHostAdapter()
1407 FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf); in FlashPoint_ReleaseHostAdapter()
1408 FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf); in FlashPoint_ReleaseHostAdapter()
1409 FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf); in FlashPoint_ReleaseHostAdapter()
1410 FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId); in FlashPoint_ReleaseHostAdapter()
1413 FPT_WrStack(pCurrNvRam->niBaseAddr, in FlashPoint_ReleaseHostAdapter()
1415 pCurrNvRam->niSyncTbl[i]); in FlashPoint_ReleaseHostAdapter()
1417 portBase = pCurrNvRam->niBaseAddr; in FlashPoint_ReleaseHostAdapter()
1421 pScamTbl = (u32 *)&pCurrNvRam->niScamTbl[i]; in FlashPoint_ReleaseHostAdapter()
1427 FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0); in FlashPoint_ReleaseHostAdapter()
1439 pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0); in FPT_RNVRamData()
1440 pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1); in FPT_RNVRamData()
1441 pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2); in FPT_RNVRamData()
1442 pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3); in FPT_RNVRamData()
1443 pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4); in FPT_RNVRamData()
1446 pNvRamInfo->niSyncTbl[i] = in FPT_RNVRamData()
1447 FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5)); in FPT_RNVRamData()
1449 portBase = pNvRamInfo->niBaseAddr; in FPT_RNVRamData()
1454 pScamTbl = (u32 *)&pNvRamInfo->niScamTbl[i]; in FPT_RNVRamData()
1486 /*---------------------------------------------------------------------
1494 *---------------------------------------------------------------------*/
1503 thisCard = pCurrCard->cardIndex; in FlashPoint_StartCCB()
1504 ioport = pCurrCard->ioPort; in FlashPoint_StartCCB()
1506 if ((p_Sccb->TargID >= MAX_SCSI_TAR) || (p_Sccb->Lun >= MAX_LUN)) { in FlashPoint_StartCCB()
1508 p_Sccb->HostStatus = SCCB_COMPLETE; in FlashPoint_StartCCB()
1509 p_Sccb->SccbStatus = SCCB_ERROR; in FlashPoint_StartCCB()
1510 callback = (CALL_BK_FN) p_Sccb->SccbCallback; in FlashPoint_StartCCB()
1519 if (!pCurrCard->cmdCounter) { in FlashPoint_StartCCB()
1524 if (pCurrCard->globalFlags & F_GREEN_PC) { in FlashPoint_StartCCB()
1530 pCurrCard->cmdCounter++; in FlashPoint_StartCCB()
1537 if (p_Sccb->OperationCode == RESET_COMMAND) { in FlashPoint_StartCCB()
1539 pCurrCard->currentSCCB; in FlashPoint_StartCCB()
1540 pCurrCard->currentSCCB = p_Sccb; in FlashPoint_StartCCB()
1542 pCurrCard->currentSCCB = in FlashPoint_StartCCB()
1551 if (p_Sccb->OperationCode == RESET_COMMAND) { in FlashPoint_StartCCB()
1553 pCurrCard->currentSCCB; in FlashPoint_StartCCB()
1554 pCurrCard->currentSCCB = p_Sccb; in FlashPoint_StartCCB()
1556 pCurrCard->currentSCCB = in FlashPoint_StartCCB()
1567 if ((pCurrCard->globalFlags & F_CONLUN_IO) && in FlashPoint_StartCCB()
1568 ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID]. in FlashPoint_StartCCB()
1570 lun = p_Sccb->Lun; in FlashPoint_StartCCB()
1573 if ((pCurrCard->currentSCCB == NULL) && in FlashPoint_StartCCB()
1574 (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) in FlashPoint_StartCCB()
1575 && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun] in FlashPoint_StartCCB()
1578 pCurrCard->currentSCCB = p_Sccb; in FlashPoint_StartCCB()
1579 FPT_ssel(p_Sccb->SccbIOPort, thisCard); in FlashPoint_StartCCB()
1584 if (p_Sccb->OperationCode == RESET_COMMAND) { in FlashPoint_StartCCB()
1585 pSaveSccb = pCurrCard->currentSCCB; in FlashPoint_StartCCB()
1586 pCurrCard->currentSCCB = p_Sccb; in FlashPoint_StartCCB()
1589 pCurrCard->currentSCCB = pSaveSccb; in FlashPoint_StartCCB()
1600 /*---------------------------------------------------------------------
1608 *---------------------------------------------------------------------*/
1619 ioport = ((struct sccb_card *)pCurrCard)->ioPort; in FlashPoint_AbortCCB()
1621 thisCard = ((struct sccb_card *)pCurrCard)->cardIndex; in FlashPoint_AbortCCB()
1627 ((struct sccb_card *)pCurrCard)->cmdCounter--; in FlashPoint_AbortCCB()
1629 if (!((struct sccb_card *)pCurrCard)->cmdCounter) in FlashPoint_AbortCCB()
1636 p_Sccb->SccbStatus = SCCB_ABORT; in FlashPoint_AbortCCB()
1637 callback = p_Sccb->SccbCallback; in FlashPoint_AbortCCB()
1644 if (((struct sccb_card *)pCurrCard)->currentSCCB == in FlashPoint_AbortCCB()
1646 p_Sccb->SccbStatus = SCCB_ABORT; in FlashPoint_AbortCCB()
1653 TID = p_Sccb->TargID; in FlashPoint_AbortCCB()
1655 if (p_Sccb->Sccb_tag) { in FlashPoint_AbortCCB()
1657 if (((struct sccb_card *)pCurrCard)-> in FlashPoint_AbortCCB()
1658 discQ_Tbl[p_Sccb->Sccb_tag] == in FlashPoint_AbortCCB()
1660 p_Sccb->SccbStatus = SCCB_ABORT; in FlashPoint_AbortCCB()
1661 p_Sccb->Sccb_scsistat = in FlashPoint_AbortCCB()
1663 p_Sccb->Sccb_scsimsg = in FlashPoint_AbortCCB()
1667 pCurrCard)->currentSCCB == in FlashPoint_AbortCCB()
1670 pCurrCard)-> in FlashPoint_AbortCCB()
1677 *)pCurrCard)-> in FlashPoint_AbortCCB()
1680 pCurrCard)-> in FlashPoint_AbortCCB()
1684 pCurrCard)-> in FlashPoint_AbortCCB()
1692 &FPT_sccbMgrTbl[thisCard][p_Sccb-> in FlashPoint_AbortCCB()
1696 discQ_Tbl[currTar_Info-> in FlashPoint_AbortCCB()
1697 LunDiscQ_Idx[p_Sccb->Lun]] in FlashPoint_AbortCCB()
1699 p_Sccb->SccbStatus = SCCB_ABORT; in FlashPoint_AbortCCB()
1706 return -1; in FlashPoint_AbortCCB()
1709 /*---------------------------------------------------------------------
1716 *---------------------------------------------------------------------*/
1721 ioport = ((struct sccb_card *)pCurrCard)->ioPort; in FlashPoint_InterruptPending()
1732 /*---------------------------------------------------------------------
1740 *---------------------------------------------------------------------*/
1750 thisCard = pCurrCard->cardIndex; in FlashPoint_HandleInterrupt()
1751 ioport = pCurrCard->ioPort; in FlashPoint_HandleInterrupt()
1766 currSCCB = pCurrCard->currentSCCB; in FlashPoint_HandleInterrupt()
1796 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) in FlashPoint_HandleInterrupt()
1812 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) in FlashPoint_HandleInterrupt()
1819 currSCCB->Sccb_XferState |= F_NO_DATA_YET; in FlashPoint_HandleInterrupt()
1821 currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC; in FlashPoint_HandleInterrupt()
1824 currSCCB->Sccb_scsistat = DISCONNECT_ST; in FlashPoint_HandleInterrupt()
1855 pCurrCard->globalFlags |= F_NEW_SCCB_CMD; in FlashPoint_HandleInterrupt()
1865 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) in FlashPoint_HandleInterrupt()
1871 currSCCB->Sccb_XferState |= in FlashPoint_HandleInterrupt()
1873 currSCCB->Sccb_savedATC = in FlashPoint_HandleInterrupt()
1874 currSCCB->Sccb_ATC; in FlashPoint_HandleInterrupt()
1879 currSCCB->Sccb_scsistat = DISCONNECT_ST; in FlashPoint_HandleInterrupt()
1940 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) { in FlashPoint_HandleInterrupt()
1952 pCurrCard->globalFlags |= F_NEW_SCCB_CMD; in FlashPoint_HandleInterrupt()
1955 if (((struct sccb_card *)pCurrCard)-> in FlashPoint_HandleInterrupt()
1958 pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD; in FlashPoint_HandleInterrupt()
1960 if (pCurrCard->currentSCCB == NULL) in FlashPoint_HandleInterrupt()
1963 if (pCurrCard->currentSCCB != NULL) { in FlashPoint_HandleInterrupt()
1964 pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD; in FlashPoint_HandleInterrupt()
1979 /*---------------------------------------------------------------------
1988 *---------------------------------------------------------------------*/
2000 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) { in FPT_SccbMgr_bad_isr()
2003 pCurrCard->currentSCCB); in FPT_SccbMgr_bad_isr()
2016 if (pCurrCard->currentSCCB != NULL) { in FPT_SccbMgr_bad_isr()
2018 if (!pCurrCard->currentSCCB->HostStatus) in FPT_SccbMgr_bad_isr()
2019 pCurrCard->currentSCCB->HostStatus = in FPT_SccbMgr_bad_isr()
2042 if (pCurrCard->currentSCCB != NULL) { in FPT_SccbMgr_bad_isr()
2044 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) in FPT_SccbMgr_bad_isr()
2047 pCurrCard->currentSCCB); in FPT_SccbMgr_bad_isr()
2057 pCurrNvRam = pCurrCard->pNvRamInfo; in FPT_SccbMgr_bad_isr()
2059 ScamFlg = pCurrNvRam->niScamConf; in FPT_SccbMgr_bad_isr()
2068 FPT_scini(p_card, pCurrCard->ourId, 0); in FPT_SccbMgr_bad_isr()
2077 if (pCurrCard->currentSCCB != NULL) in FPT_SccbMgr_bad_isr()
2089 pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT; in FPT_SccbMgr_bad_isr()
2092 &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; in FPT_SccbMgr_bad_isr()
2093 if ((pCurrCard->globalFlags & F_CONLUN_IO) in FPT_SccbMgr_bad_isr()
2094 && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != in FPT_SccbMgr_bad_isr()
2096 currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = in FPT_SccbMgr_bad_isr()
2099 currTar_Info->TarLUNBusy[0] = 0; in FPT_SccbMgr_bad_isr()
2101 if (currTar_Info->TarEEValue & EE_SYNC_MASK) { in FPT_SccbMgr_bad_isr()
2102 currTar_Info->TarSyncCtrl = 0; in FPT_SccbMgr_bad_isr()
2103 currTar_Info->TarStatus &= ~TAR_SYNC_MASK; in FPT_SccbMgr_bad_isr()
2106 if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { in FPT_SccbMgr_bad_isr()
2107 currTar_Info->TarStatus &= ~TAR_WIDE_MASK; in FPT_SccbMgr_bad_isr()
2110 FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI, in FPT_SccbMgr_bad_isr()
2113 FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card); in FPT_SccbMgr_bad_isr()
2131 /*---------------------------------------------------------------------
2137 *---------------------------------------------------------------------*/
2154 /*---------------------------------------------------------------------
2160 *---------------------------------------------------------------------*/
2177 pCurrCard->scanIndex = 0x00; in FPT_SccbMgrTableInitCard()
2178 pCurrCard->currentSCCB = NULL; in FPT_SccbMgrTableInitCard()
2179 pCurrCard->globalFlags = 0x00; in FPT_SccbMgrTableInitCard()
2180 pCurrCard->cmdCounter = 0x00; in FPT_SccbMgrTableInitCard()
2181 pCurrCard->tagQ_Lst = 0x01; in FPT_SccbMgrTableInitCard()
2182 pCurrCard->discQCount = 0; in FPT_SccbMgrTableInitCard()
2186 /*---------------------------------------------------------------------
2192 *---------------------------------------------------------------------*/
2203 currTar_Info->TarSelQ_Cnt = 0; in FPT_SccbMgrTableInitTarget()
2204 currTar_Info->TarSyncCtrl = 0; in FPT_SccbMgrTableInitTarget()
2206 currTar_Info->TarSelQ_Head = NULL; in FPT_SccbMgrTableInitTarget()
2207 currTar_Info->TarSelQ_Tail = NULL; in FPT_SccbMgrTableInitTarget()
2208 currTar_Info->TarTagQ_Cnt = 0; in FPT_SccbMgrTableInitTarget()
2209 currTar_Info->TarLUN_CA = 0; in FPT_SccbMgrTableInitTarget()
2212 currTar_Info->TarLUNBusy[lun] = 0; in FPT_SccbMgrTableInitTarget()
2213 currTar_Info->LunDiscQ_Idx[lun] = 0; in FPT_SccbMgrTableInitTarget()
2218 if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == in FPT_SccbMgrTableInitTarget()
2221 FPT_BL_Card[p_card].discQCount--; in FPT_SccbMgrTableInitTarget()
2227 /*---------------------------------------------------------------------
2234 *---------------------------------------------------------------------*/
2262 pCurrSCCB->Sccb_scsimsg = SMPARITY; in FPT_sfm()
2296 /*---------------------------------------------------------------------
2302 *---------------------------------------------------------------------*/
2316 currSCCB = CurrCard->currentSCCB; in FPT_ssel()
2317 target = currSCCB->TargID; in FPT_ssel()
2319 lastTag = CurrCard->tagQ_Lst; in FPT_ssel()
2323 if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT) in FPT_ssel()
2324 currSCCB->ControlByte &= ~F_USE_CMD_Q; in FPT_ssel()
2326 if (((CurrCard->globalFlags & F_CONLUN_IO) && in FPT_ssel()
2327 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) in FPT_ssel()
2329 lun = currSCCB->Lun; in FPT_ssel()
2333 if (CurrCard->globalFlags & F_TAG_STARTED) { in FPT_ssel()
2334 if (!(currSCCB->ControlByte & F_USE_CMD_Q)) { in FPT_ssel()
2335 if ((currTar_Info->TarLUN_CA == 0) in FPT_ssel()
2336 && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) in FPT_ssel()
2339 if (currTar_Info->TarTagQ_Cnt != 0) { in FPT_ssel()
2340 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2347 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2351 /*End non-tagged */ in FPT_ssel()
2353 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2359 if (currTar_Info->TarLUN_CA == 1) { in FPT_ssel()
2365 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2372 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2375 if ((((CurrCard->globalFlags & F_CONLUN_IO) && in FPT_ssel()
2376 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) in FPT_ssel()
2377 || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) { in FPT_ssel()
2378 if (CurrCard->discQCount >= QUEUE_DEPTH) { in FPT_ssel()
2379 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2387 if (CurrCard->discQ_Tbl[lastTag] == NULL) { in FPT_ssel()
2388 CurrCard->tagQ_Lst = lastTag; in FPT_ssel()
2389 currTar_Info->LunDiscQ_Idx[lun] = lastTag; in FPT_ssel()
2390 CurrCard->discQ_Tbl[lastTag] = currSCCB; in FPT_ssel()
2391 CurrCard->discQCount++; in FPT_ssel()
2396 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2408 if (currSCCB->OperationCode == RESET_COMMAND) { in FPT_ssel()
2410 (currSCCB-> in FPT_ssel()
2415 currSCCB->Sccb_scsimsg = SMDEV_RESET; in FPT_ssel()
2419 currSCCB->Sccb_scsistat = SELECT_BDR_ST; in FPT_ssel()
2421 if (currTar_Info->TarEEValue & EE_SYNC_MASK) { in FPT_ssel()
2422 currTar_Info->TarSyncCtrl = 0; in FPT_ssel()
2423 currTar_Info->TarStatus &= ~TAR_SYNC_MASK; in FPT_ssel()
2426 if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { in FPT_ssel()
2427 currTar_Info->TarStatus &= ~TAR_WIDE_MASK; in FPT_ssel()
2435 else if (currSCCB->Sccb_scsistat == ABORT_ST) { in FPT_ssel()
2437 (currSCCB-> in FPT_ssel()
2444 char)(currSCCB-> in FPT_ssel()
2450 (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag)); in FPT_ssel()
2458 else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) { in FPT_ssel()
2460 currSCCB->Sccb_scsistat = SELECT_WN_ST; in FPT_ssel()
2463 else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) in FPT_ssel()
2466 currSCCB->Sccb_scsistat = SELECT_SN_ST; in FPT_ssel()
2471 if (currSCCB->ControlByte & F_USE_CMD_Q) { in FPT_ssel()
2473 CurrCard->globalFlags |= F_TAG_STARTED; in FPT_ssel()
2475 if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) in FPT_ssel()
2477 currSCCB->ControlByte &= ~F_USE_CMD_Q; in FPT_ssel()
2480 Non-Tag-CMD handling */ in FPT_ssel()
2486 currSCCB->Sccb_idmsg)); in FPT_ssel()
2493 currSCCB->Sccb_scsistat = SELECT_ST; in FPT_ssel()
2495 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2501 currSCCB->Sccb_idmsg)); in FPT_ssel()
2505 (((unsigned char)(currSCCB-> in FPT_ssel()
2513 if (CurrCard->discQ_Tbl[lastTag] == in FPT_ssel()
2519 CurrCard->tagQ_Lst = lastTag; in FPT_ssel()
2520 currSCCB->Sccb_tag = lastTag; in FPT_ssel()
2521 CurrCard->discQ_Tbl[lastTag] = in FPT_ssel()
2523 CurrCard->discQCount++; in FPT_ssel()
2529 currTar_Info->TarLUNBusy[lun] = 1; in FPT_ssel()
2535 currSCCB->Sccb_scsistat = SELECT_Q_ST; in FPT_ssel()
2548 (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg)); in FPT_ssel()
2550 currSCCB->Sccb_scsistat = SELECT_ST; in FPT_ssel()
2556 theCCB = (unsigned char *)&currSCCB->Cdb[0]; in FPT_ssel()
2560 for (i = 0; i < currSCCB->CdbLength; i++) { in FPT_ssel()
2566 if (currSCCB->CdbLength != TWELVE_BYTE_CMD) in FPT_ssel()
2578 if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) { in FPT_ssel()
2595 /*---------------------------------------------------------------------
2601 *---------------------------------------------------------------------*/
2612 if (pCurrCard->currentSCCB != NULL) { in FPT_sres()
2614 &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID]; in FPT_sres()
2619 currSCCB = pCurrCard->currentSCCB; in FPT_sres()
2620 if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { in FPT_sres()
2621 currTar_Info->TarStatus &= ~TAR_WIDE_MASK; in FPT_sres()
2622 currSCCB->Sccb_scsistat = BUS_FREE_ST; in FPT_sres()
2624 if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { in FPT_sres()
2625 currTar_Info->TarStatus &= ~TAR_SYNC_MASK; in FPT_sres()
2626 currSCCB->Sccb_scsistat = BUS_FREE_ST; in FPT_sres()
2628 if (((pCurrCard->globalFlags & F_CONLUN_IO) && in FPT_sres()
2629 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != in FPT_sres()
2631 currTar_Info->TarLUNBusy[currSCCB->Lun] = 0; in FPT_sres()
2632 if (currSCCB->Sccb_scsistat != ABORT_ST) { in FPT_sres()
2633 pCurrCard->discQCount--; in FPT_sres()
2634 pCurrCard->discQ_Tbl[currTar_Info-> in FPT_sres()
2635 LunDiscQ_Idx[currSCCB-> in FPT_sres()
2640 currTar_Info->TarLUNBusy[0] = 0; in FPT_sres()
2641 if (currSCCB->Sccb_tag) { in FPT_sres()
2642 if (currSCCB->Sccb_scsistat != ABORT_ST) { in FPT_sres()
2643 pCurrCard->discQCount--; in FPT_sres()
2644 pCurrCard->discQ_Tbl[currSCCB-> in FPT_sres()
2648 if (currSCCB->Sccb_scsistat != ABORT_ST) { in FPT_sres()
2649 pCurrCard->discQCount--; in FPT_sres()
2650 pCurrCard->discQ_Tbl[currTar_Info-> in FPT_sres()
2682 message = FPT_sfm(port, pCurrCard->currentSCCB); in FPT_sres()
2688 if ((currTar_Info-> in FPT_sres()
2691 if (currTar_Info->TarTagQ_Cnt != in FPT_sres()
2695 (currTar_Info-> in FPT_sres()
2702 pCurrCard-> in FPT_sres()
2718 pCurrCard-> in FPT_sres()
2792 if (((pCurrCard->globalFlags & F_CONLUN_IO) && in FPT_sres()
2793 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { in FPT_sres()
2794 currTar_Info->TarLUNBusy[lun] = 1; in FPT_sres()
2795 pCurrCard->currentSCCB = in FPT_sres()
2796 pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]]; in FPT_sres()
2797 if (pCurrCard->currentSCCB != NULL) { in FPT_sres()
2803 currTar_Info->TarLUNBusy[0] = 1; in FPT_sres()
2806 if (pCurrCard->discQ_Tbl[tag] != NULL) { in FPT_sres()
2807 pCurrCard->currentSCCB = in FPT_sres()
2808 pCurrCard->discQ_Tbl[tag]; in FPT_sres()
2809 currTar_Info->TarTagQ_Cnt--; in FPT_sres()
2815 pCurrCard->currentSCCB = in FPT_sres()
2816 pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]]; in FPT_sres()
2817 if (pCurrCard->currentSCCB != NULL) { in FPT_sres()
2825 if (pCurrCard->currentSCCB != NULL) { in FPT_sres()
2826 if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) { in FPT_sres()
2827 /* During Abort Tag command, the target could have got re-selected in FPT_sres()
2830 FPT_queueFindSccb(pCurrCard->currentSCCB, p_card); in FPT_sres()
2878 /*---------------------------------------------------------------------
2885 *---------------------------------------------------------------------*/
2893 currSCCB = CurrCard->currentSCCB; in FPT_sdecm()
2895 currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; in FPT_sdecm()
2898 if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) { in FPT_sdecm()
2899 currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC; in FPT_sdecm()
2911 if (currSCCB->Sccb_scsistat == SELECT_Q_ST) { in FPT_sdecm()
2912 currTar_Info->TarStatus &= in FPT_sdecm()
2914 currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT; in FPT_sdecm()
2931 if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) || in FPT_sdecm()
2932 (currSCCB->Sccb_scsistat == SELECT_WN_ST) || in FPT_sdecm()
2933 ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING) in FPT_sdecm()
2934 || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == in FPT_sdecm()
2946 if (currSCCB->Lun == 0x00) { in FPT_sdecm()
2947 if ((currSCCB->Sccb_scsistat == SELECT_SN_ST)) { in FPT_sdecm()
2949 currTar_Info->TarStatus |= in FPT_sdecm()
2952 currTar_Info->TarEEValue &= in FPT_sdecm()
2956 else if ((currSCCB->Sccb_scsistat == in FPT_sdecm()
2959 currTar_Info->TarStatus = in FPT_sdecm()
2960 (currTar_Info-> in FPT_sdecm()
2964 currTar_Info->TarEEValue &= in FPT_sdecm()
2969 else if ((currTar_Info-> in FPT_sdecm()
2972 currTar_Info->TarStatus = in FPT_sdecm()
2973 (currTar_Info-> in FPT_sdecm()
2977 currSCCB->ControlByte &= ~F_USE_CMD_Q; in FPT_sdecm()
2978 CurrCard->discQCount--; in FPT_sdecm()
2979 CurrCard->discQ_Tbl[currSCCB-> in FPT_sdecm()
2981 currSCCB->Sccb_tag = 0x00; in FPT_sdecm()
2988 if (currSCCB->Lun == 0x00) { in FPT_sdecm()
2991 CurrCard->globalFlags |= F_NEW_SCCB_CMD; in FPT_sdecm()
2997 if ((CurrCard->globalFlags & F_CONLUN_IO) && in FPT_sdecm()
2998 ((currTar_Info-> in FPT_sdecm()
3001 currTar_Info->TarLUNBusy[currSCCB-> in FPT_sdecm()
3004 currTar_Info->TarLUNBusy[0] = 1; in FPT_sdecm()
3006 currSCCB->ControlByte &= in FPT_sdecm()
3042 if (currSCCB->Sccb_scsimsg != SMPARITY) in FPT_sdecm()
3050 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; in FPT_sdecm()
3051 currSCCB->Sccb_scsimsg = SMREJECT; in FPT_sdecm()
3059 /*---------------------------------------------------------------------
3065 *---------------------------------------------------------------------*/
3085 pCurrSCCB->Sccb_scsimsg = SMREJECT; in FPT_shandem()
3096 pCurrSCCB->Sccb_scsimsg = SMREJECT; in FPT_shandem()
3105 pCurrSCCB->Sccb_scsimsg = SMREJECT; in FPT_shandem()
3112 if (pCurrSCCB->Sccb_scsimsg != SMPARITY) in FPT_shandem()
3118 if (pCurrSCCB->Sccb_scsimsg == SMPARITY) in FPT_shandem()
3124 /*---------------------------------------------------------------------
3131 *---------------------------------------------------------------------*/
3140 currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; in FPT_sisyncn()
3142 if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) { in FPT_sisyncn()
3146 (currSCCB-> in FPT_sisyncn()
3157 if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) in FPT_sisyncn()
3162 else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == in FPT_sisyncn()
3168 else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == in FPT_sisyncn()
3186 currTar_Info->TarStatus = in FPT_sisyncn()
3187 ((currTar_Info-> in FPT_sisyncn()
3200 currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED; in FPT_sisyncn()
3201 currTar_Info->TarEEValue &= ~EE_SYNC_MASK; in FPT_sisyncn()
3206 /*---------------------------------------------------------------------
3213 *---------------------------------------------------------------------*/
3221 currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; in FPT_stsyncn()
3225 if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { in FPT_stsyncn()
3235 if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { in FPT_stsyncn()
3241 if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB) in FPT_stsyncn()
3245 else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB) in FPT_stsyncn()
3249 else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB) in FPT_stsyncn()
3302 if (currTar_Info->TarStatus & WIDE_ENABLED) in FPT_stsyncn()
3310 FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info); in FPT_stsyncn()
3312 if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { in FPT_stsyncn()
3316 currTar_Info->TarStatus = ((currTar_Info->TarStatus & in FPT_stsyncn()
3330 currTar_Info->TarStatus = ((currTar_Info->TarStatus & in FPT_stsyncn()
3336 /*---------------------------------------------------------------------
3342 *---------------------------------------------------------------------*/
3365 /*---------------------------------------------------------------------
3372 *---------------------------------------------------------------------*/
3380 currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; in FPT_siwidn()
3382 if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) { in FPT_siwidn()
3386 (currSCCB-> in FPT_siwidn()
3403 currTar_Info->TarStatus = ((currTar_Info->TarStatus & in FPT_siwidn()
3412 currTar_Info->TarStatus = ((currTar_Info->TarStatus & in FPT_siwidn()
3416 currTar_Info->TarEEValue &= ~EE_WIDE_SCSI; in FPT_siwidn()
3421 /*---------------------------------------------------------------------
3428 *---------------------------------------------------------------------*/
3436 currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID]; in FPT_stwidn()
3440 if ((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) { in FPT_stwidn()
3446 if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI)) in FPT_stwidn()
3450 currTar_Info->TarStatus |= WIDE_ENABLED; in FPT_stwidn()
3454 currTar_Info->TarStatus &= ~WIDE_ENABLED; in FPT_stwidn()
3457 FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info); in FPT_stwidn()
3459 if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { in FPT_stwidn()
3461 currTar_Info->TarStatus |= WIDE_NEGOCIATED; in FPT_stwidn()
3464 ((currTar_Info->TarStatus & TAR_SYNC_MASK) == in FPT_stwidn()
3469 currSCCB->Sccb_scsistat = SELECT_SN_ST; in FPT_stwidn()
3482 if (currTar_Info->TarEEValue & EE_WIDE_SCSI) in FPT_stwidn()
3489 currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED); in FPT_stwidn()
3493 /*---------------------------------------------------------------------
3499 *---------------------------------------------------------------------*/
3520 /*---------------------------------------------------------------------
3527 *---------------------------------------------------------------------*/
3590 currTar_Info->TarSyncCtrl = p_sync_value; in FPT_sssyncv()
3593 /*---------------------------------------------------------------------
3599 *---------------------------------------------------------------------*/
3634 if (currTar_Info->TarEEValue & EE_SYNC_MASK) { in FPT_sresb()
3635 currTar_Info->TarSyncCtrl = 0; in FPT_sresb()
3636 currTar_Info->TarStatus &= ~TAR_SYNC_MASK; in FPT_sresb()
3639 if (currTar_Info->TarEEValue & EE_WIDE_SCSI) { in FPT_sresb()
3640 currTar_Info->TarStatus &= ~TAR_WIDE_MASK; in FPT_sresb()
3664 /*---------------------------------------------------------------------
3670 *---------------------------------------------------------------------*/
3676 currSCCB = pCurrCard->currentSCCB; in FPT_ssenss()
3678 currSCCB->Save_CdbLen = currSCCB->CdbLength; in FPT_ssenss()
3682 currSCCB->Save_Cdb[i] = currSCCB->Cdb[i]; in FPT_ssenss()
3685 currSCCB->CdbLength = SIX_BYTE_CMD; in FPT_ssenss()
3686 currSCCB->Cdb[0] = SCSI_REQUEST_SENSE; in FPT_ssenss()
3687 currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0; /*Keep LUN. */ in FPT_ssenss()
3688 currSCCB->Cdb[2] = 0x00; in FPT_ssenss()
3689 currSCCB->Cdb[3] = 0x00; in FPT_ssenss()
3690 currSCCB->Cdb[4] = currSCCB->RequestSenseLength; in FPT_ssenss()
3691 currSCCB->Cdb[5] = 0x00; in FPT_ssenss()
3693 currSCCB->Sccb_XferCnt = (u32)currSCCB->RequestSenseLength; in FPT_ssenss()
3695 currSCCB->Sccb_ATC = 0x00; in FPT_ssenss()
3697 currSCCB->Sccb_XferState |= F_AUTO_SENSE; in FPT_ssenss()
3699 currSCCB->Sccb_XferState &= ~F_SG_XFER; in FPT_ssenss()
3701 currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV; in FPT_ssenss()
3703 currSCCB->ControlByte = 0x00; in FPT_ssenss()
3705 currSCCB->Sccb_MGRFlags &= F_STATUSLOADED; in FPT_ssenss()
3708 /*---------------------------------------------------------------------
3715 *---------------------------------------------------------------------*/
3790 /*---------------------------------------------------------------------
3797 *---------------------------------------------------------------------*/
3808 if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) && in FPT_schkdd()
3809 (currSCCB->Sccb_scsistat != DATA_IN_ST)) { in FPT_schkdd()
3813 if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) { in FPT_schkdd()
3815 currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1); in FPT_schkdd()
3817 currSCCB->Sccb_XferCnt = 1; in FPT_schkdd()
3819 currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT; in FPT_schkdd()
3826 currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; in FPT_schkdd()
3828 currSCCB->Sccb_XferCnt = 0; in FPT_schkdd()
3832 (currSCCB->HostStatus == SCCB_COMPLETE)) { in FPT_schkdd()
3834 currSCCB->HostStatus = SCCB_PARITY_ERR; in FPT_schkdd()
3868 if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) { in FPT_schkdd()
3869 if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) { in FPT_schkdd()
3892 /*---------------------------------------------------------------------
3898 *---------------------------------------------------------------------*/
3904 if ((p_sccb->TargID >= MAX_SCSI_TAR) || (p_sccb->Lun >= MAX_LUN)) { in FPT_sinits()
3907 currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; in FPT_sinits()
3909 p_sccb->Sccb_XferState = 0x00; in FPT_sinits()
3910 p_sccb->Sccb_XferCnt = p_sccb->DataLength; in FPT_sinits()
3912 if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) || in FPT_sinits()
3913 (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) { in FPT_sinits()
3915 p_sccb->Sccb_SGoffset = 0; in FPT_sinits()
3916 p_sccb->Sccb_XferState = F_SG_XFER; in FPT_sinits()
3917 p_sccb->Sccb_XferCnt = 0x00; in FPT_sinits()
3920 if (p_sccb->DataLength == 0x00) in FPT_sinits()
3922 p_sccb->Sccb_XferState |= F_ALL_XFERRED; in FPT_sinits()
3924 if (p_sccb->ControlByte & F_USE_CMD_Q) { in FPT_sinits()
3925 if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT) in FPT_sinits()
3926 p_sccb->ControlByte &= ~F_USE_CMD_Q; in FPT_sinits()
3929 currTar_Info->TarStatus |= TAG_Q_TRYING; in FPT_sinits()
3938 (currTar_Info->TarStatus & TAR_ALLOW_DISC)) || in FPT_sinits()
3939 (currTar_Info->TarStatus & TAG_Q_TRYING)) { in FPT_sinits()
3941 if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) || in FPT_sinits()
3942 (currTar_Info->TarStatus & TAG_Q_TRYING)) { in FPT_sinits()
3943 p_sccb->Sccb_idmsg = in FPT_sinits()
3944 (unsigned char)(SMIDENT | DISC_PRIV) | p_sccb->Lun; in FPT_sinits()
3949 p_sccb->Sccb_idmsg = (unsigned char)SMIDENT | p_sccb->Lun; in FPT_sinits()
3952 p_sccb->HostStatus = 0x00; in FPT_sinits()
3953 p_sccb->TargetStatus = 0x00; in FPT_sinits()
3954 p_sccb->Sccb_tag = 0x00; in FPT_sinits()
3955 p_sccb->Sccb_MGRFlags = 0x00; in FPT_sinits()
3956 p_sccb->Sccb_sgseg = 0x00; in FPT_sinits()
3957 p_sccb->Sccb_ATC = 0x00; in FPT_sinits()
3958 p_sccb->Sccb_savedATC = 0x00; in FPT_sinits()
3960 p_sccb->SccbVirtDataPtr = 0x00; in FPT_sinits()
3961 p_sccb->Sccb_forwardlink = NULL; in FPT_sinits()
3962 p_sccb->Sccb_backlink = NULL; in FPT_sinits()
3964 p_sccb->Sccb_scsistat = BUS_FREE_ST; in FPT_sinits()
3965 p_sccb->SccbStatus = SCCB_IN_PROCESS; in FPT_sinits()
3966 p_sccb->Sccb_scsimsg = SMNO_OP; in FPT_sinits()
3970 /*---------------------------------------------------------------------
3976 *---------------------------------------------------------------------*/
3993 /*---------------------------------------------------------------------
3999 *---------------------------------------------------------------------*/
4011 currSCCB->Sccb_scsistat = DATA_OUT_ST; in FPT_phaseDataOut()
4012 currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET); in FPT_phaseDataOut()
4022 if (currSCCB->Sccb_XferCnt == 0) { in FPT_phaseDataOut()
4024 if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) && in FPT_phaseDataOut()
4025 (currSCCB->HostStatus == SCCB_COMPLETE)) in FPT_phaseDataOut()
4026 currSCCB->HostStatus = SCCB_DATA_OVER_RUN; in FPT_phaseDataOut()
4034 /*---------------------------------------------------------------------
4040 *---------------------------------------------------------------------*/
4053 currSCCB->Sccb_scsistat = DATA_IN_ST; in FPT_phaseDataIn()
4054 currSCCB->Sccb_XferState |= F_HOST_XFER_DIR; in FPT_phaseDataIn()
4055 currSCCB->Sccb_XferState &= ~F_NO_DATA_YET; in FPT_phaseDataIn()
4065 if (currSCCB->Sccb_XferCnt == 0) { in FPT_phaseDataIn()
4067 if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) && in FPT_phaseDataIn()
4068 (currSCCB->HostStatus == SCCB_COMPLETE)) in FPT_phaseDataIn()
4069 currSCCB->HostStatus = SCCB_DATA_OVER_RUN; in FPT_phaseDataIn()
4078 /*---------------------------------------------------------------------
4084 *---------------------------------------------------------------------*/
4094 if (currSCCB->OperationCode == RESET_COMMAND) { in FPT_phaseCommand()
4096 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; in FPT_phaseCommand()
4097 currSCCB->CdbLength = SIX_BYTE_CMD; in FPT_phaseCommand()
4106 for (i = 0; i < currSCCB->CdbLength; i++) { in FPT_phaseCommand()
4108 if (currSCCB->OperationCode == RESET_COMMAND) in FPT_phaseCommand()
4114 (MPM_OP + ACOMMAND + currSCCB->Cdb[i])); in FPT_phaseCommand()
4118 if (currSCCB->CdbLength != TWELVE_BYTE_CMD) in FPT_phaseCommand()
4123 currSCCB->Sccb_scsistat = COMMAND_ST; in FPT_phaseCommand()
4129 /*---------------------------------------------------------------------
4135 *---------------------------------------------------------------------*/
4139 /* Start-up the automation to finish off this command and let the in FPT_phaseStatus()
4149 /*---------------------------------------------------------------------
4156 *---------------------------------------------------------------------*/
4168 message = currSCCB->Sccb_scsimsg; in FPT_phaseMsgOut()
4169 scsiID = currSCCB->TargID; in FPT_phaseMsgOut()
4174 currTar_Info->TarSyncCtrl = 0; in FPT_phaseMsgOut()
4194 } else if (currSCCB->Sccb_scsistat == ABORT_ST) { in FPT_phaseMsgOut()
4195 currSCCB->HostStatus = SCCB_COMPLETE; in FPT_phaseMsgOut()
4196 if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != in FPT_phaseMsgOut()
4198 FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> in FPT_phaseMsgOut()
4200 FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--; in FPT_phaseMsgOut()
4205 else if (currSCCB->Sccb_scsistat < COMMAND_ST) { in FPT_phaseMsgOut()
4208 currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED; in FPT_phaseMsgOut()
4250 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseMsgOut()
4253 FPT_sccbMgrTbl[p_card][currSCCB-> in FPT_phaseMsgOut()
4255 TarLUNBusy[currSCCB->Lun] = 0; in FPT_phaseMsgOut()
4257 FPT_sccbMgrTbl[p_card][currSCCB-> in FPT_phaseMsgOut()
4280 currSCCB->Sccb_scsimsg = SMNO_OP; in FPT_phaseMsgOut()
4289 /*---------------------------------------------------------------------
4295 *---------------------------------------------------------------------*/
4325 if (currSCCB->Sccb_scsimsg != SMPARITY) in FPT_phaseMsgIn()
4334 /*---------------------------------------------------------------------
4342 *---------------------------------------------------------------------*/
4353 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; in FPT_phaseIllegal()
4354 currSCCB->Sccb_scsistat = ABORT_ST; in FPT_phaseIllegal()
4355 currSCCB->Sccb_scsimsg = SMABORT; in FPT_phaseIllegal()
4361 /*---------------------------------------------------------------------
4368 *---------------------------------------------------------------------*/
4377 if (currSCCB->Sccb_scsistat == DATA_IN_ST) { in FPT_phaseChkFifo()
4384 currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt; in FPT_phaseChkFifo()
4386 currSCCB->Sccb_XferCnt = 0; in FPT_phaseChkFifo()
4389 (currSCCB->HostStatus == SCCB_COMPLETE)) { in FPT_phaseChkFifo()
4390 currSCCB->HostStatus = SCCB_PARITY_ERR; in FPT_phaseChkFifo()
4413 currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt); in FPT_phaseChkFifo()
4415 currSCCB->Sccb_XferCnt = xfercnt; in FPT_phaseChkFifo()
4418 (currSCCB->HostStatus == SCCB_COMPLETE)) { in FPT_phaseChkFifo()
4420 currSCCB->HostStatus = SCCB_PARITY_ERR; in FPT_phaseChkFifo()
4433 /*---------------------------------------------------------------------
4440 *---------------------------------------------------------------------*/
4451 if (currSCCB->OperationCode == RESET_COMMAND) { in FPT_phaseBusFree()
4454 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4456 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4457 TarLUNBusy[currSCCB->Lun] = 0; in FPT_phaseBusFree()
4459 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4469 else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { in FPT_phaseBusFree()
4470 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= in FPT_phaseBusFree()
4472 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= in FPT_phaseBusFree()
4476 else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { in FPT_phaseBusFree()
4477 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = in FPT_phaseBusFree()
4478 (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4481 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= in FPT_phaseBusFree()
4485 else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) { in FPT_phaseBusFree()
4492 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4494 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4505 currSCCB->Sccb_scsistat = BUS_FREE_ST; in FPT_phaseBusFree()
4507 if (!currSCCB->HostStatus) { in FPT_phaseBusFree()
4508 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL; in FPT_phaseBusFree()
4512 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4514 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4515 TarLUNBusy[currSCCB->Lun] = 0; in FPT_phaseBusFree()
4517 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_phaseBusFree()
4530 /*---------------------------------------------------------------------
4536 *---------------------------------------------------------------------*/
4634 /*---------------------------------------------------------------------
4641 *---------------------------------------------------------------------*/
4652 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0; in FPT_autoCmdCmplt()
4659 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4661 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4662 TarLUNBusy[currSCCB->Lun] = 1; in FPT_autoCmdCmplt()
4664 FPT_BL_Card[p_card].discQCount--; in FPT_autoCmdCmplt()
4667 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4668 LunDiscQ_Idx[currSCCB->Lun]] = in FPT_autoCmdCmplt()
4671 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4673 if (currSCCB->Sccb_tag) { in FPT_autoCmdCmplt()
4676 discQCount--; in FPT_autoCmdCmplt()
4677 FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> in FPT_autoCmdCmplt()
4683 discQCount--; in FPT_autoCmdCmplt()
4686 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4691 currSCCB->Sccb_MGRFlags |= F_STATUSLOADED; in FPT_autoCmdCmplt()
4698 if (currSCCB->Sccb_scsistat == SELECT_SN_ST) { in FPT_autoCmdCmplt()
4699 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= in FPT_autoCmdCmplt()
4702 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= in FPT_autoCmdCmplt()
4707 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4709 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4710 TarLUNBusy[currSCCB->Lun] = 1; in FPT_autoCmdCmplt()
4712 FPT_BL_Card[p_card].discQCount--; in FPT_autoCmdCmplt()
4715 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4716 LunDiscQ_Idx[currSCCB->Lun]] = in FPT_autoCmdCmplt()
4719 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4721 if (currSCCB->Sccb_tag) { in FPT_autoCmdCmplt()
4724 discQCount--; in FPT_autoCmdCmplt()
4725 FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> in FPT_autoCmdCmplt()
4731 discQCount--; in FPT_autoCmdCmplt()
4734 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4742 if (currSCCB->Sccb_scsistat == SELECT_WN_ST) { in FPT_autoCmdCmplt()
4744 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus = in FPT_autoCmdCmplt()
4745 (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4748 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= in FPT_autoCmdCmplt()
4753 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4755 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4756 TarLUNBusy[currSCCB->Lun] = 1; in FPT_autoCmdCmplt()
4758 FPT_BL_Card[p_card].discQCount--; in FPT_autoCmdCmplt()
4761 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4762 LunDiscQ_Idx[currSCCB->Lun]] = in FPT_autoCmdCmplt()
4765 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4767 if (currSCCB->Sccb_tag) { in FPT_autoCmdCmplt()
4770 discQCount--; in FPT_autoCmdCmplt()
4771 FPT_BL_Card[p_card].discQ_Tbl[currSCCB-> in FPT_autoCmdCmplt()
4777 discQCount--; in FPT_autoCmdCmplt()
4780 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4790 if (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4792 FPT_sccbMgrTbl[p_card][currSCCB-> in FPT_autoCmdCmplt()
4796 if (FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4798 FPT_sccbMgrTbl[p_card][currSCCB-> in FPT_autoCmdCmplt()
4805 if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) { in FPT_autoCmdCmplt()
4807 currSCCB->SccbStatus = SCCB_ERROR; in FPT_autoCmdCmplt()
4808 currSCCB->TargetStatus = status_byte; in FPT_autoCmdCmplt()
4812 FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4815 if (currSCCB->RequestSenseLength != in FPT_autoCmdCmplt()
4818 if (currSCCB->RequestSenseLength == 0) in FPT_autoCmdCmplt()
4819 currSCCB->RequestSenseLength = in FPT_autoCmdCmplt()
4830 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4834 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4835 TarLUNBusy[currSCCB->Lun] = in FPT_autoCmdCmplt()
4840 discQCount--; in FPT_autoCmdCmplt()
4844 [currSCCB-> in FPT_autoCmdCmplt()
4847 [currSCCB->Lun]] = in FPT_autoCmdCmplt()
4851 [currSCCB->TargID]. in FPT_autoCmdCmplt()
4853 if (currSCCB->Sccb_tag) { in FPT_autoCmdCmplt()
4858 discQCount--; in FPT_autoCmdCmplt()
4860 discQ_Tbl[currSCCB-> in FPT_autoCmdCmplt()
4868 discQCount--; in FPT_autoCmdCmplt()
4872 [p_card][currSCCB-> in FPT_autoCmdCmplt()
4885 ((FPT_sccbMgrTbl[p_card][currSCCB->TargID]. in FPT_autoCmdCmplt()
4887 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB-> in FPT_autoCmdCmplt()
4890 FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0; in FPT_autoCmdCmplt()
4898 /*---------------------------------------------------------------------
4914 *---------------------------------------------------------------------*/
4920 currSCCB = pCurrCard->currentSCCB; in FPT_dataXferProcessor()
4922 if (currSCCB->Sccb_XferState & F_SG_XFER) { in FPT_dataXferProcessor()
4923 if (pCurrCard->globalFlags & F_HOST_XFER_ACT) in FPT_dataXferProcessor()
4925 currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT; in FPT_dataXferProcessor()
4926 currSCCB->Sccb_SGoffset = 0x00; in FPT_dataXferProcessor()
4928 pCurrCard->globalFlags |= F_HOST_XFER_ACT; in FPT_dataXferProcessor()
4934 if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) { in FPT_dataXferProcessor()
4935 pCurrCard->globalFlags |= F_HOST_XFER_ACT; in FPT_dataXferProcessor()
4942 /*---------------------------------------------------------------------
4948 *---------------------------------------------------------------------*/
4957 if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) in FPT_busMstrSGDataXferStart()
4964 sg_index = pcurrSCCB->Sccb_sgseg; in FPT_busMstrSGDataXferStart()
4974 pcurrSCCB->DataLength)) { in FPT_busMstrSGDataXferStart()
4976 segp = (struct blogic_sg_seg *)(pcurrSCCB->DataPointer) + in FPT_busMstrSGDataXferStart()
4978 tmpSGCnt += segp->segbytes; in FPT_busMstrSGDataXferStart()
4979 count |= segp->segbytes; in FPT_busMstrSGDataXferStart()
4980 addr = segp->segdata; in FPT_busMstrSGDataXferStart()
4982 if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) { in FPT_busMstrSGDataXferStart()
4984 ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset); in FPT_busMstrSGDataXferStart()
4986 (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset; in FPT_busMstrSGDataXferStart()
5002 pcurrSCCB->Sccb_XferCnt = tmpSGCnt; in FPT_busMstrSGDataXferStart()
5006 if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { in FPT_busMstrSGDataXferStart()
5020 pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT; in FPT_busMstrSGDataXferStart()
5021 tmpSGCnt--; in FPT_busMstrSGDataXferStart()
5035 /*---------------------------------------------------------------------
5041 *---------------------------------------------------------------------*/
5046 if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) { in FPT_busMstrDataXferStart()
5048 count = pcurrSCCB->Sccb_XferCnt; in FPT_busMstrDataXferStart()
5050 addr = (u32)(unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC; in FPT_busMstrDataXferStart()
5054 addr = pcurrSCCB->SensePointer; in FPT_busMstrDataXferStart()
5055 count = pcurrSCCB->RequestSenseLength; in FPT_busMstrDataXferStart()
5061 if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) { in FPT_busMstrDataXferStart()
5083 /*---------------------------------------------------------------------
5094 *---------------------------------------------------------------------*/
5104 && timeout--) { in FPT_busMstrTimeOut()
5112 && timeout--) { in FPT_busMstrTimeOut()
5127 /*---------------------------------------------------------------------
5133 *---------------------------------------------------------------------*/
5145 if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) { in FPT_hostDataXferAbort()
5155 && timeout--) { in FPT_hostDataXferAbort()
5166 if (pCurrSCCB->HostStatus == 0x00) in FPT_hostDataXferAbort()
5168 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5179 if (pCurrSCCB->HostStatus == in FPT_hostDataXferAbort()
5182 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5189 else if (pCurrSCCB->Sccb_XferCnt) { in FPT_hostDataXferAbort()
5191 if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { in FPT_hostDataXferAbort()
5199 sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT; in FPT_hostDataXferAbort()
5202 (unsigned int)(pCurrSCCB->DataLength / in FPT_hostDataXferAbort()
5205 sg_ptr = (u32)(pCurrSCCB->DataLength / in FPT_hostDataXferAbort()
5209 remain_cnt = pCurrSCCB->Sccb_XferCnt; in FPT_hostDataXferAbort()
5213 sg_ptr--; in FPT_hostDataXferAbort()
5214 segp = (struct blogic_sg_seg *)(pCurrSCCB-> in FPT_hostDataXferAbort()
5216 if (remain_cnt > (unsigned long)segp->segbytes) in FPT_hostDataXferAbort()
5217 remain_cnt -= in FPT_hostDataXferAbort()
5218 (unsigned long)segp->segbytes; in FPT_hostDataXferAbort()
5225 pCurrSCCB->Sccb_SGoffset = remain_cnt; in FPT_hostDataXferAbort()
5227 pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr; in FPT_hostDataXferAbort()
5230 pCurrSCCB->DataLength && (remain_cnt == 0)) in FPT_hostDataXferAbort()
5232 pCurrSCCB->Sccb_XferState |= in FPT_hostDataXferAbort()
5238 if (pCurrSCCB->HostStatus == 0x00) { in FPT_hostDataXferAbort()
5240 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5246 if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) { in FPT_hostDataXferAbort()
5261 if (pCurrSCCB->HostStatus == in FPT_hostDataXferAbort()
5264 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5282 BM_THRESHOLD) && timeout--) { in FPT_hostDataXferAbort()
5295 BM_CMD_BUSY) && timeout--) { in FPT_hostDataXferAbort()
5305 if (pCurrSCCB->HostStatus == 0x00) { in FPT_hostDataXferAbort()
5307 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5320 if (pCurrSCCB->HostStatus == 0x00) { in FPT_hostDataXferAbort()
5322 pCurrSCCB->HostStatus = in FPT_hostDataXferAbort()
5338 && timeout--) { in FPT_hostDataXferAbort()
5343 if (pCurrSCCB->HostStatus == 0x00) { in FPT_hostDataXferAbort()
5345 pCurrSCCB->HostStatus = SCCB_BM_ERR; in FPT_hostDataXferAbort()
5356 if (pCurrSCCB->HostStatus == 0x00) { in FPT_hostDataXferAbort()
5358 pCurrSCCB->HostStatus = SCCB_BM_ERR; in FPT_hostDataXferAbort()
5364 if (pCurrSCCB->Sccb_XferState & F_SG_XFER) { in FPT_hostDataXferAbort()
5372 pCurrSCCB->Sccb_sgseg += SG_BUF_CNT; in FPT_hostDataXferAbort()
5374 pCurrSCCB->Sccb_SGoffset = 0x00; in FPT_hostDataXferAbort()
5376 if ((u32)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >= in FPT_hostDataXferAbort()
5377 pCurrSCCB->DataLength) { in FPT_hostDataXferAbort()
5379 pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; in FPT_hostDataXferAbort()
5380 pCurrSCCB->Sccb_sgseg = in FPT_hostDataXferAbort()
5381 (unsigned short)(pCurrSCCB->DataLength / in FPT_hostDataXferAbort()
5387 if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE)) in FPT_hostDataXferAbort()
5388 pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED; in FPT_hostDataXferAbort()
5395 /*---------------------------------------------------------------------
5402 *---------------------------------------------------------------------*/
5409 if (currSCCB->Sccb_XferState & F_SG_XFER) { in FPT_hostDataXferRestart()
5411 currSCCB->Sccb_XferCnt = 0; in FPT_hostDataXferRestart()
5417 while (data_count < currSCCB->Sccb_ATC) { in FPT_hostDataXferRestart()
5420 segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) + in FPT_hostDataXferRestart()
5422 data_count += segp->segbytes; in FPT_hostDataXferRestart()
5425 if (data_count == currSCCB->Sccb_ATC) { in FPT_hostDataXferRestart()
5427 currSCCB->Sccb_SGoffset = 0; in FPT_hostDataXferRestart()
5432 currSCCB->Sccb_SGoffset = in FPT_hostDataXferRestart()
5433 data_count - currSCCB->Sccb_ATC; in FPT_hostDataXferRestart()
5436 currSCCB->Sccb_sgseg = (unsigned short)sg_index; in FPT_hostDataXferRestart()
5440 currSCCB->Sccb_XferCnt = in FPT_hostDataXferRestart()
5441 currSCCB->DataLength - currSCCB->Sccb_ATC; in FPT_hostDataXferRestart()
5445 /*---------------------------------------------------------------------
5451 *---------------------------------------------------------------------*/
5465 p_port = currCard->ioPort; in FPT_scini()
5466 pCurrNvRam = currCard->pNvRamInfo; in FPT_scini()
5469 ScamFlg = pCurrNvRam->niScamConf; in FPT_scini()
5470 i = pCurrNvRam->niSysConf; in FPT_scini()
5555 currCard-> in FPT_scini()
5594 currCard->ourId = in FPT_scini()
5606 FPT_scamInfo[currCard-> in FPT_scini()
5609 FPT_scamInfo[currCard-> in FPT_scini()
5634 if (currCard->globalFlags & F_UPDATE_EEPROM) { in FPT_scini()
5636 currCard->globalFlags &= ~F_UPDATE_EEPROM; in FPT_scini()
5649 currCard->globalFlags |= F_SINGLE_DEVICE; in FPT_scini()
5651 currCard->globalFlags &= ~F_SINGLE_DEVICE; in FPT_scini()
5655 /*---------------------------------------------------------------------
5661 *---------------------------------------------------------------------*/
5717 /*---------------------------------------------------------------------
5723 *---------------------------------------------------------------------*/
5749 /*---------------------------------------------------------------------
5755 *---------------------------------------------------------------------*/
5808 scam_id += 0x08; /*Count number of zeros in DB0-3. */ in FPT_scasid()
5826 /*---------------------------------------------------------------------
5832 *---------------------------------------------------------------------*/
5860 /*---------------------------------------------------------------------
5864 * Description: Handshake the p_data (DB4-0) across the bus.
5866 *---------------------------------------------------------------------*/
5872 curr_data = p_data | BIT(7) | BIT(5); /*Start with DB7 & DB5 asserted. */ in FPT_scxferc()
5880 FPT_scwirod(p_port, BIT(7)); /*Wait for DB7 to be released. */ in FPT_scxferc()
5909 /*---------------------------------------------------------------------
5916 *---------------------------------------------------------------------*/
5961 /*---------------------------------------------------------------------
5967 *---------------------------------------------------------------------*/
6018 /*---------------------------------------------------------------------
6025 *---------------------------------------------------------------------*/
6045 /*---------------------------------------------------------------------
6052 *---------------------------------------------------------------------*/
6072 /*---------------------------------------------------------------------
6078 *---------------------------------------------------------------------*/
6086 p_quintet -= 0x80; in FPT_scvalq()
6096 /*---------------------------------------------------------------------
6104 *---------------------------------------------------------------------*/
6180 /*---------------------------------------------------------------------
6186 *---------------------------------------------------------------------*/
6194 /*---------------------------------------------------------------------
6200 *---------------------------------------------------------------------*/
6221 pCurrNvRam->niScamTbl[i][k]; in FPT_inisci()
6263 /*---------------------------------------------------------------------
6270 *---------------------------------------------------------------------*/
6306 i--; in FPT_scmachid()
6323 match--; in FPT_scmachid()
6329 match = MAX_SCSI_TAR - 1; in FPT_scmachid()
6350 i--; in FPT_scmachid()
6367 match--; in FPT_scmachid()
6373 match = MAX_SCSI_TAR - 1; in FPT_scmachid()
6380 /*---------------------------------------------------------------------
6386 *---------------------------------------------------------------------*/
6425 /*---------------------------------------------------------------------
6431 *---------------------------------------------------------------------*/
6474 /*---------------------------------------------------------------------
6480 *---------------------------------------------------------------------*/
6500 /*---------------------------------------------------------------------
6507 *---------------------------------------------------------------------*/
6618 temp += 0x5442; /* BT- 930 */ in FPT_DiagEEPROM()
6656 /*---------------------------------------------------------------------
6662 *---------------------------------------------------------------------*/
6671 scan_ptr = pCurrCard->scanIndex; in FPT_queueSearchSelect()
6674 if ((pCurrCard->globalFlags & F_CONLUN_IO) && in FPT_queueSearchSelect()
6675 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != in FPT_queueSearchSelect()
6677 if (currTar_Info->TarSelQ_Cnt != 0) { in FPT_queueSearchSelect()
6684 if (currTar_Info->TarLUNBusy[lun] == 0) { in FPT_queueSearchSelect()
6686 pCurrCard->currentSCCB = in FPT_queueSearchSelect()
6687 currTar_Info->TarSelQ_Head; in FPT_queueSearchSelect()
6690 while ((pCurrCard-> in FPT_queueSearchSelect()
6693 pCurrCard-> in FPT_queueSearchSelect()
6694 currentSCCB->Lun)) { in FPT_queueSearchSelect()
6696 pCurrCard-> in FPT_queueSearchSelect()
6698 pCurrCard->currentSCCB = in FPT_queueSearchSelect()
6700 *)(pCurrCard-> in FPT_queueSearchSelect()
6701 currentSCCB)-> in FPT_queueSearchSelect()
6704 if (pCurrCard->currentSCCB == in FPT_queueSearchSelect()
6708 pOldSccb-> in FPT_queueSearchSelect()
6711 *)(pCurrCard-> in FPT_queueSearchSelect()
6712 currentSCCB)-> in FPT_queueSearchSelect()
6714 pOldSccb-> in FPT_queueSearchSelect()
6717 *)(pCurrCard-> in FPT_queueSearchSelect()
6718 currentSCCB)-> in FPT_queueSearchSelect()
6720 currTar_Info-> in FPT_queueSearchSelect()
6721 TarSelQ_Cnt--; in FPT_queueSearchSelect()
6723 currTar_Info-> in FPT_queueSearchSelect()
6726 *)(pCurrCard-> in FPT_queueSearchSelect()
6727 currentSCCB)-> in FPT_queueSearchSelect()
6730 if (currTar_Info-> in FPT_queueSearchSelect()
6733 currTar_Info-> in FPT_queueSearchSelect()
6736 currTar_Info-> in FPT_queueSearchSelect()
6740 currTar_Info-> in FPT_queueSearchSelect()
6741 TarSelQ_Cnt--; in FPT_queueSearchSelect()
6742 currTar_Info-> in FPT_queueSearchSelect()
6743 TarSelQ_Head-> in FPT_queueSearchSelect()
6750 pCurrCard->scanIndex = scan_ptr; in FPT_queueSearchSelect()
6752 pCurrCard->globalFlags |= in FPT_queueSearchSelect()
6768 if ((currTar_Info->TarSelQ_Cnt != 0) && in FPT_queueSearchSelect()
6769 (currTar_Info->TarLUNBusy[0] == 0)) { in FPT_queueSearchSelect()
6771 pCurrCard->currentSCCB = in FPT_queueSearchSelect()
6772 currTar_Info->TarSelQ_Head; in FPT_queueSearchSelect()
6774 currTar_Info->TarSelQ_Head = in FPT_queueSearchSelect()
6775 (struct sccb *)(pCurrCard->currentSCCB)-> in FPT_queueSearchSelect()
6778 if (currTar_Info->TarSelQ_Head == NULL) { in FPT_queueSearchSelect()
6779 currTar_Info->TarSelQ_Tail = NULL; in FPT_queueSearchSelect()
6780 currTar_Info->TarSelQ_Cnt = 0; in FPT_queueSearchSelect()
6782 currTar_Info->TarSelQ_Cnt--; in FPT_queueSearchSelect()
6783 currTar_Info->TarSelQ_Head-> in FPT_queueSearchSelect()
6791 pCurrCard->scanIndex = scan_ptr; in FPT_queueSearchSelect()
6793 pCurrCard->globalFlags |= F_NEW_SCCB_CMD; in FPT_queueSearchSelect()
6805 } while (scan_ptr != pCurrCard->scanIndex); in FPT_queueSearchSelect()
6808 /*---------------------------------------------------------------------
6814 *---------------------------------------------------------------------*/
6822 if (pCurrCard->currentSCCB != NULL) { in FPT_queueSelectFail()
6824 (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))-> in FPT_queueSelectFail()
6828 pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL; in FPT_queueSelectFail()
6830 pCurrCard->currentSCCB->Sccb_forwardlink = in FPT_queueSelectFail()
6831 currTar_Info->TarSelQ_Head; in FPT_queueSelectFail()
6833 if (currTar_Info->TarSelQ_Cnt == 0) { in FPT_queueSelectFail()
6834 currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB; in FPT_queueSelectFail()
6838 currTar_Info->TarSelQ_Head->Sccb_backlink = in FPT_queueSelectFail()
6839 pCurrCard->currentSCCB; in FPT_queueSelectFail()
6842 currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB; in FPT_queueSelectFail()
6844 pCurrCard->currentSCCB = NULL; in FPT_queueSelectFail()
6845 currTar_Info->TarSelQ_Cnt++; in FPT_queueSelectFail()
6849 /*---------------------------------------------------------------------
6855 *---------------------------------------------------------------------*/
6865 SCSIcmd = p_sccb->Cdb[0]; in FPT_queueCmdComplete()
6867 if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) { in FPT_queueCmdComplete()
6869 if ((p_sccb-> in FPT_queueCmdComplete()
6871 && (p_sccb->HostStatus == SCCB_COMPLETE) in FPT_queueCmdComplete()
6872 && (p_sccb->TargetStatus != SSCHECK)) in FPT_queueCmdComplete()
6880 (pCurrCard->globalFlags & F_NO_FILTER) in FPT_queueCmdComplete()
6882 p_sccb->HostStatus = SCCB_DATA_UNDER_RUN; in FPT_queueCmdComplete()
6885 if (p_sccb->SccbStatus == SCCB_IN_PROCESS) { in FPT_queueCmdComplete()
6886 if (p_sccb->HostStatus || p_sccb->TargetStatus) in FPT_queueCmdComplete()
6887 p_sccb->SccbStatus = SCCB_ERROR; in FPT_queueCmdComplete()
6889 p_sccb->SccbStatus = SCCB_SUCCESS; in FPT_queueCmdComplete()
6892 if (p_sccb->Sccb_XferState & F_AUTO_SENSE) { in FPT_queueCmdComplete()
6894 p_sccb->CdbLength = p_sccb->Save_CdbLen; in FPT_queueCmdComplete()
6896 p_sccb->Cdb[i] = p_sccb->Save_Cdb[i]; in FPT_queueCmdComplete()
6900 if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) || in FPT_queueCmdComplete()
6901 (p_sccb->OperationCode == RESIDUAL_COMMAND)) { in FPT_queueCmdComplete()
6906 pCurrCard->cmdCounter--; in FPT_queueCmdComplete()
6907 if (!pCurrCard->cmdCounter) { in FPT_queueCmdComplete()
6909 if (pCurrCard->globalFlags & F_GREEN_PC) { in FPT_queueCmdComplete()
6910 WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0, in FPT_queueCmdComplete()
6912 WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK); in FPT_queueCmdComplete()
6915 WR_HARPOON(pCurrCard->ioPort + hp_semaphore, in FPT_queueCmdComplete()
6916 (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) & in FPT_queueCmdComplete()
6921 if (pCurrCard->discQCount != 0) { in FPT_queueCmdComplete()
6922 currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; in FPT_queueCmdComplete()
6923 if (((pCurrCard->globalFlags & F_CONLUN_IO) && in FPT_queueCmdComplete()
6924 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != in FPT_queueCmdComplete()
6926 pCurrCard->discQCount--; in FPT_queueCmdComplete()
6927 pCurrCard->discQ_Tbl[currTar_Info-> in FPT_queueCmdComplete()
6928 LunDiscQ_Idx[p_sccb->Lun]] = NULL; in FPT_queueCmdComplete()
6930 if (p_sccb->Sccb_tag) { in FPT_queueCmdComplete()
6931 pCurrCard->discQCount--; in FPT_queueCmdComplete()
6932 pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL; in FPT_queueCmdComplete()
6934 pCurrCard->discQCount--; in FPT_queueCmdComplete()
6935 pCurrCard->discQ_Tbl[currTar_Info-> in FPT_queueCmdComplete()
6942 callback = (CALL_BK_FN) p_sccb->SccbCallback; in FPT_queueCmdComplete()
6944 pCurrCard->globalFlags |= F_NEW_SCCB_CMD; in FPT_queueCmdComplete()
6945 pCurrCard->currentSCCB = NULL; in FPT_queueCmdComplete()
6948 /*---------------------------------------------------------------------
6954 *---------------------------------------------------------------------*/
6959 currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID]; in FPT_queueDisconnect()
6962 ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) { in FPT_queueDisconnect()
6963 FPT_BL_Card[p_card].discQ_Tbl[currTar_Info-> in FPT_queueDisconnect()
6964 LunDiscQ_Idx[p_sccb->Lun]] = in FPT_queueDisconnect()
6967 if (p_sccb->Sccb_tag) { in FPT_queueDisconnect()
6968 FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = in FPT_queueDisconnect()
6970 FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = in FPT_queueDisconnect()
6972 FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++; in FPT_queueDisconnect()
6974 FPT_BL_Card[p_card].discQ_Tbl[currTar_Info-> in FPT_queueDisconnect()
6981 /*---------------------------------------------------------------------
6987 *---------------------------------------------------------------------*/
6997 thisTarg = (unsigned char)currSCCB->TargID; in FPT_queueFlushSccb()
7003 (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == in FPT_queueFlushSccb()
7006 FPT_BL_Card[p_card].discQ_Tbl[qtag]-> in FPT_queueFlushSccb()
7014 currTar_Info->TarTagQ_Cnt--; in FPT_queueFlushSccb()
7022 /*---------------------------------------------------------------------
7028 *---------------------------------------------------------------------*/
7041 (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) { in FPT_queueFlushTargSccb()
7043 FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = in FPT_queueFlushTargSccb()
7051 currTar_Info->TarTagQ_Cnt--; in FPT_queueFlushTargSccb()
7061 currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; in FPT_queueAddSccb()
7063 p_SCCB->Sccb_forwardlink = NULL; in FPT_queueAddSccb()
7065 p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail; in FPT_queueAddSccb()
7067 if (currTar_Info->TarSelQ_Cnt == 0) { in FPT_queueAddSccb()
7069 currTar_Info->TarSelQ_Head = p_SCCB; in FPT_queueAddSccb()
7074 currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB; in FPT_queueAddSccb()
7077 currTar_Info->TarSelQ_Tail = p_SCCB; in FPT_queueAddSccb()
7078 currTar_Info->TarSelQ_Cnt++; in FPT_queueAddSccb()
7081 /*---------------------------------------------------------------------
7088 *---------------------------------------------------------------------*/
7096 currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID]; in FPT_queueFindSccb()
7098 q_ptr = currTar_Info->TarSelQ_Head; in FPT_queueFindSccb()
7104 if (currTar_Info->TarSelQ_Head == q_ptr) { in FPT_queueFindSccb()
7106 currTar_Info->TarSelQ_Head = in FPT_queueFindSccb()
7107 q_ptr->Sccb_forwardlink; in FPT_queueFindSccb()
7110 if (currTar_Info->TarSelQ_Tail == q_ptr) { in FPT_queueFindSccb()
7112 currTar_Info->TarSelQ_Tail = in FPT_queueFindSccb()
7113 q_ptr->Sccb_backlink; in FPT_queueFindSccb()
7116 if (q_ptr->Sccb_forwardlink != NULL) { in FPT_queueFindSccb()
7117 q_ptr->Sccb_forwardlink->Sccb_backlink = in FPT_queueFindSccb()
7118 q_ptr->Sccb_backlink; in FPT_queueFindSccb()
7121 if (q_ptr->Sccb_backlink != NULL) { in FPT_queueFindSccb()
7122 q_ptr->Sccb_backlink->Sccb_forwardlink = in FPT_queueFindSccb()
7123 q_ptr->Sccb_forwardlink; in FPT_queueFindSccb()
7126 currTar_Info->TarSelQ_Cnt--; in FPT_queueFindSccb()
7132 q_ptr = q_ptr->Sccb_forwardlink; in FPT_queueFindSccb()
7140 /*---------------------------------------------------------------------
7146 * If Non-SG transfer then report Total Cnt - Actual Transfer
7151 *---------------------------------------------------------------------*/
7159 if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) { in FPT_utilUpdateResidual()
7161 p_SCCB->DataLength = 0x0000; in FPT_utilUpdateResidual()
7164 else if (p_SCCB->Sccb_XferState & F_SG_XFER) { in FPT_utilUpdateResidual()
7168 sg_index = p_SCCB->Sccb_sgseg; in FPT_utilUpdateResidual()
7171 if (p_SCCB->Sccb_SGoffset) { in FPT_utilUpdateResidual()
7173 partial_cnt = p_SCCB->Sccb_SGoffset; in FPT_utilUpdateResidual()
7178 (unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) { in FPT_utilUpdateResidual()
7179 segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) + in FPT_utilUpdateResidual()
7181 partial_cnt += segp->segbytes; in FPT_utilUpdateResidual()
7185 p_SCCB->DataLength = partial_cnt; in FPT_utilUpdateResidual()
7190 p_SCCB->DataLength -= p_SCCB->Sccb_ATC; in FPT_utilUpdateResidual()
7194 /*---------------------------------------------------------------------
7200 *---------------------------------------------------------------------*/
7218 /*---------------------------------------------------------------------
7224 *---------------------------------------------------------------------*/
7263 /*---------------------------------------------------------------------
7270 *---------------------------------------------------------------------*/
7292 /*---------------------------------------------------------------------
7299 *---------------------------------------------------------------------*/
7343 /*---------------------------------------------------------------------
7350 *---------------------------------------------------------------------*/
7373 /*---------------------------------------------------------------------
7380 *---------------------------------------------------------------------*/
7420 /*---------------------------------------------------------------------
7427 *---------------------------------------------------------------------*/