2009-09-05 06:06:35 +04:00
/**
2011-03-26 00:23:57 +03:00
* Copyright ( C ) 2005 - 2011 Emulex
2009-09-05 06:06:35 +04:00
* All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation . The full GNU General
* Public License is included in this distribution in the file called COPYING .
*
2011-03-26 00:23:57 +03:00
* Written by : Jayamohan Kallickal ( jayamohan . kallickal @ emulex . com )
2009-09-05 06:06:35 +04:00
*
* Contact Information :
2011-03-26 00:23:57 +03:00
* linux - drivers @ emulex . com
2009-09-05 06:06:35 +04:00
*
2011-03-26 00:23:57 +03:00
* Emulex
* 3333 Susan Street
* Costa Mesa , CA 92626
2009-09-05 06:06:35 +04:00
*/
# include "be_mgmt.h"
# include "be_iscsi.h"
2010-07-22 02:59:18 +04:00
# include <scsi/scsi_transport_iscsi.h>
unsigned int beiscsi_get_boot_target ( struct beiscsi_hba * phba )
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
struct be_mcc_wrb * wrb ;
struct be_cmd_req_get_mac_addr * req ;
unsigned int tag = 0 ;
SE_DEBUG ( DBG_LVL_8 , " In bescsi_get_boot_target \n " ) ;
spin_lock ( & ctrl - > mbox_lock ) ;
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
req = embedded_payload ( wrb ) ;
wrb - > tag0 | = tag ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI_INI ,
OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET ,
sizeof ( * req ) ) ;
be_mcc_notify ( phba ) ;
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
unsigned int beiscsi_get_session_info ( struct beiscsi_hba * phba ,
u32 boot_session_handle ,
struct be_dma_mem * nonemb_cmd )
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
struct be_mcc_wrb * wrb ;
unsigned int tag = 0 ;
struct be_cmd_req_get_session * req ;
struct be_cmd_resp_get_session * resp ;
struct be_sge * sge ;
SE_DEBUG ( DBG_LVL_8 , " In beiscsi_get_session_info \n " ) ;
spin_lock ( & ctrl - > mbox_lock ) ;
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
nonemb_cmd - > size = sizeof ( * resp ) ;
req = nonemb_cmd - > va ;
memset ( req , 0 , sizeof ( * req ) ) ;
wrb = wrb_from_mccq ( phba ) ;
sge = nonembedded_sgl ( wrb ) ;
wrb - > tag0 | = tag ;
wrb - > tag0 | = tag ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , false , 1 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI_INI ,
OPCODE_ISCSI_INI_SESSION_GET_A_SESSION ,
sizeof ( * resp ) ) ;
req - > session_handle = boot_session_handle ;
sge - > pa_hi = cpu_to_le32 ( upper_32_bits ( nonemb_cmd - > dma ) ) ;
sge - > pa_lo = cpu_to_le32 ( nonemb_cmd - > dma & 0xFFFFFFFF ) ;
sge - > len = cpu_to_le32 ( nonemb_cmd - > size ) ;
be_mcc_notify ( phba ) ;
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
2009-09-05 06:06:35 +04:00
2010-07-22 02:47:16 +04:00
int mgmt_get_fw_config ( struct be_ctrl_info * ctrl ,
2009-09-05 06:06:35 +04:00
struct beiscsi_hba * phba )
{
struct be_mcc_wrb * wrb = wrb_from_mbox ( & ctrl - > mbox_mem ) ;
struct be_fw_cfg * req = embedded_payload ( wrb ) ;
int status = 0 ;
spin_lock ( & ctrl - > mbox_lock ) ;
memset ( wrb , 0 , sizeof ( * wrb ) ) ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_COMMON ,
OPCODE_COMMON_QUERY_FIRMWARE_CONFIG , sizeof ( * req ) ) ;
status = be_mbox_notify ( ctrl ) ;
if ( ! status ) {
struct be_fw_cfg * pfw_cfg ;
pfw_cfg = req ;
phba - > fw_config . phys_port = pfw_cfg - > phys_port ;
phba - > fw_config . iscsi_icd_start =
pfw_cfg - > ulp [ 0 ] . icd_base ;
phba - > fw_config . iscsi_icd_count =
pfw_cfg - > ulp [ 0 ] . icd_count ;
phba - > fw_config . iscsi_cid_start =
pfw_cfg - > ulp [ 0 ] . sq_base ;
phba - > fw_config . iscsi_cid_count =
pfw_cfg - > ulp [ 0 ] . sq_count ;
2010-01-05 02:34:12 +03:00
if ( phba - > fw_config . iscsi_cid_count > ( BE2_MAX_SESSIONS / 2 ) ) {
2010-01-06 23:21:44 +03:00
SE_DEBUG ( DBG_LVL_8 ,
2010-07-22 02:57:47 +04:00
" FW reported MAX CXNS as %d \t "
2010-01-06 23:21:44 +03:00
" Max Supported = %d. \n " ,
phba - > fw_config . iscsi_cid_count ,
BE2_MAX_SESSIONS ) ;
phba - > fw_config . iscsi_cid_count = BE2_MAX_SESSIONS / 2 ;
2010-01-05 02:34:12 +03:00
}
2009-09-05 06:06:35 +04:00
} else {
shost_printk ( KERN_WARNING , phba - > shost ,
2010-07-22 02:46:00 +04:00
" Failed in mgmt_get_fw_config \n " ) ;
2009-09-05 06:06:35 +04:00
}
spin_unlock ( & ctrl - > mbox_lock ) ;
return status ;
}
2010-07-22 02:47:16 +04:00
int mgmt_check_supported_fw ( struct be_ctrl_info * ctrl ,
2009-10-23 10:22:33 +04:00
struct beiscsi_hba * phba )
2009-09-05 06:06:35 +04:00
{
struct be_dma_mem nonemb_cmd ;
struct be_mcc_wrb * wrb = wrb_from_mbox ( & ctrl - > mbox_mem ) ;
struct be_mgmt_controller_attributes * req ;
struct be_sge * sge = nonembedded_sgl ( wrb ) ;
int status = 0 ;
nonemb_cmd . va = pci_alloc_consistent ( ctrl - > pdev ,
sizeof ( struct be_mgmt_controller_attributes ) ,
& nonemb_cmd . dma ) ;
if ( nonemb_cmd . va = = NULL ) {
SE_DEBUG ( DBG_LVL_1 ,
" Failed to allocate memory for mgmt_check_supported_fw "
" \n " ) ;
2010-07-22 02:46:38 +04:00
return - ENOMEM ;
2009-09-05 06:06:35 +04:00
}
nonemb_cmd . size = sizeof ( struct be_mgmt_controller_attributes ) ;
req = nonemb_cmd . va ;
2010-02-11 02:41:15 +03:00
memset ( req , 0 , sizeof ( * req ) ) ;
2009-09-05 06:06:35 +04:00
spin_lock ( & ctrl - > mbox_lock ) ;
memset ( wrb , 0 , sizeof ( * wrb ) ) ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , false , 1 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_COMMON ,
OPCODE_COMMON_GET_CNTL_ATTRIBUTES , sizeof ( * req ) ) ;
sge - > pa_hi = cpu_to_le32 ( upper_32_bits ( nonemb_cmd . dma ) ) ;
sge - > pa_lo = cpu_to_le32 ( nonemb_cmd . dma & 0xFFFFFFFF ) ;
sge - > len = cpu_to_le32 ( nonemb_cmd . size ) ;
status = be_mbox_notify ( ctrl ) ;
if ( ! status ) {
struct be_mgmt_controller_attributes_resp * resp = nonemb_cmd . va ;
SE_DEBUG ( DBG_LVL_8 , " Firmware version of CMD: %s \n " ,
resp - > params . hba_attribs . flashrom_version_string ) ;
SE_DEBUG ( DBG_LVL_8 , " Firmware version is : %s \n " ,
resp - > params . hba_attribs . firmware_version_string ) ;
SE_DEBUG ( DBG_LVL_8 ,
" Developer Build, not performing version check... \n " ) ;
2009-10-23 10:22:33 +04:00
phba - > fw_config . iscsi_features =
resp - > params . hba_attribs . iscsi_features ;
SE_DEBUG ( DBG_LVL_8 , " phba->fw_config.iscsi_features = %d \n " ,
phba - > fw_config . iscsi_features ) ;
2009-09-05 06:06:35 +04:00
} else
SE_DEBUG ( DBG_LVL_1 , " Failed in mgmt_check_supported_fw \n " ) ;
2009-10-23 10:22:33 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2009-09-05 06:06:35 +04:00
if ( nonemb_cmd . va )
pci_free_consistent ( ctrl - > pdev , nonemb_cmd . size ,
nonemb_cmd . va , nonemb_cmd . dma ) ;
return status ;
}
2010-07-22 02:47:16 +04:00
int mgmt_epfw_cleanup ( struct beiscsi_hba * phba , unsigned short chute )
2009-09-05 06:06:35 +04:00
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2009-10-23 10:22:33 +04:00
struct be_mcc_wrb * wrb = wrb_from_mccq ( phba ) ;
2009-09-05 06:06:35 +04:00
struct iscsi_cleanup_req * req = embedded_payload ( wrb ) ;
int status = 0 ;
spin_lock ( & ctrl - > mbox_lock ) ;
memset ( wrb , 0 , sizeof ( * wrb ) ) ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI ,
OPCODE_COMMON_ISCSI_CLEANUP , sizeof ( * req ) ) ;
req - > chute = chute ;
2011-04-29 23:30:07 +04:00
req - > hdr_ring_id = cpu_to_le16 ( HWI_GET_DEF_HDRQ_ID ( phba ) ) ;
req - > data_ring_id = cpu_to_le16 ( HWI_GET_DEF_BUFQ_ID ( phba ) ) ;
2009-09-05 06:06:35 +04:00
2009-10-23 10:22:33 +04:00
status = be_mcc_notify_wait ( phba ) ;
2009-09-05 06:06:35 +04:00
if ( status )
shost_printk ( KERN_WARNING , phba - > shost ,
" mgmt_epfw_cleanup , FAILED \n " ) ;
spin_unlock ( & ctrl - > mbox_lock ) ;
return status ;
}
2010-07-22 02:47:16 +04:00
unsigned int mgmt_invalidate_icds ( struct beiscsi_hba * phba ,
2010-02-20 05:32:39 +03:00
struct invalidate_command_table * inv_tbl ,
2010-07-22 02:57:47 +04:00
unsigned int num_invalidate , unsigned int cid ,
struct be_dma_mem * nonemb_cmd )
2009-09-05 06:06:35 +04:00
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2010-01-05 02:40:46 +03:00
struct be_mcc_wrb * wrb ;
struct be_sge * sge ;
2009-09-05 06:06:35 +04:00
struct invalidate_commands_params_in * req ;
2010-02-20 05:32:39 +03:00
unsigned int i , tag = 0 ;
2010-01-05 02:40:46 +03:00
spin_lock ( & ctrl - > mbox_lock ) ;
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
2009-09-05 06:06:35 +04:00
2010-07-22 02:57:47 +04:00
req = nonemb_cmd - > va ;
2010-02-11 02:41:15 +03:00
memset ( req , 0 , sizeof ( * req ) ) ;
2010-01-05 02:40:46 +03:00
wrb = wrb_from_mccq ( phba ) ;
sge = nonembedded_sgl ( wrb ) ;
wrb - > tag0 | = tag ;
2009-09-05 06:06:35 +04:00
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , false , 1 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI ,
OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS ,
sizeof ( * req ) ) ;
req - > ref_handle = 0 ;
req - > cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE ;
2010-02-20 05:32:39 +03:00
for ( i = 0 ; i < num_invalidate ; i + + ) {
req - > table [ i ] . icd = inv_tbl - > icd ;
req - > table [ i ] . cid = inv_tbl - > cid ;
req - > icd_count + + ;
inv_tbl + + ;
}
2010-07-22 02:57:47 +04:00
sge - > pa_hi = cpu_to_le32 ( upper_32_bits ( nonemb_cmd - > dma ) ) ;
sge - > pa_lo = cpu_to_le32 ( nonemb_cmd - > dma & 0xFFFFFFFF ) ;
sge - > len = cpu_to_le32 ( nonemb_cmd - > size ) ;
2009-09-05 06:06:35 +04:00
2010-01-05 02:40:46 +03:00
be_mcc_notify ( phba ) ;
2009-09-05 06:06:35 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
return tag ;
2009-09-05 06:06:35 +04:00
}
2010-07-22 02:47:16 +04:00
unsigned int mgmt_invalidate_connection ( struct beiscsi_hba * phba ,
2009-09-05 06:06:35 +04:00
struct beiscsi_endpoint * beiscsi_ep ,
unsigned short cid ,
unsigned short issue_reset ,
unsigned short savecfg_flag )
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2010-01-05 02:40:46 +03:00
struct be_mcc_wrb * wrb ;
struct iscsi_invalidate_connection_params_in * req ;
unsigned int tag = 0 ;
2009-09-05 06:06:35 +04:00
spin_lock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
wrb - > tag0 | = tag ;
req = embedded_payload ( wrb ) ;
2009-09-05 06:06:35 +04:00
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI_INI ,
OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION ,
sizeof ( * req ) ) ;
req - > session_handle = beiscsi_ep - > fw_handle ;
req - > cid = cid ;
if ( issue_reset )
req - > cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST ;
else
req - > cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE ;
req - > save_cfg = savecfg_flag ;
2010-01-05 02:40:46 +03:00
be_mcc_notify ( phba ) ;
2009-09-05 06:06:35 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
return tag ;
2009-09-05 06:06:35 +04:00
}
2010-07-22 02:47:16 +04:00
unsigned int mgmt_upload_connection ( struct beiscsi_hba * phba ,
2009-09-05 06:06:35 +04:00
unsigned short cid , unsigned int upload_flag )
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2010-01-05 02:40:46 +03:00
struct be_mcc_wrb * wrb ;
struct tcp_upload_params_in * req ;
unsigned int tag = 0 ;
2009-09-05 06:06:35 +04:00
spin_lock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
req = embedded_payload ( wrb ) ;
wrb - > tag0 | = tag ;
2009-09-05 06:06:35 +04:00
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_COMMON_TCP_UPLOAD ,
OPCODE_COMMON_TCP_UPLOAD , sizeof ( * req ) ) ;
req - > id = ( unsigned short ) cid ;
req - > upload_type = ( unsigned char ) upload_flag ;
2010-01-05 02:40:46 +03:00
be_mcc_notify ( phba ) ;
2009-09-05 06:06:35 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
return tag ;
2009-09-05 06:06:35 +04:00
}
int mgmt_open_connection ( struct beiscsi_hba * phba ,
struct sockaddr * dst_addr ,
2010-07-22 02:57:47 +04:00
struct beiscsi_endpoint * beiscsi_ep ,
struct be_dma_mem * nonemb_cmd )
2009-09-05 06:06:35 +04:00
{
struct hwi_controller * phwi_ctrlr ;
struct hwi_context_memory * phwi_context ;
struct sockaddr_in * daddr_in = ( struct sockaddr_in * ) dst_addr ;
struct sockaddr_in6 * daddr_in6 = ( struct sockaddr_in6 * ) dst_addr ;
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2010-01-05 02:40:46 +03:00
struct be_mcc_wrb * wrb ;
struct tcp_connect_and_offload_in * req ;
2009-09-05 06:06:35 +04:00
unsigned short def_hdr_id ;
unsigned short def_data_id ;
struct phys_addr template_address = { 0 , 0 } ;
struct phys_addr * ptemplate_address ;
2010-01-05 02:40:46 +03:00
unsigned int tag = 0 ;
2009-10-23 10:22:33 +04:00
unsigned int i ;
2009-09-05 06:06:35 +04:00
unsigned short cid = beiscsi_ep - > ep_cid ;
2010-07-22 02:57:47 +04:00
struct be_sge * sge ;
2009-09-05 06:06:35 +04:00
phwi_ctrlr = phba - > phwi_ctrlr ;
phwi_context = phwi_ctrlr - > phwi_ctxt ;
def_hdr_id = ( unsigned short ) HWI_GET_DEF_HDRQ_ID ( phba ) ;
def_data_id = ( unsigned short ) HWI_GET_DEF_BUFQ_ID ( phba ) ;
ptemplate_address = & template_address ;
ISCSI_GET_PDU_TEMPLATE_ADDRESS ( phba , ptemplate_address ) ;
spin_lock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
2010-07-22 02:57:47 +04:00
memset ( wrb , 0 , sizeof ( * wrb ) ) ;
sge = nonembedded_sgl ( wrb ) ;
req = nonemb_cmd - > va ;
memset ( req , 0 , sizeof ( * req ) ) ;
2010-01-05 02:40:46 +03:00
wrb - > tag0 | = tag ;
2009-09-05 06:06:35 +04:00
2010-08-12 22:06:06 +04:00
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , false , 1 ) ;
2009-09-05 06:06:35 +04:00
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI ,
OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD ,
sizeof ( * req ) ) ;
if ( dst_addr - > sa_family = = PF_INET ) {
__be32 s_addr = daddr_in - > sin_addr . s_addr ;
req - > ip_address . ip_type = BE2_IPV4 ;
req - > ip_address . ip_address [ 0 ] = s_addr & 0x000000ff ;
req - > ip_address . ip_address [ 1 ] = ( s_addr & 0x0000ff00 ) > > 8 ;
req - > ip_address . ip_address [ 2 ] = ( s_addr & 0x00ff0000 ) > > 16 ;
req - > ip_address . ip_address [ 3 ] = ( s_addr & 0xff000000 ) > > 24 ;
req - > tcp_port = ntohs ( daddr_in - > sin_port ) ;
beiscsi_ep - > dst_addr = daddr_in - > sin_addr . s_addr ;
beiscsi_ep - > dst_tcpport = ntohs ( daddr_in - > sin_port ) ;
beiscsi_ep - > ip_type = BE2_IPV4 ;
} else if ( dst_addr - > sa_family = = PF_INET6 ) {
req - > ip_address . ip_type = BE2_IPV6 ;
memcpy ( & req - > ip_address . ip_address ,
& daddr_in6 - > sin6_addr . in6_u . u6_addr8 , 16 ) ;
req - > tcp_port = ntohs ( daddr_in6 - > sin6_port ) ;
beiscsi_ep - > dst_tcpport = ntohs ( daddr_in6 - > sin6_port ) ;
memcpy ( & beiscsi_ep - > dst6_addr ,
& daddr_in6 - > sin6_addr . in6_u . u6_addr8 , 16 ) ;
beiscsi_ep - > ip_type = BE2_IPV6 ;
} else {
shost_printk ( KERN_ERR , phba - > shost , " unknown addr family %d \n " ,
dst_addr - > sa_family ) ;
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-07-22 02:54:22 +04:00
free_mcc_tag ( & phba - > ctrl , tag ) ;
2009-09-05 06:06:35 +04:00
return - EINVAL ;
}
req - > cid = cid ;
2009-10-23 10:22:33 +04:00
i = phba - > nxt_cqid + + ;
if ( phba - > nxt_cqid = = phba - > num_cpus )
phba - > nxt_cqid = 0 ;
req - > cq_id = phwi_context - > be_cq [ i ] . id ;
2010-07-22 02:46:00 +04:00
SE_DEBUG ( DBG_LVL_8 , " i=%d cq_id=%d \n " , i , req - > cq_id ) ;
2009-09-05 06:06:35 +04:00
req - > defq_id = def_hdr_id ;
req - > hdr_ring_id = def_hdr_id ;
req - > data_ring_id = def_data_id ;
req - > do_offload = 1 ;
req - > dataout_template_pa . lo = ptemplate_address - > lo ;
req - > dataout_template_pa . hi = ptemplate_address - > hi ;
2010-07-22 02:57:47 +04:00
sge - > pa_hi = cpu_to_le32 ( upper_32_bits ( nonemb_cmd - > dma ) ) ;
sge - > pa_lo = cpu_to_le32 ( nonemb_cmd - > dma & 0xFFFFFFFF ) ;
sge - > len = cpu_to_le32 ( nonemb_cmd - > size ) ;
2010-01-05 02:40:46 +03:00
be_mcc_notify ( phba ) ;
2009-09-05 06:06:35 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
return tag ;
2009-09-05 06:06:35 +04:00
}
2009-10-23 10:22:33 +04:00
2010-01-05 02:40:46 +03:00
unsigned int be_cmd_get_mac_addr ( struct beiscsi_hba * phba )
2009-10-23 10:22:33 +04:00
{
struct be_ctrl_info * ctrl = & phba - > ctrl ;
2010-01-05 02:40:46 +03:00
struct be_mcc_wrb * wrb ;
struct be_cmd_req_get_mac_addr * req ;
unsigned int tag = 0 ;
2009-10-23 10:22:33 +04:00
SE_DEBUG ( DBG_LVL_8 , " In be_cmd_get_mac_addr \n " ) ;
spin_lock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
req = embedded_payload ( wrb ) ;
wrb - > tag0 | = tag ;
2009-10-23 10:22:33 +04:00
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI ,
OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG ,
sizeof ( * req ) ) ;
2010-01-05 02:40:46 +03:00
be_mcc_notify ( phba ) ;
2009-10-23 10:22:33 +04:00
spin_unlock ( & ctrl - > mbox_lock ) ;
2010-01-05 02:40:46 +03:00
return tag ;
2009-10-23 10:22:33 +04:00
}
2012-04-04 08:41:49 +04:00
unsigned int be_cmd_get_initname ( struct beiscsi_hba * phba )
{
unsigned int tag = 0 ;
struct be_mcc_wrb * wrb ;
struct be_cmd_hba_name * req ;
struct be_ctrl_info * ctrl = & phba - > ctrl ;
spin_lock ( & ctrl - > mbox_lock ) ;
tag = alloc_mcc_tag ( phba ) ;
if ( ! tag ) {
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}
wrb = wrb_from_mccq ( phba ) ;
req = embedded_payload ( wrb ) ;
wrb - > tag0 | = tag ;
be_wrb_hdr_prepare ( wrb , sizeof ( * req ) , true , 0 ) ;
be_cmd_hdr_prepare ( & req - > hdr , CMD_SUBSYSTEM_ISCSI_INI ,
OPCODE_ISCSI_INI_CFG_GET_HBA_NAME ,
sizeof ( * req ) ) ;
be_mcc_notify ( phba ) ;
spin_unlock ( & ctrl - > mbox_lock ) ;
return tag ;
}