⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpfc_mbox.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************* * This file is part of the Emulex Linux Device Driver for         * * Fibre Channel Host Bus Adapters.                                * * Copyright (C) 2004-2005 Emulex.  All rights reserved.           * * EMULEX and SLI are trademarks of Emulex.                        * * www.emulex.com                                                  * * Portions Copyright (C) 2004-2005 Christoph Hellwig              * *                                                                 * * This program is free software; you can redistribute it and/or   * * modify it under the terms of version 2 of the GNU General       * * Public License as published by the Free Software Foundation.    * * This program is distributed in the hope that it will be useful. * * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          * * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  * * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      * * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * * TO BE LEGALLY INVALID.  See the GNU General Public License for  * * more details, a copy of which can be found in the file COPYING  * * included with this package.                                     * *******************************************************************/#include <linux/blkdev.h>#include <linux/pci.h>#include <linux/interrupt.h>#include <scsi/scsi_device.h>#include <scsi/scsi_transport_fc.h>#include <scsi/scsi.h>#include "lpfc_hw.h"#include "lpfc_sli.h"#include "lpfc_disc.h"#include "lpfc_scsi.h"#include "lpfc.h"#include "lpfc_logmsg.h"#include "lpfc_crtn.h"#include "lpfc_compat.h"/**********************************************//*                mailbox command             *//**********************************************/voidlpfc_dump_mem(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, uint16_t offset){	MAILBOX_t *mb;	void *ctx;	mb = &pmb->mb;	ctx = pmb->context2;	/* Setup to dump VPD region */	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	mb->mbxCommand = MBX_DUMP_MEMORY;	mb->un.varDmp.cv = 1;	mb->un.varDmp.type = DMP_NV_PARAMS;	mb->un.varDmp.entry_index = offset;	mb->un.varDmp.region_id = DMP_REGION_VPD;	mb->un.varDmp.word_cnt = (DMP_RSP_SIZE / sizeof (uint32_t));	mb->un.varDmp.co = 0;	mb->un.varDmp.resp_offset = 0;	pmb->context2 = ctx;	mb->mbxOwner = OWN_HOST;	return;}/**********************************************//*  lpfc_read_nv  Issue a READ NVPARAM        *//*                mailbox command             *//**********************************************/voidlpfc_read_nv(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb){	MAILBOX_t *mb;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	mb->mbxCommand = MBX_READ_NV;	mb->mbxOwner = OWN_HOST;	return;}/**********************************************//*  lpfc_read_la  Issue a READ LA             *//*                mailbox command             *//**********************************************/intlpfc_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, struct lpfc_dmabuf *mp){	MAILBOX_t *mb;	struct lpfc_sli *psli;	psli = &phba->sli;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	INIT_LIST_HEAD(&mp->list);	mb->mbxCommand = MBX_READ_LA64;	mb->un.varReadLA.un.lilpBde64.tus.f.bdeSize = 128;	mb->un.varReadLA.un.lilpBde64.addrHigh = putPaddrHigh(mp->phys);	mb->un.varReadLA.un.lilpBde64.addrLow = putPaddrLow(mp->phys);	/* Save address for later completion and set the owner to host so that	 * the FW knows this mailbox is available for processing.	 */	pmb->context1 = (uint8_t *) mp;	mb->mbxOwner = OWN_HOST;	return (0);}/**********************************************//*  lpfc_clear_la  Issue a CLEAR LA           *//*                 mailbox command            *//**********************************************/voidlpfc_clear_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb){	MAILBOX_t *mb;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	mb->un.varClearLA.eventTag = phba->fc_eventTag;	mb->mbxCommand = MBX_CLEAR_LA;	mb->mbxOwner = OWN_HOST;	return;}/**************************************************//*  lpfc_config_link  Issue a CONFIG LINK         *//*                    mailbox command             *//**************************************************/voidlpfc_config_link(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb){	MAILBOX_t *mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	/* NEW_FEATURE	 * SLI-2, Coalescing Response Feature.	 */	if (phba->cfg_cr_delay) {		mb->un.varCfgLnk.cr = 1;		mb->un.varCfgLnk.ci = 1;		mb->un.varCfgLnk.cr_delay = phba->cfg_cr_delay;		mb->un.varCfgLnk.cr_count = phba->cfg_cr_count;	}	mb->un.varCfgLnk.myId = phba->fc_myDID;	mb->un.varCfgLnk.edtov = phba->fc_edtov;	mb->un.varCfgLnk.arbtov = phba->fc_arbtov;	mb->un.varCfgLnk.ratov = phba->fc_ratov;	mb->un.varCfgLnk.rttov = phba->fc_rttov;	mb->un.varCfgLnk.altov = phba->fc_altov;	mb->un.varCfgLnk.crtov = phba->fc_crtov;	mb->un.varCfgLnk.citov = phba->fc_citov;	if (phba->cfg_ack0)		mb->un.varCfgLnk.ack0_enable = 1;	mb->mbxCommand = MBX_CONFIG_LINK;	mb->mbxOwner = OWN_HOST;	return;}/**********************************************//*  lpfc_init_link  Issue an INIT LINK        *//*                  mailbox command           *//**********************************************/voidlpfc_init_link(struct lpfc_hba * phba,	       LPFC_MBOXQ_t * pmb, uint32_t topology, uint32_t linkspeed){	lpfc_vpd_t *vpd;	struct lpfc_sli *psli;	MAILBOX_t *mb;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	psli = &phba->sli;	switch (topology) {	case FLAGS_TOPOLOGY_MODE_LOOP_PT:		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_LOOP;		mb->un.varInitLnk.link_flags |= FLAGS_TOPOLOGY_FAILOVER;		break;	case FLAGS_TOPOLOGY_MODE_PT_PT:		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT;		break;	case FLAGS_TOPOLOGY_MODE_LOOP:		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_LOOP;		break;	case FLAGS_TOPOLOGY_MODE_PT_LOOP:		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT;		mb->un.varInitLnk.link_flags |= FLAGS_TOPOLOGY_FAILOVER;		break;	}	/* NEW_FEATURE	 * Setting up the link speed	 */	vpd = &phba->vpd;	if (vpd->rev.feaLevelHigh >= 0x02){		switch(linkspeed){			case LINK_SPEED_1G:			case LINK_SPEED_2G:			case LINK_SPEED_4G:				mb->un.varInitLnk.link_flags |=							FLAGS_LINK_SPEED;				mb->un.varInitLnk.link_speed = linkspeed;			break;			case LINK_SPEED_AUTO:			default:				mb->un.varInitLnk.link_speed =							LINK_SPEED_AUTO;			break;		}	}	else		mb->un.varInitLnk.link_speed = LINK_SPEED_AUTO;	mb->mbxCommand = (volatile uint8_t)MBX_INIT_LINK;	mb->mbxOwner = OWN_HOST;	mb->un.varInitLnk.fabric_AL_PA = phba->fc_pref_ALPA;	return;}/**********************************************//*  lpfc_read_sparam  Issue a READ SPARAM     *//*                    mailbox command         *//**********************************************/intlpfc_read_sparam(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb){	struct lpfc_dmabuf *mp;	MAILBOX_t *mb;	struct lpfc_sli *psli;	psli = &phba->sli;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	mb->mbxOwner = OWN_HOST;	/* Get a buffer to hold the HBAs Service Parameters */	if (((mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL)) == 0) ||	    ((mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys))) == 0)) {		kfree(mp);		mb->mbxCommand = MBX_READ_SPARM64;		/* READ_SPARAM: no buffers */		lpfc_printf_log(phba,			        KERN_WARNING,			        LOG_MBOX,			        "%d:0301 READ_SPARAM: no buffers\n",			        phba->brd_no);		return (1);	}	INIT_LIST_HEAD(&mp->list);	mb->mbxCommand = MBX_READ_SPARM64;	mb->un.varRdSparm.un.sp64.tus.f.bdeSize = sizeof (struct serv_parm);	mb->un.varRdSparm.un.sp64.addrHigh = putPaddrHigh(mp->phys);	mb->un.varRdSparm.un.sp64.addrLow = putPaddrLow(mp->phys);	/* save address for completion */	pmb->context1 = mp;	return (0);}/********************************************//*  lpfc_unreg_did  Issue a UNREG_DID       *//*                  mailbox command         *//********************************************/voidlpfc_unreg_did(struct lpfc_hba * phba, uint32_t did, LPFC_MBOXQ_t * pmb){	MAILBOX_t *mb;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	mb->un.varUnregDID.did = did;	mb->mbxCommand = MBX_UNREG_D_ID;	mb->mbxOwner = OWN_HOST;	return;}/***********************************************//*                  command to write slim      *//***********************************************/voidlpfc_set_slim(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, uint32_t addr,	      uint32_t value){	MAILBOX_t *mb;	mb = &pmb->mb;	memset(pmb, 0, sizeof (LPFC_MBOXQ_t));	/* addr = 0x090597 is AUTO ABTS disable for ELS commands */	/* addr = 0x052198 is DELAYED ABTS enable for ELS commands */	/*	 * Always turn on DELAYED ABTS for ELS timeouts	 */	if ((addr == 0x052198) && (value == 0))		value = 1;	mb->un.varWords[0] = addr;	mb->un.varWords[1] = value;	mb->mbxCommand = MBX_SET_SLIM;	mb->mbxOwner = OWN_HOST;	return;}/**********************************************//*  lpfc_read_nv  Issue a READ CONFIG         *//*                mailbox command             *//**********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -