Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 May 2012 10:55:18 -0700
From:      Adrian Chadd <adrian@freebsd.org>
To:        Pyun YongHyeon <yongari@freebsd.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   Re: svn commit: r235818 - stable/9/sys/dev/bce
Message-ID:  <CAJ-Vmoku9ACBGYxEkja41G=-vPuDqN34c0esLbGLnX8NM5Jspg@mail.gmail.com>
In-Reply-To: <201205230202.q4N22UDA041838@svn.freebsd.org>
References:  <201205230202.q4N22UDA041838@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

Have you looked at the MDIO bus support that I brought in from Stefan?

This almost feels like a poster child for that - you'd write an MDIO
bus driver for this particular mailbox hardware interface and modify
the driver to use that, then the MDIO bus will automatically probe
whatever PHYs exist there

That way it could be reused for other MDIO bus consumers too, such as
switch PHYs and other MDIO-but-not-quite-PHY devices.

Adrian

On 22 May 2012 19:02, Pyun YongHyeon <yongari@freebsd.org> wrote:
> Author: yongari
> Date: Wed May 23 02:02:29 2012
> New Revision: 235818
> URL: http://svn.freebsd.org/changeset/base/235818
>
> Log:
> =A0MFC r235151:
> =A0 =A0Implement basic remote PHY support. Remote PHY allows the
> =A0 =A0controller to perform MDIO type accesses to a remote transceiver
> =A0 =A0using message pages defined through MRBE(multirate backplane
> =A0 =A0ethernet). =A0It's used in blade systems(e.g Dell Blade m610) whic=
h
> =A0 =A0are connected to pass-through blades rather than traditional
> =A0 =A0switches.
> =A0 =A0This change directly manipulates firmware's mailboxes to control
> =A0 =A0remote PHY such that it does not use mii(4). =A0Alternatively, as
> =A0 =A0David said, it could be implemented in brgphy(4) by creating a fak=
e
> =A0 =A0PHY and let brgphy(4) do necessary mii accesses and bce(4) can
> =A0 =A0implement mailbox accesses based on the type of brgphy(4)'s mii
> =A0 =A0accesses. Personally, I think it would make brgphy(4) hard to
> =A0 =A0maintain since it would have to access many bce(4) registers in
> =A0 =A0brgphy(4). Given that there are users who are suffering from lack
> =A0 =A0of remote PHY support, it would be better to get working system
> =A0 =A0rather than waiting for complete/perfect implementation.
>
> Modified:
> =A0stable/9/sys/dev/bce/if_bce.c
> =A0stable/9/sys/dev/bce/if_bcereg.h
> Directory Properties:
> =A0stable/9/sys/ =A0 (props changed)
> =A0stable/9/sys/amd64/include/xen/ =A0 (props changed)
> =A0stable/9/sys/boot/ =A0 (props changed)
> =A0stable/9/sys/boot/i386/efi/ =A0 (props changed)
> =A0stable/9/sys/boot/ia64/efi/ =A0 (props changed)
> =A0stable/9/sys/boot/ia64/ski/ =A0 (props changed)
> =A0stable/9/sys/boot/powerpc/boot1.chrp/ =A0 (props changed)
> =A0stable/9/sys/boot/powerpc/ofw/ =A0 (props changed)
> =A0stable/9/sys/cddl/contrib/opensolaris/ =A0 (props changed)
> =A0stable/9/sys/conf/ =A0 (props changed)
> =A0stable/9/sys/contrib/dev/acpica/ =A0 (props changed)
> =A0stable/9/sys/contrib/octeon-sdk/ =A0 (props changed)
> =A0stable/9/sys/contrib/pf/ =A0 (props changed)
> =A0stable/9/sys/contrib/x86emu/ =A0 (props changed)
> =A0stable/9/sys/dev/ =A0 (props changed)
> =A0stable/9/sys/dev/e1000/ =A0 (props changed)
> =A0stable/9/sys/dev/ixgbe/ =A0 (props changed)
> =A0stable/9/sys/fs/ =A0 (props changed)
> =A0stable/9/sys/fs/ntfs/ =A0 (props changed)
> =A0stable/9/sys/modules/ =A0 (props changed)
>
> Modified: stable/9/sys/dev/bce/if_bce.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- stable/9/sys/dev/bce/if_bce.c =A0 =A0 =A0 Wed May 23 01:49:50 2012 =
=A0 =A0 =A0 =A0(r235817)
> +++ stable/9/sys/dev/bce/if_bce.c =A0 =A0 =A0 Wed May 23 02:02:29 2012 =
=A0 =A0 =A0 =A0(r235818)
> @@ -364,6 +364,7 @@ static int =A0bce_nvram_write =A0 =A0 =A0 =A0 (struct=
 bce
> =A0static void bce_get_rx_buffer_sizes(struct bce_softc *, int);
> =A0static void bce_get_media =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(=
struct bce_softc *);
> =A0static void bce_init_media =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (st=
ruct bce_softc *);
> +static u32 bce_get_rphy_link =A0 =A0 =A0 =A0 =A0 (struct bce_softc *);
> =A0static void bce_dma_map_addr =A0 =A0 =A0 =A0 =A0 (void *, bus_dma_segm=
ent_t *, int, int);
> =A0static int =A0bce_dma_alloc =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0(device_t);
> =A0static void bce_dma_free =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (=
struct bce_softc *);
> @@ -372,6 +373,7 @@ static void bce_release_resources =A0 (struc
> =A0/*********************************************************************=
*******/
> =A0/* BCE Firmware Synchronization and Load =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> =A0/*********************************************************************=
*******/
> +static void bce_fw_cap_init =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(stru=
ct bce_softc *);
> =A0static int =A0bce_fw_sync =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0(struct bce_softc *, u32);
> =A0static void bce_load_rv2p_fw =A0 =A0 =A0 =A0 =A0 (struct bce_softc *, =
u32 *, u32, u32);
> =A0static void bce_load_cpu_fw =A0 =A0 =A0 =A0 =A0 =A0(struct bce_softc *=
,
> @@ -418,6 +420,7 @@ static void bce_watchdog =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0(struct bce_s
> =A0static int =A0bce_ifmedia_upd =A0 =A0 =A0 =A0 =A0 =A0(struct ifnet *);
> =A0static int =A0bce_ifmedia_upd_locked =A0 =A0 (struct ifnet *);
> =A0static void bce_ifmedia_sts =A0 =A0 =A0 =A0 =A0 =A0(struct ifnet *, st=
ruct ifmediareq *);
> +static void bce_ifmedia_sts_rphy =A0 =A0 =A0 (struct bce_softc *, struct=
 ifmediareq *);
> =A0static void bce_init_locked =A0 =A0 =A0 =A0 =A0 =A0(struct bce_softc *=
);
> =A0static void bce_init =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 (void *);
> =A0static void bce_mgmt_init_locked =A0 =A0 =A0 (struct bce_softc *sc);
> @@ -757,6 +760,13 @@ bce_print_adapter_info(struct bce_softc
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf("2.5G"); i++;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
>
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_=
FLAG) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (i > 0) printf("|");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf("Remote PHY(%s)",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_phy_flags &=
 BCE_PHY_REMOTE_PORT_FIBER_FLAG ?
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "FIBER" : "TP"); i+=
+;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> +
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (i > 0) printf("|");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf("MFW); MFW (%s)\n",=
 sc->bce_mfw_ver);
> @@ -1297,6 +1307,9 @@ bce_attach(device_t dev)
> =A0 =A0 =A0 =A0if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sc->bce_flags |=3D BCE_PCI_32BIT_FLAG;
>
> + =A0 =A0 =A0 /* Find the media type for the adapter. */
> + =A0 =A0 =A0 bce_get_media(sc);
> +
> =A0 =A0 =A0 =A0/* Reset controller and announce to bootcode that driver i=
s present. */
> =A0 =A0 =A0 =A0if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_PRINTF("%s(%d): Controller reset faile=
d!\n",
> @@ -1344,9 +1357,6 @@ bce_attach(device_t dev)
> =A0 =A0 =A0 =A0/* Update statistics once every second. */
> =A0 =A0 =A0 =A0sc->bce_stats_ticks =3D 1000000 & 0xffff00;
>
> - =A0 =A0 =A0 /* Find the media type for the adapter. */
> - =A0 =A0 =A0 bce_get_media(sc);
> -
> =A0 =A0 =A0 =A0/* Store data needed by PHY driver for backplane applicati=
ons */
> =A0 =A0 =A0 =A0sc->bce_shared_hw_cfg =3D bce_shmem_rd(sc, BCE_SHARED_HW_C=
FG_CONFIG);
> =A0 =A0 =A0 =A0sc->bce_port_hw_cfg =A0 =3D bce_shmem_rd(sc, BCE_PORT_HW_C=
FG_CONFIG);
> @@ -1386,6 +1396,15 @@ bce_attach(device_t dev)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ifp->if_capabilities =3D BCE_IF_CAPABILITI=
ES;
> =A0 =A0 =A0 =A0}
>
> +#if __FreeBSD_version >=3D 800505
> + =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0* Introducing IFCAP_LINKSTATE didn't bump __FreeBSD_vers=
ion
> + =A0 =A0 =A0 =A0* so it's approximate value.
> + =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_capabilities |=3D IFCAP_LINKSTATE;
> +#endif
> +
> =A0 =A0 =A0 =A0ifp->if_capenable =3D ifp->if_capabilities;
>
> =A0 =A0 =A0 =A0/*
> @@ -1409,14 +1428,52 @@ bce_attach(device_t dev)
> =A0 =A0 =A0 =A0/* Handle any special PHY initialization for SerDes PHYs. =
*/
> =A0 =A0 =A0 =A0bce_init_media(sc);
>
> - =A0 =A0 =A0 /* MII child bus by attaching the PHY. */
> - =A0 =A0 =A0 rc =3D mii_attach(dev, &sc->bce_miibus, ifp, bce_ifmedia_up=
d,
> - =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts, BMSR_DEFCAPMASK, sc->bce_phy_addr,
> - =A0 =A0 =A0 =A0 =A0 MII_OFFSET_ANY, MIIF_DOPAUSE);
> - =A0 =A0 =A0 if (rc !=3D 0) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PRINTF("%s(%d): attaching PHYs failed\n=
", __FILE__,
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 __LINE__);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto bce_attach_fail;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_init(&sc->bce_ifmedia, IFM_IMASK, b=
ce_ifmedia_upd,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* We can't manually override remote PHY'=
s link and assume
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* PHY port configuration(Fiber or TP) is=
 not changed after
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* device attach. =A0This may not be corr=
ect though.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_POR=
T_FIBER_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sc->bce_phy_flags & BCE=
_PHY_2_5G_CAPABLE_FLAG) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add=
(&sc->bce_ifmedia,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM=
_ETHER | IFM_2500_SX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add=
(&sc->bce_ifmedia,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM=
_ETHER | IFM_2500_SX | IFM_FDX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
0_SX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
0_SX | IFM_FDX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_10_=
T, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_10_=
T | IFM_FDX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
_TX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
_TX | IFM_FDX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
0_T, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedi=
a,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_ETHER | IFM_100=
0_T | IFM_FDX, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_add(&sc->bce_ifmedia, IFM_ETHER | I=
FM_AUTO, 0, NULL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_set(&sc->bce_ifmedia, IFM_ETHER | I=
FM_AUTO);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_ifmedia.ifm_media =3D sc->bce_ifmed=
ia.ifm_cur->ifm_media;
> + =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* MII child bus by attaching the PHY. */
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D mii_attach(dev, &sc->bce_miibus, ifp=
, bce_ifmedia_upd,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts, BMSR_DEFCAPMASK, s=
c->bce_phy_addr,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 MII_OFFSET_ANY, MIIF_DOPAUSE);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PRINTF("%s(%d): attachi=
ng PHYs failed\n", __FILE__,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 __LINE__);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto bce_attach_fail;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0/* Attach to the Ethernet interface list. */
> @@ -1521,8 +1578,12 @@ bce_detach(device_t dev)
> =A0 =A0 =A0 =A0ether_ifdetach(ifp);
>
> =A0 =A0 =A0 =A0/* If we have a child device on the MII bus remove it too.=
 */
> - =A0 =A0 =A0 bus_generic_detach(dev);
> - =A0 =A0 =A0 device_delete_child(dev, sc->bce_miibus);
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmedia_removeall(&sc->bce_ifmedia);
> + =A0 =A0 =A0 else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bus_generic_detach(dev);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 device_delete_child(dev, sc->bce_miibus);
> + =A0 =A0 =A0 }
>
> =A0 =A0 =A0 =A0/* Release all remaining resources. */
> =A0 =A0 =A0 =A0bce_release_resources(sc);
> @@ -1983,13 +2044,23 @@ bce_miibus_statchg(device_t dev)
> =A0{
> =A0 =A0 =A0 =A0struct bce_softc *sc;
> =A0 =A0 =A0 =A0struct mii_data *mii;
> - =A0 =A0 =A0 int val;
> + =A0 =A0 =A0 struct ifmediareq ifmr;
> + =A0 =A0 =A0 int media_active, media_status, val;
>
> =A0 =A0 =A0 =A0sc =3D device_get_softc(dev);
>
> =A0 =A0 =A0 =A0DBENTER(BCE_VERBOSE_PHY);
>
> - =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bzero(&ifmr, sizeof(ifmr));
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts_rphy(sc, &ifmr);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 media_active =3D ifmr.ifm_active;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 media_status =3D ifmr.ifm_status;
> + =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 media_active =3D mii->mii_media_active;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 media_status =3D mii->mii_media_status;
> + =A0 =A0 =A0 }
>
> =A0 =A0 =A0 =A0val =3D REG_RD(sc, BCE_EMAC_MODE);
> =A0 =A0 =A0 =A0val &=3D ~(BCE_EMAC_MODE_PORT | BCE_EMAC_MODE_HALF_DUPLEX =
|
> @@ -1997,7 +2068,7 @@ bce_miibus_statchg(device_t dev)
> =A0 =A0 =A0 =A0 =A0 =A0BCE_EMAC_MODE_25G);
>
> =A0 =A0 =A0 =A0/* Set MII or GMII interface based on the PHY speed. */
> - =A0 =A0 =A0 switch (IFM_SUBTYPE(mii->mii_media_active)) {
> + =A0 =A0 =A0 switch (IFM_SUBTYPE(media_active)) {
> =A0 =A0 =A0 =A0case IFM_10_T:
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (BCE_CHIP_NUM(sc) !=3D BCE_CHIP_NUM_570=
6) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY,
> @@ -2026,7 +2097,7 @@ bce_miibus_statchg(device_t dev)
> =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0/* Set half or full duplex based on PHY settings. */
> - =A0 =A0 =A0 if ((mii->mii_media_active & IFM_GMASK) =3D=3D IFM_HDX) {
> + =A0 =A0 =A0 if ((IFM_OPTIONS(media_active) & IFM_FDX) =3D=3D 0) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"Setting Half-Duplex interface.\n"=
);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0val |=3D BCE_EMAC_MODE_HALF_DUPLEX;
> @@ -2036,7 +2107,7 @@ bce_miibus_statchg(device_t dev)
>
> =A0 =A0 =A0 =A0REG_WR(sc, BCE_EMAC_MODE, val);
>
> - =A0 =A0 =A0 if ((mii->mii_media_active & IFM_ETH_RXPAUSE) !=3D 0) {
> + =A0 =A0 =A0 if ((IFM_OPTIONS(media_active) & IFM_ETH_RXPAUSE) !=3D 0) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"%s(): Enabling RX flow control.\n=
", __FUNCTION__);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_SETBIT(sc, BCE_EMAC_RX_MODE, BCE_EMAC_=
RX_MODE_FLOW_EN);
> @@ -2046,7 +2117,7 @@ bce_miibus_statchg(device_t dev)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_CLRBIT(sc, BCE_EMAC_RX_MODE, BCE_EMAC_=
RX_MODE_FLOW_EN);
> =A0 =A0 =A0 =A0}
>
> - =A0 =A0 =A0 if ((mii->mii_media_active & IFM_ETH_TXPAUSE) !=3D 0) {
> + =A0 =A0 =A0 if ((IFM_OPTIONS(media_active) & IFM_ETH_TXPAUSE) !=3D 0) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"%s(): Enabling TX flow control.\n=
", __FUNCTION__);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_SETBIT(sc, BCE_EMAC_TX_MODE, BCE_EMAC_=
TX_MODE_FLOW_EN);
> @@ -3130,7 +3201,8 @@ bce_get_media_exit:
> =A0static void
> =A0bce_init_media(struct bce_softc *sc)
> =A0{
> - =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_IEEE_CLAUSE_45_FLAG) !=3D =
0) {
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & (BCE_PHY_IEEE_CLAUSE_45_FLAG |
> + =A0 =A0 =A0 =A0 =A0 BCE_PHY_REMOTE_CAP_FLAG)) =3D=3D BCE_PHY_IEEE_CLAUS=
E_45_FLAG) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/*
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * Configure 5709S/5716S PHYs to use tradi=
tional IEEE
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * Clause 22 method. Otherwise we have no =
way to attach
> @@ -5018,6 +5090,8 @@ bce_reset(struct bce_softc *sc, u32 rese
> =A0 =A0 =A0 =A0if (rc)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_PRINTF("%s(%d): Firmware did not compl=
ete "
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"initialization!\n", __FILE__, __L=
INE__);
> + =A0 =A0 =A0 /* Get firmware capabilities. */
> + =A0 =A0 =A0 bce_fw_cap_init(sc);
>
> =A0bce_reset_exit:
> =A0 =A0 =A0 =A0DBEXIT(BCE_VERBOSE_RESET);
> @@ -6081,6 +6155,55 @@ bce_free_pg_chain(struct bce_softc *sc)
> =A0}
>
>
> +static u32
> +bce_get_rphy_link(struct bce_softc *sc)
> +{
> + =A0 =A0 =A0 u32 advertise, link;
> + =A0 =A0 =A0 int fdpx;
> +
> + =A0 =A0 =A0 advertise =3D 0;
> + =A0 =A0 =A0 fdpx =3D 0;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) !=
=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D bce_shmem_rd(sc, BCE_RPHY_SERDES_L=
INK);
> + =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D bce_shmem_rd(sc, BCE_RPHY_COPPER_L=
INK);
> + =A0 =A0 =A0 if (link & BCE_NETLINK_ANEG_ENB)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_ANEG_ENB;
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_10HALF)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_10HALF;
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_10FULL) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_10FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fdpx++;
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_100HALF)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_100HALF;
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_100FULL) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_100FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fdpx++;
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_1000HALF)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_1000HALF;
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_1000FULL) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_1000FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fdpx++;
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_2500HALF)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_2500HALF;
> + =A0 =A0 =A0 if (link & BCE_NETLINK_SPEED_2500FULL) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_SPEED_2500FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fdpx++;
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 if (fdpx)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_FC_PAUSE_SYM |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_NETLINK_FC_PAUSE_ASYM;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) =
=3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 advertise |=3D BCE_NETLINK_PHY_APP_REMOTE |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_NETLINK_ETH_AT_WIRESPEED;
> +
> + =A0 =A0 =A0 return (advertise);
> +}
> +
> +
> =A0/*********************************************************************=
*******/
> =A0/* Set media options. =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */
> =A0/* =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0*/
> @@ -6116,21 +6239,110 @@ bce_ifmedia_upd_locked(struct ifnet *ifp
> =A0 =A0 =A0 =A0struct bce_softc *sc =3D ifp->if_softc;
> =A0 =A0 =A0 =A0struct mii_data *mii;
> =A0 =A0 =A0 =A0struct mii_softc *miisc;
> - =A0 =A0 =A0 int error;
> + =A0 =A0 =A0 struct ifmedia *ifm;
> + =A0 =A0 =A0 u32 link;
> + =A0 =A0 =A0 int error, fdx;
>
> =A0 =A0 =A0 =A0DBENTER(BCE_VERBOSE_PHY);
>
> =A0 =A0 =A0 =A0error =3D 0;
> =A0 =A0 =A0 =A0BCE_LOCK_ASSERT(sc);
>
> - =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> + =A0 =A0 =A0 sc->bce_link_up =3D FALSE;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifm =3D &sc->bce_ifmedia;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (IFM_TYPE(ifm->ifm_media) !=3D IFM_ETHER=
)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D 0;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fdx =3D IFM_OPTIONS(ifm->ifm_media) & IFM_F=
DX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch(IFM_SUBTYPE(ifm->ifm_media)) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_AUTO:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Check advertised link =
of remote PHY by reading
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* BCE_RPHY_SERDES_LINK o=
r BCE_RPHY_COPPER_LINK.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Always use the same li=
nk type of remote PHY.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D bce_get_rphy_link(=
sc);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_2500_SX:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags &
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (BCE_PHY_REMOTE_POR=
T_FIBER_FLAG |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PHY_2_5G_CAPABL=
E_FLAG)) =3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EIN=
VAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Have to enable forced =
2.5Gbps configuration.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link |=3D B=
CE_NETLINK_SPEED_2500FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link |=3D B=
CE_NETLINK_SPEED_2500HALF;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_1000_SX:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags &
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PHY_REMOTE_PORT=
_FIBER_FLAG) =3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EIN=
VAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Have to disable 2.5Gbp=
s configuration.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_1000FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_1000HALF;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_1000_T:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sc->bce_phy_flags & BCE=
_PHY_REMOTE_PORT_FIBER_FLAG)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EIN=
VAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_1000FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_1000HALF;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_100_TX:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sc->bce_phy_flags & BCE=
_PHY_REMOTE_PORT_FIBER_FLAG)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EIN=
VAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_100FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_100HALF;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 case IFM_10_T:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sc->bce_phy_flags & BCE=
_PHY_REMOTE_PORT_FIBER_FLAG)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EIN=
VAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_10FULL;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D BC=
E_NETLINK_SPEED_10HALF;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 default:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (IFM_SUBTYPE(ifm->ifm_media) !=3D IFM_AU=
TO) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Advertise pause capabi=
lity for full-duplex media.
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (fdx !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link |=3D B=
CE_NETLINK_FC_PAUSE_SYM |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE=
_NETLINK_FC_PAUSE_ASYM;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags &
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PHY_REMOTE_PORT=
_FIBER_FLAG) =3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 link |=3D B=
CE_NETLINK_PHY_APP_REMOTE |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE=
_NETLINK_ETH_AT_WIRESPEED;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
>
> - =A0 =A0 =A0 /* Make sure the MII bus has been enumerated. */
> - =A0 =A0 =A0 if (mii) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_link_up =3D FALSE;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_FOREACH(miisc, &mii->mii_phys, mii_lis=
t)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PHY_RESET(miisc);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D mii_mediachg(mii);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_shmem_wr(sc, BCE_MB_ARGS_0, link);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D bce_fw_sync(sc, BCE_DRV_MSG_CODE_=
CMD_SET_LINK);
> + =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> +
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Make sure the MII bus has been enumerate=
d. */
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (mii) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_FOREACH(miisc, &mii->m=
ii_phys, mii_list)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PHY_RESET(m=
iisc);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D mii_mediachg(mii)=
;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0DBEXIT(BCE_VERBOSE_PHY);
> @@ -6138,6 +6350,85 @@ bce_ifmedia_upd_locked(struct ifnet *ifp
> =A0}
>
>
> +static void
> +bce_ifmedia_sts_rphy(struct bce_softc *sc, struct ifmediareq *ifmr)
> +{
> + =A0 =A0 =A0 struct ifnet *ifp;
> + =A0 =A0 =A0 u32 link;
> +
> + =A0 =A0 =A0 ifp =3D sc->bce_ifp;
> + =A0 =A0 =A0 BCE_LOCK_ASSERT(sc);
> +
> + =A0 =A0 =A0 ifmr->ifm_status =3D IFM_AVALID;
> + =A0 =A0 =A0 ifmr->ifm_active =3D IFM_ETHER;
> + =A0 =A0 =A0 link =3D bce_shmem_rd(sc, BCE_LINK_STATUS);
> + =A0 =A0 =A0 /* XXX Handle heart beat status? */
> + =A0 =A0 =A0 if ((link & BCE_LINK_STATUS_LINK_UP) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_status |=3D IFM_ACTIVE;
> + =A0 =A0 =A0 else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_NONE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D 0;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return;
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 switch (link & BCE_LINK_STATUS_SPEED_MASK) {
> + =A0 =A0 =A0 case BCE_LINK_STATUS_10HALF:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_10_T | IFM_HDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(10UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_10FULL:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_10_T | IFM_FDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(10UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_100HALF:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_100_TX | IFM_HDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(100UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_100FULL:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_100_TX | IFM_FDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(100UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_1000HALF:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_POR=
T_FIBER_FLAG) =3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_1=
000_T | IFM_HDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_1=
000_SX | IFM_HDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(1000UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_1000FULL:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_POR=
T_FIBER_FLAG) =3D=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_1=
000_T | IFM_FDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_1=
000_SX | IFM_FDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(1000UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_2500HALF:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_POR=
T_FIBER_FLAG) =3D=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_N=
ONE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_2=
500_SX | IFM_HDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(2500UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 case BCE_LINK_STATUS_2500FULL:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_POR=
T_FIBER_FLAG) =3D=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_N=
ONE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_2=
500_SX | IFM_FDX;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifp->if_baudrate =3D IF_Mbps(2500UL);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> + =A0 =A0 =A0 default:
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_NONE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return;
> + =A0 =A0 =A0 }
> +
> + =A0 =A0 =A0 if ((link & BCE_LINK_STATUS_RX_FC_ENABLED) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_ETH_RXPAUSE;
> + =A0 =A0 =A0 if ((link & BCE_LINK_STATUS_TX_FC_ENABLED) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active |=3D IFM_ETH_TXPAUSE;
> +}
> +
> +
> =A0/*********************************************************************=
*******/
> =A0/* Reports current media status. =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> =A0/* =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0*/
> @@ -6158,11 +6449,15 @@ bce_ifmedia_sts(struct ifnet *ifp, struc
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BCE_UNLOCK(sc);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
> =A0 =A0 =A0 =A0}
> - =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
>
> - =A0 =A0 =A0 mii_pollstat(mii);
> - =A0 =A0 =A0 ifmr->ifm_active =3D mii->mii_media_active;
> - =A0 =A0 =A0 ifmr->ifm_status =3D mii->mii_media_status;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts_rphy(sc, ifmr);
> + =A0 =A0 =A0 else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii_pollstat(mii);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_active =3D mii->mii_media_active;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifmr->ifm_status =3D mii->mii_media_status;
> + =A0 =A0 =A0 }
>
> =A0 =A0 =A0 =A0BCE_UNLOCK(sc);
>
> @@ -6199,14 +6494,26 @@ bce_phy_intr(struct bce_softc *sc)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0STATUS_ATTN_BITS_L=
INK_STATE);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY, =
"%s(): Link is now UP.\n",
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0__FUNCTION__);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0REG_WR(sc, BCE_PCICFG_STAT=
US_BIT_CLEAR_CMD,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0STATUS_ATTN_BITS_L=
INK_STATE);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_INFO_PHY, =
"%s(): Link is now DOWN.\n",
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0__FUNCTION__);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
>
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP=
_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (new_link_state) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (bootver=
bose)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 if_printf(sc->bce_ifp, "link UP\n");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if_link_sta=
te_change(sc->bce_ifp,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIN=
K_STATE_UP);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (bootver=
bose)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 if_printf(sc->bce_ifp, "link DOWN\n");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if_link_sta=
te_change(sc->bce_ifp,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIN=
K_STATE_DOWN);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/*
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * Assume link is down and allow
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * tick routine to update the state
> @@ -7495,10 +7802,14 @@ bce_ioctl(struct ifnet *ifp, u_long comm
> =A0 =A0 =A0 =A0case SIOCGIFMEDIA:
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_VERBOSE_MISC,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"Received SIOCSIFMEDIA/SIOCGIFMEDI=
A\n");
> -
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D ifmedia_ioctl(ifp, ifr,
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &mii->mii_media, command);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP=
_FLAG) !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D ifmedia_ioctl(ifp=
, ifr, &sc->bce_ifmedia,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 command);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc=
->bce_miibus);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D ifmedia_ioctl(ifp=
, ifr, &mii->mii_media,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 command);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;
>
> =A0 =A0 =A0 =A0/* Set interface capability */
> @@ -8163,6 +8474,7 @@ bce_tick(void *xsc)
> =A0 =A0 =A0 =A0struct bce_softc *sc =3D xsc;
> =A0 =A0 =A0 =A0struct mii_data *mii;
> =A0 =A0 =A0 =A0struct ifnet *ifp;
> + =A0 =A0 =A0 struct ifmediareq ifmr;
>
> =A0 =A0 =A0 =A0ifp =3D sc->bce_ifp;
>
> @@ -8193,21 +8505,32 @@ bce_tick(void *xsc)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto bce_tick_exit;
>
> =A0 =A0 =A0 =A0/* Link is down. =A0Check what the PHY's doing. */
> - =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> - =A0 =A0 =A0 mii_tick(mii);
> -
> - =A0 =A0 =A0 /* Check if the link has come up. */
> - =A0 =A0 =A0 if ((mii->mii_media_status & IFM_ACTIVE) &&
> - =A0 =A0 =A0 =A0 =A0 (IFM_SUBTYPE(mii->mii_media_active) !=3D IFM_NONE))=
 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 DBPRINT(sc, BCE_VERBOSE_MISC,
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "%s(): Link up!\n", __FUNCTION__);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_link_up =3D TRUE;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((IFM_SUBTYPE(mii->mii_media_active) =3D=
=3D IFM_1000_T ||
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_SUBTYPE(mii->mii_media_active) =
=3D=3D IFM_1000_SX ||
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_SUBTYPE(mii->mii_media_active) =
=3D=3D IFM_2500_SX) &&
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (bce_verbose || bootverbose))
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PRINTF("Gigabit link up=
!\n");
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bzero(&ifmr, sizeof(ifmr));
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_ifmedia_sts_rphy(sc, &ifmr);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ifmr.ifm_status & (IFM_ACTIVE | IFM_AV=
ALID)) =3D=3D
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (IFM_ACTIVE | IFM_AVALID)) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_link_up =3D TRUE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_miibus_statchg(sc->bce_=
dev);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii =3D device_get_softc(sc->bce_miibus);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mii_tick(mii);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Check if the link has come up. */
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((mii->mii_media_status & IFM_ACTIVE) &&
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (IFM_SUBTYPE(mii->mii_media_active)=
 !=3D IFM_NONE)) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 DBPRINT(sc, BCE_VERBOSE_MIS=
C, "%s(): Link up!\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 __FUNCTION__);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_link_up =3D TRUE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((IFM_SUBTYPE(mii->mii_m=
edia_active) =3D=3D IFM_1000_T ||
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_SUBTYPE(mii->mi=
i_media_active) =3D=3D IFM_1000_SX ||
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFM_SUBTYPE(mii->mi=
i_media_active) =3D=3D IFM_2500_SX) &&
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (bce_verbose || boo=
tverbose))
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_PRINTF(=
"Gigabit link up!\n");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
>
> + =A0 =A0 =A0 }
> + =A0 =A0 =A0 if (sc->bce_link_up =3D=3D TRUE) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Now that link is up, handle any outstan=
ding TX traffic. */
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DBPRINT(sc, BCE_VERBOSE_MI=
SC, "%s(): Found "
> @@ -8221,6 +8544,36 @@ bce_tick_exit:
> =A0 =A0 =A0 =A0return;
> =A0}
>
> +static void
> +bce_fw_cap_init(struct bce_softc *sc)
> +{
> + =A0 =A0 =A0 u32 ack, cap, link;
> +
> + =A0 =A0 =A0 ack =3D 0;
> + =A0 =A0 =A0 cap =3D bce_shmem_rd(sc, BCE_FW_CAP_MB);
> + =A0 =A0 =A0 if ((cap & BCE_FW_CAP_SIGNATURE_MAGIC_MASK) !=3D
> + =A0 =A0 =A0 =A0 =A0 BCE_FW_CAP_SIGNATURE_MAGIC)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return;
> + =A0 =A0 =A0 if ((cap & (BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_CAP_BC_KEEP_V=
LAN)) =3D=3D
> + =A0 =A0 =A0 =A0 =A0 (BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_CAP_BC_KEEP_VLAN=
))
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ack |=3D BCE_DRV_ACK_CAP_SIGNATURE_MAGIC |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_C=
AP_BC_KEEP_VLAN;
> + =A0 =A0 =A0 if ((sc->bce_phy_flags & BCE_PHY_SERDES_FLAG) !=3D 0 &&
> + =A0 =A0 =A0 =A0 =A0 (cap & BCE_FW_CAP_REMOTE_PHY_CAP) !=3D 0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_phy_flags &=3D ~BCE_PHY_REMOTE_PORT=
_FIBER_FLAG;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_phy_flags |=3D BCE_PHY_REMOTE_CAP_F=
LAG;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 link =3D bce_shmem_rd(sc, BCE_LINK_STATUS);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((link & BCE_LINK_STATUS_SERDES_LINK) !=
=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sc->bce_phy_flags |=3D BCE_=
PHY_REMOTE_PORT_FIBER_FLAG;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ack |=3D BCE_DRV_ACK_CAP_SIGNATURE_MAGIC |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 BCE_FW_CAP_REMOTE_PHY_CAP;
> + =A0 =A0 =A0 }
> +
> + =A0 =A0 =A0 if (ack !=3D 0)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_shmem_wr(sc, BCE_DRV_ACK_CAP_MB, ack);
> +}
> +
> +
> =A0#ifdef BCE_DEBUG
> =A0/*********************************************************************=
*******/
> =A0/* Allows the driver state to be dumped through the sysctl interface. =
=A0 =A0 =A0 */
>
> Modified: stable/9/sys/dev/bce/if_bcereg.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- stable/9/sys/dev/bce/if_bcereg.h =A0 =A0Wed May 23 01:49:50 2012 =A0 =
=A0 =A0 =A0(r235817)
> +++ stable/9/sys/dev/bce/if_bcereg.h =A0 =A0Wed May 23 02:02:29 2012 =A0 =
=A0 =A0 =A0(r235818)
> @@ -814,6 +814,23 @@ struct flash_spec {
> =A0#define BCE_DRV_PULSE_SEQ_MASK =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A00x00=
007fff
>
> =A0#define BCE_MB_ARGS_0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A00x00000014
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_10HALF =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<0)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_10FULL =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<1)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_100HALF =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0(1<<2)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_100FULL =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0(1<<3)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_1000HALF =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<4)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_1000FULL =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<5)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_2500HALF =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<6)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_2500FULL =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<7)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_10GHALF =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0(1<<8)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_SPEED_10GFULL =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0(1<<9)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_ANEG_ENB =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 (1<<10)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_PHY_APP_REMOTE =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<11)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_FC_PAUSE_SYM =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 (1<<12)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_FC_PAUSE_ASYM =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0(1<<13)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_ETH_AT_WIRESPEED =A0 =A0 =A0 =A0 =A0 =
=A0 (1<<14)
> +#define =A0 =A0 =A0 =A0BCE_NETLINK_PHY_RESET =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0(1<<15)
> +
> =A0#define BCE_MB_ARGS_1 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A00x00000018
>
> =A0/* Indicate to the firmware not to go into the
> @@ -1079,6 +1096,26 @@ struct flash_spec {
> =A0#define BCE_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK =A00xffff
> =A0#define BCE_BC_STATE_BC_DBG_CMD_LOOP_INFINITE =A00xffff
>
> +#define =A0 =A0 =A0 =A0BCE_FW_EVT_CODE_MB =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A00x00000354
> +#define =A0 =A0 =A0 =A0BCE_FW_EVT_CODE_SW_TIMER_EXPIRE_EVENT =A0 0x00000=
000
> +#define =A0 =A0 =A0 =A0BCE_FW_EVT_CODE_LINK_EVENT =A0 =A0 =A0 =A0 =A0 =
=A0 =A00x00000001
> +
> +#define =A0 =A0 =A0 =A0BCE_DRV_ACK_CAP_MB =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A00x00000364
> +#define =A0 =A0 =A0 =A0BCE_DRV_ACK_CAP_SIGNATURE_MAGIC =A0 =A0 =A0 =A0 0=
x35450000
> +
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_MB =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 0x00000368
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_SIGNATURE_MAGIC =A0 =A0 =A0 =A0 =A0 =
=A0 =A00xaa550000
> +#define =A0 =A0 =A0 =A0BCE_FW_ACK_SIGNATURE_MAGIC =A0 =A0 =A0 =A0 =A0 =
=A0 =A00x52500000
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_SIGNATURE_MAGIC_MASK =A0 =A0 =A0 =A0 0=
xffff0000
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_REMOTE_PHY_CAP =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 0x00000001
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_REMOTE_PHY_PRESENT =A0 =A0 =A0 =A0 =A0=
 0x00000002
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_MFW_KEEP_VLAN =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A00x00000008
> +#define =A0 =A0 =A0 =A0BCE_FW_CAP_BC_KEEP_VLAN =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 0x00000010
> +
> +#define =A0 =A0 =A0 =A0BCE_RPHY_SERDES_LINK =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A00x00000374
> +
> +#define =A0 =A0 =A0 =A0BCE_RPHY_COPPER_LINK =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A00x00000378
> +
> =A0#define HOST_VIEW_SHMEM_BASE =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 0x167=
c00
>
> =A0/*
> @@ -6454,6 +6491,8 @@ struct bce_softc
> =A0#define BCE_PHY_INT_MODE_AUTO_POLLING_FLAG =A0 =A0 0x00000100
> =A0#define BCE_PHY_INT_MODE_LINK_READY_FLAG =A0 =A0 =A0 0x00000200
> =A0#define BCE_PHY_IEEE_CLAUSE_45_FLAG =A0 =A0 =A0 =A0 =A0 =A00x00000400
> +#define =A0 =A0 =A0 =A0BCE_PHY_REMOTE_CAP_FLAG =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 0x00000800
> +#define =A0 =A0 =A0 =A0BCE_PHY_REMOTE_PORT_FIBER_FLAG =A0 =A0 =A0 =A0 =
=A00x00001000
>
> =A0 =A0 =A0 =A0/* Values that need to be shared with the PHY driver. */
> =A0 =A0 =A0 =A0u32 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bce_shared_hw_=
cfg;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-Vmoku9ACBGYxEkja41G=-vPuDqN34c0esLbGLnX8NM5Jspg>