M pc/devpccard.c => pc/devpccard.c +1 -0
@@ 40,6 40,7 @@ static variant_t variant[] = {
{ Ricoh_vid, Ricoh_478_did, "Ricoh 478 PCI/Cardbus bridge", },
{ TI_vid, TI_1450_did, "TI PCI-1450 Cardbus Controller", },
{ TI_vid, TI_1251A_did, "TI PCI-1251A Cardbus Controller", },
+{ TI_vid, 0xAC51, "TI 0xAC51 Cardbus Controller", },
};
/* Cardbus registers */
M pc/devusb.c => pc/devusb.c +6 -13
@@ 1630,29 1630,22 @@ usbclose(Chan *c)
if(c->qid.type == QTDIR || c->qid.path < Q3rd)
return;
qlock(&usbstate);
- if(waserror()){
- qunlock(&usbstate);
- nexterror();
- }
d = usbdevice(c);
s = QID(c->qid) - Qep0;
if(s >= 0 && s < nelem(d->ep)){
Endpt *e;
- if((e = d->ep[s]) == nil) {
- XPRINT("usbopen failed (endpoint)\n");
- error(Enodev);
- }
- e->isopen--;
- if (e->isopen == 0){
- eptdeactivate(e);
- unschedendpt(e);
+ if(e = d->ep[s]) {
+ if (e->isopen == 1){
+ e->isopen = 0;
+ eptdeactivate(e);
+ unschedendpt(e);
+ }
}
}
if(QID(c->qid) == Qctl)
d->busy = 0;
if(c->flag & COPEN)
freedev(d);
- poperror();
qunlock(&usbstate);
}
M pc/devvga.c => pc/devvga.c +21 -8
@@ 151,6 151,7 @@ vgaread(Chan* c, void* a, long n, vlong off)
len += snprint(p+len, READSTR-len, "blanktime %lud\n", blanktime);
len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off");
len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off");
+ len += snprint(p+len, READSTR-len, "panning %s\n", panning ? "on" : "off");
snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture);
n = readstr(offset, a, n, p);
poperror();
@@ 182,7 183,6 @@ vgactl(char* a)
VGAscr *scr;
extern VGAdev *vgadev[];
extern VGAcur *vgacur[];
- Rectangle r;
n = getfields(a, field, nelem(field), 1, " \t\n");
if(n < 1)
@@ 286,13 286,8 @@ vgactl(char* a)
if(x > scr->gscreen->r.max.x || y > scr->gscreen->r.max.y)
error("physical screen bigger than virtual");
- r = Rect(0,0,x,y);
- if(!eqrect(r, scr->gscreen->r)){
- if(scr->cur == nil || scr->cur->doespanning == 0)
- error("virtual screen not supported");
- }
-
- physgscreenr = r;
+ physgscreenr = Rect(0,0,x,y);
+ scr->gscreen->clipr = physgscreenr;
return;
}
else if(strcmp(field[0], "palettedepth") == 0){
@@ 344,6 339,24 @@ vgactl(char* a)
blanktime = strtoul(field[1], 0, 0);
return;
}
+ else if(strcmp(field[0], "panning") == 0){
+ if(n < 2)
+ error(Ebadarg);
+ if(strcmp(field[1], "on") == 0){
+ if(scr == nil || scr->cur == nil)
+ error("set screen first");
+ if(!scr->cur->doespanning)
+ error("panning not supported");
+ scr->gscreen->clipr = scr->gscreen->r;
+ panning = 1;
+ }
+ else if(strcmp(field[1], "off") == 0){
+ scr->gscreen->clipr = physgscreenr;
+ panning = 0;
+ }else
+ error(Ebadarg);
+ return;
+ }
else if(strcmp(field[0], "hwaccel") == 0){
if(n < 2)
error(Ebadarg);
M pc/ether79c970.c => pc/ether79c970.c +3 -0
@@ 501,6 501,9 @@ reset(Ether* ether)
/*
* Allocate a controller structure and start to initialise it.
*/
+ if(ioalloc(ctlr->port, 0x20, 0, "ether79c970") < 0)
+ return -1;
+
ether->ctlr = ctlr;
ether->port = ctlr->port;
ether->irq = ctlr->pcidev->intl;
M pc/etherwavelan.c => pc/etherwavelan.c +26 -12
@@ 301,6 301,8 @@ struct Ctlr
Wltv keys; // default keys
int xclear; // exclude clear packets off/on
+ int ctlrno;
+
Stats;
WStats;
};
@@ 326,22 328,32 @@ w_cmd(Ctlr *ctlr, ushort cmd, ushort arg)
{
int i, rc;
+ for(i=0; i<WTmOut; i++)
+ if((csr_ins(ctlr, WR_Cmd)&WCmdBusy) == 0)
+ break;
+ if(i==WTmOut){
+ print("#l%d: issuing cmd %.4ux: %.4ux\n", ctlr->ctlrno, cmd, csr_ins(ctlr, WR_Cmd));
+ return -1;
+ }
+
csr_outs(ctlr, WR_Parm0, arg);
csr_outs(ctlr, WR_Cmd, cmd);
- for (i = 0; i<WTmOut; i++){
- rc = csr_ins(ctlr, WR_EvSts);
- if ( rc&WCmdEv ){
- rc = csr_ins(ctlr, WR_Sts);
- csr_ack(ctlr, WCmdEv);
- if ((rc&WCmdMsk) != (cmd&WCmdMsk))
- break;
- if (rc&WResSts)
- break;
- return 0;
- }
+
+ for(i=0; i<WTmOut; i++)
+ if(csr_ins(ctlr, WR_EvSts)&WCmdEv)
+ break;
+ if(i==WTmOut){
+ print("#l%d: execing cmd %.4ux: %.4ux\n", ctlr->ctlrno, cmd, csr_ins(ctlr, WR_EvSts));
+ return -1;
}
+ rc = csr_ins(ctlr, WR_Sts);
+ csr_ack(ctlr, WCmdEv);
- return -1;
+ if((rc&WCmdMsk) != (cmd&WCmdMsk) || (rc&WResSts)){
+ print("#l%d: cmd %.4ux: status %.4ux\n", ctlr->ctlrno, cmd, rc);
+ return -1;
+ }
+ return 0;
}
static int
@@ 1190,6 1202,7 @@ interrupt(Ureg* ,void* arg)
static char* wavenames[] = {
"WaveLAN/IEEE",
"TrueMobile 1150",
+ "Instant Wireless ; Network PC CARD",
nil,
};
@@ 1205,6 1218,7 @@ reset(Ether* ether)
return -1;
ilock(&ctlr->Lock);
+ ctlr->ctlrno = ether->ctlrno;
if (ether->port==0)
ether->port=WDfltIOB;
M pc/screen.c => pc/screen.c +5 -8
@@ 13,8 13,6 @@
#include <cursor.h>
#include "screen.h"
-#define round16(x) (((x)+15)&~15)
-
#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19)
Point ZP = {0, 0};
@@ 53,7 51,7 @@ screensize(int x, int y, int z, ulong chan)
* be given back if aperture is set.
*/
if(scr->aperture == 0){
- int width = (round16(x)*z)/BI2WD;
+ int width = (x*z)/BI2WD;
gscreendata.bdata = xalloc(width*BY2WD*y);
if(gscreendata.bdata == 0)
@@ 69,13 67,11 @@ screensize(int x, int y, int z, ulong chan)
if(gscreen)
freememimage(gscreen);
- gscreen = allocmemimaged(Rect(0,0,round16(x),y), chan, &gscreendata);
+ gscreen = allocmemimaged(Rect(0,0,x,y), chan, &gscreendata);
vgaimageinit(chan);
if(gscreen == nil)
return -1;
- gscreen->r.max.x = x; /* we used round16(x) to allocate */
-
scr->palettedepth = 6; /* default */
scr->gscreendata = &gscreendata;
scr->memdefont = getmemdefont();
@@ 131,7 127,7 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
if(scr->gscreen == nil || scr->gscreendata == nil)
return nil;
- *r = scr->gscreen->r;
+ *r = scr->gscreen->clipr;
*chan = scr->gscreen->chan;
*d = scr->gscreen->depth;
*width = scr->gscreen->width;
@@ 329,7 325,8 @@ setcursor(Cursor* curs)
}
int hwaccel = 1;
-int hwblank = 1;
+int hwblank = 0; /* turned on by drivers that are known good */
+int panning = 0;
int
hwdraw(Memdrawparam *par)
M pc/screen.h => pc/screen.h +2 -0
@@ 127,6 127,7 @@ extern void mousectl(char*[], int);
/* screen.c */
extern int hwaccel; /* use hw acceleration; default on */
extern int hwblank; /* use hw blanking; default on */
+extern int panning; /* use virtual screen panning; default off */
extern void addvgaseg(char*, ulong, ulong);
extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*);
extern void flushmemscreen(Rectangle);
@@ 142,6 143,7 @@ extern void blankscreen(int);
extern void deletescreenimage(void);
extern int drawhasclients(void);
extern ulong blanktime;
+extern void setscreenimageclipr(Rectangle);
/* vga.c */
extern void vgascreenwin(VGAscr*);
M pc/vgamach64xx.c => pc/vgamach64xx.c +2 -1
@@ 580,7 580,7 @@ mach64xxcurmove(VGAscr* scr, Point p)
else
dx = 64 / scr->gscreen->depth;
- if(screenpan(p, &physgscreenr, dx, 1)){
+ if(panning && screenpan(p, &physgscreenr, dx, 1)){
off = (physgscreenr.min.y*Dx(scr->gscreen->r)+physgscreenr.min.x)/dx;
pitch = Dx(scr->gscreen->r)/8;
iow32(scr, CrtcOffPitch, (pitch<<22)|off);
@@ 999,6 999,7 @@ mach64xxdrawinit(VGAscr *scr)
case ('L'<<8)|'M': /* 4C4D: Rage Mobility */
case ('L'<<8)|'P': /* 4C50: Rage 3D LTPro */
scr->blank = mach64lcdblank;
+ hwblank = 1;
break;
}
}
M pc/vganvidia.c => pc/vganvidia.c +1 -0
@@ 362,6 362,7 @@ nvidiadrawinit(VGAscr *scr)
waitforidle(scr);
scr->blank = nvidiablank;
+ hwblank = 1;
scr->fill = nvidiahwfill;
scr->scroll = nvidiahwscroll;
}
M pc/vgas3.c => pc/vgas3.c +6 -7
@@ 12,8 12,6 @@
#include <cursor.h>
#include "screen.h"
-#define round16(x) (((x)+15)&~15)
-
enum {
PCIS3 = 0x5333, /* PCI VID */
@@ 463,7 461,7 @@ hwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
d = scr->gscreen->depth;
did = (d-8)/8;
cmd = 0x00000020|(Bitbltop<<17)|(did<<2);
- stride = round16(Dx(scr->gscreen->r))*d/8;
+ stride = Dx(scr->gscreen->r)*d/8;
if(r.min.x <= sr.min.x){
cmd |= 1<<25;
@@ 508,7 506,7 @@ hwfill(VGAscr *scr, Rectangle r, ulong sval)
d = scr->gscreen->depth;
did = (d-8)/8;
cmd = 0x16000120|(Bitbltop<<17)|(did<<2);
- stride = round16(Dx(scr->gscreen->r))*d/8;
+ stride = Dx(scr->gscreen->r)*d/8;
mmio = scr->mmio;
waitforlinearfifo(scr);
waitforfifo(scr, 8);
@@ 533,7 531,7 @@ enum {
};
static void
-s3blank(int blank)
+s3blank(VGAscr*, int blank)
{
uchar x;
@@ 544,7 542,6 @@ s3blank(int blank)
vgaxo(Seqx, CursorSyncCtl, x);
}
-
static void
s3drawinit(VGAscr *scr)
{
@@ 561,6 558,9 @@ s3drawinit(VGAscr *scr)
* know that size, I'm not turning them on. See waitforlinearfifo
* above.
*/
+ scr->blank = s3blank;
+ /* hwblank = 1; not known to work well */
+
switch(id){
case VIRGE:
case VIRGEVX:
@@ 568,7 568,6 @@ s3drawinit(VGAscr *scr)
scr->mmio = (ulong*)(scr->aperture+0x1000000);
scr->fill = hwfill;
scr->scroll = hwscroll;
- /* scr->blank = hwblank; */
break;
case SAVAGEIXMV:
scr->mmio = (ulong*)(scr->aperture+0x1000000);
M pc/vgasavage.c => pc/vgasavage.c +3 -4
@@ 12,7 12,6 @@
#include <cursor.h>
#include "screen.h"
-#define round16(x) (((x)+15)&~15)
enum {
PCIS3 = 0x5333, /* PCI VID */
@@ 363,7 362,6 @@ savagewaitidle(VGAscr *scr)
switch(scr->id){
case SAVAGE4:
- case SUPERSAVAGEIXC16:
/* wait for engine idle and FIFO empty */
statw = (ulong*)((uchar*)scr->mmio+AltStatus0);
mask = CBEMask | Ge2Idle;
@@ 373,6 371,7 @@ savagewaitidle(VGAscr *scr)
/* case SAVAGEMX: ? */
/* case SAVAGEIXMV: ? */
/* case SAVAGEIX: ? */
+ case SUPERSAVAGEIXC16:
case SAVAGEIXMV:
/* wait for engine idle and FIFO empty */
statw = (ulong*)((uchar*)scr->mmio+XStatus0);
@@ 457,7 456,6 @@ savagescroll(VGAscr *scr, Rectangle r, Rectangle sr)
return 1;
}
-
static void
savageblank(VGAscr*, int blank)
{
@@ 521,7 519,7 @@ savageinit(VGAscr *scr)
/* set bitmap descriptors */
bd = (scr->gscreen->depth<<DepthShift) |
- (round16(Dx(scr->gscreen->r))<<StrideShift) | BlockWriteDis
+ (Dx(scr->gscreen->r)<<StrideShift) | BlockWriteDis
| BDS64;
*(ulong*)(mmio+GBD1) = 0;
@@ 547,5 545,6 @@ savageinit(VGAscr *scr)
scr->fill = savagefill;
scr->scroll = savagescroll;
+ scr->blank = savageblank;
}
M pc/vgat2r4.c => pc/vgat2r4.c +1 -0
@@ 562,6 562,7 @@ t2r4drawinit(VGAscr *scr)
scr->fill = t2r4hwfill;
scr->scroll = t2r4hwscroll;
scr->blank = t2r4blank;
+ hwblank = 1;
}
VGAdev vgat2r4dev = {
M port/devdraw.c => port/devdraw.c +1 -1
@@ 860,7 860,7 @@ initscreenimage(void)
}
screenimage->width = width;
- screenimage->clipr = screenimage->r;
+ screenimage->clipr = r;
return 1;
}
M port/devmouse.c => port/devmouse.c +8 -8
@@ 501,15 501,15 @@ mousetrack(int dx, int dy, int b, int msec)
dy = scale(dy);
}
x = mouse.xy.x + dx;
- if(x < gscreen->r.min.x)
- x = gscreen->r.min.x;
- if(x >= gscreen->r.max.x)
- x = gscreen->r.max.x;
+ if(x < gscreen->clipr.min.x)
+ x = gscreen->clipr.min.x;
+ if(x >= gscreen->clipr.max.x)
+ x = gscreen->clipr.max.x;
y = mouse.xy.y + dy;
- if(y < gscreen->r.min.y)
- y = gscreen->r.min.y;
- if(y >= gscreen->r.max.y)
- y = gscreen->r.max.y;
+ if(y < gscreen->clipr.min.y)
+ y = gscreen->clipr.min.y;
+ if(y >= gscreen->clipr.max.y)
+ y = gscreen->clipr.max.y;
lastb = mouse.buttons;
mouse.xy = Pt(x, y);