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