summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-11-30 21:35:03 +0000
committermav <mav@FreeBSD.org>2015-11-30 21:35:03 +0000
commitca1a83860131c9acaa67752d46463dd6d29831f4 (patch)
tree25612c6a5320ac478e2f9d6a3f781a26558c55c7 /sys/dev/isp
parent487d55768402ce3dbed9cf783107b318b584f1d4 (diff)
downloadFreeBSD-src-ca1a83860131c9acaa67752d46463dd6d29831f4.zip
FreeBSD-src-ca1a83860131c9acaa67752d46463dd6d29831f4.tar.gz
MFC r290978: Add real initial support for RQSTYPE_RPT_ID_ACQ.
Diffstat (limited to 'sys/dev/isp')
-rw-r--r--sys/dev/isp/isp.c29
-rw-r--r--sys/dev/isp/isp_library.c15
-rw-r--r--sys/dev/isp/ispmbox.h23
3 files changed, 33 insertions, 34 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 9b8ce72..09e8562 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -6192,6 +6192,9 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
static int
isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *optrp)
{
+ isp_ridacq_t rid;
+ int chan, c;
+
switch (type) {
case RQSTYPE_STATUS_CONT:
isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
@@ -6199,6 +6202,23 @@ isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *opt
case RQSTYPE_MARKER:
isp_prt(isp, ISP_LOG_WARN1, "Marker Response");
return (1);
+ case RQSTYPE_RPT_ID_ACQ:
+ isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid);
+ if (rid.ridacq_format == 0) {
+ for (chan = 0; chan < isp->isp_nchan; chan++) {
+ fcparam *fcp = FCPARAM(isp, chan);
+ if (fcp->role == ISP_ROLE_NONE)
+ continue;
+ c = (chan == 0) ? 127 : (chan - 1);
+ if (rid.ridacq_map[c / 16] & (1 << (c % 16)))
+ isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
+ chan, ISPASYNC_CHANGE_OTHER);
+ }
+ } else {
+ isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
+ rid.ridacq_vp_index, ISPASYNC_CHANGE_OTHER);
+ }
+ return (1);
case RQSTYPE_ATIO:
case RQSTYPE_CTIO:
case RQSTYPE_ENABLE_LUN:
@@ -6219,15 +6239,6 @@ isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *opt
}
#endif
/* FALLTHROUGH */
- case RQSTYPE_RPT_ID_ACQ:
- if (IS_24XX(isp)) {
- isp_ridacq_t rid;
- isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid);
- if (rid.ridacq_format == 0) {
- }
- return (1);
- }
- /* FALLTHROUGH */
case RQSTYPE_REQUEST:
default:
ISP_DELAY(100);
diff --git a/sys/dev/isp/isp_library.c b/sys/dev/isp/isp_library.c
index fa1fa8f..8ddd444 100644
--- a/sys/dev/isp/isp_library.c
+++ b/sys/dev/isp/isp_library.c
@@ -1733,6 +1733,10 @@ isp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
int i;
isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
+ ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
+ ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
+ ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
+ ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
@@ -1742,17 +1746,6 @@ isp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
}
- if (dst->ridacq_format == 0) {
- ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_acquired, dst->un.type0.ridacq_vp_acquired);
- ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_setup, dst->un.type0.ridacq_vp_setup);
- ISP_IOXGET_16(isp, &src->un.type0.ridacq_reserved0, dst->un.type0.ridacq_reserved0);
- } else if (dst->ridacq_format == 1) {
- ISP_IOXGET_16(isp, &src->un.type1.ridacq_vp_count, dst->un.type1.ridacq_vp_count);
- ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_index, dst->un.type1.ridacq_vp_index);
- ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_status, dst->un.type1.ridacq_vp_status);
- } else {
- ISP_MEMZERO(&dst->un, sizeof (dst->un));
- }
}
diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h
index 25b57d5..83631cd 100644
--- a/sys/dev/isp/ispmbox.h
+++ b/sys/dev/isp/ispmbox.h
@@ -1485,18 +1485,10 @@ typedef struct {
typedef struct {
isphdr_t ridacq_hdr;
uint32_t ridacq_handle;
- union {
- struct {
- uint8_t ridacq_vp_acquired;
- uint8_t ridacq_vp_setup;
- uint16_t ridacq_reserved0;
- } type0; /* type 0 */
- struct {
- uint16_t ridacq_vp_count;
- uint8_t ridacq_vp_index;
- uint8_t ridacq_vp_status;
- } type1; /* type 1 */
- } un;
+ uint8_t ridacq_vp_acquired;
+ uint8_t ridacq_vp_setup;
+ uint8_t ridacq_vp_index;
+ uint8_t ridacq_vp_status;
uint16_t ridacq_vp_port_lo;
uint8_t ridacq_vp_port_hi;
uint8_t ridacq_format; /* 0 or 1 */
@@ -1506,8 +1498,11 @@ typedef struct {
#define RIDACQ_STS_COMPLETE 0
#define RIDACQ_STS_UNACQUIRED 1
-#define RIDACQ_STS_CHANGED 20
-
+#define RIDACQ_STS_CHANGED 2
+#define RIDACQ_STS_SNS_TIMEOUT 3
+#define RIDACQ_STS_SNS_REJECTED 4
+#define RIDACQ_STS_SCR_TIMEOUT 5
+#define RIDACQ_STS_SCR_REJECTED 6
/*
* Simple Name Server Data Structures
OpenPOWER on IntegriCloud