lkml.org 
[lkml]   [2006]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: pcmcia oops on 2.6.17-rc[12]
    From
    Date
    On Llu, 2006-05-15 at 16:37 -0700, Linus Torvalds wrote:
    > ISA design. And PCMCIA is no longer an excuse, exactly because of some
    > systems that will route even the 16-bit interrupts through a PCI irq.

    The patch below cleans up the pcmcia code a bit on the IRQ side (I did
    this while debugging the problem just so I could read wtf it was doing),
    and also adds a warning and passes back the correct information when a
    device asks for exclusive but gets given shared. This at least means the
    dmesg dump of a problem triggered by this will have a signature to find.

    Alan

    Signed-off-by: Alan Cox <alan@redhat.com>


    diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.17-rc4/drivers/pcmcia/pcmcia_resource.c linux-2.6.17-rc4/drivers/pcmcia/pcmcia_resource.c
    --- linux.vanilla-2.6.17-rc4/drivers/pcmcia/pcmcia_resource.c 2006-05-15 15:46:04.000000000 +0100
    +++ linux-2.6.17-rc4/drivers/pcmcia/pcmcia_resource.c 2006-05-16 14:59:42.000000000 +0100
    @@ -788,6 +788,7 @@
    struct pcmcia_socket *s = p_dev->socket;
    config_t *c;
    int ret = CS_IN_USE, irq = 0;
    + int type;

    if (!(s->state & SOCKET_PRESENT))
    return CS_NO_CARD;
    @@ -797,6 +798,13 @@
    if (c->state & CONFIG_IRQ_REQ)
    return CS_IN_USE;

    + /* Decide what type of interrupt we are registering */
    + type = 0;
    + if (s->functions > 1) /* All of this ought to be handled higher up */
    + type = SA_SHIRQ;
    + if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)
    + type = SA_SHIRQ;
    +
    #ifdef CONFIG_PCMCIA_PROBE
    if (s->irq.AssignedIRQ != 0) {
    /* If the interrupt is already assigned, it must be the same */
    @@ -822,9 +830,7 @@
    * marked as used by the kernel resource management core */
    ret = request_irq(irq,
    (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action,
    - ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
    - (s->functions > 1) ||
    - (irq == s->pci_irq)) ? SA_SHIRQ : 0,
    + type,
    p_dev->devname,
    (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data);
    if (!ret) {
    @@ -839,18 +845,21 @@
    if (ret && !s->irq.AssignedIRQ) {
    if (!s->pci_irq)
    return ret;
    + type = SA_SHIRQ;
    irq = s->pci_irq;
    }

    - if (ret && req->Attributes & IRQ_HANDLE_PRESENT) {
    - if (request_irq(irq, req->Handler,
    - ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
    - (s->functions > 1) ||
    - (irq == s->pci_irq)) ? SA_SHIRQ : 0,
    - p_dev->devname, req->Instance))
    + if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) {
    + if (request_irq(irq, req->Handler, type, p_dev->devname, req->Instance))
    return CS_IN_USE;
    }

    + /* Make sure the fact the request type was overridden is passed back */
    + if (type == SA_SHIRQ && !(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) {
    + req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING;
    + printk(KERN_WARNING "pcmcia: request for exclusive IRQ could not be fulfilled.\n");
    + printk(KERN_WARNING "pcmcia: the driver needs updating to supported shared IRQ lines.\n");
    + }
    c->irq.Attributes = req->Attributes;
    s->irq.AssignedIRQ = req->AssignedIRQ = irq;
    s->irq.Config++;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-05-16 17:06    [W:0.022 / U:32.092 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site