Changeset cdc8a391 in mainline
- Timestamp:
- 2013-07-12T14:08:06Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 322ac35c
- Parents:
- 98abd40 (diff), b66ffb1 (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
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/binutils/toolchain.sh
r98abd40 rcdc8a391 72 72 echo ' ld $LD_ARGS' 73 73 echo 'else' 74 CFLAGS="`echo " $3 " | \74 CFLAGS="`echo " $3 " | \ 75 75 sed 's/ -O[^ ]*//g' | \ 76 76 sed 's/ -W[^ ]*//g' | \ 77 77 sed 's/ -pipe//g' | \ 78 sed 's/ -g //g' | \78 sed 's/ -g[^ ]*//g' | \ 79 79 sed 's/ [ ]*/ /g'`" 80 80 echo ' CONFTEST="`echo \"$*\" | grep '\' conftest \''`"' -
uspace/app/mkmfs/mkmfs.c
r98abd40 rcdc8a391 649 649 mark_bmap(ibmap_buf, i, FREE); 650 650 651 for (i = sb->first_data_zone + 1; i < sb->n_zones; ++i)651 for (i = 2; i < sb->n_zones; ++i) 652 652 mark_bmap(zbmap_buf, i, FREE); 653 653 -
uspace/drv/bus/usb/ehci/main.c
r98abd40 rcdc8a391 33 33 * Main routines of EHCI driver. 34 34 */ 35 35 36 #include <ddf/driver.h> 36 37 #include <ddf/interrupt.h> 37 38 #include <device/hw_res.h> 38 39 #include <errno.h> 40 #include <stdbool.h> 39 41 #include <str_error.h> 40 42 … … 70 72 static int ehci_dev_add(ddf_dev_t *device) 71 73 { 74 ddf_fun_t *hc_fun = NULL; 75 bool fun_bound = false; 76 72 77 assert(device); 73 #define CHECK_RET_RETURN(ret, message...) \74 if (ret != EOK) { \75 usb_log_error(message); \76 return ret; \77 }78 78 79 79 uintptr_t reg_base = 0; … … 81 81 int irq = 0; 82 82 83 int ret = get_my_registers(device, ®_base, ®_size, &irq); 84 CHECK_RET_RETURN(ret, 85 "Failed to get memory addresses for %" PRIun ": %s.\n", 86 ddf_dev_get_handle(device), str_error(ret)); 83 int rc = get_my_registers(device, ®_base, ®_size, &irq); 84 if (rc != EOK) { 85 usb_log_error("Failed to get memory addresses for %" PRIun 86 ": %s.\n", ddf_dev_get_handle(device), str_error(rc)); 87 goto error; 88 } 89 87 90 usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n", 88 91 reg_base, reg_size, irq); 89 92 90 ret = disable_legacy(device, reg_base, reg_size); 91 CHECK_RET_RETURN(ret, 92 "Failed to disable legacy USB: %s.\n", str_error(ret)); 93 rc = disable_legacy(device, reg_base, reg_size); 94 if (rc != EOK) { 95 usb_log_error("Failed to disable legacy USB: %s.\n", 96 str_error(rc)); 97 goto error; 98 } 93 99 94 ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");100 hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc"); 95 101 if (hc_fun == NULL) { 96 102 usb_log_error("Failed to create EHCI function.\n"); 97 return ENOMEM; 103 rc = ENOMEM; 104 goto error; 98 105 } 106 99 107 hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t)); 100 108 if (ehci_hc == NULL) { 101 109 usb_log_error("Failed to alloc generic HC driver.\n"); 102 return ENOMEM; 110 rc = ENOMEM; 111 goto error; 103 112 } 113 104 114 /* High Speed, no bandwidth */ 105 115 hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL); 106 116 ddf_fun_set_ops(hc_fun, &hc_ops); 107 117 108 ret = ddf_fun_bind(hc_fun); 109 CHECK_RET_RETURN(ret, 110 "Failed to bind EHCI function: %s.\n", 111 str_error(ret)); 112 ret = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY); 113 CHECK_RET_RETURN(ret, 114 "Failed to add EHCI to HC class: %s.\n", 115 str_error(ret)); 118 rc = ddf_fun_bind(hc_fun); 119 if (rc != EOK) { 120 usb_log_error("Failed to bind EHCI function: %s.\n", 121 str_error(rc)); 122 goto error; 123 } 124 125 fun_bound = true; 126 127 rc = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY); 128 if (rc != EOK) { 129 usb_log_error("Failed to add EHCI to HC class: %s.\n", 130 str_error(rc)); 131 goto error; 132 } 116 133 117 134 usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n", … … 119 136 120 137 return EOK; 121 #undef CHECK_RET_RETURN 138 error: 139 if (fun_bound) 140 ddf_fun_unbind(hc_fun); 141 if (hc_fun != NULL) 142 ddf_fun_destroy(hc_fun); 143 return rc; 122 144 } 123 145 -
uspace/drv/bus/usb/ehci/res.c
r98abd40 rcdc8a391 145 145 return ENOMEM; 146 146 147 #define CHECK_RET_HANGUP_RETURN(ret, message...) \148 if (ret != EOK) { \149 usb_log_error(message); \150 async_hangup(parent_sess); \151 return ret; \152 } else (void)0153 154 147 /* Read the first EEC. i.e. Legacy Support register */ 155 148 uint32_t usblegsup; 156 int r et= pci_config_space_read_32(parent_sess,149 int rc = pci_config_space_read_32(parent_sess, 157 150 eecp + USBLEGSUP_OFFSET, &usblegsup); 158 CHECK_RET_HANGUP_RETURN(ret, 159 "Failed to read USBLEGSUP: %s.\n", str_error(ret)); 151 if (rc != EOK) { 152 usb_log_error("Failed to read USBLEGSUP: %s.\n", 153 str_error(rc)); 154 goto error; 155 } 156 160 157 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 161 158 … … 163 160 * byte. (OS Control semaphore)*/ 164 161 usb_log_debug("Requesting OS control.\n"); 165 r et= pci_config_space_write_8(parent_sess,162 rc = pci_config_space_write_8(parent_sess, 166 163 eecp + USBLEGSUP_OFFSET + 3, 1); 167 CHECK_RET_HANGUP_RETURN(ret, "Failed to request OS EHCI control: %s.\n", 168 str_error(ret)); 164 if (rc != EOK) { 165 usb_log_error("Failed to request OS EHCI control: %s.\n", 166 str_error(rc)); 167 goto error; 168 } 169 169 170 170 size_t wait = 0; 171 171 /* Wait for BIOS to release control. */ 172 r et= pci_config_space_read_32(172 rc = pci_config_space_read_32( 173 173 parent_sess, eecp + USBLEGSUP_OFFSET, &usblegsup); 174 if (rc != EOK) { 175 usb_log_error("Failed reading PCI config space: %s.\n", 176 str_error(rc)); 177 goto error; 178 } 179 174 180 while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) { 175 181 async_usleep(WAIT_STEP); 176 r et= pci_config_space_read_32(parent_sess,182 rc = pci_config_space_read_32(parent_sess, 177 183 eecp + USBLEGSUP_OFFSET, &usblegsup); 184 if (rc != EOK) { 185 usb_log_error("Failed reading PCI config space: %s.\n", 186 str_error(rc)); 187 goto error; 188 } 178 189 wait += WAIT_STEP; 179 190 } … … 188 199 usb_log_warning( "BIOS failed to release control after " 189 200 "%zu usecs, force it.\n", wait); 190 r et= pci_config_space_write_32(parent_sess,201 rc = pci_config_space_write_32(parent_sess, 191 202 eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL); 192 CHECK_RET_HANGUP_RETURN(ret, "Failed to force OS control: " 193 "%s.\n", str_error(ret)); 203 if (rc != EOK) { 204 usb_log_error("Failed to force OS control: " 205 "%s.\n", str_error(rc)); 206 goto error; 207 } 208 194 209 /* 195 210 * Check capability type here, value of 01h identifies the capability … … 201 216 /* Read the second EEC Legacy Support and Control register */ 202 217 uint32_t usblegctlsts; 203 r et= pci_config_space_read_32(parent_sess,218 rc = pci_config_space_read_32(parent_sess, 204 219 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 205 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS: %s.\n", 206 str_error(ret)); 220 if (rc != EOK) { 221 usb_log_error("Failed to get USBLEGCTLSTS: %s.\n", 222 str_error(rc)); 223 goto error; 224 } 225 207 226 usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts); 208 227 /* … … 211 230 * interfering. NOTE: Three upper bits are WC 212 231 */ 213 r et= pci_config_space_write_32(parent_sess,232 rc = pci_config_space_write_32(parent_sess, 214 233 eecp + USBLEGCTLSTS_OFFSET, 0xe0000000); 215 CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret); 234 if (rc != EOK) { 235 usb_log_error("Failed(%d) zero USBLEGCTLSTS.\n", rc); 236 goto error; 237 } 238 216 239 udelay(10); 217 r et= pci_config_space_read_32(parent_sess,240 rc = pci_config_space_read_32(parent_sess, 218 241 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 219 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS 2: %s.\n", 220 str_error(ret)); 242 if (rc != EOK) { 243 usb_log_error("Failed to get USBLEGCTLSTS 2: %s.\n", 244 str_error(rc)); 245 goto error; 246 } 247 221 248 usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n", 222 249 usblegctlsts); … … 224 251 225 252 /* Read again Legacy Support register */ 226 r et= pci_config_space_read_32(parent_sess,253 rc = pci_config_space_read_32(parent_sess, 227 254 eecp + USBLEGSUP_OFFSET, &usblegsup); 228 CHECK_RET_HANGUP_RETURN(ret, "Failed to read USBLEGSUP: %s.\n", 229 str_error(ret)); 255 if (rc != EOK) { 256 usb_log_error("Failed to read USBLEGSUP: %s.\n", 257 str_error(rc)); 258 goto error; 259 } 260 230 261 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 231 262 async_hangup(parent_sess); 232 263 return EOK; 233 #undef CHECK_RET_HANGUP_RETURN 264 error: 265 async_hangup(parent_sess); 266 return rc; 234 267 } 235 268 … … 239 272 usb_log_debug("Disabling EHCI legacy support.\n"); 240 273 241 #define CHECK_RET_RETURN(ret, message...) \242 if (ret != EOK) { \243 usb_log_error(message); \244 return ret; \245 } else (void)0246 247 274 /* Map EHCI registers */ 248 275 void *regs = NULL; 249 int ret = pio_enable((void*)reg_base, reg_size, ®s); 250 CHECK_RET_RETURN(ret, "Failed to map registers %p: %s.\n", 251 (void *) reg_base, str_error(ret)); 276 int rc = pio_enable((void*)reg_base, reg_size, ®s); 277 if (rc != EOK) { 278 usb_log_error("Failed to map registers %p: %s.\n", 279 (void *) reg_base, str_error(rc)); 280 return rc; 281 } 252 282 253 283 usb_log_debug2("Registers mapped at: %p.\n", regs); … … 263 293 usb_log_debug("Value of EECP: %x.\n", eecp); 264 294 265 ret = disable_extended_caps(device, eecp); 266 CHECK_RET_RETURN(ret, "Failed to disable extended capabilities: %s.\n", 267 str_error(ret)); 268 269 #undef CHECK_RET_RETURN 295 rc = disable_extended_caps(device, eecp); 296 if (rc != EOK) { 297 usb_log_error("Failed to disable extended capabilities: %s.\n", 298 str_error(rc)); 299 return rc; 300 } 270 301 271 302 /* … … 306 337 usbcmd, *usbcmd, usbsts, *usbsts, usbint, *usbint, usbconf,*usbconf); 307 338 308 return r et;339 return rc; 309 340 } 310 341 -
uspace/drv/bus/usb/ohci/hc.c
r98abd40 rcdc8a391 35 35 36 36 #include <errno.h> 37 #include <stdbool.h> 37 38 #include <str_error.h> 38 39 #include <adt/list.h> … … 183 184 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun) 184 185 { 186 bool addr_reqd = false; 187 bool ep_added = false; 188 bool fun_bound = false; 189 int rc; 190 185 191 assert(instance); 186 192 assert(hub_fun); … … 188 194 /* Try to get address 1 for root hub. */ 189 195 instance->rh.address = 1; 190 int ret= usb_device_manager_request_address(196 rc = usb_device_manager_request_address( 191 197 &instance->generic.dev_manager, &instance->rh.address, false, 192 198 USB_SPEED_FULL); 193 if (r et!= EOK) {199 if (rc != EOK) { 194 200 usb_log_error("Failed to get OHCI root hub address: %s\n", 195 str_error(ret)); 196 return ret; 197 } 198 199 #define CHECK_RET_UNREG_RETURN(ret, message...) \ 200 if (ret != EOK) { \ 201 usb_log_error(message); \ 202 usb_endpoint_manager_remove_ep( \ 203 &instance->generic.ep_manager, instance->rh.address, 0, \ 204 USB_DIRECTION_BOTH, NULL, NULL); \ 205 usb_device_manager_release_address( \ 206 &instance->generic.dev_manager, instance->rh.address); \ 207 return ret; \ 208 } else (void)0 209 210 ret = usb_endpoint_manager_add_ep( 201 str_error(rc)); 202 goto error; 203 } 204 205 addr_reqd = true; 206 207 rc = usb_endpoint_manager_add_ep( 211 208 &instance->generic.ep_manager, instance->rh.address, 0, 212 209 USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64, 213 210 0, NULL, NULL); 214 CHECK_RET_UNREG_RETURN(ret, 215 "Failed to register root hub control endpoint: %s.\n", 216 str_error(ret)); 217 218 ret = ddf_fun_add_match_id(hub_fun, "usb&class=hub", 100); 219 CHECK_RET_UNREG_RETURN(ret, 220 "Failed to add root hub match-id: %s.\n", str_error(ret)); 221 222 ret = ddf_fun_bind(hub_fun); 223 CHECK_RET_UNREG_RETURN(ret, 224 "Failed to bind root hub function: %s.\n", str_error(ret)); 225 226 ret = usb_device_manager_bind_address(&instance->generic.dev_manager, 211 if (rc != EOK) { 212 usb_log_error("Failed to register root hub control endpoint: %s.\n", 213 str_error(rc)); 214 goto error; 215 } 216 217 ep_added = true; 218 219 rc = ddf_fun_add_match_id(hub_fun, "usb&class=hub", 100); 220 if (rc != EOK) { 221 usb_log_error("Failed to add root hub match-id: %s.\n", 222 str_error(rc)); 223 goto error; 224 } 225 226 rc = ddf_fun_bind(hub_fun); 227 if (rc != EOK) { 228 usb_log_error("Failed to bind root hub function: %s.\n", 229 str_error(rc)); 230 goto error; 231 } 232 233 fun_bound = true; 234 235 rc = usb_device_manager_bind_address(&instance->generic.dev_manager, 227 236 instance->rh.address, ddf_fun_get_handle(hub_fun)); 228 if (r et != EOK)237 if (rc != EOK) { 229 238 usb_log_warning("Failed to bind root hub address: %s.\n", 230 str_error(ret)); 231 232 return EOK; 233 #undef CHECK_RET_RELEASE 239 str_error(rc)); 240 } 241 242 return EOK; 243 error: 244 if (fun_bound) 245 ddf_fun_unbind(hub_fun); 246 if (ep_added) { 247 usb_endpoint_manager_remove_ep( 248 &instance->generic.ep_manager, instance->rh.address, 0, 249 USB_DIRECTION_BOTH, NULL, NULL); 250 } 251 if (addr_reqd) { 252 usb_device_manager_release_address( 253 &instance->generic.dev_manager, instance->rh.address); 254 } 255 return rc; 234 256 } 235 257 … … 246 268 assert(instance); 247 269 248 #define CHECK_RET_RETURN(ret, message...) \ 249 if (ret != EOK) { \ 250 usb_log_error(message); \ 251 return ret; \ 252 } else (void)0 253 254 int ret = 270 int rc = 255 271 pio_enable((void*)regs, reg_size, (void**)&instance->registers); 256 CHECK_RET_RETURN(ret, 257 "Failed to gain access to device registers: %s.\n", str_error(ret)); 272 if (rc != EOK) { 273 usb_log_error("Failed to gain access to device registers: %s.\n", 274 str_error(rc)); 275 return rc; 276 } 258 277 259 278 list_initialize(&instance->pending_batches); … … 266 285 instance->generic.ep_remove_hook = ohci_endpoint_fini; 267 286 268 ret = hc_init_memory(instance); 269 CHECK_RET_RETURN(ret, "Failed to create OHCI memory structures: %s.\n", 270 str_error(ret)); 271 #undef CHECK_RET_RETURN 287 rc = hc_init_memory(instance); 288 if (rc != EOK) { 289 usb_log_error("Failed to create OHCI memory structures: %s.\n", 290 str_error(rc)); 291 return rc; 292 } 272 293 273 294 fibril_mutex_initialize(&instance->guard); -
uspace/drv/bus/usb/uhci/hc.c
r98abd40 rcdc8a391 90 90 static int hc_debug_checker(void *arg); 91 91 92 93 /** Get number of PIO ranges used in IRQ code. 94 * @return Number of ranges. 95 */ 96 size_t hc_irq_pio_range_count(void) 97 { 98 return sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t); 99 } 100 101 /** Get number of commands used in IRQ code. 102 * @return Number of commands. 103 */ 104 size_t hc_irq_cmd_count(void) 105 { 106 return sizeof(uhci_irq_commands) / sizeof(irq_cmd_t); 107 } 92 enum { 93 /** Number of PIO ranges used in IRQ code */ 94 hc_irq_pio_range_count = 95 sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t), 96 97 /* Number of commands used in IRQ code */ 98 hc_irq_cmd_count = 99 sizeof(uhci_irq_commands) / sizeof(irq_cmd_t) 100 }; 108 101 109 102 /** Generate IRQ code. … … 133 126 cmds[0].addr = ®isters->usbsts; 134 127 cmds[3].addr = ®isters->usbsts; 128 129 return EOK; 130 } 131 132 /** Register interrupt handler. 133 * 134 * @param[in] device Host controller DDF device 135 * @param[in] reg_base Register range base 136 * @param[in] reg_size Register range size 137 * @param[in] irq Interrupt number 138 * @paran[in] handler Interrupt handler 139 * 140 * @return EOK on success or negative error code 141 */ 142 int hc_register_irq_handler(ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, 143 int irq, interrupt_handler_t handler) 144 { 145 int rc; 146 irq_pio_range_t irq_ranges[hc_irq_pio_range_count]; 147 irq_cmd_t irq_cmds[hc_irq_cmd_count]; 148 rc = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 149 sizeof(irq_cmds), reg_base, reg_size); 150 if (rc != EOK) { 151 usb_log_error("Failed to generate IRQ commands: %s.\n", 152 str_error(rc)); 153 return rc; 154 } 155 156 irq_code_t irq_code = { 157 .rangecount = hc_irq_pio_range_count, 158 .ranges = irq_ranges, 159 .cmdcount = hc_irq_cmd_count, 160 .cmds = irq_cmds 161 }; 162 163 /* Register handler to avoid interrupt lockup */ 164 rc = register_interrupt_handler(device, irq, handler, &irq_code); 165 if (rc != EOK) { 166 usb_log_error("Failed to register interrupt handler: %s.\n", 167 str_error(rc)); 168 return rc; 169 } 135 170 136 171 return EOK; … … 209 244 { 210 245 assert(reg_size >= sizeof(uhci_regs_t)); 211 int ret; 212 213 #define CHECK_RET_RETURN(ret, message...) \ 214 if (ret != EOK) { \ 215 usb_log_error(message); \ 216 return ret; \ 217 } else (void) 0 246 int rc; 218 247 219 248 instance->hw_interrupts = interrupts; … … 222 251 /* allow access to hc control registers */ 223 252 uhci_regs_t *io; 224 ret = pio_enable(regs, reg_size, (void **)&io); 225 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p: %s.\n", 226 io, str_error(ret)); 253 rc = pio_enable(regs, reg_size, (void **)&io); 254 if (rc != EOK) { 255 usb_log_error("Failed to gain access to registers at %p: %s.\n", 256 io, str_error(rc)); 257 return rc; 258 } 259 227 260 instance->registers = io; 228 261 usb_log_debug( 229 262 "Device registers at %p (%zuB) accessible.\n", io, reg_size); 230 263 231 r et= hc_init_mem_structures(instance);232 CHECK_RET_RETURN(ret,233 234 str_error(ret));235 236 #undef CHECK_RET_RETURN 264 rc = hc_init_mem_structures(instance); 265 if (rc != EOK) { 266 usb_log_error("Failed to initialize UHCI memory structures: %s.\n", 267 str_error(rc)); 268 return rc; 269 } 237 270 238 271 hcd_init(&instance->generic, USB_SPEED_FULL, … … 397 430 398 431 return EOK; 399 #undef CHECK_RET_CLEAR_RETURN400 432 } 401 433 -
uspace/drv/bus/usb/uhci/hc.h
r98abd40 rcdc8a391 36 36 #define DRV_UHCI_HC_H 37 37 38 #include <ddf/interrupt.h> 38 39 #include <fibril.h> 39 40 #include <usb/host/hcd.h> … … 119 120 } hc_t; 120 121 121 size_t hc_irq_pio_range_count(void); 122 size_t hc_irq_cmd_count(void); 122 int hc_register_irq_handler(ddf_dev_t *, uintptr_t, size_t, int, interrupt_handler_t); 123 123 int hc_get_irq_code(irq_pio_range_t [], size_t, irq_cmd_t [], size_t, uintptr_t, 124 124 size_t); -
uspace/drv/bus/usb/uhci/uhci.c
r98abd40 rcdc8a391 38 38 39 39 #include <errno.h> 40 #include <stdbool.h> 40 41 #include <str_error.h> 41 42 #include <ddf/interrupt.h> … … 149 150 int device_setup_uhci(ddf_dev_t *device) 150 151 { 152 bool ih_registered = false; 153 bool hc_inited = false; 154 bool fun_bound = false; 155 int rc; 156 151 157 if (!device) 152 158 return EBADMEM; … … 158 164 } 159 165 160 #define CHECK_RET_DEST_FREE_RETURN(ret, message...) \161 if (ret != EOK) { \162 if (instance->hc_fun) \163 ddf_fun_destroy(instance->hc_fun); \164 if (instance->rh_fun) {\165 ddf_fun_destroy(instance->rh_fun); \166 } \167 usb_log_error(message); \168 return ret; \169 } else (void)0170 171 instance->rh_fun = NULL;172 166 instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci_hc"); 173 int ret = (instance->hc_fun == NULL) ? ENOMEM : EOK; 174 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI HC function.\n"); 167 if (instance->hc_fun == NULL) { 168 usb_log_error("Failed to create UHCI HC function.\n"); 169 rc = ENOMEM; 170 goto error; 171 } 172 175 173 ddf_fun_set_ops(instance->hc_fun, &hc_ops); 176 174 ddf_fun_data_implant(instance->hc_fun, &instance->hc.generic); 177 175 178 176 instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci_rh"); 179 ret = (instance->rh_fun == NULL) ? ENOMEM : EOK; 180 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI RH function.\n"); 177 if (instance->rh_fun == NULL) { 178 usb_log_error("Failed to create UHCI RH function.\n"); 179 rc = ENOMEM; 180 goto error; 181 } 182 181 183 ddf_fun_set_ops(instance->rh_fun, &rh_ops); 182 184 ddf_fun_data_implant(instance->rh_fun, &instance->rh); … … 186 188 int irq = 0; 187 189 188 ret = get_my_registers(device, ®_base, ®_size, &irq); 189 CHECK_RET_DEST_FREE_RETURN(ret, 190 "Failed to get I/O addresses for %" PRIun ": %s.\n", 191 ddf_dev_get_handle(device), str_error(ret)); 190 rc = get_my_registers(device, ®_base, ®_size, &irq); 191 if (rc != EOK) { 192 usb_log_error("Failed to get I/O addresses for %" PRIun ": %s.\n", 193 ddf_dev_get_handle(device), str_error(rc)); 194 goto error; 195 } 192 196 usb_log_debug("I/O regs at 0x%p (size %zu), IRQ %d.\n", 193 197 (void *) reg_base, reg_size, irq); 194 198 195 ret = disable_legacy(device); 196 CHECK_RET_DEST_FREE_RETURN(ret, 197 "Failed to disable legacy USB: %s.\n", str_error(ret)); 198 199 const size_t ranges_count = hc_irq_pio_range_count(); 200 const size_t cmds_count = hc_irq_cmd_count(); 201 irq_pio_range_t irq_ranges[ranges_count]; 202 irq_cmd_t irq_cmds[cmds_count]; 203 ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 204 sizeof(irq_cmds), reg_base, reg_size); 205 CHECK_RET_DEST_FREE_RETURN(ret, 206 "Failed to generate IRQ commands: %s.\n", str_error(ret)); 207 208 irq_code_t irq_code = { 209 .rangecount = ranges_count, 210 .ranges = irq_ranges, 211 .cmdcount = cmds_count, 212 .cmds = irq_cmds 213 }; 214 215 /* Register handler to avoid interrupt lockup */ 216 ret = register_interrupt_handler(device, irq, irq_handler, &irq_code); 217 CHECK_RET_DEST_FREE_RETURN(ret, 218 "Failed to register interrupt handler: %s.\n", str_error(ret)); 199 rc = disable_legacy(device); 200 if (rc != EOK) { 201 usb_log_error("Failed to disable legacy USB: %s.\n", 202 str_error(rc)); 203 goto error; 204 } 205 206 rc = hc_register_irq_handler(device, reg_base, reg_size, irq, irq_handler); 207 if (rc != EOK) { 208 usb_log_error("Failed to register interrupt handler: %s.\n", 209 str_error(rc)); 210 goto error; 211 } 212 213 ih_registered = true; 219 214 220 215 bool interrupts = false; 221 r et= enable_interrupts(device);222 if (r et!= EOK) {216 rc = enable_interrupts(device); 217 if (rc != EOK) { 223 218 usb_log_warning("Failed to enable interrupts: %s." 224 " Falling back to polling.\n", str_error(r et));219 " Falling back to polling.\n", str_error(rc)); 225 220 } else { 226 221 usb_log_debug("Hw interrupts enabled.\n"); … … 228 223 } 229 224 230 ret = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts); 231 CHECK_RET_DEST_FREE_RETURN(ret, 232 "Failed to init uhci_hcd: %s.\n", str_error(ret)); 233 234 #define CHECK_RET_FINI_RETURN(ret, message...) \ 235 if (ret != EOK) { \ 236 hc_fini(&instance->hc); \ 237 CHECK_RET_DEST_FREE_RETURN(ret, message); \ 238 return ret; \ 239 } else (void)0 240 241 ret = ddf_fun_bind(instance->hc_fun); 242 CHECK_RET_FINI_RETURN(ret, "Failed to bind UHCI device function: %s.\n", 243 str_error(ret)); 244 245 ret = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY); 246 CHECK_RET_FINI_RETURN(ret, 247 "Failed to add UHCI to HC class: %s.\n", str_error(ret)); 248 249 ret = rh_init(&instance->rh, instance->rh_fun, 225 rc = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts); 226 if (rc != EOK) { 227 usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(rc)); 228 goto error; 229 } 230 231 hc_inited = true; 232 233 rc = ddf_fun_bind(instance->hc_fun); 234 if (rc != EOK) { 235 usb_log_error("Failed to bind UHCI device function: %s.\n", 236 str_error(rc)); 237 goto error; 238 } 239 240 fun_bound = true; 241 242 rc = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY); 243 if (rc != EOK) { 244 usb_log_error("Failed to add UHCI to HC class: %s.\n", 245 str_error(rc)); 246 goto error; 247 } 248 249 rc = rh_init(&instance->rh, instance->rh_fun, 250 250 (uintptr_t)instance->hc.registers + 0x10, 4); 251 CHECK_RET_FINI_RETURN(ret, 252 "Failed to setup UHCI root hub: %s.\n", str_error(ret)); 253 254 ret = ddf_fun_bind(instance->rh_fun); 255 CHECK_RET_FINI_RETURN(ret, 256 "Failed to register UHCI root hub: %s.\n", str_error(ret)); 251 if (rc != EOK) { 252 usb_log_error("Failed to setup UHCI root hub: %s.\n", 253 str_error(rc)); 254 goto error; 255 } 256 257 rc = ddf_fun_bind(instance->rh_fun); 258 if (rc != EOK) { 259 usb_log_error("Failed to register UHCI root hub: %s.\n", 260 str_error(rc)); 261 goto error; 262 } 257 263 258 264 return EOK; 259 #undef CHECK_RET_FINI_RETURN 265 266 error: 267 if (fun_bound) 268 ddf_fun_unbind(instance->hc_fun); 269 if (hc_inited) 270 hc_fini(&instance->hc); 271 if (ih_registered) 272 unregister_interrupt_handler(device, irq); 273 if (instance->hc_fun != NULL) 274 ddf_fun_destroy(instance->hc_fun); 275 if (instance->rh_fun != NULL) { 276 ddf_fun_destroy(instance->rh_fun); 277 } 278 return rc; 260 279 } 261 280 /** -
uspace/drv/bus/usb/uhcirh/main.c
r98abd40 rcdc8a391 93 93 size_t io_size = 0; 94 94 uhci_root_hub_t *rh = NULL; 95 int r et = EOK;95 int rc; 96 96 97 #define CHECK_RET_FREE_RH_RETURN(ret, message...) \ 98 if (ret != EOK) { \ 99 usb_log_error(message); \ 100 return ret; \ 101 } else (void)0 97 rc = hc_get_my_registers(device, &io_regs, &io_size); 98 if (rc != EOK) { 99 usb_log_error( "Failed to get registers from HC: %s.\n", 100 str_error(rc)); 101 return rc; 102 } 102 103 103 ret = hc_get_my_registers(device, &io_regs, &io_size);104 CHECK_RET_FREE_RH_RETURN(ret,105 "Failed to get registers from HC: %s.\n", str_error(ret));106 104 usb_log_debug("I/O regs at %p (size %zuB).\n", 107 105 (void *) io_regs, io_size); 108 106 109 107 rh = ddf_dev_data_alloc(device, sizeof(uhci_root_hub_t)); 110 ret = (rh == NULL) ? ENOMEM : EOK; 111 CHECK_RET_FREE_RH_RETURN(ret, 112 "Failed to allocate rh driver instance.\n"); 108 if (rh == NULL) { 109 usb_log_error("Failed to allocate rh driver instance.\n"); 110 return ENOMEM; 111 } 113 112 114 ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 115 CHECK_RET_FREE_RH_RETURN(ret, 116 "Failed(%d) to initialize rh driver instance: %s.\n", 117 ret, str_error(ret)); 113 rc = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 114 if (rc != EOK) { 115 usb_log_error("Failed(%d) to initialize rh driver instance: " 116 "%s.\n", rc, str_error(rc)); 117 return rc; 118 } 118 119 119 120 usb_log_info("Controlling root hub '%s' (%" PRIun ").\n", 120 121 ddf_dev_get_name(device), ddf_dev_get_handle(device)); 122 121 123 return EOK; 122 124 } -
uspace/drv/bus/usb/uhcirh/port.c
r98abd40 rcdc8a391 150 150 { 151 151 uhci_port_t *instance = port; 152 int rc; 152 153 assert(instance); 153 154 154 155 unsigned allowed_failures = MAX_ERROR_COUNT; 155 #define CHECK_RET_FAIL(ret, msg...) \156 if (ret != EOK) { \157 usb_log_error(msg); \158 if (!(allowed_failures-- > 0)) { \159 usb_log_fatal( \160 "Maximum number of failures reached, " \161 "bailing out.\n"); \162 return ret; \163 } \164 continue; \165 } else (void)0166 156 167 157 while (1) { … … 182 172 instance->id_string, port_status); 183 173 184 int ret = usb_hc_connection_open(&instance->hc_connection); 185 CHECK_RET_FAIL(ret, "%s: Failed to connect to HC %s.\n", 186 instance->id_string, str_error(ret)); 174 rc = usb_hc_connection_open(&instance->hc_connection); 175 if (rc != EOK) { 176 usb_log_error("%s: Failed to connect to HC %s.\n", 177 instance->id_string, str_error(rc)); 178 if (!(allowed_failures-- > 0)) 179 goto fatal_error; 180 continue; 181 } 187 182 188 183 /* Remove any old device */ … … 204 199 } 205 200 206 ret = usb_hc_connection_close(&instance->hc_connection); 207 CHECK_RET_FAIL(ret, "%s: Failed to disconnect from hc: %s.\n", 208 instance->id_string, str_error(ret)); 209 } 210 return EOK; 201 rc = usb_hc_connection_close(&instance->hc_connection); 202 if (rc != EOK) { 203 usb_log_error("%s: Failed to disconnect from HC %s.\n", 204 instance->id_string, str_error(rc)); 205 if (!(allowed_failures-- > 0)) 206 goto fatal_error; 207 continue; 208 } 209 } 210 211 return EOK; 212 213 fatal_error: 214 usb_log_fatal("Maximum number of failures reached, bailing out.\n"); 215 return rc; 211 216 } 212 217 -
uspace/drv/char/ns8250/ns8250.c
r98abd40 rcdc8a391 420 420 ns->irq = res->res.interrupt.irq; 421 421 irq = true; 422 ddf_msg(LVL_NOTE, "Device %s was as igned irq = 0x%x.",422 ddf_msg(LVL_NOTE, "Device %s was assigned irq = 0x%x.", 423 423 ddf_dev_get_name(ns->dev), ns->irq); 424 424 break; … … 433 433 } 434 434 ioport = true; 435 ddf_msg(LVL_NOTE, "Device %s was as igned I/O address = "435 ddf_msg(LVL_NOTE, "Device %s was assigned I/O address = " 436 436 "0x%x.", ddf_dev_get_name(ns->dev), ns->io_addr); 437 437 break; … … 827 827 ddf_fun_t *fun = NULL; 828 828 bool need_cleanup = false; 829 bool need_unreg_intr_handler = false; 829 830 int rc; 830 831 … … 869 870 goto fail; 870 871 } 872 need_unreg_intr_handler = true; 871 873 872 874 /* Enable interrupt. */ … … 903 905 if (fun != NULL) 904 906 ddf_fun_destroy(fun); 907 if (need_unreg_intr_handler) 908 ns8250_unregister_interrupt_handler(ns); 905 909 if (need_cleanup) 906 910 ns8250_dev_cleanup(ns); -
uspace/srv/fs/mfs/mfs_balloc.c
r98abd40 rcdc8a391 128 128 start_block = 2 + sbi->ibmap_blocks; 129 129 if (idx > sbi->nzones) { 130 printf(NAME ": Error! Trying to free beyond the " \130 printf(NAME ": Error! Trying to free beyond the " 131 131 "bitmap max size\n"); 132 132 return -1; … … 137 137 start_block = 2; 138 138 if (idx > sbi->ninodes) { 139 printf(NAME ": Error! Trying to free beyond the " \139 printf(NAME ": Error! Trying to free beyond the " 140 140 "bitmap max size\n"); 141 141 return -1; … … 202 202 start_block = 2; 203 203 nblocks = sbi->ibmap_blocks; 204 limit = sbi->ninodes ;204 limit = sbi->ninodes - 1; 205 205 } 206 206 bits_per_block = sbi->block_size * 8; -
uspace/srv/fs/mfs/mfs_dentry.c
r98abd40 rcdc8a391 36 36 * 37 37 * @param mnode Pointer to the directory node. 38 * @param d_info Pointer to a directory entry structure where the dentry info39 * will be stored.38 * @param d_info Pointer to a directory entry structure where 39 * the dentry info will be stored. 40 40 * @param index index of the dentry in the list. 41 41 * … … 101 101 /**Write a directory entry on disk. 102 102 * 103 * @param d_info Pointer to the directory entry structure to write ondisk.103 * @param d_info The directory entry to write to disk. 104 104 * 105 105 * @return EOK on success or a negative error code. … … 240 240 goto out; 241 241 r = mfs_write_map(mnode, pos, b, &dummy); 242 if (r != EOK) 242 if (r != EOK) { 243 mfs_free_zone(mnode->instance, b); 243 244 goto out; 245 } 244 246 } 245 247 -
uspace/srv/fs/mfs/mfs_ops.c
r98abd40 rcdc8a391 88 88 89 89 /* Hash table interface for open nodes hash table */ 90 91 90 typedef struct { 92 91 service_id_t service_id; … … 190 189 /* This is a V1 or V2 Minix filesystem */ 191 190 magic = sb->s_magic; 192 } else if (check_magic_number(sb3->s_magic, &native, &version, &longnames)) { 191 } else if (check_magic_number(sb3->s_magic, &native, 192 &version, &longnames)) { 193 193 /* This is a V3 Minix filesystem */ 194 194 magic = sb3->s_magic; … … 345 345 uint32_t inum; 346 346 347 mfsdebug("%s()\n", __FUNCTION__);348 349 347 r = mfs_instance_get(service_id, &inst); 350 348 if (r != EOK) … … 379 377 ino_i->i_mode = S_IFDIR; 380 378 ino_i->i_nlinks = 1; /* This accounts for the '.' dentry */ 381 } else 379 } else { 382 380 ino_i->i_mode = S_IFREG; 381 ino_i->i_nlinks = 0; 382 } 383 383 384 384 ino_i->i_uid = 0; … … 419 419 free(ino_i); 420 420 out_err: 421 mfs_free_inode(inst, inum); 421 422 return r; 422 423 } … … 429 430 struct mfs_dentry_info d_info; 430 431 int r; 431 432 mfsdebug("%s()\n", __FUNCTION__);433 432 434 433 if (!S_ISDIR(ino_i->i_mode)) … … 478 477 struct mfs_instance *instance; 479 478 480 mfsdebug("%s()\n", __FUNCTION__);481 482 479 rc = mfs_instance_get(service_id, &instance); 483 480 if (rc != EOK) … … 492 489 int rc = EOK; 493 490 struct mfs_node *mnode = fsnode->data; 494 495 mfsdebug("%s()\n", __FUNCTION__);496 491 497 492 fibril_mutex_lock(&open_nodes_lock); … … 554 549 int rc; 555 550 556 mfsdebug("%s()\n", __FUNCTION__);557 558 551 fibril_mutex_lock(&open_nodes_lock); 559 552 … … 568 561 if (already_open) { 569 562 mnode = hash_table_get_inst(already_open, struct mfs_node, link); 563 570 564 *rfn = mnode->fsnode; 571 565 mnode->refcnt++; … … 649 643 bool destroy_dentry = false; 650 644 651 mfsdebug("%s()\n", __FUNCTION__);652 653 645 if (str_size(name) > sbi->max_name_len) 654 646 return ENAMETOOLONG; … … 673 665 r = mfs_insert_dentry(child, "..", parent->ino_i->index); 674 666 if (r != EOK) { 667 mfs_remove_dentry(child, "."); 675 668 destroy_dentry = true; 676 669 goto exit; … … 700 693 bool has_children; 701 694 int r; 702 703 mfsdebug("%s()\n", __FUNCTION__);704 695 705 696 if (!parent) … … 924 915 925 916 r = mfs_write_map(mnode, pos, block, &dummy); 926 if (r != EOK) 917 if (r != EOK) { 918 mfs_free_zone(mnode->instance, block); 927 919 goto out_err; 920 } 928 921 929 922 flags = BLOCK_FLAGS_NOREAD; … … 965 958 mfs_destroy(service_id_t service_id, fs_index_t index) 966 959 { 967 fs_node_t *fn ;960 fs_node_t *fn = NULL; 968 961 int r; 969 962
Note:
See TracChangeset
for help on using the changeset viewer.