Lines Matching refs:smic

102 static unsigned int init_smic_data(struct si_sm_data *smic,  in init_smic_data()  argument
105 smic->state = SMIC_IDLE; in init_smic_data()
106 smic->io = io; in init_smic_data()
107 smic->write_pos = 0; in init_smic_data()
108 smic->write_count = 0; in init_smic_data()
109 smic->orig_write_count = 0; in init_smic_data()
110 smic->read_pos = 0; in init_smic_data()
111 smic->error_retries = 0; in init_smic_data()
112 smic->truncated = 0; in init_smic_data()
113 smic->smic_timeout = SMIC_RETRY_TIMEOUT; in init_smic_data()
119 static int start_smic_transaction(struct si_sm_data *smic, in start_smic_transaction() argument
129 if ((smic->state != SMIC_IDLE) && (smic->state != SMIC_HOSED)) in start_smic_transaction()
138 smic->error_retries = 0; in start_smic_transaction()
139 memcpy(smic->write_data, data, size); in start_smic_transaction()
140 smic->write_count = size; in start_smic_transaction()
141 smic->orig_write_count = size; in start_smic_transaction()
142 smic->write_pos = 0; in start_smic_transaction()
143 smic->read_pos = 0; in start_smic_transaction()
144 smic->state = SMIC_START_OP; in start_smic_transaction()
145 smic->smic_timeout = SMIC_RETRY_TIMEOUT; in start_smic_transaction()
149 static int smic_get_result(struct si_sm_data *smic, in smic_get_result() argument
156 for (i = 0; i < smic->read_pos; i++) in smic_get_result()
157 printk(" %02x", smic->read_data[i]); in smic_get_result()
160 if (length < smic->read_pos) { in smic_get_result()
161 smic->read_pos = length; in smic_get_result()
162 smic->truncated = 1; in smic_get_result()
164 memcpy(data, smic->read_data, smic->read_pos); in smic_get_result()
166 if ((length >= 3) && (smic->read_pos < 3)) { in smic_get_result()
168 smic->read_pos = 3; in smic_get_result()
170 if (smic->truncated) { in smic_get_result()
172 smic->truncated = 0; in smic_get_result()
174 return smic->read_pos; in smic_get_result()
177 static inline unsigned char read_smic_flags(struct si_sm_data *smic) in read_smic_flags() argument
179 return smic->io->inputb(smic->io, 2); in read_smic_flags()
182 static inline unsigned char read_smic_status(struct si_sm_data *smic) in read_smic_status() argument
184 return smic->io->inputb(smic->io, 1); in read_smic_status()
187 static inline unsigned char read_smic_data(struct si_sm_data *smic) in read_smic_data() argument
189 return smic->io->inputb(smic->io, 0); in read_smic_data()
192 static inline void write_smic_flags(struct si_sm_data *smic, in write_smic_flags() argument
195 smic->io->outputb(smic->io, 2, flags); in write_smic_flags()
198 static inline void write_smic_control(struct si_sm_data *smic, in write_smic_control() argument
201 smic->io->outputb(smic->io, 1, control); in write_smic_control()
204 static inline void write_si_sm_data(struct si_sm_data *smic, in write_si_sm_data() argument
207 smic->io->outputb(smic->io, 0, data); in write_si_sm_data()
210 static inline void start_error_recovery(struct si_sm_data *smic, char *reason) in start_error_recovery() argument
212 (smic->error_retries)++; in start_error_recovery()
213 if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) { in start_error_recovery()
217 smic->state = SMIC_HOSED; in start_error_recovery()
219 smic->write_count = smic->orig_write_count; in start_error_recovery()
220 smic->write_pos = 0; in start_error_recovery()
221 smic->read_pos = 0; in start_error_recovery()
222 smic->state = SMIC_START_OP; in start_error_recovery()
223 smic->smic_timeout = SMIC_RETRY_TIMEOUT; in start_error_recovery()
227 static inline void write_next_byte(struct si_sm_data *smic) in write_next_byte() argument
229 write_si_sm_data(smic, smic->write_data[smic->write_pos]); in write_next_byte()
230 (smic->write_pos)++; in write_next_byte()
231 (smic->write_count)--; in write_next_byte()
234 static inline void read_next_byte(struct si_sm_data *smic) in read_next_byte() argument
236 if (smic->read_pos >= MAX_SMIC_READ_SIZE) { in read_next_byte()
237 read_smic_data(smic); in read_next_byte()
238 smic->truncated = 1; in read_next_byte()
240 smic->read_data[smic->read_pos] = read_smic_data(smic); in read_next_byte()
241 smic->read_pos++; in read_next_byte()
316 static enum si_sm_result smic_event(struct si_sm_data *smic, long time) in smic_event() argument
322 if (smic->state == SMIC_HOSED) { in smic_event()
323 init_smic_data(smic, smic->io); in smic_event()
326 if (smic->state != SMIC_IDLE) { in smic_event()
331 smic->smic_timeout, time); in smic_event()
337 smic->smic_timeout -= time; in smic_event()
338 if (smic->smic_timeout < 0) { in smic_event()
339 start_error_recovery(smic, "smic timed out."); in smic_event()
344 flags = read_smic_flags(smic); in smic_event()
348 status = read_smic_status(smic); in smic_event()
353 smic->state, flags, status); in smic_event()
355 switch (smic->state) { in smic_event()
364 write_smic_control(smic, SMIC_CC_SMS_GET_STATUS); in smic_event()
365 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
366 smic->state = SMIC_OP_OK; in smic_event()
372 start_error_recovery(smic, in smic_event()
378 write_smic_control(smic, SMIC_CC_SMS_WR_START); in smic_event()
379 write_next_byte(smic); in smic_event()
380 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
381 smic->state = SMIC_WRITE_START; in smic_event()
386 start_error_recovery(smic, in smic_event()
396 if (smic->write_count == 1) { in smic_event()
398 write_smic_control(smic, SMIC_CC_SMS_WR_END); in smic_event()
399 smic->state = SMIC_WRITE_END; in smic_event()
401 write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); in smic_event()
402 smic->state = SMIC_WRITE_NEXT; in smic_event()
404 write_next_byte(smic); in smic_event()
405 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
412 start_error_recovery(smic, in smic_event()
419 if (smic->write_count == 1) { in smic_event()
420 write_smic_control(smic, SMIC_CC_SMS_WR_END); in smic_event()
421 smic->state = SMIC_WRITE_END; in smic_event()
423 write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); in smic_event()
424 smic->state = SMIC_WRITE_NEXT; in smic_event()
426 write_next_byte(smic); in smic_event()
427 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
434 start_error_recovery(smic, in smic_event()
440 data = read_smic_data(smic); in smic_event()
445 start_error_recovery(smic, in smic_event()
450 smic->state = SMIC_WRITE2READ; in smic_event()
459 write_smic_control(smic, SMIC_CC_SMS_RD_START); in smic_event()
460 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
461 smic->state = SMIC_READ_START; in smic_event()
468 start_error_recovery(smic, in smic_event()
474 read_next_byte(smic); in smic_event()
475 write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); in smic_event()
476 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
477 smic->state = SMIC_READ_NEXT; in smic_event()
489 read_next_byte(smic); in smic_event()
490 write_smic_control(smic, SMIC_CC_SMS_RD_END); in smic_event()
491 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
492 smic->state = SMIC_READ_END; in smic_event()
496 read_next_byte(smic); in smic_event()
497 write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); in smic_event()
498 write_smic_flags(smic, flags | SMIC_FLAG_BSY); in smic_event()
499 smic->state = SMIC_READ_NEXT; in smic_event()
505 smic, in smic_event()
514 start_error_recovery(smic, in smic_event()
519 data = read_smic_data(smic); in smic_event()
525 start_error_recovery(smic, in smic_event()
530 smic->state = SMIC_IDLE; in smic_event()
535 init_smic_data(smic, smic->io); in smic_event()
540 printk(KERN_DEBUG "smic->state = %d\n", smic->state); in smic_event()
541 start_error_recovery(smic, "state = UNKNOWN"); in smic_event()
545 smic->smic_timeout = SMIC_RETRY_TIMEOUT; in smic_event()
549 static int smic_detect(struct si_sm_data *smic) in smic_detect() argument
557 if (read_smic_flags(smic) == 0xff) in smic_detect()