1 /* 2 * Copyright 2022, Cypress Semiconductor Corporation (an Infineon company) 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef INCLUDED_WHD_CDC_BDC_H 19 #define INCLUDED_WHD_CDC_BDC_H 20 21 #include "whd.h" 22 #include "cyabs_rtos.h" 23 #include "whd_events_int.h" 24 #include "whd_types_int.h" 25 26 #ifdef __cplusplus 27 extern "C" 28 { 29 #endif 30 31 /****************************************************** 32 * Constants 33 ******************************************************/ 34 35 /* CDC flag definition taken from bcmcdc.h */ 36 #define CDCF_IOC_SET (0x02) /** 0=get, 1=set cmd */ 37 #define WHD_EVENT_HANDLER_LIST_SIZE (5) /** Maximum number of simultaneously registered event handlers */ 38 #define WHD_SDALIGN 32 39 40 /* CDC flag definitions taken from bcmcdc.h */ 41 #define CDCF_IOC_ERROR (0x01) /** 0=success, 1=ioctl cmd failed */ 42 #define CDCF_IOC_IF_MASK (0xF000) /** I/F index */ 43 #define CDCF_IOC_IF_SHIFT (12) /** # of bits of shift for I/F Mask */ 44 #define CDCF_IOC_ID_MASK (0xFFFF0000) /** used to uniquely id an ioctl req/resp pairing */ 45 #define CDCF_IOC_ID_SHIFT (16) /** # of bits of shift for ID Mask */ 46 47 #define DATA_AFTER_HEADER(x) ( (void *)(&x[1]) ) 48 49 #define BDC_HEADER_LEN (4) 50 51 /****************************************************** 52 * Enumerations 53 ******************************************************/ 54 55 typedef enum sdpcm_command_type_enum 56 { 57 CDC_GET = 0x00, 58 CDC_SET = CDCF_IOC_SET 59 } cdc_command_type_t; 60 61 /****************************************************** 62 * Structures 63 ******************************************************/ 64 #pragma pack(1) 65 typedef struct 66 { 67 uint32_t cmd; /* ioctl command value */ 68 uint32_t len; /* lower 16: output buflen; upper 16: input buflen (excludes header) */ 69 uint32_t flags; /* flag defns given in bcmcdc.h */ 70 uint32_t status; /* status code returned from the device */ 71 } cdc_header_t; 72 73 typedef struct 74 { 75 uint8_t flags; /* Flags */ 76 uint8_t priority; /* 802.1d Priority (low 3 bits) */ 77 uint8_t flags2; 78 uint8_t data_offset; /* Offset from end of BDC header to packet data, in 4-uint8_t words. 79 * Leaves room for optional headers.*/ 80 } bdc_header_t; 81 82 typedef struct 83 { 84 whd_mac_t destination_address; 85 whd_mac_t source_address; 86 uint16_t ethertype; 87 } ethernet_header_t; 88 89 #pragma pack() 90 91 /** Event list element structure 92 * 93 * events : A pointer to a whd_event_num_t array that is terminated with a WLC_E_NONE event 94 * handler: A pointer to the whd_event_handler_t function that will receive the event 95 * handler_user_data : User provided data that will be passed to the handler when a matching event occurs 96 */ 97 typedef struct 98 { 99 whd_bool_t event_set; 100 whd_event_num_t events[WHD_MAX_EVENT_SUBSCRIPTION]; 101 whd_event_handler_t handler; 102 void *handler_user_data; 103 uint8_t ifidx; 104 } event_list_elem_t; 105 106 /** @endcond */ 107 108 typedef struct whd_cdc_info 109 { 110 /* Event list variables */ 111 event_list_elem_t whd_event_list[WHD_EVENT_HANDLER_LIST_SIZE]; 112 cy_semaphore_t event_list_mutex; 113 114 /* IOCTL variables*/ 115 uint16_t requested_ioctl_id; 116 cy_semaphore_t ioctl_mutex; 117 whd_buffer_t ioctl_response; 118 cy_semaphore_t ioctl_sleep; 119 120 } whd_cdc_bdc_info_t; 121 /** Error list element structure 122 * 123 * events : set event of error type 124 * handler: A pointer to the whd_error_handler_t function that will receive the event 125 * handler_user_data : User provided data that will be passed to the handler when a matching event occurs 126 */ 127 typedef struct 128 { 129 whd_error_handler_t handler; 130 void *handler_user_data; 131 whd_bool_t event_set; 132 uint8_t events; 133 } error_list_elem_t; 134 135 /** @endcond */ 136 137 typedef struct whd_error_info 138 { 139 /* Event list variables */ 140 error_list_elem_t whd_event_list[WHD_EVENT_HANDLER_LIST_SIZE]; 141 cy_semaphore_t event_list_mutex; 142 } whd_error_info_t; 143 144 /****************************************************** 145 * Function Declarations 146 ******************************************************/ 147 148 whd_result_t whd_cdc_bdc_info_init(whd_driver_t whd_driver); 149 void whd_cdc_bdc_info_deinit(whd_driver_t whd_driver); 150 151 whd_result_t whd_cdc_send_iovar(whd_interface_t ifp, cdc_command_type_t type, 152 whd_buffer_t send_buffer_hnd, 153 whd_buffer_t *response_buffer_hnd); 154 155 whd_result_t whd_cdc_send_ioctl(whd_interface_t ifp, cdc_command_type_t type, uint32_t command, 156 whd_buffer_t send_buffer_hnd, 157 whd_buffer_t *response_buffer_hnd); 158 159 void *whd_cdc_get_iovar_buffer(whd_driver_t whd_driver, 160 whd_buffer_t *buffer, 161 uint16_t data_length, 162 const char *name); 163 whd_result_t whd_network_send_ethernet_data(whd_interface_t ifp, whd_buffer_t buffer); 164 165 void *whd_cdc_get_ioctl_buffer(whd_driver_t whd_driver, 166 whd_buffer_t *buffer, 167 uint16_t data_length); 168 169 void whd_process_cdc(whd_driver_t whd_driver, whd_buffer_t buffer); 170 171 void whd_process_bdc(whd_driver_t whd_driver, whd_buffer_t buffer); 172 173 void whd_process_bdc_event(whd_driver_t whd_driver, whd_buffer_t buffer, uint16_t size); 174 175 #ifdef __cplusplus 176 } /* extern "C" */ 177 #endif 178 179 #endif /* ifndef INCLUDED_WHD_CDC_BDC_H */ 180