aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_mbx.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-10-22 20:34:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-22 20:34:15 -0400
commitc70b5296e775cde46cfcb2d860ba160108a5ec7a (patch)
tree30419cb982acca44499236adcca65f2f87698c74 /drivers/scsi/qla2xxx/qla_mbx.c
parent80c226fbef56576946c9655fcb2ab62e63404d12 (diff)
parent58ff4bd042adf8013c8f70fd03c2c0f8d022e387 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (84 commits) [SCSI] be2iscsi: SGE Len == 64K [SCSI] be2iscsi: Remove premature free of cid [SCSI] be2iscsi: More time for FW [SCSI] libsas: fix bug for vacant phy [SCSI] sd: Fix overflow with big physical blocks [SCSI] st: add MTWEOFI to write filemarks without flushing drive buffer [SCSI] libsas: Don't issue commands to devices that have been hot-removed [SCSI] megaraid_sas: Add Online Controller Reset to MegaRAID SAS drive [SCSI] lpfc 8.3.17: Update lpfc driver version to 8.3.17 [SCSI] lpfc 8.3.17: Replace function reset methodology [SCSI] lpfc 8.3.17: SCSI fixes [SCSI] lpfc 8.3.17: BSG fixes [SCSI] lpfc 8.3.17: SLI Additions and Fixes [SCSI] lpfc 8.3.17: Code Cleanup and Locking fixes [SCSI] zfcp: Remove scsi_cmnd->serial_number from debug traces [SCSI] ipr: fix array error logging [SCSI] aha152x: enable PCMCIA on 64bit [SCSI] scsi_dh_alua: Handle all states correctly [SCSI] cxgb4i: connection and ddp setting update [SCSI] cxgb3i: fixed connection over vlan ...
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_mbx.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c66
1 files changed, 63 insertions, 3 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index a595ec8264f8..effd8a1403d9 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3828,8 +3828,6 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3828 3828
3829 /* Copy mailbox information */ 3829 /* Copy mailbox information */
3830 memcpy( mresp, mcp->mb, 64); 3830 memcpy( mresp, mcp->mb, 64);
3831 mresp[3] = mcp->mb[18];
3832 mresp[4] = mcp->mb[19];
3833 return rval; 3831 return rval;
3834} 3832}
3835 3833
@@ -3890,9 +3888,10 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3890 } 3888 }
3891 3889
3892 /* Copy mailbox information */ 3890 /* Copy mailbox information */
3893 memcpy( mresp, mcp->mb, 32); 3891 memcpy(mresp, mcp->mb, 64);
3894 return rval; 3892 return rval;
3895} 3893}
3894
3896int 3895int
3897qla84xx_reset_chip(scsi_qla_host_t *ha, uint16_t enable_diagnostic) 3896qla84xx_reset_chip(scsi_qla_host_t *ha, uint16_t enable_diagnostic)
3898{ 3897{
@@ -3953,6 +3952,67 @@ qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data)
3953} 3952}
3954 3953
3955int 3954int
3955qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb)
3956{
3957 int rval;
3958 uint32_t stat, timer;
3959 uint16_t mb0 = 0;
3960 struct qla_hw_data *ha = vha->hw;
3961 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
3962
3963 rval = QLA_SUCCESS;
3964
3965 DEBUG11(qla_printk(KERN_INFO, ha,
3966 "%s(%ld): entered.\n", __func__, vha->host_no));
3967
3968 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
3969
3970 /* Write the MBC data to the registers */
3971 WRT_REG_WORD(&reg->mailbox0, MBC_WRITE_MPI_REGISTER);
3972 WRT_REG_WORD(&reg->mailbox1, mb[0]);
3973 WRT_REG_WORD(&reg->mailbox2, mb[1]);
3974 WRT_REG_WORD(&reg->mailbox3, mb[2]);
3975 WRT_REG_WORD(&reg->mailbox4, mb[3]);
3976
3977 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
3978
3979 /* Poll for MBC interrupt */
3980 for (timer = 6000000; timer; timer--) {
3981 /* Check for pending interrupts. */
3982 stat = RD_REG_DWORD(&reg->host_status);
3983 if (stat & HSRX_RISC_INT) {
3984 stat &= 0xff;
3985
3986 if (stat == 0x1 || stat == 0x2 ||
3987 stat == 0x10 || stat == 0x11) {
3988 set_bit(MBX_INTERRUPT,
3989 &ha->mbx_cmd_flags);
3990 mb0 = RD_REG_WORD(&reg->mailbox0);
3991 WRT_REG_DWORD(&reg->hccr,
3992 HCCRX_CLR_RISC_INT);
3993 RD_REG_DWORD(&reg->hccr);
3994 break;
3995 }
3996 }
3997 udelay(5);
3998 }
3999
4000 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags))
4001 rval = mb0 & MBS_MASK;
4002 else
4003 rval = QLA_FUNCTION_FAILED;
4004
4005 if (rval != QLA_SUCCESS) {
4006 DEBUG2_3_11(printk(KERN_INFO "%s(%ld): failed=%x mb[0]=%x.\n",
4007 __func__, vha->host_no, rval, mb[0]));
4008 } else {
4009 DEBUG11(printk(KERN_INFO
4010 "%s(%ld): done.\n", __func__, vha->host_no));
4011 }
4012
4013 return rval;
4014}
4015int
3956qla2x00_get_data_rate(scsi_qla_host_t *vha) 4016qla2x00_get_data_rate(scsi_qla_host_t *vha)
3957{ 4017{
3958 int rval; 4018 int rval;