Changeset 7e1b130 in mainline for uspace/drv/bus/usb/uhci
- Timestamp:
- 2011-12-23T18:13:33Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3819ce5, b39eb79, f0b74b2
- Parents:
- 2f0dd2a (diff), 153cc76a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv/bus/usb/uhci
- Files:
-
- 6 edited
-
hc.c (modified) (1 diff)
-
pci.c (modified) (3 diffs)
-
transfer_list.c (modified) (1 diff)
-
uhci.c (modified) (3 diffs)
-
uhci_batch.c (modified) (7 diffs)
-
uhci_batch.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/hc.c
r2f0dd2a r7e1b130 130 130 uhci_transfer_batch_t *batch = 131 131 uhci_transfer_batch_from_link(item); 132 uhci_transfer_batch_ call_dispose(batch);132 uhci_transfer_batch_finish_dispose(batch); 133 133 } 134 134 } -
uspace/drv/bus/usb/uhci/pci.c
r2f0dd2a r7e1b130 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 28 /** 30 29 * @addtogroup drvusbuhcihc … … 39 38 #include <assert.h> 40 39 #include <devman.h> 41 #include <device/hw_res .h>40 #include <device/hw_res_parsed.h> 42 41 43 42 #include <usb/debug.h> … … 68 67 return ENOMEM; 69 68 70 hw_resource_list_t hw_resources; 71 const int rc = hw_res_get_resource_list(parent_sess, &hw_resources); 69 hw_res_list_parsed_t hw_res; 70 hw_res_list_parsed_init(&hw_res); 71 const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0); 72 72 async_hangup(parent_sess); 73 if (r c!= EOK) {74 return r c;73 if (ret != EOK) { 74 return ret; 75 75 } 76 76 77 uintptr_t io_address = 0; 78 size_t io_size = 0; 79 bool io_found = false; 77 /* We want one irq and one io range. */ 78 if (hw_res.irqs.count != 1 || hw_res.io_ranges.count != 1) { 79 hw_res_list_parsed_clean(&hw_res); 80 return EINVAL; 81 } 80 82 81 int irq = 0; 82 bool irq_found = false; 83 if (io_reg_address) 84 *io_reg_address = hw_res.io_ranges.ranges[0].address; 85 if (io_reg_size) 86 *io_reg_size = hw_res.io_ranges.ranges[0].size; 87 if (irq_no) 88 *irq_no = hw_res.irqs.irqs[0]; 83 89 84 for (size_t i = 0; i < hw_resources.count; i++) { 85 const hw_resource_t *res = &hw_resources.resources[i]; 86 switch (res->type) { 87 case INTERRUPT: 88 irq = res->res.interrupt.irq; 89 irq_found = true; 90 usb_log_debug2("Found interrupt: %d.\n", irq); 91 break; 92 case IO_RANGE: 93 io_address = res->res.io_range.address; 94 io_size = res->res.io_range.size; 95 usb_log_debug2("Found io: %" PRIx64" %zu.\n", 96 res->res.io_range.address, res->res.io_range.size); 97 io_found = true; 98 break; 99 default: 100 break; 101 } 102 } 103 free(hw_resources.resources); 104 105 if (!io_found || !irq_found) 106 return ENOENT; 107 108 *io_reg_address = io_address; 109 *io_reg_size = io_size; 110 *irq_no = irq; 111 90 hw_res_list_parsed_clean(&hw_res); 112 91 return EOK; 113 92 } -
uspace/drv/bus/usb/uhci/transfer_list.c
r2f0dd2a r7e1b130 184 184 uhci_transfer_batch_from_link(current); 185 185 transfer_list_remove_batch(instance, batch); 186 batch->usb_batch->error = EINTR; 187 uhci_transfer_batch_call_dispose(batch); 186 uhci_transfer_batch_abort(batch); 188 187 } 189 188 fibril_mutex_unlock(&instance->guard); -
uspace/drv/bus/usb/uhci/uhci.c
r2f0dd2a r7e1b130 148 148 int device_setup_uhci(ddf_dev_t *device) 149 149 { 150 assert(device); 151 uhci_t *instance = malloc(sizeof(uhci_t)); 150 if (!device) 151 return EBADMEM; 152 153 uhci_t *instance = ddf_dev_data_alloc(device, sizeof(uhci_t)); 152 154 if (instance == NULL) { 153 155 usb_log_error("Failed to allocate OHCI driver.\n"); … … 158 160 if (ret != EOK) { \ 159 161 if (instance->hc_fun) \ 160 instance->hc_fun->ops = NULL; \161 162 instance->hc_fun->driver_data = NULL; \ 162 163 ddf_fun_destroy(instance->hc_fun); \ 163 164 if (instance->rh_fun) {\ 164 instance->rh_fun->ops = NULL; \165 165 instance->rh_fun->driver_data = NULL; \ 166 166 ddf_fun_destroy(instance->rh_fun); \ 167 167 } \ 168 device->driver_data = NULL; \169 168 usb_log_error(message); \ 170 169 return ret; \ … … 227 226 "Failed to init uhci_hcd: %s.\n", str_error(ret)); 228 227 229 device->driver_data = instance;230 231 228 #define CHECK_RET_FINI_RETURN(ret, message...) \ 232 229 if (ret != EOK) { \ -
uspace/drv/bus/usb/uhci/uhci_batch.c
r2f0dd2a r7e1b130 34 34 #include <errno.h> 35 35 #include <str_error.h> 36 #include <macros.h> 36 37 37 38 #include <usb/usb.h> … … 45 46 #define DEFAULT_ERROR_COUNT 3 46 47 48 /** Safely destructs uhci_transfer_batch_t structure. 49 * 50 * @param[in] uhci_batch Instance to destroy. 51 */ 47 52 static void uhci_transfer_batch_dispose(uhci_transfer_batch_t *uhci_batch) 48 53 { … … 54 59 } 55 60 /*----------------------------------------------------------------------------*/ 56 /** Safely destructs uhci_transfer_batch_t structure57 * 58 * @param[in] uhci_batch Instance to destroy.59 */ 60 void uhci_transfer_batch_ call_dispose(uhci_transfer_batch_t *uhci_batch)61 /** Finishes usb_transfer_batch and destroys the structure. 62 * 63 * @param[in] uhci_batch Instance to finish and destroy. 64 */ 65 void uhci_transfer_batch_finish_dispose(uhci_transfer_batch_t *uhci_batch) 61 66 { 62 67 assert(uhci_batch); 63 68 assert(uhci_batch->usb_batch); 64 69 usb_transfer_batch_finish(uhci_batch->usb_batch, 65 uhci_transfer_batch_data_buffer(uhci_batch), 66 uhci_batch->usb_batch->buffer_size); 70 uhci_transfer_batch_data_buffer(uhci_batch)); 67 71 uhci_transfer_batch_dispose(uhci_batch); 68 72 } 69 73 /*----------------------------------------------------------------------------*/ 74 /** Transfer batch setup table. */ 70 75 static void (*const batch_setup[])(uhci_transfer_batch_t*, usb_direction_t); 71 76 /*----------------------------------------------------------------------------*/ 72 77 /** Allocate memory and initialize internal data structure. 73 78 * 74 * @param[in] fun DDF function to pass to callback. 75 * @param[in] ep Communication target 76 * @param[in] buffer Data source/destination. 77 * @param[in] buffer_size Size of the buffer. 78 * @param[in] setup_buffer Setup data source (if not NULL) 79 * @param[in] setup_size Size of setup_buffer (should be always 8) 80 * @param[in] func_in function to call on inbound transfer completion 81 * @param[in] func_out function to call on outbound transfer completion 82 * @param[in] arg additional parameter to func_in or func_out 79 * @param[in] usb_batch Pointer to generic USB batch structure. 83 80 * @return Valid pointer if all structures were successfully created, 84 81 * NULL otherwise. … … 156 153 * is reached. 157 154 */ 158 bool uhci_transfer_batch_is_complete( uhci_transfer_batch_t *uhci_batch)155 bool uhci_transfer_batch_is_complete(const uhci_transfer_batch_t *uhci_batch) 159 156 { 160 157 assert(uhci_batch); … … 200 197 } 201 198 /*----------------------------------------------------------------------------*/ 199 /** Direction to pid conversion table */ 202 200 static const usb_packet_id direction_pids[] = { 203 201 [USB_DIRECTION_IN] = USB_PID_IN, … … 237 235 238 236 while (remain_size > 0) { 239 const size_t packet_size = 240 (remain_size < mps) ? remain_size : mps; 237 const size_t packet_size = min(remain_size, mps); 241 238 242 239 const td_t *next_td = (td + 1 < uhci_batch->td_count) … … 309 306 310 307 while (remain_size > 0) { 311 const size_t packet_size = 312 (remain_size < mps) ? remain_size : mps; 308 const size_t packet_size = min(remain_size, mps); 313 309 314 310 td_init( -
uspace/drv/bus/usb/uhci/uhci_batch.h
r2f0dd2a r7e1b130 61 61 62 62 uhci_transfer_batch_t * uhci_transfer_batch_get(usb_transfer_batch_t *batch); 63 void uhci_transfer_batch_ call_dispose(uhci_transfer_batch_t *uhci_batch);64 bool uhci_transfer_batch_is_complete( uhci_transfer_batch_t *uhci_batch);63 void uhci_transfer_batch_finish_dispose(uhci_transfer_batch_t *uhci_batch); 64 bool uhci_transfer_batch_is_complete(const uhci_transfer_batch_t *uhci_batch); 65 65 66 /** Get offset to setup buffer accessible to the HC hw. 67 * @param uhci_batch UHCI batch structure. 68 * @return Pointer to the setup buffer. 69 */ 66 70 static inline void * uhci_transfer_batch_setup_buffer( 67 71 const uhci_transfer_batch_t *uhci_batch) … … 73 77 } 74 78 /*----------------------------------------------------------------------------*/ 79 /** Get offset to data buffer accessible to the HC hw. 80 * @param uhci_batch UHCI batch structure. 81 * @return Pointer to the data buffer. 82 */ 75 83 static inline void * uhci_transfer_batch_data_buffer( 76 84 const uhci_transfer_batch_t *uhci_batch) … … 82 90 } 83 91 /*----------------------------------------------------------------------------*/ 92 /** Aborts the batch. 93 * Sets error to EINTR and size off transferd data to 0, before finishing the 94 * batch. 95 * @param uhci_batch Batch to abort. 96 */ 97 static inline void uhci_transfer_batch_abort(uhci_transfer_batch_t *uhci_batch) 98 { 99 assert(uhci_batch); 100 assert(uhci_batch->usb_batch); 101 uhci_batch->usb_batch->error = EINTR; 102 uhci_batch->usb_batch->transfered_size = 0; 103 uhci_transfer_batch_finish_dispose(uhci_batch); 104 } 105 /*----------------------------------------------------------------------------*/ 106 /** Linked list conversion wrapper. 107 * @param l Linked list link. 108 * @return Pointer to the uhci batch structure. 109 */ 84 110 static inline uhci_transfer_batch_t *uhci_transfer_batch_from_link(link_t *l) 85 111 {
Note:
See TracChangeset
for help on using the changeset viewer.
