static void media_bay_step()

in mediabay.c [465:530]


static void media_bay_step(int i)
{
	struct media_bay_info* bay = &media_bays[i];

	/* We don't poll when powering down */
	if (bay->state != mb_powering_down)
	    poll_media_bay(bay);

	/* If timer expired run state machine */
	if (bay->timer != 0) {
		bay->timer -= msecs_to_jiffies(MB_POLL_DELAY);
		if (bay->timer > 0)
			return;
		bay->timer = 0;
	}

	switch(bay->state) {
	case mb_powering_up:
	    	if (bay->ops->setup_bus(bay, bay->last_value) < 0) {
			pr_debug("mediabay%d: device not supported (kind:%d)\n",
				 i, bay->content_id);
	    		set_mb_power(bay, 0);
	    		break;
	    	}
	    	bay->timer = msecs_to_jiffies(MB_RESET_DELAY);
	    	bay->state = mb_enabling_bay;
		pr_debug("mediabay%d: enabling (kind:%d)\n", i, bay->content_id);
		break;
	case mb_enabling_bay:
		bay->ops->un_reset(bay);
	    	bay->timer = msecs_to_jiffies(MB_SETUP_DELAY);
	    	bay->state = mb_resetting;
		pr_debug("mediabay%d: releasing bay reset (kind:%d)\n",
			 i, bay->content_id);
	    	break;
	case mb_resetting:
		if (bay->content_id != MB_CD) {
			pr_debug("mediabay%d: bay is up (kind:%d)\n", i,
				 bay->content_id);
			bay->state = mb_up;
			device_for_each_child(&bay->mdev->ofdev.dev,
					      bay, mb_broadcast_hotplug);
			break;
	    	}
		pr_debug("mediabay%d: releasing ATA reset (kind:%d)\n",
			 i, bay->content_id);
		bay->ops->un_reset_ide(bay);
	    	bay->timer = msecs_to_jiffies(MB_IDE_WAIT);
	    	bay->state = mb_ide_resetting;
	    	break;

	case mb_ide_resetting:
		pr_debug("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id);
		bay->state = mb_up;
		device_for_each_child(&bay->mdev->ofdev.dev,
				      bay, mb_broadcast_hotplug);
	    	break;

	case mb_powering_down:
	    	bay->state = mb_empty;
		device_for_each_child(&bay->mdev->ofdev.dev,
				      bay, mb_broadcast_hotplug);
		pr_debug("mediabay%d: end of power down\n", i);
	    	break;
	}
}