AMI MegaRAID driver update

Jeffrey Jones (jeffreyj@ami.com)
Mon, 25 Jan 1999 17:16:02 -0500


This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------ =_NextPart_000_01BE48B0.4BD153EA
Content-Type: text/plain;
charset="iso-8859-1"

Here is a patch to upgrade to the latest version of the AMI MegaRAID driver
(0.93). There isn't anything all that important in it that's new; mostly
little fixes and rearrangement. I am planning on releasing a final version
1.00 within the next few weeks as soon as any little bugs that crop up in
0.93 are fixed. I'd appreciate any testers out there who want to try it and
give feedback. This patch is done against the 2.2.0-pre9 kernel, may not
work with a 2.0 kernel. I'll post a patch for that tomorrow.
Regards,

Jeff L Jones jeffreyj@ami.com <mailto:jeffreyj@ami.com>
RAID SW Dev. Eng
American Megatrends Inc.

<<patch-megaraid093>>

------ =_NextPart_000_01BE48B0.4BD153EA
Content-Type: application/octet-stream;
name="patch-megaraid093"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="patch-megaraid093"

diff -urN linux/drivers/scsi/megaraid.c =
linux-mega093/drivers/scsi/megaraid.c
--- linux/drivers/scsi/megaraid.c Mon Jan 25 16:57:37 1999
+++ linux-mega093/drivers/scsi/megaraid.c Mon Jan 25 17:01:15 1999
@@ -1,24 +1,27 @@
=
/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
*
* Linux MegaRAID device driver
- *=20
+ *
* Copyright 1998 American Megatrends Inc.
*
- * 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 the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
+ * 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 the Free Software Foundation; either =
version
+ * 2 of the License, or (at your option) any later =
version.
*
- * Version : 0.92
+ * Version : 0.93
*=20
* Description: Linux device driver for AMI MegaRAID controller
*
+ * Supported controllers: MegaRAID 418, 428, 438, 466
+ *=20
+ * Maintainer: Jeff L Jones <jeffreyj@ami.com>
+ *
* History:
*
* Version 0.90:
- * Works and has been tested with the MegaRAID 428 controller, and
- * the MegaRAID 438 controller. Probably works with the 466 also,
- * but not tested.
+ * Original source contributed by Dell; integrated it into the =
kernel and
+ * cleaned up some things. Added support for 438/466 controllers.
*
* Version 0.91:
* Aligned mailbox area on 16-byte boundry.
@@ -35,26 +38,34 @@
* Removed setting of SA_INTERRUPT flag when requesting Irq.
*
* Version 0.92ac:
- * Small changes to the comments/formatting. Plus a couple of
- * added notes. Returned to the authors. No actual code changes
- * save printk levels.
- * 8 Oct 98 Alan Cox <alan.cox@linux.org>
+ * Small changes to the comments/formatting. Plus a couple of
+ * added notes. Returned to the authors. No actual code changes
+ * save printk levels.
+ * 8 Oct 98 Alan Cox <alan.cox@linux.org>
*
* Merged with 2.1.131 source tree.
- * 12 Dec 98 K. Baranowski <kgb@knm.org.pl>
+ * 12 Dec 98 K. Baranowski <kgb@knm.org.pl> =
=20
+ *
+ * Version 0.93:
+ * Added support for vendor specific ioctl commands (0x80+xxh)
+ * Changed some fields in MEGARAID struct to better values.
+ * Added signature check for Rp controllers under 2.0 kernels
+ * Changed busy-wait loop to be time-based
+ * Fixed SMP race condition in isr
+ * Added kfree (sgList) on release
+ * Added #include linux/version.h to megaraid.h for hosts.h
+ * Changed max_id to represent max logical drives instead of =
targets.
+ *
*
* BUGS:
- * Tested with 2.1.90, but unfortunately there is a bug in pci.c =
which
- * fails to detect our controller. Does work with 2.1.118--don't =
know
- * which kernel in between it was fixed in.
+ * Some older 2.1 kernels (eg. 2.1.90) have a bug in pci.c that
+ * fails to detect the controller as a pci device on the system.
*
=
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
-#define QISR 1
=20
#define CRLFSTR "\n"
=20
-#define MULTIQ 1
-
+#include <linux/config.h>
#include <linux/version.h>
=20
#ifdef MODULE
@@ -63,10 +74,8 @@
#if LINUX_VERSION_CODE >=3D 0x20100
char kernel_version[] =3D UTS_RELEASE;
=20
-/* originally ported by Dell Corporation; updated, released, and =
maintained by
- American Megatrends */
-MODULE_AUTHOR("American Megatrends Inc.");=20
-MODULE_DESCRIPTION("AMI MegaRAID driver"); =20
+MODULE_AUTHOR ("American Megatrends Inc.");
+MODULE_DESCRIPTION ("AMI MegaRAID driver");
#endif
#endif
=20
@@ -88,6 +97,7 @@
#include <linux/sched.h>
#include <linux/stat.h>
#include <linux/malloc.h> /* for kmalloc() */
+#include <linux/config.h> /* for CONFIG_PCI */
#if LINUX_VERSION_CODE < 0x20100
#include <linux/bios32.h>
#else
@@ -103,18 +113,21 @@
=20
#include "megaraid.h"
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
- *
- * #Defines
- *
- =
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+//
+// #Defines
+//
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
=20
#if LINUX_VERSION_CODE < 0x020100
#define ioremap vremap
#define iounmap vfree
=20
/* simulate spin locks */
-typedef struct {volatile char lock;} spinlock_t;
+typedef struct {
+ volatile char lock;
+} spinlock_t;
+
#define spin_lock_init(x) { (x)->lock =3D 0;}
#define spin_lock_irqsave(x,flags) { while ((x)->lock) barrier();\
(x)->lock=3D1; =
save_flags(flags);\
@@ -149,125 +162,124 @@
spin_unlock_irqrestore(&mega_lock,cpuflag);\
};
=20
-u_long RDINDOOR(mega_host_config *megaCfg)
+u_long RDINDOOR (mega_host_config * megaCfg)
{
- return readl(megaCfg->base + 0x20);
+ return readl (megaCfg->base + 0x20);
}
=20
-void WRINDOOR(mega_host_config *megaCfg, u_long value)
+void WRINDOOR (mega_host_config * megaCfg, u_long value)
{
- writel(value,megaCfg->base+0x20);
+ writel (value, megaCfg->base + 0x20);
}
=20
-u_long RDOUTDOOR(mega_host_config *megaCfg)
+u_long RDOUTDOOR (mega_host_config * megaCfg)
{
- return readl(megaCfg->base+0x2C);
+ return readl (megaCfg->base + 0x2C);
}
=20
-void WROUTDOOR(mega_host_config *megaCfg, u_long value)
+void WROUTDOOR (mega_host_config * megaCfg, u_long value)
{
- writel(value,megaCfg->base+0x2C);
+ writel (value, megaCfg->base + 0x2C);
}
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
- *
- * Function prototypes
- *
- =
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
-static int MegaIssueCmd(mega_host_config *megaCfg,
- u_char *mboxData,
- mega_scb *scb,
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+//
+// Function prototypes
+//
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+static int MegaIssueCmd (mega_host_config * megaCfg,
+ u_char * mboxData,
+ mega_scb * scb,
int intr);
-static int build_sglist(mega_host_config *megaCfg, mega_scb *scb,=20
- u_long *buffer, u_long *length);
+static int build_sglist (mega_host_config * megaCfg, mega_scb * scb,
+ u_long * buffer, u_long * length);
=20
-static void mega_runque(void *);
-static void mega_rundoneq(void);
-static void mega_cmd_done(mega_host_config *,mega_scb *, int);
+static void mega_runque (void *);
+static void mega_rundoneq (void);
+static void mega_cmd_done (mega_host_config *, mega_scb *, int);
+static mega_scb *mega_ioctl (mega_host_config * megaCfg, Scsi_Cmnd * =
SCpnt);
=20
/* set SERDEBUG to 1 to enable serial debugging */
#define SERDEBUG 0
#if SERDEBUG
-static void ser_init(void);
-static void ser_puts(char *str);
-static void ser_putc(char c);
-static int ser_printk(const char *fmt, ...);
+static void ser_init (void);
+static void ser_puts (char *str);
+static void ser_putc (char c);
+static int ser_printk (const char *fmt,...);
#endif
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
- *
- * Global variables
- *
- =
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
-static int numCtlrs =3D 0;
-static mega_host_config *megaCtlrs[4] =3D { 0 };
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+//
+// Global variables
+//
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+static int numCtlrs =3D 0;
+static mega_host_config *megaCtlrs[12] =3D {0};
=20
/* Change this to 0 if you want to see the raw drives */
-static int use_raid =3D 1;
+static int use_raid =3D 1;
=20
/* Queue of pending/completed SCBs */
-static mega_scb *qPending =3D NULL;
+static mega_scb *qPending =3D NULL;
static Scsi_Cmnd *qCompleted =3D NULL;
=20
volatile static spinlock_t mega_lock;
-static struct tq_struct runq =3D {0,0,mega_runque,NULL};
+static struct tq_struct runq =3D {0, 0, mega_runque, NULL};
=20
-struct proc_dir_entry proc_scsi_megaraid =3D {
+struct proc_dir_entry proc_scsi_megaraid =3D
+{
PROC_SCSI_MEGARAID, 8, "megaraid",
S_IFDIR | S_IRUGO | S_IXUGO, 2
};
=20
#if SERDEBUG
-static char strbuf[MAX_SERBUF+1];
+static char strbuf[MAX_SERBUF + 1];
=20
-static void ser_init()
+static void ser_init ()
{
- unsigned port=3DCOM_BASE;
+ unsigned port =3D COM_BASE;
=20
- outb(0x80,port+3);
- outb(0,port+1);
- /* 9600 Baud, if 19200: outb(6,port) */
- outb(12, port);
- outb(3,port+3);
- outb(0,port+1);
+ outb (0x80, port + 3);
+ outb (0, port + 1);
+ /* 9600 Baud, if 19200: outb(6,port) */
+ outb (12, port);
+ outb (3, port + 3);
+ outb (0, port + 1);
}
=20
-static void ser_puts(char *str)
+static void ser_puts (char *str)
{
- char *ptr;
+ char *ptr;
=20
- ser_init();
- for (ptr=3Dstr;*ptr;++ptr)
- ser_putc(*ptr);
+ ser_init ();
+ for (ptr =3D str; *ptr; ++ptr)
+ ser_putc (*ptr);
}
=20
-static void ser_putc(char c)
+static void ser_putc (char c)
{
- unsigned port=3DCOM_BASE;
+ unsigned port =3D COM_BASE;
=20
- while ((inb(port+5) & 0x20)=3D=3D0);
- outb(c,port);
- if (c=3D=3D0x0a)
- {
- while ((inb(port+5) & 0x20)=3D=3D0);
- outb(0x0d,port);
- }
+ while ((inb (port + 5) & 0x20) =3D=3D 0);
+ outb (c, port);
+ if (c =3D=3D 0x0a) {
+ while ((inb (port + 5) & 0x20) =3D=3D 0);
+ outb (0x0d, port);
+ }
}
=20
-static int ser_printk(const char *fmt, ...)
+static int ser_printk (const char *fmt,...)
{
- va_list args;
- int i;
- long flags;
+ va_list args;
+ int i;
+ long flags;
=20
- spin_lock_irqsave(mega_lock,flags);
- va_start(args,fmt);
- i =3D vsprintf(strbuf,fmt,args);
- ser_puts(strbuf);
- va_end(args);
- spin_unlock_irqrestore(&mega_lock,flags);
+ va_start (args, fmt);
+ i =3D vsprintf (strbuf, fmt, args);
+ ser_puts (strbuf);
+ va_end (args);
=20
- return i;
+ return i;
}
=20
#define TRACE(a) { ser_printk a;}
@@ -276,14 +288,14 @@
#define TRACE(A)
#endif
=20
-void callDone(Scsi_Cmnd *SCpnt)
+void callDone (Scsi_Cmnd * SCpnt)
{
if (SCpnt->result) {
- TRACE(("*** %.08lx %.02x <%d.%d.%d> =3D %x\n", =
SCpnt->serial_number,=20
- SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, SCpnt->lun,=20
- SCpnt->result));
+ TRACE (("*** %.08lx %.02x <%d.%d.%d> =3D %x\n", =
SCpnt->serial_number,
+ SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, SCpnt->lun,
+ SCpnt->result));
}
- SCpnt->scsi_done(SCpnt);
+ SCpnt->scsi_done (SCpnt);
}
=20
=
/*----------------------------------------------------------------------=

---
@@ -292,82 +304,79 @@
  *
  =
*-----------------------------------------------------------------------=
--*/
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
- * Initialize SCB structures
- =
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
*/
-static void initSCB(mega_host_config *megaCfg)
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
+// Initialize SCB structures
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
+static void initSCB (mega_host_config * megaCfg)
 {
   int idx;
=20
-  for(idx=3D0; idx<megaCfg->max_cmds; idx++) {
-    megaCfg->scbList[idx].idx    =3D -1;
-    megaCfg->scbList[idx].flag   =3D 0;
+  for (idx =3D 0; idx < megaCfg->max_cmds; idx++) {
+    megaCfg->scbList[idx].idx =3D -1;
+    megaCfg->scbList[idx].flag =3D 0;
     megaCfg->scbList[idx].sgList =3D NULL;
-    megaCfg->scbList[idx].SCpnt  =3D NULL;
+    megaCfg->scbList[idx].SCpnt =3D NULL;
   }
 }
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
- * Allocate a SCB structure
- =
*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D*/
-static mega_scb *allocateSCB(mega_host_config *megaCfg,Scsi_Cmnd =
*SCpnt)
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
+// Allocate a SCB structure
+//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
+static mega_scb * allocateSCB (mega_host_config * megaCfg, Scsi_Cmnd * =
SCpnt)
 {
-  int        idx;
-  long       flags;
+  int idx;
+  long flags;
=20
-  spin_lock_irqsave(&mega_lock,flags);
-  for(idx=3D0; idx<megaCfg->max_cmds; idx++) {
+  spin_lock_irqsave (&mega_lock, flags);
+  for (idx =3D 0; idx < megaCfg->max_cmds; idx++) {
     if (megaCfg->scbList[idx].idx < 0) {
=20
-      /* Set Index and SCB pointer */=20
-      megaCfg->scbList[idx].flag  =3D 0;
-      megaCfg->scbList[idx].idx   =3D idx;
+      /* Set Index and SCB pointer */
+      megaCfg->scbList[idx].flag =3D 0;
+      megaCfg->scbList[idx].idx =3D idx;
       megaCfg->scbList[idx].SCpnt =3D SCpnt;
-      megaCfg->scbList[idx].next  =3D NULL;
-      spin_unlock_irqrestore(&mega_lock,flags);
+      megaCfg->scbList[idx].next =3D NULL;
+      spin_unlock_irqrestore (&mega_lock, flags);
=20
       if (megaCfg->scbList[idx].sgList =3D=3D NULL) {
 	megaCfg->scbList[idx].sgList =3D
-                  =
kmalloc(sizeof(mega_sglist)*MAX_SGLIST,GFP_ATOMIC|GFP_DMA);
+	  kmalloc (sizeof (mega_sglist) * MAX_SGLIST, GFP_ATOMIC | GFP_DMA);
       }
=20
       return &megaCfg->scbList[idx];
     }
   }
-  spin_unlock_irqrestore(&mega_lock,flags);
+  spin_unlock_irqrestore (&mega_lock, flags);
+
+  printk (KERN_WARNING "Megaraid: Could not allocate free SCB!!!\n");
=20
-  printk(KERN_WARNING "Megaraid: Could not allocate free SCB!!!\n");
- =20
   return NULL;
 }
=20
-/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=

- * Free a SCB structure - = *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/=

-static void freeSCB(mega_scb *scb) -{ - long flags; - - spin_lock_irqsave(&mega_lock,flags); - scb->flag =3D 0; - scb->idx =3D -1; - scb->next =3D NULL; +//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=

+// Free a SCB structure +//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=

+static void freeSCB (mega_scb * scb) +{ + scb->flag =3D 0; + scb->idx =3D -1; + scb->next =3D NULL; scb->SCpnt =3D NULL; - spin_unlock_irqrestore(&mega_lock,flags); } =20 /* Run through the list of completed requests */ -static void mega_rundoneq() +static void mega_rundoneq () { mega_host_config *megaCfg; - Scsi_Cmnd *SCpnt; - long islogical; + Scsi_Cmnd *SCpnt; + long islogical; =20 - while(1) { - DEQUEUE(SCpnt, Scsi_Cmnd, qCompleted, host_scribble); - if (SCpnt =3D=3D NULL) return; + while (1) { + DEQUEUE (SCpnt, Scsi_Cmnd, qCompleted, host_scribble); + if (SCpnt =3D=3D NULL) + return; =20 - megaCfg =3D (mega_host_config *)SCpnt->host->hostdata; + megaCfg =3D (mega_host_config *) SCpnt->host->hostdata; =20 /* Check if we're allowing access to RAID drives or physical * if use_raid =3D=3D 1 and this wasn't a disk on the max channel = or @@ -376,14 +385,15 @@ */ islogical =3D (SCpnt->channel =3D=3D megaCfg->host->max_channel) ? = 1 : 0; if (SCpnt->cmnd[0] =3D=3D INQUIRY && - ((((u_char*)SCpnt->request_buffer)[0] & 0x1F) =3D=3D TYPE_DISK) && + ((((u_char *) SCpnt->request_buffer)[0] & 0x1F) =3D=3D TYPE_DISK) && (islogical !=3D use_raid)) { - SCpnt->result =3D 0xF0; + SCpnt->result =3D 0xF0; } =20 /* Convert result to error */ - switch(SCpnt->result) { - case 0x00: case 0x02: + switch (SCpnt->result) { + case 0x00: + case 0x02: SCpnt->result |=3D (DID_OK << 16); break; case 0x8: @@ -395,16 +405,20 @@ } =20 /* Callback */ - callDone(SCpnt); + callDone (SCpnt); } } =20 /* Add command to the list of completed requests */ -static void mega_cmd_done(mega_host_config *megaCfg,mega_scb *pScb, = int status) +static void mega_cmd_done (mega_host_config * megaCfg, mega_scb * = pScb, int status) { + long flags; + pScb->SCpnt->result =3D status; - ENQUEUE(pScb->SCpnt, Scsi_Cmnd, qCompleted, host_scribble); - freeSCB(pScb); + ENQUEUE (pScb->SCpnt, Scsi_Cmnd, qCompleted, host_scribble); + spin_lock_irqsave (&mega_lock, flags); + freeSCB (pScb); + spin_unlock_irqrestore (&mega_lock, flags); } =20 /*---------------------------------------------------- @@ -412,42 +426,42 @@ * * Run as a scheduled task=20 *----------------------------------------------------*/ -static void mega_runque(void *dummy) +static void mega_runque (void *dummy) { mega_host_config *megaCfg; - mega_scb *pScb; - long flags; + mega_scb *pScb; + long flags; =20 /* Take care of any completed requests */ - mega_rundoneq(); + mega_rundoneq (); =20 - DEQUEUE(pScb,mega_scb,qPending,next); + DEQUEUE (pScb, mega_scb, qPending, next); =20 if (pScb) { - megaCfg =3D (mega_host_config *)pScb->SCpnt->host->hostdata; + megaCfg =3D (mega_host_config *) pScb->SCpnt->host->hostdata; =20 - if (megaCfg->mbox->busy || megaCfg->flag & (IN_ISR|PENDING)) { - TRACE(("%.08lx %.02x <%d.%d.%d> intr%d busy%d isr%d = pending%d\n", - pScb->SCpnt->serial_number, - pScb->SCpnt->cmnd[0], - pScb->SCpnt->channel, - pScb->SCpnt->target, - pScb->SCpnt->lun, - intr_count, - megaCfg->mbox->busy, - (megaCfg->flag & IN_ISR) ? 1 : 0, - (megaCfg->flag & PENDING) ? 1 : 0)); + if (megaCfg->mbox->busy || megaCfg->flag & (IN_ISR | PENDING)) { + TRACE (("%.08lx %.02x <%d.%d.%d> busy%d isr%d pending%d\n", + pScb->SCpnt->serial_number, + pScb->SCpnt->cmnd[0], + pScb->SCpnt->channel, + pScb->SCpnt->target, + pScb->SCpnt->lun, + megaCfg->mbox->busy, + (megaCfg->flag & IN_ISR) ? 1 : 0, + (megaCfg->flag & PENDING) ? 1 : 0)); } =20 - if (MegaIssueCmd(megaCfg, pScb->mboxData, pScb, 1)) { + if (MegaIssueCmd (megaCfg, pScb->mboxData, pScb, 1)) { /* We're BUSY... come back later */ - spin_lock_irqsave(&mega_lock,flags); + spin_lock_irqsave (&mega_lock, flags); pScb->next =3D qPending; - qPending =3D pScb; - spin_unlock_irqrestore(&mega_lock,flags); + qPending =3D pScb; + spin_unlock_irqrestore (&mega_lock, flags); =20 - if (!(megaCfg->flag & PENDING)) { /* If PENDING, irq will = schedule task */ - queue_task(&runq, &tq_scheduler); + if (!(megaCfg->flag & PENDING)) { + /* If PENDING, irq will schedule task */ + queue_task (&runq, &tq_scheduler); } } } @@ -461,17 +475,20 @@ * If NULL is returned, the scsi_done function MUST have been called * = *-------------------------------------------------------------------*/ -static mega_scb *mega_build_cmd(mega_host_config *megaCfg, Scsi_Cmnd = *SCpnt) +static mega_scb * mega_build_cmd (mega_host_config * megaCfg, = Scsi_Cmnd * SCpnt) { - mega_scb *pScb; - mega_mailbox *mbox; + mega_scb *pScb; + mega_mailbox *mbox; mega_passthru *pthru; - long seg; + long seg; + + if (SCpnt->cmnd[0] & 0x80) /* ioctl from megamgr */ + return mega_ioctl (megaCfg, SCpnt); =20 /* We don't support multi-luns */ if (SCpnt->lun !=3D 0) { SCpnt->result =3D (DID_BAD_TARGET << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; } =20 @@ -481,44 +498,44 @@ * *-----------------------------------------------------*/ if (SCpnt->channel =3D=3D megaCfg->host->max_channel) { - switch(SCpnt->cmnd[0]) { + switch (SCpnt->cmnd[0]) { case TEST_UNIT_READY: - memset(SCpnt->request_buffer, 0, SCpnt->request_bufflen); + memset (SCpnt->request_buffer, 0, SCpnt->request_bufflen); SCpnt->result =3D (DID_OK << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; =20 case MODE_SENSE: - memset(SCpnt->request_buffer, 0, SCpnt->cmnd[4]); + memset (SCpnt->request_buffer, 0, SCpnt->cmnd[4]); SCpnt->result =3D (DID_OK << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; =20 case READ_CAPACITY: case INQUIRY: /* Allocate a SCB and initialize passthru */ - if ((pScb =3D allocateSCB(megaCfg,SCpnt)) =3D=3D NULL) { + if ((pScb =3D allocateSCB (megaCfg, SCpnt)) =3D=3D NULL) { SCpnt->result =3D (DID_ERROR << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; } pthru =3D &pScb->pthru; - mbox =3D (mega_mailbox *)&pScb->mboxData; + mbox =3D (mega_mailbox *) & pScb->mboxData; =20 - memset(mbox, 0, sizeof(pScb->mboxData)); - memset(pthru, 0, sizeof(mega_passthru)); - pthru->timeout =3D 0; - pthru->ars =3D 0; - pthru->islogical =3D 1; - pthru->logdrv =3D SCpnt->target; - pthru->cdblen =3D SCpnt->cmd_len; - pthru->dataxferaddr =3D virt_to_bus(SCpnt->request_buffer); - pthru->dataxferlen =3D SCpnt->request_bufflen; - memcpy(pthru->cdb, SCpnt->cmnd, SCpnt->cmd_len); + memset (mbox, 0, sizeof (pScb->mboxData)); + memset (pthru, 0, sizeof (mega_passthru)); + pthru->timeout =3D 0; + pthru->ars =3D 0; + pthru->islogical =3D 1; + pthru->logdrv =3D SCpnt->target; + pthru->cdblen =3D SCpnt->cmd_len; + pthru->dataxferaddr =3D virt_to_bus (SCpnt->request_buffer); + pthru->dataxferlen =3D SCpnt->request_bufflen; + memcpy (pthru->cdb, SCpnt->cmnd, SCpnt->cmd_len); =20 /* Initialize mailbox area */ - mbox->cmd =3D MEGA_MBOXCMD_PASSTHRU; - mbox->xferaddr =3D virt_to_bus(pthru); + mbox->cmd =3D MEGA_MBOXCMD_PASSTHRU; + mbox->xferaddr =3D virt_to_bus (pthru); =20 return pScb; =20 @@ -527,51 +544,51 @@ case READ_10: case WRITE_10: /* Allocate a SCB and initialize mailbox */ - if ((pScb =3D allocateSCB(megaCfg,SCpnt)) =3D=3D NULL) { + if ((pScb =3D allocateSCB (megaCfg, SCpnt)) =3D=3D NULL) { SCpnt->result =3D (DID_ERROR << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; } - mbox =3D (mega_mailbox *)&pScb->mboxData; + mbox =3D (mega_mailbox *) & pScb->mboxData; =20 - memset(mbox, 0, sizeof(pScb->mboxData)); + memset (mbox, 0, sizeof (pScb->mboxData)); mbox->logdrv =3D SCpnt->target; - mbox->cmd =3D (*SCpnt->cmnd =3D=3D READ_6 || *SCpnt->cmnd = =3D=3D READ_10) ? + mbox->cmd =3D (*SCpnt->cmnd =3D=3D READ_6 || *SCpnt->cmnd =3D=3D = READ_10) ? MEGA_MBOXCMD_LREAD : MEGA_MBOXCMD_LWRITE; - =20 + /* 6-byte */ if (*SCpnt->cmnd =3D=3D READ_6 || *SCpnt->cmnd =3D=3D WRITE_6) { - mbox->numsectors =3D=20 - (u_long)SCpnt->cmnd[4]; - mbox->lba =3D=20 - ((u_long)SCpnt->cmnd[1] << 16) | - ((u_long)SCpnt->cmnd[2] << 8) | - (u_long)SCpnt->cmnd[3]; + mbox->numsectors =3D + (u_long) SCpnt->cmnd[4]; + mbox->lba =3D + ((u_long) SCpnt->cmnd[1] << 16) | + ((u_long) SCpnt->cmnd[2] << 8) | + (u_long) SCpnt->cmnd[3]; mbox->lba &=3D 0x1FFFFF; } - =20 + /* 10-byte */ if (*SCpnt->cmnd =3D=3D READ_10 || *SCpnt->cmnd =3D=3D WRITE_10) = { - mbox->numsectors =3D=20 - (u_long)SCpnt->cmnd[8] | - ((u_long)SCpnt->cmnd[7] << 8); + mbox->numsectors =3D + (u_long) SCpnt->cmnd[8] | + ((u_long) SCpnt->cmnd[7] << 8); mbox->lba =3D - ((u_long)SCpnt->cmnd[2] << 24) | - ((u_long)SCpnt->cmnd[3] << 16) | - ((u_long)SCpnt->cmnd[4] << 8) | - (u_long)SCpnt->cmnd[5]; + ((u_long) SCpnt->cmnd[2] << 24) | + ((u_long) SCpnt->cmnd[3] << 16) | + ((u_long) SCpnt->cmnd[4] << 8) | + (u_long) SCpnt->cmnd[5]; } - =20 + /* Calculate Scatter-Gather info */ - mbox->numsgelements =3D build_sglist(megaCfg, pScb,=20 - (u_long*)&mbox->xferaddr, - (u_long*)&seg); + mbox->numsgelements =3D build_sglist (megaCfg, pScb, + (u_long *) & mbox->xferaddr, + (u_long *) & seg); =20 return pScb; - =20 + default: SCpnt->result =3D (DID_BAD_TARGET << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; } } @@ -582,31 +599,31 @@ *-----------------------------------------------------*/ else { /* Allocate a SCB and initialize passthru */ - if ((pScb =3D allocateSCB(megaCfg,SCpnt)) =3D=3D NULL) { + if ((pScb =3D allocateSCB (megaCfg, SCpnt)) =3D=3D NULL) { SCpnt->result =3D (DID_ERROR << 16); - callDone(SCpnt); + callDone (SCpnt); return NULL; } pthru =3D &pScb->pthru; - mbox =3D (mega_mailbox *)pScb->mboxData; - =20 - memset(mbox, 0, sizeof(pScb->mboxData)); - memset(pthru, 0, sizeof(mega_passthru)); - pthru->timeout =3D 0; - pthru->ars =3D 0; + mbox =3D (mega_mailbox *) pScb->mboxData; + + memset (mbox, 0, sizeof (pScb->mboxData)); + memset (pthru, 0, sizeof (mega_passthru)); + pthru->timeout =3D 0; + pthru->ars =3D 0; pthru->islogical =3D 0; - pthru->channel =3D SCpnt->channel; - pthru->target =3D SCpnt->target; - pthru->cdblen =3D SCpnt->cmd_len; - memcpy(pthru->cdb, SCpnt->cmnd, SCpnt->cmd_len); - =20 - pthru->numsgelements =3D build_sglist(megaCfg, pScb, - (u_long *)&pthru->dataxferaddr, - (u_long *)&pthru->dataxferlen); - =20 + pthru->channel =3D SCpnt->channel; + pthru->target =3D SCpnt->target; + pthru->cdblen =3D SCpnt->cmd_len; + memcpy (pthru->cdb, SCpnt->cmnd, SCpnt->cmd_len); + + pthru->numsgelements =3D build_sglist (megaCfg, pScb, + (u_long *) & pthru->dataxferaddr, + (u_long *) & pthru->dataxferlen); + /* Initialize mailbox */ - mbox->cmd =3D MEGA_MBOXCMD_PASSTHRU; - mbox->xferaddr =3D virt_to_bus(pthru); + mbox->cmd =3D MEGA_MBOXCMD_PASSTHRU; + mbox->xferaddr =3D virt_to_bus (pthru); =20 return pScb; } @@ -614,88 +631,163 @@ } =20 /*-------------------------------------------------------------------- + * build RAID commands for controller, passed down through ioctl() + = *--------------------------------------------------------------------*/ +static mega_scb * mega_ioctl (mega_host_config * megaCfg, Scsi_Cmnd * = SCpnt) +{ + mega_scb *pScb; + mega_ioctl_mbox *mbox; + mega_mailbox *mailbox; + mega_passthru *pthru; + long seg; + + if ((pScb =3D allocateSCB (megaCfg, SCpnt)) =3D=3D NULL) { + SCpnt->result =3D (DID_ERROR << 16); + callDone (SCpnt); + return NULL; + } + + mbox =3D (mega_ioctl_mbox *) & pScb->mboxData; + mailbox =3D (mega_mailbox *) & pScb->mboxData; + memset (mailbox, 0, sizeof (pScb->mboxData)); + + if (SCpnt->cmnd[0] =3D=3D 0x83) { /* passthrough command */ + char cdblen =3D SCpnt->cmnd[2]; + + pthru =3D &pScb->pthru; + memset (pthru, 0, sizeof (mega_passthru)); + pthru->islogical =3D SCpnt->cmnd[cdblen + 3] & 0x80; + pthru->timeout =3D SCpnt->cmnd[cdblen + 3] & 0x07; + pthru->reqsenselen =3D 10; /* ? MAX_SENSE; */ + pthru->ars =3D SCpnt->cmnd[cdblen + 3] & 0x08; + pthru->logdrv =3D SCpnt->cmnd[cdblen + 4]; + pthru->channel =3D SCpnt->cmnd[cdblen + 5]; + pthru->target =3D SCpnt->cmnd[cdblen + 6]; + pthru->cdblen =3D cdblen; + memcpy (pthru->cdb, SCpnt->cmnd, SCpnt->cmnd[2]); + + mailbox->cmd =3D MEGA_MBOXCMD_PASSTHRU; + mailbox->xferaddr =3D virt_to_bus (pthru); + + pthru->numsgelements =3D build_sglist (megaCfg, pScb, + (u_long *) & pthru->dataxferaddr, + (u_long *) & pthru->dataxferlen); + + return pScb; + } + /* else normal (nonpassthru) command */ + + mbox->cmd =3D SCpnt->cmnd[0] & 0x7F; + mbox->channel =3D SCpnt->cmnd[1]; + mbox->param =3D SCpnt->cmnd[2]; + mbox->pad[0] =3D SCpnt->cmnd[3]; + mbox->logdrv =3D SCpnt->cmnd[4]; + + mbox->numsgelements =3D build_sglist (megaCfg, pScb, + (u_long *) & mbox->xferaddr, + (u_long *) & seg); + + return (pScb); +} + + +/*-------------------------------------------------------------------- * Interrupt service routine = *--------------------------------------------------------------------*/ -static void megaraid_isr(int irq, void *devp, struct pt_regs *regs) +static void megaraid_isr (int irq, void *devp, struct pt_regs *regs) { - mega_host_config *megaCfg; - u_char byte, idx, sIdx; - u_long dword; - mega_mailbox *mbox; - mega_scb *pScb; - long flags; - int qCnt, qStatus; + mega_host_config *megaCfg; + u_char byte, idx, sIdx; + u_long dword; + mega_mailbox *mbox; + mega_scb *pScb; + long flags; + int qCnt, qStatus; =20 - megaCfg =3D (mega_host_config *)devp; - mbox =3D (mega_mailbox *)megaCfg->mbox; + megaCfg =3D (mega_host_config *) devp; + mbox =3D (mega_mailbox *) megaCfg->mbox; =20 if (megaCfg->host->irq =3D=3D irq) { - spin_lock_irqsave(&mega_lock,flags); + +#if LINUX_VERSION_CODE >=3D 0x20100 + spin_lock_irqsave (&io_request_lock, flags); +#endif + + spin_lock_irqsave (&mega_lock, flags); =20 if (megaCfg->flag & IN_ISR) { - TRACE(("ISR called reentrantly!!\n")); + TRACE (("ISR called reentrantly!!\n")); } =20 megaCfg->flag |=3D IN_ISR; =20 /* Check if a valid interrupt is pending */ if (megaCfg->flag & BOARD_QUARTZ) { - dword =3D RDOUTDOOR(megaCfg); - if (dword !=3D 0x10001234) { - /* Spurious interrupt */ - megaCfg->flag &=3D ~IN_ISR; - spin_unlock_irqrestore(&mega_lock,flags); - return; - } - WROUTDOOR(megaCfg,dword); - } else { - byte =3D READ_PORT(megaCfg->host->io_port, INTR_PORT); - if ((byte & VALID_INTR_BYTE) =3D=3D 0) { - /* Spurious interrupt */ - megaCfg->flag &=3D ~IN_ISR; - spin_unlock_irqrestore(&mega_lock,flags); - return; - } - WRITE_PORT(megaCfg->host->io_port, INTR_PORT, byte); + dword =3D RDOUTDOOR (megaCfg); + if (dword !=3D 0x10001234) { + /* Spurious interrupt */ + megaCfg->flag &=3D ~IN_ISR; + spin_unlock_irqrestore (&mega_lock, flags); +#if LINUX_VERSION_CODE >=3D 0x20100 + spin_unlock_irqrestore (&io_request_lock, flags); +#endif + return; + } + WROUTDOOR (megaCfg, dword); + } + else { + byte =3D READ_PORT (megaCfg->host->io_port, INTR_PORT); + if ((byte & VALID_INTR_BYTE) =3D=3D 0) { + /* Spurious interrupt */ + megaCfg->flag &=3D ~IN_ISR; + spin_unlock_irqrestore (&mega_lock, flags); +#if LINUX_VERSION_CODE >=3D 0x20100 + spin_unlock_irqrestore (&io_request_lock, flags); +#endif + return; + } + WRITE_PORT (megaCfg->host->io_port, INTR_PORT, byte); } - =20 - qCnt =3D mbox->numstatus; + + qCnt =3D mbox->numstatus; qStatus =3D mbox->status; =20 - if (qCnt > 1) {TRACE(("ISR: Received %d status\n", qCnt)) - printk(KERN_DEBUG "Got numstatus =3D %d\n",qCnt); + if (qCnt > 1) { + TRACE (("ISR: Received %d status\n", qCnt)) + printk (KERN_DEBUG "Got numstatus =3D %d\n", qCnt); } - =20 - for(idx=3D0; idx<qCnt; idx++) { + + for (idx =3D 0; idx < qCnt; idx++) { sIdx =3D mbox->completed[idx]; if (sIdx > 0) { - pScb =3D &megaCfg->scbList[sIdx-1]; - spin_unlock_irqrestore(&mega_lock,flags); /* locks within = cmd_done */ - mega_cmd_done(megaCfg,&megaCfg->scbList[sIdx-1], qStatus); - spin_lock_irqsave(&mega_lock,flags); + pScb =3D &megaCfg->scbList[sIdx - 1]; + spin_unlock_irqrestore (&mega_lock, flags); /* megalock within = cmd_done */ + mega_cmd_done (megaCfg, &megaCfg->scbList[sIdx - 1], qStatus); + spin_lock_irqsave (&mega_lock, flags); } } if (megaCfg->flag & BOARD_QUARTZ) { - WRINDOOR(megaCfg,virt_to_bus(megaCfg->mbox)|0x2); - while (RDINDOOR(megaCfg) & 0x02); - } else { - CLEAR_INTR(megaCfg->host->io_port); + WRINDOOR (megaCfg, virt_to_bus (megaCfg->mbox) | 0x2); + while (RDINDOOR (megaCfg) & 0x02); + } + else { + CLEAR_INTR (megaCfg->host->io_port); } =20 megaCfg->flag &=3D ~IN_ISR; megaCfg->flag &=3D ~PENDING; =20 - spin_unlock_irqrestore(&mega_lock,flags); + spin_unlock_irqrestore (&mega_lock, flags); + mega_runque (NULL); =20 - spin_lock_irqsave(&io_request_lock, flags); - mega_runque(NULL); - spin_unlock_irqrestore(&io_request_lock,flags); =20 +#if LINUX_VERSION_CODE >=3D 0x20100 + spin_unlock_irqrestore (&io_request_lock, flags); +#endif =20 #if 0 /* Queue as a delayed ISR routine */ - queue_task_irq_off(&runq, &tq_immediate); - mark_bh(IMMEDIATE_BH); - spin_unlock_irqrestore(&mega_lock,flags); + queue_task_irq_off (&runq, &tq_immediate); + mark_bh (IMMEDIATE_BH); #endif =20 } @@ -704,111 +796,128 @@ = /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D*/ /* Wait until the controller's mailbox is available */ = /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D*/ -static int busyWaitMbox(mega_host_config *megaCfg) +static int busyWaitMbox (mega_host_config * megaCfg) { - mega_mailbox *mbox =3D (mega_mailbox *)megaCfg->mbox; - long counter; + mega_mailbox *mbox =3D (mega_mailbox *) megaCfg->mbox; + long counter; =20 - for(counter=3D0; counter<0xFFFFFF; counter++) { - if (!mbox->busy) return 0; + for (counter =3D 0; counter < 30000; counter++) { + udelay (100); + if (!mbox->busy) + return 0; } - return -1; -} - -/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D - * Post a command to the card - * - * Arguments: - * mega_host_config *megaCfg - Controller structure - * u_char *mboxData - Mailbox area, 16 bytes - * mega_scb *pScb - SCB posting (or NULL if N/A) - * int intr - if 1, interrupt, 0 is blocking - = *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D*/ -static int MegaIssueCmd(mega_host_config *megaCfg, - u_char *mboxData, - mega_scb *pScb, - int intr) -{ - mega_mailbox *mbox =3D (mega_mailbox *)megaCfg->mbox; - long flags; - u_char byte; - u_long cmdDone; + return -1; /* give up after 3 seconds */ +} =20 - mboxData[0x1] =3D (pScb ? pScb->idx+1 : 0x00); /* Set cmdid */ - mboxData[0xF] =3D 1; /* Set busy */ +//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D +// Post a command to the card +// +// Arguments: +// mega_host_config *megaCfg - Controller structure +// u_char *mboxData - Mailbox area, 16 bytes +// mega_scb *pScb - SCB posting (or NULL if N/A) +// int intr - if 1, interrupt, 0 is blocking +//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D +static int MegaIssueCmd (mega_host_config * megaCfg, + u_char * mboxData, + mega_scb * pScb, + int intr) +{ + mega_mailbox *mbox =3D (mega_mailbox *) megaCfg->mbox; + long flags; + u_char byte; + u_long cmdDone; + + mboxData[0x1] =3D (pScb ? pScb->idx + 1 : 0x00); /* Set cmdid */ + mboxData[0xF] =3D 1; /* Set busy */ + + spin_lock_irqsave(&mega_lock,flags); =20 /* one bad report of problem when issuing a command while pending. * Wasn't able to duplicate, but it doesn't really affect = performance * anyway, so don't allow command while PENDING */ + if (megaCfg->flag & PENDING) { + spin_unlock_irqrestore(&mega_lock,flags); return -1; } =20 /* Wait until mailbox is free */ - if (busyWaitMbox(megaCfg)) { + if (busyWaitMbox (megaCfg)) { if (pScb) { - TRACE(("Mailbox busy %.08lx <%d.%d.%d>\n", = pScb->SCpnt->serial_number, - pScb->SCpnt->channel, pScb->SCpnt->target, pScb->SCpnt->lun)); + TRACE (("Mailbox busy %.08lx <%d.%d.%d>\n", = pScb->SCpnt->serial_number, + pScb->SCpnt->channel, pScb->SCpnt->target, pScb->SCpnt->lun)); + } else { + TRACE(("pScb NULL in MegaIssueCmd!\n")); } + spin_unlock_irqrestore(&mega_lock,flags); return -1; } =20 /* Copy mailbox data into host structure */ - spin_lock_irqsave(&mega_lock,flags); - memset(mbox, 0, sizeof(mega_mailbox)); - memcpy(mbox, mboxData, 16); - spin_unlock_irqrestore(&mega_lock,flags); + memset (mbox, 0, sizeof (mega_mailbox)); + memcpy (mbox, mboxData, 16); =20 /* Kick IO */ megaCfg->flag |=3D PENDING; if (intr) { /* Issue interrupt (non-blocking) command */ if (megaCfg->flag & BOARD_QUARTZ) { - mbox->mraid_poll =3D 0;=20 - mbox->mraid_ack =3D 0;=20 - WRINDOOR(megaCfg, virt_to_bus(megaCfg->mbox) | 0x1); - } else { - ENABLE_INTR(megaCfg->host->io_port); - ISSUE_COMMAND(megaCfg->host->io_port); + mbox->mraid_poll =3D 0; + mbox->mraid_ack =3D 0; + WRINDOOR (megaCfg, virt_to_bus (megaCfg->mbox) | 0x1); } + else { + ENABLE_INTR (megaCfg->host->io_port); + ISSUE_COMMAND (megaCfg->host->io_port); + } + spin_unlock_irqrestore(&mega_lock,flags); } - else { /* Issue non-ISR (blocking) command */ + else { /* Issue non-ISR (blocking) command */ =20 if (megaCfg->flag & BOARD_QUARTZ) { =20 - mbox->mraid_poll =3D 0;=20 - mbox->mraid_ack =3D 0;=20 - WRINDOOR(megaCfg, virt_to_bus(megaCfg->mbox) | 0x1); + mbox->mraid_poll =3D 0; + mbox->mraid_ack =3D 0; + WRINDOOR (megaCfg, virt_to_bus (megaCfg->mbox) | 0x1); =20 - while((cmdDone=3DRDOUTDOOR(megaCfg)) !=3D 0x10001234); - WROUTDOOR(megaCfg, cmdDone); + while ((cmdDone =3D RDOUTDOOR (megaCfg)) !=3D 0x10001234); + WROUTDOOR (megaCfg, cmdDone); =20 + spin_unlock_irqrestore(&mega_lock,flags); if (pScb) { - mega_cmd_done(megaCfg,pScb, mbox->status); - mega_rundoneq(); + mega_cmd_done (megaCfg, pScb, mbox->status); + mega_rundoneq (); } =20 - WRINDOOR(megaCfg,virt_to_bus(megaCfg->mbox) | 0x2); - while(RDINDOOR(megaCfg) & 0x2); + WRINDOOR (megaCfg, virt_to_bus (megaCfg->mbox) | 0x2); + while (RDINDOOR (megaCfg) & 0x2); =20 megaCfg->flag &=3D ~PENDING; + } else { - DISABLE_INTR(megaCfg->host->io_port); - ISSUE_COMMAND(megaCfg->host->io_port); - =20 - = while(!((byte=3DREAD_PORT(megaCfg->host->io_port,INTR_PORT))&INTR_VALID)= ); - WRITE_PORT(megaCfg->host->io_port, INTR_PORT, byte); - =20 - ENABLE_INTR(megaCfg->host->io_port); - CLEAR_INTR(megaCfg->host->io_port); - =20 + DISABLE_INTR (megaCfg->host->io_port); + ISSUE_COMMAND (megaCfg->host->io_port); + + while (!((byte =3D READ_PORT (megaCfg->host->io_port, = INTR_PORT)) & INTR_VALID)); + WRITE_PORT (megaCfg->host->io_port, INTR_PORT, byte); + + + ENABLE_INTR (megaCfg->host->io_port); + CLEAR_INTR (megaCfg->host->io_port); + megaCfg->flag &=3D ~PENDING; + spin_unlock_irqrestore(&mega_lock,flags); + if (pScb) { - mega_cmd_done(megaCfg,pScb, mbox->status); - mega_rundoneq(); + mega_cmd_done (megaCfg, pScb, mbox->status); + mega_rundoneq (); } - megaCfg->flag &=3D ~PENDING; + else { + TRACE (("Error: NULL pScb!\n")); + } + } } =20 @@ -818,42 +927,42 @@ /*------------------------------------------------------------------- * Copies data to SGLIST = *-------------------------------------------------------------------*/ -static int build_sglist(mega_host_config *megaCfg, mega_scb *scb,=20 - u_long *buffer, u_long *length) +static int build_sglist (mega_host_config * megaCfg, mega_scb * scb, + u_long * buffer, u_long * length) { struct scatterlist *sgList; int idx; =20 /* Scatter-gather not used */ if (scb->SCpnt->use_sg =3D=3D 0) { - *buffer =3D virt_to_bus(scb->SCpnt->request_buffer); - *length =3D (u_long)scb->SCpnt->request_bufflen; + *buffer =3D virt_to_bus (scb->SCpnt->request_buffer); + *length =3D (u_long) scb->SCpnt->request_bufflen; return 0; } =20 - sgList =3D (struct scatterlist *)scb->SCpnt->buffer; + sgList =3D (struct scatterlist *) scb->SCpnt->buffer; if (scb->SCpnt->use_sg =3D=3D 1) { - *buffer =3D virt_to_bus(sgList[0].address); - *length =3D (u_long)sgList[0].length; + *buffer =3D virt_to_bus (sgList[0].address); + *length =3D (u_long) sgList[0].length; return 0; } =20 /* Copy Scatter-Gather list info into controller structure */ - for(idx=3D0; idx<scb->SCpnt->use_sg; idx++) { - scb->sgList[idx].address =3D virt_to_bus(sgList[idx].address); - scb->sgList[idx].length =3D (u_long)sgList[idx].length; + for (idx =3D 0; idx < scb->SCpnt->use_sg; idx++) { + scb->sgList[idx].address =3D virt_to_bus (sgList[idx].address); + scb->sgList[idx].length =3D (u_long) sgList[idx].length; } - =20 + /* Reset pointer and length fields */ - *buffer =3D virt_to_bus(scb->sgList); + *buffer =3D virt_to_bus (scb->sgList); *length =3D 0; =20 /* Return count of SG requests */ return scb->SCpnt->use_sg; } - =20 + /*-------------------------------------------------------------------- - * Initializes the address of the controller's mailbox register + * Initializes the adress of the controller's mailbox register * The mailbox register is used to issue commands to the card. * Format of the mailbox area: * 00 01 command @@ -868,25 +977,25 @@ * 10 01 numstatus byte * 11 01 status byte = *--------------------------------------------------------------------*/ -static int mega_register_mailbox(mega_host_config *megaCfg, u_long = paddr) +static int mega_register_mailbox (mega_host_config * megaCfg, u_long = paddr) { /* align on 16-byte boundry */ megaCfg->mbox =3D &megaCfg->mailbox; - megaCfg->mbox =3D (mega_mailbox *) ((((ulong)megaCfg->mbox) + = 16)&0xfffffff0); - paddr =3D (paddr+16)&0xfffffff0; + megaCfg->mbox =3D (mega_mailbox *) ((((ulong) megaCfg->mbox) + 16) & = 0xfffffff0); + paddr =3D (paddr + 16) & 0xfffffff0; =20 /* Register mailbox area with the firmware */ if (megaCfg->flag & BOARD_QUARTZ) { } else { - WRITE_PORT(megaCfg->host->io_port, MBOX_PORT0, paddr & = 0xFF); - WRITE_PORT(megaCfg->host->io_port, MBOX_PORT1, (paddr >> 8) & = 0xFF); - WRITE_PORT(megaCfg->host->io_port, MBOX_PORT2, (paddr >> 16) & = 0xFF); - WRITE_PORT(megaCfg->host->io_port, MBOX_PORT3, (paddr >> 24) & = 0xFF); - WRITE_PORT(megaCfg->host->io_port, ENABLE_MBOX_REGION, = ENABLE_MBOX_BYTE); - =20 - CLEAR_INTR(megaCfg->host->io_port); - ENABLE_INTR(megaCfg->host->io_port); + WRITE_PORT (megaCfg->host->io_port, MBOX_PORT0, paddr & 0xFF); + WRITE_PORT (megaCfg->host->io_port, MBOX_PORT1, (paddr >> 8) & = 0xFF); + WRITE_PORT (megaCfg->host->io_port, MBOX_PORT2, (paddr >> 16) & = 0xFF); + WRITE_PORT (megaCfg->host->io_port, MBOX_PORT3, (paddr >> 24) & = 0xFF); + WRITE_PORT (megaCfg->host->io_port, ENABLE_MBOX_REGION, = ENABLE_MBOX_BYTE); + + CLEAR_INTR (megaCfg->host->io_port); + ENABLE_INTR (megaCfg->host->io_port); } return 0; } @@ -894,77 +1003,79 @@ /*------------------------------------------------------------------- * Issue an adapter info query to the controller = *-------------------------------------------------------------------*/ -static int mega_i_query_adapter(mega_host_config *megaCfg) +static int mega_i_query_adapter (mega_host_config * megaCfg) { mega_RAIDINQ *adapterInfo; mega_mailbox *mbox; - u_char mboxData[16]; - u_long paddr; + u_char mboxData[16]; + u_long paddr; =20 - spin_lock_init(&mega_lock); + spin_lock_init (&mega_lock); /* Initialize adapter inquiry */ - paddr =3D virt_to_bus(megaCfg->mega_buffer); - mbox =3D (mega_mailbox *)mboxData; + paddr =3D virt_to_bus (megaCfg->mega_buffer); + mbox =3D (mega_mailbox *) mboxData; =20 - memset((void *)megaCfg->mega_buffer, 0, = sizeof(megaCfg->mega_buffer)); - memset(mbox, 0, 16); + memset ((void *) megaCfg->mega_buffer, 0, sizeof = (megaCfg->mega_buffer)); + memset (mbox, 0, 16); =20 /* Initialize mailbox registers */ - mbox->cmd =3D MEGA_MBOXCMD_ADAPTERINQ; + mbox->cmd =3D MEGA_MBOXCMD_ADAPTERINQ; mbox->xferaddr =3D paddr; =20 /* Issue a blocking command to the card */ - MegaIssueCmd(megaCfg, mboxData, NULL, 0); - =20 + MegaIssueCmd (megaCfg, mboxData, NULL, 0); + /* Initialize host/local structures with Adapter info */ - adapterInfo =3D (mega_RAIDINQ *)megaCfg->mega_buffer; + adapterInfo =3D (mega_RAIDINQ *) megaCfg->mega_buffer; megaCfg->host->max_channel =3D adapterInfo->AdpInfo.ChanPresent; - megaCfg->host->max_id =3D adapterInfo->AdpInfo.MaxTargPerChan; - megaCfg->numldrv =3D adapterInfo->LogdrvInfo.NumLDrv; +/* megaCfg->host->max_id =3D adapterInfo->AdpInfo.MaxTargPerChan; */ + megaCfg->host->max_id =3D 9; /* max logical drives + 1 */ + megaCfg->numldrv =3D adapterInfo->LogdrvInfo.NumLDrv; =20 #if 0 - printk(KERN_DEBUG "---- Logical drive info ----\n"); - for(i=3D0; i<megaCfg->numldrv; i++) { - printk(KERN_DEBUG "%d: size: %ld prop: %x state: %x\n",i, - adapterInfo->LogdrvInfo.LDrvSize[i], - adapterInfo->LogdrvInfo.LDrvProp[i], - adapterInfo->LogdrvInfo.LDrvState[i]); - } - printk(KERN_DEBUG "---- Physical drive info ----\n"); - for(i=3D0; i<MAX_PHYSICAL_DRIVES; i++) { - if (i && !(i % 8)) printk("\n"); - printk("%d: %x ", i, adapterInfo->PhysdrvInfo.PDrvState[i]); + printk ("KERN_DEBUG ---- Logical drive info ----\n"); + for (i =3D 0; i < megaCfg->numldrv; i++) { + printk ("%d: size: %ld prop: %x state: %x\n", i, + adapterInfo->LogdrvInfo.LDrvSize[i], + adapterInfo->LogdrvInfo.LDrvProp[i], + adapterInfo->LogdrvInfo.LDrvState[i]); + } + printk (KERN_DEBUG "---- Physical drive info ----\n"); + for (i =3D 0; i < MAX_PHYSICAL_DRIVES; i++) { + if (i && !(i % 8)) + printk ("\n"); + printk ("%d: %x ", i, adapterInfo->PhysdrvInfo.PDrvState[i]); } - printk("\n"); + printk ("\n"); #endif =20 megaCfg->max_cmds =3D adapterInfo->AdpInfo.MaxConcCmds; =20 -#ifdef HP /* use HP firmware and bios version encoding */ - sprintf(megaCfg->fwVer,"%c%d%d.%d%d", - adapterInfo->AdpInfo.FwVer[2], - adapterInfo->AdpInfo.FwVer[1] >> 8, - adapterInfo->AdpInfo.FwVer[1] & 0x0f, - adapterInfo->AdpInfo.FwVer[2] >> 8, - adapterInfo->AdpInfo.FwVer[2] & 0x0f); - sprintf(megaCfg->biosVer,"%c%d%d.%d%d", - adapterInfo->AdpInfo.BiosVer[2], - adapterInfo->AdpInfo.BiosVer[1] >> 8, - adapterInfo->AdpInfo.BiosVer[1] & 0x0f, - adapterInfo->AdpInfo.BiosVer[2] >> 8, - adapterInfo->AdpInfo.BiosVer[2] & 0x0f); +#ifdef HP /* use HP firmware and bios version encoding */ + sprintf (megaCfg->fwVer, "%c%d%d.%d%d", + adapterInfo->AdpInfo.FwVer[2], + adapterInfo->AdpInfo.FwVer[1] >> 8, + adapterInfo->AdpInfo.FwVer[1] & 0x0f, + adapterInfo->AdpInfo.FwVer[2] >> 8, + adapterInfo->AdpInfo.FwVer[2] & 0x0f); + sprintf (megaCfg->biosVer, "%c%d%d.%d%d", + adapterInfo->AdpInfo.BiosVer[2], + adapterInfo->AdpInfo.BiosVer[1] >> 8, + adapterInfo->AdpInfo.BiosVer[1] & 0x0f, + adapterInfo->AdpInfo.BiosVer[2] >> 8, + adapterInfo->AdpInfo.BiosVer[2] & 0x0f); #else - memcpy(megaCfg->fwVer, adapterInfo->AdpInfo.FwVer, 4); - megaCfg->fwVer[4] =3D 0; + memcpy (megaCfg->fwVer, adapterInfo->AdpInfo.FwVer, 4); + megaCfg->fwVer[4] =3D 0; =20 - memcpy(megaCfg->biosVer, adapterInfo->AdpInfo.BiosVer, 4); - megaCfg->biosVer[4] =3D 0; + memcpy (megaCfg->biosVer, adapterInfo->AdpInfo.BiosVer, 4); + megaCfg->biosVer[4] =3D 0; #endif =20 - printk(KERN_INFO "megaraid: [%s:%s] detected %d logical drives" = CRLFSTR, - megaCfg->fwVer, - megaCfg->biosVer, - megaCfg->numldrv); + printk (KERN_INFO "megaraid: [%s:%s] detected %d logical drives" = CRLFSTR, + megaCfg->fwVer, + megaCfg->biosVer, + megaCfg->numldrv); return 0; } =20 @@ -977,47 +1088,56 @@ /*---------------------------------------------------------- * Returns data to be displayed in /proc/scsi/megaraid/X *----------------------------------------------------------*/ -int megaraid_proc_info(char *buffer, char **start, off_t offset, - int length, int inode, int inout) +int megaraid_proc_info (char *buffer, char **start, off_t offset, + int length, int inode, int inout) { *start =3D buffer; return 0; } =20 -int findCard(Scsi_Host_Template *pHostTmpl,=20 - u_short pciVendor, u_short pciDev, - long flag) +int findCard (Scsi_Host_Template * pHostTmpl, + u_short pciVendor, u_short pciDev, + long flag) { mega_host_config *megaCfg; struct Scsi_Host *host; - u_char pciBus, pciDevFun, megaIrq; - u_long megaBase; - u_short pciIdx =3D 0; + u_char pciBus, pciDevFun, megaIrq; + u_long megaBase; + u_short pciIdx =3D 0; =20 #if LINUX_VERSION_CODE < 0x20100 - while(!pcibios_find_device(pciVendor, pciDev, = pciIdx,&pciBus,&pciDevFun)) { + while (!pcibios_find_device (pciVendor, pciDev, pciIdx, &pciBus, = &pciDevFun)) { + if (flag & BOARD_QUARTZ) { + u_int magic; + pcibios_read_config_dword (pciBus, pciDevFun, + PCI_CONF_AMISIG, + &magic); + if (magic !=3D AMI_SIGNATURE) { + continue; /* not an AMI board */ + } + } #else - struct pci_dev *pdev=3Dpci_devices; + struct pci_dev *pdev =3D pci_devices; =20 - while((pdev =3D pci_find_device(pciVendor, pciDev, pdev))) { + while ((pdev =3D pci_find_device (pciVendor, pciDev, pdev))) { pciBus =3D pdev->bus->number; pciDevFun =3D pdev->devfn; #endif - printk(KERN_INFO "megaraid: found 0x%4.04x:0x%4.04x:idx %d:bus = %d:slot %d:fun %d\n", - pciVendor,=20 - pciDev,=20 - pciIdx, pciBus,=20 - PCI_SLOT(pciDevFun),=20 - PCI_FUNC(pciDevFun)); - =20 + printk (KERN_INFO "megaraid: found 0x%4.04x:0x%4.04x:idx %d:bus = %d:slot %d:fun %d\n", + pciVendor, + pciDev, + pciIdx, pciBus, + PCI_SLOT (pciDevFun), + PCI_FUNC (pciDevFun)); + /* Read the base port and IRQ from PCI */ #if LINUX_VERSION_CODE < 0x20100 - pcibios_read_config_dword(pciBus, pciDevFun, - PCI_BASE_ADDRESS_0, - (u_int *)&megaBase); - pcibios_read_config_byte(pciBus, pciDevFun, =20 - PCI_INTERRUPT_LINE, - &megaIrq); + pcibios_read_config_dword (pciBus, pciDevFun, + PCI_BASE_ADDRESS_0, + (u_int *) & megaBase); + pcibios_read_config_byte (pciBus, pciDevFun, + PCI_INTERRUPT_LINE, + &megaIrq); #else megaBase =3D pdev->base_address[0]; megaIrq =3D pdev->irq; @@ -1026,7 +1146,7 @@ =20 if (flag & BOARD_QUARTZ) { megaBase &=3D PCI_BASE_ADDRESS_MEM_MASK; - megaBase =3D (long) ioremap(megaBase,128); + megaBase =3D (long) ioremap (megaBase, 128); } else { megaBase &=3D PCI_BASE_ADDRESS_IO_MASK; @@ -1034,47 +1154,47 @@ } =20 /* Initialize SCSI Host structure */ - host =3D scsi_register(pHostTmpl, sizeof(mega_host_config)); - megaCfg =3D (mega_host_config *)host->hostdata; - memset(megaCfg, 0, sizeof(mega_host_config)); - - printk(KERN_INFO " scsi%d: Found a MegaRAID controller at 0x%x, = IRQ: %d" CRLFSTR,=20 - host->host_no, (u_int)megaBase, megaIrq); - =20 + host =3D scsi_register (pHostTmpl, sizeof (mega_host_config)); + megaCfg =3D (mega_host_config *) host->hostdata; + memset (megaCfg, 0, sizeof (mega_host_config)); + + printk (KERN_INFO " scsi%d: Found a MegaRAID controller at 0x%x, = IRQ: %d" CRLFSTR, + host->host_no, (u_int) megaBase, megaIrq); + /* Copy resource info into structure */ - megaCfg->flag =3D flag; - megaCfg->host =3D host; - megaCfg->base =3D megaBase; - megaCfg->host->irq =3D megaIrq; - megaCfg->host->io_port =3D megaBase; + megaCfg->flag =3D flag; + megaCfg->host =3D host; + megaCfg->base =3D megaBase; + megaCfg->host->irq =3D megaIrq; + megaCfg->host->io_port =3D megaBase; megaCfg->host->n_io_port =3D 16; megaCfg->host->unique_id =3D (pciBus << 8) | pciDevFun; - megaCtlrs[numCtlrs++] =3D megaCfg; + megaCtlrs[numCtlrs++] =3D megaCfg; =20 if (flag !=3D BOARD_QUARTZ) { /* Request our IO Range */ - if (check_region(megaBase, 16)) { - printk(KERN_WARNING "megaraid: Couldn't register I/O range!" = CRLFSTR); - scsi_unregister(host); + if (check_region (megaBase, 16)) { + printk (KERN_WARNING "megaraid: Couldn't register I/O range!" = CRLFSTR); + scsi_unregister (host); continue; } - request_region(megaBase, 16, "megaraid"); + request_region (megaBase, 16, "megaraid"); } =20 /* Request our IRQ */ - if (request_irq(megaIrq, megaraid_isr, SA_SHIRQ,=20 - "megaraid", megaCfg)) { - printk(KERN_WARNING "megaraid: Couldn't register IRQ %d!" = CRLFSTR, - megaIrq); - scsi_unregister(host); + if (request_irq (megaIrq, megaraid_isr, SA_SHIRQ, + "megaraid", megaCfg)) { + printk (KERN_WARNING "megaraid: Couldn't register IRQ %d!" = CRLFSTR, + megaIrq); + scsi_unregister (host); continue; } =20 - mega_register_mailbox(megaCfg, = virt_to_bus((void*)&megaCfg->mailbox)); - mega_i_query_adapter(megaCfg); + mega_register_mailbox (megaCfg, virt_to_bus ((void *) = &megaCfg->mailbox)); + mega_i_query_adapter (megaCfg); =20 /* Initialize SCBs */ - initSCB(megaCfg); + initSCB (megaCfg); =20 } return pciIdx; @@ -1083,23 +1203,22 @@ /*--------------------------------------------------------- * Detects if a megaraid controller exists in this system *---------------------------------------------------------*/ -int megaraid_detect(Scsi_Host_Template *pHostTmpl) +int megaraid_detect (Scsi_Host_Template * pHostTmpl) { int count =3D 0; =20 pHostTmpl->proc_dir =3D &proc_scsi_megaraid; =20 #if LINUX_VERSION_CODE < 0x20100 - if (!pcibios_present())=20 - { - printk(KERN_WARNING "megaraid: PCI bios not present." CRLFSTR); - return 0; - } + if (!pcibios_present ()) { + printk (KERN_WARNING "megaraid: PCI bios not present." CRLFSTR); + return 0; + } #endif =20 - count +=3D findCard(pHostTmpl, 0x101E, 0x9010, 0); - count +=3D findCard(pHostTmpl, 0x101E, 0x9060, 0); - count +=3D findCard(pHostTmpl, 0x8086, 0x1960, BOARD_QUARTZ); + count +=3D findCard (pHostTmpl, 0x101E, 0x9010, 0); + count +=3D findCard (pHostTmpl, 0x101E, 0x9060, 0); + count +=3D findCard (pHostTmpl, 0x8086, 0x1960, BOARD_QUARTZ); =20 return count; } @@ -1107,33 +1226,40 @@ = /*--------------------------------------------------------------------- * Release the controller's resources = *---------------------------------------------------------------------*/=

-int megaraid_release(struct Scsi_Host *pSHost) +int megaraid_release (struct Scsi_Host *pSHost) { mega_host_config *megaCfg; - mega_mailbox *mbox; - u_char mboxData[16]; + mega_mailbox *mbox; + u_char mboxData[16]; + int i; =20 - megaCfg =3D (mega_host_config*)pSHost->hostdata; - mbox =3D (mega_mailbox *)mboxData; + megaCfg =3D (mega_host_config *) pSHost->hostdata; + mbox =3D (mega_mailbox *) mboxData; =20 /* Flush cache to disk */ - memset(mbox, 0, 16); + memset (mbox, 0, 16); mboxData[0] =3D 0xA; =20 /* Issue a blocking (interrupts disabled) command to the card */ - MegaIssueCmd(megaCfg, mboxData, NULL, 0); + MegaIssueCmd (megaCfg, mboxData, NULL, 0); =20 - schedule(); + schedule (); =20 /* Free our resources */ if (megaCfg->flag & BOARD_QUARTZ) { - iounmap((void *)megaCfg->base); - } else { - release_region(megaCfg->host->io_port, 16); - } - free_irq(megaCfg->host->irq, megaCfg); /* Must be freed first, = otherwise - extra interrupt is = generated */ - scsi_unregister(pSHost); + iounmap ((void *) megaCfg->base); + } + else { + release_region (megaCfg->host->io_port, 16); + } + free_irq (megaCfg->host->irq, megaCfg); /* Must be freed first, = otherwise + + extra interrupt is generated */ + for (i =3D 0; i < megaCfg->max_cmds; i++) { + if (megaCfg->scbList[i].sgList) + kfree (megaCfg->scbList[i].sgList); /* free sgList */ + } + scsi_unregister (pSHost); =20 return 0; } @@ -1141,20 +1267,20 @@ /*---------------------------------------------- * Get information about the card/driver=20 *----------------------------------------------*/ -const char *megaraid_info(struct Scsi_Host *pSHost) +const char * megaraid_info (struct Scsi_Host *pSHost) { - static char buffer[512]; - mega_host_config *megaCfg; - mega_RAIDINQ *adapterInfo; + static char buffer[512]; + mega_host_config *megaCfg; + mega_RAIDINQ *adapterInfo; =20 - megaCfg =3D (mega_host_config *)pSHost->hostdata; - adapterInfo =3D (mega_RAIDINQ *)megaCfg->mega_buffer; + megaCfg =3D (mega_host_config *) pSHost->hostdata; + adapterInfo =3D (mega_RAIDINQ *) megaCfg->mega_buffer; =20 - sprintf(buffer, "AMI MegaRAID %s %d commands %d targs %d chans", - megaCfg->fwVer, - adapterInfo->AdpInfo.MaxConcCmds, - megaCfg->host->max_id, - megaCfg->host->max_channel); + sprintf (buffer, "AMI MegaRAID %s %d commands %d targs %d chans", + megaCfg->fwVer, + adapterInfo->AdpInfo.MaxConcCmds, + megaCfg->host->max_id, + megaCfg->host->max_channel); return buffer; } =20 @@ -1173,29 +1299,29 @@ * 10 01 numstatus byte * 11 01 status byte=20 *-----------------------------------------------------------------*/ -int megaraid_queue(Scsi_Cmnd *SCpnt, void (*pktComp)(Scsi_Cmnd *)) +int megaraid_queue (Scsi_Cmnd * SCpnt, void (*pktComp) (Scsi_Cmnd *)) { mega_host_config *megaCfg; - mega_scb *pScb; + mega_scb *pScb; =20 - megaCfg =3D (mega_host_config *)SCpnt->host->hostdata; + megaCfg =3D (mega_host_config *) SCpnt->host->hostdata; =20 if (!(megaCfg->flag & (1L << SCpnt->channel))) { - printk(KERN_INFO "scsi%d: scanning channel %c for devices.\n", - megaCfg->host->host_no, - SCpnt->channel + 'A'); + printk (KERN_INFO "scsi%d: scanning channel %c for devices.\n", + megaCfg->host->host_no, + SCpnt->channel + 'A'); megaCfg->flag |=3D (1L << SCpnt->channel); } =20 SCpnt->scsi_done =3D pktComp; =20 /* Allocate and build a SCB request */ - if ((pScb =3D mega_build_cmd(megaCfg, SCpnt)) !=3D NULL) { + if ((pScb =3D mega_build_cmd (megaCfg, SCpnt)) !=3D NULL) { /* Add SCB to the head of the pending queue */ - ENQUEUE(pScb, mega_scb, qPending, next); + ENQUEUE (pScb, mega_scb, qPending, next); =20 /* Issue the command to the card */ - mega_runque(NULL); + mega_runque (NULL); } =20 return 0; @@ -1203,37 +1329,44 @@ =20 = /*----------------------------------------------------------------------=

* Issue a blocking command to the controller - * - * Note - this isnt 2.0.x SMP safe = *----------------------------------------------------------------------*= / -volatile static int internal_done_flag =3D 0; +volatile static int internal_done_flag =3D 0; volatile static int internal_done_errcode =3D 0; =20 -static void internal_done(Scsi_Cmnd *SCpnt) +static void internal_done (Scsi_Cmnd * SCpnt) { internal_done_errcode =3D SCpnt->result; internal_done_flag++; } =20 /* - * This seems dangerous in an SMP environment because=20 - * while spinning on internal_done_flag in 2.0.x SMP - * no IRQ's will be taken, including those that might - * be needed to clear this. - * - * I think this should be using a wait queue ? - * -- AC + * This seems dangerous in an SMP environment because + * while spinning on internal_done_flag in 2.0.x SMP + * no IRQ's will be taken, including those that might + * be needed to clear this. + * + * I think this should be using a wait queue ? + * -- AC + */ =20 + +/* + * I'll probably fix this in the next version, but + * megaraid_command() will never get called since can_queue is = set, + * except maybe in a *really* old kernel in which case it's very + * unlikely they'd be using SMP anyway. Really this function is + * just here for completeness. + * - JLJ */ -=20 -int megaraid_command(Scsi_Cmnd *SCpnt) + +int megaraid_command (Scsi_Cmnd * SCpnt) { internal_done_flag =3D 0; =20 /* Queue command, and wait until it has completed */ - megaraid_queue(SCpnt, internal_done); + megaraid_queue (SCpnt, internal_done); =20 - while(!internal_done_flag) - barrier(); + while (!internal_done_flag) + barrier (); =20 return internal_done_errcode; } @@ -1241,67 +1374,67 @@ = /*--------------------------------------------------------------------- * Abort a previous SCSI request = *---------------------------------------------------------------------*/=

-int megaraid_abort(Scsi_Cmnd *SCpnt) +int megaraid_abort (Scsi_Cmnd * SCpnt) { mega_host_config *megaCfg; - int idx; - long flags; + int idx; + long flags; =20 - spin_lock_irqsave(&mega_lock,flags); + spin_lock_irqsave (&mega_lock, flags); =20 - megaCfg =3D (mega_host_config *)SCpnt->host->hostdata; + megaCfg =3D (mega_host_config *) SCpnt->host->hostdata; =20 - TRACE(("ABORT!!! %.08lx %.02x <%d.%d.%d>\n", - SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, =

- SCpnt->lun)); + TRACE (("ABORT!!! %.08lx %.02x <%d.%d.%d>\n", + SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, + SCpnt->lun)); /* * Walk list of SCBs for any that are still outstanding */ - for(idx=3D0; idx<megaCfg->max_cmds; idx++) { + for (idx =3D 0; idx < megaCfg->max_cmds; idx++) { if (megaCfg->scbList[idx].idx >=3D 0) { if (megaCfg->scbList[idx].SCpnt =3D=3D SCpnt) { - freeSCB(&megaCfg->scbList[idx]); + freeSCB (&megaCfg->scbList[idx]); =20 - SCpnt->result =3D (DID_RESET << 16) | (SUGGEST_RETRY<<24); - callDone(SCpnt); + SCpnt->result =3D (DID_RESET << 16) | (SUGGEST_RETRY << 24); + callDone (SCpnt); } } } - spin_unlock_irqrestore(&mega_lock,flags); + spin_unlock_irqrestore (&mega_lock, flags); return SCSI_ABORT_SNOOZE; } =20 = /*--------------------------------------------------------------------- * Reset a previous SCSI request = *---------------------------------------------------------------------*/=

-int megaraid_reset(Scsi_Cmnd *SCpnt, unsigned int rstflags) +int megaraid_reset (Scsi_Cmnd * SCpnt, unsigned int rstflags) { mega_host_config *megaCfg; - int idx; - long flags; + int idx; + long flags; =20 - spin_lock_irqsave(&mega_lock,flags); + spin_lock_irqsave (&mega_lock, flags); =20 - megaCfg =3D (mega_host_config *)SCpnt->host->hostdata; + megaCfg =3D (mega_host_config *) SCpnt->host->hostdata; =20 - TRACE(("RESET: %.08lx %.02x <%d.%d.%d>\n", - SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, =

- SCpnt->lun)); + TRACE (("RESET: %.08lx %.02x <%d.%d.%d>\n", + SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel, SCpnt->target, + SCpnt->lun)); =20 /* * Walk list of SCBs for any that are still outstanding */ - for(idx=3D0; idx<megaCfg->max_cmds; idx++) { + for (idx =3D 0; idx < megaCfg->max_cmds; idx++) { if (megaCfg->scbList[idx].idx >=3D 0) { SCpnt =3D megaCfg->scbList[idx].SCpnt; - freeSCB(&megaCfg->scbList[idx]); - SCpnt->result =3D (DID_RESET << 16) | (SUGGEST_RETRY<<24); - callDone(SCpnt); + freeSCB (&megaCfg->scbList[idx]); + SCpnt->result =3D (DID_RESET << 16) | (SUGGEST_RETRY << 24); + callDone (SCpnt); } } - spin_unlock_irqrestore(&mega_lock,flags); + spin_unlock_irqrestore (&mega_lock, flags); return SCSI_RESET_PUNT; -}=20 +} =20 /*------------------------------------------------------------- * Return the disk geometry for a particular disk @@ -1313,23 +1446,23 @@ * geom[1] =3D sectors * geom[2] =3D cylinders *-------------------------------------------------------------*/ -int megaraid_biosparam(Disk *disk, kdev_t dev, int *geom) +int megaraid_biosparam (Disk * disk, kdev_t dev, int *geom) { - int heads, sectors, cylinders; + int heads, sectors, cylinders; mega_host_config *megaCfg; =20 /* Get pointer to host config structure */ - megaCfg =3D (mega_host_config *)disk->device->host->hostdata; + megaCfg =3D (mega_host_config *) disk->device->host->hostdata; =20 /* Default heads (64) & sectors (32) */ - heads =3D 64; - sectors =3D 32; + heads =3D 64; + sectors =3D 32; cylinders =3D disk->capacity / (heads * sectors); =20 /* Handle extended translation size for logical drives > 1Gb */ if (disk->capacity >=3D 0x200000) { - heads =3D 255; - sectors =3D 63; + heads =3D 255; + sectors =3D 63; cylinders =3D disk->capacity / (heads * sectors); } =20 diff -urN linux/drivers/scsi/megaraid.h = linux-mega093/drivers/scsi/megaraid.h --- linux/drivers/scsi/megaraid.h Mon Jan 25 16:58:04 1999 +++ linux-mega093/drivers/scsi/megaraid.h Mon Jan 25 16:50:29 1999 @@ -1,6 +1,10 @@ #ifndef __MEGARAID_H__ #define __MEGARAID_H__ =20 +#ifndef LINUX_VERSION_CODE +#include <linux/version.h> +#endif + #define IN_ISR 0x80000000L #define NO_INTR 0x40000000L #define IN_TIMEOUT 0x20000000L @@ -18,7 +22,7 @@ =20 #define MEGA_CMD_TIMEOUT 10 =20 -#define MAX_SGLIST 20 +#define MAX_SGLIST 17 #define MAX_COMMANDS 254 =20 #define MAX_LOGICAL_DRIVES 8 @@ -94,6 +98,8 @@ =20 #define PCI_CONF_BASE_ADDR_OFFSET 0x10 #define PCI_CONF_IRQ_OFFSET 0x3c +#define PCI_CONF_AMISIG 0xa0 +#define AMI_SIGNATURE 0x11223344 =20 #if LINUX_VERSION_CODE < 0x20100 #define MEGARAID \ @@ -111,14 +117,14 @@ megaraid_reset, /* Reset Command Function = */\ NULL, /* Slave Attach Function = */\ megaraid_biosparam, /* Disk BIOS Parameters = */\ - 1, /* # of cmds that can be\ + 254, /* # of cmds that can be\ outstanding at any time */\ 7, /* HBA Target ID = */\ MAX_SGLIST, /* Scatter/Gather Table Size = */\ - 1, /* SCSI Commands per LUN = */\ + 64, /* SCSI Commands per LUN = */\ 0, /* Present = */\ 0, /* Default Unchecked ISA DMA = */\ - ENABLE_CLUSTERING } /* Enable Clustering = */ + ENABLE_CLUSTERING } /* Enable Clustering */ #else #define MEGARAID \ {\ @@ -132,10 +138,10 @@ abort: megaraid_abort, /* Abort Command = Function */\ reset: megaraid_reset, /* Reset Command = Function */\ bios_param: megaraid_biosparam, /* Disk BIOS Parameters = */\ - can_queue: 255, /* Can Queue = */\ + can_queue: 254, /* Can Queue = */\ this_id: 7, /* HBA Target ID = */\ sg_tablesize: MAX_SGLIST, /* Scatter/Gather Table = Size */\ - cmd_per_lun: 1, /* SCSI Commands per = LUN */\ + cmd_per_lun: 64, /* SCSI Commands per = LUN */\ present: 0, /* Present = */\ unchecked_isa_dma:0, /* Default Unchecked = ISA DMA */\ use_clustering: ENABLE_CLUSTERING /* Enable Clustering = */\ @@ -143,140 +149,150 @@ #endif =20 /* Structures */ -typedef struct _mega_ADP_INFO -{ - u_char MaxConcCmds; - u_char RbldRate; - u_char MaxTargPerChan; - u_char ChanPresent; - u_char FwVer[4]; - u_short AgeOfFlash; - u_char ChipSet; - u_char DRAMSize; - u_char CacheFlushInterval; - u_char BiosVer[4]; - u_char resvd[7]; +typedef struct _mega_ADP_INFO { + u_char MaxConcCmds; + u_char RbldRate; + u_char MaxTargPerChan; + u_char ChanPresent; + u_char FwVer[4]; + u_short AgeOfFlash; + u_char ChipSet; + u_char DRAMSize; + u_char CacheFlushInterval; + u_char BiosVer[4]; + u_char resvd[7]; } mega_ADP_INFO; =20 -typedef struct _mega_LDRV_INFO -{ - u_char NumLDrv; - u_char resvd[3]; - u_long LDrvSize[MAX_LOGICAL_DRIVES]; - u_char LDrvProp[MAX_LOGICAL_DRIVES]; - u_char LDrvState[MAX_LOGICAL_DRIVES]; +typedef struct _mega_LDRV_INFO { + u_char NumLDrv; + u_char resvd[3]; + u_long LDrvSize[MAX_LOGICAL_DRIVES]; + u_char LDrvProp[MAX_LOGICAL_DRIVES]; + u_char LDrvState[MAX_LOGICAL_DRIVES]; } mega_LDRV_INFO; =20 -typedef struct _mega_PDRV_INFO -{ - u_char PDrvState[MAX_PHYSICAL_DRIVES]; - u_char resvd; +typedef struct _mega_PDRV_INFO { + u_char PDrvState[MAX_PHYSICAL_DRIVES]; + u_char resvd; } mega_PDRV_INFO; =20 // RAID inquiry: Mailbox command 0x5 -typedef struct _mega_RAIDINQ -{ - mega_ADP_INFO AdpInfo; - mega_LDRV_INFO LogdrvInfo; - mega_PDRV_INFO PhysdrvInfo; +typedef struct _mega_RAIDINQ { + mega_ADP_INFO AdpInfo; + mega_LDRV_INFO LogdrvInfo; + mega_PDRV_INFO PhysdrvInfo; } mega_RAIDINQ; =20 // Passthrough command: Mailbox command 0x3 -typedef struct mega_passthru -{ - u_char timeout:3; /* = 0=3D6sec/1=3D60sec/2=3D10min/3=3D3hrs */ - u_char ars:1; - u_char reserved:3; - u_char islogical:1; - u_char logdrv; /* if islogical =3D=3D 1 = */ - u_char channel; /* if islogical =3D=3D 0 = */ - u_char target; /* if islogical =3D=3D 0 = */ - u_char queuetag; /* unused */ - u_char queueaction; /* unused */ - u_char cdb[MAX_CDB_LEN]; - u_char cdblen; - u_char reqsenselen; - u_char reqsensearea[MAX_REQ_SENSE_LEN]; - u_char numsgelements; - u_char scsistatus; - u_long dataxferaddr; - u_long dataxferlen; +typedef struct mega_passthru { + u_char timeout:3; /* 0=3D6sec/1=3D60sec/2=3D10min/3=3D3hrs */ + u_char ars:1; + u_char reserved:3; + u_char islogical:1; + u_char logdrv; /* if islogical =3D=3D 1 */ + u_char channel; /* if islogical =3D=3D 0 */ + u_char target; /* if islogical =3D=3D 0 */ + u_char queuetag; /* unused */ + u_char queueaction; /* unused */ + u_char cdb[MAX_CDB_LEN]; + u_char cdblen; + u_char reqsenselen; + u_char reqsensearea[MAX_REQ_SENSE_LEN]; + u_char numsgelements; + u_char scsistatus; + u_long dataxferaddr; + u_long dataxferlen; } mega_passthru; =20 -typedef struct _mega_mailbox -{ - /* 0x0 */ u_char cmd; - /* 0x1 */ u_char cmdid; - /* 0x2 */ u_short numsectors; - /* 0x4 */ u_long lba; - /* 0x8 */ u_long xferaddr; - /* 0xC */ u_char logdrv; - /* 0xD */ u_char numsgelements; - /* 0xE */ u_char resvd; - /* 0xF */ u_char busy; - /* 0x10*/ u_char numstatus; - /* 0x11*/ u_char status; - /* 0x12*/ u_char completed[46]; - u_char mraid_poll; - u_char mraid_ack; - u_char pad[16]; +typedef struct _mega_mailbox { + /* 0x0 */ u_char cmd; + /* 0x1 */ u_char cmdid; + /* 0x2 */ u_short numsectors; + /* 0x4 */ u_long lba; + /* 0x8 */ u_long xferaddr; + /* 0xC */ u_char logdrv; + /* 0xD */ u_char numsgelements; + /* 0xE */ u_char resvd; + /* 0xF */ u_char busy; + /* 0x10 */ u_char numstatus; + /* 0x11 */ u_char status; + /* 0x12 */ u_char completed[46]; + u_char mraid_poll; + u_char mraid_ack; + u_char pad[16]; } mega_mailbox; =20 -typedef struct _mega_sglist -{ - u_long address; - u_long length; +typedef struct _mega_ioctl_mbox { + /* 0x0 */ u_char cmd; + /* 0x1 */ u_char cmdid; + /* 0x2 */ u_char channel; + /* 0x3 */ u_char param; + /* 0x4 */ u_char pad[4]; + /* 0x8 */ u_long xferaddr; + /* 0xC */ u_char logdrv; + /* 0xD */ u_char numsgelements; + /* 0xE */ u_char resvd; + /* 0xF */ u_char busy; + /* 0x10 */ u_char numstatus; + /* 0x11 */ u_char status; + /* 0x12 */ u_char completed[46]; + u_char mraid_poll; + u_char mraid_ack; + u_char malign[16]; +} mega_ioctl_mbox; + +typedef struct _mega_sglist { + u_long address; + u_long length; } mega_sglist; =20 /* Queued command data */ typedef struct _mega_scb mega_scb; =20 -struct _mega_scb -{ - int idx; - u_long flag; - Scsi_Cmnd *SCpnt; - u_char mboxData[16]; - mega_passthru pthru; - mega_sglist *sgList; - mega_scb *next; +struct _mega_scb { + int idx; + u_long flag; + Scsi_Cmnd *SCpnt; + u_char mboxData[16]; + mega_passthru pthru; + mega_sglist *sgList; + mega_scb *next; }; =20 /* Per-controller data */ -typedef struct _mega_host_config -{ - u_char numldrv; - u_long flag; - u_long base; - - struct tq_struct megaTq; - - /* Host adapter parameters */ - u_char fwVer[7]; - u_char biosVer[7]; - - struct Scsi_Host *host; - - /* The following must be DMA-able!! */ - volatile mega_mailbox *mbox; - volatile mega_mailbox mailbox; - volatile u_char mega_buffer[2*1024L]; +typedef struct _mega_host_config { + u_char numldrv; + u_long flag; + u_long base; + + struct tq_struct megaTq; + + /* Host adapter parameters */ + u_char fwVer[7]; + u_char biosVer[7]; + + struct Scsi_Host *host; + + /* The following must be DMA-able!! */ + volatile mega_mailbox *mbox; + volatile mega_mailbox mailbox; + volatile u_char mega_buffer[2 * 1024L]; =20 - u_char max_cmds; - mega_scb scbList[MAX_COMMANDS]; + u_char max_cmds; + mega_scb scbList[MAX_COMMANDS]; } mega_host_config; =20 extern struct proc_dir_entry proc_scsi_megaraid; =20 -const char *megaraid_info( struct Scsi_Host * ); -int megaraid_detect( Scsi_Host_Template * ); -int megaraid_release(struct Scsi_Host *); -int megaraid_command( Scsi_Cmnd * ); -int megaraid_abort( Scsi_Cmnd * ); -int megaraid_reset( Scsi_Cmnd *, unsigned int);=20 -int megaraid_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) ); -int megaraid_biosparam( Disk *, kdev_t, int * ); -int megaraid_proc_info( char *buffer, char **start, off_t = offset, - int length, int hostno, int inout ); +const char *megaraid_info(struct Scsi_Host *); +int megaraid_detect(Scsi_Host_Template *); +int megaraid_release(struct Scsi_Host *); +int megaraid_command(Scsi_Cmnd *); +int megaraid_abort(Scsi_Cmnd *); +int megaraid_reset(Scsi_Cmnd *, unsigned int); +int megaraid_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +int megaraid_biosparam(Disk *, kdev_t, int *); +int megaraid_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout); =20 #endif

------ =_NextPart_000_01BE48B0.4BD153EA--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/