Changeset 2482
- Timestamp:
- 04/27/04 03:10:49 (9 years ago)
- Files:
-
- 1 modified
-
lm-sensors/trunk/kernel/chips/bmcsensors.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/kernel/chips/bmcsensors.c
r2333 r2482 27 27 #include <linux/init.h> 28 28 #include <asm/io.h> 29 /* for kernel thread ... */ 30 #include <asm/atomic.h> 31 #include <asm/semaphore.h> 32 #include <linux/smp_lock.h> 33 #include <asm/errno.h> 29 34 #include "version.h" 30 35 … … 61 66 static void bmcsensors_update_client(struct i2c_client *client); 62 67 static void bmcsensors_reserve_sdr(void); 68 static void bmc_do_pause(unsigned int amount); /* YJ for debug */ 63 69 64 70 … … 159 165 160 166 enum states {STATE_INIT, STATE_RESERVE, STATE_SDR, STATE_SDRPARTIAL, 161 STATE_READING, STATE_UNCANCEL, STATE_DONE}; 167 STATE_READING, STATE_UNCANCEL, STATE_PROCTABLE, STATE_DONE}; 168 /* YJ : added extra state STATE_PROCTABLE for thread activity */ 162 169 static int state; 163 170 static int receive_counter; … … 182 189 #define STYPE_MAX 4 /* the last sensor type we are interested in */ 183 190 static u8 bmcs_count[STYPE_MAX + 1]; 184 static const u8 bmcs_max[STYPE_MAX + 1] = {0, 20, 20, 20, 20}; 191 static const u8 bmcs_max[STYPE_MAX + 1] = {0, 20, 40, 20, 20}; 192 /* YJ: on poweredge 1750, we need ^^ */ 185 193 186 194 /************************************/ 187 195 /* YJ ... */ 196 static int thread_pid= 0; 197 static DECLARE_MUTEX_LOCKED(bmc_sem); 198 /* ... YJ */ 199 /************************************/ 188 200 189 201 /* unpack based on string type, convert to normal, null terminate */ … … 311 323 u8 id[SDR_MAX_UNPACKED_ID_LENGTH]; 312 324 325 326 printk(KERN_INFO "bmcsensors.o: building proc table\n"); 313 327 if(!(bmcsensors_dir_table = kmalloc((sdrd_count + 1) * sizeof(struct ctl_table), GFP_KERNEL))) { 314 328 printk(KERN_ERR "bmcsensors.o: no memory\n"); … … 452 466 if(ipmi_sdr_partial_size < 8) { 453 467 printk(KERN_INFO "bmcsensors.o: IPMI buffers too small, giving up\n"); 468 up (&bmc_sem); /* should wait for thread exit ! */ 454 469 return STATE_DONE; 455 470 } … … 483 498 484 499 nextrecord = (data[2] << 8) | data[1]; 500 /* printk(KERN_INFO "bmcsensors.o: nextrecord %d \n", nextrecord); */ 501 502 485 503 type = data[6]; 486 504 if(type == 1 || type == 2) { /* known SDR type */ … … 556 574 bmcs_count[stype]++; 557 575 sdrd_count++; 576 if (sdrd_count>=MAX_SDR_ENTRIES) nextrecord = 0xffff; /*YJ*/ 577 558 578 } 559 579 } … … 582 602 #endif 583 603 } 604 if (nextrecord>=6224) { 605 nextrecord = 0xffff; /*YJ stop sensor scan on poweredge 1750 */ 606 } 584 607 585 608 if(nextrecord == 0xFFFF) { … … 587 610 printk(KERN_INFO "bmcsensors.o: No recognized sensors found.\n"); 588 611 /* unregister?? */ 612 rstate = STATE_DONE; 613 up (&bmc_sem); /* should wait for thread exit !!! */ 589 614 } else { 590 bmcsensors_build_proc_table(); 591 } 592 rstate = STATE_DONE; 615 /* YJ ...*/ 616 printk(KERN_INFO "bmcsensors.o: all sensors detected\n"); 617 rstate = STATE_PROCTABLE; 618 /* YJ bmcsensors_build_proc_table() call by thread */ 619 /* ... YJ */ 620 } 621 593 622 } else { 623 594 624 bmcsensors_get_sdr(0, nextrecord, 0); 595 625 } … … 615 645 case STATE_SDRPARTIAL: 616 646 state = bmcsensors_rcv_sdr_msg(msg, state); 647 /*YJ ...*/ 648 if (state==STATE_PROCTABLE){ 649 650 #ifdef DEBUG 651 printk(KERN_DEBUG "releasing thread\n"); 652 #endif 653 654 up (&bmc_sem); 655 } 656 /*YJ bmcsensors_build_proc_table() called by thread */ 657 /* ... YJ */ 617 658 break; 618 659 … … 632 673 633 674 case STATE_DONE: 675 case STATE_PROCTABLE: 634 676 break; 635 677 … … 650 692 "bmcsensors.o: Too many reservations cancelled, giving up\n"); 651 693 state = STATE_DONE; 694 up (&bmc_sem); /* YJ : should make sure thread exited ! */ 652 695 } else { 653 696 #ifdef DEBUG … … 658 701 state = STATE_UNCANCEL; 659 702 } 660 } else if (msg->msg.data[0] != 0 && msg->msg.data[0] != 0xca) { 703 } else if (msg->msg.data[0] != 0 && msg->msg.data[0] != 0xca && 704 msg->msg.data[0] != 0xce) { 705 /* YJ : accept 0xce */ 661 706 printk(KERN_ERR 662 707 "bmcsensors.o: Error 0x%x on cmd 0x%x/0x%x; state = %d; probably fatal.\n", … … 696 741 tx_message.data_len = 0; 697 742 tx_message.data = NULL; 743 printk(KERN_INFO "bmcsensors.o: reserve_sdr...\n"); 698 744 bmcsensors_send_message(&tx_message); 699 745 } … … 734 780 static int bmcsensors_attach_adapter(struct i2c_adapter *adapter) 735 781 { 736 if(adapter->algo->id != I2C_ALGO_IPMI) 782 printk(KERN_INFO "bmcsensors.o: attach_adapter...\n"); 783 784 if(adapter->algo->id != I2C_ALGO_IPMI){ 785 printk(KERN_INFO "bmcsensors.o: attach_adapter, expected 0x%x, got 0x%x\n", I2C_ALGO_IPMI, adapter->algo->id); 737 786 return 0; 787 } 738 788 739 789 if(bmcsensors_initialized >= 2) { … … 966 1016 #endif 967 1017 1018 /* YJ ... */ 1019 static int bmc_thread(void *dummy){ 1020 1021 lock_kernel(); 1022 daemonize(); 1023 unlock_kernel(); 1024 1025 strcpy(current->comm, "bmc-sensors"); 1026 1027 if(down_interruptible(&bmc_sem)) { 1028 1029 printk("exiting..."); 1030 1031 thread_pid= 0; 1032 up (&bmc_sem); 1033 1034 return 0; 1035 } 1036 1037 if (state == STATE_PROCTABLE){ 1038 1039 bmcsensors_build_proc_table(); 1040 1041 state = STATE_DONE; 1042 1043 printk(KERN_INFO "bmcsensors.o: bmcsensor thread done\n" ); 1044 1045 } 1046 1047 thread_pid= 0; 1048 1049 up (&bmc_sem); 1050 1051 return 0; 1052 } 1053 /* ... YJ */ 1054 968 1055 static int __init sm_bmcsensors_init(void) 969 1056 { 970 1057 printk(KERN_INFO "bmcsensors.o version %s (%s)\n", LM_VERSION, LM_DATE); 1058 /* YJ ... */ 1059 init_MUTEX_LOCKED(&bmc_sem); 1060 1061 thread_pid= kernel_thread(bmc_thread, NULL, 0); 1062 1063 if (thread_pid<0){ 1064 printk(KERN_ERR "bmcsensors.o : Could not initialize bmc thread. Aborting\n"); 1065 return 0; 1066 } 1067 /* ... YJ */ 1068 971 1069 return i2c_add_driver(&bmcsensors_driver); 972 1070 } … … 974 1072 static void __exit sm_bmcsensors_exit(void) 975 1073 { 976 i2c_del_driver(&bmcsensors_driver); 1074 int j; 1075 j= 0; 1076 /* YJ ... */ 1077 printk(KERN_INFO "bmcsensors.o sleeping a while\n"); 1078 while( (j++ < 50)){ 1079 bmc_do_pause(HZ / 25); 1080 } 1081 if (thread_pid > 0){ 1082 printk(KERN_INFO "bmcsensors.o stopping kernel thread\n"); 1083 state= STATE_DONE; 1084 j= 0; 1085 up (&bmc_sem); 1086 printk(KERN_INFO "bmcsensors.o waiting...\n"); 1087 /* make sure kernel thread does not access driver memory any more */ 1088 while((thread_pid > 0)&& (j++ < 100)){ 1089 bmc_do_pause(HZ / 25); 1090 } 1091 printk(KERN_INFO "bmcsensors.o OK\n"); 1092 } 1093 j= 0; 1094 /* sleep for debug... not necessary ? */ 1095 printk(KERN_INFO "bmcsensors.o sleeping again\n"); 1096 while( (j++ < 50)){ 1097 bmc_do_pause(HZ / 25); 1098 } 1099 /* ...YJ */ 1100 printk(KERN_INFO "bmcsensors.o i2c cleanup\n"); 1101 i2c_del_driver(&bmcsensors_driver); 977 1102 } 978 1103
