Changeset 56c0930 in mainline for uspace/drv/bus/usb/ar9271/ar9271.c
- Timestamp:
- 2015-02-20T14:33:29Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4cb0148
- Parents:
- ab365c4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ar9271/ar9271.c
rab365c4 r56c0930 101 101 /* IEEE802.11 callbacks */ 102 102 static int ar9271_ieee80211_start(ieee80211_dev_t *ieee80211_dev); 103 static int ar9271_ieee80211_tx_handler(ieee80211_dev_t *ieee80211_dev, 104 void *buffer, size_t buffer_size); 103 105 104 106 static driver_ops_t ar9271_driver_ops = { … … 112 114 113 115 static ieee80211_ops_t ar9271_ieee80211_ops = { 114 .start = ar9271_ieee80211_start 115 }; 116 117 static int ar9271_set_rx_filter(ar9271_t *ar9271) 118 { 119 uint32_t filter_bits; 120 int rc = wmi_reg_read(ar9271->htc_device, AR9271_RX_FILTER, 121 &filter_bits); 122 if(rc != EOK) { 123 usb_log_error("Failed to read RX filter.\n"); 124 return EINVAL; 125 } 126 127 /* TODO: Do proper filtering here. */ 128 129 filter_bits |= AR9271_RX_FILTER_UNI | AR9271_RX_FILTER_MULTI | 130 AR9271_RX_FILTER_BROAD | AR9271_RX_FILTER_PROMISCUOUS; 131 132 rc = wmi_reg_write(ar9271->htc_device, AR9271_RX_FILTER, filter_bits); 133 if(rc != EOK) { 134 usb_log_error("Failed to write RX filter.\n"); 135 return EINVAL; 136 } 137 138 return EOK; 139 } 140 141 static int ar9271_rx_init(ar9271_t *ar9271) 142 { 143 int rc = wmi_reg_write(ar9271->htc_device, AR9271_COMMAND, 144 AR9271_COMMAND_RX_ENABLE); 145 if(rc != EOK) { 146 usb_log_error("Failed to send RX enable command.\n"); 147 return EINVAL; 148 } 149 150 rc = ar9271_set_rx_filter(ar9271); 151 if(rc != EOK) { 152 usb_log_error("Failed to set RX filtering.\n"); 153 return EINVAL; 154 } 116 .start = ar9271_ieee80211_start, 117 .tx_handler = ar9271_ieee80211_tx_handler 118 }; 119 120 static int ar9271_ieee80211_tx_handler(ieee80211_dev_t *ieee80211_dev, 121 void *buffer, size_t buffer_size) 122 { 123 /* TODO: Process TX message properly */ 124 125 size_t complete_size, offset; 126 void *complete_buffer; 127 int endpoint; 128 129 ar9271_t *ar9271 = (ar9271_t *) ieee80211_dev->driver_data; 130 131 ieee80211_header_t *ieee80211_header = (ieee80211_header_t *) buffer; 132 133 if(ieee80211_is_data_frame(ieee80211_header)) { 134 offset = sizeof(htc_frame_header_t); 135 complete_size = buffer_size + offset; 136 complete_buffer = malloc(complete_size); 137 endpoint = ar9271->htc_device->endpoints.data_be_endpoint; 138 } else { 139 offset = sizeof(htc_tx_management_header_t) + 140 sizeof(htc_frame_header_t); 141 complete_size = buffer_size + offset; 142 complete_buffer = malloc(complete_size); 143 endpoint = ar9271->htc_device->endpoints.mgmt_endpoint; 144 } 145 146 /* Copy IEEE802.11 data to new allocated buffer with HTC headers. */ 147 memcpy(complete_buffer + offset, buffer, buffer_size); 148 149 htc_send_data_message(ar9271->htc_device, complete_buffer, 150 complete_size, endpoint); 151 152 free(complete_buffer); 153 154 return EOK; 155 } 156 157 static int ar9271_data_polling(void *arg) 158 { 159 ar9271_t *ar9271 = (ar9271_t *) arg; 160 size_t buffer_size = ar9271->ath_device->data_response_length; 161 void *buffer = malloc(buffer_size); 162 163 while(true) { 164 int rc = 165 htc_read_data_message(ar9271->htc_device, buffer, buffer_size, 166 NULL); 167 usb_log_info("RC is %d.\n", rc); 168 169 /* TODO: Process RX message */ 170 } 171 172 return EOK; 173 } 174 175 static int ar9271_diag_polling(void *arg) 176 { 177 ar9271_t *ar9271 = (ar9271_t *) arg; 178 179 while(true) { 180 uint32_t result; 181 wmi_reg_read(ar9271->htc_device, 0x80F0, &result); 182 usb_log_info("RX count: %x\n", result); 183 wmi_reg_read(ar9271->htc_device, 0x8098, &result); 184 usb_log_info("Beacon count: %x\n", result); 185 sleep(1); 186 } 187 188 return EOK; 189 } 190 191 static int ar9271_register_polling_fibrils(ar9271_t *ar9271) 192 { 193 /* Add data polling fibril. */ 194 fid_t fibril = fibril_create(ar9271_data_polling, ar9271); 195 if (fibril == 0) { 196 return ENOMEM; 197 } 198 fibril_add_ready(fibril); 199 200 /* Add debug polling fibril. */ 201 fibril = fibril_create(ar9271_diag_polling, ar9271); 202 if (fibril == 0) { 203 return ENOMEM; 204 } 205 fibril_add_ready(fibril); 155 206 156 207 return EOK; … … 165 216 if(rc != EOK) { 166 217 usb_log_error("Failed to flush receiving buffer.\n"); 167 return EINVAL;218 return rc; 168 219 } 169 220 … … 171 222 if(rc != EOK) { 172 223 usb_log_error("Failed to do HW reset.\n"); 173 return EINVAL;224 return rc; 174 225 } 175 226 … … 179 230 if(rc != EOK) { 180 231 usb_log_error("Failed to set HTC mode.\n"); 181 return EINVAL;232 return rc; 182 233 } 183 234 … … 186 237 if(rc != EOK) { 187 238 usb_log_error("Failed to send ath init command.\n"); 188 return EINVAL;239 return rc; 189 240 } 190 241 … … 193 244 if(rc != EOK) { 194 245 usb_log_error("Failed to send receiving init command.\n"); 195 return EINVAL;196 } 197 198 rc = ar9271_rx_init(ar9271);246 return rc; 247 } 248 249 rc = hw_rx_init(ar9271); 199 250 if(rc != EOK) { 200 251 usb_log_error("Failed to initialize RX.\n"); 201 return EINVAL; 252 return rc; 253 } 254 255 rc = htc_init_new_vif(ar9271->htc_device); 256 if(rc != EOK) { 257 usb_log_error("Failed to initialize new VIF.\n"); 258 return rc; 259 } 260 261 rc = ar9271_register_polling_fibrils(ar9271); 262 if(rc != EOK) { 263 usb_log_error("Failed to register polling fibrils.\n"); 264 return rc; 202 265 } 203 266 … … 220 283 free(ar9271->ath_device); 221 284 usb_log_error("Failed to initialize ath device.\n"); 222 return EINVAL; 285 return rc; 286 } 287 288 /* IEEE 802.11 framework structure initialization. */ 289 ar9271->ieee80211_dev = calloc(1, sizeof(ieee80211_dev_t)); 290 if (!ar9271->ieee80211_dev) { 291 free(ar9271->ath_device); 292 usb_log_error("Failed to allocate memory for IEEE80211 device " 293 "structure.\n"); 294 return ENOMEM; 295 } 296 297 rc = ieee80211_device_init(ar9271->ieee80211_dev, ar9271, 298 ar9271->ddf_dev); 299 if(rc != EOK) { 300 free(ar9271->ieee80211_dev); 301 free(ar9271->ath_device); 302 usb_log_error("Failed to initialize IEEE80211 device structure." 303 "\n"); 304 return rc; 223 305 } 224 306 … … 226 308 ar9271->htc_device = calloc(1, sizeof(htc_device_t)); 227 309 if(!ar9271->htc_device) { 310 free(ar9271->ieee80211_dev); 228 311 free(ar9271->ath_device); 229 312 usb_log_error("Failed to allocate memory for HTC device " … … 232 315 } 233 316 234 rc = htc_device_init(ar9271->ath_device, ar9271->htc_device); 317 rc = htc_device_init(ar9271->ath_device, ar9271->ieee80211_dev, 318 ar9271->htc_device); 235 319 if(rc != EOK) { 236 320 free(ar9271->htc_device); 321 free(ar9271->ieee80211_dev); 237 322 free(ar9271->ath_device); 238 323 usb_log_error("Failed to initialize HTC device structure.\n"); 239 return EINVAL; 240 } 241 242 /* IEEE 802.11 framework structure initialization. */ 243 ar9271->ieee80211_dev = calloc(1, sizeof(ieee80211_dev_t)); 244 if (!ar9271->ieee80211_dev) { 245 free(ar9271->htc_device); 246 free(ar9271->ath_device); 247 usb_log_error("Failed to allocate memory for IEEE80211 device " 248 "structure.\n"); 249 return ENOMEM; 250 } 251 252 rc = ieee80211_device_init(ar9271->ieee80211_dev, ar9271, 253 ar9271->ddf_dev); 254 if(rc != EOK) { 255 free(ar9271->ieee80211_dev); 256 free(ar9271->htc_device); 257 free(ar9271->ath_device); 258 usb_log_error("Failed to initialize IEEE80211 device structure." 259 "\n"); 260 return EINVAL; 324 return rc; 261 325 } 262 326
Note:
See TracChangeset
for help on using the changeset viewer.