Merge tag 'vfio-v5.2-rc1' of git://github.com/awilliam/linux-vfio
[linux-2.6-microblaze.git] / drivers / scsi / cxgbi / libcxgbi.c
index 006372b..8b915d4 100644 (file)
@@ -282,7 +282,6 @@ struct cxgbi_device *cxgbi_device_find_by_netdev_rcu(struct net_device *ndev,
 }
 EXPORT_SYMBOL_GPL(cxgbi_device_find_by_netdev_rcu);
 
-#if IS_ENABLED(CONFIG_IPV6)
 static struct cxgbi_device *cxgbi_device_find_by_mac(struct net_device *ndev,
                                                     int *port)
 {
@@ -315,7 +314,6 @@ static struct cxgbi_device *cxgbi_device_find_by_mac(struct net_device *ndev,
                  ndev, ndev->name);
        return NULL;
 }
-#endif
 
 void cxgbi_hbas_remove(struct cxgbi_device *cdev)
 {
@@ -653,6 +651,8 @@ cxgbi_check_route(struct sockaddr *dst_addr, int ifindex)
        }
 
        cdev = cxgbi_device_find_by_netdev(ndev, &port);
+       if (!cdev)
+               cdev = cxgbi_device_find_by_mac(ndev, &port);
        if (!cdev) {
                pr_info("dst %pI4, %s, NOT cxgbi device.\n",
                        &daddr->sin_addr.s_addr, ndev->name);
@@ -2310,7 +2310,6 @@ int cxgbi_get_ep_param(struct iscsi_endpoint *ep, enum iscsi_param param,
 {
        struct cxgbi_endpoint *cep = ep->dd_data;
        struct cxgbi_sock *csk;
-       int len;
 
        log_debug(1 << CXGBI_DBG_ISCSI,
                "cls_conn 0x%p, param %d.\n", ep, param);
@@ -2328,9 +2327,9 @@ int cxgbi_get_ep_param(struct iscsi_endpoint *ep, enum iscsi_param param,
                return iscsi_conn_get_addr_param((struct sockaddr_storage *)
                                                 &csk->daddr, param, buf);
        default:
-               return -ENOSYS;
+               break;
        }
-       return len;
+       return -ENOSYS;
 }
 EXPORT_SYMBOL_GPL(cxgbi_get_ep_param);
 
@@ -2563,13 +2562,9 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost,
                        pr_info("shost 0x%p, priv NULL.\n", shost);
                        goto err_out;
                }
-
-               rtnl_lock();
-               if (!vlan_uses_dev(hba->ndev))
-                       ifindex = hba->ndev->ifindex;
-               rtnl_unlock();
        }
 
+check_route:
        if (dst_addr->sa_family == AF_INET) {
                csk = cxgbi_check_route(dst_addr, ifindex);
 #if IS_ENABLED(CONFIG_IPV6)
@@ -2590,6 +2585,13 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost,
        if (!hba)
                hba = csk->cdev->hbas[csk->port_id];
        else if (hba != csk->cdev->hbas[csk->port_id]) {
+               if (ifindex != hba->ndev->ifindex) {
+                       cxgbi_sock_put(csk);
+                       cxgbi_sock_closed(csk);
+                       ifindex = hba->ndev->ifindex;
+                       goto check_route;
+               }
+
                pr_info("Could not connect through requested host %u"
                        "hba 0x%p != 0x%p (%u).\n",
                        shost->host_no, hba,