~kris/9p

9hist

bb55d7f834e107d918ed8bf365f6333c6aa69887 — David du Colombier 24 years ago b357cee
Plan 9 from Bell Labs 2001-12-01
3 files changed, 39 insertions(+), 8 deletions(-)

M pc/devusb.c
M pc/pcmciamodem.c
M pc/uarti8250.c
M pc/devusb.c => pc/devusb.c +31 -7
@@ 958,6 958,7 @@ devendpt(Udev *d, int id, int add)
	lock(d);
	if((e = *p) != nil){
		incref(e);
		XPRINT("incref(0x%p) in devendpt, new value %ld\n", e, e->ref);
		unlock(d);
		return e;
	}


@@ 980,6 981,7 @@ devendpt(Udev *d, int id, int add)
	lock(d);
	if(*p != nil){
		incref(*p);
		XPRINT("incref(0x%p) in devendpt, new value %ld\n", *p, (*p)->ref);
		unlock(d);
		free(e);
		return *p;


@@ 991,7 993,7 @@ devendpt(Udev *d, int id, int add)
	return e;
}

static void
static int
freept(Endpt *e)
{
	if(e != nil && decref(e) == 0){


@@ 1002,7 1004,10 @@ freept(Endpt *e)
		if(e->epq != nil)
			freeqh(&ubus, e->epq);
		free(e);
		return 1;
	}
	if (e) XPRINT("decref(0x%p) in freept, new value %ld\n", e, e->ref);
	return 0;
}

static void


@@ 1015,17 1020,28 @@ usbdevreset(Udev *d)
}

static void
freedev(Udev *d)
freedev(Udev *d, int ept)
{
	int i;
	Endpt *e;

	if(d != nil && decref(d) == 0){
		XPRINT("freedev 0x%p, 0\n", d);
		for(i=0; i<nelem(d->ep); i++)
			freept(d->ep[i]);
		if(d->x >= 0)
			usbdev[d->x] = nil;
		free(d);
	}
	} else {
		if(ept >= 0 && ept < nelem(d->ep)){
			e = d->ep[ept];
			XPRINT("freedev, freept 0x%p\n", e);
			if(e != nil){
				eptdeactivate(e);
				unschedendpt(e);
			}
		}
	}	
}

static void


@@ 1329,6 1345,7 @@ usbnewdevice(void)
			d->x = i;
			d->id = (ubus.idgen << 8) | i;
			d->state = Enabled;
			XPRINT("calling devendpt in usbnewdevice\n");
			e = devendpt(d, 0, 1);	/* always provide control endpoint 0 */
			e->mode = ORDWR;
			e->iso = 0;


@@ 1678,6 1695,7 @@ void
usbclose(Chan *c)
{
	Udev *d;
	int ept;

	if(c->qid.type == QTDIR || QID(c->qid) < Q3rd)
		return;


@@ 1689,9 1707,11 @@ usbclose(Chan *c)
	d = usbdevice(c);
	if(QID(c->qid) == Qctl)
		d->busy = 0;
	XPRINT("usbclose: dev 0x%p\n", d);
	if(c->flag & COPEN){
		ept = (QID(c->qid) != Qctl) ? QID(c->qid) - Qep0 : -1;
		XPRINT("usbclose: freedev 0x%p\n", d);
		freedev(d);
		freedev(d, ept);
	}
	poperror();
	qunlock(&usbstate);


@@ 1819,7 1839,7 @@ isoio(Endpt *e, void *a, long n, ulong offset, int w)
			memmove(p, q, i);
			e->buffered -= i;
			if (e->buffered < 0){
				iprint("e->buffered %d?\n", e->buffered);
				XPRINT("e->buffered %d?\n", e->buffered);
				e->buffered = 0;
			}
		}


@@ 2121,8 2141,10 @@ usbwrite(Chan *c, void *a, long n, vlong offset)
				cmderror(cb, Ebadusbmsg);
			if (i == 0)
				d->csp = strtoul(cb->f[3], nil, 0);
			if(d->ep[i] == nil)
			if(d->ep[i] == nil){
				XPRINT("calling devendpt in usbwrite (CMclass)\n");
				d->ep[i] = devendpt(d, i, 1);
			}
			d->ep[i]->csp = strtoul(cb->f[3], nil, 0);
			break;
		case CMdata:


@@ 2169,8 2191,10 @@ usbwrite(Chan *c, void *a, long n, vlong offset)
				XPRINT("field 1: 0 <= %d < %d\n", i, nelem(d->ep));
				error(Ebadarg);
			}
			if((e = d->ep[i]) == nil)
			if((e = d->ep[i]) == nil){
				XPRINT("calling devendpt in usbwrite (CMep)\n");
				e = devendpt(d, i, 1);
			}
			qlock(&usbstate);
			if(waserror()){
				freept(e);

M pc/pcmciamodem.c => pc/pcmciamodem.c +3 -1
@@ 21,7 21,7 @@ enum {

static char* modems[] = {
	"IBM 33.6 Data/Fax/Voice Modem",
	"CM-56G",				/* Xircom CreditCard Modem 56 - GlobalACCESS */
	"CM-56G",			/* Xircom CreditCard Modem 56 - GlobalACCESS */
	"KeepInTouch",
	"CEM56",
	0,


@@ 58,6 58,8 @@ pcmciamodemlink(void)

		slot = pcmspecial(modems[j], &isa);
		if(slot >= 0){
			if(ioalloc(isa.port, 8, 0, modems[j]) < 0)
				print("%s port %lux already in use\n", modems[j], isa.port);
			print("%s in pcmcia slot %d port 0x%lux irq %lud\n",
				modems[j], slot, isa.port, isa.irq);
		}

M pc/uarti8250.c => pc/uarti8250.c +5 -0
@@ 446,6 446,7 @@ i8250interrupt(Ureg*, void* arg)
	Ctlr *ctlr;
	Uart *uart;
	int iir, lsr, old, r;
int nin;

	uart = arg;



@@ 487,6 488,7 @@ i8250interrupt(Ureg*, void* arg)
			 * overrun is an indication that something has
			 * already been tossed.
			 */
nin = 0;
			while((lsr = csr8r(ctlr, Lsr)) & Dr){
				if(lsr & Oe)
					uart->oerr++;


@@ 497,8 499,11 @@ i8250interrupt(Ureg*, void* arg)
				r = csr8r(ctlr, Rbr);
				if(!(lsr & (Bi|Fe|Pe)))
					uartrecv(uart, r);
				nin++;
			}
if(nin == 0) print("%ux but no data\n", iir);
			break;

		default:
			iprint("weird uart interrupt 0x%2.2uX\n", iir);
			break;