bfad_bsg.c revision 5a54b1d576d1880eb249e906e0c8e2ffe64506d3
1b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* 2b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. 3b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * All rights reserved 4b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * www.brocade.com 5b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * 6b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Linux driver for Brocade Fibre Channel Host Bus Adapter. 7b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * 8b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * This program is free software; you can redistribute it and/or modify it 9b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * under the terms of the GNU General Public License (GPL) Version 2 as 10b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * published by the Free Software Foundation 11b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * 12b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * This program is distributed in the hope that it will be useful, but 13b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * WITHOUT ANY WARRANTY; without even the implied warranty of 14b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * General Public License for more details. 16b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 17b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 18b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include <linux/uaccess.h> 19b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_drv.h" 20b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_im.h" 21b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_bsg.h" 22b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 23b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna GudipatiBFA_TRC_FILE(LDRV, BSG); 24b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 25b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* bfad_im_bsg_get_kobject - increment the bfa refcnt */ 26b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic void 27b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_get_kobject(struct fc_bsg_job *job) 28b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 29b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct Scsi_Host *shost = job->shost; 30b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 31b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 32b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(shost->host_lock, flags); 33b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati __module_get(shost->dma_dev->driver->owner); 34b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(shost->host_lock, flags); 35b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 36b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 37b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* bfad_im_bsg_put_kobject - decrement the bfa refcnt */ 38b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic void 39b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_put_kobject(struct fc_bsg_job *job) 40b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 41b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct Scsi_Host *shost = job->shost; 42b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 43b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 44b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(shost->host_lock, flags); 45b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati module_put(shost->dma_dev->driver->owner); 46b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(shost->host_lock, flags); 47b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 48b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 49601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 50601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd) 51601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 52601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 53601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati int rc = 0; 54601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 55601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 56601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 57601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati /* If IOC is not in disabled state - return */ 58601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) { 59601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 60601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_IOC_FAILURE; 61601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return rc; 62601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 63601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 64601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati init_completion(&bfad->enable_comp); 65601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_iocfc_enable(&bfad->bfa); 66601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 67601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 68601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati wait_for_completion(&bfad->enable_comp); 69601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 70601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return rc; 71601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 72601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 73601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 74601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd) 75601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 76601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 77601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati int rc = 0; 78601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 79601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 80601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 81601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (bfad->disable_active) { 82601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 83601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return EBUSY; 84601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 85601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 86601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfad->disable_active = BFA_TRUE; 87601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati init_completion(&bfad->disable_comp); 88601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_iocfc_disable(&bfad->bfa); 89601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 90601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 91601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati wait_for_completion(&bfad->disable_comp); 92601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfad->disable_active = BFA_FALSE; 93601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 94601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 95601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return rc; 96601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 97601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 98b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 99b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd) 100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int i; 102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd; 103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_im_port_s *im_port; 104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_port_attr_s pattr; 105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcport_get_attr(&bfad->bfa, &pattr); 109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->nwwn = pattr.nwwn; 110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->pwwn = pattr.pwwn; 111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->ioc_type = bfa_get_type(&bfad->bfa); 112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->mac = bfa_get_mac(&bfad->bfa); 113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa); 114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum); 115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->factorynwwn = pattr.factorynwwn; 116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->factorypwwn = pattr.factorypwwn; 117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati im_port = bfad->pport.im_port; 118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->host = im_port->shost->host_no; 119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->name, bfad->adapter_name); 122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->port_name, bfad->port_name); 123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->hwpath, bfad->pci_name); 124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* set adapter hw path */ 126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->adapter_hwpath, bfad->pci_name); 127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati i = strlen(iocmd->adapter_hwpath) - 1; 128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati while (iocmd->adapter_hwpath[i] != '.') 129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati i--; 130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->adapter_hwpath[i] = '\0'; 131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd) 137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd; 139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 141b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 142b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr); 143b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 144b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 145b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* fill in driver attr info */ 146b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME); 147b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strncpy(iocmd->ioc_attr.driver_attr.driver_ver, 148b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati BFAD_DRIVER_VERSION, BFA_VERSION_LEN); 149b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.fw_ver, 150b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->ioc_attr.adapter_attr.fw_ver); 151b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.bios_ver, 152b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->ioc_attr.adapter_attr.optrom_ver); 153b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 154b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* copy chip rev info first otherwise it will be overwritten */ 155b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev, 156b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(bfad->pci_attr.chip_rev)); 157b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr, 158b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct bfa_ioc_pci_attr_s)); 159b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 160b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 161b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 162b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 163b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 164601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 165601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd) 166601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 167601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd; 168601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 169601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats); 170601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 171601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 172601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 173601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 174601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 175601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd, 176601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned int payload_len) 177601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 178601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_ioc_fwstats_s *iocmd = 179601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_ioc_fwstats_s *)cmd; 180601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati void *iocmd_bufptr; 181601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 182601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 183601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 184601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_bsg_ioc_fwstats_s), 185601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) { 186601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 187601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 188601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 189601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 190601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s); 191601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 192601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr); 193601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 194601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 195601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 196601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, iocmd->status); 197601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 198601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 199601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 200601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0x6666); 201601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 202601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 203601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 204601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 205601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd) 206601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 207601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd; 208601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 209601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 210601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr); 211601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 212601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 213601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 214601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 215601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 216601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd) 217601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 218601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd; 219601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 220601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 221601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 222601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr); 223601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 224601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 225601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 226601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 227601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 228601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 229601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd) 230601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 231601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 232601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfad_hal_comp fcomp; 233601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 234601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 235601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati init_completion(&fcomp.comp); 236601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 237601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_port_enable(&bfad->bfa.modules.port, 238601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfad_hcb_comp, &fcomp); 239601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 240601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 241601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, iocmd->status); 242601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 243601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 244601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati wait_for_completion(&fcomp.comp); 245601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = fcomp.status; 246601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 247601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 248601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 249601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 250601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd) 251601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 252601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 253601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfad_hal_comp fcomp; 254601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 255601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 256601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati init_completion(&fcomp.comp); 257601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 258601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_port_disable(&bfad->bfa.modules.port, 259601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfad_hcb_comp, &fcomp); 260601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 261601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 262601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 263601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, iocmd->status); 264601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 265601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 266601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati wait_for_completion(&fcomp.comp); 267601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = fcomp.status; 268601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 269601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 270601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 271b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 272b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd) 273b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 274b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd; 275b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_lport_attr_s port_attr; 276b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 277b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 278b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 279b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr); 280b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr); 281b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 282b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 283b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE) 284b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->attr.pid = port_attr.pid; 285b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati else 286b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->attr.pid = 0; 287b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 288b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->attr.port_type = port_attr.port_type; 289b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->attr.loopback = port_attr.loopback; 290b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->attr.authfail = port_attr.authfail; 291b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati strncpy(iocmd->attr.port_symname.symname, 292b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati port_attr.port_cfg.sym_name.symname, 293b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(port_attr.port_cfg.sym_name.symname)); 294b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 295b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 296b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 297b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 298b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 299601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 300601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd, 301601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned int payload_len) 302601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 303601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd; 304601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfad_hal_comp fcomp; 305601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati void *iocmd_bufptr; 306601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 307601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 308601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 309601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_bsg_port_stats_s), 310601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) { 311601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 312601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 313601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 314601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 315601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s); 316601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 317601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati init_completion(&fcomp.comp); 318601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 319601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port, 320601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd_bufptr, bfad_hcb_comp, &fcomp); 321601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 322601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 323601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, iocmd->status); 324601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 325601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 326601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 327601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati wait_for_completion(&fcomp.comp); 328601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = fcomp.status; 329601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 330601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 331601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 332601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 333b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 334b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd) 335b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 336b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_lport_s *fcs_port; 337b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd; 338b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 339b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 340b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 341b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 342b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->vf_id, iocmd->pwwn); 343b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_port == NULL) { 344b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 345b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 346b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 347b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 348b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 349b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr); 350b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 351b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 352b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 353b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 354b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 355b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 356601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 357601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd) 358601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 359601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 360601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_lport_stats_s *iocmd = 361601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_lport_stats_s *)cmd; 362601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 363601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 364601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 365601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 366601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 367601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_port == NULL) { 368601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 369601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 370601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 371601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 372601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 373601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats); 374601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 375601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 376601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 377601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 378601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 379601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 380601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 381601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd) 382601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 383601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 384601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_lport_iostats_s *iocmd = 385601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_lport_iostats_s *)cmd; 386601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 387601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 388601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 389601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 390601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 391601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_port == NULL) { 392601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 393601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 394601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 395601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 396601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 397601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats, 398601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port->lp_tag); 399601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 400601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 401601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 402601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 403601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 404601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 405601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 406601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd, 407601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned int payload_len) 408601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 409601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_lport_get_rports_s *iocmd = 410601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_lport_get_rports_s *)cmd; 411601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 412601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 413601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati void *iocmd_bufptr; 414601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 415601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (iocmd->nrports == 0) 416601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return EINVAL; 417601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 418601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 419601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_bsg_lport_get_rports_s), 420601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(wwn_t) * iocmd->nrports) != BFA_STATUS_OK) { 421601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 422601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 423601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 424601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 425601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd_bufptr = (char *)iocmd + 426601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_bsg_lport_get_rports_s); 427601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 428601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 429601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 430601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_port == NULL) { 431601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 432601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 433601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 434601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 435601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 436601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 437601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcs_lport_get_rports(fcs_port, (wwn_t *)iocmd_bufptr, 438601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati &iocmd->nrports); 439601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 440601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 441601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 442601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 443601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 444601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 445601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd) 447601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 448601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd; 449601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 450601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 451601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 452601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 453601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 454601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 455601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 456601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_port == NULL) { 457601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 458601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 459601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 460601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 461601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 462601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 463601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 464601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_rport == NULL) { 465601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 466601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 467601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 468601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 469601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 470601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 471601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr); 472601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 473601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 474601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 475601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 476601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 477601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 478b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 479b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd) 480b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 481b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_rport_scsi_addr_s *iocmd = 482b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfa_bsg_rport_scsi_addr_s *)cmd; 483b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_lport_s *fcs_port; 484b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_itnim_s *fcs_itnim; 485b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_itnim_s *drv_itnim; 486b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 487b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 488b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 489b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 490b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->vf_id, iocmd->pwwn); 491b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_port == NULL) { 492b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_trc(bfad, 0); 493b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 494b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 495b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 496b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 497b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 498b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 499b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_itnim == NULL) { 500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_trc(bfad, 0); 501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_itnim = fcs_itnim->itnim_drv; 507b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 508b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_itnim && drv_itnim->im_port) 509b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->host = drv_itnim->im_port->shost->host_no; 510b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati else { 511b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_trc(bfad, 0); 512b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->target = drv_itnim->scsi_tgt_id; 518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 519b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 520b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->bus = 0; 521b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->lun = 0; 522b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 523b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 524b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 525b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 526b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 527601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 528601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd) 529601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 530601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_rport_stats_s *iocmd = 531601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_rport_stats_s *)cmd; 532601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 533601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 534601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 535601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 536601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 537601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 538601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 539601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_port == NULL) { 540601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 541601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 542601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 543601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 544601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 545601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (fcs_rport == NULL) { 548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 549601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 550601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 551601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati goto out; 552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats, 555601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_rport_stats_s)); 556601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memcpy((void *)&iocmd->stats.hal_stats, 557601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats), 558601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_rport_hal_stats_s)); 559601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 560601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 561601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 562601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout: 563601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 564601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 565601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 567b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd, 568b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned int payload_len) 569b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 570b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_fabric_get_lports_s *iocmd = 571b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfa_bsg_fabric_get_lports_s *)cmd; 572b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcs_vf_t *fcs_vf; 573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t nports = iocmd->nports; 574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati void *iocmd_bufptr; 576b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 577b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (nports == 0) { 578b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_EINVAL; 579b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 580b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 581b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 582b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 583b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct bfa_bsg_fabric_get_lports_s), 584b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(wwn_t[iocmd->nports])) != BFA_STATUS_OK) { 585b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 586b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 587b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 588b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 589b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd_bufptr = (char *)iocmd + 590b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct bfa_bsg_fabric_get_lports_s); 591b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 592b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 593b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id); 594b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_vf == NULL) { 595b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 596b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VFID; 597b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 598b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 599b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports); 600b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 601b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 602b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->nports = nports; 603b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_OK; 604b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 605b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 606b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 607b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 608601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 609601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd) 610601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 611601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_fcpim_modstats_s *iocmd = 612601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_fcpim_modstats_s *)cmd; 613601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 614601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct list_head *qe, *qen; 615601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_itnim_s *itnim; 616601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 617601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 618601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 619601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati /* accumulate IO stats from itnim */ 620601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s)); 621601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 622601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 623601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats)); 624601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 625601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 626601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 627601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 628601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 629601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 630601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 631601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd) 632601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 633601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_fcpim_del_itn_stats_s *iocmd = 634601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_fcpim_del_itn_stats_s *)cmd; 635601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 636601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 637601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 638601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 639601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats, 640601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_fcpim_del_itn_stats_s)); 641601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 642601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 643601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 644601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 645601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 646601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 647b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 648b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd) 649b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 650b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd; 651b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_lport_s *fcs_port; 652b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 653b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 654b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 655b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 656b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->vf_id, iocmd->lpwwn); 657b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!fcs_port) 658b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 659b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati else 660b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->status = bfa_fcs_itnim_attr_get(fcs_port, 661b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati iocmd->rpwwn, &iocmd->attr); 662b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 663b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return 0; 664b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 665b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 666601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int 667601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd) 668601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 669601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_itnim_iostats_s *iocmd = 670601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_itnim_iostats_s *)cmd; 671601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 672601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 673601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 674601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 675601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 676601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 677601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 678601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (!fcs_port) { 679601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 680601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 681601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } else { 682601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 683601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (itnim == NULL) 684601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 685601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati else { 686601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 687601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memcpy((void *)&iocmd->iostats, (void *) 688601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati &(bfa_fcs_itnim_get_halitn(itnim)->stats), 689601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati sizeof(struct bfa_itnim_iostats_s)); 690601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 691601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 692601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 693601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 694601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 695601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 696601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int 697601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd) 698601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 699601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_itnim_itnstats_s *iocmd = 700601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (struct bfa_bsg_itnim_itnstats_s *)cmd; 701601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 702601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 703601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 704601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 705601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 706601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 707601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 708601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (!fcs_port) { 709601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 710601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_trc(bfad, 0); 711601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } else { 712601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 713601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (itnim == NULL) 714601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 715601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati else { 716601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = BFA_STATUS_OK; 717601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn, 718601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati &iocmd->itnstats); 719601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 720601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 721601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 722601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 723601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 724601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 725601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 726601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd) 727601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 728601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 729601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 730601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 731601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 732601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_fcport_enable(&bfad->bfa); 733601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 734601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 735601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 736601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 737601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 738601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint 739601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd) 740601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 741601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 742601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati unsigned long flags; 743601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 744601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 745601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati iocmd->status = bfa_fcport_disable(&bfad->bfa); 746601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 747601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 748601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return 0; 749601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 750601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 7511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 7521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd) 7531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 7541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd; 7551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 7561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags; 7571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 7591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 7601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk, 7611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati &iocmd->pcifn_cfg, 7621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 7631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 7641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 7651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 7661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 7681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 7691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 7701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 7711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 7721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 7741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd) 7751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 7761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 7771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 7781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags; 7791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 7811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 7821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk, 7831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati &iocmd->pcifn_id, iocmd->port, 7841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->pcifn_class, iocmd->bandwidth, 7851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 7861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 7871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 7881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 7891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 7911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 7921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 7931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 7941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 7951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 7961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 7971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd) 7981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 7991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 8001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 8011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags; 8021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 8041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 8051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk, 8061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->pcifn_id, 8071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 8081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 8091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 8101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 8111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 8131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 8141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 8151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 8161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 8171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 8191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd) 8201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 8211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 8221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 8231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags; 8241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 8261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 8271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk, 8281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->pcifn_id, iocmd->bandwidth, 8291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 8301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 8311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(bfad, iocmd->status); 8321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 8331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 8341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 8361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 8371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(bfad, iocmd->status); 8381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 8391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 8401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 8411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 8431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd) 8441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 8451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_adapter_cfg_mode_s *iocmd = 8461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati (struct bfa_bsg_adapter_cfg_mode_s *)cmd; 8471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 8481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags = 0; 8491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 8511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 8521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk, 8531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->cfg.mode, iocmd->cfg.max_pf, 8541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp); 8551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 8561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 8571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 8581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 8601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 8611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 8621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 8631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 8641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 8661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd) 8671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 8681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_port_cfg_mode_s *iocmd = 8691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati (struct bfa_bsg_port_cfg_mode_s *)cmd; 8701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 8711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags = 0; 8721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 8741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 8751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk, 8761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->instance, iocmd->cfg.mode, 8771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->cfg.max_pf, iocmd->cfg.max_vf, 8781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 8791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 8801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 8811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 8821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 8841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 8851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 8861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 8871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 8881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint 8901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd) 8911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 8921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd; 8931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfad_hal_comp fcomp; 8941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati unsigned long flags; 8951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 8961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati init_completion(&fcomp.comp); 8971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 8981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (cmd == IOCMD_FLASH_ENABLE_OPTROM) 8991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk, 9001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 9011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati else 9021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk, 9031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfad_hcb_comp, &fcomp); 9041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 9051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 9061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 9071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati goto out; 9081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 9091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati wait_for_completion(&fcomp.comp); 9101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati iocmd->status = fcomp.status; 9111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout: 9121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return 0; 9131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 9141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 915a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint 916a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_enable(struct bfad_s *bfad, void *cmd) 917a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{ 918a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 919a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati unsigned long flags; 920a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfad_hal_comp fcomp; 921a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 922a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati init_completion(&fcomp.comp); 923a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = BFA_STATUS_OK; 924a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 925a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = bfa_faa_enable(&bfad->bfa, bfad_hcb_comp, &fcomp); 926a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 927a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 928a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 929a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati goto out; 930a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 931a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati wait_for_completion(&fcomp.comp); 932a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = fcomp.status; 933a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout: 934a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati return 0; 935a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati} 936a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 937a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint 938a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_disable(struct bfad_s *bfad, void *cmd) 939a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{ 940a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 941a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati unsigned long flags; 942a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfad_hal_comp fcomp; 943a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 944a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati init_completion(&fcomp.comp); 945a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = BFA_STATUS_OK; 946a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 947a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = bfa_faa_disable(&bfad->bfa, bfad_hcb_comp, &fcomp); 948a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 949a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 950a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 951a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati goto out; 952a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 953a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati wait_for_completion(&fcomp.comp); 954a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = fcomp.status; 955a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout: 956a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati return 0; 957a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati} 958a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 959a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint 960a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd) 961a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{ 962a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd; 963a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati struct bfad_hal_comp fcomp; 964a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati unsigned long flags; 965a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 966a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati init_completion(&fcomp.comp); 967a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = BFA_STATUS_OK; 968a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 969a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr, 970a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati bfad_hcb_comp, &fcomp); 971a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 972a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 973a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 974a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati goto out; 975a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 976a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati wait_for_completion(&fcomp.comp); 977a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati iocmd->status = fcomp.status; 978a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout: 979a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati return 0; 980a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati} 981a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati 982148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint 983148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 984148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{ 985148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati struct bfa_bsg_cee_attr_s *iocmd = 986148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati (struct bfa_bsg_cee_attr_s *)cmd; 987148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati void *iocmd_bufptr; 988148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati struct bfad_hal_comp cee_comp; 989148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati unsigned long flags; 990148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 991148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 992148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati sizeof(struct bfa_bsg_cee_attr_s), 993148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) { 994148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 995148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati return 0; 996148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati } 997148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 998148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s); 999148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1000148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati cee_comp.status = 0; 1001148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati init_completion(&cee_comp.comp); 1002148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_lock(&bfad_mutex); 1003148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1004148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr, 1005148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati bfad_hcb_comp, &cee_comp); 1006148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1007148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 1008148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_unlock(&bfad_mutex); 1009148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati bfa_trc(bfad, 0x5555); 1010148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati goto out; 1011148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati } 1012148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati wait_for_completion(&cee_comp.comp); 1013148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_unlock(&bfad_mutex); 1014148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout: 1015148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati return 0; 1016148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati} 1017148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1018148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint 1019148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd, 1020148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati unsigned int payload_len) 1021148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{ 1022148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati struct bfa_bsg_cee_stats_s *iocmd = 1023148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati (struct bfa_bsg_cee_stats_s *)cmd; 1024148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati void *iocmd_bufptr; 1025148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati struct bfad_hal_comp cee_comp; 1026148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati unsigned long flags; 1027148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1028148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 1029148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati sizeof(struct bfa_bsg_cee_stats_s), 1030148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) { 1031148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 1032148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati return 0; 1033148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati } 1034148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1035148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s); 1036148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1037148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati cee_comp.status = 0; 1038148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati init_completion(&cee_comp.comp); 1039148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_lock(&bfad_mutex); 1040148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1041148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr, 1042148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati bfad_hcb_comp, &cee_comp); 1043148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1044148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 1045148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_unlock(&bfad_mutex); 1046148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati bfa_trc(bfad, 0x5555); 1047148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati goto out; 1048148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati } 1049148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati wait_for_completion(&cee_comp.comp); 1050148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati mutex_unlock(&bfad_mutex); 1051148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout: 1052148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati return 0; 1053148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati} 1054148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1055148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint 1056148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd) 1057148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{ 1058148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 1059148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati unsigned long flags; 1060148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 1061148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1062148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL); 1063148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1064148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 1065148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati bfa_trc(bfad, 0x5555); 1066148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati return 0; 1067148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati} 1068148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati 106951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint 107051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd) 107151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 107251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd; 107351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfad_hal_comp fcomp; 107451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati unsigned long flags; 107551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 107651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati init_completion(&fcomp.comp); 107751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 107851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media, 107951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfad_hcb_comp, &fcomp); 108051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 108151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(bfad, iocmd->status); 108251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (iocmd->status != BFA_STATUS_SFP_NOT_READY) 108351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati goto out; 108451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 108551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati wait_for_completion(&fcomp.comp); 108651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati iocmd->status = fcomp.status; 108751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout: 108851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return 0; 108951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 109051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 109151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint 109251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd) 109351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 109451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd; 109551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfad_hal_comp fcomp; 109651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati unsigned long flags; 109751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 109851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati init_completion(&fcomp.comp); 109951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 110051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed, 110151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfad_hcb_comp, &fcomp); 110251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 110351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(bfad, iocmd->status); 110451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (iocmd->status != BFA_STATUS_SFP_NOT_READY) 110551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati goto out; 110651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati wait_for_completion(&fcomp.comp); 110751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati iocmd->status = fcomp.status; 110851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout: 110951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return 0; 111051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 111151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 11125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint 11135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd) 11145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 11155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_bsg_flash_attr_s *iocmd = 11165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati (struct bfa_bsg_flash_attr_s *)cmd; 11175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfad_hal_comp fcomp; 11185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned long flags; 11195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati init_completion(&fcomp.comp); 11215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 11225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr, 11235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfad_hcb_comp, &fcomp); 11245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 11255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 11265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati goto out; 11275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati wait_for_completion(&fcomp.comp); 11285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = fcomp.status; 11295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout: 11305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 11315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 11325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint 11345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd) 11355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 11365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 11375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfad_hal_comp fcomp; 11385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned long flags; 11395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati init_completion(&fcomp.comp); 11415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 11425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type, 11435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->instance, bfad_hcb_comp, &fcomp); 11445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 11455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 11465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati goto out; 11475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati wait_for_completion(&fcomp.comp); 11485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = fcomp.status; 11495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout: 11505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 11515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 11525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint 11545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd, 11555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned int payload_len) 11565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 11575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 11585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati void *iocmd_bufptr; 11595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfad_hal_comp fcomp; 11605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned long flags; 11615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 11635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati sizeof(struct bfa_bsg_flash_s), 11645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 11655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 11665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 11675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 11685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s); 11705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati init_completion(&fcomp.comp); 11725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 11735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), 11745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->type, iocmd->instance, iocmd_bufptr, 11755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->bufsz, 0, bfad_hcb_comp, &fcomp); 11765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 11775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 11785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati goto out; 11795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati wait_for_completion(&fcomp.comp); 11805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = fcomp.status; 11815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout: 11825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 11835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 11845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint 11865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd, 11875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned int payload_len) 11885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 11895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 11905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfad_hal_comp fcomp; 11915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati void *iocmd_bufptr; 11925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati unsigned long flags; 11935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 11945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 11955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati sizeof(struct bfa_bsg_flash_s), 11965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 11975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 11985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 11995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 12005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 12015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s); 12025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 12035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati init_completion(&fcomp.comp); 12045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type, 12065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0, 12075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfad_hcb_comp, &fcomp); 12085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati goto out; 12115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati wait_for_completion(&fcomp.comp); 12125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati iocmd->status = fcomp.status; 12135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout: 12145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 12155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 12165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 1217b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 1218b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, 1219b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned int payload_len) 1220b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1221b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = EINVAL; 1222b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1223b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati switch (cmd) { 1224601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_ENABLE: 1225601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_enable(bfad, iocmd); 1226601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1227601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_DISABLE: 1228601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_disable(bfad, iocmd); 1229601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1230b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_IOC_GET_INFO: 1231b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_ioc_get_info(bfad, iocmd); 1232b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1233b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_IOC_GET_ATTR: 1234b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_ioc_get_attr(bfad, iocmd); 1235b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1236601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_GET_STATS: 1237601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_get_stats(bfad, iocmd); 1238601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1239601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_GET_FWSTATS: 1240601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len); 1241601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1242601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOCFC_GET_ATTR: 1243601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd); 1244601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1245601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOCFC_SET_INTR: 1246601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd); 1247601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1248601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_ENABLE: 1249601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_enable(bfad, iocmd); 1250601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1251601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_DISABLE: 1252601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_disable(bfad, iocmd); 1253601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1254b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_PORT_GET_ATTR: 1255b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_port_get_attr(bfad, iocmd); 1256b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1257601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_GET_STATS: 1258601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len); 1259601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1260b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_LPORT_GET_ATTR: 1261b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_lport_get_attr(bfad, iocmd); 1262b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1263601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_STATS: 1264601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_stats(bfad, iocmd); 1265601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1266601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_IOSTATS: 1267601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_iostats(bfad, iocmd); 1268601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1269601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_RPORTS: 1270601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len); 1271601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1272601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_RPORT_GET_ATTR: 1273601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_rport_get_attr(bfad, iocmd); 1274601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1275b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_RPORT_GET_ADDR: 1276b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_rport_get_addr(bfad, iocmd); 1277b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1278601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_RPORT_GET_STATS: 1279601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_rport_get_stats(bfad, iocmd); 1280601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1281b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_FABRIC_GET_LPORTS: 1282b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len); 1283b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1284601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPIM_MODSTATS: 1285601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd); 1286601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1287601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPIM_DEL_ITN_STATS: 1288601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd); 1289601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1290b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_ITNIM_GET_ATTR: 1291b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_itnim_get_attr(bfad, iocmd); 1292b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1293601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_ITNIM_GET_IOSTATS: 1294601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd); 1295601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1296601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_ITNIM_GET_ITNSTATS: 1297601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd); 1298601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1299601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPORT_ENABLE: 1300601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcport_enable(bfad, iocmd); 1301601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1302601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPORT_DISABLE: 1303601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcport_disable(bfad, iocmd); 1304601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 13051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_IOC_PCIFN_CFG: 13061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd); 13071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_CREATE: 13091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_create(bfad, iocmd); 13101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_DELETE: 13121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_delete(bfad, iocmd); 13131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_BW: 13151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_bw(bfad, iocmd); 13161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_ADAPTER_CFG_MODE: 13181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd); 13191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PORT_CFG_MODE: 13211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_port_cfg_mode(bfad, iocmd); 13221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 13231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_FLASH_ENABLE_OPTROM: 13241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_FLASH_DISABLE_OPTROM: 13251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd); 13261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 1327a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_ENABLE: 1328a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_enable(bfad, iocmd); 1329a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1330a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_DISABLE: 1331a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_disable(bfad, iocmd); 1332a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1333a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_QUERY: 1334a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_query(bfad, iocmd); 1335a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1336148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_GET_ATTR: 1337148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len); 1338148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 1339148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_GET_STATS: 1340148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len); 1341148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 1342148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_RESET_STATS: 1343148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_reset_stats(bfad, iocmd); 1344148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 134551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case IOCMD_SFP_MEDIA: 134651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati rc = bfad_iocmd_sfp_media(bfad, iocmd); 134751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 134851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case IOCMD_SFP_SPEED: 134951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati rc = bfad_iocmd_sfp_speed(bfad, iocmd); 135051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 13515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_GET_ATTR: 13525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_get_attr(bfad, iocmd); 13535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 13545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_ERASE_PART: 13555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_erase_part(bfad, iocmd); 13565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 13575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_UPDATE_PART: 13585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len); 13595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 13605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_READ_PART: 13615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len); 13625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 1363b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati default: 1364b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = EINVAL; 1365b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1366b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1367b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return -rc; 1368b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1369b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1370b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 1371b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_vendor_request(struct fc_bsg_job *job) 1372b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1373b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t vendor_cmd = job->request->rqst_data.h_vendor.vendor_cmd[0]; 1374b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_im_port_s *im_port = 1375b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfad_im_port_s *) job->shost->hostdata[0]; 1376b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = im_port->bfad; 1377b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati void *payload_kbuf; 1378b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = -EINVAL; 1379b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1380b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate a temp buffer to hold the passed in user space command */ 1381b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 1382b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!payload_kbuf) { 1383b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1384b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1385b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1386b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1387b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the sg_list passed in to a linear buffer: holds the cmnd data */ 1388b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 1389b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.sg_cnt, payload_kbuf, 1390b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 1391b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1392b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Invoke IOCMD handler - to handle all the vendor command requests */ 1393b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf, 1394b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 1395b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc != BFA_STATUS_OK) 1396b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto error; 1397b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1398b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the response data to the job->reply_payload sg_list */ 1399b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 1400b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.sg_cnt, 1401b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati payload_kbuf, 1402b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len); 1403b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1404b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* free the command buffer */ 1405b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(payload_kbuf); 1406b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1407b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Fill the BSG job reply data */ 1408b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = job->reply_payload.payload_len; 1409b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = job->reply_payload.payload_len; 1410b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 1411b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1412b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->job_done(job); 1413b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1414b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatierror: 1415b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* free the command buffer */ 1416b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(payload_kbuf); 1417b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 1418b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 1419b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); 1420b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 1421b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1422b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1423b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1424b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* FC passthru call backs */ 1425b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64 1426b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid) 1427b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1428b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1429b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1430b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati u64 addr; 1431b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1432b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->req_sge + sgeid; 1433b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati addr = (u64)(size_t) sge->sg_addr; 1434b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return addr; 1435b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1436b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1437b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32 1438b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid) 1439b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1440b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1441b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1442b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1443b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->req_sge + sgeid; 1444b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return sge->sg_len; 1445b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1446b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1447b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64 1448b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid) 1449b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1450b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1451b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1452b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati u64 addr; 1453b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1454b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 1455b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati addr = (u64)(size_t) sge->sg_addr; 1456b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return addr; 1457b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1458b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1459b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32 1460b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid) 1461b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1462b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1463b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1464b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1465b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 1466b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return sge->sg_len; 1467b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1468b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1469b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid 1470b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg, 1471b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_status_t req_status, u32 rsp_len, u32 resid_len, 1472b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct fchs_s *rsp_fchs) 1473b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1474b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1475b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1476b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->req_status = req_status; 1477b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rsp_len = rsp_len; 1478b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1479b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* bfa_fcxp will be automatically freed by BFA */ 1480b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_fcxp = NULL; 1481b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati complete(&drv_fcxp->comp); 1482b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1483b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1484b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistruct bfad_buf_info * 1485b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf, 1486b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t payload_len, uint32_t *num_sgles) 1487b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1488b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *buf_base, *buf_info; 1489b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sg_table; 1490b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int sge_num = 1; 1491b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1492b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_base = kzalloc((sizeof(struct bfad_buf_info) + 1493b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct bfa_sge_s)) * sge_num, GFP_KERNEL); 1494b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!buf_base) 1495b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return NULL; 1496b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1497b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) + 1498b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * sge_num)); 1499b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate dma coherent memory */ 1501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info = buf_base; 1502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->size = payload_len; 1503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, buf_info->size, 1504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &buf_info->phys, GFP_KERNEL); 1505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!buf_info->virt) 1506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1507b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1508b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* copy the linear bsg buffer to buf_info */ 1509b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memset(buf_info->virt, 0, buf_info->size); 1510b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memcpy(buf_info->virt, payload_kbuf, buf_info->size); 1511b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1512b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* 1513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Setup SG table 1514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 1515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table->sg_len = buf_info->size; 1516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table->sg_addr = (void *)(size_t) buf_info->phys; 1517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati *num_sgles = sge_num; 1519b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1520b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return buf_base; 1521b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1522b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem: 1523b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(buf_base); 1524b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return NULL; 1525b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1526b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1527b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid 1528b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base, 1529b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t num_sgles) 1530b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1531b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int i; 1532b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *buf_info = buf_base; 1533b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1534b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (buf_base) { 1535b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati for (i = 0; i < num_sgles; buf_info++, i++) { 1536b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (buf_info->virt != NULL) 1537b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati dma_free_coherent(&bfad->pcidev->dev, 1538b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->size, buf_info->virt, 1539b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->phys); 1540b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1541b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(buf_base); 1542b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1543b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1544b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1545b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1546b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_bsg_send(struct fc_bsg_job *job, struct bfad_fcxp *drv_fcxp, 1547b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt) 1548b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1549b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcxp_s *hal_fcxp; 1550b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = drv_fcxp->port->bfad; 1551b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 1552b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint8_t lp_tag; 1553b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1554b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1555b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1556b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate bfa_fcxp structure */ 1557b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati hal_fcxp = bfa_fcxp_alloc(drv_fcxp, &bfad->bfa, 1558b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles, 1559b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles, 1560b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_req_sgaddr_cb, 1561b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_req_sglen_cb, 1562b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_rsp_sgaddr_cb, 1563b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_rsp_sglen_cb); 1564b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!hal_fcxp) { 1565b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_trc(bfad, 0); 1566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1567b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return BFA_STATUS_ENOMEM; 1568b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1569b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1570b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_fcxp = hal_fcxp; 1571b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1572b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id); 1573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag, 1575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->cts, bsg_fcpt->cos, 1576b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len, 1577b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad, 1578b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len, bsg_fcpt->tsecs); 1579b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1580b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1581b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1582b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return BFA_STATUS_OK; 1583b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1584b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1585b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1586b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_els_ct_request(struct fc_bsg_job *job) 1587b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1588b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_data *bsg_data; 1589b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_im_port_s *im_port = 1590b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfad_im_port_s *) job->shost->hostdata[0]; 1591b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = im_port->bfad; 1592b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt; 1593b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp; 1594b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_lport_s *fcs_port; 1595b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 1596b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t command_type = job->request->msgcode; 1597b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 1598b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *rsp_buf_info; 1599b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati void *req_kbuf = NULL, *rsp_kbuf = NULL; 1600b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = -EINVAL; 1601b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1602b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); /* Atleast uint32_t reply_len */ 1603b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 1604b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1605b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Get the payload passed in from userspace */ 1606b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data = (struct bfa_bsg_data *) (((char *)job->request) + 1607b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct fc_bsg_request)); 1608b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (bsg_data == NULL) 1609b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1610b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1611b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* 1612b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload 1613b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * buffer of size bsg_data->payload_len 1614b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 1615b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt = (struct bfa_bsg_fcpt_s *) 1616b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kzalloc(bsg_data->payload_len, GFP_KERNEL); 1617b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!bsg_fcpt) 1618b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1619b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1620b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (copy_from_user((uint8_t *)bsg_fcpt, bsg_data->payload, 1621b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data->payload_len)) { 1622b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(bsg_fcpt); 1623b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1624b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1625b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1626b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL); 1627b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp == NULL) { 1628b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1629b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1630b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1631b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1632b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1633b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id, 1634b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->lpwwn); 1635b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_port == NULL) { 1636b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN; 1637b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1638b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1639b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1640b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1641b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Check if the port is online before sending FC Passthru cmd */ 1642b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!bfa_fcs_lport_is_online(fcs_port)) { 1643b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE; 1644b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1645b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1646b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1647b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1648b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->port = fcs_port->bfad_port; 1649b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1650b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp->port->bfad == 0) 1651b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->port->bfad = bfad; 1652b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1653b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Fetch the bfa_rport - if nexus needed */ 1654b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (command_type == FC_BSG_HST_ELS_NOLOGIN || 1655b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati command_type == FC_BSG_HST_CT) { 1656b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* BSG HST commands: no nexus needed */ 1657b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_rport = NULL; 1658b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1659b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else if (command_type == FC_BSG_RPT_ELS || 1660b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati command_type == FC_BSG_RPT_CT) { 1661b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* BSG RPT commands: nexus needed */ 1662b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port, 1663b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->dpwwn); 1664b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_rport == NULL) { 1665b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN; 1666b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1667b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1668b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1669b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1670b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_rport = fcs_rport->bfa_rport; 1671b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1672b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { /* Unknown BSG msgcode; return -EINVAL */ 1673b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1674b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1675b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1676b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1677b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1678b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1679b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* allocate memory for req / rsp buffers */ 1680b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 1681b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!req_kbuf) { 1682b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n", 1683b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 1684b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1685b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1686b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1687b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1688b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL); 1689b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!rsp_kbuf) { 1690b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n", 1691b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 1692b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1693b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1694b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1695b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1696b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* map req sg - copy the sg_list passed in to the linear buffer */ 1697b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 1698b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.sg_cnt, req_kbuf, 1699b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 1700b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1701b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf, 1702b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len, 1703b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &drv_fcxp->num_req_sgles); 1704b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!drv_fcxp->reqbuf_info) { 1705b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n", 1706b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 1707b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1708b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1709b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1710b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1711b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->req_sge = (struct bfa_sge_s *) 1712b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (((uint8_t *)drv_fcxp->reqbuf_info) + 1713b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * 1714b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles)); 1715b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1716b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* map rsp sg */ 1717b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf, 1718b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len, 1719b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &drv_fcxp->num_rsp_sgles); 1720b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!drv_fcxp->rspbuf_info) { 1721b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n", 1722b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 1723b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1724b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1725b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1726b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1727b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info; 1728b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rsp_sge = (struct bfa_sge_s *) 1729b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (((uint8_t *)drv_fcxp->rspbuf_info) + 1730b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * 1731b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles)); 1732b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1733b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* fcxp send */ 1734b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati init_completion(&drv_fcxp->comp); 1735b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt); 1736b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc == BFA_STATUS_OK) { 1737b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati wait_for_completion(&drv_fcxp->comp); 1738b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = drv_fcxp->req_status; 1739b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { 1740b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = rc; 1741b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1742b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1743b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1744b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* fill the job->reply data */ 1745b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp->req_status == BFA_STATUS_OK) { 1746b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = drv_fcxp->rsp_len; 1747b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = drv_fcxp->rsp_len; 1748b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; 1749b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { 1750b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 1751b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct fc_bsg_ctels_reply); 1752b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); 1753b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_data.ctels_reply.status = 1754b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati FC_CTELS_STATUS_REJECT; 1755b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1756b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1757b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the response data to the reply_payload sg list */ 1758b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 1759b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.sg_cnt, 1760b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (uint8_t *)rsp_buf_info->virt, 1761b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len); 1762b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1763b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem: 1764b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info, 1765b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles); 1766b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info, 1767b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles); 1768b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(req_kbuf); 1769b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(rsp_kbuf); 1770b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1771b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Need a copy to user op */ 1772b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (copy_to_user(bsg_data->payload, (void *) bsg_fcpt, 1773b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data->payload_len)) 1774b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -EIO; 1775b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1776b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(bsg_fcpt); 1777b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(drv_fcxp); 1778b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 1779b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 1780b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1781b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc == BFA_STATUS_OK) 1782b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->job_done(job); 1783b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1784b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1785b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1786b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1787b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1788b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_request(struct fc_bsg_job *job) 1789b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1790b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t rc = BFA_STATUS_OK; 1791b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1792b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Increment the bfa module refcnt - if bsg request is in service */ 1793b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_im_bsg_get_kobject(job); 1794b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1795b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati switch (job->request->msgcode) { 1796b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_VENDOR: 1797b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Process BSG HST Vendor requests */ 1798b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_im_bsg_vendor_request(job); 1799b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1800b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_ELS_NOLOGIN: 1801b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_RPT_ELS: 1802b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_CT: 1803b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_RPT_CT: 1804b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Process BSG ELS/CT commands */ 1805b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_im_bsg_els_ct_request(job); 1806b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1807b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati default: 1808b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc = -EINVAL; 1809b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 1810b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1811b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1812b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1813b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Decrement the bfa module refcnt - on completion of bsg request */ 1814b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_im_bsg_put_kobject(job); 1815b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1816b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1817b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1818b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1819b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1820b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_timeout(struct fc_bsg_job *job) 1821b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1822b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Don't complete the BSG job request - return -EAGAIN 1823b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * to reset bsg job timeout : for ELS/CT pass thru we 1824b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * already have timer to track the request. 1825b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 1826b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return -EAGAIN; 1827b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1828