Mechanically convert if_tsec(4) to IfAPI

Sponsored by:	Juniper Networks, Inc.
Differential Revision: https://reviews.freebsd.org/D37805
This commit is contained in:
Justin Hibbits 2022-03-01 13:49:10 -06:00
parent a6c0f09aa3
commit 47842ecfe0
2 changed files with 80 additions and 81 deletions

View File

@ -73,12 +73,12 @@ static int tsec_alloc_dma_desc(device_t dev, bus_dma_tag_t *dtag,
bus_dmamap_t *dmap, bus_size_t dsize, void **vaddr, void *raddr,
const char *dname);
static void tsec_dma_ctl(struct tsec_softc *sc, int state);
static void tsec_encap(struct ifnet *ifp, struct tsec_softc *sc,
static void tsec_encap(if_t ifp, struct tsec_softc *sc,
struct mbuf *m0, uint16_t fcb_flags, int *start_tx);
static void tsec_free_dma(struct tsec_softc *sc);
static void tsec_free_dma_desc(bus_dma_tag_t dtag, bus_dmamap_t dmap, void *vaddr);
static int tsec_ifmedia_upd(struct ifnet *ifp);
static void tsec_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr);
static int tsec_ifmedia_upd(if_t ifp);
static void tsec_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr);
static int tsec_new_rxbuf(bus_dma_tag_t tag, bus_dmamap_t map,
struct mbuf **mbufp, uint32_t *paddr);
static void tsec_map_dma_addr(void *arg, bus_dma_segment_t *segs,
@ -86,12 +86,12 @@ static void tsec_map_dma_addr(void *arg, bus_dma_segment_t *segs,
static void tsec_intrs_ctl(struct tsec_softc *sc, int state);
static void tsec_init(void *xsc);
static void tsec_init_locked(struct tsec_softc *sc);
static int tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
static int tsec_ioctl(if_t ifp, u_long command, caddr_t data);
static void tsec_reset_mac(struct tsec_softc *sc);
static void tsec_setfilter(struct tsec_softc *sc);
static void tsec_set_mac_address(struct tsec_softc *sc);
static void tsec_start(struct ifnet *ifp);
static void tsec_start_locked(struct ifnet *ifp);
static void tsec_start(if_t ifp);
static void tsec_start_locked(if_t ifp);
static void tsec_stop(struct tsec_softc *sc);
static void tsec_tick(void *arg);
static void tsec_watchdog(struct tsec_softc *sc);
@ -119,7 +119,7 @@ int
tsec_attach(struct tsec_softc *sc)
{
uint8_t hwaddr[ETHER_ADDR_LEN];
struct ifnet *ifp;
if_t ifp;
int error = 0;
int i;
@ -247,26 +247,25 @@ tsec_attach(struct tsec_softc *sc)
return (ENOMEM);
}
ifp->if_softc = sc;
if_setsoftc(ifp, sc);
if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev));
ifp->if_flags = IFF_SIMPLEX | IFF_MULTICAST | IFF_BROADCAST;
ifp->if_init = tsec_init;
ifp->if_start = tsec_start;
ifp->if_ioctl = tsec_ioctl;
if_setflags(ifp, IFF_SIMPLEX | IFF_MULTICAST | IFF_BROADCAST);
if_setinitfn(ifp, tsec_init);
if_setstartfn(ifp, tsec_start);
if_setioctlfn(ifp, tsec_ioctl);
IFQ_SET_MAXLEN(&ifp->if_snd, TSEC_TX_NUM_DESC - 1);
ifp->if_snd.ifq_drv_maxlen = TSEC_TX_NUM_DESC - 1;
IFQ_SET_READY(&ifp->if_snd);
if_setsendqlen(ifp, TSEC_TX_NUM_DESC - 1);
if_setsendqready(ifp);
ifp->if_capabilities = IFCAP_VLAN_MTU;
if_setcapabilities(ifp, IFCAP_VLAN_MTU);
if (sc->is_etsec)
ifp->if_capabilities |= IFCAP_HWCSUM;
if_setcapabilitiesbit(ifp, IFCAP_HWCSUM, 0);
ifp->if_capenable = ifp->if_capabilities;
if_setcapenable(ifp, if_getcapabilities(ifp));
#ifdef DEVICE_POLLING
/* Advertise that polling is supported */
ifp->if_capabilities |= IFCAP_POLLING;
if_setcapabilitiesbit(ifp, IFCAP_POLLING, 0);
#endif
/* Attach PHY(s) */
@ -295,7 +294,7 @@ tsec_detach(struct tsec_softc *sc)
if (sc->tsec_ifp != NULL) {
#ifdef DEVICE_POLLING
if (sc->tsec_ifp->if_capenable & IFCAP_POLLING)
if (sc->tsec_if_getcapenable(ifp) & IFCAP_POLLING)
ether_poll_deregister(sc->tsec_ifp);
#endif
@ -377,11 +376,11 @@ tsec_init_locked(struct tsec_softc *sc)
{
struct tsec_desc *tx_desc = sc->tsec_tx_vaddr;
struct tsec_desc *rx_desc = sc->tsec_rx_vaddr;
struct ifnet *ifp = sc->tsec_ifp;
if_t ifp = sc->tsec_ifp;
uint32_t val, i;
int timeout;
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
return;
TSEC_GLOBAL_LOCK_ASSERT(sc);
@ -458,7 +457,7 @@ tsec_init_locked(struct tsec_softc *sc)
* ...only if polling is not turned on. Disable interrupts explicitly
* if polling is enabled.
*/
if (ifp->if_capenable & IFCAP_POLLING )
if (if_getcapenable(ifp) & IFCAP_POLLING )
tsec_intrs_ctl(sc, 0);
else
#endif /* DEVICE_POLLING */
@ -523,7 +522,7 @@ tsec_init_locked(struct tsec_softc *sc)
/* Step 19: Configure ethernet frame sizes */
TSEC_WRITE(sc, TSEC_REG_MINFLR, TSEC_MIN_FRAME_SIZE);
tsec_set_mtu(sc, ifp->if_mtu);
tsec_set_mtu(sc, if_getmtu(ifp));
/* Step 20: Enable Rx and RxBD sdata snooping */
TSEC_WRITE(sc, TSEC_REG_ATTR, TSEC_ATTR_RDSEN | TSEC_ATTR_RBDSEN);
@ -556,9 +555,9 @@ tsec_init_locked(struct tsec_softc *sc)
tsec_setup_multicast(sc);
/* Step 27: Activate network interface */
ifp->if_drv_flags |= IFF_DRV_RUNNING;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
sc->tsec_if_flags = ifp->if_flags;
if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
sc->tsec_if_flags = if_getflags(ifp);
sc->tsec_watchdog = 0;
/* Schedule watchdog timeout */
@ -579,7 +578,7 @@ tsec_set_mac_address(struct tsec_softc *sc)
sizeof(macbuf)));
macbufp = (char *)macbuf;
curmac = (char *)IF_LLADDR(sc->tsec_ifp);
curmac = (char *)if_getlladdr(sc->tsec_ifp);
/* Correct order of MAC address bytes */
for (i = 1; i <= ETHER_ADDR_LEN; i++)
@ -693,7 +692,7 @@ tsec_reset_mac(struct tsec_softc *sc)
static void
tsec_watchdog(struct tsec_softc *sc)
{
struct ifnet *ifp;
if_t ifp;
TSEC_GLOBAL_LOCK_ASSERT(sc);
@ -709,9 +708,9 @@ tsec_watchdog(struct tsec_softc *sc)
}
static void
tsec_start(struct ifnet *ifp)
tsec_start(if_t ifp)
{
struct tsec_softc *sc = ifp->if_softc;
struct tsec_softc *sc = if_getsoftc(ifp);
TSEC_TRANSMIT_LOCK(sc);
tsec_start_locked(ifp);
@ -719,7 +718,7 @@ tsec_start(struct ifnet *ifp)
}
static void
tsec_start_locked(struct ifnet *ifp)
tsec_start_locked(if_t ifp)
{
struct tsec_softc *sc;
struct mbuf *m0;
@ -728,7 +727,7 @@ tsec_start_locked(struct ifnet *ifp)
int start_tx;
uint16_t fcb_flags;
sc = ifp->if_softc;
sc = if_getsoftc(ifp);
start_tx = 0;
TSEC_TRANSMIT_LOCK_ASSERT(sc);
@ -742,12 +741,12 @@ tsec_start_locked(struct ifnet *ifp)
for (;;) {
if (TSEC_FREE_TX_DESC(sc) < TSEC_TX_MAX_DMA_SEGS) {
/* No free descriptors */
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
break;
}
/* Get packet from the queue */
IFQ_DRV_DEQUEUE(&ifp->if_snd, m0);
m0 = if_dequeue(ifp);
if (m0 == NULL)
break;
@ -790,7 +789,7 @@ tsec_start_locked(struct ifnet *ifp)
}
static void
tsec_encap(struct ifnet *ifp, struct tsec_softc *sc, struct mbuf *m0,
tsec_encap(if_t ifp, struct tsec_softc *sc, struct mbuf *m0,
uint16_t fcb_flags, int *start_tx)
{
bus_dma_segment_t segs[TSEC_TX_MAX_DMA_SEGS];
@ -872,14 +871,14 @@ tsec_encap(struct ifnet *ifp, struct tsec_softc *sc, struct mbuf *m0,
static void
tsec_setfilter(struct tsec_softc *sc)
{
struct ifnet *ifp;
if_t ifp;
uint32_t flags;
ifp = sc->tsec_ifp;
flags = TSEC_READ(sc, TSEC_REG_RCTRL);
/* Promiscuous mode */
if (ifp->if_flags & IFF_PROMISC)
if (if_getflags(ifp) & IFF_PROMISC)
flags |= TSEC_RCTRL_PROM;
else
flags &= ~TSEC_RCTRL_PROM;
@ -891,16 +890,16 @@ tsec_setfilter(struct tsec_softc *sc)
static poll_handler_t tsec_poll;
static int
tsec_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
tsec_poll(if_t ifp, enum poll_cmd cmd, int count)
{
uint32_t ie;
struct tsec_softc *sc = ifp->if_softc;
struct tsec_softc *sc = if_getsoftc(ifp);
int rx_npkts;
rx_npkts = 0;
TSEC_GLOBAL_LOCK(sc);
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) {
TSEC_GLOBAL_UNLOCK(sc);
return (rx_npkts);
}
@ -926,9 +925,9 @@ tsec_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
#endif /* DEVICE_POLLING */
static int
tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
tsec_ioctl(if_t ifp, u_long command, caddr_t data)
{
struct tsec_softc *sc = ifp->if_softc;
struct tsec_softc *sc = if_getsoftc(ifp);
struct ifreq *ifr = (struct ifreq *)data;
int mask, error = 0;
@ -936,33 +935,33 @@ tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
case SIOCSIFMTU:
TSEC_GLOBAL_LOCK(sc);
if (tsec_set_mtu(sc, ifr->ifr_mtu))
ifp->if_mtu = ifr->ifr_mtu;
if_setmtu(ifp, ifr->ifr_mtu);
else
error = EINVAL;
TSEC_GLOBAL_UNLOCK(sc);
break;
case SIOCSIFFLAGS:
TSEC_GLOBAL_LOCK(sc);
if (ifp->if_flags & IFF_UP) {
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
if ((sc->tsec_if_flags ^ ifp->if_flags) &
if (if_getflags(ifp) & IFF_UP) {
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
if ((sc->tsec_if_flags ^ if_getflags(ifp)) &
IFF_PROMISC)
tsec_setfilter(sc);
if ((sc->tsec_if_flags ^ ifp->if_flags) &
if ((sc->tsec_if_flags ^ if_getflags(ifp)) &
IFF_ALLMULTI)
tsec_setup_multicast(sc);
} else
tsec_init_locked(sc);
} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
} else if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
tsec_stop(sc);
sc->tsec_if_flags = ifp->if_flags;
sc->tsec_if_flags = if_getflags(ifp);
TSEC_GLOBAL_UNLOCK(sc);
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
TSEC_GLOBAL_LOCK(sc);
tsec_setup_multicast(sc);
TSEC_GLOBAL_UNLOCK(sc);
@ -973,11 +972,11 @@ tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
command);
break;
case SIOCSIFCAP:
mask = ifp->if_capenable ^ ifr->ifr_reqcap;
mask = if_getcapenable(ifp) ^ ifr->ifr_reqcap;
if ((mask & IFCAP_HWCSUM) && sc->is_etsec) {
TSEC_GLOBAL_LOCK(sc);
ifp->if_capenable &= ~IFCAP_HWCSUM;
ifp->if_capenable |= IFCAP_HWCSUM & ifr->ifr_reqcap;
if_setcapenablebit(ifp, 0, IFCAP_HWCSUM);
if_setcapenablebit(ifp, IFCAP_HWCSUM & ifr->ifr_reqcap, 0);
tsec_offload_setup(sc);
TSEC_GLOBAL_UNLOCK(sc);
}
@ -991,14 +990,14 @@ tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
TSEC_GLOBAL_LOCK(sc);
/* Disable interrupts */
tsec_intrs_ctl(sc, 0);
ifp->if_capenable |= IFCAP_POLLING;
if_setcapenablebit(ifp, IFCAP_POLLING, 0);
TSEC_GLOBAL_UNLOCK(sc);
} else {
error = ether_poll_deregister(ifp);
TSEC_GLOBAL_LOCK(sc);
/* Enable interrupts */
tsec_intrs_ctl(sc, 1);
ifp->if_capenable &= ~IFCAP_POLLING;
if_setcapenablebit(ifp, 0, IFCAP_POLLING);
TSEC_GLOBAL_UNLOCK(sc);
}
}
@ -1010,15 +1009,15 @@ tsec_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
}
/* Flush buffers if not empty */
if (ifp->if_flags & IFF_UP)
if (if_getflags(ifp) & IFF_UP)
tsec_start(ifp);
return (error);
}
static int
tsec_ifmedia_upd(struct ifnet *ifp)
tsec_ifmedia_upd(if_t ifp)
{
struct tsec_softc *sc = ifp->if_softc;
struct tsec_softc *sc = if_getsoftc(ifp);
struct mii_data *mii;
TSEC_TRANSMIT_LOCK(sc);
@ -1031,9 +1030,9 @@ tsec_ifmedia_upd(struct ifnet *ifp)
}
static void
tsec_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
tsec_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
{
struct tsec_softc *sc = ifp->if_softc;
struct tsec_softc *sc = if_getsoftc(ifp);
struct mii_data *mii;
TSEC_TRANSMIT_LOCK(sc);
@ -1213,7 +1212,7 @@ tsec_free_dma(struct tsec_softc *sc)
static void
tsec_stop(struct tsec_softc *sc)
{
struct ifnet *ifp;
if_t ifp;
uint32_t tmpval;
TSEC_GLOBAL_LOCK_ASSERT(sc);
@ -1222,7 +1221,7 @@ tsec_stop(struct tsec_softc *sc)
/* Disable interface and watchdog timer */
callout_stop(&sc->tsec_callout);
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
if_setdrvflagbits(ifp, 0, (IFF_DRV_RUNNING | IFF_DRV_OACTIVE));
sc->tsec_watchdog = 0;
/* Disable all interrupts and stop DMA */
@ -1252,7 +1251,7 @@ static void
tsec_tick(void *arg)
{
struct tsec_softc *sc = arg;
struct ifnet *ifp;
if_t ifp;
int link;
TSEC_GLOBAL_LOCK(sc);
@ -1265,7 +1264,7 @@ tsec_tick(void *arg)
mii_tick(sc->tsec_mii);
if (link == 0 && sc->tsec_link == 1 &&
(!IFQ_DRV_IS_EMPTY(&ifp->if_snd)))
(!if_sendq_empty(ifp)))
tsec_start_locked(ifp);
/* Schedule another timeout one second from now. */
@ -1284,7 +1283,7 @@ static int
tsec_receive_intr_locked(struct tsec_softc *sc, int count)
{
struct tsec_desc *rx_desc;
struct ifnet *ifp;
if_t ifp;
struct rx_data_type *rx_data;
struct mbuf *m;
uint32_t i;
@ -1386,7 +1385,7 @@ tsec_receive_intr_locked(struct tsec_softc *sc, int count)
tsec_offload_process_frame(sc, m);
TSEC_RECEIVE_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
if_input(ifp, m);
TSEC_RECEIVE_LOCK(sc);
rx_npkts++;
}
@ -1415,7 +1414,7 @@ tsec_receive_intr(void *arg)
TSEC_RECEIVE_LOCK(sc);
#ifdef DEVICE_POLLING
if (sc->tsec_ifp->if_capenable & IFCAP_POLLING) {
if (sc->tsec_if_getcapenable(ifp) & IFCAP_POLLING) {
TSEC_RECEIVE_UNLOCK(sc);
return;
}
@ -1431,7 +1430,7 @@ tsec_receive_intr(void *arg)
static void
tsec_transmit_intr_locked(struct tsec_softc *sc)
{
struct ifnet *ifp;
if_t ifp;
uint32_t tx_idx;
TSEC_TRANSMIT_LOCK_ASSERT(sc);
@ -1481,7 +1480,7 @@ tsec_transmit_intr_locked(struct tsec_softc *sc)
bus_dmamap_sync(sc->tsec_tx_dtag, sc->tsec_tx_dmap,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
tsec_start_locked(ifp);
if (sc->tx_idx_tail == sc->tx_idx_head)
@ -1496,7 +1495,7 @@ tsec_transmit_intr(void *arg)
TSEC_TRANSMIT_LOCK(sc);
#ifdef DEVICE_POLLING
if (sc->tsec_ifp->if_capenable & IFCAP_POLLING) {
if (sc->tsec_if_getcapenable(ifp) & IFCAP_POLLING) {
TSEC_TRANSMIT_UNLOCK(sc);
return;
}
@ -1511,7 +1510,7 @@ tsec_transmit_intr(void *arg)
static void
tsec_error_intr_locked(struct tsec_softc *sc, int count)
{
struct ifnet *ifp;
if_t ifp;
uint32_t eflags;
TSEC_GLOBAL_LOCK_ASSERT(sc);
@ -1541,7 +1540,7 @@ tsec_error_intr_locked(struct tsec_softc *sc, int count)
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
}
if (ifp->if_flags & IFF_DEBUG)
if (if_getflags(ifp) & IFF_DEBUG)
if_printf(ifp, "tsec_error_intr(): event flags: 0x%x\n",
eflags);
@ -1817,7 +1816,7 @@ tsec_set_txic(struct tsec_softc *sc)
static void
tsec_offload_setup(struct tsec_softc *sc)
{
struct ifnet *ifp = sc->tsec_ifp;
if_t ifp = sc->tsec_ifp;
uint32_t reg;
TSEC_GLOBAL_LOCK_ASSERT(sc);
@ -1825,10 +1824,10 @@ tsec_offload_setup(struct tsec_softc *sc)
reg = TSEC_READ(sc, TSEC_REG_TCTRL);
reg |= TSEC_TCTRL_IPCSEN | TSEC_TCTRL_TUCSEN;
if (ifp->if_capenable & IFCAP_TXCSUM)
ifp->if_hwassist = TSEC_CHECKSUM_FEATURES;
if (if_getcapenable(ifp) & IFCAP_TXCSUM)
if_sethwassist(ifp, TSEC_CHECKSUM_FEATURES);
else
ifp->if_hwassist = 0;
if_sethwassist(ifp, 0);
TSEC_WRITE(sc, TSEC_REG_TCTRL, reg);
@ -1836,7 +1835,7 @@ tsec_offload_setup(struct tsec_softc *sc)
reg &= ~(TSEC_RCTRL_IPCSEN | TSEC_RCTRL_TUCSEN | TSEC_RCTRL_PRSDEP);
reg |= TSEC_RCTRL_PRSDEP_PARSE_L2 | TSEC_RCTRL_VLEX;
if (ifp->if_capenable & IFCAP_RXCSUM)
if (if_getcapenable(ifp) & IFCAP_RXCSUM)
reg |= TSEC_RCTRL_IPCSEN | TSEC_RCTRL_TUCSEN |
TSEC_RCTRL_PRSDEP_PARSE_L234;
@ -1895,12 +1894,12 @@ static void
tsec_setup_multicast(struct tsec_softc *sc)
{
uint32_t hashtable[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
struct ifnet *ifp = sc->tsec_ifp;
if_t ifp = sc->tsec_ifp;
int i;
TSEC_GLOBAL_LOCK_ASSERT(sc);
if (ifp->if_flags & IFF_ALLMULTI) {
if (if_getflags(ifp) & IFF_ALLMULTI) {
for (i = 0; i < 8; i++)
TSEC_WRITE(sc, TSEC_REG_GADDR(i), 0xFFFFFFFF);

View File

@ -55,7 +55,7 @@ struct tsec_bufmap {
struct tsec_softc {
/* XXX MII bus requires that struct ifnet is first!!! */
struct ifnet *tsec_ifp;
if_t tsec_ifp;
struct mtx transmit_lock; /* transmitter lock */
struct mtx receive_lock; /* receiver lock */