@@ -67,21 +67,21 @@ bool mei_hbm_cl_addr_equal(struct mei_cl *cl, void *buf)
6767 */
6868void mei_host_start_message (struct mei_device * dev )
6969{
70- struct mei_msg_hdr * mei_hdr ;
70+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg . hdr ;
7171 struct hbm_host_version_request * start_req ;
7272 const size_t len = sizeof (struct hbm_host_version_request );
7373
74- mei_hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
74+ mei_hbm_hdr (mei_hdr , len );
7575
7676 /* host start message */
77- start_req = (struct hbm_host_version_request * )& dev -> wr_msg_buf [ 1 ] ;
77+ start_req = (struct hbm_host_version_request * )dev -> wr_msg . data ;
7878 memset (start_req , 0 , len );
7979 start_req -> hbm_cmd = HOST_START_REQ_CMD ;
8080 start_req -> host_version .major_version = HBM_MAJOR_VERSION ;
8181 start_req -> host_version .minor_version = HBM_MINOR_VERSION ;
8282
8383 dev -> recvd_msg = false;
84- if (mei_write_message (dev , mei_hdr , ( unsigned char * ) start_req )) {
84+ if (mei_write_message (dev , mei_hdr , dev -> wr_msg . data )) {
8585 dev_dbg (& dev -> pdev -> dev , "write send version message to FW fail.\n" );
8686 dev -> dev_state = MEI_DEV_RESETING ;
8787 mei_reset (dev , 1 );
@@ -100,17 +100,17 @@ void mei_host_start_message(struct mei_device *dev)
100100 */
101101void mei_host_enum_clients_message (struct mei_device * dev )
102102{
103- struct mei_msg_hdr * mei_hdr ;
103+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg . hdr ;
104104 struct hbm_host_enum_request * enum_req ;
105105 const size_t len = sizeof (struct hbm_host_enum_request );
106106 /* enumerate clients */
107- mei_hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
107+ mei_hbm_hdr (mei_hdr , len );
108108
109- enum_req = (struct hbm_host_enum_request * ) & dev -> wr_msg_buf [ 1 ] ;
110- memset (enum_req , 0 , sizeof ( struct hbm_host_enum_request ) );
109+ enum_req = (struct hbm_host_enum_request * )dev -> wr_msg . data ;
110+ memset (enum_req , 0 , len );
111111 enum_req -> hbm_cmd = HOST_ENUM_REQ_CMD ;
112112
113- if (mei_write_message (dev , mei_hdr , ( unsigned char * ) enum_req )) {
113+ if (mei_write_message (dev , mei_hdr , dev -> wr_msg . data )) {
114114 dev -> dev_state = MEI_DEV_RESETING ;
115115 dev_dbg (& dev -> pdev -> dev , "write send enumeration request message to FW fail.\n" );
116116 mei_reset (dev , 1 );
@@ -124,7 +124,7 @@ void mei_host_enum_clients_message(struct mei_device *dev)
124124int mei_host_client_enumerate (struct mei_device * dev )
125125{
126126
127- struct mei_msg_hdr * mei_hdr ;
127+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg . hdr ;
128128 struct hbm_props_request * prop_req ;
129129 const size_t len = sizeof (struct hbm_props_request );
130130 unsigned long next_client_index ;
@@ -146,16 +146,16 @@ int mei_host_client_enumerate(struct mei_device *dev)
146146 dev -> me_clients [client_num ].client_id = next_client_index ;
147147 dev -> me_clients [client_num ].mei_flow_ctrl_creds = 0 ;
148148
149- mei_hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
150- prop_req = (struct hbm_props_request * )& dev -> wr_msg_buf [ 1 ] ;
149+ mei_hbm_hdr (mei_hdr , len );
150+ prop_req = (struct hbm_props_request * )dev -> wr_msg . data ;
151151
152152 memset (prop_req , 0 , sizeof (struct hbm_props_request ));
153153
154154
155155 prop_req -> hbm_cmd = HOST_CLIENT_PROPERTIES_REQ_CMD ;
156156 prop_req -> address = next_client_index ;
157157
158- if (mei_write_message (dev , mei_hdr , ( unsigned char * ) prop_req )) {
158+ if (mei_write_message (dev , mei_hdr , dev -> wr_msg . data )) {
159159 dev -> dev_state = MEI_DEV_RESETING ;
160160 dev_err (& dev -> pdev -> dev , "Properties request command failed\n" );
161161 mei_reset (dev , 1 );
@@ -169,6 +169,27 @@ int mei_host_client_enumerate(struct mei_device *dev)
169169 return 0 ;
170170}
171171
172+ /**
173+ * mei_hbm_stop_req_prepare - perpare stop request message
174+ *
175+ * @dev - mei device
176+ * @mei_hdr - mei message header
177+ * @data - hbm message body buffer
178+ */
179+ static void mei_hbm_stop_req_prepare (struct mei_device * dev ,
180+ struct mei_msg_hdr * mei_hdr , unsigned char * data )
181+ {
182+ struct hbm_host_stop_request * req =
183+ (struct hbm_host_stop_request * )data ;
184+ const size_t len = sizeof (struct hbm_host_stop_request );
185+
186+ mei_hbm_hdr (mei_hdr , len );
187+
188+ memset (req , 0 , len );
189+ req -> hbm_cmd = HOST_STOP_REQ_CMD ;
190+ req -> reason = DRIVER_STOP_REQUEST ;
191+ }
192+
172193/**
173194 * mei_send_flow_control - sends flow control to fw.
174195 *
@@ -179,17 +200,16 @@ int mei_host_client_enumerate(struct mei_device *dev)
179200 */
180201int mei_send_flow_control (struct mei_device * dev , struct mei_cl * cl )
181202{
182- struct mei_msg_hdr * mei_hdr ;
183- unsigned char * buf = (unsigned char * )& dev -> wr_msg_buf [1 ];
203+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg .hdr ;
184204 const size_t len = sizeof (struct hbm_flow_control );
185205
186- mei_hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
187- mei_hbm_cl_hdr (cl , MEI_FLOW_CONTROL_CMD , buf , len );
206+ mei_hbm_hdr (mei_hdr , len );
207+ mei_hbm_cl_hdr (cl , MEI_FLOW_CONTROL_CMD , dev -> wr_msg . data , len );
188208
189209 dev_dbg (& dev -> pdev -> dev , "sending flow control host client = %d, ME client = %d\n" ,
190210 cl -> host_client_id , cl -> me_client_id );
191211
192- return mei_write_message (dev , mei_hdr , buf );
212+ return mei_write_message (dev , mei_hdr , dev -> wr_msg . data );
193213}
194214
195215/**
@@ -202,14 +222,13 @@ int mei_send_flow_control(struct mei_device *dev, struct mei_cl *cl)
202222 */
203223int mei_disconnect (struct mei_device * dev , struct mei_cl * cl )
204224{
205- struct mei_msg_hdr * hdr ;
206- unsigned char * buf = (unsigned char * )& dev -> wr_msg_buf [1 ];
225+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg .hdr ;
207226 const size_t len = sizeof (struct hbm_client_connect_request );
208227
209- hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
210- mei_hbm_cl_hdr (cl , CLIENT_DISCONNECT_REQ_CMD , buf , len );
228+ mei_hbm_hdr (mei_hdr , len );
229+ mei_hbm_cl_hdr (cl , CLIENT_DISCONNECT_REQ_CMD , dev -> wr_msg . data , len );
211230
212- return mei_write_message (dev , hdr , buf );
231+ return mei_write_message (dev , mei_hdr , dev -> wr_msg . data );
213232}
214233
215234/**
@@ -222,14 +241,13 @@ int mei_disconnect(struct mei_device *dev, struct mei_cl *cl)
222241 */
223242int mei_connect (struct mei_device * dev , struct mei_cl * cl )
224243{
225- struct mei_msg_hdr * hdr ;
226- unsigned char * buf = (unsigned char * )& dev -> wr_msg_buf [1 ];
244+ struct mei_msg_hdr * mei_hdr = & dev -> wr_msg .hdr ;
227245 const size_t len = sizeof (struct hbm_client_connect_request );
228246
229- hdr = mei_hbm_hdr (& dev -> wr_msg_buf [ 0 ] , len );
230- mei_hbm_cl_hdr (cl , CLIENT_CONNECT_REQ_CMD , buf , len );
247+ mei_hbm_hdr (mei_hdr , len );
248+ mei_hbm_cl_hdr (cl , CLIENT_CONNECT_REQ_CMD , dev -> wr_msg . data , len );
231249
232- return mei_write_message (dev , hdr , buf );
250+ return mei_write_message (dev , mei_hdr , dev -> wr_msg . data );
233251}
234252
235253/**
@@ -257,9 +275,9 @@ static void mei_client_disconnect_request(struct mei_device *dev,
257275 dev -> iamthif_timer = 0 ;
258276
259277 /* prepare disconnect response */
260- ( void ) mei_hbm_hdr (( u32 * ) & dev -> wr_ext_msg .hdr , len );
278+ mei_hbm_hdr (& dev -> wr_ext_msg .hdr , len );
261279 mei_hbm_cl_hdr (cl , CLIENT_DISCONNECT_RES_CMD ,
262- & dev -> wr_ext_msg .data , len );
280+ dev -> wr_ext_msg .data , len );
263281 break ;
264282 }
265283 }
@@ -284,7 +302,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
284302 struct hbm_flow_control * flow_control ;
285303 struct hbm_props_response * props_res ;
286304 struct hbm_host_enum_response * enum_res ;
287- struct hbm_host_stop_request * stop_req ;
288305
289306 /* read the message to our buffer */
290307 BUG_ON (hdr -> length >= sizeof (dev -> rd_msg_buf ));
@@ -294,34 +311,27 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
294311 switch (mei_msg -> hbm_cmd ) {
295312 case HOST_START_RES_CMD :
296313 version_res = (struct hbm_host_version_response * )mei_msg ;
297- if (version_res -> host_version_supported ) {
298- dev -> version .major_version = HBM_MAJOR_VERSION ;
299- dev -> version .minor_version = HBM_MINOR_VERSION ;
300- if (dev -> dev_state == MEI_DEV_INIT_CLIENTS &&
301- dev -> init_clients_state == MEI_START_MESSAGE ) {
302- dev -> init_clients_timer = 0 ;
303- mei_host_enum_clients_message (dev );
304- } else {
305- dev -> recvd_msg = false;
306- dev_dbg (& dev -> pdev -> dev , "IMEI reset due to received host start response bus message.\n" );
307- mei_reset (dev , 1 );
308- return ;
309- }
310- } else {
311- u32 * buf = dev -> wr_msg_buf ;
312- const size_t len = sizeof (struct hbm_host_stop_request );
313-
314+ if (!version_res -> host_version_supported ) {
314315 dev -> version = version_res -> me_max_version ;
316+ dev_dbg (& dev -> pdev -> dev , "version mismatch.\n" );
315317
316- /* send stop message */
317- hdr = mei_hbm_hdr ( & buf [ 0 ], len );
318- stop_req = ( struct hbm_host_stop_request * ) & buf [ 1 ];
319- memset ( stop_req , 0 , len );
320- stop_req -> hbm_cmd = HOST_STOP_REQ_CMD ;
321- stop_req -> reason = DRIVER_STOP_REQUEST ;
318+ mei_hbm_stop_req_prepare ( dev , & dev -> wr_msg . hdr ,
319+ dev -> wr_msg . data );
320+ mei_write_message ( dev , & dev -> wr_msg . hdr ,
321+ dev -> wr_msg . data );
322+ return ;
323+ }
322324
323- mei_write_message (dev , hdr , (unsigned char * )stop_req );
324- dev_dbg (& dev -> pdev -> dev , "version mismatch.\n" );
325+ dev -> version .major_version = HBM_MAJOR_VERSION ;
326+ dev -> version .minor_version = HBM_MINOR_VERSION ;
327+ if (dev -> dev_state == MEI_DEV_INIT_CLIENTS &&
328+ dev -> init_clients_state == MEI_START_MESSAGE ) {
329+ dev -> init_clients_timer = 0 ;
330+ mei_host_enum_clients_message (dev );
331+ } else {
332+ dev -> recvd_msg = false;
333+ dev_dbg (& dev -> pdev -> dev , "reset due to received hbm: host start\n" );
334+ mei_reset (dev , 1 );
325335 return ;
326336 }
327337
@@ -417,18 +427,10 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
417427 break ;
418428
419429 case ME_STOP_REQ_CMD :
420- {
421- /* prepare stop request: sent in next interrupt event */
422430
423- const size_t len = sizeof (struct hbm_host_stop_request );
424-
425- hdr = mei_hbm_hdr ((u32 * )& dev -> wr_ext_msg .hdr , len );
426- stop_req = (struct hbm_host_stop_request * )& dev -> wr_ext_msg .data ;
427- memset (stop_req , 0 , len );
428- stop_req -> hbm_cmd = HOST_STOP_REQ_CMD ;
429- stop_req -> reason = DRIVER_STOP_REQUEST ;
431+ mei_hbm_stop_req_prepare (dev , & dev -> wr_ext_msg .hdr ,
432+ dev -> wr_ext_msg .data );
430433 break ;
431- }
432434 default :
433435 BUG ();
434436 break ;
0 commit comments