diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7d93bc3cb0db..bb8f5f2adab9 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -930,6 +930,8 @@ static int netxen_nic_close(struct net_device *netdev) | |||
930 | netif_carrier_off(netdev); | 930 | netif_carrier_off(netdev); |
931 | netif_stop_queue(netdev); | 931 | netif_stop_queue(netdev); |
932 | 932 | ||
933 | netxen_nic_disable_int(adapter); | ||
934 | |||
933 | cmd_buff = adapter->cmd_buf_arr; | 935 | cmd_buff = adapter->cmd_buf_arr; |
934 | for (i = 0; i < adapter->max_tx_desc_count; i++) { | 936 | for (i = 0; i < adapter->max_tx_desc_count; i++) { |
935 | buffrag = cmd_buff->frag_array; | 937 | buffrag = cmd_buff->frag_array; |
@@ -1243,28 +1245,12 @@ static int | |||
1243 | netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev) | 1245 | netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev) |
1244 | { | 1246 | { |
1245 | u32 ret = 0; | 1247 | u32 ret = 0; |
1246 | u32 our_int = 0; | ||
1247 | 1248 | ||
1248 | DPRINTK(INFO, "Entered handle ISR\n"); | 1249 | DPRINTK(INFO, "Entered handle ISR\n"); |
1249 | adapter->stats.ints++; | 1250 | adapter->stats.ints++; |
1250 | 1251 | ||
1251 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | ||
1252 | our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1253 | /* not our interrupt */ | ||
1254 | if ((our_int & (0x80 << adapter->portnum)) == 0) | ||
1255 | return ret; | ||
1256 | } | ||
1257 | |||
1258 | netxen_nic_disable_int(adapter); | 1252 | netxen_nic_disable_int(adapter); |
1259 | 1253 | ||
1260 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { | ||
1261 | /* claim interrupt */ | ||
1262 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | ||
1263 | writel(our_int & ~((u32)(0x80 << adapter->portnum)), | ||
1264 | NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1265 | } | ||
1266 | } | ||
1267 | |||
1268 | if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) { | 1254 | if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) { |
1269 | if (netif_rx_schedule_prep(netdev)) { | 1255 | if (netif_rx_schedule_prep(netdev)) { |
1270 | /* | 1256 | /* |
@@ -1298,6 +1284,7 @@ irqreturn_t netxen_intr(int irq, void *data) | |||
1298 | { | 1284 | { |
1299 | struct netxen_adapter *adapter; | 1285 | struct netxen_adapter *adapter; |
1300 | struct net_device *netdev; | 1286 | struct net_device *netdev; |
1287 | u32 our_int = 0; | ||
1301 | 1288 | ||
1302 | if (unlikely(!irq)) { | 1289 | if (unlikely(!irq)) { |
1303 | return IRQ_NONE; /* Not our interrupt */ | 1290 | return IRQ_NONE; /* Not our interrupt */ |
@@ -1305,7 +1292,22 @@ irqreturn_t netxen_intr(int irq, void *data) | |||
1305 | 1292 | ||
1306 | adapter = (struct netxen_adapter *)data; | 1293 | adapter = (struct netxen_adapter *)data; |
1307 | netdev = adapter->netdev; | 1294 | netdev = adapter->netdev; |
1308 | /* process our status queue (for all 4 ports) */ | 1295 | |
1296 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | ||
1297 | our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1298 | /* not our interrupt */ | ||
1299 | if ((our_int & (0x80 << adapter->portnum)) == 0) | ||
1300 | return IRQ_NONE; | ||
1301 | } | ||
1302 | |||
1303 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { | ||
1304 | /* claim interrupt */ | ||
1305 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | ||
1306 | writel(our_int & ~((u32)(0x80 << adapter->portnum)), | ||
1307 | NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1308 | } | ||
1309 | } | ||
1310 | |||
1309 | if (netif_running(netdev)) | 1311 | if (netif_running(netdev)) |
1310 | netxen_handle_int(adapter, netdev); | 1312 | netxen_handle_int(adapter, netdev); |
1311 | 1313 | ||