| From 2ab01efd1d2a24db53b4c5d28a2e20cf2b1206c5 Mon Sep 17 00:00:00 2001 |
| From: Salyzyn, Mark <mark_salyzyn@adaptec.com> |
| Date: Tue, 15 May 2007 09:14:21 -0400 |
| Cc: James Bottomley <James.Bottomley@SteelEye.com> |
| Subject: SCSI: aacraid: Correct sa platform support. (Was: [Bug 8469] Bad EIP value on pentium3 SMP kernel-2.6.21.1) |
| |
| |
| http://bugzilla.kernel.org/show_bug.cgi?id=8469 |
| |
| As discussed in the bugzilla outlined below, we have an sa based |
| (Mustang) RAID adapter on the system, a Dell PERC2/QC. Affected |
| controllers are HP NetRAID, Adaptec AAC-364, Dell PERC2/QC or Adaptec |
| 5400S. This problem coincides with the introduction of the adapter_comm |
| and adapter_deliver platform functions (Message [PATCH 1/4] aacraid: |
| rework communication support code, January 23 2007, which initially |
| migrated to 2.6.21) |
| |
| The panic occurs with an uninitialized adapter_deliver platform function |
| pointer. The enclosed patch, unmodified as tested by Rainer, solves the |
| problem. |
| |
| Signed-off-by: Mark Salyzyn <aacraid@adaptec.com> |
| Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| [chrisw: backport to 2.6.21.4] |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| |
| --- |
| drivers/scsi/aacraid/aacraid.h | 1 + |
| drivers/scsi/aacraid/rx.c | 2 +- |
| drivers/scsi/aacraid/sa.c | 3 ++- |
| 3 files changed, 4 insertions(+), 2 deletions(-) |
| |
| --- linux-2.6.21.4.orig/drivers/scsi/aacraid/aacraid.h |
| +++ linux-2.6.21.4/drivers/scsi/aacraid/aacraid.h |
| @@ -1840,6 +1840,7 @@ struct aac_driver_ident* aac_get_driver_ |
| int aac_get_adapter_info(struct aac_dev* dev); |
| int aac_send_shutdown(struct aac_dev *dev); |
| int aac_probe_container(struct aac_dev *dev, int cid); |
| +int aac_rx_deliver_producer(struct fib * fib); |
| extern int numacb; |
| extern int acbsize; |
| extern char aac_driver_version[]; |
| --- linux-2.6.21.4.orig/drivers/scsi/aacraid/rx.c |
| +++ linux-2.6.21.4/drivers/scsi/aacraid/rx.c |
| @@ -378,7 +378,7 @@ static int aac_rx_check_health(struct aa |
| * |
| * Will send a fib, returning 0 if successful. |
| */ |
| -static int aac_rx_deliver_producer(struct fib * fib) |
| +int aac_rx_deliver_producer(struct fib * fib) |
| { |
| struct aac_dev *dev = fib->dev; |
| struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; |
| --- linux-2.6.21.4.orig/drivers/scsi/aacraid/sa.c |
| +++ linux-2.6.21.4/drivers/scsi/aacraid/sa.c |
| @@ -5,7 +5,7 @@ |
| * based on the old aacraid driver that is.. |
| * Adaptec aacraid device driver for Linux. |
| * |
| - * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) |
| + * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| @@ -368,6 +368,7 @@ int aac_sa_init(struct aac_dev *dev) |
| dev->a_ops.adapter_sync_cmd = sa_sync_cmd; |
| dev->a_ops.adapter_check_health = aac_sa_check_health; |
| dev->a_ops.adapter_intr = aac_sa_intr; |
| + dev->a_ops.adapter_deliver = aac_rx_deliver_producer; |
| dev->a_ops.adapter_ioremap = aac_sa_ioremap; |
| |
| /* |