| summaryrefslogtreecommitdiff |
Side-by-side diff
Diffstat (limited to 'patches.drivers/cxgb3-parity-managment.patch') (more/less context) (ignore whitespace changes)
| -rw-r--r-- | patches.drivers/cxgb3-parity-managment.patch | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/patches.drivers/cxgb3-parity-managment.patch b/patches.drivers/cxgb3-parity-managment.patch new file mode 100644 index 0000000..6bbaef8 --- a/dev/null +++ b/patches.drivers/cxgb3-parity-managment.patch @@ -0,0 +1,199 @@ +From: Pranjal Joshi <pjoshi@chelsio.com> +References: bnc#643606, fate#309997 +Subject: cxgb3: Parity errors management updates +Patch-mainline: Merged into net-next-2.6 for 2.6.37 + +Backport for patches from upstream. + +commit 55bc3228ccef255041d697fe55dcc7fe4b37feb6 +Author: Casey Leedom <leedom@chelsio.com> +Date: Thu Sep 2 13:07:32 2010 +0000 + + cxgb3: Avoid flush_workqueue() deadlock. + + Don't call flush_workqueue() on the cxgb3 Work Queue in cxgb_down() when + we're being called from the fatal error task ... which is executing on the + cxgb3 Work Queue. + + Signed-off-by: Casey Leedom <leedom@chelsio.com> + Signed-off-by: David S. Miller <davem@davemloft.net> + + +commit aa476321022ac6c3cb8ebfd1736555ccf61da276 +Author: Casey Leedom <leedom@chelsio.com> +Date: Thu Sep 2 13:07:31 2010 +0000 + + cxgb3: Leave interrupts for fatal errors asserted in common code. + + Platform code needs to deal with them now. + + Signed-off-by: Dimitris Michailidis <dm@chelsio.com> + Signed-off-by: Casey Leedom <leedom@chelsio.com> + Signed-off-by: David S. Miller <davem@davemloft.net> + + +commit e05e6a397c65ac9a31ce799cf85157f2d85f45b7 +Author: Casey Leedom <leedom@chelsio.com> +Date: Thu Sep 2 13:07:30 2010 +0000 + + cxgb3: Set FATALPERREN. + + Signed-off-by: Dimitris Michailidis <dm@chelsio.com> + Signed-off-by: Casey Leedom <leedom@chelsio.com> + Signed-off-by: David S. Miller <davem@davemloft.net> + + +commit 96e4a387528cfe806fbdf7b022a6c3f103af4ae1 +Author: Casey Leedom <leedom@chelsio.com> +Date: Thu Sep 2 13:07:29 2010 +0000 + + cxgb3: Add register bit definition for Fatal Parity Error. + + Signed-off-by: Casey Leedom <leedom@chelsio.com> + Signed-off-by: David S. Miller <davem@davemloft.net> + +Signed-off-by: Brandon Philips <bphilips@suse.de> + +--- + drivers/net/cxgb3/cxgb3_main.c | 24 +++++++++++++++--------- + drivers/net/cxgb3/regs.h | 4 ++++ + drivers/net/cxgb3/t3_hw.c | 4 +++- + 3 files changed, 22 insertions(+), 10 deletions(-) + +--- a/drivers/net/cxgb3/cxgb3_main.c ++++ b/drivers/net/cxgb3/cxgb3_main.c +@@ -1184,7 +1184,7 @@ irq_err: + /* + * Release resources when all the ports and offloading have been stopped. + */ +-static void cxgb_down(struct adapter *adapter) ++static void cxgb_down(struct adapter *adapter, int on_wq) + { + t3_sge_stop(adapter); + spin_lock_irq(&adapter->work_lock); /* sync with PHY intr task */ +@@ -1193,7 +1193,8 @@ static void cxgb_down(struct adapter *ad + + free_irq_resources(adapter); + quiesce_rx(adapter); +- flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */ ++ if(!on_wq) ++ flush_workqueue(cxgb3_wq);/* wait for external IRQ handler */ + } + + static void schedule_chk_task(struct adapter *adap) +@@ -1271,7 +1272,7 @@ static int offload_close(struct t3cdev * + clear_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map); + + if (!adapter->open_device_map) +- cxgb_down(adapter); ++ cxgb_down(adapter, 0); + + cxgb3_offload_deactivate(adapter); + return 0; +@@ -1304,7 +1305,7 @@ static int cxgb_open(struct net_device * + return 0; + } + +-static int cxgb_close(struct net_device *dev) ++static int __cxgb_close(struct net_device *dev, int on_wq) + { + struct port_info *pi = netdev_priv(dev); + struct adapter *adapter = pi->adapter; +@@ -1332,11 +1333,16 @@ static int cxgb_close(struct net_device + &adapter->adap_check_task); + + if (!adapter->open_device_map) +- cxgb_down(adapter); ++ cxgb_down(adapter, on_wq); + + return 0; + } + ++static int cxgb_close(struct net_device *dev) ++{ ++ return __cxgb_close(dev, 0); ++} ++ + static struct net_device_stats *cxgb_get_stats(struct net_device *dev) + { + struct port_info *pi = netdev_priv(dev); +@@ -2812,7 +2818,7 @@ void t3_os_link_fault_handler(struct ada + spin_unlock(&adapter->work_lock); + } + +-static int t3_adapter_error(struct adapter *adapter, int reset) ++static int t3_adapter_error(struct adapter *adapter, int reset, int on_wq) + { + int i, ret = 0; + +@@ -2827,7 +2833,7 @@ static int t3_adapter_error(struct adapt + struct net_device *netdev = adapter->port[i]; + + if (netif_running(netdev)) +- cxgb_close(netdev); ++ __cxgb_close(netdev, on_wq); + } + + /* Stop SGE timers */ +@@ -2897,7 +2903,7 @@ static void fatal_error_task(struct work + int err = 0; + + rtnl_lock(); +- err = t3_adapter_error(adapter, 1); ++ err = t3_adapter_error(adapter, 1, 1); + if (!err) + err = t3_reenable_adapter(adapter); + if (!err) +@@ -2947,7 +2953,7 @@ static pci_ers_result_t t3_io_error_dete + if (state == pci_channel_io_perm_failure) + return PCI_ERS_RESULT_DISCONNECT; + +- ret = t3_adapter_error(adapter, 0); ++ ret = t3_adapter_error(adapter, 0, 0); + + /* Request a slot reset. */ + return PCI_ERS_RESULT_NEED_RESET; +--- a/drivers/net/cxgb3/regs.h ++++ b/drivers/net/cxgb3/regs.h +@@ -1981,6 +1981,10 @@ + + #define A_PL_RST 0x6f0 + ++#define S_FATALPERREN 4 ++#define V_FATALPERREN(x) ((x) << S_FATALPERREN) ++#define F_FATALPERREN V_FATALPERREN(1U) ++ + #define S_CRSTWRM 1 + #define V_CRSTWRM(x) ((x) << S_CRSTWRM) + #define F_CRSTWRM V_CRSTWRM(1U) +--- a/drivers/net/cxgb3/t3_hw.c ++++ b/drivers/net/cxgb3/t3_hw.c +@@ -1408,6 +1408,7 @@ static int t3_handle_intr_status(struct + fatal++; + CH_ALERT(adapter, "%s (0x%x)\n", + acts->msg, status & acts->mask); ++ status &= ~acts->mask; + } else if (acts->msg) + CH_WARN(adapter, "%s (0x%x)\n", + acts->msg, status & acts->mask); +@@ -1840,11 +1841,11 @@ static int mac_intr_handler(struct adapt + t3_os_link_fault_handler(adap, idx); + } + +- t3_write_reg(adap, A_XGM_INT_CAUSE + mac->offset, cause); + + if (cause & XGM_INTR_FATAL) + t3_fatal_err(adap); + ++ t3_write_reg(adap, A_XGM_INT_CAUSE + mac->offset, cause); + return cause != 0; + } + +@@ -3566,6 +3567,7 @@ int t3_init_hw(struct adapter *adapter, + t3_write_reg(adapter, A_PM1_TX_MODE, 0); + chan_init_hw(adapter, adapter->params.chan_map); + t3_sge_init(adapter, &adapter->params.sge); ++ t3_set_reg_field(adapter, A_PL_RST, 0, F_FATALPERREN); + + t3_write_reg(adapter, A_T3DBG_GPIO_ACT_LOW, calc_gpio_intr(adapter)); + |