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)OmniOS April 20, 2017 OmniOS