smic 102 drivers/char/ipmi/ipmi_smic_sm.c static unsigned int init_smic_data(struct si_sm_data *smic, smic 105 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_IDLE; smic 106 drivers/char/ipmi/ipmi_smic_sm.c smic->io = io; smic 107 drivers/char/ipmi/ipmi_smic_sm.c smic->write_pos = 0; smic 108 drivers/char/ipmi/ipmi_smic_sm.c smic->write_count = 0; smic 109 drivers/char/ipmi/ipmi_smic_sm.c smic->orig_write_count = 0; smic 110 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos = 0; smic 111 drivers/char/ipmi/ipmi_smic_sm.c smic->error_retries = 0; smic 112 drivers/char/ipmi/ipmi_smic_sm.c smic->truncated = 0; smic 113 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout = SMIC_RETRY_TIMEOUT; smic 119 drivers/char/ipmi/ipmi_smic_sm.c static int start_smic_transaction(struct si_sm_data *smic, smic 129 drivers/char/ipmi/ipmi_smic_sm.c if ((smic->state != SMIC_IDLE) && (smic->state != SMIC_HOSED)) smic 138 drivers/char/ipmi/ipmi_smic_sm.c smic->error_retries = 0; smic 139 drivers/char/ipmi/ipmi_smic_sm.c memcpy(smic->write_data, data, size); smic 140 drivers/char/ipmi/ipmi_smic_sm.c smic->write_count = size; smic 141 drivers/char/ipmi/ipmi_smic_sm.c smic->orig_write_count = size; smic 142 drivers/char/ipmi/ipmi_smic_sm.c smic->write_pos = 0; smic 143 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos = 0; smic 144 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_START_OP; smic 145 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout = SMIC_RETRY_TIMEOUT; smic 149 drivers/char/ipmi/ipmi_smic_sm.c static int smic_get_result(struct si_sm_data *smic, smic 156 drivers/char/ipmi/ipmi_smic_sm.c for (i = 0; i < smic->read_pos; i++) smic 157 drivers/char/ipmi/ipmi_smic_sm.c pr_cont(" %02x", smic->read_data[i]); smic 160 drivers/char/ipmi/ipmi_smic_sm.c if (length < smic->read_pos) { smic 161 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos = length; smic 162 drivers/char/ipmi/ipmi_smic_sm.c smic->truncated = 1; smic 164 drivers/char/ipmi/ipmi_smic_sm.c memcpy(data, smic->read_data, smic->read_pos); smic 166 drivers/char/ipmi/ipmi_smic_sm.c if ((length >= 3) && (smic->read_pos < 3)) { smic 168 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos = 3; smic 170 drivers/char/ipmi/ipmi_smic_sm.c if (smic->truncated) { smic 172 drivers/char/ipmi/ipmi_smic_sm.c smic->truncated = 0; smic 174 drivers/char/ipmi/ipmi_smic_sm.c return smic->read_pos; smic 177 drivers/char/ipmi/ipmi_smic_sm.c static inline unsigned char read_smic_flags(struct si_sm_data *smic) smic 179 drivers/char/ipmi/ipmi_smic_sm.c return smic->io->inputb(smic->io, 2); smic 182 drivers/char/ipmi/ipmi_smic_sm.c static inline unsigned char read_smic_status(struct si_sm_data *smic) smic 184 drivers/char/ipmi/ipmi_smic_sm.c return smic->io->inputb(smic->io, 1); smic 187 drivers/char/ipmi/ipmi_smic_sm.c static inline unsigned char read_smic_data(struct si_sm_data *smic) smic 189 drivers/char/ipmi/ipmi_smic_sm.c return smic->io->inputb(smic->io, 0); smic 192 drivers/char/ipmi/ipmi_smic_sm.c static inline void write_smic_flags(struct si_sm_data *smic, smic 195 drivers/char/ipmi/ipmi_smic_sm.c smic->io->outputb(smic->io, 2, flags); smic 198 drivers/char/ipmi/ipmi_smic_sm.c static inline void write_smic_control(struct si_sm_data *smic, smic 201 drivers/char/ipmi/ipmi_smic_sm.c smic->io->outputb(smic->io, 1, control); smic 204 drivers/char/ipmi/ipmi_smic_sm.c static inline void write_si_sm_data(struct si_sm_data *smic, smic 207 drivers/char/ipmi/ipmi_smic_sm.c smic->io->outputb(smic->io, 0, data); smic 210 drivers/char/ipmi/ipmi_smic_sm.c static inline void start_error_recovery(struct si_sm_data *smic, char *reason) smic 212 drivers/char/ipmi/ipmi_smic_sm.c (smic->error_retries)++; smic 213 drivers/char/ipmi/ipmi_smic_sm.c if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) { smic 216 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_HOSED; smic 218 drivers/char/ipmi/ipmi_smic_sm.c smic->write_count = smic->orig_write_count; smic 219 drivers/char/ipmi/ipmi_smic_sm.c smic->write_pos = 0; smic 220 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos = 0; smic 221 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_START_OP; smic 222 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout = SMIC_RETRY_TIMEOUT; smic 226 drivers/char/ipmi/ipmi_smic_sm.c static inline void write_next_byte(struct si_sm_data *smic) smic 228 drivers/char/ipmi/ipmi_smic_sm.c write_si_sm_data(smic, smic->write_data[smic->write_pos]); smic 229 drivers/char/ipmi/ipmi_smic_sm.c (smic->write_pos)++; smic 230 drivers/char/ipmi/ipmi_smic_sm.c (smic->write_count)--; smic 233 drivers/char/ipmi/ipmi_smic_sm.c static inline void read_next_byte(struct si_sm_data *smic) smic 235 drivers/char/ipmi/ipmi_smic_sm.c if (smic->read_pos >= MAX_SMIC_READ_SIZE) { smic 236 drivers/char/ipmi/ipmi_smic_sm.c read_smic_data(smic); smic 237 drivers/char/ipmi/ipmi_smic_sm.c smic->truncated = 1; smic 239 drivers/char/ipmi/ipmi_smic_sm.c smic->read_data[smic->read_pos] = read_smic_data(smic); smic 240 drivers/char/ipmi/ipmi_smic_sm.c smic->read_pos++; smic 315 drivers/char/ipmi/ipmi_smic_sm.c static enum si_sm_result smic_event(struct si_sm_data *smic, long time) smic 321 drivers/char/ipmi/ipmi_smic_sm.c if (smic->state == SMIC_HOSED) { smic 322 drivers/char/ipmi/ipmi_smic_sm.c init_smic_data(smic, smic->io); smic 325 drivers/char/ipmi/ipmi_smic_sm.c if (smic->state != SMIC_IDLE) { smic 329 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout, time); smic 335 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout -= time; smic 336 drivers/char/ipmi/ipmi_smic_sm.c if (smic->smic_timeout < 0) { smic 337 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, "smic timed out."); smic 342 drivers/char/ipmi/ipmi_smic_sm.c flags = read_smic_flags(smic); smic 346 drivers/char/ipmi/ipmi_smic_sm.c status = read_smic_status(smic); smic 349 drivers/char/ipmi/ipmi_smic_sm.c smic->state, flags, status); smic 351 drivers/char/ipmi/ipmi_smic_sm.c switch (smic->state) { smic 360 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_GET_STATUS); smic 361 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 362 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_OP_OK; smic 368 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 374 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_WR_START); smic 375 drivers/char/ipmi/ipmi_smic_sm.c write_next_byte(smic); smic 376 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 377 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE_START; smic 382 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 392 drivers/char/ipmi/ipmi_smic_sm.c if (smic->write_count == 1) { smic 394 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_WR_END); smic 395 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE_END; smic 397 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); smic 398 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE_NEXT; smic 400 drivers/char/ipmi/ipmi_smic_sm.c write_next_byte(smic); smic 401 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 408 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 415 drivers/char/ipmi/ipmi_smic_sm.c if (smic->write_count == 1) { smic 416 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_WR_END); smic 417 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE_END; smic 419 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); smic 420 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE_NEXT; smic 422 drivers/char/ipmi/ipmi_smic_sm.c write_next_byte(smic); smic 423 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 430 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 436 drivers/char/ipmi/ipmi_smic_sm.c data = read_smic_data(smic); smic 441 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 446 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_WRITE2READ; smic 455 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_RD_START); smic 456 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 457 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_READ_START; smic 464 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 470 drivers/char/ipmi/ipmi_smic_sm.c read_next_byte(smic); smic 471 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); smic 472 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 473 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_READ_NEXT; smic 485 drivers/char/ipmi/ipmi_smic_sm.c read_next_byte(smic); smic 486 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_RD_END); smic 487 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 488 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_READ_END; smic 492 drivers/char/ipmi/ipmi_smic_sm.c read_next_byte(smic); smic 493 drivers/char/ipmi/ipmi_smic_sm.c write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); smic 494 drivers/char/ipmi/ipmi_smic_sm.c write_smic_flags(smic, flags | SMIC_FLAG_BSY); smic 495 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_READ_NEXT; smic 501 drivers/char/ipmi/ipmi_smic_sm.c smic, smic 510 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 515 drivers/char/ipmi/ipmi_smic_sm.c data = read_smic_data(smic); smic 521 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, smic 526 drivers/char/ipmi/ipmi_smic_sm.c smic->state = SMIC_IDLE; smic 531 drivers/char/ipmi/ipmi_smic_sm.c init_smic_data(smic, smic->io); smic 536 drivers/char/ipmi/ipmi_smic_sm.c printk(KERN_DEBUG "smic->state = %d\n", smic->state); smic 537 drivers/char/ipmi/ipmi_smic_sm.c start_error_recovery(smic, "state = UNKNOWN"); smic 541 drivers/char/ipmi/ipmi_smic_sm.c smic->smic_timeout = SMIC_RETRY_TIMEOUT; smic 545 drivers/char/ipmi/ipmi_smic_sm.c static int smic_detect(struct si_sm_data *smic) smic 553 drivers/char/ipmi/ipmi_smic_sm.c if (read_smic_flags(smic) == 0xff)