| 
				
			 | 
			
			
				
				@@ -39,6 +39,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); 
			 | 
		
		
	
		
			
			| 
				39
			 | 
			
				39
			 | 
			
			
				
				 #include <ipxe/if_ether.h> 
			 | 
		
		
	
		
			
			| 
				40
			 | 
			
				40
			 | 
			
			
				
				 #include <ipxe/ethernet.h> 
			 | 
		
		
	
		
			
			| 
				41
			 | 
			
				41
			 | 
			
			
				
				 #include <ipxe/fcoe.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				
				+#include <ipxe/vlan.h> 
			 | 
		
		
	
		
			
			| 
				42
			 | 
			
				43
			 | 
			
			
				
				 #include "hermon.h" 
			 | 
		
		
	
		
			
			| 
				43
			 | 
			
				44
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				44
			 | 
			
				45
			 | 
			
			
				
				 /** 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -1648,6 +1649,7 @@ static int hermon_complete ( struct ib_device *ibdev, 
			 | 
		
		
	
		
			
			| 
				1648
			 | 
			
				1649
			 | 
			
			
				
				 		len = MLX_GET ( &cqe->normal, byte_cnt ); 
			 | 
		
		
	
		
			
			| 
				1649
			 | 
			
				1650
			 | 
			
			
				
				 		assert ( len <= iob_tailroom ( iobuf ) ); 
			 | 
		
		
	
		
			
			| 
				1650
			 | 
			
				1651
			 | 
			
			
				
				 		iob_put ( iobuf, len ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				1652
			 | 
			
			
				
				+		memset ( &recv_av, 0, sizeof ( recv_av ) ); 
			 | 
		
		
	
		
			
			| 
				1651
			 | 
			
				1653
			 | 
			
			
				
				 		switch ( qp->type ) { 
			 | 
		
		
	
		
			
			| 
				1652
			 | 
			
				1654
			 | 
			
			
				
				 		case IB_QPT_SMI: 
			 | 
		
		
	
		
			
			| 
				1653
			 | 
			
				1655
			 | 
			
			
				
				 		case IB_QPT_GSI: 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -1657,7 +1659,6 @@ static int hermon_complete ( struct ib_device *ibdev, 
			 | 
		
		
	
		
			
			| 
				1657
			 | 
			
				1659
			 | 
			
			
				
				 			iob_pull ( iobuf, sizeof ( *grh ) ); 
			 | 
		
		
	
		
			
			| 
				1658
			 | 
			
				1660
			 | 
			
			
				
				 			/* Construct address vector */ 
			 | 
		
		
	
		
			
			| 
				1659
			 | 
			
				1661
			 | 
			
			
				
				 			av = &recv_av; 
			 | 
		
		
	
		
			
			| 
				1660
			 | 
			
				
			 | 
			
			
				
				-			memset ( av, 0, sizeof ( *av ) ); 
			 | 
		
		
	
		
			
			| 
				1661
			 | 
			
				1662
			 | 
			
			
				
				 			av->qpn = MLX_GET ( &cqe->normal, srq_rqpn ); 
			 | 
		
		
	
		
			
			| 
				1662
			 | 
			
				1663
			 | 
			
			
				
				 			av->lid = MLX_GET ( &cqe->normal, slid_smac47_32 ); 
			 | 
		
		
	
		
			
			| 
				1663
			 | 
			
				1664
			 | 
			
			
				
				 			av->sl = MLX_GET ( &cqe->normal, sl ); 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -1668,7 +1669,10 @@ static int hermon_complete ( struct ib_device *ibdev, 
			 | 
		
		
	
		
			
			| 
				1668
			 | 
			
				1669
			 | 
			
			
				
				 			av = &qp->av; 
			 | 
		
		
	
		
			
			| 
				1669
			 | 
			
				1670
			 | 
			
			
				
				 			break; 
			 | 
		
		
	
		
			
			| 
				1670
			 | 
			
				1671
			 | 
			
			
				
				 		case IB_QPT_ETH: 
			 | 
		
		
	
		
			
			| 
				1671
			 | 
			
				
			 | 
			
			
				
				-			av = NULL; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				1672
			 | 
			
			
				
				+			/* Construct address vector */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				1673
			 | 
			
			
				
				+			av = &recv_av; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				1674
			 | 
			
			
				
				+			av->vlan_present = MLX_GET ( &cqe->normal, vlan ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				1675
			 | 
			
			
				
				+			av->vlan = MLX_GET ( &cqe->normal, vid ); 
			 | 
		
		
	
		
			
			| 
				1672
			 | 
			
				1676
			 | 
			
			
				
				 			break; 
			 | 
		
		
	
		
			
			| 
				1673
			 | 
			
				1677
			 | 
			
			
				
				 		default: 
			 | 
		
		
	
		
			
			| 
				1674
			 | 
			
				1678
			 | 
			
			
				
				 			assert ( 0 ); 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -2275,9 +2279,19 @@ static void hermon_eth_complete_send ( struct ib_device *ibdev __unused, 
			 | 
		
		
	
		
			
			| 
				2275
			 | 
			
				2279
			 | 
			
			
				
				  */ 
			 | 
		
		
	
		
			
			| 
				2276
			 | 
			
				2280
			 | 
			
			
				
				 static void hermon_eth_complete_recv ( struct ib_device *ibdev __unused, 
			 | 
		
		
	
		
			
			| 
				2277
			 | 
			
				2281
			 | 
			
			
				
				 				       struct ib_queue_pair *qp, 
			 | 
		
		
	
		
			
			| 
				2278
			 | 
			
				
			 | 
			
			
				
				-				       struct ib_address_vector *av __unused, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2282
			 | 
			
			
				
				+				       struct ib_address_vector *av, 
			 | 
		
		
	
		
			
			| 
				2279
			 | 
			
				2283
			 | 
			
			
				
				 				       struct io_buffer *iobuf, int rc ) { 
			 | 
		
		
	
		
			
			| 
				2280
			 | 
			
				2284
			 | 
			
			
				
				 	struct net_device *netdev = ib_qp_get_ownerdata ( qp ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2285
			 | 
			
			
				
				+	struct net_device *vlan; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2286
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2287
			 | 
			
			
				
				+	/* Find VLAN device, if applicable */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2288
			 | 
			
			
				
				+	if ( av->vlan_present ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2289
			 | 
			
			
				
				+		if ( ( vlan = vlan_find ( netdev, av->vlan ) ) != NULL ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2290
			 | 
			
			
				
				+			netdev = vlan; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2291
			 | 
			
			
				
				+		} else if ( rc == 0 ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2292
			 | 
			
			
				
				+			rc = -ENODEV; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2293
			 | 
			
			
				
				+		} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				2294
			 | 
			
			
				
				+	} 
			 | 
		
		
	
		
			
			| 
				2281
			 | 
			
				2295
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				2282
			 | 
			
				2296
			 | 
			
			
				
				 	/* Hand off to network layer */ 
			 | 
		
		
	
		
			
			| 
				2283
			 | 
			
				2297
			 | 
			
			
				
				 	if ( rc == 0 ) { 
			 |