diff options
Diffstat (limited to 'drivers/char/ipmi/ipmi_si_intf.c')
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 479 |
1 files changed, 283 insertions, 196 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 4462b113ba3f..35603dd4e6c5 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -107,6 +107,14 @@ enum si_type { | |||
107 | }; | 107 | }; |
108 | static char *si_to_str[] = { "kcs", "smic", "bt" }; | 108 | static char *si_to_str[] = { "kcs", "smic", "bt" }; |
109 | 109 | ||
110 | enum ipmi_addr_src { | ||
111 | SI_INVALID = 0, SI_HOTMOD, SI_HARDCODED, SI_SPMI, SI_ACPI, SI_SMBIOS, | ||
112 | SI_PCI, SI_DEVICETREE, SI_DEFAULT | ||
113 | }; | ||
114 | static char *ipmi_addr_src_to_str[] = { NULL, "hotmod", "hardcoded", "SPMI", | ||
115 | "ACPI", "SMBIOS", "PCI", | ||
116 | "device-tree", "default" }; | ||
117 | |||
110 | #define DEVICE_NAME "ipmi_si" | 118 | #define DEVICE_NAME "ipmi_si" |
111 | 119 | ||
112 | static struct platform_driver ipmi_driver = { | 120 | static struct platform_driver ipmi_driver = { |
@@ -188,7 +196,7 @@ struct smi_info { | |||
188 | int (*irq_setup)(struct smi_info *info); | 196 | int (*irq_setup)(struct smi_info *info); |
189 | void (*irq_cleanup)(struct smi_info *info); | 197 | void (*irq_cleanup)(struct smi_info *info); |
190 | unsigned int io_size; | 198 | unsigned int io_size; |
191 | char *addr_source; /* ACPI, PCI, SMBIOS, hardcode, default. */ | 199 | enum ipmi_addr_src addr_source; /* ACPI, PCI, SMBIOS, hardcode, etc. */ |
192 | void (*addr_source_cleanup)(struct smi_info *info); | 200 | void (*addr_source_cleanup)(struct smi_info *info); |
193 | void *addr_source_data; | 201 | void *addr_source_data; |
194 | 202 | ||
@@ -300,6 +308,7 @@ static int num_max_busy_us; | |||
300 | 308 | ||
301 | static int unload_when_empty = 1; | 309 | static int unload_when_empty = 1; |
302 | 310 | ||
311 | static int add_smi(struct smi_info *smi); | ||
303 | static int try_smi_init(struct smi_info *smi); | 312 | static int try_smi_init(struct smi_info *smi); |
304 | static void cleanup_one_si(struct smi_info *to_clean); | 313 | static void cleanup_one_si(struct smi_info *to_clean); |
305 | 314 | ||
@@ -314,9 +323,14 @@ static void deliver_recv_msg(struct smi_info *smi_info, | |||
314 | { | 323 | { |
315 | /* Deliver the message to the upper layer with the lock | 324 | /* Deliver the message to the upper layer with the lock |
316 | released. */ | 325 | released. */ |
317 | spin_unlock(&(smi_info->si_lock)); | 326 | |
318 | ipmi_smi_msg_received(smi_info->intf, msg); | 327 | if (smi_info->run_to_completion) { |
319 | spin_lock(&(smi_info->si_lock)); | 328 | ipmi_smi_msg_received(smi_info->intf, msg); |
329 | } else { | ||
330 | spin_unlock(&(smi_info->si_lock)); | ||
331 | ipmi_smi_msg_received(smi_info->intf, msg); | ||
332 | spin_lock(&(smi_info->si_lock)); | ||
333 | } | ||
320 | } | 334 | } |
321 | 335 | ||
322 | static void return_hosed_msg(struct smi_info *smi_info, int cCode) | 336 | static void return_hosed_msg(struct smi_info *smi_info, int cCode) |
@@ -445,6 +459,9 @@ static inline void disable_si_irq(struct smi_info *smi_info) | |||
445 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { | 459 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { |
446 | start_disable_irq(smi_info); | 460 | start_disable_irq(smi_info); |
447 | smi_info->interrupt_disabled = 1; | 461 | smi_info->interrupt_disabled = 1; |
462 | if (!atomic_read(&smi_info->stop_operation)) | ||
463 | mod_timer(&smi_info->si_timer, | ||
464 | jiffies + SI_TIMEOUT_JIFFIES); | ||
448 | } | 465 | } |
449 | } | 466 | } |
450 | 467 | ||
@@ -576,9 +593,8 @@ static void handle_transaction_done(struct smi_info *smi_info) | |||
576 | smi_info->handlers->get_result(smi_info->si_sm, msg, 3); | 593 | smi_info->handlers->get_result(smi_info->si_sm, msg, 3); |
577 | if (msg[2] != 0) { | 594 | if (msg[2] != 0) { |
578 | /* Error clearing flags */ | 595 | /* Error clearing flags */ |
579 | printk(KERN_WARNING | 596 | dev_warn(smi_info->dev, |
580 | "ipmi_si: Error clearing flags: %2.2x\n", | 597 | "Error clearing flags: %2.2x\n", msg[2]); |
581 | msg[2]); | ||
582 | } | 598 | } |
583 | if (smi_info->si_state == SI_CLEARING_FLAGS_THEN_SET_IRQ) | 599 | if (smi_info->si_state == SI_CLEARING_FLAGS_THEN_SET_IRQ) |
584 | start_enable_irq(smi_info); | 600 | start_enable_irq(smi_info); |
@@ -670,9 +686,8 @@ static void handle_transaction_done(struct smi_info *smi_info) | |||
670 | /* We got the flags from the SMI, now handle them. */ | 686 | /* We got the flags from the SMI, now handle them. */ |
671 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); | 687 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); |
672 | if (msg[2] != 0) { | 688 | if (msg[2] != 0) { |
673 | printk(KERN_WARNING | 689 | dev_warn(smi_info->dev, "Could not enable interrupts" |
674 | "ipmi_si: Could not enable interrupts" | 690 | ", failed get, using polled mode.\n"); |
675 | ", failed get, using polled mode.\n"); | ||
676 | smi_info->si_state = SI_NORMAL; | 691 | smi_info->si_state = SI_NORMAL; |
677 | } else { | 692 | } else { |
678 | msg[0] = (IPMI_NETFN_APP_REQUEST << 2); | 693 | msg[0] = (IPMI_NETFN_APP_REQUEST << 2); |
@@ -693,11 +708,11 @@ static void handle_transaction_done(struct smi_info *smi_info) | |||
693 | 708 | ||
694 | /* We got the flags from the SMI, now handle them. */ | 709 | /* We got the flags from the SMI, now handle them. */ |
695 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); | 710 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); |
696 | if (msg[2] != 0) { | 711 | if (msg[2] != 0) |
697 | printk(KERN_WARNING | 712 | dev_warn(smi_info->dev, "Could not enable interrupts" |
698 | "ipmi_si: Could not enable interrupts" | 713 | ", failed set, using polled mode.\n"); |
699 | ", failed set, using polled mode.\n"); | 714 | else |
700 | } | 715 | smi_info->interrupt_disabled = 0; |
701 | smi_info->si_state = SI_NORMAL; | 716 | smi_info->si_state = SI_NORMAL; |
702 | break; | 717 | break; |
703 | } | 718 | } |
@@ -709,9 +724,8 @@ static void handle_transaction_done(struct smi_info *smi_info) | |||
709 | /* We got the flags from the SMI, now handle them. */ | 724 | /* We got the flags from the SMI, now handle them. */ |
710 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); | 725 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); |
711 | if (msg[2] != 0) { | 726 | if (msg[2] != 0) { |
712 | printk(KERN_WARNING | 727 | dev_warn(smi_info->dev, "Could not disable interrupts" |
713 | "ipmi_si: Could not disable interrupts" | 728 | ", failed get.\n"); |
714 | ", failed get.\n"); | ||
715 | smi_info->si_state = SI_NORMAL; | 729 | smi_info->si_state = SI_NORMAL; |
716 | } else { | 730 | } else { |
717 | msg[0] = (IPMI_NETFN_APP_REQUEST << 2); | 731 | msg[0] = (IPMI_NETFN_APP_REQUEST << 2); |
@@ -733,9 +747,8 @@ static void handle_transaction_done(struct smi_info *smi_info) | |||
733 | /* We got the flags from the SMI, now handle them. */ | 747 | /* We got the flags from the SMI, now handle them. */ |
734 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); | 748 | smi_info->handlers->get_result(smi_info->si_sm, msg, 4); |
735 | if (msg[2] != 0) { | 749 | if (msg[2] != 0) { |
736 | printk(KERN_WARNING | 750 | dev_warn(smi_info->dev, "Could not disable interrupts" |
737 | "ipmi_si: Could not disable interrupts" | 751 | ", failed set.\n"); |
738 | ", failed set.\n"); | ||
739 | } | 752 | } |
740 | smi_info->si_state = SI_NORMAL; | 753 | smi_info->si_state = SI_NORMAL; |
741 | break; | 754 | break; |
@@ -877,6 +890,11 @@ static void sender(void *send_info, | |||
877 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); | 890 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); |
878 | #endif | 891 | #endif |
879 | 892 | ||
893 | mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); | ||
894 | |||
895 | if (smi_info->thread) | ||
896 | wake_up_process(smi_info->thread); | ||
897 | |||
880 | if (smi_info->run_to_completion) { | 898 | if (smi_info->run_to_completion) { |
881 | /* | 899 | /* |
882 | * If we are running to completion, then throw it in | 900 | * If we are running to completion, then throw it in |
@@ -997,6 +1015,8 @@ static int ipmi_thread(void *data) | |||
997 | ; /* do nothing */ | 1015 | ; /* do nothing */ |
998 | else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait) | 1016 | else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait) |
999 | schedule(); | 1017 | schedule(); |
1018 | else if (smi_result == SI_SM_IDLE) | ||
1019 | schedule_timeout_interruptible(100); | ||
1000 | else | 1020 | else |
1001 | schedule_timeout_interruptible(0); | 1021 | schedule_timeout_interruptible(0); |
1002 | } | 1022 | } |
@@ -1039,6 +1059,7 @@ static void smi_timeout(unsigned long data) | |||
1039 | unsigned long flags; | 1059 | unsigned long flags; |
1040 | unsigned long jiffies_now; | 1060 | unsigned long jiffies_now; |
1041 | long time_diff; | 1061 | long time_diff; |
1062 | long timeout; | ||
1042 | #ifdef DEBUG_TIMING | 1063 | #ifdef DEBUG_TIMING |
1043 | struct timeval t; | 1064 | struct timeval t; |
1044 | #endif | 1065 | #endif |
@@ -1059,9 +1080,9 @@ static void smi_timeout(unsigned long data) | |||
1059 | 1080 | ||
1060 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { | 1081 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { |
1061 | /* Running with interrupts, only do long timeouts. */ | 1082 | /* Running with interrupts, only do long timeouts. */ |
1062 | smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; | 1083 | timeout = jiffies + SI_TIMEOUT_JIFFIES; |
1063 | smi_inc_stat(smi_info, long_timeouts); | 1084 | smi_inc_stat(smi_info, long_timeouts); |
1064 | goto do_add_timer; | 1085 | goto do_mod_timer; |
1065 | } | 1086 | } |
1066 | 1087 | ||
1067 | /* | 1088 | /* |
@@ -1070,14 +1091,15 @@ static void smi_timeout(unsigned long data) | |||
1070 | */ | 1091 | */ |
1071 | if (smi_result == SI_SM_CALL_WITH_DELAY) { | 1092 | if (smi_result == SI_SM_CALL_WITH_DELAY) { |
1072 | smi_inc_stat(smi_info, short_timeouts); | 1093 | smi_inc_stat(smi_info, short_timeouts); |
1073 | smi_info->si_timer.expires = jiffies + 1; | 1094 | timeout = jiffies + 1; |
1074 | } else { | 1095 | } else { |
1075 | smi_inc_stat(smi_info, long_timeouts); | 1096 | smi_inc_stat(smi_info, long_timeouts); |
1076 | smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; | 1097 | timeout = jiffies + SI_TIMEOUT_JIFFIES; |
1077 | } | 1098 | } |
1078 | 1099 | ||
1079 | do_add_timer: | 1100 | do_mod_timer: |
1080 | add_timer(&(smi_info->si_timer)); | 1101 | if (smi_result != SI_SM_IDLE) |
1102 | mod_timer(&(smi_info->si_timer), timeout); | ||
1081 | } | 1103 | } |
1082 | 1104 | ||
1083 | static irqreturn_t si_irq_handler(int irq, void *data) | 1105 | static irqreturn_t si_irq_handler(int irq, void *data) |
@@ -1144,10 +1166,10 @@ static int smi_start_processing(void *send_info, | |||
1144 | new_smi->thread = kthread_run(ipmi_thread, new_smi, | 1166 | new_smi->thread = kthread_run(ipmi_thread, new_smi, |
1145 | "kipmi%d", new_smi->intf_num); | 1167 | "kipmi%d", new_smi->intf_num); |
1146 | if (IS_ERR(new_smi->thread)) { | 1168 | if (IS_ERR(new_smi->thread)) { |
1147 | printk(KERN_NOTICE "ipmi_si_intf: Could not start" | 1169 | dev_notice(new_smi->dev, "Could not start" |
1148 | " kernel thread due to error %ld, only using" | 1170 | " kernel thread due to error %ld, only using" |
1149 | " timers to drive the interface\n", | 1171 | " timers to drive the interface\n", |
1150 | PTR_ERR(new_smi->thread)); | 1172 | PTR_ERR(new_smi->thread)); |
1151 | new_smi->thread = NULL; | 1173 | new_smi->thread = NULL; |
1152 | } | 1174 | } |
1153 | } | 1175 | } |
@@ -1308,14 +1330,13 @@ static int std_irq_setup(struct smi_info *info) | |||
1308 | DEVICE_NAME, | 1330 | DEVICE_NAME, |
1309 | info); | 1331 | info); |
1310 | if (rv) { | 1332 | if (rv) { |
1311 | printk(KERN_WARNING | 1333 | dev_warn(info->dev, "%s unable to claim interrupt %d," |
1312 | "ipmi_si: %s unable to claim interrupt %d," | 1334 | " running polled\n", |
1313 | " running polled\n", | 1335 | DEVICE_NAME, info->irq); |
1314 | DEVICE_NAME, info->irq); | ||
1315 | info->irq = 0; | 1336 | info->irq = 0; |
1316 | } else { | 1337 | } else { |
1317 | info->irq_cleanup = std_irq_cleanup; | 1338 | info->irq_cleanup = std_irq_cleanup; |
1318 | printk(" Using irq %d\n", info->irq); | 1339 | dev_info(info->dev, "Using irq %d\n", info->irq); |
1319 | } | 1340 | } |
1320 | 1341 | ||
1321 | return rv; | 1342 | return rv; |
@@ -1406,8 +1427,8 @@ static int port_setup(struct smi_info *info) | |||
1406 | info->io.outputb = port_outl; | 1427 | info->io.outputb = port_outl; |
1407 | break; | 1428 | break; |
1408 | default: | 1429 | default: |
1409 | printk(KERN_WARNING "ipmi_si: Invalid register size: %d\n", | 1430 | dev_warn(info->dev, "Invalid register size: %d\n", |
1410 | info->io.regsize); | 1431 | info->io.regsize); |
1411 | return -EINVAL; | 1432 | return -EINVAL; |
1412 | } | 1433 | } |
1413 | 1434 | ||
@@ -1529,8 +1550,8 @@ static int mem_setup(struct smi_info *info) | |||
1529 | break; | 1550 | break; |
1530 | #endif | 1551 | #endif |
1531 | default: | 1552 | default: |
1532 | printk(KERN_WARNING "ipmi_si: Invalid register size: %d\n", | 1553 | dev_warn(info->dev, "Invalid register size: %d\n", |
1533 | info->io.regsize); | 1554 | info->io.regsize); |
1534 | return -EINVAL; | 1555 | return -EINVAL; |
1535 | } | 1556 | } |
1536 | 1557 | ||
@@ -1755,7 +1776,7 @@ static int hotmod_handler(const char *val, struct kernel_param *kp) | |||
1755 | goto out; | 1776 | goto out; |
1756 | } | 1777 | } |
1757 | 1778 | ||
1758 | info->addr_source = "hotmod"; | 1779 | info->addr_source = SI_HOTMOD; |
1759 | info->si_type = si_type; | 1780 | info->si_type = si_type; |
1760 | info->io.addr_data = addr; | 1781 | info->io.addr_data = addr; |
1761 | info->io.addr_type = addr_space; | 1782 | info->io.addr_type = addr_space; |
@@ -1777,7 +1798,9 @@ static int hotmod_handler(const char *val, struct kernel_param *kp) | |||
1777 | info->irq_setup = std_irq_setup; | 1798 | info->irq_setup = std_irq_setup; |
1778 | info->slave_addr = ipmb; | 1799 | info->slave_addr = ipmb; |
1779 | 1800 | ||
1780 | try_smi_init(info); | 1801 | if (!add_smi(info)) |
1802 | if (try_smi_init(info)) | ||
1803 | cleanup_one_si(info); | ||
1781 | } else { | 1804 | } else { |
1782 | /* remove */ | 1805 | /* remove */ |
1783 | struct smi_info *e, *tmp_e; | 1806 | struct smi_info *e, *tmp_e; |
@@ -1813,7 +1836,8 @@ static __devinit void hardcode_find_bmc(void) | |||
1813 | if (!info) | 1836 | if (!info) |
1814 | return; | 1837 | return; |
1815 | 1838 | ||
1816 | info->addr_source = "hardcoded"; | 1839 | info->addr_source = SI_HARDCODED; |
1840 | printk(KERN_INFO PFX "probing via hardcoded address\n"); | ||
1817 | 1841 | ||
1818 | if (!si_type[i] || strcmp(si_type[i], "kcs") == 0) { | 1842 | if (!si_type[i] || strcmp(si_type[i], "kcs") == 0) { |
1819 | info->si_type = SI_KCS; | 1843 | info->si_type = SI_KCS; |
@@ -1822,8 +1846,7 @@ static __devinit void hardcode_find_bmc(void) | |||
1822 | } else if (strcmp(si_type[i], "bt") == 0) { | 1846 | } else if (strcmp(si_type[i], "bt") == 0) { |
1823 | info->si_type = SI_BT; | 1847 | info->si_type = SI_BT; |
1824 | } else { | 1848 | } else { |
1825 | printk(KERN_WARNING | 1849 | printk(KERN_WARNING PFX "Interface type specified " |
1826 | "ipmi_si: Interface type specified " | ||
1827 | "for interface %d, was invalid: %s\n", | 1850 | "for interface %d, was invalid: %s\n", |
1828 | i, si_type[i]); | 1851 | i, si_type[i]); |
1829 | kfree(info); | 1852 | kfree(info); |
@@ -1841,11 +1864,9 @@ static __devinit void hardcode_find_bmc(void) | |||
1841 | info->io.addr_data = addrs[i]; | 1864 | info->io.addr_data = addrs[i]; |
1842 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; | 1865 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; |
1843 | } else { | 1866 | } else { |
1844 | printk(KERN_WARNING | 1867 | printk(KERN_WARNING PFX "Interface type specified " |
1845 | "ipmi_si: Interface type specified " | 1868 | "for interface %d, but port and address were " |
1846 | "for interface %d, " | 1869 | "not set or set to zero.\n", i); |
1847 | "but port and address were not set or " | ||
1848 | "set to zero.\n", i); | ||
1849 | kfree(info); | 1870 | kfree(info); |
1850 | continue; | 1871 | continue; |
1851 | } | 1872 | } |
@@ -1863,7 +1884,9 @@ static __devinit void hardcode_find_bmc(void) | |||
1863 | info->irq_setup = std_irq_setup; | 1884 | info->irq_setup = std_irq_setup; |
1864 | info->slave_addr = slave_addrs[i]; | 1885 | info->slave_addr = slave_addrs[i]; |
1865 | 1886 | ||
1866 | try_smi_init(info); | 1887 | if (!add_smi(info)) |
1888 | if (try_smi_init(info)) | ||
1889 | cleanup_one_si(info); | ||
1867 | } | 1890 | } |
1868 | } | 1891 | } |
1869 | 1892 | ||
@@ -1923,15 +1946,13 @@ static int acpi_gpe_irq_setup(struct smi_info *info) | |||
1923 | &ipmi_acpi_gpe, | 1946 | &ipmi_acpi_gpe, |
1924 | info); | 1947 | info); |
1925 | if (status != AE_OK) { | 1948 | if (status != AE_OK) { |
1926 | printk(KERN_WARNING | 1949 | dev_warn(info->dev, "%s unable to claim ACPI GPE %d," |
1927 | "ipmi_si: %s unable to claim ACPI GPE %d," | 1950 | " running polled\n", DEVICE_NAME, info->irq); |
1928 | " running polled\n", | ||
1929 | DEVICE_NAME, info->irq); | ||
1930 | info->irq = 0; | 1951 | info->irq = 0; |
1931 | return -EINVAL; | 1952 | return -EINVAL; |
1932 | } else { | 1953 | } else { |
1933 | info->irq_cleanup = acpi_gpe_irq_cleanup; | 1954 | info->irq_cleanup = acpi_gpe_irq_cleanup; |
1934 | printk(" Using ACPI GPE %d\n", info->irq); | 1955 | dev_info(info->dev, "Using ACPI GPE %d\n", info->irq); |
1935 | return 0; | 1956 | return 0; |
1936 | } | 1957 | } |
1937 | } | 1958 | } |
@@ -1989,8 +2010,8 @@ static __devinit int try_init_spmi(struct SPMITable *spmi) | |||
1989 | u8 addr_space; | 2010 | u8 addr_space; |
1990 | 2011 | ||
1991 | if (spmi->IPMIlegacy != 1) { | 2012 | if (spmi->IPMIlegacy != 1) { |
1992 | printk(KERN_INFO "IPMI: Bad SPMI legacy %d\n", spmi->IPMIlegacy); | 2013 | printk(KERN_INFO PFX "Bad SPMI legacy %d\n", spmi->IPMIlegacy); |
1993 | return -ENODEV; | 2014 | return -ENODEV; |
1994 | } | 2015 | } |
1995 | 2016 | ||
1996 | if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) | 2017 | if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) |
@@ -2000,11 +2021,12 @@ static __devinit int try_init_spmi(struct SPMITable *spmi) | |||
2000 | 2021 | ||
2001 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 2022 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
2002 | if (!info) { | 2023 | if (!info) { |
2003 | printk(KERN_ERR "ipmi_si: Could not allocate SI data (3)\n"); | 2024 | printk(KERN_ERR PFX "Could not allocate SI data (3)\n"); |
2004 | return -ENOMEM; | 2025 | return -ENOMEM; |
2005 | } | 2026 | } |
2006 | 2027 | ||
2007 | info->addr_source = "SPMI"; | 2028 | info->addr_source = SI_SPMI; |
2029 | printk(KERN_INFO PFX "probing via SPMI\n"); | ||
2008 | 2030 | ||
2009 | /* Figure out the interface type. */ | 2031 | /* Figure out the interface type. */ |
2010 | switch (spmi->InterfaceType) { | 2032 | switch (spmi->InterfaceType) { |
@@ -2018,8 +2040,8 @@ static __devinit int try_init_spmi(struct SPMITable *spmi) | |||
2018 | info->si_type = SI_BT; | 2040 | info->si_type = SI_BT; |
2019 | break; | 2041 | break; |
2020 | default: | 2042 | default: |
2021 | printk(KERN_INFO "ipmi_si: Unknown ACPI/SPMI SI type %d\n", | 2043 | printk(KERN_INFO PFX "Unknown ACPI/SPMI SI type %d\n", |
2022 | spmi->InterfaceType); | 2044 | spmi->InterfaceType); |
2023 | kfree(info); | 2045 | kfree(info); |
2024 | return -EIO; | 2046 | return -EIO; |
2025 | } | 2047 | } |
@@ -2055,13 +2077,12 @@ static __devinit int try_init_spmi(struct SPMITable *spmi) | |||
2055 | info->io.addr_type = IPMI_IO_ADDR_SPACE; | 2077 | info->io.addr_type = IPMI_IO_ADDR_SPACE; |
2056 | } else { | 2078 | } else { |
2057 | kfree(info); | 2079 | kfree(info); |
2058 | printk(KERN_WARNING | 2080 | printk(KERN_WARNING PFX "Unknown ACPI I/O Address type\n"); |
2059 | "ipmi_si: Unknown ACPI I/O Address type\n"); | ||
2060 | return -EIO; | 2081 | return -EIO; |
2061 | } | 2082 | } |
2062 | info->io.addr_data = spmi->addr.address; | 2083 | info->io.addr_data = spmi->addr.address; |
2063 | 2084 | ||
2064 | try_smi_init(info); | 2085 | add_smi(info); |
2065 | 2086 | ||
2066 | return 0; | 2087 | return 0; |
2067 | } | 2088 | } |
@@ -2093,6 +2114,7 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
2093 | { | 2114 | { |
2094 | struct acpi_device *acpi_dev; | 2115 | struct acpi_device *acpi_dev; |
2095 | struct smi_info *info; | 2116 | struct smi_info *info; |
2117 | struct resource *res; | ||
2096 | acpi_handle handle; | 2118 | acpi_handle handle; |
2097 | acpi_status status; | 2119 | acpi_status status; |
2098 | unsigned long long tmp; | 2120 | unsigned long long tmp; |
@@ -2105,7 +2127,8 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
2105 | if (!info) | 2127 | if (!info) |
2106 | return -ENOMEM; | 2128 | return -ENOMEM; |
2107 | 2129 | ||
2108 | info->addr_source = "ACPI"; | 2130 | info->addr_source = SI_ACPI; |
2131 | printk(KERN_INFO PFX "probing via ACPI\n"); | ||
2109 | 2132 | ||
2110 | handle = acpi_dev->handle; | 2133 | handle = acpi_dev->handle; |
2111 | 2134 | ||
@@ -2125,22 +2148,26 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
2125 | info->si_type = SI_BT; | 2148 | info->si_type = SI_BT; |
2126 | break; | 2149 | break; |
2127 | default: | 2150 | default: |
2128 | dev_info(&dev->dev, "unknown interface type %lld\n", tmp); | 2151 | dev_info(&dev->dev, "unknown IPMI type %lld\n", tmp); |
2129 | goto err_free; | 2152 | goto err_free; |
2130 | } | 2153 | } |
2131 | 2154 | ||
2132 | if (pnp_port_valid(dev, 0)) { | 2155 | res = pnp_get_resource(dev, IORESOURCE_IO, 0); |
2156 | if (res) { | ||
2133 | info->io_setup = port_setup; | 2157 | info->io_setup = port_setup; |
2134 | info->io.addr_type = IPMI_IO_ADDR_SPACE; | 2158 | info->io.addr_type = IPMI_IO_ADDR_SPACE; |
2135 | info->io.addr_data = pnp_port_start(dev, 0); | ||
2136 | } else if (pnp_mem_valid(dev, 0)) { | ||
2137 | info->io_setup = mem_setup; | ||
2138 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; | ||
2139 | info->io.addr_data = pnp_mem_start(dev, 0); | ||
2140 | } else { | 2159 | } else { |
2160 | res = pnp_get_resource(dev, IORESOURCE_MEM, 0); | ||
2161 | if (res) { | ||
2162 | info->io_setup = mem_setup; | ||
2163 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; | ||
2164 | } | ||
2165 | } | ||
2166 | if (!res) { | ||
2141 | dev_err(&dev->dev, "no I/O or memory address\n"); | 2167 | dev_err(&dev->dev, "no I/O or memory address\n"); |
2142 | goto err_free; | 2168 | goto err_free; |
2143 | } | 2169 | } |
2170 | info->io.addr_data = res->start; | ||
2144 | 2171 | ||
2145 | info->io.regspacing = DEFAULT_REGSPACING; | 2172 | info->io.regspacing = DEFAULT_REGSPACING; |
2146 | info->io.regsize = DEFAULT_REGSPACING; | 2173 | info->io.regsize = DEFAULT_REGSPACING; |
@@ -2156,10 +2183,14 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
2156 | info->irq_setup = std_irq_setup; | 2183 | info->irq_setup = std_irq_setup; |
2157 | } | 2184 | } |
2158 | 2185 | ||
2159 | info->dev = &acpi_dev->dev; | 2186 | info->dev = &dev->dev; |
2160 | pnp_set_drvdata(dev, info); | 2187 | pnp_set_drvdata(dev, info); |
2161 | 2188 | ||
2162 | return try_smi_init(info); | 2189 | dev_info(info->dev, "%pR regsize %d spacing %d irq %d\n", |
2190 | res, info->io.regsize, info->io.regspacing, | ||
2191 | info->irq); | ||
2192 | |||
2193 | return add_smi(info); | ||
2163 | 2194 | ||
2164 | err_free: | 2195 | err_free: |
2165 | kfree(info); | 2196 | kfree(info); |
@@ -2264,12 +2295,12 @@ static __devinit void try_init_dmi(struct dmi_ipmi_data *ipmi_data) | |||
2264 | 2295 | ||
2265 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 2296 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
2266 | if (!info) { | 2297 | if (!info) { |
2267 | printk(KERN_ERR | 2298 | printk(KERN_ERR PFX "Could not allocate SI data\n"); |
2268 | "ipmi_si: Could not allocate SI data\n"); | ||
2269 | return; | 2299 | return; |
2270 | } | 2300 | } |
2271 | 2301 | ||
2272 | info->addr_source = "SMBIOS"; | 2302 | info->addr_source = SI_SMBIOS; |
2303 | printk(KERN_INFO PFX "probing via SMBIOS\n"); | ||
2273 | 2304 | ||
2274 | switch (ipmi_data->type) { | 2305 | switch (ipmi_data->type) { |
2275 | case 0x01: /* KCS */ | 2306 | case 0x01: /* KCS */ |
@@ -2299,8 +2330,7 @@ static __devinit void try_init_dmi(struct dmi_ipmi_data *ipmi_data) | |||
2299 | 2330 | ||
2300 | default: | 2331 | default: |
2301 | kfree(info); | 2332 | kfree(info); |
2302 | printk(KERN_WARNING | 2333 | printk(KERN_WARNING PFX "Unknown SMBIOS I/O Address type: %d\n", |
2303 | "ipmi_si: Unknown SMBIOS I/O Address type: %d.\n", | ||
2304 | ipmi_data->addr_space); | 2334 | ipmi_data->addr_space); |
2305 | return; | 2335 | return; |
2306 | } | 2336 | } |
@@ -2318,7 +2348,7 @@ static __devinit void try_init_dmi(struct dmi_ipmi_data *ipmi_data) | |||
2318 | if (info->irq) | 2348 | if (info->irq) |
2319 | info->irq_setup = std_irq_setup; | 2349 | info->irq_setup = std_irq_setup; |
2320 | 2350 | ||
2321 | try_smi_init(info); | 2351 | add_smi(info); |
2322 | } | 2352 | } |
2323 | 2353 | ||
2324 | static void __devinit dmi_find_bmc(void) | 2354 | static void __devinit dmi_find_bmc(void) |
@@ -2368,7 +2398,8 @@ static int __devinit ipmi_pci_probe(struct pci_dev *pdev, | |||
2368 | if (!info) | 2398 | if (!info) |
2369 | return -ENOMEM; | 2399 | return -ENOMEM; |
2370 | 2400 | ||
2371 | info->addr_source = "PCI"; | 2401 | info->addr_source = SI_PCI; |
2402 | dev_info(&pdev->dev, "probing via PCI"); | ||
2372 | 2403 | ||
2373 | switch (class_type) { | 2404 | switch (class_type) { |
2374 | case PCI_ERMC_CLASSCODE_TYPE_SMIC: | 2405 | case PCI_ERMC_CLASSCODE_TYPE_SMIC: |
@@ -2385,15 +2416,13 @@ static int __devinit ipmi_pci_probe(struct pci_dev *pdev, | |||
2385 | 2416 | ||
2386 | default: | 2417 | default: |
2387 | kfree(info); | 2418 | kfree(info); |
2388 | printk(KERN_INFO "ipmi_si: %s: Unknown IPMI type: %d\n", | 2419 | dev_info(&pdev->dev, "Unknown IPMI type: %d\n", class_type); |
2389 | pci_name(pdev), class_type); | ||
2390 | return -ENOMEM; | 2420 | return -ENOMEM; |
2391 | } | 2421 | } |
2392 | 2422 | ||
2393 | rv = pci_enable_device(pdev); | 2423 | rv = pci_enable_device(pdev); |
2394 | if (rv) { | 2424 | if (rv) { |
2395 | printk(KERN_ERR "ipmi_si: %s: couldn't enable PCI device\n", | 2425 | dev_err(&pdev->dev, "couldn't enable PCI device\n"); |
2396 | pci_name(pdev)); | ||
2397 | kfree(info); | 2426 | kfree(info); |
2398 | return rv; | 2427 | return rv; |
2399 | } | 2428 | } |
@@ -2421,7 +2450,11 @@ static int __devinit ipmi_pci_probe(struct pci_dev *pdev, | |||
2421 | info->dev = &pdev->dev; | 2450 | info->dev = &pdev->dev; |
2422 | pci_set_drvdata(pdev, info); | 2451 | pci_set_drvdata(pdev, info); |
2423 | 2452 | ||
2424 | return try_smi_init(info); | 2453 | dev_info(&pdev->dev, "%pR regsize %d spacing %d irq %d\n", |
2454 | &pdev->resource[0], info->io.regsize, info->io.regspacing, | ||
2455 | info->irq); | ||
2456 | |||
2457 | return add_smi(info); | ||
2425 | } | 2458 | } |
2426 | 2459 | ||
2427 | static void __devexit ipmi_pci_remove(struct pci_dev *pdev) | 2460 | static void __devexit ipmi_pci_remove(struct pci_dev *pdev) |
@@ -2469,11 +2502,11 @@ static int __devinit ipmi_of_probe(struct of_device *dev, | |||
2469 | struct smi_info *info; | 2502 | struct smi_info *info; |
2470 | struct resource resource; | 2503 | struct resource resource; |
2471 | const int *regsize, *regspacing, *regshift; | 2504 | const int *regsize, *regspacing, *regshift; |
2472 | struct device_node *np = dev->node; | 2505 | struct device_node *np = dev->dev.of_node; |
2473 | int ret; | 2506 | int ret; |
2474 | int proplen; | 2507 | int proplen; |
2475 | 2508 | ||
2476 | dev_info(&dev->dev, PFX "probing via device tree\n"); | 2509 | dev_info(&dev->dev, "probing via device tree\n"); |
2477 | 2510 | ||
2478 | ret = of_address_to_resource(np, 0, &resource); | 2511 | ret = of_address_to_resource(np, 0, &resource); |
2479 | if (ret) { | 2512 | if (ret) { |
@@ -2503,12 +2536,12 @@ static int __devinit ipmi_of_probe(struct of_device *dev, | |||
2503 | 2536 | ||
2504 | if (!info) { | 2537 | if (!info) { |
2505 | dev_err(&dev->dev, | 2538 | dev_err(&dev->dev, |
2506 | PFX "could not allocate memory for OF probe\n"); | 2539 | "could not allocate memory for OF probe\n"); |
2507 | return -ENOMEM; | 2540 | return -ENOMEM; |
2508 | } | 2541 | } |
2509 | 2542 | ||
2510 | info->si_type = (enum si_type) match->data; | 2543 | info->si_type = (enum si_type) match->data; |
2511 | info->addr_source = "device-tree"; | 2544 | info->addr_source = SI_DEVICETREE; |
2512 | info->irq_setup = std_irq_setup; | 2545 | info->irq_setup = std_irq_setup; |
2513 | 2546 | ||
2514 | if (resource.flags & IORESOURCE_IO) { | 2547 | if (resource.flags & IORESOURCE_IO) { |
@@ -2525,16 +2558,16 @@ static int __devinit ipmi_of_probe(struct of_device *dev, | |||
2525 | info->io.regspacing = regspacing ? *regspacing : DEFAULT_REGSPACING; | 2558 | info->io.regspacing = regspacing ? *regspacing : DEFAULT_REGSPACING; |
2526 | info->io.regshift = regshift ? *regshift : 0; | 2559 | info->io.regshift = regshift ? *regshift : 0; |
2527 | 2560 | ||
2528 | info->irq = irq_of_parse_and_map(dev->node, 0); | 2561 | info->irq = irq_of_parse_and_map(dev->dev.of_node, 0); |
2529 | info->dev = &dev->dev; | 2562 | info->dev = &dev->dev; |
2530 | 2563 | ||
2531 | dev_dbg(&dev->dev, "addr 0x%lx regsize %d spacing %d irq %x\n", | 2564 | dev_dbg(&dev->dev, "addr 0x%lx regsize %d spacing %d irq %d\n", |
2532 | info->io.addr_data, info->io.regsize, info->io.regspacing, | 2565 | info->io.addr_data, info->io.regsize, info->io.regspacing, |
2533 | info->irq); | 2566 | info->irq); |
2534 | 2567 | ||
2535 | dev_set_drvdata(&dev->dev, info); | 2568 | dev_set_drvdata(&dev->dev, info); |
2536 | 2569 | ||
2537 | return try_smi_init(info); | 2570 | return add_smi(info); |
2538 | } | 2571 | } |
2539 | 2572 | ||
2540 | static int __devexit ipmi_of_remove(struct of_device *dev) | 2573 | static int __devexit ipmi_of_remove(struct of_device *dev) |
@@ -2555,8 +2588,11 @@ static struct of_device_id ipmi_match[] = | |||
2555 | }; | 2588 | }; |
2556 | 2589 | ||
2557 | static struct of_platform_driver ipmi_of_platform_driver = { | 2590 | static struct of_platform_driver ipmi_of_platform_driver = { |
2558 | .name = "ipmi", | 2591 | .driver = { |
2559 | .match_table = ipmi_match, | 2592 | .name = "ipmi", |
2593 | .owner = THIS_MODULE, | ||
2594 | .of_match_table = ipmi_match, | ||
2595 | }, | ||
2560 | .probe = ipmi_of_probe, | 2596 | .probe = ipmi_of_probe, |
2561 | .remove = __devexit_p(ipmi_of_remove), | 2597 | .remove = __devexit_p(ipmi_of_remove), |
2562 | }; | 2598 | }; |
@@ -2640,9 +2676,8 @@ static int try_enable_event_buffer(struct smi_info *smi_info) | |||
2640 | 2676 | ||
2641 | rv = wait_for_msg_done(smi_info); | 2677 | rv = wait_for_msg_done(smi_info); |
2642 | if (rv) { | 2678 | if (rv) { |
2643 | printk(KERN_WARNING | 2679 | printk(KERN_WARNING PFX "Error getting response from get" |
2644 | "ipmi_si: Error getting response from get global," | 2680 | " global enables command, the event buffer is not" |
2645 | " enables command, the event buffer is not" | ||
2646 | " enabled.\n"); | 2681 | " enabled.\n"); |
2647 | goto out; | 2682 | goto out; |
2648 | } | 2683 | } |
@@ -2654,10 +2689,8 @@ static int try_enable_event_buffer(struct smi_info *smi_info) | |||
2654 | resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || | 2689 | resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || |
2655 | resp[1] != IPMI_GET_BMC_GLOBAL_ENABLES_CMD || | 2690 | resp[1] != IPMI_GET_BMC_GLOBAL_ENABLES_CMD || |
2656 | resp[2] != 0) { | 2691 | resp[2] != 0) { |
2657 | printk(KERN_WARNING | 2692 | printk(KERN_WARNING PFX "Invalid return from get global" |
2658 | "ipmi_si: Invalid return from get global" | 2693 | " enables command, cannot enable the event buffer.\n"); |
2659 | " enables command, cannot enable the event" | ||
2660 | " buffer.\n"); | ||
2661 | rv = -EINVAL; | 2694 | rv = -EINVAL; |
2662 | goto out; | 2695 | goto out; |
2663 | } | 2696 | } |
@@ -2673,9 +2706,8 @@ static int try_enable_event_buffer(struct smi_info *smi_info) | |||
2673 | 2706 | ||
2674 | rv = wait_for_msg_done(smi_info); | 2707 | rv = wait_for_msg_done(smi_info); |
2675 | if (rv) { | 2708 | if (rv) { |
2676 | printk(KERN_WARNING | 2709 | printk(KERN_WARNING PFX "Error getting response from set" |
2677 | "ipmi_si: Error getting response from set global," | 2710 | " global, enables command, the event buffer is not" |
2678 | " enables command, the event buffer is not" | ||
2679 | " enabled.\n"); | 2711 | " enabled.\n"); |
2680 | goto out; | 2712 | goto out; |
2681 | } | 2713 | } |
@@ -2686,10 +2718,8 @@ static int try_enable_event_buffer(struct smi_info *smi_info) | |||
2686 | if (resp_len < 3 || | 2718 | if (resp_len < 3 || |
2687 | resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || | 2719 | resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || |
2688 | resp[1] != IPMI_SET_BMC_GLOBAL_ENABLES_CMD) { | 2720 | resp[1] != IPMI_SET_BMC_GLOBAL_ENABLES_CMD) { |
2689 | printk(KERN_WARNING | 2721 | printk(KERN_WARNING PFX "Invalid return from get global," |
2690 | "ipmi_si: Invalid return from get global," | 2722 | "enables command, not enable the event buffer.\n"); |
2691 | "enables command, not enable the event" | ||
2692 | " buffer.\n"); | ||
2693 | rv = -EINVAL; | 2723 | rv = -EINVAL; |
2694 | goto out; | 2724 | goto out; |
2695 | } | 2725 | } |
@@ -2948,7 +2978,7 @@ static __devinit void default_find_bmc(void) | |||
2948 | if (!info) | 2978 | if (!info) |
2949 | return; | 2979 | return; |
2950 | 2980 | ||
2951 | info->addr_source = NULL; | 2981 | info->addr_source = SI_DEFAULT; |
2952 | 2982 | ||
2953 | info->si_type = ipmi_defaults[i].type; | 2983 | info->si_type = ipmi_defaults[i].type; |
2954 | info->io_setup = port_setup; | 2984 | info->io_setup = port_setup; |
@@ -2960,14 +2990,16 @@ static __devinit void default_find_bmc(void) | |||
2960 | info->io.regsize = DEFAULT_REGSPACING; | 2990 | info->io.regsize = DEFAULT_REGSPACING; |
2961 | info->io.regshift = 0; | 2991 | info->io.regshift = 0; |
2962 | 2992 | ||
2963 | if (try_smi_init(info) == 0) { | 2993 | if (add_smi(info) == 0) { |
2964 | /* Found one... */ | 2994 | if ((try_smi_init(info)) == 0) { |
2965 | printk(KERN_INFO "ipmi_si: Found default %s state" | 2995 | /* Found one... */ |
2966 | " machine at %s address 0x%lx\n", | 2996 | printk(KERN_INFO PFX "Found default %s" |
2967 | si_to_str[info->si_type], | 2997 | " state machine at %s address 0x%lx\n", |
2968 | addr_space_to_str[info->io.addr_type], | 2998 | si_to_str[info->si_type], |
2969 | info->io.addr_data); | 2999 | addr_space_to_str[info->io.addr_type], |
2970 | return; | 3000 | info->io.addr_data); |
3001 | } else | ||
3002 | cleanup_one_si(info); | ||
2971 | } | 3003 | } |
2972 | } | 3004 | } |
2973 | } | 3005 | } |
@@ -2986,34 +3018,48 @@ static int is_new_interface(struct smi_info *info) | |||
2986 | return 1; | 3018 | return 1; |
2987 | } | 3019 | } |
2988 | 3020 | ||
2989 | static int try_smi_init(struct smi_info *new_smi) | 3021 | static int add_smi(struct smi_info *new_smi) |
2990 | { | 3022 | { |
2991 | int rv; | 3023 | int rv = 0; |
2992 | int i; | ||
2993 | |||
2994 | if (new_smi->addr_source) { | ||
2995 | printk(KERN_INFO "ipmi_si: Trying %s-specified %s state" | ||
2996 | " machine at %s address 0x%lx, slave address 0x%x," | ||
2997 | " irq %d\n", | ||
2998 | new_smi->addr_source, | ||
2999 | si_to_str[new_smi->si_type], | ||
3000 | addr_space_to_str[new_smi->io.addr_type], | ||
3001 | new_smi->io.addr_data, | ||
3002 | new_smi->slave_addr, new_smi->irq); | ||
3003 | } | ||
3004 | 3024 | ||
3025 | printk(KERN_INFO PFX "Adding %s-specified %s state machine", | ||
3026 | ipmi_addr_src_to_str[new_smi->addr_source], | ||
3027 | si_to_str[new_smi->si_type]); | ||
3005 | mutex_lock(&smi_infos_lock); | 3028 | mutex_lock(&smi_infos_lock); |
3006 | if (!is_new_interface(new_smi)) { | 3029 | if (!is_new_interface(new_smi)) { |
3007 | printk(KERN_WARNING "ipmi_si: duplicate interface\n"); | 3030 | printk(KERN_CONT PFX "duplicate interface\n"); |
3008 | rv = -EBUSY; | 3031 | rv = -EBUSY; |
3009 | goto out_err; | 3032 | goto out_err; |
3010 | } | 3033 | } |
3011 | 3034 | ||
3035 | printk(KERN_CONT "\n"); | ||
3036 | |||
3012 | /* So we know not to free it unless we have allocated one. */ | 3037 | /* So we know not to free it unless we have allocated one. */ |
3013 | new_smi->intf = NULL; | 3038 | new_smi->intf = NULL; |
3014 | new_smi->si_sm = NULL; | 3039 | new_smi->si_sm = NULL; |
3015 | new_smi->handlers = NULL; | 3040 | new_smi->handlers = NULL; |
3016 | 3041 | ||
3042 | list_add_tail(&new_smi->link, &smi_infos); | ||
3043 | |||
3044 | out_err: | ||
3045 | mutex_unlock(&smi_infos_lock); | ||
3046 | return rv; | ||
3047 | } | ||
3048 | |||
3049 | static int try_smi_init(struct smi_info *new_smi) | ||
3050 | { | ||
3051 | int rv = 0; | ||
3052 | int i; | ||
3053 | |||
3054 | printk(KERN_INFO PFX "Trying %s-specified %s state" | ||
3055 | " machine at %s address 0x%lx, slave address 0x%x," | ||
3056 | " irq %d\n", | ||
3057 | ipmi_addr_src_to_str[new_smi->addr_source], | ||
3058 | si_to_str[new_smi->si_type], | ||
3059 | addr_space_to_str[new_smi->io.addr_type], | ||
3060 | new_smi->io.addr_data, | ||
3061 | new_smi->slave_addr, new_smi->irq); | ||
3062 | |||
3017 | switch (new_smi->si_type) { | 3063 | switch (new_smi->si_type) { |
3018 | case SI_KCS: | 3064 | case SI_KCS: |
3019 | new_smi->handlers = &kcs_smi_handlers; | 3065 | new_smi->handlers = &kcs_smi_handlers; |
@@ -3036,7 +3082,8 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3036 | /* Allocate the state machine's data and initialize it. */ | 3082 | /* Allocate the state machine's data and initialize it. */ |
3037 | new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL); | 3083 | new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL); |
3038 | if (!new_smi->si_sm) { | 3084 | if (!new_smi->si_sm) { |
3039 | printk(KERN_ERR "Could not allocate state machine memory\n"); | 3085 | printk(KERN_ERR PFX |
3086 | "Could not allocate state machine memory\n"); | ||
3040 | rv = -ENOMEM; | 3087 | rv = -ENOMEM; |
3041 | goto out_err; | 3088 | goto out_err; |
3042 | } | 3089 | } |
@@ -3046,7 +3093,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3046 | /* Now that we know the I/O size, we can set up the I/O. */ | 3093 | /* Now that we know the I/O size, we can set up the I/O. */ |
3047 | rv = new_smi->io_setup(new_smi); | 3094 | rv = new_smi->io_setup(new_smi); |
3048 | if (rv) { | 3095 | if (rv) { |
3049 | printk(KERN_ERR "Could not set up I/O space\n"); | 3096 | printk(KERN_ERR PFX "Could not set up I/O space\n"); |
3050 | goto out_err; | 3097 | goto out_err; |
3051 | } | 3098 | } |
3052 | 3099 | ||
@@ -3056,8 +3103,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3056 | /* Do low-level detection first. */ | 3103 | /* Do low-level detection first. */ |
3057 | if (new_smi->handlers->detect(new_smi->si_sm)) { | 3104 | if (new_smi->handlers->detect(new_smi->si_sm)) { |
3058 | if (new_smi->addr_source) | 3105 | if (new_smi->addr_source) |
3059 | printk(KERN_INFO "ipmi_si: Interface detection" | 3106 | printk(KERN_INFO PFX "Interface detection failed\n"); |
3060 | " failed\n"); | ||
3061 | rv = -ENODEV; | 3107 | rv = -ENODEV; |
3062 | goto out_err; | 3108 | goto out_err; |
3063 | } | 3109 | } |
@@ -3069,7 +3115,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3069 | rv = try_get_dev_id(new_smi); | 3115 | rv = try_get_dev_id(new_smi); |
3070 | if (rv) { | 3116 | if (rv) { |
3071 | if (new_smi->addr_source) | 3117 | if (new_smi->addr_source) |
3072 | printk(KERN_INFO "ipmi_si: There appears to be no BMC" | 3118 | printk(KERN_INFO PFX "There appears to be no BMC" |
3073 | " at this location\n"); | 3119 | " at this location\n"); |
3074 | goto out_err; | 3120 | goto out_err; |
3075 | } | 3121 | } |
@@ -3085,7 +3131,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3085 | for (i = 0; i < SI_NUM_STATS; i++) | 3131 | for (i = 0; i < SI_NUM_STATS; i++) |
3086 | atomic_set(&new_smi->stats[i], 0); | 3132 | atomic_set(&new_smi->stats[i], 0); |
3087 | 3133 | ||
3088 | new_smi->interrupt_disabled = 0; | 3134 | new_smi->interrupt_disabled = 1; |
3089 | atomic_set(&new_smi->stop_operation, 0); | 3135 | atomic_set(&new_smi->stop_operation, 0); |
3090 | new_smi->intf_num = smi_num; | 3136 | new_smi->intf_num = smi_num; |
3091 | smi_num++; | 3137 | smi_num++; |
@@ -3111,9 +3157,8 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3111 | new_smi->pdev = platform_device_alloc("ipmi_si", | 3157 | new_smi->pdev = platform_device_alloc("ipmi_si", |
3112 | new_smi->intf_num); | 3158 | new_smi->intf_num); |
3113 | if (!new_smi->pdev) { | 3159 | if (!new_smi->pdev) { |
3114 | printk(KERN_ERR | 3160 | printk(KERN_ERR PFX |
3115 | "ipmi_si_intf:" | 3161 | "Unable to allocate platform device\n"); |
3116 | " Unable to allocate platform device\n"); | ||
3117 | goto out_err; | 3162 | goto out_err; |
3118 | } | 3163 | } |
3119 | new_smi->dev = &new_smi->pdev->dev; | 3164 | new_smi->dev = &new_smi->pdev->dev; |
@@ -3121,9 +3166,8 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3121 | 3166 | ||
3122 | rv = platform_device_add(new_smi->pdev); | 3167 | rv = platform_device_add(new_smi->pdev); |
3123 | if (rv) { | 3168 | if (rv) { |
3124 | printk(KERN_ERR | 3169 | printk(KERN_ERR PFX |
3125 | "ipmi_si_intf:" | 3170 | "Unable to register system interface device:" |
3126 | " Unable to register system interface device:" | ||
3127 | " %d\n", | 3171 | " %d\n", |
3128 | rv); | 3172 | rv); |
3129 | goto out_err; | 3173 | goto out_err; |
@@ -3138,9 +3182,8 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3138 | "bmc", | 3182 | "bmc", |
3139 | new_smi->slave_addr); | 3183 | new_smi->slave_addr); |
3140 | if (rv) { | 3184 | if (rv) { |
3141 | printk(KERN_ERR | 3185 | dev_err(new_smi->dev, "Unable to register device: error %d\n", |
3142 | "ipmi_si: Unable to register device: error %d\n", | 3186 | rv); |
3143 | rv); | ||
3144 | goto out_err_stop_timer; | 3187 | goto out_err_stop_timer; |
3145 | } | 3188 | } |
3146 | 3189 | ||
@@ -3148,9 +3191,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3148 | type_file_read_proc, | 3191 | type_file_read_proc, |
3149 | new_smi); | 3192 | new_smi); |
3150 | if (rv) { | 3193 | if (rv) { |
3151 | printk(KERN_ERR | 3194 | dev_err(new_smi->dev, "Unable to create proc entry: %d\n", rv); |
3152 | "ipmi_si: Unable to create proc entry: %d\n", | ||
3153 | rv); | ||
3154 | goto out_err_stop_timer; | 3195 | goto out_err_stop_timer; |
3155 | } | 3196 | } |
3156 | 3197 | ||
@@ -3158,9 +3199,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3158 | stat_file_read_proc, | 3199 | stat_file_read_proc, |
3159 | new_smi); | 3200 | new_smi); |
3160 | if (rv) { | 3201 | if (rv) { |
3161 | printk(KERN_ERR | 3202 | dev_err(new_smi->dev, "Unable to create proc entry: %d\n", rv); |
3162 | "ipmi_si: Unable to create proc entry: %d\n", | ||
3163 | rv); | ||
3164 | goto out_err_stop_timer; | 3203 | goto out_err_stop_timer; |
3165 | } | 3204 | } |
3166 | 3205 | ||
@@ -3168,18 +3207,12 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3168 | param_read_proc, | 3207 | param_read_proc, |
3169 | new_smi); | 3208 | new_smi); |
3170 | if (rv) { | 3209 | if (rv) { |
3171 | printk(KERN_ERR | 3210 | dev_err(new_smi->dev, "Unable to create proc entry: %d\n", rv); |
3172 | "ipmi_si: Unable to create proc entry: %d\n", | ||
3173 | rv); | ||
3174 | goto out_err_stop_timer; | 3211 | goto out_err_stop_timer; |
3175 | } | 3212 | } |
3176 | 3213 | ||
3177 | list_add_tail(&new_smi->link, &smi_infos); | 3214 | dev_info(new_smi->dev, "IPMI %s interface initialized\n", |
3178 | 3215 | si_to_str[new_smi->si_type]); | |
3179 | mutex_unlock(&smi_infos_lock); | ||
3180 | |||
3181 | printk(KERN_INFO "IPMI %s interface initialized\n", | ||
3182 | si_to_str[new_smi->si_type]); | ||
3183 | 3216 | ||
3184 | return 0; | 3217 | return 0; |
3185 | 3218 | ||
@@ -3188,11 +3221,17 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3188 | wait_for_timer_and_thread(new_smi); | 3221 | wait_for_timer_and_thread(new_smi); |
3189 | 3222 | ||
3190 | out_err: | 3223 | out_err: |
3191 | if (new_smi->intf) | 3224 | new_smi->interrupt_disabled = 1; |
3225 | |||
3226 | if (new_smi->intf) { | ||
3192 | ipmi_unregister_smi(new_smi->intf); | 3227 | ipmi_unregister_smi(new_smi->intf); |
3228 | new_smi->intf = NULL; | ||
3229 | } | ||
3193 | 3230 | ||
3194 | if (new_smi->irq_cleanup) | 3231 | if (new_smi->irq_cleanup) { |
3195 | new_smi->irq_cleanup(new_smi); | 3232 | new_smi->irq_cleanup(new_smi); |
3233 | new_smi->irq_cleanup = NULL; | ||
3234 | } | ||
3196 | 3235 | ||
3197 | /* | 3236 | /* |
3198 | * Wait until we know that we are out of any interrupt | 3237 | * Wait until we know that we are out of any interrupt |
@@ -3205,18 +3244,21 @@ static int try_smi_init(struct smi_info *new_smi) | |||
3205 | if (new_smi->handlers) | 3244 | if (new_smi->handlers) |
3206 | new_smi->handlers->cleanup(new_smi->si_sm); | 3245 | new_smi->handlers->cleanup(new_smi->si_sm); |
3207 | kfree(new_smi->si_sm); | 3246 | kfree(new_smi->si_sm); |
3247 | new_smi->si_sm = NULL; | ||
3208 | } | 3248 | } |
3209 | if (new_smi->addr_source_cleanup) | 3249 | if (new_smi->addr_source_cleanup) { |
3210 | new_smi->addr_source_cleanup(new_smi); | 3250 | new_smi->addr_source_cleanup(new_smi); |
3211 | if (new_smi->io_cleanup) | 3251 | new_smi->addr_source_cleanup = NULL; |
3252 | } | ||
3253 | if (new_smi->io_cleanup) { | ||
3212 | new_smi->io_cleanup(new_smi); | 3254 | new_smi->io_cleanup(new_smi); |
3255 | new_smi->io_cleanup = NULL; | ||
3256 | } | ||
3213 | 3257 | ||
3214 | if (new_smi->dev_registered) | 3258 | if (new_smi->dev_registered) { |
3215 | platform_device_unregister(new_smi->pdev); | 3259 | platform_device_unregister(new_smi->pdev); |
3216 | 3260 | new_smi->dev_registered = 0; | |
3217 | kfree(new_smi); | 3261 | } |
3218 | |||
3219 | mutex_unlock(&smi_infos_lock); | ||
3220 | 3262 | ||
3221 | return rv; | 3263 | return rv; |
3222 | } | 3264 | } |
@@ -3226,6 +3268,8 @@ static __devinit int init_ipmi_si(void) | |||
3226 | int i; | 3268 | int i; |
3227 | char *str; | 3269 | char *str; |
3228 | int rv; | 3270 | int rv; |
3271 | struct smi_info *e; | ||
3272 | enum ipmi_addr_src type = SI_INVALID; | ||
3229 | 3273 | ||
3230 | if (initialized) | 3274 | if (initialized) |
3231 | return 0; | 3275 | return 0; |
@@ -3234,9 +3278,7 @@ static __devinit int init_ipmi_si(void) | |||
3234 | /* Register the device drivers. */ | 3278 | /* Register the device drivers. */ |
3235 | rv = driver_register(&ipmi_driver.driver); | 3279 | rv = driver_register(&ipmi_driver.driver); |
3236 | if (rv) { | 3280 | if (rv) { |
3237 | printk(KERN_ERR | 3281 | printk(KERN_ERR PFX "Unable to register driver: %d\n", rv); |
3238 | "init_ipmi_si: Unable to register driver: %d\n", | ||
3239 | rv); | ||
3240 | return rv; | 3282 | return rv; |
3241 | } | 3283 | } |
3242 | 3284 | ||
@@ -3260,38 +3302,81 @@ static __devinit int init_ipmi_si(void) | |||
3260 | 3302 | ||
3261 | hardcode_find_bmc(); | 3303 | hardcode_find_bmc(); |
3262 | 3304 | ||
3263 | #ifdef CONFIG_DMI | 3305 | /* If the user gave us a device, they presumably want us to use it */ |
3264 | dmi_find_bmc(); | 3306 | mutex_lock(&smi_infos_lock); |
3265 | #endif | 3307 | if (!list_empty(&smi_infos)) { |
3308 | mutex_unlock(&smi_infos_lock); | ||
3309 | return 0; | ||
3310 | } | ||
3311 | mutex_unlock(&smi_infos_lock); | ||
3266 | 3312 | ||
3267 | #ifdef CONFIG_ACPI | 3313 | #ifdef CONFIG_PCI |
3268 | spmi_find_bmc(); | 3314 | rv = pci_register_driver(&ipmi_pci_driver); |
3315 | if (rv) | ||
3316 | printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv); | ||
3269 | #endif | 3317 | #endif |
3318 | |||
3270 | #ifdef CONFIG_ACPI | 3319 | #ifdef CONFIG_ACPI |
3271 | pnp_register_driver(&ipmi_pnp_driver); | 3320 | pnp_register_driver(&ipmi_pnp_driver); |
3272 | #endif | 3321 | #endif |
3273 | 3322 | ||
3274 | #ifdef CONFIG_PCI | 3323 | #ifdef CONFIG_DMI |
3275 | rv = pci_register_driver(&ipmi_pci_driver); | 3324 | dmi_find_bmc(); |
3276 | if (rv) | 3325 | #endif |
3277 | printk(KERN_ERR | 3326 | |
3278 | "init_ipmi_si: Unable to register PCI driver: %d\n", | 3327 | #ifdef CONFIG_ACPI |
3279 | rv); | 3328 | spmi_find_bmc(); |
3280 | #endif | 3329 | #endif |
3281 | 3330 | ||
3282 | #ifdef CONFIG_PPC_OF | 3331 | #ifdef CONFIG_PPC_OF |
3283 | of_register_platform_driver(&ipmi_of_platform_driver); | 3332 | of_register_platform_driver(&ipmi_of_platform_driver); |
3284 | #endif | 3333 | #endif |
3285 | 3334 | ||
3335 | /* We prefer devices with interrupts, but in the case of a machine | ||
3336 | with multiple BMCs we assume that there will be several instances | ||
3337 | of a given type so if we succeed in registering a type then also | ||
3338 | try to register everything else of the same type */ | ||
3339 | |||
3340 | mutex_lock(&smi_infos_lock); | ||
3341 | list_for_each_entry(e, &smi_infos, link) { | ||
3342 | /* Try to register a device if it has an IRQ and we either | ||
3343 | haven't successfully registered a device yet or this | ||
3344 | device has the same type as one we successfully registered */ | ||
3345 | if (e->irq && (!type || e->addr_source == type)) { | ||
3346 | if (!try_smi_init(e)) { | ||
3347 | type = e->addr_source; | ||
3348 | } | ||
3349 | } | ||
3350 | } | ||
3351 | |||
3352 | /* type will only have been set if we successfully registered an si */ | ||
3353 | if (type) { | ||
3354 | mutex_unlock(&smi_infos_lock); | ||
3355 | return 0; | ||
3356 | } | ||
3357 | |||
3358 | /* Fall back to the preferred device */ | ||
3359 | |||
3360 | list_for_each_entry(e, &smi_infos, link) { | ||
3361 | if (!e->irq && (!type || e->addr_source == type)) { | ||
3362 | if (!try_smi_init(e)) { | ||
3363 | type = e->addr_source; | ||
3364 | } | ||
3365 | } | ||
3366 | } | ||
3367 | mutex_unlock(&smi_infos_lock); | ||
3368 | |||
3369 | if (type) | ||
3370 | return 0; | ||
3371 | |||
3286 | if (si_trydefaults) { | 3372 | if (si_trydefaults) { |
3287 | mutex_lock(&smi_infos_lock); | 3373 | mutex_lock(&smi_infos_lock); |
3288 | if (list_empty(&smi_infos)) { | 3374 | if (list_empty(&smi_infos)) { |
3289 | /* No BMC was found, try defaults. */ | 3375 | /* No BMC was found, try defaults. */ |
3290 | mutex_unlock(&smi_infos_lock); | 3376 | mutex_unlock(&smi_infos_lock); |
3291 | default_find_bmc(); | 3377 | default_find_bmc(); |
3292 | } else { | 3378 | } else |
3293 | mutex_unlock(&smi_infos_lock); | 3379 | mutex_unlock(&smi_infos_lock); |
3294 | } | ||
3295 | } | 3380 | } |
3296 | 3381 | ||
3297 | mutex_lock(&smi_infos_lock); | 3382 | mutex_lock(&smi_infos_lock); |
@@ -3305,8 +3390,8 @@ static __devinit int init_ipmi_si(void) | |||
3305 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3390 | of_unregister_platform_driver(&ipmi_of_platform_driver); |
3306 | #endif | 3391 | #endif |
3307 | driver_unregister(&ipmi_driver.driver); | 3392 | driver_unregister(&ipmi_driver.driver); |
3308 | printk(KERN_WARNING | 3393 | printk(KERN_WARNING PFX |
3309 | "ipmi_si: Unable to find any System Interface(s)\n"); | 3394 | "Unable to find any System Interface(s)\n"); |
3310 | return -ENODEV; | 3395 | return -ENODEV; |
3311 | } else { | 3396 | } else { |
3312 | mutex_unlock(&smi_infos_lock); | 3397 | mutex_unlock(&smi_infos_lock); |
@@ -3317,7 +3402,7 @@ module_init(init_ipmi_si); | |||
3317 | 3402 | ||
3318 | static void cleanup_one_si(struct smi_info *to_clean) | 3403 | static void cleanup_one_si(struct smi_info *to_clean) |
3319 | { | 3404 | { |
3320 | int rv; | 3405 | int rv = 0; |
3321 | unsigned long flags; | 3406 | unsigned long flags; |
3322 | 3407 | ||
3323 | if (!to_clean) | 3408 | if (!to_clean) |
@@ -3361,14 +3446,16 @@ static void cleanup_one_si(struct smi_info *to_clean) | |||
3361 | schedule_timeout_uninterruptible(1); | 3446 | schedule_timeout_uninterruptible(1); |
3362 | } | 3447 | } |
3363 | 3448 | ||
3364 | rv = ipmi_unregister_smi(to_clean->intf); | 3449 | if (to_clean->intf) |
3450 | rv = ipmi_unregister_smi(to_clean->intf); | ||
3451 | |||
3365 | if (rv) { | 3452 | if (rv) { |
3366 | printk(KERN_ERR | 3453 | printk(KERN_ERR PFX "Unable to unregister device: errno=%d\n", |
3367 | "ipmi_si: Unable to unregister device: errno=%d\n", | ||
3368 | rv); | 3454 | rv); |
3369 | } | 3455 | } |
3370 | 3456 | ||
3371 | to_clean->handlers->cleanup(to_clean->si_sm); | 3457 | if (to_clean->handlers) |
3458 | to_clean->handlers->cleanup(to_clean->si_sm); | ||
3372 | 3459 | ||
3373 | kfree(to_clean->si_sm); | 3460 | kfree(to_clean->si_sm); |
3374 | 3461 | ||