Add few cosmetic style fixes, and some debug information for SCB timeouts.
Add VLAN support, obtained from Pedro J. Lobo (through Mike Tancsa).
This commit is contained in:
parent
e310a419c0
commit
e8c8b728c7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=76527
@ -32,6 +32,8 @@
|
||||
* Intel EtherExpress Pro/100B PCI Fast Ethernet driver
|
||||
*/
|
||||
|
||||
#include "vlan.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
@ -63,6 +65,11 @@
|
||||
#include <vm/pmap.h> /* for vtophys */
|
||||
#include <machine/clock.h> /* for DELAY */
|
||||
|
||||
#if NVLAN > 0
|
||||
#include <net/if_types.h>
|
||||
#include <net/if_vlan_var.h>
|
||||
#endif
|
||||
|
||||
#include <pci/pcivar.h>
|
||||
#include <pci/pcireg.h> /* for PCIM_CMD_xxx */
|
||||
|
||||
@ -75,6 +82,15 @@
|
||||
MODULE_DEPEND(fxp, miibus, 1, 1, 1);
|
||||
#include "miibus_if.h"
|
||||
|
||||
#ifdef KLD_MODULE
|
||||
#define NMIIBUS 1
|
||||
#else
|
||||
#include "miibus.h"
|
||||
#endif
|
||||
#if NMIIBUS < 1
|
||||
#error "You need to add 'device miibus' to your kernel config!"
|
||||
#else
|
||||
|
||||
/*
|
||||
* NOTE! On the Alpha, we have an alignment constraint. The
|
||||
* card DMAs the packet immediately following the RFA. However,
|
||||
@ -252,7 +268,11 @@ fxp_scb_wait(struct fxp_softc *sc)
|
||||
while (CSR_READ_1(sc, FXP_CSR_SCB_COMMAND) && --i)
|
||||
DELAY(2);
|
||||
if (i == 0)
|
||||
device_printf(sc->dev, "SCB timeout\n");
|
||||
device_printf(sc->dev, "SCB timeout: 0x%x, 0x%x, 0x%x 0x%x\n",
|
||||
CSR_READ_1(sc, FXP_CSR_SCB_COMMAND),
|
||||
CSR_READ_1(sc, FXP_CSR_SCB_STATACK),
|
||||
CSR_READ_1(sc, FXP_CSR_SCB_RUSCUS),
|
||||
CSR_READ_2(sc, FXP_CSR_FLOWCONTROL));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
@ -445,7 +465,7 @@ fxp_attach(device_t dev)
|
||||
*/
|
||||
fxp_read_eeprom(sc, &data, 5, 1);
|
||||
if ((data >> 8) == 1)
|
||||
sc->chip = FXP_CHIP_82557;
|
||||
sc->chip = FXP_CHIP_82557;
|
||||
|
||||
/*
|
||||
* If we are not a 82557 chip, we can enable extended features.
|
||||
@ -460,6 +480,10 @@ fxp_attach(device_t dev)
|
||||
|
||||
/* turn on the extended TxCB feature */
|
||||
sc->flags |= FXP_FLAG_EXT_TXCB;
|
||||
#if NVLAN > 0
|
||||
/* enable reception of long frames for VLAN */
|
||||
sc->flags |= FXP_FLAG_LONG_PKT_EN;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -473,6 +497,7 @@ fxp_attach(device_t dev)
|
||||
device_printf(dev, "PCI IDs: %04x %04x %04x %04x\n",
|
||||
pci_get_vendor(dev), pci_get_device(dev),
|
||||
pci_get_subvendor(dev), pci_get_subdevice(dev));
|
||||
device_printf(dev, "Chip Type: %d\n", sc->chip);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -515,6 +540,13 @@ fxp_attach(device_t dev)
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
|
||||
#if NVLAN > 0
|
||||
/*
|
||||
* Tell the upper layer(s) we support long frames.
|
||||
*/
|
||||
ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Let the system queue as many packets as we have available
|
||||
* TX descriptors.
|
||||
@ -1043,6 +1075,19 @@ fxp_intr(void *xsc)
|
||||
m_freem(m);
|
||||
goto rcvloop;
|
||||
}
|
||||
#if NVLAN > 0
|
||||
/*
|
||||
* Drop the packet if it has CRC
|
||||
* errors. This test is only needed
|
||||
* when doing 802.1q VLAN on the 82557
|
||||
* chip.
|
||||
*/
|
||||
if (rfa->rfa_status &
|
||||
FXP_RFA_STATUS_CRC) {
|
||||
m_freem(m);
|
||||
goto rcvloop;
|
||||
}
|
||||
#endif
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = total_len;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
@ -1328,7 +1373,11 @@ fxp_init(void *xsc)
|
||||
cbp->ext_txcb_dis = sc->flags & FXP_FLAG_EXT_TXCB ? 0 : 1;
|
||||
cbp->ext_stats_dis = 1; /* disable extended counters */
|
||||
cbp->keep_overrun_rx = 0; /* don't pass overrun frames to host */
|
||||
#if NVLAN > 0
|
||||
cbp->save_bf = sc->chip == FXP_CHIP_82557 ? 1 : prm;
|
||||
#else
|
||||
cbp->save_bf = prm; /* save bad frames */
|
||||
#endif
|
||||
cbp->disc_short_rx = !prm; /* discard short packets */
|
||||
cbp->underrun_retry = 1; /* retry mode (once) on DMA underrun */
|
||||
cbp->two_frames = 0; /* do not limit FIFO to 2 frames */
|
||||
@ -1462,6 +1511,11 @@ fxp_init(void *xsc)
|
||||
|
||||
ifp->if_flags |= IFF_RUNNING;
|
||||
ifp->if_flags &= ~IFF_OACTIVE;
|
||||
|
||||
/*
|
||||
* Enable interrupts.
|
||||
*/
|
||||
CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
|
||||
splx(s);
|
||||
|
||||
/*
|
||||
@ -1754,7 +1808,8 @@ fxp_mc_setup(struct fxp_softc *sc)
|
||||
txp = sc->cbl_last->next;
|
||||
txp->mb_head = NULL;
|
||||
txp->cb_status = 0;
|
||||
txp->cb_command = FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S | FXP_CB_COMMAND_I;
|
||||
txp->cb_command = FXP_CB_COMMAND_NOP |
|
||||
FXP_CB_COMMAND_S | FXP_CB_COMMAND_I;
|
||||
/*
|
||||
* Advance the end of list forward.
|
||||
*/
|
||||
@ -1782,7 +1837,8 @@ fxp_mc_setup(struct fxp_softc *sc)
|
||||
mcsp->next = sc->cbl_base;
|
||||
mcsp->mb_head = NULL;
|
||||
mcsp->cb_status = 0;
|
||||
mcsp->cb_command = FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_S | FXP_CB_COMMAND_I;
|
||||
mcsp->cb_command = FXP_CB_COMMAND_MCAS |
|
||||
FXP_CB_COMMAND_S | FXP_CB_COMMAND_I;
|
||||
mcsp->link_addr = vtophys(&sc->cbl_base->cb_status);
|
||||
|
||||
nmcasts = 0;
|
||||
@ -1832,3 +1888,5 @@ fxp_mc_setup(struct fxp_softc *sc)
|
||||
ifp->if_timer = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* NMIIBUS > 0 */
|
||||
|
Loading…
Reference in New Issue
Block a user