ITeX verhaal

Op de laatste dag van onze kampeervakantie 2005 in Zeeland reden we in de auto terug naar huis. Het regende die dag nogal hard, en de schoenen die mijn vrouw aanhad waren bij het afbreken van de tent helemaal nat geworden. Alle droge schoenen waren natuurlijk ingepakt, en waarschijnlijk onderin de kofferbak. Ik had geen zin om ze er uit te halen, dus gingen we de snel weg af om een winkel op te zoeken om nieuwe schoenen te kopen. Helaas was het net 1 uur, en alles was dicht tussen de middag. Nadat we weer op weg waren gegaan (we waren de autosleutels ook nog kwijtgeraakt) zagen we een bord langs de weg waar een rommelmarkt werd aangekondigd. Toevallig was die net aan de gang, en we besloten er heen te gaan om nieuwe schoenen voor mijn vrouw te kopen.

Er waren een paar stalletjes met computer spullen, en bij 1 ervan lagen een aantal winmodems, nieuw in doos, en van het Belgische merk Topcom. Maar 1 van die doosjes was anders, en er stond "ADSL PCI Modem" op. Opengemaakt bleken er ITeX chips op de kaart te zitten. Ik kocht een Xplorer 810 PCI ADSL Modem van Topcom, met ITeX Apollo3 chipset, nieuw in doos, voor vijf Euro. Die analoge winmodems waren trouwens net zo duur. Ik kocht ook nog een schaakspel, en mijn vrouw schoenen.

Na een paar dagen ben ik 'm gaan proberen. Dat lukte in het begin niet erg. Na van alles gedaan te hebben ben ik maar gaan proberen om me precies aan de instrukties te houden. Dat strandde op het compileren van een aangepaste pppd. Maar toen zag ik dat er ook een voorgecompileerde pppd binary en een pppoatm plugin bij zat, en daarmee werkte het! Het bleek dat vorige pogingen niet lukten omdat ik een te nieuwe kernel gebruikte. En dat die kaart werkt met een recente ongepatchte pppd, als je maar geen kernel na 2.4.20 gebruikt. Daarom heb ik een tijdje een 2.4.18 kernel van Debian source gebruikt.

Debian's kernel 2.4.18 hoort nog bij oldstable, en zal niet lang meer worden ondersteund. Daarom ben ik op zoek gegaan naar een manier om de ITeX driver onder nieuwere kernels te laten werken. Ik ben maar eens de diffs tussen 2.4.20 en 2.4.21 gaan bekijken, en het bleek dat er enige veranderingen in de atm layer aangebracht waren. Het waren niet zozeer die veranderingen zelf maar het feit dat struct atm_dev was veranderd dat de driver niet meer wilde werken. Nadat ik atm_dev weer in z'n staat zoals ie in 2.4.18 was had terug gebracht werkte 2.4.21 ook. Dat ging makkelijk. Maar naar 2.4.22 was niet zo simpel. Na nachten lang zoeken in kernel bitkeeper files en pre releases had ik geen succes. Daarom maar zelf een diff gemaakt tussen 2.4.18 en 2.4.31, de laatste 2.4 kernel. Behalve atm_dev verdacht ik nog struct sk_buff, daar was ook iets aan veranderd. Als ik dat terugbracht naar de 2.4.18 staat, dan liep de driver vast, ipv een error te produceren. Het moest er dus wel iets mee te maken hebben. Op een avond begon ik struct mm te verdenken, en heb ik die in 2.4.18 staat teruggezet. De driver liep nu niet meer vast, maar gaf nu een andere error: 'VCC == NULL!'. 1 van de dingen die ik toen probeerde is de hele inhoud van 2.4.18 net/atm/ maar over 2.4.31 net/atm/ heen te kieperen, en daarmee deed ie het! Na een poging om toch maar weer net/atm/ van 2.4.31 te kunnen gebruiken door in net/atm/common.c 'atm_dev->vccs = vcc' te doen deed ie het wel, maar als je pppd stopte dan liep de hele zaak vast. Met net/atm/ van 2.4.18 in kernel 2.4.31 heb ik het een tijdje gebruikt.

Maar het bleef me bezighouden. Ik had de headers zo aangepast dat ik makkelijk tussen 2.4.18 en 2.4.31 atm layer om kon schakelen in kernel 2.4.31, en op een goede avond kreeg ik het idee dat behalve atm_dev->vccs met vcc initializeren bij openen, het ook wel eens bij afsluiten nodig kon zijn atm_dev->vccs op NULL te zetten. Dat bleek inderdaad als enige nog nodig te zijn om 2.4.31 goed met de ITeX driver te laten werken.

Er zit ook nog een rare bug in de ITeX driver, ook als je 'm gebruikt met kernel 2.4.15 tot 2.4.20. In die oudere kernels zie je bij afsluiten van pppd een syslog regel als 'strange... rx_inuse = -1536 after close', en bij nieuwere kernels zie je iets als 'rmem leakage: -1536 bytes'. De ITeX driver bleek ten onrechte iets als atm_return() in atmdev.h te doen. Maar in pppoatm.c gebeurd dat ook al, dus dat is dubbel op. Ik heb het opgelost door in pppoatm.c een quirk in te bouwen: als ie ziet dat ie met de ITeX driver te doen heeft dan doet ie geen atm_return().

Als laatste heb ik die bug opgelost, en nog een patch gemaakt voor kernel source 2.4.27 van Debian. Dat is de stable 2.4 kernel. Daar draait ie nu mee - deze pagina wordt geserveerd door de machine waar de ITeX kaart in zit. Ik ben nog bezig om de ITeX driver met 2.6 kernels te laten werken, maar 2.6 kent geen common symbols meer en de ITeX driver is zonder -fno-common gecompileerd, en zit vol met common symbols. Dus ik zal eerst common symbol support moeten terugbrengen in de 2.6 kernel. Daarna de door de ITeX driver gebruikte maar niet meer aanwezige of veranderde kernel calls opnieuw implementeren in de nieuwe driver module, en dan nog relevante gewijzigde structs in header files terugbrengen in 2.4.18 staat.


Jan Pieter.



PS: Ik ben al een heel eind met een itex driver voor 2.6 kernels. Ik heb 'm zover dat ie netjes synced, en er worden bytes verzonden en ontvangen. Maar na de DSLAM's eerste reply gaat de boel op tilt in de interrupt handler, voordat pppd iets met die bytes kan doen. Nog 'even' zoeken dus.


PS2: Ik heb 'm werkend met 2.6! Ik had een fout gemaakt waardoor de driver z'n eigen call Alloc_skb() overschreef met de skb pool. Nadat ik dat had gerepareerd werkte ie. Hij loopt soms nog vast bij opstarten en afsluiten van pppd, maar als ie werkt dan blijft ie werken. Deze pagina wordt nu geserveerd met een machine met kernel 2.6.15.1 en de ITeX kaart. Yep.


PS3: De 2.6 driver loopt niet meer vast! Er ging iets fout met alloc_sk/free_sk waardoor atm code werd overschreven. Gefixt met quick-and-dirty patch. Iets anders: sinds kernel 2.6.16 wordt gcc-2.9x (de compiler waarmee de binary is gecompileerd, en die niet compatible is met latere gcc versies) niet meer ondersteund. Daarom is dit (2.6.15) de laatste kernel versie waar de ITeX driver op zal werken.