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.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c
index 95c40e79..2dfac81 100644
--- a/sys/dev/isp/isp_pci.c
+++ b/sys/dev/isp/isp_pci.c
@@ -496,14 +496,20 @@ isp_pci_attach(device_t dev)
pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
PCI_MBOX_REGS2100_OFF;
}
- if (pci_get_devid(dev) == PCI_QLOGIC_ISP2300 ||
- pci_get_devid(dev) == PCI_QLOGIC_ISP2312) {
+ if (pci_get_devid(dev) == PCI_QLOGIC_ISP2300) {
mdvp = &mdvec_2300;
basetype = ISP_HA_FC_2300;
psize = sizeof (fcparam);
pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
PCI_MBOX_REGS2300_OFF;
}
+ if (pci_get_devid(dev) == PCI_QLOGIC_ISP2312) {
+ mdvp = &mdvec_2300;
+ basetype = ISP_HA_FC_2312;
+ psize = sizeof (fcparam);
+ pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
+ PCI_MBOX_REGS2300_OFF;
+ }
isp = &pcs->pci_isp;
isp->isp_param = malloc(psize, M_DEVBUF, M_NOWAIT | M_ZERO);
if (isp->isp_param == NULL) {
@@ -535,6 +541,9 @@ isp_pci_attach(device_t dev)
*/
cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN |
PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN;
+ if (IS_2300(isp)) { /* per QLogic errata */
+ cmd &= ~PCIM_CMD_INVEN;
+ }
pci_write_config(dev, PCIR_COMMAND, cmd, 1);
/*
@@ -684,6 +693,13 @@ isp_pci_attach(device_t dev)
isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO;
/*
+ * Last minute checks...
+ */
+ if (IS_2312(isp)) {
+ isp->isp_port = pci_get_function(dev);
+ }
+
+ /*
* Make sure we're in reset state.
*/
ISP_LOCK(isp);
@@ -852,6 +868,7 @@ isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int16_t *isrp,
case ISPR2HST_MBX_OK:
case ISPR2HST_MBX_FAIL:
case ISPR2HST_ASYNC_EVENT:
+ case ISPR2HST_RIO_16:
case ISPR2HST_FPOST:
case ISPR2HST_FPOST_CTIO:
*isrp = r2hisr & 0xffff;
OpenPOWER on IntegriCloud