/* read the per-port counters for port 2 (pidx 1) */ static ssize_t portcntrs_2_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { u64 *counters; struct qib_devdata *dd = private2dd(file); return simple_read_from_buffer(buf, count, ppos, counters, dd->f_read_portcntrs(dd, *ppos, 1, NULL, &counters)); }
/* read the per-port names (same for each port) */ static ssize_t portnames_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { char *names; struct qib_devdata *dd = private2dd(file); return simple_read_from_buffer(buf, count, ppos, names, dd->f_read_portcntrs(dd, *ppos, 0, &names, NULL)); }
/* read the per-device counters */ static ssize_t dev_names_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { char *names; size_t avail; struct qib_devdata *dd = private2dd(file); avail = dd->f_read_cntrs(dd, *ppos, &names, NULL); return simple_read_from_buffer(buf, count, ppos, names, avail); }
static ssize_t flash_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct qib_devdata *dd; ssize_t ret; loff_t pos; char *tmp; pos = *ppos; if (pos < 0) { ret = -EINVAL; goto bail; } if (pos >= sizeof(struct qib_flash)) { ret = 0; goto bail; } if (count > sizeof(struct qib_flash) - pos) count = sizeof(struct qib_flash) - pos; tmp = kmalloc(count, GFP_KERNEL); if (!tmp) { ret = -ENOMEM; goto bail; } dd = private2dd(file); if (qib_eeprom_read(dd, pos, tmp, count)) { qib_dev_err(dd, "failed to read from flash\n"); ret = -ENXIO; goto bail_tmp; } if (copy_to_user(buf, tmp, count)) { ret = -EFAULT; goto bail_tmp; } *ppos = pos + count; ret = count; bail_tmp: kfree(tmp); bail: return ret; }
static ssize_t flash_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct qib_devdata *dd; ssize_t ret; loff_t pos; char *tmp; pos = *ppos; if (pos != 0) { ret = -EINVAL; goto bail; } if (count != sizeof(struct qib_flash)) { ret = -EINVAL; goto bail; } tmp = kmalloc(count, GFP_KERNEL); if (!tmp) { ret = -ENOMEM; goto bail; } if (copy_from_user(tmp, buf, count)) { ret = -EFAULT; goto bail_tmp; } dd = private2dd(file); if (qib_eeprom_write(dd, pos, tmp, count)) { ret = -ENXIO; qib_dev_err(dd, "failed to write to flash\n"); goto bail_tmp; } *ppos = pos + count; ret = count; bail_tmp: kfree(tmp); bail: return ret; }
/* * read the per-port QSFP data for port 1 (pidx 0) */ static ssize_t qsfp_1_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct qib_devdata *dd = private2dd(file); char *tmp; int ret; tmp = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!tmp) return -ENOMEM; ret = qib_qsfp_dump(dd->pport, tmp, PAGE_SIZE); if (ret > 0) ret = simple_read_from_buffer(buf, count, ppos, tmp, ret); kfree(tmp); return ret; }