MC_IOCTL(9E) | Driver Entry Points | MC_IOCTL(9E) |
mc_ioctl
— device
specific I/O control operation
#include
<sys/types.h>
#include <sys/stream.h>
#include <sys/stropts.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
void
prefix_m_ioctl
(void *driver,
queue_t *wq, mblk_t *mp);
illumos DDI Specific
The
mc_ioctl
()
entry point is an optional GLDv3 entry point. It provides a means for
device-specific I/O control operations to be initiated. In general, this
entry point is not recommended for most devices and is unimplemented.
The I/O control interface is not like a traditional character or block device's ioctl(9E) entry point, rather it is a STREAMS-based I/O control operation. The data pointer of the mp argument is a iocblk(9S) structure. After handling the message, the driver will need to reply to the message, which is usually done by using the miocack(9F) and miocnak(9F) functions to prepare mp.
The device driver can access its soft state by casting the value pointed to in driver. The driver should be careful and ensure that it performs any necessary locking to access members of that structure while processing the I/O control operation.
Return information is not conveyed by the return value of this function, rather it is encoded in the iocblk(9S) structure in the mp argument.
The following example shows how a device driver might structure
its mc_ioctl
() entry point.
#include <sys/types.h> #include <sys/stream.h> #include <sys/stropts.h> #include <sys/ddi.h> #include <sys/sunddi.h> /* * Note, this example merely shows the structure of this function. It does not * actively handle any device-specific ioctls and instead returns failure for * every one. This is the most common case. Note, miocnak(9F) takes care of * calling putnext(9F) for us. */ static void example_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) { miocnak(wq, mp, 0, EINVAL); }
ioctl(9E), mac(9E), put(9E), mac_register(9F), miocack(9F), miocnak(9F), putnext(9F), iocblk(9S), mac_register(9S)
Writing Device Drivers.
STREAMS Programming Guide.
May 31, 2016 | OmniOS |