SAS_PHYMAP_CREATE(9F) Kernel Functions for Drivers SAS_PHYMAP_CREATE(9F)

NAME


sas_phymap_create, sas_phymap_destroy, sas_phymap_phy_add,
sas_phymap_phy_rem - SAS PHY map functions

SYNOPSIS


#include <sys/scsi/scsi.h>

int
sas_phymap_create(dev_info_t *dip, int settle_usec,
sas_phymap_mode_t mode, void *mode_argument, void *phymap_priv,
sas_phymap_activate_cb_t activate_cb,
sas_phymap_deactivate_cb_t deactivate_cb,
sas_phymap_t **phymapout);

void
sas_phymap_destroy(sas_phymap_t *phymap);

int
sas_phymap_phy_add(sas_phymap_t *phymap, int phy, uint64_t local,
uint64_t remote);

int
sas_phymap_phy_rem(sas_phymap_t *phymap, int phy);

void
(*sas_phymap_activate_cb_t)(void *phymap_priv, char *ua,
void **ua_privp);

void
(*sas_phymap_deactivate_cb_t)(void *phymap_priv, char *ua,
void *ua_priv);

INTERFACE LEVEL


Evolving - This interface is still evolving in illumos. API and ABI
stability is not guaranteed.

PARAMETERS


dip Pointer to dev_info structure.

settle_usec A time in microseconds.

mode Mode of operation for the phy map. Should be set to
PHYMAP_MODE_SIMPLE.

mode_priv Drivers should pass NULL.

phymap_priv A private argument to be used in callback functions.

activate_cb An optional callback that will be called when a new phy
is being added to the system.

deactivate_cb
An optional callback that will be called when an existing
phys is removed from the system.

phymapout Pointer where the phy map is stored.

phymap Pointer to an allocated phy map.

phy A non-negative integer that uniquely identifies a phy on
a device.

local The World Wide Number (WWN) of the HBA-owned side of the
phy.

remote The World Wide Number (WWN) of the device that is plugged
into the phy.

ua A character string that indicates the system generated
unit address for the logical port.

ua_privp A private value that can be stored for the corresponding
unit address.

ua_priv A private value for the unit address stored into
ua_privp.

DESCRIPTION


The sas_phymap_create() and sas_phymap_destroy() functions create and
destroy phymaps which are used to manage a set of potentially-active
SAS phys and the attached devices. For more background, see phymap(9).
If the driver in question is not a SAS HBA or a similar fabric-like
device, then do not use this interface.

The phy map maps one or more phys to a logical port-like construct that
is represented based on the WWNs in question. This logical SAS port
has a unit address derived from the two WWNs. When the first phy is
noted as using these WWNs, then the phymap will call any registered
callbacks as the port is created. If additional phys come online in
service of the same port, then a new port will not be created.

To facilitate the mapping between a PHY and the corresponding port unit
address, the sas_phymap_phy2ua(9F) and sas_phymap_lookup_ua(9F)
functions are available.

To create a phy map, the driver uses the sas_phymap_create() function.
The resulting phy map will be stored in the phymapout argument. The
value in settle_usec indicates the amount of time that the system
should wait to quiesce all changes and consider the resulting system
stable. Changes will not be reported until after settle_usec have
passed.

If a driver places a function pointer for either the activate_cb or
deactivate cb then those functions will be called when phys are added
and removed from the phy map.

The value placed in the phymap_priv argument will be passed to both
callback functions.

To destroy a phymap, the driver should call the sas_phymap_destroy()
function. A side effect of this is that all existing entries in the
phy map will be removed and their deactivate callbacks will fire.

Callbacks


The phymap provides a means for receiving callbacks when the addition
of a phy causes a new logical port to be created or when the phy being
removed is the last phy that is a member of the port. Unlike with the
tgtmap(9), there is no system managed driver that is attached with the
phymap. For the phymap to be useful to drivers, the callbacks should
generally be registered.

It's important to emphasize that the callbacks do not represent phys,
but instead the logical port that they are bound to. This is different
from the tgtmap(9) and iportmap(9). Calls to the sas_phymap_phy_add()
and sas_phymap_phy_rem() functions may not result in anything being
created in the system.

The activate_cb callback occurs whenever a new logical port is created
because the first phy that references that pair of WWNs has been
created. The phymap_priv argument corresponds to the value passed in
the sas_phymap_create() function.

The ua argument is a unit-address string that the system constructs
based on the WWNs passed in the local and remote arguments to the
sas_phymap_phy_add() function. If this is being used together with an
iportmap(9) then the ua should be the name of the added iport.

The ua_privp argument allows for data to be correlated with the unit-
address. This data is accessible throughout the lifetime of the unit-
address through the sas_phymap_lookup_uapriv(9F) function and is also
made available during the deactivate callback.

The deactivate_cb callback occurs when the logical port is being
removed, because the last associated phy has been removed. The
arguments to this are the same as to the activate callback, with the
exception that the ua_priv argument is the value that was stored in the
ua_privp argument of the activate callback.

Adding and Removing PHYs


To add a phy to the system, the driver should call the
sas_phymap_phy_add() function. The phy argument should indicate the
phy identifier of the phy that has come up. The local WWN generally
corresponds to the SAS port on the controller, while the remote WWN is
whatever device is on the other side of the phy. The system enforces
that a given phy only maps to a single port at any time.

When a phy goes offline, then the driver should call the
sas_phymap_phy_rem() function using the same phy identifier that it
used when adding the phy. If this is the last phy that was used for
this logical port, then the corresponding logical port will be removed
and the deactivate callback function, if registered, will be called.

CONTEXT


The sas_phymap_create() and sas_phymap_destroy() functions are
generally called during an HBA driver's attach(9E) and detach(9E) entry
points, though may be called by a driver from user or kernel context.

The optional activate_cb() and deactivate_cb() functions for a phymap
will be called into the driver from kernel context.

The sas_phymap_phy_add() and sas_phymap_phy_rem() functions may be
called from user or kernel context.

RETURN VALUES


Upon successful completion, the sas_phymap_create(),
sas_phymap_phy_add(), and sas_phymap_phy_rem() functions return
DDI_SUCCESS. Otherwise, DDI_FAILURE is returned to indicate failure.

SEE ALSO


iportmap(9), phymap(9), tgtmap(9), attach(9E), detach(9E),
sas_phymap_lookup_ua(9F), sas_phymap_lookup_uapriv(9F),
sas_phymap_phy2ua(9F)

illumos April 20, 2017 illumos

tribblix@gmail.com :: GitHub :: Privacy