Lines Matching defs:isp

48 #include <dev/isp/isp_freebsd.h>
219 "isp", isp_pci_methods, sizeof (struct isp_pcisoftc)
222 DRIVER_MODULE(isp, pci, isp_pci_driver, 0, 0);
223 MODULE_DEPEND(isp, cam, 1, 1, 1);
224 MODULE_DEPEND(isp, firmware, 1, 1, 1);
285 isp_get_generic_options(device_t dev, ispsoftc_t *isp)
291 isp->isp_confopts |= ISP_CFG_NORELOAD;
295 isp->isp_confopts |= ISP_CFG_NONVRAM;
300 isp->isp_dblev = tval;
302 isp->isp_dblev = ISP_LOGWARN|ISP_LOGERR;
305 isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO;
318 isp_get_specific_options(device_t dev, int chan, ispsoftc_t *isp)
331 ISP_FC_PC(isp, chan)->default_id = 109 - chan;
333 ISP_FC_PC(isp, chan)->default_id = tval - chan;
334 isp->isp_confopts |= ISP_CFG_OWNLOOPID;
356 ISP_FC_PC(isp, chan)->def_role = tval;
362 isp->isp_confopts |= ISP_CFG_FULL_DUPLEX;
369 isp->isp_confopts |= ISP_CFG_LPORT;
371 isp->isp_confopts |= ISP_CFG_NPORT;
373 isp->isp_confopts |= ISP_CFG_LPORT_ONLY;
375 isp->isp_confopts |= ISP_CFG_NPORT_ONLY;
380 isp->isp_confopts |= ISP_CFG_NOFCTAPE;
382 isp->isp_confopts |= ISP_CFG_FCTAPE;
390 isp->isp_confopts &= ~ISP_CFG_FCTAPE;
391 isp->isp_confopts |= ISP_CFG_NOFCTAPE;
399 isp->isp_confopts &= ~ISP_CFG_NOFCTAPE;
400 isp->isp_confopts |= ISP_CFG_FCTAPE;
418 ISP_FC_PC(isp, chan)->def_wwpn = strtouq(sptr, &eptr, 16);
419 if (eptr < sptr + 16 || ISP_FC_PC(isp, chan)->def_wwpn == -1) {
421 ISP_FC_PC(isp, chan)->def_wwpn = 0;
431 ISP_FC_PC(isp, chan)->def_wwnn = strtouq(sptr, &eptr, 16);
432 if (eptr < sptr + 16 || ISP_FC_PC(isp, chan)->def_wwnn == 0) {
434 ISP_FC_PC(isp, chan)->def_wwnn = 0;
443 ISP_FC_PC(isp, chan)->loop_down_limit = tval;
445 ISP_FC_PC(isp, chan)->loop_down_limit = isp_loop_down_limit;
453 ISP_FC_PC(isp, chan)->gone_device_time = tval;
455 ISP_FC_PC(isp, chan)->gone_device_time = isp_gone_device_time;
463 ispsoftc_t *isp = &pcs->pci_isp;
468 isp->isp_dev = dev;
469 isp->isp_nchan = 1;
470 mtx_init(&isp->isp_lock, "isp", NULL, MTX_DEF);
476 isp_get_generic_options(dev, isp);
482 isp->isp_nchan += isp_nvports;
486 isp->isp_did = 0x2400;
487 isp->isp_mdvec = &mdvec_2400;
488 isp->isp_type = ISP_HA_FC_2400;
491 isp->isp_did = 0x2500;
492 isp->isp_mdvec = &mdvec_2500;
493 isp->isp_type = ISP_HA_FC_2500;
496 isp->isp_did = 0x2500;
497 isp->isp_mdvec = &mdvec_2500;
498 isp->isp_type = ISP_HA_FC_2500;
502 isp->isp_did = 0x2600;
503 isp->isp_mdvec = &mdvec_2600;
504 isp->isp_type = ISP_HA_FC_2600;
510 isp->isp_did = 0x2700;
511 isp->isp_mdvec = &mdvec_2700;
512 isp->isp_type = ISP_HA_FC_2700;
516 isp->isp_did = 0x2800;
517 isp->isp_mdvec = &mdvec_2800;
518 isp->isp_type = ISP_HA_FC_2800;
525 isp->isp_revision = pci_get_revid(dev);
527 if (IS_26XX(isp)) {
560 isp->isp_regs = pcs->regs;
561 isp->isp_regs2 = pcs->regs2;
563 psize = sizeof(fcparam) * isp->isp_nchan;
564 xsize = sizeof(struct isp_fc) * isp->isp_nchan;
565 isp->isp_param = malloc(psize, M_DEVBUF, M_NOWAIT | M_ZERO);
566 if (isp->isp_param == NULL) {
570 isp->isp_osinfo.fc = malloc(xsize, M_DEVBUF, M_NOWAIT | M_ZERO);
571 if (isp->isp_osinfo.fc == NULL) {
579 for (i = 0; i < isp->isp_nchan; i++) {
580 isp_get_specific_options(dev, i, isp);
596 isp_prt(isp, ISP_LOGDEBUG0, "set PCI line size to %d from %d", linesz, data);
607 isp_prt(isp, ISP_LOGDEBUG0, "set PCI latency to %d", data);
621 isp->isp_port = pci_get_function(dev);
626 ISP_LOCK(isp);
627 if (isp_reinit(isp, 1) != 0) {
628 ISP_UNLOCK(isp);
631 ISP_UNLOCK(isp);
632 if (isp_attach(isp)) {
633 ISP_LOCK(isp);
634 isp_shutdown(isp);
635 ISP_UNLOCK(isp);
641 for (i = 0; i < isp->isp_nirq; i++) {
663 mtx_destroy(&isp->isp_lock);
671 ispsoftc_t *isp = &pcs->pci_isp;
674 status = isp_detach(isp);
677 ISP_LOCK(isp);
678 isp_shutdown(isp);
679 ISP_UNLOCK(isp);
680 for (i = 0; i < isp->isp_nirq; i++) {
692 isp_pci_mbxdmafree(isp);
701 mtx_destroy(&isp->isp_lock);
705 #define BXR2(isp, off) bus_read_2((isp)->isp_regs, (off))
706 #define BXW2(isp, off, v) bus_write_2((isp)->isp_regs, (off), (v))
707 #define BXR4(isp, off) bus_read_4((isp)->isp_regs, (off))
708 #define BXW4(isp, off, v) bus_write_4((isp)->isp_regs, (off), (v))
709 #define B2R4(isp, off) bus_read_4((isp)->isp_regs2, (off))
710 #define B2W4(isp, off, v) bus_write_4((isp)->isp_regs2, (off), (v))
713 isp_pci_run_isr_2400(ispsoftc_t *isp)
718 r2hisr = BXR4(isp, BIU2400_R2HSTS);
719 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
729 isp_intr_mbox(isp, info);
732 isp_intr_async(isp, info);
735 isp_intr_respq(isp);
741 isp_intr_respq(isp);
746 isp_intr_atioq(isp);
750 isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
752 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
756 isp_pci_rd_reg_2400(ispsoftc_t *isp, int regoff)
762 return (BXR4(isp, regoff));
764 return (BXR2(isp, regoff));
766 isp_prt(isp, ISP_LOGERR, "unknown block read at 0x%x", regoff);
771 isp_pci_wr_reg_2400(ispsoftc_t *isp, int regoff, uint32_t val)
777 BXW4(isp, regoff, val);
783 MEMORYBARRIERW(isp, SYNC_REG, regoff, 4, -1)
786 MEMORYBARRIER(isp, SYNC_REG, regoff, 4, -1);
789 BXW2(isp, regoff, val);
790 MEMORYBARRIER(isp, SYNC_REG, regoff, 2, -1);
793 isp_prt(isp, ISP_LOGERR, "unknown block write at 0x%x", regoff);
797 isp_pci_rd_reg_2600(ispsoftc_t *isp, int regoff)
804 isp_prt(isp, ISP_LOGERR, "unknown register read at 0x%x",
809 rv = B2R4(isp, 0x00);
812 rv = B2R4(isp, 0x04);
815 rv = B2R4(isp, 0x08);
818 rv = B2R4(isp, 0x0c);
821 rv = B2R4(isp, 0x10);
824 rv = B2R4(isp, 0x14);
827 rv = isp_pci_rd_reg_2400(isp, regoff);
834 isp_pci_wr_reg_2600(ispsoftc_t *isp, int regoff, uint32_t val)
841 isp_prt(isp, ISP_LOGERR, "unknown register write at 0x%x",
863 isp_pci_wr_reg_2400(isp, regoff, val);
866 B2W4(isp, off, val);
885 isp_pci_mbxdma(ispsoftc_t *isp)
898 if (isp->isp_xflist != NULL)
900 if (isp->isp_rquest != NULL && isp->isp_maxcmds == 0)
902 ISP_UNLOCK(isp);
904 ptag = bus_get_dma_tag(isp->isp_osinfo.dev);
910 if (isp->isp_rquest != NULL)
916 len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
919 len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.reqdmat)) {
920 isp_prt(isp, ISP_LOGERR, "cannot create request DMA tag");
923 if (bus_dmamem_alloc(isp->isp_osinfo.reqdmat, (void **)&base,
924 BUS_DMA_COHERENT, &isp->isp_osinfo.reqmap) != 0) {
925 isp_prt(isp, ISP_LOGERR, "cannot allocate request DMA memory");
926 bus_dma_tag_destroy(isp->isp_osinfo.reqdmat);
929 isp->isp_rquest = base;
931 if (bus_dmamap_load(isp->isp_osinfo.reqdmat, isp->isp_osinfo.reqmap,
933 isp_prt(isp, ISP_LOGERR, "error loading request DMA map %d", im.error);
936 isp_prt(isp, ISP_LOGDEBUG0, "request area @ 0x%jx/0x%jx",
938 isp->isp_rquest_dma = im.maddr;
947 len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.ecmd_dmat)) {
948 isp_prt(isp, ISP_LOGERR, "cannot create ECMD DMA tag");
951 if (bus_dmamem_alloc(isp->isp_osinfo.ecmd_dmat, (void **)&base,
952 BUS_DMA_COHERENT, &isp->isp_osinfo.ecmd_map) != 0) {
953 isp_prt(isp, ISP_LOGERR, "cannot allocate ECMD DMA memory");
954 bus_dma_tag_destroy(isp->isp_osinfo.ecmd_dmat);
957 isp->isp_osinfo.ecmd_base = (isp_ecmd_t *)base;
959 if (bus_dmamap_load(isp->isp_osinfo.ecmd_dmat, isp->isp_osinfo.ecmd_map,
961 isp_prt(isp, ISP_LOGERR, "error loading ECMD DMA map %d", im.error);
964 isp_prt(isp, ISP_LOGDEBUG0, "ecmd area @ 0x%jx/0x%jx",
967 isp->isp_osinfo.ecmd_dma = im.maddr;
968 isp->isp_osinfo.ecmd_free = (isp_ecmd_t *)base;
969 for (ecmd = isp->isp_osinfo.ecmd_free;
970 ecmd < &isp->isp_osinfo.ecmd_free[N_XCMDS]; ecmd++) {
971 if (ecmd == &isp->isp_osinfo.ecmd_free[N_XCMDS - 1])
981 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
984 len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.respdmat)) {
985 isp_prt(isp, ISP_LOGERR, "cannot create response DMA tag");
988 if (bus_dmamem_alloc(isp->isp_osinfo.respdmat, (void **)&base,
989 BUS_DMA_COHERENT, &isp->isp_osinfo.respmap) != 0) {
990 isp_prt(isp, ISP_LOGERR, "cannot allocate response DMA memory");
991 bus_dma_tag_destroy(isp->isp_osinfo.respdmat);
994 isp->isp_result = base;
996 if (bus_dmamap_load(isp->isp_osinfo.respdmat, isp->isp_osinfo.respmap,
998 isp_prt(isp, ISP_LOGERR, "error loading response DMA map %d", im.error);
1001 isp_prt(isp, ISP_LOGDEBUG0, "response area @ 0x%jx/0x%jx",
1003 isp->isp_result_dma = im.maddr;
1009 len = ISP_QUEUE_SIZE(ATIO_QUEUE_LEN(isp));
1012 len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.atiodmat)) {
1013 isp_prt(isp, ISP_LOGERR, "cannot create ATIO DMA tag");
1016 if (bus_dmamem_alloc(isp->isp_osinfo.atiodmat, (void **)&base,
1017 BUS_DMA_COHERENT, &isp->isp_osinfo.atiomap) != 0) {
1018 isp_prt(isp, ISP_LOGERR, "cannot allocate ATIO DMA memory");
1019 bus_dma_tag_destroy(isp->isp_osinfo.atiodmat);
1022 isp->isp_atioq = base;
1024 if (bus_dmamap_load(isp->isp_osinfo.atiodmat, isp->isp_osinfo.atiomap,
1026 isp_prt(isp, ISP_LOGERR, "error loading ATIO DMA map %d", im.error);
1029 isp_prt(isp, ISP_LOGDEBUG0, "ATIO area @ 0x%jx/0x%jx",
1031 isp->isp_atioq_dma = im.maddr;
1037 &isp->isp_osinfo.iocbdmat)) {
1040 if (bus_dmamem_alloc(isp->isp_osinfo.iocbdmat,
1041 (void **)&base, BUS_DMA_COHERENT, &isp->isp_osinfo.iocbmap) != 0)
1043 isp->isp_iocb = base;
1045 if (bus_dmamap_load(isp->isp_osinfo.iocbdmat, isp->isp_osinfo.iocbmap,
1048 isp->isp_iocb_dma = im.maddr;
1053 &isp->isp_osinfo.scdmat))
1055 for (cmap = 0; cmap < isp->isp_nchan; cmap++) {
1056 struct isp_fc *fc = ISP_FC_PC(isp, cmap);
1057 if (bus_dmamem_alloc(isp->isp_osinfo.scdmat,
1060 FCPARAM(isp, cmap)->isp_scratch = base;
1062 if (bus_dmamap_load(isp->isp_osinfo.scdmat, fc->scmap,
1065 bus_dmamem_free(isp->isp_osinfo.scdmat,
1067 FCPARAM(isp, cmap)->isp_scratch = NULL;
1070 FCPARAM(isp, cmap)->isp_scdma = im.maddr;
1086 if (isp->isp_maxcmds == 0) {
1087 ISP_LOCK(isp);
1096 busdma_lock_mutex, &isp->isp_lock, &isp->isp_osinfo.dmat))
1098 len = isp->isp_maxcmds * sizeof (struct isp_pcmd);
1099 isp->isp_osinfo.pcmd_pool = (struct isp_pcmd *)
1101 for (i = 0; i < isp->isp_maxcmds; i++) {
1102 struct isp_pcmd *pcmd = &isp->isp_osinfo.pcmd_pool[i];
1103 error = bus_dmamap_create(isp->isp_osinfo.dmat, 0, &pcmd->dmap);
1105 isp_prt(isp, ISP_LOGERR, "error %d creating per-cmd DMA maps", error);
1107 bus_dmamap_destroy(isp->isp_osinfo.dmat,
1108 isp->isp_osinfo.pcmd_pool[i].dmap);
1112 callout_init_mtx(&pcmd->wdog, &isp->isp_lock, 0);
1113 if (i == isp->isp_maxcmds-1)
1116 pcmd->next = &isp->isp_osinfo.pcmd_pool[i+1];
1118 isp->isp_osinfo.pcmd_free = &isp->isp_osinfo.pcmd_pool[0];
1120 len = sizeof(isp_hdl_t) * ISP_HANDLE_NUM(isp);
1121 isp->isp_xflist = (isp_hdl_t *) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO);
1122 for (len = 0; len < ISP_HANDLE_NUM(isp) - 1; len++)
1123 isp->isp_xflist[len].cmd = &isp->isp_xflist[len+1];
1124 isp->isp_xffree = isp->isp_xflist;
1126 ISP_LOCK(isp);
1130 isp_pci_mbxdmafree(isp);
1131 ISP_LOCK(isp);
1136 isp_pci_mbxdmafree(ispsoftc_t *isp)
1140 if (isp->isp_xflist != NULL) {
1141 free(isp->isp_xflist, M_DEVBUF);
1142 isp->isp_xflist = NULL;
1144 if (isp->isp_osinfo.pcmd_pool != NULL) {
1145 for (i = 0; i < isp->isp_maxcmds; i++) {
1146 bus_dmamap_destroy(isp->isp_osinfo.dmat,
1147 isp->isp_osinfo.pcmd_pool[i].dmap);
1149 free(isp->isp_osinfo.pcmd_pool, M_DEVBUF);
1150 isp->isp_osinfo.pcmd_pool = NULL;
1152 if (isp->isp_osinfo.dmat) {
1153 bus_dma_tag_destroy(isp->isp_osinfo.dmat);
1154 isp->isp_osinfo.dmat = NULL;
1156 for (i = 0; i < isp->isp_nchan; i++) {
1157 struct isp_fc *fc = ISP_FC_PC(isp, i);
1158 if (FCPARAM(isp, i)->isp_scdma != 0) {
1159 bus_dmamap_unload(isp->isp_osinfo.scdmat,
1161 FCPARAM(isp, i)->isp_scdma = 0;
1163 if (FCPARAM(isp, i)->isp_scratch != NULL) {
1164 bus_dmamem_free(isp->isp_osinfo.scdmat,
1165 FCPARAM(isp, i)->isp_scratch, fc->scmap);
1166 FCPARAM(isp, i)->isp_scratch = NULL;
1174 if (isp->isp_osinfo.scdmat) {
1175 bus_dma_tag_destroy(isp->isp_osinfo.scdmat);
1176 isp->isp_osinfo.scdmat = NULL;
1178 if (isp->isp_iocb_dma != 0) {
1179 bus_dmamap_unload(isp->isp_osinfo.iocbdmat,
1180 isp->isp_osinfo.iocbmap);
1181 isp->isp_iocb_dma = 0;
1183 if (isp->isp_iocb != NULL) {
1184 bus_dmamem_free(isp->isp_osinfo.iocbdmat,
1185 isp->isp_iocb, isp->isp_osinfo.iocbmap);
1186 bus_dma_tag_destroy(isp->isp_osinfo.iocbdmat);
1189 if (isp->isp_atioq_dma != 0) {
1190 bus_dmamap_unload(isp->isp_osinfo.atiodmat,
1191 isp->isp_osinfo.atiomap);
1192 isp->isp_atioq_dma = 0;
1194 if (isp->isp_atioq != NULL) {
1195 bus_dmamem_free(isp->isp_osinfo.atiodmat, isp->isp_atioq,
1196 isp->isp_osinfo.atiomap);
1197 bus_dma_tag_destroy(isp->isp_osinfo.atiodmat);
1198 isp->isp_atioq = NULL;
1201 if (isp->isp_result_dma != 0) {
1202 bus_dmamap_unload(isp->isp_osinfo.respdmat,
1203 isp->isp_osinfo.respmap);
1204 isp->isp_result_dma = 0;
1206 if (isp->isp_result != NULL) {
1207 bus_dmamem_free(isp->isp_osinfo.respdmat, isp->isp_result,
1208 isp->isp_osinfo.respmap);
1209 bus_dma_tag_destroy(isp->isp_osinfo.respdmat);
1210 isp->isp_result = NULL;
1213 if (isp->isp_osinfo.ecmd_dma != 0) {
1214 bus_dmamap_unload(isp->isp_osinfo.ecmd_dmat,
1215 isp->isp_osinfo.ecmd_map);
1216 isp->isp_osinfo.ecmd_dma = 0;
1218 if (isp->isp_osinfo.ecmd_base != NULL) {
1219 bus_dmamem_free(isp->isp_osinfo.ecmd_dmat, isp->isp_osinfo.ecmd_base,
1220 isp->isp_osinfo.ecmd_map);
1221 bus_dma_tag_destroy(isp->isp_osinfo.ecmd_dmat);
1222 isp->isp_osinfo.ecmd_base = NULL;
1225 if (isp->isp_rquest_dma != 0) {
1226 bus_dmamap_unload(isp->isp_osinfo.reqdmat,
1227 isp->isp_osinfo.reqmap);
1228 isp->isp_rquest_dma = 0;
1230 if (isp->isp_rquest != NULL) {
1231 bus_dmamem_free(isp->isp_osinfo.reqdmat, isp->isp_rquest,
1232 isp->isp_osinfo.reqmap);
1233 bus_dma_tag_destroy(isp->isp_osinfo.reqdmat);
1234 isp->isp_rquest = NULL;
1239 isp_pci_irqsetup(ispsoftc_t *isp)
1241 device_t dev = isp->isp_osinfo.dev;
1247 if (isp->isp_nirq > 0)
1250 ISP_UNLOCK(isp);
1251 if (ISP_CAP_MSIX(isp)) {
1252 max_irq = IS_26XX(isp) ? 3 : (IS_25XX(isp) ? 2 : 0);
1286 f, isp, &pcs->irq[i].ih)) {
1296 isp->isp_nirq = i + 1;
1298 ISP_LOCK(isp);
1300 return (isp->isp_nirq == 0);