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
467 static void bnx2i_destroy_cmd_pool(struct bnx2i_hba *hba,
477 dma_free_coherent(&hba->pcidev->dev,
489 * @hba: adapter instance pointer
492 static int bnx2i_setup_cmd_pool(struct bnx2i_hba *hba,
504 if (bnx2i_alloc_bdt(hba, session, cmd))
511 bnx2i_destroy_cmd_pool(hba, session);
518 * @hba: pointer to adapter structure
523 static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba)
529 hba->mp_bd_tbl = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
530 &hba->mp_bd_dma, GFP_KERNEL);
531 if (!hba->mp_bd_tbl) {
537 hba->dummy_buffer = dma_alloc_coherent(&hba->pcidev->dev,
539 &hba->dummy_buf_dma, GFP_KERNEL);
540 if (!hba->dummy_buffer) {
542 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
543 hba->mp_bd_tbl, hba->mp_bd_dma);
544 hba->mp_bd_tbl = NULL;
549 mp_bdt = (struct iscsi_bd *) hba->mp_bd_tbl;
550 addr = (unsigned long) hba->dummy_buf_dma;
563 * @hba: pointer to adapter instance
567 static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba)
569 if (hba->mp_bd_tbl) {
570 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
571 hba->mp_bd_tbl, hba->mp_bd_dma);
572 hba->mp_bd_tbl = NULL;
574 if (hba->dummy_buffer) {
575 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
576 hba->dummy_buffer, hba->dummy_buf_dma);
577 hba->dummy_buffer = NULL;
599 * @hba: pointer to adapter instance
604 static int bnx2i_ep_destroy_list_add(struct bnx2i_hba *hba,
607 write_lock_bh(&hba->ep_rdwr_lock);
608 list_add_tail(&ep->link, &hba->ep_destroy_list);
609 write_unlock_bh(&hba->ep_rdwr_lock);
616 * @hba: pointer to adapter instance
621 static int bnx2i_ep_destroy_list_del(struct bnx2i_hba *hba,
624 write_lock_bh(&hba->ep_rdwr_lock);
626 write_unlock_bh(&hba->ep_rdwr_lock);
633 * @hba: pointer to adapter instance
638 static int bnx2i_ep_ofld_list_add(struct bnx2i_hba *hba,
641 write_lock_bh(&hba->ep_rdwr_lock);
642 list_add_tail(&ep->link, &hba->ep_ofld_list);
643 write_unlock_bh(&hba->ep_rdwr_lock);
649 * @hba: pointer to adapter instance
654 static int bnx2i_ep_ofld_list_del(struct bnx2i_hba *hba,
657 write_lock_bh(&hba->ep_rdwr_lock);
659 write_unlock_bh(&hba->ep_rdwr_lock);
667 * @hba: pointer to adapter instance
672 bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, u32 iscsi_cid)
678 read_lock_bh(&hba->ep_rdwr_lock);
679 list_for_each_safe(list, tmp, &hba->ep_ofld_list) {
686 read_unlock_bh(&hba->ep_rdwr_lock);
695 * @hba: pointer to adapter instance
700 bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba, u32 iscsi_cid)
706 read_lock_bh(&hba->ep_rdwr_lock);
707 list_for_each_safe(list, tmp, &hba->ep_destroy_list) {
714 read_unlock_bh(&hba->ep_rdwr_lock);
724 * @hba: pointer to adapter instance
729 static void bnx2i_ep_active_list_add(struct bnx2i_hba *hba,
732 write_lock_bh(&hba->ep_rdwr_lock);
733 list_add_tail(&ep->link, &hba->ep_active_list);
734 write_unlock_bh(&hba->ep_rdwr_lock);
740 * @hba: pointer to adapter instance
745 static void bnx2i_ep_active_list_del(struct bnx2i_hba *hba,
748 write_lock_bh(&hba->ep_rdwr_lock);
750 write_unlock_bh(&hba->ep_rdwr_lock);
756 * @hba: pointer to adapter instance
763 static void bnx2i_setup_host_queue_size(struct bnx2i_hba *hba,
766 if (test_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type))
768 else if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type))
770 else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type))
787 struct bnx2i_hba *hba;
789 shost = iscsi_host_alloc(&bnx2i_host_template, sizeof(*hba), 0);
799 hba = iscsi_host_priv(shost);
800 hba->shost = shost;
801 hba->netdev = cnic->netdev;
802 /* Get PCI related information and update hba struct members */
803 hba->pcidev = cnic->pcidev;
804 pci_dev_get(hba->pcidev);
805 hba->pci_did = hba->pcidev->device;
806 hba->pci_vid = hba->pcidev->vendor;
807 hba->pci_sdid = hba->pcidev->subsystem_device;
808 hba->pci_svid = hba->pcidev->subsystem_vendor;
809 hba->pci_func = PCI_FUNC(hba->pcidev->devfn);
810 hba->pci_devno = PCI_SLOT(hba->pcidev->devfn);
812 bnx2i_identify_device(hba, cnic);
813 bnx2i_setup_host_queue_size(hba, shost);
815 hba->reg_base = pci_resource_start(hba->pcidev, 0);
816 if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) {
817 hba->regview = pci_iomap(hba->pcidev, 0, BNX2_MQ_CONFIG2);
818 if (!hba->regview)
820 } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
821 hba->regview = pci_iomap(hba->pcidev, 0, 4096);
822 if (!hba->regview)
826 if (bnx2i_setup_mp_bdt(hba))
829 INIT_LIST_HEAD(&hba->ep_ofld_list);
830 INIT_LIST_HEAD(&hba->ep_active_list);
831 INIT_LIST_HEAD(&hba->ep_destroy_list);
832 rwlock_init(&hba->ep_rdwr_lock);
834 hba->mtu_supported = BNX2I_MAX_MTU_SUPPORTED;
837 hba->max_active_conns = ISCSI_MAX_CONNS_PER_HBA;
839 if (bnx2i_setup_free_cid_que(hba))
843 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
845 hba->max_sqes = sq_size;
847 hba->max_sqes = BNX2I_5770X_SQ_WQES_DEFAULT;
850 hba->max_sqes = sq_size;
852 hba->max_sqes = BNX2I_570X_SQ_WQES_DEFAULT;
855 hba->max_rqes = rq_size;
856 hba->max_cqes = hba->max_sqes + rq_size;
857 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
858 if (hba->max_cqes > BNX2I_5770X_CQ_WQES_MAX)
859 hba->max_cqes = BNX2I_5770X_CQ_WQES_MAX;
860 } else if (hba->max_cqes > BNX2I_570X_CQ_WQES_MAX)
861 hba->max_cqes = BNX2I_570X_CQ_WQES_MAX;
863 hba->num_ccell = hba->max_sqes / 2;
865 spin_lock_init(&hba->lock);
866 mutex_init(&hba->net_dev_lock);
867 init_waitqueue_head(&hba->eh_wait);
868 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
869 hba->hba_shutdown_tmo = 30 * HZ;
870 hba->conn_teardown_tmo = 20 * HZ;
871 hba->conn_ctx_destroy_tmo = 6 * HZ;
873 hba->hba_shutdown_tmo = 20 * HZ;
874 hba->conn_teardown_tmo = 10 * HZ;
875 hba->conn_ctx_destroy_tmo = 2 * HZ;
879 spin_lock_init(&hba->stat_lock);
881 memset(&hba->stats, 0, sizeof(struct iscsi_stats_info));
883 if (iscsi_host_add(shost, &hba->pcidev->dev))
885 return hba;
888 bnx2i_release_free_cid_que(hba);
890 bnx2i_free_mp_bdt(hba);
892 if (hba->regview) {
893 pci_iounmap(hba->pcidev, hba->regview);
894 hba->regview = NULL;
897 pci_dev_put(hba->pcidev);
903 * bnx2i_free_hba- releases hba structure and resources held by the adapter
904 * @hba: pointer to adapter instance
908 void bnx2i_free_hba(struct bnx2i_hba *hba)
910 struct Scsi_Host *shost = hba->shost;
913 INIT_LIST_HEAD(&hba->ep_ofld_list);
914 INIT_LIST_HEAD(&hba->ep_active_list);
915 INIT_LIST_HEAD(&hba->ep_destroy_list);
917 if (hba->regview) {
918 pci_iounmap(hba->pcidev, hba->regview);
919 hba->regview = NULL;
921 pci_dev_put(hba->pcidev);
922 bnx2i_free_mp_bdt(hba);
923 bnx2i_release_free_cid_que(hba);
929 * @hba: pointer to adapter instance
934 static void bnx2i_conn_free_login_resources(struct bnx2i_hba *hba,
938 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
945 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
952 dma_free_coherent(&hba->pcidev->dev,
960 dma_free_coherent(&hba->pcidev->dev,
970 * @hba: pointer to adapter instance
975 static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba,
980 dma_alloc_coherent(&hba->pcidev->dev,
991 dma_alloc_coherent(&hba->pcidev->dev,
1002 dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1008 dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1017 dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
1023 dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
1028 dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
1160 struct bnx2i_hba *hba = bnx2i_conn->hba;
1171 bnx2i_send_cmd_cleanup_req(hba, task->dd_data);
1190 struct bnx2i_hba *hba = bnx2i_conn->hba;
1199 ADD_STATS_64(hba, tx_pdus, 1);
1200 ADD_STATS_64(hba, tx_bytes, task->data_count);
1224 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1231 hba->max_sqes)
1265 cmd->req.bd_list_addr_lo = (u32) hba->mp_bd_dma;
1266 cmd->req.bd_list_addr_hi = (u32) ((u64) hba->mp_bd_dma >> 32);
1290 struct bnx2i_hba *hba;
1299 shost = bnx2i_ep->hba->shost;
1300 hba = iscsi_host_priv(shost);
1301 if (bnx2i_adapter_ready(hba))
1308 if (cmds_max > hba->max_sqes)
1309 cmds_max = hba->max_sqes;
1319 if (bnx2i_setup_cmd_pool(hba, cls_session->dd_data))
1340 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1342 bnx2i_destroy_cmd_pool(hba, session);
1358 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1371 bnx2i_conn->hba = hba;
1379 if (bnx2i_conn_alloc_login_resources(hba, bnx2i_conn)) {
1411 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1423 if (bnx2i_adapter_ready(hba)) {
1441 if (bnx2i_ep->hba != hba) {
1446 bnx2i_ep, bnx2i_ep->hba->netdev->name);
1448 "belong to hba (%s)\n",
1449 hba->netdev->name);
1458 ret_code = bnx2i_bind_conn_to_iscsi_cid(hba, bnx2i_conn,
1464 if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
1486 struct bnx2i_hba *hba;
1492 hba = iscsi_host_priv(shost);
1494 bnx2i_conn_free_login_resources(hba, bnx2i_conn);
1531 struct bnx2i_hba *hba = bnx2i_ep->hba;
1534 if (!hba)
1539 mutex_lock(&hba->net_dev_lock);
1542 mutex_unlock(&hba->net_dev_lock);
1545 mutex_lock(&hba->net_dev_lock);
1548 mutex_unlock(&hba->net_dev_lock);
1566 struct bnx2i_hba *hba = iscsi_host_priv(shost);
1571 len = sysfs_format_mac(buf, hba->cnic->mac_addr, 6);
1574 len = sprintf(buf, "%s\n", hba->netdev->name);
1577 struct list_head *active_list = &hba->ep_active_list;
1579 read_lock_bh(&hba->ep_rdwr_lock);
1580 if (!list_empty(&hba->ep_active_list)) {
1593 read_unlock_bh(&hba->ep_rdwr_lock);
1672 struct bnx2i_hba *hba;
1675 hba = get_adapter_list_head();
1676 if (hba && hba->cnic)
1677 cnic = hba->cnic->cm_select_dev(desti, CNIC_ULP_ISCSI);
1683 hba = bnx2i_find_hba_for_cnic(cnic);
1684 if (!hba)
1687 if (bnx2i_adapter_ready(hba)) {
1688 printk(KERN_ALERT "bnx2i: check route, hba not found\n");
1691 if (hba->netdev->mtu > hba->mtu_supported) {
1693 hba->netdev->name, hba->netdev->mtu);
1695 hba->mtu_supported);
1698 return hba;
1706 * @hba: pointer to adapter instance
1711 static int bnx2i_tear_down_conn(struct bnx2i_hba *hba,
1714 if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic) && ep->cm_sk)
1715 hba->cnic->cm_destroy(ep->cm_sk);
1717 if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type) &&
1733 hba->netdev->name);
1738 ep->ofld_timer.expires = hba->conn_ctx_destroy_tmo + jiffies;
1741 bnx2i_ep_destroy_list_add(hba, ep);
1744 if (bnx2i_send_conn_destroy(hba, ep))
1754 bnx2i_ep_destroy_list_del(hba, ep);
1784 struct bnx2i_hba *hba;
1792 hba = iscsi_host_priv(shost);
1798 hba = bnx2i_check_route(dst_addr);
1800 if (!hba) {
1804 mutex_lock(&hba->net_dev_lock);
1806 if (bnx2i_adapter_ready(hba) || !hba->cid_que.cid_free_cnt) {
1810 cnic = hba->cnic;
1811 ep = bnx2i_alloc_ep(hba);
1819 iscsi_cid = bnx2i_alloc_iscsi_cid(hba);
1822 "iscsi cid\n", hba->netdev->name);
1827 bnx2i_ep->hba_age = hba->age;
1829 rc = bnx2i_alloc_qp_resc(hba, bnx2i_ep);
1832 "\n", hba->netdev->name);
1839 bnx2i_ep_ofld_list_add(hba, bnx2i_ep);
1845 if (bnx2i_send_conn_ofld_req(hba, bnx2i_ep)) {
1848 hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
1853 "\n", hba->netdev->name);
1854 bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
1866 bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
1871 hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
1903 if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) {
1911 bnx2i_ep_active_list_add(hba, bnx2i_ep);
1917 mutex_unlock(&hba->net_dev_lock);
1921 bnx2i_ep_active_list_del(hba, bnx2i_ep);
1923 if (bnx2i_tear_down_conn(hba, bnx2i_ep)) {
1924 mutex_unlock(&hba->net_dev_lock);
1928 bnx2i_free_qp_resc(hba, bnx2i_ep);
1932 mutex_unlock(&hba->net_dev_lock);
1989 if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
2031 struct bnx2i_hba *hba = bnx2i_ep->hba;
2039 if (!hba)
2042 cnic = hba->cnic;
2059 bnx2i_ep->ofld_timer.expires = hba->conn_teardown_tmo + jiffies;
2062 if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic))
2074 bnx2i_ep->hba->netdev->name);
2094 bnx2i_ep->hba->netdev->name, close, close_ret);
2106 bnx2i_ep_active_list_del(hba, bnx2i_ep);
2107 if (bnx2i_tear_down_conn(hba, bnx2i_ep))
2125 struct bnx2i_hba *hba;
2139 hba = bnx2i_ep->hba;
2141 mutex_lock(&hba->net_dev_lock);
2149 if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state) ||
2150 (bnx2i_ep->hba_age != hba->age)) {
2151 bnx2i_ep_active_list_del(hba, bnx2i_ep);
2157 mutex_unlock(&hba->net_dev_lock);
2161 bnx2i_free_qp_resc(hba, bnx2i_ep);
2168 mutex_unlock(&hba->net_dev_lock);
2170 wake_up_interruptible(&hba->eh_wait);
2181 struct bnx2i_hba *hba = iscsi_host_priv(shost);
2186 hba->cnic->iscsi_nl_msg_recv(hba->cnic, ISCSI_UEVENT_PATH_UPDATE, buf,