Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dot_command.c
Go to the documentation of this file.
1 /*
2  * IBM ASM Service Processor Device Driver
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  * Copyright (C) IBM Corporation, 2004
19  *
20  * Author: Max Asböck <[email protected]>
21  *
22  */
23 
24 #include "ibmasm.h"
25 #include "dot_command.h"
26 
31 void ibmasm_receive_message(struct service_processor *sp, void *message, int message_size)
32 {
33  u32 size;
34  struct dot_command_header *header = (struct dot_command_header *)message;
35 
36  if (message_size == 0)
37  return;
38 
39  size = get_dot_command_size(message);
40  if (size == 0)
41  return;
42 
43  if (size > message_size)
44  size = message_size;
45 
46  switch (header->type) {
47  case sp_event:
48  ibmasm_receive_event(sp, message, size);
49  break;
51  ibmasm_receive_command_response(sp, message, size);
52  break;
53  case sp_heartbeat:
54  ibmasm_receive_heartbeat(sp, message, size);
55  break;
56  default:
57  dev_err(sp->dev, "Received unknown message from service processor\n");
58  }
59 }
60 
61 
62 #define INIT_BUFFER_SIZE 32
63 
64 
69 {
70  struct command *command;
71  struct dot_command_header *header;
72  u8 *vpd_command;
73  u8 *vpd_data;
74  int result = 0;
75 
76  command = ibmasm_new_command(sp, INIT_BUFFER_SIZE);
77  if (command == NULL)
78  return -ENOMEM;
79 
80  header = (struct dot_command_header *)command->buffer;
81  header->type = sp_write;
82  header->command_size = 4;
83  header->data_size = 16;
84  header->status = 0;
85  header->reserved = 0;
86 
87  vpd_command = command->buffer + sizeof(struct dot_command_header);
88  vpd_command[0] = 0x4;
89  vpd_command[1] = 0x3;
90  vpd_command[2] = 0x5;
91  vpd_command[3] = 0xa;
92 
93  vpd_data = vpd_command + header->command_size;
94  vpd_data[0] = 0;
95  strcat(vpd_data, IBMASM_DRIVER_VPD);
96  vpd_data[10] = 0;
97  vpd_data[15] = 0;
98 
99  ibmasm_exec_command(sp, command);
101 
102  if (command->status != IBMASM_CMD_COMPLETE)
103  result = -ENODEV;
104 
105  command_put(command);
106 
107  return result;
108 }
109 
112  unsigned char command[3];
113  unsigned char data;
114 };
115 
124 int ibmasm_send_os_state(struct service_processor *sp, int os_state)
125 {
126  struct command *cmd;
127  struct os_state_command *os_state_cmd;
128  int result = 0;
129 
130  cmd = ibmasm_new_command(sp, sizeof(struct os_state_command));
131  if (cmd == NULL)
132  return -ENOMEM;
133 
134  os_state_cmd = (struct os_state_command *)cmd->buffer;
135  os_state_cmd->header.type = sp_write;
136  os_state_cmd->header.command_size = 3;
137  os_state_cmd->header.data_size = 1;
138  os_state_cmd->header.status = 0;
139  os_state_cmd->command[0] = 4;
140  os_state_cmd->command[1] = 3;
141  os_state_cmd->command[2] = 6;
142  os_state_cmd->data = os_state;
143 
144  ibmasm_exec_command(sp, cmd);
146 
147  if (cmd->status != IBMASM_CMD_COMPLETE)
148  result = -ENODEV;
149 
150  command_put(cmd);
151  return result;
152 }