/* compute log10(ether->mbps) into lg */
for(lg = 0, mb = ether->mbps; mb >= 10; lg++)
mb /= 10;
if (lg > 0)
lg--;
if (lg > 14) /* 2^(14+17) = 2ⁱ */
lg = 14;
/* allocate larger output queues for higher-speed interfaces */
bsz = 1UL << (lg + 17); /* 2ⁱ⁷ = 128K, bsz = 2ⁿ × 128K */
while (bsz > mainmem->maxsize / 8 && bsz > 128*1024)
bsz /= 2;
netifinit(ether, name, Ntypes, bsz);
>> while (ether->oq == nil && bsz > 128*1024) {
bsz /= 2;
ether->oq = qopen(bsz, Qmsg, 0, 0);
ether->limit = bsz;
}
if(ether->oq == nil)
panic("etherreset %s", name);
the simple fix would be to change the > on the marked
line to >=. but i think the while loop could be tossed
since malloc panics on failure and since qopen only allocates
sizeof(Queue) regardless of the limit argument. i had
this code when i wrote the myricom driver (qio sets q->limit itself).
j = ether->mbps;
if(j > 1000)
j *= 10;
for(i = 0; j >= 100; i++)
j /= 10;
i = (128<<i) * 1024;
netifinit(ether, name, Ntypes, i);
if(ether->oq == nil)
ether->oq = qopen(i, Qmsg, 0, 0);
if(ether->oq == nil)
panic("etherreset %s", name);
by the way, a quick scan shows
ether2114x
etherrhine
are capable of setting mbps to 0 on startup. this should
be legal, since ethernet can be connected after boot.
- erik