git: 87c6ec168579 - main - cxgbetool: create one backend routine for all the loadX cmds
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 09 Mar 2026 17:18:26 UTC
The branch main has been updated by np:
URL: https://cgit.FreeBSD.org/src/commit/?id=87c6ec16857939693ee4d5bef9e8aa8b04bad5dc
commit 87c6ec16857939693ee4d5bef9e8aa8b04bad5dc
Author: Navdeep Parhar <np@FreeBSD.org>
AuthorDate: 2026-03-08 19:34:15 +0000
Commit: Navdeep Parhar <np@FreeBSD.org>
CommitDate: 2026-03-09 17:04:37 +0000
cxgbetool: create one backend routine for all the loadX cmds
They are all doing almost the same thing so it makes sense to have one
common routine. The new routine supports non-regular files too. eg.
# cxgbetool chnex0 loadfw <(fetch -qo - http://srv/t7fw.bin)
MFC after: 1 week
Sponsored by: Chelsio Communications
Reviewed by: jhb
Differential Revision: https://reviews.freebsd.org/D55747
---
usr.sbin/cxgbetool/cxgbetool.c | 164 ++++++++++++++++-------------------------
1 file changed, 62 insertions(+), 102 deletions(-)
diff --git a/usr.sbin/cxgbetool/cxgbetool.c b/usr.sbin/cxgbetool/cxgbetool.c
index 68de86d74092..49ba547e5dae 100644
--- a/usr.sbin/cxgbetool/cxgbetool.c
+++ b/usr.sbin/cxgbetool/cxgbetool.c
@@ -2169,16 +2169,19 @@ get_sge_context(int argc, const char *argv[])
}
static int
-loadfw(int argc, const char *argv[])
+real_load_file(unsigned long ioc, const char *iocname, const char *fname,
+ struct t4_bootrom *br)
{
- int rc, fd;
+ int rc, fd, n;
struct t4_data data = {0};
- const char *fname = argv[0];
struct stat st = {0};
+ const int bufsz = 2 * 1024 * 1024;
- if (argc != 1) {
- warnx("loadfw: incorrect number of arguments.");
- return (EINVAL);
+ if (strcmp(fname, "clear") == 0) {
+ if (br == NULL)
+ return (real_doit(ioc, &data, iocname));
+ else
+ return (real_doit(ioc, br, iocname));
}
fd = open(fname, O_RDONLY);
@@ -2193,61 +2196,75 @@ loadfw(int argc, const char *argv[])
return (errno);
}
- data.len = st.st_size;
- data.data = mmap(0, data.len, PROT_READ, MAP_PRIVATE, fd, 0);
- if (data.data == MAP_FAILED) {
- warn("mmap");
- close(fd);
- return (errno);
+ if (st.st_mode & S_IFREG) {
+ data.len = st.st_size;
+ data.data = mmap(0, data.len, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (data.data == MAP_FAILED) {
+ warn("mmap %u", data.len);
+ return (errno);
+ }
+ } else {
+ data.data = malloc(bufsz);
+ if (data.data == NULL) {
+ warnx("malloc failed.");
+ return (ENOMEM);
+ }
+ for (data.len = 0; data.len <= bufsz; data.len += n) {
+ n = read(fd, data.data + data.len, bufsz - data.len);
+ if (n == -1) {
+ warn("read(%s, %u)", fname, data.len);
+ free(data.data);
+ close(fd);
+ return (errno);
+ }
+ if (n == 0)
+ break;
+ }
+ if (data.len == bufsz)
+ warnx("file '%s' contents > %u ignored.", fname, bufsz);
}
- rc = doit(CHELSIO_T4_LOAD_FW, &data);
- munmap(data.data, data.len);
+ if (br == NULL)
+ rc = real_doit(ioc, &data, iocname);
+ else {
+ br->len = data.len;
+ br->data = data.data;
+ rc = real_doit(ioc, br, iocname);
+ }
+ if (st.st_mode & S_IFREG)
+ munmap(data.data, data.len);
+ else
+ free(data.data);
close(fd);
return (rc);
}
+#define load_file(ioc, fname) real_load_file(ioc, #ioc, fname, NULL)
+#define load_file_br(ioc, fname, br) real_load_file(ioc, #ioc, fname, br)
static int
-loadcfg(int argc, const char *argv[])
+loadfw(int argc, const char *argv[])
{
- int rc, fd;
- struct t4_data data = {0};
const char *fname = argv[0];
- struct stat st = {0};
if (argc != 1) {
- warnx("loadcfg: incorrect number of arguments.");
+ warnx("loadfw: incorrect number of arguments.");
return (EINVAL);
}
- if (strcmp(fname, "clear") == 0)
- return (doit(CHELSIO_T4_LOAD_CFG, &data));
-
- fd = open(fname, O_RDONLY);
- if (fd < 0) {
- warn("open(%s)", fname);
- return (errno);
- }
+ return (load_file(CHELSIO_T4_LOAD_FW, fname));
+}
- if (fstat(fd, &st) < 0) {
- warn("fstat");
- close(fd);
- return (errno);
- }
+static int
+loadcfg(int argc, const char *argv[])
+{
+ const char *fname = argv[0];
- data.len = st.st_size;
- data.len &= ~3; /* Clip off to make it a multiple of 4 */
- data.data = mmap(0, data.len, PROT_READ, MAP_PRIVATE, fd, 0);
- if (data.data == MAP_FAILED) {
- warn("mmap");
- close(fd);
- return (errno);
+ if (argc != 1) {
+ warnx("loadcfg: incorrect number of arguments.");
+ return (EINVAL);
}
- rc = doit(CHELSIO_T4_LOAD_CFG, &data);
- munmap(data.data, data.len);
- close(fd);
- return (rc);
+ return (load_file(CHELSIO_T4_LOAD_CFG, fname));
}
static int
@@ -2317,12 +2334,10 @@ done:
static int
loadboot(int argc, const char *argv[])
{
- int rc, fd;
long l;
char *p;
struct t4_bootrom br = {0};
const char *fname = argv[0];
- struct stat st = {0};
if (argc == 1) {
br.pf_offset = 0;
@@ -2344,75 +2359,20 @@ loadboot(int argc, const char *argv[])
return (EINVAL);
}
- if (strcmp(fname, "clear") == 0)
- return (doit(CHELSIO_T4_LOAD_BOOT, &br));
-
- fd = open(fname, O_RDONLY);
- if (fd < 0) {
- warn("open(%s)", fname);
- return (errno);
- }
-
- if (fstat(fd, &st) < 0) {
- warn("fstat");
- close(fd);
- return (errno);
- }
-
- br.len = st.st_size;
- br.data = mmap(0, br.len, PROT_READ, MAP_PRIVATE, fd, 0);
- if (br.data == MAP_FAILED) {
- warn("mmap");
- close(fd);
- return (errno);
- }
-
- rc = doit(CHELSIO_T4_LOAD_BOOT, &br);
- munmap(br.data, br.len);
- close(fd);
- return (rc);
+ return (load_file_br(CHELSIO_T4_LOAD_BOOT, fname, &br));
}
static int
loadbootcfg(int argc, const char *argv[])
{
- int rc, fd;
- struct t4_data bc = {0};
const char *fname = argv[0];
- struct stat st = {0};
if (argc != 1) {
warnx("loadbootcfg: incorrect number of arguments.");
return (EINVAL);
}
- if (strcmp(fname, "clear") == 0)
- return (doit(CHELSIO_T4_LOAD_BOOTCFG, &bc));
-
- fd = open(fname, O_RDONLY);
- if (fd < 0) {
- warn("open(%s)", fname);
- return (errno);
- }
-
- if (fstat(fd, &st) < 0) {
- warn("fstat");
- close(fd);
- return (errno);
- }
-
- bc.len = st.st_size;
- bc.data = mmap(0, bc.len, PROT_READ, MAP_PRIVATE, fd, 0);
- if (bc.data == MAP_FAILED) {
- warn("mmap");
- close(fd);
- return (errno);
- }
-
- rc = doit(CHELSIO_T4_LOAD_BOOTCFG, &bc);
- munmap(bc.data, bc.len);
- close(fd);
- return (rc);
+ return (load_file(CHELSIO_T4_LOAD_BOOTCFG, fname));
}
/*