X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fscsi%2Flpfc%2Flpfc_ct.c;h=a51a41b7f15d55566277619d8be5e64d06b31324;hb=refs%2Fheads%2Fvserver;hp=83342c4693b024f1aeb5603e4a875f7cb268e27d;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 83342c469..a51a41b7f 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -1,49 +1,47 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * - * Enterprise Fibre Channel Host Bus Adapters. * - * Refer to the README file included with this package for * - * driver version and adapter support. * - * Copyright (C) 2004 Emulex Corporation. * + * Fibre Channel Host Bus Adapters. * + * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * * * * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details, a copy of which * - * can be found in the file COPYING included with this package. * + * 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. * *******************************************************************/ /* - * $Id: lpfc_ct.c 1.143 2004/11/17 14:50:38EST sf_support Exp $ - * * Fibre Channel SCSI LAN Device Driver CT support */ -#include #include -#include #include -#include +#include #include + +#include #include #include +#include + +#include "lpfc_hw.h" #include "lpfc_sli.h" #include "lpfc_disc.h" #include "lpfc_scsi.h" #include "lpfc.h" -#include "lpfc_crtn.h" -#include "lpfc_hw.h" #include "lpfc_logmsg.h" -#include "lpfc_mem.h" +#include "lpfc_crtn.h" #include "lpfc_version.h" - -#define HBA_PORTSPEED_UNKNOWN 0 /* Unknown - transceiver +#define HBA_PORTSPEED_UNKNOWN 0 /* Unknown - transceiver * incapable of reporting */ #define HBA_PORTSPEED_1GBIT 1 /* 1 GBit/sec */ #define HBA_PORTSPEED_2GBIT 2 /* 2 GBit/sec */ @@ -68,30 +66,33 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba, struct lpfc_iocbq *next_piocbq; struct lpfc_dmabuf *pmbuf = NULL; struct lpfc_dmabuf *matp, *next_matp; - uint32_t ctx = 0, count = 0; + uint32_t ctx = 0, size = 0, cnt = 0; IOCB_t *icmd = &piocbq->iocb; - int i, status, go_exit = 0; + IOCB_t *save_icmd = icmd; + int i, go_exit = 0; struct list_head head; - if (icmd->ulpStatus) + if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) && + ((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) { + /* Not enough posted buffers; Try posting more buffers */ + phba->fc_stat.NoRcvBuf++; + lpfc_post_buffer(phba, pring, 0, 1); + return; + } + + /* If there are no BDEs associated with this IOCB, + * there is nothing to do. + */ + if (icmd->ulpBdeCount == 0) return; + INIT_LIST_HEAD(&head); list_add_tail(&head, &piocbq->list); + list_for_each_entry_safe(piocbq, next_piocbq, &head, list) { icmd = &piocbq->iocb; if (ctx == 0) ctx = (uint32_t) (icmd->ulpContext); - if (icmd->ulpStatus) { - if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) && - ((icmd->un.ulpWord[4] & 0xff) - == IOERR_RCV_BUFFER_WAITING)) { - phba->fc_stat.NoRcvBuf++; - lpfc_post_buffer(phba, pring, 0, 1); - } - go_exit = 1; - goto ct_unsol_event_exit_piocbq; - } - if (icmd->ulpBdeCount == 0) continue; @@ -105,6 +106,7 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba, addrLow)); if (!matp) { /* Insert lpfc log message here */ + lpfc_post_buffer(phba, pring, cnt, 1); go_exit = 1; goto ct_unsol_event_exit_piocbq; } @@ -116,25 +118,20 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba, } else list_add_tail(&matp->list, &pmbuf->list); - count += icmd->un.cont64[i].tus.f.bdeSize; + size += icmd->un.cont64[i].tus.f.bdeSize; + cnt++; } - lpfc_post_buffer(phba, pring, i, 1); icmd->ulpBdeCount = 0; } + + lpfc_post_buffer(phba, pring, cnt, 1); + if (save_icmd->ulpStatus) { + go_exit = 1; + } + ct_unsol_event_exit_piocbq: list_del(&head); - /* - * if not early-exiting and there is pmbuf, - * then do FC_REG_CT_EVENT for libdfc - */ - if (!go_exit && pmbuf) { - status = lpfc_put_event(phba, FC_REG_CT_EVENT, ctx, - (void *)pmbuf, count, 0); - if (status) - /* Need to free IOCB buffer ? */ - return; - } if (pmbuf) { list_for_each_entry_safe(matp, next_matp, &pmbuf->list, list) { lpfc_mbuf_free(phba, matp->virt, matp->phys); @@ -175,7 +172,7 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl, while (size) { /* Allocate buffer for rsp payload */ - mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_ATOMIC); + mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL); if (!mp) { if (mlist) lpfc_free_ct_rsp(phba, mlist); @@ -191,7 +188,8 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl, if (!mp->virt) { kfree(mp); - lpfc_free_ct_rsp(phba, mlist); + if (mlist) + lpfc_free_ct_rsp(phba, mlist); return NULL; } @@ -232,13 +230,14 @@ lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp, struct lpfc_iocbq *geniocb; /* Allocate buffer for command iocb */ - geniocb = mempool_alloc(phba->iocb_mem_pool, GFP_ATOMIC); - if (!geniocb) { + spin_lock_irq(phba->host->host_lock); + geniocb = lpfc_sli_get_iocbq(phba); + spin_unlock_irq(phba->host->host_lock); + + if (geniocb == NULL) return 1; - } - memset(geniocb, 0, sizeof (struct lpfc_iocbq)); - icmd = &geniocb->iocb; + icmd = &geniocb->iocb; icmd->un.genreq64.bdl.ulpIoTag32 = 0; icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); @@ -257,19 +256,16 @@ lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp, /* Fill in payload, bp points to frame payload */ icmd->ulpCommand = CMD_GEN_REQUEST64_CR; - pci_dma_sync_single_for_device(phba->pcidev, bmp->phys, - LPFC_BPL_SIZE, PCI_DMA_TODEVICE); - - icmd->ulpIoTag = lpfc_sli_next_iotag(phba, pring); - /* Fill in rest of iocb */ icmd->un.genreq64.w5.hcsw.Fctl = (SI | LA); icmd->un.genreq64.w5.hcsw.Dfctl = 0; icmd->un.genreq64.w5.hcsw.Rctl = FC_UNSOL_CTL; icmd->un.genreq64.w5.hcsw.Type = FC_COMMON_TRANSPORT_ULP; - if (!tmo) - tmo = (2 * phba->fc_ratov) + 1; + if (!tmo) { + /* FC spec states we need 3 * ratov for CT requests */ + tmo = (3 * phba->fc_ratov); + } icmd->ulpTimeout = tmo; icmd->ulpBdeCount = 1; icmd->ulpLe = 1; @@ -283,10 +279,13 @@ lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp, icmd->ulpIoTag, phba->hba_state); geniocb->iocb_cmpl = cmpl; geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT; + spin_lock_irq(phba->host->host_lock); if (lpfc_sli_issue_iocb(phba, pring, geniocb, 0) == IOCB_ERROR) { - mempool_free( geniocb, phba->iocb_mem_pool); + lpfc_sli_release_iocbq(phba, geniocb); + spin_unlock_irq(phba->host->host_lock); return 1; } + spin_unlock_irq(phba->host->host_lock); return 0; } @@ -340,8 +339,6 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) list_add_tail(&head, &mp->list); list_for_each_entry_safe(mp, next_mp, &head, list) { mlast = mp; - pci_dma_sync_single_for_cpu(phba->pcidev, mp->phys, - LPFC_BPL_SIZE, PCI_DMA_FROMDEVICE); Size -= Cnt; @@ -396,10 +393,16 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) nsout1: list_del(&head); - /* Here we are finished in the case RSCN */ + /* + * The driver has cycled through all Nports in the RSCN payload. + * Complete the handling by cleaning up and marking the + * current driver state. + */ if (phba->hba_state == LPFC_HBA_READY) { lpfc_els_flush_rscn(phba); + spin_lock_irq(phba->host->host_lock); phba->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */ + spin_unlock_irq(phba->host->host_lock); } return 0; } @@ -429,7 +432,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, irsp = &rspiocb->iocb; if (irsp->ulpStatus) { - if((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && + if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && ((irsp->un.ulpWord[4] == IOERR_SLI_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED))) { goto out; @@ -454,6 +457,11 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, CTrsp = (struct lpfc_sli_ct_request *) outp->virt; if (CTrsp->CommandResponse.bits.CmdRsp == be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) { + lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, + "%d:0208 NameServer Rsp " + "Data: x%x\n", + phba->brd_no, + phba->fc_flag); lpfc_ns_rsp(phba, outp, (uint32_t) (irsp->un.genreq64.bdl.bdeSize)); } else if (CTrsp->CommandResponse.bits.CmdRsp == @@ -489,7 +497,9 @@ out: lpfc_mbuf_free(phba, bmp->virt, bmp->phys); kfree(inp); kfree(bmp); - mempool_free( cmdiocb, phba->iocb_mem_pool); + spin_lock_irq(phba->host->host_lock); + lpfc_sli_release_iocbq(phba, cmdiocb); + spin_unlock_irq(phba->host->host_lock); return; } @@ -526,7 +536,9 @@ lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, lpfc_mbuf_free(phba, bmp->virt, bmp->phys); kfree(inp); kfree(bmp); - mempool_free( cmdiocb, phba->iocb_mem_pool); + spin_lock_irq(phba->host->host_lock); + lpfc_sli_release_iocbq(phba, cmdiocb); + spin_unlock_irq(phba->host->host_lock); return; } @@ -546,15 +558,24 @@ lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, return; } +static void +lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, + struct lpfc_iocbq * rspiocb) +{ + lpfc_cmpl_ct_cmd_rft_id(phba, cmdiocb, rspiocb); + return; +} + void lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp) { - uint8_t buf[16]; char fwrev[16]; lpfc_decode_firmware_rev(phba, fwrev, 0); - lpfc_get_hba_model_desc(phba, buf, NULL); - sprintf(symbp, "Emulex %s FV%s DV%s", buf, fwrev, lpfc_release_version); + + sprintf(symbp, "Emulex %s FV%s DV%s", phba->ModelName, + fwrev, lpfc_release_version); + return; } /* @@ -576,7 +597,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) /* fill in BDEs for command */ /* Allocate buffer for command payload */ - mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_ATOMIC); + mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL); if (!mp) goto ns_cmd_exit; @@ -586,7 +607,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) goto ns_cmd_free_mp; /* Allocate buffer for Buffer ptr list */ - bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_ATOMIC); + bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL); if (!bmp) goto ns_cmd_free_mpvirt; @@ -616,6 +637,8 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) bpl->tus.f.bdeSize = RNN_REQUEST_SZ; else if (cmdcode == SLI_CTNS_RSNN_NN) bpl->tus.f.bdeSize = RSNN_REQUEST_SZ; + else if (cmdcode == SLI_CTNS_RFF_ID) + bpl->tus.f.bdeSize = RFF_REQUEST_SZ; else bpl->tus.f.bdeSize = 0; bpl->tus.w = le32_to_cpu(bpl->tus.w); @@ -647,6 +670,17 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) cmpl = lpfc_cmpl_ct_cmd_rft_id; break; + case SLI_CTNS_RFF_ID: + CtReq->CommandResponse.bits.CmdRsp = + be16_to_cpu(SLI_CTNS_RFF_ID); + CtReq->un.rff.PortId = be32_to_cpu(phba->fc_myDID); + CtReq->un.rff.feature_res = 0; + CtReq->un.rff.feature_tgt = 0; + CtReq->un.rff.type_code = FC_FCP_DATA; + CtReq->un.rff.feature_init = 1; + cmpl = lpfc_cmpl_ct_cmd_rff_id; + break; + case SLI_CTNS_RNN_ID: CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_CTNS_RNN_ID); @@ -728,7 +762,9 @@ lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba * phba, lpfc_mbuf_free(phba, bmp->virt, bmp->phys); kfree(inp); kfree(bmp); - mempool_free(cmdiocb, phba->iocb_mem_pool); + spin_lock_irq(phba->host->host_lock); + lpfc_sli_release_iocbq(phba, cmdiocb); + spin_unlock_irq(phba->host->host_lock); return; } int @@ -749,7 +785,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) /* fill in BDEs for command */ /* Allocate buffer for command payload */ - mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_ATOMIC); + mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL); if (!mp) goto fdmi_cmd_exit; @@ -758,7 +794,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) goto fdmi_cmd_free_mp; /* Allocate buffer for Buffer ptr list */ - bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_ATOMIC); + bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL); if (!bmp) goto fdmi_cmd_free_mpvirt; @@ -846,7 +882,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) /* #4 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MODEL); - lpfc_get_hba_model_desc(phba, ae->un.Model, NULL); + strcpy(ae->un.Model, phba->ModelName); len = strlen(ae->un.Model); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); @@ -856,8 +892,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) /* #5 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MODEL_DESCRIPTION); - lpfc_get_hba_model_desc(phba, NULL, - ae->un.ModelDescription); + strcpy(ae->un.ModelDescription, phba->ModelDesc); len = strlen(ae->un.ModelDescription); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); @@ -920,8 +955,9 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(OS_NAME_VERSION); sprintf(ae->un.OsNameVersion, "%s %s %s", - system_utsname.sysname, system_utsname.release, - system_utsname.version); + init_utsname()->sysname, + init_utsname()->release, + init_utsname()->version); len = strlen(ae->un.OsNameVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); @@ -973,19 +1009,19 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_SPEED); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); - if (FC_JEDEC_ID(vp->rev.biuRev) == VIPER_JEDEC_ID) + + ae->un.SupportSpeed = 0; + if (phba->lmt & LMT_10Gb) ae->un.SupportSpeed = HBA_PORTSPEED_10GBIT; - else if (FC_JEDEC_ID(vp->rev.biuRev) == HELIOS_JEDEC_ID) - ae->un.SupportSpeed = HBA_PORTSPEED_4GBIT; - else if ((FC_JEDEC_ID(vp->rev.biuRev) == - CENTAUR_2G_JEDEC_ID) - || (FC_JEDEC_ID(vp->rev.biuRev) == - PEGASUS_JEDEC_ID) - || (FC_JEDEC_ID(vp->rev.biuRev) == - THOR_JEDEC_ID)) - ae->un.SupportSpeed = HBA_PORTSPEED_2GBIT; - else - ae->un.SupportSpeed = HBA_PORTSPEED_1GBIT; + if (phba->lmt & LMT_8Gb) + ae->un.SupportSpeed |= HBA_PORTSPEED_8GBIT; + if (phba->lmt & LMT_4Gb) + ae->un.SupportSpeed |= HBA_PORTSPEED_4GBIT; + if (phba->lmt & LMT_2Gb) + ae->un.SupportSpeed |= HBA_PORTSPEED_2GBIT; + if (phba->lmt & LMT_1Gb) + ae->un.SupportSpeed |= HBA_PORTSPEED_1GBIT; + pab->ab.EntryCnt++; size += FOURBYTES + 4; @@ -1039,7 +1075,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) size); ae->ad.bits.AttrType = be16_to_cpu(HOST_NAME); sprintf(ae->un.HostName, "%s", - system_utsname.nodename); + init_utsname()->nodename); len = strlen(ae->un.HostName); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = @@ -1105,24 +1141,34 @@ fdmi_cmd_exit: return 1; } - void lpfc_fdmi_tmo(unsigned long ptr) { - struct lpfc_hba *phba = (struct lpfc_hba*)ptr; - struct lpfc_nodelist *ndlp; + struct lpfc_hba *phba = (struct lpfc_hba *)ptr; unsigned long iflag; spin_lock_irqsave(phba->host->host_lock, iflag); + if (!(phba->work_hba_events & WORKER_FDMI_TMO)) { + phba->work_hba_events |= WORKER_FDMI_TMO; + if (phba->work_wait) + wake_up(phba->work_wait); + } + spin_unlock_irqrestore(phba->host->host_lock,iflag); +} + +void +lpfc_fdmi_tmo_handler(struct lpfc_hba *phba) +{ + struct lpfc_nodelist *ndlp; + ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, FDMI_DID); if (ndlp) { - if (system_utsname.nodename[0] != '\0') { + if (init_utsname()->nodename[0] != '\0') { lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_DHBA); } else { - mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); + mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); } } - spin_unlock_irqrestore(phba->host->host_lock, iflag); return; } @@ -1138,7 +1184,7 @@ lpfc_decode_firmware_rev(struct lpfc_hba * phba, char *fwrevision, int flag) uint8_t *fwname; if (vp->rev.rBit) { - if (psli->sliinit.sli_flag & LPFC_SLI2_ACTIVE) + if (psli->sli_flag & LPFC_SLI2_ACTIVE) rev = vp->rev.sli2FwRev; else rev = vp->rev.sli1FwRev; @@ -1164,13 +1210,13 @@ lpfc_decode_firmware_rev(struct lpfc_hba * phba, char *fwrevision, int flag) } b4 = (rev & 0x0000000f); - if (psli->sliinit.sli_flag & LPFC_SLI2_ACTIVE) + if (psli->sli_flag & LPFC_SLI2_ACTIVE) fwname = vp->rev.sli2FwName; else fwname = vp->rev.sli1FwName; for (i = 0; i < 16; i++) - if(fwname[i] == 0x20) + if (fwname[i] == 0x20) fwname[i] = 0; ptr = (uint32_t*)fwname; @@ -1212,77 +1258,3 @@ lpfc_decode_firmware_rev(struct lpfc_hba * phba, char *fwrevision, int flag) } return; } - -void -lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) -{ - lpfc_vpd_t *vp; - uint32_t id; - char str[16]; - - vp = &phba->vpd; - pci_read_config_dword(phba->pcidev, PCI_VENDOR_ID, &id); - - switch ((id >> 16) & 0xffff) { - case PCI_DEVICE_ID_SUPERFLY: - if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) - strcpy(str, "LP7000 1"); - else - strcpy(str, "LP7000E 1"); - break; - case PCI_DEVICE_ID_DRAGONFLY: - strcpy(str, "LP8000 1"); - break; - case PCI_DEVICE_ID_CENTAUR: - if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) - strcpy(str, "LP9002 2"); - else - strcpy(str, "LP9000 1"); - break; - case PCI_DEVICE_ID_RFLY: - strcpy(str, "LP952 2"); - break; - case PCI_DEVICE_ID_PEGASUS: - strcpy(str, "LP9802 2"); - break; - case PCI_DEVICE_ID_THOR: - strcpy(str, "LP10000 2"); - break; - case PCI_DEVICE_ID_VIPER: - strcpy(str, "LPX1000 10"); - break; - case PCI_DEVICE_ID_PFLY: - strcpy(str, "LP982 2"); - break; - case PCI_DEVICE_ID_TFLY: - strcpy(str, "LP1050 2"); - break; - case PCI_DEVICE_ID_HELIOS: - strcpy(str, "LP11000 4"); - break; - case PCI_DEVICE_ID_BMID: - strcpy(str, "LP1150 4"); - break; - case PCI_DEVICE_ID_BSMB: - strcpy(str, "LP111 4"); - break; - case PCI_DEVICE_ID_ZEPHYR: - strcpy(str, "LP11000e 4"); - break; - case PCI_DEVICE_ID_ZMID: - strcpy(str, "LP1150e 4"); - break; - case PCI_DEVICE_ID_ZSMB: - strcpy(str, "LP111e 4"); - break; - case PCI_DEVICE_ID_LP101: - strcpy(str, "LP101 2"); - break; - } - if (mdp) - sscanf(str, "%s", mdp); - if (descp) - sprintf(descp, "Emulex LightPulse %s Gigabit PCI Fibre " - "Channel Adapter", str); -} -