Lines Matching defs:iidev
72 static bool valid_ipmb(struct ipmi_ipmb_dev *iidev)
74 u8 *msg = iidev->rcvmsg;
77 if (iidev->overrun)
81 if (iidev->rcvlen < 7)
88 if (iidev->rcvlen < 8)
94 if (ipmb_checksum(msg + 3, iidev->rcvlen - 3) != 0)
100 static void ipmi_ipmb_check_msg_done(struct ipmi_ipmb_dev *iidev)
103 u8 *msg = iidev->rcvmsg;
107 if (iidev->rcvlen == 0)
109 if (!valid_ipmb(iidev))
116 if (!iidev->ready)
126 spin_lock_irqsave(&iidev->lock, flags);
127 if (iidev->working_msg) {
129 bool xmit_rsp = (iidev->working_msg->data[0] >> 2) & 1;
137 if (!xmit_rsp && seq == iidev->curr_seq) {
138 iidev->curr_seq = (iidev->curr_seq + 1) & 0x3f;
140 imsg = iidev->working_msg;
141 iidev->working_msg = NULL;
144 spin_unlock_irqrestore(&iidev->lock, flags);
156 memcpy(imsg->rsp + 1, msg + 3, iidev->rcvlen - 4);
157 imsg->rsp_size = iidev->rcvlen - 3;
164 memcpy(imsg->rsp + 1, msg + 5, iidev->rcvlen - 6);
165 imsg->rsp_size = iidev->rcvlen - 5;
167 ipmi_smi_msg_received(iidev->intf, imsg);
169 up(&iidev->got_rsp);
172 iidev->overrun = false;
173 iidev->rcvlen = 0;
184 struct ipmi_ipmb_dev *iidev = i2c_get_clientdata(client);
188 ipmi_ipmb_check_msg_done(iidev);
193 iidev->rcvmsg[0] = client->addr << 1;
194 iidev->rcvlen = 1;
198 if (iidev->rcvlen >= sizeof(iidev->rcvmsg))
199 iidev->overrun = true;
201 iidev->rcvmsg[iidev->rcvlen++] = *val;
206 ipmi_ipmb_check_msg_done(iidev);
216 static void ipmi_ipmb_send_response(struct ipmi_ipmb_dev *iidev,
243 ipmi_smi_msg_received(iidev->intf, msg);
246 static void ipmi_ipmb_format_for_xmit(struct ipmi_ipmb_dev *iidev,
250 iidev->xmitmsg[0] = msg->data[1];
251 iidev->xmitmsg[1] = msg->data[0];
252 memcpy(iidev->xmitmsg + 4, msg->data + 2, msg->data_size - 2);
253 iidev->xmitlen = msg->data_size + 2;
255 iidev->xmitmsg[0] = iidev->bmcaddr;
256 iidev->xmitmsg[1] = msg->data[0];
257 iidev->xmitmsg[4] = 0;
258 memcpy(iidev->xmitmsg + 5, msg->data + 1, msg->data_size - 1);
259 iidev->xmitlen = msg->data_size + 4;
261 iidev->xmitmsg[3] = iidev->slave->addr << 1;
264 iidev->xmitmsg[4] = ((iidev->xmitmsg[4] & 0x03) |
265 (iidev->curr_seq << 2));
268 iidev->xmitmsg[2] = ipmb_checksum(iidev->xmitmsg, 2);
269 iidev->xmitmsg[iidev->xmitlen] =
270 ipmb_checksum(iidev->xmitmsg + 3, iidev->xmitlen - 3);
271 iidev->xmitlen++;
276 struct ipmi_ipmb_dev *iidev = data;
286 ret = down_interruptible(&iidev->wake_thread);
287 if (iidev->stopping)
292 spin_lock_irqsave(&iidev->lock, flags);
293 if (iidev->next_msg) {
294 msg = iidev->next_msg;
295 iidev->next_msg = NULL;
297 spin_unlock_irqrestore(&iidev->lock, flags);
301 ipmi_ipmb_format_for_xmit(iidev, msg);
304 i2c_msg.len = iidev->xmitlen - 1;
306 ipmi_ipmb_send_response(iidev, msg,
311 i2c_msg.addr = iidev->xmitmsg[0] >> 1;
313 i2c_msg.buf = iidev->xmitmsg + 1;
316 iidev->working_msg = msg;
318 ret = i2c_transfer(iidev->client->adapter, &i2c_msg, 1);
326 iidev->working_msg = NULL;
327 ipmi_ipmb_send_response(iidev, msg,
332 iidev->working_msg = NULL;
333 ipmi_ipmb_send_response(iidev, msg, IPMI_BUS_ERR);
338 ret = down_timeout(&iidev->got_rsp,
339 msecs_to_jiffies(iidev->retry_time_ms));
345 spin_lock_irqsave(&iidev->lock, flags);
346 msg = iidev->working_msg;
347 iidev->working_msg = NULL;
348 spin_unlock_irqrestore(&iidev->lock, flags);
358 down(&iidev->got_rsp);
359 } else if (msg && ++retries <= iidev->max_retries) {
360 spin_lock_irqsave(&iidev->lock, flags);
361 iidev->working_msg = msg;
362 spin_unlock_irqrestore(&iidev->lock, flags);
367 ipmi_ipmb_send_response(iidev, msg, IPMI_TIMEOUT_ERR);
370 if (iidev->next_msg)
372 ipmi_ipmb_send_response(iidev, iidev->next_msg, 0xff);
380 struct ipmi_ipmb_dev *iidev = send_info;
382 iidev->intf = new_intf;
383 iidev->ready = true;
387 static void ipmi_ipmb_stop_thread(struct ipmi_ipmb_dev *iidev)
389 if (iidev->thread) {
390 struct task_struct *t = iidev->thread;
392 iidev->thread = NULL;
393 iidev->stopping = true;
394 up(&iidev->wake_thread);
395 up(&iidev->got_rsp);
402 struct ipmi_ipmb_dev *iidev = send_info;
404 ipmi_ipmb_stop_thread(iidev);
410 struct ipmi_ipmb_dev *iidev = send_info;
413 spin_lock_irqsave(&iidev->lock, flags);
414 BUG_ON(iidev->next_msg);
416 iidev->next_msg = msg;
417 spin_unlock_irqrestore(&iidev->lock, flags);
419 up(&iidev->wake_thread);
427 static void ipmi_ipmb_cleanup(struct ipmi_ipmb_dev *iidev)
429 if (iidev->slave) {
430 i2c_slave_unregister(iidev->slave);
431 if (iidev->slave != iidev->client)
432 i2c_unregister_device(iidev->slave);
434 iidev->slave = NULL;
435 iidev->client = NULL;
436 ipmi_ipmb_stop_thread(iidev);
441 struct ipmi_ipmb_dev *iidev = i2c_get_clientdata(client);
443 ipmi_ipmb_cleanup(iidev);
444 ipmi_unregister_smi(iidev->intf);
450 struct ipmi_ipmb_dev *iidev;
456 iidev = devm_kzalloc(&client->dev, sizeof(*iidev), GFP_KERNEL);
457 if (!iidev)
460 if (of_property_read_u8(dev->of_node, "bmcaddr", &iidev->bmcaddr) != 0)
461 iidev->bmcaddr = bmcaddr;
462 if (iidev->bmcaddr == 0 || iidev->bmcaddr & 1) {
465 "Invalid bmc address value %2.2x\n", iidev->bmcaddr);
470 &iidev->retry_time_ms) != 0)
471 iidev->retry_time_ms = retry_time_ms;
474 &iidev->max_retries) != 0)
475 iidev->max_retries = max_retries;
488 iidev->client = client;
505 i2c_set_clientdata(slave, iidev);
509 i2c_set_clientdata(client, iidev);
515 iidev->slave = slave;
518 iidev->handlers.flags = IPMI_SMI_CAN_HANDLE_IPMB_DIRECT;
519 iidev->handlers.start_processing = ipmi_ipmb_start_processing;
520 iidev->handlers.shutdown = ipmi_ipmb_shutdown;
521 iidev->handlers.sender = ipmi_ipmb_sender;
522 iidev->handlers.request_events = ipmi_ipmb_request_events;
524 spin_lock_init(&iidev->lock);
525 sema_init(&iidev->wake_thread, 0);
526 sema_init(&iidev->got_rsp, 0);
528 iidev->thread = kthread_run(ipmi_ipmb_thread, iidev,
530 if (IS_ERR(iidev->thread)) {
531 rv = PTR_ERR(iidev->thread);
537 rv = ipmi_register_smi(&iidev->handlers,
538 iidev,
540 iidev->bmcaddr);
549 ipmi_ipmb_cleanup(iidev);