|
@@ -3948,6 +3948,67 @@ qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data)
|
|
|
return rval;
|
|
|
}
|
|
|
|
|
|
+int
|
|
|
+qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb)
|
|
|
+{
|
|
|
+ int rval;
|
|
|
+ uint32_t stat, timer;
|
|
|
+ uint16_t mb0 = 0;
|
|
|
+ struct qla_hw_data *ha = vha->hw;
|
|
|
+ struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
|
|
+
|
|
|
+ rval = QLA_SUCCESS;
|
|
|
+
|
|
|
+ DEBUG11(qla_printk(KERN_INFO, ha,
|
|
|
+ "%s(%ld): entered.\n", __func__, vha->host_no));
|
|
|
+
|
|
|
+ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
|
|
|
+
|
|
|
+ /* Write the MBC data to the registers */
|
|
|
+ WRT_REG_WORD(®->mailbox0, MBC_WRITE_MPI_REGISTER);
|
|
|
+ WRT_REG_WORD(®->mailbox1, mb[0]);
|
|
|
+ WRT_REG_WORD(®->mailbox2, mb[1]);
|
|
|
+ WRT_REG_WORD(®->mailbox3, mb[2]);
|
|
|
+ WRT_REG_WORD(®->mailbox4, mb[3]);
|
|
|
+
|
|
|
+ WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT);
|
|
|
+
|
|
|
+ /* Poll for MBC interrupt */
|
|
|
+ for (timer = 6000000; timer; timer--) {
|
|
|
+ /* Check for pending interrupts. */
|
|
|
+ stat = RD_REG_DWORD(®->host_status);
|
|
|
+ if (stat & HSRX_RISC_INT) {
|
|
|
+ stat &= 0xff;
|
|
|
+
|
|
|
+ if (stat == 0x1 || stat == 0x2 ||
|
|
|
+ stat == 0x10 || stat == 0x11) {
|
|
|
+ set_bit(MBX_INTERRUPT,
|
|
|
+ &ha->mbx_cmd_flags);
|
|
|
+ mb0 = RD_REG_WORD(®->mailbox0);
|
|
|
+ WRT_REG_DWORD(®->hccr,
|
|
|
+ HCCRX_CLR_RISC_INT);
|
|
|
+ RD_REG_DWORD(®->hccr);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ udelay(5);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags))
|
|
|
+ rval = mb0 & MBS_MASK;
|
|
|
+ else
|
|
|
+ rval = QLA_FUNCTION_FAILED;
|
|
|
+
|
|
|
+ if (rval != QLA_SUCCESS) {
|
|
|
+ DEBUG2_3_11(printk(KERN_INFO "%s(%ld): failed=%x mb[0]=%x.\n",
|
|
|
+ __func__, vha->host_no, rval, mb[0]));
|
|
|
+ } else {
|
|
|
+ DEBUG11(printk(KERN_INFO
|
|
|
+ "%s(%ld): done.\n", __func__, vha->host_no));
|
|
|
+ }
|
|
|
+
|
|
|
+ return rval;
|
|
|
+}
|
|
|
int
|
|
|
qla2x00_get_data_rate(scsi_qla_host_t *vha)
|
|
|
{
|