+1

-- mark

On Nov 2, 2008, at 7:24 PM, Christopher Horne <cth at sac.sfbay.sun.com>  
wrote:

> I am sponsoring the following fasttrack for myself.  Micro/patch
> binding is requested. The timer is set to expire on Nov. 12 2008.
>
> -Chris
>
> 1. Introduction
>    1.1. Project/Component Working Name:
>         SCSI_HBA_ADDR_COMPLEX SCSA data structure linkage
>    1.2. Name of Document Author/Supplier:
>         Author:  Chris Horne
>    1.3. Date of This Document:
>     Thu Oct 23 2008
>
> 4. Technical Description
>
> 4.1 Background:
>
>   Initial Sun Common SCSI Architecture (SCSA) data structures were
>   designed to support copper scsi addressing, where both the target
>   and lun numbers were small integers. In this model, an HBA driver
>   was expected to maintain per-scsi_device(9S) HBA private data inside
>   an array embedded in the HBA's initiator port soft state. This
>   array, indexed by the scsi_address(9S) a_target and a_lun(9S)
>   fields, was dimensioned by the maximum target and lun numbers
>   supported by the HBA driver.
>
>   The limitation of this approach was exposed by transports such as
>   fiber-channel, and overcoming the limitation was complicated by the
>   fact that a scsi_address(9S) is embedded at the base of two
>   well-know SCSA data structures: both the scsi_device(9S) structure
>   and the scsi_pkt(9S) structure.
>
>   To solve this problem, interfaces were needed to allow an HBA driver
>   to maintain and access per-scsi_device(9S) HBA private data, given
>   only the scsi_address(9S) information of an allocated scsi_pkt(9S)
>   (as established by a 'pkt->pkt_address = *ap;' structure assignment
>   off the scsi_init_pkt(9F)/tran_init_pkt(9E) implementation).
>
>   Given the SCSA environment and development constraints at the time,
>   'cloning' the scsi_hba_tran(9S) structure was an effective data
>   structure implementation approach (an expedient kludge that
>   minimized breakage, but wasted space).
>
>   Unfortunately, the 'clone' data structure implementation details
>   ended up being leaked as interfaces:
>
>     o  scsi_hba_attach(9E) SCSI_HBA_TRAN_CLONE flag.
>
>     o  scsi_hba_tran(9S) 'tran_sd' field, pointing to
>    scsi_device(9S).
>
>     o  scsi_hba_tran(9S) 'tran_tgt_private' field, used to implement
>    per-scsi_device(9S) HBA private data (inside the 'cloned'
>    scsi_hba_tran(9S) structure).
>
>   The first ARC references to SCSI_HBA_TRAN_CLONE is in [1], from
>   1993.  The oldest CR is 1156862 "scsi_hba: if cloning, passes wrong
>   transport structure to hba in tran_tgt_free", from the same
>   timeframe.  There is no ARC record introducing SCSI_HBA_TRAN_CLONE
>   as an interface, public or private: records go back to 1991.  It
>   seems to have just leaked into the DDI based on need.
>
> 4.2 Proposal:
>
>   This case proposes solving the same basic problem with interfaces
>   that minimize exposure of implementation artifacts. The proposed
>   interfaces are consolidation private, but future promotion is
>   expected (with future deprecation of the "clone" 'interfaces').
>
>   The new proposed interfaces are:
>
>     o  SCSI_HBA_ADDR_COMPLEX:
>
>    A scsi_hba_attach_setup(9E) caller can indicate that an
>    initiator port requires a 'complex' target/lun address space
>    representation the new SCSI_HBA_ADDR_COMPLEX flag. The
>    properties associated with a scsi_device(9S) target/lun
>    unit-address are available to the HBA at tran_tgt_init(9E)
>    time. The HBA driver can translate unit-address property values
>    into an appropriate private form, and store that information in
>    its per-scsi_device(9S) HBA private data.
>
>     o  scsi_device_hba_private_set(9F),
>    scsi_device_hba_private_set(9F):
>
>    A SCSI_HBA_ADDR_COMPLEX HBA can maintain/obtain
>    per-scsi_device(9S) HBA private data using
>    scsi_device_hba_private_set(9F) and
>    scsi_device_hba_private_get(9F).
>
>     o  scsi_address_device(9F):
>
>    A SCSI_HBA_ADDR_COMPLEX HBA can call scsi_address_device(9F) to
>    obtain a pointer to the scsi_device(9S) given a pointer to a
>    scsi_address(9S).
>
>    A SCSI_HBA_ADDR_COMPLEX HBA is expected to establish
>    per-scsi_device(9S) HBA private data in its tran_tgt_init(9E)
>    implementation, and free that HBA private data in its
>    tran_tgt_fini(9E) implementation.
>
>    In its tran_start(9E) implementation, SCSI_HBA_ADDR_COMPLEX HBA can
>    obtain its scsi_device(9S) pointer from the scsi_address(9S) by
>    calling scsi_address_device(9F). Once the HBA driver obtains the
>    scsi_device(9S) pointer, the per-scsi_device(9S) HBA private data
>    can be obtained using scsi_device_hba_private_get(9F).
>
>    At this point in time, implementing the proposed interfaces no
>    longer requires 'cloning': the CRs that required 'cloning' [3] have
>    now been resolved.  The new implementation will be placing the SCSI
>    parallel interconnect (SPI) scsi_address(9S) fields (a_target,
>    a_lun) in a union, and in the SCSI_HBA_ADDR_COMPLEX case the union
>    will be a pointer to the scsi_device(9S) structure, with
>    per-scsi_device(9S) HBA private data maintained in the
>    scsi_device(9S) itself (sd_hba_private), instead of in a cloned
>    scsi_hba_tran(9S) structure.  Pictures (.gif) of the old and new
>    data structure linkage are provided in the materials directory.
>
>    While it would be possible to have the new (9F) interfaces function
>    correctly for the SCSI_HBA_TRAN_CLONE case too, that is not
>    planned.
>
>    Having a single scsi_hba_tran(9S) structure per SCSI initiator_port
>    will be important for futute SCSA work, where the SCSA framework
>    will need to be enhanced to maintain new per-target_port
>    information.
>
>
> 4.3 Proposed Interfaces
>
>    ------------------------------------------------------------------
>    Interface Name        Comm.Level    Comments
>    ------------------------------------------------------------------
>
>      SCSI_HBA_ADDR_COMPLEX     Private         
> scsi_hba_attach_setup(9F)
>                        flag indicating HBA
>                        transport has 'complex'
>                        address space.
>
>      SCSI_HBA_ADDR_SPI        Private        default: HBA expects
>                        scsi_address(9S) in
>                        SCSI Parallel Interconnect
>                        form (a_target, a_lun).
>
>      SCSI_HBA_TRAN_CLONE    no-change    use discouraged.
>
>      scsi_address_device(9F)   Private         Given a pointer to a
>                        scsi_address(9S),
>                        return pointer to
>                        scsi_device(9S).
>
>
>      scsi_device_hba_private_get(9F) Private    per-scsi_device(9S)
>      scsi_device_hba_private_set(9F)        HBA private data
>                        interfaces.
>
>
>    Prototypes for new (9F) functions: common/sys/scsi/conf/device.h:
>
>    struct scsi_device *scsi_address_device(struct scsi_address *sa);
>    void   scsi_device_hba_private_set(struct scsi_device *sd, void  
> *data);
>    void   *scsi_device_hba_private_get(struct scsi_device *sd);
>
> 4.4 Man Pages
>
>    See Appendix A
>
> 4.4 Release Binding
>
>    Micro/patch binding is requested.
>
> 4.5 References
>
>
>    [1] PSARC/1993/259 SCSI HBA interface [Jerry Gilliam]
>    http://sac.sfbay/PSARC/1993/259
>    http://www.opensolaris.org/os/community/arc/caselog/PSARC/1993/259
>
>    [2] PSARC/1996/113 SCSA SCSI-3 enhancements [Sudershan Goyal]
>    http://sac.sfbay/PSARC/1996/113
>    http://www.opensolaris.org/os/community/arc/caselog/PSARC/1996/113
>
>    [3] CRs associated with scsi_address/scsi_device/scsi_pkt cleanup
>    6269673 scsi target drivers should not reference  
> scsi_address(4s)...
>    6657256 SCSA should detect scsi_pkt allocation violations
>    6695222 ata has dependency on scsi_device(9S) size
>    6755515 preparation for scsi_address being unionized
>    http://monaco.sfbay.sun.com/detail.jsf?cr=6269673,6657256,6695222,6755515
>
>
> 
> Appendix A:
>
> A.1: Changes to scsi_hba_attach_setup(9F)
> =========================================
>    :r!diff -U5 -w scsi_hba_attach_setup.9f.orig  
> scsi_hba_attach_setup.9f
>
> --- scsi_hba_attach_setup.9f.orig    Tue Oct 21 19:12:37 2008
> +++ scsi_hba_attach_setup.9f    Tue Oct 28 08:57:27 2008
> @@ -25,12 +25,14 @@
>
>      hba_lim         A pointer to a ddi_dma_lim(9S) structure.
>
>      hba_tran        A pointer to a scsi_hba_tran(9S) structure.
>
> -     hba_flags       Flag modifiers. The only defined flag  value
> -                     is SCSI_HBA_TRAN_CLONE.
> +     hba_flags       Flag modifiers. The only defined flag  values  
> are
> +             SCSI_HBA_ADDR_SPI, SCSI_HBA_ADDR_COMPLEX, and
> +             SCSI_HBA_TRAN_CLONE.  SCSI_HBA_TRAN_CLONE is
> +             obsolete, use SCSI_HBA_ADDR_COMPLEX instead.
>
>      hba_options     Optional features provided by the HBA driver
>                      for future extensions; must be NULL.
>
>      hba_dma_attr    A pointer to a ddi_dma_attr(9S) structure.
> @@ -55,10 +57,24 @@
>      scsi_hba_attach()  and   scsi_hba_attach_setup()   use   the
>      dev_bus_ops  field  in  the  dev_ops(9S) structure.  The HBA
>      driver should initialize this field to NULL  before  calling
>      scsi_hba_attach() or scsi_hba_attach_setup().
>
> +     A scsi_address(9S) unit-address form for a scsi_device(9S) is
> +     chosen based on whether SCSI_HBA_ADDR_SPI or  
> SCSI_HBA_ADDR_COMPLEX
> +     is requested in hba_flags.  Only one flag can be specified; if
> +     neither flag is specified SCSI_HBA_ADDR_SPI is assumed.  If
> +     SCSI_HBA_ADDR_SPI is selected then the a_target and a_lun fields
> +     of a scsi_address structure are established by the SCSA library
> +     code prior to tran_tgt_init(9E).  If SCSI_HBA_ADDR_COMPLEX is
> +     selected then the host adapter driver is expected to establish  
> an
> +     opaque private representation of device unit-address, based
> +     on property values, during tran_tgt_init(9E).  See  
> scsi_address(9S)
> +     for more detail.
> +
> +     The SCSI_HBA_TRAN_CLONE flag is also supported, but use
> +     of SCSI_HBA_ADDR_COMPLEX is prefered.
>      If  SCSI_HBA_TRAN_CLONE  is  requested  in  hba_flags,   the
>      hba_tran  structure  will  be  cloned  once  for each target
>      attached to the HBA. The cloning of the structure will occur
>      before  the  tran_tgt_init(9E) entry point is called to ini-
>      tialize a  target.  At  all  subsequent  HBA  entry  points,
> @@ -189,5 +205,9 @@
>      get device driver after scsi_hba_detach() is called.
>
>      The scsi_hba_attach() function is obsolete and will be  dis-
>      continued  in a future release. This function is replaced by
>      scsi_hba_attach_setup().
> +
> +     The use of SCSI_HBA_TRAN_CLONE is obsolete and will be
> +     discontinued in a future release, use SCSI_HBA_ADDR_COMPLEX
> +     instead.
>
> 
> =========================================
> A.2: Changes to scsi_address(9S)
>    :r!diff -U5 -w scsi_address.9s.orig scsi_address.9s
>
> --- scsi_address.9s.orig    Tue Oct 21 19:12:37 2008
> +++ scsi_address.9s    Mon Oct 27 20:34:36 2008
> @@ -8,45 +8,107 @@
>
>  INTERFACE LEVEL
>       Solaris architecture specific (Solaris DDI)
>
>  DESCRIPTION
> -      A scsi_address structure defines the  addressing  components
> -      for  a  SCSI target device. The address of the target device
> -      is separated into two components: target number and  logical
> -      unit  number.  The  two  addressing  components  are used to
> -      uniquely identify any type of  SCSI  device;  however,  most
> -      devices  can  be  addressed with the target component of the
> -      address.
> -
> -      In the case where only  the  target  component  is  used  to
> -      address the device, the logical unit should be set to  0. If
> -      the SCSI target device supports logical units, then the  HBA
> -      must  interpret  the  logical units field of the data struc-
> -      ture.
> -
> -      The pkt_address member of a scsi_pkt(9S) is  initialized  by
> -      scsi_init_pkt(9F).
> +      A scsi_address structure stores the host routing and device
> +      unit-address information necessary to reference a specific SCSI
> +      target device logical unit function.
> +
> +      Host routing information is used by the system to identify the
> +      HBA and initiator port.
> +
> +      Device unit-address information is SCSA's representation of the
> +      "@unit-address" portion of a SCSI target driver scsi_device  
> node
> +      in the the /devices tree. Separate portions of the device
> +      unit-address information define the target port address, the
> +      logical unit address on the target, and (optionally) a
> +      subfunction implemented by a logical unit. Device scsi_device
> +      unit-address information is used exclusively by the host  
> adapter
> +      driver (with the legacy exception of target drivers  
> communicating
> +      with SCSI Parallel Interconnect (SPI) SCSI-1 devices that embed
> +      SCSI logical unit addressing in the CDB).
> +
> +      Two forms of scsi_device unit-address representation are
> +      supported within the scsi_address structure: a host adapter
> +      driver chooses the form by its hba_flags argument to
> +      scsi_hba_attach_setup(9F):  SCSI_HBA_ADDR_SPI or
> +      SCSI_HBA_ADDR_COMPLEX. For SCSI interconnects that have a  
> complex
> +      scsi_device unit-address space, like fibre-channel,
> +      SCSI_HBA_ADDR_COMPLEX should be selected.  To support legacy  
> host
> +      adapter drivers that don't explicitly choose a form,
> +      SCSI_HBA_ADDR_SPI is assumed.
> +
> +      For host adapter drivers that choose SCSI_HBA_ADDR_SPI, two
> +      scsi_device unit-address portions, target number (a_target) and
> +      logical unit number (a_lun), are directly represented within  
> the
> +      scsi_address structure.
> +
> +      For host adapter drivers that choose SCSI_HBA_ADDR_COMPLEX, the
> +      tran_tgt_init(9E) implementation is expected to store a
> +      per-scsi_device(9S) HBA private data pointer, based on its
> +      interpretation of the scsi(9P) device unit-address properties,
> +      using scsi_device_hba_private_set(9F).  This approach allows  
> SCSI
> +      interconnects to have their own private scsi_device unit- 
> address
> +      representation, which is particularly important for the target
> +      portion of the unit-address, which is transport-specific.   
> During
> +      tran_start(9E), an HBA driver can locate the scsi_device(9S)
> +      structure using scsi_address_device(9F), and obtain the
> +      per-scsi_device(9S) HBA private data pointer using
> +      scsi_device_hba_private_get(9F).  The HBA private data should  
> be
> +      freed by tran_tgt_free(9E).
> +
> +      The pkt_address member of a scsi_pkt(9S) is initialized after
> +      scsi_init_pkt(9F) as a result of the host adapter driver
> +      performing a structure assignment in its tran_init_pkt(9E)
> +      implementation.
>
>  STRUCTURE MEMBERS
> -      scsi_hba_tran_t   *a_hba_tran;  /* Transport vectors for the  
> SCSI bus */
> -      ushort_t          a_target;     /* SCSI target id */
> -      uchar_t           a_lun;        /* SCSI logical unit */
> -
> -      a_hba_tran is a pointer to the controlling  HBA's  transport
> -      vector structure. The SCSA interface uses this field to pass
> -      any transport requests from the SCSI target  device  drivers
> -      to the HBA driver.
> -
> -      a_target is the target component of the SCSI address.
> -
> -      a_lun is the logical unit component of the SCSI address. The
> -      logical  unit  is  used to further distinguish a SCSI target
> -      device that supports multiple logical units  from  one  that
> -      does  not. The makecom(9F) family of functions use the a_lun
> -      field to set the logical unit field in  the  SCSI  CDB,  for
> -      compatibility with SCSI-1.
> +
> +      scsi_hba_tran_t   *a_hba_tran;    /* Transport vector */
> +      ushort_t        a_target;    /* SPI: SCSI target id */
> +      uchar_t        a_lun;        /* SPI: SCSI logical unit */
> +      scsi_device    *a_sd;        /* COMPLEX: pointer to  
> scsi_device */
> +
> +      a_hba_tran        Pointer to the controlling host adapter  
> driver
> +            transport vector structure. The SCSA interface
> +            uses this field to pass any transport requests
> +            from the SCSI target device drivers to the host
> +            adapter driver.
> +
> +      For SCSI_HBA_ADDR_COMPLEX:
> +
> +      a_sd          A pointer to the scsi_device(9S) structure.
> +            This field is set by SCSA library code.  An HBA
> +            driver should not access this field directly -
> +            use scsi_address_device(9F) instead.
> +
> +      For SCSI_HBA_ADDR_SPI:
> +
> +      a_target      target component of the device unit-address,
> +            limited to the range 0-65535).
> +
> +      a_lun         logical unit co

Reply via email to