Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Apr 2012 16:33:07 +0000 (UTC)
From:      Jim Harris <jimharris@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r233786 - stable/7/sys/dev/isci
Message-ID:  <201204021633.q32GX7pp006004@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jimharris
Date: Mon Apr  2 16:33:07 2012
New Revision: 233786
URL: http://svn.freebsd.org/changeset/base/233786

Log:
  MFC r233622:
  
  Ensure consistent target IDs for direct-attached devices.
  
  Sponsored by: Intel
  Reported by: sbruno, Ravi Pokala <rpokala at panasas dot com>
  Tested by: Ravi Pokala <rpokala at panasas dot com>
  Approved by: sbruno

Modified:
  stable/7/sys/dev/isci/isci.h
  stable/7/sys/dev/isci/isci_controller.c
  stable/7/sys/dev/isci/isci_domain.c
Directory Properties:
  stable/7/sys/   (props changed)

Modified: stable/7/sys/dev/isci/isci.h
==============================================================================
--- stable/7/sys/dev/isci/isci.h	Mon Apr  2 16:31:53 2012	(r233785)
+++ stable/7/sys/dev/isci/isci.h	Mon Apr  2 16:33:07 2012	(r233786)
@@ -89,10 +89,10 @@ struct ISCI_REMOTE_DEVICE {
 };
 
 struct ISCI_DOMAIN {
-	struct ISCI_CONTROLLER	*controller;
-	SCI_DOMAIN_HANDLE_T	sci_object;
-	uint8_t			index;
-
+	struct ISCI_CONTROLLER		*controller;
+	SCI_DOMAIN_HANDLE_T		sci_object;
+	uint8_t				index;
+	struct ISCI_REMOTE_DEVICE	*da_remote_device;
 };
 
 struct ISCI_MEMORY

Modified: stable/7/sys/dev/isci/isci_controller.c
==============================================================================
--- stable/7/sys/dev/isci/isci_controller.c	Mon Apr  2 16:31:53 2012	(r233785)
+++ stable/7/sys/dev/isci/isci_controller.c	Mon Apr  2 16:33:07 2012	(r233786)
@@ -430,7 +430,18 @@ int isci_controller_allocate_memory(stru
 		remote_device->frozen_lun_mask = 0;
 		sci_fast_list_element_init(remote_device,
 		    &remote_device->pending_device_reset_element);
-		sci_pool_put(controller->remote_device_pool, remote_device);
+
+		/*
+		 * For the first SCI_MAX_DOMAINS device objects, do not put
+		 *  them in the pool, rather assign them to each domain.  This
+		 *  ensures that any device attached directly to port "i" will
+		 *  always get CAM target id "i".
+		 */
+		if (i < SCI_MAX_DOMAINS)
+			controller->domain[i].da_remote_device = remote_device;
+		else
+			sci_pool_put(controller->remote_device_pool,
+			    remote_device);
 		remote_device_memory_ptr += remote_device_size;
 	}
 

Modified: stable/7/sys/dev/isci/isci_domain.c
==============================================================================
--- stable/7/sys/dev/isci/isci_domain.c	Mon Apr  2 16:31:53 2012	(r233785)
+++ stable/7/sys/dev/isci/isci_domain.c	Mon Apr  2 16:33:07 2012	(r233786)
@@ -202,10 +202,14 @@ scif_cb_domain_da_device_added(SCI_CONTR
 	struct ISCI_REMOTE_DEVICE *remote_device;
 	struct ISCI_DOMAIN *isci_domain =
 	    (struct ISCI_DOMAIN *)sci_object_get_association(domain);
-	struct ISCI_CONTROLLER *isci_controller =
-	    (struct ISCI_CONTROLLER *)sci_object_get_association(controller);
 
-	sci_pool_get(isci_controller->remote_device_pool, remote_device);
+	/*
+	 * For direct-attached devices, do not pull the device object from
+	 *  the pool.  Rather, use the one stored in the domain object which
+	 *  will ensure that we always get consistent target ids for direct
+	 *  attached devices.
+	 */
+	remote_device = isci_domain->da_remote_device;
 
 	scif_remote_device_construct(domain,
 	    (uint8_t*)remote_device + sizeof(struct ISCI_REMOTE_DEVICE),
@@ -287,6 +291,8 @@ scif_cb_domain_device_removed(SCI_CONTRO
 {
 	struct ISCI_REMOTE_DEVICE *isci_remote_device =
 	    (struct ISCI_REMOTE_DEVICE *)sci_object_get_association(remote_device);
+	struct ISCI_DOMAIN *isci_domain =
+	    (struct ISCI_DOMAIN *)sci_object_get_association(domain);
 	struct ISCI_CONTROLLER *isci_controller =
 	    (struct ISCI_CONTROLLER *)sci_object_get_association(controller);
 	uint32_t path = cam_sim_path(isci_controller->sim);
@@ -301,7 +307,13 @@ scif_cb_domain_device_removed(SCI_CONTRO
 
 	scif_remote_device_destruct(remote_device);
 
-	sci_pool_put(isci_controller->remote_device_pool, isci_remote_device);
+	/*
+	 * Only put the remote device back into the pool if it was an
+	 *  expander-attached device.
+	 */
+	if (isci_remote_device != isci_domain->da_remote_device)
+		sci_pool_put(isci_controller->remote_device_pool,
+		    isci_remote_device);
 }
 
 void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204021633.q32GX7pp006004>