grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Fwd: [Resolved] Grub2 can not detect usb disk]


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [Fwd: [Resolved] Grub2 can not detect usb disk]
Date: Sun, 21 Aug 2011 18:10:30 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18) Gecko/20110626 Iceowl/1.0b2 Icedove/3.1.11

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 <address@hidden>
> Komu: Aleš Nesrsta <address@hidden>
> Kopie: The development of GNU GRUB <address@hidden>
> 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
> address@hidden
> https://lists.gnu.org/mailman/listinfo/grub-devel


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


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]