Lines Matching refs:device

25 /** free autosense request of device */
28 scsi_free_autosense_request(scsi_device_info *device)
32 if (device->auto_sense_request != NULL) {
33 scsi_free_ccb(device->auto_sense_request);
34 device->auto_sense_request = NULL;
37 if (device->auto_sense_area > 0) {
38 delete_area(device->auto_sense_area);
39 device->auto_sense_area = 0;
44 /** free all data of device */
47 scsi_free_device(scsi_device_info *device)
51 scsi_free_emulation_buffer(device);
52 scsi_free_autosense_request(device);
54 unregister_kernel_daemon(scsi_dma_buffer_daemon, device);
56 scsi_dma_buffer_free(&device->dma_buffer);
58 mutex_destroy(&device->dma_buffer_lock);
59 delete_sem(device->dma_buffer_owner);
61 free(device);
85 /** register new device */
155 // create data structure for a device
160 scsi_device_info *device;
164 device = (scsi_device_info *)malloc(sizeof(*device));
165 if (device == NULL)
168 memset(device, 0, sizeof(*device));
170 device->lock_count = device->blocked[0] = device->blocked[1] = 0;
171 device->sim_overflow = 0;
172 device->queued_reqs = NULL;
173 device->bus = bus;
174 device->target_id = target_id;
175 device->target_lun = target_lun;
176 device->valid = true;
177 device->node = node;
179 scsi_dma_buffer_init(&device->dma_buffer);
181 mutex_init(&device->dma_buffer_lock, "dma_buffer");
183 device->dma_buffer_owner = create_sem(1, "dma_buffer");
184 if (device->dma_buffer_owner < 0)
187 register_kernel_daemon(scsi_dma_buffer_daemon, device, 5 * 10);
189 return device;
192 mutex_destroy(&device->dma_buffer_lock);
193 free(device);
204 scsi_create_autosense_request(scsi_device_info *device)
213 device->auto_sense_request = request = scsi_alloc_ccb(device);
214 if (device->auto_sense_request == NULL)
221 device->auto_sense_area = create_area("auto_sense", (void**)&buffer,
225 if (device->auto_sense_area < 0)
248 cmd->lun = device->target_lun;
267 scsi_device_info *device;
290 device = scsi_create_device(node, bus, target_id, target_lun);
291 if (device == NULL)
299 device->inquiry_data = *inquiry_data;
302 device->is_atapi = is_atapi;
303 device->manual_autosense = manual_autosense;
305 // size of device queue must be detected by trial and error, so
306 // we start with a really high number and see when the device chokes
307 device->total_slots = 4096;
311 device->total_slots = 1;
315 if (device->manual_autosense)
316 device->total_slots = 1;
318 device->left_slots = device->total_slots;
321 if (device->manual_autosense) {
322 if (scsi_create_autosense_request(device) != B_OK) {
328 // if this is an ATAPI device, we need an emulation buffer
329 if (scsi_init_emulation_buffer(device, SCSI_ATAPI_BUFFER_SIZE) != B_OK) {
334 memset(device->emulation_map, 0, sizeof(device->emulation_map));
336 if (device->is_atapi) {
337 SET_BIT(device->emulation_map, SCSI_OP_READ_6);
338 SET_BIT(device->emulation_map, SCSI_OP_WRITE_6);
339 SET_BIT(device->emulation_map, SCSI_OP_MODE_SENSE_6);
340 SET_BIT(device->emulation_map, SCSI_OP_MODE_SELECT_6);
341 SET_BIT(device->emulation_map, SCSI_OP_INQUIRY);
344 *cookie = device;
348 scsi_free_device(device);
354 scsi_uninit_device(scsi_device_info *device)
358 scsi_free_device(device);
363 scsi_device_removed(scsi_device_info *device)
367 if (device == NULL)
371 device->valid = false;
375 /** get device info; create a temporary one if it's not registered
392 scsi_device device;
396 // very important: only one can use a forced device to avoid double detection
399 // check whether device registered already
408 res = pnp->get_driver(node, &driver_interface, (void **)&device);
412 // device doesn't exist yet - create a temporary one
413 device = scsi_create_device(NULL, bus, target_id, target_lun);
414 if (device == NULL)
420 *res_device = device;
429 /** cleanup device received from scsi_force_get_device
434 scsi_put_forced_device(scsi_device_info *device)
436 scsi_bus_info *bus = device->bus;
440 if (device->node != NULL) {
441 // device is registered
442 pnp->put_node(device->node);
444 // device is temporary
445 scsi_free_device(device);
453 scsi_reset_device(scsi_device_info *device)
457 if (device->node == NULL)
460 return device->bus->interface->reset_device(device->bus->sim_cookie,
461 device->target_id, device->target_lun);
466 scsi_ioctl(scsi_device_info *device, uint32 op, void *buffer, size_t length)
468 if (device->bus->interface->ioctl != NULL) {
469 return device->bus->interface->ioctl(device->bus->sim_cookie,
470 device->target_id, op, buffer, length);
484 // SCSI device driver must have SCSI bus loaded, but it calls its functions