diff options
author | Krishna Gudipati <kgudipat@brocade.com> | 2011-07-20 20:02:32 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-07-27 06:50:06 -0400 |
commit | a46bd300e191d5a1a7367a799a9f5268c5e6aafd (patch) | |
tree | d5735b3f19dc62fb0ad182e597337eb416f620b9 /drivers/scsi/bfa/bfad_bsg.c | |
parent | 37ea0558b87abb151245bc750070a4dcda490aca (diff) |
[SCSI] bfa: Add support to configure and query flash boot partition
Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa/bfad_bsg.c')
-rw-r--r-- | drivers/scsi/bfa/bfad_bsg.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c index 0d920edebac..f782ee4b886 100644 --- a/drivers/scsi/bfa/bfad_bsg.c +++ b/drivers/scsi/bfa/bfad_bsg.c | |||
@@ -2072,6 +2072,115 @@ out: | |||
2072 | return 0; | 2072 | return 0; |
2073 | } | 2073 | } |
2074 | 2074 | ||
2075 | int | ||
2076 | bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd) | ||
2077 | { | ||
2078 | struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd; | ||
2079 | struct bfad_hal_comp fcomp; | ||
2080 | unsigned long flags; | ||
2081 | |||
2082 | init_completion(&fcomp.comp); | ||
2083 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
2084 | iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), | ||
2085 | BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn), | ||
2086 | &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, | ||
2087 | bfad_hcb_comp, &fcomp); | ||
2088 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
2089 | if (iocmd->status != BFA_STATUS_OK) | ||
2090 | goto out; | ||
2091 | wait_for_completion(&fcomp.comp); | ||
2092 | iocmd->status = fcomp.status; | ||
2093 | out: | ||
2094 | return 0; | ||
2095 | } | ||
2096 | |||
2097 | int | ||
2098 | bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd) | ||
2099 | { | ||
2100 | struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd; | ||
2101 | struct bfad_hal_comp fcomp; | ||
2102 | unsigned long flags; | ||
2103 | |||
2104 | init_completion(&fcomp.comp); | ||
2105 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
2106 | iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), | ||
2107 | BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn), | ||
2108 | &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0, | ||
2109 | bfad_hcb_comp, &fcomp); | ||
2110 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
2111 | if (iocmd->status != BFA_STATUS_OK) | ||
2112 | goto out; | ||
2113 | wait_for_completion(&fcomp.comp); | ||
2114 | iocmd->status = fcomp.status; | ||
2115 | out: | ||
2116 | return 0; | ||
2117 | } | ||
2118 | |||
2119 | int | ||
2120 | bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd) | ||
2121 | { | ||
2122 | struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd; | ||
2123 | struct bfi_iocfc_cfgrsp_s *cfgrsp = bfad->bfa.iocfc.cfgrsp; | ||
2124 | struct bfa_boot_pbc_s *pbcfg = &iocmd->cfg; | ||
2125 | unsigned long flags; | ||
2126 | |||
2127 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
2128 | pbcfg->enable = cfgrsp->pbc_cfg.boot_enabled; | ||
2129 | pbcfg->nbluns = cfgrsp->pbc_cfg.nbluns; | ||
2130 | pbcfg->speed = cfgrsp->pbc_cfg.port_speed; | ||
2131 | memcpy(pbcfg->pblun, cfgrsp->pbc_cfg.blun, sizeof(pbcfg->pblun)); | ||
2132 | iocmd->status = BFA_STATUS_OK; | ||
2133 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
2134 | |||
2135 | return 0; | ||
2136 | } | ||
2137 | |||
2138 | int | ||
2139 | bfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd) | ||
2140 | { | ||
2141 | struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd; | ||
2142 | struct bfad_hal_comp fcomp; | ||
2143 | unsigned long flags; | ||
2144 | |||
2145 | init_completion(&fcomp.comp); | ||
2146 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
2147 | iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa), | ||
2148 | BFA_FLASH_PART_PXECFG, | ||
2149 | bfad->bfa.ioc.port_id, &iocmd->cfg, | ||
2150 | sizeof(struct bfa_ethboot_cfg_s), 0, | ||
2151 | bfad_hcb_comp, &fcomp); | ||
2152 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
2153 | if (iocmd->status != BFA_STATUS_OK) | ||
2154 | goto out; | ||
2155 | wait_for_completion(&fcomp.comp); | ||
2156 | iocmd->status = fcomp.status; | ||
2157 | out: | ||
2158 | return 0; | ||
2159 | } | ||
2160 | |||
2161 | int | ||
2162 | bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd) | ||
2163 | { | ||
2164 | struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd; | ||
2165 | struct bfad_hal_comp fcomp; | ||
2166 | unsigned long flags; | ||
2167 | |||
2168 | init_completion(&fcomp.comp); | ||
2169 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
2170 | iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), | ||
2171 | BFA_FLASH_PART_PXECFG, | ||
2172 | bfad->bfa.ioc.port_id, &iocmd->cfg, | ||
2173 | sizeof(struct bfa_ethboot_cfg_s), 0, | ||
2174 | bfad_hcb_comp, &fcomp); | ||
2175 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
2176 | if (iocmd->status != BFA_STATUS_OK) | ||
2177 | goto out; | ||
2178 | wait_for_completion(&fcomp.comp); | ||
2179 | iocmd->status = fcomp.status; | ||
2180 | out: | ||
2181 | return 0; | ||
2182 | } | ||
2183 | |||
2075 | static int | 2184 | static int |
2076 | bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, | 2185 | bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, |
2077 | unsigned int payload_len) | 2186 | unsigned int payload_len) |
@@ -2346,6 +2455,21 @@ bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, | |||
2346 | case IOCMD_FCPORT_RESET_STATS: | 2455 | case IOCMD_FCPORT_RESET_STATS: |
2347 | rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd); | 2456 | rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd); |
2348 | break; | 2457 | break; |
2458 | case IOCMD_BOOT_CFG: | ||
2459 | rc = bfad_iocmd_boot_cfg(bfad, iocmd); | ||
2460 | break; | ||
2461 | case IOCMD_BOOT_QUERY: | ||
2462 | rc = bfad_iocmd_boot_query(bfad, iocmd); | ||
2463 | break; | ||
2464 | case IOCMD_PREBOOT_QUERY: | ||
2465 | rc = bfad_iocmd_preboot_query(bfad, iocmd); | ||
2466 | break; | ||
2467 | case IOCMD_ETHBOOT_CFG: | ||
2468 | rc = bfad_iocmd_ethboot_cfg(bfad, iocmd); | ||
2469 | break; | ||
2470 | case IOCMD_ETHBOOT_QUERY: | ||
2471 | rc = bfad_iocmd_ethboot_query(bfad, iocmd); | ||
2472 | break; | ||
2349 | default: | 2473 | default: |
2350 | rc = -EINVAL; | 2474 | rc = -EINVAL; |
2351 | break; | 2475 | break; |