2005-04-17 02:20:36 +04:00
# ifndef S390_DEVICE_H
# define S390_DEVICE_H
2006-06-29 16:57:03 +04:00
# include <asm/ccwdev.h>
# include <asm/atomic.h>
# include <linux/wait.h>
2008-01-26 16:10:43 +03:00
# include "io_sch.h"
2005-04-17 02:20:36 +04:00
/*
* states of the device statemachine
*/
enum dev_state {
DEV_STATE_NOT_OPER ,
DEV_STATE_SENSE_PGID ,
DEV_STATE_SENSE_ID ,
DEV_STATE_OFFLINE ,
DEV_STATE_VERIFY ,
DEV_STATE_ONLINE ,
DEV_STATE_W4SENSE ,
DEV_STATE_DISBAND_PGID ,
DEV_STATE_BOXED ,
/* states to wait for i/o completion before doing something */
DEV_STATE_CLEAR_VERIFY ,
DEV_STATE_TIMEOUT_KILL ,
DEV_STATE_QUIESCE ,
/* special states for devices gone not operational */
DEV_STATE_DISCONNECTED ,
DEV_STATE_DISCONNECTED_SENSE_ID ,
DEV_STATE_CMFCHANGE ,
2006-06-29 17:08:41 +04:00
DEV_STATE_CMFUPDATE ,
2005-04-17 02:20:36 +04:00
/* last element! */
NR_DEV_STATES
} ;
/*
* asynchronous events of the device statemachine
*/
enum dev_event {
DEV_EVENT_NOTOPER ,
DEV_EVENT_INTERRUPT ,
DEV_EVENT_TIMEOUT ,
DEV_EVENT_VERIFY ,
/* last element! */
NR_DEV_EVENTS
} ;
struct ccw_device ;
/*
* action called through jumptable
*/
typedef void ( fsm_func_t ) ( struct ccw_device * , enum dev_event ) ;
extern fsm_func_t * dev_jumptable [ NR_DEV_STATES ] [ NR_DEV_EVENTS ] ;
static inline void
dev_fsm_event ( struct ccw_device * cdev , enum dev_event dev_event )
{
dev_jumptable [ cdev - > private - > state ] [ dev_event ] ( cdev , dev_event ) ;
}
/*
* Delivers 1 if the device state is final .
*/
static inline int
dev_fsm_final_state ( struct ccw_device * cdev )
{
return ( cdev - > private - > state = = DEV_STATE_NOT_OPER | |
cdev - > private - > state = = DEV_STATE_OFFLINE | |
cdev - > private - > state = = DEV_STATE_ONLINE | |
cdev - > private - > state = = DEV_STATE_BOXED ) ;
}
extern struct workqueue_struct * ccw_device_work ;
2006-06-29 16:57:03 +04:00
extern wait_queue_head_t ccw_device_init_wq ;
extern atomic_t ccw_device_init_count ;
2005-04-17 02:20:36 +04:00
void io_subchannel_recog_done ( struct ccw_device * cdev ) ;
int ccw_device_cancel_halt_clear ( struct ccw_device * ) ;
2006-12-08 17:53:57 +03:00
void ccw_device_do_unreg_rereg ( struct work_struct * ) ;
2006-12-08 17:54:28 +03:00
void ccw_device_move_to_orphanage ( struct work_struct * ) ;
int ccw_device_is_orphan ( struct ccw_device * ) ;
2005-04-17 02:20:36 +04:00
int ccw_device_recognition ( struct ccw_device * ) ;
int ccw_device_online ( struct ccw_device * ) ;
int ccw_device_offline ( struct ccw_device * ) ;
2008-10-10 23:33:06 +04:00
int ccw_purge_blacklisted ( void ) ;
2005-04-17 02:20:36 +04:00
/* Function prototypes for device status and basic sense stuff. */
void ccw_device_accumulate_irb ( struct ccw_device * , struct irb * ) ;
void ccw_device_accumulate_basic_sense ( struct ccw_device * , struct irb * ) ;
int ccw_device_accumulate_and_sense ( struct ccw_device * , struct irb * ) ;
int ccw_device_do_sense ( struct ccw_device * , struct irb * ) ;
/* Function prototypes for sense id stuff. */
void ccw_device_sense_id_start ( struct ccw_device * ) ;
void ccw_device_sense_id_irq ( struct ccw_device * , enum dev_event ) ;
void ccw_device_sense_id_done ( struct ccw_device * , int ) ;
/* Function prototypes for path grouping stuff. */
void ccw_device_sense_pgid_start ( struct ccw_device * ) ;
void ccw_device_sense_pgid_irq ( struct ccw_device * , enum dev_event ) ;
void ccw_device_sense_pgid_done ( struct ccw_device * , int ) ;
void ccw_device_verify_start ( struct ccw_device * ) ;
void ccw_device_verify_irq ( struct ccw_device * , enum dev_event ) ;
void ccw_device_verify_done ( struct ccw_device * , int ) ;
void ccw_device_disband_start ( struct ccw_device * ) ;
void ccw_device_disband_irq ( struct ccw_device * , enum dev_event ) ;
void ccw_device_disband_done ( struct ccw_device * , int ) ;
int ccw_device_call_handler ( struct ccw_device * ) ;
int ccw_device_stlck ( struct ccw_device * ) ;
2008-07-14 11:58:45 +04:00
/* Helper function for machine check handling. */
void ccw_device_trigger_reprobe ( struct ccw_device * ) ;
void ccw_device_kill_io ( struct ccw_device * ) ;
int ccw_device_notify ( struct ccw_device * , int ) ;
2008-08-21 21:46:39 +04:00
void ccw_device_set_notoper ( struct ccw_device * cdev ) ;
2008-07-14 11:58:45 +04:00
2005-04-17 02:20:36 +04:00
/* qdio needs this. */
void ccw_device_set_timeout ( struct ccw_device * , int ) ;
2006-01-06 11:19:21 +03:00
extern struct subchannel_id ccw_device_get_subchannel_id ( struct ccw_device * ) ;
2007-02-05 23:16:47 +03:00
extern struct bus_type ccw_bus_type ;
2005-04-17 02:20:36 +04:00
2006-06-29 17:08:41 +04:00
/* Channel measurement facility related */
2005-04-17 02:20:36 +04:00
void retry_set_schib ( struct ccw_device * cdev ) ;
2006-06-29 17:08:41 +04:00
void cmf_retry_copy_block ( struct ccw_device * ) ;
int cmf_reenable ( struct ccw_device * ) ;
2008-04-17 09:46:26 +04:00
extern struct device_attribute dev_attr_cmb_enable ;
2005-04-17 02:20:36 +04:00
# endif