Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b709df5f7c83b6b0907217a248a1414a37ffcb6
Commit:     3b709df5f7c83b6b0907217a248a1414a37ffcb6
Parent:     bf2a1928f3e5d44934e974940a8260a57fcc8a58
Author:     Darrick J. Wong <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 11 14:15:29 2007 -0800
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Sat Jan 13 16:19:24 2007 -0600

    [SCSI] aic94xx: Fix DDB and SCB initialization
    
    Ed Chim of Adaptec informs us that the DDB registers need to be zeroed at
    initialization time and that some SCB initializations need to happen even if
    we don't use the SCB.
    
    Signed-off-by: Darrick J. Wong <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/scsi/aic94xx/aic94xx_init.c |    2 +-
 drivers/scsi/aic94xx/aic94xx_sas.h  |    1 +
 drivers/scsi/aic94xx/aic94xx_seq.c  |   33 +++++++++++++++++++++++----------
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/aic94xx/aic94xx_init.c 
b/drivers/scsi/aic94xx/aic94xx_init.c
index 6faa10f..7344f4d 100644
--- a/drivers/scsi/aic94xx/aic94xx_init.c
+++ b/drivers/scsi/aic94xx/aic94xx_init.c
@@ -234,7 +234,7 @@ static int __devinit asd_common_setup(struct asd_ha_struct 
*asd_ha)
        }
        /* Provide some sane default values. */
        asd_ha->hw_prof.max_scbs = 512;
-       asd_ha->hw_prof.max_ddbs = 128;
+       asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS;
        asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
        /* All phys are enabled, by default. */
        asd_ha->hw_prof.enabled_phys = 0xFF;
diff --git a/drivers/scsi/aic94xx/aic94xx_sas.h 
b/drivers/scsi/aic94xx/aic94xx_sas.h
index 9050e93..fa7c529 100644
--- a/drivers/scsi/aic94xx/aic94xx_sas.h
+++ b/drivers/scsi/aic94xx/aic94xx_sas.h
@@ -34,6 +34,7 @@
  * domain that this sequencer can maintain low-level connections for
  * us.  They are be 64 bytes.
  */
+#define ASD_MAX_DDBS   128
 
 struct asd_ddb_ssp_smp_target_port {
        u8     conn_type;         /* byte 0 */
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c 
b/drivers/scsi/aic94xx/aic94xx_seq.c
index 21569ec..0d343cf 100644
--- a/drivers/scsi/aic94xx/aic94xx_seq.c
+++ b/drivers/scsi/aic94xx/aic94xx_seq.c
@@ -907,6 +907,16 @@ static void asd_init_scb_sites(struct asd_ha_struct 
*asd_ha)
                for (i = 0; i < ASD_SCB_SIZE; i += 4)
                        asd_scbsite_write_dword(asd_ha, site_no, i, 0);
 
+               /* Initialize SCB Site Opcode field to invalid. */
+               asd_scbsite_write_byte(asd_ha, site_no,
+                                      offsetof(struct scb_header, opcode),
+                                      0xFF);
+
+               /* Initialize SCB Site Flags field to mean a response
+                * frame has been received.  This means inadvertent
+                * frames received to be dropped. */
+               asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01);
+
                /* Workaround needed by SEQ to fix a SATA issue is to exclude
                 * certain SCB sites from the free list. */
                if (!SCB_SITE_VALID(site_no))
@@ -922,16 +932,6 @@ static void asd_init_scb_sites(struct asd_ha_struct 
*asd_ha)
                /* Q_NEXT field of the last SCB is invalidated. */
                asd_scbsite_write_word(asd_ha, site_no, 0, first_scb_site_no);
 
-               /* Initialize SCB Site Opcode field to invalid. */
-               asd_scbsite_write_byte(asd_ha, site_no,
-                                      offsetof(struct scb_header, opcode),
-                                      0xFF);
-
-               /* Initialize SCB Site Flags field to mean a response
-                * frame has been received.  This means inadvertent
-                * frames received to be dropped. */
-               asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01);
-
                first_scb_site_no = site_no;
                max_scbs++;
        }
@@ -1173,6 +1173,16 @@ static void asd_init_ddb_0(struct asd_ha_struct *asd_ha)
        set_bit(0, asd_ha->hw_prof.ddb_bitmap);
 }
 
+static void asd_seq_init_ddb_sites(struct asd_ha_struct *asd_ha)
+{
+       unsigned int i;
+       unsigned int ddb_site;
+
+       for (ddb_site = 0 ; ddb_site < ASD_MAX_DDBS; ddb_site++)
+               for (i = 0; i < sizeof(struct asd_ddb_ssp_smp_target_port); i+= 
4)
+                       asd_ddbsite_write_dword(asd_ha, ddb_site, i, 0);
+}
+
 /**
  * asd_seq_setup_seqs -- setup and initialize central and link sequencers
  * @asd_ha: pointer to host adapter structure
@@ -1182,6 +1192,9 @@ static void asd_seq_setup_seqs(struct asd_ha_struct 
*asd_ha)
        int             lseq;
        u8              lseq_mask;
 
+       /* Initialize DDB sites */
+       asd_seq_init_ddb_sites(asd_ha);
+
        /* Initialize SCB sites. Done first to compute some values which
         * the rest of the init code depends on. */
        asd_init_scb_sites(asd_ha);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to