Sample Code for Driver Ioctls
enum ioc_reply
igb_ioctl(igb_t *igb, struct iocblk *iocp, mblk_t *mp)
{
int rval = 0;
iov_param_ver_info_t *iov_param_ver;
iov_param_validate_t pvalidate;
pci_param_t my_params;
char reason[81];
if (mp->b_cont == NULL)
return (IOC_INVAL);
if ((int)iocp->ioc_count < 0)
return (IOC_INVAL);
switch (iocp->ioc_cmd) {
case IOV_GET_PARAM_VER_INFO:
if (iocp->ioc_count < sizeof (iov_param_ver_info_t))
return (IOC_INVAL);
iov_param_ver = (iov_param_ver_info_t *)(mp->b_cont->b_rptr);
iov_param_ver->version = IOV_PARAM_DESC_VERSION;
iov_param_ver->num_params = NUM_OF_PARAMS;
return (IOC_REPLY);
case IOV_GET_PARAM_INFO:
if (iocp->ioc_count < sizeof (pci_list))
return (IOC_INVAL);
memcpy((caddr_t)(mp->b_cont->b_rptr), &pci_list,sizeof (pci_list));
return (IOC_REPLY);
case IOV_VALIDATE_PARAM:
if (iocp->ioc_count <= 0)
return (IOC_INVAL);
strcpy(reason, "Failed to read params sent\n");
rval = pci_param_get_ioctl(igb->dip,(uintptr_t)(mp->b_cont->b_rptr),
iocp->ioc_flag | FKIOCTL,&my_params );
if (rval == 0) {
rval = validate_params(igb->dip, my_params, reason);
pci_param_free(my_params);
}
if (rval) {
memcpy(mp->b_cont->b_rptr, reason, sizeof (reason));
iocp->ioc_count = sizeof (reason);
return (IOC_REPLY);
}
iocp->ioc_count = 0;
return (IOC_REPLY);
iov_param_ver_info_t iov_param_ver;
iov_param_validate_t pvalidate;
pci_param_t my_params;
switch (cmd) {
case IOV_GET_PARAM_VER_INFO:
iov_param_ver.version = IOV_PARAM_DESC_VERSION;
iov_param_ver.num_params = NUM_OF_PARAMS;
if (ddi_copyout(&iov_param_ver, (caddr_t)arg,
sizeof (iov_param_ver_info_t), mode) != DDI_SUCCESS)
return (DEFAULT);
return (0);
case IOV_GET_PARAM_INFO:
if (ddi_copyout(&pci_list, (caddr_t)arg,param_list_size, mode) != DDI_SUCCESS)
return (DEFAULT);
return (0);
case IOV_VALIDATE_PARAM:
strcpy(reason, "Failed to read params sent\n");
rv = pci_param_get_ioctl(state->dip, arg, mode, &my_params);
if (rv == 0)
rv = validate_params(state->dip, my_params, reason);
else
return (rv);
pci_param_free(my_params);
if (rv) {
if (ddi_copyout(reason,iov_param_validate_t *)arg)->pv_reason,
sizeof (reason), mode) != DDI_SUCCESS)
return (DEFAULT);
return (rv);
}
return (0);