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