Changeset fa2f79d in mainline
- Timestamp:
- 2011-02-15T21:26:05Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 563fb40
- Parents:
- 47c573a (diff), f294926 (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:
-
- 4 added
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-rhd/port.c
r47c573a rfa2f79d 36 36 37 37 #include <usb/usb.h> /* usb_address_t */ 38 #include <usb/usbdrv.h> /* usb_drv_* */ 38 #include <usb/usbdevice.h> 39 #include <usb/hub.h> 40 #include <usb/request.h> 39 41 #include <usb/debug.h> 40 42 #include <usb/recognise.h> … … 58 60 port->attached_device = 0; 59 61 port->rh = rh; 60 port->hc_phone = parent_phone; 62 int rc = usb_hc_connection_initialize_from_device( 63 &port->hc_connection, rh); 64 if (rc != EOK) { 65 usb_log_error("Failed to initialize connection to HC."); 66 return rc; 67 } 61 68 62 69 port->checker = fibril_create(uhci_port_check, port); … … 98 105 99 106 if (port_status & STATUS_CONNECTED_CHANGED) { 107 int rc = usb_hc_connection_open( 108 &port_instance->hc_connection); 109 if (rc != EOK) { 110 usb_log_error("Failed to connect to HC."); 111 goto next; 112 } 113 100 114 if (port_status & STATUS_CONNECTED) { 101 115 /* new device */ … … 104 118 uhci_port_remove_device(port_instance); 105 119 } 120 121 rc = usb_hc_connection_close( 122 &port_instance->hc_connection); 123 if (rc != EOK) { 124 usb_log_error("Failed to disconnect from HC."); 125 goto next; 126 } 106 127 } 128 next: 107 129 async_usleep(port_instance->wait_period_usec); 108 130 } … … 113 135 { 114 136 assert(port); 115 assert( port->hc_phone);137 assert(usb_hc_connection_is_opened(&port->hc_connection)); 116 138 117 139 usb_log_info("Adding new device on port %d.\n", port->number); 118 140 119 141 /* get address of the future device */ 120 const usb_address_t usb_address = usb_ drv_request_address(port->hc_phone);142 const usb_address_t usb_address = usb_hc_request_address(&port->hc_connection); 121 143 122 144 if (usb_address <= 0) { … … 128 150 129 151 /* get default address */ 130 int ret = usb_ drv_reserve_default_address(port->hc_phone);152 int ret = usb_hc_reserve_default_address(&port->hc_connection); 131 153 if (ret != EOK) { 132 154 usb_log_error("Failed to reserve default address on port %d.\n", 133 155 port->number); 134 int ret2 = 135 usb_drv_release_address(port->hc_phone,usb_address);156 int ret2 = usb_hc_unregister_device(&port->hc_connection, 157 usb_address); 136 158 if (ret2 != EOK) { 137 159 usb_log_fatal("Failed to return requested address on port %d.\n", … … 174 196 } 175 197 176 /* assign address to device */ 177 ret = usb_drv_req_set_address(port->hc_phone, 0, usb_address); 198 /* 199 * Initialize connection to the device. 200 */ 201 /* FIXME: check for errors. */ 202 usb_device_connection_t new_dev_connection; 203 usb_endpoint_pipe_t new_dev_ctrl_pipe; 204 usb_device_connection_initialize_on_default_address( 205 &new_dev_connection, &port->hc_connection); 206 usb_endpoint_pipe_initialize_default_control(&new_dev_ctrl_pipe, 207 &new_dev_connection); 208 209 /* 210 * Assign new address to the device. This function updates 211 * the backing connection to still point to the same device. 212 */ 213 /* FIXME: check for errors. */ 214 usb_endpoint_pipe_start_session(&new_dev_ctrl_pipe); 215 ret = usb_request_set_address(&new_dev_ctrl_pipe, usb_address); 216 usb_endpoint_pipe_end_session(&new_dev_ctrl_pipe); 178 217 179 218 if (ret != EOK) { /* address assigning went wrong */ 180 219 usb_log_error("Failed(%d) to assign address to the device.\n", ret); 181 220 uhci_port_set_enabled(port, false); 182 int release = usb_ drv_release_default_address(port->hc_phone);221 int release = usb_hc_release_default_address(&port->hc_connection); 183 222 if (release != EOK) { 184 223 usb_log_error("Failed to release default address on port %d.\n", … … 194 233 195 234 /* release default address */ 196 ret = usb_ drv_release_default_address(port->hc_phone);235 ret = usb_hc_release_default_address(&port->hc_connection); 197 236 if (ret != EOK) { 198 237 usb_log_error("Failed to release default address on port %d.\n", … … 206 245 assert(port->attached_device == 0); 207 246 208 devman_handle_t hc_handle; 209 ret = usb_drv_find_hc(port->rh, &hc_handle); 210 if (ret != EOK) { 211 usb_log_error("Failed to get handle of host controller: %s.\n", 212 str_error(ret)); 213 uhci_port_set_enabled(port, false); 214 return ENOMEM; 215 } 216 217 ret = usb_device_register_child_in_devman(usb_address, hc_handle, 218 port->rh, &port->attached_device); 247 ret = usb_device_register_child_in_devman(new_dev_connection.address, 248 new_dev_connection.hc_handle, port->rh, &port->attached_device); 249 219 250 if (ret != EOK) { /* something went wrong */ 220 251 usb_log_error("Failed(%d) in usb_drv_register_child.\n", ret); … … 225 256 port->number, usb_address, port->attached_device); 226 257 227 ret = 228 usb_drv_bind_address(port->hc_phone, usb_address, port->attached_device); 258 /* 259 * Register the device in the host controller. 260 */ 261 usb_hc_attached_device_t new_device = { 262 .address = new_dev_connection.address, 263 .handle = port->attached_device 264 }; 265 266 ret = usb_hc_register_device(&port->hc_connection, &new_device); 229 267 // TODO: proper error check here 230 268 assert(ret == EOK); -
uspace/drv/uhci-rhd/port.h
r47c573a rfa2f79d 38 38 #include <driver.h> /* device_t */ 39 39 #include <stdint.h> 40 #include <usb/usbdevice.h> 40 41 41 42 #include "port_status.h" … … 46 47 unsigned number; 47 48 unsigned wait_period_usec; 48 int hc_phone;49 usb_hc_connection_t hc_connection; 49 50 device_t *rh; 50 51 devman_handle_t attached_device; -
uspace/drv/vhc/connhost.c
r47c573a rfa2f79d 64 64 65 65 static void universal_callback(void *buffer, size_t size, 66 usb_transaction_outcome_t outcome, void *arg)66 int outcome, void *arg) 67 67 { 68 68 transfer_info_t *transfer = (transfer_info_t *) arg; … … 107 107 108 108 static void control_abort_prematurely(control_transfer_info_t *transfer, 109 size_t size, usb_transaction_outcome_t outcome)109 size_t size, int outcome) 110 110 { 111 111 switch (transfer->direction) { … … 127 127 128 128 static void control_callback_two(void *buffer, size_t size, 129 usb_transaction_outcome_t outcome, void *arg)129 int outcome, void *arg) 130 130 { 131 131 control_transfer_info_t *ctrl_transfer = (control_transfer_info_t *) arg; 132 132 133 if (outcome != USB_OUTCOME_OK) {133 if (outcome != EOK) { 134 134 control_abort_prematurely(ctrl_transfer, outcome, size); 135 135 free(ctrl_transfer); … … 165 165 166 166 static void control_callback_one(void *buffer, size_t size, 167 usb_transaction_outcome_t outcome, void *arg)167 int outcome, void *arg) 168 168 { 169 169 control_transfer_info_t *transfer = (control_transfer_info_t *) arg; 170 170 171 if (outcome != USB_OUTCOME_OK) {171 if (outcome != EOK) { 172 172 control_abort_prematurely(transfer, outcome, size); 173 173 free(transfer); -
uspace/drv/vhc/devices.c
r47c573a rfa2f79d 112 112 * @param transaction Transaction to be sent over the bus. 113 113 */ 114 usb_transaction_outcome_t virtdev_send_to_all(transaction_t *transaction)114 int virtdev_send_to_all(transaction_t *transaction) 115 115 { 116 116 /* For easier debugging. */ … … 126 126 assert(false && "unreachable branch in switch()"); 127 127 } 128 usb_transaction_outcome_t outcome = USB_OUTCOME_BABBLE;128 int outcome = EBADCHECKSUM; 129 129 130 130 link_t *pos; … … 185 185 */ 186 186 if (rc == EOK) { 187 outcome = USB_OUTCOME_OK;187 outcome = EOK; 188 188 } 189 189 } … … 221 221 break; 222 222 } 223 outcome = USB_OUTCOME_OK;223 outcome = EOK; 224 224 } 225 225 -
uspace/drv/vhc/devices.h
r47c573a rfa2f79d 54 54 virtdev_connection_t *virtdev_find(sysarg_t); 55 55 void virtdev_destroy_device(virtdev_connection_t *); 56 usb_transaction_outcome_t virtdev_send_to_all(transaction_t *);56 int virtdev_send_to_all(transaction_t *); 57 57 58 58 #endif -
uspace/drv/vhc/hc.c
r47c573a rfa2f79d 89 89 */ 90 90 static void process_transaction_with_outcome(transaction_t * transaction, 91 usb_transaction_outcome_t outcome)91 int outcome) 92 92 { 93 93 usb_log_debug2("Transaction " TRANSACTION_FORMAT " done: %s.\n", 94 94 TRANSACTION_PRINTF(*transaction), 95 usb_str_transaction_outcome(outcome));95 str_error(outcome)); 96 96 97 97 transaction->callback(transaction->buffer, transaction->actual_len, … … 127 127 TRANSACTION_PRINTF(*transaction), ports); 128 128 129 usb_transaction_outcome_t outcome;129 int outcome; 130 130 outcome = virtdev_send_to_all(transaction); 131 131 -
uspace/drv/vhc/hc.h
r47c573a rfa2f79d 47 47 */ 48 48 typedef void (*hc_transaction_done_callback_t)(void *buffer, size_t size, 49 usb_transaction_outcome_t outcome, void *arg);49 int outcome, void *arg); 50 50 51 51 /** Pending transaction details. */ -
uspace/lib/c/generic/str_error.c
r47c573a rfa2f79d 33 33 */ 34 34 35 #include <errno.h> 35 36 #include <str_error.h> 36 37 #include <stdio.h> … … 63 64 static fibril_local char noerr[NOERR_LEN]; 64 65 65 const char *str_error(const int e rrno)66 const char *str_error(const int e) 66 67 { 67 if ((e rrno <= 0) && (errno>= MIN_ERRNO))68 return err_desc[-e rrno];68 if ((e <= 0) && (e >= MIN_ERRNO)) 69 return err_desc[-e]; 69 70 70 snprintf(noerr, NOERR_LEN, "Unkown error code %d", errno); 71 /* Ad hoc descriptions of error codes interesting for USB. */ 72 switch (e) { 73 case EBADCHECKSUM: 74 return "Bad checksum"; 75 case EAGAIN: 76 return "Resource temporarily unavailable"; 77 default: 78 break; 79 } 80 81 snprintf(noerr, NOERR_LEN, "Unkown error code %d", e); 71 82 return noerr; 72 83 } -
uspace/lib/c/include/errno.h
r47c573a rfa2f79d 56 56 #define EMLINK (-266) 57 57 58 /** Bad checksum. */ 59 #define EBADCHECKSUM (-300) 60 58 61 /** An API function is called while another blocking function is in progress. */ 59 62 #define EINPROGRESS (-10036) -
uspace/lib/drv/generic/remote_usbhc.c
r47c573a rfa2f79d 240 240 241 241 static void callback_out(device_t *device, 242 usb_transaction_outcome_t outcome, void *arg)242 int outcome, void *arg) 243 243 { 244 244 async_transaction_t *trans = (async_transaction_t *)arg; … … 250 250 251 251 static void callback_in(device_t *device, 252 usb_transaction_outcome_t outcome, size_t actual_size, void *arg)252 int outcome, size_t actual_size, void *arg) 253 253 { 254 254 async_transaction_t *trans = (async_transaction_t *)arg; 255 255 256 if (outcome != USB_OUTCOME_OK) {256 if (outcome != EOK) { 257 257 async_answer_0(trans->caller, outcome); 258 258 if (trans->data_caller) { … … 270 270 } 271 271 272 async_answer_0(trans->caller, USB_OUTCOME_OK);272 async_answer_0(trans->caller, EOK); 273 273 274 274 async_transaction_destroy(trans); -
uspace/lib/drv/include/usbhc_iface.h
r47c573a rfa2f79d 207 207 /** Callback for outgoing transfer. */ 208 208 typedef void (*usbhc_iface_transfer_out_callback_t)(device_t *, 209 usb_transaction_outcome_t, void *);209 int, void *); 210 210 211 211 /** Callback for incoming transfer. */ 212 212 typedef void (*usbhc_iface_transfer_in_callback_t)(device_t *, 213 usb_transaction_outcome_t, size_t, void *);213 int, size_t, void *); 214 214 215 215 -
uspace/lib/usb/Makefile
r47c573a rfa2f79d 40 40 src/dump.c \ 41 41 src/hidparser.c \ 42 src/hub.c \ 42 43 src/pipes.c \ 43 44 src/pipesinit.c \ … … 46 47 src/request.c \ 47 48 src/usb.c \ 49 src/usbdevice.c \ 48 50 src/usbdrvreq.c \ 49 51 src/usbdrv.c \ -
uspace/lib/usb/include/usb/pipes.h
r47c573a rfa2f79d 31 31 */ 32 32 /** @file 33 * Communication between device drivers and host controller driver.33 * USB pipes representation. 34 34 */ 35 35 #ifndef LIBUSB_PIPES_H_ … … 38 38 #include <sys/types.h> 39 39 #include <usb/usb.h> 40 #include <usb/usbdevice.h> 40 41 #include <usb/descriptor.h> 41 42 #include <ipc/devman.h> … … 114 115 } usb_endpoint_mapping_t; 115 116 117 int usb_device_connection_initialize_on_default_address( 118 usb_device_connection_t *, usb_hc_connection_t *); 116 119 int usb_device_connection_initialize_from_device(usb_device_connection_t *, 117 120 device_t *); -
uspace/lib/usb/include/usb/usb.h
r47c573a rfa2f79d 83 83 } usb_request_recipient_t; 84 84 85 /** USB transaction outcome. */86 typedef enum {87 USB_OUTCOME_OK,88 USB_OUTCOME_CRCERROR,89 USB_OUTCOME_BABBLE90 } usb_transaction_outcome_t;91 92 const char * usb_str_transaction_outcome(usb_transaction_outcome_t o);93 94 85 /** USB address type. 95 86 * Negative values could be used to indicate error. -
uspace/lib/usb/src/pipes.c
r47c573a rfa2f79d 102 102 } 103 103 104 /** Initialize connection to USB device on default address. 105 * 106 * @param dev_connection Device connection structure to be initialized. 107 * @param hc_connection Initialized connection to host controller. 108 * @return Error code. 109 */ 110 int usb_device_connection_initialize_on_default_address( 111 usb_device_connection_t *dev_connection, 112 usb_hc_connection_t *hc_connection) 113 { 114 assert(dev_connection); 115 116 if (hc_connection == NULL) { 117 return EBADMEM; 118 } 119 120 return usb_device_connection_initialize(dev_connection, 121 hc_connection->hc_handle, (usb_address_t) 0); 122 } 123 104 124 105 125 /** Start a session on the endpoint pipe. -
uspace/lib/usb/src/usb.c
r47c573a rfa2f79d 54 54 } 55 55 56 /** String representation of USB transaction outcome. */57 const char * usb_str_transaction_outcome(usb_transaction_outcome_t o)58 {59 switch (o) {60 case USB_OUTCOME_OK:61 return "ok";62 case USB_OUTCOME_CRCERROR:63 return "CRC error";64 case USB_OUTCOME_BABBLE:65 return "babble";66 default:67 return "unknown";68 }69 }70 71 72 56 /** 73 57 * @}
Note:
See TracChangeset
for help on using the changeset viewer.