/** * @brief This function handle generic proc file write * * @param file A pointer to file structure * @param buffer A pointer to input buffer * @param len number of byte to write * @param offset A pointer to offset of file * @return number of input data */ static ssize_t proc_write(struct file *file, const char __user * buffer, size_t len, loff_t * offset) { loff_t pos = *offset; struct proc_data *pdata = (struct proc_data *)file->private_data; int func, reg, val; if (!pdata->wrbuf || (pos < 0)) return -EINVAL; if (pos >= pdata->maxwrlen) return 0; if (len > pdata->maxwrlen - pos) len = pdata->maxwrlen - pos; if (copy_from_user(pdata->wrbuf + pos, buffer, len)) return -EFAULT; if (!strncmp(buffer, "sdcmd52rw=", strlen("sdcmd52rw="))) { parse_cmd52_string(buffer, len, &func, ®, &val); sd_write_cmd52_val(bpriv, func, reg, val); } if (pos + len > pdata->wrlen) pdata->wrlen = len + file->f_pos; *offset = pos + len; return len; }
/** * @brief config proc write function * * @param f file pointer * @param buf pointer to data buffer * @param cnt data number to write * @param data data to write * @return number of data */ static int woal_config_write(struct file *f, const char *buf, unsigned long cnt, void *data) { char databuf[101]; char *line; t_u32 config_data = 0; moal_handle *handle = (moal_handle *) data; int func, reg, val; int copy_len; moal_private *priv = NULL; ENTER(); if (!MODULE_GET) { LEAVE(); return 0; } if (cnt >= sizeof(databuf)) { MODULE_PUT; LEAVE(); return (int) cnt; } memset(databuf, 0, sizeof(databuf)); copy_len = MIN((sizeof(databuf) - 1), cnt); if (copy_from_user(databuf, buf, copy_len)) { MODULE_PUT; LEAVE(); return 0; } line = databuf; if (!strncmp(databuf, "soft_reset", strlen("soft_reset"))) { line += strlen("soft_reset") + 1; config_data = (t_u32) woal_string_to_number(line); PRINTM(MINFO, "soft_reset: %d\n", (int) config_data); if (woal_request_soft_reset(handle) == MLAN_STATUS_SUCCESS) { handle->hardware_status = HardwareStatusReset; } else { PRINTM(MERROR, "Could not perform soft reset\n"); } } if (!strncmp(databuf, "drv_mode", strlen("drv_mode"))) { line += strlen("drv_mode") + 1; config_data = (t_u32) woal_string_to_number(line); PRINTM(MINFO, "drv_mode: %d\n", (int) config_data); if (config_data != (t_u32) drv_mode) if (woal_switch_drv_mode(handle, config_data) != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Could not switch drv mode\n"); } } if (!strncmp(databuf, "sdcmd52rw=", strlen("sdcmd52rw="))) { parse_cmd52_string(databuf, (size_t) cnt, &func, ®, &val); woal_sdio_read_write_cmd52(handle, func, reg, val); } if (!strncmp(databuf, "debug_dump", strlen("debug_dump"))) { priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY); if (priv) { woal_mlan_debug_info(priv); woal_moal_debug_info(priv, NULL, MFALSE); woal_dump_firmware_info(priv); } } MODULE_PUT; LEAVE(); return (int) cnt; }