162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB 262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2021 Intel Corporation */ 362306a36Sopenharmony_ci#include "main.h" 462306a36Sopenharmony_ci#include "../../../net/ethernet/intel/ice/ice.h" 562306a36Sopenharmony_ci 662306a36Sopenharmony_ciMODULE_ALIAS("i40iw"); 762306a36Sopenharmony_ciMODULE_AUTHOR("Intel Corporation, <e1000-rdma@lists.sourceforge.net>"); 862306a36Sopenharmony_ciMODULE_DESCRIPTION("Intel(R) Ethernet Protocol Driver for RDMA"); 962306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistatic struct notifier_block irdma_inetaddr_notifier = { 1262306a36Sopenharmony_ci .notifier_call = irdma_inetaddr_event 1362306a36Sopenharmony_ci}; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic struct notifier_block irdma_inetaddr6_notifier = { 1662306a36Sopenharmony_ci .notifier_call = irdma_inet6addr_event 1762306a36Sopenharmony_ci}; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic struct notifier_block irdma_net_notifier = { 2062306a36Sopenharmony_ci .notifier_call = irdma_net_event 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic struct notifier_block irdma_netdevice_notifier = { 2462306a36Sopenharmony_ci .notifier_call = irdma_netdevice_event 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic void irdma_register_notifiers(void) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci register_inetaddr_notifier(&irdma_inetaddr_notifier); 3062306a36Sopenharmony_ci register_inet6addr_notifier(&irdma_inetaddr6_notifier); 3162306a36Sopenharmony_ci register_netevent_notifier(&irdma_net_notifier); 3262306a36Sopenharmony_ci register_netdevice_notifier(&irdma_netdevice_notifier); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic void irdma_unregister_notifiers(void) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci unregister_netevent_notifier(&irdma_net_notifier); 3862306a36Sopenharmony_ci unregister_inetaddr_notifier(&irdma_inetaddr_notifier); 3962306a36Sopenharmony_ci unregister_inet6addr_notifier(&irdma_inetaddr6_notifier); 4062306a36Sopenharmony_ci unregister_netdevice_notifier(&irdma_netdevice_notifier); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic void irdma_prep_tc_change(struct irdma_device *iwdev) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci iwdev->vsi.tc_change_pending = true; 4662306a36Sopenharmony_ci irdma_sc_suspend_resume_qps(&iwdev->vsi, IRDMA_OP_SUSPEND); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci /* Wait for all qp's to suspend */ 4962306a36Sopenharmony_ci wait_event_timeout(iwdev->suspend_wq, 5062306a36Sopenharmony_ci !atomic_read(&iwdev->vsi.qp_suspend_reqs), 5162306a36Sopenharmony_ci msecs_to_jiffies(IRDMA_EVENT_TIMEOUT_MS)); 5262306a36Sopenharmony_ci irdma_ws_reset(&iwdev->vsi); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic void irdma_log_invalid_mtu(u16 mtu, struct irdma_sc_dev *dev) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci if (mtu < IRDMA_MIN_MTU_IPV4) 5862306a36Sopenharmony_ci ibdev_warn(to_ibdev(dev), "MTU setting [%d] too low for RDMA traffic. Minimum MTU is 576 for IPv4\n", mtu); 5962306a36Sopenharmony_ci else if (mtu < IRDMA_MIN_MTU_IPV6) 6062306a36Sopenharmony_ci ibdev_warn(to_ibdev(dev), "MTU setting [%d] too low for RDMA traffic. Minimum MTU is 1280 for IPv6\\n", mtu); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic void irdma_fill_qos_info(struct irdma_l2params *l2params, 6462306a36Sopenharmony_ci struct iidc_qos_params *qos_info) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci int i; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci l2params->num_tc = qos_info->num_tc; 6962306a36Sopenharmony_ci l2params->vsi_prio_type = qos_info->vport_priority_type; 7062306a36Sopenharmony_ci l2params->vsi_rel_bw = qos_info->vport_relative_bw; 7162306a36Sopenharmony_ci for (i = 0; i < l2params->num_tc; i++) { 7262306a36Sopenharmony_ci l2params->tc_info[i].egress_virt_up = 7362306a36Sopenharmony_ci qos_info->tc_info[i].egress_virt_up; 7462306a36Sopenharmony_ci l2params->tc_info[i].ingress_virt_up = 7562306a36Sopenharmony_ci qos_info->tc_info[i].ingress_virt_up; 7662306a36Sopenharmony_ci l2params->tc_info[i].prio_type = qos_info->tc_info[i].prio_type; 7762306a36Sopenharmony_ci l2params->tc_info[i].rel_bw = qos_info->tc_info[i].rel_bw; 7862306a36Sopenharmony_ci l2params->tc_info[i].tc_ctx = qos_info->tc_info[i].tc_ctx; 7962306a36Sopenharmony_ci } 8062306a36Sopenharmony_ci for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++) 8162306a36Sopenharmony_ci l2params->up2tc[i] = qos_info->up2tc[i]; 8262306a36Sopenharmony_ci if (qos_info->pfc_mode == IIDC_DSCP_PFC_MODE) { 8362306a36Sopenharmony_ci l2params->dscp_mode = true; 8462306a36Sopenharmony_ci memcpy(l2params->dscp_map, qos_info->dscp_map, sizeof(l2params->dscp_map)); 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci struct irdma_device *iwdev = dev_get_drvdata(&pf->adev->dev); 9162306a36Sopenharmony_ci struct irdma_l2params l2params = {}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci if (*event->type & BIT(IIDC_EVENT_AFTER_MTU_CHANGE)) { 9462306a36Sopenharmony_ci ibdev_dbg(&iwdev->ibdev, "CLNT: new MTU = %d\n", iwdev->netdev->mtu); 9562306a36Sopenharmony_ci if (iwdev->vsi.mtu != iwdev->netdev->mtu) { 9662306a36Sopenharmony_ci l2params.mtu = iwdev->netdev->mtu; 9762306a36Sopenharmony_ci l2params.mtu_changed = true; 9862306a36Sopenharmony_ci irdma_log_invalid_mtu(l2params.mtu, &iwdev->rf->sc_dev); 9962306a36Sopenharmony_ci irdma_change_l2params(&iwdev->vsi, &l2params); 10062306a36Sopenharmony_ci } 10162306a36Sopenharmony_ci } else if (*event->type & BIT(IIDC_EVENT_BEFORE_TC_CHANGE)) { 10262306a36Sopenharmony_ci if (iwdev->vsi.tc_change_pending) 10362306a36Sopenharmony_ci return; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci irdma_prep_tc_change(iwdev); 10662306a36Sopenharmony_ci } else if (*event->type & BIT(IIDC_EVENT_AFTER_TC_CHANGE)) { 10762306a36Sopenharmony_ci struct iidc_qos_params qos_info = {}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci if (!iwdev->vsi.tc_change_pending) 11062306a36Sopenharmony_ci return; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci l2params.tc_changed = true; 11362306a36Sopenharmony_ci ibdev_dbg(&iwdev->ibdev, "CLNT: TC Change\n"); 11462306a36Sopenharmony_ci ice_get_qos_params(pf, &qos_info); 11562306a36Sopenharmony_ci irdma_fill_qos_info(&l2params, &qos_info); 11662306a36Sopenharmony_ci if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY) 11762306a36Sopenharmony_ci iwdev->dcb_vlan_mode = qos_info.num_tc > 1 && !l2params.dscp_mode; 11862306a36Sopenharmony_ci irdma_change_l2params(&iwdev->vsi, &l2params); 11962306a36Sopenharmony_ci } else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) { 12062306a36Sopenharmony_ci ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr = 0x%08x\n", 12162306a36Sopenharmony_ci event->reg); 12262306a36Sopenharmony_ci if (event->reg & IRDMAPFINT_OICR_PE_CRITERR_M) { 12362306a36Sopenharmony_ci u32 pe_criterr; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci pe_criterr = readl(iwdev->rf->sc_dev.hw_regs[IRDMA_GLPE_CRITERR]); 12662306a36Sopenharmony_ci#define IRDMA_Q1_RESOURCE_ERR 0x0001024d 12762306a36Sopenharmony_ci if (pe_criterr != IRDMA_Q1_RESOURCE_ERR) { 12862306a36Sopenharmony_ci ibdev_err(&iwdev->ibdev, "critical PE Error, GLPE_CRITERR=0x%08x\n", 12962306a36Sopenharmony_ci pe_criterr); 13062306a36Sopenharmony_ci iwdev->rf->reset = true; 13162306a36Sopenharmony_ci } else { 13262306a36Sopenharmony_ci ibdev_warn(&iwdev->ibdev, "Q1 Resource Check\n"); 13362306a36Sopenharmony_ci } 13462306a36Sopenharmony_ci } 13562306a36Sopenharmony_ci if (event->reg & IRDMAPFINT_OICR_HMC_ERR_M) { 13662306a36Sopenharmony_ci ibdev_err(&iwdev->ibdev, "HMC Error\n"); 13762306a36Sopenharmony_ci iwdev->rf->reset = true; 13862306a36Sopenharmony_ci } 13962306a36Sopenharmony_ci if (event->reg & IRDMAPFINT_OICR_PE_PUSH_M) { 14062306a36Sopenharmony_ci ibdev_err(&iwdev->ibdev, "PE Push Error\n"); 14162306a36Sopenharmony_ci iwdev->rf->reset = true; 14262306a36Sopenharmony_ci } 14362306a36Sopenharmony_ci if (iwdev->rf->reset) 14462306a36Sopenharmony_ci iwdev->rf->gen_ops.request_reset(iwdev->rf); 14562306a36Sopenharmony_ci } 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/** 14962306a36Sopenharmony_ci * irdma_request_reset - Request a reset 15062306a36Sopenharmony_ci * @rf: RDMA PCI function 15162306a36Sopenharmony_ci */ 15262306a36Sopenharmony_cistatic void irdma_request_reset(struct irdma_pci_f *rf) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci struct ice_pf *pf = rf->cdev; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci ibdev_warn(&rf->iwdev->ibdev, "Requesting a reset\n"); 15762306a36Sopenharmony_ci ice_rdma_request_reset(pf, IIDC_PFR); 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci/** 16162306a36Sopenharmony_ci * irdma_lan_register_qset - Register qset with LAN driver 16262306a36Sopenharmony_ci * @vsi: vsi structure 16362306a36Sopenharmony_ci * @tc_node: Traffic class node 16462306a36Sopenharmony_ci */ 16562306a36Sopenharmony_cistatic int irdma_lan_register_qset(struct irdma_sc_vsi *vsi, 16662306a36Sopenharmony_ci struct irdma_ws_node *tc_node) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci struct irdma_device *iwdev = vsi->back_vsi; 16962306a36Sopenharmony_ci struct ice_pf *pf = iwdev->rf->cdev; 17062306a36Sopenharmony_ci struct iidc_rdma_qset_params qset = {}; 17162306a36Sopenharmony_ci int ret; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci qset.qs_handle = tc_node->qs_handle; 17462306a36Sopenharmony_ci qset.tc = tc_node->traffic_class; 17562306a36Sopenharmony_ci qset.vport_id = vsi->vsi_idx; 17662306a36Sopenharmony_ci ret = ice_add_rdma_qset(pf, &qset); 17762306a36Sopenharmony_ci if (ret) { 17862306a36Sopenharmony_ci ibdev_dbg(&iwdev->ibdev, "WS: LAN alloc_res for rdma qset failed.\n"); 17962306a36Sopenharmony_ci return ret; 18062306a36Sopenharmony_ci } 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci tc_node->l2_sched_node_id = qset.teid; 18362306a36Sopenharmony_ci vsi->qos[tc_node->user_pri].l2_sched_node_id = qset.teid; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci return 0; 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci/** 18962306a36Sopenharmony_ci * irdma_lan_unregister_qset - Unregister qset with LAN driver 19062306a36Sopenharmony_ci * @vsi: vsi structure 19162306a36Sopenharmony_ci * @tc_node: Traffic class node 19262306a36Sopenharmony_ci */ 19362306a36Sopenharmony_cistatic void irdma_lan_unregister_qset(struct irdma_sc_vsi *vsi, 19462306a36Sopenharmony_ci struct irdma_ws_node *tc_node) 19562306a36Sopenharmony_ci{ 19662306a36Sopenharmony_ci struct irdma_device *iwdev = vsi->back_vsi; 19762306a36Sopenharmony_ci struct ice_pf *pf = iwdev->rf->cdev; 19862306a36Sopenharmony_ci struct iidc_rdma_qset_params qset = {}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci qset.qs_handle = tc_node->qs_handle; 20162306a36Sopenharmony_ci qset.tc = tc_node->traffic_class; 20262306a36Sopenharmony_ci qset.vport_id = vsi->vsi_idx; 20362306a36Sopenharmony_ci qset.teid = tc_node->l2_sched_node_id; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci if (ice_del_rdma_qset(pf, &qset)) 20662306a36Sopenharmony_ci ibdev_dbg(&iwdev->ibdev, "WS: LAN free_res for rdma qset failed.\n"); 20762306a36Sopenharmony_ci} 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistatic void irdma_remove(struct auxiliary_device *aux_dev) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev, 21262306a36Sopenharmony_ci struct iidc_auxiliary_dev, 21362306a36Sopenharmony_ci adev); 21462306a36Sopenharmony_ci struct ice_pf *pf = iidc_adev->pf; 21562306a36Sopenharmony_ci struct irdma_device *iwdev = auxiliary_get_drvdata(aux_dev); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci irdma_ib_unregister_device(iwdev); 21862306a36Sopenharmony_ci ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, false); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci pr_debug("INIT: Gen2 PF[%d] device remove success\n", PCI_FUNC(pf->pdev->devfn)); 22162306a36Sopenharmony_ci} 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistatic void irdma_fill_device_info(struct irdma_device *iwdev, struct ice_pf *pf, 22462306a36Sopenharmony_ci struct ice_vsi *vsi) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci struct irdma_pci_f *rf = iwdev->rf; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci rf->cdev = pf; 22962306a36Sopenharmony_ci rf->gen_ops.register_qset = irdma_lan_register_qset; 23062306a36Sopenharmony_ci rf->gen_ops.unregister_qset = irdma_lan_unregister_qset; 23162306a36Sopenharmony_ci rf->hw.hw_addr = pf->hw.hw_addr; 23262306a36Sopenharmony_ci rf->pcidev = pf->pdev; 23362306a36Sopenharmony_ci rf->msix_count = pf->num_rdma_msix; 23462306a36Sopenharmony_ci rf->pf_id = pf->hw.pf_id; 23562306a36Sopenharmony_ci rf->msix_entries = &pf->msix_entries[pf->rdma_base_vector]; 23662306a36Sopenharmony_ci rf->default_vsi.vsi_idx = vsi->vsi_num; 23762306a36Sopenharmony_ci rf->protocol_used = pf->rdma_mode & IIDC_RDMA_PROTOCOL_ROCEV2 ? 23862306a36Sopenharmony_ci IRDMA_ROCE_PROTOCOL_ONLY : IRDMA_IWARP_PROTOCOL_ONLY; 23962306a36Sopenharmony_ci rf->rdma_ver = IRDMA_GEN_2; 24062306a36Sopenharmony_ci rf->rsrc_profile = IRDMA_HMC_PROFILE_DEFAULT; 24162306a36Sopenharmony_ci rf->rst_to = IRDMA_RST_TIMEOUT_HZ; 24262306a36Sopenharmony_ci rf->gen_ops.request_reset = irdma_request_reset; 24362306a36Sopenharmony_ci rf->limits_sel = 7; 24462306a36Sopenharmony_ci rf->iwdev = iwdev; 24562306a36Sopenharmony_ci mutex_init(&iwdev->ah_tbl_lock); 24662306a36Sopenharmony_ci iwdev->netdev = vsi->netdev; 24762306a36Sopenharmony_ci iwdev->vsi_num = vsi->vsi_num; 24862306a36Sopenharmony_ci iwdev->init_state = INITIAL_STATE; 24962306a36Sopenharmony_ci iwdev->roce_cwnd = IRDMA_ROCE_CWND_DEFAULT; 25062306a36Sopenharmony_ci iwdev->roce_ackcreds = IRDMA_ROCE_ACKCREDS_DEFAULT; 25162306a36Sopenharmony_ci iwdev->rcv_wnd = IRDMA_CM_DEFAULT_RCV_WND_SCALED; 25262306a36Sopenharmony_ci iwdev->rcv_wscale = IRDMA_CM_DEFAULT_RCV_WND_SCALE; 25362306a36Sopenharmony_ci if (rf->protocol_used == IRDMA_ROCE_PROTOCOL_ONLY) 25462306a36Sopenharmony_ci iwdev->roce_mode = true; 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cistatic int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_device_id *id) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev, 26062306a36Sopenharmony_ci struct iidc_auxiliary_dev, 26162306a36Sopenharmony_ci adev); 26262306a36Sopenharmony_ci struct ice_pf *pf = iidc_adev->pf; 26362306a36Sopenharmony_ci struct ice_vsi *vsi = ice_get_main_vsi(pf); 26462306a36Sopenharmony_ci struct iidc_qos_params qos_info = {}; 26562306a36Sopenharmony_ci struct irdma_device *iwdev; 26662306a36Sopenharmony_ci struct irdma_pci_f *rf; 26762306a36Sopenharmony_ci struct irdma_l2params l2params = {}; 26862306a36Sopenharmony_ci int err; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci if (!vsi) 27162306a36Sopenharmony_ci return -EIO; 27262306a36Sopenharmony_ci iwdev = ib_alloc_device(irdma_device, ibdev); 27362306a36Sopenharmony_ci if (!iwdev) 27462306a36Sopenharmony_ci return -ENOMEM; 27562306a36Sopenharmony_ci iwdev->rf = kzalloc(sizeof(*rf), GFP_KERNEL); 27662306a36Sopenharmony_ci if (!iwdev->rf) { 27762306a36Sopenharmony_ci ib_dealloc_device(&iwdev->ibdev); 27862306a36Sopenharmony_ci return -ENOMEM; 27962306a36Sopenharmony_ci } 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci irdma_fill_device_info(iwdev, pf, vsi); 28262306a36Sopenharmony_ci rf = iwdev->rf; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci err = irdma_ctrl_init_hw(rf); 28562306a36Sopenharmony_ci if (err) 28662306a36Sopenharmony_ci goto err_ctrl_init; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci l2params.mtu = iwdev->netdev->mtu; 28962306a36Sopenharmony_ci ice_get_qos_params(pf, &qos_info); 29062306a36Sopenharmony_ci irdma_fill_qos_info(&l2params, &qos_info); 29162306a36Sopenharmony_ci if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY) 29262306a36Sopenharmony_ci iwdev->dcb_vlan_mode = l2params.num_tc > 1 && !l2params.dscp_mode; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci err = irdma_rt_init_hw(iwdev, &l2params); 29562306a36Sopenharmony_ci if (err) 29662306a36Sopenharmony_ci goto err_rt_init; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci err = irdma_ib_register_device(iwdev); 29962306a36Sopenharmony_ci if (err) 30062306a36Sopenharmony_ci goto err_ibreg; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, true); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci ibdev_dbg(&iwdev->ibdev, "INIT: Gen2 PF[%d] device probe success\n", PCI_FUNC(rf->pcidev->devfn)); 30562306a36Sopenharmony_ci auxiliary_set_drvdata(aux_dev, iwdev); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci return 0; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cierr_ibreg: 31062306a36Sopenharmony_ci irdma_rt_deinit_hw(iwdev); 31162306a36Sopenharmony_cierr_rt_init: 31262306a36Sopenharmony_ci irdma_ctrl_deinit_hw(rf); 31362306a36Sopenharmony_cierr_ctrl_init: 31462306a36Sopenharmony_ci kfree(iwdev->rf); 31562306a36Sopenharmony_ci ib_dealloc_device(&iwdev->ibdev); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci return err; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic const struct auxiliary_device_id irdma_auxiliary_id_table[] = { 32162306a36Sopenharmony_ci {.name = "ice.iwarp", }, 32262306a36Sopenharmony_ci {.name = "ice.roce", }, 32362306a36Sopenharmony_ci {}, 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(auxiliary, irdma_auxiliary_id_table); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic struct iidc_auxiliary_drv irdma_auxiliary_drv = { 32962306a36Sopenharmony_ci .adrv = { 33062306a36Sopenharmony_ci .id_table = irdma_auxiliary_id_table, 33162306a36Sopenharmony_ci .probe = irdma_probe, 33262306a36Sopenharmony_ci .remove = irdma_remove, 33362306a36Sopenharmony_ci }, 33462306a36Sopenharmony_ci .event_handler = irdma_iidc_event_handler, 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic int __init irdma_init_module(void) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci int ret; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci ret = auxiliary_driver_register(&i40iw_auxiliary_drv); 34262306a36Sopenharmony_ci if (ret) { 34362306a36Sopenharmony_ci pr_err("Failed i40iw(gen_1) auxiliary_driver_register() ret=%d\n", 34462306a36Sopenharmony_ci ret); 34562306a36Sopenharmony_ci return ret; 34662306a36Sopenharmony_ci } 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci ret = auxiliary_driver_register(&irdma_auxiliary_drv.adrv); 34962306a36Sopenharmony_ci if (ret) { 35062306a36Sopenharmony_ci auxiliary_driver_unregister(&i40iw_auxiliary_drv); 35162306a36Sopenharmony_ci pr_err("Failed irdma auxiliary_driver_register() ret=%d\n", 35262306a36Sopenharmony_ci ret); 35362306a36Sopenharmony_ci return ret; 35462306a36Sopenharmony_ci } 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci irdma_register_notifiers(); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci return 0; 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic void __exit irdma_exit_module(void) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci irdma_unregister_notifiers(); 36462306a36Sopenharmony_ci auxiliary_driver_unregister(&irdma_auxiliary_drv.adrv); 36562306a36Sopenharmony_ci auxiliary_driver_unregister(&i40iw_auxiliary_drv); 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cimodule_init(irdma_init_module); 36962306a36Sopenharmony_cimodule_exit(irdma_exit_module); 370