Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e452ceb6 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by James Bottomley
Browse files

[SCSI] Revert "[SCSI] qla2xxx: Avoid losing any fc ports when loop id's are exhausted."

parent f24b697b
Loading
Loading
Loading
Loading
+63 −20
Original line number Original line Diff line number Diff line
@@ -3159,7 +3159,7 @@ static int
qla2x00_configure_fabric(scsi_qla_host_t *vha)
qla2x00_configure_fabric(scsi_qla_host_t *vha)
{
{
	int	rval;
	int	rval;
	fc_port_t	*fcport;
	fc_port_t	*fcport, *fcptemp;
	uint16_t	next_loopid;
	uint16_t	next_loopid;
	uint16_t	mb[MAILBOX_REGISTER_COUNT];
	uint16_t	mb[MAILBOX_REGISTER_COUNT];
	uint16_t	loop_id;
	uint16_t	loop_id;
@@ -3197,7 +3197,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
		    0xfc, mb, BIT_1|BIT_0);
		    0xfc, mb, BIT_1|BIT_0);
		if (rval != QLA_SUCCESS) {
		if (rval != QLA_SUCCESS) {
			set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
			set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
			break;
			return rval;
		}
		}
		if (mb[0] != MBS_COMMAND_COMPLETE) {
		if (mb[0] != MBS_COMMAND_COMPLETE) {
			ql_dbg(ql_dbg_disc, vha, 0x2042,
			ql_dbg(ql_dbg_disc, vha, 0x2042,
@@ -3233,12 +3233,10 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
		if (rval != QLA_SUCCESS)
		if (rval != QLA_SUCCESS)
			break;
			break;


		/* Add new ports to existing port list */
		/*
		list_splice_tail_init(&new_fcports, &vha->vp_fcports);
		 * Logout all previous fabric devices marked lost, except

		 * FCP2 devices.
		/* Starting free loop ID. */
		 */
		next_loopid = ha->min_external_loopid;

		list_for_each_entry(fcport, &vha->vp_fcports, list) {
		list_for_each_entry(fcport, &vha->vp_fcports, list) {
			if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
			if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
				break;
				break;
@@ -3246,7 +3244,6 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
			if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
			if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
				continue;
				continue;


			/* Logout lost/gone fabric devices (non-FCP2) */
			if (fcport->scan_state != QLA_FCPORT_SCAN_FOUND &&
			if (fcport->scan_state != QLA_FCPORT_SCAN_FOUND &&
			    atomic_read(&fcport->state) == FCS_ONLINE) {
			    atomic_read(&fcport->state) == FCS_ONLINE) {
				qla2x00_mark_device_lost(vha, fcport,
				qla2x00_mark_device_lost(vha, fcport,
@@ -3260,30 +3257,76 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
					    fcport->d_id.b.domain,
					    fcport->d_id.b.domain,
					    fcport->d_id.b.area,
					    fcport->d_id.b.area,
					    fcport->d_id.b.al_pa);
					    fcport->d_id.b.al_pa);
					fcport->loop_id = FC_NO_LOOP_ID;
				}
				}
				continue;
				continue;
			}
			}
			fcport->scan_state = QLA_FCPORT_SCAN_NONE;
			fcport->scan_state = QLA_FCPORT_SCAN_NONE;
		}

		/* Starting free loop ID. */
		next_loopid = ha->min_external_loopid;

		/*
		 * Scan through our port list and login entries that need to be
		 * logged in.
		 */
		list_for_each_entry(fcport, &vha->vp_fcports, list) {
			if (atomic_read(&vha->loop_down_timer) ||
			    test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
				break;

			if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 ||
			    (fcport->flags & FCF_LOGIN_NEEDED) == 0)
				continue;


			/* Login fabric devices that need a login */
			if ((fcport->flags & FCF_LOGIN_NEEDED) != 0 &&
			    atomic_read(&vha->loop_down_timer) == 0) {
			if (fcport->loop_id == FC_NO_LOOP_ID) {
			if (fcport->loop_id == FC_NO_LOOP_ID) {
				fcport->loop_id = next_loopid;
				fcport->loop_id = next_loopid;
				rval = qla2x00_find_new_loop_id(
				rval = qla2x00_find_new_loop_id(
				    base_vha, fcport);
				    base_vha, fcport);
				if (rval != QLA_SUCCESS) {
				if (rval != QLA_SUCCESS) {
					/* Ran out of IDs to use */
					/* Ran out of IDs to use */
						continue;
					break;
				}
			}
			}
			/* Login and update database */
			qla2x00_fabric_dev_login(vha, fcport, &next_loopid);
		}
		}

		/* Exit if out of loop IDs. */
		if (rval != QLA_SUCCESS) {
			break;
		}

		/*
		 * Login and add the new devices to our port list.
		 */
		list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) {
			if (atomic_read(&vha->loop_down_timer) ||
			    test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
				break;

			/* Find a new loop ID to use. */
			fcport->loop_id = next_loopid;
			rval = qla2x00_find_new_loop_id(base_vha, fcport);
			if (rval != QLA_SUCCESS) {
				/* Ran out of IDs to use */
				break;
			}
			}


			/* Login and update database */
			/* Login and update database */
			qla2x00_fabric_dev_login(vha, fcport, &next_loopid);
			qla2x00_fabric_dev_login(vha, fcport, &next_loopid);

			list_move_tail(&fcport->list, &vha->vp_fcports);
		}
		}
	} while (0);
	} while (0);


	/* Free all new device structures not processed. */
	list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) {
		list_del(&fcport->list);
		kfree(fcport);
	}

	if (rval) {
	if (rval) {
		ql_dbg(ql_dbg_disc, vha, 0x2068,
		ql_dbg(ql_dbg_disc, vha, 0x2068,
		    "Configure fabric error exit rval=%d.\n", rval);
		    "Configure fabric error exit rval=%d.\n", rval);