]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/char/ipmi/ipmi_bt_sm.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh64-2.6
[mv-sheeva.git] / drivers / char / ipmi / ipmi_bt_sm.c
index 7c4a195dfc9a415b7f6d5b77988b07555c7846fc..0030cd8e2e956cb436ae781c854ba41df23058a9 100644 (file)
@@ -165,7 +165,7 @@ static int bt_start_transaction(struct si_sm_data *bt,
 {
        unsigned int i;
 
-       if ((size < 2) || (size > IPMI_MAX_MSG_LENGTH))
+       if ((size < 2) || (size > (IPMI_MAX_MSG_LENGTH - 2)))
               return -1;
 
        if ((bt->state != BT_STATE_IDLE) && (bt->state != BT_STATE_HOSED))
@@ -333,8 +333,7 @@ static void error_recovery(struct si_sm_data *bt, char *reason)
                bt->state = BT_STATE_HOSED;
                if (!bt->nonzero_status)
                        printk(KERN_ERR "IPMI: BT stuck, try power cycle\n");
-               else if (bt->seq == FIRST_SEQ + BT_RETRY_LIMIT) {
-                       /* most likely during insmod */
+               else if (bt->error_retries <= BT_RETRY_LIMIT + 1) {
                        printk(KERN_DEBUG "IPMI: BT reset (takes 5 secs)\n");
                        bt->state = BT_STATE_RESET1;
                }
@@ -475,6 +474,7 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
                break;
 
        case BT_STATE_RESTART:          /* don't reset retries! */
+               reset_flags(bt);
                bt->write_data[2] = ++bt->seq;
                bt->read_count = 0;
                bt->nonzero_status = 0;