From owner-svn-src-head@FreeBSD.ORG Wed Mar 28 18:38:13 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AF65F106571A; Wed, 28 Mar 2012 18:38:13 +0000 (UTC) (envelope-from jimharris@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9A0EE8FC15; Wed, 28 Mar 2012 18:38:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2SIcDcK049237; Wed, 28 Mar 2012 18:38:13 GMT (envelope-from jimharris@svn.freebsd.org) Received: (from jimharris@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2SIcDHe049233; Wed, 28 Mar 2012 18:38:13 GMT (envelope-from jimharris@svn.freebsd.org) Message-Id: <201203281838.q2SIcDHe049233@svn.freebsd.org> From: Jim Harris Date: Wed, 28 Mar 2012 18:38:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233622 - head/sys/dev/isci X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Mar 2012 18:38:13 -0000 Author: jimharris Date: Wed Mar 28 18:38:13 2012 New Revision: 233622 URL: http://svn.freebsd.org/changeset/base/233622 Log: Ensure consistent target IDs for direct-attached devices. Sponsored by: Intel Reported by: sbruno, Tested by: Reviewed by: scottl Approved by: scottl MFC after: 3 days Modified: head/sys/dev/isci/isci.h head/sys/dev/isci/isci_controller.c head/sys/dev/isci/isci_domain.c Modified: head/sys/dev/isci/isci.h ============================================================================== --- head/sys/dev/isci/isci.h Wed Mar 28 18:35:07 2012 (r233621) +++ head/sys/dev/isci/isci.h Wed Mar 28 18:38:13 2012 (r233622) @@ -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: head/sys/dev/isci/isci_controller.c ============================================================================== --- head/sys/dev/isci/isci_controller.c Wed Mar 28 18:35:07 2012 (r233621) +++ head/sys/dev/isci/isci_controller.c Wed Mar 28 18:38:13 2012 (r233622) @@ -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: head/sys/dev/isci/isci_domain.c ============================================================================== --- head/sys/dev/isci/isci_domain.c Wed Mar 28 18:35:07 2012 (r233621) +++ head/sys/dev/isci/isci_domain.c Wed Mar 28 18:38:13 2012 (r233622) @@ -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