• Tony Olech's avatar
    USB: u132-hcd/ftdi-elan: add support for Option GT 3G Quad card · 4b87361d
    Tony Olech authored
    ELAN's U132 is a USB to CardBus OHCI controller adapter,
        designed specifically for CardBus 3G data cards to
        function in machines without a CardBus slot.
    The "ftdi-elan" module is a USB client driver, that detects
        a supported CardBus OHCI controller plugged into the
        U132 adapter and thereafter provides the conduit for
        for access by the "u132-hcd" module.
    The "u132-hcd" module is a (cut-down OHCI) host controller
        that supports a single OHCI function of the CardBus 
        card inserted into the U132 adapter.
    
    The problem with the initial implementation is that when
    the CardBus card inserted into the U132 adapter has multiple
    functions (and a CardBus card can support up to 4 functions),
    it was the first function that was arbitrarily choosen.
    
    The first batch of 3G cards tested, like the Merlin Qualcomm
    V620, have two functions each supporting a seperate USB OHCI
    host controller, of which it was that first function that is
    wired up to the 3G modem.
    
    Then along comes the Vodafone Mobile Connect 3G/GPRS data card,
    aka "Option GT 3G Quad" as printed on it's rear or "Option N.V.
    GlobeTrotter Fusion Quad Lite" as read with "lspci -v". And it
    has the meaningful functionality in the second CardBus function.
    
    That presents a problem because it was the "ftdi-elan" module
    alone that knows how to communicate to the embedded CardBus slot
    and the "u132-hcd" module alone that knows how to access the
    pcmcia configuration and CardBus accessible memory space. And
    of course, the information about attached (internally hardwired)
    devices is contained within USB configuration embedded somewhere
    within the CardBus card.
    
    If only the "u132-hcd" module probe() interface could return a
    result code that propagated back to the instigating function
    platform_device_register() then the "ftdi-elan" module could
    try an alternative CardBus function.     However in spite of
    the recent changes to the drivers/base/ routines that moved 
    device_attach() from bus_add_device() to bus_attach_device()
    both of those routines lose the "failed to attach" 0 result
    code and thus the calling routine, namely device_add() is
    incapable of propaging the "failed to attach" condition back
    to platform_device_add() and consequently back to the caller
    of platform_device_register()
    
    Experiments show that patching bus_attach_device() to return
    ENODEV fails with the kernel locking up very early during
    boot. But, however, if the patch is restricted to calls from
    platform_device_add() then it does seem to work.
    
    Unfortunately, until the kernel's drivers/base is properly
    modified to propagate -ENODEV back to the caller of
    platform_device_register(), it is necessary to "fix" the
    "ftdi-elan" module by importing knowledge from the 
    "u132-hcd" module. This is the reason for the duplicated
    functionality introduced in this patch.
    Signed-off-by: default avatarTony Olech <tony.olech@elandigitalsystems.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    4b87361d
u132-hcd.c 131 KB