1
2
3
4
5
6
7
8
9
10#define KMSG_COMPONENT "zfcp"
11#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
12
13#include <linux/blktrace_api.h>
14#include <linux/jiffies.h>
15#include <linux/types.h>
16#include <linux/slab.h>
17#include <scsi/fc/fc_els.h>
18#include "zfcp_ext.h"
19#include "zfcp_fc.h"
20#include "zfcp_dbf.h"
21#include "zfcp_qdio.h"
22#include "zfcp_reqlist.h"
23#include "zfcp_diag.h"
24
25
26#define ZFCP_FSF_SCSI_ER_TIMEOUT (10*HZ)
27
28#define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ)
29
30struct kmem_cache *zfcp_fsf_qtcb_cache;
31
32static bool ber_stop = true;
33module_param(ber_stop, bool, 0600);
34MODULE_PARM_DESC(ber_stop,
35 "Shuts down FCP devices for FCP channels that report a bit-error count in excess of its threshold (default on)");
36
37static void zfcp_fsf_request_timeout_handler(struct timer_list *t)
38{
39 struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer);
40 struct zfcp_adapter *adapter = fsf_req->adapter;
41
42 zfcp_qdio_siosl(adapter);
43 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
44 "fsrth_1");
45}
46
47static void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req,
48 unsigned long timeout)
49{
50 fsf_req->timer.function = zfcp_fsf_request_timeout_handler;
51 fsf_req->timer.expires = jiffies + timeout;
52 add_timer(&fsf_req->timer);
53}
54
55static void zfcp_fsf_start_erp_timer(struct zfcp_fsf_req *fsf_req)
56{
57 BUG_ON(!fsf_req->erp_action);
58 fsf_req->timer.function = zfcp_erp_timeout_handler;
59 fsf_req->timer.expires = jiffies + 30 * HZ;
60 add_timer(&fsf_req->timer);
61}
62
63
64static u32 fsf_qtcb_type[] = {
65 [FSF_QTCB_FCP_CMND] = FSF_IO_COMMAND,
66 [FSF_QTCB_ABORT_FCP_CMND] = FSF_SUPPORT_COMMAND,
67 [FSF_QTCB_OPEN_PORT_WITH_DID] = FSF_SUPPORT_COMMAND,
68 [FSF_QTCB_OPEN_LUN] = FSF_SUPPORT_COMMAND,
69 [FSF_QTCB_CLOSE_LUN] = FSF_SUPPORT_COMMAND,
70 [FSF_QTCB_CLOSE_PORT] = FSF_SUPPORT_COMMAND,
71 [FSF_QTCB_CLOSE_PHYSICAL_PORT] = FSF_SUPPORT_COMMAND,
72 [FSF_QTCB_SEND_ELS] = FSF_SUPPORT_COMMAND,
73 [FSF_QTCB_SEND_GENERIC] = FSF_SUPPORT_COMMAND,
74 [FSF_QTCB_EXCHANGE_CONFIG_DATA] = FSF_CONFIG_COMMAND,
75 [FSF_QTCB_EXCHANGE_PORT_DATA] = FSF_PORT_COMMAND,
76 [FSF_QTCB_DOWNLOAD_CONTROL_FILE] = FSF_SUPPORT_COMMAND,
77 [FSF_QTCB_UPLOAD_CONTROL_FILE] = FSF_SUPPORT_COMMAND
78};
79
80static void zfcp_fsf_class_not_supp(struct zfcp_fsf_req *req)
81{
82 dev_err(&req->adapter->ccw_device->dev, "FCP device not "
83 "operational because of an unsupported FC class\n");
84 zfcp_erp_adapter_shutdown(req->adapter, 0, "fscns_1");
85 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
86}
87
88
89
90
91
92void zfcp_fsf_req_free(struct zfcp_fsf_req *req)
93{
94 if (likely(req->pool)) {
95 if (likely(!zfcp_fsf_req_is_status_read_buffer(req)))
96 mempool_free(req->qtcb, req->adapter->pool.qtcb_pool);
97 mempool_free(req, req->pool);
98 return;
99 }
100
101 if (likely(!zfcp_fsf_req_is_status_read_buffer(req)))
102 kmem_cache_free(zfcp_fsf_qtcb_cache, req->qtcb);
103 kfree(req);
104}
105
106static void zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *req)
107{
108 unsigned long flags;
109 struct fsf_status_read_buffer *sr_buf = req->data;
110 struct zfcp_adapter *adapter = req->adapter;
111 struct zfcp_port *port;
112 int d_id = ntoh24(sr_buf->d_id);
113
114 read_lock_irqsave(&adapter->port_list_lock, flags);
115 list_for_each_entry(port, &adapter->port_list, list)
116 if (port->d_id == d_id) {
117 zfcp_erp_port_reopen(port, 0, "fssrpc1");
118 break;
119 }
120 read_unlock_irqrestore(&adapter->port_list_lock, flags);
121}
122
123void zfcp_fsf_fc_host_link_down(struct zfcp_adapter *adapter)
124{
125 struct Scsi_Host *shost = adapter->scsi_host;
126
127 adapter->hydra_version = 0;
128 adapter->peer_wwpn = 0;
129 adapter->peer_wwnn = 0;
130 adapter->peer_d_id = 0;
131
132
133 if (shost == NULL)
134 return;
135
136 fc_host_port_id(shost) = 0;
137 fc_host_fabric_name(shost) = 0;
138 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
139 fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
140 snprintf(fc_host_model(shost), FC_SYMBOLIC_NAME_SIZE, "0x%04x", 0);
141 memset(fc_host_active_fc4s(shost), 0, FC_FC4_LIST_SIZE);
142}
143
144static void zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *req,
145 struct fsf_link_down_info *link_down)
146{
147 struct zfcp_adapter *adapter = req->adapter;
148
149 if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
150 return;
151
152 atomic_or(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
153
154 zfcp_scsi_schedule_rports_block(adapter);
155
156 zfcp_fsf_fc_host_link_down(adapter);
157
158 if (!link_down)
159 goto out;
160
161 switch (link_down->error_code) {
162 case FSF_PSQ_LINK_NO_LIGHT:
163 dev_warn(&req->adapter->ccw_device->dev,
164 "There is no light signal from the local "
165 "fibre channel cable\n");
166 break;
167 case FSF_PSQ_LINK_WRAP_PLUG:
168 dev_warn(&req->adapter->ccw_device->dev,
169 "There is a wrap plug instead of a fibre "
170 "channel cable\n");
171 break;
172 case FSF_PSQ_LINK_NO_FCP:
173 dev_warn(&req->adapter->ccw_device->dev,
174 "The adjacent fibre channel node does not "
175 "support FCP\n");
176 break;
177 case FSF_PSQ_LINK_FIRMWARE_UPDATE:
178 dev_warn(&req->adapter->ccw_device->dev,
179 "The FCP device is suspended because of a "
180 "firmware update\n");
181 break;
182 case FSF_PSQ_LINK_INVALID_WWPN:
183 dev_warn(&req->adapter->ccw_device->dev,
184 "The FCP device detected a WWPN that is "
185 "duplicate or not valid\n");
186 break;
187 case FSF_PSQ_LINK_NO_NPIV_SUPPORT:
188 dev_warn(&req->adapter->ccw_device->dev,
189 "The fibre channel fabric does not support NPIV\n");
190 break;
191 case FSF_PSQ_LINK_NO_FCP_RESOURCES:
192 dev_warn(&req->adapter->ccw_device->dev,
193 "The FCP adapter cannot support more NPIV ports\n");
194 break;
195 case FSF_PSQ_LINK_NO_FABRIC_RESOURCES:
196 dev_warn(&req->adapter->ccw_device->dev,
197 "The adjacent switch cannot support "
198 "more NPIV ports\n");
199 break;
200 case FSF_PSQ_LINK_FABRIC_LOGIN_UNABLE:
201 dev_warn(&req->adapter->ccw_device->dev,
202 "The FCP adapter could not log in to the "
203 "fibre channel fabric\n");
204 break;
205 case FSF_PSQ_LINK_WWPN_ASSIGNMENT_CORRUPTED:
206 dev_warn(&req->adapter->ccw_device->dev,
207 "The WWPN assignment file on the FCP adapter "
208 "has been damaged\n");
209 break;
210 case FSF_PSQ_LINK_MODE_TABLE_CURRUPTED:
211 dev_warn(&req->adapter->ccw_device->dev,
212 "The mode table on the FCP adapter "
213 "has been damaged\n");
214 break;
215 case FSF_PSQ_LINK_NO_WWPN_ASSIGNMENT:
216 dev_warn(&req->adapter->ccw_device->dev,
217 "All NPIV ports on the FCP adapter have "
218 "been assigned\n");
219 break;
220 default:
221 dev_warn(&req->adapter->ccw_device->dev,
222 "The link between the FCP adapter and "
223 "the FC fabric is down\n");
224 }
225out:
226 zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
227}
228
229static void zfcp_fsf_status_read_link_down(struct zfcp_fsf_req *req)
230{
231 struct fsf_status_read_buffer *sr_buf = req->data;
232 struct fsf_link_down_info *ldi =
233 (struct fsf_link_down_info *) &sr_buf->payload;
234
235 switch (sr_buf->status_subtype) {
236 case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK:
237 case FSF_STATUS_READ_SUB_FDISC_FAILED:
238 zfcp_fsf_link_down_info_eval(req, ldi);
239 break;
240 case FSF_STATUS_READ_SUB_FIRMWARE_UPDATE:
241 zfcp_fsf_link_down_info_eval(req, NULL);
242 }
243}
244
245static void
246zfcp_fsf_status_read_version_change(struct zfcp_adapter *adapter,
247 struct fsf_status_read_buffer *sr_buf)
248{
249 if (sr_buf->status_subtype == FSF_STATUS_READ_SUB_LIC_CHANGE) {
250 u32 version = sr_buf->payload.version_change.current_version;
251
252 WRITE_ONCE(adapter->fsf_lic_version, version);
253 snprintf(fc_host_firmware_version(adapter->scsi_host),
254 FC_VERSION_STRING_SIZE, "%#08x", version);
255 }
256}
257
258static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
259{
260 struct zfcp_adapter *adapter = req->adapter;
261 struct fsf_status_read_buffer *sr_buf = req->data;
262
263 if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
264 zfcp_dbf_hba_fsf_uss("fssrh_1", req);
265 mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
266 zfcp_fsf_req_free(req);
267 return;
268 }
269
270 zfcp_dbf_hba_fsf_uss("fssrh_4", req);
271
272 switch (sr_buf->status_type) {
273 case FSF_STATUS_READ_PORT_CLOSED:
274 zfcp_fsf_status_read_port_closed(req);
275 break;
276 case FSF_STATUS_READ_INCOMING_ELS:
277 zfcp_fc_incoming_els(req);
278 break;
279 case FSF_STATUS_READ_SENSE_DATA_AVAIL:
280 break;
281 case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
282 zfcp_dbf_hba_bit_err("fssrh_3", req);
283 if (ber_stop) {
284 dev_warn(&adapter->ccw_device->dev,
285 "All paths over this FCP device are disused because of excessive bit errors\n");
286 zfcp_erp_adapter_shutdown(adapter, 0, "fssrh_b");
287 } else {
288 dev_warn(&adapter->ccw_device->dev,
289 "The error threshold for checksum statistics has been exceeded\n");
290 }
291 break;
292 case FSF_STATUS_READ_LINK_DOWN:
293 zfcp_fsf_status_read_link_down(req);
294 zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKDOWN, 0);
295 break;
296 case FSF_STATUS_READ_LINK_UP:
297 dev_info(&adapter->ccw_device->dev,
298 "The local link has been restored\n");
299
300 zfcp_erp_set_adapter_status(adapter,
301 ZFCP_STATUS_COMMON_RUNNING);
302 zfcp_erp_adapter_reopen(adapter,
303 ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
304 ZFCP_STATUS_COMMON_ERP_FAILED,
305 "fssrh_2");
306 zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKUP, 0);
307
308 break;
309 case FSF_STATUS_READ_NOTIFICATION_LOST:
310 if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_INCOMING_ELS)
311 zfcp_fc_conditional_port_scan(adapter);
312 if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_VERSION_CHANGE)
313 queue_work(adapter->work_queue,
314 &adapter->version_change_lost_work);
315 break;
316 case FSF_STATUS_READ_FEATURE_UPDATE_ALERT:
317 adapter->adapter_features = sr_buf->payload.word[0];
318 break;
319 case FSF_STATUS_READ_VERSION_CHANGE:
320 zfcp_fsf_status_read_version_change(adapter, sr_buf);
321 break;
322 }
323
324 mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
325 zfcp_fsf_req_free(req);
326
327 atomic_inc(&adapter->stat_miss);
328 queue_work(adapter->work_queue, &adapter->stat_work);
329}
330
331static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req)
332{
333 switch (req->qtcb->header.fsf_status_qual.word[0]) {
334 case FSF_SQ_FCP_RSP_AVAILABLE:
335 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
336 case FSF_SQ_NO_RETRY_POSSIBLE:
337 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
338 return;
339 case FSF_SQ_COMMAND_ABORTED:
340 break;
341 case FSF_SQ_NO_RECOM:
342 dev_err(&req->adapter->ccw_device->dev,
343 "The FCP adapter reported a problem "
344 "that cannot be recovered\n");
345 zfcp_qdio_siosl(req->adapter);
346 zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfsqe1");
347 break;
348 }
349
350 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
351}
352
353static void zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *req)
354{
355 if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR))
356 return;
357
358 switch (req->qtcb->header.fsf_status) {
359 case FSF_UNKNOWN_COMMAND:
360 dev_err(&req->adapter->ccw_device->dev,
361 "The FCP adapter does not recognize the command 0x%x\n",
362 req->qtcb->header.fsf_command);
363 zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfse_1");
364 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
365 break;
366 case FSF_ADAPTER_STATUS_AVAILABLE:
367 zfcp_fsf_fsfstatus_qual_eval(req);
368 break;
369 }
370}
371
372static void zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *req)
373{
374 struct zfcp_adapter *adapter = req->adapter;
375 struct fsf_qtcb *qtcb = req->qtcb;
376 union fsf_prot_status_qual *psq = &qtcb->prefix.prot_status_qual;
377
378 zfcp_dbf_hba_fsf_response(req);
379
380 if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
381 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
382 return;
383 }
384
385 switch (qtcb->prefix.prot_status) {
386 case FSF_PROT_GOOD:
387 case FSF_PROT_FSF_STATUS_PRESENTED:
388 return;
389 case FSF_PROT_QTCB_VERSION_ERROR:
390 dev_err(&adapter->ccw_device->dev,
391 "QTCB version 0x%x not supported by FCP adapter "
392 "(0x%x to 0x%x)\n", FSF_QTCB_CURRENT_VERSION,
393 psq->word[0], psq->word[1]);
394 zfcp_erp_adapter_shutdown(adapter, 0, "fspse_1");
395 break;
396 case FSF_PROT_ERROR_STATE:
397 case FSF_PROT_SEQ_NUMB_ERROR:
398 zfcp_erp_adapter_reopen(adapter, 0, "fspse_2");
399 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
400 break;
401 case FSF_PROT_UNSUPP_QTCB_TYPE:
402 dev_err(&adapter->ccw_device->dev,
403 "The QTCB type is not supported by the FCP adapter\n");
404 zfcp_erp_adapter_shutdown(adapter, 0, "fspse_3");
405 break;
406 case FSF_PROT_HOST_CONNECTION_INITIALIZING:
407 atomic_or(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
408 &adapter->status);
409 break;
410 case FSF_PROT_DUPLICATE_REQUEST_ID:
411 dev_err(&adapter->ccw_device->dev,
412 "0x%Lx is an ambiguous request identifier\n",
413 (unsigned long long)qtcb->bottom.support.req_handle);
414 zfcp_erp_adapter_shutdown(adapter, 0, "fspse_4");
415 break;
416 case FSF_PROT_LINK_DOWN:
417 zfcp_fsf_link_down_info_eval(req, &psq->link_down_info);
418
419 zfcp_erp_adapter_reopen(adapter, 0, "fspse_6");
420 break;
421 case FSF_PROT_REEST_QUEUE:
422
423 zfcp_erp_set_adapter_status(adapter,
424 ZFCP_STATUS_COMMON_RUNNING);
425 zfcp_erp_adapter_reopen(adapter,
426 ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
427 ZFCP_STATUS_COMMON_ERP_FAILED,
428 "fspse_8");
429 break;
430 default:
431 dev_err(&adapter->ccw_device->dev,
432 "0x%x is not a valid transfer protocol status\n",
433 qtcb->prefix.prot_status);
434 zfcp_qdio_siosl(adapter);
435 zfcp_erp_adapter_shutdown(adapter, 0, "fspse_9");
436 }
437 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
438}
439
440
441
442
443
444
445
446
447
448
449
450
451
452static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req)
453{
454 struct zfcp_erp_action *erp_action;
455
456 if (unlikely(zfcp_fsf_req_is_status_read_buffer(req))) {
457 zfcp_fsf_status_read_handler(req);
458 return;
459 }
460
461 del_timer_sync(&req->timer);
462 zfcp_fsf_protstatus_eval(req);
463 zfcp_fsf_fsfstatus_eval(req);
464 req->handler(req);
465
466 erp_action = req->erp_action;
467 if (erp_action)
468 zfcp_erp_notify(erp_action, 0);
469
470 if (likely(req->status & ZFCP_STATUS_FSFREQ_CLEANUP))
471 zfcp_fsf_req_free(req);
472 else
473 complete(&req->completion);
474}
475
476
477
478
479
480
481
482
483
484
485void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
486{
487 struct zfcp_fsf_req *req, *tmp;
488 LIST_HEAD(remove_queue);
489
490 BUG_ON(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP);
491 zfcp_reqlist_move(adapter->req_list, &remove_queue);
492
493 list_for_each_entry_safe(req, tmp, &remove_queue, list) {
494 list_del(&req->list);
495 req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
496 zfcp_fsf_req_complete(req);
497 }
498}
499
500#define ZFCP_FSF_PORTSPEED_1GBIT (1 << 0)
501#define ZFCP_FSF_PORTSPEED_2GBIT (1 << 1)
502#define ZFCP_FSF_PORTSPEED_4GBIT (1 << 2)
503#define ZFCP_FSF_PORTSPEED_10GBIT (1 << 3)
504#define ZFCP_FSF_PORTSPEED_8GBIT (1 << 4)
505#define ZFCP_FSF_PORTSPEED_16GBIT (1 << 5)
506#define ZFCP_FSF_PORTSPEED_32GBIT (1 << 6)
507#define ZFCP_FSF_PORTSPEED_64GBIT (1 << 7)
508#define ZFCP_FSF_PORTSPEED_128GBIT (1 << 8)
509#define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15)
510
511u32 zfcp_fsf_convert_portspeed(u32 fsf_speed)
512{
513 u32 fdmi_speed = 0;
514 if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT)
515 fdmi_speed |= FC_PORTSPEED_1GBIT;
516 if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT)
517 fdmi_speed |= FC_PORTSPEED_2GBIT;
518 if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT)
519 fdmi_speed |= FC_PORTSPEED_4GBIT;
520 if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT)
521 fdmi_speed |= FC_PORTSPEED_10GBIT;
522 if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT)
523 fdmi_speed |= FC_PORTSPEED_8GBIT;
524 if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT)
525 fdmi_speed |= FC_PORTSPEED_16GBIT;
526 if (fsf_speed & ZFCP_FSF_PORTSPEED_32GBIT)
527 fdmi_speed |= FC_PORTSPEED_32GBIT;
528 if (fsf_speed & ZFCP_FSF_PORTSPEED_64GBIT)
529 fdmi_speed |= FC_PORTSPEED_64GBIT;
530 if (fsf_speed & ZFCP_FSF_PORTSPEED_128GBIT)
531 fdmi_speed |= FC_PORTSPEED_128GBIT;
532 if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED)
533 fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED;
534 return fdmi_speed;
535}
536
537static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
538{
539 struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config;
540 struct zfcp_adapter *adapter = req->adapter;
541 struct fc_els_flogi *plogi;
542
543
544 plogi = (struct fc_els_flogi *) ((u8 *)&bottom->plogi_payload
545 - sizeof(u32));
546
547 if (req->data)
548 memcpy(req->data, bottom, sizeof(*bottom));
549
550 adapter->timer_ticks = bottom->timer_interval & ZFCP_FSF_TIMER_INT_MASK;
551 adapter->stat_read_buf_num = max(bottom->status_read_buf_num,
552 (u16)FSF_STATUS_READS_RECOM);
553
554
555
556 if (req->qtcb->header.fsf_status == FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE)
557 return 0;
558
559 adapter->hydra_version = bottom->adapter_type;
560
561 switch (bottom->fc_topology) {
562 case FSF_TOPO_P2P:
563 adapter->peer_d_id = ntoh24(bottom->peer_d_id);
564 adapter->peer_wwpn = be64_to_cpu(plogi->fl_wwpn);
565 adapter->peer_wwnn = be64_to_cpu(plogi->fl_wwnn);
566 break;
567 case FSF_TOPO_FABRIC:
568 break;
569 case FSF_TOPO_AL:
570 default:
571 dev_err(&adapter->ccw_device->dev,
572 "Unknown or unsupported arbitrated loop "
573 "fibre channel topology detected\n");
574 zfcp_erp_adapter_shutdown(adapter, 0, "fsece_1");
575 return -EIO;
576 }
577
578 return 0;
579}
580
581static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req)
582{
583 struct zfcp_adapter *adapter = req->adapter;
584 struct zfcp_diag_header *const diag_hdr =
585 &adapter->diagnostics->config_data.header;
586 struct fsf_qtcb *qtcb = req->qtcb;
587 struct fsf_qtcb_bottom_config *bottom = &qtcb->bottom.config;
588
589 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
590 return;
591
592 adapter->fsf_lic_version = bottom->lic_version;
593 adapter->adapter_features = bottom->adapter_features;
594 adapter->connection_features = bottom->connection_features;
595 adapter->peer_wwpn = 0;
596 adapter->peer_wwnn = 0;
597 adapter->peer_d_id = 0;
598
599 switch (qtcb->header.fsf_status) {
600 case FSF_GOOD:
601
602
603
604
605 zfcp_diag_update_xdata(diag_hdr, bottom, false);
606
607 zfcp_scsi_shost_update_config_data(adapter, bottom, false);
608 if (zfcp_fsf_exchange_config_evaluate(req))
609 return;
610
611 if (bottom->max_qtcb_size < sizeof(struct fsf_qtcb)) {
612 dev_err(&adapter->ccw_device->dev,
613 "FCP adapter maximum QTCB size (%d bytes) "
614 "is too small\n",
615 bottom->max_qtcb_size);
616 zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh1");
617 return;
618 }
619 atomic_or(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
620 &adapter->status);
621 break;
622 case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
623 zfcp_diag_update_xdata(diag_hdr, bottom, true);
624 req->status |= ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE;
625
626
627
628 atomic_or(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
629 &adapter->status);
630 zfcp_fsf_link_down_info_eval(req,
631 &qtcb->header.fsf_status_qual.link_down_info);
632
633 zfcp_scsi_shost_update_config_data(adapter, bottom, true);
634 if (zfcp_fsf_exchange_config_evaluate(req))
635 return;
636 break;
637 default:
638 zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3");
639 return;
640 }
641
642 if (adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)
643 adapter->hardware_version = bottom->hardware_version;
644
645 if (FSF_QTCB_CURRENT_VERSION < bottom->low_qtcb_version) {
646 dev_err(&adapter->ccw_device->dev,
647 "The FCP adapter only supports newer "
648 "control block versions\n");
649 zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh4");
650 return;
651 }
652 if (FSF_QTCB_CURRENT_VERSION > bottom->high_qtcb_version) {
653 dev_err(&adapter->ccw_device->dev,
654 "The FCP adapter only supports older "
655 "control block versions\n");
656 zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh5");
657 }
658}
659
660
661
662
663
664
665
666static const struct {
667 u32 mask;
668 char *name;
669} zfcp_fsf_fc_security_mnemonics[] = {
670 { FSF_FC_SECURITY_AUTH, "Authentication" },
671 { FSF_FC_SECURITY_ENC_FCSP2 |
672 FSF_FC_SECURITY_ENC_ERAS, "Encryption" },
673};
674
675
676#define ZFCP_FSF_MAX_FC_SECURITY_MNEMONIC_LENGTH 15
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708ssize_t zfcp_fsf_scnprint_fc_security(char *buf, size_t size, u32 fc_security,
709 enum zfcp_fsf_print_fmt fmt)
710{
711 const char *prefix = "";
712 ssize_t len = 0;
713 int i;
714
715 if (fc_security == 0)
716 return scnprintf(buf, size, "none");
717 if (fmt == ZFCP_FSF_PRINT_FMT_SINGLEITEM && hweight32(fc_security) != 1)
718 return scnprintf(buf, size, "0x%08x", fc_security);
719
720 for (i = 0; i < ARRAY_SIZE(zfcp_fsf_fc_security_mnemonics); i++) {
721 if (!(fc_security & zfcp_fsf_fc_security_mnemonics[i].mask))
722 continue;
723
724 len += scnprintf(buf + len, size - len, "%s%s", prefix,
725 zfcp_fsf_fc_security_mnemonics[i].name);
726 prefix = ", ";
727 fc_security &= ~zfcp_fsf_fc_security_mnemonics[i].mask;
728 }
729
730 if (fc_security != 0)
731 len += scnprintf(buf + len, size - len, "%s0x%08x",
732 prefix, fc_security);
733
734 return len;
735}
736
737static void zfcp_fsf_dbf_adapter_fc_security(struct zfcp_adapter *adapter,
738 struct zfcp_fsf_req *req)
739{
740 if (adapter->fc_security_algorithms ==
741 adapter->fc_security_algorithms_old) {
742
743 return;
744 }
745
746 zfcp_dbf_hba_fsf_fces("fsfcesa", req, ZFCP_DBF_INVALID_WWPN,
747 adapter->fc_security_algorithms_old,
748 adapter->fc_security_algorithms);
749
750 adapter->fc_security_algorithms_old = adapter->fc_security_algorithms;
751}
752
753static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req)
754{
755 struct zfcp_adapter *adapter = req->adapter;
756 struct fsf_qtcb_bottom_port *bottom = &req->qtcb->bottom.port;
757
758 if (req->data)
759 memcpy(req->data, bottom, sizeof(*bottom));
760
761 if (adapter->adapter_features & FSF_FEATURE_FC_SECURITY)
762 adapter->fc_security_algorithms =
763 bottom->fc_security_algorithms;
764 else
765 adapter->fc_security_algorithms = 0;
766 zfcp_fsf_dbf_adapter_fc_security(adapter, req);
767}
768
769static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
770{
771 struct zfcp_diag_header *const diag_hdr =
772 &req->adapter->diagnostics->port_data.header;
773 struct fsf_qtcb *qtcb = req->qtcb;
774 struct fsf_qtcb_bottom_port *bottom = &qtcb->bottom.port;
775
776 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
777 return;
778
779 switch (qtcb->header.fsf_status) {
780 case FSF_GOOD:
781
782
783
784
785 zfcp_diag_update_xdata(diag_hdr, bottom, false);
786
787 zfcp_scsi_shost_update_port_data(req->adapter, bottom);
788 zfcp_fsf_exchange_port_evaluate(req);
789 break;
790 case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
791 zfcp_diag_update_xdata(diag_hdr, bottom, true);
792 req->status |= ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE;
793
794 zfcp_fsf_link_down_info_eval(req,
795 &qtcb->header.fsf_status_qual.link_down_info);
796
797 zfcp_scsi_shost_update_port_data(req->adapter, bottom);
798 zfcp_fsf_exchange_port_evaluate(req);
799 break;
800 }
801}
802
803static struct zfcp_fsf_req *zfcp_fsf_alloc(mempool_t *pool)
804{
805 struct zfcp_fsf_req *req;
806
807 if (likely(pool))
808 req = mempool_alloc(pool, GFP_ATOMIC);
809 else
810 req = kmalloc(sizeof(*req), GFP_ATOMIC);
811
812 if (unlikely(!req))
813 return NULL;
814
815 memset(req, 0, sizeof(*req));
816 req->pool = pool;
817 return req;
818}
819
820static struct fsf_qtcb *zfcp_fsf_qtcb_alloc(mempool_t *pool)
821{
822 struct fsf_qtcb *qtcb;
823
824 if (likely(pool))
825 qtcb = mempool_alloc(pool, GFP_ATOMIC);
826 else
827 qtcb = kmem_cache_alloc(zfcp_fsf_qtcb_cache, GFP_ATOMIC);
828
829 if (unlikely(!qtcb))
830 return NULL;
831
832 memset(qtcb, 0, sizeof(*qtcb));
833 return qtcb;
834}
835
836static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio,
837 u32 fsf_cmd, u8 sbtype,
838 mempool_t *pool)
839{
840 struct zfcp_adapter *adapter = qdio->adapter;
841 struct zfcp_fsf_req *req = zfcp_fsf_alloc(pool);
842
843 if (unlikely(!req))
844 return ERR_PTR(-ENOMEM);
845
846 if (adapter->req_no == 0)
847 adapter->req_no++;
848
849 timer_setup(&req->timer, NULL, 0);
850 init_completion(&req->completion);
851
852 req->adapter = adapter;
853 req->req_id = adapter->req_no;
854
855 if (likely(fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS)) {
856 if (likely(pool))
857 req->qtcb = zfcp_fsf_qtcb_alloc(
858 adapter->pool.qtcb_pool);
859 else
860 req->qtcb = zfcp_fsf_qtcb_alloc(NULL);
861
862 if (unlikely(!req->qtcb)) {
863 zfcp_fsf_req_free(req);
864 return ERR_PTR(-ENOMEM);
865 }
866
867 req->qtcb->prefix.req_seq_no = adapter->fsf_req_seq_no;
868 req->qtcb->prefix.req_id = req->req_id;
869 req->qtcb->prefix.ulp_info = 26;
870 req->qtcb->prefix.qtcb_type = fsf_qtcb_type[fsf_cmd];
871 req->qtcb->prefix.qtcb_version = FSF_QTCB_CURRENT_VERSION;
872 req->qtcb->header.req_handle = req->req_id;
873 req->qtcb->header.fsf_command = fsf_cmd;
874 }
875
876 zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype,
877 req->qtcb, sizeof(struct fsf_qtcb));
878
879 return req;
880}
881
882static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
883{
884 const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req);
885 struct zfcp_adapter *adapter = req->adapter;
886 struct zfcp_qdio *qdio = adapter->qdio;
887 int req_id = req->req_id;
888
889 zfcp_reqlist_add(adapter->req_list, req);
890
891 req->qdio_req.qdio_outb_usage = atomic_read(&qdio->req_q_free);
892 req->issued = get_tod_clock();
893 if (zfcp_qdio_send(qdio, &req->qdio_req)) {
894 del_timer_sync(&req->timer);
895
896 zfcp_reqlist_find_rm(adapter->req_list, req_id);
897 zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1");
898 return -EIO;
899 }
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914 if (!is_srb)
915 adapter->fsf_req_seq_no++;
916 adapter->req_no++;
917
918 return 0;
919}
920
921
922
923
924
925
926int zfcp_fsf_status_read(struct zfcp_qdio *qdio)
927{
928 struct zfcp_adapter *adapter = qdio->adapter;
929 struct zfcp_fsf_req *req;
930 struct fsf_status_read_buffer *sr_buf;
931 struct page *page;
932 int retval = -EIO;
933
934 spin_lock_irq(&qdio->req_q_lock);
935 if (zfcp_qdio_sbal_get(qdio))
936 goto out;
937
938 req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS,
939 SBAL_SFLAGS0_TYPE_STATUS,
940 adapter->pool.status_read_req);
941 if (IS_ERR(req)) {
942 retval = PTR_ERR(req);
943 goto out;
944 }
945
946 page = mempool_alloc(adapter->pool.sr_data, GFP_ATOMIC);
947 if (!page) {
948 retval = -ENOMEM;
949 goto failed_buf;
950 }
951 sr_buf = page_address(page);
952 memset(sr_buf, 0, sizeof(*sr_buf));
953 req->data = sr_buf;
954
955 zfcp_qdio_fill_next(qdio, &req->qdio_req, sr_buf, sizeof(*sr_buf));
956 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
957
958 retval = zfcp_fsf_req_send(req);
959 if (retval)
960 goto failed_req_send;
961
962
963 goto out;
964
965failed_req_send:
966 req->data = NULL;
967 mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
968failed_buf:
969 zfcp_dbf_hba_fsf_uss("fssr__1", req);
970 zfcp_fsf_req_free(req);
971out:
972 spin_unlock_irq(&qdio->req_q_lock);
973 return retval;
974}
975
976static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req)
977{
978 struct scsi_device *sdev = req->data;
979 struct zfcp_scsi_dev *zfcp_sdev;
980 union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual;
981
982 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
983 return;
984
985 zfcp_sdev = sdev_to_zfcp(sdev);
986
987 switch (req->qtcb->header.fsf_status) {
988 case FSF_PORT_HANDLE_NOT_VALID:
989 if (fsq->word[0] == fsq->word[1]) {
990 zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0,
991 "fsafch1");
992 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
993 }
994 break;
995 case FSF_LUN_HANDLE_NOT_VALID:
996 if (fsq->word[0] == fsq->word[1]) {
997 zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fsafch2");
998 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
999 }
1000 break;
1001 case FSF_FCP_COMMAND_DOES_NOT_EXIST:
1002 req->status |= ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED;
1003 break;
1004 case FSF_PORT_BOXED:
1005 zfcp_erp_set_port_status(zfcp_sdev->port,
1006 ZFCP_STATUS_COMMON_ACCESS_BOXED);
1007 zfcp_erp_port_reopen(zfcp_sdev->port,
1008 ZFCP_STATUS_COMMON_ERP_FAILED, "fsafch3");
1009 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1010 break;
1011 case FSF_LUN_BOXED:
1012 zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED);
1013 zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED,
1014 "fsafch4");
1015 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1016 break;
1017 case FSF_ADAPTER_STATUS_AVAILABLE:
1018 switch (fsq->word[0]) {
1019 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1020 zfcp_fc_test_link(zfcp_sdev->port);
1021 fallthrough;
1022 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1023 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1024 break;
1025 }
1026 break;
1027 case FSF_GOOD:
1028 req->status |= ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED;
1029 break;
1030 }
1031}
1032
1033
1034
1035
1036
1037
1038
1039struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd)
1040{
1041 struct zfcp_fsf_req *req = NULL;
1042 struct scsi_device *sdev = scmnd->device;
1043 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1044 struct zfcp_qdio *qdio = zfcp_sdev->port->adapter->qdio;
1045 unsigned long old_req_id = (unsigned long) scmnd->host_scribble;
1046
1047 spin_lock_irq(&qdio->req_q_lock);
1048 if (zfcp_qdio_sbal_get(qdio))
1049 goto out;
1050 req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND,
1051 SBAL_SFLAGS0_TYPE_READ,
1052 qdio->adapter->pool.scsi_abort);
1053 if (IS_ERR(req)) {
1054 req = NULL;
1055 goto out;
1056 }
1057
1058 if (unlikely(!(atomic_read(&zfcp_sdev->status) &
1059 ZFCP_STATUS_COMMON_UNBLOCKED)))
1060 goto out_error_free;
1061
1062 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1063
1064 req->data = sdev;
1065 req->handler = zfcp_fsf_abort_fcp_command_handler;
1066 req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
1067 req->qtcb->header.port_handle = zfcp_sdev->port->handle;
1068 req->qtcb->bottom.support.req_handle = (u64) old_req_id;
1069
1070 zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT);
1071 if (!zfcp_fsf_req_send(req)) {
1072
1073 goto out;
1074 }
1075
1076out_error_free:
1077 zfcp_fsf_req_free(req);
1078 req = NULL;
1079out:
1080 spin_unlock_irq(&qdio->req_q_lock);
1081 return req;
1082}
1083
1084static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req)
1085{
1086 struct zfcp_adapter *adapter = req->adapter;
1087 struct zfcp_fsf_ct_els *ct = req->data;
1088 struct fsf_qtcb_header *header = &req->qtcb->header;
1089
1090 ct->status = -EINVAL;
1091
1092 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1093 goto skip_fsfstatus;
1094
1095 switch (header->fsf_status) {
1096 case FSF_GOOD:
1097 ct->status = 0;
1098 zfcp_dbf_san_res("fsscth2", req);
1099 break;
1100 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
1101 zfcp_fsf_class_not_supp(req);
1102 break;
1103 case FSF_ADAPTER_STATUS_AVAILABLE:
1104 switch (header->fsf_status_qual.word[0]){
1105 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1106 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1107 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1108 break;
1109 }
1110 break;
1111 case FSF_PORT_BOXED:
1112 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1113 break;
1114 case FSF_PORT_HANDLE_NOT_VALID:
1115 zfcp_erp_adapter_reopen(adapter, 0, "fsscth1");
1116 fallthrough;
1117 case FSF_GENERIC_COMMAND_REJECTED:
1118 case FSF_PAYLOAD_SIZE_MISMATCH:
1119 case FSF_REQUEST_SIZE_TOO_LARGE:
1120 case FSF_RESPONSE_SIZE_TOO_LARGE:
1121 case FSF_SBAL_MISMATCH:
1122 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1123 break;
1124 }
1125
1126skip_fsfstatus:
1127 if (ct->handler)
1128 ct->handler(ct->handler_data);
1129}
1130
1131static void zfcp_fsf_setup_ct_els_unchained(struct zfcp_qdio *qdio,
1132 struct zfcp_qdio_req *q_req,
1133 struct scatterlist *sg_req,
1134 struct scatterlist *sg_resp)
1135{
1136 zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_req), sg_req->length);
1137 zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_resp), sg_resp->length);
1138 zfcp_qdio_set_sbale_last(qdio, q_req);
1139}
1140
1141static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
1142 struct scatterlist *sg_req,
1143 struct scatterlist *sg_resp)
1144{
1145 struct zfcp_adapter *adapter = req->adapter;
1146 struct zfcp_qdio *qdio = adapter->qdio;
1147 struct fsf_qtcb *qtcb = req->qtcb;
1148 u32 feat = adapter->adapter_features;
1149
1150 if (zfcp_adapter_multi_buffer_active(adapter)) {
1151 if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
1152 return -EIO;
1153 qtcb->bottom.support.req_buf_length =
1154 zfcp_qdio_real_bytes(sg_req);
1155 if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
1156 return -EIO;
1157 qtcb->bottom.support.resp_buf_length =
1158 zfcp_qdio_real_bytes(sg_resp);
1159
1160 zfcp_qdio_set_data_div(qdio, &req->qdio_req, sg_nents(sg_req));
1161 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1162 zfcp_qdio_set_scount(qdio, &req->qdio_req);
1163 return 0;
1164 }
1165
1166
1167 if (zfcp_qdio_sg_one_sbale(sg_req) && zfcp_qdio_sg_one_sbale(sg_resp)) {
1168 zfcp_fsf_setup_ct_els_unchained(qdio, &req->qdio_req,
1169 sg_req, sg_resp);
1170 return 0;
1171 }
1172
1173 if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS))
1174 return -EOPNOTSUPP;
1175
1176 if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
1177 return -EIO;
1178
1179 qtcb->bottom.support.req_buf_length = zfcp_qdio_real_bytes(sg_req);
1180
1181 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1182 zfcp_qdio_skip_to_last_sbale(qdio, &req->qdio_req);
1183
1184 if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
1185 return -EIO;
1186
1187 qtcb->bottom.support.resp_buf_length = zfcp_qdio_real_bytes(sg_resp);
1188
1189 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1190
1191 return 0;
1192}
1193
1194static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
1195 struct scatterlist *sg_req,
1196 struct scatterlist *sg_resp,
1197 unsigned int timeout)
1198{
1199 int ret;
1200
1201 ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp);
1202 if (ret)
1203 return ret;
1204
1205
1206 if (timeout > 255)
1207 timeout = 255;
1208 req->qtcb->bottom.support.service_class = FSF_CLASS_3;
1209 req->qtcb->bottom.support.timeout = timeout;
1210 zfcp_fsf_start_timer(req, (timeout + 10) * HZ);
1211
1212 return 0;
1213}
1214
1215
1216
1217
1218
1219
1220
1221
1222int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
1223 struct zfcp_fsf_ct_els *ct, mempool_t *pool,
1224 unsigned int timeout)
1225{
1226 struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1227 struct zfcp_fsf_req *req;
1228 int ret = -EIO;
1229
1230 spin_lock_irq(&qdio->req_q_lock);
1231 if (zfcp_qdio_sbal_get(qdio))
1232 goto out;
1233
1234 req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC,
1235 SBAL_SFLAGS0_TYPE_WRITE_READ, pool);
1236
1237 if (IS_ERR(req)) {
1238 ret = PTR_ERR(req);
1239 goto out;
1240 }
1241
1242 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1243 ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, timeout);
1244 if (ret)
1245 goto failed_send;
1246
1247 req->handler = zfcp_fsf_send_ct_handler;
1248 req->qtcb->header.port_handle = wka_port->handle;
1249 ct->d_id = wka_port->d_id;
1250 req->data = ct;
1251
1252 zfcp_dbf_san_req("fssct_1", req, wka_port->d_id);
1253
1254 ret = zfcp_fsf_req_send(req);
1255 if (ret)
1256 goto failed_send;
1257
1258
1259 goto out;
1260
1261failed_send:
1262 zfcp_fsf_req_free(req);
1263out:
1264 spin_unlock_irq(&qdio->req_q_lock);
1265 return ret;
1266}
1267
1268static void zfcp_fsf_send_els_handler(struct zfcp_fsf_req *req)
1269{
1270 struct zfcp_fsf_ct_els *send_els = req->data;
1271 struct fsf_qtcb_header *header = &req->qtcb->header;
1272
1273 send_els->status = -EINVAL;
1274
1275 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1276 goto skip_fsfstatus;
1277
1278 switch (header->fsf_status) {
1279 case FSF_GOOD:
1280 send_els->status = 0;
1281 zfcp_dbf_san_res("fsselh1", req);
1282 break;
1283 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
1284 zfcp_fsf_class_not_supp(req);
1285 break;
1286 case FSF_ADAPTER_STATUS_AVAILABLE:
1287 switch (header->fsf_status_qual.word[0]){
1288 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1289 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1290 case FSF_SQ_RETRY_IF_POSSIBLE:
1291 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1292 break;
1293 }
1294 break;
1295 case FSF_ELS_COMMAND_REJECTED:
1296 case FSF_PAYLOAD_SIZE_MISMATCH:
1297 case FSF_REQUEST_SIZE_TOO_LARGE:
1298 case FSF_RESPONSE_SIZE_TOO_LARGE:
1299 break;
1300 case FSF_SBAL_MISMATCH:
1301
1302 fallthrough;
1303 default:
1304 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1305 break;
1306 }
1307skip_fsfstatus:
1308 if (send_els->handler)
1309 send_els->handler(send_els->handler_data);
1310}
1311
1312
1313
1314
1315
1316
1317
1318
1319int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
1320 struct zfcp_fsf_ct_els *els, unsigned int timeout)
1321{
1322 struct zfcp_fsf_req *req;
1323 struct zfcp_qdio *qdio = adapter->qdio;
1324 int ret = -EIO;
1325
1326 spin_lock_irq(&qdio->req_q_lock);
1327 if (zfcp_qdio_sbal_get(qdio))
1328 goto out;
1329
1330 req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS,
1331 SBAL_SFLAGS0_TYPE_WRITE_READ, NULL);
1332
1333 if (IS_ERR(req)) {
1334 ret = PTR_ERR(req);
1335 goto out;
1336 }
1337
1338 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1339
1340 if (!zfcp_adapter_multi_buffer_active(adapter))
1341 zfcp_qdio_sbal_limit(qdio, &req->qdio_req, 2);
1342
1343 ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, timeout);
1344
1345 if (ret)
1346 goto failed_send;
1347
1348 hton24(req->qtcb->bottom.support.d_id, d_id);
1349 req->handler = zfcp_fsf_send_els_handler;
1350 els->d_id = d_id;
1351 req->data = els;
1352
1353 zfcp_dbf_san_req("fssels1", req, d_id);
1354
1355 ret = zfcp_fsf_req_send(req);
1356 if (ret)
1357 goto failed_send;
1358
1359
1360 goto out;
1361
1362failed_send:
1363 zfcp_fsf_req_free(req);
1364out:
1365 spin_unlock_irq(&qdio->req_q_lock);
1366 return ret;
1367}
1368
1369int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
1370{
1371 struct zfcp_fsf_req *req;
1372 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1373 int retval = -EIO;
1374
1375 spin_lock_irq(&qdio->req_q_lock);
1376 if (zfcp_qdio_sbal_get(qdio))
1377 goto out;
1378
1379 req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
1380 SBAL_SFLAGS0_TYPE_READ,
1381 qdio->adapter->pool.erp_req);
1382
1383 if (IS_ERR(req)) {
1384 retval = PTR_ERR(req);
1385 goto out;
1386 }
1387
1388 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1389 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1390
1391 req->qtcb->bottom.config.feature_selection =
1392 FSF_FEATURE_NOTIFICATION_LOST |
1393 FSF_FEATURE_UPDATE_ALERT |
1394 FSF_FEATURE_REQUEST_SFP_DATA |
1395 FSF_FEATURE_FC_SECURITY;
1396 req->erp_action = erp_action;
1397 req->handler = zfcp_fsf_exchange_config_data_handler;
1398 erp_action->fsf_req_id = req->req_id;
1399
1400 zfcp_fsf_start_erp_timer(req);
1401 retval = zfcp_fsf_req_send(req);
1402 if (retval) {
1403 zfcp_fsf_req_free(req);
1404 erp_action->fsf_req_id = 0;
1405 }
1406
1407out:
1408 spin_unlock_irq(&qdio->req_q_lock);
1409 return retval;
1410}
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
1426 struct fsf_qtcb_bottom_config *data)
1427{
1428 struct zfcp_fsf_req *req = NULL;
1429 int retval = -EIO;
1430
1431 spin_lock_irq(&qdio->req_q_lock);
1432 if (zfcp_qdio_sbal_get(qdio))
1433 goto out_unlock;
1434
1435 req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
1436 SBAL_SFLAGS0_TYPE_READ, NULL);
1437
1438 if (IS_ERR(req)) {
1439 retval = PTR_ERR(req);
1440 goto out_unlock;
1441 }
1442
1443 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1444 req->handler = zfcp_fsf_exchange_config_data_handler;
1445
1446 req->qtcb->bottom.config.feature_selection =
1447 FSF_FEATURE_NOTIFICATION_LOST |
1448 FSF_FEATURE_UPDATE_ALERT |
1449 FSF_FEATURE_REQUEST_SFP_DATA |
1450 FSF_FEATURE_FC_SECURITY;
1451
1452 if (data)
1453 req->data = data;
1454
1455 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1456 retval = zfcp_fsf_req_send(req);
1457 spin_unlock_irq(&qdio->req_q_lock);
1458
1459 if (!retval) {
1460
1461 wait_for_completion(&req->completion);
1462
1463 if (req->status &
1464 (ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_DISMISSED))
1465 retval = -EIO;
1466 else if (req->status & ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE)
1467 retval = -EAGAIN;
1468 }
1469
1470 zfcp_fsf_req_free(req);
1471 return retval;
1472
1473out_unlock:
1474 spin_unlock_irq(&qdio->req_q_lock);
1475 return retval;
1476}
1477
1478
1479
1480
1481
1482
1483int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
1484{
1485 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1486 struct zfcp_fsf_req *req;
1487 int retval = -EIO;
1488
1489 if (!(qdio->adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
1490 return -EOPNOTSUPP;
1491
1492 spin_lock_irq(&qdio->req_q_lock);
1493 if (zfcp_qdio_sbal_get(qdio))
1494 goto out;
1495
1496 req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
1497 SBAL_SFLAGS0_TYPE_READ,
1498 qdio->adapter->pool.erp_req);
1499
1500 if (IS_ERR(req)) {
1501 retval = PTR_ERR(req);
1502 goto out;
1503 }
1504
1505 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1506 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1507
1508 req->handler = zfcp_fsf_exchange_port_data_handler;
1509 req->erp_action = erp_action;
1510 erp_action->fsf_req_id = req->req_id;
1511
1512 zfcp_fsf_start_erp_timer(req);
1513 retval = zfcp_fsf_req_send(req);
1514 if (retval) {
1515 zfcp_fsf_req_free(req);
1516 erp_action->fsf_req_id = 0;
1517 }
1518
1519out:
1520 spin_unlock_irq(&qdio->req_q_lock);
1521 return retval;
1522}
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio,
1538 struct fsf_qtcb_bottom_port *data)
1539{
1540 struct zfcp_fsf_req *req = NULL;
1541 int retval = -EIO;
1542
1543 if (!(qdio->adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
1544 return -EOPNOTSUPP;
1545
1546 spin_lock_irq(&qdio->req_q_lock);
1547 if (zfcp_qdio_sbal_get(qdio))
1548 goto out_unlock;
1549
1550 req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
1551 SBAL_SFLAGS0_TYPE_READ, NULL);
1552
1553 if (IS_ERR(req)) {
1554 retval = PTR_ERR(req);
1555 goto out_unlock;
1556 }
1557
1558 if (data)
1559 req->data = data;
1560
1561 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1562
1563 req->handler = zfcp_fsf_exchange_port_data_handler;
1564 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1565 retval = zfcp_fsf_req_send(req);
1566 spin_unlock_irq(&qdio->req_q_lock);
1567
1568 if (!retval) {
1569
1570 wait_for_completion(&req->completion);
1571
1572 if (req->status &
1573 (ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_DISMISSED))
1574 retval = -EIO;
1575 else if (req->status & ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE)
1576 retval = -EAGAIN;
1577 }
1578
1579 zfcp_fsf_req_free(req);
1580 return retval;
1581
1582out_unlock:
1583 spin_unlock_irq(&qdio->req_q_lock);
1584 return retval;
1585}
1586
1587static void zfcp_fsf_log_port_fc_security(struct zfcp_port *port,
1588 struct zfcp_fsf_req *req)
1589{
1590 char mnemonic_old[ZFCP_FSF_MAX_FC_SECURITY_MNEMONIC_LENGTH];
1591 char mnemonic_new[ZFCP_FSF_MAX_FC_SECURITY_MNEMONIC_LENGTH];
1592
1593 if (port->connection_info == port->connection_info_old) {
1594
1595 return;
1596 }
1597
1598 zfcp_dbf_hba_fsf_fces("fsfcesp", req, port->wwpn,
1599 port->connection_info_old,
1600 port->connection_info);
1601
1602 zfcp_fsf_scnprint_fc_security(mnemonic_old, sizeof(mnemonic_old),
1603 port->connection_info_old,
1604 ZFCP_FSF_PRINT_FMT_SINGLEITEM);
1605 zfcp_fsf_scnprint_fc_security(mnemonic_new, sizeof(mnemonic_new),
1606 port->connection_info,
1607 ZFCP_FSF_PRINT_FMT_SINGLEITEM);
1608
1609 if (strncmp(mnemonic_old, mnemonic_new,
1610 ZFCP_FSF_MAX_FC_SECURITY_MNEMONIC_LENGTH) == 0) {
1611
1612 goto out;
1613 }
1614
1615 if (port->connection_info_old == 0) {
1616
1617 dev_info(&port->adapter->ccw_device->dev,
1618 "FC Endpoint Security of connection to remote port 0x%16llx enabled: %s\n",
1619 port->wwpn, mnemonic_new);
1620 } else if (port->connection_info == 0) {
1621
1622 dev_warn(&port->adapter->ccw_device->dev,
1623 "FC Endpoint Security of connection to remote port 0x%16llx disabled: was %s\n",
1624 port->wwpn, mnemonic_old);
1625 } else {
1626
1627 dev_warn(&port->adapter->ccw_device->dev,
1628 "FC Endpoint Security of connection to remote port 0x%16llx changed: from %s to %s\n",
1629 port->wwpn, mnemonic_old, mnemonic_new);
1630 }
1631
1632out:
1633 port->connection_info_old = port->connection_info;
1634}
1635
1636static void zfcp_fsf_log_security_error(const struct device *dev, u32 fsf_sqw0,
1637 u64 wwpn)
1638{
1639 switch (fsf_sqw0) {
1640
1641
1642
1643
1644
1645 case FSF_SQ_SECURITY_REQUIRED:
1646 dev_warn_ratelimited(dev,
1647 "FC Endpoint Security error: FC security is required but not supported or configured on remote port 0x%016llx\n",
1648 wwpn);
1649 break;
1650 case FSF_SQ_SECURITY_TIMEOUT:
1651 dev_warn_ratelimited(dev,
1652 "FC Endpoint Security error: a timeout prevented opening remote port 0x%016llx\n",
1653 wwpn);
1654 break;
1655 case FSF_SQ_SECURITY_KM_UNAVAILABLE:
1656 dev_warn_ratelimited(dev,
1657 "FC Endpoint Security error: opening remote port 0x%016llx failed because local and external key manager cannot communicate\n",
1658 wwpn);
1659 break;
1660 case FSF_SQ_SECURITY_RKM_UNAVAILABLE:
1661 dev_warn_ratelimited(dev,
1662 "FC Endpoint Security error: opening remote port 0x%016llx failed because it cannot communicate with the external key manager\n",
1663 wwpn);
1664 break;
1665 case FSF_SQ_SECURITY_AUTH_FAILURE:
1666 dev_warn_ratelimited(dev,
1667 "FC Endpoint Security error: the device could not verify the identity of remote port 0x%016llx\n",
1668 wwpn);
1669 break;
1670
1671
1672
1673
1674
1675 case FSF_SQ_SECURITY_ENC_FAILURE:
1676 dev_warn_ratelimited(dev,
1677 "FC Endpoint Security error: FC connection to remote port 0x%016llx closed because encryption broke down\n",
1678 wwpn);
1679 break;
1680
1681
1682
1683
1684
1685 default:
1686 dev_warn_ratelimited(dev,
1687 "FC Endpoint Security error: the device issued an unknown error code 0x%08x related to the FC connection to remote port 0x%016llx\n",
1688 fsf_sqw0, wwpn);
1689 }
1690}
1691
1692static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req)
1693{
1694 struct zfcp_adapter *adapter = req->adapter;
1695 struct zfcp_port *port = req->data;
1696 struct fsf_qtcb_header *header = &req->qtcb->header;
1697 struct fsf_qtcb_bottom_support *bottom = &req->qtcb->bottom.support;
1698 struct fc_els_flogi *plogi;
1699
1700 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1701 goto out;
1702
1703 switch (header->fsf_status) {
1704 case FSF_PORT_ALREADY_OPEN:
1705 break;
1706 case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
1707 dev_warn(&adapter->ccw_device->dev,
1708 "Not enough FCP adapter resources to open "
1709 "remote port 0x%016Lx\n",
1710 (unsigned long long)port->wwpn);
1711 zfcp_erp_set_port_status(port,
1712 ZFCP_STATUS_COMMON_ERP_FAILED);
1713 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1714 break;
1715 case FSF_SECURITY_ERROR:
1716 zfcp_fsf_log_security_error(&req->adapter->ccw_device->dev,
1717 header->fsf_status_qual.word[0],
1718 port->wwpn);
1719 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1720 break;
1721 case FSF_ADAPTER_STATUS_AVAILABLE:
1722 switch (header->fsf_status_qual.word[0]) {
1723 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1724
1725 fallthrough;
1726 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1727 case FSF_SQ_NO_RETRY_POSSIBLE:
1728 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1729 break;
1730 }
1731 break;
1732 case FSF_GOOD:
1733 port->handle = header->port_handle;
1734 if (adapter->adapter_features & FSF_FEATURE_FC_SECURITY)
1735 port->connection_info = bottom->connection_info;
1736 else
1737 port->connection_info = 0;
1738 zfcp_fsf_log_port_fc_security(port, req);
1739 atomic_or(ZFCP_STATUS_COMMON_OPEN |
1740 ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
1741 atomic_andnot(ZFCP_STATUS_COMMON_ACCESS_BOXED,
1742 &port->status);
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758 plogi = (struct fc_els_flogi *) bottom->els;
1759 if (bottom->els1_length >= FSF_PLOGI_MIN_LEN)
1760 zfcp_fc_plogi_evaluate(port, plogi);
1761 break;
1762 case FSF_UNKNOWN_OP_SUBTYPE:
1763 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1764 break;
1765 }
1766
1767out:
1768 put_device(&port->dev);
1769}
1770
1771
1772
1773
1774
1775
1776int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
1777{
1778 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1779 struct zfcp_port *port = erp_action->port;
1780 struct zfcp_fsf_req *req;
1781 int retval = -EIO;
1782
1783 spin_lock_irq(&qdio->req_q_lock);
1784 if (zfcp_qdio_sbal_get(qdio))
1785 goto out;
1786
1787 req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
1788 SBAL_SFLAGS0_TYPE_READ,
1789 qdio->adapter->pool.erp_req);
1790
1791 if (IS_ERR(req)) {
1792 retval = PTR_ERR(req);
1793 goto out;
1794 }
1795
1796 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1797 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1798
1799 req->handler = zfcp_fsf_open_port_handler;
1800 hton24(req->qtcb->bottom.support.d_id, port->d_id);
1801 req->data = port;
1802 req->erp_action = erp_action;
1803 erp_action->fsf_req_id = req->req_id;
1804 get_device(&port->dev);
1805
1806 zfcp_fsf_start_erp_timer(req);
1807 retval = zfcp_fsf_req_send(req);
1808 if (retval) {
1809 zfcp_fsf_req_free(req);
1810 erp_action->fsf_req_id = 0;
1811 put_device(&port->dev);
1812 }
1813
1814out:
1815 spin_unlock_irq(&qdio->req_q_lock);
1816 return retval;
1817}
1818
1819static void zfcp_fsf_close_port_handler(struct zfcp_fsf_req *req)
1820{
1821 struct zfcp_port *port = req->data;
1822
1823 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1824 return;
1825
1826 switch (req->qtcb->header.fsf_status) {
1827 case FSF_PORT_HANDLE_NOT_VALID:
1828 zfcp_erp_adapter_reopen(port->adapter, 0, "fscph_1");
1829 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1830 break;
1831 case FSF_ADAPTER_STATUS_AVAILABLE:
1832 break;
1833 case FSF_GOOD:
1834 zfcp_erp_clear_port_status(port, ZFCP_STATUS_COMMON_OPEN);
1835 break;
1836 }
1837}
1838
1839
1840
1841
1842
1843
1844int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
1845{
1846 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1847 struct zfcp_fsf_req *req;
1848 int retval = -EIO;
1849
1850 spin_lock_irq(&qdio->req_q_lock);
1851 if (zfcp_qdio_sbal_get(qdio))
1852 goto out;
1853
1854 req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
1855 SBAL_SFLAGS0_TYPE_READ,
1856 qdio->adapter->pool.erp_req);
1857
1858 if (IS_ERR(req)) {
1859 retval = PTR_ERR(req);
1860 goto out;
1861 }
1862
1863 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1864 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1865
1866 req->handler = zfcp_fsf_close_port_handler;
1867 req->data = erp_action->port;
1868 req->erp_action = erp_action;
1869 req->qtcb->header.port_handle = erp_action->port->handle;
1870 erp_action->fsf_req_id = req->req_id;
1871
1872 zfcp_fsf_start_erp_timer(req);
1873 retval = zfcp_fsf_req_send(req);
1874 if (retval) {
1875 zfcp_fsf_req_free(req);
1876 erp_action->fsf_req_id = 0;
1877 }
1878
1879out:
1880 spin_unlock_irq(&qdio->req_q_lock);
1881 return retval;
1882}
1883
1884static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
1885{
1886 struct zfcp_fc_wka_port *wka_port = req->data;
1887 struct fsf_qtcb_header *header = &req->qtcb->header;
1888
1889 if (req->status & ZFCP_STATUS_FSFREQ_ERROR) {
1890 wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1891 goto out;
1892 }
1893
1894 switch (header->fsf_status) {
1895 case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
1896 dev_warn(&req->adapter->ccw_device->dev,
1897 "Opening WKA port 0x%x failed\n", wka_port->d_id);
1898 fallthrough;
1899 case FSF_ADAPTER_STATUS_AVAILABLE:
1900 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1901 wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1902 break;
1903 case FSF_GOOD:
1904 wka_port->handle = header->port_handle;
1905 fallthrough;
1906 case FSF_PORT_ALREADY_OPEN:
1907 wka_port->status = ZFCP_FC_WKA_PORT_ONLINE;
1908 }
1909out:
1910 wake_up(&wka_port->completion_wq);
1911}
1912
1913
1914
1915
1916
1917
1918int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
1919{
1920 struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1921 struct zfcp_fsf_req *req;
1922 unsigned long req_id = 0;
1923 int retval = -EIO;
1924
1925 spin_lock_irq(&qdio->req_q_lock);
1926 if (zfcp_qdio_sbal_get(qdio))
1927 goto out;
1928
1929 req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
1930 SBAL_SFLAGS0_TYPE_READ,
1931 qdio->adapter->pool.erp_req);
1932
1933 if (IS_ERR(req)) {
1934 retval = PTR_ERR(req);
1935 goto out;
1936 }
1937
1938 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1939 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1940
1941 req->handler = zfcp_fsf_open_wka_port_handler;
1942 hton24(req->qtcb->bottom.support.d_id, wka_port->d_id);
1943 req->data = wka_port;
1944
1945 req_id = req->req_id;
1946
1947 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1948 retval = zfcp_fsf_req_send(req);
1949 if (retval)
1950 zfcp_fsf_req_free(req);
1951
1952out:
1953 spin_unlock_irq(&qdio->req_q_lock);
1954 if (!retval)
1955 zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req_id);
1956 return retval;
1957}
1958
1959static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
1960{
1961 struct zfcp_fc_wka_port *wka_port = req->data;
1962
1963 if (req->qtcb->header.fsf_status == FSF_PORT_HANDLE_NOT_VALID) {
1964 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1965 zfcp_erp_adapter_reopen(wka_port->adapter, 0, "fscwph1");
1966 }
1967
1968 wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1969 wake_up(&wka_port->completion_wq);
1970}
1971
1972
1973
1974
1975
1976
1977int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
1978{
1979 struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1980 struct zfcp_fsf_req *req;
1981 unsigned long req_id = 0;
1982 int retval = -EIO;
1983
1984 spin_lock_irq(&qdio->req_q_lock);
1985 if (zfcp_qdio_sbal_get(qdio))
1986 goto out;
1987
1988 req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
1989 SBAL_SFLAGS0_TYPE_READ,
1990 qdio->adapter->pool.erp_req);
1991
1992 if (IS_ERR(req)) {
1993 retval = PTR_ERR(req);
1994 goto out;
1995 }
1996
1997 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1998 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1999
2000 req->handler = zfcp_fsf_close_wka_port_handler;
2001 req->data = wka_port;
2002 req->qtcb->header.port_handle = wka_port->handle;
2003
2004 req_id = req->req_id;
2005
2006 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2007 retval = zfcp_fsf_req_send(req);
2008 if (retval)
2009 zfcp_fsf_req_free(req);
2010
2011out:
2012 spin_unlock_irq(&qdio->req_q_lock);
2013 if (!retval)
2014 zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req_id);
2015 return retval;
2016}
2017
2018static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req)
2019{
2020 struct zfcp_port *port = req->data;
2021 struct fsf_qtcb_header *header = &req->qtcb->header;
2022 struct scsi_device *sdev;
2023
2024 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2025 return;
2026
2027 switch (header->fsf_status) {
2028 case FSF_PORT_HANDLE_NOT_VALID:
2029 zfcp_erp_adapter_reopen(port->adapter, 0, "fscpph1");
2030 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2031 break;
2032 case FSF_PORT_BOXED:
2033
2034
2035 atomic_andnot(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
2036 shost_for_each_device(sdev, port->adapter->scsi_host)
2037 if (sdev_to_zfcp(sdev)->port == port)
2038 atomic_andnot(ZFCP_STATUS_COMMON_OPEN,
2039 &sdev_to_zfcp(sdev)->status);
2040 zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ACCESS_BOXED);
2041 zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
2042 "fscpph2");
2043 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2044 break;
2045 case FSF_ADAPTER_STATUS_AVAILABLE:
2046 switch (header->fsf_status_qual.word[0]) {
2047 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
2048 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
2049 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2050 break;
2051 }
2052 break;
2053 case FSF_GOOD:
2054
2055
2056
2057 atomic_andnot(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
2058 shost_for_each_device(sdev, port->adapter->scsi_host)
2059 if (sdev_to_zfcp(sdev)->port == port)
2060 atomic_andnot(ZFCP_STATUS_COMMON_OPEN,
2061 &sdev_to_zfcp(sdev)->status);
2062 break;
2063 }
2064}
2065
2066
2067
2068
2069
2070
2071int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
2072{
2073 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
2074 struct zfcp_fsf_req *req;
2075 int retval = -EIO;
2076
2077 spin_lock_irq(&qdio->req_q_lock);
2078 if (zfcp_qdio_sbal_get(qdio))
2079 goto out;
2080
2081 req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT,
2082 SBAL_SFLAGS0_TYPE_READ,
2083 qdio->adapter->pool.erp_req);
2084
2085 if (IS_ERR(req)) {
2086 retval = PTR_ERR(req);
2087 goto out;
2088 }
2089
2090 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
2091 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
2092
2093 req->data = erp_action->port;
2094 req->qtcb->header.port_handle = erp_action->port->handle;
2095 req->erp_action = erp_action;
2096 req->handler = zfcp_fsf_close_physical_port_handler;
2097 erp_action->fsf_req_id = req->req_id;
2098
2099 zfcp_fsf_start_erp_timer(req);
2100 retval = zfcp_fsf_req_send(req);
2101 if (retval) {
2102 zfcp_fsf_req_free(req);
2103 erp_action->fsf_req_id = 0;
2104 }
2105
2106out:
2107 spin_unlock_irq(&qdio->req_q_lock);
2108 return retval;
2109}
2110
2111static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req)
2112{
2113 struct zfcp_adapter *adapter = req->adapter;
2114 struct scsi_device *sdev = req->data;
2115 struct zfcp_scsi_dev *zfcp_sdev;
2116 struct fsf_qtcb_header *header = &req->qtcb->header;
2117 union fsf_status_qual *qual = &header->fsf_status_qual;
2118
2119 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2120 return;
2121
2122 zfcp_sdev = sdev_to_zfcp(sdev);
2123
2124 atomic_andnot(ZFCP_STATUS_COMMON_ACCESS_DENIED |
2125 ZFCP_STATUS_COMMON_ACCESS_BOXED,
2126 &zfcp_sdev->status);
2127
2128 switch (header->fsf_status) {
2129
2130 case FSF_PORT_HANDLE_NOT_VALID:
2131 zfcp_erp_adapter_reopen(adapter, 0, "fsouh_1");
2132 fallthrough;
2133 case FSF_LUN_ALREADY_OPEN:
2134 break;
2135 case FSF_PORT_BOXED:
2136 zfcp_erp_set_port_status(zfcp_sdev->port,
2137 ZFCP_STATUS_COMMON_ACCESS_BOXED);
2138 zfcp_erp_port_reopen(zfcp_sdev->port,
2139 ZFCP_STATUS_COMMON_ERP_FAILED, "fsouh_2");
2140 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2141 break;
2142 case FSF_LUN_SHARING_VIOLATION:
2143 if (qual->word[0])
2144 dev_warn(&zfcp_sdev->port->adapter->ccw_device->dev,
2145 "LUN 0x%016Lx on port 0x%016Lx is already in "
2146 "use by CSS%d, MIF Image ID %x\n",
2147 zfcp_scsi_dev_lun(sdev),
2148 (unsigned long long)zfcp_sdev->port->wwpn,
2149 qual->fsf_queue_designator.cssid,
2150 qual->fsf_queue_designator.hla);
2151 zfcp_erp_set_lun_status(sdev,
2152 ZFCP_STATUS_COMMON_ERP_FAILED |
2153 ZFCP_STATUS_COMMON_ACCESS_DENIED);
2154 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2155 break;
2156 case FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED:
2157 dev_warn(&adapter->ccw_device->dev,
2158 "No handle is available for LUN "
2159 "0x%016Lx on port 0x%016Lx\n",
2160 (unsigned long long)zfcp_scsi_dev_lun(sdev),
2161 (unsigned long long)zfcp_sdev->port->wwpn);
2162 zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED);
2163 fallthrough;
2164 case FSF_INVALID_COMMAND_OPTION:
2165 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2166 break;
2167 case FSF_ADAPTER_STATUS_AVAILABLE:
2168 switch (header->fsf_status_qual.word[0]) {
2169 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
2170 zfcp_fc_test_link(zfcp_sdev->port);
2171 fallthrough;
2172 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
2173 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2174 break;
2175 }
2176 break;
2177
2178 case FSF_GOOD:
2179 zfcp_sdev->lun_handle = header->lun_handle;
2180 atomic_or(ZFCP_STATUS_COMMON_OPEN, &zfcp_sdev->status);
2181 break;
2182 }
2183}
2184
2185
2186
2187
2188
2189
2190int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action)
2191{
2192 struct zfcp_adapter *adapter = erp_action->adapter;
2193 struct zfcp_qdio *qdio = adapter->qdio;
2194 struct zfcp_fsf_req *req;
2195 int retval = -EIO;
2196
2197 spin_lock_irq(&qdio->req_q_lock);
2198 if (zfcp_qdio_sbal_get(qdio))
2199 goto out;
2200
2201 req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN,
2202 SBAL_SFLAGS0_TYPE_READ,
2203 adapter->pool.erp_req);
2204
2205 if (IS_ERR(req)) {
2206 retval = PTR_ERR(req);
2207 goto out;
2208 }
2209
2210 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
2211 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
2212
2213 req->qtcb->header.port_handle = erp_action->port->handle;
2214 req->qtcb->bottom.support.fcp_lun = zfcp_scsi_dev_lun(erp_action->sdev);
2215 req->handler = zfcp_fsf_open_lun_handler;
2216 req->data = erp_action->sdev;
2217 req->erp_action = erp_action;
2218 erp_action->fsf_req_id = req->req_id;
2219
2220 if (!(adapter->connection_features & FSF_FEATURE_NPIV_MODE))
2221 req->qtcb->bottom.support.option = FSF_OPEN_LUN_SUPPRESS_BOXING;
2222
2223 zfcp_fsf_start_erp_timer(req);
2224 retval = zfcp_fsf_req_send(req);
2225 if (retval) {
2226 zfcp_fsf_req_free(req);
2227 erp_action->fsf_req_id = 0;
2228 }
2229
2230out:
2231 spin_unlock_irq(&qdio->req_q_lock);
2232 return retval;
2233}
2234
2235static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req)
2236{
2237 struct scsi_device *sdev = req->data;
2238 struct zfcp_scsi_dev *zfcp_sdev;
2239
2240 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2241 return;
2242
2243 zfcp_sdev = sdev_to_zfcp(sdev);
2244
2245 switch (req->qtcb->header.fsf_status) {
2246 case FSF_PORT_HANDLE_NOT_VALID:
2247 zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1");
2248 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2249 break;
2250 case FSF_LUN_HANDLE_NOT_VALID:
2251 zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fscuh_2");
2252 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2253 break;
2254 case FSF_PORT_BOXED:
2255 zfcp_erp_set_port_status(zfcp_sdev->port,
2256 ZFCP_STATUS_COMMON_ACCESS_BOXED);
2257 zfcp_erp_port_reopen(zfcp_sdev->port,
2258 ZFCP_STATUS_COMMON_ERP_FAILED, "fscuh_3");
2259 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2260 break;
2261 case FSF_ADAPTER_STATUS_AVAILABLE:
2262 switch (req->qtcb->header.fsf_status_qual.word[0]) {
2263 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
2264 zfcp_fc_test_link(zfcp_sdev->port);
2265 fallthrough;
2266 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
2267 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2268 break;
2269 }
2270 break;
2271 case FSF_GOOD:
2272 atomic_andnot(ZFCP_STATUS_COMMON_OPEN, &zfcp_sdev->status);
2273 break;
2274 }
2275}
2276
2277
2278
2279
2280
2281
2282int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action)
2283{
2284 struct zfcp_qdio *qdio = erp_action->adapter->qdio;
2285 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(erp_action->sdev);
2286 struct zfcp_fsf_req *req;
2287 int retval = -EIO;
2288
2289 spin_lock_irq(&qdio->req_q_lock);
2290 if (zfcp_qdio_sbal_get(qdio))
2291 goto out;
2292
2293 req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN,
2294 SBAL_SFLAGS0_TYPE_READ,
2295 qdio->adapter->pool.erp_req);
2296
2297 if (IS_ERR(req)) {
2298 retval = PTR_ERR(req);
2299 goto out;
2300 }
2301
2302 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
2303 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
2304
2305 req->qtcb->header.port_handle = erp_action->port->handle;
2306 req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
2307 req->handler = zfcp_fsf_close_lun_handler;
2308 req->data = erp_action->sdev;
2309 req->erp_action = erp_action;
2310 erp_action->fsf_req_id = req->req_id;
2311
2312 zfcp_fsf_start_erp_timer(req);
2313 retval = zfcp_fsf_req_send(req);
2314 if (retval) {
2315 zfcp_fsf_req_free(req);
2316 erp_action->fsf_req_id = 0;
2317 }
2318
2319out:
2320 spin_unlock_irq(&qdio->req_q_lock);
2321 return retval;
2322}
2323
2324static void zfcp_fsf_update_lat(struct zfcp_latency_record *lat_rec, u32 lat)
2325{
2326 lat_rec->sum += lat;
2327 lat_rec->min = min(lat_rec->min, lat);
2328 lat_rec->max = max(lat_rec->max, lat);
2329}
2330
2331static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi)
2332{
2333 struct fsf_qual_latency_info *lat_in;
2334 struct zfcp_latency_cont *lat = NULL;
2335 struct zfcp_scsi_dev *zfcp_sdev;
2336 struct zfcp_blk_drv_data blktrc;
2337 int ticks = req->adapter->timer_ticks;
2338
2339 lat_in = &req->qtcb->prefix.prot_status_qual.latency_info;
2340
2341 blktrc.flags = 0;
2342 blktrc.magic = ZFCP_BLK_DRV_DATA_MAGIC;
2343 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2344 blktrc.flags |= ZFCP_BLK_REQ_ERROR;
2345 blktrc.inb_usage = 0;
2346 blktrc.outb_usage = req->qdio_req.qdio_outb_usage;
2347
2348 if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA &&
2349 !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
2350 zfcp_sdev = sdev_to_zfcp(scsi->device);
2351 blktrc.flags |= ZFCP_BLK_LAT_VALID;
2352 blktrc.channel_lat = lat_in->channel_lat * ticks;
2353 blktrc.fabric_lat = lat_in->fabric_lat * ticks;
2354
2355 switch (req->qtcb->bottom.io.data_direction) {
2356 case FSF_DATADIR_DIF_READ_STRIP:
2357 case FSF_DATADIR_DIF_READ_CONVERT:
2358 case FSF_DATADIR_READ:
2359 lat = &zfcp_sdev->latencies.read;
2360 break;
2361 case FSF_DATADIR_DIF_WRITE_INSERT:
2362 case FSF_DATADIR_DIF_WRITE_CONVERT:
2363 case FSF_DATADIR_WRITE:
2364 lat = &zfcp_sdev->latencies.write;
2365 break;
2366 case FSF_DATADIR_CMND:
2367 lat = &zfcp_sdev->latencies.cmd;
2368 break;
2369 }
2370
2371 if (lat) {
2372 spin_lock(&zfcp_sdev->latencies.lock);
2373 zfcp_fsf_update_lat(&lat->channel, lat_in->channel_lat);
2374 zfcp_fsf_update_lat(&lat->fabric, lat_in->fabric_lat);
2375 lat->counter++;
2376 spin_unlock(&zfcp_sdev->latencies.lock);
2377 }
2378 }
2379
2380 blk_add_driver_data(scsi_cmd_to_rq(scsi), &blktrc, sizeof(blktrc));
2381}
2382
2383
2384
2385
2386
2387
2388static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req,
2389 struct scsi_device *sdev)
2390{
2391 struct zfcp_scsi_dev *zfcp_sdev;
2392 struct fsf_qtcb_header *header = &req->qtcb->header;
2393
2394 if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR))
2395 return;
2396
2397 zfcp_sdev = sdev_to_zfcp(sdev);
2398
2399 switch (header->fsf_status) {
2400 case FSF_HANDLE_MISMATCH:
2401 case FSF_PORT_HANDLE_NOT_VALID:
2402 zfcp_erp_adapter_reopen(req->adapter, 0, "fssfch1");
2403 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2404 break;
2405 case FSF_FCPLUN_NOT_VALID:
2406 case FSF_LUN_HANDLE_NOT_VALID:
2407 zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fssfch2");
2408 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2409 break;
2410 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
2411 zfcp_fsf_class_not_supp(req);
2412 break;
2413 case FSF_DIRECTION_INDICATOR_NOT_VALID:
2414 dev_err(&req->adapter->ccw_device->dev,
2415 "Incorrect direction %d, LUN 0x%016Lx on port "
2416 "0x%016Lx closed\n",
2417 req->qtcb->bottom.io.data_direction,
2418 (unsigned long long)zfcp_scsi_dev_lun(sdev),
2419 (unsigned long long)zfcp_sdev->port->wwpn);
2420 zfcp_erp_adapter_shutdown(req->adapter, 0, "fssfch3");
2421 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2422 break;
2423 case FSF_CMND_LENGTH_NOT_VALID:
2424 dev_err(&req->adapter->ccw_device->dev,
2425 "Incorrect FCP_CMND length %d, FCP device closed\n",
2426 req->qtcb->bottom.io.fcp_cmnd_length);
2427 zfcp_erp_adapter_shutdown(req->adapter, 0, "fssfch4");
2428 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2429 break;
2430 case FSF_PORT_BOXED:
2431 zfcp_erp_set_port_status(zfcp_sdev->port,
2432 ZFCP_STATUS_COMMON_ACCESS_BOXED);
2433 zfcp_erp_port_reopen(zfcp_sdev->port,
2434 ZFCP_STATUS_COMMON_ERP_FAILED, "fssfch5");
2435 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2436 break;
2437 case FSF_LUN_BOXED:
2438 zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED);
2439 zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED,
2440 "fssfch6");
2441 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2442 break;
2443 case FSF_ADAPTER_STATUS_AVAILABLE:
2444 if (header->fsf_status_qual.word[0] ==
2445 FSF_SQ_INVOKE_LINK_TEST_PROCEDURE)
2446 zfcp_fc_test_link(zfcp_sdev->port);
2447 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2448 break;
2449 case FSF_SECURITY_ERROR:
2450 zfcp_fsf_log_security_error(&req->adapter->ccw_device->dev,
2451 header->fsf_status_qual.word[0],
2452 zfcp_sdev->port->wwpn);
2453 zfcp_erp_port_forced_reopen(zfcp_sdev->port, 0, "fssfch7");
2454 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2455 break;
2456 }
2457}
2458
2459static void zfcp_fsf_fcp_cmnd_handler(struct zfcp_fsf_req *req)
2460{
2461 struct scsi_cmnd *scpnt;
2462 struct fcp_resp_with_ext *fcp_rsp;
2463 unsigned long flags;
2464
2465 read_lock_irqsave(&req->adapter->abort_lock, flags);
2466
2467 scpnt = req->data;
2468 if (unlikely(!scpnt)) {
2469 read_unlock_irqrestore(&req->adapter->abort_lock, flags);
2470 return;
2471 }
2472
2473 zfcp_fsf_fcp_handler_common(req, scpnt->device);
2474
2475 if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
2476 set_host_byte(scpnt, DID_TRANSPORT_DISRUPTED);
2477 goto skip_fsfstatus;
2478 }
2479
2480 switch (req->qtcb->header.fsf_status) {
2481 case FSF_INCONSISTENT_PROT_DATA:
2482 case FSF_INVALID_PROT_PARM:
2483 set_host_byte(scpnt, DID_ERROR);
2484 goto skip_fsfstatus;
2485 case FSF_BLOCK_GUARD_CHECK_FAILURE:
2486 zfcp_scsi_dif_sense_error(scpnt, 0x1);
2487 goto skip_fsfstatus;
2488 case FSF_APP_TAG_CHECK_FAILURE:
2489 zfcp_scsi_dif_sense_error(scpnt, 0x2);
2490 goto skip_fsfstatus;
2491 case FSF_REF_TAG_CHECK_FAILURE:
2492 zfcp_scsi_dif_sense_error(scpnt, 0x3);
2493 goto skip_fsfstatus;
2494 }
2495 BUILD_BUG_ON(sizeof(struct fcp_resp_with_ext) > FSF_FCP_RSP_SIZE);
2496 fcp_rsp = &req->qtcb->bottom.io.fcp_rsp.iu;
2497 zfcp_fc_eval_fcp_rsp(fcp_rsp, scpnt);
2498
2499skip_fsfstatus:
2500 zfcp_fsf_req_trace(req, scpnt);
2501 zfcp_dbf_scsi_result(scpnt, req);
2502
2503 scpnt->host_scribble = NULL;
2504 scsi_done(scpnt);
2505
2506
2507
2508
2509
2510
2511 read_unlock_irqrestore(&req->adapter->abort_lock, flags);
2512}
2513
2514static int zfcp_fsf_set_data_dir(struct scsi_cmnd *scsi_cmnd, u32 *data_dir)
2515{
2516 switch (scsi_get_prot_op(scsi_cmnd)) {
2517 case SCSI_PROT_NORMAL:
2518 switch (scsi_cmnd->sc_data_direction) {
2519 case DMA_NONE:
2520 *data_dir = FSF_DATADIR_CMND;
2521 break;
2522 case DMA_FROM_DEVICE:
2523 *data_dir = FSF_DATADIR_READ;
2524 break;
2525 case DMA_TO_DEVICE:
2526 *data_dir = FSF_DATADIR_WRITE;
2527 break;
2528 case DMA_BIDIRECTIONAL:
2529 return -EINVAL;
2530 }
2531 break;
2532
2533 case SCSI_PROT_READ_STRIP:
2534 *data_dir = FSF_DATADIR_DIF_READ_STRIP;
2535 break;
2536 case SCSI_PROT_WRITE_INSERT:
2537 *data_dir = FSF_DATADIR_DIF_WRITE_INSERT;
2538 break;
2539 case SCSI_PROT_READ_PASS:
2540 *data_dir = FSF_DATADIR_DIF_READ_CONVERT;
2541 break;
2542 case SCSI_PROT_WRITE_PASS:
2543 *data_dir = FSF_DATADIR_DIF_WRITE_CONVERT;
2544 break;
2545 default:
2546 return -EINVAL;
2547 }
2548
2549 return 0;
2550}
2551
2552
2553
2554
2555
2556int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
2557{
2558 struct zfcp_fsf_req *req;
2559 struct fcp_cmnd *fcp_cmnd;
2560 u8 sbtype = SBAL_SFLAGS0_TYPE_READ;
2561 int retval = -EIO;
2562 struct scsi_device *sdev = scsi_cmnd->device;
2563 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2564 struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
2565 struct zfcp_qdio *qdio = adapter->qdio;
2566 struct fsf_qtcb_bottom_io *io;
2567 unsigned long flags;
2568
2569 if (unlikely(!(atomic_read(&zfcp_sdev->status) &
2570 ZFCP_STATUS_COMMON_UNBLOCKED)))
2571 return -EBUSY;
2572
2573 spin_lock_irqsave(&qdio->req_q_lock, flags);
2574 if (atomic_read(&qdio->req_q_free) <= 0) {
2575 atomic_inc(&qdio->req_q_full);
2576 goto out;
2577 }
2578
2579 if (scsi_cmnd->sc_data_direction == DMA_TO_DEVICE)
2580 sbtype = SBAL_SFLAGS0_TYPE_WRITE;
2581
2582 req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
2583 sbtype, adapter->pool.scsi_req);
2584
2585 if (IS_ERR(req)) {
2586 retval = PTR_ERR(req);
2587 goto out;
2588 }
2589
2590 scsi_cmnd->host_scribble = (unsigned char *) req->req_id;
2591
2592 io = &req->qtcb->bottom.io;
2593 req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
2594 req->data = scsi_cmnd;
2595 req->handler = zfcp_fsf_fcp_cmnd_handler;
2596 req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
2597 req->qtcb->header.port_handle = zfcp_sdev->port->handle;
2598 io->service_class = FSF_CLASS_3;
2599 io->fcp_cmnd_length = FCP_CMND_LEN;
2600
2601 if (scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) {
2602 io->data_block_length = scsi_prot_interval(scsi_cmnd);
2603 io->ref_tag_value = scsi_prot_ref_tag(scsi_cmnd);
2604 }
2605
2606 if (zfcp_fsf_set_data_dir(scsi_cmnd, &io->data_direction))
2607 goto failed_scsi_cmnd;
2608
2609 BUILD_BUG_ON(sizeof(struct fcp_cmnd) > FSF_FCP_CMND_SIZE);
2610 fcp_cmnd = &req->qtcb->bottom.io.fcp_cmnd.iu;
2611 zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd);
2612
2613 if ((scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) &&
2614 scsi_prot_sg_count(scsi_cmnd)) {
2615 zfcp_qdio_set_data_div(qdio, &req->qdio_req,
2616 scsi_prot_sg_count(scsi_cmnd));
2617 retval = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
2618 scsi_prot_sglist(scsi_cmnd));
2619 if (retval)
2620 goto failed_scsi_cmnd;
2621 io->prot_data_length = zfcp_qdio_real_bytes(
2622 scsi_prot_sglist(scsi_cmnd));
2623 }
2624
2625 retval = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
2626 scsi_sglist(scsi_cmnd));
2627 if (unlikely(retval))
2628 goto failed_scsi_cmnd;
2629
2630 zfcp_qdio_set_sbale_last(adapter->qdio, &req->qdio_req);
2631 if (zfcp_adapter_multi_buffer_active(adapter))
2632 zfcp_qdio_set_scount(qdio, &req->qdio_req);
2633
2634 retval = zfcp_fsf_req_send(req);
2635 if (unlikely(retval))
2636 goto failed_scsi_cmnd;
2637
2638
2639 goto out;
2640
2641failed_scsi_cmnd:
2642 zfcp_fsf_req_free(req);
2643 scsi_cmnd->host_scribble = NULL;
2644out:
2645 spin_unlock_irqrestore(&qdio->req_q_lock, flags);
2646 return retval;
2647}
2648
2649static void zfcp_fsf_fcp_task_mgmt_handler(struct zfcp_fsf_req *req)
2650{
2651 struct scsi_device *sdev = req->data;
2652 struct fcp_resp_with_ext *fcp_rsp;
2653 struct fcp_resp_rsp_info *rsp_info;
2654
2655 zfcp_fsf_fcp_handler_common(req, sdev);
2656
2657 fcp_rsp = &req->qtcb->bottom.io.fcp_rsp.iu;
2658 rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1];
2659
2660 if ((rsp_info->rsp_code != FCP_TMF_CMPL) ||
2661 (req->status & ZFCP_STATUS_FSFREQ_ERROR))
2662 req->status |= ZFCP_STATUS_FSFREQ_TMFUNCFAILED;
2663}
2664
2665
2666
2667
2668
2669
2670
2671
2672struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_device *sdev,
2673 u8 tm_flags)
2674{
2675 struct zfcp_fsf_req *req = NULL;
2676 struct fcp_cmnd *fcp_cmnd;
2677 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2678 struct zfcp_qdio *qdio = zfcp_sdev->port->adapter->qdio;
2679
2680 if (unlikely(!(atomic_read(&zfcp_sdev->status) &
2681 ZFCP_STATUS_COMMON_UNBLOCKED)))
2682 return NULL;
2683
2684 spin_lock_irq(&qdio->req_q_lock);
2685 if (zfcp_qdio_sbal_get(qdio))
2686 goto out;
2687
2688 req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
2689 SBAL_SFLAGS0_TYPE_WRITE,
2690 qdio->adapter->pool.scsi_req);
2691
2692 if (IS_ERR(req)) {
2693 req = NULL;
2694 goto out;
2695 }
2696
2697 req->data = sdev;
2698
2699 req->handler = zfcp_fsf_fcp_task_mgmt_handler;
2700 req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
2701 req->qtcb->header.port_handle = zfcp_sdev->port->handle;
2702 req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND;
2703 req->qtcb->bottom.io.service_class = FSF_CLASS_3;
2704 req->qtcb->bottom.io.fcp_cmnd_length = FCP_CMND_LEN;
2705
2706 zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
2707
2708 fcp_cmnd = &req->qtcb->bottom.io.fcp_cmnd.iu;
2709 zfcp_fc_fcp_tm(fcp_cmnd, sdev, tm_flags);
2710
2711 zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT);
2712 if (!zfcp_fsf_req_send(req)) {
2713
2714 goto out;
2715 }
2716
2717 zfcp_fsf_req_free(req);
2718 req = NULL;
2719out:
2720 spin_unlock_irq(&qdio->req_q_lock);
2721 return req;
2722}
2723
2724
2725
2726
2727
2728
2729void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx)
2730{
2731 struct zfcp_adapter *adapter = qdio->adapter;
2732 struct qdio_buffer *sbal = qdio->res_q[sbal_idx];
2733 struct qdio_buffer_element *sbale;
2734 struct zfcp_fsf_req *fsf_req;
2735 unsigned long req_id;
2736 int idx;
2737
2738 for (idx = 0; idx < QDIO_MAX_ELEMENTS_PER_BUFFER; idx++) {
2739
2740 sbale = &sbal->element[idx];
2741 req_id = sbale->addr;
2742 fsf_req = zfcp_reqlist_find_rm(adapter->req_list, req_id);
2743
2744 if (!fsf_req) {
2745
2746
2747
2748
2749 zfcp_qdio_siosl(adapter);
2750 panic("error: unknown req_id (%lx) on adapter %s.\n",
2751 req_id, dev_name(&adapter->ccw_device->dev));
2752 }
2753
2754 zfcp_fsf_req_complete(fsf_req);
2755
2756 if (likely(sbale->eflags & SBAL_EFLAGS_LAST_ENTRY))
2757 break;
2758 }
2759}
2760