2005-04-17 02:20:36 +04:00
/*
2005-10-27 22:10:08 +04:00
* QLogic Fibre Channel HBA Driver
2008-04-04 00:13:13 +04:00
* Copyright ( c ) 2003 - 2008 QLogic Corporation
2005-04-17 02:20:36 +04:00
*
2005-10-27 22:10:08 +04:00
* See LICENSE . qla2xxx for copyright and licensing details .
2005-04-17 02:20:36 +04:00
*/
# include "qla_def.h"
# include <linux/delay.h>
/*
* qla2x00_mailbox_command
* Issue mailbox command and waits for completion .
*
* Input :
* ha = adapter block pointer .
* mcp = driver internal mbx struct pointer .
*
* Output :
* mb [ MAX_MAILBOX_REGISTER_COUNT ] = returned mailbox data .
*
* Returns :
* 0 : QLA_SUCCESS = cmd performed success
* 1 : QLA_FUNCTION_FAILED ( error encountered )
* 6 : QLA_FUNCTION_TIMEOUT ( timeout condition encountered )
*
* Context :
* Kernel context .
*/
static int
2008-11-06 21:40:19 +03:00
qla2x00_mailbox_command ( scsi_qla_host_t * vha , mbx_cmd_t * mcp )
2005-04-17 02:20:36 +04:00
{
int rval ;
unsigned long flags = 0 ;
2007-07-06 00:16:51 +04:00
device_reg_t __iomem * reg ;
2005-07-06 21:30:57 +04:00
uint8_t abort_active ;
2007-07-06 00:16:51 +04:00
uint8_t io_lock_on ;
2005-04-17 02:20:36 +04:00
uint16_t command ;
uint16_t * iptr ;
uint16_t __iomem * optr ;
uint32_t cnt ;
uint32_t mboxes ;
unsigned long wait_time ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
scsi_qla_host_t * base_vha = pci_get_drvdata ( ha - > pdev ) ;
2007-07-06 00:16:51 +04:00
2009-03-24 19:08:18 +03:00
if ( ha - > pdev - > error_state > pci_channel_io_frozen )
return QLA_FUNCTION_TIMEOUT ;
2007-07-06 00:16:51 +04:00
reg = ha - > iobase ;
2008-11-06 21:40:19 +03:00
io_lock_on = base_vha - > flags . init_done ;
2005-04-17 02:20:36 +04:00
rval = QLA_SUCCESS ;
2008-11-06 21:40:19 +03:00
abort_active = test_bit ( ABORT_ISP_ACTIVE , & base_vha - > dpc_flags ) ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
/*
2005-07-06 21:30:57 +04:00
* Wait for active mailbox commands to finish by waiting at most tov
* seconds . This is to serialize actual issuing of mailbox cmds during
* non ISP abort time .
2005-04-17 02:20:36 +04:00
*/
2009-01-22 20:45:31 +03:00
if ( ! wait_for_completion_timeout ( & ha - > mbx_cmd_comp , mcp - > tov * HZ ) ) {
/* Timeout occurred. Return error. */
DEBUG2_3_11 ( printk ( " %s(%ld): cmd access timeout. "
" Exiting. \n " , __func__ , base_vha - > host_no ) ) ;
return QLA_FUNCTION_TIMEOUT ;
2005-04-17 02:20:36 +04:00
}
ha - > flags . mbox_busy = 1 ;
/* Save mailbox command for debug */
ha - > mcp = mcp ;
2005-07-06 21:30:57 +04:00
DEBUG11 ( printk ( " scsi(%ld): prepare to issue mbox cmd=0x%x. \n " ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no , mcp - > mb [ 0 ] ) ) ;
2005-04-17 02:20:36 +04:00
spin_lock_irqsave ( & ha - > hardware_lock , flags ) ;
/* Load mailbox registers. */
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) )
2005-07-06 21:30:57 +04:00
optr = ( uint16_t __iomem * ) & reg - > isp24 . mailbox0 ;
else
optr = ( uint16_t __iomem * ) MAILBOX_REG ( ha , & reg - > isp , 0 ) ;
2005-04-17 02:20:36 +04:00
iptr = mcp - > mb ;
command = mcp - > mb [ 0 ] ;
mboxes = mcp - > out_mb ;
for ( cnt = 0 ; cnt < ha - > mbx_count ; cnt + + ) {
if ( IS_QLA2200 ( ha ) & & cnt = = 8 )
2005-07-06 21:30:57 +04:00
optr =
( uint16_t __iomem * ) MAILBOX_REG ( ha , & reg - > isp , 8 ) ;
2005-04-17 02:20:36 +04:00
if ( mboxes & BIT_0 )
WRT_REG_WORD ( optr , * iptr ) ;
mboxes > > = 1 ;
optr + + ;
iptr + + ;
}
# if defined(QL_DEBUG_LEVEL_1)
2005-07-06 21:30:57 +04:00
printk ( " %s(%ld): Loaded MBX registers (displayed in bytes) = \n " ,
2008-11-06 21:40:19 +03:00
__func__ , base_vha - > host_no ) ;
2005-04-17 02:20:36 +04:00
qla2x00_dump_buffer ( ( uint8_t * ) mcp - > mb , 16 ) ;
printk ( " \n " ) ;
qla2x00_dump_buffer ( ( ( uint8_t * ) mcp - > mb + 0x10 ) , 16 ) ;
printk ( " \n " ) ;
qla2x00_dump_buffer ( ( ( uint8_t * ) mcp - > mb + 0x20 ) , 8 ) ;
printk ( " \n " ) ;
2008-11-06 21:40:19 +03:00
printk ( " %s(%ld): I/O address = %p. \n " , __func__ , base_vha - > host_no ,
optr ) ;
qla2x00_dump_regs ( base_vha ) ;
2005-04-17 02:20:36 +04:00
# endif
/* Issue set host interrupt command to send cmd out. */
ha - > flags . mbox_int = 0 ;
clear_bit ( MBX_INTERRUPT , & ha - > mbx_cmd_flags ) ;
/* Unlock mbx registers and wait for interrupt */
2005-07-06 21:30:57 +04:00
DEBUG11 ( printk ( " %s(%ld): going to unlock irq & waiting for interrupt. "
2008-11-06 21:40:19 +03:00
" jiffies=%lx. \n " , __func__ , base_vha - > host_no , jiffies ) ) ;
2005-04-17 02:20:36 +04:00
/* Wait for mbx cmd completion until timeout */
2009-01-05 22:18:06 +03:00
if ( ( ! abort_active & & io_lock_on ) | | IS_NOPOLLING_TYPE ( ha ) ) {
2005-04-17 02:20:36 +04:00
set_bit ( MBX_INTR_WAIT , & ha - > mbx_cmd_flags ) ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) )
2005-07-06 21:30:57 +04:00
WRT_REG_DWORD ( & reg - > isp24 . hccr , HCCRX_SET_HOST_INT ) ;
else
WRT_REG_WORD ( & reg - > isp . hccr , HCCR_SET_HOST_INT ) ;
2005-04-17 02:20:36 +04:00
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
2008-01-17 20:02:13 +03:00
wait_for_completion_timeout ( & ha - > mbx_intr_comp , mcp - > tov * HZ ) ;
2005-04-17 02:20:36 +04:00
clear_bit ( MBX_INTR_WAIT , & ha - > mbx_cmd_flags ) ;
} else {
2005-07-06 21:30:57 +04:00
DEBUG3_11 ( printk ( " %s(%ld): cmd=%x POLLING MODE. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no , command ) ) ;
2005-04-17 02:20:36 +04:00
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) )
2005-07-06 21:30:57 +04:00
WRT_REG_DWORD ( & reg - > isp24 . hccr , HCCRX_SET_HOST_INT ) ;
else
WRT_REG_WORD ( & reg - > isp . hccr , HCCR_SET_HOST_INT ) ;
2005-04-17 02:20:36 +04:00
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
wait_time = jiffies + mcp - > tov * HZ ; /* wait at most tov secs */
while ( ! ha - > flags . mbox_int ) {
if ( time_after ( jiffies , wait_time ) )
break ;
/* Check for pending interrupts. */
2008-12-10 03:45:39 +03:00
qla2x00_poll ( ha - > rsp_q_map [ 0 ] ) ;
2005-04-17 02:20:36 +04:00
2006-01-14 04:05:10 +03:00
if ( command ! = MBC_LOAD_RISC_RAM_EXTENDED & &
! ha - > flags . mbox_int )
msleep ( 10 ) ;
2005-04-17 02:20:36 +04:00
} /* while */
}
/* Check whether we timed out */
if ( ha - > flags . mbox_int ) {
uint16_t * iptr2 ;
2005-07-06 21:30:57 +04:00
DEBUG3_11 ( printk ( " %s(%ld): cmd %x completed. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no , command ) ) ;
2005-04-17 02:20:36 +04:00
/* Got interrupt. Clear the flag. */
ha - > flags . mbox_int = 0 ;
clear_bit ( MBX_INTERRUPT , & ha - > mbx_cmd_flags ) ;
2005-04-23 10:47:27 +04:00
if ( ha - > mailbox_out [ 0 ] ! = MBS_COMMAND_COMPLETE )
2005-04-17 02:20:36 +04:00
rval = QLA_FUNCTION_FAILED ;
/* Load return mailbox registers. */
iptr2 = mcp - > mb ;
iptr = ( uint16_t * ) & ha - > mailbox_out [ 0 ] ;
mboxes = mcp - > in_mb ;
for ( cnt = 0 ; cnt < ha - > mbx_count ; cnt + + ) {
if ( mboxes & BIT_0 )
* iptr2 = * iptr ;
mboxes > > = 1 ;
iptr2 + + ;
iptr + + ;
}
} else {
# if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
defined ( QL_DEBUG_LEVEL_11 )
2005-07-06 21:30:57 +04:00
uint16_t mb0 ;
uint32_t ictrl ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
mb0 = RD_REG_WORD ( & reg - > isp24 . mailbox0 ) ;
ictrl = RD_REG_DWORD ( & reg - > isp24 . ictrl ) ;
} else {
2005-08-27 06:08:30 +04:00
mb0 = RD_MAILBOX_REG ( ha , & reg - > isp , 0 ) ;
2005-07-06 21:30:57 +04:00
ictrl = RD_REG_WORD ( & reg - > isp . ictrl ) ;
}
printk ( " %s(%ld): **** MB Command Timeout for cmd %x **** \n " ,
2008-11-06 21:40:19 +03:00
__func__ , base_vha - > host_no , command ) ;
2005-07-06 21:30:57 +04:00
printk ( " %s(%ld): icontrol=%x jiffies=%lx \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no , ictrl , jiffies ) ;
2005-07-06 21:30:57 +04:00
printk ( " %s(%ld): *** mailbox[0] = 0x%x *** \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no , mb0 ) ;
qla2x00_dump_regs ( base_vha ) ;
2005-04-17 02:20:36 +04:00
# endif
rval = QLA_FUNCTION_TIMEOUT ;
}
ha - > flags . mbox_busy = 0 ;
/* Clean up */
ha - > mcp = NULL ;
2009-01-05 22:18:06 +03:00
if ( ( abort_active | | ! io_lock_on ) & & ! IS_NOPOLLING_TYPE ( ha ) ) {
2005-07-06 21:30:57 +04:00
DEBUG11 ( printk ( " %s(%ld): checking for additional resp "
2008-11-06 21:40:19 +03:00
" interrupt. \n " , __func__ , base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
/* polling mode for non isp_abort commands. */
2008-12-10 03:45:39 +03:00
qla2x00_poll ( ha - > rsp_q_map [ 0 ] ) ;
2005-04-17 02:20:36 +04:00
}
2005-07-06 21:30:57 +04:00
if ( rval = = QLA_FUNCTION_TIMEOUT & &
mcp - > mb [ 0 ] ! = MBC_GEN_SYSTEM_ERROR ) {
2005-04-17 02:20:36 +04:00
if ( ! io_lock_on | | ( mcp - > flags & IOCTL_CMD ) ) {
/* not in dpc. schedule it for dpc to take over. */
2005-07-06 21:30:57 +04:00
DEBUG ( printk ( " %s(%ld): timeout schedule "
2008-11-06 21:40:19 +03:00
" isp_abort_needed. \n " , __func__ ,
base_vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): timeout schedule "
2008-11-06 21:40:19 +03:00
" isp_abort_needed. \n " , __func__ ,
base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
qla_printk ( KERN_WARNING , ha ,
2008-09-12 08:22:51 +04:00
" Mailbox command timeout occurred. Scheduling ISP "
2005-04-17 02:20:36 +04:00
" abort. \n " ) ;
2008-11-06 21:40:19 +03:00
set_bit ( ISP_ABORT_NEEDED , & base_vha - > dpc_flags ) ;
qla2xxx_wake_dpc ( vha ) ;
2005-04-17 02:20:36 +04:00
} else if ( ! abort_active ) {
/* call abort directly since we are in the DPC thread */
2005-07-06 21:30:57 +04:00
DEBUG ( printk ( " %s(%ld): timeout calling abort_isp \n " ,
2008-11-06 21:40:19 +03:00
__func__ , base_vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): timeout calling "
2008-11-06 21:40:19 +03:00
" abort_isp \n " , __func__ , base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
qla_printk ( KERN_WARNING , ha ,
2008-09-12 08:22:51 +04:00
" Mailbox command timeout occurred. Issuing ISP "
2005-04-17 02:20:36 +04:00
" abort. \n " ) ;
2008-11-06 21:40:19 +03:00
set_bit ( ABORT_ISP_ACTIVE , & base_vha - > dpc_flags ) ;
clear_bit ( ISP_ABORT_NEEDED , & base_vha - > dpc_flags ) ;
if ( qla2x00_abort_isp ( base_vha ) ) {
2005-07-06 21:30:57 +04:00
/* Failed. retry later. */
2008-11-06 21:40:19 +03:00
set_bit ( ISP_ABORT_NEEDED , & base_vha - > dpc_flags ) ;
2005-04-17 02:20:36 +04:00
}
2008-11-06 21:40:19 +03:00
clear_bit ( ABORT_ISP_ACTIVE , & base_vha - > dpc_flags ) ;
2005-07-06 21:30:57 +04:00
DEBUG ( printk ( " %s(%ld): finished abort_isp \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): finished abort_isp \n " ,
2008-11-06 21:40:19 +03:00
__func__ , base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
}
/* Allow next mbx cmd to come in. */
2009-01-22 20:45:31 +03:00
complete ( & ha - > mbx_cmd_comp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): **** FAILED. mbx0=%x, mbx1=%x, "
2008-11-06 21:40:19 +03:00
" mbx2=%x, cmd=%x **** \n " , __func__ , base_vha - > host_no ,
2006-06-24 03:11:05 +04:00
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 2 ] , command ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ ,
base_vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
int
2008-11-06 21:40:19 +03:00
qla2x00_load_ram ( scsi_qla_host_t * vha , dma_addr_t req_dma , uint32_t risc_addr ,
2006-01-14 04:05:37 +03:00
uint32_t risc_code_size )
2005-04-17 02:20:36 +04:00
{
int rval ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2007-07-20 02:05:56 +04:00
if ( MSW ( risc_addr ) | | IS_FWI2_CAPABLE ( ha ) ) {
2006-01-14 04:05:37 +03:00
mcp - > mb [ 0 ] = MBC_LOAD_RISC_RAM_EXTENDED ;
mcp - > mb [ 8 ] = MSW ( risc_addr ) ;
mcp - > out_mb = MBX_8 | MBX_0 ;
2005-04-17 02:20:36 +04:00
} else {
2006-01-14 04:05:37 +03:00
mcp - > mb [ 0 ] = MBC_LOAD_RISC_RAM ;
mcp - > out_mb = MBX_0 ;
2005-04-17 02:20:36 +04:00
}
mcp - > mb [ 1 ] = LSW ( risc_addr ) ;
mcp - > mb [ 2 ] = MSW ( req_dma ) ;
mcp - > mb [ 3 ] = LSW ( req_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( req_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( req_dma ) ) ;
2006-01-14 04:05:37 +03:00
mcp - > out_mb | = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 4 ] = MSW ( risc_code_size ) ;
mcp - > mb [ 5 ] = LSW ( risc_code_size ) ;
mcp - > out_mb | = MBX_5 | MBX_4 ;
} else {
mcp - > mb [ 4 ] = LSW ( risc_code_size ) ;
mcp - > out_mb | = MBX_4 ;
}
2005-04-17 02:20:36 +04:00
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_execute_fw
2005-07-06 21:30:57 +04:00
* Start adapter firmware .
2005-04-17 02:20:36 +04:00
*
* Input :
2005-07-06 21:30:57 +04:00
* ha = adapter block pointer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
2005-04-17 02:20:36 +04:00
*
* Returns :
2005-07-06 21:30:57 +04:00
* qla2x00 local function return status code .
2005-04-17 02:20:36 +04:00
*
* Context :
2005-07-06 21:30:57 +04:00
* Kernel context .
2005-04-17 02:20:36 +04:00
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_execute_fw ( scsi_qla_host_t * vha , uint32_t risc_addr )
2005-04-17 02:20:36 +04:00
{
int rval ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_EXECUTE_FIRMWARE ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_0 ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 1 ] = MSW ( risc_addr ) ;
mcp - > mb [ 2 ] = LSW ( risc_addr ) ;
mcp - > mb [ 3 ] = 0 ;
2007-09-21 01:07:48 +04:00
mcp - > mb [ 4 ] = 0 ;
mcp - > out_mb | = MBX_4 | MBX_3 | MBX_2 | MBX_1 ;
2005-07-06 21:30:57 +04:00
mcp - > in_mb | = MBX_1 ;
} else {
mcp - > mb [ 1 ] = LSW ( risc_addr ) ;
mcp - > out_mb | = MBX_1 ;
if ( IS_QLA2322 ( ha ) | | IS_QLA6322 ( ha ) ) {
mcp - > mb [ 2 ] = 0 ;
mcp - > out_mb | = MBX_2 ;
}
2005-04-17 02:20:36 +04:00
}
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2005-07-06 21:30:57 +04:00
} else {
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
DEBUG11 ( printk ( " %s(%ld): done exchanges=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , mcp - > mb [ 1 ] ) ) ;
2005-07-06 21:30:57 +04:00
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
}
2005-04-17 02:20:36 +04:00
return rval ;
}
/*
* qla2x00_get_fw_version
* Get firmware version .
*
* Input :
* ha : adapter state pointer .
* major : pointer for major number .
* minor : pointer for minor number .
* subminor : pointer for subminor number .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
2009-06-03 20:55:20 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_get_fw_version ( scsi_qla_host_t * vha , uint16_t * major , uint16_t * minor ,
2009-01-05 22:18:11 +03:00
uint16_t * subminor , uint16_t * attributes , uint32_t * memory , uint8_t * mpi ,
2009-03-24 19:08:03 +03:00
uint32_t * mpi_caps , uint8_t * phy )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_FIRMWARE_VERSION ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2009-01-05 22:18:11 +03:00
if ( IS_QLA81XX ( vha - > hw ) )
2009-03-24 19:08:03 +03:00
mcp - > in_mb | = MBX_13 | MBX_12 | MBX_11 | MBX_10 | MBX_9 | MBX_8 ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2009-06-03 20:55:20 +04:00
if ( rval ! = QLA_SUCCESS )
goto failed ;
2005-04-17 02:20:36 +04:00
/* Return mailbox data. */
* major = mcp - > mb [ 1 ] ;
* minor = mcp - > mb [ 2 ] ;
* subminor = mcp - > mb [ 3 ] ;
* attributes = mcp - > mb [ 6 ] ;
2008-11-06 21:40:19 +03:00
if ( IS_QLA2100 ( vha - > hw ) | | IS_QLA2200 ( vha - > hw ) )
2005-04-17 02:20:36 +04:00
* memory = 0x1FFFF ; /* Defaults to 128KB. */
else
* memory = ( mcp - > mb [ 5 ] < < 16 ) | mcp - > mb [ 4 ] ;
2009-01-05 22:18:11 +03:00
if ( IS_QLA81XX ( vha - > hw ) ) {
2009-03-24 19:08:03 +03:00
mpi [ 0 ] = mcp - > mb [ 10 ] & 0xff ;
mpi [ 1 ] = mcp - > mb [ 11 ] > > 8 ;
mpi [ 2 ] = mcp - > mb [ 11 ] & 0xff ;
2009-01-05 22:18:11 +03:00
* mpi_caps = ( mcp - > mb [ 12 ] < < 16 ) | mcp - > mb [ 13 ] ;
2009-03-24 19:08:03 +03:00
phy [ 0 ] = mcp - > mb [ 8 ] & 0xff ;
phy [ 1 ] = mcp - > mb [ 9 ] > > 8 ;
phy [ 2 ] = mcp - > mb [ 9 ] & 0xff ;
2009-01-05 22:18:11 +03:00
}
2009-06-03 20:55:20 +04:00
failed :
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
2009-06-03 20:55:20 +04:00
return rval ;
2005-04-17 02:20:36 +04:00
}
/*
* qla2x00_get_fw_options
* Set firmware options .
*
* Input :
* ha = adapter block pointer .
* fwopt = pointer for firmware options .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_fw_options ( scsi_qla_host_t * vha , uint16_t * fwopts )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_FIRMWARE_OPTION ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2005-07-06 21:30:57 +04:00
fwopts [ 0 ] = mcp - > mb [ 0 ] ;
2005-04-17 02:20:36 +04:00
fwopts [ 1 ] = mcp - > mb [ 1 ] ;
fwopts [ 2 ] = mcp - > mb [ 2 ] ;
fwopts [ 3 ] = mcp - > mb [ 3 ] ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_set_fw_options
* Set firmware options .
*
* Input :
* ha = adapter block pointer .
* fwopt = pointer for firmware options .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_set_fw_options ( scsi_qla_host_t * vha , uint16_t * fwopts )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_SET_FIRMWARE_OPTION ;
mcp - > mb [ 1 ] = fwopts [ 1 ] ;
mcp - > mb [ 2 ] = fwopts [ 2 ] ;
mcp - > mb [ 3 ] = fwopts [ 3 ] ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2005-04-17 02:20:36 +04:00
mcp - > in_mb = MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
2005-07-06 21:30:57 +04:00
mcp - > in_mb | = MBX_1 ;
} else {
mcp - > mb [ 10 ] = fwopts [ 10 ] ;
mcp - > mb [ 11 ] = fwopts [ 11 ] ;
mcp - > mb [ 12 ] = 0 ; /* Undocumented, but used */
mcp - > out_mb | = MBX_12 | MBX_11 | MBX_10 ;
}
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
fwopts [ 0 ] = mcp - > mb [ 0 ] ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x/%x). \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_mbx_reg_test
* Mailbox register wrap test .
*
* Input :
* ha = adapter block pointer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_mbx_reg_test ( scsi_qla_host_t * vha )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " qla2x00_mbx_reg_test(%ld): entered. \n " , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_MAILBOX_REGISTER_TEST ;
mcp - > mb [ 1 ] = 0xAAAA ;
mcp - > mb [ 2 ] = 0x5555 ;
mcp - > mb [ 3 ] = 0xAA55 ;
mcp - > mb [ 4 ] = 0x55AA ;
mcp - > mb [ 5 ] = 0xA5A5 ;
mcp - > mb [ 6 ] = 0x5A5A ;
mcp - > mb [ 7 ] = 0x2525 ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval = = QLA_SUCCESS ) {
if ( mcp - > mb [ 1 ] ! = 0xAAAA | | mcp - > mb [ 2 ] ! = 0x5555 | |
mcp - > mb [ 3 ] ! = 0xAA55 | | mcp - > mb [ 4 ] ! = 0x55AA )
rval = QLA_FUNCTION_FAILED ;
if ( mcp - > mb [ 5 ] ! = 0xA5A5 | | mcp - > mb [ 6 ] ! = 0x5A5A | |
mcp - > mb [ 7 ] ! = 0x2525 )
rval = QLA_FUNCTION_FAILED ;
}
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_mbx_reg_test(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_mbx_reg_test(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_verify_checksum
* Verify firmware checksum .
*
* Input :
* ha = adapter block pointer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_verify_checksum ( scsi_qla_host_t * vha , uint32_t risc_addr )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_VERIFY_CHECKSUM ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 1 ] = MSW ( risc_addr ) ;
mcp - > mb [ 2 ] = LSW ( risc_addr ) ;
mcp - > out_mb | = MBX_2 | MBX_1 ;
mcp - > in_mb | = MBX_2 | MBX_1 ;
} else {
mcp - > mb [ 1 ] = LSW ( risc_addr ) ;
mcp - > out_mb | = MBX_1 ;
mcp - > in_mb | = MBX_1 ;
}
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x chk sum=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , IS_FWI2_CAPABLE ( vha - > hw ) ?
2007-07-20 02:05:56 +04:00
( mcp - > mb [ 2 ] < < 16 ) | mcp - > mb [ 1 ] : mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_issue_iocb
* Issue IOCB using mailbox command
*
* Input :
* ha = adapter state pointer .
* buffer = buffer pointer .
* phys_addr = physical address of buffer .
* size = size of buffer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
2008-04-25 02:21:28 +04:00
static int
2008-11-06 21:40:19 +03:00
qla2x00_issue_iocb_timeout ( scsi_qla_host_t * vha , void * buffer ,
2008-04-04 00:13:26 +04:00
dma_addr_t phys_addr , size_t size , uint32_t tov )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
mcp - > mb [ 0 ] = MBC_IOCB_COMMAND_A64 ;
mcp - > mb [ 1 ] = 0 ;
mcp - > mb [ 2 ] = MSW ( phys_addr ) ;
mcp - > mb [ 3 ] = LSW ( phys_addr ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( phys_addr ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( phys_addr ) ) ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_2 | MBX_0 ;
2008-04-04 00:13:26 +04:00
mcp - > tov = tov ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
2005-07-06 21:30:57 +04:00
DEBUG ( printk ( " qla2x00_issue_iocb(%ld): failed rval 0x%x \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2005-07-06 21:30:47 +04:00
sts_entry_t * sts_entry = ( sts_entry_t * ) buffer ;
/* Mask reserved bits. */
sts_entry - > entry_status & =
2008-11-06 21:40:19 +03:00
IS_FWI2_CAPABLE ( vha - > hw ) ? RF_MASK_24XX : RF_MASK ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
2008-04-04 00:13:26 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_issue_iocb ( scsi_qla_host_t * vha , void * buffer , dma_addr_t phys_addr ,
2008-04-04 00:13:26 +04:00
size_t size )
{
2008-11-06 21:40:19 +03:00
return qla2x00_issue_iocb_timeout ( vha , buffer , phys_addr , size ,
2008-04-04 00:13:26 +04:00
MBX_TOV_SECONDS ) ;
}
2005-04-17 02:20:36 +04:00
/*
* qla2x00_abort_command
* Abort command aborts a specified IOCB .
*
* Input :
* ha = adapter block pointer .
* sp = SB structure pointer .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2009-04-07 09:33:40 +04:00
qla2x00_abort_command ( srb_t * sp )
2005-04-17 02:20:36 +04:00
{
unsigned long flags = 0 ;
int rval ;
2008-12-10 03:45:39 +03:00
uint32_t handle = 0 ;
2005-04-17 02:20:36 +04:00
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2009-04-07 09:33:40 +04:00
fc_port_t * fcport = sp - > fcport ;
scsi_qla_host_t * vha = fcport - > vha ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2009-04-07 09:33:40 +04:00
struct req_que * req = vha - > req ;
2005-04-17 02:20:36 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " qla2x00_abort_command(%ld): entered. \n " , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2008-07-24 19:31:49 +04:00
spin_lock_irqsave ( & ha - > hardware_lock , flags ) ;
2005-04-17 02:20:36 +04:00
for ( handle = 1 ; handle < MAX_OUTSTANDING_COMMANDS ; handle + + ) {
2008-11-06 21:40:19 +03:00
if ( req - > outstanding_cmds [ handle ] = = sp )
2005-04-17 02:20:36 +04:00
break ;
}
2008-07-24 19:31:49 +04:00
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
2005-04-17 02:20:36 +04:00
if ( handle = = MAX_OUTSTANDING_COMMANDS ) {
/* command not found */
return QLA_FUNCTION_FAILED ;
}
mcp - > mb [ 0 ] = MBC_ABORT_COMMAND ;
if ( HAS_EXTENDED_IDS ( ha ) )
mcp - > mb [ 1 ] = fcport - > loop_id ;
else
mcp - > mb [ 1 ] = fcport - > loop_id < < 8 ;
mcp - > mb [ 2 ] = ( uint16_t ) handle ;
mcp - > mb [ 3 ] = ( uint16_t ) ( handle > > 16 ) ;
2005-04-18 00:06:53 +04:00
mcp - > mb [ 6 ] = ( uint16_t ) sp - > cmd - > device - > lun ;
2005-04-17 02:20:36 +04:00
mcp - > out_mb = MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " qla2x00_abort_command(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
DEBUG11 ( printk ( " qla2x00_abort_command(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
int
2009-04-07 09:33:40 +04:00
qla2x00_abort_target ( struct fc_port * fcport , unsigned int l , int tag )
2005-04-17 02:20:36 +04:00
{
2008-04-04 00:13:24 +04:00
int rval , rval2 ;
2005-04-17 02:20:36 +04:00
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
scsi_qla_host_t * vha ;
2008-12-10 03:45:39 +03:00
struct req_que * req ;
struct rsp_que * rsp ;
2005-04-17 02:20:36 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , fcport - > vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
2008-04-04 00:13:24 +04:00
l = l ;
2008-11-06 21:40:19 +03:00
vha = fcport - > vha ;
2009-04-07 09:33:40 +04:00
req = vha - > hw - > req_q_map [ tag ] ;
rsp = vha - > hw - > rsp_q_map [ tag ] ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_ABORT_TARGET ;
2008-04-04 00:13:24 +04:00
mcp - > out_mb = MBX_9 | MBX_2 | MBX_1 | MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( HAS_EXTENDED_IDS ( vha - > hw ) ) {
2005-04-17 02:20:36 +04:00
mcp - > mb [ 1 ] = fcport - > loop_id ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb | = MBX_10 ;
} else {
mcp - > mb [ 1 ] = fcport - > loop_id < < 8 ;
}
2008-11-06 21:40:19 +03:00
mcp - > mb [ 2 ] = vha - > hw - > loop_reset_delay ;
mcp - > mb [ 9 ] = vha - > vp_idx ;
2005-04-17 02:20:36 +04:00
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-04-04 00:13:24 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2008-04-04 00:13:24 +04:00
}
/* Issue marker IOCB. */
2008-12-10 03:45:39 +03:00
rval2 = qla2x00_marker ( vha , req , rsp , fcport - > loop_id , 0 ,
MK_SYNC_ID ) ;
2008-04-04 00:13:24 +04:00
if ( rval2 ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue Marker IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , rval2 ) ) ;
2008-04-04 00:13:24 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2008-04-04 00:13:24 +04:00
}
return rval ;
}
int
2009-04-07 09:33:40 +04:00
qla2x00_lun_reset ( struct fc_port * fcport , unsigned int l , int tag )
2008-04-04 00:13:24 +04:00
{
int rval , rval2 ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
scsi_qla_host_t * vha ;
2008-12-10 03:45:39 +03:00
struct req_que * req ;
struct rsp_que * rsp ;
2008-04-04 00:13:24 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , fcport - > vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2008-11-06 21:40:19 +03:00
vha = fcport - > vha ;
2009-04-07 09:33:40 +04:00
req = vha - > hw - > req_q_map [ tag ] ;
rsp = vha - > hw - > rsp_q_map [ tag ] ;
2008-04-04 00:13:24 +04:00
mcp - > mb [ 0 ] = MBC_LUN_RESET ;
mcp - > out_mb = MBX_9 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( HAS_EXTENDED_IDS ( vha - > hw ) )
2008-04-04 00:13:24 +04:00
mcp - > mb [ 1 ] = fcport - > loop_id ;
else
mcp - > mb [ 1 ] = fcport - > loop_id < < 8 ;
mcp - > mb [ 2 ] = l ;
mcp - > mb [ 3 ] = 0 ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2005-04-17 02:20:36 +04:00
2008-04-04 00:13:24 +04:00
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-04-04 00:13:24 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
2008-04-04 00:13:24 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2008-04-04 00:13:24 +04:00
}
/* Issue marker IOCB. */
2008-12-10 03:45:39 +03:00
rval2 = qla2x00_marker ( vha , req , rsp , fcport - > loop_id , l ,
MK_SYNC_ID_LUN ) ;
2008-04-04 00:13:24 +04:00
if ( rval2 ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue Marker IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , rval2 ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_adapter_id
* Get adapter ID and topology .
*
* Input :
* ha = adapter block pointer .
* id = pointer for loop ID .
* al_pa = pointer for AL_PA .
* area = pointer for area .
* domain = pointer for domain .
* top = pointer for topology .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_adapter_id ( scsi_qla_host_t * vha , uint16_t * id , uint8_t * al_pa ,
2007-07-06 00:16:51 +04:00
uint8_t * area , uint8_t * domain , uint16_t * top , uint16_t * sw_cap )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_get_adapter_id(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_ADAPTER_LOOP_ID ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2007-11-12 21:30:58 +03:00
mcp - > out_mb = MBX_9 | MBX_0 ;
2007-07-06 00:16:51 +04:00
mcp - > in_mb = MBX_9 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2009-04-07 09:33:38 +04:00
if ( IS_QLA81XX ( vha - > hw ) )
mcp - > in_mb | = MBX_13 | MBX_12 | MBX_11 | MBX_10 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-11-09 01:37:20 +03:00
if ( mcp - > mb [ 0 ] = = MBS_COMMAND_ERROR )
rval = QLA_COMMAND_ERROR ;
2008-07-11 03:56:01 +04:00
else if ( mcp - > mb [ 0 ] = = MBS_INVALID_COMMAND )
rval = QLA_INVALID_COMMAND ;
2005-04-17 02:20:36 +04:00
/* Return data. */
* id = mcp - > mb [ 1 ] ;
* al_pa = LSB ( mcp - > mb [ 2 ] ) ;
* area = MSB ( mcp - > mb [ 2 ] ) ;
* domain = LSB ( mcp - > mb [ 3 ] ) ;
* top = mcp - > mb [ 6 ] ;
2007-07-06 00:16:51 +04:00
* sw_cap = mcp - > mb [ 7 ] ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_get_adapter_id(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
DEBUG11 ( printk ( " qla2x00_get_adapter_id(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2009-04-07 09:33:38 +04:00
if ( IS_QLA81XX ( vha - > hw ) ) {
vha - > fcoe_vlan_id = mcp - > mb [ 9 ] & 0xfff ;
vha - > fcoe_fcf_idx = mcp - > mb [ 10 ] ;
vha - > fcoe_vn_port_mac [ 5 ] = mcp - > mb [ 11 ] > > 8 ;
vha - > fcoe_vn_port_mac [ 4 ] = mcp - > mb [ 11 ] & 0xff ;
vha - > fcoe_vn_port_mac [ 3 ] = mcp - > mb [ 12 ] > > 8 ;
vha - > fcoe_vn_port_mac [ 2 ] = mcp - > mb [ 12 ] & 0xff ;
vha - > fcoe_vn_port_mac [ 1 ] = mcp - > mb [ 13 ] > > 8 ;
vha - > fcoe_vn_port_mac [ 0 ] = mcp - > mb [ 13 ] & 0xff ;
}
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_retry_cnt
* Get current firmware login retry count and delay .
*
* Input :
* ha = adapter block pointer .
* retry_cnt = pointer to login retry count .
* tov = pointer to login timeout value .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_retry_cnt ( scsi_qla_host_t * vha , uint8_t * retry_cnt , uint8_t * tov ,
2005-04-17 02:20:36 +04:00
uint16_t * r_a_tov )
{
int rval ;
uint16_t ratov ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_get_retry_cnt(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_RETRY_COUNT ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_get_retry_cnt(%ld): failed = %x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , mcp - > mb [ 0 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/* Convert returned data and check our values. */
* r_a_tov = mcp - > mb [ 3 ] / 2 ;
ratov = ( mcp - > mb [ 3 ] / 2 ) / 10 ; /* mb[3] value is in 100ms */
if ( mcp - > mb [ 1 ] * ratov > ( * retry_cnt ) * ( * tov ) ) {
/* Update to the larger values */
* retry_cnt = ( uint8_t ) mcp - > mb [ 1 ] ;
* tov = ratov ;
}
DEBUG11 ( printk ( " qla2x00_get_retry_cnt(%ld): done. mb3=%d "
2008-11-06 21:40:19 +03:00
" ratov=%d. \n " , vha - > host_no , mcp - > mb [ 3 ] , ratov ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_init_firmware
* Initialize adapter firmware .
*
* Input :
* ha = adapter block pointer .
* dptr = Initialization control block pointer .
* size = size of initialization control block .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_init_firmware ( scsi_qla_host_t * vha , uint16_t size )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
DEBUG11 ( printk ( " qla2x00_init_firmware(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2008-01-31 23:33:53 +03:00
if ( ha - > flags . npiv_supported )
2007-07-06 00:16:51 +04:00
mcp - > mb [ 0 ] = MBC_MID_INITIALIZE_FIRMWARE ;
else
mcp - > mb [ 0 ] = MBC_INITIALIZE_FIRMWARE ;
2009-03-24 19:08:01 +03:00
mcp - > mb [ 1 ] = 0 ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 2 ] = MSW ( ha - > init_cb_dma ) ;
mcp - > mb [ 3 ] = LSW ( ha - > init_cb_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( ha - > init_cb_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( ha - > init_cb_dma ) ) ;
2009-03-24 19:08:01 +03:00
mcp - > out_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
if ( IS_QLA81XX ( ha ) & & ha - > ex_init_cb - > ex_version ) {
mcp - > mb [ 1 ] = BIT_0 ;
mcp - > mb [ 10 ] = MSW ( ha - > ex_init_cb_dma ) ;
mcp - > mb [ 11 ] = LSW ( ha - > ex_init_cb_dma ) ;
mcp - > mb [ 12 ] = MSW ( MSD ( ha - > ex_init_cb_dma ) ) ;
mcp - > mb [ 13 ] = LSW ( MSD ( ha - > ex_init_cb_dma ) ) ;
mcp - > mb [ 14 ] = sizeof ( * ha - > ex_init_cb ) ;
mcp - > out_mb | = MBX_14 | MBX_13 | MBX_12 | MBX_11 | MBX_10 ;
}
mcp - > in_mb = MBX_0 ;
2005-04-17 02:20:36 +04:00
mcp - > buf_size = size ;
mcp - > flags = MBX_DMA_OUT ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_init_firmware(%ld): failed=%x "
" mb0=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_init_firmware(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_port_database
* Issue normal / enhanced get port database mailbox command
* and copy device name as necessary .
*
* Input :
* ha = adapter state pointer .
* dev = structure pointer .
* opt = enhanced cmd option byte .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_port_database ( scsi_qla_host_t * vha , fc_port_t * fcport , uint8_t opt )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
port_database_t * pd ;
2005-07-06 21:30:57 +04:00
struct port_database_24xx * pd24 ;
2005-04-17 02:20:36 +04:00
dma_addr_t pd_dma ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
pd24 = NULL ;
pd = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & pd_dma ) ;
2005-04-17 02:20:36 +04:00
if ( pd = = NULL ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Port Database "
2008-11-06 21:40:19 +03:00
" structure. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
2005-07-06 21:30:57 +04:00
memset ( pd , 0 , max ( PORT_DATABASE_SIZE , PORT_DATABASE_24XX_SIZE ) ) ;
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_GET_PORT_DATABASE ;
2007-07-20 02:05:56 +04:00
if ( opt ! = 0 & & ! IS_FWI2_CAPABLE ( ha ) )
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_ENHANCED_GET_PORT_DATABASE ;
mcp - > mb [ 2 ] = MSW ( pd_dma ) ;
mcp - > mb [ 3 ] = LSW ( pd_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( pd_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( pd_dma ) ) ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2007-07-06 00:16:51 +04:00
mcp - > out_mb = MBX_9 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_0 ;
2005-04-17 02:20:36 +04:00
mcp - > in_mb = MBX_0 ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 1 ] = fcport - > loop_id ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb | = MBX_10 | MBX_1 ;
mcp - > in_mb | = MBX_1 ;
} else if ( HAS_EXTENDED_IDS ( ha ) ) {
mcp - > mb [ 1 ] = fcport - > loop_id ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb | = MBX_10 | MBX_1 ;
} else {
mcp - > mb [ 1 ] = fcport - > loop_id < < 8 | opt ;
mcp - > out_mb | = MBX_1 ;
}
2007-07-20 02:05:56 +04:00
mcp - > buf_size = IS_FWI2_CAPABLE ( ha ) ?
PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE ;
2005-04-17 02:20:36 +04:00
mcp - > flags = MBX_DMA_IN ;
mcp - > tov = ( ha - > login_timeout * 2 ) + ( ha - > login_timeout / 2 ) ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS )
goto gpd_error_out ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2005-07-06 21:30:57 +04:00
pd24 = ( struct port_database_24xx * ) pd ;
/* Check for logged in state. */
if ( pd24 - > current_login_state ! = PDS_PRLI_COMPLETE & &
pd24 - > last_login_state ! = PDS_PRLI_COMPLETE ) {
DEBUG2 ( printk ( " %s(%ld): Unable to verify "
" login-state (%x/%x) for loop_id %x \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ,
2005-07-06 21:30:57 +04:00
pd24 - > current_login_state ,
pd24 - > last_login_state , fcport - > loop_id ) ) ;
rval = QLA_FUNCTION_FAILED ;
goto gpd_error_out ;
}
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
/* Names are little-endian. */
memcpy ( fcport - > node_name , pd24 - > node_name , WWN_SIZE ) ;
memcpy ( fcport - > port_name , pd24 - > port_name , WWN_SIZE ) ;
/* Get port_id of device. */
fcport - > d_id . b . domain = pd24 - > port_id [ 0 ] ;
fcport - > d_id . b . area = pd24 - > port_id [ 1 ] ;
fcport - > d_id . b . al_pa = pd24 - > port_id [ 2 ] ;
fcport - > d_id . b . rsvd_1 = 0 ;
/* If not target must be initiator or unknown type. */
if ( ( pd24 - > prli_svc_param_word_3 [ 0 ] & BIT_4 ) = = 0 )
fcport - > port_type = FCT_INITIATOR ;
else
fcport - > port_type = FCT_TARGET ;
} else {
/* Check for logged in state. */
if ( pd - > master_state ! = PD_STATE_PORT_LOGGED_IN & &
pd - > slave_state ! = PD_STATE_PORT_LOGGED_IN ) {
rval = QLA_FUNCTION_FAILED ;
goto gpd_error_out ;
}
2005-04-17 02:20:36 +04:00
2005-07-06 21:30:57 +04:00
/* Names are little-endian. */
memcpy ( fcport - > node_name , pd - > node_name , WWN_SIZE ) ;
memcpy ( fcport - > port_name , pd - > port_name , WWN_SIZE ) ;
/* Get port_id of device. */
fcport - > d_id . b . domain = pd - > port_id [ 0 ] ;
fcport - > d_id . b . area = pd - > port_id [ 3 ] ;
fcport - > d_id . b . al_pa = pd - > port_id [ 2 ] ;
fcport - > d_id . b . rsvd_1 = 0 ;
/* If not target must be initiator or unknown type. */
if ( ( pd - > prli_svc_param_word_3 [ 0 ] & BIT_4 ) = = 0 )
fcport - > port_type = FCT_INITIATOR ;
else
fcport - > port_type = FCT_TARGET ;
2005-08-27 06:08:10 +04:00
/* Passback COS information. */
fcport - > supported_classes = ( pd - > options & BIT_4 ) ?
FC_COS_CLASS2 : FC_COS_CLASS3 ;
2005-07-06 21:30:57 +04:00
}
2005-04-17 02:20:36 +04:00
gpd_error_out :
dma_pool_free ( ha - > s_dma_pool , pd , pd_dma ) ;
if ( rval ! = QLA_SUCCESS ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_firmware_state
* Get adapter firmware state .
*
* Input :
* ha = adapter block pointer .
* dptr = pointer for firmware state .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_firmware_state ( scsi_qla_host_t * vha , uint16_t * states )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_get_firmware_state(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_FIRMWARE_STATE ;
mcp - > out_mb = MBX_0 ;
2009-06-17 21:30:30 +04:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) )
mcp - > in_mb = MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
else
mcp - > in_mb = MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
2008-04-04 00:13:26 +04:00
/* Return firmware states. */
states [ 0 ] = mcp - > mb [ 1 ] ;
2009-06-17 21:30:30 +04:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
states [ 1 ] = mcp - > mb [ 2 ] ;
states [ 2 ] = mcp - > mb [ 3 ] ;
states [ 3 ] = mcp - > mb [ 4 ] ;
states [ 4 ] = mcp - > mb [ 5 ] ;
}
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_get_firmware_state(%ld): "
2008-11-06 21:40:19 +03:00
" failed=%x. \n " , vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_get_firmware_state(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_port_name
* Issue get port name mailbox command .
* Returned name is in big endian format .
*
* Input :
* ha = adapter block pointer .
* loop_id = loop ID of device .
* name = pointer for name .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_port_name ( scsi_qla_host_t * vha , uint16_t loop_id , uint8_t * name ,
2005-04-17 02:20:36 +04:00
uint8_t opt )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_get_port_name(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_PORT_NAME ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2007-07-06 00:16:51 +04:00
mcp - > out_mb = MBX_9 | MBX_1 | MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( HAS_EXTENDED_IDS ( vha - > hw ) ) {
2005-04-17 02:20:36 +04:00
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb | = MBX_10 ;
} else {
mcp - > mb [ 1 ] = loop_id < < 8 | opt ;
}
mcp - > in_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_get_port_name(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
if ( name ! = NULL ) {
/* This function returns name in big endian. */
2007-03-22 18:53:19 +03:00
name [ 0 ] = MSB ( mcp - > mb [ 2 ] ) ;
name [ 1 ] = LSB ( mcp - > mb [ 2 ] ) ;
name [ 2 ] = MSB ( mcp - > mb [ 3 ] ) ;
name [ 3 ] = LSB ( mcp - > mb [ 3 ] ) ;
name [ 4 ] = MSB ( mcp - > mb [ 6 ] ) ;
name [ 5 ] = LSB ( mcp - > mb [ 6 ] ) ;
name [ 6 ] = MSB ( mcp - > mb [ 7 ] ) ;
name [ 7 ] = LSB ( mcp - > mb [ 7 ] ) ;
2005-04-17 02:20:36 +04:00
}
DEBUG11 ( printk ( " qla2x00_get_port_name(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_lip_reset
* Issue LIP reset mailbox command .
*
* Input :
* ha = adapter block pointer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_lip_reset ( scsi_qla_host_t * vha )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
2009-01-05 22:18:11 +03:00
if ( IS_QLA81XX ( vha - > hw ) ) {
/* Logout across all FCFs. */
mcp - > mb [ 0 ] = MBC_LIP_FULL_LOGIN ;
mcp - > mb [ 1 ] = BIT_1 ;
mcp - > mb [ 2 ] = 0 ;
mcp - > out_mb = MBX_2 | MBX_1 | MBX_0 ;
} else if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_LIP_FULL_LOGIN ;
2006-12-14 06:20:30 +03:00
mcp - > mb [ 1 ] = BIT_6 ;
mcp - > mb [ 2 ] = 0 ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 3 ] = vha - > hw - > loop_reset_delay ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2005-04-17 02:20:36 +04:00
} else {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_LIP_RESET ;
mcp - > out_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( HAS_EXTENDED_IDS ( vha - > hw ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 1 ] = 0x00ff ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb | = MBX_10 ;
} else {
mcp - > mb [ 1 ] = 0xff00 ;
}
2008-11-06 21:40:19 +03:00
mcp - > mb [ 2 ] = vha - > hw - > loop_reset_delay ;
2005-07-06 21:30:57 +04:00
mcp - > mb [ 3 ] = 0 ;
2005-04-17 02:20:36 +04:00
}
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_send_sns
* Send SNS command .
*
* Input :
* ha = adapter block pointer .
* sns = pointer for command .
* cmd_size = command size .
* buf_size = response / command size .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_send_sns ( scsi_qla_host_t * vha , dma_addr_t sns_phys_address ,
2005-04-17 02:20:36 +04:00
uint16_t cmd_size , size_t buf_size )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_send_sns(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
DEBUG11 ( printk ( " qla2x00_send_sns: retry cnt=%d ratov=%d total "
2008-11-06 21:40:19 +03:00
" tov=%d. \n " , vha - > hw - > retry_count , vha - > hw - > login_timeout ,
mcp - > tov ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_SEND_SNS_COMMAND ;
mcp - > mb [ 1 ] = cmd_size ;
mcp - > mb [ 2 ] = MSW ( sns_phys_address ) ;
mcp - > mb [ 3 ] = LSW ( sns_phys_address ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( sns_phys_address ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( sns_phys_address ) ) ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 | MBX_1 ;
mcp - > buf_size = buf_size ;
mcp - > flags = MBX_DMA_OUT | MBX_DMA_IN ;
2008-11-06 21:40:19 +03:00
mcp - > tov = ( vha - > hw - > login_timeout * 2 ) + ( vha - > hw - > login_timeout / 2 ) ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG ( printk ( " qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
2008-11-06 21:40:19 +03:00
" mb[1]=%x. \n " , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
DEBUG2_3_11 ( printk ( " qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
2008-11-06 21:40:19 +03:00
" mb[1]=%x. \n " , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " qla2x00_send_sns(%ld): done. \n " , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
2005-07-06 21:30:57 +04:00
int
2008-11-06 21:40:19 +03:00
qla24xx_login_fabric ( scsi_qla_host_t * vha , uint16_t loop_id , uint8_t domain ,
2005-07-06 21:30:57 +04:00
uint8_t area , uint8_t al_pa , uint16_t * mb , uint8_t opt )
{
int rval ;
struct logio_entry_24xx * lg ;
dma_addr_t lg_dma ;
uint32_t iop [ 2 ] ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2009-04-07 09:33:40 +04:00
struct req_que * req ;
struct rsp_que * rsp ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
2009-08-05 20:18:40 +04:00
if ( ha - > flags . cpu_affinity_enabled )
2009-04-07 09:33:41 +04:00
req = ha - > req_q_map [ 0 ] ;
else
req = vha - > req ;
2009-04-07 09:33:40 +04:00
rsp = req - > rsp ;
2005-07-06 21:30:57 +04:00
lg = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & lg_dma ) ;
if ( lg = = NULL ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Login IOCB. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( lg , 0 , sizeof ( struct logio_entry_24xx ) ) ;
lg - > entry_type = LOGINOUT_PORT_IOCB_TYPE ;
lg - > entry_count = 1 ;
2009-04-07 09:33:40 +04:00
lg - > handle = MAKE_HANDLE ( req - > id , lg - > handle ) ;
2005-07-06 21:30:57 +04:00
lg - > nport_handle = cpu_to_le16 ( loop_id ) ;
lg - > control_flags = __constant_cpu_to_le16 ( LCF_COMMAND_PLOGI ) ;
if ( opt & BIT_0 )
lg - > control_flags | = __constant_cpu_to_le16 ( LCF_COND_PLOGI ) ;
2006-06-24 03:10:44 +04:00
if ( opt & BIT_1 )
lg - > control_flags | = __constant_cpu_to_le16 ( LCF_SKIP_PRLI ) ;
2005-07-06 21:30:57 +04:00
lg - > port_id [ 0 ] = al_pa ;
lg - > port_id [ 1 ] = area ;
lg - > port_id [ 2 ] = domain ;
2008-11-06 21:40:19 +03:00
lg - > vp_index = vha - > vp_idx ;
rval = qla2x00_issue_iocb ( vha , lg , lg_dma , 0 ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue Login IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , rval ) ) ;
2005-07-06 21:30:57 +04:00
} else if ( lg - > entry_status ! = 0 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , vha - > host_no ,
2005-07-06 21:30:57 +04:00
lg - > entry_status ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( lg - > comp_status ! = __constant_cpu_to_le16 ( CS_COMPLETE ) ) {
iop [ 0 ] = le32_to_cpu ( lg - > io_parameter [ 0 ] ) ;
iop [ 1 ] = le32_to_cpu ( lg - > io_parameter [ 1 ] ) ;
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
" -- completion status (%x) ioparam=%x/%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , le16_to_cpu ( lg - > comp_status ) , iop [ 0 ] ,
2005-07-06 21:30:57 +04:00
iop [ 1 ] ) ) ;
switch ( iop [ 0 ] ) {
case LSC_SCODE_PORTID_USED :
mb [ 0 ] = MBS_PORT_ID_USED ;
mb [ 1 ] = LSW ( iop [ 1 ] ) ;
break ;
case LSC_SCODE_NPORT_USED :
mb [ 0 ] = MBS_LOOP_ID_USED ;
break ;
case LSC_SCODE_NOLINK :
case LSC_SCODE_NOIOCB :
case LSC_SCODE_NOXCB :
case LSC_SCODE_CMD_FAILED :
case LSC_SCODE_NOFABRIC :
case LSC_SCODE_FW_NOT_READY :
case LSC_SCODE_NOT_LOGGED_IN :
case LSC_SCODE_NOPCB :
case LSC_SCODE_ELS_REJECT :
case LSC_SCODE_CMD_PARAM_ERR :
case LSC_SCODE_NONPORT :
case LSC_SCODE_LOGGED_IN :
case LSC_SCODE_NOFLOGI_ACC :
default :
mb [ 0 ] = MBS_COMMAND_ERROR ;
break ;
}
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
iop [ 0 ] = le32_to_cpu ( lg - > io_parameter [ 0 ] ) ;
mb [ 0 ] = MBS_COMMAND_COMPLETE ;
mb [ 1 ] = 0 ;
if ( iop [ 0 ] & BIT_4 ) {
if ( iop [ 0 ] & BIT_8 )
mb [ 1 ] | = BIT_1 ;
} else
mb [ 1 ] = BIT_0 ;
2005-08-27 06:08:10 +04:00
/* Passback COS information. */
mb [ 10 ] = 0 ;
if ( lg - > io_parameter [ 7 ] | | lg - > io_parameter [ 8 ] )
mb [ 10 ] | = BIT_0 ; /* Class 2. */
if ( lg - > io_parameter [ 9 ] | | lg - > io_parameter [ 10 ] )
mb [ 10 ] | = BIT_1 ; /* Class 3. */
2005-07-06 21:30:57 +04:00
}
dma_pool_free ( ha - > s_dma_pool , lg , lg_dma ) ;
return rval ;
}
2005-04-17 02:20:36 +04:00
/*
* qla2x00_login_fabric
* Issue login fabric port mailbox command .
*
* Input :
* ha = adapter block pointer .
* loop_id = device loop ID .
* domain = device domain .
* area = device area .
* al_pa = device AL_PA .
* status = pointer for return status .
* opt = command options .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_login_fabric ( scsi_qla_host_t * vha , uint16_t loop_id , uint8_t domain ,
2005-04-17 02:20:36 +04:00
uint8_t area , uint8_t al_pa , uint16_t * mb , uint8_t opt )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " qla2x00_login_fabric(%ld): entered. \n " , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_LOGIN_FABRIC_PORT ;
mcp - > out_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
if ( HAS_EXTENDED_IDS ( ha ) ) {
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb | = MBX_10 ;
} else {
mcp - > mb [ 1 ] = ( loop_id < < 8 ) | opt ;
}
mcp - > mb [ 2 ] = domain ;
mcp - > mb [ 3 ] = area < < 8 | al_pa ;
mcp - > in_mb = MBX_7 | MBX_6 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > tov = ( ha - > login_timeout * 2 ) + ( ha - > login_timeout / 2 ) ;
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
/* Return mailbox statuses. */
if ( mb ! = NULL ) {
mb [ 0 ] = mcp - > mb [ 0 ] ;
mb [ 1 ] = mcp - > mb [ 1 ] ;
mb [ 2 ] = mcp - > mb [ 2 ] ;
mb [ 6 ] = mcp - > mb [ 6 ] ;
mb [ 7 ] = mcp - > mb [ 7 ] ;
2005-08-27 06:08:10 +04:00
/* COS retrieved from Get-Port-Database mailbox command. */
mb [ 10 ] = 0 ;
2005-04-17 02:20:36 +04:00
}
if ( rval ! = QLA_SUCCESS ) {
/* RLU tmp code: need to change main mailbox_command function to
* return ok even when the mailbox completion value is not
* SUCCESS . The caller needs to be responsible to interpret
* the return values of this mailbox command if we ' re not
* to change too much of the existing code .
*/
if ( mcp - > mb [ 0 ] = = 0x4001 | | mcp - > mb [ 0 ] = = 0x4002 | |
mcp - > mb [ 0 ] = = 0x4003 | | mcp - > mb [ 0 ] = = 0x4005 | |
mcp - > mb [ 0 ] = = 0x4006 )
rval = QLA_SUCCESS ;
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_login_fabric(%ld): failed=%x "
2008-11-06 21:40:19 +03:00
" mb[0]=%x mb[1]=%x mb[2]=%x. \n " , vha - > host_no , rval ,
2006-06-24 03:11:05 +04:00
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 2 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_login_fabric(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_login_local_device
* Issue login loop port mailbox command .
2005-07-06 21:32:07 +04:00
*
2005-04-17 02:20:36 +04:00
* Input :
* ha = adapter block pointer .
* loop_id = device loop ID .
* opt = command options .
2005-07-06 21:32:07 +04:00
*
2005-04-17 02:20:36 +04:00
* Returns :
* Return status code .
2005-07-06 21:32:07 +04:00
*
2005-04-17 02:20:36 +04:00
* Context :
* Kernel context .
2005-07-06 21:32:07 +04:00
*
2005-04-17 02:20:36 +04:00
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_login_local_device ( scsi_qla_host_t * vha , fc_port_t * fcport ,
2005-04-17 02:20:36 +04:00
uint16_t * mb_ret , uint8_t opt )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) )
2008-11-06 21:40:19 +03:00
return qla24xx_login_fabric ( vha , fcport - > loop_id ,
2006-03-10 01:27:44 +03:00
fcport - > d_id . b . domain , fcport - > d_id . b . area ,
fcport - > d_id . b . al_pa , mb_ret , opt ) ;
2008-11-06 21:40:19 +03:00
DEBUG3 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_LOGIN_LOOP_PORT ;
if ( HAS_EXTENDED_IDS ( ha ) )
2006-03-10 01:27:44 +03:00
mcp - > mb [ 1 ] = fcport - > loop_id ;
2005-04-17 02:20:36 +04:00
else
2006-03-10 01:27:44 +03:00
mcp - > mb [ 1 ] = fcport - > loop_id < < 8 ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 2 ] = opt ;
mcp - > out_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_7 | MBX_6 | MBX_1 | MBX_0 ;
mcp - > tov = ( ha - > login_timeout * 2 ) + ( ha - > login_timeout / 2 ) ;
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
/* Return mailbox statuses. */
if ( mb_ret ! = NULL ) {
mb_ret [ 0 ] = mcp - > mb [ 0 ] ;
mb_ret [ 1 ] = mcp - > mb [ 1 ] ;
mb_ret [ 6 ] = mcp - > mb [ 6 ] ;
mb_ret [ 7 ] = mcp - > mb [ 7 ] ;
}
if ( rval ! = QLA_SUCCESS ) {
/* AV tmp code: need to change main mailbox_command function to
* return ok even when the mailbox completion value is not
* SUCCESS . The caller needs to be responsible to interpret
* the return values of this mailbox command if we ' re not
* to change too much of the existing code .
*/
if ( mcp - > mb [ 0 ] = = 0x4005 | | mcp - > mb [ 0 ] = = 0x4006 )
rval = QLA_SUCCESS ;
DEBUG ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x "
2008-11-06 21:40:19 +03:00
" mb[6]=%x mb[7]=%x. \n " , __func__ , vha - > host_no , rval ,
2006-06-24 03:11:05 +04:00
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 6 ] , mcp - > mb [ 7 ] ) ) ;
2005-04-17 02:20:36 +04:00
DEBUG2_3 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x "
2008-11-06 21:40:19 +03:00
" mb[6]=%x mb[7]=%x. \n " , __func__ , vha - > host_no , rval ,
2006-06-24 03:11:05 +04:00
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 6 ] , mcp - > mb [ 7 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG3 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return ( rval ) ;
}
2005-07-06 21:30:57 +04:00
int
2008-11-06 21:40:19 +03:00
qla24xx_fabric_logout ( scsi_qla_host_t * vha , uint16_t loop_id , uint8_t domain ,
2005-07-06 21:30:57 +04:00
uint8_t area , uint8_t al_pa )
{
int rval ;
struct logio_entry_24xx * lg ;
dma_addr_t lg_dma ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2009-04-07 09:33:40 +04:00
struct req_que * req ;
struct rsp_que * rsp ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
lg = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & lg_dma ) ;
if ( lg = = NULL ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Logout IOCB. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( lg , 0 , sizeof ( struct logio_entry_24xx ) ) ;
2009-04-07 09:33:40 +04:00
if ( ql2xmaxqueues > 1 )
req = ha - > req_q_map [ 0 ] ;
else
req = vha - > req ;
rsp = req - > rsp ;
2005-07-06 21:30:57 +04:00
lg - > entry_type = LOGINOUT_PORT_IOCB_TYPE ;
lg - > entry_count = 1 ;
2009-04-07 09:33:40 +04:00
lg - > handle = MAKE_HANDLE ( req - > id , lg - > handle ) ;
2005-07-06 21:30:57 +04:00
lg - > nport_handle = cpu_to_le16 ( loop_id ) ;
lg - > control_flags =
2007-01-29 21:22:22 +03:00
__constant_cpu_to_le16 ( LCF_COMMAND_LOGO | LCF_IMPL_LOGO ) ;
2005-07-06 21:30:57 +04:00
lg - > port_id [ 0 ] = al_pa ;
lg - > port_id [ 1 ] = area ;
lg - > port_id [ 2 ] = domain ;
2008-11-06 21:40:19 +03:00
lg - > vp_index = vha - > vp_idx ;
2008-12-10 03:45:39 +03:00
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb ( vha , lg , lg_dma , 0 ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue Logout IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , rval ) ) ;
2005-07-06 21:30:57 +04:00
} else if ( lg - > entry_status ! = 0 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , vha - > host_no ,
2005-07-06 21:30:57 +04:00
lg - > entry_status ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( lg - > comp_status ! = __constant_cpu_to_le16 ( CS_COMPLETE ) ) {
2008-12-10 03:45:39 +03:00
DEBUG2_3_11 ( printk ( " %s(%ld %d): failed to complete IOCB "
2005-07-06 21:30:57 +04:00
" -- completion status (%x) ioparam=%x/%x. \n " , __func__ ,
2008-12-10 03:45:39 +03:00
vha - > host_no , vha - > vp_idx , le16_to_cpu ( lg - > comp_status ) ,
2005-07-06 21:30:57 +04:00
le32_to_cpu ( lg - > io_parameter [ 0 ] ) ,
2006-06-24 03:11:05 +04:00
le32_to_cpu ( lg - > io_parameter [ 1 ] ) ) ) ;
2005-07-06 21:30:57 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
dma_pool_free ( ha - > s_dma_pool , lg , lg_dma ) ;
return rval ;
}
2005-04-17 02:20:36 +04:00
/*
* qla2x00_fabric_logout
* Issue logout fabric port mailbox command .
*
* Input :
* ha = adapter block pointer .
* loop_id = device loop ID .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_fabric_logout ( scsi_qla_host_t * vha , uint16_t loop_id , uint8_t domain ,
2005-07-06 21:30:57 +04:00
uint8_t area , uint8_t al_pa )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_fabric_logout(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_LOGOUT_FABRIC_PORT ;
mcp - > out_mb = MBX_1 | MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( HAS_EXTENDED_IDS ( vha - > hw ) ) {
2005-04-17 02:20:36 +04:00
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb | = MBX_10 ;
} else {
mcp - > mb [ 1 ] = loop_id < < 8 ;
}
mcp - > in_mb = MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_fabric_logout(%ld): failed=%x "
2008-11-06 21:40:19 +03:00
" mbx1=%x. \n " , vha - > host_no , rval , mcp - > mb [ 1 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_fabric_logout(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_full_login_lip
* Issue full login LIP mailbox command .
*
* Input :
* ha = adapter block pointer .
* TARGET_QUEUE_LOCK must be released .
* ADAPTER_STATE_LOCK must be released .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_full_login_lip ( scsi_qla_host_t * vha )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_full_login_lip(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_LIP_FULL_LOGIN ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 1 ] = IS_FWI2_CAPABLE ( vha - > hw ) ? BIT_3 : 0 ;
2006-12-14 06:20:30 +03:00
mcp - > mb [ 2 ] = 0 ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 3 ] = 0 ;
mcp - > out_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_full_login_lip(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
/*EMPTY*/
DEBUG11 ( printk ( " qla2x00_full_login_lip(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_id_list
*
* Input :
* ha = adapter block pointer .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_id_list ( scsi_qla_host_t * vha , void * id_list , dma_addr_t id_list_dma ,
2005-04-17 02:20:36 +04:00
uint16_t * entries )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " qla2x00_get_id_list(%ld): entered. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
if ( id_list = = NULL )
return QLA_FUNCTION_FAILED ;
mcp - > mb [ 0 ] = MBC_GET_ID_LIST ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_0 ;
2008-11-06 21:40:19 +03:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
2005-07-06 21:30:57 +04:00
mcp - > mb [ 2 ] = MSW ( id_list_dma ) ;
mcp - > mb [ 3 ] = LSW ( id_list_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( id_list_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( id_list_dma ) ) ;
2006-02-07 19:45:40 +03:00
mcp - > mb [ 8 ] = 0 ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2007-07-06 00:16:51 +04:00
mcp - > out_mb | = MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 ;
2005-07-06 21:30:57 +04:00
} else {
mcp - > mb [ 1 ] = MSW ( id_list_dma ) ;
mcp - > mb [ 2 ] = LSW ( id_list_dma ) ;
mcp - > mb [ 3 ] = MSW ( MSD ( id_list_dma ) ) ;
mcp - > mb [ 6 ] = LSW ( MSD ( id_list_dma ) ) ;
mcp - > out_mb | = MBX_6 | MBX_3 | MBX_2 | MBX_1 ;
}
2005-04-17 02:20:36 +04:00
mcp - > in_mb = MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " qla2x00_get_id_list(%ld): failed=%x. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
* entries = mcp - > mb [ 1 ] ;
DEBUG11 ( printk ( " qla2x00_get_id_list(%ld): done. \n " ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
/*
* qla2x00_get_resource_cnts
* Get current firmware resource counts .
*
* Input :
* ha = adapter block pointer .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_resource_cnts ( scsi_qla_host_t * vha , uint16_t * cur_xchg_cnt ,
2007-09-21 01:07:43 +04:00
uint16_t * orig_xchg_cnt , uint16_t * cur_iocb_cnt ,
2009-10-14 02:16:49 +04:00
uint16_t * orig_iocb_cnt , uint16_t * max_npiv_vports , uint16_t * max_fcfs )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
mcp - > mb [ 0 ] = MBC_GET_RESOURCE_COUNTS ;
mcp - > out_mb = MBX_0 ;
2007-09-21 01:07:43 +04:00
mcp - > in_mb = MBX_11 | MBX_10 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2009-10-14 02:16:49 +04:00
if ( IS_QLA81XX ( vha - > hw ) )
mcp - > in_mb | = MBX_12 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-04-17 02:20:36 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " %s(%ld): failed = %x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , mcp - > mb [ 0 ] ) ) ;
2005-04-17 02:20:36 +04:00
} else {
DEBUG11 ( printk ( " %s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "
2009-10-14 02:16:49 +04:00
" mb7=%x mb10=%x mb11=%x mb12=%x. \n " , __func__ ,
vha - > host_no , mcp - > mb [ 1 ] , mcp - > mb [ 2 ] , mcp - > mb [ 3 ] ,
mcp - > mb [ 6 ] , mcp - > mb [ 7 ] , mcp - > mb [ 10 ] , mcp - > mb [ 11 ] ,
mcp - > mb [ 12 ] ) ) ;
2005-04-17 02:20:36 +04:00
if ( cur_xchg_cnt )
* cur_xchg_cnt = mcp - > mb [ 3 ] ;
if ( orig_xchg_cnt )
* orig_xchg_cnt = mcp - > mb [ 6 ] ;
if ( cur_iocb_cnt )
* cur_iocb_cnt = mcp - > mb [ 7 ] ;
if ( orig_iocb_cnt )
* orig_iocb_cnt = mcp - > mb [ 10 ] ;
2008-11-06 21:40:19 +03:00
if ( vha - > hw - > flags . npiv_supported & & max_npiv_vports )
2007-09-21 01:07:43 +04:00
* max_npiv_vports = mcp - > mb [ 11 ] ;
2009-10-14 02:16:49 +04:00
if ( IS_QLA81XX ( vha - > hw ) & & max_fcfs )
* max_fcfs = mcp - > mb [ 12 ] ;
2005-04-17 02:20:36 +04:00
}
return ( rval ) ;
}
# if defined(QL_DEBUG_LEVEL_3)
/*
* qla2x00_get_fcal_position_map
* Get FCAL ( LILP ) position map using mailbox command
*
* Input :
* ha = adapter state pointer .
* pos_map = buffer pointer ( can be NULL ) .
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel context .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_fcal_position_map ( scsi_qla_host_t * vha , char * pos_map )
2005-04-17 02:20:36 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
char * pmap ;
dma_addr_t pmap_dma ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-04-17 02:20:36 +04:00
2008-09-12 08:22:48 +04:00
pmap = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & pmap_dma ) ;
2005-04-17 02:20:36 +04:00
if ( pmap = = NULL ) {
DEBUG2_3_11 ( printk ( " %s(%ld): **** Mem Alloc Failed **** " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( pmap , 0 , FCAL_MAP_SIZE ) ;
mcp - > mb [ 0 ] = MBC_GET_FC_AL_POSITION_MAP ;
mcp - > mb [ 2 ] = MSW ( pmap_dma ) ;
mcp - > mb [ 3 ] = LSW ( pmap_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( pmap_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( pmap_dma ) ) ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_0 ;
mcp - > in_mb = MBX_1 | MBX_0 ;
mcp - > buf_size = FCAL_MAP_SIZE ;
mcp - > flags = MBX_DMA_IN ;
mcp - > tov = ( ha - > login_timeout * 2 ) + ( ha - > login_timeout / 2 ) ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-04-17 02:20:36 +04:00
if ( rval = = QLA_SUCCESS ) {
DEBUG11 ( printk ( " %s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
2008-11-06 21:40:19 +03:00
" size (%x) \n " , __func__ , vha - > host_no , mcp - > mb [ 0 ] ,
2005-04-17 02:20:36 +04:00
mcp - > mb [ 1 ] , ( unsigned ) pmap [ 0 ] ) ) ;
DEBUG11 ( qla2x00_dump_buffer ( pmap , pmap [ 0 ] + 1 ) ) ;
if ( pos_map )
memcpy ( pos_map , pmap , FCAL_MAP_SIZE ) ;
}
dma_pool_free ( ha - > s_dma_pool , pmap , pmap_dma ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-04-17 02:20:36 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-04-17 02:20:36 +04:00
}
return rval ;
}
2006-02-01 03:05:02 +03:00
# endif
/*
* qla2x00_get_link_status
*
* Input :
* ha = adapter block pointer .
* loop_id = device loop ID .
* ret_buf = pointer to link status return buffer .
*
* Returns :
* 0 = success .
* BIT_0 = mem alloc error .
* BIT_1 = mailbox error .
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_get_link_status ( scsi_qla_host_t * vha , uint16_t loop_id ,
2008-01-17 20:02:08 +03:00
struct link_statistics * stats , dma_addr_t stats_dma )
2006-02-01 03:05:02 +03:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-01-17 20:02:08 +03:00
uint32_t * siter , * diter , dwords ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2006-02-01 03:05:02 +03:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2006-02-01 03:05:02 +03:00
mcp - > mb [ 0 ] = MBC_GET_LINK_STATUS ;
2008-01-17 20:02:08 +03:00
mcp - > mb [ 2 ] = MSW ( stats_dma ) ;
mcp - > mb [ 3 ] = LSW ( stats_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( stats_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( stats_dma ) ) ;
2006-02-01 03:05:02 +03:00
mcp - > out_mb = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
2007-07-20 02:05:56 +04:00
if ( IS_FWI2_CAPABLE ( ha ) ) {
2006-02-01 03:05:02 +03:00
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 4 ] = 0 ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb | = MBX_10 | MBX_4 | MBX_1 ;
mcp - > in_mb | = MBX_1 ;
} else if ( HAS_EXTENDED_IDS ( ha ) ) {
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb | = MBX_10 | MBX_1 ;
} else {
mcp - > mb [ 1 ] = loop_id < < 8 ;
mcp - > out_mb | = MBX_1 ;
}
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2006-02-01 03:05:02 +03:00
mcp - > flags = IOCTL_CMD ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2006-02-01 03:05:02 +03:00
if ( rval = = QLA_SUCCESS ) {
if ( mcp - > mb [ 0 ] ! = MBS_COMMAND_COMPLETE ) {
DEBUG2_3_11 ( printk ( " %s(%ld): cmd failed. mbx0=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , mcp - > mb [ 0 ] ) ) ;
2008-01-17 20:02:08 +03:00
rval = QLA_FUNCTION_FAILED ;
2006-02-01 03:05:02 +03:00
} else {
2008-01-17 20:02:08 +03:00
/* Copy over data -- firmware data is LE. */
dwords = offsetof ( struct link_statistics , unused1 ) / 4 ;
siter = diter = & stats - > link_fail_cnt ;
while ( dwords - - )
* diter + + = le32_to_cpu ( * siter + + ) ;
2006-02-01 03:05:02 +03:00
}
} else {
/* Failed. */
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2006-02-01 03:05:02 +03:00
}
return rval ;
}
int
2008-11-06 21:40:19 +03:00
qla24xx_get_isp_stats ( scsi_qla_host_t * vha , struct link_statistics * stats ,
2008-01-17 20:02:08 +03:00
dma_addr_t stats_dma )
2005-07-06 21:30:57 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-01-17 20:02:08 +03:00
uint32_t * siter , * diter , dwords ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_GET_LINK_PRIV_STATS ;
2008-01-17 20:02:08 +03:00
mcp - > mb [ 2 ] = MSW ( stats_dma ) ;
mcp - > mb [ 3 ] = LSW ( stats_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( stats_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( stats_dma ) ) ;
mcp - > mb [ 8 ] = sizeof ( struct link_statistics ) / 4 ;
2008-11-06 21:40:19 +03:00
mcp - > mb [ 9 ] = vha - > vp_idx ;
2005-07-06 21:30:57 +04:00
mcp - > mb [ 10 ] = 0 ;
2008-01-17 20:02:08 +03:00
mcp - > out_mb = MBX_10 | MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_0 ;
2005-07-06 21:30:57 +04:00
mcp - > in_mb = MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-07-06 21:30:57 +04:00
mcp - > flags = IOCTL_CMD ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-07-06 21:30:57 +04:00
if ( rval = = QLA_SUCCESS ) {
if ( mcp - > mb [ 0 ] ! = MBS_COMMAND_COMPLETE ) {
DEBUG2_3_11 ( printk ( " %s(%ld): cmd failed. mbx0=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , mcp - > mb [ 0 ] ) ) ;
2008-01-17 20:02:08 +03:00
rval = QLA_FUNCTION_FAILED ;
2005-07-06 21:30:57 +04:00
} else {
/* Copy over data -- firmware data is LE. */
2008-01-17 20:02:08 +03:00
dwords = sizeof ( struct link_statistics ) / 4 ;
siter = diter = & stats - > link_fail_cnt ;
2005-07-06 21:30:57 +04:00
while ( dwords - - )
2008-01-17 20:02:08 +03:00
* diter + + = le32_to_cpu ( * siter + + ) ;
2005-07-06 21:30:57 +04:00
}
} else {
/* Failed. */
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-07-06 21:30:57 +04:00
}
return rval ;
}
int
2009-04-07 09:33:40 +04:00
qla24xx_abort_command ( srb_t * sp )
2005-07-06 21:30:57 +04:00
{
int rval ;
unsigned long flags = 0 ;
struct abort_entry_24xx * abt ;
dma_addr_t abt_dma ;
uint32_t handle ;
2009-04-07 09:33:40 +04:00
fc_port_t * fcport = sp - > fcport ;
struct scsi_qla_host * vha = fcport - > vha ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2009-04-07 09:33:42 +04:00
struct req_que * req = vha - > req ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
spin_lock_irqsave ( & ha - > hardware_lock , flags ) ;
2005-07-06 21:30:57 +04:00
for ( handle = 1 ; handle < MAX_OUTSTANDING_COMMANDS ; handle + + ) {
2008-11-06 21:40:19 +03:00
if ( req - > outstanding_cmds [ handle ] = = sp )
2005-07-06 21:30:57 +04:00
break ;
}
2008-11-06 21:40:19 +03:00
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
2005-07-06 21:30:57 +04:00
if ( handle = = MAX_OUTSTANDING_COMMANDS ) {
/* Command not found. */
return QLA_FUNCTION_FAILED ;
}
abt = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & abt_dma ) ;
if ( abt = = NULL ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Abort IOCB. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( abt , 0 , sizeof ( struct abort_entry_24xx ) ) ;
abt - > entry_type = ABORT_IOCB_TYPE ;
abt - > entry_count = 1 ;
2009-04-07 09:33:40 +04:00
abt - > handle = MAKE_HANDLE ( req - > id , abt - > handle ) ;
2005-07-06 21:30:57 +04:00
abt - > nport_handle = cpu_to_le16 ( fcport - > loop_id ) ;
abt - > handle_to_abort = handle ;
abt - > port_id [ 0 ] = fcport - > d_id . b . al_pa ;
abt - > port_id [ 1 ] = fcport - > d_id . b . area ;
abt - > port_id [ 2 ] = fcport - > d_id . b . domain ;
2007-07-06 00:16:51 +04:00
abt - > vp_index = fcport - > vp_idx ;
2008-12-10 03:45:39 +03:00
abt - > req_que_no = cpu_to_le16 ( req - > id ) ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb ( vha , abt , abt_dma , 0 ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue IOCB (%x). \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval ) ) ;
2005-07-06 21:30:57 +04:00
} else if ( abt - > entry_status ! = 0 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , vha - > host_no ,
2005-07-06 21:30:57 +04:00
abt - > entry_status ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( abt - > nport_handle ! = __constant_cpu_to_le16 ( 0 ) ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- completion status (%x). \n " , __func__ , vha - > host_no ,
2006-06-24 03:11:05 +04:00
le16_to_cpu ( abt - > nport_handle ) ) ) ;
2005-07-06 21:30:57 +04:00
rval = QLA_FUNCTION_FAILED ;
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
dma_pool_free ( ha - > s_dma_pool , abt , abt_dma ) ;
return rval ;
}
struct tsk_mgmt_cmd {
union {
struct tsk_mgmt_entry tsk ;
struct sts_entry_24xx sts ;
} p ;
} ;
2008-04-04 00:13:24 +04:00
static int
__qla24xx_issue_tmf ( char * name , uint32_t type , struct fc_port * fcport ,
2009-04-07 09:33:40 +04:00
unsigned int l , int tag )
2005-07-06 21:30:57 +04:00
{
2008-04-04 00:13:24 +04:00
int rval , rval2 ;
2005-07-06 21:30:57 +04:00
struct tsk_mgmt_cmd * tsk ;
2009-10-14 02:16:50 +04:00
struct sts_entry_24xx * sts ;
2005-07-06 21:30:57 +04:00
dma_addr_t tsk_dma ;
2008-11-06 21:40:19 +03:00
scsi_qla_host_t * vha ;
struct qla_hw_data * ha ;
2008-12-10 03:45:39 +03:00
struct req_que * req ;
struct rsp_que * rsp ;
2005-07-06 21:30:57 +04:00
2008-11-15 00:48:12 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , fcport - > vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
2008-11-06 21:40:19 +03:00
vha = fcport - > vha ;
ha = vha - > hw ;
2009-04-07 09:33:40 +04:00
req = vha - > req ;
2009-08-05 20:18:40 +04:00
if ( ha - > flags . cpu_affinity_enabled )
2009-04-07 09:33:41 +04:00
rsp = ha - > rsp_q_map [ tag + 1 ] ;
else
rsp = req - > rsp ;
2008-11-06 21:40:19 +03:00
tsk = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & tsk_dma ) ;
2005-07-06 21:30:57 +04:00
if ( tsk = = NULL ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Task Management "
2008-11-06 21:40:19 +03:00
" IOCB. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( tsk , 0 , sizeof ( struct tsk_mgmt_cmd ) ) ;
tsk - > p . tsk . entry_type = TSK_MGMT_IOCB_TYPE ;
tsk - > p . tsk . entry_count = 1 ;
2009-04-07 09:33:40 +04:00
tsk - > p . tsk . handle = MAKE_HANDLE ( req - > id , tsk - > p . tsk . handle ) ;
2005-07-06 21:30:57 +04:00
tsk - > p . tsk . nport_handle = cpu_to_le16 ( fcport - > loop_id ) ;
2008-02-29 01:06:11 +03:00
tsk - > p . tsk . timeout = cpu_to_le16 ( ha - > r_a_tov / 10 * 2 ) ;
2008-04-04 00:13:24 +04:00
tsk - > p . tsk . control_flags = cpu_to_le32 ( type ) ;
2005-07-06 21:30:57 +04:00
tsk - > p . tsk . port_id [ 0 ] = fcport - > d_id . b . al_pa ;
tsk - > p . tsk . port_id [ 1 ] = fcport - > d_id . b . area ;
tsk - > p . tsk . port_id [ 2 ] = fcport - > d_id . b . domain ;
2007-07-06 00:16:51 +04:00
tsk - > p . tsk . vp_index = fcport - > vp_idx ;
2008-04-04 00:13:24 +04:00
if ( type = = TCF_LUN_RESET ) {
int_to_scsilun ( l , & tsk - > p . tsk . lun ) ;
host_to_fcp_swap ( ( uint8_t * ) & tsk - > p . tsk . lun ,
sizeof ( tsk - > p . tsk . lun ) ) ;
}
2007-07-06 00:16:51 +04:00
2009-10-14 02:16:50 +04:00
sts = & tsk - > p . sts ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb ( vha , tsk , tsk_dma , 0 ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
2008-04-04 00:13:24 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue %s Reset IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , name , rval ) ) ;
2009-10-14 02:16:50 +04:00
} else if ( sts - > entry_status ! = 0 ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , vha - > host_no ,
2009-10-14 02:16:50 +04:00
sts - > entry_status ) ) ;
2005-07-06 21:30:57 +04:00
rval = QLA_FUNCTION_FAILED ;
2009-10-14 02:16:50 +04:00
} else if ( sts - > comp_status ! =
2005-07-06 21:30:57 +04:00
__constant_cpu_to_le16 ( CS_COMPLETE ) ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
" -- completion status (%x). \n " , __func__ ,
2009-10-14 02:16:50 +04:00
vha - > host_no , le16_to_cpu ( sts - > comp_status ) ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( ! ( le16_to_cpu ( sts - > scsi_status ) &
SS_RESPONSE_INFO_LEN_VALID ) ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
" -- no response info (%x). \n " , __func__ , vha - > host_no ,
le16_to_cpu ( sts - > scsi_status ) ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( le32_to_cpu ( sts - > rsp_data_len ) < 4 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
" -- not enough response info (%d). \n " , __func__ ,
vha - > host_no , le32_to_cpu ( sts - > rsp_data_len ) ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( sts - > data [ 3 ] ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
" -- response (%x). \n " , __func__ ,
vha - > host_no , sts - > data [ 3 ] ) ) ;
2005-07-06 21:30:57 +04:00
rval = QLA_FUNCTION_FAILED ;
}
/* Issue marker IOCB. */
2008-12-10 03:45:39 +03:00
rval2 = qla2x00_marker ( vha , req , rsp , fcport - > loop_id , l ,
2008-04-04 00:13:24 +04:00
type = = TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID ) ;
if ( rval2 ! = QLA_SUCCESS ) {
2005-07-06 21:30:57 +04:00
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue Marker IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , vha - > host_no , rval2 ) ) ;
2005-07-06 21:30:57 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
2008-11-06 21:40:19 +03:00
dma_pool_free ( ha - > s_dma_pool , tsk , tsk_dma ) ;
2005-07-06 21:30:57 +04:00
return rval ;
}
2008-04-04 00:13:24 +04:00
int
2009-04-07 09:33:40 +04:00
qla24xx_abort_target ( struct fc_port * fcport , unsigned int l , int tag )
2008-04-04 00:13:24 +04:00
{
2009-04-07 09:33:40 +04:00
return __qla24xx_issue_tmf ( " Target " , TCF_TARGET_RESET , fcport , l , tag ) ;
2008-04-04 00:13:24 +04:00
}
int
2009-04-07 09:33:40 +04:00
qla24xx_lun_reset ( struct fc_port * fcport , unsigned int l , int tag )
2008-04-04 00:13:24 +04:00
{
2009-04-07 09:33:40 +04:00
return __qla24xx_issue_tmf ( " Lun " , TCF_LUN_RESET , fcport , l , tag ) ;
2008-04-04 00:13:24 +04:00
}
2005-07-06 21:30:57 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_system_error ( scsi_qla_host_t * vha )
2005-07-06 21:30:57 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2005-07-06 21:30:57 +04:00
2008-05-13 09:21:13 +04:00
if ( ! IS_QLA23XX ( ha ) & & ! IS_FWI2_CAPABLE ( ha ) )
2005-07-06 21:30:57 +04:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_GEN_SYSTEM_ERROR ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = 5 ;
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2005-07-06 21:30:57 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
return rval ;
}
/**
* qla2x00_set_serdes_params ( ) -
* @ ha : HA context
*
* Returns
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_set_serdes_params ( scsi_qla_host_t * vha , uint16_t sw_em_1g ,
2005-07-06 21:30:57 +04:00
uint16_t sw_em_2g , uint16_t sw_em_4g )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
mcp - > mb [ 0 ] = MBC_SERDES_PARAMS ;
mcp - > mb [ 1 ] = BIT_0 ;
2006-03-10 01:27:29 +03:00
mcp - > mb [ 2 ] = sw_em_1g | BIT_15 ;
mcp - > mb [ 3 ] = sw_em_2g | BIT_15 ;
mcp - > mb [ 4 ] = sw_em_4g | BIT_15 ;
2005-07-06 21:30:57 +04:00
mcp - > out_mb = MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2005-07-06 21:30:57 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-07-06 21:30:57 +04:00
if ( rval ! = QLA_SUCCESS ) {
/*EMPTY*/
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x). \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2005-07-06 21:30:57 +04:00
} else {
/*EMPTY*/
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-07-06 21:30:57 +04:00
}
return rval ;
}
2005-08-27 06:10:20 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_stop_firmware ( scsi_qla_host_t * vha )
2005-08-27 06:10:20 +04:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
2005-08-27 06:10:20 +04:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2005-08-27 06:10:20 +04:00
mcp - > mb [ 0 ] = MBC_STOP_FIRMWARE ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = 5 ;
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2005-08-27 06:10:20 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2009-04-07 09:33:48 +04:00
if ( mcp - > mb [ 0 ] = = MBS_INVALID_COMMAND )
rval = QLA_INVALID_COMMAND ;
2005-08-27 06:10:20 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2005-08-27 06:10:20 +04:00
}
return rval ;
}
2006-06-24 03:10:29 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_enable_eft_trace ( scsi_qla_host_t * vha , dma_addr_t eft_dma ,
2006-06-24 03:10:29 +04:00
uint16_t buffers )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
2006-06-24 03:10:29 +04:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2006-06-24 03:10:29 +04:00
mcp - > mb [ 0 ] = MBC_TRACE_CONTROL ;
2008-01-17 20:02:16 +03:00
mcp - > mb [ 1 ] = TC_EFT_ENABLE ;
mcp - > mb [ 2 ] = LSW ( eft_dma ) ;
mcp - > mb [ 3 ] = MSW ( eft_dma ) ;
mcp - > mb [ 4 ] = LSW ( MSD ( eft_dma ) ) ;
mcp - > mb [ 5 ] = MSW ( MSD ( eft_dma ) ) ;
mcp - > mb [ 6 ] = buffers ;
mcp - > mb [ 7 ] = TC_AEN_DISABLE ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2006-06-24 03:10:29 +04:00
mcp - > in_mb = MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2006-06-24 03:10:29 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-01-17 20:02:16 +03:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2008-01-17 20:02:16 +03:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:16 +03:00
}
return rval ;
}
2006-06-24 03:10:29 +04:00
2008-01-17 20:02:16 +03:00
int
2008-11-06 21:40:19 +03:00
qla2x00_disable_eft_trace ( scsi_qla_host_t * vha )
2008-01-17 20:02:16 +03:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
2008-01-17 20:02:16 +03:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:16 +03:00
mcp - > mb [ 0 ] = MBC_TRACE_CONTROL ;
mcp - > mb [ 1 ] = TC_EFT_DISABLE ;
mcp - > out_mb = MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-01-17 20:02:16 +03:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2006-06-24 03:10:29 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2006-06-24 03:10:29 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2006-06-24 03:10:29 +04:00
}
return rval ;
}
2008-01-17 20:02:17 +03:00
int
2008-11-06 21:40:19 +03:00
qla2x00_enable_fce_trace ( scsi_qla_host_t * vha , dma_addr_t fce_dma ,
2008-01-17 20:02:17 +03:00
uint16_t buffers , uint16_t * mb , uint32_t * dwords )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2009-01-05 22:18:11 +03:00
if ( ! IS_QLA25XX ( vha - > hw ) & & ! IS_QLA81XX ( vha - > hw ) )
2008-01-17 20:02:17 +03:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:17 +03:00
mcp - > mb [ 0 ] = MBC_TRACE_CONTROL ;
mcp - > mb [ 1 ] = TC_FCE_ENABLE ;
mcp - > mb [ 2 ] = LSW ( fce_dma ) ;
mcp - > mb [ 3 ] = MSW ( fce_dma ) ;
mcp - > mb [ 4 ] = LSW ( MSD ( fce_dma ) ) ;
mcp - > mb [ 5 ] = MSW ( MSD ( fce_dma ) ) ;
mcp - > mb [ 6 ] = buffers ;
mcp - > mb [ 7 ] = TC_AEN_DISABLE ;
mcp - > mb [ 8 ] = 0 ;
mcp - > mb [ 9 ] = TC_FCE_DEFAULT_RX_SIZE ;
mcp - > mb [ 10 ] = TC_FCE_DEFAULT_TX_SIZE ;
mcp - > out_mb = MBX_10 | MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 |
MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-01-17 20:02:17 +03:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-01-17 20:02:17 +03:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2008-01-17 20:02:17 +03:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:17 +03:00
if ( mb )
memcpy ( mb , mcp - > mb , 8 * sizeof ( * mb ) ) ;
if ( dwords )
2008-05-13 09:21:12 +04:00
* dwords = buffers ;
2008-01-17 20:02:17 +03:00
}
return rval ;
}
int
2008-11-06 21:40:19 +03:00
qla2x00_disable_fce_trace ( scsi_qla_host_t * vha , uint64_t * wr , uint64_t * rd )
2008-01-17 20:02:17 +03:00
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
2008-01-17 20:02:17 +03:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:17 +03:00
mcp - > mb [ 0 ] = MBC_TRACE_CONTROL ;
mcp - > mb [ 1 ] = TC_FCE_DISABLE ;
mcp - > mb [ 2 ] = TC_FCE_DISABLE_TRACE ;
mcp - > out_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 |
MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2008-01-17 20:02:17 +03:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-01-17 20:02:17 +03:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
2008-01-17 20:02:17 +03:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2008-01-17 20:02:17 +03:00
if ( wr )
* wr = ( uint64_t ) mcp - > mb [ 5 ] < < 48 |
( uint64_t ) mcp - > mb [ 4 ] < < 32 |
( uint64_t ) mcp - > mb [ 3 ] < < 16 |
( uint64_t ) mcp - > mb [ 2 ] ;
if ( rd )
* rd = ( uint64_t ) mcp - > mb [ 9 ] < < 48 |
( uint64_t ) mcp - > mb [ 8 ] < < 32 |
( uint64_t ) mcp - > mb [ 7 ] < < 16 |
( uint64_t ) mcp - > mb [ 6 ] ;
}
return rval ;
}
2006-06-24 03:10:50 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_read_sfp ( scsi_qla_host_t * vha , dma_addr_t sfp_dma , uint16_t addr ,
2006-06-24 03:10:50 +04:00
uint16_t off , uint16_t count )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2006-06-24 03:10:29 +04:00
2008-11-06 21:40:19 +03:00
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
2006-06-24 03:10:50 +04:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2006-06-24 03:10:50 +04:00
mcp - > mb [ 0 ] = MBC_READ_SFP ;
mcp - > mb [ 1 ] = addr ;
mcp - > mb [ 2 ] = MSW ( sfp_dma ) ;
mcp - > mb [ 3 ] = LSW ( sfp_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 8 ] = count ;
mcp - > mb [ 9 ] = off ;
mcp - > mb [ 10 ] = 0 ;
mcp - > out_mb = MBX_10 | MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2006-06-24 03:10:50 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2006-06-24 03:10:50 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x). \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2006-06-24 03:10:50 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2006-06-24 03:10:50 +04:00
}
return rval ;
}
2006-10-02 23:00:43 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_set_idma_speed ( scsi_qla_host_t * vha , uint16_t loop_id ,
2006-10-02 23:00:43 +04:00
uint16_t port_speed , uint16_t * mb )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
if ( ! IS_IIDMA_CAPABLE ( vha - > hw ) )
2006-10-02 23:00:43 +04:00
return QLA_FUNCTION_FAILED ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2006-10-02 23:00:43 +04:00
mcp - > mb [ 0 ] = MBC_PORT_PARAMS ;
mcp - > mb [ 1 ] = loop_id ;
mcp - > mb [ 2 ] = BIT_0 ;
2009-06-17 21:30:29 +04:00
if ( IS_QLA81XX ( vha - > hw ) )
mcp - > mb [ 3 ] = port_speed & ( BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 ) ;
else
mcp - > mb [ 3 ] = port_speed & ( BIT_2 | BIT_1 | BIT_0 ) ;
mcp - > mb [ 9 ] = vha - > vp_idx ;
mcp - > out_mb = MBX_9 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_3 | MBX_1 | MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2006-10-02 23:00:43 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2006-10-02 23:00:43 +04:00
/* Return mailbox statuses. */
if ( mb ! = NULL ) {
mb [ 0 ] = mcp - > mb [ 0 ] ;
mb [ 1 ] = mcp - > mb [ 1 ] ;
mb [ 3 ] = mcp - > mb [ 3 ] ;
}
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2006-10-02 23:00:43 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2006-10-02 23:00:43 +04:00
}
return rval ;
}
2007-07-06 00:16:51 +04:00
void
2008-11-06 21:40:19 +03:00
qla24xx_report_id_acquisition ( scsi_qla_host_t * vha ,
2007-07-06 00:16:51 +04:00
struct vp_rpt_id_entry_24xx * rptid_entry )
{
uint8_t vp_idx ;
2008-04-25 02:21:29 +04:00
uint16_t stat = le16_to_cpu ( rptid_entry - > vp_idx ) ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
scsi_qla_host_t * vp ;
2009-03-05 22:07:02 +03:00
scsi_qla_host_t * tvp ;
2007-07-06 00:16:51 +04:00
if ( rptid_entry - > entry_status ! = 0 )
return ;
if ( rptid_entry - > format = = 0 ) {
DEBUG15 ( printk ( " %s:format 0 : scsi(%ld) number of VPs setup %d, "
2008-11-06 21:40:19 +03:00
" number of VPs acquired %d \n " , __func__ , vha - > host_no ,
2009-08-05 10:38:21 +04:00
MSB ( le16_to_cpu ( rptid_entry - > vp_count ) ) ,
LSB ( le16_to_cpu ( rptid_entry - > vp_count ) ) ) ) ;
2007-07-06 00:16:51 +04:00
DEBUG15 ( printk ( " %s primary port id %02x%02x%02x \n " , __func__ ,
rptid_entry - > port_id [ 2 ] , rptid_entry - > port_id [ 1 ] ,
rptid_entry - > port_id [ 0 ] ) ) ;
} else if ( rptid_entry - > format = = 1 ) {
2008-04-25 02:21:29 +04:00
vp_idx = LSB ( stat ) ;
2007-07-06 00:16:51 +04:00
DEBUG15 ( printk ( " %s:format 1: scsi(%ld): VP[%d] enabled "
" - status %d - "
2008-11-06 21:40:19 +03:00
" with port id %02x%02x%02x \n " , __func__ , vha - > host_no ,
2008-04-25 02:21:29 +04:00
vp_idx , MSB ( stat ) ,
2007-07-06 00:16:51 +04:00
rptid_entry - > port_id [ 2 ] , rptid_entry - > port_id [ 1 ] ,
rptid_entry - > port_id [ 0 ] ) ) ;
2009-10-14 02:16:51 +04:00
vp = vha ;
if ( vp_idx = = 0 & & ( MSB ( stat ) ! = 1 ) )
goto reg_needed ;
2007-07-06 00:16:51 +04:00
2009-06-03 20:55:23 +04:00
if ( MSB ( stat ) = = 1 ) {
DEBUG2 ( printk ( " scsi(%ld): Could not acquire ID for "
" VP[%d]. \n " , vha - > host_no , vp_idx ) ) ;
2007-07-06 00:16:51 +04:00
return ;
2009-06-03 20:55:23 +04:00
}
2007-07-06 00:16:51 +04:00
2009-03-05 22:07:02 +03:00
list_for_each_entry_safe ( vp , tvp , & ha - > vp_list , list )
2008-11-06 21:40:19 +03:00
if ( vp_idx = = vp - > vp_idx )
2007-07-06 00:16:51 +04:00
break ;
2008-11-06 21:40:19 +03:00
if ( ! vp )
2007-07-06 00:16:51 +04:00
return ;
2008-11-06 21:40:19 +03:00
vp - > d_id . b . domain = rptid_entry - > port_id [ 2 ] ;
vp - > d_id . b . area = rptid_entry - > port_id [ 1 ] ;
vp - > d_id . b . al_pa = rptid_entry - > port_id [ 0 ] ;
2007-07-06 00:16:51 +04:00
/*
* Cannot configure here as we are still sitting on the
* response queue . Handle it in dpc context .
*/
2008-11-06 21:40:19 +03:00
set_bit ( VP_IDX_ACQUIRED , & vp - > vp_flags ) ;
2007-07-06 00:16:51 +04:00
2009-10-14 02:16:51 +04:00
reg_needed :
set_bit ( REGISTER_FC4_NEEDED , & vp - > dpc_flags ) ;
set_bit ( REGISTER_FDMI_NEEDED , & vp - > dpc_flags ) ;
set_bit ( VP_DPC_NEEDED , & vha - > dpc_flags ) ;
2008-11-06 21:40:19 +03:00
qla2xxx_wake_dpc ( vha ) ;
2007-07-06 00:16:51 +04:00
}
}
/*
* qla24xx_modify_vp_config
* Change VP configuration for vha
*
* Input :
* vha = adapter block pointer .
*
* Returns :
* qla2xxx local function return status code .
*
* Context :
* Kernel context .
*/
int
qla24xx_modify_vp_config ( scsi_qla_host_t * vha )
{
int rval ;
struct vp_config_entry_24xx * vpmod ;
dma_addr_t vpmod_dma ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
struct scsi_qla_host * base_vha = pci_get_drvdata ( ha - > pdev ) ;
2007-07-06 00:16:51 +04:00
/* This can be called by the parent */
2008-11-06 21:40:19 +03:00
vpmod = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & vpmod_dma ) ;
2007-07-06 00:16:51 +04:00
if ( ! vpmod ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Modify VP "
2008-11-06 21:40:19 +03:00
" IOCB. \n " , __func__ , vha - > host_no ) ) ;
2007-07-06 00:16:51 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( vpmod , 0 , sizeof ( struct vp_config_entry_24xx ) ) ;
vpmod - > entry_type = VP_CONFIG_IOCB_TYPE ;
vpmod - > entry_count = 1 ;
vpmod - > command = VCT_COMMAND_MOD_ENABLE_VPS ;
vpmod - > vp_count = 1 ;
vpmod - > vp_index1 = vha - > vp_idx ;
vpmod - > options_idx1 = BIT_3 | BIT_4 | BIT_5 ;
memcpy ( vpmod - > node_name_idx1 , vha - > node_name , WWN_SIZE ) ;
memcpy ( vpmod - > port_name_idx1 , vha - > port_name , WWN_SIZE ) ;
vpmod - > entry_count = 1 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb ( base_vha , vpmod , vpmod_dma , 0 ) ;
2007-07-06 00:16:51 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue VP config IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , base_vha - > host_no , rval ) ) ;
2007-07-06 00:16:51 +04:00
} else if ( vpmod - > comp_status ! = 0 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
vpmod - > comp_status ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( vpmod - > comp_status ! = __constant_cpu_to_le16 ( CS_COMPLETE ) ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- completion status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
le16_to_cpu ( vpmod - > comp_status ) ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else {
/* EMPTY */
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ ,
base_vha - > host_no ) ) ;
2007-07-06 00:16:51 +04:00
fc_vport_set_state ( vha - > fc_vport , FC_VPORT_INITIALIZING ) ;
}
2008-11-06 21:40:19 +03:00
dma_pool_free ( ha - > s_dma_pool , vpmod , vpmod_dma ) ;
2007-07-06 00:16:51 +04:00
return rval ;
}
/*
* qla24xx_control_vp
* Enable a virtual port for given host
*
* Input :
* ha = adapter block pointer .
* vhba = virtual adapter ( unused )
* index = index number for enabled VP
*
* Returns :
* qla2xxx local function return status code .
*
* Context :
* Kernel context .
*/
int
qla24xx_control_vp ( scsi_qla_host_t * vha , int cmd )
{
int rval ;
int map , pos ;
struct vp_ctrl_entry_24xx * vce ;
dma_addr_t vce_dma ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2007-07-06 00:16:51 +04:00
int vp_index = vha - > vp_idx ;
2008-11-06 21:40:19 +03:00
struct scsi_qla_host * base_vha = pci_get_drvdata ( ha - > pdev ) ;
2007-07-06 00:16:51 +04:00
DEBUG11 ( printk ( " %s(%ld): entered. Enabling index %d \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , vp_index ) ) ;
2007-07-06 00:16:51 +04:00
2007-11-12 21:30:58 +03:00
if ( vp_index = = 0 | | vp_index > = ha - > max_npiv_vports )
2007-07-06 00:16:51 +04:00
return QLA_PARAMETER_ERROR ;
vce = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & vce_dma ) ;
if ( ! vce ) {
DEBUG2_3 ( printk ( " %s(%ld): "
" failed to allocate VP Control IOCB. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
base_vha - > host_no ) ) ;
2007-07-06 00:16:51 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
memset ( vce , 0 , sizeof ( struct vp_ctrl_entry_24xx ) ) ;
vce - > entry_type = VP_CTRL_IOCB_TYPE ;
vce - > entry_count = 1 ;
vce - > command = cpu_to_le16 ( cmd ) ;
vce - > vp_count = __constant_cpu_to_le16 ( 1 ) ;
/* index map in firmware starts with 1; decrement index
* this is ok as we never use index 0
*/
map = ( vp_index - 1 ) / 8 ;
pos = ( vp_index - 1 ) & 7 ;
2008-05-13 09:21:11 +04:00
mutex_lock ( & ha - > vport_lock ) ;
2007-07-06 00:16:51 +04:00
vce - > vp_idx_map [ map ] | = 1 < < pos ;
2008-05-13 09:21:11 +04:00
mutex_unlock ( & ha - > vport_lock ) ;
2007-07-06 00:16:51 +04:00
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb ( base_vha , vce , vce_dma , 0 ) ;
2007-07-06 00:16:51 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to issue VP control IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , base_vha - > host_no , rval ) ) ;
2007-07-06 00:16:51 +04:00
printk ( " %s(%ld): failed to issue VP control IOCB "
2008-11-06 21:40:19 +03:00
" (%x). \n " , __func__ , base_vha - > host_no , rval ) ;
2007-07-06 00:16:51 +04:00
} else if ( vce - > entry_status ! = 0 ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
vce - > entry_status ) ) ;
printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- error status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
vce - > entry_status ) ;
rval = QLA_FUNCTION_FAILED ;
} else if ( vce - > comp_status ! = __constant_cpu_to_le16 ( CS_COMPLETE ) ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- completion status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
le16_to_cpu ( vce - > comp_status ) ) ) ;
printk ( " %s(%ld): failed to complete IOCB "
2008-11-06 21:40:19 +03:00
" -- completion status (%x). \n " , __func__ , base_vha - > host_no ,
2007-07-06 00:16:51 +04:00
le16_to_cpu ( vce - > comp_status ) ) ;
rval = QLA_FUNCTION_FAILED ;
} else {
2008-11-06 21:40:19 +03:00
DEBUG2 ( printk ( " %s(%ld): done. \n " , __func__ , base_vha - > host_no ) ) ;
2007-07-06 00:16:51 +04:00
}
dma_pool_free ( ha - > s_dma_pool , vce , vce_dma ) ;
return rval ;
}
/*
* qla2x00_send_change_request
* Receive or disable RSCN request from fabric controller
*
* Input :
* ha = adapter block pointer
* format = registration format :
* 0 - Reserved
* 1 - Fabric detected registration
* 2 - N_port detected registration
* 3 - Full registration
* FF - clear registration
* vp_idx = Virtual port index
*
* Returns :
* qla2x00 local function return status code .
*
* Context :
* Kernel Context
*/
int
2008-11-06 21:40:19 +03:00
qla2x00_send_change_request ( scsi_qla_host_t * vha , uint16_t format ,
2007-07-06 00:16:51 +04:00
uint16_t vp_idx )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
/*
* This command is implicitly executed by firmware during login for the
* physical hosts
*/
if ( vp_idx = = 0 )
return QLA_FUNCTION_FAILED ;
mcp - > mb [ 0 ] = MBC_SEND_CHANGE_REQUEST ;
mcp - > mb [ 1 ] = format ;
mcp - > mb [ 9 ] = vp_idx ;
mcp - > out_mb = MBX_9 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 | MBX_1 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2007-07-06 00:16:51 +04:00
if ( rval = = QLA_SUCCESS ) {
if ( mcp - > mb [ 0 ] ! = MBS_COMMAND_COMPLETE ) {
rval = BIT_1 ;
}
} else
rval = BIT_1 ;
return rval ;
}
2007-09-21 01:07:33 +04:00
int
2008-11-06 21:40:19 +03:00
qla2x00_dump_ram ( scsi_qla_host_t * vha , dma_addr_t req_dma , uint32_t addr ,
2007-09-21 01:07:33 +04:00
uint32_t size )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2007-09-21 01:07:33 +04:00
2008-11-06 21:40:19 +03:00
if ( MSW ( addr ) | | IS_FWI2_CAPABLE ( vha - > hw ) ) {
2007-09-21 01:07:33 +04:00
mcp - > mb [ 0 ] = MBC_DUMP_RISC_RAM_EXTENDED ;
mcp - > mb [ 8 ] = MSW ( addr ) ;
mcp - > out_mb = MBX_8 | MBX_0 ;
} else {
mcp - > mb [ 0 ] = MBC_DUMP_RISC_RAM ;
mcp - > out_mb = MBX_0 ;
}
mcp - > mb [ 1 ] = LSW ( addr ) ;
mcp - > mb [ 2 ] = MSW ( req_dma ) ;
mcp - > mb [ 3 ] = LSW ( req_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( req_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( req_dma ) ) ;
mcp - > out_mb | = MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 ;
2008-11-06 21:40:19 +03:00
if ( IS_FWI2_CAPABLE ( vha - > hw ) ) {
2007-09-21 01:07:33 +04:00
mcp - > mb [ 4 ] = MSW ( size ) ;
mcp - > mb [ 5 ] = LSW ( size ) ;
mcp - > out_mb | = MBX_5 | MBX_4 ;
} else {
mcp - > mb [ 4 ] = LSW ( size ) ;
mcp - > out_mb | = MBX_4 ;
}
mcp - > in_mb = MBX_0 ;
2008-04-04 00:13:25 +04:00
mcp - > tov = MBX_TOV_SECONDS ;
2007-09-21 01:07:33 +04:00
mcp - > flags = 0 ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2007-09-21 01:07:33 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
2007-09-21 01:07:33 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2007-09-21 01:07:33 +04:00
}
return rval ;
}
2008-04-04 00:13:26 +04:00
/* 84XX Support **************************************************************/
struct cs84xx_mgmt_cmd {
union {
struct verify_chip_entry_84xx req ;
struct verify_chip_rsp_84xx rsp ;
} p ;
} ;
int
2008-11-06 21:40:19 +03:00
qla84xx_verify_chip ( struct scsi_qla_host * vha , uint16_t * status )
2008-04-04 00:13:26 +04:00
{
int rval , retry ;
struct cs84xx_mgmt_cmd * mn ;
dma_addr_t mn_dma ;
uint16_t options ;
unsigned long flags ;
2008-11-06 21:40:19 +03:00
struct qla_hw_data * ha = vha - > hw ;
2008-04-04 00:13:26 +04:00
2008-11-06 21:40:19 +03:00
DEBUG16 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
mn = dma_pool_alloc ( ha - > s_dma_pool , GFP_KERNEL , & mn_dma ) ;
if ( mn = = NULL ) {
DEBUG2_3 ( printk ( " %s(%ld): failed to allocate Verify ISP84XX "
2008-11-06 21:40:19 +03:00
" IOCB. \n " , __func__ , vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
return QLA_MEMORY_ALLOC_FAILED ;
}
/* Force Update? */
options = ha - > cs84xx - > fw_update ? VCO_FORCE_UPDATE : 0 ;
/* Diagnostic firmware? */
/* options |= MENLO_DIAG_FW; */
/* We update the firmware with only one data sequence. */
options | = VCO_END_OF_DATA ;
do {
2008-04-25 02:21:24 +04:00
retry = 0 ;
2008-04-04 00:13:26 +04:00
memset ( mn , 0 , sizeof ( * mn ) ) ;
mn - > p . req . entry_type = VERIFY_CHIP_IOCB_TYPE ;
mn - > p . req . entry_count = 1 ;
mn - > p . req . options = cpu_to_le16 ( options ) ;
DEBUG16 ( printk ( " %s(%ld): Dump of Verify Request. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
DEBUG16 ( qla2x00_dump_buffer ( ( uint8_t * ) mn ,
sizeof ( * mn ) ) ) ;
2008-11-06 21:40:19 +03:00
rval = qla2x00_issue_iocb_timeout ( vha , mn , mn_dma , 0 , 120 ) ;
2008-04-04 00:13:26 +04:00
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_16 ( printk ( " %s(%ld): failed to issue Verify "
2008-11-06 21:40:19 +03:00
" IOCB (%x). \n " , __func__ , vha - > host_no , rval ) ) ;
2008-04-04 00:13:26 +04:00
goto verify_done ;
}
DEBUG16 ( printk ( " %s(%ld): Dump of Verify Response. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
DEBUG16 ( qla2x00_dump_buffer ( ( uint8_t * ) mn ,
sizeof ( * mn ) ) ) ;
status [ 0 ] = le16_to_cpu ( mn - > p . rsp . comp_status ) ;
status [ 1 ] = status [ 0 ] = = CS_VCS_CHIP_FAILURE ?
le16_to_cpu ( mn - > p . rsp . failure_code ) : 0 ;
DEBUG2_16 ( printk ( " %s(%ld): cs=%x fc=%x \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , status [ 0 ] , status [ 1 ] ) ) ;
2008-04-04 00:13:26 +04:00
if ( status [ 0 ] ! = CS_COMPLETE ) {
rval = QLA_FUNCTION_FAILED ;
if ( ! ( options & VCO_DONT_UPDATE_FW ) ) {
DEBUG2_16 ( printk ( " %s(%ld): Firmware update "
" failed. Retrying without update "
2008-11-06 21:40:19 +03:00
" firmware. \n " , __func__ , vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
options | = VCO_DONT_UPDATE_FW ;
options & = ~ VCO_FORCE_UPDATE ;
retry = 1 ;
}
} else {
DEBUG2_16 ( printk ( " %s(%ld): firmware updated to %x. \n " ,
2008-11-06 21:40:19 +03:00
__func__ , vha - > host_no ,
2008-04-04 00:13:26 +04:00
le32_to_cpu ( mn - > p . rsp . fw_ver ) ) ) ;
/* NOTE: we only update OP firmware. */
spin_lock_irqsave ( & ha - > cs84xx - > access_lock , flags ) ;
ha - > cs84xx - > op_fw_version =
le32_to_cpu ( mn - > p . rsp . fw_ver ) ;
spin_unlock_irqrestore ( & ha - > cs84xx - > access_lock ,
flags ) ;
}
} while ( retry ) ;
verify_done :
dma_pool_free ( ha - > s_dma_pool , mn , mn_dma ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_16 ( printk ( " %s(%ld): failed=%x. \n " , __func__ ,
2008-11-06 21:40:19 +03:00
vha - > host_no , rval ) ) ;
2008-04-04 00:13:26 +04:00
} else {
2008-11-06 21:40:19 +03:00
DEBUG16 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2008-04-04 00:13:26 +04:00
}
return rval ;
}
2008-12-10 03:45:39 +03:00
int
2009-02-09 07:50:11 +03:00
qla25xx_init_req_que ( struct scsi_qla_host * vha , struct req_que * req )
2008-12-10 03:45:39 +03:00
{
int rval ;
unsigned long flags ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
struct device_reg_25xxmq __iomem * reg ;
struct qla_hw_data * ha = vha - > hw ;
mcp - > mb [ 0 ] = MBC_INITIALIZE_MULTIQ ;
2009-02-09 07:50:11 +03:00
mcp - > mb [ 1 ] = req - > options ;
2008-12-10 03:45:39 +03:00
mcp - > mb [ 2 ] = MSW ( LSD ( req - > dma ) ) ;
mcp - > mb [ 3 ] = LSW ( LSD ( req - > dma ) ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( req - > dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( req - > dma ) ) ;
mcp - > mb [ 5 ] = req - > length ;
if ( req - > rsp )
mcp - > mb [ 10 ] = req - > rsp - > id ;
mcp - > mb [ 12 ] = req - > qos ;
mcp - > mb [ 11 ] = req - > vp_idx ;
mcp - > mb [ 13 ] = req - > rid ;
reg = ( struct device_reg_25xxmq * ) ( ( void * ) ( ha - > mqiobase ) +
QLA_QUE_PAGE * req - > id ) ;
mcp - > mb [ 4 ] = req - > id ;
/* que in ptr index */
mcp - > mb [ 8 ] = 0 ;
/* que out ptr index */
mcp - > mb [ 9 ] = 0 ;
mcp - > out_mb = MBX_14 | MBX_13 | MBX_12 | MBX_11 | MBX_10 | MBX_9 | MBX_8 | MBX_7 |
MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > flags = MBX_DMA_OUT ;
mcp - > tov = 60 ;
spin_lock_irqsave ( & ha - > hardware_lock , flags ) ;
2009-02-09 07:50:11 +03:00
if ( ! ( req - > options & BIT_0 ) ) {
2008-12-10 03:45:39 +03:00
WRT_REG_DWORD ( & reg - > req_q_in , 0 ) ;
WRT_REG_DWORD ( & reg - > req_q_out , 0 ) ;
}
2009-04-07 09:33:40 +04:00
req - > req_q_in = & reg - > req_q_in ;
req - > req_q_out = & reg - > req_q_out ;
2008-12-10 03:45:39 +03:00
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
2008-12-18 21:06:15 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-12-10 03:45:39 +03:00
if ( rval ! = QLA_SUCCESS )
DEBUG2_3_11 ( printk ( KERN_WARNING " %s(%ld): failed=%x mb0=%x. \n " ,
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
return rval ;
}
int
2009-02-09 07:50:11 +03:00
qla25xx_init_rsp_que ( struct scsi_qla_host * vha , struct rsp_que * rsp )
2008-12-10 03:45:39 +03:00
{
int rval ;
unsigned long flags ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
struct device_reg_25xxmq __iomem * reg ;
struct qla_hw_data * ha = vha - > hw ;
mcp - > mb [ 0 ] = MBC_INITIALIZE_MULTIQ ;
2009-02-09 07:50:11 +03:00
mcp - > mb [ 1 ] = rsp - > options ;
2008-12-10 03:45:39 +03:00
mcp - > mb [ 2 ] = MSW ( LSD ( rsp - > dma ) ) ;
mcp - > mb [ 3 ] = LSW ( LSD ( rsp - > dma ) ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( rsp - > dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( rsp - > dma ) ) ;
mcp - > mb [ 5 ] = rsp - > length ;
2009-01-05 22:18:10 +03:00
mcp - > mb [ 14 ] = rsp - > msix - > entry ;
2008-12-10 03:45:39 +03:00
mcp - > mb [ 13 ] = rsp - > rid ;
reg = ( struct device_reg_25xxmq * ) ( ( void * ) ( ha - > mqiobase ) +
QLA_QUE_PAGE * rsp - > id ) ;
mcp - > mb [ 4 ] = rsp - > id ;
/* que in ptr index */
mcp - > mb [ 8 ] = 0 ;
/* que out ptr index */
mcp - > mb [ 9 ] = 0 ;
2009-04-07 09:33:40 +04:00
mcp - > out_mb = MBX_14 | MBX_13 | MBX_9 | MBX_8 | MBX_7
2008-12-10 03:45:39 +03:00
| MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > flags = MBX_DMA_OUT ;
mcp - > tov = 60 ;
spin_lock_irqsave ( & ha - > hardware_lock , flags ) ;
2009-02-09 07:50:11 +03:00
if ( ! ( rsp - > options & BIT_0 ) ) {
2008-12-10 03:45:39 +03:00
WRT_REG_DWORD ( & reg - > rsp_q_out , 0 ) ;
WRT_REG_DWORD ( & reg - > rsp_q_in , 0 ) ;
}
spin_unlock_irqrestore ( & ha - > hardware_lock , flags ) ;
2008-12-18 21:06:15 +03:00
rval = qla2x00_mailbox_command ( vha , mcp ) ;
2008-12-10 03:45:39 +03:00
if ( rval ! = QLA_SUCCESS )
DEBUG2_3_11 ( printk ( KERN_WARNING " %s(%ld): failed=%x "
" mb0=%x. \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
return rval ;
}
2009-02-09 07:50:12 +03:00
int
qla81xx_idc_ack ( scsi_qla_host_t * vha , uint16_t * mb )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_IDC_ACK ;
memcpy ( & mcp - > mb [ 1 ] , mb , QLA_IDC_ACK_REGS * sizeof ( uint16_t ) ) ;
mcp - > out_mb = MBX_7 | MBX_6 | MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x). \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-03-24 19:08:06 +03:00
int
qla81xx_fac_get_sector_size ( scsi_qla_host_t * vha , uint32_t * sector_size )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_QLA81XX ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_FLASH_ACCESS_CTRL ;
mcp - > mb [ 1 ] = FAC_OPT_CMD_GET_SECTOR_SIZE ;
mcp - > out_mb = MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
* sector_size = mcp - > mb [ 1 ] ;
}
return rval ;
}
int
qla81xx_fac_do_write_enable ( scsi_qla_host_t * vha , int enable )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_QLA81XX ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_FLASH_ACCESS_CTRL ;
mcp - > mb [ 1 ] = enable ? FAC_OPT_CMD_WRITE_ENABLE :
FAC_OPT_CMD_WRITE_PROTECT ;
mcp - > out_mb = MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x. \n " ,
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
int
qla81xx_fac_erase_sector ( scsi_qla_host_t * vha , uint32_t start , uint32_t finish )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_QLA81XX ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_FLASH_ACCESS_CTRL ;
mcp - > mb [ 1 ] = FAC_OPT_CMD_ERASE_SECTOR ;
mcp - > mb [ 2 ] = LSW ( start ) ;
mcp - > mb [ 3 ] = MSW ( start ) ;
mcp - > mb [ 4 ] = LSW ( finish ) ;
mcp - > mb [ 5 ] = MSW ( finish ) ;
mcp - > out_mb = MBX_5 | MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x mb[1]=%x "
" mb[2]=%x. \n " , __func__ , vha - > host_no , rval , mcp - > mb [ 0 ] ,
mcp - > mb [ 1 ] , mcp - > mb [ 2 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-03-26 18:49:17 +03:00
int
qla81xx_restart_mpi_firmware ( scsi_qla_host_t * vha )
{
int rval = 0 ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_RESTART_MPI_FW ;
mcp - > out_mb = MBX_0 ;
mcp - > in_mb = MBX_0 | MBX_1 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=0x%x mb[1]=0x%x. \n " ,
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] , mcp - > mb [ 1 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-03-24 19:08:12 +03:00
int
qla2x00_read_edc ( scsi_qla_host_t * vha , uint16_t dev , uint16_t adr ,
dma_addr_t sfp_dma , uint8_t * sfp , uint16_t len , uint16_t opt )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_READ_SFP ;
mcp - > mb [ 1 ] = dev ;
mcp - > mb [ 2 ] = MSW ( sfp_dma ) ;
mcp - > mb [ 3 ] = LSW ( sfp_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 8 ] = len ;
mcp - > mb [ 9 ] = adr ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb = MBX_10 | MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( opt & BIT_0 )
if ( sfp )
* sfp = mcp - > mb [ 8 ] ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x). \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
2009-04-07 09:33:39 +04:00
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
2009-03-24 19:08:12 +03:00
}
return rval ;
}
int
qla2x00_write_edc ( scsi_qla_host_t * vha , uint16_t dev , uint16_t adr ,
dma_addr_t sfp_dma , uint8_t * sfp , uint16_t len , uint16_t opt )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
if ( opt & BIT_0 )
if ( sfp )
len = * sfp ;
mcp - > mb [ 0 ] = MBC_WRITE_SFP ;
mcp - > mb [ 1 ] = dev ;
mcp - > mb [ 2 ] = MSW ( sfp_dma ) ;
mcp - > mb [ 3 ] = LSW ( sfp_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( sfp_dma ) ) ;
mcp - > mb [ 8 ] = len ;
mcp - > mb [ 9 ] = adr ;
mcp - > mb [ 10 ] = opt ;
mcp - > out_mb = MBX_10 | MBX_9 | MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x (%x). \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-06-03 20:55:13 +04:00
int
qla2x00_get_xgmac_stats ( scsi_qla_host_t * vha , dma_addr_t stats_dma ,
uint16_t size_in_bytes , uint16_t * actual_size )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_QLA81XX ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_GET_XGMAC_STATS ;
mcp - > mb [ 2 ] = MSW ( stats_dma ) ;
mcp - > mb [ 3 ] = LSW ( stats_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( stats_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( stats_dma ) ) ;
mcp - > mb [ 8 ] = size_in_bytes > > 2 ;
mcp - > out_mb = MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_0 ;
mcp - > in_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=0x%x "
" mb[1]=0x%x mb[2]=0x%x. \n " , __func__ , vha - > host_no , rval ,
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 2 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
* actual_size = mcp - > mb [ 2 ] < < 2 ;
}
return rval ;
}
2009-06-03 20:55:14 +04:00
int
qla2x00_get_dcbx_params ( scsi_qla_host_t * vha , dma_addr_t tlv_dma ,
uint16_t size )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_QLA81XX ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_GET_DCBX_PARAMS ;
mcp - > mb [ 1 ] = 0 ;
mcp - > mb [ 2 ] = MSW ( tlv_dma ) ;
mcp - > mb [ 3 ] = LSW ( tlv_dma ) ;
mcp - > mb [ 6 ] = MSW ( MSD ( tlv_dma ) ) ;
mcp - > mb [ 7 ] = LSW ( MSD ( tlv_dma ) ) ;
mcp - > mb [ 8 ] = size ;
mcp - > out_mb = MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=0x%x "
" mb[1]=0x%x mb[2]=0x%x. \n " , __func__ , vha - > host_no , rval ,
mcp - > mb [ 0 ] , mcp - > mb [ 1 ] , mcp - > mb [ 2 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-06-03 20:55:30 +04:00
int
qla2x00_read_ram_word ( scsi_qla_host_t * vha , uint32_t risc_addr , uint32_t * data )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_READ_RAM_EXTENDED ;
mcp - > mb [ 1 ] = LSW ( risc_addr ) ;
mcp - > mb [ 8 ] = MSW ( risc_addr ) ;
mcp - > out_mb = MBX_8 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_3 | MBX_2 | MBX_0 ;
mcp - > tov = 30 ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x. \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
* data = mcp - > mb [ 3 ] < < 16 | mcp - > mb [ 2 ] ;
}
return rval ;
}
int
qla2x00_write_ram_word ( scsi_qla_host_t * vha , uint32_t risc_addr , uint32_t data )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
if ( ! IS_FWI2_CAPABLE ( vha - > hw ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_WRITE_RAM_WORD_EXTENDED ;
mcp - > mb [ 1 ] = LSW ( risc_addr ) ;
mcp - > mb [ 2 ] = LSW ( data ) ;
mcp - > mb [ 3 ] = MSW ( data ) ;
mcp - > mb [ 8 ] = MSW ( risc_addr ) ;
mcp - > out_mb = MBX_8 | MBX_3 | MBX_2 | MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_0 ;
mcp - > tov = 30 ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( " %s(%ld): failed=%x mb[0]=%x. \n " , __func__ ,
vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
DEBUG11 ( printk ( " %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
}
return rval ;
}
2009-12-16 08:29:44 +03:00
int
qla2x00_get_data_rate ( scsi_qla_host_t * vha )
{
int rval ;
mbx_cmd_t mc ;
mbx_cmd_t * mcp = & mc ;
struct qla_hw_data * ha = vha - > hw ;
if ( ! IS_FWI2_CAPABLE ( ha ) )
return QLA_FUNCTION_FAILED ;
DEBUG11 ( printk ( KERN_INFO " %s(%ld): entered. \n " , __func__ , vha - > host_no ) ) ;
mcp - > mb [ 0 ] = MBC_DATA_RATE ;
mcp - > mb [ 1 ] = 0 ;
mcp - > out_mb = MBX_1 | MBX_0 ;
mcp - > in_mb = MBX_2 | MBX_1 | MBX_0 ;
mcp - > tov = MBX_TOV_SECONDS ;
mcp - > flags = 0 ;
rval = qla2x00_mailbox_command ( vha , mcp ) ;
if ( rval ! = QLA_SUCCESS ) {
DEBUG2_3_11 ( printk ( KERN_INFO " %s(%ld): failed=%x mb[0]=%x. \n " ,
__func__ , vha - > host_no , rval , mcp - > mb [ 0 ] ) ) ;
} else {
DEBUG11 ( printk ( KERN_INFO
" %s(%ld): done. \n " , __func__ , vha - > host_no ) ) ;
if ( mcp - > mb [ 1 ] ! = 0x7 )
ha - > link_data_rate = mcp - > mb [ 1 ] ;
}
return rval ;
}