static ssize_t etb_read(struct file *file, char __user *data, size_t len, loff_t *ppos) { struct etb_drvdata *drvdata = container_of(file->private_data, struct etb_drvdata, miscdev); if (drvdata->reading == false) { etb_dump(drvdata); drvdata->reading = true; } if (*ppos + len > ETB_SIZE_WORDS * BYTES_PER_WORD) len = ETB_SIZE_WORDS * BYTES_PER_WORD - *ppos; if (copy_to_user(data, drvdata->buf + *ppos, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); return -EFAULT; } *ppos += len; dev_dbg(drvdata->dev, "%s: %d bytes copied, %d bytes left\n", __func__, len, (int) (ETB_SIZE_WORDS * BYTES_PER_WORD - *ppos)); return len; }
static ssize_t etb_read(struct file *file, char __user *data, size_t len, loff_t *ppos) { if (etb.reading == false) { etb_dump(); etb.reading = true; } if (*ppos + len > ETB_SIZE_WORDS * BYTES_PER_WORD) len = ETB_SIZE_WORDS * BYTES_PER_WORD - *ppos; if (copy_to_user(data, etb.buf + *ppos, len)) { dev_dbg(etb.dev, "%s: copy_to_user failed\n", __func__); return -EFAULT; } *ppos += len; dev_dbg(etb.dev, "%s: %d bytes copied, %d bytes left\n", __func__, len, (int) (ETB_SIZE_WORDS * BYTES_PER_WORD - *ppos)); return len; }
static ssize_t etb_read(struct file *file, char __user *data, size_t len, loff_t *ppos) { u32 depth; struct etb_drvdata *drvdata = container_of(file->private_data, struct etb_drvdata, miscdev); etb_dump(drvdata); depth = drvdata->buffer_depth; if (*ppos + len > depth * 4) len = depth * 4 - *ppos; if (copy_to_user(data, drvdata->buf + *ppos, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); return -EFAULT; } *ppos += len; dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int)(depth * 4 - *ppos)); return len; }