aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/isp
diff options
context:
space:
mode:
authorJoerg Pulz <Joerg.Pulz@frm2.tum.de>2023-07-07 21:43:34 +0000
committerWarner Losh <imp@FreeBSD.org>2023-07-07 21:45:29 +0000
commit407abff6a445c8db335093868e9e7e70438c5901 (patch)
treed8e64573a4229bfc1d201a8422bd45fd471947b4 /sys/dev/isp
parent29cbe944e9287c2e61928c456512d3990aaffdaa (diff)
Diffstat (limited to 'sys/dev/isp')
-rw-r--r--sys/dev/isp/isp.c14
-rw-r--r--sys/dev/isp/isp_pci.c28
-rw-r--r--sys/dev/isp/ispmbox.h3
-rw-r--r--sys/dev/isp/ispvar.h3
4 files changed, 47 insertions, 1 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index a2c6e12d37cc..17163c3c4cbd 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -179,6 +179,9 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults)
case ISP_HA_FC_2700:
btype = "2700";
break;
+ case ISP_HA_FC_2800:
+ btype = "2800";
+ break;
default:
break;
}
@@ -710,8 +713,11 @@ isp_init(ispsoftc_t *isp)
icbp->icb_version = ICB_VERSION1;
icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp);
if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
- isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM- using %d", DEFAULT_FRAMESIZE(isp), ICB_DFLT_FRMLEN);
icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
+ if (IS_28XX(isp))
+ icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN_28XX;
+
+ isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM - using %d", DEFAULT_FRAMESIZE(isp), icbp->icb_maxfrmlen);
}
if (!IS_26XX(isp))
@@ -822,12 +828,16 @@ isp_init(ispsoftc_t *isp)
} else if (isp->isp_confopts & ISP_CFG_32GB) {
icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_32GB;
+ } else if (isp->isp_confopts & ISP_CFG_64GB) {
+ icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
+ icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_64GB;
} else {
switch (icbp->icb_fwoptions3 & ICB2400_OPT3_RATE_MASK) {
case ICB2400_OPT3_RATE_4GB:
case ICB2400_OPT3_RATE_8GB:
case ICB2400_OPT3_RATE_16GB:
case ICB2400_OPT3_RATE_32GB:
+ case ICB2400_OPT3_RATE_64GB:
case ICB2400_OPT3_RATE_AUTO:
break;
case ICB2400_OPT3_RATE_2GB:
@@ -1537,6 +1547,8 @@ not_on_fabric:
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
if (mbs.param[1] == MBGSD_10GB)
fcp->isp_gbspeed = 10;
+ else if (mbs.param[1] == MBGSD_64GB)
+ fcp->isp_gbspeed = 64;
else if (mbs.param[1] == MBGSD_32GB)
fcp->isp_gbspeed = 32;
else if (mbs.param[1] == MBGSD_16GB)
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c
index 7bed6ad16cc4..236fcfb9774f 100644
--- a/sys/dev/isp/isp_pci.c
+++ b/sys/dev/isp/isp_pci.c
@@ -99,6 +99,16 @@ static struct ispmdvec mdvec_2700 = {
NULL
};
+static struct ispmdvec mdvec_2800 = {
+ isp_pci_run_isr_2400,
+ isp_pci_rd_reg_2600,
+ isp_pci_wr_reg_2600,
+ isp_pci_mbxdma,
+ isp_send_cmd,
+ isp_pci_irqsetup,
+ NULL
+};
+
#ifndef PCIM_CMD_INVEN
#define PCIM_CMD_INVEN 0x10
#endif
@@ -143,6 +153,8 @@ static struct ispmdvec mdvec_2700 = {
#define PCI_PRODUCT_QLOGIC_ISP2692 0x2b61
#define PCI_PRODUCT_QLOGIC_ISP2714 0x2071
#define PCI_PRODUCT_QLOGIC_ISP2722 0x2261
+#define PCI_PRODUCT_QLOGIC_ISP2812 0x2281
+#define PCI_PRODUCT_QLOGIC_ISP2814 0x2081
#define PCI_QLOGIC_ISP2422 \
((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC)
@@ -164,6 +176,10 @@ static struct ispmdvec mdvec_2700 = {
((PCI_PRODUCT_QLOGIC_ISP2714 << 16) | PCI_VENDOR_QLOGIC)
#define PCI_QLOGIC_ISP2722 \
((PCI_PRODUCT_QLOGIC_ISP2722 << 16) | PCI_VENDOR_QLOGIC)
+#define PCI_QLOGIC_ISP2812 \
+ ((PCI_PRODUCT_QLOGIC_ISP2812 << 16) | PCI_VENDOR_QLOGIC)
+#define PCI_QLOGIC_ISP2814 \
+ ((PCI_PRODUCT_QLOGIC_ISP2814 << 16) | PCI_VENDOR_QLOGIC)
#define PCI_DFLT_LTNCY 0x40
#define PCI_DFLT_LNSZ 0x10
@@ -245,6 +261,12 @@ isp_pci_probe(device_t dev)
case PCI_QLOGIC_ISP2722:
device_set_desc(dev, "Qlogic ISP 2722 PCI FC Adapter");
break;
+ case PCI_QLOGIC_ISP2812:
+ device_set_desc(dev, "Qlogic ISP 2812 PCI FC Adapter");
+ break;
+ case PCI_QLOGIC_ISP2814:
+ device_set_desc(dev, "Qlogic ISP 2814 PCI FC Adapter");
+ break;
default:
return (ENXIO);
}
@@ -493,6 +515,12 @@ isp_pci_attach(device_t dev)
isp->isp_mdvec = &mdvec_2700;
isp->isp_type = ISP_HA_FC_2700;
break;
+ case PCI_QLOGIC_ISP2812:
+ case PCI_QLOGIC_ISP2814:
+ did = 0x2800;
+ isp->isp_mdvec = &mdvec_2800;
+ isp->isp_type = ISP_HA_FC_2800;
+ break;
default:
device_printf(dev, "unknown device type\n");
goto bad;
diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h
index 3d0cbcffaa6b..1e229f5c4653 100644
--- a/sys/dev/isp/ispmbox.h
+++ b/sys/dev/isp/ispmbox.h
@@ -179,6 +179,7 @@
#define MBGSD_8GB 0x04 /* 25XX only */
#define MBGSD_16GB 0x05 /* 26XX only */
#define MBGSD_32GB 0x06 /* 27XX only */
+#define MBGSD_64GB 0x07 /* 28XX only */
#define MBGSD_10GB 0x13 /* 26XX only */
#define MBOX_SEND_RNFT 0x005e
#define MBOX_INIT_FIRMWARE 0x0060
@@ -647,6 +648,7 @@ typedef struct {
#define ICB2400_OPT3_RATE_8GB 0x00008000
#define ICB2400_OPT3_RATE_16GB 0x0000A000
#define ICB2400_OPT3_RATE_32GB 0x0000C000
+#define ICB2400_OPT3_RATE_64GB 0x0000E000
#define ICB2400_OPT3_ENA_OOF_XFRDY 0x00000200
#define ICB2400_OPT3_NO_N2N_LOGI 0x00000100
#define ICB2400_OPT3_NO_LOCAL_PLOGI 0x00000080
@@ -661,6 +663,7 @@ typedef struct {
#define ICB_MIN_FRMLEN 256
#define ICB_MAX_FRMLEN 2112
#define ICB_DFLT_FRMLEN 1024
+#define ICB_DFLT_FRMLEN_28XX 2048
#define ICB_DFLT_RDELAY 5
#define ICB_DFLT_RCOUNT 3
diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h
index 66faf939a1dd..c597e715fa14 100644
--- a/sys/dev/isp/ispvar.h
+++ b/sys/dev/isp/ispvar.h
@@ -539,6 +539,7 @@ struct ispsoftc {
#define ISP_CFG_8GB 0x4000 /* force 8Gb connection (25XX only) */
#define ISP_CFG_16GB 0x8000 /* force 16Gb connection (26XX only) */
#define ISP_CFG_32GB 0x10000 /* force 32Gb connection (27XX only) */
+#define ISP_CFG_64GB 0x20000 /* force 64Gb connection (28XX only) */
/*
* For each channel, the outer layers should know what role that channel
@@ -607,10 +608,12 @@ struct ispsoftc {
#define ISP_HA_FC_2500 0x05
#define ISP_HA_FC_2600 0x06
#define ISP_HA_FC_2700 0x07
+#define ISP_HA_FC_2800 0x08
#define IS_25XX(isp) ((isp)->isp_type >= ISP_HA_FC_2500)
#define IS_26XX(isp) ((isp)->isp_type >= ISP_HA_FC_2600)
#define IS_27XX(isp) ((isp)->isp_type >= ISP_HA_FC_2700)
+#define IS_28XX(isp) ((isp)->isp_type >= ISP_HA_FC_2800)
/*
* DMA related macros