Deleted Added
full compact
isp_pci.c (290782) isp_pci.c (290785)
1/*-
2 * Copyright (c) 1997-2008 by Matthew Jacob
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26/*
27 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters.
28 * FreeBSD Version.
29 */
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1997-2008 by Matthew Jacob
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26/*
27 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters.
28 * FreeBSD Version.
29 */
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: stable/10/sys/dev/isp/isp_pci.c 290782 2015-11-13 19:36:43Z mav $");
31__FBSDID("$FreeBSD: stable/10/sys/dev/isp/isp_pci.c 290785 2015-11-13 19:42:55Z mav $");
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/kernel.h>
36#include <sys/module.h>
37#include <sys/linker.h>
38#include <sys/firmware.h>
39#include <sys/bus.h>

--- 14 unchanged lines hidden (view full) ---

54#include <dev/isp/isp_freebsd.h>
55
56static uint32_t isp_pci_rd_reg(ispsoftc_t *, int);
57static void isp_pci_wr_reg(ispsoftc_t *, int, uint32_t);
58static uint32_t isp_pci_rd_reg_1080(ispsoftc_t *, int);
59static void isp_pci_wr_reg_1080(ispsoftc_t *, int, uint32_t);
60static uint32_t isp_pci_rd_reg_2400(ispsoftc_t *, int);
61static void isp_pci_wr_reg_2400(ispsoftc_t *, int, uint32_t);
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/kernel.h>
36#include <sys/module.h>
37#include <sys/linker.h>
38#include <sys/firmware.h>
39#include <sys/bus.h>

--- 14 unchanged lines hidden (view full) ---

54#include <dev/isp/isp_freebsd.h>
55
56static uint32_t isp_pci_rd_reg(ispsoftc_t *, int);
57static void isp_pci_wr_reg(ispsoftc_t *, int, uint32_t);
58static uint32_t isp_pci_rd_reg_1080(ispsoftc_t *, int);
59static void isp_pci_wr_reg_1080(ispsoftc_t *, int, uint32_t);
60static uint32_t isp_pci_rd_reg_2400(ispsoftc_t *, int);
61static void isp_pci_wr_reg_2400(ispsoftc_t *, int, uint32_t);
62static int isp_pci_rd_isr(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
63static int isp_pci_rd_isr_2300(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
64static int isp_pci_rd_isr_2400(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
62static int isp_pci_rd_isr(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
63static int isp_pci_rd_isr_2300(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
64static int isp_pci_rd_isr_2400(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
65static int isp_pci_mbxdma(ispsoftc_t *);
66static int isp_pci_dmasetup(ispsoftc_t *, XS_T *, void *);
67
68
69static void isp_pci_reset0(ispsoftc_t *);
70static void isp_pci_reset1(ispsoftc_t *);
71static void isp_pci_dumpregs(ispsoftc_t *, const char *);
72

--- 1034 unchanged lines hidden (view full) ---

1107 if (val0 != val1) {
1108 return (1);
1109 }
1110 *rp = val0;
1111 return (0);
1112}
1113
1114static int
65static int isp_pci_mbxdma(ispsoftc_t *);
66static int isp_pci_dmasetup(ispsoftc_t *, XS_T *, void *);
67
68
69static void isp_pci_reset0(ispsoftc_t *);
70static void isp_pci_reset1(ispsoftc_t *);
71static void isp_pci_dumpregs(ispsoftc_t *, const char *);
72

--- 1034 unchanged lines hidden (view full) ---

1107 if (val0 != val1) {
1108 return (1);
1109 }
1110 *rp = val0;
1111 return (0);
1112}
1113
1114static int
1115isp_pci_rd_isr(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbp)
1115isp_pci_rd_isr(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
1116{
1117 uint16_t isr, sema;
1118
1119 if (IS_2100(isp)) {
1120 if (isp_pci_rd_debounced(isp, BIU_ISR, &isr)) {
1121 return (0);
1122 }
1123 if (isp_pci_rd_debounced(isp, BIU_SEMA, &sema)) {

--- 7 unchanged lines hidden (view full) ---

1131 isr &= INT_PENDING_MASK(isp);
1132 sema &= BIU_SEMA_LOCK;
1133 if (isr == 0 && sema == 0) {
1134 return (0);
1135 }
1136 *isrp = isr;
1137 if ((*semap = sema) != 0) {
1138 if (IS_2100(isp)) {
1116{
1117 uint16_t isr, sema;
1118
1119 if (IS_2100(isp)) {
1120 if (isp_pci_rd_debounced(isp, BIU_ISR, &isr)) {
1121 return (0);
1122 }
1123 if (isp_pci_rd_debounced(isp, BIU_SEMA, &sema)) {

--- 7 unchanged lines hidden (view full) ---

1131 isr &= INT_PENDING_MASK(isp);
1132 sema &= BIU_SEMA_LOCK;
1133 if (isr == 0 && sema == 0) {
1134 return (0);
1135 }
1136 *isrp = isr;
1137 if ((*semap = sema) != 0) {
1138 if (IS_2100(isp)) {
1139 if (isp_pci_rd_debounced(isp, OUTMAILBOX0, mbp)) {
1139 if (isp_pci_rd_debounced(isp, OUTMAILBOX0, info)) {
1140 return (0);
1141 }
1142 } else {
1140 return (0);
1141 }
1142 } else {
1143 *mbp = BXR2(isp, IspVirt2Off(isp, OUTMAILBOX0));
1143 *info = BXR2(isp, IspVirt2Off(isp, OUTMAILBOX0));
1144 }
1145 }
1146 return (1);
1147}
1148
1149static int
1144 }
1145 }
1146 return (1);
1147}
1148
1149static int
1150isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p)
1150isp_pci_rd_isr_2300(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
1151{
1151{
1152 uint32_t hccr;
1153 uint32_t r2hisr;
1152 uint32_t hccr, r2hisr;
1154
1155 if (!(BXR2(isp, IspVirt2Off(isp, BIU_ISR) & BIU2100_ISR_RISC_INT))) {
1156 *isrp = 0;
1157 return (0);
1158 }
1159 r2hisr = BXR4(isp, IspVirt2Off(isp, BIU_R2HSTSLO));
1160 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
1161 if ((r2hisr & BIU_R2HST_INTR) == 0) {
1162 *isrp = 0;
1163 return (0);
1164 }
1153
1154 if (!(BXR2(isp, IspVirt2Off(isp, BIU_ISR) & BIU2100_ISR_RISC_INT))) {
1155 *isrp = 0;
1156 return (0);
1157 }
1158 r2hisr = BXR4(isp, IspVirt2Off(isp, BIU_R2HSTSLO));
1159 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
1160 if ((r2hisr & BIU_R2HST_INTR) == 0) {
1161 *isrp = 0;
1162 return (0);
1163 }
1165 switch (r2hisr & BIU_R2HST_ISTAT_MASK) {
1164 switch ((*isrp = r2hisr & BIU_R2HST_ISTAT_MASK)) {
1166 case ISPR2HST_ROM_MBX_OK:
1167 case ISPR2HST_ROM_MBX_FAIL:
1168 case ISPR2HST_MBX_OK:
1169 case ISPR2HST_MBX_FAIL:
1170 case ISPR2HST_ASYNC_EVENT:
1165 case ISPR2HST_ROM_MBX_OK:
1166 case ISPR2HST_ROM_MBX_FAIL:
1167 case ISPR2HST_MBX_OK:
1168 case ISPR2HST_MBX_FAIL:
1169 case ISPR2HST_ASYNC_EVENT:
1171 *isrp = r2hisr & 0xffff;
1172 *mbox0p = (r2hisr >> 16);
1173 *semap = 1;
1170 *semap = 1;
1174 return (1);
1171 break;
1175 case ISPR2HST_RIO_16:
1172 case ISPR2HST_RIO_16:
1176 *isrp = r2hisr & 0xffff;
1177 *mbox0p = ASYNC_RIO16_1;
1173 *info = ASYNC_RIO16_1;
1178 *semap = 1;
1179 return (1);
1180 case ISPR2HST_FPOST:
1174 *semap = 1;
1175 return (1);
1176 case ISPR2HST_FPOST:
1181 *isrp = r2hisr & 0xffff;
1182 *mbox0p = ASYNC_CMD_CMPLT;
1177 *info = ASYNC_CMD_CMPLT;
1183 *semap = 1;
1184 return (1);
1185 case ISPR2HST_FPOST_CTIO:
1178 *semap = 1;
1179 return (1);
1180 case ISPR2HST_FPOST_CTIO:
1186 *isrp = r2hisr & 0xffff;
1187 *mbox0p = ASYNC_CTIO_DONE;
1181 *info = ASYNC_CTIO_DONE;
1188 *semap = 1;
1189 return (1);
1190 case ISPR2HST_RSPQ_UPDATE:
1182 *semap = 1;
1183 return (1);
1184 case ISPR2HST_RSPQ_UPDATE:
1191 *isrp = r2hisr & 0xffff;
1192 *mbox0p = 0;
1193 *semap = 0;
1185 *semap = 0;
1194 return (1);
1186 break;
1195 default:
1196 hccr = ISP_READ(isp, HCCR);
1197 if (hccr & HCCR_PAUSE) {
1198 ISP_WRITE(isp, HCCR, HCCR_RESET);
1199 isp_prt(isp, ISP_LOGERR, "RISC paused at interrupt (%x->%x)", hccr, ISP_READ(isp, HCCR));
1200 ISP_WRITE(isp, BIU_ICR, 0);
1201 } else {
1202 isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
1203 }
1204 return (0);
1205 }
1187 default:
1188 hccr = ISP_READ(isp, HCCR);
1189 if (hccr & HCCR_PAUSE) {
1190 ISP_WRITE(isp, HCCR, HCCR_RESET);
1191 isp_prt(isp, ISP_LOGERR, "RISC paused at interrupt (%x->%x)", hccr, ISP_READ(isp, HCCR));
1192 ISP_WRITE(isp, BIU_ICR, 0);
1193 } else {
1194 isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
1195 }
1196 return (0);
1197 }
1198 *info = (r2hisr >> 16);
1199 return (1);
1206}
1207
1208static int
1200}
1201
1202static int
1209isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p)
1203isp_pci_rd_isr_2400(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
1210{
1211 uint32_t r2hisr;
1212
1213 r2hisr = BXR4(isp, IspVirt2Off(isp, BIU2400_R2HSTSLO));
1214 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
1204{
1205 uint32_t r2hisr;
1206
1207 r2hisr = BXR4(isp, IspVirt2Off(isp, BIU2400_R2HSTSLO));
1208 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
1215 if ((r2hisr & BIU2400_R2HST_INTR) == 0) {
1209 if ((r2hisr & BIU_R2HST_INTR) == 0) {
1216 *isrp = 0;
1217 return (0);
1218 }
1210 *isrp = 0;
1211 return (0);
1212 }
1219 switch (r2hisr & BIU2400_R2HST_ISTAT_MASK) {
1220 case ISP2400R2HST_ROM_MBX_OK:
1221 case ISP2400R2HST_ROM_MBX_FAIL:
1222 case ISP2400R2HST_MBX_OK:
1223 case ISP2400R2HST_MBX_FAIL:
1224 case ISP2400R2HST_ASYNC_EVENT:
1225 *isrp = r2hisr & 0xffff;
1226 *mbox0p = (r2hisr >> 16);
1213 switch ((*isrp = r2hisr & BIU_R2HST_ISTAT_MASK)) {
1214 case ISPR2HST_ROM_MBX_OK:
1215 case ISPR2HST_ROM_MBX_FAIL:
1216 case ISPR2HST_MBX_OK:
1217 case ISPR2HST_MBX_FAIL:
1218 case ISPR2HST_ASYNC_EVENT:
1227 *semap = 1;
1219 *semap = 1;
1228 return (1);
1229 case ISP2400R2HST_RSPQ_UPDATE:
1230 case ISP2400R2HST_ATIO_RSPQ_UPDATE:
1231 case ISP2400R2HST_ATIO_RQST_UPDATE:
1232 *isrp = r2hisr & 0xffff;
1233 *mbox0p = 0;
1220 break;
1221 case ISPR2HST_RSPQ_UPDATE:
1222 case ISPR2HST_RSPQ_UPDATE2:
1223 case ISPR2HST_ATIO_UPDATE:
1224 case ISPR2HST_ATIO_RSPQ_UPDATE:
1225 case ISPR2HST_ATIO_UPDATE2:
1234 *semap = 0;
1226 *semap = 0;
1235 return (1);
1227 break;
1236 default:
1237 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
1238 isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
1239 return (0);
1240 }
1228 default:
1229 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
1230 isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
1231 return (0);
1232 }
1233 *info = (r2hisr >> 16);
1234 return (1);
1241}
1242
1243static uint32_t
1244isp_pci_rd_reg(ispsoftc_t *isp, int regoff)
1245{
1246 uint16_t rv;
1247 int oldconf = 0;
1248

--- 811 unchanged lines hidden ---
1235}
1236
1237static uint32_t
1238isp_pci_rd_reg(ispsoftc_t *isp, int regoff)
1239{
1240 uint16_t rv;
1241 int oldconf = 0;
1242

--- 811 unchanged lines hidden ---