changeset 8051:939c256309b2

6739576 PLOGI is not retried when busy response is returned
author Raghuram Prahlada <Raghuram.Prahlada@Sun.COM>
date Sun, 09 Nov 2008 23:30:42 -0800
parents 0e91549e4c09
children d956c9f73e59
files usr/src/uts/common/io/fibre-channel/impl/fp.c
diffstat 1 files changed, 50 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/fibre-channel/impl/fp.c	Sun Nov 09 22:43:46 2008 -0800
+++ b/usr/src/uts/common/io/fibre-channel/impl/fp.c	Sun Nov 09 23:30:42 2008 -0800
@@ -3229,33 +3229,60 @@
 	int 		rval = FC_FAILURE;
 	uchar_t		next_class;
 	fp_cmd_t 	*cmd;
+	fc_local_port_t *port;
 
 	cmd = pkt->pkt_ulp_private;
-
-	if (pkt->pkt_reason != FC_REASON_CLASS_NOT_SUPP) {
-		if (pkt->pkt_reason == FC_REASON_QFULL ||
-		    pkt->pkt_reason == FC_REASON_LOGICAL_BSY) {
+	port = cmd->cmd_port;
+
+	switch (pkt->pkt_state) {
+	case FC_PKT_FABRIC_RJT:
+	case FC_PKT_NPORT_RJT:
+		if (pkt->pkt_reason == FC_REASON_CLASS_NOT_SUPP) {
+			next_class = fp_get_nextclass(cmd->cmd_port,
+			    FC_TRAN_CLASS(pkt->pkt_tran_flags));
+
+			if (next_class == FC_TRAN_CLASS_INVALID) {
+				return (rval);
+			}
+			pkt->pkt_tran_flags = FC_TRAN_INTR | next_class;
+			pkt->pkt_tran_type = FC_PKT_EXCHANGE;
+
+			rval = fp_sendcmd(cmd->cmd_port, cmd,
+			    cmd->cmd_port->fp_fca_handle);
+
+			if (rval != FC_SUCCESS) {
+				pkt->pkt_state = FC_PKT_TRAN_ERROR;
+			}
+		}
+			break;
+
+	case FC_PKT_LS_RJT:
+	case FC_PKT_BA_RJT:
+		if ((pkt->pkt_reason == FC_REASON_LOGICAL_ERROR) ||
+		    (pkt->pkt_reason == FC_REASON_LOGICAL_BSY)) {
 			cmd->cmd_retry_interval = fp_retry_delay;
 			rval = fp_retry_cmd(pkt);
 		}
-
-		return (rval);
-	}
-
-	next_class = fp_get_nextclass(cmd->cmd_port,
-	    FC_TRAN_CLASS(pkt->pkt_tran_flags));
-
-	if (next_class == FC_TRAN_CLASS_INVALID) {
-		return (rval);
-	}
-	pkt->pkt_tran_flags = FC_TRAN_INTR | next_class;
-	pkt->pkt_tran_type = FC_PKT_EXCHANGE;
-
-	rval = fp_sendcmd(cmd->cmd_port, cmd,
-	    cmd->cmd_port->fp_fca_handle);
-
-	if (rval != FC_SUCCESS) {
-		pkt->pkt_state = FC_PKT_TRAN_ERROR;
+		break;
+
+	case FC_PKT_FS_RJT:
+		if (pkt->pkt_reason == FC_REASON_FS_LOGICAL_BUSY) {
+			cmd->cmd_retry_interval = fp_retry_delay;
+			rval = fp_retry_cmd(pkt);
+		}
+		break;
+
+	case FC_PKT_LOCAL_RJT:
+		if (pkt->pkt_reason == FC_REASON_QFULL) {
+			cmd->cmd_retry_interval = fp_retry_delay;
+			rval = fp_retry_cmd(pkt);
+		}
+		break;
+
+	default:
+		FP_TRACE(FP_NHEAD1(1, 0),
+		    "fp_handle_reject(): Invalid pkt_state");
+		break;
 	}
 
 	return (rval);
@@ -5671,6 +5698,7 @@
 		case FC_PKT_LOCAL_RJT:
 		case FC_PKT_LS_RJT:
 		case FC_PKT_FS_RJT:
+		case FC_PKT_BA_RJT:
 			rval = fp_handle_reject(pkt);
 			break;