diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/hxge/hxge_common.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/hxge/hxge_rxdma.c | 39 | ||||
-rw-r--r-- | usr/src/uts/common/io/hxge/hxge_rxdma.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/hxge/hxge_vmac.c | 15 |
4 files changed, 36 insertions, 22 deletions
diff --git a/usr/src/uts/common/io/hxge/hxge_common.h b/usr/src/uts/common/io/hxge/hxge_common.h index a1ced12d22..c09f48f07c 100644 --- a/usr/src/uts/common/io/hxge/hxge_common.h +++ b/usr/src/uts/common/io/hxge/hxge_common.h @@ -56,7 +56,7 @@ extern "C" { #define HXGE_RCR_MAX 65504 /* 2^16 - 32 */ #if defined(__sparc) -#define HXGE_RCR_SZ HXGE_RCR_MAX +#define HXGE_RCR_SZ HXGE_RBR_RBB_DEFAULT * (8192 / 512) #else #define HXGE_RCR_SZ HXGE_RBR_RBB_DEFAULT * (4096 / 256) #endif diff --git a/usr/src/uts/common/io/hxge/hxge_rxdma.c b/usr/src/uts/common/io/hxge/hxge_rxdma.c index 2de507a8e9..3b7899d5e9 100644 --- a/usr/src/uts/common/io/hxge/hxge_rxdma.c +++ b/usr/src/uts/common/io/hxge/hxge_rxdma.c @@ -89,7 +89,8 @@ static hxge_status_t hxge_rxdma_start_channel(p_hxge_t hxgep, uint16_t channel, int n_init_kick); static hxge_status_t hxge_rxdma_stop_channel(p_hxge_t hxgep, uint16_t channel); static mblk_t *hxge_rx_pkts(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, - p_rx_rcr_ring_t *rcr_p, rdc_stat_t cs); + p_rx_rcr_ring_t *rcr_p, rdc_stat_t cs, + uint16_t *nptrs, uint16_t *npkts); static void hxge_receive_packet(p_hxge_t hxgep, p_rx_rcr_ring_t rcr_p, p_rcr_entry_t rcr_desc_rd_head_p, boolean_t *multi_p, mblk_t ** mp, mblk_t ** mp_cont, uint32_t *invalid_rcr_entry); @@ -98,7 +99,8 @@ static hxge_status_t hxge_disable_rxdma_channel(p_hxge_t hxgep, static p_rx_msg_t hxge_allocb(size_t, uint32_t, p_hxge_dma_common_t); static void hxge_freeb(p_rx_msg_t); static void hxge_rx_pkts_vring(p_hxge_t hxgep, uint_t vindex, - p_hxge_ldv_t ldvp, rdc_stat_t cs); + p_hxge_ldv_t ldvp, rdc_stat_t cs, + uint16_t *nptrs, uint16_t *npkts); static hxge_status_t hxge_rx_err_evnts(p_hxge_t hxgep, uint_t index, p_hxge_ldv_t ldvp, rdc_stat_t cs); static hxge_status_t hxge_rxbuf_index_info_init(p_hxge_t hxgep, @@ -1132,6 +1134,7 @@ hxge_rx_intr(caddr_t arg1, caddr_t arg2) uint8_t channel; hpi_handle_t handle; rdc_stat_t cs; + uint16_t nptrs = 0, npkts = 0; uint_t serviced = DDI_INTR_UNCLAIMED; if (ldvp == NULL) { @@ -1165,12 +1168,16 @@ hxge_rx_intr(caddr_t arg1, caddr_t arg2) channel = ldvp->channel; ldgp = ldvp->ldgp; RXDMA_REG_READ64(handle, RDC_STAT, channel, &cs.value); + cs.bits.ptrread = 0; + cs.bits.pktread = 0; + RXDMA_REG_WRITE64(handle, RDC_STAT, channel, cs.value); HXGE_DEBUG_MSG((hxgep, RX_INT_CTL, "==> hxge_rx_intr:channel %d " "cs 0x%016llx rcrto 0x%x rcrthres %x", channel, cs.value, cs.bits.rcr_to, cs.bits.rcr_thres)); - hxge_rx_pkts_vring(hxgep, ldvp->vdma_index, ldvp, cs); + hxge_rx_pkts_vring(hxgep, ldvp->vdma_index, ldvp, cs, + &nptrs, &npkts); serviced = DDI_INTR_CLAIMED; /* error events. */ @@ -1187,10 +1194,12 @@ hxge_intr_exit: */ cs.value &= RDC_STAT_WR1C; cs.bits.mex = 1; - cs.bits.ptrread = 0; - cs.bits.pktread = 0; + cs.bits.ptrread = nptrs; + cs.bits.pktread = (npkts > 1) ? (npkts - 1) : 0; RXDMA_REG_WRITE64(handle, RDC_STAT, channel, cs.value); + hpi_rxdma_rdc_rcr_flush(handle, channel); + /* * Rearm this logical group if this is a single device group. */ @@ -1212,13 +1221,14 @@ hxge_intr_exit: static void hxge_rx_pkts_vring(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, - rdc_stat_t cs) + rdc_stat_t cs, uint16_t *nptrs, uint16_t *npkts) { p_mblk_t mp; p_rx_rcr_ring_t rcrp; HXGE_DEBUG_MSG((hxgep, RX_INT_CTL, "==> hxge_rx_pkts_vring")); - if ((mp = hxge_rx_pkts(hxgep, vindex, ldvp, &rcrp, cs)) == NULL) { + if ((mp = hxge_rx_pkts(hxgep, vindex, ldvp, &rcrp, cs, + nptrs, npkts)) == NULL) { HXGE_DEBUG_MSG((hxgep, RX_INT_CTL, "<== hxge_rx_pkts_vring: no mp")); return; @@ -1263,7 +1273,7 @@ hxge_rx_pkts_vring(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, /*ARGSUSED*/ mblk_t * hxge_rx_pkts(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, - p_rx_rcr_ring_t *rcrp, rdc_stat_t cs) + p_rx_rcr_ring_t *rcrp, rdc_stat_t cs, uint16_t *nptrs, uint16_t *npkts) { hpi_handle_t handle; uint8_t channel; @@ -1282,7 +1292,6 @@ hxge_rx_pkts(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, p_rxdma_mailbox_t mboxp; uint64_t rcr_head_index, rcr_tail_index; uint64_t rcr_tail; - uint64_t value; rdc_rcr_tail_t rcr_tail_reg; p_hxge_rx_ring_stats_t rdc_stats; @@ -1458,16 +1467,8 @@ hxge_rx_pkts(p_hxge_t hxgep, uint_t vindex, p_hxge_ldv_t ldvp, channel, rcr_cfg_b.value); } - cs.bits.pktread = npkt_read; - cs.bits.ptrread = nrcr_read; - value = cs.value; - cs.value &= 0xffffffffULL; - RXDMA_REG_WRITE64(handle, RDC_STAT, channel, cs.value); - - cs.value = value & ~0xffffffffULL; - cs.bits.pktread = 0; - cs.bits.ptrread = 0; - RXDMA_REG_WRITE64(handle, RDC_STAT, channel, cs.value); + *nptrs = nrcr_read; + *npkts = npkt_read; HXGE_DEBUG_MSG((hxgep, RX_INT_CTL, "==> hxge_rx_pkts: EXIT: rcr channel %d " diff --git a/usr/src/uts/common/io/hxge/hxge_rxdma.h b/usr/src/uts/common/io/hxge/hxge_rxdma.h index 0d1808a67c..9a7f1bec66 100644 --- a/usr/src/uts/common/io/hxge/hxge_rxdma.h +++ b/usr/src/uts/common/io/hxge/hxge_rxdma.h @@ -159,8 +159,6 @@ extern "C" { RDC_STAT_RBR_PRE_EMPTY | \ RDC_STAT_RBR_PRE_PAR | \ RDC_STAT_RCR_SHA_PAR | \ - RDC_STAT_RCR_TO | \ - RDC_STAT_RCR_THRES | \ RDC_STAT_RBR_CPL | \ RDC_STAT_PEU_ERR) diff --git a/usr/src/uts/common/io/hxge/hxge_vmac.c b/usr/src/uts/common/io/hxge/hxge_vmac.c index 0e5dfae2ce..d1e19b377f 100644 --- a/usr/src/uts/common/io/hxge/hxge_vmac.c +++ b/usr/src/uts/common/io/hxge/hxge_vmac.c @@ -215,6 +215,12 @@ hxge_rx_vmac_enable(p_hxge_t hxgep) HXGE_DEBUG_MSG((hxgep, MAC_CTL, "==> hxge_rx_vmac_enable")); + /* + * Because of hardware bug document with CR6770577, need + * reprogram max framesize when enabling/disabling RX + * vmac. Max framesize is programed here in + * hxge_rx_vmac_init(). + */ rv = hxge_rx_vmac_init(hxgep); if (rv != HXGE_OK) return (rv); @@ -239,6 +245,15 @@ hxge_rx_vmac_disable(p_hxge_t hxgep) HXGE_DEBUG_MSG((hxgep, MAC_CTL, "==> hxge_rx_vmac_disable")); + /* + * Because of hardware bug document with CR6770577, need + * reprogram max framesize when enabling/disabling RX + * vmac. Max framesize is programed here in + * hxge_rx_vmac_init(). + */ + (void) hpi_vmac_rx_set_framesize(HXGE_DEV_HPI_HANDLE(hxgep), + (uint16_t)0); + rv = hpi_vmac_rx_config(handle, DISABLE, CFG_VMAC_RX_EN, 0); status = (rv == HPI_SUCCESS) ? HXGE_OK : HXGE_ERROR; |