1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Marvell Fibre Channel HBA Driver 4 * Copyright (c) 2021 Marvell 5 */ 6 #include "qla_def.h" 7 #include "qla_edif.h" 8 9 #include <linux/kthread.h> 10 #include <linux/vmalloc.h> 11 #include <linux/delay.h> 12 #include <scsi/scsi_tcq.h> 13 14 static struct edif_sa_index_entry *qla_edif_sadb_find_sa_index_entry(uint16_t nport_handle, 15 struct list_head *sa_list); 16 static uint16_t qla_edif_sadb_get_sa_index(fc_port_t *fcport, 17 struct qla_sa_update_frame *sa_frame); 18 static int qla_edif_sadb_delete_sa_index(fc_port_t *fcport, uint16_t nport_handle, 19 uint16_t sa_index); 20 static int qla_pur_get_pending(scsi_qla_host_t *, fc_port_t *, struct bsg_job *); 21 22 struct edb_node { 23 struct list_head list; 24 uint32_t ntype; 25 union { 26 port_id_t plogi_did; 27 uint32_t async; 28 port_id_t els_sid; 29 struct edif_sa_update_aen sa_aen; 30 } u; 31 }; 32 33 static struct els_sub_cmd { 34 uint16_t cmd; 35 const char *str; 36 } sc_str[] = { 37 {SEND_ELS, "send ELS"}, 38 {SEND_ELS_REPLY, "send ELS Reply"}, 39 {PULL_ELS, "retrieve ELS"}, 40 }; 41 42 const char *sc_to_str(uint16_t cmd) 43 { 44 int i; 45 struct els_sub_cmd *e; 46 47 for (i = 0; i < ARRAY_SIZE(sc_str); i++) { 48 e = sc_str + i; 49 if (cmd == e->cmd) 50 return e->str; 51 } 52 return "unknown"; 53 } 54 55 static struct edb_node *qla_edb_getnext(scsi_qla_host_t *vha) 56 { 57 unsigned long flags; 58 struct edb_node *edbnode = NULL; 59 60 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 61 62 /* db nodes are fifo - no qualifications done */ 63 if (!list_empty(&vha->e_dbell.head)) { 64 edbnode = list_first_entry(&vha->e_dbell.head, 65 struct edb_node, list); 66 list_del_init(&edbnode->list); 67 } 68 69 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 70 71 return edbnode; 72 } 73 74 static void qla_edb_node_free(scsi_qla_host_t *vha, struct edb_node *node) 75 { 76 list_del_init(&node->list); 77 kfree(node); 78 } 79 80 static struct edif_list_entry *qla_edif_list_find_sa_index(fc_port_t *fcport, 81 uint16_t handle) 82 { 83 struct edif_list_entry *entry; 84 struct edif_list_entry *tentry; 85 struct list_head *indx_list = &fcport->edif.edif_indx_list; 86 87 list_for_each_entry_safe(entry, tentry, indx_list, next) { 88 if (entry->handle == handle) 89 return entry; 90 } 91 return NULL; 92 } 93 94 /* timeout called when no traffic and delayed rx sa_index delete */ 95 static void qla2x00_sa_replace_iocb_timeout(struct timer_list *t) 96 { 97 struct edif_list_entry *edif_entry = from_timer(edif_entry, t, timer); 98 fc_port_t *fcport = edif_entry->fcport; 99 struct scsi_qla_host *vha = fcport->vha; 100 struct edif_sa_ctl *sa_ctl; 101 uint16_t nport_handle; 102 unsigned long flags = 0; 103 104 ql_dbg(ql_dbg_edif, vha, 0x3069, 105 "%s: nport_handle 0x%x, SA REPL Delay Timeout, %8phC portid=%06x\n", 106 __func__, edif_entry->handle, fcport->port_name, fcport->d_id.b24); 107 108 /* 109 * if delete_sa_index is valid then no one has serviced this 110 * delayed delete 111 */ 112 spin_lock_irqsave(&fcport->edif.indx_list_lock, flags); 113 114 /* 115 * delete_sa_index is invalidated when we find the new sa_index in 116 * the incoming data stream. If it is not invalidated then we are 117 * still looking for the new sa_index because there is no I/O and we 118 * need to just force the rx delete and move on. Otherwise 119 * we could get another rekey which will result in an error 66. 120 */ 121 if (edif_entry->delete_sa_index != INVALID_EDIF_SA_INDEX) { 122 uint16_t delete_sa_index = edif_entry->delete_sa_index; 123 124 edif_entry->delete_sa_index = INVALID_EDIF_SA_INDEX; 125 nport_handle = edif_entry->handle; 126 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 127 128 sa_ctl = qla_edif_find_sa_ctl_by_index(fcport, 129 delete_sa_index, 0); 130 131 if (sa_ctl) { 132 ql_dbg(ql_dbg_edif, vha, 0x3063, 133 "%s: sa_ctl: %p, delete index %d, update index: %d, lid: 0x%x\n", 134 __func__, sa_ctl, delete_sa_index, edif_entry->update_sa_index, 135 nport_handle); 136 137 sa_ctl->flags = EDIF_SA_CTL_FLG_DEL; 138 set_bit(EDIF_SA_CTL_REPL, &sa_ctl->state); 139 qla_post_sa_replace_work(fcport->vha, fcport, 140 nport_handle, sa_ctl); 141 142 } else { 143 ql_dbg(ql_dbg_edif, vha, 0x3063, 144 "%s: sa_ctl not found for delete_sa_index: %d\n", 145 __func__, edif_entry->delete_sa_index); 146 } 147 } else { 148 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 149 } 150 } 151 152 /* 153 * create a new list entry for this nport handle and 154 * add an sa_update index to the list - called for sa_update 155 */ 156 static int qla_edif_list_add_sa_update_index(fc_port_t *fcport, 157 uint16_t sa_index, uint16_t handle) 158 { 159 struct edif_list_entry *entry; 160 unsigned long flags = 0; 161 162 /* if the entry exists, then just update the sa_index */ 163 entry = qla_edif_list_find_sa_index(fcport, handle); 164 if (entry) { 165 entry->update_sa_index = sa_index; 166 entry->count = 0; 167 return 0; 168 } 169 170 /* 171 * This is the normal path - there should be no existing entry 172 * when update is called. The exception is at startup 173 * when update is called for the first two sa_indexes 174 * followed by a delete of the first sa_index 175 */ 176 entry = kzalloc((sizeof(struct edif_list_entry)), GFP_ATOMIC); 177 if (!entry) 178 return -ENOMEM; 179 180 INIT_LIST_HEAD(&entry->next); 181 entry->handle = handle; 182 entry->update_sa_index = sa_index; 183 entry->delete_sa_index = INVALID_EDIF_SA_INDEX; 184 entry->count = 0; 185 entry->flags = 0; 186 timer_setup(&entry->timer, qla2x00_sa_replace_iocb_timeout, 0); 187 spin_lock_irqsave(&fcport->edif.indx_list_lock, flags); 188 list_add_tail(&entry->next, &fcport->edif.edif_indx_list); 189 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 190 return 0; 191 } 192 193 /* remove an entry from the list */ 194 static void qla_edif_list_delete_sa_index(fc_port_t *fcport, struct edif_list_entry *entry) 195 { 196 unsigned long flags = 0; 197 198 spin_lock_irqsave(&fcport->edif.indx_list_lock, flags); 199 list_del(&entry->next); 200 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 201 } 202 203 int qla_post_sa_replace_work(struct scsi_qla_host *vha, 204 fc_port_t *fcport, uint16_t nport_handle, struct edif_sa_ctl *sa_ctl) 205 { 206 struct qla_work_evt *e; 207 208 e = qla2x00_alloc_work(vha, QLA_EVT_SA_REPLACE); 209 if (!e) 210 return QLA_FUNCTION_FAILED; 211 212 e->u.sa_update.fcport = fcport; 213 e->u.sa_update.sa_ctl = sa_ctl; 214 e->u.sa_update.nport_handle = nport_handle; 215 fcport->flags |= FCF_ASYNC_ACTIVE; 216 return qla2x00_post_work(vha, e); 217 } 218 219 static void 220 qla_edif_sa_ctl_init(scsi_qla_host_t *vha, struct fc_port *fcport) 221 { 222 ql_dbg(ql_dbg_edif, vha, 0x2058, 223 "Init SA_CTL List for fcport - nn %8phN pn %8phN portid=%06x.\n", 224 fcport->node_name, fcport->port_name, fcport->d_id.b24); 225 226 fcport->edif.tx_rekey_cnt = 0; 227 fcport->edif.rx_rekey_cnt = 0; 228 229 fcport->edif.tx_bytes = 0; 230 fcport->edif.rx_bytes = 0; 231 } 232 233 static int qla_bsg_check(scsi_qla_host_t *vha, struct bsg_job *bsg_job, 234 fc_port_t *fcport) 235 { 236 struct extra_auth_els *p; 237 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 238 struct qla_bsg_auth_els_request *req = 239 (struct qla_bsg_auth_els_request *)bsg_job->request; 240 241 if (!vha->hw->flags.edif_enabled) { 242 ql_dbg(ql_dbg_edif, vha, 0x9105, 243 "%s edif not enabled\n", __func__); 244 goto done; 245 } 246 if (DBELL_INACTIVE(vha)) { 247 ql_dbg(ql_dbg_edif, vha, 0x09102, 248 "%s doorbell not enabled\n", __func__); 249 goto done; 250 } 251 252 p = &req->e; 253 254 /* Get response */ 255 if (p->sub_cmd == PULL_ELS) { 256 struct qla_bsg_auth_els_reply *rpl = 257 (struct qla_bsg_auth_els_reply *)bsg_job->reply; 258 259 qla_pur_get_pending(vha, fcport, bsg_job); 260 261 ql_dbg(ql_dbg_edif, vha, 0x911d, 262 "%s %s %8phN sid=%x. xchg %x, nb=%xh bsg ptr %p\n", 263 __func__, sc_to_str(p->sub_cmd), fcport->port_name, 264 fcport->d_id.b24, rpl->rx_xchg_address, 265 rpl->r.reply_payload_rcv_len, bsg_job); 266 267 goto done; 268 } 269 return 0; 270 271 done: 272 273 bsg_job_done(bsg_job, bsg_reply->result, 274 bsg_reply->reply_payload_rcv_len); 275 return -EIO; 276 } 277 278 fc_port_t * 279 qla2x00_find_fcport_by_pid(scsi_qla_host_t *vha, port_id_t *id) 280 { 281 fc_port_t *f, *tf; 282 283 f = NULL; 284 list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) { 285 if (f->d_id.b24 == id->b24) 286 return f; 287 } 288 return NULL; 289 } 290 291 /** 292 * qla_edif_app_check(): check for valid application id. 293 * @vha: host adapter pointer 294 * @appid: application id 295 * Return: false = fail, true = pass 296 */ 297 static bool 298 qla_edif_app_check(scsi_qla_host_t *vha, struct app_id appid) 299 { 300 /* check that the app is allow/known to the driver */ 301 302 if (appid.app_vid != EDIF_APP_ID) { 303 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app id not ok (%x)", 304 __func__, appid.app_vid); 305 return false; 306 } 307 308 if (appid.version != EDIF_VERSION1) { 309 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app version is not ok (%x)", 310 __func__, appid.version); 311 return false; 312 } 313 314 return true; 315 } 316 317 static void 318 qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl, 319 int index) 320 { 321 unsigned long flags = 0; 322 323 spin_lock_irqsave(&fcport->edif.sa_list_lock, flags); 324 list_del(&sa_ctl->next); 325 spin_unlock_irqrestore(&fcport->edif.sa_list_lock, flags); 326 if (index >= 512) 327 fcport->edif.tx_rekey_cnt--; 328 else 329 fcport->edif.rx_rekey_cnt--; 330 kfree(sa_ctl); 331 } 332 333 /* return an index to the freepool */ 334 static void qla_edif_add_sa_index_to_freepool(fc_port_t *fcport, int dir, 335 uint16_t sa_index) 336 { 337 void *sa_id_map; 338 struct scsi_qla_host *vha = fcport->vha; 339 struct qla_hw_data *ha = vha->hw; 340 unsigned long flags = 0; 341 u16 lsa_index = sa_index; 342 343 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x3063, 344 "%s: entry\n", __func__); 345 346 if (dir) { 347 sa_id_map = ha->edif_tx_sa_id_map; 348 lsa_index -= EDIF_TX_SA_INDEX_BASE; 349 } else { 350 sa_id_map = ha->edif_rx_sa_id_map; 351 } 352 353 spin_lock_irqsave(&ha->sadb_fp_lock, flags); 354 clear_bit(lsa_index, sa_id_map); 355 spin_unlock_irqrestore(&ha->sadb_fp_lock, flags); 356 ql_dbg(ql_dbg_edif, vha, 0x3063, 357 "%s: index %d added to free pool\n", __func__, sa_index); 358 } 359 360 static void __qla2x00_release_all_sadb(struct scsi_qla_host *vha, 361 struct fc_port *fcport, struct edif_sa_index_entry *entry, 362 int pdir) 363 { 364 struct edif_list_entry *edif_entry; 365 struct edif_sa_ctl *sa_ctl; 366 int i, dir; 367 int key_cnt = 0; 368 369 for (i = 0; i < 2; i++) { 370 if (entry->sa_pair[i].sa_index == INVALID_EDIF_SA_INDEX) 371 continue; 372 373 if (fcport->loop_id != entry->handle) { 374 ql_dbg(ql_dbg_edif, vha, 0x3063, 375 "%s: ** WARNING %d** entry handle: 0x%x, lid: 0x%x, sa_index: %d\n", 376 __func__, i, entry->handle, fcport->loop_id, 377 entry->sa_pair[i].sa_index); 378 } 379 380 /* release the sa_ctl */ 381 sa_ctl = qla_edif_find_sa_ctl_by_index(fcport, 382 entry->sa_pair[i].sa_index, pdir); 383 if (sa_ctl && 384 qla_edif_find_sa_ctl_by_index(fcport, sa_ctl->index, pdir)) { 385 ql_dbg(ql_dbg_edif, vha, 0x3063, 386 "%s: freeing sa_ctl for index %d\n", __func__, sa_ctl->index); 387 qla_edif_free_sa_ctl(fcport, sa_ctl, sa_ctl->index); 388 } else { 389 ql_dbg(ql_dbg_edif, vha, 0x3063, 390 "%s: sa_ctl NOT freed, sa_ctl: %p\n", __func__, sa_ctl); 391 } 392 393 /* Release the index */ 394 ql_dbg(ql_dbg_edif, vha, 0x3063, 395 "%s: freeing sa_index %d, nph: 0x%x\n", 396 __func__, entry->sa_pair[i].sa_index, entry->handle); 397 398 dir = (entry->sa_pair[i].sa_index < 399 EDIF_TX_SA_INDEX_BASE) ? 0 : 1; 400 qla_edif_add_sa_index_to_freepool(fcport, dir, 401 entry->sa_pair[i].sa_index); 402 403 /* Delete timer on RX */ 404 if (pdir != SAU_FLG_TX) { 405 edif_entry = 406 qla_edif_list_find_sa_index(fcport, entry->handle); 407 if (edif_entry) { 408 ql_dbg(ql_dbg_edif, vha, 0x5033, 409 "%s: remove edif_entry %p, update_sa_index: 0x%x, delete_sa_index: 0x%x\n", 410 __func__, edif_entry, edif_entry->update_sa_index, 411 edif_entry->delete_sa_index); 412 qla_edif_list_delete_sa_index(fcport, edif_entry); 413 /* 414 * valid delete_sa_index indicates there is a rx 415 * delayed delete queued 416 */ 417 if (edif_entry->delete_sa_index != 418 INVALID_EDIF_SA_INDEX) { 419 timer_shutdown(&edif_entry->timer); 420 421 /* build and send the aen */ 422 fcport->edif.rx_sa_set = 1; 423 fcport->edif.rx_sa_pending = 0; 424 qla_edb_eventcreate(vha, 425 VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 426 QL_VND_SA_STAT_SUCCESS, 427 QL_VND_RX_SA_KEY, fcport); 428 } 429 ql_dbg(ql_dbg_edif, vha, 0x5033, 430 "%s: release edif_entry %p, update_sa_index: 0x%x, delete_sa_index: 0x%x\n", 431 __func__, edif_entry, edif_entry->update_sa_index, 432 edif_entry->delete_sa_index); 433 434 kfree(edif_entry); 435 } 436 } 437 key_cnt++; 438 } 439 ql_dbg(ql_dbg_edif, vha, 0x3063, 440 "%s: %d %s keys released\n", 441 __func__, key_cnt, pdir ? "tx" : "rx"); 442 } 443 444 /* find an release all outstanding sadb sa_indicies */ 445 void qla2x00_release_all_sadb(struct scsi_qla_host *vha, struct fc_port *fcport) 446 { 447 struct edif_sa_index_entry *entry, *tmp; 448 struct qla_hw_data *ha = vha->hw; 449 unsigned long flags; 450 451 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x3063, 452 "%s: Starting...\n", __func__); 453 454 spin_lock_irqsave(&ha->sadb_lock, flags); 455 456 list_for_each_entry_safe(entry, tmp, &ha->sadb_rx_index_list, next) { 457 if (entry->fcport == fcport) { 458 list_del(&entry->next); 459 spin_unlock_irqrestore(&ha->sadb_lock, flags); 460 __qla2x00_release_all_sadb(vha, fcport, entry, 0); 461 kfree(entry); 462 spin_lock_irqsave(&ha->sadb_lock, flags); 463 break; 464 } 465 } 466 467 list_for_each_entry_safe(entry, tmp, &ha->sadb_tx_index_list, next) { 468 if (entry->fcport == fcport) { 469 list_del(&entry->next); 470 spin_unlock_irqrestore(&ha->sadb_lock, flags); 471 472 __qla2x00_release_all_sadb(vha, fcport, entry, SAU_FLG_TX); 473 474 kfree(entry); 475 spin_lock_irqsave(&ha->sadb_lock, flags); 476 break; 477 } 478 } 479 spin_unlock_irqrestore(&ha->sadb_lock, flags); 480 } 481 482 /** 483 * qla_edif_app_start: application has announce its present 484 * @vha: host adapter pointer 485 * @bsg_job: user request 486 * 487 * Set/activate doorbell. Reset current sessions and re-login with 488 * secure flag. 489 */ 490 static int 491 qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 492 { 493 int32_t rval = 0; 494 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 495 struct app_start appstart; 496 struct app_start_reply appreply; 497 struct fc_port *fcport, *tf; 498 499 ql_log(ql_log_info, vha, 0x1313, 500 "EDIF application registration with driver, FC device connections will be re-established.\n"); 501 502 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 503 bsg_job->request_payload.sg_cnt, &appstart, 504 sizeof(struct app_start)); 505 506 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app_vid=%x app_start_flags %x\n", 507 __func__, appstart.app_info.app_vid, appstart.app_start_flags); 508 509 if (DBELL_INACTIVE(vha)) { 510 /* mark doorbell as active since an app is now present */ 511 vha->e_dbell.db_flags |= EDB_ACTIVE; 512 } else { 513 goto out; 514 } 515 516 if (N2N_TOPO(vha->hw)) { 517 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) 518 fcport->n2n_link_reset_cnt = 0; 519 520 if (vha->hw->flags.n2n_fw_acc_sec) { 521 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) 522 qla_edif_sa_ctl_init(vha, fcport); 523 524 /* 525 * While authentication app was not running, remote device 526 * could still try to login with this local port. Let's 527 * clear the state and try again. 528 */ 529 qla2x00_wait_for_sess_deletion(vha); 530 531 /* bounce the link to get the other guy to relogin */ 532 if (!vha->hw->flags.n2n_bigger) { 533 set_bit(N2N_LINK_RESET, &vha->dpc_flags); 534 qla2xxx_wake_dpc(vha); 535 } 536 } else { 537 qla2x00_wait_for_hba_online(vha); 538 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 539 qla2xxx_wake_dpc(vha); 540 qla2x00_wait_for_hba_online(vha); 541 } 542 } else { 543 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) { 544 ql_dbg(ql_dbg_edif, vha, 0x2058, 545 "FCSP - nn %8phN pn %8phN portid=%06x.\n", 546 fcport->node_name, fcport->port_name, 547 fcport->d_id.b24); 548 ql_dbg(ql_dbg_edif, vha, 0xf084, 549 "%s: se_sess %p / sess %p from port %8phC " 550 "loop_id %#04x s_id %06x logout %d " 551 "keep %d els_logo %d disc state %d auth state %d" 552 "stop state %d\n", 553 __func__, fcport->se_sess, fcport, 554 fcport->port_name, fcport->loop_id, 555 fcport->d_id.b24, fcport->logout_on_delete, 556 fcport->keep_nport_handle, fcport->send_els_logo, 557 fcport->disc_state, fcport->edif.auth_state, 558 fcport->edif.app_stop); 559 560 if (atomic_read(&vha->loop_state) == LOOP_DOWN) 561 break; 562 563 fcport->login_retry = vha->hw->login_retry_count; 564 565 fcport->edif.app_stop = 0; 566 fcport->edif.app_sess_online = 0; 567 568 if (fcport->scan_state != QLA_FCPORT_FOUND) 569 continue; 570 571 if (fcport->port_type == FCT_UNKNOWN && 572 !fcport->fc4_features) 573 rval = qla24xx_async_gffid(vha, fcport, true); 574 575 if (!rval && !(fcport->fc4_features & FC4_FF_TARGET || 576 fcport->port_type & (FCT_TARGET|FCT_NVME_TARGET))) 577 continue; 578 579 rval = 0; 580 581 ql_dbg(ql_dbg_edif, vha, 0x911e, 582 "%s wwpn %8phC calling qla_edif_reset_auth_wait\n", 583 __func__, fcport->port_name); 584 qlt_schedule_sess_for_deletion(fcport); 585 qla_edif_sa_ctl_init(vha, fcport); 586 } 587 set_bit(RELOGIN_NEEDED, &vha->dpc_flags); 588 } 589 590 if (vha->pur_cinfo.enode_flags != ENODE_ACTIVE) { 591 /* mark as active since an app is now present */ 592 vha->pur_cinfo.enode_flags = ENODE_ACTIVE; 593 } else { 594 ql_dbg(ql_dbg_edif, vha, 0x911f, "%s enode already active\n", 595 __func__); 596 } 597 598 out: 599 appreply.host_support_edif = vha->hw->flags.edif_enabled; 600 appreply.edif_enode_active = vha->pur_cinfo.enode_flags; 601 appreply.edif_edb_active = vha->e_dbell.db_flags; 602 appreply.version = EDIF_VERSION1; 603 604 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 605 606 SET_DID_STATUS(bsg_reply->result, DID_OK); 607 608 bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list, 609 bsg_job->reply_payload.sg_cnt, 610 &appreply, 611 sizeof(struct app_start_reply)); 612 613 ql_dbg(ql_dbg_edif, vha, 0x911d, 614 "%s app start completed with 0x%x\n", 615 __func__, rval); 616 617 return rval; 618 } 619 620 /** 621 * qla_edif_app_stop - app has announced it's exiting. 622 * @vha: host adapter pointer 623 * @bsg_job: user space command pointer 624 * 625 * Free any in flight messages, clear all doorbell events 626 * to application. Reject any message relate to security. 627 */ 628 static int 629 qla_edif_app_stop(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 630 { 631 struct app_stop appstop; 632 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 633 struct fc_port *fcport, *tf; 634 635 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 636 bsg_job->request_payload.sg_cnt, &appstop, 637 sizeof(struct app_stop)); 638 639 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s Stopping APP: app_vid=%x\n", 640 __func__, appstop.app_info.app_vid); 641 642 /* Call db stop and enode stop functions */ 643 644 /* if we leave this running short waits are operational < 16 secs */ 645 qla_enode_stop(vha); /* stop enode */ 646 qla_edb_stop(vha); /* stop db */ 647 648 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) { 649 if (!(fcport->flags & FCF_FCSP_DEVICE)) 650 continue; 651 652 if (fcport->flags & FCF_FCSP_DEVICE) { 653 ql_dbg(ql_dbg_edif, vha, 0xf084, 654 "%s: sess %p from port %8phC lid %#04x s_id %06x logout %d keep %d els_logo %d\n", 655 __func__, fcport, 656 fcport->port_name, fcport->loop_id, fcport->d_id.b24, 657 fcport->logout_on_delete, fcport->keep_nport_handle, 658 fcport->send_els_logo); 659 660 if (atomic_read(&vha->loop_state) == LOOP_DOWN) 661 break; 662 663 fcport->edif.app_stop = 1; 664 ql_dbg(ql_dbg_edif, vha, 0x911e, 665 "%s wwpn %8phC calling qla_edif_reset_auth_wait\n", 666 __func__, fcport->port_name); 667 668 fcport->send_els_logo = 1; 669 qlt_schedule_sess_for_deletion(fcport); 670 } 671 } 672 673 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 674 SET_DID_STATUS(bsg_reply->result, DID_OK); 675 676 /* no return interface to app - it assumes we cleaned up ok */ 677 678 return 0; 679 } 680 681 static int 682 qla_edif_app_chk_sa_update(scsi_qla_host_t *vha, fc_port_t *fcport, 683 struct app_plogi_reply *appplogireply) 684 { 685 int ret = 0; 686 687 if (!(fcport->edif.rx_sa_set && fcport->edif.tx_sa_set)) { 688 ql_dbg(ql_dbg_edif, vha, 0x911e, 689 "%s: wwpn %8phC Both SA indexes has not been SET TX %d, RX %d.\n", 690 __func__, fcport->port_name, fcport->edif.tx_sa_set, 691 fcport->edif.rx_sa_set); 692 appplogireply->prli_status = 0; 693 ret = 1; 694 } else { 695 ql_dbg(ql_dbg_edif, vha, 0x911e, 696 "%s wwpn %8phC Both SA(s) updated.\n", __func__, 697 fcport->port_name); 698 fcport->edif.rx_sa_set = fcport->edif.tx_sa_set = 0; 699 fcport->edif.rx_sa_pending = fcport->edif.tx_sa_pending = 0; 700 appplogireply->prli_status = 1; 701 } 702 return ret; 703 } 704 705 /** 706 * qla_edif_app_authok - authentication by app succeeded. Driver can proceed 707 * with prli 708 * @vha: host adapter pointer 709 * @bsg_job: user request 710 */ 711 static int 712 qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 713 { 714 struct auth_complete_cmd appplogiok; 715 struct app_plogi_reply appplogireply = {0}; 716 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 717 fc_port_t *fcport = NULL; 718 port_id_t portid = {0}; 719 720 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 721 bsg_job->request_payload.sg_cnt, &appplogiok, 722 sizeof(struct auth_complete_cmd)); 723 724 /* silent unaligned access warning */ 725 portid.b.domain = appplogiok.u.d_id.b.domain; 726 portid.b.area = appplogiok.u.d_id.b.area; 727 portid.b.al_pa = appplogiok.u.d_id.b.al_pa; 728 729 appplogireply.version = EDIF_VERSION1; 730 switch (appplogiok.type) { 731 case PL_TYPE_WWPN: 732 fcport = qla2x00_find_fcport_by_wwpn(vha, 733 appplogiok.u.wwpn, 0); 734 if (!fcport) 735 ql_dbg(ql_dbg_edif, vha, 0x911d, 736 "%s wwpn lookup failed: %8phC\n", 737 __func__, appplogiok.u.wwpn); 738 break; 739 case PL_TYPE_DID: 740 fcport = qla2x00_find_fcport_by_pid(vha, &portid); 741 if (!fcport) 742 ql_dbg(ql_dbg_edif, vha, 0x911d, 743 "%s d_id lookup failed: %x\n", __func__, 744 portid.b24); 745 break; 746 default: 747 ql_dbg(ql_dbg_edif, vha, 0x911d, 748 "%s undefined type: %x\n", __func__, 749 appplogiok.type); 750 break; 751 } 752 753 if (!fcport) { 754 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 755 goto errstate_exit; 756 } 757 758 /* 759 * if port is online then this is a REKEY operation 760 * Only do sa update checking 761 */ 762 if (atomic_read(&fcport->state) == FCS_ONLINE) { 763 ql_dbg(ql_dbg_edif, vha, 0x911d, 764 "%s Skipping PRLI complete based on rekey\n", __func__); 765 appplogireply.prli_status = 1; 766 SET_DID_STATUS(bsg_reply->result, DID_OK); 767 qla_edif_app_chk_sa_update(vha, fcport, &appplogireply); 768 goto errstate_exit; 769 } 770 771 /* make sure in AUTH_PENDING or else reject */ 772 if (fcport->disc_state != DSC_LOGIN_AUTH_PEND) { 773 ql_dbg(ql_dbg_edif, vha, 0x911e, 774 "%s wwpn %8phC is not in auth pending state (%x)\n", 775 __func__, fcport->port_name, fcport->disc_state); 776 SET_DID_STATUS(bsg_reply->result, DID_OK); 777 appplogireply.prli_status = 0; 778 goto errstate_exit; 779 } 780 781 SET_DID_STATUS(bsg_reply->result, DID_OK); 782 appplogireply.prli_status = 1; 783 fcport->edif.authok = 1; 784 if (!(fcport->edif.rx_sa_set && fcport->edif.tx_sa_set)) { 785 ql_dbg(ql_dbg_edif, vha, 0x911e, 786 "%s: wwpn %8phC Both SA indexes has not been SET TX %d, RX %d.\n", 787 __func__, fcport->port_name, fcport->edif.tx_sa_set, 788 fcport->edif.rx_sa_set); 789 SET_DID_STATUS(bsg_reply->result, DID_OK); 790 appplogireply.prli_status = 0; 791 goto errstate_exit; 792 793 } else { 794 ql_dbg(ql_dbg_edif, vha, 0x911e, 795 "%s wwpn %8phC Both SA(s) updated.\n", __func__, 796 fcport->port_name); 797 fcport->edif.rx_sa_set = fcport->edif.tx_sa_set = 0; 798 fcport->edif.rx_sa_pending = fcport->edif.tx_sa_pending = 0; 799 } 800 801 if (qla_ini_mode_enabled(vha)) { 802 ql_dbg(ql_dbg_edif, vha, 0x911e, 803 "%s AUTH complete - RESUME with prli for wwpn %8phC\n", 804 __func__, fcport->port_name); 805 qla24xx_post_prli_work(vha, fcport); 806 } 807 808 errstate_exit: 809 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 810 bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list, 811 bsg_job->reply_payload.sg_cnt, 812 &appplogireply, 813 sizeof(struct app_plogi_reply)); 814 815 return 0; 816 } 817 818 /** 819 * qla_edif_app_authfail - authentication by app has failed. Driver is given 820 * notice to tear down current session. 821 * @vha: host adapter pointer 822 * @bsg_job: user request 823 */ 824 static int 825 qla_edif_app_authfail(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 826 { 827 int32_t rval = 0; 828 struct auth_complete_cmd appplogifail; 829 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 830 fc_port_t *fcport = NULL; 831 port_id_t portid = {0}; 832 833 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app auth fail\n", __func__); 834 835 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 836 bsg_job->request_payload.sg_cnt, &appplogifail, 837 sizeof(struct auth_complete_cmd)); 838 839 /* silent unaligned access warning */ 840 portid.b.domain = appplogifail.u.d_id.b.domain; 841 portid.b.area = appplogifail.u.d_id.b.area; 842 portid.b.al_pa = appplogifail.u.d_id.b.al_pa; 843 844 /* 845 * TODO: edif: app has failed this plogi. Inform driver to 846 * take any action (if any). 847 */ 848 switch (appplogifail.type) { 849 case PL_TYPE_WWPN: 850 fcport = qla2x00_find_fcport_by_wwpn(vha, 851 appplogifail.u.wwpn, 0); 852 SET_DID_STATUS(bsg_reply->result, DID_OK); 853 break; 854 case PL_TYPE_DID: 855 fcport = qla2x00_find_fcport_by_pid(vha, &portid); 856 if (!fcport) 857 ql_dbg(ql_dbg_edif, vha, 0x911d, 858 "%s d_id lookup failed: %x\n", __func__, 859 portid.b24); 860 SET_DID_STATUS(bsg_reply->result, DID_OK); 861 break; 862 default: 863 ql_dbg(ql_dbg_edif, vha, 0x911e, 864 "%s undefined type: %x\n", __func__, 865 appplogifail.type); 866 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 867 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 868 rval = -1; 869 break; 870 } 871 872 ql_dbg(ql_dbg_edif, vha, 0x911d, 873 "%s fcport is 0x%p\n", __func__, fcport); 874 875 if (fcport) { 876 /* set/reset edif values and flags */ 877 ql_dbg(ql_dbg_edif, vha, 0x911e, 878 "%s reset the auth process - %8phC, loopid=%x portid=%06x.\n", 879 __func__, fcport->port_name, fcport->loop_id, fcport->d_id.b24); 880 881 if (qla_ini_mode_enabled(fcport->vha)) { 882 fcport->send_els_logo = 1; 883 qlt_schedule_sess_for_deletion(fcport); 884 } 885 } 886 887 return rval; 888 } 889 890 /** 891 * qla_edif_app_getfcinfo - app would like to read session info (wwpn, nportid, 892 * [initiator|target] mode. It can specific session with specific nport id or 893 * all sessions. 894 * @vha: host adapter pointer 895 * @bsg_job: user request pointer 896 */ 897 static int 898 qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 899 { 900 int32_t rval = 0; 901 int32_t pcnt = 0; 902 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 903 struct app_pinfo_req app_req; 904 struct app_pinfo_reply *app_reply; 905 port_id_t tdid; 906 907 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app get fcinfo\n", __func__); 908 909 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 910 bsg_job->request_payload.sg_cnt, &app_req, 911 sizeof(struct app_pinfo_req)); 912 913 app_reply = kzalloc((sizeof(struct app_pinfo_reply) + 914 sizeof(struct app_pinfo) * app_req.num_ports), GFP_KERNEL); 915 916 if (!app_reply) { 917 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 918 rval = -1; 919 } else { 920 struct fc_port *fcport = NULL, *tf; 921 922 app_reply->version = EDIF_VERSION1; 923 924 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) { 925 if (!(fcport->flags & FCF_FCSP_DEVICE)) 926 continue; 927 928 tdid = app_req.remote_pid; 929 930 ql_dbg(ql_dbg_edif, vha, 0x2058, 931 "APP request entry - portid=%06x.\n", tdid.b24); 932 933 /* Ran out of space */ 934 if (pcnt >= app_req.num_ports) 935 break; 936 937 if (tdid.b24 != 0 && tdid.b24 != fcport->d_id.b24) 938 continue; 939 940 if (!N2N_TOPO(vha->hw)) { 941 if (fcport->scan_state != QLA_FCPORT_FOUND) 942 continue; 943 944 if (fcport->port_type == FCT_UNKNOWN && 945 !fcport->fc4_features) 946 rval = qla24xx_async_gffid(vha, fcport, 947 true); 948 949 if (!rval && 950 !(fcport->fc4_features & FC4_FF_TARGET || 951 fcport->port_type & 952 (FCT_TARGET | FCT_NVME_TARGET))) 953 continue; 954 } 955 956 rval = 0; 957 958 app_reply->ports[pcnt].version = EDIF_VERSION1; 959 app_reply->ports[pcnt].remote_type = 960 VND_CMD_RTYPE_UNKNOWN; 961 if (fcport->port_type & (FCT_NVME_TARGET | FCT_TARGET)) 962 app_reply->ports[pcnt].remote_type |= 963 VND_CMD_RTYPE_TARGET; 964 if (fcport->port_type & (FCT_NVME_INITIATOR | FCT_INITIATOR)) 965 app_reply->ports[pcnt].remote_type |= 966 VND_CMD_RTYPE_INITIATOR; 967 968 app_reply->ports[pcnt].remote_pid = fcport->d_id; 969 970 ql_dbg(ql_dbg_edif, vha, 0x2058, 971 "Found FC_SP fcport - nn %8phN pn %8phN pcnt %d portid=%06x secure %d.\n", 972 fcport->node_name, fcport->port_name, pcnt, 973 fcport->d_id.b24, fcport->flags & FCF_FCSP_DEVICE); 974 975 switch (fcport->edif.auth_state) { 976 case VND_CMD_AUTH_STATE_ELS_RCVD: 977 if (fcport->disc_state == DSC_LOGIN_AUTH_PEND) { 978 fcport->edif.auth_state = VND_CMD_AUTH_STATE_NEEDED; 979 app_reply->ports[pcnt].auth_state = 980 VND_CMD_AUTH_STATE_NEEDED; 981 } else { 982 app_reply->ports[pcnt].auth_state = 983 VND_CMD_AUTH_STATE_ELS_RCVD; 984 } 985 break; 986 default: 987 app_reply->ports[pcnt].auth_state = fcport->edif.auth_state; 988 break; 989 } 990 991 memcpy(app_reply->ports[pcnt].remote_wwpn, 992 fcport->port_name, 8); 993 994 app_reply->ports[pcnt].remote_state = 995 (atomic_read(&fcport->state) == 996 FCS_ONLINE ? 1 : 0); 997 998 pcnt++; 999 1000 if (tdid.b24 != 0) 1001 break; 1002 } 1003 app_reply->port_count = pcnt; 1004 SET_DID_STATUS(bsg_reply->result, DID_OK); 1005 } 1006 1007 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1008 bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list, 1009 bsg_job->reply_payload.sg_cnt, 1010 app_reply, 1011 sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * pcnt); 1012 1013 kfree(app_reply); 1014 1015 return rval; 1016 } 1017 1018 /** 1019 * qla_edif_app_getstats - app would like to read various statistics info 1020 * @vha: host adapter pointer 1021 * @bsg_job: user request 1022 */ 1023 static int32_t 1024 qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 1025 { 1026 int32_t rval = 0; 1027 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1028 uint32_t size; 1029 1030 struct app_sinfo_req app_req; 1031 struct app_stats_reply *app_reply; 1032 uint32_t pcnt = 0; 1033 1034 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 1035 bsg_job->request_payload.sg_cnt, &app_req, 1036 sizeof(struct app_sinfo_req)); 1037 if (app_req.num_ports == 0) { 1038 ql_dbg(ql_dbg_async, vha, 0x911d, 1039 "%s app did not indicate number of ports to return\n", 1040 __func__); 1041 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1042 rval = -1; 1043 } 1044 1045 size = sizeof(struct app_stats_reply) + 1046 (sizeof(struct app_sinfo) * app_req.num_ports); 1047 1048 app_reply = kzalloc(size, GFP_KERNEL); 1049 if (!app_reply) { 1050 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1051 rval = -1; 1052 } else { 1053 struct fc_port *fcport = NULL, *tf; 1054 1055 app_reply->version = EDIF_VERSION1; 1056 1057 list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) { 1058 if (fcport->edif.enable) { 1059 if (pcnt > app_req.num_ports) 1060 break; 1061 1062 app_reply->elem[pcnt].rekey_count = 1063 fcport->edif.rekey_cnt; 1064 app_reply->elem[pcnt].tx_bytes = 1065 fcport->edif.tx_bytes; 1066 app_reply->elem[pcnt].rx_bytes = 1067 fcport->edif.rx_bytes; 1068 1069 memcpy(app_reply->elem[pcnt].remote_wwpn, 1070 fcport->port_name, 8); 1071 1072 pcnt++; 1073 } 1074 } 1075 app_reply->elem_count = pcnt; 1076 SET_DID_STATUS(bsg_reply->result, DID_OK); 1077 } 1078 1079 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1080 bsg_reply->reply_payload_rcv_len = 1081 sg_copy_from_buffer(bsg_job->reply_payload.sg_list, 1082 bsg_job->reply_payload.sg_cnt, app_reply, 1083 sizeof(struct app_stats_reply) + (sizeof(struct app_sinfo) * pcnt)); 1084 1085 kfree(app_reply); 1086 1087 return rval; 1088 } 1089 1090 static int32_t 1091 qla_edif_ack(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 1092 { 1093 struct fc_port *fcport; 1094 struct aen_complete_cmd ack; 1095 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1096 1097 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 1098 bsg_job->request_payload.sg_cnt, &ack, sizeof(ack)); 1099 1100 ql_dbg(ql_dbg_edif, vha, 0x70cf, 1101 "%s: %06x event_code %x\n", 1102 __func__, ack.port_id.b24, ack.event_code); 1103 1104 fcport = qla2x00_find_fcport_by_pid(vha, &ack.port_id); 1105 SET_DID_STATUS(bsg_reply->result, DID_OK); 1106 1107 if (!fcport) { 1108 ql_dbg(ql_dbg_edif, vha, 0x70cf, 1109 "%s: unable to find fcport %06x \n", 1110 __func__, ack.port_id.b24); 1111 return 0; 1112 } 1113 1114 switch (ack.event_code) { 1115 case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN: 1116 fcport->edif.sess_down_acked = 1; 1117 break; 1118 default: 1119 break; 1120 } 1121 return 0; 1122 } 1123 1124 static int qla_edif_consume_dbell(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 1125 { 1126 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1127 u32 sg_skip, reply_payload_len; 1128 bool keep; 1129 struct edb_node *dbnode = NULL; 1130 struct edif_app_dbell ap; 1131 int dat_size = 0; 1132 1133 sg_skip = 0; 1134 reply_payload_len = bsg_job->reply_payload.payload_len; 1135 1136 while ((reply_payload_len - sg_skip) >= sizeof(struct edb_node)) { 1137 dbnode = qla_edb_getnext(vha); 1138 if (dbnode) { 1139 keep = true; 1140 dat_size = 0; 1141 ap.event_code = dbnode->ntype; 1142 switch (dbnode->ntype) { 1143 case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN: 1144 case VND_CMD_AUTH_STATE_NEEDED: 1145 ap.port_id = dbnode->u.plogi_did; 1146 dat_size += sizeof(ap.port_id); 1147 break; 1148 case VND_CMD_AUTH_STATE_ELS_RCVD: 1149 ap.port_id = dbnode->u.els_sid; 1150 dat_size += sizeof(ap.port_id); 1151 break; 1152 case VND_CMD_AUTH_STATE_SAUPDATE_COMPL: 1153 ap.port_id = dbnode->u.sa_aen.port_id; 1154 memcpy(&ap.event_data, &dbnode->u, 1155 sizeof(struct edif_sa_update_aen)); 1156 dat_size += sizeof(struct edif_sa_update_aen); 1157 break; 1158 default: 1159 keep = false; 1160 ql_log(ql_log_warn, vha, 0x09102, 1161 "%s unknown DB type=%d %p\n", 1162 __func__, dbnode->ntype, dbnode); 1163 break; 1164 } 1165 ap.event_data_size = dat_size; 1166 /* 8 = sizeof(ap.event_code + ap.event_data_size) */ 1167 dat_size += 8; 1168 if (keep) 1169 sg_skip += sg_copy_buffer(bsg_job->reply_payload.sg_list, 1170 bsg_job->reply_payload.sg_cnt, 1171 &ap, dat_size, sg_skip, false); 1172 1173 ql_dbg(ql_dbg_edif, vha, 0x09102, 1174 "%s Doorbell consumed : type=%d %p\n", 1175 __func__, dbnode->ntype, dbnode); 1176 1177 kfree(dbnode); 1178 } else { 1179 break; 1180 } 1181 } 1182 1183 SET_DID_STATUS(bsg_reply->result, DID_OK); 1184 bsg_reply->reply_payload_rcv_len = sg_skip; 1185 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1186 1187 return 0; 1188 } 1189 1190 static void __qla_edif_dbell_bsg_done(scsi_qla_host_t *vha, struct bsg_job *bsg_job, 1191 u32 delay) 1192 { 1193 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1194 1195 /* small sleep for doorbell events to accumulate */ 1196 if (delay) 1197 msleep(delay); 1198 1199 qla_edif_consume_dbell(vha, bsg_job); 1200 1201 bsg_job_done(bsg_job, bsg_reply->result, bsg_reply->reply_payload_rcv_len); 1202 } 1203 1204 static void qla_edif_dbell_bsg_done(scsi_qla_host_t *vha) 1205 { 1206 unsigned long flags; 1207 struct bsg_job *prev_bsg_job = NULL; 1208 1209 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 1210 if (vha->e_dbell.dbell_bsg_job) { 1211 prev_bsg_job = vha->e_dbell.dbell_bsg_job; 1212 vha->e_dbell.dbell_bsg_job = NULL; 1213 } 1214 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 1215 1216 if (prev_bsg_job) 1217 __qla_edif_dbell_bsg_done(vha, prev_bsg_job, 0); 1218 } 1219 1220 static int 1221 qla_edif_dbell_bsg(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 1222 { 1223 unsigned long flags; 1224 bool return_bsg = false; 1225 1226 /* flush previous dbell bsg */ 1227 qla_edif_dbell_bsg_done(vha); 1228 1229 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 1230 if (list_empty(&vha->e_dbell.head) && DBELL_ACTIVE(vha)) { 1231 /* 1232 * when the next db event happens, bsg_job will return. 1233 * Otherwise, timer will return it. 1234 */ 1235 vha->e_dbell.dbell_bsg_job = bsg_job; 1236 vha->e_dbell.bsg_expire = jiffies + 10 * HZ; 1237 } else { 1238 return_bsg = true; 1239 } 1240 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 1241 1242 if (return_bsg) 1243 __qla_edif_dbell_bsg_done(vha, bsg_job, 1); 1244 1245 return 0; 1246 } 1247 1248 int32_t 1249 qla_edif_app_mgmt(struct bsg_job *bsg_job) 1250 { 1251 struct fc_bsg_request *bsg_request = bsg_job->request; 1252 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1253 struct Scsi_Host *host = fc_bsg_to_shost(bsg_job); 1254 scsi_qla_host_t *vha = shost_priv(host); 1255 struct app_id appcheck; 1256 bool done = true; 1257 int32_t rval = 0; 1258 uint32_t vnd_sc = bsg_request->rqst_data.h_vendor.vendor_cmd[1]; 1259 u32 level = ql_dbg_edif; 1260 1261 /* doorbell is high traffic */ 1262 if (vnd_sc == QL_VND_SC_READ_DBELL) 1263 level = 0; 1264 1265 ql_dbg(level, vha, 0x911d, "%s vnd subcmd=%x\n", 1266 __func__, vnd_sc); 1267 1268 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 1269 bsg_job->request_payload.sg_cnt, &appcheck, 1270 sizeof(struct app_id)); 1271 1272 if (!vha->hw->flags.edif_enabled || 1273 test_bit(VPORT_DELETE, &vha->dpc_flags)) { 1274 ql_dbg(level, vha, 0x911d, 1275 "%s edif not enabled or vp delete. bsg ptr done %p. dpc_flags %lx\n", 1276 __func__, bsg_job, vha->dpc_flags); 1277 1278 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1279 goto done; 1280 } 1281 1282 if (!qla_edif_app_check(vha, appcheck)) { 1283 ql_dbg(level, vha, 0x911d, 1284 "%s app checked failed.\n", 1285 __func__); 1286 1287 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1288 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1289 goto done; 1290 } 1291 1292 switch (vnd_sc) { 1293 case QL_VND_SC_SA_UPDATE: 1294 done = false; 1295 rval = qla24xx_sadb_update(bsg_job); 1296 break; 1297 case QL_VND_SC_APP_START: 1298 rval = qla_edif_app_start(vha, bsg_job); 1299 break; 1300 case QL_VND_SC_APP_STOP: 1301 rval = qla_edif_app_stop(vha, bsg_job); 1302 break; 1303 case QL_VND_SC_AUTH_OK: 1304 rval = qla_edif_app_authok(vha, bsg_job); 1305 break; 1306 case QL_VND_SC_AUTH_FAIL: 1307 rval = qla_edif_app_authfail(vha, bsg_job); 1308 break; 1309 case QL_VND_SC_GET_FCINFO: 1310 rval = qla_edif_app_getfcinfo(vha, bsg_job); 1311 break; 1312 case QL_VND_SC_GET_STATS: 1313 rval = qla_edif_app_getstats(vha, bsg_job); 1314 break; 1315 case QL_VND_SC_AEN_COMPLETE: 1316 rval = qla_edif_ack(vha, bsg_job); 1317 break; 1318 case QL_VND_SC_READ_DBELL: 1319 rval = qla_edif_dbell_bsg(vha, bsg_job); 1320 done = false; 1321 break; 1322 default: 1323 ql_dbg(ql_dbg_edif, vha, 0x911d, "%s unknown cmd=%x\n", 1324 __func__, 1325 bsg_request->rqst_data.h_vendor.vendor_cmd[1]); 1326 rval = EXT_STATUS_INVALID_PARAM; 1327 done = false; 1328 break; 1329 } 1330 1331 done: 1332 if (done) { 1333 ql_dbg(level, vha, 0x7009, 1334 "%s: %d bsg ptr done %p\n", __func__, __LINE__, bsg_job); 1335 bsg_job_done(bsg_job, bsg_reply->result, 1336 bsg_reply->reply_payload_rcv_len); 1337 } 1338 1339 return rval; 1340 } 1341 1342 static struct edif_sa_ctl * 1343 qla_edif_add_sa_ctl(fc_port_t *fcport, struct qla_sa_update_frame *sa_frame, 1344 int dir) 1345 { 1346 struct edif_sa_ctl *sa_ctl; 1347 struct qla_sa_update_frame *sap; 1348 int index = sa_frame->fast_sa_index; 1349 unsigned long flags = 0; 1350 1351 sa_ctl = kzalloc(sizeof(*sa_ctl), GFP_KERNEL); 1352 if (!sa_ctl) { 1353 /* couldn't get space */ 1354 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1355 "unable to allocate SA CTL\n"); 1356 return NULL; 1357 } 1358 1359 /* 1360 * need to allocate sa_index here and save it 1361 * in both sa_ctl->index and sa_frame->fast_sa_index; 1362 * If alloc fails then delete sa_ctl and return NULL 1363 */ 1364 INIT_LIST_HEAD(&sa_ctl->next); 1365 sap = &sa_ctl->sa_frame; 1366 *sap = *sa_frame; 1367 sa_ctl->index = index; 1368 sa_ctl->fcport = fcport; 1369 sa_ctl->flags = 0; 1370 sa_ctl->state = 0L; 1371 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1372 "%s: Added sa_ctl %p, index %d, state 0x%lx\n", 1373 __func__, sa_ctl, sa_ctl->index, sa_ctl->state); 1374 spin_lock_irqsave(&fcport->edif.sa_list_lock, flags); 1375 if (dir == SAU_FLG_TX) 1376 list_add_tail(&sa_ctl->next, &fcport->edif.tx_sa_list); 1377 else 1378 list_add_tail(&sa_ctl->next, &fcport->edif.rx_sa_list); 1379 spin_unlock_irqrestore(&fcport->edif.sa_list_lock, flags); 1380 1381 return sa_ctl; 1382 } 1383 1384 void 1385 qla_edif_flush_sa_ctl_lists(fc_port_t *fcport) 1386 { 1387 struct edif_sa_ctl *sa_ctl, *tsa_ctl; 1388 unsigned long flags = 0; 1389 1390 spin_lock_irqsave(&fcport->edif.sa_list_lock, flags); 1391 1392 list_for_each_entry_safe(sa_ctl, tsa_ctl, &fcport->edif.tx_sa_list, 1393 next) { 1394 list_del(&sa_ctl->next); 1395 kfree(sa_ctl); 1396 } 1397 1398 list_for_each_entry_safe(sa_ctl, tsa_ctl, &fcport->edif.rx_sa_list, 1399 next) { 1400 list_del(&sa_ctl->next); 1401 kfree(sa_ctl); 1402 } 1403 1404 spin_unlock_irqrestore(&fcport->edif.sa_list_lock, flags); 1405 } 1406 1407 struct edif_sa_ctl * 1408 qla_edif_find_sa_ctl_by_index(fc_port_t *fcport, int index, int dir) 1409 { 1410 struct edif_sa_ctl *sa_ctl, *tsa_ctl; 1411 struct list_head *sa_list; 1412 1413 if (dir == SAU_FLG_TX) 1414 sa_list = &fcport->edif.tx_sa_list; 1415 else 1416 sa_list = &fcport->edif.rx_sa_list; 1417 1418 list_for_each_entry_safe(sa_ctl, tsa_ctl, sa_list, next) { 1419 if (test_bit(EDIF_SA_CTL_USED, &sa_ctl->state) && 1420 sa_ctl->index == index) 1421 return sa_ctl; 1422 } 1423 return NULL; 1424 } 1425 1426 /* add the sa to the correct list */ 1427 static int 1428 qla24xx_check_sadb_avail_slot(struct bsg_job *bsg_job, fc_port_t *fcport, 1429 struct qla_sa_update_frame *sa_frame) 1430 { 1431 struct edif_sa_ctl *sa_ctl = NULL; 1432 int dir; 1433 uint16_t sa_index; 1434 1435 dir = (sa_frame->flags & SAU_FLG_TX); 1436 1437 /* map the spi to an sa_index */ 1438 sa_index = qla_edif_sadb_get_sa_index(fcport, sa_frame); 1439 if (sa_index == RX_DELETE_NO_EDIF_SA_INDEX) { 1440 /* process rx delete */ 1441 ql_dbg(ql_dbg_edif, fcport->vha, 0x3063, 1442 "%s: rx delete for lid 0x%x, spi 0x%x, no entry found\n", 1443 __func__, fcport->loop_id, sa_frame->spi); 1444 1445 /* build and send the aen */ 1446 fcport->edif.rx_sa_set = 1; 1447 fcport->edif.rx_sa_pending = 0; 1448 qla_edb_eventcreate(fcport->vha, 1449 VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 1450 QL_VND_SA_STAT_SUCCESS, 1451 QL_VND_RX_SA_KEY, fcport); 1452 1453 /* force a return of good bsg status; */ 1454 return RX_DELETE_NO_EDIF_SA_INDEX; 1455 } else if (sa_index == INVALID_EDIF_SA_INDEX) { 1456 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1457 "%s: Failed to get sa_index for spi 0x%x, dir: %d\n", 1458 __func__, sa_frame->spi, dir); 1459 return INVALID_EDIF_SA_INDEX; 1460 } 1461 1462 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1463 "%s: index %d allocated to spi 0x%x, dir: %d, nport_handle: 0x%x\n", 1464 __func__, sa_index, sa_frame->spi, dir, fcport->loop_id); 1465 1466 /* This is a local copy of sa_frame. */ 1467 sa_frame->fast_sa_index = sa_index; 1468 /* create the sa_ctl */ 1469 sa_ctl = qla_edif_add_sa_ctl(fcport, sa_frame, dir); 1470 if (!sa_ctl) { 1471 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1472 "%s: Failed to add sa_ctl for spi 0x%x, dir: %d, sa_index: %d\n", 1473 __func__, sa_frame->spi, dir, sa_index); 1474 return -1; 1475 } 1476 1477 set_bit(EDIF_SA_CTL_USED, &sa_ctl->state); 1478 1479 if (dir == SAU_FLG_TX) 1480 fcport->edif.tx_rekey_cnt++; 1481 else 1482 fcport->edif.rx_rekey_cnt++; 1483 1484 ql_dbg(ql_dbg_edif, fcport->vha, 0x9100, 1485 "%s: Found sa_ctl %p, index %d, state 0x%lx, tx_cnt %d, rx_cnt %d, nport_handle: 0x%x\n", 1486 __func__, sa_ctl, sa_ctl->index, sa_ctl->state, 1487 fcport->edif.tx_rekey_cnt, 1488 fcport->edif.rx_rekey_cnt, fcport->loop_id); 1489 1490 return 0; 1491 } 1492 1493 #define QLA_SA_UPDATE_FLAGS_RX_KEY 0x0 1494 #define QLA_SA_UPDATE_FLAGS_TX_KEY 0x2 1495 #define EDIF_MSLEEP_INTERVAL 100 1496 #define EDIF_RETRY_COUNT 50 1497 1498 int 1499 qla24xx_sadb_update(struct bsg_job *bsg_job) 1500 { 1501 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 1502 struct Scsi_Host *host = fc_bsg_to_shost(bsg_job); 1503 scsi_qla_host_t *vha = shost_priv(host); 1504 fc_port_t *fcport = NULL; 1505 srb_t *sp = NULL; 1506 struct edif_list_entry *edif_entry = NULL; 1507 int found = 0; 1508 int rval = 0; 1509 int result = 0, cnt; 1510 struct qla_sa_update_frame sa_frame; 1511 struct srb_iocb *iocb_cmd; 1512 port_id_t portid; 1513 1514 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x911d, 1515 "%s entered, vha: 0x%p\n", __func__, vha); 1516 1517 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 1518 bsg_job->request_payload.sg_cnt, &sa_frame, 1519 sizeof(struct qla_sa_update_frame)); 1520 1521 /* Check if host is online */ 1522 if (!vha->flags.online) { 1523 ql_log(ql_log_warn, vha, 0x70a1, "Host is not online\n"); 1524 rval = -EIO; 1525 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1526 goto done; 1527 } 1528 1529 if (DBELL_INACTIVE(vha)) { 1530 ql_log(ql_log_warn, vha, 0x70a1, "App not started\n"); 1531 rval = -EIO; 1532 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1533 goto done; 1534 } 1535 1536 /* silent unaligned access warning */ 1537 portid.b.domain = sa_frame.port_id.b.domain; 1538 portid.b.area = sa_frame.port_id.b.area; 1539 portid.b.al_pa = sa_frame.port_id.b.al_pa; 1540 1541 fcport = qla2x00_find_fcport_by_pid(vha, &portid); 1542 if (fcport) { 1543 found = 1; 1544 if (sa_frame.flags == QLA_SA_UPDATE_FLAGS_TX_KEY) 1545 fcport->edif.tx_bytes = 0; 1546 if (sa_frame.flags == QLA_SA_UPDATE_FLAGS_RX_KEY) 1547 fcport->edif.rx_bytes = 0; 1548 } 1549 1550 if (!found) { 1551 ql_dbg(ql_dbg_edif, vha, 0x70a3, "Failed to find port= %06x\n", 1552 sa_frame.port_id.b24); 1553 rval = -EINVAL; 1554 SET_DID_STATUS(bsg_reply->result, DID_NO_CONNECT); 1555 goto done; 1556 } 1557 1558 /* make sure the nport_handle is valid */ 1559 if (fcport->loop_id == FC_NO_LOOP_ID) { 1560 ql_dbg(ql_dbg_edif, vha, 0x70e1, 1561 "%s: %8phN lid=FC_NO_LOOP_ID, spi: 0x%x, DS %d, returning NO_CONNECT\n", 1562 __func__, fcport->port_name, sa_frame.spi, 1563 fcport->disc_state); 1564 rval = -EINVAL; 1565 SET_DID_STATUS(bsg_reply->result, DID_NO_CONNECT); 1566 goto done; 1567 } 1568 1569 /* allocate and queue an sa_ctl */ 1570 result = qla24xx_check_sadb_avail_slot(bsg_job, fcport, &sa_frame); 1571 1572 /* failure of bsg */ 1573 if (result == INVALID_EDIF_SA_INDEX) { 1574 ql_dbg(ql_dbg_edif, vha, 0x70e1, 1575 "%s: %8phN, skipping update.\n", 1576 __func__, fcport->port_name); 1577 rval = -EINVAL; 1578 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1579 goto done; 1580 1581 /* rx delete failure */ 1582 } else if (result == RX_DELETE_NO_EDIF_SA_INDEX) { 1583 ql_dbg(ql_dbg_edif, vha, 0x70e1, 1584 "%s: %8phN, skipping rx delete.\n", 1585 __func__, fcport->port_name); 1586 SET_DID_STATUS(bsg_reply->result, DID_OK); 1587 goto done; 1588 } 1589 1590 ql_dbg(ql_dbg_edif, vha, 0x70e1, 1591 "%s: %8phN, sa_index in sa_frame: %d flags %xh\n", 1592 __func__, fcport->port_name, sa_frame.fast_sa_index, 1593 sa_frame.flags); 1594 1595 /* looking for rx index and delete */ 1596 if (((sa_frame.flags & SAU_FLG_TX) == 0) && 1597 (sa_frame.flags & SAU_FLG_INV)) { 1598 uint16_t nport_handle = fcport->loop_id; 1599 uint16_t sa_index = sa_frame.fast_sa_index; 1600 1601 /* 1602 * make sure we have an existing rx key, otherwise just process 1603 * this as a straight delete just like TX 1604 * This is NOT a normal case, it indicates an error recovery or key cleanup 1605 * by the ipsec code above us. 1606 */ 1607 edif_entry = qla_edif_list_find_sa_index(fcport, fcport->loop_id); 1608 if (!edif_entry) { 1609 ql_dbg(ql_dbg_edif, vha, 0x911d, 1610 "%s: WARNING: no active sa_index for nport_handle 0x%x, forcing delete for sa_index 0x%x\n", 1611 __func__, fcport->loop_id, sa_index); 1612 goto force_rx_delete; 1613 } 1614 1615 /* 1616 * if we have a forced delete for rx, remove the sa_index from the edif list 1617 * and proceed with normal delete. The rx delay timer should not be running 1618 */ 1619 if ((sa_frame.flags & SAU_FLG_FORCE_DELETE) == SAU_FLG_FORCE_DELETE) { 1620 qla_edif_list_delete_sa_index(fcport, edif_entry); 1621 ql_dbg(ql_dbg_edif, vha, 0x911d, 1622 "%s: FORCE DELETE flag found for nport_handle 0x%x, sa_index 0x%x, forcing DELETE\n", 1623 __func__, fcport->loop_id, sa_index); 1624 kfree(edif_entry); 1625 goto force_rx_delete; 1626 } 1627 1628 /* 1629 * delayed rx delete 1630 * 1631 * if delete_sa_index is not invalid then there is already 1632 * a delayed index in progress, return bsg bad status 1633 */ 1634 if (edif_entry->delete_sa_index != INVALID_EDIF_SA_INDEX) { 1635 struct edif_sa_ctl *sa_ctl; 1636 1637 ql_dbg(ql_dbg_edif, vha, 0x911d, 1638 "%s: delete for lid 0x%x, delete_sa_index %d is pending\n", 1639 __func__, edif_entry->handle, edif_entry->delete_sa_index); 1640 1641 /* free up the sa_ctl that was allocated with the sa_index */ 1642 sa_ctl = qla_edif_find_sa_ctl_by_index(fcport, sa_index, 1643 (sa_frame.flags & SAU_FLG_TX)); 1644 if (sa_ctl) { 1645 ql_dbg(ql_dbg_edif, vha, 0x3063, 1646 "%s: freeing sa_ctl for index %d\n", 1647 __func__, sa_ctl->index); 1648 qla_edif_free_sa_ctl(fcport, sa_ctl, sa_ctl->index); 1649 } 1650 1651 /* release the sa_index */ 1652 ql_dbg(ql_dbg_edif, vha, 0x3063, 1653 "%s: freeing sa_index %d, nph: 0x%x\n", 1654 __func__, sa_index, nport_handle); 1655 qla_edif_sadb_delete_sa_index(fcport, nport_handle, sa_index); 1656 1657 rval = -EINVAL; 1658 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 1659 goto done; 1660 } 1661 1662 fcport->edif.rekey_cnt++; 1663 1664 /* configure and start the rx delay timer */ 1665 edif_entry->fcport = fcport; 1666 edif_entry->timer.expires = jiffies + RX_DELAY_DELETE_TIMEOUT * HZ; 1667 1668 ql_dbg(ql_dbg_edif, vha, 0x911d, 1669 "%s: adding timer, entry: %p, delete sa_index %d, lid 0x%x to edif_list\n", 1670 __func__, edif_entry, sa_index, nport_handle); 1671 1672 /* 1673 * Start the timer when we queue the delayed rx delete. 1674 * This is an activity timer that goes off if we have not 1675 * received packets with the new sa_index 1676 */ 1677 add_timer(&edif_entry->timer); 1678 1679 /* 1680 * sa_delete for rx key with an active rx key including this one 1681 * add the delete rx sa index to the hash so we can look for it 1682 * in the rsp queue. Do this after making any changes to the 1683 * edif_entry as part of the rx delete. 1684 */ 1685 1686 ql_dbg(ql_dbg_edif, vha, 0x911d, 1687 "%s: delete sa_index %d, lid 0x%x to edif_list. bsg done ptr %p\n", 1688 __func__, sa_index, nport_handle, bsg_job); 1689 1690 edif_entry->delete_sa_index = sa_index; 1691 1692 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1693 bsg_reply->result = DID_OK << 16; 1694 1695 goto done; 1696 1697 /* 1698 * rx index and update 1699 * add the index to the list and continue with normal update 1700 */ 1701 } else if (((sa_frame.flags & SAU_FLG_TX) == 0) && 1702 ((sa_frame.flags & SAU_FLG_INV) == 0)) { 1703 /* sa_update for rx key */ 1704 uint32_t nport_handle = fcport->loop_id; 1705 uint16_t sa_index = sa_frame.fast_sa_index; 1706 int result; 1707 1708 /* 1709 * add the update rx sa index to the hash so we can look for it 1710 * in the rsp queue and continue normally 1711 */ 1712 1713 ql_dbg(ql_dbg_edif, vha, 0x911d, 1714 "%s: adding update sa_index %d, lid 0x%x to edif_list\n", 1715 __func__, sa_index, nport_handle); 1716 1717 result = qla_edif_list_add_sa_update_index(fcport, sa_index, 1718 nport_handle); 1719 if (result) { 1720 ql_dbg(ql_dbg_edif, vha, 0x911d, 1721 "%s: SA_UPDATE failed to add new sa index %d to list for lid 0x%x\n", 1722 __func__, sa_index, nport_handle); 1723 } 1724 } 1725 if (sa_frame.flags & SAU_FLG_GMAC_MODE) 1726 fcport->edif.aes_gmac = 1; 1727 else 1728 fcport->edif.aes_gmac = 0; 1729 1730 force_rx_delete: 1731 /* 1732 * sa_update for both rx and tx keys, sa_delete for tx key 1733 * immediately process the request 1734 */ 1735 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); 1736 if (!sp) { 1737 rval = -ENOMEM; 1738 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 1739 goto done; 1740 } 1741 1742 sp->type = SRB_SA_UPDATE; 1743 sp->name = "bsg_sa_update"; 1744 sp->u.bsg_job = bsg_job; 1745 /* sp->free = qla2x00_bsg_sp_free; */ 1746 sp->free = qla2x00_rel_sp; 1747 sp->done = qla2x00_bsg_job_done; 1748 iocb_cmd = &sp->u.iocb_cmd; 1749 iocb_cmd->u.sa_update.sa_frame = sa_frame; 1750 cnt = 0; 1751 retry: 1752 rval = qla2x00_start_sp(sp); 1753 switch (rval) { 1754 case QLA_SUCCESS: 1755 break; 1756 case EAGAIN: 1757 msleep(EDIF_MSLEEP_INTERVAL); 1758 cnt++; 1759 if (cnt < EDIF_RETRY_COUNT) 1760 goto retry; 1761 1762 fallthrough; 1763 default: 1764 ql_log(ql_dbg_edif, vha, 0x70e3, 1765 "%s qla2x00_start_sp failed=%d.\n", 1766 __func__, rval); 1767 1768 qla2x00_rel_sp(sp); 1769 rval = -EIO; 1770 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 1771 goto done; 1772 } 1773 1774 ql_dbg(ql_dbg_edif, vha, 0x911d, 1775 "%s: %s sent, hdl=%x, portid=%06x.\n", 1776 __func__, sp->name, sp->handle, fcport->d_id.b24); 1777 1778 fcport->edif.rekey_cnt++; 1779 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1780 SET_DID_STATUS(bsg_reply->result, DID_OK); 1781 1782 return 0; 1783 1784 /* 1785 * send back error status 1786 */ 1787 done: 1788 bsg_job->reply_len = sizeof(struct fc_bsg_reply); 1789 ql_dbg(ql_dbg_edif, vha, 0x911d, 1790 "%s:status: FAIL, result: 0x%x, bsg ptr done %p\n", 1791 __func__, bsg_reply->result, bsg_job); 1792 bsg_job_done(bsg_job, bsg_reply->result, 1793 bsg_reply->reply_payload_rcv_len); 1794 1795 return 0; 1796 } 1797 1798 static void 1799 qla_enode_free(scsi_qla_host_t *vha, struct enode *node) 1800 { 1801 node->ntype = N_UNDEF; 1802 kfree(node); 1803 } 1804 1805 /** 1806 * qla_enode_init - initialize enode structs & lock 1807 * @vha: host adapter pointer 1808 * 1809 * should only be called when driver attaching 1810 */ 1811 void 1812 qla_enode_init(scsi_qla_host_t *vha) 1813 { 1814 struct qla_hw_data *ha = vha->hw; 1815 char name[32]; 1816 1817 if (vha->pur_cinfo.enode_flags == ENODE_ACTIVE) { 1818 /* list still active - error */ 1819 ql_dbg(ql_dbg_edif, vha, 0x09102, "%s enode still active\n", 1820 __func__); 1821 return; 1822 } 1823 1824 /* initialize lock which protects pur_core & init list */ 1825 spin_lock_init(&vha->pur_cinfo.pur_lock); 1826 INIT_LIST_HEAD(&vha->pur_cinfo.head); 1827 1828 snprintf(name, sizeof(name), "%s_%d_purex", QLA2XXX_DRIVER_NAME, 1829 ha->pdev->device); 1830 } 1831 1832 /** 1833 * qla_enode_stop - stop and clear and enode data 1834 * @vha: host adapter pointer 1835 * 1836 * called when app notified it is exiting 1837 */ 1838 void 1839 qla_enode_stop(scsi_qla_host_t *vha) 1840 { 1841 unsigned long flags; 1842 struct enode *node, *q; 1843 1844 if (vha->pur_cinfo.enode_flags != ENODE_ACTIVE) { 1845 /* doorbell list not enabled */ 1846 ql_dbg(ql_dbg_edif, vha, 0x09102, 1847 "%s enode not active\n", __func__); 1848 return; 1849 } 1850 1851 /* grab lock so list doesn't move */ 1852 spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags); 1853 1854 vha->pur_cinfo.enode_flags &= ~ENODE_ACTIVE; /* mark it not active */ 1855 1856 /* hopefully this is a null list at this point */ 1857 list_for_each_entry_safe(node, q, &vha->pur_cinfo.head, list) { 1858 ql_dbg(ql_dbg_edif, vha, 0x910f, 1859 "%s freeing enode type=%x, cnt=%x\n", __func__, node->ntype, 1860 node->dinfo.nodecnt); 1861 list_del_init(&node->list); 1862 qla_enode_free(vha, node); 1863 } 1864 spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags); 1865 } 1866 1867 static void qla_enode_clear(scsi_qla_host_t *vha, port_id_t portid) 1868 { 1869 unsigned long flags; 1870 struct enode *e, *tmp; 1871 struct purexevent *purex; 1872 LIST_HEAD(enode_list); 1873 1874 if (vha->pur_cinfo.enode_flags != ENODE_ACTIVE) { 1875 ql_dbg(ql_dbg_edif, vha, 0x09102, 1876 "%s enode not active\n", __func__); 1877 return; 1878 } 1879 spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags); 1880 list_for_each_entry_safe(e, tmp, &vha->pur_cinfo.head, list) { 1881 purex = &e->u.purexinfo; 1882 if (purex->pur_info.pur_sid.b24 == portid.b24) { 1883 ql_dbg(ql_dbg_edif, vha, 0x911d, 1884 "%s free ELS sid=%06x. xchg %x, nb=%xh\n", 1885 __func__, portid.b24, 1886 purex->pur_info.pur_rx_xchg_address, 1887 purex->pur_info.pur_bytes_rcvd); 1888 1889 list_del_init(&e->list); 1890 list_add_tail(&e->list, &enode_list); 1891 } 1892 } 1893 spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags); 1894 1895 list_for_each_entry_safe(e, tmp, &enode_list, list) { 1896 list_del_init(&e->list); 1897 qla_enode_free(vha, e); 1898 } 1899 } 1900 1901 /* 1902 * allocate enode struct and populate buffer 1903 * returns: enode pointer with buffers 1904 * NULL on error 1905 */ 1906 static struct enode * 1907 qla_enode_alloc(scsi_qla_host_t *vha, uint32_t ntype) 1908 { 1909 struct enode *node; 1910 struct purexevent *purex; 1911 1912 node = kzalloc(RX_ELS_SIZE, GFP_ATOMIC); 1913 if (!node) 1914 return NULL; 1915 1916 purex = &node->u.purexinfo; 1917 purex->msgp = (u8 *)(node + 1); 1918 purex->msgp_len = ELS_MAX_PAYLOAD; 1919 1920 node->ntype = ntype; 1921 INIT_LIST_HEAD(&node->list); 1922 return node; 1923 } 1924 1925 static void 1926 qla_enode_add(scsi_qla_host_t *vha, struct enode *ptr) 1927 { 1928 unsigned long flags; 1929 1930 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x9109, 1931 "%s add enode for type=%x, cnt=%x\n", 1932 __func__, ptr->ntype, ptr->dinfo.nodecnt); 1933 1934 spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags); 1935 list_add_tail(&ptr->list, &vha->pur_cinfo.head); 1936 spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags); 1937 1938 return; 1939 } 1940 1941 static struct enode * 1942 qla_enode_find(scsi_qla_host_t *vha, uint32_t ntype, uint32_t p1, uint32_t p2) 1943 { 1944 struct enode *node_rtn = NULL; 1945 struct enode *list_node, *q; 1946 unsigned long flags; 1947 uint32_t sid; 1948 struct purexevent *purex; 1949 1950 /* secure the list from moving under us */ 1951 spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags); 1952 1953 list_for_each_entry_safe(list_node, q, &vha->pur_cinfo.head, list) { 1954 1955 /* node type determines what p1 and p2 are */ 1956 purex = &list_node->u.purexinfo; 1957 sid = p1; 1958 1959 if (purex->pur_info.pur_sid.b24 == sid) { 1960 /* found it and its complete */ 1961 node_rtn = list_node; 1962 list_del(&list_node->list); 1963 break; 1964 } 1965 } 1966 1967 spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags); 1968 1969 return node_rtn; 1970 } 1971 1972 /** 1973 * qla_pur_get_pending - read/return authentication message sent 1974 * from remote port 1975 * @vha: host adapter pointer 1976 * @fcport: session pointer 1977 * @bsg_job: user request where the message is copy to. 1978 */ 1979 static int 1980 qla_pur_get_pending(scsi_qla_host_t *vha, fc_port_t *fcport, 1981 struct bsg_job *bsg_job) 1982 { 1983 struct enode *ptr; 1984 struct purexevent *purex; 1985 struct qla_bsg_auth_els_reply *rpl = 1986 (struct qla_bsg_auth_els_reply *)bsg_job->reply; 1987 1988 bsg_job->reply_len = sizeof(*rpl); 1989 1990 ptr = qla_enode_find(vha, N_PUREX, fcport->d_id.b24, PUR_GET); 1991 if (!ptr) { 1992 ql_dbg(ql_dbg_edif, vha, 0x9111, 1993 "%s no enode data found for %8phN sid=%06x\n", 1994 __func__, fcport->port_name, fcport->d_id.b24); 1995 SET_DID_STATUS(rpl->r.result, DID_IMM_RETRY); 1996 return -EIO; 1997 } 1998 1999 /* 2000 * enode is now off the linked list and is ours to deal with 2001 */ 2002 purex = &ptr->u.purexinfo; 2003 2004 /* Copy info back to caller */ 2005 rpl->rx_xchg_address = purex->pur_info.pur_rx_xchg_address; 2006 2007 SET_DID_STATUS(rpl->r.result, DID_OK); 2008 rpl->r.reply_payload_rcv_len = 2009 sg_pcopy_from_buffer(bsg_job->reply_payload.sg_list, 2010 bsg_job->reply_payload.sg_cnt, purex->msgp, 2011 purex->pur_info.pur_bytes_rcvd, 0); 2012 2013 /* data copy / passback completed - destroy enode */ 2014 qla_enode_free(vha, ptr); 2015 2016 return 0; 2017 } 2018 2019 /* it is assume qpair lock is held */ 2020 static int 2021 qla_els_reject_iocb(scsi_qla_host_t *vha, struct qla_qpair *qp, 2022 struct qla_els_pt_arg *a) 2023 { 2024 struct els_entry_24xx *els_iocb; 2025 2026 els_iocb = __qla2x00_alloc_iocbs(qp, NULL); 2027 if (!els_iocb) { 2028 ql_log(ql_log_warn, vha, 0x700c, 2029 "qla2x00_alloc_iocbs failed.\n"); 2030 return QLA_FUNCTION_FAILED; 2031 } 2032 2033 qla_els_pt_iocb(vha, els_iocb, a); 2034 2035 ql_dbg(ql_dbg_edif, vha, 0x0183, 2036 "Sending ELS reject ox_id %04x s:%06x -> d:%06x\n", 2037 a->ox_id, a->sid.b24, a->did.b24); 2038 ql_dump_buffer(ql_dbg_edif + ql_dbg_verbose, vha, 0x0185, 2039 vha->hw->elsrej.c, sizeof(*vha->hw->elsrej.c)); 2040 /* flush iocb to mem before notifying hw doorbell */ 2041 wmb(); 2042 qla2x00_start_iocbs(vha, qp->req); 2043 return 0; 2044 } 2045 2046 void 2047 qla_edb_init(scsi_qla_host_t *vha) 2048 { 2049 if (DBELL_ACTIVE(vha)) { 2050 /* list already init'd - error */ 2051 ql_dbg(ql_dbg_edif, vha, 0x09102, 2052 "edif db already initialized, cannot reinit\n"); 2053 return; 2054 } 2055 2056 /* initialize lock which protects doorbell & init list */ 2057 spin_lock_init(&vha->e_dbell.db_lock); 2058 INIT_LIST_HEAD(&vha->e_dbell.head); 2059 } 2060 2061 static void qla_edb_clear(scsi_qla_host_t *vha, port_id_t portid) 2062 { 2063 unsigned long flags; 2064 struct edb_node *e, *tmp; 2065 port_id_t sid; 2066 LIST_HEAD(edb_list); 2067 2068 if (DBELL_INACTIVE(vha)) { 2069 /* doorbell list not enabled */ 2070 ql_dbg(ql_dbg_edif, vha, 0x09102, 2071 "%s doorbell not enabled\n", __func__); 2072 return; 2073 } 2074 2075 /* grab lock so list doesn't move */ 2076 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 2077 list_for_each_entry_safe(e, tmp, &vha->e_dbell.head, list) { 2078 switch (e->ntype) { 2079 case VND_CMD_AUTH_STATE_NEEDED: 2080 case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN: 2081 sid = e->u.plogi_did; 2082 break; 2083 case VND_CMD_AUTH_STATE_ELS_RCVD: 2084 sid = e->u.els_sid; 2085 break; 2086 case VND_CMD_AUTH_STATE_SAUPDATE_COMPL: 2087 /* app wants to see this */ 2088 continue; 2089 default: 2090 ql_log(ql_log_warn, vha, 0x09102, 2091 "%s unknown node type: %x\n", __func__, e->ntype); 2092 sid.b24 = 0; 2093 break; 2094 } 2095 if (sid.b24 == portid.b24) { 2096 ql_dbg(ql_dbg_edif, vha, 0x910f, 2097 "%s free doorbell event : node type = %x %p\n", 2098 __func__, e->ntype, e); 2099 list_del_init(&e->list); 2100 list_add_tail(&e->list, &edb_list); 2101 } 2102 } 2103 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 2104 2105 list_for_each_entry_safe(e, tmp, &edb_list, list) 2106 qla_edb_node_free(vha, e); 2107 } 2108 2109 /* function called when app is stopping */ 2110 2111 void 2112 qla_edb_stop(scsi_qla_host_t *vha) 2113 { 2114 unsigned long flags; 2115 struct edb_node *node, *q; 2116 2117 if (DBELL_INACTIVE(vha)) { 2118 /* doorbell list not enabled */ 2119 ql_dbg(ql_dbg_edif, vha, 0x09102, 2120 "%s doorbell not enabled\n", __func__); 2121 return; 2122 } 2123 2124 /* grab lock so list doesn't move */ 2125 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 2126 2127 vha->e_dbell.db_flags &= ~EDB_ACTIVE; /* mark it not active */ 2128 /* hopefully this is a null list at this point */ 2129 list_for_each_entry_safe(node, q, &vha->e_dbell.head, list) { 2130 ql_dbg(ql_dbg_edif, vha, 0x910f, 2131 "%s freeing edb_node type=%x\n", 2132 __func__, node->ntype); 2133 qla_edb_node_free(vha, node); 2134 } 2135 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 2136 2137 qla_edif_dbell_bsg_done(vha); 2138 } 2139 2140 static struct edb_node * 2141 qla_edb_node_alloc(scsi_qla_host_t *vha, uint32_t ntype) 2142 { 2143 struct edb_node *node; 2144 2145 node = kzalloc(sizeof(*node), GFP_ATOMIC); 2146 if (!node) { 2147 /* couldn't get space */ 2148 ql_dbg(ql_dbg_edif, vha, 0x9100, 2149 "edb node unable to be allocated\n"); 2150 return NULL; 2151 } 2152 2153 node->ntype = ntype; 2154 INIT_LIST_HEAD(&node->list); 2155 return node; 2156 } 2157 2158 /* adds a already allocated enode to the linked list */ 2159 static bool 2160 qla_edb_node_add(scsi_qla_host_t *vha, struct edb_node *ptr) 2161 { 2162 unsigned long flags; 2163 2164 if (DBELL_INACTIVE(vha)) { 2165 /* doorbell list not enabled */ 2166 ql_dbg(ql_dbg_edif, vha, 0x09102, 2167 "%s doorbell not enabled\n", __func__); 2168 return false; 2169 } 2170 2171 spin_lock_irqsave(&vha->e_dbell.db_lock, flags); 2172 list_add_tail(&ptr->list, &vha->e_dbell.head); 2173 spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags); 2174 2175 return true; 2176 } 2177 2178 /* adds event to doorbell list */ 2179 void 2180 qla_edb_eventcreate(scsi_qla_host_t *vha, uint32_t dbtype, 2181 uint32_t data, uint32_t data2, fc_port_t *sfcport) 2182 { 2183 struct edb_node *edbnode; 2184 fc_port_t *fcport = sfcport; 2185 port_id_t id; 2186 2187 if (!vha->hw->flags.edif_enabled) { 2188 /* edif not enabled */ 2189 return; 2190 } 2191 2192 if (DBELL_INACTIVE(vha)) { 2193 if (fcport) 2194 fcport->edif.auth_state = dbtype; 2195 /* doorbell list not enabled */ 2196 ql_dbg(ql_dbg_edif, vha, 0x09102, 2197 "%s doorbell not enabled (type=%d\n", __func__, dbtype); 2198 return; 2199 } 2200 2201 edbnode = qla_edb_node_alloc(vha, dbtype); 2202 if (!edbnode) { 2203 ql_dbg(ql_dbg_edif, vha, 0x09102, 2204 "%s unable to alloc db node\n", __func__); 2205 return; 2206 } 2207 2208 if (!fcport) { 2209 id.b.domain = (data >> 16) & 0xff; 2210 id.b.area = (data >> 8) & 0xff; 2211 id.b.al_pa = data & 0xff; 2212 ql_dbg(ql_dbg_edif, vha, 0x09222, 2213 "%s: Arrived s_id: %06x\n", __func__, 2214 id.b24); 2215 fcport = qla2x00_find_fcport_by_pid(vha, &id); 2216 if (!fcport) { 2217 ql_dbg(ql_dbg_edif, vha, 0x09102, 2218 "%s can't find fcport for sid= 0x%x - ignoring\n", 2219 __func__, id.b24); 2220 kfree(edbnode); 2221 return; 2222 } 2223 } 2224 2225 /* populate the edb node */ 2226 switch (dbtype) { 2227 case VND_CMD_AUTH_STATE_NEEDED: 2228 case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN: 2229 edbnode->u.plogi_did.b24 = fcport->d_id.b24; 2230 break; 2231 case VND_CMD_AUTH_STATE_ELS_RCVD: 2232 edbnode->u.els_sid.b24 = fcport->d_id.b24; 2233 break; 2234 case VND_CMD_AUTH_STATE_SAUPDATE_COMPL: 2235 edbnode->u.sa_aen.port_id = fcport->d_id; 2236 edbnode->u.sa_aen.status = data; 2237 edbnode->u.sa_aen.key_type = data2; 2238 edbnode->u.sa_aen.version = EDIF_VERSION1; 2239 break; 2240 default: 2241 ql_dbg(ql_dbg_edif, vha, 0x09102, 2242 "%s unknown type: %x\n", __func__, dbtype); 2243 kfree(edbnode); 2244 edbnode = NULL; 2245 break; 2246 } 2247 2248 if (edbnode) { 2249 if (!qla_edb_node_add(vha, edbnode)) { 2250 ql_dbg(ql_dbg_edif, vha, 0x09102, 2251 "%s unable to add dbnode\n", __func__); 2252 kfree(edbnode); 2253 return; 2254 } 2255 ql_dbg(ql_dbg_edif, vha, 0x09102, 2256 "%s Doorbell produced : type=%d %p\n", __func__, dbtype, edbnode); 2257 qla_edif_dbell_bsg_done(vha); 2258 if (fcport) 2259 fcport->edif.auth_state = dbtype; 2260 } 2261 } 2262 2263 void 2264 qla_edif_timer(scsi_qla_host_t *vha) 2265 { 2266 struct qla_hw_data *ha = vha->hw; 2267 2268 if (!vha->vp_idx && N2N_TOPO(ha) && ha->flags.n2n_fw_acc_sec) { 2269 if (DBELL_INACTIVE(vha) && 2270 ha->edif_post_stop_cnt_down) { 2271 ha->edif_post_stop_cnt_down--; 2272 2273 /* 2274 * turn off auto 'Plogi Acc + secure=1' feature 2275 * Set Add FW option[3] 2276 * BIT_15, if. 2277 */ 2278 if (ha->edif_post_stop_cnt_down == 0) { 2279 ql_dbg(ql_dbg_async, vha, 0x911d, 2280 "%s chip reset to turn off PLOGI ACC + secure\n", 2281 __func__); 2282 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 2283 } 2284 } else { 2285 ha->edif_post_stop_cnt_down = 60; 2286 } 2287 } 2288 2289 if (vha->e_dbell.dbell_bsg_job && time_after_eq(jiffies, vha->e_dbell.bsg_expire)) 2290 qla_edif_dbell_bsg_done(vha); 2291 } 2292 2293 static void qla_noop_sp_done(srb_t *sp, int res) 2294 { 2295 sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); 2296 /* ref: INIT */ 2297 kref_put(&sp->cmd_kref, qla2x00_sp_release); 2298 } 2299 2300 /* 2301 * Called from work queue 2302 * build and send the sa_update iocb to delete an rx sa_index 2303 */ 2304 int 2305 qla24xx_issue_sa_replace_iocb(scsi_qla_host_t *vha, struct qla_work_evt *e) 2306 { 2307 srb_t *sp; 2308 fc_port_t *fcport = NULL; 2309 struct srb_iocb *iocb_cmd = NULL; 2310 int rval = QLA_SUCCESS; 2311 struct edif_sa_ctl *sa_ctl = e->u.sa_update.sa_ctl; 2312 uint16_t nport_handle = e->u.sa_update.nport_handle; 2313 2314 ql_dbg(ql_dbg_edif, vha, 0x70e6, 2315 "%s: starting, sa_ctl: %p\n", __func__, sa_ctl); 2316 2317 if (!sa_ctl) { 2318 ql_dbg(ql_dbg_edif, vha, 0x70e6, 2319 "sa_ctl allocation failed\n"); 2320 rval = -ENOMEM; 2321 goto done; 2322 } 2323 2324 fcport = sa_ctl->fcport; 2325 2326 /* Alloc SRB structure */ 2327 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); 2328 if (!sp) { 2329 ql_dbg(ql_dbg_edif, vha, 0x70e6, 2330 "SRB allocation failed\n"); 2331 rval = -ENOMEM; 2332 goto done; 2333 } 2334 2335 fcport->flags |= FCF_ASYNC_SENT; 2336 iocb_cmd = &sp->u.iocb_cmd; 2337 iocb_cmd->u.sa_update.sa_ctl = sa_ctl; 2338 2339 ql_dbg(ql_dbg_edif, vha, 0x3073, 2340 "Enter: SA REPL portid=%06x, sa_ctl %p, index %x, nport_handle: 0x%x\n", 2341 fcport->d_id.b24, sa_ctl, sa_ctl->index, nport_handle); 2342 /* 2343 * if this is a sadb cleanup delete, mark it so the isr can 2344 * take the correct action 2345 */ 2346 if (sa_ctl->flags & EDIF_SA_CTL_FLG_CLEANUP_DEL) { 2347 /* mark this srb as a cleanup delete */ 2348 sp->flags |= SRB_EDIF_CLEANUP_DELETE; 2349 ql_dbg(ql_dbg_edif, vha, 0x70e6, 2350 "%s: sp 0x%p flagged as cleanup delete\n", __func__, sp); 2351 } 2352 2353 sp->type = SRB_SA_REPLACE; 2354 sp->name = "SA_REPLACE"; 2355 sp->fcport = fcport; 2356 sp->free = qla2x00_rel_sp; 2357 sp->done = qla_noop_sp_done; 2358 2359 rval = qla2x00_start_sp(sp); 2360 2361 if (rval != QLA_SUCCESS) { 2362 goto done_free_sp; 2363 } 2364 2365 return rval; 2366 done_free_sp: 2367 kref_put(&sp->cmd_kref, qla2x00_sp_release); 2368 fcport->flags &= ~FCF_ASYNC_SENT; 2369 done: 2370 fcport->flags &= ~FCF_ASYNC_ACTIVE; 2371 return rval; 2372 } 2373 2374 void qla24xx_sa_update_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb) 2375 { 2376 int itr = 0; 2377 struct scsi_qla_host *vha = sp->vha; 2378 struct qla_sa_update_frame *sa_frame = 2379 &sp->u.iocb_cmd.u.sa_update.sa_frame; 2380 u8 flags = 0; 2381 2382 switch (sa_frame->flags & (SAU_FLG_INV | SAU_FLG_TX)) { 2383 case 0: 2384 ql_dbg(ql_dbg_edif, vha, 0x911d, 2385 "%s: EDIF SA UPDATE RX IOCB vha: 0x%p index: %d\n", 2386 __func__, vha, sa_frame->fast_sa_index); 2387 break; 2388 case 1: 2389 ql_dbg(ql_dbg_edif, vha, 0x911d, 2390 "%s: EDIF SA DELETE RX IOCB vha: 0x%p index: %d\n", 2391 __func__, vha, sa_frame->fast_sa_index); 2392 flags |= SA_FLAG_INVALIDATE; 2393 break; 2394 case 2: 2395 ql_dbg(ql_dbg_edif, vha, 0x911d, 2396 "%s: EDIF SA UPDATE TX IOCB vha: 0x%p index: %d\n", 2397 __func__, vha, sa_frame->fast_sa_index); 2398 flags |= SA_FLAG_TX; 2399 break; 2400 case 3: 2401 ql_dbg(ql_dbg_edif, vha, 0x911d, 2402 "%s: EDIF SA DELETE TX IOCB vha: 0x%p index: %d\n", 2403 __func__, vha, sa_frame->fast_sa_index); 2404 flags |= SA_FLAG_TX | SA_FLAG_INVALIDATE; 2405 break; 2406 } 2407 2408 sa_update_iocb->entry_type = SA_UPDATE_IOCB_TYPE; 2409 sa_update_iocb->entry_count = 1; 2410 sa_update_iocb->sys_define = 0; 2411 sa_update_iocb->entry_status = 0; 2412 sa_update_iocb->handle = sp->handle; 2413 sa_update_iocb->u.nport_handle = cpu_to_le16(sp->fcport->loop_id); 2414 sa_update_iocb->vp_index = sp->fcport->vha->vp_idx; 2415 sa_update_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 2416 sa_update_iocb->port_id[1] = sp->fcport->d_id.b.area; 2417 sa_update_iocb->port_id[2] = sp->fcport->d_id.b.domain; 2418 2419 sa_update_iocb->flags = flags; 2420 sa_update_iocb->salt = cpu_to_le32(sa_frame->salt); 2421 sa_update_iocb->spi = cpu_to_le32(sa_frame->spi); 2422 sa_update_iocb->sa_index = cpu_to_le16(sa_frame->fast_sa_index); 2423 2424 sa_update_iocb->sa_control |= SA_CNTL_ENC_FCSP; 2425 if (sp->fcport->edif.aes_gmac) 2426 sa_update_iocb->sa_control |= SA_CNTL_AES_GMAC; 2427 2428 if (sa_frame->flags & SAU_FLG_KEY256) { 2429 sa_update_iocb->sa_control |= SA_CNTL_KEY256; 2430 for (itr = 0; itr < 32; itr++) 2431 sa_update_iocb->sa_key[itr] = sa_frame->sa_key[itr]; 2432 } else { 2433 sa_update_iocb->sa_control |= SA_CNTL_KEY128; 2434 for (itr = 0; itr < 16; itr++) 2435 sa_update_iocb->sa_key[itr] = sa_frame->sa_key[itr]; 2436 } 2437 2438 ql_dbg(ql_dbg_edif, vha, 0x921d, 2439 "%s SAU Port ID = %02x%02x%02x, flags=%xh, index=%u, ctl=%xh, SPI 0x%x flags 0x%x hdl=%x gmac %d\n", 2440 __func__, sa_update_iocb->port_id[2], sa_update_iocb->port_id[1], 2441 sa_update_iocb->port_id[0], sa_update_iocb->flags, sa_update_iocb->sa_index, 2442 sa_update_iocb->sa_control, sa_update_iocb->spi, sa_frame->flags, sp->handle, 2443 sp->fcport->edif.aes_gmac); 2444 2445 if (sa_frame->flags & SAU_FLG_TX) 2446 sp->fcport->edif.tx_sa_pending = 1; 2447 else 2448 sp->fcport->edif.rx_sa_pending = 1; 2449 2450 sp->fcport->vha->qla_stats.control_requests++; 2451 } 2452 2453 void 2454 qla24xx_sa_replace_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb) 2455 { 2456 struct scsi_qla_host *vha = sp->vha; 2457 struct srb_iocb *srb_iocb = &sp->u.iocb_cmd; 2458 struct edif_sa_ctl *sa_ctl = srb_iocb->u.sa_update.sa_ctl; 2459 uint16_t nport_handle = sp->fcport->loop_id; 2460 2461 sa_update_iocb->entry_type = SA_UPDATE_IOCB_TYPE; 2462 sa_update_iocb->entry_count = 1; 2463 sa_update_iocb->sys_define = 0; 2464 sa_update_iocb->entry_status = 0; 2465 sa_update_iocb->handle = sp->handle; 2466 2467 sa_update_iocb->u.nport_handle = cpu_to_le16(nport_handle); 2468 2469 sa_update_iocb->vp_index = sp->fcport->vha->vp_idx; 2470 sa_update_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 2471 sa_update_iocb->port_id[1] = sp->fcport->d_id.b.area; 2472 sa_update_iocb->port_id[2] = sp->fcport->d_id.b.domain; 2473 2474 /* Invalidate the index. salt, spi, control & key are ignore */ 2475 sa_update_iocb->flags = SA_FLAG_INVALIDATE; 2476 sa_update_iocb->salt = 0; 2477 sa_update_iocb->spi = 0; 2478 sa_update_iocb->sa_index = cpu_to_le16(sa_ctl->index); 2479 sa_update_iocb->sa_control = 0; 2480 2481 ql_dbg(ql_dbg_edif, vha, 0x921d, 2482 "%s SAU DELETE RX Port ID = %02x:%02x:%02x, lid %d flags=%xh, index=%u, hdl=%x\n", 2483 __func__, sa_update_iocb->port_id[2], sa_update_iocb->port_id[1], 2484 sa_update_iocb->port_id[0], nport_handle, sa_update_iocb->flags, 2485 sa_update_iocb->sa_index, sp->handle); 2486 2487 sp->fcport->vha->qla_stats.control_requests++; 2488 } 2489 2490 void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp) 2491 { 2492 struct purex_entry_24xx *p = *pkt; 2493 struct enode *ptr; 2494 int sid; 2495 u16 totlen; 2496 struct purexevent *purex; 2497 struct scsi_qla_host *host = NULL; 2498 int rc; 2499 struct fc_port *fcport; 2500 struct qla_els_pt_arg a; 2501 be_id_t beid; 2502 2503 memset(&a, 0, sizeof(a)); 2504 2505 a.els_opcode = ELS_AUTH_ELS; 2506 a.nport_handle = p->nport_handle; 2507 a.rx_xchg_address = p->rx_xchg_addr; 2508 a.did.b.domain = p->s_id[2]; 2509 a.did.b.area = p->s_id[1]; 2510 a.did.b.al_pa = p->s_id[0]; 2511 a.tx_byte_count = a.tx_len = sizeof(struct fc_els_ls_rjt); 2512 a.tx_addr = vha->hw->elsrej.cdma; 2513 a.vp_idx = vha->vp_idx; 2514 a.control_flags = EPD_ELS_RJT; 2515 a.ox_id = le16_to_cpu(p->ox_id); 2516 2517 sid = p->s_id[0] | (p->s_id[1] << 8) | (p->s_id[2] << 16); 2518 2519 totlen = (le16_to_cpu(p->frame_size) & 0x0fff) - PURX_ELS_HEADER_SIZE; 2520 if (le16_to_cpu(p->status_flags) & 0x8000) { 2521 totlen = le16_to_cpu(p->trunc_frame_size); 2522 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2523 __qla_consume_iocb(vha, pkt, rsp); 2524 return; 2525 } 2526 2527 if (totlen > ELS_MAX_PAYLOAD) { 2528 ql_dbg(ql_dbg_edif, vha, 0x0910d, 2529 "%s WARNING: verbose ELS frame received (totlen=%x)\n", 2530 __func__, totlen); 2531 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2532 __qla_consume_iocb(vha, pkt, rsp); 2533 return; 2534 } 2535 2536 if (!vha->hw->flags.edif_enabled) { 2537 /* edif support not enabled */ 2538 ql_dbg(ql_dbg_edif, vha, 0x910e, "%s edif not enabled\n", 2539 __func__); 2540 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2541 __qla_consume_iocb(vha, pkt, rsp); 2542 return; 2543 } 2544 2545 ptr = qla_enode_alloc(vha, N_PUREX); 2546 if (!ptr) { 2547 ql_dbg(ql_dbg_edif, vha, 0x09109, 2548 "WARNING: enode alloc failed for sid=%x\n", 2549 sid); 2550 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2551 __qla_consume_iocb(vha, pkt, rsp); 2552 return; 2553 } 2554 2555 purex = &ptr->u.purexinfo; 2556 purex->pur_info.pur_sid = a.did; 2557 purex->pur_info.pur_bytes_rcvd = totlen; 2558 purex->pur_info.pur_rx_xchg_address = le32_to_cpu(p->rx_xchg_addr); 2559 purex->pur_info.pur_nphdl = le16_to_cpu(p->nport_handle); 2560 purex->pur_info.pur_did.b.domain = p->d_id[2]; 2561 purex->pur_info.pur_did.b.area = p->d_id[1]; 2562 purex->pur_info.pur_did.b.al_pa = p->d_id[0]; 2563 purex->pur_info.vp_idx = p->vp_idx; 2564 2565 a.sid = purex->pur_info.pur_did; 2566 2567 rc = __qla_copy_purex_to_buffer(vha, pkt, rsp, purex->msgp, 2568 purex->msgp_len); 2569 if (rc) { 2570 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2571 qla_enode_free(vha, ptr); 2572 return; 2573 } 2574 beid.al_pa = purex->pur_info.pur_did.b.al_pa; 2575 beid.area = purex->pur_info.pur_did.b.area; 2576 beid.domain = purex->pur_info.pur_did.b.domain; 2577 host = qla_find_host_by_d_id(vha, beid); 2578 if (!host) { 2579 ql_log(ql_log_fatal, vha, 0x508b, 2580 "%s Drop ELS due to unable to find host %06x\n", 2581 __func__, purex->pur_info.pur_did.b24); 2582 2583 qla_els_reject_iocb(vha, (*rsp)->qpair, &a); 2584 qla_enode_free(vha, ptr); 2585 return; 2586 } 2587 2588 fcport = qla2x00_find_fcport_by_pid(host, &purex->pur_info.pur_sid); 2589 2590 if (DBELL_INACTIVE(vha)) { 2591 ql_dbg(ql_dbg_edif, host, 0x0910c, "%s e_dbell.db_flags =%x %06x\n", 2592 __func__, host->e_dbell.db_flags, 2593 fcport ? fcport->d_id.b24 : 0); 2594 2595 qla_els_reject_iocb(host, (*rsp)->qpair, &a); 2596 qla_enode_free(host, ptr); 2597 return; 2598 } 2599 2600 if (fcport && EDIF_SESSION_DOWN(fcport)) { 2601 ql_dbg(ql_dbg_edif, host, 0x13b6, 2602 "%s terminate exchange. Send logo to 0x%x\n", 2603 __func__, a.did.b24); 2604 2605 a.tx_byte_count = a.tx_len = 0; 2606 a.tx_addr = 0; 2607 a.control_flags = EPD_RX_XCHG; /* EPD_RX_XCHG = terminate cmd */ 2608 qla_els_reject_iocb(host, (*rsp)->qpair, &a); 2609 qla_enode_free(host, ptr); 2610 /* send logo to let remote port knows to tear down session */ 2611 fcport->send_els_logo = 1; 2612 qlt_schedule_sess_for_deletion(fcport); 2613 return; 2614 } 2615 2616 /* add the local enode to the list */ 2617 qla_enode_add(host, ptr); 2618 2619 ql_dbg(ql_dbg_edif, host, 0x0910c, 2620 "%s COMPLETE purex->pur_info.pur_bytes_rcvd =%xh s:%06x -> d:%06x xchg=%xh\n", 2621 __func__, purex->pur_info.pur_bytes_rcvd, purex->pur_info.pur_sid.b24, 2622 purex->pur_info.pur_did.b24, purex->pur_info.pur_rx_xchg_address); 2623 2624 qla_edb_eventcreate(host, VND_CMD_AUTH_STATE_ELS_RCVD, sid, 0, NULL); 2625 } 2626 2627 static uint16_t qla_edif_get_sa_index_from_freepool(fc_port_t *fcport, int dir) 2628 { 2629 struct scsi_qla_host *vha = fcport->vha; 2630 struct qla_hw_data *ha = vha->hw; 2631 void *sa_id_map; 2632 unsigned long flags = 0; 2633 u16 sa_index; 2634 2635 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x3063, 2636 "%s: entry\n", __func__); 2637 2638 if (dir) 2639 sa_id_map = ha->edif_tx_sa_id_map; 2640 else 2641 sa_id_map = ha->edif_rx_sa_id_map; 2642 2643 spin_lock_irqsave(&ha->sadb_fp_lock, flags); 2644 sa_index = find_first_zero_bit(sa_id_map, EDIF_NUM_SA_INDEX); 2645 if (sa_index >= EDIF_NUM_SA_INDEX) { 2646 spin_unlock_irqrestore(&ha->sadb_fp_lock, flags); 2647 return INVALID_EDIF_SA_INDEX; 2648 } 2649 set_bit(sa_index, sa_id_map); 2650 spin_unlock_irqrestore(&ha->sadb_fp_lock, flags); 2651 2652 if (dir) 2653 sa_index += EDIF_TX_SA_INDEX_BASE; 2654 2655 ql_dbg(ql_dbg_edif, vha, 0x3063, 2656 "%s: index retrieved from free pool %d\n", __func__, sa_index); 2657 2658 return sa_index; 2659 } 2660 2661 /* find an sadb entry for an nport_handle */ 2662 static struct edif_sa_index_entry * 2663 qla_edif_sadb_find_sa_index_entry(uint16_t nport_handle, 2664 struct list_head *sa_list) 2665 { 2666 struct edif_sa_index_entry *entry; 2667 struct edif_sa_index_entry *tentry; 2668 struct list_head *indx_list = sa_list; 2669 2670 list_for_each_entry_safe(entry, tentry, indx_list, next) { 2671 if (entry->handle == nport_handle) 2672 return entry; 2673 } 2674 return NULL; 2675 } 2676 2677 /* remove an sa_index from the nport_handle and return it to the free pool */ 2678 static int qla_edif_sadb_delete_sa_index(fc_port_t *fcport, uint16_t nport_handle, 2679 uint16_t sa_index) 2680 { 2681 struct edif_sa_index_entry *entry; 2682 struct list_head *sa_list; 2683 int dir = (sa_index < EDIF_TX_SA_INDEX_BASE) ? 0 : 1; 2684 int slot = 0; 2685 int free_slot_count = 0; 2686 scsi_qla_host_t *vha = fcport->vha; 2687 struct qla_hw_data *ha = vha->hw; 2688 unsigned long flags = 0; 2689 2690 ql_dbg(ql_dbg_edif, vha, 0x3063, 2691 "%s: entry\n", __func__); 2692 2693 if (dir) 2694 sa_list = &ha->sadb_tx_index_list; 2695 else 2696 sa_list = &ha->sadb_rx_index_list; 2697 2698 entry = qla_edif_sadb_find_sa_index_entry(nport_handle, sa_list); 2699 if (!entry) { 2700 ql_dbg(ql_dbg_edif, vha, 0x3063, 2701 "%s: no entry found for nport_handle 0x%x\n", 2702 __func__, nport_handle); 2703 return -1; 2704 } 2705 2706 spin_lock_irqsave(&ha->sadb_lock, flags); 2707 /* 2708 * each tx/rx direction has up to 2 sa indexes/slots. 1 slot for in flight traffic 2709 * the other is use at re-key time. 2710 */ 2711 for (slot = 0; slot < 2; slot++) { 2712 if (entry->sa_pair[slot].sa_index == sa_index) { 2713 entry->sa_pair[slot].sa_index = INVALID_EDIF_SA_INDEX; 2714 entry->sa_pair[slot].spi = 0; 2715 free_slot_count++; 2716 qla_edif_add_sa_index_to_freepool(fcport, dir, sa_index); 2717 } else if (entry->sa_pair[slot].sa_index == INVALID_EDIF_SA_INDEX) { 2718 free_slot_count++; 2719 } 2720 } 2721 2722 if (free_slot_count == 2) { 2723 list_del(&entry->next); 2724 kfree(entry); 2725 } 2726 spin_unlock_irqrestore(&ha->sadb_lock, flags); 2727 2728 ql_dbg(ql_dbg_edif, vha, 0x3063, 2729 "%s: sa_index %d removed, free_slot_count: %d\n", 2730 __func__, sa_index, free_slot_count); 2731 2732 return 0; 2733 } 2734 2735 void 2736 qla28xx_sa_update_iocb_entry(scsi_qla_host_t *v, struct req_que *req, 2737 struct sa_update_28xx *pkt) 2738 { 2739 const char *func = "SA_UPDATE_RESPONSE_IOCB"; 2740 srb_t *sp; 2741 struct edif_sa_ctl *sa_ctl; 2742 int old_sa_deleted = 1; 2743 uint16_t nport_handle; 2744 struct scsi_qla_host *vha; 2745 2746 sp = qla2x00_get_sp_from_handle(v, func, req, pkt); 2747 2748 if (!sp) { 2749 ql_dbg(ql_dbg_edif, v, 0x3063, 2750 "%s: no sp found for pkt\n", __func__); 2751 return; 2752 } 2753 /* use sp->vha due to npiv */ 2754 vha = sp->vha; 2755 2756 switch (pkt->flags & (SA_FLAG_INVALIDATE | SA_FLAG_TX)) { 2757 case 0: 2758 ql_dbg(ql_dbg_edif, vha, 0x3063, 2759 "%s: EDIF SA UPDATE RX IOCB vha: 0x%p index: %d\n", 2760 __func__, vha, pkt->sa_index); 2761 break; 2762 case 1: 2763 ql_dbg(ql_dbg_edif, vha, 0x3063, 2764 "%s: EDIF SA DELETE RX IOCB vha: 0x%p index: %d\n", 2765 __func__, vha, pkt->sa_index); 2766 break; 2767 case 2: 2768 ql_dbg(ql_dbg_edif, vha, 0x3063, 2769 "%s: EDIF SA UPDATE TX IOCB vha: 0x%p index: %d\n", 2770 __func__, vha, pkt->sa_index); 2771 break; 2772 case 3: 2773 ql_dbg(ql_dbg_edif, vha, 0x3063, 2774 "%s: EDIF SA DELETE TX IOCB vha: 0x%p index: %d\n", 2775 __func__, vha, pkt->sa_index); 2776 break; 2777 } 2778 2779 /* 2780 * dig the nport handle out of the iocb, fcport->loop_id can not be trusted 2781 * to be correct during cleanup sa_update iocbs. 2782 */ 2783 nport_handle = sp->fcport->loop_id; 2784 2785 ql_dbg(ql_dbg_edif, vha, 0x3063, 2786 "%s: %8phN comp status=%x old_sa_info=%x new_sa_info=%x lid %d, index=0x%x pkt_flags %xh hdl=%x\n", 2787 __func__, sp->fcport->port_name, pkt->u.comp_sts, pkt->old_sa_info, pkt->new_sa_info, 2788 nport_handle, pkt->sa_index, pkt->flags, sp->handle); 2789 2790 /* if rx delete, remove the timer */ 2791 if ((pkt->flags & (SA_FLAG_INVALIDATE | SA_FLAG_TX)) == SA_FLAG_INVALIDATE) { 2792 struct edif_list_entry *edif_entry; 2793 2794 sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); 2795 2796 edif_entry = qla_edif_list_find_sa_index(sp->fcport, nport_handle); 2797 if (edif_entry) { 2798 ql_dbg(ql_dbg_edif, vha, 0x5033, 2799 "%s: removing edif_entry %p, new sa_index: 0x%x\n", 2800 __func__, edif_entry, pkt->sa_index); 2801 qla_edif_list_delete_sa_index(sp->fcport, edif_entry); 2802 timer_shutdown(&edif_entry->timer); 2803 2804 ql_dbg(ql_dbg_edif, vha, 0x5033, 2805 "%s: releasing edif_entry %p, new sa_index: 0x%x\n", 2806 __func__, edif_entry, pkt->sa_index); 2807 2808 kfree(edif_entry); 2809 } 2810 } 2811 2812 /* 2813 * if this is a delete for either tx or rx, make sure it succeeded. 2814 * The new_sa_info field should be 0xffff on success 2815 */ 2816 if (pkt->flags & SA_FLAG_INVALIDATE) 2817 old_sa_deleted = (le16_to_cpu(pkt->new_sa_info) == 0xffff) ? 1 : 0; 2818 2819 /* Process update and delete the same way */ 2820 2821 /* If this is an sadb cleanup delete, bypass sending events to IPSEC */ 2822 if (sp->flags & SRB_EDIF_CLEANUP_DELETE) { 2823 sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); 2824 ql_dbg(ql_dbg_edif, vha, 0x3063, 2825 "%s: nph 0x%x, sa_index %d removed from fw\n", 2826 __func__, sp->fcport->loop_id, pkt->sa_index); 2827 2828 } else if ((pkt->entry_status == 0) && (pkt->u.comp_sts == 0) && 2829 old_sa_deleted) { 2830 /* 2831 * Note: Wa are only keeping track of latest SA, 2832 * so we know when we can start enableing encryption per I/O. 2833 * If all SA's get deleted, let FW reject the IOCB. 2834 2835 * TODO: edif: don't set enabled here I think 2836 * TODO: edif: prli complete is where it should be set 2837 */ 2838 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x3063, 2839 "SA(%x)updated for s_id %02x%02x%02x\n", 2840 pkt->new_sa_info, 2841 pkt->port_id[2], pkt->port_id[1], pkt->port_id[0]); 2842 sp->fcport->edif.enable = 1; 2843 if (pkt->flags & SA_FLAG_TX) { 2844 sp->fcport->edif.tx_sa_set = 1; 2845 sp->fcport->edif.tx_sa_pending = 0; 2846 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 2847 QL_VND_SA_STAT_SUCCESS, 2848 QL_VND_TX_SA_KEY, sp->fcport); 2849 } else { 2850 sp->fcport->edif.rx_sa_set = 1; 2851 sp->fcport->edif.rx_sa_pending = 0; 2852 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 2853 QL_VND_SA_STAT_SUCCESS, 2854 QL_VND_RX_SA_KEY, sp->fcport); 2855 } 2856 } else { 2857 ql_dbg(ql_dbg_edif, vha, 0x3063, 2858 "%s: %8phN SA update FAILED: sa_index: %d, new_sa_info %d, %02x%02x%02x\n", 2859 __func__, sp->fcport->port_name, pkt->sa_index, pkt->new_sa_info, 2860 pkt->port_id[2], pkt->port_id[1], pkt->port_id[0]); 2861 2862 if (pkt->flags & SA_FLAG_TX) 2863 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 2864 (le16_to_cpu(pkt->u.comp_sts) << 16) | QL_VND_SA_STAT_FAILED, 2865 QL_VND_TX_SA_KEY, sp->fcport); 2866 else 2867 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_SAUPDATE_COMPL, 2868 (le16_to_cpu(pkt->u.comp_sts) << 16) | QL_VND_SA_STAT_FAILED, 2869 QL_VND_RX_SA_KEY, sp->fcport); 2870 } 2871 2872 /* for delete, release sa_ctl, sa_index */ 2873 if (pkt->flags & SA_FLAG_INVALIDATE) { 2874 /* release the sa_ctl */ 2875 sa_ctl = qla_edif_find_sa_ctl_by_index(sp->fcport, 2876 le16_to_cpu(pkt->sa_index), (pkt->flags & SA_FLAG_TX)); 2877 if (sa_ctl && 2878 qla_edif_find_sa_ctl_by_index(sp->fcport, sa_ctl->index, 2879 (pkt->flags & SA_FLAG_TX)) != NULL) { 2880 ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x3063, 2881 "%s: freeing sa_ctl for index %d\n", 2882 __func__, sa_ctl->index); 2883 qla_edif_free_sa_ctl(sp->fcport, sa_ctl, sa_ctl->index); 2884 } else { 2885 ql_dbg(ql_dbg_edif, vha, 0x3063, 2886 "%s: sa_ctl NOT freed, sa_ctl: %p\n", 2887 __func__, sa_ctl); 2888 } 2889 ql_dbg(ql_dbg_edif, vha, 0x3063, 2890 "%s: freeing sa_index %d, nph: 0x%x\n", 2891 __func__, le16_to_cpu(pkt->sa_index), nport_handle); 2892 qla_edif_sadb_delete_sa_index(sp->fcport, nport_handle, 2893 le16_to_cpu(pkt->sa_index)); 2894 /* 2895 * check for a failed sa_update and remove 2896 * the sadb entry. 2897 */ 2898 } else if (pkt->u.comp_sts) { 2899 ql_dbg(ql_dbg_edif, vha, 0x3063, 2900 "%s: freeing sa_index %d, nph: 0x%x\n", 2901 __func__, pkt->sa_index, nport_handle); 2902 qla_edif_sadb_delete_sa_index(sp->fcport, nport_handle, 2903 le16_to_cpu(pkt->sa_index)); 2904 switch (le16_to_cpu(pkt->u.comp_sts)) { 2905 case CS_PORT_EDIF_UNAVAIL: 2906 case CS_PORT_EDIF_LOGOUT: 2907 qlt_schedule_sess_for_deletion(sp->fcport); 2908 break; 2909 default: 2910 break; 2911 } 2912 } 2913 2914 sp->done(sp, 0); 2915 } 2916 2917 /** 2918 * qla28xx_start_scsi_edif() - Send a SCSI type 6 command to the ISP 2919 * @sp: command to send to the ISP 2920 * 2921 * Return: non-zero if a failure occurred, else zero. 2922 */ 2923 int 2924 qla28xx_start_scsi_edif(srb_t *sp) 2925 { 2926 int nseg; 2927 unsigned long flags; 2928 struct scsi_cmnd *cmd; 2929 uint32_t *clr_ptr; 2930 uint32_t index, i; 2931 uint32_t handle; 2932 uint16_t cnt; 2933 int16_t req_cnt; 2934 uint16_t tot_dsds; 2935 __be32 *fcp_dl; 2936 uint8_t additional_cdb_len; 2937 struct ct6_dsd *ctx; 2938 struct scsi_qla_host *vha = sp->vha; 2939 struct qla_hw_data *ha = vha->hw; 2940 struct cmd_type_6 *cmd_pkt; 2941 struct dsd64 *cur_dsd; 2942 uint8_t avail_dsds = 0; 2943 struct scatterlist *sg; 2944 struct req_que *req = sp->qpair->req; 2945 spinlock_t *lock = sp->qpair->qp_lock_ptr; 2946 2947 /* Setup device pointers. */ 2948 cmd = GET_CMD_SP(sp); 2949 2950 /* So we know we haven't pci_map'ed anything yet */ 2951 tot_dsds = 0; 2952 2953 /* Send marker if required */ 2954 if (vha->marker_needed != 0) { 2955 if (qla2x00_marker(vha, sp->qpair, 0, 0, MK_SYNC_ALL) != 2956 QLA_SUCCESS) { 2957 ql_log(ql_log_warn, vha, 0x300c, 2958 "qla2x00_marker failed for cmd=%p.\n", cmd); 2959 return QLA_FUNCTION_FAILED; 2960 } 2961 vha->marker_needed = 0; 2962 } 2963 2964 /* Acquire ring specific lock */ 2965 spin_lock_irqsave(lock, flags); 2966 2967 /* Check for room in outstanding command list. */ 2968 handle = req->current_outstanding_cmd; 2969 for (index = 1; index < req->num_outstanding_cmds; index++) { 2970 handle++; 2971 if (handle == req->num_outstanding_cmds) 2972 handle = 1; 2973 if (!req->outstanding_cmds[handle]) 2974 break; 2975 } 2976 if (index == req->num_outstanding_cmds) 2977 goto queuing_error; 2978 2979 /* Map the sg table so we have an accurate count of sg entries needed */ 2980 if (scsi_sg_count(cmd)) { 2981 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 2982 scsi_sg_count(cmd), cmd->sc_data_direction); 2983 if (unlikely(!nseg)) 2984 goto queuing_error; 2985 } else { 2986 nseg = 0; 2987 } 2988 2989 tot_dsds = nseg; 2990 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 2991 2992 sp->iores.res_type = RESOURCE_INI; 2993 sp->iores.iocb_cnt = req_cnt; 2994 if (qla_get_iocbs(sp->qpair, &sp->iores)) 2995 goto queuing_error; 2996 2997 if (req->cnt < (req_cnt + 2)) { 2998 cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr : 2999 rd_reg_dword(req->req_q_out); 3000 if (req->ring_index < cnt) 3001 req->cnt = cnt - req->ring_index; 3002 else 3003 req->cnt = req->length - 3004 (req->ring_index - cnt); 3005 if (req->cnt < (req_cnt + 2)) 3006 goto queuing_error; 3007 } 3008 3009 ctx = sp->u.scmd.ct6_ctx = 3010 mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); 3011 if (!ctx) { 3012 ql_log(ql_log_fatal, vha, 0x3010, 3013 "Failed to allocate ctx for cmd=%p.\n", cmd); 3014 goto queuing_error; 3015 } 3016 3017 memset(ctx, 0, sizeof(struct ct6_dsd)); 3018 ctx->fcp_cmnd = dma_pool_zalloc(ha->fcp_cmnd_dma_pool, 3019 GFP_ATOMIC, &ctx->fcp_cmnd_dma); 3020 if (!ctx->fcp_cmnd) { 3021 ql_log(ql_log_fatal, vha, 0x3011, 3022 "Failed to allocate fcp_cmnd for cmd=%p.\n", cmd); 3023 goto queuing_error; 3024 } 3025 3026 /* Initialize the DSD list and dma handle */ 3027 INIT_LIST_HEAD(&ctx->dsd_list); 3028 ctx->dsd_use_cnt = 0; 3029 3030 if (cmd->cmd_len > 16) { 3031 additional_cdb_len = cmd->cmd_len - 16; 3032 if ((cmd->cmd_len % 4) != 0) { 3033 /* 3034 * SCSI command bigger than 16 bytes must be 3035 * multiple of 4 3036 */ 3037 ql_log(ql_log_warn, vha, 0x3012, 3038 "scsi cmd len %d not multiple of 4 for cmd=%p.\n", 3039 cmd->cmd_len, cmd); 3040 goto queuing_error_fcp_cmnd; 3041 } 3042 ctx->fcp_cmnd_len = 12 + cmd->cmd_len + 4; 3043 } else { 3044 additional_cdb_len = 0; 3045 ctx->fcp_cmnd_len = 12 + 16 + 4; 3046 } 3047 3048 cmd_pkt = (struct cmd_type_6 *)req->ring_ptr; 3049 cmd_pkt->handle = make_handle(req->id, handle); 3050 3051 /* 3052 * Zero out remaining portion of packet. 3053 * tagged queuing modifier -- default is TSK_SIMPLE (0). 3054 */ 3055 clr_ptr = (uint32_t *)cmd_pkt + 2; 3056 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 3057 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 3058 3059 /* No data transfer */ 3060 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 3061 cmd_pkt->byte_count = cpu_to_le32(0); 3062 goto no_dsds; 3063 } 3064 3065 /* Set transfer direction */ 3066 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 3067 cmd_pkt->control_flags = cpu_to_le16(CF_WRITE_DATA); 3068 vha->qla_stats.output_bytes += scsi_bufflen(cmd); 3069 vha->qla_stats.output_requests++; 3070 sp->fcport->edif.tx_bytes += scsi_bufflen(cmd); 3071 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 3072 cmd_pkt->control_flags = cpu_to_le16(CF_READ_DATA); 3073 vha->qla_stats.input_bytes += scsi_bufflen(cmd); 3074 vha->qla_stats.input_requests++; 3075 sp->fcport->edif.rx_bytes += scsi_bufflen(cmd); 3076 } 3077 3078 cmd_pkt->control_flags |= cpu_to_le16(CF_EN_EDIF); 3079 cmd_pkt->control_flags &= ~(cpu_to_le16(CF_NEW_SA)); 3080 3081 /* One DSD is available in the Command Type 6 IOCB */ 3082 avail_dsds = 1; 3083 cur_dsd = &cmd_pkt->fcp_dsd; 3084 3085 /* Load data segments */ 3086 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 3087 dma_addr_t sle_dma; 3088 cont_a64_entry_t *cont_pkt; 3089 3090 /* Allocate additional continuation packets? */ 3091 if (avail_dsds == 0) { 3092 /* 3093 * Five DSDs are available in the Continuation 3094 * Type 1 IOCB. 3095 */ 3096 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, req); 3097 cur_dsd = cont_pkt->dsd; 3098 avail_dsds = 5; 3099 } 3100 3101 sle_dma = sg_dma_address(sg); 3102 put_unaligned_le64(sle_dma, &cur_dsd->address); 3103 cur_dsd->length = cpu_to_le32(sg_dma_len(sg)); 3104 cur_dsd++; 3105 avail_dsds--; 3106 } 3107 3108 no_dsds: 3109 /* Set NPORT-ID and LUN number*/ 3110 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 3111 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 3112 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 3113 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 3114 cmd_pkt->vp_index = sp->vha->vp_idx; 3115 3116 cmd_pkt->entry_type = COMMAND_TYPE_6; 3117 3118 /* Set total data segment count. */ 3119 cmd_pkt->entry_count = (uint8_t)req_cnt; 3120 3121 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 3122 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 3123 3124 /* build FCP_CMND IU */ 3125 int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun); 3126 ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; 3127 3128 if (cmd->sc_data_direction == DMA_TO_DEVICE) 3129 ctx->fcp_cmnd->additional_cdb_len |= 1; 3130 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 3131 ctx->fcp_cmnd->additional_cdb_len |= 2; 3132 3133 /* Populate the FCP_PRIO. */ 3134 if (ha->flags.fcp_prio_enabled) 3135 ctx->fcp_cmnd->task_attribute |= 3136 sp->fcport->fcp_prio << 3; 3137 3138 memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 3139 3140 fcp_dl = (__be32 *)(ctx->fcp_cmnd->cdb + 16 + 3141 additional_cdb_len); 3142 *fcp_dl = htonl((uint32_t)scsi_bufflen(cmd)); 3143 3144 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(ctx->fcp_cmnd_len); 3145 put_unaligned_le64(ctx->fcp_cmnd_dma, &cmd_pkt->fcp_cmnd_dseg_address); 3146 3147 sp->flags |= SRB_FCP_CMND_DMA_VALID; 3148 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 3149 /* Set total data segment count. */ 3150 cmd_pkt->entry_count = (uint8_t)req_cnt; 3151 cmd_pkt->entry_status = 0; 3152 3153 /* Build command packet. */ 3154 req->current_outstanding_cmd = handle; 3155 req->outstanding_cmds[handle] = sp; 3156 sp->handle = handle; 3157 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 3158 req->cnt -= req_cnt; 3159 3160 /* Adjust ring index. */ 3161 wmb(); 3162 req->ring_index++; 3163 if (req->ring_index == req->length) { 3164 req->ring_index = 0; 3165 req->ring_ptr = req->ring; 3166 } else { 3167 req->ring_ptr++; 3168 } 3169 3170 sp->qpair->cmd_cnt++; 3171 /* Set chip new ring index. */ 3172 wrt_reg_dword(req->req_q_in, req->ring_index); 3173 3174 spin_unlock_irqrestore(lock, flags); 3175 3176 return QLA_SUCCESS; 3177 3178 queuing_error_fcp_cmnd: 3179 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd, ctx->fcp_cmnd_dma); 3180 queuing_error: 3181 if (tot_dsds) 3182 scsi_dma_unmap(cmd); 3183 3184 if (sp->u.scmd.ct6_ctx) { 3185 mempool_free(sp->u.scmd.ct6_ctx, ha->ctx_mempool); 3186 sp->u.scmd.ct6_ctx = NULL; 3187 } 3188 qla_put_iocbs(sp->qpair, &sp->iores); 3189 spin_unlock_irqrestore(lock, flags); 3190 3191 return QLA_FUNCTION_FAILED; 3192 } 3193 3194 /********************************************** 3195 * edif update/delete sa_index list functions * 3196 **********************************************/ 3197 3198 /* clear the edif_indx_list for this port */ 3199 void qla_edif_list_del(fc_port_t *fcport) 3200 { 3201 struct edif_list_entry *indx_lst; 3202 struct edif_list_entry *tindx_lst; 3203 struct list_head *indx_list = &fcport->edif.edif_indx_list; 3204 unsigned long flags = 0; 3205 3206 spin_lock_irqsave(&fcport->edif.indx_list_lock, flags); 3207 list_for_each_entry_safe(indx_lst, tindx_lst, indx_list, next) { 3208 list_del(&indx_lst->next); 3209 kfree(indx_lst); 3210 } 3211 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 3212 } 3213 3214 /****************** 3215 * SADB functions * 3216 ******************/ 3217 3218 /* allocate/retrieve an sa_index for a given spi */ 3219 static uint16_t qla_edif_sadb_get_sa_index(fc_port_t *fcport, 3220 struct qla_sa_update_frame *sa_frame) 3221 { 3222 struct edif_sa_index_entry *entry; 3223 struct list_head *sa_list; 3224 uint16_t sa_index; 3225 int dir = sa_frame->flags & SAU_FLG_TX; 3226 int slot = 0; 3227 int free_slot = -1; 3228 scsi_qla_host_t *vha = fcport->vha; 3229 struct qla_hw_data *ha = vha->hw; 3230 unsigned long flags = 0; 3231 uint16_t nport_handle = fcport->loop_id; 3232 3233 ql_dbg(ql_dbg_edif, vha, 0x3063, 3234 "%s: entry fc_port: %p, nport_handle: 0x%x\n", 3235 __func__, fcport, nport_handle); 3236 3237 if (dir) 3238 sa_list = &ha->sadb_tx_index_list; 3239 else 3240 sa_list = &ha->sadb_rx_index_list; 3241 3242 entry = qla_edif_sadb_find_sa_index_entry(nport_handle, sa_list); 3243 if (!entry) { 3244 if ((sa_frame->flags & (SAU_FLG_TX | SAU_FLG_INV)) == SAU_FLG_INV) { 3245 ql_dbg(ql_dbg_edif, vha, 0x3063, 3246 "%s: rx delete request with no entry\n", __func__); 3247 return RX_DELETE_NO_EDIF_SA_INDEX; 3248 } 3249 3250 /* if there is no entry for this nport, add one */ 3251 entry = kzalloc((sizeof(struct edif_sa_index_entry)), GFP_ATOMIC); 3252 if (!entry) 3253 return INVALID_EDIF_SA_INDEX; 3254 3255 sa_index = qla_edif_get_sa_index_from_freepool(fcport, dir); 3256 if (sa_index == INVALID_EDIF_SA_INDEX) { 3257 kfree(entry); 3258 return INVALID_EDIF_SA_INDEX; 3259 } 3260 3261 INIT_LIST_HEAD(&entry->next); 3262 entry->handle = nport_handle; 3263 entry->fcport = fcport; 3264 entry->sa_pair[0].spi = sa_frame->spi; 3265 entry->sa_pair[0].sa_index = sa_index; 3266 entry->sa_pair[1].spi = 0; 3267 entry->sa_pair[1].sa_index = INVALID_EDIF_SA_INDEX; 3268 spin_lock_irqsave(&ha->sadb_lock, flags); 3269 list_add_tail(&entry->next, sa_list); 3270 spin_unlock_irqrestore(&ha->sadb_lock, flags); 3271 ql_dbg(ql_dbg_edif, vha, 0x3063, 3272 "%s: Created new sadb entry for nport_handle 0x%x, spi 0x%x, returning sa_index %d\n", 3273 __func__, nport_handle, sa_frame->spi, sa_index); 3274 3275 return sa_index; 3276 } 3277 3278 spin_lock_irqsave(&ha->sadb_lock, flags); 3279 3280 /* see if we already have an entry for this spi */ 3281 for (slot = 0; slot < 2; slot++) { 3282 if (entry->sa_pair[slot].sa_index == INVALID_EDIF_SA_INDEX) { 3283 free_slot = slot; 3284 } else { 3285 if (entry->sa_pair[slot].spi == sa_frame->spi) { 3286 spin_unlock_irqrestore(&ha->sadb_lock, flags); 3287 ql_dbg(ql_dbg_edif, vha, 0x3063, 3288 "%s: sadb slot %d entry for lid 0x%x, spi 0x%x found, sa_index %d\n", 3289 __func__, slot, entry->handle, sa_frame->spi, 3290 entry->sa_pair[slot].sa_index); 3291 return entry->sa_pair[slot].sa_index; 3292 } 3293 } 3294 } 3295 spin_unlock_irqrestore(&ha->sadb_lock, flags); 3296 3297 /* both slots are used */ 3298 if (free_slot == -1) { 3299 ql_dbg(ql_dbg_edif, vha, 0x3063, 3300 "%s: WARNING: No free slots in sadb for nport_handle 0x%x, spi: 0x%x\n", 3301 __func__, entry->handle, sa_frame->spi); 3302 ql_dbg(ql_dbg_edif, vha, 0x3063, 3303 "%s: Slot 0 spi: 0x%x sa_index: %d, Slot 1 spi: 0x%x sa_index: %d\n", 3304 __func__, entry->sa_pair[0].spi, entry->sa_pair[0].sa_index, 3305 entry->sa_pair[1].spi, entry->sa_pair[1].sa_index); 3306 3307 return INVALID_EDIF_SA_INDEX; 3308 } 3309 3310 /* there is at least one free slot, use it */ 3311 sa_index = qla_edif_get_sa_index_from_freepool(fcport, dir); 3312 if (sa_index == INVALID_EDIF_SA_INDEX) { 3313 ql_dbg(ql_dbg_edif, fcport->vha, 0x3063, 3314 "%s: empty freepool!!\n", __func__); 3315 return INVALID_EDIF_SA_INDEX; 3316 } 3317 3318 spin_lock_irqsave(&ha->sadb_lock, flags); 3319 entry->sa_pair[free_slot].spi = sa_frame->spi; 3320 entry->sa_pair[free_slot].sa_index = sa_index; 3321 spin_unlock_irqrestore(&ha->sadb_lock, flags); 3322 ql_dbg(ql_dbg_edif, fcport->vha, 0x3063, 3323 "%s: sadb slot %d entry for nport_handle 0x%x, spi 0x%x added, returning sa_index %d\n", 3324 __func__, free_slot, entry->handle, sa_frame->spi, sa_index); 3325 3326 return sa_index; 3327 } 3328 3329 /* release any sadb entries -- only done at teardown */ 3330 void qla_edif_sadb_release(struct qla_hw_data *ha) 3331 { 3332 struct edif_sa_index_entry *entry, *tmp; 3333 3334 list_for_each_entry_safe(entry, tmp, &ha->sadb_rx_index_list, next) { 3335 list_del(&entry->next); 3336 kfree(entry); 3337 } 3338 3339 list_for_each_entry_safe(entry, tmp, &ha->sadb_tx_index_list, next) { 3340 list_del(&entry->next); 3341 kfree(entry); 3342 } 3343 } 3344 3345 /************************** 3346 * sadb freepool functions 3347 **************************/ 3348 3349 /* build the rx and tx sa_index free pools -- only done at fcport init */ 3350 int qla_edif_sadb_build_free_pool(struct qla_hw_data *ha) 3351 { 3352 ha->edif_tx_sa_id_map = 3353 kcalloc(BITS_TO_LONGS(EDIF_NUM_SA_INDEX), sizeof(long), GFP_KERNEL); 3354 3355 if (!ha->edif_tx_sa_id_map) { 3356 ql_log_pci(ql_log_fatal, ha->pdev, 0x0009, 3357 "Unable to allocate memory for sadb tx.\n"); 3358 return -ENOMEM; 3359 } 3360 3361 ha->edif_rx_sa_id_map = 3362 kcalloc(BITS_TO_LONGS(EDIF_NUM_SA_INDEX), sizeof(long), GFP_KERNEL); 3363 if (!ha->edif_rx_sa_id_map) { 3364 kfree(ha->edif_tx_sa_id_map); 3365 ha->edif_tx_sa_id_map = NULL; 3366 ql_log_pci(ql_log_fatal, ha->pdev, 0x0009, 3367 "Unable to allocate memory for sadb rx.\n"); 3368 return -ENOMEM; 3369 } 3370 return 0; 3371 } 3372 3373 /* release the free pool - only done during fcport teardown */ 3374 void qla_edif_sadb_release_free_pool(struct qla_hw_data *ha) 3375 { 3376 kfree(ha->edif_tx_sa_id_map); 3377 ha->edif_tx_sa_id_map = NULL; 3378 kfree(ha->edif_rx_sa_id_map); 3379 ha->edif_rx_sa_id_map = NULL; 3380 } 3381 3382 static void __chk_edif_rx_sa_delete_pending(scsi_qla_host_t *vha, 3383 fc_port_t *fcport, uint32_t handle, uint16_t sa_index) 3384 { 3385 struct edif_list_entry *edif_entry; 3386 struct edif_sa_ctl *sa_ctl; 3387 uint16_t delete_sa_index = INVALID_EDIF_SA_INDEX; 3388 unsigned long flags = 0; 3389 uint16_t nport_handle = fcport->loop_id; 3390 uint16_t cached_nport_handle; 3391 3392 spin_lock_irqsave(&fcport->edif.indx_list_lock, flags); 3393 edif_entry = qla_edif_list_find_sa_index(fcport, nport_handle); 3394 if (!edif_entry) { 3395 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 3396 return; /* no pending delete for this handle */ 3397 } 3398 3399 /* 3400 * check for no pending delete for this index or iocb does not 3401 * match rx sa_index 3402 */ 3403 if (edif_entry->delete_sa_index == INVALID_EDIF_SA_INDEX || 3404 edif_entry->update_sa_index != sa_index) { 3405 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 3406 return; 3407 } 3408 3409 /* 3410 * wait until we have seen at least EDIF_DELAY_COUNT transfers before 3411 * queueing RX delete 3412 */ 3413 if (edif_entry->count++ < EDIF_RX_DELETE_FILTER_COUNT) { 3414 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 3415 return; 3416 } 3417 3418 ql_dbg(ql_dbg_edif, vha, 0x5033, 3419 "%s: invalidating delete_sa_index, update_sa_index: 0x%x sa_index: 0x%x, delete_sa_index: 0x%x\n", 3420 __func__, edif_entry->update_sa_index, sa_index, edif_entry->delete_sa_index); 3421 3422 delete_sa_index = edif_entry->delete_sa_index; 3423 edif_entry->delete_sa_index = INVALID_EDIF_SA_INDEX; 3424 cached_nport_handle = edif_entry->handle; 3425 spin_unlock_irqrestore(&fcport->edif.indx_list_lock, flags); 3426 3427 /* sanity check on the nport handle */ 3428 if (nport_handle != cached_nport_handle) { 3429 ql_dbg(ql_dbg_edif, vha, 0x3063, 3430 "%s: POST SA DELETE nport_handle mismatch: lid: 0x%x, edif_entry nph: 0x%x\n", 3431 __func__, nport_handle, cached_nport_handle); 3432 } 3433 3434 /* find the sa_ctl for the delete and schedule the delete */ 3435 sa_ctl = qla_edif_find_sa_ctl_by_index(fcport, delete_sa_index, 0); 3436 if (sa_ctl) { 3437 ql_dbg(ql_dbg_edif, vha, 0x3063, 3438 "%s: POST SA DELETE sa_ctl: %p, index recvd %d\n", 3439 __func__, sa_ctl, sa_index); 3440 ql_dbg(ql_dbg_edif, vha, 0x3063, 3441 "delete index %d, update index: %d, nport handle: 0x%x, handle: 0x%x\n", 3442 delete_sa_index, 3443 edif_entry->update_sa_index, nport_handle, handle); 3444 3445 sa_ctl->flags = EDIF_SA_CTL_FLG_DEL; 3446 set_bit(EDIF_SA_CTL_REPL, &sa_ctl->state); 3447 qla_post_sa_replace_work(fcport->vha, fcport, 3448 nport_handle, sa_ctl); 3449 } else { 3450 ql_dbg(ql_dbg_edif, vha, 0x3063, 3451 "%s: POST SA DELETE sa_ctl not found for delete_sa_index: %d\n", 3452 __func__, delete_sa_index); 3453 } 3454 } 3455 3456 void qla_chk_edif_rx_sa_delete_pending(scsi_qla_host_t *vha, 3457 srb_t *sp, struct sts_entry_24xx *sts24) 3458 { 3459 fc_port_t *fcport = sp->fcport; 3460 /* sa_index used by this iocb */ 3461 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 3462 uint32_t handle; 3463 3464 handle = (uint32_t)LSW(sts24->handle); 3465 3466 /* find out if this status iosb is for a scsi read */ 3467 if (cmd->sc_data_direction != DMA_FROM_DEVICE) 3468 return; 3469 3470 return __chk_edif_rx_sa_delete_pending(vha, fcport, handle, 3471 le16_to_cpu(sts24->edif_sa_index)); 3472 } 3473 3474 void qlt_chk_edif_rx_sa_delete_pending(scsi_qla_host_t *vha, fc_port_t *fcport, 3475 struct ctio7_from_24xx *pkt) 3476 { 3477 __chk_edif_rx_sa_delete_pending(vha, fcport, 3478 pkt->handle, le16_to_cpu(pkt->edif_sa_index)); 3479 } 3480 3481 static void qla_parse_auth_els_ctl(struct srb *sp) 3482 { 3483 struct qla_els_pt_arg *a = &sp->u.bsg_cmd.u.els_arg; 3484 struct bsg_job *bsg_job = sp->u.bsg_cmd.bsg_job; 3485 struct fc_bsg_request *request = bsg_job->request; 3486 struct qla_bsg_auth_els_request *p = 3487 (struct qla_bsg_auth_els_request *)bsg_job->request; 3488 3489 a->tx_len = a->tx_byte_count = sp->remap.req.len; 3490 a->tx_addr = sp->remap.req.dma; 3491 a->rx_len = a->rx_byte_count = sp->remap.rsp.len; 3492 a->rx_addr = sp->remap.rsp.dma; 3493 3494 if (p->e.sub_cmd == SEND_ELS_REPLY) { 3495 a->control_flags = p->e.extra_control_flags << 13; 3496 a->rx_xchg_address = cpu_to_le32(p->e.extra_rx_xchg_address); 3497 if (p->e.extra_control_flags == BSG_CTL_FLAG_LS_ACC) 3498 a->els_opcode = ELS_LS_ACC; 3499 else if (p->e.extra_control_flags == BSG_CTL_FLAG_LS_RJT) 3500 a->els_opcode = ELS_LS_RJT; 3501 } 3502 a->did = sp->fcport->d_id; 3503 a->els_opcode = request->rqst_data.h_els.command_code; 3504 a->nport_handle = cpu_to_le16(sp->fcport->loop_id); 3505 a->vp_idx = sp->vha->vp_idx; 3506 } 3507 3508 int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsg_job) 3509 { 3510 struct fc_bsg_request *bsg_request = bsg_job->request; 3511 struct fc_bsg_reply *bsg_reply = bsg_job->reply; 3512 fc_port_t *fcport = NULL; 3513 struct qla_hw_data *ha = vha->hw; 3514 srb_t *sp; 3515 int rval = (DID_ERROR << 16), cnt; 3516 port_id_t d_id; 3517 struct qla_bsg_auth_els_request *p = 3518 (struct qla_bsg_auth_els_request *)bsg_job->request; 3519 struct qla_bsg_auth_els_reply *rpl = 3520 (struct qla_bsg_auth_els_reply *)bsg_job->reply; 3521 3522 rpl->version = EDIF_VERSION1; 3523 3524 d_id.b.al_pa = bsg_request->rqst_data.h_els.port_id[2]; 3525 d_id.b.area = bsg_request->rqst_data.h_els.port_id[1]; 3526 d_id.b.domain = bsg_request->rqst_data.h_els.port_id[0]; 3527 3528 /* find matching d_id in fcport list */ 3529 fcport = qla2x00_find_fcport_by_pid(vha, &d_id); 3530 if (!fcport) { 3531 ql_dbg(ql_dbg_edif, vha, 0x911a, 3532 "%s fcport not find online portid=%06x.\n", 3533 __func__, d_id.b24); 3534 SET_DID_STATUS(bsg_reply->result, DID_ERROR); 3535 return -EIO; 3536 } 3537 3538 if (qla_bsg_check(vha, bsg_job, fcport)) 3539 return 0; 3540 3541 if (EDIF_SESS_DELETE(fcport)) { 3542 ql_dbg(ql_dbg_edif, vha, 0x910d, 3543 "%s ELS code %x, no loop id.\n", __func__, 3544 bsg_request->rqst_data.r_els.els_code); 3545 SET_DID_STATUS(bsg_reply->result, DID_BAD_TARGET); 3546 return -ENXIO; 3547 } 3548 3549 if (!vha->flags.online) { 3550 ql_log(ql_log_warn, vha, 0x7005, "Host not online.\n"); 3551 SET_DID_STATUS(bsg_reply->result, DID_BAD_TARGET); 3552 rval = -EIO; 3553 goto done; 3554 } 3555 3556 /* pass through is supported only for ISP 4Gb or higher */ 3557 if (!IS_FWI2_CAPABLE(ha)) { 3558 ql_dbg(ql_dbg_user, vha, 0x7001, 3559 "ELS passthru not supported for ISP23xx based adapters.\n"); 3560 SET_DID_STATUS(bsg_reply->result, DID_BAD_TARGET); 3561 rval = -EPERM; 3562 goto done; 3563 } 3564 3565 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); 3566 if (!sp) { 3567 ql_dbg(ql_dbg_user, vha, 0x7004, 3568 "Failed get sp pid=%06x\n", fcport->d_id.b24); 3569 rval = -ENOMEM; 3570 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 3571 goto done; 3572 } 3573 3574 sp->remap.req.len = bsg_job->request_payload.payload_len; 3575 sp->remap.req.buf = dma_pool_alloc(ha->purex_dma_pool, 3576 GFP_KERNEL, &sp->remap.req.dma); 3577 if (!sp->remap.req.buf) { 3578 ql_dbg(ql_dbg_user, vha, 0x7005, 3579 "Failed allocate request dma len=%x\n", 3580 bsg_job->request_payload.payload_len); 3581 rval = -ENOMEM; 3582 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 3583 goto done_free_sp; 3584 } 3585 3586 sp->remap.rsp.len = bsg_job->reply_payload.payload_len; 3587 sp->remap.rsp.buf = dma_pool_alloc(ha->purex_dma_pool, 3588 GFP_KERNEL, &sp->remap.rsp.dma); 3589 if (!sp->remap.rsp.buf) { 3590 ql_dbg(ql_dbg_user, vha, 0x7006, 3591 "Failed allocate response dma len=%x\n", 3592 bsg_job->reply_payload.payload_len); 3593 rval = -ENOMEM; 3594 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 3595 goto done_free_remap_req; 3596 } 3597 sg_copy_to_buffer(bsg_job->request_payload.sg_list, 3598 bsg_job->request_payload.sg_cnt, sp->remap.req.buf, 3599 sp->remap.req.len); 3600 sp->remap.remapped = true; 3601 3602 sp->type = SRB_ELS_CMD_HST_NOLOGIN; 3603 sp->name = "SPCN_BSG_HST_NOLOGIN"; 3604 sp->u.bsg_cmd.bsg_job = bsg_job; 3605 qla_parse_auth_els_ctl(sp); 3606 3607 sp->free = qla2x00_bsg_sp_free; 3608 sp->done = qla2x00_bsg_job_done; 3609 3610 cnt = 0; 3611 retry: 3612 rval = qla2x00_start_sp(sp); 3613 switch (rval) { 3614 case QLA_SUCCESS: 3615 ql_dbg(ql_dbg_edif, vha, 0x700a, 3616 "%s %s %8phN xchg %x ctlflag %x hdl %x reqlen %xh bsg ptr %p\n", 3617 __func__, sc_to_str(p->e.sub_cmd), fcport->port_name, 3618 p->e.extra_rx_xchg_address, p->e.extra_control_flags, 3619 sp->handle, sp->remap.req.len, bsg_job); 3620 break; 3621 case EAGAIN: 3622 msleep(EDIF_MSLEEP_INTERVAL); 3623 cnt++; 3624 if (cnt < EDIF_RETRY_COUNT) 3625 goto retry; 3626 fallthrough; 3627 default: 3628 ql_log(ql_log_warn, vha, 0x700e, 3629 "%s qla2x00_start_sp failed = %d\n", __func__, rval); 3630 SET_DID_STATUS(bsg_reply->result, DID_IMM_RETRY); 3631 rval = -EIO; 3632 goto done_free_remap_rsp; 3633 } 3634 return rval; 3635 3636 done_free_remap_rsp: 3637 dma_pool_free(ha->purex_dma_pool, sp->remap.rsp.buf, 3638 sp->remap.rsp.dma); 3639 done_free_remap_req: 3640 dma_pool_free(ha->purex_dma_pool, sp->remap.req.buf, 3641 sp->remap.req.dma); 3642 done_free_sp: 3643 qla2x00_rel_sp(sp); 3644 3645 done: 3646 return rval; 3647 } 3648 3649 void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess) 3650 { 3651 u16 cnt = 0; 3652 3653 if (sess->edif.app_sess_online && DBELL_ACTIVE(vha)) { 3654 ql_dbg(ql_dbg_disc, vha, 0xf09c, 3655 "%s: sess %8phN send port_offline event\n", 3656 __func__, sess->port_name); 3657 sess->edif.app_sess_online = 0; 3658 sess->edif.sess_down_acked = 0; 3659 qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_SESSION_SHUTDOWN, 3660 sess->d_id.b24, 0, sess); 3661 qla2x00_post_aen_work(vha, FCH_EVT_PORT_OFFLINE, sess->d_id.b24); 3662 3663 while (!READ_ONCE(sess->edif.sess_down_acked) && 3664 !test_bit(VPORT_DELETE, &vha->dpc_flags)) { 3665 msleep(100); 3666 cnt++; 3667 if (cnt > 100) 3668 break; 3669 } 3670 sess->edif.sess_down_acked = 0; 3671 ql_dbg(ql_dbg_disc, vha, 0xf09c, 3672 "%s: sess %8phN port_offline event completed\n", 3673 __func__, sess->port_name); 3674 } 3675 } 3676 3677 void qla_edif_clear_appdata(struct scsi_qla_host *vha, struct fc_port *fcport) 3678 { 3679 if (!(fcport->flags & FCF_FCSP_DEVICE)) 3680 return; 3681 3682 qla_edb_clear(vha, fcport->d_id); 3683 qla_enode_clear(vha, fcport->d_id); 3684 } 3685