gld(9f) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

gld(9f)

gld(9F)                        Kernel Functions                        gld(9F)

NAME
       gld,   gld_mac_alloc,   gld_mac_free,   gld_register,   gld_unregister,
       gld_recv, gld_sched, gld_intr - Generic LAN Driver service routines

SYNOPSIS
       #include <sys/gld.h>

       gld_mac_info_t *gld_mac_alloc(dev_info_t *dip);


       void gld_mac_free(gld_mac_info_t *macinfo);


       int gld_register(dev_info_t *dip, char *name, gld_mac_info_t *macinfo);


       int gld_unregister(gld_mac_info_t *macinfo);


       void gld_recv(gld_mac_info_t *macinfo, mblk_t *mp);


       void gld_sched(gld_mac_info_t *macinfo);


       uint_t gld_intr(caddr_t);


       void gld_linkstate(gld_mac_info_t *macinfo, int32_t newstate);

INTERFACE LEVEL
       Solaris architecture specific (Solaris DDI).

PARAMETERS
       macinfo     Pointer to a gld_mac_info(9S) structure.


       dip         Pointer to dev_info structure.


       name        Device interface name.


       mp          Pointer to a message block containing a received packet.


       newstate    Media link state.


DESCRIPTION
       gld_mac_alloc() allocates a new gld_mac_info(9S) structure and  returns
       a  pointer to it. Some of the GLD-private elements of the structure may
       be initialized before gld_mac_alloc() returns; all other  elements  are
       initialized  to  zero. The device driver must initialize some structure
       members, as described in gld_mac_info(9S), before passing the  mac_info
       pointer to gld_register().


       gld_mac_free()  frees a gld_mac_info(9S) structure previously allocated
       by gld_mac_alloc().


       gld_register() is called from the device driver's  attach(9E)  routine,
       and is used to link the GLD-based device driver with the GLD framework.
       Before  calling  gld_register()  the device driver's attach(9E) routine
       must first use gld_mac_alloc() to allocate  a  gld_mac_info(9S)  struc‐
       ture,   and   initialize   several   of  its  structure  elements.  See
       gld_mac_info(9S) for more information. A successful call to  gld_regis‐
       ter() performs the following actions:

           o      links the device-specific driver with the GLD system;


           o      sets  the device-specific driver's private data pointer (us‐
                  ing ddi_set_driver_private(9F))  to  point  to  the  macinfo
                  structure;


           o      creates the minor device node.



       The  device  interface name passed to gld_register() must exactly match
       the name of the driver module as it exists in the filesystem.


       The driver's attach(9E) routine should return DDI_SUCCESS if gld_regis‐
       ter() succeeds. If gld_register() returns DDI_FAILURE,  the  attach(9E)
       routine  should  deallocate  any  resources it allocated before calling
       gld_register() and then also return DDI_FAILURE.


       gld_unregister() is called by the device driver's detach(9E)  function,
       and if successful, performs the following tasks:

           o      ensures  the  device's  interrupts  are stopped, calling the
                  driver's gldm_stop() routine if necessary;


           o      removes the minor device node;


           o      unlinks the device-specific driver from the GLD system.



       If gld_unregister() returns DDI_SUCCESS, the detach(9E) routine  should
       deallocate any data structures allocated in the attach(9E) routine, us‐
       ing  gld_mac_free()  to  deallocate  the  macinfo structure, and return
       DDI_SUCCESS. If gld_unregister() returns DDI_FAILURE, the driver's  de‐
       tach(9E) routine must leave the device operational and return DDI_FAIL‐
       URE.


       gld_recv()  is  called  by the driver's interrupt handler to pass a re‐
       ceived packet upstream. The driver must construct and  pass  a  STREAMS
       M_DATA  message  containing the raw packet. gld_recv() determines which
       STREAMS queues, if any, should receive a copy of the packet,  duplicat‐
       ing  it if necessary. It then formats a DL_UNITDATA_IND message, if re‐
       quired, and passes the data up all appropriate streams.


       The driver should avoid holding mutex or other locks during the call to
       gld_recv(). In particular, locks that could  be  taken  by  a  transmit
       thread  may  not  be  held  during  a call to gld_recv(): the interrupt
       thread that calls gld_recv() may in some  cases  carry  out  processing
       that  includes  sending  an outgoing packet, resulting in a call to the
       driver's gldm_send() routine. If the gldm_send() routine were to try to
       acquire a mutex being held by the gldm_intr() routine at  the  time  it
       calls  gld_recv(),  this could result in a panic due to recursive mutex
       entry.


       gld_sched() is called by the device driver to reschedule  stalled  out‐
       bound  packets.  Whenever the driver's gldm_send() routine has returned
       GLD_NORESOURCES, the driver must later call gld_sched() to  inform  the
       GLD  framework  that  it should retry the packets that previously could
       not be sent. gld_sched() should be called as soon as possible after re‐
       sources are again available, to ensure that GLD  resumes  passing  out‐
       bound  packets to the driver's gldm_send() routine in a timely way. (If
       the driver's gldm_stop() routine is called, the driver is absolved from
       this obligation until it later again returns GLD_NORESOURCES  from  its
       gldm_send() routine; however, extra calls to gld_sched() will not cause
       incorrect operation.)


       gld_intr() is GLD's main interrupt handler. Normally it is specified as
       the  interrupt routine in the device driver's call to ddi_add_intr(9F).
       The argument to the interrupt handler (specified as int_handler_arg  in
       the call to ddi_add_intr(9F)) must be a pointer to the gld_mac_info(9S)
       structure.  gld_intr() will, when appropriate, call the device driver's
       gldm_intr() function, passing  that  pointer  to  the  gld_mac_info(9S)
       structure.  However, if the driver uses a high-level interrupt, it must
       provide its own high-level interrupt handler, and trigger a soft inter‐
       rupt from within that. In this case, gld_intr() may be specified as the
       soft interrupt handler in the call to ddi_add_softintr().


       gld_linkstate() is called by the device driver to notify GLD of changes
       in the media link state. The newstate argument should be set to one  of
       the following:

       GLD_LINKSTATE_DOWN       The media link is unavailable.


       GLD_LINKSTATE_UP         The media link is unavailable.


       GLD_LINKSTATE_UNKNOWN    The status of the media link is unknown.



       If   a   driver   calls   gld_linkstate(),   it   must   also  set  the
       GLD_CAP_LINKSTATE  bit  in   the   gldm_capabilities   field   of   the
       gld_mac_info(9S) structure.

RETURN VALUES
       gld_mac_alloc() returns a pointer to a new gld_mac_info(9S) structure.


       gld_register() and gld_unregister() return:

       DDI_SUCCESS    on success.


       DDI_FAILURE    on failure.



       gld_intr() returns a value appropriate for an interrupt handler.

SEE ALSO
       gld(4D),     dlpi(4P),     attach(9E),    gld(9E),    ddi_add_intr(9F),
       gld_mac_info(9S), gld_stats(9S).


       Writing Device Drivers in Oracle Solaris 11.4

Oracle Solaris 11.4               27 Nov 2017                          gld(9F)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3