:The NetBSD code is already different:
:1.48         (augustss 15-Sep-99):              /* The OHCI hardware can handle at 
:most one page crossing. */
:1.48         (augustss 15-Sep-99):              if (OHCI_PAGE(dataphys) == 
:dataphysend ||
:1.48         (augustss 15-Sep-99):                  OHCI_PAGE(dataphys) + 
:OHCI_PAGE_SIZE == dataphysend) {
:1.48         (augustss 15-Sep-99):                      /* we can handle it in this 
:TD */
:1.48         (augustss 15-Sep-99):                      curlen = len;
:1.48         (augustss 15-Sep-99):              } else {
:1.48         (augustss 15-Sep-99):                      /* must use multiple TDs, 
:fill as much as possible. */
:1.120        (augustss 03-Feb-02):                      curlen = 2 * OHCI_PAGE_SIZE -
:1.48         (augustss 15-Sep-99):                               (dataphys & 
:(OHCI_PAGE_SIZE-1));
:1.78         (augustss 20-Mar-00):                      /* the length must be a 
:multiple of the max size */
:1.78         (augustss 20-Mar-00):                      curlen -= curlen % 
:UGETW(opipe->pipe.endpoint->edesc->wMaxPacketSize);
:1.78         (augustss 20-Mar-00): #ifdef DIAGNOSTIC
:1.78         (augustss 20-Mar-00):                      if (curlen == 0)
:1.128        (provos   27-Sep-02):                              
:panic("ohci_alloc_std: curlen == 0");
:1.78         (augustss 20-Mar-00): #endif
:1.48         (augustss 15-Sep-99):              }
:
:
:To bad we did not catch it.
:
:-- 
:B.Walter              COSMO-Project         http://www.cosmo-project.de

    Well, that's the curlen fix, which doesn't apply to us at all 
    (in FreeBSD we do not try to optimize for two physically contiguous
    pages).  I'm not sure why they are using a mod there, I think
    it is as simple as if (curlen > len) curlen = len, but I don't
    understand the 'the length must be a multiple of the max size'
    comment so maybe there is some magic there that I haven't considered.

    The fix that applies to both FreeBSD and NetBSD was the calculation of 
    dataphysend just above the code you indicate.  When I look at ohci.c
    via cvsweb for NetBSD, their 1.135, they have not fixed the 
    dataphysend calculation yet.

    They still have (which is WRONG):

        dataphysend = OHCI_PAGE(dataphys + len - 1);    

    The correct answer is:

        dataphysend = OHCI_PAGE(DMAADDR(dma, len - 1));

    I am going to attempt to add [EMAIL PROTECTED] to this thread, I
    don't know if that is a valid email address :-)

                                                -Matt


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to