While reviewing if_sn in an attempt to understand network drivers
better, I discovered sn doing too many pointer dereferences. This driver would do silly things like: sn_foo(struct ifnet *ifp) { struct sn_softc *sc = ifp->if_softc; sc->ifp->mumble /* Other stuff */ } while /* other stuff */ usually needed sc, the extra deref isn't needed. Eliminate a few dozen of them.
This commit is contained in:
parent
62aedb0446
commit
1851bd711a
@ -373,7 +373,7 @@ snstart_locked(struct ifnet *ifp)
|
||||
|
||||
SN_ASSERT_LOCKED(sc);
|
||||
|
||||
if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE)
|
||||
if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
|
||||
return;
|
||||
if (sc->pages_wanted != -1) {
|
||||
if_printf(ifp, "snstart() while memory allocation pending\n");
|
||||
@ -384,7 +384,7 @@ snstart_locked(struct ifnet *ifp)
|
||||
/*
|
||||
* Sneak a peek at the next packet
|
||||
*/
|
||||
m = sc->ifp->if_snd.ifq_head;
|
||||
m = ifp->if_snd.ifq_head;
|
||||
if (m == 0)
|
||||
return;
|
||||
/*
|
||||
@ -402,8 +402,8 @@ snstart_locked(struct ifnet *ifp)
|
||||
*/
|
||||
if (len + pad > ETHER_MAX_LEN - ETHER_CRC_LEN) {
|
||||
if_printf(ifp, "large packet discarded (A)\n");
|
||||
++sc->ifp->if_oerrors;
|
||||
IF_DEQUEUE(&sc->ifp->if_snd, m);
|
||||
++ifp->if_oerrors;
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
m_freem(m);
|
||||
goto readcheck;
|
||||
}
|
||||
@ -460,8 +460,8 @@ snstart_locked(struct ifnet *ifp)
|
||||
CSR_WRITE_1(sc, INTR_MASK_REG_B, mask);
|
||||
sc->intr_mask = mask;
|
||||
|
||||
sc->ifp->if_timer = 1;
|
||||
sc->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
ifp->if_timer = 1;
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
sc->pages_wanted = numPages;
|
||||
return;
|
||||
}
|
||||
@ -496,7 +496,7 @@ snstart_locked(struct ifnet *ifp)
|
||||
* Get the packet from the kernel. This will include the Ethernet
|
||||
* frame header, MAC Addresses etc.
|
||||
*/
|
||||
IF_DEQUEUE(&sc->ifp->if_snd, m);
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
|
||||
/*
|
||||
* Push out the data to the card.
|
||||
@ -544,12 +544,12 @@ snstart_locked(struct ifnet *ifp)
|
||||
|
||||
CSR_WRITE_2(sc, MMU_CMD_REG_W, MMUCR_ENQUEUE);
|
||||
|
||||
sc->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
sc->ifp->if_timer = 1;
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
ifp->if_timer = 1;
|
||||
|
||||
BPF_MTAP(ifp, top);
|
||||
|
||||
sc->ifp->if_opackets++;
|
||||
ifp->if_opackets++;
|
||||
m_freem(top);
|
||||
|
||||
|
||||
@ -598,7 +598,7 @@ snresume(struct ifnet *ifp)
|
||||
/*
|
||||
* Sneak a peek at the next packet
|
||||
*/
|
||||
m = sc->ifp->if_snd.ifq_head;
|
||||
m = ifp->if_snd.ifq_head;
|
||||
if (m == 0) {
|
||||
if_printf(ifp, "snresume() with nothing to send\n");
|
||||
return;
|
||||
@ -618,8 +618,8 @@ snresume(struct ifnet *ifp)
|
||||
*/
|
||||
if (len + pad > ETHER_MAX_LEN - ETHER_CRC_LEN) {
|
||||
if_printf(ifp, "large packet discarded (B)\n");
|
||||
++sc->ifp->if_oerrors;
|
||||
IF_DEQUEUE(&sc->ifp->if_snd, m);
|
||||
++ifp->if_oerrors;
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
@ -654,7 +654,7 @@ snresume(struct ifnet *ifp)
|
||||
packet_no = CSR_READ_1(sc, ALLOC_RESULT_REG_B);
|
||||
if (packet_no & ARR_FAILED) {
|
||||
if_printf(ifp, "Memory allocation failed. Weird.\n");
|
||||
sc->ifp->if_timer = 1;
|
||||
ifp->if_timer = 1;
|
||||
goto try_start;
|
||||
}
|
||||
/*
|
||||
@ -695,7 +695,7 @@ snresume(struct ifnet *ifp)
|
||||
* Get the packet from the kernel. This will include the Ethernet
|
||||
* frame header, MAC Addresses etc.
|
||||
*/
|
||||
IF_DEQUEUE(&sc->ifp->if_snd, m);
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
|
||||
/*
|
||||
* Push out the data to the card.
|
||||
@ -743,7 +743,7 @@ snresume(struct ifnet *ifp)
|
||||
|
||||
BPF_MTAP(ifp, top);
|
||||
|
||||
sc->ifp->if_opackets++;
|
||||
ifp->if_opackets++;
|
||||
m_freem(top);
|
||||
|
||||
try_start:
|
||||
@ -751,15 +751,15 @@ snresume(struct ifnet *ifp)
|
||||
/*
|
||||
* Now pass control to snstart() to queue any additional packets
|
||||
*/
|
||||
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snstart(ifp);
|
||||
|
||||
/*
|
||||
* We've sent something, so we're active. Set a watchdog in case the
|
||||
* TX_EMPTY interrupt is lost.
|
||||
*/
|
||||
sc->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
sc->ifp->if_timer = 1;
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
ifp->if_timer = 1;
|
||||
|
||||
return;
|
||||
}
|
||||
@ -817,7 +817,7 @@ sn_intr(void *arg)
|
||||
SMC_SELECT_BANK(sc, 2);
|
||||
CSR_WRITE_1(sc, INTR_ACK_REG_B, IM_RX_OVRN_INT);
|
||||
|
||||
++sc->ifp->if_ierrors;
|
||||
++ifp->if_ierrors;
|
||||
}
|
||||
/*
|
||||
* Got a packet.
|
||||
@ -845,8 +845,8 @@ sn_intr(void *arg)
|
||||
* Disable this interrupt.
|
||||
*/
|
||||
mask &= ~IM_ALLOC_INT;
|
||||
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snresume(sc->ifp);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snresume(ifp);
|
||||
}
|
||||
/*
|
||||
* TX Completion. Handle a transmit error message. This will only be
|
||||
@ -883,11 +883,11 @@ sn_intr(void *arg)
|
||||
device_printf(sc->dev,
|
||||
"Successful packet caused interrupt\n");
|
||||
} else {
|
||||
++sc->ifp->if_oerrors;
|
||||
++ifp->if_oerrors;
|
||||
}
|
||||
|
||||
if (tx_status & EPHSR_LATCOL)
|
||||
++sc->ifp->if_collisions;
|
||||
++ifp->if_collisions;
|
||||
|
||||
/*
|
||||
* Some of these errors will have disabled transmit.
|
||||
@ -912,8 +912,8 @@ sn_intr(void *arg)
|
||||
/*
|
||||
* Attempt to queue more transmits.
|
||||
*/
|
||||
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snstart_locked(sc->ifp);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snstart_locked(ifp);
|
||||
}
|
||||
/*
|
||||
* Transmit underrun. We use this opportunity to update transmit
|
||||
@ -938,20 +938,20 @@ sn_intr(void *arg)
|
||||
/*
|
||||
* Single collisions
|
||||
*/
|
||||
sc->ifp->if_collisions += card_stats & ECR_COLN_MASK;
|
||||
ifp->if_collisions += card_stats & ECR_COLN_MASK;
|
||||
|
||||
/*
|
||||
* Multiple collisions
|
||||
*/
|
||||
sc->ifp->if_collisions += (card_stats & ECR_MCOLN_MASK) >> 4;
|
||||
ifp->if_collisions += (card_stats & ECR_MCOLN_MASK) >> 4;
|
||||
|
||||
SMC_SELECT_BANK(sc, 2);
|
||||
|
||||
/*
|
||||
* Attempt to enqueue some more stuff.
|
||||
*/
|
||||
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snstart_locked(sc->ifp);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
snstart_locked(ifp);
|
||||
}
|
||||
/*
|
||||
* Some other error. Try to fix it by resetting the adapter.
|
||||
@ -1029,7 +1029,7 @@ snread(struct ifnet *ifp)
|
||||
* Account for receive errors and discard.
|
||||
*/
|
||||
if (status & RS_ERRORS) {
|
||||
++sc->ifp->if_ierrors;
|
||||
++ifp->if_ierrors;
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
@ -1049,7 +1049,7 @@ snread(struct ifnet *ifp)
|
||||
if (m == NULL)
|
||||
goto out;
|
||||
|
||||
m->m_pkthdr.rcvif = sc->ifp;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = packet_length;
|
||||
|
||||
/*
|
||||
@ -1062,7 +1062,7 @@ snread(struct ifnet *ifp)
|
||||
*/
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
m_freem(m);
|
||||
++sc->ifp->if_ierrors;
|
||||
++ifp->if_ierrors;
|
||||
printf("sn: snread() kernel memory allocation problem\n");
|
||||
goto out;
|
||||
}
|
||||
@ -1077,7 +1077,7 @@ snread(struct ifnet *ifp)
|
||||
data += packet_length & ~1;
|
||||
*data = CSR_READ_1(sc, DATA_REG_B);
|
||||
}
|
||||
++sc->ifp->if_ipackets;
|
||||
++ifp->if_ipackets;
|
||||
|
||||
/*
|
||||
* Remove link layer addresses and whatnot.
|
||||
|
Loading…
Reference in New Issue
Block a user