int dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl_t *ioc, void * buf, uint buflen) { int bcmerror = 0; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); switch (ioc->cmd) { case DHD_GET_MAGIC: if (buflen < sizeof(int)) bcmerror = BCME_BUFTOOSHORT; else *(int*)buf = DHD_IOCTL_MAGIC; break; case DHD_GET_VERSION: if (buflen < sizeof(int)) bcmerror = -BCME_BUFTOOSHORT; else *(int*)buf = DHD_IOCTL_VERSION; break; case DHD_GET_VAR: case DHD_SET_VAR: { char *arg; uint arglen; /* scan past the name to any arguments */ for (arg = buf, arglen = buflen; *arg && arglen; arg++, arglen--); if (*arg) { bcmerror = BCME_BUFTOOSHORT; break; } /* account for the NUL terminator */ arg++, arglen--; /* call with the appropriate arguments */ if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); if (bcmerror != BCME_UNSUPPORTED) break; /* not in generic table, try protocol module */ if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_prot_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_prot_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); if (bcmerror != BCME_UNSUPPORTED) break; /* if still not found, try bus module */ if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_bus_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_bus_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); break; } default: bcmerror = BCME_UNSUPPORTED; } return bcmerror; }
int dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl_t *ioc, void * buf, uint buflen) { int bcmerror = 0; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); switch (ioc->cmd) { case DHD_GET_MAGIC: if (buflen < sizeof(int)) bcmerror = BCME_BUFTOOSHORT; else *(int*)buf = DHD_IOCTL_MAGIC; break; case DHD_GET_VERSION: if (buflen < sizeof(int)) bcmerror = -BCME_BUFTOOSHORT; else *(int*)buf = DHD_IOCTL_VERSION; break; case DHD_GET_VAR: case DHD_SET_VAR: { char *arg; uint arglen; for (arg = buf, arglen = buflen; *arg && arglen; arg++, arglen--); if (*arg) { bcmerror = BCME_BUFTOOSHORT; break; } arg++, arglen--; if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); if (bcmerror != BCME_UNSUPPORTED) break; if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_prot_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_prot_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); if (bcmerror != BCME_UNSUPPORTED) break; if (ioc->cmd == DHD_GET_VAR) bcmerror = dhd_bus_iovar_op(dhd_pub, buf, arg, arglen, buf, buflen, IOV_GET); else bcmerror = dhd_bus_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); break; } default: bcmerror = BCME_UNSUPPORTED; } return bcmerror; }