/* * 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; }
/* * 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; }