xref: /illumos-gate/usr/src/man/man9e/mc_getcapab.9e (revision bbf215553c7233fbab8a0afdf1fac74c44781867)
152d2369aSRobert Mustacchi.\"
252d2369aSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
352d2369aSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
452d2369aSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
552d2369aSRobert Mustacchi.\" 1.0 of the CDDL.
652d2369aSRobert Mustacchi.\"
752d2369aSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
852d2369aSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
952d2369aSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
1052d2369aSRobert Mustacchi.\"
1152d2369aSRobert Mustacchi.\"
1252d2369aSRobert Mustacchi.\" Copyright 2016 Joyent, Inc.
1352d2369aSRobert Mustacchi.\"
1452d2369aSRobert Mustacchi.Dd June 02, 2016
1552d2369aSRobert Mustacchi.Dt MC_GETCAPAB 9E
1652d2369aSRobert Mustacchi.Os
1752d2369aSRobert Mustacchi.Sh NAME
1852d2369aSRobert Mustacchi.Nm mc_getcapab
1952d2369aSRobert Mustacchi.Nd get device capabilities
2052d2369aSRobert Mustacchi.Sh SYNOPSIS
2152d2369aSRobert Mustacchi.In sys/mac_provider.h
2252d2369aSRobert Mustacchi.Ft boolean_t
2352d2369aSRobert Mustacchi.Fo prefix_m_getcapab
2452d2369aSRobert Mustacchi.Fa "void *driver"
2552d2369aSRobert Mustacchi.Fa "mac_capab_t capab"
2652d2369aSRobert Mustacchi.Fa "void *cap_data"
2752d2369aSRobert Mustacchi.Fc
2852d2369aSRobert Mustacchi.Sh INTERFACE LEVEL
2952d2369aSRobert Mustacchiillumos DDI specific
3052d2369aSRobert Mustacchi.Sh PARAMETERS
3152d2369aSRobert Mustacchi.Bl -tag -width Fa
3252d2369aSRobert Mustacchi.It Fa driver
3352d2369aSRobert MustacchiA pointer to the driver's private data that was passed in via the
3452d2369aSRobert Mustacchi.Sy m_pdata
3552d2369aSRobert Mustacchimember of the
3652d2369aSRobert Mustacchi.Xr mac_register 9S
3752d2369aSRobert Mustacchistructure to the
3852d2369aSRobert Mustacchi.Xr mac_register 9F
3952d2369aSRobert Mustacchifunction.
4052d2369aSRobert Mustacchi.It Fa capab
4172d3dbb9SYuri PankovA value which indicates the capability being asked about.
4272d3dbb9SYuri PankovFor a full list of capabilities, see the
4352d2369aSRobert Mustacchi.Sx CAPABILITIES
4452d2369aSRobert Mustacchisection of
4552d2369aSRobert Mustacchi.Xr mac 9E .
4652d2369aSRobert Mustacchi.It Fa cap_data
4772d3dbb9SYuri PankovCapability specific data that may need to be filled in.
4872d3dbb9SYuri PankovThe type of data used is listed in the
4952d2369aSRobert Mustacchi.Sx CAPABILITIES
5052d2369aSRobert Mustacchisection of
5152d2369aSRobert Mustacchi.Xr mac 9E .
5252d2369aSRobert Mustacchi.El
5352d2369aSRobert Mustacchi.Sh DESCRIPTION
5452d2369aSRobert MustacchiThe
5552d2369aSRobert Mustacchi.Fn mc_getcapab
5652d2369aSRobert Mustacchientry point is called to determine whether or not a device supports a
5772d3dbb9SYuri Pankovspecific capability.
5872d3dbb9SYuri PankovThe capability in question is specified in
5952d2369aSRobert Mustacchi.Fa capab
6052d2369aSRobert Mustacchiand the list of possible capabilities is listed in the
6152d2369aSRobert Mustacchi.Sx CAPABILITIES
6252d2369aSRobert Mustacchisection of
6352d2369aSRobert Mustacchi.Xr mac 9E .
6452d2369aSRobert Mustacchi.Pp
6572d3dbb9SYuri PankovCapabilities are generally only queried once for a given device.
6672d3dbb9SYuri PankovAn instance of a device cannot change whether or not it supports a given
6752d2369aSRobert Mustacchicapability after it has been queried by the system.
6852d2369aSRobert Mustacchi.Pp
6952d2369aSRobert MustacchiEach capability has its own specific kind of data that a device driver
7072d3dbb9SYuri Pankovneeds to fill in as part of declaring that it supports a given capability.
7172d3dbb9SYuri PankovThat data is present in
7252d2369aSRobert Mustacchi.Fa cap_data .
7352d2369aSRobert MustacchiThe device driver should cast
7452d2369aSRobert Mustacchi.Fa cap_data
7572d3dbb9SYuri Pankovto the appropriate structure and fill it in.
7672d3dbb9SYuri PankovThe structures to use for a given capability are all listed in the
7752d2369aSRobert Mustacchi.Sx CAPABILITIES
7852d2369aSRobert Mustacchisection of
7952d2369aSRobert Mustacchi.Xr mac 9E .
8052d2369aSRobert Mustacchi.Pp
8152d2369aSRobert MustacchiThe return value is used to indicate whether or not a device driver
8272d3dbb9SYuri Pankovsupports the given capability.
8372d3dbb9SYuri PankovIf it does, then the device driver should return
8452d2369aSRobert Mustacchi.Sy B_TRUE
8552d2369aSRobert Mustacchiafter filling in
8652d2369aSRobert Mustacchi.Fa cap_data .
8752d2369aSRobert MustacchiOtherwise, whenever it encounters an unsupported or unknown capability,
8852d2369aSRobert Mustacchiit should return
8952d2369aSRobert Mustacchi.Sy B_FALSE .
9052d2369aSRobert MustacchiMany device drivers employ
9152d2369aSRobert Mustacchi.Sy switch
9252d2369aSRobert Mustacchistatements and return
9352d2369aSRobert Mustacchi.Sy B_FALSE
9472d3dbb9SYuri Pankovfrom their default case statement.
9572d3dbb9SYuri PankovThe system will present unknown capabilities to device drivers and they must
9672d3dbb9SYuri Pankovproperly return
9752d2369aSRobert Mustacchi.Sy B_FALSE .
9852d2369aSRobert Mustacchi.Pp
9952d2369aSRobert MustacchiThe driver has access to its soft state by casting the
10052d2369aSRobert Mustacchi.Fa driver
10172d3dbb9SYuri Pankovargument to the specific structure.
10272d3dbb9SYuri PankovThe device driver is responsible for any necessary locking.
10352d2369aSRobert Mustacchi.Pp
10472d3dbb9SYuri PankovMany capabilities are related to features of hardware.
10572d3dbb9SYuri PankovHowever, all hardware and firmware has the possibility of having bugs.
10672d3dbb9SYuri PankovIt is recommended that any capability that is supported have some form of
10752d2369aSRobert Mustacchitunable, whether in the form of a
10852d2369aSRobert Mustacchi.Sy MAC_PROP_PRIVATE
10952d2369aSRobert Mustacchidriver-specific property and/or a
110*bbf21555SRichard Lowe.Xr driver.conf 5
11172d3dbb9SYuri Pankovproperty to disable it.
11272d3dbb9SYuri PankovThis way when problems are discovered in the field, they can be worked around
11372d3dbb9SYuri Pankovwithout requiring initial changes to the device driver.
11452d2369aSRobert Mustacchi.Sh CONTEXT
11552d2369aSRobert MustacchiThis function is generally only called from
11652d2369aSRobert Mustacchi.Sy kernel
11752d2369aSRobert Mustacchicontext.
11852d2369aSRobert Mustacchi.Sh RETURN VALUES
11952d2369aSRobert MustacchiIf the device driver supports the specified capability
12052d2369aSRobert Mustacchi.Fa capab ,
12152d2369aSRobert Mustacchithen it should return
12252d2369aSRobert Mustacchi.Sy B_TRUE .
12352d2369aSRobert MustacchiOtherwise, it should return
12452d2369aSRobert Mustacchi.Sy B_FALSE .
12552d2369aSRobert Mustacchi.Sh EXAMPLES
12652d2369aSRobert MustacchiThe following example shows how a driver might structure its
12752d2369aSRobert Mustacchi.Fn mc_getcapab
12852d2369aSRobert Mustacchientry point.
12952d2369aSRobert Mustacchi.Bd -literal
13052d2369aSRobert Mustacchi#include <sys/types.h>
13152d2369aSRobert Mustacchi#include <sys/mac_provider.h>
13252d2369aSRobert Mustacchi
13352d2369aSRobert Mustacchi/*
13452d2369aSRobert Mustacchi * Note, this example merely shows the structure of the function. For
13552d2369aSRobert Mustacchi * the purpose of this example, we assume that we have a device which
13652d2369aSRobert Mustacchi * has members that indicate whether the various capabilities have been
13752d2369aSRobert Mustacchi * enabled and that they are read-only after the driver has had its
138b31ca922SChris Fraire * mc_start(9E) entry point called.
13952d2369aSRobert Mustacchi */
14052d2369aSRobert Mustacchi
14152d2369aSRobert Mustacchi#define	EXAMPLE_LSO_MAX		65535
14252d2369aSRobert Mustacchi
14352d2369aSRobert Mustacchistatic boolean_t
14452d2369aSRobert Mustacchiexample_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
14552d2369aSRobert Mustacchi{
14652d2369aSRobert Mustacchi	example_t *ep = arg;
14752d2369aSRobert Mustacchi
14852d2369aSRobert Mustacchi	switch (cap) {
14952d2369aSRobert Mustacchi	case MAC_CAPAB_HCKSUM: {
15052d2369aSRobert Mustacchi		uint32_t *txflags = cap_data;
15152d2369aSRobert Mustacchi
15252d2369aSRobert Mustacchi		/*
15352d2369aSRobert Mustacchi		 * The actual flags used here should be replaced with
15452d2369aSRobert Mustacchi		 * what the device actually supports. If the device
15552d2369aSRobert Mustacchi		 * doesn't support checksums, then this case statement
15652d2369aSRobert Mustacchi		 * shouldn't exist.
15752d2369aSRobert Mustacchi		 */
15852d2369aSRobert Mustacchi		*txflags = 0;
15952d2369aSRobert Mustacchi		if (ep->ep_tx_hcksum_enable == B_TRUE)
16052d2369aSRobert Mustacchi			*txflags = HCKSUM_IPHDRCKSUM;
16152d2369aSRobert Mustacchi		break;
16252d2369aSRobert Mustacchi	}
16352d2369aSRobert Mustacchi
16452d2369aSRobert Mustacchi	case MAC_CAPAB_LSO: {
16552d2369aSRobert Mustacchi		mac_capab_lso_t *lso = cap_data;
16652d2369aSRobert Mustacchi
16752d2369aSRobert Mustacchi		if (ep->ep_lso_enable == B_TRUE) {
16852d2369aSRobert Mustacchi			lso->lso_flags = LSO_TX_BASIC_TCP_IPV4;
16952d2369aSRobert Mustacchi			lso->lso_basic_tcp_ipv4.lso_max = EXAMPLE_LSO_MAX;
17052d2369aSRobert Mustacchi		} else {
17152d2369aSRobert Mustacchi			return (B_FALSE);
17252d2369aSRobert Mustacchi		}
17352d2369aSRobert Mustacchi		break;
17452d2369aSRobert Mustacchi	}
17552d2369aSRobert Mustacchi
17652d2369aSRobert Mustacchi	default:
17752d2369aSRobert Mustacchi		return (B_FALSE);
17852d2369aSRobert Mustacchi	}
17952d2369aSRobert Mustacchi
18052d2369aSRobert Mustacchi	return (B_TRUE);
18152d2369aSRobert Mustacchi}
18252d2369aSRobert Mustacchi.Ed
18352d2369aSRobert Mustacchi.Sh SEE ALSO
18452d2369aSRobert Mustacchi.Xr mac 9E ,
18552d2369aSRobert Mustacchi.Xr mac_register 9F ,
18652d2369aSRobert Mustacchi.Xr mac_register 9S
187