Lines Matching refs:cdev
175 static int set_schib(struct ccw_device *cdev, u32 mme, int mbfc, in set_schib() argument
178 struct subchannel *sch = to_subchannel(cdev->dev.parent); in set_schib()
211 static int set_schib_wait(struct ccw_device *cdev, u32 mme, in set_schib_wait() argument
217 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
218 if (!cdev->private->cmb) in set_schib_wait()
221 ret = set_schib(cdev, mme, mbfc, address); in set_schib_wait()
226 if (cdev->private->state != DEV_STATE_ONLINE) in set_schib_wait()
235 cdev->private->state = DEV_STATE_CMFCHANGE; in set_schib_wait()
236 cdev->private->cmb_wait = &set_data; in set_schib_wait()
237 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
242 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
246 if (cdev->private->state == DEV_STATE_CMFCHANGE) in set_schib_wait()
247 cdev->private->state = DEV_STATE_ONLINE; in set_schib_wait()
250 cdev->private->cmb_wait = NULL; in set_schib_wait()
253 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
257 void retry_set_schib(struct ccw_device *cdev) in retry_set_schib() argument
259 struct set_schib_struct *set_data = cdev->private->cmb_wait; in retry_set_schib()
264 set_data->ret = set_schib(cdev, set_data->mme, set_data->mbfc, in retry_set_schib()
269 static int cmf_copy_block(struct ccw_device *cdev) in cmf_copy_block() argument
271 struct subchannel *sch = to_subchannel(cdev->dev.parent); in cmf_copy_block()
286 cmb_data = cdev->private->cmb; in cmf_copy_block()
298 static int cmf_cmb_copy_wait(struct ccw_device *cdev) in cmf_cmb_copy_wait() argument
303 spin_lock_irq(cdev->ccwlock); in cmf_cmb_copy_wait()
304 if (!cdev->private->cmb) in cmf_cmb_copy_wait()
307 ret = cmf_copy_block(cdev); in cmf_cmb_copy_wait()
311 if (cdev->private->state != DEV_STATE_ONLINE) in cmf_cmb_copy_wait()
317 cdev->private->state = DEV_STATE_CMFUPDATE; in cmf_cmb_copy_wait()
318 cdev->private->cmb_wait = ©_block; in cmf_cmb_copy_wait()
319 spin_unlock_irq(cdev->ccwlock); in cmf_cmb_copy_wait()
323 spin_lock_irq(cdev->ccwlock); in cmf_cmb_copy_wait()
327 if (cdev->private->state == DEV_STATE_CMFUPDATE) in cmf_cmb_copy_wait()
328 cdev->private->state = DEV_STATE_ONLINE; in cmf_cmb_copy_wait()
331 cdev->private->cmb_wait = NULL; in cmf_cmb_copy_wait()
334 spin_unlock_irq(cdev->ccwlock); in cmf_cmb_copy_wait()
338 void cmf_retry_copy_block(struct ccw_device *cdev) in cmf_retry_copy_block() argument
340 struct copy_block_struct *copy_block = cdev->private->cmb_wait; in cmf_retry_copy_block()
345 copy_block->ret = cmf_copy_block(cdev); in cmf_retry_copy_block()
349 static void cmf_generic_reset(struct ccw_device *cdev) in cmf_generic_reset() argument
353 spin_lock_irq(cdev->ccwlock); in cmf_generic_reset()
354 cmb_data = cdev->private->cmb; in cmf_generic_reset()
364 cdev->private->cmb_start_time = get_tod_clock(); in cmf_generic_reset()
365 spin_unlock_irq(cdev->ccwlock); in cmf_generic_reset()
436 static int alloc_cmb_single(struct ccw_device *cdev, in alloc_cmb_single() argument
443 spin_lock_irq(cdev->ccwlock); in alloc_cmb_single()
444 if (!list_empty(&cdev->private->cmb_list)) { in alloc_cmb_single()
468 list_add_tail(&cdev->private->cmb_list, &node->cmb_list); in alloc_cmb_single()
470 cdev->private->cmb = cmb_data; in alloc_cmb_single()
473 spin_unlock_irq(cdev->ccwlock); in alloc_cmb_single()
477 static int alloc_cmb(struct ccw_device *cdev) in alloc_cmb() argument
523 ret = alloc_cmb_single(cdev, cmb_data); in alloc_cmb()
533 static void free_cmb(struct ccw_device *cdev) in free_cmb() argument
539 spin_lock_irq(cdev->ccwlock); in free_cmb()
541 priv = cdev->private; in free_cmb()
556 spin_unlock_irq(cdev->ccwlock); in free_cmb()
560 static int set_cmb(struct ccw_device *cdev, u32 mme) in set_cmb() argument
566 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmb()
567 if (!cdev->private->cmb) { in set_cmb()
568 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
571 cmb_data = cdev->private->cmb; in set_cmb()
573 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
575 return set_schib_wait(cdev, mme, 0, offset); in set_cmb()
595 static u64 read_cmb(struct ccw_device *cdev, int index) in read_cmb() argument
603 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmb()
604 cmb_data = cdev->private->cmb; in read_cmb()
614 cdev->private->cmb_start_time); in read_cmb()
642 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmb()
646 static int readall_cmb(struct ccw_device *cdev, struct cmbdata *data) in readall_cmb() argument
654 ret = cmf_cmb_copy_wait(cdev); in readall_cmb()
657 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmb()
658 cmb_data = cdev->private->cmb; in readall_cmb()
668 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmb()
692 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmb()
696 static void reset_cmb(struct ccw_device *cdev) in reset_cmb() argument
698 cmf_generic_reset(cdev); in reset_cmb()
701 static int cmf_enabled(struct ccw_device *cdev) in cmf_enabled() argument
705 spin_lock_irq(cdev->ccwlock); in cmf_enabled()
706 enabled = !!cdev->private->cmb; in cmf_enabled()
707 spin_unlock_irq(cdev->ccwlock); in cmf_enabled()
759 static int alloc_cmbe(struct ccw_device *cdev) in alloc_cmbe() argument
781 spin_lock_irq(cdev->ccwlock); in alloc_cmbe()
782 if (cdev->private->cmb) in alloc_cmbe()
785 cdev->private->cmb = cmb_data; in alloc_cmbe()
790 list_add_tail(&cdev->private->cmb_list, &cmb_area.list); in alloc_cmbe()
792 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
797 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
809 static void free_cmbe(struct ccw_device *cdev) in free_cmbe() argument
814 spin_lock_irq(cdev->ccwlock); in free_cmbe()
815 cmb_data = cdev->private->cmb; in free_cmbe()
816 cdev->private->cmb = NULL; in free_cmbe()
824 list_del_init(&cdev->private->cmb_list); in free_cmbe()
827 spin_unlock_irq(cdev->ccwlock); in free_cmbe()
831 static int set_cmbe(struct ccw_device *cdev, u32 mme) in set_cmbe() argument
837 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmbe()
838 if (!cdev->private->cmb) { in set_cmbe()
839 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
842 cmb_data = cdev->private->cmb; in set_cmbe()
844 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
846 return set_schib_wait(cdev, mme, 1, mba); in set_cmbe()
849 static u64 read_cmbe(struct ccw_device *cdev, int index) in read_cmbe() argument
857 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmbe()
858 cmb_data = cdev->private->cmb; in read_cmbe()
868 cdev->private->cmb_start_time); in read_cmbe()
902 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmbe()
906 static int readall_cmbe(struct ccw_device *cdev, struct cmbdata *data) in readall_cmbe() argument
914 ret = cmf_cmb_copy_wait(cdev); in readall_cmbe()
917 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmbe()
918 cmb_data = cdev->private->cmb; in readall_cmbe()
927 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmbe()
956 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmbe()
960 static void reset_cmbe(struct ccw_device *cdev) in reset_cmbe() argument
962 cmf_generic_reset(cdev); in reset_cmbe()
987 struct ccw_device *cdev = to_ccwdev(dev); in cmb_show_avg_sample_interval() local
991 count = cmf_read(cdev, cmb_sample_count); in cmb_show_avg_sample_interval()
992 spin_lock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
994 interval = get_tod_clock() - cdev->private->cmb_start_time; in cmb_show_avg_sample_interval()
999 spin_unlock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
1080 struct ccw_device *cdev = to_ccwdev(dev); in cmb_enable_show() local
1082 return sprintf(buf, "%d\n", cmf_enabled(cdev)); in cmb_enable_show()
1089 struct ccw_device *cdev = to_ccwdev(dev); in cmb_enable_store() local
1099 ret = disable_cmf(cdev); in cmb_enable_store()
1102 ret = enable_cmf(cdev); in cmb_enable_store()
1112 int ccw_set_cmf(struct ccw_device *cdev, int enable) in ccw_set_cmf() argument
1114 return cmbops->set(cdev, enable ? 2 : 0); in ccw_set_cmf()
1128 int enable_cmf(struct ccw_device *cdev) in enable_cmf() argument
1132 device_lock(&cdev->dev); in enable_cmf()
1133 if (cmf_enabled(cdev)) { in enable_cmf()
1134 cmbops->reset(cdev); in enable_cmf()
1137 get_device(&cdev->dev); in enable_cmf()
1138 ret = cmbops->alloc(cdev); in enable_cmf()
1141 cmbops->reset(cdev); in enable_cmf()
1142 ret = sysfs_create_group(&cdev->dev.kobj, cmbops->attr_group); in enable_cmf()
1144 cmbops->free(cdev); in enable_cmf()
1147 ret = cmbops->set(cdev, 2); in enable_cmf()
1149 sysfs_remove_group(&cdev->dev.kobj, cmbops->attr_group); in enable_cmf()
1150 cmbops->free(cdev); in enable_cmf()
1154 put_device(&cdev->dev); in enable_cmf()
1156 device_unlock(&cdev->dev); in enable_cmf()
1169 int __disable_cmf(struct ccw_device *cdev) in __disable_cmf() argument
1173 ret = cmbops->set(cdev, 0); in __disable_cmf()
1177 sysfs_remove_group(&cdev->dev.kobj, cmbops->attr_group); in __disable_cmf()
1178 cmbops->free(cdev); in __disable_cmf()
1179 put_device(&cdev->dev); in __disable_cmf()
1193 int disable_cmf(struct ccw_device *cdev) in disable_cmf() argument
1197 device_lock(&cdev->dev); in disable_cmf()
1198 ret = __disable_cmf(cdev); in disable_cmf()
1199 device_unlock(&cdev->dev); in disable_cmf()
1214 u64 cmf_read(struct ccw_device *cdev, int index) in cmf_read() argument
1216 return cmbops->read(cdev, index); in cmf_read()
1229 int cmf_readall(struct ccw_device *cdev, struct cmbdata *data) in cmf_readall() argument
1231 return cmbops->readall(cdev, data); in cmf_readall()
1235 int cmf_reenable(struct ccw_device *cdev) in cmf_reenable() argument
1237 cmbops->reset(cdev); in cmf_reenable()
1238 return cmbops->set(cdev, 2); in cmf_reenable()