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

嵌入式Linux

开发平台:

Unix_Linux

  1.  *
  2.  * This function is called from init/main.c at boot time.
  3.  * It it passed LILO parameters that can be set from the
  4.  * LILO command line or in /etc/lilo.conf.
  5.  *
  6.  * It is used by the AdvanSys driver to either disable I/O
  7.  * port scanning or to limit scanning to 1 - 4 I/O ports.
  8.  * Regardless of the option setting EISA and PCI boards
  9.  * will still be searched for and detected. This option
  10.  * only affects searching for ISA and VL boards.
  11.  *
  12.  * If ADVANSYS_DEBUG is defined the driver debug level may
  13.  * be set using the 5th (ASC_NUM_IOPORT_PROBE + 1) I/O Port.
  14.  *
  15.  * Examples:
  16.  * 1. Eliminate I/O port scanning:
  17.  *         boot: linux advansys=
  18.  *       or
  19.  *         boot: linux advansys=0x0
  20.  * 2. Limit I/O port scanning to one I/O port:
  21.  *        boot: linux advansys=0x110
  22.  * 3. Limit I/O port scanning to four I/O ports:
  23.  *        boot: linux advansys=0x110,0x210,0x230,0x330
  24.  * 4. If ADVANSYS_DEBUG, limit I/O port scanning to four I/O ports and
  25.  *    set the driver debug level to 2.
  26.  *        boot: linux advansys=0x110,0x210,0x230,0x330,0xdeb2
  27.  *
  28.  * ints[0] - number of arguments
  29.  * ints[1] - first argument
  30.  * ints[2] - second argument
  31.  * ...
  32.  */
  33. ASC_INITFUNC(
  34. void,
  35. advansys_setup(char *str, int *ints)
  36. )
  37. {
  38.     int    i;
  39.     if (asc_iopflag == ASC_TRUE) {
  40.         printk("AdvanSys SCSI: 'advansys' LILO option may appear only oncen");
  41.         return;
  42.     }
  43.     asc_iopflag = ASC_TRUE;
  44.     if (ints[0] > ASC_NUM_IOPORT_PROBE) {
  45. #ifdef ADVANSYS_DEBUG
  46.         if ((ints[0] == ASC_NUM_IOPORT_PROBE + 1) &&
  47.             (ints[ASC_NUM_IOPORT_PROBE + 1] >> 4 == 0xdeb)) {
  48.             asc_dbglvl = ints[ASC_NUM_IOPORT_PROBE + 1] & 0xf;
  49.         } else {
  50. #endif /* ADVANSYS_DEBUG */
  51.             printk("AdvanSys SCSI: only %d I/O ports acceptedn",
  52.                 ASC_NUM_IOPORT_PROBE);
  53. #ifdef ADVANSYS_DEBUG
  54.         }
  55. #endif /* ADVANSYS_DEBUG */
  56.     }
  57. #ifdef ADVANSYS_DEBUG
  58.     ASC_DBG1(1, "advansys_setup: ints[0] %dn", ints[0]);
  59.     for (i = 1; i < ints[0]; i++) {
  60.         ASC_DBG2(1, " ints[%d] 0x%x", i, ints[i]);
  61.     }
  62.     ASC_DBG(1, "n");
  63. #endif /* ADVANSYS_DEBUG */
  64.     for (i = 1; i <= ints[0] && i <= ASC_NUM_IOPORT_PROBE; i++) {
  65.         asc_ioport[i-1] = ints[i];
  66.         ASC_DBG2(1, "advansys_setup: asc_ioport[%d] 0x%xn",
  67.             i - 1, asc_ioport[i-1]);
  68.     }
  69. }
  70. /*
  71.  * --- Loadable Driver Support
  72.  */
  73. #if ASC_LINUX_KERNEL24
  74. static
  75. #endif
  76. #if ASC_LINUX_KERNEL24 || (ASC_LINUX_KERNEL22 && defined(MODULE))
  77. Scsi_Host_Template driver_template = ADVANSYS;
  78. # include "scsi_module.c"
  79. #endif
  80. /*
  81.  * --- Miscellaneous Driver Functions
  82.  */
  83. /*
  84.  * First-level interrupt handler.
  85.  *
  86.  * 'dev_id' is a pointer to the interrupting adapter's asc_board_t. Because
  87.  * all boards are currently checked for interrupts on each interrupt, 'dev_id'
  88.  * is not referenced. 'dev_id' could be used to identify an interrupt passed
  89.  * to the AdvanSys driver which is for a device sharing an interrupt with
  90.  * an AdvanSys adapter.
  91.  */
  92. STATIC void
  93. advansys_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  94. {
  95.     ulong           flags;
  96.     int             i;
  97.     asc_board_t     *boardp;
  98.     Scsi_Cmnd       *done_scp = NULL, *last_scp = NULL;
  99.     Scsi_Cmnd       *new_last_scp;
  100.     ASC_DBG(1, "advansys_interrupt: beginn");
  101.     /*
  102.      * Check for interrupts on all boards.
  103.      * AscISR() will call asc_isr_callback().
  104.      */
  105.     for (i = 0; i < asc_board_count; i++) {
  106.         boardp = ASC_BOARDP(asc_host[i]);
  107.         ASC_DBG2(2, "advansys_interrupt: i %d, boardp 0x%lxn",
  108.             i, (ulong) boardp);
  109.         spin_lock_irqsave(&boardp->lock, flags);
  110.         if (ASC_NARROW_BOARD(boardp)) {
  111.             /*
  112.              * Narrow Board
  113.              */
  114.             if (AscIsIntPending(asc_host[i]->io_port)) {
  115.                 ASC_STATS(asc_host[i], interrupt);
  116.                 ASC_DBG(1, "advansys_interrupt: before AscISR()n");
  117.                 AscISR(&boardp->dvc_var.asc_dvc_var);
  118.             }
  119.         } else {
  120.             /*
  121.              * Wide Board
  122.              */
  123.             ASC_DBG(1, "advansys_interrupt: before AdvISR()n");
  124.             if (AdvISR(&boardp->dvc_var.adv_dvc_var)) {
  125.                 ASC_STATS(asc_host[i], interrupt);
  126.             }
  127.         }
  128.         /*
  129.          * Start waiting requests and create a list of completed requests.
  130.          *
  131.          * If a reset request is being performed for the board, the reset
  132.          * handler will complete pending requests after it has completed.
  133.          */
  134.         if ((boardp->flags & ASC_HOST_IN_RESET) == 0) {
  135.             ASC_DBG2(1, "advansys_interrupt: done_scp 0x%lx, last_scp 0x%lxn",
  136.                 (ulong) done_scp, (ulong) last_scp);
  137.             /* Start any waiting commands for the board. */
  138.             if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
  139.                 ASC_DBG(1, "advansys_interrupt: before asc_execute_queue()n");
  140.                 asc_execute_queue(&boardp->waiting);
  141.             }
  142.              /*
  143.               * Add to the list of requests that must be completed.
  144.               *
  145.               * 'done_scp' will always be NULL on the first iteration
  146.               * of this loop. 'last_scp' is set at the same time as
  147.               * 'done_scp'.
  148.               */
  149.             if (done_scp == NULL) {
  150.                 done_scp = asc_dequeue_list(&boardp->done, &last_scp,
  151.                     ASC_TID_ALL);
  152.             } else {
  153.                 ASC_ASSERT(last_scp != NULL);
  154.                 REQPNEXT(last_scp) = asc_dequeue_list(&boardp->done,
  155.                     &new_last_scp, ASC_TID_ALL);
  156.                 if (new_last_scp != NULL) {
  157.                     ASC_ASSERT(REQPNEXT(last_scp) != NULL);
  158.                     last_scp = new_last_scp;
  159.                 }
  160.             }
  161.         }
  162.         spin_unlock_irqrestore(&boardp->lock, flags);
  163.     }
  164.     /*
  165.      * If interrupts were enabled on entry, then they
  166.      * are now enabled here.
  167.      *
  168.      * Complete all requests on the done list.
  169.      */
  170.     asc_scsi_done_list(done_scp);
  171.     ASC_DBG(1, "advansys_interrupt: endn");
  172.     return;
  173. }
  174. /*
  175.  * Set the number of commands to queue per device for the
  176.  * specified host adapter.
  177.  */
  178. STATIC void
  179. advansys_select_queue_depths(struct Scsi_Host *shp, Scsi_Device *devicelist)
  180. {
  181.     Scsi_Device        *device;
  182.     asc_board_t        *boardp;
  183.     boardp = ASC_BOARDP(shp);
  184.     boardp->flags |= ASC_SELECT_QUEUE_DEPTHS;
  185.     for (device = devicelist; device != NULL; device = device->next) {
  186.         if (device->host != shp) {
  187.             continue;
  188.         }
  189.         /*
  190.          * Save a pointer to the device and set its initial/maximum
  191.          * queue depth.
  192.          */
  193.         boardp->device[device->id] = device;
  194.         if (ASC_NARROW_BOARD(boardp)) {
  195.             device->queue_depth =
  196.                 boardp->dvc_var.asc_dvc_var.max_dvc_qng[device->id];
  197.         } else {
  198.             device->queue_depth =
  199.                 boardp->dvc_var.adv_dvc_var.max_dvc_qng;
  200.         }
  201.         ASC_DBG3(1,
  202.             "advansys_select_queue_depths: shp 0x%lx, id %d, depth %dn",
  203.             (ulong) shp, device->id, device->queue_depth);
  204.     }
  205. }
  206. /*
  207.  * Complete all requests on the singly linked list pointed
  208.  * to by 'scp'.
  209.  *
  210.  * Interrupts can be enabled on entry.
  211.  */
  212. STATIC void
  213. asc_scsi_done_list(Scsi_Cmnd *scp)
  214. {
  215.     Scsi_Cmnd    *tscp;
  216.     ASC_DBG(2, "asc_scsi_done_list: beginn");
  217.     while (scp != NULL) {
  218.         ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lxn", (ulong) scp);
  219.         tscp = REQPNEXT(scp);
  220.         REQPNEXT(scp) = NULL;
  221.         ASC_STATS(scp->host, done);
  222.         ASC_ASSERT(scp->scsi_done != NULL);
  223.         scp->scsi_done(scp);
  224.         scp = tscp;
  225.     }
  226.     ASC_DBG(2, "asc_scsi_done_list: donen");
  227.     return;
  228. }
  229. /*
  230.  * Execute a single 'Scsi_Cmnd'.
  231.  *
  232.  * The function 'done' is called when the request has been completed.
  233.  *
  234.  * Scsi_Cmnd:
  235.  *
  236.  *  host - board controlling device
  237.  *  device - device to send command
  238.  *  target - target of device
  239.  *  lun - lun of device
  240.  *  cmd_len - length of SCSI CDB
  241.  *  cmnd - buffer for SCSI 8, 10, or 12 byte CDB
  242.  *  use_sg - if non-zero indicates scatter-gather request with use_sg elements
  243.  *
  244.  *  if (use_sg == 0) {
  245.  *    request_buffer - buffer address for request
  246.  *    request_bufflen - length of request buffer
  247.  *  } else {
  248.  *    request_buffer - pointer to scatterlist structure
  249.  *  }
  250.  *
  251.  *  sense_buffer - sense command buffer
  252.  *
  253.  *  result (4 bytes of an int):
  254.  *    Byte Meaning
  255.  *    0 SCSI Status Byte Code
  256.  *    1 SCSI One Byte Message Code
  257.  *    2 Host Error Code
  258.  *    3 Mid-Level Error Code
  259.  *
  260.  *  host driver fields:
  261.  *    SCp - Scsi_Pointer used for command processing status
  262.  *    scsi_done - used to save caller's done function
  263.  *    host_scribble - used for pointer to another Scsi_Cmnd
  264.  *
  265.  * If this function returns ASC_NOERROR the request has been enqueued
  266.  * on the board's 'active' queue and will be completed from the
  267.  * interrupt handler.
  268.  *
  269.  * If this function returns ASC_NOERROR the request has been enqueued
  270.  * on the board's 'done' queue and must be completed by the caller.
  271.  *
  272.  * If ASC_BUSY is returned the request will be enqueued by the
  273.  * caller on the target's waiting queue and re-tried later.
  274.  */
  275. STATIC int
  276. asc_execute_scsi_cmnd(Scsi_Cmnd *scp)
  277. {
  278.     asc_board_t        *boardp;
  279.     ASC_DVC_VAR        *asc_dvc_varp;
  280.     ADV_DVC_VAR        *adv_dvc_varp;
  281.     ADV_SCSI_REQ_Q     *adv_scsiqp;
  282.     Scsi_Device        *device;
  283.     int                ret;
  284.     ASC_DBG2(1, "asc_execute_scsi_cmnd: scp 0x%lx, done 0x%lxn",
  285.         (ulong) scp, (ulong) scp->scsi_done);
  286.     boardp = ASC_BOARDP(scp->host);
  287.     device = boardp->device[scp->target];
  288.     if (ASC_NARROW_BOARD(boardp)) {
  289.         /*
  290.          * Build and execute Narrow Board request.
  291.          */
  292.         asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
  293.         /*
  294.          * Build Asc Library request structure using the
  295.          * global structures 'asc_scsi_req' and 'asc_sg_head'.
  296.          *
  297.          * If an error is returned, then the request has been
  298.          * queued on the board done queue. It will be completed
  299.          * by the caller.
  300.          *
  301.          * asc_build_req() can not return ASC_BUSY.
  302.          */
  303.         if (asc_build_req(boardp, scp) == ASC_ERROR) {
  304.             ASC_STATS(scp->host, build_error);
  305.             return ASC_ERROR;
  306.         }
  307.         /*
  308.          * Execute the command. If there is no error, add the command
  309.          * to the active queue.
  310.          */
  311.         switch (ret = AscExeScsiQueue(asc_dvc_varp, &asc_scsi_q)) {
  312.         case ASC_NOERROR:
  313.             ASC_STATS(scp->host, exe_noerror);
  314.             /*
  315.              * Increment monotonically increasing per device successful
  316.              * request counter. Wrapping doesn't matter.
  317.              */
  318.             boardp->reqcnt[scp->target]++;
  319.             asc_enqueue(&boardp->active, scp, ASC_BACK);
  320.             ASC_DBG(1,
  321.                 "asc_execute_scsi_cmnd: AscExeScsiQueue(), ASC_NOERRORn");
  322.             break;
  323.         case ASC_BUSY:
  324.             /*
  325.              * Caller will enqueue request on the target's waiting queue
  326.              * and retry later.
  327.              */
  328.             ASC_STATS(scp->host, exe_busy);
  329.             break;
  330.         case ASC_ERROR:
  331.             ASC_PRINT2(
  332. "asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() ASC_ERROR, err_code 0x%xn",
  333.                 boardp->id, asc_dvc_varp->err_code);
  334.             ASC_STATS(scp->host, exe_error);
  335.             scp->result = HOST_BYTE(DID_ERROR);
  336.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  337.             break;
  338.         default:
  339.             ASC_PRINT2(
  340. "asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() unknown, err_code 0x%xn",
  341.                 boardp->id, asc_dvc_varp->err_code);
  342.             ASC_STATS(scp->host, exe_unknown);
  343.             scp->result = HOST_BYTE(DID_ERROR);
  344.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  345.             break;
  346.         }
  347.     } else {
  348.         /*
  349.          * Build and execute Wide Board request.
  350.          */
  351.         adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
  352.         /*
  353.          * Build and get a pointer to an Adv Library request structure.
  354.          *
  355.          * If the request is successfully built then send it below,
  356.          * otherwise return with an error.
  357.          */
  358.         switch (adv_build_req(boardp, scp, &adv_scsiqp)) {
  359.         case ASC_NOERROR:
  360.             ASC_DBG(3, "asc_execute_scsi_cmnd: adv_build_req ASC_NOERRORn");
  361.             break;
  362.         case ASC_BUSY:
  363.             ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req ASC_BUSYn");
  364.             /*
  365.              * If busy is returned the request has not been enqueued.
  366.              * It will be enqueued by the caller on the target's waiting
  367.              * queue and retried later.
  368.              *
  369.              * The asc_stats fields 'adv_build_noreq' and 'adv_build_nosg'
  370.              * count wide board busy conditions. They are updated in
  371.              * adv_build_req and adv_get_sglist, respectively.
  372.              */
  373.             return ASC_BUSY;
  374.         case ASC_ERROR:
  375.              /* 
  376.               * If an error is returned, then the request has been
  377.               * queued on the board done queue. It will be completed
  378.               * by the caller.
  379.               */
  380.         default:
  381.             ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req ASC_ERRORn");
  382.             ASC_STATS(scp->host, build_error);
  383.             return ASC_ERROR;
  384.         }
  385.         /*
  386.          * Execute the command. If there is no error, add the command
  387.          * to the active queue.
  388.          */
  389.         switch (ret = AdvExeScsiQueue(adv_dvc_varp, adv_scsiqp)) {
  390.         case ASC_NOERROR:
  391.             ASC_STATS(scp->host, exe_noerror);
  392.             /*
  393.              * Increment monotonically increasing per device successful
  394.              * request counter. Wrapping doesn't matter.
  395.              */
  396.             boardp->reqcnt[scp->target]++;
  397.             asc_enqueue(&boardp->active, scp, ASC_BACK);
  398.             ASC_DBG(1,
  399.                 "asc_execute_scsi_cmnd: AdvExeScsiQueue(), ASC_NOERRORn");
  400.             break;
  401.         case ASC_BUSY:
  402.             /*
  403.              * Caller will enqueue request on the target's waiting queue
  404.              * and retry later.
  405.              */
  406.             ASC_STATS(scp->host, exe_busy);
  407.             break;
  408.         case ASC_ERROR:
  409.             ASC_PRINT2(
  410. "asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() ASC_ERROR, err_code 0x%xn",
  411.                 boardp->id, adv_dvc_varp->err_code);
  412.             ASC_STATS(scp->host, exe_error);
  413.             scp->result = HOST_BYTE(DID_ERROR);
  414.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  415.             break;
  416.         default:
  417.             ASC_PRINT2(
  418. "asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() unknown, err_code 0x%xn",
  419.                 boardp->id, adv_dvc_varp->err_code);
  420.             ASC_STATS(scp->host, exe_unknown);
  421.             scp->result = HOST_BYTE(DID_ERROR);
  422.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  423.             break;
  424.         }
  425.     }
  426.     ASC_DBG(1, "asc_execute_scsi_cmnd: endn");
  427.     return ret;
  428. }
  429. /*
  430.  * Build a request structure for the Asc Library (Narrow Board).
  431.  *
  432.  * The global structures 'asc_scsi_q' and 'asc_sg_head' are
  433.  * used to build the request.
  434.  *
  435.  * If an error occurs, then queue the request on the board done
  436.  * queue and return ASC_ERROR.
  437.  */
  438. STATIC int
  439. asc_build_req(asc_board_t *boardp, Scsi_Cmnd *scp)
  440. {
  441.     /*
  442.      * Mutually exclusive access is required to 'asc_scsi_q' and
  443.      * 'asc_sg_head' until after the request is started.
  444.      */
  445.     memset(&asc_scsi_q, 0, sizeof(ASC_SCSI_Q));
  446.     /*
  447.      * Point the ASC_SCSI_Q to the 'Scsi_Cmnd'.
  448.      */
  449.     asc_scsi_q.q2.srb_ptr = ASC_VADDR_TO_U32(scp);
  450.     /*
  451.      * Build the ASC_SCSI_Q request.
  452.      *
  453.      * For narrow boards a CDB length maximum of 12 bytes
  454.      * is supported.
  455.      */
  456.     if (scp->cmd_len > ASC_MAX_CDB_LEN) {
  457.         ASC_PRINT3(
  458. "asc_build_req: board %d: cmd_len %d > ASC_MAX_CDB_LEN  %dn",
  459.             boardp->id, scp->cmd_len, ASC_MAX_CDB_LEN);
  460.         scp->result = HOST_BYTE(DID_ERROR);
  461.         asc_enqueue(&boardp->done, scp, ASC_BACK);
  462.         return ASC_ERROR;
  463.     }
  464.     asc_scsi_q.cdbptr = &scp->cmnd[0];
  465.     asc_scsi_q.q2.cdb_len = scp->cmd_len;
  466.     asc_scsi_q.q1.target_id = ASC_TID_TO_TARGET_ID(scp->target);
  467.     asc_scsi_q.q1.target_lun = scp->lun;
  468.     asc_scsi_q.q2.target_ix = ASC_TIDLUN_TO_IX(scp->target, scp->lun);
  469.     asc_scsi_q.q1.sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
  470.     asc_scsi_q.q1.sense_len = sizeof(scp->sense_buffer);
  471.     /*
  472.      * If there are any outstanding requests for the current target,
  473.      * then every 255th request send an ORDERED request. This heuristic
  474.      * tries to retain the benefit of request sorting while preventing
  475.      * request starvation. 255 is the max number of tags or pending commands
  476.      * a device may have outstanding.
  477.      *
  478.      * The request count is incremented below for every successfully
  479.      * started request.
  480.      *
  481.      */
  482.     if ((boardp->dvc_var.asc_dvc_var.cur_dvc_qng[scp->target] > 0) &&
  483.         (boardp->reqcnt[scp->target] % 255) == 0) {
  484.         asc_scsi_q.q2.tag_code = M2_QTAG_MSG_ORDERED;
  485.     } else {
  486.         asc_scsi_q.q2.tag_code = M2_QTAG_MSG_SIMPLE;
  487.     }
  488.     /*
  489.      * Build ASC_SCSI_Q for a contiguous buffer or a scatter-gather
  490.      * buffer command.
  491.      */
  492.     if (scp->use_sg == 0) {
  493.         /*
  494.          * CDB request of single contiguous buffer.
  495.          */
  496.         ASC_STATS(scp->host, cont_cnt);
  497.         asc_scsi_q.q1.data_addr =
  498.             cpu_to_le32(virt_to_bus(scp->request_buffer));
  499.         asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
  500.         ASC_STATS_ADD(scp->host, cont_xfer,
  501.                       ASC_CEILING(scp->request_bufflen, 512));
  502.         asc_scsi_q.q1.sg_queue_cnt = 0;
  503.         asc_scsi_q.sg_head = NULL;
  504.     } else {
  505.         /*
  506.          * CDB scatter-gather request list.
  507.          */
  508.         int                     sgcnt;
  509.         struct scatterlist      *slp;
  510.         if (scp->use_sg > scp->host->sg_tablesize) {
  511.             ASC_PRINT3(
  512. "asc_build_req: board %d: use_sg %d > sg_tablesize %dn",
  513.                 boardp->id, scp->use_sg, scp->host->sg_tablesize);
  514.             scp->result = HOST_BYTE(DID_ERROR);
  515.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  516.             return ASC_ERROR;
  517.         }
  518.         ASC_STATS(scp->host, sg_cnt);
  519.         /*
  520.          * Use global ASC_SG_HEAD structure and set the ASC_SCSI_Q
  521.          * structure to point to it.
  522.          */
  523.         memset(&asc_sg_head, 0, sizeof(ASC_SG_HEAD));
  524.         asc_scsi_q.q1.cntl |= QC_SG_HEAD;
  525.         asc_scsi_q.sg_head = &asc_sg_head;
  526.         asc_scsi_q.q1.data_cnt = 0;
  527.         asc_scsi_q.q1.data_addr = 0;
  528.         /* This is a byte value, otherwise it would need to be swapped. */
  529.         asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = scp->use_sg;
  530.         ASC_STATS_ADD(scp->host, sg_elem, asc_sg_head.entry_cnt);
  531.         /*
  532.          * Convert scatter-gather list into ASC_SG_HEAD list.
  533.          */
  534.         slp = (struct scatterlist *) scp->request_buffer;
  535.         for (sgcnt = 0; sgcnt < scp->use_sg; sgcnt++, slp++) {
  536.             asc_sg_head.sg_list[sgcnt].addr =
  537.                 cpu_to_le32(virt_to_bus(slp->address));
  538.             asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(slp->length);
  539.             ASC_STATS_ADD(scp->host, sg_xfer, ASC_CEILING(slp->length, 512));
  540.         }
  541.     }
  542.     ASC_DBG_PRT_ASC_SCSI_Q(2, &asc_scsi_q);
  543.     ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
  544.     return ASC_NOERROR;
  545. }
  546. /*
  547.  * Build a request structure for the Adv Library (Wide Board).
  548.  *
  549.  * If an adv_req_t can not be allocated to issue the request,
  550.  * then return ASC_BUSY. If an error occurs, then return ASC_ERROR.
  551.  *
  552.  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the
  553.  * microcode for DMA addresses or math operations are byte swapped
  554.  * to little-endian order.
  555.  */
  556. STATIC int
  557. adv_build_req(asc_board_t *boardp, Scsi_Cmnd *scp,
  558.     ADV_SCSI_REQ_Q **adv_scsiqpp)
  559. {
  560.     adv_req_t           *reqp;
  561.     ADV_SCSI_REQ_Q      *scsiqp;
  562.     int                 i;
  563.     int                 ret;
  564.     /*
  565.      * Allocate an adv_req_t structure from the board to execute
  566.      * the command.
  567.      */
  568.     if (boardp->adv_reqp == NULL) {
  569.         ASC_DBG(1, "adv_build_req: no free adv_req_tn");
  570.         ASC_STATS(scp->host, adv_build_noreq);
  571.         return ASC_BUSY;
  572.     } else {
  573.         reqp = boardp->adv_reqp;
  574.         boardp->adv_reqp = reqp->next_reqp;
  575.         reqp->next_reqp = NULL;
  576.     }
  577.     /*
  578.      * Get 32-byte aligned ADV_SCSI_REQ_Q and ADV_SG_BLOCK pointers.
  579.      */
  580.     scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
  581.     /*
  582.      * Initialize the structure.
  583.      */
  584.     scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0;
  585.     /*
  586.      * Set the ADV_SCSI_REQ_Q 'srb_ptr' to point to the adv_req_t structure.
  587.      */
  588.     scsiqp->srb_ptr = ASC_VADDR_TO_U32(reqp);
  589.     /*
  590.      * Set the adv_req_t 'cmndp' to point to the Scsi_Cmnd structure.
  591.      */
  592.     reqp->cmndp = scp;
  593.     /*
  594.      * Build the ADV_SCSI_REQ_Q request.
  595.      */
  596.     /*
  597.      * Set CDB length and copy it to the request structure.
  598.      * For wide  boards a CDB length maximum of 16 bytes
  599.      * is supported.
  600.      */
  601.     if (scp->cmd_len > ADV_MAX_CDB_LEN) {
  602.         ASC_PRINT3(
  603. "adv_build_req: board %d: cmd_len %d > ADV_MAX_CDB_LEN  %dn",
  604.             boardp->id, scp->cmd_len, ADV_MAX_CDB_LEN);
  605.         scp->result = HOST_BYTE(DID_ERROR);
  606.         asc_enqueue(&boardp->done, scp, ASC_BACK);
  607.         return ASC_ERROR;
  608.     }
  609.     scsiqp->cdb_len = scp->cmd_len;
  610.     /* Copy first 12 CDB bytes to cdb[]. */
  611.     for (i = 0; i < scp->cmd_len && i < 12; i++) {
  612.         scsiqp->cdb[i] = scp->cmnd[i];
  613.     }
  614.     /* Copy last 4 CDB bytes, if present, to cdb16[]. */
  615.     for (; i < scp->cmd_len; i++) {
  616.         scsiqp->cdb16[i - 12] = scp->cmnd[i];
  617.     }
  618.     scsiqp->target_id = scp->target;
  619.     scsiqp->target_lun = scp->lun;
  620.     scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
  621.     scsiqp->sense_len = sizeof(scp->sense_buffer);
  622.     /*
  623.      * Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
  624.      * buffer command.
  625.      */
  626.     scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
  627.     scsiqp->vdata_addr = scp->request_buffer;
  628.     scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
  629.     if (scp->use_sg == 0) {
  630.         /*
  631.          * CDB request of single contiguous buffer.
  632.          */
  633.         reqp->sgblkp = NULL;
  634.         scsiqp->sg_list_ptr = NULL;
  635.         scsiqp->sg_real_addr = 0;
  636.         ASC_STATS(scp->host, cont_cnt);
  637.         ASC_STATS_ADD(scp->host, cont_xfer,
  638.                       ASC_CEILING(scp->request_bufflen, 512));
  639.     } else {
  640.         /*
  641.          * CDB scatter-gather request list.
  642.          */
  643.         if (scp->use_sg > ADV_MAX_SG_LIST) {
  644.             ASC_PRINT3(
  645. "adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %dn",
  646.                 boardp->id, scp->use_sg, scp->host->sg_tablesize);
  647.             scp->result = HOST_BYTE(DID_ERROR);
  648.             asc_enqueue(&boardp->done, scp, ASC_BACK);
  649.             /*
  650.              * Free the 'adv_req_t' structure by adding it back to the
  651.              * board free list.
  652.              */
  653.             reqp->next_reqp = boardp->adv_reqp;
  654.             boardp->adv_reqp = reqp;
  655.             return ASC_ERROR;
  656.         }
  657.         if ((ret = adv_get_sglist(boardp, reqp, scp)) != ADV_SUCCESS) {
  658.             /*
  659.              * Free the adv_req_t structure by adding it back to the
  660.              * board free list.
  661.              */
  662.             reqp->next_reqp = boardp->adv_reqp;
  663.             boardp->adv_reqp = reqp;
  664.             return ret;
  665.         }
  666.         ASC_STATS(scp->host, sg_cnt);
  667.         ASC_STATS_ADD(scp->host, sg_elem, scp->use_sg);
  668.     }
  669.     ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
  670.     ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
  671.     *adv_scsiqpp = scsiqp;
  672.     return ASC_NOERROR;
  673. }
  674. /*
  675.  * Build scatter-gather list for Adv Library (Wide Board).
  676.  *
  677.  * Additional ADV_SG_BLOCK structures will need to be allocated
  678.  * if the total number of scatter-gather elements exceeds
  679.  * NO_OF_SG_PER_BLOCK (15). The ADV_SG_BLOCK structures are
  680.  * assumed to be physically contiguous.
  681.  *
  682.  * Return:
  683.  *      ADV_SUCCESS(1) - SG List successfully created
  684.  *      ADV_ERROR(-1) - SG List creation failed
  685.  */
  686. STATIC int
  687. adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, Scsi_Cmnd *scp)
  688. {
  689.     adv_sgblk_t         *sgblkp;
  690.     ADV_SCSI_REQ_Q      *scsiqp;
  691.     struct scatterlist  *slp;
  692.     int                 sg_elem_cnt;
  693.     ADV_SG_BLOCK        *sg_block, *prev_sg_block;
  694.     ADV_PADDR           sg_block_paddr;
  695.     int                 i;
  696.     scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
  697.     slp = (struct scatterlist *) scp->request_buffer;
  698.     sg_elem_cnt = scp->use_sg;
  699.     prev_sg_block = NULL;
  700.     reqp->sgblkp = NULL;
  701.     do
  702.     {
  703.         /*
  704.          * Allocate a 'adv_sgblk_t' structure from the board free
  705.          * list. One 'adv_sgblk_t' structure holds NO_OF_SG_PER_BLOCK
  706.          * (15) scatter-gather elements.
  707.          */
  708.         if ((sgblkp = boardp->adv_sgblkp) == NULL) {
  709.             ASC_DBG(1, "adv_get_sglist: no free adv_sgblk_tn");
  710.             ASC_STATS(scp->host, adv_build_nosg);
  711.             /*
  712.              * Allocation failed. Free 'adv_sgblk_t' structures already
  713.              * allocated for the request.
  714.              */
  715.             while ((sgblkp = reqp->sgblkp) != NULL)
  716.             {
  717.                 /* Remove 'sgblkp' from the request list. */
  718.                 reqp->sgblkp = sgblkp->next_sgblkp;
  719.                 /* Add 'sgblkp' to the board free list. */
  720.                 sgblkp->next_sgblkp = boardp->adv_sgblkp;
  721.                 boardp->adv_sgblkp = sgblkp;
  722.             }
  723.             return ASC_BUSY;
  724.         } else {
  725.             /* Complete 'adv_sgblk_t' board allocation. */
  726.             boardp->adv_sgblkp = sgblkp->next_sgblkp;
  727.             sgblkp->next_sgblkp = NULL;
  728.             /*
  729.              * Get 8 byte aligned virtual and physical addresses for
  730.              * the allocated ADV_SG_BLOCK structure.
  731.              */
  732.             sg_block = (ADV_SG_BLOCK *) ADV_8BALIGN(&sgblkp->sg_block);
  733.             sg_block_paddr = virt_to_bus(sg_block);
  734.             /*
  735.              * Check if this is the first 'adv_sgblk_t' for the request.
  736.              */
  737.             if (reqp->sgblkp == NULL)
  738.             {
  739.                 /* Request's first scatter-gather block. */
  740.                 reqp->sgblkp = sgblkp;
  741.                 /*
  742.                  * Set ADV_SCSI_REQ_T ADV_SG_BLOCK virtual and physical
  743.                  * address pointers.
  744.                  */
  745.                 scsiqp->sg_list_ptr = sg_block;
  746.                 scsiqp->sg_real_addr = cpu_to_le32(sg_block_paddr);
  747.             } else
  748.             {
  749.                 /* Request's second or later scatter-gather block. */
  750.                 sgblkp->next_sgblkp = reqp->sgblkp;
  751.                 reqp->sgblkp = sgblkp;
  752.                 /*
  753.                  * Point the previous ADV_SG_BLOCK structure to
  754.                  * the newly allocated ADV_SG_BLOCK structure.
  755.                  */
  756.                 ASC_ASSERT(prev_sg_block != NULL);
  757.                 prev_sg_block->sg_ptr = cpu_to_le32(sg_block_paddr);
  758.             }
  759.         }
  760.         for (i = 0; i < NO_OF_SG_PER_BLOCK; i++)
  761.         {
  762.             sg_block->sg_list[i].sg_addr =
  763.                 cpu_to_le32(virt_to_bus(slp->address));
  764.             sg_block->sg_list[i].sg_count = cpu_to_le32(slp->length);
  765.             ASC_STATS_ADD(scp->host, sg_xfer, ASC_CEILING(slp->length, 512));
  766.             if (--sg_elem_cnt == 0)
  767.             {   /* Last ADV_SG_BLOCK and scatter-gather entry. */
  768.                 sg_block->sg_cnt = i + 1;
  769.                 sg_block->sg_ptr = 0L;    /* Last ADV_SG_BLOCK in list. */
  770.                 return ADV_SUCCESS;
  771.             }
  772.             slp++;
  773.         }
  774.         sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
  775.         prev_sg_block = sg_block;
  776.     }
  777.     while (1);
  778.     /* NOTREACHED */
  779. }
  780. /*
  781.  * asc_isr_callback() - Second Level Interrupt Handler called by AscISR().
  782.  *
  783.  * Interrupt callback function for the Narrow SCSI Asc Library.
  784.  */
  785. STATIC void
  786. asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
  787. {
  788.     asc_board_t         *boardp;
  789.     Scsi_Cmnd           *scp;
  790.     struct Scsi_Host    *shp;
  791.     int                 i;
  792.     ASC_DBG2(1, "asc_isr_callback: asc_dvc_varp 0x%lx, qdonep 0x%lxn",
  793.         (ulong) asc_dvc_varp, (ulong) qdonep);
  794.     ASC_DBG_PRT_ASC_QDONE_INFO(2, qdonep);
  795.     /*
  796.      * Get the Scsi_Cmnd structure and Scsi_Host structure for the
  797.      * command that has been completed.
  798.      */
  799.     scp = (Scsi_Cmnd *) ASC_U32_TO_VADDR(qdonep->d2.srb_ptr);
  800.     ASC_DBG1(1, "asc_isr_callback: scp 0x%lxn", (ulong) scp);
  801.     if (scp == NULL) {
  802.         ASC_PRINT("asc_isr_callback: scp is NULLn");
  803.         return;
  804.     }
  805.     ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
  806.     /*
  807.      * If the request's host pointer is not valid, display a
  808.      * message and return.
  809.      */
  810.     shp = scp->host;
  811.     for (i = 0; i < asc_board_count; i++) {
  812.         if (asc_host[i] == shp) {
  813.             break;
  814.         }
  815.     }
  816.     if (i == asc_board_count) {
  817.         ASC_PRINT2(
  818.             "asc_isr_callback: scp 0x%lx has bad host pointer, host 0x%lxn",
  819.             (ulong) scp, (ulong) shp);
  820.         return;
  821.     }
  822.     ASC_STATS(shp, callback);
  823.     ASC_DBG1(1, "asc_isr_callback: shp 0x%lxn", (ulong) shp);
  824.     /*
  825.      * If the request isn't found on the active queue, it may
  826.      * have been removed to handle a reset request.
  827.      * Display a message and return.
  828.      */
  829.     boardp = ASC_BOARDP(shp);
  830.     ASC_ASSERT(asc_dvc_varp == &boardp->dvc_var.asc_dvc_var);
  831.     if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
  832.         ASC_PRINT2(
  833.             "asc_isr_callback: board %d: scp 0x%lx not on active queuen",
  834.             boardp->id, (ulong) scp);
  835.         return;
  836.     }
  837.     /*
  838.      * 'qdonep' contains the command's ending status.
  839.      */
  840.     switch (qdonep->d3.done_stat) {
  841.     case QD_NO_ERROR:
  842.         ASC_DBG(2, "asc_isr_callback: QD_NO_ERRORn");
  843.         scp->result = 0;
  844.         /*
  845.          * If an INQUIRY command completed successfully, then call
  846.          * the AscInquiryHandling() function to set-up the device.
  847.          */
  848.         if (scp->cmnd[0] == SCSICMD_Inquiry && scp->lun == 0 &&
  849.             (scp->request_bufflen - qdonep->remain_bytes) >= 8)
  850.         {
  851.             AscInquiryHandling(asc_dvc_varp, scp->target & 0x7,
  852.                 (ASC_SCSI_INQUIRY *) scp->request_buffer);
  853.         }
  854. #if ASC_LINUX_KERNEL24
  855.         /*
  856.          * Check for an underrun condition.
  857.          *
  858.          * If there was no error and an underrun condition, then
  859.          * then return the number of underrun bytes.
  860.          */
  861.         if (scp->request_bufflen != 0 && qdonep->remain_bytes != 0 &&
  862.             qdonep->remain_bytes <= scp->request_bufflen != 0) {
  863.             ASC_DBG1(1, "asc_isr_callback: underrun condition %u bytesn",
  864.             (unsigned) qdonep->remain_bytes);
  865.             scp->resid = qdonep->remain_bytes;
  866.         }
  867. #endif
  868.         break;
  869.     case QD_WITH_ERROR:
  870.         ASC_DBG(2, "asc_isr_callback: QD_WITH_ERRORn");
  871.         switch (qdonep->d3.host_stat) {
  872.         case QHSTA_NO_ERROR:
  873.             if (qdonep->d3.scsi_stat == SS_CHK_CONDITION) {
  874.                 ASC_DBG(2, "asc_isr_callback: SS_CHK_CONDITIONn");
  875.                 ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
  876.                     sizeof(scp->sense_buffer));
  877.                 /*
  878.                  * Note: The 'status_byte()' macro used by target drivers
  879.                  * defined in scsi.h shifts the status byte returned by
  880.                  * host drivers right by 1 bit. This is why target drivers
  881.                  * also use right shifted status byte definitions. For
  882.                  * instance target drivers use CHECK_CONDITION, defined to
  883.                  * 0x1, instead of the SCSI defined check condition value
  884.                  * of 0x2. Host drivers are supposed to return the status
  885.                  * byte as it is defined by SCSI.
  886.                  */
  887.                 scp->result = DRIVER_BYTE(DRIVER_SENSE) |
  888.                     STATUS_BYTE(qdonep->d3.scsi_stat);
  889.             } else {
  890.                 scp->result = STATUS_BYTE(qdonep->d3.scsi_stat);
  891.             }
  892.             break;
  893.         default:
  894.             /* QHSTA error occurred */
  895.             ASC_DBG1(1, "asc_isr_callback: host_stat 0x%xn",
  896.                 qdonep->d3.host_stat);
  897.             scp->result = HOST_BYTE(DID_BAD_TARGET);
  898.             break;
  899.         }
  900.         break;
  901.     case QD_ABORTED_BY_HOST:
  902.         ASC_DBG(1, "asc_isr_callback: QD_ABORTED_BY_HOSTn");
  903.         scp->result = HOST_BYTE(DID_ABORT) | MSG_BYTE(qdonep->d3.scsi_msg) |
  904.                 STATUS_BYTE(qdonep->d3.scsi_stat);
  905.         break;
  906.     default:
  907.         ASC_DBG1(1, "asc_isr_callback: done_stat 0x%xn", qdonep->d3.done_stat);
  908.         scp->result = HOST_BYTE(DID_ERROR) | MSG_BYTE(qdonep->d3.scsi_msg) |
  909.                 STATUS_BYTE(qdonep->d3.scsi_stat);
  910.         break;
  911.     }
  912.     /*
  913.      * If the 'init_tidmask' bit isn't already set for the target and the
  914.      * current request finished normally, then set the bit for the target
  915.      * to indicate that a device is present.
  916.      */
  917.     if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->target)) == 0 &&
  918.         qdonep->d3.done_stat == QD_NO_ERROR &&
  919.         qdonep->d3.host_stat == QHSTA_NO_ERROR) {
  920.         boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->target);
  921.     }
  922.     /*
  923.      * Because interrupts may be enabled by the 'Scsi_Cmnd' done
  924.      * function, add the command to the end of the board's done queue.
  925.      * The done function for the command will be called from
  926.      * advansys_interrupt().
  927.      */
  928.     asc_enqueue(&boardp->done, scp, ASC_BACK);
  929.     return;
  930. }
  931. /*
  932.  * adv_isr_callback() - Second Level Interrupt Handler called by AdvISR().
  933.  *
  934.  * Callback function for the Wide SCSI Adv Library.
  935.  */
  936. STATIC void
  937. adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
  938. {
  939.     asc_board_t         *boardp;
  940.     adv_req_t           *reqp;
  941.     adv_sgblk_t         *sgblkp;
  942.     Scsi_Cmnd           *scp;
  943.     struct Scsi_Host    *shp;
  944.     int                 i;
  945. #if ASC_LINUX_KERNEL24
  946.     ADV_DCNT            resid_cnt;
  947. #endif
  948.     ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lxn",
  949.         (ulong) adv_dvc_varp, (ulong) scsiqp);
  950.     ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
  951.     /*
  952.      * Get the adv_req_t structure for the command that has been
  953.      * completed. The adv_req_t structure actually contains the
  954.      * completed ADV_SCSI_REQ_Q structure.
  955.      */
  956.     reqp = (adv_req_t *) ADV_U32_TO_VADDR(scsiqp->srb_ptr);
  957.     ASC_DBG1(1, "adv_isr_callback: reqp 0x%lxn", (ulong) reqp);
  958.     if (reqp == NULL) {
  959.         ASC_PRINT("adv_isr_callback: reqp is NULLn");
  960.         return;
  961.     }
  962.     /*
  963.      * Get the Scsi_Cmnd structure and Scsi_Host structure for the
  964.      * command that has been completed.
  965.      *
  966.      * Note: The adv_req_t request structure and adv_sgblk_t structure,
  967.      * if any, are dropped, because a board structure pointer can not be
  968.      * determined.
  969.      */
  970.     scp = reqp->cmndp;
  971.     ASC_DBG1(1, "adv_isr_callback: scp 0x%lxn", (ulong) scp);
  972.     if (scp == NULL) {
  973.         ASC_PRINT("adv_isr_callback: scp is NULL; adv_req_t dropped.n");
  974.         return;
  975.     }
  976.     ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
  977.     /*
  978.      * If the request's host pointer is not valid, display a message
  979.      * and return.
  980.      */
  981.     shp = scp->host;
  982.     for (i = 0; i < asc_board_count; i++) {
  983.         if (asc_host[i] == shp) {
  984.             break;
  985.         }
  986.     }
  987.     /*
  988.      * Note: If the host structure is not found, the adv_req_t request
  989.      * structure and adv_sgblk_t structure, if any, is dropped.
  990.      */
  991.     if (i == asc_board_count) {
  992.         ASC_PRINT2(
  993.             "adv_isr_callback: scp 0x%lx has bad host pointer, host 0x%lxn",
  994.             (ulong) scp, (ulong) shp);
  995.         return;
  996.     }
  997.     ASC_STATS(shp, callback);
  998.     ASC_DBG1(1, "adv_isr_callback: shp 0x%lxn", (ulong) shp);
  999.     /*
  1000.      * If the request isn't found on the active queue, it may have been
  1001.      * removed to handle a reset request. Display a message and return.
  1002.      *
  1003.      * Note: Because the structure may still be in use don't attempt
  1004.      * to free the adv_req_t and adv_sgblk_t, if any, structures.
  1005.      */
  1006.     boardp = ASC_BOARDP(shp);
  1007.     ASC_ASSERT(adv_dvc_varp == &boardp->dvc_var.adv_dvc_var);
  1008.     if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
  1009.         ASC_PRINT2(
  1010.             "adv_isr_callback: board %d: scp 0x%lx not on active queuen",
  1011.             boardp->id, (ulong) scp);
  1012.         return;
  1013.     }
  1014.     /*
  1015.      * 'done_status' contains the command's ending status.
  1016.      */
  1017.     switch (scsiqp->done_status) {
  1018.     case QD_NO_ERROR:
  1019.         ASC_DBG(2, "adv_isr_callback: QD_NO_ERRORn");
  1020.         scp->result = 0;
  1021. #if ASC_LINUX_KERNEL24
  1022.         /*
  1023.          * Check for an underrun condition.
  1024.          *
  1025.          * If there was no error and an underrun condition, then
  1026.          * then return the number of underrun bytes.
  1027.          */
  1028.         resid_cnt = le32_to_cpu(scsiqp->data_cnt);
  1029.         if (scp->request_bufflen != 0 && resid_cnt != 0 &&
  1030.             resid_cnt <= scp->request_bufflen) {
  1031.             ASC_DBG1(1, "adv_isr_callback: underrun condition %lu bytesn",
  1032.                 (ulong) resid_cnt);
  1033.             scp->resid = resid_cnt;
  1034.         }
  1035. #endif
  1036.         break;
  1037.     case QD_WITH_ERROR:
  1038.         ASC_DBG(2, "adv_isr_callback: QD_WITH_ERRORn");
  1039.         switch (scsiqp->host_status) {
  1040.         case QHSTA_NO_ERROR:
  1041.             if (scsiqp->scsi_status == SS_CHK_CONDITION) {
  1042.                 ASC_DBG(2, "adv_isr_callback: SS_CHK_CONDITIONn");
  1043.                 ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
  1044.                     sizeof(scp->sense_buffer));
  1045.                 /*
  1046.                  * Note: The 'status_byte()' macro used by target drivers
  1047.                  * defined in scsi.h shifts the status byte returned by
  1048.                  * host drivers right by 1 bit. This is why target drivers
  1049.                  * also use right shifted status byte definitions. For
  1050.                  * instance target drivers use CHECK_CONDITION, defined to
  1051.                  * 0x1, instead of the SCSI defined check condition value
  1052.                  * of 0x2. Host drivers are supposed to return the status
  1053.                  * byte as it is defined by SCSI.
  1054.                  */
  1055.                 scp->result = DRIVER_BYTE(DRIVER_SENSE) |
  1056.                     STATUS_BYTE(scsiqp->scsi_status);
  1057.             } else {
  1058.                 scp->result = STATUS_BYTE(scsiqp->scsi_status);
  1059.             }
  1060.             break;
  1061.         default:
  1062.             /* Some other QHSTA error occurred. */
  1063.             ASC_DBG1(1, "adv_isr_callback: host_status 0x%xn",
  1064.                 scsiqp->host_status);
  1065.             scp->result = HOST_BYTE(DID_BAD_TARGET);
  1066.             break;
  1067.         }
  1068.         break;
  1069.     case QD_ABORTED_BY_HOST:
  1070.         ASC_DBG(1, "adv_isr_callback: QD_ABORTED_BY_HOSTn");
  1071.         scp->result = HOST_BYTE(DID_ABORT) | STATUS_BYTE(scsiqp->scsi_status);
  1072.         break;
  1073.     default:
  1074.         ASC_DBG1(1, "adv_isr_callback: done_status 0x%xn", scsiqp->done_status);
  1075.         scp->result = HOST_BYTE(DID_ERROR) | STATUS_BYTE(scsiqp->scsi_status);
  1076.         break;
  1077.     }
  1078.     /*
  1079.      * If the 'init_tidmask' bit isn't already set for the target and the
  1080.      * current request finished normally, then set the bit for the target
  1081.      * to indicate that a device is present.
  1082.      */
  1083.     if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->target)) == 0 &&
  1084.         scsiqp->done_status == QD_NO_ERROR &&
  1085.         scsiqp->host_status == QHSTA_NO_ERROR) {
  1086.         boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->target);
  1087.     }
  1088.     /*
  1089.      * Because interrupts may be enabled by the 'Scsi_Cmnd' done
  1090.      * function, add the command to the end of the board's done queue.
  1091.      * The done function for the command will be called from
  1092.      * advansys_interrupt().
  1093.      */
  1094.     asc_enqueue(&boardp->done, scp, ASC_BACK);
  1095.     /*
  1096.      * Free all 'adv_sgblk_t' structures allocated for the request.
  1097.      */
  1098.     while ((sgblkp = reqp->sgblkp) != NULL)
  1099.     {
  1100.         /* Remove 'sgblkp' from the request list. */
  1101.         reqp->sgblkp = sgblkp->next_sgblkp;
  1102.         /* Add 'sgblkp' to the board free list. */
  1103.         sgblkp->next_sgblkp = boardp->adv_sgblkp;
  1104.         boardp->adv_sgblkp = sgblkp;
  1105.     }
  1106.     /*
  1107.      * Free the adv_req_t structure used with the command by adding
  1108.      * it back to the board free list.
  1109.      */
  1110.     reqp->next_reqp = boardp->adv_reqp;
  1111.     boardp->adv_reqp = reqp;
  1112.     ASC_DBG(1, "adv_isr_callback: donen");
  1113.     return;
  1114. }
  1115. /*
  1116.  * adv_async_callback() - Adv Library asynchronous event callback function.
  1117.  */
  1118. STATIC void
  1119. adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
  1120. {
  1121.     switch (code)
  1122.     {
  1123.     case ADV_ASYNC_SCSI_BUS_RESET_DET:
  1124.         /*
  1125.          * The firmware detected a SCSI Bus reset.
  1126.          */
  1127.         ASC_DBG(0, "adv_async_callback: ADV_ASYNC_SCSI_BUS_RESET_DETn");
  1128.         break;
  1129.     case ADV_ASYNC_RDMA_FAILURE:
  1130.         /*
  1131.          * Handle RDMA failure by resetting the SCSI Bus and
  1132.          * possibly the chip if it is unresponsive. Log the error
  1133.          * with a unique code.
  1134.          */
  1135.         ASC_DBG(0, "adv_async_callback: ADV_ASYNC_RDMA_FAILUREn");
  1136.         AdvResetChipAndSB(adv_dvc_varp);
  1137.         break;
  1138.     case ADV_HOST_SCSI_BUS_RESET:
  1139.         /*
  1140.          * Host generated SCSI bus reset occurred.
  1141.          */
  1142.         ASC_DBG(0, "adv_async_callback: ADV_HOST_SCSI_BUS_RESETn");
  1143.         break;
  1144.     default:
  1145.         ASC_DBG1(0, "DvcAsyncCallBack: unknown code 0x%xn", code);
  1146.         break;
  1147.     }
  1148. }
  1149. /*
  1150.  * Add a 'REQP' to the end of specified queue. Set 'tidmask'
  1151.  * to indicate a command is queued for the device.
  1152.  *
  1153.  * 'flag' may be either ASC_FRONT or ASC_BACK.
  1154.  *
  1155.  * 'REQPNEXT(reqp)' returns reqp's next pointer.
  1156.  */
  1157. STATIC void
  1158. asc_enqueue(asc_queue_t *ascq, REQP reqp, int flag)
  1159. {
  1160.     int        tid;
  1161.     ASC_DBG3(3, "asc_enqueue: ascq 0x%lx, reqp 0x%lx, flag %dn",
  1162.         (ulong) ascq, (ulong) reqp, flag);
  1163.     ASC_ASSERT(reqp != NULL);
  1164.     ASC_ASSERT(flag == ASC_FRONT || flag == ASC_BACK);
  1165.     tid = REQPTID(reqp);
  1166.     ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
  1167.     if (flag == ASC_FRONT) {
  1168.         REQPNEXT(reqp) = ascq->q_first[tid];
  1169.         ascq->q_first[tid] = reqp;
  1170.         /* If the queue was empty, set the last pointer. */
  1171.         if (ascq->q_last[tid] == NULL) {
  1172.             ascq->q_last[tid] = reqp;
  1173.         }
  1174.     } else { /* ASC_BACK */
  1175.         if (ascq->q_last[tid] != NULL) {
  1176.             REQPNEXT(ascq->q_last[tid]) = reqp;
  1177.         }
  1178.         ascq->q_last[tid] = reqp;
  1179.         REQPNEXT(reqp) = NULL;
  1180.         /* If the queue was empty, set the first pointer. */
  1181.         if (ascq->q_first[tid] == NULL) {
  1182.             ascq->q_first[tid] = reqp;
  1183.         }
  1184.     }
  1185.     /* The queue has at least one entry, set its bit. */
  1186.     ascq->q_tidmask |= ADV_TID_TO_TIDMASK(tid);
  1187. #ifdef ADVANSYS_STATS
  1188.     /* Maintain request queue statistics. */
  1189.     ascq->q_tot_cnt[tid]++;
  1190.     ascq->q_cur_cnt[tid]++;
  1191.     if (ascq->q_cur_cnt[tid] > ascq->q_max_cnt[tid]) {
  1192.         ascq->q_max_cnt[tid] = ascq->q_cur_cnt[tid];
  1193.         ASC_DBG2(2, "asc_enqueue: new q_max_cnt[%d] %dn",
  1194.             tid, ascq->q_max_cnt[tid]);
  1195.     }
  1196.     REQPTIME(reqp) = REQTIMESTAMP();
  1197. #endif /* ADVANSYS_STATS */
  1198.     ASC_DBG1(3, "asc_enqueue: reqp 0x%lxn", (ulong) reqp);
  1199.     return;
  1200. }
  1201. /*
  1202.  * Return first queued 'REQP' on the specified queue for
  1203.  * the specified target device. Clear the 'tidmask' bit for
  1204.  * the device if no more commands are left queued for it.
  1205.  *
  1206.  * 'REQPNEXT(reqp)' returns reqp's next pointer.
  1207.  */
  1208. STATIC REQP
  1209. asc_dequeue(asc_queue_t *ascq, int tid)
  1210. {
  1211.     REQP    reqp;
  1212.     ASC_DBG2(3, "asc_dequeue: ascq 0x%lx, tid %dn", (ulong) ascq, tid);
  1213.     ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
  1214.     if ((reqp = ascq->q_first[tid]) != NULL) {
  1215.         ASC_ASSERT(ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid));
  1216.         ascq->q_first[tid] = REQPNEXT(reqp);
  1217.         /* If the queue is empty, clear its bit and the last pointer. */
  1218.         if (ascq->q_first[tid] == NULL) {
  1219.             ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
  1220.             ASC_ASSERT(ascq->q_last[tid] == reqp);
  1221.             ascq->q_last[tid] = NULL;
  1222.         }
  1223. #ifdef ADVANSYS_STATS
  1224.         /* Maintain request queue statistics. */
  1225.         ascq->q_cur_cnt[tid]--;
  1226.         ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
  1227.         REQTIMESTAT("asc_dequeue", ascq, reqp, tid);
  1228. #endif /* ADVANSYS_STATS */
  1229.     }
  1230.     ASC_DBG1(3, "asc_dequeue: reqp 0x%lxn", (ulong) reqp);
  1231.     return reqp;
  1232. }
  1233. /*
  1234.  * Return a pointer to a singly linked list of all the requests queued
  1235.  * for 'tid' on the 'asc_queue_t' pointed to by 'ascq'.
  1236.  *
  1237.  * If 'lastpp' is not NULL, '*lastpp' will be set to point to the
  1238.  * the last request returned in the singly linked list.
  1239.  *
  1240.  * 'tid' should either be a valid target id or if it is ASC_TID_ALL,
  1241.  * then all queued requests are concatenated into one list and
  1242.  * returned.
  1243.  *
  1244.  * Note: If 'lastpp' is used to append a new list to the end of
  1245.  * an old list, only change the old list last pointer if '*lastpp'
  1246.  * (or the function return value) is not NULL, i.e. use a temporary
  1247.  * variable for 'lastpp' and check its value after the function return
  1248.  * before assigning it to the list last pointer.
  1249.  *
  1250.  * Unfortunately collecting queuing time statistics adds overhead to
  1251.  * the function that isn't inherent to the function's algorithm.
  1252.  */
  1253. STATIC REQP
  1254. asc_dequeue_list(asc_queue_t *ascq, REQP *lastpp, int tid)
  1255. {
  1256.     REQP    firstp, lastp;
  1257.     int     i;
  1258.     ASC_DBG2(3, "asc_dequeue_list: ascq 0x%lx, tid %dn", (ulong) ascq, tid);
  1259.     ASC_ASSERT((tid == ASC_TID_ALL) || (tid >= 0 && tid <= ADV_MAX_TID));
  1260.     /*
  1261.      * If 'tid' is not ASC_TID_ALL, return requests only for
  1262.      * the specified 'tid'. If 'tid' is ASC_TID_ALL, return all
  1263.      * requests for all tids.
  1264.      */
  1265.     if (tid != ASC_TID_ALL) {
  1266.         /* Return all requests for the specified 'tid'. */
  1267.         if ((ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid)) == 0) {
  1268.             /* List is empty; Set first and last return pointers to NULL. */
  1269.             firstp = lastp = NULL;
  1270.         } else {
  1271.             firstp = ascq->q_first[tid];
  1272.             lastp = ascq->q_last[tid];
  1273.             ascq->q_first[tid] = ascq->q_last[tid] = NULL;
  1274.             ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
  1275. #ifdef ADVANSYS_STATS
  1276.             {
  1277.                 REQP reqp;
  1278.                 ascq->q_cur_cnt[tid] = 0;
  1279.                 for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
  1280.                     REQTIMESTAT("asc_dequeue_list", ascq, reqp, tid);
  1281.                 }
  1282.             }
  1283. #endif /* ADVANSYS_STATS */
  1284.         }
  1285.     } else {
  1286.         /* Return all requests for all tids. */
  1287.         firstp = lastp = NULL;
  1288.         for (i = 0; i <= ADV_MAX_TID; i++) {
  1289.             if (ascq->q_tidmask & ADV_TID_TO_TIDMASK(i)) {
  1290.                 if (firstp == NULL) {
  1291.                     firstp = ascq->q_first[i];
  1292.                     lastp = ascq->q_last[i];
  1293.                 } else {
  1294.                     ASC_ASSERT(lastp != NULL);
  1295.                     REQPNEXT(lastp) = ascq->q_first[i];
  1296.                     lastp = ascq->q_last[i];
  1297.                 }
  1298.                 ascq->q_first[i] = ascq->q_last[i] = NULL;
  1299.                 ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(i);
  1300. #ifdef ADVANSYS_STATS
  1301.                 ascq->q_cur_cnt[i] = 0;
  1302. #endif /* ADVANSYS_STATS */
  1303.             }
  1304.         }
  1305. #ifdef ADVANSYS_STATS
  1306.         {
  1307.             REQP reqp;
  1308.             for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
  1309.                 REQTIMESTAT("asc_dequeue_list", ascq, reqp, reqp->target);
  1310.             }
  1311.         }
  1312. #endif /* ADVANSYS_STATS */
  1313.     }
  1314.     if (lastpp) {
  1315.         *lastpp = lastp;
  1316.     }
  1317.     ASC_DBG1(3, "asc_dequeue_list: firstp 0x%lxn", (ulong) firstp);
  1318.     return firstp;
  1319. }
  1320. /*
  1321.  * Remove the specified 'REQP' from the specified queue for
  1322.  * the specified target device. Clear the 'tidmask' bit for the
  1323.  * device if no more commands are left queued for it.
  1324.  *
  1325.  * 'REQPNEXT(reqp)' returns reqp's the next pointer.
  1326.  *
  1327.  * Return ASC_TRUE if the command was found and removed,
  1328.  * otherwise return ASC_FALSE.
  1329.  */
  1330. STATIC int
  1331. asc_rmqueue(asc_queue_t *ascq, REQP reqp)
  1332. {
  1333.     REQP        currp, prevp;
  1334.     int         tid;
  1335.     int         ret = ASC_FALSE;
  1336.     ASC_DBG2(3, "asc_rmqueue: ascq 0x%lx, reqp 0x%lxn",
  1337.         (ulong) ascq, (ulong) reqp);
  1338.     ASC_ASSERT(reqp != NULL);
  1339.     tid = REQPTID(reqp);
  1340.     ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
  1341.     /*
  1342.      * Handle the common case of 'reqp' being the first
  1343.      * entry on the queue.
  1344.      */
  1345.     if (reqp == ascq->q_first[tid]) {
  1346.         ret = ASC_TRUE;
  1347.         ascq->q_first[tid] = REQPNEXT(reqp);
  1348.         /* If the queue is now empty, clear its bit and the last pointer. */
  1349.         if (ascq->q_first[tid] == NULL) {
  1350.             ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
  1351.             ASC_ASSERT(ascq->q_last[tid] == reqp);
  1352.             ascq->q_last[tid] = NULL;
  1353.         }
  1354.     } else if (ascq->q_first[tid] != NULL) {
  1355.         ASC_ASSERT(ascq->q_last[tid] != NULL);
  1356.         /*
  1357.          * Because the case of 'reqp' being the first entry has been
  1358.          * handled above and it is known the queue is not empty, if
  1359.          * 'reqp' is found on the queue it is guaranteed the queue will
  1360.          * not become empty and that 'q_first[tid]' will not be changed.
  1361.          *
  1362.          * Set 'prevp' to the first entry, 'currp' to the second entry,
  1363.          * and search for 'reqp'.
  1364.          */
  1365.         for (prevp = ascq->q_first[tid], currp = REQPNEXT(prevp);
  1366.              currp; prevp = currp, currp = REQPNEXT(currp)) {
  1367.             if (currp == reqp) {
  1368.                 ret = ASC_TRUE;
  1369.                 REQPNEXT(prevp) = REQPNEXT(currp);
  1370.                 REQPNEXT(reqp) = NULL;
  1371.                 if (ascq->q_last[tid] == reqp) {
  1372.                     ascq->q_last[tid] = prevp;
  1373.                 }
  1374.                 break;
  1375.             }
  1376.         }
  1377.     }
  1378. #ifdef ADVANSYS_STATS
  1379.     /* Maintain request queue statistics. */
  1380.     if (ret == ASC_TRUE) {
  1381.         ascq->q_cur_cnt[tid]--;
  1382.         REQTIMESTAT("asc_rmqueue", ascq, reqp, tid);
  1383.     }
  1384.     ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
  1385. #endif /* ADVANSYS_STATS */
  1386.     ASC_DBG2(3, "asc_rmqueue: reqp 0x%lx, ret %dn", (ulong) reqp, ret);
  1387.     return ret;
  1388. }
  1389. /*
  1390.  * Execute as many queued requests as possible for the specified queue.
  1391.  *
  1392.  * Calls asc_execute_scsi_cmnd() to execute a REQP/Scsi_Cmnd.
  1393.  */
  1394. STATIC void
  1395. asc_execute_queue(asc_queue_t *ascq)
  1396. {
  1397.     ADV_SCSI_BIT_ID_TYPE    scan_tidmask;
  1398.     REQP                    reqp;
  1399.     int                     i;
  1400.     ASC_DBG1(1, "asc_execute_queue: ascq 0x%lxn", (ulong) ascq);
  1401.     /*
  1402.      * Execute queued commands for devices attached to
  1403.      * the current board in round-robin fashion.
  1404.      */
  1405.     scan_tidmask = ascq->q_tidmask;
  1406.     do {
  1407.         for (i = 0; i <= ADV_MAX_TID; i++) {
  1408.             if (scan_tidmask & ADV_TID_TO_TIDMASK(i)) {
  1409.                 if ((reqp = asc_dequeue(ascq, i)) == NULL) {
  1410.                     scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
  1411.                 } else if (asc_execute_scsi_cmnd((Scsi_Cmnd *) reqp)
  1412.                             == ASC_BUSY) {
  1413.                     scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
  1414.                     /*
  1415.                      * The request returned ASC_BUSY. Enqueue at the front of
  1416.                      * target's waiting list to maintain correct ordering.
  1417.                      */
  1418.                     asc_enqueue(ascq, reqp, ASC_FRONT);
  1419.                 }
  1420.             }
  1421.         }
  1422.     } while (scan_tidmask);
  1423.     return;
  1424. }
  1425. #ifdef CONFIG_PROC_FS
  1426. /*
  1427.  * asc_prt_board_devices()
  1428.  *
  1429.  * Print driver information for devices attached to the board.
  1430.  *
  1431.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  1432.  * cf. asc_prt_line().
  1433.  *
  1434.  * Return the number of characters copied into 'cp'. No more than
  1435.  * 'cplen' characters will be copied to 'cp'.
  1436.  */
  1437. STATIC int
  1438. asc_prt_board_devices(struct Scsi_Host *shp, char *cp, int cplen)
  1439. {
  1440.     asc_board_t        *boardp;
  1441.     int                leftlen;
  1442.     int                totlen;
  1443.     int                len;
  1444.     int                chip_scsi_id;
  1445.     int                i;
  1446.     boardp = ASC_BOARDP(shp);
  1447.     leftlen = cplen;
  1448.     totlen = len = 0;
  1449.     len = asc_prt_line(cp, leftlen,
  1450. "nDevice Information for AdvanSys SCSI Host %d:n", shp->host_no);
  1451.     ASC_PRT_NEXT();
  1452.     if (ASC_NARROW_BOARD(boardp)) {
  1453.         chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
  1454.     } else {
  1455.         chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
  1456.     }
  1457.     len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
  1458.     ASC_PRT_NEXT();
  1459.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1460.         if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
  1461.             len = asc_prt_line(cp, leftlen, " %X,", i);
  1462.             ASC_PRT_NEXT();
  1463.         }
  1464.     }
  1465.     len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)n", chip_scsi_id);
  1466.     ASC_PRT_NEXT();
  1467.     return totlen;
  1468. }
  1469. /*
  1470.  * Display Wide Board BIOS Information.
  1471.  */
  1472. STATIC int
  1473. asc_prt_adv_bios(struct Scsi_Host *shp, char *cp, int cplen)
  1474. {
  1475.     asc_board_t        *boardp;
  1476.     int                leftlen;
  1477.     int                totlen;
  1478.     int                len;
  1479.     ushort             major, minor, letter;
  1480.     boardp = ASC_BOARDP(shp);
  1481.     leftlen = cplen;
  1482.     totlen = len = 0;
  1483.     len = asc_prt_line(cp, leftlen, "nROM BIOS Version: ");
  1484.     ASC_PRT_NEXT();
  1485.     /*
  1486.      * If the BIOS saved a valid signature, then fill in
  1487.      * the BIOS code segment base address.
  1488.      */
  1489.     if (boardp->bios_signature != 0x55AA) {
  1490.         len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1n");
  1491.         ASC_PRT_NEXT();
  1492.         len = asc_prt_line(cp, leftlen,
  1493. "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer versionn");
  1494.         ASC_PRT_NEXT();
  1495.         len = asc_prt_line(cp, leftlen,
  1496. "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pubn");
  1497.         ASC_PRT_NEXT();
  1498.     } else {
  1499.         major = (boardp->bios_version >> 12) & 0xF;
  1500.         minor = (boardp->bios_version >> 8) & 0xF;
  1501.         letter = (boardp->bios_version & 0xFF);
  1502.         len = asc_prt_line(cp, leftlen, "%d.%d%cn",
  1503.             major, minor, letter >= 26 ? '?' : letter + 'A');
  1504.         ASC_PRT_NEXT();
  1505.         /*
  1506.          * Current available ROM BIOS release is 3.1I for UW
  1507.          * and 3.2I for U2W. This code doesn't differentiate
  1508.          * UW and U2W boards.
  1509.          */
  1510.         if (major < 3 || (major <= 3 && minor < 1) ||
  1511.             (major <= 3 && minor <= 1 && letter < ('I'- 'A'))) {
  1512.             len = asc_prt_line(cp, leftlen,
  1513. "Newer version of ROM BIOS is available at the ConnectCom FTP site:n");
  1514.             ASC_PRT_NEXT();
  1515.             len = asc_prt_line(cp, leftlen,
  1516. "ftp://ftp.connectcom.net/pubn");
  1517.             ASC_PRT_NEXT();
  1518.         }
  1519.     }
  1520.     return totlen;
  1521. }
  1522. /*
  1523.  * Add serial number to information bar if signature AAh
  1524.  * is found in at bit 15-9 (7 bits) of word 1.
  1525.  *
  1526.  * Serial Number consists fo 12 alpha-numeric digits.
  1527.  *
  1528.  *       1 - Product type (A,B,C,D..)  Word0: 15-13 (3 bits)
  1529.  *       2 - MFG Location (A,B,C,D..)  Word0: 12-10 (3 bits)
  1530.  *     3-4 - Product ID (0-99)         Word0: 9-0 (10 bits)
  1531.  *       5 - Product revision (A-J)    Word0:  "         "
  1532.  *
  1533.  *           Signature                 Word1: 15-9 (7 bits)
  1534.  *       6 - Year (0-9)                Word1: 8-6 (3 bits) & Word2: 15 (1 bit)
  1535.  *     7-8 - Week of the year (1-52)   Word1: 5-0 (6 bits)
  1536.  *
  1537.  *    9-12 - Serial Number (A001-Z999) Word2: 14-0 (15 bits)
  1538.  *
  1539.  * Note 1: Only production cards will have a serial number.
  1540.  *
  1541.  * Note 2: Signature is most significant 7 bits (0xFE).
  1542.  *
  1543.  * Returns ASC_TRUE if serial number found, otherwise returns ASC_FALSE.
  1544.  */
  1545. STATIC int
  1546. asc_get_eeprom_string(ushort *serialnum, uchar *cp)
  1547. {
  1548.     ushort      w, num;
  1549.     if ((serialnum[1] & 0xFE00) != ((ushort) 0xAA << 8)) {
  1550.         return ASC_FALSE;
  1551.     } else {
  1552.         /*
  1553.          * First word - 6 digits.
  1554.          */
  1555.         w = serialnum[0];
  1556.         /* Product type - 1st digit. */
  1557.         if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
  1558.             /* Product type is P=Prototype */
  1559.             *cp += 0x8;
  1560.         }
  1561.         cp++;
  1562.         /* Manufacturing location - 2nd digit. */
  1563.         *cp++ = 'A' + ((w & 0x1C00) >> 10);
  1564.         /* Product ID - 3rd, 4th digits. */
  1565.         num = w & 0x3FF;
  1566.         *cp++ = '0' + (num / 100);
  1567.         num %= 100;
  1568.         *cp++ = '0' + (num / 10);
  1569.         /* Product revision - 5th digit. */
  1570.         *cp++ = 'A' + (num % 10);
  1571.         /*
  1572.          * Second word
  1573.          */
  1574.         w = serialnum[1];
  1575.         /*
  1576.          * Year - 6th digit.
  1577.          *
  1578.          * If bit 15 of third word is set, then the
  1579.          * last digit of the year is greater than 7.
  1580.          */
  1581.         if (serialnum[2] & 0x8000) {
  1582.             *cp++ = '8' + ((w & 0x1C0) >> 6);
  1583.         } else {
  1584.             *cp++ = '0' + ((w & 0x1C0) >> 6);
  1585.         }
  1586.         /* Week of year - 7th, 8th digits. */
  1587.         num = w & 0x003F;
  1588.         *cp++ = '0' + num / 10;
  1589.         num %= 10;
  1590.         *cp++ = '0' + num;
  1591.         /*
  1592.          * Third word
  1593.          */
  1594.         w = serialnum[2] & 0x7FFF;
  1595.         /* Serial number - 9th digit. */
  1596.         *cp++ = 'A' + (w / 1000);
  1597.         /* 10th, 11th, 12th digits. */
  1598.         num = w % 1000;
  1599.         *cp++ = '0' + num / 100;
  1600.         num %= 100;
  1601.         *cp++ = '0' + num / 10;
  1602.         num %= 10;
  1603.         *cp++ = '0' + num;
  1604.         *cp = '';     /* Null Terminate the string. */
  1605.         return ASC_TRUE;
  1606.     }
  1607. }
  1608. /*
  1609.  * asc_prt_asc_board_eeprom()
  1610.  *
  1611.  * Print board EEPROM configuration.
  1612.  *
  1613.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  1614.  * cf. asc_prt_line().
  1615.  *
  1616.  * Return the number of characters copied into 'cp'. No more than
  1617.  * 'cplen' characters will be copied to 'cp'.
  1618.  */
  1619. STATIC int
  1620. asc_prt_asc_board_eeprom(struct Scsi_Host *shp, char *cp, int cplen)
  1621. {
  1622.     asc_board_t        *boardp;
  1623.     ASC_DVC_VAR        *asc_dvc_varp;
  1624.     int                leftlen;
  1625.     int                totlen;
  1626.     int                len;
  1627.     ASCEEP_CONFIG      *ep;
  1628.     int                i;
  1629. #ifdef CONFIG_ISA
  1630.     int                isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
  1631. #endif /* CONFIG_ISA */
  1632.     uchar              serialstr[13];
  1633.     boardp = ASC_BOARDP(shp);
  1634.     asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
  1635.     ep = &boardp->eep_config.asc_eep;
  1636.     leftlen = cplen;
  1637.     totlen = len = 0;
  1638.     len = asc_prt_line(cp, leftlen,
  1639. "nEEPROM Settings for AdvanSys SCSI Host %d:n", shp->host_no);
  1640.     ASC_PRT_NEXT();
  1641.     if (asc_get_eeprom_string((ushort *) &ep->adapter_info[0], serialstr) ==
  1642.         ASC_TRUE) {
  1643.         len = asc_prt_line(cp, leftlen, " Serial Number: %sn", serialstr);
  1644.         ASC_PRT_NEXT();
  1645.     } else {
  1646.         if (ep->adapter_info[5] == 0xBB) {
  1647.             len = asc_prt_line(cp, leftlen,
  1648.                 " Default Settings Used for EEPROM-less Adapter.n");
  1649.             ASC_PRT_NEXT();
  1650.         } else {
  1651.             len = asc_prt_line(cp, leftlen,
  1652.                 " Serial Number Signature Not Present.n");
  1653.             ASC_PRT_NEXT();
  1654.         }
  1655.     }
  1656.     len = asc_prt_line(cp, leftlen,
  1657. " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %un",
  1658.         ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng, ep->max_tag_qng);
  1659.     ASC_PRT_NEXT();
  1660.     len = asc_prt_line(cp, leftlen,
  1661. " cntl 0x%x, no_scam 0x%xn",
  1662.         ep->cntl, ep->no_scam);
  1663.     ASC_PRT_NEXT();
  1664.     len = asc_prt_line(cp, leftlen,
  1665. " Target ID:           ");
  1666.     ASC_PRT_NEXT();
  1667.     for (i = 0; i <= ASC_MAX_TID; i++) {
  1668.         len = asc_prt_line(cp, leftlen, " %d", i);
  1669.         ASC_PRT_NEXT();
  1670.     }
  1671.     len = asc_prt_line(cp, leftlen, "n");
  1672.     ASC_PRT_NEXT();
  1673.     len = asc_prt_line(cp, leftlen,
  1674. " Disconnects:         ");
  1675.     ASC_PRT_NEXT();
  1676.     for (i = 0; i <= ASC_MAX_TID; i++) {
  1677.         len = asc_prt_line(cp, leftlen, " %c",
  1678.             (ep->disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1679.         ASC_PRT_NEXT();
  1680.     }
  1681.     len = asc_prt_line(cp, leftlen, "n");
  1682.     ASC_PRT_NEXT();
  1683.     len = asc_prt_line(cp, leftlen,
  1684. " Command Queuing:     ");
  1685.     ASC_PRT_NEXT();
  1686.     for (i = 0; i <= ASC_MAX_TID; i++) {
  1687.         len = asc_prt_line(cp, leftlen, " %c",
  1688.             (ep->use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1689.         ASC_PRT_NEXT();
  1690.     }
  1691.     len = asc_prt_line(cp, leftlen, "n");
  1692.     ASC_PRT_NEXT();
  1693.     len = asc_prt_line(cp, leftlen,
  1694. " Start Motor:         ");
  1695.     ASC_PRT_NEXT();
  1696.     for (i = 0; i <= ASC_MAX_TID; i++) {
  1697.         len = asc_prt_line(cp, leftlen, " %c",
  1698.             (ep->start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1699.         ASC_PRT_NEXT();
  1700.     }
  1701.     len = asc_prt_line(cp, leftlen, "n");
  1702.     ASC_PRT_NEXT();
  1703.     len = asc_prt_line(cp, leftlen,
  1704. " Synchronous Transfer:");
  1705.     ASC_PRT_NEXT();
  1706.     for (i = 0; i <= ASC_MAX_TID; i++) {
  1707.         len = asc_prt_line(cp, leftlen, " %c",
  1708.             (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1709.         ASC_PRT_NEXT();
  1710.     }
  1711.     len = asc_prt_line(cp, leftlen, "n");
  1712.     ASC_PRT_NEXT();
  1713. #ifdef CONFIG_ISA
  1714.     if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
  1715.         len = asc_prt_line(cp, leftlen,
  1716. " Host ISA DMA speed:   %d MB/Sn",
  1717.             isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
  1718.         ASC_PRT_NEXT();
  1719.     }
  1720. #endif /* CONFIG_ISA */
  1721.      return totlen;
  1722. }
  1723. /*
  1724.  * asc_prt_adv_board_eeprom()
  1725.  *
  1726.  * Print board EEPROM configuration.
  1727.  *
  1728.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  1729.  * cf. asc_prt_line().
  1730.  *
  1731.  * Return the number of characters copied into 'cp'. No more than
  1732.  * 'cplen' characters will be copied to 'cp'.
  1733.  */
  1734. STATIC int
  1735. asc_prt_adv_board_eeprom(struct Scsi_Host *shp, char *cp, int cplen)
  1736. {
  1737.     asc_board_t                 *boardp;
  1738.     ADV_DVC_VAR                 *adv_dvc_varp;
  1739.     int                         leftlen;
  1740.     int                         totlen;
  1741.     int                         len;
  1742.     int                         i;
  1743.     char                        *termstr;
  1744.     uchar                       serialstr[13];
  1745.     ADVEEP_3550_CONFIG          *ep_3550 = NULL;
  1746.     ADVEEP_38C0800_CONFIG       *ep_38C0800 = NULL;
  1747.     ADVEEP_38C1600_CONFIG       *ep_38C1600 = NULL;
  1748.     ushort                      word;
  1749.     ushort                      *wordp;
  1750.     ushort                      sdtr_speed = 0;
  1751.     boardp = ASC_BOARDP(shp);
  1752.     adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
  1753.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1754.     {
  1755.         ep_3550 = &boardp->eep_config.adv_3550_eep;
  1756.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1757.     {
  1758.         ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
  1759.     } else
  1760.     {
  1761.         ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
  1762.     }
  1763.     leftlen = cplen;
  1764.     totlen = len = 0;
  1765.     len = asc_prt_line(cp, leftlen,
  1766. "nEEPROM Settings for AdvanSys SCSI Host %d:n", shp->host_no);
  1767.     ASC_PRT_NEXT();
  1768.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1769.     {
  1770.         wordp = &ep_3550->serial_number_word1;
  1771.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1772.     {
  1773.         wordp = &ep_38C0800->serial_number_word1;
  1774.     } else
  1775.     {
  1776.         wordp = &ep_38C1600->serial_number_word1;
  1777.     }
  1778.     if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
  1779.         len = asc_prt_line(cp, leftlen, " Serial Number: %sn", serialstr);
  1780.         ASC_PRT_NEXT();
  1781.     } else {
  1782.         len = asc_prt_line(cp, leftlen,
  1783.             " Serial Number Signature Not Present.n");
  1784.         ASC_PRT_NEXT();
  1785.     }
  1786.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1787.     {
  1788.         len = asc_prt_line(cp, leftlen,
  1789. " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %un",
  1790.             ep_3550->adapter_scsi_id, ep_3550->max_host_qng,
  1791.             ep_3550->max_dvc_qng);
  1792.         ASC_PRT_NEXT();
  1793.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1794.     {
  1795.         len = asc_prt_line(cp, leftlen,
  1796. " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %un",
  1797.             ep_38C0800->adapter_scsi_id, ep_38C0800->max_host_qng,
  1798.             ep_38C0800->max_dvc_qng);
  1799.         ASC_PRT_NEXT();
  1800.     } else
  1801.     {
  1802.         len = asc_prt_line(cp, leftlen,
  1803. " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %un",
  1804.             ep_38C1600->adapter_scsi_id, ep_38C1600->max_host_qng,
  1805.             ep_38C1600->max_dvc_qng);
  1806.         ASC_PRT_NEXT();
  1807.     }
  1808.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1809.     {
  1810.         word = ep_3550->termination;
  1811.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1812.     {
  1813.         word = ep_38C0800->termination_lvd;
  1814.     } else
  1815.     {
  1816.         word = ep_38C1600->termination_lvd;
  1817.     }
  1818.     switch (word) {
  1819.         case 1:
  1820.             termstr = "Low Off/High Off";
  1821.             break;
  1822.         case 2:
  1823.             termstr = "Low Off/High On";
  1824.             break;
  1825.         case 3:
  1826.             termstr = "Low On/High On";
  1827.             break;
  1828.         default:
  1829.         case 0:
  1830.             termstr = "Automatic";
  1831.             break;
  1832.     }
  1833.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1834.     {
  1835.         len = asc_prt_line(cp, leftlen,
  1836. " termination: %u (%s), bios_ctrl: 0x%xn",
  1837.             ep_3550->termination, termstr, ep_3550->bios_ctrl);
  1838.         ASC_PRT_NEXT();
  1839.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1840.     {
  1841.         len = asc_prt_line(cp, leftlen,
  1842. " termination: %u (%s), bios_ctrl: 0x%xn",
  1843.             ep_38C0800->termination_lvd, termstr, ep_38C0800->bios_ctrl);
  1844.         ASC_PRT_NEXT();
  1845.     } else
  1846.     {
  1847.         len = asc_prt_line(cp, leftlen,
  1848. " termination: %u (%s), bios_ctrl: 0x%xn",
  1849.             ep_38C1600->termination_lvd, termstr, ep_38C1600->bios_ctrl);
  1850.         ASC_PRT_NEXT();
  1851.     }
  1852.     len = asc_prt_line(cp, leftlen,
  1853. " Target ID:           ");
  1854.     ASC_PRT_NEXT();
  1855.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1856.         len = asc_prt_line(cp, leftlen, " %X", i);
  1857.         ASC_PRT_NEXT();
  1858.     }
  1859.     len = asc_prt_line(cp, leftlen, "n");
  1860.     ASC_PRT_NEXT();
  1861.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1862.     {
  1863.         word = ep_3550->disc_enable;
  1864.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1865.     {
  1866.         word = ep_38C0800->disc_enable;
  1867.     } else
  1868.     {
  1869.         word = ep_38C1600->disc_enable;
  1870.     }
  1871.     len = asc_prt_line(cp, leftlen,
  1872. " Disconnects:         ");
  1873.     ASC_PRT_NEXT();
  1874.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1875.         len = asc_prt_line(cp, leftlen, " %c",
  1876.             (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1877.         ASC_PRT_NEXT();
  1878.     }
  1879.     len = asc_prt_line(cp, leftlen, "n");
  1880.     ASC_PRT_NEXT();
  1881.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1882.     {
  1883.         word = ep_3550->tagqng_able;
  1884.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1885.     {
  1886.         word = ep_38C0800->tagqng_able;
  1887.     } else
  1888.     {
  1889.         word = ep_38C1600->tagqng_able;
  1890.     }
  1891.     len = asc_prt_line(cp, leftlen,
  1892. " Command Queuing:     ");
  1893.     ASC_PRT_NEXT();
  1894.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1895.         len = asc_prt_line(cp, leftlen, " %c",
  1896.             (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1897.         ASC_PRT_NEXT();
  1898.     }
  1899.     len = asc_prt_line(cp, leftlen, "n");
  1900.     ASC_PRT_NEXT();
  1901.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1902.     {
  1903.         word = ep_3550->start_motor;
  1904.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1905.     {
  1906.         word = ep_38C0800->start_motor;
  1907.     } else
  1908.     {
  1909.         word = ep_38C1600->start_motor;
  1910.     }
  1911.     len = asc_prt_line(cp, leftlen,
  1912. " Start Motor:         ");
  1913.     ASC_PRT_NEXT();
  1914.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1915.         len = asc_prt_line(cp, leftlen, " %c",
  1916.             (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1917.         ASC_PRT_NEXT();
  1918.     }
  1919.     len = asc_prt_line(cp, leftlen, "n");
  1920.     ASC_PRT_NEXT();
  1921.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1922.     {
  1923.         len = asc_prt_line(cp, leftlen,
  1924. " Synchronous Transfer:");
  1925.         ASC_PRT_NEXT();
  1926.         for (i = 0; i <= ADV_MAX_TID; i++) {
  1927.             len = asc_prt_line(cp, leftlen, " %c",
  1928.                 (ep_3550->sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1929.             ASC_PRT_NEXT();
  1930.         }
  1931.         len = asc_prt_line(cp, leftlen, "n");
  1932.         ASC_PRT_NEXT();
  1933.     }
  1934.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1935.     {
  1936.         len = asc_prt_line(cp, leftlen,
  1937. " Ultra Transfer:      ");
  1938.     ASC_PRT_NEXT();
  1939.         for (i = 0; i <= ADV_MAX_TID; i++) {
  1940.             len = asc_prt_line(cp, leftlen, " %c",
  1941.                 (ep_3550->ultra_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1942.             ASC_PRT_NEXT();
  1943.         }
  1944.         len = asc_prt_line(cp, leftlen, "n");
  1945.         ASC_PRT_NEXT();
  1946.     }
  1947.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1948.     {
  1949.         word = ep_3550->wdtr_able;
  1950.     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1951.     {
  1952.         word = ep_38C0800->wdtr_able;
  1953.     } else
  1954.     {
  1955.         word = ep_38C1600->wdtr_able;
  1956.     }
  1957.     len = asc_prt_line(cp, leftlen,
  1958. " Wide Transfer:       ");
  1959.     ASC_PRT_NEXT();
  1960.     for (i = 0; i <= ADV_MAX_TID; i++) {
  1961.         len = asc_prt_line(cp, leftlen, " %c",
  1962.             (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  1963.         ASC_PRT_NEXT();
  1964.     }
  1965.     len = asc_prt_line(cp, leftlen, "n");
  1966.     ASC_PRT_NEXT();
  1967.     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
  1968.         adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600)
  1969.     {
  1970.         len = asc_prt_line(cp, leftlen,
  1971. " Synchronous Transfer Speed (Mhz):n  ");
  1972.         ASC_PRT_NEXT();
  1973.         for (i = 0; i <= ADV_MAX_TID; i++) {
  1974.             char *speed_str;
  1975.             if (i == 0)
  1976.             {
  1977.                 sdtr_speed = adv_dvc_varp->sdtr_speed1;
  1978.             } else if (i == 4)
  1979.             {
  1980.                 sdtr_speed = adv_dvc_varp->sdtr_speed2;
  1981.             } else if (i == 8)
  1982.             {
  1983.                 sdtr_speed = adv_dvc_varp->sdtr_speed3;
  1984.             } else if (i == 12)
  1985.             {
  1986.                 sdtr_speed = adv_dvc_varp->sdtr_speed4;
  1987.             }
  1988.             switch (sdtr_speed & ADV_MAX_TID)
  1989.             {
  1990.                 case 0:  speed_str = "Off"; break;
  1991.                 case 1:  speed_str = "  5"; break;
  1992.                 case 2:  speed_str = " 10"; break;
  1993.                 case 3:  speed_str = " 20"; break;
  1994.                 case 4:  speed_str = " 40"; break;
  1995.                 case 5:  speed_str = " 80"; break;
  1996.                 default: speed_str = "Unk"; break;
  1997.             }
  1998.             len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
  1999.             ASC_PRT_NEXT();
  2000.             if (i == 7)
  2001.             {
  2002.                 len = asc_prt_line(cp, leftlen, "n  ");
  2003.                 ASC_PRT_NEXT();
  2004.             }
  2005.             sdtr_speed >>= 4;
  2006.         }
  2007.         len = asc_prt_line(cp, leftlen, "n");
  2008.         ASC_PRT_NEXT();
  2009.     }
  2010.     return totlen;
  2011. }
  2012. /*
  2013.  * asc_prt_driver_conf()
  2014.  *
  2015.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  2016.  * cf. asc_prt_line().
  2017.  *
  2018.  * Return the number of characters copied into 'cp'. No more than
  2019.  * 'cplen' characters will be copied to 'cp'.
  2020.  */
  2021. STATIC int
  2022. asc_prt_driver_conf(struct Scsi_Host *shp, char *cp, int cplen)
  2023. {
  2024.     asc_board_t            *boardp;
  2025.     int                    leftlen;
  2026.     int                    totlen;
  2027.     int                    len;
  2028.     int                    chip_scsi_id;
  2029.     int                    i;
  2030.     boardp = ASC_BOARDP(shp);
  2031.     leftlen = cplen;
  2032.     totlen = len = 0;
  2033.     len = asc_prt_line(cp, leftlen,
  2034. "nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:n",
  2035.         shp->host_no);
  2036.     ASC_PRT_NEXT();
  2037.     len = asc_prt_line(cp, leftlen,
  2038. " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %un",
  2039.         shp->host_busy, shp->last_reset, shp->max_id, shp->max_lun,
  2040.         shp->max_channel);
  2041.     ASC_PRT_NEXT();
  2042.     len = asc_prt_line(cp, leftlen,
  2043. " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %un",
  2044.         shp->unique_id, shp->can_queue, shp->this_id, shp->sg_tablesize,
  2045.         shp->cmd_per_lun);
  2046.     ASC_PRT_NEXT();
  2047.     len = asc_prt_line(cp, leftlen,
  2048. " unchecked_isa_dma %d, use_clustering %d, loaded_as_module %dn",
  2049.         shp->unchecked_isa_dma, shp->use_clustering, shp->loaded_as_module);
  2050.     ASC_PRT_NEXT();
  2051.     len = asc_prt_line(cp, leftlen,
  2052. " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%xn",
  2053.         boardp->flags, boardp->last_reset, jiffies, boardp->asc_n_io_port);
  2054.     ASC_PRT_NEXT();
  2055.      /* 'shp->n_io_port' may be truncated because it is only one byte. */
  2056.     len = asc_prt_line(cp, leftlen,
  2057. " io_port 0x%x, n_io_port 0x%xn",
  2058.         shp->io_port, shp->n_io_port);
  2059.     ASC_PRT_NEXT();
  2060.     if (ASC_NARROW_BOARD(boardp)) {
  2061.         chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
  2062.     } else {
  2063.         chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
  2064.     }
  2065.     if (boardp->flags & ASC_SELECT_QUEUE_DEPTHS) {
  2066.         len = asc_prt_line(cp, leftlen, " queue_depth:");
  2067.         ASC_PRT_NEXT();
  2068.         for (i = 0; i <= ADV_MAX_TID; i++) {
  2069.             if ((chip_scsi_id == i) ||
  2070.                 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2071.                 continue;
  2072.             }
  2073.             if (boardp->device[i] == NULL) {
  2074.                 continue;
  2075.             }
  2076.             len = asc_prt_line(cp, leftlen, " %X:%d",
  2077.                 i, boardp->device[i]->queue_depth);
  2078.             ASC_PRT_NEXT();
  2079.         }
  2080.         len = asc_prt_line(cp, leftlen, "n");
  2081.         ASC_PRT_NEXT();
  2082.     }
  2083.     return totlen;
  2084. }
  2085. /*
  2086.  * asc_prt_asc_board_info()
  2087.  *
  2088.  * Print dynamic board configuration information.
  2089.  *
  2090.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  2091.  * cf. asc_prt_line().
  2092.  *
  2093.  * Return the number of characters copied into 'cp'. No more than
  2094.  * 'cplen' characters will be copied to 'cp'.
  2095.  */
  2096. STATIC int
  2097. asc_prt_asc_board_info(struct Scsi_Host *shp, char *cp, int cplen)
  2098. {
  2099.     asc_board_t            *boardp;
  2100.     int                    chip_scsi_id;
  2101.     int                    leftlen;
  2102.     int                    totlen;
  2103.     int                    len;
  2104.     ASC_DVC_VAR            *v;
  2105.     ASC_DVC_CFG            *c;
  2106.     int                    i;
  2107.     int                    renegotiate = 0;
  2108.     boardp = ASC_BOARDP(shp);
  2109.     v = &boardp->dvc_var.asc_dvc_var;
  2110.     c = &boardp->dvc_cfg.asc_dvc_cfg;
  2111.     chip_scsi_id = c->chip_scsi_id;
  2112.     leftlen = cplen;
  2113.     totlen = len = 0;
  2114.     len = asc_prt_line(cp, leftlen,
  2115. "nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:n",
  2116.     shp->host_no);
  2117.     ASC_PRT_NEXT();
  2118.     len = asc_prt_line(cp, leftlen,
  2119. " chip_version %u, lib_version 0x%x, lib_serial_no %u, mcode_date 0x%xn",
  2120.         c->chip_version, c->lib_version, c->lib_serial_no, c->mcode_date);
  2121.     ASC_PRT_NEXT();
  2122.     len = asc_prt_line(cp, leftlen,
  2123. " mcode_version 0x%x, err_code %un",
  2124.          c->mcode_version, v->err_code);
  2125.     ASC_PRT_NEXT();
  2126.     /* Current number of commands waiting for the host. */
  2127.     len = asc_prt_line(cp, leftlen,
  2128. " Total Command Pending: %dn", v->cur_total_qng);
  2129.     ASC_PRT_NEXT();
  2130.     len = asc_prt_line(cp, leftlen,
  2131. " Command Queuing:");
  2132.     ASC_PRT_NEXT();
  2133.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2134.         if ((chip_scsi_id == i) ||
  2135.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2136.             continue;
  2137.         }
  2138.         len = asc_prt_line(cp, leftlen, " %X:%c",
  2139.             i, (v->use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  2140.         ASC_PRT_NEXT();
  2141.     }
  2142.     len = asc_prt_line(cp, leftlen, "n");
  2143.     ASC_PRT_NEXT();
  2144.     /* Current number of commands waiting for a device. */
  2145.     len = asc_prt_line(cp, leftlen,
  2146. " Command Queue Pending:");
  2147.     ASC_PRT_NEXT();
  2148.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2149.         if ((chip_scsi_id == i) ||
  2150.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2151.             continue;
  2152.         }
  2153.         len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
  2154.         ASC_PRT_NEXT();
  2155.     }
  2156.     len = asc_prt_line(cp, leftlen, "n");
  2157.     ASC_PRT_NEXT();
  2158.     /* Current limit on number of commands that can be sent to a device. */
  2159.     len = asc_prt_line(cp, leftlen,
  2160. " Command Queue Limit:");
  2161.     ASC_PRT_NEXT();
  2162.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2163.         if ((chip_scsi_id == i) ||
  2164.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2165.             continue;
  2166.         }
  2167.         len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
  2168.         ASC_PRT_NEXT();
  2169.     }
  2170.     len = asc_prt_line(cp, leftlen, "n");
  2171.     ASC_PRT_NEXT();
  2172.     /* Indicate whether the device has returned queue full status. */
  2173.     len = asc_prt_line(cp, leftlen,
  2174. " Command Queue Full:");
  2175.     ASC_PRT_NEXT();
  2176.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2177.         if ((chip_scsi_id == i) ||
  2178.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2179.             continue;
  2180.         }
  2181.         if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
  2182.             len = asc_prt_line(cp, leftlen, " %X:Y-%d",
  2183.                 i, boardp->queue_full_cnt[i]);
  2184.         } else {
  2185.             len = asc_prt_line(cp, leftlen, " %X:N", i);
  2186.         }
  2187.         ASC_PRT_NEXT();
  2188.     }
  2189.     len = asc_prt_line(cp, leftlen, "n");
  2190.     ASC_PRT_NEXT();
  2191.     len = asc_prt_line(cp, leftlen,
  2192. " Synchronous Transfer:");
  2193.     ASC_PRT_NEXT();
  2194.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2195.         if ((chip_scsi_id == i) ||
  2196.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2197.             continue;
  2198.         }
  2199.         len = asc_prt_line(cp, leftlen, " %X:%c",
  2200.             i, (v->sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  2201.         ASC_PRT_NEXT();
  2202.     }
  2203.     len = asc_prt_line(cp, leftlen, "n");
  2204.     ASC_PRT_NEXT();
  2205.     for (i = 0; i <= ASC_MAX_TID; i++) {
  2206.         uchar syn_period_ix;
  2207.         if ((chip_scsi_id == i) ||
  2208.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
  2209.             ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2210.             continue;
  2211.         }
  2212.         len = asc_prt_line(cp, leftlen, "  %X:", i);
  2213.         ASC_PRT_NEXT();
  2214.         if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0)
  2215.         {
  2216.             len = asc_prt_line(cp, leftlen, " Asynchronous");
  2217.             ASC_PRT_NEXT();
  2218.         } else
  2219.         {
  2220.             syn_period_ix =
  2221.                 (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index - 1);
  2222.             len = asc_prt_line(cp, leftlen,
  2223.                 " Transfer Period Factor: %d (%d.%d Mhz),",
  2224.                 v->sdtr_period_tbl[syn_period_ix],
  2225.                 250 / v->sdtr_period_tbl[syn_period_ix],
  2226.                 ASC_TENTHS(250, v->sdtr_period_tbl[syn_period_ix]));
  2227.             ASC_PRT_NEXT();
  2228.             len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
  2229.                 boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET);
  2230.             ASC_PRT_NEXT();
  2231.         }
  2232.         if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
  2233.             len = asc_prt_line(cp, leftlen, "*n");
  2234.             renegotiate = 1;
  2235.         } else
  2236.         {
  2237.             len = asc_prt_line(cp, leftlen, "n");
  2238.         }
  2239.         ASC_PRT_NEXT();
  2240.     }
  2241.     if (renegotiate)
  2242.     {
  2243.         len = asc_prt_line(cp, leftlen,
  2244.             " * = Re-negotiation pending before next command.n");
  2245.         ASC_PRT_NEXT();
  2246.     }
  2247.     return totlen;
  2248. }
  2249. /*
  2250.  * asc_prt_adv_board_info()
  2251.  *
  2252.  * Print dynamic board configuration information.
  2253.  *
  2254.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  2255.  * cf. asc_prt_line().
  2256.  *
  2257.  * Return the number of characters copied into 'cp'. No more than
  2258.  * 'cplen' characters will be copied to 'cp'.
  2259.  */
  2260. STATIC int
  2261. asc_prt_adv_board_info(struct Scsi_Host *shp, char *cp, int cplen)
  2262. {
  2263.     asc_board_t            *boardp;
  2264.     int                    leftlen;
  2265.     int                    totlen;
  2266.     int                    len;
  2267.     int                    i;
  2268.     ADV_DVC_VAR            *v;
  2269.     ADV_DVC_CFG            *c;
  2270.     AdvPortAddr            iop_base;
  2271.     ushort                 chip_scsi_id;
  2272.     ushort                 lramword;
  2273.     uchar                  lrambyte;
  2274.     ushort                 tagqng_able;
  2275.     ushort                 sdtr_able, wdtr_able;
  2276.     ushort                 wdtr_done, sdtr_done;
  2277.     ushort                 period = 0;
  2278.     int                    renegotiate = 0;
  2279.     boardp = ASC_BOARDP(shp);
  2280.     v = &boardp->dvc_var.adv_dvc_var;
  2281.     c = &boardp->dvc_cfg.adv_dvc_cfg;
  2282.     iop_base = v->iop_base;
  2283.     chip_scsi_id = v->chip_scsi_id;
  2284.     leftlen = cplen;
  2285.     totlen = len = 0;
  2286.     len = asc_prt_line(cp, leftlen,
  2287. "nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:n",
  2288.     shp->host_no);
  2289.     ASC_PRT_NEXT();
  2290.     len = asc_prt_line(cp, leftlen,
  2291. " iop_base 0x%lx, cable_detect: %X, err_code %un",
  2292.          v->iop_base,
  2293.          AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1) & CABLE_DETECT,
  2294.          v->err_code);
  2295.     ASC_PRT_NEXT();
  2296.     len = asc_prt_line(cp, leftlen,
  2297. " chip_version %u, lib_version 0x%x, mcode_date 0x%x, mcode_version 0x%xn",
  2298.         c->chip_version, c->lib_version, c->mcode_date, c->mcode_version);
  2299.     ASC_PRT_NEXT();
  2300.     AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  2301.     len = asc_prt_line(cp, leftlen,
  2302. " Queuing Enabled:");
  2303.     ASC_PRT_NEXT();
  2304.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2305.         if ((chip_scsi_id == i) ||
  2306.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2307.             continue;
  2308.         }
  2309.         len = asc_prt_line(cp, leftlen, " %X:%c",
  2310.             i, (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  2311.         ASC_PRT_NEXT();
  2312.     }
  2313.     len = asc_prt_line(cp, leftlen, "n");
  2314.     ASC_PRT_NEXT();
  2315.     len = asc_prt_line(cp, leftlen,
  2316. " Queue Limit:");
  2317.     ASC_PRT_NEXT();
  2318.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2319.         if ((chip_scsi_id == i) ||
  2320.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2321.             continue;
  2322.         }
  2323.         AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i, lrambyte);
  2324.         len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
  2325.         ASC_PRT_NEXT();
  2326.     }
  2327.     len = asc_prt_line(cp, leftlen, "n");
  2328.     ASC_PRT_NEXT();
  2329.     len = asc_prt_line(cp, leftlen,
  2330. " Command Pending:");
  2331.     ASC_PRT_NEXT();
  2332.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2333.         if ((chip_scsi_id == i) ||
  2334.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2335.             continue;
  2336.         }
  2337.         AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i, lrambyte);
  2338.         len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
  2339.         ASC_PRT_NEXT();
  2340.     }
  2341.     len = asc_prt_line(cp, leftlen, "n");
  2342.     ASC_PRT_NEXT();
  2343.     AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  2344.     len = asc_prt_line(cp, leftlen,
  2345. " Wide Enabled:");
  2346.     ASC_PRT_NEXT();
  2347.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2348.         if ((chip_scsi_id == i) ||
  2349.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2350.             continue;
  2351.         }
  2352.         len = asc_prt_line(cp, leftlen, " %X:%c",
  2353.             i, (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  2354.         ASC_PRT_NEXT();
  2355.     }
  2356.     len = asc_prt_line(cp, leftlen, "n");
  2357.     ASC_PRT_NEXT();
  2358.     AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
  2359.     len = asc_prt_line(cp, leftlen,
  2360. " Transfer Bit Width:");
  2361.     ASC_PRT_NEXT();
  2362.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2363.         if ((chip_scsi_id == i) ||
  2364.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2365.             continue;
  2366.         }
  2367.         AdvReadWordLram(iop_base, ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
  2368.             lramword);
  2369.         len = asc_prt_line(cp, leftlen, " %X:%d",
  2370.             i, (lramword & 0x8000) ? 16 : 8);
  2371.         ASC_PRT_NEXT();
  2372.         if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
  2373.             (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
  2374.             len = asc_prt_line(cp, leftlen, "*");
  2375.             ASC_PRT_NEXT();
  2376.             renegotiate = 1;
  2377.         }
  2378.     }
  2379.     len = asc_prt_line(cp, leftlen, "n");
  2380.     ASC_PRT_NEXT();
  2381.     AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  2382.     len = asc_prt_line(cp, leftlen,
  2383. " Synchronous Enabled:");
  2384.     ASC_PRT_NEXT();
  2385.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2386.         if ((chip_scsi_id == i) ||
  2387.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2388.             continue;
  2389.         }
  2390.         len = asc_prt_line(cp, leftlen, " %X:%c",
  2391.             i, (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
  2392.         ASC_PRT_NEXT();
  2393.     }
  2394.     len = asc_prt_line(cp, leftlen, "n");
  2395.     ASC_PRT_NEXT();
  2396.     AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
  2397.     for (i = 0; i <= ADV_MAX_TID; i++) {
  2398.         AdvReadWordLram(iop_base, ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
  2399.             lramword);
  2400.         lramword &= ~0x8000;
  2401.         if ((chip_scsi_id == i) ||
  2402.             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
  2403.             ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
  2404.             continue;
  2405.         }
  2406.         len = asc_prt_line(cp, leftlen, "  %X:", i);
  2407.         ASC_PRT_NEXT();
  2408.         if ((lramword & 0x1F) == 0) /* Check for REQ/ACK Offset 0. */
  2409.         {
  2410.             len = asc_prt_line(cp, leftlen, " Asynchronous");
  2411.             ASC_PRT_NEXT();
  2412.         } else
  2413.         {
  2414.             len = asc_prt_line(cp, leftlen, " Transfer Period Factor: ");
  2415.             ASC_PRT_NEXT();
  2416.             if ((lramword & 0x1F00) == 0x1100) /* 80 Mhz */
  2417.             {
  2418.                 len = asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
  2419.                 ASC_PRT_NEXT();
  2420.             } else if ((lramword & 0x1F00) == 0x1000) /* 40 Mhz */
  2421.             {
  2422.                 len = asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
  2423.                 ASC_PRT_NEXT();
  2424.             } else /* 20 Mhz or below. */
  2425.             {
  2426.                 period = (((lramword >> 8) * 25) + 50)/4;
  2427.                 if (period == 0) /* Should never happen. */
  2428.                 {
  2429.                     len = asc_prt_line(cp, leftlen, "%d (? Mhz), ");
  2430.                     ASC_PRT_NEXT();
  2431.                 } else
  2432.                 {
  2433.                     len = asc_prt_line(cp, leftlen,
  2434.                         "%d (%d.%d Mhz),",
  2435.                         period, 250/period, ASC_TENTHS(250, period));
  2436.                     ASC_PRT_NEXT();
  2437.                 }
  2438.             }
  2439.             len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
  2440.                 lramword & 0x1F);
  2441.             ASC_PRT_NEXT();
  2442.         }
  2443.         if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
  2444.             len = asc_prt_line(cp, leftlen, "*n");
  2445.             renegotiate = 1;
  2446.         } else
  2447.         {
  2448.             len = asc_prt_line(cp, leftlen, "n");
  2449.         }
  2450.         ASC_PRT_NEXT();
  2451.     }
  2452.     if (renegotiate)
  2453.     {
  2454.         len = asc_prt_line(cp, leftlen,
  2455.             " * = Re-negotiation pending before next command.n");
  2456.         ASC_PRT_NEXT();
  2457.     }
  2458.     return totlen;
  2459. }
  2460. /*
  2461.  * asc_proc_copy()
  2462.  *
  2463.  * Copy proc information to a read buffer taking into account the current
  2464.  * read offset in the file and the remaining space in the read buffer.
  2465.  */
  2466. STATIC int
  2467. asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
  2468.               char *cp, int cplen)
  2469. {
  2470.     int cnt = 0;
  2471.     ASC_DBG3(2, "asc_proc_copy: offset %d, advoffset %d, cplen %dn",
  2472.             (unsigned) offset, (unsigned) advoffset, cplen);
  2473.     if (offset <= advoffset) {
  2474.         /* Read offset below current offset, copy everything. */
  2475.         cnt = ASC_MIN(cplen, leftlen);
  2476.         ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %dn",
  2477.                 (ulong) curbuf, (ulong) cp, cnt);
  2478.         memcpy(curbuf, cp, cnt);
  2479.     } else if (offset < advoffset + cplen) {
  2480.         /* Read offset within current range, partial copy. */
  2481.         cnt = (advoffset + cplen) - offset;
  2482.         cp = (cp + cplen) - cnt;
  2483.         cnt = ASC_MIN(cnt, leftlen);
  2484.         ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %dn",
  2485.                 (ulong) curbuf, (ulong) cp, cnt);
  2486.         memcpy(curbuf, cp, cnt);
  2487.     }
  2488.     return cnt;
  2489. }
  2490. /*
  2491.  * asc_prt_line()
  2492.  *
  2493.  * If 'cp' is NULL print to the console, otherwise print to a buffer.
  2494.  *
  2495.  * Return 0 if printing to the console, otherwise return the number of
  2496.  * bytes written to the buffer.
  2497.  *
  2498.  * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
  2499.  * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
  2500.  */
  2501. STATIC int
  2502. asc_prt_line(char *buf, int buflen, char *fmt, ...)
  2503. {
  2504.     va_list        args;
  2505.     int            ret;
  2506.     char           s[ASC_PRTLINE_SIZE];
  2507.     va_start(args, fmt);
  2508.     ret = vsprintf(s, fmt, args);
  2509.     ASC_ASSERT(ret < ASC_PRTLINE_SIZE);
  2510.     if (buf == NULL) {
  2511.         (void) printk(s);
  2512.         ret = 0;
  2513.     } else {
  2514.         ret = ASC_MIN(buflen, ret);
  2515.         memcpy(buf, s, ret);
  2516.     }
  2517.     va_end(args);
  2518.     return ret;
  2519. }
  2520. #endif /* CONFIG_PROC_FS */
  2521. /*
  2522.  * --- Functions Required by the Asc Library
  2523.  */
  2524. /*
  2525.  * Delay for 'n' milliseconds. Don't use the 'jiffies'
  2526.  * global variable which is incremented once every 5 ms
  2527.  * from a timer interrupt, because this function may be
  2528.  * called when interrupts are disabled.
  2529.  */
  2530. STATIC void
  2531. DvcSleepMilliSecond(ADV_DCNT n)
  2532. {
  2533.     ASC_DBG1(4, "DvcSleepMilliSecond: %lun", (ulong) n);
  2534.     mdelay(n);
  2535. }
  2536. /*
  2537.  * Currently and inline noop but leave as a placeholder.
  2538.  * Leave DvcEnterCritical() as a noop placeholder.
  2539.  */
  2540. STATIC inline ulong
  2541. DvcEnterCritical(void)
  2542. {
  2543.     return 0;
  2544. }
  2545. /*
  2546.  * Critical sections are all protected by the board spinlock.
  2547.  * Leave DvcLeaveCritical() as a noop placeholder.
  2548.  */
  2549. STATIC inline void
  2550. DvcLeaveCritical(ulong flags)
  2551. {
  2552.     return;
  2553. }
  2554. /*
  2555.  * void
  2556.  * DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
  2557.  *
  2558.  * Calling/Exit State:
  2559.  *    none
  2560.  *
  2561.  * Description:
  2562.  *     Output an ASC_SCSI_Q structure to the chip
  2563.  */
  2564. STATIC void
  2565. DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
  2566. {
  2567.     int    i;
  2568.     ASC_DBG_PRT_HEX(2, "DvcPutScsiQ", outbuf, 2 * words);
  2569.     AscSetChipLramAddr(iop_base, s_addr);
  2570.     for (i = 0; i < 2 * words; i += 2) {
  2571.         if (i == 4 || i == 20) {
  2572.             continue;
  2573.         }
  2574.         outpw(iop_base + IOP_RAM_DATA,
  2575.             ((ushort) outbuf[i + 1] << 8) | outbuf[i]);
  2576.     }
  2577. }
  2578. /*
  2579.  * void
  2580.  * DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
  2581.  *
  2582.  * Calling/Exit State:
  2583.  *    none
  2584.  *
  2585.  * Description:
  2586.  *     Input an ASC_QDONE_INFO structure from the chip
  2587.  */
  2588. STATIC void
  2589. DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
  2590. {
  2591.     int    i;
  2592.     ushort word;
  2593.     AscSetChipLramAddr(iop_base, s_addr);
  2594.     for (i = 0; i < 2 * words; i += 2) {
  2595.         if (i == 10) {
  2596.             continue;
  2597.         }
  2598.         word = inpw(iop_base + IOP_RAM_DATA);
  2599.         inbuf[i] = word & 0xff;
  2600.         inbuf[i + 1] = (word >> 8) & 0xff;
  2601.     }
  2602.     ASC_DBG_PRT_HEX(2, "DvcGetQinfo", inbuf, 2 * words);
  2603. }
  2604. /*
  2605.  * Read a PCI configuration byte.
  2606.  */
  2607. ASC_INITFUNC(
  2608. STATIC uchar,
  2609. DvcReadPCIConfigByte(
  2610.         ASC_DVC_VAR *asc_dvc,
  2611.         ushort offset)
  2612. )
  2613. {
  2614. #ifdef CONFIG_PCI
  2615.     uchar byte_data;
  2616.     pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info),
  2617.         PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info),
  2618.             ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)),
  2619.         offset, &byte_data);
  2620.     return byte_data;
  2621. #else /* !defined(CONFIG_PCI) */
  2622.     return 0;
  2623. #endif /* !defined(CONFIG_PCI) */
  2624. }
  2625. /*
  2626.  * Write a PCI configuration byte.
  2627.  */
  2628. ASC_INITFUNC(
  2629. STATIC void,
  2630. DvcWritePCIConfigByte(
  2631.         ASC_DVC_VAR *asc_dvc,
  2632.         ushort offset,
  2633.         uchar  byte_data)
  2634. )
  2635. {
  2636. #ifdef CONFIG_PCI
  2637.     pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info),
  2638.         PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info),
  2639.             ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)),
  2640.         offset, byte_data);
  2641. #endif /* CONFIG_PCI */
  2642. }
  2643. /*
  2644.  * Return the BIOS address of the adapter at the specified
  2645.  * I/O port and with the specified bus type.
  2646.  */
  2647. ASC_INITFUNC(
  2648. STATIC ushort,
  2649. AscGetChipBiosAddress(
  2650.         PortAddr iop_base,
  2651.         ushort bus_type
  2652. )
  2653. )
  2654. {
  2655.     ushort  cfg_lsw;
  2656.     ushort  bios_addr;
  2657.     /*
  2658.      * The PCI BIOS is re-located by the motherboard BIOS. Because
  2659.      * of this the driver can not determine where a PCI BIOS is
  2660.      * loaded and executes.
  2661.      */
  2662.     if (bus_type & ASC_IS_PCI)
  2663.     {
  2664.         return(0);
  2665.     }
  2666. #ifdef CONFIG_ISA
  2667.     if((bus_type & ASC_IS_EISA) != 0)
  2668.     {
  2669.         cfg_lsw = AscGetEisaChipCfg(iop_base);
  2670.         cfg_lsw &= 0x000F;
  2671.         bios_addr = (ushort)(ASC_BIOS_MIN_ADDR  +
  2672.                                 (cfg_lsw * ASC_BIOS_BANK_SIZE));
  2673.         return(bios_addr);
  2674.     }/* if */
  2675. #endif /* CONFIG_ISA */
  2676.     cfg_lsw = AscGetChipCfgLsw(iop_base);
  2677.     /*
  2678.     *  ISA PnP uses the top bit as the 32K BIOS flag
  2679.     */
  2680.     if (bus_type == ASC_IS_ISAPNP)
  2681.     {
  2682.         cfg_lsw &= 0x7FFF;
  2683.     }/* if */
  2684.     bios_addr = (ushort)(((cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE) +
  2685.             ASC_BIOS_MIN_ADDR);
  2686.     return(bios_addr);
  2687. }
  2688. /*
  2689.  * --- Functions Required by the Adv Library
  2690.  */
  2691. /*
  2692.  * DvcGetPhyAddr()
  2693.  *
  2694.  * Return the physical address of 'vaddr' and set '*lenp' to the
  2695.  * number of physically contiguous bytes that follow 'vaddr'.
  2696.  * 'flag' indicates the type of structure whose physical address
  2697.  * is being translated.
  2698.  *
  2699.  * Note: Because Linux currently doesn't page the kernel and all
  2700.  * kernel buffers are physically contiguous, leave '*lenp' unchanged.
  2701.  */
  2702. ADV_PADDR
  2703. DvcGetPhyAddr(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq,
  2704.         uchar *vaddr, ADV_SDCNT *lenp, int flag)
  2705. {
  2706.     ADV_PADDR           paddr;
  2707.     paddr = virt_to_bus(vaddr);
  2708.     ASC_DBG4(4,
  2709.         "DvcGetPhyAddr: vaddr 0x%lx, lenp 0x%lx *lenp %lu, paddr 0x%lxn",
  2710.         (ulong) vaddr, (ulong) lenp, (ulong) *((ulong *) lenp), (ulong) paddr);
  2711.     return paddr;
  2712. }
  2713. /*
  2714.  * Read a PCI configuration byte.
  2715.  */
  2716. ASC_INITFUNC(
  2717. STATIC uchar,
  2718. DvcAdvReadPCIConfigByte(
  2719.         ADV_DVC_VAR *asc_dvc,
  2720.         ushort offset)
  2721. )
  2722. {
  2723. #ifdef CONFIG_PCI
  2724.     uchar byte_data;
  2725.     pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info),
  2726.         PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info),
  2727.             ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)),
  2728.         offset, &byte_data);
  2729.     return byte_data;
  2730. #else /* CONFIG_PCI */
  2731.     return 0;
  2732. #endif /* CONFIG_PCI */
  2733. }
  2734. /*
  2735.  * Write a PCI configuration byte.
  2736.  */
  2737. ASC_INITFUNC(
  2738. STATIC void,
  2739. DvcAdvWritePCIConfigByte(
  2740.         ADV_DVC_VAR *asc_dvc,
  2741.         ushort offset,
  2742.         uchar  byte_data)
  2743. )
  2744. {
  2745. #ifdef CONFIG_PCI
  2746.     pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info),
  2747.         PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info),
  2748.             ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)),
  2749.         offset, byte_data);
  2750. #else /* CONFIG_PCI */
  2751.     return 0;
  2752. #endif /* CONFIG_PCI */
  2753. }
  2754. /*
  2755.  * --- Tracing and Debugging Functions
  2756.  */
  2757. #ifdef ADVANSYS_STATS
  2758. #ifdef CONFIG_PROC_FS
  2759. /*
  2760.  * asc_prt_board_stats()
  2761.  *
  2762.  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
  2763.  * cf. asc_prt_line().
  2764.  *
  2765.  * Return the number of characters copied into 'cp'. No more than
  2766.  * 'cplen' characters will be copied to 'cp'.
  2767.  */
  2768. STATIC int
  2769. asc_prt_board_stats(struct Scsi_Host *shp, char *cp, int cplen)
  2770. {
  2771.     int                    leftlen;
  2772.     int                    totlen;
  2773.     int                    len;
  2774.     struct asc_stats       *s;
  2775.     asc_board_t            *boardp;
  2776.     leftlen = cplen;
  2777.     totlen = len = 0;
  2778.     boardp = ASC_BOARDP(shp);
  2779.     s = &boardp->asc_stats;
  2780.     len = asc_prt_line(cp, leftlen,
  2781. "nLinux Driver Statistics for AdvanSys SCSI Host %d:n", shp->host_no);
  2782.     ASC_PRT_NEXT();
  2783.     len = asc_prt_line(cp, leftlen,
  2784. " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lun",
  2785.         s->queuecommand, s->reset, s->biosparam, s->interrupt);
  2786.     ASC_PRT_NEXT();
  2787.     len = asc_prt_line(cp, leftlen,
  2788. " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lun",
  2789.         s->callback, s->done, s->build_error, s->adv_build_noreq,
  2790.         s->adv_build_nosg);
  2791.     ASC_PRT_NEXT();
  2792.     len = asc_prt_line(cp, leftlen,
  2793. " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lun",
  2794.         s->exe_noerror, s->exe_busy, s->exe_error, s->exe_unknown);
  2795.     ASC_PRT_NEXT();
  2796.     /*
  2797.      * Display data transfer statistics.
  2798.      */
  2799.     if (s->cont_cnt > 0) {
  2800.         len = asc_prt_line(cp, leftlen, " cont_cnt %lu, ", s->cont_cnt);
  2801.         ASC_PRT_NEXT();
  2802.         len = asc_prt_line(cp, leftlen, "cont_xfer %lu.%01lu kb ",
  2803.                     s->cont_xfer/2,
  2804.                     ASC_TENTHS(s->cont_xfer, 2));
  2805.         ASC_PRT_NEXT();
  2806.         /* Contiguous transfer average size */
  2807.         len = asc_prt_line(cp, leftlen, "avg_xfer %lu.%01lu kbn",
  2808.                     (s->cont_xfer/2)/s->cont_cnt,
  2809.                     ASC_TENTHS((s->cont_xfer/2), s->cont_cnt));
  2810.         ASC_PRT_NEXT();
  2811.     }
  2812.     if (s->sg_cnt > 0) {
  2813.         len = asc_prt_line(cp, leftlen, " sg_cnt %lu, sg_elem %lu, ",
  2814.                     s->sg_cnt, s->sg_elem);
  2815.         ASC_PRT_NEXT();
  2816.         len = asc_prt_line(cp, leftlen, "sg_xfer %lu.%01lu kbn",
  2817.                     s->sg_xfer/2,