Index: /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.h
===================================================================
--- /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.h	(revision 9159)
+++ /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.h	(working copy)
@@ -65,6 +65,13 @@
 #define CB_1924_FAN3_SE          0x33
 #define CB_1924_FAN4_SE          0x34
 
+#define CAPB_5070NR_8000_FAN_SP_MTOL     255   // $ ipmitool sdr get "Sys Fan1 Speed" | grep "Sensor Reading"
+#define CAPB_5070NR_8000_FAN_SP_BACC     0
+#define CAPB_5070NR_8000_FAN1_SE          0xC2
+#define CAPB_5070NR_8000_FAN2_SE          0xC3
+#define CAPB_5070NR_8000_FAN3_SE          0xC4
+#define CAPB_5070NR_8000_FAN4_SE          0xC5
+
 typedef enum {
 	AVX_IPMI_FAN_C1 = 0,
 	AVX_IPMI_FAN_C2,
@@ -86,6 +93,8 @@
 	AVX_IPMI_POWER_CB1920_TOP,
 	AVX_IPMI_POWER_CB1924_LEFT,
 	AVX_IPMI_POWER_CB1924_RIGHT,
+	AVX_IPMI_POWER_CAPB_5070NR_BOTTOM,
+	AVX_IPMI_POWER_CAPB_5070NR_TOP,
 
 	AVX_IPMI_SENSOR_NONE
 } avx_ipmi_sensor;
Index: /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.c
===================================================================
--- /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.c	(revision 9159)
+++ /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_ipmi.c	(working copy)
@@ -94,10 +94,10 @@
         AVX_IPMI_INVALID_VALUE, "TEMP C2"},
 
 	{AVX_IPMI_TEMP_S,  0x04, 0x2d, 0x01, {0x11, 0x00, 0x00, 0x00},
-        AVX_IPMI_INVALID_VALUE, "TEMP S"},
+        AVX_IPMI_INVALID_VALUE, "TEMP S "},
 
 	{AVX_IPMI_POWER,   0x30, 0x92, 0x01, {0x00, 0x00, 0x00, 0x00},
-        AVX_IPMI_INVALID_VALUE, "POWER "},
+        AVX_IPMI_INVALID_VALUE, "POWER"},
 
 	{AVX_IPMI_POWER_X10DRi_TOP, 0x06, 0x52, 0x04, {0x07, 0xb2, 0x01, 0x79},
         AVX_IPMI_INVALID_VALUE, "POWER(X10DRi TOP)"},
@@ -111,7 +111,12 @@
 	{AVX_IPMI_POWER_CB1924_LEFT, 0x04, 0x2d, 0x01, {0x05, 0x00, 0x00, 0x00},
         AVX_IPMI_INVALID_VALUE, "POWER(CB1924 LEFT)"},
 	{AVX_IPMI_POWER_CB1924_RIGHT, 0x04, 0x2d, 0x01, {0x15, 0x00, 0x00, 0x00},
-        AVX_IPMI_INVALID_VALUE, "POWER(CB1924 RIGHT)"}
+        AVX_IPMI_INVALID_VALUE, "POWER(CB1924 RIGHT)"},
+
+	{AVX_IPMI_POWER_CAPB_5070NR_BOTTOM, 0x04, 0x2d, 0x01, {0xDf, 0x00, 0x00, 0x00},
+		AVX_IPMI_INVALID_VALUE, "POWER (BOTTOM)"},
+	{AVX_IPMI_POWER_CAPB_5070NR_TOP, 0x04, 0x2d, 0x01, {0xEF, 0x00, 0x00, 0x00},
+		AVX_IPMI_INVALID_VALUE, "POWER (TOP)   "},
 };
 
 static struct ipmi_user_hndl ipmi_hndlrs = {
@@ -305,6 +310,21 @@
 		avx_ipmi_tbl[AVX_IPMI_TEMP_S].cmd = 0x2d;
 		avx_ipmi_tbl[AVX_IPMI_TEMP_S].req[0] = 0x63;
 		break;
+		case CHIPSET_ID_CAPB_5070NR_8000:
+		avx_ipmi_tbl[AVX_IPMI_FAN_S1].req[0] = CAPB_5070NR_8000_FAN1_SE;
+		avx_ipmi_tbl[AVX_IPMI_FAN_S2].req[0] = CAPB_5070NR_8000_FAN2_SE;
+		avx_ipmi_tbl[AVX_IPMI_FAN_S3].req[0] = CAPB_5070NR_8000_FAN3_SE;
+		avx_ipmi_tbl[AVX_IPMI_FAN_S4].req[0] = CAPB_5070NR_8000_FAN4_SE;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C1].netfn = 0x04;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C1].cmd = 0x2d;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C1].req[0] = 0x85;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C2].netfn = 0x04;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C2].cmd = 0x2d;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_C2].req[0] = 0x86;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_S].netfn = 0x04;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_S].cmd = 0x2d;
+		avx_ipmi_tbl[AVX_IPMI_TEMP_S].req[0] = 0x80;
+		break;
 		default:
 		break;
 	}
@@ -413,6 +433,10 @@
             M = CB_1924_FAN_SP_MTOL;
             B = CB_1924_FAN_SP_BACC;
         }
+		else if(chipset_id == CHIPSET_ID_CAPB_5070NR_8000) {
+            M = CAPB_5070NR_8000_FAN_SP_MTOL;
+            B = CAPB_5070NR_8000_FAN_SP_BACC;
+        }
         m = __TO_M(M);
         b = __TO_B(B);
         k1 = __TO_B_EXP(B);
@@ -422,12 +446,20 @@
         return;
     case AVX_IPMI_TEMP_C1:
     case AVX_IPMI_TEMP_C2:
-        /* CPU Temperature is equal to the raw data. */
-        req->val = (int)ipmi_recv_msg.msg.data[1]; 
+		/* CAPB_5070NR_8000 only read 7-bit for temperature */
+		if(chipset_id == CHIPSET_ID_CAPB_5070NR_8000)
+			req->val = (int)ipmi_recv_msg.msg.data[1] - 128; 
+		/* CPU Temperature is equal to the raw data. */
+		else 
+			req->val = (int)ipmi_recv_msg.msg.data[1];
         return;
     case AVX_IPMI_TEMP_S:
-        /* For AVX(10650) device, SYS_TEMP_MTOL == 1, and SYS_TEMP_BACC == 0. */
-        req->val = (int)ipmi_recv_msg.msg.data[1]; 
+        /* CAPB_5070NR_8000 only read 7-bit for temperature */
+        if(chipset_id == CHIPSET_ID_CAPB_5070NR_8000)
+			req->val = (int)ipmi_recv_msg.msg.data[1] - 128; 
+		/* For AVX(10650) device, SYS_TEMP_MTOL == 1, and SYS_TEMP_BACC == 0. */
+		else 
+			req->val = (int)ipmi_recv_msg.msg.data[1];
         return;
     case AVX_IPMI_POWER:
         req->val = (int)ipmi_recv_msg.msg.data[1]; 
@@ -447,6 +479,11 @@
         req->val = (int)ipmi_recv_msg.msg.data[1]; 
         avx_ipmi_tbl[AVX_IPMI_POWER].val = avx_ipmi_tbl[AVX_IPMI_POWER_CB1924_LEFT].val && avx_ipmi_tbl[AVX_IPMI_POWER_CB1924_RIGHT].val;
         return;
+	case AVX_IPMI_POWER_CAPB_5070NR_BOTTOM:
+    case AVX_IPMI_POWER_CAPB_5070NR_TOP:
+        req->val = (int)ipmi_recv_msg.msg.data[1]; 
+        avx_ipmi_tbl[AVX_IPMI_POWER].val = avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_BOTTOM].val && avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_TOP].val;
+        return;
     default:
         printk(KERN_WARNING PFX "wrong ipmi sensor type : %d\n", (int)req->sensor);
     }
@@ -469,6 +506,8 @@
 		  || (cur_req->sensor == AVX_IPMI_POWER_CB1924_RIGHT && chipset_id != CHIPSET_ID_CB_1924)
 		  || (cur_req->sensor == AVX_IPMI_FAN_C2 && chipset_id == CHIPSET_ID_X11SSi_LN4F)
 		  || (cur_req->sensor == AVX_IPMI_TEMP_C2 && chipset_id == CHIPSET_ID_X11SSi_LN4F)
+		  || (cur_req->sensor == AVX_IPMI_POWER_CAPB_5070NR_BOTTOM && chipset_id != CHIPSET_ID_CAPB_5070NR_8000)
+		  || (cur_req->sensor == AVX_IPMI_POWER_CAPB_5070NR_TOP && chipset_id != CHIPSET_ID_CAPB_5070NR_8000)
 		  ) {
 			continue;
 		}
@@ -524,12 +563,10 @@
 		len += snprintf(buf + len, sizeof(buf) - len, " %8s : %d \n",
 				avx_ipmi_tbl[AVX_IPMI_FAN_S3].name,
 				avx_ipmi_tbl[AVX_IPMI_FAN_S3].val);
-#if 0	
 	if (avx_ipmi_tbl[AVX_IPMI_FAN_S4].val != AVX_IPMI_INVALID_VALUE)
 		len += snprintf(buf + len, sizeof(buf) - len, " %8s : %d \n",
 				avx_ipmi_tbl[AVX_IPMI_FAN_S4].name,
 				avx_ipmi_tbl[AVX_IPMI_FAN_S4].val);
-#endif 
 
 	if (avx_ipmi_tbl[AVX_IPMI_TEMP_C1].val != AVX_IPMI_INVALID_VALUE)
 		len += snprintf(buf + len, sizeof(buf) - len, " %8s : %d \n",
@@ -543,10 +580,14 @@
 		len += snprintf(buf + len, sizeof(buf) - len, " %8s : %d \n",
 				avx_ipmi_tbl[AVX_IPMI_TEMP_S].name,
 				avx_ipmi_tbl[AVX_IPMI_TEMP_S].val);
-	if (avx_ipmi_tbl[AVX_IPMI_POWER].val != AVX_IPMI_INVALID_VALUE)
-		len += snprintf(buf + len, sizeof(buf) - len, " %8s : 0x%x \n",
+		
+	if (chipset_id != CHIPSET_ID_X10DRi && chipset_id != CHIPSET_ID_CB_1920
+		&& chipset_id != CHIPSET_ID_CB_1924 && chipset_id != CHIPSET_ID_CAPB_5070NR_8000) {
+		if (avx_ipmi_tbl[AVX_IPMI_POWER].val != AVX_IPMI_INVALID_VALUE)
+			len += snprintf(buf + len, sizeof(buf) - len, " %8s : 0x%x \n",
 				avx_ipmi_tbl[AVX_IPMI_POWER].name,
 				avx_ipmi_tbl[AVX_IPMI_POWER].val);
+	}
 
 	if (chipset_id == CHIPSET_ID_X10DRi) {
 		if (avx_ipmi_tbl[AVX_IPMI_POWER_X10DRi_TOP].val != AVX_IPMI_INVALID_VALUE)
@@ -581,6 +622,17 @@
 					avx_ipmi_tbl[AVX_IPMI_POWER_CB1924_RIGHT].val);
 	}
 
+	if (chipset_id == CHIPSET_ID_CAPB_5070NR_8000) {
+		if (avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_BOTTOM].val != AVX_IPMI_INVALID_VALUE)
+			len += snprintf(buf + len, sizeof(buf) - len, " %8s : 0x%x \n",
+					avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_BOTTOM].name,
+					avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_BOTTOM].val);
+		if (avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_TOP].val != AVX_IPMI_INVALID_VALUE)
+			len += snprintf(buf + len, sizeof(buf) - len, " %8s : 0x%x \n",
+					avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_TOP].name,
+					avx_ipmi_tbl[AVX_IPMI_POWER_CAPB_5070NR_TOP].val);
+	}
+
 	if (len > sizeof(buf)) {
 		return -ENOMEM;
 	}
Index: /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.h
===================================================================
--- /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.h	(revision 9159)
+++ /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.h	(working copy)
@@ -29,6 +29,7 @@
 #define CHIPSET_ID_X11DPi_N		0x20208086
 #define CHIPSET_ID_CB_1920      0x19208086 /* for AEWIN 2U platform using AEWIN CB1920 motherboard*/
 #define CHIPSET_ID_CB_1924      0x19248086 /* for AEWIN 1U platform using AEWIN CB1924 motherboard*/
+#define CHIPSET_ID_CAPB_5070NR_8000   0x50708086  /* Caswell CAPB-5070NR-8000 motherboard ID */
 
 //dmidecode -s baseboard-product-name
 #define TM_NCE_MB_X9DRi_F		"X9DRi-F"
@@ -38,6 +39,7 @@
 #define TM_NCE_MB_X11DPi_N		"X11DPi-N"
 #define TM_NCE_MB_CB_1920       "CB-1920"
 #define TM_NCE_MB_CB_1924       "CB-1924"
+#define TM_NCE_MB_CAPB_5070NR_8000    "CAPB-5070NR-8000"
 
 #define ARRAY_PRODUCT_AVX7800_STR   "957800"
 
Index: /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.c
===================================================================
--- /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.c	(revision 9159)
+++ /branches/rel_avx_2_7_5_caswell_5070/kern/monitor/avx_monitor.c	(working copy)
@@ -88,9 +88,9 @@
 static int monitor_check_fan(void)
 {
 	int rv = 0;
-	// No CPU1 FAN for AEWIN 1U & 2U
+	// No CPU1 FAN for AEWIN 1U & 2U, and Caswell CAPB-5070NR
 	if (IS_FAN_ABNORMAL(avx_ipmi_getval(AVX_IPMI_FAN_C1))) {
-		if (chipset_id == CHIPSET_ID_CB_1920 || chipset_id == CHIPSET_ID_CB_1924) {
+		if (chipset_id == CHIPSET_ID_CB_1920 || chipset_id == CHIPSET_ID_CB_1924 || chipset_id == CHIPSET_ID_CAPB_5070NR_8000) {
 			monitor_states.fan_c1 = STATE_UNKNOWN;
 		}
 		else {
@@ -100,9 +100,9 @@
 	} else {
 		monitor_states.fan_c1 = STATE_NORMAL;
 	}
-	// No CPU2 FAN for 1U, AEWIN 1U, AEWIN 2U, and 2U AVX7800 model
+	// No CPU2 FAN for 1U, AEWIN 1U, AEWIN 2U, and 2U AVX7800 model, and Caswell CAPB-5070NR
 	if (IS_FAN_ABNORMAL(avx_ipmi_getval(AVX_IPMI_FAN_C2))) {
-		if (chipset_id == CHIPSET_ID_X11SSi_LN4F || chipset_id == CHIPSET_ID_CB_1920 || chipset_id == CHIPSET_ID_CB_1924 || strcmp(avx_model, ARRAY_PRODUCT_AVX7800_STR) == 0) {
+		if (chipset_id == CHIPSET_ID_X11SSi_LN4F || chipset_id == CHIPSET_ID_CB_1920 || chipset_id == CHIPSET_ID_CB_1924 || strcmp(avx_model, ARRAY_PRODUCT_AVX7800_STR) == 0 || chipset_id == CHIPSET_ID_CAPB_5070NR_8000) {
 			monitor_states.fan_c2 = STATE_UNKNOWN;
 		}
 		else {
@@ -195,6 +195,7 @@
 #define IS_POWER_ABNORMAL_X10DRi(val) ((val) != 0)
 #define IS_POWER_ABNORMAL_CB1920(val) ((val) == 0)
 #define IS_POWER_ABNORMAL_CB1924(val) ((val) == 0)
+#define IS_POWER_ABNORMAL_CAPB_5070NR(val) ((val) == 0)
 static int monitor_check_power(void)
 {
 	int rv = 0, abnormal = 0;
@@ -205,6 +206,8 @@
 		abnormal = IS_POWER_ABNORMAL_CB1920(avx_ipmi_getval(AVX_IPMI_POWER));
 	} else if (chipset_id == CHIPSET_ID_CB_1924) {
 		abnormal = IS_POWER_ABNORMAL_CB1924(avx_ipmi_getval(AVX_IPMI_POWER));
+	} else if (chipset_id == CHIPSET_ID_CAPB_5070NR_8000) {
+		abnormal = IS_POWER_ABNORMAL_CAPB_5070NR(avx_ipmi_getval(AVX_IPMI_POWER));
 	} else {
 		abnormal = IS_POWER_ABNORMAL(avx_ipmi_getval(AVX_IPMI_POWER));
 	}
@@ -336,6 +339,10 @@
             chipset_id = CHIPSET_ID_CB_1924;
 			//TODO: cb1924_led_init() here
         }
+		else if (strncmp(boardname, TM_NCE_MB_CAPB_5070NR_8000, sizeof(TM_NCE_MB_CAPB_5070NR_8000)) == 0) {
+            chipset_id = CHIPSET_ID_CAPB_5070NR_8000;
+			//TODO: CAPB_5070NR_led_init() here
+        }
 	}
 
 	atomic_notifier_chain_register(&panic_notifier_list,
@@ -382,6 +389,9 @@
 	if (strncmp(boardname, TM_NCE_MB_CB_1924, sizeof(TM_NCE_MB_CB_1924)) == 0) {
 			//TODO: cb1924_led_uninit();
 	}
+	if (strncmp(boardname, TM_NCE_MB_CAPB_5070NR_8000, sizeof(TM_NCE_MB_CAPB_5070NR_8000)) == 0) {
+			//TODO: CAPB_5070NR_led_uninit();
+	}
 	return avx_ipmi_exit();
 }
 
