aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Brandeburg <jesse.brandeburg@intel.com>2009-03-13 18:14:50 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-14 15:41:12 -0400
commit9891ca7cdc42354ec48c0f76256fdcc9808ffc7e (patch)
tree9c1ca0824399da284c1e0bf31dce42145f7d2877
parent2a41ff81162c7c406bb2a04e425a7ed51c85d89d (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>
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c18
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/**