aic7xxx_old.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:392k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1.         p->needppr &= ~mask;
  2.         p->needppr_copy &= ~mask;
  3.         p->needsdtr |= mask;
  4.         p->needsdtr_copy |= mask;
  5.         p->needwdtr |= mask;
  6.         p->needwdtr_copy |= mask;
  7.       }
  8.     }
  9.   }
  10.   queue_depth = p->dev_temp_queue_depth[tindex];
  11.   if (queue_depth >= p->dev_active_cmds[tindex])
  12.   {
  13.     scbp = scbq_remove_head(&p->delayed_scbs[tindex]);
  14.     if (scbp)
  15.     {
  16.       if (queue_depth == 1)
  17.       {
  18.         /*
  19.          * Give extra preference to untagged devices, such as CD-R devices
  20.          * This makes it more likely that a drive *won't* stuff up while
  21.          * waiting on data at a critical time, such as CD-R writing and
  22.          * audio CD ripping operations.  Should also benefit tape drives.
  23.          */
  24.         scbq_insert_head(&p->waiting_scbs, scbp);
  25.       }
  26.       else
  27.       {
  28.         scbq_insert_tail(&p->waiting_scbs, scbp);
  29.       }
  30. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  31.       if (aic7xxx_verbose > 0xffff)
  32.         printk(INFO_LEAD "Moving SCB from delayed to waiting queue.n",
  33.                p->host_no, CTL_OF_SCB(scbp));
  34. #endif
  35.       if (queue_depth > p->dev_active_cmds[tindex])
  36.       {
  37.         scbp = scbq_remove_head(&p->delayed_scbs[tindex]);
  38.         if (scbp)
  39.           scbq_insert_tail(&p->waiting_scbs, scbp);
  40.       }
  41.     }
  42.   }
  43.   if (!(scb->tag_action))
  44.   {
  45.     aic7xxx_index_busy_target(p, scb->hscb->target_channel_lun,
  46.                               /* unbusy */ TRUE);
  47.     if (p->tagenable & (1<<tindex))
  48.     {
  49.       p->dev_temp_queue_depth[tindex] = p->dev_max_queue_depth[tindex];
  50.     }
  51.   }
  52.   if(scb->flags & SCB_DTR_SCB)
  53.   {
  54.     p->dtr_pending &= ~(1 << tindex);
  55.   }
  56.   p->dev_active_cmds[tindex]--;
  57.   p->activescbs--;
  58.   {
  59.     int actual;
  60.     /*
  61.      * XXX: we should actually know how much actually transferred
  62.      * XXX: for each command, but apparently that's too difficult.
  63.      * 
  64.      * We set a lower limit of 512 bytes on the transfer length.  We
  65.      * ignore anything less than this because we don't have a real
  66.      * reason to count it.  Read/Writes to tapes are usually about 20K
  67.      * and disks are a minimum of 512 bytes unless you want to count
  68.      * non-read/write commands (such as TEST_UNIT_READY) which we don't
  69.      */
  70.     actual = scb->sg_length;
  71.     if ((actual >= 512) && (((cmd->result >> 16) & 0xf) == DID_OK))
  72.     {
  73.       struct aic7xxx_xferstats *sp;
  74. #ifdef AIC7XXX_PROC_STATS
  75.       long *ptr;
  76.       int x;
  77. #endif /* AIC7XXX_PROC_STATS */
  78.       sp = &p->stats[TARGET_INDEX(cmd)];
  79.       /*
  80.        * For block devices, cmd->request.cmd is always == either READ or
  81.        * WRITE.  For character devices, this isn't always set properly, so
  82.        * we check data_cmnd[0].  This catches the conditions for st.c, but
  83.        * I'm still not sure if request.cmd is valid for sg devices.
  84.        */
  85.       if ( (cmd->request.cmd == WRITE) || (cmd->data_cmnd[0] == WRITE_6) ||
  86.            (cmd->data_cmnd[0] == WRITE_FILEMARKS) )
  87.       {
  88.         sp->w_total++;
  89. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  90.         if ( (sp->w_total > 16) && (aic7xxx_verbose > 0xffff) )
  91.           aic7xxx_verbose &= 0xffff;
  92. #endif
  93. #ifdef AIC7XXX_PROC_STATS
  94.         ptr = sp->w_bins;
  95. #endif /* AIC7XXX_PROC_STATS */
  96.       }
  97.       else
  98.       {
  99.         sp->r_total++;
  100. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  101.         if ( (sp->r_total > 16) && (aic7xxx_verbose > 0xffff) )
  102.           aic7xxx_verbose &= 0xffff;
  103. #endif
  104. #ifdef AIC7XXX_PROC_STATS
  105.         ptr = sp->r_bins;
  106. #endif /* AIC7XXX_PROC_STATS */
  107.       }
  108. #ifdef AIC7XXX_PROC_STATS
  109.       x = -11;
  110.       while(actual)
  111.       {
  112.         actual >>= 1;
  113.         x++;
  114.       }
  115.       if (x < 0)
  116.       {
  117.         ptr[0]++;
  118.       }
  119.       else if (x > 7)
  120.       {
  121.         ptr[7]++;
  122.       }
  123.       else
  124.       {
  125.         ptr[x]++;
  126.       }
  127. #endif /* AIC7XXX_PROC_STATS */
  128.     }
  129.   }
  130.   aic7xxx_free_scb(p, scb);
  131.   aic7xxx_queue_cmd_complete(p, cmd);
  132. }
  133. /*+F*************************************************************************
  134.  * Function:
  135.  *   aic7xxx_run_done_queue
  136.  *
  137.  * Description:
  138.  *   Calls the aic7xxx_done() for the Scsi_Cmnd of each scb in the
  139.  *   aborted list, and adds each scb to the free list.  If complete
  140.  *   is TRUE, we also process the commands complete list.
  141.  *-F*************************************************************************/
  142. static void
  143. aic7xxx_run_done_queue(struct aic7xxx_host *p, /*complete*/ int complete)
  144. {
  145.   struct aic7xxx_scb *scb;
  146.   int i, found = 0;
  147.   for (i = 0; i < p->scb_data->numscbs; i++)
  148.   {
  149.     scb = p->scb_data->scb_array[i];
  150.     if (scb->flags & SCB_QUEUED_FOR_DONE)
  151.     {
  152.       if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  153.         printk(INFO_LEAD "Aborting scb %dn",
  154.              p->host_no, CTL_OF_SCB(scb), scb->hscb->tag);
  155.       found++;
  156.       /*
  157.        * Clear any residual information since the normal aic7xxx_done() path
  158.        * doesn't touch the residuals.
  159.        */
  160.       scb->hscb->residual_SG_segment_count = 0;
  161.       scb->hscb->residual_data_count[0] = 0;
  162.       scb->hscb->residual_data_count[1] = 0;
  163.       scb->hscb->residual_data_count[2] = 0;
  164.       aic7xxx_done(p, scb);
  165.     }
  166.   }
  167.   if (aic7xxx_verbose & (VERBOSE_ABORT_RETURN | VERBOSE_RESET_RETURN))
  168.   {
  169.     printk(INFO_LEAD "%d commands found and queued for "
  170.         "completion.n", p->host_no, -1, -1, -1, found);
  171.   }
  172.   if (complete)
  173.   {
  174.     aic7xxx_done_cmds_complete(p);
  175.   }
  176. }
  177. /*+F*************************************************************************
  178.  * Function:
  179.  *   aic7xxx_abort_waiting_scb
  180.  *
  181.  * Description:
  182.  *   Manipulate the waiting for selection list and return the
  183.  *   scb that follows the one that we remove.
  184.  *-F*************************************************************************/
  185. static unsigned char
  186. aic7xxx_abort_waiting_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
  187.     unsigned char scbpos, unsigned char prev)
  188. {
  189.   unsigned char curscb, next;
  190.   /*
  191.    * Select the SCB we want to abort and pull the next pointer out of it.
  192.    */
  193.   curscb = aic_inb(p, SCBPTR);
  194.   aic_outb(p, scbpos, SCBPTR);
  195.   next = aic_inb(p, SCB_NEXT);
  196.   aic7xxx_add_curscb_to_free_list(p);
  197.   /*
  198.    * Update the waiting list
  199.    */
  200.   if (prev == SCB_LIST_NULL)
  201.   {
  202.     /*
  203.      * First in the list
  204.      */
  205.     aic_outb(p, next, WAITING_SCBH);
  206.   }
  207.   else
  208.   {
  209.     /*
  210.      * Select the scb that pointed to us and update its next pointer.
  211.      */
  212.     aic_outb(p, prev, SCBPTR);
  213.     aic_outb(p, next, SCB_NEXT);
  214.   }
  215.   /*
  216.    * Point us back at the original scb position and inform the SCSI
  217.    * system that the command has been aborted.
  218.    */
  219.   aic_outb(p, curscb, SCBPTR);
  220.   return (next);
  221. }
  222. /*+F*************************************************************************
  223.  * Function:
  224.  *   aic7xxx_search_qinfifo
  225.  *
  226.  * Description:
  227.  *   Search the queue-in FIFO for matching SCBs and conditionally
  228.  *   requeue.  Returns the number of matching SCBs.
  229.  *-F*************************************************************************/
  230. static int
  231. aic7xxx_search_qinfifo(struct aic7xxx_host *p, int target, int channel,
  232.     int lun, unsigned char tag, int flags, int requeue,
  233.     volatile scb_queue_type *queue)
  234. {
  235.   int      found;
  236.   unsigned char qinpos, qintail;
  237.   struct aic7xxx_scb *scbp;
  238.   found = 0;
  239.   qinpos = aic_inb(p, QINPOS);
  240.   qintail = p->qinfifonext;
  241.   p->qinfifonext = qinpos;
  242.   while (qinpos != qintail)
  243.   {
  244.     scbp = p->scb_data->scb_array[p->qinfifo[qinpos++]];
  245.     if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
  246.     {
  247.        /*
  248.         * We found an scb that needs to be removed.
  249.         */
  250.        if (requeue && (queue != NULL))
  251.        {
  252.          if (scbp->flags & SCB_WAITINGQ)
  253.          {
  254.            scbq_remove(queue, scbp);
  255.            scbq_remove(&p->waiting_scbs, scbp);
  256.            scbq_remove(&p->delayed_scbs[TARGET_INDEX(scbp->cmd)], scbp);
  257.            p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
  258.            p->activescbs++;
  259.          }
  260.          scbq_insert_tail(queue, scbp);
  261.          p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]--;
  262.          p->activescbs--;
  263.          scbp->flags |= SCB_WAITINGQ;
  264.          if ( !(scbp->tag_action & TAG_ENB) )
  265.          {
  266.            aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
  267.              TRUE);
  268.          }
  269.        }
  270.        else if (requeue)
  271.        {
  272.          p->qinfifo[p->qinfifonext++] = scbp->hscb->tag;
  273.        }
  274.        else
  275.        {
  276.         /*
  277.          * Preserve any SCB_RECOVERY_SCB flags on this scb then set the
  278.          * flags we were called with, presumeably so aic7xxx_run_done_queue
  279.          * can find this scb
  280.          */
  281.          scbp->flags = flags | (scbp->flags & SCB_RECOVERY_SCB);
  282.          if (aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
  283.                                        FALSE) == scbp->hscb->tag)
  284.          {
  285.            aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
  286.              TRUE);
  287.          }
  288.        }
  289.        found++;
  290.     }
  291.     else
  292.     {
  293.       p->qinfifo[p->qinfifonext++] = scbp->hscb->tag;
  294.     }
  295.   }
  296.   /*
  297.    * Now that we've done the work, clear out any left over commands in the
  298.    * qinfifo and update the KERNEL_QINPOS down on the card.
  299.    *
  300.    *  NOTE: This routine expect the sequencer to already be paused when
  301.    *        it is run....make sure it's that way!
  302.    */
  303.   qinpos = p->qinfifonext;
  304.   while(qinpos != qintail)
  305.   {
  306.     p->qinfifo[qinpos++] = SCB_LIST_NULL;
  307.   }
  308.   if (p->features & AHC_QUEUE_REGS)
  309.     aic_outb(p, p->qinfifonext, HNSCB_QOFF);
  310.   else
  311.     aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
  312.   return (found);
  313. }
  314. /*+F*************************************************************************
  315.  * Function:
  316.  *   aic7xxx_scb_on_qoutfifo
  317.  *
  318.  * Description:
  319.  *   Is the scb that was passed to us currently on the qoutfifo?
  320.  *-F*************************************************************************/
  321. static int
  322. aic7xxx_scb_on_qoutfifo(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  323. {
  324.   int i=0;
  325.   while(p->qoutfifo[(p->qoutfifonext + i) & 0xff ] != SCB_LIST_NULL)
  326.   {
  327.     if(p->qoutfifo[(p->qoutfifonext + i) & 0xff ] == scb->hscb->tag)
  328.       return TRUE;
  329.     else
  330.       i++;
  331.   }
  332.   return FALSE;
  333. }
  334. /*+F*************************************************************************
  335.  * Function:
  336.  *   aic7xxx_reset_device
  337.  *
  338.  * Description:
  339.  *   The device at the given target/channel has been reset.  Abort
  340.  *   all active and queued scbs for that target/channel.  This function
  341.  *   need not worry about linked next pointers because if was a MSG_ABORT_TAG
  342.  *   then we had a tagged command (no linked next), if it was MSG_ABORT or
  343.  *   MSG_BUS_DEV_RESET then the device won't know about any commands any more
  344.  *   and no busy commands will exist, and if it was a bus reset, then nothing
  345.  *   knows about any linked next commands any more.  In all cases, we don't
  346.  *   need to worry about the linked next or busy scb, we just need to clear
  347.  *   them.
  348.  *-F*************************************************************************/
  349. static void
  350. aic7xxx_reset_device(struct aic7xxx_host *p, int target, int channel,
  351.                      int lun, unsigned char tag)
  352. {
  353.   struct aic7xxx_scb *scbp;
  354.   unsigned char active_scb, tcl;
  355.   int i = 0, j, init_lists = FALSE;
  356.   /*
  357.    * Restore this when we're done
  358.    */
  359.   active_scb = aic_inb(p, SCBPTR);
  360.   if (aic7xxx_verbose & (VERBOSE_RESET_PROCESS | VERBOSE_ABORT_PROCESS))
  361.   {
  362.     printk(INFO_LEAD "Reset device, active_scb %dn",
  363.          p->host_no, channel, target, lun, active_scb);
  364.     printk(INFO_LEAD "Current scb_tag %d, SEQADDR 0x%x, LASTPHASE "
  365.            "0x%xn",
  366.          p->host_no, channel, target, lun, aic_inb(p, SCB_TAG),
  367.          aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  368.          aic_inb(p, LASTPHASE));
  369.     printk(INFO_LEAD "SG_CACHEPTR 0x%x, SG_COUNT %d, SCSISIGI 0x%xn",
  370.          p->host_no, channel, target, lun,
  371.          (p->features & AHC_ULTRA2) ?  aic_inb(p, SG_CACHEPTR) : 0,
  372.          aic_inb(p, SG_COUNT), aic_inb(p, SCSISIGI));
  373.     printk(INFO_LEAD "SSTAT0 0x%x, SSTAT1 0x%x, SSTAT2 0x%xn",
  374.          p->host_no, channel, target, lun, aic_inb(p, SSTAT0),
  375.          aic_inb(p, SSTAT1), aic_inb(p, SSTAT2));
  376.   }
  377.   /*
  378.    * Deal with the busy target and linked next issues.
  379.    */
  380.   {
  381.     int min_target, max_target;
  382.     struct aic7xxx_scb *scbp, *prev_scbp;
  383.     /* Make all targets 'relative' to bus A. */
  384.     if (target == ALL_TARGETS)
  385.     {
  386.       switch (channel)
  387.       {
  388.         case 0:
  389.                  min_target = 0;
  390.                  max_target = (p->features & AHC_WIDE) ? 15 : 7;
  391.                  break;
  392.         case 1:
  393.                  min_target = 8;
  394.                  max_target = 15;
  395.                  break;
  396.         case ALL_CHANNELS:
  397.         default:
  398.                  min_target = 0;
  399.                  max_target = (p->features & (AHC_TWIN|AHC_WIDE)) ? 15 : 7;
  400.                  break;
  401.       }
  402.     }
  403.     else
  404.     { 
  405.       min_target = target | (channel << 3);
  406.       max_target = min_target;
  407.     }
  408.     for (i = min_target; i <= max_target; i++)
  409.     {
  410.       if ( i == p->scsi_id )
  411.       {
  412.         continue;
  413.       }
  414.       if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  415.         printk(INFO_LEAD "Cleaning up status information "
  416.           "and delayed_scbs.n", p->host_no, channel, i, lun);
  417.       p->dev_flags[i] &= ~BUS_DEVICE_RESET_PENDING;
  418.       if ( tag == SCB_LIST_NULL )
  419.       {
  420.         p->dev_flags[i] |= DEVICE_PRINT_DTR | DEVICE_RESET_DELAY;
  421.         p->dev_expires[i] = jiffies + (1 * HZ);
  422.         p->dev_timer_active |= (0x01 << i);
  423.         p->dev_last_queue_full_count[i] = 0;
  424.         p->dev_last_queue_full[i] = 0;
  425.         p->dev_temp_queue_depth[i] =
  426.           p->dev_max_queue_depth[i];
  427.       }
  428.       for(j=0; j<MAX_LUNS; j++)
  429.       {
  430.         if (channel == 1)
  431.           tcl = ((i << 4) & 0x70) | (channel << 3) | j;
  432.         else
  433.           tcl = (i << 4) | (channel << 3) | j;
  434.         if ( (aic7xxx_index_busy_target(p, tcl, FALSE) == tag) ||
  435.              (tag == SCB_LIST_NULL) )
  436.           aic7xxx_index_busy_target(p, tcl, /* unbusy */ TRUE);
  437.       }
  438.       j = 0; 
  439.       prev_scbp = NULL; 
  440.       scbp = p->delayed_scbs[i].head;
  441.       while ( (scbp != NULL) && (j++ <= (p->scb_data->numscbs + 1)) )
  442.       {
  443.         prev_scbp = scbp;
  444.         scbp = scbp->q_next;
  445.         if ( prev_scbp == scbp )
  446.         {
  447.           if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
  448.             printk(WARN_LEAD "Yikes!! scb->q_next == scb "
  449.               "in the delayed_scbs queue!n", p->host_no, channel, i, lun);
  450.           scbp = NULL;
  451.           prev_scbp->q_next = NULL;
  452.           p->delayed_scbs[i].tail = prev_scbp;
  453.         }
  454.         if (aic7xxx_match_scb(p, prev_scbp, target, channel, lun, tag))
  455.         {
  456.           scbq_remove(&p->delayed_scbs[i], prev_scbp);
  457.           if (prev_scbp->flags & SCB_WAITINGQ)
  458.           {
  459.             p->dev_active_cmds[i]++;
  460.             p->activescbs++;
  461.           }
  462.           prev_scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
  463.           prev_scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
  464.         }
  465.       }
  466.       if ( j > (p->scb_data->numscbs + 1) )
  467.       {
  468.         if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
  469.           printk(WARN_LEAD "Yikes!! There's a loop in the "
  470.             "delayed_scbs queue!n", p->host_no, channel, i, lun);
  471.         scbq_init(&p->delayed_scbs[i]);
  472.       }
  473.       if ( !(p->dev_timer_active & (0x01 << MAX_TARGETS)) ||
  474.             time_after_eq(p->dev_timer.expires, p->dev_expires[i]) )
  475.       {
  476.         mod_timer(&p->dev_timer, p->dev_expires[i]);
  477.         p->dev_timer_active |= (0x01 << MAX_TARGETS);
  478.       }
  479.     }
  480.   }
  481.   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  482.     printk(INFO_LEAD "Cleaning QINFIFO.n", p->host_no, channel, target, lun );
  483.   aic7xxx_search_qinfifo(p, target, channel, lun, tag,
  484.       SCB_RESET | SCB_QUEUED_FOR_DONE, /* requeue */ FALSE, NULL);
  485. /*
  486.  *  Search the waiting_scbs queue for matches, this catches any SCB_QUEUED
  487.  *  ABORT/RESET commands.
  488.  */
  489.   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  490.     printk(INFO_LEAD "Cleaning waiting_scbs.n", p->host_no, channel,
  491.       target, lun );
  492.   {
  493.     struct aic7xxx_scb *scbp, *prev_scbp;
  494.     j = 0; 
  495.     prev_scbp = NULL; 
  496.     scbp = p->waiting_scbs.head;
  497.     while ( (scbp != NULL) && (j++ <= (p->scb_data->numscbs + 1)) )
  498.     {
  499.       prev_scbp = scbp;
  500.       scbp = scbp->q_next;
  501.       if ( prev_scbp == scbp )
  502.       {
  503.         if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
  504.           printk(WARN_LEAD "Yikes!! scb->q_next == scb "
  505.             "in the waiting_scbs queue!n", p->host_no, CTL_OF_SCB(scbp));
  506.         scbp = NULL;
  507.         prev_scbp->q_next = NULL;
  508.         p->waiting_scbs.tail = prev_scbp;
  509.       }
  510.       if (aic7xxx_match_scb(p, prev_scbp, target, channel, lun, tag))
  511.       {
  512.         scbq_remove(&p->waiting_scbs, prev_scbp);
  513.         if (prev_scbp->flags & SCB_WAITINGQ)
  514.         {
  515.           p->dev_active_cmds[TARGET_INDEX(prev_scbp->cmd)]++;
  516.           p->activescbs++;
  517.         }
  518.         prev_scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
  519.         prev_scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
  520.       }
  521.     }
  522.     if ( j > (p->scb_data->numscbs + 1) )
  523.     {
  524.       if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
  525.         printk(WARN_LEAD "Yikes!! There's a loop in the "
  526.           "waiting_scbs queue!n", p->host_no, channel, target, lun);
  527.       scbq_init(&p->waiting_scbs);
  528.     }
  529.   }
  530.   /*
  531.    * Search waiting for selection list.
  532.    */
  533.   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  534.     printk(INFO_LEAD "Cleaning waiting for selection "
  535.       "list.n", p->host_no, channel, target, lun);
  536.   {
  537.     unsigned char next, prev, scb_index;
  538.     next = aic_inb(p, WAITING_SCBH);  /* Start at head of list. */
  539.     prev = SCB_LIST_NULL;
  540.     j = 0;
  541.     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
  542.     {
  543.       aic_outb(p, next, SCBPTR);
  544.       scb_index = aic_inb(p, SCB_TAG);
  545.       if (scb_index >= p->scb_data->numscbs)
  546.       {
  547.        /*
  548.         * No aic7xxx_verbose check here.....we want to see this since it
  549.         * means either the kernel driver or the sequencer screwed things up
  550.         */
  551.         printk(WARN_LEAD "Waiting List inconsistency; SCB index=%d, "
  552.           "numscbs=%dn", p->host_no, channel, target, lun, scb_index,
  553.           p->scb_data->numscbs);
  554.         next = aic_inb(p, SCB_NEXT);
  555.         aic7xxx_add_curscb_to_free_list(p);
  556.       }
  557.       else
  558.       {
  559.         scbp = p->scb_data->scb_array[scb_index];
  560.         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
  561.         {
  562.           next = aic7xxx_abort_waiting_scb(p, scbp, next, prev);
  563.           if (scbp->flags & SCB_WAITINGQ)
  564.           {
  565.             p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
  566.             p->activescbs++;
  567.           }
  568.           scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
  569.           scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
  570.           if (prev == SCB_LIST_NULL)
  571.           {
  572.             /*
  573.              * This is either the first scb on the waiting list, or we
  574.              * have already yanked the first and haven't left any behind.
  575.              * Either way, we need to turn off the selection hardware if
  576.              * it isn't already off.
  577.              */
  578.             aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
  579.             aic_outb(p, CLRSELTIMEO, CLRSINT1);
  580.           }
  581.         }
  582.         else
  583.         {
  584.           prev = next;
  585.           next = aic_inb(p, SCB_NEXT);
  586.         }
  587.       }
  588.     }
  589.     if ( j > (p->scb_data->maxscbs + 1) )
  590.     {
  591.       printk(WARN_LEAD "Yikes!!  There is a loop in the waiting for "
  592.         "selection list!n", p->host_no, channel, target, lun);
  593.       init_lists = TRUE;
  594.     }
  595.   }
  596.   /*
  597.    * Go through disconnected list and remove any entries we have queued
  598.    * for completion, zeroing their control byte too.
  599.    */
  600.   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
  601.     printk(INFO_LEAD "Cleaning disconnected scbs "
  602.       "list.n", p->host_no, channel, target, lun);
  603.   if (p->flags & AHC_PAGESCBS)
  604.   {
  605.     unsigned char next, prev, scb_index;
  606.     next = aic_inb(p, DISCONNECTED_SCBH);
  607.     prev = SCB_LIST_NULL;
  608.     j = 0;
  609.     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
  610.     {
  611.       aic_outb(p, next, SCBPTR);
  612.       scb_index = aic_inb(p, SCB_TAG);
  613.       if (scb_index > p->scb_data->numscbs)
  614.       {
  615.         printk(WARN_LEAD "Disconnected List inconsistency; SCB index=%d, "
  616.           "numscbs=%dn", p->host_no, channel, target, lun, scb_index,
  617.           p->scb_data->numscbs);
  618.         next = aic7xxx_rem_scb_from_disc_list(p, next, prev);
  619.       }
  620.       else
  621.       {
  622.         scbp = p->scb_data->scb_array[scb_index];
  623.         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
  624.         {
  625.           next = aic7xxx_rem_scb_from_disc_list(p, next, prev);
  626.           if (scbp->flags & SCB_WAITINGQ)
  627.           {
  628.             p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
  629.             p->activescbs++;
  630.           }
  631.           scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
  632.           scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
  633.           scbp->hscb->control = 0;
  634.         }
  635.         else
  636.         {
  637.           prev = next;
  638.           next = aic_inb(p, SCB_NEXT);
  639.         }
  640.       }
  641.     }
  642.     if ( j > (p->scb_data->maxscbs + 1) )
  643.     {
  644.       printk(WARN_LEAD "Yikes!!  There is a loop in the disconnected list!n",
  645.         p->host_no, channel, target, lun);
  646.       init_lists = TRUE;
  647.     }
  648.   }
  649.   /*
  650.    * Walk the free list making sure no entries on the free list have
  651.    * a valid SCB_TAG value or SCB_CONTROL byte.
  652.    */
  653.   if (p->flags & AHC_PAGESCBS)
  654.   {
  655.     unsigned char next;
  656.     j = 0;
  657.     next = aic_inb(p, FREE_SCBH);
  658.     if ( (next >= p->scb_data->maxhscbs) && (next != SCB_LIST_NULL) )
  659.     {
  660.       printk(WARN_LEAD "Bogus FREE_SCBH!.n", p->host_no, channel,
  661.         target, lun);
  662.       init_lists = TRUE;
  663.       next = SCB_LIST_NULL;
  664.     }
  665.     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
  666.     {
  667.       aic_outb(p, next, SCBPTR);
  668.       if (aic_inb(p, SCB_TAG) < p->scb_data->numscbs)
  669.       {
  670.         printk(WARN_LEAD "Free list inconsistency!.n", p->host_no, channel,
  671.           target, lun);
  672.         init_lists = TRUE;
  673.         next = SCB_LIST_NULL;
  674.       }
  675.       else
  676.       {
  677.         aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  678.         aic_outb(p, 0, SCB_CONTROL);
  679.         next = aic_inb(p, SCB_NEXT);
  680.       }
  681.     }
  682.     if ( j > (p->scb_data->maxscbs + 1) )
  683.     {
  684.       printk(WARN_LEAD "Yikes!!  There is a loop in the free list!n",
  685.         p->host_no, channel, target, lun);
  686.       init_lists = TRUE;
  687.     }
  688.   }
  689.   /*
  690.    * Go through the hardware SCB array looking for commands that
  691.    * were active but not on any list.
  692.    */
  693.   if (init_lists)
  694.   {
  695.     aic_outb(p, SCB_LIST_NULL, FREE_SCBH);
  696.     aic_outb(p, SCB_LIST_NULL, WAITING_SCBH);
  697.     aic_outb(p, SCB_LIST_NULL, DISCONNECTED_SCBH);
  698.   }
  699.   for (i = p->scb_data->maxhscbs - 1; i >= 0; i--)
  700.   {
  701.     unsigned char scbid;
  702.     aic_outb(p, i, SCBPTR);
  703.     if (init_lists)
  704.     {
  705.       aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  706.       aic_outb(p, SCB_LIST_NULL, SCB_NEXT);
  707.       aic_outb(p, 0, SCB_CONTROL);
  708.       aic7xxx_add_curscb_to_free_list(p);
  709.     }
  710.     else
  711.     {
  712.       scbid = aic_inb(p, SCB_TAG);
  713.       if (scbid < p->scb_data->numscbs)
  714.       {
  715.         scbp = p->scb_data->scb_array[scbid];
  716.         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
  717.         {
  718.           aic_outb(p, 0, SCB_CONTROL);
  719.           aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  720.           aic7xxx_add_curscb_to_free_list(p);
  721.         }
  722.       }
  723.     }
  724.   }
  725.   /*
  726.    * Go through the entire SCB array now and look for commands for
  727.    * for this target that are stillactive.  These are other (most likely
  728.    * tagged) commands that were disconnected when the reset occurred.
  729.    * Any commands we find here we know this about, it wasn't on any queue,
  730.    * it wasn't in the qinfifo, it wasn't in the disconnected or waiting
  731.    * lists, so it really must have been a paged out SCB.  In that case,
  732.    * we shouldn't need to bother with updating any counters, just mark
  733.    * the correct flags and go on.
  734.    */
  735.   for (i = 0; i < p->scb_data->numscbs; i++)
  736.   {
  737.     scbp = p->scb_data->scb_array[i];
  738.     if ((scbp->flags & SCB_ACTIVE) &&
  739.         aic7xxx_match_scb(p, scbp, target, channel, lun, tag) &&
  740.         !aic7xxx_scb_on_qoutfifo(p, scbp))
  741.     {
  742.       if (scbp->flags & SCB_WAITINGQ)
  743.       {
  744.         scbq_remove(&p->waiting_scbs, scbp);
  745.         scbq_remove(&p->delayed_scbs[TARGET_INDEX(scbp->cmd)], scbp);
  746.         p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
  747.         p->activescbs++;
  748.       }
  749.       scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
  750.       scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
  751.     }
  752.   }
  753.   aic_outb(p, active_scb, SCBPTR);
  754. }
  755. /*+F*************************************************************************
  756.  * Function:
  757.  *   aic7xxx_clear_intstat
  758.  *
  759.  * Description:
  760.  *   Clears the interrupt status.
  761.  *-F*************************************************************************/
  762. static void
  763. aic7xxx_clear_intstat(struct aic7xxx_host *p)
  764. {
  765.   /* Clear any interrupt conditions this may have caused. */
  766.   aic_outb(p, CLRSELDO | CLRSELDI | CLRSELINGO, CLRSINT0);
  767.   aic_outb(p, CLRSELTIMEO | CLRATNO | CLRSCSIRSTI | CLRBUSFREE | CLRSCSIPERR |
  768.        CLRPHASECHG | CLRREQINIT, CLRSINT1);
  769.   aic_outb(p, CLRSCSIINT | CLRSEQINT | CLRBRKADRINT | CLRPARERR, CLRINT);
  770. }
  771. /*+F*************************************************************************
  772.  * Function:
  773.  *   aic7xxx_reset_current_bus
  774.  *
  775.  * Description:
  776.  *   Reset the current SCSI bus.
  777.  *-F*************************************************************************/
  778. static void
  779. aic7xxx_reset_current_bus(struct aic7xxx_host *p)
  780. {
  781.   /* Disable reset interrupts. */
  782.   aic_outb(p, aic_inb(p, SIMODE1) & ~ENSCSIRST, SIMODE1);
  783.   /* Turn off the bus' current operations, after all, we shouldn't have any
  784.    * valid commands left to cause a RSELI and SELO once we've tossed the
  785.    * bus away with this reset, so we might as well shut down the sequencer
  786.    * until the bus is restarted as oppossed to saving the current settings
  787.    * and restoring them (which makes no sense to me). */
  788.   /* Turn on the bus reset. */
  789.   aic_outb(p, aic_inb(p, SCSISEQ) | SCSIRSTO, SCSISEQ);
  790.   while ( (aic_inb(p, SCSISEQ) & SCSIRSTO) == 0)
  791.     mdelay(5);
  792.   /*
  793.    * Some of the new Ultra2 chipsets need a longer delay after a chip
  794.    * reset than just the init setup creates, so we have to delay here
  795.    * before we go into a reset in order to make the chips happy.
  796.    */
  797.   if (p->features & AHC_ULTRA2)
  798.     mdelay(250);
  799.   else
  800.     mdelay(50);
  801.   /* Turn off the bus reset. */
  802.   aic_outb(p, 0, SCSISEQ);
  803.   mdelay(10);
  804.   aic7xxx_clear_intstat(p);
  805.   /* Re-enable reset interrupts. */
  806.   aic_outb(p, aic_inb(p, SIMODE1) | ENSCSIRST, SIMODE1);
  807. }
  808. /*+F*************************************************************************
  809.  * Function:
  810.  *   aic7xxx_reset_channel
  811.  *
  812.  * Description:
  813.  *   Reset the channel.
  814.  *-F*************************************************************************/
  815. static void
  816. aic7xxx_reset_channel(struct aic7xxx_host *p, int channel, int initiate_reset)
  817. {
  818.   unsigned long offset_min, offset_max;
  819.   unsigned char sblkctl;
  820.   int cur_channel;
  821.   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  822.     printk(INFO_LEAD "Reset channel called, %s initiate reset.n",
  823.       p->host_no, channel, -1, -1, (initiate_reset==TRUE) ? "will" : "won't" );
  824.   if (channel == 1)
  825.   {
  826.     p->needsdtr |= (p->needsdtr_copy & 0xFF00);
  827.     p->dtr_pending &= 0x00FF;
  828.     offset_min = 8;
  829.     offset_max = 16;
  830.   }
  831.   else
  832.   {
  833.     if (p->features & AHC_TWIN)
  834.     {
  835.       /* Channel A */
  836.       p->needsdtr |= (p->needsdtr_copy & 0x00FF);
  837.       p->dtr_pending &= 0xFF00;
  838.       offset_min = 0;
  839.       offset_max = 8;
  840.     }
  841.     else
  842.     {
  843.       p->needppr = p->needppr_copy;
  844.       p->needsdtr = p->needsdtr_copy;
  845.       p->needwdtr = p->needwdtr_copy;
  846.       p->dtr_pending = 0x0;
  847.       offset_min = 0;
  848.       if (p->features & AHC_WIDE)
  849.       {
  850.         offset_max = 16;
  851.       }
  852.       else
  853.       {
  854.         offset_max = 8;
  855.       }
  856.     }
  857.   }
  858.   while (offset_min < offset_max)
  859.   {
  860.     /*
  861.      * Revert to async/narrow transfers until we renegotiate.
  862.      */
  863.     aic_outb(p, 0, TARG_SCSIRATE + offset_min);
  864.     if (p->features & AHC_ULTRA2)
  865.     {
  866.       aic_outb(p, 0, TARG_OFFSET + offset_min);
  867.     }
  868.     offset_min++;
  869.   }
  870.   /*
  871.    * Reset the bus and unpause/restart the controller
  872.    */
  873.   sblkctl = aic_inb(p, SBLKCTL);
  874.   if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
  875.     cur_channel = (sblkctl & SELBUSB) >> 3;
  876.   else
  877.     cur_channel = 0;
  878.   if ( (cur_channel != channel) && (p->features & AHC_TWIN) )
  879.   {
  880.     /*
  881.      * Case 1: Command for another bus is active
  882.      */
  883.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  884.       printk(INFO_LEAD "Stealthily resetting idle channel.n", p->host_no,
  885.         channel, -1, -1);
  886.     /*
  887.      * Stealthily reset the other bus without upsetting the current bus.
  888.      */
  889.     aic_outb(p, sblkctl ^ SELBUSB, SBLKCTL);
  890.     aic_outb(p, aic_inb(p, SIMODE1) & ~ENBUSFREE, SIMODE1);
  891.     if (initiate_reset)
  892.     {
  893.       aic7xxx_reset_current_bus(p);
  894.     }
  895.     aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP), SCSISEQ);
  896.     aic7xxx_clear_intstat(p);
  897.     aic_outb(p, sblkctl, SBLKCTL);
  898.   }
  899.   else
  900.   {
  901.     /*
  902.      * Case 2: A command from this bus is active or we're idle.
  903.      */
  904.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  905.       printk(INFO_LEAD "Resetting currently active channel.n", p->host_no,
  906.         channel, -1, -1);
  907.     aic_outb(p, aic_inb(p, SIMODE1) & ~(ENBUSFREE|ENREQINIT),
  908.       SIMODE1);
  909.     p->flags &= ~AHC_HANDLING_REQINITS;
  910.     p->msg_type = MSG_TYPE_NONE;
  911.     p->msg_len = 0;
  912.     if (initiate_reset)
  913.     {
  914.       aic7xxx_reset_current_bus(p);
  915.     }
  916.     aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP), SCSISEQ);
  917.     aic7xxx_clear_intstat(p);
  918.   }
  919.   if (aic7xxx_verbose & VERBOSE_RESET_RETURN)
  920.     printk(INFO_LEAD "Channel resetn", p->host_no, channel, -1, -1);
  921.   /*
  922.    * Clean up all the state information for the pending transactions
  923.    * on this bus.
  924.    */
  925.   aic7xxx_reset_device(p, ALL_TARGETS, channel, ALL_LUNS, SCB_LIST_NULL);
  926.   if ( !(p->features & AHC_TWIN) )
  927.   {
  928.     restart_sequencer(p);
  929.   }
  930.   return;
  931. }
  932. /*+F*************************************************************************
  933.  * Function:
  934.  *   aic7xxx_run_waiting_queues
  935.  *
  936.  * Description:
  937.  *   Scan the awaiting_scbs queue downloading and starting as many
  938.  *   scbs as we can.
  939.  *-F*************************************************************************/
  940. static void
  941. aic7xxx_run_waiting_queues(struct aic7xxx_host *p)
  942. {
  943.   struct aic7xxx_scb *scb;
  944.   int tindex;
  945.   int sent;
  946. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  947.   unsigned long cpu_flags = 0;
  948. #endif
  949.   if (p->waiting_scbs.head == NULL)
  950.     return;
  951.   sent = 0;
  952.   /*
  953.    * First handle SCBs that are waiting but have been assigned a slot.
  954.    */
  955.   DRIVER_LOCK
  956.   while ((scb = scbq_remove_head(&p->waiting_scbs)) != NULL)
  957.   {
  958.     tindex = TARGET_INDEX(scb->cmd);
  959.     if ( !scb->tag_action && (p->tagenable & (1<<tindex)) )
  960.     {
  961.       p->dev_temp_queue_depth[tindex] = 1;
  962.     }
  963.     if ( (p->dev_active_cmds[tindex] >=
  964.           p->dev_temp_queue_depth[tindex]) ||
  965.          (p->dev_flags[tindex] & (DEVICE_RESET_DELAY|DEVICE_WAS_BUSY)) ||
  966.          (p->flags & AHC_RESET_DELAY) )
  967.     {
  968.       scbq_insert_tail(&p->delayed_scbs[tindex], scb);
  969.     }
  970.     else
  971.     {
  972.         scb->flags &= ~SCB_WAITINGQ;
  973.         p->dev_active_cmds[tindex]++;
  974.         p->activescbs++;
  975.         if ( !(scb->tag_action) )
  976.         {
  977.           aic7xxx_busy_target(p, scb);
  978.         }
  979.         p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
  980.         sent++;
  981.     }
  982.   }
  983.   if (sent)
  984.   {
  985.     if (p->features & AHC_QUEUE_REGS)
  986.       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
  987.     else
  988.     {
  989.       pause_sequencer(p);
  990.       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
  991.       unpause_sequencer(p, FALSE);
  992.     }
  993.     if (p->activescbs > p->max_activescbs)
  994.       p->max_activescbs = p->activescbs;
  995.   }
  996.   DRIVER_UNLOCK
  997. }
  998. #ifdef CONFIG_PCI
  999. #define  DPE 0x80
  1000. #define  SSE 0x40
  1001. #define  RMA 0x20
  1002. #define  RTA 0x10
  1003. #define  STA 0x08
  1004. #define  DPR 0x01
  1005. /*+F*************************************************************************
  1006.  * Function:
  1007.  *   aic7xxx_pci_intr
  1008.  *
  1009.  * Description:
  1010.  *   Check the scsi card for PCI errors and clear the interrupt
  1011.  *
  1012.  *   NOTE: If you don't have this function and a 2940 card encounters
  1013.  *         a PCI error condition, the machine will end up locked as the
  1014.  *         interrupt handler gets slammed with non-stop PCI error interrupts
  1015.  *-F*************************************************************************/
  1016. static void
  1017. aic7xxx_pci_intr(struct aic7xxx_host *p)
  1018. {
  1019.   unsigned char status1;
  1020.   pci_read_config_byte(p->pdev, PCI_STATUS + 1, &status1);
  1021.   if ( (status1 & DPE) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1022.     printk(WARN_LEAD "Data Parity Error during PCI address or PCI write"
  1023.       "phase.n", p->host_no, -1, -1, -1);
  1024.   if ( (status1 & SSE) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1025.     printk(WARN_LEAD "Signal System Error Detectedn", p->host_no,
  1026.       -1, -1, -1);
  1027.   if ( (status1 & RMA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1028.     printk(WARN_LEAD "Received a PCI Master Abortn", p->host_no,
  1029.       -1, -1, -1);
  1030.   if ( (status1 & RTA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1031.     printk(WARN_LEAD "Received a PCI Target Abortn", p->host_no,
  1032.       -1, -1, -1);
  1033.   if ( (status1 & STA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1034.     printk(WARN_LEAD "Signaled a PCI Target Abortn", p->host_no,
  1035.       -1, -1, -1);
  1036.   if ( (status1 & DPR) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
  1037.     printk(WARN_LEAD "Data Parity Error has been reported via PCI pin "
  1038.       "PERR#n", p->host_no, -1, -1, -1);
  1039.   
  1040.   pci_write_config_byte(p->pdev, PCI_STATUS + 1, status1);
  1041.   if (status1 & (DPR|RMA|RTA))
  1042.     aic_outb(p,  CLRPARERR, CLRINT);
  1043.   if ( (aic7xxx_panic_on_abort) && (p->spurious_int > 500) )
  1044.     aic7xxx_panic_abort(p, NULL);
  1045. }
  1046. #endif /* CONFIG_PCI */
  1047. /*+F*************************************************************************
  1048.  * Function:
  1049.  *   aic7xxx_timer
  1050.  *
  1051.  * Description:
  1052.  *   Take expired extries off of delayed queues and place on waiting queue
  1053.  *   then run waiting queue to start commands.
  1054.  ***************************************************************************/
  1055. static void
  1056. aic7xxx_timer(struct aic7xxx_host *p)
  1057. {
  1058.   int i, j;
  1059.   unsigned long cpu_flags = 0;
  1060.   struct aic7xxx_scb *scb;
  1061.   spin_lock_irqsave(&io_request_lock, cpu_flags);
  1062.   p->dev_timer_active &= ~(0x01 << MAX_TARGETS);
  1063.   if ( (p->dev_timer_active & (0x01 << p->scsi_id)) &&
  1064.        time_after_eq(jiffies, p->dev_expires[p->scsi_id]) )
  1065.   {
  1066.     p->flags &= ~AHC_RESET_DELAY;
  1067.     p->dev_timer_active &= ~(0x01 << p->scsi_id);
  1068.   }
  1069.   for(i=0; i<MAX_TARGETS; i++)
  1070.   {
  1071.     if ( (i != p->scsi_id) &&
  1072.          (p->dev_timer_active & (0x01 << i)) &&
  1073.          time_after_eq(jiffies, p->dev_expires[i]) )
  1074.     {
  1075.       p->dev_timer_active &= ~(0x01 << i);
  1076.       p->dev_flags[i] &= ~(DEVICE_RESET_DELAY|DEVICE_WAS_BUSY);
  1077.       p->dev_temp_queue_depth[i] =  p->dev_max_queue_depth[i];
  1078.       j = 0;
  1079.       while ( ((scb = scbq_remove_head(&p->delayed_scbs[i])) != NULL) &&
  1080.               (j++ < p->scb_data->numscbs) )
  1081.       {
  1082.         scbq_insert_tail(&p->waiting_scbs, scb);
  1083.       }
  1084.       if (j == p->scb_data->numscbs)
  1085.       {
  1086.         printk(INFO_LEAD "timer: Yikes, loop in delayed_scbs list.n",
  1087.           p->host_no, 0, i, -1);
  1088.         scbq_init(&p->delayed_scbs[i]);
  1089.         scbq_init(&p->waiting_scbs);
  1090.         /*
  1091.          * Well, things are screwed now, wait for a reset to clean the junk
  1092.          * out.
  1093.          */
  1094.       }
  1095.     }
  1096.     else if ( p->dev_timer_active & (0x01 << i) )
  1097.     {
  1098.       if ( p->dev_timer_active & (0x01 << MAX_TARGETS) )
  1099.       {
  1100.         if ( time_after_eq(p->dev_timer.expires, p->dev_expires[i]) )
  1101.         {
  1102.           p->dev_timer.expires = p->dev_expires[i];
  1103.         }
  1104.       }
  1105.       else
  1106.       {
  1107.         p->dev_timer.expires = p->dev_expires[i];
  1108.         p->dev_timer_active |= (0x01 << MAX_TARGETS);
  1109.       }
  1110.     }
  1111.   }
  1112.   if ( p->dev_timer_active & (0x01 << MAX_TARGETS) )
  1113.   {
  1114.     add_timer(&p->dev_timer);
  1115.   }
  1116.   aic7xxx_run_waiting_queues(p);
  1117.   spin_unlock_irqrestore(&io_request_lock, cpu_flags);
  1118. }
  1119. /*+F*************************************************************************
  1120.  * Function:
  1121.  *   aic7xxx_construct_ppr
  1122.  *
  1123.  * Description:
  1124.  *   Build up a Parallel Protocol Request message for use with SCSI-3
  1125.  *   devices.
  1126.  *-F*************************************************************************/
  1127. static void
  1128. aic7xxx_construct_ppr(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  1129. {
  1130.   int tindex = TARGET_INDEX(scb->cmd);
  1131.   p->msg_buf[p->msg_index++] = MSG_EXTENDED;
  1132.   p->msg_buf[p->msg_index++] = MSG_EXT_PPR_LEN;
  1133.   p->msg_buf[p->msg_index++] = MSG_EXT_PPR;
  1134.   p->msg_buf[p->msg_index++] = p->transinfo[tindex].goal_period;
  1135.   p->msg_buf[p->msg_index++] = 0;
  1136.   p->msg_buf[p->msg_index++] = p->transinfo[tindex].goal_offset;
  1137.   p->msg_buf[p->msg_index++] = p->transinfo[tindex].goal_width;
  1138.   p->msg_buf[p->msg_index++] = p->transinfo[tindex].goal_options;
  1139.   p->msg_len += 8;
  1140. }
  1141. /*+F*************************************************************************
  1142.  * Function:
  1143.  *   aic7xxx_construct_sdtr
  1144.  *
  1145.  * Description:
  1146.  *   Constucts a synchronous data transfer message in the message
  1147.  *   buffer on the sequencer.
  1148.  *-F*************************************************************************/
  1149. static void
  1150. aic7xxx_construct_sdtr(struct aic7xxx_host *p, unsigned char period,
  1151.         unsigned char offset)
  1152. {
  1153.   p->msg_buf[p->msg_index++] = MSG_EXTENDED;
  1154.   p->msg_buf[p->msg_index++] = MSG_EXT_SDTR_LEN;
  1155.   p->msg_buf[p->msg_index++] = MSG_EXT_SDTR;
  1156.   p->msg_buf[p->msg_index++] = period;
  1157.   p->msg_buf[p->msg_index++] = offset;
  1158.   p->msg_len += 5;
  1159. }
  1160. /*+F*************************************************************************
  1161.  * Function:
  1162.  *   aic7xxx_construct_wdtr
  1163.  *
  1164.  * Description:
  1165.  *   Constucts a wide data transfer message in the message buffer
  1166.  *   on the sequencer.
  1167.  *-F*************************************************************************/
  1168. static void
  1169. aic7xxx_construct_wdtr(struct aic7xxx_host *p, unsigned char bus_width)
  1170. {
  1171.   p->msg_buf[p->msg_index++] = MSG_EXTENDED;
  1172.   p->msg_buf[p->msg_index++] = MSG_EXT_WDTR_LEN;
  1173.   p->msg_buf[p->msg_index++] = MSG_EXT_WDTR;
  1174.   p->msg_buf[p->msg_index++] = bus_width;
  1175.   p->msg_len += 4;
  1176. }
  1177. /*+F*************************************************************************
  1178.  * Function:
  1179.  *   aic7xxx_calc_residual
  1180.  *
  1181.  * Description:
  1182.  *   Calculate the residual data not yet transferred.
  1183.  *-F*************************************************************************/
  1184. static void
  1185. aic7xxx_calculate_residual (struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  1186. {
  1187.   struct aic7xxx_hwscb *hscb;
  1188.   Scsi_Cmnd *cmd;
  1189.   int actual, i;
  1190.   cmd = scb->cmd;
  1191.   hscb = scb->hscb;
  1192.   /*
  1193.    *  Don't destroy valid residual information with
  1194.    *  residual coming from a check sense operation.
  1195.    */
  1196.   if (((scb->hscb->control & DISCONNECTED) == 0) &&
  1197.       (scb->flags & SCB_SENSE) == 0)
  1198.   {
  1199.     /*
  1200.      *  We had an underflow. At this time, there's only
  1201.      *  one other driver that bothers to check for this,
  1202.      *  and cmd->underflow seems to be set rather half-
  1203.      *  heartedly in the higher-level SCSI code.
  1204.      */
  1205.     actual = scb->sg_length;
  1206.     for (i=1; i < hscb->residual_SG_segment_count; i++)
  1207.     {
  1208.       actual -= scb->sg_list[scb->sg_count - i].length;
  1209.     }
  1210.     actual -= (hscb->residual_data_count[2] << 16) |
  1211.               (hscb->residual_data_count[1] <<  8) |
  1212.               hscb->residual_data_count[0];
  1213.     if (actual < cmd->underflow)
  1214.     {
  1215.       if (aic7xxx_verbose & VERBOSE_MINOR_ERROR)
  1216.       {
  1217.         printk(INFO_LEAD "Underflow - Wanted %u, %s %u, residual SG "
  1218.           "count %d.n", p->host_no, CTL_OF_SCB(scb), cmd->underflow,
  1219.           (cmd->request.cmd == WRITE) ? "wrote" : "read", actual,
  1220.           hscb->residual_SG_segment_count);
  1221.         printk(INFO_LEAD "status 0x%x.n", p->host_no, CTL_OF_SCB(scb),
  1222.           hscb->target_status);
  1223.       }
  1224.       /*
  1225.        * In 2.4, only send back the residual information, don't flag this
  1226.        * as an error.  Before 2.4 we had to flag this as an error because
  1227.        * the mid layer didn't check residual data counts to see if the
  1228.        * command needs retried.
  1229.        */
  1230. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1231.       cmd->resid = scb->sg_length - actual;
  1232. #else
  1233.       aic7xxx_error(cmd) = DID_RETRY_COMMAND;
  1234. #endif
  1235.       aic7xxx_status(cmd) = hscb->target_status;
  1236.     }
  1237.   }
  1238.   /*
  1239.    * Clean out the residual information in the SCB for the
  1240.    * next consumer.
  1241.    */
  1242.   hscb->residual_data_count[2] = 0;
  1243.   hscb->residual_data_count[1] = 0;
  1244.   hscb->residual_data_count[0] = 0;
  1245.   hscb->residual_SG_segment_count = 0;
  1246. }
  1247. /*+F*************************************************************************
  1248.  * Function:
  1249.  *   aic7xxx_handle_device_reset
  1250.  *
  1251.  * Description:
  1252.  *   Interrupt handler for sequencer interrupts (SEQINT).
  1253.  *-F*************************************************************************/
  1254. static void
  1255. aic7xxx_handle_device_reset(struct aic7xxx_host *p, int target, int channel)
  1256. {
  1257.   unsigned short targ_mask;
  1258.   unsigned char tindex = target;
  1259.   tindex |= ((channel & 0x01) << 3);
  1260.   targ_mask = (0x01 << tindex);
  1261.   /*
  1262.    * Go back to async/narrow transfers and renegotiate.
  1263.    */
  1264.   p->needppr |= (p->needppr_copy & targ_mask);
  1265.   p->needsdtr |= (p->needsdtr_copy & targ_mask);
  1266.   p->needwdtr |= (p->needwdtr_copy & targ_mask);
  1267.   p->dtr_pending &= ~targ_mask;
  1268.   aic_outb(p, 0, TARG_SCSIRATE + tindex);
  1269.   if (p->features & AHC_ULTRA2)
  1270.     aic_outb(p, 0, TARG_OFFSET + tindex);
  1271.   aic7xxx_reset_device(p, target, channel, ALL_LUNS, SCB_LIST_NULL);
  1272.   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  1273.     printk(INFO_LEAD "Bus Device Reset delivered.n", p->host_no, channel,
  1274.       target, -1);
  1275.   aic7xxx_run_done_queue(p, /*complete*/ TRUE);
  1276. }
  1277. /*+F*************************************************************************
  1278.  * Function:
  1279.  *   aic7xxx_handle_seqint
  1280.  *
  1281.  * Description:
  1282.  *   Interrupt handler for sequencer interrupts (SEQINT).
  1283.  *-F*************************************************************************/
  1284. static void
  1285. aic7xxx_handle_seqint(struct aic7xxx_host *p, unsigned char intstat)
  1286. {
  1287.   struct aic7xxx_scb *scb;
  1288.   unsigned short target_mask;
  1289.   unsigned char target, lun, tindex;
  1290.   unsigned char queue_flag = FALSE;
  1291.   char channel;
  1292.   target = ((aic_inb(p, SAVED_TCL) >> 4) & 0x0f);
  1293.   if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
  1294.     channel = (aic_inb(p, SBLKCTL) & SELBUSB) >> 3;
  1295.   else
  1296.     channel = 0;
  1297.   tindex = target + (channel << 3);
  1298.   lun = aic_inb(p, SAVED_TCL) & 0x07;
  1299.   target_mask = (0x01 << tindex);
  1300.   /*
  1301.    * Go ahead and clear the SEQINT now, that avoids any interrupt race
  1302.    * conditions later on in case we enable some other interrupt.
  1303.    */
  1304.   aic_outb(p, CLRSEQINT, CLRINT);
  1305.   switch (intstat & SEQINT_MASK)
  1306.   {
  1307.     case NO_MATCH:
  1308.       {
  1309.         aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP),
  1310.                  SCSISEQ);
  1311.         printk(WARN_LEAD "No active SCB for reconnecting target - Issuing "
  1312.                "BUS DEVICE RESET.n", p->host_no, channel, target, lun);
  1313.         printk(WARN_LEAD "      SAVED_TCL=0x%x, ARG_1=0x%x, SEQADDR=0x%xn",
  1314.                p->host_no, channel, target, lun,
  1315.                aic_inb(p, SAVED_TCL), aic_inb(p, ARG_1),
  1316.                (aic_inb(p, SEQADDR1) << 8) | aic_inb(p, SEQADDR0));
  1317.         if (aic7xxx_panic_on_abort)
  1318.           aic7xxx_panic_abort(p, NULL);
  1319.       }
  1320.       break;
  1321.     case SEND_REJECT:
  1322.       {
  1323.         if (aic7xxx_verbose & VERBOSE_MINOR_ERROR)
  1324.           printk(INFO_LEAD "Rejecting unknown message (0x%x) received from "
  1325.             "target, SEQ_FLAGS=0x%xn", p->host_no, channel, target, lun,
  1326.             aic_inb(p, ACCUM), aic_inb(p, SEQ_FLAGS));
  1327.       }
  1328.       break;
  1329.     case NO_IDENT:
  1330.       {
  1331.         /*
  1332.          * The reconnecting target either did not send an identify
  1333.          * message, or did, but we didn't find an SCB to match and
  1334.          * before it could respond to our ATN/abort, it hit a dataphase.
  1335.          * The only safe thing to do is to blow it away with a bus
  1336.          * reset.
  1337.          */
  1338.         if (aic7xxx_verbose & (VERBOSE_SEQINT | VERBOSE_RESET_MID))
  1339.           printk(INFO_LEAD "Target did not send an IDENTIFY message; "
  1340.             "LASTPHASE 0x%x, SAVED_TCL 0x%xn", p->host_no, channel, target,
  1341.             lun, aic_inb(p, LASTPHASE), aic_inb(p, SAVED_TCL));
  1342.         aic7xxx_reset_channel(p, channel, /*initiate reset*/ TRUE);
  1343.         aic7xxx_run_done_queue(p, TRUE);
  1344.       }
  1345.       break;
  1346.     case BAD_PHASE:
  1347.       if (aic_inb(p, LASTPHASE) == P_BUSFREE)
  1348.       {
  1349.         if (aic7xxx_verbose & VERBOSE_SEQINT)
  1350.           printk(INFO_LEAD "Missed busfree.n", p->host_no, channel,
  1351.             target, lun);
  1352.         restart_sequencer(p);
  1353.       }
  1354.       else
  1355.       {
  1356.         if (aic7xxx_verbose & VERBOSE_SEQINT)
  1357.           printk(INFO_LEAD "Unknown scsi bus phase, continuingn", p->host_no,
  1358.             channel, target, lun);
  1359.       }
  1360.       break;
  1361.     case EXTENDED_MSG:
  1362.       {
  1363.         p->msg_type = MSG_TYPE_INITIATOR_MSGIN;
  1364.         p->msg_len = 0;
  1365.         p->msg_index = 0;
  1366. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1367.         if (aic7xxx_verbose > 0xffff)
  1368.           printk(INFO_LEAD "Enabling REQINITs for MSG_INn", p->host_no,
  1369.                  channel, target, lun);
  1370. #endif
  1371.        /*      
  1372.         * To actually receive the message, simply turn on
  1373.         * REQINIT interrupts and let our interrupt handler
  1374.         * do the rest (REQINIT should already be true).
  1375.         */
  1376.         p->flags |= AHC_HANDLING_REQINITS;
  1377.         aic_outb(p, aic_inb(p, SIMODE1) | ENREQINIT, SIMODE1);
  1378.        /*
  1379.         * We don't want the sequencer unpaused yet so we return early
  1380.         */
  1381.         return;
  1382.       }
  1383.     case REJECT_MSG:
  1384.       {
  1385.         /*
  1386.          * What we care about here is if we had an outstanding SDTR
  1387.          * or WDTR message for this target. If we did, this is a
  1388.          * signal that the target is refusing negotiation.
  1389.          */
  1390.         unsigned char scb_index;
  1391.         unsigned char last_msg;
  1392.         scb_index = aic_inb(p, SCB_TAG);
  1393.         scb = p->scb_data->scb_array[scb_index];
  1394.         last_msg = aic_inb(p, LAST_MSG);
  1395.         if ( (last_msg == MSG_IDENTIFYFLAG) &&
  1396.              (scb->tag_action) &&
  1397.             !(scb->flags & SCB_MSGOUT_BITS) )
  1398.         {
  1399.           if (scb->tag_action == MSG_ORDERED_Q_TAG)
  1400.           {
  1401.             /*
  1402.              * OK...the device seems able to accept tagged commands, but
  1403.              * not ordered tag commands, only simple tag commands.  So, we
  1404.              * disable ordered tag commands and go on with life just like
  1405.              * normal.
  1406.              */
  1407.             p->orderedtag &= ~target_mask;
  1408.             scb->tag_action = MSG_SIMPLE_Q_TAG;
  1409.             scb->hscb->control &= ~SCB_TAG_TYPE;
  1410.             scb->hscb->control |= MSG_SIMPLE_Q_TAG;
  1411.             aic_outb(p, scb->hscb->control, SCB_CONTROL);
  1412.             /*
  1413.              * OK..we set the tag type to simple tag command, now we re-assert
  1414.              * ATNO and hope this will take us into the identify phase again
  1415.              * so we can resend the tag type and info to the device.
  1416.              */
  1417.             aic_outb(p, MSG_IDENTIFYFLAG, MSG_OUT);
  1418.             aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
  1419.           }
  1420.           else if (scb->tag_action == MSG_SIMPLE_Q_TAG)
  1421.           {
  1422.             unsigned char i, reset = 0;
  1423.             struct aic7xxx_scb *scbp;
  1424.             int old_verbose;
  1425.             /*
  1426.              * Hmmmm....the device is flaking out on tagged commands.  The
  1427.              * bad thing is that we already have tagged commands enabled in
  1428.              * the device struct in the mid level code.  We also have a queue
  1429.              * set according to the tagged queue depth.  Gonna have to live
  1430.              * with it by controlling our queue depth internally and making
  1431.              * sure we don't set the tagged command flag any more.
  1432.              */
  1433.             p->tagenable &= ~target_mask;
  1434.             p->orderedtag &= ~target_mask;
  1435.             p->dev_max_queue_depth[tindex] =
  1436.                p->dev_temp_queue_depth[tindex] = 1;
  1437.             /*
  1438.              * We set this command up as a bus device reset.  However, we have
  1439.              * to clear the tag type as it's causing us problems.  We shouldnt
  1440.              * have to worry about any other commands being active, since if
  1441.              * the device is refusing tagged commands, this should be the
  1442.              * first tagged command sent to the device, however, we do have
  1443.              * to worry about any other tagged commands that may already be
  1444.              * in the qinfifo.  The easiest way to do this, is to issue a BDR,
  1445.              * send all the commands back to the mid level code, then let them
  1446.              * come back and get rebuilt as untagged commands.
  1447.              */
  1448.             scb->tag_action = 0;
  1449.             scb->hscb->control &= ~(TAG_ENB | SCB_TAG_TYPE);
  1450.             aic_outb(p,  scb->hscb->control, SCB_CONTROL);
  1451.             old_verbose = aic7xxx_verbose;
  1452.             aic7xxx_verbose &= ~(VERBOSE_RESET|VERBOSE_ABORT);
  1453.             for (i=0; i!=p->scb_data->numscbs; i++)
  1454.             {
  1455.               scbp = p->scb_data->scb_array[i];
  1456.               if ((scbp->flags & SCB_ACTIVE) && (scbp != scb))
  1457.               {
  1458.                 if (aic7xxx_match_scb(p, scbp, target, channel, lun, i))
  1459.                 {
  1460.                   aic7xxx_reset_device(p, target, channel, lun, i);
  1461.                   reset++;
  1462.                 }
  1463.                 aic7xxx_run_done_queue(p, TRUE);
  1464.               }
  1465.             }
  1466.             aic7xxx_verbose = old_verbose;
  1467.             /*
  1468.              * Wait until after the for loop to set the busy index since
  1469.              * aic7xxx_reset_device will clear the busy index during its
  1470.              * operation.
  1471.              */
  1472.             aic7xxx_busy_target(p, scb);
  1473.             printk(INFO_LEAD "Device is refusing tagged commands, using "
  1474.               "untagged I/O.n", p->host_no, channel, target, lun);
  1475.             aic_outb(p, MSG_IDENTIFYFLAG, MSG_OUT);
  1476.             aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
  1477.           }
  1478.         }
  1479.         else if (scb->flags & SCB_MSGOUT_PPR)
  1480.         {
  1481.           /*
  1482.            * As per the draft specs, any device capable of supporting any of
  1483.            * the option values other than 0 are not allowed to reject the
  1484.            * PPR message.  Instead, they must negotiate out what they do
  1485.            * support instead of rejecting our offering or else they cause
  1486.            * a parity error during msg_out phase to signal that they don't
  1487.            * like our settings.
  1488.            */
  1489.           p->needppr &= ~target_mask;
  1490.           p->needppr_copy &= ~target_mask;
  1491.           aic7xxx_set_width(p, target, channel, lun, MSG_EXT_WDTR_BUS_8_BIT,
  1492.             (AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE));
  1493.           aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0, 0,
  1494.                                AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
  1495.           p->transinfo[tindex].goal_options = 0;
  1496.           p->dtr_pending &= ~target_mask;
  1497.           scb->flags &= ~SCB_MSGOUT_BITS;
  1498.           if(aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1499.           {
  1500.             printk(INFO_LEAD "Device is rejecting PPR messages, falling "
  1501.               "back.n", p->host_no, channel, target, lun);
  1502.           }
  1503.           if ( p->transinfo[tindex].goal_width )
  1504.           {
  1505.             p->needwdtr |= target_mask;
  1506.             p->needwdtr_copy |= target_mask;
  1507.             p->dtr_pending |= target_mask;
  1508.             scb->flags |= SCB_MSGOUT_WDTR;
  1509.           }
  1510.           if ( p->transinfo[tindex].goal_offset )
  1511.           {
  1512.             p->needsdtr |= target_mask;
  1513.             p->needsdtr_copy |= target_mask;
  1514.             if( !(p->dtr_pending & target_mask) )
  1515.             {
  1516.               p->dtr_pending |= target_mask;
  1517.               scb->flags |= SCB_MSGOUT_SDTR;
  1518.             }
  1519.           }
  1520.           if ( p->dtr_pending & target_mask )
  1521.           {
  1522.             aic_outb(p, HOST_MSG, MSG_OUT);
  1523.             aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
  1524.           }
  1525.         }
  1526.         else if (scb->flags & SCB_MSGOUT_WDTR)
  1527.         {
  1528.           /*
  1529.            * note 8bit xfers and clear flag
  1530.            */
  1531.           p->needwdtr &= ~target_mask;
  1532.           p->needwdtr_copy &= ~target_mask;
  1533.           scb->flags &= ~SCB_MSGOUT_BITS;
  1534.           aic7xxx_set_width(p, target, channel, lun, MSG_EXT_WDTR_BUS_8_BIT,
  1535.             (AHC_TRANS_ACTIVE|AHC_TRANS_GOAL|AHC_TRANS_CUR));
  1536.           aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0, 0,
  1537.                                AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
  1538.           if(aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1539.           {
  1540.             printk(INFO_LEAD "Device is rejecting WDTR messages, using "
  1541.               "narrow transfers.n", p->host_no, channel, target, lun);
  1542.           }
  1543.           p->needsdtr |= (p->needsdtr_copy & target_mask);
  1544.         }
  1545.         else if (scb->flags & SCB_MSGOUT_SDTR)
  1546.         {
  1547.          /*
  1548.           * note asynch xfers and clear flag
  1549.           */
  1550.           p->needsdtr &= ~target_mask;
  1551.           p->needsdtr_copy &= ~target_mask;
  1552.           scb->flags &= ~SCB_MSGOUT_BITS;
  1553.           aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0, 0,
  1554.             (AHC_TRANS_CUR|AHC_TRANS_ACTIVE|AHC_TRANS_GOAL));
  1555.           if(aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1556.           {
  1557.             printk(INFO_LEAD "Device is rejecting SDTR messages, using "
  1558.               "async transfers.n", p->host_no, channel, target, lun);
  1559.           }
  1560.         }
  1561.         else if (aic7xxx_verbose & VERBOSE_SEQINT)
  1562.         {
  1563.           /*
  1564.            * Otherwise, we ignore it.
  1565.            */
  1566.           printk(INFO_LEAD "Received MESSAGE_REJECT for unknown cause.  "
  1567.             "Ignoring.n", p->host_no, channel, target, lun);
  1568.         }
  1569.       }
  1570.       break;
  1571.     case BAD_STATUS:
  1572.       {
  1573.         unsigned char scb_index;
  1574.         struct aic7xxx_hwscb *hscb;
  1575.         Scsi_Cmnd *cmd;
  1576.         /* The sequencer will notify us when a command has an error that
  1577.          * would be of interest to the kernel.  This allows us to leave
  1578.          * the sequencer running in the common case of command completes
  1579.          * without error.  The sequencer will have DMA'd the SCB back
  1580.          * up to us, so we can reference the drivers SCB array.
  1581.          *
  1582.          * Set the default return value to 0 indicating not to send
  1583.          * sense.  The sense code will change this if needed and this
  1584.          * reduces code duplication.
  1585.          */
  1586.         aic_outb(p, 0, RETURN_1);
  1587.         scb_index = aic_inb(p, SCB_TAG);
  1588.         if (scb_index > p->scb_data->numscbs)
  1589.         {
  1590.           printk(WARN_LEAD "Invalid SCB during SEQINT 0x%02x, SCB_TAG %d.n",
  1591.             p->host_no, channel, target, lun, intstat, scb_index);
  1592.           break;
  1593.         }
  1594.         scb = p->scb_data->scb_array[scb_index];
  1595.         hscb = scb->hscb;
  1596.         if (!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
  1597.         {
  1598.           printk(WARN_LEAD "Invalid SCB during SEQINT 0x%x, scb %d, flags 0x%x,"
  1599.             " cmd 0x%lx.n", p->host_no, channel, target, lun, intstat,
  1600.             scb_index, scb->flags, (unsigned long) scb->cmd);
  1601.         }
  1602.         else
  1603.         {
  1604.           cmd = scb->cmd;
  1605.           hscb->target_status = aic_inb(p, SCB_TARGET_STATUS);
  1606.           aic7xxx_status(cmd) = hscb->target_status;
  1607.           cmd->result = hscb->target_status;
  1608.           switch (status_byte(hscb->target_status))
  1609.           {
  1610.             case GOOD:
  1611.               if (aic7xxx_verbose & VERBOSE_SEQINT)
  1612.                 printk(INFO_LEAD "Interrupted for status of GOOD???n",
  1613.                   p->host_no, CTL_OF_SCB(scb));
  1614.               break;
  1615.             case COMMAND_TERMINATED:
  1616.             case CHECK_CONDITION:
  1617.               if ( !(scb->flags & SCB_SENSE) )
  1618.               {
  1619.                 /*
  1620.                  * Send a sense command to the requesting target.
  1621.                  * XXX - revisit this and get rid of the memcopys.
  1622.                  */
  1623.                 memcpy(scb->sense_cmd, &generic_sense[0],
  1624.                        sizeof(generic_sense));
  1625.                 scb->sense_cmd[1] = (cmd->lun << 5);
  1626.                 scb->sense_cmd[4] = sizeof(cmd->sense_buffer);
  1627.                 scb->sg_list[0].length = 
  1628.                   cpu_to_le32(sizeof(cmd->sense_buffer));
  1629. scb->sg_list[0].address =
  1630.                         cpu_to_le32(pci_map_single(p->pdev, cmd->sense_buffer,
  1631.                                                    sizeof(cmd->sense_buffer),
  1632.                                                    PCI_DMA_FROMDEVICE));
  1633.                 /*
  1634.                  * XXX - We should allow disconnection, but can't as it
  1635.                  * might allow overlapped tagged commands.
  1636.                  */
  1637.                 /* hscb->control &= DISCENB; */
  1638.                 hscb->control = 0;
  1639.                 hscb->target_status = 0;
  1640.                 hscb->SG_list_pointer = 
  1641.   cpu_to_le32(SCB_DMA_ADDR(scb, scb->sg_list));
  1642.                 hscb->SCSI_cmd_pointer = 
  1643.                   cpu_to_le32(SCB_DMA_ADDR(scb, scb->sense_cmd));
  1644.                 hscb->data_count = scb->sg_list[0].length;
  1645.                 hscb->data_pointer = scb->sg_list[0].address;
  1646.                 hscb->SCSI_cmd_length = COMMAND_SIZE(scb->sense_cmd[0]);
  1647.                 hscb->residual_SG_segment_count = 0;
  1648.                 hscb->residual_data_count[0] = 0;
  1649.                 hscb->residual_data_count[1] = 0;
  1650.                 hscb->residual_data_count[2] = 0;
  1651.                 scb->sg_count = hscb->SG_segment_count = 1;
  1652.                 scb->sg_length = sizeof(cmd->sense_buffer);
  1653.                 scb->tag_action = 0;
  1654.                 scb->flags |= SCB_SENSE;
  1655.                 /*
  1656.                  * Ensure the target is busy since this will be an
  1657.                  * an untagged request.
  1658.                  */
  1659. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1660.                 if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1661.                 {
  1662.                   if (scb->flags & SCB_MSGOUT_BITS)
  1663.                     printk(INFO_LEAD "Requesting SENSE with %sn", p->host_no,
  1664.                            CTL_OF_SCB(scb), (scb->flags & SCB_MSGOUT_SDTR) ?
  1665.                            "SDTR" : "WDTR");
  1666.                   else
  1667.                     printk(INFO_LEAD "Requesting SENSE, no MSGn", p->host_no,
  1668.                            CTL_OF_SCB(scb));
  1669.                 }
  1670. #endif
  1671.                 aic7xxx_busy_target(p, scb);
  1672.                 aic_outb(p, SEND_SENSE, RETURN_1);
  1673.                 aic7xxx_error(cmd) = DID_OK;
  1674.                 break;
  1675.               }  /* first time sense, no errors */
  1676.               printk(INFO_LEAD "CHECK_CONDITION on REQUEST_SENSE, returning "
  1677.                      "an error.n", p->host_no, CTL_OF_SCB(scb));
  1678.               aic7xxx_error(cmd) = DID_ERROR;
  1679.               scb->flags &= ~SCB_SENSE;
  1680.               break;
  1681.             case QUEUE_FULL:
  1682.               queue_flag = TRUE;    /* Mark that this is a QUEUE_FULL and */
  1683.             case BUSY:              /* drop through to here */
  1684.             {
  1685.               struct aic7xxx_scb *next_scbp, *prev_scbp;
  1686.               unsigned char active_hscb, next_hscb, prev_hscb, scb_index;
  1687.               /*
  1688.                * We have to look three places for queued commands:
  1689.                *  1: QINFIFO
  1690.                *  2: p->waiting_scbs queue
  1691.                *  3: WAITING_SCBS list on card (for commands that are started
  1692.                *     but haven't yet made it to the device)
  1693.                */
  1694.               aic7xxx_search_qinfifo(p, target, channel, lun,
  1695.                 SCB_LIST_NULL, 0, TRUE,
  1696.                 &p->delayed_scbs[tindex]);
  1697.               next_scbp = p->waiting_scbs.head;
  1698.               while ( next_scbp != NULL )
  1699.               {
  1700.                 prev_scbp = next_scbp;
  1701.                 next_scbp = next_scbp->q_next;
  1702.                 if ( aic7xxx_match_scb(p, prev_scbp, target, channel, lun,
  1703.                      SCB_LIST_NULL) )
  1704.                 {
  1705.                   scbq_remove(&p->waiting_scbs, prev_scbp);
  1706.                   scbq_insert_tail(&p->delayed_scbs[tindex],
  1707.                     prev_scbp);
  1708.                 }
  1709.               }
  1710.               next_scbp = NULL;
  1711.               active_hscb = aic_inb(p, SCBPTR);
  1712.               prev_hscb = next_hscb = scb_index = SCB_LIST_NULL;
  1713.               next_hscb = aic_inb(p, WAITING_SCBH);
  1714.               while (next_hscb != SCB_LIST_NULL)
  1715.               {
  1716.                 aic_outb(p, next_hscb, SCBPTR);
  1717.                 scb_index = aic_inb(p, SCB_TAG);
  1718.                 if (scb_index < p->scb_data->numscbs)
  1719.                 {
  1720.                   next_scbp = p->scb_data->scb_array[scb_index];
  1721.                   if (aic7xxx_match_scb(p, next_scbp, target, channel, lun,
  1722.                       SCB_LIST_NULL) )
  1723.                   {
  1724.                     if (next_scbp->flags & SCB_WAITINGQ)
  1725.                     {
  1726.                       p->dev_active_cmds[tindex]++;
  1727.                       p->activescbs--;
  1728.                       scbq_remove(&p->delayed_scbs[tindex], next_scbp);
  1729.                       scbq_remove(&p->waiting_scbs, next_scbp);
  1730.                     }
  1731.                     scbq_insert_head(&p->delayed_scbs[tindex],
  1732.                       next_scbp);
  1733.                     next_scbp->flags |= SCB_WAITINGQ;
  1734.                     p->dev_active_cmds[tindex]--;
  1735.                     p->activescbs--;
  1736.                     next_hscb = aic_inb(p, SCB_NEXT);
  1737.                     aic_outb(p, 0, SCB_CONTROL);
  1738.                     aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  1739.                     aic7xxx_add_curscb_to_free_list(p);
  1740.                     if (prev_hscb == SCB_LIST_NULL)
  1741.                     {
  1742.                       /* We were first on the list,
  1743.                        * so we kill the selection
  1744.                        * hardware.  Let the sequencer
  1745.                        * re-init the hardware itself
  1746.                        */
  1747.                       aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
  1748.                       aic_outb(p, CLRSELTIMEO, CLRSINT1);
  1749.                       aic_outb(p, next_hscb, WAITING_SCBH);
  1750.                     }
  1751.                     else
  1752.                     {
  1753.                       aic_outb(p, prev_hscb, SCBPTR);
  1754.                       aic_outb(p, next_hscb, SCB_NEXT);
  1755.                     }
  1756.                   }
  1757.                   else
  1758.                   {
  1759.                     prev_hscb = next_hscb;
  1760.                     next_hscb = aic_inb(p, SCB_NEXT);
  1761.                   }
  1762.                 } /* scb_index >= p->scb_data->numscbs */
  1763.               }
  1764.               aic_outb(p, active_hscb, SCBPTR);
  1765.               if (scb->flags & SCB_WAITINGQ)
  1766.               {
  1767.                 scbq_remove(&p->delayed_scbs[tindex], scb);
  1768.                 scbq_remove(&p->waiting_scbs, scb);
  1769.                 p->dev_active_cmds[tindex]++;
  1770.                 p->activescbs++;
  1771.               }
  1772.               scbq_insert_head(&p->delayed_scbs[tindex], scb);
  1773.               p->dev_active_cmds[tindex]--;
  1774.               p->activescbs--;
  1775.               scb->flags |= SCB_WAITINGQ | SCB_WAS_BUSY;
  1776.                   
  1777.               if ( !(p->dev_timer_active & (0x01 << tindex)) ) 
  1778.               {
  1779.                 p->dev_timer_active |= (0x01 << tindex);
  1780.                 if ( p->dev_active_cmds[tindex] )
  1781.                 {
  1782.                   p->dev_expires[tindex] = jiffies + HZ;
  1783.                 }
  1784.                 else
  1785.                 {
  1786.                   p->dev_expires[tindex] = jiffies + (HZ / 10);
  1787.                 }
  1788.                 if ( !(p->dev_timer_active & (0x01 << MAX_TARGETS)) )
  1789.                 {
  1790.                   p->dev_timer.expires = p->dev_expires[tindex];
  1791.                   p->dev_timer_active |= (0x01 << MAX_TARGETS);
  1792.                   add_timer(&p->dev_timer);
  1793.                 }
  1794.                 else if ( time_after_eq(p->dev_timer.expires,
  1795.                                         p->dev_expires[tindex]) )
  1796.                   mod_timer(&p->dev_timer, p->dev_expires[tindex]);
  1797.               }
  1798. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1799.               if( (aic7xxx_verbose & VERBOSE_MINOR_ERROR) ||
  1800.                   (aic7xxx_verbose > 0xffff) )
  1801.               {
  1802.                 if (queue_flag)
  1803.                   printk(INFO_LEAD "Queue full received; queue depth %d, "
  1804.                     "active %dn", p->host_no, CTL_OF_SCB(scb),
  1805.                     p->dev_max_queue_depth[tindex],
  1806.                     p->dev_active_cmds[tindex]);
  1807.                 else
  1808.                   printk(INFO_LEAD "Target busyn", p->host_no, CTL_OF_SCB(scb));
  1809.               }
  1810. #endif
  1811.               if (queue_flag)
  1812.               {
  1813.                 if ( p->dev_last_queue_full[tindex] !=
  1814.                      p->dev_active_cmds[tindex] )
  1815.                 {
  1816.                   p->dev_last_queue_full[tindex] = 
  1817.                       p->dev_active_cmds[tindex];
  1818.                   p->dev_last_queue_full_count[tindex] = 0;
  1819.                 }
  1820.                 else
  1821.                 {
  1822.                   p->dev_last_queue_full_count[tindex]++;
  1823.                 }
  1824.                 if ( (p->dev_last_queue_full_count[tindex] > 14) &&
  1825.                      (p->dev_active_cmds[tindex] > 4) )
  1826.                 {
  1827.                   if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1828.                     printk(INFO_LEAD "Queue depth reduced to %dn", p->host_no,
  1829.                       CTL_OF_SCB(scb), p->dev_active_cmds[tindex]);
  1830.                   p->dev_max_queue_depth[tindex] = 
  1831.                       p->dev_active_cmds[tindex];
  1832.                   p->dev_last_queue_full[tindex] = 0;
  1833.                   p->dev_last_queue_full_count[tindex] = 0;
  1834.                   p->dev_temp_queue_depth[tindex] = 
  1835.                     p->dev_active_cmds[tindex];
  1836.                 }
  1837.                 else if (p->dev_active_cmds[tindex] == 0)
  1838.                 {
  1839.                   if (aic7xxx_verbose & VERBOSE_NEGOTIATION)
  1840.                   {
  1841.                     printk(INFO_LEAD "QUEUE_FULL status received with 0 "
  1842.                            "commands active.n", p->host_no, CTL_OF_SCB(scb));
  1843.                     printk(INFO_LEAD "Tagged Command Queueing disabledn",
  1844.                            p->host_no, CTL_OF_SCB(scb));
  1845.                   }
  1846.                   p->dev_max_queue_depth[tindex] = 1;
  1847.                   p->dev_temp_queue_depth[tindex] = 1;
  1848.                   scb->tag_action = 0;
  1849.                   scb->hscb->control &= ~(MSG_ORDERED_Q_TAG|MSG_SIMPLE_Q_TAG);
  1850.                 }
  1851.                 else
  1852.                 {
  1853.                   p->dev_flags[tindex] |= DEVICE_WAS_BUSY;
  1854.                   p->dev_temp_queue_depth[tindex] = 
  1855.                     p->dev_active_cmds[tindex];
  1856.                 }
  1857.               }
  1858.               break;
  1859.             }
  1860.             
  1861.             default:
  1862.               if (aic7xxx_verbose & VERBOSE_SEQINT)
  1863.                 printk(INFO_LEAD "Unexpected target status 0x%x.n", p->host_no,
  1864.                      CTL_OF_SCB(scb), scb->hscb->target_status);
  1865.               if (!aic7xxx_error(cmd))
  1866.               {
  1867.                 aic7xxx_error(cmd) = DID_RETRY_COMMAND;
  1868.               }
  1869.               break;
  1870.           }  /* end switch */
  1871.         }  /* end else of */
  1872.       }
  1873.       break;
  1874.     case AWAITING_MSG:
  1875.       {
  1876.         unsigned char scb_index, msg_out;
  1877.         scb_index = aic_inb(p, SCB_TAG);
  1878.         msg_out = aic_inb(p, MSG_OUT);
  1879.         scb = p->scb_data->scb_array[scb_index];
  1880.         p->msg_index = p->msg_len = 0;
  1881.         /*
  1882.          * This SCB had a MK_MESSAGE set in its control byte informing
  1883.          * the sequencer that we wanted to send a special message to
  1884.          * this target.
  1885.          */
  1886.         if ( !(scb->flags & SCB_DEVICE_RESET) &&
  1887.               (msg_out == MSG_IDENTIFYFLAG) &&
  1888.               (scb->hscb->control & TAG_ENB) )
  1889.         {
  1890.           p->msg_buf[p->msg_index++] = scb->tag_action;
  1891.           p->msg_buf[p->msg_index++] = scb->hscb->tag;
  1892.           p->msg_len += 2;
  1893.         }
  1894.         if (scb->flags & SCB_DEVICE_RESET)
  1895.         {
  1896.           p->msg_buf[p->msg_index++] = MSG_BUS_DEV_RESET;
  1897.           p->msg_len++;
  1898.           if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  1899.             printk(INFO_LEAD "Bus device reset mailed.n",
  1900.                  p->host_no, CTL_OF_SCB(scb));
  1901.         }
  1902.         else if (scb->flags & SCB_ABORT)
  1903.         {
  1904.           if (scb->tag_action)
  1905.           {
  1906.             p->msg_buf[p->msg_index++] = MSG_ABORT_TAG;
  1907.           }
  1908.           else
  1909.           {
  1910.             p->msg_buf[p->msg_index++] = MSG_ABORT;
  1911.           }
  1912.           p->msg_len++;
  1913.           if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  1914.             printk(INFO_LEAD "Abort message mailed.n", p->host_no,
  1915.               CTL_OF_SCB(scb));
  1916.         }
  1917.         else if (scb->flags & SCB_MSGOUT_PPR)
  1918.         {
  1919.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1920.           {
  1921.             printk(INFO_LEAD "Sending PPR (%d/%d/%d/%d) message.n",
  1922.                    p->host_no, CTL_OF_SCB(scb),
  1923.                    p->transinfo[tindex].goal_period,
  1924.                    p->transinfo[tindex].goal_offset,
  1925.                    p->transinfo[tindex].goal_width,
  1926.                    p->transinfo[tindex].goal_options);
  1927.           }
  1928.           aic7xxx_construct_ppr(p, scb);
  1929.         }
  1930.         else if (scb->flags & SCB_MSGOUT_WDTR)
  1931.         {
  1932.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1933.           {
  1934.             printk(INFO_LEAD "Sending WDTR message.n", p->host_no,
  1935.                    CTL_OF_SCB(scb));
  1936.           }
  1937.           aic7xxx_construct_wdtr(p, p->transinfo[tindex].goal_width);
  1938.         }
  1939.         else if (scb->flags & SCB_MSGOUT_SDTR)
  1940.         {
  1941.           unsigned int max_sync, period;
  1942.           unsigned char options = 0;
  1943.           /*
  1944.            * Now that the device is selected, use the bits in SBLKCTL and
  1945.            * SSTAT2 to determine the max sync rate for this device.
  1946.            */
  1947.           if (p->features & AHC_ULTRA2)
  1948.           {
  1949.             if ( (aic_inb(p, SBLKCTL) & ENAB40) &&
  1950.                 !(aic_inb(p, SSTAT2) & EXP_ACTIVE) )
  1951.             {
  1952.               max_sync = AHC_SYNCRATE_ULTRA2;
  1953.             }
  1954.             else
  1955.             {
  1956.               max_sync = AHC_SYNCRATE_ULTRA;
  1957.             }
  1958.           }
  1959.           else if (p->features & AHC_ULTRA)
  1960.           {
  1961.             max_sync = AHC_SYNCRATE_ULTRA;
  1962.           }
  1963.           else
  1964.           {
  1965.             max_sync = AHC_SYNCRATE_FAST;
  1966.           }
  1967.           period = p->transinfo[tindex].goal_period;
  1968.           aic7xxx_find_syncrate(p, &period, max_sync, &options);
  1969.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  1970.           {
  1971.             printk(INFO_LEAD "Sending SDTR %d/%d message.n", p->host_no,
  1972.                    CTL_OF_SCB(scb), period,
  1973.                    p->transinfo[tindex].goal_offset);
  1974.           }
  1975.           aic7xxx_construct_sdtr(p, period,
  1976.             p->transinfo[tindex].goal_offset);
  1977.         }
  1978.         else 
  1979.         {
  1980.           sti();
  1981.           panic("aic7xxx: AWAITING_MSG for an SCB that does "
  1982.                 "not have a waiting message.n");
  1983.         }
  1984.         /*
  1985.          * We've set everything up to send our message, now to actually do
  1986.          * so we need to enable reqinit interrupts and let the interrupt
  1987.          * handler do the rest.  We don't want to unpause the sequencer yet
  1988.          * though so we'll return early.  We also have to make sure that
  1989.          * we clear the SEQINT *BEFORE* we set the REQINIT handler active
  1990.          * or else it's possible on VLB cards to loose the first REQINIT
  1991.          * interrupt.  Edge triggered EISA cards could also loose this
  1992.          * interrupt, although PCI and level triggered cards should not
  1993.          * have this problem since they continually interrupt the kernel
  1994.          * until we take care of the situation.
  1995.          */
  1996.         scb->flags |= SCB_MSGOUT_SENT;
  1997.         p->msg_index = 0;
  1998.         p->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
  1999.         p->flags |= AHC_HANDLING_REQINITS;
  2000.         aic_outb(p, aic_inb(p, SIMODE1) | ENREQINIT, SIMODE1);
  2001.         return;
  2002.       }
  2003.       break;
  2004.     case DATA_OVERRUN:
  2005.       {
  2006.         unsigned char scb_index = aic_inb(p, SCB_TAG);
  2007.         unsigned char lastphase = aic_inb(p, LASTPHASE);
  2008.         unsigned int i;
  2009.         scb = (p->scb_data->scb_array[scb_index]);
  2010.         /*
  2011.          * XXX - What do we really want to do on an overrun?  The
  2012.          *       mid-level SCSI code should handle this, but for now,
  2013.          *       we'll just indicate that the command should retried.
  2014.          *    If we retrieved sense info on this target, then the 
  2015.          *    base SENSE info should have been saved prior to the
  2016.          *    overrun error.  In that case, we return DID_OK and let
  2017.          *    the mid level code pick up on the sense info.  Otherwise
  2018.          *    we return DID_ERROR so the command will get retried.
  2019.          */
  2020.         if ( !(scb->flags & SCB_SENSE) )
  2021.         {
  2022.           printk(WARN_LEAD "Data overrun detected in %s phase, tag %d;n",
  2023.             p->host_no, CTL_OF_SCB(scb), 
  2024.             (lastphase == P_DATAIN) ? "Data-In" : "Data-Out", scb->hscb->tag);
  2025.           printk(KERN_WARNING "  %s seen Data Phase. Length=%d, NumSGs=%d.n",
  2026.             (aic_inb(p, SEQ_FLAGS) & DPHASE) ? "Have" : "Haven't",
  2027.             scb->sg_length, scb->sg_count);
  2028.           printk(KERN_WARNING "  Raw SCSI Command: 0x");
  2029.           for (i = 0; i < scb->hscb->SCSI_cmd_length; i++)
  2030.           {
  2031.             printk("%02x ", scb->cmd->cmnd[i]);
  2032.           }
  2033.           printk("n");
  2034.           if(aic7xxx_verbose > 0xffff)
  2035.           {
  2036.             for (i = 0; i < scb->sg_count; i++)
  2037.             {
  2038.               printk(KERN_WARNING "     sg[%d] - Addr 0x%x : Length %dn",
  2039.                  i, 
  2040.                  le32_to_cpu(scb->sg_list[i].address),
  2041.                  le32_to_cpu(scb->sg_list[i].length) );
  2042.             }
  2043.           }
  2044.           aic7xxx_error(scb->cmd) = DID_ERROR;
  2045.         }
  2046.         else
  2047.           printk(INFO_LEAD "Data Overrun during SEND_SENSE operation.n",
  2048.             p->host_no, CTL_OF_SCB(scb));
  2049.       }
  2050.       break;
  2051.     case WIDE_RESIDUE:
  2052.       {
  2053.         unsigned char resid_sgcnt, index;
  2054.         unsigned char scb_index = aic_inb(p, SCB_TAG);
  2055.         unsigned int cur_addr, resid_dcnt;
  2056.         unsigned int native_addr, native_length, sg_addr;
  2057.         int i;
  2058.         if(scb_index > p->scb_data->numscbs)
  2059.         {
  2060.           printk(WARN_LEAD "invalid scb_index during WIDE_RESIDUE.n",
  2061.             p->host_no, -1, -1, -1);
  2062.           /*
  2063.            * XXX: Add error handling here
  2064.            */
  2065.           break;
  2066.         }
  2067.         scb = p->scb_data->scb_array[scb_index];
  2068.         if(!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
  2069.         {
  2070.           printk(WARN_LEAD "invalid scb during WIDE_RESIDUE flags:0x%x "
  2071.                  "scb->cmd:0x%lxn", p->host_no, CTL_OF_SCB(scb),
  2072.                  scb->flags, (unsigned long)scb->cmd);
  2073.           break;
  2074.         }
  2075.         if(aic7xxx_verbose & VERBOSE_MINOR_ERROR)
  2076.           printk(INFO_LEAD "Got WIDE_RESIDUE message, patching up data "
  2077.                  "pointer.n", p->host_no, CTL_OF_SCB(scb));
  2078.         /*
  2079.          * We have a valid scb to use on this WIDE_RESIDUE message, so
  2080.          * we need to walk the sg list looking for this particular sg
  2081.          * segment, then see if we happen to be at the very beginning of
  2082.          * the segment.  If we are, then we have to back things up to
  2083.          * the previous segment.  If not, then we simply need to remove
  2084.          * one byte from this segments address and add one to the byte
  2085.          * count.
  2086.          */
  2087.         cur_addr = aic_inb(p, SHADDR) | (aic_inb(p, SHADDR + 1) << 8) |
  2088.           (aic_inb(p, SHADDR + 2) << 16) | (aic_inb(p, SHADDR + 3) << 24);
  2089.         sg_addr = aic_inb(p, SG_COUNT + 1) | (aic_inb(p, SG_COUNT + 2) << 8) |
  2090.           (aic_inb(p, SG_COUNT + 3) << 16) | (aic_inb(p, SG_COUNT + 4) << 24);
  2091.         resid_sgcnt = aic_inb(p, SCB_RESID_SGCNT);
  2092.         resid_dcnt = aic_inb(p, SCB_RESID_DCNT) |
  2093.           (aic_inb(p, SCB_RESID_DCNT + 1) << 8) |
  2094.           (aic_inb(p, SCB_RESID_DCNT + 2) << 16);
  2095.         index = scb->sg_count - ((resid_sgcnt) ? resid_sgcnt : 1);
  2096.         native_addr = le32_to_cpu(scb->sg_list[index].address);
  2097.         native_length = le32_to_cpu(scb->sg_list[index].length);
  2098.         /*
  2099.          * If resid_dcnt == native_length, then we just loaded this SG
  2100.          * segment and we need to back it up one...
  2101.          */
  2102.         if(resid_dcnt == native_length)
  2103.         {
  2104.           if(index == 0)
  2105.           {
  2106.             /*
  2107.              * Oops, this isn't right, we can't back up to before the
  2108.              * beginning.  This must be a bogus message, ignore it.
  2109.              */
  2110.             break;
  2111.           }
  2112.           resid_dcnt = 1;
  2113.           resid_sgcnt += 1;
  2114.           native_addr = le32_to_cpu(scb->sg_list[index - 1].address);
  2115.           native_length = le32_to_cpu(scb->sg_list[index - 1].length);
  2116.           cur_addr = native_addr + (native_length - 1);
  2117.           sg_addr -= sizeof(struct hw_scatterlist);
  2118.         }
  2119.         else
  2120.         {
  2121.           /*
  2122.            * resid_dcnt != native_length, so we are in the middle of a SG
  2123.            * element.  Back it up one byte and leave the rest alone.
  2124.            */
  2125.           resid_dcnt += 1;
  2126.           cur_addr -= 1;
  2127.         }
  2128.         
  2129.         /*
  2130.          * Output the new addresses and counts to the right places on the
  2131.          * card.
  2132.          */
  2133.         aic_outb(p, resid_sgcnt, SG_COUNT);
  2134.         aic_outb(p, resid_sgcnt, SCB_RESID_SGCNT);
  2135.         aic_outb(p, sg_addr & 0xff, SG_COUNT + 1);
  2136.         aic_outb(p, (sg_addr >> 8) & 0xff, SG_COUNT + 2);
  2137.         aic_outb(p, (sg_addr >> 16) & 0xff, SG_COUNT + 3);
  2138.         aic_outb(p, (sg_addr >> 24) & 0xff, SG_COUNT + 4);
  2139.         aic_outb(p, resid_dcnt & 0xff, SCB_RESID_DCNT);
  2140.         aic_outb(p, (resid_dcnt >> 8) & 0xff, SCB_RESID_DCNT + 1);
  2141.         aic_outb(p, (resid_dcnt >> 16) & 0xff, SCB_RESID_DCNT + 2);
  2142.         /*
  2143.          * The sequencer actually wants to find the new address
  2144.          * in the SHADDR register set.  On the Ultra2 and later controllers
  2145.          * this register set is readonly.  In order to get the right number
  2146.          * into the register, you actually have to enter it in HADDR and then
  2147.          * use the PRELOADEN bit of DFCNTRL to drop it through from the
  2148.          * HADDR register to the SHADDR register.  On non-Ultra2 controllers,
  2149.          * we simply write it direct.
  2150.          */
  2151.         if(p->features & AHC_ULTRA2)
  2152.         {
  2153.           /*
  2154.            * We might as well be accurate and drop both the resid_dcnt and
  2155.            * cur_addr into HCNT and HADDR and have both of them drop
  2156.            * through to the shadow layer together.
  2157.            */
  2158.           aic_outb(p, resid_dcnt & 0xff, HCNT);
  2159.           aic_outb(p, (resid_dcnt >> 8) & 0xff, HCNT + 1);
  2160.           aic_outb(p, (resid_dcnt >> 16) & 0xff, HCNT + 2);
  2161.           aic_outb(p, cur_addr & 0xff, HADDR);
  2162.           aic_outb(p, (cur_addr >> 8) & 0xff, HADDR + 1);
  2163.           aic_outb(p, (cur_addr >> 16) & 0xff, HADDR + 2);
  2164.           aic_outb(p, (cur_addr >> 24) & 0xff, HADDR + 3);
  2165.           aic_outb(p, aic_inb(p, DMAPARAMS) | PRELOADEN, DFCNTRL);
  2166.           udelay(1);
  2167.           aic_outb(p, aic_inb(p, DMAPARAMS) & ~(SCSIEN|HDMAEN), DFCNTRL);
  2168.           i=0;
  2169.           while(((aic_inb(p, DFCNTRL) & (SCSIEN|HDMAEN)) != 0) && (i++ < 1000))
  2170.           {
  2171.             udelay(1);
  2172.           }
  2173.         }
  2174.         else
  2175.         {
  2176.           aic_outb(p, cur_addr & 0xff, SHADDR);
  2177.           aic_outb(p, (cur_addr >> 8) & 0xff, SHADDR + 1);
  2178.           aic_outb(p, (cur_addr >> 16) & 0xff, SHADDR + 2);
  2179.           aic_outb(p, (cur_addr >> 24) & 0xff, SHADDR + 3);
  2180.         }
  2181.       }
  2182.       break;
  2183.     case SEQ_SG_FIXUP:
  2184.     {
  2185.       unsigned char scb_index, tmp;
  2186.       int sg_addr, sg_length;
  2187.       scb_index = aic_inb(p, SCB_TAG);
  2188.       if(scb_index > p->scb_data->numscbs)
  2189.       {
  2190.         printk(WARN_LEAD "invalid scb_index during SEQ_SG_FIXUP.n",
  2191.           p->host_no, -1, -1, -1);
  2192.         printk(INFO_LEAD "SCSISIGI 0x%x, SEQADDR 0x%x, SSTAT0 0x%x, SSTAT1 "
  2193.            "0x%xn", p->host_no, -1, -1, -1,
  2194.            aic_inb(p, SCSISIGI),
  2195.            aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  2196.            aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
  2197.         printk(INFO_LEAD "SG_CACHEPTR 0x%x, SSTAT2 0x%x, STCNT 0x%xn",
  2198.            p->host_no, -1, -1, -1, aic_inb(p, SG_CACHEPTR),
  2199.            aic_inb(p, SSTAT2), aic_inb(p, STCNT + 2) << 16 |
  2200.            aic_inb(p, STCNT + 1) << 8 | aic_inb(p, STCNT));
  2201.         /*
  2202.          * XXX: Add error handling here
  2203.          */
  2204.         break;
  2205.       }
  2206.       scb = p->scb_data->scb_array[scb_index];
  2207.       if(!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
  2208.       {
  2209.         printk(WARN_LEAD "invalid scb during SEQ_SG_FIXUP flags:0x%x "
  2210.                "scb->cmd:0x%pn", p->host_no, CTL_OF_SCB(scb),
  2211.                scb->flags, scb->cmd);
  2212.         printk(INFO_LEAD "SCSISIGI 0x%x, SEQADDR 0x%x, SSTAT0 0x%x, SSTAT1 "
  2213.            "0x%xn", p->host_no, CTL_OF_SCB(scb),
  2214.            aic_inb(p, SCSISIGI),
  2215.            aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  2216.            aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
  2217.         printk(INFO_LEAD "SG_CACHEPTR 0x%x, SSTAT2 0x%x, STCNT 0x%xn",
  2218.            p->host_no, CTL_OF_SCB(scb), aic_inb(p, SG_CACHEPTR),
  2219.            aic_inb(p, SSTAT2), aic_inb(p, STCNT + 2) << 16 |
  2220.            aic_inb(p, STCNT + 1) << 8 | aic_inb(p, STCNT));
  2221.         break;
  2222.       }
  2223.       if(aic7xxx_verbose & VERBOSE_MINOR_ERROR)
  2224.         printk(INFO_LEAD "Fixing up SG address for sequencer.n", p->host_no,
  2225.                CTL_OF_SCB(scb));
  2226.       /*
  2227.        * Advance the SG pointer to the next element in the list
  2228.        */
  2229.       tmp = aic_inb(p, SG_NEXT);
  2230.       tmp += SG_SIZEOF;
  2231.       aic_outb(p, tmp, SG_NEXT);
  2232.       if( tmp < SG_SIZEOF )
  2233.         aic_outb(p, aic_inb(p, SG_NEXT + 1) + 1, SG_NEXT + 1);
  2234.       tmp = aic_inb(p, SG_COUNT) - 1;
  2235.       aic_outb(p, tmp, SG_COUNT);
  2236.       sg_addr = le32_to_cpu(scb->sg_list[scb->sg_count - tmp].address);
  2237.       sg_length = le32_to_cpu(scb->sg_list[scb->sg_count - tmp].length);
  2238.       /*
  2239.        * Now stuff the element we just advanced past down onto the
  2240.        * card so it can be stored in the residual area.
  2241.        */
  2242.       aic_outb(p, sg_addr & 0xff, HADDR);
  2243.       aic_outb(p, (sg_addr >> 8) & 0xff, HADDR + 1);
  2244.       aic_outb(p, (sg_addr >> 16) & 0xff, HADDR + 2);
  2245.       aic_outb(p, (sg_addr >> 24) & 0xff, HADDR + 3);
  2246.       aic_outb(p, sg_length & 0xff, HCNT);
  2247.       aic_outb(p, (sg_length >> 8) & 0xff, HCNT + 1);
  2248.       aic_outb(p, (sg_length >> 16) & 0xff, HCNT + 2);
  2249.       aic_outb(p, (tmp << 2) | ((tmp == 1) ? LAST_SEG : 0), SG_CACHEPTR);
  2250.       aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
  2251.       while(aic_inb(p, SSTAT0) & SDONE) udelay(1);
  2252.       while(aic_inb(p, DFCNTRL) & (HDMAEN|SCSIEN)) aic_outb(p, 0, DFCNTRL);
  2253.     }
  2254.     break;
  2255. #if AIC7XXX_NOT_YET 
  2256.     case TRACEPOINT2:
  2257.       {
  2258.         printk(INFO_LEAD "Tracepoint #2 reached.n", p->host_no,
  2259.                channel, target, lun);
  2260.       }
  2261.       break;
  2262.     /* XXX Fill these in later */
  2263.     case MSG_BUFFER_BUSY:
  2264.       printk("aic7xxx: Message buffer busy.n");
  2265.       break;
  2266.     case MSGIN_PHASEMIS:
  2267.       printk("aic7xxx: Message-in phasemis.n");
  2268.       break;
  2269. #endif
  2270.     default:                   /* unknown */
  2271.       printk(WARN_LEAD "Unknown SEQINT, INTSTAT 0x%x, SCSISIGI 0x%x.n",
  2272.              p->host_no, channel, target, lun, intstat,
  2273.              aic_inb(p, SCSISIGI));
  2274.       break;
  2275.   }
  2276.   /*
  2277.    * Clear the sequencer interrupt and unpause the sequencer.
  2278.    */
  2279.   unpause_sequencer(p, /* unpause always */ TRUE);
  2280. }
  2281. /*+F*************************************************************************
  2282.  * Function:
  2283.  *   aic7xxx_parse_msg
  2284.  *
  2285.  * Description:
  2286.  *   Parses incoming messages into actions on behalf of
  2287.  *   aic7xxx_handle_reqinit
  2288.  *_F*************************************************************************/
  2289. static int
  2290. aic7xxx_parse_msg(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  2291. {
  2292.   int reject, reply, done;
  2293.   unsigned char target_scsirate, tindex;
  2294.   unsigned short target_mask;
  2295.   unsigned char target, channel, lun;
  2296.   unsigned char bus_width, new_bus_width;
  2297.   unsigned char trans_options, new_trans_options;
  2298.   unsigned int period, new_period, offset, new_offset, maxsync;
  2299.   struct aic7xxx_syncrate *syncrate;
  2300.   target = scb->cmd->target;
  2301.   channel = scb->cmd->channel;
  2302.   lun = scb->cmd->lun;
  2303.   reply = reject = done = FALSE;
  2304.   tindex = TARGET_INDEX(scb->cmd);
  2305.   target_scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
  2306.   target_mask = (0x01 << tindex);
  2307.   /*
  2308.    * Parse as much of the message as is availible,
  2309.    * rejecting it if we don't support it.  When
  2310.    * the entire message is availible and has been
  2311.    * handled, return TRUE indicating that we have
  2312.    * parsed an entire message.
  2313.    */
  2314.   if (p->msg_buf[0] != MSG_EXTENDED)
  2315.   {
  2316.     reject = TRUE;
  2317.   }
  2318.   /*
  2319.    * Even if we are an Ultra3 card, don't allow Ultra3 sync rates when
  2320.    * using the SDTR messages.  We need the PPR messages to enable the
  2321.    * higher speeds that include things like Dual Edge clocking.
  2322.    */
  2323.   if (p->features & AHC_ULTRA2)
  2324.   {
  2325.     if ( (aic_inb(p, SBLKCTL) & ENAB40) &&
  2326.          !(aic_inb(p, SSTAT2) & EXP_ACTIVE) )
  2327.     {
  2328.       if (p->features & AHC_ULTRA3)
  2329.         maxsync = AHC_SYNCRATE_ULTRA3;
  2330.       else
  2331.         maxsync = AHC_SYNCRATE_ULTRA2;
  2332.     }
  2333.     else
  2334.     {
  2335.       maxsync = AHC_SYNCRATE_ULTRA;
  2336.     }
  2337.   }
  2338.   else if (p->features & AHC_ULTRA)
  2339.   {
  2340.     maxsync = AHC_SYNCRATE_ULTRA;
  2341.   }
  2342.   else
  2343.   {
  2344.     maxsync = AHC_SYNCRATE_FAST;
  2345.   }
  2346.   /*
  2347.    * Just accept the length byte outright and perform
  2348.    * more checking once we know the message type.
  2349.    */
  2350.   if ( !reject && (p->msg_len > 2) )
  2351.   {
  2352.     switch(p->msg_buf[2])
  2353.     {
  2354.       case MSG_EXT_SDTR:
  2355.       {
  2356.         
  2357.         if (p->msg_buf[1] != MSG_EXT_SDTR_LEN)
  2358.         {
  2359.           reject = TRUE;
  2360.           break;
  2361.         }
  2362.         if (p->msg_len < (MSG_EXT_SDTR_LEN + 2))
  2363.         {
  2364.           break;
  2365.         }
  2366.         period = new_period = p->msg_buf[3];
  2367.         offset = new_offset = p->msg_buf[4];
  2368.         trans_options = new_trans_options = 0;
  2369.         bus_width = new_bus_width = target_scsirate & WIDEXFER;
  2370.         /*
  2371.          * If our current max syncrate is in the Ultra3 range, bump it back
  2372.          * down to Ultra2 since we can't negotiate DT transfers using SDTR
  2373.          */
  2374.         if(maxsync == AHC_SYNCRATE_ULTRA3)
  2375.           maxsync = AHC_SYNCRATE_ULTRA2;
  2376.         /*
  2377.          * We might have a device that is starting negotiation with us
  2378.          * before we can start up negotiation with it....be prepared to
  2379.          * have a device ask for a higher speed then we want to give it
  2380.          * in that case
  2381.          */
  2382.         if ( (scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_SDTR)) !=
  2383.              (SCB_MSGOUT_SENT|SCB_MSGOUT_SDTR) )
  2384.         {
  2385.           if (!(p->dev_flags[tindex] & DEVICE_DTR_SCANNED))
  2386.           {
  2387.             /*
  2388.              * We shouldn't get here unless this is a narrow drive, wide
  2389.              * devices should trigger this same section of code in the WDTR
  2390.              * handler first instead.
  2391.              */
  2392.             p->transinfo[tindex].goal_width = MSG_EXT_WDTR_BUS_8_BIT;
  2393.             p->transinfo[tindex].goal_options = 0;
  2394.             if(p->transinfo[tindex].user_offset)
  2395.             {
  2396.               p->needsdtr_copy |= target_mask;
  2397.               p->transinfo[tindex].goal_period =
  2398.                 MAX(10,p->transinfo[tindex].user_period);
  2399.               if(p->features & AHC_ULTRA2)
  2400.               {
  2401.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
  2402.               }
  2403.               else
  2404.               {
  2405.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
  2406.               }
  2407.             }
  2408.             else
  2409.             {
  2410.               p->needsdtr_copy &= ~target_mask;
  2411.               p->transinfo[tindex].goal_period = 255;
  2412.               p->transinfo[tindex].goal_offset = 0;
  2413.             }
  2414.             p->dev_flags[tindex] |= DEVICE_DTR_SCANNED | DEVICE_PRINT_DTR;
  2415.           }
  2416.           else if ((p->needsdtr_copy & target_mask) == 0)
  2417.           {
  2418.             /*
  2419.              * This is a preemptive message from the target, we've already
  2420.              * scanned this target and set our options for it, and we
  2421.              * don't need a WDTR with this target (for whatever reason),
  2422.              * so reject this incoming WDTR
  2423.              */
  2424.             reject = TRUE;
  2425.             break;
  2426.           }
  2427.           /* The device is sending this message first and we have to reply */
  2428.           reply = TRUE;
  2429.           
  2430.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  2431.           {
  2432.             printk(INFO_LEAD "Received pre-emptive SDTR message from "
  2433.                    "target.n", p->host_no, CTL_OF_SCB(scb));
  2434.           }
  2435.           /*
  2436.            * Validate the values the device passed to us against our SEEPROM
  2437.            * settings.  We don't have to do this if we aren't replying since
  2438.            * the device isn't allowed to send values greater than the ones
  2439.            * we first sent to it.
  2440.            */
  2441.           new_period = MAX(period, p->transinfo[tindex].goal_period);
  2442.           new_offset = MIN(offset, p->transinfo[tindex].goal_offset);
  2443.         }
  2444.  
  2445.         /*
  2446.          * Use our new_period, new_offset, bus_width, and card options
  2447.          * to determine the actual syncrate settings
  2448.          */
  2449.         syncrate = aic7xxx_find_syncrate(p, &new_period, maxsync,
  2450.                                          &trans_options);
  2451.         aic7xxx_validate_offset(p, syncrate, &new_offset, bus_width);
  2452.         /*
  2453.          * Did we drop to async?  If so, send a reply regardless of whether
  2454.          * or not we initiated this negotiation.
  2455.          */
  2456.         if ((new_offset == 0) && (new_offset != offset))
  2457.         {
  2458.           p->needsdtr_copy &= ~target_mask;
  2459.           reply = TRUE;
  2460.         }
  2461.         
  2462.         /*
  2463.          * Did we start this, if not, or if we went too low and had to
  2464.          * go async, then send an SDTR back to the target
  2465.          */
  2466.         if(reply)
  2467.         {
  2468.           /* when sending a reply, make sure that the goal settings are
  2469.            * updated along with current and active since the code that
  2470.            * will actually build the message for the sequencer uses the
  2471.            * goal settings as its guidelines.
  2472.            */
  2473.           aic7xxx_set_syncrate(p, syncrate, target, channel, new_period,
  2474.                                new_offset, trans_options,
  2475.                                AHC_TRANS_GOAL|AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2476.           scb->flags &= ~SCB_MSGOUT_BITS;
  2477.           scb->flags |= SCB_MSGOUT_SDTR;
  2478.           aic_outb(p, HOST_MSG, MSG_OUT);
  2479.           aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
  2480.         }
  2481.         else
  2482.         {
  2483.           aic7xxx_set_syncrate(p, syncrate, target, channel, new_period,
  2484.                                new_offset, trans_options,
  2485.                                AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2486.           p->needsdtr &= ~target_mask;
  2487.         }
  2488.         done = TRUE;
  2489.         break;
  2490.       }
  2491.       case MSG_EXT_WDTR:
  2492.       {
  2493.           
  2494.         if (p->msg_buf[1] != MSG_EXT_WDTR_LEN)
  2495.         {
  2496.           reject = TRUE;
  2497.           break;
  2498.         }
  2499.         if (p->msg_len < (MSG_EXT_WDTR_LEN + 2))
  2500.         {
  2501.           break;
  2502.         }
  2503.         bus_width = new_bus_width = p->msg_buf[3];
  2504.         if ( (scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_WDTR)) ==
  2505.              (SCB_MSGOUT_SENT|SCB_MSGOUT_WDTR) )
  2506.         {
  2507.           switch(bus_width)
  2508.           {
  2509.             default:
  2510.             {
  2511.               reject = TRUE;
  2512.               if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
  2513.                    ((p->dev_flags[tindex] & DEVICE_PRINT_DTR) ||
  2514.                     (aic7xxx_verbose > 0xffff)) )
  2515.               {
  2516.                 printk(INFO_LEAD "Requesting %d bit transfers, rejecting.n",
  2517.                   p->host_no, CTL_OF_SCB(scb), 8 * (0x01 << bus_width));
  2518.               }
  2519.             } /* We fall through on purpose */
  2520.             case MSG_EXT_WDTR_BUS_8_BIT:
  2521.             {
  2522.               p->transinfo[tindex].goal_width = MSG_EXT_WDTR_BUS_8_BIT;
  2523.               p->needwdtr_copy &= ~target_mask;
  2524.               break;
  2525.             }
  2526.             case MSG_EXT_WDTR_BUS_16_BIT:
  2527.             {
  2528.               break;
  2529.             }
  2530.           }
  2531.           p->needwdtr &= ~target_mask;
  2532.           aic7xxx_set_width(p, target, channel, lun, new_bus_width,
  2533.                             AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2534.         }
  2535.         else
  2536.         {
  2537.           if ( !(p->dev_flags[tindex] & DEVICE_DTR_SCANNED) )
  2538.           {
  2539.             /* 
  2540.              * Well, we now know the WDTR and SYNC caps of this device since
  2541.              * it contacted us first, mark it as such and copy the user stuff
  2542.              * over to the goal stuff.
  2543.              */
  2544.             if( (p->features & AHC_WIDE) && p->transinfo[tindex].user_width )
  2545.             {
  2546.               p->transinfo[tindex].goal_width = MSG_EXT_WDTR_BUS_16_BIT;
  2547.               p->needwdtr_copy |= target_mask;
  2548.             }
  2549.             
  2550.             /*
  2551.              * Devices that support DT transfers don't start WDTR requests
  2552.              */
  2553.             p->transinfo[tindex].goal_options = 0;
  2554.             if(p->transinfo[tindex].user_offset)
  2555.             {
  2556.               p->needsdtr_copy |= target_mask;
  2557.               p->transinfo[tindex].goal_period =
  2558.                 MAX(10,p->transinfo[tindex].user_period);
  2559.               if(p->features & AHC_ULTRA2)
  2560.               {
  2561.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
  2562.               }
  2563.               else if( p->transinfo[tindex].goal_width )
  2564.               {
  2565.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
  2566.               }
  2567.               else
  2568.               {
  2569.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
  2570.               }
  2571.             } else {
  2572.               p->needsdtr_copy &= ~target_mask;
  2573.               p->transinfo[tindex].goal_period = 255;
  2574.               p->transinfo[tindex].goal_offset = 0;
  2575.             }
  2576.             
  2577.             p->dev_flags[tindex] |= DEVICE_DTR_SCANNED | DEVICE_PRINT_DTR;
  2578.           }
  2579.           else if ((p->needwdtr_copy & target_mask) == 0)
  2580.           {
  2581.             /*
  2582.              * This is a preemptive message from the target, we've already
  2583.              * scanned this target and set our options for it, and we
  2584.              * don't need a WDTR with this target (for whatever reason),
  2585.              * so reject this incoming WDTR
  2586.              */
  2587.             reject = TRUE;
  2588.             break;
  2589.           }
  2590.           /* The device is sending this message first and we have to reply */
  2591.           reply = TRUE;
  2592.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  2593.           {
  2594.             printk(INFO_LEAD "Received pre-emptive WDTR message from "
  2595.                    "target.n", p->host_no, CTL_OF_SCB(scb));
  2596.           }
  2597.           switch(bus_width)
  2598.           {
  2599.             case MSG_EXT_WDTR_BUS_16_BIT:
  2600.             {
  2601.               if ( (p->features & AHC_WIDE) &&
  2602.                    (p->transinfo[tindex].goal_width ==
  2603.                     MSG_EXT_WDTR_BUS_16_BIT) )
  2604.               {
  2605.                 new_bus_width = MSG_EXT_WDTR_BUS_16_BIT;
  2606.                 break;
  2607.               }
  2608.             } /* Fall through if we aren't a wide card */
  2609.             default:
  2610.             case MSG_EXT_WDTR_BUS_8_BIT:
  2611.             {
  2612.               p->needwdtr_copy &= ~target_mask;
  2613.               new_bus_width = MSG_EXT_WDTR_BUS_8_BIT;
  2614.               break;
  2615.             }
  2616.           }
  2617.           scb->flags &= ~SCB_MSGOUT_BITS;
  2618.           scb->flags |= SCB_MSGOUT_WDTR;
  2619.           p->needwdtr &= ~target_mask;
  2620.           if((p->dtr_pending & target_mask) == 0)
  2621.           {
  2622.             /* there is no other command with SCB_DTR_SCB already set that will
  2623.              * trigger the release of the dtr_pending bit.  Both set the bit
  2624.              * and set scb->flags |= SCB_DTR_SCB
  2625.              */
  2626.             p->dtr_pending |= target_mask;
  2627.             scb->flags |= SCB_DTR_SCB;
  2628.           }
  2629.           aic_outb(p, HOST_MSG, MSG_OUT);
  2630.           aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
  2631.           /* when sending a reply, make sure that the goal settings are
  2632.            * updated along with current and active since the code that
  2633.            * will actually build the message for the sequencer uses the
  2634.            * goal settings as its guidelines.
  2635.            */
  2636.           aic7xxx_set_width(p, target, channel, lun, new_bus_width,
  2637.                           AHC_TRANS_GOAL|AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2638.         }
  2639.         
  2640.         /*
  2641.          * By virtue of the SCSI spec, a WDTR message negates any existing
  2642.          * SDTR negotiations.  So, even if needsdtr isn't marked for this
  2643.          * device, we still have to do a new SDTR message if the device
  2644.          * supports SDTR at all.  Therefore, we check needsdtr_copy instead
  2645.          * of needstr.
  2646.          */
  2647.         aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0, 0,
  2648.                              AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
  2649.         p->needsdtr |= (p->needsdtr_copy & target_mask);
  2650.         done = TRUE;
  2651.         break;
  2652.       }
  2653.       case MSG_EXT_PPR:
  2654.       {
  2655.         
  2656.         if (p->msg_buf[1] != MSG_EXT_PPR_LEN)
  2657.         {
  2658.           reject = TRUE;
  2659.           break;
  2660.         }
  2661.         if (p->msg_len < (MSG_EXT_PPR_LEN + 2))
  2662.         {
  2663.           break;
  2664.         }
  2665.         period = new_period = p->msg_buf[3];
  2666.         offset = new_offset = p->msg_buf[5];
  2667.         bus_width = new_bus_width = p->msg_buf[6];
  2668.         trans_options = new_trans_options = p->msg_buf[7] & 0xf;
  2669.         if(aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  2670.         {
  2671.           printk(INFO_LEAD "Parsing PPR message (%d/%d/%d/%d)n",
  2672.                  p->host_no, CTL_OF_SCB(scb), period, offset, bus_width,
  2673.                  trans_options);
  2674.         }
  2675.         /*
  2676.          * We might have a device that is starting negotiation with us
  2677.          * before we can start up negotiation with it....be prepared to
  2678.          * have a device ask for a higher speed then we want to give it
  2679.          * in that case
  2680.          */
  2681.         if ( (scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_PPR)) !=
  2682.              (SCB_MSGOUT_SENT|SCB_MSGOUT_PPR) )
  2683.         { 
  2684.           /* Have we scanned the device yet? */
  2685.           if (!(p->dev_flags[tindex] & DEVICE_DTR_SCANNED))
  2686.           {
  2687.             /* The device is electing to use PPR messages, so we will too until
  2688.              * we know better */
  2689.             p->needppr |= target_mask;
  2690.             p->needppr_copy |= target_mask;
  2691.             p->needsdtr &= ~target_mask;
  2692.             p->needsdtr_copy &= ~target_mask;
  2693.             p->needwdtr &= ~target_mask;
  2694.             p->needwdtr_copy &= ~target_mask;
  2695.           
  2696.             /* We know the device is SCSI-3 compliant due to PPR */
  2697.             p->dev_flags[tindex] |= DEVICE_SCSI_3;
  2698.           
  2699.             /*
  2700.              * Not only is the device starting this up, but it also hasn't
  2701.              * been scanned yet, so this would likely be our TUR or our
  2702.              * INQUIRY command at scan time, so we need to use the
  2703.              * settings from the SEEPROM if they existed.  Of course, even
  2704.              * if we didn't find a SEEPROM, we stuffed default values into
  2705.              * the user settings anyway, so use those in all cases.
  2706.              */
  2707.             p->transinfo[tindex].goal_width =
  2708.               p->transinfo[tindex].user_width;
  2709.             if(p->transinfo[tindex].user_offset)
  2710.             {
  2711.               p->transinfo[tindex].goal_period =
  2712.                 p->transinfo[tindex].user_period;
  2713.               p->transinfo[tindex].goal_options =
  2714.                 p->transinfo[tindex].user_options;
  2715.               if(p->features & AHC_ULTRA2)
  2716.               {
  2717.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
  2718.               }
  2719.               else if( p->transinfo[tindex].goal_width &&
  2720.                        (bus_width == MSG_EXT_WDTR_BUS_16_BIT) &&
  2721.                        p->features & AHC_WIDE )
  2722.               {
  2723.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
  2724.               }
  2725.               else
  2726.               {
  2727.                 p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
  2728.               }
  2729.             }
  2730.             else
  2731.             {
  2732.               p->transinfo[tindex].goal_period = 255;
  2733.               p->transinfo[tindex].goal_offset = 0;
  2734.               p->transinfo[tindex].goal_options = 0;
  2735.             }
  2736.             p->dev_flags[tindex] |= DEVICE_DTR_SCANNED | DEVICE_PRINT_DTR;
  2737.           }
  2738.           else if ((p->needppr_copy & target_mask) == 0)
  2739.           {
  2740.             /*
  2741.              * This is a preemptive message from the target, we've already
  2742.              * scanned this target and set our options for it, and we
  2743.              * don't need a PPR with this target (for whatever reason),
  2744.              * so reject this incoming PPR
  2745.              */
  2746.             reject = TRUE;
  2747.             break;
  2748.           }
  2749.           /* The device is sending this message first and we have to reply */
  2750.           reply = TRUE;
  2751.           
  2752.           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
  2753.           {
  2754.             printk(INFO_LEAD "Received pre-emptive PPR message from "
  2755.                    "target.n", p->host_no, CTL_OF_SCB(scb));
  2756.           }
  2757.         }
  2758.         switch(bus_width)
  2759.         {
  2760.           case MSG_EXT_WDTR_BUS_16_BIT:
  2761.           {
  2762.             if ( (p->transinfo[tindex].goal_width ==
  2763.                   MSG_EXT_WDTR_BUS_16_BIT) && p->features & AHC_WIDE)
  2764.             {
  2765.               break;
  2766.             }
  2767.           }
  2768.           default:
  2769.           {
  2770.             if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
  2771.                  ((p->dev_flags[tindex] & DEVICE_PRINT_DTR) ||
  2772.                   (aic7xxx_verbose > 0xffff)) )
  2773.             {
  2774.               reply = TRUE;
  2775.               printk(INFO_LEAD "Requesting %d bit transfers, rejecting.n",
  2776.                 p->host_no, CTL_OF_SCB(scb), 8 * (0x01 << bus_width));
  2777.             }
  2778.           } /* We fall through on purpose */
  2779.           case MSG_EXT_WDTR_BUS_8_BIT:
  2780.           {
  2781.             /*
  2782.              * According to the spec, if we aren't wide, we also can't be
  2783.              * Dual Edge so clear the options byte
  2784.              */
  2785.             new_trans_options = 0;
  2786.             new_bus_width = MSG_EXT_WDTR_BUS_8_BIT;
  2787.             break;
  2788.           }
  2789.         }
  2790.         if(reply)
  2791.         {
  2792.           /* when sending a reply, make sure that the goal settings are
  2793.            * updated along with current and active since the code that
  2794.            * will actually build the message for the sequencer uses the
  2795.            * goal settings as its guidelines.
  2796.            */
  2797.           aic7xxx_set_width(p, target, channel, lun, new_bus_width,
  2798.                             AHC_TRANS_GOAL|AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2799.           syncrate = aic7xxx_find_syncrate(p, &new_period, maxsync,
  2800.                                            &new_trans_options);
  2801.           aic7xxx_validate_offset(p, syncrate, &new_offset, new_bus_width);
  2802.           aic7xxx_set_syncrate(p, syncrate, target, channel, new_period,
  2803.                                new_offset, new_trans_options,
  2804.                                AHC_TRANS_GOAL|AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2805.         }
  2806.         else
  2807.         {
  2808.           aic7xxx_set_width(p, target, channel, lun, new_bus_width,
  2809.                             AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2810.           syncrate = aic7xxx_find_syncrate(p, &new_period, maxsync,
  2811.                                            &new_trans_options);
  2812.           aic7xxx_validate_offset(p, syncrate, &new_offset, new_bus_width);
  2813.           aic7xxx_set_syncrate(p, syncrate, target, channel, new_period,
  2814.                                new_offset, new_trans_options,
  2815.                                AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
  2816.         }
  2817.         /*
  2818.          * As it turns out, if we don't *have* to have PPR messages, then
  2819.          * configure ourselves not to use them since that makes some
  2820.          * external drive chassis work (those chassis can't parse PPR
  2821.          * messages and they mangle the SCSI bus until you send a WDTR
  2822.          * and SDTR that they can understand).
  2823.          */
  2824.         if(new_trans_options == 0)
  2825.         {
  2826.           p->needppr &= ~target_mask;
  2827.           p->needppr_copy &= ~target_mask;
  2828.           if(new_offset)
  2829.           {
  2830.             p->needsdtr |= target_mask;
  2831.             p->needsdtr_copy |= target_mask;
  2832.           }
  2833.           if (new_bus_width)
  2834.           {
  2835.             p->needwdtr |= target_mask;
  2836.             p->needwdtr_copy |= target_mask;
  2837.           }
  2838.         }