Page MenuHomeFreeBSD

Fix isp(4) CRN handling in some situations.
ClosedPublic

Authored by ken on Mar 5 2019, 9:47 PM.
Tags
None
Referenced Files
F102712006: D19472.diff
Sat, Nov 16, 5:24 AM
Unknown Object (File)
Thu, Nov 14, 4:22 PM
Unknown Object (File)
Oct 14 2024, 2:07 PM
Unknown Object (File)
Sep 30 2024, 5:54 PM
Unknown Object (File)
Sep 25 2024, 11:59 PM
Unknown Object (File)
Sep 25 2024, 7:17 AM
Unknown Object (File)
Sep 25 2024, 3:13 AM
Unknown Object (File)
Sep 25 2024, 1:05 AM
Subscribers

Details

Summary

The Command Reference Number (CRN) is part of the FC-Tape features
that we enable when talking to tape drives. It starts at 1, and
goes to 255 and wraps around to 1. There are a number of reset
type conditions that result in the CRN getting reset to 1. These
are detailed in section 4.10 (table 8) of the FCP-4r02b specification.

One of the conditions is when a PRLI (Process Login) is sent by
the initiator, and the Establish Image Pair bit is set in Word 0
of the PRLI.

Previously, the isp(4) driver core sent a notification via
isp_async() that the target had changed or stayed in place, but
there was no indication of whether a PRLI was sent and whether the
Establish Image Pair bit was set.

The result of this was that in some situations, notably
switching back and forth between a direct connection and a switch
connection to a tape drive, the isp(4) driver would fail to reset
the CRN in situations that require it according to the spec. When
the CRN isn't reset in a situation that requires it, the tape drive
then rejects every subsequent command that is sent to the drive.
It is assuming that the commands are being sent out of order.

So, modify the isp(4) driver to include Word 0 of the PRLI command
when it sends isp_async() notifications of target changes. Look at
the Establish Image Pair bit, and reset the CRN if that bit is set.

With this change, I am able to switch a tape drive back and forth
between a direct connection and a switch connection, and the isp(4)
driver resets the CRN when it should.

sys/dev/isp_stds.h:
Add bit definitions for PRLI Word 0.

sys/dev/ispmbox.h:
Add PRLI Word 0 to the port database type, isp_pdb_t.

sys/dev/ispvar.h
Add PRLI Word 0 to fcportdb_t.

sys/dev/isp.c:
Populate the new prli_word0 parameter in the port database.

In isp_pdb_add_update(), add a check to see if the
Establish Image Pair bit is set in PRLI Word 0. If it is,
then that is an additional reason to create a change
notification.

sys/dev/isp_freebsd.c:
In isp_async(), if the device changed or stayed, look at
PRLI Word 0 to see if the Establish Image Pair bit is set.
If it is, reset the CRN if we haven't already.

Test Plan
  1. Plug in a tape drive directly.
  2. mt status
  3. Unplug the tape drive, move to connect through switch.
  4. mt status

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 22904
Build 21990: arc lint + arc unit

Event Timeline

ken added a reviewer: trasz.
ken edited the summary of this revision. (Show Details)
This revision was not accepted when it landed; it landed in state Needs Review.Mar 11 2019, 2:21 PM
This revision was automatically updated to reflect the committed changes.