Leo Cardinaals’s Weblog

juli 10, 2008

iPod: reset high speed USB device using ehci_hcd in kern.log

Ingedeeld onder: Ubuntu — Leo @ 2:48 pm
Tags: , , , ,


Soms als ik veel bestanden op de iPod zet, dan wordt de iPod automatisch offline gebracht door de Ubuntu kernel. Dit heeft iets te maken met de EHCI (Enhanced Host Controller Interface) Linux driver voor USB 2.0. Dit treedt op onder heel veel Linux distributies. Het schijnt iets in de ehci-hcd kernel module te zijn. Dit artikel beschrijft een work-around, totdat het probleem onder Linux is opgelost.

Bij mij gebeurt dit als ik onder Amarok (of Rhythmbox of gtkpod) liedjes verwijder van of toevoeg op mijn iPod. Lezen is geen probleem. In eerste instantie dacht ik dat dit een rechtenprobleem was, omdat Amarok zei dat hij bestanden niet kon wegschrijven. Dit klopte ook, maar was een gevolg van het feit dat de iPod offline ging.
De meldingen in de /var/log/kern.log waren:

Jul 8 13:50:02 home kernel: [ 8308.467556] usb 5-4: reset high speed USB device using ehci_hcd and address 3
Jul 8 13:50:12 home kernel: [ 8318.682023] usb 5-4: reset high speed USB device using ehci_hcd and address 3
Jul 8 13:50:29 home kernel: [ 8334.977315] usb 5-4: reset high speed USB device using ehci_hcd and address 3
Jul 8 13:50:29 home kernel: [ 8335.223591] usb 5-4: reset high speed USB device using ehci_hcd and address 3
Jul 8 13:50:39 home kernel: [ 8345.437292] usb 5-4: reset high speed USB device using ehci_hcd and address 3
Jul 8 13:50:39 home kernel: [ 8345.569862] sd 3:0:0:0: Device offlined – not ready after error recovery
Jul 8 13:50:39 home kernel: [ 8345.569880] sd 3:0:0:0: [sdg] Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK,SUGGEST_OK
Jul 8 13:50:39 home kernel: [ 8345.569886] end_request: I/O error, dev sdg, sector 436033
Jul 8 13:50:39 home kernel: [ 8345.569928] sd 3:0:0:0: rejecting I/O to offline device
Jul 8 13:50:39 home kernel: [ 8345.569947] sd 3:0:0:0: rejecting I/O to offline device
…….
Jul 8 13:50:39 home kernel: [ 8345.569947] sd 3:0:0:0: rejecting I/O to offline device
Jul 8 17:26:07 home kernel: [21234.808041] FAT: unable to read inode block for updating (i_pos 5684036)
Jul 8 17:26:08 home kernel: [21235.747136] sd 11:0:0:0: rejecting I/O to offline device
Jul 8 17:26:08 home kernel: [21235.747152] FAT: unable to read inode block for updating (i_pos 372805)
Jul 8 17:26:08 home kernel: [21235.747165] sd 11:0:0:0: rejecting I/O to offline device
Jul 8 17:26:08 home kernel: [21235.747868] FAT: unable to read inode block for updating (i_pos 5683281)
Jul 8 17:26:08 home kernel: [21235.747900] sd 11:0:0:0: rejecting I/O to offline device
Jul 8 17:26:08 home kernel: [21235.747911] FAT: unable to read inode block for updating (i_pos 5683283)
Jul 8 17:26:38 home kernel: [21265.661226] sd 11:0:0:0: rejecting I/O to offline device
Jul 8 17:26:38 home kernel: [21265.661238] printk: 86 messages suppressed.
Jul 8 17:26:38 home kernel: [21265.661243] Buffer I/O error on device sdc2, logical block 355204
Jul 8 17:26:38 home kernel: [21265.661246] lost page write due to I/O error on sdc2

Mijn andere USB apparaten hebben geen probleem. Maar deze hebben allemaal een externe voeding en geen FAT besturingssysteem. Of dit er iets mee te maken heeft weet ik niet. Deze ‘bug’ bestaat al heel lang, maar zowel het upstream Linux Kernel Team als Ubuntu lossen het niet op, omdat het schijnbaar lastig te pinpointen is wat nu daadwerkelijk het probleem is. Deze lange post “ehci_hcd module causes I/O errors in USB 2.0 devices” in Launchpad (het systeem van Ubuntu waarin bugs aangemeld kunnen worden) bevat veel info wat het kan zijn en eventuele work-arounds.

De enige optie/work-around die voor mij werkt, is de ehci_hcd module in de kernel uit te schakelen. Dan wordt de uhci_hcd module automatisch ingeschakeld en gaat het probleem weg. UHCI staat voor Universal Host Controller Interface. Er is echter een nadeel: EHCI (Enhanced Host Controller Interface) is voor USB 2.0 High-Speed (60 MB/s) en UHCI is voor USB 1.1. Low (187,5 kB/s) en Full Speed (1,5 MB/s). Door het overschakelen van EHCI naar UHCI gaat de snelheid van 60 MB/s terug naar 1,5 MB/s. Langzaam, maar alles werkt daarna wel weer vlekkeloos.

Omdat ik alleen een probleem heb met de iPod, heb ik een script geschreven om de ehci-hcd module tijdelijk uit te zetten. Het script doet het volgende:

  • Een terminalvenster openen om EHCI te deactiveren. Als korter dan vijf minuten geleden niet een rootpaswoord is ingegeven, wordt er om een rootpaswoord gevraagd voor het aanpassen een systeemsetting. Is er korter dan vijf minuten geleden wel een rootpaswoord ingegeven, dan wordt er niet nogmaals om een rootpaswoord gevraagd, maar wordt EHCI onmiddellijk gedeactiveerd. Op zeer snelle systemen zul je waarschijnlijk het terminalvenster dan niet eens zien.
  • Amarok starten. Je kan nu normaal met Amarok aan de slag.
  • Na het afsluiten van Amarok, opnieuw een terminalvenster openen om EHCI weer te activeren. Ook nu kan er weer om een rootpaswoord worden gevraagd.

Als je dit script ook wilt hebben, dan moet je de volgende commando’s in een Terminalvenster uitvoeren (hier kopieren (Ctrl-C) en gewoon in het terminalvenster plakken met behulp van Ctrl-Shift-V):

echo "#! /bin/bash" > $HOME/Documenten/AmarokUSB1.sh
echo "gnome-terminal --hide-menubar --command=\"sudo modprobe -r ehci_hcd\"" >> $HOME/Documenten/AmarokUSB1.sh
echo "amarok %U" >> $HOME/Documenten/AmarokUSB1.sh
echo "sleep 30" >> $HOME/Documenten/AmarokUSB1.sh
echo "while ps -p \`pidof amarokapp\` > /dev/null; do sleep 1; done" >> $HOME/Documenten/AmarokUSB1.sh
echo "gnome-terminal --hide-menubar --command=\"sudo modprobe ehci_hcd\"" >> $HOME/Documenten/AmarokUSB1.sh
echo "exit 0" >> $HOME/Documenten/AmarokUSB1.sh
chmod +x $HOME/Documenten/AmarokUSB1.sh

PS. In plaats van Amarok kun je ook Rhythmbox of gtkpod starten. Vervang “amarok %U” dan door “rhythmbox %U” of door “gtkpod”.

Dit shell script kan nu in een starter worden gebruikt om Amarok met iPod te gebruiken.

  1. Ga naar Systeem –> Voorkeuren –> Hoofdmenu.
  2. In het Hoofdmenu venster klik op ‘Audio en Video’ in het linker subvenster.
  3. Klik op de ‘Nieuw item’ button.
  4. In het ‘Starter aanmaken’ venster vul bij naam: ‘Amarok met iPod’ in en voor de Opdrachtregel blader naar de Documenten folder en selecteer het AmarokUSB1.sh script. Bij ‘Commentaar:’ mag je invullen wat jezelf graag wilt.
  5. Klik op het pictogram-icoon om een Amarok pictogram toe te wijzen. Deze is te vinden onder /usr/share/icons/hicolor/48×48/apps/amarok.png. Klik op de OK button.
    PS. Voor het Rhythmbox pictogram /usr/share/icons/hicolor/48×48/apps/rhythmbox.png en voor gtkpod /usr/share/icons/hicolor/48×48/apps/gtkpod.png

Gebruik Toepassingen –> ‘Audio en Video –> Amarok om Amarok zonder iPod te gebruiken.
Gebruik Toepassingen –> ‘Audio en Video’ –> ‘Amarok met iPod’ als je een iPod wilt aansluiten voor gebruik onder Amarok.

Voordeel van bovenstaand script is, nadat je de iPod voorzien hebt van muziek en je sluit Amarok weer af, dat EHCI (USB 2.0 High-Speed) weer actief wordt. Alle andere USB apparaten hebben dan weer de normale (High-Speed) snelheid.

LET OP:
het deactiveren van EHCI geldt voor alle USB-poorten. Advies is dan ook om ‘Amarok met iPod’ af te sluiten zodra je met de iPod klaar bent.

No Comments Yet »

Nog geen reacties.

RSS feed voor reacties op dit bericht. TrackBack URI

Plaats een reactie

Blog op Wordpress.com.