Changeset 4abc304 in mainline for uspace/drv/uhci-hcd/uhci.c
- Timestamp:
- 2011-02-28T11:55:36Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- dced52a
- Parents:
- 299d53e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/uhci.c
r299d53e r4abc304 101 101 bool low_speed, usb_transfer_type_t, size_t size); 102 102 103 #define CHECK_RET_RETURN(ret, message...) \ 103 104 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size) 105 { 106 assert(reg_size >= sizeof(regs_t)); 107 int ret; 108 109 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \ 104 110 if (ret != EOK) { \ 105 111 usb_log_error(message); \ 112 if (instance->ddf_instance) \ 113 ddf_fun_destroy(instance->ddf_instance); \ 106 114 return ret; \ 107 115 } else (void) 0 108 109 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)110 {111 assert(reg_size >= sizeof(regs_t));112 int ret;113 116 114 117 /* … … 116 119 */ 117 120 instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci"); 118 if (instance->ddf_instance == NULL) { 119 usb_log_error("Failed to create UHCI device function.\n"); 120 return ENOMEM; 121 } 121 ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK; 122 CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n"); 123 122 124 instance->ddf_instance->ops = &uhci_ops; 123 125 instance->ddf_instance->driver_data = instance; 124 126 125 127 ret = ddf_fun_bind(instance->ddf_instance); 126 CHECK_RET_ RETURN(ret, "Failedto bind UHCI device function: %s.\n",127 str_error(ret));128 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to bind UHCI device function: %s.\n", 129 ret, str_error(ret)); 128 130 129 131 /* allow access to hc control registers */ 130 132 regs_t *io; 131 133 ret = pio_enable(regs, reg_size, (void**)&io); 132 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io); 134 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n", 135 ret, str_error(ret), io); 133 136 instance->registers = io; 134 usb_log_debug("Device registers a ccessible.\n");137 usb_log_debug("Device registers at %p(%u) accessible.\n", io, reg_size); 135 138 136 139 ret = uhci_init_mem_structures(instance); 137 CHECK_RET_ RETURN(ret, "Failed to initializememory structures.\n");140 CHECK_RET_DEST_FUN_RETURN(ret, "Failed to initialize UHCI memory structures.\n"); 138 141 139 142 uhci_init_hw(instance); … … 145 148 fibril_add_ready(instance->debug_checker); 146 149 147 return EOK; 150 usb_log_info("Started UHCI driver.\n"); 151 return EOK; 152 #undef CHECK_RET_DEST_FUN_RETURN 148 153 } 149 154 /*----------------------------------------------------------------------------*/ … … 171 176 pio_write_16(&instance->registers->usbcmd, 172 177 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE); 173 usb_log_debug("Started UHCI HC.\n");174 178 } 175 179 /*----------------------------------------------------------------------------*/ … … 177 181 { 178 182 assert(instance); 183 #define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \ 184 if (ret != EOK) { \ 185 usb_log_error(message); \ 186 if (instance->interrupt_code.cmds != NULL) \ 187 free(instance->interrupt_code.cmds); \ 188 return ret; \ 189 } else (void) 0 179 190 180 191 /* init interrupt code */ 181 irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds)); 182 if (interrupt_commands == NULL) { 183 return ENOMEM; 184 } 185 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 186 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 187 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 188 instance->interrupt_code.cmds = interrupt_commands; 189 instance->interrupt_code.cmdcount = 190 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 192 instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds)); 193 int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK; 194 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n"); 195 196 { 197 irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds; 198 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 199 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 200 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 201 instance->interrupt_code.cmdcount = 202 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 203 } 191 204 192 205 /* init transfer lists */ 193 intret = uhci_init_transfer_lists(instance);194 CHECK_RET_ RETURN(ret, "Failed to initialize transfer lists.\n");206 ret = uhci_init_transfer_lists(instance); 207 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n"); 195 208 usb_log_debug("Initialized transfer lists.\n"); 196 209 … … 198 211 instance->frame_list = get_page(); 199 212 ret = instance ? EOK : ENOMEM; 200 CHECK_RET_ RETURN(ret, "Failed to get frame list page.\n");213 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n"); 201 214 usb_log_debug("Initialized frame list.\n"); 202 215 … … 205 218 instance->transfers_interrupt.queue_head_pa 206 219 | LINK_POINTER_QUEUE_HEAD_FLAG; 220 207 221 unsigned i = 0; 208 222 for(; i < UHCI_FRAME_LIST_COUNT; ++i) { … … 215 229 216 230 return EOK; 231 #undef CHECK_RET_DEST_CMDS_RETURN 217 232 } 218 233 /*----------------------------------------------------------------------------*/ … … 220 235 { 221 236 assert(instance); 237 #define CHECK_RET_CLEAR_RETURN(ret, message...) \ 238 if (ret != EOK) { \ 239 usb_log_error(message); \ 240 transfer_list_fini(&instance->transfers_bulk_full); \ 241 transfer_list_fini(&instance->transfers_control_full); \ 242 transfer_list_fini(&instance->transfers_control_slow); \ 243 transfer_list_fini(&instance->transfers_interrupt); \ 244 return ret; \ 245 } else (void) 0 222 246 223 247 /* initialize TODO: check errors */ 224 248 int ret; 225 249 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); 226 assert(ret == EOK);250 CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list."); 227 251 ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL"); 228 assert(ret == EOK);252 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list."); 229 253 ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW"); 230 assert(ret == EOK);254 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list."); 231 255 ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT"); 232 assert(ret == EOK);256 CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list."); 233 257 234 258 transfer_list_set_next(&instance->transfers_control_full, … … 257 281 258 282 return EOK; 283 #undef CHECK_RET_CLEAR_RETURN 259 284 } 260 285 /*----------------------------------------------------------------------------*/
Note:
See TracChangeset
for help on using the changeset viewer.