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

嵌入式Linux

开发平台:

Unix_Linux

  1.      */
  2.     if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
  3.     {
  4.         asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
  5.         return ADV_ERROR;
  6.     }
  7.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  8.          ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
  9.     /*
  10.      * The first command completed by the RISC will be placed in
  11.      * the stopper.
  12.      *
  13.      * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
  14.      * completed the RISC will set the ASC_RQ_STOPPER bit.
  15.      */
  16.     asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  17.     /*
  18.      * Set RISC IRQ physical address start value.
  19.      */
  20.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
  21.     asc_dvc->carr_pending_cnt = 0;
  22.     AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
  23.         (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
  24.     AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
  25.     AdvWriteWordRegister(iop_base, IOPW_PC, word);
  26.     /* finally, finally, gentlemen, start your engine */
  27.     AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
  28.     /*
  29.      * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
  30.      * Resets should be performed. The RISC has to be running
  31.      * to issue a SCSI Bus Reset.
  32.      */
  33.     if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
  34.     {
  35.         /*
  36.          * If the BIOS Signature is present in memory, restore the
  37.          * BIOS Handshake Configuration Table and do not perform
  38.          * a SCSI Bus Reset.
  39.          */
  40.         if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
  41.         {
  42.             /*
  43.              * Restore per TID negotiated values.
  44.              */
  45.             AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  46.             AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  47.             AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  48.             for (tid = 0; tid <= ADV_MAX_TID; tid++)
  49.             {
  50.                 AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  51.                     max_cmd[tid]);
  52.             }
  53.         } else
  54.         {
  55.             if (AdvResetSB(asc_dvc) != ADV_TRUE)
  56.             {
  57.                 warn_code = ASC_WARN_BUSRESET_ERROR;
  58.             }
  59.         }
  60.     }
  61.     return warn_code;
  62. }
  63. /*
  64.  * Initialize the ASC-38C0800.
  65.  *
  66.  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
  67.  *
  68.  * For a non-fatal error return a warning code. If there are no warnings
  69.  * then 0 is returned.
  70.  *
  71.  * Needed after initialization for error recovery.
  72.  */
  73. STATIC int
  74. AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
  75. {
  76.     AdvPortAddr iop_base;
  77.     ushort      warn_code;
  78.     ADV_DCNT    sum;
  79.     int         begin_addr;
  80.     int         end_addr;
  81.     ushort      code_sum;
  82.     int         word;
  83.     int         j;
  84.     int         adv_asc38C0800_expanded_size;
  85.     ADV_CARR_T  *carrp;
  86.     ADV_DCNT    contig_len;
  87.     ADV_SDCNT   buf_size;
  88.     ADV_PADDR   carr_paddr;
  89.     int         i;
  90.     ushort      scsi_cfg1;
  91.     uchar       byte;
  92.     uchar       tid;
  93.     ushort      bios_mem[ASC_MC_BIOSLEN/2]; /* BIOS RISC Memory 0x40-0x8F. */
  94.     ushort      wdtr_able, sdtr_able, tagqng_able;
  95.     uchar       max_cmd[ADV_MAX_TID + 1];
  96.     /* If there is already an error, don't continue. */
  97.     if (asc_dvc->err_code != 0)
  98.     {
  99.         return ADV_ERROR;
  100.     }
  101.     /*
  102.      * The caller must set 'chip_type' to ADV_CHIP_ASC38C0800.
  103.      */
  104.     if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800)
  105.     {
  106.         asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
  107.         return ADV_ERROR;
  108.     }
  109.     warn_code = 0;
  110.     iop_base = asc_dvc->iop_base;
  111.     /*
  112.      * Save the RISC memory BIOS region before writing the microcode.
  113.      * The BIOS may already be loaded and using its RISC LRAM region
  114.      * so its region must be saved and restored.
  115.      *
  116.      * Note: This code makes the assumption, which is currently true,
  117.      * that a chip reset does not clear RISC LRAM.
  118.      */
  119.     for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
  120.     {
  121.         AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
  122.     }
  123.     /*
  124.      * Save current per TID negotiated values.
  125.      */
  126.     AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  127.     AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  128.     AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  129.     for (tid = 0; tid <= ADV_MAX_TID; tid++)
  130.     {
  131.         AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  132.             max_cmd[tid]);
  133.     }
  134.     /*
  135.      * RAM BIST (RAM Built-In Self Test)
  136.      *
  137.      * Address : I/O base + offset 0x38h register (byte).
  138.      * Function: Bit 7-6(RW) : RAM mode
  139.      *                          Normal Mode   : 0x00
  140.      *                          Pre-test Mode : 0x40
  141.      *                          RAM Test Mode : 0x80
  142.      *           Bit 5       : unused
  143.      *           Bit 4(RO)   : Done bit
  144.      *           Bit 3-0(RO) : Status
  145.      *                          Host Error    : 0x08
  146.      *                          Int_RAM Error : 0x04
  147.      *                          RISC Error    : 0x02
  148.      *                          SCSI Error    : 0x01
  149.      *                          No Error      : 0x00
  150.      *
  151.      * Note: RAM BIST code should be put right here, before loading the
  152.      * microcode and after saving the RISC memory BIOS region.
  153.      */
  154.     /*
  155.      * LRAM Pre-test
  156.      *
  157.      * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
  158.      * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
  159.      * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
  160.      * to NORMAL_MODE, return an error too.
  161.      */
  162.     for (i = 0; i < 2; i++)
  163.     {
  164.         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
  165.         DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
  166.         byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
  167.         if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) != PRE_TEST_VALUE)
  168.         {
  169.             asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
  170.             return ADV_ERROR;
  171.         }
  172.         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
  173.         DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
  174.         if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
  175.             != NORMAL_VALUE)
  176.         {
  177.             asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
  178.             return ADV_ERROR;
  179.         }
  180.     }
  181.     /*
  182.      * LRAM Test - It takes about 1.5 ms to run through the test.
  183.      *
  184.      * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
  185.      * If Done bit not set or Status not 0, save register byte, set the
  186.      * err_code, and return an error.
  187.      */
  188.     AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
  189.     DvcSleepMilliSecond(10);  /* Wait for 10ms before checking status. */
  190.     byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
  191.     if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0)
  192.     {
  193.         /* Get here if Done bit not set or Status not 0. */
  194.         asc_dvc->bist_err_code = byte;  /* for BIOS display message */
  195.         asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
  196.         return ADV_ERROR;
  197.     }
  198.     /* We need to reset back to normal mode after LRAM test passes. */
  199.     AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
  200.     /*
  201.      * Load the Microcode
  202.      *
  203.      * Write the microcode image to RISC memory starting at address 0.
  204.      *
  205.      */
  206.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
  207.     /* Assume the following compressed format of the microcode buffer:
  208.      *
  209.      *  254 word (508 byte) table indexed by byte code followed
  210.      *  by the following byte codes:
  211.      *
  212.      *    1-Byte Code:
  213.      *      00: Emit word 0 in table.
  214.      *      01: Emit word 1 in table.
  215.      *      .
  216.      *      FD: Emit word 253 in table.
  217.      *
  218.      *    Multi-Byte Code:
  219.      *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
  220.      *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
  221.      */
  222.     word = 0;
  223.     for (i = 253 * 2; i < _adv_asc38C0800_size; i++)
  224.     {
  225.         if (_adv_asc38C0800_buf[i] == 0xff)
  226.         {
  227.             for (j = 0; j < _adv_asc38C0800_buf[i + 1]; j++)
  228.             {
  229.                 AdvWriteWordAutoIncLram(iop_base, (((ushort)
  230.                     _adv_asc38C0800_buf[i + 3] << 8) |
  231.                     _adv_asc38C0800_buf[i + 2]));
  232.                 word++;
  233.             }
  234.             i += 3;
  235.         } else if (_adv_asc38C0800_buf[i] == 0xfe)
  236.         {
  237.             AdvWriteWordAutoIncLram(iop_base, (((ushort)
  238.                 _adv_asc38C0800_buf[i + 2] << 8) |
  239.                 _adv_asc38C0800_buf[i + 1]));
  240.             i += 2;
  241.             word++;
  242.         } else
  243.         {
  244.             AdvWriteWordAutoIncLram(iop_base, (((ushort)
  245.                 _adv_asc38C0800_buf[(_adv_asc38C0800_buf[i] * 2) + 1] << 8) |
  246.                 _adv_asc38C0800_buf[_adv_asc38C0800_buf[i] * 2]));
  247.             word++;
  248.         }
  249.     }
  250.     /*
  251.      * Set 'word' for later use to clear the rest of memory and save
  252.      * the expanded mcode size.
  253.      */
  254.     word *= 2;
  255.     adv_asc38C0800_expanded_size = word;
  256.     /*
  257.      * Clear the rest of ASC-38C0800 Internal RAM (16KB).
  258.      */
  259.     for (; word < ADV_38C0800_MEMSIZE; word += 2)
  260.     {
  261.         AdvWriteWordAutoIncLram(iop_base, 0);
  262.     }
  263.     /*
  264.      * Verify the microcode checksum.
  265.      */
  266.     sum = 0;
  267.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
  268.     for (word = 0; word < adv_asc38C0800_expanded_size; word += 2)
  269.     {
  270.         sum += AdvReadWordAutoIncLram(iop_base);
  271.     }
  272.     ASC_DBG2(1, "AdvInitAsc38C0800Driver: word %d, i %dn", word, i);
  273.     ASC_DBG2(1,
  274.         "AdvInitAsc38C0800Driver: sum 0x%lx, _adv_asc38C0800_chksum 0x%lxn",
  275.         (ulong) sum, (ulong) _adv_asc38C0800_chksum);
  276.     if (sum != _adv_asc38C0800_chksum)
  277.     {
  278.         asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
  279.         return ADV_ERROR;
  280.     }
  281.     /*
  282.      * Restore the RISC memory BIOS region.
  283.      */
  284.     for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
  285.     {
  286.         AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
  287.     }
  288.     /*
  289.      * Calculate and write the microcode code checksum to the microcode
  290.      * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
  291.      */
  292.     AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
  293.     AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
  294.     code_sum = 0;
  295.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
  296.     for (word = begin_addr; word < end_addr; word += 2)
  297.     {
  298.         code_sum += AdvReadWordAutoIncLram(iop_base);
  299.     }
  300.     AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
  301.     /*
  302.      * Read microcode version and date.
  303.      */
  304.     AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE, asc_dvc->cfg->mcode_date);
  305.     AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM, asc_dvc->cfg->mcode_version);
  306.     /*
  307.      * Set the chip type to indicate the ASC38C0800.
  308.      */
  309.     AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
  310.     /*
  311.      * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
  312.      * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
  313.      * cable detection and then we are able to read C_DET[3:0].
  314.      *
  315.      * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
  316.      * Microcode Default Value' section below.
  317.      */
  318.     scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
  319.     AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1, scsi_cfg1 | DIS_TERM_DRV);
  320.     /*
  321.      * If the PCI Configuration Command Register "Parity Error Response
  322.      * Control" Bit was clear (0), then set the microcode variable
  323.      * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
  324.      * to ignore DMA parity errors.
  325.      */
  326.     if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR)
  327.     {
  328.         AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  329.         word |= CONTROL_FLAG_IGNORE_PERR;
  330.         AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  331.     }
  332.     /*
  333.      * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
  334.      * bits for the default FIFO threshold.
  335.      *
  336.      * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
  337.      *
  338.      * For DMA Errata #4 set the BC_THRESH_ENB bit.
  339.      */
  340.     AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
  341.         BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
  342.     /*
  343.      * Microcode operating variables for WDTR, SDTR, and command tag
  344.      * queuing will be set in AdvInquiryHandling() based on what a
  345.      * device reports it is capable of in Inquiry byte 7.
  346.      *
  347.      * If SCSI Bus Resets have been disabled, then directly set
  348.      * SDTR and WDTR from the EEPROM configuration. This will allow
  349.      * the BIOS and warm boot to work without a SCSI bus hang on
  350.      * the Inquiry caused by host and target mismatched DTR values.
  351.      * Without the SCSI Bus Reset, before an Inquiry a device can't
  352.      * be assumed to be in Asynchronous, Narrow mode.
  353.      */
  354.     if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0)
  355.     {
  356.         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, asc_dvc->wdtr_able);
  357.         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, asc_dvc->sdtr_able);
  358.     }
  359.     /*
  360.      * Set microcode operating variables for DISC and SDTR_SPEED1,
  361.      * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
  362.      * configuration values.
  363.      *
  364.      * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
  365.      * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
  366.      * without determining here whether the device supports SDTR.
  367.      */
  368.     AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE, asc_dvc->cfg->disc_enable);
  369.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
  370.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
  371.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
  372.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
  373.     /*
  374.      * Set SCSI_CFG0 Microcode Default Value.
  375.      *
  376.      * The microcode will set the SCSI_CFG0 register using this value
  377.      * after it is started below.
  378.      */
  379.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
  380.         PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
  381.         asc_dvc->chip_scsi_id);
  382.     /*
  383.      * Determine SCSI_CFG1 Microcode Default Value.
  384.      *
  385.      * The microcode will set the SCSI_CFG1 register using this value
  386.      * after it is started below.
  387.      */
  388.     /* Read current SCSI_CFG1 Register value. */
  389.     scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
  390.     /*
  391.      * If the internal narrow cable is reversed all of the SCSI_CTRL
  392.      * register signals will be set. Check for and return an error if
  393.      * this condition is found.
  394.      */
  395.     if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07)
  396.     {
  397.         asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
  398.         return ADV_ERROR;
  399.     }
  400.     /*
  401.      * All kind of combinations of devices attached to one of four connectors
  402.      * are acceptable except HVD device attached. For example, LVD device can
  403.      * be attached to SE connector while SE device attached to LVD connector.
  404.      * If LVD device attached to SE connector, it only runs up to Ultra speed.
  405.      *
  406.      * If an HVD device is attached to one of LVD connectors, return an error.
  407.      * However, there is no way to detect HVD device attached to SE connectors.
  408.      */
  409.     if (scsi_cfg1 & HVD)
  410.     {
  411.         asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
  412.         return ADV_ERROR;
  413.     }
  414.     /*
  415.      * If either SE or LVD automatic termination control is enabled, then
  416.      * set the termination value based on a table listed in a_condor.h.
  417.      *
  418.      * If manual termination was specified with an EEPROM setting then
  419.      * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready to
  420.      * be 'ored' into SCSI_CFG1.
  421.      */
  422.     if ((asc_dvc->cfg->termination & TERM_SE) == 0)
  423.     {
  424.         /* SE automatic termination control is enabled. */
  425.         switch(scsi_cfg1 & C_DET_SE)
  426.         {
  427.             /* TERM_SE_HI: on, TERM_SE_LO: on */
  428.             case 0x1: case 0x2: case 0x3:
  429.                 asc_dvc->cfg->termination |= TERM_SE;
  430.                 break;
  431.             /* TERM_SE_HI: on, TERM_SE_LO: off */
  432.             case 0x0:
  433.                 asc_dvc->cfg->termination |= TERM_SE_HI;
  434.                 break;
  435.         }
  436.     }
  437.     if ((asc_dvc->cfg->termination & TERM_LVD) == 0)
  438.     {
  439.         /* LVD automatic termination control is enabled. */
  440.         switch(scsi_cfg1 & C_DET_LVD)
  441.         {
  442.             /* TERM_LVD_HI: on, TERM_LVD_LO: on */
  443.             case 0x4: case 0x8: case 0xC:
  444.                 asc_dvc->cfg->termination |= TERM_LVD;
  445.                 break;
  446.             /* TERM_LVD_HI: off, TERM_LVD_LO: off */
  447.             case 0x0:
  448.                 break;
  449.         }
  450.     }
  451.     /*
  452.      * Clear any set TERM_SE and TERM_LVD bits.
  453.      */
  454.     scsi_cfg1 &= (~TERM_SE & ~TERM_LVD);
  455.     /*
  456.      * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
  457.      */
  458.     scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0);
  459.     /*
  460.      * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE bits
  461.      * and set possibly modified termination control bits in the Microcode
  462.      * SCSI_CFG1 Register Value.
  463.      */
  464.     scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL & ~HVD_LVD_SE);
  465.     /*
  466.      * Set SCSI_CFG1 Microcode Default Value
  467.      *
  468.      * Set possibly modified termination control and reset DIS_TERM_DRV
  469.      * bits in the Microcode SCSI_CFG1 Register Value.
  470.      *
  471.      * The microcode will set the SCSI_CFG1 register using this value
  472.      * after it is started below.
  473.      */
  474.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
  475.     /*
  476.      * Set MEM_CFG Microcode Default Value
  477.      *
  478.      * The microcode will set the MEM_CFG register using this value
  479.      * after it is started below.
  480.      *
  481.      * MEM_CFG may be accessed as a word or byte, but only bits 0-7
  482.      * are defined.
  483.      *
  484.      * ASC-38C0800 has 16KB internal memory.
  485.      */
  486.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
  487.         BIOS_EN | RAM_SZ_16KB);
  488.     /*
  489.      * Set SEL_MASK Microcode Default Value
  490.      *
  491.      * The microcode will set the SEL_MASK register using this value
  492.      * after it is started below.
  493.      */
  494.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
  495.         ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
  496.     /*
  497.      * Build the carrier freelist.
  498.      *
  499.      * Driver must have already allocated memory and set 'carrier_buf'.
  500.      */
  501.     ASC_ASSERT(asc_dvc->carrier_buf != NULL);
  502.     carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
  503.     asc_dvc->carr_freelist = NULL;
  504.     if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf)
  505.     {
  506.         buf_size = ADV_CARRIER_BUFSIZE;
  507.     } else
  508.     {
  509.         buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
  510.     }
  511.     do {
  512.         /*
  513.          * Get physical address for the carrier 'carrp'.
  514.          */
  515.         contig_len = sizeof(ADV_CARR_T);
  516.         carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL, (uchar *) carrp,
  517.             (ADV_SDCNT *) &contig_len, ADV_IS_CARRIER_FLAG));
  518.         buf_size -= sizeof(ADV_CARR_T);
  519.         /*
  520.          * If the current carrier is not physically contiguous, then
  521.          * maybe there was a page crossing. Try the next carrier aligned
  522.          * start address.
  523.          */
  524.         if (contig_len < sizeof(ADV_CARR_T))
  525.         {
  526.             carrp++;
  527.             continue;
  528.         }
  529.         carrp->carr_pa = carr_paddr;
  530.         carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
  531.         /*
  532.          * Insert the carrier at the beginning of the freelist.
  533.          */
  534.         carrp->next_vpa = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
  535.         asc_dvc->carr_freelist = carrp;
  536.         carrp++;
  537.     }
  538.     while (buf_size > 0);
  539.     /*
  540.      * Set-up the Host->RISC Initiator Command Queue (ICQ).
  541.      */
  542.     if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL)
  543.     {
  544.         asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
  545.         return ADV_ERROR;
  546.     }
  547.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  548.         ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
  549.     /*
  550.      * The first command issued will be placed in the stopper carrier.
  551.      */
  552.     asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  553.     /*
  554.      * Set RISC ICQ physical address start value.
  555.      * carr_pa is LE, must be native before write
  556.      */
  557.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
  558.     /*
  559.      * Set-up the RISC->Host Initiator Response Queue (IRQ).
  560.      */
  561.     if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
  562.     {
  563.         asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
  564.         return ADV_ERROR;
  565.     }
  566.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  567.         ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
  568.     /*
  569.      * The first command completed by the RISC will be placed in
  570.      * the stopper.
  571.      *
  572.      * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
  573.      * completed the RISC will set the ASC_RQ_STOPPER bit.
  574.      */
  575.     asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  576.     /*
  577.      * Set RISC IRQ physical address start value.
  578.      *
  579.      * carr_pa is LE, must be native before write *
  580.      */
  581.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
  582.     asc_dvc->carr_pending_cnt = 0;
  583.     AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
  584.         (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
  585.     AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
  586.     AdvWriteWordRegister(iop_base, IOPW_PC, word);
  587.     /* finally, finally, gentlemen, start your engine */
  588.     AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
  589.     /*
  590.      * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
  591.      * Resets should be performed. The RISC has to be running
  592.      * to issue a SCSI Bus Reset.
  593.      */
  594.     if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
  595.     {
  596.         /*
  597.          * If the BIOS Signature is present in memory, restore the
  598.          * BIOS Handshake Configuration Table and do not perform
  599.          * a SCSI Bus Reset.
  600.          */
  601.         if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
  602.         {
  603.             /*
  604.              * Restore per TID negotiated values.
  605.              */
  606.             AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  607.             AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  608.             AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  609.             for (tid = 0; tid <= ADV_MAX_TID; tid++)
  610.             {
  611.                 AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  612.                     max_cmd[tid]);
  613.             }
  614.         } else
  615.         {
  616.             if (AdvResetSB(asc_dvc) != ADV_TRUE)
  617.             {
  618.                 warn_code = ASC_WARN_BUSRESET_ERROR;
  619.             }
  620.         }
  621.     }
  622.     return warn_code;
  623. }
  624. /*
  625.  * Initialize the ASC-38C1600.
  626.  *
  627.  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
  628.  *
  629.  * For a non-fatal error return a warning code. If there are no warnings
  630.  * then 0 is returned.
  631.  *
  632.  * Needed after initialization for error recovery.
  633.  */
  634. STATIC int
  635. AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
  636. {
  637.     AdvPortAddr iop_base;
  638.     ushort      warn_code;
  639.     ADV_DCNT    sum;
  640.     int         begin_addr;
  641.     int         end_addr;
  642.     ushort      code_sum;
  643.     long        word;
  644.     int         j;
  645.     int         adv_asc38C1600_expanded_size;
  646.     ADV_CARR_T  *carrp;
  647.     ADV_DCNT    contig_len;
  648.     ADV_SDCNT   buf_size;
  649.     ADV_PADDR   carr_paddr;
  650.     int         i;
  651.     ushort      scsi_cfg1;
  652.     uchar       byte;
  653.     uchar       tid;
  654.     ushort      bios_mem[ASC_MC_BIOSLEN/2]; /* BIOS RISC Memory 0x40-0x8F. */
  655.     ushort      wdtr_able, sdtr_able, ppr_able, tagqng_able;
  656.     uchar       max_cmd[ASC_MAX_TID + 1];
  657.     /* If there is already an error, don't continue. */
  658.     if (asc_dvc->err_code != 0)
  659.     {
  660.         return ADV_ERROR;
  661.     }
  662.     /*
  663.      * The caller must set 'chip_type' to ADV_CHIP_ASC38C1600.
  664.      */
  665.     if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600)
  666.     {
  667.         asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
  668.         return ADV_ERROR;
  669.     }
  670.     warn_code = 0;
  671.     iop_base = asc_dvc->iop_base;
  672.     /*
  673.      * Save the RISC memory BIOS region before writing the microcode.
  674.      * The BIOS may already be loaded and using its RISC LRAM region
  675.      * so its region must be saved and restored.
  676.      *
  677.      * Note: This code makes the assumption, which is currently true,
  678.      * that a chip reset does not clear RISC LRAM.
  679.      */
  680.     for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
  681.     {
  682.         AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
  683.     }
  684.     /*
  685.      * Save current per TID negotiated values.
  686.      */
  687.     AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  688.     AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  689.     AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
  690.     AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  691.     for (tid = 0; tid <= ASC_MAX_TID; tid++)
  692.     {
  693.         AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  694.             max_cmd[tid]);
  695.     }
  696.     /*
  697.      * RAM BIST (Built-In Self Test)
  698.      *
  699.      * Address : I/O base + offset 0x38h register (byte).
  700.      * Function: Bit 7-6(RW) : RAM mode
  701.      *                          Normal Mode   : 0x00
  702.      *                          Pre-test Mode : 0x40
  703.      *                          RAM Test Mode : 0x80
  704.      *           Bit 5       : unused
  705.      *           Bit 4(RO)   : Done bit
  706.      *           Bit 3-0(RO) : Status
  707.      *                          Host Error    : 0x08
  708.      *                          Int_RAM Error : 0x04
  709.      *                          RISC Error    : 0x02
  710.      *                          SCSI Error    : 0x01
  711.      *                          No Error      : 0x00
  712.      *
  713.      * Note: RAM BIST code should be put right here, before loading the
  714.      * microcode and after saving the RISC memory BIOS region.
  715.      */
  716.     /*
  717.      * LRAM Pre-test
  718.      *
  719.      * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
  720.      * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
  721.      * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
  722.      * to NORMAL_MODE, return an error too.
  723.      */
  724.     for (i = 0; i < 2; i++)
  725.     {
  726.         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
  727.         DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
  728.         byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
  729.         if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) != PRE_TEST_VALUE)
  730.         {
  731.             asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
  732.             return ADV_ERROR;
  733.         }
  734.         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
  735.         DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
  736.         if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
  737.             != NORMAL_VALUE)
  738.         {
  739.             asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
  740.             return ADV_ERROR;
  741.         }
  742.     }
  743.     /*
  744.      * LRAM Test - It takes about 1.5 ms to run through the test.
  745.      *
  746.      * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
  747.      * If Done bit not set or Status not 0, save register byte, set the
  748.      * err_code, and return an error.
  749.      */
  750.     AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
  751.     DvcSleepMilliSecond(10);  /* Wait for 10ms before checking status. */
  752.     byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
  753.     if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0)
  754.     {
  755.         /* Get here if Done bit not set or Status not 0. */
  756.         asc_dvc->bist_err_code = byte;  /* for BIOS display message */
  757.         asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
  758.         return ADV_ERROR;
  759.     }
  760.     /* We need to reset back to normal mode after LRAM test passes. */
  761.     AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
  762.     /*
  763.      * Load the Microcode
  764.      *
  765.      * Write the microcode image to RISC memory starting at address 0.
  766.      *
  767.      */
  768.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
  769.     /*
  770.      * Assume the following compressed format of the microcode buffer:
  771.      *
  772.      *  254 word (508 byte) table indexed by byte code followed
  773.      *  by the following byte codes:
  774.      *
  775.      *    1-Byte Code:
  776.      *      00: Emit word 0 in table.
  777.      *      01: Emit word 1 in table.
  778.      *      .
  779.      *      FD: Emit word 253 in table.
  780.      *
  781.      *    Multi-Byte Code:
  782.      *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
  783.      *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
  784.      */
  785.     word = 0;
  786.     for (i = 253 * 2; i < _adv_asc38C1600_size; i++)
  787.     {
  788.         if (_adv_asc38C1600_buf[i] == 0xff)
  789.         {
  790.             for (j = 0; j < _adv_asc38C1600_buf[i + 1]; j++)
  791.             {
  792.                 AdvWriteWordAutoIncLram(iop_base, (((ushort)
  793.                      _adv_asc38C1600_buf[i + 3] << 8) |
  794.                      _adv_asc38C1600_buf[i + 2]));
  795.                 word++;
  796.             }
  797.            i += 3;
  798.         } else if (_adv_asc38C1600_buf[i] == 0xfe)
  799.         {
  800.                 AdvWriteWordAutoIncLram(iop_base, (((ushort)
  801.                      _adv_asc38C1600_buf[i + 2] << 8) |
  802.                      _adv_asc38C1600_buf[i + 1]));
  803.             i += 2;
  804.             word++;
  805.         } else
  806.         {
  807.             AdvWriteWordAutoIncLram(iop_base, (((ushort)
  808.                  _adv_asc38C1600_buf[(_adv_asc38C1600_buf[i] * 2) + 1] << 8) |
  809.                  _adv_asc38C1600_buf[_adv_asc38C1600_buf[i] * 2]));
  810.             word++;
  811.         }
  812.     }
  813.     /*
  814.      * Set 'word' for later use to clear the rest of memory and save
  815.      * the expanded mcode size.
  816.      */
  817.     word *= 2;
  818.     adv_asc38C1600_expanded_size = word;
  819.     /*
  820.      * Clear the rest of ASC-38C1600 Internal RAM (32KB).
  821.      */
  822.     for (; word < ADV_38C1600_MEMSIZE; word += 2)
  823.     {
  824.         AdvWriteWordAutoIncLram(iop_base, 0);
  825.     }
  826.     /*
  827.      * Verify the microcode checksum.
  828.      */
  829.     sum = 0;
  830.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
  831.     for (word = 0; word < adv_asc38C1600_expanded_size; word += 2)
  832.     {
  833.         sum += AdvReadWordAutoIncLram(iop_base);
  834.     }
  835.     if (sum != _adv_asc38C1600_chksum)
  836.     {
  837.         asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
  838.         return ADV_ERROR;
  839.     }
  840.     /*
  841.      * Restore the RISC memory BIOS region.
  842.      */
  843.     for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
  844.     {
  845.         AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
  846.     }
  847.     /*
  848.      * Calculate and write the microcode code checksum to the microcode
  849.      * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
  850.      */
  851.     AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
  852.     AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
  853.     code_sum = 0;
  854.     AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
  855.     for (word = begin_addr; word < end_addr; word += 2)
  856.     {
  857.         code_sum += AdvReadWordAutoIncLram(iop_base);
  858.     }
  859.     AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
  860.     /*
  861.      * Read microcode version and date.
  862.      */
  863.     AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE, asc_dvc->cfg->mcode_date);
  864.     AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM, asc_dvc->cfg->mcode_version);
  865.     /*
  866.      * Set the chip type to indicate the ASC38C1600.
  867.      */
  868.     AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C1600);
  869.     /*
  870.      * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
  871.      * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
  872.      * cable detection and then we are able to read C_DET[3:0].
  873.      *
  874.      * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
  875.      * Microcode Default Value' section below.
  876.      */
  877.     scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
  878.     AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1, scsi_cfg1 | DIS_TERM_DRV);
  879.     /*
  880.      * If the PCI Configuration Command Register "Parity Error Response
  881.      * Control" Bit was clear (0), then set the microcode variable
  882.      * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
  883.      * to ignore DMA parity errors.
  884.      */
  885.     if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR)
  886.     {
  887.         AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  888.         word |= CONTROL_FLAG_IGNORE_PERR;
  889.         AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  890.     }
  891.     /*
  892.      * If the BIOS control flag AIPP (Asynchronous Information
  893.      * Phase Protection) disable bit is not set, then set the firmware
  894.      * 'control_flag' CONTROL_FLAG_ENABLE_AIPP bit to enable
  895.      * AIPP checking and encoding.
  896.      */
  897.     if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0)
  898.     {
  899.         AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  900.         word |= CONTROL_FLAG_ENABLE_AIPP;
  901.         AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
  902.     }
  903.     /*
  904.      * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4],
  905.      * and START_CTL_TH [3:2].
  906.      */
  907.     AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
  908.         FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
  909.     /*
  910.      * Microcode operating variables for WDTR, SDTR, and command tag
  911.      * queuing will be set in AdvInquiryHandling() based on what a
  912.      * device reports it is capable of in Inquiry byte 7.
  913.      *
  914.      * If SCSI Bus Resets have been disabled, then directly set
  915.      * SDTR and WDTR from the EEPROM configuration. This will allow
  916.      * the BIOS and warm boot to work without a SCSI bus hang on
  917.      * the Inquiry caused by host and target mismatched DTR values.
  918.      * Without the SCSI Bus Reset, before an Inquiry a device can't
  919.      * be assumed to be in Asynchronous, Narrow mode.
  920.      */
  921.     if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0)
  922.     {
  923.         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, asc_dvc->wdtr_able);
  924.         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, asc_dvc->sdtr_able);
  925.     }
  926.     /*
  927.      * Set microcode operating variables for DISC and SDTR_SPEED1,
  928.      * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
  929.      * configuration values.
  930.      *
  931.      * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
  932.      * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
  933.      * without determining here whether the device supports SDTR.
  934.      */
  935.     AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE, asc_dvc->cfg->disc_enable);
  936.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
  937.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
  938.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
  939.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
  940.     /*
  941.      * Set SCSI_CFG0 Microcode Default Value.
  942.      *
  943.      * The microcode will set the SCSI_CFG0 register using this value
  944.      * after it is started below.
  945.      */
  946.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
  947.         PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
  948.         asc_dvc->chip_scsi_id);
  949.     /*
  950.      * Calculate SCSI_CFG1 Microcode Default Value.
  951.      *
  952.      * The microcode will set the SCSI_CFG1 register using this value
  953.      * after it is started below.
  954.      *
  955.      * Each ASC-38C1600 function has only two cable detect bits.
  956.      * The bus mode override bits are in IOPB_SOFT_OVER_WR.
  957.      */
  958.     scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
  959.     /*
  960.      * If the cable is reversed all of the SCSI_CTRL register signals
  961.      * will be set. Check for and return an error if this condition is
  962.      * found.
  963.      */
  964.     if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07)
  965.     {
  966.         asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
  967.         return ADV_ERROR;
  968.     }
  969.     /*
  970.      * Each ASC-38C1600 function has two connectors. Only an HVD device
  971.      * can not be connected to either connector. An LVD device or SE device
  972.      * may be connected to either connecor. If an SE device is connected,
  973.      * then at most Ultra speed (20 Mhz) can be used on both connectors.
  974.      *
  975.      * If an HVD device is attached, return an error.
  976.      */
  977.     if (scsi_cfg1 & HVD)
  978.     {
  979.         asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
  980.         return ADV_ERROR;
  981.     }
  982.     /*
  983.      * Each function in the ASC-38C1600 uses only the SE cable detect and
  984.      * termination because there are two connectors for each function. Each
  985.      * function may use either LVD or SE mode. Corresponding the SE automatic
  986.      * termination control EEPROM bits are used for each function. Each
  987.      * function has its own EEPROM. If SE automatic control is enabled for
  988.      * the function, then set the termination value based on a table listed
  989.      * in a_condor.h.
  990.      *
  991.      * If manual termination is specified in the EEPROM for the function,
  992.      * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is
  993.      * ready to be 'ored' into SCSI_CFG1.
  994.      */
  995.     if ((asc_dvc->cfg->termination & TERM_SE) == 0)
  996.     {
  997.         /* SE automatic termination control is enabled. */
  998.         switch(scsi_cfg1 & C_DET_SE)
  999.         {
  1000.             /* TERM_SE_HI: on, TERM_SE_LO: on */
  1001.             case 0x1: case 0x2: case 0x3:
  1002.                 asc_dvc->cfg->termination |= TERM_SE;
  1003.                 break;
  1004.             case 0x0:
  1005.                 if (ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) == 0)
  1006.                 {
  1007.                     /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
  1008.                 }
  1009.                 else
  1010.                 {
  1011.                     /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
  1012.                     asc_dvc->cfg->termination |= TERM_SE_HI;
  1013.                 }
  1014.                 break;
  1015.         }
  1016.     }
  1017.     /*
  1018.      * Clear any set TERM_SE bits.
  1019.      */
  1020.     scsi_cfg1 &= ~TERM_SE;
  1021.     /*
  1022.      * Invert the TERM_SE bits and then set 'scsi_cfg1'.
  1023.      */
  1024.     scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE);
  1025.     /*
  1026.      * Clear Big Endian and Terminator Polarity bits and set possibly
  1027.      * modified termination control bits in the Microcode SCSI_CFG1
  1028.      * Register Value.
  1029.      *
  1030.      * Big Endian bit is not used even on big endian machines.
  1031.      */
  1032.     scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL);
  1033.     /*
  1034.      * Set SCSI_CFG1 Microcode Default Value
  1035.      *
  1036.      * Set possibly modified termination control bits in the Microcode
  1037.      * SCSI_CFG1 Register Value.
  1038.      *
  1039.      * The microcode will set the SCSI_CFG1 register using this value
  1040.      * after it is started below.
  1041.      */
  1042.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
  1043.     /*
  1044.      * Set MEM_CFG Microcode Default Value
  1045.      *
  1046.      * The microcode will set the MEM_CFG register using this value
  1047.      * after it is started below.
  1048.      *
  1049.      * MEM_CFG may be accessed as a word or byte, but only bits 0-7
  1050.      * are defined.
  1051.      *
  1052.      * ASC-38C1600 has 32KB internal memory.
  1053.      *
  1054.      * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come
  1055.      * out a special 16K Adv Library and Microcode version. After the issue
  1056.      * resolved, we should turn back to the 32K support. Both a_condor.h and
  1057.      * mcode.sas files also need to be updated.
  1058.      *
  1059.      * AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
  1060.      *  BIOS_EN | RAM_SZ_32KB);
  1061.      */
  1062.      AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG, BIOS_EN | RAM_SZ_16KB);
  1063.     /*
  1064.      * Set SEL_MASK Microcode Default Value
  1065.      *
  1066.      * The microcode will set the SEL_MASK register using this value
  1067.      * after it is started below.
  1068.      */
  1069.     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
  1070.         ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
  1071.     /*
  1072.      * Build the carrier freelist.
  1073.      *
  1074.      * Driver must have already allocated memory and set 'carrier_buf'.
  1075.      */
  1076.     ASC_ASSERT(asc_dvc->carrier_buf != NULL);
  1077.     carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
  1078.     asc_dvc->carr_freelist = NULL;
  1079.     if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf)
  1080.     {
  1081.         buf_size = ADV_CARRIER_BUFSIZE;
  1082.     } else
  1083.     {
  1084.         buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
  1085.     }
  1086.     do {
  1087.         /*
  1088.          * Get physical address for the carrier 'carrp'.
  1089.          */
  1090.         contig_len = sizeof(ADV_CARR_T);
  1091.         carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL, (uchar *) carrp,
  1092.             (ADV_SDCNT *) &contig_len, ADV_IS_CARRIER_FLAG));
  1093.         buf_size -= sizeof(ADV_CARR_T);
  1094.         /*
  1095.          * If the current carrier is not physically contiguous, then
  1096.          * maybe there was a page crossing. Try the next carrier aligned
  1097.          * start address.
  1098.          */
  1099.         if (contig_len < sizeof(ADV_CARR_T))
  1100.         {
  1101.             carrp++;
  1102.             continue;
  1103.         }
  1104.         carrp->carr_pa = carr_paddr;
  1105.         carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
  1106.         /*
  1107.          * Insert the carrier at the beginning of the freelist.
  1108.          */
  1109.         carrp->next_vpa = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
  1110.         asc_dvc->carr_freelist = carrp;
  1111.         carrp++;
  1112.     }
  1113.     while (buf_size > 0);
  1114.     /*
  1115.      * Set-up the Host->RISC Initiator Command Queue (ICQ).
  1116.      */
  1117.     if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL)
  1118.     {
  1119.         asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
  1120.         return ADV_ERROR;
  1121.     }
  1122.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  1123.         ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
  1124.     /*
  1125.      * The first command issued will be placed in the stopper carrier.
  1126.      */
  1127.     asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  1128.     /*
  1129.      * Set RISC ICQ physical address start value. Initialize the
  1130.      * COMMA register to the same value otherwise the RISC will
  1131.      * prematurely detect a command is available.
  1132.      */
  1133.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
  1134.     AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
  1135.         le32_to_cpu(asc_dvc->icq_sp->carr_pa));
  1136.     /*
  1137.      * Set-up the RISC->Host Initiator Response Queue (IRQ).
  1138.      */
  1139.     if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
  1140.     {
  1141.         asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
  1142.         return ADV_ERROR;
  1143.     }
  1144.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  1145.         ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
  1146.     /*
  1147.      * The first command completed by the RISC will be placed in
  1148.      * the stopper.
  1149.      *
  1150.      * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
  1151.      * completed the RISC will set the ASC_RQ_STOPPER bit.
  1152.      */
  1153.     asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  1154.     /*
  1155.      * Set RISC IRQ physical address start value.
  1156.      */
  1157.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
  1158.     asc_dvc->carr_pending_cnt = 0;
  1159.     AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
  1160.         (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
  1161.     AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
  1162.     AdvWriteWordRegister(iop_base, IOPW_PC, word);
  1163.     /* finally, finally, gentlemen, start your engine */
  1164.     AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
  1165.     /*
  1166.      * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
  1167.      * Resets should be performed. The RISC has to be running
  1168.      * to issue a SCSI Bus Reset.
  1169.      */
  1170.     if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
  1171.     {
  1172.         /*
  1173.          * If the BIOS Signature is present in memory, restore the
  1174.          * per TID microcode operating variables.
  1175.          */
  1176.         if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
  1177.         {
  1178.             /*
  1179.              * Restore per TID negotiated values.
  1180.              */
  1181.             AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  1182.             AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  1183.             AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
  1184.             AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  1185.             for (tid = 0; tid <= ASC_MAX_TID; tid++)
  1186.             {
  1187.                 AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  1188.                     max_cmd[tid]);
  1189.             }
  1190.         } else
  1191.         {
  1192.             if (AdvResetSB(asc_dvc) != ADV_TRUE)
  1193.             {
  1194.                 warn_code = ASC_WARN_BUSRESET_ERROR;
  1195.             }
  1196.         }
  1197.     }
  1198.     return warn_code;
  1199. }
  1200. /*
  1201.  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
  1202.  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
  1203.  * all of this is done.
  1204.  *
  1205.  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
  1206.  *
  1207.  * For a non-fatal error return a warning code. If there are no warnings
  1208.  * then 0 is returned.
  1209.  *
  1210.  * Note: Chip is stopped on entry.
  1211.  */
  1212. ASC_INITFUNC(
  1213. STATIC int,
  1214. AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
  1215. )
  1216. {
  1217.     AdvPortAddr         iop_base;
  1218.     ushort              warn_code;
  1219.     ADVEEP_3550_CONFIG  eep_config;
  1220.     int                 i;
  1221.     iop_base = asc_dvc->iop_base;
  1222.     warn_code = 0;
  1223.     /*
  1224.      * Read the board's EEPROM configuration.
  1225.      *
  1226.      * Set default values if a bad checksum is found.
  1227.      */
  1228.     if (AdvGet3550EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
  1229.     {
  1230.         warn_code |= ASC_WARN_EEPROM_CHKSUM;
  1231.         /*
  1232.          * Set EEPROM default values.
  1233.          */
  1234.         for (i = 0; i < sizeof(ADVEEP_3550_CONFIG); i++)
  1235.         {
  1236.             *((uchar *) &eep_config + i) =
  1237.                 *((uchar *) &Default_3550_EEPROM_Config + i);
  1238.         }
  1239.         /*
  1240.          * Assume the 6 byte board serial number that was read
  1241.          * from EEPROM is correct even if the EEPROM checksum
  1242.          * failed.
  1243.          */
  1244.         eep_config.serial_number_word3 =
  1245.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
  1246.         eep_config.serial_number_word2 =
  1247.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
  1248.         eep_config.serial_number_word1 =
  1249.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
  1250.         AdvSet3550EEPConfig(iop_base, &eep_config);
  1251.     }
  1252.     /*
  1253.      * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
  1254.      * EEPROM configuration that was read.
  1255.      *
  1256.      * This is the mapping of EEPROM fields to Adv Library fields.
  1257.      */
  1258.     asc_dvc->wdtr_able = eep_config.wdtr_able;
  1259.     asc_dvc->sdtr_able = eep_config.sdtr_able;
  1260.     asc_dvc->ultra_able = eep_config.ultra_able;
  1261.     asc_dvc->tagqng_able = eep_config.tagqng_able;
  1262.     asc_dvc->cfg->disc_enable = eep_config.disc_enable;
  1263.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1264.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1265.     asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
  1266.     asc_dvc->start_motor = eep_config.start_motor;
  1267.     asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
  1268.     asc_dvc->bios_ctrl = eep_config.bios_ctrl;
  1269.     asc_dvc->no_scam = eep_config.scam_tolerant;
  1270.     asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
  1271.     asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
  1272.     asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
  1273.     /*
  1274.      * Set the host maximum queuing (max. 253, min. 16) and the per device
  1275.      * maximum queuing (max. 63, min. 4).
  1276.      */
  1277.     if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
  1278.     {
  1279.         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1280.     } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
  1281.     {
  1282.         /* If the value is zero, assume it is uninitialized. */
  1283.         if (eep_config.max_host_qng == 0)
  1284.         {
  1285.             eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1286.         } else
  1287.         {
  1288.             eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
  1289.         }
  1290.     }
  1291.     if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
  1292.     {
  1293.         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1294.     } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
  1295.     {
  1296.         /* If the value is zero, assume it is uninitialized. */
  1297.         if (eep_config.max_dvc_qng == 0)
  1298.         {
  1299.             eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1300.         } else
  1301.         {
  1302.             eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
  1303.         }
  1304.     }
  1305.     /*
  1306.      * If 'max_dvc_qng' is greater than 'max_host_qng', then
  1307.      * set 'max_dvc_qng' to 'max_host_qng'.
  1308.      */
  1309.     if (eep_config.max_dvc_qng > eep_config.max_host_qng)
  1310.     {
  1311.         eep_config.max_dvc_qng = eep_config.max_host_qng;
  1312.     }
  1313.     /*
  1314.      * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
  1315.      * values based on possibly adjusted EEPROM values.
  1316.      */
  1317.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1318.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1319.     /*
  1320.      * If the EEPROM 'termination' field is set to automatic (0), then set
  1321.      * the ADV_DVC_CFG 'termination' field to automatic also.
  1322.      *
  1323.      * If the termination is specified with a non-zero 'termination'
  1324.      * value check that a legal value is set and set the ADV_DVC_CFG
  1325.      * 'termination' field appropriately.
  1326.      */
  1327.     if (eep_config.termination == 0)
  1328.     {
  1329.         asc_dvc->cfg->termination = 0;    /* auto termination */
  1330.     } else
  1331.     {
  1332.         /* Enable manual control with low off / high off. */
  1333.         if (eep_config.termination == 1)
  1334.         {
  1335.             asc_dvc->cfg->termination = TERM_CTL_SEL;
  1336.         /* Enable manual control with low off / high on. */
  1337.         } else if (eep_config.termination == 2)
  1338.         {
  1339.             asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H;
  1340.         /* Enable manual control with low on / high on. */
  1341.         } else if (eep_config.termination == 3)
  1342.         {
  1343.             asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H | TERM_CTL_L;
  1344.         } else
  1345.         {
  1346.             /*
  1347.              * The EEPROM 'termination' field contains a bad value. Use
  1348.              * automatic termination instead.
  1349.              */
  1350.             asc_dvc->cfg->termination = 0;
  1351.             warn_code |= ASC_WARN_EEPROM_TERMINATION;
  1352.         }
  1353.     }
  1354.     return warn_code;
  1355. }
  1356. /*
  1357.  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
  1358.  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
  1359.  * all of this is done.
  1360.  *
  1361.  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
  1362.  *
  1363.  * For a non-fatal error return a warning code. If there are no warnings
  1364.  * then 0 is returned.
  1365.  *
  1366.  * Note: Chip is stopped on entry.
  1367.  */
  1368. ASC_INITFUNC(
  1369. STATIC int,
  1370. AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
  1371. )
  1372. {
  1373.     AdvPortAddr              iop_base;
  1374.     ushort                   warn_code;
  1375.     ADVEEP_38C0800_CONFIG    eep_config;
  1376.     int                      i;
  1377.     uchar                    tid, termination;
  1378.     ushort                   sdtr_speed = 0;
  1379.     iop_base = asc_dvc->iop_base;
  1380.     warn_code = 0;
  1381.     /*
  1382.      * Read the board's EEPROM configuration.
  1383.      *
  1384.      * Set default values if a bad checksum is found.
  1385.      */
  1386.     if (AdvGet38C0800EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
  1387.     {
  1388.         warn_code |= ASC_WARN_EEPROM_CHKSUM;
  1389.         /*
  1390.          * Set EEPROM default values.
  1391.          */
  1392.         for (i = 0; i < sizeof(ADVEEP_38C0800_CONFIG); i++)
  1393.         {
  1394.             *((uchar *) &eep_config + i) =
  1395.                 *((uchar *) &Default_38C0800_EEPROM_Config + i);
  1396.         }
  1397.         /*
  1398.          * Assume the 6 byte board serial number that was read
  1399.          * from EEPROM is correct even if the EEPROM checksum
  1400.          * failed.
  1401.          */
  1402.         eep_config.serial_number_word3 =
  1403.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
  1404.         eep_config.serial_number_word2 =
  1405.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
  1406.         eep_config.serial_number_word1 =
  1407.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
  1408.         AdvSet38C0800EEPConfig(iop_base, &eep_config);
  1409.     }
  1410.     /*
  1411.      * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
  1412.      * EEPROM configuration that was read.
  1413.      *
  1414.      * This is the mapping of EEPROM fields to Adv Library fields.
  1415.      */
  1416.     asc_dvc->wdtr_able = eep_config.wdtr_able;
  1417.     asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
  1418.     asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
  1419.     asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
  1420.     asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
  1421.     asc_dvc->tagqng_able = eep_config.tagqng_able;
  1422.     asc_dvc->cfg->disc_enable = eep_config.disc_enable;
  1423.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1424.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1425.     asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
  1426.     asc_dvc->start_motor = eep_config.start_motor;
  1427.     asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
  1428.     asc_dvc->bios_ctrl = eep_config.bios_ctrl;
  1429.     asc_dvc->no_scam = eep_config.scam_tolerant;
  1430.     asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
  1431.     asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
  1432.     asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
  1433.     /*
  1434.      * For every Target ID if any of its 'sdtr_speed[1234]' bits
  1435.      * are set, then set an 'sdtr_able' bit for it.
  1436.      */
  1437.     asc_dvc->sdtr_able = 0;
  1438.     for (tid = 0; tid <= ADV_MAX_TID; tid++)
  1439.     {
  1440.         if (tid == 0)
  1441.         {
  1442.             sdtr_speed = asc_dvc->sdtr_speed1;
  1443.         } else if (tid == 4)
  1444.         {
  1445.             sdtr_speed = asc_dvc->sdtr_speed2;
  1446.         } else if (tid == 8)
  1447.         {
  1448.             sdtr_speed = asc_dvc->sdtr_speed3;
  1449.         } else if (tid == 12)
  1450.         {
  1451.             sdtr_speed = asc_dvc->sdtr_speed4;
  1452.         }
  1453.         if (sdtr_speed & ADV_MAX_TID)
  1454.         {
  1455.             asc_dvc->sdtr_able |= (1 << tid);
  1456.         }
  1457.         sdtr_speed >>= 4;
  1458.     }
  1459.     /*
  1460.      * Set the host maximum queuing (max. 253, min. 16) and the per device
  1461.      * maximum queuing (max. 63, min. 4).
  1462.      */
  1463.     if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
  1464.     {
  1465.         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1466.     } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
  1467.     {
  1468.         /* If the value is zero, assume it is uninitialized. */
  1469.         if (eep_config.max_host_qng == 0)
  1470.         {
  1471.             eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1472.         } else
  1473.         {
  1474.             eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
  1475.         }
  1476.     }
  1477.     if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
  1478.     {
  1479.         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1480.     } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
  1481.     {
  1482.         /* If the value is zero, assume it is uninitialized. */
  1483.         if (eep_config.max_dvc_qng == 0)
  1484.         {
  1485.             eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1486.         } else
  1487.         {
  1488.             eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
  1489.         }
  1490.     }
  1491.     /*
  1492.      * If 'max_dvc_qng' is greater than 'max_host_qng', then
  1493.      * set 'max_dvc_qng' to 'max_host_qng'.
  1494.      */
  1495.     if (eep_config.max_dvc_qng > eep_config.max_host_qng)
  1496.     {
  1497.         eep_config.max_dvc_qng = eep_config.max_host_qng;
  1498.     }
  1499.     /*
  1500.      * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
  1501.      * values based on possibly adjusted EEPROM values.
  1502.      */
  1503.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1504.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1505.     /*
  1506.      * If the EEPROM 'termination' field is set to automatic (0), then set
  1507.      * the ADV_DVC_CFG 'termination' field to automatic also.
  1508.      *
  1509.      * If the termination is specified with a non-zero 'termination'
  1510.      * value check that a legal value is set and set the ADV_DVC_CFG
  1511.      * 'termination' field appropriately.
  1512.      */
  1513.     if (eep_config.termination_se == 0)
  1514.     {
  1515.         termination = 0;                         /* auto termination for SE */
  1516.     } else
  1517.     {
  1518.         /* Enable manual control with low off / high off. */
  1519.         if (eep_config.termination_se == 1)
  1520.         {
  1521.             termination = 0;
  1522.         /* Enable manual control with low off / high on. */
  1523.         } else if (eep_config.termination_se == 2)
  1524.         {
  1525.             termination = TERM_SE_HI;
  1526.         /* Enable manual control with low on / high on. */
  1527.         } else if (eep_config.termination_se == 3)
  1528.         {
  1529.             termination = TERM_SE;
  1530.         } else
  1531.         {
  1532.             /*
  1533.              * The EEPROM 'termination_se' field contains a bad value.
  1534.              * Use automatic termination instead.
  1535.              */
  1536.             termination = 0;
  1537.             warn_code |= ASC_WARN_EEPROM_TERMINATION;
  1538.         }
  1539.     }
  1540.     if (eep_config.termination_lvd == 0)
  1541.     {
  1542.         asc_dvc->cfg->termination = termination; /* auto termination for LVD */
  1543.     } else
  1544.     {
  1545.         /* Enable manual control with low off / high off. */
  1546.         if (eep_config.termination_lvd == 1)
  1547.         {
  1548.             asc_dvc->cfg->termination = termination;
  1549.         /* Enable manual control with low off / high on. */
  1550.         } else if (eep_config.termination_lvd == 2)
  1551.         {
  1552.             asc_dvc->cfg->termination = termination | TERM_LVD_HI;
  1553.         /* Enable manual control with low on / high on. */
  1554.         } else if (eep_config.termination_lvd == 3)
  1555.         {
  1556.             asc_dvc->cfg->termination =
  1557.                 termination | TERM_LVD;
  1558.         } else
  1559.         {
  1560.             /*
  1561.              * The EEPROM 'termination_lvd' field contains a bad value.
  1562.              * Use automatic termination instead.
  1563.              */
  1564.             asc_dvc->cfg->termination = termination;
  1565.             warn_code |= ASC_WARN_EEPROM_TERMINATION;
  1566.         }
  1567.     }
  1568.     return warn_code;
  1569. }
  1570. /*
  1571.  * Read the board's EEPROM configuration. Set fields in ASC_DVC_VAR and
  1572.  * ASC_DVC_CFG based on the EEPROM settings. The chip is stopped while
  1573.  * all of this is done.
  1574.  *
  1575.  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
  1576.  *
  1577.  * For a non-fatal error return a warning code. If there are no warnings
  1578.  * then 0 is returned.
  1579.  *
  1580.  * Note: Chip is stopped on entry.
  1581.  */
  1582. ASC_INITFUNC(
  1583. STATIC int,
  1584. AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
  1585. )
  1586. {
  1587.     AdvPortAddr              iop_base;
  1588.     ushort                   warn_code;
  1589.     ADVEEP_38C1600_CONFIG    eep_config;
  1590.     int                      i;
  1591.     uchar                    tid, termination;
  1592.     ushort                   sdtr_speed = 0;
  1593.     iop_base = asc_dvc->iop_base;
  1594.     warn_code = 0;
  1595.     /*
  1596.      * Read the board's EEPROM configuration.
  1597.      *
  1598.      * Set default values if a bad checksum is found.
  1599.      */
  1600.     if (AdvGet38C1600EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
  1601.     {
  1602.         warn_code |= ASC_WARN_EEPROM_CHKSUM;
  1603.         /*
  1604.          * Set EEPROM default values.
  1605.          */
  1606.         for (i = 0; i < sizeof(ADVEEP_38C1600_CONFIG); i++)
  1607.         {
  1608.             if (i == 1 && ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) != 0)
  1609.             {
  1610.                 /*
  1611.                  * Set Function 1 EEPROM Word 0 MSB
  1612.                  *
  1613.                  * Clear the BIOS_ENABLE (bit 14) and INTAB (bit 11)
  1614.                  * EEPROM bits.
  1615.                  *
  1616.                  * Disable Bit 14 (BIOS_ENABLE) to fix SPARC Ultra 60 and
  1617.                  * old Mac system booting problem. The Expansion ROM must
  1618.                  * be disabled in Function 1 for these systems.
  1619.                  *
  1620.                  */
  1621.                 *((uchar *) &eep_config + i) =
  1622.                 ((*((uchar *) &Default_38C1600_EEPROM_Config + i)) &
  1623.                     (~(((ADV_EEPROM_BIOS_ENABLE | ADV_EEPROM_INTAB) >> 8) &
  1624.                      0xFF)));
  1625.                 /*
  1626.                  * Set the INTAB (bit 11) if the GPIO 0 input indicates
  1627.                  * the Function 1 interrupt line is wired to INTA.
  1628.                  *
  1629.                  * Set/Clear Bit 11 (INTAB) from the GPIO bit 0 input:
  1630.                  *   1 - Function 1 interrupt line wired to INT A.
  1631.                  *   0 - Function 1 interrupt line wired to INT B.
  1632.                  *
  1633.                  * Note: Adapter boards always have Function 0 wired to INTA.
  1634.                  * Put all 5 GPIO bits in input mode and then read
  1635.                  * their input values.
  1636.                  */
  1637.                 AdvWriteByteRegister(iop_base, IOPB_GPIO_CNTL, 0);
  1638.                 if (AdvReadByteRegister(iop_base, IOPB_GPIO_DATA) & 0x01)
  1639.                 {
  1640.                     /* Function 1 interrupt wired to INTA; Set EEPROM bit. */
  1641.                 *((uchar *) &eep_config + i) |=
  1642.                     ((ADV_EEPROM_INTAB >> 8) & 0xFF);
  1643.                 }
  1644.             }
  1645.             else
  1646.             {
  1647.                 *((uchar *) &eep_config + i) =
  1648.                 *((uchar *) &Default_38C1600_EEPROM_Config + i);
  1649.             }
  1650.         }
  1651.         /*
  1652.          * Assume the 6 byte board serial number that was read
  1653.          * from EEPROM is correct even if the EEPROM checksum
  1654.          * failed.
  1655.          */
  1656.         eep_config.serial_number_word3 =
  1657.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
  1658.         eep_config.serial_number_word2 =
  1659.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
  1660.         eep_config.serial_number_word1 =
  1661.             AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
  1662.         AdvSet38C1600EEPConfig(iop_base, &eep_config);
  1663.     }
  1664.     /*
  1665.      * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
  1666.      * EEPROM configuration that was read.
  1667.      *
  1668.      * This is the mapping of EEPROM fields to Adv Library fields.
  1669.      */
  1670.     asc_dvc->wdtr_able = eep_config.wdtr_able;
  1671.     asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
  1672.     asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
  1673.     asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
  1674.     asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
  1675.     asc_dvc->ppr_able = 0;
  1676.     asc_dvc->tagqng_able = eep_config.tagqng_able;
  1677.     asc_dvc->cfg->disc_enable = eep_config.disc_enable;
  1678.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1679.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1680.     asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID);
  1681.     asc_dvc->start_motor = eep_config.start_motor;
  1682.     asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
  1683.     asc_dvc->bios_ctrl = eep_config.bios_ctrl;
  1684.     asc_dvc->no_scam = eep_config.scam_tolerant;
  1685.     /*
  1686.      * For every Target ID if any of its 'sdtr_speed[1234]' bits
  1687.      * are set, then set an 'sdtr_able' bit for it.
  1688.      */
  1689.     asc_dvc->sdtr_able = 0;
  1690.     for (tid = 0; tid <= ASC_MAX_TID; tid++)
  1691.     {
  1692.         if (tid == 0)
  1693.         {
  1694.             sdtr_speed = asc_dvc->sdtr_speed1;
  1695.         } else if (tid == 4)
  1696.         {
  1697.             sdtr_speed = asc_dvc->sdtr_speed2;
  1698.         } else if (tid == 8)
  1699.         {
  1700.             sdtr_speed = asc_dvc->sdtr_speed3;
  1701.         } else if (tid == 12)
  1702.         {
  1703.             sdtr_speed = asc_dvc->sdtr_speed4;
  1704.         }
  1705.         if (sdtr_speed & ASC_MAX_TID)
  1706.         {
  1707.             asc_dvc->sdtr_able |= (1 << tid);
  1708.         }
  1709.         sdtr_speed >>= 4;
  1710.     }
  1711.     /*
  1712.      * Set the host maximum queuing (max. 253, min. 16) and the per device
  1713.      * maximum queuing (max. 63, min. 4).
  1714.      */
  1715.     if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
  1716.     {
  1717.         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1718.     } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
  1719.     {
  1720.         /* If the value is zero, assume it is uninitialized. */
  1721.         if (eep_config.max_host_qng == 0)
  1722.         {
  1723.             eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
  1724.         } else
  1725.         {
  1726.             eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
  1727.         }
  1728.     }
  1729.     if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
  1730.     {
  1731.         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1732.     } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
  1733.     {
  1734.         /* If the value is zero, assume it is uninitialized. */
  1735.         if (eep_config.max_dvc_qng == 0)
  1736.         {
  1737.             eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
  1738.         } else
  1739.         {
  1740.             eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
  1741.         }
  1742.     }
  1743.     /*
  1744.      * If 'max_dvc_qng' is greater than 'max_host_qng', then
  1745.      * set 'max_dvc_qng' to 'max_host_qng'.
  1746.      */
  1747.     if (eep_config.max_dvc_qng > eep_config.max_host_qng)
  1748.     {
  1749.         eep_config.max_dvc_qng = eep_config.max_host_qng;
  1750.     }
  1751.     /*
  1752.      * Set ASC_DVC_VAR 'max_host_qng' and ASC_DVC_VAR 'max_dvc_qng'
  1753.      * values based on possibly adjusted EEPROM values.
  1754.      */
  1755.     asc_dvc->max_host_qng = eep_config.max_host_qng;
  1756.     asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
  1757.     /*
  1758.      * If the EEPROM 'termination' field is set to automatic (0), then set
  1759.      * the ASC_DVC_CFG 'termination' field to automatic also.
  1760.      *
  1761.      * If the termination is specified with a non-zero 'termination'
  1762.      * value check that a legal value is set and set the ASC_DVC_CFG
  1763.      * 'termination' field appropriately.
  1764.      */
  1765.     if (eep_config.termination_se == 0)
  1766.     {
  1767.         termination = 0;                         /* auto termination for SE */
  1768.     } else
  1769.     {
  1770.         /* Enable manual control with low off / high off. */
  1771.         if (eep_config.termination_se == 1)
  1772.         {
  1773.             termination = 0;
  1774.         /* Enable manual control with low off / high on. */
  1775.         } else if (eep_config.termination_se == 2)
  1776.         {
  1777.             termination = TERM_SE_HI;
  1778.         /* Enable manual control with low on / high on. */
  1779.         } else if (eep_config.termination_se == 3)
  1780.         {
  1781.             termination = TERM_SE;
  1782.         } else
  1783.         {
  1784.             /*
  1785.              * The EEPROM 'termination_se' field contains a bad value.
  1786.              * Use automatic termination instead.
  1787.              */
  1788.             termination = 0;
  1789.             warn_code |= ASC_WARN_EEPROM_TERMINATION;
  1790.         }
  1791.     }
  1792.     if (eep_config.termination_lvd == 0)
  1793.     {
  1794.         asc_dvc->cfg->termination = termination; /* auto termination for LVD */
  1795.     } else
  1796.     {
  1797.         /* Enable manual control with low off / high off. */
  1798.         if (eep_config.termination_lvd == 1)
  1799.         {
  1800.             asc_dvc->cfg->termination = termination;
  1801.         /* Enable manual control with low off / high on. */
  1802.         } else if (eep_config.termination_lvd == 2)
  1803.         {
  1804.             asc_dvc->cfg->termination = termination | TERM_LVD_HI;
  1805.         /* Enable manual control with low on / high on. */
  1806.         } else if (eep_config.termination_lvd == 3)
  1807.         {
  1808.             asc_dvc->cfg->termination =
  1809.                 termination | TERM_LVD;
  1810.         } else
  1811.         {
  1812.             /*
  1813.              * The EEPROM 'termination_lvd' field contains a bad value.
  1814.              * Use automatic termination instead.
  1815.              */
  1816.             asc_dvc->cfg->termination = termination;
  1817.             warn_code |= ASC_WARN_EEPROM_TERMINATION;
  1818.         }
  1819.     }
  1820.     return warn_code;
  1821. }
  1822. /*
  1823.  * Read EEPROM configuration into the specified buffer.
  1824.  *
  1825.  * Return a checksum based on the EEPROM configuration read.
  1826.  */
  1827. ASC_INITFUNC(
  1828. STATIC ushort,
  1829. AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
  1830. )
  1831. {
  1832.     ushort              wval, chksum;
  1833.     ushort              *wbuf;
  1834.     int                 eep_addr;
  1835.     ushort              *charfields;
  1836.     charfields = (ushort *) &ADVEEP_3550_Config_Field_IsChar;
  1837.     wbuf = (ushort *) cfg_buf;
  1838.     chksum = 0;
  1839.     for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
  1840.          eep_addr < ADV_EEP_DVC_CFG_END;
  1841.          eep_addr++, wbuf++)
  1842.     {
  1843.         wval = AdvReadEEPWord(iop_base, eep_addr);
  1844.         chksum += wval; /* Checksum is calculated from word values. */
  1845.         if (*charfields++) {
  1846.             *wbuf = le16_to_cpu(wval);
  1847.         } else {
  1848.             *wbuf = wval;
  1849.         }
  1850.     }
  1851.     /* Read checksum word. */
  1852.     *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1853.     wbuf++; charfields++;
  1854.     /* Read rest of EEPROM not covered by the checksum. */
  1855.     for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
  1856.          eep_addr < ADV_EEP_MAX_WORD_ADDR;
  1857.          eep_addr++, wbuf++)
  1858.     {
  1859.         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1860.         if (*charfields++) {
  1861.             *wbuf = le16_to_cpu(*wbuf);
  1862.         }
  1863.     }
  1864.     return chksum;
  1865. }
  1866. /*
  1867.  * Read EEPROM configuration into the specified buffer.
  1868.  *
  1869.  * Return a checksum based on the EEPROM configuration read.
  1870.  */
  1871. ASC_INITFUNC(
  1872. STATIC ushort,
  1873. AdvGet38C0800EEPConfig(AdvPortAddr iop_base,
  1874.                        ADVEEP_38C0800_CONFIG *cfg_buf)
  1875. )
  1876. {
  1877.     ushort              wval, chksum;
  1878.     ushort              *wbuf;
  1879.     int                 eep_addr;
  1880.     ushort              *charfields;
  1881.     charfields = (ushort *) &ADVEEP_38C0800_Config_Field_IsChar;
  1882.     wbuf = (ushort *) cfg_buf;
  1883.     chksum = 0;
  1884.     for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
  1885.          eep_addr < ADV_EEP_DVC_CFG_END;
  1886.          eep_addr++, wbuf++)
  1887.     {
  1888.         wval = AdvReadEEPWord(iop_base, eep_addr);
  1889.         chksum += wval; /* Checksum is calculated from word values. */
  1890.         if (*charfields++) {
  1891.             *wbuf = le16_to_cpu(wval);
  1892.         } else {
  1893.             *wbuf = wval;
  1894.         }
  1895.     }
  1896.     /* Read checksum word. */
  1897.     *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1898.     wbuf++; charfields++;
  1899.     /* Read rest of EEPROM not covered by the checksum. */
  1900.     for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
  1901.          eep_addr < ADV_EEP_MAX_WORD_ADDR;
  1902.          eep_addr++, wbuf++)
  1903.     {
  1904.         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1905.         if (*charfields++) {
  1906.             *wbuf = le16_to_cpu(*wbuf);
  1907.         }
  1908.     }
  1909.     return chksum;
  1910. }
  1911. /*
  1912.  * Read EEPROM configuration into the specified buffer.
  1913.  *
  1914.  * Return a checksum based on the EEPROM configuration read.
  1915.  */
  1916. ASC_INITFUNC(
  1917. STATIC ushort,
  1918. AdvGet38C1600EEPConfig(AdvPortAddr iop_base,
  1919.                        ADVEEP_38C1600_CONFIG *cfg_buf)
  1920. )
  1921. {
  1922.     ushort              wval, chksum;
  1923.     ushort              *wbuf;
  1924.     int                 eep_addr;
  1925.     ushort              *charfields;
  1926.     charfields = (ushort*) &ADVEEP_38C1600_Config_Field_IsChar;
  1927.     wbuf = (ushort *) cfg_buf;
  1928.     chksum = 0;
  1929.     for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
  1930.          eep_addr < ADV_EEP_DVC_CFG_END;
  1931.          eep_addr++, wbuf++)
  1932.     {
  1933.         wval = AdvReadEEPWord(iop_base, eep_addr);
  1934.         chksum += wval; /* Checksum is calculated from word values. */
  1935.         if (*charfields++) {
  1936.             *wbuf = le16_to_cpu(wval);
  1937.         } else {
  1938.             *wbuf = wval;
  1939.         }
  1940.     }
  1941.     /* Read checksum word. */
  1942.     *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1943.     wbuf++; charfields++;
  1944.     /* Read rest of EEPROM not covered by the checksum. */
  1945.     for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
  1946.          eep_addr < ADV_EEP_MAX_WORD_ADDR;
  1947.          eep_addr++, wbuf++)
  1948.     {
  1949.         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
  1950.         if (*charfields++) {
  1951.             *wbuf = le16_to_cpu(*wbuf);
  1952.         }
  1953.     }
  1954.     return chksum;
  1955. }
  1956. /*
  1957.  * Read the EEPROM from specified location
  1958.  */
  1959. ASC_INITFUNC(
  1960. STATIC ushort,
  1961. AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
  1962. )
  1963. {
  1964.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
  1965.         ASC_EEP_CMD_READ | eep_word_addr);
  1966.     AdvWaitEEPCmd(iop_base);
  1967.     return AdvReadWordRegister(iop_base, IOPW_EE_DATA);
  1968. }
  1969. /*
  1970.  * Wait for EEPROM command to complete
  1971.  */
  1972. ASC_INITFUNC(
  1973. STATIC void,
  1974. AdvWaitEEPCmd(AdvPortAddr iop_base)
  1975. )
  1976. {
  1977.     int eep_delay_ms;
  1978.     for (eep_delay_ms = 0; eep_delay_ms < ADV_EEP_DELAY_MS; eep_delay_ms++)
  1979.     {
  1980.         if (AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE)
  1981.         {
  1982.             break;
  1983.         }
  1984.         DvcSleepMilliSecond(1);
  1985.     }
  1986.     if ((AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE) == 0)
  1987.     {
  1988.         ASC_ASSERT(0);
  1989.     }
  1990.     return;
  1991. }
  1992. /*
  1993.  * Write the EEPROM from 'cfg_buf'.
  1994.  */
  1995. void
  1996. AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
  1997. {
  1998.     ushort *wbuf;
  1999.     ushort addr, chksum;
  2000.     ushort *charfields;
  2001.     wbuf = (ushort *) cfg_buf;
  2002.     charfields = (ushort *) &ADVEEP_3550_Config_Field_IsChar;
  2003.     chksum = 0;
  2004.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
  2005.     AdvWaitEEPCmd(iop_base);
  2006.     /*
  2007.      * Write EEPROM from word 0 to word 20.
  2008.      */
  2009.     for (addr = ADV_EEP_DVC_CFG_BEGIN;
  2010.          addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
  2011.     {
  2012.         ushort word;
  2013.         if (*charfields++) {
  2014.             word = cpu_to_le16(*wbuf);
  2015.         } else {
  2016.             word = *wbuf;
  2017.         }
  2018.         chksum += *wbuf; /* Checksum is calculated from word values. */
  2019.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2020.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2021.         AdvWaitEEPCmd(iop_base);
  2022.         DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
  2023.     }
  2024.     /*
  2025.      * Write EEPROM checksum at word 21.
  2026.      */
  2027.     AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
  2028.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2029.     AdvWaitEEPCmd(iop_base);
  2030.     wbuf++; charfields++;
  2031.     /*
  2032.      * Write EEPROM OEM name at words 22 to 29.
  2033.      */
  2034.     for (addr = ADV_EEP_DVC_CTL_BEGIN;
  2035.          addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
  2036.     {
  2037.         ushort word;
  2038.         if (*charfields++) {
  2039.             word = cpu_to_le16(*wbuf);
  2040.         } else {
  2041.             word = *wbuf;
  2042.         }
  2043.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2044.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2045.         AdvWaitEEPCmd(iop_base);
  2046.     }
  2047.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
  2048.     AdvWaitEEPCmd(iop_base);
  2049.     return;
  2050. }
  2051. /*
  2052.  * Write the EEPROM from 'cfg_buf'.
  2053.  */
  2054. void
  2055. AdvSet38C0800EEPConfig(AdvPortAddr iop_base,
  2056.                        ADVEEP_38C0800_CONFIG *cfg_buf)
  2057. {
  2058.     ushort *wbuf;
  2059.     ushort *charfields;
  2060.     ushort addr, chksum;
  2061.     wbuf = (ushort *) cfg_buf;
  2062.     charfields = (ushort *) &ADVEEP_38C0800_Config_Field_IsChar;
  2063.     chksum = 0;
  2064.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
  2065.     AdvWaitEEPCmd(iop_base);
  2066.     /*
  2067.      * Write EEPROM from word 0 to word 20.
  2068.      */
  2069.     for (addr = ADV_EEP_DVC_CFG_BEGIN;
  2070.          addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
  2071.     {
  2072.         ushort word;
  2073.         if (*charfields++) {
  2074.             word = cpu_to_le16(*wbuf);
  2075.         } else {
  2076.             word = *wbuf;
  2077.         }
  2078.         chksum += *wbuf; /* Checksum is calculated from word values. */
  2079.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2080.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2081.         AdvWaitEEPCmd(iop_base);
  2082.         DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
  2083.     }
  2084.     /*
  2085.      * Write EEPROM checksum at word 21.
  2086.      */
  2087.     AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
  2088.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2089.     AdvWaitEEPCmd(iop_base);
  2090.     wbuf++; charfields++;
  2091.     /*
  2092.      * Write EEPROM OEM name at words 22 to 29.
  2093.      */
  2094.     for (addr = ADV_EEP_DVC_CTL_BEGIN;
  2095.          addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
  2096.     {
  2097.         ushort word;
  2098.         if (*charfields++) {
  2099.             word = cpu_to_le16(*wbuf);
  2100.         } else {
  2101.             word = *wbuf;
  2102.         }
  2103.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2104.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2105.         AdvWaitEEPCmd(iop_base);
  2106.     }
  2107.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
  2108.     AdvWaitEEPCmd(iop_base);
  2109.     return;
  2110. }
  2111. /*
  2112.  * Write the EEPROM from 'cfg_buf'.
  2113.  */
  2114. void
  2115. AdvSet38C1600EEPConfig(AdvPortAddr iop_base,
  2116.                        ADVEEP_38C1600_CONFIG *cfg_buf)
  2117. {
  2118.     ushort              *wbuf;
  2119.     ushort              *charfields;
  2120.     ushort              addr, chksum;
  2121.     wbuf = (ushort *) cfg_buf;
  2122.     charfields = (ushort *) &ADVEEP_38C1600_Config_Field_IsChar;
  2123.     chksum = 0;
  2124.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
  2125.     AdvWaitEEPCmd(iop_base);
  2126.     /*
  2127.      * Write EEPROM from word 0 to word 20.
  2128.      */
  2129.     for (addr = ADV_EEP_DVC_CFG_BEGIN;
  2130.          addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
  2131.     {
  2132.         ushort word;
  2133.         if (*charfields++) {
  2134.             word = cpu_to_le16(*wbuf);
  2135.         } else {
  2136.             word = *wbuf;
  2137.         }
  2138.         chksum += *wbuf; /* Checksum is calculated from word values. */
  2139.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2140.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2141.         AdvWaitEEPCmd(iop_base);
  2142.         DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
  2143.     }
  2144.     /*
  2145.      * Write EEPROM checksum at word 21.
  2146.      */
  2147.     AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
  2148.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2149.     AdvWaitEEPCmd(iop_base);
  2150.     wbuf++; charfields++;
  2151.     /*
  2152.      * Write EEPROM OEM name at words 22 to 29.
  2153.      */
  2154.     for (addr = ADV_EEP_DVC_CTL_BEGIN;
  2155.          addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
  2156.     {
  2157.         ushort word;
  2158.         if (*charfields++) {
  2159.             word = cpu_to_le16(*wbuf);
  2160.         } else {
  2161.             word = *wbuf;
  2162.         }
  2163.         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
  2164.         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
  2165.         AdvWaitEEPCmd(iop_base);
  2166.     }
  2167.     AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
  2168.     AdvWaitEEPCmd(iop_base);
  2169.     return;
  2170. }
  2171. /* a_advlib.c */
  2172. /*
  2173.  * AdvExeScsiQueue() - Send a request to the RISC microcode program.
  2174.  *
  2175.  *   Allocate a carrier structure, point the carrier to the ADV_SCSI_REQ_Q,
  2176.  *   add the carrier to the ICQ (Initiator Command Queue), and tickle the
  2177.  *   RISC to notify it a new command is ready to be executed.
  2178.  *
  2179.  * If 'done_status' is not set to QD_DO_RETRY, then 'error_retry' will be
  2180.  * set to SCSI_MAX_RETRY.
  2181.  *
  2182.  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the microcode
  2183.  * for DMA addresses or math operations are byte swapped to little-endian
  2184.  * order.
  2185.  *
  2186.  * Return:
  2187.  *      ADV_SUCCESS(1) - The request was successfully queued.
  2188.  *      ADV_BUSY(0) -    Resource unavailable; Retry again after pending
  2189.  *                       request completes.
  2190.  *      ADV_ERROR(-1) -  Invalid ADV_SCSI_REQ_Q request structure
  2191.  *                       host IC error.
  2192.  */
  2193. STATIC int
  2194. AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc,
  2195.                 ADV_SCSI_REQ_Q *scsiq)
  2196. {
  2197.     ulong                  last_int_level;
  2198.     AdvPortAddr            iop_base;
  2199.     ADV_DCNT               req_size;
  2200.     ADV_PADDR              req_paddr;
  2201.     ADV_CARR_T             *new_carrp;
  2202.     ASC_ASSERT(scsiq != NULL); /* 'scsiq' should never be NULL. */
  2203.     /*
  2204.      * The ADV_SCSI_REQ_Q 'target_id' field should never exceed ADV_MAX_TID.
  2205.      */
  2206.     if (scsiq->target_id > ADV_MAX_TID)
  2207.     {
  2208.         scsiq->host_status = QHSTA_M_INVALID_DEVICE;
  2209.         scsiq->done_status = QD_WITH_ERROR;
  2210.         return ADV_ERROR;
  2211.     }
  2212.     iop_base = asc_dvc->iop_base;
  2213.     last_int_level = DvcEnterCritical();
  2214.     /*
  2215.      * Allocate a carrier ensuring at least one carrier always
  2216.      * remains on the freelist and initialize fields.
  2217.      */
  2218.     if ((new_carrp = asc_dvc->carr_freelist) == NULL)
  2219.     {
  2220.        DvcLeaveCritical(last_int_level);
  2221.        return ADV_BUSY;
  2222.     }
  2223.     asc_dvc->carr_freelist = (ADV_CARR_T *)
  2224.         ADV_U32_TO_VADDR(le32_to_cpu(new_carrp->next_vpa));
  2225.     asc_dvc->carr_pending_cnt++;
  2226.     /*
  2227.      * Set the carrier to be a stopper by setting 'next_vpa'
  2228.      * to the stopper value. The current stopper will be changed
  2229.      * below to point to the new stopper.
  2230.      */
  2231.     new_carrp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
  2232.     /*
  2233.      * Clear the ADV_SCSI_REQ_Q done flag.
  2234.      */
  2235.     scsiq->a_flag &= ~ADV_SCSIQ_DONE;
  2236.     req_size = sizeof(ADV_SCSI_REQ_Q);
  2237.     req_paddr = DvcGetPhyAddr(asc_dvc, scsiq, (uchar *) scsiq,
  2238.         (ADV_SDCNT *) &req_size, ADV_IS_SCSIQ_FLAG);
  2239.     ASC_ASSERT(ADV_32BALIGN(req_paddr) == req_paddr);
  2240.     ASC_ASSERT(req_size >= sizeof(ADV_SCSI_REQ_Q));
  2241.     /* Wait for assertion before making little-endian */
  2242.     req_paddr = cpu_to_le32(req_paddr);
  2243.     /* Save virtual and physical address of ADV_SCSI_REQ_Q and carrier. */
  2244.     scsiq->scsiq_ptr = cpu_to_le32(ADV_VADDR_TO_U32(scsiq));
  2245.     scsiq->scsiq_rptr = req_paddr;
  2246.     scsiq->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->icq_sp));
  2247.     /*
  2248.      * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
  2249.      * order during initialization.
  2250.      */
  2251.     scsiq->carr_pa = asc_dvc->icq_sp->carr_pa;
  2252.    /*
  2253.     * Use the current stopper to send the ADV_SCSI_REQ_Q command to
  2254.     * the microcode. The newly allocated stopper will become the new
  2255.     * stopper.
  2256.     */
  2257.     asc_dvc->icq_sp->areq_vpa = req_paddr;
  2258.     /*
  2259.      * Set the 'next_vpa' pointer for the old stopper to be the
  2260.      * physical address of the new stopper. The RISC can only
  2261.      * follow physical addresses.
  2262.      */
  2263.     asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa;
  2264.     /*
  2265.      * Set the host adapter stopper pointer to point to the new carrier.
  2266.      */
  2267.     asc_dvc->icq_sp = new_carrp;
  2268.     if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
  2269.         asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
  2270.     {
  2271.         /*
  2272.          * Tickle the RISC to tell it to read its Command Queue Head pointer.
  2273.          */
  2274.         AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
  2275.         if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
  2276.         {
  2277.             /*
  2278.              * Clear the tickle value. In the ASC-3550 the RISC flag
  2279.              * command 'clr_tickle_a' does not work unless the host
  2280.              * value is cleared.
  2281.              */
  2282.             AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
  2283.         }
  2284.     } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
  2285.     {
  2286.         /*
  2287.          * Notify the RISC a carrier is ready by writing the physical
  2288.          * address of the new carrier stopper to the COMMA register.
  2289.          */
  2290.         AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
  2291.                 le32_to_cpu(new_carrp->carr_pa));
  2292.     }
  2293.     DvcLeaveCritical(last_int_level);
  2294.     return ADV_SUCCESS;
  2295. }
  2296. /*
  2297.  * Reset SCSI Bus and purge all outstanding requests.
  2298.  *
  2299.  * Return Value:
  2300.  *      ADV_TRUE(1) -   All requests are purged and SCSI Bus is reset.
  2301.  *      ADV_FALSE(0) -  Microcode command failed.
  2302.  *      ADV_ERROR(-1) - Microcode command timed-out. Microcode or IC
  2303.  *                      may be hung which requires driver recovery.
  2304.  */
  2305. STATIC int
  2306. AdvResetSB(ADV_DVC_VAR *asc_dvc)
  2307. {
  2308.     int         status;
  2309.     /*
  2310.      * Send the SCSI Bus Reset idle start idle command which asserts
  2311.      * the SCSI Bus Reset signal.
  2312.      */
  2313.     status = AdvSendIdleCmd(asc_dvc, (ushort) IDLE_CMD_SCSI_RESET_START, 0L);
  2314.     if (status != ADV_TRUE)
  2315.     {
  2316.         return status;
  2317.     }
  2318.     /*
  2319.      * Delay for the specified SCSI Bus Reset hold time.
  2320.      *
  2321.      * The hold time delay is done on the host because the RISC has no
  2322.      * microsecond accurate timer.
  2323.      */
  2324.     DvcDelayMicroSecond(asc_dvc, (ushort) ASC_SCSI_RESET_HOLD_TIME_US);
  2325.     /*
  2326.      * Send the SCSI Bus Reset end idle command which de-asserts
  2327.      * the SCSI Bus Reset signal and purges any pending requests.
  2328.      */
  2329.     status = AdvSendIdleCmd(asc_dvc, (ushort) IDLE_CMD_SCSI_RESET_END, 0L);
  2330.     if (status != ADV_TRUE)
  2331.     {
  2332.         return status;
  2333.     }
  2334.     DvcSleepMilliSecond((ADV_DCNT) asc_dvc->scsi_reset_wait * 1000);
  2335.     return status;
  2336. }
  2337. /*
  2338.  * Reset chip and SCSI Bus.
  2339.  *
  2340.  * Return Value:
  2341.  *      ADV_TRUE(1) -   Chip re-initialization and SCSI Bus Reset successful.
  2342.  *      ADV_FALSE(0) -  Chip re-initialization and SCSI Bus Reset failure.
  2343.  */
  2344. STATIC int
  2345. AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
  2346. {
  2347.     int         status;
  2348.     ushort      wdtr_able, sdtr_able, tagqng_able;
  2349.     ushort      ppr_able = 0;
  2350.     uchar       tid, max_cmd[ADV_MAX_TID + 1];
  2351.     AdvPortAddr iop_base;
  2352.     ushort      bios_sig;
  2353.     iop_base = asc_dvc->iop_base;
  2354.     /*
  2355.      * Save current per TID negotiated values.
  2356.      */
  2357.     AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  2358.     AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  2359.     if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
  2360.     {
  2361.         AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
  2362.     }
  2363.     AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  2364.     for (tid = 0; tid <= ADV_MAX_TID; tid++)
  2365.     {
  2366.         AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  2367.             max_cmd[tid]);
  2368.     }
  2369.     /*
  2370.      * Force the AdvInitAsc3550/38C0800Driver() function to
  2371.      * perform a SCSI Bus Reset by clearing the BIOS signature word.
  2372.      * The initialization functions assumes a SCSI Bus Reset is not
  2373.      * needed if the BIOS signature word is present.
  2374.      */
  2375.     AdvReadWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
  2376.     AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, 0);
  2377.     /*
  2378.      * Stop chip and reset it.
  2379.      */
  2380.     AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_STOP);
  2381.     AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_RESET);
  2382.     DvcSleepMilliSecond(100);
  2383.     AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_WR_IO_REG);
  2384.     /*
  2385.      * Reset Adv Library error code, if any, and try
  2386.      * re-initializing the chip.
  2387.      */
  2388.     asc_dvc->err_code = 0;
  2389.     if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
  2390.     {
  2391.         status = AdvInitAsc38C1600Driver(asc_dvc);
  2392.     }
  2393.     else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
  2394.     {
  2395.         status = AdvInitAsc38C0800Driver(asc_dvc);
  2396.     } else
  2397.     {
  2398.         status = AdvInitAsc3550Driver(asc_dvc);
  2399.     }
  2400.     /* Translate initialization return value to status value. */
  2401.     if (status == 0)
  2402.     {
  2403.         status = ADV_TRUE;
  2404.     } else
  2405.     {
  2406.         status = ADV_FALSE;
  2407.     }
  2408.     /*
  2409.      * Restore the BIOS signature word.
  2410.      */
  2411.     AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
  2412.     /*
  2413.      * Restore per TID negotiated values.
  2414.      */
  2415.     AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
  2416.     AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
  2417.     if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
  2418.     {
  2419.         AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
  2420.     }
  2421.     AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
  2422.     for (tid = 0; tid <= ADV_MAX_TID; tid++)
  2423.     {
  2424.         AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  2425.             max_cmd[tid]);
  2426.     }
  2427.     return status;
  2428. }
  2429. /*
  2430.  * Adv Library Interrupt Service Routine
  2431.  *
  2432.  *  This function is called by a driver's interrupt service routine.
  2433.  *  The function disables and re-enables interrupts.
  2434.  *
  2435.  *  When a microcode idle command is completed, the ADV_DVC_VAR
  2436.  *  'idle_cmd_done' field is set to ADV_TRUE.
  2437.  *
  2438.  *  Note: AdvISR() can be called when interrupts are disabled or even
  2439.  *  when there is no hardware interrupt condition present. It will
  2440.  *  always check for completed idle commands and microcode requests.
  2441.  *  This is an important feature that shouldn't be changed because it
  2442.  *  allows commands to be completed from polling mode loops.
  2443.  *
  2444.  * Return:
  2445.  *   ADV_TRUE(1) - interrupt was pending
  2446.  *   ADV_FALSE(0) - no interrupt was pending
  2447.  */
  2448. STATIC int
  2449. AdvISR(ADV_DVC_VAR *asc_dvc)
  2450. {
  2451.     AdvPortAddr                 iop_base;
  2452.     uchar                       int_stat;
  2453.     ushort                      target_bit;
  2454.     ADV_CARR_T                  *free_carrp;
  2455.     ADV_VADDR                   irq_next_vpa;
  2456.     int                         flags;
  2457.     ADV_SCSI_REQ_Q              *scsiq;
  2458.     flags = DvcEnterCritical();
  2459.     iop_base = asc_dvc->iop_base;
  2460.     /* Reading the register clears the interrupt. */
  2461.     int_stat = AdvReadByteRegister(iop_base, IOPB_INTR_STATUS_REG);
  2462.     if ((int_stat & (ADV_INTR_STATUS_INTRA | ADV_INTR_STATUS_INTRB |
  2463.          ADV_INTR_STATUS_INTRC)) == 0)
  2464.     {
  2465.         DvcLeaveCritical(flags);
  2466.         return ADV_FALSE;
  2467.     }
  2468.     /*
  2469.      * Notify the driver of an asynchronous microcode condition by
  2470.      * calling the ADV_DVC_VAR.async_callback function. The function
  2471.      * is passed the microcode ASC_MC_INTRB_CODE byte value.
  2472.      */
  2473.     if (int_stat & ADV_INTR_STATUS_INTRB)
  2474.     {
  2475.         uchar intrb_code;
  2476.         AdvReadByteLram(iop_base, ASC_MC_INTRB_CODE, intrb_code);
  2477.         if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
  2478.             asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
  2479.         {
  2480.             if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
  2481.                 asc_dvc->carr_pending_cnt != 0)
  2482.             {
  2483.                 AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
  2484.                 if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
  2485.                 {
  2486.                     AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
  2487.                 }
  2488.             }
  2489.         }
  2490.         if (asc_dvc->async_callback != 0)
  2491.         {
  2492.             (*asc_dvc->async_callback)(asc_dvc, intrb_code);
  2493.         }
  2494.     }
  2495.     /*
  2496.      * Check if the IRQ stopper carrier contains a completed request.
  2497.      */
  2498.     while (((irq_next_vpa =
  2499.              le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ASC_RQ_DONE) != 0)
  2500.     {
  2501.         /*
  2502.          * Get a pointer to the newly completed ADV_SCSI_REQ_Q structure.
  2503.          * The RISC will have set 'areq_vpa' to a virtual address.
  2504.          *
  2505.          * The firmware will have copied the ASC_SCSI_REQ_Q.scsiq_ptr
  2506.          * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
  2507.          * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
  2508.          * in AdvExeScsiQueue().
  2509.          */
  2510.         scsiq = (ADV_SCSI_REQ_Q *)
  2511.             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->areq_vpa));
  2512.         /*
  2513.          * Request finished with good status and the queue was not
  2514.          * DMAed to host memory by the firmware. Set all status fields
  2515.          * to indicate good status.
  2516.          */
  2517.         if ((irq_next_vpa & ASC_RQ_GOOD) != 0)
  2518.         {
  2519.             scsiq->done_status = QD_NO_ERROR;
  2520.             scsiq->host_status = scsiq->scsi_status = 0;
  2521.             scsiq->data_cnt = 0L;
  2522.         }
  2523.         /*
  2524.          * Advance the stopper pointer to the next carrier
  2525.          * ignoring the lower four bits. Free the previous
  2526.          * stopper carrier.
  2527.          */
  2528.         free_carrp = asc_dvc->irq_sp;
  2529.         asc_dvc->irq_sp = (ADV_CARR_T *)
  2530.             ADV_U32_TO_VADDR(ASC_GET_CARRP(irq_next_vpa));
  2531.         free_carrp->next_vpa =
  2532.                 cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
  2533.         asc_dvc->carr_freelist = free_carrp;
  2534.         asc_dvc->carr_pending_cnt--;
  2535.         ASC_ASSERT(scsiq != NULL);
  2536.         target_bit = ADV_TID_TO_TIDMASK(scsiq->target_id);
  2537.         /*
  2538.          * Clear request microcode control flag.
  2539.          */
  2540.         scsiq->cntl = 0;
  2541.         /*
  2542.          * If the command that completed was a SCSI INQUIRY and
  2543.          * LUN 0 was sent the command, then process the INQUIRY
  2544.          * command information for the device.
  2545.          *
  2546.          * Note: If data returned were either VPD or CmdDt data,
  2547.          * don't process the INQUIRY command information for
  2548.          * the device, otherwise may erroneously set *_able bits.
  2549.          */
  2550.         if (scsiq->done_status == QD_NO_ERROR &&
  2551.             scsiq->cdb[0] == SCSICMD_Inquiry &&
  2552.             scsiq->target_lun == 0 &&
  2553.             (scsiq->cdb[1] & ADV_INQ_RTN_VPD_AND_CMDDT)
  2554.                 == ADV_INQ_RTN_STD_INQUIRY_DATA)
  2555.         {
  2556.             AdvInquiryHandling(asc_dvc, scsiq);
  2557.         }
  2558.         /*
  2559.          * Notify the driver of the completed request by passing
  2560.          * the ADV_SCSI_REQ_Q pointer to its callback function.
  2561.          */
  2562.         scsiq->a_flag |= ADV_SCSIQ_DONE;
  2563.         (*asc_dvc->isr_callback)(asc_dvc, scsiq);
  2564.         /*
  2565.          * Note: After the driver callback function is called, 'scsiq'
  2566.          * can no longer be referenced.
  2567.          *
  2568.          * Fall through and continue processing other completed
  2569.          * requests...
  2570.          */
  2571.         /*
  2572.          * Disable interrupts again in case the driver inadvertently
  2573.          * enabled interrupts in its callback function.
  2574.          *
  2575.          * The DvcEnterCritical() return value is ignored, because
  2576.          * the 'flags' saved when AdvISR() was first entered will be
  2577.          * used to restore the interrupt flag on exit.
  2578.          */
  2579.         (void) DvcEnterCritical();
  2580.     }
  2581.     DvcLeaveCritical(flags);
  2582.     return ADV_TRUE;
  2583. }
  2584. /*
  2585.  * Send an idle command to the chip and wait for completion.
  2586.  *
  2587.  * Command completion is polled for once per microsecond.
  2588.  *
  2589.  * The function can be called from anywhere including an interrupt handler.
  2590.  * But the function is not re-entrant, so it uses the DvcEnter/LeaveCritical()
  2591.  * functions to prevent reentrancy.
  2592.  *
  2593.  * Return Values:
  2594.  *   ADV_TRUE - command completed successfully
  2595.  *   ADV_FALSE - command failed
  2596.  *   ADV_ERROR - command timed out
  2597.  */
  2598. STATIC int
  2599. AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
  2600.                ushort idle_cmd,
  2601.                ADV_DCNT idle_cmd_parameter)
  2602. {
  2603.     ulong       last_int_level;
  2604.     int         result;
  2605.     ADV_DCNT    i, j;
  2606.     AdvPortAddr iop_base;
  2607.     last_int_level = DvcEnterCritical();
  2608.     iop_base = asc_dvc->iop_base;
  2609.     /*
  2610.      * Clear the idle command status which is set by the microcode
  2611.      * to a non-zero value to indicate when the command is completed.
  2612.      * The non-zero result is one of the IDLE_CMD_STATUS_* values
  2613.      * defined in a_advlib.h.
  2614.      */
  2615.     AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort) 0);
  2616.     /*
  2617.      * Write the idle command value after the idle command parameter
  2618.      * has been written to avoid a race condition. If the order is not
  2619.      * followed, the microcode may process the idle command before the
  2620.      * parameters have been written to LRAM.
  2621.      */
  2622.     AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
  2623.         cpu_to_le32(idle_cmd_parameter));
  2624.     AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
  2625.     /*
  2626.      * Tickle the RISC to tell it to process the idle command.
  2627.      */
  2628.     AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
  2629.     if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
  2630.     {
  2631.         /*
  2632.          * Clear the tickle value. In the ASC-3550 the RISC flag
  2633.          * command 'clr_tickle_b' does not work unless the host
  2634.          * value is cleared.
  2635.          */
  2636.         AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
  2637.     }
  2638.     /* Wait for up to 100 millisecond for the idle command to timeout. */
  2639.     for (i = 0; i < SCSI_WAIT_100_MSEC; i++)
  2640.     {
  2641.         /* Poll once each microsecond for command completion. */
  2642.         for (j = 0; j < SCSI_US_PER_MSEC; j++)
  2643.         {
  2644.             AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, result);
  2645.             if (result != 0)
  2646.             {
  2647.                 DvcLeaveCritical(last_int_level);
  2648.                 return result;
  2649.             }
  2650.             DvcDelayMicroSecond(asc_dvc, (ushort) 1);
  2651.         }
  2652.     }
  2653.     ASC_ASSERT(0); /* The idle command should never timeout. */
  2654.     DvcLeaveCritical(last_int_level);
  2655.     return ADV_ERROR;
  2656. }
  2657. /*
  2658.  * Inquiry Information Byte 7 Handling
  2659.  *
  2660.  * Handle SCSI Inquiry Command information for a device by setting
  2661.  * microcode operating variables that affect WDTR, SDTR, and Tag
  2662.  * Queuing.
  2663.  */
  2664. STATIC void
  2665. AdvInquiryHandling(
  2666.     ADV_DVC_VAR                 *asc_dvc,
  2667.     ADV_SCSI_REQ_Q              *scsiq)
  2668. {
  2669.     AdvPortAddr                 iop_base;
  2670.     uchar                       tid;
  2671.     ADV_SCSI_INQUIRY            *inq;
  2672.     ushort                      tidmask;
  2673.     ushort                      cfg_word;
  2674.     /*
  2675.      * AdvInquiryHandling() requires up to INQUIRY information Byte 7
  2676.      * to be available.
  2677.      *
  2678.      * If less than 8 bytes of INQUIRY information were requested or less
  2679.      * than 8 bytes were transferred, then return. cdb[4] is the request
  2680.      * length and the ADV_SCSI_REQ_Q 'data_cnt' field is set by the
  2681.      * microcode to the transfer residual count.
  2682.      */
  2683.     if (scsiq->cdb[4] < 8 ||
  2684.         (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) < 8)
  2685.     {
  2686.         return;
  2687.     }
  2688.     iop_base = asc_dvc->iop_base;
  2689.     tid = scsiq->target_id;
  2690.     inq = (ADV_SCSI_INQUIRY *) scsiq->vdata_addr;
  2691.     /*
  2692.      * WDTR, SDTR, and Tag Queuing cannot be enabled for old devices.
  2693.      */
  2694.     if (ADV_INQ_RESPONSE_FMT(inq) < 2 && ADV_INQ_ANSI_VER(inq) < 2)
  2695.     {
  2696.         return;
  2697.     } else
  2698.     {
  2699.         /*
  2700.          * INQUIRY Byte 7 Handling
  2701.          *
  2702.          * Use a device's INQUIRY byte 7 to determine whether it
  2703.          * supports WDTR, SDTR, and Tag Queuing. If the feature
  2704.          * is enabled in the EEPROM and the device supports the
  2705.          * feature, then enable it in the microcode.
  2706.          */
  2707.         tidmask = ADV_TID_TO_TIDMASK(tid);
  2708.         /*
  2709.          * Wide Transfers
  2710.          *
  2711.          * If the EEPROM enabled WDTR for the device and the device
  2712.          * supports wide bus (16 bit) transfers, then turn on the
  2713.          * device's 'wdtr_able' bit and write the new value to the
  2714.          * microcode.
  2715.          */
  2716.         if ((asc_dvc->wdtr_able & tidmask) && ADV_INQ_WIDE16(inq))
  2717.         {
  2718.             AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
  2719.             if ((cfg_word & tidmask) == 0)
  2720.             {
  2721.                 cfg_word |= tidmask;
  2722.                 AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
  2723.                 /*
  2724.                  * Clear the microcode "SDTR negotiation" and "WDTR
  2725.                  * negotiation" done indicators for the target to cause
  2726.                  * it to negotiate with the new setting set above.
  2727.                  * WDTR when accepted causes the target to enter
  2728.                  * asynchronous mode, so SDTR must be negotiated.
  2729.                  */
  2730.                 AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
  2731.                 cfg_word &= ~tidmask;
  2732.                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
  2733.                 AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
  2734.                 cfg_word &= ~tidmask;
  2735.                 AdvWriteWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
  2736.             }
  2737.         }
  2738.         /*
  2739.          * Synchronous Transfers
  2740.          *
  2741.          * If the EEPROM enabled SDTR for the device and the device
  2742.          * supports synchronous transfers, then turn on the device's
  2743.          * 'sdtr_able' bit. Write the new value to the microcode.
  2744.          */
  2745.         if ((asc_dvc->sdtr_able & tidmask) && ADV_INQ_SYNC(inq))
  2746.         {
  2747.             AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
  2748.             if ((cfg_word & tidmask) == 0)
  2749.             {
  2750.                 cfg_word |= tidmask;
  2751.                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
  2752.                 /*
  2753.                  * Clear the microcode "SDTR negotiation" done indicator
  2754.                  * for the target to cause it to negotiate with the new
  2755.                  * setting set above.
  2756.                  */
  2757.                 AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
  2758.                 cfg_word &= ~tidmask;
  2759.                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
  2760.             }
  2761.         }
  2762.         /*
  2763.          * If the Inquiry data included enough space for the SPI-3
  2764.          * Clocking field, then check if DT mode is supported.
  2765.          */
  2766.         if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600 &&
  2767.             (scsiq->cdb[4] >= 57 ||
  2768.             (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) >= 57))
  2769.         {
  2770.             /*
  2771.              * PPR (Parallel Protocol Request) Capable
  2772.              *
  2773.              * If the device supports DT mode, then it must be PPR capable.
  2774.              * The PPR message will be used in place of the SDTR and WDTR
  2775.              * messages to negotiate synchronous speed and offset, transfer
  2776.              * width, and protocol options.
  2777.              */
  2778.             if (ADV_INQ_CLOCKING(inq) & ADV_INQ_CLOCKING_DT_ONLY)
  2779.             {
  2780.                 AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, asc_dvc->ppr_able);
  2781.                 asc_dvc->ppr_able |= tidmask;
  2782.                 AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, asc_dvc->ppr_able);
  2783.             }
  2784.         }
  2785.         /*
  2786.          * If the EEPROM enabled Tag Queuing for the device and the
  2787.          * device supports Tag Queueing, then turn on the device's
  2788.          * 'tagqng_enable' bit in the microcode and set the microcode
  2789.          * maximum command count to the ADV_DVC_VAR 'max_dvc_qng'
  2790.          * value.
  2791.          *
  2792.          * Tag Queuing is disabled for the BIOS which runs in polled
  2793.          * mode and would see no benefit from Tag Queuing. Also by
  2794.          * disabling Tag Queuing in the BIOS devices with Tag Queuing
  2795.          * bugs will at least work with the BIOS.
  2796.          */
  2797.         if ((asc_dvc->tagqng_able & tidmask) && ADV_INQ_CMD_QUEUE(inq))
  2798.         {
  2799.             AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
  2800.             cfg_word |= tidmask;
  2801.             AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
  2802.             AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
  2803.                 asc_dvc->max_dvc_qng);
  2804.         }
  2805.     }
  2806. }
  2807. MODULE_LICENSE("Dual BSD/GPL");