All of lore.kernel.org
 help / color / mirror / Atom feed
* [Fwd: [Resolved] Grub2 can not detect usb disk]
@ 2011-08-20 21:45 Aleš Nesrsta
  2011-08-21 16:10 ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 5+ messages in thread
From: Aleš Nesrsta @ 2011-08-20 21:45 UTC (permalink / raw)
  To: The development of GNU GRUB

Hi everybody,

could anybody test changes from Cui Lei (see below) in uhci.c - if they
are generally working and does not have some negative effect on machines
with "normal" BIOS etc. ?

Maybe such changes are related only to coreboot and some special use
case/platform, but probably they are related to needed change of UHCI
controller ownership and should be included into uhci.c code.

Regards,
Ales

-------- Přeposlaná zpráva --------
Od: Cui Lei <neverforget_2002@163.com>
Komu: Aleš Nesrsta <starous@volny.cz>
Kopie: The development of GNU GRUB <grub-devel@gnu.org>
Předmět: [Resolved] Grub2 can not detect usb disk
Datum: Fri, 19 Aug 2011 10:58:00 +0800

Thank you for your help, very much! ^_^
This problem have been resolved and I can usb the usb_keyborard under 
grub-shell and I can boot ubuntu11.04 from usb disk.
My mainboard is via 8595a, the usb controller is uhci.
I resolved it by add these code in the grub-core/bus/usb/uhci.c:

(1)
182   /*Set bus master*/
183   addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
184   grub_uint16_t val = grub_pci_read_word(addr);
185   val = (val & ~0) | GRUB_PCI_COMMAND_BUS_MASTER;
186   grub_pci_write_word(addr, val);

(2)
203   // Reset PIRQ and SMI
204   addr = grub_pci_make_address (dev, 0xC0);       
//USBLEGSUP               0xc0
205   grub_pci_write_word(addr, 0x8f00);      //USBLEGSUP_RWC       
0x8f00  /* the R/WC bits */
206   // Reset the HC
207   grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0x0002); 
//USBCMD_HCRESET  0x0002
208   grub_millisleep(5);
209   // Disable interrupts and commands (just to be safe).
210   grub_outw (0, u->iobase + 4);       //USBINTR  4  /*Interrupt 
enable register*/
211   grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);

I don't know whether it is useful to the other one, but may be a reference.

BRs,

Rock.

> Hi,
>
> I am afraid, I maybe will not help You too much but I try it:
>
> I shortly looked into ML to Your posts. As I saw short part of debug
> output in one of Your e-mail, GRUB freezes when it wants to get device
> descriptor - more precisely, when it requests first 8 bytes of device
> descriptor. It is the first thing which is done after address is
> assigned to the device.
>
> So, it looks like device does not set address properly (even if control
> message Set Address returns success) or happened something else what
> prevent device to respond (but I don't know what...).
>
> For the first try You can increase related delays in usbhub.c:
>
> ...
>    /* Wait "recovery interval", spec. says 2ms */
>    grub_millisleep (2);<<<<---- HERE (try 4ms or more)
>
>    grub_usb_device_attach (dev);
> ...
>
> ...
>    /* Enable the port.  */
>    err = hub->controller->dev->portstatus (hub->controller, portno, 1);
>    if (err)
>      return;
>    hub->controller->dev->pending_reset = grub_get_time_ms () + 5000;
>
>    grub_millisleep (10);<<<<---- maybe here also
>
>    /* Enable the port and create a device.  */
>    dev = grub_usb_hub_add_dev (hub->controller, speed, portno, 0);
>    hub->controller->dev->pending_reset = 0;
>    if (! dev)
>      return;
> ...
>
> If this will not help You, I currently have no other idea what could be
> the reason of timeout.
> I think You don't need EHCI because it looks like Set Address control
> message works (at least it does not return error), i.e. You probably
> have OHCI or UHCI USB (companion) controller on computer and Your device
> is working at full or low speed with Your USB controller.
>
> By the way, for the first look into ML I did not find which USB
> controller You have - OHCI/UHCI ? (which driver/module are You using -
> ohci/uhci?) - and which machine/architecture is the computer You are
> trying to boot with GRUB2 - ?
> I sometimes had some unidentified problems on my UHCI/EHCI controller,
> mostly with port powering - UHCI does not have power management but EHCI
> does and if EHCI is not properly initialized by BIOS (it could be Your
> case with coreboot, maybe ?) then USB ports are not properly powered.
> Another BIOS (coreboot?) issue could be improper handling of USB
> controller ownership.
>
> Do You have USB device connected directly into root port or via some USB
> hub ? Try to do it in opposite way (i.e. if You are not using the USB
> hub, try use it and connect USB device via hub - maybe it helps...)
>
> Hmmm, I remember now one issue which could be related to Your problem.
> On my very old machine with OHCI USB controller some devices are not
> working "for the first time". I am still not able to debug why it
> happened (it does not happened when full debug is active - so it looks
> like it is related to some timing). But I am afraid it will be not Your
> case because device stops working after it is recognized, configured,
> usbms module loaded and GRUB USB device usb0 created.
> But - try load ohci/uhci module when USB disk is connected and then
> disconnect and connect it again after few seconds. In my case device
> becomes working as new usb device (i.e. usb1).
>
> Additionally, lot of manufacturers does not follow USB or USBMS
> specifications, as You can read in Linux source code of USB controllers
> and USB mass storage devices and related documentation.
> Did You tried more different USB mass storage devices ?
> What is manufacturer&  type of Your USB mass storage device ?
>
> Of course, You can also try EHCI driver, it maybe can solve Your problem
> because of little bit different ports/devices handling. But EHCI driver
> is currently highly experimental, it still exists only as uncorrected
> and not accepted "patch". I have to do some improvement but I don't have
> sufficient time still, unfortunately...
> If You want try to use it, You can get my patch from ML (sent at
> 25.6.2011) and use it with related source code trunk branch revision
> (maybe also any later or current revision, because USB parts of GRUB are
> not frequently changed). Please also read about know issue and another
> limitations of the "zero version" of EHCI driver - e.g. it may not work
> if Your PC is not x86 machine or USB registers are mapped above 4GB etc.
>
> Sorry if You will wait longer time for my response in future - I don't
> check the post so often and additionally currently I am (and probably
> will be) longer time too busy - I am not regular GRUB2 contributor, I do
> something for GRUB2 USB part only time to time...
>
> BRs,
> Ales
>
>
> Cui Lei píše v Út 09. 08. 2011 v 11:05 +0800:
>> Hi Aleš,
>> I am trying to boot OS from USB  disk, I use coreboot-v4 with grub2 as
>> payload, but my usb disk can not been
>> detect. I try to use usb-keyboard, it is not working.  I know you are
>> working on the EHCI driver from Vladimir ,
>> could you give me some advices? Vladimir said it may need EHCI driver,
>> but I think the usb device should run
>> with low-speed or full-speed if no EHCI driver.C
>>
>> Looking forward to your reply.
>> BRs,
>> Rock Cui.
>>
>>
>







^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Fwd: [Resolved] Grub2 can not detect usb disk]
  2011-08-20 21:45 [Fwd: [Resolved] Grub2 can not detect usb disk] Aleš Nesrsta
@ 2011-08-21 16:10 ` Vladimir 'φ-coder/phcoder' Serbinenko
  2011-08-26  9:57   ` [PATCH] " Aleš Nesrsta
  0 siblings, 1 reply; 5+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2011-08-21 16:10 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 7937 bytes --]

On 20.08.2011 23:45, Aleš Nesrsta wrote:
> Hi everybody,
>
> could anybody test changes from Cui Lei (see below) in uhci.c - if they
> are generally working and does not have some negative effect on machines
> with "normal" BIOS etc. ?
>
> Maybe such changes are related only to coreboot and some special use
> case/platform, but probably they are related to needed change of UHCI
> controller ownership and should be included into uhci.c code.
>
I don't think it is. The difference is that coreboot doesn't use USB
itself so it's initialised but disabled initially which I expect also to
happen with some older BIOSes so this code is perfectly ok to be added
generically.
@Rock or Aleš: Could someone of you clean this up (macroify and comment
style mainly) and supply as a .diff ?
> Regards,
> Ales
>
> -------- Přeposlaná zpráva --------
> Od: Cui Lei <neverforget_2002@163.com>
> Komu: Aleš Nesrsta <starous@volny.cz>
> Kopie: The development of GNU GRUB <grub-devel@gnu.org>
> Předmět: [Resolved] Grub2 can not detect usb disk
> Datum: Fri, 19 Aug 2011 10:58:00 +0800
>
> Thank you for your help, very much! ^_^
> This problem have been resolved and I can usb the usb_keyborard under 
> grub-shell and I can boot ubuntu11.04 from usb disk.
> My mainboard is via 8595a, the usb controller is uhci.
> I resolved it by add these code in the grub-core/bus/usb/uhci.c:
>
> (1)
> 182   /*Set bus master*/
> 183   addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
> 184   grub_uint16_t val = grub_pci_read_word(addr);
> 185   val = (val & ~0) | GRUB_PCI_COMMAND_BUS_MASTER;
> 186   grub_pci_write_word(addr, val);
>
> (2)
> 203   // Reset PIRQ and SMI
> 204   addr = grub_pci_make_address (dev, 0xC0);       
> //USBLEGSUP               0xc0
> 205   grub_pci_write_word(addr, 0x8f00);      //USBLEGSUP_RWC       
> 0x8f00  /* the R/WC bits */
> 206   // Reset the HC
> 207   grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0x0002); 
> //USBCMD_HCRESET  0x0002
> 208   grub_millisleep(5);
> 209   // Disable interrupts and commands (just to be safe).
> 210   grub_outw (0, u->iobase + 4);       //USBINTR  4  /*Interrupt 
> enable register*/
> 211   grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
>
> I don't know whether it is useful to the other one, but may be a reference.
>
> BRs,
>
> Rock.
>
>> Hi,
>>
>> I am afraid, I maybe will not help You too much but I try it:
>>
>> I shortly looked into ML to Your posts. As I saw short part of debug
>> output in one of Your e-mail, GRUB freezes when it wants to get device
>> descriptor - more precisely, when it requests first 8 bytes of device
>> descriptor. It is the first thing which is done after address is
>> assigned to the device.
>>
>> So, it looks like device does not set address properly (even if control
>> message Set Address returns success) or happened something else what
>> prevent device to respond (but I don't know what...).
>>
>> For the first try You can increase related delays in usbhub.c:
>>
>> ...
>>    /* Wait "recovery interval", spec. says 2ms */
>>    grub_millisleep (2);<<<<---- HERE (try 4ms or more)
>>
>>    grub_usb_device_attach (dev);
>> ...
>>
>> ...
>>    /* Enable the port.  */
>>    err = hub->controller->dev->portstatus (hub->controller, portno, 1);
>>    if (err)
>>      return;
>>    hub->controller->dev->pending_reset = grub_get_time_ms () + 5000;
>>
>>    grub_millisleep (10);<<<<---- maybe here also
>>
>>    /* Enable the port and create a device.  */
>>    dev = grub_usb_hub_add_dev (hub->controller, speed, portno, 0);
>>    hub->controller->dev->pending_reset = 0;
>>    if (! dev)
>>      return;
>> ...
>>
>> If this will not help You, I currently have no other idea what could be
>> the reason of timeout.
>> I think You don't need EHCI because it looks like Set Address control
>> message works (at least it does not return error), i.e. You probably
>> have OHCI or UHCI USB (companion) controller on computer and Your device
>> is working at full or low speed with Your USB controller.
>>
>> By the way, for the first look into ML I did not find which USB
>> controller You have - OHCI/UHCI ? (which driver/module are You using -
>> ohci/uhci?) - and which machine/architecture is the computer You are
>> trying to boot with GRUB2 - ?
>> I sometimes had some unidentified problems on my UHCI/EHCI controller,
>> mostly with port powering - UHCI does not have power management but EHCI
>> does and if EHCI is not properly initialized by BIOS (it could be Your
>> case with coreboot, maybe ?) then USB ports are not properly powered.
>> Another BIOS (coreboot?) issue could be improper handling of USB
>> controller ownership.
>>
>> Do You have USB device connected directly into root port or via some USB
>> hub ? Try to do it in opposite way (i.e. if You are not using the USB
>> hub, try use it and connect USB device via hub - maybe it helps...)
>>
>> Hmmm, I remember now one issue which could be related to Your problem.
>> On my very old machine with OHCI USB controller some devices are not
>> working "for the first time". I am still not able to debug why it
>> happened (it does not happened when full debug is active - so it looks
>> like it is related to some timing). But I am afraid it will be not Your
>> case because device stops working after it is recognized, configured,
>> usbms module loaded and GRUB USB device usb0 created.
>> But - try load ohci/uhci module when USB disk is connected and then
>> disconnect and connect it again after few seconds. In my case device
>> becomes working as new usb device (i.e. usb1).
>>
>> Additionally, lot of manufacturers does not follow USB or USBMS
>> specifications, as You can read in Linux source code of USB controllers
>> and USB mass storage devices and related documentation.
>> Did You tried more different USB mass storage devices ?
>> What is manufacturer&  type of Your USB mass storage device ?
>>
>> Of course, You can also try EHCI driver, it maybe can solve Your problem
>> because of little bit different ports/devices handling. But EHCI driver
>> is currently highly experimental, it still exists only as uncorrected
>> and not accepted "patch". I have to do some improvement but I don't have
>> sufficient time still, unfortunately...
>> If You want try to use it, You can get my patch from ML (sent at
>> 25.6.2011) and use it with related source code trunk branch revision
>> (maybe also any later or current revision, because USB parts of GRUB are
>> not frequently changed). Please also read about know issue and another
>> limitations of the "zero version" of EHCI driver - e.g. it may not work
>> if Your PC is not x86 machine or USB registers are mapped above 4GB etc.
>>
>> Sorry if You will wait longer time for my response in future - I don't
>> check the post so often and additionally currently I am (and probably
>> will be) longer time too busy - I am not regular GRUB2 contributor, I do
>> something for GRUB2 USB part only time to time...
>>
>> BRs,
>> Ales
>>
>>
>> Cui Lei píše v Út 09. 08. 2011 v 11:05 +0800:
>>> Hi Aleš,
>>> I am trying to boot OS from USB  disk, I use coreboot-v4 with grub2 as
>>> payload, but my usb disk can not been
>>> detect. I try to use usb-keyboard, it is not working.  I know you are
>>> working on the EHCI driver from Vladimir ,
>>> could you give me some advices? Vladimir said it may need EHCI driver,
>>> but I think the usb device should run
>>> with low-speed or full-speed if no EHCI driver.C
>>>
>>> Looking forward to your reply.
>>> BRs,
>>> Rock Cui.
>>>
>>>
>
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] Re: [Fwd: [Resolved] Grub2 can not detect usb disk]
  2011-08-21 16:10 ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2011-08-26  9:57   ` Aleš Nesrsta
  2011-09-29  9:35     ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 5+ messages in thread
From: Aleš Nesrsta @ 2011-08-26  9:57 UTC (permalink / raw)
  To: The development of GNU GRUB

[-- Attachment #1: Type: text/plain, Size: 9512 bytes --]

Hi Vladimir,

there is the patch with @Rock changes.

I hope I didn't make some mistake during cleanup/macroify...

You may note some additional cosmetic changes:

1.
...
+  /* Finish HC reset, HC remains disabled */
+  grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0);
+  /* Read back to be sure PCI write is done */
+  grub_uhci_readreg16(u, GRUB_UHCI_REG_USBCMD);
...
I think it is more safe to ensure the command is written into PCI
register before executing next code.

2.
-  /* Make sure UHCI is disabled!  */
-  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
-
It is not necessary yet because UHCI is disabled sooner in code which is
listed above in point 1.

3.
-  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 1 | (1 << 7));
+  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD,
+                        GRUB_UHCI_CMD_RUN_STOP | GRUB_UHCI_CMD_MAXP);
Some very small cleanup of previous code...


I very shortly tested this patch, it seems to be working OK.

Best regards,
Ales

Vladimir 'φ-coder/phcoder' Serbinenko píše v Ne 21. 08. 2011 v 18:10
+0200:
> On 20.08.2011 23:45, Aleš Nesrsta wrote:
> > Hi everybody,
> >
> > could anybody test changes from Cui Lei (see below) in uhci.c - if they
> > are generally working and does not have some negative effect on machines
> > with "normal" BIOS etc. ?
> >
> > Maybe such changes are related only to coreboot and some special use
> > case/platform, but probably they are related to needed change of UHCI
> > controller ownership and should be included into uhci.c code.
> >
> I don't think it is. The difference is that coreboot doesn't use USB
> itself so it's initialised but disabled initially which I expect also to
> happen with some older BIOSes so this code is perfectly ok to be added
> generically.
> @Rock or Aleš: Could someone of you clean this up (macroify and comment
> style mainly) and supply as a .diff ?
> > Regards,
> > Ales
> >
> > -------- Přeposlaná zpráva --------
> > Od: Cui Lei <neverforget_2002@163.com>
> > Komu: Aleš Nesrsta <starous@volny.cz>
> > Kopie: The development of GNU GRUB <grub-devel@gnu.org>
> > Předmět: [Resolved] Grub2 can not detect usb disk
> > Datum: Fri, 19 Aug 2011 10:58:00 +0800
> >
> > Thank you for your help, very much! ^_^
> > This problem have been resolved and I can usb the usb_keyborard under 
> > grub-shell and I can boot ubuntu11.04 from usb disk.
> > My mainboard is via 8595a, the usb controller is uhci.
> > I resolved it by add these code in the grub-core/bus/usb/uhci.c:
> >
> > (1)
> > 182   /*Set bus master*/
> > 183   addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
> > 184   grub_uint16_t val = grub_pci_read_word(addr);
> > 185   val = (val & ~0) | GRUB_PCI_COMMAND_BUS_MASTER;
> > 186   grub_pci_write_word(addr, val);
> >
> > (2)
> > 203   // Reset PIRQ and SMI
> > 204   addr = grub_pci_make_address (dev, 0xC0);       
> > //USBLEGSUP               0xc0
> > 205   grub_pci_write_word(addr, 0x8f00);      //USBLEGSUP_RWC       
> > 0x8f00  /* the R/WC bits */
> > 206   // Reset the HC
> > 207   grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0x0002); 
> > //USBCMD_HCRESET  0x0002
> > 208   grub_millisleep(5);
> > 209   // Disable interrupts and commands (just to be safe).
> > 210   grub_outw (0, u->iobase + 4);       //USBINTR  4  /*Interrupt 
> > enable register*/
> > 211   grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
> >
> > I don't know whether it is useful to the other one, but may be a reference.
> >
> > BRs,
> >
> > Rock.
> >
> >> Hi,
> >>
> >> I am afraid, I maybe will not help You too much but I try it:
> >>
> >> I shortly looked into ML to Your posts. As I saw short part of debug
> >> output in one of Your e-mail, GRUB freezes when it wants to get device
> >> descriptor - more precisely, when it requests first 8 bytes of device
> >> descriptor. It is the first thing which is done after address is
> >> assigned to the device.
> >>
> >> So, it looks like device does not set address properly (even if control
> >> message Set Address returns success) or happened something else what
> >> prevent device to respond (but I don't know what...).
> >>
> >> For the first try You can increase related delays in usbhub.c:
> >>
> >> ...
> >>    /* Wait "recovery interval", spec. says 2ms */
> >>    grub_millisleep (2);<<<<---- HERE (try 4ms or more)
> >>
> >>    grub_usb_device_attach (dev);
> >> ...
> >>
> >> ...
> >>    /* Enable the port.  */
> >>    err = hub->controller->dev->portstatus (hub->controller, portno, 1);
> >>    if (err)
> >>      return;
> >>    hub->controller->dev->pending_reset = grub_get_time_ms () + 5000;
> >>
> >>    grub_millisleep (10);<<<<---- maybe here also
> >>
> >>    /* Enable the port and create a device.  */
> >>    dev = grub_usb_hub_add_dev (hub->controller, speed, portno, 0);
> >>    hub->controller->dev->pending_reset = 0;
> >>    if (! dev)
> >>      return;
> >> ...
> >>
> >> If this will not help You, I currently have no other idea what could be
> >> the reason of timeout.
> >> I think You don't need EHCI because it looks like Set Address control
> >> message works (at least it does not return error), i.e. You probably
> >> have OHCI or UHCI USB (companion) controller on computer and Your device
> >> is working at full or low speed with Your USB controller.
> >>
> >> By the way, for the first look into ML I did not find which USB
> >> controller You have - OHCI/UHCI ? (which driver/module are You using -
> >> ohci/uhci?) - and which machine/architecture is the computer You are
> >> trying to boot with GRUB2 - ?
> >> I sometimes had some unidentified problems on my UHCI/EHCI controller,
> >> mostly with port powering - UHCI does not have power management but EHCI
> >> does and if EHCI is not properly initialized by BIOS (it could be Your
> >> case with coreboot, maybe ?) then USB ports are not properly powered.
> >> Another BIOS (coreboot?) issue could be improper handling of USB
> >> controller ownership.
> >>
> >> Do You have USB device connected directly into root port or via some USB
> >> hub ? Try to do it in opposite way (i.e. if You are not using the USB
> >> hub, try use it and connect USB device via hub - maybe it helps...)
> >>
> >> Hmmm, I remember now one issue which could be related to Your problem.
> >> On my very old machine with OHCI USB controller some devices are not
> >> working "for the first time". I am still not able to debug why it
> >> happened (it does not happened when full debug is active - so it looks
> >> like it is related to some timing). But I am afraid it will be not Your
> >> case because device stops working after it is recognized, configured,
> >> usbms module loaded and GRUB USB device usb0 created.
> >> But - try load ohci/uhci module when USB disk is connected and then
> >> disconnect and connect it again after few seconds. In my case device
> >> becomes working as new usb device (i.e. usb1).
> >>
> >> Additionally, lot of manufacturers does not follow USB or USBMS
> >> specifications, as You can read in Linux source code of USB controllers
> >> and USB mass storage devices and related documentation.
> >> Did You tried more different USB mass storage devices ?
> >> What is manufacturer&  type of Your USB mass storage device ?
> >>
> >> Of course, You can also try EHCI driver, it maybe can solve Your problem
> >> because of little bit different ports/devices handling. But EHCI driver
> >> is currently highly experimental, it still exists only as uncorrected
> >> and not accepted "patch". I have to do some improvement but I don't have
> >> sufficient time still, unfortunately...
> >> If You want try to use it, You can get my patch from ML (sent at
> >> 25.6.2011) and use it with related source code trunk branch revision
> >> (maybe also any later or current revision, because USB parts of GRUB are
> >> not frequently changed). Please also read about know issue and another
> >> limitations of the "zero version" of EHCI driver - e.g. it may not work
> >> if Your PC is not x86 machine or USB registers are mapped above 4GB etc.
> >>
> >> Sorry if You will wait longer time for my response in future - I don't
> >> check the post so often and additionally currently I am (and probably
> >> will be) longer time too busy - I am not regular GRUB2 contributor, I do
> >> something for GRUB2 USB part only time to time...
> >>
> >> BRs,
> >> Ales
> >>
> >>
> >> Cui Lei píše v Út 09. 08. 2011 v 11:05 +0800:
> >>> Hi Aleš,
> >>> I am trying to boot OS from USB  disk, I use coreboot-v4 with grub2 as
> >>> payload, but my usb disk can not been
> >>> detect. I try to use usb-keyboard, it is not working.  I know you are
> >>> working on the EHCI driver from Vladimir ,
> >>> could you give me some advices? Vladimir said it may need EHCI driver,
> >>> but I think the usb device should run
> >>> with low-speed or full-speed if no EHCI driver.C
> >>>
> >>> Looking forward to your reply.
> >>> BRs,
> >>> Rock Cui.
> >>>
> >>>
> >
> >
> >
> >
> >
> > _______________________________________________
> > Grub-devel mailing list
> > Grub-devel@gnu.org
> > https://lists.gnu.org/mailman/listinfo/grub-devel
> 
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel


[-- Attachment #2: usb_patch_uhci_110826_0 --]
[-- Type: text/x-patch, Size: 3609 bytes --]

diff -purB ./grub/grub-core/bus/usb/uhci.c ./grub_patched/grub-core/bus/usb/uhci.c
--- ./grub/grub-core/bus/usb/uhci.c	2011-08-26 10:21:39.000000000 +0200
+++ ./grub_patched/grub-core/bus/usb/uhci.c	2011-08-26 11:29:52.000000000 +0200
@@ -36,11 +36,33 @@ GRUB_MOD_LICENSE ("GPLv3+");
 typedef enum
   {
     GRUB_UHCI_REG_USBCMD = 0x00,
+    GRUB_UHCI_REG_USBINTR = 0x04,
     GRUB_UHCI_REG_FLBASEADD = 0x08,
     GRUB_UHCI_REG_PORTSC1 = 0x10,
-    GRUB_UHCI_REG_PORTSC2 = 0x12
+    GRUB_UHCI_REG_PORTSC2 = 0x12,
+    GRUB_UHCI_REG_USBLEGSUP = 0xc0
   } grub_uhci_reg_t;
 
+/* R/WC legacy support bits */
+#define GRUB_UHCI_LEGSUP_END_A20GATE (1 << 15)
+#define GRUB_UHCI_TRAP_BY_64H_WSTAT  (1 << 11)
+#define GRUB_UHCI_TRAP_BY_64H_RSTAT  (1 << 10)
+#define GRUB_UHCI_TRAP_BY_60H_WSTAT  (1 <<  9)
+#define GRUB_UHCI_TRAP_BY_60H_RSTAT  (1 <<  8)
+
+/* Reset all legacy support - clear all R/WC bits and all R/W bits */
+#define GRUB_UHCI_RESET_LEGSUP_SMI ( GRUB_UHCI_LEGSUP_END_A20GATE \
+                                     | GRUB_UHCI_TRAP_BY_64H_WSTAT \
+                                     | GRUB_UHCI_TRAP_BY_64H_RSTAT \
+                                     | GRUB_UHCI_TRAP_BY_60H_WSTAT \
+                                     | GRUB_UHCI_TRAP_BY_60H_RSTAT )
+
+/* Some UHCI commands */
+#define GRUB_UHCI_CMD_RUN_STOP (1 << 0)
+#define GRUB_UHCI_CMD_HCRESET  (1 << 1)
+#define GRUB_UHCI_CMD_MAXP     (1 << 7)
+
+/* Important bits in structures */
 #define GRUB_UHCI_LINK_TERMINATE	1
 #define GRUB_UHCI_LINK_QUEUE_HEAD	2
 
@@ -181,6 +203,11 @@ grub_uhci_pci_iter (grub_pci_device_t de
   if (class != 0x0c || subclass != 0x03 || interf != 0x00)
     return 0;
 
+  /* Set bus master - needed for coreboot or broken BIOSes */
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+  grub_pci_write_word(addr,
+    GRUB_PCI_COMMAND_BUS_MASTER | grub_pci_read_word(addr));
+
   /* Determine IO base address.  */
   addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG4);
   base = grub_pci_read (addr);
@@ -195,6 +222,19 @@ grub_uhci_pci_iter (grub_pci_device_t de
 
   u->iobase = base & GRUB_UHCI_IOMASK;
 
+  /* Reset PIRQ and SMI */
+  addr = grub_pci_make_address (dev, GRUB_UHCI_REG_USBLEGSUP);       
+  grub_pci_write_word(addr, GRUB_UHCI_RESET_LEGSUP_SMI);
+  /* Reset the HC */
+  grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, GRUB_UHCI_CMD_HCRESET); 
+  grub_millisleep(5);
+  /* Disable interrupts and commands (just to be safe) */
+  grub_uhci_writereg16(u, GRUB_UHCI_REG_USBINTR, 0);
+  /* Finish HC reset, HC remains disabled */
+  grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0);
+  /* Read back to be sure PCI write is done */
+  grub_uhci_readreg16(u, GRUB_UHCI_REG_USBCMD);
+
   /* Reserve a page for the frame list.  */
   u->framelist = grub_memalign (4096, 4096);
   if (! u->framelist)
@@ -252,9 +292,6 @@ grub_uhci_pci_iter (grub_pci_device_t de
   u->td[N_TD - 2].linkptr = 0;
   u->tdfree = u->td;
 
-  /* Make sure UHCI is disabled!  */
-  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
-
   /* Setup the frame list pointers.  Since no isochronous transfers
      are and will be supported, they all point to the (same!) queue
      head.  */
@@ -285,7 +322,8 @@ grub_uhci_pci_iter (grub_pci_device_t de
   u->qh[N_QH - 1].linkptr = 1;
 
   /* Enable UHCI again.  */
-  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 1 | (1 << 7));
+  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD,
+                        GRUB_UHCI_CMD_RUN_STOP | GRUB_UHCI_CMD_MAXP);
 
   /* UHCI is initialized and ready for transfers.  */
   grub_dprintf ("uhci", "UHCI initialized\n");

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Re: [Fwd: [Resolved] Grub2 can not detect usb disk]
  2011-08-26  9:57   ` [PATCH] " Aleš Nesrsta
@ 2011-09-29  9:35     ` Vladimir 'φ-coder/phcoder' Serbinenko
  2011-10-01 22:03       ` Aleš Nesrsta
  0 siblings, 1 reply; 5+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2011-09-29  9:35 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 9956 bytes --]

On 26.08.2011 11:57, Aleš Nesrsta wrote:
> Hi Vladimir,
>
> there is the patch with @Rock changes.
Go ahead. Don't forget to put an acknowledgement to Rock Cui (put him as
an author, and yourself as a co-author)
> I hope I didn't make some mistake during cleanup/macroify...
>
> You may note some additional cosmetic changes:
>
> 1.
> ...
> +  /* Finish HC reset, HC remains disabled */
> +  grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0);
> +  /* Read back to be sure PCI write is done */
> +  grub_uhci_readreg16(u, GRUB_UHCI_REG_USBCMD);
> ...
> I think it is more safe to ensure the command is written into PCI
> register before executing next code.
>
> 2.
> -  /* Make sure UHCI is disabled!  */
> -  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
> -
> It is not necessary yet because UHCI is disabled sooner in code which is
> listed above in point 1.
>
> 3.
> -  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 1 | (1 << 7));
> +  grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD,
> +                        GRUB_UHCI_CMD_RUN_STOP | GRUB_UHCI_CMD_MAXP);
> Some very small cleanup of previous code...
>
>
> I very shortly tested this patch, it seems to be working OK.
>
> Best regards,
> Ales
>
> Vladimir 'φ-coder/phcoder' Serbinenko píše v Ne 21. 08. 2011 v 18:10
> +0200:
>> On 20.08.2011 23:45, Aleš Nesrsta wrote:
>>> Hi everybody,
>>>
>>> could anybody test changes from Cui Lei (see below) in uhci.c - if they
>>> are generally working and does not have some negative effect on machines
>>> with "normal" BIOS etc. ?
>>>
>>> Maybe such changes are related only to coreboot and some special use
>>> case/platform, but probably they are related to needed change of UHCI
>>> controller ownership and should be included into uhci.c code.
>>>
>> I don't think it is. The difference is that coreboot doesn't use USB
>> itself so it's initialised but disabled initially which I expect also to
>> happen with some older BIOSes so this code is perfectly ok to be added
>> generically.
>> @Rock or Aleš: Could someone of you clean this up (macroify and comment
>> style mainly) and supply as a .diff ?
>>> Regards,
>>> Ales
>>>
>>> -------- Přeposlaná zpráva --------
>>> Od: Cui Lei <neverforget_2002@163.com>
>>> Komu: Aleš Nesrsta <starous@volny.cz>
>>> Kopie: The development of GNU GRUB <grub-devel@gnu.org>
>>> Předmět: [Resolved] Grub2 can not detect usb disk
>>> Datum: Fri, 19 Aug 2011 10:58:00 +0800
>>>
>>> Thank you for your help, very much! ^_^
>>> This problem have been resolved and I can usb the usb_keyborard under 
>>> grub-shell and I can boot ubuntu11.04 from usb disk.
>>> My mainboard is via 8595a, the usb controller is uhci.
>>> I resolved it by add these code in the grub-core/bus/usb/uhci.c:
>>>
>>> (1)
>>> 182   /*Set bus master*/
>>> 183   addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
>>> 184   grub_uint16_t val = grub_pci_read_word(addr);
>>> 185   val = (val & ~0) | GRUB_PCI_COMMAND_BUS_MASTER;
>>> 186   grub_pci_write_word(addr, val);
>>>
>>> (2)
>>> 203   // Reset PIRQ and SMI
>>> 204   addr = grub_pci_make_address (dev, 0xC0);       
>>> //USBLEGSUP               0xc0
>>> 205   grub_pci_write_word(addr, 0x8f00);      //USBLEGSUP_RWC       
>>> 0x8f00  /* the R/WC bits */
>>> 206   // Reset the HC
>>> 207   grub_uhci_writereg16(u, GRUB_UHCI_REG_USBCMD, 0x0002); 
>>> //USBCMD_HCRESET  0x0002
>>> 208   grub_millisleep(5);
>>> 209   // Disable interrupts and commands (just to be safe).
>>> 210   grub_outw (0, u->iobase + 4);       //USBINTR  4  /*Interrupt 
>>> enable register*/
>>> 211   grub_uhci_writereg16 (u, GRUB_UHCI_REG_USBCMD, 0);
>>>
>>> I don't know whether it is useful to the other one, but may be a reference.
>>>
>>> BRs,
>>>
>>> Rock.
>>>
>>>> Hi,
>>>>
>>>> I am afraid, I maybe will not help You too much but I try it:
>>>>
>>>> I shortly looked into ML to Your posts. As I saw short part of debug
>>>> output in one of Your e-mail, GRUB freezes when it wants to get device
>>>> descriptor - more precisely, when it requests first 8 bytes of device
>>>> descriptor. It is the first thing which is done after address is
>>>> assigned to the device.
>>>>
>>>> So, it looks like device does not set address properly (even if control
>>>> message Set Address returns success) or happened something else what
>>>> prevent device to respond (but I don't know what...).
>>>>
>>>> For the first try You can increase related delays in usbhub.c:
>>>>
>>>> ...
>>>>    /* Wait "recovery interval", spec. says 2ms */
>>>>    grub_millisleep (2);<<<<---- HERE (try 4ms or more)
>>>>
>>>>    grub_usb_device_attach (dev);
>>>> ...
>>>>
>>>> ...
>>>>    /* Enable the port.  */
>>>>    err = hub->controller->dev->portstatus (hub->controller, portno, 1);
>>>>    if (err)
>>>>      return;
>>>>    hub->controller->dev->pending_reset = grub_get_time_ms () + 5000;
>>>>
>>>>    grub_millisleep (10);<<<<---- maybe here also
>>>>
>>>>    /* Enable the port and create a device.  */
>>>>    dev = grub_usb_hub_add_dev (hub->controller, speed, portno, 0);
>>>>    hub->controller->dev->pending_reset = 0;
>>>>    if (! dev)
>>>>      return;
>>>> ...
>>>>
>>>> If this will not help You, I currently have no other idea what could be
>>>> the reason of timeout.
>>>> I think You don't need EHCI because it looks like Set Address control
>>>> message works (at least it does not return error), i.e. You probably
>>>> have OHCI or UHCI USB (companion) controller on computer and Your device
>>>> is working at full or low speed with Your USB controller.
>>>>
>>>> By the way, for the first look into ML I did not find which USB
>>>> controller You have - OHCI/UHCI ? (which driver/module are You using -
>>>> ohci/uhci?) - and which machine/architecture is the computer You are
>>>> trying to boot with GRUB2 - ?
>>>> I sometimes had some unidentified problems on my UHCI/EHCI controller,
>>>> mostly with port powering - UHCI does not have power management but EHCI
>>>> does and if EHCI is not properly initialized by BIOS (it could be Your
>>>> case with coreboot, maybe ?) then USB ports are not properly powered.
>>>> Another BIOS (coreboot?) issue could be improper handling of USB
>>>> controller ownership.
>>>>
>>>> Do You have USB device connected directly into root port or via some USB
>>>> hub ? Try to do it in opposite way (i.e. if You are not using the USB
>>>> hub, try use it and connect USB device via hub - maybe it helps...)
>>>>
>>>> Hmmm, I remember now one issue which could be related to Your problem.
>>>> On my very old machine with OHCI USB controller some devices are not
>>>> working "for the first time". I am still not able to debug why it
>>>> happened (it does not happened when full debug is active - so it looks
>>>> like it is related to some timing). But I am afraid it will be not Your
>>>> case because device stops working after it is recognized, configured,
>>>> usbms module loaded and GRUB USB device usb0 created.
>>>> But - try load ohci/uhci module when USB disk is connected and then
>>>> disconnect and connect it again after few seconds. In my case device
>>>> becomes working as new usb device (i.e. usb1).
>>>>
>>>> Additionally, lot of manufacturers does not follow USB or USBMS
>>>> specifications, as You can read in Linux source code of USB controllers
>>>> and USB mass storage devices and related documentation.
>>>> Did You tried more different USB mass storage devices ?
>>>> What is manufacturer&  type of Your USB mass storage device ?
>>>>
>>>> Of course, You can also try EHCI driver, it maybe can solve Your problem
>>>> because of little bit different ports/devices handling. But EHCI driver
>>>> is currently highly experimental, it still exists only as uncorrected
>>>> and not accepted "patch". I have to do some improvement but I don't have
>>>> sufficient time still, unfortunately...
>>>> If You want try to use it, You can get my patch from ML (sent at
>>>> 25.6.2011) and use it with related source code trunk branch revision
>>>> (maybe also any later or current revision, because USB parts of GRUB are
>>>> not frequently changed). Please also read about know issue and another
>>>> limitations of the "zero version" of EHCI driver - e.g. it may not work
>>>> if Your PC is not x86 machine or USB registers are mapped above 4GB etc.
>>>>
>>>> Sorry if You will wait longer time for my response in future - I don't
>>>> check the post so often and additionally currently I am (and probably
>>>> will be) longer time too busy - I am not regular GRUB2 contributor, I do
>>>> something for GRUB2 USB part only time to time...
>>>>
>>>> BRs,
>>>> Ales
>>>>
>>>>
>>>> Cui Lei píše v Út 09. 08. 2011 v 11:05 +0800:
>>>>> Hi Aleš,
>>>>> I am trying to boot OS from USB  disk, I use coreboot-v4 with grub2 as
>>>>> payload, but my usb disk can not been
>>>>> detect. I try to use usb-keyboard, it is not working.  I know you are
>>>>> working on the EHCI driver from Vladimir ,
>>>>> could you give me some advices? Vladimir said it may need EHCI driver,
>>>>> but I think the usb device should run
>>>>> with low-speed or full-speed if no EHCI driver.C
>>>>>
>>>>> Looking forward to your reply.
>>>>> BRs,
>>>>> Rock Cui.
>>>>>
>>>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Grub-devel mailing list
>>> Grub-devel@gnu.org
>>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Re: [Fwd: [Resolved] Grub2 can not detect usb disk]
  2011-09-29  9:35     ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2011-10-01 22:03       ` Aleš Nesrsta
  0 siblings, 0 replies; 5+ messages in thread
From: Aleš Nesrsta @ 2011-10-01 22:03 UTC (permalink / raw)
  To: The development of GNU GRUB

Hi Vladimir,

@Rock changes merged into trunk.

I did not find any author(s) information in file headers (in any USB related 
source file), so I put this information in ChangeLog file in this way:

2011-10-01  Ales Nesrsta <starous@volny.cz>

 * grub-core/bus/usb/uhci.c: Changes made by Rock Cui - thanks!
 (fixed problem related to using UHCI with coreboot).

Best regards
Ales

----- Original Message ----- 
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: <grub-devel@gnu.org>
Sent: Thursday, September 29, 2011 11:35 AM
Subject: Re: [PATCH] Re: [Fwd: [Resolved] Grub2 can not detect usb disk]


> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
> 



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-10-01 22:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-20 21:45 [Fwd: [Resolved] Grub2 can not detect usb disk] Aleš Nesrsta
2011-08-21 16:10 ` Vladimir 'φ-coder/phcoder' Serbinenko
2011-08-26  9:57   ` [PATCH] " Aleš Nesrsta
2011-09-29  9:35     ` Vladimir 'φ-coder/phcoder' Serbinenko
2011-10-01 22:03       ` Aleš Nesrsta

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.