diff options
author | iedowse <iedowse@FreeBSD.org> | 2005-02-13 21:38:34 +0000 |
---|---|---|
committer | iedowse <iedowse@FreeBSD.org> | 2005-02-13 21:38:34 +0000 |
commit | 4f2d08a3315df4cdc5b9cf342c6c8f3c29b1b181 (patch) | |
tree | ffaff7aed5951e0e35e4355d5f4ecb4db1d1b5df /sys | |
parent | 4f4b5fa23c7c68e0c5a3bd95e1cd291372b181da (diff) | |
download | FreeBSD-src-4f2d08a3315df4cdc5b9cf342c6c8f3c29b1b181.zip FreeBSD-src-4f2d08a3315df4cdc5b9cf342c6c8f3c29b1b181.tar.gz |
When attached to a high-speed device, report a more appropriate
base transfer speed to CAM. The actual value used (40MB/s) is fairly
arbitrary, but assumes the same 33% overhead as was implied by the
1MB/s figure we used for USB1 devices.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/umass.c | 14 | ||||
-rw-r--r-- | sys/dev/usb/usbdi.c | 6 | ||||
-rw-r--r-- | sys/dev/usb/usbdi.h | 1 |
3 files changed, 18 insertions, 3 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c index 4952eb4..98f8fdf 100644 --- a/sys/dev/usb/umass.c +++ b/sys/dev/usb/umass.c @@ -162,7 +162,9 @@ SYSCTL_INT(_hw_usb_umass, OID_AUTO, debug, CTLFLAG_RW, #define DEVNAME_SIM "umass-sim" #define UMASS_MAX_TRANSFER_SIZE 65536 -#define UMASS_DEFAULT_TRANSFER_SPEED 1000 +/* Approximate maximum transfer speeds (assumes 33% overhead). */ +#define UMASS_FULL_TRANSFER_SPEED 1000 +#define UMASS_HIGH_TRANSFER_SPEED 40000 #define UMASS_FLOPPY_TRANSFER_SPEED 20 #define UMASS_TIMEOUT 5000 /* msecs */ @@ -2495,9 +2497,15 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 0; } else { if (sc->quirks & FLOPPY_SPEED) { - cpi->base_transfer_speed = UMASS_FLOPPY_TRANSFER_SPEED; + cpi->base_transfer_speed = + UMASS_FLOPPY_TRANSFER_SPEED; + } else if (usbd_get_speed(sc->sc_udev) == + USB_SPEED_HIGH) { + cpi->base_transfer_speed = + UMASS_HIGH_TRANSFER_SPEED; } else { - cpi->base_transfer_speed = UMASS_DEFAULT_TRANSFER_SPEED; + cpi->base_transfer_speed = + UMASS_FULL_TRANSFER_SPEED; } cpi->max_lun = sc->maxlun; } diff --git a/sys/dev/usb/usbdi.c b/sys/dev/usb/usbdi.c index e5e4fd0..113462d 100644 --- a/sys/dev/usb/usbdi.c +++ b/sys/dev/usb/usbdi.c @@ -506,6 +506,12 @@ usbd_get_config_descriptor(usbd_device_handle dev) return (dev->cdesc); } +int +usbd_get_speed(usbd_device_handle dev) +{ + return (dev->speed); +} + usb_interface_descriptor_t * usbd_get_interface_descriptor(usbd_interface_handle iface) { diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index d3dac2e..eee7b9e 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -140,6 +140,7 @@ usb_interface_descriptor_t *usbd_get_interface_descriptor (usbd_interface_handle); usb_config_descriptor_t *usbd_get_config_descriptor(usbd_device_handle); usb_device_descriptor_t *usbd_get_device_descriptor(usbd_device_handle); +int usbd_get_speed(usbd_device_handle); usbd_status usbd_set_interface(usbd_interface_handle, int); int usbd_get_no_alts(usb_config_descriptor_t *, int); usbd_status usbd_get_interface(usbd_interface_handle, u_int8_t *); |