Lines Matching refs:dpt

80 #include <dev/dpt/dpt.h>
87 #define dpt_inl(dpt, port) \
88 bus_read_4((dpt)->io_res, (dpt)->io_offset + port)
89 #define dpt_inb(dpt, port) \
90 bus_read_1((dpt)->io_res, (dpt)->io_offset + port)
91 #define dpt_outl(dpt, port, value) \
92 bus_write_4((dpt)->io_res, (dpt)->io_offset + port, value)
93 #define dpt_outb(dpt, port, value) \
94 bus_write_1((dpt)->io_res, (dpt)->io_offset + port, value)
108 static __inline int dpt_just_reset(dpt_softc_t * dpt);
109 static __inline int dpt_raid_busy(dpt_softc_t * dpt);
113 static __inline int dpt_wait(dpt_softc_t *dpt, u_int bits,
115 static __inline struct dpt_ccb* dptgetccb(struct dpt_softc *dpt);
116 static __inline void dptfreeccb(struct dpt_softc *dpt,
118 static __inline bus_addr_t dptccbvtop(struct dpt_softc *dpt,
121 static __inline int dpt_send_immediate(dpt_softc_t *dpt,
133 dptallocsgmap(struct dpt_softc *dpt);
135 static int dptallocccbs(dpt_softc_t *dpt);
137 static int dpt_get_conf(dpt_softc_t *dpt, dpt_ccb_t *dccb,
140 static void dpt_detect_cache(dpt_softc_t *dpt, dpt_ccb_t *dccb,
145 static void dpt_intr_locked(dpt_softc_t *dpt);
152 static int dpt_send_eata_command(dpt_softc_t *dpt, eata_ccb_t *cmd,
157 static void dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb,
166 dpt_just_reset(dpt_softc_t * dpt)
168 if ((dpt_inb(dpt, 2) == 'D')
169 && (dpt_inb(dpt, 3) == 'P')
170 && (dpt_inb(dpt, 4) == 'T')
171 && (dpt_inb(dpt, 5) == 'H'))
178 dpt_raid_busy(dpt_softc_t * dpt)
180 if ((dpt_inb(dpt, 0) == 'D')
181 && (dpt_inb(dpt, 1) == 'P')
182 && (dpt_inb(dpt, 2) == 'T'))
207 dpt_wait(dpt_softc_t *dpt, u_int bits, u_int state)
213 c = dpt_inb(dpt, HA_RSTATUS) & bits;
223 dptgetccb(struct dpt_softc *dpt)
228 mtx_assert(&dpt->lock, MA_OWNED);
229 if ((dccb = SLIST_FIRST(&dpt->free_dccb_list)) != NULL) {
230 SLIST_REMOVE_HEAD(&dpt->free_dccb_list, links);
231 dpt->free_dccbs--;
232 } else if (dpt->total_dccbs < dpt->max_dccbs) {
233 dptallocccbs(dpt);
234 dccb = SLIST_FIRST(&dpt->free_dccb_list);
236 device_printf(dpt->dev, "Can't malloc DCCB\n");
238 SLIST_REMOVE_HEAD(&dpt->free_dccb_list, links);
239 dpt->free_dccbs--;
247 dptfreeccb(struct dpt_softc *dpt, struct dpt_ccb *dccb)
251 mtx_assert(&dpt->lock, MA_OWNED);
256 else if (dpt->resource_shortage != 0
259 dpt->resource_shortage = FALSE;
262 SLIST_INSERT_HEAD(&dpt->free_dccb_list, dccb, links);
263 ++dpt->free_dccbs;
267 dptccbvtop(struct dpt_softc *dpt, struct dpt_ccb *dccb)
269 return (dpt->dpt_ccb_busbase
270 + (u_int32_t)((caddr_t)dccb - (caddr_t)dpt->dpt_dccbs));
274 dptccbptov(struct dpt_softc *dpt, bus_addr_t busaddr)
276 return (dpt->dpt_dccbs
278 - (struct dpt_ccb *)dpt->dpt_ccb_busbase));
286 dpt_send_immediate(dpt_softc_t *dpt, eata_ccb_t *cmd_block,
290 return (dpt_send_eata_command(dpt, cmd_block, cmd_busaddr,
307 dptallocsgmap(struct dpt_softc *dpt)
317 if (bus_dmamem_alloc(dpt->sg_dmat, (void **)&sg_map->sg_vaddr,
323 (void)bus_dmamap_load(dpt->sg_dmat, sg_map->sg_dmamap, sg_map->sg_vaddr,
327 SLIST_INSERT_HEAD(&dpt->sg_maps, sg_map, links);
336 dptallocccbs(dpt_softc_t *dpt)
346 mtx_assert(&dpt->lock, MA_OWNED);
347 next_ccb = &dpt->dpt_dccbs[dpt->total_dccbs];
349 if (next_ccb == dpt->dpt_dccbs) {
355 sg_map = SLIST_FIRST(&dpt->sg_maps);
357 sg_map = dptallocsgmap(dpt);
366 newcount = (PAGE_SIZE / (dpt->sgsize * sizeof(dpt_sg_t)));
367 for (i = 0; dpt->total_dccbs < dpt->max_dccbs && i < newcount; i++) {
370 error = bus_dmamap_create(dpt->buffer_dmat, /*flags*/0,
374 callout_init_mtx(&next_ccb->timer, &dpt->lock, 0);
378 next_ccb->eata_ccb.cp_statDMA = htonl(dpt->sp_physaddr);
380 htonl(dptccbvtop(dpt, next_ccb)
382 next_ccb->eata_ccb.cp_busaddr = dpt->dpt_ccb_busend;
384 next_ccb->tag = dpt->total_dccbs;
385 SLIST_INSERT_HEAD(&dpt->free_dccb_list, next_ccb, links);
386 segs += dpt->sgsize;
387 physaddr += (dpt->sgsize * sizeof(dpt_sg_t));
388 dpt->dpt_ccb_busend += sizeof(*next_ccb);
390 dpt->total_dccbs++;
415 printf("dpt: unable to allocate dpt_conf_t\n");
430 printf("dpt: timeout waiting for controller to become ready\n");
435 printf("dpt: timetout waiting for adapter ready.\n");
452 printf("dpt: timeout in data read.\n");
462 printf("dpt: error reading configuration data.\n");
489 dpt_get_conf(dpt_softc_t *dpt, dpt_ccb_t *dccb, u_int32_t dccb_busaddr,
499 mtx_assert(&dpt->lock, MA_OWNED);
501 bzero((void *)(uintptr_t)(volatile void *)dpt->sp, sizeof(*dpt->sp));
527 while (((status = dpt_inb(dpt, HA_RSTATUS)) != (HA_SREADY | HA_SSC)
530 || (dpt_wait(dpt, HA_SBUSY, 0))) {
536 if (dpt_raid_busy(dpt)) {
537 device_printf(dpt->dev,
543 DptStat_Reset_BUSY(dpt->sp);
550 if ((result = dpt_send_eata_command(dpt, cp, dccb_busaddr,
553 device_printf(dpt->dev,
562 && !((status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ);
568 status = dpt_inb(dpt, HA_RSTATUS);
575 && (dpt->sp->hba_stat == 0)
576 && (dpt->sp->scsi_stat == 0)
577 && (dpt->sp->residue_len == 0))
580 if (dpt->sp->scsi_stat == SCSI_STATUS_CHECK_COND)
588 dpt_detect_cache(dpt_softc_t *dpt, dpt_ccb_t *dccb, u_int32_t dccb_busaddr,
598 mtx_assert(&dpt->lock, MA_OWNED);
604 dpt->cache_type = DPT_CACHE_WRITEBACK;
605 dpt->cache_size = 0;
608 bzero((void *)(uintptr_t)(volatile void *)dpt->sp, sizeof(dpt->sp));
641 result = dpt_send_eata_command(dpt, cp, dccb_busaddr,
645 device_printf(dpt->dev,
653 !((status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ);
659 status = dpt_inb(dpt, HA_RSTATUS);
674 device_printf(dpt->dev, "NOTICE: Log Page (1) layout error\n");
678 dpt->cache_type = DPT_NO_CACHE;
693 dpt->cache_type = DPT_NO_CACHE;
698 dpt->cache_type = DPT_CACHE_WRITETHROUGH;
703 dpt->cache_size = param[5]
721 struct dpt_softc *dpt;
725 dpt = (struct dpt_softc *)ccb->ccb_h.ccb_dpt_ptr;
727 mtx_assert(&dpt->lock, MA_OWNED);
731 device_printf(dpt->dev,
738 dptfreeccb(dpt, dccb);
774 bus_dmamap_sync(dpt->buffer_dmat, dccb->dmamap, op);
787 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
788 dptfreeccb(dpt, dccb);
795 LIST_INSERT_HEAD(&dpt->pending_ccb_list, &ccb->ccb_h, sim_links.le);
798 if (dpt_send_eata_command(dpt, &dccb->eata_ccb,
803 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
804 dptfreeccb(dpt, dccb);
812 struct dpt_softc *dpt;
816 dpt = (struct dpt_softc *)cam_sim_softc(sim);
817 mtx_assert(&dpt->lock, MA_OWNED);
819 if ((dpt->state & DPT_HA_SHUTDOWN_ACTIVE) != 0) {
844 if ((dccb = dptgetccb(dpt)) == NULL) {
845 dpt->resource_shortage = 1;
856 ccb->ccb_h.ccb_dpt_ptr = dpt;
869 ccb->ccb_h.target_id == dpt->hostid[cam_sim_bus(sim)]
899 dptfreeccb(dpt, dccb);
915 error = bus_dmamap_load_ccb(dpt->buffer_dmat,
972 spi->bus_width = (dpt->max_id > 7)
1021 if (dpt->max_id > 7)
1026 cpi->max_target = dpt->max_id;
1027 cpi->max_lun = dpt->max_lun;
1028 cpi->initiator_id = dpt->hostid[cam_sim_bus(sim)];
1056 dpt_send_eata_command(dpt_softc_t *dpt, eata_ccb_t *cmd_block,
1072 if ((dpt_inb(dpt, HA_RAUXSTAT) & HA_ABUSY) == 0)
1080 if (loop > dpt->performance.max_eata_tries)
1081 dpt->performance.max_eata_tries = loop;
1083 if (loop < dpt->performance.min_eata_tries)
1084 dpt->performance.min_eata_tries = loop;
1088 ++dpt->performance.command_too_busy;
1095 dpt->last_contact = microtime_now;
1109 dpt_outl(dpt, HA_WDMAADDR, cmd_busaddr);
1113 dpt_outb(dpt, HA_WCODE2, code2);
1114 dpt_outb(dpt, HA_WCODE, code);
1116 dpt_outb(dpt, HA_WIFC, ifc);
1118 dpt_outb(dpt, HA_WCOMMAND, command);
1128 dpt_softc_t *dpt = device_get_softc(dev);
1131 mtx_init(&dpt->lock, "dpt", NULL, MTX_DEF);
1132 SLIST_INIT(&dpt->free_dccb_list);
1133 LIST_INIT(&dpt->pending_ccb_list);
1135 dpt->resetlevel[i] = DPT_HA_OK;
1138 dpt_reset_performance(dpt);
1144 dpt_free(struct dpt_softc *dpt)
1146 switch (dpt->init_level) {
1149 bus_dmamap_unload(dpt->dccb_dmat, dpt->dccb_dmamap);
1151 bus_dmamem_free(dpt->dccb_dmat, dpt->dpt_dccbs,
1152 dpt->dccb_dmamap);
1153 bus_dmamap_destroy(dpt->dccb_dmat, dpt->dccb_dmamap);
1155 bus_dma_tag_destroy(dpt->dccb_dmat);
1157 bus_dma_tag_destroy(dpt->buffer_dmat);
1162 while ((sg_map = SLIST_FIRST(&dpt->sg_maps)) != NULL) {
1163 SLIST_REMOVE_HEAD(&dpt->sg_maps, links);
1164 bus_dmamap_unload(dpt->sg_dmat,
1166 bus_dmamem_free(dpt->sg_dmat, sg_map->sg_vaddr,
1170 bus_dma_tag_destroy(dpt->sg_dmat);
1175 mtx_destroy(&dpt->lock);
1181 dpt_softc_t * dpt;
1184 dpt = device_get_softc(dev);
1186 dpt->io_res = bus_alloc_resource_any(dev, dpt->io_type, &dpt->io_rid,
1188 if (dpt->io_res == NULL) {
1194 dpt->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &dpt->irq_rid,
1196 if (dpt->irq_res == NULL) {
1211 struct dpt_softc * dpt;
1213 dpt = device_get_softc(dev);
1215 if (dpt->ih)
1216 bus_teardown_intr(dev, dpt->irq_res, dpt->ih);
1217 if (dpt->io_res)
1218 bus_release_resource(dev, dpt->io_type, dpt->io_rid, dpt->io_res);
1219 if (dpt->irq_res)
1220 bus_release_resource(dev, SYS_RES_IRQ, dpt->irq_rid, dpt->irq_res);
1221 if (dpt->drq_res)
1222 bus_release_resource(dev, SYS_RES_DRQ, dpt->drq_rid, dpt->drq_res);
1236 dpt_init(struct dpt_softc *dpt)
1246 dpt->init_level = 0;
1247 SLIST_INIT(&dpt->sg_maps);
1248 mtx_lock(&dpt->lock);
1251 device_printf(dpt->dev, "resetting HBA\n");
1252 dpt_outb(dpt, HA_WCOMMAND, EATA_CMD_RESET);
1257 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1270 &dpt->sg_dmat) != 0) {
1274 dpt->init_level++;
1284 sg_map = dptallocsgmap(dpt);
1288 dpt->sp = (volatile dpt_sp_t *)sg_map->sg_vaddr;
1289 dccb = (struct dpt_ccb *)(uintptr_t)(volatile void *)&dpt->sp[1];
1291 dpt->sp_physaddr = sg_map->sg_physaddr;
1295 dccb->eata_ccb.cp_statDMA = htonl(dpt->sp_physaddr);
1296 dccb->eata_ccb.cp_reqDMA = htonl(dpt->sp_physaddr + sizeof(*dccb)
1301 retval = dpt_get_conf(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1305 device_printf(dpt->dev, "Failed to get board configuration\n");
1310 bzero(&dccb[1], sizeof(dpt->board_data));
1311 retval = dpt_get_conf(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1312 sizeof(dpt->board_data), 0, conf.scsi_id0, 0);
1314 device_printf(dpt->dev, "Failed to get inquiry information\n");
1317 bcopy(&dccb[1], &dpt->board_data, sizeof(dpt->board_data));
1319 dpt_detect_cache(dpt, dccb, sg_map->sg_physaddr + sizeof(dpt_sp_t),
1324 dpt->EATA_revision = 'a';
1327 dpt->EATA_revision = 'b';
1330 dpt->EATA_revision = 'c';
1333 dpt->EATA_revision = 'z';
1336 dpt->EATA_revision = '?';
1339 dpt->max_id = conf.MAX_ID;
1340 dpt->max_lun = conf.MAX_LUN;
1341 dpt->irq = conf.IRQ;
1342 dpt->dma_channel = (8 - conf.DMA_channel) & 7;
1343 dpt->channels = conf.MAX_CHAN + 1;
1344 dpt->state |= DPT_HA_OK;
1346 dpt->primary = FALSE;
1348 dpt->primary = TRUE;
1350 dpt->more_support = conf.MORE_support;
1352 if (strncmp(dpt->board_data.firmware, "07G0", 4) >= 0)
1353 dpt->immediate_support = 1;
1355 dpt->immediate_support = 0;
1357 dpt->broken_INQUIRY = FALSE;
1359 dpt->cplen = ntohl(conf.cplen);
1360 dpt->cppadlen = ntohs(conf.cppadlen);
1361 dpt->max_dccbs = ntohs(conf.queuesiz);
1363 if (dpt->max_dccbs > 256) {
1364 device_printf(dpt->dev, "Max CCBs reduced from %d to "
1365 "256 due to tag algorithm\n", dpt->max_dccbs);
1366 dpt->max_dccbs = 256;
1369 dpt->hostid[0] = conf.scsi_id0;
1370 dpt->hostid[1] = conf.scsi_id1;
1371 dpt->hostid[2] = conf.scsi_id2;
1374 dpt->sgsize = 8192;
1376 dpt->sgsize = ntohs(conf.SGsiz);
1379 if (dpt->sgsize < 17 || dpt->sgsize > 32)
1380 dpt->sgsize = 32;
1382 if (dpt->sgsize > dpt_max_segs)
1383 dpt->sgsize = dpt_max_segs;
1386 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1394 /* nsegments */ dpt->sgsize,
1398 /* lockarg */ &dpt->lock,
1399 &dpt->buffer_dmat) != 0) {
1400 device_printf(dpt->dev,
1401 "bus_dma_tag_create(...,dpt->buffer_dmat) failed\n");
1405 dpt->init_level++;
1408 if (bus_dma_tag_create( /* parent */ dpt->parent_dmat,
1415 /* maxsize */ (dpt->max_dccbs *
1423 &dpt->dccb_dmat) != 0) {
1424 device_printf(dpt->dev,
1425 "bus_dma_tag_create(...,dpt->dccb_dmat) failed\n");
1429 dpt->init_level++;
1432 if (bus_dmamem_alloc(dpt->dccb_dmat, (void **)&dpt->dpt_dccbs,
1433 BUS_DMA_NOWAIT, &dpt->dccb_dmamap) != 0) {
1434 device_printf(dpt->dev,
1435 "bus_dmamem_alloc(dpt->dccb_dmat,...) failed\n");
1439 dpt->init_level++;
1442 bus_dmamap_load(dpt->dccb_dmat, dpt->dccb_dmamap,
1443 dpt->dpt_dccbs,
1444 (dpt->max_dccbs * sizeof(struct dpt_ccb))
1446 dptmapmem, &dpt->dpt_ccb_busbase, /*flags*/0);
1449 bzero(dpt->dpt_dccbs,
1450 (dpt->max_dccbs * sizeof(struct dpt_ccb)) + sizeof(dpt_sp_t));
1452 dpt->dpt_ccb_busend = dpt->dpt_ccb_busbase;
1454 dpt->sp = (dpt_sp_t*)&dpt->dpt_dccbs[dpt->max_dccbs];
1455 dpt->sp_physaddr = dpt->dpt_ccb_busbase
1456 + (dpt->max_dccbs * sizeof(dpt_ccb_t));
1457 dpt->init_level++;
1460 if (dptallocccbs(dpt) == 0) {
1461 device_printf(dpt->dev, "dptallocccbs(dpt) == 0\n");
1462 mtx_unlock(&dpt->lock);
1467 dpt->target_mode_enabled = 1;
1470 strp = dpt->board_data.vendor;
1478 device_printf(dpt->dev, "%.8s %.16s FW Rev. %.4s, ",
1479 dpt->board_data.vendor,
1480 dpt->board_data.modelNum, dpt->board_data.firmware);
1482 printf("%d channel%s, ", dpt->channels, dpt->channels > 1 ? "s" : "");
1484 if (dpt->cache_type != DPT_NO_CACHE
1485 && dpt->cache_size != 0) {
1487 dpt->cache_type == DPT_CACHE_WRITETHROUGH
1491 printf("%d CCBs\n", dpt->max_dccbs);
1492 mtx_unlock(&dpt->lock);
1496 mtx_unlock(&dpt->lock);
1501 dpt_attach(dpt_softc_t *dpt)
1509 devq = cam_simq_alloc(dpt->max_dccbs);
1513 mtx_lock(&dpt->lock);
1514 for (i = 0; i < dpt->channels; i++) {
1518 dpt->sims[i] = cam_sim_alloc(dpt_action, dpt_poll, "dpt",
1519 dpt, device_get_unit(dpt->dev), &dpt->lock,
1521 /*tagged*/dpt->max_dccbs, devq);
1522 if (dpt->sims[i] == NULL) {
1532 if (xpt_bus_register(dpt->sims[i], dpt->dev, i) != CAM_SUCCESS){
1533 cam_sim_free(dpt->sims[i], /*free_devq*/i == 0);
1534 dpt->sims[i] = NULL;
1538 if (xpt_create_path(&dpt->paths[i], /*periph*/NULL,
1539 cam_sim_path(dpt->sims[i]),
1542 xpt_bus_deregister(cam_sim_path(dpt->sims[i]));
1543 cam_sim_free(dpt->sims[i], /*free_devq*/i == 0);
1544 dpt->sims[i] = NULL;
1549 mtx_unlock(&dpt->lock);
1552 dpt, SHUTDOWN_PRI_DEFAULT);
1559 struct dpt_softc * dpt;
1562 dpt = device_get_softc(dev);
1564 mtx_lock(&dpt->lock);
1565 for (i = 0; i < dpt->channels; i++) {
1567 xpt_async(AC_LOST_DEVICE, dpt->paths[i], NULL);
1569 xpt_free_path(dpt->paths[i]);
1570 xpt_bus_deregister(cam_sim_path(dpt->sims[i]));
1571 cam_sim_free(dpt->sims[i], /*free_devq*/TRUE);
1573 mtx_unlock(&dpt->lock);
1575 dptshutdown((void *)dpt, SHUTDOWN_PRI_DEFAULT);
1579 dpt_free(dpt);
1590 dpt_softc_t *dpt;
1592 dpt = arg;
1593 mtx_lock(&dpt->lock);
1594 dpt_intr_locked(dpt);
1595 mtx_unlock(&dpt->lock);
1599 dpt_intr_locked(dpt_softc_t *dpt)
1610 while (((aux_status = dpt_inb(dpt, HA_RAUXSTAT)) & HA_AIRQ) != 0) {
1617 if (dpt->sp->ccb_busaddr < dpt->dpt_ccb_busbase
1618 || dpt->sp->ccb_busaddr >= dpt->dpt_ccb_busend) {
1619 device_printf(dpt->dev,
1621 status = dpt_inb(dpt, HA_RSTATUS);
1625 dccb = dptccbptov(dpt, dpt->sp->ccb_busaddr);
1627 dpt->sp->ccb_busaddr = ~0;
1630 if (dpt->sp->EOC == 0) {
1631 device_printf(dpt->dev,
1640 status = dpt_inb(dpt, HA_RSTATUS);
1643 dpt->sp->EOC = 0;
1651 hba_stat = dpt->sp->hba_stat;
1652 scsi_stat = dpt->sp->scsi_stat;
1653 residue_len = dpt->sp->residue_len;
1656 if ((status = dpt_inb(dpt, HA_RSTATUS)) & HA_SERROR) {
1663 if (dpt_just_reset(dpt)) {
1664 device_printf(dpt->dev, "HBA rebooted.\n"
1668 device_printf(dpt->dev,
1685 bus_dmamap_sync(dpt->buffer_dmat, dccb->dmamap, op);
1686 bus_dmamap_unload(dpt->buffer_dmat, dccb->dmamap);
1709 dptfreeccb(dpt, dccb);
1712 dptprocesserror(dpt, dccb, ccb, hba_stat, scsi_stat,
1719 dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb, union ccb *ccb,
1771 device_printf(dpt->dev, "Undocumented Error %x\n", hba_stat);
1776 dptfreeccb(dpt, dccb);
1785 struct dpt_softc *dpt;
1789 dpt = (struct dpt_softc *)ccb->ccb_h.ccb_dpt_ptr;
1790 mtx_assert(&dpt->lock, MA_OWNED);
1800 dpt_intr_locked(dpt);
1810 dpt_send_immediate(dpt, &dccb->eata_ccb, dccb->eata_ccb.cp_busaddr,
1822 dpt_softc_t *dpt;
1824 dpt = (dpt_softc_t *)arg;
1826 device_printf(dpt->dev,
1832 mtx_lock(&dpt->lock);
1833 dpt_send_immediate(dpt, NULL, 0, EATA_POWER_OFF_WARN, 0, 0, 0);
1834 mtx_unlock(&dpt->lock);
1836 device_printf(dpt->dev, "Controller was warned of shutdown and is now "
1853 dpt_reset_hba(dpt_softc_t *dpt)
1860 mtx_assert(&dpt->lock, MA_OWNED);
1887 while (dpt->queue_status & DPT_SUBMITTED_QUEUE_ACTIVE) {
1891 dpt->queue_status |= DPT_SUBMITTED_QUEUE_ACTIVE;
1894 if ((result = dpt_send_eata_command(dpt, &dccb.eata_ccb,
1896 device_printf(dpt->dev, "Failed to send the RESET message.\n"
1900 if ((result = dpt_send_eata_command(dpt, &dccb.eata_ccb,
1904 device_get_nameunit(dpt->dev));
1907 dpt->performance.cold_boots++;
1912 dpt->performance.warm_starts++;
1915 device_printf(dpt->dev,
1918 while ((dccbp = TAILQ_FIRST(&dpt->completed_ccbs)) != NULL) {
1929 dpt_Qremove_submitted(dpt, dccbp);
1933 (dccbp->std_callback)(dpt, dccbp->eata_ccb.cp_channel,
1936 dpt_Qpush_free(dpt, dccbp);
1940 device_printf(dpt->dev, "reset done aborting all pending commands\n");
1941 dpt->queue_status &= ~DPT_SUBMITTED_QUEUE_ACTIVE;
1957 dpt_target_ccb(dpt_softc_t * dpt, int bus, u_int8_t target, u_int8_t lun,
1963 mtx_assert(&dpt->lock, MA_OWNED);
1965 device_printf(dpt->dev,
2009 if (dpt_scatter_gather(dpt, ccb, DPT_RW_BUFFER_SIZE,
2010 dpt->rw_buffer[bus][target][lun])) {
2011 device_printf(dpt->dev, "Failed to setup Scatter/Gather for "
2019 dpt_set_target(int redo, dpt_softc_t * dpt,
2024 mtx_assert(&dpt->lock, MA_OWNED);
2025 if (dpt->target_mode_enabled) {
2027 dpt_target_ccb(dpt, bus, target, lun, ccb, mode,
2030 ccb->transaction_id = ++dpt->commands_processed;
2033 dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd]++;
2036 dpt_Qadd_waiting(dpt, ccb);
2037 dpt_sched_queue(dpt);
2039 device_printf(dpt->dev,
2058 dpt_softc_t *dpt;
2062 dpt = devclass_get_device(dpt_devclass, unit);
2063 if (dpt == NULL)
2066 mtx_lock(&dpt->lock);
2067 if (dpt->target_mode_enabled) {
2068 if ((channel >= dpt->channels) || (target > dpt->max_id) ||
2069 (lun > dpt->max_lun)) {
2070 mtx_unlock(&dpt->lock);
2073 if ((dpt->rw_buffer[channel][target][lun] == NULL) ||
2074 (dpt->buffer_receiver[channel][target][lun] == NULL)) {
2075 mtx_unlock(&dpt->lock);
2080 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
2081 device_printf(dpt->dev,
2084 mtx_unlock(&dpt->lock);
2088 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
2089 mtx_unlock(&dpt->lock);
2091 device_get_nameunit(dpt->dev));
2094 bcopy(dpt->rw_buffer[channel][target][lun] + offset, data, length);
2095 dpt_target_ccb(dpt, channel, target, lun, ccb, mode,
2100 ccb->transaction_id = ++dpt->commands_processed;
2103 dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd]++;
2106 dpt_Qadd_waiting(dpt, ccb);
2107 dpt_sched_queue(dpt);
2109 mtx_unlock(&dpt->lock);
2112 mtx_unlock(&dpt->lock);
2117 dpt_target_done(dpt_softc_t * dpt, int bus, dpt_ccb_t * ccb)
2128 dpt_Qremove_completed(dpt, ccb);
2134 #define read_buffer_callback (dpt->buffer_receiver br_index )
2135 #define read_buffer (dpt->rw_buffer[br_channel][br_target][br_lun])
2145 read_buffer_callback(device_get_unit(dpt->dev),
2162 (ccb->wrbuff_callback) (device_get_unit(dpt->dev), br_channel,
2167 device_printf(dpt->dev,
2171 dpt->target_ccb[br_channel][br_target][br_lun] = NULL;
2172 dpt_Qpush_free(dpt, ccb);
2186 dpt_softc_t *dpt;
2190 dpt = devclass_get_device(dpt_devclass, unit);
2191 if (dpt == NULL)
2193 mtx_lock(&dpt->lock);
2195 if (dpt->state & DPT_HA_SHUTDOWN_ACTIVE) {
2196 mtx_unlock(&dpt->lock);
2200 if ((channel > (dpt->channels - 1)) || (target > (dpt->max_id - 1)) ||
2201 (lun > (dpt->max_lun - 1))) {
2202 mtx_unlock(&dpt->lock);
2206 if (dpt->buffer_receiver[channel][target][lun] == NULL) {
2209 dpt->buffer_receiver[channel][target][lun] = callback;
2213 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
2214 device_printf(dpt->dev,
2217 mtx_unlock(&dpt->lock);
2221 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
2222 mtx_unlock(&dpt->lock);
2224 device_get_nameunit(dpt->dev));
2229 dpt->target_ccb[channel][target][lun] = ccb;
2231 dpt->rw_buffer[channel][target][lun] =
2233 if (dpt->rw_buffer[channel][target][lun] == NULL) {
2234 device_printf(dpt->dev, "Failed to allocate "
2236 dpt_Qpush_free(dpt, ccb);
2237 mtx_unlock(&dpt->lock);
2240 dpt_set_target(0, dpt, channel, target, lun, mode,
2242 mtx_unlock(&dpt->lock);
2245 mtx_unlock(&dpt->lock);
2250 if (dpt->buffer_receiver[channel][target][lun] == callback) {
2251 mtx_unlock(&dpt->lock);
2254 mtx_unlock(&dpt->lock);
2258 if (dpt->buffer_receiver[channel][target][lun] == callback) {
2259 dpt->buffer_receiver[channel][target][lun] = NULL;
2260 dpt_Qpush_free(dpt, ccb);
2261 free(dpt->rw_buffer[channel][target][lun], M_DEVBUF);
2262 mtx_unlock(&dpt->lock);
2265 mtx_unlock(&dpt->lock);
2271 mtx_unlock(&dpt->lock);
2276 dpt_blinking_led(dpt_softc_t * dpt)
2283 mtx_assert(&dpt->lock, MA_OWNED);
2290 state = dpt_inl(dpt, 1);
2294 result = dpt_inb(dpt, 5);
2305 dpt_user_cmd(dpt_softc_t * dpt, eata_pt_t * user_cmd,
2315 mtx_assert(&dpt->lock, MA_OWNED);
2321 if ((channel > (dpt->channels - 1))
2322 || (target > dpt->max_id)
2323 || (lun > dpt->max_lun))
2326 if (target == dpt->sc_scsi_link[channel].adapter_targ) {
2338 if ((TAILQ_EMPTY(&dpt->free_ccbs)) && dpt_alloc_freelist(dpt)) {
2339 device_printf(dpt->dev,
2345 if ((ccb = dpt_Qpop_free(dpt)) == NULL) {
2347 device_get_nameunit(dpt->dev));
2381 device_printf(dpt->dev, "Cannot allocate %d bytes "
2402 if (dpt_scatter_gather(dpt, ccb, ccb->eata_ccb.cp_datalen,
2418 dpt->state |= DPT_HA_QUIET;
2420 while ((submitted = dpt->submitted_ccbs_count) != 0) {
2421 huh = mtx_sleep((void *) dpt, &dpt->lock,
2439 dpt->state &= ~DPT_HA_QUIET;
2449 ccb->transaction_id = ++dpt->commands_processed;
2455 ++dpt->performance.command_count[ccb->eata_ccb.cp_scsi_cmd];
2458 dpt_Qadd_waiting(dpt, ccb);
2460 dpt_sched_queue(dpt);
2463 (void) mtx_sleep((void *) ccb, &dpt->lock, PCATCH | PRIBIO, "dptucw",
2474 dpt_user_cmd_done(dpt_softc_t * dpt, int bus, dpt_ccb_t * ccb)
2479 mtx_unlock(&dpt->lock);
2489 mtx_lock(&dpt->lock);
2491 dpt_Qpush_free(dpt, ccb);
2500 mtx_lock(&dpt->lock);
2501 dpt_Qpush_free(dpt, ccb);
2513 mtx_lock(&dpt->lock);
2514 dpt_Qpush_free(dpt, ccb);
2519 mtx_lock(&dpt->lock);
2522 dpt_Qpush_free(dpt, ccb);
2551 dpt_handle_timeouts(dpt_softc_t * dpt)
2555 if (dpt->state & DPT_HA_TIMEOUTS_ACTIVE) {
2556 device_printf(dpt->dev, "WARNING: Timeout Handling Collision\n");
2559 dpt->state |= DPT_HA_TIMEOUTS_ACTIVE;
2562 TAILQ_FIRST(ccb, &&dpt->submitted_ccbs, links) {
2574 max_age = (((xs->timeout * (dpt->submitted_ccbs_count
2577 ? (xs->timeout * (dpt->submitted_ccbs_count
2589 dpt_Qremove_submitted(dpt, ccb);
2594 device_printf(dpt->dev,
2601 device_get_unit(dpt->dev),
2608 (void) dpt_send_immediate(dpt,
2612 dpt_Qpush_free(dpt, ccb);
2619 device_printf(dpt->dev,
2626 device_get_unit(dpt->dev),
2632 dpt_Qpush_waiting(dpt, ccb);
2633 dpt_sched_queue(dpt);
2646 device_printf(dpt->dev,
2652 device_get_unit(dpt->dev),
2661 dpt->state &= ~DPT_HA_TIMEOUTS_ACTIVE;
2667 dpt_softc_t *dpt = (dpt_softc_t *) arg;
2669 mtx_assert(&dpt->lock, MA_OWNED);
2670 if (!(dpt->state & DPT_HA_TIMEOUTS_ACTIVE))
2671 dpt_handle_timeouts(dpt);
2673 callout_reset(&dpt->timer, hz * 10, dpt_timeout, dpt);