[SCSI] zfcp: Fix oops during shutdown of offline device
[safe/jmp/linux-2.6] / drivers / s390 / scsi / zfcp_ccw.c
1 /*
2  * zfcp device driver
3  *
4  * Registration and callback for the s390 common I/O layer.
5  *
6  * Copyright IBM Corporation 2002, 2009
7  */
8
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include "zfcp_ext.h"
13
14 #define ZFCP_MODEL_PRIV 0x4
15
16 static int zfcp_ccw_suspend(struct ccw_device *cdev)
17
18 {
19         struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev);
20
21         if (!adapter)
22                 return 0;
23
24         mutex_lock(&zfcp_data.config_mutex);
25
26         zfcp_erp_adapter_shutdown(adapter, 0, "ccsusp1", NULL);
27         zfcp_erp_wait(adapter);
28
29         mutex_unlock(&zfcp_data.config_mutex);
30
31         return 0;
32 }
33
34 static int zfcp_ccw_activate(struct ccw_device *cdev)
35
36 {
37         struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev);
38
39         if (!adapter)
40                 return 0;
41
42         zfcp_erp_modify_adapter_status(adapter, "ccresu1", NULL,
43                                        ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
44         zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
45                                 "ccresu2", NULL);
46         zfcp_erp_wait(adapter);
47         flush_work(&adapter->scan_work);
48
49         return 0;
50 }
51
52 static struct ccw_device_id zfcp_ccw_device_id[] = {
53         { CCW_DEVICE_DEVTYPE(0x1731, 0x3, 0x1732, 0x3) },
54         { CCW_DEVICE_DEVTYPE(0x1731, 0x3, 0x1732, ZFCP_MODEL_PRIV) },
55         {},
56 };
57 MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id);
58
59 /**
60  * zfcp_ccw_priv_sch - check if subchannel is privileged
61  * @adapter: Adapter/Subchannel to check
62  */
63 int zfcp_ccw_priv_sch(struct zfcp_adapter *adapter)
64 {
65         return adapter->ccw_device->id.dev_model == ZFCP_MODEL_PRIV;
66 }
67
68 /**
69  * zfcp_ccw_probe - probe function of zfcp driver
70  * @ccw_device: pointer to belonging ccw device
71  *
72  * This function gets called by the common i/o layer for each FCP
73  * device found on the current system. This is only a stub to make cio
74  * work: To only allocate adapter resources for devices actually used,
75  * the allocation is deferred to the first call to ccw_set_online.
76  */
77 static int zfcp_ccw_probe(struct ccw_device *ccw_device)
78 {
79         return 0;
80 }
81
82 /**
83  * zfcp_ccw_remove - remove function of zfcp driver
84  * @ccw_device: pointer to belonging ccw device
85  *
86  * This function gets called by the common i/o layer and removes an adapter
87  * from the system. Task of this function is to get rid of all units and
88  * ports that belong to this adapter. And in addition all resources of this
89  * adapter will be freed too.
90  */
91 static void zfcp_ccw_remove(struct ccw_device *ccw_device)
92 {
93         struct zfcp_adapter *adapter;
94         struct zfcp_port *port, *p;
95         struct zfcp_unit *unit, *u;
96         LIST_HEAD(unit_remove_lh);
97         LIST_HEAD(port_remove_lh);
98
99         ccw_device_set_offline(ccw_device);
100
101         mutex_lock(&zfcp_data.config_mutex);
102         adapter = dev_get_drvdata(&ccw_device->dev);
103         if (!adapter)
104                 goto out;
105
106         write_lock_irq(&zfcp_data.config_lock);
107         list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
108                 list_for_each_entry_safe(unit, u, &port->unit_list_head, list) {
109                         list_move(&unit->list, &unit_remove_lh);
110                         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
111                                         &unit->status);
112                 }
113                 list_move(&port->list, &port_remove_lh);
114                 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
115         }
116         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
117         write_unlock_irq(&zfcp_data.config_lock);
118
119         list_for_each_entry_safe(port, p, &port_remove_lh, list) {
120                 list_for_each_entry_safe(unit, u, &unit_remove_lh, list) {
121                         if (unit->device)
122                                 scsi_remove_device(unit->device);
123                         zfcp_unit_dequeue(unit);
124                 }
125                 zfcp_port_dequeue(port);
126         }
127         wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
128         zfcp_adapter_dequeue(adapter);
129
130 out:
131         mutex_unlock(&zfcp_data.config_mutex);
132 }
133
134 /**
135  * zfcp_ccw_set_online - set_online function of zfcp driver
136  * @ccw_device: pointer to belonging ccw device
137  *
138  * This function gets called by the common i/o layer and sets an
139  * adapter into state online.  The first call will allocate all
140  * adapter resources that will be retained until the device is removed
141  * via zfcp_ccw_remove.
142  *
143  * Setting an fcp device online means that it will be registered with
144  * the SCSI stack, that the QDIO queues will be set up and that the
145  * adapter will be opened.
146  */
147 static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
148 {
149         struct zfcp_adapter *adapter;
150         int ret = 0;
151
152         mutex_lock(&zfcp_data.config_mutex);
153         adapter = dev_get_drvdata(&ccw_device->dev);
154
155         if (!adapter) {
156                 ret = zfcp_adapter_enqueue(ccw_device);
157                 if (ret) {
158                         dev_err(&ccw_device->dev,
159                                 "Setting up data structures for the "
160                                 "FCP adapter failed\n");
161                         goto out;
162                 }
163                 adapter = dev_get_drvdata(&ccw_device->dev);
164         }
165
166         /* initialize request counter */
167         BUG_ON(!zfcp_reqlist_isempty(adapter));
168         adapter->req_no = 0;
169
170         zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
171                                        ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
172         zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
173                                 "ccsonl2", NULL);
174         zfcp_erp_wait(adapter);
175 out:
176         mutex_unlock(&zfcp_data.config_mutex);
177         if (!ret)
178                 flush_work(&adapter->scan_work);
179         return ret;
180 }
181
182 /**
183  * zfcp_ccw_set_offline - set_offline function of zfcp driver
184  * @ccw_device: pointer to belonging ccw device
185  *
186  * This function gets called by the common i/o layer and sets an adapter
187  * into state offline.
188  */
189 static int zfcp_ccw_set_offline(struct ccw_device *ccw_device)
190 {
191         struct zfcp_adapter *adapter;
192
193         mutex_lock(&zfcp_data.config_mutex);
194         adapter = dev_get_drvdata(&ccw_device->dev);
195         zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL);
196         zfcp_erp_wait(adapter);
197         mutex_unlock(&zfcp_data.config_mutex);
198         return 0;
199 }
200
201 /**
202  * zfcp_ccw_notify - ccw notify function
203  * @ccw_device: pointer to belonging ccw device
204  * @event: indicates if adapter was detached or attached
205  *
206  * This function gets called by the common i/o layer if an adapter has gone
207  * or reappeared.
208  */
209 static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
210 {
211         struct zfcp_adapter *adapter = dev_get_drvdata(&ccw_device->dev);
212
213         switch (event) {
214         case CIO_GONE:
215                 dev_warn(&adapter->ccw_device->dev,
216                          "The FCP device has been detached\n");
217                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1", NULL);
218                 break;
219         case CIO_NO_PATH:
220                 dev_warn(&adapter->ccw_device->dev,
221                          "The CHPID for the FCP device is offline\n");
222                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2", NULL);
223                 break;
224         case CIO_OPER:
225                 dev_info(&adapter->ccw_device->dev,
226                          "The FCP device is operational again\n");
227                 zfcp_erp_modify_adapter_status(adapter, "ccnoti3", NULL,
228                                                ZFCP_STATUS_COMMON_RUNNING,
229                                                ZFCP_SET);
230                 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
231                                         "ccnoti4", NULL);
232                 break;
233         case CIO_BOXED:
234                 dev_warn(&adapter->ccw_device->dev, "The FCP device "
235                          "did not respond within the specified time\n");
236                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti5", NULL);
237                 break;
238         }
239         return 1;
240 }
241
242 /**
243  * zfcp_ccw_shutdown - handle shutdown from cio
244  * @cdev: device for adapter to shutdown.
245  */
246 static void zfcp_ccw_shutdown(struct ccw_device *cdev)
247 {
248         struct zfcp_adapter *adapter;
249
250         mutex_lock(&zfcp_data.config_mutex);
251         adapter = dev_get_drvdata(&cdev->dev);
252         if (!adapter)
253                 goto out;
254
255         zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL);
256         zfcp_erp_wait(adapter);
257         zfcp_erp_thread_kill(adapter);
258 out:
259         mutex_unlock(&zfcp_data.config_mutex);
260 }
261
262 struct ccw_driver zfcp_ccw_driver = {
263         .owner       = THIS_MODULE,
264         .name        = "zfcp",
265         .ids         = zfcp_ccw_device_id,
266         .probe       = zfcp_ccw_probe,
267         .remove      = zfcp_ccw_remove,
268         .set_online  = zfcp_ccw_set_online,
269         .set_offline = zfcp_ccw_set_offline,
270         .notify      = zfcp_ccw_notify,
271         .shutdown    = zfcp_ccw_shutdown,
272         .freeze      = zfcp_ccw_suspend,
273         .thaw        = zfcp_ccw_activate,
274         .restore     = zfcp_ccw_activate,
275 };
276
277 /**
278  * zfcp_ccw_register - ccw register function
279  *
280  * Registers the driver at the common i/o layer. This function will be called
281  * at module load time/system start.
282  */
283 int __init zfcp_ccw_register(void)
284 {
285         return ccw_driver_register(&zfcp_ccw_driver);
286 }