shithub: riscv

Download patch

ref: 502247bf92f380a642b8e17048466c18bb9efd24
parent: 336e605a1191efe1293333bac3b4f76d07b9f89b
author: cinap_lenrek <[email protected]>
date: Sat Jul 5 02:01:03 EDT 2014

nusb/serial: more cleanup

--- a/sys/src/cmd/nusb/serial/ftdi.c
+++ b/sys/src/cmd/nusb/serial/ftdi.c
@@ -1167,20 +1167,14 @@
 }
 
 int
-ftmatch(Serial *ser, char *info)
+ftprobe(Serial *ser)
 {
-	Cinfo *ip;
-	char buf[50];
+	Usbdev *ud = ser->dev->usb;
 
-	for(ip = ftinfo; ip->vid != 0; ip++){
-		snprint(buf, sizeof buf, "vid %#06x did %#06x", ip->vid, ip->did);
-		dsprint(2, "serial: %s %s\n", buf, info);
-		if(strstr(info, buf) != nil){
-			ftgettype(ser);
-			return 0;
-		}
-	}
-	return -1;
+	if(matchid(ftinfo, ud->vid, ud->did) == nil)
+		return -1;
+	ftgettype(ser);
+	return 0;
 }
 
 static int
--- a/sys/src/cmd/nusb/serial/prolific.c
+++ b/sys/src/cmd/nusb/serial/prolific.c
@@ -231,22 +231,15 @@
 static Serialops plops;
 
 int
-plmatch(Serial *ser, char *info)
+plprobe(Serial *ser)
 {
-	Cinfo *ip;
-	char buf[50];
+	Usbdev *ud = ser->dev->usb;
 
-	for(ip = plinfo; ip->vid != 0; ip++){
-		snprint(buf, sizeof buf, "vid %#06x did %#06x",
-			ip->vid, ip->did);
-		dsprint(2, "serial: %s %s\n", buf, info);
-		if(strstr(info, buf) != nil){
-			ser->hasepintr = 1;
-			ser->Serialops = plops;
-			return 0;
-		}
-	}
-	return -1;
+	if(matchid(plinfo, ud->vid, ud->did) == nil)
+		return -1;
+	ser->hasepintr = 1;
+	ser->Serialops = plops;
+	return 0;
 }
 
 static void	statusreader(void *u);
--- a/sys/src/cmd/nusb/serial/serial.c
+++ b/sys/src/cmd/nusb/serial/serial.c
@@ -12,11 +12,7 @@
 #include "usb.h"
 #include "serial.h"
 
-
-
 int serialdebug;
-static int sdebug;
-
 Serialport **ports;
 int nports;
 
@@ -308,6 +304,17 @@
 	return s;
 }
 
+Cinfo*
+matchid(Cinfo *tab, int vid, int did)
+{
+	while(tab->vid != 0){
+		if(tab->vid == vid && (tab->did == did || did == 0))
+			return tab;
+		tab++;
+	}
+	return nil;
+}
+
 static int
 serinit(Serialport *p)
 {
@@ -755,10 +762,10 @@
 	.end = dend,
 };
 
-int ftmatch(Serial *ser, char *info);
-int plmatch(Serial *ser, char *info);
-int slmatch(Serial *ser, char *info);
-int uconsmatch(Serial *ser, char *info);
+extern int ftprobe(Serial *ser);
+extern int plprobe(Serial *ser);
+extern int slprobe(Serial *ser);
+extern int uconsprobe(Serial *ser);
 
 void
 threadmain(int argc, char* argv[])
@@ -790,14 +797,11 @@
 	ser->jtag = -1;
 	ser->nifcs = 1;
 
-	snprint(buf, sizeof buf, "vid %#06x did %#06x",
-		dev->usb->vid, dev->usb->did);
-
 	/* probe all the drivers */
-	if(plmatch(ser, buf)
-	&& uconsmatch(ser, buf)
-	&& ftmatch(ser, buf)
-	&& slmatch(ser, buf))
+	if(plprobe(ser)
+	&& uconsprobe(ser)
+	&& ftprobe(ser)
+	&& slprobe(ser))
 		sysfatal("no serial devices found");
 
 	for(i = 0; i < ser->nifcs; i++){
@@ -818,9 +822,8 @@
 	for(i = 0; i < ser->nifcs; i++){
 		p = &ser->p[i];
 		dprint(2, "serial: valid interface, calling serinit\n");
-		if(serinit(p) < 0){
+		if(serinit(p) < 0)
 			sysfatal("wserinit: %r");
-		}
 
 		dsprint(2, "serial: adding interface %d, %p\n", p->interfc, p);
 		if(ser->nifcs == 1)
@@ -835,10 +838,7 @@
 	}
 	qunlock(ser);
 
-	if(nports == 0)
-		threadexits("no ports");
-
 	snprint(buf, sizeof buf, "%d.serial", dev->id);
 	threadpostsharesrv(&serialfs, nil, "usb", buf);
-	threadexits(0);
+	threadexits(nil);
 }
--- a/sys/src/cmd/nusb/serial/serial.h
+++ b/sys/src/cmd/nusb/serial/serial.h
@@ -22,7 +22,6 @@
 	Maxifc = 16,
 };
 
-
 struct Serialport {
 	char name[32];
 	Serial	*s;		/* device we belong to */
@@ -110,17 +109,14 @@
  * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt
  */
 
-int serialmain(Dev *d, int argc, char *argv[]);
-
 typedef struct Cinfo Cinfo;
 struct Cinfo {
 	int	vid;		/* usb vendor id */
 	int	did;		/* usb device/product id */
-	int	cid;		/* controller id assigned by us */
+
+	int	cid;		/* assigned for us */
 };
 
-extern Cinfo plinfo[];
-extern Cinfo uconsinfo[];
 extern int serialdebug;
 
 #define	dsprint	if(serialdebug)fprint
@@ -128,3 +124,4 @@
 int	serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err);
 int	serialreset(Serial *ser);
 char	*serdumpst(Serialport *p, char *buf, int bufsz);
+Cinfo	*matchid(Cinfo *tab, int vid, int did);
--- a/sys/src/cmd/nusb/serial/silabs.c
+++ b/sys/src/cmd/nusb/serial/silabs.c
@@ -31,20 +31,14 @@
 
 static Serialops slops;
 
-slmatch(Serial *ser, char *info)
+slprobe(Serial *ser)
 {
-	Cinfo *ip;
-	char buf[50];
+	Usbdev *ud = ser->dev->usb;
 
-	for(ip = slinfo; ip->vid != 0; ip++){
-		snprint(buf, sizeof buf, "vid %#06x did %#06x",
-			ip->vid, ip->did);
-		if(strstr(info, buf) != nil){
-			ser->Serialops = slops;
-			return 0;
-		}
-	}
-	return -1;
+	if(matchid(slinfo, ud->vid, ud->did) == nil)
+		return -1;
+	ser->Serialops = slops;
+	return 0;
 }
 
 static int
--- a/sys/src/cmd/nusb/serial/ucons.c
+++ b/sys/src/cmd/nusb/serial/ucons.c
@@ -15,26 +15,19 @@
 };
 
 Cinfo uconsinfo[] = {
-	{ Net20DCVid,	Net20DCDid },
-	{ HuaweiVid,	HuaweiE220 },
-	{ 0,		0 },
+	{ Net20DCVid,	Net20DCDid,	1 },
+	{ HuaweiVid,	HuaweiE220,	2 },
+	{ 0,		0,		0 },
 };
 
 int
-uconsmatch(Serial *ser, char *info)
+uconsprobe(Serial *ser)
 {
+	Usbdev *ud = ser->dev->usb;
 	Cinfo *ip;
-	char buf[50];
 
-	for(ip = uconsinfo; ip->vid != 0; ip++){
-		snprint(buf, sizeof buf, "vid %#06x did %#06x",
-			ip->vid, ip->did);
-		dsprint(2, "serial: %s %s\n", buf, info);
-		if(strstr(info, buf) != nil){
-			if(ip->vid == HuaweiVid && ip->did == HuaweiE220)
-				ser->nifcs = 2;
-			return 0;
-		}
-	}
-	return -1;
+	if((ip = matchid(uconsinfo, ud->vid, ud->did)) == nil)
+		return -1;
+	ser->nifcs = ip->cid;
+	return 0;
 }