nusb/serial: more cleanup

This commit is contained in:
cinap_lenrek 2014-07-05 06:01:03 +02:00
parent 336e605a11
commit 502247bf92
6 changed files with 52 additions and 81 deletions

View file

@ -1167,20 +1167,14 @@ ftgettype(Serial *ser)
}
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

View file

@ -231,22 +231,15 @@ Cinfo plinfo[] = {
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);

View file

@ -12,11 +12,7 @@
#include "usb.h"
#include "serial.h"
int serialdebug;
static int sdebug;
Serialport **ports;
int nports;
@ -308,6 +304,17 @@ serdumpst(Serialport *p, char *buf, int bufsz)
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 @@ static Srv serialfs = {
.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 @@ threadmain(int argc, char* argv[])
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 @@ threadmain(int argc, char* argv[])
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 @@ threadmain(int argc, char* argv[])
}
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);
}

View file

@ -22,7 +22,6 @@ enum {
Maxifc = 16,
};
struct Serialport {
char name[32];
Serial *s; /* device we belong to */
@ -110,17 +109,14 @@ enum {
* !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 @@ extern int serialdebug;
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);

View file

@ -31,20 +31,14 @@ static Cinfo slinfo[] = {
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

View file

@ -15,26 +15,19 @@ enum {
};
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;
}