diff options
author | Jesse Brandeburg <jesse.brandeburg@intel.com> | 2009-03-13 18:14:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-14 15:41:12 -0400 |
commit | 9891ca7cdc42354ec48c0f76256fdcc9808ffc7e (patch) | |
tree | 9c1ca0824399da284c1e0bf31dce42145f7d2877 /drivers/net/ixgbe/ixgbe_main.c | |
parent | 2a41ff81162c7c406bb2a04e425a7ed51c85d89d (diff) |
ixgbe: Add a few safety nets for register writes and descriptor cleanups
There are possible times that a driver may fail to completely initialize,
due to a buggy platform or a buggy kernel. In those cases, we'd rather
fail gracefully instead of a panic. Add a few safety checks to some
critical paths to try and prevent a panic in these corner-case situations.
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 39781c84dafc..892195f2ad9b 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -2458,8 +2458,10 @@ static void ixgbe_clean_rx_ring(struct ixgbe_adapter *adapter, | |||
2458 | rx_ring->next_to_clean = 0; | 2458 | rx_ring->next_to_clean = 0; |
2459 | rx_ring->next_to_use = 0; | 2459 | rx_ring->next_to_use = 0; |
2460 | 2460 | ||
2461 | writel(0, adapter->hw.hw_addr + rx_ring->head); | 2461 | if (rx_ring->head) |
2462 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | 2462 | writel(0, adapter->hw.hw_addr + rx_ring->head); |
2463 | if (rx_ring->tail) | ||
2464 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | ||
2463 | } | 2465 | } |
2464 | 2466 | ||
2465 | /** | 2467 | /** |
@@ -2490,8 +2492,10 @@ static void ixgbe_clean_tx_ring(struct ixgbe_adapter *adapter, | |||
2490 | tx_ring->next_to_use = 0; | 2492 | tx_ring->next_to_use = 0; |
2491 | tx_ring->next_to_clean = 0; | 2493 | tx_ring->next_to_clean = 0; |
2492 | 2494 | ||
2493 | writel(0, adapter->hw.hw_addr + tx_ring->head); | 2495 | if (tx_ring->head) |
2494 | writel(0, adapter->hw.hw_addr + tx_ring->tail); | 2496 | writel(0, adapter->hw.hw_addr + tx_ring->head); |
2497 | if (tx_ring->tail) | ||
2498 | writel(0, adapter->hw.hw_addr + tx_ring->tail); | ||
2495 | } | 2499 | } |
2496 | 2500 | ||
2497 | /** | 2501 | /** |
@@ -3327,7 +3331,8 @@ static void ixgbe_free_all_tx_resources(struct ixgbe_adapter *adapter) | |||
3327 | int i; | 3331 | int i; |
3328 | 3332 | ||
3329 | for (i = 0; i < adapter->num_tx_queues; i++) | 3333 | for (i = 0; i < adapter->num_tx_queues; i++) |
3330 | ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); | 3334 | if (adapter->tx_ring[i].desc) |
3335 | ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); | ||
3331 | } | 3336 | } |
3332 | 3337 | ||
3333 | /** | 3338 | /** |
@@ -3363,7 +3368,8 @@ static void ixgbe_free_all_rx_resources(struct ixgbe_adapter *adapter) | |||
3363 | int i; | 3368 | int i; |
3364 | 3369 | ||
3365 | for (i = 0; i < adapter->num_rx_queues; i++) | 3370 | for (i = 0; i < adapter->num_rx_queues; i++) |
3366 | ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); | 3371 | if (adapter->rx_ring[i].desc) |
3372 | ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); | ||
3367 | } | 3373 | } |
3368 | 3374 | ||
3369 | /** | 3375 | /** |