[SCSI] zfcp: Fix lockdep warning when offlining device with offline chpid
[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         mutex_unlock(&zfcp_data.config_mutex);
106
107         cancel_work_sync(&adapter->scan_work);
108
109         mutex_lock(&zfcp_data.config_mutex);
110         write_lock_irq(&zfcp_data.config_lock);
111         list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
112                 list_for_each_entry_safe(unit, u, &port->unit_list_head, list) {
113                         list_move(&unit->list, &unit_remove_lh);
114                         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
115                                         &unit->status);
116                 }
117                 list_move(&port->list, &port_remove_lh);
118                 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
119         }
120         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
121         write_unlock_irq(&zfcp_data.config_lock);
122
123         list_for_each_entry_safe(port, p, &port_remove_lh, list) {
124                 list_for_each_entry_safe(unit, u, &unit_remove_lh, list) {
125                         if (unit->device)
126                                 scsi_remove_device(unit->device);
127                         zfcp_unit_dequeue(unit);
128                 }
129                 zfcp_port_dequeue(port);
130         }
131         wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
132         zfcp_adapter_dequeue(adapter);
133
134 out:
135         mutex_unlock(&zfcp_data.config_mutex);
136 }
137
138 /**
139  * zfcp_ccw_set_online - set_online function of zfcp driver
140  * @ccw_device: pointer to belonging ccw device
141  *
142  * This function gets called by the common i/o layer and sets an
143  * adapter into state online.  The first call will allocate all
144  * adapter resources that will be retained until the device is removed
145  * via zfcp_ccw_remove.
146  *
147  * Setting an fcp device online means that it will be registered with
148  * the SCSI stack, that the QDIO queues will be set up and that the
149  * adapter will be opened.
150  */
151 static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
152 {
153         struct zfcp_adapter *adapter;
154         int ret = 0;
155
156         mutex_lock(&zfcp_data.config_mutex);
157         adapter = dev_get_drvdata(&ccw_device->dev);
158
159         if (!adapter) {
160                 ret = zfcp_adapter_enqueue(ccw_device);
161                 if (ret) {
162                         dev_err(&ccw_device->dev,
163                                 "Setting up data structures for the "
164                                 "FCP adapter failed\n");
165                         goto out;
166                 }
167                 adapter = dev_get_drvdata(&ccw_device->dev);
168         }
169
170         /* initialize request counter */
171         BUG_ON(!zfcp_reqlist_isempty(adapter));
172         adapter->req_no = 0;
173
174         zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
175                                        ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
176         zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
177                                 "ccsonl2", NULL);
178         zfcp_erp_wait(adapter);
179 out:
180         mutex_unlock(&zfcp_data.config_mutex);
181         if (!ret)
182                 flush_work(&adapter->scan_work);
183         return ret;
184 }
185
186 /**
187  * zfcp_ccw_set_offline - set_offline function of zfcp driver
188  * @ccw_device: pointer to belonging ccw device
189  *
190  * This function gets called by the common i/o layer and sets an adapter
191  * into state offline.
192  */
193 static int zfcp_ccw_set_offline(struct ccw_device *ccw_device)
194 {
195         struct zfcp_adapter *adapter;
196
197         mutex_lock(&zfcp_data.config_mutex);
198         adapter = dev_get_drvdata(&ccw_device->dev);
199         zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL);
200         zfcp_erp_wait(adapter);
201         mutex_unlock(&zfcp_data.config_mutex);
202         return 0;
203 }
204
205 /**
206  * zfcp_ccw_notify - ccw notify function
207  * @ccw_device: pointer to belonging ccw device
208  * @event: indicates if adapter was detached or attached
209  *
210  * This function gets called by the common i/o layer if an adapter has gone
211  * or reappeared.
212  */
213 static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
214 {
215         struct zfcp_adapter *adapter = dev_get_drvdata(&ccw_device->dev);
216
217         switch (event) {
218         case CIO_GONE:
219                 dev_warn(&adapter->ccw_device->dev,
220                          "The FCP device has been detached\n");
221                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1", NULL);
222                 break;
223         case CIO_NO_PATH:
224                 dev_warn(&adapter->ccw_device->dev,
225                          "The CHPID for the FCP device is offline\n");
226                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2", NULL);
227                 break;
228         case CIO_OPER:
229                 dev_info(&adapter->ccw_device->dev,
230                          "The FCP device is operational again\n");
231                 zfcp_erp_modify_adapter_status(adapter, "ccnoti3", NULL,
232                                                ZFCP_STATUS_COMMON_RUNNING,
233                                                ZFCP_SET);
234                 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
235                                         "ccnoti4", NULL);
236                 break;
237         case CIO_BOXED:
238                 dev_warn(&adapter->ccw_device->dev, "The FCP device "
239                          "did not respond within the specified time\n");
240                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti5", NULL);
241                 break;
242         }
243         return 1;
244 }
245
246 /**
247  * zfcp_ccw_shutdown - handle shutdown from cio
248  * @cdev: device for adapter to shutdown.
249  */
250 static void zfcp_ccw_shutdown(struct ccw_device *cdev)
251 {
252         struct zfcp_adapter *adapter;
253
254         mutex_lock(&zfcp_data.config_mutex);
255         adapter = dev_get_drvdata(&cdev->dev);
256         if (!adapter)
257                 goto out;
258
259         zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL);
260         zfcp_erp_wait(adapter);
261         zfcp_erp_thread_kill(adapter);
262 out:
263         mutex_unlock(&zfcp_data.config_mutex);
264 }
265
266 struct ccw_driver zfcp_ccw_driver = {
267         .owner       = THIS_MODULE,
268         .name        = "zfcp",
269         .ids         = zfcp_ccw_device_id,
270         .probe       = zfcp_ccw_probe,
271         .remove      = zfcp_ccw_remove,
272         .set_online  = zfcp_ccw_set_online,
273         .set_offline = zfcp_ccw_set_offline,
274         .notify      = zfcp_ccw_notify,
275         .shutdown    = zfcp_ccw_shutdown,
276         .freeze      = zfcp_ccw_suspend,
277         .thaw        = zfcp_ccw_activate,
278         .restore     = zfcp_ccw_activate,
279 };
280
281 /**
282  * zfcp_ccw_register - ccw register function
283  *
284  * Registers the driver at the common i/o layer. This function will be called
285  * at module load time/system start.
286  */
287 int __init zfcp_ccw_register(void)
288 {
289         return ccw_driver_register(&zfcp_ccw_driver);
290 }