Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / drivers / pcmcia / pcmcia_resource.c
index c832339..3131bb0 100644 (file)
@@ -245,17 +245,10 @@ int pccard_get_configuration_info(struct pcmcia_socket *s,
                return CS_SUCCESS;
        }
 
-       config->Attributes = c->Attributes | CONF_VALID_CLIENT;
-       config->Vcc = s->socket.Vcc;
-       config->Vpp1 = config->Vpp2 = s->socket.Vpp;
-       config->IntType = c->IntType;
-       config->ConfigBase = c->ConfigBase;
-       config->Status = c->Status;
-       config->Pin = c->Pin;
-       config->Copy = c->Copy;
-       config->Option = c->Option;
-       config->ExtStatus = c->ExtStatus;
-       config->Present = config->CardValues = c->CardValues;
+       /* !!! This is a hack !!! */
+       memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
+       config->Attributes |= CONF_VALID_CLIENT;
+       config->CardValues = c->CardValues;
        config->IRQAttributes = c->irq.Attributes;
        config->AssignedIRQ = s->irq.AssignedIRQ;
        config->BasePort1 = c->io.BasePort1;
@@ -795,7 +788,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
        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;
@@ -805,13 +797,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
        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 = IRQF_SHARED;
-       if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)
-               type = IRQF_SHARED;
-
 #ifdef CONFIG_PCMCIA_PROBE
        if (s->irq.AssignedIRQ != 0) {
                /* If the interrupt is already assigned, it must be the same */
@@ -837,7 +822,9 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
                         * marked as used by the kernel resource management core */
                        ret = request_irq(irq,
                                          (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action,
-                                         type,
+                                         ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
+                                          (s->functions > 1) ||
+                                          (irq == s->pci_irq)) ? SA_SHIRQ : 0,
                                          p_dev->devname,
                                          (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data);
                        if (!ret) {
@@ -852,21 +839,18 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
        if (ret && !s->irq.AssignedIRQ) {
                if (!s->pci_irq)
                        return ret;
-               type = IRQF_SHARED;
                irq = s->pci_irq;
        }
 
-       if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) {
-               if (request_irq(irq, req->Handler, type,  p_dev->devname, req->Instance))
+       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))
                        return CS_IN_USE;
        }
 
-       /* Make sure the fact the request type was overridden is passed back */
-       if (type == IRQF_SHARED && !(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++;