Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Jun 2006 15:10:12 GMT
From:      Pavel Merdin <freebsd-bugs@merdin.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/68351: [bge] bge0 watchdog timeout on 5.2.1 and -current, 5.1 is ok
Message-ID:  <200606021510.k52FACXu042845@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/68351; it has been noted by GNATS.

From: Pavel Merdin <freebsd-bugs@merdin.com>
To: bug-followup@FreeBSD.org, freebsd-bugs@mikhailov.org
Cc:  
Subject: Re: kern/68351: [bge] bge0 watchdog timeout on 5.2.1 and -current, 5.1 is ok
Date: Fri, 2 Jun 2006 18:08:17 +0300

 Hello.
 
   The following patch seems to work:
   
 ==============================================================
 --- if_bge.c.orig    Fri Jun  2 08:05:57 2006
 +++ if_bge.c.new        Fri Jun  2 08:06:39 2006
 @@ -1085,11 +1085,21 @@
                                 (0x3F000F);
         } else {
                 /* PCI-X bus */
 +           if (sc->bge_asicrev == BGE_ASICREV_BCM5750) {
 +                       dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD;
 +                       dma_rw_ctl &= ~BGE_PCIDMARWCTL_ONEDMA_ATONCE; /* XXX */
 +                       device_printf(sc->bge_dev, "Gotcha\n");
 +
 +                       if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5780)
 +                               dma_rw_ctl |= (1 << 20) | (1 << 18) |
 +                                           BGE_PCIDMARWCTL_ONEDMA_ATONCE;
 +                       else
 +                               dma_rw_ctl |= (1<<20) | (1<<18) | (1<<15);
 +           } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703)
                 /*
                  * The 5704 uses a different encoding of read/write
                  * watermarks.
                  */
 -               if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703)
                         dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
                             (0x9F0000);
                 else if (sc->bge_asicrev == BGE_ASICREV_BCM5780)
 ==============================================================
 
 It   was   imported   from  OpenBSD.  I  think  that  somebody  could
 import their changes into FreeBSD :)
 
 The full patch with 5780 support:
 
 ==============================================================
 --- if_bge.c.orig       Sat Mar  4 04:34:48 2006
 +++ if_bge.c    Fri Jun  2 08:06:39 2006
 @@ -152,16 +152,28 @@
                 "Broadcom BCM5704C Dual Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5704S,
                 "Broadcom BCM5704S Dual Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5704S_2,
 +               "Broadcom BCM5704S v2 Dual Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5705,
                 "Broadcom BCM5705 Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5705K,
                 "Broadcom BCM5705K Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5705F,
 +               "Broadcom BCM5705F Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5705M,
                 "Broadcom BCM5705M Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5705M_ALT,
                 "Broadcom BCM5705M Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5714C,
                 "Broadcom BCM5714C Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5714S,
 +               "Broadcom BCM5714S Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5715,
 +               "Broadcom BCM5715 Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5715S,
 +               "Broadcom BCM5715S Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5720,
 +               "Broadcom BCM5720 Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5721,
                 "Broadcom BCM5721 Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5750,
 @@ -170,10 +182,22 @@
                 "Broadcom BCM5750M Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5751,
                 "Broadcom BCM5751 Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5751F,
 +               "Broadcom BCM5751F Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5751M,
                 "Broadcom BCM5751M Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5752,
                 "Broadcom BCM5752 Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5753F,
 +               "Broadcom BCM5753F Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5753M,
 +               "Broadcom BCM5753M Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5780,
 +               "Broadcom BCM5780 Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5780S,
 +               "Broadcom BCM5780S Gigabit Ethernet" },
 +       { BCOM_VENDORID, BCOM_DEVICEID_BCM5781,
 +               "Broadcom BCM5781 Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5782,
                 "Broadcom BCM5782 Gigabit Ethernet" },
         { BCOM_VENDORID, BCOM_DEVICEID_BCM5788,
 @@ -1048,30 +1072,45 @@
         /* Set up the PCI DMA control register. */
         if (sc->bge_pcie) {
                 dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 -                   (0xf << BGE_PCIDMARWCTL_RD_WAT_SHIFT) |
 -                   (0x2 << BGE_PCIDMARWCTL_WR_WAT_SHIFT);
 +                   (0x180000);
         } else if (pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE, 4) &
             BGE_PCISTATE_PCI_BUSMODE) {
                 /* Conventional PCI bus */
 +                       if (sc->bge_asicrev == BGE_ASICREV_BCM5705 ||
 +                                       BGE_ASICREV_BCM5750) {
 +                          dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 +                                (0x3F0000); }
 +         else
                 dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 -                   (0x7 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) |
 -                   (0x7 << BGE_PCIDMARWCTL_WR_WAT_SHIFT) |
 -                   (0x0F);
 +                               (0x3F000F);
         } else {
                 /* PCI-X bus */
 +           if (sc->bge_asicrev == BGE_ASICREV_BCM5750) {
 +                       dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD;
 +                       dma_rw_ctl &= ~BGE_PCIDMARWCTL_ONEDMA_ATONCE; /* XXX */
 +                       device_printf(sc->bge_dev, "Gotcha\n");
 +
 +                       if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5780)
 +                               dma_rw_ctl |= (1 << 20) | (1 << 18) |
 +                                           BGE_PCIDMARWCTL_ONEDMA_ATONCE;
 +                       else
 +                               dma_rw_ctl |= (1<<20) | (1<<18) | (1<<15);
 +           } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703)
                 /*
                  * The 5704 uses a different encoding of read/write
                  * watermarks.
                  */
 -               if (sc->bge_asicrev == BGE_ASICREV_BCM5704)
                         dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 -                           (0x7 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) |
 -                           (0x3 << BGE_PCIDMARWCTL_WR_WAT_SHIFT);
 +                           (0x9F0000);
 +               else if (sc->bge_asicrev == BGE_ASICREV_BCM5780)
 +                       dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 +                           (0x144000);
 +               else if (sc->bge_asicrev == BGE_ASICREV_BCM5714)
 +                       dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 +                           (0x148000);
                 else
                         dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD |
 -                           (0x3 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) |
 -                           (0x3 << BGE_PCIDMARWCTL_WR_WAT_SHIFT) |
 -                           (0x0F);
 +                           (0x1B000F);
 
                 /*
                  * 5703 and 5704 need ONEDMA_AT_ONCE as a workaround
 @@ -2103,7 +2142,8 @@
          * on this chip.
          */
         if (sc->bge_asicrev == BGE_ASICREV_BCM5714 ||
 -            sc->bge_asicrev == BGE_ASICREV_BCM5752)
 +            sc->bge_asicrev == BGE_ASICREV_BCM5752 ||
 +            sc->bge_asicrev == BGE_ASICREV_BCM5780)
                 sc->bge_asicrev = BGE_ASICREV_BCM5750;
 
         /*
 
 ==============================================================
 
 
 -- 
 / Pavel Merdin
 Fotki Inc.
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606021510.k52FACXu042845>