Commit e94bd23f67c87011f012f26ca0af3fcf6878eeac

Authored by Auke Kok
Committed by Jeff Garzik
1 parent fb136c070b

e1000: Fix msi enable leak on error, don't print error message, cleanup

pci_enable_msi failure is a normal event so we should not print any error.
Going over the code I spotted a missing pci_disable_msi() leak when irq
allocation fails. The whole code also needed a cleanup, so I combined the
two different calls to pci_request_irq into a single call making this
look a lot better. All #ifdef CONFIG_PCI_MSI's have been removed.

Compile tested with both CONFIG_PCI_MSI enabled and disabled.

Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

Showing 2 changed files with 15 additions and 28 deletions Side-by-side Diff

drivers/net/e1000/e1000.h
... ... @@ -333,11 +333,9 @@
333 333 struct e1000_tx_ring test_tx_ring;
334 334 struct e1000_rx_ring test_rx_ring;
335 335  
336   -
337 336 int msg_enable;
338   -#ifdef CONFIG_PCI_MSI
339 337 boolean_t have_msi;
340   -#endif
  338 +
341 339 /* to not mess up cache alignment, always add to the bottom */
342 340 boolean_t tso_force;
343 341 boolean_t smart_power_down; /* phy smart power down */
drivers/net/e1000/e1000_main.c
... ... @@ -158,9 +158,7 @@
158 158 static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
159 159 static int e1000_set_mac(struct net_device *netdev, void *p);
160 160 static irqreturn_t e1000_intr(int irq, void *data);
161   -#ifdef CONFIG_PCI_MSI
162 161 static irqreturn_t e1000_intr_msi(int irq, void *data);
163   -#endif
164 162 static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter,
165 163 struct e1000_tx_ring *tx_ring);
166 164 #ifdef CONFIG_E1000_NAPI
167 165  
168 166  
169 167  
170 168  
... ... @@ -300,31 +298,26 @@
300 298 static int e1000_request_irq(struct e1000_adapter *adapter)
301 299 {
302 300 struct net_device *netdev = adapter->netdev;
303   - int flags, err = 0;
  301 + void (*handler) = &e1000_intr;
  302 + int irq_flags = IRQF_SHARED;
  303 + int err;
304 304  
305   - flags = IRQF_SHARED;
306   -#ifdef CONFIG_PCI_MSI
307 305 if (adapter->hw.mac_type >= e1000_82571) {
308   - adapter->have_msi = TRUE;
309   - if ((err = pci_enable_msi(adapter->pdev))) {
310   - DPRINTK(PROBE, ERR,
311   - "Unable to allocate MSI interrupt Error: %d\n", err);
312   - adapter->have_msi = FALSE;
  306 + adapter->have_msi = !pci_enable_msi(adapter->pdev);
  307 + if (adapter->have_msi) {
  308 + handler = &e1000_intr_msi;
  309 + irq_flags = 0;
313 310 }
314 311 }
315   - if (adapter->have_msi) {
316   - flags &= ~IRQF_SHARED;
317   - err = request_irq(adapter->pdev->irq, &e1000_intr_msi, flags,
318   - netdev->name, netdev);
319   - if (err)
320   - DPRINTK(PROBE, ERR,
321   - "Unable to allocate interrupt Error: %d\n", err);
322   - } else
323   -#endif
324   - if ((err = request_irq(adapter->pdev->irq, &e1000_intr, flags,
325   - netdev->name, netdev)))
  312 +
  313 + err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,
  314 + netdev);
  315 + if (err) {
  316 + if (adapter->have_msi)
  317 + pci_disable_msi(adapter->pdev);
326 318 DPRINTK(PROBE, ERR,
327 319 "Unable to allocate interrupt Error: %d\n", err);
  320 + }
328 321  
329 322 return err;
330 323 }
331 324  
... ... @@ -335,10 +328,8 @@
335 328  
336 329 free_irq(adapter->pdev->irq, netdev);
337 330  
338   -#ifdef CONFIG_PCI_MSI
339 331 if (adapter->have_msi)
340 332 pci_disable_msi(adapter->pdev);
341   -#endif
342 333 }
343 334  
344 335 /**
... ... @@ -3744,7 +3735,6 @@
3744 3735  
3745 3736 spin_unlock_irqrestore(&adapter->stats_lock, flags);
3746 3737 }
3747   -#ifdef CONFIG_PCI_MSI
3748 3738  
3749 3739 /**
3750 3740 * e1000_intr_msi - Interrupt Handler
... ... @@ -3810,7 +3800,6 @@
3810 3800  
3811 3801 return IRQ_HANDLED;
3812 3802 }
3813   -#endif
3814 3803  
3815 3804 /**
3816 3805 * e1000_intr - Interrupt Handler