• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/src/linux/linux-2.6/drivers/scsi/

Lines Matching defs:pCurHcb

191 static SCB *tul_find_busy_scb(HCS * pCurHcb, WORD tarlun);
192 static SCB *tul_find_done_scb(HCS * pCurHcb);
194 static int tulip_main(HCS * pCurHcb);
196 static int tul_next_state(HCS * pCurHcb);
197 static int tul_state_1(HCS * pCurHcb);
198 static int tul_state_2(HCS * pCurHcb);
199 static int tul_state_3(HCS * pCurHcb);
200 static int tul_state_4(HCS * pCurHcb);
201 static int tul_state_5(HCS * pCurHcb);
202 static int tul_state_6(HCS * pCurHcb);
203 static int tul_state_7(HCS * pCurHcb);
204 static int tul_xfer_data_in(HCS * pCurHcb);
205 static int tul_xfer_data_out(HCS * pCurHcb);
206 static int tul_xpad_in(HCS * pCurHcb);
207 static int tul_xpad_out(HCS * pCurHcb);
208 static int tul_status_msg(HCS * pCurHcb);
210 static int tul_msgin(HCS * pCurHcb);
211 static int tul_msgin_sync(HCS * pCurHcb);
212 static int tul_msgin_accept(HCS * pCurHcb);
213 static int tul_msgout_reject(HCS * pCurHcb);
214 static int tul_msgin_extend(HCS * pCurHcb);
216 static int tul_msgout_ide(HCS * pCurHcb);
217 static int tul_msgout_abort_targ(HCS * pCurHcb);
218 static int tul_msgout_abort_tag(HCS * pCurHcb);
220 static int tul_bus_device_reset(HCS * pCurHcb);
221 static void tul_select_atn(HCS * pCurHcb, SCB * pCurScb);
222 static void tul_select_atn3(HCS * pCurHcb, SCB * pCurScb);
223 static void tul_select_atn_stop(HCS * pCurHcb, SCB * pCurScb);
224 static int int_tul_busfree(HCS * pCurHcb);
225 static int int_tul_scsi_rst(HCS * pCurHcb);
226 static int int_tul_bad_seq(HCS * pCurHcb);
227 static int int_tul_resel(HCS * pCurHcb);
228 static int tul_sync_done(HCS * pCurHcb);
229 static int wdtr_done(HCS * pCurHcb);
230 static int wait_tulip(HCS * pCurHcb);
231 static int tul_wait_done_disc(HCS * pCurHcb);
232 static int tul_wait_disc(HCS * pCurHcb);
233 static void tulip_scsi(HCS * pCurHcb);
234 static int tul_post_scsi_rst(HCS * pCurHcb);
602 static void tul_stop_bm(HCS * pCurHcb)
605 if (TUL_RD(pCurHcb->HCS_Base, TUL_XStatus) & XPEND) { /* if DMA xfer is pending, abort DMA xfer */
606 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_X_ABT | TAX_X_CLR_FIFO);
608 while ((TUL_RD(pCurHcb->HCS_Base, TUL_Int) & XABT) == 0);
610 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
614 static void get_tulipPCIConfig(HCS * pCurHcb, int ch_idx)
616 pCurHcb->HCS_Base = i91u_adpt[ch_idx].ADPT_BASE; /* Supply base address */
617 pCurHcb->HCS_BIOS = i91u_adpt[ch_idx].ADPT_BIOS; /* Supply BIOS address */
618 pCurHcb->HCS_Intr = i91u_adpt[ch_idx].ADPT_INTR; /* Supply interrupt line */
623 static int tul_reset_scsi(HCS * pCurHcb, int seconds)
625 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_RST_BUS);
627 while (!((pCurHcb->HCS_JSInt = TUL_RD(pCurHcb->HCS_Base, TUL_SInt)) & TSS_SCSIRST_INT));
630 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, 0);
636 TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
642 static int init_tulip(HCS * pCurHcb, SCB * scbp, int tul_num_scb,
650 pCurHcb->HCS_NumScbs = tul_num_scb;
651 pCurHcb->HCS_Semaph = 1;
652 spin_lock_init(&pCurHcb->HCS_SemaphLock);
653 pCurHcb->HCS_JSStatus0 = 0;
654 pCurHcb->HCS_Scb = scbp;
655 pCurHcb->HCS_NxtPend = scbp;
656 pCurHcb->HCS_NxtAvail = scbp;
664 pCurHcb->HCS_ScbEnd = pTmpScb;
665 pCurHcb->HCS_FirstAvail = scbp;
666 pCurHcb->HCS_LastAvail = pPrevScb;
667 spin_lock_init(&pCurHcb->HCS_AvailLock);
668 pCurHcb->HCS_FirstPend = NULL;
669 pCurHcb->HCS_LastPend = NULL;
670 pCurHcb->HCS_FirstBusy = NULL;
671 pCurHcb->HCS_LastBusy = NULL;
672 pCurHcb->HCS_FirstDone = NULL;
673 pCurHcb->HCS_LastDone = NULL;
674 pCurHcb->HCS_ActScb = NULL;
675 pCurHcb->HCS_ActTcs = NULL;
677 tul_read_eeprom(pCurHcb->HCS_Base);
680 pCurHcb->HCS_MaxTar = 8;
682 pCurHcb->HCS_MaxTar = 16;
684 pCurHcb->HCS_Config = i91unvramp->NVM_SCSIInfo[0].NVM_ChConfig1;
686 pCurHcb->HCS_SCSI_ID = i91unvramp->NVM_SCSIInfo[0].NVM_ChSCSIID;
687 pCurHcb->HCS_IdMask = ~(1 << pCurHcb->HCS_SCSI_ID);
691 TUL_WR(pCurHcb->HCS_Base + TUL_PCMD, TUL_RD(pCurHcb->HCS_Base, TUL_PCMD) | 0x40);
695 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x1F);
697 tul_stop_bm(pCurHcb);
699 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_RST_CHIP);
702 TUL_WR(pCurHcb->HCS_Base + TUL_SScsiId, pCurHcb->HCS_SCSI_ID << 4);
706 if (pCurHcb->HCS_Config & HCC_EN_PAR)
707 pCurHcb->HCS_SConf1 = (TSC_INITDEFAULT | TSC_EN_SCSI_PAR);
709 pCurHcb->HCS_SConf1 = (TSC_INITDEFAULT);
710 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurHcb->HCS_SConf1);
713 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT);
715 TUL_WR(pCurHcb->HCS_Base + TUL_SPeriod, 0);
718 TUL_WR(pCurHcb->HCS_Base + TUL_STimeOut, 153);
721 TUL_WR(pCurHcb->HCS_Base + TUL_XCtrl, (pCurHcb->HCS_Config & (HCC_ACT_TERM1 | HCC_ACT_TERM2)));
722 TUL_WR(pCurHcb->HCS_Base + TUL_GCTRL1,
723 ((pCurHcb->HCS_Config & HCC_AUTO_TERM) >> 4) | (TUL_RD(pCurHcb->HCS_Base, TUL_GCTRL1) & 0xFE));
728 i < pCurHcb->HCS_MaxTar;
730 pCurHcb->HCS_Tcs[i].TCS_Flags = *pwFlags & ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
731 if (pCurHcb->HCS_Tcs[i].TCS_Flags & TCF_EN_255)
732 pCurHcb->HCS_Tcs[i].TCS_DrvFlags = TCF_DRV_255_63;
734 pCurHcb->HCS_Tcs[i].TCS_DrvFlags = 0;
735 pCurHcb->HCS_Tcs[i].TCS_JS_Period = 0;
736 pCurHcb->HCS_Tcs[i].TCS_SConfig0 = pCurHcb->HCS_SConf1;
737 pCurHcb->HCS_Tcs[i].TCS_DrvHead = *pbHeads++;
738 if (pCurHcb->HCS_Tcs[i].TCS_DrvHead == 255)
739 pCurHcb->HCS_Tcs[i].TCS_DrvFlags = TCF_DRV_255_63;
741 pCurHcb->HCS_Tcs[i].TCS_DrvFlags = 0;
742 pCurHcb->HCS_Tcs[i].TCS_DrvSector = *pbHeads++;
743 pCurHcb->HCS_Tcs[i].TCS_Flags &= ~TCF_BUSY;
744 pCurHcb->HCS_ActTags[i] = 0;
745 pCurHcb->HCS_MaxTags[i] = 0xFF;
748 pCurHcb->HCS_Base, pCurHcb->HCS_Intr,
749 pCurHcb->HCS_BIOS, pCurHcb->HCS_SCSI_ID);
751 if (pCurHcb->HCS_Config & HCC_SCSI_RESET) {
753 tul_reset_scsi(pCurHcb, seconds);
755 TUL_WR(pCurHcb->HCS_Base + TUL_SCFG1, 0x17);
756 TUL_WR(pCurHcb->HCS_Base + TUL_SIntEnable, 0xE9);
802 static void tul_append_pend_scb(HCS * pCurHcb, SCB * scbp)
810 if (pCurHcb->HCS_LastPend != NULL) {
811 pCurHcb->HCS_LastPend->SCB_NxtScb = scbp;
812 pCurHcb->HCS_LastPend = scbp;
814 pCurHcb->HCS_FirstPend = scbp;
815 pCurHcb->HCS_LastPend = scbp;
820 static void tul_push_pend_scb(HCS * pCurHcb, SCB * scbp)
827 if ((scbp->SCB_NxtScb = pCurHcb->HCS_FirstPend) != NULL) {
828 pCurHcb->HCS_FirstPend = scbp;
830 pCurHcb->HCS_FirstPend = scbp;
831 pCurHcb->HCS_LastPend = scbp;
836 static SCB *tul_find_first_pend_scb(HCS * pCurHcb)
841 pFirstPend = pCurHcb->HCS_FirstPend;
847 if ((pCurHcb->HCS_ActTags[pFirstPend->SCB_Target] == 0) &&
848 !(pCurHcb->HCS_Tcs[pFirstPend->SCB_Target].TCS_Flags & TCF_BUSY)) {
852 if ((pCurHcb->HCS_ActTags[pFirstPend->SCB_Target] >=
853 pCurHcb->HCS_MaxTags[pFirstPend->SCB_Target]) |
854 (pCurHcb->HCS_Tcs[pFirstPend->SCB_Target].TCS_Flags & TCF_BUSY)) {
867 static void tul_unlink_pend_scb(HCS * pCurHcb, SCB * pCurScb)
875 pPrevScb = pTmpScb = pCurHcb->HCS_FirstPend;
878 if (pTmpScb == pCurHcb->HCS_FirstPend) {
879 if ((pCurHcb->HCS_FirstPend = pTmpScb->SCB_NxtScb) == NULL)
880 pCurHcb->HCS_LastPend = NULL;
883 if (pTmpScb == pCurHcb->HCS_LastPend)
884 pCurHcb->HCS_LastPend = pPrevScb;
895 static void tul_append_busy_scb(HCS * pCurHcb, SCB * scbp)
902 pCurHcb->HCS_ActTags[scbp->SCB_Target]++;
904 pCurHcb->HCS_Tcs[scbp->SCB_Target].TCS_Flags |= TCF_BUSY;
907 if (pCurHcb->HCS_LastBusy != NULL) {
908 pCurHcb->HCS_LastBusy->SCB_NxtScb = scbp;
909 pCurHcb->HCS_LastBusy = scbp;
911 pCurHcb->HCS_FirstBusy = scbp;
912 pCurHcb->HCS_LastBusy = scbp;
917 static SCB *tul_pop_busy_scb(HCS * pCurHcb)
922 if ((pTmpScb = pCurHcb->HCS_FirstBusy) != NULL) {
923 if ((pCurHcb->HCS_FirstBusy = pTmpScb->SCB_NxtScb) == NULL)
924 pCurHcb->HCS_LastBusy = NULL;
927 pCurHcb->HCS_ActTags[pTmpScb->SCB_Target]--;
929 pCurHcb->HCS_Tcs[pTmpScb->SCB_Target].TCS_Flags &= ~TCF_BUSY;
938 static void tul_unlink_busy_scb(HCS * pCurHcb, SCB * pCurScb)
946 pPrevScb = pTmpScb = pCurHcb->HCS_FirstBusy;
949 if (pTmpScb == pCurHcb->HCS_FirstBusy) {
950 if ((pCurHcb->HCS_FirstBusy = pTmpScb->SCB_NxtScb) == NULL)
951 pCurHcb->HCS_LastBusy = NULL;
954 if (pTmpScb == pCurHcb->HCS_LastBusy)
955 pCurHcb->HCS_LastBusy = pPrevScb;
959 pCurHcb->HCS_ActTags[pTmpScb->SCB_Target]--;
961 pCurHcb->HCS_Tcs[pTmpScb->SCB_Target].TCS_Flags &= ~TCF_BUSY;
971 SCB *tul_find_busy_scb(HCS * pCurHcb, WORD tarlun)
977 pPrevScb = pTmpScb = pCurHcb->HCS_FirstBusy;
993 static void tul_append_done_scb(HCS * pCurHcb, SCB * scbp)
1002 if (pCurHcb->HCS_LastDone != NULL) {
1003 pCurHcb->HCS_LastDone->SCB_NxtScb = scbp;
1004 pCurHcb->HCS_LastDone = scbp;
1006 pCurHcb->HCS_FirstDone = scbp;
1007 pCurHcb->HCS_LastDone = scbp;
1012 SCB *tul_find_done_scb(HCS * pCurHcb)
1017 if ((pTmpScb = pCurHcb->HCS_FirstDone) != NULL) {
1018 if ((pCurHcb->HCS_FirstDone = pTmpScb->SCB_NxtScb) == NULL)
1019 pCurHcb->HCS_LastDone = NULL;
1029 static int tul_abort_srb(HCS * pCurHcb, struct scsi_cmnd *srbp)
1034 spin_lock_irqsave(&(pCurHcb->HCS_SemaphLock), flags);
1036 if ((pCurHcb->HCS_Semaph == 0) && (pCurHcb->HCS_ActScb == NULL)) {
1037 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x1F);
1040 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1042 tulip_main(pCurHcb);
1044 spin_lock_irqsave(&(pCurHcb->HCS_SemaphLock), flags);
1046 pCurHcb->HCS_Semaph = 1;
1047 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x0F);
1049 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1053 pPrevScb = pTmpScb = pCurHcb->HCS_FirstPend; /* Check Pend queue */
1057 if (pTmpScb == pCurHcb->HCS_ActScb) {
1058 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1060 } else if (pTmpScb == pCurHcb->HCS_FirstPend) {
1061 if ((pCurHcb->HCS_FirstPend = pTmpScb->SCB_NxtScb) == NULL)
1062 pCurHcb->HCS_LastPend = NULL;
1065 if (pTmpScb == pCurHcb->HCS_LastPend)
1066 pCurHcb->HCS_LastPend = pPrevScb;
1071 (*pTmpScb->SCB_Post) ((BYTE *) pCurHcb, (BYTE *) pTmpScb);
1072 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1079 pPrevScb = pTmpScb = pCurHcb->HCS_FirstBusy; /* Check Busy queue */
1084 if (pTmpScb == pCurHcb->HCS_ActScb) {
1085 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1088 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1091 pCurHcb->HCS_ActTags[pTmpScb->SCB_Target]--;
1092 if (pTmpScb == pCurHcb->HCS_FirstBusy) {
1093 if ((pCurHcb->HCS_FirstBusy = pTmpScb->SCB_NxtScb) == NULL)
1094 pCurHcb->HCS_LastBusy = NULL;
1097 if (pTmpScb == pCurHcb->HCS_LastBusy)
1098 pCurHcb->HCS_LastBusy = pPrevScb;
1106 (*pTmpScb->SCB_Post) ((BYTE *) pCurHcb, (BYTE *) pTmpScb);
1107 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1114 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1119 static int tul_bad_seq(HCS * pCurHcb)
1123 printk("tul_bad_seg c=%d\n", pCurHcb->HCS_Index);
1125 if ((pCurScb = pCurHcb->HCS_ActScb) != NULL) {
1126 tul_unlink_busy_scb(pCurHcb, pCurScb);
1129 tul_append_done_scb(pCurHcb, pCurScb);
1131 tul_stop_bm(pCurHcb);
1133 tul_reset_scsi(pCurHcb, 8); /* 7/29/98 */
1135 return (tul_post_scsi_rst(pCurHcb));
1140 static void tul_exec_scb(HCS * pCurHcb, SCB * pCurScb)
1149 spin_lock_irqsave(&(pCurHcb->HCS_SemaphLock), flags);
1151 tul_append_pend_scb(pCurHcb, pCurScb); /* Append this SCB to Pending queue */
1154 if (pCurHcb->HCS_Semaph == 1) {
1155 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x1F);
1157 pCurHcb->HCS_Semaph = 0;
1159 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1161 tulip_main(pCurHcb);
1163 spin_lock_irqsave(&(pCurHcb->HCS_SemaphLock), flags);
1165 pCurHcb->HCS_Semaph = 1;
1166 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x0F);
1168 spin_unlock_irqrestore(&(pCurHcb->HCS_SemaphLock), flags);
1173 static int tul_isr(HCS * pCurHcb)
1177 if (TUL_RD(pCurHcb->HCS_Base, TUL_Int) & TSS_INT_PENDING) {
1178 if (pCurHcb->HCS_Semaph == 1) {
1179 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x1F);
1181 pCurHcb->HCS_Semaph = 0;
1183 tulip_main(pCurHcb);
1185 pCurHcb->HCS_Semaph = 1;
1186 TUL_WR(pCurHcb->HCS_Base + TUL_Mask, 0x0F);
1194 int tulip_main(HCS * pCurHcb)
1200 tulip_scsi(pCurHcb); /* Call tulip_scsi */
1202 while ((pCurScb = tul_find_done_scb(pCurHcb)) != NULL) { /* find done entry */
1204 pCurHcb->HCS_MaxTags[pCurScb->SCB_Target] =
1205 pCurHcb->HCS_ActTags[pCurScb->SCB_Target] - 1;
1207 tul_append_pend_scb(pCurHcb, pCurScb);
1237 tul_push_pend_scb(pCurHcb, pCurScb);
1251 (*pCurScb->SCB_Post) ((BYTE *) pCurHcb, (BYTE *) pCurScb);
1256 if (TUL_RD(pCurHcb->HCS_Base, TUL_SStatus0) & TSS_INT_PENDING)
1259 if (pCurHcb->HCS_ActScb) { /* return to OS and wait for xfer_done_ISR/Selected_ISR */
1263 if (tul_find_first_pend_scb(pCurHcb) == NULL) {
1280 void tulip_scsi(HCS * pCurHcb)
1287 if ((pCurHcb->HCS_JSStatus0 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus0)) & TSS_INT_PENDING) {
1289 pCurHcb->HCS_Phase = pCurHcb->HCS_JSStatus0 & TSS_PH_MASK;
1290 pCurHcb->HCS_JSStatus1 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus1);
1291 pCurHcb->HCS_JSInt = TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
1292 if (pCurHcb->HCS_JSInt & TSS_SCSIRST_INT) { /* SCSI bus reset detected */
1293 int_tul_scsi_rst(pCurHcb);
1296 if (pCurHcb->HCS_JSInt & TSS_RESEL_INT) { /* if selected/reselected interrupt */
1297 if (int_tul_resel(pCurHcb) == 0)
1298 tul_next_state(pCurHcb);
1301 if (pCurHcb->HCS_JSInt & TSS_SEL_TIMEOUT) {
1302 int_tul_busfree(pCurHcb);
1305 if (pCurHcb->HCS_JSInt & TSS_DISC_INT) { /* BUS disconnection */
1306 int_tul_busfree(pCurHcb); /* unexpected bus free or sel timeout */
1309 if (pCurHcb->HCS_JSInt & (TSS_FUNC_COMP | TSS_BUS_SERV)) { /* func complete or Bus service */
1310 if ((pCurScb = pCurHcb->HCS_ActScb) != NULL)
1311 tul_next_state(pCurHcb);
1315 if (pCurHcb->HCS_ActScb != NULL)
1318 if ((pCurScb = tul_find_first_pend_scb(pCurHcb)) == NULL)
1322 TUL_WR(pCurHcb->HCS_Base + TUL_SScsiId,
1323 (pCurHcb->HCS_SCSI_ID << 4) | (pCurScb->SCB_Target & 0x0F));
1325 pCurTcb = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
1332 TUL_WR(pCurHcb->HCS_Base + TUL_SPeriod, pCurTcb->TCS_JS_Period);
1334 tul_select_atn_stop(pCurHcb, pCurScb);
1337 tul_select_atn_stop(pCurHcb, pCurScb);
1340 tul_select_atn3(pCurHcb, pCurScb);
1342 tul_select_atn(pCurHcb, pCurScb);
1346 while (wait_tulip(pCurHcb) != -1) {
1347 if (tul_next_state(pCurHcb) == -1)
1352 tul_select_atn_stop(pCurHcb, pCurScb);
1355 while (wait_tulip(pCurHcb) != -1) {
1356 if (tul_next_state(pCurHcb) == -1)
1361 if (tul_abort_srb(pCurHcb, pCurScb->SCB_Srb) != 0) {
1364 tul_unlink_pend_scb(pCurHcb, pCurScb);
1366 tul_release_scb(pCurHcb, pCurScb);
1369 tul_select_atn_stop(pCurHcb, pCurScb);
1375 tul_unlink_pend_scb(pCurHcb, pCurScb);
1377 tul_append_done_scb(pCurHcb, pCurScb);
1384 int tul_next_state(HCS * pCurHcb)
1388 next = pCurHcb->HCS_ActScb->SCB_NxtStat;
1392 next = tul_state_1(pCurHcb);
1395 next = tul_state_2(pCurHcb);
1398 next = tul_state_3(pCurHcb);
1401 next = tul_state_4(pCurHcb);
1404 next = tul_state_5(pCurHcb);
1407 next = tul_state_6(pCurHcb);
1410 next = tul_state_7(pCurHcb);
1413 return (tul_bus_device_reset(pCurHcb));
1415 return (tul_bad_seq(pCurHcb));
1425 int tul_state_1(HCS * pCurHcb)
1427 SCB *pCurScb = pCurHcb->HCS_ActScb;
1428 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
1433 tul_unlink_pend_scb(pCurHcb, pCurScb);
1434 tul_append_busy_scb(pCurHcb, pCurScb);
1436 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurTcb->TCS_SConfig0);
1438 if (pCurHcb->HCS_Phase == MSG_OUT) {
1440 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, (TSC_EN_BUS_IN | TSC_HW_RESELECT));
1442 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_Ident);
1445 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_TagMsg);
1446 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_TagId);
1452 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_EXTEND);
1453 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 2); /* Extended msg length */
1454 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 3); /* Sync request */
1455 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 1); /* Start from 16 bits */
1460 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_EXTEND);
1461 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 3); /* extended msg length */
1462 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 1); /* sync request */
1463 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, tul_rate_tbl[pCurTcb->TCS_Flags & TCF_SCSI_RATE]);
1464 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MAX_OFFSET); /* REQ/ACK offset */
1466 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1467 if (wait_tulip(pCurHcb) == -1)
1470 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1471 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, (TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)));
1479 int tul_state_2(HCS * pCurHcb)
1481 SCB *pCurScb = pCurHcb->HCS_ActScb;
1482 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
1487 tul_unlink_pend_scb(pCurHcb, pCurScb);
1488 tul_append_busy_scb(pCurHcb, pCurScb);
1490 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurTcb->TCS_SConfig0);
1492 if (pCurHcb->HCS_JSStatus1 & TSS_CMD_PH_CMP) {
1495 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1496 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, (TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)));
1502 int tul_state_3(HCS * pCurHcb)
1504 SCB *pCurScb = pCurHcb->HCS_ActScb;
1505 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
1512 switch (pCurHcb->HCS_Phase) {
1515 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_CDB[i]);
1516 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1517 if (wait_tulip(pCurHcb) == -1)
1519 if (pCurHcb->HCS_Phase == CMD_OUT) {
1520 return (tul_bad_seq(pCurHcb));
1526 if (tul_msgin(pCurHcb) == -1)
1531 if (tul_status_msg(pCurHcb) == -1)
1538 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_NOP); /* msg nop */
1539 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1540 if (wait_tulip(pCurHcb) == -1)
1546 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_EXTEND);
1547 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 3); /* ext. msg len */
1548 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 1); /* sync request */
1549 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, tul_rate_tbl[pCurTcb->TCS_Flags & TCF_SCSI_RATE]);
1550 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MAX_OFFSET); /* REQ/ACK offset */
1551 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1552 if (wait_tulip(pCurHcb) == -1)
1554 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1555 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7));
1561 return (tul_bad_seq(pCurHcb));
1568 int tul_state_4(HCS * pCurHcb)
1570 SCB *pCurScb = pCurHcb->HCS_ActScb;
1582 switch (pCurHcb->HCS_Phase) {
1588 if ((tul_status_msg(pCurHcb)) == -1)
1594 if (tul_msgin(pCurHcb) == -1)
1599 if (pCurHcb->HCS_JSStatus0 & TSS_PAR_ERROR) {
1602 if (tul_msgout_ide(pCurHcb) == -1)
1606 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_NOP); /* msg nop */
1607 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1608 if (wait_tulip(pCurHcb) == -1)
1614 return (tul_xfer_data_in(pCurHcb));
1617 return (tul_xfer_data_out(pCurHcb));
1620 return (tul_bad_seq(pCurHcb));
1628 int tul_state_5(HCS * pCurHcb)
1630 SCB *pCurScb = pCurHcb->HCS_ActScb;
1638 cnt = TUL_RDLONG(pCurHcb->HCS_Base, TUL_SCnt0) & 0x0FFFFFF;
1640 if (TUL_RD(pCurHcb->HCS_Base, TUL_XCmd) & 0x20) {
1643 if (pCurHcb->HCS_JSStatus0 & TSS_PAR_ERROR) {
1646 if (TUL_RD(pCurHcb->HCS_Base, TUL_XStatus) & XPEND) { /* DMA xfer pending, Send STOP */
1648 TUL_WR(pCurHcb->HCS_Base + TUL_XCtrl, TUL_RD(pCurHcb->HCS_Base, TUL_XCtrl) | 0x80);
1650 while (TUL_RD(pCurHcb->HCS_Base, TUL_XStatus) & XPEND);
1654 if ((TUL_RD(pCurHcb->HCS_Base, TUL_SStatus1) & TSS_XFER_CMP) == 0) {
1655 if (pCurHcb->HCS_ActTcs->TCS_JS_Period & TSC_WIDE_SCSI)
1656 cnt += (TUL_RD(pCurHcb->HCS_Base, TUL_SFifoCnt) & 0x1F) << 1;
1658 cnt += (TUL_RD(pCurHcb->HCS_Base, TUL_SFifoCnt) & 0x1F);
1660 if (TUL_RD(pCurHcb->HCS_Base, TUL_XStatus) & XPEND) { /* if DMA xfer is pending, abort DMA xfer */
1661 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_X_ABT);
1663 while ((TUL_RD(pCurHcb->HCS_Base, TUL_Int) & XABT) == 0);
1665 if ((cnt == 1) && (pCurHcb->HCS_Phase == DATA_OUT)) {
1666 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1667 if (wait_tulip(pCurHcb) == -1) {
1672 if ((TUL_RD(pCurHcb->HCS_Base, TUL_SStatus1) & TSS_XFER_CMP) == 0)
1673 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1714 int tul_state_6(HCS * pCurHcb)
1716 SCB *pCurScb = pCurHcb->HCS_ActScb;
1722 switch (pCurHcb->HCS_Phase) {
1724 if ((tul_status_msg(pCurHcb)) == -1)
1730 if ((tul_msgin(pCurHcb)) == -1)
1735 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_NOP); /* msg nop */
1736 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1737 if (wait_tulip(pCurHcb) == -1)
1742 return (tul_xpad_in(pCurHcb));
1745 return (tul_xpad_out(pCurHcb));
1748 return (tul_bad_seq(pCurHcb));
1754 int tul_state_7(HCS * pCurHcb)
1762 cnt = TUL_RD(pCurHcb->HCS_Base, TUL_SFifoCnt) & 0x1F;
1765 TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
1767 switch (pCurHcb->HCS_Phase) {
1770 return (tul_bad_seq(pCurHcb));
1777 int tul_xfer_data_in(HCS * pCurHcb)
1779 SCB *pCurScb = pCurHcb->HCS_ActScb;
1784 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, pCurScb->SCB_BufLen);
1786 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_DMA_IN); /* 7/25/95 */
1789 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XCntH, ((ULONG) pCurScb->SCB_SGLen) << 3);
1790 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XAddH, pCurScb->SCB_BufPtr);
1791 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_SG_IN);
1793 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XCntH, pCurScb->SCB_BufLen);
1794 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XAddH, pCurScb->SCB_BufPtr);
1795 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_X_IN);
1803 int tul_xfer_data_out(HCS * pCurHcb)
1805 SCB *pCurScb = pCurHcb->HCS_ActScb;
1810 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, pCurScb->SCB_BufLen);
1811 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_DMA_OUT);
1814 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XCntH, ((ULONG) pCurScb->SCB_SGLen) << 3);
1815 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XAddH, pCurScb->SCB_BufPtr);
1816 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_SG_OUT);
1818 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XCntH, pCurScb->SCB_BufLen);
1819 TUL_WRLONG(pCurHcb->HCS_Base + TUL_XAddH, pCurScb->SCB_BufPtr);
1820 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_X_OUT);
1829 int tul_xpad_in(HCS * pCurHcb)
1831 SCB *pCurScb = pCurHcb->HCS_ActScb;
1832 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
1839 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 2);
1841 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
1843 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
1844 if ((wait_tulip(pCurHcb)) == -1) {
1847 if (pCurHcb->HCS_Phase != DATA_IN) {
1848 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1851 TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
1855 int tul_xpad_out(HCS * pCurHcb)
1857 SCB *pCurScb = pCurHcb->HCS_ActScb;
1858 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
1865 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 2);
1867 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
1869 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 0);
1870 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1871 if ((wait_tulip(pCurHcb)) == -1) {
1874 if (pCurHcb->HCS_Phase != DATA_OUT) { /* Disable wide CPU to allow read 16 bits */
1875 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT);
1876 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1884 int tul_status_msg(HCS * pCurHcb)
1886 SCB *pCurScb = pCurHcb->HCS_ActScb;
1889 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_CMD_COMP);
1890 if ((wait_tulip(pCurHcb)) == -1) {
1894 pCurScb->SCB_TaStat = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
1896 if (pCurHcb->HCS_Phase == MSG_OUT) {
1897 if (pCurHcb->HCS_JSStatus0 & TSS_PAR_ERROR) {
1898 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_PARITY);
1900 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_NOP);
1902 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1903 return (wait_tulip(pCurHcb));
1905 if (pCurHcb->HCS_Phase == MSG_IN) {
1906 msg = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
1907 if (pCurHcb->HCS_JSStatus0 & TSS_PAR_ERROR) { /* Parity error */
1908 if ((tul_msgin_accept(pCurHcb)) == -1)
1910 if (pCurHcb->HCS_Phase != MSG_OUT)
1911 return (tul_bad_seq(pCurHcb));
1912 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_PARITY);
1913 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
1914 return (wait_tulip(pCurHcb));
1919 return (tul_bad_seq(pCurHcb));
1921 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1922 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_MSG_ACCEPT);
1923 return tul_wait_done_disc(pCurHcb);
1928 return (tul_msgin_accept(pCurHcb));
1931 return (tul_bad_seq(pCurHcb));
1937 int int_tul_busfree(HCS * pCurHcb)
1939 SCB *pCurScb = pCurHcb->HCS_ActScb;
1943 tul_unlink_pend_scb(pCurHcb, pCurScb);
1945 tul_append_done_scb(pCurHcb, pCurScb);
1947 tul_unlink_busy_scb(pCurHcb, pCurScb);
1949 tul_append_done_scb(pCurHcb, pCurScb);
1951 pCurHcb->HCS_ActScb = NULL;
1952 pCurHcb->HCS_ActTcs = NULL;
1954 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO); /* Flush SCSI FIFO */
1955 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, TSC_INITDEFAULT);
1956 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT); /* Enable HW reselect */
1963 static int int_tul_scsi_rst(HCS * pCurHcb)
1969 if (TUL_RD(pCurHcb->HCS_Base, TUL_XStatus) & 0x01) {
1970 TUL_WR(pCurHcb->HCS_Base + TUL_XCmd, TAX_X_ABT | TAX_X_CLR_FIFO);
1972 while ((TUL_RD(pCurHcb->HCS_Base, TUL_Int) & 0x04) == 0);
1973 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
1976 while ((pCurScb = tul_pop_busy_scb(pCurHcb)) != NULL) {
1978 tul_append_done_scb(pCurHcb, pCurScb);
1980 pCurHcb->HCS_ActScb = NULL;
1981 pCurHcb->HCS_ActTcs = NULL;
1984 for (i = 0; i < pCurHcb->HCS_MaxTar; i++) {
1985 pCurHcb->HCS_Tcs[i].TCS_Flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
1993 int int_tul_resel(HCS * pCurHcb)
2000 if ((pCurScb = pCurHcb->HCS_ActScb) != NULL) {
2004 pCurHcb->HCS_ActScb = NULL;
2007 tar = TUL_RD(pCurHcb->HCS_Base, TUL_SBusId);
2009 lun = TUL_RD(pCurHcb->HCS_Base, TUL_SIdent) & 0x0F;
2011 pCurTcb = &pCurHcb->HCS_Tcs[tar];
2012 pCurHcb->HCS_ActTcs = pCurTcb;
2013 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurTcb->TCS_SConfig0);
2014 TUL_WR(pCurHcb->HCS_Base + TUL_SPeriod, pCurTcb->TCS_JS_Period);
2019 if ((tul_msgin_accept(pCurHcb)) == -1)
2021 if (pCurHcb->HCS_Phase != MSG_IN)
2023 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
2024 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2025 if ((wait_tulip(pCurHcb)) == -1)
2027 msg = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo); /* Read Tag Message */
2032 if ((tul_msgin_accept(pCurHcb)) == -1)
2035 if (pCurHcb->HCS_Phase != MSG_IN)
2038 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
2039 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2040 if ((wait_tulip(pCurHcb)) == -1)
2042 tag = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo); /* Read Tag ID */
2043 pCurScb = pCurHcb->HCS_Scb + tag;
2045 return tul_msgout_abort_tag(pCurHcb);
2048 return tul_msgout_abort_tag(pCurHcb);
2050 pCurHcb->HCS_ActScb = pCurScb;
2051 if ((tul_msgin_accept(pCurHcb)) == -1)
2055 if ((pCurScb = tul_find_busy_scb(pCurHcb, tar | (lun << 8))) == NULL) {
2056 return tul_msgout_abort_targ(pCurHcb);
2058 pCurHcb->HCS_ActScb = pCurScb;
2060 if ((tul_msgin_accept(pCurHcb)) == -1)
2069 static int int_tul_bad_seq(HCS * pCurHcb)
2074 tul_reset_scsi(pCurHcb, 10);
2076 while ((pCurScb = tul_pop_busy_scb(pCurHcb)) != NULL) {
2078 tul_append_done_scb(pCurHcb, pCurScb);
2080 for (i = 0; i < pCurHcb->HCS_MaxTar; i++) {
2081 pCurHcb->HCS_Tcs[i].TCS_Flags &= ~(TCF_SYNC_DONE | TCF_WDTR_DONE);
2088 int tul_msgout_abort_targ(HCS * pCurHcb)
2091 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2092 if (tul_msgin_accept(pCurHcb) == -1)
2094 if (pCurHcb->HCS_Phase != MSG_OUT)
2095 return (tul_bad_seq(pCurHcb));
2097 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_ABORT);
2098 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2100 return tul_wait_disc(pCurHcb);
2104 int tul_msgout_abort_tag(HCS * pCurHcb)
2107 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2108 if (tul_msgin_accept(pCurHcb) == -1)
2110 if (pCurHcb->HCS_Phase != MSG_OUT)
2111 return (tul_bad_seq(pCurHcb));
2113 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_ABORT_TAG);
2114 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2116 return tul_wait_disc(pCurHcb);
2121 int tul_msgin(HCS * pCurHcb)
2127 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
2129 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
2130 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2131 if ((wait_tulip(pCurHcb)) == -1)
2134 switch (TUL_RD(pCurHcb->HCS_Base, TUL_SFifo)) {
2136 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_MSG_ACCEPT);
2138 return tul_wait_disc(pCurHcb);
2143 tul_msgin_accept(pCurHcb);
2147 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal,
2148 (TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)));
2149 pCurTcb = pCurHcb->HCS_ActTcs;
2151 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2153 tul_msgin_accept(pCurHcb);
2157 tul_msgin_extend(pCurHcb);
2161 tul_msgin_accept(pCurHcb);
2165 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2166 if (wait_tulip(pCurHcb) == -1)
2169 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 0); /* put pad */
2170 TUL_RD(pCurHcb->HCS_Base, TUL_SFifo); /* get IGNORE field */
2171 TUL_RD(pCurHcb->HCS_Base, TUL_SFifo); /* get pad */
2173 tul_msgin_accept(pCurHcb);
2178 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
2179 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_MSG_ACCEPT);
2180 return tul_wait_done_disc(pCurHcb);
2183 tul_msgout_reject(pCurHcb);
2186 if (pCurHcb->HCS_Phase != MSG_IN)
2187 return (pCurHcb->HCS_Phase);
2196 int tul_msgout_reject(HCS * pCurHcb)
2199 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2201 if ((tul_msgin_accept(pCurHcb)) == -1)
2204 if (pCurHcb->HCS_Phase == MSG_OUT) {
2205 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_REJ); /* Msg reject */
2206 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2207 return (wait_tulip(pCurHcb));
2209 return (pCurHcb->HCS_Phase);
2215 int tul_msgout_ide(HCS * pCurHcb)
2217 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_IDE); /* Initiator Detected Error */
2218 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2219 return (wait_tulip(pCurHcb));
2224 int tul_msgin_extend(HCS * pCurHcb)
2228 if (tul_msgin_accept(pCurHcb) != MSG_IN)
2229 return (pCurHcb->HCS_Phase);
2232 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
2233 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2234 if (wait_tulip(pCurHcb) == -1)
2237 len = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
2238 pCurHcb->HCS_Msg[0] = len;
2241 if ((tul_msgin_accept(pCurHcb)) != MSG_IN)
2242 return (pCurHcb->HCS_Phase);
2243 TUL_WRLONG(pCurHcb->HCS_Base + TUL_SCnt0, 1);
2244 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_IN);
2245 if (wait_tulip(pCurHcb) == -1)
2247 pCurHcb->HCS_Msg[idx++] = TUL_RD(pCurHcb->HCS_Base, TUL_SFifo);
2249 if (pCurHcb->HCS_Msg[1] == 1) { /* if it's synchronous data transfer request */
2250 if (pCurHcb->HCS_Msg[0] != 3) /* if length is not right */
2251 return (tul_msgout_reject(pCurHcb));
2252 if (pCurHcb->HCS_ActTcs->TCS_Flags & TCF_NO_SYNC_NEGO) { /* Set OFFSET=0 to do async, nego back */
2253 pCurHcb->HCS_Msg[3] = 0;
2255 if ((tul_msgin_sync(pCurHcb) == 0) &&
2256 (pCurHcb->HCS_ActTcs->TCS_Flags & TCF_SYNC_DONE)) {
2257 tul_sync_done(pCurHcb);
2258 return (tul_msgin_accept(pCurHcb));
2262 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2263 if ((tul_msgin_accept(pCurHcb)) != MSG_OUT)
2264 return (pCurHcb->HCS_Phase);
2266 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO);
2268 tul_sync_done(pCurHcb);
2270 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_EXTEND);
2271 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 3);
2272 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 1);
2273 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurHcb->HCS_Msg[2]);
2274 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurHcb->HCS_Msg[3]);
2276 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2277 return (wait_tulip(pCurHcb));
2279 if ((pCurHcb->HCS_Msg[0] != 2) || (pCurHcb->HCS_Msg[1] != 3))
2280 return (tul_msgout_reject(pCurHcb));
2282 if (pCurHcb->HCS_ActTcs->TCS_Flags & TCF_NO_WDTR) {
2283 pCurHcb->HCS_Msg[2] = 0;
2285 if (pCurHcb->HCS_Msg[2] > 2) /* > 32 bits */
2286 return (tul_msgout_reject(pCurHcb));
2287 if (pCurHcb->HCS_Msg[2] == 2) { /* == 32 */
2288 pCurHcb->HCS_Msg[2] = 1;
2290 if ((pCurHcb->HCS_ActTcs->TCS_Flags & TCF_NO_WDTR) == 0) {
2291 wdtr_done(pCurHcb);
2292 if ((pCurHcb->HCS_ActTcs->TCS_Flags & (TCF_SYNC_DONE | TCF_NO_SYNC_NEGO)) == 0)
2293 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2294 return (tul_msgin_accept(pCurHcb));
2298 TUL_WR(pCurHcb->HCS_Base + TUL_SSignal, ((TUL_RD(pCurHcb->HCS_Base, TUL_SSignal) & (TSC_SET_ACK | 7)) | TSC_SET_ATN));
2300 if (tul_msgin_accept(pCurHcb) != MSG_OUT)
2301 return (pCurHcb->HCS_Phase);
2303 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_EXTEND);
2304 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 2);
2305 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, 3);
2306 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurHcb->HCS_Msg[2]);
2307 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2308 return (wait_tulip(pCurHcb));
2312 int tul_msgin_sync(HCS * pCurHcb)
2316 default_period = tul_rate_tbl[pCurHcb->HCS_ActTcs->TCS_Flags & TCF_SCSI_RATE];
2317 if (pCurHcb->HCS_Msg[3] > MAX_OFFSET) {
2318 pCurHcb->HCS_Msg[3] = MAX_OFFSET;
2319 if (pCurHcb->HCS_Msg[2] < default_period) {
2320 pCurHcb->HCS_Msg[2] = default_period;
2323 if (pCurHcb->HCS_Msg[2] >= 59) { /* Change to async */
2324 pCurHcb->HCS_Msg[3] = 0;
2329 if (pCurHcb->HCS_Msg[3] == 0) {
2332 if (pCurHcb->HCS_Msg[2] < default_period) {
2333 pCurHcb->HCS_Msg[2] = default_period;
2336 if (pCurHcb->HCS_Msg[2] >= 59) {
2337 pCurHcb->HCS_Msg[3] = 0;
2345 int wdtr_done(HCS * pCurHcb)
2347 pCurHcb->HCS_ActTcs->TCS_Flags &= ~TCF_SYNC_DONE;
2348 pCurHcb->HCS_ActTcs->TCS_Flags |= TCF_WDTR_DONE;
2350 pCurHcb->HCS_ActTcs->TCS_JS_Period = 0;
2351 if (pCurHcb->HCS_Msg[2]) { /* if 16 bit */
2352 pCurHcb->HCS_ActTcs->TCS_JS_Period |= TSC_WIDE_SCSI;
2354 pCurHcb->HCS_ActTcs->TCS_SConfig0 &= ~TSC_ALT_PERIOD;
2355 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurHcb->HCS_ActTcs->TCS_SConfig0);
2356 TUL_WR(pCurHcb->HCS_Base + TUL_SPeriod, pCurHcb->HCS_ActTcs->TCS_JS_Period);
2362 int tul_sync_done(HCS * pCurHcb)
2366 pCurHcb->HCS_ActTcs->TCS_Flags |= TCF_SYNC_DONE;
2368 if (pCurHcb->HCS_Msg[3]) {
2369 pCurHcb->HCS_ActTcs->TCS_JS_Period |= pCurHcb->HCS_Msg[3];
2371 if (tul_rate_tbl[i] >= pCurHcb->HCS_Msg[2]) /* pick the big one */
2374 pCurHcb->HCS_ActTcs->TCS_JS_Period |= (i << 4);
2375 pCurHcb->HCS_ActTcs->TCS_SConfig0 |= TSC_ALT_PERIOD;
2377 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, pCurHcb->HCS_ActTcs->TCS_SConfig0);
2378 TUL_WR(pCurHcb->HCS_Base + TUL_SPeriod, pCurHcb->HCS_ActTcs->TCS_JS_Period);
2384 int tul_post_scsi_rst(HCS * pCurHcb)
2390 pCurHcb->HCS_ActScb = NULL;
2391 pCurHcb->HCS_ActTcs = NULL;
2392 pCurHcb->HCS_Flags = 0;
2394 while ((pCurScb = tul_pop_busy_scb(pCurHcb)) != NULL) {
2396 tul_append_done_scb(pCurHcb, pCurScb);
2399 pCurTcb = &pCurHcb->HCS_Tcs[0];
2400 for (i = 0; i < pCurHcb->HCS_MaxTar; pCurTcb++, i++) {
2404 pCurTcb->TCS_SConfig0 = pCurHcb->HCS_SConf1;
2405 pCurHcb->HCS_ActTags[0] = 0; /* 07/22/98 */
2406 pCurHcb->HCS_Tcs[i].TCS_Flags &= ~TCF_BUSY; /* 07/22/98 */
2413 void tul_select_atn_stop(HCS * pCurHcb, SCB * pCurScb)
2417 pCurHcb->HCS_ActScb = pCurScb;
2418 pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
2419 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SELATNSTOP);
2425 void tul_select_atn(HCS * pCurHcb, SCB * pCurScb)
2432 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_Ident);
2434 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_CDB[i]);
2435 pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
2436 pCurHcb->HCS_ActScb = pCurScb;
2437 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SEL_ATN);
2442 void tul_select_atn3(HCS * pCurHcb, SCB * pCurScb)
2449 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_Ident);
2450 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_TagMsg);
2451 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_TagId);
2453 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, pCurScb->SCB_CDB[i]);
2454 pCurHcb->HCS_ActTcs = &pCurHcb->HCS_Tcs[pCurScb->SCB_Target];
2455 pCurHcb->HCS_ActScb = pCurScb;
2456 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_SEL_ATN3);
2462 int tul_bus_device_reset(HCS * pCurHcb)
2464 SCB *pCurScb = pCurHcb->HCS_ActScb;
2465 TCS *pCurTcb = pCurHcb->HCS_ActTcs;
2469 if (pCurHcb->HCS_Phase != MSG_OUT) {
2470 return (int_tul_bad_seq(pCurHcb)); /* Unexpected phase */
2472 tul_unlink_pend_scb(pCurHcb, pCurScb);
2473 tul_release_scb(pCurHcb, pCurScb);
2481 pPrevScb = pTmpScb = pCurHcb->HCS_FirstBusy; /* Check Busy queue */
2486 if (pTmpScb == pCurHcb->HCS_FirstBusy) {
2487 if ((pCurHcb->HCS_FirstBusy = pTmpScb->SCB_NxtScb) == NULL)
2488 pCurHcb->HCS_LastBusy = NULL;
2491 if (pTmpScb == pCurHcb->HCS_LastBusy)
2492 pCurHcb->HCS_LastBusy = pPrevScb;
2495 tul_append_done_scb(pCurHcb, pTmpScb);
2504 TUL_WR(pCurHcb->HCS_Base + TUL_SFifo, MSG_DEVRST);
2505 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_XF_FIFO_OUT);
2507 return tul_wait_disc(pCurHcb);
2512 int tul_msgin_accept(HCS * pCurHcb)
2514 TUL_WR(pCurHcb->HCS_Base + TUL_SCmd, TSC_MSG_ACCEPT);
2515 return (wait_tulip(pCurHcb));
2519 int wait_tulip(HCS * pCurHcb)
2522 while (!((pCurHcb->HCS_JSStatus0 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus0))
2525 pCurHcb->HCS_JSInt = TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
2526 pCurHcb->HCS_Phase = pCurHcb->HCS_JSStatus0 & TSS_PH_MASK;
2527 pCurHcb->HCS_JSStatus1 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus1);
2529 if (pCurHcb->HCS_JSInt & TSS_RESEL_INT) { /* if SCSI bus reset detected */
2530 return (int_tul_resel(pCurHcb));
2532 if (pCurHcb->HCS_JSInt & TSS_SEL_TIMEOUT) { /* if selected/reselected timeout interrupt */
2533 return (int_tul_busfree(pCurHcb));
2535 if (pCurHcb->HCS_JSInt & TSS_SCSIRST_INT) { /* if SCSI bus reset detected */
2536 return (int_tul_scsi_rst(pCurHcb));
2538 if (pCurHcb->HCS_JSInt & TSS_DISC_INT) { /* BUS disconnection */
2539 if (pCurHcb->HCS_Flags & HCF_EXPECT_DONE_DISC) {
2540 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO); /* Flush SCSI FIFO */
2541 tul_unlink_busy_scb(pCurHcb, pCurHcb->HCS_ActScb);
2542 pCurHcb->HCS_ActScb->SCB_HaStat = 0;
2543 tul_append_done_scb(pCurHcb, pCurHcb->HCS_ActScb);
2544 pCurHcb->HCS_ActScb = NULL;
2545 pCurHcb->HCS_ActTcs = NULL;
2546 pCurHcb->HCS_Flags &= ~HCF_EXPECT_DONE_DISC;
2547 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, TSC_INITDEFAULT);
2548 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT); /* Enable HW reselect */
2551 if (pCurHcb->HCS_Flags & HCF_EXPECT_DISC) {
2552 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO); /* Flush SCSI FIFO */
2553 pCurHcb->HCS_ActScb = NULL;
2554 pCurHcb->HCS_ActTcs = NULL;
2555 pCurHcb->HCS_Flags &= ~HCF_EXPECT_DISC;
2556 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, TSC_INITDEFAULT);
2557 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT); /* Enable HW reselect */
2560 return (int_tul_busfree(pCurHcb));
2562 if (pCurHcb->HCS_JSInt & (TSS_FUNC_COMP | TSS_BUS_SERV)) {
2563 return (pCurHcb->HCS_Phase);
2565 return (pCurHcb->HCS_Phase);
2568 int tul_wait_disc(HCS * pCurHcb)
2571 while (!((pCurHcb->HCS_JSStatus0 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus0))
2575 pCurHcb->HCS_JSInt = TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
2577 if (pCurHcb->HCS_JSInt & TSS_SCSIRST_INT) { /* if SCSI bus reset detected */
2578 return (int_tul_scsi_rst(pCurHcb));
2580 if (pCurHcb->HCS_JSInt & TSS_DISC_INT) { /* BUS disconnection */
2581 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO); /* Flush SCSI FIFO */
2582 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, TSC_INITDEFAULT);
2583 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT); /* Enable HW reselect */
2584 pCurHcb->HCS_ActScb = NULL;
2587 return (tul_bad_seq(pCurHcb));
2591 int tul_wait_done_disc(HCS * pCurHcb)
2595 while (!((pCurHcb->HCS_JSStatus0 = TUL_RD(pCurHcb->HCS_Base, TUL_SStatus0))
2598 pCurHcb->HCS_JSInt = TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
2601 if (pCurHcb->HCS_JSInt & TSS_SCSIRST_INT) { /* if SCSI bus reset detected */
2602 return (int_tul_scsi_rst(pCurHcb));
2604 if (pCurHcb->HCS_JSInt & TSS_DISC_INT) { /* BUS disconnection */
2605 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl0, TSC_FLUSH_FIFO); /* Flush SCSI FIFO */
2606 TUL_WR(pCurHcb->HCS_Base + TUL_SConfig, TSC_INITDEFAULT);
2607 TUL_WR(pCurHcb->HCS_Base + TUL_SCtrl1, TSC_HW_RESELECT); /* Enable HW reselect */
2608 tul_unlink_busy_scb(pCurHcb, pCurHcb->HCS_ActScb);
2610 tul_append_done_scb(pCurHcb, pCurHcb->HCS_ActScb);
2611 pCurHcb->HCS_ActScb = NULL;
2614 return (tul_bad_seq(pCurHcb));