Lines Matching refs:ap_dev

326 static int ap_queue_enable_interruption(struct ap_device *ap_dev, void *ind)  in ap_queue_enable_interruption()  argument
330 status = ap_queue_interruption_control(ap_dev->qid, ind); in ap_queue_enable_interruption()
340 AP_QID_DEVICE(ap_dev->qid)); in ap_queue_enable_interruption()
539 static enum ap_wait ap_sm_nop(struct ap_device *ap_dev) in ap_sm_nop() argument
551 static struct ap_queue_status ap_sm_recv(struct ap_device *ap_dev) in ap_sm_recv() argument
556 status = __ap_recv(ap_dev->qid, &ap_dev->reply->psmid, in ap_sm_recv()
557 ap_dev->reply->message, ap_dev->reply->length); in ap_sm_recv()
561 ap_dev->queue_count--; in ap_sm_recv()
562 if (ap_dev->queue_count > 0) in ap_sm_recv()
563 mod_timer(&ap_dev->timeout, in ap_sm_recv()
564 jiffies + ap_dev->drv->request_timeout); in ap_sm_recv()
565 list_for_each_entry(ap_msg, &ap_dev->pendingq, list) { in ap_sm_recv()
566 if (ap_msg->psmid != ap_dev->reply->psmid) in ap_sm_recv()
569 ap_dev->pendingq_count--; in ap_sm_recv()
570 ap_msg->receive(ap_dev, ap_msg, ap_dev->reply); in ap_sm_recv()
574 if (!status.queue_empty || ap_dev->queue_count <= 0) in ap_sm_recv()
577 atomic_sub(ap_dev->queue_count, &ap_poll_requests); in ap_sm_recv()
578 ap_dev->queue_count = 0; in ap_sm_recv()
579 list_splice_init(&ap_dev->pendingq, &ap_dev->requestq); in ap_sm_recv()
580 ap_dev->requestq_count += ap_dev->pendingq_count; in ap_sm_recv()
581 ap_dev->pendingq_count = 0; in ap_sm_recv()
595 static enum ap_wait ap_sm_read(struct ap_device *ap_dev) in ap_sm_read() argument
599 status = ap_sm_recv(ap_dev); in ap_sm_read()
602 if (ap_dev->queue_count > 0) { in ap_sm_read()
603 ap_dev->state = AP_STATE_WORKING; in ap_sm_read()
606 ap_dev->state = AP_STATE_IDLE; in ap_sm_read()
609 if (ap_dev->queue_count > 0) in ap_sm_read()
611 ap_dev->state = AP_STATE_IDLE; in ap_sm_read()
614 ap_dev->state = AP_STATE_BORKED; in ap_sm_read()
625 static enum ap_wait ap_sm_write(struct ap_device *ap_dev) in ap_sm_write() argument
630 if (ap_dev->requestq_count <= 0) in ap_sm_write()
633 ap_msg = list_entry(ap_dev->requestq.next, struct ap_message, list); in ap_sm_write()
634 status = __ap_send(ap_dev->qid, ap_msg->psmid, in ap_sm_write()
639 ap_dev->queue_count++; in ap_sm_write()
640 if (ap_dev->queue_count == 1) in ap_sm_write()
641 mod_timer(&ap_dev->timeout, in ap_sm_write()
642 jiffies + ap_dev->drv->request_timeout); in ap_sm_write()
643 list_move_tail(&ap_msg->list, &ap_dev->pendingq); in ap_sm_write()
644 ap_dev->requestq_count--; in ap_sm_write()
645 ap_dev->pendingq_count++; in ap_sm_write()
646 if (ap_dev->queue_count < ap_dev->queue_depth) { in ap_sm_write()
647 ap_dev->state = AP_STATE_WORKING; in ap_sm_write()
652 ap_dev->state = AP_STATE_QUEUE_FULL; in ap_sm_write()
655 ap_dev->state = AP_STATE_RESET_WAIT; in ap_sm_write()
660 ap_dev->requestq_count--; in ap_sm_write()
662 ap_msg->receive(ap_dev, ap_msg, NULL); in ap_sm_write()
665 ap_dev->state = AP_STATE_BORKED; in ap_sm_write()
676 static enum ap_wait ap_sm_read_write(struct ap_device *ap_dev) in ap_sm_read_write() argument
678 return min(ap_sm_read(ap_dev), ap_sm_write(ap_dev)); in ap_sm_read_write()
687 static enum ap_wait ap_sm_reset(struct ap_device *ap_dev) in ap_sm_reset() argument
691 status = ap_reset_queue(ap_dev->qid); in ap_sm_reset()
695 ap_dev->state = AP_STATE_RESET_WAIT; in ap_sm_reset()
696 ap_dev->interrupt = AP_INTR_DISABLED; in ap_sm_reset()
704 ap_dev->state = AP_STATE_BORKED; in ap_sm_reset()
715 static enum ap_wait ap_sm_reset_wait(struct ap_device *ap_dev) in ap_sm_reset_wait() argument
720 if (ap_dev->queue_count > 0) in ap_sm_reset_wait()
722 status = ap_sm_recv(ap_dev); in ap_sm_reset_wait()
725 status = ap_test_queue(ap_dev->qid, &info); in ap_sm_reset_wait()
730 ap_queue_enable_interruption(ap_dev, in ap_sm_reset_wait()
732 ap_dev->state = AP_STATE_SETIRQ_WAIT; in ap_sm_reset_wait()
734 ap_dev->state = (ap_dev->queue_count > 0) ? in ap_sm_reset_wait()
744 ap_dev->state = AP_STATE_BORKED; in ap_sm_reset_wait()
755 static enum ap_wait ap_sm_setirq_wait(struct ap_device *ap_dev) in ap_sm_setirq_wait() argument
760 if (ap_dev->queue_count > 0) in ap_sm_setirq_wait()
762 status = ap_sm_recv(ap_dev); in ap_sm_setirq_wait()
765 status = ap_test_queue(ap_dev->qid, &info); in ap_sm_setirq_wait()
769 ap_dev->interrupt = AP_INTR_ENABLED; in ap_sm_setirq_wait()
770 ap_dev->state = (ap_dev->queue_count > 0) ? in ap_sm_setirq_wait()
776 if (ap_dev->queue_count > 0) in ap_sm_setirq_wait()
782 ap_dev->state = AP_STATE_BORKED; in ap_sm_setirq_wait()
825 static inline enum ap_wait ap_sm_event(struct ap_device *ap_dev, in ap_sm_event() argument
828 return ap_jumptable[ap_dev->state][event](ap_dev); in ap_sm_event()
831 static inline enum ap_wait ap_sm_event_loop(struct ap_device *ap_dev, in ap_sm_event_loop() argument
836 while ((wait = ap_sm_event(ap_dev, event)) == AP_WAIT_AGAIN) in ap_sm_event_loop()
849 struct ap_device *ap_dev = (struct ap_device *) data; in ap_request_timeout() local
853 spin_lock_bh(&ap_dev->lock); in ap_request_timeout()
854 ap_sm_wait(ap_sm_event(ap_dev, AP_EVENT_TIMEOUT)); in ap_request_timeout()
855 spin_unlock_bh(&ap_dev->lock); in ap_request_timeout()
890 struct ap_device *ap_dev; in ap_tasklet_fn() local
901 list_for_each_entry(ap_dev, &ap_device_list, list) { in ap_tasklet_fn()
902 spin_lock_bh(&ap_dev->lock); in ap_tasklet_fn()
903 wait = min(wait, ap_sm_event_loop(ap_dev, AP_EVENT_POLL)); in ap_tasklet_fn()
904 spin_unlock_bh(&ap_dev->lock); in ap_tasklet_fn()
976 void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg) in ap_queue_message() argument
982 spin_lock_bh(&ap_dev->lock); in ap_queue_message()
984 list_add_tail(&ap_msg->list, &ap_dev->requestq); in ap_queue_message()
985 ap_dev->requestq_count++; in ap_queue_message()
986 ap_dev->total_request_count++; in ap_queue_message()
988 ap_sm_wait(ap_sm_event_loop(ap_dev, AP_EVENT_POLL)); in ap_queue_message()
989 spin_unlock_bh(&ap_dev->lock); in ap_queue_message()
1003 void ap_cancel_message(struct ap_device *ap_dev, struct ap_message *ap_msg) in ap_cancel_message() argument
1007 spin_lock_bh(&ap_dev->lock); in ap_cancel_message()
1009 list_for_each_entry(tmp, &ap_dev->pendingq, list) in ap_cancel_message()
1011 ap_dev->pendingq_count--; in ap_cancel_message()
1014 ap_dev->requestq_count--; in ap_cancel_message()
1018 spin_unlock_bh(&ap_dev->lock); in ap_cancel_message()
1028 struct ap_device *ap_dev = to_ap_dev(dev); in ap_hwtype_show() local
1029 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->device_type); in ap_hwtype_show()
1037 struct ap_device *ap_dev = to_ap_dev(dev); in ap_raw_hwtype_show() local
1039 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->raw_hwtype); in ap_raw_hwtype_show()
1047 struct ap_device *ap_dev = to_ap_dev(dev); in ap_depth_show() local
1048 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->queue_depth); in ap_depth_show()
1056 struct ap_device *ap_dev = to_ap_dev(dev); in ap_request_count_show() local
1059 spin_lock_bh(&ap_dev->lock); in ap_request_count_show()
1060 rc = snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->total_request_count); in ap_request_count_show()
1061 spin_unlock_bh(&ap_dev->lock); in ap_request_count_show()
1070 struct ap_device *ap_dev = to_ap_dev(dev); in ap_requestq_count_show() local
1073 spin_lock_bh(&ap_dev->lock); in ap_requestq_count_show()
1074 rc = snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->requestq_count); in ap_requestq_count_show()
1075 spin_unlock_bh(&ap_dev->lock); in ap_requestq_count_show()
1084 struct ap_device *ap_dev = to_ap_dev(dev); in ap_pendingq_count_show() local
1087 spin_lock_bh(&ap_dev->lock); in ap_pendingq_count_show()
1088 rc = snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->pendingq_count); in ap_pendingq_count_show()
1089 spin_unlock_bh(&ap_dev->lock); in ap_pendingq_count_show()
1098 struct ap_device *ap_dev = to_ap_dev(dev); in ap_reset_show() local
1101 spin_lock_bh(&ap_dev->lock); in ap_reset_show()
1102 switch (ap_dev->state) { in ap_reset_show()
1114 spin_unlock_bh(&ap_dev->lock); in ap_reset_show()
1123 struct ap_device *ap_dev = to_ap_dev(dev); in ap_interrupt_show() local
1126 spin_lock_bh(&ap_dev->lock); in ap_interrupt_show()
1127 if (ap_dev->state == AP_STATE_SETIRQ_WAIT) in ap_interrupt_show()
1129 else if (ap_dev->interrupt == AP_INTR_ENABLED) in ap_interrupt_show()
1133 spin_unlock_bh(&ap_dev->lock); in ap_interrupt_show()
1150 struct ap_device *ap_dev = to_ap_dev(dev); in ap_functions_show() local
1151 return snprintf(buf, PAGE_SIZE, "0x%08X\n", ap_dev->functions); in ap_functions_show()
1182 struct ap_device *ap_dev = to_ap_dev(dev); in ap_bus_match() local
1192 (id->dev_type != ap_dev->device_type)) in ap_bus_match()
1209 struct ap_device *ap_dev = to_ap_dev(dev); in ap_uevent() local
1212 if (!ap_dev) in ap_uevent()
1216 retval = add_uevent_var(env, "DEV_TYPE=%04X", ap_dev->device_type); in ap_uevent()
1221 retval = add_uevent_var(env, "MODALIAS=ap:t%02X", ap_dev->device_type); in ap_uevent()
1228 struct ap_device *ap_dev = to_ap_dev(dev); in ap_dev_suspend() local
1231 spin_lock_bh(&ap_dev->lock); in ap_dev_suspend()
1232 ap_dev->state = AP_STATE_SUSPEND_WAIT; in ap_dev_suspend()
1233 while (ap_sm_event(ap_dev, AP_EVENT_POLL) != AP_WAIT_NONE) in ap_dev_suspend()
1235 ap_dev->state = AP_STATE_BORKED; in ap_dev_suspend()
1236 spin_unlock_bh(&ap_dev->lock); in ap_dev_suspend()
1319 struct ap_device *ap_dev = to_ap_dev(dev); in ap_device_probe() local
1323 ap_dev->drv = ap_drv; in ap_device_probe()
1324 rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; in ap_device_probe()
1326 ap_dev->drv = NULL; in ap_device_probe()
1336 static void __ap_flush_queue(struct ap_device *ap_dev) in __ap_flush_queue() argument
1340 list_for_each_entry_safe(ap_msg, next, &ap_dev->pendingq, list) { in __ap_flush_queue()
1342 ap_dev->pendingq_count--; in __ap_flush_queue()
1344 ap_msg->receive(ap_dev, ap_msg, NULL); in __ap_flush_queue()
1346 list_for_each_entry_safe(ap_msg, next, &ap_dev->requestq, list) { in __ap_flush_queue()
1348 ap_dev->requestq_count--; in __ap_flush_queue()
1350 ap_msg->receive(ap_dev, ap_msg, NULL); in __ap_flush_queue()
1354 void ap_flush_queue(struct ap_device *ap_dev) in ap_flush_queue() argument
1356 spin_lock_bh(&ap_dev->lock); in ap_flush_queue()
1357 __ap_flush_queue(ap_dev); in ap_flush_queue()
1358 spin_unlock_bh(&ap_dev->lock); in ap_flush_queue()
1364 struct ap_device *ap_dev = to_ap_dev(dev); in ap_device_remove() local
1365 struct ap_driver *ap_drv = ap_dev->drv; in ap_device_remove()
1367 ap_flush_queue(ap_dev); in ap_device_remove()
1368 del_timer_sync(&ap_dev->timeout); in ap_device_remove()
1370 list_del_init(&ap_dev->list); in ap_device_remove()
1373 ap_drv->remove(ap_dev); in ap_device_remove()
1374 spin_lock_bh(&ap_dev->lock); in ap_device_remove()
1375 atomic_sub(ap_dev->queue_count, &ap_poll_requests); in ap_device_remove()
1376 spin_unlock_bh(&ap_dev->lock); in ap_device_remove()
1612 struct ap_device *ap_dev; in ap_scan_bus() local
1631 ap_dev = to_ap_dev(dev); in ap_scan_bus()
1632 spin_lock_bh(&ap_dev->lock); in ap_scan_bus()
1634 ap_dev->state = AP_STATE_BORKED; in ap_scan_bus()
1635 borked = ap_dev->state == AP_STATE_BORKED; in ap_scan_bus()
1636 spin_unlock_bh(&ap_dev->lock); in ap_scan_bus()
1645 ap_dev = kzalloc(sizeof(*ap_dev), GFP_KERNEL); in ap_scan_bus()
1646 if (!ap_dev) in ap_scan_bus()
1648 ap_dev->qid = qid; in ap_scan_bus()
1649 ap_dev->state = AP_STATE_RESET_START; in ap_scan_bus()
1650 ap_dev->interrupt = AP_INTR_DISABLED; in ap_scan_bus()
1651 ap_dev->queue_depth = queue_depth; in ap_scan_bus()
1652 ap_dev->raw_hwtype = device_type; in ap_scan_bus()
1653 ap_dev->device_type = device_type; in ap_scan_bus()
1654 ap_dev->functions = device_functions; in ap_scan_bus()
1655 spin_lock_init(&ap_dev->lock); in ap_scan_bus()
1656 INIT_LIST_HEAD(&ap_dev->pendingq); in ap_scan_bus()
1657 INIT_LIST_HEAD(&ap_dev->requestq); in ap_scan_bus()
1658 INIT_LIST_HEAD(&ap_dev->list); in ap_scan_bus()
1659 setup_timer(&ap_dev->timeout, ap_request_timeout, in ap_scan_bus()
1660 (unsigned long) ap_dev); in ap_scan_bus()
1662 ap_dev->device.bus = &ap_bus_type; in ap_scan_bus()
1663 ap_dev->device.parent = ap_root_device; in ap_scan_bus()
1664 rc = dev_set_name(&ap_dev->device, "card%02x", in ap_scan_bus()
1665 AP_QID_DEVICE(ap_dev->qid)); in ap_scan_bus()
1667 kfree(ap_dev); in ap_scan_bus()
1672 list_add(&ap_dev->list, &ap_device_list); in ap_scan_bus()
1675 spin_lock_bh(&ap_dev->lock); in ap_scan_bus()
1676 ap_sm_wait(ap_sm_event(ap_dev, AP_EVENT_POLL)); in ap_scan_bus()
1677 spin_unlock_bh(&ap_dev->lock); in ap_scan_bus()
1679 ap_dev->device.release = ap_device_release; in ap_scan_bus()
1680 rc = device_register(&ap_dev->device); in ap_scan_bus()
1682 spin_lock_bh(&ap_dev->lock); in ap_scan_bus()
1683 list_del_init(&ap_dev->list); in ap_scan_bus()
1684 spin_unlock_bh(&ap_dev->lock); in ap_scan_bus()
1685 put_device(&ap_dev->device); in ap_scan_bus()
1689 rc = sysfs_create_group(&ap_dev->device.kobj, in ap_scan_bus()
1692 device_unregister(&ap_dev->device); in ap_scan_bus()