/* * linux/drivers/scsi/esas2r/esas2r_flash.c * For use with ATTO ExpressSAS R6xx SAS/SATA RAID controllers * * Copyright (c) 2001-2013 ATTO Technology, Inc. * (mailto:[email protected]) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * NO WARRANTY * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is * solely responsible for determining the appropriateness of using and * distributing the Program and assumes all risks associated with its * exercise of rights under this Agreement, including but not limited to * the risks and costs of program errors, damage to or loss of data, * programs or equipment, and unavailability or interruption of operations. * * DISCLAIMER OF LIABILITY * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #include "esas2r.h" /* local macro defs */ #define esas2r_nvramcalc_cksum(n) … #define esas2r_nvramcalc_xor_cksum(n) … #define ESAS2R_FS_DRVR_VER … static struct esas2r_sas_nvram default_sas_nvram = …; static u8 cmd_to_fls_func[] = …; static u8 esas2r_calc_byte_xor_cksum(u8 *addr, u32 len, u8 seed) { … } static u8 esas2r_calc_byte_cksum(void *addr, u32 len, u8 seed) { … } /* Interrupt callback to process FM API write requests. */ static void esas2r_fmapi_callback(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* * Build a flash request based on the flash context. The request status * is filled in on an error. */ static void build_flash_msg(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* determine the method to process the flash request */ static bool load_image(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* boot image fixer uppers called before downloading the image. */ static void fix_bios(struct esas2r_adapter *a, struct esas2r_flash_img *fi) { … } static void fix_efi(struct esas2r_adapter *a, struct esas2r_flash_img *fi) { … } /* Complete a FM API request with the specified status. */ static bool complete_fmapi_req(struct esas2r_adapter *a, struct esas2r_request *rq, u8 fi_stat) { … } /* Process each phase of the flash download process. */ static void fw_download_proc(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* Determine the flash image adaptyp for this adapter */ static u8 get_fi_adap_type(struct esas2r_adapter *a) { … } /* Size of config + copyright + flash_ver images, 0 for failure. */ static u32 chk_cfg(u8 *cfg, u32 length, u32 *flash_ver) { … } /* Verify that the boot image is valid */ static u8 chk_boot(u8 *boot_img, u32 length) { … } /* The sum of all the WORDS of the image */ static u16 calc_fi_checksum(struct esas2r_flash_context *fc) { … } /* * Verify the flash image structure. The following verifications will * be performed: * 1) verify the fi_version is correct * 2) verify the checksum of the entire image. * 3) validate the adap_typ, action and length fields. * 4) validate each component header. check the img_type and * length fields * 5) validate each component image. validate signatures and * local checksums */ static bool verify_fi(struct esas2r_adapter *a, struct esas2r_flash_context *fc) { … } /* Fill in the FS IOCTL response data from a completed request. */ static void esas2r_complete_fs_ioctl(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* Prepare an FS IOCTL request to be sent to the firmware. */ bool esas2r_process_fs_ioctl(struct esas2r_adapter *a, struct esas2r_ioctl_fs *fs, struct esas2r_request *rq, struct esas2r_sg_context *sgc) { … } static bool esas2r_flash_access(struct esas2r_adapter *a, u32 function) { … } #define WINDOW_SIZE … bool esas2r_read_flash_block(struct esas2r_adapter *a, void *to, u32 from, u32 size) { … } bool esas2r_read_flash_rev(struct esas2r_adapter *a) { … } bool esas2r_print_flash_rev(struct esas2r_adapter *a) { … } /* * Find the type of boot image type that is currently in the flash. * The chip only has a 64 KB PCI-e expansion ROM * size so only one image can be flashed at a time. */ bool esas2r_read_image_type(struct esas2r_adapter *a) { … } /* * Read and validate current NVRAM parameters by accessing * physical NVRAM directly. if currently stored parameters are * invalid, use the defaults. */ bool esas2r_nvram_read_direct(struct esas2r_adapter *a) { … } /* Interrupt callback to process NVRAM completions. */ static void esas2r_nvram_callback(struct esas2r_adapter *a, struct esas2r_request *rq) { … } /* * Write the contents of nvram to the adapter's physical NVRAM. * The cached copy of the NVRAM is also updated. */ bool esas2r_nvram_write(struct esas2r_adapter *a, struct esas2r_request *rq, struct esas2r_sas_nvram *nvram) { … } /* Validate the cached NVRAM. if the NVRAM is invalid, load the defaults. */ bool esas2r_nvram_validate(struct esas2r_adapter *a) { … } /* * Set the cached NVRAM to defaults. note that this function sets the default * NVRAM when it has been determined that the physical NVRAM is invalid. * In this case, the SAS address is fabricated. */ void esas2r_nvram_set_defaults(struct esas2r_adapter *a) { … } void esas2r_nvram_get_defaults(struct esas2r_adapter *a, struct esas2r_sas_nvram *nvram) { … } bool esas2r_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi, struct esas2r_request *rq, struct esas2r_sg_context *sgc) { … }