--- usb-dist/usb-ohci.c Sat Mar 18 20:42:25 2000 +++ linux/drivers/usb/usb-ohci.c Mon Mar 20 12:53:14 2000 @@ -1385,21 +1385,35 @@ break; case RH_GET_DESCRIPTOR | RH_CLASS: - *(__u8 *) (data_buf+1) = 0x29; - put_unaligned(cpu_to_le32 (readl (&ohci->regs->roothub.a)), - (__u32 *) (data_buf + 2)); - *(__u8 *) data_buf = (*(__u8 *) (data_buf + 2) / 8) * 2 + 9; /* length of descriptor */ - - len = min (leni, min(*(__u8 *) data_buf, wLength)); - *(__u8 *) (data_buf+6) = 0; /* Root Hub needs no current from bus */ - if (*(__u8 *) (data_buf+2) < 8) { /* less than 8 Ports */ - *(__u8 *) (data_buf+7) = readl (&ohci->regs->roothub.b) & 0xff; - *(__u8 *) (data_buf+8) = (readl (&ohci->regs->roothub.b) & 0xff0000) >> 16; - } else { - put_unaligned(cpu_to_le32 (readl(&ohci->regs->roothub.b)), - (__u32 *) (data_buf + 7)); + { + __u32 temp = readl (&ohci->regs->roothub.a); + + data_buf [0] = 9; // min length; + data_buf [1] = 0x29; + data_buf [2] = temp & RH_A_NDP; + data_buf [3] = 0; + if (temp & RH_A_PSM) /* per-port power switching? */ + data_buf [3] |= 0x1; + if (temp & RH_A_NOCP) /* no overcurrent reporting? */ + data_buf [3] |= 0x10; + else if (temp & RH_A_OCPM) /* per-port overcurrent reporting? */ + data_buf [3] |= 0x8; + + datab [1] = 0; + data_buf [5] = (temp & RH_A_POTPGT) >> 24; + temp = readl (&ohci->regs->roothub.b); + data_buf [7] = temp & RH_B_DR; + if (data_buf [2] < 7) { + data_buf [8] = 0xff; + } else { + data_buf [0] += 2; + data_buf [8] = (temp & RH_B_DR) >> 8; + data_buf [10] = data_buf [9] = 0xff; + } + + len = min (leni, min (data_buf [0], wLength)); + OK (len); } - OK (len); case RH_GET_CONFIGURATION: *(__u8 *) data_buf = 0x01; OK (1);