Lines Matching defs:gccb

157 static int      gdt_internal_cmd(struct gdt_softc *gdt, struct gdt_ccb *gccb, 
166 u_int8_t index, struct gdt_ccb *gccb);
186 struct gdt_ccb *gccb;
263 gccb = &gdt->sc_gccbs[i];
264 gccb->gc_cmd_index = i + 2;
265 gccb->gc_flags = GDT_GCF_UNUSED;
266 gccb->gc_map_flag = FALSE;
268 &gccb->gc_dmamap) != 0)
270 gccb->gc_map_flag = TRUE;
271 gccb->gc_scratch = &gdt->sc_gcscratch[GDT_SCRATCH_SZ * i];
272 gccb->gc_scratch_busbase = gdt->sc_gcscratch_busbase + GDT_SCRATCH_SZ * i;
273 callout_init_mtx(&gccb->gc_timeout, &gdt->sc_lock, 0);
274 SLIST_INSERT_HEAD(&gdt->sc_free_gccb, gccb, sle);
283 gccb = gdt_get_ccb(gdt);
284 if (gccb == NULL) {
289 bzero(gccb->gc_cmd, GDT_CMD_SZ);
291 if (!gdt_internal_cmd(gdt, gccb, GDT_SCREENSERVICE, GDT_INIT,
295 gdt_free_ccb(gdt, gccb);
300 gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_UNFREEZE_IO,
303 if (!gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_INIT,
307 gdt_free_ccb(gdt, gccb);
315 gdt_enc32(gccb->gc_scratch + GDT_IOC_VERSION, GDT_IOC_NEWEST);
316 gccb->gc_scratch[GDT_IOC_LIST_ENTRIES] = GDT_MAXBUS;
317 gccb->gc_scratch[GDT_IOC_FIRST_CHAN] = 0;
318 gccb->gc_scratch[GDT_IOC_LAST_CHAN] = GDT_MAXBUS - 1;
319 gdt_enc32(gccb->gc_scratch + GDT_IOC_LIST_OFFSET, GDT_IOC_HDR_SZ);
320 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_IOCTL,
323 gdt->sc_bus_cnt = gccb->gc_scratch[GDT_IOC_CHAN_COUNT];
325 id = gccb->gc_scratch[GDT_IOC_HDR_SZ +
332 gdt_enc32(gccb->gc_scratch + GDT_GETCH_CHANNEL_NO, i);
333 if (!gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_IOCTL,
340 gdt_free_ccb(gdt, gccb);
347 (gccb->gc_scratch[GDT_GETCH_SIOP_ID] < GDT_MAXID_FC) ?
348 gccb->gc_scratch[GDT_GETCH_SIOP_ID] : 0xff;
356 if (!gdt_internal_cmd(gdt, gccb, GDT_SCSIRAWSERVICE, GDT_INIT,
360 gdt_free_ccb(gdt, gccb);
367 if (gdt_internal_cmd(gdt, gccb, GDT_SCSIRAWSERVICE, GDT_SET_FEAT,
369 if (gdt_internal_cmd(gdt, gccb, GDT_SCSIRAWSERVICE, GDT_GET_FEAT,
376 gdt_free_ccb(gdt, gccb);
385 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_SET_FEAT,
387 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_GET_FEAT,
394 gdt_free_ccb(gdt, gccb);
402 gdt_enc32(gccb->gc_scratch + GDT_OEM_VERSION, 0x01);
403 gdt_enc32(gccb->gc_scratch + GDT_OEM_BUFSIZE, sizeof(gdt_oem_record_t));
404 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_IOCTL,
408 gccb->gc_scratch)->text.scsi_host_drive_inquiry_vendor_id, 7);
420 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE, GDT_INFO,
443 if (gdt_internal_cmd(gdt, gccb, GDT_CACHESERVICE,
453 gdt_free_ccb(gdt, gccb);
563 gdt_wait(struct gdt_softc *gdt, struct gdt_ccb *gccb,
569 ("gdt_wait(%p, %p, %d)\n", gdt, gccb, timeout));
573 if (iir_intr_locked(gdt) == gccb->gc_cmd_index) {
588 gdt_internal_cmd(struct gdt_softc *gdt, struct gdt_ccb *gccb,
597 bzero(gccb->gc_cmd, GDT_CMD_SZ);
600 gccb->gc_service = service;
601 gccb->gc_flags = GDT_GCF_INTERNAL;
603 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
604 gccb->gc_cmd_index);
605 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, opcode);
610 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION +
612 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION +
614 gdt_enc16(gccb->gc_cmd + GDT_CMD_UNION +
616 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_IOCTL_P_PARAM,
617 gccb->gc_scratch_busbase);
619 gdt_enc16(gccb->gc_cmd + GDT_CMD_UNION +
621 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION +
627 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION +
629 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_BUS] =
631 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_TARGET] =
633 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_LUN] =
638 gccb->gc_cmd_len = GDT_CMD_SZ;
641 gdt->sc_copy_cmd(gdt, gccb);
644 if (!gdt_wait(gdt, gccb, GDT_POLL_TIMEOUT))
656 struct gdt_ccb *gccb;
661 gccb = SLIST_FIRST(&gdt->sc_free_gccb);
662 if (gccb != NULL) {
664 SLIST_INSERT_HEAD(&gdt->sc_pending_gccb, gccb, sle);
669 return (gccb);
673 gdt_free_ccb(struct gdt_softc *gdt, struct gdt_ccb *gccb)
676 GDT_DPRINTF(GDT_D_QUEUE, ("gdt_free_ccb(%p, %p)\n", gdt, gccb));
679 gccb->gc_flags = GDT_GCF_UNUSED;
680 SLIST_REMOVE(&gdt->sc_pending_gccb, gccb, gdt_ccb, sle);
681 SLIST_INSERT_HEAD(&gdt->sc_free_gccb, gccb, sle);
684 wakeup(gccb);
698 struct gdt_ccb *gccb = NULL;
724 if ((gccb = gdt_ioctl_cmd(gdt, ucmd)) == NULL) {
755 if ((gccb = gdt_raw_cmd(gdt, ccb)) == NULL) {
772 if ((gccb = gdt_cache_cmd(gdt, ccb)) == NULL) {
791 gdt_wait(gdt, gccb, GDT_POLL_TIMEOUT);
798 struct gdt_ccb *gccb;
812 gccb = gdt_get_ccb(gdt);
813 if (gccb == NULL) {
816 return (gccb);
818 bzero(gccb->gc_cmd, GDT_CMD_SZ);
820 gccb->gc_ccb = ccb;
821 gccb->gc_service = GDT_SCSIRAWSERVICE;
822 gccb->gc_flags = GDT_GCF_SCSI;
826 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
827 gccb->gc_cmd_index);
828 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, GDT_WRITE);
830 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_DIRECTION,
833 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SDLEN,
835 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_CLEN,
837 bcopy(ccb->csio.cdb_io.cdb_bytes, gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_CMD,
839 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_TARGET] =
841 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_LUN] =
843 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_BUS] =
845 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SENSE_LEN,
847 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SENSE_DATA,
848 gccb->gc_scratch_busbase);
851 gccb->gc_dmamap,
854 gccb, /*flags*/0);
857 gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
860 return (gccb);
866 struct gdt_ccb *gccb;
883 gccb = gdt_get_ccb(gdt);
884 if (gccb == NULL) {
887 return (gccb);
889 bzero(gccb->gc_cmd, GDT_CMD_SZ);
891 gccb->gc_ccb = ccb;
892 gccb->gc_service = GDT_CACHESERVICE;
893 gccb->gc_flags = GDT_GCF_SCSI;
897 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
898 gccb->gc_cmd_index);
903 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, opcode);
905 gdt_enc16(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_DEVICENO,
916 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_BLOCKNO,
918 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_BLOCKCNT,
922 gccb->gc_dmamap,
925 gccb, /*flags*/0);
928 gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
930 return (gccb);
936 struct gdt_ccb *gccb;
941 gccb = gdt_get_ccb(gdt);
942 if (gccb == NULL) {
945 return (gccb);
947 bzero(gccb->gc_cmd, GDT_CMD_SZ);
948 gccb->gc_ucmd = ucmd;
949 gccb->gc_service = ucmd->service;
950 gccb->gc_flags = GDT_GCF_IOCTL;
955 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_IOCTL_SZ,
961 gdt_free_ccb(gdt, gccb);
965 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_CACHE_SG_LST +
971 gdt_free_ccb(gdt, gccb);
976 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_RAW_SG_LST +
982 gdt_free_ccb(gdt, gccb);
987 bcopy(ucmd->data, gccb->gc_scratch, cnt);
989 if (gdt->sc_cmd_off + gccb->gc_cmd_len + GDT_DPMEM_COMMAND_OFFSET >
993 gdt_free_ccb(gdt, gccb);
1001 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
1002 gccb->gc_cmd_index);
1003 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE,
1009 gdt_enc16(gccb->gc_cmd + GDT_CMD_UNION + GDT_IOCTL_PARAM_SIZE,
1011 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_IOCTL_SUBFUNC,
1013 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_IOCTL_CHANNEL,
1015 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_IOCTL_P_PARAM,
1016 gccb->gc_scratch_busbase);
1019 gdt_enc16(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_DEVICENO,
1021 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_BLOCKNO,
1023 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_BLOCKCNT,
1025 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_DESTADDR,
1027 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_CANZ,
1029 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_LST +
1030 GDT_SG_PTR, gccb->gc_scratch_busbase);
1031 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_LST +
1036 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_DIRECTION,
1038 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SDATA,
1040 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SDLEN,
1042 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_CLEN,
1044 bcopy(ucmd->u.raw.cmd, gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_CMD,
1046 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_TARGET] =
1048 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_LUN] =
1050 gccb->gc_cmd[GDT_CMD_UNION + GDT_RAW_BUS] =
1052 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SENSE_LEN,
1054 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SENSE_DATA,
1055 gccb->gc_scratch_busbase + ucmd->u.raw.sdlen);
1056 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_RANZ,
1058 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_LST +
1059 GDT_SG_PTR, gccb->gc_scratch_busbase);
1060 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_LST +
1065 gdt->sc_copy_cmd(gdt, gccb);
1066 return (gccb);
1177 struct gdt_ccb *gccb;
1182 gccb = (struct gdt_ccb *)arg;
1183 ccb = gccb->gc_ccb;
1188 gdt, gccb, dm_segs, nseg, error));
1194 if (gccb->gc_service == GDT_CACHESERVICE) {
1196 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_LST +
1198 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_LST +
1202 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_SG_CANZ,
1204 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_DESTADDR,
1207 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_CACHE_SG_LST +
1211 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_LST +
1213 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_LST +
1217 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SG_RANZ,
1219 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SDATA,
1222 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_RAW_SG_LST +
1227 bus_dmamap_sync(gdt->sc_buffer_dmat, gccb->gc_dmamap,
1238 callout_reset_sbt(&gccb->gc_timeout, SBT_1MS * ccb->ccb_h.timeout, 0,
1239 iir_timeout, (caddr_t)gccb, 0);
1241 gdt->sc_copy_cmd(gdt, gccb);
1407 GDT_DPRINTF(GDT_D_TIMEOUT, ("iir_timeout(%p)\n", gccb));
1414 struct gdt_ccb *gccb;
1437 if ((gccb = SLIST_FIRST(&gdt->sc_pending_gccb)) != NULL)
1438 mtx_sleep(gccb, &gdt->sc_lock, PCATCH | PRIBIO, "iirshw", 100 * hz);
1474 struct gdt_ccb *gccb;
1514 gccb = &gdt->sc_gccbs[ctx.istatus - 2];
1515 ctx.service = gccb->gc_service;
1517 switch (gccb->gc_flags) {
1525 gdt_free_ccb(gdt, gccb);
1532 ucmd = gccb->gc_ucmd;
1534 GDT_DPRINTF(GDT_D_DEBUG, ("iir_intr(%p) ioctl: gccb %p busy\n",
1535 gdt, gccb));
1545 bcopy(gccb->gc_scratch, ucmd->data, cnt);
1549 bcopy(gccb->gc_scratch, ucmd->data, cnt);
1554 bcopy(gccb->gc_scratch, ucmd->data, cnt);
1556 bcopy(gccb->gc_scratch, ucmd->data, cnt);
1558 gdt_free_ccb(gdt, gccb);
1566 gdt_free_ccb(gdt, gccb);
1567 gdt_sync_event(gdt, ctx.service, ctx.istatus, gccb);
1578 struct gdt_ccb *gccb;
1586 gccb = gdt_get_ccb(gdt);
1587 if (gccb == NULL) {
1591 bzero(gccb->gc_cmd, GDT_CMD_SZ);
1592 gccb->gc_service = service;
1593 gccb->gc_flags = GDT_GCF_SCREEN;
1594 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
1595 gccb->gc_cmd_index);
1596 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, GDT_READ);
1597 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_HANDLE,
1599 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_ADDR,
1600 gccb->gc_scratch_busbase);
1603 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_SCREEN_SZ,
1606 gdt->sc_copy_cmd(gdt, gccb);
1635 u_int8_t index, struct gdt_ccb *gccb)
1640 ("gdt_sync_event(%p, %d, %d, %p)\n", gdt,service,index,gccb));
1642 ccb = gccb->gc_ccb;
1647 msg_len = gdt_dec32(gccb->gc_scratch + GDT_SCR_MSG_LEN);
1649 if (!(gccb->gc_scratch[GDT_SCR_MSG_ANSWER] &&
1650 gccb->gc_scratch[GDT_SCR_MSG_EXT])) {
1651 gccb->gc_scratch[GDT_SCR_MSG_TEXT + msg_len] = '\0';
1652 printf("%s",&gccb->gc_scratch[GDT_SCR_MSG_TEXT]);
1655 if (gccb->gc_scratch[GDT_SCR_MSG_EXT] &&
1656 !gccb->gc_scratch[GDT_SCR_MSG_ANSWER]) {
1659 bzero(gccb->gc_cmd, GDT_CMD_SZ);
1660 gccb = gdt_get_ccb(gdt);
1661 if (gccb == NULL) {
1665 gccb->gc_service = service;
1666 gccb->gc_flags = GDT_GCF_SCREEN;
1667 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
1668 gccb->gc_cmd_index);
1669 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, GDT_READ);
1670 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_HANDLE,
1671 gccb->gc_scratch[GDT_SCR_MSG_HANDLE]);
1672 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_ADDR,
1673 gccb->gc_scratch_busbase);
1676 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_SCREEN_SZ,
1679 gdt->sc_copy_cmd(gdt, gccb);
1684 if (gccb->gc_scratch[GDT_SCR_MSG_ANSWER] &&
1685 gdt_dec32(gccb->gc_scratch + GDT_SCR_MSG_ALEN)) {
1687 if (gdt_dec32(gccb->gc_scratch + GDT_SCR_MSG_ALEN) == 1) {
1688 gdt_enc32(gccb->gc_scratch + GDT_SCR_MSG_ALEN, 0);
1689 gdt_enc32(gccb->gc_scratch + GDT_SCR_MSG_LEN, 1);
1690 gccb->gc_scratch[GDT_SCR_MSG_TEXT] = 0;
1692 gdt_enc32(gccb->gc_scratch + GDT_SCR_MSG_ALEN,
1693 gdt_dec32(gccb->gc_scratch + GDT_SCR_MSG_ALEN) - 2);
1694 gdt_enc32(gccb->gc_scratch + GDT_SCR_MSG_LEN, 2);
1695 gccb->gc_scratch[GDT_SCR_MSG_TEXT] = 1;
1696 gccb->gc_scratch[GDT_SCR_MSG_TEXT + 1] = 0;
1698 gccb->gc_scratch[GDT_SCR_MSG_EXT] = 0;
1699 gccb->gc_scratch[GDT_SCR_MSG_ANSWER] = 0;
1702 bzero(gccb->gc_cmd, GDT_CMD_SZ);
1703 gccb = gdt_get_ccb(gdt);
1704 if (gccb == NULL) {
1708 gccb->gc_service = service;
1709 gccb->gc_flags = GDT_GCF_SCREEN;
1710 gdt_enc32(gccb->gc_cmd + GDT_CMD_COMMANDINDEX,
1711 gccb->gc_cmd_index);
1712 gdt_enc16(gccb->gc_cmd + GDT_CMD_OPCODE, GDT_WRITE);
1713 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_HANDLE,
1714 gccb->gc_scratch[GDT_SCR_MSG_HANDLE]);
1715 gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_SCREEN_MSG_ADDR,
1716 gccb->gc_scratch_busbase);
1719 gccb->gc_cmd_len = roundup(GDT_CMD_UNION + GDT_SCREEN_SZ,
1722 gdt->sc_copy_cmd(gdt, gccb);
1729 callout_stop(&gccb->gc_timeout);
1731 GDT_DPRINTF(GDT_D_DEBUG, ("gdt_sync_event(%p) gccb %p busy\n",
1732 gdt, gccb));
1740 bus_dmamap_sync(gdt->sc_buffer_dmat, gccb->gc_dmamap,
1743 bus_dmamap_unload(gdt->sc_buffer_dmat, gccb->gc_dmamap);
1751 if (gccb->gc_service == GDT_CACHESERVICE) {
1785 bcopy(gccb->gc_scratch, &ccb->csio.sense_data,