summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorjj146644 <none@none>2007-12-09 19:06:59 -0800
committerjj146644 <none@none>2007-12-09 19:06:59 -0800
commit02d51d0d625c185ad277d9ad1ddf34b06f78b9b4 (patch)
treee0f982a0b77f0ee4a15ef0c6e3bb0e3dad299f38 /usr/src
parent2f5224ae5d04383463098ad866ccee0464ee6429 (diff)
downloadillumos-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.h24
-rw-r--r--usr/src/uts/common/io/nge/nge_chip.c46
-rw-r--r--usr/src/uts/common/io/nge/nge_chip.h6
-rw-r--r--usr/src/uts/common/io/nge/nge_main.c37
-rw-r--r--usr/src/uts/common/io/nge/nge_ndd.c22
-rw-r--r--usr/src/uts/common/io/nge/nge_rx.c11
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);
}