Lines Matching +full:supports +full:- +full:cqe

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2016-2018 Cavium Inc.
58 static int qedf_default_prio = -1;
81 "supports. (default 0xffffffff)");
106 "during probe (0-3: 0 more verbose).");
125 vlan_id_tmp = vlan_id | (qedf->prio << VLAN_PRIO_SHIFT); in qedf_set_vlan_id()
126 qedf->vlan_id = vlan_id_tmp; in qedf_set_vlan_id()
127 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_set_vlan_id()
129 vlan_id_tmp, qedf->prio); in qedf_set_vlan_id()
136 while (qedf->fipvlan_retries--) { in qedf_initiate_fipvlan_req()
138 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_initiate_fipvlan_req()
139 QEDF_ERR(&qedf->dbg_ctx, "Link not up.\n"); in qedf_initiate_fipvlan_req()
143 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_initiate_fipvlan_req()
144 QEDF_ERR(&qedf->dbg_ctx, "Driver unloading.\n"); in qedf_initiate_fipvlan_req()
148 if (qedf->vlan_id > 0) { in qedf_initiate_fipvlan_req()
149 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_initiate_fipvlan_req()
151 qedf->vlan_id); in qedf_initiate_fipvlan_req()
152 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) in qedf_initiate_fipvlan_req()
153 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_initiate_fipvlan_req()
157 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_initiate_fipvlan_req()
158 "Retry %d.\n", qedf->fipvlan_retries); in qedf_initiate_fipvlan_req()
159 init_completion(&qedf->fipvlan_compl); in qedf_initiate_fipvlan_req()
161 wait_for_completion_timeout(&qedf->fipvlan_compl, 1 * HZ); in qedf_initiate_fipvlan_req()
173 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Entered. link_state=%d.\n", in qedf_handle_link_update()
174 atomic_read(&qedf->link_state)); in qedf_handle_link_update()
176 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) { in qedf_handle_link_update()
181 if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) { in qedf_handle_link_update()
182 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_handle_link_update()
184 qedf->vlan_id = 0; in qedf_handle_link_update()
193 QEDF_WARN(&(qedf->dbg_ctx), "Did not receive FIP VLAN " in qedf_handle_link_update()
202 eth_zero_addr(qedf->data_src_addr); in qedf_handle_link_update()
203 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_handle_link_update()
204 } else if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_handle_link_update()
210 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_handle_link_update()
211 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_handle_link_update()
213 fcoe_ctlr_link_down(&qedf->ctlr); in qedf_handle_link_update()
215 QEDF_ERR(&qedf->dbg_ctx, in qedf_handle_link_update()
218 qedf->fipvlan_retries = qedf_fipvlan_retries; in qedf_handle_link_update()
233 granted_mac = fr_cb(fp)->granted_mac; in qedf_set_data_src_addr()
239 * If granted_mac is non-zero, we used that. in qedf_set_data_src_addr()
241 * the sel_fcf->fc_map and the d_id fo the FLOGI frame. in qedf_set_data_src_addr()
242 * If sel_fcf->fc_map is 0 then we use the default FCF-MAC plus the in qedf_set_data_src_addr()
246 ether_addr_copy(qedf->data_src_addr, granted_mac); in qedf_set_data_src_addr()
248 } else if (qedf->ctlr.sel_fcf->fc_map != 0) { in qedf_set_data_src_addr()
249 hton24(fc_map, qedf->ctlr.sel_fcf->fc_map); in qedf_set_data_src_addr()
250 qedf->data_src_addr[0] = fc_map[0]; in qedf_set_data_src_addr()
251 qedf->data_src_addr[1] = fc_map[1]; in qedf_set_data_src_addr()
252 qedf->data_src_addr[2] = fc_map[2]; in qedf_set_data_src_addr()
253 qedf->data_src_addr[3] = fh->fh_d_id[0]; in qedf_set_data_src_addr()
254 qedf->data_src_addr[4] = fh->fh_d_id[1]; in qedf_set_data_src_addr()
255 qedf->data_src_addr[5] = fh->fh_d_id[2]; in qedf_set_data_src_addr()
258 fc_fcoe_set_mac(qedf->data_src_addr, fh->fh_d_id); in qedf_set_data_src_addr()
262 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_data_src_addr()
263 "QEDF data_src_mac=%pM method=%d.\n", qedf->data_src_addr, method); in qedf_set_data_src_addr()
270 struct fc_lport *lport = exch->lp; in qedf_flogi_resp()
283 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, in qedf_flogi_resp()
290 qedf->flogi_failed++; in qedf_flogi_resp()
294 qedf->flogi_pending = 0; in qedf_flogi_resp()
298 complete(&qedf->flogi_compl); in qedf_flogi_resp()
319 qedf->flogi_cnt++; in qedf_elsct_send()
320 if (qedf->flogi_pending >= QEDF_FLOGI_RETRY_CNT) { in qedf_elsct_send()
321 schedule_delayed_work(&qedf->stag_work, 2); in qedf_elsct_send()
324 qedf->flogi_pending++; in qedf_elsct_send()
337 lport = qedf->lport; in qedf_send_flogi()
339 if (!lport->tt.elsct_send) { in qedf_send_flogi()
340 QEDF_ERR(&qedf->dbg_ctx, "tt.elsct_send not set.\n"); in qedf_send_flogi()
341 return -EINVAL; in qedf_send_flogi()
346 QEDF_ERR(&(qedf->dbg_ctx), "fc_frame_alloc failed.\n"); in qedf_send_flogi()
347 return -ENOMEM; in qedf_send_flogi()
350 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, in qedf_send_flogi()
352 lport->tt.elsct_send(lport, FC_FID_FLOGI, fp, in qedf_send_flogi()
353 ELS_FLOGI, qedf_flogi_resp, lport, lport->r_a_tov); in qedf_send_flogi()
355 init_completion(&qedf->flogi_compl); in qedf_send_flogi()
369 struct fc_lport *lport = qedf->lport; in qedf_link_recovery()
378 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_recovery()
385 qedf->ctlr.state = FIP_ST_LINK_WAIT; in qedf_link_recovery()
386 fcoe_ctlr_link_down(&qedf->ctlr); in qedf_link_recovery()
392 fcoe_ctlr_link_up(&qedf->ctlr); in qedf_link_recovery()
395 qedf->fipvlan_retries = qedf_fipvlan_retries; in qedf_link_recovery()
406 if (qedf->ctlr.sel_fcf) { in qedf_link_recovery()
407 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_recovery()
412 retries--; in qedf_link_recovery()
416 QEDF_ERR(&(qedf->dbg_ctx), "Exhausted retries waiting for " in qedf_link_recovery()
426 i = wait_for_completion_timeout(&qedf->flogi_compl, in qedf_link_recovery()
427 qedf->lport->r_a_tov); in qedf_link_recovery()
429 QEDF_ERR(&(qedf->dbg_ctx), "FLOGI timed out.\n"); in qedf_link_recovery()
434 * Call lport->tt.rport_login which will cause libfc to send an in qedf_link_recovery()
437 mutex_lock(&lport->disc.disc_mutex); in qedf_link_recovery()
438 list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) { in qedf_link_recovery()
439 if (kref_get_unless_zero(&rdata->kref)) { in qedf_link_recovery()
441 kref_put(&rdata->kref, fc_rport_destroy); in qedf_link_recovery()
444 mutex_unlock(&lport->disc.disc_mutex); in qedf_link_recovery()
451 struct fc_lport *lport = qedf->lport; in qedf_update_link_speed()
453 lport->link_speed = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
454 lport->link_supported_speeds = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
457 switch (link->speed) { in qedf_update_link_speed()
459 lport->link_speed = FC_PORTSPEED_10GBIT; in qedf_update_link_speed()
462 lport->link_speed = FC_PORTSPEED_25GBIT; in qedf_update_link_speed()
465 lport->link_speed = FC_PORTSPEED_40GBIT; in qedf_update_link_speed()
468 lport->link_speed = FC_PORTSPEED_50GBIT; in qedf_update_link_speed()
471 lport->link_speed = FC_PORTSPEED_100GBIT; in qedf_update_link_speed()
474 lport->link_speed = FC_PORTSPEED_20GBIT; in qedf_update_link_speed()
477 lport->link_speed = FC_PORTSPEED_UNKNOWN; in qedf_update_link_speed()
496 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
497 lport->link_supported_speeds |= FC_PORTSPEED_10GBIT; in qedf_update_link_speed()
504 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
505 lport->link_supported_speeds |= FC_PORTSPEED_25GBIT; in qedf_update_link_speed()
513 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
514 lport->link_supported_speeds |= FC_PORTSPEED_40GBIT; in qedf_update_link_speed()
521 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
522 lport->link_supported_speeds |= FC_PORTSPEED_50GBIT; in qedf_update_link_speed()
530 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
531 lport->link_supported_speeds |= FC_PORTSPEED_100GBIT; in qedf_update_link_speed()
536 if (linkmode_intersects(link->supported_caps, sup_caps)) in qedf_update_link_speed()
537 lport->link_supported_speeds |= FC_PORTSPEED_20GBIT; in qedf_update_link_speed()
539 if (lport->host && lport->host->shost_data) in qedf_update_link_speed()
540 fc_host_supported_speeds(lport->host) = in qedf_update_link_speed()
541 lport->link_supported_speeds; in qedf_update_link_speed()
550 qed_ops->common->get_link(qedf->cdev, &link); in qedf_bw_update()
552 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_bw_update()
553 QEDF_ERR(&qedf->dbg_ctx, in qedf_bw_update()
559 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) in qedf_bw_update()
562 QEDF_ERR(&qedf->dbg_ctx, in qedf_bw_update()
566 QEDF_ERR(&qedf->dbg_ctx, "link_up is not set.\n"); in qedf_bw_update()
578 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in qedf_link_update()
579 QEDF_ERR(&qedf->dbg_ctx, in qedf_link_update()
584 if (link->link_up) { in qedf_link_update()
585 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP) { in qedf_link_update()
586 QEDF_INFO((&qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
590 QEDF_ERR(&(qedf->dbg_ctx), "LINK UP (%d GB/s).\n", in qedf_link_update()
591 link->speed / 1000); in qedf_link_update()
594 cancel_delayed_work(&qedf->link_update); in qedf_link_update()
596 atomic_set(&qedf->link_state, QEDF_LINK_UP); in qedf_link_update()
599 if (atomic_read(&qedf->dcbx) == QEDF_DCBX_DONE || in qedf_link_update()
601 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
603 if (atomic_read(&qedf->link_down_tmo_valid) > 0) in qedf_link_update()
604 queue_delayed_work(qedf->link_update_wq, in qedf_link_update()
605 &qedf->link_recovery, 0); in qedf_link_update()
607 queue_delayed_work(qedf->link_update_wq, in qedf_link_update()
608 &qedf->link_update, 0); in qedf_link_update()
609 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_link_update()
613 QEDF_ERR(&(qedf->dbg_ctx), "LINK DOWN.\n"); in qedf_link_update()
615 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_link_update()
616 atomic_set(&qedf->dcbx, QEDF_DCBX_PENDING); in qedf_link_update()
622 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_link_update()
624 atomic_set(&qedf->link_down_tmo_valid, 1); in qedf_link_update()
626 qedf->vlan_id = 0; in qedf_link_update()
628 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_link_update()
639 QEDF_ERR(&(qedf->dbg_ctx), "DCBx event valid=%d enabled=%d fcoe " in qedf_dcbx_handler()
640 "prio=%d.\n", get->operational.valid, get->operational.enabled, in qedf_dcbx_handler()
641 get->operational.app_prio.fcoe); in qedf_dcbx_handler()
643 if (get->operational.enabled && get->operational.valid) { in qedf_dcbx_handler()
645 if (atomic_read(&qedf->dcbx) == QEDF_DCBX_DONE) { in qedf_dcbx_handler()
646 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_dcbx_handler()
651 atomic_set(&qedf->dcbx, QEDF_DCBX_DONE); in qedf_dcbx_handler()
660 tmp_prio = get->operational.app_prio.fcoe; in qedf_dcbx_handler()
661 if (qedf_default_prio > -1) in qedf_dcbx_handler()
662 qedf->prio = qedf_default_prio; in qedf_dcbx_handler()
664 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_dcbx_handler()
667 qedf->prio = QEDF_DEFAULT_PRIO; in qedf_dcbx_handler()
669 qedf->prio = tmp_prio; in qedf_dcbx_handler()
671 if (atomic_read(&qedf->link_state) == QEDF_LINK_UP && in qedf_dcbx_handler()
673 if (atomic_read(&qedf->link_down_tmo_valid) > 0) in qedf_dcbx_handler()
674 queue_delayed_work(qedf->link_update_wq, in qedf_dcbx_handler()
675 &qedf->link_recovery, 0); in qedf_dcbx_handler()
677 queue_delayed_work(qedf->link_update_wq, in qedf_dcbx_handler()
678 &qedf->link_update, 0); in qedf_dcbx_handler()
679 atomic_set(&qedf->link_down_tmo_valid, 0); in qedf_dcbx_handler()
690 return qedf->flogi_failed; in qedf_get_login_failures()
717 struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device)); in qedf_eh_abort()
721 struct fc_rport_libfc_priv *rp = rport->dd_data; in qedf_eh_abort()
730 lport = shost_priv(sc_cmd->device->host); in qedf_eh_abort()
733 /* rport and tgt are allocated together, so tgt should be non-NULL */ in qedf_eh_abort()
735 rdata = fcport->rdata; in qedf_eh_abort()
736 if (!rdata || !kref_get_unless_zero(&rdata->kref)) { in qedf_eh_abort()
737 QEDF_ERR(&qedf->dbg_ctx, "stale rport, sc_cmd=%p\n", sc_cmd); in qedf_eh_abort()
743 io_req = (struct qedf_ioreq *)sc_cmd->SCp.ptr; in qedf_eh_abort()
745 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
747 sc_cmd, sc_cmd->cmnd[0], in qedf_eh_abort()
748 rdata->ids.port_id); in qedf_eh_abort()
753 rval = kref_get_unless_zero(&io_req->refcount); /* ID: 005 */ in qedf_eh_abort()
758 if (!rval || io_req->sc_cmd != sc_cmd) { in qedf_eh_abort()
759 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
760 "Freed/Incorrect io_req, io_req->sc_cmd=%p, sc_cmd=%p, port_id=%06x, bailing out.\n", in qedf_eh_abort()
761 io_req->sc_cmd, sc_cmd, rdata->ids.port_id); in qedf_eh_abort()
767 refcount = kref_read(&io_req->refcount); in qedf_eh_abort()
768 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
770 io_req, io_req->xid, sc_cmd, sc_cmd->cmnd[0], in qedf_eh_abort()
771 refcount, rdata->ids.port_id); in qedf_eh_abort()
780 if (test_bit(QEDF_RPORT_UPLOADING_CONNECTION, &fcport->flags)) { in qedf_eh_abort()
781 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
783 io_req->xid, rdata->ids.port_id); in qedf_eh_abort()
784 while (io_req->sc_cmd && (wait_count != 0)) { in qedf_eh_abort()
786 wait_count--; in qedf_eh_abort()
789 QEDF_ERR(&qedf->dbg_ctx, "ABTS succeeded\n"); in qedf_eh_abort()
792 QEDF_ERR(&qedf->dbg_ctx, "ABTS failed\n"); in qedf_eh_abort()
798 if (lport->state != LPORT_ST_READY || !(lport->link_up)) { in qedf_eh_abort()
799 QEDF_ERR(&qedf->dbg_ctx, "link not ready.\n"); in qedf_eh_abort()
803 QEDF_ERR(&qedf->dbg_ctx, in qedf_eh_abort()
805 io_req, sc_cmd, io_req->xid, io_req->fp_idx, in qedf_eh_abort()
806 rdata->ids.port_id); in qedf_eh_abort()
808 if (qedf->stop_io_on_error) { in qedf_eh_abort()
814 init_completion(&io_req->abts_done); in qedf_eh_abort()
817 QEDF_ERR(&(qedf->dbg_ctx), "Failed to queue ABTS.\n"); in qedf_eh_abort()
827 wait_for_completion(&io_req->abts_done); in qedf_eh_abort()
829 if (io_req->event == QEDF_IOREQ_EV_ABORT_SUCCESS || in qedf_eh_abort()
830 io_req->event == QEDF_IOREQ_EV_ABORT_FAILED || in qedf_eh_abort()
831 io_req->event == QEDF_IOREQ_EV_CLEANUP_SUCCESS) { in qedf_eh_abort()
844 QEDF_ERR(&(qedf->dbg_ctx), "ABTS succeeded, xid=0x%x.\n", in qedf_eh_abort()
845 io_req->xid); in qedf_eh_abort()
847 QEDF_ERR(&(qedf->dbg_ctx), "ABTS failed, xid=0x%x.\n", in qedf_eh_abort()
848 io_req->xid); in qedf_eh_abort()
851 kref_put(&rdata->kref, fc_rport_destroy); in qedf_eh_abort()
854 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_eh_abort()
861 sc_cmd->device->host->host_no, sc_cmd->device->id, in qedf_eh_target_reset()
862 sc_cmd->device->lun); in qedf_eh_target_reset()
869 sc_cmd->device->host->host_no, sc_cmd->device->id, in qedf_eh_device_reset()
870 sc_cmd->device->lun); in qedf_eh_device_reset()
879 while (wait_cnt--) { in qedf_wait_for_upload()
880 if (atomic_read(&qedf->num_offloads)) in qedf_wait_for_upload()
881 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_wait_for_upload()
883 atomic_read(&qedf->num_offloads)); in qedf_wait_for_upload()
890 list_for_each_entry_rcu(fcport, &qedf->fcports, peers) { in qedf_wait_for_upload()
892 &fcport->flags)) { in qedf_wait_for_upload()
893 if (fcport->rdata) in qedf_wait_for_upload()
894 QEDF_ERR(&qedf->dbg_ctx, in qedf_wait_for_upload()
896 fcport, fcport->rdata->ids.port_id); in qedf_wait_for_upload()
898 QEDF_ERR(&qedf->dbg_ctx, in qedf_wait_for_upload()
913 if (lport->vport) { in qedf_ctx_soft_reset()
920 qedf->flogi_pending = 0; in qedf_ctx_soft_reset()
922 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_ctx_soft_reset()
923 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
925 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_ctx_soft_reset()
929 QEDF_ERR(&qedf->dbg_ctx, "Could not upload all sessions.\n"); in qedf_ctx_soft_reset()
930 WARN_ON(atomic_read(&qedf->num_offloads)); in qedf_ctx_soft_reset()
934 qed_ops->common->get_link(qedf->cdev, &if_link); in qedf_ctx_soft_reset()
937 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
942 flush_delayed_work(&qedf->link_update); in qedf_ctx_soft_reset()
945 atomic_set(&qedf->link_state, QEDF_LINK_UP); in qedf_ctx_soft_reset()
946 qedf->vlan_id = 0; in qedf_ctx_soft_reset()
947 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_ctx_soft_reset()
949 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, in qedf_ctx_soft_reset()
959 lport = shost_priv(sc_cmd->device->host); in qedf_eh_host_reset()
962 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN || in qedf_eh_host_reset()
963 test_bit(QEDF_UNLOADING, &qedf->flags)) in qedf_eh_host_reset()
966 QEDF_ERR(&(qedf->dbg_ctx), "HOST RESET Issued..."); in qedf_eh_host_reset()
985 .this_id = -1,
1018 list_for_each_entry_rcu(fcport, &qedf->fcports, peers) { in qedf_fcport_lookup()
1019 rdata = fcport->rdata; in qedf_fcport_lookup()
1022 if (rdata->ids.port_id == port_id) { in qedf_fcport_lookup()
1040 if ((fh->fh_type == FC_TYPE_ELS) && in qedf_xmit_l2_frame()
1041 (fh->fh_r_ctl == FC_RCTL_ELS_REQ)) { in qedf_xmit_l2_frame()
1054 * qedf_xmit - qedf FCoE frame transmit function
1082 if (lport->vport) in qedf_xmit()
1083 base_lport = shost_priv(vport_to_shost(lport->vport)); in qedf_xmit()
1088 if (base_lport->port_id == ntoh24(fh->fh_d_id)) { in qedf_xmit()
1094 list_for_each_entry(tmp_lport, &base_lport->vports, list) { in qedf_xmit()
1095 if (tmp_lport->port_id == ntoh24(fh->fh_d_id)) { in qedf_xmit()
1101 if (vn_port && ntoh24(fh->fh_d_id) != FC_FID_FLOGI) { in qedf_xmit()
1104 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_xmit()
1105 "Dropping FCoE frame to %06x.\n", ntoh24(fh->fh_d_id)); in qedf_xmit()
1107 rdata = fc_rport_lookup(lport, ntoh24(fh->fh_d_id)); in qedf_xmit()
1109 rdata->retries = lport->max_rport_retry_count; in qedf_xmit()
1110 kref_put(&rdata->kref, fc_rport_destroy); in qedf_xmit()
1112 return -EINVAL; in qedf_xmit()
1116 if (!qedf->ctlr.sel_fcf) { in qedf_xmit()
1121 if (!test_bit(QEDF_LL2_STARTED, &qedf->flags)) { in qedf_xmit()
1122 QEDF_WARN(&(qedf->dbg_ctx), "LL2 not started\n"); in qedf_xmit()
1127 if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) { in qedf_xmit()
1128 QEDF_WARN(&(qedf->dbg_ctx), "qedf link down\n"); in qedf_xmit()
1133 if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ)) { in qedf_xmit()
1134 if (fcoe_ctlr_els_send(&qedf->ctlr, lport, skb)) in qedf_xmit()
1139 fcport = qedf_fcport_lookup(qedf, ntoh24(fh->fh_d_id)); in qedf_xmit()
1141 if (fcport && test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_xmit()
1157 wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE; in qedf_xmit()
1159 skb->ip_summed = CHECKSUM_NONE; in qedf_xmit()
1168 return -ENOMEM; in qedf_xmit()
1170 frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; in qedf_xmit()
1177 cp->fcoe_eof = eof; in qedf_xmit()
1178 cp->fcoe_crc32 = cpu_to_le32(~crc); in qedf_xmit()
1189 skb->mac_len = elen; in qedf_xmit()
1190 skb->protocol = htons(ETH_P_FCOE); in qedf_xmit()
1193 * Add VLAN tag to non-offload FCoE frame based on current stored VLAN in qedf_xmit()
1196 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), qedf->vlan_id); in qedf_xmit()
1200 eh->h_proto = htons(ETH_P_FCOE); in qedf_xmit()
1201 if (qedf->ctlr.map_dest) in qedf_xmit()
1202 fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id); in qedf_xmit()
1205 ether_addr_copy(eh->h_dest, qedf->ctlr.dest_addr); in qedf_xmit()
1208 ether_addr_copy(eh->h_source, qedf->data_src_addr); in qedf_xmit()
1214 hp->fcoe_sof = sof; in qedf_xmit()
1217 stats = per_cpu_ptr(lport->stats, get_cpu()); in qedf_xmit()
1218 stats->TxFrames++; in qedf_xmit()
1219 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()
1419 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Uploading connection " in qedf_upload_connection()
1420 "port_id=%06x.\n", fcport->rdata->ids.port_id); in qedf_upload_connection()
1422 qed_ops->destroy_conn(qedf->cdev, fcport->handle, term_params_dma); in qedf_upload_connection()
1423 qed_ops->release_conn(qedf->cdev, fcport->handle); in qedf_upload_connection()
1425 dma_free_coherent(&qedf->pdev->dev, QEDF_TERM_BUFF_SIZE, term_params, in qedf_upload_connection()
1432 struct fc_rport_priv *rdata = fcport->rdata; in qedf_cleanup_fcport()
1434 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_CONN, "Cleaning up portid=%06x.\n", in qedf_cleanup_fcport()
1435 fcport->rdata->ids.port_id); in qedf_cleanup_fcport()
1438 qedf_flush_active_ios(fcport, -1); in qedf_cleanup_fcport()
1440 if (test_and_clear_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) in qedf_cleanup_fcport()
1443 fcport->rdata = NULL; in qedf_cleanup_fcport()
1444 fcport->qedf = NULL; in qedf_cleanup_fcport()
1445 kref_put(&rdata->kref, fc_rport_destroy); in qedf_cleanup_fcport()
1458 struct fc_rport *rport = rdata->rport; in qedf_rport_event_handler()
1465 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "event = %d, " in qedf_rport_event_handler()
1466 "port_id = 0x%x\n", event, rdata->ids.port_id); in qedf_rport_event_handler()
1471 QEDF_WARN(&(qedf->dbg_ctx), "rport is NULL.\n"); in qedf_rport_event_handler()
1475 rp = rport->dd_data; in qedf_rport_event_handler()
1477 fcport->qedf = qedf; in qedf_rport_event_handler()
1479 if (atomic_read(&qedf->num_offloads) >= QEDF_MAX_SESSIONS) { in qedf_rport_event_handler()
1480 QEDF_ERR(&(qedf->dbg_ctx), "Not offloading " in qedf_rport_event_handler()
1482 "reached.\n", rdata->ids.port_id); in qedf_rport_event_handler()
1490 if (test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_rport_event_handler()
1491 QEDF_WARN(&(qedf->dbg_ctx), "Session already " in qedf_rport_event_handler()
1493 rdata->ids.port_id); in qedf_rport_event_handler()
1497 if (rport->port_id == FC_FID_DIR_SERV) { in qedf_rport_event_handler()
1504 QEDF_WARN(&(qedf->dbg_ctx), "rport struct does not " in qedf_rport_event_handler()
1506 rdata->ids.port_id); in qedf_rport_event_handler()
1510 if (rdata->spp_type != FC_TYPE_FCP) { in qedf_rport_event_handler()
1511 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1515 if (!(rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET)) { in qedf_rport_event_handler()
1516 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1522 kref_get(&rdata->kref); in qedf_rport_event_handler()
1523 fcport->rdata = rdata; in qedf_rport_event_handler()
1524 fcport->rport = rport; in qedf_rport_event_handler()
1533 if (rdata->flags & FC_RP_FLAGS_RETRY && in qedf_rport_event_handler()
1534 rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET && in qedf_rport_event_handler()
1535 !(rdata->ids.roles & FC_RPORT_ROLE_FCP_INITIATOR)) { in qedf_rport_event_handler()
1536 fcport->dev_type = QEDF_RPORT_TYPE_TAPE; in qedf_rport_event_handler()
1537 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1539 rdata->ids.port_id); in qedf_rport_event_handler()
1541 fcport->dev_type = QEDF_RPORT_TYPE_DISK; in qedf_rport_event_handler()
1551 spin_lock_irqsave(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1552 list_add_rcu(&fcport->peers, &qedf->fcports); in qedf_rport_event_handler()
1553 spin_unlock_irqrestore(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1559 set_bit(QEDF_RPORT_SESSION_READY, &fcport->flags); in qedf_rport_event_handler()
1560 atomic_inc(&qedf->num_offloads); in qedf_rport_event_handler()
1566 port_id = rdata->ids.port_id; in qedf_rport_event_handler()
1570 if (rdata->spp_type != FC_TYPE_FCP) { in qedf_rport_event_handler()
1571 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1575 if (!(rdata->ids.roles & FC_RPORT_ROLE_FCP_TARGET)) { in qedf_rport_event_handler()
1576 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1582 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_rport_event_handler()
1583 "port_id=%x - rport notcreated Yet!!\n", port_id); in qedf_rport_event_handler()
1586 rp = rport->dd_data; in qedf_rport_event_handler()
1588 * Perform session upload. Note that rdata->peers is already in qedf_rport_event_handler()
1589 * removed from disc->rports list before we get this event. in qedf_rport_event_handler()
1593 spin_lock_irqsave(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1595 if (test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags) && in qedf_rport_event_handler()
1597 &fcport->flags)) { in qedf_rport_event_handler()
1599 &fcport->flags); in qedf_rport_event_handler()
1600 spin_unlock_irqrestore(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1606 spin_lock_irqsave(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1607 list_del_rcu(&fcport->peers); in qedf_rport_event_handler()
1608 spin_unlock_irqrestore(&qedf->hba_lock, flags); in qedf_rport_event_handler()
1611 &fcport->flags); in qedf_rport_event_handler()
1612 atomic_dec(&qedf->num_offloads); in qedf_rport_event_handler()
1614 spin_unlock_irqrestore(&fcport->rport_lock, flags); in qedf_rport_event_handler()
1625 /* NO-OP but need to fill in the template */ in qedf_abort_io()
1631 * NO-OP but need to fill in template to prevent a NULL in qedf_fcp_cleanup()
1647 fcoe_ctlr_init(&qedf->ctlr, FIP_MODE_AUTO); in qedf_fcoe_ctlr_setup()
1649 qedf->ctlr.send = qedf_fip_send; in qedf_fcoe_ctlr_setup()
1650 qedf->ctlr.get_src_addr = qedf_get_src_mac; in qedf_fcoe_ctlr_setup()
1651 ether_addr_copy(qedf->ctlr.ctl_src_addr, qedf->mac); in qedf_fcoe_ctlr_setup()
1656 struct fc_lport *lport = qedf->lport; in qedf_setup_fdmi()
1665 lport->fdmi_enabled = 1; in qedf_setup_fdmi()
1672 /* Get the PCI-e Device Serial Number Capability */ in qedf_setup_fdmi()
1673 pos = pci_find_ext_capability(qedf->pdev, PCI_EXT_CAP_ID_DSN); in qedf_setup_fdmi()
1677 pci_read_config_byte(qedf->pdev, pos + i, &buf[i]); in qedf_setup_fdmi()
1679 snprintf(fc_host_serial_number(lport->host), in qedf_setup_fdmi()
1685 snprintf(fc_host_serial_number(lport->host), in qedf_setup_fdmi()
1688 snprintf(fc_host_manufacturer(lport->host), in qedf_setup_fdmi()
1691 if (qedf->pdev->device == QL45xxx) { in qedf_setup_fdmi()
1692 snprintf(fc_host_model(lport->host), in qedf_setup_fdmi()
1695 snprintf(fc_host_model_description(lport->host), in qedf_setup_fdmi()
1700 if (qedf->pdev->device == QL41xxx) { in qedf_setup_fdmi()
1701 snprintf(fc_host_model(lport->host), in qedf_setup_fdmi()
1704 snprintf(fc_host_model_description(lport->host), in qedf_setup_fdmi()
1709 snprintf(fc_host_hardware_version(lport->host), in qedf_setup_fdmi()
1710 FC_VERSION_STRING_SIZE, "Rev %d", qedf->pdev->revision); in qedf_setup_fdmi()
1712 snprintf(fc_host_driver_version(lport->host), in qedf_setup_fdmi()
1715 snprintf(fc_host_firmware_version(lport->host), in qedf_setup_fdmi()
1724 struct fc_lport *lport = qedf->lport; in qedf_lport_setup()
1726 lport->link_up = 0; in qedf_lport_setup()
1727 lport->max_retry_count = QEDF_FLOGI_RETRY_CNT; in qedf_lport_setup()
1728 lport->max_rport_retry_count = QEDF_RPORT_RETRY_CNT; in qedf_lport_setup()
1729 lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS | in qedf_lport_setup()
1731 lport->boot_time = jiffies; in qedf_lport_setup()
1732 lport->e_d_tov = 2 * 1000; in qedf_lport_setup()
1733 lport->r_a_tov = 10 * 1000; in qedf_lport_setup()
1736 lport->does_npiv = 1; in qedf_lport_setup()
1737 fc_host_max_npiv_vports(lport->host) = QEDF_MAX_NPIV; in qedf_lport_setup()
1739 fc_set_wwnn(lport, qedf->wwnn); in qedf_lport_setup()
1740 fc_set_wwpn(lport, qedf->wwpn); in qedf_lport_setup()
1742 if (fcoe_libfc_config(lport, &qedf->ctlr, &qedf_lport_template, 0)) { in qedf_lport_setup()
1743 QEDF_ERR(&qedf->dbg_ctx, in qedf_lport_setup()
1745 return -ENOMEM; in qedf_lport_setup()
1753 return -ENOMEM; in qedf_lport_setup()
1760 fc_host_maxframe_size(lport->host) = lport->mfs; in qedf_lport_setup()
1763 fc_host_dev_loss_tmo(lport->host) = qedf_dev_loss_tmo; in qedf_lport_setup()
1766 if (qedf->pdev->device == QL45xxx) in qedf_lport_setup()
1767 snprintf(fc_host_symbolic_name(lport->host), 256, in qedf_lport_setup()
1770 if (qedf->pdev->device == QL41xxx) in qedf_lport_setup()
1771 snprintf(fc_host_symbolic_name(lport->host), 256, in qedf_lport_setup()
1786 lport->link_up = 0; in qedf_vport_libfc_config()
1787 lport->qfull = 0; in qedf_vport_libfc_config()
1788 lport->max_retry_count = QEDF_FLOGI_RETRY_CNT; in qedf_vport_libfc_config()
1789 lport->max_rport_retry_count = QEDF_RPORT_RETRY_CNT; in qedf_vport_libfc_config()
1790 lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS | in qedf_vport_libfc_config()
1792 lport->boot_time = jiffies; in qedf_vport_libfc_config()
1793 lport->e_d_tov = 2 * 1000; in qedf_vport_libfc_config()
1794 lport->r_a_tov = 10 * 1000; in qedf_vport_libfc_config()
1795 lport->does_npiv = 1; /* Temporary until we add NPIV support */ in qedf_vport_libfc_config()
1799 return -ENOMEM; in qedf_vport_libfc_config()
1805 lport->crc_offload = 0; in qedf_vport_libfc_config()
1806 lport->seq_offload = 0; in qedf_vport_libfc_config()
1807 lport->lro_enabled = 0; in qedf_vport_libfc_config()
1808 lport->lro_xid = 0; in qedf_vport_libfc_config()
1809 lport->lso_max = 0; in qedf_vport_libfc_config()
1827 fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf)); in qedf_vport_create()
1828 QEDF_WARN(&(base_qedf->dbg_ctx), "Failed to create vport, " in qedf_vport_create()
1833 if (atomic_read(&base_qedf->link_state) != QEDF_LINK_UP) { in qedf_vport_create()
1834 QEDF_WARN(&(base_qedf->dbg_ctx), "Cannot create vport " in qedf_vport_create()
1836 return -EIO; in qedf_vport_create()
1841 QEDF_WARN(&(base_qedf->dbg_ctx), "Could not create lport " in qedf_vport_create()
1843 return -ENOMEM; in qedf_vport_create()
1846 fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf)); in qedf_vport_create()
1847 QEDF_ERR(&(base_qedf->dbg_ctx), "Creating NPIV port, WWPN=%s.\n", in qedf_vport_create()
1855 vport_qedf->lport = vn_port; in qedf_vport_create()
1857 vport_qedf->hba_lock = base_qedf->hba_lock; in qedf_vport_create()
1858 vport_qedf->pdev = base_qedf->pdev; in qedf_vport_create()
1859 vport_qedf->cmd_mgr = base_qedf->cmd_mgr; in qedf_vport_create()
1860 init_completion(&vport_qedf->flogi_compl); in qedf_vport_create()
1861 INIT_LIST_HEAD(&vport_qedf->fcports); in qedf_vport_create()
1862 INIT_DELAYED_WORK(&vport_qedf->stag_work, qedf_stag_change_work); in qedf_vport_create()
1866 QEDF_ERR(&(base_qedf->dbg_ctx), "Could not allocate memory " in qedf_vport_create()
1871 fc_set_wwnn(vn_port, vport->node_name); in qedf_vport_create()
1872 fc_set_wwpn(vn_port, vport->port_name); in qedf_vport_create()
1873 vport_qedf->wwnn = vn_port->wwnn; in qedf_vport_create()
1874 vport_qedf->wwpn = vn_port->wwpn; in qedf_vport_create()
1876 vn_port->host->transportt = qedf_fc_vport_transport_template; in qedf_vport_create()
1877 vn_port->host->can_queue = FCOE_PARAMS_NUM_TASKS; in qedf_vport_create()
1878 vn_port->host->max_lun = qedf_max_lun; in qedf_vport_create()
1879 vn_port->host->sg_tablesize = QEDF_MAX_BDS_PER_CMD; in qedf_vport_create()
1880 vn_port->host->max_cmd_len = QEDF_MAX_CDB_LEN; in qedf_vport_create()
1882 rc = scsi_add_host(vn_port->host, &vport->dev); in qedf_vport_create()
1884 QEDF_WARN(&base_qedf->dbg_ctx, in qedf_vport_create()
1890 fc_host_dev_loss_tmo(vn_port->host) = qedf_dev_loss_tmo; in qedf_vport_create()
1893 memcpy(&vn_port->tt, &qedf_lport_template, in qedf_vport_create()
1910 fc_host_port_type(vn_port->host) = FC_PORTTYPE_UNKNOWN; in qedf_vport_create()
1915 vn_port->boot_time = jiffies; in qedf_vport_create()
1921 if (base_qedf->pdev->device == QL45xxx) in qedf_vport_create()
1922 snprintf(fc_host_symbolic_name(vn_port->host), 256, in qedf_vport_create()
1925 if (base_qedf->pdev->device == QL41xxx) in qedf_vport_create()
1926 snprintf(fc_host_symbolic_name(vn_port->host), 256, in qedf_vport_create()
1930 fc_host_supported_speeds(vn_port->host) = n_port->link_supported_speeds; in qedf_vport_create()
1933 vn_port->link_speed = n_port->link_speed; in qedf_vport_create()
1936 fc_host_port_type(vn_port->host) = FC_PORTTYPE_NPIV; in qedf_vport_create()
1939 fc_host_maxframe_size(vn_port->host) = n_port->mfs; in qedf_vport_create()
1941 QEDF_INFO(&(base_qedf->dbg_ctx), QEDF_LOG_NPIV, "vn_port=%p.\n", in qedf_vport_create()
1945 vport_qedf->dbg_ctx.host_no = vn_port->host->host_no; in qedf_vport_create()
1946 vport_qedf->dbg_ctx.pdev = base_qedf->pdev; in qedf_vport_create()
1951 scsi_host_put(vn_port->host); in qedf_vport_create()
1959 struct fc_lport *vn_port = vport->dd_data; in qedf_vport_destroy()
1968 set_bit(QEDF_UNLOADING, &qedf->flags); in qedf_vport_destroy()
1970 mutex_lock(&n_port->lp_mutex); in qedf_vport_destroy()
1971 list_del(&vn_port->list); in qedf_vport_destroy()
1972 mutex_unlock(&n_port->lp_mutex); in qedf_vport_destroy()
1977 /* Detach from scsi-ml */ in qedf_vport_destroy()
1978 fc_remove_host(vn_port->host); in qedf_vport_destroy()
1979 scsi_remove_host(vn_port->host); in qedf_vport_destroy()
1985 if (vn_port->state == LPORT_ST_READY) in qedf_vport_destroy()
1992 scsi_host_put(vn_port->host); in qedf_vport_destroy()
2000 struct fc_lport *lport = vport->dd_data; in qedf_vport_disable()
2006 lport->boot_time = jiffies; in qedf_vport_disable()
2021 struct fc_host_attrs *fc_host = shost_to_fc_host(qedf->lport->host); in qedf_wait_for_vport_destroy()
2023 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_NPIV, in qedf_wait_for_vport_destroy()
2025 while (fc_host->npiv_vports_inuse > 0) { in qedf_wait_for_vport_destroy()
2026 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_NPIV, in qedf_wait_for_vport_destroy()
2033 * qedf_fcoe_reset - Resets the fcoe
2051 fc_host_port_id(shost) = lport->port_id; in qedf_get_host_port_id()
2065 if (lport->vport) in qedf_fc_get_host_stats()
2070 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate memory for " in qedf_fc_get_host_stats()
2075 mutex_lock(&qedf->stats_mutex); in qedf_fc_get_host_stats()
2078 qed_ops->get_stats(qedf->cdev, fw_fcoe_stats); in qedf_fc_get_host_stats()
2086 qedf_stats->tx_frames += fw_fcoe_stats->fcoe_tx_data_pkt_cnt + in qedf_fc_get_host_stats()
2087 fw_fcoe_stats->fcoe_tx_xfer_pkt_cnt + in qedf_fc_get_host_stats()
2088 fw_fcoe_stats->fcoe_tx_other_pkt_cnt; in qedf_fc_get_host_stats()
2089 qedf_stats->rx_frames += fw_fcoe_stats->fcoe_rx_data_pkt_cnt + in qedf_fc_get_host_stats()
2090 fw_fcoe_stats->fcoe_rx_xfer_pkt_cnt + in qedf_fc_get_host_stats()
2091 fw_fcoe_stats->fcoe_rx_other_pkt_cnt; in qedf_fc_get_host_stats()
2092 qedf_stats->fcp_input_megabytes += in qedf_fc_get_host_stats()
2093 do_div(fw_fcoe_stats->fcoe_rx_byte_cnt, 1000000); in qedf_fc_get_host_stats()
2094 qedf_stats->fcp_output_megabytes += in qedf_fc_get_host_stats()
2095 do_div(fw_fcoe_stats->fcoe_tx_byte_cnt, 1000000); in qedf_fc_get_host_stats()
2096 qedf_stats->rx_words += fw_fcoe_stats->fcoe_rx_byte_cnt / 4; in qedf_fc_get_host_stats()
2097 qedf_stats->tx_words += fw_fcoe_stats->fcoe_tx_byte_cnt / 4; in qedf_fc_get_host_stats()
2098 qedf_stats->invalid_crc_count += in qedf_fc_get_host_stats()
2099 fw_fcoe_stats->fcoe_silent_drop_pkt_crc_error_cnt; in qedf_fc_get_host_stats()
2100 qedf_stats->dumped_frames = in qedf_fc_get_host_stats()
2101 fw_fcoe_stats->fcoe_silent_drop_total_pkt_cnt; in qedf_fc_get_host_stats()
2102 qedf_stats->error_frames += in qedf_fc_get_host_stats()
2103 fw_fcoe_stats->fcoe_silent_drop_total_pkt_cnt; in qedf_fc_get_host_stats()
2104 qedf_stats->fcp_input_requests += qedf->input_requests; in qedf_fc_get_host_stats()
2105 qedf_stats->fcp_output_requests += qedf->output_requests; in qedf_fc_get_host_stats()
2106 qedf_stats->fcp_control_requests += qedf->control_requests; in qedf_fc_get_host_stats()
2107 qedf_stats->fcp_packet_aborts += qedf->packet_aborts; in qedf_fc_get_host_stats()
2108 qedf_stats->fcp_frame_alloc_failures += qedf->alloc_failures; in qedf_fc_get_host_stats()
2110 mutex_unlock(&qedf->stats_mutex); in qedf_fc_get_host_stats()
2188 struct qedf_ctx *qedf = fp->qedf; in qedf_fp_has_work()
2190 struct qed_sb_info *sb_info = fp->sb_info; in qedf_fp_has_work()
2191 struct status_block_e4 *sb = sb_info->sb_virt; in qedf_fp_has_work()
2195 que = qedf->global_queues[fp->sb_id]; in qedf_fp_has_work()
2201 prod_idx = sb->pi_array[QEDF_FCOE_PARAMS_GL_RQ_PI]; in qedf_fp_has_work()
2203 return (que->cq_prod_idx != prod_idx); in qedf_fp_has_work()
2210 /* Process completion queue and copy CQE contents for deferred processesing
2216 struct qedf_ctx *qedf = fp->qedf; in qedf_process_completions()
2217 struct qed_sb_info *sb_info = fp->sb_info; in qedf_process_completions()
2218 struct status_block_e4 *sb = sb_info->sb_virt; in qedf_process_completions()
2221 struct fcoe_cqe *cqe; in qedf_process_completions() local
2231 prod_idx = sb->pi_array[QEDF_FCOE_PARAMS_GL_RQ_PI]; in qedf_process_completions()
2234 que = qedf->global_queues[fp->sb_id]; in qedf_process_completions()
2237 new_cqes = (prod_idx >= que->cq_prod_idx) ? in qedf_process_completions()
2238 (prod_idx - que->cq_prod_idx) : in qedf_process_completions()
2239 0x10000 - que->cq_prod_idx + prod_idx; in qedf_process_completions()
2242 que->cq_prod_idx = prod_idx; in qedf_process_completions()
2245 fp->completions++; in qedf_process_completions()
2247 cqe = &que->cq[que->cq_cons_idx]; in qedf_process_completions()
2249 comp_type = (cqe->cqe_data >> FCOE_CQE_CQE_TYPE_SHIFT) & in qedf_process_completions()
2257 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_UNSOL, in qedf_process_completions()
2258 "Unsolicated CQE.\n"); in qedf_process_completions()
2259 qedf_process_unsol_compl(qedf, fp->sb_id, cqe); in qedf_process_completions()
2267 xid = cqe->cqe_data & FCOE_CQE_TASK_ID_MASK; in qedf_process_completions()
2268 io_req = &qedf->cmd_mgr->cmds[xid]; in qedf_process_completions()
2275 /* If there is not io_req assocated with this CQE in qedf_process_completions()
2280 cpu = io_req->cpu; in qedf_process_completions()
2281 io_req->int_cpu = smp_processor_id(); in qedf_process_completions()
2284 io_work = mempool_alloc(qedf->io_mempool, GFP_ATOMIC); in qedf_process_completions()
2286 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate " in qedf_process_completions()
2292 INIT_WORK(&io_work->work, qedf_fp_io_handler); in qedf_process_completions()
2294 /* Copy contents of CQE for deferred processing */ in qedf_process_completions()
2295 memcpy(&io_work->cqe, cqe, sizeof(struct fcoe_cqe)); in qedf_process_completions()
2297 io_work->qedf = fp->qedf; in qedf_process_completions()
2298 io_work->fp = NULL; /* Only used for unsolicited frames */ in qedf_process_completions()
2300 queue_work_on(cpu, qedf_io_wq, &io_work->work); in qedf_process_completions()
2303 que->cq_cons_idx++; in qedf_process_completions()
2304 if (que->cq_cons_idx == fp->cq_num_entries) in qedf_process_completions()
2305 que->cq_cons_idx = 0; in qedf_process_completions()
2306 new_cqes--; in qedf_process_completions()
2313 /* MSI-X fastpath handler code */
2322 if (!fp->sb_info) { in qedf_msix_handler()
2323 QEDF_ERR(NULL, "fp->sb_info in null."); in qedf_msix_handler()
2331 qed_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0 /*do not update*/); in qedf_msix_handler()
2338 qed_sb_update_sb_idx(fp->sb_info); in qedf_msix_handler()
2344 /* Re-enable interrupts */ in qedf_msix_handler()
2345 qed_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1); in qedf_msix_handler()
2361 QEDF_WARN(&(qedf->dbg_ctx), "qedf=%p.\n", qedf); in qedf_simd_int_handler()
2371 if (qedf->int_info.msix_cnt) { in qedf_sync_free_irqs()
2372 for (i = 0; i < qedf->int_info.used_cnt; i++) { in qedf_sync_free_irqs()
2373 vector_idx = i * qedf->dev_info.common.num_hwfns + in qedf_sync_free_irqs()
2374 qed_ops->common->get_affin_hwfn_idx(qedf->cdev); in qedf_sync_free_irqs()
2375 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_sync_free_irqs()
2378 vector = qedf->int_info.msix[vector_idx].vector; in qedf_sync_free_irqs()
2382 free_irq(vector, &qedf->fp_array[i]); in qedf_sync_free_irqs()
2385 qed_ops->common->simd_handler_clean(qedf->cdev, in qedf_sync_free_irqs()
2388 qedf->int_info.used_cnt = 0; in qedf_sync_free_irqs()
2389 qed_ops->common->set_fp_int(qedf->cdev, 0); in qedf_sync_free_irqs()
2399 for (i = 0; i < qedf->num_queues; i++) { in qedf_request_msix_irq()
2400 vector_idx = i * qedf->dev_info.common.num_hwfns + in qedf_request_msix_irq()
2401 qed_ops->common->get_affin_hwfn_idx(qedf->cdev); in qedf_request_msix_irq()
2402 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in qedf_request_msix_irq()
2405 vector = qedf->int_info.msix[vector_idx].vector; in qedf_request_msix_irq()
2407 &qedf->fp_array[i]); in qedf_request_msix_irq()
2410 QEDF_WARN(&(qedf->dbg_ctx), "request_irq failed.\n"); in qedf_request_msix_irq()
2415 qedf->int_info.used_cnt++; in qedf_request_msix_irq()
2430 rc = qed_ops->common->set_fp_int(qedf->cdev, num_online_cpus()); in qedf_setup_int()
2434 rc = qed_ops->common->get_fp_int(qedf->cdev, &qedf->int_info); in qedf_setup_int()
2438 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Number of msix_cnt = " in qedf_setup_int()
2439 "0x%x num of cpus = 0x%x\n", qedf->int_info.msix_cnt, in qedf_setup_int()
2442 if (qedf->int_info.msix_cnt) in qedf_setup_int()
2445 qed_ops->common->simd_handler_config(qedf->cdev, &qedf, in qedf_setup_int()
2447 qedf->int_info.used_cnt = 1; in qedf_setup_int()
2449 QEDF_ERR(&qedf->dbg_ctx, in qedf_setup_int()
2450 "Cannot load driver due to a lack of MSI-X vectors.\n"); in qedf_setup_int()
2451 return -EINVAL; in qedf_setup_int()
2470 lport = qedf->lport; in qedf_recv_frame()
2471 if (lport == NULL || lport->state == LPORT_ST_DISABLED) { in qedf_recv_frame()
2479 mac = eth_hdr(skb)->h_source; in qedf_recv_frame()
2480 dest_mac = eth_hdr(skb)->h_dest; in qedf_recv_frame()
2483 hp = (struct fcoe_hdr *)skb->data; in qedf_recv_frame()
2486 fr_len = skb->len - sizeof(struct fcoe_crc_eof); in qedf_recv_frame()
2491 fr_sof(fp) = hp->fcoe_sof; in qedf_recv_frame()
2511 if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA && in qedf_recv_frame()
2512 fh->fh_type == FC_TYPE_FCP) { in qedf_recv_frame()
2517 if (fh->fh_r_ctl == FC_RCTL_ELS_REQ && in qedf_recv_frame()
2518 fh->fh_type == FC_TYPE_ELS) { in qedf_recv_frame()
2521 if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) { in qedf_recv_frame()
2522 /* drop non-FIP LOGO */ in qedf_recv_frame()
2530 if (fh->fh_r_ctl == FC_RCTL_BA_ABTS) { in qedf_recv_frame()
2536 if (ntoh24(&dest_mac[3]) != ntoh24(fh->fh_d_id)) { in qedf_recv_frame()
2537 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2543 if (qedf->ctlr.state) { in qedf_recv_frame()
2544 if (!ether_addr_equal(mac, qedf->ctlr.dest_addr)) { in qedf_recv_frame()
2545 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2547 mac, qedf->ctlr.dest_addr); in qedf_recv_frame()
2553 vn_port = fc_vport_id_lookup(lport, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2560 if (lport->port_id != ntoh24(fh->fh_d_id) && !vn_port) { in qedf_recv_frame()
2561 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_recv_frame()
2562 "Dropping frame due to destination mismatch: lport->port_id=0x%x fh->d_id=0x%x.\n", in qedf_recv_frame()
2563 lport->port_id, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2568 f_ctl = ntoh24(fh->fh_f_ctl); in qedf_recv_frame()
2569 if ((fh->fh_type == FC_TYPE_BLS) && (f_ctl & FC_FC_SEQ_CTX) && in qedf_recv_frame()
2572 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_recv_frame()
2585 fcport = qedf_fcport_lookup(qedf, ntoh24(fh->fh_d_id)); in qedf_recv_frame()
2588 &fcport->flags)) { in qedf_recv_frame()
2589 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, in qedf_recv_frame()
2595 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FCoE frame receive: " in qedf_recv_frame()
2597 ntoh24(fh->fh_s_id), ntoh24(fh->fh_d_id), fh->fh_r_ctl, in qedf_recv_frame()
2598 fh->fh_type); in qedf_recv_frame()
2601 1, skb->data, skb->len, false); in qedf_recv_frame()
2609 struct qedf_ctx *qedf = skb_work->qedf; in qedf_ll2_process_skb()
2610 struct sk_buff *skb = skb_work->skb; in qedf_ll2_process_skb()
2618 eh = (struct ethhdr *)skb->data; in qedf_ll2_process_skb()
2621 if (eh->h_proto == htons(ETH_P_8021Q)) { in qedf_ll2_process_skb()
2632 if (eh->h_proto == htons(ETH_P_FIP)) { in qedf_ll2_process_skb()
2635 } else if (eh->h_proto == htons(ETH_P_FCOE)) { in qedf_ll2_process_skb()
2655 if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN) { in qedf_ll2_rx()
2656 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_LL2, in qedf_ll2_rx()
2664 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate skb_work so " in qedf_ll2_rx()
2670 INIT_WORK(&skb_work->work, qedf_ll2_process_skb); in qedf_ll2_rx()
2671 skb_work->skb = skb; in qedf_ll2_rx()
2672 skb_work->qedf = qedf; in qedf_ll2_rx()
2673 queue_work(qedf->ll2_recv_wq, &skb_work->work); in qedf_ll2_rx()
2691 * Deferred part of unsolicited CQE sends in qedf_fp_io_handler()
2694 comp_type = (io_work->cqe.cqe_data >> in qedf_fp_io_handler()
2698 io_work->fp) in qedf_fp_io_handler()
2699 fc_exch_recv(io_work->qedf->lport, io_work->fp); in qedf_fp_io_handler()
2701 qedf_process_cqe(io_work->qedf, &io_work->cqe); in qedf_fp_io_handler()
2713 sb_virt = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_and_init_sb()
2717 QEDF_ERR(&qedf->dbg_ctx, in qedf_alloc_and_init_sb()
2720 return -ENOMEM; in qedf_alloc_and_init_sb()
2723 ret = qed_ops->common->sb_init(qedf->cdev, sb_info, sb_virt, sb_phys, in qedf_alloc_and_init_sb()
2727 QEDF_ERR(&qedf->dbg_ctx, in qedf_alloc_and_init_sb()
2738 if (sb_info->sb_virt) in qedf_free_sb()
2739 dma_free_coherent(&qedf->pdev->dev, sizeof(*sb_info->sb_virt), in qedf_free_sb()
2740 (void *)sb_info->sb_virt, sb_info->sb_phys); in qedf_free_sb()
2748 for (id = 0; id < qedf->num_queues; id++) { in qedf_destroy_sb()
2749 fp = &(qedf->fp_array[id]); in qedf_destroy_sb()
2750 if (fp->sb_id == QEDF_SB_ID_NULL) in qedf_destroy_sb()
2752 qedf_free_sb(qedf, fp->sb_info); in qedf_destroy_sb()
2753 kfree(fp->sb_info); in qedf_destroy_sb()
2755 kfree(qedf->fp_array); in qedf_destroy_sb()
2764 qedf->fp_array = in qedf_prepare_sb()
2765 kcalloc(qedf->num_queues, sizeof(struct qedf_fastpath), in qedf_prepare_sb()
2768 if (!qedf->fp_array) { in qedf_prepare_sb()
2769 QEDF_ERR(&(qedf->dbg_ctx), "fastpath array allocation " in qedf_prepare_sb()
2771 return -ENOMEM; in qedf_prepare_sb()
2774 for (id = 0; id < qedf->num_queues; id++) { in qedf_prepare_sb()
2775 fp = &(qedf->fp_array[id]); in qedf_prepare_sb()
2776 fp->sb_id = QEDF_SB_ID_NULL; in qedf_prepare_sb()
2777 fp->sb_info = kcalloc(1, sizeof(*fp->sb_info), GFP_KERNEL); in qedf_prepare_sb()
2778 if (!fp->sb_info) { in qedf_prepare_sb()
2779 QEDF_ERR(&(qedf->dbg_ctx), "SB info struct " in qedf_prepare_sb()
2783 ret = qedf_alloc_and_init_sb(qedf, fp->sb_info, id); in qedf_prepare_sb()
2785 QEDF_ERR(&(qedf->dbg_ctx), "SB allocation and " in qedf_prepare_sb()
2789 fp->sb_id = id; in qedf_prepare_sb()
2790 fp->qedf = qedf; in qedf_prepare_sb()
2791 fp->cq_num_entries = in qedf_prepare_sb()
2792 qedf->global_queues[id]->cq_mem_size / in qedf_prepare_sb()
2799 void qedf_process_cqe(struct qedf_ctx *qedf, struct fcoe_cqe *cqe) in qedf_process_cqe() argument
2806 comp_type = (cqe->cqe_data >> FCOE_CQE_CQE_TYPE_SHIFT) & in qedf_process_cqe()
2809 xid = cqe->cqe_data & FCOE_CQE_TASK_ID_MASK; in qedf_process_cqe()
2810 io_req = &qedf->cmd_mgr->cmds[xid]; in qedf_process_cqe()
2814 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2819 fcport = io_req->fcport; in qedf_process_cqe()
2822 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2832 if (!test_bit(QEDF_RPORT_SESSION_READY, &fcport->flags)) { in qedf_process_cqe()
2833 QEDF_ERR(&qedf->dbg_ctx, in qedf_process_cqe()
2841 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2842 switch (io_req->cmd_type) { in qedf_process_cqe()
2844 qedf_scsi_completion(qedf, cqe, io_req); in qedf_process_cqe()
2847 qedf_process_els_compl(qedf, cqe, io_req); in qedf_process_cqe()
2850 qedf_process_tmf_compl(qedf, cqe, io_req); in qedf_process_cqe()
2853 qedf_process_seq_cleanup_compl(qedf, cqe, io_req); in qedf_process_cqe()
2858 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2859 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2860 "Error detect CQE.\n"); in qedf_process_cqe()
2861 qedf_process_error_detect(qedf, cqe, io_req); in qedf_process_cqe()
2864 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2865 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2866 "Cleanup CQE.\n"); in qedf_process_cqe()
2867 qedf_process_cleanup_compl(qedf, cqe, io_req); in qedf_process_cqe()
2870 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2871 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2872 "Abort CQE.\n"); in qedf_process_cqe()
2873 qedf_process_abts_compl(qedf, cqe, io_req); in qedf_process_cqe()
2876 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2877 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2878 "Dummy CQE.\n"); in qedf_process_cqe()
2881 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2882 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2883 "Local completion CQE.\n"); in qedf_process_cqe()
2886 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2887 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2888 "Warning CQE.\n"); in qedf_process_cqe()
2889 qedf_process_warning_compl(qedf, cqe, io_req); in qedf_process_cqe()
2892 atomic_inc(&fcport->free_sqes); in qedf_process_cqe()
2893 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2894 "Max FCoE CQE.\n"); in qedf_process_cqe()
2897 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, in qedf_process_cqe()
2898 "Default CQE.\n"); in qedf_process_cqe()
2907 if (qedf->bdq_pbl_list) in qedf_free_bdq()
2908 dma_free_coherent(&qedf->pdev->dev, QEDF_PAGE_SIZE, in qedf_free_bdq()
2909 qedf->bdq_pbl_list, qedf->bdq_pbl_list_dma); in qedf_free_bdq()
2911 if (qedf->bdq_pbl) in qedf_free_bdq()
2912 dma_free_coherent(&qedf->pdev->dev, qedf->bdq_pbl_mem_size, in qedf_free_bdq()
2913 qedf->bdq_pbl, qedf->bdq_pbl_dma); in qedf_free_bdq()
2916 if (qedf->bdq[i].buf_addr) { in qedf_free_bdq()
2917 dma_free_coherent(&qedf->pdev->dev, QEDF_BDQ_BUF_SIZE, in qedf_free_bdq()
2918 qedf->bdq[i].buf_addr, qedf->bdq[i].buf_dma); in qedf_free_bdq()
2926 struct global_queue **gl = qedf->global_queues; in qedf_free_global_queues()
2928 for (i = 0; i < qedf->num_queues; i++) { in qedf_free_global_queues()
2932 if (gl[i]->cq) in qedf_free_global_queues()
2933 dma_free_coherent(&qedf->pdev->dev, in qedf_free_global_queues()
2934 gl[i]->cq_mem_size, gl[i]->cq, gl[i]->cq_dma); in qedf_free_global_queues()
2935 if (gl[i]->cq_pbl) in qedf_free_global_queues()
2936 dma_free_coherent(&qedf->pdev->dev, gl[i]->cq_pbl_size, in qedf_free_global_queues()
2937 gl[i]->cq_pbl, gl[i]->cq_pbl_dma); in qedf_free_global_queues()
2954 qedf->bdq[i].buf_addr = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
2955 QEDF_BDQ_BUF_SIZE, &qedf->bdq[i].buf_dma, GFP_KERNEL); in qedf_alloc_bdq()
2956 if (!qedf->bdq[i].buf_addr) { in qedf_alloc_bdq()
2957 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate BDQ " in qedf_alloc_bdq()
2959 return -ENOMEM; in qedf_alloc_bdq()
2964 qedf->bdq_pbl_mem_size = in qedf_alloc_bdq()
2966 qedf->bdq_pbl_mem_size = in qedf_alloc_bdq()
2967 ALIGN(qedf->bdq_pbl_mem_size, QEDF_PAGE_SIZE); in qedf_alloc_bdq()
2969 qedf->bdq_pbl = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
2970 qedf->bdq_pbl_mem_size, &qedf->bdq_pbl_dma, GFP_KERNEL); in qedf_alloc_bdq()
2971 if (!qedf->bdq_pbl) { in qedf_alloc_bdq()
2972 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate BDQ PBL.\n"); in qedf_alloc_bdq()
2973 return -ENOMEM; in qedf_alloc_bdq()
2976 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_alloc_bdq()
2978 qedf->bdq_pbl, &qedf->bdq_pbl_dma); in qedf_alloc_bdq()
2984 pbl = (struct scsi_bd *)qedf->bdq_pbl; in qedf_alloc_bdq()
2986 pbl->address.hi = cpu_to_le32(U64_HI(qedf->bdq[i].buf_dma)); in qedf_alloc_bdq()
2987 pbl->address.lo = cpu_to_le32(U64_LO(qedf->bdq[i].buf_dma)); in qedf_alloc_bdq()
2988 pbl->opaque.fcoe_opaque.hi = 0; in qedf_alloc_bdq()
2990 pbl->opaque.fcoe_opaque.lo = cpu_to_le32(i); in qedf_alloc_bdq()
2995 qedf->bdq_pbl_list = dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_bdq()
2997 &qedf->bdq_pbl_list_dma, in qedf_alloc_bdq()
2999 if (!qedf->bdq_pbl_list) { in qedf_alloc_bdq()
3000 QEDF_ERR(&(qedf->dbg_ctx), "Could not allocate list of PBL pages.\n"); in qedf_alloc_bdq()
3001 return -ENOMEM; in qedf_alloc_bdq()
3008 qedf->bdq_pbl_list_num_entries = qedf->bdq_pbl_mem_size / in qedf_alloc_bdq()
3010 list = (u64 *)qedf->bdq_pbl_list; in qedf_alloc_bdq()
3011 page = qedf->bdq_pbl_list_dma; in qedf_alloc_bdq()
3012 for (i = 0; i < qedf->bdq_pbl_list_num_entries; i++) { in qedf_alloc_bdq()
3013 *list = qedf->bdq_pbl_dma; in qedf_alloc_bdq()
3035 if (!qedf->num_queues) { in qedf_alloc_global_queues()
3036 QEDF_ERR(&(qedf->dbg_ctx), "No MSI-X vectors available!\n"); in qedf_alloc_global_queues()
3037 return -ENOMEM; in qedf_alloc_global_queues()
3044 if (!qedf->p_cpuq) { in qedf_alloc_global_queues()
3045 status = -EINVAL; in qedf_alloc_global_queues()
3046 QEDF_ERR(&qedf->dbg_ctx, "p_cpuq is NULL.\n"); in qedf_alloc_global_queues()
3050 qedf->global_queues = kzalloc((sizeof(struct global_queue *) in qedf_alloc_global_queues()
3051 * qedf->num_queues), GFP_KERNEL); in qedf_alloc_global_queues()
3052 if (!qedf->global_queues) { in qedf_alloc_global_queues()
3053 QEDF_ERR(&(qedf->dbg_ctx), "Unable to allocate global " in qedf_alloc_global_queues()
3055 return -ENOMEM; in qedf_alloc_global_queues()
3057 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_alloc_global_queues()
3058 "qedf->global_queues=%p.\n", qedf->global_queues); in qedf_alloc_global_queues()
3063 QEDF_ERR(&qedf->dbg_ctx, "Unable to allocate bdq.\n"); in qedf_alloc_global_queues()
3067 /* Allocate a CQ and an associated PBL for each MSI-X vector */ in qedf_alloc_global_queues()
3068 for (i = 0; i < qedf->num_queues; i++) { in qedf_alloc_global_queues()
3069 qedf->global_queues[i] = kzalloc(sizeof(struct global_queue), in qedf_alloc_global_queues()
3071 if (!qedf->global_queues[i]) { in qedf_alloc_global_queues()
3072 QEDF_WARN(&(qedf->dbg_ctx), "Unable to allocate " in qedf_alloc_global_queues()
3074 status = -ENOMEM; in qedf_alloc_global_queues()
3078 qedf->global_queues[i]->cq_mem_size = in qedf_alloc_global_queues()
3080 qedf->global_queues[i]->cq_mem_size = in qedf_alloc_global_queues()
3081 ALIGN(qedf->global_queues[i]->cq_mem_size, QEDF_PAGE_SIZE); in qedf_alloc_global_queues()
3083 qedf->global_queues[i]->cq_pbl_size = in qedf_alloc_global_queues()
3084 (qedf->global_queues[i]->cq_mem_size / in qedf_alloc_global_queues()
3086 qedf->global_queues[i]->cq_pbl_size = in qedf_alloc_global_queues()
3087 ALIGN(qedf->global_queues[i]->cq_pbl_size, QEDF_PAGE_SIZE); in qedf_alloc_global_queues()
3089 qedf->global_queues[i]->cq = in qedf_alloc_global_queues()
3090 dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_global_queues()
3091 qedf->global_queues[i]->cq_mem_size, in qedf_alloc_global_queues()
3092 &qedf->global_queues[i]->cq_dma, in qedf_alloc_global_queues()
3095 if (!qedf->global_queues[i]->cq) { in qedf_alloc_global_queues()
3096 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate cq.\n"); in qedf_alloc_global_queues()
3097 status = -ENOMEM; in qedf_alloc_global_queues()
3101 qedf->global_queues[i]->cq_pbl = in qedf_alloc_global_queues()
3102 dma_alloc_coherent(&qedf->pdev->dev, in qedf_alloc_global_queues()
3103 qedf->global_queues[i]->cq_pbl_size, in qedf_alloc_global_queues()
3104 &qedf->global_queues[i]->cq_pbl_dma, in qedf_alloc_global_queues()
3107 if (!qedf->global_queues[i]->cq_pbl) { in qedf_alloc_global_queues()
3108 QEDF_WARN(&(qedf->dbg_ctx), "Could not allocate cq PBL.\n"); in qedf_alloc_global_queues()
3109 status = -ENOMEM; in qedf_alloc_global_queues()
3114 num_pages = qedf->global_queues[i]->cq_mem_size / in qedf_alloc_global_queues()
3116 page = qedf->global_queues[i]->cq_dma; in qedf_alloc_global_queues()
3117 pbl = (u32 *)qedf->global_queues[i]->cq_pbl; in qedf_alloc_global_queues()
3119 while (num_pages--) { in qedf_alloc_global_queues()
3127 qedf->global_queues[i]->cq_cons_idx = 0; in qedf_alloc_global_queues()
3130 list = (u32 *)qedf->p_cpuq; in qedf_alloc_global_queues()
3138 for (i = 0; i < qedf->num_queues; i++) { in qedf_alloc_global_queues()
3139 *list = U64_LO(qedf->global_queues[i]->cq_pbl_dma); in qedf_alloc_global_queues()
3141 *list = U64_HI(qedf->global_queues[i]->cq_pbl_dma); in qedf_alloc_global_queues()
3171 qedf->num_queues = MIN_NUM_CPUS_MSIX(qedf); in qedf_set_fcoe_pf_param()
3173 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Number of CQs is %d.\n", in qedf_set_fcoe_pf_param()
3174 qedf->num_queues); in qedf_set_fcoe_pf_param()
3176 qedf->p_cpuq = dma_alloc_coherent(&qedf->pdev->dev, in qedf_set_fcoe_pf_param()
3177 qedf->num_queues * sizeof(struct qedf_glbl_q_params), in qedf_set_fcoe_pf_param()
3178 &qedf->hw_p_cpuq, GFP_KERNEL); in qedf_set_fcoe_pf_param()
3180 if (!qedf->p_cpuq) { in qedf_set_fcoe_pf_param()
3181 QEDF_ERR(&(qedf->dbg_ctx), "dma_alloc_coherent failed.\n"); in qedf_set_fcoe_pf_param()
3187 QEDF_ERR(&(qedf->dbg_ctx), "Global queue allocation " in qedf_set_fcoe_pf_param()
3202 memset(&(qedf->pf_params), 0, sizeof(qedf->pf_params)); in qedf_set_fcoe_pf_param()
3205 qedf->pf_params.fcoe_pf_params.num_cons = QEDF_MAX_SESSIONS; in qedf_set_fcoe_pf_param()
3206 qedf->pf_params.fcoe_pf_params.num_tasks = FCOE_PARAMS_NUM_TASKS; in qedf_set_fcoe_pf_param()
3207 qedf->pf_params.fcoe_pf_params.glbl_q_params_addr = in qedf_set_fcoe_pf_param()
3208 (u64)qedf->hw_p_cpuq; in qedf_set_fcoe_pf_param()
3209 qedf->pf_params.fcoe_pf_params.sq_num_pbl_pages = sq_num_pbl_pages; in qedf_set_fcoe_pf_param()
3211 qedf->pf_params.fcoe_pf_params.rq_buffer_log_size = 0; in qedf_set_fcoe_pf_param()
3213 qedf->pf_params.fcoe_pf_params.cq_num_entries = cq_num_entries; in qedf_set_fcoe_pf_param()
3214 qedf->pf_params.fcoe_pf_params.num_cqs = qedf->num_queues; in qedf_set_fcoe_pf_param()
3217 qedf->pf_params.fcoe_pf_params.log_page_size = ilog2(QEDF_PAGE_SIZE); in qedf_set_fcoe_pf_param()
3219 qedf->pf_params.fcoe_pf_params.mtu = 9000; in qedf_set_fcoe_pf_param()
3220 qedf->pf_params.fcoe_pf_params.gl_rq_pi = QEDF_FCOE_PARAMS_GL_RQ_PI; in qedf_set_fcoe_pf_param()
3221 qedf->pf_params.fcoe_pf_params.gl_cmd_pi = QEDF_FCOE_PARAMS_GL_CMD_PI; in qedf_set_fcoe_pf_param()
3224 qedf->pf_params.fcoe_pf_params.bdq_pbl_base_addr[0] = in qedf_set_fcoe_pf_param()
3225 qedf->bdq_pbl_list_dma; in qedf_set_fcoe_pf_param()
3226 qedf->pf_params.fcoe_pf_params.bdq_pbl_num_entries[0] = in qedf_set_fcoe_pf_param()
3227 qedf->bdq_pbl_list_num_entries; in qedf_set_fcoe_pf_param()
3228 qedf->pf_params.fcoe_pf_params.rq_buffer_size = QEDF_BDQ_BUF_SIZE; in qedf_set_fcoe_pf_param()
3230 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_fcoe_pf_param()
3232 qedf->bdq_pbl_list, in qedf_set_fcoe_pf_param()
3233 qedf->pf_params.fcoe_pf_params.bdq_pbl_base_addr[0], in qedf_set_fcoe_pf_param()
3234 qedf->pf_params.fcoe_pf_params.bdq_pbl_num_entries[0]); in qedf_set_fcoe_pf_param()
3236 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in qedf_set_fcoe_pf_param()
3238 qedf->pf_params.fcoe_pf_params.cq_num_entries); in qedf_set_fcoe_pf_param()
3248 if (qedf->p_cpuq) { in qedf_free_fcoe_pf_param()
3249 size = qedf->num_queues * sizeof(struct qedf_glbl_q_params); in qedf_free_fcoe_pf_param()
3250 dma_free_coherent(&qedf->pdev->dev, size, qedf->p_cpuq, in qedf_free_fcoe_pf_param()
3251 qedf->hw_p_cpuq); in qedf_free_fcoe_pf_param()
3256 kfree(qedf->global_queues); in qedf_free_fcoe_pf_param()
3280 int rc = -EINVAL; in __qedf_probe()
3308 rc = -ENOMEM; in __qedf_probe()
3316 set_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3317 qedf->lport = lport; in __qedf_probe()
3318 qedf->ctlr.lp = lport; in __qedf_probe()
3319 qedf->pdev = pdev; in __qedf_probe()
3320 qedf->dbg_ctx.pdev = pdev; in __qedf_probe()
3321 qedf->dbg_ctx.host_no = lport->host->host_no; in __qedf_probe()
3322 spin_lock_init(&qedf->hba_lock); in __qedf_probe()
3323 INIT_LIST_HEAD(&qedf->fcports); in __qedf_probe()
3324 qedf->curr_conn_id = QEDF_MAX_SESSIONS - 1; in __qedf_probe()
3325 atomic_set(&qedf->num_offloads, 0); in __qedf_probe()
3326 qedf->stop_io_on_error = false; in __qedf_probe()
3328 init_completion(&qedf->fipvlan_compl); in __qedf_probe()
3329 mutex_init(&qedf->stats_mutex); in __qedf_probe()
3330 mutex_init(&qedf->flush_mutex); in __qedf_probe()
3331 qedf->flogi_pending = 0; in __qedf_probe()
3333 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, in __qedf_probe()
3341 set_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3342 lport = qedf->lport; in __qedf_probe()
3345 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe started.\n"); in __qedf_probe()
3347 host = lport->host; in __qedf_probe()
3350 qedf->io_mempool = mempool_create_slab_pool(QEDF_IO_WORK_MIN, in __qedf_probe()
3352 if (qedf->io_mempool == NULL) { in __qedf_probe()
3353 QEDF_ERR(&(qedf->dbg_ctx), "qedf->io_mempool is NULL.\n"); in __qedf_probe()
3356 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, "qedf->io_mempool=%p.\n", in __qedf_probe()
3357 qedf->io_mempool); in __qedf_probe()
3360 qedf->lport->host->host_no); in __qedf_probe()
3361 qedf->link_update_wq = create_workqueue(host_buf); in __qedf_probe()
3362 INIT_DELAYED_WORK(&qedf->link_update, qedf_handle_link_update); in __qedf_probe()
3363 INIT_DELAYED_WORK(&qedf->link_recovery, qedf_link_recovery); in __qedf_probe()
3364 INIT_DELAYED_WORK(&qedf->grcdump_work, qedf_wq_grcdump); in __qedf_probe()
3365 INIT_DELAYED_WORK(&qedf->stag_work, qedf_stag_change_work); in __qedf_probe()
3366 qedf->fipvlan_retries = qedf_fipvlan_retries; in __qedf_probe()
3368 if (qedf_default_prio > -1) { in __qedf_probe()
3373 qedf->prio = qedf_default_prio; in __qedf_probe()
3375 qedf->prio = QEDF_DEFAULT_PRIO; in __qedf_probe()
3386 qedf->cdev = qed_ops->common->probe(pdev, &qed_params); in __qedf_probe()
3387 if (!qedf->cdev) { in __qedf_probe()
3389 QEDF_ERR(&qedf->dbg_ctx, in __qedf_probe()
3391 retry_cnt--; in __qedf_probe()
3394 QEDF_ERR(&qedf->dbg_ctx, "common probe failed.\n"); in __qedf_probe()
3395 rc = -ENODEV; in __qedf_probe()
3400 rc = qed_ops->fill_dev_info(qedf->cdev, &qedf->dev_info); in __qedf_probe()
3402 QEDF_ERR(&(qedf->dbg_ctx), "Failed to dev info.\n"); in __qedf_probe()
3406 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, in __qedf_probe()
3408 qedf->dev_info.common.num_hwfns, in __qedf_probe()
3409 qed_ops->common->get_affin_hwfn_idx(qedf->cdev)); in __qedf_probe()
3421 QEDF_ERR(&(qedf->dbg_ctx), "Cannot set fcoe pf param.\n"); in __qedf_probe()
3424 qed_ops->common->update_pf_params(qedf->cdev, &qedf->pf_params); in __qedf_probe()
3427 rc = qed_ops->fill_dev_info(qedf->cdev, &qedf->dev_info); in __qedf_probe()
3429 QEDF_ERR(&qedf->dbg_ctx, "Failed to fill dev info.\n"); in __qedf_probe()
3434 qedf->bdq_primary_prod = qedf->dev_info.primary_dbq_rq_addr; in __qedf_probe()
3435 qedf->bdq_secondary_prod = qedf->dev_info.secondary_bdq_rq_addr; in __qedf_probe()
3436 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3437 "BDQ primary_prod=%p secondary_prod=%p.\n", qedf->bdq_primary_prod, in __qedf_probe()
3438 qedf->bdq_secondary_prod); in __qedf_probe()
3440 qed_ops->register_ops(qedf->cdev, &qedf_cb_ops, qedf); in __qedf_probe()
3445 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start slowpath.\n"); in __qedf_probe()
3449 /* Start the Slowpath-process */ in __qedf_probe()
3456 rc = qed_ops->common->slowpath_start(qedf->cdev, &slowpath_params); in __qedf_probe()
3458 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start slowpath.\n"); in __qedf_probe()
3466 qed_ops->common->update_pf_params(qedf->cdev, &qedf->pf_params); in __qedf_probe()
3471 QEDF_ERR(&qedf->dbg_ctx, "Setup interrupts failed.\n"); in __qedf_probe()
3475 rc = qed_ops->start(qedf->cdev, &qedf->tasks); in __qedf_probe()
3477 QEDF_ERR(&(qedf->dbg_ctx), "Cannot start FCoE function.\n"); in __qedf_probe()
3480 task_start = qedf_get_task_mem(&qedf->tasks, 0); in __qedf_probe()
3481 task_end = qedf_get_task_mem(&qedf->tasks, MAX_TID_BLOCKS_FCOE - 1); in __qedf_probe()
3482 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Task context start=%p, " in __qedf_probe()
3484 qedf->tasks.size); in __qedf_probe()
3488 * the f/w will do a prefetch and we'll get an unsolicited CQE when a in __qedf_probe()
3491 qedf->bdq_prod_idx = QEDF_BDQ_SIZE; in __qedf_probe()
3492 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3494 qedf->bdq_prod_idx); in __qedf_probe()
3495 writew(qedf->bdq_prod_idx, qedf->bdq_primary_prod); in __qedf_probe()
3496 readw(qedf->bdq_primary_prod); in __qedf_probe()
3497 writew(qedf->bdq_prod_idx, qedf->bdq_secondary_prod); in __qedf_probe()
3498 readw(qedf->bdq_secondary_prod); in __qedf_probe()
3500 qed_ops->common->set_power_state(qedf->cdev, PCI_D0); in __qedf_probe()
3505 ether_addr_copy(qedf->mac, qedf->dev_info.common.hw_mac); in __qedf_probe()
3506 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "MAC address is %pM.\n", in __qedf_probe()
3507 qedf->mac); in __qedf_probe()
3512 * If the info we get from qed is non-zero then use that to set the in __qedf_probe()
3516 if (qedf->dev_info.wwnn != 0 && qedf->dev_info.wwpn != 0) { in __qedf_probe()
3517 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3519 qedf->wwnn = qedf->dev_info.wwnn; in __qedf_probe()
3520 qedf->wwpn = qedf->dev_info.wwpn; in __qedf_probe()
3522 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3524 qedf->wwnn = fcoe_wwn_from_mac(qedf->mac, 1, 0); in __qedf_probe()
3525 qedf->wwpn = fcoe_wwn_from_mac(qedf->mac, 2, 0); in __qedf_probe()
3527 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "WWNN=%016llx " in __qedf_probe()
3528 "WWPN=%016llx.\n", qedf->wwnn, qedf->wwpn); in __qedf_probe()
3530 sprintf(host_buf, "host_%d", host->host_no); in __qedf_probe()
3531 qed_ops->common->set_name(qedf->cdev, host_buf); in __qedf_probe()
3534 qedf->cmd_mgr = qedf_cmd_mgr_alloc(qedf); in __qedf_probe()
3535 if (!qedf->cmd_mgr) { in __qedf_probe()
3536 QEDF_ERR(&(qedf->dbg_ctx), "Failed to allocate cmd mgr.\n"); in __qedf_probe()
3537 rc = -ENOMEM; in __qedf_probe()
3542 host->transportt = qedf_fc_transport_template; in __qedf_probe()
3543 host->max_lun = qedf_max_lun; in __qedf_probe()
3544 host->max_cmd_len = QEDF_MAX_CDB_LEN; in __qedf_probe()
3545 host->can_queue = FCOE_PARAMS_NUM_TASKS; in __qedf_probe()
3546 rc = scsi_add_host(host, &pdev->dev); in __qedf_probe()
3548 QEDF_WARN(&qedf->dbg_ctx, in __qedf_probe()
3556 ether_addr_copy(params.ll2_mac_address, qedf->mac); in __qedf_probe()
3559 snprintf(host_buf, 20, "qedf_%d_ll2", host->host_no); in __qedf_probe()
3560 qedf->ll2_recv_wq = in __qedf_probe()
3562 if (!qedf->ll2_recv_wq) { in __qedf_probe()
3563 QEDF_ERR(&(qedf->dbg_ctx), "Failed to LL2 workqueue.\n"); in __qedf_probe()
3564 rc = -ENOMEM; in __qedf_probe()
3569 qedf_dbg_host_init(&(qedf->dbg_ctx), qedf_debugfs_ops, in __qedf_probe()
3574 qed_ops->ll2->register_cb_ops(qedf->cdev, &qedf_ll2_cb_ops, qedf); in __qedf_probe()
3575 rc = qed_ops->ll2->start(qedf->cdev, &params); in __qedf_probe()
3577 QEDF_ERR(&(qedf->dbg_ctx), "Could not start Light L2.\n"); in __qedf_probe()
3580 set_bit(QEDF_LL2_STARTED, &qedf->flags); in __qedf_probe()
3583 qedf->vlan_id = 0; in __qedf_probe()
3596 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3602 sprintf(host_buf, "qedf_%u_timer", qedf->lport->host->host_no); in __qedf_probe()
3603 qedf->timer_work_queue = in __qedf_probe()
3605 if (!qedf->timer_work_queue) { in __qedf_probe()
3606 QEDF_ERR(&(qedf->dbg_ctx), "Failed to start timer " in __qedf_probe()
3608 rc = -ENOMEM; in __qedf_probe()
3615 qedf->lport->host->host_no); in __qedf_probe()
3616 qedf->dpc_wq = create_workqueue(host_buf); in __qedf_probe()
3618 INIT_DELAYED_WORK(&qedf->recovery_work, qedf_recovery_handler); in __qedf_probe()
3625 qedf->grcdump_size = in __qedf_probe()
3626 qed_ops->common->dbg_all_data_size(qedf->cdev); in __qedf_probe()
3627 if (qedf->grcdump_size) { in __qedf_probe()
3628 rc = qedf_alloc_grc_dump_buf(&qedf->grcdump, in __qedf_probe()
3629 qedf->grcdump_size); in __qedf_probe()
3631 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3633 qedf->grcdump = NULL; in __qedf_probe()
3636 QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, in __qedf_probe()
3638 qedf->grcdump, qedf->grcdump_size); in __qedf_probe()
3643 spin_lock_init(&qedf->io_trace_lock); in __qedf_probe()
3644 qedf->io_trace_idx = 0; in __qedf_probe()
3647 init_completion(&qedf->flogi_compl); in __qedf_probe()
3649 status = qed_ops->common->update_drv_state(qedf->cdev, true); in __qedf_probe()
3651 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_probe()
3656 status = qed_ops->common->set_link(qedf->cdev, &link_params); in __qedf_probe()
3658 QEDF_WARN(&(qedf->dbg_ctx), "set_link failed.\n"); in __qedf_probe()
3662 fcoe_ctlr_link_up(&qedf->ctlr); in __qedf_probe()
3666 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); in __qedf_probe()
3668 clear_bit(QEDF_PROBING, &qedf->flags); in __qedf_probe()
3674 if (qedf->ll2_recv_wq) in __qedf_probe()
3675 destroy_workqueue(qedf->ll2_recv_wq); in __qedf_probe()
3676 fc_remove_host(qedf->lport->host); in __qedf_probe()
3677 scsi_remove_host(qedf->lport->host); in __qedf_probe()
3679 qedf_dbg_host_exit(&(qedf->dbg_ctx)); in __qedf_probe()
3682 qedf_cmd_mgr_free(qedf->cmd_mgr); in __qedf_probe()
3684 qed_ops->stop(qedf->cdev); in __qedf_probe()
3689 qed_ops->common->slowpath_stop(qedf->cdev); in __qedf_probe()
3691 qed_ops->common->remove(qedf->cdev); in __qedf_probe()
3693 scsi_host_put(lport->host); in __qedf_probe()
3719 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { in __qedf_remove()
3720 QEDF_ERR(&qedf->dbg_ctx, "Already removing PCI function.\n"); in __qedf_remove()
3725 set_bit(QEDF_UNLOADING, &qedf->flags); in __qedf_remove()
3729 fcoe_ctlr_link_down(&qedf->ctlr); in __qedf_remove()
3731 fc_fabric_logoff(qedf->lport); in __qedf_remove()
3734 QEDF_ERR(&qedf->dbg_ctx, "Could not upload all sessions.\n"); in __qedf_remove()
3737 qedf_dbg_host_exit(&(qedf->dbg_ctx)); in __qedf_remove()
3741 cancel_delayed_work_sync(&qedf->link_update); in __qedf_remove()
3742 destroy_workqueue(qedf->link_update_wq); in __qedf_remove()
3743 qedf->link_update_wq = NULL; in __qedf_remove()
3745 if (qedf->timer_work_queue) in __qedf_remove()
3746 destroy_workqueue(qedf->timer_work_queue); in __qedf_remove()
3749 clear_bit(QEDF_LL2_STARTED, &qedf->flags); in __qedf_remove()
3750 qed_ops->ll2->stop(qedf->cdev); in __qedf_remove()
3751 if (qedf->ll2_recv_wq) in __qedf_remove()
3752 destroy_workqueue(qedf->ll2_recv_wq); in __qedf_remove()
3763 qedf_free_grc_dump_buf(&qedf->grcdump); in __qedf_remove()
3767 fcoe_ctlr_destroy(&qedf->ctlr); in __qedf_remove()
3768 fc_lport_destroy(qedf->lport); in __qedf_remove()
3769 fc_remove_host(qedf->lport->host); in __qedf_remove()
3770 scsi_remove_host(qedf->lport->host); in __qedf_remove()
3773 qedf_cmd_mgr_free(qedf->cmd_mgr); in __qedf_remove()
3776 fc_exch_mgr_free(qedf->lport); in __qedf_remove()
3777 fc_lport_free_stats(qedf->lport); in __qedf_remove()
3787 qed_ops->stop(qedf->cdev); in __qedf_remove()
3790 if (qedf->dpc_wq) { in __qedf_remove()
3792 destroy_workqueue(qedf->dpc_wq); in __qedf_remove()
3793 qedf->dpc_wq = NULL; in __qedf_remove()
3800 qed_ops->common->set_power_state(qedf->cdev, PCI_D0); in __qedf_remove()
3804 rc = qed_ops->common->update_drv_state(qedf->cdev, false); in __qedf_remove()
3806 QEDF_ERR(&(qedf->dbg_ctx), in __qedf_remove()
3809 qed_ops->common->slowpath_stop(qedf->cdev); in __qedf_remove()
3810 qed_ops->common->remove(qedf->cdev); in __qedf_remove()
3812 mempool_destroy(qedf->io_mempool); in __qedf_remove()
3816 scsi_host_put(qedf->lport->host); in __qedf_remove()
3822 if (!atomic_read(&pdev->enable_cnt)) in qedf_remove()
3833 QEDF_ERR(&(qedf->dbg_ctx), "Collecting GRC dump.\n"); in qedf_wq_grcdump()
3841 QEDF_ERR(&(qedf->dbg_ctx), in qedf_schedule_hw_err_handler()
3845 if (test_bit(QEDF_IN_RECOVERY, &qedf->flags)) { in qedf_schedule_hw_err_handler()
3846 QEDF_ERR(&(qedf->dbg_ctx), in qedf_schedule_hw_err_handler()
3853 schedule_delayed_work(&qedf->board_disable_work, 0); in qedf_schedule_hw_err_handler()
3860 qed_ops->common->attn_clr_enable(qedf->cdev, true); in qedf_schedule_hw_err_handler()
3864 qed_ops->common->attn_clr_enable(qedf->cdev, true); in qedf_schedule_hw_err_handler()
3867 qed_ops->common->recovery_process(qedf->cdev); in qedf_schedule_hw_err_handler()
3892 if (test_bit(QEDF_PROBING, &qedf->flags)) { in qedf_get_protocol_tlv_data()
3893 QEDF_ERR(&qedf->dbg_ctx, "Function is still probing.\n"); in qedf_get_protocol_tlv_data()
3897 lport = qedf->lport; in qedf_get_protocol_tlv_data()
3898 host = lport->host; in qedf_get_protocol_tlv_data()
3904 fcoe->qos_pri_set = true; in qedf_get_protocol_tlv_data()
3905 fcoe->qos_pri = 3; /* Hard coded to 3 in driver */ in qedf_get_protocol_tlv_data()
3907 fcoe->ra_tov_set = true; in qedf_get_protocol_tlv_data()
3908 fcoe->ra_tov = lport->r_a_tov; in qedf_get_protocol_tlv_data()
3910 fcoe->ed_tov_set = true; in qedf_get_protocol_tlv_data()
3911 fcoe->ed_tov = lport->e_d_tov; in qedf_get_protocol_tlv_data()
3913 fcoe->npiv_state_set = true; in qedf_get_protocol_tlv_data()
3914 fcoe->npiv_state = 1; /* NPIV always enabled */ in qedf_get_protocol_tlv_data()
3916 fcoe->num_npiv_ids_set = true; in qedf_get_protocol_tlv_data()
3917 fcoe->num_npiv_ids = fc_host->npiv_vports_inuse; in qedf_get_protocol_tlv_data()
3920 if (qedf->ctlr.sel_fcf) { in qedf_get_protocol_tlv_data()
3921 fcoe->switch_name_set = true; in qedf_get_protocol_tlv_data()
3922 u64_to_wwn(qedf->ctlr.sel_fcf->switch_name, fcoe->switch_name); in qedf_get_protocol_tlv_data()
3925 fcoe->port_state_set = true; in qedf_get_protocol_tlv_data()
3927 if (lport->link_up) in qedf_get_protocol_tlv_data()
3928 fcoe->port_state = QED_MFW_TLV_PORT_STATE_FABRIC; in qedf_get_protocol_tlv_data()
3930 fcoe->port_state = QED_MFW_TLV_PORT_STATE_OFFLINE; in qedf_get_protocol_tlv_data()
3932 fcoe->link_failures_set = true; in qedf_get_protocol_tlv_data()
3933 fcoe->link_failures = (u16)hst->link_failure_count; in qedf_get_protocol_tlv_data()
3935 fcoe->fcoe_txq_depth_set = true; in qedf_get_protocol_tlv_data()
3936 fcoe->fcoe_rxq_depth_set = true; in qedf_get_protocol_tlv_data()
3937 fcoe->fcoe_rxq_depth = FCOE_PARAMS_NUM_TASKS; in qedf_get_protocol_tlv_data()
3938 fcoe->fcoe_txq_depth = FCOE_PARAMS_NUM_TASKS; in qedf_get_protocol_tlv_data()
3940 fcoe->fcoe_rx_frames_set = true; in qedf_get_protocol_tlv_data()
3941 fcoe->fcoe_rx_frames = hst->rx_frames; in qedf_get_protocol_tlv_data()
3943 fcoe->fcoe_tx_frames_set = true; in qedf_get_protocol_tlv_data()
3944 fcoe->fcoe_tx_frames = hst->tx_frames; in qedf_get_protocol_tlv_data()
3946 fcoe->fcoe_rx_bytes_set = true; in qedf_get_protocol_tlv_data()
3947 fcoe->fcoe_rx_bytes = hst->fcp_input_megabytes * 1000000; in qedf_get_protocol_tlv_data()
3949 fcoe->fcoe_tx_bytes_set = true; in qedf_get_protocol_tlv_data()
3950 fcoe->fcoe_tx_bytes = hst->fcp_output_megabytes * 1000000; in qedf_get_protocol_tlv_data()
3952 fcoe->crc_count_set = true; in qedf_get_protocol_tlv_data()
3953 fcoe->crc_count = hst->invalid_crc_count; in qedf_get_protocol_tlv_data()
3955 fcoe->tx_abts_set = true; in qedf_get_protocol_tlv_data()
3956 fcoe->tx_abts = hst->fcp_packet_aborts; in qedf_get_protocol_tlv_data()
3958 fcoe->tx_lun_rst_set = true; in qedf_get_protocol_tlv_data()
3959 fcoe->tx_lun_rst = qedf->lun_resets; in qedf_get_protocol_tlv_data()
3961 fcoe->abort_task_sets_set = true; in qedf_get_protocol_tlv_data()
3962 fcoe->abort_task_sets = qedf->packet_aborts; in qedf_get_protocol_tlv_data()
3964 fcoe->scsi_busy_set = true; in qedf_get_protocol_tlv_data()
3965 fcoe->scsi_busy = qedf->busy; in qedf_get_protocol_tlv_data()
3967 fcoe->scsi_tsk_full_set = true; in qedf_get_protocol_tlv_data()
3968 fcoe->scsi_tsk_full = qedf->task_set_fulls; in qedf_get_protocol_tlv_data()
3981 QEDF_ERR(&qedf->dbg_ctx, "Performing software context reset.\n"); in qedf_stag_change_work()
3982 qedf_ctx_soft_reset(qedf->lport); in qedf_stag_change_work()
3997 QEDF_ERR(&qedf->dbg_ctx, "Recovery handler scheduled.\n"); in qedf_schedule_recovery_handler()
3998 schedule_delayed_work(&qedf->recovery_work, 0); in qedf_schedule_recovery_handler()
4006 if (test_and_set_bit(QEDF_IN_RECOVERY, &qedf->flags)) in qedf_recovery_handler()
4010 * Call common_ops->recovery_prolog to allow the MFW to quiesce in qedf_recovery_handler()
4013 qed_ops->common->recovery_prolog(qedf->cdev); in qedf_recovery_handler()
4015 QEDF_ERR(&qedf->dbg_ctx, "Recovery work start.\n"); in qedf_recovery_handler()
4016 __qedf_remove(qedf->pdev, QEDF_MODE_RECOVERY); in qedf_recovery_handler()
4022 atomic_set(&qedf->link_state, QEDF_LINK_DOWN); in qedf_recovery_handler()
4023 atomic_set(&qedf->dcbx, QEDF_DCBX_PENDING); in qedf_recovery_handler()
4024 __qedf_probe(qedf->pdev, QEDF_MODE_RECOVERY); in qedf_recovery_handler()
4025 clear_bit(QEDF_IN_RECOVERY, &qedf->flags); in qedf_recovery_handler()
4026 QEDF_ERR(&qedf->dbg_ctx, "Recovery work complete.\n"); in qedf_recovery_handler()
4042 ether_addr_copy(data->mac[0], qedf->mac); in qedf_get_generic_tlv_data()
4061 if (qedf_default_prio > -1) in qedf_init()
4135 return -EINVAL; in qedf_init()