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
This commit is contained in:
parent
29c54b85f9
commit
2c32b50248
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user