| .. | .. |
|---|
| 2089 | 2089 | new_smi->io.io_cleanup = NULL; |
|---|
| 2090 | 2090 | } |
|---|
| 2091 | 2091 | |
|---|
| 2092 | + if (rv && new_smi->si_sm) { |
|---|
| 2093 | + kfree(new_smi->si_sm); |
|---|
| 2094 | + new_smi->si_sm = NULL; |
|---|
| 2095 | + } |
|---|
| 2096 | + |
|---|
| 2092 | 2097 | return rv; |
|---|
| 2093 | 2098 | } |
|---|
| 2094 | 2099 | |
|---|
| .. | .. |
|---|
| 2160 | 2165 | } |
|---|
| 2161 | 2166 | module_init(init_ipmi_si); |
|---|
| 2162 | 2167 | |
|---|
| 2168 | +static void wait_msg_processed(struct smi_info *smi_info) |
|---|
| 2169 | +{ |
|---|
| 2170 | + unsigned long jiffies_now; |
|---|
| 2171 | + long time_diff; |
|---|
| 2172 | + |
|---|
| 2173 | + while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { |
|---|
| 2174 | + jiffies_now = jiffies; |
|---|
| 2175 | + time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies) |
|---|
| 2176 | + * SI_USEC_PER_JIFFY); |
|---|
| 2177 | + smi_event_handler(smi_info, time_diff); |
|---|
| 2178 | + schedule_timeout_uninterruptible(1); |
|---|
| 2179 | + } |
|---|
| 2180 | +} |
|---|
| 2181 | + |
|---|
| 2163 | 2182 | static void shutdown_smi(void *send_info) |
|---|
| 2164 | 2183 | { |
|---|
| 2165 | 2184 | struct smi_info *smi_info = send_info; |
|---|
| .. | .. |
|---|
| 2194 | 2213 | * in the BMC. Note that timers and CPU interrupts are off, |
|---|
| 2195 | 2214 | * so no need for locks. |
|---|
| 2196 | 2215 | */ |
|---|
| 2197 | | - while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { |
|---|
| 2198 | | - poll(smi_info); |
|---|
| 2199 | | - schedule_timeout_uninterruptible(1); |
|---|
| 2200 | | - } |
|---|
| 2216 | + wait_msg_processed(smi_info); |
|---|
| 2217 | + |
|---|
| 2201 | 2218 | if (smi_info->handlers) |
|---|
| 2202 | 2219 | disable_si_irq(smi_info); |
|---|
| 2203 | | - while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { |
|---|
| 2204 | | - poll(smi_info); |
|---|
| 2205 | | - schedule_timeout_uninterruptible(1); |
|---|
| 2206 | | - } |
|---|
| 2220 | + |
|---|
| 2221 | + wait_msg_processed(smi_info); |
|---|
| 2222 | + |
|---|
| 2207 | 2223 | if (smi_info->handlers) |
|---|
| 2208 | 2224 | smi_info->handlers->cleanup(smi_info->si_sm); |
|---|
| 2209 | 2225 | |
|---|