diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_mbx.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 056e4d4505f3..6e53bdbb1da8 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -3636,6 +3636,157 @@ qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data) | |||
3636 | } | 3636 | } |
3637 | 3637 | ||
3638 | int | 3638 | int |
3639 | qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mresp) | ||
3640 | { | ||
3641 | int rval; | ||
3642 | mbx_cmd_t mc; | ||
3643 | mbx_cmd_t *mcp = &mc; | ||
3644 | uint32_t iter_cnt = 0x1; | ||
3645 | |||
3646 | DEBUG11(printk("scsi(%ld): entered.\n", vha->host_no)); | ||
3647 | |||
3648 | memset(mcp->mb, 0 , sizeof(mcp->mb)); | ||
3649 | mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK; | ||
3650 | mcp->mb[1] = mreq->options | BIT_6; // BIT_6 specifies 64 bit addressing | ||
3651 | |||
3652 | /* transfer count */ | ||
3653 | mcp->mb[10] = LSW(mreq->transfer_size); | ||
3654 | mcp->mb[11] = MSW(mreq->transfer_size); | ||
3655 | |||
3656 | /* send data address */ | ||
3657 | mcp->mb[14] = LSW(mreq->send_dma); | ||
3658 | mcp->mb[15] = MSW(mreq->send_dma); | ||
3659 | mcp->mb[20] = LSW(MSD(mreq->send_dma)); | ||
3660 | mcp->mb[21] = MSW(MSD(mreq->send_dma)); | ||
3661 | |||
3662 | /* recieve data address */ | ||
3663 | mcp->mb[16] = LSW(mreq->rcv_dma); | ||
3664 | mcp->mb[17] = MSW(mreq->rcv_dma); | ||
3665 | mcp->mb[6] = LSW(MSD(mreq->rcv_dma)); | ||
3666 | mcp->mb[7] = MSW(MSD(mreq->rcv_dma)); | ||
3667 | |||
3668 | /* Iteration count */ | ||
3669 | mcp->mb[18] = LSW(iter_cnt); | ||
3670 | mcp->mb[19] = MSW(iter_cnt); | ||
3671 | |||
3672 | mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| | ||
3673 | MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; | ||
3674 | if (IS_QLA81XX(vha->hw)) | ||
3675 | mcp->out_mb |= MBX_2; | ||
3676 | mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; | ||
3677 | |||
3678 | mcp->buf_size = mreq->transfer_size; | ||
3679 | mcp->tov = MBX_TOV_SECONDS; | ||
3680 | mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; | ||
3681 | |||
3682 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3683 | |||
3684 | if (rval != QLA_SUCCESS) { | ||
3685 | DEBUG2(printk(KERN_WARNING | ||
3686 | "(%ld): failed=%x mb[0]=0x%x " | ||
3687 | "mb[1]=0x%x mb[2]=0x%x mb[3]=0x%x mb[18]=0x%x mb[19]=0x%x. \n", vha->host_no, rval, | ||
3688 | mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[18], mcp->mb[19])); | ||
3689 | } else { | ||
3690 | DEBUG2(printk(KERN_WARNING | ||
3691 | "scsi(%ld): done.\n", vha->host_no)); | ||
3692 | } | ||
3693 | |||
3694 | /* Copy mailbox information */ | ||
3695 | memcpy( mresp, mcp->mb, 64); | ||
3696 | mresp[3] = mcp->mb[18]; | ||
3697 | mresp[4] = mcp->mb[19]; | ||
3698 | return rval; | ||
3699 | } | ||
3700 | |||
3701 | int | ||
3702 | qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mresp) | ||
3703 | { | ||
3704 | int rval; | ||
3705 | mbx_cmd_t mc; | ||
3706 | mbx_cmd_t *mcp = &mc; | ||
3707 | struct qla_hw_data *ha = vha->hw; | ||
3708 | |||
3709 | DEBUG11(printk("scsi(%ld): entered.\n", vha->host_no)); | ||
3710 | |||
3711 | memset(mcp->mb, 0 , sizeof(mcp->mb)); | ||
3712 | mcp->mb[0] = MBC_DIAGNOSTIC_ECHO; | ||
3713 | mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */ | ||
3714 | if (IS_QLA81XX(ha)) | ||
3715 | mcp->mb[1] |= BIT_15; | ||
3716 | mcp->mb[2] = IS_QLA81XX(ha) ? vha->fcoe_fcf_idx : 0; | ||
3717 | mcp->mb[16] = LSW(mreq->rcv_dma); | ||
3718 | mcp->mb[17] = MSW(mreq->rcv_dma); | ||
3719 | mcp->mb[6] = LSW(MSD(mreq->rcv_dma)); | ||
3720 | mcp->mb[7] = MSW(MSD(mreq->rcv_dma)); | ||
3721 | |||
3722 | mcp->mb[10] = LSW(mreq->transfer_size); | ||
3723 | |||
3724 | mcp->mb[14] = LSW(mreq->send_dma); | ||
3725 | mcp->mb[15] = MSW(mreq->send_dma); | ||
3726 | mcp->mb[20] = LSW(MSD(mreq->send_dma)); | ||
3727 | mcp->mb[21] = MSW(MSD(mreq->send_dma)); | ||
3728 | |||
3729 | mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15| | ||
3730 | MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; | ||
3731 | if (IS_QLA81XX(ha)) | ||
3732 | mcp->out_mb |= MBX_2; | ||
3733 | |||
3734 | mcp->in_mb = MBX_0; | ||
3735 | if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) | ||
3736 | mcp->in_mb |= MBX_1; | ||
3737 | if (IS_QLA81XX(ha)) | ||
3738 | mcp->in_mb |= MBX_3; | ||
3739 | |||
3740 | mcp->tov = MBX_TOV_SECONDS; | ||
3741 | mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; | ||
3742 | mcp->buf_size = mreq->transfer_size; | ||
3743 | |||
3744 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3745 | |||
3746 | if (rval != QLA_SUCCESS) { | ||
3747 | DEBUG2(printk(KERN_WARNING | ||
3748 | "(%ld): failed=%x mb[0]=0x%x mb[1]=0x%x.\n", | ||
3749 | vha->host_no, rval, mcp->mb[0], mcp->mb[1])); | ||
3750 | } else { | ||
3751 | DEBUG2(printk(KERN_WARNING | ||
3752 | "scsi(%ld): done.\n", vha->host_no)); | ||
3753 | } | ||
3754 | |||
3755 | /* Copy mailbox information */ | ||
3756 | memcpy( mresp, mcp->mb, 32); | ||
3757 | return rval; | ||
3758 | } | ||
3759 | int | ||
3760 | qla84xx_reset_chip(scsi_qla_host_t *ha, uint16_t enable_diagnostic, | ||
3761 | uint16_t *cmd_status) | ||
3762 | { | ||
3763 | int rval; | ||
3764 | mbx_cmd_t mc; | ||
3765 | mbx_cmd_t *mcp = &mc; | ||
3766 | |||
3767 | DEBUG16(printk("%s(%ld): enable_diag=%d entered.\n", __func__, | ||
3768 | ha->host_no, enable_diagnostic)); | ||
3769 | |||
3770 | mcp->mb[0] = MBC_ISP84XX_RESET; | ||
3771 | mcp->mb[1] = enable_diagnostic; | ||
3772 | mcp->out_mb = MBX_1|MBX_0; | ||
3773 | mcp->in_mb = MBX_1|MBX_0; | ||
3774 | mcp->tov = MBX_TOV_SECONDS; | ||
3775 | mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; | ||
3776 | rval = qla2x00_mailbox_command(ha, mcp); | ||
3777 | |||
3778 | /* Return mailbox statuses. */ | ||
3779 | *cmd_status = mcp->mb[0]; | ||
3780 | if (rval != QLA_SUCCESS) | ||
3781 | DEBUG16(printk("%s(%ld): failed=%x.\n", __func__, ha->host_no, | ||
3782 | rval)); | ||
3783 | else | ||
3784 | DEBUG16(printk("%s(%ld): done.\n", __func__, ha->host_no)); | ||
3785 | |||
3786 | return rval; | ||
3787 | } | ||
3788 | |||
3789 | int | ||
3639 | qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) | 3790 | qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) |
3640 | { | 3791 | { |
3641 | int rval; | 3792 | int rval; |