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;
}