Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}
Пример #4
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 */