diff options
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_init.c | 2 | ||||
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_sas.h | 1 | ||||
-rw-r--r-- | 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 6faa10f59c18..7344f4d59a7d 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) | |||
234 | } | 234 | } |
235 | /* Provide some sane default values. */ | 235 | /* Provide some sane default values. */ |
236 | asd_ha->hw_prof.max_scbs = 512; | 236 | asd_ha->hw_prof.max_scbs = 512; |
237 | asd_ha->hw_prof.max_ddbs = 128; | 237 | asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS; |
238 | asd_ha->hw_prof.num_phys = ASD_MAX_PHYS; | 238 | asd_ha->hw_prof.num_phys = ASD_MAX_PHYS; |
239 | /* All phys are enabled, by default. */ | 239 | /* All phys are enabled, by default. */ |
240 | asd_ha->hw_prof.enabled_phys = 0xFF; | 240 | asd_ha->hw_prof.enabled_phys = 0xFF; |
diff --git a/drivers/scsi/aic94xx/aic94xx_sas.h b/drivers/scsi/aic94xx/aic94xx_sas.h index 9050e93bfd5e..fa7c5290257d 100644 --- a/drivers/scsi/aic94xx/aic94xx_sas.h +++ b/drivers/scsi/aic94xx/aic94xx_sas.h | |||
@@ -34,6 +34,7 @@ | |||
34 | * domain that this sequencer can maintain low-level connections for | 34 | * domain that this sequencer can maintain low-level connections for |
35 | * us. They are be 64 bytes. | 35 | * us. They are be 64 bytes. |
36 | */ | 36 | */ |
37 | #define ASD_MAX_DDBS 128 | ||
37 | 38 | ||
38 | struct asd_ddb_ssp_smp_target_port { | 39 | struct asd_ddb_ssp_smp_target_port { |
39 | u8 conn_type; /* byte 0 */ | 40 | u8 conn_type; /* byte 0 */ |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c b/drivers/scsi/aic94xx/aic94xx_seq.c index 21569ecd8ec8..0d343cfd4333 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) | |||
907 | for (i = 0; i < ASD_SCB_SIZE; i += 4) | 907 | for (i = 0; i < ASD_SCB_SIZE; i += 4) |
908 | asd_scbsite_write_dword(asd_ha, site_no, i, 0); | 908 | asd_scbsite_write_dword(asd_ha, site_no, i, 0); |
909 | 909 | ||
910 | /* Initialize SCB Site Opcode field to invalid. */ | ||
911 | asd_scbsite_write_byte(asd_ha, site_no, | ||
912 | offsetof(struct scb_header, opcode), | ||
913 | 0xFF); | ||
914 | |||
915 | /* Initialize SCB Site Flags field to mean a response | ||
916 | * frame has been received. This means inadvertent | ||
917 | * frames received to be dropped. */ | ||
918 | asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01); | ||
919 | |||
910 | /* Workaround needed by SEQ to fix a SATA issue is to exclude | 920 | /* Workaround needed by SEQ to fix a SATA issue is to exclude |
911 | * certain SCB sites from the free list. */ | 921 | * certain SCB sites from the free list. */ |
912 | if (!SCB_SITE_VALID(site_no)) | 922 | if (!SCB_SITE_VALID(site_no)) |
@@ -922,16 +932,6 @@ static void asd_init_scb_sites(struct asd_ha_struct *asd_ha) | |||
922 | /* Q_NEXT field of the last SCB is invalidated. */ | 932 | /* Q_NEXT field of the last SCB is invalidated. */ |
923 | asd_scbsite_write_word(asd_ha, site_no, 0, first_scb_site_no); | 933 | asd_scbsite_write_word(asd_ha, site_no, 0, first_scb_site_no); |
924 | 934 | ||
925 | /* Initialize SCB Site Opcode field to invalid. */ | ||
926 | asd_scbsite_write_byte(asd_ha, site_no, | ||
927 | offsetof(struct scb_header, opcode), | ||
928 | 0xFF); | ||
929 | |||
930 | /* Initialize SCB Site Flags field to mean a response | ||
931 | * frame has been received. This means inadvertent | ||
932 | * frames received to be dropped. */ | ||
933 | asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01); | ||
934 | |||
935 | first_scb_site_no = site_no; | 935 | first_scb_site_no = site_no; |
936 | max_scbs++; | 936 | max_scbs++; |
937 | } | 937 | } |
@@ -1173,6 +1173,16 @@ static void asd_init_ddb_0(struct asd_ha_struct *asd_ha) | |||
1173 | set_bit(0, asd_ha->hw_prof.ddb_bitmap); | 1173 | set_bit(0, asd_ha->hw_prof.ddb_bitmap); |
1174 | } | 1174 | } |
1175 | 1175 | ||
1176 | static void asd_seq_init_ddb_sites(struct asd_ha_struct *asd_ha) | ||
1177 | { | ||
1178 | unsigned int i; | ||
1179 | unsigned int ddb_site; | ||
1180 | |||
1181 | for (ddb_site = 0 ; ddb_site < ASD_MAX_DDBS; ddb_site++) | ||
1182 | for (i = 0; i < sizeof(struct asd_ddb_ssp_smp_target_port); i+= 4) | ||
1183 | asd_ddbsite_write_dword(asd_ha, ddb_site, i, 0); | ||
1184 | } | ||
1185 | |||
1176 | /** | 1186 | /** |
1177 | * asd_seq_setup_seqs -- setup and initialize central and link sequencers | 1187 | * asd_seq_setup_seqs -- setup and initialize central and link sequencers |
1178 | * @asd_ha: pointer to host adapter structure | 1188 | * @asd_ha: pointer to host adapter structure |
@@ -1182,6 +1192,9 @@ static void asd_seq_setup_seqs(struct asd_ha_struct *asd_ha) | |||
1182 | int lseq; | 1192 | int lseq; |
1183 | u8 lseq_mask; | 1193 | u8 lseq_mask; |
1184 | 1194 | ||
1195 | /* Initialize DDB sites */ | ||
1196 | asd_seq_init_ddb_sites(asd_ha); | ||
1197 | |||
1185 | /* Initialize SCB sites. Done first to compute some values which | 1198 | /* Initialize SCB sites. Done first to compute some values which |
1186 | * the rest of the init code depends on. */ | 1199 | * the rest of the init code depends on. */ |
1187 | asd_init_scb_sites(asd_ha); | 1200 | asd_init_scb_sites(asd_ha); |