mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
usb: support SSP/SSPx2 devices in all-speed consumers
Handle the new speeds wherever USB_SPEED_SUPER was checked. Most consumers treat them as SS. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D57198
This commit is contained in:
1 parent
65346af496
commit
85c3bd4595
10 files changed
+65
-10
No files matched your search
@@ -78,7 +78,7 @@ r12au_postattach(struct rtwn_softc *sc)
|
||||
struct rtwn_usb_softc *uc = RTWN_USB_SOFTC(sc);
|
||||
struct r12a_softc *rs = sc->sc_priv;
|
||||
|
||||
if (usbd_get_speed(uc->uc_udev) == USB_SPEED_SUPER) {
|
||||
if (usbd_get_speed(uc->uc_udev) >= USB_SPEED_SUPER) {
|
||||
rs->ac_usb_dma_size = 0x07;
|
||||
rs->ac_usb_dma_time = 0x1a;
|
||||
} else {
|
||||
|
||||
@@ -737,6 +737,18 @@ usb_bus_attach(struct usb_proc_msg *pm)
|
||||
device_printf(bus->bdev, "5.0Gbps Super Speed USB v3.0\n");
|
||||
break;
|
||||
|
||||
case USB_REV_3_1:
|
||||
speed = USB_SPEED_SUPER_PLUS;
|
||||
device_printf(bus->bdev,
|
||||
"10Gbps Super Speed Plus USB v3.1\n");
|
||||
break;
|
||||
|
||||
case USB_REV_3_2:
|
||||
speed = USB_SPEED_SUPER_PLUS_GEN2_X2;
|
||||
device_printf(bus->bdev,
|
||||
"20Gbps Super Speed Plus USB v3.2\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
device_printf(bus->bdev, "Unsupported USB revision\n");
|
||||
#if USB_HAVE_ROOT_MOUNT_HOLD
|
||||
|
||||
@@ -4537,9 +4537,9 @@ xhci_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep,
|
||||
case USB_EP_MODE_DEFAULT:
|
||||
return (0);
|
||||
case USB_EP_MODE_STREAMS:
|
||||
if (xhcistreams == 0 ||
|
||||
if (xhcistreams == 0 ||
|
||||
(ep->edesc->bmAttributes & UE_XFERTYPE) != UE_BULK ||
|
||||
udev->speed != USB_SPEED_SUPER)
|
||||
udev->speed < USB_SPEED_SUPER)
|
||||
return (USB_ERR_INVAL);
|
||||
return (0);
|
||||
default:
|
||||
|
||||
@@ -817,6 +817,9 @@ lan78xx_miibus_statchg(device_t dev)
|
||||
/* XXX Flow control settings obtained from Microchip's driver. */
|
||||
switch(usbd_get_speed(sc->sc_ue.ue_udev)) {
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
fct_flow = 0x817;
|
||||
break;
|
||||
case USB_SPEED_HIGH:
|
||||
@@ -1023,6 +1026,9 @@ lan78xx_chip_init(struct muge_softc *sc)
|
||||
/* Configuring the burst cap. */
|
||||
switch (usbd_get_speed(sc->sc_ue.ue_udev)) {
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
burst_cap = MUGE_DEFAULT_BURST_CAP_SIZE/MUGE_SS_USB_PKT_SIZE;
|
||||
break;
|
||||
case USB_SPEED_HIGH:
|
||||
|
||||
@@ -1151,6 +1151,9 @@ ure_init(struct usb_ether *ue)
|
||||
/* Set RX EARLY timeout and size */
|
||||
if (sc->sc_flags & URE_FLAG_8153) {
|
||||
switch (usbd_get_speed(sc->sc_ue.ue_udev)) {
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER:
|
||||
reg = URE_COALESCE_SUPER / 8;
|
||||
break;
|
||||
@@ -1701,7 +1704,7 @@ ure_rtl8153_init(struct ure_softc *sc)
|
||||
URE_CLRBIT_2(sc, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA, URE_LED_MODE_MASK);
|
||||
|
||||
if ((sc->sc_chip & URE_CHIP_VER_5C10) &&
|
||||
usbd_get_speed(sc->sc_ue.ue_udev) != USB_SPEED_SUPER)
|
||||
usbd_get_speed(sc->sc_ue.ue_udev) < USB_SPEED_SUPER)
|
||||
val = URE_LPM_TIMER_500MS;
|
||||
else
|
||||
val = URE_LPM_TIMER_500US;
|
||||
@@ -1883,7 +1886,7 @@ ure_rtl8153b_init(struct ure_softc *sc)
|
||||
ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML);
|
||||
|
||||
/* Enable U1U2 */
|
||||
if (usbd_get_speed(sc->sc_ue.ue_udev) == USB_SPEED_SUPER)
|
||||
if (usbd_get_speed(sc->sc_ue.ue_udev) >= USB_SPEED_SUPER)
|
||||
URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, URE_LPM_U1U2_EN);
|
||||
|
||||
if (sc->sc_flags & URE_FLAG_8156B) {
|
||||
@@ -2050,7 +2053,7 @@ ure_rtl8153b_nic_reset(struct ure_softc *sc)
|
||||
}
|
||||
|
||||
/* Enable U1U2 */
|
||||
if (usbd_get_speed(sc->sc_ue.ue_udev) == USB_SPEED_SUPER)
|
||||
if (usbd_get_speed(sc->sc_ue.ue_udev) >= USB_SPEED_SUPER)
|
||||
URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, URE_LPM_U1U2_EN);
|
||||
}
|
||||
|
||||
|
||||
@@ -222,6 +222,7 @@ SYSCTL_INT(_hw_usb_umass, OID_AUTO, throttle, CTLFLAG_RWTUN,
|
||||
#define UMASS_FULL_TRANSFER_SPEED 1000
|
||||
#define UMASS_HIGH_TRANSFER_SPEED 40000
|
||||
#define UMASS_SUPER_TRANSFER_SPEED 400000
|
||||
#define UMASS_SUPER_PLUS_TRANSFER_SPEED 1000000
|
||||
#define UMASS_FLOPPY_TRANSFER_SPEED 20
|
||||
|
||||
#define UMASS_TIMEOUT 5000 /* ms */
|
||||
@@ -2409,6 +2410,13 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
|
||||
UMASS_FLOPPY_TRANSFER_SPEED;
|
||||
} else {
|
||||
switch (usbd_get_speed(sc->sc_udev)) {
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
cpi->base_transfer_speed =
|
||||
UMASS_SUPER_PLUS_TRANSFER_SPEED;
|
||||
cpi->maxio = maxphys;
|
||||
break;
|
||||
case USB_SPEED_SUPER:
|
||||
cpi->base_transfer_speed =
|
||||
UMASS_SUPER_TRANSFER_SPEED;
|
||||
|
||||
@@ -593,6 +593,15 @@ usb_make_device_desc(struct usb_temp_setup *temp,
|
||||
USETW(utd->udd.bcdUSB, 0x0300);
|
||||
utd->udd.bMaxPacketSize = 9; /* 2**9 = 512 bytes */
|
||||
break;
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
USETW(utd->udd.bcdUSB, 0x0310);
|
||||
utd->udd.bMaxPacketSize = 9; /* 2**9 = 512 bytes */
|
||||
break;
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
USETW(utd->udd.bcdUSB, 0x0320);
|
||||
utd->udd.bMaxPacketSize = 9; /* 2**9 = 512 bytes */
|
||||
break;
|
||||
default:
|
||||
temp->err = USB_ERR_INVAL;
|
||||
break;
|
||||
|
||||
@@ -524,7 +524,7 @@ usb_init_endpoint(struct usb_device *udev, uint8_t iface_index,
|
||||
return;
|
||||
|
||||
/* check for SUPER-speed streams mode endpoint */
|
||||
if (udev->speed == USB_SPEED_SUPER && ecomp != NULL &&
|
||||
if (udev->speed >= USB_SPEED_SUPER && ecomp != NULL &&
|
||||
(edesc->bmAttributes & UE_XFERTYPE) == UE_BULK &&
|
||||
(UE_GET_BULK_STREAMS(ecomp->bmAttributes) != 0)) {
|
||||
usbd_set_endpoint_mode(udev, ep, USB_EP_MODE_STREAMS);
|
||||
|
||||
@@ -2081,8 +2081,7 @@ retry:
|
||||
* Try to reset the High Speed parent HUB of a LOW- or FULL-
|
||||
* speed device, if any.
|
||||
*/
|
||||
if (udev->parent_hs_hub != NULL &&
|
||||
udev->speed != USB_SPEED_HIGH) {
|
||||
if (udev->parent_hs_hub != NULL && udev->speed < USB_SPEED_HIGH) {
|
||||
DPRINTF("Trying to reset parent High Speed TT.\n");
|
||||
if (udev->parent_hs_hub == parent_hub &&
|
||||
(uhub_count_active_host_ports(parent_hub, USB_SPEED_LOW) +
|
||||
@@ -2103,7 +2102,7 @@ retry:
|
||||
}
|
||||
#endif
|
||||
/* Try to warm reset first */
|
||||
if (parent_hub->speed == USB_SPEED_SUPER)
|
||||
if (parent_hub->speed >= USB_SPEED_SUPER)
|
||||
usbd_req_warm_reset_port(parent_hub, mtx, udev->port_no);
|
||||
|
||||
/* Try to reset the parent HUB port. */
|
||||
|
||||
@@ -407,6 +407,9 @@ usbd_get_max_frame_length(const struct usb_endpoint_descriptor *edesc,
|
||||
max_packet_size &= 0x7FF;
|
||||
break;
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
max_packet_count += (max_packet_size >> 11) & 3;
|
||||
|
||||
if (ecomp != NULL)
|
||||
@@ -517,6 +520,9 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm)
|
||||
xfer->max_packet_size &= 0x7FF;
|
||||
break;
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER_PLUS_X2:
|
||||
case USB_SPEED_SUPER_PLUS_GEN2_X2:
|
||||
xfer->max_packet_count += (xfer->max_packet_size >> 11) & 3;
|
||||
|
||||
if (ecomp != NULL)
|
||||
@@ -3534,6 +3540,9 @@ usbd_get_std_packet_size(struct usb_std_packet_size *ptr,
|
||||
[USB_SPEED_HIGH] = 1024,
|
||||
[USB_SPEED_VARIABLE] = 1024,
|
||||
[USB_SPEED_SUPER] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_X2] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_GEN2_X2] = 1024,
|
||||
};
|
||||
|
||||
static const uint16_t isoc_range_max[USB_SPEED_MAX] = {
|
||||
@@ -3542,6 +3551,9 @@ usbd_get_std_packet_size(struct usb_std_packet_size *ptr,
|
||||
[USB_SPEED_HIGH] = 1024,
|
||||
[USB_SPEED_VARIABLE] = 3584,
|
||||
[USB_SPEED_SUPER] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_X2] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_GEN2_X2] = 1024,
|
||||
};
|
||||
|
||||
static const uint16_t control_min[USB_SPEED_MAX] = {
|
||||
@@ -3550,6 +3562,9 @@ usbd_get_std_packet_size(struct usb_std_packet_size *ptr,
|
||||
[USB_SPEED_HIGH] = 64,
|
||||
[USB_SPEED_VARIABLE] = 512,
|
||||
[USB_SPEED_SUPER] = 512,
|
||||
[USB_SPEED_SUPER_PLUS] = 512,
|
||||
[USB_SPEED_SUPER_PLUS_X2] = 512,
|
||||
[USB_SPEED_SUPER_PLUS_GEN2_X2] = 512,
|
||||
};
|
||||
|
||||
static const uint16_t bulk_min[USB_SPEED_MAX] = {
|
||||
@@ -3558,6 +3573,9 @@ usbd_get_std_packet_size(struct usb_std_packet_size *ptr,
|
||||
[USB_SPEED_HIGH] = 512,
|
||||
[USB_SPEED_VARIABLE] = 512,
|
||||
[USB_SPEED_SUPER] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_X2] = 1024,
|
||||
[USB_SPEED_SUPER_PLUS_GEN2_X2] = 1024,
|
||||
};
|
||||
|
||||
uint16_t temp;
|
||||
|
||||
Reference in new issue
Block a user