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

[debian-users:19516] Re: Strange behavior of PCMCIA Modem Card



佐野@浜松です。

In article <19991209163130W.1000@xxxxxxxxxxxxxxxxxxxxxxx>,
  at Thu, 9 Dec 1999 22:02:30 +0900,
   on Re: Strange behavior of PCMCIA Modem Card,
 TSUCHIYA Masatoshi <tsuchiya@xxxxxxxxxxxxxxxxxxxxxxx> さん writes:

> > ちょっとエラーメッセージが違いますが "tty02 at 0x13f8" の "0x13f8" という
> > ポート番号のほうが一致しているので、以下の対処を試してみてください。
> 
> この対処では、ちょっと不十分なようです。当方で同様の対処を試みたところ、
> 
>     tty02 at 0x0af8 (irq = 5) is a 16550A
> 
> となり、依然として ttyS02 として妥当な I/O port を使用してくれません。
> なお、/proc/ioports を確認しましたが、0x03e8 は使用されていません。

では

# Extra port range for IBM Token Ring
#
# include port 0xa00-0xaff

ここを上記のようにコメントアウトしてみてください。
たぶん、ここで include されているので 0x0af8 が利用可能だと
判断されてしまうのだと思います。

> というわけで、使用する I/O port を明示的に指定する方法があれば、
> 丸く収まるのではないかと思うのですが…。

一応調べてはみたのですが、「明示的に指定する方法」はよくわかりませんでした。
誰か知っている人がいたら教えてもらいたいです。

> ただし、内蔵のモデムとシリアルを両方ともに BIOS で使用不可に設定すると、
> 以下のように使用できるようにはなりました。
> 
>     tty00 at 0x03f8 (irq = 3) is a 16550A

おそらく client/serial_cs.c の

static int simple_config(dev_link_t *link)

(snip)
    /* If the card is already configured, look up the port and irq */
    i = CardServices(GetConfigurationInfo, handle, &config);
    if ((i == CS_SUCCESS) &&
        (config.Attributes & CONF_VALID_CLIENT)) {
        ioaddr_t port = 0;
        if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) {
            port = config.BasePort2;
            info->slave = 1;
        } else if ((info->manfid == MANFID_OSITECH) &&
                   (config.NumPorts1 == 0x40)) {
            port = config.BasePort1 + 0x28;
            info->slave = 1;
        }
        if (info->slave)
            return setup_serial(info, port, config.AssignedIRQ);
    }
    link->conf.Vcc = config.Vcc;

    /* First pass: look for a config entry that looks normal. */
    tuple.TupleData = (cisdata_t *)buf;
    tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
    tuple.Attributes = 0;
    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
    i = first_tuple(handle, &tuple, &parse);
    while (i != CS_NO_MORE_ITEMS) {
        if (i != CS_SUCCESS) goto next_entry;
        if (cf->vpp1.present & (1<<CISTPL_POWER_VNOM))
            link->conf.Vpp1 = link->conf.Vpp2 =
                cf->vpp1.param[CISTPL_POWER_VNOM]/10000;
        if ((cf->io.nwin > 0) && ((cf->io.win[0].base & 0xf) == 8)) {
            link->conf.ConfigIndex = cf->index;
            link->io.BasePort1 = cf->io.win[0].base;
            link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
            i = CardServices(RequestIO, link->handle, &link->io);
            if (i == CS_SUCCESS) goto found_port;
        }
    next_entry:
        i = next_tuple(handle, &tuple, &parse);
    }
    
    /* Second pass: try to find an entry that isn't picky about
       its base address, then try to grab any standard serial port
       address, and finally try to get any free port. */
    i = first_tuple(handle, &tuple, &parse);
    while (i != CS_NO_MORE_ITEMS) {
        if ((i == CS_SUCCESS) && (cf->io.nwin > 0) &&
            ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
            link->conf.ConfigIndex = cf->index;
            for (j = 0; j < 5; j++) {
                link->io.BasePort1 = base[j];
                i = CardServices(RequestIO, link->handle,
                                 &link->io);
                if (i == CS_SUCCESS) goto found_port;
            }
        }
        i = next_tuple(handle, &tuple, &parse);
    }

found_port:

のあたりで何か変更されているのではないかと思うのですが、、、

もし pcmcia-cs 3.1.3 が手元にあれば、この部分を比較してみると
何かわかるかもしれません。

# 外していたらごめんなさい。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)