summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/isp/isp_pci.c')
-rw-r--r--sys/dev/isp/isp_pci.c85
1 files changed, 34 insertions, 51 deletions
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c
index 4ccdc1a..7ddf3c6 100644
--- a/sys/dev/isp/isp_pci.c
+++ b/sys/dev/isp/isp_pci.c
@@ -59,9 +59,9 @@ static uint32_t isp_pci_rd_reg_1080(ispsoftc_t *, int);
static void isp_pci_wr_reg_1080(ispsoftc_t *, int, uint32_t);
static uint32_t isp_pci_rd_reg_2400(ispsoftc_t *, int);
static void isp_pci_wr_reg_2400(ispsoftc_t *, int, uint32_t);
-static int isp_pci_rd_isr(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
-static int isp_pci_rd_isr_2300(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
-static int isp_pci_rd_isr_2400(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *);
+static int isp_pci_rd_isr(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
+static int isp_pci_rd_isr_2300(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
+static int isp_pci_rd_isr_2400(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
static int isp_pci_mbxdma(ispsoftc_t *);
static int isp_pci_dmasetup(ispsoftc_t *, XS_T *, void *);
@@ -489,9 +489,6 @@ isp_get_generic_options(device_t dev, ispsoftc_t *isp)
if (tval > 0 && tval < 127) {
isp_nvports = tval;
}
- tval = 1;
- (void) resource_int_value(device_get_name(dev), device_get_unit(dev), "autoconfig", &tval);
- isp_autoconfig = tval;
tval = 7;
(void) resource_int_value(device_get_name(dev), device_get_unit(dev), "quickboot_time", &tval);
isp_quickboot_time = tval;
@@ -899,9 +896,6 @@ isp_pci_attach(device_t dev)
if (IS_SCSI(isp) && (ISP_SPI_PC(isp, 0)->def_role & ISP_ROLE_TARGET)) {
snprintf(fwname, sizeof (fwname), "isp_%04x_it", did);
isp->isp_osinfo.fw = firmware_get(fwname);
- } else if (IS_24XX(isp)) {
- snprintf(fwname, sizeof (fwname), "isp_%04x_multi", did);
- isp->isp_osinfo.fw = firmware_get(fwname);
}
if (isp->isp_osinfo.fw == NULL) {
snprintf(fwname, sizeof (fwname), "isp_%04x", did);
@@ -997,15 +991,10 @@ isp_pci_attach(device_t dev)
* Make sure we're in reset state.
*/
ISP_LOCK(isp);
- isp_reset(isp, 1);
- if (isp->isp_state != ISP_RESETSTATE) {
+ if (isp_reinit(isp, 1) != 0) {
ISP_UNLOCK(isp);
goto bad;
}
- isp_init(isp);
- if (isp->isp_state == ISP_INITSTATE) {
- isp->isp_state = ISP_RUNSTATE;
- }
ISP_UNLOCK(isp);
if (isp_attach(isp)) {
ISP_LOCK(isp);
@@ -1115,7 +1104,7 @@ isp_pci_rd_debounced(ispsoftc_t *isp, int off, uint16_t *rp)
}
static int
-isp_pci_rd_isr(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbp)
+isp_pci_rd_isr(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
{
uint16_t isr, sema;
@@ -1139,21 +1128,20 @@ isp_pci_rd_isr(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbp)
*isrp = isr;
if ((*semap = sema) != 0) {
if (IS_2100(isp)) {
- if (isp_pci_rd_debounced(isp, OUTMAILBOX0, mbp)) {
+ if (isp_pci_rd_debounced(isp, OUTMAILBOX0, info)) {
return (0);
}
} else {
- *mbp = BXR2(isp, IspVirt2Off(isp, OUTMAILBOX0));
+ *info = BXR2(isp, IspVirt2Off(isp, OUTMAILBOX0));
}
}
return (1);
}
static int
-isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p)
+isp_pci_rd_isr_2300(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
{
- uint32_t hccr;
- uint32_t r2hisr;
+ uint32_t hccr, r2hisr;
if (!(BXR2(isp, IspVirt2Off(isp, BIU_ISR) & BIU2100_ISR_RISC_INT))) {
*isrp = 0;
@@ -1165,36 +1153,29 @@ isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *
*isrp = 0;
return (0);
}
- switch (r2hisr & BIU_R2HST_ISTAT_MASK) {
+ switch ((*isrp = r2hisr & BIU_R2HST_ISTAT_MASK)) {
case ISPR2HST_ROM_MBX_OK:
case ISPR2HST_ROM_MBX_FAIL:
case ISPR2HST_MBX_OK:
case ISPR2HST_MBX_FAIL:
case ISPR2HST_ASYNC_EVENT:
- *isrp = r2hisr & 0xffff;
- *mbox0p = (r2hisr >> 16);
*semap = 1;
- return (1);
+ break;
case ISPR2HST_RIO_16:
- *isrp = r2hisr & 0xffff;
- *mbox0p = ASYNC_RIO16_1;
+ *info = ASYNC_RIO16_1;
*semap = 1;
return (1);
case ISPR2HST_FPOST:
- *isrp = r2hisr & 0xffff;
- *mbox0p = ASYNC_CMD_CMPLT;
+ *info = ASYNC_CMD_CMPLT;
*semap = 1;
return (1);
case ISPR2HST_FPOST_CTIO:
- *isrp = r2hisr & 0xffff;
- *mbox0p = ASYNC_CTIO_DONE;
+ *info = ASYNC_CTIO_DONE;
*semap = 1;
return (1);
case ISPR2HST_RSPQ_UPDATE:
- *isrp = r2hisr & 0xffff;
- *mbox0p = 0;
*semap = 0;
- return (1);
+ break;
default:
hccr = ISP_READ(isp, HCCR);
if (hccr & HCCR_PAUSE) {
@@ -1206,41 +1187,43 @@ isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *
}
return (0);
}
+ *info = (r2hisr >> 16);
+ return (1);
}
static int
-isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p)
+isp_pci_rd_isr_2400(ispsoftc_t *isp, uint16_t *isrp, uint16_t *semap, uint16_t *info)
{
uint32_t r2hisr;
r2hisr = BXR4(isp, IspVirt2Off(isp, BIU2400_R2HSTSLO));
isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
- if ((r2hisr & BIU2400_R2HST_INTR) == 0) {
+ if ((r2hisr & BIU_R2HST_INTR) == 0) {
*isrp = 0;
return (0);
}
- switch (r2hisr & BIU2400_R2HST_ISTAT_MASK) {
- case ISP2400R2HST_ROM_MBX_OK:
- case ISP2400R2HST_ROM_MBX_FAIL:
- case ISP2400R2HST_MBX_OK:
- case ISP2400R2HST_MBX_FAIL:
- case ISP2400R2HST_ASYNC_EVENT:
- *isrp = r2hisr & 0xffff;
- *mbox0p = (r2hisr >> 16);
+ switch ((*isrp = r2hisr & BIU_R2HST_ISTAT_MASK)) {
+ case ISPR2HST_ROM_MBX_OK:
+ case ISPR2HST_ROM_MBX_FAIL:
+ case ISPR2HST_MBX_OK:
+ case ISPR2HST_MBX_FAIL:
+ case ISPR2HST_ASYNC_EVENT:
*semap = 1;
- return (1);
- case ISP2400R2HST_RSPQ_UPDATE:
- case ISP2400R2HST_ATIO_RSPQ_UPDATE:
- case ISP2400R2HST_ATIO_RQST_UPDATE:
- *isrp = r2hisr & 0xffff;
- *mbox0p = 0;
+ break;
+ case ISPR2HST_RSPQ_UPDATE:
+ case ISPR2HST_RSPQ_UPDATE2:
+ case ISPR2HST_ATIO_UPDATE:
+ case ISPR2HST_ATIO_RSPQ_UPDATE:
+ case ISPR2HST_ATIO_UPDATE2:
*semap = 0;
- return (1);
+ break;
default:
ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr);
return (0);
}
+ *info = (r2hisr >> 16);
+ return (1);
}
static uint32_t
OpenPOWER on IntegriCloud