summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2016-08-18 11:37:38 +0000
committermav <mav@FreeBSD.org>2016-08-18 11:37:38 +0000
commitaa022ff209f2d21e6459063af08cdc61df1aba6d (patch)
tree1c2900d9a9ce34ffde989c4044132a34455f6577
parent41a9feef3f0324d87afa2836b00ab426e87dbdd8 (diff)
downloadFreeBSD-src-aa022ff209f2d21e6459063af08cdc61df1aba6d.zip
FreeBSD-src-aa022ff209f2d21e6459063af08cdc61df1aba6d.tar.gz
MFC r300222: Fix delaying requests to unknown virtual ports 2s after init.
This code was originally implemented 7 years ago, but never really worked due to trivial error. I think this functionality may be not required. Initiators supporting optional periodic command status checks detected those terminated commands and retried them 3 seconds later. But thinking about less featured initiators and the fact that it is our race makes virtual ports "unknown" it may be good to have this feature.
-rw-r--r--sys/dev/isp/isp.c5
-rw-r--r--sys/dev/isp/isp_freebsd.c2
2 files changed, 6 insertions, 1 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index aa36453..9d38f60 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -2431,6 +2431,7 @@ isp_fc_enable_vp(ispsoftc_t *isp, int chan)
__func__, chan, vp.vp_mod_hdr.rqs_flags, vp.vp_mod_status);
return (EIO);
}
+ GET_NANOTIME(&isp->isp_init_time);
return (0);
}
@@ -5865,6 +5866,7 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
* These are broadcast events that have to be sent across
* all active channels.
*/
+ GET_NANOTIME(&isp->isp_init_time);
for (chan = 0; chan < isp->isp_nchan; chan++) {
fcp = FCPARAM(isp, chan);
int topo = fcp->isp_topo;
@@ -5921,6 +5923,7 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
* This is a broadcast event that has to be sent across
* all active channels.
*/
+ GET_NANOTIME(&isp->isp_init_time);
for (chan = 0; chan < isp->isp_nchan; chan++) {
fcp = FCPARAM(isp, chan);
if (fcp->role == ISP_ROLE_NONE)
@@ -5964,6 +5967,7 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
* This is a broadcast event that has to be sent across
* all active channels.
*/
+ GET_NANOTIME(&isp->isp_init_time);
for (chan = 0; chan < isp->isp_nchan; chan++) {
fcp = FCPARAM(isp, chan);
if (fcp->role == ISP_ROLE_NONE)
@@ -6162,6 +6166,7 @@ isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *opt
portid = (uint32_t)rid.ridacq_vp_port_hi << 16 |
rid.ridacq_vp_port_lo;
if (rid.ridacq_format == 0) {
+ GET_NANOTIME(&isp->isp_init_time);
for (chan = 0; chan < isp->isp_nchan; chan++) {
fcparam *fcp = FCPARAM(isp, chan);
if (fcp->role == ISP_ROLE_NONE)
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index c6b8dc4..4400cde 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -2055,7 +2055,7 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep)
* It's a bit tricky here as we need to stash this command *somewhere*.
*/
GET_NANOTIME(&now);
- if (NANOTIME_SUB(&isp->isp_init_time, &now) > 2000000000ULL) {
+ if (NANOTIME_SUB(&now, &isp->isp_init_time) > 2000000000ULL) {
isp_prt(isp, ISP_LOGWARN, "%s: [RX_ID 0x%x] D_ID %x not found on any channel- dropping", __func__, aep->at_rxid, did);
isp_endcmd(isp, aep, NIL_HANDLE, ISP_NOCHAN, ECMD_TERMINATE, 0);
return;
OpenPOWER on IntegriCloud