Lines Matching refs:cdev
184 static int set_schib(struct ccw_device *cdev, u32 mme, int mbfc, in set_schib() argument
187 struct subchannel *sch = to_subchannel(cdev->dev.parent); in set_schib()
228 static int set_schib_wait(struct ccw_device *cdev, u32 mme, in set_schib_wait() argument
234 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
235 if (!cdev->private->cmb) { in set_schib_wait()
250 ret = set_schib(cdev, mme, mbfc, address); in set_schib_wait()
254 if (cdev->private->state != DEV_STATE_ONLINE) { in set_schib_wait()
260 cdev->private->state = DEV_STATE_CMFCHANGE; in set_schib_wait()
262 cdev->private->cmb_wait = set_data; in set_schib_wait()
264 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
267 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
270 if (cdev->private->state == DEV_STATE_CMFCHANGE) in set_schib_wait()
271 cdev->private->state = DEV_STATE_ONLINE; in set_schib_wait()
273 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
275 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
276 cdev->private->cmb_wait = NULL; in set_schib_wait()
281 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
285 void retry_set_schib(struct ccw_device *cdev) in retry_set_schib() argument
289 set_data = cdev->private->cmb_wait; in retry_set_schib()
295 set_data->ret = set_schib(cdev, set_data->mme, set_data->mbfc, in retry_set_schib()
301 static int cmf_copy_block(struct ccw_device *cdev) in cmf_copy_block() argument
308 sch = to_subchannel(cdev->dev.parent); in cmf_copy_block()
321 cmb_data = cdev->private->cmb; in cmf_copy_block()
353 static int cmf_cmb_copy_wait(struct ccw_device *cdev) in cmf_cmb_copy_wait() argument
359 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
360 if (!cdev->private->cmb) { in cmf_cmb_copy_wait()
372 ret = cmf_copy_block(cdev); in cmf_cmb_copy_wait()
376 if (cdev->private->state != DEV_STATE_ONLINE) { in cmf_cmb_copy_wait()
381 cdev->private->state = DEV_STATE_CMFUPDATE; in cmf_cmb_copy_wait()
383 cdev->private->cmb_wait = copy_block; in cmf_cmb_copy_wait()
385 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
388 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
391 if (cdev->private->state == DEV_STATE_CMFUPDATE) in cmf_cmb_copy_wait()
392 cdev->private->state = DEV_STATE_ONLINE; in cmf_cmb_copy_wait()
394 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
396 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
397 cdev->private->cmb_wait = NULL; in cmf_cmb_copy_wait()
402 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
406 void cmf_retry_copy_block(struct ccw_device *cdev) in cmf_retry_copy_block() argument
410 copy_block = cdev->private->cmb_wait; in cmf_retry_copy_block()
416 copy_block->ret = cmf_copy_block(cdev); in cmf_retry_copy_block()
421 static void cmf_generic_reset(struct ccw_device *cdev) in cmf_generic_reset() argument
425 spin_lock_irq(cdev->ccwlock); in cmf_generic_reset()
426 cmb_data = cdev->private->cmb; in cmf_generic_reset()
436 cdev->private->cmb_start_time = get_tod_clock(); in cmf_generic_reset()
437 spin_unlock_irq(cdev->ccwlock); in cmf_generic_reset()
508 static int alloc_cmb_single(struct ccw_device *cdev, in alloc_cmb_single() argument
515 spin_lock_irq(cdev->ccwlock); in alloc_cmb_single()
516 if (!list_empty(&cdev->private->cmb_list)) { in alloc_cmb_single()
540 list_add_tail(&cdev->private->cmb_list, &node->cmb_list); in alloc_cmb_single()
542 cdev->private->cmb = cmb_data; in alloc_cmb_single()
545 spin_unlock_irq(cdev->ccwlock); in alloc_cmb_single()
549 static int alloc_cmb(struct ccw_device *cdev) in alloc_cmb() argument
595 ret = alloc_cmb_single(cdev, cmb_data); in alloc_cmb()
605 static void free_cmb(struct ccw_device *cdev) in free_cmb() argument
611 spin_lock_irq(cdev->ccwlock); in free_cmb()
613 priv = cdev->private; in free_cmb()
628 spin_unlock_irq(cdev->ccwlock); in free_cmb()
632 static int set_cmb(struct ccw_device *cdev, u32 mme) in set_cmb() argument
638 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmb()
639 if (!cdev->private->cmb) { in set_cmb()
640 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
643 cmb_data = cdev->private->cmb; in set_cmb()
645 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
647 return set_schib_wait(cdev, mme, 0, offset); in set_cmb()
650 static u64 read_cmb(struct ccw_device *cdev, int index) in read_cmb() argument
657 ret = cmf_cmb_copy_wait(cdev); in read_cmb()
661 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmb()
662 if (!cdev->private->cmb) { in read_cmb()
666 cmb = ((struct cmb_data *)cdev->private->cmb)->last_block; in read_cmb()
696 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmb()
700 static int readall_cmb(struct ccw_device *cdev, struct cmbdata *data) in readall_cmb() argument
708 ret = cmf_cmb_copy_wait(cdev); in readall_cmb()
711 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmb()
712 cmb_data = cdev->private->cmb; in readall_cmb()
722 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmb()
747 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmb()
751 static void reset_cmb(struct ccw_device *cdev) in reset_cmb() argument
753 cmf_generic_reset(cdev); in reset_cmb()
803 static int alloc_cmbe(struct ccw_device *cdev) in alloc_cmbe() argument
825 spin_lock_irq(cdev->ccwlock); in alloc_cmbe()
826 if (cdev->private->cmb) in alloc_cmbe()
829 cdev->private->cmb = cmb_data; in alloc_cmbe()
834 list_add_tail(&cdev->private->cmb_list, &cmb_area.list); in alloc_cmbe()
836 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
841 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
853 static void free_cmbe(struct ccw_device *cdev) in free_cmbe() argument
858 spin_lock_irq(cdev->ccwlock); in free_cmbe()
859 cmb_data = cdev->private->cmb; in free_cmbe()
860 cdev->private->cmb = NULL; in free_cmbe()
868 list_del_init(&cdev->private->cmb_list); in free_cmbe()
871 spin_unlock_irq(cdev->ccwlock); in free_cmbe()
875 static int set_cmbe(struct ccw_device *cdev, u32 mme) in set_cmbe() argument
881 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmbe()
882 if (!cdev->private->cmb) { in set_cmbe()
883 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
886 cmb_data = cdev->private->cmb; in set_cmbe()
888 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
890 return set_schib_wait(cdev, mme, 1, mba); in set_cmbe()
894 static u64 read_cmbe(struct ccw_device *cdev, int index) in read_cmbe() argument
902 ret = cmf_cmb_copy_wait(cdev); in read_cmbe()
906 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmbe()
907 cmb_data = cdev->private->cmb; in read_cmbe()
948 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmbe()
952 static int readall_cmbe(struct ccw_device *cdev, struct cmbdata *data) in readall_cmbe() argument
960 ret = cmf_cmb_copy_wait(cdev); in readall_cmbe()
963 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmbe()
964 cmb_data = cdev->private->cmb; in readall_cmbe()
973 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmbe()
1003 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmbe()
1007 static void reset_cmbe(struct ccw_device *cdev) in reset_cmbe() argument
1009 cmf_generic_reset(cdev); in reset_cmbe()
1034 struct ccw_device *cdev; in cmb_show_avg_sample_interval() local
1039 cdev = to_ccwdev(dev); in cmb_show_avg_sample_interval()
1040 count = cmf_read(cdev, cmb_sample_count); in cmb_show_avg_sample_interval()
1041 spin_lock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
1042 cmb_data = cdev->private->cmb; in cmb_show_avg_sample_interval()
1045 cdev->private->cmb_start_time; in cmb_show_avg_sample_interval()
1050 spin_unlock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
1155 struct ccw_device *cdev = to_ccwdev(dev); in cmb_enable_show() local
1158 spin_lock_irq(cdev->ccwlock); in cmb_enable_show()
1159 enabled = !!cdev->private->cmb; in cmb_enable_show()
1160 spin_unlock_irq(cdev->ccwlock); in cmb_enable_show()
1169 struct ccw_device *cdev = to_ccwdev(dev); in cmb_enable_store() local
1179 ret = disable_cmf(cdev); in cmb_enable_store()
1182 ret = enable_cmf(cdev); in cmb_enable_store()
1192 int ccw_set_cmf(struct ccw_device *cdev, int enable) in ccw_set_cmf() argument
1194 return cmbops->set(cdev, enable ? 2 : 0); in ccw_set_cmf()
1206 int enable_cmf(struct ccw_device *cdev) in enable_cmf() argument
1210 device_lock(&cdev->dev); in enable_cmf()
1211 get_device(&cdev->dev); in enable_cmf()
1212 ret = cmbops->alloc(cdev); in enable_cmf()
1215 cmbops->reset(cdev); in enable_cmf()
1216 ret = sysfs_create_group(&cdev->dev.kobj, cmbops->attr_group); in enable_cmf()
1218 cmbops->free(cdev); in enable_cmf()
1221 ret = cmbops->set(cdev, 2); in enable_cmf()
1223 sysfs_remove_group(&cdev->dev.kobj, cmbops->attr_group); in enable_cmf()
1224 cmbops->free(cdev); in enable_cmf()
1228 put_device(&cdev->dev); in enable_cmf()
1230 device_unlock(&cdev->dev); in enable_cmf()
1243 int __disable_cmf(struct ccw_device *cdev) in __disable_cmf() argument
1247 ret = cmbops->set(cdev, 0); in __disable_cmf()
1251 sysfs_remove_group(&cdev->dev.kobj, cmbops->attr_group); in __disable_cmf()
1252 cmbops->free(cdev); in __disable_cmf()
1253 put_device(&cdev->dev); in __disable_cmf()
1267 int disable_cmf(struct ccw_device *cdev) in disable_cmf() argument
1271 device_lock(&cdev->dev); in disable_cmf()
1272 ret = __disable_cmf(cdev); in disable_cmf()
1273 device_unlock(&cdev->dev); in disable_cmf()
1288 u64 cmf_read(struct ccw_device *cdev, int index) in cmf_read() argument
1290 return cmbops->read(cdev, index); in cmf_read()
1303 int cmf_readall(struct ccw_device *cdev, struct cmbdata *data) in cmf_readall() argument
1305 return cmbops->readall(cdev, data); in cmf_readall()
1309 int cmf_reenable(struct ccw_device *cdev) in cmf_reenable() argument
1311 cmbops->reset(cdev); in cmf_reenable()
1312 return cmbops->set(cdev, 2); in cmf_reenable()