Since my first post on Monday got lost, here's the next try:
On Thu, Mar 16, 2000 at 10:37:08PM +0000, Matthew Dharm wrote:
> Could someone with more experience than I with the virtual root hub code
> hack somehting in for me? I'd like some of the string descriptors to be
> usable to identify which one it is. On my system, I have a Tyan MB which
Try the attached patch for usb-uhci. It shows a lot of output (don't know if
it's the the right one for you...). Since all virtual root hubs are based on
Roman's code, it should be easy to transfer.
--
Bye
Georg Acher, [EMAIL PROTECTED]
http://www.in.tum.de/~acher/
"Oh no, not again !" The bowl of petunias
diff -u linux/drivers/usb/usb-uhci.c linux.afs/drivers/usb/usb-uhci.c
--- linux/drivers/usb/usb-uhci.c Mon Mar 20 23:36:45 2000
+++ linux.afs/drivers/usb/usb-uhci.c Mon Mar 20 23:36:26 2000
@@ -1618,9 +1618,9 @@
0x00,
0x00, /* __u16 bcdDevice; */
0x00,
- 0x00, /* __u8 iManufacturer; */
- 0x00, /* __u8 iProduct; */
- 0x00, /* __u8 iSerialNumber; */
+ 0x01, /* __u8 iManufacturer; */
+ 0x02, /* __u8 iProduct; */
+ 0x03, /* __u8 iSerialNumber; */
0x01 /* __u8 bNumConfigurations; */
};
@@ -1674,6 +1674,14 @@
0xff /* __u8 PortPwrCtrlMask; *** 7 ports max *** */
};
+_static __u8 root_hub_langid_des[] =
+{
+ 0x04,
+ 0x03,
+ 0x00,
+ 0x00
+};
+
/*-------------------------------------------------------------------------*/
/* prepare Interrupt pipe transaction data; HUB INTERRUPT ENDPOINT */
_static int rh_send_irq (urb_t *urb)
@@ -1780,6 +1788,10 @@
__u16 wIndex;
__u16 wLength;
+ int stlen,n;
+ char* stringd;
+
+
if (usb_pipetype (pipe) == PIPE_INTERRUPT) {
dbg("Root-Hub submit IRQ: every %d ms", urb->interval);
uhci->rh.urb = urb;
@@ -1917,8 +1929,46 @@
len = min (leni, min (sizeof (root_hub_config_des), wLength));
memcpy (data, root_hub_config_des, len);
OK (len);
+
case (0x03): /*string descriptors */
- stat = -EPIPE;
+ if ((wValue&0xff) == 0 ) {
+ len = min (leni, min (sizeof (root_hub_langid_des),
+wLength));
+ memcpy (data, root_hub_langid_des, len);
+ OK(len);
+ }
+ else if ((wValue&0xff) <= 3 ) {
+ stringd = (char*)kmalloc(128,KMALLOC_FLAG);
+ if (stringd) {
+ struct pci_dev *pcd=uhci->uhci_pci;
+
+ if ((wValue&0xff) == 1 )
+ memcpy(stringd,
+pcd->name,sizeof(pcd->name));
+ else if ((wValue&0xff) == 2 )
+ sprintf(stringd, "UHCI controller &
+root hub, PCI-Vendor: %04x PCI-ID: %04x",
+ pcd->vendor, pcd->device);
+ else
+ sprintf(stringd,"PCI-Bus %i, device
+%i, function %i",
+ pcd->bus->number,
+PCI_SLOT(pcd->devfn), PCI_FUNC(pcd->devfn));
+
+ stlen = 2 + 2*strlen(stringd);
+ len = min (leni, min (stlen, wLength));
+ for(n=0;n<stlen;n++)
+ {
+ if (n == 0)
+ ((char*)data)[0] = stlen;
+ else if (n == 1)
+ ((char*)data)[1] = 3;
+ else if (!(n&1))
+ ((char*)data)[n] = stringd[n/2
+- 1];
+ else
+ ((char*)data)[n] = 0;
+ }
+ kfree(stringd);
+ }
+ OK(len);
+ }
+ else
+ stat = -EPIPE;
}
break;
@@ -2608,7 +2658,7 @@
#endif
printk(KERN_INFO __FILE__ ": USB UHCI at I/O 0x%x, IRQ %s\n",
io_addr, bufp);
-
+
s = kmalloc (sizeof (uhci_t), GFP_KERNEL);
if (!s)
return -1;
@@ -2626,7 +2676,8 @@
s->io_size = io_size;
s->next = devs; //chain new uhci device into global list
s->frame_counter = 0;
-
+ s->uhci_pci=dev;
+
bus = usb_alloc_bus (&uhci_device_operations);
if (!bus) {
kfree (s);
diff -u linux/drivers/usb/usb-uhci.h linux.afs/drivers/usb/usb-uhci.h
--- linux/drivers/usb/usb-uhci.h Mon Mar 20 23:33:24 2000
+++ linux.afs/drivers/usb/usb-uhci.h Mon Mar 20 22:42:57 2000
@@ -209,6 +209,7 @@
struct list_head urb_unlinked; // list of all unlinked urbs
int frame_counter;
+ struct pci_dev *uhci_pci;
} uhci_t, *puhci_t;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]