Lines Matching defs:lun

95 status_t	usb_disk_send_diagnostic(device_lun *lun);
96 status_t usb_disk_request_sense(device_lun *lun, err_act *action);
97 status_t usb_disk_mode_sense(device_lun *lun);
98 status_t usb_disk_test_unit_ready(device_lun *lun, err_act *action = NULL);
99 status_t usb_disk_inquiry(device_lun *lun);
100 status_t usb_disk_reset_capacity(device_lun *lun);
101 status_t usb_disk_update_capacity(device_lun *lun);
102 status_t usb_disk_synchronize(device_lun *lun, bool force);
187 // invalid max lun
353 usb_disk_operation_interrupt(device_lun *lun, uint8* operation,
357 TRACE("operation: lun: %u; op: 0x%x; data: %p; dlen: %p (%lu); in: %c\n",
358 lun->logical_unit_number, operation[0], data.vecs, dataLength,
360 ASSERT_LOCKED_RECURSIVE(&lun->device->io_lock);
362 disk_device* device = lun->device;
376 usb_disk_request_sense(lun, _action);
424 result = usb_disk_request_sense(lun, _action);
431 usb_disk_operation_bulk(device_lun *lun, uint8 *operation, size_t operationLength,
435 TRACE("operation: lun: %u; op: %u; data: %p; dlen: %p (%lu); in: %c\n",
436 lun->logical_unit_number, operation[0],
439 ASSERT_LOCKED_RECURSIVE(&lun->device->io_lock);
441 disk_device *device = lun->device;
448 command.lun = lun->logical_unit_number;
545 result = usb_disk_request_sense(lun, _action);
571 usb_disk_operation(device_lun *lun, uint8* operation, size_t opLength,
575 if (lun->device->is_ufi) {
576 return usb_disk_operation_interrupt(lun, operation,
579 return usb_disk_operation_bulk(lun, operation, opLength,
586 usb_disk_operation(device_lun *lun, uint8* operation, size_t opLength,
604 return usb_disk_operation(lun, operation, opLength,
615 usb_disk_send_diagnostic(device_lun *lun)
621 commandBlock[1] = (lun->logical_unit_number << 5) | 4;
623 status_t result = usb_disk_operation(lun, commandBlock, 6, NULL, NULL, false);
629 result = usb_disk_request_sense(lun, &action);
640 usb_disk_request_sense(device_lun *lun, err_act *_action)
647 commandBlock[1] = lun->logical_unit_number << 5;
654 result = usb_disk_operation(lun, commandBlock, 6, &parameter,
689 lun->media_changed = true;
690 lun->media_present = true;
693 lun->media_present = true;
695 lun->media_present = false;
696 usb_disk_reset_capacity(lun);
707 usb_disk_mode_sense(device_lun *lun)
721 status_t result = usb_disk_operation(lun, commandBlock, 6,
728 lun->write_protected
731 TRACE_ALWAYS("write protected: %s\n", lun->write_protected ? "yes" : "no");
737 usb_disk_test_unit_ready(device_lun *lun, err_act *_action)
740 if (lun->device->is_ufi || !lun->device->tur_supported)
747 if (lun->device->is_atapi) {
749 commandBlock[1] = lun->logical_unit_number << 5;
754 result = usb_disk_operation(lun, commandBlock, 6, NULL, NULL, false,
758 commandBlock[1] = lun->logical_unit_number << 5;
762 result = usb_disk_operation(lun, commandBlock, 6, NULL, NULL, true,
767 lun->device->tur_supported = false;
776 usb_disk_inquiry(device_lun *lun)
784 commandBlock[1] = lun->logical_unit_number << 5;
792 result = usb_disk_operation(lun, commandBlock, 6, &parameter,
801 lun->device_type = B_DISK;
802 lun->removable = true;
821 memcpy(lun->vendor_name, parameter.vendor_identification,
822 MIN(sizeof(lun->vendor_name), sizeof(parameter.vendor_identification)));
823 memcpy(lun->product_name, parameter.product_identification,
824 MIN(sizeof(lun->product_name),
826 memcpy(lun->product_revision, parameter.product_revision_level,
827 MIN(sizeof(lun->product_revision),
830 lun->device_type = parameter.peripherial_device_type; /* 1:1 mapping */
831 lun->removable = (parameter.removable_medium == 1);
837 usb_disk_reset_capacity(device_lun *lun)
839 lun->block_size = 512;
840 lun->block_count = 0;
846 usb_disk_update_capacity_16(device_lun *lun)
869 result = usb_disk_operation(lun, commandBlock, 16, &parameter,
880 lun->media_present = false;
881 lun->media_changed = false;
882 usb_disk_reset_capacity(lun);
886 lun->media_present = true;
887 lun->media_changed = false;
888 lun->block_size = B_BENDIAN_TO_HOST_INT32(parameter.logical_block_length);
889 lun->physical_block_size = lun->block_size;
890 lun->block_count =
897 usb_disk_update_capacity(device_lun *lun)
908 commandBlock[1] = lun->logical_unit_number << 5;
916 result = usb_disk_operation(lun, commandBlock, 10, &parameter,
926 if (lun->device->is_ufi && (result == B_DEV_NO_MEDIA
933 lun->media_present = false;
934 lun->media_changed = false;
935 usb_disk_reset_capacity(lun);
939 lun->media_present = true;
940 lun->media_changed = false;
941 lun->block_size = B_BENDIAN_TO_HOST_INT32(parameter.logical_block_length);
942 lun->physical_block_size = lun->block_size;
943 lun->block_count =
945 if (lun->block_count == 0) {
947 result = usb_disk_update_capacity_16(lun);
953 if (get_dma_resource(lun->device, lun->block_size) == NULL) {
955 restrictions.max_transfer_size = (lun->block_size * MAX_IO_BLOCKS);
958 result = dmaResource->Init(restrictions, lun->block_size, 1, 1);
962 lun->device->dma_resources.Add(dmaResource);
970 usb_disk_synchronize(device_lun *lun, bool force)
972 if (lun->device->is_ufi) {
979 if (lun->device->sync_support == 0) {
985 if (!lun->should_sync && !force)
992 commandBlock[1] = lun->logical_unit_number << 5;
994 status_t result = usb_disk_operation(lun, commandBlock, 10,
998 lun->device->sync_support = SYNC_SUPPORT_RELOAD;
999 lun->should_sync = false;
1004 lun->device->sync_support = 0;
1006 lun->device->sync_support--;
1148 TRACE_ALWAYS("device reports a lun count of %d\n", device->lun_count);
1151 device_lun *lun = (device_lun *)malloc(sizeof(device_lun));
1152 if (lun == NULL) {
1157 device->luns[i] = lun;
1158 lun->device = device;
1159 lun->logical_unit_number = i;
1160 lun->should_sync = false;
1161 lun->media_present = true;
1162 lun->media_changed = true;
1164 memset(lun->vendor_name, 0, sizeof(lun->vendor_name));
1165 memset(lun->product_name, 0, sizeof(lun->product_name));
1166 memset(lun->product_revision, 0, sizeof(lun->product_revision));
1168 usb_disk_reset_capacity(lun);
1170 // initialize this lun
1171 result = usb_disk_inquiry(lun);
1177 result = usb_disk_send_diagnostic(lun);
1182 TRACE("usb lun %" B_PRIu8 " inquiry attempt %" B_PRIu32 " begin\n",
1184 status_t ready = usb_disk_test_unit_ready(lun, &action);
1187 if (lun->device_type == B_CD)
1188 lun->write_protected = true;
1191 else if (/*usb_disk_mode_sense(lun) != B_OK*/true)
1192 lun->write_protected = false;
1194 TRACE("usb lun %" B_PRIu8 " ready. write protected = %c%s\n", i,
1195 lun->write_protected ? 'y' : 'n',
1200 TRACE("usb lun %" B_PRIu8 " inquiry attempt %" B_PRIu32 " failed\n",
1205 TRACE("snoozing %" B_PRIu64 " microseconds for usb lun\n",
1259 usb_disk_needs_bounce(device_lun *lun, io_request *request)
1263 if ((request->Offset() % lun->block_size) != 0)
1265 if ((request->Length() % lun->block_size) != 0)
1267 if (request->Length() > (lun->block_size * MAX_IO_BLOCKS))
1274 usb_disk_block_read(device_lun *lun, uint64 blockPosition, size_t blockCount,
1279 if (lun->device->is_ufi) {
1281 commandBlock[1] = lun->logical_unit_number << 5;
1293 result = usb_disk_operation(lun, commandBlock, 12, data,
1310 status_t result = usb_disk_operation(lun, commandBlock, 10,
1328 status_t result = usb_disk_operation(lun, commandBlock, 16,
1336 usb_disk_block_write(device_lun *lun, uint64 blockPosition, size_t blockCount,
1342 if (lun->device->is_ufi) {
1344 commandBlock[1] = lun->logical_unit_number << 5;
1355 result = usb_disk_operation(lun, commandBlock, 12,
1362 result = usb_disk_request_sense(lun, &action);
1367 lun->should_sync = true;
1377 status_t result = usb_disk_operation(lun, commandBlock, 10,
1380 lun->should_sync = true;
1397 status_t result = usb_disk_operation(lun, commandBlock, 16,
1400 lun->should_sync = true;
1451 device_lun *lun = device->luns[i];
1452 if (strncmp(rawName, lun->name, 32) == 0) {
1453 // found the matching device/lun
1458 *_cookie = lun;
1471 device_lun *lun = (device_lun *)cookie;
1472 disk_device *device = lun->device;
1478 usb_disk_synchronize(lun, false);
1489 device_lun *lun = (device_lun *)cookie;
1490 disk_device *device = lun->device;
1545 handle_media_change(device_lun *lun, MutexLocker& locker)
1548 status_t result = acquire_io_lock(lun->device, locker, ioLocker);
1553 if (lun->media_changed) {
1554 result = usb_disk_update_capacity(lun);
1566 device_lun *lun = (device_lun *)cookie;
1567 disk_device *device = lun->device;
1576 if (lun->media_changed) {
1577 status_t result = handle_media_change(lun, locker);
1582 size_t size = lun->block_size * lun->block_count;
1588 status_t result = acquire_io_lock(lun->device, locker, ioLocker);
1595 ready = usb_disk_test_unit_ready(lun, &action);
1618 if (lun->media_changed) {
1619 status_t result = handle_media_change(lun, locker);
1625 devfs_compute_geometry_size(&geometry, lun->block_count,
1626 lun->block_size);
1627 geometry.bytes_per_physical_sector = lun->physical_block_size;
1629 geometry.device_type = lun->device_type;
1630 geometry.removable = lun->removable;
1631 geometry.read_only = lun->write_protected;
1632 geometry.write_once = lun->device_type == B_WORM;
1643 status_t result = acquire_io_lock(lun->device, locker, ioLocker);
1647 return usb_disk_synchronize(lun, true);
1652 status_t result = acquire_io_lock(lun->device, locker, ioLocker);
1660 commandBlock[1] = lun->logical_unit_number << 5;
1663 return usb_disk_operation(lun, commandBlock, 6, NULL, NULL,
1669 status_t result = acquire_io_lock(lun->device, locker, ioLocker);
1677 commandBlock[1] = lun->logical_unit_number << 5;
1680 return usb_disk_operation(lun, commandBlock, 6, NULL, NULL,
1692 char vendor[sizeof(lun->vendor_name)+1];
1693 char product[sizeof(lun->product_name)+1];
1699 switch (lun->device_type) {
1707 lun->vendor_name);
1709 lun->product_name);
1728 char vendor[sizeof(lun->vendor_name)+1];
1729 char product[sizeof(lun->product_name)+1];
1738 switch (lun->device_type) {
1746 lun->vendor_name);
1748 lun->product_name);
1780 size_t nameLength = sizeof(lun->vendor_name)
1781 + sizeof(lun->product_name) + sizeof(lun->product_revision) + 3;
1784 snprintf(name, nameLength, "%.8s %.16s %.4s", lun->vendor_name,
1785 lun->product_name, lun->product_revision);
1805 usb_disk_bounced_io(device_lun *lun, io_request *request)
1807 DMAResource* dmaResource = get_dma_resource(lun->device, lun->block_size);
1838 const uint64 blockPosition = operation.Offset() / lun->block_size;
1839 const size_t blockCount = length / lun->block_size;
1841 status = usb_disk_block_write(lun,
1844 status = usb_disk_block_read(lun,
1870 usb_disk_direct_io(device_lun *lun, io_request *request)
1884 const uint64 blockPosition = request->Offset() / lun->block_size;
1885 const size_t blockCount = length / lun->block_size;
1889 status = usb_disk_block_write(lun,
1892 status = usb_disk_block_read(lun,
1906 device_lun *lun = (device_lun *)cookie;
1907 disk_device *device = lun->device;
1916 if (!usb_disk_needs_bounce(lun, request)) {
1917 status = usb_disk_direct_io(lun, request);
1919 status = usb_disk_bounced_io(lun, request);