static int airport_stop(struct net_device *dev) { dldwd_priv_t *priv = dev->priv; dldwd_card_t* card = (dldwd_card_t *)priv->card; TRACE_ENTER(priv->ndev.name); netif_stop_queue(dev); dldwd_shutdown(priv); card->open = 0; TRACE_EXIT(priv->ndev.name); return 0; }
static int airport_sleep_notify(struct pmu_sleep_notifier *self, int when) { dldwd_priv_t *priv; struct net_device *ndev; dldwd_card_t* card; int rc; if (!airport_dev) return PBOOK_SLEEP_OK; priv = airport_dev; ndev = &priv->ndev; card = (dldwd_card_t *)priv->card; switch (when) { case PBOOK_SLEEP_REQUEST: break; case PBOOK_SLEEP_REJECT: break; case PBOOK_SLEEP_NOW: printk(KERN_INFO "%s: Airport entering sleep mode\n", ndev->name); netif_device_detach(ndev); if (card->open) dldwd_shutdown(priv); disable_irq(ndev->irq); feature_set_airport_power(card->node, 0); priv->hw_ready = 0; break; case PBOOK_WAKE: printk(KERN_INFO "%s: Airport waking up\n", ndev->name); feature_set_airport_power(card->node, 1); mdelay(200); hermes_reset(&priv->hw); priv->hw_ready = 1; rc = dldwd_reset(priv); if (rc) printk(KERN_ERR "airport: Error %d re-initing card !\n", rc); else if (card->open) netif_device_attach(ndev); enable_irq(ndev->irq); break; } return PBOOK_SLEEP_OK; }
static int dldwd_cs_stop(struct net_device *dev) { dldwd_priv_t *priv = (dldwd_priv_t *)dev->priv; dldwd_card_t* card = (dldwd_card_t *)priv->card; dev_link_t *link = &card->link; TRACE_ENTER(priv->ndev.name); netif_stop_queue(dev); dldwd_shutdown(priv); link->open--; if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); TRACE_EXIT(priv->ndev.name); return 0; }
static int dldwd_cs_event(event_t event, int priority, event_callback_args_t * args) { dev_link_t *link = args->client_data; dldwd_priv_t *priv = (dldwd_priv_t *)link->priv; struct net_device *dev = &priv->ndev; TRACE_ENTER("dldwd"); switch (event) { case CS_EVENT_CARD_REMOVAL: /* FIXME: Erg.. this whole hw_ready thing looks racy to me. this may not be fixable without changin the PCMCIA subsystem, though */ priv->hw_ready = 0; dldwd_shutdown(priv); link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { netif_stop_queue(dev); netif_device_detach(dev); mod_timer(&link->release, jiffies + HZ / 20); } break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; dldwd_cs_config(link); break; case CS_EVENT_PM_SUSPEND: link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: dldwd_shutdown(priv); /* Mark the device as stopped, to block IO until later */ if (link->state & DEV_CONFIG) { if (link->open) { netif_stop_queue(dev); netif_device_detach(dev); } CardServices(ReleaseConfiguration, link->handle); } break; case CS_EVENT_PM_RESUME: link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: if (link->state & DEV_CONFIG) { CardServices(RequestConfiguration, link->handle, &link->conf); if (link->open) { if (dldwd_reset(priv) == 0) { netif_device_attach(dev); netif_start_queue(dev); } else { printk(KERN_ERR "%s: Error resetting device on PCMCIA event\n", dev->name); dldwd_cs_stop(dev); } } } /* In a normal driver, additional code may go here to restore the device state and restart IO. */ break; } TRACE_EXIT("dldwd"); return 0; } /* dldwd_cs_event */