Lines Matching refs:dpt

81 #include <dev/dpt/dpt.h>
88 #define dpt_inl(dpt, port) \
89 bus_read_4((dpt)->io_res, (dpt)->io_offset + port)
90 #define dpt_inb(dpt, port) \
91 bus_read_1((dpt)->io_res, (dpt)->io_offset + port)
92 #define dpt_outl(dpt, port, value) \
93 bus_write_4((dpt)->io_res, (dpt)->io_offset + port, value)
94 #define dpt_outb(dpt, port, value) \
95 bus_write_1((dpt)->io_res, (dpt)->io_offset + port, value)
109 static __inline int dpt_just_reset(dpt_softc_t * dpt);
110 static __inline int dpt_raid_busy(dpt_softc_t * dpt);
111 static __inline int dpt_wait(dpt_softc_t *dpt, u_int bits,
113 static __inline struct dpt_ccb* dptgetccb(struct dpt_softc *dpt);
114 static __inline void dptfreeccb(struct dpt_softc *dpt,
116 static __inline bus_addr_t dptccbvtop(struct dpt_softc *dpt,
119 static __inline int dpt_send_immediate(dpt_softc_t *dpt,
131 dptallocsgmap(struct dpt_softc *dpt);
133 static int dptallocccbs(dpt_softc_t *dpt);
135 static int dpt_get_conf(dpt_softc_t *dpt, dpt_ccb_t *dccb,
138 static void dpt_detect_cache(dpt_softc_t *dpt, dpt_ccb_t *dccb,
143 static void dpt_intr_locked(dpt_softc_t *dpt);
150 static int dpt_send_eata_command(dpt_softc_t *dpt, eata_ccb_t *cmd,
155 static void dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb,
164 dpt_just_reset(dpt_softc_t * dpt)
166 if ((dpt_inb(dpt, 2) == 'D')
167 && (dpt_inb(dpt, 3) == 'P')
168 && (dpt_inb(dpt, 4) == 'T')
169 && (dpt_inb(dpt, 5) == 'H'))
176 dpt_raid_busy(dpt_softc_t * dpt)
178 if ((dpt_inb(dpt, 0) == 'D')
179 && (dpt_inb(dpt, 1) == 'P')
180 && (dpt_inb(dpt, 2) == 'T'))
187 dpt_wait(dpt_softc_t *dpt, u_int bits, u_int state)
193 c = dpt_inb(dpt, HA_RSTATUS) & bits;
203 dptgetccb(struct dpt_softc *dpt)
208 mtx_assert(&dpt->lock, MA_OWNED);
209 if ((dccb = SLIST_FIRST(&dpt->free_dccb_list)) != NULL) {
210 SLIST_REMOVE_HEAD(&dpt->free_dccb_list, links);
211 dpt->free_dccbs--;
212 } else if (dpt->total_dccbs < dpt->max_dccbs) {
213 dptallocccbs(dpt);
214 dccb = SLIST_FIRST(&dpt->free_dccb_list);
216 device_printf(dpt->dev, "Can't malloc DCCB\n");
218 SLIST_REMOVE_HEAD(&dpt->free_dccb_list, links);
219 dpt->free_dccbs--;
227 dptfreeccb(struct dpt_softc *dpt, struct dpt_ccb *dccb)
231 mtx_assert(&dpt->lock, MA_OWNED);
236 else if (dpt->resource_shortage != 0
239 dpt->resource_shortage = FALSE;
242 SLIST_INSERT_HEAD(&dpt->free_dccb_list, dccb, links);
243 ++dpt->free_dccbs;
247 dptccbvtop(struct dpt_softc *dpt, struct dpt_ccb *dccb)
249 return (dpt->dpt_ccb_busbase
250 + (u_int32_t)((caddr_t)dccb - (caddr_t)dpt->dpt_dccbs));
254 dptccbptov(struct dpt_softc *dpt, bus_addr_t busaddr)
256 return (dpt->dpt_dccbs
258 - (struct dpt_ccb *)dpt->dpt_ccb_busbase));
266 dpt_send_immediate(dpt_softc_t *dpt, eata_ccb_t *cmd_block,
270 return (dpt_send_eata_command(dpt, cmd_block, cmd_busaddr,
287 dptallocsgmap(struct dpt_softc *dpt)
297 if (bus_dmamem_alloc(dpt->sg_dmat, (void **)&sg_map->sg_vaddr,
303 (void)bus_dmamap_load(dpt->sg_dmat, sg_map->sg_dmamap, sg_map->sg_vaddr,
307 SLIST_INSERT_HEAD(&dpt->sg_maps, sg_map, links);
316 dptallocccbs(dpt_softc_t *dpt)
326 mtx_assert(&dpt->lock, MA_OWNED);
327 next_ccb = &dpt->dpt_dccbs[dpt->total_dccbs];
329 if (next_ccb == dpt->dpt_dccbs) {
335 sg_map = SLIST_FIRST(&dpt->sg_maps);
337 sg_map = dptallocsgmap(dpt);
346 newcount = (PAGE_SIZE / (dpt->sgsize * sizeof(dpt_sg_t)));
347 for (i = 0; dpt->total_dccbs < dpt->max_dccbs && i < newcount; i++) {
350 error = bus_dmamap_create(dpt->buffer_dmat, /*flags*/0,
354 callout_init_mtx(&next_ccb->timer, &dpt->lock, 0);
358 next_ccb->eata_ccb.cp_statDMA = htonl(dpt->sp_physaddr);
360 htonl(dptccbvtop(dpt, next_ccb)
362 next_ccb->eata_ccb.cp_busaddr = dpt->dpt_ccb_busend;
364 next_ccb->tag = dpt->total_dccbs;
365 SLIST_INSERT_HEAD(&dpt->free_dccb_list, next_ccb, links);
366 segs += dpt->sgsize;
367 physaddr += (dpt->sgsize * sizeof(dpt_sg_t));
368 dpt->dpt_ccb_busend += sizeof(*next_ccb);
370 dpt->total_dccbs++;
379 dpt_get_conf(dpt_softc_t *dpt, dpt_ccb_t *dccb, u_int32_t dccb_busaddr,
389 mtx_assert(&dpt->lock, MA_OWNED);
391 bzero((void *)(uintptr_t)(volatile void *)dpt->sp, sizeof(*dpt->sp));
417 while (((status = dpt_inb(dpt, HA_RSTATUS)) != (HA_SREADY | HA_SSC)
420 || (dpt_wait(dpt, HA_SBUSY, 0))) {
426 if (dpt_raid_busy(dpt)) {
427 device_printf(dpt->dev,
433 DptStat_Reset_BUSY(dpt->sp);
440 if ((result = dpt_send_eata_command(dpt, cp, dccb_busaddr,
443 device_printf(dpt->dev,
452 && !((status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ);
458 status = dpt_inb(dpt, HA_RSTATUS);
465 && (dpt->sp->hba_stat == 0)
466 && (dpt->sp->scsi_stat == 0)
467 && (dpt->sp->residue_len == 0))
470 if (dpt->sp->scsi_stat == SCSI_STATUS_CHECK_COND)
478 dpt_detect_cache(dpt_softc_t *dpt, dpt_ccb_t *dccb, u_int32_t dccb_busaddr,
488 mtx_assert(&dpt->lock, MA_OWNED);
494 dpt->cache_type = DPT_CACHE_WRITEBACK;
495 dpt->cache_size = 0;
498 bzero((void *)(uintptr_t)(volatile void *)dpt->sp, sizeof(dpt->sp));
531 result = dpt_send_eata_command(dpt, cp, dccb_busaddr,
535 device_printf(dpt->dev,
543 !((status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ);
549 status = dpt_inb(dpt, HA_RSTATUS);
564 device_printf(dpt->dev, "NOTICE: Log Page (1) layout error\n");
568 dpt->cache_type = DPT_NO_CACHE;
583 dpt->cache_type = DPT_NO_CACHE;
588 dpt->cache_type = DPT_CACHE_WRITETHROUGH;
593 dpt->cache_size = param[5]
611 struct dpt_softc *dpt;
615 dpt = (struct dpt_softc *)ccb->ccb_h.ccb_dpt_ptr;
617 mtx_assert(&dpt->lock, MA_OWNED);
621 device_printf(dpt->dev,
628 dptfreeccb(dpt, dccb);
664 bus_dmamap_sync(dpt->buffer_dmat, dccb->dmamap, op);
677 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
678 dptfreeccb(dpt, dccb);
685 LIST_INSERT_HEAD(&dpt->pending_ccb_list, &ccb->ccb_h, sim_links.le);
688 if (dpt_send_eata_command(dpt, &dccb->eata_ccb,
693 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
694 dptfreeccb(dpt, dccb);
702 struct dpt_softc *dpt;
706 dpt = (struct dpt_softc *)cam_sim_softc(sim);
707 mtx_assert(&dpt->lock, MA_OWNED);
709 if ((dpt->state & DPT_HA_SHUTDOWN_ACTIVE) != 0) {
734 if ((dccb = dptgetccb(dpt)) == NULL) {
735 dpt->resource_shortage = 1;
746 ccb->ccb_h.ccb_dpt_ptr = dpt;
759 ccb->ccb_h.target_id == dpt->hostid[cam_sim_bus(sim)]
789 dptfreeccb(dpt, dccb);
805 error = bus_dmamap_load_ccb(dpt->buffer_dmat,
862 spi->bus_width = (dpt->max_id > 7)
910 if (dpt->max_id > 7)
915 cpi->max_target = dpt->max_id;
916 cpi->max_lun = dpt->max_lun;
917 cpi->initiator_id = dpt->hostid[cam_sim_bus(sim)];
945 dpt_send_eata_command(dpt_softc_t *dpt, eata_ccb_t *cmd_block,
961 if ((dpt_inb(dpt, HA_RAUXSTAT) & HA_ABUSY) == 0)
969 if (loop > dpt->performance.max_eata_tries)
970 dpt->performance.max_eata_tries = loop;
972 if (loop < dpt->performance.min_eata_tries)
973 dpt->performance.min_eata_tries = loop;
977 ++dpt->performance.command_too_busy;
984 dpt->last_contact = microtime_now;
998 dpt_outl(dpt, HA_WDMAADDR, cmd_busaddr);
1002 dpt_outb(dpt, HA_WCODE2, code2);
1003 dpt_outb(dpt, HA_WCODE, code);
1005 dpt_outb(dpt, HA_WIFC, ifc);
1007 dpt_outb(dpt, HA_WCOMMAND, command);
1017 dpt_softc_t *dpt = device_get_softc(dev);
1020 mtx_init(&dpt->lock, "dpt", NULL, MTX_DEF);
1021 SLIST_INIT(&dpt->free_dccb_list);
1022 LIST_INIT(&dpt->pending_ccb_list);
1024 dpt->resetlevel[i] = DPT_HA_OK;
1027 dpt_reset_performance(dpt);
1033 dpt_free(struct dpt_softc *dpt)
1035 switch (dpt->init_level) {
1038 bus_dmamap_unload(dpt->dccb_dmat, dpt->dccb_dmamap);
1040 bus_dmamem_free(dpt->dccb_dmat, dpt->dpt_dccbs,
1041 dpt->dccb_dmamap);
1043 bus_dma_tag_destroy(dpt->dccb_dmat);
1045 bus_dma_tag_destroy(dpt->buffer_dmat);
1050 while ((sg_map = SLIST_FIRST(&dpt->sg_maps)) != NULL) {
1051 SLIST_REMOVE_HEAD(&dpt->sg_maps, links);
1052 bus_dmamap_unload(dpt->sg_dmat,
1054 bus_dmamem_free(dpt->sg_dmat, sg_map->sg_vaddr,
1058 bus_dma_tag_destroy(dpt->sg_dmat);
1063 mtx_destroy(&dpt->lock);
1069 dpt_softc_t * dpt;
1072 dpt = device_get_softc(dev);
1074 dpt->io_res = bus_alloc_resource_any(dev, dpt->io_type, &dpt->io_rid,
1076 if (dpt->io_res == NULL) {
1082 dpt->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &dpt->irq_rid,
1084 if (dpt->irq_res == NULL) {
1099 struct dpt_softc * dpt;
1101 dpt = device_get_softc(dev);
1103 if (dpt->ih)
1104 bus_teardown_intr(dev, dpt->irq_res, dpt->ih);
1105 if (dpt->io_res)
1106 bus_release_resource(dev, dpt->io_type, dpt->io_rid, dpt->io_res);
1107 if (dpt->irq_res)
1108 bus_release_resource(dev, SYS_RES_IRQ, dpt->irq_rid, dpt->irq_res);
1109 if (dpt->drq_res)
1110 bus_release_resource(dev, SYS_RES_DRQ, dpt->drq_rid, dpt->drq_res);
1124 dpt_init(struct dpt_softc *dpt)
1134 dpt->init_level = 0;
1135 SLIST_INIT(&dpt->sg_maps);
1136 mtx_lock(&dpt->lock);
1139 device_printf(dpt->dev, "resetting HBA\n");
1140 dpt_outb(dpt, HA_WCOMMAND, EATA_CMD_RESET);
1145 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1158 &dpt->sg_dmat) != 0) {
1162 dpt->init_level++;
1172 sg_map = dptallocsgmap(dpt);
1176 dpt->sp = (volatile dpt_sp_t *)sg_map->sg_vaddr;
1177 dccb = (struct dpt_ccb *)(uintptr_t)(volatile void *)&dpt->sp[1];
1179 dpt->sp_physaddr = sg_map->sg_physaddr;
1183 dccb->eata_ccb.cp_statDMA = htonl(dpt->sp_physaddr);
1184 dccb->eata_ccb.cp_reqDMA = htonl(dpt->sp_physaddr + sizeof(*dccb)
1189 retval = dpt_get_conf(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1193 device_printf(dpt->dev, "Failed to get board configuration\n");
1198 bzero(&dccb[1], sizeof(dpt->board_data));
1199 retval = dpt_get_conf(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1200 sizeof(dpt->board_data), 0, conf.scsi_id0, 0);
1202 device_printf(dpt->dev, "Failed to get inquiry information\n");
1205 bcopy(&dccb[1], &dpt->board_data, sizeof(dpt->board_data));
1207 dpt_detect_cache(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1212 dpt->EATA_revision = 'a';
1215 dpt->EATA_revision = 'b';
1218 dpt->EATA_revision = 'c';
1221 dpt->EATA_revision = 'z';
1224 dpt->EATA_revision = '?';
1227 dpt->max_id = conf.MAX_ID;
1228 dpt->max_lun = conf.MAX_LUN;
1229 dpt->irq = conf.IRQ;
1230 dpt->dma_channel = (8 - conf.DMA_channel) & 7;
1231 dpt->channels = conf.MAX_CHAN + 1;
1232 dpt->state |= DPT_HA_OK;
1234 dpt->primary = FALSE;
1236 dpt->primary = TRUE;
1238 dpt->more_support = conf.MORE_support;
1240 if (strncmp(dpt->board_data.firmware, "07G0", 4) >= 0)
1241 dpt->immediate_support = 1;
1243 dpt->immediate_support = 0;
1245 dpt->cplen = ntohl(conf.cplen);
1246 dpt->cppadlen = ntohs(conf.cppadlen);
1247 dpt->max_dccbs = ntohs(conf.queuesiz);
1249 if (dpt->max_dccbs > 256) {
1250 device_printf(dpt->dev, "Max CCBs reduced from %d to "
1251 "256 due to tag algorithm\n", dpt->max_dccbs);
1252 dpt->max_dccbs = 256;
1255 dpt->hostid[0] = conf.scsi_id0;
1256 dpt->hostid[1] = conf.scsi_id1;
1257 dpt->hostid[2] = conf.scsi_id2;
1260 dpt->sgsize = 8192;
1262 dpt->sgsize = ntohs(conf.SGsiz);
1265 if (dpt->sgsize < 17 || dpt->sgsize > 32)
1266 dpt->sgsize = 32;
1268 if (dpt->sgsize > dpt_max_segs)
1269 dpt->sgsize = dpt_max_segs;
1272 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1280 /* nsegments */ dpt->sgsize,
1284 /* lockarg */ &dpt->lock,
1285 &dpt->buffer_dmat) != 0) {
1286 device_printf(dpt->dev,
1287 "bus_dma_tag_create(...,dpt->buffer_dmat) failed\n");
1291 dpt->init_level++;
1294 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1301 /* maxsize */ (dpt->max_dccbs *
1309 &dpt->dccb_dmat) != 0) {
1310 device_printf(dpt->dev,
1311 "bus_dma_tag_create(...,dpt->dccb_dmat) failed\n");
1315 dpt->init_level++;
1318 if (bus_dmamem_alloc(dpt->dccb_dmat, (void **)&dpt->dpt_dccbs,
1319 BUS_DMA_NOWAIT, &dpt->dccb_dmamap) != 0) {
1320 device_printf(dpt->dev,
1321 "bus_dmamem_alloc(dpt->dccb_dmat,...) failed\n");
1325 dpt->init_level++;
1328 bus_dmamap_load(dpt->dccb_dmat, dpt->dccb_dmamap,
1329 dpt->dpt_dccbs,
1330 (dpt->max_dccbs * sizeof(struct dpt_ccb))
1332 dptmapmem, &dpt->dpt_ccb_busbase, /*flags*/0);
1335 bzero(dpt->dpt_dccbs,
1336 (dpt->max_dccbs * sizeof(struct dpt_ccb)) + sizeof(dpt_sp_t));
1338 dpt->dpt_ccb_busend = dpt->dpt_ccb_busbase;
1340 dpt->sp = (dpt_sp_t*)&dpt->dpt_dccbs[dpt->max_dccbs];
1341 dpt->sp_physaddr = dpt->dpt_ccb_busbase
1342 + (dpt->max_dccbs * sizeof(dpt_ccb_t));
1343 dpt->init_level++;
1346 if (dptallocccbs(dpt) == 0) {
1347 device_printf(dpt->dev, "dptallocccbs(dpt) == 0\n");
1348 mtx_unlock(&dpt->lock);
1353 dpt->target_mode_enabled = 1;
1356 strp = dpt->board_data.vendor;
1364 device_printf(dpt->dev, "%.8s %.16s FW Rev. %.4s, ",
1365 dpt->board_data.vendor,
1366 dpt->board_data.modelNum, dpt->board_data.firmware);
1368 printf("%d channel%s, ", dpt->channels, dpt->channels > 1 ? "s" : "");
1370 if (dpt->cache_type != DPT_NO_CACHE
1371 && dpt->cache_size != 0) {
1373 dpt->cache_type == DPT_CACHE_WRITETHROUGH
1377 printf("%d CCBs\n", dpt->max_dccbs);
1378 mtx_unlock(&dpt->lock);
1382 mtx_unlock(&dpt->lock);
1387 dpt_attach(dpt_softc_t *dpt)
1395 devq = cam_simq_alloc(dpt->max_dccbs);
1399 mtx_lock(&dpt->lock);
1400 for (i = 0; i < dpt->channels; i++) {
1404 dpt->sims[i] = cam_sim_alloc(dpt_action, dpt_poll, "dpt",
1405 dpt, device_get_unit(dpt->dev), &dpt->lock,
1407 /*tagged*/dpt->max_dccbs, devq);
1408 if (dpt->sims[i] == NULL) {
1418 if (xpt_bus_register(dpt->sims[i], dpt->dev, i) != CAM_SUCCESS){
1419 cam_sim_free(dpt->sims[i], /*free_devq*/i == 0);
1420 dpt->sims[i] = NULL;
1424 if (xpt_create_path(&dpt->paths[i], /*periph*/NULL,
1425 cam_sim_path(dpt->sims[i]),
1428 xpt_bus_deregister(cam_sim_path(dpt->sims[i]));
1429 cam_sim_free(dpt->sims[i], /*free_devq*/i == 0);
1430 dpt->sims[i] = NULL;
1435 mtx_unlock(&dpt->lock);
1438 dpt, SHUTDOWN_PRI_DEFAULT);
1445 struct dpt_softc * dpt;
1448 dpt = device_get_softc(dev);
1450 mtx_lock(&dpt->lock);
1451 for (i = 0; i < dpt->channels; i++) {
1453 xpt_async(AC_LOST_DEVICE, dpt->paths[i], NULL);
1455 xpt_free_path(dpt->paths[i]);
1456 xpt_bus_deregister(cam_sim_path(dpt->sims[i]));
1457 cam_sim_free(dpt->sims[i], /*free_devq*/TRUE);
1459 mtx_unlock(&dpt->lock);
1461 dptshutdown((void *)dpt, SHUTDOWN_PRI_DEFAULT);
1465 dpt_free(dpt);
1476 dpt_softc_t *dpt;
1478 dpt = arg;
1479 mtx_lock(&dpt->lock);
1480 dpt_intr_locked(dpt);
1481 mtx_unlock(&dpt->lock);
1485 dpt_intr_locked(dpt_softc_t *dpt)
1496 while (((aux_status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ) != 0) {
1503 if (dpt->sp->ccb_busaddr < dpt->dpt_ccb_busbase
1504 || dpt->sp->ccb_busaddr >= dpt->dpt_ccb_busend) {
1505 device_printf(dpt->dev,
1507 status = dpt_inb(dpt, HA_RSTATUS);
1511 dccb = dptccbptov(dpt, dpt->sp->ccb_busaddr);
1513 dpt->sp->ccb_busaddr = ~0;
1516 if (dpt->sp->EOC == 0) {
1517 device_printf(dpt->dev,
1523 status = dpt_inb(dpt, HA_RSTATUS);
1526 dpt->sp->EOC = 0;
1534 hba_stat = dpt->sp->hba_stat;
1535 scsi_stat = dpt->sp->scsi_stat;
1536 residue_len = dpt->sp->residue_len;
1539 if ((status = dpt_inb(dpt, HA_RSTATUS)) & HA_SERROR) {
1546 if (dpt_just_reset(dpt)) {
1547 device_printf(dpt->dev, "HBA rebooted.\n"
1551 device_printf(dpt->dev,
1568 bus_dmamap_sync(dpt->buffer_dmat, dccb->dmamap, op);
1569 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
1592 dptfreeccb(dpt, dccb);
1595 dptprocesserror(dpt, dccb, ccb, hba_stat, scsi_stat,
1602 dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb, union ccb *ccb,
1654 device_printf(dpt->dev, "Undocumented Error %x\n", hba_stat);
1659 dptfreeccb(dpt, dccb);
1668 struct dpt_softc *dpt;
1672 dpt = (struct dpt_softc *)ccb->ccb_h.ccb_dpt_ptr;
1673 mtx_assert(&dpt->lock, MA_OWNED);
1683 dpt_intr_locked(dpt);
1693 dpt_send_immediate(dpt, &dccb->eata_ccb, dccb->eata_ccb.cp_busaddr,
1705 dpt_softc_t *dpt;
1707 dpt = (dpt_softc_t *)arg;
1709 device_printf(dpt->dev,
1715 mtx_lock(&dpt->lock);
1716 dpt_send_immediate(dpt, NULL, 0, EATA_POWER_OFF_WARN, 0, 0, 0);
1717 mtx_unlock(&dpt->lock);
1719 device_printf(dpt->dev, "Controller was warned of shutdown and is now "
1736 dpt_reset_hba(dpt_softc_t *dpt)
1743 mtx_assert(&dpt->lock, MA_OWNED);
1770 while (dpt->queue_status & DPT_SUBMITTED_QUEUE_ACTIVE) {
1774 dpt->queue_status |= DPT_SUBMITTED_QUEUE_ACTIVE;
1777 if ((result = dpt_send_eata_command(dpt, &dccb.eata_ccb,
1779 device_printf(dpt->dev, "Failed to send the RESET message.\n"
1783 if ((result = dpt_send_eata_command(dpt, &dccb.eata_ccb,
1787 device_get_nameunit(dpt->dev));
1790 dpt->performance.cold_boots++;
1795 dpt->performance.warm_starts++;
1798 device_printf(dpt->dev,
1801 while ((dccbp = TAILQ_FIRST(&dpt->completed_ccbs)) != NULL) {
1812 dpt_Qremove_submitted(dpt, dccbp);
1816 (dccbp->std_callback)(dpt, dccbp->eata_ccb.cp_channel,
1819 dpt_Qpush_free(dpt, dccbp);
1823 device_printf(dpt->dev, "reset done aborting all pending commands\n");
1824 dpt->queue_status &= ~DPT_SUBMITTED_QUEUE_ACTIVE;
1840 dpt_target_ccb(dpt_softc_t * dpt, int bus, u_int8_t target, u_int8_t lun,
1846 mtx_assert(&dpt->lock, MA_OWNED);
1848 device_printf(dpt->dev,
1892 if (dpt_scatter_gather(dpt, ccb, DPT_RW_BUFFER_SIZE,
1893 dpt->rw_buffer[bus][target][lun])) {
1894 device_printf(dpt->dev, "Failed to setup Scatter/Gather for "
1902 dpt_set_target(int redo, dpt_softc_t * dpt,
1907 mtx_assert(&dpt->lock, MA_OWNED);
1908 if (dpt->target_mode_enabled) {
1910 dpt_target_ccb(dpt, bus, target, lun, ccb, mode,
1913 ccb->transaction_id = ++dpt->commands_processed;
1916 dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd]++;
1919 dpt_Qadd_waiting(dpt, ccb);
1920 dpt_sched_queue(dpt);
1922 device_printf(dpt->dev,
1941 dpt_softc_t *dpt;
1945 dpt = devclass_get_device(dpt_devclass, unit);
1946 if (dpt == NULL)
1949 mtx_lock(&dpt->lock);
1950 if (dpt->target_mode_enabled) {
1951 if ((channel >= dpt->channels) || (target > dpt->max_id) ||
1952 (lun > dpt->max_lun)) {
1953 mtx_unlock(&dpt->lock);
1956 if ((dpt->rw_buffer[channel][target][lun] == NULL) ||
1957 (dpt->buffer_receiver[channel][target][lun] == NULL)) {
1958 mtx_unlock(&dpt->lock);
1963 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
1964 device_printf(dpt->dev,
1967 mtx_unlock(&dpt->lock);
1971 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
1972 mtx_unlock(&dpt->lock);
1974 device_get_nameunit(dpt->dev));
1977 bcopy(dpt->rw_buffer[channel][target][lun] + offset, data, length);
1978 dpt_target_ccb(dpt, channel, target, lun, ccb, mode,
1983 ccb->transaction_id = ++dpt->commands_processed;
1986 dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd]++;
1989 dpt_Qadd_waiting(dpt, ccb);
1990 dpt_sched_queue(dpt);
1992 mtx_unlock(&dpt->lock);
1995 mtx_unlock(&dpt->lock);
2000 dpt_target_done(dpt_softc_t * dpt, int bus, dpt_ccb_t * ccb)
2011 dpt_Qremove_completed(dpt, ccb);
2017 #define read_buffer_callback (dpt->buffer_receiver br_index )
2018 #define read_buffer (dpt->rw_buffer[br_channel][br_target][br_lun])
2028 read_buffer_callback(device_get_unit(dpt->dev),
2045 (ccb->wrbuff_callback) (device_get_unit(dpt->dev), br_channel,
2050 device_printf(dpt->dev,
2054 dpt->target_ccb[br_channel][br_target][br_lun] = NULL;
2055 dpt_Qpush_free(dpt, ccb);
2069 dpt_softc_t *dpt;
2073 dpt = devclass_get_device(dpt_devclass, unit);
2074 if (dpt == NULL)
2076 mtx_lock(&dpt->lock);
2078 if (dpt->state & DPT_HA_SHUTDOWN_ACTIVE) {
2079 mtx_unlock(&dpt->lock);
2083 if ((channel > (dpt->channels - 1)) || (target > (dpt->max_id - 1)) ||
2084 (lun > (dpt->max_lun - 1))) {
2085 mtx_unlock(&dpt->lock);
2089 if (dpt->buffer_receiver[channel][target][lun] == NULL) {
2092 dpt->buffer_receiver[channel][target][lun] = callback;
2096 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
2097 device_printf(dpt->dev,
2100 mtx_unlock(&dpt->lock);
2104 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
2105 mtx_unlock(&dpt->lock);
2107 device_get_nameunit(dpt->dev));
2112 dpt->target_ccb[channel][target][lun] = ccb;
2114 dpt->rw_buffer[channel][target][lun] =
2116 if (dpt->rw_buffer[channel][target][lun] == NULL) {
2117 device_printf(dpt->dev, "Failed to allocate "
2119 dpt_Qpush_free(dpt, ccb);
2120 mtx_unlock(&dpt->lock);
2123 dpt_set_target(0, dpt, channel, target, lun, mode,
2125 mtx_unlock(&dpt->lock);
2128 mtx_unlock(&dpt->lock);
2133 if (dpt->buffer_receiver[channel][target][lun] == callback) {
2134 mtx_unlock(&dpt->lock);
2137 mtx_unlock(&dpt->lock);
2141 if (dpt->buffer_receiver[channel][target][lun] == callback) {
2142 dpt->buffer_receiver[channel][target][lun] = NULL;
2143 dpt_Qpush_free(dpt, ccb);
2144 free(dpt->rw_buffer[channel][target][lun], M_DEVBUF);
2145 mtx_unlock(&dpt->lock);
2148 mtx_unlock(&dpt->lock);
2154 mtx_unlock(&dpt->lock);
2159 dpt_blinking_led(dpt_softc_t * dpt)
2166 mtx_assert(&dpt->lock, MA_OWNED);
2173 state = dpt_inl(dpt, 1);
2177 result = dpt_inb(dpt, 5);
2188 dpt_user_cmd(dpt_softc_t * dpt, eata_pt_t * user_cmd,
2198 mtx_assert(&dpt->lock, MA_OWNED);
2204 if ((channel > (dpt->channels - 1))
2205 || (target > dpt->max_id)
2206 || (lun > dpt->max_lun))
2209 if (target == dpt->sc_scsi_link[channel].adapter_targ) {
2221 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
2222 device_printf(dpt->dev,
2228 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
2230 device_get_nameunit(dpt->dev));
2264 device_printf(dpt->dev, "Cannot allocate %d bytes "
2285 if (dpt_scatter_gather(dpt, ccb, ccb->eata_ccb.cp_datalen,
2301 dpt->state |= DPT_HA_QUIET;
2303 while ((submitted = dpt->submitted_ccbs_count) != 0) {
2304 huh = mtx_sleep((void *) dpt, &dpt->lock,
2322 dpt->state &= ~DPT_HA_QUIET;
2332 ccb->transaction_id = ++dpt->commands_processed;
2338 ++dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd];
2341 dpt_Qadd_waiting(dpt, ccb);
2343 dpt_sched_queue(dpt);
2346 (void) mtx_sleep((void *) ccb, &dpt->lock, PCATCH | PRIBIO, "dptucw",
2357 dpt_user_cmd_done(dpt_softc_t * dpt, int bus, dpt_ccb_t * ccb)
2362 mtx_unlock(&dpt->lock);
2372 mtx_lock(&dpt->lock);
2374 dpt_Qpush_free(dpt, ccb);
2383 mtx_lock(&dpt->lock);
2384 dpt_Qpush_free(dpt, ccb);
2396 mtx_lock(&dpt->lock);
2397 dpt_Qpush_free(dpt, ccb);
2402 mtx_lock(&dpt->lock);
2405 dpt_Qpush_free(dpt, ccb);