aboutsummaryrefslogtreecommitdiff
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
parent29cbe944e9287c2e61928c456512d3990aaffdaa (diff)
downloadsrc-407abff6a445c8db335093868e9e7e70438c5901.tar.gz
src-407abff6a445c8db335093868e9e7e70438c5901.zip
isp(4): Add support for QLogic 28xx devices
This covers the following HBAs: ISP2812-based 64/32G Fibre Channel to PCIe Controller: QLE2770 Single Port 32GFC PCIe Gen4 x8 Adapter QLE2772 Dual Port 32GFC PCIe Gen4 x8 Adapter QLE2870 Single Port 64GFC PCIe Gen4 x8 Adapter QLE2872 Dual Port 64GFC PCIe Gen4 x8 Adapter ISP2814-based 64/32G Fibre Channel to PCIe Controller: QLE2774 Quad Port 32GFC PCIe Gen4 x16 Adapter QLE2874 Quad Port 64GFC PCIe Gen4 x16 Adapter While here, add required bits to support 64GB FC. Default framesize is set to 2048 for ISP28xx based HBAs for now. PR: 271062 Reviewed by: imp, mav Sponsored by: Technical University of Munich Pull Request: https://github.com/freebsd/freebsd-src/pull/726
-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