Re: [PATCH] hpsa: refine the pci enble/disable handling]

2014-08-14 Thread Tomas Henzl
On 08/13/2014 10:24 PM, scame...@beardog.cce.hp.com wrote:
 Let me try again, this time not from gmail.

 On Thu, Jun 12, 2014 at 10:29 AM, Tomas Henzl the...@redhat.com wrote:
 When a second(kdump) kernel starts and the hard reset method is used
 the driver calls pci_disable_device without previously enabling it,
 so the kernel shows a warning -
 [   16.876248] WARNING: at drivers/pci/pci.c:1431
 pci_disable_device+0x84/0x90()
 [   16.882686] Device hpsa
 disabling already-disabled device
 ...
 This patch fixes it, in addition to this I tried to balance also some
 other pairs
 of enable/disable device in the driver.
 Unfortunately I wasn't able to verify the functionality for the case of a
 sw reset,
 because of a lack of proper hw.

 Signed-off-by: Tomas Henzl the...@redhat.com
 ---
 diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
 index 5858600..67c41b9 100644
 --- a/drivers/scsi/hpsa.c
 +++ b/drivers/scsi/hpsa.c
 @@ -5983,7 +5983,6 @@ static int hpsa_kdump_hard_reset_controller(struct
 pci_dev *pdev)
 /* Turn the board off.  This is so that later pci_restore_state()
  * won't turn the board on before the rest of config space is
 ready.
  */
 -   pci_disable_device(pdev);
 pci_save_state(pdev);

 /* find the first memory BAR, so we can find the cfg table */
 @@ -6031,11 +6030,6 @@ static int hpsa_kdump_hard_reset_controller(struct
 pci_dev *pdev)
 goto unmap_cfgtable;

 pci_restore_state(pdev);
 -   rc = pci_enable_device(pdev);
 -   if (rc) {
 -   dev_warn(pdev-dev, failed to enable device.\n);
 -   goto unmap_cfgtable;
 -   }
 pci_write_config_word(pdev, 4, command_register);

 /* Some devices (notably the HP Smart Array 5i Controller)
 @@ -6548,6 +6542,12 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
 if (!reset_devices)
 return 0;

 +   rc = pci_enable_device(pdev);
 +   if (rc) {
 +   dev_warn(pdev-dev, failed to enable device.\n);
 +   return -ENODEV;
 +   }
 +
 /* Reset the controller with a PCI power-cycle or via doorbell */
 rc = hpsa_kdump_hard_reset_controller(pdev);

 @@ -6556,10 +6556,11 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
  * performant mode.  Or, it might be 640x, which can't reset
  * due to concerns about shared bbwc between 6402/6404 pair.
  */
 -   if (rc == -ENOTSUPP)
 -   return rc; /* just try to do the kdump anyhow. */
 -   if (rc)
 -   return -ENODEV;
 +   if (rc) {
 +   if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
 +   rc = -ENODEV;
 +   goto out_disable;


 Checkpatch complained of trailing whitespace here. ^^^

And we should remove the comment /* Turn the board off...
which is not correct now. I'll repost the patch.

We also might try to solve the problem that we don't know
in which state the pci interface is when the driver starts
in the kdump kernel. We could try something like
pci_enable+disable at the start so it is switched off and the driver
starts from the same point as if were switched off by bios.
(Maybe it's done already somewhere and I'm just
not able to find it though.)

tomash


 Other than that, looks good.

 -- steve


 +   }

 /* Now try to get the controller to respond to a no-op */
 dev_warn(pdev-dev, Waiting for controller to respond to
 no-op\n);
 @@ -6570,7 +6571,11 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
 dev_warn(pdev-dev, no-op failed%s\n,
 (i  11 ? ; re-trying : ));
 }
 -   return 0;
 +
 +out_disable:
 +
 +   pci_disable_device(pdev);
 +   return rc;
  }

  static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
 @@ -6722,6 +6727,7 @@ static void
 hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
 iounmap(h-transtable);
 if (h-cfgtable)
 iounmap(h-cfgtable);
 +   pci_disable_device(h-pdev);
 pci_release_regions(h-pdev);
 kfree(h);
  }
 --
 1.8.3.1


 - End forwarded message -
 --
 To unsubscribe from this list: send the line unsubscribe linux-scsi in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

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


Re: [PATCH] hpsa: refine the pci enble/disable handling]

2014-08-13 Thread scameron

Let me try again, this time not from gmail.

On Thu, Jun 12, 2014 at 10:29 AM, Tomas Henzl the...@redhat.com wrote:
 When a second(kdump) kernel starts and the hard reset method is used
 the driver calls pci_disable_device without previously enabling it,
 so the kernel shows a warning -
 [   16.876248] WARNING: at drivers/pci/pci.c:1431
 pci_disable_device+0x84/0x90()
 [   16.882686] Device hpsa
 disabling already-disabled device
 ...
 This patch fixes it, in addition to this I tried to balance also some
 other pairs
 of enable/disable device in the driver.
 Unfortunately I wasn't able to verify the functionality for the case of a
 sw reset,
 because of a lack of proper hw.

 Signed-off-by: Tomas Henzl the...@redhat.com
 ---
 diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
 index 5858600..67c41b9 100644
 --- a/drivers/scsi/hpsa.c
 +++ b/drivers/scsi/hpsa.c
 @@ -5983,7 +5983,6 @@ static int hpsa_kdump_hard_reset_controller(struct
 pci_dev *pdev)
 /* Turn the board off.  This is so that later pci_restore_state()
  * won't turn the board on before the rest of config space is
 ready.
  */
 -   pci_disable_device(pdev);
 pci_save_state(pdev);

 /* find the first memory BAR, so we can find the cfg table */
 @@ -6031,11 +6030,6 @@ static int hpsa_kdump_hard_reset_controller(struct
 pci_dev *pdev)
 goto unmap_cfgtable;

 pci_restore_state(pdev);
 -   rc = pci_enable_device(pdev);
 -   if (rc) {
 -   dev_warn(pdev-dev, failed to enable device.\n);
 -   goto unmap_cfgtable;
 -   }
 pci_write_config_word(pdev, 4, command_register);

 /* Some devices (notably the HP Smart Array 5i Controller)
 @@ -6548,6 +6542,12 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
 if (!reset_devices)
 return 0;

 +   rc = pci_enable_device(pdev);
 +   if (rc) {
 +   dev_warn(pdev-dev, failed to enable device.\n);
 +   return -ENODEV;
 +   }
 +
 /* Reset the controller with a PCI power-cycle or via doorbell */
 rc = hpsa_kdump_hard_reset_controller(pdev);

 @@ -6556,10 +6556,11 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
  * performant mode.  Or, it might be 640x, which can't reset
  * due to concerns about shared bbwc between 6402/6404 pair.
  */
 -   if (rc == -ENOTSUPP)
 -   return rc; /* just try to do the kdump anyhow. */
 -   if (rc)
 -   return -ENODEV;
 +   if (rc) {
 +   if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
 +   rc = -ENODEV;
 +   goto out_disable;



Checkpatch complained of trailing whitespace here. ^^^

Other than that, looks good.

-- steve


 +   }

 /* Now try to get the controller to respond to a no-op */
 dev_warn(pdev-dev, Waiting for controller to respond to
 no-op\n);
 @@ -6570,7 +6571,11 @@ static int hpsa_init_reset_devices(struct pci_dev
 *pdev)
 dev_warn(pdev-dev, no-op failed%s\n,
 (i  11 ? ; re-trying : ));
 }
 -   return 0;
 +
 +out_disable:
 +
 +   pci_disable_device(pdev);
 +   return rc;
  }

  static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
 @@ -6722,6 +6727,7 @@ static void
 hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
 iounmap(h-transtable);
 if (h-cfgtable)
 iounmap(h-cfgtable);
 +   pci_disable_device(h-pdev);
 pci_release_regions(h-pdev);
 kfree(h);
  }
 --
 1.8.3.1



- End forwarded message -
--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] hpsa: refine the pci enble/disable handling

2014-07-07 Thread Tomas Henzl
Steve, Joe,
any chance you could review this patch and verify the sw reset case?
Thanks, Tomas

On 06/12/2014 05:29 PM, Tomas Henzl wrote:
 When a second(kdump) kernel starts and the hard reset method is used
 the driver calls pci_disable_device without previously enabling it,
 so the kernel shows a warning -
 [   16.876248] WARNING: at drivers/pci/pci.c:1431 
 pci_disable_device+0x84/0x90()
 [   16.882686] Device hpsa
 disabling already-disabled device
 ...
 This patch fixes it, in addition to this I tried to balance also some other 
 pairs
 of enable/disable device in the driver.
 Unfortunately I wasn't able to verify the functionality for the case of a sw 
 reset,
 because of a lack of proper hw.

 Signed-off-by: Tomas Henzl the...@redhat.com
 ---
 diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
 index 5858600..67c41b9 100644
 --- a/drivers/scsi/hpsa.c
 +++ b/drivers/scsi/hpsa.c
 @@ -5983,7 +5983,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
 pci_dev *pdev)
   /* Turn the board off.  This is so that later pci_restore_state()
* won't turn the board on before the rest of config space is ready.
*/
 - pci_disable_device(pdev);
   pci_save_state(pdev);
  
   /* find the first memory BAR, so we can find the cfg table */
 @@ -6031,11 +6030,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
 pci_dev *pdev)
   goto unmap_cfgtable;
  
   pci_restore_state(pdev);
 - rc = pci_enable_device(pdev);
 - if (rc) {
 - dev_warn(pdev-dev, failed to enable device.\n);
 - goto unmap_cfgtable;
 - }
   pci_write_config_word(pdev, 4, command_register);
  
   /* Some devices (notably the HP Smart Array 5i Controller)
 @@ -6548,6 +6542,12 @@ static int hpsa_init_reset_devices(struct pci_dev 
 *pdev)
   if (!reset_devices)
   return 0;
  
 + rc = pci_enable_device(pdev);
 + if (rc) {
 + dev_warn(pdev-dev, failed to enable device.\n);
 + return -ENODEV;
 + }
 +
   /* Reset the controller with a PCI power-cycle or via doorbell */
   rc = hpsa_kdump_hard_reset_controller(pdev);
  
 @@ -6556,10 +6556,11 @@ static int hpsa_init_reset_devices(struct pci_dev 
 *pdev)
* performant mode.  Or, it might be 640x, which can't reset
* due to concerns about shared bbwc between 6402/6404 pair.
*/
 - if (rc == -ENOTSUPP)
 - return rc; /* just try to do the kdump anyhow. */
 - if (rc)
 - return -ENODEV;
 + if (rc) {
 + if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
 + rc = -ENODEV;
 + goto out_disable; 
 + }
  
   /* Now try to get the controller to respond to a no-op */
   dev_warn(pdev-dev, Waiting for controller to respond to no-op\n);
 @@ -6570,7 +6571,11 @@ static int hpsa_init_reset_devices(struct pci_dev 
 *pdev)
   dev_warn(pdev-dev, no-op failed%s\n,
   (i  11 ? ; re-trying : ));
   }
 - return 0;
 +
 +out_disable:
 +
 + pci_disable_device(pdev);
 + return rc;
  }
  
  static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
 @@ -6722,6 +6727,7 @@ static void 
 hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
   iounmap(h-transtable);
   if (h-cfgtable)
   iounmap(h-cfgtable);
 + pci_disable_device(h-pdev);
   pci_release_regions(h-pdev);
   kfree(h);
  }

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


RE: [PATCH] hpsa: refine the pci enble/disable handling

2014-07-07 Thread Handzik, Joe
I'll take a look when I get a chance, Steve's out on vacation all week. At 
first glance it looks good, but like you said...gotta test it.

Joe

-Original Message-
From: Tomas Henzl [mailto:the...@redhat.com] 
Sent: Monday, July 07, 2014 9:13 AM
To: 'linux-scsi@vger.kernel.org'
Cc: stephenmcame...@gmail.com; michael.mil...@canonical.com; Handzik, Joe
Subject: Re: [PATCH] hpsa: refine the pci enble/disable handling

Steve, Joe,
any chance you could review this patch and verify the sw reset case?
Thanks, Tomas

On 06/12/2014 05:29 PM, Tomas Henzl wrote:
 When a second(kdump) kernel starts and the hard reset method is used 
 the driver calls pci_disable_device without previously enabling it, so 
 the kernel shows a warning -
 [   16.876248] WARNING: at drivers/pci/pci.c:1431 
 pci_disable_device+0x84/0x90()
 [   16.882686] Device hpsa
 disabling already-disabled device
 ...
 This patch fixes it, in addition to this I tried to balance also some 
 other pairs of enable/disable device in the driver.
 Unfortunately I wasn't able to verify the functionality for the case 
 of a sw reset, because of a lack of proper hw.

 Signed-off-by: Tomas Henzl the...@redhat.com
 ---
 diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 
 5858600..67c41b9 100644
 --- a/drivers/scsi/hpsa.c
 +++ b/drivers/scsi/hpsa.c
 @@ -5983,7 +5983,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
 pci_dev *pdev)
   /* Turn the board off.  This is so that later pci_restore_state()
* won't turn the board on before the rest of config space is ready.
*/
 - pci_disable_device(pdev);
   pci_save_state(pdev);
  
   /* find the first memory BAR, so we can find the cfg table */ @@ 
 -6031,11 +6030,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
 pci_dev *pdev)
   goto unmap_cfgtable;
  
   pci_restore_state(pdev);
 - rc = pci_enable_device(pdev);
 - if (rc) {
 - dev_warn(pdev-dev, failed to enable device.\n);
 - goto unmap_cfgtable;
 - }
   pci_write_config_word(pdev, 4, command_register);
  
   /* Some devices (notably the HP Smart Array 5i Controller) @@ 
 -6548,6 +6542,12 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
   if (!reset_devices)
   return 0;
  
 + rc = pci_enable_device(pdev);
 + if (rc) {
 + dev_warn(pdev-dev, failed to enable device.\n);
 + return -ENODEV;
 + }
 +
   /* Reset the controller with a PCI power-cycle or via doorbell */
   rc = hpsa_kdump_hard_reset_controller(pdev);
  
 @@ -6556,10 +6556,11 @@ static int hpsa_init_reset_devices(struct pci_dev 
 *pdev)
* performant mode.  Or, it might be 640x, which can't reset
* due to concerns about shared bbwc between 6402/6404 pair.
*/
 - if (rc == -ENOTSUPP)
 - return rc; /* just try to do the kdump anyhow. */
 - if (rc)
 - return -ENODEV;
 + if (rc) {
 + if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
 + rc = -ENODEV;
 + goto out_disable; 
 + }
  
   /* Now try to get the controller to respond to a no-op */
   dev_warn(pdev-dev, Waiting for controller to respond to 
 no-op\n); @@ -6570,7 +6571,11 @@ static int hpsa_init_reset_devices(struct 
 pci_dev *pdev)
   dev_warn(pdev-dev, no-op failed%s\n,
   (i  11 ? ; re-trying : ));
   }
 - return 0;
 +
 +out_disable:
 +
 + pci_disable_device(pdev);
 + return rc;
  }
  
  static int hpsa_allocate_cmd_pool(struct ctlr_info *h) @@ -6722,6 
 +6727,7 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct 
 ctlr_info *h)
   iounmap(h-transtable);
   if (h-cfgtable)
   iounmap(h-cfgtable);
 + pci_disable_device(h-pdev);
   pci_release_regions(h-pdev);
   kfree(h);
  }

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


[PATCH] hpsa: refine the pci enble/disable handling

2014-06-12 Thread Tomas Henzl
When a second(kdump) kernel starts and the hard reset method is used
the driver calls pci_disable_device without previously enabling it,
so the kernel shows a warning -
[   16.876248] WARNING: at drivers/pci/pci.c:1431 pci_disable_device+0x84/0x90()
[   16.882686] Device hpsa
disabling already-disabled device
...
This patch fixes it, in addition to this I tried to balance also some other 
pairs
of enable/disable device in the driver.
Unfortunately I wasn't able to verify the functionality for the case of a sw 
reset,
because of a lack of proper hw.

Signed-off-by: Tomas Henzl the...@redhat.com
---
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index 5858600..67c41b9 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -5983,7 +5983,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
pci_dev *pdev)
/* Turn the board off.  This is so that later pci_restore_state()
 * won't turn the board on before the rest of config space is ready.
 */
-   pci_disable_device(pdev);
pci_save_state(pdev);
 
/* find the first memory BAR, so we can find the cfg table */
@@ -6031,11 +6030,6 @@ static int hpsa_kdump_hard_reset_controller(struct 
pci_dev *pdev)
goto unmap_cfgtable;
 
pci_restore_state(pdev);
-   rc = pci_enable_device(pdev);
-   if (rc) {
-   dev_warn(pdev-dev, failed to enable device.\n);
-   goto unmap_cfgtable;
-   }
pci_write_config_word(pdev, 4, command_register);
 
/* Some devices (notably the HP Smart Array 5i Controller)
@@ -6548,6 +6542,12 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
if (!reset_devices)
return 0;
 
+   rc = pci_enable_device(pdev);
+   if (rc) {
+   dev_warn(pdev-dev, failed to enable device.\n);
+   return -ENODEV;
+   }
+
/* Reset the controller with a PCI power-cycle or via doorbell */
rc = hpsa_kdump_hard_reset_controller(pdev);
 
@@ -6556,10 +6556,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
 * performant mode.  Or, it might be 640x, which can't reset
 * due to concerns about shared bbwc between 6402/6404 pair.
 */
-   if (rc == -ENOTSUPP)
-   return rc; /* just try to do the kdump anyhow. */
-   if (rc)
-   return -ENODEV;
+   if (rc) {
+   if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
+   rc = -ENODEV;
+   goto out_disable; 
+   }
 
/* Now try to get the controller to respond to a no-op */
dev_warn(pdev-dev, Waiting for controller to respond to no-op\n);
@@ -6570,7 +6571,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
dev_warn(pdev-dev, no-op failed%s\n,
(i  11 ? ; re-trying : ));
}
-   return 0;
+
+out_disable:
+
+   pci_disable_device(pdev);
+   return rc;
 }
 
 static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
@@ -6722,6 +6727,7 @@ static void 
hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
iounmap(h-transtable);
if (h-cfgtable)
iounmap(h-cfgtable);
+   pci_disable_device(h-pdev);
pci_release_regions(h-pdev);
kfree(h);
 }
-- 
1.8.3.1

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