diff options
| author | jj146644 <none@none> | 2007-12-09 19:06:59 -0800 |
|---|---|---|
| committer | jj146644 <none@none> | 2007-12-09 19:06:59 -0800 |
| commit | 02d51d0d625c185ad277d9ad1ddf34b06f78b9b4 (patch) | |
| tree | e0f982a0b77f0ee4a15ef0c6e3bb0e3dad299f38 /usr/src | |
| parent | 2f5224ae5d04383463098ad866ccee0464ee6429 (diff) | |
| download | illumos-gate-02d51d0d625c185ad277d9ad1ddf34b06f78b9b4.tar.gz | |
6493967 nge_chip_blank is empty
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/io/nge/nge.h | 24 | ||||
| -rw-r--r-- | usr/src/uts/common/io/nge/nge_chip.c | 46 | ||||
| -rw-r--r-- | usr/src/uts/common/io/nge/nge_chip.h | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/io/nge/nge_main.c | 37 | ||||
| -rw-r--r-- | usr/src/uts/common/io/nge/nge_ndd.c | 22 | ||||
| -rw-r--r-- | usr/src/uts/common/io/nge/nge_rx.c | 11 |
6 files changed, 83 insertions, 63 deletions
diff --git a/usr/src/uts/common/io/nge/nge.h b/usr/src/uts/common/io/nge/nge.h index 8681513948..7c758ab3df 100644 --- a/usr/src/uts/common/io/nge/nge.h +++ b/usr/src/uts/common/io/nge/nge.h @@ -159,7 +159,7 @@ extern int secpolicy_net_config(const cred_t *, boolean_t); #define NGE_MAX_MTU 9000 #define NGE_MAX_SDU 9018 -#define NGE_DESC_MIN 0x100 +#define NGE_DESC_MIN 0x200 #define NGE_STD_BUFSZ 1792 #define NGE_JB2500_BUFSZ (3*1024) @@ -192,9 +192,10 @@ extern int secpolicy_net_config(const cred_t *, boolean_t); #define NGE_MAX_COOKIES 3 #define NGE_MAX_DMA_HDR (4*1024) -/* Used by interrupt blank */ -#define NGE_TICKS_CNT 128 -#define NGE_RX_PKT_CNT 8 +/* Used by interrupt moderation */ +#define NGE_POLL_QUIET_TIME 100 +#define NGE_POLL_BUSY_TIME 2 +#define NGE_TX_N_INTR 128 /* * NGE-specific ioctls ... @@ -315,6 +316,11 @@ enum { PARAM_TXBCOPY_THRESHOLD, PARAM_RXBCOPY_THRESHOLD, PARAM_RECV_MAX_PACKET, + PARAM_POLL_QUIET_TIME, + PARAM_POLL_BUSY_TIME, + PARAM_RX_INTR_HWATER, + PARAM_RX_INTR_LWATER, + PARAM_TX_N_INTR, PARAM_COUNT }; @@ -818,8 +824,11 @@ typedef struct nge { uint32_t intr_masks; boolean_t poll; boolean_t ch_intr_mode; + boolean_t intr_moderation; uint32_t recv_count; - uint32_t poll_time; + uint32_t quiet_time; + uint32_t busy_time; + uint32_t stint_count; uint32_t sw_intr_intv; nge_mac_addr_t cur_uni_addr; uint32_t rx_datahwm; @@ -899,6 +908,11 @@ extern const nge_ksindex_t nge_statistics[]; #define param_txbcopy_threshold nd_params[PARAM_TXBCOPY_THRESHOLD].ndp_val #define param_rxbcopy_threshold nd_params[PARAM_RXBCOPY_THRESHOLD].ndp_val #define param_recv_max_packet nd_params[PARAM_RECV_MAX_PACKET].ndp_val +#define param_poll_quiet_time nd_params[PARAM_POLL_QUIET_TIME].ndp_val +#define param_poll_busy_time nd_params[PARAM_POLL_BUSY_TIME].ndp_val +#define param_rx_intr_hwater nd_params[PARAM_RX_INTR_HWATER].ndp_val +#define param_rx_intr_lwater nd_params[PARAM_RX_INTR_LWATER].ndp_val +#define param_tx_n_intr nd_params[PARAM_TX_N_INTR].ndp_val /* * Sync a DMA area described by a dma_area_t diff --git a/usr/src/uts/common/io/nge/nge_chip.c b/usr/src/uts/common/io/nge/nge_chip.c index 5bba68a495..71b543f383 100644 --- a/usr/src/uts/common/io/nge/nge_chip.c +++ b/usr/src/uts/common/io/nge/nge_chip.c @@ -1722,26 +1722,39 @@ nge_intr_handle(nge_t *ngep, nge_intr_src *pintr_src) nge_receive(ngep); btx = (pintr_src->int_bits.teint | pintr_src->int_bits.tcint) > 0 ? B_TRUE : B_FALSE; + if (pintr_src->int_bits.stint && ngep->poll) + ngep->stint_count ++; + btx |= (ngep->poll && (ngep->stint_count % ngep->param_tx_n_intr == 0)); if (btx) nge_tx_recycle(ngep, B_TRUE); if (pintr_src->int_bits.teint) ngep->statistics.sw_statistics.tx_stop_err++; - if (pintr_src->int_bits.stint) { - if ((ngep->poll) && - (ngep->recv_count < INTR_HWATER)) { - ngep->poll_time++; - } - if ((ngep->recv_count > POLL_LWATER) && - (!ngep->poll)) { - ngep->poll = B_TRUE; - } - - if (ngep->poll_time == 10) { - ngep->poll = B_FALSE; - ngep->poll_time = 0; + if (ngep->intr_moderation && brx) { + if (ngep->poll) { + if (ngep->recv_count < ngep->param_rx_intr_hwater) { + ngep->quiet_time++; + if (ngep->quiet_time == + ngep->param_poll_quiet_time) { + ngep->poll = B_FALSE; + ngep->quiet_time = 0; + ngep->stint_count = 0; + nge_tx_recycle(ngep, B_TRUE); + } + } else + ngep->quiet_time = 0; + } else { + if (ngep->recv_count > ngep->param_rx_intr_lwater) { + ngep->busy_time++; + if (ngep->busy_time == + ngep->param_poll_busy_time) { + ngep->poll = B_TRUE; + ngep->busy_time = 0; + } + } else + ngep->busy_time = 0; } - ngep->recv_count = 0; } + ngep->recv_count = 0; if (pintr_src->int_bits.feint) nge_chip_err(ngep); /* link interrupt, check the link state */ @@ -1786,8 +1799,11 @@ nge_chip_intr(caddr_t arg1, caddr_t arg2) nge_intr_handle(ngep, &intr_src); if (ngep->poll && !ngep->ch_intr_mode) { intr_mask.mask_val = nge_reg_get32(ngep, NGE_INTR_MASK); - intr_mask.mask_val &= ~(ngep->intr_masks); intr_mask.mask_bits.stint = NGE_SET; + intr_mask.mask_bits.rcint = NGE_CLEAR; + intr_mask.mask_bits.reint = NGE_CLEAR; + intr_mask.mask_bits.tcint = NGE_CLEAR; + intr_mask.mask_bits.teint = NGE_CLEAR; nge_reg_put32(ngep, NGE_INTR_MASK, intr_mask.mask_val); ngep->ch_intr_mode = B_TRUE; } else if ((ngep->ch_intr_mode) && (!ngep->poll)) { diff --git a/usr/src/uts/common/io/nge/nge_chip.h b/usr/src/uts/common/io/nge/nge_chip.h index 7d5cec72bf..2b866bb3ab 100644 --- a/usr/src/uts/common/io/nge/nge_chip.h +++ b/usr/src/uts/common/io/nge/nge_chip.h @@ -170,9 +170,9 @@ typedef union _nge_swtr_cntl { * Software Timer Interval */ #define NGE_SWTR_ITC 0x00c -#define POLL_LWATER 0x10 -#define INTR_HWATER 0x5 -#define SWTR_ITC 0x10 + +/* Default timer interval, 97 would mean 1 ms */ +#define SWTR_ITC 0x8 typedef union _nge_itc { uint32_t itc_val; struct { diff --git a/usr/src/uts/common/io/nge/nge_main.c b/usr/src/uts/common/io/nge/nge_main.c index d4053c74ad..673989536f 100644 --- a/usr/src/uts/common/io/nge/nge_main.c +++ b/usr/src/uts/common/io/nge/nge_main.c @@ -158,6 +158,7 @@ static char nge_ident[] = "nVidia 1Gb Ethernet %I%"; static char clsize_propname[] = "cache-line-size"; static char latency_propname[] = "latency-timer"; static char debug_propname[] = "nge-debug-flags"; +static char intr_moderation[] = "intr-moderation"; static char rx_data_hw[] = "rx-data-hw"; static char rx_prd_lw[] = "rx-prd-lw"; static char rx_prd_hw[] = "rx-prd-hw"; @@ -176,7 +177,7 @@ static void nge_m_resources(void *); static void nge_m_ioctl(void *, queue_t *, mblk_t *); static boolean_t nge_m_getcapab(void *, mac_capab_t, void *); -#define NGE_M_CALLBACK_FLAGS (MC_RESOURCES | MC_IOCTL | MC_GETCAPAB) +#define NGE_M_CALLBACK_FLAGS (MC_IOCTL | MC_GETCAPAB) static mac_callbacks_t nge_m_callbacks = { NGE_M_CALLBACK_FLAGS, @@ -187,7 +188,7 @@ static mac_callbacks_t nge_m_callbacks = { nge_m_multicst, nge_m_unicst, nge_m_tx, - nge_m_resources, + NULL, nge_m_ioctl, nge_m_getcapab }; @@ -953,6 +954,8 @@ nge_get_props(nge_t *ngep) infop->latency = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, DDI_PROP_DONTPASS, latency_propname, 64); + ngep->intr_moderation = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, + DDI_PROP_DONTPASS, intr_moderation, NGE_SET); ngep->rx_datahwm = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, DDI_PROP_DONTPASS, rx_data_hw, 0x20); ngep->rx_prdlwm = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, @@ -1458,36 +1461,6 @@ nge_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) } } -static void -nge_chip_blank(void *arg, time_t ticks, uint_t count) -{ - _NOTE(ARGUNUSED(arg, ticks, count)); -} - -static void -nge_m_resources(void *arg) -{ - nge_t *ngep = arg; - recv_ring_t *rrp; - mac_rx_fifo_t mrf; - - mutex_enter(ngep->genlock); - - /* - * Register Rx rings as resources and save mac - * resource id for future reference - */ - mrf.mrf_type = MAC_RX_FIFO; - mrf.mrf_blank = nge_chip_blank; - mrf.mrf_arg = (void *)ngep; - mrf.mrf_normal_blank_time = NGE_TICKS_CNT; - mrf.mrf_normal_pkt_count = NGE_RX_PKT_CNT; - - rrp = ngep->recv; - rrp->handle = mac_resource_add(ngep->mh, (mac_resource_t *)&mrf); - mutex_exit(ngep->genlock); -} - /* ARGSUSED */ static boolean_t nge_m_getcapab(void *arg, mac_capab_t cap, void *cap_data) diff --git a/usr/src/uts/common/io/nge/nge_ndd.c b/usr/src/uts/common/io/nge/nge_ndd.c index 1b8a7e69ff..8ee963c731 100644 --- a/usr/src/uts/common/io/nge/nge_ndd.c +++ b/usr/src/uts/common/io/nge/nge_ndd.c @@ -120,8 +120,28 @@ static const nd_param_t nd_template[] = { "+rx_bcopy_threshold" }, /* Max packet received per interrupt */ -{ PARAM_RECV_MAX_PACKET, 0, NGE_RECV_SLOTS_DESC_1024, 32, +{ PARAM_RECV_MAX_PACKET, 0, NGE_RECV_SLOTS_DESC_1024, 128, "+recv_max_packet" }, +/* Quiet time switch from polling interrupt to per packet interrupt */ +{ PARAM_POLL_QUIET_TIME, 0, 10000, NGE_POLL_QUIET_TIME, +"+poll_quiet_time" }, + +/* Busy time switch from per packet interrupt to polling interrupt */ +{ PARAM_POLL_BUSY_TIME, 0, 10000, NGE_POLL_BUSY_TIME, +"+poll_busy_time" }, + +/* Packets received to trigger the poll_quiet_time counter */ +{ PARAM_RX_INTR_HWATER, 0, PARAM_RECV_MAX_PACKET, 1, +"+rx_intr_hwater" }, + +/* Packets received to trigger the poll_busy_time counter */ +{ PARAM_RX_INTR_LWATER, 0, PARAM_RECV_MAX_PACKET, 8, +"+rx_intr_lwater" }, + +/* Per N tx packets to do tx recycle in poll mode */ +{ PARAM_TX_N_INTR, 1, 10000, NGE_TX_N_INTR, +"+tx_n_intr" }, + /* Terminator */ { PARAM_COUNT, 0, 0, 0, NULL } }; diff --git a/usr/src/uts/common/io/nge/nge_rx.c b/usr/src/uts/common/io/nge/nge_rx.c index 7667b95919..1f9a235940 100644 --- a/usr/src/uts/common/io/nge/nge_rx.c +++ b/usr/src/uts/common/io/nge/nge_rx.c @@ -301,7 +301,6 @@ nge_recv_ring(nge_t *ngep) uint32_t stflag; uint32_t flag_err; uint32_t sum_flags; - uint32_t count; size_t len; uint64_t end_index; uint64_t sync_start; @@ -316,7 +315,6 @@ nge_recv_ring(nge_t *ngep) mp = NULL; head = NULL; - count = 0; tail = &head; rrp = ngep->recv; brp = ngep->buff; @@ -369,7 +367,6 @@ nge_recv_ring(nge_t *ngep) srbdp->bufp->alength); srbdp->flags = CONTROLER_OWN; } - count++; if (mp != NULL) { if (!(flag_err & (RX_SUM_NO | RX_SUM_ERR))) { (void) hcksum_assoc(mp, NULL, NULL, @@ -380,15 +377,15 @@ nge_recv_ring(nge_t *ngep) mp = NULL; } rrp->prod_index = NEXT(end_index, rrp->desc.nslots); - if (count > ngep->param_recv_max_packet) + if (ngep->recv_count > ngep->param_recv_max_packet) break; } /* Sync the descriptors for device */ - if (sync_start + count <= ngep->rx_desc) { + if (sync_start + ngep->recv_count <= ngep->rx_desc) { (void) ddi_dma_sync(rrp->desc.dma_hdl, sync_start * ngep->desc_attr.rxd_size, - count * ngep->desc_attr.rxd_size, + ngep->recv_count * ngep->desc_attr.rxd_size, DDI_DMA_SYNC_FORDEV); } else { (void) ddi_dma_sync(rrp->desc.dma_hdl, @@ -397,7 +394,7 @@ nge_recv_ring(nge_t *ngep) DDI_DMA_SYNC_FORDEV); (void) ddi_dma_sync(rrp->desc.dma_hdl, 0, - (count + sync_start - ngep->rx_desc) * + (ngep->recv_count + sync_start - ngep->rx_desc) * ngep->desc_attr.rxd_size, DDI_DMA_SYNC_FORDEV); } |
