1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * NCI based driver for Samsung S3FWRN5 NFC chip 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2015 Samsung Electrnoics 6*4882a593Smuzhiyun * Robert Baldyga <r.baldyga@samsung.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __LOCAL_S3FWRN5_FIRMWARE_H_ 10*4882a593Smuzhiyun #define __LOCAL_S3FWRN5_FIRMWARE_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* FW Message Types */ 13*4882a593Smuzhiyun #define S3FWRN5_FW_MSG_CMD 0x00 14*4882a593Smuzhiyun #define S3FWRN5_FW_MSG_RSP 0x01 15*4882a593Smuzhiyun #define S3FWRN5_FW_MSG_DATA 0x02 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* FW Return Codes */ 18*4882a593Smuzhiyun #define S3FWRN5_FW_RET_SUCCESS 0x00 19*4882a593Smuzhiyun #define S3FWRN5_FW_RET_MESSAGE_TYPE_INVALID 0x01 20*4882a593Smuzhiyun #define S3FWRN5_FW_RET_COMMAND_INVALID 0x02 21*4882a593Smuzhiyun #define S3FWRN5_FW_RET_PAGE_DATA_OVERFLOW 0x03 22*4882a593Smuzhiyun #define S3FWRN5_FW_RET_SECT_DATA_OVERFLOW 0x04 23*4882a593Smuzhiyun #define S3FWRN5_FW_RET_AUTHENTICATION_FAIL 0x05 24*4882a593Smuzhiyun #define S3FWRN5_FW_RET_FLASH_OPERATION_FAIL 0x06 25*4882a593Smuzhiyun #define S3FWRN5_FW_RET_ADDRESS_OUT_OF_RANGE 0x07 26*4882a593Smuzhiyun #define S3FWRN5_FW_RET_PARAMETER_INVALID 0x08 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* ---- FW Packet structures ---- */ 29*4882a593Smuzhiyun #define S3FWRN5_FW_HDR_SIZE 4 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct s3fwrn5_fw_header { 32*4882a593Smuzhiyun __u8 type; 33*4882a593Smuzhiyun __u8 code; 34*4882a593Smuzhiyun __u16 len; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define S3FWRN5_FW_CMD_RESET 0x00 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define S3FWRN5_FW_CMD_GET_BOOTINFO 0x01 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct s3fwrn5_fw_cmd_get_bootinfo_rsp { 42*4882a593Smuzhiyun __u8 hw_version[4]; 43*4882a593Smuzhiyun __u16 sector_size; 44*4882a593Smuzhiyun __u16 page_size; 45*4882a593Smuzhiyun __u16 frame_max_size; 46*4882a593Smuzhiyun __u16 hw_buffer_size; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define S3FWRN5_FW_CMD_ENTER_UPDATE_MODE 0x02 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct s3fwrn5_fw_cmd_enter_updatemode { 52*4882a593Smuzhiyun __u16 hashcode_size; 53*4882a593Smuzhiyun __u16 signature_size; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define S3FWRN5_FW_CMD_UPDATE_SECTOR 0x04 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct s3fwrn5_fw_cmd_update_sector { 59*4882a593Smuzhiyun __u32 base_address; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define S3FWRN5_FW_CMD_COMPLETE_UPDATE_MODE 0x05 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct s3fwrn5_fw_image { 65*4882a593Smuzhiyun const struct firmware *fw; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun char date[13]; 68*4882a593Smuzhiyun u32 version; 69*4882a593Smuzhiyun const void *sig; 70*4882a593Smuzhiyun u32 sig_size; 71*4882a593Smuzhiyun const void *image; 72*4882a593Smuzhiyun u32 image_sectors; 73*4882a593Smuzhiyun const void *custom_sig; 74*4882a593Smuzhiyun u32 custom_sig_size; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct s3fwrn5_fw_info { 78*4882a593Smuzhiyun struct nci_dev *ndev; 79*4882a593Smuzhiyun struct s3fwrn5_fw_image fw; 80*4882a593Smuzhiyun char fw_name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun const void *sig; 83*4882a593Smuzhiyun u32 sig_size; 84*4882a593Smuzhiyun u32 sector_size; 85*4882a593Smuzhiyun u32 base_addr; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct completion completion; 88*4882a593Smuzhiyun struct sk_buff *rsp; 89*4882a593Smuzhiyun char parity; 90*4882a593Smuzhiyun }; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun void s3fwrn5_fw_init(struct s3fwrn5_fw_info *fw_info, const char *fw_name); 93*4882a593Smuzhiyun int s3fwrn5_fw_setup(struct s3fwrn5_fw_info *fw_info); 94*4882a593Smuzhiyun bool s3fwrn5_fw_check_version(const struct s3fwrn5_fw_info *fw_info, u32 version); 95*4882a593Smuzhiyun int s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info); 96*4882a593Smuzhiyun void s3fwrn5_fw_cleanup(struct s3fwrn5_fw_info *fw_info); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun int s3fwrn5_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #endif /* __LOCAL_S3FWRN5_FIRMWARE_H_ */ 101