Lines Matching +full:supports +full:- +full:cqe
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2016-2018 Cavium Inc.
59 static int qedf_default_prio = -1;
82 "supports. (default 0xffffffff)");
107 "during probe (0-3: 0 more verbose).");
126 vlan_id_tmp = vlan_id | (qedf->prio << VLAN_PRIO_SHIFT); in qedf_set_vlan_id()
127 qedf->vlan_id = vlan_id_tmp; in qedf_set_vlan_id()
128 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_set_vlan_id()
130 vlan_id_tmp, qedf->prio); in qedf_set_vlan_id()
137 while (qedf->fipvlan_retries--) { in qedf_initiate_fipvlan_req()
139 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_initiate_fipvlan_req()
140 QEDF_ERR(&qedf->dbg_ctx, "Link not up.\n"); in qedf_initiate_fipvlan_req()
144 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_initiate_fipvlan_req()
145 QEDF_ERR(&qedf->dbg_ctx, "Driver unloading.\n"); in qedf_initiate_fipvlan_req()
149 if (qedf->vlan_id > 0) { in qedf_initiate_fipvlan_req()
150 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_initiate_fipvlan_req()
152 qedf->vlan_id); in qedf_initiate_fipvlan_req()
153 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) in qedf_initiate_fipvlan_req()
154 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_initiate_fipvlan_req()
158 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_initiate_fipvlan_req()
159 "Retry %d.\n", qedf->fipvlan_retries); in qedf_initiate_fipvlan_req()
160 init_completion(&qedf->fipvlan_compl); in qedf_initiate_fipvlan_req()
162 wait_for_completion_timeout(&qedf->fipvlan_compl, 1 * HZ); in qedf_initiate_fipvlan_req()
174 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Entered. link_state=%d.\n", in qedf_handle_link_update()
175 atomic_read(&qedf->link_state)); in qedf_handle_link_update()
177 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) { in qedf_handle_link_update()
182 if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) { in qedf_handle_link_update()
183 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_handle_link_update()
185 qedf->vlan_id = 0; in qedf_handle_link_update()
194 QEDF_WARN(&(qedf->dbg_ctx), "Did not receive FIP VLAN " in qedf_handle_link_update()
203 eth_zero_addr(qedf->data_src_addr); in qedf_handle_link_update()
204 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_handle_link_update()
205 } else if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_handle_link_update()
211 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_handle_link_update()
212 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_handle_link_update()
214 fcoe_ctlr_link_down(&qedf->ctlr); in qedf_handle_link_update()
216 QEDF_ERR(&qedf->dbg_ctx, in qedf_handle_link_update()
219 qedf->fipvlan_retries = qedf_fipvlan_retries; in qedf_handle_link_update()
234 granted_mac = fr_cb(fp)->granted_mac; in qedf_set_data_src_addr()
240 * If granted_mac is non-zero, we used that. in qedf_set_data_src_addr()
242 * the sel_fcf->fc_map and the d_id fo the FLOGI frame. in qedf_set_data_src_addr()
243 * If sel_fcf->fc_map is 0 then we use the default FCF-MAC plus the in qedf_set_data_src_addr()
247 ether_addr_copy(qedf->data_src_addr, granted_mac); in qedf_set_data_src_addr()
249 } else if (qedf->ctlr.sel_fcf->fc_map != 0) { in qedf_set_data_src_addr()
250 hton24(fc_map, qedf->ctlr.sel_fcf->fc_map); in qedf_set_data_src_addr()
251 qedf->data_src_addr[0] = fc_map[0]; in qedf_set_data_src_addr()
252 qedf->data_src_addr[1] = fc_map[1]; in qedf_set_data_src_addr()
253 qedf->data_src_addr[2] = fc_map[2]; in qedf_set_data_src_addr()
254 qedf->data_src_addr[3] = fh->fh_d_id[0]; in qedf_set_data_src_addr()
255 qedf->data_src_addr[4] = fh->fh_d_id[1]; in qedf_set_data_src_addr()
256 qedf->data_src_addr[5] = fh->fh_d_id[2]; in qedf_set_data_src_addr()
259 fc_fcoe_set_mac(qedf->data_src_addr, fh->fh_d_id); in qedf_set_data_src_addr()
263 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_data_src_addr()
264 "QEDF data_src_mac=%pM method=%d.\n", qedf->data_src_addr, method); in qedf_set_data_src_addr()
271 struct fc_lport *lport = exch->lp; in qedf_flogi_resp()
284 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, in qedf_flogi_resp()
291 qedf->flogi_failed++; in qedf_flogi_resp()
295 qedf->flogi_pending = 0; in qedf_flogi_resp()
299 complete(&qedf->flogi_compl); in qedf_flogi_resp()
320 qedf->flogi_cnt++; in qedf_elsct_send()
321 if (qedf->flogi_pending >= QEDF_FLOGI_RETRY_CNT) { in qedf_elsct_send()
322 schedule_delayed_work(&qedf->stag_work, 2); in qedf_elsct_send()
325 qedf->flogi_pending++; in qedf_elsct_send()
338 lport = qedf->lport; in qedf_send_flogi()
340 if (!lport->tt.elsct_send) { in qedf_send_flogi()
341 QEDF_ERR(&qedf->dbg_ctx, "tt.elsct_send not set.\n"); in qedf_send_flogi()
342 return -EINVAL; in qedf_send_flogi()
347 QEDF_ERR(&(qedf->dbg_ctx), "fc_frame_alloc failed.\n"); in qedf_send_flogi()
348 return -ENOMEM; in qedf_send_flogi()
351 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, in qedf_send_flogi()
353 lport->tt.elsct_send(lport, FC_FID_FLOGI, fp, in qedf_send_flogi()
354 ELS_FLOGI, qedf_flogi_resp, lport, lport->r_a_tov); in qedf_send_flogi()
356 init_completion(&qedf->flogi_compl); in qedf_send_flogi()
370 struct fc_lport *lport = qedf->lport; in qedf_link_recovery()
379 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_recovery()
386 qedf->ctlr.state = FIP_ST_LINK_WAIT; in qedf_link_recovery()
387 fcoe_ctlr_link_down(&qedf->ctlr); in qedf_link_recovery()
393 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_link_recovery()
396 qedf->fipvlan_retries = qedf_fipvlan_retries; in qedf_link_recovery()
407 if (qedf->ctlr.sel_fcf) { in qedf_link_recovery()
408 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_recovery()
413 retries--; in qedf_link_recovery()
417 QEDF_ERR(&(qedf->dbg_ctx), "Exhausted retries waiting for " in qedf_link_recovery()
427 i = wait_for_completion_timeout(&qedf->flogi_compl, in qedf_link_recovery()
428 qedf->lport->r_a_tov); in qedf_link_recovery()
430 QEDF_ERR(&(qedf->dbg_ctx), "FLOGI timed out.\n"); in qedf_link_recovery()
435 * Call lport->tt.rport_login which will cause libfc to send an in qedf_link_recovery()
438 mutex_lock(&lport->disc.disc_mutex); in qedf_link_recovery()
439 list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) { in qedf_link_recovery()
440 if (kref_get_unless_zero(&rdata->kref)) { in qedf_link_recovery()
442 kref_put(&rdata->kref, fc_rport_destroy); in qedf_link_recovery()
445 mutex_unlock(&lport->disc.disc_mutex); in qedf_link_recovery()
452 struct fc_lport *lport = qedf->lport; in qedf_update_link_speed()
454 lport->link_speed = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
455 lport->link_supported_speeds = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
458 switch (link->speed) { in qedf_update_link_speed()
460 lport->link_speed = FC_PORTSPEED_10GBIT; in qedf_update_link_speed()
463 lport->link_speed = FC_PORTSPEED_25GBIT; in qedf_update_link_speed()
466 lport->link_speed = FC_PORTSPEED_40GBIT; in qedf_update_link_speed()
469 lport->link_speed = FC_PORTSPEED_50GBIT; in qedf_update_link_speed()
472 lport->link_speed = FC_PORTSPEED_100GBIT; in qedf_update_link_speed()
475 lport->link_speed = FC_PORTSPEED_20GBIT; in qedf_update_link_speed()
478 lport->link_speed = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
497 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
498 lport->link_supported_speeds |= FC_PORTSPEED_10GBIT; in qedf_update_link_speed()
505 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
506 lport->link_supported_speeds |= FC_PORTSPEED_25GBIT; in qedf_update_link_speed()
514 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
515 lport->link_supported_speeds |= FC_PORTSPEED_40GBIT; in qedf_update_link_speed()
522 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
523 lport->link_supported_speeds |= FC_PORTSPEED_50GBIT; in qedf_update_link_speed()
531 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
532 lport->link_supported_speeds |= FC_PORTSPEED_100GBIT; in qedf_update_link_speed()
537 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
538 lport->link_supported_speeds |= FC_PORTSPEED_20GBIT; in qedf_update_link_speed()
540 if (lport->host && lport->host->shost_data) in qedf_update_link_speed()
541 fc_host_supported_speeds(lport->host) = in qedf_update_link_speed()
542 lport->link_supported_speeds; in qedf_update_link_speed()
551 qed_ops->common->get_link(qedf->cdev, &link); in qedf_bw_update()
553 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_bw_update()
554 QEDF_ERR(&qedf->dbg_ctx, in qedf_bw_update()
560 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) in qedf_bw_update()
563 QEDF_ERR(&qedf->dbg_ctx, in qedf_bw_update()
567 QEDF_ERR(&qedf->dbg_ctx, "link_up is not set.\n"); in qedf_bw_update()
579 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_link_update()
580 QEDF_ERR(&qedf->dbg_ctx, in qedf_link_update()
585 if (link->link_up) { in qedf_link_update()
586 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) { in qedf_link_update()
587 QEDF_INFO((&qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
591 QEDF_ERR(&(qedf->dbg_ctx), "LINK UP (%d GB/s).\n", in qedf_link_update()
592 link->speed / 1000); in qedf_link_update()
595 cancel_delayed_work(&qedf->link_update); in qedf_link_update()
597 atomic_set(&qedf->link_state, QEDF_LINK_UP); in qedf_link_update()
600 if (atomic_read(&qedf->dcbx) == QEDF_DCBX_DONE || in qedf_link_update()
602 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
604 if (atomic_read(&qedf->link_down_tmo_valid) > 0) in qedf_link_update()
605 queue_delayed_work(qedf->link_update_wq, in qedf_link_update()
606 &qedf->link_recovery, 0); in qedf_link_update()
608 queue_delayed_work(qedf->link_update_wq, in qedf_link_update()
609 &qedf->link_update, 0); in qedf_link_update()
610 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_link_update()
614 QEDF_ERR(&(qedf->dbg_ctx), "LINK DOWN.\n"); in qedf_link_update()
616 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_link_update()
617 atomic_set(&qedf->dcbx, QEDF_DCBX_PENDING); in qedf_link_update()
623 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
625 atomic_set(&qedf->link_down_tmo_valid, 1); in qedf_link_update()
627 qedf->vlan_id = 0; in qedf_link_update()
629 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_link_update()
640 QEDF_ERR(&(qedf->dbg_ctx), "DCBx event valid=%d enabled=%d fcoe " in qedf_dcbx_handler()
641 "prio=%d.\n", get->operational.valid, get->operational.enabled, in qedf_dcbx_handler()
642 get->operational.app_prio.fcoe); in qedf_dcbx_handler()
644 if (get->operational.enabled && get->operational.valid) { in qedf_dcbx_handler()
646 if (atomic_read(&qedf->dcbx) == QEDF_DCBX_DONE) { in qedf_dcbx_handler()
647 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_dcbx_handler()
652 atomic_set(&qedf->dcbx, QEDF_DCBX_DONE); in qedf_dcbx_handler()
661 tmp_prio = get->operational.app_prio.fcoe; in qedf_dcbx_handler()
662 if (qedf_default_prio > -1) in qedf_dcbx_handler()
663 qedf->prio = qedf_default_prio; in qedf_dcbx_handler()
665 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_dcbx_handler()
668 qedf->prio = QEDF_DEFAULT_PRIO; in qedf_dcbx_handler()
670 qedf->prio = tmp_prio; in qedf_dcbx_handler()
672 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP && in qedf_dcbx_handler()
674 if (atomic_read(&qedf->link_down_tmo_valid) > 0) in qedf_dcbx_handler()
675 queue_delayed_work(qedf->link_update_wq, in qedf_dcbx_handler()
676 &qedf->link_recovery, 0); in qedf_dcbx_handler()
678 queue_delayed_work(qedf->link_update_wq, in qedf_dcbx_handler()
679 &qedf->link_update, 0); in qedf_dcbx_handler()
680 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_dcbx_handler()
691 return qedf->flogi_failed; in qedf_get_login_failures()
718 struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device)); in qedf_eh_abort()
722 struct fc_rport_libfc_priv *rp = rport->dd_data; in qedf_eh_abort()
731 lport = shost_priv(sc_cmd->device->host); in qedf_eh_abort()
734 /* rport and tgt are allocated together, so tgt should be non-NULL */ in qedf_eh_abort()
736 rdata = fcport->rdata; in qedf_eh_abort()
737 if (!rdata || !kref_get_unless_zero(&rdata->kref)) { in qedf_eh_abort()
738 QEDF_ERR(&qedf->dbg_ctx, "stale rport, sc_cmd=%p\n", sc_cmd); in qedf_eh_abort()
744 io_req = qedf_priv(sc_cmd)->io_req; in qedf_eh_abort()
746 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
748 sc_cmd, sc_cmd->cmnd[0], in qedf_eh_abort()
749 rdata->ids.port_id); in qedf_eh_abort()
754 rval = kref_get_unless_zero(&io_req->refcount); /* ID: 005 */ in qedf_eh_abort()
759 if (!rval || io_req->sc_cmd != sc_cmd) { in qedf_eh_abort()
760 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
761 "Freed/Incorrect io_req, io_req->sc_cmd=%p, sc_cmd=%p, port_id=%06x, bailing out.\n", in qedf_eh_abort()
762 io_req->sc_cmd, sc_cmd, rdata->ids.port_id); in qedf_eh_abort()
768 refcount = kref_read(&io_req->refcount); in qedf_eh_abort()
769 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
771 io_req, io_req->xid, sc_cmd, sc_cmd->cmnd[0], in qedf_eh_abort()
772 refcount, rdata->ids.port_id); in qedf_eh_abort()
781 if (test_bit(QEDF_RPORT_UPLOADING_CONNECTION, &fcport->flags)) { in qedf_eh_abort()
782 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
784 io_req->xid, rdata->ids.port_id); in qedf_eh_abort()
785 while (io_req->sc_cmd && (wait_count != 0)) { in qedf_eh_abort()
787 wait_count--; in qedf_eh_abort()
790 QEDF_ERR(&qedf->dbg_ctx, "ABTS succeeded\n"); in qedf_eh_abort()
793 QEDF_ERR(&qedf->dbg_ctx, "ABTS failed\n"); in qedf_eh_abort()
799 if (lport->state != LPORT_ST_READY || !(lport->link_up)) { in qedf_eh_abort()
800 QEDF_ERR(&qedf->dbg_ctx, "link not ready.\n"); in qedf_eh_abort()
804 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
806 io_req, sc_cmd, io_req->xid, io_req->fp_idx, in qedf_eh_abort()
807 rdata->ids.port_id); in qedf_eh_abort()
809 if (qedf->stop_io_on_error) { in qedf_eh_abort()
815 init_completion(&io_req->abts_done); in qedf_eh_abort()
818 QEDF_ERR(&(qedf->dbg_ctx), "Failed to queue ABTS.\n"); in qedf_eh_abort()
828 wait_for_completion(&io_req->abts_done); in qedf_eh_abort()
830 if (io_req->event == QEDF_IOREQ_EV_ABORT_SUCCESS || in qedf_eh_abort()
831 io_req->event == QEDF_IOREQ_EV_ABORT_FAILED || in qedf_eh_abort()
832 io_req->event == QEDF_IOREQ_EV_CLEANUP_SUCCESS) { in qedf_eh_abort()
845 QEDF_ERR(&(qedf->dbg_ctx), "ABTS succeeded, xid=0x%x.\n", in qedf_eh_abort()
846 io_req->xid); in qedf_eh_abort()
848 QEDF_ERR(&(qedf->dbg_ctx), "ABTS failed, xid=0x%x.\n", in qedf_eh_abort()
849 io_req->xid); in qedf_eh_abort()
852 kref_put(&rdata->kref, fc_rport_destroy); in qedf_eh_abort()
855 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_eh_abort()
861 struct scsi_target *starget = scsi_target(sc_cmd->device); in qedf_eh_target_reset()
870 struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device)); in qedf_eh_device_reset()
873 return qedf_initiate_tmf(rport, sc_cmd->device->lun, FCP_TMF_LUN_RESET); in qedf_eh_device_reset()
881 while (wait_cnt--) { in qedf_wait_for_upload()
882 if (atomic_read(&qedf->num_offloads)) in qedf_wait_for_upload()
883 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_wait_for_upload()
885 atomic_read(&qedf->num_offloads)); in qedf_wait_for_upload()
892 list_for_each_entry_rcu(fcport, &qedf->fcports, peers) { in qedf_wait_for_upload()
894 &fcport->flags)) { in qedf_wait_for_upload()
895 if (fcport->rdata) in qedf_wait_for_upload()
896 QEDF_ERR(&qedf->dbg_ctx, in qedf_wait_for_upload()
898 fcport, fcport->rdata->ids.port_id); in qedf_wait_for_upload()
900 QEDF_ERR(&qedf->dbg_ctx, in qedf_wait_for_upload()
915 if (lport->vport) { in qedf_ctx_soft_reset()
922 qedf->flogi_pending = 0; in qedf_ctx_soft_reset()
924 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_ctx_soft_reset()
925 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
927 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_ctx_soft_reset()
931 QEDF_ERR(&qedf->dbg_ctx, "Could not upload all sessions.\n"); in qedf_ctx_soft_reset()
932 WARN_ON(atomic_read(&qedf->num_offloads)); in qedf_ctx_soft_reset()
936 qed_ops->common->get_link(qedf->cdev, &if_link); in qedf_ctx_soft_reset()
939 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
944 flush_delayed_work(&qedf->link_update); in qedf_ctx_soft_reset()
947 atomic_set(&qedf->link_state, QEDF_LINK_UP); in qedf_ctx_soft_reset()
948 qedf->vlan_id = 0; in qedf_ctx_soft_reset()
949 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
951 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_ctx_soft_reset()
961 lport = shost_priv(sc_cmd->device->host); in qedf_eh_host_reset()
964 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN || in qedf_eh_host_reset()
965 test_bit(QEDF_UNLOADING, &qedf->flags)) in qedf_eh_host_reset()
968 QEDF_ERR(&(qedf->dbg_ctx), "HOST RESET Issued..."); in qedf_eh_host_reset()
987 .this_id = -1,
1021 list_for_each_entry_rcu(fcport, &qedf->fcports, peers) { in qedf_fcport_lookup()
1022 rdata = fcport->rdata; in qedf_fcport_lookup()
1025 if (rdata->ids.port_id == port_id) { in qedf_fcport_lookup()
1043 if ((fh->fh_type == FC_TYPE_ELS) && in qedf_xmit_l2_frame()
1044 (fh->fh_r_ctl == FC_RCTL_ELS_REQ)) { in qedf_xmit_l2_frame()
1057 * qedf_xmit - qedf FCoE frame transmit function
1084 if (lport->vport) in qedf_xmit()
1085 base_lport = shost_priv(vport_to_shost(lport->vport)); in qedf_xmit()
1090 if (base_lport->port_id == ntoh24(fh->fh_d_id)) { in qedf_xmit()
1096 list_for_each_entry(tmp_lport, &base_lport->vports, list) { in qedf_xmit()
1097 if (tmp_lport->port_id == ntoh24(fh->fh_d_id)) { in qedf_xmit()
1103 if (vn_port && ntoh24(fh->fh_d_id) != FC_FID_FLOGI) { in qedf_xmit()
1106 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_xmit()
1107 "Dropping FCoE frame to %06x.\n", ntoh24(fh->fh_d_id)); in qedf_xmit()
1109 rdata = fc_rport_lookup(lport, ntoh24(fh->fh_d_id)); in qedf_xmit()
1111 rdata->retries = lport->max_rport_retry_count; in qedf_xmit()
1112 kref_put(&rdata->kref, fc_rport_destroy); in qedf_xmit()
1114 return -EINVAL; in qedf_xmit()
1118 if (!qedf->ctlr.sel_fcf) { in qedf_xmit()
1123 if (!test_bit(QEDF_LL2_STARTED, &qedf->flags)) { in qedf_xmit()
1124 QEDF_WARN(&(qedf->dbg_ctx), "LL2 not started\n"); in qedf_xmit()
1129 if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) { in qedf_xmit()
1130 QEDF_WARN(&(qedf->dbg_ctx), "qedf link down\n"); in qedf_xmit()
1135 if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ)) { in qedf_xmit()
1136 if (fcoe_ctlr_els_send(&qedf->ctlr, lport, skb)) in qedf_xmit()
1141 fcport = qedf_fcport_lookup(qedf, ntoh24(fh->fh_d_id)); in qedf_xmit()
1143 if (fcport && test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_xmit()
1159 wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE; in qedf_xmit()
1161 skb->ip_summed = CHECKSUM_NONE; in qedf_xmit()
1170 return -ENOMEM; in qedf_xmit()
1172 frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; in qedf_xmit()
1179 cp->fcoe_eof = eof; in qedf_xmit()
1180 cp->fcoe_crc32 = cpu_to_le32(~crc); in qedf_xmit()
1191 skb->mac_len = elen; in qedf_xmit()
1192 skb->protocol = htons(ETH_P_FCOE); in qedf_xmit()
1195 * Add VLAN tag to non-offload FCoE frame based on current stored VLAN in qedf_xmit()
1198 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), qedf->vlan_id); in qedf_xmit()
1202 eh->h_proto = htons(ETH_P_FCOE); in qedf_xmit()
1203 if (qedf->ctlr.map_dest) in qedf_xmit()
1204 fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id); in qedf_xmit()
1207 ether_addr_copy(eh->h_dest, qedf->ctlr.dest_addr); in qedf_xmit()
1210 ether_addr_copy(eh->h_source, qedf->data_src_addr); in qedf_xmit()
1216 hp->fcoe_sof = sof; in qedf_xmit()
1219 this_cpu_inc(lport->stats->TxFrames); in qedf_xmit()
1220 this_cpu_add(lport->stats->TxWords, wlen); in qedf_xmit()
1227 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FCoE frame send: " in qedf_xmit()
1229 ntoh24(fh->fh_s_id), ntoh24(fh->fh_d_id), fh->fh_r_ctl, fh->fh_type, in qedf_xmit()
1233 1, skb->data, skb->len, false); in qedf_xmit()
1234 rc = qed_ops->ll2->start_xmit(qedf->cdev, skb, 0); in qedf_xmit()
1236 QEDF_ERR(&qedf->dbg_ctx, "start_xmit failed rc = %d.\n", rc); in qedf_xmit()
1252 fcport->sq_mem_size = SQ_NUM_ENTRIES * sizeof(struct fcoe_wqe); in qedf_alloc_sq()
1253 fcport->sq_mem_size = ALIGN(fcport->sq_mem_size, QEDF_PAGE_SIZE); in qedf_alloc_sq()
1254 fcport->sq_pbl_size = (fcport->sq_mem_size / QEDF_PAGE_SIZE) * in qedf_alloc_sq()
1256 fcport->sq_pbl_size = fcport->sq_pbl_size + QEDF_PAGE_SIZE; in qedf_alloc_sq()
1258 fcport->sq = dma_alloc_coherent(&qedf->pdev->dev, fcport->sq_mem_size, in qedf_alloc_sq()
1259 &fcport->sq_dma, GFP_KERNEL); in qedf_alloc_sq()
1260 if (!fcport->sq) { in qedf_alloc_sq()
1261 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate send queue.\n"); in qedf_alloc_sq()
1266 fcport->sq_pbl = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_sq()
1267 fcport->sq_pbl_size, in qedf_alloc_sq()
1268 &fcport->sq_pbl_dma, GFP_KERNEL); in qedf_alloc_sq()
1269 if (!fcport->sq_pbl) { in qedf_alloc_sq()
1270 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate send queue PBL.\n"); in qedf_alloc_sq()
1276 num_pages = fcport->sq_mem_size / QEDF_PAGE_SIZE; in qedf_alloc_sq()
1277 page = fcport->sq_dma; in qedf_alloc_sq()
1278 pbl = (u32 *)fcport->sq_pbl; in qedf_alloc_sq()
1280 while (num_pages--) { in qedf_alloc_sq()
1291 dma_free_coherent(&qedf->pdev->dev, fcport->sq_mem_size, fcport->sq, in qedf_alloc_sq()
1292 fcport->sq_dma); in qedf_alloc_sq()
1299 if (fcport->sq_pbl) in qedf_free_sq()
1300 dma_free_coherent(&qedf->pdev->dev, fcport->sq_pbl_size, in qedf_free_sq()
1301 fcport->sq_pbl, fcport->sq_pbl_dma); in qedf_free_sq()
1302 if (fcport->sq) in qedf_free_sq()
1303 dma_free_coherent(&qedf->pdev->dev, fcport->sq_mem_size, in qedf_free_sq()
1304 fcport->sq, fcport->sq_dma); in qedf_free_sq()
1313 uint16_t total_sqe = (fcport->sq_mem_size / sizeof(struct fcoe_wqe)); in qedf_offload_connection()
1315 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Offloading connection " in qedf_offload_connection()
1316 "portid=%06x.\n", fcport->rdata->ids.port_id); in qedf_offload_connection()
1317 rval = qed_ops->acquire_conn(qedf->cdev, &fcport->handle, in qedf_offload_connection()
1318 &fcport->fw_cid, &fcport->p_doorbell); in qedf_offload_connection()
1320 QEDF_WARN(&(qedf->dbg_ctx), "Could not acquire connection " in qedf_offload_connection()
1321 "for portid=%06x.\n", fcport->rdata->ids.port_id); in qedf_offload_connection()
1326 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "portid=%06x " in qedf_offload_connection()
1327 "fw_cid=%08x handle=%d.\n", fcport->rdata->ids.port_id, in qedf_offload_connection()
1328 fcport->fw_cid, fcport->handle); in qedf_offload_connection()
1333 conn_info.sq_pbl_addr = fcport->sq_pbl_dma; in qedf_offload_connection()
1335 conn_info.sq_curr_page_addr = (dma_addr_t)(*(u64 *)fcport->sq_pbl); in qedf_offload_connection()
1337 (dma_addr_t)(*(u64 *)(fcport->sq_pbl + 8)); in qedf_offload_connection()
1340 ether_addr_copy(conn_info.src_mac, qedf->data_src_addr); in qedf_offload_connection()
1342 ether_addr_copy(conn_info.dst_mac, qedf->ctlr.dest_addr); in qedf_offload_connection()
1344 conn_info.tx_max_fc_pay_len = fcport->rdata->maxframe_size; in qedf_offload_connection()
1345 conn_info.e_d_tov_timer_val = qedf->lport->e_d_tov; in qedf_offload_connection()
1347 conn_info.rx_max_fc_pay_len = fcport->rdata->maxframe_size; in qedf_offload_connection()
1350 conn_info.vlan_tag = qedf->vlan_id << in qedf_offload_connection()
1353 qedf->prio << FCOE_CONN_OFFLOAD_RAMROD_DATA_PRIORITY_SHIFT; in qedf_offload_connection()
1358 port_id = fc_host_port_id(qedf->lport->host); in qedf_offload_connection()
1359 fcport->sid = port_id; in qedf_offload_connection()
1364 conn_info.max_conc_seqs_c3 = fcport->rdata->max_seq; in qedf_offload_connection()
1367 port_id = fcport->rdata->rport->port_id; in qedf_offload_connection()
1374 /* Set FC-TAPE specific flags if needed */ in qedf_offload_connection()
1375 if (fcport->dev_type == QEDF_RPORT_TYPE_TAPE) { in qedf_offload_connection()
1376 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, in qedf_offload_connection()
1378 fcport->rdata->ids.port_id); in qedf_offload_connection()
1382 ((fcport->rdata->sp_features & FC_SP_FT_SEQC) ? 1 : 0) << in qedf_offload_connection()
1386 rval = qed_ops->offload_conn(qedf->cdev, fcport->handle, &conn_info); in qedf_offload_connection()
1388 QEDF_WARN(&(qedf->dbg_ctx), "Could not offload connection " in qedf_offload_connection()
1389 "for portid=%06x.\n", fcport->rdata->ids.port_id); in qedf_offload_connection()
1392 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Offload " in qedf_offload_connection()
1394 fcport->rdata->ids.port_id, total_sqe); in qedf_offload_connection()
1396 spin_lock_init(&fcport->rport_lock); in qedf_offload_connection()
1397 atomic_set(&fcport->free_sqes, total_sqe); in qedf_offload_connection()
1400 qed_ops->release_conn(qedf->cdev, fcport->handle); in qedf_offload_connection()
1416 term_params = dma_alloc_coherent(&qedf->pdev->dev, QEDF_TERM_BUFF_SIZE, in qedf_upload_connection()
1421 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Uploading connection " in qedf_upload_connection()
1422 "port_id=%06x.\n", fcport->rdata->ids.port_id); in qedf_upload_connection()
1424 qed_ops->destroy_conn(qedf->cdev, fcport->handle, term_params_dma); in qedf_upload_connection()
1425 qed_ops->release_conn(qedf->cdev, fcport->handle); in qedf_upload_connection()
1427 dma_free_coherent(&qedf->pdev->dev, QEDF_TERM_BUFF_SIZE, term_params, in qedf_upload_connection()
1434 struct fc_rport_priv *rdata = fcport->rdata; in qedf_cleanup_fcport()
1436 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Cleaning up portid=%06x.\n", in qedf_cleanup_fcport()
1437 fcport->rdata->ids.port_id); in qedf_cleanup_fcport()
1440 qedf_flush_active_ios(fcport, -1); in qedf_cleanup_fcport()
1442 if (test_and_clear_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) in qedf_cleanup_fcport()
1445 fcport->rdata = NULL; in qedf_cleanup_fcport()
1446 fcport->qedf = NULL; in qedf_cleanup_fcport()
1447 kref_put(&rdata->kref, fc_rport_destroy); in qedf_cleanup_fcport()
1460 struct fc_rport *rport = rdata->rport; in qedf_rport_event_handler()
1467 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "event = %d, " in qedf_rport_event_handler()
1468 "port_id = 0x%x\n", event, rdata->ids.port_id); in qedf_rport_event_handler()
1473 QEDF_WARN(&(qedf->dbg_ctx), "rport is NULL.\n"); in qedf_rport_event_handler()
1477 rp = rport->dd_data; in qedf_rport_event_handler()
1479 fcport->qedf = qedf; in qedf_rport_event_handler()
1481 if (atomic_read(&qedf->num_offloads) >= QEDF_MAX_SESSIONS) { in qedf_rport_event_handler()
1482 QEDF_ERR(&(qedf->dbg_ctx), "Not offloading " in qedf_rport_event_handler()
1484 "reached.\n", rdata->ids.port_id); in qedf_rport_event_handler()
1492 if (test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_rport_event_handler()
1493 QEDF_WARN(&(qedf->dbg_ctx), "Session already " in qedf_rport_event_handler()
1495 rdata->ids.port_id); in qedf_rport_event_handler()
1499 if (rport->port_id == FC_FID_DIR_SERV) { in qedf_rport_event_handler()
1506 QEDF_WARN(&(qedf->dbg_ctx), "rport struct does not " in qedf_rport_event_handler()
1508 rdata->ids.port_id); in qedf_rport_event_handler()
1512 if (rdata->spp_type != FC_TYPE_FCP) { in qedf_rport_event_handler()
1513 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1517 if (!(rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET)) { in qedf_rport_event_handler()
1518 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1524 kref_get(&rdata->kref); in qedf_rport_event_handler()
1525 fcport->rdata = rdata; in qedf_rport_event_handler()
1526 fcport->rport = rport; in qedf_rport_event_handler()
1535 if (rdata->flags & FC_RP_FLAGS_RETRY && in qedf_rport_event_handler()
1536 rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET && in qedf_rport_event_handler()
1537 !(rdata->ids.roles & FC_RPORT_ROLE_FCP_INITIATOR)) { in qedf_rport_event_handler()
1538 fcport->dev_type = QEDF_RPORT_TYPE_TAPE; in qedf_rport_event_handler()
1539 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1541 rdata->ids.port_id); in qedf_rport_event_handler()
1543 fcport->dev_type = QEDF_RPORT_TYPE_DISK; in qedf_rport_event_handler()
1553 spin_lock_irqsave(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1554 list_add_rcu(&fcport->peers, &qedf->fcports); in qedf_rport_event_handler()
1555 spin_unlock_irqrestore(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1561 set_bit(QEDF_RPORT_SESSION_READY, &fcport->flags); in qedf_rport_event_handler()
1562 atomic_inc(&qedf->num_offloads); in qedf_rport_event_handler()
1568 port_id = rdata->ids.port_id; in qedf_rport_event_handler()
1572 if (rdata->spp_type != FC_TYPE_FCP) { in qedf_rport_event_handler()
1573 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1577 if (!(rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET)) { in qedf_rport_event_handler()
1578 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1584 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1585 "port_id=%x - rport notcreated Yet!!\n", port_id); in qedf_rport_event_handler()
1588 rp = rport->dd_data; in qedf_rport_event_handler()
1590 * Perform session upload. Note that rdata->peers is already in qedf_rport_event_handler()
1591 * removed from disc->rports list before we get this event. in qedf_rport_event_handler()
1595 spin_lock_irqsave(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1597 if (test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags) && in qedf_rport_event_handler()
1599 &fcport->flags)) { in qedf_rport_event_handler()
1601 &fcport->flags); in qedf_rport_event_handler()
1602 spin_unlock_irqrestore(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1608 spin_lock_irqsave(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1609 list_del_rcu(&fcport->peers); in qedf_rport_event_handler()
1610 spin_unlock_irqrestore(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1613 &fcport->flags); in qedf_rport_event_handler()
1614 atomic_dec(&qedf->num_offloads); in qedf_rport_event_handler()
1616 spin_unlock_irqrestore(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1627 /* NO-OP but need to fill in the template */ in qedf_abort_io()
1633 * NO-OP but need to fill in template to prevent a NULL in qedf_fcp_cleanup()
1649 fcoe_ctlr_init(&qedf->ctlr, FIP_MODE_AUTO); in qedf_fcoe_ctlr_setup()
1651 qedf->ctlr.send = qedf_fip_send; in qedf_fcoe_ctlr_setup()
1652 qedf->ctlr.get_src_addr = qedf_get_src_mac; in qedf_fcoe_ctlr_setup()
1653 ether_addr_copy(qedf->ctlr.ctl_src_addr, qedf->mac); in qedf_fcoe_ctlr_setup()
1658 struct fc_lport *lport = qedf->lport; in qedf_setup_fdmi()
1667 lport->fdmi_enabled = 1; in qedf_setup_fdmi()
1674 /* Get the PCI-e Device Serial Number Capability */ in qedf_setup_fdmi()
1675 pos = pci_find_ext_capability(qedf->pdev, PCI_EXT_CAP_ID_DSN); in qedf_setup_fdmi()
1679 pci_read_config_byte(qedf->pdev, pos + i, &buf[i]); in qedf_setup_fdmi()
1681 snprintf(fc_host_serial_number(lport->host), in qedf_setup_fdmi()
1687 snprintf(fc_host_serial_number(lport->host), in qedf_setup_fdmi()
1690 snprintf(fc_host_manufacturer(lport->host), in qedf_setup_fdmi()
1693 if (qedf->pdev->device == QL45xxx) { in qedf_setup_fdmi()
1694 snprintf(fc_host_model(lport->host), in qedf_setup_fdmi()
1697 snprintf(fc_host_model_description(lport->host), in qedf_setup_fdmi()
1702 if (qedf->pdev->device == QL41xxx) { in qedf_setup_fdmi()
1703 snprintf(fc_host_model(lport->host), in qedf_setup_fdmi()
1706 snprintf(fc_host_model_description(lport->host), in qedf_setup_fdmi()
1711 snprintf(fc_host_hardware_version(lport->host), in qedf_setup_fdmi()
1712 FC_VERSION_STRING_SIZE, "Rev %d", qedf->pdev->revision); in qedf_setup_fdmi()
1714 snprintf(fc_host_driver_version(lport->host), in qedf_setup_fdmi()
1717 snprintf(fc_host_firmware_version(lport->host), in qedf_setup_fdmi()
1722 snprintf(fc_host_vendor_identifier(lport->host), in qedf_setup_fdmi()
1729 struct fc_lport *lport = qedf->lport; in qedf_lport_setup()
1731 lport->link_up = 0; in qedf_lport_setup()
1732 lport->max_retry_count = QEDF_FLOGI_RETRY_CNT; in qedf_lport_setup()
1733 lport->max_rport_retry_count = QEDF_RPORT_RETRY_CNT; in qedf_lport_setup()
1734 lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS | in qedf_lport_setup()
1736 lport->boot_time = jiffies; in qedf_lport_setup()
1737 lport->e_d_tov = 2 * 1000; in qedf_lport_setup()
1738 lport->r_a_tov = 10 * 1000; in qedf_lport_setup()
1741 lport->does_npiv = 1; in qedf_lport_setup()
1742 fc_host_max_npiv_vports(lport->host) = QEDF_MAX_NPIV; in qedf_lport_setup()
1744 fc_set_wwnn(lport, qedf->wwnn); in qedf_lport_setup()
1745 fc_set_wwpn(lport, qedf->wwpn); in qedf_lport_setup()
1747 if (fcoe_libfc_config(lport, &qedf->ctlr, &qedf_lport_template, 0)) { in qedf_lport_setup()
1748 QEDF_ERR(&qedf->dbg_ctx, in qedf_lport_setup()
1750 return -ENOMEM; in qedf_lport_setup()
1758 return -ENOMEM; in qedf_lport_setup()
1765 fc_host_maxframe_size(lport->host) = lport->mfs; in qedf_lport_setup()
1768 fc_host_dev_loss_tmo(lport->host) = qedf_dev_loss_tmo; in qedf_lport_setup()
1771 if (qedf->pdev->device == QL45xxx) in qedf_lport_setup()
1772 snprintf(fc_host_symbolic_name(lport->host), 256, in qedf_lport_setup()
1775 if (qedf->pdev->device == QL41xxx) in qedf_lport_setup()
1776 snprintf(fc_host_symbolic_name(lport->host), 256, in qedf_lport_setup()
1791 lport->link_up = 0; in qedf_vport_libfc_config()
1792 lport->qfull = 0; in qedf_vport_libfc_config()
1793 lport->max_retry_count = QEDF_FLOGI_RETRY_CNT; in qedf_vport_libfc_config()
1794 lport->max_rport_retry_count = QEDF_RPORT_RETRY_CNT; in qedf_vport_libfc_config()
1795 lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS | in qedf_vport_libfc_config()
1797 lport->boot_time = jiffies; in qedf_vport_libfc_config()
1798 lport->e_d_tov = 2 * 1000; in qedf_vport_libfc_config()
1799 lport->r_a_tov = 10 * 1000; in qedf_vport_libfc_config()
1800 lport->does_npiv = 1; /* Temporary until we add NPIV support */ in qedf_vport_libfc_config()
1804 return -ENOMEM; in qedf_vport_libfc_config()
1810 lport->crc_offload = 0; in qedf_vport_libfc_config()
1811 lport->seq_offload = 0; in qedf_vport_libfc_config()
1812 lport->lro_enabled = 0; in qedf_vport_libfc_config()
1813 lport->lro_xid = 0; in qedf_vport_libfc_config()
1814 lport->lso_max = 0; in qedf_vport_libfc_config()
1832 fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf)); in qedf_vport_create()
1833 QEDF_WARN(&(base_qedf->dbg_ctx), "Failed to create vport, " in qedf_vport_create()
1838 if (atomic_read(&base_qedf->link_state) != QEDF_LINK_UP) { in qedf_vport_create()
1839 QEDF_WARN(&(base_qedf->dbg_ctx), "Cannot create vport " in qedf_vport_create()
1841 return -EIO; in qedf_vport_create()
1846 QEDF_WARN(&(base_qedf->dbg_ctx), "Could not create lport " in qedf_vport_create()
1848 return -ENOMEM; in qedf_vport_create()
1851 fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf)); in qedf_vport_create()
1852 QEDF_ERR(&(base_qedf->dbg_ctx), "Creating NPIV port, WWPN=%s.\n", in qedf_vport_create()
1860 vport_qedf->lport = vn_port; in qedf_vport_create()
1862 vport_qedf->hba_lock = base_qedf->hba_lock; in qedf_vport_create()
1863 vport_qedf->pdev = base_qedf->pdev; in qedf_vport_create()
1864 vport_qedf->cmd_mgr = base_qedf->cmd_mgr; in qedf_vport_create()
1865 init_completion(&vport_qedf->flogi_compl); in qedf_vport_create()
1866 INIT_LIST_HEAD(&vport_qedf->fcports); in qedf_vport_create()
1867 INIT_DELAYED_WORK(&vport_qedf->stag_work, qedf_stag_change_work); in qedf_vport_create()
1871 QEDF_ERR(&(base_qedf->dbg_ctx), "Could not allocate memory " in qedf_vport_create()
1876 fc_set_wwnn(vn_port, vport->node_name); in qedf_vport_create()
1877 fc_set_wwpn(vn_port, vport->port_name); in qedf_vport_create()
1878 vport_qedf->wwnn = vn_port->wwnn; in qedf_vport_create()
1879 vport_qedf->wwpn = vn_port->wwpn; in qedf_vport_create()
1881 vn_port->host->transportt = qedf_fc_vport_transport_template; in qedf_vport_create()
1882 vn_port->host->can_queue = FCOE_PARAMS_NUM_TASKS; in qedf_vport_create()
1883 vn_port->host->max_lun = qedf_max_lun; in qedf_vport_create()
1884 vn_port->host->sg_tablesize = QEDF_MAX_BDS_PER_CMD; in qedf_vport_create()
1885 vn_port->host->max_cmd_len = QEDF_MAX_CDB_LEN; in qedf_vport_create()
1886 vn_port->host->max_id = QEDF_MAX_SESSIONS; in qedf_vport_create()
1888 rc = scsi_add_host(vn_port->host, &vport->dev); in qedf_vport_create()
1890 QEDF_WARN(&base_qedf->dbg_ctx, in qedf_vport_create()
1896 fc_host_dev_loss_tmo(vn_port->host) = qedf_dev_loss_tmo; in qedf_vport_create()
1899 memcpy(&vn_port->tt, &qedf_lport_template, in qedf_vport_create()
1916 fc_host_port_type(vn_port->host) = FC_PORTTYPE_UNKNOWN; in qedf_vport_create()
1921 vn_port->boot_time = jiffies; in qedf_vport_create()
1927 if (base_qedf->pdev->device == QL45xxx) in qedf_vport_create()
1928 snprintf(fc_host_symbolic_name(vn_port->host), 256, in qedf_vport_create()
1931 if (base_qedf->pdev->device == QL41xxx) in qedf_vport_create()
1932 snprintf(fc_host_symbolic_name(vn_port->host), 256, in qedf_vport_create()
1936 fc_host_supported_speeds(vn_port->host) = n_port->link_supported_speeds; in qedf_vport_create()
1939 vn_port->link_speed = n_port->link_speed; in qedf_vport_create()
1942 fc_host_port_type(vn_port->host) = FC_PORTTYPE_NPIV; in qedf_vport_create()
1945 fc_host_maxframe_size(vn_port->host) = n_port->mfs; in qedf_vport_create()
1947 QEDF_INFO(&(base_qedf->dbg_ctx), QEDF_LOG_NPIV, "vn_port=%p.\n", in qedf_vport_create()
1951 vport_qedf->dbg_ctx.host_no = vn_port->host->host_no; in qedf_vport_create()
1952 vport_qedf->dbg_ctx.pdev = base_qedf->pdev; in qedf_vport_create()
1957 scsi_host_put(vn_port->host); in qedf_vport_create()
1965 struct fc_lport *vn_port = vport->dd_data; in qedf_vport_destroy()
1974 set_bit(QEDF_UNLOADING, &qedf->flags); in qedf_vport_destroy()
1976 mutex_lock(&n_port->lp_mutex); in qedf_vport_destroy()
1977 list_del(&vn_port->list); in qedf_vport_destroy()
1978 mutex_unlock(&n_port->lp_mutex); in qedf_vport_destroy()
1983 /* Detach from scsi-ml */ in qedf_vport_destroy()
1984 fc_remove_host(vn_port->host); in qedf_vport_destroy()
1985 scsi_remove_host(vn_port->host); in qedf_vport_destroy()
1991 if (vn_port->state == LPORT_ST_READY) in qedf_vport_destroy()
1998 scsi_host_put(vn_port->host); in qedf_vport_destroy()
2006 struct fc_lport *lport = vport->dd_data; in qedf_vport_disable()
2012 lport->boot_time = jiffies; in qedf_vport_disable()
2027 struct fc_host_attrs *fc_host = shost_to_fc_host(qedf->lport->host); in qedf_wait_for_vport_destroy()
2029 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_NPIV, in qedf_wait_for_vport_destroy()
2031 while (fc_host->npiv_vports_inuse > 0) { in qedf_wait_for_vport_destroy()
2032 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_NPIV, in qedf_wait_for_vport_destroy()
2039 * qedf_fcoe_reset - Resets the fcoe
2057 fc_host_port_id(shost) = lport->port_id; in qedf_get_host_port_id()
2071 if (lport->vport) in qedf_fc_get_host_stats()
2076 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate memory for " in qedf_fc_get_host_stats()
2081 mutex_lock(&qedf->stats_mutex); in qedf_fc_get_host_stats()
2084 qed_ops->get_stats(qedf->cdev, fw_fcoe_stats); in qedf_fc_get_host_stats()
2092 qedf_stats->tx_frames += fw_fcoe_stats->fcoe_tx_data_pkt_cnt + in qedf_fc_get_host_stats()
2093 fw_fcoe_stats->fcoe_tx_xfer_pkt_cnt + in qedf_fc_get_host_stats()
2094 fw_fcoe_stats->fcoe_tx_other_pkt_cnt; in qedf_fc_get_host_stats()
2095 qedf_stats->rx_frames += fw_fcoe_stats->fcoe_rx_data_pkt_cnt + in qedf_fc_get_host_stats()
2096 fw_fcoe_stats->fcoe_rx_xfer_pkt_cnt + in qedf_fc_get_host_stats()
2097 fw_fcoe_stats->fcoe_rx_other_pkt_cnt; in qedf_fc_get_host_stats()
2098 qedf_stats->fcp_input_megabytes += in qedf_fc_get_host_stats()
2099 do_div(fw_fcoe_stats->fcoe_rx_byte_cnt, 1000000); in qedf_fc_get_host_stats()
2100 qedf_stats->fcp_output_megabytes += in qedf_fc_get_host_stats()
2101 do_div(fw_fcoe_stats->fcoe_tx_byte_cnt, 1000000); in qedf_fc_get_host_stats()
2102 qedf_stats->rx_words += fw_fcoe_stats->fcoe_rx_byte_cnt / 4; in qedf_fc_get_host_stats()
2103 qedf_stats->tx_words += fw_fcoe_stats->fcoe_tx_byte_cnt / 4; in qedf_fc_get_host_stats()
2104 qedf_stats->invalid_crc_count += in qedf_fc_get_host_stats()
2105 fw_fcoe_stats->fcoe_silent_drop_pkt_crc_error_cnt; in qedf_fc_get_host_stats()
2106 qedf_stats->dumped_frames = in qedf_fc_get_host_stats()
2107 fw_fcoe_stats->fcoe_silent_drop_total_pkt_cnt; in qedf_fc_get_host_stats()
2108 qedf_stats->error_frames += in qedf_fc_get_host_stats()
2109 fw_fcoe_stats->fcoe_silent_drop_total_pkt_cnt; in qedf_fc_get_host_stats()
2110 qedf_stats->fcp_input_requests += qedf->input_requests; in qedf_fc_get_host_stats()
2111 qedf_stats->fcp_output_requests += qedf->output_requests; in qedf_fc_get_host_stats()
2112 qedf_stats->fcp_control_requests += qedf->control_requests; in qedf_fc_get_host_stats()
2113 qedf_stats->fcp_packet_aborts += qedf->packet_aborts; in qedf_fc_get_host_stats()
2114 qedf_stats->fcp_frame_alloc_failures += qedf->alloc_failures; in qedf_fc_get_host_stats()
2116 mutex_unlock(&qedf->stats_mutex); in qedf_fc_get_host_stats()
2194 struct qedf_ctx *qedf = fp->qedf; in qedf_fp_has_work()
2196 struct qed_sb_info *sb_info = fp->sb_info; in qedf_fp_has_work()
2197 struct status_block *sb = sb_info->sb_virt; in qedf_fp_has_work()
2201 que = qedf->global_queues[fp->sb_id]; in qedf_fp_has_work()
2207 prod_idx = sb->pi_array[QEDF_FCOE_PARAMS_GL_RQ_PI]; in qedf_fp_has_work()
2209 return (que->cq_prod_idx != prod_idx); in qedf_fp_has_work()
2216 /* Process completion queue and copy CQE contents for deferred processesing
2222 struct qedf_ctx *qedf = fp->qedf; in qedf_process_completions()
2223 struct qed_sb_info *sb_info = fp->sb_info; in qedf_process_completions()
2224 struct status_block *sb = sb_info->sb_virt; in qedf_process_completions()
2227 struct fcoe_cqe *cqe; in qedf_process_completions() local
2236 prod_idx = sb->pi_array[QEDF_FCOE_PARAMS_GL_RQ_PI]; in qedf_process_completions()
2239 que = qedf->global_queues[fp->sb_id]; in qedf_process_completions()
2242 new_cqes = (prod_idx >= que->cq_prod_idx) ? in qedf_process_completions()
2243 (prod_idx - que->cq_prod_idx) : in qedf_process_completions()
2244 0x10000 - que->cq_prod_idx + prod_idx; in qedf_process_completions()
2247 que->cq_prod_idx = prod_idx; in qedf_process_completions()
2250 fp->completions++; in qedf_process_completions()
2251 cqe = &que->cq[que->cq_cons_idx]; in qedf_process_completions()
2253 comp_type = (cqe->cqe_data >> FCOE_CQE_CQE_TYPE_SHIFT) & in qedf_process_completions()
2261 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_UNSOL, in qedf_process_completions()
2262 "Unsolicated CQE.\n"); in qedf_process_completions()
2263 qedf_process_unsol_compl(qedf, fp->sb_id, cqe); in qedf_process_completions()
2271 xid = cqe->cqe_data & FCOE_CQE_TASK_ID_MASK; in qedf_process_completions()
2272 io_req = &qedf->cmd_mgr->cmds[xid]; in qedf_process_completions()
2279 /* If there is not io_req assocated with this CQE in qedf_process_completions()
2284 cpu = io_req->cpu; in qedf_process_completions()
2285 io_req->int_cpu = smp_processor_id(); in qedf_process_completions()
2288 io_work = mempool_alloc(qedf->io_mempool, GFP_ATOMIC); in qedf_process_completions()
2290 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate " in qedf_process_completions()
2296 INIT_WORK(&io_work->work, qedf_fp_io_handler); in qedf_process_completions()
2298 /* Copy contents of CQE for deferred processing */ in qedf_process_completions()
2299 memcpy(&io_work->cqe, cqe, sizeof(struct fcoe_cqe)); in qedf_process_completions()
2301 io_work->qedf = fp->qedf; in qedf_process_completions()
2302 io_work->fp = NULL; /* Only used for unsolicited frames */ in qedf_process_completions()
2304 queue_work_on(cpu, qedf_io_wq, &io_work->work); in qedf_process_completions()
2307 que->cq_cons_idx++; in qedf_process_completions()
2308 if (que->cq_cons_idx == fp->cq_num_entries) in qedf_process_completions()
2309 que->cq_cons_idx = 0; in qedf_process_completions()
2310 new_cqes--; in qedf_process_completions()
2317 /* MSI-X fastpath handler code */
2326 if (!fp->sb_info) { in qedf_msix_handler()
2327 QEDF_ERR(NULL, "fp->sb_info in null."); in qedf_msix_handler()
2335 qed_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0 /*do not update*/); in qedf_msix_handler()
2342 qed_sb_update_sb_idx(fp->sb_info); in qedf_msix_handler()
2348 /* Re-enable interrupts */ in qedf_msix_handler()
2349 qed_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1); in qedf_msix_handler()
2365 QEDF_WARN(&(qedf->dbg_ctx), "qedf=%p.\n", qedf); in qedf_simd_int_handler()
2375 if (qedf->int_info.msix_cnt) { in qedf_sync_free_irqs()
2376 for (i = 0; i < qedf->int_info.used_cnt; i++) { in qedf_sync_free_irqs()
2377 vector_idx = i * qedf->dev_info.common.num_hwfns + in qedf_sync_free_irqs()
2378 qed_ops->common->get_affin_hwfn_idx(qedf->cdev); in qedf_sync_free_irqs()
2379 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_sync_free_irqs()
2382 vector = qedf->int_info.msix[vector_idx].vector; in qedf_sync_free_irqs()
2386 free_irq(vector, &qedf->fp_array[i]); in qedf_sync_free_irqs()
2389 qed_ops->common->simd_handler_clean(qedf->cdev, in qedf_sync_free_irqs()
2392 qedf->int_info.used_cnt = 0; in qedf_sync_free_irqs()
2393 qed_ops->common->set_fp_int(qedf->cdev, 0); in qedf_sync_free_irqs()
2403 for (i = 0; i < qedf->num_queues; i++) { in qedf_request_msix_irq()
2404 vector_idx = i * qedf->dev_info.common.num_hwfns + in qedf_request_msix_irq()
2405 qed_ops->common->get_affin_hwfn_idx(qedf->cdev); in qedf_request_msix_irq()
2406 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_request_msix_irq()
2409 vector = qedf->int_info.msix[vector_idx].vector; in qedf_request_msix_irq()
2411 &qedf->fp_array[i]); in qedf_request_msix_irq()
2414 QEDF_WARN(&(qedf->dbg_ctx), "request_irq failed.\n"); in qedf_request_msix_irq()
2419 qedf->int_info.used_cnt++; in qedf_request_msix_irq()
2434 rc = qed_ops->common->set_fp_int(qedf->cdev, num_online_cpus()); in qedf_setup_int()
2438 rc = qed_ops->common->get_fp_int(qedf->cdev, &qedf->int_info); in qedf_setup_int()
2442 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Number of msix_cnt = " in qedf_setup_int()
2443 "0x%x num of cpus = 0x%x\n", qedf->int_info.msix_cnt, in qedf_setup_int()
2446 if (qedf->int_info.msix_cnt) in qedf_setup_int()
2449 qed_ops->common->simd_handler_config(qedf->cdev, &qedf, in qedf_setup_int()
2451 qedf->int_info.used_cnt = 1; in qedf_setup_int()
2453 QEDF_ERR(&qedf->dbg_ctx, in qedf_setup_int()
2454 "Cannot load driver due to a lack of MSI-X vectors.\n"); in qedf_setup_int()
2455 return -EINVAL; in qedf_setup_int()
2474 lport = qedf->lport; in qedf_recv_frame()
2475 if (lport == NULL || lport->state == LPORT_ST_DISABLED) { in qedf_recv_frame()
2483 mac = eth_hdr(skb)->h_source; in qedf_recv_frame()
2484 dest_mac = eth_hdr(skb)->h_dest; in qedf_recv_frame()
2487 hp = (struct fcoe_hdr *)skb->data; in qedf_recv_frame()
2490 fr_len = skb->len - sizeof(struct fcoe_crc_eof); in qedf_recv_frame()
2495 fr_sof(fp) = hp->fcoe_sof; in qedf_recv_frame()
2515 if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA && in qedf_recv_frame()
2516 fh->fh_type == FC_TYPE_FCP) { in qedf_recv_frame()
2521 if (fh->fh_r_ctl == FC_RCTL_ELS_REQ && in qedf_recv_frame()
2522 fh->fh_type == FC_TYPE_ELS) { in qedf_recv_frame()
2525 if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) { in qedf_recv_frame()
2526 /* drop non-FIP LOGO */ in qedf_recv_frame()
2534 if (fh->fh_r_ctl == FC_RCTL_BA_ABTS) { in qedf_recv_frame()
2540 if (ntoh24(&dest_mac[3]) != ntoh24(fh->fh_d_id)) { in qedf_recv_frame()
2541 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2547 if (qedf->ctlr.state) { in qedf_recv_frame()
2548 if (!ether_addr_equal(mac, qedf->ctlr.dest_addr)) { in qedf_recv_frame()
2549 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2551 mac, qedf->ctlr.dest_addr); in qedf_recv_frame()
2557 vn_port = fc_vport_id_lookup(lport, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2564 if (lport->port_id != ntoh24(fh->fh_d_id) && !vn_port) { in qedf_recv_frame()
2565 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_recv_frame()
2566 "Dropping frame due to destination mismatch: lport->port_id=0x%x fh->d_id=0x%x.\n", in qedf_recv_frame()
2567 lport->port_id, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2572 f_ctl = ntoh24(fh->fh_f_ctl); in qedf_recv_frame()
2573 if ((fh->fh_type == FC_TYPE_BLS) && (f_ctl & FC_FC_SEQ_CTX) && in qedf_recv_frame()
2576 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_recv_frame()
2589 fcport = qedf_fcport_lookup(qedf, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2592 &fcport->flags)) { in qedf_recv_frame()
2593 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2599 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FCoE frame receive: " in qedf_recv_frame()
2601 ntoh24(fh->fh_s_id), ntoh24(fh->fh_d_id), fh->fh_r_ctl, in qedf_recv_frame()
2602 fh->fh_type); in qedf_recv_frame()
2605 1, skb->data, skb->len, false); in qedf_recv_frame()
2613 struct qedf_ctx *qedf = skb_work->qedf; in qedf_ll2_process_skb()
2614 struct sk_buff *skb = skb_work->skb; in qedf_ll2_process_skb()
2622 eh = (struct ethhdr *)skb->data; in qedf_ll2_process_skb()
2625 if (eh->h_proto == htons(ETH_P_8021Q)) { in qedf_ll2_process_skb()
2636 if (eh->h_proto == htons(ETH_P_FIP)) { in qedf_ll2_process_skb()
2639 } else if (eh->h_proto == htons(ETH_P_FCOE)) { in qedf_ll2_process_skb()
2659 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_ll2_rx()
2660 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_ll2_rx()
2668 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate skb_work so " in qedf_ll2_rx()
2674 INIT_WORK(&skb_work->work, qedf_ll2_process_skb); in qedf_ll2_rx()
2675 skb_work->skb = skb; in qedf_ll2_rx()
2676 skb_work->qedf = qedf; in qedf_ll2_rx()
2677 queue_work(qedf->ll2_recv_wq, &skb_work->work); in qedf_ll2_rx()
2695 * Deferred part of unsolicited CQE sends in qedf_fp_io_handler()
2698 comp_type = (io_work->cqe.cqe_data >> in qedf_fp_io_handler()
2702 io_work->fp) in qedf_fp_io_handler()
2703 fc_exch_recv(io_work->qedf->lport, io_work->fp); in qedf_fp_io_handler()
2705 qedf_process_cqe(io_work->qedf, &io_work->cqe); in qedf_fp_io_handler()
2717 sb_virt = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_and_init_sb()
2721 QEDF_ERR(&qedf->dbg_ctx, in qedf_alloc_and_init_sb()
2724 return -ENOMEM; in qedf_alloc_and_init_sb()
2727 ret = qed_ops->common->sb_init(qedf->cdev, sb_info, sb_virt, sb_phys, in qedf_alloc_and_init_sb()
2731 QEDF_ERR(&qedf->dbg_ctx, in qedf_alloc_and_init_sb()
2742 if (sb_info->sb_virt) in qedf_free_sb()
2743 dma_free_coherent(&qedf->pdev->dev, sizeof(*sb_info->sb_virt), in qedf_free_sb()
2744 (void *)sb_info->sb_virt, sb_info->sb_phys); in qedf_free_sb()
2752 for (id = 0; id < qedf->num_queues; id++) { in qedf_destroy_sb()
2753 fp = &(qedf->fp_array[id]); in qedf_destroy_sb()
2754 if (fp->sb_id == QEDF_SB_ID_NULL) in qedf_destroy_sb()
2756 qedf_free_sb(qedf, fp->sb_info); in qedf_destroy_sb()
2757 kfree(fp->sb_info); in qedf_destroy_sb()
2759 kfree(qedf->fp_array); in qedf_destroy_sb()
2768 qedf->fp_array = in qedf_prepare_sb()
2769 kcalloc(qedf->num_queues, sizeof(struct qedf_fastpath), in qedf_prepare_sb()
2772 if (!qedf->fp_array) { in qedf_prepare_sb()
2773 QEDF_ERR(&(qedf->dbg_ctx), "fastpath array allocation " in qedf_prepare_sb()
2775 return -ENOMEM; in qedf_prepare_sb()
2778 for (id = 0; id < qedf->num_queues; id++) { in qedf_prepare_sb()
2779 fp = &(qedf->fp_array[id]); in qedf_prepare_sb()
2780 fp->sb_id = QEDF_SB_ID_NULL; in qedf_prepare_sb()
2781 fp->sb_info = kcalloc(1, sizeof(*fp->sb_info), GFP_KERNEL); in qedf_prepare_sb()
2782 if (!fp->sb_info) { in qedf_prepare_sb()
2783 QEDF_ERR(&(qedf->dbg_ctx), "SB info struct " in qedf_prepare_sb()
2787 ret = qedf_alloc_and_init_sb(qedf, fp->sb_info, id); in qedf_prepare_sb()
2789 QEDF_ERR(&(qedf->dbg_ctx), "SB allocation and " in qedf_prepare_sb()
2793 fp->sb_id = id; in qedf_prepare_sb()
2794 fp->qedf = qedf; in qedf_prepare_sb()
2795 fp->cq_num_entries = in qedf_prepare_sb()
2796 qedf->global_queues[id]->cq_mem_size / in qedf_prepare_sb()
2803 void qedf_process_cqe(struct qedf_ctx *qedf, struct fcoe_cqe *cqe) in qedf_process_cqe() argument
2812 comp_type = (cqe->cqe_data >> FCOE_CQE_CQE_TYPE_SHIFT) & in qedf_process_cqe()
2815 xid = cqe->cqe_data & FCOE_CQE_TASK_ID_MASK; in qedf_process_cqe()
2816 io_req = &qedf->cmd_mgr->cmds[xid]; in qedf_process_cqe()
2820 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2825 fcport = io_req->fcport; in qedf_process_cqe()
2828 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2838 if (!test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_process_cqe()
2839 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2844 spin_lock_irqsave(&fcport->rport_lock, flags); in qedf_process_cqe()
2845 io_comp_type = io_req->cmd_type; in qedf_process_cqe()
2846 spin_unlock_irqrestore(&fcport->rport_lock, flags); in qedf_process_cqe()
2850 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2853 qedf_scsi_completion(qedf, cqe, io_req); in qedf_process_cqe()
2856 qedf_process_els_compl(qedf, cqe, io_req); in qedf_process_cqe()
2859 qedf_process_tmf_compl(qedf, cqe, io_req); in qedf_process_cqe()
2862 qedf_process_seq_cleanup_compl(qedf, cqe, io_req); in qedf_process_cqe()
2867 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2868 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2869 "Error detect CQE.\n"); in qedf_process_cqe()
2870 qedf_process_error_detect(qedf, cqe, io_req); in qedf_process_cqe()
2873 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2874 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2875 "Cleanup CQE.\n"); in qedf_process_cqe()
2876 qedf_process_cleanup_compl(qedf, cqe, io_req); in qedf_process_cqe()
2879 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2880 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2881 "Abort CQE.\n"); in qedf_process_cqe()
2882 qedf_process_abts_compl(qedf, cqe, io_req); in qedf_process_cqe()
2885 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2886 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2887 "Dummy CQE.\n"); in qedf_process_cqe()
2890 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2891 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2892 "Local completion CQE.\n"); in qedf_process_cqe()
2895 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2896 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2897 "Warning CQE.\n"); in qedf_process_cqe()
2898 qedf_process_warning_compl(qedf, cqe, io_req); in qedf_process_cqe()
2901 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2902 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2903 "Max FCoE CQE.\n"); in qedf_process_cqe()
2906 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2907 "Default CQE.\n"); in qedf_process_cqe()
2916 if (qedf->bdq_pbl_list) in qedf_free_bdq()
2917 dma_free_coherent(&qedf->pdev->dev, QEDF_PAGE_SIZE, in qedf_free_bdq()
2918 qedf->bdq_pbl_list, qedf->bdq_pbl_list_dma); in qedf_free_bdq()
2920 if (qedf->bdq_pbl) in qedf_free_bdq()
2921 dma_free_coherent(&qedf->pdev->dev, qedf->bdq_pbl_mem_size, in qedf_free_bdq()
2922 qedf->bdq_pbl, qedf->bdq_pbl_dma); in qedf_free_bdq()
2925 if (qedf->bdq[i].buf_addr) { in qedf_free_bdq()
2926 dma_free_coherent(&qedf->pdev->dev, QEDF_BDQ_BUF_SIZE, in qedf_free_bdq()
2927 qedf->bdq[i].buf_addr, qedf->bdq[i].buf_dma); in qedf_free_bdq()
2935 struct global_queue **gl = qedf->global_queues; in qedf_free_global_queues()
2937 for (i = 0; i < qedf->num_queues; i++) { in qedf_free_global_queues()
2941 if (gl[i]->cq) in qedf_free_global_queues()
2942 dma_free_coherent(&qedf->pdev->dev, in qedf_free_global_queues()
2943 gl[i]->cq_mem_size, gl[i]->cq, gl[i]->cq_dma); in qedf_free_global_queues()
2944 if (gl[i]->cq_pbl) in qedf_free_global_queues()
2945 dma_free_coherent(&qedf->pdev->dev, gl[i]->cq_pbl_size, in qedf_free_global_queues()
2946 gl[i]->cq_pbl, gl[i]->cq_pbl_dma); in qedf_free_global_queues()
2962 qedf->bdq[i].buf_addr = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
2963 QEDF_BDQ_BUF_SIZE, &qedf->bdq[i].buf_dma, GFP_KERNEL); in qedf_alloc_bdq()
2964 if (!qedf->bdq[i].buf_addr) { in qedf_alloc_bdq()
2965 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate BDQ " in qedf_alloc_bdq()
2967 return -ENOMEM; in qedf_alloc_bdq()
2972 qedf->bdq_pbl_mem_size = in qedf_alloc_bdq()
2974 qedf->bdq_pbl_mem_size = in qedf_alloc_bdq()
2975 ALIGN(qedf->bdq_pbl_mem_size, QEDF_PAGE_SIZE); in qedf_alloc_bdq()
2977 qedf->bdq_pbl = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
2978 qedf->bdq_pbl_mem_size, &qedf->bdq_pbl_dma, GFP_KERNEL); in qedf_alloc_bdq()
2979 if (!qedf->bdq_pbl) { in qedf_alloc_bdq()
2980 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate BDQ PBL.\n"); in qedf_alloc_bdq()
2981 return -ENOMEM; in qedf_alloc_bdq()
2984 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_alloc_bdq()
2986 qedf->bdq_pbl, &qedf->bdq_pbl_dma); in qedf_alloc_bdq()
2992 pbl = (struct scsi_bd *)qedf->bdq_pbl; in qedf_alloc_bdq()
2994 pbl->address.hi = cpu_to_le32(U64_HI(qedf->bdq[i].buf_dma)); in qedf_alloc_bdq()
2995 pbl->address.lo = cpu_to_le32(U64_LO(qedf->bdq[i].buf_dma)); in qedf_alloc_bdq()
2996 pbl->opaque.fcoe_opaque.hi = 0; in qedf_alloc_bdq()
2998 pbl->opaque.fcoe_opaque.lo = cpu_to_le32(i); in qedf_alloc_bdq()
3003 qedf->bdq_pbl_list = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
3005 &qedf->bdq_pbl_list_dma, in qedf_alloc_bdq()
3007 if (!qedf->bdq_pbl_list) { in qedf_alloc_bdq()
3008 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate list of PBL pages.\n"); in qedf_alloc_bdq()
3009 return -ENOMEM; in qedf_alloc_bdq()
3016 qedf->bdq_pbl_list_num_entries = qedf->bdq_pbl_mem_size / in qedf_alloc_bdq()
3018 list = (u64 *)qedf->bdq_pbl_list; in qedf_alloc_bdq()
3019 for (i = 0; i < qedf->bdq_pbl_list_num_entries; i++) { in qedf_alloc_bdq()
3020 *list = qedf->bdq_pbl_dma; in qedf_alloc_bdq()
3041 if (!qedf->num_queues) { in qedf_alloc_global_queues()
3042 QEDF_ERR(&(qedf->dbg_ctx), "No MSI-X vectors available!\n"); in qedf_alloc_global_queues()
3043 return -ENOMEM; in qedf_alloc_global_queues()
3050 if (!qedf->p_cpuq) { in qedf_alloc_global_queues()
3051 QEDF_ERR(&qedf->dbg_ctx, "p_cpuq is NULL.\n"); in qedf_alloc_global_queues()
3052 return -EINVAL; in qedf_alloc_global_queues()
3055 qedf->global_queues = kzalloc((sizeof(struct global_queue *) in qedf_alloc_global_queues()
3056 * qedf->num_queues), GFP_KERNEL); in qedf_alloc_global_queues()
3057 if (!qedf->global_queues) { in qedf_alloc_global_queues()
3058 QEDF_ERR(&(qedf->dbg_ctx), "Unable to allocate global " in qedf_alloc_global_queues()
3060 return -ENOMEM; in qedf_alloc_global_queues()
3062 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_alloc_global_queues()
3063 "qedf->global_queues=%p.\n", qedf->global_queues); in qedf_alloc_global_queues()
3068 QEDF_ERR(&qedf->dbg_ctx, "Unable to allocate bdq.\n"); in qedf_alloc_global_queues()
3072 /* Allocate a CQ and an associated PBL for each MSI-X vector */ in qedf_alloc_global_queues()
3073 for (i = 0; i < qedf->num_queues; i++) { in qedf_alloc_global_queues()
3074 qedf->global_queues[i] = kzalloc(sizeof(struct global_queue), in qedf_alloc_global_queues()
3076 if (!qedf->global_queues[i]) { in qedf_alloc_global_queues()
3077 QEDF_WARN(&(qedf->dbg_ctx), "Unable to allocate " in qedf_alloc_global_queues()
3079 status = -ENOMEM; in qedf_alloc_global_queues()
3083 qedf->global_queues[i]->cq_mem_size = in qedf_alloc_global_queues()
3085 qedf->global_queues[i]->cq_mem_size = in qedf_alloc_global_queues()
3086 ALIGN(qedf->global_queues[i]->cq_mem_size, QEDF_PAGE_SIZE); in qedf_alloc_global_queues()
3088 qedf->global_queues[i]->cq_pbl_size = in qedf_alloc_global_queues()
3089 (qedf->global_queues[i]->cq_mem_size / in qedf_alloc_global_queues()
3091 qedf->global_queues[i]->cq_pbl_size = in qedf_alloc_global_queues()
3092 ALIGN(qedf->global_queues[i]->cq_pbl_size, QEDF_PAGE_SIZE); in qedf_alloc_global_queues()
3094 qedf->global_queues[i]->cq = in qedf_alloc_global_queues()
3095 dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_global_queues()
3096 qedf->global_queues[i]->cq_mem_size, in qedf_alloc_global_queues()
3097 &qedf->global_queues[i]->cq_dma, in qedf_alloc_global_queues()
3100 if (!qedf->global_queues[i]->cq) { in qedf_alloc_global_queues()
3101 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate cq.\n"); in qedf_alloc_global_queues()
3102 status = -ENOMEM; in qedf_alloc_global_queues()
3106 qedf->global_queues[i]->cq_pbl = in qedf_alloc_global_queues()
3107 dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_global_queues()
3108 qedf->global_queues[i]->cq_pbl_size, in qedf_alloc_global_queues()
3109 &qedf->global_queues[i]->cq_pbl_dma, in qedf_alloc_global_queues()
3112 if (!qedf->global_queues[i]->cq_pbl) { in qedf_alloc_global_queues()
3113 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate cq PBL.\n"); in qedf_alloc_global_queues()
3114 status = -ENOMEM; in qedf_alloc_global_queues()
3119 num_pages = qedf->global_queues[i]->cq_mem_size / in qedf_alloc_global_queues()
3121 page = qedf->global_queues[i]->cq_dma; in qedf_alloc_global_queues()
3122 pbl = (u32 *)qedf->global_queues[i]->cq_pbl; in qedf_alloc_global_queues()
3124 while (num_pages--) { in qedf_alloc_global_queues()
3132 qedf->global_queues[i]->cq_cons_idx = 0; in qedf_alloc_global_queues()
3135 list = (u32 *)qedf->p_cpuq; in qedf_alloc_global_queues()
3143 for (i = 0; i < qedf->num_queues; i++) { in qedf_alloc_global_queues()
3144 *list = U64_LO(qedf->global_queues[i]->cq_pbl_dma); in qedf_alloc_global_queues()
3146 *list = U64_HI(qedf->global_queues[i]->cq_pbl_dma); in qedf_alloc_global_queues()
3176 qedf->num_queues = MIN_NUM_CPUS_MSIX(qedf); in qedf_set_fcoe_pf_param()
3178 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Number of CQs is %d.\n", in qedf_set_fcoe_pf_param()
3179 qedf->num_queues); in qedf_set_fcoe_pf_param()
3181 qedf->p_cpuq = dma_alloc_coherent(&qedf->pdev->dev, in qedf_set_fcoe_pf_param()
3182 qedf->num_queues * sizeof(struct qedf_glbl_q_params), in qedf_set_fcoe_pf_param()
3183 &qedf->hw_p_cpuq, GFP_KERNEL); in qedf_set_fcoe_pf_param()
3185 if (!qedf->p_cpuq) { in qedf_set_fcoe_pf_param()
3186 QEDF_ERR(&(qedf->dbg_ctx), "dma_alloc_coherent failed.\n"); in qedf_set_fcoe_pf_param()
3192 QEDF_ERR(&(qedf->dbg_ctx), "Global queue allocation " in qedf_set_fcoe_pf_param()
3207 memset(&(qedf->pf_params), 0, sizeof(qedf->pf_params)); in qedf_set_fcoe_pf_param()
3210 qedf->pf_params.fcoe_pf_params.num_cons = QEDF_MAX_SESSIONS; in qedf_set_fcoe_pf_param()
3211 qedf->pf_params.fcoe_pf_params.num_tasks = FCOE_PARAMS_NUM_TASKS; in qedf_set_fcoe_pf_param()
3212 qedf->pf_params.fcoe_pf_params.glbl_q_params_addr = in qedf_set_fcoe_pf_param()
3213 (u64)qedf->hw_p_cpuq; in qedf_set_fcoe_pf_param()
3214 qedf->pf_params.fcoe_pf_params.sq_num_pbl_pages = sq_num_pbl_pages; in qedf_set_fcoe_pf_param()
3216 qedf->pf_params.fcoe_pf_params.rq_buffer_log_size = 0; in qedf_set_fcoe_pf_param()
3218 qedf->pf_params.fcoe_pf_params.cq_num_entries = cq_num_entries; in qedf_set_fcoe_pf_param()
3219 qedf->pf_params.fcoe_pf_params.num_cqs = qedf->num_queues; in qedf_set_fcoe_pf_param()
3222 qedf->pf_params.fcoe_pf_params.log_page_size = ilog2(QEDF_PAGE_SIZE); in qedf_set_fcoe_pf_param()
3224 qedf->pf_params.fcoe_pf_params.mtu = 9000; in qedf_set_fcoe_pf_param()
3225 qedf->pf_params.fcoe_pf_params.gl_rq_pi = QEDF_FCOE_PARAMS_GL_RQ_PI; in qedf_set_fcoe_pf_param()
3226 qedf->pf_params.fcoe_pf_params.gl_cmd_pi = QEDF_FCOE_PARAMS_GL_CMD_PI; in qedf_set_fcoe_pf_param()
3229 qedf->pf_params.fcoe_pf_params.bdq_pbl_base_addr[0] = in qedf_set_fcoe_pf_param()
3230 qedf->bdq_pbl_list_dma; in qedf_set_fcoe_pf_param()
3231 qedf->pf_params.fcoe_pf_params.bdq_pbl_num_entries[0] = in qedf_set_fcoe_pf_param()
3232 qedf->bdq_pbl_list_num_entries; in qedf_set_fcoe_pf_param()
3233 qedf->pf_params.fcoe_pf_params.rq_buffer_size = QEDF_BDQ_BUF_SIZE; in qedf_set_fcoe_pf_param()
3235 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_fcoe_pf_param()
3237 qedf->bdq_pbl_list, in qedf_set_fcoe_pf_param()
3238 qedf->pf_params.fcoe_pf_params.bdq_pbl_base_addr[0], in qedf_set_fcoe_pf_param()
3239 qedf->pf_params.fcoe_pf_params.bdq_pbl_num_entries[0]); in qedf_set_fcoe_pf_param()
3241 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_fcoe_pf_param()
3243 qedf->pf_params.fcoe_pf_params.cq_num_entries); in qedf_set_fcoe_pf_param()
3253 if (qedf->p_cpuq) { in qedf_free_fcoe_pf_param()
3254 size = qedf->num_queues * sizeof(struct qedf_glbl_q_params); in qedf_free_fcoe_pf_param()
3255 dma_free_coherent(&qedf->pdev->dev, size, qedf->p_cpuq, in qedf_free_fcoe_pf_param()
3256 qedf->hw_p_cpuq); in qedf_free_fcoe_pf_param()
3261 kfree(qedf->global_queues); in qedf_free_fcoe_pf_param()
3286 int rc = -EINVAL; in __qedf_probe()
3314 rc = -ENOMEM; in __qedf_probe()
3322 set_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3323 qedf->lport = lport; in __qedf_probe()
3324 qedf->ctlr.lp = lport; in __qedf_probe()
3325 qedf->pdev = pdev; in __qedf_probe()
3326 qedf->dbg_ctx.pdev = pdev; in __qedf_probe()
3327 qedf->dbg_ctx.host_no = lport->host->host_no; in __qedf_probe()
3328 spin_lock_init(&qedf->hba_lock); in __qedf_probe()
3329 INIT_LIST_HEAD(&qedf->fcports); in __qedf_probe()
3330 qedf->curr_conn_id = QEDF_MAX_SESSIONS - 1; in __qedf_probe()
3331 atomic_set(&qedf->num_offloads, 0); in __qedf_probe()
3332 qedf->stop_io_on_error = false; in __qedf_probe()
3334 init_completion(&qedf->fipvlan_compl); in __qedf_probe()
3335 mutex_init(&qedf->stats_mutex); in __qedf_probe()
3336 mutex_init(&qedf->flush_mutex); in __qedf_probe()
3337 qedf->flogi_pending = 0; in __qedf_probe()
3339 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, in __qedf_probe()
3347 set_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3348 lport = qedf->lport; in __qedf_probe()
3351 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe started.\n"); in __qedf_probe()
3353 host = lport->host; in __qedf_probe()
3356 qedf->io_mempool = mempool_create_slab_pool(QEDF_IO_WORK_MIN, in __qedf_probe()
3358 if (qedf->io_mempool == NULL) { in __qedf_probe()
3359 QEDF_ERR(&(qedf->dbg_ctx), "qedf->io_mempool is NULL.\n"); in __qedf_probe()
3362 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, "qedf->io_mempool=%p.\n", in __qedf_probe()
3363 qedf->io_mempool); in __qedf_probe()
3366 qedf->lport->host->host_no); in __qedf_probe()
3367 qedf->link_update_wq = create_workqueue(host_buf); in __qedf_probe()
3368 INIT_DELAYED_WORK(&qedf->link_update, qedf_handle_link_update); in __qedf_probe()
3369 INIT_DELAYED_WORK(&qedf->link_recovery, qedf_link_recovery); in __qedf_probe()
3370 INIT_DELAYED_WORK(&qedf->grcdump_work, qedf_wq_grcdump); in __qedf_probe()
3371 INIT_DELAYED_WORK(&qedf->stag_work, qedf_stag_change_work); in __qedf_probe()
3372 qedf->fipvlan_retries = qedf_fipvlan_retries; in __qedf_probe()
3374 if (qedf_default_prio > -1) { in __qedf_probe()
3379 qedf->prio = qedf_default_prio; in __qedf_probe()
3381 qedf->prio = QEDF_DEFAULT_PRIO; in __qedf_probe()
3392 qedf->cdev = qed_ops->common->probe(pdev, &qed_params); in __qedf_probe()
3393 if (!qedf->cdev) { in __qedf_probe()
3395 QEDF_ERR(&qedf->dbg_ctx, in __qedf_probe()
3397 retry_cnt--; in __qedf_probe()
3400 QEDF_ERR(&qedf->dbg_ctx, "common probe failed.\n"); in __qedf_probe()
3401 rc = -ENODEV; in __qedf_probe()
3406 rc = qed_ops->fill_dev_info(qedf->cdev, &qedf->dev_info); in __qedf_probe()
3408 QEDF_ERR(&(qedf->dbg_ctx), "Failed to dev info.\n"); in __qedf_probe()
3412 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in __qedf_probe()
3414 qedf->dev_info.common.num_hwfns, in __qedf_probe()
3415 qed_ops->common->get_affin_hwfn_idx(qedf->cdev)); in __qedf_probe()
3427 QEDF_ERR(&(qedf->dbg_ctx), "Cannot set fcoe pf param.\n"); in __qedf_probe()
3430 qed_ops->common->update_pf_params(qedf->cdev, &qedf->pf_params); in __qedf_probe()
3433 rc = qed_ops->fill_dev_info(qedf->cdev, &qedf->dev_info); in __qedf_probe()
3435 QEDF_ERR(&qedf->dbg_ctx, "Failed to fill dev info.\n"); in __qedf_probe()
3440 qedf->devlink = qed_ops->common->devlink_register(qedf->cdev); in __qedf_probe()
3441 if (IS_ERR(qedf->devlink)) { in __qedf_probe()
3442 QEDF_ERR(&qedf->dbg_ctx, "Cannot register devlink\n"); in __qedf_probe()
3443 rc = PTR_ERR(qedf->devlink); in __qedf_probe()
3444 qedf->devlink = NULL; in __qedf_probe()
3450 qedf->bdq_primary_prod = qedf->dev_info.primary_dbq_rq_addr; in __qedf_probe()
3451 qedf->bdq_secondary_prod = qedf->dev_info.secondary_bdq_rq_addr; in __qedf_probe()
3452 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3453 "BDQ primary_prod=%p secondary_prod=%p.\n", qedf->bdq_primary_prod, in __qedf_probe()
3454 qedf->bdq_secondary_prod); in __qedf_probe()
3456 qed_ops->register_ops(qedf->cdev, &qedf_cb_ops, qedf); in __qedf_probe()
3461 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start slowpath.\n"); in __qedf_probe()
3465 /* Start the Slowpath-process */ in __qedf_probe()
3472 rc = qed_ops->common->slowpath_start(qedf->cdev, &slowpath_params); in __qedf_probe()
3474 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start slowpath.\n"); in __qedf_probe()
3482 qed_ops->common->update_pf_params(qedf->cdev, &qedf->pf_params); in __qedf_probe()
3487 QEDF_ERR(&qedf->dbg_ctx, "Setup interrupts failed.\n"); in __qedf_probe()
3491 rc = qed_ops->start(qedf->cdev, &qedf->tasks); in __qedf_probe()
3493 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start FCoE function.\n"); in __qedf_probe()
3496 task_start = qedf_get_task_mem(&qedf->tasks, 0); in __qedf_probe()
3497 task_end = qedf_get_task_mem(&qedf->tasks, MAX_TID_BLOCKS_FCOE - 1); in __qedf_probe()
3498 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Task context start=%p, " in __qedf_probe()
3500 qedf->tasks.size); in __qedf_probe()
3504 * the f/w will do a prefetch and we'll get an unsolicited CQE when a in __qedf_probe()
3507 qedf->bdq_prod_idx = QEDF_BDQ_SIZE; in __qedf_probe()
3508 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3510 qedf->bdq_prod_idx); in __qedf_probe()
3511 writew(qedf->bdq_prod_idx, qedf->bdq_primary_prod); in __qedf_probe()
3512 readw(qedf->bdq_primary_prod); in __qedf_probe()
3513 writew(qedf->bdq_prod_idx, qedf->bdq_secondary_prod); in __qedf_probe()
3514 readw(qedf->bdq_secondary_prod); in __qedf_probe()
3516 qed_ops->common->set_power_state(qedf->cdev, PCI_D0); in __qedf_probe()
3521 ether_addr_copy(qedf->mac, qedf->dev_info.common.hw_mac); in __qedf_probe()
3522 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "MAC address is %pM.\n", in __qedf_probe()
3523 qedf->mac); in __qedf_probe()
3528 * If the info we get from qed is non-zero then use that to set the in __qedf_probe()
3532 if (qedf->dev_info.wwnn != 0 && qedf->dev_info.wwpn != 0) { in __qedf_probe()
3533 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3535 qedf->wwnn = qedf->dev_info.wwnn; in __qedf_probe()
3536 qedf->wwpn = qedf->dev_info.wwpn; in __qedf_probe()
3538 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3540 qedf->wwnn = fcoe_wwn_from_mac(qedf->mac, 1, 0); in __qedf_probe()
3541 qedf->wwpn = fcoe_wwn_from_mac(qedf->mac, 2, 0); in __qedf_probe()
3543 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "WWNN=%016llx " in __qedf_probe()
3544 "WWPN=%016llx.\n", qedf->wwnn, qedf->wwpn); in __qedf_probe()
3546 sprintf(host_buf, "host_%d", host->host_no); in __qedf_probe()
3547 qed_ops->common->set_name(qedf->cdev, host_buf); in __qedf_probe()
3550 qedf->cmd_mgr = qedf_cmd_mgr_alloc(qedf); in __qedf_probe()
3551 if (!qedf->cmd_mgr) { in __qedf_probe()
3552 QEDF_ERR(&(qedf->dbg_ctx), "Failed to allocate cmd mgr.\n"); in __qedf_probe()
3553 rc = -ENOMEM; in __qedf_probe()
3558 host->transportt = qedf_fc_transport_template; in __qedf_probe()
3559 host->max_lun = qedf_max_lun; in __qedf_probe()
3560 host->max_cmd_len = QEDF_MAX_CDB_LEN; in __qedf_probe()
3561 host->max_id = QEDF_MAX_SESSIONS; in __qedf_probe()
3562 host->can_queue = FCOE_PARAMS_NUM_TASKS; in __qedf_probe()
3563 rc = scsi_add_host(host, &pdev->dev); in __qedf_probe()
3565 QEDF_WARN(&qedf->dbg_ctx, in __qedf_probe()
3573 ether_addr_copy(params.ll2_mac_address, qedf->mac); in __qedf_probe()
3576 snprintf(host_buf, 20, "qedf_%d_ll2", host->host_no); in __qedf_probe()
3577 qedf->ll2_recv_wq = in __qedf_probe()
3579 if (!qedf->ll2_recv_wq) { in __qedf_probe()
3580 QEDF_ERR(&(qedf->dbg_ctx), "Failed to LL2 workqueue.\n"); in __qedf_probe()
3581 rc = -ENOMEM; in __qedf_probe()
3586 qedf_dbg_host_init(&(qedf->dbg_ctx), qedf_debugfs_ops, in __qedf_probe()
3591 qed_ops->ll2->register_cb_ops(qedf->cdev, &qedf_ll2_cb_ops, qedf); in __qedf_probe()
3592 rc = qed_ops->ll2->start(qedf->cdev, ¶ms); in __qedf_probe()
3594 QEDF_ERR(&(qedf->dbg_ctx), "Could not start Light L2.\n"); in __qedf_probe()
3597 set_bit(QEDF_LL2_STARTED, &qedf->flags); in __qedf_probe()
3600 qedf->vlan_id = 0; in __qedf_probe()
3613 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3619 sprintf(host_buf, "qedf_%u_timer", qedf->lport->host->host_no); in __qedf_probe()
3620 qedf->timer_work_queue = in __qedf_probe()
3622 if (!qedf->timer_work_queue) { in __qedf_probe()
3623 QEDF_ERR(&(qedf->dbg_ctx), "Failed to start timer " in __qedf_probe()
3625 rc = -ENOMEM; in __qedf_probe()
3632 qedf->lport->host->host_no); in __qedf_probe()
3633 qedf->dpc_wq = create_workqueue(host_buf); in __qedf_probe()
3635 INIT_DELAYED_WORK(&qedf->recovery_work, qedf_recovery_handler); in __qedf_probe()
3642 qedf->grcdump_size = in __qedf_probe()
3643 qed_ops->common->dbg_all_data_size(qedf->cdev); in __qedf_probe()
3644 if (qedf->grcdump_size) { in __qedf_probe()
3645 rc = qedf_alloc_grc_dump_buf(&qedf->grcdump, in __qedf_probe()
3646 qedf->grcdump_size); in __qedf_probe()
3648 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3650 qedf->grcdump = NULL; in __qedf_probe()
3653 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3655 qedf->grcdump, qedf->grcdump_size); in __qedf_probe()
3660 spin_lock_init(&qedf->io_trace_lock); in __qedf_probe()
3661 qedf->io_trace_idx = 0; in __qedf_probe()
3664 init_completion(&qedf->flogi_compl); in __qedf_probe()
3666 status = qed_ops->common->update_drv_state(qedf->cdev, true); in __qedf_probe()
3668 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3673 status = qed_ops->common->set_link(qedf->cdev, &link_params); in __qedf_probe()
3675 QEDF_WARN(&(qedf->dbg_ctx), "set_link failed.\n"); in __qedf_probe()
3679 fcoe_ctlr_link_up(&qedf->ctlr); in __qedf_probe()
3683 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); in __qedf_probe()
3685 clear_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3691 if (qedf->ll2_recv_wq) in __qedf_probe()
3692 destroy_workqueue(qedf->ll2_recv_wq); in __qedf_probe()
3693 fc_remove_host(qedf->lport->host); in __qedf_probe()
3694 scsi_remove_host(qedf->lport->host); in __qedf_probe()
3696 qedf_dbg_host_exit(&(qedf->dbg_ctx)); in __qedf_probe()
3699 qedf_cmd_mgr_free(qedf->cmd_mgr); in __qedf_probe()
3701 qed_ops->stop(qedf->cdev); in __qedf_probe()
3706 qed_ops->common->slowpath_stop(qedf->cdev); in __qedf_probe()
3708 qed_ops->common->remove(qedf->cdev); in __qedf_probe()
3710 scsi_host_put(lport->host); in __qedf_probe()
3736 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in __qedf_remove()
3737 QEDF_ERR(&qedf->dbg_ctx, "Already removing PCI function.\n"); in __qedf_remove()
3742 set_bit(QEDF_UNLOADING, &qedf->flags); in __qedf_remove()
3746 fcoe_ctlr_link_down(&qedf->ctlr); in __qedf_remove()
3748 fc_fabric_logoff(qedf->lport); in __qedf_remove()
3751 QEDF_ERR(&qedf->dbg_ctx, "Could not upload all sessions.\n"); in __qedf_remove()
3754 qedf_dbg_host_exit(&(qedf->dbg_ctx)); in __qedf_remove()
3758 cancel_delayed_work_sync(&qedf->link_update); in __qedf_remove()
3759 destroy_workqueue(qedf->link_update_wq); in __qedf_remove()
3760 qedf->link_update_wq = NULL; in __qedf_remove()
3762 if (qedf->timer_work_queue) in __qedf_remove()
3763 destroy_workqueue(qedf->timer_work_queue); in __qedf_remove()
3766 clear_bit(QEDF_LL2_STARTED, &qedf->flags); in __qedf_remove()
3767 qed_ops->ll2->stop(qedf->cdev); in __qedf_remove()
3768 if (qedf->ll2_recv_wq) in __qedf_remove()
3769 destroy_workqueue(qedf->ll2_recv_wq); in __qedf_remove()
3780 qedf_free_grc_dump_buf(&qedf->grcdump); in __qedf_remove()
3784 fcoe_ctlr_destroy(&qedf->ctlr); in __qedf_remove()
3785 fc_lport_destroy(qedf->lport); in __qedf_remove()
3786 fc_remove_host(qedf->lport->host); in __qedf_remove()
3787 scsi_remove_host(qedf->lport->host); in __qedf_remove()
3790 qedf_cmd_mgr_free(qedf->cmd_mgr); in __qedf_remove()
3793 fc_exch_mgr_free(qedf->lport); in __qedf_remove()
3794 fc_lport_free_stats(qedf->lport); in __qedf_remove()
3804 qed_ops->stop(qedf->cdev); in __qedf_remove()
3807 if (qedf->dpc_wq) { in __qedf_remove()
3809 destroy_workqueue(qedf->dpc_wq); in __qedf_remove()
3810 qedf->dpc_wq = NULL; in __qedf_remove()
3817 qed_ops->common->set_power_state(qedf->cdev, PCI_D0); in __qedf_remove()
3821 rc = qed_ops->common->update_drv_state(qedf->cdev, false); in __qedf_remove()
3823 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_remove()
3826 if (mode != QEDF_MODE_RECOVERY && qedf->devlink) { in __qedf_remove()
3827 qed_ops->common->devlink_unregister(qedf->devlink); in __qedf_remove()
3828 qedf->devlink = NULL; in __qedf_remove()
3831 qed_ops->common->slowpath_stop(qedf->cdev); in __qedf_remove()
3832 qed_ops->common->remove(qedf->cdev); in __qedf_remove()
3834 mempool_destroy(qedf->io_mempool); in __qedf_remove()
3838 scsi_host_put(qedf->lport->host); in __qedf_remove()
3844 if (!atomic_read(&pdev->enable_cnt)) in qedf_remove()
3855 QEDF_ERR(&(qedf->dbg_ctx), "Collecting GRC dump.\n"); in qedf_wq_grcdump()
3863 QEDF_ERR(&(qedf->dbg_ctx), in qedf_schedule_hw_err_handler()
3867 if (test_bit(QEDF_IN_RECOVERY, &qedf->flags)) { in qedf_schedule_hw_err_handler()
3868 QEDF_ERR(&(qedf->dbg_ctx), in qedf_schedule_hw_err_handler()
3875 schedule_delayed_work(&qedf->board_disable_work, 0); in qedf_schedule_hw_err_handler()
3882 qed_ops->common->attn_clr_enable(qedf->cdev, true); in qedf_schedule_hw_err_handler()
3886 qed_ops->common->attn_clr_enable(qedf->cdev, true); in qedf_schedule_hw_err_handler()
3888 if (qedf_enable_recovery && qedf->devlink) in qedf_schedule_hw_err_handler()
3889 qed_ops->common->report_fatal_error(qedf->devlink, in qedf_schedule_hw_err_handler()
3915 if (test_bit(QEDF_PROBING, &qedf->flags)) { in qedf_get_protocol_tlv_data()
3916 QEDF_ERR(&qedf->dbg_ctx, "Function is still probing.\n"); in qedf_get_protocol_tlv_data()
3920 lport = qedf->lport; in qedf_get_protocol_tlv_data()
3921 host = lport->host; in qedf_get_protocol_tlv_data()
3927 fcoe->qos_pri_set = true; in qedf_get_protocol_tlv_data()
3928 fcoe->qos_pri = 3; /* Hard coded to 3 in driver */ in qedf_get_protocol_tlv_data()
3930 fcoe->ra_tov_set = true; in qedf_get_protocol_tlv_data()
3931 fcoe->ra_tov = lport->r_a_tov; in qedf_get_protocol_tlv_data()
3933 fcoe->ed_tov_set = true; in qedf_get_protocol_tlv_data()
3934 fcoe->ed_tov = lport->e_d_tov; in qedf_get_protocol_tlv_data()
3936 fcoe->npiv_state_set = true; in qedf_get_protocol_tlv_data()
3937 fcoe->npiv_state = 1; /* NPIV always enabled */ in qedf_get_protocol_tlv_data()
3939 fcoe->num_npiv_ids_set = true; in qedf_get_protocol_tlv_data()
3940 fcoe->num_npiv_ids = fc_host->npiv_vports_inuse; in qedf_get_protocol_tlv_data()
3943 if (qedf->ctlr.sel_fcf) { in qedf_get_protocol_tlv_data()
3944 fcoe->switch_name_set = true; in qedf_get_protocol_tlv_data()
3945 u64_to_wwn(qedf->ctlr.sel_fcf->switch_name, fcoe->switch_name); in qedf_get_protocol_tlv_data()
3948 fcoe->port_state_set = true; in qedf_get_protocol_tlv_data()
3950 if (lport->link_up) in qedf_get_protocol_tlv_data()
3951 fcoe->port_state = QED_MFW_TLV_PORT_STATE_FABRIC; in qedf_get_protocol_tlv_data()
3953 fcoe->port_state = QED_MFW_TLV_PORT_STATE_OFFLINE; in qedf_get_protocol_tlv_data()
3955 fcoe->link_failures_set = true; in qedf_get_protocol_tlv_data()
3956 fcoe->link_failures = (u16)hst->link_failure_count; in qedf_get_protocol_tlv_data()
3958 fcoe->fcoe_txq_depth_set = true; in qedf_get_protocol_tlv_data()
3959 fcoe->fcoe_rxq_depth_set = true; in qedf_get_protocol_tlv_data()
3960 fcoe->fcoe_rxq_depth = FCOE_PARAMS_NUM_TASKS; in qedf_get_protocol_tlv_data()
3961 fcoe->fcoe_txq_depth = FCOE_PARAMS_NUM_TASKS; in qedf_get_protocol_tlv_data()
3963 fcoe->fcoe_rx_frames_set = true; in qedf_get_protocol_tlv_data()
3964 fcoe->fcoe_rx_frames = hst->rx_frames; in qedf_get_protocol_tlv_data()
3966 fcoe->fcoe_tx_frames_set = true; in qedf_get_protocol_tlv_data()
3967 fcoe->fcoe_tx_frames = hst->tx_frames; in qedf_get_protocol_tlv_data()
3969 fcoe->fcoe_rx_bytes_set = true; in qedf_get_protocol_tlv_data()
3970 fcoe->fcoe_rx_bytes = hst->fcp_input_megabytes * 1000000; in qedf_get_protocol_tlv_data()
3972 fcoe->fcoe_tx_bytes_set = true; in qedf_get_protocol_tlv_data()
3973 fcoe->fcoe_tx_bytes = hst->fcp_output_megabytes * 1000000; in qedf_get_protocol_tlv_data()
3975 fcoe->crc_count_set = true; in qedf_get_protocol_tlv_data()
3976 fcoe->crc_count = hst->invalid_crc_count; in qedf_get_protocol_tlv_data()
3978 fcoe->tx_abts_set = true; in qedf_get_protocol_tlv_data()
3979 fcoe->tx_abts = hst->fcp_packet_aborts; in qedf_get_protocol_tlv_data()
3981 fcoe->tx_lun_rst_set = true; in qedf_get_protocol_tlv_data()
3982 fcoe->tx_lun_rst = qedf->lun_resets; in qedf_get_protocol_tlv_data()
3984 fcoe->abort_task_sets_set = true; in qedf_get_protocol_tlv_data()
3985 fcoe->abort_task_sets = qedf->packet_aborts; in qedf_get_protocol_tlv_data()
3987 fcoe->scsi_busy_set = true; in qedf_get_protocol_tlv_data()
3988 fcoe->scsi_busy = qedf->busy; in qedf_get_protocol_tlv_data()
3990 fcoe->scsi_tsk_full_set = true; in qedf_get_protocol_tlv_data()
3991 fcoe->scsi_tsk_full = qedf->task_set_fulls; in qedf_get_protocol_tlv_data()
4001 dev_name(&qedf->pdev->dev), __func__, __LINE__, in qedf_stag_change_work()
4002 qedf->dbg_ctx.host_no); in qedf_stag_change_work()
4003 qedf_ctx_soft_reset(qedf->lport); in qedf_stag_change_work()
4017 return -ENODEV; in qedf_suspend()
4022 QEDF_ERR(&qedf->dbg_ctx, "%s: Device does not support suspend operation\n", __func__); in qedf_suspend()
4024 return -EPERM; in qedf_suspend()
4034 QEDF_ERR(&qedf->dbg_ctx, "Recovery handler scheduled.\n"); in qedf_schedule_recovery_handler()
4035 schedule_delayed_work(&qedf->recovery_work, 0); in qedf_schedule_recovery_handler()
4043 if (test_and_set_bit(QEDF_IN_RECOVERY, &qedf->flags)) in qedf_recovery_handler()
4047 * Call common_ops->recovery_prolog to allow the MFW to quiesce in qedf_recovery_handler()
4050 qed_ops->common->recovery_prolog(qedf->cdev); in qedf_recovery_handler()
4052 QEDF_ERR(&qedf->dbg_ctx, "Recovery work start.\n"); in qedf_recovery_handler()
4053 __qedf_remove(qedf->pdev, QEDF_MODE_RECOVERY); in qedf_recovery_handler()
4059 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_recovery_handler()
4060 atomic_set(&qedf->dcbx, QEDF_DCBX_PENDING); in qedf_recovery_handler()
4061 __qedf_probe(qedf->pdev, QEDF_MODE_RECOVERY); in qedf_recovery_handler()
4062 clear_bit(QEDF_IN_RECOVERY, &qedf->flags); in qedf_recovery_handler()
4063 QEDF_ERR(&qedf->dbg_ctx, "Recovery work complete.\n"); in qedf_recovery_handler()
4079 ether_addr_copy(data->mac[0], qedf->mac); in qedf_get_generic_tlv_data()
4098 if (qedf_default_prio > -1) in qedf_init()
4172 return -EINVAL; in qedf_init()