static void ipmi_poweroff_atca (ipmi_user_t user) { struct ipmi_system_interface_addr smi_addr; struct kernel_ipmi_msg send_msg; int rv; unsigned char data[4]; /* * Configure IPMI address for local access */ smi_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.lun = 0; printk(KERN_INFO PFX "Powering down via ATCA power command\n"); /* * Power down */ send_msg.netfn = IPMI_NETFN_ATCA; send_msg.cmd = IPMI_ATCA_SET_POWER_CMD; data[0] = IPMI_PICMG_ID; data[1] = 0; /* FRU id */ data[2] = 0; /* Power Level */ data[3] = 0; /* Don't change saved presets */ send_msg.data = data; send_msg.data_len = sizeof (data); rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) { printk(KERN_ERR PFX "Unable to send ATCA powerdown message," " IPMI error 0x%x\n", rv); goto out; } out: return; }
static void ipmi_poweroff_chassis (ipmi_user_t user) { struct ipmi_system_interface_addr smi_addr; struct kernel_ipmi_msg send_msg; int rv; unsigned char data[1]; /* * Configure IPMI address for local access */ smi_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.lun = 0; printk(KERN_INFO PFX "Powering down via IPMI chassis control command\n"); /* * Power down */ send_msg.netfn = IPMI_NETFN_CHASSIS_REQUEST; send_msg.cmd = IPMI_CHASSIS_CONTROL_CMD; data[0] = 0; /* Power down */ send_msg.data = data; send_msg.data_len = sizeof(data); rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) { printk(KERN_ERR PFX "Unable to send chassis powerdown message," " IPMI error 0x%x\n", rv); goto out; } out: return; }
static void ipmi_poweroff_cpi1 (ipmi_user_t user) { struct ipmi_system_interface_addr smi_addr; struct ipmi_ipmb_addr ipmb_addr; struct kernel_ipmi_msg send_msg; int rv; unsigned char data[1]; int slot; unsigned char hotswap_ipmb; unsigned char aer_addr; unsigned char aer_lun; /* * Configure IPMI address for local access */ smi_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.lun = 0; printk(KERN_INFO PFX "Powering down via CPI1 power command\n"); /* * Get IPMI ipmb address */ send_msg.netfn = IPMI_NETFN_OEM_8 >> 2; send_msg.cmd = OEM_GRP_CMD_GET_SLOT_GA; send_msg.data = NULL; send_msg.data_len = 0; rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) goto out; slot = halt_recv_msg.msg.data[1]; hotswap_ipmb = (slot > 9) ? (0xb0 + 2 * slot) : (0xae + 2 * slot); /* * Get active event receiver */ send_msg.netfn = IPMI_NETFN_SENSOR_EVT >> 2; send_msg.cmd = IPMI_CMD_GET_EVENT_RECEIVER; send_msg.data = NULL; send_msg.data_len = 0; rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) goto out; aer_addr = halt_recv_msg.msg.data[1]; aer_lun = halt_recv_msg.msg.data[2]; /* * Setup IPMB address target instead of local target */ ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE; ipmb_addr.channel = 0; ipmb_addr.slave_addr = aer_addr; ipmb_addr.lun = aer_lun; /* * Send request hotswap control to remove blade from dpv */ send_msg.netfn = IPMI_NETFN_OEM_8 >> 2; send_msg.cmd = OEM_GRP_CMD_REQUEST_HOTSWAP_CTRL; send_msg.data = &hotswap_ipmb; send_msg.data_len = 1; ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &ipmb_addr, &send_msg); /* * Set reset asserted */ send_msg.netfn = IPMI_NETFN_OEM_1 >> 2; send_msg.cmd = OEM_GRP_CMD_SET_RESET_STATE; send_msg.data = data; data[0] = 1; /* Reset asserted state */ send_msg.data_len = 1; rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) goto out; /* * Power down */ send_msg.netfn = IPMI_NETFN_OEM_1 >> 2; send_msg.cmd = OEM_GRP_CMD_SET_POWER_STATE; send_msg.data = data; data[0] = 1; /* Power down state */ send_msg.data_len = 1; rv = ipmi_request_in_rc_mode(user, (struct ipmi_addr *) &smi_addr, &send_msg); if (rv) goto out; out: return; }