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

嵌入式Linux

开发平台:

Unix_Linux

  1. /**************************** Initialization **********************************/
  2. /*
  3.  * Allocate a controller structure for a new device
  4.  * and perform initial initializion.
  5.  */
  6. struct ahc_softc *
  7. ahc_alloc(void *platform_arg, char *name)
  8. {
  9. struct  ahc_softc *ahc;
  10. int i;
  11. #ifndef __FreeBSD__
  12. ahc = malloc(sizeof(*ahc), M_DEVBUF, M_NOWAIT);
  13. if (!ahc) {
  14. printf("aic7xxx: cannot malloc softc!n");
  15. free(name, M_DEVBUF);
  16. return NULL;
  17. }
  18. #else
  19. ahc = device_get_softc((device_t)platform_arg);
  20. #endif
  21. memset(ahc, 0, sizeof(*ahc));
  22. LIST_INIT(&ahc->pending_scbs);
  23. /* We don't know our unit number until the OSM sets it */
  24. ahc->name = name;
  25. ahc->unit = -1;
  26. ahc->description = NULL;
  27. ahc->channel = 'A';
  28. ahc->channel_b = 'B';
  29. ahc->chip = AHC_NONE;
  30. ahc->features = AHC_FENONE;
  31. ahc->bugs = AHC_BUGNONE;
  32. ahc->flags = AHC_FNONE;
  33. for (i = 0; i < 16; i++)
  34. TAILQ_INIT(&ahc->untagged_queues[i]);
  35. if (ahc_platform_alloc(ahc, platform_arg) != 0) {
  36. ahc_free(ahc);
  37. ahc = NULL;
  38. }
  39. return (ahc);
  40. }
  41. int
  42. ahc_softc_init(struct ahc_softc *ahc)
  43. {
  44. /* The IRQMS bit is only valid on VL and EISA chips */
  45. if ((ahc->chip & AHC_PCI) == 0)
  46. ahc->unpause = ahc_inb(ahc, HCNTRL) & IRQMS;
  47. else
  48. ahc->unpause = 0;
  49. ahc->pause = ahc->unpause | PAUSE; 
  50. /* XXX The shared scb data stuff should be deprecated */
  51. if (ahc->scb_data == NULL) {
  52. ahc->scb_data = malloc(sizeof(*ahc->scb_data),
  53.        M_DEVBUF, M_NOWAIT);
  54. if (ahc->scb_data == NULL)
  55. return (ENOMEM);
  56. memset(ahc->scb_data, 0, sizeof(*ahc->scb_data));
  57. }
  58. return (0);
  59. }
  60. void
  61. ahc_softc_insert(struct ahc_softc *ahc)
  62. {
  63. struct ahc_softc *list_ahc;
  64. #if AHC_PCI_CONFIG > 0
  65. /*
  66.  * Second Function PCI devices need to inherit some
  67.  * settings from function 0.
  68.  */
  69. if ((ahc->chip & AHC_BUS_MASK) == AHC_PCI
  70.  && (ahc->features & AHC_MULTI_FUNC) != 0) {
  71. TAILQ_FOREACH(list_ahc, &ahc_tailq, links) {
  72. ahc_dev_softc_t list_pci;
  73. ahc_dev_softc_t pci;
  74. list_pci = list_ahc->dev_softc;
  75. pci = ahc->dev_softc;
  76. if (ahc_get_pci_slot(list_pci) == ahc_get_pci_slot(pci)
  77.  && ahc_get_pci_bus(list_pci) == ahc_get_pci_bus(pci)) {
  78. struct ahc_softc *master;
  79. struct ahc_softc *slave;
  80. if (ahc_get_pci_function(list_pci) == 0) {
  81. master = list_ahc;
  82. slave = ahc;
  83. } else {
  84. master = ahc;
  85. slave = list_ahc;
  86. }
  87. slave->flags &= ~AHC_BIOS_ENABLED; 
  88. slave->flags |=
  89.     master->flags & AHC_BIOS_ENABLED;
  90. slave->flags &= ~AHC_PRIMARY_CHANNEL; 
  91. slave->flags |=
  92.     master->flags & AHC_PRIMARY_CHANNEL;
  93. break;
  94. }
  95. }
  96. }
  97. #endif
  98. /*
  99.  * Insertion sort into our list of softcs.
  100.  */
  101. list_ahc = TAILQ_FIRST(&ahc_tailq);
  102. while (list_ahc != NULL
  103.     && ahc_softc_comp(list_ahc, ahc) <= 0)
  104. list_ahc = TAILQ_NEXT(list_ahc, links);
  105. if (list_ahc != NULL)
  106. TAILQ_INSERT_BEFORE(list_ahc, ahc, links);
  107. else
  108. TAILQ_INSERT_TAIL(&ahc_tailq, ahc, links);
  109. ahc->init_level++;
  110. }
  111. void
  112. ahc_set_unit(struct ahc_softc *ahc, int unit)
  113. {
  114. ahc->unit = unit;
  115. }
  116. void
  117. ahc_set_name(struct ahc_softc *ahc, char *name)
  118. {
  119. if (ahc->name != NULL)
  120. free(ahc->name, M_DEVBUF);
  121. ahc->name = name;
  122. }
  123. void
  124. ahc_free(struct ahc_softc *ahc)
  125. {
  126. int i;
  127. ahc_fini_scbdata(ahc);
  128. switch (ahc->init_level) {
  129. default:
  130. case 5:
  131. ahc_shutdown(ahc);
  132. TAILQ_REMOVE(&ahc_tailq, ahc, links);
  133. /* FALLTHROUGH */
  134. case 4:
  135. ahc_dmamap_unload(ahc, ahc->shared_data_dmat,
  136.   ahc->shared_data_dmamap);
  137. /* FALLTHROUGH */
  138. case 3:
  139. ahc_dmamem_free(ahc, ahc->shared_data_dmat, ahc->qoutfifo,
  140. ahc->shared_data_dmamap);
  141. ahc_dmamap_destroy(ahc, ahc->shared_data_dmat,
  142.    ahc->shared_data_dmamap);
  143. /* FALLTHROUGH */
  144. case 2:
  145. ahc_dma_tag_destroy(ahc, ahc->shared_data_dmat);
  146. case 1:
  147. #ifndef __linux__
  148. ahc_dma_tag_destroy(ahc, ahc->buffer_dmat);
  149. #endif
  150. break;
  151. case 0:
  152. break;
  153. }
  154. #ifndef __linux__
  155. ahc_dma_tag_destroy(ahc, ahc->parent_dmat);
  156. #endif
  157. ahc_platform_free(ahc);
  158. for (i = 0; i < AHC_NUM_TARGETS; i++) {
  159. struct ahc_tmode_tstate *tstate;
  160. tstate = ahc->enabled_targets[i];
  161. if (tstate != NULL) {
  162. #if AHC_TARGET_MODE
  163. int j;
  164. for (j = 0; j < AHC_NUM_LUNS; j++) {
  165. struct ahc_tmode_lstate *lstate;
  166. lstate = tstate->enabled_luns[j];
  167. if (lstate != NULL) {
  168. xpt_free_path(lstate->path);
  169. free(lstate, M_DEVBUF);
  170. }
  171. }
  172. #endif
  173. free(tstate, M_DEVBUF);
  174. }
  175. }
  176. #if AHC_TARGET_MODE
  177. if (ahc->black_hole != NULL) {
  178. xpt_free_path(ahc->black_hole->path);
  179. free(ahc->black_hole, M_DEVBUF);
  180. }
  181. #endif
  182. if (ahc->name != NULL)
  183. free(ahc->name, M_DEVBUF);
  184. #ifndef __FreeBSD__
  185. free(ahc, M_DEVBUF);
  186. #endif
  187. return;
  188. }
  189. void
  190. ahc_shutdown(void *arg)
  191. {
  192. struct ahc_softc *ahc;
  193. int i;
  194. ahc = (struct ahc_softc *)arg;
  195. /* This will reset most registers to 0, but not all */
  196. ahc_reset(ahc);
  197. ahc_outb(ahc, SCSISEQ, 0);
  198. ahc_outb(ahc, SXFRCTL0, 0);
  199. ahc_outb(ahc, DSPCISTATUS, 0);
  200. for (i = TARG_SCSIRATE; i < HA_274_BIOSCTRL; i++)
  201. ahc_outb(ahc, i, 0);
  202. }
  203. /*
  204.  * Reset the controller and record some information about it
  205.  * that is only availabel just after a reset.
  206.  */
  207. int
  208. ahc_reset(struct ahc_softc *ahc)
  209. {
  210. u_int sblkctl;
  211. u_int sxfrctl1_a, sxfrctl1_b;
  212. int wait;
  213. /*
  214.  * Preserve the value of the SXFRCTL1 register for all channels.
  215.  * It contains settings that affect termination and we don't want
  216.  * to disturb the integrity of the bus.
  217.  */
  218. ahc_pause(ahc);
  219. sxfrctl1_b = 0;
  220. if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7770) {
  221. u_int sblkctl;
  222. /*
  223.  * Save channel B's settings in case this chip
  224.  * is setup for TWIN channel operation.
  225.  */
  226. sblkctl = ahc_inb(ahc, SBLKCTL);
  227. ahc_outb(ahc, SBLKCTL, sblkctl | SELBUSB);
  228. sxfrctl1_b = ahc_inb(ahc, SXFRCTL1);
  229. ahc_outb(ahc, SBLKCTL, sblkctl & ~SELBUSB);
  230. }
  231. sxfrctl1_a = ahc_inb(ahc, SXFRCTL1);
  232. ahc_outb(ahc, HCNTRL, CHIPRST | ahc->pause);
  233. /*
  234.  * Ensure that the reset has finished
  235.  */
  236. wait = 1000;
  237. do {
  238. ahc_delay(1000);
  239. } while (--wait && !(ahc_inb(ahc, HCNTRL) & CHIPRSTACK));
  240. if (wait == 0) {
  241. printf("%s: WARNING - Failed chip reset!  "
  242.        "Trying to initialize anyway.n", ahc_name(ahc));
  243. }
  244. ahc_outb(ahc, HCNTRL, ahc->pause);
  245. /* Determine channel configuration */
  246. sblkctl = ahc_inb(ahc, SBLKCTL) & (SELBUSB|SELWIDE);
  247. /* No Twin Channel PCI cards */
  248. if ((ahc->chip & AHC_PCI) != 0)
  249. sblkctl &= ~SELBUSB;
  250. switch (sblkctl) {
  251. case 0:
  252. /* Single Narrow Channel */
  253. break;
  254. case 2:
  255. /* Wide Channel */
  256. ahc->features |= AHC_WIDE;
  257. break;
  258. case 8:
  259. /* Twin Channel */
  260. ahc->features |= AHC_TWIN;
  261. break;
  262. default:
  263. printf(" Unsupported adapter type.  Ignoringn");
  264. return(-1);
  265. }
  266. /*
  267.  * Reload sxfrctl1.
  268.  *
  269.  * We must always initialize STPWEN to 1 before we
  270.  * restore the saved values.  STPWEN is initialized
  271.  * to a tri-state condition which can only be cleared
  272.  * by turning it on.
  273.  */
  274. if ((ahc->features & AHC_TWIN) != 0) {
  275. u_int sblkctl;
  276. sblkctl = ahc_inb(ahc, SBLKCTL);
  277. ahc_outb(ahc, SBLKCTL, sblkctl | SELBUSB);
  278. ahc_outb(ahc, SXFRCTL1, sxfrctl1_b);
  279. ahc_outb(ahc, SBLKCTL, sblkctl & ~SELBUSB);
  280. }
  281. ahc_outb(ahc, SXFRCTL1, sxfrctl1_a);
  282. #ifdef AHC_DUMP_SEQ
  283. if (ahc->init_level == 0)
  284. ahc_dumpseq(ahc);
  285. #endif
  286. return (0);
  287. }
  288. /*
  289.  * Determine the number of SCBs available on the controller
  290.  */
  291. int
  292. ahc_probe_scbs(struct ahc_softc *ahc) {
  293. int i;
  294. for (i = 0; i < AHC_SCB_MAX; i++) {
  295. ahc_outb(ahc, SCBPTR, i);
  296. ahc_outb(ahc, SCB_BASE, i);
  297. if (ahc_inb(ahc, SCB_BASE) != i)
  298. break;
  299. ahc_outb(ahc, SCBPTR, 0);
  300. if (ahc_inb(ahc, SCB_BASE) != 0)
  301. break;
  302. }
  303. return (i);
  304. }
  305. static void
  306. ahc_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) 
  307. {
  308. bus_addr_t *baddr;
  309. baddr = (bus_addr_t *)arg;
  310. *baddr = segs->ds_addr;
  311. }
  312. static void
  313. ahc_build_free_scb_list(struct ahc_softc *ahc)
  314. {
  315. int i;
  316. for (i = 0; i < ahc->scb_data->maxhscbs; i++) {
  317. ahc_outb(ahc, SCBPTR, i);
  318. /* Clear the control byte. */
  319. ahc_outb(ahc, SCB_CONTROL, 0);
  320. /* Set the next pointer */
  321. if ((ahc->flags & AHC_PAGESCBS) != 0)
  322. ahc_outb(ahc, SCB_NEXT, i+1);
  323. else 
  324. ahc_outb(ahc, SCB_NEXT, SCB_LIST_NULL);
  325. /* Make the tag number invalid */
  326. ahc_outb(ahc, SCB_TAG, SCB_LIST_NULL);
  327. }
  328. /* Make sure that the last SCB terminates the free list */
  329. ahc_outb(ahc, SCBPTR, i-1);
  330. ahc_outb(ahc, SCB_NEXT, SCB_LIST_NULL);
  331. /* Ensure we clear the 0 SCB's control byte. */
  332. ahc_outb(ahc, SCBPTR, 0);
  333. ahc_outb(ahc, SCB_CONTROL, 0);
  334. }
  335. static int
  336. ahc_init_scbdata(struct ahc_softc *ahc)
  337. {
  338. struct scb_data *scb_data;
  339. scb_data = ahc->scb_data;
  340. SLIST_INIT(&scb_data->free_scbs);
  341. SLIST_INIT(&scb_data->sg_maps);
  342. /* Allocate SCB resources */
  343. scb_data->scbarray =
  344.     (struct scb *)malloc(sizeof(struct scb) * AHC_SCB_MAX_ALLOC,
  345.  M_DEVBUF, M_NOWAIT);
  346. if (scb_data->scbarray == NULL)
  347. return (ENOMEM);
  348. memset(scb_data->scbarray, 0, sizeof(struct scb) * AHC_SCB_MAX_ALLOC);
  349. /* Determine the number of hardware SCBs and initialize them */
  350. scb_data->maxhscbs = ahc_probe_scbs(ahc);
  351. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  352. /* SCB 0 heads the free list */
  353. ahc_outb(ahc, FREE_SCBH, 0);
  354. } else {
  355. ahc_outb(ahc, FREE_SCBH, SCB_LIST_NULL);
  356. }
  357. if (ahc->scb_data->maxhscbs == 0) {
  358. printf("%s: No SCB space foundn", ahc_name(ahc));
  359. return (ENXIO);
  360. }
  361. ahc_build_free_scb_list(ahc);
  362. /*
  363.  * Create our DMA tags.  These tags define the kinds of device
  364.  * accessible memory allocations and memory mappings we will
  365.  * need to perform during normal operation.
  366.  *
  367.  * Unless we need to further restrict the allocation, we rely
  368.  * on the restrictions of the parent dmat, hence the common
  369.  * use of MAXADDR and MAXSIZE.
  370.  */
  371. /* DMA tag for our hardware scb structures */
  372. if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
  373.        /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
  374.        /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
  375.        /*highaddr*/BUS_SPACE_MAXADDR,
  376.        /*filter*/NULL, /*filterarg*/NULL,
  377.        AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb),
  378.        /*nsegments*/1,
  379.        /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
  380.        /*flags*/0, &scb_data->hscb_dmat) != 0) {
  381. goto error_exit;
  382. }
  383. scb_data->init_level++;
  384. /* Allocation for our hscbs */
  385. if (ahc_dmamem_alloc(ahc, scb_data->hscb_dmat,
  386.      (void **)&scb_data->hscbs,
  387.      BUS_DMA_NOWAIT, &scb_data->hscb_dmamap) != 0) {
  388. goto error_exit;
  389. }
  390. scb_data->init_level++;
  391. /* And permanently map them */
  392. ahc_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap,
  393. scb_data->hscbs,
  394. AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb),
  395. ahc_dmamap_cb, &scb_data->hscb_busaddr, /*flags*/0);
  396. scb_data->init_level++;
  397. /* DMA tag for our sense buffers */
  398. if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
  399.        /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
  400.        /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
  401.        /*highaddr*/BUS_SPACE_MAXADDR,
  402.        /*filter*/NULL, /*filterarg*/NULL,
  403.        AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data),
  404.        /*nsegments*/1,
  405.        /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
  406.        /*flags*/0, &scb_data->sense_dmat) != 0) {
  407. goto error_exit;
  408. }
  409. scb_data->init_level++;
  410. /* Allocate them */
  411. if (ahc_dmamem_alloc(ahc, scb_data->sense_dmat,
  412.      (void **)&scb_data->sense,
  413.      BUS_DMA_NOWAIT, &scb_data->sense_dmamap) != 0) {
  414. goto error_exit;
  415. }
  416. scb_data->init_level++;
  417. /* And permanently map them */
  418. ahc_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap,
  419. scb_data->sense,
  420. AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data),
  421. ahc_dmamap_cb, &scb_data->sense_busaddr, /*flags*/0);
  422. scb_data->init_level++;
  423. /* DMA tag for our S/G structures.  We allocate in page sized chunks */
  424. if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
  425.        /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
  426.        /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
  427.        /*highaddr*/BUS_SPACE_MAXADDR,
  428.        /*filter*/NULL, /*filterarg*/NULL,
  429.        PAGE_SIZE, /*nsegments*/1,
  430.        /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
  431.        /*flags*/0, &scb_data->sg_dmat) != 0) {
  432. goto error_exit;
  433. }
  434. scb_data->init_level++;
  435. /* Perform initial CCB allocation */
  436. memset(scb_data->hscbs, 0,
  437.        AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb));
  438. ahc_alloc_scbs(ahc);
  439. if (scb_data->numscbs == 0) {
  440. printf("%s: ahc_init_scbdata - "
  441.        "Unable to allocate initial scbsn",
  442.        ahc_name(ahc));
  443. goto error_exit;
  444. }
  445. /*
  446.  * Tell the sequencer which SCB will be the next one it receives.
  447.  */
  448. ahc->next_queued_scb = ahc_get_scb(ahc);
  449. ahc_outb(ahc, NEXT_QUEUED_SCB, ahc->next_queued_scb->hscb->tag);
  450. /*
  451.  * Note that we were successfull
  452.  */
  453. return (0); 
  454. error_exit:
  455. return (ENOMEM);
  456. }
  457. static void
  458. ahc_fini_scbdata(struct ahc_softc *ahc)
  459. {
  460. struct scb_data *scb_data;
  461. scb_data = ahc->scb_data;
  462. if (scb_data == NULL)
  463. return;
  464. switch (scb_data->init_level) {
  465. default:
  466. case 7:
  467. {
  468. struct sg_map_node *sg_map;
  469. while ((sg_map = SLIST_FIRST(&scb_data->sg_maps))!= NULL) {
  470. SLIST_REMOVE_HEAD(&scb_data->sg_maps, links);
  471. ahc_dmamap_unload(ahc, scb_data->sg_dmat,
  472.   sg_map->sg_dmamap);
  473. ahc_dmamem_free(ahc, scb_data->sg_dmat,
  474. sg_map->sg_vaddr,
  475. sg_map->sg_dmamap);
  476. free(sg_map, M_DEVBUF);
  477. }
  478. ahc_dma_tag_destroy(ahc, scb_data->sg_dmat);
  479. }
  480. case 6:
  481. ahc_dmamap_unload(ahc, scb_data->sense_dmat,
  482.   scb_data->sense_dmamap);
  483. case 5:
  484. ahc_dmamem_free(ahc, scb_data->sense_dmat, scb_data->sense,
  485. scb_data->sense_dmamap);
  486. ahc_dmamap_destroy(ahc, scb_data->sense_dmat,
  487.    scb_data->sense_dmamap);
  488. case 4:
  489. ahc_dma_tag_destroy(ahc, scb_data->sense_dmat);
  490. case 3:
  491. ahc_dmamap_unload(ahc, scb_data->hscb_dmat,
  492.   scb_data->hscb_dmamap);
  493. case 2:
  494. ahc_dmamem_free(ahc, scb_data->hscb_dmat, scb_data->hscbs,
  495. scb_data->hscb_dmamap);
  496. ahc_dmamap_destroy(ahc, scb_data->hscb_dmat,
  497.    scb_data->hscb_dmamap);
  498. case 1:
  499. ahc_dma_tag_destroy(ahc, scb_data->hscb_dmat);
  500. break;
  501. case 0:
  502. break;
  503. }
  504. if (scb_data->scbarray != NULL)
  505. free(scb_data->scbarray, M_DEVBUF);
  506. }
  507. void
  508. ahc_alloc_scbs(struct ahc_softc *ahc)
  509. {
  510. struct scb_data *scb_data;
  511. struct scb *next_scb;
  512. struct sg_map_node *sg_map;
  513. bus_addr_t physaddr;
  514. struct ahc_dma_seg *segs;
  515. int newcount;
  516. int i;
  517. scb_data = ahc->scb_data;
  518. if (scb_data->numscbs >= AHC_SCB_MAX_ALLOC)
  519. /* Can't allocate any more */
  520. return;
  521. next_scb = &scb_data->scbarray[scb_data->numscbs];
  522. sg_map = malloc(sizeof(*sg_map), M_DEVBUF, M_NOWAIT);
  523. if (sg_map == NULL)
  524. return;
  525. /* Allocate S/G space for the next batch of SCBS */
  526. if (ahc_dmamem_alloc(ahc, scb_data->sg_dmat,
  527.      (void **)&sg_map->sg_vaddr,
  528.      BUS_DMA_NOWAIT, &sg_map->sg_dmamap) != 0) {
  529. free(sg_map, M_DEVBUF);
  530. return;
  531. }
  532. SLIST_INSERT_HEAD(&scb_data->sg_maps, sg_map, links);
  533. ahc_dmamap_load(ahc, scb_data->sg_dmat, sg_map->sg_dmamap,
  534. sg_map->sg_vaddr, PAGE_SIZE, ahc_dmamap_cb,
  535. &sg_map->sg_physaddr, /*flags*/0);
  536. segs = sg_map->sg_vaddr;
  537. physaddr = sg_map->sg_physaddr;
  538. newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg)));
  539. newcount = MIN(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs));
  540. for (i = 0; i < newcount; i++) {
  541. struct scb_platform_data *pdata;
  542. #ifndef __linux__
  543. int error;
  544. #endif
  545. pdata = (struct scb_platform_data *)malloc(sizeof(*pdata),
  546.    M_DEVBUF, M_NOWAIT);
  547. if (pdata == NULL)
  548. break;
  549. next_scb->platform_data = pdata;
  550. next_scb->sg_map = sg_map;
  551. next_scb->sg_list = segs;
  552. /*
  553.  * The sequencer always starts with the second entry.
  554.  * The first entry is embedded in the scb.
  555.  */
  556. next_scb->sg_list_phys = physaddr + sizeof(struct ahc_dma_seg);
  557. next_scb->ahc_softc = ahc;
  558. next_scb->flags = SCB_FREE;
  559. #ifndef __linux__
  560. error = ahc_dmamap_create(ahc, ahc->buffer_dmat, /*flags*/0,
  561.   &next_scb->dmamap);
  562. if (error != 0)
  563. break;
  564. #endif
  565. next_scb->hscb = &scb_data->hscbs[scb_data->numscbs];
  566. next_scb->hscb->tag = ahc->scb_data->numscbs;
  567. SLIST_INSERT_HEAD(&ahc->scb_data->free_scbs,
  568.   next_scb, links.sle);
  569. segs += AHC_NSEG;
  570. physaddr += (AHC_NSEG * sizeof(struct ahc_dma_seg));
  571. next_scb++;
  572. ahc->scb_data->numscbs++;
  573. }
  574. }
  575. void
  576. ahc_controller_info(struct ahc_softc *ahc, char *buf)
  577. {
  578. int len;
  579. len = sprintf(buf, "%s: ", ahc_chip_names[ahc->chip & AHC_CHIPID_MASK]);
  580. buf += len;
  581. if ((ahc->features & AHC_TWIN) != 0)
  582.   len = sprintf(buf, "Twin Channel, A SCSI Id=%d, "
  583.       "B SCSI Id=%d, primary %c, ",
  584.       ahc->our_id, ahc->our_id_b,
  585.       (ahc->flags & AHC_PRIMARY_CHANNEL) + 'A');
  586. else {
  587. const char *speed;
  588. const char *type;
  589. speed = "";
  590. if ((ahc->features & AHC_ULTRA) != 0) {
  591. speed = "Ultra ";
  592. } else if ((ahc->features & AHC_DT) != 0) {
  593. speed = "Ultra160 ";
  594. } else if ((ahc->features & AHC_ULTRA2) != 0) {
  595. speed = "Ultra2 ";
  596. }
  597. if ((ahc->features & AHC_WIDE) != 0) {
  598. type = "Wide";
  599. } else {
  600. type = "Single";
  601. }
  602. len = sprintf(buf, "%s%s Channel %c, SCSI Id=%d, ",
  603.       speed, type, ahc->channel, ahc->our_id);
  604. }
  605. buf += len;
  606. if ((ahc->flags & AHC_PAGESCBS) != 0)
  607. sprintf(buf, "%d/%d SCBs",
  608. ahc->scb_data->maxhscbs, AHC_MAX_QUEUE);
  609. else
  610. sprintf(buf, "%d SCBs", ahc->scb_data->maxhscbs);
  611. }
  612. /*
  613.  * Start the board, ready for normal operation
  614.  */
  615. int
  616. ahc_init(struct ahc_softc *ahc)
  617. {
  618. int  max_targ;
  619. int  i;
  620. int  term;
  621. u_int  scsi_conf;
  622. u_int  scsiseq_template;
  623. u_int  ultraenb;
  624. u_int  discenable;
  625. u_int  tagenable;
  626. size_t  driver_data_size;
  627. uint32_t physaddr;
  628. #ifdef AHC_DEBUG_SEQUENCER
  629. ahc->flags |= AHC_SEQUENCER_DEBUG;
  630. #endif
  631. #ifdef AHC_PRINT_SRAM
  632. printf("Scratch Ram:");
  633. for (i = 0x20; i < 0x5f; i++) {
  634. if (((i % 8) == 0) && (i != 0)) {
  635. printf ("n              ");
  636. }
  637. printf (" 0x%x", ahc_inb(ahc, i));
  638. }
  639. if ((ahc->features & AHC_MORE_SRAM) != 0) {
  640. for (i = 0x70; i < 0x7f; i++) {
  641. if (((i % 8) == 0) && (i != 0)) {
  642. printf ("n              ");
  643. }
  644. printf (" 0x%x", ahc_inb(ahc, i));
  645. }
  646. }
  647. printf ("n");
  648. #endif
  649. max_targ = 15;
  650. /*
  651.  * Assume we have a board at this stage and it has been reset.
  652.  */
  653. if ((ahc->flags & AHC_USEDEFAULTS) != 0)
  654. ahc->our_id = ahc->our_id_b = 7;
  655. /*
  656.  * Default to allowing initiator operations.
  657.  */
  658. ahc->flags |= AHC_INITIATORROLE;
  659. /*
  660.  * Only allow target mode features if this unit has them enabled.
  661.  */
  662. if ((AHC_TMODE_ENABLE & (0x1 << ahc->unit)) == 0)
  663. ahc->features &= ~AHC_TARGETMODE;
  664. #ifndef __linux__
  665. /* DMA tag for mapping buffers into device visible space. */
  666. if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
  667.        /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
  668.        /*lowaddr*/BUS_SPACE_MAXADDR,
  669.        /*highaddr*/BUS_SPACE_MAXADDR,
  670.        /*filter*/NULL, /*filterarg*/NULL,
  671.        /*maxsize*/MAXBSIZE, /*nsegments*/AHC_NSEG,
  672.        /*maxsegsz*/AHC_MAXTRANSFER_SIZE,
  673.        /*flags*/BUS_DMA_ALLOCNOW,
  674.        &ahc->buffer_dmat) != 0) {
  675. return (ENOMEM);
  676. }
  677. #endif
  678. ahc->init_level++;
  679. /*
  680.  * DMA tag for our command fifos and other data in system memory
  681.  * the card's sequencer must be able to access.  For initiator
  682.  * roles, we need to allocate space for the the qinfifo and qoutfifo.
  683.  * The qinfifo and qoutfifo are composed of 256 1 byte elements. 
  684.  * When providing for the target mode role, we must additionally
  685.  * provide space for the incoming target command fifo and an extra
  686.  * byte to deal with a dma bug in some chip versions.
  687.  */
  688. driver_data_size = 2 * 256 * sizeof(uint8_t);
  689. if ((ahc->features & AHC_TARGETMODE) != 0)
  690. driver_data_size += AHC_TMODE_CMDS * sizeof(struct target_cmd)
  691.  + /*DMA WideOdd Bug Buffer*/1;
  692. if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
  693.        /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
  694.        /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
  695.        /*highaddr*/BUS_SPACE_MAXADDR,
  696.        /*filter*/NULL, /*filterarg*/NULL,
  697.        driver_data_size,
  698.        /*nsegments*/1,
  699.        /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
  700.        /*flags*/0, &ahc->shared_data_dmat) != 0) {
  701. return (ENOMEM);
  702. }
  703. ahc->init_level++;
  704. /* Allocation of driver data */
  705. if (ahc_dmamem_alloc(ahc, ahc->shared_data_dmat,
  706.      (void **)&ahc->qoutfifo,
  707.      BUS_DMA_NOWAIT, &ahc->shared_data_dmamap) != 0) {
  708. return (ENOMEM);
  709. }
  710. ahc->init_level++;
  711. /* And permanently map it in */
  712. ahc_dmamap_load(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
  713. ahc->qoutfifo, driver_data_size, ahc_dmamap_cb,
  714. &ahc->shared_data_busaddr, /*flags*/0);
  715. if ((ahc->features & AHC_TARGETMODE) != 0) {
  716. ahc->targetcmds = (struct target_cmd *)ahc->qoutfifo;
  717. ahc->qoutfifo = (uint8_t *)&ahc->targetcmds[AHC_TMODE_CMDS];
  718. ahc->dma_bug_buf = ahc->shared_data_busaddr
  719.  + driver_data_size - 1;
  720. /* All target command blocks start out invalid. */
  721. for (i = 0; i < AHC_TMODE_CMDS; i++)
  722. ahc->targetcmds[i].cmd_valid = 0;
  723. ahc_sync_tqinfifo(ahc, BUS_DMASYNC_PREREAD);
  724. ahc->tqinfifonext = 1;
  725. ahc_outb(ahc, KERNEL_TQINPOS, ahc->tqinfifonext - 1);
  726. ahc_outb(ahc, TQINPOS, ahc->tqinfifonext);
  727. ahc->qoutfifo = (uint8_t *)&ahc->targetcmds[256];
  728. }
  729. ahc->qinfifo = &ahc->qoutfifo[256];
  730. ahc->init_level++;
  731. /* Allocate SCB data now that buffer_dmat is initialized */
  732. if (ahc->scb_data->maxhscbs == 0)
  733. if (ahc_init_scbdata(ahc) != 0)
  734. return (ENOMEM);
  735. /*
  736.  * Allocate a tstate to house information for our
  737.  * initiator presence on the bus as well as the user
  738.  * data for any target mode initiator.
  739.  */
  740. if (ahc_alloc_tstate(ahc, ahc->our_id, 'A') == NULL) {
  741. printf("%s: unable to allocate ahc_tmode_tstate.  "
  742.        "Failing attachn", ahc_name(ahc));
  743. return (ENOMEM);
  744. }
  745. if ((ahc->features & AHC_TWIN) != 0) {
  746. if (ahc_alloc_tstate(ahc, ahc->our_id_b, 'B') == NULL) {
  747. printf("%s: unable to allocate ahc_tmode_tstate.  "
  748.        "Failing attachn", ahc_name(ahc));
  749. return (ENOMEM);
  750. }
  751. }
  752. ahc_outb(ahc, SEQ_FLAGS, 0);
  753. ahc_outb(ahc, SEQ_FLAGS2, 0);
  754. if (ahc->scb_data->maxhscbs < AHC_SCB_MAX_ALLOC) {
  755. ahc->flags |= AHC_PAGESCBS;
  756. } else {
  757. ahc->flags &= ~AHC_PAGESCBS;
  758. }
  759. #ifdef AHC_DEBUG
  760. if (ahc_debug & AHC_SHOWMISC) {
  761. printf("%s: hardware scb %d bytes; kernel scb %d bytes; "
  762.        "ahc_dma %d bytesn",
  763. ahc_name(ahc),
  764. sizeof(struct hardware_scb),
  765. sizeof(struct scb),
  766. sizeof(struct ahc_dma_seg));
  767. }
  768. #endif /* AHC_DEBUG */
  769. /* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/
  770. if (ahc->features & AHC_TWIN) {
  771. /*
  772.  * The device is gated to channel B after a chip reset,
  773.  * so set those values first
  774.  */
  775. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
  776. term = (ahc->flags & AHC_TERM_ENB_B) != 0 ? STPWEN : 0;
  777. ahc_outb(ahc, SCSIID, ahc->our_id_b);
  778. scsi_conf = ahc_inb(ahc, SCSICONF + 1);
  779. ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
  780. |term|ahc->seltime_b|ENSTIMER|ACTNEGEN);
  781. if ((ahc->features & AHC_ULTRA2) != 0)
  782. ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
  783. ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
  784. ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
  785. if ((scsi_conf & RESET_SCSI) != 0
  786.  && (ahc->flags & AHC_INITIATORROLE) != 0)
  787. ahc->flags |= AHC_RESET_BUS_B;
  788. /* Select Channel A */
  789. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
  790. }
  791. term = (ahc->flags & AHC_TERM_ENB_A) != 0 ? STPWEN : 0;
  792. if ((ahc->features & AHC_ULTRA2) != 0)
  793. ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
  794. else
  795. ahc_outb(ahc, SCSIID, ahc->our_id);
  796. scsi_conf = ahc_inb(ahc, SCSICONF);
  797. ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
  798. |term|ahc->seltime
  799. |ENSTIMER|ACTNEGEN);
  800. if ((ahc->features & AHC_ULTRA2) != 0)
  801. ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
  802. ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
  803. ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
  804. if ((scsi_conf & RESET_SCSI) != 0
  805.  && (ahc->flags & AHC_INITIATORROLE) != 0)
  806. ahc->flags |= AHC_RESET_BUS_A;
  807. /*
  808.  * Look at the information that board initialization or
  809.  * the board bios has left us.
  810.  */
  811. ultraenb = 0;
  812. tagenable = ALL_TARGETS_MASK;
  813. /* Grab the disconnection disable table and invert it for our needs */
  814. if (ahc->flags & AHC_USEDEFAULTS) {
  815. printf("%s: Host Adapter Bios disabled.  Using default SCSI "
  816. "device parametersn", ahc_name(ahc));
  817. ahc->flags |= AHC_EXTENDED_TRANS_A|AHC_EXTENDED_TRANS_B|
  818.       AHC_TERM_ENB_A|AHC_TERM_ENB_B;
  819. discenable = ALL_TARGETS_MASK;
  820. if ((ahc->features & AHC_ULTRA) != 0)
  821. ultraenb = ALL_TARGETS_MASK;
  822. } else {
  823. discenable = ~((ahc_inb(ahc, DISC_DSB + 1) << 8)
  824.    | ahc_inb(ahc, DISC_DSB));
  825. if ((ahc->features & (AHC_ULTRA|AHC_ULTRA2)) != 0)
  826. ultraenb = (ahc_inb(ahc, ULTRA_ENB + 1) << 8)
  827.       | ahc_inb(ahc, ULTRA_ENB);
  828. }
  829. if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
  830. max_targ = 7;
  831. for (i = 0; i <= max_targ; i++) {
  832. struct ahc_initiator_tinfo *tinfo;
  833. struct ahc_tmode_tstate *tstate;
  834. u_int our_id;
  835. u_int target_id;
  836. char channel;
  837. channel = 'A';
  838. our_id = ahc->our_id;
  839. target_id = i;
  840. if (i > 7 && (ahc->features & AHC_TWIN) != 0) {
  841. channel = 'B';
  842. our_id = ahc->our_id_b;
  843. target_id = i % 8;
  844. }
  845. tinfo = ahc_fetch_transinfo(ahc, channel, our_id,
  846.     target_id, &tstate);
  847. /* Default to async narrow across the board */
  848. memset(tinfo, 0, sizeof(*tinfo));
  849. if (ahc->flags & AHC_USEDEFAULTS) {
  850. if ((ahc->features & AHC_WIDE) != 0)
  851. tinfo->user.width = MSG_EXT_WDTR_BUS_16_BIT;
  852. /*
  853.  * These will be truncated when we determine the
  854.  * connection type we have with the target.
  855.  */
  856. tinfo->user.period = ahc_syncrates->period;
  857. tinfo->user.offset = ~0;
  858. } else {
  859. u_int scsirate;
  860. uint16_t mask;
  861. /* Take the settings leftover in scratch RAM. */
  862. scsirate = ahc_inb(ahc, TARG_SCSIRATE + i);
  863. mask = (0x01 << i);
  864. if ((ahc->features & AHC_ULTRA2) != 0) {
  865. u_int offset;
  866. u_int maxsync;
  867. if ((scsirate & SOFS) == 0x0F) {
  868. /*
  869.  * Haven't negotiated yet,
  870.  * so the format is different.
  871.  */
  872. scsirate = (scsirate & SXFR) >> 4
  873.  | (ultraenb & mask)
  874.   ? 0x08 : 0x0
  875.  | (scsirate & WIDEXFER);
  876. offset = MAX_OFFSET_ULTRA2;
  877. } else
  878. offset = ahc_inb(ahc, TARG_OFFSET + i);
  879. if ((scsirate & ~WIDEXFER) == 0 && offset != 0)
  880. /* Set to the lowest sync rate, 5MHz */
  881. scsirate |= 0x1c;
  882. maxsync = AHC_SYNCRATE_ULTRA2;
  883. if ((ahc->features & AHC_DT) != 0)
  884. maxsync = AHC_SYNCRATE_DT;
  885. tinfo->user.period =
  886.     ahc_find_period(ahc, scsirate, maxsync);
  887. if (offset == 0)
  888. tinfo->user.period = 0;
  889. else
  890. tinfo->user.offset = ~0;
  891. if ((scsirate & SXFR_ULTRA2) <= 8/*10MHz*/
  892.  && (ahc->features & AHC_DT) != 0)
  893. tinfo->user.ppr_options =
  894.     MSG_EXT_PPR_DT_REQ;
  895. } else if ((scsirate & SOFS) != 0) {
  896. if ((scsirate & SXFR) == 0x40
  897.  && (ultraenb & mask) != 0) {
  898. /* Treat 10MHz as a non-ultra speed */
  899. scsirate &= ~SXFR;
  900.   ultraenb &= ~mask;
  901. }
  902. tinfo->user.period = 
  903.     ahc_find_period(ahc, scsirate,
  904.     (ultraenb & mask)
  905.    ? AHC_SYNCRATE_ULTRA
  906.    : AHC_SYNCRATE_FAST);
  907. if (tinfo->user.period != 0)
  908. tinfo->user.offset = ~0;
  909. }
  910. if (tinfo->user.period == 0)
  911. tinfo->user.offset = 0;
  912. if ((scsirate & WIDEXFER) != 0
  913.  && (ahc->features & AHC_WIDE) != 0)
  914. tinfo->user.width = MSG_EXT_WDTR_BUS_16_BIT;
  915. tinfo->user.protocol_version = 4;
  916. if ((ahc->features & AHC_DT) != 0)
  917. tinfo->user.transport_version = 3;
  918. else
  919. tinfo->user.transport_version = 2;
  920. tinfo->goal.protocol_version = 2;
  921. tinfo->goal.transport_version = 2;
  922. tinfo->curr.protocol_version = 2;
  923. tinfo->curr.transport_version = 2;
  924. }
  925. tstate->ultraenb = ultraenb;
  926. }
  927. ahc->user_discenable = discenable;
  928. ahc->user_tagenable = tagenable;
  929. /* There are no untagged SCBs active yet. */
  930. for (i = 0; i < 16; i++) {
  931. ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, 0));
  932. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  933. int lun;
  934. /*
  935.  * The SCB based BTT allows an entry per
  936.  * target and lun pair.
  937.  */
  938. for (lun = 1; lun < AHC_NUM_LUNS; lun++)
  939. ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, lun));
  940. }
  941. }
  942. /* All of our queues are empty */
  943. for (i = 0; i < 256; i++)
  944. ahc->qoutfifo[i] = SCB_LIST_NULL;
  945. ahc_sync_qoutfifo(ahc, BUS_DMASYNC_PREREAD);
  946. for (i = 0; i < 256; i++)
  947. ahc->qinfifo[i] = SCB_LIST_NULL;
  948. if ((ahc->features & AHC_MULTI_TID) != 0) {
  949. ahc_outb(ahc, TARGID, 0);
  950. ahc_outb(ahc, TARGID + 1, 0);
  951. }
  952. /*
  953.  * Tell the sequencer where it can find our arrays in memory.
  954.  */
  955. physaddr = ahc->scb_data->hscb_busaddr;
  956. ahc_outb(ahc, HSCB_ADDR, physaddr & 0xFF);
  957. ahc_outb(ahc, HSCB_ADDR + 1, (physaddr >> 8) & 0xFF);
  958. ahc_outb(ahc, HSCB_ADDR + 2, (physaddr >> 16) & 0xFF);
  959. ahc_outb(ahc, HSCB_ADDR + 3, (physaddr >> 24) & 0xFF);
  960. physaddr = ahc->shared_data_busaddr;
  961. ahc_outb(ahc, SHARED_DATA_ADDR, physaddr & 0xFF);
  962. ahc_outb(ahc, SHARED_DATA_ADDR + 1, (physaddr >> 8) & 0xFF);
  963. ahc_outb(ahc, SHARED_DATA_ADDR + 2, (physaddr >> 16) & 0xFF);
  964. ahc_outb(ahc, SHARED_DATA_ADDR + 3, (physaddr >> 24) & 0xFF);
  965. /*
  966.  * Initialize the group code to command length table.
  967.  * This overrides the values in TARG_SCSIRATE, so only
  968.  * setup the table after we have processed that information.
  969.  */
  970. ahc_outb(ahc, CMDSIZE_TABLE, 5);
  971. ahc_outb(ahc, CMDSIZE_TABLE + 1, 9);
  972. ahc_outb(ahc, CMDSIZE_TABLE + 2, 9);
  973. ahc_outb(ahc, CMDSIZE_TABLE + 3, 0);
  974. ahc_outb(ahc, CMDSIZE_TABLE + 4, 15);
  975. ahc_outb(ahc, CMDSIZE_TABLE + 5, 11);
  976. ahc_outb(ahc, CMDSIZE_TABLE + 6, 0);
  977. ahc_outb(ahc, CMDSIZE_TABLE + 7, 0);
  978. /* Tell the sequencer of our initial queue positions */
  979. ahc_outb(ahc, KERNEL_QINPOS, 0);
  980. ahc_outb(ahc, QINPOS, 0);
  981. ahc_outb(ahc, QOUTPOS, 0);
  982. /*
  983.  * Use the built in queue management registers
  984.  * if they are available.
  985.  */
  986. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  987. ahc_outb(ahc, QOFF_CTLSTA, SCB_QSIZE_256);
  988. ahc_outb(ahc, SDSCB_QOFF, 0);
  989. ahc_outb(ahc, SNSCB_QOFF, 0);
  990. ahc_outb(ahc, HNSCB_QOFF, 0);
  991. }
  992. /* We don't have any waiting selections */
  993. ahc_outb(ahc, WAITING_SCBH, SCB_LIST_NULL);
  994. /* Our disconnection list is empty too */
  995. ahc_outb(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL);
  996. /* Message out buffer starts empty */
  997. ahc_outb(ahc, MSG_OUT, MSG_NOOP);
  998. /*
  999.  * Setup the allowed SCSI Sequences based on operational mode.
  1000.  * If we are a target, we'll enalbe select in operations once
  1001.  * we've had a lun enabled.
  1002.  */
  1003. scsiseq_template = ENSELO|ENAUTOATNO|ENAUTOATNP;
  1004. if ((ahc->flags & AHC_INITIATORROLE) != 0)
  1005. scsiseq_template |= ENRSELI;
  1006. ahc_outb(ahc, SCSISEQ_TEMPLATE, scsiseq_template);
  1007. /*
  1008.  * Load the Sequencer program and Enable the adapter
  1009.  * in "fast" mode.
  1010.  */
  1011. if (bootverbose)
  1012. printf("%s: Downloading Sequencer Program...",
  1013.        ahc_name(ahc));
  1014. ahc_loadseq(ahc);
  1015. if ((ahc->features & AHC_ULTRA2) != 0) {
  1016. int wait;
  1017. /*
  1018.  * Wait for up to 500ms for our transceivers
  1019.  * to settle.  If the adapter does not have
  1020.  * a cable attached, the tranceivers may
  1021.  * never settle, so don't complain if we
  1022.  * fail here.
  1023.  */
  1024. ahc_pause(ahc);
  1025. for (wait = 5000;
  1026.      (ahc_inb(ahc, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
  1027.      wait--)
  1028. ahc_delay(100);
  1029. ahc_unpause(ahc);
  1030. }
  1031. return (0);
  1032. }
  1033. void
  1034. ahc_intr_enable(struct ahc_softc *ahc, int enable)
  1035. {
  1036. u_int hcntrl;
  1037. hcntrl = ahc_inb(ahc, HCNTRL);
  1038. hcntrl &= ~INTEN;
  1039. ahc->pause &= ~INTEN;
  1040. ahc->unpause &= ~INTEN;
  1041. if (enable) {
  1042. hcntrl |= INTEN;
  1043. ahc->pause |= INTEN;
  1044. ahc->unpause |= INTEN;
  1045. }
  1046. ahc_outb(ahc, HCNTRL, hcntrl);
  1047. }
  1048. /*
  1049.  * Ensure that the card is paused in a location
  1050.  * outside of all critical sections and that all
  1051.  * pending work is completed prior to returning.
  1052.  * This routine should only be called from outside
  1053.  * an interrupt context.
  1054.  */
  1055. void
  1056. ahc_pause_and_flushwork(struct ahc_softc *ahc)
  1057. {
  1058. int intstat;
  1059. int maxloops;
  1060. maxloops = 1000;
  1061. ahc->flags |= AHC_ALL_INTERRUPTS;
  1062. intstat = 0;
  1063. do {
  1064. ahc_intr(ahc);
  1065. ahc_pause(ahc);
  1066. ahc_clear_critical_section(ahc);
  1067. if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0)
  1068. break;
  1069. maxloops--;
  1070. } while (((intstat = ahc_inb(ahc, INTSTAT)) & INT_PEND) && --maxloops);
  1071. if (maxloops == 0) {
  1072. printf("Infinite interrupt loop, INTSTAT = %x",
  1073.       ahc_inb(ahc, INTSTAT));
  1074. }
  1075. ahc_platform_flushwork(ahc);
  1076. ahc->flags &= ~AHC_ALL_INTERRUPTS;
  1077. }
  1078. int
  1079. ahc_suspend(struct ahc_softc *ahc)
  1080. {
  1081. uint8_t *ptr;
  1082. int  i;
  1083. ahc_pause_and_flushwork(ahc);
  1084. if (LIST_FIRST(&ahc->pending_scbs) != NULL)
  1085. return (EBUSY);
  1086. #if AHC_TARGET_MODE
  1087. /*
  1088.  * XXX What about ATIOs that have not yet been serviced?
  1089.  * Perhaps we should just refuse to be suspended if we
  1090.  * are acting in a target role.
  1091.  */
  1092. if (ahc->pending_device != NULL)
  1093. return (EBUSY);
  1094. #endif
  1095. /* Save volatile registers */
  1096. if ((ahc->features & AHC_TWIN) != 0) {
  1097. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
  1098. ahc->suspend_state.channel[1].scsiseq = ahc_inb(ahc, SCSISEQ);
  1099. ahc->suspend_state.channel[1].sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
  1100. ahc->suspend_state.channel[1].sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
  1101. ahc->suspend_state.channel[1].simode0 = ahc_inb(ahc, SIMODE0);
  1102. ahc->suspend_state.channel[1].simode1 = ahc_inb(ahc, SIMODE1);
  1103. ahc->suspend_state.channel[1].seltimer = ahc_inb(ahc, SELTIMER);
  1104. ahc->suspend_state.channel[1].seqctl = ahc_inb(ahc, SEQCTL);
  1105. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
  1106. }
  1107. ahc->suspend_state.channel[0].scsiseq = ahc_inb(ahc, SCSISEQ);
  1108. ahc->suspend_state.channel[0].sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
  1109. ahc->suspend_state.channel[0].sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
  1110. ahc->suspend_state.channel[0].simode0 = ahc_inb(ahc, SIMODE0);
  1111. ahc->suspend_state.channel[0].simode1 = ahc_inb(ahc, SIMODE1);
  1112. ahc->suspend_state.channel[0].seltimer = ahc_inb(ahc, SELTIMER);
  1113. ahc->suspend_state.channel[0].seqctl = ahc_inb(ahc, SEQCTL);
  1114. if ((ahc->chip & AHC_PCI) != 0) {
  1115. ahc->suspend_state.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
  1116. ahc->suspend_state.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
  1117. }
  1118. if ((ahc->features & AHC_DT) != 0) {
  1119. u_int sfunct;
  1120. sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
  1121. ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
  1122. ahc->suspend_state.optionmode = ahc_inb(ahc, OPTIONMODE);
  1123. ahc_outb(ahc, SFUNCT, sfunct);
  1124. ahc->suspend_state.crccontrol1 = ahc_inb(ahc, CRCCONTROL1);
  1125. }
  1126. if ((ahc->features & AHC_MULTI_FUNC) != 0)
  1127. ahc->suspend_state.scbbaddr = ahc_inb(ahc, SCBBADDR);
  1128. if ((ahc->features & AHC_ULTRA2) != 0)
  1129. ahc->suspend_state.dff_thrsh = ahc_inb(ahc, DFF_THRSH);
  1130. ptr = ahc->suspend_state.scratch_ram;
  1131. for (i = 0; i < 64; i++)
  1132. *ptr++ = ahc_inb(ahc, SRAM_BASE + i);
  1133. if ((ahc->features & AHC_MORE_SRAM) != 0) {
  1134. for (i = 0; i < 16; i++)
  1135. *ptr++ = ahc_inb(ahc, TARG_OFFSET + i);
  1136. }
  1137. ptr = ahc->suspend_state.btt;
  1138. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1139. for (i = 0;i < AHC_NUM_TARGETS; i++) {
  1140. int j;
  1141. for (j = 0;j < AHC_NUM_LUNS; j++) {
  1142. u_int tcl;
  1143. tcl = BUILD_TCL(i << 4, j);
  1144. *ptr = ahc_index_busy_tcl(ahc, tcl);
  1145. }
  1146. }
  1147. }
  1148. ahc_shutdown(ahc);
  1149. return (0);
  1150. }
  1151. int
  1152. ahc_resume(struct ahc_softc *ahc)
  1153. {
  1154. uint8_t *ptr;
  1155. int  i;
  1156. ahc_reset(ahc);
  1157. ahc_build_free_scb_list(ahc);
  1158. /* Restore volatile registers */
  1159. if ((ahc->features & AHC_TWIN) != 0) {
  1160. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
  1161. ahc_outb(ahc, SCSIID, ahc->our_id);
  1162. ahc_outb(ahc, SCSISEQ, ahc->suspend_state.channel[1].scsiseq);
  1163. ahc_outb(ahc, SXFRCTL0, ahc->suspend_state.channel[1].sxfrctl0);
  1164. ahc_outb(ahc, SXFRCTL1, ahc->suspend_state.channel[1].sxfrctl1);
  1165. ahc_outb(ahc, SIMODE0, ahc->suspend_state.channel[1].simode0);
  1166. ahc_outb(ahc, SIMODE1, ahc->suspend_state.channel[1].simode1);
  1167. ahc_outb(ahc, SELTIMER, ahc->suspend_state.channel[1].seltimer);
  1168. ahc_outb(ahc, SEQCTL, ahc->suspend_state.channel[1].seqctl);
  1169. ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
  1170. }
  1171. ahc_outb(ahc, SCSISEQ, ahc->suspend_state.channel[0].scsiseq);
  1172. ahc_outb(ahc, SXFRCTL0, ahc->suspend_state.channel[0].sxfrctl0);
  1173. ahc_outb(ahc, SXFRCTL1, ahc->suspend_state.channel[0].sxfrctl1);
  1174. ahc_outb(ahc, SIMODE0, ahc->suspend_state.channel[0].simode0);
  1175. ahc_outb(ahc, SIMODE1, ahc->suspend_state.channel[0].simode1);
  1176. ahc_outb(ahc, SELTIMER, ahc->suspend_state.channel[0].seltimer);
  1177. ahc_outb(ahc, SEQCTL, ahc->suspend_state.channel[0].seqctl);
  1178. if ((ahc->features & AHC_ULTRA2) != 0)
  1179. ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
  1180. else
  1181. ahc_outb(ahc, SCSIID, ahc->our_id);
  1182. if ((ahc->chip & AHC_PCI) != 0) {
  1183. ahc_outb(ahc, DSCOMMAND0, ahc->suspend_state.dscommand0);
  1184. ahc_outb(ahc, DSPCISTATUS, ahc->suspend_state.dspcistatus);
  1185. }
  1186. if ((ahc->features & AHC_DT) != 0) {
  1187. u_int sfunct;
  1188. sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
  1189. ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
  1190. ahc_outb(ahc, OPTIONMODE, ahc->suspend_state.optionmode);
  1191. ahc_outb(ahc, SFUNCT, sfunct);
  1192. ahc_outb(ahc, CRCCONTROL1, ahc->suspend_state.crccontrol1);
  1193. }
  1194. if ((ahc->features & AHC_MULTI_FUNC) != 0)
  1195. ahc_outb(ahc, SCBBADDR, ahc->suspend_state.scbbaddr);
  1196. if ((ahc->features & AHC_ULTRA2) != 0)
  1197. ahc_outb(ahc, DFF_THRSH, ahc->suspend_state.dff_thrsh);
  1198. ptr = ahc->suspend_state.scratch_ram;
  1199. for (i = 0; i < 64; i++)
  1200. ahc_outb(ahc, SRAM_BASE + i, *ptr++);
  1201. if ((ahc->features & AHC_MORE_SRAM) != 0) {
  1202. for (i = 0; i < 16; i++)
  1203. ahc_outb(ahc, TARG_OFFSET + i, *ptr++);
  1204. }
  1205. ptr = ahc->suspend_state.btt;
  1206. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1207. for (i = 0;i < AHC_NUM_TARGETS; i++) {
  1208. int j;
  1209. for (j = 0;j < AHC_NUM_LUNS; j++) {
  1210. u_int tcl;
  1211. tcl = BUILD_TCL(i << 4, j);
  1212. ahc_busy_tcl(ahc, tcl, *ptr);
  1213. }
  1214. }
  1215. }
  1216. return (0);
  1217. }
  1218. /************************** Busy Target Table *********************************/
  1219. /*
  1220.  * Return the untagged transaction id for a given target/channel lun.
  1221.  * Optionally, clear the entry.
  1222.  */
  1223. u_int
  1224. ahc_index_busy_tcl(struct ahc_softc *ahc, u_int tcl)
  1225. {
  1226. u_int scbid;
  1227. u_int target_offset;
  1228. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1229. u_int saved_scbptr;
  1230. saved_scbptr = ahc_inb(ahc, SCBPTR);
  1231. ahc_outb(ahc, SCBPTR, TCL_LUN(tcl));
  1232. scbid = ahc_inb(ahc, SCB_64_BTT + TCL_TARGET_OFFSET(tcl));
  1233. ahc_outb(ahc, SCBPTR, saved_scbptr);
  1234. } else {
  1235. target_offset = TCL_TARGET_OFFSET(tcl);
  1236. scbid = ahc_inb(ahc, BUSY_TARGETS + target_offset);
  1237. }
  1238. return (scbid);
  1239. }
  1240. void
  1241. ahc_unbusy_tcl(struct ahc_softc *ahc, u_int tcl)
  1242. {
  1243. u_int target_offset;
  1244. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1245. u_int saved_scbptr;
  1246. saved_scbptr = ahc_inb(ahc, SCBPTR);
  1247. ahc_outb(ahc, SCBPTR, TCL_LUN(tcl));
  1248. ahc_outb(ahc, SCB_64_BTT+TCL_TARGET_OFFSET(tcl), SCB_LIST_NULL);
  1249. ahc_outb(ahc, SCBPTR, saved_scbptr);
  1250. } else {
  1251. target_offset = TCL_TARGET_OFFSET(tcl);
  1252. ahc_outb(ahc, BUSY_TARGETS + target_offset, SCB_LIST_NULL);
  1253. }
  1254. }
  1255. void
  1256. ahc_busy_tcl(struct ahc_softc *ahc, u_int tcl, u_int scbid)
  1257. {
  1258. u_int target_offset;
  1259. if ((ahc->flags & AHC_SCB_BTT) != 0) {
  1260. u_int saved_scbptr;
  1261. saved_scbptr = ahc_inb(ahc, SCBPTR);
  1262. ahc_outb(ahc, SCBPTR, TCL_LUN(tcl));
  1263. ahc_outb(ahc, SCB_64_BTT + TCL_TARGET_OFFSET(tcl), scbid);
  1264. ahc_outb(ahc, SCBPTR, saved_scbptr);
  1265. } else {
  1266. target_offset = TCL_TARGET_OFFSET(tcl);
  1267. ahc_outb(ahc, BUSY_TARGETS + target_offset, scbid);
  1268. }
  1269. }
  1270. /************************** SCB and SCB queue management **********************/
  1271. int
  1272. ahc_match_scb(struct ahc_softc *ahc, struct scb *scb, int target,
  1273.       char channel, int lun, u_int tag, role_t role)
  1274. {
  1275. int targ = SCB_GET_TARGET(ahc, scb);
  1276. char chan = SCB_GET_CHANNEL(ahc, scb);
  1277. int slun = SCB_GET_LUN(scb);
  1278. int match;
  1279. match = ((chan == channel) || (channel == ALL_CHANNELS));
  1280. if (match != 0)
  1281. match = ((targ == target) || (target == CAM_TARGET_WILDCARD));
  1282. if (match != 0)
  1283. match = ((lun == slun) || (lun == CAM_LUN_WILDCARD));
  1284. if (match != 0) {
  1285. #if AHC_TARGET_MODE
  1286. int group;
  1287. group = XPT_FC_GROUP(scb->io_ctx->ccb_h.func_code);
  1288. if (role == ROLE_INITIATOR) {
  1289. match = (group != XPT_FC_GROUP_TMODE)
  1290.       && ((tag == scb->hscb->tag)
  1291.        || (tag == SCB_LIST_NULL));
  1292. } else if (role == ROLE_TARGET) {
  1293. match = (group == XPT_FC_GROUP_TMODE)
  1294.       && ((tag == scb->io_ctx->csio.tag_id)
  1295.        || (tag == SCB_LIST_NULL));
  1296. }
  1297. #else /* !AHC_TARGET_MODE */
  1298. match = ((tag == scb->hscb->tag) || (tag == SCB_LIST_NULL));
  1299. #endif /* AHC_TARGET_MODE */
  1300. }
  1301. return match;
  1302. }
  1303. void
  1304. ahc_freeze_devq(struct ahc_softc *ahc, struct scb *scb)
  1305. {
  1306. int target;
  1307. char channel;
  1308. int lun;
  1309. target = SCB_GET_TARGET(ahc, scb);
  1310. lun = SCB_GET_LUN(scb);
  1311. channel = SCB_GET_CHANNEL(ahc, scb);
  1312. ahc_search_qinfifo(ahc, target, channel, lun,
  1313.    /*tag*/SCB_LIST_NULL, ROLE_UNKNOWN,
  1314.    CAM_REQUEUE_REQ, SEARCH_COMPLETE);
  1315. ahc_platform_freeze_devq(ahc, scb);
  1316. }
  1317. void
  1318. ahc_qinfifo_requeue_tail(struct ahc_softc *ahc, struct scb *scb)
  1319. {
  1320. struct scb *prev_scb;
  1321. prev_scb = NULL;
  1322. if (ahc_qinfifo_count(ahc) != 0) {
  1323. u_int prev_tag;
  1324. uint8_t prev_pos;
  1325. prev_pos = ahc->qinfifonext - 1;
  1326. prev_tag = ahc->qinfifo[prev_pos];
  1327. prev_scb = ahc_lookup_scb(ahc, prev_tag);
  1328. }
  1329. ahc_qinfifo_requeue(ahc, prev_scb, scb);
  1330. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  1331. ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
  1332. } else {
  1333. ahc_outb(ahc, KERNEL_QINPOS, ahc->qinfifonext);
  1334. }
  1335. }
  1336. static void
  1337. ahc_qinfifo_requeue(struct ahc_softc *ahc, struct scb *prev_scb,
  1338.     struct scb *scb)
  1339. {
  1340. if (prev_scb == NULL) {
  1341. ahc_outb(ahc, NEXT_QUEUED_SCB, scb->hscb->tag);
  1342. } else {
  1343. prev_scb->hscb->next = scb->hscb->tag;
  1344. ahc_sync_scb(ahc, prev_scb, 
  1345.      BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
  1346. }
  1347. ahc->qinfifo[ahc->qinfifonext++] = scb->hscb->tag;
  1348. scb->hscb->next = ahc->next_queued_scb->hscb->tag;
  1349. ahc_sync_scb(ahc, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
  1350. }
  1351. static int
  1352. ahc_qinfifo_count(struct ahc_softc *ahc)
  1353. {
  1354. u_int8_t qinpos;
  1355. u_int8_t diff;
  1356. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  1357. qinpos = ahc_inb(ahc, SNSCB_QOFF);
  1358. ahc_outb(ahc, SNSCB_QOFF, qinpos);
  1359. } else
  1360. qinpos = ahc_inb(ahc, QINPOS);
  1361. diff = ahc->qinfifonext - qinpos;
  1362. return (diff);
  1363. }
  1364. int
  1365. ahc_search_qinfifo(struct ahc_softc *ahc, int target, char channel,
  1366.    int lun, u_int tag, role_t role, uint32_t status,
  1367.    ahc_search_action action)
  1368. {
  1369. struct scb *scb;
  1370. struct scb *prev_scb;
  1371. uint8_t qinstart;
  1372. uint8_t qinpos;
  1373. uint8_t qintail;
  1374. uint8_t next, prev;
  1375. uint8_t curscbptr;
  1376. int found;
  1377. int maxtarget;
  1378. int i;
  1379. int have_qregs;
  1380. qintail = ahc->qinfifonext;
  1381. have_qregs = (ahc->features & AHC_QUEUE_REGS) != 0;
  1382. if (have_qregs) {
  1383. qinstart = ahc_inb(ahc, SNSCB_QOFF);
  1384. ahc_outb(ahc, SNSCB_QOFF, qinstart);
  1385. } else
  1386. qinstart = ahc_inb(ahc, QINPOS);
  1387. qinpos = qinstart;
  1388. next = ahc_inb(ahc, NEXT_QUEUED_SCB);
  1389. found = 0;
  1390. prev_scb = NULL;
  1391. if (action == SEARCH_COMPLETE) {
  1392. /*
  1393.  * Don't attempt to run any queued untagged transactions
  1394.  * until we are done with the abort process.
  1395.  */
  1396. ahc_freeze_untagged_queues(ahc);
  1397. }
  1398. /*
  1399.  * Start with an empty queue.  Entries that are not chosen
  1400.  * for removal will be re-added to the queue as we go.
  1401.  */
  1402. ahc->qinfifonext = qinpos;
  1403. ahc_outb(ahc, NEXT_QUEUED_SCB, ahc->next_queued_scb->hscb->tag);
  1404. while (qinpos != qintail) {
  1405. scb = ahc_lookup_scb(ahc, ahc->qinfifo[qinpos]);
  1406. if (scb == NULL) {
  1407. printf("qinpos = %d, SCB index = %dn",
  1408. qinpos, ahc->qinfifo[qinpos]);
  1409. panic("Loop 1n");
  1410. }
  1411. if (ahc_match_scb(ahc, scb, target, channel, lun, tag, role)) {
  1412. /*
  1413.  * We found an scb that needs to be acted on.
  1414.  */
  1415. found++;
  1416. switch (action) {
  1417. case SEARCH_COMPLETE:
  1418. {
  1419. cam_status ostat;
  1420. cam_status cstat;
  1421. ostat = ahc_get_transaction_status(scb);
  1422. if (ostat == CAM_REQ_INPROG)
  1423. ahc_set_transaction_status(scb,
  1424.    status);
  1425. cstat = ahc_get_transaction_status(scb);
  1426. if (cstat != CAM_REQ_CMP)
  1427. ahc_freeze_scb(scb);
  1428. if ((scb->flags & SCB_ACTIVE) == 0)
  1429. printf("Inactive SCB in qinfifon");
  1430. ahc_done(ahc, scb);
  1431. /* FALLTHROUGH */
  1432. case SEARCH_REMOVE:
  1433. break;
  1434. }
  1435. case SEARCH_COUNT:
  1436. ahc_qinfifo_requeue(ahc, prev_scb, scb);
  1437. prev_scb = scb;
  1438. break;
  1439. }
  1440. } else {
  1441. ahc_qinfifo_requeue(ahc, prev_scb, scb);
  1442. prev_scb = scb;
  1443. }
  1444. qinpos++;
  1445. }
  1446. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  1447. ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
  1448. } else {
  1449. ahc_outb(ahc, KERNEL_QINPOS, ahc->qinfifonext);
  1450. }
  1451. if (action != SEARCH_COUNT
  1452.  && (found != 0)
  1453.  && (qinstart != ahc->qinfifonext)) {
  1454. /*
  1455.  * The sequencer may be in the process of dmaing
  1456.  * down the SCB at the beginning of the queue.
  1457.  * This could be problematic if either the first,
  1458.  * or the second SCB is removed from the queue
  1459.  * (the first SCB includes a pointer to the "next"
  1460.  * SCB to dma). If we have removed any entries, swap
  1461.  * the first element in the queue with the next HSCB
  1462.  * so the sequencer will notice that NEXT_QUEUED_SCB
  1463.  * has changed during its dma attempt and will retry
  1464.  * the DMA.
  1465.  */
  1466. scb = ahc_lookup_scb(ahc, ahc->qinfifo[qinstart]);
  1467. if (scb == NULL) {
  1468. printf("found = %d, qinstart = %d, qinfifionext = %dn",
  1469. found, qinstart, ahc->qinfifonext);
  1470. panic("First/Second Qinfifo fixupn");
  1471. }
  1472. /*
  1473.  * ahc_swap_with_next_hscb forces our next pointer to
  1474.  * point to the reserved SCB for future commands.  Save
  1475.  * and restore our original next pointer to maintain
  1476.  * queue integrity.
  1477.  */
  1478. next = scb->hscb->next;
  1479. ahc->scb_data->scbindex[scb->hscb->tag] = NULL;
  1480. ahc_swap_with_next_hscb(ahc, scb);
  1481. scb->hscb->next = next;
  1482. ahc->qinfifo[qinstart] = scb->hscb->tag;
  1483. /* Tell the card about the new head of the qinfifo. */
  1484. ahc_outb(ahc, NEXT_QUEUED_SCB, scb->hscb->tag);
  1485. /* Fixup the tail "next" pointer. */
  1486. qintail = ahc->qinfifonext - 1;
  1487. scb = ahc_lookup_scb(ahc, ahc->qinfifo[qintail]);
  1488. scb->hscb->next = ahc->next_queued_scb->hscb->tag;
  1489. }
  1490. /*
  1491.  * Search waiting for selection list.
  1492.  */
  1493. curscbptr = ahc_inb(ahc, SCBPTR);
  1494. next = ahc_inb(ahc, WAITING_SCBH);  /* Start at head of list. */
  1495. prev = SCB_LIST_NULL;
  1496. while (next != SCB_LIST_NULL) {
  1497. uint8_t scb_index;
  1498. ahc_outb(ahc, SCBPTR, next);
  1499. scb_index = ahc_inb(ahc, SCB_TAG);
  1500. if (scb_index >= ahc->scb_data->numscbs) {
  1501. printf("Waiting List inconsistency. "
  1502.        "SCB index == %d, yet numscbs == %d.",
  1503.        scb_index, ahc->scb_data->numscbs);
  1504. ahc_dump_card_state(ahc);
  1505. panic("for safety");
  1506. }
  1507. scb = ahc_lookup_scb(ahc, scb_index);
  1508. if (scb == NULL) {
  1509. printf("scb_index = %d, next = %dn",
  1510. scb_index, next);
  1511. panic("Waiting List traversaln");
  1512. }
  1513. if (ahc_match_scb(ahc, scb, target, channel,
  1514.   lun, SCB_LIST_NULL, role)) {
  1515. /*
  1516.  * We found an scb that needs to be acted on.
  1517.  */
  1518. found++;
  1519. switch (action) {
  1520. case SEARCH_COMPLETE:
  1521. {
  1522. cam_status ostat;
  1523. cam_status cstat;
  1524. ostat = ahc_get_transaction_status(scb);
  1525. if (ostat == CAM_REQ_INPROG)
  1526. ahc_set_transaction_status(scb,
  1527.    status);
  1528. cstat = ahc_get_transaction_status(scb);
  1529. if (cstat != CAM_REQ_CMP)
  1530. ahc_freeze_scb(scb);
  1531. if ((scb->flags & SCB_ACTIVE) == 0)
  1532. printf("Inactive SCB in Waiting Listn");
  1533. ahc_done(ahc, scb);
  1534. /* FALLTHROUGH */
  1535. }
  1536. case SEARCH_REMOVE:
  1537. next = ahc_rem_wscb(ahc, next, prev);
  1538. break;
  1539. case SEARCH_COUNT:
  1540. prev = next;
  1541. next = ahc_inb(ahc, SCB_NEXT);
  1542. break;
  1543. }
  1544. } else {
  1545. prev = next;
  1546. next = ahc_inb(ahc, SCB_NEXT);
  1547. }
  1548. }
  1549. ahc_outb(ahc, SCBPTR, curscbptr);
  1550. /*
  1551.  * And lastly, the untagged holding queues.
  1552.  */
  1553. i = 0;
  1554. if ((ahc->flags & AHC_SCB_BTT) == 0) {
  1555. maxtarget = 16;
  1556. if (target != CAM_TARGET_WILDCARD) {
  1557. i = target;
  1558. if (channel == 'B')
  1559. i += 8;
  1560. maxtarget = i + 1;
  1561. }
  1562. } else {
  1563. maxtarget = 0;
  1564. }
  1565. for (; i < maxtarget; i++) {
  1566. struct scb_tailq *untagged_q;
  1567. struct scb *next_scb;
  1568. untagged_q = &(ahc->untagged_queues[i]);
  1569. next_scb = TAILQ_FIRST(untagged_q);
  1570. while (next_scb != NULL) {
  1571. scb = next_scb;
  1572. next_scb = TAILQ_NEXT(scb, links.tqe);
  1573. /*
  1574.  * The head of the list may be the currently
  1575.  * active untagged command for a device.
  1576.  * We're only searching for commands that
  1577.  * have not been started.  A transaction
  1578.  * marked active but still in the qinfifo
  1579.  * is removed by the qinfifo scanning code
  1580.  * above.
  1581.  */
  1582. if ((scb->flags & SCB_ACTIVE) != 0)
  1583. continue;
  1584. if (ahc_match_scb(ahc, scb, target, channel,
  1585.   lun, SCB_LIST_NULL, role)) {
  1586. /*
  1587.  * We found an scb that needs to be acted on.
  1588.  */
  1589. found++;
  1590. switch (action) {
  1591. case SEARCH_COMPLETE:
  1592. {
  1593. cam_status ostat;
  1594. cam_status cstat;
  1595. ostat = ahc_get_transaction_status(scb);
  1596. if (ostat == CAM_REQ_INPROG)
  1597. ahc_set_transaction_status(scb,
  1598.    status);
  1599. cstat = ahc_get_transaction_status(scb);
  1600. if (cstat != CAM_REQ_CMP)
  1601. ahc_freeze_scb(scb);
  1602. if ((scb->flags & SCB_ACTIVE) == 0)
  1603. printf("Inactive SCB in untaggedQn");
  1604. ahc_done(ahc, scb);
  1605. break;
  1606. }
  1607. case SEARCH_REMOVE:
  1608. TAILQ_REMOVE(untagged_q, scb,
  1609.      links.tqe);
  1610. break;
  1611. case SEARCH_COUNT:
  1612. break;
  1613. }
  1614. }
  1615. }
  1616. }
  1617. if (action == SEARCH_COMPLETE)
  1618. ahc_release_untagged_queues(ahc);
  1619. return (found);
  1620. }
  1621. int
  1622. ahc_search_disc_list(struct ahc_softc *ahc, int target, char channel,
  1623.      int lun, u_int tag, int stop_on_first, int remove,
  1624.      int save_state)
  1625. {
  1626. struct scb *scbp;
  1627. u_int next;
  1628. u_int prev;
  1629. u_int count;
  1630. u_int active_scb;
  1631. count = 0;
  1632. next = ahc_inb(ahc, DISCONNECTED_SCBH);
  1633. prev = SCB_LIST_NULL;
  1634. if (save_state) {
  1635. /* restore this when we're done */
  1636. active_scb = ahc_inb(ahc, SCBPTR);
  1637. } else
  1638. /* Silence compiler */
  1639. active_scb = SCB_LIST_NULL;
  1640. while (next != SCB_LIST_NULL) {
  1641. u_int scb_index;
  1642. ahc_outb(ahc, SCBPTR, next);
  1643. scb_index = ahc_inb(ahc, SCB_TAG);
  1644. if (scb_index >= ahc->scb_data->numscbs) {
  1645. printf("Disconnected List inconsistency. "
  1646.        "SCB index == %d, yet numscbs == %d.",
  1647.        scb_index, ahc->scb_data->numscbs);
  1648. ahc_dump_card_state(ahc);
  1649. panic("for safety");
  1650. }
  1651. if (next == prev) {
  1652. panic("Disconnected List Loop. "
  1653.       "cur SCBPTR == %x, prev SCBPTR == %x.",
  1654.       next, prev);
  1655. }
  1656. scbp = ahc_lookup_scb(ahc, scb_index);
  1657. if (ahc_match_scb(ahc, scbp, target, channel, lun,
  1658.   tag, ROLE_INITIATOR)) {
  1659. count++;
  1660. if (remove) {
  1661. next =
  1662.     ahc_rem_scb_from_disc_list(ahc, prev, next);
  1663. } else {
  1664. prev = next;
  1665. next = ahc_inb(ahc, SCB_NEXT);
  1666. }
  1667. if (stop_on_first)
  1668. break;
  1669. } else {
  1670. prev = next;
  1671. next = ahc_inb(ahc, SCB_NEXT);
  1672. }
  1673. }
  1674. if (save_state)
  1675. ahc_outb(ahc, SCBPTR, active_scb);
  1676. return (count);
  1677. }
  1678. /*
  1679.  * Remove an SCB from the on chip list of disconnected transactions.
  1680.  * This is empty/unused if we are not performing SCB paging.
  1681.  */
  1682. static u_int
  1683. ahc_rem_scb_from_disc_list(struct ahc_softc *ahc, u_int prev, u_int scbptr)
  1684. {
  1685. u_int next;
  1686. ahc_outb(ahc, SCBPTR, scbptr);
  1687. next = ahc_inb(ahc, SCB_NEXT);
  1688. ahc_outb(ahc, SCB_CONTROL, 0);
  1689. ahc_add_curscb_to_free_list(ahc);
  1690. if (prev != SCB_LIST_NULL) {
  1691. ahc_outb(ahc, SCBPTR, prev);
  1692. ahc_outb(ahc, SCB_NEXT, next);
  1693. } else
  1694. ahc_outb(ahc, DISCONNECTED_SCBH, next);
  1695. return (next);
  1696. }
  1697. /*
  1698.  * Add the SCB as selected by SCBPTR onto the on chip list of
  1699.  * free hardware SCBs.  This list is empty/unused if we are not
  1700.  * performing SCB paging.
  1701.  */
  1702. static void
  1703. ahc_add_curscb_to_free_list(struct ahc_softc *ahc)
  1704. {
  1705. /*
  1706.  * Invalidate the tag so that our abort
  1707.  * routines don't think it's active.
  1708.  */
  1709. ahc_outb(ahc, SCB_TAG, SCB_LIST_NULL);
  1710. if ((ahc->flags & AHC_PAGESCBS) != 0) {
  1711. ahc_outb(ahc, SCB_NEXT, ahc_inb(ahc, FREE_SCBH));
  1712. ahc_outb(ahc, FREE_SCBH, ahc_inb(ahc, SCBPTR));
  1713. }
  1714. }
  1715. /*
  1716.  * Manipulate the waiting for selection list and return the
  1717.  * scb that follows the one that we remove.
  1718.  */
  1719. static u_int
  1720. ahc_rem_wscb(struct ahc_softc *ahc, u_int scbpos, u_int prev)
  1721. {       
  1722. u_int curscb, next;
  1723. /*
  1724.  * Select the SCB we want to abort and
  1725.  * pull the next pointer out of it.
  1726.  */
  1727. curscb = ahc_inb(ahc, SCBPTR);
  1728. ahc_outb(ahc, SCBPTR, scbpos);
  1729. next = ahc_inb(ahc, SCB_NEXT);
  1730. /* Clear the necessary fields */
  1731. ahc_outb(ahc, SCB_CONTROL, 0);
  1732. ahc_add_curscb_to_free_list(ahc);
  1733. /* update the waiting list */
  1734. if (prev == SCB_LIST_NULL) {
  1735. /* First in the list */
  1736. ahc_outb(ahc, WAITING_SCBH, next); 
  1737. /*
  1738.  * Ensure we aren't attempting to perform
  1739.  * selection for this entry.
  1740.  */
  1741. ahc_outb(ahc, SCSISEQ, (ahc_inb(ahc, SCSISEQ) & ~ENSELO));
  1742. } else {
  1743. /*
  1744.  * Select the scb that pointed to us 
  1745.  * and update its next pointer.
  1746.  */
  1747. ahc_outb(ahc, SCBPTR, prev);
  1748. ahc_outb(ahc, SCB_NEXT, next);
  1749. }
  1750. /*
  1751.  * Point us back at the original scb position.
  1752.  */
  1753. ahc_outb(ahc, SCBPTR, curscb);
  1754. return next;
  1755. }
  1756. /******************************** Error Handling ******************************/
  1757. /*
  1758.  * Abort all SCBs that match the given description (target/channel/lun/tag),
  1759.  * setting their status to the passed in status if the status has not already
  1760.  * been modified from CAM_REQ_INPROG.  This routine assumes that the sequencer
  1761.  * is paused before it is called.
  1762.  */
  1763. int
  1764. ahc_abort_scbs(struct ahc_softc *ahc, int target, char channel,
  1765.        int lun, u_int tag, role_t role, uint32_t status)
  1766. {
  1767. struct scb *scbp;
  1768. struct scb *scbp_next;
  1769. u_int active_scb;
  1770. int i, j;
  1771. int maxtarget;
  1772. int minlun;
  1773. int maxlun;
  1774. int found;
  1775. /*
  1776.  * Don't attempt to run any queued untagged transactions
  1777.  * until we are done with the abort process.
  1778.  */
  1779. ahc_freeze_untagged_queues(ahc);
  1780. /* restore this when we're done */
  1781. active_scb = ahc_inb(ahc, SCBPTR);
  1782. found = ahc_search_qinfifo(ahc, target, channel, lun, SCB_LIST_NULL,
  1783.    role, CAM_REQUEUE_REQ, SEARCH_COMPLETE);
  1784. /*
  1785.  * Clean out the busy target table for any untagged commands.
  1786.  */
  1787. i = 0;
  1788. maxtarget = 16;
  1789. if (target != CAM_TARGET_WILDCARD) {
  1790. i = target;
  1791. if (channel == 'B')
  1792. i += 8;
  1793. maxtarget = i + 1;
  1794. }
  1795. if (lun == CAM_LUN_WILDCARD) {
  1796. /*
  1797.  * Unless we are using an SCB based
  1798.  * busy targets table, there is only
  1799.  * one table entry for all luns of
  1800.  * a target.
  1801.  */
  1802. minlun = 0;
  1803. maxlun = 1;
  1804. if ((ahc->flags & AHC_SCB_BTT) != 0)
  1805. maxlun = AHC_NUM_LUNS;
  1806. } else {
  1807. minlun = lun;
  1808. maxlun = lun + 1;
  1809. }
  1810. if (role != ROLE_TARGET) {
  1811. for (;i < maxtarget; i++) {
  1812. for (j = minlun;j < maxlun; j++) {
  1813. u_int scbid;
  1814. u_int tcl;
  1815. tcl = BUILD_TCL(i << 4, j);
  1816. scbid = ahc_index_busy_tcl(ahc, tcl);
  1817. scbp = ahc_lookup_scb(ahc, scbid);
  1818. if (scbp == NULL
  1819.  || ahc_match_scb(ahc, scbp, target, channel,
  1820.   lun, tag, role) == 0)
  1821. continue;
  1822. ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, j));
  1823. }
  1824. }
  1825. /*
  1826.  * Go through the disconnected list and remove any entries we
  1827.  * have queued for completion, 0'ing their control byte too.
  1828.  * We save the active SCB and restore it ourselves, so there
  1829.  * is no reason for this search to restore it too.
  1830.  */
  1831. ahc_search_disc_list(ahc, target, channel, lun, tag,
  1832.      /*stop_on_first*/FALSE, /*remove*/TRUE,
  1833.      /*save_state*/FALSE);
  1834. }
  1835. /*
  1836.  * Go through the hardware SCB array looking for commands that
  1837.  * were active but not on any list.  In some cases, these remnants
  1838.  * might not still have mappings in the scbindex array (e.g. unexpected
  1839.  * bus free with the same scb queued for an abort).  Don't hold this
  1840.  * against them.
  1841.  */
  1842. for (i = 0; i < ahc->scb_data->maxhscbs; i++) {
  1843. u_int scbid;
  1844. ahc_outb(ahc, SCBPTR, i);
  1845. scbid = ahc_inb(ahc, SCB_TAG);
  1846. scbp = ahc_lookup_scb(ahc, scbid);
  1847. if ((scbp == NULL && scbid != SCB_LIST_NULL)
  1848.  || (scbp != NULL
  1849.   && ahc_match_scb(ahc, scbp, target, channel, lun, tag, role)))
  1850. ahc_add_curscb_to_free_list(ahc);
  1851. }
  1852. /*
  1853.  * Go through the pending CCB list and look for
  1854.  * commands for this target that are still active.
  1855.  * These are other tagged commands that were
  1856.  * disconnected when the reset occurred.
  1857.  */
  1858. scbp_next = LIST_FIRST(&ahc->pending_scbs);
  1859. while (scbp_next != NULL) {
  1860. scbp = scbp_next;
  1861. scbp_next = LIST_NEXT(scbp, pending_links);
  1862. if (ahc_match_scb(ahc, scbp, target, channel, lun, tag, role)) {
  1863. cam_status ostat;
  1864. ostat = ahc_get_transaction_status(scbp);
  1865. if (ostat == CAM_REQ_INPROG)
  1866. ahc_set_transaction_status(scbp, status);
  1867. if (ahc_get_transaction_status(scbp) != CAM_REQ_CMP)
  1868. ahc_freeze_scb(scbp);
  1869. if ((scbp->flags & SCB_ACTIVE) == 0)
  1870. printf("Inactive SCB on pending listn");
  1871. ahc_done(ahc, scbp);
  1872. found++;
  1873. }
  1874. }
  1875. ahc_outb(ahc, SCBPTR, active_scb);
  1876. ahc_platform_abort_scbs(ahc, target, channel, lun, tag, role, status);
  1877. ahc_release_untagged_queues(ahc);
  1878. return found;
  1879. }
  1880. static void
  1881. ahc_reset_current_bus(struct ahc_softc *ahc)
  1882. {
  1883. uint8_t scsiseq;
  1884. ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) & ~ENSCSIRST);
  1885. scsiseq = ahc_inb(ahc, SCSISEQ);
  1886. ahc_outb(ahc, SCSISEQ, scsiseq | SCSIRSTO);
  1887. ahc_delay(AHC_BUSRESET_DELAY);
  1888. /* Turn off the bus reset */
  1889. ahc_outb(ahc, SCSISEQ, scsiseq & ~SCSIRSTO);
  1890. ahc_clear_intstat(ahc);
  1891. /* Re-enable reset interrupts */
  1892. ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) | ENSCSIRST);
  1893. }
  1894. int
  1895. ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset)
  1896. {
  1897. struct ahc_devinfo devinfo;
  1898. u_int initiator, target, max_scsiid;
  1899. u_int sblkctl;
  1900. u_int scsiseq;
  1901. u_int simode1;
  1902. int found;
  1903. int restart_needed;
  1904. char cur_channel;
  1905. ahc->pending_device = NULL;
  1906. ahc_compile_devinfo(&devinfo,
  1907.     CAM_TARGET_WILDCARD,
  1908.     CAM_TARGET_WILDCARD,
  1909.     CAM_LUN_WILDCARD,
  1910.     channel, ROLE_UNKNOWN);
  1911. ahc_pause(ahc);
  1912. /* Make sure the sequencer is in a safe location. */
  1913. ahc_clear_critical_section(ahc);
  1914. /*
  1915.  * Run our command complete fifos to ensure that we perform
  1916.  * completion processing on any commands that 'completed'
  1917.  * before the reset occurred.
  1918.  */
  1919. ahc_run_qoutfifo(ahc);
  1920. #if AHC_TARGET_MODE
  1921. if ((ahc->flags & AHC_TARGETROLE) != 0) {
  1922. ahc_run_tqinfifo(ahc, /*paused*/TRUE);
  1923. }
  1924. #endif
  1925. /*
  1926.  * Reset the bus if we are initiating this reset
  1927.  */
  1928. sblkctl = ahc_inb(ahc, SBLKCTL);
  1929. cur_channel = 'A';
  1930. if ((ahc->features & AHC_TWIN) != 0
  1931.  && ((sblkctl & SELBUSB) != 0))
  1932.     cur_channel = 'B';
  1933. scsiseq = ahc_inb(ahc, SCSISEQ_TEMPLATE);
  1934. if (cur_channel != channel) {
  1935. /* Case 1: Command for another bus is active
  1936.  * Stealthily reset the other bus without
  1937.  * upsetting the current bus.
  1938.  */
  1939. ahc_outb(ahc, SBLKCTL, sblkctl ^ SELBUSB);
  1940. simode1 = ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST);
  1941. ahc_outb(ahc, SIMODE1, simode1);
  1942. if (initiate_reset)
  1943. ahc_reset_current_bus(ahc);
  1944. ahc_clear_intstat(ahc);
  1945. #if AHC_TARGET_MODE
  1946. /*
  1947.  * Bus resets clear ENSELI, so we cannot
  1948.  * defer re-enabling bus reset interrupts
  1949.  * if we are in target mode.
  1950.  */
  1951. if ((ahc->flags & AHC_TARGETROLE) != 0)
  1952. ahc_outb(ahc, SIMODE1, simode1 | ENSCSIRST);
  1953. #endif
  1954. ahc_outb(ahc, SCSISEQ, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP));
  1955. ahc_outb(ahc, SBLKCTL, sblkctl);
  1956. restart_needed = FALSE;
  1957. } else {
  1958. /* Case 2: A command from this bus is active or we're idle */
  1959. ahc_clear_msg_state(ahc);
  1960. simode1 = ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST);
  1961. ahc_outb(ahc, SIMODE1, simode1);
  1962. if (initiate_reset)
  1963. ahc_reset_current_bus(ahc);
  1964. ahc_clear_intstat(ahc);
  1965. #if AHC_TARGET_MODE
  1966. /*
  1967.  * Bus resets clear ENSELI, so we cannot
  1968.  * defer re-enabling bus reset interrupts
  1969.  * if we are in target mode.
  1970.  */
  1971. if ((ahc->flags & AHC_TARGETROLE) != 0)
  1972. ahc_outb(ahc, SIMODE1, simode1 | ENSCSIRST);
  1973. #endif
  1974. ahc_outb(ahc, SCSISEQ, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP));
  1975. restart_needed = TRUE;
  1976. }
  1977. /*
  1978.  * Clean up all the state information for the
  1979.  * pending transactions on this bus.
  1980.  */
  1981. found = ahc_abort_scbs(ahc, CAM_TARGET_WILDCARD, channel,
  1982.        CAM_LUN_WILDCARD, SCB_LIST_NULL,
  1983.        ROLE_UNKNOWN, CAM_SCSI_BUS_RESET);
  1984. max_scsiid = (ahc->features & AHC_WIDE) ? 15 : 7;
  1985. #ifdef AHC_TARGET_MODE
  1986. /*
  1987.  * Send an immediate notify ccb to all target more peripheral
  1988.  * drivers affected by this action.
  1989.  */
  1990. for (target = 0; target <= max_scsiid; target++) {
  1991. struct ahc_tmode_tstate* tstate;
  1992. u_int lun;
  1993. tstate = ahc->enabled_targets[target];
  1994. if (tstate == NULL)
  1995. continue;
  1996. for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
  1997. struct ahc_tmode_lstate* lstate;
  1998. lstate = tstate->enabled_luns[lun];
  1999. if (lstate == NULL)
  2000. continue;
  2001. ahc_queue_lstate_event(ahc, lstate, CAM_TARGET_WILDCARD,
  2002.        EVENT_TYPE_BUS_RESET, /*arg*/0);
  2003. ahc_send_lstate_events(ahc, lstate);
  2004. }
  2005. }
  2006. #endif
  2007. /* Notify the XPT that a bus reset occurred */
  2008. ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD,
  2009.        CAM_LUN_WILDCARD, AC_BUS_RESET, NULL);
  2010. /*
  2011.  * Revert to async/narrow transfers until we renegotiate.
  2012.  */
  2013. for (target = 0; target <= max_scsiid; target++) {
  2014. if (ahc->enabled_targets[target] == NULL)
  2015. continue;
  2016. for (initiator = 0; initiator <= max_scsiid; initiator++) {
  2017. struct ahc_devinfo devinfo;
  2018. ahc_compile_devinfo(&devinfo, target, initiator,
  2019.     CAM_LUN_WILDCARD,
  2020.     channel, ROLE_UNKNOWN);
  2021. ahc_set_width(ahc, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
  2022.       AHC_TRANS_CUR, /*paused*/TRUE);
  2023. ahc_set_syncrate(ahc, &devinfo, /*syncrate*/NULL,
  2024.  /*period*/0, /*offset*/0,
  2025.  /*ppr_options*/0, AHC_TRANS_CUR,
  2026.  /*paused*/TRUE);
  2027. }
  2028. }
  2029. if (restart_needed)
  2030. ahc_restart(ahc);
  2031. else
  2032. ahc_unpause(ahc);
  2033. return found;
  2034. }
  2035. /***************************** Residual Processing ****************************/
  2036. /*
  2037.  * Calculate the residual for a just completed SCB.
  2038.  */
  2039. void
  2040. ahc_calc_residual(struct scb *scb)
  2041. {
  2042. struct hardware_scb *hscb;
  2043. struct status_pkt *spkt;
  2044. uint32_t sgptr;
  2045. uint32_t resid_sgptr;
  2046. uint32_t resid;
  2047. /*
  2048.  * 5 cases.
  2049.  * 1) No residual.
  2050.  *    SG_RESID_VALID clear in sgptr.
  2051.  * 2) Transferless command
  2052.  * 3) Never performed any transfers.
  2053.  *    sgptr has SG_FULL_RESID set.
  2054.  * 4) No residual but target did not
  2055.  *    save data pointers after the
  2056.  *    last transfer, so sgptr was
  2057.  *    never updated.
  2058.  * 5) We have a partial residual.
  2059.  *    Use residual_sgptr to determine
  2060.  *    where we are.
  2061.  */
  2062. hscb = scb->hscb;
  2063. sgptr = ahc_le32toh(hscb->sgptr);
  2064. if ((sgptr & SG_RESID_VALID) == 0)
  2065. /* Case 1 */
  2066. return;
  2067. sgptr &= ~SG_RESID_VALID;
  2068. if ((sgptr & SG_LIST_NULL) != 0)
  2069. /* Case 2 */
  2070. return;
  2071. spkt = &hscb->shared_data.status;
  2072. resid_sgptr = ahc_le32toh(spkt->residual_sg_ptr);
  2073. if ((sgptr & SG_FULL_RESID) != 0) {
  2074. /* Case 3 */
  2075. resid = ahc_get_transfer_length(scb);
  2076. } else if ((resid_sgptr & SG_LIST_NULL) != 0) {
  2077. /* Case 4 */
  2078. return;
  2079. } else if ((resid_sgptr & ~SG_PTR_MASK) != 0) {
  2080. panic("Bogus resid sgptr value 0x%xn", resid_sgptr);
  2081. } else {
  2082. struct ahc_dma_seg *sg;
  2083. /*
  2084.  * Remainder of the SG where the transfer
  2085.  * stopped.  
  2086.  */
  2087. resid = ahc_le32toh(spkt->residual_datacnt) & AHC_SG_LEN_MASK;
  2088. sg = ahc_sg_bus_to_virt(scb, resid_sgptr & SG_PTR_MASK);
  2089. /* The residual sg_ptr always points to the next sg */
  2090. sg--;
  2091. /*
  2092.  * Add up the contents of all residual
  2093.  * SG segments that are after the SG where
  2094.  * the transfer stopped.
  2095.  */
  2096. while ((ahc_le32toh(sg->len) & AHC_DMA_LAST_SEG) == 0) {
  2097. sg++;
  2098. resid += ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
  2099. }
  2100. }
  2101. if ((scb->flags & SCB_SENSE) == 0)
  2102. ahc_set_residual(scb, resid);
  2103. else
  2104. ahc_set_sense_residual(scb, resid);
  2105. #ifdef AHC_DEBUG
  2106. if ((ahc_debug & AHC_SHOWMISC) != 0) {
  2107. ahc_print_path(ahc, scb);
  2108. printf("Handled Residual of %d bytesn", resid);
  2109. }
  2110. #endif
  2111. }
  2112. /******************************* Target Mode **********************************/
  2113. #ifdef AHC_TARGET_MODE
  2114. /*
  2115.  * Add a target mode event to this lun's queue
  2116.  */
  2117. static void
  2118. ahc_queue_lstate_event(struct ahc_softc *ahc, struct ahc_tmode_lstate *lstate,
  2119.        u_int initiator_id, u_int event_type, u_int event_arg)
  2120. {
  2121. struct ahc_tmode_event *event;
  2122. int pending;
  2123. xpt_freeze_devq(lstate->path, /*count*/1);
  2124. if (lstate->event_w_idx >= lstate->event_r_idx)
  2125. pending = lstate->event_w_idx - lstate->event_r_idx;
  2126. else
  2127. pending = AHC_TMODE_EVENT_BUFFER_SIZE + 1
  2128. - (lstate->event_r_idx - lstate->event_w_idx);
  2129. if (event_type == EVENT_TYPE_BUS_RESET
  2130.  || event_type == MSG_BUS_DEV_RESET) {
  2131. /*
  2132.  * Any earlier events are irrelevant, so reset our buffer.
  2133.  * This has the effect of allowing us to deal with reset
  2134.  * floods (an external device holding down the reset line)
  2135.  * without losing the event that is really interesting.
  2136.  */
  2137. lstate->event_r_idx = 0;
  2138. lstate->event_w_idx = 0;
  2139. xpt_release_devq(lstate->path, pending, /*runqueue*/FALSE);
  2140. }
  2141. if (pending == AHC_TMODE_EVENT_BUFFER_SIZE) {
  2142. xpt_print_path(lstate->path);
  2143. printf("immediate event %x:%x lostn",
  2144.        lstate->event_buffer[lstate->event_r_idx].event_type,
  2145.        lstate->event_buffer[lstate->event_r_idx].event_arg);
  2146. lstate->event_r_idx++;
  2147. if (lstate->event_r_idx == AHC_TMODE_EVENT_BUFFER_SIZE)
  2148. lstate->event_r_idx = 0;
  2149. xpt_release_devq(lstate->path, /*count*/1, /*runqueue*/FALSE);
  2150. }
  2151. event = &lstate->event_buffer[lstate->event_w_idx];
  2152. event->initiator_id = initiator_id;
  2153. event->event_type = event_type;
  2154. event->event_arg = event_arg;
  2155. lstate->event_w_idx++;
  2156. if (lstate->event_w_idx == AHC_TMODE_EVENT_BUFFER_SIZE)
  2157. lstate->event_w_idx = 0;
  2158. }
  2159. /*
  2160.  * Send any target mode events queued up waiting
  2161.  * for immediate notify resources.
  2162.  */
  2163. void
  2164. ahc_send_lstate_events(struct ahc_softc *ahc, struct ahc_tmode_lstate *lstate)
  2165. {
  2166. struct ccb_hdr *ccbh;
  2167. struct ccb_immed_notify *inot;
  2168. while (lstate->event_r_idx != lstate->event_w_idx
  2169.     && (ccbh = SLIST_FIRST(&lstate->immed_notifies)) != NULL) {
  2170. struct ahc_tmode_event *event;
  2171. event = &lstate->event_buffer[lstate->event_r_idx];
  2172. SLIST_REMOVE_HEAD(&lstate->immed_notifies, sim_links.sle);
  2173. inot = (struct ccb_immed_notify *)ccbh;
  2174. switch (event->event_type) {
  2175. case EVENT_TYPE_BUS_RESET:
  2176. ccbh->status = CAM_SCSI_BUS_RESET|CAM_DEV_QFRZN;
  2177. break;
  2178. default:
  2179. ccbh->status = CAM_MESSAGE_RECV|CAM_DEV_QFRZN;
  2180. inot->message_args[0] = event->event_type;
  2181. inot->message_args[1] = event->event_arg;
  2182. break;
  2183. }
  2184. inot->initiator_id = event->initiator_id;
  2185. inot->sense_len = 0;
  2186. xpt_done((union ccb *)inot);
  2187. lstate->event_r_idx++;
  2188. if (lstate->event_r_idx == AHC_TMODE_EVENT_BUFFER_SIZE)
  2189. lstate->event_r_idx = 0;
  2190. }
  2191. }
  2192. #endif
  2193. /******************** Sequencer Program Patching/Download *********************/
  2194. #ifdef AHC_DUMP_SEQ
  2195. void
  2196. ahc_dumpseq(struct ahc_softc* ahc)
  2197. {
  2198. int i;
  2199. int max_prog;
  2200. if ((ahc->chip & AHC_BUS_MASK) < AHC_PCI)
  2201. max_prog = 448;
  2202. else if ((ahc->features & AHC_ULTRA2) != 0)
  2203. max_prog = 768;
  2204. else
  2205. max_prog = 512;
  2206. ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
  2207. ahc_outb(ahc, SEQADDR0, 0);
  2208. ahc_outb(ahc, SEQADDR1, 0);
  2209. for (i = 0; i < max_prog; i++) {
  2210. uint8_t ins_bytes[4];
  2211. ahc_insb(ahc, SEQRAM, ins_bytes, 4);
  2212. printf("0x%08xn", ins_bytes[0] << 24
  2213.  | ins_bytes[1] << 16
  2214.  | ins_bytes[2] << 8
  2215.  | ins_bytes[3]);
  2216. }
  2217. }
  2218. #endif
  2219. static void
  2220. ahc_loadseq(struct ahc_softc *ahc)
  2221. {
  2222. struct cs cs_table[num_critical_sections];
  2223. u_int begin_set[num_critical_sections];
  2224. u_int end_set[num_critical_sections];
  2225. struct patch *cur_patch;
  2226. u_int cs_count;
  2227. u_int cur_cs;
  2228. u_int i;
  2229. int downloaded;
  2230. u_int skip_addr;
  2231. u_int sg_prefetch_cnt;
  2232. uint8_t download_consts[7];
  2233. /*
  2234.  * Start out with 0 critical sections
  2235.  * that apply to this firmware load.
  2236.  */
  2237. cs_count = 0;
  2238. cur_cs = 0;
  2239. memset(begin_set, 0, sizeof(begin_set));
  2240. memset(end_set, 0, sizeof(end_set));
  2241. /* Setup downloadable constant table */
  2242. download_consts[QOUTFIFO_OFFSET] = 0;
  2243. if (ahc->targetcmds != NULL)
  2244. download_consts[QOUTFIFO_OFFSET] += 32;
  2245. download_consts[QINFIFO_OFFSET] = download_consts[QOUTFIFO_OFFSET] + 1;
  2246. download_consts[CACHESIZE_MASK] = ahc->pci_cachesize - 1;
  2247. download_consts[INVERTED_CACHESIZE_MASK] = ~(ahc->pci_cachesize - 1);
  2248. sg_prefetch_cnt = ahc->pci_cachesize;
  2249. if (sg_prefetch_cnt < (2 * sizeof(struct ahc_dma_seg)))
  2250. sg_prefetch_cnt = 2 * sizeof(struct ahc_dma_seg);
  2251. download_consts[SG_PREFETCH_CNT] = sg_prefetch_cnt;
  2252. download_consts[SG_PREFETCH_ALIGN_MASK] = ~(sg_prefetch_cnt - 1);
  2253. download_consts[SG_PREFETCH_ADDR_MASK] = (sg_prefetch_cnt - 1);
  2254. cur_patch = patches;
  2255. downloaded = 0;
  2256. skip_addr = 0;
  2257. ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
  2258. ahc_outb(ahc, SEQADDR0, 0);
  2259. ahc_outb(ahc, SEQADDR1, 0);
  2260. for (i = 0; i < sizeof(seqprog)/4; i++) {
  2261. if (ahc_check_patch(ahc, &cur_patch, i, &skip_addr) == 0) {
  2262. /*
  2263.  * Don't download this instruction as it
  2264.  * is in a patch that was removed.
  2265.  */
  2266. continue;
  2267. }
  2268. /*
  2269.  * Move through the CS table until we find a CS
  2270.  * that might apply to this instruction.
  2271.  */
  2272. for (; cur_cs < num_critical_sections; cur_cs++) {
  2273. if (critical_sections[cur_cs].end <= i) {
  2274. if (begin_set[cs_count] == TRUE
  2275.  && end_set[cs_count] == FALSE) {
  2276. cs_table[cs_count].end = downloaded;
  2277.   end_set[cs_count] = TRUE;
  2278. cs_count++;
  2279. }
  2280. continue;
  2281. }
  2282. if (critical_sections[cur_cs].begin <= i
  2283.  && begin_set[cs_count] == FALSE) {
  2284. cs_table[cs_count].begin = downloaded;
  2285. begin_set[cs_count] = TRUE;
  2286. }
  2287. break;
  2288. }
  2289. ahc_download_instr(ahc, i, download_consts);
  2290. downloaded++;
  2291. }
  2292. ahc->num_critical_sections = cs_count;
  2293. if (cs_count != 0) {
  2294. cs_count *= sizeof(struct cs);
  2295. ahc->critical_sections = malloc(cs_count, M_DEVBUF, M_NOWAIT);
  2296. if (ahc->critical_sections == NULL)
  2297. panic("ahc_loadseq: Could not malloc");
  2298. memcpy(ahc->critical_sections, cs_table, cs_count);
  2299. }
  2300. ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE);
  2301. ahc_restart(ahc);
  2302. if (bootverbose)
  2303. printf(" %d instructions downloadedn", downloaded);
  2304. }
  2305. static int
  2306. ahc_check_patch(struct ahc_softc *ahc, struct patch **start_patch,
  2307. u_int start_instr, u_int *skip_addr)
  2308. {
  2309. struct patch *cur_patch;
  2310. struct patch *last_patch;
  2311. u_int num_patches;
  2312. num_patches = sizeof(patches)/sizeof(struct patch);
  2313. last_patch = &patches[num_patches];
  2314. cur_patch = *start_patch;
  2315. while (cur_patch < last_patch && start_instr == cur_patch->begin) {
  2316. if (cur_patch->patch_func(ahc) == 0) {
  2317. /* Start rejecting code */
  2318. *skip_addr = start_instr + cur_patch->skip_instr;
  2319. cur_patch += cur_patch->skip_patch;
  2320. } else {
  2321. /* Accepted this patch.  Advance to the next
  2322.  * one and wait for our intruction pointer to
  2323.  * hit this point.
  2324.  */
  2325. cur_patch++;
  2326. }
  2327. }
  2328. *start_patch = cur_patch;
  2329. if (start_instr < *skip_addr)
  2330. /* Still skipping */
  2331. return (0);
  2332. return (1);
  2333. }
  2334. static void
  2335. ahc_download_instr(struct ahc_softc *ahc, u_int instrptr, uint8_t *dconsts)
  2336. {
  2337. union ins_formats instr;
  2338. struct ins_format1 *fmt1_ins;
  2339. struct ins_format3 *fmt3_ins;
  2340. u_int opcode;
  2341. /*
  2342.  * The firmware is always compiled into a little endian format.
  2343.  */
  2344. instr.integer = ahc_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
  2345. fmt1_ins = &instr.format1;
  2346. fmt3_ins = NULL;
  2347. /* Pull the opcode */
  2348. opcode = instr.format1.opcode;
  2349. switch (opcode) {
  2350. case AIC_OP_JMP:
  2351. case AIC_OP_JC:
  2352. case AIC_OP_JNC:
  2353. case AIC_OP_CALL:
  2354. case AIC_OP_JNE:
  2355. case AIC_OP_JNZ:
  2356. case AIC_OP_JE:
  2357. case AIC_OP_JZ:
  2358. {
  2359. struct patch *cur_patch;
  2360. int address_offset;
  2361. u_int address;
  2362. u_int skip_addr;
  2363. u_int i;
  2364. fmt3_ins = &instr.format3;
  2365. address_offset = 0;
  2366. address = fmt3_ins->address;
  2367. cur_patch = patches;
  2368. skip_addr = 0;
  2369. for (i = 0; i < address;) {
  2370. ahc_check_patch(ahc, &cur_patch, i, &skip_addr);
  2371. if (skip_addr > i) {
  2372. int end_addr;
  2373. end_addr = MIN(address, skip_addr);
  2374. address_offset += end_addr - i;
  2375. i = skip_addr;
  2376. } else {
  2377. i++;
  2378. }
  2379. }
  2380. address -= address_offset;
  2381. fmt3_ins->address = address;
  2382. /* FALLTHROUGH */
  2383. }
  2384. case AIC_OP_OR:
  2385. case AIC_OP_AND:
  2386. case AIC_OP_XOR:
  2387. case AIC_OP_ADD:
  2388. case AIC_OP_ADC:
  2389. case AIC_OP_BMOV:
  2390. if (fmt1_ins->parity != 0) {
  2391. fmt1_ins->immediate = dconsts[fmt1_ins->immediate];
  2392. }
  2393. fmt1_ins->parity = 0;
  2394. if ((ahc->features & AHC_CMD_CHAN) == 0
  2395.  && opcode == AIC_OP_BMOV) {
  2396. /*
  2397.  * Block move was added at the same time
  2398.  * as the command channel.  Verify that
  2399.  * this is only a move of a single element
  2400.  * and convert the BMOV to a MOV
  2401.  * (AND with an immediate of FF).
  2402.  */
  2403. if (fmt1_ins->immediate != 1)
  2404. panic("%s: BMOV not supportedn",
  2405.       ahc_name(ahc));
  2406. fmt1_ins->opcode = AIC_OP_AND;
  2407. fmt1_ins->immediate = 0xff;
  2408. }
  2409. /* FALLTHROUGH */
  2410. case AIC_OP_ROL:
  2411. if ((ahc->features & AHC_ULTRA2) != 0) {
  2412. int i, count;
  2413. /* Calculate odd parity for the instruction */
  2414. for (i = 0, count = 0; i < 31; i++) {
  2415. uint32_t mask;
  2416. mask = 0x01 << i;
  2417. if ((instr.integer & mask) != 0)
  2418. count++;
  2419. }
  2420. if ((count & 0x01) == 0)
  2421. instr.format1.parity = 1;
  2422. } else {
  2423. /* Compress the instruction for older sequencers */
  2424. if (fmt3_ins != NULL) {
  2425. instr.integer =
  2426. fmt3_ins->immediate
  2427.       | (fmt3_ins->source << 8)
  2428.       | (fmt3_ins->address << 16)
  2429.       | (fmt3_ins->opcode << 25);
  2430. } else {
  2431. instr.integer =
  2432. fmt1_ins->immediate
  2433.       | (fmt1_ins->source << 8)
  2434.       | (fmt1_ins->destination << 16)
  2435.       | (fmt1_ins->ret << 24)
  2436.       | (fmt1_ins->opcode << 25);
  2437. }
  2438. }
  2439. /* The sequencer is a little endian cpu */
  2440. instr.integer = ahc_htole32(instr.integer);
  2441. ahc_outsb(ahc, SEQRAM, instr.bytes, 4);
  2442. break;
  2443. default:
  2444. panic("Unknown opcode encountered in seq program");
  2445. break;
  2446. }
  2447. }
  2448. void
  2449. ahc_dump_card_state(struct ahc_softc *ahc)
  2450. {
  2451. struct scb *scb;
  2452. struct scb_tailq *untagged_q;
  2453. int target;
  2454. int maxtarget;
  2455. int i;
  2456. uint8_t last_phase;
  2457. uint8_t qinpos;
  2458. uint8_t qintail;
  2459. uint8_t qoutpos;
  2460. uint8_t scb_index;
  2461. uint8_t saved_scbptr;
  2462. saved_scbptr = ahc_inb(ahc, SCBPTR);
  2463. last_phase = ahc_inb(ahc, LASTPHASE);
  2464. printf("%s: Dumping Card State %s, at SEQADDR 0x%xn",
  2465.        ahc_name(ahc), ahc_lookup_phase_entry(last_phase)->phasemsg,
  2466.        ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8));
  2467. printf("ACCUM = 0x%x, SINDEX = 0x%x, DINDEX = 0x%x, ARG_2 = 0x%xn",
  2468.        ahc_inb(ahc, ACCUM), ahc_inb(ahc, SINDEX), ahc_inb(ahc, DINDEX),
  2469.        ahc_inb(ahc, ARG_2));
  2470. printf("HCNT = 0x%xn", ahc_inb(ahc, HCNT));
  2471. printf("SCSISEQ = 0x%x, SBLKCTL = 0x%xn",
  2472.        ahc_inb(ahc, SCSISEQ), ahc_inb(ahc, SBLKCTL));
  2473. printf(" DFCNTRL = 0x%x, DFSTATUS = 0x%xn",
  2474.        ahc_inb(ahc, DFCNTRL), ahc_inb(ahc, DFSTATUS));
  2475. printf("LASTPHASE = 0x%x, SCSISIGI = 0x%x, SXFRCTL0 = 0x%xn",
  2476.        last_phase, ahc_inb(ahc, SCSISIGI), ahc_inb(ahc, SXFRCTL0));
  2477. printf("SSTAT0 = 0x%x, SSTAT1 = 0x%xn",
  2478.        ahc_inb(ahc, SSTAT0), ahc_inb(ahc, SSTAT1));
  2479. if ((ahc->features & AHC_DT) != 0)
  2480. printf("SCSIPHASE = 0x%xn", ahc_inb(ahc, SCSIPHASE));
  2481. printf("STACK == 0x%x, 0x%x, 0x%x, 0x%xn",
  2482. ahc_inb(ahc, STACK) | (ahc_inb(ahc, STACK) << 8),
  2483. ahc_inb(ahc, STACK) | (ahc_inb(ahc, STACK) << 8),
  2484. ahc_inb(ahc, STACK) | (ahc_inb(ahc, STACK) << 8),
  2485. ahc_inb(ahc, STACK) | (ahc_inb(ahc, STACK) << 8));
  2486. printf("SCB count = %dn", ahc->scb_data->numscbs);
  2487. printf("Kernel NEXTQSCB = %dn", ahc->next_queued_scb->hscb->tag);
  2488. printf("Card NEXTQSCB = %dn", ahc_inb(ahc, NEXT_QUEUED_SCB));
  2489. /* QINFIFO */
  2490. printf("QINFIFO entries: ");
  2491. if ((ahc->features & AHC_QUEUE_REGS) != 0) {
  2492. qinpos = ahc_inb(ahc, SNSCB_QOFF);
  2493. ahc_outb(ahc, SNSCB_QOFF, qinpos);
  2494. } else
  2495. qinpos = ahc_inb(ahc, QINPOS);
  2496. qintail = ahc->qinfifonext;
  2497. while (qinpos != qintail) {
  2498. printf("%d ", ahc->qinfifo[qinpos]);
  2499. qinpos++;
  2500. }
  2501. printf("n");
  2502. printf("Waiting Queue entries: ");
  2503. scb_index = ahc_inb(ahc, WAITING_SCBH);
  2504. i = 0;
  2505. while (scb_index != SCB_LIST_NULL && i++ < 256) {
  2506. ahc_outb(ahc, SCBPTR, scb_index);
  2507. printf("%d:%d ", scb_index, ahc_inb(ahc, SCB_TAG));
  2508. scb_index = ahc_inb(ahc, SCB_NEXT);
  2509. }
  2510. printf("n");
  2511. printf("Disconnected Queue entries: ");
  2512. scb_index = ahc_inb(ahc, DISCONNECTED_SCBH);
  2513. i = 0;
  2514. while (scb_index != SCB_LIST_NULL && i++ < 256) {
  2515. ahc_outb(ahc, SCBPTR, scb_index);
  2516. printf("%d:%d ", scb_index, ahc_inb(ahc, SCB_TAG));
  2517. scb_index = ahc_inb(ahc, SCB_NEXT);
  2518. }
  2519. printf("n");
  2520. ahc_sync_qoutfifo(ahc, BUS_DMASYNC_POSTREAD);
  2521. printf("QOUTFIFO entries: ");
  2522. qoutpos = ahc->qoutfifonext;
  2523. i = 0;
  2524. while (ahc->qoutfifo[qoutpos] != SCB_LIST_NULL && i++ < 256) {
  2525. printf("%d ", ahc->qoutfifo[qoutpos]);
  2526. qoutpos++;
  2527. }
  2528. printf("n");
  2529. printf("Sequencer Free SCB List: ");
  2530. scb_index = ahc_inb(ahc, FREE_SCBH);
  2531. i = 0;
  2532. while (scb_index != SCB_LIST_NULL && i++ < 256) {
  2533. ahc_outb(ahc, SCBPTR, scb_index);
  2534. printf("%d ", scb_index);
  2535. scb_index = ahc_inb(ahc, SCB_NEXT);
  2536. }
  2537. printf("n");
  2538. printf("Pending list: ");
  2539. i = 0;
  2540. LIST_FOREACH(scb, &ahc->pending_scbs, pending_links) {
  2541. if (i++ > 256)
  2542. break;
  2543. if (scb != LIST_FIRST(&ahc->pending_scbs))
  2544. printf(", ");
  2545. printf("%d", scb->hscb->tag);
  2546. if ((ahc->flags & AHC_PAGESCBS) == 0) {
  2547. ahc_outb(ahc, SCBPTR, scb->hscb->tag);
  2548. printf("(0x%x, 0x%x)", ahc_inb(ahc, SCB_CONTROL),
  2549.        ahc_inb(ahc, SCB_TAG));
  2550. }
  2551. }
  2552. printf("n");
  2553. printf("Kernel Free SCB list: ");
  2554. i = 0;
  2555. SLIST_FOREACH(scb, &ahc->scb_data->free_scbs, links.sle) {
  2556. if (i++ > 256)
  2557. break;
  2558. printf("%d ", scb->hscb->tag);
  2559. }
  2560. printf("n");
  2561. maxtarget = (ahc->features & (AHC_WIDE|AHC_TWIN)) ? 15 : 7;
  2562. for (target = 0; target <= maxtarget; target++) {
  2563. untagged_q = &ahc->untagged_queues[target];
  2564. if (TAILQ_FIRST(untagged_q) == NULL)
  2565. continue;
  2566. printf("Untagged Q(%d): ", target);
  2567. i = 0;
  2568. TAILQ_FOREACH(scb, untagged_q, links.tqe) {
  2569. if (i++ > 256)
  2570. break;
  2571. printf("%d ", scb->hscb->tag);
  2572. }
  2573. printf("n");
  2574. }
  2575. ahc_platform_dump_card_state(ahc);
  2576. ahc_outb(ahc, SCBPTR, saved_scbptr);
  2577. }
  2578. /************************* Target Mode ****************************************/
  2579. #ifdef AHC_TARGET_MODE
  2580. cam_status
  2581. ahc_find_tmode_devs(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb,
  2582.     struct ahc_tmode_tstate **tstate,
  2583.     struct ahc_tmode_lstate **lstate,
  2584.     int notfound_failure)
  2585. {
  2586. if ((ahc->features & AHC_TARGETMODE) == 0)
  2587. return (CAM_REQ_INVALID);
  2588. /*
  2589.  * Handle the 'black hole' device that sucks up
  2590.  * requests to unattached luns on enabled targets.
  2591.  */
  2592. if (ccb->ccb_h.target_id == CAM_TARGET_WILDCARD
  2593.  && ccb->ccb_h.target_lun == CAM_LUN_WILDCARD) {
  2594. *tstate = NULL;
  2595. *lstate = ahc->black_hole;
  2596. } else {
  2597. u_int max_id;
  2598. max_id = (ahc->features & AHC_WIDE) ? 15 : 7;
  2599. if (ccb->ccb_h.target_id > max_id)
  2600. return (CAM_TID_INVALID);
  2601. if (ccb->ccb_h.target_lun >= AHC_NUM_LUNS)
  2602. return (CAM_LUN_INVALID);
  2603. *tstate = ahc->enabled_targets[ccb->ccb_h.target_id];
  2604. *lstate = NULL;
  2605. if (*tstate != NULL)
  2606. *lstate =
  2607.     (*tstate)->enabled_luns[ccb->ccb_h.target_lun];
  2608. }
  2609. if (notfound_failure != 0 && *lstate == NULL)
  2610. return (CAM_PATH_INVALID);
  2611. return (CAM_REQ_CMP);
  2612. }
  2613. void
  2614. ahc_handle_en_lun(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb)
  2615. {
  2616. struct    ahc_tmode_tstate *tstate;
  2617. struct    ahc_tmode_lstate *lstate;
  2618. struct    ccb_en_lun *cel;
  2619. cam_status status;
  2620. u_int    target;
  2621. u_int    lun;
  2622. u_int    target_mask;
  2623. u_long    s;
  2624. char    channel;
  2625. status = ahc_find_tmode_devs(ahc, sim, ccb, &tstate, &lstate,
  2626.      /*notfound_failure*/FALSE);
  2627. if (status != CAM_REQ_CMP) {
  2628. ccb->ccb_h.status = status;
  2629. return;
  2630. }
  2631. if ((ahc->features & AHC_MULTIROLE) != 0) {
  2632. u_int    our_id;
  2633. if (cam_sim_bus(sim) == 0)
  2634. our_id = ahc->our_id;
  2635. else
  2636. our_id = ahc->our_id_b;
  2637. if (ccb->ccb_h.target_id != our_id) {
  2638. if ((ahc->features & AHC_MULTI_TID) != 0
  2639.      && (ahc->flags & AHC_INITIATORROLE) != 0) {
  2640. /*
  2641.  * Only allow additional targets if
  2642.  * the initiator role is disabled.
  2643.  * The hardware cannot handle a re-select-in
  2644.  * on the initiator id during a re-select-out
  2645.  * on a different target id.
  2646.  */
  2647. status = CAM_TID_INVALID;
  2648. } else if ((ahc->flags & AHC_INITIATORROLE) != 0
  2649. || ahc->enabled_luns > 0) {
  2650. /*
  2651.  * Only allow our target id to change
  2652.  * if the initiator role is not configured
  2653.  * and there are no enabled luns which
  2654.  * are attached to the currently registered
  2655.  * scsi id.
  2656.  */
  2657. status = CAM_TID_INVALID;
  2658. }
  2659. }
  2660. }
  2661. if (status != CAM_REQ_CMP) {
  2662. ccb->ccb_h.status = status;
  2663. return;
  2664. }
  2665. /*
  2666.  * We now have an id that is valid.
  2667.  * If we aren't in target mode, switch modes.
  2668.  */
  2669. if ((ahc->flags & AHC_TARGETROLE) == 0
  2670.  && ccb->ccb_h.target_id != CAM_TARGET_WILDCARD) {
  2671. u_long s;
  2672. printf("Configuring Target Moden");
  2673. ahc_lock(ahc, &s);
  2674. if (LIST_FIRST(&ahc->pending_scbs) != NULL) {
  2675. ccb->ccb_h.status = CAM_BUSY;
  2676. ahc_unlock(ahc, &s);
  2677. return;
  2678. }
  2679. ahc->flags |= AHC_TARGETROLE;
  2680. if ((ahc->features & AHC_MULTIROLE) == 0)
  2681. ahc->flags &= ~AHC_INITIATORROLE;
  2682. ahc_pause(ahc);
  2683. ahc_loadseq(ahc);
  2684. ahc_unlock(ahc, &s);
  2685. }
  2686. cel = &ccb->cel;
  2687. target = ccb->ccb_h.target_id;
  2688. lun = ccb->ccb_h.target_lun;
  2689. channel = SIM_CHANNEL(ahc, sim);
  2690. target_mask = 0x01 << target;
  2691. if (channel == 'B')
  2692. target_mask <<= 8;
  2693. if (cel->enable != 0) {
  2694. u_int scsiseq;
  2695. /* Are we already enabled?? */
  2696. if (lstate != NULL) {
  2697. xpt_print_path(ccb->ccb_h.path);
  2698. printf("Lun already enabledn");
  2699. ccb->ccb_h.status = CAM_LUN_ALRDY_ENA;
  2700. return;
  2701. }
  2702. if (cel->grp6_len != 0
  2703.  || cel->grp7_len != 0) {
  2704. /*
  2705.  * Don't (yet?) support vendor
  2706.  * specific commands.
  2707.  */
  2708. ccb->ccb_h.status = CAM_REQ_INVALID;
  2709. printf("Non-zero Group Codesn");
  2710. return;
  2711. }
  2712. /*
  2713.  * Seems to be okay.
  2714.  * Setup our data structures.
  2715.  */
  2716. if (target != CAM_TARGET_WILDCARD && tstate == NULL) {
  2717. tstate = ahc_alloc_tstate(ahc, target, channel);
  2718. if (tstate == NULL) {
  2719. xpt_print_path(ccb->ccb_h.path);
  2720. printf("Couldn't allocate tstaten");
  2721. ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
  2722. return;
  2723. }
  2724. }
  2725. lstate = malloc(sizeof(*lstate), M_DEVBUF, M_NOWAIT);
  2726. if (lstate == NULL) {
  2727. xpt_print_path(ccb->ccb_h.path);
  2728. printf("Couldn't allocate lstaten");
  2729. ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
  2730. return;
  2731. }
  2732. memset(lstate, 0, sizeof(*lstate));
  2733. status = xpt_create_path(&lstate->path, /*periph*/NULL,
  2734.  xpt_path_path_id(ccb->ccb_h.path),
  2735.  xpt_path_target_id(ccb->ccb_h.path),
  2736.  xpt_path_lun_id(ccb->ccb_h.path));
  2737. if (status != CAM_REQ_CMP) {
  2738. free(lstate, M_DEVBUF);
  2739. xpt_print_path(ccb->ccb_h.path);
  2740. printf("Couldn't allocate pathn");
  2741. ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
  2742. return;
  2743. }
  2744. SLIST_INIT(&lstate->accept_tios);
  2745. SLIST_INIT(&lstate->immed_notifies);
  2746. ahc_lock(ahc, &s);
  2747. ahc_pause(ahc);
  2748. if (target != CAM_TARGET_WILDCARD) {
  2749. tstate->enabled_luns[lun] = lstate;
  2750. ahc->enabled_luns++;
  2751. if ((ahc->features & AHC_MULTI_TID) != 0) {
  2752. u_int targid_mask;
  2753. targid_mask = ahc_inb(ahc, TARGID)
  2754.     | (ahc_inb(ahc, TARGID + 1) << 8);
  2755. targid_mask |= target_mask;
  2756. ahc_outb(ahc, TARGID, targid_mask);
  2757. ahc_outb(ahc, TARGID+1, (targid_mask >> 8));
  2758. ahc_update_scsiid(ahc, targid_mask);
  2759. } else {
  2760. u_int our_id;
  2761. char  channel;
  2762. channel = SIM_CHANNEL(ahc, sim);
  2763. our_id = SIM_SCSI_ID(ahc, sim);
  2764. /*
  2765.  * This can only happen if selections
  2766.  * are not enabled
  2767.  */
  2768. if (target != our_id) {
  2769. u_int sblkctl;
  2770. char  cur_channel;
  2771. int   swap;
  2772. sblkctl = ahc_inb(ahc, SBLKCTL);
  2773. cur_channel = (sblkctl & SELBUSB)
  2774.     ? 'B' : 'A';
  2775. if ((ahc->features & AHC_TWIN) == 0)
  2776. cur_channel = 'A';
  2777. swap = cur_channel != channel;
  2778. if (channel == 'A')
  2779. ahc->our_id = target;
  2780. else
  2781. ahc->our_id_b = target;
  2782. if (swap)
  2783. ahc_outb(ahc, SBLKCTL,
  2784.  sblkctl ^ SELBUSB);
  2785. ahc_outb(ahc, SCSIID, target);
  2786. if (swap)
  2787. ahc_outb(ahc, SBLKCTL, sblkctl);
  2788. }
  2789. }
  2790. } else
  2791. ahc->black_hole = lstate;
  2792. /* Allow select-in operations */
  2793. if (ahc->black_hole != NULL && ahc->enabled_luns > 0) {
  2794. scsiseq = ahc_inb(ahc, SCSISEQ_TEMPLATE);
  2795. scsiseq |= ENSELI;
  2796. ahc_outb(ahc, SCSISEQ_TEMPLATE, scsiseq);
  2797. scsiseq = ahc_inb(ahc, SCSISEQ);
  2798. scsiseq |= ENSELI;
  2799. ahc_outb(ahc, SCSISEQ, scsiseq);
  2800. }
  2801. ahc_unpause(ahc);
  2802. ahc_unlock(ahc, &s);
  2803. ccb->ccb_h.status = CAM_REQ_CMP;
  2804. xpt_print_path(ccb->ccb_h.path);
  2805. printf("Lun now enabled for target moden");
  2806. } else {
  2807. struct scb *scb;
  2808. int i, empty;
  2809. if (lstate == NULL) {
  2810. ccb->ccb_h.status = CAM_LUN_INVALID;
  2811. return;
  2812. }
  2813. ahc_lock(ahc, &s);
  2814. ccb->ccb_h.status = CAM_REQ_CMP;
  2815. LIST_FOREACH(scb, &ahc->pending_scbs, pending_links) {
  2816. struct ccb_hdr *ccbh;
  2817. ccbh = &scb->io_ctx->ccb_h;
  2818. if (ccbh->func_code == XPT_CONT_TARGET_IO
  2819.  && !xpt_path_comp(ccbh->path, ccb->ccb_h.path)){
  2820. printf("CTIO pendingn");
  2821. ccb->ccb_h.status = CAM_REQ_INVALID;
  2822. ahc_unlock(ahc, &s);
  2823. return;
  2824. }
  2825. }
  2826. if (SLIST_FIRST(&lstate->accept_tios) != NULL) {
  2827. printf("ATIOs pendingn");
  2828. ccb->ccb_h.status = CAM_REQ_INVALID;
  2829. }
  2830. if (SLIST_FIRST(&lstate->immed_notifies) != NULL) {
  2831. printf("INOTs pendingn");
  2832. ccb->ccb_h.status = CAM_REQ_INVALID;
  2833. }
  2834. if (ccb->ccb_h.status != CAM_REQ_CMP) {
  2835. ahc_unlock(ahc, &s);
  2836. return;
  2837. }
  2838. xpt_print_path(ccb->ccb_h.path);
  2839. printf("Target mode disabledn");
  2840. xpt_free_path(lstate->path);
  2841. free(lstate, M_DEVBUF);
  2842. ahc_pause(ahc);
  2843. /* Can we clean up the target too? */
  2844. if (target != CAM_TARGET_WILDCARD) {
  2845. tstate->enabled_luns[lun] = NULL;
  2846. ahc->enabled_luns--;
  2847. for (empty = 1, i = 0; i < 8; i++)
  2848. if (tstate->enabled_luns[i] != NULL) {
  2849. empty = 0;
  2850. break;
  2851. }
  2852. if (empty) {
  2853. ahc_free_tstate(ahc, target, channel,
  2854. /*force*/FALSE);
  2855. if (ahc->features & AHC_MULTI_TID) {
  2856. u_int targid_mask;
  2857. targid_mask = ahc_inb(ahc, TARGID)
  2858.     | (ahc_inb(ahc, TARGID + 1)
  2859.        << 8);
  2860. targid_mask &= ~target_mask;
  2861. ahc_outb(ahc, TARGID, targid_mask);
  2862. ahc_outb(ahc, TARGID+1,
  2863.    (targid_mask >> 8));
  2864. ahc_update_scsiid(ahc, targid_mask);
  2865. }
  2866. }
  2867. } else {
  2868. ahc->black_hole = NULL;
  2869. /*
  2870.  * We can't allow selections without
  2871.  * our black hole device.
  2872.  */
  2873. empty = TRUE;
  2874. }
  2875. if (ahc->enabled_luns == 0) {
  2876. /* Disallow select-in */
  2877. u_int scsiseq;
  2878. scsiseq = ahc_inb(ahc, SCSISEQ_TEMPLATE);
  2879. scsiseq &= ~ENSELI;
  2880. ahc_outb(ahc, SCSISEQ_TEMPLATE, scsiseq);
  2881. scsiseq = ahc_inb(ahc, SCSISEQ);
  2882. scsiseq &= ~ENSELI;
  2883. ahc_outb(ahc, SCSISEQ, scsiseq);
  2884. if ((ahc->features & AHC_MULTIROLE) == 0) {
  2885. printf("Configuring Initiator Moden");
  2886. ahc->flags &= ~AHC_TARGETROLE;
  2887. ahc->flags |= AHC_INITIATORROLE;
  2888. ahc_pause(ahc);
  2889. ahc_loadseq(ahc);
  2890. }
  2891. }
  2892. ahc_unpause(ahc);
  2893. ahc_unlock(ahc, &s);
  2894. }
  2895. }
  2896. static void
  2897. ahc_update_scsiid(struct ahc_softc *ahc, u_int targid_mask)
  2898. {
  2899. u_int scsiid_mask;
  2900. u_int scsiid;
  2901. if ((ahc->features & AHC_MULTI_TID) == 0)
  2902. panic("ahc_update_scsiid called on non-multitid unitn");
  2903. /*
  2904.  * Since we will rely on the the TARGID mask
  2905.  * for selection enables, ensure that OID
  2906.  * in SCSIID is not set to some other ID
  2907.  * that we don't want to allow selections on.
  2908.  */
  2909. if ((ahc->features & AHC_ULTRA2) != 0)
  2910. scsiid = ahc_inb(ahc, SCSIID_ULTRA2);
  2911. else
  2912. scsiid = ahc_inb(ahc, SCSIID);
  2913. scsiid_mask = 0x1 << (scsiid & OID);
  2914. if ((targid_mask & scsiid_mask) == 0) {
  2915. u_int our_id;
  2916. /* ffs counts from 1 */
  2917. our_id = ffs(targid_mask);
  2918. if (our_id == 0)
  2919. our_id = ahc->our_id;
  2920. else
  2921. our_id--;
  2922. scsiid &= TID;
  2923. scsiid |= our_id;
  2924. }
  2925. if ((ahc->features & AHC_ULTRA2) != 0)
  2926. ahc_outb(ahc, SCSIID_ULTRA2, scsiid);
  2927. else
  2928. ahc_outb(ahc, SCSIID, scsiid);
  2929. }
  2930. void
  2931. ahc_run_tqinfifo(struct ahc_softc *ahc, int paused)
  2932. {
  2933. struct target_cmd *cmd;
  2934. /*
  2935.  * If the card supports auto-access pause,
  2936.  * we can access the card directly regardless
  2937.  * of whether it is paused or not.
  2938.  */
  2939. if ((ahc->features & AHC_AUTOPAUSE) != 0)
  2940. paused = TRUE;
  2941. ahc_sync_tqinfifo(ahc, BUS_DMASYNC_POSTREAD);
  2942. while ((cmd = &ahc->targetcmds[ahc->tqinfifonext])->cmd_valid != 0) {
  2943. /*
  2944.  * Only advance through the queue if we
  2945.  * have the resources to process the command.
  2946.  */
  2947. if (ahc_handle_target_cmd(ahc, cmd) != 0)
  2948. break;
  2949. cmd->cmd_valid = 0;
  2950. ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
  2951. ahc->shared_data_dmamap,
  2952. ahc_targetcmd_offset(ahc, ahc->tqinfifonext),
  2953. sizeof(struct target_cmd),
  2954. BUS_DMASYNC_PREREAD);
  2955. ahc->tqinfifonext++;
  2956. /*
  2957.  * Lazily update our position in the target mode incoming
  2958.  * command queue as seen by the sequencer.
  2959.  */
  2960. if ((ahc->tqinfifonext & (HOST_TQINPOS - 1)) == 1) {
  2961. if ((ahc->features & AHC_HS_MAILBOX) != 0) {
  2962. u_int hs_mailbox;
  2963. hs_mailbox = ahc_inb(ahc, HS_MAILBOX);
  2964. hs_mailbox &= ~HOST_TQINPOS;
  2965. hs_mailbox |= ahc->tqinfifonext & HOST_TQINPOS;
  2966. ahc_outb(ahc, HS_MAILBOX, hs_mailbox);
  2967. } else {
  2968. if (!paused)
  2969. ahc_pause(ahc);
  2970. ahc_outb(ahc, KERNEL_TQINPOS,
  2971.  ahc->tqinfifonext & HOST_TQINPOS);
  2972. if (!paused)
  2973. ahc_unpause(ahc);
  2974. }
  2975. }
  2976. }
  2977. }
  2978. static int
  2979. ahc_handle_target_cmd(struct ahc_softc *ahc, struct target_cmd *cmd)
  2980. {
  2981. struct   ahc_tmode_tstate *tstate;
  2982. struct   ahc_tmode_lstate *lstate;
  2983. struct   ccb_accept_tio *atio;
  2984. uint8_t *byte;
  2985. int   initiator;
  2986. int   target;
  2987. int   lun;
  2988. initiator = SCSIID_TARGET(ahc, cmd->scsiid);
  2989. target = SCSIID_OUR_ID(cmd->scsiid);
  2990. lun    = (cmd->identify & MSG_IDENTIFY_LUNMASK);
  2991. byte = cmd->bytes;
  2992. tstate = ahc->enabled_targets[target];
  2993. lstate = NULL;
  2994. if (tstate != NULL)
  2995. lstate = tstate->enabled_luns[lun];
  2996. /*
  2997.  * Commands for disabled luns go to the black hole driver.
  2998.  */
  2999. if (lstate == NULL)
  3000. lstate = ahc->black_hole;
  3001. atio = (struct ccb_accept_tio*)SLIST_FIRST(&lstate->accept_tios);
  3002. if (atio == NULL) {
  3003. ahc->flags |= AHC_TQINFIFO_BLOCKED;
  3004. /*
  3005.  * Wait for more ATIOs from the peripheral driver for this lun.
  3006.  */
  3007. return (1);
  3008. } else
  3009. ahc->flags &= ~AHC_TQINFIFO_BLOCKED;
  3010. #if 0
  3011. printf("Incoming command from %d for %d:%d%sn",
  3012.        initiator, target, lun,
  3013.        lstate == ahc->black_hole ? "(Black Holed)" : "");
  3014. #endif
  3015. SLIST_REMOVE_HEAD(&lstate->accept_tios, sim_links.sle);
  3016. if (lstate == ahc->black_hole) {
  3017. /* Fill in the wildcards */
  3018. atio->ccb_h.target_id = target;
  3019. atio->ccb_h.target_lun = lun;
  3020. }
  3021. /*
  3022.  * Package it up and send it off to
  3023.  * whomever has this lun enabled.
  3024.  */
  3025. atio->sense_len = 0;
  3026. atio->init_id = initiator;
  3027. if (byte[0] != 0xFF) {
  3028. /* Tag was included */
  3029. atio->tag_action = *byte++;
  3030. atio->tag_id = *byte++;
  3031. atio->ccb_h.flags = CAM_TAG_ACTION_VALID;
  3032. } else {
  3033. atio->ccb_h.flags = 0;
  3034. }
  3035. byte++;
  3036. /* Okay.  Now determine the cdb size based on the command code */
  3037. switch (*byte >> CMD_GROUP_CODE_SHIFT) {
  3038. case 0:
  3039. atio->cdb_len = 6;
  3040. break;
  3041. case 1:
  3042. case 2:
  3043. atio->cdb_len = 10;
  3044. break;
  3045. case 4:
  3046. atio->cdb_len = 16;
  3047. break;
  3048. case 5:
  3049. atio->cdb_len = 12;
  3050. break;
  3051. case 3:
  3052. default:
  3053. /* Only copy the opcode. */
  3054. atio->cdb_len = 1;
  3055. printf("Reserved or VU command code type encounteredn");
  3056. break;
  3057. }
  3058. memcpy(atio->cdb_io.cdb_bytes, byte, atio->cdb_len);
  3059. atio->ccb_h.status |= CAM_CDB_RECVD;
  3060. if ((cmd->identify & MSG_IDENTIFY_DISCFLAG) == 0) {
  3061. /*
  3062.  * We weren't allowed to disconnect.
  3063.  * We're hanging on the bus until a
  3064.  * continue target I/O comes in response
  3065.  * to this accept tio.
  3066.  */
  3067. #if 0
  3068. printf("Received Immediate Command %d:%d:%d - %pn",
  3069.        initiator, target, lun, ahc->pending_device);
  3070. #endif
  3071. ahc->pending_device = lstate;
  3072. ahc_freeze_ccb((union ccb *)atio);
  3073. atio->ccb_h.flags |= CAM_DIS_DISCONNECT;
  3074. }
  3075. xpt_done((union ccb*)atio);
  3076. return (0);
  3077. }
  3078. #endif