Lines Matching refs:hba

34 static int bnx2i_adapter_ready(struct bnx2i_hba *hba)
38 if (!hba || !test_bit(ADAPTER_STATE_UP, &hba->adapter_state) ||
39 test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state) ||
40 test_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state))
138 * @hba: adapter instance
143 static int bnx2i_map_scsi_sg(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd)
190 bd_count = bnx2i_map_scsi_sg(cmd->conn->hba, cmd);
230 * @hba: pointer to adapter instance
238 static int bnx2i_bind_conn_to_iscsi_cid(struct bnx2i_hba *hba,
242 if (hba && hba->cid_que.conn_cid_tbl[iscsi_cid]) {
248 hba->cid_que.conn_cid_tbl[iscsi_cid] = bnx2i_conn;
255 * @hba: pointer to adapter instance
258 struct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba,
261 if (!hba->cid_que.conn_cid_tbl) {
265 } else if (iscsi_cid >= hba->max_active_conns) {
269 return hba->cid_que.conn_cid_tbl[iscsi_cid];
275 * @hba: pointer to adapter instance
277 static u32 bnx2i_alloc_iscsi_cid(struct bnx2i_hba *hba)
281 if (!hba->cid_que.cid_free_cnt)
284 idx = hba->cid_que.cid_q_cons_idx;
285 hba->cid_que.cid_q_cons_idx++;
286 if (hba->cid_que.cid_q_cons_idx == hba->cid_que.cid_q_max_idx)
287 hba->cid_que.cid_q_cons_idx = 0;
289 hba->cid_que.cid_free_cnt--;
290 return hba->cid_que.cid_que[idx];
296 * @hba: pointer to adapter instance
299 static void bnx2i_free_iscsi_cid(struct bnx2i_hba *hba, u16 iscsi_cid)
306 hba->cid_que.cid_free_cnt++;
308 idx = hba->cid_que.cid_q_prod_idx;
309 hba->cid_que.cid_que[idx] = iscsi_cid;
310 hba->cid_que.conn_cid_tbl[iscsi_cid] = NULL;
311 hba->cid_que.cid_q_prod_idx++;
312 if (hba->cid_que.cid_q_prod_idx == hba->cid_que.cid_q_max_idx)
313 hba->cid_que.cid_q_prod_idx = 0;
319 * @hba: pointer to adapter instance
324 static int bnx2i_setup_free_cid_que(struct bnx2i_hba *hba)
329 mem_size = hba->max_active_conns * sizeof(u32);
332 hba->cid_que.cid_que_base = kmalloc(mem_size, GFP_KERNEL);
333 if (!hba->cid_que.cid_que_base)
336 mem_size = hba->max_active_conns * sizeof(struct bnx2i_conn *);
338 hba->cid_que.conn_cid_tbl = kmalloc(mem_size, GFP_KERNEL);
339 if (!hba->cid_que.conn_cid_tbl) {
340 kfree(hba->cid_que.cid_que_base);
341 hba->cid_que.cid_que_base = NULL;
345 hba->cid_que.cid_que = (u32 *)hba->cid_que.cid_que_base;
346 hba->cid_que.cid_q_prod_idx = 0;
347 hba->cid_que.cid_q_cons_idx = 0;
348 hba->cid_que.cid_q_max_idx = hba->max_active_conns;
349 hba->cid_que.cid_free_cnt = hba->max_active_conns;
351 for (i = 0; i < hba->max_active_conns; i++) {
352 hba->cid_que.cid_que[i] = i;
353 hba->cid_que.conn_cid_tbl[i] = NULL;
361 * @hba: pointer to adapter instance
363 static void bnx2i_release_free_cid_que(struct bnx2i_hba *hba)
365 kfree(hba->cid_que.cid_que_base);
366 hba->cid_que.cid_que_base = NULL;
368 kfree(hba->cid_que.conn_cid_tbl);
369 hba->cid_que.conn_cid_tbl = NULL;
375 * @hba: pointer to adapter instance
381 static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)
398 bnx2i_ep->hba = hba;
399 bnx2i_ep->hba_age = hba->age;
405 hba->ofld_conns_active++;
422 bnx2i_ep->hba->ofld_conns_active--;
425 bnx2i_free_iscsi_cid(bnx2i_ep->hba, bnx2i_ep->ep_iscsi_cid);
432 bnx2i_ep->hba = NULL;
440 * @hba: adapter instance pointer
444 static int bnx2i_alloc_bdt(struct bnx2i_hba *hba, struct iscsi_session *session,
450 io->bd_tbl = dma_alloc_coherent(&hba->pcidev->dev,
464 * @hba: adapter instance pointer
468 static void bnx2i_destroy_cmd_pool(struct bnx2i_hba *hba,
478 dma_free_coherent(&hba->pcidev->dev,
490 * @hba: adapter instance pointer
493 static int bnx2i_setup_cmd_pool(struct bnx2i_hba *hba,
505 if (bnx2i_alloc_bdt(hba, session, cmd))
512 bnx2i_destroy_cmd_pool(hba, session);
519 * @hba: pointer to adapter structure
524 static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba)
530 hba->mp_bd_tbl = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
531 &hba->mp_bd_dma, GFP_KERNEL);
532 if (!hba->mp_bd_tbl) {
538 hba->dummy_buffer = dma_alloc_coherent(&hba->pcidev->dev,
540 &hba->dummy_buf_dma, GFP_KERNEL);
541 if (!hba->dummy_buffer) {
543 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
544 hba->mp_bd_tbl, hba->mp_bd_dma);
545 hba->mp_bd_tbl = NULL;
550 mp_bdt = (struct iscsi_bd *) hba->mp_bd_tbl;
551 addr = (unsigned long) hba->dummy_buf_dma;
564 * @hba: pointer to adapter instance
568 static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba)
570 if (hba->mp_bd_tbl) {
571 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
572 hba->mp_bd_tbl, hba->mp_bd_dma);
573 hba->mp_bd_tbl = NULL;
575 if (hba->dummy_buffer) {
576 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
577 hba->dummy_buffer, hba->dummy_buf_dma);
578 hba->dummy_buffer = NULL;
585 * @hba: adapter instance pointer
601 * @hba: pointer to adapter instance
606 static int bnx2i_ep_destroy_list_add(struct bnx2i_hba *hba,
609 write_lock_bh(&hba->ep_rdwr_lock);
610 list_add_tail(&ep->link, &hba->ep_destroy_list);
611 write_unlock_bh(&hba->ep_rdwr_lock);
618 * @hba: pointer to adapter instance
623 static int bnx2i_ep_destroy_list_del(struct bnx2i_hba *hba,
626 write_lock_bh(&hba->ep_rdwr_lock);
628 write_unlock_bh(&hba->ep_rdwr_lock);
635 * @hba: pointer to adapter instance
640 static int bnx2i_ep_ofld_list_add(struct bnx2i_hba *hba,
643 write_lock_bh(&hba->ep_rdwr_lock);
644 list_add_tail(&ep->link, &hba->ep_ofld_list);
645 write_unlock_bh(&hba->ep_rdwr_lock);
651 * @hba: pointer to adapter instance
656 static int bnx2i_ep_ofld_list_del(struct bnx2i_hba *hba,
659 write_lock_bh(&hba->ep_rdwr_lock);
661 write_unlock_bh(&hba->ep_rdwr_lock);
669 * @hba: pointer to adapter instance
674 bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, u32 iscsi_cid)
680 read_lock_bh(&hba->ep_rdwr_lock);
681 list_for_each_safe(list, tmp, &hba->ep_ofld_list) {
688 read_unlock_bh(&hba->ep_rdwr_lock);
697 * @hba: pointer to adapter instance
702 bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba, u32 iscsi_cid)
708 read_lock_bh(&hba->ep_rdwr_lock);
709 list_for_each_safe(list, tmp, &hba->ep_destroy_list) {
716 read_unlock_bh(&hba->ep_rdwr_lock);
726 * @hba: pointer to adapter instance
731 static void bnx2i_ep_active_list_add(struct bnx2i_hba *hba,
734 write_lock_bh(&hba->ep_rdwr_lock);
735 list_add_tail(&ep->link, &hba->ep_active_list);
736 write_unlock_bh(&hba->ep_rdwr_lock);
742 * @hba: pointer to adapter instance
747 static void bnx2i_ep_active_list_del(struct bnx2i_hba *hba,
750 write_lock_bh(&hba->ep_rdwr_lock);
752 write_unlock_bh(&hba->ep_rdwr_lock);
758 * @hba: pointer to adapter instance
765 static void bnx2i_setup_host_queue_size(struct bnx2i_hba *hba,
768 if (test_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type))
770 else if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type))
772 else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type))
789 struct bnx2i_hba *hba;
791 shost = iscsi_host_alloc(&bnx2i_host_template, sizeof(*hba), 0);
801 hba = iscsi_host_priv(shost);
802 hba->shost = shost;
803 hba->netdev = cnic->netdev;
804 /* Get PCI related information and update hba struct members */
805 hba->pcidev = cnic->pcidev;
806 pci_dev_get(hba->pcidev);
807 hba->pci_did = hba->pcidev->device;
808 hba->pci_vid = hba->pcidev->vendor;
809 hba->pci_sdid = hba->pcidev->subsystem_device;
810 hba->pci_svid = hba->pcidev->subsystem_vendor;
811 hba->pci_func = PCI_FUNC(hba->pcidev->devfn);
812 hba->pci_devno = PCI_SLOT(hba->pcidev->devfn);
814 bnx2i_identify_device(hba, cnic);
815 bnx2i_setup_host_queue_size(hba, shost);
817 hba->reg_base = pci_resource_start(hba->pcidev, 0);
818 if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) {
819 hba->regview = pci_iomap(hba->pcidev, 0, BNX2_MQ_CONFIG2);
820 if (!hba->regview)
822 } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
823 hba->regview = pci_iomap(hba->pcidev, 0, 4096);
824 if (!hba->regview)
828 if (bnx2i_setup_mp_bdt(hba))
831 INIT_LIST_HEAD(&hba->ep_ofld_list);
832 INIT_LIST_HEAD(&hba->ep_active_list);
833 INIT_LIST_HEAD(&hba->ep_destroy_list);
834 rwlock_init(&hba->ep_rdwr_lock);
836 hba->mtu_supported = BNX2I_MAX_MTU_SUPPORTED;
839 hba->max_active_conns = ISCSI_MAX_CONNS_PER_HBA;
841 if (bnx2i_setup_free_cid_que(hba))
845 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
847 hba->max_sqes = sq_size;
849 hba->max_sqes = BNX2I_5770X_SQ_WQES_DEFAULT;
852 hba->max_sqes = sq_size;
854 hba->max_sqes = BNX2I_570X_SQ_WQES_DEFAULT;
857 hba->max_rqes = rq_size;
858 hba->max_cqes = hba->max_sqes + rq_size;
859 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
860 if (hba->max_cqes > BNX2I_5770X_CQ_WQES_MAX)
861 hba->max_cqes = BNX2I_5770X_CQ_WQES_MAX;
862 } else if (hba->max_cqes > BNX2I_570X_CQ_WQES_MAX)
863 hba->max_cqes = BNX2I_570X_CQ_WQES_MAX;
865 hba->num_ccell = hba->max_sqes / 2;
867 spin_lock_init(&hba->lock);
868 mutex_init(&hba->net_dev_lock);
869 init_waitqueue_head(&hba->eh_wait);
870 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
871 hba->hba_shutdown_tmo = 30 * HZ;
872 hba->conn_teardown_tmo = 20 * HZ;
873 hba->conn_ctx_destroy_tmo = 6 * HZ;
875 hba->hba_shutdown_tmo = 20 * HZ;
876 hba->conn_teardown_tmo = 10 * HZ;
877 hba->conn_ctx_destroy_tmo = 2 * HZ;
881 spin_lock_init(&hba->stat_lock);
883 memset(&hba->stats, 0, sizeof(struct iscsi_stats_info));
885 if (iscsi_host_add(shost, &hba->pcidev->dev))
887 return hba;
890 bnx2i_release_free_cid_que(hba);
892 bnx2i_free_mp_bdt(hba);
894 if (hba->regview) {
895 pci_iounmap(hba->pcidev, hba->regview);
896 hba->regview = NULL;
899 pci_dev_put(hba->pcidev);
905 * bnx2i_free_hba- releases hba structure and resources held by the adapter
906 * @hba: pointer to adapter instance
910 void bnx2i_free_hba(struct bnx2i_hba *hba)
912 struct Scsi_Host *shost = hba->shost;
915 INIT_LIST_HEAD(&hba->ep_ofld_list);
916 INIT_LIST_HEAD(&hba->ep_active_list);
917 INIT_LIST_HEAD(&hba->ep_destroy_list);
918 pci_dev_put(hba->pcidev);
920 if (hba->regview) {
921 pci_iounmap(hba->pcidev, hba->regview);
922 hba->regview = NULL;
924 bnx2i_free_mp_bdt(hba);
925 bnx2i_release_free_cid_que(hba);
931 * @hba: pointer to adapter instance
936 static void bnx2i_conn_free_login_resources(struct bnx2i_hba *hba,
940 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
947 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
954 dma_free_coherent(&hba->pcidev->dev,
962 dma_free_coherent(&hba->pcidev->dev,
972 * @hba: pointer to adapter instance
977 static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba,
982 dma_alloc_coherent(&hba->pcidev->dev,
993 dma_alloc_coherent(&hba->pcidev->dev,
1004 dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1010 dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1019 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1025 dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
1030 dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
1162 struct bnx2i_hba *hba = bnx2i_conn->hba;
1173 bnx2i_send_cmd_cleanup_req(hba, task->dd_data);
1192 struct bnx2i_hba *hba = bnx2i_conn->hba;
1201 ADD_STATS_64(hba, tx_pdus, 1);
1202 ADD_STATS_64(hba, tx_bytes, task->data_count);
1226 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1233 hba->max_sqes)
1267 cmd->req.bd_list_addr_lo = (u32) hba->mp_bd_dma;
1268 cmd->req.bd_list_addr_hi = (u32) ((u64) hba->mp_bd_dma >> 32);
1291 struct bnx2i_hba *hba;
1300 shost = bnx2i_ep->hba->shost;
1301 hba = iscsi_host_priv(shost);
1302 if (bnx2i_adapter_ready(hba))
1309 if (cmds_max > hba->max_sqes)
1310 cmds_max = hba->max_sqes;
1320 if (bnx2i_setup_cmd_pool(hba, cls_session->dd_data))
1341 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1343 bnx2i_destroy_cmd_pool(hba, session);
1359 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1372 bnx2i_conn->hba = hba;
1380 if (bnx2i_conn_alloc_login_resources(hba, bnx2i_conn)) {
1412 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1424 if (bnx2i_adapter_ready(hba))
1436 if (bnx2i_ep->hba != hba) {
1441 bnx2i_ep, bnx2i_ep->hba->netdev->name);
1443 "belong to hba (%s)\n",
1444 hba->netdev->name);
1452 ret_code = bnx2i_bind_conn_to_iscsi_cid(hba, bnx2i_conn,
1458 if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
1478 struct bnx2i_hba *hba;
1484 hba = iscsi_host_priv(shost);
1486 bnx2i_conn_free_login_resources(hba, bnx2i_conn);
1523 struct bnx2i_hba *hba = bnx2i_ep->hba;
1526 if (!hba)
1531 mutex_lock(&hba->net_dev_lock);
1534 mutex_unlock(&hba->net_dev_lock);
1537 mutex_lock(&hba->net_dev_lock);
1540 mutex_unlock(&hba->net_dev_lock);
1558 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1563 len = sysfs_format_mac(buf, hba->cnic->mac_addr, 6);
1566 len = sprintf(buf, "%s\n", hba->netdev->name);
1569 struct list_head *active_list = &hba->ep_active_list;
1571 read_lock_bh(&hba->ep_rdwr_lock);
1572 if (!list_empty(&hba->ep_active_list)) {
1585 read_unlock_bh(&hba->ep_rdwr_lock);
1665 struct bnx2i_hba *hba;
1668 hba = get_adapter_list_head();
1669 if (hba && hba->cnic)
1670 cnic = hba->cnic->cm_select_dev(desti, CNIC_ULP_ISCSI);
1676 hba = bnx2i_find_hba_for_cnic(cnic);
1677 if (!hba)
1680 if (bnx2i_adapter_ready(hba)) {
1681 printk(KERN_ALERT "bnx2i: check route, hba not found\n");
1684 if (hba->netdev->mtu > hba->mtu_supported) {
1686 hba->netdev->name, hba->netdev->mtu);
1688 hba->mtu_supported);
1691 return hba;
1699 * @hba: pointer to adapter instance
1704 static int bnx2i_tear_down_conn(struct bnx2i_hba *hba,
1707 if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic) && ep->cm_sk)
1708 hba->cnic->cm_destroy(ep->cm_sk);
1710 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type) &&
1726 hba->netdev->name);
1731 ep->ofld_timer.expires = hba->conn_ctx_destroy_tmo + jiffies;
1736 bnx2i_ep_destroy_list_add(hba, ep);
1739 if (bnx2i_send_conn_destroy(hba, ep))
1749 bnx2i_ep_destroy_list_del(hba, ep);
1779 struct bnx2i_hba *hba;
1787 hba = iscsi_host_priv(shost);
1793 hba = bnx2i_check_route(dst_addr);
1795 if (!hba) {
1799 mutex_lock(&hba->net_dev_lock);
1801 if (bnx2i_adapter_ready(hba) || !hba->cid_que.cid_free_cnt) {
1805 cnic = hba->cnic;
1806 ep = bnx2i_alloc_ep(hba);
1814 iscsi_cid = bnx2i_alloc_iscsi_cid(hba);
1817 "iscsi cid\n", hba->netdev->name);
1822 bnx2i_ep->hba_age = hba->age;
1824 rc = bnx2i_alloc_qp_resc(hba, bnx2i_ep);
1827 "\n", hba->netdev->name);
1834 bnx2i_ep_ofld_list_add(hba, bnx2i_ep);
1842 if (bnx2i_send_conn_ofld_req(hba, bnx2i_ep)) {
1845 hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
1850 "\n", hba->netdev->name);
1851 bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
1863 bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
1868 hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
1900 if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) {
1908 bnx2i_ep_active_list_add(hba, bnx2i_ep);
1913 mutex_unlock(&hba->net_dev_lock);
1917 bnx2i_ep_active_list_del(hba, bnx2i_ep);
1919 if (bnx2i_tear_down_conn(hba, bnx2i_ep)) {
1920 mutex_unlock(&hba->net_dev_lock);
1924 bnx2i_free_qp_resc(hba, bnx2i_ep);
1928 mutex_unlock(&hba->net_dev_lock);
1985 if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
2027 struct bnx2i_hba *hba = bnx2i_ep->hba;
2035 if (!hba)
2038 cnic = hba->cnic;
2055 bnx2i_ep->ofld_timer.expires = hba->conn_teardown_tmo + jiffies;
2060 if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic))
2072 bnx2i_ep->hba->netdev->name);
2092 bnx2i_ep->hba->netdev->name, close, close_ret);
2103 bnx2i_ep_active_list_del(hba, bnx2i_ep);
2104 if (bnx2i_tear_down_conn(hba, bnx2i_ep))
2123 struct bnx2i_hba *hba;
2140 hba = bnx2i_ep->hba;
2142 mutex_lock(&hba->net_dev_lock);
2150 if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state) ||
2151 (bnx2i_ep->hba_age != hba->age)) {
2152 bnx2i_ep_active_list_del(hba, bnx2i_ep);
2158 mutex_unlock(&hba->net_dev_lock);
2162 bnx2i_free_qp_resc(hba, bnx2i_ep);
2169 mutex_unlock(&hba->net_dev_lock);
2171 wake_up_interruptible(&hba->eh_wait);
2182 struct bnx2i_hba *hba = iscsi_host_priv(shost);
2187 hba->cnic->iscsi_nl_msg_recv(hba->cnic, ISCSI_UEVENT_PATH_UPDATE, buf,