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 int
ftmatch(Serial *ser, char *info) ftprobe(Serial *ser)
{ {
Cinfo *ip; Usbdev *ud = ser->dev->usb;
char buf[50];
for(ip = ftinfo; ip->vid != 0; ip++){ if(matchid(ftinfo, ud->vid, ud->did) == nil)
snprint(buf, sizeof buf, "vid %#06x did %#06x", ip->vid, ip->did); return -1;
dsprint(2, "serial: %s %s\n", buf, info); ftgettype(ser);
if(strstr(info, buf) != nil){ return 0;
ftgettype(ser);
return 0;
}
}
return -1;
} }
static int static int

View file

@ -231,22 +231,15 @@ Cinfo plinfo[] = {
static Serialops plops; static Serialops plops;
int int
plmatch(Serial *ser, char *info) plprobe(Serial *ser)
{ {
Cinfo *ip; Usbdev *ud = ser->dev->usb;
char buf[50];
for(ip = plinfo; ip->vid != 0; ip++){ if(matchid(plinfo, ud->vid, ud->did) == nil)
snprint(buf, sizeof buf, "vid %#06x did %#06x", return -1;
ip->vid, ip->did); ser->hasepintr = 1;
dsprint(2, "serial: %s %s\n", buf, info); ser->Serialops = plops;
if(strstr(info, buf) != nil){ return 0;
ser->hasepintr = 1;
ser->Serialops = plops;
return 0;
}
}
return -1;
} }
static void statusreader(void *u); static void statusreader(void *u);

View file

@ -12,11 +12,7 @@
#include "usb.h" #include "usb.h"
#include "serial.h" #include "serial.h"
int serialdebug; int serialdebug;
static int sdebug;
Serialport **ports; Serialport **ports;
int nports; int nports;
@ -308,6 +304,17 @@ serdumpst(Serialport *p, char *buf, int bufsz)
return s; 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 static int
serinit(Serialport *p) serinit(Serialport *p)
{ {
@ -755,10 +762,10 @@ static Srv serialfs = {
.end = dend, .end = dend,
}; };
int ftmatch(Serial *ser, char *info); extern int ftprobe(Serial *ser);
int plmatch(Serial *ser, char *info); extern int plprobe(Serial *ser);
int slmatch(Serial *ser, char *info); extern int slprobe(Serial *ser);
int uconsmatch(Serial *ser, char *info); extern int uconsprobe(Serial *ser);
void void
threadmain(int argc, char* argv[]) threadmain(int argc, char* argv[])
@ -790,14 +797,11 @@ threadmain(int argc, char* argv[])
ser->jtag = -1; ser->jtag = -1;
ser->nifcs = 1; ser->nifcs = 1;
snprint(buf, sizeof buf, "vid %#06x did %#06x",
dev->usb->vid, dev->usb->did);
/* probe all the drivers */ /* probe all the drivers */
if(plmatch(ser, buf) if(plprobe(ser)
&& uconsmatch(ser, buf) && uconsprobe(ser)
&& ftmatch(ser, buf) && ftprobe(ser)
&& slmatch(ser, buf)) && slprobe(ser))
sysfatal("no serial devices found"); sysfatal("no serial devices found");
for(i = 0; i < ser->nifcs; i++){ for(i = 0; i < ser->nifcs; i++){
@ -818,9 +822,8 @@ threadmain(int argc, char* argv[])
for(i = 0; i < ser->nifcs; i++){ for(i = 0; i < ser->nifcs; i++){
p = &ser->p[i]; p = &ser->p[i];
dprint(2, "serial: valid interface, calling serinit\n"); dprint(2, "serial: valid interface, calling serinit\n");
if(serinit(p) < 0){ if(serinit(p) < 0)
sysfatal("wserinit: %r"); sysfatal("wserinit: %r");
}
dsprint(2, "serial: adding interface %d, %p\n", p->interfc, p); dsprint(2, "serial: adding interface %d, %p\n", p->interfc, p);
if(ser->nifcs == 1) if(ser->nifcs == 1)
@ -835,10 +838,7 @@ threadmain(int argc, char* argv[])
} }
qunlock(ser); qunlock(ser);
if(nports == 0)
threadexits("no ports");
snprint(buf, sizeof buf, "%d.serial", dev->id); snprint(buf, sizeof buf, "%d.serial", dev->id);
threadpostsharesrv(&serialfs, nil, "usb", buf); threadpostsharesrv(&serialfs, nil, "usb", buf);
threadexits(0); threadexits(nil);
} }

View file

@ -22,7 +22,6 @@ enum {
Maxifc = 16, Maxifc = 16,
}; };
struct Serialport { struct Serialport {
char name[32]; char name[32];
Serial *s; /* device we belong to */ Serial *s; /* device we belong to */
@ -110,17 +109,14 @@ enum {
* !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt * !hget http://lxr.linux.no/source/drivers/usb/serial/pl2303.c|htmlfmt
*/ */
int serialmain(Dev *d, int argc, char *argv[]);
typedef struct Cinfo Cinfo; typedef struct Cinfo Cinfo;
struct Cinfo { struct Cinfo {
int vid; /* usb vendor id */ int vid; /* usb vendor id */
int did; /* usb device/product 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; extern int serialdebug;
#define dsprint if(serialdebug)fprint #define dsprint if(serialdebug)fprint
@ -128,3 +124,4 @@ extern int serialdebug;
int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err); int serialrecover(Serial *ser, Serialport *p, Dev *ep, char *err);
int serialreset(Serial *ser); int serialreset(Serial *ser);
char *serdumpst(Serialport *p, char *buf, int bufsz); 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; static Serialops slops;
slmatch(Serial *ser, char *info) slprobe(Serial *ser)
{ {
Cinfo *ip; Usbdev *ud = ser->dev->usb;
char buf[50];
for(ip = slinfo; ip->vid != 0; ip++){ if(matchid(slinfo, ud->vid, ud->did) == nil)
snprint(buf, sizeof buf, "vid %#06x did %#06x", return -1;
ip->vid, ip->did); ser->Serialops = slops;
if(strstr(info, buf) != nil){ return 0;
ser->Serialops = slops;
return 0;
}
}
return -1;
} }
static int static int

View file

@ -15,26 +15,19 @@ enum {
}; };
Cinfo uconsinfo[] = { Cinfo uconsinfo[] = {
{ Net20DCVid, Net20DCDid }, { Net20DCVid, Net20DCDid, 1 },
{ HuaweiVid, HuaweiE220 }, { HuaweiVid, HuaweiE220, 2 },
{ 0, 0 }, { 0, 0, 0 },
}; };
int int
uconsmatch(Serial *ser, char *info) uconsprobe(Serial *ser)
{ {
Usbdev *ud = ser->dev->usb;
Cinfo *ip; Cinfo *ip;
char buf[50];
for(ip = uconsinfo; ip->vid != 0; ip++){ if((ip = matchid(uconsinfo, ud->vid, ud->did)) == nil)
snprint(buf, sizeof buf, "vid %#06x did %#06x", return -1;
ip->vid, ip->did); ser->nifcs = ip->cid;
dsprint(2, "serial: %s %s\n", buf, info); return 0;
if(strstr(info, buf) != nil){
if(ip->vid == HuaweiVid && ip->did == HuaweiE220)
ser->nifcs = 2;
return 0;
}
}
return -1;
} }