Skip to contentSkip to conversation

aacraid: Correct sa platform support. (Was: [Bug 8469] Bad EIP value on pentium3 SMP kernel-2.6.21.1)

PATCH New Salyzyn, Mark 1 participant 1 message May 15, 2007 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/1 aacraid: Correct sa platform support. (Was: [Bug 8469] Bad EIP value on pentium3 SMP kernel-2.6.21.1)

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.

This attached patch is against current scsi-misc-2.6, applies cleanly to 2.6.21-git12. It may require manual intervention to be applied to 2.6.21 or 2.6.21.1, simple breakage when merely adding a single line to aacraid.h:

. . .
+ int aac_rx_deliver_producer(struct fib * fib);
extern int numacb;
. . .

ObligatoryDisclaimer: Please accept my condolences regarding Outlook's handling of patch attachments.

Sincerely -- Mark Salyzyn

Quoted 6 lines

-----Original Message-----
From: Andrew Morton [mailto:[email protected]]
Sent: Tuesday, May 15, 2007 1:30 AM
To: Salyzyn, Mark
Subject: Re: [Bug 8469] Bad EIP value on pentium3 SMP kernel-2.6.21.1

Quoted 8 lines
Quoted 1 line · On Mon, 14 May 2007 22:10:20 -0700 [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=8469

we appear to have a thumbs-up. Please cc me on the final patch?

Please also consider ccing [email protected], as this bug affects

2.6.21.x.

Quoted 2 lines

Thanks.

drivers/scsi/aacraid/aacraid.h +1 -0
diff -ru a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
@@ -1823,6 +1823,7 @@
 int aac_probe_container(struct aac_dev *dev, int cid);
 int _aac_rx_init(struct aac_dev *dev);
 int aac_rx_select_comm(struct aac_dev *dev, int comm);
+int aac_rx_deliver_producer(struct fib * fib);
 extern int numacb;
 extern int acbsize;
 extern char aac_driver_version[];
drivers/scsi/aacraid/rx.c +1 -1
diff -ru a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
@@ -378,7 +378,7 @@
  *
  *	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];
drivers/scsi/aacraid/sa.c +8 -1
diff -ru a/drivers/scsi/aacraid/sa.c b/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. ([email protected])
+ * Copyright (c) 2000-2007 Adaptec, Inc. ([email protected])
  *
  * 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
@@ -257,6 +257,11 @@
 			NULL, NULL, NULL, NULL, NULL);
 }
 
+static int aac_sa_restart_adapter(struct aac_dev *dev, int bled)
+{
+	return -EINVAL;
+}
+
 /**
  *	aac_sa_check_health
  *	@dev: device to check if healthy
@@ -366,7 +371,9 @@
 	dev->a_ops.adapter_notify = aac_sa_notify_adapter;
 	dev->a_ops.adapter_sync_cmd = sa_sync_cmd;
 	dev->a_ops.adapter_check_health = aac_sa_check_health;
+	dev->a_ops.adapter_restart = aac_sa_restart_adapter;
 	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;
 
 	/*