V4L/DVB (9711): gspca: Let gspca handle the webcams 045e:00f5 & 00f7 instead of sn9c102.
[safe/jmp/linux-2.6] / drivers / scsi / aic94xx / aic94xx_seq.c
index 2768fe4..8f98e33 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,
@@ -810,6 +788,8 @@ static void asd_init_lseq_mdp(struct asd_ha_struct *asd_ha,  int lseq)
        /* No delay for the first NOTIFY to be sent to the attached target. */
        asd_write_reg_word(asd_ha, LmSEQ_NOTIFY_TIMER_DOWN_COUNT(lseq),
                           ASD_NOTIFY_DOWN_COUNT);
+       asd_write_reg_word(asd_ha, LmSEQ_NOTIFY_TIMER_INITIAL_COUNT(lseq),
+                          ASD_NOTIFY_DOWN_COUNT);
 
        /* LSEQ Mode dependent, mode 0 and 1, page 1 setup. */
        for (i = 0; i < 2; i++) {
@@ -1255,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;
 
@@ -1269,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);
@@ -1301,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;
@@ -1333,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",