mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
Mechanically convert if_rl(4) to IfAPI
Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D37803
This commit is contained in:
parent
0d1025348b
commit
ac8e2243b8
|
@ -185,9 +185,9 @@ static void rl_eeprom_getword(struct rl_softc *, int, uint16_t *);
|
|||
static int rl_encap(struct rl_softc *, struct mbuf **);
|
||||
static int rl_list_tx_init(struct rl_softc *);
|
||||
static int rl_list_rx_init(struct rl_softc *);
|
||||
static int rl_ifmedia_upd(struct ifnet *);
|
||||
static void rl_ifmedia_sts(struct ifnet *, struct ifmediareq *);
|
||||
static int rl_ioctl(struct ifnet *, u_long, caddr_t);
|
||||
static int rl_ifmedia_upd(if_t);
|
||||
static void rl_ifmedia_sts(if_t, struct ifmediareq *);
|
||||
static int rl_ioctl(if_t, u_long, caddr_t);
|
||||
static void rl_intr(void *);
|
||||
static void rl_init(void *);
|
||||
static void rl_init_locked(struct rl_softc *sc);
|
||||
|
@ -195,8 +195,8 @@ static int rl_miibus_readreg(device_t, int, int);
|
|||
static void rl_miibus_statchg(device_t);
|
||||
static int rl_miibus_writereg(device_t, int, int, int);
|
||||
#ifdef DEVICE_POLLING
|
||||
static int rl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
|
||||
static int rl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
|
||||
static int rl_poll(if_t ifp, enum poll_cmd cmd, int count);
|
||||
static int rl_poll_locked(if_t ifp, enum poll_cmd cmd, int count);
|
||||
#endif
|
||||
static int rl_probe(device_t);
|
||||
static void rl_read_eeprom(struct rl_softc *, uint8_t *, int, int, int);
|
||||
|
@ -205,8 +205,8 @@ static int rl_resume(device_t);
|
|||
static int rl_rxeof(struct rl_softc *);
|
||||
static void rl_rxfilter(struct rl_softc *);
|
||||
static int rl_shutdown(device_t);
|
||||
static void rl_start(struct ifnet *);
|
||||
static void rl_start_locked(struct ifnet *);
|
||||
static void rl_start(if_t);
|
||||
static void rl_start_locked(if_t);
|
||||
static void rl_stop(struct rl_softc *);
|
||||
static int rl_suspend(device_t);
|
||||
static void rl_tick(void *);
|
||||
|
@ -478,14 +478,14 @@ static void
|
|||
rl_miibus_statchg(device_t dev)
|
||||
{
|
||||
struct rl_softc *sc;
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
struct mii_data *mii;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
mii = device_get_softc(sc->rl_miibus);
|
||||
ifp = sc->rl_ifp;
|
||||
if (mii == NULL || ifp == NULL ||
|
||||
(ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
|
||||
(if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
|
||||
return;
|
||||
|
||||
sc->rl_flags &= ~RL_FLAG_LINK;
|
||||
|
@ -528,7 +528,7 @@ rl_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
|
|||
static void
|
||||
rl_rxfilter(struct rl_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
uint32_t hashes[2] = { 0, 0 };
|
||||
uint32_t rxfilt;
|
||||
|
||||
|
@ -540,11 +540,11 @@ rl_rxfilter(struct rl_softc *sc)
|
|||
/* Always accept frames destined for this host. */
|
||||
rxfilt |= RL_RXCFG_RX_INDIV;
|
||||
/* Set capture broadcast bit to capture broadcast frames. */
|
||||
if (ifp->if_flags & IFF_BROADCAST)
|
||||
if (if_getflags(ifp) & IFF_BROADCAST)
|
||||
rxfilt |= RL_RXCFG_RX_BROAD;
|
||||
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
|
||||
if (if_getflags(ifp) & IFF_ALLMULTI || if_getflags(ifp) & IFF_PROMISC) {
|
||||
rxfilt |= RL_RXCFG_RX_MULTI;
|
||||
if (ifp->if_flags & IFF_PROMISC)
|
||||
if (if_getflags(ifp) & IFF_PROMISC)
|
||||
rxfilt |= RL_RXCFG_RX_ALLPHYS;
|
||||
hashes[0] = 0xFFFFFFFF;
|
||||
hashes[1] = 0xFFFFFFFF;
|
||||
|
@ -637,7 +637,7 @@ rl_attach(device_t dev)
|
|||
{
|
||||
uint8_t eaddr[ETHER_ADDR_LEN];
|
||||
uint16_t as[3];
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
struct rl_softc *sc;
|
||||
const struct rl_type *t;
|
||||
struct sysctl_ctx_list *ctx;
|
||||
|
@ -801,14 +801,14 @@ rl_attach(device_t dev)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
ifp->if_softc = sc;
|
||||
if_setsoftc(ifp, sc);
|
||||
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
|
||||
ifp->if_mtu = ETHERMTU;
|
||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||
ifp->if_ioctl = rl_ioctl;
|
||||
ifp->if_start = rl_start;
|
||||
ifp->if_init = rl_init;
|
||||
ifp->if_capabilities = IFCAP_VLAN_MTU;
|
||||
if_setmtu(ifp, ETHERMTU);
|
||||
if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
|
||||
if_setioctlfn(ifp, rl_ioctl);
|
||||
if_setstartfn(ifp, rl_start);
|
||||
if_setinitfn(ifp, rl_init);
|
||||
if_setcapabilities(ifp, IFCAP_VLAN_MTU);
|
||||
/* Check WOL for RTL8139B or newer controllers. */
|
||||
if (sc->rl_type == RL_8139 &&
|
||||
pci_find_cap(sc->rl_dev, PCIY_PMG, &pmc) == 0) {
|
||||
|
@ -820,7 +820,7 @@ rl_attach(device_t dev)
|
|||
case RL_HWREV_8139D:
|
||||
case RL_HWREV_8101:
|
||||
case RL_HWREV_8100:
|
||||
ifp->if_capabilities |= IFCAP_WOL;
|
||||
if_setcapabilitiesbit(ifp, IFCAP_WOL, 0);
|
||||
/* Disable WOL. */
|
||||
rl_clrwol(sc);
|
||||
break;
|
||||
|
@ -828,14 +828,13 @@ rl_attach(device_t dev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
ifp->if_capenable = ifp->if_capabilities;
|
||||
ifp->if_capenable &= ~(IFCAP_WOL_UCAST | IFCAP_WOL_MCAST);
|
||||
if_setcapenable(ifp, if_getcapabilities(ifp));
|
||||
if_setcapenablebit(ifp, 0, (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST));
|
||||
#ifdef DEVICE_POLLING
|
||||
ifp->if_capabilities |= IFCAP_POLLING;
|
||||
if_setcapabilitiesbit(ifp, IFCAP_POLLING, 0);
|
||||
#endif
|
||||
IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
|
||||
ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
|
||||
IFQ_SET_READY(&ifp->if_snd);
|
||||
if_setsendqlen(ifp, ifqmaxlen);
|
||||
if_setsendqready(ifp);
|
||||
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
|
@ -868,7 +867,7 @@ static int
|
|||
rl_detach(device_t dev)
|
||||
{
|
||||
struct rl_softc *sc;
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
ifp = sc->rl_ifp;
|
||||
|
@ -876,7 +875,7 @@ rl_detach(device_t dev)
|
|||
KASSERT(mtx_initialized(&sc->rl_mtx), ("rl mutex not initialized"));
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
if (ifp->if_capenable & IFCAP_POLLING)
|
||||
if (if_getcapenable(ifp) & IFCAP_POLLING)
|
||||
ether_poll_deregister(ifp);
|
||||
#endif
|
||||
/* These should only be active if attach succeeded */
|
||||
|
@ -1116,7 +1115,7 @@ static int
|
|||
rl_rxeof(struct rl_softc *sc)
|
||||
{
|
||||
struct mbuf *m;
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
uint8_t *rxbufpos;
|
||||
int total_len = 0;
|
||||
int wrap = 0;
|
||||
|
@ -1143,7 +1142,7 @@ rl_rxeof(struct rl_softc *sc)
|
|||
|
||||
while((CSR_READ_1(sc, RL_COMMAND) & RL_CMD_EMPTY_RXBUF) == 0) {
|
||||
#ifdef DEVICE_POLLING
|
||||
if (ifp->if_capenable & IFCAP_POLLING) {
|
||||
if (if_getcapenable(ifp) & IFCAP_POLLING) {
|
||||
if (sc->rxcycles <= 0)
|
||||
break;
|
||||
sc->rxcycles--;
|
||||
|
@ -1168,7 +1167,7 @@ rl_rxeof(struct rl_softc *sc)
|
|||
total_len < ETHER_MIN_LEN ||
|
||||
total_len > ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) {
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
|
||||
rl_init_locked(sc);
|
||||
return (rx_npkts);
|
||||
}
|
||||
|
@ -1222,7 +1221,7 @@ rl_rxeof(struct rl_softc *sc)
|
|||
|
||||
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
||||
RL_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
if_input(ifp, m);
|
||||
RL_LOCK(sc);
|
||||
rx_npkts++;
|
||||
}
|
||||
|
@ -1238,7 +1237,7 @@ rl_rxeof(struct rl_softc *sc)
|
|||
static void
|
||||
rl_txeof(struct rl_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
uint32_t txstat;
|
||||
|
||||
RL_LOCK_ASSERT(sc);
|
||||
|
@ -1280,14 +1279,14 @@ rl_txeof(struct rl_softc *sc)
|
|||
CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG);
|
||||
oldthresh = sc->rl_txthresh;
|
||||
/* error recovery */
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
|
||||
rl_init_locked(sc);
|
||||
/* restore original threshold */
|
||||
sc->rl_txthresh = oldthresh;
|
||||
return;
|
||||
}
|
||||
RL_INC(sc->rl_cdata.last_tx);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
|
||||
} while (sc->rl_cdata.last_tx != sc->rl_cdata.cur_tx);
|
||||
|
||||
if (RL_LAST_TXMBUF(sc) == NULL)
|
||||
|
@ -1435,22 +1434,22 @@ rl_tick(void *xsc)
|
|||
|
||||
#ifdef DEVICE_POLLING
|
||||
static int
|
||||
rl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
|
||||
rl_poll(if_t ifp, enum poll_cmd cmd, int count)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
int rx_npkts = 0;
|
||||
|
||||
RL_LOCK(sc);
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
|
||||
rx_npkts = rl_poll_locked(ifp, cmd, count);
|
||||
RL_UNLOCK(sc);
|
||||
return (rx_npkts);
|
||||
}
|
||||
|
||||
static int
|
||||
rl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
|
||||
rl_poll_locked(if_t ifp, enum poll_cmd cmd, int count)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
int rx_npkts;
|
||||
|
||||
RL_LOCK_ASSERT(sc);
|
||||
|
@ -1459,7 +1458,7 @@ rl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
|
|||
rx_npkts = rl_rxeof(sc);
|
||||
rl_txeof(sc);
|
||||
|
||||
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
||||
if (!if_sendq_empty(ifp))
|
||||
rl_start_locked(ifp);
|
||||
|
||||
if (cmd == POLL_AND_CHECK_STATUS) {
|
||||
|
@ -1475,7 +1474,7 @@ rl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
|
|||
/* XXX We should check behaviour on receiver stalls. */
|
||||
|
||||
if (status & RL_ISR_SYSTEM_ERR) {
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
|
||||
rl_init_locked(sc);
|
||||
}
|
||||
}
|
||||
|
@ -1487,7 +1486,7 @@ static void
|
|||
rl_intr(void *arg)
|
||||
{
|
||||
struct rl_softc *sc = arg;
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
uint16_t status;
|
||||
int count;
|
||||
|
||||
|
@ -1497,11 +1496,11 @@ rl_intr(void *arg)
|
|||
goto done_locked;
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
if (ifp->if_capenable & IFCAP_POLLING)
|
||||
if (if_getcapenable(ifp) & IFCAP_POLLING)
|
||||
goto done_locked;
|
||||
#endif
|
||||
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
|
||||
if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
|
||||
goto done_locked2;
|
||||
status = CSR_READ_2(sc, RL_ISR);
|
||||
if (status == 0xffff || (status & RL_INTRS) == 0)
|
||||
|
@ -1512,13 +1511,13 @@ rl_intr(void *arg)
|
|||
CSR_WRITE_2(sc, RL_IMR, 0);
|
||||
for (count = 16; count > 0; count--) {
|
||||
CSR_WRITE_2(sc, RL_ISR, status);
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
|
||||
if (status & (RL_ISR_RX_OK | RL_ISR_RX_ERR))
|
||||
rl_rxeof(sc);
|
||||
if (status & (RL_ISR_TX_OK | RL_ISR_TX_ERR))
|
||||
rl_txeof(sc);
|
||||
if (status & RL_ISR_SYSTEM_ERR) {
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
|
||||
rl_init_locked(sc);
|
||||
RL_UNLOCK(sc);
|
||||
return;
|
||||
|
@ -1530,11 +1529,11 @@ rl_intr(void *arg)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
||||
if (!if_sendq_empty(ifp))
|
||||
rl_start_locked(ifp);
|
||||
|
||||
done_locked2:
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
|
||||
CSR_WRITE_2(sc, RL_IMR, RL_INTRS);
|
||||
done_locked:
|
||||
RL_UNLOCK(sc);
|
||||
|
@ -1611,9 +1610,9 @@ rl_encap(struct rl_softc *sc, struct mbuf **m_head)
|
|||
* Main transmit routine.
|
||||
*/
|
||||
static void
|
||||
rl_start(struct ifnet *ifp)
|
||||
rl_start(if_t ifp)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
|
||||
RL_LOCK(sc);
|
||||
rl_start_locked(ifp);
|
||||
|
@ -1621,19 +1620,19 @@ rl_start(struct ifnet *ifp)
|
|||
}
|
||||
|
||||
static void
|
||||
rl_start_locked(struct ifnet *ifp)
|
||||
rl_start_locked(if_t ifp)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
struct mbuf *m_head = NULL;
|
||||
|
||||
RL_LOCK_ASSERT(sc);
|
||||
|
||||
if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
|
||||
if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
|
||||
IFF_DRV_RUNNING || (sc->rl_flags & RL_FLAG_LINK) == 0)
|
||||
return;
|
||||
|
||||
while (RL_CUR_TXMBUF(sc) == NULL) {
|
||||
IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
|
||||
m_head = if_dequeue(ifp);
|
||||
|
||||
if (m_head == NULL)
|
||||
break;
|
||||
|
@ -1641,8 +1640,8 @@ rl_start_locked(struct ifnet *ifp)
|
|||
if (rl_encap(sc, &m_head)) {
|
||||
if (m_head == NULL)
|
||||
break;
|
||||
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
if_sendq_prepend(ifp, m_head);
|
||||
if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1666,7 +1665,7 @@ rl_start_locked(struct ifnet *ifp)
|
|||
* packets from the queue.
|
||||
*/
|
||||
if (RL_CUR_TXMBUF(sc) != NULL)
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1682,7 +1681,7 @@ rl_init(void *xsc)
|
|||
static void
|
||||
rl_init_locked(struct rl_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
struct mii_data *mii;
|
||||
uint32_t eaddr[2];
|
||||
|
||||
|
@ -1690,7 +1689,7 @@ rl_init_locked(struct rl_softc *sc)
|
|||
|
||||
mii = device_get_softc(sc->rl_miibus);
|
||||
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
|
||||
if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -1716,7 +1715,7 @@ rl_init_locked(struct rl_softc *sc)
|
|||
*/
|
||||
CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG);
|
||||
bzero(eaddr, sizeof(eaddr));
|
||||
bcopy(IF_LLADDR(sc->rl_ifp), eaddr, ETHER_ADDR_LEN);
|
||||
bcopy(if_getlladdr(sc->rl_ifp), eaddr, ETHER_ADDR_LEN);
|
||||
CSR_WRITE_STREAM_4(sc, RL_IDR0, eaddr[0]);
|
||||
CSR_WRITE_STREAM_4(sc, RL_IDR4, eaddr[1]);
|
||||
CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
|
||||
|
@ -1745,7 +1744,7 @@ rl_init_locked(struct rl_softc *sc)
|
|||
|
||||
#ifdef DEVICE_POLLING
|
||||
/* Disable interrupts if we are polling. */
|
||||
if (ifp->if_capenable & IFCAP_POLLING)
|
||||
if (if_getcapenable(ifp) & IFCAP_POLLING)
|
||||
CSR_WRITE_2(sc, RL_IMR, 0);
|
||||
else
|
||||
#endif
|
||||
|
@ -1766,8 +1765,8 @@ rl_init_locked(struct rl_softc *sc)
|
|||
|
||||
CSR_WRITE_1(sc, sc->rl_cfg1, RL_CFG1_DRVLOAD|RL_CFG1_FULLDUPLEX);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
|
||||
if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
|
||||
|
||||
callout_reset(&sc->rl_stat_callout, hz, rl_tick, sc);
|
||||
}
|
||||
|
@ -1776,9 +1775,9 @@ rl_init_locked(struct rl_softc *sc)
|
|||
* Set media options.
|
||||
*/
|
||||
static int
|
||||
rl_ifmedia_upd(struct ifnet *ifp)
|
||||
rl_ifmedia_upd(if_t ifp)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
struct mii_data *mii;
|
||||
|
||||
mii = device_get_softc(sc->rl_miibus);
|
||||
|
@ -1794,9 +1793,9 @@ rl_ifmedia_upd(struct ifnet *ifp)
|
|||
* Report current media status.
|
||||
*/
|
||||
static void
|
||||
rl_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
|
||||
rl_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
|
||||
{
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
struct mii_data *mii;
|
||||
|
||||
mii = device_get_softc(sc->rl_miibus);
|
||||
|
@ -1809,26 +1808,26 @@ rl_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
|
|||
}
|
||||
|
||||
static int
|
||||
rl_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
rl_ioctl(if_t ifp, u_long command, caddr_t data)
|
||||
{
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
struct mii_data *mii;
|
||||
struct rl_softc *sc = ifp->if_softc;
|
||||
struct rl_softc *sc = if_getsoftc(ifp);
|
||||
int error = 0, mask;
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFFLAGS:
|
||||
RL_LOCK(sc);
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
|
||||
((ifp->if_flags ^ sc->rl_if_flags) &
|
||||
if (if_getflags(ifp) & IFF_UP) {
|
||||
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING &&
|
||||
((if_getflags(ifp) ^ sc->rl_if_flags) &
|
||||
(IFF_PROMISC | IFF_ALLMULTI)))
|
||||
rl_rxfilter(sc);
|
||||
else
|
||||
rl_init_locked(sc);
|
||||
} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||
} else if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
|
||||
rl_stop(sc);
|
||||
sc->rl_if_flags = ifp->if_flags;
|
||||
sc->rl_if_flags = if_getflags(ifp);
|
||||
RL_UNLOCK(sc);
|
||||
break;
|
||||
case SIOCADDMULTI:
|
||||
|
@ -1843,40 +1842,40 @@ rl_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
|||
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
|
||||
break;
|
||||
case SIOCSIFCAP:
|
||||
mask = ifr->ifr_reqcap ^ ifp->if_capenable;
|
||||
mask = ifr->ifr_reqcap ^ if_getcapenable(ifp);
|
||||
#ifdef DEVICE_POLLING
|
||||
if (ifr->ifr_reqcap & IFCAP_POLLING &&
|
||||
!(ifp->if_capenable & IFCAP_POLLING)) {
|
||||
!(if_getcapenable(ifp) & IFCAP_POLLING)) {
|
||||
error = ether_poll_register(rl_poll, ifp);
|
||||
if (error)
|
||||
return(error);
|
||||
RL_LOCK(sc);
|
||||
/* Disable interrupts */
|
||||
CSR_WRITE_2(sc, RL_IMR, 0x0000);
|
||||
ifp->if_capenable |= IFCAP_POLLING;
|
||||
if_setcapenablebit(ifp, IFCAP_POLLING, 0);
|
||||
RL_UNLOCK(sc);
|
||||
return (error);
|
||||
|
||||
}
|
||||
if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
|
||||
ifp->if_capenable & IFCAP_POLLING) {
|
||||
if_getcapenable(ifp) & IFCAP_POLLING) {
|
||||
error = ether_poll_deregister(ifp);
|
||||
/* Enable interrupts. */
|
||||
RL_LOCK(sc);
|
||||
CSR_WRITE_2(sc, RL_IMR, RL_INTRS);
|
||||
ifp->if_capenable &= ~IFCAP_POLLING;
|
||||
if_setcapenablebit(ifp, 0, IFCAP_POLLING);
|
||||
RL_UNLOCK(sc);
|
||||
return (error);
|
||||
}
|
||||
#endif /* DEVICE_POLLING */
|
||||
if ((mask & IFCAP_WOL) != 0 &&
|
||||
(ifp->if_capabilities & IFCAP_WOL) != 0) {
|
||||
(if_getcapabilities(ifp) & IFCAP_WOL) != 0) {
|
||||
if ((mask & IFCAP_WOL_UCAST) != 0)
|
||||
ifp->if_capenable ^= IFCAP_WOL_UCAST;
|
||||
if_togglecapenable(ifp, IFCAP_WOL_UCAST);
|
||||
if ((mask & IFCAP_WOL_MCAST) != 0)
|
||||
ifp->if_capenable ^= IFCAP_WOL_MCAST;
|
||||
if_togglecapenable(ifp, IFCAP_WOL_MCAST);
|
||||
if ((mask & IFCAP_WOL_MAGIC) != 0)
|
||||
ifp->if_capenable ^= IFCAP_WOL_MAGIC;
|
||||
if_togglecapenable(ifp, IFCAP_WOL_MAGIC);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -1901,7 +1900,7 @@ rl_watchdog(struct rl_softc *sc)
|
|||
|
||||
rl_txeof(sc);
|
||||
rl_rxeof(sc);
|
||||
sc->rl_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
if_setdrvflagbits(sc->rl_ifp, 0, IFF_DRV_RUNNING);
|
||||
rl_init_locked(sc);
|
||||
}
|
||||
|
||||
|
@ -1913,13 +1912,13 @@ static void
|
|||
rl_stop(struct rl_softc *sc)
|
||||
{
|
||||
int i;
|
||||
struct ifnet *ifp = sc->rl_ifp;
|
||||
if_t ifp = sc->rl_ifp;
|
||||
|
||||
RL_LOCK_ASSERT(sc);
|
||||
|
||||
sc->rl_watchdog_timer = 0;
|
||||
callout_stop(&sc->rl_stat_callout);
|
||||
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
|
||||
if_setdrvflagbits(ifp, 0, (IFF_DRV_RUNNING | IFF_DRV_OACTIVE));
|
||||
sc->rl_flags &= ~RL_FLAG_LINK;
|
||||
|
||||
CSR_WRITE_1(sc, RL_COMMAND, 0x00);
|
||||
|
@ -1981,7 +1980,7 @@ static int
|
|||
rl_resume(device_t dev)
|
||||
{
|
||||
struct rl_softc *sc;
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
int pmc;
|
||||
uint16_t pmstat;
|
||||
|
||||
|
@ -1990,7 +1989,7 @@ rl_resume(device_t dev)
|
|||
|
||||
RL_LOCK(sc);
|
||||
|
||||
if ((ifp->if_capabilities & IFCAP_WOL) != 0 &&
|
||||
if ((if_getcapabilities(ifp) & IFCAP_WOL) != 0 &&
|
||||
pci_find_cap(sc->rl_dev, PCIY_PMG, &pmc) == 0) {
|
||||
/* Disable PME and clear PME status. */
|
||||
pmstat = pci_read_config(sc->rl_dev,
|
||||
|
@ -2008,7 +2007,7 @@ rl_resume(device_t dev)
|
|||
}
|
||||
|
||||
/* reinitialize interface if necessary */
|
||||
if (ifp->if_flags & IFF_UP)
|
||||
if (if_getflags(ifp) & IFF_UP)
|
||||
rl_init_locked(sc);
|
||||
|
||||
sc->suspended = 0;
|
||||
|
@ -2036,7 +2035,7 @@ rl_shutdown(device_t dev)
|
|||
* interrupt comes in later on, which can happen in some
|
||||
* cases.
|
||||
*/
|
||||
sc->rl_ifp->if_flags &= ~IFF_UP;
|
||||
if_setflagbits(sc->rl_ifp, 0, IFF_UP);
|
||||
rl_setwol(sc);
|
||||
RL_UNLOCK(sc);
|
||||
|
||||
|
@ -2046,7 +2045,7 @@ rl_shutdown(device_t dev)
|
|||
static void
|
||||
rl_setwol(struct rl_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
int pmc;
|
||||
uint16_t pmstat;
|
||||
uint8_t v;
|
||||
|
@ -2054,7 +2053,7 @@ rl_setwol(struct rl_softc *sc)
|
|||
RL_LOCK_ASSERT(sc);
|
||||
|
||||
ifp = sc->rl_ifp;
|
||||
if ((ifp->if_capabilities & IFCAP_WOL) == 0)
|
||||
if ((if_getcapabilities(ifp) & IFCAP_WOL) == 0)
|
||||
return;
|
||||
if (pci_find_cap(sc->rl_dev, PCIY_PMG, &pmc) != 0)
|
||||
return;
|
||||
|
@ -2065,24 +2064,24 @@ rl_setwol(struct rl_softc *sc)
|
|||
/* Enable PME. */
|
||||
v = CSR_READ_1(sc, sc->rl_cfg1);
|
||||
v &= ~RL_CFG1_PME;
|
||||
if ((ifp->if_capenable & IFCAP_WOL) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL) != 0)
|
||||
v |= RL_CFG1_PME;
|
||||
CSR_WRITE_1(sc, sc->rl_cfg1, v);
|
||||
|
||||
v = CSR_READ_1(sc, sc->rl_cfg3);
|
||||
v &= ~(RL_CFG3_WOL_LINK | RL_CFG3_WOL_MAGIC);
|
||||
if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL_MAGIC) != 0)
|
||||
v |= RL_CFG3_WOL_MAGIC;
|
||||
CSR_WRITE_1(sc, sc->rl_cfg3, v);
|
||||
|
||||
v = CSR_READ_1(sc, sc->rl_cfg5);
|
||||
v &= ~(RL_CFG5_WOL_BCAST | RL_CFG5_WOL_MCAST | RL_CFG5_WOL_UCAST);
|
||||
v &= ~RL_CFG5_WOL_LANWAKE;
|
||||
if ((ifp->if_capenable & IFCAP_WOL_UCAST) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL_UCAST) != 0)
|
||||
v |= RL_CFG5_WOL_UCAST;
|
||||
if ((ifp->if_capenable & IFCAP_WOL_MCAST) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL_MCAST) != 0)
|
||||
v |= RL_CFG5_WOL_MCAST | RL_CFG5_WOL_BCAST;
|
||||
if ((ifp->if_capenable & IFCAP_WOL) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL) != 0)
|
||||
v |= RL_CFG5_WOL_LANWAKE;
|
||||
CSR_WRITE_1(sc, sc->rl_cfg5, v);
|
||||
|
||||
|
@ -2092,7 +2091,7 @@ rl_setwol(struct rl_softc *sc)
|
|||
/* Request PME if WOL is requested. */
|
||||
pmstat = pci_read_config(sc->rl_dev, pmc + PCIR_POWER_STATUS, 2);
|
||||
pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
|
||||
if ((ifp->if_capenable & IFCAP_WOL) != 0)
|
||||
if ((if_getcapenable(ifp) & IFCAP_WOL) != 0)
|
||||
pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
|
||||
pci_write_config(sc->rl_dev, pmc + PCIR_POWER_STATUS, pmstat, 2);
|
||||
}
|
||||
|
@ -2100,11 +2099,11 @@ rl_setwol(struct rl_softc *sc)
|
|||
static void
|
||||
rl_clrwol(struct rl_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp;
|
||||
if_t ifp;
|
||||
uint8_t v;
|
||||
|
||||
ifp = sc->rl_ifp;
|
||||
if ((ifp->if_capabilities & IFCAP_WOL) == 0)
|
||||
if ((if_getcapabilities(ifp) & IFCAP_WOL) == 0)
|
||||
return;
|
||||
|
||||
/* Enable config register write. */
|
||||
|
|
|
@ -863,7 +863,7 @@ struct rl_list_data {
|
|||
enum rl_twist { DONE, CHK_LINK, FIND_ROW, SET_PARAM, RECHK_LONG, RETUNE };
|
||||
|
||||
struct rl_softc {
|
||||
struct ifnet *rl_ifp; /* interface info */
|
||||
if_t rl_ifp; /* interface info */
|
||||
bus_space_handle_t rl_bhandle; /* bus space handle */
|
||||
bus_space_tag_t rl_btag; /* bus space tag */
|
||||
device_t rl_dev;
|
||||
|
|
Loading…
Reference in a new issue