RE: [ANNOUNCE] megaraid linux driver version 2.00.7

From: haruo tomita (haruo.tomita@toshiba.co.jp)
Date: Fri Aug 01 2003 - 23:59:32 EST


Hi Atul,

Atul wrote;

Atul>
Atul> MegaRAID driver version 2.00.7 is released and can be download from
Atul>
Atul> ftp://ftp.lsil.com/pub/linux-megaraid/drivers/version-2.00.7/
Atul>

Thanks!! I created the patch for kernel 2.4.22-pre10-ac1.
Here is patch.

diff -Nru linux-2.4.22-pre10-ac1/drivers/scsi/megaraid2.c linux-2.4.22-pre10-ac1-mr7/drivers/scsi/megaraid2.c
--- linux-2.4.22-pre10-ac1/drivers/scsi/megaraid2.c 2003-08-02 10:20:33.000000000 +0900
+++ linux-2.4.22-pre10-ac1-mr7/drivers/scsi/megaraid2.c 2003-08-02 10:50:57.000000000 +0900
@@ -14,7 +14,7 @@
  * - speed-ups (list handling fixes, issued_list, optimizations.)
  * - lots of cleanups.
  *
- * Version : v2.00.5 (Apr 24, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
+ * Version : v2.00.7 (Aug 01, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
  *
  * Description: Linux device driver for LSI Logic MegaRAID controller
  *
@@ -73,7 +73,9 @@

 static int hba_count;
 static adapter_t *hba_soft_state[MAX_CONTROLLERS];
+#ifdef CONFIG_PROC_FS
 static struct proc_dir_entry *mega_proc_dir_entry;
+#endif

 static struct notifier_block mega_notifier = {
     .notifier_call = megaraid_reboot_notify
@@ -255,6 +257,16 @@

     while((pdev = pci_find_device(pci_vendor, pci_device, pdev))) {

+ // reset flags for all controllers in this class
+ did_ioremap_f = 0;
+ did_req_region_f = 0;
+ did_scsi_reg_f = 0;
+ got_ipdev_f = 0;
+ alloc_int_buf_f = 0;
+ alloc_scb_f = 0;
+ got_irq_f = 0;
+ did_setup_mbox_f = 0;
+
          if(pci_enable_device (pdev)) continue;

          pci_bus = pdev->bus->number;
@@ -290,6 +302,7 @@
          if( subsysvid && (subsysvid != AMI_SUBSYS_VID) &&
                    (subsysvid != DELL_SUBSYS_VID) &&
                    (subsysvid != HP_SUBSYS_VID) &&
+ (subsysvid != INTEL_SUBSYS_VID) &&
                    (subsysvid != LSI_SUBSYS_VID) ) continue;

@@ -382,6 +395,8 @@
          adapter->flag = flag;
          spin_lock_init(&adapter->lock);

+ adapter->host_lock = &io_request_lock;
+
          host->cmd_per_lun = max_cmd_per_lun;
          host->max_sectors = max_sectors_per_io;

@@ -1624,7 +1639,7 @@
     /*
      * Increment the pending queue counter
      */
- atomic_inc(&adapter->pend_cmds);
+ atomic_inc((atomic_t *)&adapter->pend_cmds);

     switch (mbox->cmd) {
     case MEGA_MBOXCMD_LREAD64:
@@ -1709,6 +1724,9 @@

          mbox->numstatus = 0xFF;

+ while((volatile u8)mbox->status == 0xFF)
+ cpu_relax();
+
          while( (volatile u8)mbox->poll != 0x77 )
               cpu_relax();

@@ -1758,7 +1776,7 @@
     unsigned long flags;

- spin_lock_irqsave(&adapter->lock, flags);
+ spin_lock_irqsave(adapter->host_lock, flags);

     megaraid_iombox_ack_sequence(adapter);

@@ -1767,7 +1785,7 @@
          mega_runpendq(adapter);
     }

- spin_unlock_irqrestore(&adapter->lock, flags);
+ spin_unlock_irqrestore(adapter->host_lock, flags);

     return;
 }
@@ -1804,12 +1822,13 @@
               cpu_relax();
          adapter->mbox->numstatus = 0xFF;

- status = adapter->mbox->status;
+ while((status = (volatile u8)adapter->mbox->status) == 0xFF)
+ cpu_relax();

          /*
           * decrement the pending queue counter
           */
- atomic_sub(nstatus, &adapter->pend_cmds);
+ atomic_sub(nstatus, (atomic_t *)&adapter->pend_cmds);

          memcpy(completed, (void *)adapter->mbox->completed, nstatus);

@@ -1839,7 +1858,7 @@
     unsigned long flags;

- spin_lock_irqsave(&adapter->lock, flags);
+ spin_lock_irqsave(adapter->host_lock, flags);

     megaraid_memmbox_ack_sequence(adapter);

@@ -1848,7 +1867,7 @@
          mega_runpendq(adapter);
     }

- spin_unlock_irqrestore(&adapter->lock, flags);
+ spin_unlock_irqrestore(adapter->host_lock, flags);

     return;
 }
@@ -1883,17 +1902,18 @@
          }
          WROUTDOOR(adapter, 0x10001234);

- while((nstatus = adapter->mbox->numstatus) == 0xFF) {
+ while((nstatus = (volatile u8)adapter->mbox->numstatus)
+ == 0xFF)
               cpu_relax();
- }
          adapter->mbox->numstatus = 0xFF;

- status = adapter->mbox->status;
+ while((status = (volatile u8)adapter->mbox->status) == 0xFF)
+ cpu_relax();

          /*
           * decrement the pending queue counter
           */
- atomic_sub(nstatus, &adapter->pend_cmds);
+ atomic_sub(nstatus, (atomic_t *)&adapter->pend_cmds);

          memcpy(completed, (void *)adapter->mbox->completed, nstatus);

@@ -2395,7 +2415,9 @@
     adapter_t *adapter;
     mbox_t *mbox;
     u_char raw_mbox[16];
+#ifdef CONFIG_PROC_FS
     char buf[12] = { 0 };
+#endif

     adapter = (adapter_t *)host->hostdata;
     mbox = (mbox_t *)raw_mbox;
@@ -2597,7 +2619,7 @@

     adapter = (adapter_t *)scp->host->hostdata;

- ASSERT( spin_is_locked(&adapter->lock) );
+ ASSERT( spin_is_locked(adapter->host_lock) );

     printk("megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
          scp->serial_number, scp->cmnd[0], scp->channel, scp->target,
@@ -2640,8 +2662,7 @@
      * completed by the firmware
      */
     iter = 0;
- while( !list_empty(&adapter->pending_list) ) {
-
+ while( atomic_read(&adapter->pend_cmds) > 0 ) {
          /*
           * Perform the ack sequence, since interrupts are not
           * available right now!
@@ -2694,7 +2715,7 @@

     adapter = (adapter_t *)cmd->host->hostdata;

- ASSERT( spin_is_locked(&adapter->lock) );
+ ASSERT( spin_is_locked(adapter->host_lock) );

     printk("megaraid: reset-%ld cmd=%x <c=%d t=%d l=%d>\n",
          cmd->serial_number, cmd->cmnd[0], cmd->channel, cmd->target,
@@ -2705,7 +2726,7 @@
     mc.cmd = MEGA_CLUSTER_CMD;
     mc.opcode = MEGA_RESET_RESERVATIONS;

- spin_unlock_irq(&adapter->lock);
+ spin_unlock_irq(adapter->host_lock);
     if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
          printk(KERN_WARNING
                    "megaraid: reservation reset failed.\n");
@@ -2713,7 +2734,7 @@
     else {
          printk(KERN_INFO "megaraid: reservation reset.\n");
     }
- spin_lock_irq(&adapter->lock);
+ spin_lock_irq(adapter->host_lock);
 #endif

     /*
@@ -2721,8 +2742,7 @@
      * firmware
      */
     iter = 0;
- while( !list_empty(&adapter->pending_list) ) {
-
+ while( atomic_read(&adapter->pend_cmds) > 0 ) {
          /*
           * Perform the ack sequence, since interrupts are not
           * available right now!
@@ -3564,6 +3584,7 @@
     u32 array_sz;
     int len = 0;
     int i;
+ u8 span8_flag = 1;

     pdev = adapter->ipdev;

@@ -3585,6 +3606,7 @@
     memset(&mc, 0, sizeof(megacmd_t));

     if( adapter->flag & BOARD_40LD ) {
+
          array_sz = sizeof(disk_array_40ld);

          rdrv_state = ((mega_inquiry3 *)inquiry)->ldrv_state;
@@ -3592,7 +3614,12 @@
          num_ldrv = ((mega_inquiry3 *)inquiry)->num_ldrv;
     }
     else {
- array_sz = sizeof(disk_array_8ld);
+ /*
+ * 'array_sz' is either the size of diskarray_span4_t or the
+ * size of disk_array_span8_t. We use span8_t's size because
+ * it is bigger of the two.
+ */
+ array_sz = sizeof( diskarray_span8_t );

          rdrv_state = ((mraid_ext_inquiry *)inquiry)->
               raid_inq.logdrv_info.ldrv_state;
@@ -3632,10 +3659,17 @@

     }
     else {
+ /*
+ * Try 8-Span "read config" command
+ */
          mc.cmd = NEW_READ_CONFIG_8LD;

          if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {

+ /*
+ * 8-Span command failed; try 4-Span command
+ */
+ span8_flag = 0;
               mc.cmd = READ_CONFIG_8LD;

               if( mega_internal_command(adapter, LOCK_INT, &mc,
@@ -3662,8 +3696,14 @@
               &((disk_array_40ld *)disk_array)->ldrv[i].lparam;
          }
          else {
- lparam =
- &((disk_array_8ld *)disk_array)->ldrv[i].lparam;
+ if( span8_flag ) {
+ lparam = (logdrv_param*) &((diskarray_span8_t*)
+ (disk_array))->log_drv[i];
+ }
+ else {
+ lparam = (logdrv_param*) &((diskarray_span4_t*)
+ (disk_array))->log_drv[i];
+ }
          }

          /*
@@ -4705,7 +4745,7 @@

     mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, sizeof(mbox));
+ memset(mbox, 0, 16);

     memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);

@@ -4738,7 +4778,7 @@

     mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, sizeof(mbox));
+ memset(mbox, 0, 16);

     /*
      * issue command to find out what channels are raid/scsi
@@ -4859,7 +4899,7 @@

     mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, sizeof(mbox));
+ memset(mbox, 0, 16);

     /*
      * issue command
@@ -4888,7 +4928,7 @@

     mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, sizeof (mbox));
+ memset(mbox, 0, 16);
     /*
      * issue command to find out if controller supports extended CDBs.
      */
@@ -4917,7 +4957,7 @@
     scb_t *scb;
     int rval;

- ASSERT( !spin_is_locked(&adapter->lock) );
+ ASSERT( !spin_is_locked(adapter->host_lock) );

     /*
      * Stop sending commands to the controller, queue them internally.
@@ -4937,7 +4977,7 @@
     rval = mega_do_del_logdrv(adapter, logdrv);

- spin_lock_irqsave(&adapter->lock, flags);
+ spin_lock_irqsave(adapter->host_lock, flags);

     /*
      * If delete operation was successful, add 0x80 to the logical drive
@@ -4956,7 +4996,7 @@

     mega_runpendq(adapter);

- spin_unlock_irqrestore(&adapter->lock, flags);
+ spin_unlock_irqrestore(adapter->host_lock, flags);

     return rval;
 }
@@ -5318,6 +5358,7 @@

+#ifdef CONFIG_PROC_FS
 /**
  * mega_adapinq()
  * @adapter - pointer to our soft state
@@ -5440,6 +5481,7 @@

     return rval;
 }
+#endif // #ifdef CONFIG_PROC_FS

 /**
@@ -5504,11 +5546,11 @@
     /*
      * Get the lock only if the caller has not acquired it already
      */
- if( ls == LOCK_INT ) spin_lock_irqsave(&adapter->lock, flags);
+ if( ls == LOCK_INT ) spin_lock_irqsave(adapter->host_lock, flags);

     megaraid_queue(scmd, mega_internal_done);

- if( ls == LOCK_INT ) spin_unlock_irqrestore(&adapter->lock, flags);
+ if( ls == LOCK_INT ) spin_unlock_irqrestore(adapter->host_lock, flags);

     /*
      * Wait till this command finishes. Do not use
diff -Nru linux-2.4.22-pre10-ac1/drivers/scsi/megaraid2.h linux-2.4.22-pre10-ac1-mr7/drivers/scsi/megaraid2.h
--- linux-2.4.22-pre10-ac1/drivers/scsi/megaraid2.h 2003-08-02 10:20:33.000000000 +0900
+++ linux-2.4.22-pre10-ac1-mr7/drivers/scsi/megaraid2.h 2003-08-02 10:52:39.000000000 +0900
@@ -6,7 +6,7 @@

 #define MEGARAID_VERSION \
- "v2.00.5 (Release Date: Thu Apr 24 14:06:55 EDT 2003)\n"
+ "v2.00.7 (Release Date: Fri Aug 1 11:01:11 EDT 2003)\n"

 /*
  * Driver features - change the values to enable or disable features in the
@@ -83,6 +83,7 @@
 #define DELL_SUBSYS_VID 0x1028
 #define HP_SUBSYS_VID 0x103C
 #define LSI_SUBSYS_VID 0x1000
+#define INTEL_SUBSYS_VID 0x8086

 #define HBA_SIGNATURE 0x3344
 #define HBA_SIGNATURE_471 0xCCCC
@@ -509,6 +510,70 @@
     phys_drv pdrv[MAX_PHYSICAL_DRIVES];
 }__attribute__ ((packed)) disk_array_8ld;

+/*
+ * FW Definitions & Data Structures for 8LD 4-Span and 8-Span Controllers
+ */
+#define MAX_STRIPES 8
+#define SPAN4_DEPTH 4
+#define SPAN8_DEPTH 8
+#define MAX_PHYDRVS 5 * 16 /* 5 Channels * 16 Targets */
+
+typedef struct {
+ unsigned char channel;
+ unsigned char target;
+}__attribute__ ((packed)) device_t;
+
+typedef struct {
+ unsigned long start_blk;
+ unsigned long total_blks;
+ device_t device[ MAX_STRIPES ];
+}__attribute__ ((packed)) span_t;
+
+typedef struct {
+ unsigned char type;
+ unsigned char curr_status;
+ unsigned char tag_depth;
+ unsigned char resvd1;
+ unsigned long size;
+}__attribute__ ((packed)) phydrv_t;
+
+typedef struct {
+ unsigned char span_depth;
+ unsigned char raid;
+ unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive */
+ unsigned char stripe_sz;
+ unsigned char status;
+ unsigned char write_policy; /* 0=wrthru,1=wrbak */
+ unsigned char direct_io; /* 1=directio,0=cached */
+ unsigned char no_stripes;
+ span_t span[ SPAN4_DEPTH ];
+}__attribute__ ((packed)) ld_span4_t;
+
+typedef struct {
+ unsigned char span_depth;
+ unsigned char raid;
+ unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive */
+ unsigned char stripe_sz;
+ unsigned char status;
+ unsigned char write_policy; /* 0=wrthru,1=wrbak */
+ unsigned char direct_io; /* 1=directio,0=cached */
+ unsigned char no_stripes;
+ span_t span[ SPAN8_DEPTH ];
+}__attribute__ ((packed)) ld_span8_t;
+
+typedef struct {
+ unsigned char no_log_drives;
+ unsigned char pad[3];
+ ld_span4_t log_drv[ MAX_LOGICAL_DRIVES_8LD ];
+ phydrv_t phys_drv[ MAX_PHYDRVS ];
+}__attribute__ ((packed)) diskarray_span4_t;
+
+typedef struct {
+ unsigned char no_log_drives;
+ unsigned char pad[3];
+ ld_span8_t log_drv[ MAX_LOGICAL_DRIVES_8LD ];
+ phydrv_t phys_drv[ MAX_PHYDRVS ];
+}__attribute__ ((packed)) diskarray_span8_t;

 /*
  * User ioctl structure.
@@ -847,8 +912,8 @@
     u8 max_cmds;
     scb_t *scb_list;

- atomic_t pend_cmds; /* maintain a counter for pending
- commands in firmware */
+ volatile atomic_t pend_cmds; /* maintain a counter for
+ pending commands in firmware */

 #if MEGA_HAVE_STATS
     u32 nreads[MAX_LOGICAL_DRIVES_40LD];
@@ -899,6 +964,7 @@
                            sending requests to the hba till
                            delete operation is completed */
     spinlock_t lock;
+ spinlock_t *host_lock; // pointer to appropriate lock

     u8 logdrv_chan[MAX_CHANNELS+NVIRT_CHAN]; /* logical drive are on
                                   what channels. */
@@ -1049,7 +1115,6 @@
 static int megaraid_abort(Scsi_Cmnd *);
 static int megaraid_reset(Scsi_Cmnd *);
 static int megaraid_biosparam (Disk *, kdev_t, int *);
-static int mega_print_inquiry(char *, char *);

 static int mega_build_sglist (adapter_t *adapter, scb_t *scb,
                     u32 *buffer, u32 *length);
@@ -1092,12 +1157,13 @@
 static int proc_rdrv_30(char *, char **, off_t, int, int *, void *);
 static int proc_rdrv_40(char *, char **, off_t, int, int *, void *);
 static int proc_rdrv(adapter_t *, char *, int, int);
-#endif

 static int mega_adapinq(adapter_t *, dma_addr_t);
 static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);
 static inline caddr_t mega_allocate_inquiry(dma_addr_t *, struct pci_dev *);
 static inline void mega_free_inquiry(caddr_t, dma_addr_t, struct pci_dev *);
+static int mega_print_inquiry(char *, char *);
+#endif

 static int mega_support_ext_cdb(adapter_t *);
 static mega_passthru* mega_prepare_passthru(adapter_t *, scb_t *,

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



This archive was generated by hypermail 2b29 : Thu Aug 07 2003 - 22:00:18 EST