Re: 2.6.22-rc: regression: no irda0 interface (2.6.21 was OK), smsc does not find chip

From: Andrey Borzenkov
Date: Sun Jun 10 2007 - 02:47:37 EST


On Friday 08 June 2007, Samuel Ortiz wrote:
> Hi Bjorn,
>
> On 6/7/2007, "Bjorn Helgaas" <bjorn.helgaas@xxxxxx> wrote:
> >On Wednesday 06 June 2007 02:45:01 pm Andrey Borzenkov wrote:
> >> On Wednesday 06 June 2007, Bjorn Helgaas wrote:
> >> > On Tuesday 05 June 2007 09:29:11 pm Andrey Borzenkov wrote:
> >> > > On Wednesday 06 June 2007, Bjorn Helgaas wrote:
> >> > > > Something's wrong with this strategy. The BIOS is telling us that
> >> > > > an SMCf010 device is present, active, and responds at io ports
> >> > > > 0x100-0x107 and 0x2e8-0x2ef. The fact that it happens to be on
> >> > > > the other side of an ISA or LPC bridge should be immaterial to the
> >> > > > OS driver.
> >> > >
> >> > > I thought this as well.
> >> >
> >> > If this is really true, it also means we shouldn't twiddle with the
> >> > bridge. If the BIOS left us a working setup, the preconfiguration
> >> > is certainly going to change it to something incompatible with the
> >> > PNP info.
> >> >
> >> > What if we try the following patch, which keeps the FIR/SIR swap and
> >> > just removes the preconfiguration?
> >>
> >> I already tried different patch but with similar effect (switch off
> >> preconfiguration) - it does not work. I am beginning to doubt whether
> >> drier works on my system at all (i.e. before PnP change); have to find
> >> time to test.
> >
> >OK. My patch wasn't the right approach anyway. Attached is what I
> >think we should do instead -- do the preconfig if we're not using PNP.
>
> Thats sounds good, yes.
> Maybe we should also run the legacy probe when the PnP one fails. I
> don't know how the preconfiguration stuff will behave with the device
> being PnP enabled, but with your patch Andrey will still need to
> modprobe smsc-ircc with smsc_nopnp.
>

One thing that makes me uneasy - ideally we have to do it *after* PnP probe
fails. Currently we lie to PnP layer that we successfully probed for device
while in effect we did not (at least, not where PnP told us to).

> So, here is the patch I propose (I had to move smsc_ircc_legacy_probe()
> a bit earlier in the code to avoid forward declaration, but it's
> basically your patch plus a call to smsc_ircc_legacy_probe() from the
> pnp_probe() routine):
>

Yes this patch works:

[58674.337465] pnp: Device 00:0a activated.
[58674.337465] smsc_ircc_present(), addr 0x02e8 - no device found!
[58674.337465] PnP probe failed
[58674.340799] Detected unconfigured Toshiba laptop with ALi ISA bridge SMSC
IrDA chip, pre-configuring device.
[58674.340799] Activated ALi 1533 ISA bridge port 0x02e8.
[58674.340799] Activated ALi 1533 ISA bridge port 0x02f8.
[58674.340799] found SMC SuperIO Chip (devid=0x5a rev=00 base=0x002e):
LPC47N227
[58674.340799] smsc_superio_flat(): IrDA not enabled
[58674.340799] smsc_superio_flat(): fir: 0x2f8, sir: 0x2e8, dma: 03, irq: 7,
mode: 0x02
[58674.340799] SMsC IrDA Controller found
[58674.340799] IrCC version 2.0, firport 0x2f8, sirport 0x2e8 dma=3, irq=7
[58674.340799] No transceiver found. Defaulting to Fast pin select


But I noticed something very strange.

{pts/1}% lspnp -vv 00:0a
00:0a SMCf010 SMC Fast Infrared Port
state = active
allocated resources:
io 0x100-0x107
io 0x2e8-0x2ef
irq 5
dma 1
possible resources:
port 0x100-0x130, align 0xf, size 0x8, 16-bit address decoding
irq 3,4,5,6,7,10,11 High-Edge
dma 1,2,3 16-bit compatible
Dependent: 01 - Priority acceptable
port 0x3f8-0x3f8, align 0x0, size 0x8, 16-bit address decoding
Dependent: 02 - Priority acceptable
port 0x2e8-0x2e8, align 0x0, size 0x8, 16-bit address decoding
Dependent: 03 - Priority acceptable
port 0x2f8-0x2f8, align 0x0, size 0x8, 16-bit address decoding
Dependent: 04 - Priority acceptable
port 0x3e8-0x3e8, align 0x0, size 0x8, 16-bit address decoding

but

{pts/1}% cat /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
0070-0077 : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0100-013f : pcmcia_socket0
^^^^^^^^^^^^^^^^^^^^^^^^^^ hell, what's it?

and really

{pts/1}% sudo
cat /sys/class/pcmcia_socket/pcmcia_socket0/available_resources_io
0x00000100 - 0x000003af
0x000003e0 - 0x000004ff
0x00000820 - 0x000008ff
0x00000a00 - 0x00000aff
0x00000c00 - 0x00000cf7

Does it mean we did not inform PnP layer when PCMCIA is configured? Should we
do it? I Cc to PCMCIA maintainer as well :) Configuration I have

{pts/1}% pccardctl status
Socket 0:
3.3V 16-bit PC Card
Subdevice 0 (function 0) bound to driver "wlags49"
Socket 1:
no card
Socket 2:
no card
{pts/1}% pccardctl info
PRODID_1="TOSHIBA"
PRODID_2="Wireless LAN Card"
PRODID_3="Version 01.01"
PRODID_4=""
MANFID=0156,0002
FUNCID=6
PRODID_1=""
PRODID_2=""
PRODID_3=""
PRODID_4=""
MANFID=0000,0000
FUNCID=255
PRODID_1=""
PRODID_2=""
PRODID_3=""
PRODID_4=""
MANFID=0000,0000
FUNCID=255

>
> diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c
> index 9043bf4..1d7ab3f 100644
> --- a/drivers/net/irda/smsc-ircc2.c
> +++ b/drivers/net/irda/smsc-ircc2.c
> @@ -366,6 +366,44 @@ static inline void register_bank(int iobase, int bank)
> iobase + IRCC_MASTER);
> }
>
> +
> +static int __init smsc_ircc_legacy_probe(void)
> +{
> + int ret = 0;
> +
> +#ifdef CONFIG_PCI
> + if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir,
> + ircc_dma, ircc_irq) < 0) {
> + /* Ignore errors from preconfiguration */
> + IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name);
> + }
> +#endif
> +
> + if (ircc_fir > 0 && ircc_sir > 0) {
> + IRDA_MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
> + IRDA_MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
> +
> + if (smsc_ircc_open(ircc_fir, ircc_sir, ircc_dma, ircc_irq))
> + ret = -ENODEV;
> + } else {
> + ret = -ENODEV;
> +
> + /* try user provided configuration register base address */
> + if (ircc_cfg > 0) {
> + IRDA_MESSAGE(" Overriding configuration address "
> + "0x%04x\n", ircc_cfg);
> + if (!smsc_superio_fdc(ircc_cfg))
> + ret = 0;
> + if (!smsc_superio_lpc(ircc_cfg))
> + ret = 0;
> + }
> +
> + if (smsc_ircc_look_for_chips() > 0)
> + ret = 0;
> + }
> + return ret;
> +}
> +
> /* PNP hotplug support */
> static const struct pnp_device_id smsc_ircc_pnp_table[] = {
> { .id = "SMCf010", .driver_data = 0 },
> @@ -391,9 +429,14 @@ static int __init smsc_ircc_pnp_probe(struct pnp_dev
> *dev, dma = pnp_dma(dev, 0);
> irq = pnp_irq(dev, 0);
>
> - if (smsc_ircc_open(firbase, sirbase, dma, irq))
> - return -ENODEV;
> -
> + if (smsc_ircc_open(firbase, sirbase, dma, irq)) {
> + IRDA_ERROR("PnP probe failed\n");
> + if (smsc_ircc_legacy_probe()) {
> + IRDA_ERROR("Legacy probe failed\n");
> + return -ENODEV;
> + }
> + }
> +
> return 0;
> }
>
> @@ -412,35 +455,6 @@ static struct pnp_driver smsc_ircc_pnp_driver = {
> *
>
> ***************************************************************************
>****/
>
> -static int __init smsc_ircc_legacy_probe(void)
> -{
> - int ret = 0;
> -
> - if (ircc_fir > 0 && ircc_sir > 0) {
> - IRDA_MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
> - IRDA_MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
> -
> - if (smsc_ircc_open(ircc_fir, ircc_sir, ircc_dma, ircc_irq))
> - ret = -ENODEV;
> - } else {
> - ret = -ENODEV;
> -
> - /* try user provided configuration register base address */
> - if (ircc_cfg > 0) {
> - IRDA_MESSAGE(" Overriding configuration address "
> - "0x%04x\n", ircc_cfg);
> - if (!smsc_superio_fdc(ircc_cfg))
> - ret = 0;
> - if (!smsc_superio_lpc(ircc_cfg))
> - ret = 0;
> - }
> -
> - if (smsc_ircc_look_for_chips() > 0)
> - ret = 0;
> - }
> - return ret;
> -}
> -
> /*
> * Function smsc_ircc_init ()
> *
> @@ -459,13 +473,6 @@ static int __init smsc_ircc_init(void)
> return ret;
> }
>
> -#ifdef CONFIG_PCI
> - if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir,
> ircc_dma, ircc_irq) < 0) { - /* Ignore errors from preconfiguration */
> - IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name);
> - }
> -#endif
> -
> dev_count = 0;
>
> if (smsc_nopnp || !pnp_platform_devices ||


Attachment: signature.asc
Description: This is a digitally signed message part.