Lines Matching refs:bt

35 __FBSDID("$FreeBSD: stable/11/sys/dev/buslogic/bt.c 315812 2017-03-23 06:40:20Z mav $");
73 static __inline void btnextinbox(struct bt_softc *bt);
74 static __inline void btnextoutbox(struct bt_softc *bt);
77 btnextinbox(struct bt_softc *bt)
79 if (bt->cur_inbox == bt->last_inbox)
80 bt->cur_inbox = bt->in_boxes;
82 bt->cur_inbox++;
86 btnextoutbox(struct bt_softc *bt)
88 if (bt->cur_outbox == bt->last_outbox)
89 bt->cur_outbox = bt->out_boxes;
91 bt->cur_outbox++;
95 static __inline u_int32_t btccbvtop(struct bt_softc *bt,
97 static __inline struct bt_ccb* btccbptov(struct bt_softc *bt,
99 static __inline u_int32_t btsensepaddr(struct bt_softc *bt,
101 static __inline struct scsi_sense_data* btsensevaddr(struct bt_softc *bt,
105 btccbvtop(struct bt_softc *bt, struct bt_ccb *bccb)
107 return (bt->bt_ccb_physbase
108 + (u_int32_t)((caddr_t)bccb - (caddr_t)bt->bt_ccb_array));
112 btccbptov(struct bt_softc *bt, u_int32_t ccb_addr)
114 return (bt->bt_ccb_array +
115 ((struct bt_ccb*)(uintptr_t)ccb_addr - (struct bt_ccb*)(uintptr_t)bt->bt_ccb_physbase));
119 btsensepaddr(struct bt_softc *bt, struct bt_ccb *bccb)
123 index = (u_int)(bccb - bt->bt_ccb_array);
124 return (bt->sense_buffers_physbase
129 btsensevaddr(struct bt_softc *bt, struct bt_ccb *bccb)
133 index = (u_int)(bccb - bt->bt_ccb_array);
134 return (bt->sense_buffers + index);
137 static __inline struct bt_ccb* btgetccb(struct bt_softc *bt);
138 static __inline void btfreeccb(struct bt_softc *bt,
140 static void btallocccbs(struct bt_softc *bt);
142 static void btdone(struct bt_softc *bt, struct bt_ccb *bccb,
144 static void bt_intr_locked(struct bt_softc *bt);
147 static int btreset(struct bt_softc* bt, int hard_reset);
150 static int btinitmboxes(struct bt_softc *bt);
156 static void btfetchtransinfo(struct bt_softc *bt,
203 struct bt_softc *bt = device_get_softc(dev);
205 SLIST_INIT(&bt->free_bt_ccbs);
206 LIST_INIT(&bt->pending_ccbs);
207 SLIST_INIT(&bt->sg_maps);
208 bt->dev = dev;
209 bt->port = port;
210 bt->irq = irq;
211 bt->drq = drq;
212 mtx_init(&bt->lock, "bt", NULL, MTX_DEF);
218 struct bt_softc *bt = device_get_softc(dev);
220 switch (bt->init_level) {
223 bus_dmamap_unload(bt->sense_dmat, bt->sense_dmamap);
225 bus_dmamem_free(bt->sense_dmat, bt->sense_buffers,
226 bt->sense_dmamap);
228 bus_dma_tag_destroy(bt->sense_dmat);
233 while ((sg_map = SLIST_FIRST(&bt->sg_maps))!= NULL) {
234 SLIST_REMOVE_HEAD(&bt->sg_maps, links);
235 bus_dmamap_unload(bt->sg_dmat,
237 bus_dmamem_free(bt->sg_dmat, sg_map->sg_vaddr,
241 bus_dma_tag_destroy(bt->sg_dmat);
244 bus_dmamap_unload(bt->ccb_dmat, bt->ccb_dmamap);
247 bus_dmamem_free(bt->ccb_dmat, bt->bt_ccb_array,
248 bt->ccb_dmamap);
251 bus_dma_tag_destroy(bt->ccb_dmat);
254 bus_dmamap_unload(bt->mailbox_dmat, bt->mailbox_dmamap);
257 bus_dmamem_free(bt->mailbox_dmat, bt->in_boxes,
258 bt->mailbox_dmamap);
261 bus_dma_tag_destroy(bt->buffer_dmat);
264 bus_dma_tag_destroy(bt->mailbox_dmat);
269 mtx_destroy(&bt->lock);
275 struct bt_softc *bt = device_get_softc(dev);
287 mtx_lock(&bt->lock);
288 error = bt_cmd(bt, BOP_INQUIRE_CONFIG, NULL, /*parmlen*/0,
291 mtx_unlock(&bt->lock);
298 if (bt->model[0] == '5') {
342 struct bt_softc *bt = device_get_softc(dev);
355 status = bt_inb(bt, STATUS_REG);
365 intstat = bt_inb(bt, INTSTAT_REG);
371 geometry = bt_inb(bt, GEOMETRY_REG);
383 mtx_lock(&bt->lock);
384 if ((error = btreset(bt, /*hard_reset*/TRUE)) != 0) {
385 mtx_unlock(&bt->lock);
392 error = bt_cmd(bt, BOP_INQUIRE_ESETUP_INFO, &param, /*parmlen*/1,
395 mtx_unlock(&bt->lock);
409 struct bt_softc *bt = device_get_softc(dev);
417 mtx_lock(&bt->lock);
418 error = bt_cmd(bt, BOP_INQUIRE_BOARD_ID, NULL, /*parmlen*/0,
422 mtx_unlock(&bt->lock);
426 bt->firmware_ver[0] = board_id.firmware_rev_major;
427 bt->firmware_ver[1] = '.';
428 bt->firmware_ver[2] = board_id.firmware_rev_minor;
429 bt->firmware_ver[3] = '\0';
435 if (bt->firmware_ver[0] > '0') {
437 error = bt_cmd(bt, BOP_INQUIRE_FW_VER_3DIG, NULL, /*parmlen*/0,
438 (u_int8_t*)&bt->firmware_ver[3], 1,
441 mtx_unlock(&bt->lock);
447 if (bt->firmware_ver[3] == ' ')
448 bt->firmware_ver[3] = '\0';
449 bt->firmware_ver[4] = '\0';
452 if (strcmp(bt->firmware_ver, "3.3") >= 0) {
454 error = bt_cmd(bt, BOP_INQUIRE_FW_VER_4DIG, NULL, /*parmlen*/0,
455 (u_int8_t*)&bt->firmware_ver[4], 1,
458 mtx_unlock(&bt->lock);
464 if (bt->firmware_ver[4] == ' ')
465 bt->firmware_ver[4] = '\0';
466 bt->firmware_ver[5] = '\0';
488 error = bt_cmd(bt, BOP_INQUIRE_ESETUP_INFO, &length_param, /*parmlen*/1,
492 mtx_unlock(&bt->lock);
496 bt->bios_addr = esetup_info.bios_addr << 12;
498 bt->mailbox_addrlimit = BUS_SPACE_MAXADDR;
500 && bt->firmware_ver[0] == '2') {
501 snprintf(bt->model, sizeof(bt->model), "542B");
503 && bt->firmware_ver[0] == '2') {
509 bt->mailbox_addrlimit = BUS_SPACE_MAXADDR_24BIT;
510 snprintf(bt->model, sizeof(bt->model), "742A");
512 && bt->firmware_ver[0] == '0') {
514 snprintf(bt->model, sizeof(bt->model), "747A");
520 error = bt_cmd(bt, BOP_INQUIRE_MODEL, &length_param, 1,
524 mtx_unlock(&bt->lock);
531 bt->model[i] = model_data.ascii_model[i];
532 if (bt->model[i] == ' ')
535 bt->model[i] = '\0';
538 bt->level_trigger_ints = esetup_info.level_trigger_ints ? 1 : 0;
541 bt->max_sg = esetup_info.max_sg;
544 bt->wide_bus = esetup_info.wide_bus;
545 bt->diff_bus = esetup_info.diff_bus;
546 bt->ultra_scsi = esetup_info.ultra_scsi;
548 if ((bt->firmware_ver[0] == '5')
549 || (bt->firmware_ver[0] == '4' && bt->wide_bus))
550 bt->extended_lun = TRUE;
552 bt->strict_rr = (strcmp(bt->firmware_ver, "3.31") >= 0);
554 bt->extended_trans =
555 ((bt_inb(bt, GEOMETRY_REG) & EXTENDED_TRANSLATION) != 0);
570 if (bt->firmware_ver[0] == '5') {
571 bt->max_ccbs = 192;
572 bt->tag_capable = TRUE;
573 } else if (bt->firmware_ver[0] == '4') {
574 if (bt->model[0] == '5')
575 bt->max_ccbs = 50;
577 bt->max_ccbs = 100;
578 bt->tag_capable = (strcmp(bt->firmware_ver, "4.22") >= 0);
580 bt->max_ccbs = 30;
581 if (bt->firmware_ver[0] == '3'
582 && (strcmp(bt->firmware_ver, "3.35") >= 0))
583 bt->tag_capable = TRUE;
585 bt->tag_capable = FALSE;
588 if (bt->tag_capable != FALSE)
589 bt->tags_permitted = ALL_TARGETS;
592 if (bt->firmware_ver[0] >= '4') {
604 error = bt_cmd(bt, BOP_FETCH_LRAM,
611 mtx_unlock(&bt->lock);
618 bt->disc_permitted = auto_scsi_data.low_disc_permitted
620 bt->sync_permitted = auto_scsi_data.low_sync_permitted
622 bt->fast_permitted = auto_scsi_data.low_fast_permitted
624 bt->ultra_permitted = auto_scsi_data.low_ultra_permitted
626 bt->wide_permitted = auto_scsi_data.low_wide_permitted
629 if (bt->ultra_scsi == FALSE)
630 bt->ultra_permitted = 0;
632 if (bt->wide_bus == FALSE)
633 bt->wide_permitted = 0;
642 error = bt_cmd(bt, BOP_INQUIRE_SETUP_INFO, &length_param,
647 mtx_unlock(&bt->lock);
655 bt->sync_permitted = ALL_TARGETS;
657 if (bt->model[0] == '7') {
659 bt->fast_permitted = ALL_TARGETS;
660 if (strcmp(bt->model, "757") == 0)
661 bt->wide_permitted = ALL_TARGETS;
664 bt->disc_permitted = ALL_TARGETS;
668 bt->num_boxes = bt->max_ccbs;
672 error = bt_cmd(bt, BOP_INQUIRE_CONFIG, NULL, /*parmlen*/0,
675 mtx_unlock(&bt->lock);
681 bt->scsi_id = config_data.scsi_id;
692 struct bt_softc *bt = device_get_softc(dev);
695 device_printf(dev, "BT-%s FW Rev. %s ", bt->model, bt->firmware_ver);
697 if (bt->ultra_scsi != 0)
700 if (bt->wide_bus != 0)
705 if (bt->diff_bus != 0)
708 printf("SCSI Host Adapter, SCSI ID %d, %d CCBs\n", bt->scsi_id,
709 bt->max_ccbs);
722 if (bus_dma_tag_create( /* parent */ bt->parent_dmat,
734 /* lockarg */ &bt->lock,
735 &bt->buffer_dmat) != 0) {
739 bt->init_level++;
741 if (bus_dma_tag_create( /* parent */ bt->parent_dmat,
744 /* lowaddr */ bt->mailbox_addrlimit,
748 /* maxsize */ bt->num_boxes *
756 &bt->mailbox_dmat) != 0) {
760 bt->init_level++;
763 if (bus_dmamem_alloc(bt->mailbox_dmat, (void **)&bt->out_boxes,
764 BUS_DMA_NOWAIT, &bt->mailbox_dmamap) != 0) {
768 bt->init_level++;
771 bus_dmamap_load(bt->mailbox_dmat, bt->mailbox_dmamap,
772 bt->out_boxes,
773 bt->num_boxes * (sizeof(bt_mbox_in_t)
775 btmapmboxes, bt, /*flags*/0);
777 bt->init_level++;
779 bt->in_boxes = (bt_mbox_in_t *)&bt->out_boxes[bt->num_boxes];
781 mtx_lock(&bt->lock);
782 btinitmboxes(bt);
783 mtx_unlock(&bt->lock);
786 if (bus_dma_tag_create( /* parent */ bt->parent_dmat,
793 /* maxsize */ bt->max_ccbs *
800 &bt->ccb_dmat) != 0) {
804 bt->init_level++;
807 if (bus_dmamem_alloc(bt->ccb_dmat, (void **)&bt->bt_ccb_array,
808 BUS_DMA_NOWAIT, &bt->ccb_dmamap) != 0) {
812 bt->init_level++;
815 bus_dmamap_load(bt->ccb_dmat, bt->ccb_dmamap,
816 bt->bt_ccb_array,
817 bt->max_ccbs * sizeof(struct bt_ccb),
818 btmapccbs, bt, /*flags*/0);
820 bt->init_level++;
823 if (bus_dma_tag_create( /* parent */ bt->parent_dmat,
836 &bt->sg_dmat) != 0) {
840 bt->init_level++;
843 bzero(bt->bt_ccb_array, bt->max_ccbs * sizeof(struct bt_ccb));
844 btallocccbs(bt);
846 if (bt->num_ccbs == 0) {
865 struct bt_softc *bt = device_get_softc(dev);
874 if (bt->tag_capable != 0)
875 tagged_dev_openings = bt->max_ccbs - 1;
882 devq = cam_simq_alloc(bt->max_ccbs - 1);
889 bt->sim = cam_sim_alloc(btaction, btpoll, "bt", bt,
890 device_get_unit(bt->dev), &bt->lock, 2, tagged_dev_openings, devq);
891 if (bt->sim == NULL) {
896 mtx_lock(&bt->lock);
897 if (xpt_bus_register(bt->sim, dev, 0) != CAM_SUCCESS) {
898 cam_sim_free(bt->sim, /*free_devq*/TRUE);
899 mtx_unlock(&bt->lock);
903 if (xpt_create_path(&bt->path, /*periph*/NULL,
904 cam_sim_path(bt->sim), CAM_TARGET_WILDCARD,
906 xpt_bus_deregister(cam_sim_path(bt->sim));
907 cam_sim_free(bt->sim, /*free_devq*/TRUE);
908 mtx_unlock(&bt->lock);
911 mtx_unlock(&bt->lock);
916 error = bus_setup_intr(dev, bt->irq, INTR_TYPE_CAM | INTR_ENTROPY |
917 INTR_MPSAFE, NULL, bt_intr, bt, &bt->ih);
1002 btallocccbs(struct bt_softc *bt)
1011 if (bt->num_ccbs >= bt->max_ccbs)
1015 next_ccb = &bt->bt_ccb_array[bt->num_ccbs];
1023 if (bus_dmamem_alloc(bt->sg_dmat, (void **)&sg_map->sg_vaddr,
1029 SLIST_INSERT_HEAD(&bt->sg_maps, sg_map, links);
1031 bus_dmamap_load(bt->sg_dmat, sg_map->sg_dmamap, sg_map->sg_vaddr,
1032 PAGE_SIZE, btmapsgs, bt, /*flags*/0);
1038 for (i = 0; bt->num_ccbs < bt->max_ccbs && i < newcount; i++) {
1044 callout_init_mtx(&next_ccb->timer, &bt->lock, 0);
1045 error = bus_dmamap_create(bt->buffer_dmat, /*flags*/0,
1049 SLIST_INSERT_HEAD(&bt->free_bt_ccbs, next_ccb, links);
1053 bt->num_ccbs++;
1057 if (bt->recovery_bccb == NULL) {
1058 bt->recovery_bccb = SLIST_FIRST(&bt->free_bt_ccbs);
1059 SLIST_REMOVE_HEAD(&bt->free_bt_ccbs, links);
1062 if (SLIST_FIRST(&bt->free_bt_ccbs) != NULL)
1066 device_printf(bt->dev, "Can't malloc BCCBs\n");
1070 btfreeccb(struct bt_softc *bt, struct bt_ccb *bccb)
1074 mtx_assert(&bt->lock, MA_OWNED);
1077 if (bt->resource_shortage != 0
1080 bt->resource_shortage = FALSE;
1083 SLIST_INSERT_HEAD(&bt->free_bt_ccbs, bccb, links);
1084 bt->active_ccbs--;
1088 btgetccb(struct bt_softc *bt)
1093 mtx_assert(&bt->lock, MA_OWNED);
1094 if ((bccb = SLIST_FIRST(&bt->free_bt_ccbs)) != NULL) {
1095 SLIST_REMOVE_HEAD(&bt->free_bt_ccbs, links);
1096 bt->active_ccbs++;
1098 btallocccbs(bt);
1099 bccb = SLIST_FIRST(&bt->free_bt_ccbs);
1101 SLIST_REMOVE_HEAD(&bt->free_bt_ccbs, links);
1102 bt->active_ccbs++;
1112 struct bt_softc *bt;
1116 bt = (struct bt_softc *)cam_sim_softc(sim);
1117 mtx_assert(&bt->lock, MA_OWNED);
1130 if ((bccb = btgetccb(bt)) == NULL) {
1132 bt->resource_shortage = TRUE;
1133 xpt_freeze_simq(bt->sim, /*count*/1);
1146 ccb->ccb_h.ccb_bt_ptr = bt;
1169 btfreeccb(bt, bccb);
1189 btfreeccb(bt, bccb);
1198 if (bt->sense_buffers != NULL) {
1199 hccb->sense_addr = btsensepaddr(bt, bccb);
1208 bt->buffer_dmat,
1220 xpt_freeze_simq(bt->sim, 1);
1269 if ((bt->disc_permitted & target_mask) != 0)
1271 if ((bt->tags_permitted & target_mask) != 0)
1274 if ((bt->ultra_permitted & target_mask) != 0)
1276 else if ((bt->fast_permitted & target_mask) != 0)
1278 else if ((bt->sync_permitted & target_mask) != 0)
1290 if ((bt->wide_permitted & target_mask) != 0)
1301 btfetchtransinfo(bt, cts);
1318 if (size_mb >= 1024 && (bt->extended_trans != 0)) {
1338 btreset(bt, /*hardreset*/TRUE);
1354 if (bt->tag_capable != 0)
1356 if (bt->wide_bus != 0)
1361 cpi->max_target = bt->wide_bus ? 15 : 7;
1363 cpi->initiator_id = bt->scsi_id;
1390 struct bt_softc *bt;
1394 bt = (struct bt_softc *)ccb->ccb_h.ccb_bt_ptr;
1398 device_printf(bt->dev,
1405 btfreeccb(bt, bccb);
1440 bus_dmamap_sync(bt->buffer_dmat, bccb->dmamap, op);
1454 bus_dmamap_unload(bt->buffer_dmat, bccb->dmamap);
1455 btfreeccb(bt, bccb);
1462 LIST_INSERT_HEAD(&bt->pending_ccbs, &ccb->ccb_h, sim_links.le);
1468 bt->cur_outbox->ccb_addr = btccbvtop(bt, bccb);
1469 if (bt->cur_outbox->action_code != BMBO_FREE) {
1477 device_printf(bt->dev,
1479 "commands active!!!\n", bt->active_ccbs,
1480 bt->max_ccbs);
1483 bus_dmamap_unload(bt->buffer_dmat, bccb->dmamap);
1484 btfreeccb(bt, bccb);
1485 bt->resource_shortage = TRUE;
1486 xpt_freeze_simq(bt->sim, /*count*/1);
1491 bt->cur_outbox->action_code = BMBO_START;
1492 bt_outb(bt, COMMAND_REG, BOP_START_MBOX);
1493 btnextoutbox(bt);
1499 struct bt_softc *bt;
1501 bt = arg;
1502 mtx_lock(&bt->lock);
1503 bt_intr_locked(bt);
1504 mtx_unlock(&bt->lock);
1508 bt_intr_locked(struct bt_softc *bt)
1512 while (((intstat = bt_inb(bt, INTSTAT_REG)) & INTR_PENDING) != 0) {
1515 bt->latched_status = bt_inb(bt, STATUS_REG);
1516 bt->command_cmp = TRUE;
1519 bt_outb(bt, CONTROL_REG, RESET_INTR);
1522 while (bt->cur_inbox->comp_code != BMBI_FREE) {
1523 btdone(bt,
1524 btccbptov(bt, bt->cur_inbox->ccb_addr),
1525 bt->cur_inbox->comp_code);
1526 bt->cur_inbox->comp_code = BMBI_FREE;
1527 btnextinbox(bt);
1532 btreset(bt, /*hardreset*/FALSE);
1538 btdone(struct bt_softc *bt, struct bt_ccb *bccb, bt_mbi_comp_code_t comp_code)
1547 device_printf(bt->dev,
1560 bus_dmamap_sync(bt->buffer_dmat, bccb->dmamap, op);
1561 bus_dmamap_unload(bt->buffer_dmat, bccb->dmamap);
1564 if (bccb == bt->recovery_bccb) {
1579 cam_sim_path(bt->sim),
1588 ccb_h = LIST_FIRST(&bt->pending_ccbs);
1597 btdone(bt, pending_bccb, BMBI_ERROR);
1605 device_printf(bt->dev, "No longer in timeout\n");
1613 device_printf(bt->dev,
1617 device_printf(bt->dev,
1623 printf("bt: ccb %p - error %x occurred. "
1654 if (bt->sense_buffers != NULL) {
1656 *btsensevaddr(bt, bccb);
1677 panic("%s: Inavlid Action code", bt_name(bt));
1680 panic("%s: Inavlid CCB Opcode code", bt_name(bt));
1684 panic("%s: Linked CCB Lun Mismatch", bt_name(bt));
1687 panic("%s: Invalid CCB or SG list", bt_name(bt));
1710 bt->tags_permitted &= ~(0x01 << csio->ccb_h.target_id);
1754 btfreeccb(bt, bccb);
1762 btfreeccb(bt, bccb);
1769 btreset(struct bt_softc* bt, int hard_reset)
1780 bt_outb(bt, CONTROL_REG, reset_type);
1785 status = bt_inb(bt, STATUS_REG);
1792 device_printf(bt->dev,
1801 status = bt_inb(bt, STATUS_REG);
1808 "status = 0x%x\n", bt_name(bt), status);
1815 status = bt_inb(bt, STATUS_REG);
1821 device_printf(bt->dev,
1830 device_printf(bt->dev,
1834 device_printf(bt->dev,
1836 bt_inb(bt, DATAIN_REG));
1841 if (bt->init_level > 4)
1842 btinitmboxes(bt);
1845 if (bt->path != NULL)
1846 xpt_async(AC_BUS_RESET, bt->path, NULL);
1851 while ((ccb_h = LIST_FIRST(&bt->pending_ccbs)) != NULL) {
1856 btdone(bt, pending_bccb, BMBI_ERROR);
1866 bt_cmd(struct bt_softc *bt, bt_op_t opcode, u_int8_t *params, u_int param_len,
1885 bt->command_cmp = 0;
1892 status = bt_inb(bt, STATUS_REG);
1902 (void)bt_inb(bt, DATAIN_REG);
1906 device_printf(bt->dev,
1915 bt_outb(bt, COMMAND_REG, opcode);
1924 status = bt_inb(bt, STATUS_REG);
1925 intstat = bt_inb(bt, INTSTAT_REG);
1933 if (bt->command_cmp != 0) {
1934 saved_status = bt->latched_status;
1941 bt_outb(bt, COMMAND_REG, *params++);
1947 device_printf(bt->dev, "bt_cmd: Timeout sending parameters, "
1959 status = bt_inb(bt, STATUS_REG);
1960 intstat = bt_inb(bt, INTSTAT_REG);
1970 bt_intr_locked(bt);
1972 if (bt->command_cmp != 0) {
1978 saved_status = bt->latched_status;
2000 data = bt_inb(bt, DATAIN_REG);
2004 device_printf(bt->dev,
2023 device_printf(bt->dev,
2026 device_printf(bt->dev, "status = 0x%x, intstat = 0x%x, "
2034 bt_intr_locked(bt);
2050 device_printf(bt->dev, "Invalid Command 0x%x\n",
2053 status = bt_inb(bt, STATUS_REG);
2058 btreset(bt, /*hard_reset*/FALSE);
2078 btinitmboxes(struct bt_softc *bt) {
2082 bzero(bt->in_boxes, sizeof(bt_mbox_in_t) * bt->num_boxes);
2083 bzero(bt->out_boxes, sizeof(bt_mbox_out_t) * bt->num_boxes);
2084 bt->cur_inbox = bt->in_boxes;
2085 bt->last_inbox = bt->in_boxes + bt->num_boxes - 1;
2086 bt->cur_outbox = bt->out_boxes;
2087 bt->last_outbox = bt->out_boxes + bt->num_boxes - 1;
2090 init_mbox.num_boxes = bt->num_boxes;
2091 init_mbox.base_addr[0] = bt->mailbox_physbase & 0xFF;
2092 init_mbox.base_addr[1] = (bt->mailbox_physbase >> 8) & 0xFF;
2093 init_mbox.base_addr[2] = (bt->mailbox_physbase >> 16) & 0xFF;
2094 init_mbox.base_addr[3] = (bt->mailbox_physbase >> 24) & 0xFF;
2095 error = bt_cmd(bt, BOP_INITIALIZE_32BMBOX, (u_int8_t *)&init_mbox,
2101 else if (bt->strict_rr != 0) {
2110 error = bt_cmd(bt, BOP_ENABLE_STRICT_RR, &param, 1,
2118 device_printf(bt->dev,
2131 btfetchtransinfo(struct bt_softc *bt, struct ccb_trans_settings *cts)
2161 error = bt_cmd(bt, BOP_INQUIRE_SETUP_INFO, &param, /*paramlen*/1,
2166 device_printf(bt->dev,
2182 if (strcmp(bt->firmware_ver, "5.06L") >= 0) {
2191 } else if ((bt->wide_permitted & targ_mask) != 0) {
2209 if (bt->firmware_ver[0] >= '3') {
2217 error = bt_cmd(bt, BOP_TARG_SYNC_INFO, &param, /*paramlen*/1,
2222 device_printf(bt->dev,
2257 struct bt_softc* bt;
2259 bt = (struct bt_softc*)arg;
2260 bt->mailbox_physbase = segs->ds_addr;
2266 struct bt_softc* bt;
2268 bt = (struct bt_softc*)arg;
2269 bt->bt_ccb_physbase = segs->ds_addr;
2276 struct bt_softc* bt;
2278 bt = (struct bt_softc*)arg;
2279 SLIST_FIRST(&bt->sg_maps)->sg_physaddr = segs->ds_addr;
2293 struct bt_softc *bt;
2297 bt = (struct bt_softc *)ccb->ccb_h.ccb_bt_ptr;
2298 mtx_assert(&bt->lock, MA_OWNED);
2323 xpt_freeze_simq(bt->sim, /*count*/1);
2327 ccb_h = LIST_FIRST(&bt->pending_ccbs);
2338 || bt->cur_outbox->action_code != BMBO_FREE
2340 && (bt->firmware_ver[0] < '5'))) {
2354 btreset(bt, /*hardreset*/TRUE);
2355 device_printf(bt->dev, "No longer in timeout\n");
2371 bt->recovery_bccb->hccb.opcode = INITIATOR_BUS_DEV_RESET;
2374 bt->recovery_bccb->hccb.datain = TRUE;
2375 bt->recovery_bccb->hccb.dataout = TRUE;
2376 bt->recovery_bccb->hccb.btstat = 0;
2377 bt->recovery_bccb->hccb.sdstat = 0;
2378 bt->recovery_bccb->hccb.target_id = ccb->ccb_h.target_id;
2381 bt->cur_outbox->ccb_addr = btccbvtop(bt, bt->recovery_bccb);
2382 bt->cur_outbox->action_code = BMBO_START;
2383 bt_outb(bt, COMMAND_REG, BOP_START_MBOX);
2384 btnextoutbox(bt);
2388 MODULE_VERSION(bt, 1);
2389 MODULE_DEPEND(bt, cam, 1, 1, 1);