summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlex Musolino <alex@musolino.id.au>2020-04-01 22:57:15 +1030
committerAlex Musolino <alex@musolino.id.au>2020-04-01 22:57:15 +1030
commitad3da2fac222b42f06576262130b9f1f201b585c (patch)
treeda69709e6abbeab53d59acff4d89c58179a42989 /sys
parentc3938067180ed707828cdbcd0b2d430a13323dd9 (diff)
parent55033d9aedd86ab398644d188ae826cb537a52c7 (diff)
merge
Diffstat (limited to 'sys')
-rw-r--r--sys/man/3/kbd21
-rw-r--r--sys/src/9/pc/audiohda.c1
-rw-r--r--sys/src/9/pc/devkbd.c34
-rw-r--r--sys/src/cmd/ip/dhcp6d.c35
4 files changed, 39 insertions, 52 deletions
diff --git a/sys/man/3/kbd b/sys/man/3/kbd
index 82422c7dd..3d95cb4e8 100644
--- a/sys/man/3/kbd
+++ b/sys/man/3/kbd
@@ -7,17 +7,15 @@ kbd \- pc keyboard driver
.B /dev/scancode
.B /dev/leds
-.B /dev/repeat
.fi
.SH DESCRIPTION
.PP
The
.I kbd
device serves a one-level directory containing the files
-.BR scancode ,
-.BR leds
+.BR scancode
and
-.BR repeat .
+.BR leds .
.PP
Reading the
.BR scancode
@@ -31,27 +29,14 @@ file can be only opened once by the hostowner.
.PP
Writing a number to the write-only
.BR leds
-file changes the status leds on the keyboard. The value of the
+file changes the status leds on the keyboard. the value of the
number is the addition of 1, 2 and 4 representing activated
Scroll, Num and Caps leds.
-.PP
-The
-.BR repeat
-file sets typematic rate and delay. The value of the number is a
-bitmask where first 5 bits set the repeat rate (ranging from 0b00000
-for 30Hz to 0b11111 for 2Hz). Bits 6 and 7 set the delay before the
-first repeat is activated (ranging from 0b00 for 250Hz to 0b11 for
-1000Hz).
.SH EXAMPLE
Set the Scroll and Caps leds:
.EX
echo 5 >/dev/leds
.EE
-.PP
-Enable fast repeat rate and the least delay:
-.EX
-echo 0 >/dev/repeat
-.EE
.SH "SEE ALSO"
.IR kbdfs (8)
.SH SOURCE
diff --git a/sys/src/9/pc/audiohda.c b/sys/src/9/pc/audiohda.c
index bbcf2c3bd..9f9b2f280 100644
--- a/sys/src/9/pc/audiohda.c
+++ b/sys/src/9/pc/audiohda.c
@@ -1775,6 +1775,7 @@ hdamatch(Pcidev *p)
case (0x1022 << 16) | 0x780d: /* AMD FCH Azalia Controller */
case (0x1022 << 16) | 0x1457: /* AMD Family 17h (Models 00h-0fh) HD Audio Controller */
+ case (0x1022 << 16) | 0x15e3: /* AMD Raven HD Audio Controller */
case (0x15ad << 16) | 0x1977: /* Vmware */
return p;
diff --git a/sys/src/9/pc/devkbd.c b/sys/src/9/pc/devkbd.c
index 5f6865ef1..5aeaded1f 100644
--- a/sys/src/9/pc/devkbd.c
+++ b/sys/src/9/pc/devkbd.c
@@ -40,14 +40,12 @@ enum {
Qdir,
Qscancode,
Qleds,
- Qrepeat,
};
static Dirtab kbdtab[] = {
".", {Qdir, 0, QTDIR}, 0, 0555,
"scancode", {Qscancode, 0}, 0, 0440,
"leds", {Qleds, 0}, 0, 0220,
- "repeat", {Qrepeat, 0}, 0, 0220,
};
static Lock i8042lock;
@@ -195,28 +193,6 @@ setleds(int leds)
iunlock(&i8042lock);
}
-static void
-setrepeat(int repeat)
-{
- if(nokbd)
- return;
-
- repeat &= 0x7f;
- ilock(&i8042lock);
- for(;;){
- if(outready() < 0)
- break;
- outb(Data, 0xf3); /* `set typematic rate and delay' */
- if(outready() < 0)
- break;
- outb(Data, repeat);
- if(outready() < 0)
- break;
- break;
- }
- iunlock(&i8042lock);
-}
-
/*
* keyboard interrupt
*/
@@ -381,18 +357,16 @@ kbdwrite(Chan *c, void *a, long n, vlong)
{
char tmp[8+1], *p;
+ if(c->qid.path != Qleds)
+ error(Egreg);
+
p = tmp + n;
if(n >= sizeof(tmp))
p = tmp + sizeof(tmp)-1;
memmove(tmp, a, p - tmp);
*p = 0;
- if(c->qid.path == Qleds)
- setleds(atoi(tmp));
- else if(c->qid.path == Qrepeat)
- setrepeat(atoi(tmp));
- else
- error(Egreg);
+ setleds(atoi(tmp));
return n;
}
diff --git a/sys/src/cmd/ip/dhcp6d.c b/sys/src/cmd/ip/dhcp6d.c
index 8250518a0..c75c67ea0 100644
--- a/sys/src/cmd/ip/dhcp6d.c
+++ b/sys/src/cmd/ip/dhcp6d.c
@@ -31,7 +31,8 @@ struct Req
Udphdr *udp;
Ipifc *ifc;
- uchar mac[Eaddrlen];
+ int ncid;
+ uchar cid[256];
uchar ips[IPaddrlen*8];
int nips;
@@ -236,6 +237,31 @@ lookupips(uchar *ip, int n, Ndb *db, uchar mac[Eaddrlen])
return r;
}
+static uchar*
+clientea(Req *r)
+{
+ static uchar ea[Eaddrlen];
+ u32int type;
+ uchar *ip;
+
+ if(r->ncid >= 4+Eaddrlen){
+ type = r->cid[0]<<24 | r->cid[1]<<16 | r->cid[2]<<8 | r->cid[3];
+ switch(type){
+ case 0x00010001:
+ case 0x00030001:
+ return r->cid + r->ncid - Eaddrlen;
+ }
+ }
+ ip = r->udp->raddr;
+ ea[0] = ip[8] ^ 2;
+ ea[1] = ip[9];
+ ea[2] = ip[10];
+ ea[3] = ip[13];
+ ea[4] = ip[14];
+ ea[5] = ip[15];
+ return ea;
+}
+
static void
clearotab(void)
{
@@ -387,7 +413,7 @@ main(int argc, char *argv[])
if((r->db = opendb()) == nil)
continue;
- r->nips = lookupips(r->ips, sizeof(r->ips), r->db, r->mac)/IPaddrlen;
+ r->nips = lookupips(r->ips, sizeof(r->ips), r->db, clientea(r))/IPaddrlen;
if(debug){
for(i=0; i<r->nips; i++)
fprint(2, "ip=%I\n", r->ips+i*IPaddrlen);
@@ -411,10 +437,11 @@ oclientid(uchar *w, int n, Otab*, Req *r)
if((p = gettlv(1, &len, r->req.p, r->req.e)) == nil)
return -1;
- if(len < 4+4+Eaddrlen || n < len)
+ if(len > sizeof(r->cid) || n < len)
return -1;
- memmove(r->mac, p+len-Eaddrlen, Eaddrlen);
memmove(w, p, len);
+ memmove(r->cid, p, len);
+ r->ncid = len;
return len;
}