Sun Microsystems, Inc.
spacerspacer
spacer   www.sun.com docs.sun.com | | |  
spacer
black dot
   
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
    
 
Driver Entry Pointsmapdev_access(9E)


NAME

 mapdev_access - device mapping access entry point

SYNOPSIS

 
#include <sys/sunddi.h>
int prefixmapdev_access(ddi_mapdev_handle_t handle, void *devprivate, off_t offset);

INTERFACE LEVEL

 

Solaris DDI specific (Solaris DDI).

PARAMETERS

 
handle
An opaque pointer to a device mapping.
devprivate
Driver private mapping data from ddi_mapdev(9F).
offset
The offset within device memory at which the access occurred.

DESCRIPTION

 

Future releases of Solaris will provide this function for binary and source compatibility. However, for increased functionality, use devmap_access(9E) or devmap_contextmgt(9E) instead. See devmap_access(9E) or devmap_contextmgt(9E) for details.

mapdev_access() is called when an access is made to a mapping that has either been newly created with ddi_mapdev(9F) or that has been enabled with a call to ddi_mapdev_intercept(9F).

mapdev_access() is passed the handle of the mapped object on which an access has occurred. This handle uniquely identifies the mapping and is used as an argument to ddi_mapdev_intercept(9F) or ddi_mapdev_nointercept(9F) to control whether or not future accesses to the mapping will cause mapdev_access() to be called. In general, mapdev_access() should call ddi_mapdev_intercept() on the mapping that is currently in use and then call ddi_mapdev_nointercept() on the mapping that generated this call to mapdev_access(). This will ensure that a call to mapdev_access() will be generated for the current mapping next time it is accessed.

mapdev_access() must at least call ddi_mapdev_nointercept() with offset passed in in order for the access to succeed. A request to allow accesses affects the entire page containing the offset.

Accesses to portions of mappings that have been disabled by a call to ddi_mapdev_nointercept() will not generate a call to mapdev_access(). A subsequent call to ddi_mapdev_intercept() will enable mapdev_access() to be called again.

A non-zero return value from mapdev_access() will cause the corresponding operation to fail. The failure may result in a SIGSEGV or SIGBUS signal being delivered to the process.

RETURN VALUES

 

mapdev_access() should return 0 on success, -1 if there was a hardware error, or the return value from ddi_mapdev_intercept() or ddi_mapdev_nointercept().

CONTEXT

 

This function is called from user context only.

EXAMPLES

 Example 1. Managing a One Page Device Context
 

The following shows an example of managing a device context that is one page in length.
 
ddi_mapdev_handle_t cur_hdl;
static int
xxmapdev_access(ddi_mapdev_handle_t handle, void *devprivate,
    off_t offset)
{
	          int	err;
	          /* enable calls to mapdev_access for the current mapping */
  	       if (cur_hdl != NULL) {
		               if ((err = ddi_mapdev_intercept(cur_hdl, off, 0)) != 0)
			                       return (err);
	          }
	          /* Switch device context - device dependent*/
          ...
          /* Make handle the new current mapping */
	          cur_hdl = handle;

  	       /*
	           * Disable callbacks and complete the access for the
	           * mapping that generated this callback.
	           */
	
           return (ddi_mapdev_nointercept(handle, off, 0));
}

SEE ALSO

 

mmap(2), mapdev_dup(9E), mapdev_free(9E), segmap(9E), ddi_mapdev(9F), ddi_mapdev_intercept(9F), ddi_mapdev_nointercept(9F), ddi_mapdev_ctl(9S)

Writing Device Drivers


SunOS 5.9Go To TopLast Changed 17 Jan 1997

 
      
      
Copyright 2002 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.