Ticket #1590: newbroadcom.diff

File newbroadcom.diff, 8.7 KB (added by PieterPanman, 15 years ago)

my own take at the problem with korli's new version

  • build/jam/HaikuImage

     
    143143    #vlance
    144144    $(X86_ONLY)marvell_yukon $(X86_ONLY)syskonnect usb_ecm
    145145    $(GPL_ONLY)bcm570x
     146    broadcom570x
    146147;
    147148#BEOS_ADD_ONS_DRIVERS_ACPI = $(X86_ONLY)acpi_button ;
    148149BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
     
    161162    : generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa ;
    162163AddFilesToHaikuImage beos system add-ons kernel busses scsi
    163164    : ahci ;
    164 AddFilesToHaikuImage beos system add-ons kernel busses usb
    165     : <usb>uhci <usb>ohci <usb>ehci ;
     165#AddFilesToHaikuImage beos system add-ons kernel busses usb
     166#   : <usb>uhci <usb>ohci <usb>ehci ;
    166167AddFilesToHaikuImage beos system add-ons kernel console : vga_text ;
    167168AddFilesToHaikuImage beos system add-ons kernel debugger
    168169    : $(X86_ONLY)<kdebug>disasm <kdebug>hangman <kdebug>invalidate_on_exit ;
     
    385386    $(PPC_ONLY)openpic
    386387    ide_adapter locked_pool scsi_periph
    387388    ahci generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa
    388     <usb>uhci <usb>ohci <usb>ehci
     389#   <usb>uhci <usb>ohci <usb>ehci
    389390    scsi_cd scsi_disk usb_disk
    390391    intel
    391392    bfs
  • src/add-ons/kernel/drivers/network/broadcom570x/dev/bge/if_bge.c

     
    398398static void bge_sig_legacy(struct bge_softc *, int);
    399399static void bge_sig_pre_reset(struct bge_softc *, int);
    400400static int bge_reset(struct bge_softc *);
    401 static void bge_link_upd(struct bge_softc *);
     401/*static*/ void bge_link_upd(struct bge_softc *);
    402402
    403403/*
    404404 * The BGE_REGISTER_DEBUG option is only for low-level debugging.  It may
     
    30253025    if (sc->bge_rx_saved_considx ==
    30263026        sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx)
    30273027        return;
     3028    //dprintf("bge_rxeof\n");
    30283029
    30293030    ifp = sc->bge_ifp;
    30303031
     
    31943195        sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx)
    31953196        return;
    31963197
     3198    //dprintf("bge_txeof\n");
    31973199    ifp = sc->bge_ifp;
    31983200
    31993201    bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag,
     
    33183320     * Do the mandatory PCI flush as well as get the link status.
    33193321     */
    33203322    statusword = CSR_READ_4(sc, BGE_MAC_STS) & BGE_MACSTAT_LINK_CHANGED;
    3321 
     3323    //dprintf("bge_intr statusword=0x%x\n", statusword);
    33223324    /* Make sure the descriptor ring indexes are coherent. */
    33233325    bus_dmamap_sync(sc->bge_cdata.bge_status_tag,
    33243326        sc->bge_cdata.bge_status_map, BUS_DMASYNC_POSTREAD);
     
    43204322    return (0);
    43214323}
    43224324
    4323 static void
     4325/*static */void
    43244326bge_link_upd(struct bge_softc *sc)
    43254327{
    43264328    struct mii_data *mii;
     
    43304332
    43314333    /* Clear 'pending link event' flag. */
    43324334    sc->bge_link_evt = 0;
     4335    dprintf("bge_link_upd\n");
    43334336
    43344337    /*
    43354338     * Process link state changes.
     
    43484351
    43494352    if (sc->bge_asicrev == BGE_ASICREV_BCM5700 &&
    43504353        sc->bge_chipid != BGE_CHIPID_BCM5700_B2) {
     4354        dprintf("case 1\n");
    43514355        status = CSR_READ_4(sc, BGE_MAC_STS);
    43524356        if (status & BGE_MACSTAT_MI_INTERRUPT) {
     4357            dprintf("interrupt\n");
    43534358            mii = device_get_softc(sc->bge_miibus);
    43544359            mii_pollstat(mii);
    43554360            if (!sc->bge_link &&
    43564361                mii->mii_media_status & IFM_ACTIVE &&
    43574362                IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
    43584363                sc->bge_link++;
     4364                dprintf("link UP\n");
    43594365                if (bootverbose)
    43604366                    if_printf(sc->bge_ifp, "link UP\n");
    43614367            } else if (sc->bge_link &&
    43624368                (!(mii->mii_media_status & IFM_ACTIVE) ||
    43634369                IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE)) {
    43644370                sc->bge_link = 0;
     4371                dprintf("link DOWN\n");
    43654372                if (bootverbose)
    43664373                    if_printf(sc->bge_ifp, "link DOWN\n");
    43674374            }
     
    43774384    }
    43784385
    43794386    if (sc->bge_flags & BGE_FLAG_TBI) {
     4387        dprintf("case 2\n");
    43804388        status = CSR_READ_4(sc, BGE_MAC_STS);
    43814389        if (status & BGE_MACSTAT_TBI_PCS_SYNCHED) {
     4390            dprintf("TBI_PCS_SYNCHED\n");
    43824391            if (!sc->bge_link) {
    43834392                sc->bge_link++;
    43844393                if (sc->bge_asicrev == BGE_ASICREV_BCM5704)
     
    44034412         * PHY link status directly.
    44044413         */
    44054414        link = (CSR_READ_4(sc, BGE_MI_STS) & BGE_MISTS_LINK) ? 1 : 0;
     4415        dprintf("Case 3: link=0x%x, sc->bge_link=0x%x\n", link,
     4416            sc->bge_link);
    44064417
    44074418        if (link != sc->bge_link ||
    44084419            sc->bge_asicrev == BGE_ASICREV_BCM5700) {
    44094420            mii = device_get_softc(sc->bge_miibus);
    44104421            mii_pollstat(mii);
     4422            dprintf("link changed mii->mii_media_status=0x%x"
     4423                "mii->mii_media_active=0x%x\n",
     4424                mii->mii_media_status, mii->mii_media_active);
    44114425            if (!sc->bge_link &&
    44124426                mii->mii_media_status & IFM_ACTIVE &&
    44134427                IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
    44144428                sc->bge_link++;
     4429                dprintf("link UP\n");
    44154430                if (bootverbose)
    44164431                    if_printf(sc->bge_ifp, "link UP\n");
    44174432            } else if (sc->bge_link &&
    44184433                (!(mii->mii_media_status & IFM_ACTIVE) ||
    44194434                IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE)) {
    44204435                sc->bge_link = 0;
     4436                dprintf("link DOWN\n");
    44214437                if (bootverbose)
    44224438                    if_printf(sc->bge_ifp, "link DOWN\n");
    44234439            }
  • src/add-ons/kernel/drivers/network/broadcom570x/dev/bge/glue.c

     
    3939    CSR_WRITE_4(sc, off, val);
    4040}
    4141
     42/*
     43#define BGE_MACSTAT_TBI_PCS_SYNCHED 0x00000001
     44#define BGE_MACSTAT_TBI_SIGNAL_DETECT   0x00000002
     45#define BGE_MACSTAT_RX_CFG      0x00000004
     46#define BGE_MACSTAT_CFG_CHANGED     0x00000008
     47#define BGE_MACSTAT_SYNC_CHANGED    0x00000010
     48#define BGE_MACSTAT_PORT_DECODE_ERROR   0x00000400
     49#define BGE_MACSTAT_LINK_CHANGED    0x00001000
     50#define BGE_MACSTAT_MI_COMPLETE     0x00400000
     51#define BGE_MACSTAT_MI_INTERRUPT    0x00800000
     52#define BGE_MACSTAT_AUTOPOLL_ERROR  0x01000000
     53#define BGE_MACSTAT_ODI_ERROR       0x02000000
     54#define BGE_MACSTAT_RXSTAT_OFLOW    0x04000000
     55#define BGE_MACSTAT_TXSTAT_OFLOW    0x08000000
    4256
     57 *
     58 * PCI state register -- note, this register is read only
     59 * unless the PCISTATE_WR bit of the PCI Misc. Host Control
     60 * register is set.
     61 *
     62#define BGE_PCISTATE_FORCE_RESET    0x00000001
     63#define BGE_PCISTATE_INTR_STATE     0x00000002
     64#define BGE_PCISTATE_PCI_BUSMODE    0x00000004 * 1 = PCI, 0 = PCI-X *
     65#define BGE_PCISTATE_PCI_BUSSPEED   0x00000008 * 1 = 66/133, 0 = 33/66 *
     66#define BGE_PCISTATE_32BIT_BUS      0x00000010 * 1 = 32bit, 0 = 64bit *
     67#define BGE_PCISTATE_WANT_EXPROM    0x00000020
     68#define BGE_PCISTATE_EXPROM_RETRY   0x00000040
     69#define BGE_PCISTATE_FLATVIEW_MODE  0x00000100
     70#define BGE_PCISTATE_PCI_TGT_RETRY_MAX  0x00000E00
     71
     72#define IFF_DRV_RUNNING     0x10000
     73#define IFF_DRV_OACTIVE     0x20000
     74#define IFF_LINK0           0x40000
     75#define IFF_DEBUG           0x80000
     76
     77*/
     78
     79
    4380int
    4481__haiku_disable_interrupts(device_t dev)
    4582{
    4683    struct bge_softc *sc = device_get_softc(dev);
    4784
    48     uint32 statusword = CSR_READ_4(sc, BGE_MAC_STS) & BGE_MACSTAT_LINK_CHANGED;
     85    uint32 macstatusword = CSR_READ_4(sc, BGE_MAC_STS);
     86    uint32 pcistate = pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE,4);
     87    uint32 linkchanged = macstatusword & BGE_MACSTAT_LINK_CHANGED;
     88    uint32 pci_interrupted = !(pcistate & BGE_PCISTATE_INTR_STATE);
     89    uint32 if_drv_running = sc->bge_ifp->if_drv_flags & IFF_DRV_RUNNING;
     90   
    4991
    50     if ((sc->bge_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 && !statusword
    51         && (pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE,4) & BGE_PCISTATE_INTR_STATE))
     92
     93    if (!pci_interrupted) /* if_drv_running == 0 &&  */
    5294        return 0;
     95/*  dprintf("__haiku_disable_interrupts handling macstatusword=0x%x, pcistate=0x%x, "
     96        "if_drv_flags=0x%x, linkchanged=0x%x, pci_interrupted=0x%x, "
     97        "if_drv_running=0x%x, sc->bge_link_evt=0x%x\n",
     98        macstatusword, pcistate, sc->bge_ifp->if_drv_flags, linkchanged,
     99        pci_interrupted, if_drv_running, sc->bge_link_evt);
     100*/
    53101
     102    if ((sc->bge_asicrev == BGE_ASICREV_BCM5700 &&
     103        sc->bge_chipid != BGE_CHIPID_BCM5700_B2) ||
     104        linkchanged || sc->bge_link_evt)
     105        bge_link_upd(sc);
     106
    54107    BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
    55108    bge_writembx(sc, BGE_MBX_IRQ0_LO, 1);
    56109
  • src/libs/compat/freebsd_network/fbsd_mii_physubr.c

     
    510510    }
    511511
    512512    if (sc->mii_capabilities & BMSR_ANEG) {
    513         ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
    514             MII_NMEDIA);    /* intentionally invalid index */
     513        //ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
     514        //    MII_NMEDIA);  /* intentionally invalid index */
     515        dprintf("don't know how to handle sc->mii_capabilities & BMSR_ANEG\n");
    515516        PRINT("auto");
    516517    }
    517518#undef ADD
    518519#undef PRINT