Lines Matching refs:iwdev
193 struct i40iw_device *iwdev = from_tasklet(iwdev, t, dpc_tasklet);
195 if (iwdev->msix_shared)
196 i40iw_process_ceq(iwdev, iwdev->ceqlist);
197 i40iw_process_aeq(iwdev);
198 i40iw_enable_intr(&iwdev->sc_dev, iwdev->iw_msixtbl[0].idx);
208 struct i40iw_device *iwdev = iwceq->iwdev;
210 i40iw_process_ceq(iwdev, iwceq);
211 i40iw_enable_intr(&iwdev->sc_dev, iwceq->msix_idx);
221 struct i40iw_device *iwdev = (struct i40iw_device *)data;
223 tasklet_schedule(&iwdev->dpc_tasklet);
229 * @iwdev: iwarp device
235 static void i40iw_destroy_cqp(struct i40iw_device *iwdev, bool free_hwcqp)
237 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
238 struct i40iw_cqp *cqp = &iwdev->cqp;
243 i40iw_cleanup_pending_cqp_op(iwdev);
247 iwdev->cqp.scratch_array = NULL;
275 * @iwdev: iwarp device
281 static void i40iw_destroy_aeq(struct i40iw_device *iwdev)
284 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
285 struct i40iw_aeq *aeq = &iwdev->aeq;
287 if (!iwdev->msix_shared)
288 i40iw_disable_irq(dev, iwdev->iw_msixtbl, (void *)iwdev);
289 if (iwdev->reset)
303 * @iwdev: iwarp device
309 static void i40iw_destroy_ceq(struct i40iw_device *iwdev,
313 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
315 if (iwdev->reset)
333 * @iwdev: iwarp device
338 static void i40iw_dele_ceqs(struct i40iw_device *iwdev)
341 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
342 struct i40iw_ceq *iwceq = iwdev->ceqlist;
343 struct i40iw_msix_vector *msix_vec = iwdev->iw_msixtbl;
345 if (iwdev->msix_shared) {
346 i40iw_disable_irq(dev, msix_vec, (void *)iwdev);
347 i40iw_destroy_ceq(iwdev, iwceq);
352 for (msix_vec++; i < iwdev->ceqs_count; i++, msix_vec++, iwceq++) {
354 i40iw_destroy_ceq(iwdev, iwceq);
357 iwdev->sc_dev.ceq_valid = false;
362 * @iwdev: iwarp device
367 static void i40iw_destroy_ccq(struct i40iw_device *iwdev)
369 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
370 struct i40iw_ccq *ccq = &iwdev->ccq;
373 if (!iwdev->reset)
397 * @iwdev: iwarp device
465 * @iwdev: iwarp device
471 static enum i40iw_status_code i40iw_create_hmc_objs(struct i40iw_device *iwdev,
474 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
482 info.entry_type = iwdev->sd_type;
513 * @iwdev: iwarp device
522 enum i40iw_status_code i40iw_obj_aligned_mem(struct i40iw_device *iwdev,
530 va = (unsigned long)iwdev->obj_next.va;
536 memptr->pa = iwdev->obj_next.pa + extra;
538 if ((memptr->va + size) > (iwdev->obj_mem.va + iwdev->obj_mem.size))
541 iwdev->obj_next.va = memptr->va + size;
542 iwdev->obj_next.pa = memptr->pa + size;
548 * @iwdev: iwarp device
553 static enum i40iw_status_code i40iw_create_cqp(struct i40iw_device *iwdev)
558 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
560 struct i40iw_cqp *cqp = &iwdev->cqp;
580 status = i40iw_obj_aligned_mem(iwdev, &mem, sizeof(struct i40iw_cqp_ctx),
593 cqp_init_info.hmc_profile = iwdev->resource_profile;
594 cqp_init_info.enabled_vf_count = iwdev->max_rdma_vfs;
618 i40iw_destroy_cqp(iwdev, false);
624 * @iwdev: iwarp device
629 static enum i40iw_status_code i40iw_create_ccq(struct i40iw_device *iwdev)
631 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
635 struct i40iw_ccq *ccq = &iwdev->ccq;
647 status = i40iw_obj_aligned_mem(iwdev, &mem, ccq->shadow_area.size,
672 * @iwdev: iwarp device
680 static enum i40iw_status_code i40iw_configure_ceq_vector(struct i40iw_device *iwdev,
687 if (iwdev->msix_shared && !ceq_id) {
688 tasklet_setup(&iwdev->dpc_tasklet, i40iw_dpc);
689 status = request_irq(msix_vec->irq, i40iw_irq_handler, 0, "AEQCEQ", iwdev);
710 * @iwdev: iwarp device
717 static enum i40iw_status_code i40iw_create_ceq(struct i40iw_device *iwdev,
723 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
728 iwceq->iwdev = iwdev;
730 iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_CQ].cnt;
739 info.elem_cnt = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_CQ].cnt;
742 scratch = (uintptr_t)&iwdev->cqp.sc_cqp;
753 void i40iw_request_reset(struct i40iw_device *iwdev)
755 struct i40e_info *ldev = iwdev->ldev;
757 ldev->ops->request_reset(ldev, iwdev->client, 1);
762 * @iwdev: iwarp device
769 static enum i40iw_status_code i40iw_setup_ceqs(struct i40iw_device *iwdev,
781 iwdev->iw_qvlist);
789 num_ceqs = min(iwdev->msix_count, iwdev->sc_dev.hmc_fpm_misc.max_ceqs);
790 iwdev->ceqlist = kcalloc(num_ceqs, sizeof(*iwdev->ceqlist), GFP_KERNEL);
791 if (!iwdev->ceqlist) {
795 i = (iwdev->msix_shared) ? 0 : 1;
797 iwceq = &iwdev->ceqlist[ceq_id];
798 status = i40iw_create_ceq(iwdev, iwceq, ceq_id);
804 msix_vec = &iwdev->iw_msixtbl[i];
807 status = i40iw_configure_ceq_vector(iwdev, iwceq, ceq_id, msix_vec);
809 i40iw_destroy_ceq(iwdev, iwceq);
812 i40iw_enable_intr(&iwdev->sc_dev, msix_vec->idx);
813 iwdev->ceqs_count++;
816 if (status && !iwdev->ceqs_count) {
817 kfree(iwdev->ceqlist);
818 iwdev->ceqlist = NULL;
821 iwdev->sc_dev.ceq_valid = true;
829 * @iwdev: iwarp device
834 static enum i40iw_status_code i40iw_configure_aeq_vector(struct i40iw_device *iwdev)
836 struct i40iw_msix_vector *msix_vec = iwdev->iw_msixtbl;
839 if (!iwdev->msix_shared) {
840 tasklet_setup(&iwdev->dpc_tasklet, i40iw_dpc);
841 ret = request_irq(msix_vec->irq, i40iw_irq_handler, 0, "i40iw", iwdev);
853 * @iwdev: iwarp device
858 static enum i40iw_status_code i40iw_create_aeq(struct i40iw_device *iwdev)
862 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
863 struct i40iw_aeq *aeq = &iwdev->aeq;
867 aeq_size = 2 * iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_QP].cnt +
868 iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_CQ].cnt;
894 * @iwdev: iwarp device
899 static enum i40iw_status_code i40iw_setup_aeq(struct i40iw_device *iwdev)
901 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
904 status = i40iw_create_aeq(iwdev);
908 status = i40iw_configure_aeq_vector(iwdev);
910 i40iw_destroy_aeq(iwdev);
914 if (!iwdev->msix_shared)
915 i40iw_enable_intr(dev, iwdev->iw_msixtbl[0].idx);
921 * @iwdev: iwarp device
925 static enum i40iw_status_code i40iw_initialize_ilq(struct i40iw_device *iwdev)
942 status = i40iw_puda_create_rsrc(&iwdev->vsi, &info);
950 * @iwdev: iwarp device
954 static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev)
962 info.qp_id = iwdev->vsi.exception_lan_queue;
967 info.buf_size = iwdev->vsi.mtu + VLAN_ETH_HLEN;
969 status = i40iw_puda_create_rsrc(&iwdev->vsi, &info);
981 struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
983 i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, false);
984 if (i40iw_initialize_ieq(iwdev)) {
985 iwdev->reset = true;
986 i40iw_request_reset(iwdev);
992 * @iwdev: iwarp device
998 static enum i40iw_status_code i40iw_hmc_setup(struct i40iw_device *iwdev)
1002 iwdev->sd_type = I40IW_SD_TYPE_DIRECT;
1003 status = i40iw_config_fpm_values(&iwdev->sc_dev, IW_CFG_FPM_QP_COUNT);
1006 status = i40iw_create_hmc_objs(iwdev, true);
1009 iwdev->init_state = HMC_OBJS_CREATED;
1016 * @iwdev: iwarp device
1018 static void i40iw_del_init_mem(struct i40iw_device *iwdev)
1020 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
1022 i40iw_free_dma_mem(&iwdev->hw, &iwdev->obj_mem);
1025 kfree(iwdev->mem_resources);
1026 iwdev->mem_resources = NULL;
1027 kfree(iwdev->ceqlist);
1028 iwdev->ceqlist = NULL;
1029 kfree(iwdev->iw_msixtbl);
1030 iwdev->iw_msixtbl = NULL;
1031 kfree(iwdev->hmc_info_mem);
1032 iwdev->hmc_info_mem = NULL;
1037 * @iwdev: iwarp device
1040 static void i40iw_del_macip_entry(struct i40iw_device *iwdev, u8 idx)
1042 struct i40iw_cqp *iwcqp = &iwdev->cqp;
1059 status = i40iw_handle_cqp_op(iwdev, cqp_request);
1066 * @iwdev: iwarp device
1070 static enum i40iw_status_code i40iw_add_mac_ipaddr_entry(struct i40iw_device *iwdev,
1075 struct i40iw_cqp *iwcqp = &iwdev->cqp;
1096 status = i40iw_handle_cqp_op(iwdev, cqp_request);
1104 * @iwdev: iwarp device
1111 static enum i40iw_status_code i40iw_alloc_local_mac_ipaddr_entry(struct i40iw_device *iwdev,
1114 struct i40iw_cqp *iwcqp = &iwdev->cqp;
1133 status = i40iw_handle_cqp_op(iwdev, cqp_request);
1145 * @iwdev: iwarp device
1151 static enum i40iw_status_code i40iw_alloc_set_mac_ipaddr(struct i40iw_device *iwdev,
1156 status = i40iw_alloc_local_mac_ipaddr_entry(iwdev, &iwdev->mac_ip_table_idx);
1158 status = i40iw_add_mac_ipaddr_entry(iwdev, macaddr,
1159 (u8)iwdev->mac_ip_table_idx);
1161 i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx);
1168 * @iwdev: iwarp device
1170 static void i40iw_add_ipv6_addr(struct i40iw_device *iwdev)
1180 (rdma_vlan_dev_real_dev(ip_dev) == iwdev->netdev)) ||
1181 (ip_dev == iwdev->netdev)) && (ip_dev->flags & IFF_UP)) {
1192 i40iw_manage_arp_cache(iwdev,
1205 * @iwdev: iwarp device
1207 static void i40iw_add_ipv4_addr(struct i40iw_device *iwdev)
1216 (rdma_vlan_dev_real_dev(dev) == iwdev->netdev)) ||
1217 (dev == iwdev->netdev)) && (READ_ONCE(dev->flags) & IFF_UP)) {
1224 i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM,
1229 i40iw_manage_arp_cache(iwdev,
1242 * @iwdev: iwarp device
1248 static enum i40iw_status_code i40iw_add_mac_ip(struct i40iw_device *iwdev)
1250 struct net_device *netdev = iwdev->netdev;
1253 status = i40iw_alloc_set_mac_ipaddr(iwdev, (u8 *)netdev->dev_addr);
1256 i40iw_add_ipv4_addr(iwdev);
1257 i40iw_add_ipv6_addr(iwdev);
1294 * @iwdev: iwarp device
1297 * Allocate memory for the hmc objects and initialize iwdev
1301 static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev,
1305 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
1320 iwdev->hmc_info_mem = kzalloc(size, GFP_KERNEL);
1321 if (!iwdev->hmc_info_mem)
1324 iwdev->pble_rsrc = (struct i40iw_hmc_pble_rsrc *)iwdev->hmc_info_mem;
1325 dev->hmc_info = &iwdev->hw.hmc;
1326 dev->hmc_info->hmc_obj = (struct i40iw_hmc_obj_info *)(iwdev->pble_rsrc + 1);
1327 status = i40iw_obj_aligned_mem(iwdev, &mem, I40IW_QUERY_FPM_BUF_SIZE,
1333 status = i40iw_obj_aligned_mem(iwdev, &mem, I40IW_COMMIT_FPM_BUF_SIZE,
1342 info.hw = &iwdev->hw;
1352 iwdev->dcb = true;
1354 i40iw_pr_info("DCB is set/clear = %d\n", iwdev->dcb);
1356 status = i40iw_device_init(&iwdev->sc_dev, &info);
1361 vsi_info.dev = &iwdev->sc_dev;
1362 vsi_info.back_vsi = (void *)iwdev;
1365 i40iw_sc_vsi_init(&iwdev->vsi, &vsi_info);
1377 i40iw_vsi_stats_init(&iwdev->vsi, &stats_info);
1381 kfree(iwdev->hmc_info_mem);
1382 iwdev->hmc_info_mem = NULL;
1411 * @iwdev: iwarp device
1414 * Allocate iwdev msix table and copy the ldev msix info to the table
1417 static enum i40iw_status_code i40iw_save_msix_info(struct i40iw_device *iwdev,
1431 iwdev->msix_count = ldev->msix_count;
1433 size = sizeof(struct i40iw_msix_vector) * iwdev->msix_count;
1435 size += sizeof(struct i40e_qv_info) * iwdev->msix_count - 1;
1436 iwdev->iw_msixtbl = kzalloc(size, GFP_KERNEL);
1438 if (!iwdev->iw_msixtbl)
1440 iwdev->iw_qvlist = (struct i40e_qvlist_info *)(&iwdev->iw_msixtbl[iwdev->msix_count]);
1441 iw_qvlist = iwdev->iw_qvlist;
1443 iw_qvlist->num_vectors = iwdev->msix_count;
1444 if (iwdev->msix_count <= num_online_cpus())
1445 iwdev->msix_shared = true;
1446 for (i = 0, ceq_idx = 0; i < iwdev->msix_count; i++, iw_qvinfo++) {
1447 iwdev->iw_msixtbl[i].idx = ldev->msix_entries[i].entry;
1448 iwdev->iw_msixtbl[i].irq = ldev->msix_entries[i].vector;
1449 iwdev->iw_msixtbl[i].cpu_affinity = ceq_idx;
1452 if (iwdev->msix_shared)
1461 iw_qvinfo->v_idx = iwdev->iw_msixtbl[i].idx;
1468 * @iwdev: iwarp device
1473 static void i40iw_deinit_device(struct i40iw_device *iwdev)
1475 struct i40e_info *ldev = iwdev->ldev;
1477 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
1479 i40iw_pr_info("state = %d\n", iwdev->init_state);
1480 if (iwdev->param_wq)
1481 destroy_workqueue(iwdev->param_wq);
1483 switch (iwdev->init_state) {
1485 iwdev->iw_status = 0;
1486 i40iw_port_ibevent(iwdev);
1487 i40iw_destroy_rdma_device(iwdev->iwibdev);
1490 if (!iwdev->reset)
1491 i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx);
1494 i40iw_destroy_pble_pool(dev, iwdev->pble_rsrc);
1497 i40iw_dele_ceqs(iwdev);
1500 i40iw_destroy_aeq(iwdev);
1503 i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, iwdev->reset);
1506 i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_ILQ, iwdev->reset);
1509 i40iw_destroy_ccq(iwdev);
1512 i40iw_del_hmc_objects(dev, dev->hmc_info, true, iwdev->reset);
1515 i40iw_destroy_cqp(iwdev, true);
1518 i40iw_cleanup_cm_core(&iwdev->cm_core);
1519 if (iwdev->vsi.pestat) {
1520 i40iw_vsi_stats_free(&iwdev->vsi);
1521 kfree(iwdev->vsi.pestat);
1523 i40iw_del_init_mem(iwdev);
1527 i40iw_pr_err("bad init_state = %d\n", iwdev->init_state);
1532 kfree(iwdev->hdl);
1549 struct i40iw_device *iwdev = &hdl->device;
1550 struct i40iw_sc_dev *dev = &iwdev->sc_dev;
1555 iwdev->mpa_version = mpa_version;
1556 iwdev->resource_profile = (resource_profile < I40IW_HMC_PROFILE_EQUAL) ?
1559 iwdev->max_rdma_vfs =
1560 (iwdev->resource_profile != I40IW_HMC_PROFILE_DEFAULT) ? max_rdma_vfs : 0;
1561 iwdev->max_enabled_vfs = iwdev->max_rdma_vfs;
1562 iwdev->netdev = ldev->netdev;
1565 iwdev->db_start = pci_resource_start(ldev->pcidev, 0) + I40IW_DB_ADDR_OFFSET;
1567 iwdev->db_start = pci_resource_start(ldev->pcidev, 0) + I40IW_VF_DB_ADDR_OFFSET;
1569 status = i40iw_save_msix_info(iwdev, ldev);
1572 iwdev->hw.pcidev = ldev->pcidev;
1573 iwdev->hw.hw_addr = ldev->hw_addr;
1574 status = i40iw_allocate_dma_mem(&iwdev->hw,
1575 &iwdev->obj_mem, 8192, 4096);
1578 iwdev->obj_next = iwdev->obj_mem;
1580 init_waitqueue_head(&iwdev->vchnl_waitq);
1582 init_waitqueue_head(&iwdev->close_wq);
1584 status = i40iw_initialize_dev(iwdev, ldev);
1587 kfree(iwdev->iw_msixtbl);
1588 i40iw_free_dma_mem(dev->hw, &iwdev->obj_mem);
1589 iwdev->iw_msixtbl = NULL;
1596 * @iwdev: iwarp device
1600 static void i40iw_get_used_rsrc(struct i40iw_device *iwdev)
1602 iwdev->used_pds = find_next_zero_bit(iwdev->allocated_pds, iwdev->max_pd, 0);
1603 iwdev->used_qps = find_next_zero_bit(iwdev->allocated_qps, iwdev->max_qp, 0);
1604 iwdev->used_cqs = find_next_zero_bit(iwdev->allocated_cqs, iwdev->max_cq, 0);
1605 iwdev->used_mrs = find_next_zero_bit(iwdev->allocated_mrs, iwdev->max_mr, 0);
1620 struct i40iw_device *iwdev;
1632 iwdev = &hdl->device;
1633 iwdev->hdl = hdl;
1634 dev = &iwdev->sc_dev;
1635 if (i40iw_setup_cm_core(iwdev)) {
1636 kfree(iwdev->hdl);
1640 dev->back_dev = (void *)iwdev;
1641 iwdev->ldev = &hdl->ldev;
1642 iwdev->client = client;
1643 mutex_init(&iwdev->pbl_mutex);
1650 iwdev->init_state = INITIAL_STATE;
1653 status = i40iw_create_cqp(iwdev);
1656 iwdev->init_state = CQP_CREATED;
1657 status = i40iw_hmc_setup(iwdev);
1660 status = i40iw_create_ccq(iwdev);
1663 iwdev->init_state = CCQ_CREATED;
1664 status = i40iw_initialize_ilq(iwdev);
1667 iwdev->init_state = ILQ_CREATED;
1668 status = i40iw_initialize_ieq(iwdev);
1671 iwdev->init_state = IEQ_CREATED;
1672 status = i40iw_setup_aeq(iwdev);
1675 iwdev->init_state = AEQ_CREATED;
1676 status = i40iw_setup_ceqs(iwdev, ldev);
1685 iwdev->init_state = CEQ_CREATED;
1686 status = i40iw_initialize_hw_resources(iwdev);
1689 i40iw_get_used_rsrc(iwdev);
1691 status = i40iw_hmc_init_pble(&iwdev->sc_dev, iwdev->pble_rsrc);
1694 iwdev->init_state = PBLE_CHUNK_MEM;
1695 iwdev->virtchnl_wq = alloc_ordered_workqueue("iwvch", WQ_MEM_RECLAIM);
1696 status = i40iw_add_mac_ip(iwdev);
1699 iwdev->init_state = IP_ADDR_REGISTERED;
1700 if (i40iw_register_rdma_device(iwdev)) {
1705 iwdev->init_state = RDMA_DEV_REGISTERED;
1706 iwdev->iw_status = 1;
1707 i40iw_port_ibevent(iwdev);
1708 iwdev->param_wq = alloc_ordered_workqueue("l2params", WQ_MEM_RECLAIM);
1709 if(iwdev->param_wq == NULL)
1715 i40iw_pr_err("status = %d last completion = %d\n", status, iwdev->init_state);
1716 i40iw_deinit_device(iwdev);
1728 struct i40iw_device *iwdev = dwork->iwdev;
1730 i40iw_change_l2params(&iwdev->vsi, &dwork->l2params);
1731 atomic_dec(&iwdev->params_busy);
1747 struct i40iw_device *iwdev;
1754 iwdev = &hdl->device;
1756 if (atomic_read(&iwdev->params_busy))
1764 atomic_inc(&iwdev->params_busy);
1766 work->iwdev = iwdev;
1771 l2params->mtu = (params->mtu) ? params->mtu : iwdev->vsi.mtu;
1774 queue_work(iwdev->param_wq, &work->work);
1787 struct i40iw_device *iwdev;
1794 iwdev = &hdl->device;
1795 iwdev->closing = true;
1798 iwdev->reset = true;
1800 i40iw_cm_teardown_connections(iwdev, NULL, NULL, true);
1801 destroy_workqueue(iwdev->virtchnl_wq);
1802 i40iw_deinit_device(iwdev);
1823 struct i40iw_device *iwdev;
1830 iwdev = (struct i40iw_device *)dev->back_dev;
1837 spin_lock_irqsave(&iwdev->vsi.pestat->lock, flags);
1839 spin_unlock_irqrestore(&iwdev->vsi.pestat->lock, flags);
1930 struct i40iw_device *iwdev;
1941 iwdev = dev->back_dev;
1946 atomic_dec(&iwdev->vchnl_msgs);
1947 wake_up(&iwdev->vchnl_waitq);
1964 struct i40iw_device *iwdev;
1967 iwdev = dev->back_dev;
1970 (atomic_read(&iwdev->vchnl_msgs) == 0))
1977 (atomic_read(&iwdev->vchnl_msgs) == 0),
2001 struct i40iw_device *iwdev;
2007 iwdev = dev->back_dev;
2008 ldev = iwdev->ldev;