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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Core routines and tables shareable across OS platforms.
  3.  *
  4.  * Copyright (c) 1994-2001 Justin T. Gibbs.
  5.  * Copyright (c) 2000-2001 Adaptec Inc.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions, and the following disclaimer,
  13.  *    without modification.
  14.  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  15.  *    substantially similar to the "NO WARRANTY" disclaimer below
  16.  *    ("Disclaimer") and any redistribution must be conditioned upon
  17.  *    including a substantially similar Disclaimer requirement for further
  18.  *    binary redistribution.
  19.  * 3. Neither the names of the above-listed copyright holders nor the names
  20.  *    of any contributors may be used to endorse or promote products derived
  21.  *    from this software without specific prior written permission.
  22.  *
  23.  * Alternatively, this software may be distributed under the terms of the
  24.  * GNU General Public License ("GPL") version 2 as published by the Free
  25.  * Software Foundation.
  26.  *
  27.  * NO WARRANTY
  28.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  29.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  30.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  31.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  32.  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  37.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38.  * POSSIBILITY OF SUCH DAMAGES.
  39.  *
  40.  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#50 $
  41.  *
  42.  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.c,v 1.61 2000/11/13 03:35:43 gibbs Exp $
  43.  */
  44. #include "aic7xxx_osm.h"
  45. #include "aic7xxx_inline.h"
  46. #include "aicasm/aicasm_insformat.h"
  47. /****************************** Softc Data ************************************/
  48. struct ahc_softc_tailq ahc_tailq = TAILQ_HEAD_INITIALIZER(ahc_tailq);
  49. /***************************** Lookup Tables **********************************/
  50. char *ahc_chip_names[] =
  51. {
  52. "NONE",
  53. "aic7770",
  54. "aic7850",
  55. "aic7855",
  56. "aic7859",
  57. "aic7860",
  58. "aic7870",
  59. "aic7880",
  60. "aic7895",
  61. "aic7895C",
  62. "aic7890/91",
  63. "aic7896/97",
  64. "aic7892",
  65. "aic7899"
  66. };
  67. static const u_int num_chip_names = NUM_ELEMENTS(ahc_chip_names);
  68. /*
  69.  * Hardware error codes.
  70.  */
  71. struct ahc_hard_error_entry {
  72.         uint8_t errno;
  73. char *errmesg;
  74. };
  75. static struct ahc_hard_error_entry ahc_hard_errors[] = {
  76. { ILLHADDR, "Illegal Host Access" },
  77. { ILLSADDR, "Illegal Sequencer Address referrenced" },
  78. { ILLOPCODE, "Illegal Opcode in sequencer program" },
  79. { SQPARERR, "Sequencer Parity Error" },
  80. { DPARERR, "Data-path Parity Error" },
  81. { MPARERR, "Scratch or SCB Memory Parity Error" },
  82. { PCIERRSTAT, "PCI Error detected" },
  83. { CIOPARERR, "CIOBUS Parity Error" },
  84. };
  85. static const u_int num_errors = NUM_ELEMENTS(ahc_hard_errors);
  86. static struct ahc_phase_table_entry ahc_phase_table[] =
  87. {
  88. { P_DATAOUT, MSG_NOOP, "in Data-out phase" },
  89. { P_DATAIN, MSG_INITIATOR_DET_ERR, "in Data-in phase" },
  90. { P_DATAOUT_DT, MSG_NOOP, "in DT Data-out phase" },
  91. { P_DATAIN_DT, MSG_INITIATOR_DET_ERR, "in DT Data-in phase" },
  92. { P_COMMAND, MSG_NOOP, "in Command phase" },
  93. { P_MESGOUT, MSG_NOOP, "in Message-out phase" },
  94. { P_STATUS, MSG_INITIATOR_DET_ERR, "in Status phase" },
  95. { P_MESGIN, MSG_PARITY_ERROR, "in Message-in phase" },
  96. { P_BUSFREE, MSG_NOOP, "while idle" },
  97. { 0, MSG_NOOP, "in unknown phase" }
  98. };
  99. /*
  100.  * In most cases we only wish to itterate over real phases, so
  101.  * exclude the last element from the count.
  102.  */
  103. static const u_int num_phases = NUM_ELEMENTS(ahc_phase_table) - 1;
  104. /*
  105.  * Valid SCSIRATE values.  (p. 3-17)
  106.  * Provides a mapping of tranfer periods in ns to the proper value to
  107.  * stick in the scsixfer reg.
  108.  */
  109. static struct ahc_syncrate ahc_syncrates[] =
  110. {
  111.       /* ultra2    fast/ultra  period     rate */
  112. { 0x42,      0x000,      9,      "80.0" },
  113. { 0x03,      0x000,     10,      "40.0" },
  114. { 0x04,      0x000,     11,      "33.0" },
  115. { 0x05,      0x100,     12,      "20.0" },
  116. { 0x06,      0x110,     15,      "16.0" },
  117. { 0x07,      0x120,     18,      "13.4" },
  118. { 0x08,      0x000,     25,      "10.0" },
  119. { 0x19,      0x010,     31,      "8.0"  },
  120. { 0x1a,      0x020,     37,      "6.67" },
  121. { 0x1b,      0x030,     43,      "5.7"  },
  122. { 0x1c,      0x040,     50,      "5.0"  },
  123. { 0x00,      0x050,     56,      "4.4"  },
  124. { 0x00,      0x060,     62,      "4.0"  },
  125. { 0x00,      0x070,     68,      "3.6"  },
  126. { 0x00,      0x000,      0,      NULL   }
  127. };
  128. /* Our Sequencer Program */
  129. #include "aic7xxx_seq.h"
  130. /**************************** Function Declarations ***************************/
  131. static void ahc_force_renegotiation(struct ahc_softc *ahc);
  132. static struct ahc_tmode_tstate*
  133. ahc_alloc_tstate(struct ahc_softc *ahc,
  134.  u_int scsi_id, char channel);
  135. #ifdef AHC_TARGET_MODE
  136. static void ahc_free_tstate(struct ahc_softc *ahc,
  137. u_int scsi_id, char channel, int force);
  138. #endif
  139. static struct ahc_syncrate*
  140. ahc_devlimited_syncrate(struct ahc_softc *ahc,
  141.         struct ahc_initiator_tinfo *,
  142. u_int *period,
  143. u_int *ppr_options,
  144. role_t role);
  145. static void ahc_update_pending_scbs(struct ahc_softc *ahc);
  146. static void ahc_fetch_devinfo(struct ahc_softc *ahc,
  147.   struct ahc_devinfo *devinfo);
  148. static void ahc_scb_devinfo(struct ahc_softc *ahc,
  149. struct ahc_devinfo *devinfo,
  150. struct scb *scb);
  151. static void ahc_assert_atn(struct ahc_softc *ahc);
  152. static void ahc_setup_initiator_msgout(struct ahc_softc *ahc,
  153.    struct ahc_devinfo *devinfo,
  154.    struct scb *scb);
  155. static void ahc_build_transfer_msg(struct ahc_softc *ahc,
  156.        struct ahc_devinfo *devinfo);
  157. static void ahc_construct_sdtr(struct ahc_softc *ahc,
  158.    struct ahc_devinfo *devinfo,
  159.    u_int period, u_int offset);
  160. static void ahc_construct_wdtr(struct ahc_softc *ahc,
  161.    struct ahc_devinfo *devinfo,
  162.    u_int bus_width);
  163. static void ahc_construct_ppr(struct ahc_softc *ahc,
  164.   struct ahc_devinfo *devinfo,
  165.   u_int period, u_int offset,
  166.   u_int bus_width, u_int ppr_options);
  167. static void ahc_clear_msg_state(struct ahc_softc *ahc);
  168. static void ahc_handle_message_phase(struct ahc_softc *ahc);
  169. typedef enum {
  170. AHCMSG_1B,
  171. AHCMSG_2B,
  172. AHCMSG_EXT
  173. } ahc_msgtype;
  174. static int ahc_sent_msg(struct ahc_softc *ahc, ahc_msgtype type,
  175.      u_int msgval, int full);
  176. static int ahc_parse_msg(struct ahc_softc *ahc,
  177.       struct ahc_devinfo *devinfo);
  178. static int ahc_handle_msg_reject(struct ahc_softc *ahc,
  179.       struct ahc_devinfo *devinfo);
  180. static void ahc_handle_ign_wide_residue(struct ahc_softc *ahc,
  181. struct ahc_devinfo *devinfo);
  182. static void ahc_reinitialize_dataptrs(struct ahc_softc *ahc);
  183. static void ahc_handle_devreset(struct ahc_softc *ahc,
  184.     struct ahc_devinfo *devinfo,
  185.     cam_status status, char *message,
  186.     int verbose_level);
  187. #if AHC_TARGET_MODE
  188. static void ahc_setup_target_msgin(struct ahc_softc *ahc,
  189.        struct ahc_devinfo *devinfo,
  190.        struct scb *scb);
  191. #endif
  192. static bus_dmamap_callback_t ahc_dmamap_cb; 
  193. static void ahc_build_free_scb_list(struct ahc_softc *ahc);
  194. static int ahc_init_scbdata(struct ahc_softc *ahc);
  195. static void ahc_fini_scbdata(struct ahc_softc *ahc);
  196. static void ahc_qinfifo_requeue(struct ahc_softc *ahc,
  197.     struct scb *prev_scb,
  198.     struct scb *scb);
  199. static int ahc_qinfifo_count(struct ahc_softc *ahc);
  200. static u_int ahc_rem_scb_from_disc_list(struct ahc_softc *ahc,
  201.    u_int prev, u_int scbptr);
  202. static void ahc_add_curscb_to_free_list(struct ahc_softc *ahc);
  203. static u_int ahc_rem_wscb(struct ahc_softc *ahc,
  204.      u_int scbpos, u_int prev);
  205. static void ahc_reset_current_bus(struct ahc_softc *ahc);
  206. #ifdef AHC_DUMP_SEQ
  207. static void ahc_dumpseq(struct ahc_softc *ahc);
  208. #endif
  209. static void ahc_loadseq(struct ahc_softc *ahc);
  210. static int ahc_check_patch(struct ahc_softc *ahc,
  211. struct patch **start_patch,
  212. u_int start_instr, u_int *skip_addr);
  213. static void ahc_download_instr(struct ahc_softc *ahc,
  214.    u_int instrptr, uint8_t *dconsts);
  215. #ifdef AHC_TARGET_MODE
  216. static void ahc_queue_lstate_event(struct ahc_softc *ahc,
  217.        struct ahc_tmode_lstate *lstate,
  218.        u_int initiator_id,
  219.        u_int event_type,
  220.        u_int event_arg);
  221. static void ahc_update_scsiid(struct ahc_softc *ahc,
  222.   u_int targid_mask);
  223. static int ahc_handle_target_cmd(struct ahc_softc *ahc,
  224.       struct target_cmd *cmd);
  225. #endif
  226. /************************* Sequencer Execution Control ************************/
  227. /*
  228.  * Restart the sequencer program from address zero
  229.  */
  230. void
  231. ahc_restart(struct ahc_softc *ahc)
  232. {
  233. ahc_pause(ahc);
  234. ahc_outb(ahc, SCSISIGO, 0); /* De-assert BSY */
  235. ahc_outb(ahc, MSG_OUT, MSG_NOOP); /* No message to send */
  236. ahc_outb(ahc, SXFRCTL1, ahc_inb(ahc, SXFRCTL1) & ~BITBUCKET);
  237. ahc_outb(ahc, LASTPHASE, P_BUSFREE);
  238. /*
  239.  * Ensure that the sequencer's idea of TQINPOS
  240.  * matches our own.  The sequencer increments TQINPOS
  241.  * only after it sees a DMA complete and a reset could
  242.  * occur before the increment leaving the kernel to believe
  243.  * the command arrived but the sequencer to not.
  244.  */
  245. ahc_outb(ahc, TQINPOS, ahc->tqinfifonext);
  246. /* Always allow reselection */
  247. ahc_outb(ahc, SCSISEQ,
  248.  ahc_inb(ahc, SCSISEQ_TEMPLATE) & (ENSELI|ENRSELI|ENAUTOATNP));
  249. if ((ahc->features & AHC_CMD_CHAN) != 0) {
  250. /* Ensure that no DMA operations are in progress */
  251. ahc_outb(ahc, CCSCBCNT, 0);
  252. ahc_outb(ahc, CCSGCTL, 0);
  253. ahc_outb(ahc, CCSCBCTL, 0);
  254. }
  255. /*
  256.  * If we were in the process of DMA'ing SCB data into
  257.  * an SCB, replace that SCB on the free list.  This prevents
  258.  * an SCB leak.
  259.  */
  260. if ((ahc_inb(ahc, SEQ_FLAGS2) & SCB_DMA) != 0) {
  261. ahc_add_curscb_to_free_list(ahc);
  262. ahc_outb(ahc, SEQ_FLAGS2,
  263.  ahc_inb(ahc, SEQ_FLAGS2) & ~SCB_DMA);
  264. }
  265. ahc_outb(ahc, MWI_RESIDUAL, 0);
  266. ahc_outb(ahc, SEQCTL, FASTMODE);
  267. ahc_outb(ahc, SEQADDR0, 0);
  268. ahc_outb(ahc, SEQADDR1, 0);
  269. ahc_unpause(ahc);
  270. }
  271. /************************* Input/Output Queues ********************************/
  272. void
  273. ahc_run_qoutfifo(struct ahc_softc *ahc)
  274. {
  275. struct scb *scb;
  276. u_int  scb_index;
  277. ahc_sync_qoutfifo(ahc, BUS_DMASYNC_POSTREAD);
  278. while (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL) {
  279. scb_index = ahc->qoutfifo[ahc->qoutfifonext];
  280. if ((ahc->qoutfifonext & 0x03) == 0x03) {
  281. u_int modnext;
  282. /*
  283.  * Clear 32bits of QOUTFIFO at a time
  284.  * so that we don't clobber an incoming
  285.  * byte DMA to the array on architectures
  286.  * that only support 32bit load and store
  287.  * operations.
  288.  */
  289. modnext = ahc->qoutfifonext & ~0x3;
  290. *((uint32_t *)(&ahc->qoutfifo[modnext])) = 0xFFFFFFFFUL;
  291. ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
  292. ahc->shared_data_dmamap,
  293. /*offset*/modnext, /*len*/4,
  294. BUS_DMASYNC_PREREAD);
  295. }
  296. ahc->qoutfifonext++;
  297. scb = ahc_lookup_scb(ahc, scb_index);
  298. if (scb == NULL) {
  299. printf("%s: WARNING no command for scb %d "
  300.        "(cmdcmplt)nQOUTPOS = %dn",
  301.        ahc_name(ahc), scb_index,
  302.        ahc->qoutfifonext - 1);
  303. continue;
  304. }
  305. /*
  306.  * Save off the residual
  307.  * if there is one.
  308.  */
  309. ahc_update_residual(scb);
  310. ahc_done(ahc, scb);
  311. }
  312. }
  313. void
  314. ahc_run_untagged_queues(struct ahc_softc *ahc)
  315. {
  316. int i;
  317. for (i = 0; i < 16; i++)
  318. ahc_run_untagged_queue(ahc, &ahc->untagged_queues[i]);
  319. }
  320. void
  321. ahc_run_untagged_queue(struct ahc_softc *ahc, struct scb_tailq *queue)
  322. {
  323. struct scb *scb;
  324. if (ahc->untagged_queue_lock != 0)
  325. return;
  326. if ((scb = TAILQ_FIRST(queue)) != NULL
  327.  && (scb->flags & SCB_ACTIVE) == 0) {
  328. scb->flags |= SCB_ACTIVE;
  329. ahc_queue_scb(ahc, scb);
  330. }
  331. }
  332. /************************* Interrupt Handling *********************************/
  333. void
  334. ahc_handle_brkadrint(struct ahc_softc *ahc)
  335. {
  336. /*
  337.  * We upset the sequencer :-(
  338.  * Lookup the error message
  339.  */
  340. int i;
  341. int error;
  342. error = ahc_inb(ahc, ERROR);
  343. for (i = 0; error != 1 && i < num_errors; i++)
  344. error >>= 1;
  345. printf("%s: brkadrint, %s at seqaddr = 0x%xn",
  346.        ahc_name(ahc), ahc_hard_errors[i].errmesg,
  347.        ahc_inb(ahc, SEQADDR0) |
  348.        (ahc_inb(ahc, SEQADDR1) << 8));
  349. ahc_dump_card_state(ahc);
  350. /* Tell everyone that this HBA is no longer availible */
  351. ahc_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
  352.        CAM_LUN_WILDCARD, SCB_LIST_NULL, ROLE_UNKNOWN,
  353.        CAM_NO_HBA);
  354. /* Disable all interrupt sources by resetting the controller */
  355. ahc_shutdown(ahc);
  356. }
  357. void
  358. ahc_handle_seqint(struct ahc_softc *ahc, u_int intstat)
  359. {
  360. struct scb *scb;
  361. struct ahc_devinfo devinfo;
  362. ahc_fetch_devinfo(ahc, &devinfo);
  363. /*
  364.  * Clear the upper byte that holds SEQINT status
  365.  * codes and clear the SEQINT bit. We will unpause
  366.  * the sequencer, if appropriate, after servicing
  367.  * the request.
  368.  */
  369. ahc_outb(ahc, CLRINT, CLRSEQINT);
  370. switch (intstat & SEQINT_MASK) {
  371. case BAD_STATUS:
  372. {
  373. u_int  scb_index;
  374. struct hardware_scb *hscb;
  375. /*
  376.  * Set the default return value to 0 (don't
  377.  * send sense).  The sense code will change
  378.  * this if needed.
  379.  */
  380. ahc_outb(ahc, RETURN_1, 0);
  381. /*
  382.  * The sequencer will notify us when a command
  383.  * has an error that would be of interest to
  384.  * the kernel.  This allows us to leave the sequencer
  385.  * running in the common case of command completes
  386.  * without error.  The sequencer will already have
  387.  * dma'd the SCB back up to us, so we can reference
  388.  * the in kernel copy directly.
  389.  */
  390. scb_index = ahc_inb(ahc, SCB_TAG);
  391. scb = ahc_lookup_scb(ahc, scb_index);
  392. if (scb == NULL) {
  393. printf("%s:%c:%d: ahc_intr - referenced scb "
  394.        "not valid during seqint 0x%x scb(%d)n",
  395.        ahc_name(ahc), devinfo.channel,
  396.        devinfo.target, intstat, scb_index);
  397. ahc_dump_card_state(ahc);
  398. panic("for safety");
  399. goto unpause;
  400. }
  401. hscb = scb->hscb; 
  402. /* Don't want to clobber the original sense code */
  403. if ((scb->flags & SCB_SENSE) != 0) {
  404. /*
  405.  * Clear the SCB_SENSE Flag and have
  406.  * the sequencer do a normal command
  407.  * complete.
  408.  */
  409. scb->flags &= ~SCB_SENSE;
  410. ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
  411. break;
  412. }
  413. ahc_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
  414. /* Freeze the queue until the client sees the error. */
  415. ahc_freeze_devq(ahc, scb);
  416. ahc_freeze_scb(scb);
  417. ahc_set_scsi_status(scb, hscb->shared_data.status.scsi_status);
  418. switch (hscb->shared_data.status.scsi_status) {
  419. case SCSI_STATUS_OK:
  420. printf("%s: Interrupted for staus of 0???n",
  421.        ahc_name(ahc));
  422. break;
  423. case SCSI_STATUS_CMD_TERMINATED:
  424. case SCSI_STATUS_CHECK_COND:
  425. {
  426. struct ahc_dma_seg *sg;
  427. struct scsi_sense *sc;
  428. struct ahc_initiator_tinfo *targ_info;
  429. struct ahc_tmode_tstate *tstate;
  430. struct ahc_transinfo *tinfo;
  431. #ifdef AHC_DEBUG
  432. if (ahc_debug & AHC_SHOWSENSE) {
  433. ahc_print_path(ahc, scb);
  434. printf("SCB %d: requests Check Statusn",
  435.        scb->hscb->tag);
  436. }
  437. #endif
  438. if (ahc_perform_autosense(scb) == 0)
  439. break;
  440. targ_info = ahc_fetch_transinfo(ahc,
  441. devinfo.channel,
  442. devinfo.our_scsiid,
  443. devinfo.target,
  444. &tstate);
  445. tinfo = &targ_info->curr;
  446. sg = scb->sg_list;
  447. sc = (struct scsi_sense *)(&hscb->shared_data.cdb); 
  448. /*
  449.  * Save off the residual if there is one.
  450.  */
  451. ahc_update_residual(scb);
  452. #ifdef AHC_DEBUG
  453. if (ahc_debug & AHC_SHOWSENSE) {
  454. ahc_print_path(ahc, scb);
  455. printf("Sending Sensen");
  456. }
  457. #endif
  458. sg->addr = ahc_get_sense_bufaddr(ahc, scb);
  459. sg->len = ahc_get_sense_bufsize(ahc, scb);
  460. sg->len |= AHC_DMA_LAST_SEG;
  461. /* Fixup byte order */
  462. sg->addr = ahc_htole32(sg->addr);
  463. sg->len = ahc_htole32(sg->len);
  464. sc->opcode = REQUEST_SENSE;
  465. sc->byte2 = 0;
  466. if (tinfo->protocol_version <= SCSI_REV_2
  467.  && SCB_GET_LUN(scb) < 8)
  468. sc->byte2 = SCB_GET_LUN(scb) << 5;
  469. sc->unused[0] = 0;
  470. sc->unused[1] = 0;
  471. sc->length = sg->len;
  472. sc->control = 0;
  473. /*
  474.  * We can't allow the target to disconnect.
  475.  * This will be an untagged transaction and
  476.  * having the target disconnect will make this
  477.  * transaction indestinguishable from outstanding
  478.  * tagged transactions.
  479.  */
  480. hscb->control = 0;
  481. /*
  482.  * This request sense could be because the
  483.  * the device lost power or in some other
  484.  * way has lost our transfer negotiations.
  485.  * Renegotiate if appropriate.  Unit attention
  486.  * errors will be reported before any data
  487.  * phases occur.
  488.  */
  489. if (ahc_get_residual(scb) 
  490.  == ahc_get_transfer_length(scb)) {
  491. ahc_update_neg_request(ahc, &devinfo,
  492.        tstate, targ_info,
  493.        /*force*/TRUE);
  494. }
  495. if (tstate->auto_negotiate & devinfo.target_mask) {
  496. hscb->control |= MK_MESSAGE;
  497. scb->flags &= ~SCB_NEGOTIATE;
  498. scb->flags |= SCB_AUTO_NEGOTIATE;
  499. }
  500. hscb->cdb_len = sizeof(*sc);
  501. hscb->dataptr = sg->addr; 
  502. hscb->datacnt = sg->len;
  503. hscb->sgptr = scb->sg_list_phys | SG_FULL_RESID;
  504. hscb->sgptr = ahc_htole32(hscb->sgptr);
  505. scb->sg_count = 1;
  506. scb->flags |= SCB_SENSE;
  507. ahc_qinfifo_requeue_tail(ahc, scb);
  508. ahc_outb(ahc, RETURN_1, SEND_SENSE);
  509. #ifdef __FreeBSD__
  510. /*
  511.  * Ensure we have enough time to actually
  512.  * retrieve the sense.
  513.  */
  514. untimeout(ahc_timeout, (caddr_t)scb,
  515.   scb->io_ctx->ccb_h.timeout_ch);
  516. scb->io_ctx->ccb_h.timeout_ch =
  517.     timeout(ahc_timeout, (caddr_t)scb, 5 * hz);
  518. #endif
  519. break;
  520. }
  521. default:
  522. break;
  523. }
  524. break;
  525. }
  526. case NO_MATCH:
  527. {
  528. /* Ensure we don't leave the selection hardware on */
  529. ahc_outb(ahc, SCSISEQ,
  530.  ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
  531. printf("%s:%c:%d: no active SCB for reconnecting "
  532.        "target - issuing BUS DEVICE RESETn",
  533.        ahc_name(ahc), devinfo.channel, devinfo.target);
  534. printf("SAVED_SCSIID == 0x%x, SAVED_LUN == 0x%x, "
  535.        "ARG_1 == 0x%x ACCUM = 0x%xn",
  536.        ahc_inb(ahc, SAVED_SCSIID), ahc_inb(ahc, SAVED_LUN),
  537.        ahc_inb(ahc, ARG_1), ahc_inb(ahc, ACCUM));
  538. printf("SEQ_FLAGS == 0x%x, SCBPTR == 0x%x, BTT == 0x%x, "
  539.        "SINDEX == 0x%xn",
  540.        ahc_inb(ahc, SEQ_FLAGS), ahc_inb(ahc, SCBPTR),
  541.        ahc_index_busy_tcl(ahc,
  542.     BUILD_TCL(ahc_inb(ahc, SAVED_SCSIID),
  543.       ahc_inb(ahc, SAVED_LUN))),
  544.        ahc_inb(ahc, SINDEX));
  545. printf("SCSIID == 0x%x, SCB_SCSIID == 0x%x, SCB_LUN == 0x%x, "
  546.        "SCB_TAG == 0x%x, SCB_CONTROL == 0x%xn",
  547.        ahc_inb(ahc, SCSIID), ahc_inb(ahc, SCB_SCSIID),
  548.        ahc_inb(ahc, SCB_LUN), ahc_inb(ahc, SCB_TAG),
  549.        ahc_inb(ahc, SCB_CONTROL));
  550. printf("SCSIBUSL == 0x%x, SCSISIGI == 0x%xn",
  551.        ahc_inb(ahc, SCSIBUSL), ahc_inb(ahc, SCSISIGI));
  552. printf("SXFRCTL0 == 0x%xn", ahc_inb(ahc, SXFRCTL0));
  553. printf("SEQCTL == 0x%xn", ahc_inb(ahc, SEQCTL));
  554. ahc_dump_card_state(ahc);
  555. ahc->msgout_buf[0] = MSG_BUS_DEV_RESET;
  556. ahc->msgout_len = 1;
  557. ahc->msgout_index = 0;
  558. ahc->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
  559. ahc_outb(ahc, MSG_OUT, HOST_MSG);
  560. ahc_assert_atn(ahc);
  561. break;
  562. }
  563. case SEND_REJECT: 
  564. {
  565. u_int rejbyte = ahc_inb(ahc, ACCUM);
  566. printf("%s:%c:%d: Warning - unknown message received from "
  567.        "target (0x%x).  Rejectingn", 
  568.        ahc_name(ahc), devinfo.channel, devinfo.target, rejbyte);
  569. break; 
  570. }
  571. case NO_IDENT: 
  572. {
  573. /*
  574.  * The reconnecting target either did not send an identify
  575.  * message, or did, but we didn't find an SCB to match and
  576.  * before it could respond to our ATN/abort, it hit a dataphase.
  577.  * The only safe thing to do is to blow it away with a bus
  578.  * reset.
  579.  */
  580. int found;
  581. printf("%s:%c:%d: Target did not send an IDENTIFY message. "
  582.        "LASTPHASE = 0x%x, SAVED_SCSIID == 0x%xn",
  583.        ahc_name(ahc), devinfo.channel, devinfo.target,
  584.        ahc_inb(ahc, LASTPHASE), ahc_inb(ahc, SAVED_SCSIID));
  585. found = ahc_reset_channel(ahc, devinfo.channel, 
  586.   /*initiate reset*/TRUE);
  587. printf("%s: Issued Channel %c Bus Reset. "
  588.        "%d SCBs abortedn", ahc_name(ahc), devinfo.channel,
  589.        found);
  590. return;
  591. }
  592. case IGN_WIDE_RES:
  593. ahc_handle_ign_wide_residue(ahc, &devinfo);
  594. break;
  595. case PDATA_REINIT:
  596. ahc_reinitialize_dataptrs(ahc);
  597. break;
  598. case BAD_PHASE:
  599. {
  600. u_int lastphase;
  601. lastphase = ahc_inb(ahc, LASTPHASE);
  602. printf("%s:%c:%d: unknown scsi bus phase %x, "
  603.        "lastphase = 0x%x.  Attempting to continuen",
  604.        ahc_name(ahc), devinfo.channel, devinfo.target,
  605.        lastphase, ahc_inb(ahc, SCSISIGI));
  606. break;
  607. }
  608. case MISSED_BUSFREE:
  609. {
  610. u_int lastphase;
  611. lastphase = ahc_inb(ahc, LASTPHASE);
  612. printf("%s:%c:%d: Missed busfree. "
  613.        "Lastphase = 0x%x, Curphase = 0x%xn",
  614.        ahc_name(ahc), devinfo.channel, devinfo.target,
  615.        lastphase, ahc_inb(ahc, SCSISIGI));
  616. ahc_restart(ahc);
  617. return;
  618. }
  619. case HOST_MSG_LOOP:
  620. {
  621. /*
  622.  * The sequencer has encountered a message phase
  623.  * that requires host assistance for completion.
  624.  * While handling the message phase(s), we will be
  625.  * notified by the sequencer after each byte is
  626.  * transfered so we can track bus phase changes.
  627.  *
  628.  * If this is the first time we've seen a HOST_MSG_LOOP
  629.  * interrupt, initialize the state of the host message
  630.  * loop.
  631.  */
  632. if (ahc->msg_type == MSG_TYPE_NONE) {
  633. struct scb *scb;
  634. u_int scb_index;
  635. u_int bus_phase;
  636. bus_phase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
  637. if (bus_phase != P_MESGIN
  638.  && bus_phase != P_MESGOUT) {
  639. printf("ahc_intr: HOST_MSG_LOOP bad "
  640.        "phase 0x%xn",
  641.       bus_phase);
  642. /*
  643.  * Probably transitioned to bus free before
  644.  * we got here.  Just punt the message.
  645.  */
  646. ahc_clear_intstat(ahc);
  647. ahc_restart(ahc);
  648. return;
  649. }
  650. scb_index = ahc_inb(ahc, SCB_TAG);
  651. scb = ahc_lookup_scb(ahc, scb_index);
  652. if (devinfo.role == ROLE_INITIATOR) {
  653. if (scb == NULL)
  654. panic("HOST_MSG_LOOP with "
  655.       "invalid SCB %xn", scb_index);
  656. if (bus_phase == P_MESGOUT)
  657. ahc_setup_initiator_msgout(ahc,
  658.    &devinfo,
  659.    scb);
  660. else {
  661. ahc->msg_type =
  662.     MSG_TYPE_INITIATOR_MSGIN;
  663. ahc->msgin_index = 0;
  664. }
  665. }
  666. #if AHC_TARGET_MODE
  667. else {
  668. if (bus_phase == P_MESGOUT) {
  669. ahc->msg_type =
  670.     MSG_TYPE_TARGET_MSGOUT;
  671. ahc->msgin_index = 0;
  672. }
  673. else 
  674. ahc_setup_target_msgin(ahc,
  675.        &devinfo,
  676.        scb);
  677. }
  678. #endif
  679. }
  680. ahc_handle_message_phase(ahc);
  681. break;
  682. }
  683. case PERR_DETECTED:
  684. {
  685. /*
  686.  * If we've cleared the parity error interrupt
  687.  * but the sequencer still believes that SCSIPERR
  688.  * is true, it must be that the parity error is
  689.  * for the currently presented byte on the bus,
  690.  * and we are not in a phase (data-in) where we will
  691.  * eventually ack this byte.  Ack the byte and
  692.  * throw it away in the hope that the target will
  693.  * take us to message out to deliver the appropriate
  694.  * error message.
  695.  */
  696. if ((intstat & SCSIINT) == 0
  697.  && (ahc_inb(ahc, SSTAT1) & SCSIPERR) != 0) {
  698. if ((ahc->features & AHC_DT) == 0) {
  699. u_int curphase;
  700. /*
  701.  * The hardware will only let you ack bytes
  702.  * if the expected phase in SCSISIGO matches
  703.  * the current phase.  Make sure this is
  704.  * currently the case.
  705.  */
  706. curphase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
  707. ahc_outb(ahc, LASTPHASE, curphase);
  708. ahc_outb(ahc, SCSISIGO, curphase);
  709. }
  710. ahc_inb(ahc, SCSIDATL);
  711. }
  712. break;
  713. }
  714. case DATA_OVERRUN:
  715. {
  716. /*
  717.  * When the sequencer detects an overrun, it
  718.  * places the controller in "BITBUCKET" mode
  719.  * and allows the target to complete its transfer.
  720.  * Unfortunately, none of the counters get updated
  721.  * when the controller is in this mode, so we have
  722.  * no way of knowing how large the overrun was.
  723.  */
  724. u_int scbindex = ahc_inb(ahc, SCB_TAG);
  725. u_int lastphase = ahc_inb(ahc, LASTPHASE);
  726. u_int i;
  727. scb = ahc_lookup_scb(ahc, scbindex);
  728. for (i = 0; i < num_phases; i++) {
  729. if (lastphase == ahc_phase_table[i].phase)
  730. break;
  731. }
  732. ahc_print_path(ahc, scb);
  733. printf("data overrun detected %s."
  734.        "  Tag == 0x%x.n",
  735.        ahc_phase_table[i].phasemsg,
  736.           scb->hscb->tag);
  737. ahc_print_path(ahc, scb);
  738. printf("%s seen Data Phase.  Length = %ld.  NumSGs = %d.n",
  739.        ahc_inb(ahc, SEQ_FLAGS) & DPHASE ? "Have" : "Haven't",
  740.        ahc_get_transfer_length(scb), scb->sg_count);
  741. if (scb->sg_count > 0) {
  742. for (i = 0; i < scb->sg_count; i++) {
  743. printf("sg[%d] - Addr 0x%x%x : Length %dn",
  744.        i,
  745.        (ahc_le32toh(scb->sg_list[i].len) >> 24
  746.         & SG_HIGH_ADDR_BITS),
  747.        ahc_le32toh(scb->sg_list[i].addr),
  748.        ahc_le32toh(scb->sg_list[i].len)
  749.        & AHC_SG_LEN_MASK);
  750. }
  751. }
  752. /*
  753.  * Set this and it will take effect when the
  754.  * target does a command complete.
  755.  */
  756. ahc_freeze_devq(ahc, scb);
  757. ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
  758. ahc_freeze_scb(scb);
  759. if ((ahc->features & AHC_ULTRA2) != 0) {
  760. /*
  761.  * Clear the channel in case we return
  762.  * to data phase later.
  763.  */
  764. ahc_outb(ahc, SXFRCTL0,
  765.  ahc_inb(ahc, SXFRCTL0) | CLRSTCNT|CLRCHN);
  766. ahc_outb(ahc, SXFRCTL0,
  767.  ahc_inb(ahc, SXFRCTL0) | CLRSTCNT|CLRCHN);
  768. }
  769. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  770. u_int dscommand1;
  771. /* Ensure HHADDR is 0 for future DMA operations. */
  772. dscommand1 = ahc_inb(ahc, DSCOMMAND1);
  773. ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
  774. ahc_outb(ahc, HADDR, 0);
  775. ahc_outb(ahc, DSCOMMAND1, dscommand1);
  776. }
  777. break;
  778. }
  779. case MKMSG_FAILED:
  780. {
  781. u_int scbindex;
  782. printf("%s:%c:%d:%d: Attempt to issue message failedn",
  783.        ahc_name(ahc), devinfo.channel, devinfo.target,
  784.        devinfo.lun);
  785. scbindex = ahc_inb(ahc, SCB_TAG);
  786. scb = ahc_lookup_scb(ahc, scbindex);
  787. if (scb != NULL
  788.  && (scb->flags & SCB_RECOVERY_SCB) != 0)
  789. /*
  790.  * Ensure that we didn't put a second instance of this
  791.  * SCB into the QINFIFO.
  792.  */
  793. ahc_search_qinfifo(ahc, SCB_GET_TARGET(ahc, scb),
  794.    SCB_GET_CHANNEL(ahc, scb),
  795.    SCB_GET_LUN(scb), scb->hscb->tag,
  796.    ROLE_INITIATOR, /*status*/0,
  797.    SEARCH_REMOVE);
  798. break;
  799. }
  800. case NO_FREE_SCB:
  801. {
  802. printf("%s: No free or disconnected SCBsn", ahc_name(ahc));
  803. ahc_dump_card_state(ahc);
  804. panic("for safety");
  805. break;
  806. }
  807. case SCB_MISMATCH:
  808. {
  809. u_int scbptr;
  810. scbptr = ahc_inb(ahc, SCBPTR);
  811. printf("Bogus TAG after DMA.  SCBPTR %d, tag %d, our tag %dn",
  812.        scbptr, ahc_inb(ahc, ARG_1),
  813.        ahc->scb_data->hscbs[scbptr].tag);
  814. ahc_dump_card_state(ahc);
  815. panic("for saftey");
  816. break;
  817. }
  818. case OUT_OF_RANGE:
  819. {
  820. printf("%s: BTT calculation out of rangen", ahc_name(ahc));
  821. printf("SAVED_SCSIID == 0x%x, SAVED_LUN == 0x%x, "
  822.        "ARG_1 == 0x%x ACCUM = 0x%xn",
  823.        ahc_inb(ahc, SAVED_SCSIID), ahc_inb(ahc, SAVED_LUN),
  824.        ahc_inb(ahc, ARG_1), ahc_inb(ahc, ACCUM));
  825. printf("SEQ_FLAGS == 0x%x, SCBPTR == 0x%x, BTT == 0x%x, "
  826.        "SINDEX == 0x%xn, A == 0x%xn",
  827.        ahc_inb(ahc, SEQ_FLAGS), ahc_inb(ahc, SCBPTR),
  828.        ahc_index_busy_tcl(ahc,
  829.     BUILD_TCL(ahc_inb(ahc, SAVED_SCSIID),
  830.       ahc_inb(ahc, SAVED_LUN))),
  831.        ahc_inb(ahc, SINDEX),
  832.        ahc_inb(ahc, ACCUM));
  833. printf("SCSIID == 0x%x, SCB_SCSIID == 0x%x, SCB_LUN == 0x%x, "
  834.        "SCB_TAG == 0x%x, SCB_CONTROL == 0x%xn",
  835.        ahc_inb(ahc, SCSIID), ahc_inb(ahc, SCB_SCSIID),
  836.        ahc_inb(ahc, SCB_LUN), ahc_inb(ahc, SCB_TAG),
  837.        ahc_inb(ahc, SCB_CONTROL));
  838. printf("SCSIBUSL == 0x%x, SCSISIGI == 0x%xn",
  839.        ahc_inb(ahc, SCSIBUSL), ahc_inb(ahc, SCSISIGI));
  840. ahc_dump_card_state(ahc);
  841. panic("for safety");
  842. break;
  843. }
  844. default:
  845. printf("ahc_intr: seqint, "
  846.        "intstat == 0x%x, scsisigi = 0x%xn",
  847.        intstat, ahc_inb(ahc, SCSISIGI));
  848. break;
  849. }
  850. unpause:
  851. /*
  852.  *  The sequencer is paused immediately on
  853.  *  a SEQINT, so we should restart it when
  854.  *  we're done.
  855.  */
  856. ahc_unpause(ahc);
  857. }
  858. void
  859. ahc_handle_scsiint(struct ahc_softc *ahc, u_int intstat)
  860. {
  861. u_int scb_index;
  862. u_int status0;
  863. u_int status;
  864. struct scb *scb;
  865. char cur_channel;
  866. char intr_channel;
  867. /* Make sure the sequencer is in a safe location. */
  868. ahc_clear_critical_section(ahc);
  869. if ((ahc->features & AHC_TWIN) != 0
  870.  && ((ahc_inb(ahc, SBLKCTL) & SELBUSB) != 0))
  871. cur_channel = 'B';
  872. else
  873. cur_channel = 'A';
  874. intr_channel = cur_channel;
  875. if ((ahc->features & AHC_ULTRA2) != 0)
  876. status0 = ahc_inb(ahc, SSTAT0) & IOERR;
  877. else
  878. status0 = 0;
  879. status = ahc_inb(ahc, SSTAT1) & (SELTO|SCSIRSTI|BUSFREE|SCSIPERR);
  880. if (status == 0 && status0 == 0) {
  881. if ((ahc->features & AHC_TWIN) != 0) {
  882. /* Try the other channel */
  883.   ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) ^ SELBUSB);
  884. status = ahc_inb(ahc, SSTAT1)
  885.        & (SELTO|SCSIRSTI|BUSFREE|SCSIPERR);
  886. intr_channel = (cur_channel == 'A') ? 'B' : 'A';
  887. }
  888. if (status == 0) {
  889. printf("%s: Spurious SCSI interruptn", ahc_name(ahc));
  890. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  891. ahc_unpause(ahc);
  892. return;
  893. }
  894. }
  895. scb_index = ahc_inb(ahc, SCB_TAG);
  896. scb = ahc_lookup_scb(ahc, scb_index);
  897. if (scb != NULL
  898.  && (ahc_inb(ahc, SEQ_FLAGS) & IDENTIFY_SEEN) == 0)
  899. scb = NULL;
  900. if ((ahc->features & AHC_ULTRA2) != 0
  901.  && (status0 & IOERR) != 0) {
  902. int now_lvd;
  903. now_lvd = ahc_inb(ahc, SBLKCTL) & ENAB40;
  904. printf("%s: Transceiver State Has Changed to %s moden",
  905.        ahc_name(ahc), now_lvd ? "LVD" : "SE");
  906. ahc_outb(ahc, CLRSINT0, CLRIOERR);
  907. /*
  908.  * When transitioning to SE mode, the reset line
  909.  * glitches, triggering an arbitration bug in some
  910.  * Ultra2 controllers.  This bug is cleared when we
  911.  * assert the reset line.  Since a reset glitch has
  912.  * already occurred with this transition and a
  913.  * transceiver state change is handled just like
  914.  * a bus reset anyway, asserting the reset line
  915.  * ourselves is safe.
  916.  */
  917. ahc_reset_channel(ahc, intr_channel,
  918.  /*Initiate Reset*/now_lvd == 0);
  919. } else if ((status & SCSIRSTI) != 0) {
  920. printf("%s: Someone reset channel %cn",
  921. ahc_name(ahc), intr_channel);
  922. if (intr_channel != cur_channel)
  923.   ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) ^ SELBUSB);
  924. ahc_reset_channel(ahc, intr_channel, /*Initiate Reset*/FALSE);
  925. } else if ((status & SCSIPERR) != 0) {
  926. /*
  927.  * Determine the bus phase and queue an appropriate message.
  928.  * SCSIPERR is latched true as soon as a parity error
  929.  * occurs.  If the sequencer acked the transfer that
  930.  * caused the parity error and the currently presented
  931.  * transfer on the bus has correct parity, SCSIPERR will
  932.  * be cleared by CLRSCSIPERR.  Use this to determine if
  933.  * we should look at the last phase the sequencer recorded,
  934.  * or the current phase presented on the bus.
  935.  */
  936. u_int mesg_out;
  937. u_int curphase;
  938. u_int errorphase;
  939. u_int lastphase;
  940. u_int scsirate;
  941. u_int i;
  942. u_int sstat2;
  943. lastphase = ahc_inb(ahc, LASTPHASE);
  944. curphase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
  945. sstat2 = ahc_inb(ahc, SSTAT2);
  946. ahc_outb(ahc, CLRSINT1, CLRSCSIPERR);
  947. /*
  948.  * For all phases save DATA, the sequencer won't
  949.  * automatically ack a byte that has a parity error
  950.  * in it.  So the only way that the current phase
  951.  * could be 'data-in' is if the parity error is for
  952.  * an already acked byte in the data phase.  During
  953.  * synchronous data-in transfers, we may actually
  954.  * ack bytes before latching the current phase in
  955.  * LASTPHASE, leading to the discrepancy between
  956.  * curphase and lastphase.
  957.  */
  958. if ((ahc_inb(ahc, SSTAT1) & SCSIPERR) != 0
  959.  || curphase == P_DATAIN || curphase == P_DATAIN_DT)
  960. errorphase = curphase;
  961. else
  962. errorphase = lastphase;
  963. for (i = 0; i < num_phases; i++) {
  964. if (errorphase == ahc_phase_table[i].phase)
  965. break;
  966. }
  967. mesg_out = ahc_phase_table[i].mesg_out;
  968. if (scb != NULL)
  969. ahc_print_path(ahc, scb);
  970. else
  971. printf("%s:%c:%d: ", ahc_name(ahc), intr_channel,
  972.        SCSIID_TARGET(ahc, ahc_inb(ahc, SAVED_SCSIID)));
  973. scsirate = ahc_inb(ahc, SCSIRATE);
  974. printf("parity error detected %s. "
  975.        "SEQADDR(0x%x) SCSIRATE(0x%x)n",
  976.        ahc_phase_table[i].phasemsg,
  977.        ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8),
  978.        scsirate);
  979. if ((ahc->features & AHC_DT) != 0) {
  980. if ((sstat2 & CRCVALERR) != 0)
  981. printf("tCRC Value Mismatchn");
  982. if ((sstat2 & CRCENDERR) != 0)
  983. printf("tNo terminal CRC packet receviedn");
  984. if ((sstat2 & CRCREQERR) != 0)
  985. printf("tIllegal CRC packet requestn");
  986. if ((sstat2 & DUAL_EDGE_ERR) != 0)
  987. printf("tUnexpected %sDT Data Phasen",
  988.        (scsirate & SINGLE_EDGE) ? "" : "non-");
  989. }
  990. /*
  991.  * We've set the hardware to assert ATN if we   
  992.  * get a parity error on "in" phases, so all we  
  993.  * need to do is stuff the message buffer with
  994.  * the appropriate message.  "In" phases have set
  995.  * mesg_out to something other than MSG_NOP.
  996.  */
  997. if (mesg_out != MSG_NOOP) {
  998. if (ahc->msg_type != MSG_TYPE_NONE)
  999. ahc->send_msg_perror = TRUE;
  1000. else
  1001. ahc_outb(ahc, MSG_OUT, mesg_out);
  1002. }
  1003. /*
  1004.  * Force a renegotiation with this target just in
  1005.  * case we are out of sync for some external reason
  1006.  * unknown (or unreported) by the target.
  1007.  */
  1008. ahc_force_renegotiation(ahc);
  1009. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1010. ahc_unpause(ahc);
  1011. } else if ((status & SELTO) != 0) {
  1012. u_int scbptr;
  1013. /* Stop the selection */
  1014. ahc_outb(ahc, SCSISEQ, 0);
  1015. /* No more pending messages */
  1016. ahc_clear_msg_state(ahc);
  1017. /* Clear interrupt state */
  1018. ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) & ~ENBUSFREE);
  1019. ahc_outb(ahc, CLRSINT1, CLRSELTIMEO|CLRBUSFREE|CLRSCSIPERR);
  1020. /*
  1021.  * Although the driver does not care about the
  1022.  * 'Selection in Progress' status bit, the busy
  1023.  * LED does.  SELINGO is only cleared by a sucessfull
  1024.  * selection, so we must manually clear it to insure
  1025.  * the LED turns off just incase no future successful
  1026.  * selections occur (e.g. no devices on the bus).
  1027.  */
  1028. ahc_outb(ahc, CLRSINT0, CLRSELINGO);
  1029. scbptr = ahc_inb(ahc, WAITING_SCBH);
  1030. ahc_outb(ahc, SCBPTR, scbptr);
  1031. scb_index = ahc_inb(ahc, SCB_TAG);
  1032. scb = ahc_lookup_scb(ahc, scb_index);
  1033. if (scb == NULL) {
  1034. printf("%s: ahc_intr - referenced scb not "
  1035.        "valid during SELTO scb(%d, %d)n",
  1036.        ahc_name(ahc), scbptr, scb_index);
  1037. } else {
  1038. ahc_set_transaction_status(scb, CAM_SEL_TIMEOUT);
  1039. ahc_freeze_devq(ahc, scb);
  1040. }
  1041. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1042. /*
  1043.  * Force a renegotiation with this target just in
  1044.  * case the cable was pulled and will later be
  1045.  * re-attached.  The target may forget its negotiation
  1046.  * settings with us should it attempt to reselect
  1047.  * during the interruption.  The target will not issue
  1048.  * a unit attention in this case, so we must always
  1049.  * renegotiate.
  1050.  */
  1051. ahc_force_renegotiation(ahc);
  1052. ahc_restart(ahc);
  1053. } else if ((status & BUSFREE) != 0
  1054. && (ahc_inb(ahc, SIMODE1) & ENBUSFREE) != 0) {
  1055. u_int lastphase;
  1056. u_int saved_scsiid;
  1057. u_int saved_lun;
  1058. u_int target;
  1059. u_int initiator_role_id;
  1060. char channel;
  1061. int printerror;
  1062. /*
  1063.  * Clear our selection hardware as soon as possible.
  1064.  * We may have an entry in the waiting Q for this target,
  1065.  * that is affected by this busfree and we don't want to
  1066.  * go about selecting the target while we handle the event.
  1067.  */
  1068. ahc_outb(ahc, SCSISEQ,
  1069.  ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
  1070. /*
  1071.  * Disable busfree interrupts and clear the busfree
  1072.  * interrupt status.  We do this here so that several
  1073.  * bus transactions occur prior to clearing the SCSIINT
  1074.  * latch.  It can take a bit for the clearing to take effect.
  1075.  */
  1076. ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) & ~ENBUSFREE);
  1077. ahc_outb(ahc, CLRSINT1, CLRBUSFREE|CLRSCSIPERR);
  1078. /*
  1079.  * Look at what phase we were last in.
  1080.  * If its message out, chances are pretty good
  1081.  * that the busfree was in response to one of
  1082.  * our abort requests.
  1083.  */
  1084. lastphase = ahc_inb(ahc, LASTPHASE);
  1085. saved_scsiid = ahc_inb(ahc, SAVED_SCSIID);
  1086. saved_lun = ahc_inb(ahc, SAVED_LUN);
  1087. target = SCSIID_TARGET(ahc, saved_scsiid);
  1088. initiator_role_id = SCSIID_OUR_ID(saved_scsiid);
  1089. channel = SCSIID_CHANNEL(ahc, saved_scsiid);
  1090. printerror = 1;
  1091. if (lastphase == P_MESGOUT) {
  1092. struct ahc_devinfo devinfo;
  1093. u_int tag;
  1094. ahc_fetch_devinfo(ahc, &devinfo);
  1095. tag = SCB_LIST_NULL;
  1096. if (ahc_sent_msg(ahc, AHCMSG_1B, MSG_ABORT_TAG, TRUE)
  1097.  || ahc_sent_msg(ahc, AHCMSG_1B, MSG_ABORT, TRUE)) {
  1098. if (ahc->msgout_buf[ahc->msgout_index - 1]
  1099.  == MSG_ABORT_TAG)
  1100. tag = scb->hscb->tag;
  1101. ahc_print_path(ahc, scb);
  1102. printf("SCB %d - Abort%s Completed.n",
  1103.        scb->hscb->tag, tag == SCB_LIST_NULL ?
  1104.        "" : " Tag");
  1105. ahc_abort_scbs(ahc, target, channel,
  1106.        saved_lun, tag,
  1107.        ROLE_INITIATOR,
  1108.        CAM_REQ_ABORTED);
  1109. printerror = 0;
  1110. } else if (ahc_sent_msg(ahc, AHCMSG_1B,
  1111. MSG_BUS_DEV_RESET, TRUE)) {
  1112. #ifdef __FreeBSD__
  1113. /*
  1114.  * Don't mark the user's request for this BDR
  1115.  * as completing with CAM_BDR_SENT.  CAM3
  1116.  * specifies CAM_REQ_CMP.
  1117.  */
  1118. if (scb != NULL
  1119.  && scb->io_ctx->ccb_h.func_code== XPT_RESET_DEV
  1120.  && ahc_match_scb(ahc, scb, target, channel,
  1121.   CAM_LUN_WILDCARD,
  1122.   SCB_LIST_NULL,
  1123.   ROLE_INITIATOR)) {
  1124. ahc_set_transaction_status(scb, CAM_REQ_CMP);
  1125. }
  1126. #endif
  1127. ahc_compile_devinfo(&devinfo,
  1128.     initiator_role_id,
  1129.     target,
  1130.     CAM_LUN_WILDCARD,
  1131.     channel,
  1132.     ROLE_INITIATOR);
  1133. ahc_handle_devreset(ahc, &devinfo,
  1134.     CAM_BDR_SENT,
  1135.     "Bus Device Reset",
  1136.     /*verbose_level*/0);
  1137. printerror = 0;
  1138. } else if (ahc_sent_msg(ahc, AHCMSG_EXT,
  1139. MSG_EXT_PPR, FALSE)) {
  1140. struct ahc_initiator_tinfo *tinfo;
  1141. struct ahc_tmode_tstate *tstate;
  1142. /*
  1143.  * PPR Rejected.  Try non-ppr negotiation
  1144.  * and retry command.
  1145.  */
  1146. tinfo = ahc_fetch_transinfo(ahc,
  1147.     devinfo.channel,
  1148.     devinfo.our_scsiid,
  1149.     devinfo.target,
  1150.     &tstate);
  1151. tinfo->curr.transport_version = 2;
  1152. tinfo->goal.transport_version = 2;
  1153. tinfo->goal.ppr_options = 0;
  1154. ahc_qinfifo_requeue_tail(ahc, scb);
  1155. printerror = 0;
  1156. } else if (ahc_sent_msg(ahc, AHCMSG_EXT,
  1157. MSG_EXT_WDTR, FALSE)
  1158. || ahc_sent_msg(ahc, AHCMSG_EXT,
  1159. MSG_EXT_SDTR, FALSE)) {
  1160. /*
  1161.  * Negotiation Rejected.  Go-async and
  1162.  * retry command.
  1163.  */
  1164. ahc_set_width(ahc, &devinfo,
  1165.       MSG_EXT_WDTR_BUS_8_BIT,
  1166.       AHC_TRANS_CUR|AHC_TRANS_GOAL,
  1167.       /*paused*/TRUE);
  1168. ahc_set_syncrate(ahc, &devinfo,
  1169. /*syncrate*/NULL,
  1170. /*period*/0, /*offset*/0,
  1171. /*ppr_options*/0,
  1172. AHC_TRANS_CUR|AHC_TRANS_GOAL,
  1173. /*paused*/TRUE);
  1174. ahc_qinfifo_requeue_tail(ahc, scb);
  1175. printerror = 0;
  1176. }
  1177. }
  1178. if (printerror != 0) {
  1179. u_int i;
  1180. if (scb != NULL) {
  1181. u_int tag;
  1182. if ((scb->hscb->control & TAG_ENB) != 0)
  1183. tag = scb->hscb->tag;
  1184. else
  1185. tag = SCB_LIST_NULL;
  1186. ahc_print_path(ahc, scb);
  1187. ahc_abort_scbs(ahc, target, channel,
  1188.        SCB_GET_LUN(scb), tag,
  1189.        ROLE_INITIATOR,
  1190.        CAM_UNEXP_BUSFREE);
  1191. } else {
  1192. /*
  1193.  * We had not fully identified this connection,
  1194.  * so we cannot abort anything.
  1195.  */
  1196. printf("%s: ", ahc_name(ahc));
  1197. }
  1198. for (i = 0; i < num_phases; i++) {
  1199. if (lastphase == ahc_phase_table[i].phase)
  1200. break;
  1201. }
  1202. printf("Unexpected busfree %sn"
  1203.        "SEQADDR == 0x%xn",
  1204.        ahc_phase_table[i].phasemsg,
  1205.        ahc_inb(ahc, SEQADDR0)
  1206. | (ahc_inb(ahc, SEQADDR1) << 8));
  1207. }
  1208. ahc_clear_msg_state(ahc);
  1209. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1210. ahc_restart(ahc);
  1211. } else {
  1212. printf("%s: Missing case in ahc_handle_scsiint. status = %xn",
  1213.        ahc_name(ahc), status);
  1214. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1215. }
  1216. }
  1217. /*
  1218.  * Force renegotiation to occur the next time we initiate
  1219.  * a command to the current device.
  1220.  */
  1221. static void
  1222. ahc_force_renegotiation(struct ahc_softc *ahc)
  1223. {
  1224. struct ahc_devinfo devinfo;
  1225. struct ahc_initiator_tinfo *targ_info;
  1226. struct ahc_tmode_tstate *tstate;
  1227. ahc_fetch_devinfo(ahc, &devinfo);
  1228. targ_info = ahc_fetch_transinfo(ahc,
  1229. devinfo.channel,
  1230. devinfo.our_scsiid,
  1231. devinfo.target,
  1232. &tstate);
  1233. ahc_update_neg_request(ahc, &devinfo, tstate,
  1234.        targ_info, /*force*/TRUE);
  1235. }
  1236. #define AHC_MAX_STEPS 2000
  1237. void
  1238. ahc_clear_critical_section(struct ahc_softc *ahc)
  1239. {
  1240. int stepping;
  1241. int steps;
  1242. u_int simode0;
  1243. u_int simode1;
  1244. if (ahc->num_critical_sections == 0)
  1245. return;
  1246. stepping = FALSE;
  1247. steps = 0;
  1248. simode0 = 0;
  1249. simode1 = 0;
  1250. for (;;) {
  1251. struct cs *cs;
  1252. u_int seqaddr;
  1253. u_int i;
  1254. seqaddr = ahc_inb(ahc, SEQADDR0)
  1255. | (ahc_inb(ahc, SEQADDR1) << 8);
  1256. /*
  1257.  * Seqaddr represents the next instruction to execute, 
  1258.  * so we are really executing the instruction just
  1259.  * before it.
  1260.  */
  1261. if (seqaddr != 0)
  1262. seqaddr -= 1;
  1263. cs = ahc->critical_sections;
  1264. for (i = 0; i < ahc->num_critical_sections; i++, cs++) {
  1265. if (cs->begin < seqaddr && cs->end >= seqaddr)
  1266. break;
  1267. }
  1268. if (i == ahc->num_critical_sections)
  1269. break;
  1270. if (steps > AHC_MAX_STEPS) {
  1271. printf("%s: Infinite loop in critical sectionn",
  1272.        ahc_name(ahc));
  1273. ahc_dump_card_state(ahc);
  1274. panic("critical section loop");
  1275. }
  1276. steps++;
  1277. if (stepping == FALSE) {
  1278. /*
  1279.  * Disable all interrupt sources so that the
  1280.  * sequencer will not be stuck by a pausing
  1281.  * interrupt condition while we attempt to
  1282.  * leave a critical section.
  1283.  */
  1284. simode0 = ahc_inb(ahc, SIMODE0);
  1285. ahc_outb(ahc, SIMODE0, 0);
  1286. simode1 = ahc_inb(ahc, SIMODE1);
  1287. ahc_outb(ahc, SIMODE1, 0);
  1288. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1289. ahc_outb(ahc, SEQCTL, ahc_inb(ahc, SEQCTL) | STEP);
  1290. stepping = TRUE;
  1291. }
  1292. ahc_outb(ahc, HCNTRL, ahc->unpause);
  1293. do {
  1294. ahc_delay(200);
  1295. } while (!ahc_is_paused(ahc));
  1296. }
  1297. if (stepping) {
  1298. ahc_outb(ahc, SIMODE0, simode0);
  1299. ahc_outb(ahc, SIMODE1, simode1);
  1300. ahc_outb(ahc, SEQCTL, ahc_inb(ahc, SEQCTL) & ~STEP);
  1301. }
  1302. }
  1303. /*
  1304.  * Clear any pending interrupt status.
  1305.  */
  1306. void
  1307. ahc_clear_intstat(struct ahc_softc *ahc)
  1308. {
  1309. /* Clear any interrupt conditions this may have caused */
  1310. ahc_outb(ahc, CLRSINT1, CLRSELTIMEO|CLRATNO|CLRSCSIRSTI
  1311. |CLRBUSFREE|CLRSCSIPERR|CLRPHASECHG|
  1312. CLRREQINIT);
  1313. ahc_outb(ahc, CLRSINT0, CLRSELDO|CLRSELDI|CLRSELINGO);
  1314. ahc_outb(ahc, CLRINT, CLRSCSIINT);
  1315. }
  1316. /**************************** Debugging Routines ******************************/
  1317. void
  1318. ahc_print_scb(struct scb *scb)
  1319. {
  1320. int i;
  1321. struct hardware_scb *hscb = scb->hscb;
  1322. printf("scb:%p control:0x%x scsiid:0x%x lun:%d cdb_len:%dn",
  1323.        (void *)scb,
  1324.        hscb->control,
  1325.        hscb->scsiid,
  1326.        hscb->lun,
  1327.        hscb->cdb_len);
  1328. printf("Shared Data: ");
  1329. for (i = 0; i < sizeof(hscb->shared_data.cdb); i++)
  1330. printf("%#02x", hscb->shared_data.cdb[i]);
  1331. printf("        dataptr:%#x datacnt:%#x sgptr:%#x tag:%#xn",
  1332. ahc_le32toh(hscb->dataptr),
  1333. ahc_le32toh(hscb->datacnt),
  1334. ahc_le32toh(hscb->sgptr),
  1335. hscb->tag);
  1336. if (scb->sg_count > 0) {
  1337. for (i = 0; i < scb->sg_count; i++) {
  1338. printf("sg[%d] - Addr 0x%x%x : Length %dn",
  1339.        i,
  1340.        (ahc_le32toh(scb->sg_list[i].len) >> 24
  1341.         & SG_HIGH_ADDR_BITS),
  1342.        ahc_le32toh(scb->sg_list[i].addr),
  1343.        ahc_le32toh(scb->sg_list[i].len));
  1344. }
  1345. }
  1346. }
  1347. /************************* Transfer Negotiation *******************************/
  1348. /*
  1349.  * Allocate per target mode instance (ID we respond to as a target)
  1350.  * transfer negotiation data structures.
  1351.  */
  1352. static struct ahc_tmode_tstate *
  1353. ahc_alloc_tstate(struct ahc_softc *ahc, u_int scsi_id, char channel)
  1354. {
  1355. struct ahc_tmode_tstate *master_tstate;
  1356. struct ahc_tmode_tstate *tstate;
  1357. int i;
  1358. master_tstate = ahc->enabled_targets[ahc->our_id];
  1359. if (channel == 'B') {
  1360. scsi_id += 8;
  1361. master_tstate = ahc->enabled_targets[ahc->our_id_b + 8];
  1362. }
  1363. if (ahc->enabled_targets[scsi_id] != NULL
  1364.  && ahc->enabled_targets[scsi_id] != master_tstate)
  1365. panic("%s: ahc_alloc_tstate - Target already allocated",
  1366.       ahc_name(ahc));
  1367. tstate = malloc(sizeof(*tstate), M_DEVBUF, M_NOWAIT);
  1368. if (tstate == NULL)
  1369. return (NULL);
  1370. /*
  1371.  * If we have allocated a master tstate, copy user settings from
  1372.  * the master tstate (taken from SRAM or the EEPROM) for this
  1373.  * channel, but reset our current and goal settings to async/narrow
  1374.  * until an initiator talks to us.
  1375.  */
  1376. if (master_tstate != NULL) {
  1377. memcpy(tstate, master_tstate, sizeof(*tstate));
  1378. memset(tstate->enabled_luns, 0, sizeof(tstate->enabled_luns));
  1379. tstate->ultraenb = 0;
  1380. for (i = 0; i < 16; i++) {
  1381. memset(&tstate->transinfo[i].curr, 0,
  1382.       sizeof(tstate->transinfo[i].curr));
  1383. memset(&tstate->transinfo[i].goal, 0,
  1384.       sizeof(tstate->transinfo[i].goal));
  1385. }
  1386. } else
  1387. memset(tstate, 0, sizeof(*tstate));
  1388. ahc->enabled_targets[scsi_id] = tstate;
  1389. return (tstate);
  1390. }
  1391. #ifdef AHC_TARGET_MODE
  1392. /*
  1393.  * Free per target mode instance (ID we respond to as a target)
  1394.  * transfer negotiation data structures.
  1395.  */
  1396. static void
  1397. ahc_free_tstate(struct ahc_softc *ahc, u_int scsi_id, char channel, int force)
  1398. {
  1399. struct ahc_tmode_tstate *tstate;
  1400. /*
  1401.  * Don't clean up our "master" tstate.
  1402.  * It has our default user settings.
  1403.  */
  1404. if (((channel == 'B' && scsi_id == ahc->our_id_b)
  1405.   || (channel == 'A' && scsi_id == ahc->our_id))
  1406.  && force == FALSE)
  1407. return;
  1408. if (channel == 'B')
  1409. scsi_id += 8;
  1410. tstate = ahc->enabled_targets[scsi_id];
  1411. if (tstate != NULL)
  1412. free(tstate, M_DEVBUF);
  1413. ahc->enabled_targets[scsi_id] = NULL;
  1414. }
  1415. #endif
  1416. /*
  1417.  * Called when we have an active connection to a target on the bus,
  1418.  * this function finds the nearest syncrate to the input period limited
  1419.  * by the capabilities of the bus connectivity of and sync settings for
  1420.  * the target.
  1421.  */
  1422. struct ahc_syncrate *
  1423. ahc_devlimited_syncrate(struct ahc_softc *ahc,
  1424. struct ahc_initiator_tinfo *tinfo,
  1425. u_int *period, u_int *ppr_options, role_t role) {
  1426. struct ahc_transinfo *transinfo;
  1427. u_int maxsync;
  1428. if ((ahc->features & AHC_ULTRA2) != 0) {
  1429. if ((ahc_inb(ahc, SBLKCTL) & ENAB40) != 0
  1430.  && (ahc_inb(ahc, SSTAT2) & EXP_ACTIVE) == 0) {
  1431. maxsync = AHC_SYNCRATE_DT;
  1432. } else {
  1433. maxsync = AHC_SYNCRATE_ULTRA;
  1434. /* Can't do DT on an SE bus */
  1435. *ppr_options &= ~MSG_EXT_PPR_DT_REQ;
  1436. }
  1437. } else if ((ahc->features & AHC_ULTRA) != 0) {
  1438. maxsync = AHC_SYNCRATE_ULTRA;
  1439. } else {
  1440. maxsync = AHC_SYNCRATE_FAST;
  1441. }
  1442. /*
  1443.  * Never allow a value higher than our current goal
  1444.  * period otherwise we may allow a target initiated
  1445.  * negotiation to go above the limit as set by the
  1446.  * user.  In the case of an initiator initiated
  1447.  * sync negotiation, we limit based on the user
  1448.  * setting.  This allows the system to still accept
  1449.  * incoming negotiations even if target initiated
  1450.  * negotiation is not performed.
  1451.  */
  1452. if (role == ROLE_TARGET)
  1453. transinfo = &tinfo->user;
  1454. else 
  1455. transinfo = &tinfo->goal;
  1456. *ppr_options &= transinfo->ppr_options;
  1457. if (transinfo->period == 0) {
  1458. *period = 0;
  1459. *ppr_options = 0;
  1460. return (NULL);
  1461. }
  1462. *period = MAX(*period, transinfo->period);
  1463. return (ahc_find_syncrate(ahc, period, ppr_options, maxsync));
  1464. }
  1465. /*
  1466.  * Look up the valid period to SCSIRATE conversion in our table.
  1467.  * Return the period and offset that should be sent to the target
  1468.  * if this was the beginning of an SDTR.
  1469.  */
  1470. struct ahc_syncrate *
  1471. ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
  1472.   u_int *ppr_options, u_int maxsync)
  1473. {
  1474. struct ahc_syncrate *syncrate;
  1475. if ((ahc->features & AHC_DT) == 0)
  1476. *ppr_options &= ~MSG_EXT_PPR_DT_REQ;
  1477. /* Skip all DT only entries if DT is not available */
  1478. if ((*ppr_options & MSG_EXT_PPR_DT_REQ) == 0
  1479.  && maxsync < AHC_SYNCRATE_ULTRA2)
  1480. maxsync = AHC_SYNCRATE_ULTRA2;
  1481. for (syncrate = &ahc_syncrates[maxsync];
  1482.      syncrate->rate != NULL;
  1483.      syncrate++) {
  1484. /*
  1485.  * The Ultra2 table doesn't go as low
  1486.  * as for the Fast/Ultra cards.
  1487.  */
  1488. if ((ahc->features & AHC_ULTRA2) != 0
  1489.  && (syncrate->sxfr_u2 == 0))
  1490. break;
  1491. if (*period <= syncrate->period) {
  1492. /*
  1493.  * When responding to a target that requests
  1494.  * sync, the requested rate may fall between
  1495.  * two rates that we can output, but still be
  1496.  * a rate that we can receive.  Because of this,
  1497.  * we want to respond to the target with
  1498.  * the same rate that it sent to us even
  1499.  * if the period we use to send data to it
  1500.  * is lower.  Only lower the response period
  1501.  * if we must.
  1502.  */
  1503. if (syncrate == &ahc_syncrates[maxsync])
  1504. *period = syncrate->period;
  1505. /*
  1506.  * At some speeds, we only support
  1507.  * ST transfers.
  1508.  */
  1509.   if ((syncrate->sxfr_u2 & ST_SXFR) != 0)
  1510. *ppr_options &= ~MSG_EXT_PPR_DT_REQ;
  1511. break;
  1512. }
  1513. }
  1514. if ((*period == 0)
  1515.  || (syncrate->rate == NULL)
  1516.  || ((ahc->features & AHC_ULTRA2) != 0
  1517.   && (syncrate->sxfr_u2 == 0))) {
  1518. /* Use asynchronous transfers. */
  1519. *period = 0;
  1520. syncrate = NULL;
  1521. *ppr_options &= ~MSG_EXT_PPR_DT_REQ;
  1522. }
  1523. return (syncrate);
  1524. }
  1525. /*
  1526.  * Convert from an entry in our syncrate table to the SCSI equivalent
  1527.  * sync "period" factor.
  1528.  */
  1529. u_int
  1530. ahc_find_period(struct ahc_softc *ahc, u_int scsirate, u_int maxsync)
  1531. {
  1532. struct ahc_syncrate *syncrate;
  1533. if ((ahc->features & AHC_ULTRA2) != 0)
  1534. scsirate &= SXFR_ULTRA2;
  1535. else
  1536. scsirate &= SXFR;
  1537. syncrate = &ahc_syncrates[maxsync];
  1538. while (syncrate->rate != NULL) {
  1539. if ((ahc->features & AHC_ULTRA2) != 0) {
  1540. if (syncrate->sxfr_u2 == 0)
  1541. break;
  1542. else if (scsirate == (syncrate->sxfr_u2 & SXFR_ULTRA2))
  1543. return (syncrate->period);
  1544. } else if (scsirate == (syncrate->sxfr & SXFR)) {
  1545. return (syncrate->period);
  1546. }
  1547. syncrate++;
  1548. }
  1549. return (0); /* async */
  1550. }
  1551. /*
  1552.  * Truncate the given synchronous offset to a value the
  1553.  * current adapter type and syncrate are capable of.
  1554.  */
  1555. void
  1556. ahc_validate_offset(struct ahc_softc *ahc,
  1557.     struct ahc_initiator_tinfo *tinfo,
  1558.     struct ahc_syncrate *syncrate,
  1559.     u_int *offset, int wide, role_t role)
  1560. {
  1561. u_int maxoffset;
  1562. /* Limit offset to what we can do */
  1563. if (syncrate == NULL) {
  1564. maxoffset = 0;
  1565. } else if ((ahc->features & AHC_ULTRA2) != 0) {
  1566. maxoffset = MAX_OFFSET_ULTRA2;
  1567. } else {
  1568. if (wide)
  1569. maxoffset = MAX_OFFSET_16BIT;
  1570. else
  1571. maxoffset = MAX_OFFSET_8BIT;
  1572. }
  1573. *offset = MIN(*offset, maxoffset);
  1574. if (tinfo != NULL) {
  1575. if (role == ROLE_TARGET)
  1576. *offset = MIN(*offset, tinfo->user.offset);
  1577. else
  1578. *offset = MIN(*offset, tinfo->goal.offset);
  1579. }
  1580. }
  1581. /*
  1582.  * Truncate the given transfer width parameter to a value the
  1583.  * current adapter type is capable of.
  1584.  */
  1585. void
  1586. ahc_validate_width(struct ahc_softc *ahc, struct ahc_initiator_tinfo *tinfo,
  1587.    u_int *bus_width, role_t role)
  1588. {
  1589. switch (*bus_width) {
  1590. default:
  1591. if (ahc->features & AHC_WIDE) {
  1592. /* Respond Wide */
  1593. *bus_width = MSG_EXT_WDTR_BUS_16_BIT;
  1594. break;
  1595. }
  1596. /* FALLTHROUGH */
  1597. case MSG_EXT_WDTR_BUS_8_BIT:
  1598. *bus_width = MSG_EXT_WDTR_BUS_8_BIT;
  1599. break;
  1600. }
  1601. if (tinfo != NULL) {
  1602. if (role == ROLE_TARGET)
  1603. *bus_width = MIN(tinfo->user.width, *bus_width);
  1604. else
  1605. *bus_width = MIN(tinfo->goal.width, *bus_width);
  1606. }
  1607. }
  1608. /*
  1609.  * Update the bitmask of targets for which the controller should
  1610.  * negotiate with at the next convenient oportunity.  This currently
  1611.  * means the next time we send the initial identify messages for
  1612.  * a new transaction.
  1613.  */
  1614. int
  1615. ahc_update_neg_request(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1616.        struct ahc_tmode_tstate *tstate,
  1617.        struct ahc_initiator_tinfo *tinfo, int force)
  1618. {
  1619. u_int auto_negotiate_orig;
  1620. auto_negotiate_orig = tstate->auto_negotiate;
  1621. if (tinfo->curr.period != tinfo->goal.period
  1622.  || tinfo->curr.width != tinfo->goal.width
  1623.  || tinfo->curr.offset != tinfo->goal.offset
  1624.  || tinfo->curr.ppr_options != tinfo->goal.ppr_options
  1625.  || (force
  1626.   && (tinfo->goal.period != 0
  1627.    || tinfo->goal.width != MSG_EXT_WDTR_BUS_8_BIT
  1628.    || tinfo->goal.ppr_options != 0)))
  1629. tstate->auto_negotiate |= devinfo->target_mask;
  1630. else
  1631. tstate->auto_negotiate &= ~devinfo->target_mask;
  1632. return (auto_negotiate_orig != tstate->auto_negotiate);
  1633. }
  1634. /*
  1635.  * Update the user/goal/curr tables of synchronous negotiation
  1636.  * parameters as well as, in the case of a current or active update,
  1637.  * any data structures on the host controller.  In the case of an
  1638.  * active update, the specified target is currently talking to us on
  1639.  * the bus, so the transfer parameter update must take effect
  1640.  * immediately.
  1641.  */
  1642. void
  1643. ahc_set_syncrate(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1644.  struct ahc_syncrate *syncrate, u_int period,
  1645.  u_int offset, u_int ppr_options, u_int type, int paused)
  1646. {
  1647. struct ahc_initiator_tinfo *tinfo;
  1648. struct ahc_tmode_tstate *tstate;
  1649. u_int old_period;
  1650. u_int old_offset;
  1651. u_int old_ppr;
  1652. int active;
  1653. int update_needed;
  1654. active = (type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE;
  1655. update_needed = 0;
  1656. if (syncrate == NULL) {
  1657. period = 0;
  1658. offset = 0;
  1659. }
  1660. tinfo = ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
  1661.     devinfo->target, &tstate);
  1662. if ((type & AHC_TRANS_USER) != 0) {
  1663. tinfo->user.period = period;
  1664. tinfo->user.offset = offset;
  1665. tinfo->user.ppr_options = ppr_options;
  1666. }
  1667. if ((type & AHC_TRANS_GOAL) != 0) {
  1668. tinfo->goal.period = period;
  1669. tinfo->goal.offset = offset;
  1670. tinfo->goal.ppr_options = ppr_options;
  1671. }
  1672. old_period = tinfo->curr.period;
  1673. old_offset = tinfo->curr.offset;
  1674. old_ppr    = tinfo->curr.ppr_options;
  1675. if ((type & AHC_TRANS_CUR) != 0
  1676.  && (old_period != period
  1677.   || old_offset != offset
  1678.   || old_ppr != ppr_options)) {
  1679. u_int scsirate;
  1680. update_needed++;
  1681. scsirate = tinfo->scsirate;
  1682. if ((ahc->features & AHC_ULTRA2) != 0) {
  1683. scsirate &= ~(SXFR_ULTRA2|SINGLE_EDGE|ENABLE_CRC);
  1684. if (syncrate != NULL) {
  1685. scsirate |= syncrate->sxfr_u2;
  1686. if ((ppr_options & MSG_EXT_PPR_DT_REQ) != 0)
  1687. scsirate |= ENABLE_CRC;
  1688. else
  1689. scsirate |= SINGLE_EDGE;
  1690. }
  1691. } else {
  1692. scsirate &= ~(SXFR|SOFS);
  1693. /*
  1694.  * Ensure Ultra mode is set properly for
  1695.  * this target.
  1696.  */
  1697. tstate->ultraenb &= ~devinfo->target_mask;
  1698. if (syncrate != NULL) {
  1699. if (syncrate->sxfr & ULTRA_SXFR) {
  1700. tstate->ultraenb |=
  1701. devinfo->target_mask;
  1702. }
  1703. scsirate |= syncrate->sxfr & SXFR;
  1704. scsirate |= offset & SOFS;
  1705. }
  1706. if (active) {
  1707. u_int sxfrctl0;
  1708. sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
  1709. sxfrctl0 &= ~FAST20;
  1710. if (tstate->ultraenb & devinfo->target_mask)
  1711. sxfrctl0 |= FAST20;
  1712. ahc_outb(ahc, SXFRCTL0, sxfrctl0);
  1713. }
  1714. }
  1715. if (active) {
  1716. ahc_outb(ahc, SCSIRATE, scsirate);
  1717. if ((ahc->features & AHC_ULTRA2) != 0)
  1718. ahc_outb(ahc, SCSIOFFSET, offset);
  1719. }
  1720. tinfo->scsirate = scsirate;
  1721. tinfo->curr.period = period;
  1722. tinfo->curr.offset = offset;
  1723. tinfo->curr.ppr_options = ppr_options;
  1724. ahc_send_async(ahc, devinfo->channel, devinfo->target,
  1725.        CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL);
  1726. if (bootverbose) {
  1727. if (offset != 0) {
  1728. printf("%s: target %d synchronous at %sMHz%s, "
  1729.        "offset = 0x%xn", ahc_name(ahc),
  1730.        devinfo->target, syncrate->rate,
  1731.        (ppr_options & MSG_EXT_PPR_DT_REQ)
  1732.        ? " DT" : "", offset);
  1733. } else {
  1734. printf("%s: target %d using "
  1735.        "asynchronous transfersn",
  1736.        ahc_name(ahc), devinfo->target);
  1737. }
  1738. }
  1739. }
  1740. update_needed += ahc_update_neg_request(ahc, devinfo, tstate,
  1741. tinfo, /*force*/FALSE);
  1742. if (update_needed)
  1743. ahc_update_pending_scbs(ahc);
  1744. }
  1745. /*
  1746.  * Update the user/goal/curr tables of wide negotiation
  1747.  * parameters as well as, in the case of a current or active update,
  1748.  * any data structures on the host controller.  In the case of an
  1749.  * active update, the specified target is currently talking to us on
  1750.  * the bus, so the transfer parameter update must take effect
  1751.  * immediately.
  1752.  */
  1753. void
  1754. ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1755.       u_int width, u_int type, int paused)
  1756. {
  1757. struct ahc_initiator_tinfo *tinfo;
  1758. struct ahc_tmode_tstate *tstate;
  1759. u_int oldwidth;
  1760. int active;
  1761. int update_needed;
  1762. active = (type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE;
  1763. update_needed = 0;
  1764. tinfo = ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
  1765.     devinfo->target, &tstate);
  1766. if ((type & AHC_TRANS_USER) != 0)
  1767. tinfo->user.width = width;
  1768. if ((type & AHC_TRANS_GOAL) != 0)
  1769. tinfo->goal.width = width;
  1770. oldwidth = tinfo->curr.width;
  1771. if ((type & AHC_TRANS_CUR) != 0 && oldwidth != width) {
  1772. u_int scsirate;
  1773. update_needed++;
  1774. scsirate =  tinfo->scsirate;
  1775. scsirate &= ~WIDEXFER;
  1776. if (width == MSG_EXT_WDTR_BUS_16_BIT)
  1777. scsirate |= WIDEXFER;
  1778. tinfo->scsirate = scsirate;
  1779. if (active)
  1780. ahc_outb(ahc, SCSIRATE, scsirate);
  1781. tinfo->curr.width = width;
  1782. ahc_send_async(ahc, devinfo->channel, devinfo->target,
  1783.        CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL);
  1784. if (bootverbose) {
  1785. printf("%s: target %d using %dbit transfersn",
  1786.        ahc_name(ahc), devinfo->target,
  1787.        8 * (0x01 << width));
  1788. }
  1789. }
  1790. update_needed += ahc_update_neg_request(ahc, devinfo, tstate,
  1791. tinfo, /*force*/FALSE);
  1792. if (update_needed)
  1793. ahc_update_pending_scbs(ahc);
  1794. }
  1795. /*
  1796.  * Update the current state of tagged queuing for a given target.
  1797.  */
  1798. void
  1799. ahc_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1800.      ahc_queue_alg alg)
  1801. {
  1802.   ahc_platform_set_tags(ahc, devinfo, alg);
  1803.   ahc_send_async(ahc, devinfo->channel, devinfo->target,
  1804.          devinfo->lun, AC_TRANSFER_NEG, &alg);
  1805. }
  1806. /*
  1807.  * When the transfer settings for a connection change, update any
  1808.  * in-transit SCBs to contain the new data so the hardware will
  1809.  * be set correctly during future (re)selections.
  1810.  */
  1811. static void
  1812. ahc_update_pending_scbs(struct ahc_softc *ahc)
  1813. {
  1814. struct scb *pending_scb;
  1815. int pending_scb_count;
  1816. int i;
  1817. int paused;
  1818. u_int saved_scbptr;
  1819. /*
  1820.  * Traverse the pending SCB list and ensure that all of the
  1821.  * SCBs there have the proper settings.
  1822.  */
  1823. pending_scb_count = 0;
  1824. LIST_FOREACH(pending_scb, &ahc->pending_scbs, pending_links) {
  1825. struct ahc_devinfo devinfo;
  1826. struct hardware_scb *pending_hscb;
  1827. struct ahc_initiator_tinfo *tinfo;
  1828. struct ahc_tmode_tstate *tstate;
  1829. ahc_scb_devinfo(ahc, &devinfo, pending_scb);
  1830. tinfo = ahc_fetch_transinfo(ahc, devinfo.channel,
  1831.     devinfo.our_scsiid,
  1832.     devinfo.target, &tstate);
  1833. pending_hscb = pending_scb->hscb;
  1834. pending_hscb->control &= ~ULTRAENB;
  1835. if ((tstate->ultraenb & devinfo.target_mask) != 0)
  1836. pending_hscb->control |= ULTRAENB;
  1837. pending_hscb->scsirate = tinfo->scsirate;
  1838. pending_hscb->scsioffset = tinfo->curr.offset;
  1839. if ((tstate->auto_negotiate & devinfo.target_mask) == 0
  1840.  && (pending_scb->flags & SCB_AUTO_NEGOTIATE) != 0) {
  1841. pending_scb->flags &= ~SCB_AUTO_NEGOTIATE;
  1842. pending_hscb->control &= ~MK_MESSAGE;
  1843. }
  1844. ahc_sync_scb(ahc, pending_scb,
  1845.      BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
  1846. pending_scb_count++;
  1847. }
  1848. if (pending_scb_count == 0)
  1849. return;
  1850. if (ahc_is_paused(ahc)) {
  1851. paused = 1;
  1852. } else {
  1853. paused = 0;
  1854. ahc_pause(ahc);
  1855. }
  1856. saved_scbptr = ahc_inb(ahc, SCBPTR);
  1857. /* Ensure that the hscbs down on the card match the new information */
  1858. for (i = 0; i < ahc->scb_data->maxhscbs; i++) {
  1859. struct hardware_scb *pending_hscb;
  1860. u_int control;
  1861. u_int scb_tag;
  1862. ahc_outb(ahc, SCBPTR, i);
  1863. scb_tag = ahc_inb(ahc, SCB_TAG);
  1864. pending_scb = ahc_lookup_scb(ahc, scb_tag);
  1865. if (pending_scb == NULL)
  1866. continue;
  1867. pending_hscb = pending_scb->hscb;
  1868. control = ahc_inb(ahc, SCB_CONTROL);
  1869. control &= ~(ULTRAENB|MK_MESSAGE);
  1870. control |= pending_hscb->control & (ULTRAENB|MK_MESSAGE);
  1871. ahc_outb(ahc, SCB_CONTROL, control);
  1872. ahc_outb(ahc, SCB_SCSIRATE, pending_hscb->scsirate);
  1873. ahc_outb(ahc, SCB_SCSIOFFSET, pending_hscb->scsioffset);
  1874. }
  1875. ahc_outb(ahc, SCBPTR, saved_scbptr);
  1876. if (paused == 0)
  1877. ahc_unpause(ahc);
  1878. }
  1879. /**************************** Pathing Information *****************************/
  1880. static void
  1881. ahc_fetch_devinfo(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  1882. {
  1883. u_int saved_scsiid;
  1884. role_t role;
  1885. int our_id;
  1886. if (ahc_inb(ahc, SSTAT0) & TARGET)
  1887. role = ROLE_TARGET;
  1888. else
  1889. role = ROLE_INITIATOR;
  1890. if (role == ROLE_TARGET
  1891.  && (ahc->features & AHC_MULTI_TID) != 0
  1892.  && (ahc_inb(ahc, SEQ_FLAGS) & CMDPHASE_PENDING) != 0) {
  1893. /* We were selected, so pull our id from TARGIDIN */
  1894. our_id = ahc_inb(ahc, TARGIDIN) & OID;
  1895. } else if ((ahc->features & AHC_ULTRA2) != 0)
  1896. our_id = ahc_inb(ahc, SCSIID_ULTRA2) & OID;
  1897. else
  1898. our_id = ahc_inb(ahc, SCSIID) & OID;
  1899. saved_scsiid = ahc_inb(ahc, SAVED_SCSIID);
  1900. ahc_compile_devinfo(devinfo,
  1901.     our_id,
  1902.     SCSIID_TARGET(ahc, saved_scsiid),
  1903.     ahc_inb(ahc, SAVED_LUN),
  1904.     SCSIID_CHANNEL(ahc, saved_scsiid),
  1905.     role);
  1906. }
  1907. struct ahc_phase_table_entry*
  1908. ahc_lookup_phase_entry(int phase)
  1909. {
  1910. struct ahc_phase_table_entry *entry;
  1911. struct ahc_phase_table_entry *last_entry;
  1912. /*
  1913.  * num_phases doesn't include the default entry which
  1914.  * will be returned if the phase doesn't match.
  1915.  */
  1916. last_entry = &ahc_phase_table[num_phases];
  1917. for (entry = ahc_phase_table; entry < last_entry; entry++) {
  1918. if (phase == entry->phase)
  1919. break;
  1920. }
  1921. return (entry);
  1922. }
  1923. void
  1924. ahc_compile_devinfo(struct ahc_devinfo *devinfo, u_int our_id, u_int target,
  1925.     u_int lun, char channel, role_t role)
  1926. {
  1927. devinfo->our_scsiid = our_id;
  1928. devinfo->target = target;
  1929. devinfo->lun = lun;
  1930. devinfo->target_offset = target;
  1931. devinfo->channel = channel;
  1932. devinfo->role = role;
  1933. if (channel == 'B')
  1934. devinfo->target_offset += 8;
  1935. devinfo->target_mask = (0x01 << devinfo->target_offset);
  1936. }
  1937. static void
  1938. ahc_scb_devinfo(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1939. struct scb *scb)
  1940. {
  1941. role_t role;
  1942. int our_id;
  1943. our_id = SCSIID_OUR_ID(scb->hscb->scsiid);
  1944. role = ROLE_INITIATOR;
  1945. if ((scb->hscb->control & TARGET_SCB) != 0)
  1946. role = ROLE_TARGET;
  1947. ahc_compile_devinfo(devinfo, our_id, SCB_GET_TARGET(ahc, scb),
  1948.     SCB_GET_LUN(scb), SCB_GET_CHANNEL(ahc, scb), role);
  1949. }
  1950. /************************ Message Phase Processing ****************************/
  1951. static void
  1952. ahc_assert_atn(struct ahc_softc *ahc)
  1953. {
  1954. u_int scsisigo;
  1955. scsisigo = ATNO;
  1956. if ((ahc->features & AHC_DT) == 0)
  1957. scsisigo |= ahc_inb(ahc, SCSISIGI);
  1958. ahc_outb(ahc, SCSISIGO, scsisigo);
  1959. }
  1960. /*
  1961.  * When an initiator transaction with the MK_MESSAGE flag either reconnects
  1962.  * or enters the initial message out phase, we are interrupted.  Fill our
  1963.  * outgoing message buffer with the appropriate message and beging handing
  1964.  * the message phase(s) manually.
  1965.  */
  1966. static void
  1967. ahc_setup_initiator_msgout(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1968.    struct scb *scb)
  1969. {
  1970. /*
  1971.  * To facilitate adding multiple messages together,
  1972.  * each routine should increment the index and len
  1973.  * variables instead of setting them explicitly.
  1974.  */
  1975. ahc->msgout_index = 0;
  1976. ahc->msgout_len = 0;
  1977. if ((scb->flags & SCB_DEVICE_RESET) == 0
  1978.  && ahc_inb(ahc, MSG_OUT) == MSG_IDENTIFYFLAG) {
  1979. u_int identify_msg;
  1980. identify_msg = MSG_IDENTIFYFLAG | SCB_GET_LUN(scb);
  1981. if ((scb->hscb->control & DISCENB) != 0)
  1982. identify_msg |= MSG_IDENTIFY_DISCFLAG;
  1983. ahc->msgout_buf[ahc->msgout_index++] = identify_msg;
  1984. ahc->msgout_len++;
  1985. if ((scb->hscb->control & TAG_ENB) != 0) {
  1986. ahc->msgout_buf[ahc->msgout_index++] =
  1987.     scb->hscb->control & (TAG_ENB|SCB_TAG_TYPE);
  1988. ahc->msgout_buf[ahc->msgout_index++] = scb->hscb->tag;
  1989. ahc->msgout_len += 2;
  1990. }
  1991. }
  1992. if (scb->flags & SCB_DEVICE_RESET) {
  1993. ahc->msgout_buf[ahc->msgout_index++] = MSG_BUS_DEV_RESET;
  1994. ahc->msgout_len++;
  1995. ahc_print_path(ahc, scb);
  1996. printf("Bus Device Reset Message Sentn");
  1997. /*
  1998.  * Clear our selection hardware in advance of
  1999.  * the busfree.  We may have an entry in the waiting
  2000.  * Q for this target, and we don't want to go about
  2001.  * selecting while we handle the busfree and blow it
  2002.  * away.
  2003.  */
  2004. ahc_outb(ahc, SCSISEQ, (ahc_inb(ahc, SCSISEQ) & ~ENSELO));
  2005. } else if ((scb->flags & SCB_ABORT) != 0) {
  2006. if ((scb->hscb->control & TAG_ENB) != 0)
  2007. ahc->msgout_buf[ahc->msgout_index++] = MSG_ABORT_TAG;
  2008. else
  2009. ahc->msgout_buf[ahc->msgout_index++] = MSG_ABORT;
  2010. ahc->msgout_len++;
  2011. ahc_print_path(ahc, scb);
  2012. printf("Abort%s Message Sentn",
  2013.        (scb->hscb->control & TAG_ENB) != 0 ? " Tag" : "");
  2014. /*
  2015.  * Clear our selection hardware in advance of
  2016.  * the busfree.  We may have an entry in the waiting
  2017.  * Q for this target, and we don't want to go about
  2018.  * selecting while we handle the busfree and blow it
  2019.  * away.
  2020.  */
  2021. ahc_outb(ahc, SCSISEQ, (ahc_inb(ahc, SCSISEQ) & ~ENSELO));
  2022. } else if ((scb->flags & (SCB_AUTO_NEGOTIATE|SCB_NEGOTIATE)) != 0) {
  2023. ahc_build_transfer_msg(ahc, devinfo);
  2024. } else {
  2025. printf("ahc_intr: AWAITING_MSG for an SCB that "
  2026.        "does not have a waiting messagen");
  2027. printf("SCSIID = %x, target_mask = %xn", scb->hscb->scsiid,
  2028.        devinfo->target_mask);
  2029. panic("SCB = %d, SCB Control = %x, MSG_OUT = %x "
  2030.       "SCB flags = %x", scb->hscb->tag, scb->hscb->control,
  2031.       ahc_inb(ahc, MSG_OUT), scb->flags);
  2032. }
  2033. /*
  2034.  * Clear the MK_MESSAGE flag from the SCB so we aren't
  2035.  * asked to send this message again.
  2036.  */
  2037. ahc_outb(ahc, SCB_CONTROL, ahc_inb(ahc, SCB_CONTROL) & ~MK_MESSAGE);
  2038. scb->hscb->control &= ~MK_MESSAGE;
  2039. ahc->msgout_index = 0;
  2040. ahc->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
  2041. }
  2042. /*
  2043.  * Build an appropriate transfer negotiation message for the
  2044.  * currently active target.
  2045.  */
  2046. static void
  2047. ahc_build_transfer_msg(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  2048. {
  2049. /*
  2050.  * We need to initiate transfer negotiations.
  2051.  * If our current and goal settings are identical,
  2052.  * we want to renegotiate due to a check condition.
  2053.  */
  2054. struct ahc_initiator_tinfo *tinfo;
  2055. struct ahc_tmode_tstate *tstate;
  2056. struct ahc_syncrate *rate;
  2057. int dowide;
  2058. int dosync;
  2059. int doppr;
  2060. int use_ppr;
  2061. u_int period;
  2062. u_int ppr_options;
  2063. u_int offset;
  2064. tinfo = ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
  2065.     devinfo->target, &tstate);
  2066. /*
  2067.  * Filter our period based on the current connection.
  2068.  * If we can't perform DT transfers on this segment (not in LVD
  2069.  * mode for instance), then our decision to issue a PPR message
  2070.  * may change.
  2071.  */
  2072. period = tinfo->goal.period;
  2073. ppr_options = tinfo->goal.ppr_options;
  2074. /* Target initiated PPR is not allowed in the SCSI spec */
  2075. if (devinfo->role == ROLE_TARGET)
  2076. ppr_options = 0;
  2077. rate = ahc_devlimited_syncrate(ahc, tinfo, &period,
  2078.        &ppr_options, devinfo->role);
  2079. dowide = tinfo->curr.width != tinfo->goal.width;
  2080. dosync = tinfo->curr.period != period;
  2081. doppr = tinfo->curr.ppr_options != ppr_options;
  2082. if (!dowide && !dosync && !doppr) {
  2083. dowide = tinfo->goal.width != MSG_EXT_WDTR_BUS_8_BIT;
  2084. dosync = tinfo->goal.period != 0;
  2085. doppr = tinfo->goal.ppr_options != 0;
  2086. }
  2087. if (!dowide && !dosync && !doppr) {
  2088. panic("ahc_intr: AWAITING_MSG for negotiation, "
  2089.       "but no negotiation neededn");
  2090. }
  2091. use_ppr = (tinfo->curr.transport_version >= 3) || doppr;
  2092. /* Target initiated PPR is not allowed in the SCSI spec */
  2093. if (devinfo->role == ROLE_TARGET)
  2094. use_ppr = 0;
  2095. /*
  2096.  * Both the PPR message and SDTR message require the
  2097.  * goal syncrate to be limited to what the target device
  2098.  * is capable of handling (based on whether an LVD->SE
  2099.  * expander is on the bus), so combine these two cases.
  2100.  * Regardless, guarantee that if we are using WDTR and SDTR
  2101.  * messages that WDTR comes first.
  2102.  */
  2103. if (use_ppr || (dosync && !dowide)) {
  2104. offset = tinfo->goal.offset;
  2105. ahc_validate_offset(ahc, tinfo, rate, &offset,
  2106.     use_ppr ? tinfo->goal.width
  2107.     : tinfo->curr.width,
  2108.     devinfo->role);
  2109. if (use_ppr) {
  2110. ahc_construct_ppr(ahc, devinfo, period, offset,
  2111.   tinfo->goal.width, ppr_options);
  2112. } else {
  2113. ahc_construct_sdtr(ahc, devinfo, period, offset);
  2114. }
  2115. } else {
  2116. ahc_construct_wdtr(ahc, devinfo, tinfo->goal.width);
  2117. }
  2118. }
  2119. /*
  2120.  * Build a synchronous negotiation message in our message
  2121.  * buffer based on the input parameters.
  2122.  */
  2123. static void
  2124. ahc_construct_sdtr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  2125.    u_int period, u_int offset)
  2126. {
  2127. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED;
  2128. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_SDTR_LEN;
  2129. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_SDTR;
  2130. ahc->msgout_buf[ahc->msgout_index++] = period;
  2131. ahc->msgout_buf[ahc->msgout_index++] = offset;
  2132. ahc->msgout_len += 5;
  2133. if (bootverbose) {
  2134. printf("(%s:%c:%d:%d): Sending SDTR period %x, offset %xn",
  2135.        ahc_name(ahc), devinfo->channel, devinfo->target,
  2136.        devinfo->lun, period, offset);
  2137. }
  2138. }
  2139. /*
  2140.  * Build a wide negotiation message in our message
  2141.  * buffer based on the input parameters.
  2142.  */
  2143. static void
  2144. ahc_construct_wdtr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  2145.    u_int bus_width)
  2146. {
  2147. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED;
  2148. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_WDTR_LEN;
  2149. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_WDTR;
  2150. ahc->msgout_buf[ahc->msgout_index++] = bus_width;
  2151. ahc->msgout_len += 4;
  2152. if (bootverbose) {
  2153. printf("(%s:%c:%d:%d): Sending WDTR %xn",
  2154.        ahc_name(ahc), devinfo->channel, devinfo->target,
  2155.        devinfo->lun, bus_width);
  2156. }
  2157. }
  2158. /*
  2159.  * Build a parallel protocol request message in our message
  2160.  * buffer based on the input parameters.
  2161.  */
  2162. static void
  2163. ahc_construct_ppr(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  2164.   u_int period, u_int offset, u_int bus_width,
  2165.   u_int ppr_options)
  2166. {
  2167. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXTENDED;
  2168. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_PPR_LEN;
  2169. ahc->msgout_buf[ahc->msgout_index++] = MSG_EXT_PPR;
  2170. ahc->msgout_buf[ahc->msgout_index++] = period;
  2171. ahc->msgout_buf[ahc->msgout_index++] = 0;
  2172. ahc->msgout_buf[ahc->msgout_index++] = offset;
  2173. ahc->msgout_buf[ahc->msgout_index++] = bus_width;
  2174. ahc->msgout_buf[ahc->msgout_index++] = ppr_options;
  2175. ahc->msgout_len += 8;
  2176. if (bootverbose) {
  2177. printf("(%s:%c:%d:%d): Sending PPR bus_width %x, period %x, "
  2178.        "offset %x, ppr_options %xn", ahc_name(ahc),
  2179.        devinfo->channel, devinfo->target, devinfo->lun,
  2180.        bus_width, period, offset, ppr_options);
  2181. }
  2182. }
  2183. /*
  2184.  * Clear any active message state.
  2185.  */
  2186. static void
  2187. ahc_clear_msg_state(struct ahc_softc *ahc)
  2188. {
  2189. ahc->msgout_len = 0;
  2190. ahc->msgin_index = 0;
  2191. ahc->msg_type = MSG_TYPE_NONE;
  2192. if ((ahc_inb(ahc, SCSISIGI) & ATNI) != 0) {
  2193. /*
  2194.  * The target didn't care to respond to our
  2195.  * message request, so clear ATN.
  2196.  */
  2197. ahc_outb(ahc, CLRSINT1, CLRATNO);
  2198. }
  2199. ahc_outb(ahc, MSG_OUT, MSG_NOOP);
  2200. ahc_outb(ahc, SEQ_FLAGS2,
  2201.  ahc_inb(ahc, SEQ_FLAGS2) & ~TARGET_MSG_PENDING);
  2202. }
  2203. /*
  2204.  * Manual message loop handler.
  2205.  */
  2206. static void
  2207. ahc_handle_message_phase(struct ahc_softc *ahc)
  2208. struct ahc_devinfo devinfo;
  2209. u_int bus_phase;
  2210. int end_session;
  2211. ahc_fetch_devinfo(ahc, &devinfo);
  2212. end_session = FALSE;
  2213. bus_phase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
  2214. reswitch:
  2215. switch (ahc->msg_type) {
  2216. case MSG_TYPE_INITIATOR_MSGOUT:
  2217. {
  2218. int lastbyte;
  2219. int phasemis;
  2220. int msgdone;
  2221. if (ahc->msgout_len == 0)
  2222. panic("HOST_MSG_LOOP interrupt with no active message");
  2223. phasemis = bus_phase != P_MESGOUT;
  2224. if (phasemis) {
  2225. if (bus_phase == P_MESGIN) {
  2226. /*
  2227.  * Change gears and see if
  2228.  * this messages is of interest to
  2229.  * us or should be passed back to
  2230.  * the sequencer.
  2231.  */
  2232. ahc_outb(ahc, CLRSINT1, CLRATNO);
  2233. ahc->send_msg_perror = FALSE;
  2234. ahc->msg_type = MSG_TYPE_INITIATOR_MSGIN;
  2235. ahc->msgin_index = 0;
  2236. goto reswitch;
  2237. }
  2238. end_session = TRUE;
  2239. break;
  2240. }
  2241. if (ahc->send_msg_perror) {
  2242. ahc_outb(ahc, CLRSINT1, CLRATNO);
  2243. ahc_outb(ahc, CLRSINT1, CLRREQINIT);
  2244. ahc_outb(ahc, SCSIDATL, MSG_PARITY_ERROR);
  2245. break;
  2246. }
  2247. msgdone = ahc->msgout_index == ahc->msgout_len;
  2248. if (msgdone) {
  2249. /*
  2250.  * The target has requested a retry.
  2251.  * Re-assert ATN, reset our message index to
  2252.  * 0, and try again.
  2253.  */
  2254. ahc->msgout_index = 0;
  2255. ahc_assert_atn(ahc);
  2256. }
  2257. lastbyte = ahc->msgout_index == (ahc->msgout_len - 1);
  2258. if (lastbyte) {
  2259. /* Last byte is signified by dropping ATN */
  2260. ahc_outb(ahc, CLRSINT1, CLRATNO);
  2261. }
  2262. /*
  2263.  * Clear our interrupt status and present
  2264.  * the next byte on the bus.
  2265.  */
  2266. ahc_outb(ahc, CLRSINT1, CLRREQINIT);
  2267. ahc_outb(ahc, SCSIDATL, ahc->msgout_buf[ahc->msgout_index++]);
  2268. break;
  2269. }
  2270. case MSG_TYPE_INITIATOR_MSGIN:
  2271. {
  2272. int phasemis;
  2273. int message_done;
  2274. phasemis = bus_phase != P_MESGIN;
  2275. if (phasemis) {
  2276. ahc->msgin_index = 0;
  2277. if (bus_phase == P_MESGOUT
  2278.  && (ahc->send_msg_perror == TRUE
  2279.   || (ahc->msgout_len != 0
  2280.    && ahc->msgout_index == 0))) {
  2281. ahc->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
  2282. goto reswitch;
  2283. }
  2284. end_session = TRUE;
  2285. break;
  2286. }
  2287. /* Pull the byte in without acking it */
  2288. ahc->msgin_buf[ahc->msgin_index] = ahc_inb(ahc, SCSIBUSL);
  2289. message_done = ahc_parse_msg(ahc, &devinfo);
  2290. if (message_done) {
  2291. /*
  2292.  * Clear our incoming message buffer in case there
  2293.  * is another message following this one.
  2294.  */
  2295. ahc->msgin_index = 0;
  2296. /*
  2297.  * If this message illicited a response,
  2298.  * assert ATN so the target takes us to the
  2299.  * message out phase.
  2300.  */
  2301. if (ahc->msgout_len != 0)
  2302. ahc_assert_atn(ahc);
  2303. } else 
  2304. ahc->msgin_index++;
  2305. /* Ack the byte */
  2306. ahc_outb(ahc, CLRSINT1, CLRREQINIT);
  2307. ahc_inb(ahc, SCSIDATL);
  2308. break;
  2309. }
  2310. case MSG_TYPE_TARGET_MSGIN:
  2311. {
  2312. int msgdone;
  2313. int msgout_request;
  2314. if (ahc->msgout_len == 0)
  2315. panic("Target MSGIN with no active message");
  2316. /*
  2317.  * If we interrupted a mesgout session, the initiator
  2318.  * will not know this until our first REQ.  So, we
  2319.  * only honor mesgout requests after we've sent our
  2320.  * first byte.
  2321.  */
  2322. if ((ahc_inb(ahc, SCSISIGI) & ATNI) != 0
  2323.  && ahc->msgout_index > 0)
  2324. msgout_request = TRUE;
  2325. else
  2326. msgout_request = FALSE;
  2327. if (msgout_request) {
  2328. /*
  2329.  * Change gears and see if
  2330.  * this messages is of interest to
  2331.  * us or should be passed back to
  2332.  * the sequencer.
  2333.  */
  2334. ahc->msg_type = MSG_TYPE_TARGET_MSGOUT;
  2335. ahc_outb(ahc, SCSISIGO, P_MESGOUT | BSYO);
  2336. ahc->msgin_index = 0;
  2337. /* Dummy read to REQ for first byte */
  2338. ahc_inb(ahc, SCSIDATL);
  2339. ahc_outb(ahc, SXFRCTL0,
  2340.  ahc_inb(ahc, SXFRCTL0) | SPIOEN);
  2341. break;
  2342. }
  2343. msgdone = ahc->msgout_index == ahc->msgout_len;
  2344. if (msgdone) {
  2345. ahc_outb(ahc, SXFRCTL0,
  2346.  ahc_inb(ahc, SXFRCTL0) & ~SPIOEN);
  2347. end_session = TRUE;
  2348. break;
  2349. }
  2350. /*
  2351.  * Present the next byte on the bus.
  2352.  */
  2353. ahc_outb(ahc, SXFRCTL0, ahc_inb(ahc, SXFRCTL0) | SPIOEN);
  2354. ahc_outb(ahc, SCSIDATL, ahc->msgout_buf[ahc->msgout_index++]);
  2355. break;
  2356. }
  2357. case MSG_TYPE_TARGET_MSGOUT:
  2358. {
  2359. int lastbyte;
  2360. int msgdone;
  2361. /*
  2362.  * The initiator signals that this is
  2363.  * the last byte by dropping ATN.
  2364.  */
  2365. lastbyte = (ahc_inb(ahc, SCSISIGI) & ATNI) == 0;
  2366. /*
  2367.  * Read the latched byte, but turn off SPIOEN first
  2368.  * so that we don't inadvertantly cause a REQ for the
  2369.  * next byte.
  2370.  */
  2371. ahc_outb(ahc, SXFRCTL0, ahc_inb(ahc, SXFRCTL0) & ~SPIOEN);
  2372. ahc->msgin_buf[ahc->msgin_index] = ahc_inb(ahc, SCSIDATL);
  2373. msgdone = ahc_parse_msg(ahc, &devinfo);
  2374. if (msgdone == MSGLOOP_TERMINATED) {
  2375. /*
  2376.  * The message is *really* done in that it caused
  2377.  * us to go to bus free.  The sequencer has already
  2378.  * been reset at this point, so pull the ejection
  2379.  * handle.
  2380.  */
  2381. return;
  2382. }
  2383. ahc->msgin_index++;
  2384. /*
  2385.  * XXX Read spec about initiator dropping ATN too soon
  2386.  *     and use msgdone to detect it.
  2387.  */
  2388. if (msgdone == MSGLOOP_MSGCOMPLETE) {
  2389. ahc->msgin_index = 0;
  2390. /*
  2391.  * If this message illicited a response, transition
  2392.  * to the Message in phase and send it.
  2393.  */
  2394. if (ahc->msgout_len != 0) {
  2395. ahc_outb(ahc, SCSISIGO, P_MESGIN | BSYO);
  2396. ahc_outb(ahc, SXFRCTL0,
  2397.  ahc_inb(ahc, SXFRCTL0) | SPIOEN);
  2398. ahc->msg_type = MSG_TYPE_TARGET_MSGIN;
  2399. ahc->msgin_index = 0;
  2400. break;
  2401. }
  2402. }
  2403. if (lastbyte)
  2404. end_session = TRUE;
  2405. else {
  2406. /* Ask for the next byte. */
  2407. ahc_outb(ahc, SXFRCTL0,
  2408.  ahc_inb(ahc, SXFRCTL0) | SPIOEN);
  2409. }
  2410. break;
  2411. }
  2412. default:
  2413. panic("Unknown REQINIT message type");
  2414. }
  2415. if (end_session) {
  2416. ahc_clear_msg_state(ahc);
  2417. ahc_outb(ahc, RETURN_1, EXIT_MSG_LOOP);
  2418. } else
  2419. ahc_outb(ahc, RETURN_1, CONT_MSG_LOOP);
  2420. }
  2421. /*
  2422.  * See if we sent a particular extended message to the target.
  2423.  * If "full" is true, return true only if the target saw the full
  2424.  * message.  If "full" is false, return true if the target saw at
  2425.  * least the first byte of the message.
  2426.  */
  2427. static int
  2428. ahc_sent_msg(struct ahc_softc *ahc, ahc_msgtype type, u_int msgval, int full)
  2429. {
  2430. int found;
  2431. u_int index;
  2432. found = FALSE;
  2433. index = 0;
  2434. while (index < ahc->msgout_len) {
  2435. if (ahc->msgout_buf[index] == MSG_EXTENDED) {
  2436. u_int end_index;
  2437. end_index = index + 1 + ahc->msgout_buf[index + 1];
  2438. if (ahc->msgout_buf[index+2] == msgval
  2439.  && type == AHCMSG_EXT) {
  2440. if (full) {
  2441. if (ahc->msgout_index > end_index)
  2442. found = TRUE;
  2443. } else if (ahc->msgout_index > index)
  2444. found = TRUE;
  2445. }
  2446. index = end_index;
  2447. } else if (ahc->msgout_buf[index] >= MSG_SIMPLE_TASK
  2448. && ahc->msgout_buf[index] <= MSG_IGN_WIDE_RESIDUE) {
  2449. /* Skip tag type and tag id or residue param*/
  2450. index += 2;
  2451. } else {
  2452. /* Single byte message */
  2453. if (type == AHCMSG_1B
  2454.  && ahc->msgout_buf[index] == msgval
  2455.  && ahc->msgout_index > index)
  2456. found = TRUE;
  2457. index++;
  2458. }
  2459. if (found)
  2460. break;
  2461. }
  2462. return (found);
  2463. }
  2464. /*
  2465.  * Wait for a complete incoming message, parse it, and respond accordingly.
  2466.  */
  2467. static int
  2468. ahc_parse_msg(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  2469. {
  2470. struct ahc_initiator_tinfo *tinfo;
  2471. struct ahc_tmode_tstate *tstate;
  2472. int reject;
  2473. int done;
  2474. int response;
  2475. u_int targ_scsirate;
  2476. done = MSGLOOP_IN_PROG;
  2477. response = FALSE;
  2478. reject = FALSE;
  2479. tinfo = ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
  2480.     devinfo->target, &tstate);
  2481. targ_scsirate = tinfo->scsirate;
  2482. /*
  2483.  * Parse as much of the message as is availible,
  2484.  * rejecting it if we don't support it.  When
  2485.  * the entire message is availible and has been
  2486.  * handled, return MSGLOOP_MSGCOMPLETE, indicating
  2487.  * that we have parsed an entire message.
  2488.  *
  2489.  * In the case of extended messages, we accept the length
  2490.  * byte outright and perform more checking once we know the
  2491.  * extended message type.
  2492.  */
  2493. switch (ahc->msgin_buf[0]) {
  2494. case MSG_MESSAGE_REJECT:
  2495. response = ahc_handle_msg_reject(ahc, devinfo);
  2496. /* FALLTHROUGH */
  2497. case MSG_NOOP:
  2498. done = MSGLOOP_MSGCOMPLETE;
  2499. break;
  2500. case MSG_EXTENDED:
  2501. {
  2502. /* Wait for enough of the message to begin validation */
  2503. if (ahc->msgin_index < 2)
  2504. break;
  2505. switch (ahc->msgin_buf[2]) {
  2506. case MSG_EXT_SDTR:
  2507. {
  2508. struct  ahc_syncrate *syncrate;
  2509. u_int  period;
  2510. u_int  ppr_options;
  2511. u_int  offset;
  2512. u_int  saved_offset;
  2513. if (ahc->msgin_buf[1] != MSG_EXT_SDTR_LEN) {
  2514. reject = TRUE;
  2515. break;
  2516. }
  2517. /*
  2518.  * Wait until we have both args before validating
  2519.  * and acting on this message.
  2520.  *
  2521.  * Add one to MSG_EXT_SDTR_LEN to account for
  2522.  * the extended message preamble.
  2523.  */
  2524. if (ahc->msgin_index < (MSG_EXT_SDTR_LEN + 1))
  2525. break;
  2526. period = ahc->msgin_buf[3];
  2527. ppr_options = 0;
  2528. saved_offset = offset = ahc->msgin_buf[4];
  2529. syncrate = ahc_devlimited_syncrate(ahc, tinfo, &period,
  2530.    &ppr_options,
  2531.    devinfo->role);
  2532. ahc_validate_offset(ahc, tinfo, syncrate, &offset,
  2533.     targ_scsirate & WIDEXFER,
  2534.     devinfo->role);
  2535. if (bootverbose) {
  2536. printf("(%s:%c:%d:%d): Received "
  2537.        "SDTR period %x, offset %xnt"
  2538.        "Filtered to period %x, offset %xn",
  2539.        ahc_name(ahc), devinfo->channel,
  2540.        devinfo->target, devinfo->lun,
  2541.        ahc->msgin_buf[3], saved_offset,
  2542.        period, offset);
  2543. }
  2544. ahc_set_syncrate(ahc, devinfo, 
  2545.  syncrate, period,
  2546.  offset, ppr_options,
  2547.  AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2548.  /*paused*/TRUE);
  2549. /*
  2550.  * See if we initiated Sync Negotiation
  2551.  * and didn't have to fall down to async
  2552.  * transfers.
  2553.  */
  2554. if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_SDTR, TRUE)) {
  2555. /* We started it */
  2556. if (saved_offset != offset) {
  2557. /* Went too low - force async */
  2558. reject = TRUE;
  2559. }
  2560. } else {
  2561. /*
  2562.  * Send our own SDTR in reply
  2563.  */
  2564. if (bootverbose
  2565.  && devinfo->role == ROLE_INITIATOR) {
  2566. printf("(%s:%c:%d:%d): Target "
  2567.        "Initiated SDTRn",
  2568.        ahc_name(ahc), devinfo->channel,
  2569.        devinfo->target, devinfo->lun);
  2570. }
  2571. ahc->msgout_index = 0;
  2572. ahc->msgout_len = 0;
  2573. ahc_construct_sdtr(ahc, devinfo,
  2574.    period, offset);
  2575. ahc->msgout_index = 0;
  2576. response = TRUE;
  2577. }
  2578. done = MSGLOOP_MSGCOMPLETE;
  2579. break;
  2580. }
  2581. case MSG_EXT_WDTR:
  2582. {
  2583. u_int bus_width;
  2584. u_int saved_width;
  2585. u_int sending_reply;
  2586. sending_reply = FALSE;
  2587. if (ahc->msgin_buf[1] != MSG_EXT_WDTR_LEN) {
  2588. reject = TRUE;
  2589. break;
  2590. }
  2591. /*
  2592.  * Wait until we have our arg before validating
  2593.  * and acting on this message.
  2594.  *
  2595.  * Add one to MSG_EXT_WDTR_LEN to account for
  2596.  * the extended message preamble.
  2597.  */
  2598. if (ahc->msgin_index < (MSG_EXT_WDTR_LEN + 1))
  2599. break;
  2600. bus_width = ahc->msgin_buf[3];
  2601. saved_width = bus_width;
  2602. ahc_validate_width(ahc, tinfo, &bus_width,
  2603.    devinfo->role);
  2604. if (bootverbose) {
  2605. printf("(%s:%c:%d:%d): Received WDTR "
  2606.        "%x filtered to %xn",
  2607.        ahc_name(ahc), devinfo->channel,
  2608.        devinfo->target, devinfo->lun,
  2609.        saved_width, bus_width);
  2610. }
  2611. if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_WDTR, TRUE)) {
  2612. /*
  2613.  * Don't send a WDTR back to the
  2614.  * target, since we asked first.
  2615.  * If the width went higher than our
  2616.  * request, reject it.
  2617.  */
  2618. if (saved_width > bus_width) {
  2619. reject = TRUE;
  2620. printf("(%s:%c:%d:%d): requested %dBit "
  2621.        "transfers.  Rejecting...n",
  2622.        ahc_name(ahc), devinfo->channel,
  2623.        devinfo->target, devinfo->lun,
  2624.        8 * (0x01 << bus_width));
  2625. bus_width = 0;
  2626. }
  2627. } else {
  2628. /*
  2629.  * Send our own WDTR in reply
  2630.  */
  2631. if (bootverbose
  2632.  && devinfo->role == ROLE_INITIATOR) {
  2633. printf("(%s:%c:%d:%d): Target "
  2634.        "Initiated WDTRn",
  2635.        ahc_name(ahc), devinfo->channel,
  2636.        devinfo->target, devinfo->lun);
  2637. }
  2638. ahc->msgout_index = 0;
  2639. ahc->msgout_len = 0;
  2640. ahc_construct_wdtr(ahc, devinfo, bus_width);
  2641. ahc->msgout_index = 0;
  2642. response = TRUE;
  2643. sending_reply = TRUE;
  2644. }
  2645. ahc_set_width(ahc, devinfo, bus_width,
  2646.       AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2647.       /*paused*/TRUE);
  2648. /* After a wide message, we are async */
  2649. ahc_set_syncrate(ahc, devinfo,
  2650.  /*syncrate*/NULL, /*period*/0,
  2651.  /*offset*/0, /*ppr_options*/0,
  2652.  AHC_TRANS_ACTIVE, /*paused*/TRUE);
  2653. if (sending_reply == FALSE && reject == FALSE) {
  2654. if (tinfo->goal.period) {
  2655. ahc->msgout_index = 0;
  2656. ahc->msgout_len = 0;
  2657. ahc_build_transfer_msg(ahc, devinfo);
  2658. ahc->msgout_index = 0;
  2659. response = TRUE;
  2660. }
  2661. }
  2662. done = MSGLOOP_MSGCOMPLETE;
  2663. break;
  2664. }
  2665. case MSG_EXT_PPR:
  2666. {
  2667. struct ahc_syncrate *syncrate;
  2668. u_int period;
  2669. u_int offset;
  2670. u_int bus_width;
  2671. u_int ppr_options;
  2672. u_int saved_width;
  2673. u_int saved_offset;
  2674. u_int saved_ppr_options;
  2675. if (ahc->msgin_buf[1] != MSG_EXT_PPR_LEN) {
  2676. reject = TRUE;
  2677. break;
  2678. }
  2679. /*
  2680.  * Wait until we have all args before validating
  2681.  * and acting on this message.
  2682.  *
  2683.  * Add one to MSG_EXT_PPR_LEN to account for
  2684.  * the extended message preamble.
  2685.  */
  2686. if (ahc->msgin_index < (MSG_EXT_PPR_LEN + 1))
  2687. break;
  2688. period = ahc->msgin_buf[3];
  2689. offset = ahc->msgin_buf[5];
  2690. bus_width = ahc->msgin_buf[6];
  2691. saved_width = bus_width;
  2692. ppr_options = ahc->msgin_buf[7];
  2693. /*
  2694.  * According to the spec, a DT only
  2695.  * period factor with no DT option
  2696.  * set implies async.
  2697.  */
  2698. if ((ppr_options & MSG_EXT_PPR_DT_REQ) == 0
  2699.  && period == 9)
  2700. offset = 0;
  2701. saved_ppr_options = ppr_options;
  2702. saved_offset = offset;
  2703. /*
  2704.  * Mask out any options we don't support
  2705.  * on any controller.  Transfer options are
  2706.  * only available if we are negotiating wide.
  2707.  */
  2708. ppr_options &= MSG_EXT_PPR_DT_REQ;
  2709. if (bus_width == 0)
  2710. ppr_options = 0;
  2711. ahc_validate_width(ahc, tinfo, &bus_width,
  2712.    devinfo->role);
  2713. syncrate = ahc_devlimited_syncrate(ahc, tinfo, &period,
  2714.    &ppr_options,
  2715.    devinfo->role);
  2716. ahc_validate_offset(ahc, tinfo, syncrate,
  2717.     &offset, bus_width,
  2718.     devinfo->role);
  2719. if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_PPR, TRUE)) {
  2720. /*
  2721.  * If we are unable to do any of the
  2722.  * requested options (we went too low),
  2723.  * then we'll have to reject the message.
  2724.  */
  2725. if (saved_width > bus_width
  2726.  || saved_offset != offset
  2727.  || saved_ppr_options != ppr_options) {
  2728. reject = TRUE;
  2729. period = 0;
  2730. offset = 0;
  2731. bus_width = 0;
  2732. ppr_options = 0;
  2733. syncrate = NULL;
  2734. }
  2735. } else {
  2736. if (devinfo->role != ROLE_TARGET)
  2737. printf("(%s:%c:%d:%d): Target "
  2738.        "Initiated PPRn",
  2739.        ahc_name(ahc), devinfo->channel,
  2740.        devinfo->target, devinfo->lun);
  2741. else
  2742. printf("(%s:%c:%d:%d): Initiator "
  2743.        "Initiated PPRn",
  2744.        ahc_name(ahc), devinfo->channel,
  2745.        devinfo->target, devinfo->lun);
  2746. ahc->msgout_index = 0;
  2747. ahc->msgout_len = 0;
  2748. ahc_construct_ppr(ahc, devinfo, period, offset,
  2749.   bus_width, ppr_options);
  2750. ahc->msgout_index = 0;
  2751. response = TRUE;
  2752. }
  2753. if (bootverbose) {
  2754. printf("(%s:%c:%d:%d): Received PPR width %x, "
  2755.        "period %x, offset %x,options %xn"
  2756.        "tFiltered to width %x, period %x, "
  2757.        "offset %x, options %xn",
  2758.        ahc_name(ahc), devinfo->channel,
  2759.        devinfo->target, devinfo->lun,
  2760.        saved_width, ahc->msgin_buf[3],
  2761.        saved_offset, saved_ppr_options,
  2762.        bus_width, period, offset, ppr_options);
  2763. }
  2764. ahc_set_width(ahc, devinfo, bus_width,
  2765.       AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2766.       /*paused*/TRUE);
  2767. ahc_set_syncrate(ahc, devinfo,
  2768.  syncrate, period,
  2769.  offset, ppr_options,
  2770.  AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2771.  /*paused*/TRUE);
  2772. done = MSGLOOP_MSGCOMPLETE;
  2773. break;
  2774. }
  2775. default:
  2776. /* Unknown extended message.  Reject it. */
  2777. reject = TRUE;
  2778. break;
  2779. }
  2780. break;
  2781. }
  2782. #ifdef AHC_TARGET_MODE
  2783. case MSG_BUS_DEV_RESET:
  2784. ahc_handle_devreset(ahc, devinfo,
  2785.     CAM_BDR_SENT,
  2786.     "Bus Device Reset Received",
  2787.     /*verbose_level*/0);
  2788. ahc_restart(ahc);
  2789. done = MSGLOOP_TERMINATED;
  2790. break;
  2791. case MSG_ABORT_TAG:
  2792. case MSG_ABORT:
  2793. case MSG_CLEAR_QUEUE:
  2794. {
  2795. int tag;
  2796. /* Target mode messages */
  2797. if (devinfo->role != ROLE_TARGET) {
  2798. reject = TRUE;
  2799. break;
  2800. }
  2801. tag = SCB_LIST_NULL;
  2802. if (ahc->msgin_buf[0] == MSG_ABORT_TAG)
  2803. tag = ahc_inb(ahc, INITIATOR_TAG);
  2804. ahc_abort_scbs(ahc, devinfo->target, devinfo->channel,
  2805.        devinfo->lun, tag, ROLE_TARGET,
  2806.        CAM_REQ_ABORTED);
  2807. tstate = ahc->enabled_targets[devinfo->our_scsiid];
  2808. if (tstate != NULL) {
  2809. struct ahc_tmode_lstate* lstate;
  2810. lstate = tstate->enabled_luns[devinfo->lun];
  2811. if (lstate != NULL) {
  2812. ahc_queue_lstate_event(ahc, lstate,
  2813.        devinfo->our_scsiid,
  2814.        ahc->msgin_buf[0],
  2815.        /*arg*/tag);
  2816. ahc_send_lstate_events(ahc, lstate);
  2817. }
  2818. }
  2819. ahc_restart(ahc);
  2820. done = MSGLOOP_TERMINATED;
  2821. break;
  2822. }
  2823. #endif
  2824. case MSG_TERM_IO_PROC:
  2825. default:
  2826. reject = TRUE;
  2827. break;
  2828. }
  2829. if (reject) {
  2830. /*
  2831.  * Setup to reject the message.
  2832.  */
  2833. ahc->msgout_index = 0;
  2834. ahc->msgout_len = 1;
  2835. ahc->msgout_buf[0] = MSG_MESSAGE_REJECT;
  2836. done = MSGLOOP_MSGCOMPLETE;
  2837. response = TRUE;
  2838. }
  2839. if (done != MSGLOOP_IN_PROG && !response)
  2840. /* Clear the outgoing message buffer */
  2841. ahc->msgout_len = 0;
  2842. return (done);
  2843. }
  2844. /*
  2845.  * Process a message reject message.
  2846.  */
  2847. static int
  2848. ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  2849. {
  2850. /*
  2851.  * What we care about here is if we had an
  2852.  * outstanding SDTR or WDTR message for this
  2853.  * target.  If we did, this is a signal that
  2854.  * the target is refusing negotiation.
  2855.  */
  2856. struct scb *scb;
  2857. struct ahc_initiator_tinfo *tinfo;
  2858. struct ahc_tmode_tstate *tstate;
  2859. u_int scb_index;
  2860. u_int last_msg;
  2861. int   response = 0;
  2862. scb_index = ahc_inb(ahc, SCB_TAG);
  2863. scb = ahc_lookup_scb(ahc, scb_index);
  2864. tinfo = ahc_fetch_transinfo(ahc, devinfo->channel,
  2865.     devinfo->our_scsiid,
  2866.     devinfo->target, &tstate);
  2867. /* Might be necessary */
  2868. last_msg = ahc_inb(ahc, LAST_MSG);
  2869. if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_PPR, /*full*/FALSE)) {
  2870. /*
  2871.  * Target does not support the PPR message.
  2872.  * Attempt to negotiate SPI-2 style.
  2873.  */
  2874. if (bootverbose) {
  2875. printf("(%s:%c:%d:%d): PPR Rejected. "
  2876.        "Trying WDTR/SDTRn",
  2877.        ahc_name(ahc), devinfo->channel,
  2878.        devinfo->target, devinfo->lun);
  2879. }
  2880. tinfo->goal.ppr_options = 0;
  2881. tinfo->curr.transport_version = 2;
  2882. tinfo->goal.transport_version = 2;
  2883. ahc->msgout_index = 0;
  2884. ahc->msgout_len = 0;
  2885. ahc_build_transfer_msg(ahc, devinfo);
  2886. ahc->msgout_index = 0;
  2887. response = 1;
  2888. } else if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_WDTR, /*full*/FALSE)) {
  2889. /* note 8bit xfers */
  2890. printf("(%s:%c:%d:%d): refuses WIDE negotiation.  Using "
  2891.        "8bit transfersn", ahc_name(ahc),
  2892.        devinfo->channel, devinfo->target, devinfo->lun);
  2893. ahc_set_width(ahc, devinfo, MSG_EXT_WDTR_BUS_8_BIT,
  2894.       AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2895.       /*paused*/TRUE);
  2896. /*
  2897.  * No need to clear the sync rate.  If the target
  2898.  * did not accept the command, our syncrate is
  2899.  * unaffected.  If the target started the negotiation,
  2900.  * but rejected our response, we already cleared the
  2901.  * sync rate before sending our WDTR.
  2902.  */
  2903. if (tinfo->goal.period) {
  2904. /* Start the sync negotiation */
  2905. ahc->msgout_index = 0;
  2906. ahc->msgout_len = 0;
  2907. ahc_build_transfer_msg(ahc, devinfo);
  2908. ahc->msgout_index = 0;
  2909. response = 1;
  2910. }
  2911. } else if (ahc_sent_msg(ahc, AHCMSG_EXT, MSG_EXT_SDTR, /*full*/FALSE)) {
  2912. /* note asynch xfers and clear flag */
  2913. ahc_set_syncrate(ahc, devinfo, /*syncrate*/NULL, /*period*/0,
  2914.  /*offset*/0, /*ppr_options*/0,
  2915.  AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
  2916.  /*paused*/TRUE);
  2917. printf("(%s:%c:%d:%d): refuses synchronous negotiation. "
  2918.        "Using asynchronous transfersn",
  2919.        ahc_name(ahc), devinfo->channel,
  2920.        devinfo->target, devinfo->lun);
  2921. } else if ((scb->hscb->control & MSG_SIMPLE_TASK) != 0) {
  2922. int tag_type;
  2923. int mask;
  2924. tag_type = (scb->hscb->control & MSG_SIMPLE_TASK);
  2925. if (tag_type == MSG_SIMPLE_TASK) {
  2926. printf("(%s:%c:%d:%d): refuses tagged commands.  "
  2927.        "Performing non-tagged I/On", ahc_name(ahc),
  2928.        devinfo->channel, devinfo->target, devinfo->lun);
  2929. ahc_set_tags(ahc, devinfo, AHC_QUEUE_NONE);
  2930. mask = ~0x23;
  2931. } else {
  2932. printf("(%s:%c:%d:%d): refuses %s tagged commands.  "
  2933.        "Performing simple queue tagged I/O onlyn",
  2934.        ahc_name(ahc), devinfo->channel, devinfo->target,
  2935.        devinfo->lun, tag_type == MSG_ORDERED_TASK
  2936.        ? "ordered" : "head of queue");
  2937. ahc_set_tags(ahc, devinfo, AHC_QUEUE_BASIC);
  2938. mask = ~0x03;
  2939. }
  2940. /*
  2941.  * Resend the identify for this CCB as the target
  2942.  * may believe that the selection is invalid otherwise.
  2943.  */
  2944. ahc_outb(ahc, SCB_CONTROL,
  2945.  ahc_inb(ahc, SCB_CONTROL) & mask);
  2946.   scb->hscb->control &= mask;
  2947. ahc_set_transaction_tag(scb, /*enabled*/FALSE,
  2948. /*type*/MSG_SIMPLE_TASK);
  2949. ahc_outb(ahc, MSG_OUT, MSG_IDENTIFYFLAG);
  2950. ahc_assert_atn(ahc);
  2951. /*
  2952.  * This transaction is now at the head of
  2953.  * the untagged queue for this target.
  2954.  */
  2955. if ((ahc->flags & AHC_SCB_BTT) == 0) {
  2956. struct scb_tailq *untagged_q;
  2957. untagged_q =
  2958.     &(ahc->untagged_queues[devinfo->target_offset]);
  2959. TAILQ_INSERT_HEAD(untagged_q, scb, links.tqe);
  2960. scb->flags |= SCB_UNTAGGEDQ;
  2961. }
  2962. ahc_busy_tcl(ahc, BUILD_TCL(scb->hscb->scsiid, devinfo->lun),
  2963.      scb->hscb->tag);
  2964. /*
  2965.  * Requeue all tagged commands for this target
  2966.  * currently in our posession so they can be
  2967.  * converted to untagged commands.
  2968.  */
  2969. ahc_search_qinfifo(ahc, SCB_GET_TARGET(ahc, scb),
  2970.    SCB_GET_CHANNEL(ahc, scb),
  2971.    SCB_GET_LUN(scb), /*tag*/SCB_LIST_NULL,
  2972.    ROLE_INITIATOR, CAM_REQUEUE_REQ,
  2973.    SEARCH_COMPLETE);
  2974. } else {
  2975. /*
  2976.  * Otherwise, we ignore it.
  2977.  */
  2978. printf("%s:%c:%d: Message reject for %x -- ignoredn",
  2979.        ahc_name(ahc), devinfo->channel, devinfo->target,
  2980.        last_msg);
  2981. }
  2982. return (response);
  2983. }
  2984. /*
  2985.  * Process an ingnore wide residue message.
  2986.  */
  2987. static void
  2988. ahc_handle_ign_wide_residue(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
  2989. {
  2990. u_int scb_index;
  2991. struct scb *scb;
  2992. scb_index = ahc_inb(ahc, SCB_TAG);
  2993. scb = ahc_lookup_scb(ahc, scb_index);
  2994. /*
  2995.  * XXX Actually check data direction in the sequencer?
  2996.  * Perhaps add datadir to some spare bits in the hscb?
  2997.  */
  2998. if ((ahc_inb(ahc, SEQ_FLAGS) & DPHASE) == 0
  2999.  || ahc_get_transfer_dir(scb) != CAM_DIR_IN) {
  3000. /*
  3001.  * Ignore the message if we haven't
  3002.  * seen an appropriate data phase yet.
  3003.  */
  3004. } else {
  3005. /*
  3006.  * If the residual occurred on the last
  3007.  * transfer and the transfer request was
  3008.  * expected to end on an odd count, do
  3009.  * nothing.  Otherwise, subtract a byte
  3010.  * and update the residual count accordingly.
  3011.  */
  3012. uint32_t sgptr;
  3013. sgptr = ahc_inb(ahc, SCB_RESIDUAL_SGPTR);
  3014. if ((sgptr & SG_LIST_NULL) != 0
  3015.  && ahc_inb(ahc, DATA_COUNT_ODD) == 1) {
  3016. /*
  3017.  * If the residual occurred on the last
  3018.  * transfer and the transfer request was
  3019.  * expected to end on an odd count, do
  3020.  * nothing.
  3021.  */
  3022. } else {
  3023. struct ahc_dma_seg *sg;
  3024. uint32_t data_cnt;
  3025. uint32_t data_addr;
  3026. uint32_t sglen;
  3027. /* Pull in the rest of the sgptr */
  3028. sgptr |= (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 3) << 24)
  3029.       | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 2) << 16)
  3030.       | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 1) << 8);
  3031. sgptr &= SG_PTR_MASK;
  3032. data_cnt = (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+3) << 24)
  3033.  | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+2) << 16)
  3034.  | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+1) << 8)
  3035.  | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT));
  3036. data_addr = (ahc_inb(ahc, SHADDR + 3) << 24)
  3037.   | (ahc_inb(ahc, SHADDR + 2) << 16)
  3038.   | (ahc_inb(ahc, SHADDR + 1) << 8)
  3039.   | (ahc_inb(ahc, SHADDR));
  3040. data_cnt += 1;
  3041. data_addr -= 1;
  3042. sg = ahc_sg_bus_to_virt(scb, sgptr);
  3043. /*
  3044.  * The residual sg ptr points to the next S/G
  3045.  * to load so we must go back one.
  3046.  */
  3047. sg--;
  3048. sglen = ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
  3049. if (sg != scb->sg_list
  3050.  && sglen < (data_cnt & AHC_SG_LEN_MASK)) {
  3051. sg--;
  3052. sglen = ahc_le32toh(sg->len);
  3053. /*
  3054.  * Preserve High Address and SG_LIST bits
  3055.  * while setting the count to 1.
  3056.  */
  3057. data_cnt = 1 | (sglen & (~AHC_SG_LEN_MASK));
  3058. data_addr = ahc_le32toh(sg->addr)
  3059.   + (sglen & AHC_SG_LEN_MASK) - 1;
  3060. /*
  3061.  * Increment sg so it points to the
  3062.  * "next" sg.
  3063.  */
  3064. sg++;
  3065. sgptr = ahc_sg_virt_to_bus(scb, sg);
  3066. ahc_outb(ahc, SCB_RESIDUAL_SGPTR + 3,
  3067.  sgptr >> 24);
  3068. ahc_outb(ahc, SCB_RESIDUAL_SGPTR + 2,
  3069.  sgptr >> 16);
  3070. ahc_outb(ahc, SCB_RESIDUAL_SGPTR + 1,
  3071.  sgptr >> 8);
  3072. ahc_outb(ahc, SCB_RESIDUAL_SGPTR, sgptr);
  3073. }
  3074. ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 3, data_cnt >> 24);
  3075. ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 2, data_cnt >> 16);
  3076. ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 1, data_cnt >> 8);
  3077. ahc_outb(ahc, SCB_RESIDUAL_DATACNT, data_cnt);
  3078. }
  3079. }
  3080. }
  3081. /*
  3082.  * Reinitialize the data pointers for the active transfer
  3083.  * based on its current residual.
  3084.  */
  3085. static void
  3086. ahc_reinitialize_dataptrs(struct ahc_softc *ahc)
  3087. {
  3088. struct  scb *scb;
  3089. struct  ahc_dma_seg *sg;
  3090. u_int  scb_index;
  3091. uint32_t sgptr;
  3092. uint32_t resid;
  3093. uint32_t dataptr;
  3094. scb_index = ahc_inb(ahc, SCB_TAG);
  3095. scb = ahc_lookup_scb(ahc, scb_index);
  3096. sgptr = (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 3) << 24)
  3097.       | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 2) << 16)
  3098.       | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 1) << 8)
  3099.       | ahc_inb(ahc, SCB_RESIDUAL_SGPTR);
  3100. sgptr &= SG_PTR_MASK;
  3101. sg = ahc_sg_bus_to_virt(scb, sgptr);
  3102. /* The residual sg_ptr always points to the next sg */
  3103. sg--;
  3104. resid = (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 2) << 16)
  3105.       | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 1) << 8)
  3106.       | ahc_inb(ahc, SCB_RESIDUAL_DATACNT);
  3107. dataptr = ahc_le32toh(sg->addr)
  3108. + (ahc_le32toh(sg->len) & AHC_SG_LEN_MASK)
  3109. - resid;
  3110. if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  3111. u_int dscommand1;
  3112. dscommand1 = ahc_inb(ahc, DSCOMMAND1);
  3113. ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
  3114. ahc_outb(ahc, HADDR,
  3115.  (ahc_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
  3116. ahc_outb(ahc, DSCOMMAND1, dscommand1);
  3117. }
  3118. ahc_outb(ahc, HADDR + 3, dataptr >> 24);
  3119. ahc_outb(ahc, HADDR + 2, dataptr >> 16);
  3120. ahc_outb(ahc, HADDR + 1, dataptr >> 8);
  3121. ahc_outb(ahc, HADDR, dataptr);
  3122. ahc_outb(ahc, HCNT + 2, resid >> 16);
  3123. ahc_outb(ahc, HCNT + 1, resid >> 8);
  3124. ahc_outb(ahc, HCNT, resid);
  3125. if ((ahc->features & AHC_ULTRA2) == 0) {
  3126. ahc_outb(ahc, STCNT + 2, resid >> 16);
  3127. ahc_outb(ahc, STCNT + 1, resid >> 8);
  3128. ahc_outb(ahc, STCNT, resid);
  3129. }
  3130. }
  3131. /*
  3132.  * Handle the effects of issuing a bus device reset message.
  3133.  */
  3134. static void
  3135. ahc_handle_devreset(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  3136.     cam_status status, char *message, int verbose_level)
  3137. {
  3138. #ifdef AHC_TARGET_MODE
  3139. struct ahc_tmode_tstate* tstate;
  3140. u_int lun;
  3141. #endif
  3142. int found;
  3143. found = ahc_abort_scbs(ahc, devinfo->target, devinfo->channel,
  3144.        CAM_LUN_WILDCARD, SCB_LIST_NULL, devinfo->role,
  3145.        status);
  3146. #ifdef AHC_TARGET_MODE
  3147. /*
  3148.  * Send an immediate notify ccb to all target mord peripheral
  3149.  * drivers affected by this action.
  3150.  */
  3151. tstate = ahc->enabled_targets[devinfo->our_scsiid];
  3152. if (tstate != NULL) {
  3153. for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
  3154. struct ahc_tmode_lstate* lstate;
  3155. lstate = tstate->enabled_luns[lun];
  3156. if (lstate == NULL)
  3157. continue;
  3158. ahc_queue_lstate_event(ahc, lstate, devinfo->our_scsiid,
  3159.        MSG_BUS_DEV_RESET, /*arg*/0);
  3160. ahc_send_lstate_events(ahc, lstate);
  3161. }
  3162. }
  3163. #endif
  3164. /*
  3165.  * Go back to async/narrow transfers and renegotiate.
  3166.  */
  3167. ahc_set_width(ahc, devinfo, MSG_EXT_WDTR_BUS_8_BIT,
  3168.       AHC_TRANS_CUR, /*paused*/TRUE);
  3169. ahc_set_syncrate(ahc, devinfo, /*syncrate*/NULL,
  3170.  /*period*/0, /*offset*/0, /*ppr_options*/0,
  3171.  AHC_TRANS_CUR, /*paused*/TRUE);
  3172. ahc_send_async(ahc, devinfo->channel, devinfo->target,
  3173.        CAM_LUN_WILDCARD, AC_SENT_BDR, NULL);
  3174. if (message != NULL
  3175.  && (verbose_level <= bootverbose))
  3176. printf("%s: %s on %c:%d. %d SCBs abortedn", ahc_name(ahc),
  3177.        message, devinfo->channel, devinfo->target, found);
  3178. }
  3179. #ifdef AHC_TARGET_MODE
  3180. static void
  3181. ahc_setup_target_msgin(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  3182.        struct scb *scb)
  3183. {
  3184. /*              
  3185.  * To facilitate adding multiple messages together,
  3186.  * each routine should increment the index and len
  3187.  * variables instead of setting them explicitly.
  3188.  */             
  3189. ahc->msgout_index = 0;
  3190. ahc->msgout_len = 0;
  3191. if (scb != NULL && (scb->flags & SCB_AUTO_NEGOTIATE) != 0)
  3192. ahc_build_transfer_msg(ahc, devinfo);
  3193. else
  3194. panic("ahc_intr: AWAITING target message with no message");
  3195. ahc->msgout_index = 0;
  3196. ahc->msg_type = MSG_TYPE_TARGET_MSGIN;
  3197. }
  3198. #endif