提交 3b709df5 编写于 作者: D Darrick J. Wong 提交者: James Bottomley

[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: NDarrick J. Wong <djwong@us.ibm.com>
Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
上级 bf2a1928
...@@ -234,7 +234,7 @@ static int __devinit asd_common_setup(struct asd_ha_struct *asd_ha) ...@@ -234,7 +234,7 @@ static int __devinit asd_common_setup(struct asd_ha_struct *asd_ha)
} }
/* Provide some sane default values. */ /* Provide some sane default values. */
asd_ha->hw_prof.max_scbs = 512; 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; asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
/* All phys are enabled, by default. */ /* All phys are enabled, by default. */
asd_ha->hw_prof.enabled_phys = 0xFF; asd_ha->hw_prof.enabled_phys = 0xFF;
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
* domain that this sequencer can maintain low-level connections for * domain that this sequencer can maintain low-level connections for
* us. They are be 64 bytes. * us. They are be 64 bytes.
*/ */
#define ASD_MAX_DDBS 128
struct asd_ddb_ssp_smp_target_port { struct asd_ddb_ssp_smp_target_port {
u8 conn_type; /* byte 0 */ u8 conn_type; /* byte 0 */
......
...@@ -907,6 +907,16 @@ static void asd_init_scb_sites(struct asd_ha_struct *asd_ha) ...@@ -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) for (i = 0; i < ASD_SCB_SIZE; i += 4)
asd_scbsite_write_dword(asd_ha, site_no, i, 0); 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 /* Workaround needed by SEQ to fix a SATA issue is to exclude
* certain SCB sites from the free list. */ * certain SCB sites from the free list. */
if (!SCB_SITE_VALID(site_no)) if (!SCB_SITE_VALID(site_no))
...@@ -922,16 +932,6 @@ static void asd_init_scb_sites(struct asd_ha_struct *asd_ha) ...@@ -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. */ /* Q_NEXT field of the last SCB is invalidated. */
asd_scbsite_write_word(asd_ha, site_no, 0, first_scb_site_no); 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; first_scb_site_no = site_no;
max_scbs++; max_scbs++;
} }
...@@ -1173,6 +1173,16 @@ static void asd_init_ddb_0(struct asd_ha_struct *asd_ha) ...@@ -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); 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_seq_setup_seqs -- setup and initialize central and link sequencers
* @asd_ha: pointer to host adapter structure * @asd_ha: pointer to host adapter structure
...@@ -1182,6 +1192,9 @@ static void asd_seq_setup_seqs(struct asd_ha_struct *asd_ha) ...@@ -1182,6 +1192,9 @@ static void asd_seq_setup_seqs(struct asd_ha_struct *asd_ha)
int lseq; int lseq;
u8 lseq_mask; u8 lseq_mask;
/* Initialize DDB sites */
asd_seq_init_ddb_sites(asd_ha);
/* Initialize SCB sites. Done first to compute some values which /* Initialize SCB sites. Done first to compute some values which
* the rest of the init code depends on. */ * the rest of the init code depends on. */
asd_init_scb_sites(asd_ha); asd_init_scb_sites(asd_ha);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册