summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2005-02-13 21:38:34 +0000
committeriedowse <iedowse@FreeBSD.org>2005-02-13 21:38:34 +0000
commit4f2d08a3315df4cdc5b9cf342c6c8f3c29b1b181 (patch)
treeffaff7aed5951e0e35e4355d5f4ecb4db1d1b5df
parent4f4b5fa23c7c68e0c5a3bd95e1cd291372b181da (diff)
downloadFreeBSD-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.
-rw-r--r--sys/dev/usb/umass.c14
-rw-r--r--sys/dev/usb/usbdi.c6
-rw-r--r--sys/dev/usb/usbdi.h1
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 *);
OpenPOWER on IntegriCloud