1*59596c01SRobert Mustacchi.\" 2*59596c01SRobert Mustacchi.\" This file and its contents are supplied under the terms of the 3*59596c01SRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0. 4*59596c01SRobert Mustacchi.\" You may only use this file in accordance with the terms of version 5*59596c01SRobert Mustacchi.\" 1.0 of the CDDL. 6*59596c01SRobert Mustacchi.\" 7*59596c01SRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this 8*59596c01SRobert Mustacchi.\" source. A copy of the CDDL is also available via the Internet at 9*59596c01SRobert Mustacchi.\" http://www.illumos.org/license/CDDL. 10*59596c01SRobert Mustacchi.\" 11*59596c01SRobert Mustacchi.\" 12*59596c01SRobert Mustacchi.\" Copyright (c) 2017, Joyent, Inc. 13*59596c01SRobert Mustacchi.\" 14*59596c01SRobert Mustacchi.Dd Mar 24, 2017 15*59596c01SRobert Mustacchi.Dt MAC_CAPAB_TRANSCEIVER 9E 16*59596c01SRobert Mustacchi.Os 17*59596c01SRobert Mustacchi.Sh NAME 18*59596c01SRobert Mustacchi.Nm mac_capab_transciever , 19*59596c01SRobert Mustacchi.Nm mct_info , 20*59596c01SRobert Mustacchi.Nm mct_read 21*59596c01SRobert Mustacchi.Nd MAC capability for networking transceivers 22*59596c01SRobert Mustacchi.Sh SYNOPSIS 23*59596c01SRobert Mustacchi.In sys/mac_provider.h 24*59596c01SRobert Mustacchi.Vt typedef struct mac_capab_transceiver mac_capab_transceiver_t; 25*59596c01SRobert Mustacchi.Ft int 26*59596c01SRobert Mustacchi.Fo "mct_info" 27*59596c01SRobert Mustacchi.Fa "void *driver" 28*59596c01SRobert Mustacchi.Fa "uint_t id" 29*59596c01SRobert Mustacchi.Fa "mac_transceiver_info_t *infop" 30*59596c01SRobert Mustacchi.Fc 31*59596c01SRobert Mustacchi.Ft int 32*59596c01SRobert Mustacchi.Fo mct_read 33*59596c01SRobert Mustacchi.Fa "void *driver" 34*59596c01SRobert Mustacchi.Fa "uint_t id" 35*59596c01SRobert Mustacchi.Fa "uint_t page" 36*59596c01SRobert Mustacchi.Fa "void *buf" 37*59596c01SRobert Mustacchi.Fa "size_t nbytes" 38*59596c01SRobert Mustacchi.Fa "off_t offset" 39*59596c01SRobert Mustacchi.Fa "size_t *nread" 40*59596c01SRobert Mustacchi.Fc 41*59596c01SRobert Mustacchi.Sh INTERFACE LEVEL 42*59596c01SRobert Mustacchi.Sy Volatile - 43*59596c01SRobert MustacchiThis interface is still evolving in illumos. 44*59596c01SRobert MustacchiAPI and ABI stability is 45*59596c01SRobert Mustacchinot guaranteed. 46*59596c01SRobert Mustacchi.Sh PARAMETERS 47*59596c01SRobert Mustacchi.Bl -tag -width Fa 48*59596c01SRobert Mustacchi.It Fa driver 49*59596c01SRobert MustacchiA pointer to the driver's private data that was passed in via the 50*59596c01SRobert Mustacchi.Sy m_pdata 51*59596c01SRobert Mustacchimember of the 52*59596c01SRobert Mustacchi.Xr mac_register 9S 53*59596c01SRobert Mustacchistructure to the 54*59596c01SRobert Mustacchi.Xr mac_register 9F 55*59596c01SRobert Mustacchifunction. 56*59596c01SRobert Mustacchi.It Fa id 57*59596c01SRobert MustacchiAn integer value indicating which transceiver is being inquired about. 58*59596c01SRobert Mustacchi.It Fa infop 59*59596c01SRobert MustacchiAn opaque structure which is used to set information about the 60*59596c01SRobert Mustacchitransceiver. 61*59596c01SRobert Mustacchi.It Fa page 62*59596c01SRobert MustacchiA value that indicates which page from the i2c bus is being requested. 63*59596c01SRobert Mustacchi.It Fa buf 64*59596c01SRobert MustacchiA pointer to which data should be written to when reading from the 65*59596c01SRobert Mustacchidevice. 66*59596c01SRobert Mustacchi.It Fa nbytes 67*59596c01SRobert MustacchiA value indicating the number of bytes being asked to read into 68*59596c01SRobert Mustacchi.Fa buf . 69*59596c01SRobert Mustacchi.It Fa offset 70*59596c01SRobert MustacchiA value indicating the offset into the page to start reading data. 71*59596c01SRobert Mustacchi.It Fa nread 72*59596c01SRobert MustacchiA value to be updated by the driver with the number of successfully read 73*59596c01SRobert Mustacchibytes. 74*59596c01SRobert Mustacchi.El 75*59596c01SRobert Mustacchi.Sh DESCRIPTION 76*59596c01SRobert MustacchiThe 77*59596c01SRobert Mustacchi.Sy MAC_CAPAB_TRANSCEIVER 78*59596c01SRobert Mustacchicapability allows for GLDv3 networking device drivers to provide 79*59596c01SRobert Mustacchiinformation to the system about their transceiver. 80*59596c01SRobert MustacchiImplementing this capability is optional. 81*59596c01SRobert MustacchiFor more information on how to handle capabilities and how to indicate 82*59596c01SRobert Mustacchithat a capability is not supported, see 83*59596c01SRobert Mustacchi.Xr mc_getcapab 9E . 84*59596c01SRobert Mustacchi.Pp 85*59596c01SRobert MustacchiThis capability should be implemented if the device in question supports 86*59596c01SRobert Mustacchia Small Form Factor (SFF) transceiver. 87*59596c01SRobert MustacchiThese are more commonly known by names such as SFP, SFP+, SFP28, QSFP+, 88*59596c01SRobert Mustacchiand QSFP28. 89*59596c01SRobert MustacchiThis interface does not apply to traditional copper Ethernet phys. 90*59596c01SRobert MustacchiThese transceivers provide standardized information over the i2c bus at 91*59596c01SRobert Mustacchispecific pages. 92*59596c01SRobert Mustacchi.Ss Supported Standards 93*59596c01SRobert Mustacchi.Bl -tag -width Sy 94*59596c01SRobert Mustacchi.It Sy INF-8074 95*59596c01SRobert MustacchiThe 96*59596c01SRobert Mustacchi.Sy INF-8084 97*59596c01SRobert Mustacchistandard was the original multiple source agreement (MSA) for SFP 98*59596c01SRobert Mustacchidevices. 99*59596c01SRobert MustacchiIt proposed the original series of management pages at i2c page 0xa0. 100*59596c01SRobert MustacchiThis page contained up to 512 bytes, however, only the first 101*59596c01SRobert Mustacchi96 bytes are standardized. 102*59596c01SRobert MustacchiBytes 97 to 127 are reserved for the vendor. 103*59596c01SRobert MustacchiThe remaining bytes are reserved by the specification. 104*59596c01SRobert MustacchiThe management page was subsequently adopted by SFP+ devices. 105*59596c01SRobert Mustacchi.It Sy SFF-8472 106*59596c01SRobert MustacchiThe 107*59596c01SRobert Mustacchi.Sy SFF-8472 108*59596c01SRobert Mustacchistandard extended the original SFP MSA. 109*59596c01SRobert MustacchiThis standard added a second i2c page at 0xa2, while maintaining the 110*59596c01SRobert Mustacchioriginal page at 0xa0. 111*59596c01SRobert MustacchiThe page at 0xa0 is now explicitly 256 bytes. 112*59596c01SRobert MustacchiThe page at 0xa2 is also 256 bytes. 113*59596c01SRobert MustacchiThis standard was also adopted for all SFP28 parts, which are commonly 114*59596c01SRobert Mustacchiused in transceivers for 25 Gb/s Ethernet. 115*59596c01SRobert Mustacchi.It Sy SFF-8436 116*59596c01SRobert MustacchiThe 117*59596c01SRobert Mustacchi.Sy SFF-8436 118*59596c01SRobert Mustacchistandard was developed for QSFP+ transceivers, which involve the 119*59596c01SRobert Mustacchibonding of 4 SFP+ links. 120*59596c01SRobert MustacchiQSFP+ is commonly used in the transceivers for 40 Gb/s Ethernet. 121*59596c01SRobert MustacchiThis standard uses i2c page 0xa0 for read-only identification purposes. 122*59596c01SRobert MustacchiThe lower half of the page is used for control, while the upper 128 123*59596c01SRobert Mustacchibytes is similar to the 124*59596c01SRobert Mustacchi.Sy INF-8084 125*59596c01SRobert Mustacchiand 126*59596c01SRobert Mustacchi.Sy SFF-8472 127*59596c01SRobert Mustacchistandards. 128*59596c01SRobert Mustacchi.It Sy SFF-8636 129*59596c01SRobert MustacchiThe 130*59596c01SRobert Mustacchi.Sy SFF-8636 131*59596c01SRobert Mustacchistandard is a common management standard which is shared between both 132*59596c01SRobert MustacchiSAS and QSFP+ 28 Gb/s transceivers. 133*59596c01SRobert MustacchiThe latter transceiver is commonly found in 100 Gb/s Ethernet. 134*59596c01SRobert MustacchiThe transceiver's memory map is similar to that found in the 135*59596c01SRobert Mustacchi.Sy SFF-8436 136*59596c01SRobert Mustacchispecification. 137*59596c01SRobert MustacchiThe identification information is found in the upper 128 138*59596c01SRobert Mustacchibytes of page 0xa0, while the lower part of the page is used for 139*59596c01SRobert Mustacchicontrol, among other purposes. 140*59596c01SRobert Mustacchi.El 141*59596c01SRobert Mustacchi.Pp 142*59596c01SRobert MustacchiThe following table summarizes the above information. 143*59596c01SRobert Mustacchi.Bl -column "Sy SFF-8636" "1 Gb/s, 10 Gb/s, 25 Gb/s" "256 bytes" "0xa0, 0xa2" -offset indent 144*59596c01SRobert Mustacchi.Em "Standard" Ta Em Speeds Ta Em Size Ta Em i2c pages 145*59596c01SRobert Mustacchi.It INF-8074 Ta 1 Gb/s, 10 Gb/s Ta 128 bytes Ta 0xa0 146*59596c01SRobert Mustacchi.It SFF-8472 Ta 1 Gb/s, 10 Gb/s, 25 GB/s Ta 512 bytes Ta 0xa0, 0xa2 147*59596c01SRobert Mustacchi.It SFF-8436 Ta 40 Gb/s Ta 256 bytes Ta 0xa0 148*59596c01SRobert Mustacchi.It SFF-8636 Ta 100 Gb/s Ta 256 bytes Ta 0xa0 149*59596c01SRobert Mustacchi.El 150*59596c01SRobert Mustacchi.Ss MAC Capability Structure 151*59596c01SRobert MustacchiWhen the device driver's 152*59596c01SRobert Mustacchi.Xr mc_getcapab 9E 153*59596c01SRobert Mustacchifunction entry point is called with the capability requested set to 154*59596c01SRobert Mustacchi.Sy MAC_CAPAB_TRANSCEIVER , 155*59596c01SRobert Mustacchithen the value of the capability structure is the following structure: 156*59596c01SRobert Mustacchi.Bd -literal -offset indent 157*59596c01SRobert Mustacchitypedef struct mac_capab_transceiver { 158*59596c01SRobert Mustacchi uint_t mct_flags; 159*59596c01SRobert Mustacchi uint_t mct_ntransceiveres; 160*59596c01SRobert Mustacchi int (*mct_info)(void *driver, uint_t id, 161*59596c01SRobert Mustacchi mac_transceiver_info_t *infop), 162*59596c01SRobert Mustacchi int (*mct_read)(void *driver, uint_t id, uint_t page, 163*59596c01SRobert Mustacchi void *buf, size_t nbytes, off_t offset, 164*59596c01SRobert Mustacchi size_t *nread) 165*59596c01SRobert Mustacchi} mac_capab_transceiver_t; 166*59596c01SRobert Mustacchi.Ed 167*59596c01SRobert Mustacchi.Pp 168*59596c01SRobert MustacchiIf the device driver supports the 169*59596c01SRobert Mustacchi.Sy MAC_CAPAB_TRANSCEIVER 170*59596c01SRobert Mustacchicapability, it should fill in this structure, based on the following 171*59596c01SRobert Mustacchirules: 172*59596c01SRobert Mustacchi.Bl -tag -width Sy 173*59596c01SRobert Mustacchi.It Sy mct_flags 174*59596c01SRobert MustacchiThe 175*59596c01SRobert Mustacchi.Vt mct_flags 176*59596c01SRobert Mustacchimember is used to negotiate extensions with the driver. 177*59596c01SRobert MustacchiMAC will set the value of 178*59596c01SRobert Mustacchi.Vt mct_flags 179*59596c01SRobert Mustacchito include all of the currently known extensions. 180*59596c01SRobert MustacchiThe driver should intersect this list with the set that they actually 181*59596c01SRobert Mustacchisupport. 182*59596c01SRobert MustacchiAt this time, no such features are defined and the driver should set the 183*59596c01SRobert Mustacchimember to 184*59596c01SRobert Mustacchi.Sy 0 . 185*59596c01SRobert Mustacchi.It Sy mct_ntransceivers 186*59596c01SRobert MustacchiThe value of 187*59596c01SRobert Mustacchi.Sy mct_ntransceivers 188*59596c01SRobert Mustacchiindicates that the number of transceivers present in the device. 189*59596c01SRobert MustacchiFor most devices, it is expected that this value will be set to one. 190*59596c01SRobert MustacchiHowever, some devices do support multiple transceivers and PHYs that 191*59596c01SRobert Mustacchishow up behind a single logical MAC. 192*59596c01SRobert Mustacchi.Pp 193*59596c01SRobert MustacchiIt is expected that this value will not change across the lifetime of 194*59596c01SRobert Mustacchithe device being attached. 195*59596c01SRobert MustacchiIt is important to remember that this represents the total possible 196*59596c01SRobert Mustacchinumber of transceivers in the device, not how many are currently present 197*59596c01SRobert Mustacchiand powered on. 198*59596c01SRobert Mustacchi.Pp 199*59596c01SRobert MustacchiThe number of transceivers will influence the 200*59596c01SRobert Mustacchi.Fa id 201*59596c01SRobert Mustacchiargument used in the 202*59596c01SRobert Mustacchi.Fn mct_info 203*59596c01SRobert Mustacchiand 204*59596c01SRobert Mustacchi.Fn mct_read 205*59596c01SRobert Mustacchientry points. 206*59596c01SRobert MustacchiThe transceiver IDs will start at zero and go to the value of 207*59596c01SRobert Mustacchi.Fa mct_ntransceivers - 1 . 208*59596c01SRobert MustacchiIt is up to the driver to keep the mapping between actual transceivers 209*59596c01SRobert Mustacchiand the transceiver identifiers consistent. 210*59596c01SRobert Mustacchi.It Sy mct_info 211*59596c01SRobert MustacchiThe 212*59596c01SRobert Mustacchi.Fn mct_info 213*59596c01SRobert Mustacchientry point is used to set basic information about the transceiver. 214*59596c01SRobert MustacchiThis entry point is 215*59596c01SRobert Mustacchi.Em required . 216*59596c01SRobert MustacchiIf the device driver cannot implement this entry point, then it should 217*59596c01SRobert Mustacchinot indicate that it supports the capability. 218*59596c01SRobert Mustacchi.Pp 219*59596c01SRobert MustacchiThe 220*59596c01SRobert Mustacchi.Fn mct_info 221*59596c01SRobert Mustacchientry point should fill in information about the transceiver with an 222*59596c01SRobert Mustacchiidentifier of 223*59596c01SRobert Mustacchi.Fa id . 224*59596c01SRobert MustacchiSee the description above of 225*59596c01SRobert Mustacchi.Sy mct_ntransceivers 226*59596c01SRobert Mustacchifor more information on how the IDs are determined. 227*59596c01SRobert Mustacchi.Pp 228*59596c01SRobert MustacchiThe driver should then proceed to fill in basic information by calling 229*59596c01SRobert Mustacchithe functions described in the section 230*59596c01SRobert Mustacchi.Sx Information Functions . 231*59596c01SRobert MustacchiAfter successfully calling all of the functions, the driver should 232*59596c01SRobert Mustacchireturn 233*59596c01SRobert Mustacchi.Sy 0 . 234*59596c01SRobert MustacchiOthewrise, it should return the appropriate error number. 235*59596c01SRobert MustacchiFor a full list of error numbers, see 236*59596c01SRobert Mustacchi.Xr Intro 2 . 237*59596c01SRobert MustacchiCommon values are: 238*59596c01SRobert Mustacchi.Bl -tag -width Er -offset width 239*59596c01SRobert Mustacchi.It Er EINVAL 240*59596c01SRobert MustacchiThe transceiver identifier 241*59596c01SRobert Mustacchi.Fa id 242*59596c01SRobert Mustacchiwas invalid. 243*59596c01SRobert Mustacchi.It Er ENOTSUP 244*59596c01SRobert MustacchiThis instance of the devices does not support a transceiver. 245*59596c01SRobert MustacchiFor example, a device which sometimes has copper PHYs and therefore this 246*59596c01SRobert Mustacchiinstance does not have any PHYs. 247*59596c01SRobert Mustacchi.It Er EIO 248*59596c01SRobert MustacchiAn error occurred while trying to read device registers. 249*59596c01SRobert MustacchiFor example, an FM-aware device had an error. 250*59596c01SRobert Mustacchi.El 251*59596c01SRobert Mustacchi.It Sy mct_read 252*59596c01SRobert MustacchiThe 253*59596c01SRobert Mustacchi.Fn mct_read 254*59596c01SRobert Mustacchifunction is used to read information from a transceiver's i2c bus. 255*59596c01SRobert MustacchiThe 256*59596c01SRobert Mustacchi.Fn mct_read 257*59596c01SRobert Mustacchientry point is an 258*59596c01SRobert Mustacchi.Em optional 259*59596c01SRobert Mustacchientry point. 260*59596c01SRobert Mustacchi.Pp 261*59596c01SRobert MustacchiThe transceiver should first check the value of 262*59596c01SRobert Mustacchi.Fa id , 263*59596c01SRobert Mustacchiwhich indicates which transceiver information is being requested. 264*59596c01SRobert MustacchiSee the description above of 265*59596c01SRobert Mustacchi.Sy mct_ntransceivers 266*59596c01SRobert Mustacchifor more information on how the IDs are determined. 267*59596c01SRobert Mustacchi.Pp 268*59596c01SRobert MustacchiThe driver should try to read up to 269*59596c01SRobert Mustacchi.Fa nbytes 270*59596c01SRobert Mustacchiof data from the i2c bus at page 271*59596c01SRobert Mustacchi.Fa page . 272*59596c01SRobert MustacchiThe driver should start reading at offset 273*59596c01SRobert Mustacchi.Fa offset . 274*59596c01SRobert MustacchiFinally, it should update the value in 275*59596c01SRobert Mustacchi.Fa nread 276*59596c01SRobert Mustacchiwith the number of bytes written to the buffer 277*59596c01SRobert Mustacchi.Fa buf . 278*59596c01SRobert Mustacchi.Pp 279*59596c01SRobert MustacchiIf for some reason the driver cannot read all of the requested bytes, 280*59596c01SRobert Mustacchithat is acceptable. 281*59596c01SRobert MustacchiInstead it should perform a short read. 282*59596c01SRobert MustacchiThis may occur because the transceiver does not allow reads at a 283*59596c01SRobert Mustacchirequested region or the region is shorter than is common for most 284*59596c01SRobert Mustacchidevices. 285*59596c01SRobert Mustacchi.Pp 286*59596c01SRobert MustacchiUpon successful completion, the driver should ensure that 287*59596c01SRobert Mustacchi.Fa nread 288*59596c01SRobert Mustacchihas been updated and then return 289*59596c01SRobert Mustacchi.Sy 0 . 290*59596c01SRobert MustacchiOtherwise, the driver should return the appropriate error number. 291*59596c01SRobert MustacchiFor 292*59596c01SRobert Mustacchia full list of error numbers, see 293*59596c01SRobert Mustacchi.Xr Intro 2 . 294*59596c01SRobert MustacchiCommon values are: 295*59596c01SRobert Mustacchi.Bl -tag -width Er -offset width 296*59596c01SRobert Mustacchi.It Er EINVAL 297*59596c01SRobert MustacchiThe value of 298*59596c01SRobert Mustacchi.Fa id 299*59596c01SRobert Mustacchirepresented an invalid transceiver identifier. 300*59596c01SRobert MustacchiThe transceiver i2c page 301*59596c01SRobert Mustacchi.Fa page 302*59596c01SRobert Mustacchiis not valid for this type of device. 303*59596c01SRobert MustacchiThe value of 304*59596c01SRobert Mustacchi.Fa offset 305*59596c01SRobert Mustacchiis beyond the range supported for this 306*59596c01SRobert Mustacchi.Fa page . 307*59596c01SRobert Mustacchi.It Er EIO 308*59596c01SRobert MustacchiAn error occurred while trying to read the device i2c pages. 309*59596c01SRobert Mustacchi.El 310*59596c01SRobert Mustacchi.El 311*59596c01SRobert Mustacchi.Ss Transceiver Information Functions 312*59596c01SRobert MustacchiThe 313*59596c01SRobert Mustacchi.Fn mct_info 314*59596c01SRobert Mustacchientry point is the primary required entry point for a device driver 315*59596c01SRobert Mustacchiwhich supports this capability. 316*59596c01SRobert MustacchiThe information structure is opaque to the device driver. 317*59596c01SRobert MustacchiInstead, a series of informational functions is 318*59596c01SRobert Mustacchiavailable to the device driver to call on the transceiver. 319*59596c01SRobert MustacchiThe device drivers should try to call and fill in as many of these as 320*59596c01SRobert Mustacchipossible. 321*59596c01SRobert MustacchiThere are two different properties that a driver can set: 322*59596c01SRobert Mustacchi.Bl -enum -offset indent 323*59596c01SRobert Mustacchi.It 324*59596c01SRobert MustacchiWhether the transceiver is present. 325*59596c01SRobert Mustacchi.It 326*59596c01SRobert MustacchiWhether the transceiver is usable. 327*59596c01SRobert Mustacchi.El 328*59596c01SRobert Mustacchi.Pp 329*59596c01SRobert MustacchiTo set whether or not the transceiver is present, the driver should call 330*59596c01SRobert Mustacchi.Xr mac_transceiver_info_set_present 9F . 331*59596c01SRobert MustacchiThis is used to indicate whether the transceiver is plugged in or not. 332*59596c01SRobert MustacchiIf the transceiver is a part of the NIC, then this function should 333*59596c01SRobert Mustacchialways be called with the value set to 334*59596c01SRobert Mustacchi.Dv B_TRUE . 335*59596c01SRobert Mustacchi.Pp 336*59596c01SRobert MustacchiFinally, the driver has the ability to provide information about whether 337*59596c01SRobert Mustacchior not the transceiver is usable or not. 338*59596c01SRobert MustacchiA transceiver may be present, but not usable, if the hardware and 339*59596c01SRobert Mustacchifirmware support a limited number of transceivers. 340*59596c01SRobert MustacchiTo set this information, the driver should call 341*59596c01SRobert Mustacchi.Xr mac_transceiver_info_set_usable 9F . 342*59596c01SRobert MustacchiIf the transceiver is not present, then the driver should not call this 343*59596c01SRobert Mustacchifunction. 344*59596c01SRobert Mustacchi.Ss Opaque Transceivers 345*59596c01SRobert MustacchiSome devices abstract the nature of the transceiver and do not allow 346*59596c01SRobert Mustacchidirect access to the transceiver. 347*59596c01SRobert MustacchiIn this case, if the device driver still has access to enough 348*59596c01SRobert Mustacchiinformation to know if the transceiver is at least present, then it 349*59596c01SRobert Mustacchishould still implement the 350*59596c01SRobert Mustacchi.Fn mct_info 351*59596c01SRobert Mustacchientry point. 352*59596c01SRobert Mustacchi.Ss Locking and Data Access 353*59596c01SRobert MustacchiCalls to get information about the transceivers may come at the same 354*59596c01SRobert Mustacchitime as general I/O requests to the device to send or receive data. 355*59596c01SRobert MustacchiThe driver should make sure that reading data from the i2c bus of the 356*59596c01SRobert Mustacchitransceiver does not interfere with the device's functionality in this 357*59596c01SRobert Mustacchiregard. 358*59596c01SRobert MustacchiDifferent locks should be used. 359*59596c01SRobert Mustacchi.Pp 360*59596c01SRobert MustacchiOn some devices, reading from the transceiver's i2c bus might cause a 361*59596c01SRobert Mustacchidisruption of service to the device. 362*59596c01SRobert MustacchiFor example, on some devices a phy reset may be required or come about 363*59596c01SRobert Mustacchias a side effect of trying to read the device. 364*59596c01SRobert MustacchiIf any kind of disruption would be caused, then the driver 365*59596c01SRobert Mustacchimust not implement the 366*59596c01SRobert Mustacchi.Ft mct_read 367*59596c01SRobert Mustacchientry point. 368*59596c01SRobert Mustacchi.Sh CONTEXT 369*59596c01SRobert MustacchiThe various callback functions will be called from 370*59596c01SRobert Mustacchi.Sy kernel 371*59596c01SRobert Mustacchicontext. 372*59596c01SRobert MustacchiThese functions will never be called from 373*59596c01SRobert Mustacchi.Sy interrupt 374*59596c01SRobert Mustacchicontext. 375*59596c01SRobert Mustacchi.Sh SEE ALSO 376*59596c01SRobert Mustacchi.Xr Intro 2 , 377*59596c01SRobert Mustacchi.Xr mac 9E , 378*59596c01SRobert Mustacchi.Xr mc_getcapab 9E , 379*59596c01SRobert Mustacchi.Xr mac_register 9F , 380*59596c01SRobert Mustacchi.Xr mac_transceiver_info_set_present 9F , 381*59596c01SRobert Mustacchi.Xr mac_transceiver_info_set_usable 9F , 382*59596c01SRobert Mustacchi.Xr mac_register 9S 383*59596c01SRobert Mustacchi.Rs 384*59596c01SRobert Mustacchi.%N INF-8074i 385*59596c01SRobert Mustacchi.%T SFP (Small Formfactor Pluggable) Interface 386*59596c01SRobert Mustacchi.%Q SFF Committee 387*59596c01SRobert Mustacchi.%O Revision 1.0 388*59596c01SRobert Mustacchi.%D May 12, 2001 389*59596c01SRobert Mustacchi.Re 390*59596c01SRobert Mustacchi.Rs 391*59596c01SRobert Mustacchi.%N SFF-8472 392*59596c01SRobert Mustacchi.%T Diagnostic Monitoring Interface for Optical Transceivers 393*59596c01SRobert Mustacchi.%O Revision 12.2 394*59596c01SRobert Mustacchi.%D November 21, 2014 395*59596c01SRobert Mustacchi.Re 396*59596c01SRobert Mustacchi.Rs 397*59596c01SRobert Mustacchi.%N SFF-8436 398*59596c01SRobert Mustacchi.%T QSFP+ 10 Gbs 4X PLUGGABLE TRANSCEIVER 399*59596c01SRobert Mustacchi.%O Revision 4.8 400*59596c01SRobert Mustacchi.%D October 31, 2013 401*59596c01SRobert Mustacchi.Re 402*59596c01SRobert Mustacchi.Rs 403*59596c01SRobert Mustacchi.%N SFF-8636 404*59596c01SRobert Mustacchi.%T Management Interface for Cabled Environments 405*59596c01SRobert Mustacchi.%O Revision 2.7 406*59596c01SRobert Mustacchi.%D January 26, 2016 407*59596c01SRobert Mustacchi.Re 408