xref: /illumos-gate/usr/src/man/man9f/mac_register.9f (revision 496cffd8)
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.\"
123815c12aSRobert Mustacchi.\" Copyright (c) 2017, Joyent, Inc.
13*496cffd8SPeter Tribble.\" Copyright 2023 Peter Tribble
1452d2369aSRobert Mustacchi.\"
15*496cffd8SPeter Tribble.Dd July 17, 2023
1652d2369aSRobert Mustacchi.Dt MAC_REGISTER 9F
1752d2369aSRobert Mustacchi.Os
1852d2369aSRobert Mustacchi.Sh NAME
1952d2369aSRobert Mustacchi.Nm mac_register ,
2052d2369aSRobert Mustacchi.Nm mac_unregister
2152d2369aSRobert Mustacchi.Nd register and unregister a device driver from the MAC framework
2252d2369aSRobert Mustacchi.Sh SYNOPSIS
2352d2369aSRobert Mustacchi.In sys/mac_provider.h
2452d2369aSRobert Mustacchi.Ft int
2552d2369aSRobert Mustacchi.Fo mac_register
2652d2369aSRobert Mustacchi.Fa "mac_register_t *mregp"
2752d2369aSRobert Mustacchi.Fa "mac_handle_t *mhp"
2852d2369aSRobert Mustacchi.Fc
2952d2369aSRobert Mustacchi.Ft int
3052d2369aSRobert Mustacchi.Fo mac_unregister
3152d2369aSRobert Mustacchi.Fa "mac_handle_t mh"
3252d2369aSRobert Mustacchi.Fc
3352d2369aSRobert Mustacchi.Sh INTERFACE LEVEL
3452d2369aSRobert Mustacchiillumos DDI specific
3552d2369aSRobert Mustacchi.Sh PARAMETERS
3652d2369aSRobert Mustacchi.Bl -tag -width Fa
3752d2369aSRobert Mustacchi.It Fa mregp
3852d2369aSRobert MustacchiA pointer to a
3952d2369aSRobert Mustacchi.Xr mac_register 9S
4052d2369aSRobert Mustacchistructure allocated by calling
4152d2369aSRobert Mustacchi.Xr mac_alloc 9F
4252d2369aSRobert Mustacchiand filled in by the device driver.
4352d2369aSRobert Mustacchi.It Fa mhp
4452d2369aSRobert MustacchiA pointer to a driver-backed handle to the MAC framework.
4552d2369aSRobert Mustacchi.It Fa mh
4652d2369aSRobert MustacchiThe driver-backed handle to the MAC framework.
4752d2369aSRobert Mustacchi.El
4852d2369aSRobert Mustacchi.Sh DESCRIPTION
4952d2369aSRobert MustacchiThe
5052d2369aSRobert Mustacchi.Fn mac_register
5152d2369aSRobert Mustacchifunction is used to register an instance of a device driver with the
5252d2369aSRobert Mustacchi.Xr mac 9E
5372d3dbb9SYuri Pankovframework.
5472d3dbb9SYuri PankovUpon successfully calling the
5552d2369aSRobert Mustacchi.Fn mac_register
5652d2369aSRobert Mustacchifunction, the device will start having its
5752d2369aSRobert Mustacchi.Xr mac_callbacks 9S
5872d3dbb9SYuri Pankoventry points called.
5972d3dbb9SYuri PankovThe device driver should call this function during it's
6052d2369aSRobert Mustacchi.Xr attach 9E
6172d3dbb9SYuri Pankoventry point after the device has been configured and is set up.
6272d3dbb9SYuri PankovFor a more detailed explanation of the exact steps that the device driver
6352d2369aSRobert Mustacchishould take and where in the sequence of a driver's
6452d2369aSRobert Mustacchi.Xr attach 9E
6552d2369aSRobert Mustacchientry point this function should be called, see the
6652d2369aSRobert Mustacchi.Sx Registering with MAC
6752d2369aSRobert Mustacchisection of
6852d2369aSRobert Mustacchi.Xr mac 9E .
6952d2369aSRobert Mustacchi.Pp
7052d2369aSRobert MustacchiThe driver should provide a pointer to a
7152d2369aSRobert Mustacchi.Ft mac_handle_t
7252d2369aSRobert Mustacchistructure as the second argument to the
7352d2369aSRobert Mustacchi.Fn mac_register
7472d3dbb9SYuri Pankovfunction.
7572d3dbb9SYuri PankovThis handle will be used when the device driver needs to interact with the
7672d3dbb9SYuri Pankovframework in various ways throughout its life.
7772d3dbb9SYuri PankovIt is also where the driver gets the
7852d2369aSRobert Mustacchi.Fa mh
7952d2369aSRobert Mustacchiargument for calling the
8052d2369aSRobert Mustacchi.Fn mac_unregister
8172d3dbb9SYuri Pankovfunction.
8272d3dbb9SYuri PankovIt is recommended that the device driver keep the handle around in its soft
8372d3dbb9SYuri Pankovstate structure for a given instance.
8452d2369aSRobert Mustacchi.Pp
8552d2369aSRobert MustacchiIf the call to the
8652d2369aSRobert Mustacchi.Fn mac_register
8752d2369aSRobert Mustacchifunction fails, the device driver should unwind its
8852d2369aSRobert Mustacchi.Xr attach 9E
8952d2369aSRobert Mustacchientry point, tear down everything that it initialized, and ultimately
9052d2369aSRobert Mustacchireturn an error from its
9152d2369aSRobert Mustacchi.Xr attach 9E
9252d2369aSRobert Mustacchientry point.
9352d2369aSRobert Mustacchi.Pp
9452d2369aSRobert MustacchiIf the
9552d2369aSRobert Mustacchi.Xr attach 9E
9652d2369aSRobert Mustacchiroutine fails for some reason after the call to the
9752d2369aSRobert Mustacchi.Fn mac_register
9852d2369aSRobert Mustacchifunction has succeeded, then the driver should call the
9952d2369aSRobert Mustacchi.Fn mac_unregister
10052d2369aSRobert Mustacchifunction as part of unwinding all of its state.
10152d2369aSRobert Mustacchi.Pp
10252d2369aSRobert MustacchiWhen a driver is in its
10352d2369aSRobert Mustacchi.Xr detach 9E
10452d2369aSRobert Mustacchientry point, it should call the
10552d2369aSRobert Mustacchi.Fn mac_unregister
10652d2369aSRobert Mustacchifunction immediately after draining any of its transmit and receive
10752d2369aSRobert Mustacchiresources that might have been given to the rest of the operating system
10872d3dbb9SYuri Pankovthrough DMA binding.
10972d3dbb9SYuri PankovSee the
11052d2369aSRobert Mustacchi.Sx MBLKS AND DMA
11152d2369aSRobert Mustacchisection of
11252d2369aSRobert Mustacchi.Xr mac 9E
11372d3dbb9SYuri Pankovfor more information.
11472d3dbb9SYuri PankovThis should be done before the driver does any tearing down.
11572d3dbb9SYuri PankovThe call to the
11652d2369aSRobert Mustacchi.Fn mac_unregister
11772d3dbb9SYuri Pankovfunction may fail.
11872d3dbb9SYuri PankovThis may happen because the networking stack is still using the device.
11972d3dbb9SYuri PankovIn such a case, the driver should fail the call to
12052d2369aSRobert Mustacchi.Xr detach 9E
12152d2369aSRobert Mustacchiand return
12252d2369aSRobert Mustacchi.Sy DDI_FAILURE .
12352d2369aSRobert Mustacchi.Sh CONTEXT
12452d2369aSRobert MustacchiThe
12552d2369aSRobert Mustacchi.Fn mac_register
12652d2369aSRobert Mustacchifunction is generally only called from a driver's
12752d2369aSRobert Mustacchi.Xr attach 9E
12872d3dbb9SYuri Pankoventry point.
12972d3dbb9SYuri PankovThe
13052d2369aSRobert Mustacchi.Fn mac_unregister
13152d2369aSRobert Mustacchifunction is generally only called from a driver's
13252d2369aSRobert Mustacchi.Xr attach 9E
13352d2369aSRobert Mustacchiand
13452d2369aSRobert Mustacchi.Xr detach 9E
13572d3dbb9SYuri Pankoventry point.
13672d3dbb9SYuri PankovHowever, both functions may be called from either
13752d2369aSRobert Mustacchi.Sy user
13852d2369aSRobert Mustacchior
13952d2369aSRobert Mustacchi.Sy kernel
14052d2369aSRobert Mustacchicontext.
14152d2369aSRobert Mustacchi.Sh RETURN VALUES
14252d2369aSRobert MustacchiUpon successful completion, the
14352d2369aSRobert Mustacchi.Fn mac_register
14452d2369aSRobert Mustacchiand
14552d2369aSRobert Mustacchi.Fn mac_unregister
14652d2369aSRobert Mustacchifunctions both return
14752d2369aSRobert Mustacchi.Sy 0 .
14852d2369aSRobert MustacchiOtherwise, they return an error number.
14952d2369aSRobert Mustacchi.Sh EXAMPLES
15052d2369aSRobert MustacchiThe following example shows how a device driver might call the
15152d2369aSRobert Mustacchi.Fn mac_register
15252d2369aSRobert Mustacchifunction.
15352d2369aSRobert Mustacchi.Bd -literal
15452d2369aSRobert Mustacchi#include <sys/mac_provider.h>
15552d2369aSRobert Mustacchi#include <sys/mac_ether.h>
15652d2369aSRobert Mustacchi
15752d2369aSRobert Mustacchi/*
15852d2369aSRobert Mustacchi * The call to mac_register(9F) generally comes from the context of
15952d2369aSRobert Mustacchi * attach(9E). This function encapsulates setting up and initializing
16052d2369aSRobert Mustacchi * the mac_register_t structure and should be assumed to be called from
16152d2369aSRobert Mustacchi * attach.
16252d2369aSRobert Mustacchi *
16352d2369aSRobert Mustacchi * The exact set of callbacks and private properties will vary based
16452d2369aSRobert Mustacchi * upon the driver.
16552d2369aSRobert Mustacchi */
16652d2369aSRobert Mustacchi
16752d2369aSRobert Mustacchistatic char *example_priv_props[] = {
16852d2369aSRobert Mustacchi	"_rx_intr_throttle",
16952d2369aSRobert Mustacchi	"_tx_intr_throttle",
17052d2369aSRobert Mustacchi	NULL
17152d2369aSRobert Mustacchi};
17252d2369aSRobert Mustacchi
17352d2369aSRobert Mustacchistatic mac_callbacks_t example_m_callbacks = {
174c40d33beSPeter Tribble	.mc_callbacks = MC_GETCAPAB | MC_SETPROP | MC_GETPROP | MC_PROPINFO |
17552d2369aSRobert Mustacchi	    MC_IOCTL,
17652d2369aSRobert Mustacchi	.mc_start = example_m_start,
17752d2369aSRobert Mustacchi	.mc_stop = example_m_stop,
17852d2369aSRobert Mustacchi	.mc_setpromisc = example_m_setpromisc,
17952d2369aSRobert Mustacchi	.mc_multicst = example_m_multicst,
18052d2369aSRobert Mustacchi	.mc_unicst = example_m_unicst,
18152d2369aSRobert Mustacchi	.mc_tx = example_m_tx,
18252d2369aSRobert Mustacchi	.mc_ioctl = example_m_ioctl,
18352d2369aSRobert Mustacchi	.mc_getcapab = example_m_getcapab,
18452d2369aSRobert Mustacchi	.mc_getprop = example_m_getprop,
18552d2369aSRobert Mustacchi	.mc_setprop = example_m_setprop,
18652d2369aSRobert Mustacchi	.mc_propinfo = example_m_propinfo
18752d2369aSRobert Mustacchi};
18852d2369aSRobert Mustacchi
18952d2369aSRobert Mustacchistatic boolean_t
19052d2369aSRobert Mustacchiexample_register_mac(example_t *ep)
19152d2369aSRobert Mustacchi{
19252d2369aSRobert Mustacchi	int status;
19352d2369aSRobert Mustacchi	mac_register_t *mac;
19452d2369aSRobert Mustacchi
19552d2369aSRobert Mustacchi	mac = mac_alloc(MAC_VERSION);
19652d2369aSRobert Mustacchi	if (mac == NULL)
19752d2369aSRobert Mustacchi		return (B_FALSE);
19852d2369aSRobert Mustacchi
1993815c12aSRobert Mustacchi	mac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
20052d2369aSRobert Mustacchi	mac->m_driver = ep;
20152d2369aSRobert Mustacchi	mac->m_dip = ep->ep_dev_info;
20252d2369aSRobert Mustacchi	mac->m_src_addr = ep->ep_mac_addr;
20352d2369aSRobert Mustacchi	mac->m_callbacks = &example_m_callbacks;
20452d2369aSRobert Mustacchi	mac->m_min_sdu = 0;
20552d2369aSRobert Mustacchi	mac->m_max_sdu = ep->ep_sdu;
20652d2369aSRobert Mustacchi	mac->m_margin = VLAN_TAGSZ;
207c40d33beSPeter Tribble	mac->m_priv_props = example_priv_props;
20852d2369aSRobert Mustacchi
20952d2369aSRobert Mustacchi	status = mac_register(mac, &ep->ep_mac_hdl);
21052d2369aSRobert Mustacchi	mac_free(mac);
21152d2369aSRobert Mustacchi
21252d2369aSRobert Mustacchi	return (status == 0);
21352d2369aSRobert Mustacchi}
21452d2369aSRobert Mustacchi.Ed
21552d2369aSRobert Mustacchi.Sh ERRORS
21652d2369aSRobert MustacchiThe
21752d2369aSRobert Mustacchi.Fn mac_register
21852d2369aSRobert Mustacchifunction may fail if:
21952d2369aSRobert Mustacchi.Bl -tag -width Er
22052d2369aSRobert Mustacchi.It EEXIST
22152d2369aSRobert MustacchiA driver with the same name and instance already exists.
22252d2369aSRobert Mustacchi.It EINVAL
22352d2369aSRobert MustacchiThere was something invalid with the device's registration information.
22452d2369aSRobert MustacchiSome of the following reasons may apply, this list is not exhaustive:
22552d2369aSRobert Mustacchi.Bl -bullet
22652d2369aSRobert Mustacchi.It
22752d2369aSRobert MustacchiThe
22852d2369aSRobert Mustacchi.Xr mac_init_ops 9F
22952d2369aSRobert Mustacchifunction was not called.
23052d2369aSRobert Mustacchi.It
23152d2369aSRobert MustacchiThe specified mac plugin does not exist.
23252d2369aSRobert Mustacchi.It
23352d2369aSRobert MustacchiAn invalid minor number was used.
23452d2369aSRobert Mustacchi.It
23552d2369aSRobert MustacchiThe default unicast source address was incorrect.
23652d2369aSRobert Mustacchi.It
23752d2369aSRobert MustacchiThe plugin specific private data was incorrect or missing.
23852d2369aSRobert Mustacchi.It
23952d2369aSRobert MustacchiPlugin specific data was provided when none is required.
24052d2369aSRobert Mustacchi.It
24152d2369aSRobert MustacchiRequired callback functions are not specified.
24252d2369aSRobert Mustacchi.It
24352d2369aSRobert MustacchiThe system was unable to properly create minor nodes.
24452d2369aSRobert Mustacchi.El
24552d2369aSRobert Mustacchi.It ENOSPC
24652d2369aSRobert MustacchiThe
24752d2369aSRobert Mustacchi.Xr mac 9E
24852d2369aSRobert Mustacchiframework was unable to allocate a minor number for the device as they
24952d2369aSRobert Mustacchihave all been exhausted.
25052d2369aSRobert Mustacchi.El
25152d2369aSRobert Mustacchi.Pp
25252d2369aSRobert MustacchiThe
25352d2369aSRobert Mustacchi.Fn mac_unregister
25452d2369aSRobert Mustacchifunction will fail if:
25552d2369aSRobert Mustacchi.Bl -tag -width Er
25652d2369aSRobert Mustacchi.It Er EBUSY
25752d2369aSRobert MustacchiThe device is still in use.
25852d2369aSRobert Mustacchi.It Er ENOTEMPTY
25952d2369aSRobert MustacchiThe flow table is not empty.
26052d2369aSRobert Mustacchi.El
26152d2369aSRobert Mustacchi.Pp
26252d2369aSRobert MustacchiNote the set of errors for both the
263*496cffd8SPeter Tribble.Fn mac_register
26452d2369aSRobert Mustacchiand
26552d2369aSRobert Mustacchi.Fn mac_unregister
26652d2369aSRobert Mustacchifunctions are not set in stone and may be expanded in future revisions.
26752d2369aSRobert MustacchiIn general, all errors should be handled by the device driver in similar
26852d2369aSRobert Mustacchiways for these functions.
26952d2369aSRobert Mustacchi.Sh SEE ALSO
27052d2369aSRobert Mustacchi.Xr attach 9E ,
27152d2369aSRobert Mustacchi.Xr detach 9E ,
27252d2369aSRobert Mustacchi.Xr mac 9E ,
27352d2369aSRobert Mustacchi.Xr mac_alloc 9F ,
27452d2369aSRobert Mustacchi.Xr mac_init_ops 9F ,
27552d2369aSRobert Mustacchi.Xr mac_callbacks 9S ,
27652d2369aSRobert Mustacchi.Xr mac_register 9S
277