Writing Device Drivers for Oracle® Solaris 11.2

Exit Print View

Updated: September 2014
 
 

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);