| From stable-bounces@linux.kernel.org Tue May 13 12:10:24 2008 |
| From: Jeremy Higdon <jeremy@sgi.com> |
| Date: Tue, 13 May 2008 19:10:09 GMT |
| Subject: SCSI: qla1280: Fix queue depth problem |
| To: jejb@kernel.org, stable@kernel.org |
| Message-ID: <200805131910.m4DJA9Nl007490@hera.kernel.org> |
| |
| From: Jeremy Higdon <jeremy@sgi.com> |
| |
| commit af5741c6de4f4a1d8608b0f00867c77cb7123635 upstream |
| |
| The qla1280 driver was ANDing the output value of mailbox register |
| 0 with (1 << target-number) to determine whether to enable queueing |
| on the target in question. |
| |
| But mailbox register 0 has the status code for the mailbox command |
| (in this case, Set Target Parameters). Potential values are: |
| /* |
| * ISP mailbox command complete status codes |
| */ |
| |
| So clearly that is in error. I can't think what the author of that |
| line was looking for in a mailbox register, so I just eliminated the |
| AND. flag is used later in the function, and I think that the later |
| usage was also wrong, though it was used to set values that aren't |
| used. Oh well, an overhaul of this driver is not what I want to do |
| now -- just a bugfix. |
| |
| After the fix, I found that my disks were getting a queue depth of |
| 255, which is far too many. Most SCSI disks are limited to 32 or |
| 64. In any case, there's no point, queueing up a bunch of commands |
| to the adapter that will just result in queue full or starve other |
| targets from being issued commands due to running out of internal |
| memory. So I dropped default queue depth to 32 (from which 1 is |
| subtracted elsewhere, giving net of 31). |
| |
| I tested with a Seagate ST336753LC, and results look good, so |
| I'm satisfied with this patch. |
| |
| Signed-off-by: Jeremy Higdon <jeremy@sgi.com> |
| Acked-by: Jes Sorensen <jes@sgi.com> |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/qla1280.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/scsi/qla1280.c |
| +++ b/drivers/scsi/qla1280.c |
| @@ -2012,7 +2012,7 @@ qla1280_set_defaults(struct scsi_qla_hos |
| nv->bus[bus].config_2.req_ack_active_negation = 1; |
| nv->bus[bus].config_2.data_line_active_negation = 1; |
| nv->bus[bus].selection_timeout = 250; |
| - nv->bus[bus].max_queue_depth = 256; |
| + nv->bus[bus].max_queue_depth = 32; |
| |
| if (IS_ISP1040(ha)) { |
| nv->bus[bus].bus_reset_delay = 3; |
| @@ -2056,7 +2056,7 @@ qla1280_config_target(struct scsi_qla_ho |
| status = qla1280_mailbox_command(ha, 0x0f, mb); |
| |
| /* Save Tag queuing enable flag. */ |
| - flag = (BIT_0 << target) & mb[0]; |
| + flag = (BIT_0 << target); |
| if (nv->bus[bus].target[target].parameter.tag_queuing) |
| ha->bus_settings[bus].qtag_enables |= flag; |
| |