Changeset 01784d2 in mainline for uspace/drv/bus/usb/ar9271/wmi.c
- Timestamp:
- 2015-01-28T18:19:30Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 462054a
- Parents:
- ef521d4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ar9271/wmi.c
ref521d4 r01784d2 52 52 int wmi_reg_read(htc_device_t *htc_device, uint32_t reg_offset, uint32_t *res) 53 53 { 54 uint32_t resp_value;55 54 uint32_t cmd_value = host2uint32_t_be(reg_offset); 56 55 56 size_t buffer_size = MAX_RESPONSE_LENGTH; 57 void *resp_buffer = malloc(buffer_size); 58 57 59 int rc = wmi_send_command(htc_device, WMI_REG_READ, 58 (uint8_t *) &cmd_value, sizeof(cmd_value), 59 (uint8_t *) &resp_value, sizeof(resp_value)); 60 (uint8_t *) &cmd_value, sizeof(cmd_value), resp_buffer); 60 61 61 62 if(rc != EOK) { … … 64 65 } 65 66 66 *res = uint32_t_be2host(resp_value); 67 uint32_t *resp_value = (uint32_t *) ((void*) resp_buffer + 68 sizeof(htc_frame_header_t) + 69 sizeof(wmi_command_header_t)); 70 71 *res = uint32_t_be2host(*resp_value); 67 72 68 73 return rc; … … 80 85 int wmi_reg_write(htc_device_t *htc_device, uint32_t reg_offset, uint32_t val) 81 86 { 82 uint32_t resp_value = host2uint32_t_be(val);83 87 uint32_t cmd_buffer[] = { 84 88 host2uint32_t_be(reg_offset), 85 resp_value89 host2uint32_t_be(val) 86 90 }; 87 91 92 void *resp_buffer = malloc(MAX_RESPONSE_LENGTH); 93 88 94 int rc = wmi_send_command(htc_device, WMI_REG_WRITE, 89 (uint8_t *) &cmd_buffer, sizeof(cmd_buffer), 90 (uint8_t *) &resp_value, sizeof(resp_value)); 95 (uint8_t *) &cmd_buffer, sizeof(cmd_buffer), resp_buffer); 96 97 free(resp_buffer); 91 98 92 99 if(rc != EOK) { … … 96 103 97 104 return rc; 105 } 106 107 /** 108 * WMI registry set or clear specified bits. 109 * 110 * @param htc_device HTC device structure. 111 * @param reg_offset Registry offset (address) to be written. 112 * @param set_bit Bit to be set. 113 * @param clear_bit Bit to be cleared. 114 * 115 * @return EOK if succeed, negative error code otherwise. 116 */ 117 int wmi_reg_rmw(htc_device_t *htc_device, uint32_t reg_offset, 118 uint32_t set_bit, uint32_t clear_bit) 119 { 120 uint32_t value; 121 122 int rc = wmi_reg_read(htc_device, reg_offset, &value); 123 if(rc != EOK) { 124 usb_log_error("Failed to read registry value in RMW " 125 "function.\n"); 126 return rc; 127 } 128 129 value |= set_bit; 130 value &= ~clear_bit; 131 132 rc = wmi_reg_write(htc_device, reg_offset, value); 133 if(rc != EOK) { 134 usb_log_error("Failed to write registry value in RMW " 135 "function.\n"); 136 return rc; 137 } 138 139 return rc; 140 } 141 142 /** 143 * WMI registry set specified bit. 144 * 145 * @param htc_device HTC device structure. 146 * @param reg_offset Registry offset (address) to be written. 147 * @param set_bit Bit to be set. 148 * 149 * @return EOK if succeed, negative error code otherwise. 150 */ 151 int wmi_reg_set_bit(htc_device_t *htc_device, uint32_t reg_offset, 152 uint32_t set_bit) 153 { 154 return wmi_reg_rmw(htc_device, reg_offset, set_bit, 0); 155 } 156 157 /** 158 * WMI registry clear specified bit. 159 * 160 * @param htc_device HTC device structure. 161 * @param reg_offset Registry offset (address) to be written. 162 * @param clear_bit Bit to be cleared. 163 * 164 * @return EOK if succeed, negative error code otherwise. 165 */ 166 int wmi_reg_clear_bit(htc_device_t *htc_device, uint32_t reg_offset, 167 uint32_t clear_bit) 168 { 169 return wmi_reg_rmw(htc_device, reg_offset, 0, clear_bit); 98 170 } 99 171 … … 107 179 * @return EOK if succeed, negative error code otherwise. 108 180 */ 109 int wmi_reg_buffer_write(htc_device_t *htc_device, reg_buffer_t *reg_buffer,181 int wmi_reg_buffer_write(htc_device_t *htc_device, wmi_reg_t *reg_buffer, 110 182 size_t elements) 111 183 { 112 uint32_t resp_value; 184 size_t buffer_size = sizeof(wmi_reg_t) * elements; 185 void *buffer = malloc(buffer_size); 186 void *resp_buffer = malloc(MAX_RESPONSE_LENGTH); 113 187 114 188 /* Convert values to correct endianness. */ 115 189 for(size_t i = 0; i < elements; i++) { 116 reg_buffer_t *buffer_element = ®_buffer[i]; 117 buffer_element->offset = 190 wmi_reg_t *buffer_element = ®_buffer[i]; 191 wmi_reg_t *buffer_it = (wmi_reg_t *) 192 ((void *) buffer + i*sizeof(wmi_reg_t)); 193 buffer_it->offset = 118 194 host2uint32_t_be(buffer_element->offset); 119 buffer_ element->value =195 buffer_it->value = 120 196 host2uint32_t_be(buffer_element->value); 121 197 } 122 198 123 199 int rc = wmi_send_command(htc_device, WMI_REG_WRITE, 124 (uint8_t *) ®_buffer, sizeof(reg_buffer_t)*elements, 125 (uint8_t *) &resp_value, sizeof(resp_value)); 200 (uint8_t *) buffer, buffer_size, resp_buffer); 201 202 free(buffer); 203 free(resp_buffer); 126 204 127 205 if(rc != EOK) { … … 141 219 * @param command_length Length of command data. 142 220 * @param response_buffer Buffer with response data. 143 * @param response_length Length of response data.144 221 * 145 222 * @return EOK if succeed, negative error code otherwise. 146 223 */ 147 224 int wmi_send_command(htc_device_t *htc_device, wmi_command_t command_id, 148 uint8_t *command_buffer, uint32_t command_length, 149 uint8_t *response_buffer, uint32_t response_length) 225 uint8_t *command_buffer, uint32_t command_length, void *response_buffer) 150 226 { 151 227 size_t header_size = sizeof(wmi_command_header_t) + … … 174 250 free(buffer); 175 251 176 buffer_size = header_size + response_length;177 buffer = malloc(buffer_size);178 179 252 /* Read response. */ 180 rc = htc_read_message(htc_device, buffer, buffer_size, NULL); 253 rc = htc_read_message(htc_device, response_buffer, MAX_RESPONSE_LENGTH, 254 NULL); 181 255 if(rc != EOK) { 182 256 free(buffer); … … 186 260 } 187 261 188 memcpy(response_buffer, 189 buffer + sizeof(wmi_command_header_t), 190 response_length); 191 192 free(buffer); 193 194 return rc; 195 } 262 return rc; 263 }
Note:
See TracChangeset
for help on using the changeset viewer.