import packblock fix from richard / bls Reference: /n/atom/patch/applied/bcmetherusbpack Date: Sun Jan 3 03:19:10 CET 2016 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/bcm/etherusb.c Sun Jan 3 03:18:57 2016 +++ /sys/src/9/bcm/etherusb.c Sun Jan 3 03:18:58 2016 @@ -125,7 +125,7 @@ static int unpackasix(Ether *edev, Block *b) { - ulong hd; + u32int hd; int m; uchar *wp; @@ -198,10 +198,10 @@ n = BLEN(b) & 0xFFFF; n |= ~n << 16; - padblock(b, 4); + b = padblock(b, 4); PUT4(b->rp, n); if(BLEN(b) % ctlr->maxpkt == 0){ - padblock(b, -4); + b = padblock(b, -4); PUT4(b->wp, 0xFFFF0000); b->wp += 4; } @@ -214,7 +214,7 @@ int n; n = BLEN(b) & 0x7FF; - padblock(b, 8); + b = padblock(b, 8); PUT4(b->rp, n | SmscTxfirst | SmscTxlast); PUT4(b->rp+4, n); transmit(ctlr, b); @@ -263,6 +263,8 @@ Chan *inchan, *outchan; char *buf; uint bufsize, maxpkt; + uchar ea[Eaddrlen]; + static char nullea[Eaddrlen]; qlock(ctlr); inchan = outchan = nil; @@ -288,9 +290,13 @@ inchan = namec(cb->f[2], Aopen, OREAD, 0); outchan = namec(cb->f[3], Aopen, OWRITE, 0); assert(inchan != nil && outchan != nil); - if(parsemac(ctlr->edev->ea, cb->f[4], Eaddrlen) != Eaddrlen) + if(parsemac(ea, cb->f[4], Eaddrlen) != Eaddrlen) cmderror(cb, "bad etheraddr"); - memmove(ctlr->edev->addr, ctlr->edev->ea, Eaddrlen); + if(memcmp(ctlr->edev->ea, nullea, Eaddrlen) == 0) + memmove(ctlr->edev->ea, ea, Eaddrlen); + else if(memcmp(ctlr->edev->ea, ea, Eaddrlen) != 0) + cmderror(cb, "wrong ether address"); + memmove(ctlr->edev->addr, ea, Eaddrlen); print("\netherusb %s: %E\n", udev->name, ctlr->edev->addr); ctlr->buf = buf; ctlr->inchan = inchan; @@ -412,6 +418,11 @@ ctlr->edev = edev; } +static void +etherusbshutdown(Ether*) +{ +} + static int etherusbpnp(Ether* edev) { @@ -425,6 +436,7 @@ edev->transmit = etherusbtransmit; edev->ifstat = etherusbifstat; edev->ctl = etherusbctl; + edev->shutdown = etherusbshutdown; return 0; }