summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgb
diff options
context:
space:
mode:
authornp <np@FreeBSD.org>2010-07-09 00:36:35 +0000
committernp <np@FreeBSD.org>2010-07-09 00:36:35 +0000
commitacfd54a769718ec766faf9b67cca9d6f5f1abe6e (patch)
tree371aea38a0fd650b58b92b23b53cf5425cd2f893 /sys/dev/cxgb
parent1ed3d6a6059a7cc33ae3020b8c3fb81e41508b6b (diff)
downloadFreeBSD-src-acfd54a769718ec766faf9b67cca9d6f5f1abe6e.zip
FreeBSD-src-acfd54a769718ec766faf9b67cca9d6f5f1abe6e.tar.gz
Eliminate ext_intr_task. The "slow" interrupt handler is already
running on the adapter's task queue. Just do what the task does instead of enqueueing it. MFC after: 3 days
Diffstat (limited to 'sys/dev/cxgb')
-rw-r--r--sys/dev/cxgb/common/cxgb_common.h1
-rw-r--r--sys/dev/cxgb/common/cxgb_t3_hw.c4
-rw-r--r--sys/dev/cxgb/cxgb_adapter.h2
-rw-r--r--sys/dev/cxgb/cxgb_main.c53
-rw-r--r--sys/dev/cxgb/cxgb_sge.c12
5 files changed, 14 insertions, 58 deletions
diff --git a/sys/dev/cxgb/common/cxgb_common.h b/sys/dev/cxgb/common/cxgb_common.h
index d523a1a..549d5a9 100644
--- a/sys/dev/cxgb/common/cxgb_common.h
+++ b/sys/dev/cxgb/common/cxgb_common.h
@@ -701,7 +701,6 @@ void t3_port_intr_enable(adapter_t *adapter, int idx);
void t3_port_intr_disable(adapter_t *adapter, int idx);
void t3_port_intr_clear(adapter_t *adapter, int idx);
int t3_slow_intr_handler(adapter_t *adapter);
-int t3_phy_intr_handler(adapter_t *adapter);
void t3_link_changed(adapter_t *adapter, int port_id);
int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc);
diff --git a/sys/dev/cxgb/common/cxgb_t3_hw.c b/sys/dev/cxgb/common/cxgb_t3_hw.c
index 4c28a04..e98b83f 100644
--- a/sys/dev/cxgb/common/cxgb_t3_hw.c
+++ b/sys/dev/cxgb/common/cxgb_t3_hw.c
@@ -2180,7 +2180,7 @@ static int mac_intr_handler(adapter_t *adap, unsigned int idx)
/*
* Interrupt handler for PHY events.
*/
-int t3_phy_intr_handler(adapter_t *adapter)
+static int phy_intr_handler(adapter_t *adapter)
{
u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE);
@@ -2262,7 +2262,7 @@ int t3_slow_intr_handler(adapter_t *adapter)
if (cause & F_XGMAC0_1)
mac_intr_handler(adapter, 1);
if (cause & F_T3DBG)
- t3_os_ext_intr_handler(adapter);
+ phy_intr_handler(adapter);
/* Clear the interrupts just processed. */
t3_write_reg(adapter, A_PL_INT_CAUSE0, cause);
diff --git a/sys/dev/cxgb/cxgb_adapter.h b/sys/dev/cxgb/cxgb_adapter.h
index 48672f4..cffee84 100644
--- a/sys/dev/cxgb/cxgb_adapter.h
+++ b/sys/dev/cxgb/cxgb_adapter.h
@@ -350,7 +350,6 @@ struct adapter {
struct filter_info *filters;
/* Tasks */
- struct task ext_intr_task;
struct task slow_intr_task;
struct task tick_task;
struct taskqueue *tq;
@@ -500,7 +499,6 @@ void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status,
void t3_os_phymod_changed(struct adapter *adap, int port_id);
void t3_sge_err_intr_handler(adapter_t *adapter);
int t3_offload_tx(struct t3cdev *, struct mbuf *);
-void t3_os_ext_intr_handler(adapter_t *adapter);
void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]);
int t3_mgmt_tx(adapter_t *adap, struct mbuf *m);
diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c
index 2f5ac36..e95a58f 100644
--- a/sys/dev/cxgb/cxgb_main.c
+++ b/sys/dev/cxgb/cxgb_main.c
@@ -95,7 +95,6 @@ static void cxgb_build_medialist(struct port_info *);
static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
static int setup_sge_qsets(adapter_t *);
static void cxgb_async_intr(void *);
-static void cxgb_ext_intr_handler(void *, int);
static void cxgb_tick_handler(void *, int);
static void cxgb_tick(void *);
static void setup_rss(adapter_t *sc);
@@ -588,7 +587,6 @@ cxgb_controller_attach(device_t dev)
taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
device_get_nameunit(dev));
- TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
@@ -1265,29 +1263,6 @@ void t3_os_phymod_changed(struct adapter *adap, int port_id)
}
}
-/*
- * Interrupt-context handler for external (PHY) interrupts.
- */
-void
-t3_os_ext_intr_handler(adapter_t *sc)
-{
- if (cxgb_debug)
- printf("t3_os_ext_intr_handler\n");
- /*
- * Schedule a task to handle external interrupts as they may be slow
- * and we use a mutex to protect MDIO registers. We disable PHY
- * interrupts in the meantime and let the task reenable them when
- * it's done.
- */
- if (sc->slow_intr_mask) {
- ADAPTER_LOCK(sc);
- sc->slow_intr_mask &= ~F_T3DBG;
- t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
- taskqueue_enqueue(sc->tq, &sc->ext_intr_task);
- ADAPTER_UNLOCK(sc);
- }
-}
-
void
t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
{
@@ -1937,7 +1912,6 @@ cxgb_uninit_synchronized(struct port_info *pi)
clrbit(&sc->open_device_map, pi->port_id);
t3_port_intr_disable(sc, pi->port_id);
taskqueue_drain(sc->tq, &sc->slow_intr_task);
- taskqueue_drain(sc->tq, &sc->ext_intr_task);
taskqueue_drain(sc->tq, &sc->tick_task);
PORT_LOCK(pi);
@@ -2295,34 +2269,11 @@ cxgb_async_intr(void *data)
{
adapter_t *sc = data;
- if (cxgb_debug)
- device_printf(sc->dev, "cxgb_async_intr\n");
- /*
- * May need to sleep - defer to taskqueue
- */
+ t3_write_reg(sc, A_PL_INT_ENABLE0, 0);
+ (void) t3_read_reg(sc, A_PL_INT_ENABLE0);
taskqueue_enqueue(sc->tq, &sc->slow_intr_task);
}
-static void
-cxgb_ext_intr_handler(void *arg, int count)
-{
- adapter_t *sc = (adapter_t *)arg;
-
- if (cxgb_debug)
- printf("cxgb_ext_intr_handler\n");
-
- t3_phy_intr_handler(sc);
-
- /* Now reenable external interrupts */
- ADAPTER_LOCK(sc);
- if (sc->slow_intr_mask) {
- sc->slow_intr_mask |= F_T3DBG;
- t3_write_reg(sc, A_PL_INT_CAUSE0, F_T3DBG);
- t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
- }
- ADAPTER_UNLOCK(sc);
-}
-
static inline int
link_poll_needed(struct port_info *p)
{
diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c
index 0204b32..4032b4f 100644
--- a/sys/dev/cxgb/cxgb_sge.c
+++ b/sys/dev/cxgb/cxgb_sge.c
@@ -910,6 +910,8 @@ sge_slow_intr_handler(void *arg, int ncount)
adapter_t *sc = arg;
t3_slow_intr_handler(sc);
+ t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
+ (void) t3_read_reg(sc, A_PL_INT_ENABLE0);
}
/**
@@ -3168,8 +3170,11 @@ t3b_intr(void *data)
if (!map)
return;
- if (__predict_false(map & F_ERRINTR))
+ if (__predict_false(map & F_ERRINTR)) {
+ t3_write_reg(adap, A_PL_INT_ENABLE0, 0);
+ (void) t3_read_reg(adap, A_PL_INT_ENABLE0);
taskqueue_enqueue(adap->tq, &adap->slow_intr_task);
+ }
mtx_lock(&q0->lock);
for_each_port(adap, i)
@@ -3197,8 +3202,11 @@ t3_intr_msi(void *data)
if (process_responses_gts(adap, &adap->sge.qs[i].rspq))
new_packets = 1;
mtx_unlock(&q0->lock);
- if (new_packets == 0)
+ if (new_packets == 0) {
+ t3_write_reg(adap, A_PL_INT_ENABLE0, 0);
+ (void) t3_read_reg(adap, A_PL_INT_ENABLE0);
taskqueue_enqueue(adap->tq, &adap->slow_intr_task);
+ }
}
void
OpenPOWER on IntegriCloud