xref: /openbmc/linux/drivers/char/ipmi/ipmi_bt_sm.c (revision 643d1f7f)
1 /*
2  *  ipmi_bt_sm.c
3  *
4  *  The state machine for an Open IPMI BT sub-driver under ipmi_si.c, part
5  *  of the driver architecture at http://sourceforge.net/project/openipmi
6  *
7  *  Author:	Rocky Craig <first.last@hp.com>
8  *
9  *  This program is free software; you can redistribute it and/or modify it
10  *  under the terms of the GNU General Public License as published by the
11  *  Free Software Foundation; either version 2 of the License, or (at your
12  *  option) any later version.
13  *
14  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
15  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
20  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
22  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
23  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  *  You should have received a copy of the GNU General Public License along
26  *  with this program; if not, write to the Free Software Foundation, Inc.,
27  *  675 Mass Ave, Cambridge, MA 02139, USA.  */
28 
29 #include <linux/kernel.h> /* For printk. */
30 #include <linux/string.h>
31 #include <linux/module.h>
32 #include <linux/moduleparam.h>
33 #include <linux/ipmi_msgdefs.h>		/* for completion codes */
34 #include "ipmi_si_sm.h"
35 
36 #define BT_DEBUG_OFF	0	/* Used in production */
37 #define BT_DEBUG_ENABLE	1	/* Generic messages */
38 #define BT_DEBUG_MSG	2	/* Prints all request/response buffers */
39 #define BT_DEBUG_STATES	4	/* Verbose look at state changes */
40 /* BT_DEBUG_OFF must be zero to correspond to the default uninitialized
41    value */
42 
43 static int bt_debug; /* 0 == BT_DEBUG_OFF */
44 
45 module_param(bt_debug, int, 0644);
46 MODULE_PARM_DESC(bt_debug, "debug bitmask, 1=enable, 2=messages, 4=states");
47 
48 /* Typical "Get BT Capabilities" values are 2-3 retries, 5-10 seconds,
49    and 64 byte buffers.  However, one HP implementation wants 255 bytes of
50    buffer (with a documented message of 160 bytes) so go for the max.
51    Since the Open IPMI architecture is single-message oriented at this
52    stage, the queue depth of BT is of no concern. */
53 
54 #define BT_NORMAL_TIMEOUT	5	/* seconds */
55 #define BT_NORMAL_RETRY_LIMIT	2
56 #define BT_RESET_DELAY		6	/* seconds after warm reset */
57 
58 /* States are written in chronological order and usually cover
59    multiple rows of the state table discussion in the IPMI spec. */
60 
61 enum bt_states {
62 	BT_STATE_IDLE = 0,	/* Order is critical in this list */
63 	BT_STATE_XACTION_START,
64 	BT_STATE_WRITE_BYTES,
65 	BT_STATE_WRITE_CONSUME,
66 	BT_STATE_READ_WAIT,
67 	BT_STATE_CLEAR_B2H,
68 	BT_STATE_READ_BYTES,
69 	BT_STATE_RESET1,	/* These must come last */
70 	BT_STATE_RESET2,
71 	BT_STATE_RESET3,
72 	BT_STATE_RESTART,
73 	BT_STATE_PRINTME,
74 	BT_STATE_CAPABILITIES_BEGIN,
75 	BT_STATE_CAPABILITIES_END,
76 	BT_STATE_LONG_BUSY	/* BT doesn't get hosed :-) */
77 };
78 
79 /* Macros seen at the end of state "case" blocks.  They help with legibility
80    and debugging. */
81 
82 #define BT_STATE_CHANGE(X,Y) { bt->state = X; return Y; }
83 
84 #define BT_SI_SM_RETURN(Y)   { last_printed = BT_STATE_PRINTME; return Y; }
85 
86 struct si_sm_data {
87 	enum bt_states	state;
88 	unsigned char	seq;		/* BT sequence number */
89 	struct si_sm_io	*io;
90 	unsigned char	write_data[IPMI_MAX_MSG_LENGTH];
91 	int		write_count;
92 	unsigned char	read_data[IPMI_MAX_MSG_LENGTH];
93 	int		read_count;
94 	int		truncated;
95 	long		timeout;	/* microseconds countdown */
96 	int		error_retries;	/* end of "common" fields */
97 	int		nonzero_status;	/* hung BMCs stay all 0 */
98 	enum bt_states	complete;	/* to divert the state machine */
99 	int		BT_CAP_outreqs;
100 	long		BT_CAP_req2rsp;
101 	int		BT_CAP_retries;	/* Recommended retries */
102 };
103 
104 #define BT_CLR_WR_PTR	0x01	/* See IPMI 1.5 table 11.6.4 */
105 #define BT_CLR_RD_PTR	0x02
106 #define BT_H2B_ATN	0x04
107 #define BT_B2H_ATN	0x08
108 #define BT_SMS_ATN	0x10
109 #define BT_OEM0		0x20
110 #define BT_H_BUSY	0x40
111 #define BT_B_BUSY	0x80
112 
113 /* Some bits are toggled on each write: write once to set it, once
114    more to clear it; writing a zero does nothing.  To absolutely
115    clear it, check its state and write if set.  This avoids the "get
116    current then use as mask" scheme to modify one bit.  Note that the
117    variable "bt" is hardcoded into these macros. */
118 
119 #define BT_STATUS	bt->io->inputb(bt->io, 0)
120 #define BT_CONTROL(x)	bt->io->outputb(bt->io, 0, x)
121 
122 #define BMC2HOST	bt->io->inputb(bt->io, 1)
123 #define HOST2BMC(x)	bt->io->outputb(bt->io, 1, x)
124 
125 #define BT_INTMASK_R	bt->io->inputb(bt->io, 2)
126 #define BT_INTMASK_W(x)	bt->io->outputb(bt->io, 2, x)
127 
128 /* Convenience routines for debugging.  These are not multi-open safe!
129    Note the macros have hardcoded variables in them. */
130 
131 static char *state2txt(unsigned char state)
132 {
133 	switch (state) {
134 	case BT_STATE_IDLE:		return("IDLE");
135 	case BT_STATE_XACTION_START:	return("XACTION");
136 	case BT_STATE_WRITE_BYTES:	return("WR_BYTES");
137 	case BT_STATE_WRITE_CONSUME:	return("WR_CONSUME");
138 	case BT_STATE_READ_WAIT:	return("RD_WAIT");
139 	case BT_STATE_CLEAR_B2H:	return("CLEAR_B2H");
140 	case BT_STATE_READ_BYTES:	return("RD_BYTES");
141 	case BT_STATE_RESET1:		return("RESET1");
142 	case BT_STATE_RESET2:		return("RESET2");
143 	case BT_STATE_RESET3:		return("RESET3");
144 	case BT_STATE_RESTART:		return("RESTART");
145 	case BT_STATE_LONG_BUSY:	return("LONG_BUSY");
146 	case BT_STATE_CAPABILITIES_BEGIN: return("CAP_BEGIN");
147 	case BT_STATE_CAPABILITIES_END:	return("CAP_END");
148 	}
149 	return("BAD STATE");
150 }
151 #define STATE2TXT state2txt(bt->state)
152 
153 static char *status2txt(unsigned char status)
154 {
155 	/*
156 	 * This cannot be called by two threads at the same time and
157 	 * the buffer is always consumed immediately, so the static is
158 	 * safe to use.
159 	 */
160 	static char buf[40];
161 
162 	strcpy(buf, "[ ");
163 	if (status & BT_B_BUSY)
164 		strcat(buf, "B_BUSY ");
165 	if (status & BT_H_BUSY)
166 		strcat(buf, "H_BUSY ");
167 	if (status & BT_OEM0)
168 		strcat(buf, "OEM0 ");
169 	if (status & BT_SMS_ATN)
170 		strcat(buf, "SMS ");
171 	if (status & BT_B2H_ATN)
172 		strcat(buf, "B2H ");
173 	if (status & BT_H2B_ATN)
174 		strcat(buf, "H2B ");
175 	strcat(buf, "]");
176 	return buf;
177 }
178 #define STATUS2TXT status2txt(status)
179 
180 /* called externally at insmod time, and internally on cleanup */
181 
182 static unsigned int bt_init_data(struct si_sm_data *bt, struct si_sm_io *io)
183 {
184 	memset(bt, 0, sizeof(struct si_sm_data));
185 	if (bt->io != io) {		/* external: one-time only things */
186 		bt->io = io;
187 		bt->seq = 0;
188 	}
189 	bt->state = BT_STATE_IDLE;	/* start here */
190 	bt->complete = BT_STATE_IDLE;	/* end here */
191 	bt->BT_CAP_req2rsp = BT_NORMAL_TIMEOUT * 1000000;
192 	bt->BT_CAP_retries = BT_NORMAL_RETRY_LIMIT;
193 	/* BT_CAP_outreqs == zero is a flag to read BT Capabilities */
194 	return 3; /* We claim 3 bytes of space; ought to check SPMI table */
195 }
196 
197 /* Jam a completion code (probably an error) into a response */
198 
199 static void force_result(struct si_sm_data *bt, unsigned char completion_code)
200 {
201 	bt->read_data[0] = 4;				/* # following bytes */
202 	bt->read_data[1] = bt->write_data[1] | 4;	/* Odd NetFn/LUN */
203 	bt->read_data[2] = bt->write_data[2];		/* seq (ignored) */
204 	bt->read_data[3] = bt->write_data[3];		/* Command */
205 	bt->read_data[4] = completion_code;
206 	bt->read_count = 5;
207 }
208 
209 /* The upper state machine starts here */
210 
211 static int bt_start_transaction(struct si_sm_data *bt,
212 				unsigned char *data,
213 				unsigned int size)
214 {
215 	unsigned int i;
216 
217 	if (size < 2)
218 		return IPMI_REQ_LEN_INVALID_ERR;
219 	if (size > IPMI_MAX_MSG_LENGTH)
220 		return IPMI_REQ_LEN_EXCEEDED_ERR;
221 
222 	if (bt->state == BT_STATE_LONG_BUSY)
223 		return IPMI_NODE_BUSY_ERR;
224 
225 	if (bt->state != BT_STATE_IDLE)
226 		return IPMI_NOT_IN_MY_STATE_ERR;
227 
228 	if (bt_debug & BT_DEBUG_MSG) {
229 		printk(KERN_WARNING "BT: +++++++++++++++++ New command\n");
230 		printk(KERN_WARNING "BT: NetFn/LUN CMD [%d data]:", size - 2);
231 		for (i = 0; i < size; i ++)
232 			printk (" %02x", data[i]);
233 		printk("\n");
234 	}
235 	bt->write_data[0] = size + 1;	/* all data plus seq byte */
236 	bt->write_data[1] = *data;	/* NetFn/LUN */
237 	bt->write_data[2] = bt->seq++;
238 	memcpy(bt->write_data + 3, data + 1, size - 1);
239 	bt->write_count = size + 2;
240 	bt->error_retries = 0;
241 	bt->nonzero_status = 0;
242 	bt->truncated = 0;
243 	bt->state = BT_STATE_XACTION_START;
244 	bt->timeout = bt->BT_CAP_req2rsp;
245 	force_result(bt, IPMI_ERR_UNSPECIFIED);
246 	return 0;
247 }
248 
249 /* After the upper state machine has been told SI_SM_TRANSACTION_COMPLETE
250    it calls this.  Strip out the length and seq bytes. */
251 
252 static int bt_get_result(struct si_sm_data *bt,
253 			 unsigned char *data,
254 			 unsigned int length)
255 {
256 	int i, msg_len;
257 
258 	msg_len = bt->read_count - 2;		/* account for length & seq */
259 	if (msg_len < 3 || msg_len > IPMI_MAX_MSG_LENGTH) {
260 		force_result(bt, IPMI_ERR_UNSPECIFIED);
261 		msg_len = 3;
262 	}
263 	data[0] = bt->read_data[1];
264 	data[1] = bt->read_data[3];
265 	if (length < msg_len || bt->truncated) {
266 		data[2] = IPMI_ERR_MSG_TRUNCATED;
267 		msg_len = 3;
268 	} else
269 		memcpy(data + 2, bt->read_data + 4, msg_len - 2);
270 
271 	if (bt_debug & BT_DEBUG_MSG) {
272 		printk (KERN_WARNING "BT: result %d bytes:", msg_len);
273 		for (i = 0; i < msg_len; i++)
274 			printk(" %02x", data[i]);
275 		printk ("\n");
276 	}
277 	return msg_len;
278 }
279 
280 /* This bit's functionality is optional */
281 #define BT_BMC_HWRST	0x80
282 
283 static void reset_flags(struct si_sm_data *bt)
284 {
285 	if (bt_debug)
286 		printk(KERN_WARNING "IPMI BT: flag reset %s\n",
287 					status2txt(BT_STATUS));
288 	if (BT_STATUS & BT_H_BUSY)
289 		BT_CONTROL(BT_H_BUSY);	/* force clear */
290 	BT_CONTROL(BT_CLR_WR_PTR);	/* always reset */
291 	BT_CONTROL(BT_SMS_ATN);		/* always clear */
292 	BT_INTMASK_W(BT_BMC_HWRST);
293 }
294 
295 /* Get rid of an unwanted/stale response.  This should only be needed for
296    BMCs that support multiple outstanding requests. */
297 
298 static void drain_BMC2HOST(struct si_sm_data *bt)
299 {
300 	int i, size;
301 
302 	if (!(BT_STATUS & BT_B2H_ATN)) 	/* Not signalling a response */
303 		return;
304 
305 	BT_CONTROL(BT_H_BUSY);		/* now set */
306 	BT_CONTROL(BT_B2H_ATN);		/* always clear */
307 	BT_STATUS;			/* pause */
308 	BT_CONTROL(BT_B2H_ATN);		/* some BMCs are stubborn */
309 	BT_CONTROL(BT_CLR_RD_PTR);	/* always reset */
310 	if (bt_debug)
311 		printk(KERN_WARNING "IPMI BT: stale response %s; ",
312 			status2txt(BT_STATUS));
313 	size = BMC2HOST;
314 	for (i = 0; i < size ; i++)
315 		BMC2HOST;
316 	BT_CONTROL(BT_H_BUSY);		/* now clear */
317 	if (bt_debug)
318 		printk("drained %d bytes\n", size + 1);
319 }
320 
321 static inline void write_all_bytes(struct si_sm_data *bt)
322 {
323 	int i;
324 
325 	if (bt_debug & BT_DEBUG_MSG) {
326 		printk(KERN_WARNING "BT: write %d bytes seq=0x%02X",
327 			bt->write_count, bt->seq);
328 		for (i = 0; i < bt->write_count; i++)
329 			printk (" %02x", bt->write_data[i]);
330 		printk ("\n");
331 	}
332 	for (i = 0; i < bt->write_count; i++)
333 		HOST2BMC(bt->write_data[i]);
334 }
335 
336 static inline int read_all_bytes(struct si_sm_data *bt)
337 {
338 	unsigned char i;
339 
340 	/* length is "framing info", minimum = 4: NetFn, Seq, Cmd, cCode.
341 	   Keep layout of first four bytes aligned with write_data[] */
342 
343 	bt->read_data[0] = BMC2HOST;
344 	bt->read_count = bt->read_data[0];
345 
346 	if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) {
347 		if (bt_debug & BT_DEBUG_MSG)
348 			printk(KERN_WARNING "BT: bad raw rsp len=%d\n",
349 				bt->read_count);
350 		bt->truncated = 1;
351 		return 1;	/* let next XACTION START clean it up */
352 	}
353 	for (i = 1; i <= bt->read_count; i++)
354 		bt->read_data[i] = BMC2HOST;
355 	bt->read_count++;	/* Account internally for length byte */
356 
357 	if (bt_debug & BT_DEBUG_MSG) {
358 		int max = bt->read_count;
359 
360 		printk(KERN_WARNING "BT: got %d bytes seq=0x%02X",
361 			max, bt->read_data[2]);
362 		if (max > 16)
363 			max = 16;
364 		for (i = 0; i < max; i++)
365 			printk (" %02x", bt->read_data[i]);
366 		printk ("%s\n", bt->read_count == max ? "" : " ...");
367 	}
368 
369 	/* per the spec, the (NetFn[1], Seq[2], Cmd[3]) tuples must match */
370 	if ((bt->read_data[3] == bt->write_data[3]) &&
371 	    (bt->read_data[2] == bt->write_data[2]) &&
372 	    ((bt->read_data[1] & 0xF8) == (bt->write_data[1] & 0xF8)))
373 			return 1;
374 
375 	if (bt_debug & BT_DEBUG_MSG)
376 		printk(KERN_WARNING "IPMI BT: bad packet: "
377 		"want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n",
378 		bt->write_data[1] | 0x04, bt->write_data[2], bt->write_data[3],
379 		bt->read_data[1],  bt->read_data[2],  bt->read_data[3]);
380 	return 0;
381 }
382 
383 /* Restart if retries are left, or return an error completion code */
384 
385 static enum si_sm_result error_recovery(struct si_sm_data *bt,
386 					unsigned char status,
387 					unsigned char cCode)
388 {
389 	char *reason;
390 
391 	bt->timeout = bt->BT_CAP_req2rsp;
392 
393 	switch (cCode) {
394 	case IPMI_TIMEOUT_ERR:
395 		reason = "timeout";
396 		break;
397 	default:
398 		reason = "internal error";
399 		break;
400 	}
401 
402 	printk(KERN_WARNING "IPMI BT: %s in %s %s ", 	/* open-ended line */
403 		reason, STATE2TXT, STATUS2TXT);
404 
405 	/* Per the IPMI spec, retries are based on the sequence number
406 	   known only to this module, so manage a restart here. */
407 	(bt->error_retries)++;
408 	if (bt->error_retries < bt->BT_CAP_retries) {
409 		printk("%d retries left\n",
410 			bt->BT_CAP_retries - bt->error_retries);
411 		bt->state = BT_STATE_RESTART;
412 		return SI_SM_CALL_WITHOUT_DELAY;
413 	}
414 
415 	printk("failed %d retries, sending error response\n",
416 		bt->BT_CAP_retries);
417 	if (!bt->nonzero_status)
418 		printk(KERN_ERR "IPMI BT: stuck, try power cycle\n");
419 
420 	/* this is most likely during insmod */
421 	else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) {
422 		printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n");
423 		bt->state = BT_STATE_RESET1;
424 		return SI_SM_CALL_WITHOUT_DELAY;
425 	}
426 
427 	/* Concoct a useful error message, set up the next state, and
428 	   be done with this sequence. */
429 
430 	bt->state = BT_STATE_IDLE;
431 	switch (cCode) {
432 	case IPMI_TIMEOUT_ERR:
433 		if (status & BT_B_BUSY) {
434 			cCode = IPMI_NODE_BUSY_ERR;
435 			bt->state = BT_STATE_LONG_BUSY;
436 		}
437 		break;
438 	default:
439 		break;
440 	}
441 	force_result(bt, cCode);
442 	return SI_SM_TRANSACTION_COMPLETE;
443 }
444 
445 /* Check status and (usually) take action and change this state machine. */
446 
447 static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
448 {
449 	unsigned char status, BT_CAP[8];
450 	static enum bt_states last_printed = BT_STATE_PRINTME;
451 	int i;
452 
453 	status = BT_STATUS;
454 	bt->nonzero_status |= status;
455 	if ((bt_debug & BT_DEBUG_STATES) && (bt->state != last_printed)) {
456 		printk(KERN_WARNING "BT: %s %s TO=%ld - %ld \n",
457 			STATE2TXT,
458 			STATUS2TXT,
459 			bt->timeout,
460 			time);
461 		last_printed = bt->state;
462 	}
463 
464 	/* Commands that time out may still (eventually) provide a response.
465 	   This stale response will get in the way of a new response so remove
466 	   it if possible (hopefully during IDLE).  Even if it comes up later
467 	   it will be rejected by its (now-forgotten) seq number. */
468 
469 	if ((bt->state < BT_STATE_WRITE_BYTES) && (status & BT_B2H_ATN)) {
470 		drain_BMC2HOST(bt);
471 		BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY);
472 	}
473 
474 	if ((bt->state != BT_STATE_IDLE) &&
475 	    (bt->state <  BT_STATE_PRINTME)) {		/* check timeout */
476 		bt->timeout -= time;
477 		if ((bt->timeout < 0) && (bt->state < BT_STATE_RESET1))
478 			return error_recovery(bt,
479 					      status,
480 					      IPMI_TIMEOUT_ERR);
481 	}
482 
483 	switch (bt->state) {
484 
485 	/* Idle state first checks for asynchronous messages from another
486 	   channel, then does some opportunistic housekeeping. */
487 
488 	case BT_STATE_IDLE:
489 		if (status & BT_SMS_ATN) {
490 			BT_CONTROL(BT_SMS_ATN);	/* clear it */
491 			return SI_SM_ATTN;
492 		}
493 
494 		if (status & BT_H_BUSY)		/* clear a leftover H_BUSY */
495 			BT_CONTROL(BT_H_BUSY);
496 
497 		/* Read BT capabilities if it hasn't been done yet */
498 		if (!bt->BT_CAP_outreqs)
499 			BT_STATE_CHANGE(BT_STATE_CAPABILITIES_BEGIN,
500 					SI_SM_CALL_WITHOUT_DELAY);
501 		bt->timeout = bt->BT_CAP_req2rsp;
502 		BT_SI_SM_RETURN(SI_SM_IDLE);
503 
504 	case BT_STATE_XACTION_START:
505 		if (status & (BT_B_BUSY | BT_H2B_ATN))
506 			BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY);
507 		if (BT_STATUS & BT_H_BUSY)
508 			BT_CONTROL(BT_H_BUSY);	/* force clear */
509 		BT_STATE_CHANGE(BT_STATE_WRITE_BYTES,
510 				SI_SM_CALL_WITHOUT_DELAY);
511 
512 	case BT_STATE_WRITE_BYTES:
513 		if (status & BT_H_BUSY)
514 			BT_CONTROL(BT_H_BUSY);	/* clear */
515 		BT_CONTROL(BT_CLR_WR_PTR);
516 		write_all_bytes(bt);
517 		BT_CONTROL(BT_H2B_ATN);	/* can clear too fast to catch */
518 		BT_STATE_CHANGE(BT_STATE_WRITE_CONSUME,
519 				SI_SM_CALL_WITHOUT_DELAY);
520 
521 	case BT_STATE_WRITE_CONSUME:
522 		if (status & (BT_B_BUSY | BT_H2B_ATN))
523 			BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY);
524 		BT_STATE_CHANGE(BT_STATE_READ_WAIT,
525 				SI_SM_CALL_WITHOUT_DELAY);
526 
527 	/* Spinning hard can suppress B2H_ATN and force a timeout */
528 
529 	case BT_STATE_READ_WAIT:
530 		if (!(status & BT_B2H_ATN))
531 			BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY);
532 		BT_CONTROL(BT_H_BUSY);		/* set */
533 
534 		/* Uncached, ordered writes should just proceeed serially but
535 		   some BMCs don't clear B2H_ATN with one hit.  Fast-path a
536 		   workaround without too much penalty to the general case. */
537 
538 		BT_CONTROL(BT_B2H_ATN);		/* clear it to ACK the BMC */
539 		BT_STATE_CHANGE(BT_STATE_CLEAR_B2H,
540 				SI_SM_CALL_WITHOUT_DELAY);
541 
542 	case BT_STATE_CLEAR_B2H:
543 		if (status & BT_B2H_ATN) {	/* keep hitting it */
544 			BT_CONTROL(BT_B2H_ATN);
545 			BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY);
546 		}
547 		BT_STATE_CHANGE(BT_STATE_READ_BYTES,
548 				SI_SM_CALL_WITHOUT_DELAY);
549 
550 	case BT_STATE_READ_BYTES:
551 		if (!(status & BT_H_BUSY))	/* check in case of retry */
552 			BT_CONTROL(BT_H_BUSY);
553 		BT_CONTROL(BT_CLR_RD_PTR);	/* start of BMC2HOST buffer */
554 		i = read_all_bytes(bt);		/* true == packet seq match */
555 		BT_CONTROL(BT_H_BUSY);		/* NOW clear */
556 		if (!i) 			/* Not my message */
557 			BT_STATE_CHANGE(BT_STATE_READ_WAIT,
558 					SI_SM_CALL_WITHOUT_DELAY);
559 		bt->state = bt->complete;
560 		return bt->state == BT_STATE_IDLE ?	/* where to next? */
561 			SI_SM_TRANSACTION_COMPLETE :	/* normal */
562 			SI_SM_CALL_WITHOUT_DELAY;	/* Startup magic */
563 
564 	case BT_STATE_LONG_BUSY:	/* For example: after FW update */
565 		if (!(status & BT_B_BUSY)) {
566 			reset_flags(bt);	/* next state is now IDLE */
567 			bt_init_data(bt, bt->io);
568 		}
569 		return SI_SM_CALL_WITH_DELAY;	/* No repeat printing */
570 
571 	case BT_STATE_RESET1:
572 		reset_flags(bt);
573 		drain_BMC2HOST(bt);
574 		BT_STATE_CHANGE(BT_STATE_RESET2,
575 				SI_SM_CALL_WITH_DELAY);
576 
577 	case BT_STATE_RESET2:		/* Send a soft reset */
578 		BT_CONTROL(BT_CLR_WR_PTR);
579 		HOST2BMC(3);		/* number of bytes following */
580 		HOST2BMC(0x18);		/* NetFn/LUN == Application, LUN 0 */
581 		HOST2BMC(42);		/* Sequence number */
582 		HOST2BMC(3);		/* Cmd == Soft reset */
583 		BT_CONTROL(BT_H2B_ATN);
584 		bt->timeout = BT_RESET_DELAY * 1000000;
585 		BT_STATE_CHANGE(BT_STATE_RESET3,
586 				SI_SM_CALL_WITH_DELAY);
587 
588 	case BT_STATE_RESET3:		/* Hold off everything for a bit */
589 		if (bt->timeout > 0)
590 			return SI_SM_CALL_WITH_DELAY;
591 		drain_BMC2HOST(bt);
592 		BT_STATE_CHANGE(BT_STATE_RESTART,
593 				SI_SM_CALL_WITH_DELAY);
594 
595 	case BT_STATE_RESTART:		/* don't reset retries or seq! */
596 		bt->read_count = 0;
597 		bt->nonzero_status = 0;
598 		bt->timeout = bt->BT_CAP_req2rsp;
599 		BT_STATE_CHANGE(BT_STATE_XACTION_START,
600 				SI_SM_CALL_WITH_DELAY);
601 
602 	/* Get BT Capabilities, using timing of upper level state machine.
603 	   Set outreqs to prevent infinite loop on timeout. */
604 	case BT_STATE_CAPABILITIES_BEGIN:
605 		bt->BT_CAP_outreqs = 1;
606 		{
607 			unsigned char GetBT_CAP[] = { 0x18, 0x36 };
608 			bt->state = BT_STATE_IDLE;
609 			bt_start_transaction(bt, GetBT_CAP, sizeof(GetBT_CAP));
610 		}
611 		bt->complete = BT_STATE_CAPABILITIES_END;
612 		BT_STATE_CHANGE(BT_STATE_XACTION_START,
613 				SI_SM_CALL_WITH_DELAY);
614 
615 	case BT_STATE_CAPABILITIES_END:
616 		i = bt_get_result(bt, BT_CAP, sizeof(BT_CAP));
617 		bt_init_data(bt, bt->io);
618 		if ((i == 8) && !BT_CAP[2]) {
619 			bt->BT_CAP_outreqs = BT_CAP[3];
620 			bt->BT_CAP_req2rsp = BT_CAP[6] * 1000000;
621 			bt->BT_CAP_retries = BT_CAP[7];
622 		} else
623 			printk(KERN_WARNING "IPMI BT: using default values\n");
624 		if (!bt->BT_CAP_outreqs)
625 			bt->BT_CAP_outreqs = 1;
626 		printk(KERN_WARNING "IPMI BT: req2rsp=%ld secs retries=%d\n",
627 			bt->BT_CAP_req2rsp / 1000000L, bt->BT_CAP_retries);
628 		bt->timeout = bt->BT_CAP_req2rsp;
629 		return SI_SM_CALL_WITHOUT_DELAY;
630 
631 	default:	/* should never occur */
632 		return error_recovery(bt,
633 				      status,
634 				      IPMI_ERR_UNSPECIFIED);
635 	}
636 	return SI_SM_CALL_WITH_DELAY;
637 }
638 
639 static int bt_detect(struct si_sm_data *bt)
640 {
641 	/* It's impossible for the BT status and interrupt registers to be
642 	   all 1's, (assuming a properly functioning, self-initialized BMC)
643 	   but that's what you get from reading a bogus address, so we
644 	   test that first.  The calling routine uses negative logic. */
645 
646 	if ((BT_STATUS == 0xFF) && (BT_INTMASK_R == 0xFF))
647 		return 1;
648 	reset_flags(bt);
649 	return 0;
650 }
651 
652 static void bt_cleanup(struct si_sm_data *bt)
653 {
654 }
655 
656 static int bt_size(void)
657 {
658 	return sizeof(struct si_sm_data);
659 }
660 
661 struct si_sm_handlers bt_smi_handlers =
662 {
663 	.init_data		= bt_init_data,
664 	.start_transaction	= bt_start_transaction,
665 	.get_result		= bt_get_result,
666 	.event			= bt_event,
667 	.detect			= bt_detect,
668 	.cleanup		= bt_cleanup,
669 	.size			= bt_size,
670 };
671