#ifdef DEBUG_STATE printk("  State = %d, %x\n", kcs->state, status); #endif 
if (kcs_debug & KCS_DEBUG_STATES) printk(KERN_DEBUG "KCS: State = %d, %x\n", kcs->state, status);  
static enum si_sm_result kcs_event(struct si_sm_data *kcs, long time){	unsigned char status;	unsigned char state;	status = read_status(kcs);#ifdef DEBUG_STATE	printk("  State = %d, %x\n", kcs->state, status);#endif	/* All states wait for ibf, so just do it here. */	if (!check_ibf(kcs, status, time))		return SI_SM_CALL_WITH_DELAY;	/* Just about everything looks at the KCS state, so grab that, too. */	state = GET_STATUS_STATE(status);	switch (kcs->state) {	case KCS_IDLE:		/* If there's and interrupt source, turn it off. */		clear_obf(kcs, status);		if (GET_STATUS_ATN(status))			return SI_SM_ATTN;		else			return SI_SM_IDLE;	case KCS_START_OP:		if (state != KCS_IDLE) {			start_error_recovery(kcs,					     "State machine not idle at start");			break;		}		clear_obf(kcs, status);		write_cmd(kcs, KCS_WRITE_START);		kcs->state = KCS_WAIT_WRITE_START;		break;	case KCS_WAIT_WRITE_START:		if (state != KCS_WRITE_STATE) {			start_error_recovery(				kcs,				"Not in write state at write start");			break;		}		read_data(kcs);		if (kcs->write_count == 1) {			write_cmd(kcs, KCS_WRITE_END);			kcs->state = KCS_WAIT_WRITE_END;		} else {			write_next_byte(kcs);			kcs->state = KCS_WAIT_WRITE;		}		break;	case KCS_WAIT_WRITE:		if (state != KCS_WRITE_STATE) {			start_error_recovery(kcs,					     "Not in write state for write");			break;		}		clear_obf(kcs, status);		if (kcs->write_count == 1) {			write_cmd(kcs, KCS_WRITE_END);			kcs->state = KCS_WAIT_WRITE_END;		} else {			write_next_byte(kcs);		}		break;			case KCS_WAIT_WRITE_END:		if (state != KCS_WRITE_STATE) {			start_error_recovery(kcs,					     "Not in write state for write end");			break;		}		clear_obf(kcs, status);		write_next_byte(kcs);		kcs->state = KCS_WAIT_READ;		break;	case KCS_WAIT_READ:		if ((state != KCS_READ_STATE) && (state != KCS_IDLE_STATE)) {			start_error_recovery(				kcs,				"Not in read or idle in read state");			break;		}		if (state == KCS_READ_STATE) {			if (! check_obf(kcs, status, time))				return SI_SM_CALL_WITH_DELAY;			read_next_byte(kcs);		} else {			/* We don't implement this exactly like the state			   machine in the spec.  Some broken hardware			   does not write the final dummy byte to the			   read register.  Thus obf will never go high			   here.  We just go straight to idle, and we			   handle clearing out obf in idle state if it			   happens to come in. */			clear_obf(kcs, status);			kcs->orig_write_count = 0;			kcs->state = KCS_IDLE;			return SI_SM_TRANSACTION_COMPLETE;		}		break;	case KCS_ERROR0:		clear_obf(kcs, status);		write_cmd(kcs, KCS_GET_STATUS_ABORT);		kcs->state = KCS_ERROR1;		break;	case KCS_ERROR1:		clear_obf(kcs, status);		write_data(kcs, 0);		kcs->state = KCS_ERROR2;		break;			case KCS_ERROR2:		if (state != KCS_READ_STATE) {			start_error_recovery(kcs,					     "Not in read state for error2");			break;		}		if (! check_obf(kcs, status, time))			return SI_SM_CALL_WITH_DELAY;		clear_obf(kcs, status);		write_data(kcs, KCS_READ_BYTE);		kcs->state = KCS_ERROR3;		break;			case KCS_ERROR3:		if (state != KCS_IDLE_STATE) {			start_error_recovery(kcs,					     "Not in idle state for error3");			break;		}		if (! check_obf(kcs, status, time))			return SI_SM_CALL_WITH_DELAY;		clear_obf(kcs, status);		if (kcs->orig_write_count) {			restart_kcs_transaction(kcs);		} else {			kcs->state = KCS_IDLE;			return SI_SM_TRANSACTION_COMPLETE;		}		break;				case KCS_HOSED:		break;	}	if (kcs->state == KCS_HOSED) {		init_kcs_data(kcs, kcs->io);		return SI_SM_HOSED;	}	return SI_SM_CALL_WITHOUT_DELAY;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/c4edff1c19ef23e15aae64ca03f32c6719822d54/ipmi_kcs_sm.c/buggy/drivers/char/ipmi/ipmi_kcs_sm.c