Skip to contentSkip to conversation

cxgb3 - reset the adapter on fatal error

PATCH Applied Divy Le Ray 2 participants 2 messages Oct 9, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/7 cxgb3 - reset the adapter on fatal error

From: Divy Le Ray <[email protected]>

when a fatal error occurs, bring ports down, reset the chip, and bring ports back up.

Factorize code used for both EEH and fatal error recovery. Fix timer usage when bringing up/resetting sge queue sets.

---

 drivers/net/cxgb3/adapter.h    |    1 
 drivers/net/cxgb3/common.h     |    1 
 drivers/net/cxgb3/cxgb3_main.c |  164 +++++++++++++++++++++++++++-------------
 drivers/net/cxgb3/sge.c        |    9 +-
 drivers/net/cxgb3/t3_hw.c      |    4 -
 5 files changed, 119 insertions(+), 60 deletions(-)
drivers/net/cxgb3/adapter.h +1 -0
index e9da285..02dd69b 100644
@@ -240,6 +240,7 @@ struct adapter {
 	unsigned int check_task_cnt;
 	struct delayed_work adap_check_task;
 	struct work_struct ext_intr_handler_task;
+	struct work_struct fatal_error_handler_task;
 
 	struct dentry *debugfs_root;
 
drivers/net/cxgb3/common.h +1 -0
index 9ecf8a6..d6dbcd4 100644
@@ -698,6 +698,7 @@ int t3_check_fw_version(struct adapter *adapter, int *must_load);
 int t3_init_hw(struct adapter *adapter, u32 fw_params);
 void mac_prep(struct cmac *mac, struct adapter *adapter, int index);
 void early_hw_init(struct adapter *adapter, const struct adapter_info *ai);
+int t3_reset_adapter(struct adapter *adapter);
 int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
 		    int reset);
 int t3_replay_prep_adapter(struct adapter *adapter);
drivers/net/cxgb3/cxgb3_main.c +111 -53

225 lines not on this page · raw message

drivers/net/cxgb3/sge.c +4 -5
index 7346a8e..8791941 100644
@@ -351,7 +351,8 @@ static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
 		pci_unmap_single(pdev, pci_unmap_addr(d, dma_addr),
 				 q->buf_size, PCI_DMA_FROMDEVICE);
 		if (q->use_pages) {
-			put_page(d->pg_chunk.page);
+			if (d->pg_chunk.page)
+				put_page(d->pg_chunk.page);
 			d->pg_chunk.page = NULL;
 		} else {
 			kfree_skb(d->skb);
@@ -583,7 +584,7 @@ static void t3_reset_qset(struct sge_qset *q)
 	memset(q->fl, 0, sizeof(struct sge_fl) * SGE_RXQ_PER_SET);
 	memset(q->txq, 0, sizeof(struct sge_txq) * SGE_TXQ_PER_SET);
 	q->txq_stopped = 0;
-	memset(&q->tx_reclaim_timer, 0, sizeof(q->tx_reclaim_timer));
+	q->tx_reclaim_timer.function = NULL; /* for t3_stop_sge_timers() */
 	kfree(q->lro_frag_tbl);
 	q->lro_nfrags = q->lro_frag_len = 0;
 }
@@ -2840,9 +2841,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
 	struct net_lro_mgr *lro_mgr = &q->lro_mgr;
 
 	init_qset_cntxt(q, id);
-	init_timer(&q->tx_reclaim_timer);
-	q->tx_reclaim_timer.data = (unsigned long)q;
-	q->tx_reclaim_timer.function = sge_timer_cb;
+	setup_timer(&q->tx_reclaim_timer, sge_timer_cb, (unsigned long)q);
 
 	q->fl[0].desc = alloc_ring(adapter->pdev, p->fl_size,
 				   sizeof(struct rx_desc),
drivers/net/cxgb3/t3_hw.c +2 -2
index 04c0e90..33470c7 100644
@@ -1221,7 +1221,7 @@ struct intr_info {
 	unsigned int mask;	/* bits to check in interrupt status */
 	const char *msg;	/* message to print or NULL */
 	short stat_idx;		/* stat counter to increment or -1 */
-	unsigned short fatal:1;	/* whether the condition reported is fatal */
+	unsigned short fatal;	/* whether the condition reported is fatal */
 };
 
 /**
@@ -3488,7 +3488,7 @@ void early_hw_init(struct adapter *adapter, const struct adapter_info *ai)
  * Older PCIe cards lose their config space during reset, PCI-X
  * ones don't.
  */
-static int t3_reset_adapter(struct adapter *adapter)
+int t3_reset_adapter(struct adapter *adapter)
 {
 	int i, save_and_restore_pcie =
 	    adapter->params.rev < T3_REV_B2 && is_pcie(adapter);
maintainer Applied
#1 lore raw

From: Divy Le Ray <[email protected]>
Date: Wed, 08 Oct 2008 17:33:57 -0700

Quoted 7 lines

when a fatal error occurs, bring ports down, reset the chip, and bring ports back up.

Factorize code used for both EEH and fatal error recovery. Fix timer usage when bringing up/resetting sge queue sets.

Applied.