kern/56726: [PATCH] patches for if_bfe (Broadcom BCM4401
10/100baseTX PHY) under FreeBSD 4.8
Edwin Groothuis
edwin at mavetju.org
Thu Sep 11 19:40:23 PDT 2003
>Number: 56726
>Category: kern
>Synopsis: [PATCH] patches for if_bfe (Broadcom BCM4401 10/100baseTX PHY) under FreeBSD 4.8
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Sep 11 19:40:21 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Edwin Groothuis
>Release: FreeBSD 4.8-RELEASE i386
>Organization:
-
>Environment:
System: FreeBSD k7.mavetju 4.8-RELEASE FreeBSD 4.8-RELEASE #0: Sun Aug 17 16:04:25 EST 2003 edwin at k7.mavetju:/usr/src/sys/compile/k7 i386
>Description:
Thanks to Stuart Walsh for the driver BCM4401 device on -current.
This patch will add support to get it running under 4.8
>How-To-Repeat:
>Fix:
Since 4.9 is already in a freeze and I don't think this will ever
be MFCd to -STABLE, I would like to just add these patches to the
source file so it is recorded and it can be made in a port (or
package) for 4.10 (if ever) comes out.
Some comments:
o BFE_VAR(s) is used to create a variable under 4.8 but not
under -current. The other way to do it is to just add "int
s;" everywhere and get a million of unused variable warnings
when compiling it under -current. An other way is to add a
lot of #if (check for proper version)/#endif around the "int
s" which will even add more lines to it.
o During loading of the module I get the error:
/kernel: module_register: module miibus/ukphy already exists!
/kernel: linker_file_sysinit "miibus.ko" failed to register! 17
but that one only happens the first time and the module loads
without problems. I don't know what it is about.
--- if_bfereg.h-1.1 Fri Sep 12 12:05:12 2003
+++ if_bfereg.h Fri Sep 12 12:34:47 2003
@@ -422,8 +422,23 @@
#define BFE_AND(sc, name, val) \
CSR_WRITE_4(sc, name, CSR_READ_4(sc, name) & val)
+#if __FreeBSD_version > 500000
#define BFE_LOCK(scp) mtx_lock(&sc->bfe_mtx)
#define BFE_UNLOCK(scp) mtx_unlock(&sc->bfe_mtx)
+#define BFE_VAR(s)
+#else
+#define BFE_LOCK(scp) s=splimp()
+#define BFE_UNLOCK(scp) splx(s)
+#define BFE_VAR(s) int s
+#define BPF_MTAP(_ifp,_m) do { \
+ if ((_ifp)->if_bpf) \
+ bpf_mtap((_ifp), (_m)); \
+ } while (0)
+#define ETHER_ALIGN 2
+#define mtx_destroy(a)
+#define mtx_init(a,b,c,d)
+#define device_is_attached(a) 1
+#endif
#define BFE_INC(x, y) (x) = ((x) == ((y)-1)) ? 0 : (x)+1
@@ -484,7 +499,9 @@
struct bfe_desc *bfe_tx_list, *bfe_rx_list;
struct bfe_data bfe_tx_ring[BFE_TX_LIST_CNT]; /* XXX */
struct bfe_data bfe_rx_ring[BFE_RX_LIST_CNT]; /* XXX */
+#if __FreeBSD_version > 500000
struct mtx bfe_mtx;
+#endif
u_int32_t bfe_flags;
u_int32_t bfe_imask;
u_int32_t bfe_dma_offset;
--- if_bfe.c-1.2 Fri Sep 12 12:05:12 2003
+++ if_bfe.c Fri Sep 12 12:31:16 2003
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2003 Stuart Walsh<stu at ipng.org.uk>
* and Duncan Barclay<dmlb at dmlb.org>
+ * Modifications for FreeBSD-stable by Edwin Groothuis <edwin at mavetju.org>
*/
/*
@@ -28,7 +29,7 @@
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/dev/bfe/if_bfe.c,v 1.2 2003/09/09 18:21:17 wpaul Exp $");
+FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/dev/bfe/if_bfe.c,v 1.2 2003/09/09 18:21:17 wpaul Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -61,12 +62,19 @@
#include <sys/bus.h>
#include <sys/rman.h>
+#if __FreeBSD_version < 500000
+#include <pci/pcireg.h>
+#include <pci/pcivar.h>
+#endif
+
#include <dev/mii/mii.h>
#include <dev/mii/miivar.h>
+#if __FreeBSD_version > 500000
#include "miidevs.h"
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
+#endif
#include <dev/bfe/if_bfereg.h>
@@ -205,14 +213,20 @@
BUS_SPACE_UNRESTRICTED, /* num of segments */
BUS_SPACE_MAXSIZE_32BIT, /* max segment size */
BUS_DMA_ALLOCNOW, /* flags */
+#if __FreeBSD_version > 500000
NULL, NULL, /* lockfunc, lockarg */
+#endif
&sc->bfe_parent_tag);
/* tag for TX ring */
error = bus_dma_tag_create(sc->bfe_parent_tag, BFE_TX_LIST_SIZE,
BFE_TX_LIST_SIZE, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, BFE_TX_LIST_SIZE, 1, BUS_SPACE_MAXSIZE_32BIT,
- 0, NULL, NULL, &sc->bfe_tx_tag);
+ 0,
+#if __FreeBSD_version > 500000
+ NULL, NULL, &sc->bfe_tx_tag);
+#endif
+ &sc->bfe_tx_tag);
if (error) {
device_printf(dev, "could not allocate dma tag\n");
@@ -223,7 +237,11 @@
error = bus_dma_tag_create(sc->bfe_parent_tag, BFE_RX_LIST_SIZE,
BFE_RX_LIST_SIZE, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, BFE_RX_LIST_SIZE, 1, BUS_SPACE_MAXSIZE_32BIT,
- 0, NULL, NULL, &sc->bfe_rx_tag);
+ 0,
+#if __FreeBSD_version > 500000
+ NULL, NULL, /* lockfunc, lockarg */
+#endif
+ &sc->bfe_rx_tag);
if (error) {
device_printf(dev, "could not allocate dma tag\n");
@@ -233,7 +251,11 @@
/* tag for mbufs */
error = bus_dma_tag_create(sc->bfe_parent_tag, ETHER_ALIGN, 0,
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
- 1, BUS_SPACE_MAXSIZE_32BIT, 0, NULL, NULL, &sc->bfe_tag);
+ 1, BUS_SPACE_MAXSIZE_32BIT, 0,
+#if __FreeBSD_version > 500000
+ NULL, NULL,
+#endif
+ &sc->bfe_tag);
if (error) {
device_printf(dev, "could not allocate dma tag\n");
@@ -301,6 +323,7 @@
int unit, error = 0, rid;
sc = device_get_softc(dev);
+
mtx_init(&sc->bfe_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
MTX_DEF | MTX_RECURSE);
@@ -394,7 +417,11 @@
goto fail;
}
+#if __FreeBSD_version > 500000
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+#else
+ ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
+#endif
callout_handle_init(&sc->bfe_stat_ch);
/*
@@ -419,6 +446,7 @@
{
struct bfe_softc *sc;
struct ifnet *ifp;
+ BFE_VAR(s);
sc = device_get_softc(dev);
@@ -429,7 +457,11 @@
if (device_is_attached(dev)) {
bfe_stop(sc);
+#if __FreeBSD_version > 500000
ether_ifdetach(ifp);
+#else
+ ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
+#endif
}
bfe_chip_reset(sc);
@@ -453,6 +485,7 @@
bfe_shutdown(device_t dev)
{
struct bfe_softc *sc;
+ BFE_VAR(s);
sc = device_get_softc(dev);
BFE_LOCK(sc);
@@ -640,6 +673,7 @@
bfe_clear_stats(struct bfe_softc *sc)
{
u_long reg;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -656,6 +690,7 @@
bfe_resetphy(struct bfe_softc *sc)
{
u_int32_t val;
+ BFE_VAR(s);
BFE_LOCK(sc);
bfe_writephy(sc, 0, BMCR_RESET);
@@ -673,6 +708,8 @@
static void
bfe_chip_halt(struct bfe_softc *sc)
{
+ BFE_VAR(s);
+
BFE_LOCK(sc);
/* disable interrupts - not that it actually does..*/
CSR_WRITE_4(sc, BFE_IMASK, 0);
@@ -692,6 +729,7 @@
bfe_chip_reset(struct bfe_softc *sc)
{
u_int32_t val;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -864,6 +902,7 @@
CSR_WRITE_4(sc, BFE_CAM_CTRL, 0);
bfe_cam_write(sc, sc->arpcom.ac_enaddr, i++);
+#if __FreeBSD_version > 500000
if (ifp->if_flags & IFF_ALLMULTI)
val |= BFE_RXCONF_ALLMULTI;
else {
@@ -875,6 +914,7 @@
i++);
}
}
+#endif
CSR_WRITE_4(sc, BFE_RXCONF, val);
BFE_OR(sc, BFE_CAM_CTRL, BFE_CAM_ENABLE);
@@ -988,6 +1028,7 @@
bfe_readphy(struct bfe_softc *sc, u_int32_t reg, u_int32_t *val)
{
int err;
+ BFE_VAR(s);
BFE_LOCK(sc);
/* Clear MII ISR */
@@ -1008,6 +1049,7 @@
bfe_writephy(struct bfe_softc *sc, u_int32_t reg, u_int32_t val)
{
int status;
+ BFE_VAR(s);
BFE_LOCK(sc);
CSR_WRITE_4(sc, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII);
@@ -1031,6 +1073,7 @@
bfe_setupphy(struct bfe_softc *sc)
{
u_int32_t val;
+ BFE_VAR(s);
BFE_LOCK(sc);
/* Enable activity LED */
@@ -1067,6 +1110,7 @@
{
struct ifnet *ifp;
int i, chipidx;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -1112,6 +1156,7 @@
struct bfe_data *r;
int cons;
u_int32_t status, current, len, flags;
+ BFE_VAR(s);
BFE_LOCK(sc);
cons = sc->bfe_rx_cons;
@@ -1154,8 +1199,12 @@
ifp->if_ipackets++;
m->m_pkthdr.rcvif = ifp;
- (*ifp->if_input)(ifp, m);
+#if __FreeBSD_version > 500000
+ (*ifp->if_input)(ifp, m);
+#else
+ ether_input(ifp, NULL, m);
+#endif
BFE_INC(cons, BFE_RX_LIST_CNT);
}
sc->bfe_rx_cons = cons;
@@ -1168,6 +1217,7 @@
struct bfe_softc *sc = xsc;
struct ifnet *ifp;
u_int32_t istat, imask, flag;
+ BFE_VAR(s);
ifp = &sc->arpcom.ac_if;
@@ -1231,6 +1281,7 @@
if(BFE_TX_LIST_CNT - sc->bfe_tx_cnt < 2)
return(ENOBUFS);
+#if __FreeBSD_version > 500000
/*
* Count the number of frags in this chain to see if
* we need to m_defrag. Since the descriptor list is shared
@@ -1240,7 +1291,6 @@
for(m = m_head; m != NULL; m = m->m_next)
chainlen++;
-
if ((chainlen > BFE_TX_LIST_CNT / 4) ||
((BFE_TX_LIST_CNT - (chainlen + sc->bfe_tx_cnt)) < 2)) {
m = m_defrag(m_head, M_DONTWAIT);
@@ -1248,6 +1298,7 @@
return(ENOBUFS);
m_head = m;
}
+#endif
/*
* Start packing the mbufs in this chain into
@@ -1306,6 +1357,7 @@
struct bfe_softc *sc;
struct mbuf *m_head = NULL;
int idx;
+ BFE_VAR(s);
sc = ifp->if_softc;
idx = sc->bfe_tx_prod;
@@ -1365,6 +1417,7 @@
{
struct bfe_softc *sc = (struct bfe_softc*)xsc;
struct ifnet *ifp = &sc->arpcom.ac_if;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -1406,6 +1459,7 @@
{
struct bfe_softc *sc;
struct mii_data *mii;
+ BFE_VAR(s);
sc = ifp->if_softc;
@@ -1433,6 +1487,7 @@
{
struct bfe_softc *sc = ifp->if_softc;
struct mii_data *mii;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -1451,6 +1506,7 @@
struct ifreq *ifr = (struct ifreq *) data;
struct mii_data *mii;
int error = 0;
+ BFE_VAR(s);
BFE_LOCK(sc);
@@ -1474,9 +1530,21 @@
mii = device_get_softc(sc->bfe_miibus);
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
break;
+#if __FreeBSD_version > 500000
default:
error = ether_ioctl(ifp, command, data);
break;
+#else
+ case SIOCSIFADDR:
+ case SIOCGIFADDR:
+ case SIOCSIFMTU:
+ error = ether_ioctl(ifp, command, data);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+#endif
}
BFE_UNLOCK(sc);
@@ -1487,6 +1555,7 @@
bfe_watchdog(struct ifnet *ifp)
{
struct bfe_softc *sc;
+ BFE_VAR(s);
sc = ifp->if_softc;
@@ -1507,6 +1576,7 @@
{
struct bfe_softc *sc = xsc;
struct mii_data *mii;
+ BFE_VAR(s);
if (sc == NULL)
return;
@@ -1527,6 +1597,10 @@
if (!sc->bfe_link && mii->mii_media_status & IFM_ACTIVE &&
IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
sc->bfe_link++;
+#ifdef FALSE
+ if (!sc->bfe_link)
+ sc->bfe_link++;
+#endif
BFE_UNLOCK(sc);
}
@@ -1539,6 +1613,7 @@
bfe_stop(struct bfe_softc *sc)
{
struct ifnet *ifp;
+ BFE_VAR(s);
BFE_LOCK(sc);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list