commit 5d980e4fbad5f499c0868db7f7b4655f45f859a3
parent 7b27a41b2a63d4915a4406fd6b048acabb5f6b8c
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 2 May 2019 13:12:37 +0100
[dev] Make attach more generic
In the drivers currently implemented the attach command
does basically the same, so it is a good idea to make it
more orthogonal and use the same default function.
Change-Id: I93bbdc7343aba7f0433b0c03e41c62a3181b07af
Diffstat:
7 files changed, 23 insertions(+), 44 deletions(-)
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -155,6 +155,17 @@ mntpoint(Chan *c)
}
Chan *
+attach(int id, int dev)
+{
+ int type;
+
+
+ if ((type = devtype(id)) < 0)
+ return NULL;
+ return devtab[type]->attach(id, dev);
+}
+
+Chan *
devattach(int id, int dev)
{
Chan *c;
@@ -173,7 +184,7 @@ devattach(int id, int dev)
Chan *
namec(const char *name, int mode)
{
- int type, n, i;
+ int n, i;
const char *s;
Chan *mnt, *c;
char elem[NAMELEN];
@@ -187,16 +198,13 @@ namec(const char *name, int mode)
if ((s = next(name+1, elem)) == NULL)
goto noent;
- if ((type = devtype(elem[0])) < 0)
- return NULL;
-
for (n = 0, i = 1; isdigit(elem[i]); i++)
n += elem[i] - '0';
if (elem[i] != '\0')
goto noent;
- c = devtab[type]->attach(n);
+ c = attach(elem[0], n);
break;
default:
errno = ENOENT;
@@ -524,7 +532,7 @@ idev(void)
for (c = fdset; c < &fdset[NR_CHANS]; c++)
c->type = NODEV;
- if ((c = devattach('/', 0)) == NULL)
+ if ((c = attach('/', 0)) == NULL)
panic("idev:attach");
if (!clone(c, &slash))
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -26,7 +26,7 @@ struct dev {
char id;
Chan * (*clone)(Chan *c, Chan *nc);
int (*walk)(Chan *c, const char *name);
- Chan * (*attach)(int dev);
+ Chan * (*attach)(int id, int dev);
int (*read)(Chan *c, void *buf, int n);
int (*write)(Chan *c, void *buf, int n);
int (*seek)(Chan *c, long off, int whence);
@@ -50,6 +50,7 @@ struct attr {
extern Chan *devattach(int id, int dev);
extern Chan * namec(const char *name, int mode);
extern Chan *clone(Chan *c, Chan *nc);
+extern Chan *attach(int id, int dev);
extern void chanclose(Chan *c);
extern int buf2chan(Chan *c,
void *dst, void *src,
diff --git a/drivers/devar.c b/drivers/devar.c
@@ -36,12 +36,6 @@ static struct arfile archives[NR_ARS];
static int nars;
-static Chan *
-arattach(int dev)
-{
- return devattach('R', dev);
-}
-
static int
gethdr(Chan *c, struct ar_hdr *hdr)
{
@@ -173,7 +167,7 @@ armount(Chan *c, char *spec)
offhdr = cspec->offset;
switch (gethdr(cspec, &hdr)) {
case 0:
- return devattach('R', nars++);
+ return attach('R', nars++);
case -1:
goto err;
default:
@@ -199,7 +193,7 @@ err:
const Dev ardevtab = {
.id = 'R',
.clone = devclone,
- .attach = arattach,
+ .attach = devattach,
.walk = arwalk,
.read = arread,
.write = deverrwrite,
diff --git a/drivers/devcons.c b/drivers/devcons.c
@@ -36,12 +36,6 @@ static char buffer[LINELEN];
static int head;
static int tail;
-static Chan *
-consattach(int dev)
-{
- return devattach('s', dev);
-}
-
static int
conswalk(Chan *c, const char *name)
{
@@ -380,7 +374,7 @@ consread(Chan *c, void *buf, int n)
const Dev consdevtab = {
.id = 's',
.clone = devclone,
- .attach = consattach,
+ .attach = devattach,
.walk = conswalk,
.read = consread,
.write = conswrite,
diff --git a/drivers/devfip.c b/drivers/devfip.c
@@ -24,12 +24,6 @@ static struct fipfile archives[NR_FIPS];
static int nfips;
-static Chan *
-fipattach(int dev)
-{
- return devattach('F', dev);
-}
-
static int
getntry(Chan *c, struct fip_toc_entry *ntry)
{
@@ -228,7 +222,7 @@ fipmount(Chan *c, char *spec)
for (n = 0; n < NR_FILES; n++) {
switch (getntry(cspec, &ntry)) {
case 0:
- return devattach('F', nfips++);
+ return attach('F', nfips++);
case -1:
goto err;
default:
@@ -247,7 +241,7 @@ err:
const Dev fipdevtab = {
.id = 'F',
.clone = devclone,
- .attach = fipattach,
+ .attach = devattach,
.walk = fipwalk,
.read = fipread,
.write = deverrwrite,
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -91,12 +91,6 @@ blobstatus(Chan *c, void *buf, int n)
return buf2chan(c, buf, info, n, len);
}
-static Chan *
-rootattach(int dev)
-{
- return devattach('/', dev);
-}
-
static int
rootread(Chan *c, void *buf, int n)
{
@@ -115,7 +109,7 @@ rootread(Chan *c, void *buf, int n)
const Dev rootdevtab = {
.id = '/',
.clone = devclone,
- .attach = rootattach,
+ .attach = devattach,
.walk = rootwalk,
.read = rootread,
.write = deverrwrite,
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -31,12 +31,6 @@ uartwalk(Chan *c, const char *name)
return devwalk(c, name, dirtab, NELEM(dirtab), devgen);
}
-static Chan *
-uartattach(int dev)
-{
- return devattach('t', dev);
-}
-
static Uart *
getuart(Chan *c)
{
@@ -250,7 +244,7 @@ uartlink(Uartphy *phy, Attr *attr)
const Dev uartdevtab = {
.id = 't',
.clone = devclone,
- .attach = uartattach,
+ .attach = devattach,
.walk = uartwalk,
.read = uartread,
.write = uartwrite,