]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/orinoco_cs.c
Merge branch 'x86-64'
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / orinoco_cs.c
index 405b7baa8bc33349d7220bb2c61b87ceecd64cb9..b2aec4d9fbb12b3dc759233564722ac43975daf5 100644 (file)
@@ -63,7 +63,7 @@ struct orinoco_pccard {
 /* Function prototypes                                             */
 /********************************************************************/
 
-static void orinoco_cs_config(struct pcmcia_device *link);
+static int orinoco_cs_config(struct pcmcia_device *link);
 static void orinoco_cs_release(struct pcmcia_device *link);
 static void orinoco_cs_detach(struct pcmcia_device *p_dev);
 
@@ -104,7 +104,7 @@ orinoco_cs_hard_reset(struct orinoco_private *priv)
  * configure the card at this point -- we wait until we receive a card
  * insertion event.  */
 static int
-orinoco_cs_attach(struct pcmcia_device *link)
+orinoco_cs_probe(struct pcmcia_device *link)
 {
        struct net_device *dev;
        struct orinoco_private *priv;
@@ -134,10 +134,7 @@ orinoco_cs_attach(struct pcmcia_device *link)
        link->conf.Attributes = 0;
        link->conf.IntType = INT_MEMORY_AND_IO;
 
-       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
-       orinoco_cs_config(link);
-
-       return 0;
+       return orinoco_cs_config(link);
 }                              /* orinoco_cs_attach */
 
 /*
@@ -150,15 +147,11 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
 {
        struct net_device *dev = link->priv;
 
-       if (link->state & DEV_CONFIG)
-               orinoco_cs_release(link);
-
-       DEBUG(0, PFX "detach: link=%p link->dev_node=%p\n", link, link->dev_node);
-       if (link->dev_node) {
-               DEBUG(0, PFX "About to unregister net device %p\n",
-                     dev);
+       if (link->dev_node)
                unregister_netdev(dev);
-       }
+
+       orinoco_cs_release(link);
+
        free_orinocodev(dev);
 }                              /* orinoco_cs_detach */
 
@@ -172,7 +165,7 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
                last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; \
        } while (0)
 
-static void
+static int
 orinoco_cs_config(struct pcmcia_device *link)
 {
        struct net_device *dev = link->priv;
@@ -182,13 +175,10 @@ orinoco_cs_config(struct pcmcia_device *link)
        int last_fn, last_ret;
        u_char buf[64];
        config_info_t conf;
-       cisinfo_t info;
        tuple_t tuple;
        cisparse_t parse;
        void __iomem *mem;
 
-       CS_CHECK(ValidateCIS, pcmcia_validate_cis(link, &info));
-
        /*
         * This reads the card's CONFIG tuple to find its
         * configuration registers.
@@ -204,9 +194,6 @@ orinoco_cs_config(struct pcmcia_device *link)
        link->conf.ConfigBase = parse.config.base;
        link->conf.Present = parse.config.rmask[0];
 
-       /* Configure card */
-       link->state |= DEV_CONFIG;
-
        /* Look up the current Vcc */
        CS_CHECK(GetConfigurationInfo,
                 pcmcia_get_configuration_info(link, &conf));
@@ -241,12 +228,6 @@ orinoco_cs_config(struct pcmcia_device *link)
                        goto next_entry;
                link->conf.ConfigIndex = cfg->index;
 
-               /* Does this card need audio output? */
-               if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
-                       link->conf.Attributes |= CONF_ENABLE_SPKR;
-                       link->conf.Status = CCSR_AUDIO_ENA;
-               }
-
                /* Use power settings for Vcc and Vpp if present */
                /* Note that the CIS values need to be rescaled */
                if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
@@ -360,30 +341,21 @@ orinoco_cs_config(struct pcmcia_device *link)
        link->dev_node = &card->node; /* link->dev_node being non-NULL is also
                                     used to indicate that the
                                     net_device has been registered */
-       link->state &= ~DEV_CONFIG_PENDING;
 
        /* Finally, report what we've done */
-       printk(KERN_DEBUG "%s: index 0x%02x: ",
-              dev->name, link->conf.ConfigIndex);
-       if (link->conf.Vpp)
-               printk(", Vpp %d.%d", link->conf.Vpp / 10,
-                      link->conf.Vpp % 10);
-       printk(", irq %d", link->irq.AssignedIRQ);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
-       printk("\n");
-
-       return;
+       printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s, irq %d, io "
+              "0x%04x-0x%04x\n", dev->name, dev->class_dev.dev->bus_id,
+              link->irq.AssignedIRQ, link->io.BasePort1,
+              link->io.BasePort1 + link->io.NumPorts1 - 1);
+
+       return 0;
 
  cs_failed:
        cs_error(link, last_fn, last_ret);
 
  failed:
        orinoco_cs_release(link);
+       return -ENODEV;
 }                              /* orinoco_cs_config */
 
 /*
@@ -417,23 +389,21 @@ static int orinoco_cs_suspend(struct pcmcia_device *link)
        int err = 0;
        unsigned long flags;
 
-       if (link->state & DEV_CONFIG) {
-               /* This is probably racy, but I can't think of
-                  a better way, short of rewriting the PCMCIA
-                  layer to not suck :-( */
-               if (! test_bit(0, &card->hard_reset_in_progress)) {
-                       spin_lock_irqsave(&priv->lock, flags);
+       /* This is probably racy, but I can't think of
+          a better way, short of rewriting the PCMCIA
+          layer to not suck :-( */
+       if (! test_bit(0, &card->hard_reset_in_progress)) {
+               spin_lock_irqsave(&priv->lock, flags);
 
-                       err = __orinoco_down(dev);
-                       if (err)
-                               printk(KERN_WARNING "%s: Error %d downing interface\n",
-                                      dev->name, err);
+               err = __orinoco_down(dev);
+               if (err)
+                       printk(KERN_WARNING "%s: Error %d downing interface\n",
+                              dev->name, err);
 
-                       netif_device_detach(dev);
-                       priv->hw_unavailable++;
+               netif_device_detach(dev);
+               priv->hw_unavailable++;
 
-                       spin_unlock_irqrestore(&priv->lock, flags);
-               }
+               spin_unlock_irqrestore(&priv->lock, flags);
        }
 
        return 0;
@@ -445,34 +415,31 @@ static int orinoco_cs_resume(struct pcmcia_device *link)
        struct orinoco_private *priv = netdev_priv(dev);
        struct orinoco_pccard *card = priv->card;
        int err = 0;
-       unsigned long flags;
-
-       if (link->state & DEV_CONFIG) {
-               if (! test_bit(0, &card->hard_reset_in_progress)) {
-                       err = orinoco_reinit_firmware(dev);
-                       if (err) {
-                               printk(KERN_ERR "%s: Error %d re-initializing firmware\n",
-                                      dev->name, err);
-                               return -EIO;
-                       }
 
-                       spin_lock_irqsave(&priv->lock, flags);
+       if (! test_bit(0, &card->hard_reset_in_progress)) {
+               err = orinoco_reinit_firmware(dev);
+               if (err) {
+                       printk(KERN_ERR "%s: Error %d re-initializing firmware\n",
+                              dev->name, err);
+                       return -EIO;
+               }
 
-                       netif_device_attach(dev);
-                       priv->hw_unavailable--;
+               spin_lock(&priv->lock);
 
-                       if (priv->open && ! priv->hw_unavailable) {
-                               err = __orinoco_up(dev);
-                               if (err)
-                                       printk(KERN_ERR "%s: Error %d restarting card\n",
-                                              dev->name, err);
-                       }
+               netif_device_attach(dev);
+               priv->hw_unavailable--;
 
-                       spin_unlock_irqrestore(&priv->lock, flags);
+               if (priv->open && ! priv->hw_unavailable) {
+                       err = __orinoco_up(dev);
+                       if (err)
+                               printk(KERN_ERR "%s: Error %d restarting card\n",
+                                      dev->name, err);
                }
+
+               spin_unlock(&priv->lock);
        }
 
-       return 0;
+       return err;
 }
 
 
@@ -576,7 +543,7 @@ static struct pcmcia_driver orinoco_driver = {
        .drv            = {
                .name   = DRIVER_NAME,
        },
-       .probe          = orinoco_cs_attach,
+       .probe          = orinoco_cs_probe,
        .remove         = orinoco_cs_detach,
        .id_table       = orinoco_cs_ids,
        .suspend        = orinoco_cs_suspend,