Beispiel #1
0
/*
 * Function mcp2120_change_speed (dev, speed)
 *
 *    Set the speed for the MCP2120.
 *
 */
static int mcp2120_change_speed(struct irda_task *task)
{
    dongle_t *self = (dongle_t *) task->instance;
    __u32 speed = (__u32) task->param;
    __u8 control[2];
    int ret = 0;

    self->speed_task = task;

    switch (task->state) {
    case IRDA_TASK_INIT:
        /* Need to reset the dongle and go to 9600 bps before
                   programming */
        //printk("Dmcp2120_change_speed irda_task_init\n");
        if (irda_task_execute(self, mcp2120_reset, NULL, task,
                              (void *) speed))
        {
            /* Dongle need more time to reset */
            irda_task_next_state(task, IRDA_TASK_CHILD_WAIT);

            /* Give reset 1 sec to finish */
            ret = MSECS_TO_JIFFIES(1000);
        }
        break;
    case IRDA_TASK_CHILD_WAIT:
        WARNING("%s(), resetting dongle timed out!\n", __FUNCTION__);
        ret = -1;
        break;
    case IRDA_TASK_CHILD_DONE:
        /* Set DTR to enter command mode */
        self->set_dtr_rts(self->dev, TRUE, FALSE);
        udelay(500);

        switch (speed) {
        case 9600:
        default:
            control[0] = MCP2120_9600;
            //printk("mcp2120 9600\n");
            break;
        case 19200:
            control[0] = MCP2120_19200;
            //printk("mcp2120 19200\n");
            break;
        case 34800:
            control[0] = MCP2120_38400;
            //printk("mcp2120 38400\n");
            break;
        case 57600:
            control[0] = MCP2120_57600;
            //printk("mcp2120 57600\n");
            break;
        case 115200:
            control[0] = MCP2120_115200;
            //printk("mcp2120 115200\n");
            break;
        }
        control[1] = MCP2120_COMMIT;

        /* Write control bytes */
        self->write(self->dev, control, 2);

        irda_task_next_state(task, IRDA_TASK_WAIT);
        ret = MSECS_TO_JIFFIES(100);
        //printk("mcp2120_change_speed irda_child_done\n");
        break;
    case IRDA_TASK_WAIT:
        /* Go back to normal mode */
        self->set_dtr_rts(self->dev, FALSE, FALSE);
        irda_task_next_state(task, IRDA_TASK_DONE);
        self->speed_task = NULL;
        //printk("mcp2120_change_speed irda_task_wait\n");
        break;
    default:
        ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state);
        irda_task_next_state(task, IRDA_TASK_DONE);
        self->speed_task = NULL;
        ret = -1;
        break;
    }
    return ret;
}
Beispiel #2
0
/*
 * Function girbil_change_speed (dev, speed)
 *
 *    Set the speed for the Girbil type dongle.
 *
 */
static int girbil_change_speed(struct irda_task *task)
{
	dongle_t *self = (dongle_t *) task->instance;
	__u32 speed = (__u32) task->param;
	__u8 control[2];
	int ret = 0;

	self->speed_task = task;

	switch (task->state) {
	case IRDA_TASK_INIT:
		/* Need to reset the dongle and go to 9600 bps before
                   programming */
		if (irda_task_execute(self, girbil_reset, NULL, task, 
				      (void *) speed))
		{
			/* Dongle need more time to reset */
			irda_task_next_state(task, IRDA_TASK_CHILD_WAIT);

			/* Give reset 1 sec to finish */
			ret = MSECS_TO_JIFFIES(1000);
		}
		break;
	case IRDA_TASK_CHILD_WAIT:
		WARNING(__FUNCTION__ "(), resetting dongle timed out!\n");
		ret = -1;
		break;
	case IRDA_TASK_CHILD_DONE:
		/* Set DTR and Clear RTS to enter command mode */
		self->set_dtr_rts(self->dev, FALSE, TRUE);

		switch (speed) {
		case 9600:
		default:
			control[0] = GIRBIL_9600;
			break;
		case 19200:
			control[0] = GIRBIL_19200;
			break;
		case 34800:
			control[0] = GIRBIL_38400;
			break;
		case 57600:
			control[0] = GIRBIL_57600;
			break;
		case 115200:
			control[0] = GIRBIL_115200;
			break;
		}
		control[1] = GIRBIL_LOAD;
		
		/* Write control bytes */
		self->write(self->dev, control, 2);
		irda_task_next_state(task, IRDA_TASK_WAIT);
		ret = MSECS_TO_JIFFIES(100);
		break;
	case IRDA_TASK_WAIT:
		/* Go back to normal mode */
		self->set_dtr_rts(self->dev, TRUE, TRUE);
		irda_task_next_state(task, IRDA_TASK_DONE);
		self->speed_task = NULL;
		break;
	default:
		ERROR(__FUNCTION__ "(), unknown state %d\n", task->state);
		irda_task_next_state(task, IRDA_TASK_DONE);
		self->speed_task = NULL;
		ret = -1;
		break;
	}
	return ret;
}