- Timestamp:
- 2010-12-04T20:37:19Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b5ec347
- Parents:
- 4144630 (diff), 35537a7 (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:
-
- 7 added
- 22 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/Makefile
r4144630 r45e9cc6 118 118 DIRS += drv/ns8250 119 119 DIRS += drv/uhci 120 DIRS += drv/usbhub 120 121 DIRS += drv/usbkbd 121 122 endif -
uspace/drv/uhci/Makefile
r4144630 r45e9cc6 33 33 34 34 SOURCES = \ 35 main.c 35 main.c \ 36 transfers.c 36 37 37 38 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/uhci/main.c
r4144630 r45e9cc6 28 28 #include <usb/hcdhubd.h> 29 29 #include <errno.h> 30 #include "uhci.h" 30 31 31 static int enqueue_transfer_out(usb_hc_device_t *hc, 32 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 33 void *buffer, size_t size, 34 usb_hcd_transfer_callback_out_t callback, void *arg) 35 { 36 printf("UHCI: transfer OUT [%d.%d (%s); %u]\n", 37 dev->address, endpoint->endpoint, 38 usb_str_transfer_type(endpoint->transfer_type), 39 size); 40 return ENOTSUP; 41 } 42 43 static int enqueue_transfer_setup(usb_hc_device_t *hc, 44 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 45 void *buffer, size_t size, 46 usb_hcd_transfer_callback_out_t callback, void *arg) 47 { 48 printf("UHCI: transfer SETUP [%d.%d (%s); %u]\n", 49 dev->address, endpoint->endpoint, 50 usb_str_transfer_type(endpoint->transfer_type), 51 size); 52 return ENOTSUP; 53 } 54 55 static int enqueue_transfer_in(usb_hc_device_t *hc, 56 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 57 void *buffer, size_t size, 58 usb_hcd_transfer_callback_in_t callback, void *arg) 59 { 60 printf("UHCI: transfer IN [%d.%d (%s); %u]\n", 61 dev->address, endpoint->endpoint, 62 usb_str_transfer_type(endpoint->transfer_type), 63 size); 64 return ENOTSUP; 65 } 66 67 static usb_hcd_transfer_ops_t uhci_transfer_ops = { 68 .transfer_out = enqueue_transfer_out, 69 .transfer_in = enqueue_transfer_in, 70 .transfer_setup = enqueue_transfer_setup 32 static device_ops_t uhci_ops = { 33 .interfaces[USBHC_DEV_IFACE] = &uhci_iface, 71 34 }; 72 35 73 static int uhci_add_ hc(usb_hc_device_t *device)36 static int uhci_add_device(device_t *device) 74 37 { 75 device-> transfer_ops = &uhci_transfer_ops;38 device->ops = &uhci_ops; 76 39 77 40 /* 78 41 * We need to announce the presence of our root hub. 79 * Commented out until the problem which causes the whole task to80 * block is solved.81 42 */ 82 //usb_hcd_add_root_hub(device);43 usb_hcd_add_root_hub(device); 83 44 84 45 return EOK; 85 46 } 86 47 87 usb_hc_driver_t uhci_driver = { 88 .name = "uhci", 89 .add_hc = uhci_add_hc 48 static driver_ops_t uhci_driver_ops = { 49 .add_device = uhci_add_device, 50 }; 51 52 static driver_t uhci_driver = { 53 .name = NAME, 54 .driver_ops = &uhci_driver_ops 90 55 }; 91 56 … … 95 60 * Do some global initializations. 96 61 */ 62 sleep(5); 97 63 98 return usb_hcd_main(&uhci_driver);64 return driver_main(&uhci_driver); 99 65 } -
uspace/drv/uhci/uhci.ma
r4144630 r45e9cc6 1 1 10 pci/ven=8086&dev=7020 2 10 usb&hc=uhci 3 10 usb&hc=uhci&hub 2 -
uspace/drv/usbhub/utils.c
r4144630 r45e9cc6 33 33 * @brief Hub driver. 34 34 */ 35 #include < usb/hcdhubd.h>35 #include <driver.h> 36 36 #include <usb/devreq.h> 37 37 #include <usbhc_iface.h> 38 #include <usb/usbdrv.h> 38 39 #include <usb/descriptor.h> 39 40 #include <driver.h> … … 41 42 #include <errno.h> 42 43 #include <usb/classes/hub.h> 43 #include " hcdhubd_private.h"44 #include "usbhub.h" 44 45 45 46 static void check_hub_changes(void); … … 108 109 //********************************************* 109 110 110 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address);111 112 111 usb_hcd_hub_info_t * usb_create_hub_info(device_t * device) { 113 112 usb_hcd_hub_info_t* result = (usb_hcd_hub_info_t*) malloc(sizeof (usb_hcd_hub_info_t)); 114 //get parent device115 device_t * my_hcd = device;116 while (my_hcd->parent)117 my_hcd = my_hcd->parent;118 //dev->119 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);120 //we add the hub into the first hc121 //link_t *link_hc = hc_list.next;122 //usb_hc_device_t *hc = list_get_instance(link_hc,123 // usb_hc_device_t, link);124 //must get generic device info125 126 113 127 114 return result; … … 134 121 */ 135 122 int usb_add_hub_device(device_t *dev) { 136 //usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 137 assert(dev->parent); 138 usb_hc_device_t *hc = (usb_hc_device_t*)dev->parent->driver_data; 139 usb_address_t addr =usb_use_free_address(hc); 140 if(addr<0){ 141 printf("[hcdhubd] ERROR: cannot find an address \n"); 142 } 143 set_hub_address(hc, addr); 123 printf(NAME ": add_hub_device(handle=%d)\n", (int) dev->handle); 144 124 145 125 check_hub_changes(); … … 150 130 * connected devices. 151 131 */ 152 //insert hub into list153 //find owner hcd154 device_t * my_hcd = dev;155 while (my_hcd->parent)156 my_hcd = my_hcd->parent;157 //dev->158 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);159 my_hcd = dev;160 while (my_hcd->parent)161 my_hcd = my_hcd->parent;162 //dev->163 164 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);165 132 166 133 //create the hub structure 167 134 usb_hcd_hub_info_t * hub_info = usb_create_hub_info(dev); 168 169 170 //append into the list 171 //we add the hub into the first hc 172 list_append(&hub_info->link, &hc->hubs); 173 174 135 (void)hub_info; 175 136 176 137 return EOK; … … 178 139 } 179 140 180 /** Sample usage of usb_hc_async functions.181 * This function sets hub address using standard SET_ADDRESS request.182 *183 * @warning This function shall be removed once you are familiar with184 * the usb_hc_ API.185 *186 * @param hc Host controller the hub belongs to.187 * @param address New hub address.188 */189 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) {190 printf("[hcdhubd]%s: setting hub address to %d\n", hc->generic->name, address);191 usb_target_t target = {0, 0};192 usb_handle_t handle;193 int rc;194 195 usb_device_request_setup_packet_t setup_packet = {196 .request_type = 0,197 .request = USB_DEVREQ_SET_ADDRESS,198 .index = 0,199 .length = 0,200 };201 setup_packet.value = address;202 203 rc = usb_hc_async_control_write_setup(hc, target,204 &setup_packet, sizeof (setup_packet), &handle);205 if (rc != EOK) {206 return;207 }208 209 rc = usb_hc_async_wait_for(handle);210 if (rc != EOK) {211 return;212 }213 214 rc = usb_hc_async_control_write_status(hc, target, &handle);215 if (rc != EOK) {216 return;217 }218 219 rc = usb_hc_async_wait_for(handle);220 if (rc != EOK) {221 return;222 }223 224 printf("[hcdhubd]%s: hub address changed successfully to %d\n",225 hc->generic->name, address);226 }227 141 228 142 /** Check changes on all known hubs. … … 230 144 static void check_hub_changes(void) { 231 145 /* 232 * Iterate through all HCs.146 * Iterate through all hubs. 233 147 */ 234 link_t *link_hc; 235 for (link_hc = hc_list.next; 236 link_hc != &hc_list; 237 link_hc = link_hc->next) { 238 usb_hc_device_t *hc = list_get_instance(link_hc, 239 usb_hc_device_t, link); 240 /* 241 * Iterate through all their hubs. 242 */ 243 link_t *link_hub; 244 for (link_hub = hc->hubs.next; 245 link_hub != &hc->hubs; 246 link_hub = link_hub->next) { 247 usb_hcd_hub_info_t *hub = list_get_instance(link_hub, 248 usb_hcd_hub_info_t, link); 249 250 /* 251 * Check status change pipe of this hub. 252 */ 253 usb_target_t target = { 254 .address = hub->device->address, 255 .endpoint = 1 256 }; 257 258 // FIXME: count properly 259 size_t byte_length = (hub->port_count / 8) + 1; 260 261 void *change_bitmap = malloc(byte_length); 262 size_t actual_size; 263 usb_handle_t handle; 264 265 /* 266 * Send the request. 267 * FIXME: check returned value for possible errors 268 */ 269 usb_hc_async_interrupt_in(hc, target, 270 change_bitmap, byte_length, &actual_size, 271 &handle); 272 273 usb_hc_async_wait_for(handle); 274 275 /* 276 * TODO: handle the changes. 277 */ 148 for (; false; ) { 149 /* 150 * Check status change pipe of this hub. 151 */ 152 usb_target_t target = { 153 .address = 5, 154 .endpoint = 1 155 }; 156 157 size_t port_count = 7; 158 159 /* 160 * Connect to respective HC. 161 */ 162 int hc = usb_drv_hc_connect(NULL, 0); 163 if (hc < 0) { 164 continue; 278 165 } 166 167 // FIXME: count properly 168 size_t byte_length = (port_count / 8) + 1; 169 170 void *change_bitmap = malloc(byte_length); 171 size_t actual_size; 172 usb_handle_t handle; 173 174 /* 175 * Send the request. 176 * FIXME: check returned value for possible errors 177 */ 178 usb_drv_async_interrupt_in(hc, target, 179 change_bitmap, byte_length, &actual_size, 180 &handle); 181 182 usb_drv_async_wait_for(handle); 183 184 /* 185 * TODO: handle the changes. 186 */ 187 188 /* 189 * WARNING: sample code, will not work out of the box. 190 * And does not contain code for checking for errors. 191 */ 192 #if 0 193 /* 194 * Before opening the port, we must acquire the default 195 * address. 196 */ 197 usb_drv_reserve_default_address(hc); 198 199 usb_address_t new_device_address = usb_drv_request_address(hc); 200 201 // TODO: open the port 202 203 // TODO: send request for setting address to new_device_address 204 205 /* 206 * Once new address is set, we can release the default 207 * address. 208 */ 209 usb_drv_release_default_address(hc); 210 211 /* 212 * Obtain descriptors and create match ids for devman. 213 */ 214 215 // TODO: get device descriptors 216 217 // TODO: create match ids 218 219 // TODO: add child device 220 221 // child_device_register sets the device handle 222 // TODO: store it here 223 devman_handle_t new_device_handle = 0; 224 225 /* 226 * Inform the HC that the new device has devman handle 227 * assigned. 228 */ 229 usb_drv_bind_address(hc, new_device_address, new_device_handle); 230 231 /* 232 * That's all. 233 */ 234 #endif 235 236 237 /* 238 * Hang-up the HC-connected phone. 239 */ 240 ipc_hangup(hc); 279 241 } 280 242 } -
uspace/drv/vhc/Makefile
r4144630 r45e9cc6 39 39 40 40 SOURCES = \ 41 addrmgm.c \ 41 42 conndev.c \ 42 43 connhost.c \ -
uspace/drv/vhc/conn.h
r4144630 r45e9cc6 38 38 #include <usb/usb.h> 39 39 #include <usb/hcdhubd.h> 40 #include <usbhc_iface.h> 40 41 #include "vhcd.h" 41 42 #include "devices.h" … … 44 45 45 46 usb_hcd_transfer_ops_t vhc_transfer_ops; 47 usbhc_iface_t vhc_iface; 48 49 void address_init(void); 50 int reserve_default_address(device_t *); 51 int release_default_address(device_t *); 52 int request_address(device_t *, usb_address_t *); 53 int release_address(device_t *, usb_address_t); 54 int bind_address(device_t *, usb_address_t, devman_handle_t); 55 56 int tell_address(device_t *, devman_handle_t, usb_address_t *); 46 57 47 58 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *); -
uspace/drv/vhc/connhost.c
r4144630 r45e9cc6 43 43 typedef struct { 44 44 usb_direction_t direction; 45 usb _hcd_transfer_callback_out_t out_callback;46 usb _hcd_transfer_callback_in_t in_callback;47 usb_hc_device_t *hc;45 usbhc_iface_transfer_out_callback_t out_callback; 46 usbhc_iface_transfer_in_callback_t in_callback; 47 device_t *dev; 48 48 void *arg; 49 49 } transfer_info_t; … … 56 56 switch (transfer->direction) { 57 57 case USB_DIRECTION_IN: 58 transfer->in_callback(transfer-> hc,58 transfer->in_callback(transfer->dev, 59 59 size, outcome, 60 60 transfer->arg); 61 61 break; 62 62 case USB_DIRECTION_OUT: 63 transfer->out_callback(transfer-> hc,63 transfer->out_callback(transfer->dev, 64 64 outcome, 65 65 transfer->arg); … … 73 73 } 74 74 75 static transfer_info_t *create_transfer_info( usb_hc_device_t *hc,75 static transfer_info_t *create_transfer_info(device_t *dev, 76 76 usb_direction_t direction, void *arg) 77 77 { … … 82 82 transfer->out_callback = NULL; 83 83 transfer->arg = arg; 84 transfer-> hc = hc;84 transfer->dev = dev; 85 85 86 86 return transfer; 87 87 } 88 88 89 static int enqueue_transfer_out( usb_hc_device_t *hc,90 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,89 static int enqueue_transfer_out(device_t *dev, 90 usb_target_t target, usb_transfer_type_t transfer_type, 91 91 void *buffer, size_t size, 92 usb _hcd_transfer_callback_out_t callback, void *arg)92 usbhc_iface_transfer_out_callback_t callback, void *arg) 93 93 { 94 94 printf(NAME ": transfer OUT [%d.%d (%s); %u]\n", 95 dev->address, endpoint->endpoint,96 usb_str_transfer_type( endpoint->transfer_type),95 target.address, target.endpoint, 96 usb_str_transfer_type(transfer_type), 97 97 size); 98 98 99 99 transfer_info_t *transfer 100 = create_transfer_info( hc, USB_DIRECTION_OUT, arg);100 = create_transfer_info(dev, USB_DIRECTION_OUT, arg); 101 101 transfer->out_callback = callback; 102 103 usb_target_t target = {104 .address = dev->address,105 .endpoint = endpoint->endpoint106 };107 102 108 103 hc_add_transaction_to_device(false, target, buffer, size, … … 112 107 } 113 108 114 static int enqueue_transfer_setup( usb_hc_device_t *hc,115 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,109 static int enqueue_transfer_setup(device_t *dev, 110 usb_target_t target, usb_transfer_type_t transfer_type, 116 111 void *buffer, size_t size, 117 usb _hcd_transfer_callback_out_t callback, void *arg)112 usbhc_iface_transfer_out_callback_t callback, void *arg) 118 113 { 119 114 printf(NAME ": transfer SETUP [%d.%d (%s); %u]\n", 120 dev->address, endpoint->endpoint,121 usb_str_transfer_type( endpoint->transfer_type),115 target.address, target.endpoint, 116 usb_str_transfer_type(transfer_type), 122 117 size); 123 118 124 119 transfer_info_t *transfer 125 = create_transfer_info( hc, USB_DIRECTION_OUT, arg);120 = create_transfer_info(dev, USB_DIRECTION_OUT, arg); 126 121 transfer->out_callback = callback; 127 128 usb_target_t target = {129 .address = dev->address,130 .endpoint = endpoint->endpoint131 };132 122 133 123 hc_add_transaction_to_device(true, target, buffer, size, … … 137 127 } 138 128 139 static int enqueue_transfer_in( usb_hc_device_t *hc,140 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,129 static int enqueue_transfer_in(device_t *dev, 130 usb_target_t target, usb_transfer_type_t transfer_type, 141 131 void *buffer, size_t size, 142 usb _hcd_transfer_callback_in_t callback, void *arg)132 usbhc_iface_transfer_in_callback_t callback, void *arg) 143 133 { 144 134 printf(NAME ": transfer IN [%d.%d (%s); %u]\n", 145 dev->address, endpoint->endpoint,146 usb_str_transfer_type( endpoint->transfer_type),135 target.address, target.endpoint, 136 usb_str_transfer_type(transfer_type), 147 137 size); 148 138 149 139 transfer_info_t *transfer 150 = create_transfer_info( hc, USB_DIRECTION_IN, arg);140 = create_transfer_info(dev, USB_DIRECTION_IN, arg); 151 141 transfer->in_callback = callback; 152 153 usb_target_t target = {154 .address = dev->address,155 .endpoint = endpoint->endpoint156 };157 142 158 143 hc_add_transaction_from_device(target, buffer, size, … … 163 148 164 149 165 usb_hcd_transfer_ops_t vhc_transfer_ops = { 166 .transfer_out = enqueue_transfer_out, 167 .transfer_in = enqueue_transfer_in, 168 .transfer_setup = enqueue_transfer_setup 150 static int interrupt_out(device_t *dev, usb_target_t target, 151 void *data, size_t size, 152 usbhc_iface_transfer_out_callback_t callback, void *arg) 153 { 154 return enqueue_transfer_out(dev, target, USB_TRANSFER_INTERRUPT, 155 data, size, 156 callback, arg); 157 } 158 159 static int interrupt_in(device_t *dev, usb_target_t target, 160 void *data, size_t size, 161 usbhc_iface_transfer_in_callback_t callback, void *arg) 162 { 163 return enqueue_transfer_in(dev, target, USB_TRANSFER_INTERRUPT, 164 data, size, 165 callback, arg); 166 } 167 168 static int control_write_setup(device_t *dev, usb_target_t target, 169 void *data, size_t size, 170 usbhc_iface_transfer_out_callback_t callback, void *arg) 171 { 172 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL, 173 data, size, 174 callback, arg); 175 } 176 177 static int control_write_data(device_t *dev, usb_target_t target, 178 void *data, size_t size, 179 usbhc_iface_transfer_out_callback_t callback, void *arg) 180 { 181 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL, 182 data, size, 183 callback, arg); 184 } 185 186 static int control_write_status(device_t *dev, usb_target_t target, 187 usbhc_iface_transfer_in_callback_t callback, void *arg) 188 { 189 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL, 190 NULL, 0, 191 callback, arg); 192 } 193 194 static int control_read_setup(device_t *dev, usb_target_t target, 195 void *data, size_t size, 196 usbhc_iface_transfer_out_callback_t callback, void *arg) 197 { 198 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL, 199 data, size, 200 callback, arg); 201 } 202 203 static int control_read_data(device_t *dev, usb_target_t target, 204 void *data, size_t size, 205 usbhc_iface_transfer_in_callback_t callback, void *arg) 206 { 207 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL, 208 data, size, 209 callback, arg); 210 } 211 212 static int control_read_status(device_t *dev, usb_target_t target, 213 usbhc_iface_transfer_out_callback_t callback, void *arg) 214 { 215 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL, 216 NULL, 0, 217 callback, arg); 218 } 219 220 221 usbhc_iface_t vhc_iface = { 222 .tell_address = tell_address, 223 224 .reserve_default_address = reserve_default_address, 225 .release_default_address = release_default_address, 226 .request_address = request_address, 227 .bind_address = bind_address, 228 .release_address = release_address, 229 230 .interrupt_out = interrupt_out, 231 .interrupt_in = interrupt_in, 232 233 .control_write_setup = control_write_setup, 234 .control_write_data = control_write_data, 235 .control_write_status = control_write_status, 236 237 .control_read_setup = control_read_setup, 238 .control_read_data = control_read_data, 239 .control_read_status = control_read_status 169 240 }; 170 241 -
uspace/drv/vhc/hcd.c
r4144630 r45e9cc6 52 52 #include "conn.h" 53 53 54 static device_ops_t vhc_ops = { 55 .interfaces[USBHC_DEV_IFACE] = &vhc_iface, 56 .default_handler = default_connection_handler 57 }; 54 58 55 59 static int vhc_count = 0; 56 static int vhc_add_device( usb_hc_device_t *dev)60 static int vhc_add_device(device_t *dev) 57 61 { 58 62 /* … … 65 69 vhc_count++; 66 70 67 dev->transfer_ops = &vhc_transfer_ops; 68 dev->generic->ops->default_handler = default_connection_handler; 71 dev->ops = &vhc_ops; 72 73 /* 74 * Initialize address management. 75 */ 76 address_init(); 69 77 70 78 /* … … 79 87 } 80 88 81 static usb_hc_driver_t vhc_driver = { 89 static driver_ops_t vhc_driver_ops = { 90 .add_device = vhc_add_device, 91 }; 92 93 static driver_t vhc_driver = { 82 94 .name = NAME, 83 . add_hc = &vhc_add_device95 .driver_ops = &vhc_driver_ops 84 96 }; 85 97 … … 114 126 sleep(4); 115 127 116 return usb_hcd_main(&vhc_driver);128 return driver_main(&vhc_driver); 117 129 } 118 130 -
uspace/drv/vhc/vhc.ma
r4144630 r45e9cc6 1 1 10 usb&hc=vhc 2 10 usb&hc=vhc&hub 2 -
uspace/lib/block/libblock.c
r4144630 r45e9cc6 66 66 fibril_mutex_t lock; 67 67 size_t lblock_size; /**< Logical block size. */ 68 unsigned blocks_cluster; /**< Physical blocks per block_t */ 68 69 unsigned block_count; /**< Total number of blocks. */ 69 70 unsigned blocks_cached; /**< Number of cached blocks. */ … … 90 91 static int get_block_size(int dev_phone, size_t *bsize); 91 92 static int get_num_blocks(int dev_phone, aoff64_t *nblocks); 93 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba); 92 94 93 95 static devcon_t *devcon_search(devmap_handle_t devmap_handle) … … 259 261 { 260 262 block_t *b = hash_table_get_instance(item, block_t, hash_link); 261 return b-> boff== *key;263 return b->lba == *key; 262 264 } 263 265 … … 292 294 cache->mode = mode; 293 295 294 /* No block size translation a.t.m. */ 295 assert(cache->lblock_size == devcon->pblock_size); 296 /* Allow 1:1 or small-to-large block size translation */ 297 if (cache->lblock_size % devcon->pblock_size != 0) 298 return ENOTSUP; 299 300 cache->blocks_cluster = cache->lblock_size / devcon->pblock_size; 296 301 297 302 if (!hash_table_create(&cache->block_hash, CACHE_BUCKETS, 1, … … 329 334 if (b->dirty) { 330 335 memcpy(devcon->comm_area, b->data, b->size); 331 rc = write_blocks(devcon, b-> boff, 1);336 rc = write_blocks(devcon, b->pba, cache->blocks_cluster); 332 337 if (rc != EOK) 333 338 return rc; 334 339 } 335 340 336 unsigned long key = b-> boff;341 unsigned long key = b->lba; 337 342 hash_table_remove(&cache->block_hash, &key, 1); 338 343 … … 375 380 * block pointer on success. 376 381 * @param devmap_handle Device handle of the block device. 377 * @param b off Block offset.382 * @param ba Block address (logical). 378 383 * @param flags If BLOCK_FLAGS_NOREAD is specified, block_get() 379 384 * will not read the contents of the block from the … … 382 387 * @return EOK on success or a negative error code. 383 388 */ 384 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t b off, int flags)389 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t ba, int flags) 385 390 { 386 391 devcon_t *devcon; … … 388 393 block_t *b; 389 394 link_t *l; 390 unsigned long key = b off;395 unsigned long key = ba; 391 396 int rc; 392 397 … … 465 470 fibril_mutex_lock(&devcon->comm_area_lock); 466 471 memcpy(devcon->comm_area, b->data, b->size); 467 rc = write_blocks(devcon, b->boff, 1); 472 rc = write_blocks(devcon, b->pba, 473 cache->blocks_cluster); 468 474 fibril_mutex_unlock(&devcon->comm_area_lock); 469 475 if (rc != EOK) { … … 495 501 */ 496 502 list_remove(&b->free_link); 497 temp_key = b-> boff;503 temp_key = b->lba; 498 504 hash_table_remove(&cache->block_hash, &temp_key, 1); 499 505 } … … 502 508 b->devmap_handle = devmap_handle; 503 509 b->size = cache->lblock_size; 504 b->boff = boff; 510 b->lba = ba; 511 b->pba = ba_ltop(devcon, b->lba); 505 512 hash_table_insert(&cache->block_hash, &key, &b->hash_link); 506 513 … … 519 526 */ 520 527 fibril_mutex_lock(&devcon->comm_area_lock); 521 rc = read_blocks(devcon, b-> boff, 1);528 rc = read_blocks(devcon, b->pba, cache->blocks_cluster); 522 529 memcpy(b->data, devcon->comm_area, cache->lblock_size); 523 530 fibril_mutex_unlock(&devcon->comm_area_lock); … … 580 587 fibril_mutex_lock(&devcon->comm_area_lock); 581 588 memcpy(devcon->comm_area, block->data, block->size); 582 rc = write_blocks(devcon, block-> boff, 1);589 rc = write_blocks(devcon, block->pba, cache->blocks_cluster); 583 590 fibril_mutex_unlock(&devcon->comm_area_lock); 584 591 block->dirty = false; … … 614 621 * Take the block out of the cache and free it. 615 622 */ 616 unsigned long key = block-> boff;623 unsigned long key = block->lba; 617 624 hash_table_remove(&cache->block_hash, &key, 1); 618 625 free(block); … … 712 719 * 713 720 * @param devmap_handle Device handle of the block device. 714 * @param ba Address of first block .721 * @param ba Address of first block (physical). 715 722 * @param cnt Number of blocks. 716 723 * @param src Buffer for storing the data. … … 740 747 * 741 748 * @param devmap_handle Device handle of the block device. 742 * @param ba Address of first block .749 * @param ba Address of first block (physical). 743 750 * @param cnt Number of blocks. 744 751 * @param src The data to be written. … … 879 886 } 880 887 888 /** Convert logical block address to physical block address. */ 889 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba) 890 { 891 assert(devcon->cache != NULL); 892 return lba * devcon->cache->blocks_cluster; 893 } 894 881 895 /** @} 882 896 */ -
uspace/lib/block/libblock.h
r4144630 r45e9cc6 73 73 /** Handle of the device where the block resides. */ 74 74 devmap_handle_t devmap_handle; 75 /** Block offset on the block device. Counted in 'size'-byte blocks. */ 76 aoff64_t boff; 75 /** Logical block address */ 76 aoff64_t lba; 77 /** Physical block address */ 78 aoff64_t pba; 77 79 /** Size of the block. */ 78 80 size_t size; -
uspace/lib/drv/generic/remote_usbhc.c
r4144630 r45e9cc6 52 52 static void remote_usbhc_control_read_data(device_t *, void *, ipc_callid_t, ipc_call_t *); 53 53 static void remote_usbhc_control_read_status(device_t *, void *, ipc_callid_t, ipc_call_t *); 54 static void remote_usbhc_reserve_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 55 static void remote_usbhc_release_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 56 static void remote_usbhc_request_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 57 static void remote_usbhc_bind_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 58 static void remote_usbhc_release_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 54 59 //static void remote_usbhc(device_t *, void *, ipc_callid_t, ipc_call_t *); 55 60 … … 57 62 static remote_iface_func_ptr_t remote_usbhc_iface_ops [] = { 58 63 remote_usbhc_get_address, 64 59 65 remote_usbhc_get_buffer, 66 67 remote_usbhc_reserve_default_address, 68 remote_usbhc_release_default_address, 69 70 remote_usbhc_request_address, 71 remote_usbhc_bind_address, 72 remote_usbhc_release_address, 73 60 74 remote_usbhc_interrupt_out, 61 75 remote_usbhc_interrupt_in, 76 62 77 remote_usbhc_control_write_setup, 63 78 remote_usbhc_control_write_data, 64 79 remote_usbhc_control_write_status, 80 65 81 remote_usbhc_control_read_setup, 66 82 remote_usbhc_control_read_data, … … 134 150 free(trans->buffer); 135 151 free(trans); 152 } 153 154 void remote_usbhc_reserve_default_address(device_t *device, void *iface, 155 ipc_callid_t callid, ipc_call_t *call) 156 { 157 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 158 159 if (!usb_iface->reserve_default_address) { 160 ipc_answer_0(callid, ENOTSUP); 161 return; 162 } 163 164 int rc = usb_iface->reserve_default_address(device); 165 166 ipc_answer_0(callid, rc); 167 } 168 169 void remote_usbhc_release_default_address(device_t *device, void *iface, 170 ipc_callid_t callid, ipc_call_t *call) 171 { 172 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 173 174 if (!usb_iface->release_default_address) { 175 ipc_answer_0(callid, ENOTSUP); 176 return; 177 } 178 179 int rc = usb_iface->release_default_address(device); 180 181 ipc_answer_0(callid, rc); 182 } 183 184 void remote_usbhc_request_address(device_t *device, void *iface, 185 ipc_callid_t callid, ipc_call_t *call) 186 { 187 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 188 189 if (!usb_iface->request_address) { 190 ipc_answer_0(callid, ENOTSUP); 191 return; 192 } 193 194 usb_address_t address; 195 int rc = usb_iface->request_address(device, &address); 196 if (rc != EOK) { 197 ipc_answer_0(callid, rc); 198 } else { 199 ipc_answer_1(callid, EOK, (ipcarg_t) address); 200 } 201 } 202 203 void remote_usbhc_bind_address(device_t *device, void *iface, 204 ipc_callid_t callid, ipc_call_t *call) 205 { 206 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 207 208 if (!usb_iface->bind_address) { 209 ipc_answer_0(callid, ENOTSUP); 210 return; 211 } 212 213 usb_address_t address = (usb_address_t) IPC_GET_ARG1(*call); 214 devman_handle_t handle = (devman_handle_t) IPC_GET_ARG2(*call); 215 216 int rc = usb_iface->bind_address(device, address, handle); 217 218 ipc_answer_0(callid, rc); 219 } 220 221 void remote_usbhc_release_address(device_t *device, void *iface, 222 ipc_callid_t callid, ipc_call_t *call) 223 { 224 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 225 226 if (!usb_iface->release_address) { 227 ipc_answer_0(callid, ENOTSUP); 228 return; 229 } 230 231 usb_address_t address = (usb_address_t) IPC_GET_ARG1(*call); 232 233 int rc = usb_iface->release_address(device, address); 234 235 ipc_answer_0(callid, rc); 136 236 } 137 237 -
uspace/lib/drv/include/usbhc_iface.h
r4144630 r45e9cc6 111 111 112 112 113 /** Reserve usage of default address. 114 * This call informs the host controller that the caller will be 115 * using default USB address. It is duty of the HC driver to ensure 116 * that only single entity will have it reserved. 117 * The address is returned via IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS. 118 * The caller can start using the address after receiving EOK 119 * answer. 120 */ 121 IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS, 122 123 /** Release usage of default address. 124 * @see IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS 125 */ 126 IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS, 127 128 /** Asks for address assignment by host controller. 129 * Answer: 130 * - ELIMIT - host controller run out of address 131 * - EOK - address assigned 132 * Answer arguments: 133 * - assigned address 134 * 135 * The address must be released by via IPC_M_USBHC_RELEASE_ADDRESS. 136 */ 137 IPC_M_USBHC_REQUEST_ADDRESS, 138 139 /** Bind USB address with devman handle. 140 * Parameters: 141 * - USB address 142 * - devman handle 143 * Answer: 144 * - EOK - address binded 145 * - ENOENT - address is not in use 146 */ 147 IPC_M_USBHC_BIND_ADDRESS, 148 149 /** Release address in use. 150 * Arguments: 151 * - address to be released 152 * Answer: 153 * - ENOENT - address not in use 154 * - EPERM - trying to release default USB address 155 */ 156 IPC_M_USBHC_RELEASE_ADDRESS, 157 158 113 159 /** Send interrupt data to device. 114 160 * See explanation at usb_iface_funcs_t (OUT transaction). … … 183 229 typedef struct { 184 230 int (*tell_address)(device_t *, devman_handle_t, usb_address_t *); 231 232 int (*reserve_default_address)(device_t *); 233 int (*release_default_address)(device_t *); 234 int (*request_address)(device_t *, usb_address_t *); 235 int (*bind_address)(device_t *, usb_address_t, devman_handle_t); 236 int (*release_address)(device_t *, usb_address_t); 185 237 186 238 usbhc_iface_transfer_out_t interrupt_out; -
uspace/lib/usb/Makefile
r4144630 r45e9cc6 35 35 src/hcdhubd.c \ 36 36 src/hcdrv.c \ 37 src/hubdrv.c \38 37 src/localdrv.c \ 39 38 src/remotedrv.c \ -
uspace/lib/usb/include/usb/hcdhubd.h
r4144630 r45e9cc6 166 166 167 167 int usb_hcd_main(usb_hc_driver_t *); 168 int usb_hcd_add_root_hub( usb_hc_device_t *dev);168 int usb_hcd_add_root_hub(device_t *dev); 169 169 170 170 /** … … 191 191 */ 192 192 193 device_t *usb_hc_connect(device_t *); 193 194 194 195 int usb_hc_async_interrupt_out(usb_hc_device_t *, usb_target_t, -
uspace/lib/usb/include/usb/usbdrv.h
r4144630 r45e9cc6 41 41 int usb_drv_hc_connect(device_t *, unsigned int); 42 42 43 int usb_drv_reserve_default_address(int); 44 int usb_drv_release_default_address(int); 45 usb_address_t usb_drv_request_address(int); 46 int usb_drv_bind_address(int, usb_address_t, devman_handle_t); 47 int usb_drv_release_address(int, usb_address_t); 48 43 49 usb_address_t usb_drv_get_my_address(int, device_t *); 44 50 -
uspace/lib/usb/src/hcdhubd.c
r4144630 r45e9cc6 51 51 */ 52 52 static int add_device(device_t *dev) { 53 bool is_hc = str_cmp(dev->name, USB_HUB_DEVICE_NAME) != 0; 54 printf("%s: add_device(name=\"%s\")\n", hc_driver->name, dev->name); 55 56 if (is_hc) { 57 /* 58 * We are the HC itself. 59 */ 60 return usb_add_hc_device(dev); 61 } else { 62 /* 63 * We are some (maybe deeply nested) hub. 64 * Thus, assign our own operations and explore already 65 * connected devices. 66 */ 67 return usb_add_hub_device(dev); 68 } 53 return ENOTSUP; 69 54 } 70 55 … … 105 90 * @return Error code. 106 91 */ 107 int usb_hcd_add_root_hub(usb_hc_device_t *dev) { 92 int usb_hcd_add_root_hub(device_t *dev) 93 { 108 94 char *id; 109 int rc = asprintf(&id, "usb&h c=%s&hub", dev->generic->name);95 int rc = asprintf(&id, "usb&hub"); 110 96 if (rc <= 0) { 111 97 return rc; 112 98 } 113 99 114 rc = usb_hc_add_child_device(dev ->generic, USB_HUB_DEVICE_NAME, id, true);100 rc = usb_hc_add_child_device(dev, USB_HUB_DEVICE_NAME, id, true); 115 101 if (rc != EOK) { 116 102 free(id); … … 133 119 int rc; 134 120 121 async_usleep(1000); 122 135 123 device_t *child = create_device(); 136 124 match_id_t *match_id = NULL; … … 196 184 printf("%s: about to add child device `%s' (%s)\n", hc_driver->name, 197 185 name, match_id); 186 187 /* 188 * Seems that creating fibril which postpones the action 189 * is the best solution. 190 */ 191 create_fibril = true; 198 192 199 193 struct child_device_info *child_info -
uspace/lib/usb/src/hcdhubd_private.h
r4144630 r45e9cc6 46 46 usb_address_t usb_get_address_by_handle(devman_handle_t); 47 47 int usb_add_hc_device(device_t *); 48 int usb_add_hub_device(device_t *);49 48 50 49 /** lowest allowed usb address */ -
uspace/lib/usb/src/hcdrv.c
r4144630 r45e9cc6 47 47 LIST_INITIALIZE(hc_list); 48 48 49 /* Fake driver to have the name item initialized. */ 50 static usb_hc_driver_t hc_driver_fake = { 51 .name = "HCD", 52 }; 53 49 54 /** Our HC driver. */ 50 usb_hc_driver_t *hc_driver = NULL;55 usb_hc_driver_t *hc_driver = &hc_driver_fake; 51 56 52 57 int usb_lowest_address = 1; … … 86 91 int usb_add_hc_device(device_t *dev) 87 92 { 93 return ENOTSUP; 88 94 usb_hc_device_t *hc_dev = usb_hc_device_create(dev); 89 95 -
uspace/lib/usb/src/localdrv.c
r4144630 r45e9cc6 39 39 #include <errno.h> 40 40 41 /** Find host controller when handled by current task. 42 * 43 * @param dev Device asking for connection. 44 * @return Device structure corresponding to parent host controller. 45 * @retval NULL Corresponding host controller not found. 46 */ 47 device_t *usb_hc_connect(device_t *dev) 48 { 49 /* 50 * FIXME: this will not work when some hub on the path is 51 * not driven by the same task. 52 */ 53 device_t *parent = dev; 54 while (parent->parent != NULL) { 55 parent = parent->parent; 56 } 57 58 if (dev == parent) { 59 printf("FIXME in %s:%d encountered!\n", __FILE__, __LINE__); 60 parent = NULL; 61 } 62 63 return parent; 64 } 65 41 66 /** Information about pending transaction on HC. */ 42 67 typedef struct { -
uspace/lib/usb/src/usbdrv.c
r4144630 r45e9cc6 55 55 /** Connect to host controller the device is physically attached to. 56 56 * 57 * @param handle Device handle.57 * @param dev Device asking for connection. 58 58 * @param flags Connection flags (blocking connection). 59 59 * @return Phone to corresponding HC or error code. … … 98 98 99 99 return (usb_address_t) address; 100 } 101 102 /** Tell HC to reserve default address. 103 * 104 * @param phone Open phone to host controller driver. 105 * @return Error code. 106 */ 107 int usb_drv_reserve_default_address(int phone) 108 { 109 return async_req_0_0(phone, IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS); 110 } 111 112 /** Tell HC to release default address. 113 * 114 * @param phone Open phone to host controller driver. 115 * @return Error code. 116 */ 117 int usb_drv_release_default_address(int phone) 118 { 119 return async_req_0_0(phone, IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS); 120 } 121 122 /** Ask HC for free address assignment. 123 * 124 * @param phone Open phone to host controller driver. 125 * @return Assigned USB address or negative error code. 126 */ 127 usb_address_t usb_drv_request_address(int phone) 128 { 129 ipcarg_t address; 130 int rc = async_req_0_1(phone, IPC_M_USBHC_REQUEST_ADDRESS, &address); 131 if (rc != EOK) { 132 return rc; 133 } else { 134 return (usb_address_t) address; 135 } 136 } 137 138 /** Inform HC about binding address with devman handle. 139 * 140 * @param phone Open phone to host controller driver. 141 * @param address Address to be binded. 142 * @param handle Devman handle of the device. 143 * @return Error code. 144 */ 145 int usb_drv_bind_address(int phone, usb_address_t address, 146 devman_handle_t handle) 147 { 148 int rc = async_req_2_0(phone, IPC_M_USBHC_BIND_ADDRESS, 149 address, handle); 150 151 return rc; 152 } 153 154 /** Inform HC about address release. 155 * 156 * @param phone Open phone to host controller driver. 157 * @param address Address to be released. 158 * @return Error code. 159 */ 160 int usb_drv_release_address(int phone, usb_address_t address) 161 { 162 return async_req_1_0(phone, IPC_M_USBHC_RELEASE_ADDRESS, address); 100 163 } 101 164 -
uspace/srv/bd/file_bd/file_bd.c
r4144630 r45e9cc6 56 56 #define NAME "file_bd" 57 57 58 static const size_t block_size = 512; 58 #define DEFAULT_BLOCK_SIZE 512 59 60 static size_t block_size; 59 61 static aoff64_t num_blocks; 60 62 static FILE *img; … … 63 65 static fibril_mutex_t dev_lock; 64 66 67 static void print_usage(void); 65 68 static int file_bd_init(const char *fname); 66 69 static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall); … … 71 74 { 72 75 int rc; 76 char *image_name; 77 char *device_name; 73 78 74 79 printf(NAME ": File-backed block device driver\n"); 75 80 76 if (argc != 3) { 77 printf("Expected two arguments (image name, device name).\n"); 81 block_size = DEFAULT_BLOCK_SIZE; 82 83 ++argv; --argc; 84 while (*argv != NULL && (*argv)[0] == '-') { 85 /* Option */ 86 if (str_cmp(*argv, "-b") == 0) { 87 if (argc < 2) { 88 printf("Argument missing.\n"); 89 print_usage(); 90 return -1; 91 } 92 93 rc = str_size_t(argv[1], NULL, 10, true, &block_size); 94 if (rc != EOK || block_size == 0) { 95 printf("Invalid block size '%s'.\n", argv[1]); 96 print_usage(); 97 return -1; 98 } 99 ++argv; --argc; 100 } else { 101 printf("Invalid option '%s'.\n", *argv); 102 print_usage(); 103 return -1; 104 } 105 ++argv; --argc; 106 } 107 108 if (argc < 2) { 109 printf("Missing arguments.\n"); 110 print_usage(); 78 111 return -1; 79 112 } 80 113 81 if (file_bd_init(argv[1]) != EOK) 114 image_name = argv[0]; 115 device_name = argv[1]; 116 117 if (file_bd_init(image_name) != EOK) 82 118 return -1; 83 119 84 rc = devmap_device_register( argv[2], &devmap_handle);120 rc = devmap_device_register(device_name, &devmap_handle); 85 121 if (rc != EOK) { 86 122 devmap_hangup_phone(DEVMAP_DRIVER); 87 printf(NAME ": Unable to register device %s.\n",88 argv[2]);123 printf(NAME ": Unable to register device '%s'.\n", 124 device_name); 89 125 return rc; 90 126 } … … 96 132 /* Not reached */ 97 133 return 0; 134 } 135 136 static void print_usage(void) 137 { 138 printf("Usage: " NAME " [-b <block_size>] <image_file> <device_name>\n"); 98 139 } 99 140
Note:
See TracChangeset
for help on using the changeset viewer.