|
@@ -400,10 +400,13 @@ static irqreturn_t enic_isr_legacy(int irq, void *data)
|
|
return IRQ_NONE; /* not our interrupt */
|
|
return IRQ_NONE; /* not our interrupt */
|
|
}
|
|
}
|
|
|
|
|
|
- if (ENIC_TEST_INTR(pba, ENIC_INTX_NOTIFY))
|
|
|
|
|
|
+ if (ENIC_TEST_INTR(pba, ENIC_INTX_NOTIFY)) {
|
|
|
|
+ vnic_intr_return_all_credits(&enic->intr[ENIC_INTX_NOTIFY]);
|
|
enic_notify_check(enic);
|
|
enic_notify_check(enic);
|
|
|
|
+ }
|
|
|
|
|
|
if (ENIC_TEST_INTR(pba, ENIC_INTX_ERR)) {
|
|
if (ENIC_TEST_INTR(pba, ENIC_INTX_ERR)) {
|
|
|
|
+ vnic_intr_return_all_credits(&enic->intr[ENIC_INTX_ERR]);
|
|
enic_log_q_error(enic);
|
|
enic_log_q_error(enic);
|
|
/* schedule recovery from WQ/RQ error */
|
|
/* schedule recovery from WQ/RQ error */
|
|
schedule_work(&enic->reset);
|
|
schedule_work(&enic->reset);
|
|
@@ -476,6 +479,8 @@ static irqreturn_t enic_isr_msix_err(int irq, void *data)
|
|
{
|
|
{
|
|
struct enic *enic = data;
|
|
struct enic *enic = data;
|
|
|
|
|
|
|
|
+ vnic_intr_return_all_credits(&enic->intr[ENIC_MSIX_ERR]);
|
|
|
|
+
|
|
enic_log_q_error(enic);
|
|
enic_log_q_error(enic);
|
|
|
|
|
|
/* schedule recovery from WQ/RQ error */
|
|
/* schedule recovery from WQ/RQ error */
|
|
@@ -488,8 +493,8 @@ static irqreturn_t enic_isr_msix_notify(int irq, void *data)
|
|
{
|
|
{
|
|
struct enic *enic = data;
|
|
struct enic *enic = data;
|
|
|
|
|
|
|
|
+ vnic_intr_return_all_credits(&enic->intr[ENIC_MSIX_NOTIFY]);
|
|
enic_notify_check(enic);
|
|
enic_notify_check(enic);
|
|
- vnic_intr_unmask(&enic->intr[ENIC_MSIX_NOTIFY]);
|
|
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|
|
@@ -616,7 +621,7 @@ static inline void enic_queue_wq_skb(struct enic *enic,
|
|
vlan_tag_insert, vlan_tag);
|
|
vlan_tag_insert, vlan_tag);
|
|
}
|
|
}
|
|
|
|
|
|
-/* netif_tx_lock held, process context with BHs disabled */
|
|
|
|
|
|
+/* netif_tx_lock held, process context with BHs disabled, or BH */
|
|
static int enic_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
static int enic_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
{
|
|
{
|
|
struct enic *enic = netdev_priv(netdev);
|
|
struct enic *enic = netdev_priv(netdev);
|
|
@@ -1069,7 +1074,7 @@ static int enic_poll(struct napi_struct *napi, int budget)
|
|
lro_flush_all(&enic->lro_mgr);
|
|
lro_flush_all(&enic->lro_mgr);
|
|
|
|
|
|
napi_complete(napi);
|
|
napi_complete(napi);
|
|
- vnic_intr_unmask(&enic->intr[ENIC_MSIX_RQ]);
|
|
|
|
|
|
+ vnic_intr_unmask(&enic->intr[ENIC_INTX_WQ_RQ]);
|
|
}
|
|
}
|
|
|
|
|
|
return rq_work_done;
|
|
return rq_work_done;
|
|
@@ -1095,9 +1100,9 @@ static int enic_poll_msix(struct napi_struct *napi, int budget)
|
|
|
|
|
|
vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf);
|
|
vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf);
|
|
|
|
|
|
- /* Accumulate intr event credits for this polling
|
|
|
|
|
|
+ /* Return intr event credits for this polling
|
|
* cycle. An intr event is the completion of a
|
|
* cycle. An intr event is the completion of a
|
|
- * a WQ or RQ packet.
|
|
|
|
|
|
+ * RQ packet.
|
|
*/
|
|
*/
|
|
|
|
|
|
vnic_intr_return_credits(&enic->intr[ENIC_MSIX_RQ],
|
|
vnic_intr_return_credits(&enic->intr[ENIC_MSIX_RQ],
|