Changeset 01784d2 in mainline
- Timestamp:
- 2015-01-28T18:19:30Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 462054a
- Parents:
- ef521d4
- Location:
- uspace/drv/bus/usb/ar9271
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ar9271/ar9271.h
ref521d4 r01784d2 47 47 48 48 /* Wakeup related registers */ 49 AR9271_RTC_RC = 0x7000, 50 AR9271_RTC_RC_MASK = 0x00000003, 49 51 AR9271_RTC_RESET = 0x7040, 50 52 AR9271_RTC_STATUS = 0x7044, -
uspace/drv/bus/usb/ar9271/htc.c
ref521d4 r01784d2 39 39 #include "htc.h" 40 40 41 #define MAX_RESP_LEN 6442 43 41 /** 44 42 * HTC download pipes mapping. … … 82 80 htc_header->endpoint_id = endpoint_id; 83 81 htc_header->flags = 0; 84 htc_header->payload_length = host2uint16_t_be(buffer_size); 82 htc_header->payload_length = 83 host2uint16_t_be(buffer_size - sizeof(htc_frame_header_t)); 84 85 htc_header->control_bytes[0] = 0x02; 86 htc_header->control_bytes[1] = 0x88; 87 htc_header->control_bytes[2] = 0xFF; 88 htc_header->control_bytes[3] = 0xFF; 85 89 86 90 ath_t *ath_device = htc_device->ath_device; … … 150 154 free(buffer); 151 155 152 buffer_size = MAX_RESP _LEN;156 buffer_size = MAX_RESPONSE_LENGTH; 153 157 buffer = malloc(buffer_size); 154 158 … … 214 218 free(buffer); 215 219 216 buffer_size = MAX_RESP _LEN;220 buffer_size = MAX_RESPONSE_LENGTH; 217 221 buffer = malloc(buffer_size); 218 222 … … 272 276 static int htc_check_ready(htc_device_t *htc_device) 273 277 { 274 size_t buffer_size = MAX_RESP _LEN;278 size_t buffer_size = MAX_RESPONSE_LENGTH; 275 279 void *buffer = malloc(buffer_size); 276 280 -
uspace/drv/bus/usb/ar9271/htc.h
ref521d4 r01784d2 42 42 43 43 #include "ath.h" 44 45 #define MAX_RESPONSE_LENGTH 64 44 46 45 47 /** -
uspace/drv/bus/usb/ar9271/hw.c
ref521d4 r01784d2 64 64 continue; 65 65 } 66 66 67 67 if((result & mask) == value) { 68 68 return EOK; … … 73 73 } 74 74 75 /** 76 * Hardware reset of AR9271 device. 77 *78 * @param ar9271 Device structure. 79 * 80 * @return EOK if succeed, negative error code otherwise. 81 */ 82 int hw_reset(ar9271_t *ar9271) 83 { 84 reg_buffer_t buffer[] = {75 static int hw_reset_power_on(ar9271_t *ar9271) 76 { 77 int rc = wmi_reg_write(ar9271->htc_device, AR9271_RTC_FORCE_WAKE, 78 AR9271_RTC_FORCE_WAKE_ENABLE | AR9271_RTC_FORCE_WAKE_ON_INT); 79 if(rc != EOK) { 80 usb_log_error("Failed to bring up RTC register.\n"); 81 return rc; 82 } 83 84 wmi_reg_t buffer[] = { 85 85 { 86 86 .offset = AR9271_RTC_FORCE_WAKE, … … 98 98 }; 99 99 100 intrc = wmi_reg_buffer_write(ar9271->htc_device, buffer,101 sizeof(buffer) / sizeof( reg_buffer_t));100 rc = wmi_reg_buffer_write(ar9271->htc_device, buffer, 101 sizeof(buffer) / sizeof(wmi_reg_t)); 102 102 if(rc != EOK) { 103 103 usb_log_error("Failed to set RT FORCE WAKE register.\n"); … … 128 128 } 129 129 130 /* TODO: Finish HW init. */ 130 return EOK; 131 } 132 133 static int hw_warm_reset(ar9271_t *ar9271) 134 { 135 wmi_reg_t buffer[] = { 136 { 137 .offset = AR9271_RTC_FORCE_WAKE, 138 .value = AR9271_RTC_FORCE_WAKE_ENABLE | 139 AR9271_RTC_FORCE_WAKE_ON_INT 140 }, 141 { 142 .offset = AR9271_RC, 143 .value = AR9271_RC_AHB 144 }, 145 { 146 .offset = AR9271_RTC_RC, 147 .value = 1 148 } 149 }; 150 151 int rc = wmi_reg_buffer_write(ar9271->htc_device, buffer, 152 sizeof(buffer) / sizeof(wmi_reg_t)); 153 if(rc != EOK) { 154 usb_log_error("Failed to set warm reset register.\n"); 155 return rc; 156 } 157 158 udelay(100); 159 160 rc = wmi_reg_write(ar9271->htc_device, AR9271_RTC_RC, 0); 161 if(rc != EOK) { 162 usb_log_error("Failed to reset RTC RC register.\n"); 163 return rc; 164 } 165 166 rc = hw_read_wait(ar9271, AR9271_RTC_RC, AR9271_RTC_RC_MASK, 0); 167 if(rc != EOK) { 168 usb_log_error("Failed to read RTC RC register.\n"); 169 return rc; 170 } 171 172 rc = wmi_reg_write(ar9271->htc_device, AR9271_RC, 0); 173 if(rc != EOK) { 174 usb_log_error("Failed to reset MAC AHB register.\n"); 175 return rc; 176 } 177 178 return EOK; 179 } 180 181 /** 182 * Hardware reset of AR9271 device. 183 * 184 * @param ar9271 Device structure. 185 * 186 * @return EOK if succeed, negative error code otherwise. 187 */ 188 int hw_reset(ar9271_t *ar9271) 189 { 190 int rc = hw_reset_power_on(ar9271); 191 if(rc != EOK) { 192 usb_log_error("Failed to HW reset power on.\n"); 193 return rc; 194 } 195 196 rc = hw_warm_reset(ar9271); 197 if(rc != EOK) { 198 usb_log_error("Failed to HW warm reset.\n"); 199 return rc; 200 } 201 202 /* TODO: Finish HW init (EEPROM init, MAC ADDR init). */ 131 203 132 204 return EOK; -
uspace/drv/bus/usb/ar9271/hw.h
ref521d4 r01784d2 38 38 #include "ar9271.h" 39 39 40 #define HW_WAIT_LOOPS 100 0040 #define HW_WAIT_LOOPS 100 41 41 #define HW_WAIT_TIME_US 10 42 42 -
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 } -
uspace/drv/bus/usb/ar9271/wmi.h
ref521d4 r01784d2 106 106 } wmi_command_t; 107 107 108 /** 109 * Structure used when sending registry buffer 110 */ 108 111 typedef struct { 109 112 uint32_t offset; /**< Big Endian value! */ 110 113 uint32_t value; /**< Big Endian value! */ 111 } reg_buffer_t;114 } wmi_reg_t; 112 115 113 116 extern int wmi_reg_read(htc_device_t *htc_device, uint32_t reg_offset, … … 115 118 extern int wmi_reg_write(htc_device_t *htc_device, uint32_t reg_offset, 116 119 uint32_t val); 120 extern int wmi_reg_rmw(htc_device_t *htc_device, uint32_t reg_offset, 121 uint32_t set_bit, uint32_t clear_bit); 122 extern int wmi_reg_set_bit(htc_device_t *htc_device, uint32_t reg_offset, 123 uint32_t set_bit); 124 extern int wmi_reg_clear_bit(htc_device_t *htc_device, uint32_t reg_offset, 125 uint32_t clear_bit); 117 126 extern int wmi_reg_buffer_write(htc_device_t *htc_device, 118 reg_buffer_t *reg_buffer, size_t elements);127 wmi_reg_t *reg_buffer, size_t elements); 119 128 extern int wmi_send_command(htc_device_t *htc_device, 120 129 wmi_command_t command_id, 121 130 uint8_t *command_buffer, uint32_t command_length, 122 uint8_t *response_buffer, uint32_t response_length);131 void *response_buffer); 123 132 124 133 #endif /* ATHEROS_WMI_H */
Note:
See TracChangeset
for help on using the changeset viewer.