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

Reply via email to