diff options
-rw-r--r-- | drivers/net/benet/be.h | 1 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.c | 20 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 2 | ||||
-rw-r--r-- | drivers/net/benet/be_main.c | 5 |
4 files changed, 26 insertions, 2 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 5038c16bfe9b..2734a41a4627 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
@@ -151,6 +151,7 @@ struct be_eq_obj { | |||
151 | struct be_mcc_obj { | 151 | struct be_mcc_obj { |
152 | struct be_queue_info q; | 152 | struct be_queue_info q; |
153 | struct be_queue_info cq; | 153 | struct be_queue_info cq; |
154 | bool rearm_cq; | ||
154 | }; | 155 | }; |
155 | 156 | ||
156 | struct be_drvr_stats { | 157 | struct be_drvr_stats { |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 477f82bc647e..d7546b450505 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -104,10 +104,26 @@ static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter) | |||
104 | return NULL; | 104 | return NULL; |
105 | } | 105 | } |
106 | 106 | ||
107 | void be_async_mcc_enable(struct be_adapter *adapter) | ||
108 | { | ||
109 | spin_lock_bh(&adapter->mcc_cq_lock); | ||
110 | |||
111 | be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, 0); | ||
112 | adapter->mcc_obj.rearm_cq = true; | ||
113 | |||
114 | spin_unlock_bh(&adapter->mcc_cq_lock); | ||
115 | } | ||
116 | |||
117 | void be_async_mcc_disable(struct be_adapter *adapter) | ||
118 | { | ||
119 | adapter->mcc_obj.rearm_cq = false; | ||
120 | } | ||
121 | |||
107 | int be_process_mcc(struct be_adapter *adapter) | 122 | int be_process_mcc(struct be_adapter *adapter) |
108 | { | 123 | { |
109 | struct be_mcc_compl *compl; | 124 | struct be_mcc_compl *compl; |
110 | int num = 0, status = 0; | 125 | int num = 0, status = 0; |
126 | struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; | ||
111 | 127 | ||
112 | spin_lock_bh(&adapter->mcc_cq_lock); | 128 | spin_lock_bh(&adapter->mcc_cq_lock); |
113 | while ((compl = be_mcc_compl_get(adapter))) { | 129 | while ((compl = be_mcc_compl_get(adapter))) { |
@@ -120,14 +136,14 @@ int be_process_mcc(struct be_adapter *adapter) | |||
120 | (struct be_async_event_link_state *) compl); | 136 | (struct be_async_event_link_state *) compl); |
121 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { | 137 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { |
122 | status = be_mcc_compl_process(adapter, compl); | 138 | status = be_mcc_compl_process(adapter, compl); |
123 | atomic_dec(&adapter->mcc_obj.q.used); | 139 | atomic_dec(&mcc_obj->q.used); |
124 | } | 140 | } |
125 | be_mcc_compl_use(compl); | 141 | be_mcc_compl_use(compl); |
126 | num++; | 142 | num++; |
127 | } | 143 | } |
128 | 144 | ||
129 | if (num) | 145 | if (num) |
130 | be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, num); | 146 | be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num); |
131 | 147 | ||
132 | spin_unlock_bh(&adapter->mcc_cq_lock); | 148 | spin_unlock_bh(&adapter->mcc_cq_lock); |
133 | return status; | 149 | return status; |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 7297b5a47657..01501dbae00a 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -937,6 +937,8 @@ extern int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac, | |||
937 | struct be_dma_mem *nonemb_cmd); | 937 | struct be_dma_mem *nonemb_cmd); |
938 | extern int be_cmd_fw_init(struct be_adapter *adapter); | 938 | extern int be_cmd_fw_init(struct be_adapter *adapter); |
939 | extern int be_cmd_fw_clean(struct be_adapter *adapter); | 939 | extern int be_cmd_fw_clean(struct be_adapter *adapter); |
940 | extern void be_async_mcc_enable(struct be_adapter *adapter); | ||
941 | extern void be_async_mcc_disable(struct be_adapter *adapter); | ||
940 | extern int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | 942 | extern int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, |
941 | u32 loopback_type, u32 pkt_size, | 943 | u32 loopback_type, u32 pkt_size, |
942 | u32 num_pkts, u64 pattern); | 944 | u32 num_pkts, u64 pattern); |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 7bf1900df665..43dbe288a5ef 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -1655,6 +1655,9 @@ static int be_open(struct net_device *netdev) | |||
1655 | /* Rx compl queue may be in unarmed state; rearm it */ | 1655 | /* Rx compl queue may be in unarmed state; rearm it */ |
1656 | be_cq_notify(adapter, adapter->rx_obj.cq.id, true, 0); | 1656 | be_cq_notify(adapter, adapter->rx_obj.cq.id, true, 0); |
1657 | 1657 | ||
1658 | /* Now that interrupts are on we can process async mcc */ | ||
1659 | be_async_mcc_enable(adapter); | ||
1660 | |||
1658 | status = be_cmd_link_status_query(adapter, &link_up, &mac_speed, | 1661 | status = be_cmd_link_status_query(adapter, &link_up, &mac_speed, |
1659 | &link_speed); | 1662 | &link_speed); |
1660 | if (status) | 1663 | if (status) |
@@ -1780,6 +1783,8 @@ static int be_close(struct net_device *netdev) | |||
1780 | 1783 | ||
1781 | cancel_delayed_work_sync(&adapter->work); | 1784 | cancel_delayed_work_sync(&adapter->work); |
1782 | 1785 | ||
1786 | be_async_mcc_disable(adapter); | ||
1787 | |||
1783 | netif_stop_queue(netdev); | 1788 | netif_stop_queue(netdev); |
1784 | netif_carrier_off(netdev); | 1789 | netif_carrier_off(netdev); |
1785 | adapter->link_up = false; | 1790 | adapter->link_up = false; |