summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp_library.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-11-30 21:28:53 +0000
committermav <mav@FreeBSD.org>2015-11-30 21:28:53 +0000
commitdd3696648f9f9878a9909079df05a51138263aba (patch)
tree2ae812169d9ef2d9a2f7f46a69c5331311f76a61 /sys/dev/isp/isp_library.c
parent15f2886919e644334022bc748e92133c58587795 (diff)
downloadFreeBSD-src-dd3696648f9f9878a9909079df05a51138263aba.zip
FreeBSD-src-dd3696648f9f9878a9909079df05a51138263aba.tar.gz
MFC r290104: Improve/fix loop scanning routine.
For the most of chips (except anscient ones) port handlers have no relation to port IDs. In such situation old code scanning first 125 handlers was quite naive. Instead of doing that, send to chip single request to get full list of port handlers available on specific virtual port and scan only them. Old code had problems with case of several virtual ports enabled, when port handlers allocated from global address space could easily go above 125. This change was successfully tested on 23xx, 24xx and 25xx chips in loop mode with 4 virtual initiator ports, each seing 50 virtual target ports.
Diffstat (limited to 'sys/dev/isp/isp_library.c')
-rw-r--r--sys/dev/isp/isp_library.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sys/dev/isp/isp_library.c b/sys/dev/isp/isp_library.c
index ee0206f..fa1fa8f 100644
--- a/sys/dev/isp/isp_library.c
+++ b/sys/dev/isp/isp_library.c
@@ -1646,6 +1646,44 @@ isp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
}
}
+void
+isp_get_pnhle_21xx(ispsoftc_t *isp, isp_pnhle_21xx_t *src, isp_pnhle_21xx_t *dst)
+{
+
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_hi_handle, dst->pnhle_port_id_hi_handle);
+}
+
+void
+isp_get_pnhle_23xx(ispsoftc_t *isp, isp_pnhle_23xx_t *src, isp_pnhle_23xx_t *dst)
+{
+
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
+ ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
+}
+
+void
+isp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
+{
+
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
+ ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
+ ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
+ ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
+}
+
+void
+isp_get_pnnle(ispsoftc_t *isp, isp_pnnle_t *src, isp_pnnle_t *dst)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ ISP_IOXGET_8(isp, &src->pnnle_name[i], dst->pnnle_name[i]);
+ ISP_IOXGET_16(isp, &src->pnnle_handle, dst->pnnle_handle);
+ ISP_IOXGET_16(isp, &src->pnnle_reserved, dst->pnnle_reserved);
+}
+
/*
* PLOGI/LOGO IOCB canonicalization
*/
OpenPOWER on IntegriCloud