Lines Matching defs:ssif_bmc
45 * Recover ssif_bmc from busy state if it takes up to 500ms
135 struct ssif_bmc_ctx *ssif_bmc = to_ssif_bmc(file);
140 spin_lock_irqsave(&ssif_bmc->lock, flags);
141 while (!ssif_bmc->request_available) {
142 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
145 ret = wait_event_interruptible(ssif_bmc->wait_queue,
146 ssif_bmc->request_available);
149 spin_lock_irqsave(&ssif_bmc->lock, flags);
153 sizeof_field(struct ipmi_ssif_msg, len) + ssif_bmc->request.len,
155 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
159 sizeof_field(struct ipmi_ssif_msg, len) + ssif_bmc->request.len,
161 memcpy(&msg, &ssif_bmc->request, count);
162 ssif_bmc->request_available = false;
163 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
175 struct ssif_bmc_ctx *ssif_bmc = to_ssif_bmc(file);
189 spin_lock_irqsave(&ssif_bmc->lock, flags);
190 while (ssif_bmc->response_in_progress) {
191 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
194 ret = wait_event_interruptible(ssif_bmc->wait_queue,
195 !ssif_bmc->response_in_progress);
198 spin_lock_irqsave(&ssif_bmc->lock, flags);
206 ret = (ssif_bmc->response_timer_inited) ? 0 : -EINVAL;
210 del_timer(&ssif_bmc->response_timer);
211 ssif_bmc->response_timer_inited = false;
213 memcpy(&ssif_bmc->response, &msg, count);
214 ssif_bmc->is_singlepart_read = (msg.len <= MAX_PAYLOAD_PER_TRANSACTION);
216 ssif_bmc->response_in_progress = true;
218 /* ssif_bmc not busy */
219 ssif_bmc->busy = false;
222 memset(&ssif_bmc->request, 0, sizeof(struct ipmi_ssif_msg));
224 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
231 struct ssif_bmc_ctx *ssif_bmc = to_ssif_bmc(file);
234 spin_lock_irq(&ssif_bmc->lock);
235 if (!ssif_bmc->running)
236 ssif_bmc->running = 1;
239 spin_unlock_irq(&ssif_bmc->lock);
246 struct ssif_bmc_ctx *ssif_bmc = to_ssif_bmc(file);
249 poll_wait(file, &ssif_bmc->wait_queue, wait);
251 spin_lock_irq(&ssif_bmc->lock);
253 if (ssif_bmc->request_available)
256 spin_unlock_irq(&ssif_bmc->lock);
263 struct ssif_bmc_ctx *ssif_bmc = to_ssif_bmc(file);
265 spin_lock_irq(&ssif_bmc->lock);
266 ssif_bmc->running = 0;
267 spin_unlock_irq(&ssif_bmc->lock);
284 /* Called with ssif_bmc->lock held. */
285 static void complete_response(struct ssif_bmc_ctx *ssif_bmc)
288 ssif_bmc->response.len = 0;
289 ssif_bmc->response_in_progress = false;
290 ssif_bmc->nbytes_processed = 0;
291 ssif_bmc->remain_len = 0;
292 ssif_bmc->busy = false;
293 memset(&ssif_bmc->part_buf, 0, sizeof(struct ssif_part_buffer));
294 wake_up_all(&ssif_bmc->wait_queue);
299 struct ssif_bmc_ctx *ssif_bmc = from_timer(ssif_bmc, t, response_timer);
302 spin_lock_irqsave(&ssif_bmc->lock, flags);
305 if (!ssif_bmc->response_in_progress) {
306 /* Recover ssif_bmc from busy */
307 ssif_bmc->busy = false;
308 ssif_bmc->response_timer_inited = false;
310 ssif_bmc->aborting = true;
313 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
316 /* Called with ssif_bmc->lock held. */
317 static void handle_request(struct ssif_bmc_ctx *ssif_bmc)
319 /* set ssif_bmc to busy waiting for response */
320 ssif_bmc->busy = true;
322 ssif_bmc->request_available = true;
324 memset(&ssif_bmc->response, 0, sizeof(struct ipmi_ssif_msg));
326 wake_up_all(&ssif_bmc->wait_queue);
329 if (!ssif_bmc->response_timer_inited) {
330 timer_setup(&ssif_bmc->response_timer, response_timeout, 0);
331 ssif_bmc->response_timer_inited = true;
333 mod_timer(&ssif_bmc->response_timer, jiffies + msecs_to_jiffies(RESPONSE_TIMEOUT));
352 static void set_singlepart_response_buffer(struct ssif_bmc_ctx *ssif_bmc)
354 struct ssif_part_buffer *part = &ssif_bmc->part_buf;
356 part->address = GET_8BIT_ADDR(ssif_bmc->client->addr);
357 part->length = (u8)ssif_bmc->response.len;
361 memcpy(&part->payload[0], &ssif_bmc->response.payload[0], part->length);
364 static void set_multipart_response_buffer(struct ssif_bmc_ctx *ssif_bmc)
366 struct ssif_part_buffer *part = &ssif_bmc->part_buf;
369 part->address = GET_8BIT_ADDR(ssif_bmc->client->addr);
377 ssif_bmc->nbytes_processed = 0;
378 ssif_bmc->block_num = 0;
381 ssif_bmc->remain_len = ssif_bmc->response.len - part_len;
386 memcpy(&part->payload[2], &ssif_bmc->response.payload[0], part_len);
394 if (ssif_bmc->remain_len <= MAX_IPMI_DATA_PER_MIDDLE_TRANSACTION) {
404 part->length = ssif_bmc->remain_len + 1;
405 part_len = ssif_bmc->remain_len;
406 ssif_bmc->block_num = 0xFF;
407 part->payload[0] = ssif_bmc->block_num;
417 part->payload[0] = ssif_bmc->block_num;
418 ssif_bmc->block_num++;
421 ssif_bmc->remain_len -= part_len;
422 memcpy(&part->payload[1], ssif_bmc->response.payload + ssif_bmc->nbytes_processed,
428 dev_err(&ssif_bmc->client->dev, "%s: Unexpected SMBus command 0x%x\n",
433 ssif_bmc->nbytes_processed += part_len;
458 static void handle_read_processed(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
460 struct ssif_part_buffer *part = &ssif_bmc->part_buf;
465 else if (part->index == part->length && ssif_bmc->pec_support)
473 static void handle_write_received(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
480 if (ssif_bmc->msg_idx < 1 || ssif_bmc->msg_idx > MAX_TRANSACTION)
483 if (ssif_bmc->msg_idx == 1) {
484 ssif_bmc->part_buf.length = *val;
485 ssif_bmc->part_buf.index = 0;
487 ssif_bmc->part_buf.payload[ssif_bmc->part_buf.index++] = *val;
490 ssif_bmc->msg_idx++;
493 static bool validate_request_part(struct ssif_bmc_ctx *ssif_bmc)
495 struct ssif_part_buffer *part = &ssif_bmc->part_buf;
502 ssif_bmc->pec_support = false;
513 ssif_bmc->pec_support = true;
515 addr = GET_8BIT_ADDR(ssif_bmc->client->addr);
526 * prevent ssif_bmc driver broken in this case.
538 static void process_request_part(struct ssif_bmc_ctx *ssif_bmc)
540 struct ssif_part_buffer *part = &ssif_bmc->part_buf;
546 ssif_bmc->request.len = part->length;
547 memcpy(ssif_bmc->request.payload, part->payload, part->length);
551 ssif_bmc->request.len = 0;
556 len = ssif_bmc->request.len + part->length;
559 dev_warn(&ssif_bmc->client->dev,
562 ssif_bmc->aborting = true;
564 memcpy(ssif_bmc->request.payload + ssif_bmc->request.len,
566 ssif_bmc->request.len += part->length;
571 dev_err(&ssif_bmc->client->dev, "%s: Unexpected SMBus command 0x%x\n",
577 static void process_smbus_cmd(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
580 ssif_bmc->part_buf.smbus_cmd = *val;
581 ssif_bmc->msg_idx = 1;
582 memset(&ssif_bmc->part_buf.payload[0], 0, MAX_PAYLOAD_PER_TRANSACTION);
590 if (ssif_bmc->response_in_progress)
591 complete_response(ssif_bmc);
594 if (ssif_bmc->aborting)
595 ssif_bmc->aborting = false;
599 static void on_read_requested_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
601 if (ssif_bmc->state == SSIF_READY ||
602 ssif_bmc->state == SSIF_START ||
603 ssif_bmc->state == SSIF_REQ_RECVING ||
604 ssif_bmc->state == SSIF_RES_SENDING) {
605 dev_warn(&ssif_bmc->client->dev,
607 __func__, state_to_string(ssif_bmc->state));
608 ssif_bmc->state = SSIF_ABORTING;
612 } else if (ssif_bmc->state == SSIF_SMBUS_CMD) {
613 if (!supported_read_cmd(ssif_bmc->part_buf.smbus_cmd)) {
614 dev_warn(&ssif_bmc->client->dev, "Warn: Unknown SMBus read command=0x%x",
615 ssif_bmc->part_buf.smbus_cmd);
616 ssif_bmc->aborting = true;
619 if (ssif_bmc->aborting)
620 ssif_bmc->state = SSIF_ABORTING;
622 ssif_bmc->state = SSIF_RES_SENDING;
625 ssif_bmc->msg_idx = 0;
628 if (!ssif_bmc->response_in_progress || ssif_bmc->state == SSIF_ABORTING) {
633 if (ssif_bmc->is_singlepart_read)
634 set_singlepart_response_buffer(ssif_bmc);
636 set_multipart_response_buffer(ssif_bmc);
638 calculate_response_part_pec(&ssif_bmc->part_buf);
639 ssif_bmc->part_buf.index = 0;
640 *val = ssif_bmc->part_buf.length;
643 static void on_read_processed_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
645 if (ssif_bmc->state == SSIF_READY ||
646 ssif_bmc->state == SSIF_START ||
647 ssif_bmc->state == SSIF_REQ_RECVING ||
648 ssif_bmc->state == SSIF_SMBUS_CMD) {
649 dev_warn(&ssif_bmc->client->dev,
651 __func__, state_to_string(ssif_bmc->state));
652 ssif_bmc->state = SSIF_ABORTING;
658 if (!ssif_bmc->response_in_progress || ssif_bmc->state == SSIF_ABORTING) {
663 handle_read_processed(ssif_bmc, val);
666 static void on_write_requested_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
668 if (ssif_bmc->state == SSIF_READY || ssif_bmc->state == SSIF_SMBUS_CMD) {
669 ssif_bmc->state = SSIF_START;
671 } else if (ssif_bmc->state == SSIF_START ||
672 ssif_bmc->state == SSIF_REQ_RECVING ||
673 ssif_bmc->state == SSIF_RES_SENDING) {
674 dev_warn(&ssif_bmc->client->dev,
676 __func__, state_to_string(ssif_bmc->state));
677 ssif_bmc->state = SSIF_ABORTING;
681 ssif_bmc->msg_idx = 0;
682 ssif_bmc->part_buf.address = *val;
685 static void on_write_received_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
687 if (ssif_bmc->state == SSIF_READY ||
688 ssif_bmc->state == SSIF_RES_SENDING) {
689 dev_warn(&ssif_bmc->client->dev,
691 __func__, state_to_string(ssif_bmc->state));
692 ssif_bmc->state = SSIF_ABORTING;
694 } else if (ssif_bmc->state == SSIF_START) {
695 ssif_bmc->state = SSIF_SMBUS_CMD;
697 } else if (ssif_bmc->state == SSIF_SMBUS_CMD) {
698 if (!supported_write_cmd(ssif_bmc->part_buf.smbus_cmd)) {
699 dev_warn(&ssif_bmc->client->dev, "Warn: Unknown SMBus write command=0x%x",
700 ssif_bmc->part_buf.smbus_cmd);
701 ssif_bmc->aborting = true;
704 if (ssif_bmc->aborting)
705 ssif_bmc->state = SSIF_ABORTING;
707 ssif_bmc->state = SSIF_REQ_RECVING;
711 if (ssif_bmc->state == SSIF_REQ_RECVING)
712 handle_write_received(ssif_bmc, val);
713 else if (ssif_bmc->state == SSIF_SMBUS_CMD)
714 process_smbus_cmd(ssif_bmc, val);
717 static void on_stop_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val)
719 if (ssif_bmc->state == SSIF_READY ||
720 ssif_bmc->state == SSIF_START ||
721 ssif_bmc->state == SSIF_SMBUS_CMD ||
722 ssif_bmc->state == SSIF_ABORTING) {
723 dev_warn(&ssif_bmc->client->dev,
725 __func__, state_to_string(ssif_bmc->state));
726 ssif_bmc->state = SSIF_READY;
728 } else if (ssif_bmc->state == SSIF_REQ_RECVING) {
729 if (validate_request_part(ssif_bmc)) {
730 process_request_part(ssif_bmc);
731 if (ssif_bmc->part_buf.smbus_cmd == SSIF_IPMI_SINGLEPART_WRITE ||
732 ssif_bmc->part_buf.smbus_cmd == SSIF_IPMI_MULTIPART_WRITE_END)
733 handle_request(ssif_bmc);
734 ssif_bmc->state = SSIF_READY;
741 dev_err(&ssif_bmc->client->dev, "Error: invalid pec\n");
742 ssif_bmc->aborting = true;
744 } else if (ssif_bmc->state == SSIF_RES_SENDING) {
745 if (ssif_bmc->is_singlepart_read || ssif_bmc->block_num == 0xFF)
747 complete_response(ssif_bmc);
748 ssif_bmc->state = SSIF_READY;
752 ssif_bmc->msg_idx = 0;
761 struct ssif_bmc_ctx *ssif_bmc = i2c_get_clientdata(client);
764 spin_lock_irqsave(&ssif_bmc->lock, flags);
768 on_read_requested_event(ssif_bmc, val);
772 on_write_requested_event(ssif_bmc, val);
776 on_read_processed_event(ssif_bmc, val);
780 on_write_received_event(ssif_bmc, val);
784 on_stop_event(ssif_bmc, val);
788 dev_warn(&ssif_bmc->client->dev, "Warn: Unknown i2c slave event\n");
792 if (!ssif_bmc->aborting && ssif_bmc->busy)
795 spin_unlock_irqrestore(&ssif_bmc->lock, flags);
802 struct ssif_bmc_ctx *ssif_bmc;
805 ssif_bmc = devm_kzalloc(&client->dev, sizeof(*ssif_bmc), GFP_KERNEL);
806 if (!ssif_bmc)
809 spin_lock_init(&ssif_bmc->lock);
811 init_waitqueue_head(&ssif_bmc->wait_queue);
812 ssif_bmc->request_available = false;
813 ssif_bmc->response_in_progress = false;
814 ssif_bmc->busy = false;
815 ssif_bmc->response_timer_inited = false;
818 ssif_bmc->miscdev.minor = MISC_DYNAMIC_MINOR;
819 ssif_bmc->miscdev.name = DEVICE_NAME;
820 ssif_bmc->miscdev.fops = &ssif_bmc_fops;
821 ssif_bmc->miscdev.parent = &client->dev;
822 ret = misc_register(&ssif_bmc->miscdev);
826 ssif_bmc->client = client;
827 ssif_bmc->client->flags |= I2C_CLIENT_SLAVE;
830 i2c_set_clientdata(client, ssif_bmc);
833 misc_deregister(&ssif_bmc->miscdev);
840 struct ssif_bmc_ctx *ssif_bmc = i2c_get_clientdata(client);
843 misc_deregister(&ssif_bmc->miscdev);