Lines Matching refs:cdev
186 static int set_schib(struct ccw_device *cdev, u32 mme, int mbfc, in set_schib() argument
191 sch = to_subchannel(cdev->dev.parent); in set_schib()
223 static int set_schib_wait(struct ccw_device *cdev, u32 mme, in set_schib_wait() argument
229 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
230 if (!cdev->private->cmb) { in set_schib_wait()
245 ret = set_schib(cdev, mme, mbfc, address); in set_schib_wait()
249 if (cdev->private->state != DEV_STATE_ONLINE) { in set_schib_wait()
255 cdev->private->state = DEV_STATE_CMFCHANGE; in set_schib_wait()
257 cdev->private->cmb_wait = set_data; in set_schib_wait()
259 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
262 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
265 if (cdev->private->state == DEV_STATE_CMFCHANGE) in set_schib_wait()
266 cdev->private->state = DEV_STATE_ONLINE; in set_schib_wait()
268 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
270 spin_lock_irq(cdev->ccwlock); in set_schib_wait()
271 cdev->private->cmb_wait = NULL; in set_schib_wait()
276 spin_unlock_irq(cdev->ccwlock); in set_schib_wait()
280 void retry_set_schib(struct ccw_device *cdev) in retry_set_schib() argument
284 set_data = cdev->private->cmb_wait; in retry_set_schib()
290 set_data->ret = set_schib(cdev, set_data->mme, set_data->mbfc, in retry_set_schib()
296 static int cmf_copy_block(struct ccw_device *cdev) in cmf_copy_block() argument
303 sch = to_subchannel(cdev->dev.parent); in cmf_copy_block()
316 cmb_data = cdev->private->cmb; in cmf_copy_block()
348 static int cmf_cmb_copy_wait(struct ccw_device *cdev) in cmf_cmb_copy_wait() argument
354 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
355 if (!cdev->private->cmb) { in cmf_cmb_copy_wait()
367 ret = cmf_copy_block(cdev); in cmf_cmb_copy_wait()
371 if (cdev->private->state != DEV_STATE_ONLINE) { in cmf_cmb_copy_wait()
376 cdev->private->state = DEV_STATE_CMFUPDATE; in cmf_cmb_copy_wait()
378 cdev->private->cmb_wait = copy_block; in cmf_cmb_copy_wait()
380 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
383 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
386 if (cdev->private->state == DEV_STATE_CMFUPDATE) in cmf_cmb_copy_wait()
387 cdev->private->state = DEV_STATE_ONLINE; in cmf_cmb_copy_wait()
389 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
391 spin_lock_irqsave(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
392 cdev->private->cmb_wait = NULL; in cmf_cmb_copy_wait()
397 spin_unlock_irqrestore(cdev->ccwlock, flags); in cmf_cmb_copy_wait()
401 void cmf_retry_copy_block(struct ccw_device *cdev) in cmf_retry_copy_block() argument
405 copy_block = cdev->private->cmb_wait; in cmf_retry_copy_block()
411 copy_block->ret = cmf_copy_block(cdev); in cmf_retry_copy_block()
416 static void cmf_generic_reset(struct ccw_device *cdev) in cmf_generic_reset() argument
420 spin_lock_irq(cdev->ccwlock); in cmf_generic_reset()
421 cmb_data = cdev->private->cmb; in cmf_generic_reset()
431 cdev->private->cmb_start_time = get_tod_clock(); in cmf_generic_reset()
432 spin_unlock_irq(cdev->ccwlock); in cmf_generic_reset()
503 static int alloc_cmb_single(struct ccw_device *cdev, in alloc_cmb_single() argument
510 spin_lock_irq(cdev->ccwlock); in alloc_cmb_single()
511 if (!list_empty(&cdev->private->cmb_list)) { in alloc_cmb_single()
535 list_add_tail(&cdev->private->cmb_list, &node->cmb_list); in alloc_cmb_single()
537 cdev->private->cmb = cmb_data; in alloc_cmb_single()
540 spin_unlock_irq(cdev->ccwlock); in alloc_cmb_single()
544 static int alloc_cmb(struct ccw_device *cdev) in alloc_cmb() argument
590 ret = alloc_cmb_single(cdev, cmb_data); in alloc_cmb()
600 static void free_cmb(struct ccw_device *cdev) in free_cmb() argument
606 spin_lock_irq(cdev->ccwlock); in free_cmb()
608 priv = cdev->private; in free_cmb()
630 spin_unlock_irq(cdev->ccwlock); in free_cmb()
634 static int set_cmb(struct ccw_device *cdev, u32 mme) in set_cmb() argument
640 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmb()
641 if (!cdev->private->cmb) { in set_cmb()
642 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
645 cmb_data = cdev->private->cmb; in set_cmb()
647 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmb()
649 return set_schib_wait(cdev, mme, 0, offset); in set_cmb()
652 static u64 read_cmb(struct ccw_device *cdev, int index) in read_cmb() argument
659 ret = cmf_cmb_copy_wait(cdev); in read_cmb()
663 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmb()
664 if (!cdev->private->cmb) { in read_cmb()
668 cmb = ((struct cmb_data *)cdev->private->cmb)->last_block; in read_cmb()
698 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmb()
702 static int readall_cmb(struct ccw_device *cdev, struct cmbdata *data) in readall_cmb() argument
710 ret = cmf_cmb_copy_wait(cdev); in readall_cmb()
713 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmb()
714 cmb_data = cdev->private->cmb; in readall_cmb()
724 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmb()
749 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmb()
753 static void reset_cmb(struct ccw_device *cdev) in reset_cmb() argument
755 cmf_generic_reset(cdev); in reset_cmb()
822 static int alloc_cmbe(struct ccw_device *cdev) in alloc_cmbe() argument
842 spin_lock_irq(cdev->ccwlock); in alloc_cmbe()
843 if (cdev->private->cmb) { in alloc_cmbe()
844 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
849 cdev->private->cmb = cmb_data; in alloc_cmbe()
850 spin_unlock_irq(cdev->ccwlock); in alloc_cmbe()
856 list_add_tail(&cdev->private->cmb_list, &cmb_area.list); in alloc_cmbe()
868 static void free_cmbe(struct ccw_device *cdev) in free_cmbe() argument
872 spin_lock_irq(cdev->ccwlock); in free_cmbe()
873 cmb_data = cdev->private->cmb; in free_cmbe()
874 cdev->private->cmb = NULL; in free_cmbe()
878 spin_unlock_irq(cdev->ccwlock); in free_cmbe()
882 list_del_init(&cdev->private->cmb_list); in free_cmbe()
888 static int set_cmbe(struct ccw_device *cdev, u32 mme) in set_cmbe() argument
894 spin_lock_irqsave(cdev->ccwlock, flags); in set_cmbe()
895 if (!cdev->private->cmb) { in set_cmbe()
896 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
899 cmb_data = cdev->private->cmb; in set_cmbe()
901 spin_unlock_irqrestore(cdev->ccwlock, flags); in set_cmbe()
903 return set_schib_wait(cdev, mme, 1, mba); in set_cmbe()
907 static u64 read_cmbe(struct ccw_device *cdev, int index) in read_cmbe() argument
915 ret = cmf_cmb_copy_wait(cdev); in read_cmbe()
919 spin_lock_irqsave(cdev->ccwlock, flags); in read_cmbe()
920 cmb_data = cdev->private->cmb; in read_cmbe()
961 spin_unlock_irqrestore(cdev->ccwlock, flags); in read_cmbe()
965 static int readall_cmbe(struct ccw_device *cdev, struct cmbdata *data) in readall_cmbe() argument
973 ret = cmf_cmb_copy_wait(cdev); in readall_cmbe()
976 spin_lock_irqsave(cdev->ccwlock, flags); in readall_cmbe()
977 cmb_data = cdev->private->cmb; in readall_cmbe()
986 time = cmb_data->last_update - cdev->private->cmb_start_time; in readall_cmbe()
1016 spin_unlock_irqrestore(cdev->ccwlock, flags); in readall_cmbe()
1020 static void reset_cmbe(struct ccw_device *cdev) in reset_cmbe() argument
1022 cmf_generic_reset(cdev); in reset_cmbe()
1053 struct ccw_device *cdev; in cmb_show_avg_sample_interval() local
1058 cdev = to_ccwdev(dev); in cmb_show_avg_sample_interval()
1059 count = cmf_read(cdev, cmb_sample_count); in cmb_show_avg_sample_interval()
1060 spin_lock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
1061 cmb_data = cdev->private->cmb; in cmb_show_avg_sample_interval()
1064 cdev->private->cmb_start_time; in cmb_show_avg_sample_interval()
1069 spin_unlock_irq(cdev->ccwlock); in cmb_show_avg_sample_interval()
1181 struct ccw_device *cdev; in cmb_enable_store() local
1189 cdev = to_ccwdev(dev); in cmb_enable_store()
1193 ret = disable_cmf(cdev); in cmb_enable_store()
1196 ret = enable_cmf(cdev); in cmb_enable_store()
1205 int ccw_set_cmf(struct ccw_device *cdev, int enable) in ccw_set_cmf() argument
1207 return cmbops->set(cdev, enable ? 2 : 0); in ccw_set_cmf()
1219 int enable_cmf(struct ccw_device *cdev) in enable_cmf() argument
1223 ret = cmbops->alloc(cdev); in enable_cmf()
1224 cmbops->reset(cdev); in enable_cmf()
1227 ret = cmbops->set(cdev, 2); in enable_cmf()
1229 cmbops->free(cdev); in enable_cmf()
1232 ret = sysfs_create_group(&cdev->dev.kobj, cmbops->attr_group); in enable_cmf()
1235 cmbops->set(cdev, 0); //FIXME: this can fail in enable_cmf()
1236 cmbops->free(cdev); in enable_cmf()
1249 int disable_cmf(struct ccw_device *cdev) in disable_cmf() argument
1253 ret = cmbops->set(cdev, 0); in disable_cmf()
1256 cmbops->free(cdev); in disable_cmf()
1257 sysfs_remove_group(&cdev->dev.kobj, cmbops->attr_group); in disable_cmf()
1271 u64 cmf_read(struct ccw_device *cdev, int index) in cmf_read() argument
1273 return cmbops->read(cdev, index); in cmf_read()
1286 int cmf_readall(struct ccw_device *cdev, struct cmbdata *data) in cmf_readall() argument
1288 return cmbops->readall(cdev, data); in cmf_readall()
1292 int cmf_reenable(struct ccw_device *cdev) in cmf_reenable() argument
1294 cmbops->reset(cdev); in cmf_reenable()
1295 return cmbops->set(cdev, 2); in cmf_reenable()