/* 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