152fa7bf9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2b85daafeSKrishna Gudipati /* 3889d0d42SAnil Gurumurthy * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 4889d0d42SAnil Gurumurthy * Copyright (c) 2014- QLogic Corporation. 5b85daafeSKrishna Gudipati * All rights reserved 6889d0d42SAnil Gurumurthy * www.qlogic.com 7b85daafeSKrishna Gudipati * 831e1d569SAnil Gurumurthy * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter. 9b85daafeSKrishna Gudipati */ 10b85daafeSKrishna Gudipati 11b85daafeSKrishna Gudipati #include <linux/uaccess.h> 12b85daafeSKrishna Gudipati #include "bfad_drv.h" 13b85daafeSKrishna Gudipati #include "bfad_im.h" 14b85daafeSKrishna Gudipati #include "bfad_bsg.h" 15b85daafeSKrishna Gudipati 16b85daafeSKrishna Gudipati BFA_TRC_FILE(LDRV, BSG); 17b85daafeSKrishna Gudipati 18*3bbd8ef9SLee Jones static int 1960138066SKrishna Gudipati bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd) 2060138066SKrishna Gudipati { 2160138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 2260138066SKrishna Gudipati unsigned long flags; 2360138066SKrishna Gudipati 2460138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2560138066SKrishna Gudipati /* If IOC is not in disabled state - return */ 2660138066SKrishna Gudipati if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) { 2760138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 281a1297c6SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 290e772b33SPeter Senna Tschudin return 0; 3060138066SKrishna Gudipati } 3160138066SKrishna Gudipati 3260138066SKrishna Gudipati init_completion(&bfad->enable_comp); 3360138066SKrishna Gudipati bfa_iocfc_enable(&bfad->bfa); 3460138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 3560138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3660138066SKrishna Gudipati wait_for_completion(&bfad->enable_comp); 3760138066SKrishna Gudipati 380e772b33SPeter Senna Tschudin return 0; 3960138066SKrishna Gudipati } 4060138066SKrishna Gudipati 41*3bbd8ef9SLee Jones static int 4260138066SKrishna Gudipati bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd) 4360138066SKrishna Gudipati { 4460138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 4560138066SKrishna Gudipati unsigned long flags; 4660138066SKrishna Gudipati 4760138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 481a1297c6SKrishna Gudipati if (bfa_ioc_is_disabled(&bfad->bfa.ioc)) { 491a1297c6SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 501a1297c6SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 510e772b33SPeter Senna Tschudin return 0; 521a1297c6SKrishna Gudipati } 531a1297c6SKrishna Gudipati 5460138066SKrishna Gudipati if (bfad->disable_active) { 5560138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 569afbcfabSKrishna Gudipati return -EBUSY; 5760138066SKrishna Gudipati } 5860138066SKrishna Gudipati 5960138066SKrishna Gudipati bfad->disable_active = BFA_TRUE; 6060138066SKrishna Gudipati init_completion(&bfad->disable_comp); 6160138066SKrishna Gudipati bfa_iocfc_disable(&bfad->bfa); 6260138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 6360138066SKrishna Gudipati 6460138066SKrishna Gudipati wait_for_completion(&bfad->disable_comp); 6560138066SKrishna Gudipati bfad->disable_active = BFA_FALSE; 6660138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 6760138066SKrishna Gudipati 680e772b33SPeter Senna Tschudin return 0; 6960138066SKrishna Gudipati } 7060138066SKrishna Gudipati 71b85daafeSKrishna Gudipati static int 72b85daafeSKrishna Gudipati bfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd) 73b85daafeSKrishna Gudipati { 74b85daafeSKrishna Gudipati int i; 75b85daafeSKrishna Gudipati struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd; 76b85daafeSKrishna Gudipati struct bfad_im_port_s *im_port; 77b85daafeSKrishna Gudipati struct bfa_port_attr_s pattr; 78b85daafeSKrishna Gudipati unsigned long flags; 79b85daafeSKrishna Gudipati 80b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 81b85daafeSKrishna Gudipati bfa_fcport_get_attr(&bfad->bfa, &pattr); 82b85daafeSKrishna Gudipati iocmd->nwwn = pattr.nwwn; 83b85daafeSKrishna Gudipati iocmd->pwwn = pattr.pwwn; 84b85daafeSKrishna Gudipati iocmd->ioc_type = bfa_get_type(&bfad->bfa); 85b85daafeSKrishna Gudipati iocmd->mac = bfa_get_mac(&bfad->bfa); 86b85daafeSKrishna Gudipati iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa); 87b85daafeSKrishna Gudipati bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum); 88b85daafeSKrishna Gudipati iocmd->factorynwwn = pattr.factorynwwn; 89b85daafeSKrishna Gudipati iocmd->factorypwwn = pattr.factorypwwn; 907826f304SKrishna Gudipati iocmd->bfad_num = bfad->inst_no; 91b85daafeSKrishna Gudipati im_port = bfad->pport.im_port; 92b85daafeSKrishna Gudipati iocmd->host = im_port->shost->host_no; 93b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 94b85daafeSKrishna Gudipati 95b85daafeSKrishna Gudipati strcpy(iocmd->name, bfad->adapter_name); 96b85daafeSKrishna Gudipati strcpy(iocmd->port_name, bfad->port_name); 97b85daafeSKrishna Gudipati strcpy(iocmd->hwpath, bfad->pci_name); 98b85daafeSKrishna Gudipati 99b85daafeSKrishna Gudipati /* set adapter hw path */ 100b85daafeSKrishna Gudipati strcpy(iocmd->adapter_hwpath, bfad->pci_name); 101e6826c96SKrishna Gudipati for (i = 0; iocmd->adapter_hwpath[i] != ':' && i < BFA_STRING_32; i++) 102e6826c96SKrishna Gudipati ; 103e6826c96SKrishna Gudipati for (; iocmd->adapter_hwpath[++i] != ':' && i < BFA_STRING_32; ) 104e6826c96SKrishna Gudipati ; 105b85daafeSKrishna Gudipati iocmd->adapter_hwpath[i] = '\0'; 106b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 107b85daafeSKrishna Gudipati return 0; 108b85daafeSKrishna Gudipati } 109b85daafeSKrishna Gudipati 110b85daafeSKrishna Gudipati static int 111b85daafeSKrishna Gudipati bfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd) 112b85daafeSKrishna Gudipati { 113b85daafeSKrishna Gudipati struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd; 114b85daafeSKrishna Gudipati unsigned long flags; 115b85daafeSKrishna Gudipati 116b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 117b85daafeSKrishna Gudipati bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr); 118b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 119b85daafeSKrishna Gudipati 120b85daafeSKrishna Gudipati /* fill in driver attr info */ 121b85daafeSKrishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME); 1228c5a50e8SArnd Bergmann strlcpy(iocmd->ioc_attr.driver_attr.driver_ver, 123b85daafeSKrishna Gudipati BFAD_DRIVER_VERSION, BFA_VERSION_LEN); 124b85daafeSKrishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.fw_ver, 125b85daafeSKrishna Gudipati iocmd->ioc_attr.adapter_attr.fw_ver); 126b85daafeSKrishna Gudipati strcpy(iocmd->ioc_attr.driver_attr.bios_ver, 127b85daafeSKrishna Gudipati iocmd->ioc_attr.adapter_attr.optrom_ver); 128b85daafeSKrishna Gudipati 129b85daafeSKrishna Gudipati /* copy chip rev info first otherwise it will be overwritten */ 130b85daafeSKrishna Gudipati memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev, 131b85daafeSKrishna Gudipati sizeof(bfad->pci_attr.chip_rev)); 132b85daafeSKrishna Gudipati memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr, 133b85daafeSKrishna Gudipati sizeof(struct bfa_ioc_pci_attr_s)); 134b85daafeSKrishna Gudipati 135b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 136b85daafeSKrishna Gudipati return 0; 137b85daafeSKrishna Gudipati } 138b85daafeSKrishna Gudipati 13910202648SJason Yan static int 14060138066SKrishna Gudipati bfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd) 14160138066SKrishna Gudipati { 14260138066SKrishna Gudipati struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd; 14360138066SKrishna Gudipati 14460138066SKrishna Gudipati bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats); 14560138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 14660138066SKrishna Gudipati return 0; 14760138066SKrishna Gudipati } 14860138066SKrishna Gudipati 149*3bbd8ef9SLee Jones static int 15060138066SKrishna Gudipati bfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd, 15160138066SKrishna Gudipati unsigned int payload_len) 15260138066SKrishna Gudipati { 15360138066SKrishna Gudipati struct bfa_bsg_ioc_fwstats_s *iocmd = 15460138066SKrishna Gudipati (struct bfa_bsg_ioc_fwstats_s *)cmd; 15560138066SKrishna Gudipati void *iocmd_bufptr; 15660138066SKrishna Gudipati unsigned long flags; 15760138066SKrishna Gudipati 15860138066SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 15960138066SKrishna Gudipati sizeof(struct bfa_bsg_ioc_fwstats_s), 16060138066SKrishna Gudipati sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) { 16160138066SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 16260138066SKrishna Gudipati goto out; 16360138066SKrishna Gudipati } 16460138066SKrishna Gudipati 16560138066SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s); 16660138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 16760138066SKrishna Gudipati iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr); 16860138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16960138066SKrishna Gudipati 17060138066SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 17160138066SKrishna Gudipati bfa_trc(bfad, iocmd->status); 17260138066SKrishna Gudipati goto out; 17360138066SKrishna Gudipati } 17460138066SKrishna Gudipati out: 17560138066SKrishna Gudipati bfa_trc(bfad, 0x6666); 17660138066SKrishna Gudipati return 0; 17760138066SKrishna Gudipati } 17860138066SKrishna Gudipati 179*3bbd8ef9SLee Jones static int 180f2ee7601SKrishna Gudipati bfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 181f2ee7601SKrishna Gudipati { 182f2ee7601SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 183f2ee7601SKrishna Gudipati unsigned long flags; 184f2ee7601SKrishna Gudipati 185f2ee7601SKrishna Gudipati if (v_cmd == IOCMD_IOC_RESET_STATS) { 186f2ee7601SKrishna Gudipati bfa_ioc_clear_stats(&bfad->bfa); 187f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 188f2ee7601SKrishna Gudipati } else if (v_cmd == IOCMD_IOC_RESET_FWSTATS) { 189f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 190f2ee7601SKrishna Gudipati iocmd->status = bfa_ioc_fw_stats_clear(&bfad->bfa.ioc); 191f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 192f2ee7601SKrishna Gudipati } 193f2ee7601SKrishna Gudipati 194f2ee7601SKrishna Gudipati return 0; 195f2ee7601SKrishna Gudipati } 196f2ee7601SKrishna Gudipati 197*3bbd8ef9SLee Jones static int 198f2ee7601SKrishna Gudipati bfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 199f2ee7601SKrishna Gudipati { 200f2ee7601SKrishna Gudipati struct bfa_bsg_ioc_name_s *iocmd = (struct bfa_bsg_ioc_name_s *) cmd; 201f2ee7601SKrishna Gudipati 202f2ee7601SKrishna Gudipati if (v_cmd == IOCMD_IOC_SET_ADAPTER_NAME) 203f2ee7601SKrishna Gudipati strcpy(bfad->adapter_name, iocmd->name); 204f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_IOC_SET_PORT_NAME) 205f2ee7601SKrishna Gudipati strcpy(bfad->port_name, iocmd->name); 206f2ee7601SKrishna Gudipati 207f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 208f2ee7601SKrishna Gudipati return 0; 209f2ee7601SKrishna Gudipati } 210f2ee7601SKrishna Gudipati 211*3bbd8ef9SLee Jones static int 21260138066SKrishna Gudipati bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd) 21360138066SKrishna Gudipati { 21460138066SKrishna Gudipati struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd; 21560138066SKrishna Gudipati 21660138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 21760138066SKrishna Gudipati bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr); 21860138066SKrishna Gudipati 21960138066SKrishna Gudipati return 0; 22060138066SKrishna Gudipati } 22160138066SKrishna Gudipati 222*3bbd8ef9SLee Jones static int 22328d358d0SVijaya Mohan Guvva bfad_iocmd_ioc_fw_sig_inv(struct bfad_s *bfad, void *cmd) 22428d358d0SVijaya Mohan Guvva { 22528d358d0SVijaya Mohan Guvva struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 22628d358d0SVijaya Mohan Guvva unsigned long flags; 22728d358d0SVijaya Mohan Guvva 22828d358d0SVijaya Mohan Guvva spin_lock_irqsave(&bfad->bfad_lock, flags); 22928d358d0SVijaya Mohan Guvva iocmd->status = bfa_ioc_fwsig_invalidate(&bfad->bfa.ioc); 23028d358d0SVijaya Mohan Guvva spin_unlock_irqrestore(&bfad->bfad_lock, flags); 23128d358d0SVijaya Mohan Guvva return 0; 23228d358d0SVijaya Mohan Guvva } 23328d358d0SVijaya Mohan Guvva 234*3bbd8ef9SLee Jones static int 23560138066SKrishna Gudipati bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd) 23660138066SKrishna Gudipati { 23760138066SKrishna Gudipati struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd; 23860138066SKrishna Gudipati unsigned long flags; 23960138066SKrishna Gudipati 24060138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 24160138066SKrishna Gudipati iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr); 24260138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 24360138066SKrishna Gudipati 24460138066SKrishna Gudipati return 0; 24560138066SKrishna Gudipati } 24660138066SKrishna Gudipati 247*3bbd8ef9SLee Jones static int 24860138066SKrishna Gudipati bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd) 24960138066SKrishna Gudipati { 25060138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 25160138066SKrishna Gudipati struct bfad_hal_comp fcomp; 25260138066SKrishna Gudipati unsigned long flags; 25360138066SKrishna Gudipati 25460138066SKrishna Gudipati init_completion(&fcomp.comp); 25560138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 25660138066SKrishna Gudipati iocmd->status = bfa_port_enable(&bfad->bfa.modules.port, 25760138066SKrishna Gudipati bfad_hcb_comp, &fcomp); 25860138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 25960138066SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 26060138066SKrishna Gudipati bfa_trc(bfad, iocmd->status); 26160138066SKrishna Gudipati return 0; 26260138066SKrishna Gudipati } 26360138066SKrishna Gudipati wait_for_completion(&fcomp.comp); 26460138066SKrishna Gudipati iocmd->status = fcomp.status; 26560138066SKrishna Gudipati return 0; 26660138066SKrishna Gudipati } 26760138066SKrishna Gudipati 268*3bbd8ef9SLee Jones static int 26960138066SKrishna Gudipati bfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd) 27060138066SKrishna Gudipati { 27160138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 27260138066SKrishna Gudipati struct bfad_hal_comp fcomp; 27360138066SKrishna Gudipati unsigned long flags; 27460138066SKrishna Gudipati 27560138066SKrishna Gudipati init_completion(&fcomp.comp); 27660138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 27760138066SKrishna Gudipati iocmd->status = bfa_port_disable(&bfad->bfa.modules.port, 27860138066SKrishna Gudipati bfad_hcb_comp, &fcomp); 27960138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 28060138066SKrishna Gudipati 28160138066SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 28260138066SKrishna Gudipati bfa_trc(bfad, iocmd->status); 28360138066SKrishna Gudipati return 0; 28460138066SKrishna Gudipati } 28560138066SKrishna Gudipati wait_for_completion(&fcomp.comp); 28660138066SKrishna Gudipati iocmd->status = fcomp.status; 28760138066SKrishna Gudipati return 0; 28860138066SKrishna Gudipati } 28960138066SKrishna Gudipati 290b85daafeSKrishna Gudipati static int 291b85daafeSKrishna Gudipati bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd) 292b85daafeSKrishna Gudipati { 293b85daafeSKrishna Gudipati struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd; 294b85daafeSKrishna Gudipati struct bfa_lport_attr_s port_attr; 295b85daafeSKrishna Gudipati unsigned long flags; 296b85daafeSKrishna Gudipati 297b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 298b85daafeSKrishna Gudipati bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr); 299b85daafeSKrishna Gudipati bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr); 300b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 301b85daafeSKrishna Gudipati 302b85daafeSKrishna Gudipati if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE) 303b85daafeSKrishna Gudipati iocmd->attr.pid = port_attr.pid; 304b85daafeSKrishna Gudipati else 305b85daafeSKrishna Gudipati iocmd->attr.pid = 0; 306b85daafeSKrishna Gudipati 307b85daafeSKrishna Gudipati iocmd->attr.port_type = port_attr.port_type; 308b85daafeSKrishna Gudipati iocmd->attr.loopback = port_attr.loopback; 309b85daafeSKrishna Gudipati iocmd->attr.authfail = port_attr.authfail; 3108c5a50e8SArnd Bergmann strlcpy(iocmd->attr.port_symname.symname, 311b85daafeSKrishna Gudipati port_attr.port_cfg.sym_name.symname, 3128c5a50e8SArnd Bergmann sizeof(iocmd->attr.port_symname.symname)); 313b85daafeSKrishna Gudipati 314b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 315b85daafeSKrishna Gudipati return 0; 316b85daafeSKrishna Gudipati } 317b85daafeSKrishna Gudipati 318*3bbd8ef9SLee Jones static int 31960138066SKrishna Gudipati bfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd, 32060138066SKrishna Gudipati unsigned int payload_len) 32160138066SKrishna Gudipati { 32260138066SKrishna Gudipati struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd; 32360138066SKrishna Gudipati struct bfad_hal_comp fcomp; 32460138066SKrishna Gudipati void *iocmd_bufptr; 32560138066SKrishna Gudipati unsigned long flags; 32660138066SKrishna Gudipati 32760138066SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 32860138066SKrishna Gudipati sizeof(struct bfa_bsg_port_stats_s), 32960138066SKrishna Gudipati sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) { 33060138066SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 33160138066SKrishna Gudipati return 0; 33260138066SKrishna Gudipati } 33360138066SKrishna Gudipati 33460138066SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s); 33560138066SKrishna Gudipati 33660138066SKrishna Gudipati init_completion(&fcomp.comp); 33760138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 33860138066SKrishna Gudipati iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port, 33960138066SKrishna Gudipati iocmd_bufptr, bfad_hcb_comp, &fcomp); 34060138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 34160138066SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 34260138066SKrishna Gudipati bfa_trc(bfad, iocmd->status); 34360138066SKrishna Gudipati goto out; 34460138066SKrishna Gudipati } 34560138066SKrishna Gudipati 34660138066SKrishna Gudipati wait_for_completion(&fcomp.comp); 34760138066SKrishna Gudipati iocmd->status = fcomp.status; 34860138066SKrishna Gudipati out: 34960138066SKrishna Gudipati return 0; 35060138066SKrishna Gudipati } 35160138066SKrishna Gudipati 352*3bbd8ef9SLee Jones static int 353f2ee7601SKrishna Gudipati bfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd) 354f2ee7601SKrishna Gudipati { 355f2ee7601SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 356f2ee7601SKrishna Gudipati struct bfad_hal_comp fcomp; 357f2ee7601SKrishna Gudipati unsigned long flags; 358f2ee7601SKrishna Gudipati 359f2ee7601SKrishna Gudipati init_completion(&fcomp.comp); 360f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 361f2ee7601SKrishna Gudipati iocmd->status = bfa_port_clear_stats(&bfad->bfa.modules.port, 362f2ee7601SKrishna Gudipati bfad_hcb_comp, &fcomp); 363f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 364f2ee7601SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 365f2ee7601SKrishna Gudipati bfa_trc(bfad, iocmd->status); 366f2ee7601SKrishna Gudipati return 0; 367f2ee7601SKrishna Gudipati } 368f2ee7601SKrishna Gudipati wait_for_completion(&fcomp.comp); 369f2ee7601SKrishna Gudipati iocmd->status = fcomp.status; 370f2ee7601SKrishna Gudipati return 0; 371f2ee7601SKrishna Gudipati } 372f2ee7601SKrishna Gudipati 373*3bbd8ef9SLee Jones static int 374f2ee7601SKrishna Gudipati bfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd) 375f2ee7601SKrishna Gudipati { 376f2ee7601SKrishna Gudipati struct bfa_bsg_port_cfg_s *cmd = (struct bfa_bsg_port_cfg_s *)iocmd; 377f2ee7601SKrishna Gudipati unsigned long flags; 378f2ee7601SKrishna Gudipati 379f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 380f2ee7601SKrishna Gudipati if (v_cmd == IOCMD_PORT_CFG_TOPO) 381f2ee7601SKrishna Gudipati cmd->status = bfa_fcport_cfg_topology(&bfad->bfa, cmd->param); 382f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_PORT_CFG_SPEED) 383f2ee7601SKrishna Gudipati cmd->status = bfa_fcport_cfg_speed(&bfad->bfa, cmd->param); 384f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_PORT_CFG_ALPA) 385f2ee7601SKrishna Gudipati cmd->status = bfa_fcport_cfg_hardalpa(&bfad->bfa, cmd->param); 386f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_PORT_CLR_ALPA) 387f2ee7601SKrishna Gudipati cmd->status = bfa_fcport_clr_hardalpa(&bfad->bfa); 388f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 389f2ee7601SKrishna Gudipati 390f2ee7601SKrishna Gudipati return 0; 391f2ee7601SKrishna Gudipati } 392f2ee7601SKrishna Gudipati 393*3bbd8ef9SLee Jones static int 394f2ee7601SKrishna Gudipati bfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd) 395f2ee7601SKrishna Gudipati { 396f2ee7601SKrishna Gudipati struct bfa_bsg_port_cfg_maxfrsize_s *iocmd = 397f2ee7601SKrishna Gudipati (struct bfa_bsg_port_cfg_maxfrsize_s *)cmd; 398f2ee7601SKrishna Gudipati unsigned long flags; 399f2ee7601SKrishna Gudipati 400f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 401f2ee7601SKrishna Gudipati iocmd->status = bfa_fcport_cfg_maxfrsize(&bfad->bfa, iocmd->maxfrsize); 402f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 403f2ee7601SKrishna Gudipati 404f2ee7601SKrishna Gudipati return 0; 405f2ee7601SKrishna Gudipati } 406f2ee7601SKrishna Gudipati 407*3bbd8ef9SLee Jones static int 408bbe37a67SVijaya Mohan Guvva bfad_iocmd_port_cfg_bbcr(struct bfad_s *bfad, unsigned int cmd, void *pcmd) 409f2ee7601SKrishna Gudipati { 410bbe37a67SVijaya Mohan Guvva struct bfa_bsg_bbcr_enable_s *iocmd = 411bbe37a67SVijaya Mohan Guvva (struct bfa_bsg_bbcr_enable_s *)pcmd; 412f2ee7601SKrishna Gudipati unsigned long flags; 413bbe37a67SVijaya Mohan Guvva int rc; 414f2ee7601SKrishna Gudipati 415f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 416bbe37a67SVijaya Mohan Guvva if (cmd == IOCMD_PORT_BBCR_ENABLE) 417bbe37a67SVijaya Mohan Guvva rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_TRUE, iocmd->bb_scn); 418bbe37a67SVijaya Mohan Guvva else if (cmd == IOCMD_PORT_BBCR_DISABLE) 419bbe37a67SVijaya Mohan Guvva rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_FALSE, 0); 420bbe37a67SVijaya Mohan Guvva else { 421bbe37a67SVijaya Mohan Guvva spin_unlock_irqrestore(&bfad->bfad_lock, flags); 422bbe37a67SVijaya Mohan Guvva return -EINVAL; 423f2ee7601SKrishna Gudipati } 424f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 425f2ee7601SKrishna Gudipati 426bbe37a67SVijaya Mohan Guvva iocmd->status = rc; 427f2ee7601SKrishna Gudipati return 0; 428f2ee7601SKrishna Gudipati } 429f2ee7601SKrishna Gudipati 430*3bbd8ef9SLee Jones static int 431bbe37a67SVijaya Mohan Guvva bfad_iocmd_port_get_bbcr_attr(struct bfad_s *bfad, void *pcmd) 432bbe37a67SVijaya Mohan Guvva { 433bbe37a67SVijaya Mohan Guvva struct bfa_bsg_bbcr_attr_s *iocmd = (struct bfa_bsg_bbcr_attr_s *) pcmd; 434bbe37a67SVijaya Mohan Guvva unsigned long flags; 435bbe37a67SVijaya Mohan Guvva 436bbe37a67SVijaya Mohan Guvva spin_lock_irqsave(&bfad->bfad_lock, flags); 437bbe37a67SVijaya Mohan Guvva iocmd->status = 438bbe37a67SVijaya Mohan Guvva bfa_fcport_get_bbcr_attr(&bfad->bfa, &iocmd->attr); 439bbe37a67SVijaya Mohan Guvva spin_unlock_irqrestore(&bfad->bfad_lock, flags); 440bbe37a67SVijaya Mohan Guvva 441bbe37a67SVijaya Mohan Guvva return 0; 442bbe37a67SVijaya Mohan Guvva } 443bbe37a67SVijaya Mohan Guvva 444bbe37a67SVijaya Mohan Guvva 445b85daafeSKrishna Gudipati static int 446b85daafeSKrishna Gudipati bfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd) 447b85daafeSKrishna Gudipati { 448b85daafeSKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 449b85daafeSKrishna Gudipati struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd; 450b85daafeSKrishna Gudipati unsigned long flags; 451b85daafeSKrishna Gudipati 452b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 453b85daafeSKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 454b85daafeSKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 455b85daafeSKrishna Gudipati if (fcs_port == NULL) { 456b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 457b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 458b85daafeSKrishna Gudipati goto out; 459b85daafeSKrishna Gudipati } 460b85daafeSKrishna Gudipati 461b85daafeSKrishna Gudipati bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr); 462b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 463b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 464b85daafeSKrishna Gudipati out: 465b85daafeSKrishna Gudipati return 0; 466b85daafeSKrishna Gudipati } 467b85daafeSKrishna Gudipati 468*3bbd8ef9SLee Jones static int 46960138066SKrishna Gudipati bfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd) 47060138066SKrishna Gudipati { 47160138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 47260138066SKrishna Gudipati struct bfa_bsg_lport_stats_s *iocmd = 47360138066SKrishna Gudipati (struct bfa_bsg_lport_stats_s *)cmd; 47460138066SKrishna Gudipati unsigned long flags; 47560138066SKrishna Gudipati 47660138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 47760138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 47860138066SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 47960138066SKrishna Gudipati if (fcs_port == NULL) { 48060138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 48160138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 48260138066SKrishna Gudipati goto out; 48360138066SKrishna Gudipati } 48460138066SKrishna Gudipati 48560138066SKrishna Gudipati bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats); 48660138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 48760138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 48860138066SKrishna Gudipati out: 48960138066SKrishna Gudipati return 0; 49060138066SKrishna Gudipati } 49160138066SKrishna Gudipati 492*3bbd8ef9SLee Jones static int 493f2ee7601SKrishna Gudipati bfad_iocmd_lport_reset_stats(struct bfad_s *bfad, void *cmd) 494f2ee7601SKrishna Gudipati { 495f2ee7601SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 496f2ee7601SKrishna Gudipati struct bfa_bsg_reset_stats_s *iocmd = 497f2ee7601SKrishna Gudipati (struct bfa_bsg_reset_stats_s *)cmd; 498f2ee7601SKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 499f2ee7601SKrishna Gudipati struct list_head *qe, *qen; 500f2ee7601SKrishna Gudipati struct bfa_itnim_s *itnim; 501f2ee7601SKrishna Gudipati unsigned long flags; 502f2ee7601SKrishna Gudipati 503f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 504f2ee7601SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 505f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->vpwwn); 506f2ee7601SKrishna Gudipati if (fcs_port == NULL) { 507f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 508f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 509f2ee7601SKrishna Gudipati goto out; 510f2ee7601SKrishna Gudipati } 511f2ee7601SKrishna Gudipati 512f2ee7601SKrishna Gudipati bfa_fcs_lport_clear_stats(fcs_port); 513f2ee7601SKrishna Gudipati /* clear IO stats from all active itnims */ 514f2ee7601SKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 515f2ee7601SKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 516f2ee7601SKrishna Gudipati if (itnim->rport->rport_info.lp_tag != fcs_port->lp_tag) 517f2ee7601SKrishna Gudipati continue; 518f2ee7601SKrishna Gudipati bfa_itnim_clear_stats(itnim); 519f2ee7601SKrishna Gudipati } 520f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 521f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 522f2ee7601SKrishna Gudipati out: 523f2ee7601SKrishna Gudipati return 0; 524f2ee7601SKrishna Gudipati } 525f2ee7601SKrishna Gudipati 526*3bbd8ef9SLee Jones static int 52760138066SKrishna Gudipati bfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd) 52860138066SKrishna Gudipati { 52960138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 53060138066SKrishna Gudipati struct bfa_bsg_lport_iostats_s *iocmd = 53160138066SKrishna Gudipati (struct bfa_bsg_lport_iostats_s *)cmd; 53260138066SKrishna Gudipati unsigned long flags; 53360138066SKrishna Gudipati 53460138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 53560138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 53660138066SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 53760138066SKrishna Gudipati if (fcs_port == NULL) { 53860138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 53960138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 54060138066SKrishna Gudipati goto out; 54160138066SKrishna Gudipati } 54260138066SKrishna Gudipati 54360138066SKrishna Gudipati bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats, 54460138066SKrishna Gudipati fcs_port->lp_tag); 54560138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 54660138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 54760138066SKrishna Gudipati out: 54860138066SKrishna Gudipati return 0; 54960138066SKrishna Gudipati } 55060138066SKrishna Gudipati 551*3bbd8ef9SLee Jones static int 55260138066SKrishna Gudipati bfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd, 55360138066SKrishna Gudipati unsigned int payload_len) 55460138066SKrishna Gudipati { 55560138066SKrishna Gudipati struct bfa_bsg_lport_get_rports_s *iocmd = 55660138066SKrishna Gudipati (struct bfa_bsg_lport_get_rports_s *)cmd; 55760138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 55860138066SKrishna Gudipati unsigned long flags; 55960138066SKrishna Gudipati void *iocmd_bufptr; 56060138066SKrishna Gudipati 56160138066SKrishna Gudipati if (iocmd->nrports == 0) 5629afbcfabSKrishna Gudipati return -EINVAL; 56360138066SKrishna Gudipati 56460138066SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 56560138066SKrishna Gudipati sizeof(struct bfa_bsg_lport_get_rports_s), 566ee1a4a42SKrishna Gudipati sizeof(struct bfa_rport_qualifier_s) * iocmd->nrports) 567ee1a4a42SKrishna Gudipati != BFA_STATUS_OK) { 56860138066SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 56960138066SKrishna Gudipati return 0; 57060138066SKrishna Gudipati } 57160138066SKrishna Gudipati 57260138066SKrishna Gudipati iocmd_bufptr = (char *)iocmd + 57360138066SKrishna Gudipati sizeof(struct bfa_bsg_lport_get_rports_s); 57460138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 57560138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 57660138066SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 57760138066SKrishna Gudipati if (fcs_port == NULL) { 57860138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 57960138066SKrishna Gudipati bfa_trc(bfad, 0); 58060138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 58160138066SKrishna Gudipati goto out; 58260138066SKrishna Gudipati } 58360138066SKrishna Gudipati 584ee1a4a42SKrishna Gudipati bfa_fcs_lport_get_rport_quals(fcs_port, 585ee1a4a42SKrishna Gudipati (struct bfa_rport_qualifier_s *)iocmd_bufptr, 58660138066SKrishna Gudipati &iocmd->nrports); 58760138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 58860138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 58960138066SKrishna Gudipati out: 59060138066SKrishna Gudipati return 0; 59160138066SKrishna Gudipati } 59260138066SKrishna Gudipati 593*3bbd8ef9SLee Jones static int 59460138066SKrishna Gudipati bfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd) 59560138066SKrishna Gudipati { 59660138066SKrishna Gudipati struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd; 59760138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 59860138066SKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 59960138066SKrishna Gudipati unsigned long flags; 60060138066SKrishna Gudipati 60160138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 60260138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 60360138066SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 60460138066SKrishna Gudipati if (fcs_port == NULL) { 60560138066SKrishna Gudipati bfa_trc(bfad, 0); 60660138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 60760138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 60860138066SKrishna Gudipati goto out; 60960138066SKrishna Gudipati } 61060138066SKrishna Gudipati 611ee1a4a42SKrishna Gudipati if (iocmd->pid) 612ee1a4a42SKrishna Gudipati fcs_rport = bfa_fcs_lport_get_rport_by_qualifier(fcs_port, 613ee1a4a42SKrishna Gudipati iocmd->rpwwn, iocmd->pid); 614ee1a4a42SKrishna Gudipati else 61560138066SKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 61660138066SKrishna Gudipati if (fcs_rport == NULL) { 61760138066SKrishna Gudipati bfa_trc(bfad, 0); 61860138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 61960138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 62060138066SKrishna Gudipati goto out; 62160138066SKrishna Gudipati } 62260138066SKrishna Gudipati 62360138066SKrishna Gudipati bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr); 62460138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 62560138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 62660138066SKrishna Gudipati out: 62760138066SKrishna Gudipati return 0; 62860138066SKrishna Gudipati } 62960138066SKrishna Gudipati 630b85daafeSKrishna Gudipati static int 631b85daafeSKrishna Gudipati bfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd) 632b85daafeSKrishna Gudipati { 633b85daafeSKrishna Gudipati struct bfa_bsg_rport_scsi_addr_s *iocmd = 634b85daafeSKrishna Gudipati (struct bfa_bsg_rport_scsi_addr_s *)cmd; 635b85daafeSKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 636b85daafeSKrishna Gudipati struct bfa_fcs_itnim_s *fcs_itnim; 637b85daafeSKrishna Gudipati struct bfad_itnim_s *drv_itnim; 638b85daafeSKrishna Gudipati unsigned long flags; 639b85daafeSKrishna Gudipati 640b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 641b85daafeSKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 642b85daafeSKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 643b85daafeSKrishna Gudipati if (fcs_port == NULL) { 644b85daafeSKrishna Gudipati bfa_trc(bfad, 0); 645b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 646b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 647b85daafeSKrishna Gudipati goto out; 648b85daafeSKrishna Gudipati } 649b85daafeSKrishna Gudipati 650b85daafeSKrishna Gudipati fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 651b85daafeSKrishna Gudipati if (fcs_itnim == NULL) { 652b85daafeSKrishna Gudipati bfa_trc(bfad, 0); 653b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 654b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 655b85daafeSKrishna Gudipati goto out; 656b85daafeSKrishna Gudipati } 657b85daafeSKrishna Gudipati 658b85daafeSKrishna Gudipati drv_itnim = fcs_itnim->itnim_drv; 659b85daafeSKrishna Gudipati 660b85daafeSKrishna Gudipati if (drv_itnim && drv_itnim->im_port) 661b85daafeSKrishna Gudipati iocmd->host = drv_itnim->im_port->shost->host_no; 662b85daafeSKrishna Gudipati else { 663b85daafeSKrishna Gudipati bfa_trc(bfad, 0); 664b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 665b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 666b85daafeSKrishna Gudipati goto out; 667b85daafeSKrishna Gudipati } 668b85daafeSKrishna Gudipati 669b85daafeSKrishna Gudipati iocmd->target = drv_itnim->scsi_tgt_id; 670b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 671b85daafeSKrishna Gudipati 672b85daafeSKrishna Gudipati iocmd->bus = 0; 673b85daafeSKrishna Gudipati iocmd->lun = 0; 674b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 675b85daafeSKrishna Gudipati out: 676b85daafeSKrishna Gudipati return 0; 677b85daafeSKrishna Gudipati } 678b85daafeSKrishna Gudipati 679*3bbd8ef9SLee Jones static int 68060138066SKrishna Gudipati bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd) 68160138066SKrishna Gudipati { 68260138066SKrishna Gudipati struct bfa_bsg_rport_stats_s *iocmd = 68360138066SKrishna Gudipati (struct bfa_bsg_rport_stats_s *)cmd; 68460138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 68560138066SKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 68660138066SKrishna Gudipati unsigned long flags; 68760138066SKrishna Gudipati 68860138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 68960138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 69060138066SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 69160138066SKrishna Gudipati if (fcs_port == NULL) { 69260138066SKrishna Gudipati bfa_trc(bfad, 0); 69360138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 69460138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 69560138066SKrishna Gudipati goto out; 69660138066SKrishna Gudipati } 69760138066SKrishna Gudipati 69860138066SKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 69960138066SKrishna Gudipati if (fcs_rport == NULL) { 70060138066SKrishna Gudipati bfa_trc(bfad, 0); 70160138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 70260138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 70360138066SKrishna Gudipati goto out; 70460138066SKrishna Gudipati } 70560138066SKrishna Gudipati 70660138066SKrishna Gudipati memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats, 70760138066SKrishna Gudipati sizeof(struct bfa_rport_stats_s)); 70861ba4394SKrishna Gudipati if (bfa_fcs_rport_get_halrport(fcs_rport)) { 70960138066SKrishna Gudipati memcpy((void *)&iocmd->stats.hal_stats, 71060138066SKrishna Gudipati (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats), 71160138066SKrishna Gudipati sizeof(struct bfa_rport_hal_stats_s)); 71261ba4394SKrishna Gudipati } 71360138066SKrishna Gudipati 71460138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 71560138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 71660138066SKrishna Gudipati out: 71760138066SKrishna Gudipati return 0; 71860138066SKrishna Gudipati } 71960138066SKrishna Gudipati 720*3bbd8ef9SLee Jones static int 721f2ee7601SKrishna Gudipati bfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd) 722f2ee7601SKrishna Gudipati { 723f2ee7601SKrishna Gudipati struct bfa_bsg_rport_reset_stats_s *iocmd = 724f2ee7601SKrishna Gudipati (struct bfa_bsg_rport_reset_stats_s *)cmd; 725f2ee7601SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 726f2ee7601SKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 727f2ee7601SKrishna Gudipati struct bfa_rport_s *rport; 728f2ee7601SKrishna Gudipati unsigned long flags; 729f2ee7601SKrishna Gudipati 730f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 731f2ee7601SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 732f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 733f2ee7601SKrishna Gudipati if (fcs_port == NULL) { 734f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 735f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 736f2ee7601SKrishna Gudipati goto out; 737f2ee7601SKrishna Gudipati } 738f2ee7601SKrishna Gudipati 739f2ee7601SKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 740f2ee7601SKrishna Gudipati if (fcs_rport == NULL) { 741f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 742f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 743f2ee7601SKrishna Gudipati goto out; 744f2ee7601SKrishna Gudipati } 745f2ee7601SKrishna Gudipati 746f2ee7601SKrishna Gudipati memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s)); 747f2ee7601SKrishna Gudipati rport = bfa_fcs_rport_get_halrport(fcs_rport); 74861ba4394SKrishna Gudipati if (rport) 749f2ee7601SKrishna Gudipati memset(&rport->stats, 0, sizeof(rport->stats)); 750f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 751f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 752f2ee7601SKrishna Gudipati out: 753f2ee7601SKrishna Gudipati return 0; 754f2ee7601SKrishna Gudipati } 755f2ee7601SKrishna Gudipati 756*3bbd8ef9SLee Jones static int 757f2ee7601SKrishna Gudipati bfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd) 758f2ee7601SKrishna Gudipati { 759f2ee7601SKrishna Gudipati struct bfa_bsg_rport_set_speed_s *iocmd = 760f2ee7601SKrishna Gudipati (struct bfa_bsg_rport_set_speed_s *)cmd; 761f2ee7601SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 762f2ee7601SKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 763f2ee7601SKrishna Gudipati unsigned long flags; 764f2ee7601SKrishna Gudipati 765f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 766f2ee7601SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 767f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 768f2ee7601SKrishna Gudipati if (fcs_port == NULL) { 769f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 770f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 771f2ee7601SKrishna Gudipati goto out; 772f2ee7601SKrishna Gudipati } 773f2ee7601SKrishna Gudipati 774f2ee7601SKrishna Gudipati fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn); 775f2ee7601SKrishna Gudipati if (fcs_rport == NULL) { 776f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 777f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 778f2ee7601SKrishna Gudipati goto out; 779f2ee7601SKrishna Gudipati } 780f2ee7601SKrishna Gudipati 781f2ee7601SKrishna Gudipati fcs_rport->rpf.assigned_speed = iocmd->speed; 782f2ee7601SKrishna Gudipati /* Set this speed in f/w only if the RPSC speed is not available */ 783f2ee7601SKrishna Gudipati if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN) 78461ba4394SKrishna Gudipati if (fcs_rport->bfa_rport) 785f2ee7601SKrishna Gudipati bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed); 786f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 787f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 788f2ee7601SKrishna Gudipati out: 789f2ee7601SKrishna Gudipati return 0; 790f2ee7601SKrishna Gudipati } 791f2ee7601SKrishna Gudipati 792*3bbd8ef9SLee Jones static int 793f2ee7601SKrishna Gudipati bfad_iocmd_vport_get_attr(struct bfad_s *bfad, void *cmd) 794f2ee7601SKrishna Gudipati { 795f2ee7601SKrishna Gudipati struct bfa_fcs_vport_s *fcs_vport; 796f2ee7601SKrishna Gudipati struct bfa_bsg_vport_attr_s *iocmd = (struct bfa_bsg_vport_attr_s *)cmd; 797f2ee7601SKrishna Gudipati unsigned long flags; 798f2ee7601SKrishna Gudipati 799f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 800f2ee7601SKrishna Gudipati fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 801f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->vpwwn); 802f2ee7601SKrishna Gudipati if (fcs_vport == NULL) { 803f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 804f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VWWN; 805f2ee7601SKrishna Gudipati goto out; 806f2ee7601SKrishna Gudipati } 807f2ee7601SKrishna Gudipati 808f2ee7601SKrishna Gudipati bfa_fcs_vport_get_attr(fcs_vport, &iocmd->vport_attr); 809f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 810f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 811f2ee7601SKrishna Gudipati out: 812f2ee7601SKrishna Gudipati return 0; 813f2ee7601SKrishna Gudipati } 814f2ee7601SKrishna Gudipati 815*3bbd8ef9SLee Jones static int 816f2ee7601SKrishna Gudipati bfad_iocmd_vport_get_stats(struct bfad_s *bfad, void *cmd) 817f2ee7601SKrishna Gudipati { 818f2ee7601SKrishna Gudipati struct bfa_fcs_vport_s *fcs_vport; 819f2ee7601SKrishna Gudipati struct bfa_bsg_vport_stats_s *iocmd = 820f2ee7601SKrishna Gudipati (struct bfa_bsg_vport_stats_s *)cmd; 821f2ee7601SKrishna Gudipati unsigned long flags; 822f2ee7601SKrishna Gudipati 823f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 824f2ee7601SKrishna Gudipati fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 825f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->vpwwn); 826f2ee7601SKrishna Gudipati if (fcs_vport == NULL) { 827f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 828f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VWWN; 829f2ee7601SKrishna Gudipati goto out; 830f2ee7601SKrishna Gudipati } 831f2ee7601SKrishna Gudipati 832f2ee7601SKrishna Gudipati memcpy((void *)&iocmd->vport_stats, (void *)&fcs_vport->vport_stats, 833f2ee7601SKrishna Gudipati sizeof(struct bfa_vport_stats_s)); 834f2ee7601SKrishna Gudipati memcpy((void *)&iocmd->vport_stats.port_stats, 835f2ee7601SKrishna Gudipati (void *)&fcs_vport->lport.stats, 836f2ee7601SKrishna Gudipati sizeof(struct bfa_lport_stats_s)); 837f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 838f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 839f2ee7601SKrishna Gudipati out: 840f2ee7601SKrishna Gudipati return 0; 841f2ee7601SKrishna Gudipati } 842f2ee7601SKrishna Gudipati 843*3bbd8ef9SLee Jones static int 844f2ee7601SKrishna Gudipati bfad_iocmd_vport_clr_stats(struct bfad_s *bfad, void *cmd) 845f2ee7601SKrishna Gudipati { 846f2ee7601SKrishna Gudipati struct bfa_fcs_vport_s *fcs_vport; 847f2ee7601SKrishna Gudipati struct bfa_bsg_reset_stats_s *iocmd = 848f2ee7601SKrishna Gudipati (struct bfa_bsg_reset_stats_s *)cmd; 849f2ee7601SKrishna Gudipati unsigned long flags; 850f2ee7601SKrishna Gudipati 851f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 852f2ee7601SKrishna Gudipati fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 853f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->vpwwn); 854f2ee7601SKrishna Gudipati if (fcs_vport == NULL) { 855f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 856f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VWWN; 857f2ee7601SKrishna Gudipati goto out; 858f2ee7601SKrishna Gudipati } 859f2ee7601SKrishna Gudipati 860f2ee7601SKrishna Gudipati memset(&fcs_vport->vport_stats, 0, sizeof(struct bfa_vport_stats_s)); 861f2ee7601SKrishna Gudipati memset(&fcs_vport->lport.stats, 0, sizeof(struct bfa_lport_stats_s)); 862f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 863f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 864f2ee7601SKrishna Gudipati out: 865f2ee7601SKrishna Gudipati return 0; 866f2ee7601SKrishna Gudipati } 867f2ee7601SKrishna Gudipati 868b85daafeSKrishna Gudipati static int 869b85daafeSKrishna Gudipati bfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd, 870b85daafeSKrishna Gudipati unsigned int payload_len) 871b85daafeSKrishna Gudipati { 872b85daafeSKrishna Gudipati struct bfa_bsg_fabric_get_lports_s *iocmd = 873b85daafeSKrishna Gudipati (struct bfa_bsg_fabric_get_lports_s *)cmd; 874b85daafeSKrishna Gudipati bfa_fcs_vf_t *fcs_vf; 875b85daafeSKrishna Gudipati uint32_t nports = iocmd->nports; 876b85daafeSKrishna Gudipati unsigned long flags; 877b85daafeSKrishna Gudipati void *iocmd_bufptr; 878b85daafeSKrishna Gudipati 879b85daafeSKrishna Gudipati if (nports == 0) { 880b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_EINVAL; 881b85daafeSKrishna Gudipati goto out; 882b85daafeSKrishna Gudipati } 883b85daafeSKrishna Gudipati 884b85daafeSKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 885b85daafeSKrishna Gudipati sizeof(struct bfa_bsg_fabric_get_lports_s), 8861929e82eSStephen Kitt sizeof(wwn_t) * iocmd->nports) != BFA_STATUS_OK) { 887b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 888b85daafeSKrishna Gudipati goto out; 889b85daafeSKrishna Gudipati } 890b85daafeSKrishna Gudipati 891b85daafeSKrishna Gudipati iocmd_bufptr = (char *)iocmd + 892b85daafeSKrishna Gudipati sizeof(struct bfa_bsg_fabric_get_lports_s); 893b85daafeSKrishna Gudipati 894b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 895b85daafeSKrishna Gudipati fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id); 896b85daafeSKrishna Gudipati if (fcs_vf == NULL) { 897b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 898b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VFID; 899b85daafeSKrishna Gudipati goto out; 900b85daafeSKrishna Gudipati } 901b85daafeSKrishna Gudipati bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports); 902b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 903b85daafeSKrishna Gudipati 904b85daafeSKrishna Gudipati iocmd->nports = nports; 905b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 906b85daafeSKrishna Gudipati out: 907b85daafeSKrishna Gudipati return 0; 908b85daafeSKrishna Gudipati } 909b85daafeSKrishna Gudipati 910*3bbd8ef9SLee Jones static int 9116894f013SKrishna Gudipati bfad_iocmd_qos_set_bw(struct bfad_s *bfad, void *pcmd) 9126894f013SKrishna Gudipati { 9136894f013SKrishna Gudipati struct bfa_bsg_qos_bw_s *iocmd = (struct bfa_bsg_qos_bw_s *)pcmd; 9146894f013SKrishna Gudipati unsigned long flags; 9156894f013SKrishna Gudipati 9166894f013SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 9176894f013SKrishna Gudipati iocmd->status = bfa_fcport_set_qos_bw(&bfad->bfa, &iocmd->qos_bw); 9186894f013SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 9196894f013SKrishna Gudipati 9206894f013SKrishna Gudipati return 0; 9216894f013SKrishna Gudipati } 9226894f013SKrishna Gudipati 923*3bbd8ef9SLee Jones static int 924f2ee7601SKrishna Gudipati bfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd) 925f2ee7601SKrishna Gudipati { 926f2ee7601SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd; 927f2ee7601SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 928f2ee7601SKrishna Gudipati unsigned long flags; 929f2ee7601SKrishna Gudipati 930f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 931f2ee7601SKrishna Gudipati 932bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 933bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 934bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 935bc0e2c2aSKrishna Gudipati else { 936f2ee7601SKrishna Gudipati if (cmd == IOCMD_RATELIM_ENABLE) 937f2ee7601SKrishna Gudipati fcport->cfg.ratelimit = BFA_TRUE; 938f2ee7601SKrishna Gudipati else if (cmd == IOCMD_RATELIM_DISABLE) 939f2ee7601SKrishna Gudipati fcport->cfg.ratelimit = BFA_FALSE; 940f2ee7601SKrishna Gudipati 941f2ee7601SKrishna Gudipati if (fcport->cfg.trl_def_speed == BFA_PORT_SPEED_UNKNOWN) 942f2ee7601SKrishna Gudipati fcport->cfg.trl_def_speed = BFA_PORT_SPEED_1GBPS; 943f2ee7601SKrishna Gudipati 944f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 945bc0e2c2aSKrishna Gudipati } 946bc0e2c2aSKrishna Gudipati 947bc0e2c2aSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 948f2ee7601SKrishna Gudipati 949f2ee7601SKrishna Gudipati return 0; 950f2ee7601SKrishna Gudipati } 951f2ee7601SKrishna Gudipati 952*3bbd8ef9SLee Jones static int 953f2ee7601SKrishna Gudipati bfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd) 954f2ee7601SKrishna Gudipati { 955f2ee7601SKrishna Gudipati struct bfa_bsg_trl_speed_s *iocmd = (struct bfa_bsg_trl_speed_s *)pcmd; 956f2ee7601SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 957f2ee7601SKrishna Gudipati unsigned long flags; 958f2ee7601SKrishna Gudipati 959f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 960f2ee7601SKrishna Gudipati 961f2ee7601SKrishna Gudipati /* Auto and speeds greater than the supported speed, are invalid */ 962f2ee7601SKrishna Gudipati if ((iocmd->speed == BFA_PORT_SPEED_AUTO) || 963f2ee7601SKrishna Gudipati (iocmd->speed > fcport->speed_sup)) { 964f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNSUPP_SPEED; 965f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 966f2ee7601SKrishna Gudipati return 0; 967f2ee7601SKrishna Gudipati } 968f2ee7601SKrishna Gudipati 969bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 970bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 971bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 972bc0e2c2aSKrishna Gudipati else { 973f2ee7601SKrishna Gudipati fcport->cfg.trl_def_speed = iocmd->speed; 974f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 975bc0e2c2aSKrishna Gudipati } 976f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 977f2ee7601SKrishna Gudipati 978f2ee7601SKrishna Gudipati return 0; 979f2ee7601SKrishna Gudipati } 980f2ee7601SKrishna Gudipati 981*3bbd8ef9SLee Jones static int 982f2ee7601SKrishna Gudipati bfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd) 983f2ee7601SKrishna Gudipati { 984f2ee7601SKrishna Gudipati struct bfa_bsg_fcpim_s *iocmd = (struct bfa_bsg_fcpim_s *)cmd; 985f2ee7601SKrishna Gudipati unsigned long flags; 986f2ee7601SKrishna Gudipati 987f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 988f2ee7601SKrishna Gudipati bfa_fcpim_path_tov_set(&bfad->bfa, iocmd->param); 989f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 990f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 991f2ee7601SKrishna Gudipati return 0; 992f2ee7601SKrishna Gudipati } 993f2ee7601SKrishna Gudipati 994*3bbd8ef9SLee Jones static int 99560138066SKrishna Gudipati bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd) 99660138066SKrishna Gudipati { 99760138066SKrishna Gudipati struct bfa_bsg_fcpim_modstats_s *iocmd = 99860138066SKrishna Gudipati (struct bfa_bsg_fcpim_modstats_s *)cmd; 99960138066SKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 100060138066SKrishna Gudipati struct list_head *qe, *qen; 100160138066SKrishna Gudipati struct bfa_itnim_s *itnim; 100260138066SKrishna Gudipati unsigned long flags; 100360138066SKrishna Gudipati 100460138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 100560138066SKrishna Gudipati /* accumulate IO stats from itnim */ 100660138066SKrishna Gudipati memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s)); 100760138066SKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 100860138066SKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 100960138066SKrishna Gudipati bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats)); 101060138066SKrishna Gudipati } 101160138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 101260138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 101360138066SKrishna Gudipati return 0; 101460138066SKrishna Gudipati } 101560138066SKrishna Gudipati 1016*3bbd8ef9SLee Jones static int 1017f2ee7601SKrishna Gudipati bfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd) 1018f2ee7601SKrishna Gudipati { 1019f2ee7601SKrishna Gudipati struct bfa_bsg_fcpim_modstatsclr_s *iocmd = 1020f2ee7601SKrishna Gudipati (struct bfa_bsg_fcpim_modstatsclr_s *)cmd; 1021f2ee7601SKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 1022f2ee7601SKrishna Gudipati struct list_head *qe, *qen; 1023f2ee7601SKrishna Gudipati struct bfa_itnim_s *itnim; 1024f2ee7601SKrishna Gudipati unsigned long flags; 1025f2ee7601SKrishna Gudipati 1026f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1027f2ee7601SKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 1028f2ee7601SKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 1029f2ee7601SKrishna Gudipati bfa_itnim_clear_stats(itnim); 1030f2ee7601SKrishna Gudipati } 1031f2ee7601SKrishna Gudipati memset(&fcpim->del_itn_stats, 0, 1032f2ee7601SKrishna Gudipati sizeof(struct bfa_fcpim_del_itn_stats_s)); 1033f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1034f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 1035f2ee7601SKrishna Gudipati return 0; 1036f2ee7601SKrishna Gudipati } 1037f2ee7601SKrishna Gudipati 1038*3bbd8ef9SLee Jones static int 103960138066SKrishna Gudipati bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd) 104060138066SKrishna Gudipati { 104160138066SKrishna Gudipati struct bfa_bsg_fcpim_del_itn_stats_s *iocmd = 104260138066SKrishna Gudipati (struct bfa_bsg_fcpim_del_itn_stats_s *)cmd; 104360138066SKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa); 104460138066SKrishna Gudipati unsigned long flags; 104560138066SKrishna Gudipati 104660138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 104760138066SKrishna Gudipati memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats, 104860138066SKrishna Gudipati sizeof(struct bfa_fcpim_del_itn_stats_s)); 104960138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 105060138066SKrishna Gudipati 105160138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 105260138066SKrishna Gudipati return 0; 105360138066SKrishna Gudipati } 105460138066SKrishna Gudipati 1055b85daafeSKrishna Gudipati static int 1056b85daafeSKrishna Gudipati bfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd) 1057b85daafeSKrishna Gudipati { 1058b85daafeSKrishna Gudipati struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd; 1059b85daafeSKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 1060b85daafeSKrishna Gudipati unsigned long flags; 1061b85daafeSKrishna Gudipati 1062b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1063b85daafeSKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 1064b85daafeSKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 1065b85daafeSKrishna Gudipati if (!fcs_port) 1066b85daafeSKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 1067b85daafeSKrishna Gudipati else 1068b85daafeSKrishna Gudipati iocmd->status = bfa_fcs_itnim_attr_get(fcs_port, 1069b85daafeSKrishna Gudipati iocmd->rpwwn, &iocmd->attr); 1070b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1071b85daafeSKrishna Gudipati return 0; 1072b85daafeSKrishna Gudipati } 1073b85daafeSKrishna Gudipati 107460138066SKrishna Gudipati static int 107560138066SKrishna Gudipati bfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd) 107660138066SKrishna Gudipati { 107760138066SKrishna Gudipati struct bfa_bsg_itnim_iostats_s *iocmd = 107860138066SKrishna Gudipati (struct bfa_bsg_itnim_iostats_s *)cmd; 107960138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 108060138066SKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 108160138066SKrishna Gudipati unsigned long flags; 108260138066SKrishna Gudipati 108360138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 108460138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 108560138066SKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 108660138066SKrishna Gudipati if (!fcs_port) { 108760138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 108860138066SKrishna Gudipati bfa_trc(bfad, 0); 108960138066SKrishna Gudipati } else { 109060138066SKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 109160138066SKrishna Gudipati if (itnim == NULL) 109260138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 109360138066SKrishna Gudipati else { 109460138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 109561ba4394SKrishna Gudipati if (bfa_fcs_itnim_get_halitn(itnim)) 109660138066SKrishna Gudipati memcpy((void *)&iocmd->iostats, (void *) 109760138066SKrishna Gudipati &(bfa_fcs_itnim_get_halitn(itnim)->stats), 109860138066SKrishna Gudipati sizeof(struct bfa_itnim_iostats_s)); 109960138066SKrishna Gudipati } 110060138066SKrishna Gudipati } 110160138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 110260138066SKrishna Gudipati return 0; 110360138066SKrishna Gudipati } 110460138066SKrishna Gudipati 110560138066SKrishna Gudipati static int 1106f2ee7601SKrishna Gudipati bfad_iocmd_itnim_reset_stats(struct bfad_s *bfad, void *cmd) 1107f2ee7601SKrishna Gudipati { 1108f2ee7601SKrishna Gudipati struct bfa_bsg_rport_reset_stats_s *iocmd = 1109f2ee7601SKrishna Gudipati (struct bfa_bsg_rport_reset_stats_s *)cmd; 1110f2ee7601SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 1111f2ee7601SKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 1112f2ee7601SKrishna Gudipati unsigned long flags; 1113f2ee7601SKrishna Gudipati 1114f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1115f2ee7601SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 1116f2ee7601SKrishna Gudipati iocmd->vf_id, iocmd->pwwn); 1117f2ee7601SKrishna Gudipati if (!fcs_port) 1118f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 1119f2ee7601SKrishna Gudipati else { 1120f2ee7601SKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 1121f2ee7601SKrishna Gudipati if (itnim == NULL) 1122f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 1123f2ee7601SKrishna Gudipati else { 1124f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 1125f2ee7601SKrishna Gudipati bfa_fcs_itnim_stats_clear(fcs_port, iocmd->rpwwn); 1126f2ee7601SKrishna Gudipati bfa_itnim_clear_stats(bfa_fcs_itnim_get_halitn(itnim)); 1127f2ee7601SKrishna Gudipati } 1128f2ee7601SKrishna Gudipati } 1129f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1130f2ee7601SKrishna Gudipati 1131f2ee7601SKrishna Gudipati return 0; 1132f2ee7601SKrishna Gudipati } 1133f2ee7601SKrishna Gudipati 1134f2ee7601SKrishna Gudipati static int 113560138066SKrishna Gudipati bfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd) 113660138066SKrishna Gudipati { 113760138066SKrishna Gudipati struct bfa_bsg_itnim_itnstats_s *iocmd = 113860138066SKrishna Gudipati (struct bfa_bsg_itnim_itnstats_s *)cmd; 113960138066SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 114060138066SKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 114160138066SKrishna Gudipati unsigned long flags; 114260138066SKrishna Gudipati 114360138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 114460138066SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 114560138066SKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 114660138066SKrishna Gudipati if (!fcs_port) { 114760138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 114860138066SKrishna Gudipati bfa_trc(bfad, 0); 114960138066SKrishna Gudipati } else { 115060138066SKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 115160138066SKrishna Gudipati if (itnim == NULL) 115260138066SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 115360138066SKrishna Gudipati else { 115460138066SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 115560138066SKrishna Gudipati bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn, 115660138066SKrishna Gudipati &iocmd->itnstats); 115760138066SKrishna Gudipati } 115860138066SKrishna Gudipati } 115960138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 116060138066SKrishna Gudipati return 0; 116160138066SKrishna Gudipati } 116260138066SKrishna Gudipati 1163*3bbd8ef9SLee Jones static int 116460138066SKrishna Gudipati bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd) 116560138066SKrishna Gudipati { 116660138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 116760138066SKrishna Gudipati unsigned long flags; 116860138066SKrishna Gudipati 116960138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 117060138066SKrishna Gudipati iocmd->status = bfa_fcport_enable(&bfad->bfa); 117160138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 117260138066SKrishna Gudipati 117360138066SKrishna Gudipati return 0; 117460138066SKrishna Gudipati } 117560138066SKrishna Gudipati 1176*3bbd8ef9SLee Jones static int 117760138066SKrishna Gudipati bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd) 117860138066SKrishna Gudipati { 117960138066SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 118060138066SKrishna Gudipati unsigned long flags; 118160138066SKrishna Gudipati 118260138066SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 118360138066SKrishna Gudipati iocmd->status = bfa_fcport_disable(&bfad->bfa); 118460138066SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 118560138066SKrishna Gudipati 118660138066SKrishna Gudipati return 0; 118760138066SKrishna Gudipati } 118860138066SKrishna Gudipati 1189*3bbd8ef9SLee Jones static int 11901a4d8e1bSKrishna Gudipati bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd) 11911a4d8e1bSKrishna Gudipati { 11921a4d8e1bSKrishna Gudipati struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd; 11931a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 11941a4d8e1bSKrishna Gudipati unsigned long flags; 11951a4d8e1bSKrishna Gudipati 11961a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 11971a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 11981a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk, 11991a4d8e1bSKrishna Gudipati &iocmd->pcifn_cfg, 12001a4d8e1bSKrishna Gudipati bfad_hcb_comp, &fcomp); 12011a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12021a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12031a4d8e1bSKrishna Gudipati goto out; 12041a4d8e1bSKrishna Gudipati 12051a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 12061a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 12071a4d8e1bSKrishna Gudipati out: 12081a4d8e1bSKrishna Gudipati return 0; 12091a4d8e1bSKrishna Gudipati } 12101a4d8e1bSKrishna Gudipati 1211*3bbd8ef9SLee Jones static int 12121a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd) 12131a4d8e1bSKrishna Gudipati { 12141a4d8e1bSKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 12151a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 12161a4d8e1bSKrishna Gudipati unsigned long flags; 12171a4d8e1bSKrishna Gudipati 12181a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 12191a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12201a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk, 12211a4d8e1bSKrishna Gudipati &iocmd->pcifn_id, iocmd->port, 12221a1297c6SKrishna Gudipati iocmd->pcifn_class, iocmd->bw_min, 12231a1297c6SKrishna Gudipati iocmd->bw_max, bfad_hcb_comp, &fcomp); 12241a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12251a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12261a4d8e1bSKrishna Gudipati goto out; 12271a4d8e1bSKrishna Gudipati 12281a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 12291a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 12301a4d8e1bSKrishna Gudipati out: 12311a4d8e1bSKrishna Gudipati return 0; 12321a4d8e1bSKrishna Gudipati } 12331a4d8e1bSKrishna Gudipati 1234*3bbd8ef9SLee Jones static int 12351a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd) 12361a4d8e1bSKrishna Gudipati { 12371a4d8e1bSKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 12381a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 12391a4d8e1bSKrishna Gudipati unsigned long flags; 12401a4d8e1bSKrishna Gudipati 12411a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 12421a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12431a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk, 12441a4d8e1bSKrishna Gudipati iocmd->pcifn_id, 12451a4d8e1bSKrishna Gudipati bfad_hcb_comp, &fcomp); 12461a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12471a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12481a4d8e1bSKrishna Gudipati goto out; 12491a4d8e1bSKrishna Gudipati 12501a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 12511a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 12521a4d8e1bSKrishna Gudipati out: 12531a4d8e1bSKrishna Gudipati return 0; 12541a4d8e1bSKrishna Gudipati } 12551a4d8e1bSKrishna Gudipati 1256*3bbd8ef9SLee Jones static int 12571a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd) 12581a4d8e1bSKrishna Gudipati { 12591a4d8e1bSKrishna Gudipati struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd; 12601a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 12611a4d8e1bSKrishna Gudipati unsigned long flags; 12621a4d8e1bSKrishna Gudipati 12631a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 12641a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12651a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk, 12661a1297c6SKrishna Gudipati iocmd->pcifn_id, iocmd->bw_min, 12671a1297c6SKrishna Gudipati iocmd->bw_max, bfad_hcb_comp, &fcomp); 12681a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12691a4d8e1bSKrishna Gudipati bfa_trc(bfad, iocmd->status); 12701a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12711a4d8e1bSKrishna Gudipati goto out; 12721a4d8e1bSKrishna Gudipati 12731a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 12741a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 12751a4d8e1bSKrishna Gudipati bfa_trc(bfad, iocmd->status); 12761a4d8e1bSKrishna Gudipati out: 12771a4d8e1bSKrishna Gudipati return 0; 12781a4d8e1bSKrishna Gudipati } 12791a4d8e1bSKrishna Gudipati 1280*3bbd8ef9SLee Jones static int 12811a4d8e1bSKrishna Gudipati bfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd) 12821a4d8e1bSKrishna Gudipati { 12831a4d8e1bSKrishna Gudipati struct bfa_bsg_adapter_cfg_mode_s *iocmd = 12841a4d8e1bSKrishna Gudipati (struct bfa_bsg_adapter_cfg_mode_s *)cmd; 12851a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 12861a4d8e1bSKrishna Gudipati unsigned long flags = 0; 12871a4d8e1bSKrishna Gudipati 12881a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 12891a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 12901a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk, 12911a4d8e1bSKrishna Gudipati iocmd->cfg.mode, iocmd->cfg.max_pf, 12921a4d8e1bSKrishna Gudipati iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp); 12931a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 12941a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 12951a4d8e1bSKrishna Gudipati goto out; 12961a4d8e1bSKrishna Gudipati 12971a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 12981a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 12991a4d8e1bSKrishna Gudipati out: 13001a4d8e1bSKrishna Gudipati return 0; 13011a4d8e1bSKrishna Gudipati } 13021a4d8e1bSKrishna Gudipati 1303*3bbd8ef9SLee Jones static int 13041a4d8e1bSKrishna Gudipati bfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd) 13051a4d8e1bSKrishna Gudipati { 13061a4d8e1bSKrishna Gudipati struct bfa_bsg_port_cfg_mode_s *iocmd = 13071a4d8e1bSKrishna Gudipati (struct bfa_bsg_port_cfg_mode_s *)cmd; 13081a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 13091a4d8e1bSKrishna Gudipati unsigned long flags = 0; 13101a4d8e1bSKrishna Gudipati 13111a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 13121a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13131a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk, 13141a4d8e1bSKrishna Gudipati iocmd->instance, iocmd->cfg.mode, 13151a4d8e1bSKrishna Gudipati iocmd->cfg.max_pf, iocmd->cfg.max_vf, 13161a4d8e1bSKrishna Gudipati bfad_hcb_comp, &fcomp); 13171a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13181a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 13191a4d8e1bSKrishna Gudipati goto out; 13201a4d8e1bSKrishna Gudipati 13211a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 13221a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 13231a4d8e1bSKrishna Gudipati out: 13241a4d8e1bSKrishna Gudipati return 0; 13251a4d8e1bSKrishna Gudipati } 13261a4d8e1bSKrishna Gudipati 1327*3bbd8ef9SLee Jones static int 13281a4d8e1bSKrishna Gudipati bfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd) 13291a4d8e1bSKrishna Gudipati { 13301a4d8e1bSKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd; 13311a4d8e1bSKrishna Gudipati struct bfad_hal_comp fcomp; 13321a4d8e1bSKrishna Gudipati unsigned long flags; 13331a4d8e1bSKrishna Gudipati 13341a4d8e1bSKrishna Gudipati init_completion(&fcomp.comp); 13351a4d8e1bSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 13361a4d8e1bSKrishna Gudipati if (cmd == IOCMD_FLASH_ENABLE_OPTROM) 13371a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk, 13381a4d8e1bSKrishna Gudipati bfad_hcb_comp, &fcomp); 13391a4d8e1bSKrishna Gudipati else 13401a4d8e1bSKrishna Gudipati iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk, 13411a4d8e1bSKrishna Gudipati bfad_hcb_comp, &fcomp); 13421a4d8e1bSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 13431a4d8e1bSKrishna Gudipati 13441a4d8e1bSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 13451a4d8e1bSKrishna Gudipati goto out; 13461a4d8e1bSKrishna Gudipati 13471a4d8e1bSKrishna Gudipati wait_for_completion(&fcomp.comp); 13481a4d8e1bSKrishna Gudipati iocmd->status = fcomp.status; 13491a4d8e1bSKrishna Gudipati out: 13501a4d8e1bSKrishna Gudipati return 0; 13511a4d8e1bSKrishna Gudipati } 13521a4d8e1bSKrishna Gudipati 1353*3bbd8ef9SLee Jones static int 1354a714134aSKrishna Gudipati bfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd) 1355a714134aSKrishna Gudipati { 1356a714134aSKrishna Gudipati struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd; 1357a714134aSKrishna Gudipati struct bfad_hal_comp fcomp; 1358a714134aSKrishna Gudipati unsigned long flags; 1359a714134aSKrishna Gudipati 1360a714134aSKrishna Gudipati init_completion(&fcomp.comp); 1361a714134aSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 1362a714134aSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1363a714134aSKrishna Gudipati iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr, 1364a714134aSKrishna Gudipati bfad_hcb_comp, &fcomp); 1365a714134aSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1366a714134aSKrishna Gudipati 1367a714134aSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 1368a714134aSKrishna Gudipati goto out; 1369a714134aSKrishna Gudipati 1370a714134aSKrishna Gudipati wait_for_completion(&fcomp.comp); 1371a714134aSKrishna Gudipati iocmd->status = fcomp.status; 1372a714134aSKrishna Gudipati out: 1373a714134aSKrishna Gudipati return 0; 1374a714134aSKrishna Gudipati } 1375a714134aSKrishna Gudipati 1376*3bbd8ef9SLee Jones static int 1377148d6103SKrishna Gudipati bfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 1378148d6103SKrishna Gudipati { 1379148d6103SKrishna Gudipati struct bfa_bsg_cee_attr_s *iocmd = 1380148d6103SKrishna Gudipati (struct bfa_bsg_cee_attr_s *)cmd; 1381148d6103SKrishna Gudipati void *iocmd_bufptr; 1382148d6103SKrishna Gudipati struct bfad_hal_comp cee_comp; 1383148d6103SKrishna Gudipati unsigned long flags; 1384148d6103SKrishna Gudipati 1385148d6103SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 1386148d6103SKrishna Gudipati sizeof(struct bfa_bsg_cee_attr_s), 1387148d6103SKrishna Gudipati sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) { 1388148d6103SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 1389148d6103SKrishna Gudipati return 0; 1390148d6103SKrishna Gudipati } 1391148d6103SKrishna Gudipati 1392148d6103SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s); 1393148d6103SKrishna Gudipati 1394148d6103SKrishna Gudipati cee_comp.status = 0; 1395148d6103SKrishna Gudipati init_completion(&cee_comp.comp); 1396148d6103SKrishna Gudipati mutex_lock(&bfad_mutex); 1397148d6103SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1398148d6103SKrishna Gudipati iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr, 1399148d6103SKrishna Gudipati bfad_hcb_comp, &cee_comp); 1400148d6103SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1401148d6103SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 1402148d6103SKrishna Gudipati mutex_unlock(&bfad_mutex); 1403148d6103SKrishna Gudipati bfa_trc(bfad, 0x5555); 1404148d6103SKrishna Gudipati goto out; 1405148d6103SKrishna Gudipati } 1406148d6103SKrishna Gudipati wait_for_completion(&cee_comp.comp); 1407148d6103SKrishna Gudipati mutex_unlock(&bfad_mutex); 1408148d6103SKrishna Gudipati out: 1409148d6103SKrishna Gudipati return 0; 1410148d6103SKrishna Gudipati } 1411148d6103SKrishna Gudipati 1412*3bbd8ef9SLee Jones static int 1413148d6103SKrishna Gudipati bfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd, 1414148d6103SKrishna Gudipati unsigned int payload_len) 1415148d6103SKrishna Gudipati { 1416148d6103SKrishna Gudipati struct bfa_bsg_cee_stats_s *iocmd = 1417148d6103SKrishna Gudipati (struct bfa_bsg_cee_stats_s *)cmd; 1418148d6103SKrishna Gudipati void *iocmd_bufptr; 1419148d6103SKrishna Gudipati struct bfad_hal_comp cee_comp; 1420148d6103SKrishna Gudipati unsigned long flags; 1421148d6103SKrishna Gudipati 1422148d6103SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 1423148d6103SKrishna Gudipati sizeof(struct bfa_bsg_cee_stats_s), 1424148d6103SKrishna Gudipati sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) { 1425148d6103SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 1426148d6103SKrishna Gudipati return 0; 1427148d6103SKrishna Gudipati } 1428148d6103SKrishna Gudipati 1429148d6103SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s); 1430148d6103SKrishna Gudipati 1431148d6103SKrishna Gudipati cee_comp.status = 0; 1432148d6103SKrishna Gudipati init_completion(&cee_comp.comp); 1433148d6103SKrishna Gudipati mutex_lock(&bfad_mutex); 1434148d6103SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1435148d6103SKrishna Gudipati iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr, 1436148d6103SKrishna Gudipati bfad_hcb_comp, &cee_comp); 1437148d6103SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1438148d6103SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 1439148d6103SKrishna Gudipati mutex_unlock(&bfad_mutex); 1440148d6103SKrishna Gudipati bfa_trc(bfad, 0x5555); 1441148d6103SKrishna Gudipati goto out; 1442148d6103SKrishna Gudipati } 1443148d6103SKrishna Gudipati wait_for_completion(&cee_comp.comp); 1444148d6103SKrishna Gudipati mutex_unlock(&bfad_mutex); 1445148d6103SKrishna Gudipati out: 1446148d6103SKrishna Gudipati return 0; 1447148d6103SKrishna Gudipati } 1448148d6103SKrishna Gudipati 1449*3bbd8ef9SLee Jones static int 1450148d6103SKrishna Gudipati bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd) 1451148d6103SKrishna Gudipati { 1452148d6103SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 1453148d6103SKrishna Gudipati unsigned long flags; 1454148d6103SKrishna Gudipati 1455148d6103SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 1456148d6103SKrishna Gudipati iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL); 1457148d6103SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1458148d6103SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 1459148d6103SKrishna Gudipati bfa_trc(bfad, 0x5555); 1460148d6103SKrishna Gudipati return 0; 1461148d6103SKrishna Gudipati } 1462148d6103SKrishna Gudipati 1463*3bbd8ef9SLee Jones static int 146451e569aaSKrishna Gudipati bfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd) 146551e569aaSKrishna Gudipati { 146651e569aaSKrishna Gudipati struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd; 146751e569aaSKrishna Gudipati struct bfad_hal_comp fcomp; 146851e569aaSKrishna Gudipati unsigned long flags; 146951e569aaSKrishna Gudipati 147051e569aaSKrishna Gudipati init_completion(&fcomp.comp); 147151e569aaSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 147251e569aaSKrishna Gudipati iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media, 147351e569aaSKrishna Gudipati bfad_hcb_comp, &fcomp); 147451e569aaSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 147551e569aaSKrishna Gudipati bfa_trc(bfad, iocmd->status); 147651e569aaSKrishna Gudipati if (iocmd->status != BFA_STATUS_SFP_NOT_READY) 147751e569aaSKrishna Gudipati goto out; 147851e569aaSKrishna Gudipati 147951e569aaSKrishna Gudipati wait_for_completion(&fcomp.comp); 148051e569aaSKrishna Gudipati iocmd->status = fcomp.status; 148151e569aaSKrishna Gudipati out: 148251e569aaSKrishna Gudipati return 0; 148351e569aaSKrishna Gudipati } 148451e569aaSKrishna Gudipati 1485*3bbd8ef9SLee Jones static int 148651e569aaSKrishna Gudipati bfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd) 148751e569aaSKrishna Gudipati { 148851e569aaSKrishna Gudipati struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd; 148951e569aaSKrishna Gudipati struct bfad_hal_comp fcomp; 149051e569aaSKrishna Gudipati unsigned long flags; 149151e569aaSKrishna Gudipati 149251e569aaSKrishna Gudipati init_completion(&fcomp.comp); 149351e569aaSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 149451e569aaSKrishna Gudipati iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed, 149551e569aaSKrishna Gudipati bfad_hcb_comp, &fcomp); 149651e569aaSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 149751e569aaSKrishna Gudipati bfa_trc(bfad, iocmd->status); 149851e569aaSKrishna Gudipati if (iocmd->status != BFA_STATUS_SFP_NOT_READY) 149951e569aaSKrishna Gudipati goto out; 150051e569aaSKrishna Gudipati wait_for_completion(&fcomp.comp); 150151e569aaSKrishna Gudipati iocmd->status = fcomp.status; 150251e569aaSKrishna Gudipati out: 150351e569aaSKrishna Gudipati return 0; 150451e569aaSKrishna Gudipati } 150551e569aaSKrishna Gudipati 1506*3bbd8ef9SLee Jones static int 15075a54b1d5SKrishna Gudipati bfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd) 15085a54b1d5SKrishna Gudipati { 15095a54b1d5SKrishna Gudipati struct bfa_bsg_flash_attr_s *iocmd = 15105a54b1d5SKrishna Gudipati (struct bfa_bsg_flash_attr_s *)cmd; 15115a54b1d5SKrishna Gudipati struct bfad_hal_comp fcomp; 15125a54b1d5SKrishna Gudipati unsigned long flags; 15135a54b1d5SKrishna Gudipati 15145a54b1d5SKrishna Gudipati init_completion(&fcomp.comp); 15155a54b1d5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 15165a54b1d5SKrishna Gudipati iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr, 15175a54b1d5SKrishna Gudipati bfad_hcb_comp, &fcomp); 15185a54b1d5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 15195a54b1d5SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 15205a54b1d5SKrishna Gudipati goto out; 15215a54b1d5SKrishna Gudipati wait_for_completion(&fcomp.comp); 15225a54b1d5SKrishna Gudipati iocmd->status = fcomp.status; 15235a54b1d5SKrishna Gudipati out: 15245a54b1d5SKrishna Gudipati return 0; 15255a54b1d5SKrishna Gudipati } 15265a54b1d5SKrishna Gudipati 1527*3bbd8ef9SLee Jones static int 15285a54b1d5SKrishna Gudipati bfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd) 15295a54b1d5SKrishna Gudipati { 15305a54b1d5SKrishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 15315a54b1d5SKrishna Gudipati struct bfad_hal_comp fcomp; 15325a54b1d5SKrishna Gudipati unsigned long flags; 15335a54b1d5SKrishna Gudipati 15345a54b1d5SKrishna Gudipati init_completion(&fcomp.comp); 15355a54b1d5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 15365a54b1d5SKrishna Gudipati iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type, 15375a54b1d5SKrishna Gudipati iocmd->instance, bfad_hcb_comp, &fcomp); 15385a54b1d5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 15395a54b1d5SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 15405a54b1d5SKrishna Gudipati goto out; 15415a54b1d5SKrishna Gudipati wait_for_completion(&fcomp.comp); 15425a54b1d5SKrishna Gudipati iocmd->status = fcomp.status; 15435a54b1d5SKrishna Gudipati out: 15445a54b1d5SKrishna Gudipati return 0; 15455a54b1d5SKrishna Gudipati } 15465a54b1d5SKrishna Gudipati 1547*3bbd8ef9SLee Jones static int 15485a54b1d5SKrishna Gudipati bfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd, 15495a54b1d5SKrishna Gudipati unsigned int payload_len) 15505a54b1d5SKrishna Gudipati { 15515a54b1d5SKrishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 15525a54b1d5SKrishna Gudipati void *iocmd_bufptr; 15535a54b1d5SKrishna Gudipati struct bfad_hal_comp fcomp; 15545a54b1d5SKrishna Gudipati unsigned long flags; 15555a54b1d5SKrishna Gudipati 15565a54b1d5SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 15575a54b1d5SKrishna Gudipati sizeof(struct bfa_bsg_flash_s), 15585a54b1d5SKrishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 15595a54b1d5SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 15605a54b1d5SKrishna Gudipati return 0; 15615a54b1d5SKrishna Gudipati } 15625a54b1d5SKrishna Gudipati 15635a54b1d5SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s); 15645a54b1d5SKrishna Gudipati 15655a54b1d5SKrishna Gudipati init_completion(&fcomp.comp); 15665a54b1d5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 15675a54b1d5SKrishna Gudipati iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), 15685a54b1d5SKrishna Gudipati iocmd->type, iocmd->instance, iocmd_bufptr, 15695a54b1d5SKrishna Gudipati iocmd->bufsz, 0, bfad_hcb_comp, &fcomp); 15705a54b1d5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 15715a54b1d5SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 15725a54b1d5SKrishna Gudipati goto out; 15735a54b1d5SKrishna Gudipati wait_for_completion(&fcomp.comp); 15745a54b1d5SKrishna Gudipati iocmd->status = fcomp.status; 15755a54b1d5SKrishna Gudipati out: 15765a54b1d5SKrishna Gudipati return 0; 15775a54b1d5SKrishna Gudipati } 15785a54b1d5SKrishna Gudipati 1579*3bbd8ef9SLee Jones static int 15805a54b1d5SKrishna Gudipati bfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd, 15815a54b1d5SKrishna Gudipati unsigned int payload_len) 15825a54b1d5SKrishna Gudipati { 15835a54b1d5SKrishna Gudipati struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd; 15845a54b1d5SKrishna Gudipati struct bfad_hal_comp fcomp; 15855a54b1d5SKrishna Gudipati void *iocmd_bufptr; 15865a54b1d5SKrishna Gudipati unsigned long flags; 15875a54b1d5SKrishna Gudipati 15885a54b1d5SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 15895a54b1d5SKrishna Gudipati sizeof(struct bfa_bsg_flash_s), 15905a54b1d5SKrishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 15915a54b1d5SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 15925a54b1d5SKrishna Gudipati return 0; 15935a54b1d5SKrishna Gudipati } 15945a54b1d5SKrishna Gudipati 15955a54b1d5SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s); 15965a54b1d5SKrishna Gudipati 15975a54b1d5SKrishna Gudipati init_completion(&fcomp.comp); 15985a54b1d5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 15995a54b1d5SKrishna Gudipati iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type, 16005a54b1d5SKrishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0, 16015a54b1d5SKrishna Gudipati bfad_hcb_comp, &fcomp); 16025a54b1d5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16035a54b1d5SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 16045a54b1d5SKrishna Gudipati goto out; 16055a54b1d5SKrishna Gudipati wait_for_completion(&fcomp.comp); 16065a54b1d5SKrishna Gudipati iocmd->status = fcomp.status; 16075a54b1d5SKrishna Gudipati out: 16085a54b1d5SKrishna Gudipati return 0; 16095a54b1d5SKrishna Gudipati } 16105a54b1d5SKrishna Gudipati 1611*3bbd8ef9SLee Jones static int 16123d7fc66dSKrishna Gudipati bfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd) 16133d7fc66dSKrishna Gudipati { 16143d7fc66dSKrishna Gudipati struct bfa_bsg_diag_get_temp_s *iocmd = 16153d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_get_temp_s *)cmd; 16163d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 16173d7fc66dSKrishna Gudipati unsigned long flags; 16183d7fc66dSKrishna Gudipati 16193d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 16203d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 16213d7fc66dSKrishna Gudipati iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa), 16223d7fc66dSKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 16233d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16243d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 16253d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 16263d7fc66dSKrishna Gudipati goto out; 16273d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 16283d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 16293d7fc66dSKrishna Gudipati out: 16303d7fc66dSKrishna Gudipati return 0; 16313d7fc66dSKrishna Gudipati } 16323d7fc66dSKrishna Gudipati 1633*3bbd8ef9SLee Jones static int 16343d7fc66dSKrishna Gudipati bfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd) 16353d7fc66dSKrishna Gudipati { 16363d7fc66dSKrishna Gudipati struct bfa_bsg_diag_memtest_s *iocmd = 16373d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_memtest_s *)cmd; 16383d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 16393d7fc66dSKrishna Gudipati unsigned long flags; 16403d7fc66dSKrishna Gudipati 16413d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 16423d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 16433d7fc66dSKrishna Gudipati iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa), 16443d7fc66dSKrishna Gudipati &iocmd->memtest, iocmd->pat, 16453d7fc66dSKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 16463d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16473d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 16483d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 16493d7fc66dSKrishna Gudipati goto out; 16503d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 16513d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 16523d7fc66dSKrishna Gudipati out: 16533d7fc66dSKrishna Gudipati return 0; 16543d7fc66dSKrishna Gudipati } 16553d7fc66dSKrishna Gudipati 1656*3bbd8ef9SLee Jones static int 16573d7fc66dSKrishna Gudipati bfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd) 16583d7fc66dSKrishna Gudipati { 16593d7fc66dSKrishna Gudipati struct bfa_bsg_diag_loopback_s *iocmd = 16603d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_loopback_s *)cmd; 16613d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 16623d7fc66dSKrishna Gudipati unsigned long flags; 16633d7fc66dSKrishna Gudipati 16643d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 16653d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 16663d7fc66dSKrishna Gudipati iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode, 16673d7fc66dSKrishna Gudipati iocmd->speed, iocmd->lpcnt, iocmd->pat, 16683d7fc66dSKrishna Gudipati &iocmd->result, bfad_hcb_comp, &fcomp); 16693d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16703d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 16713d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 16723d7fc66dSKrishna Gudipati goto out; 16733d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 16743d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 16753d7fc66dSKrishna Gudipati out: 16763d7fc66dSKrishna Gudipati return 0; 16773d7fc66dSKrishna Gudipati } 16783d7fc66dSKrishna Gudipati 1679*3bbd8ef9SLee Jones static int 16803d7fc66dSKrishna Gudipati bfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd) 16813d7fc66dSKrishna Gudipati { 16823d7fc66dSKrishna Gudipati struct bfa_bsg_diag_fwping_s *iocmd = 16833d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_fwping_s *)cmd; 16843d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 16853d7fc66dSKrishna Gudipati unsigned long flags; 16863d7fc66dSKrishna Gudipati 16873d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 16883d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 16893d7fc66dSKrishna Gudipati iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt, 16903d7fc66dSKrishna Gudipati iocmd->pattern, &iocmd->result, 16913d7fc66dSKrishna Gudipati bfad_hcb_comp, &fcomp); 16923d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 16933d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 16943d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 16953d7fc66dSKrishna Gudipati goto out; 16963d7fc66dSKrishna Gudipati bfa_trc(bfad, 0x77771); 16973d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 16983d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 16993d7fc66dSKrishna Gudipati out: 17003d7fc66dSKrishna Gudipati return 0; 17013d7fc66dSKrishna Gudipati } 17023d7fc66dSKrishna Gudipati 1703*3bbd8ef9SLee Jones static int 17043d7fc66dSKrishna Gudipati bfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd) 17053d7fc66dSKrishna Gudipati { 17063d7fc66dSKrishna Gudipati struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd; 17073d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 17083d7fc66dSKrishna Gudipati unsigned long flags; 17093d7fc66dSKrishna Gudipati 17103d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 17113d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 17123d7fc66dSKrishna Gudipati iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force, 17133d7fc66dSKrishna Gudipati iocmd->queue, &iocmd->result, 17143d7fc66dSKrishna Gudipati bfad_hcb_comp, &fcomp); 17153d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 17163d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 17173d7fc66dSKrishna Gudipati goto out; 17183d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 17193d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 17203d7fc66dSKrishna Gudipati out: 17213d7fc66dSKrishna Gudipati return 0; 17223d7fc66dSKrishna Gudipati } 17233d7fc66dSKrishna Gudipati 1724*3bbd8ef9SLee Jones static int 17253d7fc66dSKrishna Gudipati bfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd) 17263d7fc66dSKrishna Gudipati { 17273d7fc66dSKrishna Gudipati struct bfa_bsg_sfp_show_s *iocmd = 17283d7fc66dSKrishna Gudipati (struct bfa_bsg_sfp_show_s *)cmd; 17293d7fc66dSKrishna Gudipati struct bfad_hal_comp fcomp; 17303d7fc66dSKrishna Gudipati unsigned long flags; 17313d7fc66dSKrishna Gudipati 17323d7fc66dSKrishna Gudipati init_completion(&fcomp.comp); 17333d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 17343d7fc66dSKrishna Gudipati iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp, 17353d7fc66dSKrishna Gudipati bfad_hcb_comp, &fcomp); 17363d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 17373d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 17383d7fc66dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 17393d7fc66dSKrishna Gudipati goto out; 17403d7fc66dSKrishna Gudipati wait_for_completion(&fcomp.comp); 17413d7fc66dSKrishna Gudipati iocmd->status = fcomp.status; 17423d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 17433d7fc66dSKrishna Gudipati out: 17443d7fc66dSKrishna Gudipati return 0; 17453d7fc66dSKrishna Gudipati } 17463d7fc66dSKrishna Gudipati 1747*3bbd8ef9SLee Jones static int 17483d7fc66dSKrishna Gudipati bfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd) 17493d7fc66dSKrishna Gudipati { 17503d7fc66dSKrishna Gudipati struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd; 17513d7fc66dSKrishna Gudipati unsigned long flags; 17523d7fc66dSKrishna Gudipati 17533d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 17543d7fc66dSKrishna Gudipati iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa), 17553d7fc66dSKrishna Gudipati &iocmd->ledtest); 17563d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 17573d7fc66dSKrishna Gudipati return 0; 17583d7fc66dSKrishna Gudipati } 17593d7fc66dSKrishna Gudipati 1760*3bbd8ef9SLee Jones static int 17613d7fc66dSKrishna Gudipati bfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd) 17623d7fc66dSKrishna Gudipati { 17633d7fc66dSKrishna Gudipati struct bfa_bsg_diag_beacon_s *iocmd = 17643d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_beacon_s *)cmd; 17653d7fc66dSKrishna Gudipati unsigned long flags; 17663d7fc66dSKrishna Gudipati 17673d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 17683d7fc66dSKrishna Gudipati iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa), 17693d7fc66dSKrishna Gudipati iocmd->beacon, iocmd->link_e2e_beacon, 17703d7fc66dSKrishna Gudipati iocmd->second); 17713d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 17723d7fc66dSKrishna Gudipati return 0; 17733d7fc66dSKrishna Gudipati } 17743d7fc66dSKrishna Gudipati 1775*3bbd8ef9SLee Jones static int 17763d7fc66dSKrishna Gudipati bfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd) 17773d7fc66dSKrishna Gudipati { 17783d7fc66dSKrishna Gudipati struct bfa_bsg_diag_lb_stat_s *iocmd = 17793d7fc66dSKrishna Gudipati (struct bfa_bsg_diag_lb_stat_s *)cmd; 17803d7fc66dSKrishna Gudipati unsigned long flags; 17813d7fc66dSKrishna Gudipati 17823d7fc66dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 17833d7fc66dSKrishna Gudipati iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa); 17843d7fc66dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 17853d7fc66dSKrishna Gudipati bfa_trc(bfad, iocmd->status); 17863d7fc66dSKrishna Gudipati 17873d7fc66dSKrishna Gudipati return 0; 17883d7fc66dSKrishna Gudipati } 17893d7fc66dSKrishna Gudipati 1790*3bbd8ef9SLee Jones static int 17911a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_enable(struct bfad_s *bfad, void *pcmd) 17921a898a79SVijaya Mohan Guvva { 17931a898a79SVijaya Mohan Guvva struct bfa_bsg_dport_enable_s *iocmd = 17941a898a79SVijaya Mohan Guvva (struct bfa_bsg_dport_enable_s *)pcmd; 17951a898a79SVijaya Mohan Guvva unsigned long flags; 17961a898a79SVijaya Mohan Guvva struct bfad_hal_comp fcomp; 17971a898a79SVijaya Mohan Guvva 17981a898a79SVijaya Mohan Guvva init_completion(&fcomp.comp); 17991a898a79SVijaya Mohan Guvva spin_lock_irqsave(&bfad->bfad_lock, flags); 18001a898a79SVijaya Mohan Guvva iocmd->status = bfa_dport_enable(&bfad->bfa, iocmd->lpcnt, 18011a898a79SVijaya Mohan Guvva iocmd->pat, bfad_hcb_comp, &fcomp); 18021a898a79SVijaya Mohan Guvva spin_unlock_irqrestore(&bfad->bfad_lock, flags); 18031a898a79SVijaya Mohan Guvva if (iocmd->status != BFA_STATUS_OK) 18041a898a79SVijaya Mohan Guvva bfa_trc(bfad, iocmd->status); 18051a898a79SVijaya Mohan Guvva else { 18061a898a79SVijaya Mohan Guvva wait_for_completion(&fcomp.comp); 18071a898a79SVijaya Mohan Guvva iocmd->status = fcomp.status; 18081a898a79SVijaya Mohan Guvva } 18091a898a79SVijaya Mohan Guvva return 0; 18101a898a79SVijaya Mohan Guvva } 18111a898a79SVijaya Mohan Guvva 1812*3bbd8ef9SLee Jones static int 18131a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_disable(struct bfad_s *bfad, void *pcmd) 1814e353546eSKrishna Gudipati { 1815e353546eSKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd; 1816e353546eSKrishna Gudipati unsigned long flags; 1817e353546eSKrishna Gudipati struct bfad_hal_comp fcomp; 1818e353546eSKrishna Gudipati 1819e353546eSKrishna Gudipati init_completion(&fcomp.comp); 1820e353546eSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 18211a898a79SVijaya Mohan Guvva iocmd->status = bfa_dport_disable(&bfad->bfa, bfad_hcb_comp, &fcomp); 1822e353546eSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1823e353546eSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 1824e353546eSKrishna Gudipati bfa_trc(bfad, iocmd->status); 1825e353546eSKrishna Gudipati else { 1826e353546eSKrishna Gudipati wait_for_completion(&fcomp.comp); 1827e353546eSKrishna Gudipati iocmd->status = fcomp.status; 1828e353546eSKrishna Gudipati } 18291a898a79SVijaya Mohan Guvva return 0; 18301a898a79SVijaya Mohan Guvva } 18311a898a79SVijaya Mohan Guvva 1832*3bbd8ef9SLee Jones static int 18331a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_start(struct bfad_s *bfad, void *pcmd) 18341a898a79SVijaya Mohan Guvva { 18351a898a79SVijaya Mohan Guvva struct bfa_bsg_dport_enable_s *iocmd = 18361a898a79SVijaya Mohan Guvva (struct bfa_bsg_dport_enable_s *)pcmd; 18371a898a79SVijaya Mohan Guvva unsigned long flags; 18381a898a79SVijaya Mohan Guvva struct bfad_hal_comp fcomp; 18391a898a79SVijaya Mohan Guvva 18401a898a79SVijaya Mohan Guvva init_completion(&fcomp.comp); 18411a898a79SVijaya Mohan Guvva spin_lock_irqsave(&bfad->bfad_lock, flags); 18421a898a79SVijaya Mohan Guvva iocmd->status = bfa_dport_start(&bfad->bfa, iocmd->lpcnt, 18431a898a79SVijaya Mohan Guvva iocmd->pat, bfad_hcb_comp, 18441a898a79SVijaya Mohan Guvva &fcomp); 18451a898a79SVijaya Mohan Guvva spin_unlock_irqrestore(&bfad->bfad_lock, flags); 18461a898a79SVijaya Mohan Guvva 18471a898a79SVijaya Mohan Guvva if (iocmd->status != BFA_STATUS_OK) { 18481a898a79SVijaya Mohan Guvva bfa_trc(bfad, iocmd->status); 18491a898a79SVijaya Mohan Guvva } else { 18501a898a79SVijaya Mohan Guvva wait_for_completion(&fcomp.comp); 18511a898a79SVijaya Mohan Guvva iocmd->status = fcomp.status; 18521a898a79SVijaya Mohan Guvva } 1853e353546eSKrishna Gudipati 1854e353546eSKrishna Gudipati return 0; 1855e353546eSKrishna Gudipati } 1856e353546eSKrishna Gudipati 1857*3bbd8ef9SLee Jones static int 18581a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_show(struct bfad_s *bfad, void *pcmd) 1859e353546eSKrishna Gudipati { 18601a898a79SVijaya Mohan Guvva struct bfa_bsg_diag_dport_show_s *iocmd = 18611a898a79SVijaya Mohan Guvva (struct bfa_bsg_diag_dport_show_s *)pcmd; 1862e353546eSKrishna Gudipati unsigned long flags; 1863e353546eSKrishna Gudipati 1864e353546eSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 18651a898a79SVijaya Mohan Guvva iocmd->status = bfa_dport_show(&bfad->bfa, &iocmd->result); 1866e353546eSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1867e353546eSKrishna Gudipati 1868e353546eSKrishna Gudipati return 0; 1869e353546eSKrishna Gudipati } 1870e353546eSKrishna Gudipati 18711a898a79SVijaya Mohan Guvva 1872*3bbd8ef9SLee Jones static int 18733350d98dSKrishna Gudipati bfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd) 18743350d98dSKrishna Gudipati { 18753350d98dSKrishna Gudipati struct bfa_bsg_phy_attr_s *iocmd = 18763350d98dSKrishna Gudipati (struct bfa_bsg_phy_attr_s *)cmd; 18773350d98dSKrishna Gudipati struct bfad_hal_comp fcomp; 18783350d98dSKrishna Gudipati unsigned long flags; 18793350d98dSKrishna Gudipati 18803350d98dSKrishna Gudipati init_completion(&fcomp.comp); 18813350d98dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 18823350d98dSKrishna Gudipati iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance, 18833350d98dSKrishna Gudipati &iocmd->attr, bfad_hcb_comp, &fcomp); 18843350d98dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 18853350d98dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 18863350d98dSKrishna Gudipati goto out; 18873350d98dSKrishna Gudipati wait_for_completion(&fcomp.comp); 18883350d98dSKrishna Gudipati iocmd->status = fcomp.status; 18893350d98dSKrishna Gudipati out: 18903350d98dSKrishna Gudipati return 0; 18913350d98dSKrishna Gudipati } 18923350d98dSKrishna Gudipati 1893*3bbd8ef9SLee Jones static int 18943350d98dSKrishna Gudipati bfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd) 18953350d98dSKrishna Gudipati { 18963350d98dSKrishna Gudipati struct bfa_bsg_phy_stats_s *iocmd = 18973350d98dSKrishna Gudipati (struct bfa_bsg_phy_stats_s *)cmd; 18983350d98dSKrishna Gudipati struct bfad_hal_comp fcomp; 18993350d98dSKrishna Gudipati unsigned long flags; 19003350d98dSKrishna Gudipati 19013350d98dSKrishna Gudipati init_completion(&fcomp.comp); 19023350d98dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 19033350d98dSKrishna Gudipati iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance, 19043350d98dSKrishna Gudipati &iocmd->stats, bfad_hcb_comp, &fcomp); 19053350d98dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 19063350d98dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 19073350d98dSKrishna Gudipati goto out; 19083350d98dSKrishna Gudipati wait_for_completion(&fcomp.comp); 19093350d98dSKrishna Gudipati iocmd->status = fcomp.status; 19103350d98dSKrishna Gudipati out: 19113350d98dSKrishna Gudipati return 0; 19123350d98dSKrishna Gudipati } 19133350d98dSKrishna Gudipati 1914*3bbd8ef9SLee Jones static int 19153350d98dSKrishna Gudipati bfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 19163350d98dSKrishna Gudipati { 19173350d98dSKrishna Gudipati struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd; 19183350d98dSKrishna Gudipati struct bfad_hal_comp fcomp; 19193350d98dSKrishna Gudipati void *iocmd_bufptr; 19203350d98dSKrishna Gudipati unsigned long flags; 19213350d98dSKrishna Gudipati 19223350d98dSKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 19233350d98dSKrishna Gudipati sizeof(struct bfa_bsg_phy_s), 19243350d98dSKrishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 19253350d98dSKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 19263350d98dSKrishna Gudipati return 0; 19273350d98dSKrishna Gudipati } 19283350d98dSKrishna Gudipati 19293350d98dSKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s); 19303350d98dSKrishna Gudipati init_completion(&fcomp.comp); 19313350d98dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 19323350d98dSKrishna Gudipati iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa), 19333350d98dSKrishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 19343350d98dSKrishna Gudipati 0, bfad_hcb_comp, &fcomp); 19353350d98dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 19363350d98dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 19373350d98dSKrishna Gudipati goto out; 19383350d98dSKrishna Gudipati wait_for_completion(&fcomp.comp); 19393350d98dSKrishna Gudipati iocmd->status = fcomp.status; 19403350d98dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 19413350d98dSKrishna Gudipati goto out; 19423350d98dSKrishna Gudipati out: 19433350d98dSKrishna Gudipati return 0; 19443350d98dSKrishna Gudipati } 19453350d98dSKrishna Gudipati 1946*3bbd8ef9SLee Jones static int 194761e62e21SKrishna Gudipati bfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd) 194861e62e21SKrishna Gudipati { 194961e62e21SKrishna Gudipati struct bfa_bsg_vhba_attr_s *iocmd = 195061e62e21SKrishna Gudipati (struct bfa_bsg_vhba_attr_s *)cmd; 195161e62e21SKrishna Gudipati struct bfa_vhba_attr_s *attr = &iocmd->attr; 195261e62e21SKrishna Gudipati unsigned long flags; 195361e62e21SKrishna Gudipati 195461e62e21SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 195561e62e21SKrishna Gudipati attr->pwwn = bfad->bfa.ioc.attr->pwwn; 195661e62e21SKrishna Gudipati attr->nwwn = bfad->bfa.ioc.attr->nwwn; 195761e62e21SKrishna Gudipati attr->plog_enabled = (bfa_boolean_t)bfad->bfa.plog->plog_enabled; 195861e62e21SKrishna Gudipati attr->io_profile = bfa_fcpim_get_io_profile(&bfad->bfa); 195961e62e21SKrishna Gudipati attr->path_tov = bfa_fcpim_path_tov_get(&bfad->bfa); 196061e62e21SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 196161e62e21SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 196261e62e21SKrishna Gudipati return 0; 196361e62e21SKrishna Gudipati } 196461e62e21SKrishna Gudipati 1965*3bbd8ef9SLee Jones static int 19663350d98dSKrishna Gudipati bfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len) 19673350d98dSKrishna Gudipati { 19683350d98dSKrishna Gudipati struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd; 19693350d98dSKrishna Gudipati void *iocmd_bufptr; 19703350d98dSKrishna Gudipati struct bfad_hal_comp fcomp; 19713350d98dSKrishna Gudipati unsigned long flags; 19723350d98dSKrishna Gudipati 19733350d98dSKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, 19743350d98dSKrishna Gudipati sizeof(struct bfa_bsg_phy_s), 19753350d98dSKrishna Gudipati iocmd->bufsz) != BFA_STATUS_OK) { 19763350d98dSKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 19773350d98dSKrishna Gudipati return 0; 19783350d98dSKrishna Gudipati } 19793350d98dSKrishna Gudipati 19803350d98dSKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s); 19813350d98dSKrishna Gudipati init_completion(&fcomp.comp); 19823350d98dSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 19833350d98dSKrishna Gudipati iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa), 19843350d98dSKrishna Gudipati iocmd->instance, iocmd_bufptr, iocmd->bufsz, 19853350d98dSKrishna Gudipati 0, bfad_hcb_comp, &fcomp); 19863350d98dSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 19873350d98dSKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 19883350d98dSKrishna Gudipati goto out; 19893350d98dSKrishna Gudipati wait_for_completion(&fcomp.comp); 19903350d98dSKrishna Gudipati iocmd->status = fcomp.status; 19913350d98dSKrishna Gudipati out: 19923350d98dSKrishna Gudipati return 0; 19933350d98dSKrishna Gudipati } 19943350d98dSKrishna Gudipati 1995*3bbd8ef9SLee Jones static int 199661e62e21SKrishna Gudipati bfad_iocmd_porglog_get(struct bfad_s *bfad, void *cmd) 199761e62e21SKrishna Gudipati { 199861e62e21SKrishna Gudipati struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd; 199961e62e21SKrishna Gudipati void *iocmd_bufptr; 200061e62e21SKrishna Gudipati 200161e62e21SKrishna Gudipati if (iocmd->bufsz < sizeof(struct bfa_plog_s)) { 200261e62e21SKrishna Gudipati bfa_trc(bfad, sizeof(struct bfa_plog_s)); 200361e62e21SKrishna Gudipati iocmd->status = BFA_STATUS_EINVAL; 200461e62e21SKrishna Gudipati goto out; 200561e62e21SKrishna Gudipati } 200661e62e21SKrishna Gudipati 200761e62e21SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 200861e62e21SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s); 200961e62e21SKrishna Gudipati memcpy(iocmd_bufptr, (u8 *) &bfad->plog_buf, sizeof(struct bfa_plog_s)); 201061e62e21SKrishna Gudipati out: 201161e62e21SKrishna Gudipati return 0; 201261e62e21SKrishna Gudipati } 201361e62e21SKrishna Gudipati 2014f2ee7601SKrishna Gudipati #define BFA_DEBUG_FW_CORE_CHUNK_SZ 0x4000U /* 16K chunks for FW dump */ 2015*3bbd8ef9SLee Jones static int 2016f2ee7601SKrishna Gudipati bfad_iocmd_debug_fw_core(struct bfad_s *bfad, void *cmd, 2017f2ee7601SKrishna Gudipati unsigned int payload_len) 2018f2ee7601SKrishna Gudipati { 2019f2ee7601SKrishna Gudipati struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd; 2020f2ee7601SKrishna Gudipati void *iocmd_bufptr; 2021f2ee7601SKrishna Gudipati unsigned long flags; 202276c8ae4bSSantosh Nayak u32 offset; 2023f2ee7601SKrishna Gudipati 2024f2ee7601SKrishna Gudipati if (bfad_chk_iocmd_sz(payload_len, sizeof(struct bfa_bsg_debug_s), 2025f2ee7601SKrishna Gudipati BFA_DEBUG_FW_CORE_CHUNK_SZ) != BFA_STATUS_OK) { 2026f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_VERSION_FAIL; 2027f2ee7601SKrishna Gudipati return 0; 2028f2ee7601SKrishna Gudipati } 2029f2ee7601SKrishna Gudipati 2030f2ee7601SKrishna Gudipati if (iocmd->bufsz < BFA_DEBUG_FW_CORE_CHUNK_SZ || 2031f2ee7601SKrishna Gudipati !IS_ALIGNED(iocmd->bufsz, sizeof(u16)) || 2032f2ee7601SKrishna Gudipati !IS_ALIGNED(iocmd->offset, sizeof(u32))) { 2033f2ee7601SKrishna Gudipati bfa_trc(bfad, BFA_DEBUG_FW_CORE_CHUNK_SZ); 2034f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_EINVAL; 2035f2ee7601SKrishna Gudipati goto out; 2036f2ee7601SKrishna Gudipati } 2037f2ee7601SKrishna Gudipati 2038f2ee7601SKrishna Gudipati iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s); 2039f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 204076c8ae4bSSantosh Nayak offset = iocmd->offset; 2041f2ee7601SKrishna Gudipati iocmd->status = bfa_ioc_debug_fwcore(&bfad->bfa.ioc, iocmd_bufptr, 204276c8ae4bSSantosh Nayak &offset, &iocmd->bufsz); 204376c8ae4bSSantosh Nayak iocmd->offset = offset; 2044f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2045f2ee7601SKrishna Gudipati out: 2046f2ee7601SKrishna Gudipati return 0; 2047f2ee7601SKrishna Gudipati } 2048f2ee7601SKrishna Gudipati 2049*3bbd8ef9SLee Jones static int 2050f2ee7601SKrishna Gudipati bfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 2051f2ee7601SKrishna Gudipati { 2052f2ee7601SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 2053f2ee7601SKrishna Gudipati unsigned long flags; 2054f2ee7601SKrishna Gudipati 2055f2ee7601SKrishna Gudipati if (v_cmd == IOCMD_DEBUG_FW_STATE_CLR) { 2056f2ee7601SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2057f2ee7601SKrishna Gudipati bfad->bfa.ioc.dbg_fwsave_once = BFA_TRUE; 2058f2ee7601SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2059f2ee7601SKrishna Gudipati } else if (v_cmd == IOCMD_DEBUG_PORTLOG_CLR) 2060f2ee7601SKrishna Gudipati bfad->plog_buf.head = bfad->plog_buf.tail = 0; 2061f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_DEBUG_START_DTRC) 2062f2ee7601SKrishna Gudipati bfa_trc_init(bfad->trcmod); 2063f2ee7601SKrishna Gudipati else if (v_cmd == IOCMD_DEBUG_STOP_DTRC) 2064f2ee7601SKrishna Gudipati bfa_trc_stop(bfad->trcmod); 2065f2ee7601SKrishna Gudipati 2066f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2067f2ee7601SKrishna Gudipati return 0; 2068f2ee7601SKrishna Gudipati } 2069f2ee7601SKrishna Gudipati 2070*3bbd8ef9SLee Jones static int 2071f2ee7601SKrishna Gudipati bfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd) 2072f2ee7601SKrishna Gudipati { 2073f2ee7601SKrishna Gudipati struct bfa_bsg_portlogctl_s *iocmd = (struct bfa_bsg_portlogctl_s *)cmd; 2074f2ee7601SKrishna Gudipati 2075f2ee7601SKrishna Gudipati if (iocmd->ctl == BFA_TRUE) 2076f2ee7601SKrishna Gudipati bfad->plog_buf.plog_enabled = 1; 2077f2ee7601SKrishna Gudipati else 2078f2ee7601SKrishna Gudipati bfad->plog_buf.plog_enabled = 0; 2079f2ee7601SKrishna Gudipati 2080f2ee7601SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2081f2ee7601SKrishna Gudipati return 0; 2082f2ee7601SKrishna Gudipati } 2083f2ee7601SKrishna Gudipati 2084*3bbd8ef9SLee Jones static int 208542a8e6e2SKrishna Gudipati bfad_iocmd_fcpim_cfg_profile(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 208642a8e6e2SKrishna Gudipati { 208742a8e6e2SKrishna Gudipati struct bfa_bsg_fcpim_profile_s *iocmd = 208842a8e6e2SKrishna Gudipati (struct bfa_bsg_fcpim_profile_s *)cmd; 208942a8e6e2SKrishna Gudipati unsigned long flags; 209042a8e6e2SKrishna Gudipati 209142a8e6e2SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 209242a8e6e2SKrishna Gudipati if (v_cmd == IOCMD_FCPIM_PROFILE_ON) 2093aa22a52eSArnd Bergmann iocmd->status = bfa_fcpim_profile_on(&bfad->bfa, ktime_get_real_seconds()); 209442a8e6e2SKrishna Gudipati else if (v_cmd == IOCMD_FCPIM_PROFILE_OFF) 209542a8e6e2SKrishna Gudipati iocmd->status = bfa_fcpim_profile_off(&bfad->bfa); 209642a8e6e2SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 209742a8e6e2SKrishna Gudipati 209842a8e6e2SKrishna Gudipati return 0; 209942a8e6e2SKrishna Gudipati } 210042a8e6e2SKrishna Gudipati 210142a8e6e2SKrishna Gudipati static int 210242a8e6e2SKrishna Gudipati bfad_iocmd_itnim_get_ioprofile(struct bfad_s *bfad, void *cmd) 210342a8e6e2SKrishna Gudipati { 210442a8e6e2SKrishna Gudipati struct bfa_bsg_itnim_ioprofile_s *iocmd = 210542a8e6e2SKrishna Gudipati (struct bfa_bsg_itnim_ioprofile_s *)cmd; 210642a8e6e2SKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 210742a8e6e2SKrishna Gudipati struct bfa_fcs_itnim_s *itnim; 210842a8e6e2SKrishna Gudipati unsigned long flags; 210942a8e6e2SKrishna Gudipati 211042a8e6e2SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 211142a8e6e2SKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, 211242a8e6e2SKrishna Gudipati iocmd->vf_id, iocmd->lpwwn); 211342a8e6e2SKrishna Gudipati if (!fcs_port) 211442a8e6e2SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_LWWN; 211542a8e6e2SKrishna Gudipati else { 211642a8e6e2SKrishna Gudipati itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn); 211742a8e6e2SKrishna Gudipati if (itnim == NULL) 211842a8e6e2SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 211942a8e6e2SKrishna Gudipati else 212042a8e6e2SKrishna Gudipati iocmd->status = bfa_itnim_get_ioprofile( 212142a8e6e2SKrishna Gudipati bfa_fcs_itnim_get_halitn(itnim), 212242a8e6e2SKrishna Gudipati &iocmd->ioprofile); 212342a8e6e2SKrishna Gudipati } 212442a8e6e2SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 212542a8e6e2SKrishna Gudipati return 0; 212642a8e6e2SKrishna Gudipati } 212742a8e6e2SKrishna Gudipati 2128*3bbd8ef9SLee Jones static int 212937ea0558SKrishna Gudipati bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd) 213037ea0558SKrishna Gudipati { 213137ea0558SKrishna Gudipati struct bfa_bsg_fcport_stats_s *iocmd = 213237ea0558SKrishna Gudipati (struct bfa_bsg_fcport_stats_s *)cmd; 213337ea0558SKrishna Gudipati struct bfad_hal_comp fcomp; 213437ea0558SKrishna Gudipati unsigned long flags; 213537ea0558SKrishna Gudipati struct bfa_cb_pending_q_s cb_qe; 213637ea0558SKrishna Gudipati 213737ea0558SKrishna Gudipati init_completion(&fcomp.comp); 213837ea0558SKrishna Gudipati bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, 213937ea0558SKrishna Gudipati &fcomp, &iocmd->stats); 214037ea0558SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 214137ea0558SKrishna Gudipati iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe); 214237ea0558SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 214337ea0558SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 214437ea0558SKrishna Gudipati bfa_trc(bfad, iocmd->status); 214537ea0558SKrishna Gudipati goto out; 214637ea0558SKrishna Gudipati } 214737ea0558SKrishna Gudipati wait_for_completion(&fcomp.comp); 214837ea0558SKrishna Gudipati iocmd->status = fcomp.status; 214937ea0558SKrishna Gudipati out: 215037ea0558SKrishna Gudipati return 0; 215137ea0558SKrishna Gudipati } 215237ea0558SKrishna Gudipati 2153*3bbd8ef9SLee Jones static int 215437ea0558SKrishna Gudipati bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd) 215537ea0558SKrishna Gudipati { 215637ea0558SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 215737ea0558SKrishna Gudipati struct bfad_hal_comp fcomp; 215837ea0558SKrishna Gudipati unsigned long flags; 215937ea0558SKrishna Gudipati struct bfa_cb_pending_q_s cb_qe; 216037ea0558SKrishna Gudipati 216137ea0558SKrishna Gudipati init_completion(&fcomp.comp); 216237ea0558SKrishna Gudipati bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL); 216337ea0558SKrishna Gudipati 216437ea0558SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 216537ea0558SKrishna Gudipati iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe); 216637ea0558SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 216737ea0558SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 216837ea0558SKrishna Gudipati bfa_trc(bfad, iocmd->status); 216937ea0558SKrishna Gudipati goto out; 217037ea0558SKrishna Gudipati } 217137ea0558SKrishna Gudipati wait_for_completion(&fcomp.comp); 217237ea0558SKrishna Gudipati iocmd->status = fcomp.status; 217337ea0558SKrishna Gudipati out: 217437ea0558SKrishna Gudipati return 0; 217537ea0558SKrishna Gudipati } 217637ea0558SKrishna Gudipati 2177*3bbd8ef9SLee Jones static int 2178a46bd300SKrishna Gudipati bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd) 2179a46bd300SKrishna Gudipati { 2180a46bd300SKrishna Gudipati struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd; 2181a46bd300SKrishna Gudipati struct bfad_hal_comp fcomp; 2182a46bd300SKrishna Gudipati unsigned long flags; 2183a46bd300SKrishna Gudipati 2184a46bd300SKrishna Gudipati init_completion(&fcomp.comp); 2185a46bd300SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2186a46bd300SKrishna Gudipati iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), 21871a1297c6SKrishna Gudipati BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id, 2188a46bd300SKrishna Gudipati &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, 2189a46bd300SKrishna Gudipati bfad_hcb_comp, &fcomp); 2190a46bd300SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2191a46bd300SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 2192a46bd300SKrishna Gudipati goto out; 2193a46bd300SKrishna Gudipati wait_for_completion(&fcomp.comp); 2194a46bd300SKrishna Gudipati iocmd->status = fcomp.status; 2195a46bd300SKrishna Gudipati out: 2196a46bd300SKrishna Gudipati return 0; 2197a46bd300SKrishna Gudipati } 2198a46bd300SKrishna Gudipati 2199*3bbd8ef9SLee Jones static int 2200a46bd300SKrishna Gudipati bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd) 2201a46bd300SKrishna Gudipati { 2202a46bd300SKrishna Gudipati struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd; 2203a46bd300SKrishna Gudipati struct bfad_hal_comp fcomp; 2204a46bd300SKrishna Gudipati unsigned long flags; 2205a46bd300SKrishna Gudipati 2206a46bd300SKrishna Gudipati init_completion(&fcomp.comp); 2207a46bd300SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2208a46bd300SKrishna Gudipati iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), 22091a1297c6SKrishna Gudipati BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id, 2210a46bd300SKrishna Gudipati &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, 2211a46bd300SKrishna Gudipati bfad_hcb_comp, &fcomp); 2212a46bd300SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2213a46bd300SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 2214a46bd300SKrishna Gudipati goto out; 2215a46bd300SKrishna Gudipati wait_for_completion(&fcomp.comp); 2216a46bd300SKrishna Gudipati iocmd->status = fcomp.status; 2217a46bd300SKrishna Gudipati out: 2218a46bd300SKrishna Gudipati return 0; 2219a46bd300SKrishna Gudipati } 2220a46bd300SKrishna Gudipati 2221*3bbd8ef9SLee Jones static int 2222a46bd300SKrishna Gudipati bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd) 2223a46bd300SKrishna Gudipati { 2224a46bd300SKrishna Gudipati struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd; 2225a46bd300SKrishna Gudipati struct bfi_iocfc_cfgrsp_s *cfgrsp = bfad->bfa.iocfc.cfgrsp; 2226a46bd300SKrishna Gudipati struct bfa_boot_pbc_s *pbcfg = &iocmd->cfg; 2227a46bd300SKrishna Gudipati unsigned long flags; 2228a46bd300SKrishna Gudipati 2229a46bd300SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2230a46bd300SKrishna Gudipati pbcfg->enable = cfgrsp->pbc_cfg.boot_enabled; 2231a46bd300SKrishna Gudipati pbcfg->nbluns = cfgrsp->pbc_cfg.nbluns; 2232a46bd300SKrishna Gudipati pbcfg->speed = cfgrsp->pbc_cfg.port_speed; 2233a46bd300SKrishna Gudipati memcpy(pbcfg->pblun, cfgrsp->pbc_cfg.blun, sizeof(pbcfg->pblun)); 2234a46bd300SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2235a46bd300SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2236a46bd300SKrishna Gudipati 2237a46bd300SKrishna Gudipati return 0; 2238a46bd300SKrishna Gudipati } 2239a46bd300SKrishna Gudipati 2240*3bbd8ef9SLee Jones static int 2241a46bd300SKrishna Gudipati bfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd) 2242a46bd300SKrishna Gudipati { 2243a46bd300SKrishna Gudipati struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd; 2244a46bd300SKrishna Gudipati struct bfad_hal_comp fcomp; 2245a46bd300SKrishna Gudipati unsigned long flags; 2246a46bd300SKrishna Gudipati 2247a46bd300SKrishna Gudipati init_completion(&fcomp.comp); 2248a46bd300SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2249a46bd300SKrishna Gudipati iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), 2250a46bd300SKrishna Gudipati BFA_FLASH_PART_PXECFG, 2251a46bd300SKrishna Gudipati bfad->bfa.ioc.port_id, &iocmd->cfg, 2252a46bd300SKrishna Gudipati sizeof(struct bfa_ethboot_cfg_s), 0, 2253a46bd300SKrishna Gudipati bfad_hcb_comp, &fcomp); 2254a46bd300SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2255a46bd300SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 2256a46bd300SKrishna Gudipati goto out; 2257a46bd300SKrishna Gudipati wait_for_completion(&fcomp.comp); 2258a46bd300SKrishna Gudipati iocmd->status = fcomp.status; 2259a46bd300SKrishna Gudipati out: 2260a46bd300SKrishna Gudipati return 0; 2261a46bd300SKrishna Gudipati } 2262a46bd300SKrishna Gudipati 2263*3bbd8ef9SLee Jones static int 2264a46bd300SKrishna Gudipati bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd) 2265a46bd300SKrishna Gudipati { 2266a46bd300SKrishna Gudipati struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd; 2267a46bd300SKrishna Gudipati struct bfad_hal_comp fcomp; 2268a46bd300SKrishna Gudipati unsigned long flags; 2269a46bd300SKrishna Gudipati 2270a46bd300SKrishna Gudipati init_completion(&fcomp.comp); 2271a46bd300SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2272a46bd300SKrishna Gudipati iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), 2273a46bd300SKrishna Gudipati BFA_FLASH_PART_PXECFG, 2274a46bd300SKrishna Gudipati bfad->bfa.ioc.port_id, &iocmd->cfg, 2275a46bd300SKrishna Gudipati sizeof(struct bfa_ethboot_cfg_s), 0, 2276a46bd300SKrishna Gudipati bfad_hcb_comp, &fcomp); 2277a46bd300SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2278a46bd300SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) 2279a46bd300SKrishna Gudipati goto out; 2280a46bd300SKrishna Gudipati wait_for_completion(&fcomp.comp); 2281a46bd300SKrishna Gudipati iocmd->status = fcomp.status; 2282a46bd300SKrishna Gudipati out: 2283a46bd300SKrishna Gudipati return 0; 2284a46bd300SKrishna Gudipati } 2285a46bd300SKrishna Gudipati 2286*3bbd8ef9SLee Jones static int 228745191236SKrishna Gudipati bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 228845191236SKrishna Gudipati { 228945191236SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 229045191236SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 229145191236SKrishna Gudipati struct bfa_fcport_trunk_s *trunk = &fcport->trunk; 229245191236SKrishna Gudipati unsigned long flags; 229345191236SKrishna Gudipati 229445191236SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 229545191236SKrishna Gudipati 2296e39a8b4fSWei Yongjun if (bfa_fcport_is_dport(&bfad->bfa)) { 2297e39a8b4fSWei Yongjun spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2298e353546eSKrishna Gudipati return BFA_STATUS_DPORT_ERR; 2299e39a8b4fSWei Yongjun } 2300e353546eSKrishna Gudipati 2301bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) || 2302bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2303bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2304bc0e2c2aSKrishna Gudipati else { 230545191236SKrishna Gudipati if (v_cmd == IOCMD_TRUNK_ENABLE) { 230645191236SKrishna Gudipati trunk->attr.state = BFA_TRUNK_OFFLINE; 230745191236SKrishna Gudipati bfa_fcport_disable(&bfad->bfa); 230845191236SKrishna Gudipati fcport->cfg.trunked = BFA_TRUE; 230945191236SKrishna Gudipati } else if (v_cmd == IOCMD_TRUNK_DISABLE) { 231045191236SKrishna Gudipati trunk->attr.state = BFA_TRUNK_DISABLED; 231145191236SKrishna Gudipati bfa_fcport_disable(&bfad->bfa); 231245191236SKrishna Gudipati fcport->cfg.trunked = BFA_FALSE; 231345191236SKrishna Gudipati } 231445191236SKrishna Gudipati 231545191236SKrishna Gudipati if (!bfa_fcport_is_disabled(&bfad->bfa)) 231645191236SKrishna Gudipati bfa_fcport_enable(&bfad->bfa); 231745191236SKrishna Gudipati 2318bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2319bc0e2c2aSKrishna Gudipati } 2320bc0e2c2aSKrishna Gudipati 232145191236SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 232245191236SKrishna Gudipati 232345191236SKrishna Gudipati return 0; 232445191236SKrishna Gudipati } 232545191236SKrishna Gudipati 2326*3bbd8ef9SLee Jones static int 232745191236SKrishna Gudipati bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd) 232845191236SKrishna Gudipati { 232945191236SKrishna Gudipati struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd; 233045191236SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 233145191236SKrishna Gudipati struct bfa_fcport_trunk_s *trunk = &fcport->trunk; 233245191236SKrishna Gudipati unsigned long flags; 233345191236SKrishna Gudipati 233445191236SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2335bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) || 2336bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2337bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2338bc0e2c2aSKrishna Gudipati else { 233945191236SKrishna Gudipati memcpy((void *)&iocmd->attr, (void *)&trunk->attr, 234045191236SKrishna Gudipati sizeof(struct bfa_trunk_attr_s)); 234145191236SKrishna Gudipati iocmd->attr.port_id = bfa_lps_get_base_pid(&bfad->bfa); 2342bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2343bc0e2c2aSKrishna Gudipati } 234445191236SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 234545191236SKrishna Gudipati 234645191236SKrishna Gudipati return 0; 234745191236SKrishna Gudipati } 234845191236SKrishna Gudipati 2349*3bbd8ef9SLee Jones static int 23503ec4f2c8SKrishna Gudipati bfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 23513ec4f2c8SKrishna Gudipati { 23523ec4f2c8SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 23533ec4f2c8SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 23543ec4f2c8SKrishna Gudipati unsigned long flags; 23553ec4f2c8SKrishna Gudipati 23563ec4f2c8SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 23573ec4f2c8SKrishna Gudipati if (bfa_ioc_get_type(&bfad->bfa.ioc) == BFA_IOC_TYPE_FC) { 2358bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 2359bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2360bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2361bc0e2c2aSKrishna Gudipati else { 23623ec4f2c8SKrishna Gudipati if (v_cmd == IOCMD_QOS_ENABLE) 23633ec4f2c8SKrishna Gudipati fcport->cfg.qos_enabled = BFA_TRUE; 23646894f013SKrishna Gudipati else if (v_cmd == IOCMD_QOS_DISABLE) { 23653ec4f2c8SKrishna Gudipati fcport->cfg.qos_enabled = BFA_FALSE; 23666894f013SKrishna Gudipati fcport->cfg.qos_bw.high = BFA_QOS_BW_HIGH; 23676894f013SKrishna Gudipati fcport->cfg.qos_bw.med = BFA_QOS_BW_MED; 23686894f013SKrishna Gudipati fcport->cfg.qos_bw.low = BFA_QOS_BW_LOW; 23696894f013SKrishna Gudipati } 23703ec4f2c8SKrishna Gudipati } 2371bc0e2c2aSKrishna Gudipati } 23723ec4f2c8SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 23733ec4f2c8SKrishna Gudipati 23743ec4f2c8SKrishna Gudipati return 0; 23753ec4f2c8SKrishna Gudipati } 23763ec4f2c8SKrishna Gudipati 2377*3bbd8ef9SLee Jones static int 23783ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd) 23793ec4f2c8SKrishna Gudipati { 23803ec4f2c8SKrishna Gudipati struct bfa_bsg_qos_attr_s *iocmd = (struct bfa_bsg_qos_attr_s *)cmd; 23813ec4f2c8SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 23823ec4f2c8SKrishna Gudipati unsigned long flags; 23833ec4f2c8SKrishna Gudipati 23843ec4f2c8SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2385bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 2386bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2387bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2388bc0e2c2aSKrishna Gudipati else { 23893ec4f2c8SKrishna Gudipati iocmd->attr.state = fcport->qos_attr.state; 2390bc0e2c2aSKrishna Gudipati iocmd->attr.total_bb_cr = 2391bc0e2c2aSKrishna Gudipati be32_to_cpu(fcport->qos_attr.total_bb_cr); 23926894f013SKrishna Gudipati iocmd->attr.qos_bw.high = fcport->cfg.qos_bw.high; 23936894f013SKrishna Gudipati iocmd->attr.qos_bw.med = fcport->cfg.qos_bw.med; 23946894f013SKrishna Gudipati iocmd->attr.qos_bw.low = fcport->cfg.qos_bw.low; 23956894f013SKrishna Gudipati iocmd->attr.qos_bw_op = fcport->qos_attr.qos_bw_op; 2396bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2397bc0e2c2aSKrishna Gudipati } 23983ec4f2c8SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 23993ec4f2c8SKrishna Gudipati 24003ec4f2c8SKrishna Gudipati return 0; 24013ec4f2c8SKrishna Gudipati } 24023ec4f2c8SKrishna Gudipati 2403*3bbd8ef9SLee Jones static int 24043ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd) 24053ec4f2c8SKrishna Gudipati { 24063ec4f2c8SKrishna Gudipati struct bfa_bsg_qos_vc_attr_s *iocmd = 24073ec4f2c8SKrishna Gudipati (struct bfa_bsg_qos_vc_attr_s *)cmd; 24083ec4f2c8SKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 24093ec4f2c8SKrishna Gudipati struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr; 24103ec4f2c8SKrishna Gudipati unsigned long flags; 24113ec4f2c8SKrishna Gudipati u32 i = 0; 24123ec4f2c8SKrishna Gudipati 24133ec4f2c8SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 24143ec4f2c8SKrishna Gudipati iocmd->attr.total_vc_count = be16_to_cpu(bfa_vc_attr->total_vc_count); 24153ec4f2c8SKrishna Gudipati iocmd->attr.shared_credit = be16_to_cpu(bfa_vc_attr->shared_credit); 24163ec4f2c8SKrishna Gudipati iocmd->attr.elp_opmode_flags = 24173ec4f2c8SKrishna Gudipati be32_to_cpu(bfa_vc_attr->elp_opmode_flags); 24183ec4f2c8SKrishna Gudipati 24193ec4f2c8SKrishna Gudipati /* Individual VC info */ 24203ec4f2c8SKrishna Gudipati while (i < iocmd->attr.total_vc_count) { 24213ec4f2c8SKrishna Gudipati iocmd->attr.vc_info[i].vc_credit = 24223ec4f2c8SKrishna Gudipati bfa_vc_attr->vc_info[i].vc_credit; 24233ec4f2c8SKrishna Gudipati iocmd->attr.vc_info[i].borrow_credit = 24243ec4f2c8SKrishna Gudipati bfa_vc_attr->vc_info[i].borrow_credit; 24253ec4f2c8SKrishna Gudipati iocmd->attr.vc_info[i].priority = 24263ec4f2c8SKrishna Gudipati bfa_vc_attr->vc_info[i].priority; 24273ec4f2c8SKrishna Gudipati i++; 24283ec4f2c8SKrishna Gudipati } 24293ec4f2c8SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 24303ec4f2c8SKrishna Gudipati 24313ec4f2c8SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 24323ec4f2c8SKrishna Gudipati return 0; 24333ec4f2c8SKrishna Gudipati } 24343ec4f2c8SKrishna Gudipati 2435*3bbd8ef9SLee Jones static int 24363ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd) 24373ec4f2c8SKrishna Gudipati { 24383ec4f2c8SKrishna Gudipati struct bfa_bsg_fcport_stats_s *iocmd = 24393ec4f2c8SKrishna Gudipati (struct bfa_bsg_fcport_stats_s *)cmd; 24403ec4f2c8SKrishna Gudipati struct bfad_hal_comp fcomp; 24413ec4f2c8SKrishna Gudipati unsigned long flags; 24423ec4f2c8SKrishna Gudipati struct bfa_cb_pending_q_s cb_qe; 2443bc0e2c2aSKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 24443ec4f2c8SKrishna Gudipati 24453ec4f2c8SKrishna Gudipati init_completion(&fcomp.comp); 24463ec4f2c8SKrishna Gudipati bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, 24473ec4f2c8SKrishna Gudipati &fcomp, &iocmd->stats); 24483ec4f2c8SKrishna Gudipati 24493ec4f2c8SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 24503ec4f2c8SKrishna Gudipati WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc)); 2451bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 2452bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2453bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2454bc0e2c2aSKrishna Gudipati else 24553ec4f2c8SKrishna Gudipati iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe); 24563ec4f2c8SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 24573ec4f2c8SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 24583ec4f2c8SKrishna Gudipati bfa_trc(bfad, iocmd->status); 24593ec4f2c8SKrishna Gudipati goto out; 24603ec4f2c8SKrishna Gudipati } 24613ec4f2c8SKrishna Gudipati wait_for_completion(&fcomp.comp); 24623ec4f2c8SKrishna Gudipati iocmd->status = fcomp.status; 24633ec4f2c8SKrishna Gudipati out: 24643ec4f2c8SKrishna Gudipati return 0; 24653ec4f2c8SKrishna Gudipati } 24663ec4f2c8SKrishna Gudipati 2467*3bbd8ef9SLee Jones static int 24683ec4f2c8SKrishna Gudipati bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd) 24693ec4f2c8SKrishna Gudipati { 24703ec4f2c8SKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; 24713ec4f2c8SKrishna Gudipati struct bfad_hal_comp fcomp; 24723ec4f2c8SKrishna Gudipati unsigned long flags; 24733ec4f2c8SKrishna Gudipati struct bfa_cb_pending_q_s cb_qe; 2474bc0e2c2aSKrishna Gudipati struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); 24753ec4f2c8SKrishna Gudipati 24763ec4f2c8SKrishna Gudipati init_completion(&fcomp.comp); 24773ec4f2c8SKrishna Gudipati bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, 24783ec4f2c8SKrishna Gudipati &fcomp, NULL); 24793ec4f2c8SKrishna Gudipati 24803ec4f2c8SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 24813ec4f2c8SKrishna Gudipati WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc)); 2482bc0e2c2aSKrishna Gudipati if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) && 2483bc0e2c2aSKrishna Gudipati (fcport->topology == BFA_PORT_TOPOLOGY_LOOP)) 2484bc0e2c2aSKrishna Gudipati iocmd->status = BFA_STATUS_TOPOLOGY_LOOP; 2485bc0e2c2aSKrishna Gudipati else 24863ec4f2c8SKrishna Gudipati iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe); 24873ec4f2c8SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 24883ec4f2c8SKrishna Gudipati if (iocmd->status != BFA_STATUS_OK) { 24893ec4f2c8SKrishna Gudipati bfa_trc(bfad, iocmd->status); 24903ec4f2c8SKrishna Gudipati goto out; 24913ec4f2c8SKrishna Gudipati } 24923ec4f2c8SKrishna Gudipati wait_for_completion(&fcomp.comp); 24933ec4f2c8SKrishna Gudipati iocmd->status = fcomp.status; 24943ec4f2c8SKrishna Gudipati out: 24953ec4f2c8SKrishna Gudipati return 0; 24963ec4f2c8SKrishna Gudipati } 24973ec4f2c8SKrishna Gudipati 2498*3bbd8ef9SLee Jones static int 2499c0350bf5SKrishna Gudipati bfad_iocmd_vf_get_stats(struct bfad_s *bfad, void *cmd) 2500c0350bf5SKrishna Gudipati { 2501c0350bf5SKrishna Gudipati struct bfa_bsg_vf_stats_s *iocmd = 2502c0350bf5SKrishna Gudipati (struct bfa_bsg_vf_stats_s *)cmd; 2503c0350bf5SKrishna Gudipati struct bfa_fcs_fabric_s *fcs_vf; 2504c0350bf5SKrishna Gudipati unsigned long flags; 2505c0350bf5SKrishna Gudipati 2506c0350bf5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2507c0350bf5SKrishna Gudipati fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id); 2508c0350bf5SKrishna Gudipati if (fcs_vf == NULL) { 2509c0350bf5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2510c0350bf5SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VFID; 2511c0350bf5SKrishna Gudipati goto out; 2512c0350bf5SKrishna Gudipati } 2513c0350bf5SKrishna Gudipati memcpy((void *)&iocmd->stats, (void *)&fcs_vf->stats, 2514c0350bf5SKrishna Gudipati sizeof(struct bfa_vf_stats_s)); 2515c0350bf5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2516c0350bf5SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2517c0350bf5SKrishna Gudipati out: 2518c0350bf5SKrishna Gudipati return 0; 2519c0350bf5SKrishna Gudipati } 2520c0350bf5SKrishna Gudipati 2521*3bbd8ef9SLee Jones static int 2522c0350bf5SKrishna Gudipati bfad_iocmd_vf_clr_stats(struct bfad_s *bfad, void *cmd) 2523c0350bf5SKrishna Gudipati { 2524c0350bf5SKrishna Gudipati struct bfa_bsg_vf_reset_stats_s *iocmd = 2525c0350bf5SKrishna Gudipati (struct bfa_bsg_vf_reset_stats_s *)cmd; 2526c0350bf5SKrishna Gudipati struct bfa_fcs_fabric_s *fcs_vf; 2527c0350bf5SKrishna Gudipati unsigned long flags; 2528c0350bf5SKrishna Gudipati 2529c0350bf5SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2530c0350bf5SKrishna Gudipati fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id); 2531c0350bf5SKrishna Gudipati if (fcs_vf == NULL) { 2532c0350bf5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2533c0350bf5SKrishna Gudipati iocmd->status = BFA_STATUS_UNKNOWN_VFID; 2534c0350bf5SKrishna Gudipati goto out; 2535c0350bf5SKrishna Gudipati } 2536c0350bf5SKrishna Gudipati memset((void *)&fcs_vf->stats, 0, sizeof(struct bfa_vf_stats_s)); 2537c0350bf5SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2538c0350bf5SKrishna Gudipati iocmd->status = BFA_STATUS_OK; 2539c0350bf5SKrishna Gudipati out: 2540c0350bf5SKrishna Gudipati return 0; 2541c0350bf5SKrishna Gudipati } 2542c0350bf5SKrishna Gudipati 25435b7db7afSKrishna Gudipati /* Function to reset the LUN SCAN mode */ 25445b7db7afSKrishna Gudipati static void 25455b7db7afSKrishna Gudipati bfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s *bfad, int lunmask_cfg) 25465b7db7afSKrishna Gudipati { 25475b7db7afSKrishna Gudipati struct bfad_im_port_s *pport_im = bfad->pport.im_port; 25485b7db7afSKrishna Gudipati struct bfad_vport_s *vport = NULL; 25495b7db7afSKrishna Gudipati 25505b7db7afSKrishna Gudipati /* Set the scsi device LUN SCAN flags for base port */ 25515b7db7afSKrishna Gudipati bfad_reset_sdev_bflags(pport_im, lunmask_cfg); 25525b7db7afSKrishna Gudipati 25535b7db7afSKrishna Gudipati /* Set the scsi device LUN SCAN flags for the vports */ 25545b7db7afSKrishna Gudipati list_for_each_entry(vport, &bfad->vport_list, list_entry) 25555b7db7afSKrishna Gudipati bfad_reset_sdev_bflags(vport->drv_port.im_port, lunmask_cfg); 25565b7db7afSKrishna Gudipati } 25575b7db7afSKrishna Gudipati 2558*3bbd8ef9SLee Jones static int 25594c5d22bfSKrishna Gudipati bfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd) 25604c5d22bfSKrishna Gudipati { 25614c5d22bfSKrishna Gudipati struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd; 25624c5d22bfSKrishna Gudipati unsigned long flags; 25634c5d22bfSKrishna Gudipati 25644c5d22bfSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 25655b7db7afSKrishna Gudipati if (v_cmd == IOCMD_FCPIM_LUNMASK_ENABLE) { 25664c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_TRUE); 25675b7db7afSKrishna Gudipati /* Set the LUN Scanning mode to be Sequential scan */ 25685b7db7afSKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) 25695b7db7afSKrishna Gudipati bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_TRUE); 25705b7db7afSKrishna Gudipati } else if (v_cmd == IOCMD_FCPIM_LUNMASK_DISABLE) { 25714c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_FALSE); 25725b7db7afSKrishna Gudipati /* Set the LUN Scanning mode to default REPORT_LUNS scan */ 25735b7db7afSKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) 25745b7db7afSKrishna Gudipati bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_FALSE); 25755b7db7afSKrishna Gudipati } else if (v_cmd == IOCMD_FCPIM_LUNMASK_CLEAR) 25764c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_clear(&bfad->bfa); 25774c5d22bfSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 25784c5d22bfSKrishna Gudipati return 0; 25794c5d22bfSKrishna Gudipati } 25804c5d22bfSKrishna Gudipati 2581*3bbd8ef9SLee Jones static int 25824c5d22bfSKrishna Gudipati bfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd) 25834c5d22bfSKrishna Gudipati { 25844c5d22bfSKrishna Gudipati struct bfa_bsg_fcpim_lunmask_query_s *iocmd = 25854c5d22bfSKrishna Gudipati (struct bfa_bsg_fcpim_lunmask_query_s *)cmd; 25864c5d22bfSKrishna Gudipati struct bfa_lunmask_cfg_s *lun_mask = &iocmd->lun_mask; 25874c5d22bfSKrishna Gudipati unsigned long flags; 25884c5d22bfSKrishna Gudipati 25894c5d22bfSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 25904c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_query(&bfad->bfa, lun_mask); 25914c5d22bfSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 25924c5d22bfSKrishna Gudipati return 0; 25934c5d22bfSKrishna Gudipati } 25944c5d22bfSKrishna Gudipati 2595*3bbd8ef9SLee Jones static int 25964c5d22bfSKrishna Gudipati bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) 25974c5d22bfSKrishna Gudipati { 25984c5d22bfSKrishna Gudipati struct bfa_bsg_fcpim_lunmask_s *iocmd = 25994c5d22bfSKrishna Gudipati (struct bfa_bsg_fcpim_lunmask_s *)cmd; 26004c5d22bfSKrishna Gudipati unsigned long flags; 26014c5d22bfSKrishna Gudipati 26024c5d22bfSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 26034c5d22bfSKrishna Gudipati if (v_cmd == IOCMD_FCPIM_LUNMASK_ADD) 26044c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_add(&bfad->bfa, iocmd->vf_id, 26054c5d22bfSKrishna Gudipati &iocmd->pwwn, iocmd->rpwwn, iocmd->lun); 26064c5d22bfSKrishna Gudipati else if (v_cmd == IOCMD_FCPIM_LUNMASK_DELETE) 26074c5d22bfSKrishna Gudipati iocmd->status = bfa_fcpim_lunmask_delete(&bfad->bfa, 26084c5d22bfSKrishna Gudipati iocmd->vf_id, &iocmd->pwwn, 26094c5d22bfSKrishna Gudipati iocmd->rpwwn, iocmd->lun); 26104c5d22bfSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 26114c5d22bfSKrishna Gudipati return 0; 26124c5d22bfSKrishna Gudipati } 26134c5d22bfSKrishna Gudipati 2614*3bbd8ef9SLee Jones static int 26157ace27aeSKrishna Gudipati bfad_iocmd_fcpim_throttle_query(struct bfad_s *bfad, void *cmd) 26167ace27aeSKrishna Gudipati { 26177ace27aeSKrishna Gudipati struct bfa_bsg_fcpim_throttle_s *iocmd = 26187ace27aeSKrishna Gudipati (struct bfa_bsg_fcpim_throttle_s *)cmd; 26197ace27aeSKrishna Gudipati unsigned long flags; 26207ace27aeSKrishna Gudipati 26217ace27aeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 26227ace27aeSKrishna Gudipati iocmd->status = bfa_fcpim_throttle_get(&bfad->bfa, 26237ace27aeSKrishna Gudipati (void *)&iocmd->throttle); 26247ace27aeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 26257ace27aeSKrishna Gudipati 26267ace27aeSKrishna Gudipati return 0; 26277ace27aeSKrishna Gudipati } 26287ace27aeSKrishna Gudipati 2629*3bbd8ef9SLee Jones static int 26307ace27aeSKrishna Gudipati bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd) 26317ace27aeSKrishna Gudipati { 26327ace27aeSKrishna Gudipati struct bfa_bsg_fcpim_throttle_s *iocmd = 26337ace27aeSKrishna Gudipati (struct bfa_bsg_fcpim_throttle_s *)cmd; 26347ace27aeSKrishna Gudipati unsigned long flags; 26357ace27aeSKrishna Gudipati 26367ace27aeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 26377ace27aeSKrishna Gudipati iocmd->status = bfa_fcpim_throttle_set(&bfad->bfa, 26387ace27aeSKrishna Gudipati iocmd->throttle.cfg_value); 26397ace27aeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 26407ace27aeSKrishna Gudipati 26417ace27aeSKrishna Gudipati return 0; 26427ace27aeSKrishna Gudipati } 26437ace27aeSKrishna Gudipati 2644*3bbd8ef9SLee Jones static int 2645e6826c96SKrishna Gudipati bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd) 2646e6826c96SKrishna Gudipati { 2647e6826c96SKrishna Gudipati struct bfa_bsg_tfru_s *iocmd = 2648e6826c96SKrishna Gudipati (struct bfa_bsg_tfru_s *)cmd; 2649e6826c96SKrishna Gudipati struct bfad_hal_comp fcomp; 2650e6826c96SKrishna Gudipati unsigned long flags = 0; 2651e6826c96SKrishna Gudipati 2652e6826c96SKrishna Gudipati init_completion(&fcomp.comp); 2653e6826c96SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2654e6826c96SKrishna Gudipati iocmd->status = bfa_tfru_read(BFA_FRU(&bfad->bfa), 2655e6826c96SKrishna Gudipati &iocmd->data, iocmd->len, iocmd->offset, 2656e6826c96SKrishna Gudipati bfad_hcb_comp, &fcomp); 2657e6826c96SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2658e6826c96SKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) { 2659e6826c96SKrishna Gudipati wait_for_completion(&fcomp.comp); 2660e6826c96SKrishna Gudipati iocmd->status = fcomp.status; 2661e6826c96SKrishna Gudipati } 2662e6826c96SKrishna Gudipati 2663e6826c96SKrishna Gudipati return 0; 2664e6826c96SKrishna Gudipati } 2665e6826c96SKrishna Gudipati 2666*3bbd8ef9SLee Jones static int 2667e6826c96SKrishna Gudipati bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd) 2668e6826c96SKrishna Gudipati { 2669e6826c96SKrishna Gudipati struct bfa_bsg_tfru_s *iocmd = 2670e6826c96SKrishna Gudipati (struct bfa_bsg_tfru_s *)cmd; 2671e6826c96SKrishna Gudipati struct bfad_hal_comp fcomp; 2672e6826c96SKrishna Gudipati unsigned long flags = 0; 2673e6826c96SKrishna Gudipati 2674e6826c96SKrishna Gudipati init_completion(&fcomp.comp); 2675e6826c96SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2676e6826c96SKrishna Gudipati iocmd->status = bfa_tfru_write(BFA_FRU(&bfad->bfa), 2677e6826c96SKrishna Gudipati &iocmd->data, iocmd->len, iocmd->offset, 2678e6826c96SKrishna Gudipati bfad_hcb_comp, &fcomp); 2679e6826c96SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2680e6826c96SKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) { 2681e6826c96SKrishna Gudipati wait_for_completion(&fcomp.comp); 2682e6826c96SKrishna Gudipati iocmd->status = fcomp.status; 2683e6826c96SKrishna Gudipati } 2684e6826c96SKrishna Gudipati 2685e6826c96SKrishna Gudipati return 0; 2686e6826c96SKrishna Gudipati } 2687e6826c96SKrishna Gudipati 2688*3bbd8ef9SLee Jones static int 2689e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd) 2690e6826c96SKrishna Gudipati { 2691e6826c96SKrishna Gudipati struct bfa_bsg_fruvpd_s *iocmd = 2692e6826c96SKrishna Gudipati (struct bfa_bsg_fruvpd_s *)cmd; 2693e6826c96SKrishna Gudipati struct bfad_hal_comp fcomp; 2694e6826c96SKrishna Gudipati unsigned long flags = 0; 2695e6826c96SKrishna Gudipati 2696e6826c96SKrishna Gudipati init_completion(&fcomp.comp); 2697e6826c96SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2698e6826c96SKrishna Gudipati iocmd->status = bfa_fruvpd_read(BFA_FRU(&bfad->bfa), 2699e6826c96SKrishna Gudipati &iocmd->data, iocmd->len, iocmd->offset, 2700e6826c96SKrishna Gudipati bfad_hcb_comp, &fcomp); 2701e6826c96SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2702e6826c96SKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) { 2703e6826c96SKrishna Gudipati wait_for_completion(&fcomp.comp); 2704e6826c96SKrishna Gudipati iocmd->status = fcomp.status; 2705e6826c96SKrishna Gudipati } 2706e6826c96SKrishna Gudipati 2707e6826c96SKrishna Gudipati return 0; 2708e6826c96SKrishna Gudipati } 2709e6826c96SKrishna Gudipati 2710*3bbd8ef9SLee Jones static int 2711e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd) 2712e6826c96SKrishna Gudipati { 2713e6826c96SKrishna Gudipati struct bfa_bsg_fruvpd_s *iocmd = 2714e6826c96SKrishna Gudipati (struct bfa_bsg_fruvpd_s *)cmd; 2715e6826c96SKrishna Gudipati struct bfad_hal_comp fcomp; 2716e6826c96SKrishna Gudipati unsigned long flags = 0; 2717e6826c96SKrishna Gudipati 2718e6826c96SKrishna Gudipati init_completion(&fcomp.comp); 2719e6826c96SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2720e6826c96SKrishna Gudipati iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa), 2721e6826c96SKrishna Gudipati &iocmd->data, iocmd->len, iocmd->offset, 2722079bcbc3SVijaya Mohan Guvva bfad_hcb_comp, &fcomp, iocmd->trfr_cmpl); 2723e6826c96SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2724e6826c96SKrishna Gudipati if (iocmd->status == BFA_STATUS_OK) { 2725e6826c96SKrishna Gudipati wait_for_completion(&fcomp.comp); 2726e6826c96SKrishna Gudipati iocmd->status = fcomp.status; 2727e6826c96SKrishna Gudipati } 2728e6826c96SKrishna Gudipati 2729e6826c96SKrishna Gudipati return 0; 2730e6826c96SKrishna Gudipati } 2731e6826c96SKrishna Gudipati 2732*3bbd8ef9SLee Jones static int 2733e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_get_max_size(struct bfad_s *bfad, void *cmd) 2734e6826c96SKrishna Gudipati { 2735e6826c96SKrishna Gudipati struct bfa_bsg_fruvpd_max_size_s *iocmd = 2736e6826c96SKrishna Gudipati (struct bfa_bsg_fruvpd_max_size_s *)cmd; 2737e6826c96SKrishna Gudipati unsigned long flags = 0; 2738e6826c96SKrishna Gudipati 2739e6826c96SKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 2740e6826c96SKrishna Gudipati iocmd->status = bfa_fruvpd_get_max_size(BFA_FRU(&bfad->bfa), 2741e6826c96SKrishna Gudipati &iocmd->max_size); 2742e6826c96SKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2743e6826c96SKrishna Gudipati 2744e6826c96SKrishna Gudipati return 0; 2745e6826c96SKrishna Gudipati } 2746e6826c96SKrishna Gudipati 2747b85daafeSKrishna Gudipati static int 2748b85daafeSKrishna Gudipati bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, 2749b85daafeSKrishna Gudipati unsigned int payload_len) 2750b85daafeSKrishna Gudipati { 27519afbcfabSKrishna Gudipati int rc = -EINVAL; 2752b85daafeSKrishna Gudipati 2753b85daafeSKrishna Gudipati switch (cmd) { 275460138066SKrishna Gudipati case IOCMD_IOC_ENABLE: 275560138066SKrishna Gudipati rc = bfad_iocmd_ioc_enable(bfad, iocmd); 275660138066SKrishna Gudipati break; 275760138066SKrishna Gudipati case IOCMD_IOC_DISABLE: 275860138066SKrishna Gudipati rc = bfad_iocmd_ioc_disable(bfad, iocmd); 275960138066SKrishna Gudipati break; 2760b85daafeSKrishna Gudipati case IOCMD_IOC_GET_INFO: 2761b85daafeSKrishna Gudipati rc = bfad_iocmd_ioc_get_info(bfad, iocmd); 2762b85daafeSKrishna Gudipati break; 2763b85daafeSKrishna Gudipati case IOCMD_IOC_GET_ATTR: 2764b85daafeSKrishna Gudipati rc = bfad_iocmd_ioc_get_attr(bfad, iocmd); 2765b85daafeSKrishna Gudipati break; 276660138066SKrishna Gudipati case IOCMD_IOC_GET_STATS: 276760138066SKrishna Gudipati rc = bfad_iocmd_ioc_get_stats(bfad, iocmd); 276860138066SKrishna Gudipati break; 276960138066SKrishna Gudipati case IOCMD_IOC_GET_FWSTATS: 277060138066SKrishna Gudipati rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len); 277160138066SKrishna Gudipati break; 2772f2ee7601SKrishna Gudipati case IOCMD_IOC_RESET_STATS: 2773f2ee7601SKrishna Gudipati case IOCMD_IOC_RESET_FWSTATS: 2774f2ee7601SKrishna Gudipati rc = bfad_iocmd_ioc_reset_stats(bfad, iocmd, cmd); 2775f2ee7601SKrishna Gudipati break; 2776f2ee7601SKrishna Gudipati case IOCMD_IOC_SET_ADAPTER_NAME: 2777f2ee7601SKrishna Gudipati case IOCMD_IOC_SET_PORT_NAME: 2778f2ee7601SKrishna Gudipati rc = bfad_iocmd_ioc_set_name(bfad, iocmd, cmd); 2779f2ee7601SKrishna Gudipati break; 278060138066SKrishna Gudipati case IOCMD_IOCFC_GET_ATTR: 278160138066SKrishna Gudipati rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd); 278260138066SKrishna Gudipati break; 278360138066SKrishna Gudipati case IOCMD_IOCFC_SET_INTR: 278460138066SKrishna Gudipati rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd); 278560138066SKrishna Gudipati break; 278660138066SKrishna Gudipati case IOCMD_PORT_ENABLE: 278760138066SKrishna Gudipati rc = bfad_iocmd_port_enable(bfad, iocmd); 278860138066SKrishna Gudipati break; 278960138066SKrishna Gudipati case IOCMD_PORT_DISABLE: 279060138066SKrishna Gudipati rc = bfad_iocmd_port_disable(bfad, iocmd); 279160138066SKrishna Gudipati break; 2792b85daafeSKrishna Gudipati case IOCMD_PORT_GET_ATTR: 2793b85daafeSKrishna Gudipati rc = bfad_iocmd_port_get_attr(bfad, iocmd); 2794b85daafeSKrishna Gudipati break; 279560138066SKrishna Gudipati case IOCMD_PORT_GET_STATS: 279660138066SKrishna Gudipati rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len); 279760138066SKrishna Gudipati break; 2798f2ee7601SKrishna Gudipati case IOCMD_PORT_RESET_STATS: 2799f2ee7601SKrishna Gudipati rc = bfad_iocmd_port_reset_stats(bfad, iocmd); 2800f2ee7601SKrishna Gudipati break; 2801f2ee7601SKrishna Gudipati case IOCMD_PORT_CFG_TOPO: 2802f2ee7601SKrishna Gudipati case IOCMD_PORT_CFG_SPEED: 2803f2ee7601SKrishna Gudipati case IOCMD_PORT_CFG_ALPA: 2804f2ee7601SKrishna Gudipati case IOCMD_PORT_CLR_ALPA: 2805f2ee7601SKrishna Gudipati rc = bfad_iocmd_set_port_cfg(bfad, iocmd, cmd); 2806f2ee7601SKrishna Gudipati break; 2807f2ee7601SKrishna Gudipati case IOCMD_PORT_CFG_MAXFRSZ: 2808f2ee7601SKrishna Gudipati rc = bfad_iocmd_port_cfg_maxfrsize(bfad, iocmd); 2809f2ee7601SKrishna Gudipati break; 2810bbe37a67SVijaya Mohan Guvva case IOCMD_PORT_BBCR_ENABLE: 2811bbe37a67SVijaya Mohan Guvva case IOCMD_PORT_BBCR_DISABLE: 2812bbe37a67SVijaya Mohan Guvva rc = bfad_iocmd_port_cfg_bbcr(bfad, cmd, iocmd); 2813bbe37a67SVijaya Mohan Guvva break; 2814bbe37a67SVijaya Mohan Guvva case IOCMD_PORT_BBCR_GET_ATTR: 2815bbe37a67SVijaya Mohan Guvva rc = bfad_iocmd_port_get_bbcr_attr(bfad, iocmd); 2816f2ee7601SKrishna Gudipati break; 2817b85daafeSKrishna Gudipati case IOCMD_LPORT_GET_ATTR: 2818b85daafeSKrishna Gudipati rc = bfad_iocmd_lport_get_attr(bfad, iocmd); 2819b85daafeSKrishna Gudipati break; 282060138066SKrishna Gudipati case IOCMD_LPORT_GET_STATS: 282160138066SKrishna Gudipati rc = bfad_iocmd_lport_get_stats(bfad, iocmd); 282260138066SKrishna Gudipati break; 2823f2ee7601SKrishna Gudipati case IOCMD_LPORT_RESET_STATS: 2824f2ee7601SKrishna Gudipati rc = bfad_iocmd_lport_reset_stats(bfad, iocmd); 2825f2ee7601SKrishna Gudipati break; 282660138066SKrishna Gudipati case IOCMD_LPORT_GET_IOSTATS: 282760138066SKrishna Gudipati rc = bfad_iocmd_lport_get_iostats(bfad, iocmd); 282860138066SKrishna Gudipati break; 282960138066SKrishna Gudipati case IOCMD_LPORT_GET_RPORTS: 283060138066SKrishna Gudipati rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len); 283160138066SKrishna Gudipati break; 283260138066SKrishna Gudipati case IOCMD_RPORT_GET_ATTR: 283360138066SKrishna Gudipati rc = bfad_iocmd_rport_get_attr(bfad, iocmd); 283460138066SKrishna Gudipati break; 2835b85daafeSKrishna Gudipati case IOCMD_RPORT_GET_ADDR: 2836b85daafeSKrishna Gudipati rc = bfad_iocmd_rport_get_addr(bfad, iocmd); 2837b85daafeSKrishna Gudipati break; 283860138066SKrishna Gudipati case IOCMD_RPORT_GET_STATS: 283960138066SKrishna Gudipati rc = bfad_iocmd_rport_get_stats(bfad, iocmd); 284060138066SKrishna Gudipati break; 2841f2ee7601SKrishna Gudipati case IOCMD_RPORT_RESET_STATS: 2842f2ee7601SKrishna Gudipati rc = bfad_iocmd_rport_clr_stats(bfad, iocmd); 2843f2ee7601SKrishna Gudipati break; 2844f2ee7601SKrishna Gudipati case IOCMD_RPORT_SET_SPEED: 2845f2ee7601SKrishna Gudipati rc = bfad_iocmd_rport_set_speed(bfad, iocmd); 2846f2ee7601SKrishna Gudipati break; 2847f2ee7601SKrishna Gudipati case IOCMD_VPORT_GET_ATTR: 2848f2ee7601SKrishna Gudipati rc = bfad_iocmd_vport_get_attr(bfad, iocmd); 2849f2ee7601SKrishna Gudipati break; 2850f2ee7601SKrishna Gudipati case IOCMD_VPORT_GET_STATS: 2851f2ee7601SKrishna Gudipati rc = bfad_iocmd_vport_get_stats(bfad, iocmd); 2852f2ee7601SKrishna Gudipati break; 2853f2ee7601SKrishna Gudipati case IOCMD_VPORT_RESET_STATS: 2854f2ee7601SKrishna Gudipati rc = bfad_iocmd_vport_clr_stats(bfad, iocmd); 2855f2ee7601SKrishna Gudipati break; 2856b85daafeSKrishna Gudipati case IOCMD_FABRIC_GET_LPORTS: 2857b85daafeSKrishna Gudipati rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len); 2858b85daafeSKrishna Gudipati break; 2859f2ee7601SKrishna Gudipati case IOCMD_RATELIM_ENABLE: 2860f2ee7601SKrishna Gudipati case IOCMD_RATELIM_DISABLE: 2861f2ee7601SKrishna Gudipati rc = bfad_iocmd_ratelim(bfad, cmd, iocmd); 2862f2ee7601SKrishna Gudipati break; 2863f2ee7601SKrishna Gudipati case IOCMD_RATELIM_DEF_SPEED: 2864f2ee7601SKrishna Gudipati rc = bfad_iocmd_ratelim_speed(bfad, cmd, iocmd); 2865f2ee7601SKrishna Gudipati break; 2866f2ee7601SKrishna Gudipati case IOCMD_FCPIM_FAILOVER: 2867f2ee7601SKrishna Gudipati rc = bfad_iocmd_cfg_fcpim(bfad, iocmd); 2868f2ee7601SKrishna Gudipati break; 286960138066SKrishna Gudipati case IOCMD_FCPIM_MODSTATS: 287060138066SKrishna Gudipati rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd); 287160138066SKrishna Gudipati break; 2872f2ee7601SKrishna Gudipati case IOCMD_FCPIM_MODSTATSCLR: 2873f2ee7601SKrishna Gudipati rc = bfad_iocmd_fcpim_clr_modstats(bfad, iocmd); 2874f2ee7601SKrishna Gudipati break; 287560138066SKrishna Gudipati case IOCMD_FCPIM_DEL_ITN_STATS: 287660138066SKrishna Gudipati rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd); 287760138066SKrishna Gudipati break; 2878b85daafeSKrishna Gudipati case IOCMD_ITNIM_GET_ATTR: 2879b85daafeSKrishna Gudipati rc = bfad_iocmd_itnim_get_attr(bfad, iocmd); 2880b85daafeSKrishna Gudipati break; 288160138066SKrishna Gudipati case IOCMD_ITNIM_GET_IOSTATS: 288260138066SKrishna Gudipati rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd); 288360138066SKrishna Gudipati break; 2884f2ee7601SKrishna Gudipati case IOCMD_ITNIM_RESET_STATS: 2885f2ee7601SKrishna Gudipati rc = bfad_iocmd_itnim_reset_stats(bfad, iocmd); 2886f2ee7601SKrishna Gudipati break; 288760138066SKrishna Gudipati case IOCMD_ITNIM_GET_ITNSTATS: 288860138066SKrishna Gudipati rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd); 288960138066SKrishna Gudipati break; 289060138066SKrishna Gudipati case IOCMD_FCPORT_ENABLE: 289160138066SKrishna Gudipati rc = bfad_iocmd_fcport_enable(bfad, iocmd); 289260138066SKrishna Gudipati break; 289360138066SKrishna Gudipati case IOCMD_FCPORT_DISABLE: 289460138066SKrishna Gudipati rc = bfad_iocmd_fcport_disable(bfad, iocmd); 289560138066SKrishna Gudipati break; 28961a4d8e1bSKrishna Gudipati case IOCMD_IOC_PCIFN_CFG: 28971a4d8e1bSKrishna Gudipati rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd); 28981a4d8e1bSKrishna Gudipati break; 289928d358d0SVijaya Mohan Guvva case IOCMD_IOC_FW_SIG_INV: 290028d358d0SVijaya Mohan Guvva rc = bfad_iocmd_ioc_fw_sig_inv(bfad, iocmd); 290128d358d0SVijaya Mohan Guvva break; 29021a4d8e1bSKrishna Gudipati case IOCMD_PCIFN_CREATE: 29031a4d8e1bSKrishna Gudipati rc = bfad_iocmd_pcifn_create(bfad, iocmd); 29041a4d8e1bSKrishna Gudipati break; 29051a4d8e1bSKrishna Gudipati case IOCMD_PCIFN_DELETE: 29061a4d8e1bSKrishna Gudipati rc = bfad_iocmd_pcifn_delete(bfad, iocmd); 29071a4d8e1bSKrishna Gudipati break; 29081a4d8e1bSKrishna Gudipati case IOCMD_PCIFN_BW: 29091a4d8e1bSKrishna Gudipati rc = bfad_iocmd_pcifn_bw(bfad, iocmd); 29101a4d8e1bSKrishna Gudipati break; 29111a4d8e1bSKrishna Gudipati case IOCMD_ADAPTER_CFG_MODE: 29121a4d8e1bSKrishna Gudipati rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd); 29131a4d8e1bSKrishna Gudipati break; 29141a4d8e1bSKrishna Gudipati case IOCMD_PORT_CFG_MODE: 29151a4d8e1bSKrishna Gudipati rc = bfad_iocmd_port_cfg_mode(bfad, iocmd); 29161a4d8e1bSKrishna Gudipati break; 29171a4d8e1bSKrishna Gudipati case IOCMD_FLASH_ENABLE_OPTROM: 29181a4d8e1bSKrishna Gudipati case IOCMD_FLASH_DISABLE_OPTROM: 29191a4d8e1bSKrishna Gudipati rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd); 29201a4d8e1bSKrishna Gudipati break; 2921a714134aSKrishna Gudipati case IOCMD_FAA_QUERY: 2922a714134aSKrishna Gudipati rc = bfad_iocmd_faa_query(bfad, iocmd); 2923a714134aSKrishna Gudipati break; 2924148d6103SKrishna Gudipati case IOCMD_CEE_GET_ATTR: 2925148d6103SKrishna Gudipati rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len); 2926148d6103SKrishna Gudipati break; 2927148d6103SKrishna Gudipati case IOCMD_CEE_GET_STATS: 2928148d6103SKrishna Gudipati rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len); 2929148d6103SKrishna Gudipati break; 2930148d6103SKrishna Gudipati case IOCMD_CEE_RESET_STATS: 2931148d6103SKrishna Gudipati rc = bfad_iocmd_cee_reset_stats(bfad, iocmd); 2932148d6103SKrishna Gudipati break; 293351e569aaSKrishna Gudipati case IOCMD_SFP_MEDIA: 293451e569aaSKrishna Gudipati rc = bfad_iocmd_sfp_media(bfad, iocmd); 293551e569aaSKrishna Gudipati break; 293651e569aaSKrishna Gudipati case IOCMD_SFP_SPEED: 293751e569aaSKrishna Gudipati rc = bfad_iocmd_sfp_speed(bfad, iocmd); 293851e569aaSKrishna Gudipati break; 29395a54b1d5SKrishna Gudipati case IOCMD_FLASH_GET_ATTR: 29405a54b1d5SKrishna Gudipati rc = bfad_iocmd_flash_get_attr(bfad, iocmd); 29415a54b1d5SKrishna Gudipati break; 29425a54b1d5SKrishna Gudipati case IOCMD_FLASH_ERASE_PART: 29435a54b1d5SKrishna Gudipati rc = bfad_iocmd_flash_erase_part(bfad, iocmd); 29445a54b1d5SKrishna Gudipati break; 29455a54b1d5SKrishna Gudipati case IOCMD_FLASH_UPDATE_PART: 29465a54b1d5SKrishna Gudipati rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len); 29475a54b1d5SKrishna Gudipati break; 29485a54b1d5SKrishna Gudipati case IOCMD_FLASH_READ_PART: 29495a54b1d5SKrishna Gudipati rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len); 29505a54b1d5SKrishna Gudipati break; 29513d7fc66dSKrishna Gudipati case IOCMD_DIAG_TEMP: 29523d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_temp(bfad, iocmd); 29533d7fc66dSKrishna Gudipati break; 29543d7fc66dSKrishna Gudipati case IOCMD_DIAG_MEMTEST: 29553d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_memtest(bfad, iocmd); 29563d7fc66dSKrishna Gudipati break; 29573d7fc66dSKrishna Gudipati case IOCMD_DIAG_LOOPBACK: 29583d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_loopback(bfad, iocmd); 29593d7fc66dSKrishna Gudipati break; 29603d7fc66dSKrishna Gudipati case IOCMD_DIAG_FWPING: 29613d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_fwping(bfad, iocmd); 29623d7fc66dSKrishna Gudipati break; 29633d7fc66dSKrishna Gudipati case IOCMD_DIAG_QUEUETEST: 29643d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_queuetest(bfad, iocmd); 29653d7fc66dSKrishna Gudipati break; 29663d7fc66dSKrishna Gudipati case IOCMD_DIAG_SFP: 29673d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_sfp(bfad, iocmd); 29683d7fc66dSKrishna Gudipati break; 29693d7fc66dSKrishna Gudipati case IOCMD_DIAG_LED: 29703d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_led(bfad, iocmd); 29713d7fc66dSKrishna Gudipati break; 29723d7fc66dSKrishna Gudipati case IOCMD_DIAG_BEACON_LPORT: 29733d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd); 29743d7fc66dSKrishna Gudipati break; 29753d7fc66dSKrishna Gudipati case IOCMD_DIAG_LB_STAT: 29763d7fc66dSKrishna Gudipati rc = bfad_iocmd_diag_lb_stat(bfad, iocmd); 29773d7fc66dSKrishna Gudipati break; 2978e353546eSKrishna Gudipati case IOCMD_DIAG_DPORT_ENABLE: 29791a898a79SVijaya Mohan Guvva rc = bfad_iocmd_diag_dport_enable(bfad, iocmd); 2980e353546eSKrishna Gudipati break; 29811a898a79SVijaya Mohan Guvva case IOCMD_DIAG_DPORT_DISABLE: 29821a898a79SVijaya Mohan Guvva rc = bfad_iocmd_diag_dport_disable(bfad, iocmd); 29831a898a79SVijaya Mohan Guvva break; 29841a898a79SVijaya Mohan Guvva case IOCMD_DIAG_DPORT_SHOW: 29851a898a79SVijaya Mohan Guvva rc = bfad_iocmd_diag_dport_show(bfad, iocmd); 29861a898a79SVijaya Mohan Guvva break; 29871a898a79SVijaya Mohan Guvva case IOCMD_DIAG_DPORT_START: 29881a898a79SVijaya Mohan Guvva rc = bfad_iocmd_diag_dport_start(bfad, iocmd); 2989e353546eSKrishna Gudipati break; 29903350d98dSKrishna Gudipati case IOCMD_PHY_GET_ATTR: 29913350d98dSKrishna Gudipati rc = bfad_iocmd_phy_get_attr(bfad, iocmd); 29923350d98dSKrishna Gudipati break; 29933350d98dSKrishna Gudipati case IOCMD_PHY_GET_STATS: 29943350d98dSKrishna Gudipati rc = bfad_iocmd_phy_get_stats(bfad, iocmd); 29953350d98dSKrishna Gudipati break; 29963350d98dSKrishna Gudipati case IOCMD_PHY_UPDATE_FW: 29973350d98dSKrishna Gudipati rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len); 29983350d98dSKrishna Gudipati break; 29993350d98dSKrishna Gudipati case IOCMD_PHY_READ_FW: 30003350d98dSKrishna Gudipati rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len); 30013350d98dSKrishna Gudipati break; 300261e62e21SKrishna Gudipati case IOCMD_VHBA_QUERY: 300361e62e21SKrishna Gudipati rc = bfad_iocmd_vhba_query(bfad, iocmd); 300461e62e21SKrishna Gudipati break; 300561e62e21SKrishna Gudipati case IOCMD_DEBUG_PORTLOG: 300661e62e21SKrishna Gudipati rc = bfad_iocmd_porglog_get(bfad, iocmd); 300761e62e21SKrishna Gudipati break; 3008f2ee7601SKrishna Gudipati case IOCMD_DEBUG_FW_CORE: 3009f2ee7601SKrishna Gudipati rc = bfad_iocmd_debug_fw_core(bfad, iocmd, payload_len); 3010f2ee7601SKrishna Gudipati break; 3011f2ee7601SKrishna Gudipati case IOCMD_DEBUG_FW_STATE_CLR: 3012f2ee7601SKrishna Gudipati case IOCMD_DEBUG_PORTLOG_CLR: 3013f2ee7601SKrishna Gudipati case IOCMD_DEBUG_START_DTRC: 3014f2ee7601SKrishna Gudipati case IOCMD_DEBUG_STOP_DTRC: 3015f2ee7601SKrishna Gudipati rc = bfad_iocmd_debug_ctl(bfad, iocmd, cmd); 3016f2ee7601SKrishna Gudipati break; 3017f2ee7601SKrishna Gudipati case IOCMD_DEBUG_PORTLOG_CTL: 3018f2ee7601SKrishna Gudipati rc = bfad_iocmd_porglog_ctl(bfad, iocmd); 3019f2ee7601SKrishna Gudipati break; 302042a8e6e2SKrishna Gudipati case IOCMD_FCPIM_PROFILE_ON: 302142a8e6e2SKrishna Gudipati case IOCMD_FCPIM_PROFILE_OFF: 302242a8e6e2SKrishna Gudipati rc = bfad_iocmd_fcpim_cfg_profile(bfad, iocmd, cmd); 302342a8e6e2SKrishna Gudipati break; 302442a8e6e2SKrishna Gudipati case IOCMD_ITNIM_GET_IOPROFILE: 302542a8e6e2SKrishna Gudipati rc = bfad_iocmd_itnim_get_ioprofile(bfad, iocmd); 302642a8e6e2SKrishna Gudipati break; 302737ea0558SKrishna Gudipati case IOCMD_FCPORT_GET_STATS: 302837ea0558SKrishna Gudipati rc = bfad_iocmd_fcport_get_stats(bfad, iocmd); 302937ea0558SKrishna Gudipati break; 303037ea0558SKrishna Gudipati case IOCMD_FCPORT_RESET_STATS: 303137ea0558SKrishna Gudipati rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd); 303237ea0558SKrishna Gudipati break; 3033a46bd300SKrishna Gudipati case IOCMD_BOOT_CFG: 3034a46bd300SKrishna Gudipati rc = bfad_iocmd_boot_cfg(bfad, iocmd); 3035a46bd300SKrishna Gudipati break; 3036a46bd300SKrishna Gudipati case IOCMD_BOOT_QUERY: 3037a46bd300SKrishna Gudipati rc = bfad_iocmd_boot_query(bfad, iocmd); 3038a46bd300SKrishna Gudipati break; 3039a46bd300SKrishna Gudipati case IOCMD_PREBOOT_QUERY: 3040a46bd300SKrishna Gudipati rc = bfad_iocmd_preboot_query(bfad, iocmd); 3041a46bd300SKrishna Gudipati break; 3042a46bd300SKrishna Gudipati case IOCMD_ETHBOOT_CFG: 3043a46bd300SKrishna Gudipati rc = bfad_iocmd_ethboot_cfg(bfad, iocmd); 3044a46bd300SKrishna Gudipati break; 3045a46bd300SKrishna Gudipati case IOCMD_ETHBOOT_QUERY: 3046a46bd300SKrishna Gudipati rc = bfad_iocmd_ethboot_query(bfad, iocmd); 3047a46bd300SKrishna Gudipati break; 304845191236SKrishna Gudipati case IOCMD_TRUNK_ENABLE: 304945191236SKrishna Gudipati case IOCMD_TRUNK_DISABLE: 305045191236SKrishna Gudipati rc = bfad_iocmd_cfg_trunk(bfad, iocmd, cmd); 305145191236SKrishna Gudipati break; 305245191236SKrishna Gudipati case IOCMD_TRUNK_GET_ATTR: 305345191236SKrishna Gudipati rc = bfad_iocmd_trunk_get_attr(bfad, iocmd); 305445191236SKrishna Gudipati break; 30553ec4f2c8SKrishna Gudipati case IOCMD_QOS_ENABLE: 30563ec4f2c8SKrishna Gudipati case IOCMD_QOS_DISABLE: 30573ec4f2c8SKrishna Gudipati rc = bfad_iocmd_qos(bfad, iocmd, cmd); 30583ec4f2c8SKrishna Gudipati break; 30593ec4f2c8SKrishna Gudipati case IOCMD_QOS_GET_ATTR: 30603ec4f2c8SKrishna Gudipati rc = bfad_iocmd_qos_get_attr(bfad, iocmd); 30613ec4f2c8SKrishna Gudipati break; 30623ec4f2c8SKrishna Gudipati case IOCMD_QOS_GET_VC_ATTR: 30633ec4f2c8SKrishna Gudipati rc = bfad_iocmd_qos_get_vc_attr(bfad, iocmd); 30643ec4f2c8SKrishna Gudipati break; 30653ec4f2c8SKrishna Gudipati case IOCMD_QOS_GET_STATS: 30663ec4f2c8SKrishna Gudipati rc = bfad_iocmd_qos_get_stats(bfad, iocmd); 30673ec4f2c8SKrishna Gudipati break; 30683ec4f2c8SKrishna Gudipati case IOCMD_QOS_RESET_STATS: 30693ec4f2c8SKrishna Gudipati rc = bfad_iocmd_qos_reset_stats(bfad, iocmd); 30703ec4f2c8SKrishna Gudipati break; 30716894f013SKrishna Gudipati case IOCMD_QOS_SET_BW: 30726894f013SKrishna Gudipati rc = bfad_iocmd_qos_set_bw(bfad, iocmd); 30736894f013SKrishna Gudipati break; 3074c0350bf5SKrishna Gudipati case IOCMD_VF_GET_STATS: 3075c0350bf5SKrishna Gudipati rc = bfad_iocmd_vf_get_stats(bfad, iocmd); 3076c0350bf5SKrishna Gudipati break; 3077c0350bf5SKrishna Gudipati case IOCMD_VF_RESET_STATS: 3078c0350bf5SKrishna Gudipati rc = bfad_iocmd_vf_clr_stats(bfad, iocmd); 3079c0350bf5SKrishna Gudipati break; 30804c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_ENABLE: 30814c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_DISABLE: 30824c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_CLEAR: 30834c5d22bfSKrishna Gudipati rc = bfad_iocmd_lunmask(bfad, iocmd, cmd); 30844c5d22bfSKrishna Gudipati break; 30854c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_QUERY: 30864c5d22bfSKrishna Gudipati rc = bfad_iocmd_fcpim_lunmask_query(bfad, iocmd); 30874c5d22bfSKrishna Gudipati break; 30884c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_ADD: 30894c5d22bfSKrishna Gudipati case IOCMD_FCPIM_LUNMASK_DELETE: 30904c5d22bfSKrishna Gudipati rc = bfad_iocmd_fcpim_cfg_lunmask(bfad, iocmd, cmd); 30914c5d22bfSKrishna Gudipati break; 30927ace27aeSKrishna Gudipati case IOCMD_FCPIM_THROTTLE_QUERY: 30937ace27aeSKrishna Gudipati rc = bfad_iocmd_fcpim_throttle_query(bfad, iocmd); 30947ace27aeSKrishna Gudipati break; 30957ace27aeSKrishna Gudipati case IOCMD_FCPIM_THROTTLE_SET: 30967ace27aeSKrishna Gudipati rc = bfad_iocmd_fcpim_throttle_set(bfad, iocmd); 30977ace27aeSKrishna Gudipati break; 3098e6826c96SKrishna Gudipati /* TFRU */ 3099e6826c96SKrishna Gudipati case IOCMD_TFRU_READ: 3100e6826c96SKrishna Gudipati rc = bfad_iocmd_tfru_read(bfad, iocmd); 3101e6826c96SKrishna Gudipati break; 3102e6826c96SKrishna Gudipati case IOCMD_TFRU_WRITE: 3103e6826c96SKrishna Gudipati rc = bfad_iocmd_tfru_write(bfad, iocmd); 3104e6826c96SKrishna Gudipati break; 3105e6826c96SKrishna Gudipati /* FRU */ 3106e6826c96SKrishna Gudipati case IOCMD_FRUVPD_READ: 3107e6826c96SKrishna Gudipati rc = bfad_iocmd_fruvpd_read(bfad, iocmd); 3108e6826c96SKrishna Gudipati break; 3109e6826c96SKrishna Gudipati case IOCMD_FRUVPD_UPDATE: 3110e6826c96SKrishna Gudipati rc = bfad_iocmd_fruvpd_update(bfad, iocmd); 3111e6826c96SKrishna Gudipati break; 3112e6826c96SKrishna Gudipati case IOCMD_FRUVPD_GET_MAX_SIZE: 3113e6826c96SKrishna Gudipati rc = bfad_iocmd_fruvpd_get_max_size(bfad, iocmd); 3114e6826c96SKrishna Gudipati break; 3115b85daafeSKrishna Gudipati default: 31169afbcfabSKrishna Gudipati rc = -EINVAL; 3117b85daafeSKrishna Gudipati break; 3118b85daafeSKrishna Gudipati } 31199afbcfabSKrishna Gudipati return rc; 3120b85daafeSKrishna Gudipati } 3121b85daafeSKrishna Gudipati 3122b85daafeSKrishna Gudipati static int 312375cc8cfcSJohannes Thumshirn bfad_im_bsg_vendor_request(struct bsg_job *job) 3124b85daafeSKrishna Gudipati { 312501e0e15cSJohannes Thumshirn struct fc_bsg_request *bsg_request = job->request; 312601e0e15cSJohannes Thumshirn struct fc_bsg_reply *bsg_reply = job->reply; 312701e0e15cSJohannes Thumshirn uint32_t vendor_cmd = bsg_request->rqst_data.h_vendor.vendor_cmd[0]; 312845349821SJohannes Thumshirn struct Scsi_Host *shost = fc_bsg_to_shost(job); 312948d83282SArnd Bergmann struct bfad_im_port_s *im_port = bfad_get_im_port(shost); 3130b85daafeSKrishna Gudipati struct bfad_s *bfad = im_port->bfad; 3131b85daafeSKrishna Gudipati void *payload_kbuf; 3132b85daafeSKrishna Gudipati int rc = -EINVAL; 3133b85daafeSKrishna Gudipati 3134b85daafeSKrishna Gudipati /* Allocate a temp buffer to hold the passed in user space command */ 3135b85daafeSKrishna Gudipati payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 3136b85daafeSKrishna Gudipati if (!payload_kbuf) { 3137b85daafeSKrishna Gudipati rc = -ENOMEM; 3138b85daafeSKrishna Gudipati goto out; 3139b85daafeSKrishna Gudipati } 3140b85daafeSKrishna Gudipati 3141b85daafeSKrishna Gudipati /* Copy the sg_list passed in to a linear buffer: holds the cmnd data */ 3142b85daafeSKrishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 3143b85daafeSKrishna Gudipati job->request_payload.sg_cnt, payload_kbuf, 3144b85daafeSKrishna Gudipati job->request_payload.payload_len); 3145b85daafeSKrishna Gudipati 3146b85daafeSKrishna Gudipati /* Invoke IOCMD handler - to handle all the vendor command requests */ 3147b85daafeSKrishna Gudipati rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf, 3148b85daafeSKrishna Gudipati job->request_payload.payload_len); 3149b85daafeSKrishna Gudipati if (rc != BFA_STATUS_OK) 3150b85daafeSKrishna Gudipati goto error; 3151b85daafeSKrishna Gudipati 3152b85daafeSKrishna Gudipati /* Copy the response data to the job->reply_payload sg_list */ 3153b85daafeSKrishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 3154b85daafeSKrishna Gudipati job->reply_payload.sg_cnt, 3155b85daafeSKrishna Gudipati payload_kbuf, 3156b85daafeSKrishna Gudipati job->reply_payload.payload_len); 3157b85daafeSKrishna Gudipati 3158b85daafeSKrishna Gudipati /* free the command buffer */ 3159b85daafeSKrishna Gudipati kfree(payload_kbuf); 3160b85daafeSKrishna Gudipati 3161b85daafeSKrishna Gudipati /* Fill the BSG job reply data */ 3162b85daafeSKrishna Gudipati job->reply_len = job->reply_payload.payload_len; 316301e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = job->reply_payload.payload_len; 316401e0e15cSJohannes Thumshirn bsg_reply->result = rc; 3165b85daafeSKrishna Gudipati 316606548160SJohannes Thumshirn bsg_job_done(job, bsg_reply->result, 31671abaede7SJohannes Thumshirn bsg_reply->reply_payload_rcv_len); 3168b85daafeSKrishna Gudipati return rc; 3169b85daafeSKrishna Gudipati error: 3170b85daafeSKrishna Gudipati /* free the command buffer */ 3171b85daafeSKrishna Gudipati kfree(payload_kbuf); 3172b85daafeSKrishna Gudipati out: 317301e0e15cSJohannes Thumshirn bsg_reply->result = rc; 3174b85daafeSKrishna Gudipati job->reply_len = sizeof(uint32_t); 317501e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = 0; 3176b85daafeSKrishna Gudipati return rc; 3177b85daafeSKrishna Gudipati } 3178b85daafeSKrishna Gudipati 3179b85daafeSKrishna Gudipati /* FC passthru call backs */ 3180*3bbd8ef9SLee Jones static u64 3181b85daafeSKrishna Gudipati bfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid) 3182b85daafeSKrishna Gudipati { 3183b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 3184b85daafeSKrishna Gudipati struct bfa_sge_s *sge; 3185b85daafeSKrishna Gudipati u64 addr; 3186b85daafeSKrishna Gudipati 3187b85daafeSKrishna Gudipati sge = drv_fcxp->req_sge + sgeid; 3188b85daafeSKrishna Gudipati addr = (u64)(size_t) sge->sg_addr; 3189b85daafeSKrishna Gudipati return addr; 3190b85daafeSKrishna Gudipati } 3191b85daafeSKrishna Gudipati 3192*3bbd8ef9SLee Jones static u32 3193b85daafeSKrishna Gudipati bfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid) 3194b85daafeSKrishna Gudipati { 3195b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 3196b85daafeSKrishna Gudipati struct bfa_sge_s *sge; 3197b85daafeSKrishna Gudipati 3198b85daafeSKrishna Gudipati sge = drv_fcxp->req_sge + sgeid; 3199b85daafeSKrishna Gudipati return sge->sg_len; 3200b85daafeSKrishna Gudipati } 3201b85daafeSKrishna Gudipati 3202*3bbd8ef9SLee Jones static u64 3203b85daafeSKrishna Gudipati bfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid) 3204b85daafeSKrishna Gudipati { 3205b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 3206b85daafeSKrishna Gudipati struct bfa_sge_s *sge; 3207b85daafeSKrishna Gudipati u64 addr; 3208b85daafeSKrishna Gudipati 3209b85daafeSKrishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 3210b85daafeSKrishna Gudipati addr = (u64)(size_t) sge->sg_addr; 3211b85daafeSKrishna Gudipati return addr; 3212b85daafeSKrishna Gudipati } 3213b85daafeSKrishna Gudipati 3214*3bbd8ef9SLee Jones static u32 3215b85daafeSKrishna Gudipati bfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid) 3216b85daafeSKrishna Gudipati { 3217b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 3218b85daafeSKrishna Gudipati struct bfa_sge_s *sge; 3219b85daafeSKrishna Gudipati 3220b85daafeSKrishna Gudipati sge = drv_fcxp->rsp_sge + sgeid; 3221b85daafeSKrishna Gudipati return sge->sg_len; 3222b85daafeSKrishna Gudipati } 3223b85daafeSKrishna Gudipati 3224*3bbd8ef9SLee Jones static void 3225b85daafeSKrishna Gudipati bfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg, 3226b85daafeSKrishna Gudipati bfa_status_t req_status, u32 rsp_len, u32 resid_len, 3227b85daafeSKrishna Gudipati struct fchs_s *rsp_fchs) 3228b85daafeSKrishna Gudipati { 3229b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp = bfad_fcxp; 3230b85daafeSKrishna Gudipati 3231b85daafeSKrishna Gudipati drv_fcxp->req_status = req_status; 3232b85daafeSKrishna Gudipati drv_fcxp->rsp_len = rsp_len; 3233b85daafeSKrishna Gudipati 3234b85daafeSKrishna Gudipati /* bfa_fcxp will be automatically freed by BFA */ 3235b85daafeSKrishna Gudipati drv_fcxp->bfa_fcxp = NULL; 3236b85daafeSKrishna Gudipati complete(&drv_fcxp->comp); 3237b85daafeSKrishna Gudipati } 3238b85daafeSKrishna Gudipati 3239*3bbd8ef9SLee Jones static struct bfad_buf_info * 3240b85daafeSKrishna Gudipati bfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf, 3241b85daafeSKrishna Gudipati uint32_t payload_len, uint32_t *num_sgles) 3242b85daafeSKrishna Gudipati { 3243b85daafeSKrishna Gudipati struct bfad_buf_info *buf_base, *buf_info; 3244b85daafeSKrishna Gudipati struct bfa_sge_s *sg_table; 3245b85daafeSKrishna Gudipati int sge_num = 1; 3246b85daafeSKrishna Gudipati 32476396bb22SKees Cook buf_base = kcalloc(sizeof(struct bfad_buf_info) + 32486396bb22SKees Cook sizeof(struct bfa_sge_s), 32496396bb22SKees Cook sge_num, GFP_KERNEL); 3250b85daafeSKrishna Gudipati if (!buf_base) 3251b85daafeSKrishna Gudipati return NULL; 3252b85daafeSKrishna Gudipati 3253b85daafeSKrishna Gudipati sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) + 3254b85daafeSKrishna Gudipati (sizeof(struct bfad_buf_info) * sge_num)); 3255b85daafeSKrishna Gudipati 3256b85daafeSKrishna Gudipati /* Allocate dma coherent memory */ 3257b85daafeSKrishna Gudipati buf_info = buf_base; 3258b85daafeSKrishna Gudipati buf_info->size = payload_len; 3259750afb08SLuis Chamberlain buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, 32607626d9f3SJoe Perches buf_info->size, &buf_info->phys, 32617626d9f3SJoe Perches GFP_KERNEL); 3262b85daafeSKrishna Gudipati if (!buf_info->virt) 3263b85daafeSKrishna Gudipati goto out_free_mem; 3264b85daafeSKrishna Gudipati 3265b85daafeSKrishna Gudipati /* copy the linear bsg buffer to buf_info */ 3266b85daafeSKrishna Gudipati memcpy(buf_info->virt, payload_kbuf, buf_info->size); 3267b85daafeSKrishna Gudipati 3268b85daafeSKrishna Gudipati /* 3269b85daafeSKrishna Gudipati * Setup SG table 3270b85daafeSKrishna Gudipati */ 3271b85daafeSKrishna Gudipati sg_table->sg_len = buf_info->size; 3272b85daafeSKrishna Gudipati sg_table->sg_addr = (void *)(size_t) buf_info->phys; 3273b85daafeSKrishna Gudipati 3274b85daafeSKrishna Gudipati *num_sgles = sge_num; 3275b85daafeSKrishna Gudipati 3276b85daafeSKrishna Gudipati return buf_base; 3277b85daafeSKrishna Gudipati 3278b85daafeSKrishna Gudipati out_free_mem: 3279b85daafeSKrishna Gudipati kfree(buf_base); 3280b85daafeSKrishna Gudipati return NULL; 3281b85daafeSKrishna Gudipati } 3282b85daafeSKrishna Gudipati 3283*3bbd8ef9SLee Jones static void 3284b85daafeSKrishna Gudipati bfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base, 3285b85daafeSKrishna Gudipati uint32_t num_sgles) 3286b85daafeSKrishna Gudipati { 3287b85daafeSKrishna Gudipati int i; 3288b85daafeSKrishna Gudipati struct bfad_buf_info *buf_info = buf_base; 3289b85daafeSKrishna Gudipati 3290b85daafeSKrishna Gudipati if (buf_base) { 3291b85daafeSKrishna Gudipati for (i = 0; i < num_sgles; buf_info++, i++) { 3292b85daafeSKrishna Gudipati if (buf_info->virt != NULL) 3293b85daafeSKrishna Gudipati dma_free_coherent(&bfad->pcidev->dev, 3294b85daafeSKrishna Gudipati buf_info->size, buf_info->virt, 3295b85daafeSKrishna Gudipati buf_info->phys); 3296b85daafeSKrishna Gudipati } 3297b85daafeSKrishna Gudipati kfree(buf_base); 3298b85daafeSKrishna Gudipati } 3299b85daafeSKrishna Gudipati } 3300b85daafeSKrishna Gudipati 3301*3bbd8ef9SLee Jones static int 330275cc8cfcSJohannes Thumshirn bfad_fcxp_bsg_send(struct bsg_job *job, struct bfad_fcxp *drv_fcxp, 3303b85daafeSKrishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt) 3304b85daafeSKrishna Gudipati { 3305b85daafeSKrishna Gudipati struct bfa_fcxp_s *hal_fcxp; 3306b85daafeSKrishna Gudipati struct bfad_s *bfad = drv_fcxp->port->bfad; 3307b85daafeSKrishna Gudipati unsigned long flags; 3308b85daafeSKrishna Gudipati uint8_t lp_tag; 3309b85daafeSKrishna Gudipati 3310b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 3311b85daafeSKrishna Gudipati 3312b85daafeSKrishna Gudipati /* Allocate bfa_fcxp structure */ 3313c3f1b123SKrishna Gudipati hal_fcxp = bfa_fcxp_req_rsp_alloc(drv_fcxp, &bfad->bfa, 3314b85daafeSKrishna Gudipati drv_fcxp->num_req_sgles, 3315b85daafeSKrishna Gudipati drv_fcxp->num_rsp_sgles, 3316b85daafeSKrishna Gudipati bfad_fcxp_get_req_sgaddr_cb, 3317b85daafeSKrishna Gudipati bfad_fcxp_get_req_sglen_cb, 3318b85daafeSKrishna Gudipati bfad_fcxp_get_rsp_sgaddr_cb, 3319c3f1b123SKrishna Gudipati bfad_fcxp_get_rsp_sglen_cb, BFA_TRUE); 3320b85daafeSKrishna Gudipati if (!hal_fcxp) { 3321b85daafeSKrishna Gudipati bfa_trc(bfad, 0); 3322b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3323b85daafeSKrishna Gudipati return BFA_STATUS_ENOMEM; 3324b85daafeSKrishna Gudipati } 3325b85daafeSKrishna Gudipati 3326b85daafeSKrishna Gudipati drv_fcxp->bfa_fcxp = hal_fcxp; 3327b85daafeSKrishna Gudipati 3328b85daafeSKrishna Gudipati lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id); 3329b85daafeSKrishna Gudipati 3330b85daafeSKrishna Gudipati bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag, 3331b85daafeSKrishna Gudipati bsg_fcpt->cts, bsg_fcpt->cos, 3332b85daafeSKrishna Gudipati job->request_payload.payload_len, 3333b85daafeSKrishna Gudipati &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad, 3334b85daafeSKrishna Gudipati job->reply_payload.payload_len, bsg_fcpt->tsecs); 3335b85daafeSKrishna Gudipati 3336b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3337b85daafeSKrishna Gudipati 3338b85daafeSKrishna Gudipati return BFA_STATUS_OK; 3339b85daafeSKrishna Gudipati } 3340b85daafeSKrishna Gudipati 3341*3bbd8ef9SLee Jones static int 334275cc8cfcSJohannes Thumshirn bfad_im_bsg_els_ct_request(struct bsg_job *job) 3343b85daafeSKrishna Gudipati { 3344b85daafeSKrishna Gudipati struct bfa_bsg_data *bsg_data; 334545349821SJohannes Thumshirn struct Scsi_Host *shost = fc_bsg_to_shost(job); 334648d83282SArnd Bergmann struct bfad_im_port_s *im_port = bfad_get_im_port(shost); 3347b85daafeSKrishna Gudipati struct bfad_s *bfad = im_port->bfad; 3348b85daafeSKrishna Gudipati bfa_bsg_fcpt_t *bsg_fcpt; 3349b85daafeSKrishna Gudipati struct bfad_fcxp *drv_fcxp; 3350b85daafeSKrishna Gudipati struct bfa_fcs_lport_s *fcs_port; 3351b85daafeSKrishna Gudipati struct bfa_fcs_rport_s *fcs_rport; 335246337737SJohannes Thumshirn struct fc_bsg_request *bsg_request = job->request; 335301e0e15cSJohannes Thumshirn struct fc_bsg_reply *bsg_reply = job->reply; 335401e0e15cSJohannes Thumshirn uint32_t command_type = bsg_request->msgcode; 3355b85daafeSKrishna Gudipati unsigned long flags; 3356b85daafeSKrishna Gudipati struct bfad_buf_info *rsp_buf_info; 3357b85daafeSKrishna Gudipati void *req_kbuf = NULL, *rsp_kbuf = NULL; 3358b85daafeSKrishna Gudipati int rc = -EINVAL; 3359b85daafeSKrishna Gudipati 3360b85daafeSKrishna Gudipati job->reply_len = sizeof(uint32_t); /* Atleast uint32_t reply_len */ 336101e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = 0; 3362b85daafeSKrishna Gudipati 3363b85daafeSKrishna Gudipati /* Get the payload passed in from userspace */ 336401e0e15cSJohannes Thumshirn bsg_data = (struct bfa_bsg_data *) (((char *)bsg_request) + 3365b85daafeSKrishna Gudipati sizeof(struct fc_bsg_request)); 3366b85daafeSKrishna Gudipati if (bsg_data == NULL) 3367b85daafeSKrishna Gudipati goto out; 3368b85daafeSKrishna Gudipati 3369b85daafeSKrishna Gudipati /* 3370b85daafeSKrishna Gudipati * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload 3371b85daafeSKrishna Gudipati * buffer of size bsg_data->payload_len 3372b85daafeSKrishna Gudipati */ 337364b8aa75SJesper Juhl bsg_fcpt = kzalloc(bsg_data->payload_len, GFP_KERNEL); 3374529f9a76SKrishna Gudipati if (!bsg_fcpt) { 3375529f9a76SKrishna Gudipati rc = -ENOMEM; 3376b85daafeSKrishna Gudipati goto out; 3377529f9a76SKrishna Gudipati } 3378b85daafeSKrishna Gudipati 3379bccd2683SVijaya Mohan Guvva if (copy_from_user((uint8_t *)bsg_fcpt, 3380bccd2683SVijaya Mohan Guvva (void *)(unsigned long)bsg_data->payload, 3381b85daafeSKrishna Gudipati bsg_data->payload_len)) { 3382b85daafeSKrishna Gudipati kfree(bsg_fcpt); 3383529f9a76SKrishna Gudipati rc = -EIO; 3384b85daafeSKrishna Gudipati goto out; 3385b85daafeSKrishna Gudipati } 3386b85daafeSKrishna Gudipati 3387b85daafeSKrishna Gudipati drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL); 3388b85daafeSKrishna Gudipati if (drv_fcxp == NULL) { 338964b8aa75SJesper Juhl kfree(bsg_fcpt); 3390b85daafeSKrishna Gudipati rc = -ENOMEM; 3391b85daafeSKrishna Gudipati goto out; 3392b85daafeSKrishna Gudipati } 3393b85daafeSKrishna Gudipati 3394b85daafeSKrishna Gudipati spin_lock_irqsave(&bfad->bfad_lock, flags); 3395b85daafeSKrishna Gudipati fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id, 3396b85daafeSKrishna Gudipati bsg_fcpt->lpwwn); 3397b85daafeSKrishna Gudipati if (fcs_port == NULL) { 3398b85daafeSKrishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN; 3399b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3400b85daafeSKrishna Gudipati goto out_free_mem; 3401b85daafeSKrishna Gudipati } 3402b85daafeSKrishna Gudipati 3403b85daafeSKrishna Gudipati /* Check if the port is online before sending FC Passthru cmd */ 3404b85daafeSKrishna Gudipati if (!bfa_fcs_lport_is_online(fcs_port)) { 3405b85daafeSKrishna Gudipati bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE; 3406b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3407b85daafeSKrishna Gudipati goto out_free_mem; 3408b85daafeSKrishna Gudipati } 3409b85daafeSKrishna Gudipati 3410b85daafeSKrishna Gudipati drv_fcxp->port = fcs_port->bfad_port; 3411b85daafeSKrishna Gudipati 3412b85daafeSKrishna Gudipati if (drv_fcxp->port->bfad == 0) 3413b85daafeSKrishna Gudipati drv_fcxp->port->bfad = bfad; 3414b85daafeSKrishna Gudipati 3415b85daafeSKrishna Gudipati /* Fetch the bfa_rport - if nexus needed */ 3416b85daafeSKrishna Gudipati if (command_type == FC_BSG_HST_ELS_NOLOGIN || 3417b85daafeSKrishna Gudipati command_type == FC_BSG_HST_CT) { 3418b85daafeSKrishna Gudipati /* BSG HST commands: no nexus needed */ 3419b85daafeSKrishna Gudipati drv_fcxp->bfa_rport = NULL; 3420b85daafeSKrishna Gudipati 3421b85daafeSKrishna Gudipati } else if (command_type == FC_BSG_RPT_ELS || 3422b85daafeSKrishna Gudipati command_type == FC_BSG_RPT_CT) { 3423b85daafeSKrishna Gudipati /* BSG RPT commands: nexus needed */ 3424b85daafeSKrishna Gudipati fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port, 3425b85daafeSKrishna Gudipati bsg_fcpt->dpwwn); 3426b85daafeSKrishna Gudipati if (fcs_rport == NULL) { 3427b85daafeSKrishna Gudipati bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN; 3428b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3429b85daafeSKrishna Gudipati goto out_free_mem; 3430b85daafeSKrishna Gudipati } 3431b85daafeSKrishna Gudipati 3432b85daafeSKrishna Gudipati drv_fcxp->bfa_rport = fcs_rport->bfa_rport; 3433b85daafeSKrishna Gudipati 3434b85daafeSKrishna Gudipati } else { /* Unknown BSG msgcode; return -EINVAL */ 3435b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3436b85daafeSKrishna Gudipati goto out_free_mem; 3437b85daafeSKrishna Gudipati } 3438b85daafeSKrishna Gudipati 3439b85daafeSKrishna Gudipati spin_unlock_irqrestore(&bfad->bfad_lock, flags); 3440b85daafeSKrishna Gudipati 3441b85daafeSKrishna Gudipati /* allocate memory for req / rsp buffers */ 3442b85daafeSKrishna Gudipati req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL); 3443b85daafeSKrishna Gudipati if (!req_kbuf) { 3444b85daafeSKrishna Gudipati printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n", 3445b85daafeSKrishna Gudipati bfad->pci_name); 3446b85daafeSKrishna Gudipati rc = -ENOMEM; 3447b85daafeSKrishna Gudipati goto out_free_mem; 3448b85daafeSKrishna Gudipati } 3449b85daafeSKrishna Gudipati 3450b85daafeSKrishna Gudipati rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL); 3451b85daafeSKrishna Gudipati if (!rsp_kbuf) { 3452b85daafeSKrishna Gudipati printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n", 3453b85daafeSKrishna Gudipati bfad->pci_name); 3454b85daafeSKrishna Gudipati rc = -ENOMEM; 3455b85daafeSKrishna Gudipati goto out_free_mem; 3456b85daafeSKrishna Gudipati } 3457b85daafeSKrishna Gudipati 3458b85daafeSKrishna Gudipati /* map req sg - copy the sg_list passed in to the linear buffer */ 3459b85daafeSKrishna Gudipati sg_copy_to_buffer(job->request_payload.sg_list, 3460b85daafeSKrishna Gudipati job->request_payload.sg_cnt, req_kbuf, 3461b85daafeSKrishna Gudipati job->request_payload.payload_len); 3462b85daafeSKrishna Gudipati 3463b85daafeSKrishna Gudipati drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf, 3464b85daafeSKrishna Gudipati job->request_payload.payload_len, 3465b85daafeSKrishna Gudipati &drv_fcxp->num_req_sgles); 3466b85daafeSKrishna Gudipati if (!drv_fcxp->reqbuf_info) { 3467b85daafeSKrishna Gudipati printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n", 3468b85daafeSKrishna Gudipati bfad->pci_name); 3469b85daafeSKrishna Gudipati rc = -ENOMEM; 3470b85daafeSKrishna Gudipati goto out_free_mem; 3471b85daafeSKrishna Gudipati } 3472b85daafeSKrishna Gudipati 3473b85daafeSKrishna Gudipati drv_fcxp->req_sge = (struct bfa_sge_s *) 3474b85daafeSKrishna Gudipati (((uint8_t *)drv_fcxp->reqbuf_info) + 3475b85daafeSKrishna Gudipati (sizeof(struct bfad_buf_info) * 3476b85daafeSKrishna Gudipati drv_fcxp->num_req_sgles)); 3477b85daafeSKrishna Gudipati 3478b85daafeSKrishna Gudipati /* map rsp sg */ 3479b85daafeSKrishna Gudipati drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf, 3480b85daafeSKrishna Gudipati job->reply_payload.payload_len, 3481b85daafeSKrishna Gudipati &drv_fcxp->num_rsp_sgles); 3482b85daafeSKrishna Gudipati if (!drv_fcxp->rspbuf_info) { 3483b85daafeSKrishna Gudipati printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n", 3484b85daafeSKrishna Gudipati bfad->pci_name); 3485b85daafeSKrishna Gudipati rc = -ENOMEM; 3486b85daafeSKrishna Gudipati goto out_free_mem; 3487b85daafeSKrishna Gudipati } 3488b85daafeSKrishna Gudipati 3489b85daafeSKrishna Gudipati rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info; 3490b85daafeSKrishna Gudipati drv_fcxp->rsp_sge = (struct bfa_sge_s *) 3491b85daafeSKrishna Gudipati (((uint8_t *)drv_fcxp->rspbuf_info) + 3492b85daafeSKrishna Gudipati (sizeof(struct bfad_buf_info) * 3493b85daafeSKrishna Gudipati drv_fcxp->num_rsp_sgles)); 3494b85daafeSKrishna Gudipati 3495b85daafeSKrishna Gudipati /* fcxp send */ 3496b85daafeSKrishna Gudipati init_completion(&drv_fcxp->comp); 3497b85daafeSKrishna Gudipati rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt); 3498b85daafeSKrishna Gudipati if (rc == BFA_STATUS_OK) { 3499b85daafeSKrishna Gudipati wait_for_completion(&drv_fcxp->comp); 3500b85daafeSKrishna Gudipati bsg_fcpt->status = drv_fcxp->req_status; 3501b85daafeSKrishna Gudipati } else { 3502b85daafeSKrishna Gudipati bsg_fcpt->status = rc; 3503b85daafeSKrishna Gudipati goto out_free_mem; 3504b85daafeSKrishna Gudipati } 3505b85daafeSKrishna Gudipati 3506b85daafeSKrishna Gudipati /* fill the job->reply data */ 3507b85daafeSKrishna Gudipati if (drv_fcxp->req_status == BFA_STATUS_OK) { 3508b85daafeSKrishna Gudipati job->reply_len = drv_fcxp->rsp_len; 350901e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = drv_fcxp->rsp_len; 351001e0e15cSJohannes Thumshirn bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; 3511b85daafeSKrishna Gudipati } else { 351201e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = 3513b85daafeSKrishna Gudipati sizeof(struct fc_bsg_ctels_reply); 3514b85daafeSKrishna Gudipati job->reply_len = sizeof(uint32_t); 351501e0e15cSJohannes Thumshirn bsg_reply->reply_data.ctels_reply.status = 3516b85daafeSKrishna Gudipati FC_CTELS_STATUS_REJECT; 3517b85daafeSKrishna Gudipati } 3518b85daafeSKrishna Gudipati 3519b85daafeSKrishna Gudipati /* Copy the response data to the reply_payload sg list */ 3520b85daafeSKrishna Gudipati sg_copy_from_buffer(job->reply_payload.sg_list, 3521b85daafeSKrishna Gudipati job->reply_payload.sg_cnt, 3522b85daafeSKrishna Gudipati (uint8_t *)rsp_buf_info->virt, 3523b85daafeSKrishna Gudipati job->reply_payload.payload_len); 3524b85daafeSKrishna Gudipati 3525b85daafeSKrishna Gudipati out_free_mem: 3526b85daafeSKrishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info, 3527b85daafeSKrishna Gudipati drv_fcxp->num_rsp_sgles); 3528b85daafeSKrishna Gudipati bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info, 3529b85daafeSKrishna Gudipati drv_fcxp->num_req_sgles); 3530b85daafeSKrishna Gudipati kfree(req_kbuf); 3531b85daafeSKrishna Gudipati kfree(rsp_kbuf); 3532b85daafeSKrishna Gudipati 3533b85daafeSKrishna Gudipati /* Need a copy to user op */ 3534bccd2683SVijaya Mohan Guvva if (copy_to_user((void *)(unsigned long)bsg_data->payload, 3535bccd2683SVijaya Mohan Guvva (void *)bsg_fcpt, bsg_data->payload_len)) 3536b85daafeSKrishna Gudipati rc = -EIO; 3537b85daafeSKrishna Gudipati 3538b85daafeSKrishna Gudipati kfree(bsg_fcpt); 3539b85daafeSKrishna Gudipati kfree(drv_fcxp); 3540b85daafeSKrishna Gudipati out: 354101e0e15cSJohannes Thumshirn bsg_reply->result = rc; 3542b85daafeSKrishna Gudipati 3543b85daafeSKrishna Gudipati if (rc == BFA_STATUS_OK) 354406548160SJohannes Thumshirn bsg_job_done(job, bsg_reply->result, 35451abaede7SJohannes Thumshirn bsg_reply->reply_payload_rcv_len); 3546b85daafeSKrishna Gudipati 3547b85daafeSKrishna Gudipati return rc; 3548b85daafeSKrishna Gudipati } 3549b85daafeSKrishna Gudipati 3550b85daafeSKrishna Gudipati int 355175cc8cfcSJohannes Thumshirn bfad_im_bsg_request(struct bsg_job *job) 3552b85daafeSKrishna Gudipati { 355301e0e15cSJohannes Thumshirn struct fc_bsg_request *bsg_request = job->request; 355401e0e15cSJohannes Thumshirn struct fc_bsg_reply *bsg_reply = job->reply; 3555b85daafeSKrishna Gudipati uint32_t rc = BFA_STATUS_OK; 3556b85daafeSKrishna Gudipati 355701e0e15cSJohannes Thumshirn switch (bsg_request->msgcode) { 3558b85daafeSKrishna Gudipati case FC_BSG_HST_VENDOR: 3559b85daafeSKrishna Gudipati /* Process BSG HST Vendor requests */ 3560b85daafeSKrishna Gudipati rc = bfad_im_bsg_vendor_request(job); 3561b85daafeSKrishna Gudipati break; 3562b85daafeSKrishna Gudipati case FC_BSG_HST_ELS_NOLOGIN: 3563b85daafeSKrishna Gudipati case FC_BSG_RPT_ELS: 3564b85daafeSKrishna Gudipati case FC_BSG_HST_CT: 3565b85daafeSKrishna Gudipati case FC_BSG_RPT_CT: 3566b85daafeSKrishna Gudipati /* Process BSG ELS/CT commands */ 3567b85daafeSKrishna Gudipati rc = bfad_im_bsg_els_ct_request(job); 3568b85daafeSKrishna Gudipati break; 3569b85daafeSKrishna Gudipati default: 357001e0e15cSJohannes Thumshirn bsg_reply->result = rc = -EINVAL; 357101e0e15cSJohannes Thumshirn bsg_reply->reply_payload_rcv_len = 0; 3572b85daafeSKrishna Gudipati break; 3573b85daafeSKrishna Gudipati } 3574b85daafeSKrishna Gudipati 3575b85daafeSKrishna Gudipati return rc; 3576b85daafeSKrishna Gudipati } 3577b85daafeSKrishna Gudipati 3578b85daafeSKrishna Gudipati int 357975cc8cfcSJohannes Thumshirn bfad_im_bsg_timeout(struct bsg_job *job) 3580b85daafeSKrishna Gudipati { 3581b85daafeSKrishna Gudipati /* Don't complete the BSG job request - return -EAGAIN 3582b85daafeSKrishna Gudipati * to reset bsg job timeout : for ELS/CT pass thru we 3583b85daafeSKrishna Gudipati * already have timer to track the request. 3584b85daafeSKrishna Gudipati */ 3585b85daafeSKrishna Gudipati return -EAGAIN; 3586b85daafeSKrishna Gudipati } 3587