diff options
Diffstat (limited to 'sys/mips/rmi/dev/xlr/rge.c')
-rw-r--r-- | sys/mips/rmi/dev/xlr/rge.c | 60 |
1 files changed, 19 insertions, 41 deletions
diff --git a/sys/mips/rmi/dev/xlr/rge.c b/sys/mips/rmi/dev/xlr/rge.c index b021cee..924031a 100644 --- a/sys/mips/rmi/dev/xlr/rge.c +++ b/sys/mips/rmi/dev/xlr/rge.c @@ -711,21 +711,27 @@ static __inline__ int xlr_mac_send_fr(struct driver_data *priv, vm_paddr_t addr, int len) { - int stid = priv->rfrbucket; struct msgrng_msg msg; - int vcpu = xlr_cpu_id(); + int stid = priv->rfrbucket; + int i = 0, code, ret; + uint32_t msgrng_flags; mac_make_desc_rfr(&msg, addr); /* Send the packet to MAC */ dbg_msg("mac_%d: Sending free packet %lx to stid %d\n", priv->instance, (u_long)addr, stid); - if (priv->type == XLR_XGMAC) { - while (message_send(1, MSGRNG_CODE_XGMAC, stid, &msg)); - } else { - while (message_send(1, MSGRNG_CODE_MAC, stid, &msg)); - xlr_rge_repl_done[vcpu]++; - } + if (priv->type == XLR_XGMAC) + code = MSGRNG_CODE_XGMAC; /* WHY? */ + else + code = 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; } @@ -1439,37 +1445,16 @@ rmi_xlr_mac_set_duplex(struct driver_data *s, #define MAC_TX_PASS 0 #define MAC_TX_RETRY 1 -static __inline__ void -message_send_block(unsigned int size, unsigned int code, - unsigned int stid, struct msgrng_msg *msg) -{ - unsigned int dest = 0; - unsigned long long status = 0; - - msgrng_load_tx_msg0(msg->msg0); - msgrng_load_tx_msg1(msg->msg1); - msgrng_load_tx_msg2(msg->msg2); - msgrng_load_tx_msg3(msg->msg3); - - dest = ((size - 1) << 16) | (code << 8) | (stid); - - do { - msgrng_send(dest); - status = msgrng_read_status(); - } while (status & 0x6); - -} - int xlr_dev_queue_xmit_hack = 0; static int mac_xmit(struct mbuf *m, struct rge_softc *sc, struct driver_data *priv, int len, struct p2d_tx_desc *tx_desc) { - struct msgrng_msg msg; + struct msgrng_msg msg = {0,0,0,0}; int stid = priv->txbucket; uint32_t tx_cycles = 0; - unsigned long mflags = 0; + uint32_t mflags; int vcpu = xlr_cpu_id(); int rv; @@ -1479,17 +1464,17 @@ mac_xmit(struct mbuf *m, struct rge_softc *sc, return MAC_TX_FAIL; else { - msgrng_access_enable(mflags); + mflags = msgrng_access_enable(); if ((rv = message_send_retry(1, MSGRNG_CODE_MAC, stid, &msg)) != 0) { msg_snd_failed++; - msgrng_access_disable(mflags); + msgrng_restore(mflags); release_tx_desc(&msg, 0); xlr_rge_msg_snd_failed[vcpu]++; dbg_msg("Failed packet to cpu %d, rv = %d, stid %d, msg0=%jx\n", vcpu, rv, stid, (uintmax_t)msg.msg0); return MAC_TX_FAIL; } - msgrng_access_disable(mflags); + msgrng_restore(mflags); port_inc_counter(priv->instance, PORT_TX); } @@ -1559,7 +1544,6 @@ mac_frin_replenish(void *args /* ignored */ ) for (i = 0; i < XLR_MAX_MACS; i++) { /* int offset = 0; */ - unsigned long msgrng_flags; void *m; uint32_t cycles; struct rge_softc *sc; @@ -1592,14 +1576,11 @@ mac_frin_replenish(void *args /* ignored */ ) } } xlr_inc_counter(REPLENISH_FRIN); - msgrng_access_enable(msgrng_flags); if (xlr_mac_send_fr(priv, vtophys(m), MAX_FRAME_SIZE)) { free_buf(vtophys(m)); printf("[%s]: rx free message_send failed!\n", __FUNCTION__); - msgrng_access_disable(msgrng_flags); break; } - msgrng_access_disable(msgrng_flags); xlr_set_counter(REPLENISH_CYCLES, (read_c0_count() - cycles)); atomic_subtract_int((&priv->frin_to_be_sent[cpu]), 1); @@ -2427,7 +2408,6 @@ static int rmi_xlr_mac_fill_rxfr(struct rge_softc *sc) { struct driver_data *priv = &(sc->priv); - unsigned long msgrng_flags; int i; int ret = 0; void *ptr; @@ -2445,9 +2425,7 @@ rmi_xlr_mac_fill_rxfr(struct rge_softc *sc) break; } /* Send the free Rx desc to the MAC */ - msgrng_access_enable(msgrng_flags); xlr_mac_send_fr(priv, vtophys(ptr), MAX_FRAME_SIZE); - msgrng_access_disable(msgrng_flags); } return ret; |