int diag_send_peripheral_buffering_mode(struct diag_buffering_mode_t *params) { int err = 0; int mode = MODE_REALTIME; uint8_t peripheral = 0; struct diag_smd_info *smd_info = NULL; if (!params) return -EIO; peripheral = params->peripheral; if (peripheral > LAST_PERIPHERAL) { pr_err("diag: In %s, invalid peripheral %d\n", __func__, peripheral); return -EINVAL; } switch (params->mode) { case DIAG_BUFFERING_MODE_STREAMING: mode = MODE_REALTIME; break; case DIAG_BUFFERING_MODE_THRESHOLD: case DIAG_BUFFERING_MODE_CIRCULAR: mode = MODE_NONREALTIME; break; default: pr_err("diag: In %s, invalid tx mode %d\n", __func__, params->mode); return -EINVAL; } if (!driver->peripheral_buffering_support[peripheral]) { pr_debug("diag: In %s, peripheral %d doesn't support buffering\n", __func__, peripheral); return -EIO; } /* * Perform sanity on watermark values. These values must be * checked irrespective of the buffering mode. */ if (((params->high_wm_val > DIAG_MAX_WM_VAL) || (params->low_wm_val > DIAG_MAX_WM_VAL)) || (params->low_wm_val > params->high_wm_val) || ((params->low_wm_val == params->high_wm_val) && (params->low_wm_val != DIAG_MIN_WM_VAL))) { pr_err("diag: In %s, invalid watermark values, high: %d, low: %d, peripheral: %d\n", __func__, params->high_wm_val, params->low_wm_val, peripheral); return -EINVAL; } smd_info = &driver->smd_cntl[peripheral]; mutex_lock(&driver->mode_lock); err = diag_send_buffering_tx_mode_pkt(smd_info, params); if (err) { pr_err("diag: In %s, unable to send buffering mode packet to peripheral %d, err: %d\n", __func__, peripheral, err); goto fail; } err = diag_send_buffering_wm_values(smd_info, params); if (err) { pr_err("diag: In %s, unable to send buffering wm value packet to peripheral %d, err: %d\n", __func__, peripheral, err); goto fail; } err = diag_send_diag_mode_update_by_smd(smd_info, mode); if (err) { pr_err("diag: In %s, unable to send mode update to peripheral %d, mode: %d, err: %d\n", __func__, peripheral, mode, err); goto fail; } driver->buffering_mode[peripheral].peripheral = peripheral; driver->buffering_mode[peripheral].mode = params->mode; driver->buffering_mode[peripheral].low_wm_val = params->low_wm_val; driver->buffering_mode[peripheral].high_wm_val = params->high_wm_val; fail: mutex_unlock(&driver->mode_lock); return err; }
int diag_send_peripheral_buffering_mode(struct diag_buffering_mode_t *params) { int err = 0; int mode = MODE_REALTIME; uint8_t peripheral = 0; if (!params) return -EIO; peripheral = params->peripheral; if (peripheral >= NUM_PERIPHERALS) { pr_err("diag: In %s, invalid peripheral %d\n", __func__, peripheral); return -EINVAL; } switch (params->mode) { case DIAG_BUFFERING_MODE_STREAMING: mode = MODE_REALTIME; break; case DIAG_BUFFERING_MODE_THRESHOLD: case DIAG_BUFFERING_MODE_CIRCULAR: mode = MODE_NONREALTIME; break; default: pr_err("diag: In %s, invalid tx mode %d\n", __func__, params->mode); return -EINVAL; } if (!driver->feature[peripheral].peripheral_buffering) { DIAGFWD_DBUG("diag: In %s, peripheral %d doesn't support buffering\n", __func__, peripheral); return -EIO; } if (((params->high_wm_val > DIAG_MAX_WM_VAL) || (params->low_wm_val > DIAG_MAX_WM_VAL)) || (params->low_wm_val > params->high_wm_val) || ((params->low_wm_val == params->high_wm_val) && (params->low_wm_val != DIAG_MIN_WM_VAL))) { pr_err("diag: In %s, invalid watermark values, high: %d, low: %d, peripheral: %d\n", __func__, params->high_wm_val, params->low_wm_val, peripheral); return -EINVAL; } mutex_lock(&driver->mode_lock); err = diag_send_buffering_tx_mode_pkt(peripheral, params); if (err) { pr_err("diag: In %s, unable to send buffering mode packet to peripheral %d, err: %d\n", __func__, peripheral, err); goto fail; } err = diag_send_buffering_wm_values(peripheral, params); if (err) { pr_err("diag: In %s, unable to send buffering wm value packet to peripheral %d, err: %d\n", __func__, peripheral, err); goto fail; } err = diag_send_real_time_update(peripheral, mode); if (err) { pr_err("diag: In %s, unable to send mode update to peripheral %d, mode: %d, err: %d\n", __func__, peripheral, mode, err); goto fail; } driver->buffering_mode[peripheral].peripheral = peripheral; driver->buffering_mode[peripheral].mode = params->mode; driver->buffering_mode[peripheral].low_wm_val = params->low_wm_val; driver->buffering_mode[peripheral].high_wm_val = params->high_wm_val; fail: mutex_unlock(&driver->mode_lock); return err; }