]> err.no Git - linux-2.6/blobdiff - drivers/scsi/aic94xx/aic94xx_seq.c
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / drivers / scsi / aic94xx / aic94xx_seq.c
index eae7a247becebf8d6f512dcd7fba384aa5aa7957..8f98e33155e9dbd9e8c391544a08ef5bd306c5ec 100644 (file)
 #define PAUSE_TRIES 1000
 
 static const struct firmware *sequencer_fw;
-static const char *sequencer_version;
 static u16 cseq_vecs[CSEQ_NUM_VECS], lseq_vecs[LSEQ_NUM_VECS], mode2_task,
        cseq_idle_loop, lseq_idle_loop;
-static u8 *cseq_code, *lseq_code;
+static const u8 *cseq_code, *lseq_code;
 static u32 cseq_code_size, lseq_code_size;
 
 static u16 first_scb_site_no = 0xFFFF;
@@ -61,7 +60,7 @@ static u16 last_scb_site_no;
  *
  * Return 0 on success, negative on failure.
  */
-int asd_pause_cseq(struct asd_ha_struct *asd_ha)
+static int asd_pause_cseq(struct asd_ha_struct *asd_ha)
 {
        int     count = PAUSE_TRIES;
        u32     arp2ctl;
@@ -88,7 +87,7 @@ int asd_pause_cseq(struct asd_ha_struct *asd_ha)
  *
  * Return 0 on success, negative on error.
  */
-int asd_unpause_cseq(struct asd_ha_struct *asd_ha)
+static int asd_unpause_cseq(struct asd_ha_struct *asd_ha)
 {
        u32     arp2ctl;
        int     count = PAUSE_TRIES;
@@ -116,7 +115,7 @@ int asd_unpause_cseq(struct asd_ha_struct *asd_ha)
  *
  * Return 0 on success, negative on error.
  */
-static inline int asd_seq_pause_lseq(struct asd_ha_struct *asd_ha, int lseq)
+static int asd_seq_pause_lseq(struct asd_ha_struct *asd_ha, int lseq)
 {
        u32    arp2ctl;
        int    count = PAUSE_TRIES;
@@ -144,7 +143,7 @@ static inline int asd_seq_pause_lseq(struct asd_ha_struct *asd_ha, int lseq)
  *
  * Return 0 on success, negative on failure.
  */
-int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask)
+static int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask)
 {
        int lseq;
        int err = 0;
@@ -165,7 +164,7 @@ int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask)
  *
  * Return 0 on success, negative on error.
  */
-static inline int asd_seq_unpause_lseq(struct asd_ha_struct *asd_ha, int lseq)
+static int asd_seq_unpause_lseq(struct asd_ha_struct *asd_ha, int lseq)
 {
        u32 arp2ctl;
        int count = PAUSE_TRIES;
@@ -187,27 +186,6 @@ static inline int asd_seq_unpause_lseq(struct asd_ha_struct *asd_ha, int lseq)
 }
 
 
-/**
- * asd_unpause_lseq - unpause the link sequencer(s)
- * @asd_ha: pointer to host adapter structure
- * @lseq_mask: mask of link sequencers of interest
- *
- * Return 0 on success, negative on failure.
- */
-int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask)
-{
-       int lseq;
-       int err = 0;
-
-       for_each_sequencer(lseq_mask, lseq_mask, lseq) {
-               err = asd_seq_unpause_lseq(asd_ha, lseq);
-               if (err)
-                       return err;
-       }
-
-       return err;
-}
-
 /* ---------- Downloading CSEQ/LSEQ microcode ---------- */
 
 static int asd_verify_cseq(struct asd_ha_struct *asd_ha, const u8 *_prog,
@@ -1257,7 +1235,8 @@ int asd_release_firmware(void)
 static int asd_request_firmware(struct asd_ha_struct *asd_ha)
 {
        int err, i;
-       struct sequencer_file_header header, *hdr_ptr;
+       struct sequencer_file_header header;
+       const struct sequencer_file_header *hdr_ptr;
        u32 csum = 0;
        u16 *ptr_cseq_vecs, *ptr_lseq_vecs;
 
@@ -1271,12 +1250,11 @@ static int asd_request_firmware(struct asd_ha_struct *asd_ha)
        if (err)
                return err;
 
-       hdr_ptr = (struct sequencer_file_header *)sequencer_fw->data;
+       hdr_ptr = (const struct sequencer_file_header *)sequencer_fw->data;
 
        header.csum = le32_to_cpu(hdr_ptr->csum);
        header.major = le32_to_cpu(hdr_ptr->major);
        header.minor = le32_to_cpu(hdr_ptr->minor);
-       sequencer_version = hdr_ptr->version;
        header.cseq_table_offset = le32_to_cpu(hdr_ptr->cseq_table_offset);
        header.cseq_table_size = le32_to_cpu(hdr_ptr->cseq_table_size);
        header.lseq_table_offset = le32_to_cpu(hdr_ptr->lseq_table_offset);
@@ -1303,6 +1281,16 @@ static int asd_request_firmware(struct asd_ha_struct *asd_ha)
                return -EINVAL;
        }
 
+       asd_printk("Found sequencer Firmware version %d.%d (%s)\n",
+                  header.major, header.minor, hdr_ptr->version);
+
+       if (header.major != SAS_RAZOR_SEQUENCER_FW_MAJOR) {
+               asd_printk("Firmware Major Version Mismatch;"
+                          "driver requires version %d.X",
+                          SAS_RAZOR_SEQUENCER_FW_MAJOR);
+               return -EINVAL;
+       }
+
        ptr_cseq_vecs = (u16 *)&sequencer_fw->data[header.cseq_table_offset];
        ptr_lseq_vecs = (u16 *)&sequencer_fw->data[header.lseq_table_offset];
        mode2_task = header.mode2_task;
@@ -1335,7 +1323,6 @@ int asd_init_seqs(struct asd_ha_struct *asd_ha)
                return err;
        }
 
-       asd_printk("using sequencer %s\n", sequencer_version);
        err = asd_seq_download_seqs(asd_ha);
        if (err) {
                asd_printk("couldn't download sequencers for %s\n",