1 #ifndef _CSS_H 2 #define _CSS_H 3 4 #include <linux/wait.h> 5 #include <linux/workqueue.h> 6 7 #include <asm/cio.h> 8 9 #include "schid.h" 10 11 /* 12 * path grouping stuff 13 */ 14 #define SPID_FUNC_SINGLE_PATH 0x00 15 #define SPID_FUNC_MULTI_PATH 0x80 16 #define SPID_FUNC_ESTABLISH 0x00 17 #define SPID_FUNC_RESIGN 0x40 18 #define SPID_FUNC_DISBAND 0x20 19 20 #define SNID_STATE1_RESET 0 21 #define SNID_STATE1_UNGROUPED 2 22 #define SNID_STATE1_GROUPED 3 23 24 #define SNID_STATE2_NOT_RESVD 0 25 #define SNID_STATE2_RESVD_ELSE 2 26 #define SNID_STATE2_RESVD_SELF 3 27 28 #define SNID_STATE3_MULTI_PATH 1 29 #define SNID_STATE3_SINGLE_PATH 0 30 31 struct path_state { 32 __u8 state1 : 2; /* path state value 1 */ 33 __u8 state2 : 2; /* path state value 2 */ 34 __u8 state3 : 1; /* path state value 3 */ 35 __u8 resvd : 3; /* reserved */ 36 } __attribute__ ((packed)); 37 38 struct extended_cssid { 39 u8 version; 40 u8 cssid; 41 } __attribute__ ((packed)); 42 43 struct pgid { 44 union { 45 __u8 fc; /* SPID function code */ 46 struct path_state ps; /* SNID path state */ 47 } inf; 48 union { 49 __u32 cpu_addr : 16; /* CPU address */ 50 struct extended_cssid ext_cssid; 51 } pgid_high; 52 __u32 cpu_id : 24; /* CPU identification */ 53 __u32 cpu_model : 16; /* CPU model */ 54 __u32 tod_high; /* high word TOD clock */ 55 } __attribute__ ((packed)); 56 57 #define MAX_CIWS 8 58 59 /* 60 * sense-id response buffer layout 61 */ 62 struct senseid { 63 /* common part */ 64 __u8 reserved; /* always 0x'FF' */ 65 __u16 cu_type; /* control unit type */ 66 __u8 cu_model; /* control unit model */ 67 __u16 dev_type; /* device type */ 68 __u8 dev_model; /* device model */ 69 __u8 unused; /* padding byte */ 70 /* extended part */ 71 struct ciw ciw[MAX_CIWS]; /* variable # of CIWs */ 72 } __attribute__ ((packed,aligned(4))); 73 74 struct ccw_device_private { 75 int state; /* device state */ 76 atomic_t onoff; 77 unsigned long registered; 78 __u16 devno; /* device number */ 79 __u16 sch_no; /* subchannel number */ 80 __u8 ssid; /* subchannel set id */ 81 __u8 imask; /* lpm mask for SNID/SID/SPGID */ 82 int iretry; /* retry counter SNID/SID/SPGID */ 83 struct { 84 unsigned int fast:1; /* post with "channel end" */ 85 unsigned int repall:1; /* report every interrupt status */ 86 unsigned int pgroup:1; /* do path grouping */ 87 unsigned int force:1; /* allow forced online */ 88 } __attribute__ ((packed)) options; 89 struct { 90 unsigned int pgid_single:1; /* use single path for Set PGID */ 91 unsigned int esid:1; /* Ext. SenseID supported by HW */ 92 unsigned int dosense:1; /* delayed SENSE required */ 93 unsigned int doverify:1; /* delayed path verification */ 94 unsigned int donotify:1; /* call notify function */ 95 unsigned int recog_done:1; /* dev. recog. complete */ 96 unsigned int fake_irb:1; /* deliver faked irb */ 97 } __attribute__((packed)) flags; 98 unsigned long intparm; /* user interruption parameter */ 99 struct qdio_irq *qdio_data; 100 struct irb irb; /* device status */ 101 struct senseid senseid; /* SenseID info */ 102 struct pgid pgid; /* path group ID */ 103 struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */ 104 struct work_struct kick_work; 105 wait_queue_head_t wait_q; 106 struct timer_list timer; 107 void *cmb; /* measurement information */ 108 struct list_head cmb_list; /* list of measured devices */ 109 u64 cmb_start_time; /* clock value of cmb reset */ 110 void *cmb_wait; /* deferred cmb enable/disable */ 111 }; 112 113 /* 114 * A css driver handles all subchannels of one type. 115 * Currently, we only care about I/O subchannels (type 0), these 116 * have a ccw_device connected to them. 117 */ 118 struct css_driver { 119 unsigned int subchannel_type; 120 struct device_driver drv; 121 void (*irq)(struct device *); 122 int (*notify)(struct device *, int); 123 void (*verify)(struct device *); 124 void (*termination)(struct device *); 125 }; 126 127 /* 128 * all css_drivers have the css_bus_type 129 */ 130 extern struct bus_type css_bus_type; 131 extern struct css_driver io_subchannel_driver; 132 133 extern int css_probe_device(struct subchannel_id); 134 extern struct subchannel * get_subchannel_by_schid(struct subchannel_id); 135 extern int css_init_done; 136 extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *); 137 138 #define __MAX_SUBCHANNEL 65535 139 #define __MAX_SSID 3 140 #define __MAX_CHPID 255 141 #define __MAX_CSSID 0 142 143 struct channel_subsystem { 144 u8 cssid; 145 int valid; 146 struct channel_path *chps[__MAX_CHPID]; 147 struct device device; 148 struct pgid global_pgid; 149 }; 150 #define to_css(dev) container_of(dev, struct channel_subsystem, device) 151 152 extern struct bus_type css_bus_type; 153 extern struct channel_subsystem *css[]; 154 155 /* Some helper functions for disconnected state. */ 156 int device_is_disconnected(struct subchannel *); 157 void device_set_disconnected(struct subchannel *); 158 void device_trigger_reprobe(struct subchannel *); 159 160 /* Helper functions for vary on/off. */ 161 int device_is_online(struct subchannel *); 162 void device_set_waiting(struct subchannel *); 163 164 /* Machine check helper function. */ 165 void device_kill_pending_timer(struct subchannel *); 166 167 /* Helper functions to build lists for the slow path. */ 168 extern int css_enqueue_subchannel_slow(struct subchannel_id schid); 169 void css_walk_subchannel_slow_list(void (*fn)(unsigned long)); 170 void css_clear_subchannel_slow_list(void); 171 int css_slow_subchannels_exist(void); 172 extern int need_rescan; 173 174 extern struct workqueue_struct *slow_path_wq; 175 extern struct work_struct slow_path_work; 176 #endif 177