On Wed, Jan 10, 2007 at 04:59:39PM -0600, linas wrote:
> 
> > However, on a Power4 architecture there are errors reported
> > in upper layer (we discussed this in one of earlier emails) followed 
> > by SCSI errors.
> 
> I'm trying to investigate now.

I found two distinct power4 bugs. I posted a patch for one yesterday,
under the subject heading 

  [PATCH] Urgent: powerpc 2.6.20-rc4 dma broken on non-LPAR pseries

This affects only recent mainline kernels; it would not affect
older or distro kernels.   

The other patch is attached below.  After some more testing,
I'll submit to mainline.

--linas


Subject: [PATCH] pSeries: EEH improperly enabled for some Power4 systems

It appears that EEH is improperly enabled for some Power4 systems.
On these systems, the ibm,set-eeh-option returns a value of success
even when EEH is not supported on the given node. Thus, an explicit
check for support is required.

Signed-off-by: Linas Vepstas <[EMAIL PROTECTED]> 

----
 arch/powerpc/platforms/pseries/eeh.c |   19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

Index: linux-2.6.20-rc4/arch/powerpc/platforms/pseries/eeh.c
===================================================================
--- linux-2.6.20-rc4.orig/arch/powerpc/platforms/pseries/eeh.c  2007-01-11 
14:15:02.000000000 -0600
+++ linux-2.6.20-rc4/arch/powerpc/platforms/pseries/eeh.c       2007-01-11 
15:14:39.000000000 -0600
@@ -748,6 +748,7 @@ struct eeh_early_enable_info {
 /* Enable eeh for the given device node. */
 static void *early_enable_eeh(struct device_node *dn, void *data)
 {
+       unsigned int rets[3];
        struct eeh_early_enable_info *info = data;
        int ret;
        const char *status = get_property(dn, "status", NULL);
@@ -804,16 +805,14 @@ static void *early_enable_eeh(struct dev
                                regs[0], info->buid_hi, info->buid_lo,
                                EEH_ENABLE);
 
+               enable = 0;
                if (ret == 0) {
-                       eeh_subsystem_enabled = 1;
-                       pdn->eeh_mode |= EEH_MODE_SUPPORTED;
                        pdn->eeh_config_addr = regs[0];
 
                        /* If the newer, better, ibm,get-config-addr-info is 
supported, 
                         * then use that instead. */
                        pdn->eeh_pe_config_addr = 0;
                        if (ibm_get_config_addr_info != RTAS_UNKNOWN_SERVICE) {
-                               unsigned int rets[2];
                                ret = rtas_call (ibm_get_config_addr_info, 4, 
2, rets, 
                                        pdn->eeh_config_addr, 
                                        info->buid_hi, info->buid_lo,
@@ -821,6 +820,20 @@ static void *early_enable_eeh(struct dev
                                if (ret == 0)
                                        pdn->eeh_pe_config_addr = rets[0];
                        }
+
+                       /* Some older systems (Power4) allow the
+                        * ibm,set-eeh-option call to succeed even on nodes
+                        * where EEH is not supported. Verify support
+                        * explicitly. */
+                       ret = read_slot_reset_state(pdn, rets);
+                       if ((ret == 0) && (rets[1] == 1))
+                               enable = 1;
+               }
+
+               if (enable) {
+                       eeh_subsystem_enabled = 1;
+                       pdn->eeh_mode |= EEH_MODE_SUPPORTED;
+
 #ifdef DEBUG
                        printk(KERN_DEBUG "EEH: %s: eeh enabled, config=%x 
pe_config=%x\n",
                               dn->full_name, pdn->eeh_config_addr, 
pdn->eeh_pe_config_addr);

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to