| /* |
| * Copyright (C) 2017 Amlogic, Inc. All rights reserved. |
| * * |
| 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. |
| * * |
| 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., |
| * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| * * |
| Description: |
| */ |
| |
| #ifndef __RTLFW_H__ |
| #define __RTLFW_H__ |
| |
| #include <usb.h> |
| |
| #define ENODEV 19 /* No such device */ |
| #define HCI_CMD_READ_BD_ADDR 0x1009 |
| #define HCI_VENDOR_CHANGE_BDRATE 0xfc17 |
| #define HCI_VENDOR_READ_RTK_ROM_VERISION 0xfc6d |
| #define HCI_VENDOR_READ_LMP_VERISION 0x1001 |
| #define HCI_VENDOR_SET_WAKE_UP_DEVICE 0xfc7b |
| #define HCI_VENDOR_FORCE_RESET_AND_PATCHABLE 0xFC66 |
| /******************************* |
| ** Reasil patch code |
| ********************************/ |
| #define CMD_CMP_EVT 0x0e |
| #define PKT_LEN 300 |
| #define MSG_TO 1000 |
| #define PATCH_SEG_MAX 252 |
| #define DATA_END 0x80 |
| #define DOWNLOAD_OPCODE 0xfc20 |
| #define BTOFF_OPCODE 0xfc28 |
| #define TRUE 1 |
| #define FALSE 0 |
| #define CMD_HDR_LEN sizeof(struct hci_command_hdr) |
| #define EVT_HDR_LEN sizeof(struct hci_event_hdr) |
| #define CMD_CMP_LEN sizeof(struct hci_ev_cmd_complete) |
| #define RTK_PATCH_LENGTH_MAX 1024*24 |
| enum rtk_endpoit { |
| CTRL_EP = 0, |
| INTR_EP = 1, |
| BULK_EP = 2, |
| ISOC_EP = 3 |
| }; |
| |
| #define MAX_URBS_QUEUED 5 |
| struct hci_command_hdr { |
| __le16 opcode; /* OCF & OGF */ |
| unsigned char plen; |
| } __packed; |
| |
| struct hci_event_hdr { |
| unsigned char evt; |
| unsigned char plen; |
| } __packed; |
| #define HCI_EV_CMD_COMPLETE 0x0e |
| struct hci_ev_cmd_complete { |
| unsigned char ncmd; |
| __le16 opcode; |
| } __packed; |
| |
| struct rtk_eversion_evt { |
| unsigned char status; |
| unsigned char version; |
| } __attribute__ ((packed)); |
| |
| struct rtk_localversion_evt { |
| unsigned char status; |
| unsigned char hci_version; |
| unsigned int hci_revision; |
| unsigned char lmp_version; |
| unsigned int lmp_manufacture; |
| unsigned int lmp_subversion; |
| } __attribute__ ((packed)); |
| |
| struct rtk_epatch_entry { |
| unsigned short chip_id; |
| unsigned short patch_length; |
| unsigned int start_offset; |
| unsigned int coex_version; |
| unsigned int svn_version; |
| unsigned int fw_version; |
| } __attribute__ ((packed)); |
| |
| struct rtk_epatch { |
| unsigned char signature[8]; |
| unsigned int fw_version; |
| unsigned short number_of_total_patch; |
| struct rtk_epatch_entry entry[0]; |
| } __attribute__ ((packed)); |
| |
| struct rtk_extension_entry { |
| unsigned char opcode; |
| unsigned char length; |
| unsigned char *data; |
| } __attribute__ ((packed)); |
| |
| typedef struct { |
| unsigned short prod_id; |
| unsigned short lmp_sub_default; |
| unsigned short lmp_sub; |
| unsigned short eversion; |
| char *mp_patch_name; |
| char *patch_name; |
| char *config_name; |
| unsigned char *fw_cache; |
| int fw_len; |
| } patch_info; |
| |
| typedef struct { |
| unsigned char index; |
| unsigned char data[PATCH_SEG_MAX]; |
| } __attribute__((packed)) download_cp; |
| |
| typedef struct { |
| unsigned char status; |
| unsigned char index; |
| } __attribute__((packed)) download_rp; |
| |
| typedef struct { |
| struct usb_interface *intf; |
| struct usb_device *udev; |
| patch_info *patch_entry; |
| int pipe_in, pipe_out; |
| unsigned char *send_pkt; |
| unsigned char *rcv_pkt; |
| struct hci_command_hdr *cmd_hdr; |
| struct hci_event_hdr *evt_hdr; |
| struct hci_ev_cmd_complete *cmd_cmp; |
| unsigned char *req_para, *rsp_para; |
| unsigned char *fw_data; |
| int pkt_len; |
| int fw_len; |
| } firmware_info; |
| |
| extern void load_rtl_firmware(void); |
| extern struct usb_device * get_rtl_dev(void); |
| extern int load_rtl_firmware_dev(struct usb_device *dev); |
| #endif |