bfad_bsg.c revision 3350d98d6d072fc4ac3622e61dc3dc351ef01dc5
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 12173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 12183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd) 12193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 12203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_get_temp_s *iocmd = 12213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_get_temp_s *)cmd; 12223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 12233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 12243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 12263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa), 12283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 12293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 12313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 12333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 12343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 12353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 12363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 12373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 12383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 12403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd) 12413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 12423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_memtest_s *iocmd = 12433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_memtest_s *)cmd; 12443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 12453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 12463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 12483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa), 12503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati &iocmd->memtest, iocmd->pat, 12513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 12523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 12543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 12563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 12573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 12583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 12593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 12603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 12613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 12633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd) 12643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 12653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_loopback_s *iocmd = 12663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_loopback_s *)cmd; 12673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 12683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 12693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 12713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode, 12733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->speed, iocmd->lpcnt, iocmd->pat, 12743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 12753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 12773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 12793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 12803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 12813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 12823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 12833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 12843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 12863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd) 12873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 12883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_fwping_s *iocmd = 12893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_fwping_s *)cmd; 12903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 12913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 12923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 12933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 12943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt, 12963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->pattern, &iocmd->result, 12973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfad_hcb_comp, &fcomp); 12983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 13003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 13013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 13023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, 0x77771); 13033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 13043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 13053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 13063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 13103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd) 13113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 13123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd; 13133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 13143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 13153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 13173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force, 13193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->queue, &iocmd->result, 13203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfad_hcb_comp, &fcomp); 13213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 13233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 13243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 13253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 13263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 13273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 13313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd) 13323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 13333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_sfp_show_s *iocmd = 13343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_sfp_show_s *)cmd; 13353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfad_hal_comp fcomp; 13363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 13373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati init_completion(&fcomp.comp); 13393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp, 13413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfad_hcb_comp, &fcomp); 13423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 13443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 13453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati goto out; 13463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati wait_for_completion(&fcomp.comp); 13473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = fcomp.status; 13483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 13493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout: 13503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 13543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd) 13553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 13563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd; 13573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 13583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa), 13613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati &iocmd->ledtest); 13623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 13673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd) 13683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 13693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_beacon_s *iocmd = 13703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_beacon_s *)cmd; 13713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 13723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa), 13753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->beacon, iocmd->link_e2e_beacon, 13763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->second); 13773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint 13823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd) 13833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 13843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_bsg_diag_lb_stat_s *iocmd = 13853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati (struct bfa_bsg_diag_lb_stat_s *)cmd; 13863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati unsigned long flags; 13873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa); 13903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(bfad, iocmd->status); 13923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return 0; 13943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 13953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 13963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint 13973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd) 13983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 13993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_bsg_phy_attr_s *iocmd = 14003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfa_bsg_phy_attr_s *)cmd; 14013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfad_hal_comp fcomp; 14023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati unsigned long flags; 14033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati init_completion(&fcomp.comp); 14053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 14063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance, 14073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati &iocmd->attr, bfad_hcb_comp, &fcomp); 14083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 14093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 14103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati goto out; 14113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati wait_for_completion(&fcomp.comp); 14123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = fcomp.status; 14133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout: 14143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 14163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint 14183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd) 14193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 14203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_bsg_phy_stats_s *iocmd = 14213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfa_bsg_phy_stats_s *)cmd; 14223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfad_hal_comp fcomp; 14233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati unsigned long flags; 14243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati init_completion(&fcomp.comp); 14263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 14273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance, 14283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati &iocmd->stats, bfad_hcb_comp, &fcomp); 14293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 14303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 14313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati goto out; 14323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati wait_for_completion(&fcomp.comp); 14333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = fcomp.status; 14343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout: 14353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 14373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint 14393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 14403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 14413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd; 14423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfad_hal_comp fcomp; 14433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati void *iocmd_bufptr; 14443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati unsigned long flags; 14453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 14473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati sizeof(struct bfa_bsg_phy_s), 14483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 14493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 14503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 14523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s); 14543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati init_completion(&fcomp.comp); 14553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 14563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa), 14573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 14583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 0, bfad_hcb_comp, &fcomp); 14593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 14603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 14613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati goto out; 14623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati wait_for_completion(&fcomp.comp); 14633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = fcomp.status; 14643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 14653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati goto out; 14663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout: 14673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 14693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint 14713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 14723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 14733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd; 14743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati void *iocmd_bufptr; 14753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfad_hal_comp fcomp; 14763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati unsigned long flags; 14773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 14793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati sizeof(struct bfa_bsg_phy_s), 14803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 14813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 14823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 14843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 14853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s); 14863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati init_completion(&fcomp.comp); 14873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 14883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa), 14893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 14903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 0, bfad_hcb_comp, &fcomp); 14913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 14923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (iocmd->status != BFA_STATUS_OK) 14933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati goto out; 14943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati wait_for_completion(&fcomp.comp); 14953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati iocmd->status = fcomp.status; 14963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout: 14973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 14983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 14993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 1500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 1501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, 1502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned int payload_len) 1503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = EINVAL; 1505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati switch (cmd) { 1507601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_ENABLE: 1508601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_enable(bfad, iocmd); 1509601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1510601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_DISABLE: 1511601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_disable(bfad, iocmd); 1512601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_IOC_GET_INFO: 1514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_ioc_get_info(bfad, iocmd); 1515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_IOC_GET_ATTR: 1517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_ioc_get_attr(bfad, iocmd); 1518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1519601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_GET_STATS: 1520601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_get_stats(bfad, iocmd); 1521601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1522601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOC_GET_FWSTATS: 1523601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len); 1524601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1525601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOCFC_GET_ATTR: 1526601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd); 1527601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1528601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_IOCFC_SET_INTR: 1529601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd); 1530601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1531601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_ENABLE: 1532601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_enable(bfad, iocmd); 1533601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1534601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_DISABLE: 1535601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_disable(bfad, iocmd); 1536601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1537b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_PORT_GET_ATTR: 1538b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_port_get_attr(bfad, iocmd); 1539b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1540601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_PORT_GET_STATS: 1541601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len); 1542601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1543b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_LPORT_GET_ATTR: 1544b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_lport_get_attr(bfad, iocmd); 1545b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_STATS: 1547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_stats(bfad, iocmd); 1548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1549601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_IOSTATS: 1550601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_iostats(bfad, iocmd); 1551601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_LPORT_GET_RPORTS: 1553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len); 1554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1555601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_RPORT_GET_ATTR: 1556601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_rport_get_attr(bfad, iocmd); 1557601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1558b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_RPORT_GET_ADDR: 1559b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_rport_get_addr(bfad, iocmd); 1560b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1561601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_RPORT_GET_STATS: 1562601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_rport_get_stats(bfad, iocmd); 1563601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1564b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_FABRIC_GET_LPORTS: 1565b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len); 1566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1567601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPIM_MODSTATS: 1568601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd); 1569601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1570601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPIM_DEL_ITN_STATS: 1571601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd); 1572601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case IOCMD_ITNIM_GET_ATTR: 1574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_itnim_get_attr(bfad, iocmd); 1575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1576601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_ITNIM_GET_IOSTATS: 1577601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd); 1578601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1579601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_ITNIM_GET_ITNSTATS: 1580601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd); 1581601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1582601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPORT_ENABLE: 1583601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcport_enable(bfad, iocmd); 1584601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 1585601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati case IOCMD_FCPORT_DISABLE: 1586601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati rc = bfad_iocmd_fcport_disable(bfad, iocmd); 1587601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati break; 15881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_IOC_PCIFN_CFG: 15891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd); 15901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 15911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_CREATE: 15921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_create(bfad, iocmd); 15931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 15941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_DELETE: 15951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_delete(bfad, iocmd); 15961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 15971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PCIFN_BW: 15981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_pcifn_bw(bfad, iocmd); 15991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 16001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_ADAPTER_CFG_MODE: 16011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd); 16021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 16031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_PORT_CFG_MODE: 16041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_port_cfg_mode(bfad, iocmd); 16051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 16061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_FLASH_ENABLE_OPTROM: 16071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case IOCMD_FLASH_DISABLE_OPTROM: 16081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd); 16091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 1610a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_ENABLE: 1611a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_enable(bfad, iocmd); 1612a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1613a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_DISABLE: 1614a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_disable(bfad, iocmd); 1615a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1616a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati case IOCMD_FAA_QUERY: 1617a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati rc = bfad_iocmd_faa_query(bfad, iocmd); 1618a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati break; 1619148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_GET_ATTR: 1620148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len); 1621148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 1622148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_GET_STATS: 1623148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len); 1624148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 1625148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati case IOCMD_CEE_RESET_STATS: 1626148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati rc = bfad_iocmd_cee_reset_stats(bfad, iocmd); 1627148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati break; 162851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case IOCMD_SFP_MEDIA: 162951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati rc = bfad_iocmd_sfp_media(bfad, iocmd); 163051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 163151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case IOCMD_SFP_SPEED: 163251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati rc = bfad_iocmd_sfp_speed(bfad, iocmd); 163351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 16345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_GET_ATTR: 16355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_get_attr(bfad, iocmd); 16365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 16375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_ERASE_PART: 16385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_erase_part(bfad, iocmd); 16395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 16405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_UPDATE_PART: 16415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len); 16425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 16435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case IOCMD_FLASH_READ_PART: 16445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len); 16455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 16463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_TEMP: 16473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_temp(bfad, iocmd); 16483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_MEMTEST: 16503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_memtest(bfad, iocmd); 16513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_LOOPBACK: 16533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_loopback(bfad, iocmd); 16543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_FWPING: 16563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_fwping(bfad, iocmd); 16573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_QUEUETEST: 16593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_queuetest(bfad, iocmd); 16603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_SFP: 16623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_sfp(bfad, iocmd); 16633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_LED: 16653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_led(bfad, iocmd); 16663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_BEACON_LPORT: 16683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd); 16693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case IOCMD_DIAG_LB_STAT: 16713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati rc = bfad_iocmd_diag_lb_stat(bfad, iocmd); 16723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 16733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case IOCMD_PHY_GET_ATTR: 16743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati rc = bfad_iocmd_phy_get_attr(bfad, iocmd); 16753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 16763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case IOCMD_PHY_GET_STATS: 16773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati rc = bfad_iocmd_phy_get_stats(bfad, iocmd); 16783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 16793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case IOCMD_PHY_UPDATE_FW: 16803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len); 16813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 16823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case IOCMD_PHY_READ_FW: 16833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len); 16843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 1685b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati default: 1686b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = EINVAL; 1687b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 1688b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1689b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return -rc; 1690b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1691b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1692b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int 1693b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_vendor_request(struct fc_bsg_job *job) 1694b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1695b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t vendor_cmd = job->request->rqst_data.h_vendor.vendor_cmd[0]; 1696b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_im_port_s *im_port = 1697b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfad_im_port_s *) job->shost->hostdata[0]; 1698b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = im_port->bfad; 1699b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati void *payload_kbuf; 1700b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = -EINVAL; 1701b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1702b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate a temp buffer to hold the passed in user space command */ 1703b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 1704b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!payload_kbuf) { 1705b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1706b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1707b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1708b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1709b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the sg_list passed in to a linear buffer: holds the cmnd data */ 1710b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 1711b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.sg_cnt, payload_kbuf, 1712b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 1713b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1714b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Invoke IOCMD handler - to handle all the vendor command requests */ 1715b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf, 1716b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 1717b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc != BFA_STATUS_OK) 1718b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto error; 1719b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1720b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the response data to the job->reply_payload sg_list */ 1721b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 1722b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.sg_cnt, 1723b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati payload_kbuf, 1724b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len); 1725b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1726b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* free the command buffer */ 1727b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(payload_kbuf); 1728b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1729b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Fill the BSG job reply data */ 1730b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = job->reply_payload.payload_len; 1731b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = job->reply_payload.payload_len; 1732b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 1733b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1734b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->job_done(job); 1735b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1736b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatierror: 1737b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* free the command buffer */ 1738b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(payload_kbuf); 1739b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 1740b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 1741b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); 1742b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 1743b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 1744b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1745b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1746b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* FC passthru call backs */ 1747b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64 1748b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid) 1749b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1750b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1751b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1752b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati u64 addr; 1753b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1754b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->req_sge + sgeid; 1755b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati addr = (u64)(size_t) sge->sg_addr; 1756b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return addr; 1757b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1758b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1759b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32 1760b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid) 1761b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1762b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1763b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1764b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1765b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->req_sge + sgeid; 1766b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return sge->sg_len; 1767b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1768b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1769b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64 1770b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid) 1771b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1772b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1773b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1774b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati u64 addr; 1775b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1776b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 1777b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati addr = (u64)(size_t) sge->sg_addr; 1778b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return addr; 1779b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1780b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1781b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32 1782b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid) 1783b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1784b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1785b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sge; 1786b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1787b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 1788b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return sge->sg_len; 1789b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1790b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1791b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid 1792b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg, 1793b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_status_t req_status, u32 rsp_len, u32 resid_len, 1794b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct fchs_s *rsp_fchs) 1795b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1796b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 1797b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1798b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->req_status = req_status; 1799b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rsp_len = rsp_len; 1800b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1801b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* bfa_fcxp will be automatically freed by BFA */ 1802b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_fcxp = NULL; 1803b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati complete(&drv_fcxp->comp); 1804b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1805b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1806b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistruct bfad_buf_info * 1807b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf, 1808b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t payload_len, uint32_t *num_sgles) 1809b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1810b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *buf_base, *buf_info; 1811b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_sge_s *sg_table; 1812b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int sge_num = 1; 1813b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1814b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_base = kzalloc((sizeof(struct bfad_buf_info) + 1815b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct bfa_sge_s)) * sge_num, GFP_KERNEL); 1816b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!buf_base) 1817b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return NULL; 1818b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1819b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) + 1820b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * sge_num)); 1821b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1822b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate dma coherent memory */ 1823b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info = buf_base; 1824b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->size = payload_len; 1825b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, buf_info->size, 1826b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &buf_info->phys, GFP_KERNEL); 1827b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!buf_info->virt) 1828b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1829b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1830b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* copy the linear bsg buffer to buf_info */ 1831b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memset(buf_info->virt, 0, buf_info->size); 1832b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati memcpy(buf_info->virt, payload_kbuf, buf_info->size); 1833b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1834b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* 1835b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Setup SG table 1836b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 1837b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table->sg_len = buf_info->size; 1838b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_table->sg_addr = (void *)(size_t) buf_info->phys; 1839b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1840b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati *num_sgles = sge_num; 1841b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1842b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return buf_base; 1843b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1844b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem: 1845b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(buf_base); 1846b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return NULL; 1847b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1848b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1849b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid 1850b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base, 1851b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t num_sgles) 1852b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1853b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int i; 1854b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *buf_info = buf_base; 1855b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1856b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (buf_base) { 1857b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati for (i = 0; i < num_sgles; buf_info++, i++) { 1858b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (buf_info->virt != NULL) 1859b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati dma_free_coherent(&bfad->pcidev->dev, 1860b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->size, buf_info->virt, 1861b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati buf_info->phys); 1862b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1863b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(buf_base); 1864b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1865b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1866b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1867b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1868b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_bsg_send(struct fc_bsg_job *job, struct bfad_fcxp *drv_fcxp, 1869b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt) 1870b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1871b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcxp_s *hal_fcxp; 1872b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = drv_fcxp->port->bfad; 1873b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 1874b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint8_t lp_tag; 1875b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1876b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1877b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1878b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Allocate bfa_fcxp structure */ 1879b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati hal_fcxp = bfa_fcxp_alloc(drv_fcxp, &bfad->bfa, 1880b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles, 1881b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles, 1882b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_req_sgaddr_cb, 1883b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_req_sglen_cb, 1884b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_rsp_sgaddr_cb, 1885b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_get_rsp_sglen_cb); 1886b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!hal_fcxp) { 1887b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_trc(bfad, 0); 1888b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1889b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return BFA_STATUS_ENOMEM; 1890b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1891b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1892b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_fcxp = hal_fcxp; 1893b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1894b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id); 1895b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1896b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag, 1897b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->cts, bsg_fcpt->cos, 1898b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len, 1899b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad, 1900b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len, bsg_fcpt->tsecs); 1901b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1902b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1903b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1904b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return BFA_STATUS_OK; 1905b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 1906b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1907b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 1908b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_els_ct_request(struct fc_bsg_job *job) 1909b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 1910b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_bsg_data *bsg_data; 1911b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_im_port_s *im_port = 1912b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (struct bfad_im_port_s *) job->shost->hostdata[0]; 1913b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_s *bfad = im_port->bfad; 1914b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt; 1915b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_fcxp *drv_fcxp; 1916b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_lport_s *fcs_port; 1917b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 1918b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t command_type = job->request->msgcode; 1919b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati unsigned long flags; 1920b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati struct bfad_buf_info *rsp_buf_info; 1921b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati void *req_kbuf = NULL, *rsp_kbuf = NULL; 1922b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati int rc = -EINVAL; 1923b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1924b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); /* Atleast uint32_t reply_len */ 1925b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 1926b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1927b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Get the payload passed in from userspace */ 1928b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data = (struct bfa_bsg_data *) (((char *)job->request) + 1929b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct fc_bsg_request)); 1930b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (bsg_data == NULL) 1931b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1932b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1933b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* 1934b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload 1935b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * buffer of size bsg_data->payload_len 1936b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 1937b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt = (struct bfa_bsg_fcpt_s *) 1938b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kzalloc(bsg_data->payload_len, GFP_KERNEL); 1939b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!bsg_fcpt) 1940b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1941b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1942b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (copy_from_user((uint8_t *)bsg_fcpt, bsg_data->payload, 1943b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data->payload_len)) { 1944b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(bsg_fcpt); 1945b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1946b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1947b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1948b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL); 1949b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp == NULL) { 1950b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 1951b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out; 1952b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1953b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1954b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1955b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id, 1956b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->lpwwn); 1957b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_port == NULL) { 1958b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN; 1959b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1960b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1961b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1962b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1963b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Check if the port is online before sending FC Passthru cmd */ 1964b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!bfa_fcs_lport_is_online(fcs_port)) { 1965b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE; 1966b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1967b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1968b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1969b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1970b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->port = fcs_port->bfad_port; 1971b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1972b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp->port->bfad == 0) 1973b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->port->bfad = bfad; 1974b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1975b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Fetch the bfa_rport - if nexus needed */ 1976b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (command_type == FC_BSG_HST_ELS_NOLOGIN || 1977b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati command_type == FC_BSG_HST_CT) { 1978b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* BSG HST commands: no nexus needed */ 1979b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_rport = NULL; 1980b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1981b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else if (command_type == FC_BSG_RPT_ELS || 1982b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati command_type == FC_BSG_RPT_CT) { 1983b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* BSG RPT commands: nexus needed */ 1984b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port, 1985b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->dpwwn); 1986b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (fcs_rport == NULL) { 1987b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN; 1988b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1989b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1990b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1991b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1992b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->bfa_rport = fcs_rport->bfa_rport; 1993b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1994b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { /* Unknown BSG msgcode; return -EINVAL */ 1995b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1996b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 1997b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 1998b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 1999b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2000b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2001b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* allocate memory for req / rsp buffers */ 2002b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 2003b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!req_kbuf) { 2004b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n", 2005b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 2006b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 2007b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 2008b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2009b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2010b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL); 2011b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!rsp_kbuf) { 2012b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n", 2013b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 2014b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 2015b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 2016b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2017b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2018b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* map req sg - copy the sg_list passed in to the linear buffer */ 2019b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 2020b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.sg_cnt, req_kbuf, 2021b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len); 2022b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2023b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf, 2024b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->request_payload.payload_len, 2025b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &drv_fcxp->num_req_sgles); 2026b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!drv_fcxp->reqbuf_info) { 2027b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n", 2028b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 2029b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 2030b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 2031b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2032b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2033b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->req_sge = (struct bfa_sge_s *) 2034b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (((uint8_t *)drv_fcxp->reqbuf_info) + 2035b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * 2036b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles)); 2037b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2038b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* map rsp sg */ 2039b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf, 2040b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len, 2041b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati &drv_fcxp->num_rsp_sgles); 2042b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (!drv_fcxp->rspbuf_info) { 2043b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n", 2044b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad->pci_name); 2045b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -ENOMEM; 2046b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 2047b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2048b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2049b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info; 2050b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->rsp_sge = (struct bfa_sge_s *) 2051b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (((uint8_t *)drv_fcxp->rspbuf_info) + 2052b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (sizeof(struct bfad_buf_info) * 2053b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles)); 2054b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2055b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* fcxp send */ 2056b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati init_completion(&drv_fcxp->comp); 2057b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt); 2058b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc == BFA_STATUS_OK) { 2059b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati wait_for_completion(&drv_fcxp->comp); 2060b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = drv_fcxp->req_status; 2061b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { 2062b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_fcpt->status = rc; 2063b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati goto out_free_mem; 2064b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2065b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2066b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* fill the job->reply data */ 2067b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (drv_fcxp->req_status == BFA_STATUS_OK) { 2068b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = drv_fcxp->rsp_len; 2069b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = drv_fcxp->rsp_len; 2070b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; 2071b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } else { 2072b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 2073b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sizeof(struct fc_bsg_ctels_reply); 2074b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_len = sizeof(uint32_t); 2075b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_data.ctels_reply.status = 2076b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati FC_CTELS_STATUS_REJECT; 2077b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2078b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2079b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Copy the response data to the reply_payload sg list */ 2080b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 2081b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.sg_cnt, 2082b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati (uint8_t *)rsp_buf_info->virt, 2083b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply_payload.payload_len); 2084b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2085b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem: 2086b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info, 2087b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_rsp_sgles); 2088b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info, 2089b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati drv_fcxp->num_req_sgles); 2090b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(req_kbuf); 2091b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(rsp_kbuf); 2092b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2093b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Need a copy to user op */ 2094b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (copy_to_user(bsg_data->payload, (void *) bsg_fcpt, 2095b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bsg_data->payload_len)) 2096b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = -EIO; 2097b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2098b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(bsg_fcpt); 2099b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati kfree(drv_fcxp); 2100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout: 2101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc; 2102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati if (rc == BFA_STATUS_OK) 2104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->job_done(job); 2105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 2107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 2108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 2110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_request(struct fc_bsg_job *job) 2111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 2112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati uint32_t rc = BFA_STATUS_OK; 2113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Increment the bfa module refcnt - if bsg request is in service */ 2115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_im_bsg_get_kobject(job); 2116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati switch (job->request->msgcode) { 2118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_VENDOR: 2119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Process BSG HST Vendor requests */ 2120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_im_bsg_vendor_request(job); 2121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 2122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_ELS_NOLOGIN: 2123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_RPT_ELS: 2124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_HST_CT: 2125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati case FC_BSG_RPT_CT: 2126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Process BSG ELS/CT commands */ 2127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati rc = bfad_im_bsg_els_ct_request(job); 2128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 2129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati default: 2130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->result = rc = -EINVAL; 2131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati job->reply->reply_payload_rcv_len = 0; 2132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati break; 2133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati } 2134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Decrement the bfa module refcnt - on completion of bsg request */ 2136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati bfad_im_bsg_put_kobject(job); 2137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return rc; 2139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 2140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati 2141b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint 2142b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_timeout(struct fc_bsg_job *job) 2143b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{ 2144b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati /* Don't complete the BSG job request - return -EAGAIN 2145b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * to reset bsg job timeout : for ELS/CT pass thru we 2146b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * already have timer to track the request. 2147b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */ 2148b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati return -EAGAIN; 2149b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati} 2150