diff options
author | jchandra <jchandra@FreeBSD.org> | 2010-09-09 02:52:44 +0000 |
---|---|---|
committer | jchandra <jchandra@FreeBSD.org> | 2010-09-09 02:52:44 +0000 |
commit | 2523c85b33109d8f0d658c44ec1a46cd5b71154f (patch) | |
tree | d6142e6410274468a1f0633f25c23e1e6e802941 /sys/mips/rmi | |
parent | efc81f03930e30f1c43c23ed7e099131b85b6d20 (diff) | |
download | FreeBSD-src-2523c85b33109d8f0d658c44ec1a46cd5b71154f.zip FreeBSD-src-2523c85b33109d8f0d658c44ec1a46cd5b71154f.tar.gz |
Minor clean up for nlge - nlna_submit_rx_free_desc() can use the same desc
every time. Also merge couple of one-line functions into their caller.
Diffstat (limited to 'sys/mips/rmi')
-rw-r--r-- | sys/mips/rmi/dev/nlge/if_nlge.c | 75 |
1 files changed, 19 insertions, 56 deletions
diff --git a/sys/mips/rmi/dev/nlge/if_nlge.c b/sys/mips/rmi/dev/nlge/if_nlge.c index 8cb97bf..82092a9 100644 --- a/sys/mips/rmi/dev/nlge/if_nlge.c +++ b/sys/mips/rmi/dev/nlge/if_nlge.c @@ -148,7 +148,6 @@ static void nlge_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr); /* Other internal/helper functions */ static void *get_buf(void); -static struct mbuf *get_mbuf(void); static void nlna_add_to_port_set(struct nlge_port_set *pset, struct nlge_softc *sc); @@ -170,8 +169,6 @@ static void nlna_reset_ports(struct nlna_softc *sc, struct xlr_gmac_block_t *blk); static struct nlna_softc *nlna_sc_init(device_t dev, struct xlr_gmac_block_t *blk); -static __inline__ int nlna_send_free_desc(struct nlna_softc *nlna, - vm_paddr_t addr); static void nlna_setup_intr(struct nlna_softc *sc); static void nlna_smp_update_pde(void *dummy __unused); static void nlna_submit_rx_free_desc(struct nlna_softc *sc, @@ -206,7 +203,6 @@ static int prepare_fmn_message(struct nlge_softc *sc, struct msgrng_msg *msg, uint32_t *n_entries, struct mbuf *m_head, uint64_t fr_stid, struct nlge_tx_desc **tx_desc); -static void release_mbuf(uint64_t phy_addr); static void release_tx_desc(vm_paddr_t phy_addr); static int send_fmn_msg_tx(struct nlge_softc *, struct msgrng_msg *, uint32_t n_entries); @@ -680,7 +676,7 @@ nlge_msgring_handler(int bucket, int size, int code, int stid, if (is_p2p) { release_tx_desc(phys_addr); } else { - release_mbuf(phys_addr); + m_freem((struct mbuf *)(uintptr_t)phys_addr); } ifp = sc->nlge_if; @@ -1009,39 +1005,23 @@ nlna_is_last_active_na(struct nlna_softc *sc) return (id == 2 || xlr_board_info.gmac_block[id + 1].enabled == 0); } -static __inline__ int -nlna_send_free_desc(struct nlna_softc *sc, vm_paddr_t addr) -{ - struct msgrng_msg msg; - uint32_t msgrng_flags; - int i = 0, stid, code, ret; - - stid = sc->rfrbucket; - memset(&msg, 0, sizeof(msg)); - msg.msg0 = (uint64_t) addr & 0xffffffffe0ULL; - - code = (sc->na_type == XLR_XGMAC) ? MSGRNG_CODE_XGMAC : MSGRNG_CODE_MAC; - do { - msgrng_flags = msgrng_access_enable(); - ret = message_send_retry(1, code, stid, &msg); - msgrng_restore(msgrng_flags); - KASSERT(i++ < 100000, ("Too many credit fails\n")); - } while (ret != 0); - return (0); -} - static void nlna_submit_rx_free_desc(struct nlna_softc *sc, uint32_t n_desc) { + struct msgrng_msg msg; void *ptr; - int i; - int ret; + uint32_t msgrng_flags; + int i, n, stid, ret, code; if (n_desc > 1) { PDEBUG("Sending %d free-in descriptors to station=%d\n", n_desc, sc->rfrbucket); } + stid = sc->rfrbucket; + code = (sc->na_type == XLR_XGMAC) ? MSGRNG_CODE_XGMAC : MSGRNG_CODE_MAC; + memset(&msg, 0, sizeof(msg)); + for (i = 0; i < n_desc; i++) { ptr = get_buf(); if (!ptr) { @@ -1051,10 +1031,14 @@ nlna_submit_rx_free_desc(struct nlna_softc *sc, uint32_t n_desc) } /* Send the free Rx desc to the MAC */ - ret = nlna_send_free_desc(sc, vtophys(ptr)); - if (ret != 0) /* no point trying other descriptors after - a failure. */ - break; + msg.msg0 = vtophys(ptr) & 0xffffffffe0ULL; + n = 0; + do { + msgrng_flags = msgrng_access_enable(); + ret = message_send_retry(1, code, stid, &msg); + msgrng_restore(msgrng_flags); + KASSERT(n++ < 100000, ("Too many credit fails\n")); + } while (ret != 0); } } @@ -1982,15 +1966,6 @@ send_fmn_msg_tx(struct nlge_softc *sc, struct msgrng_msg *msg, } static void -release_mbuf(uint64_t phy_addr) -{ - struct mbuf *m; - - m = (struct mbuf *)((uint32_t) phy_addr); - m_freem(m); -} - -static void release_tx_desc(vm_paddr_t paddr) { struct nlge_tx_desc *tx_desc; @@ -2008,17 +1983,6 @@ release_tx_desc(vm_paddr_t paddr) uma_zfree(nl_tx_desc_zone, tx_desc); } -static struct mbuf * -get_mbuf(void) -{ - struct mbuf *m_new; - - if ((m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL) - return NULL; - m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; - return (m_new); -} - static void * get_buf(void) { @@ -2026,10 +1990,9 @@ get_buf(void) vm_paddr_t temp1, temp2; unsigned int *md; - m_new = get_mbuf(); - if (m_new == NULL) - return m_new; - + if ((m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL) + return NULL; + m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; m_adj(m_new, XLR_CACHELINE_SIZE - ((unsigned int)m_new->m_data & 0x1f)); md = (unsigned int *)m_new->m_data; md[0] = (unsigned int)m_new; /* Back Ptr */ |