|  | @@ -541,6 +541,16 @@ hermon_cmd_map_fa ( struct hermon *hermon,
 | 
		
	
		
			
			| 541 | 541 |  			    0, map, 1, NULL );
 | 
		
	
		
			
			| 542 | 542 |  }
 | 
		
	
		
			
			| 543 | 543 |  
 | 
		
	
		
			
			|  | 544 | +static inline int
 | 
		
	
		
			
			|  | 545 | +hermon_cmd_sense_port ( struct hermon *hermon, unsigned int port,
 | 
		
	
		
			
			|  | 546 | +			struct hermonprm_sense_port *port_type ) {
 | 
		
	
		
			
			|  | 547 | +	return hermon_cmd ( hermon,
 | 
		
	
		
			
			|  | 548 | +                            HERMON_HCR_OUT_CMD ( HERMON_HCR_SENSE_PORT,
 | 
		
	
		
			
			|  | 549 | +                                                 1, sizeof ( *port_type ) ),
 | 
		
	
		
			
			|  | 550 | +                            0, NULL, port, port_type );
 | 
		
	
		
			
			|  | 551 | +}
 | 
		
	
		
			
			|  | 552 | +
 | 
		
	
		
			
			|  | 553 | +
 | 
		
	
		
			
			| 544 | 554 |  /***************************************************************************
 | 
		
	
		
			
			| 545 | 555 |   *
 | 
		
	
		
			
			| 546 | 556 |   * Memory translation table operations
 | 
		
	
	
		
			
			|  | @@ -1664,7 +1674,7 @@ static void hermon_event_port_state_change ( struct hermon *hermon,
 | 
		
	
		
			
			| 1664 | 1674 |  	       ( link_up ? "up" : "down" ) );
 | 
		
	
		
			
			| 1665 | 1675 |  
 | 
		
	
		
			
			| 1666 | 1676 |  	/* Sanity check */
 | 
		
	
		
			
			| 1667 |  | -	if ( port >= HERMON_NUM_PORTS ) {
 | 
		
	
		
			
			|  | 1677 | +	if ( port >= hermon->cap.num_ports ) {
 | 
		
	
		
			
			| 1668 | 1678 |  		DBGC ( hermon, "Hermon %p port %d does not exist!\n",
 | 
		
	
		
			
			| 1669 | 1679 |  		       hermon, ( port + 1 ) );
 | 
		
	
		
			
			| 1670 | 1680 |  		return;
 | 
		
	
	
		
			
			|  | @@ -1735,6 +1745,36 @@ static void hermon_poll_eq ( struct ib_device *ibdev ) {
 | 
		
	
		
			
			| 1735 | 1745 |   ***************************************************************************
 | 
		
	
		
			
			| 1736 | 1746 |   */
 | 
		
	
		
			
			| 1737 | 1747 |  
 | 
		
	
		
			
			|  | 1748 | +/**
 | 
		
	
		
			
			|  | 1749 | + * Sense port type
 | 
		
	
		
			
			|  | 1750 | + *
 | 
		
	
		
			
			|  | 1751 | + * @v ibdev		Infiniband device
 | 
		
	
		
			
			|  | 1752 | + * @ret port_type	Port type, or negative error
 | 
		
	
		
			
			|  | 1753 | + */
 | 
		
	
		
			
			|  | 1754 | +static int hermon_sense_port_type ( struct ib_device *ibdev ) {
 | 
		
	
		
			
			|  | 1755 | +	struct hermon *hermon = ib_get_drvdata ( ibdev );
 | 
		
	
		
			
			|  | 1756 | +	struct hermonprm_sense_port sense_port;
 | 
		
	
		
			
			|  | 1757 | +	int port_type;
 | 
		
	
		
			
			|  | 1758 | +	int rc;
 | 
		
	
		
			
			|  | 1759 | +
 | 
		
	
		
			
			|  | 1760 | +	/* If DPDP is not supported, always assume Infiniband */
 | 
		
	
		
			
			|  | 1761 | +	if ( ! hermon->cap.dpdp )
 | 
		
	
		
			
			|  | 1762 | +		return HERMON_PORT_TYPE_IB;
 | 
		
	
		
			
			|  | 1763 | +
 | 
		
	
		
			
			|  | 1764 | +	/* Sense the port type */
 | 
		
	
		
			
			|  | 1765 | +	if ( ( rc = hermon_cmd_sense_port ( hermon, ibdev->port,
 | 
		
	
		
			
			|  | 1766 | +					    &sense_port ) ) != 0 ) {
 | 
		
	
		
			
			|  | 1767 | +		DBGC ( hermon, "Hermon %p port %d sense failed: %s\n",
 | 
		
	
		
			
			|  | 1768 | +		       hermon, ibdev->port, strerror ( rc ) );
 | 
		
	
		
			
			|  | 1769 | +		return rc;
 | 
		
	
		
			
			|  | 1770 | +	}
 | 
		
	
		
			
			|  | 1771 | +	port_type = MLX_GET ( &sense_port, port_type );
 | 
		
	
		
			
			|  | 1772 | +
 | 
		
	
		
			
			|  | 1773 | +	DBGC ( hermon, "Hermon %p port %d type %d\n",
 | 
		
	
		
			
			|  | 1774 | +	       hermon, ibdev->port, port_type );
 | 
		
	
		
			
			|  | 1775 | +	return port_type;
 | 
		
	
		
			
			|  | 1776 | +}
 | 
		
	
		
			
			|  | 1777 | +
 | 
		
	
		
			
			| 1738 | 1778 |  /**
 | 
		
	
		
			
			| 1739 | 1779 |   * Initialise Infiniband link
 | 
		
	
		
			
			| 1740 | 1780 |   *
 | 
		
	
	
		
			
			|  | @@ -1744,8 +1784,19 @@ static void hermon_poll_eq ( struct ib_device *ibdev ) {
 | 
		
	
		
			
			| 1744 | 1784 |  static int hermon_open ( struct ib_device *ibdev ) {
 | 
		
	
		
			
			| 1745 | 1785 |  	struct hermon *hermon = ib_get_drvdata ( ibdev );
 | 
		
	
		
			
			| 1746 | 1786 |  	struct hermonprm_init_port init_port;
 | 
		
	
		
			
			|  | 1787 | +	int port_type;
 | 
		
	
		
			
			| 1747 | 1788 |  	int rc;
 | 
		
	
		
			
			| 1748 | 1789 |  
 | 
		
	
		
			
			|  | 1790 | +	/* Check we are connected to an Infiniband network */
 | 
		
	
		
			
			|  | 1791 | +	if ( ( rc = port_type = hermon_sense_port_type ( ibdev ) ) < 0 )
 | 
		
	
		
			
			|  | 1792 | +		return rc;
 | 
		
	
		
			
			|  | 1793 | +	if ( port_type != HERMON_PORT_TYPE_IB ) {
 | 
		
	
		
			
			|  | 1794 | +		DBGC ( hermon, "Hermon %p port %d not connected to an "
 | 
		
	
		
			
			|  | 1795 | +		       "Infiniband network", hermon, ibdev->port );
 | 
		
	
		
			
			|  | 1796 | +		return -ENOTCONN;
 | 
		
	
		
			
			|  | 1797 | +        }
 | 
		
	
		
			
			|  | 1798 | +
 | 
		
	
		
			
			|  | 1799 | +	/* Init Port */
 | 
		
	
		
			
			| 1749 | 1800 |  	memset ( &init_port, 0, sizeof ( init_port ) );
 | 
		
	
		
			
			| 1750 | 1801 |  	MLX_FILL_2 ( &init_port, 0,
 | 
		
	
		
			
			| 1751 | 1802 |  		     port_width_cap, 3,
 | 
		
	
	
		
			
			|  | @@ -2099,6 +2150,15 @@ static int hermon_get_cap ( struct hermon *hermon ) {
 | 
		
	
		
			
			| 2099 | 2150 |  		( 1 << MLX_GET ( &dev_cap, log2_rsvd_mrws ) );
 | 
		
	
		
			
			| 2100 | 2151 |  	hermon->cap.dmpt_entry_size = MLX_GET ( &dev_cap, d_mpt_entry_sz );
 | 
		
	
		
			
			| 2101 | 2152 |  	hermon->cap.reserved_uars = MLX_GET ( &dev_cap, num_rsvd_uars );
 | 
		
	
		
			
			|  | 2153 | +	hermon->cap.num_ports = MLX_GET ( &dev_cap, num_ports );
 | 
		
	
		
			
			|  | 2154 | +	hermon->cap.dpdp = MLX_GET ( &dev_cap, dpdp );
 | 
		
	
		
			
			|  | 2155 | +
 | 
		
	
		
			
			|  | 2156 | +	/* Sanity check */
 | 
		
	
		
			
			|  | 2157 | +	if ( hermon->cap.num_ports > HERMON_MAX_PORTS ) {
 | 
		
	
		
			
			|  | 2158 | +		DBGC ( hermon, "Hermon %p has %d ports (only %d supported)\n",
 | 
		
	
		
			
			|  | 2159 | +		       hermon, hermon->cap.num_ports, HERMON_MAX_PORTS );
 | 
		
	
		
			
			|  | 2160 | +		hermon->cap.num_ports = HERMON_MAX_PORTS;
 | 
		
	
		
			
			|  | 2161 | +	}
 | 
		
	
		
			
			| 2102 | 2162 |  
 | 
		
	
		
			
			| 2103 | 2163 |  	return 0;
 | 
		
	
		
			
			| 2104 | 2164 |  }
 | 
		
	
	
		
			
			|  | @@ -2478,7 +2538,7 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2478 | 2538 |  	struct hermon *hermon;
 | 
		
	
		
			
			| 2479 | 2539 |  	struct ib_device *ibdev;
 | 
		
	
		
			
			| 2480 | 2540 |  	struct hermonprm_init_hca init_hca;
 | 
		
	
		
			
			| 2481 |  | -	int i;
 | 
		
	
		
			
			|  | 2541 | +	unsigned int i;
 | 
		
	
		
			
			| 2482 | 2542 |  	int rc;
 | 
		
	
		
			
			| 2483 | 2543 |  
 | 
		
	
		
			
			| 2484 | 2544 |  	/* Allocate Hermon device */
 | 
		
	
	
		
			
			|  | @@ -2489,20 +2549,6 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2489 | 2549 |  	}
 | 
		
	
		
			
			| 2490 | 2550 |  	pci_set_drvdata ( pci, hermon );
 | 
		
	
		
			
			| 2491 | 2551 |  
 | 
		
	
		
			
			| 2492 |  | -	/* Allocate Infiniband devices */
 | 
		
	
		
			
			| 2493 |  | -	for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ ) {
 | 
		
	
		
			
			| 2494 |  | -	        ibdev = alloc_ibdev ( 0 );
 | 
		
	
		
			
			| 2495 |  | -		if ( ! ibdev ) {
 | 
		
	
		
			
			| 2496 |  | -			rc = -ENOMEM;
 | 
		
	
		
			
			| 2497 |  | -			goto err_alloc_ibdev;
 | 
		
	
		
			
			| 2498 |  | -		}
 | 
		
	
		
			
			| 2499 |  | -		hermon->ibdev[i] = ibdev;
 | 
		
	
		
			
			| 2500 |  | -		ibdev->op = &hermon_ib_operations;
 | 
		
	
		
			
			| 2501 |  | -		ibdev->dev = &pci->dev;
 | 
		
	
		
			
			| 2502 |  | -		ibdev->port = ( HERMON_PORT_BASE + i );
 | 
		
	
		
			
			| 2503 |  | -		ib_set_drvdata ( ibdev, hermon );
 | 
		
	
		
			
			| 2504 |  | -	}
 | 
		
	
		
			
			| 2505 |  | -
 | 
		
	
		
			
			| 2506 | 2552 |  	/* Fix up PCI device */
 | 
		
	
		
			
			| 2507 | 2553 |  	adjust_pci_device ( pci );
 | 
		
	
		
			
			| 2508 | 2554 |  
 | 
		
	
	
		
			
			|  | @@ -2534,6 +2580,20 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2534 | 2580 |  	if ( ( rc = hermon_get_cap ( hermon ) ) != 0 )
 | 
		
	
		
			
			| 2535 | 2581 |  		goto err_get_cap;
 | 
		
	
		
			
			| 2536 | 2582 |  
 | 
		
	
		
			
			|  | 2583 | +	/* Allocate Infiniband devices */
 | 
		
	
		
			
			|  | 2584 | +	for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
 | 
		
	
		
			
			|  | 2585 | +	        ibdev = alloc_ibdev ( 0 );
 | 
		
	
		
			
			|  | 2586 | +		if ( ! ibdev ) {
 | 
		
	
		
			
			|  | 2587 | +			rc = -ENOMEM;
 | 
		
	
		
			
			|  | 2588 | +			goto err_alloc_ibdev;
 | 
		
	
		
			
			|  | 2589 | +		}
 | 
		
	
		
			
			|  | 2590 | +		hermon->ibdev[i] = ibdev;
 | 
		
	
		
			
			|  | 2591 | +		ibdev->op = &hermon_ib_operations;
 | 
		
	
		
			
			|  | 2592 | +		ibdev->dev = &pci->dev;
 | 
		
	
		
			
			|  | 2593 | +		ibdev->port = ( HERMON_PORT_BASE + i );
 | 
		
	
		
			
			|  | 2594 | +		ib_set_drvdata ( ibdev, hermon );
 | 
		
	
		
			
			|  | 2595 | +	}
 | 
		
	
		
			
			|  | 2596 | +
 | 
		
	
		
			
			| 2537 | 2597 |  	/* Allocate ICM */
 | 
		
	
		
			
			| 2538 | 2598 |  	memset ( &init_hca, 0, sizeof ( init_hca ) );
 | 
		
	
		
			
			| 2539 | 2599 |  	if ( ( rc = hermon_alloc_icm ( hermon, &init_hca ) ) != 0 )
 | 
		
	
	
		
			
			|  | @@ -2552,7 +2612,7 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2552 | 2612 |  	/* Set up memory protection */
 | 
		
	
		
			
			| 2553 | 2613 |  	if ( ( rc = hermon_setup_mpt ( hermon ) ) != 0 )
 | 
		
	
		
			
			| 2554 | 2614 |  		goto err_setup_mpt;
 | 
		
	
		
			
			| 2555 |  | -	for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ )
 | 
		
	
		
			
			|  | 2615 | +	for ( i = 0 ; i < hermon->cap.num_ports ; i++ )
 | 
		
	
		
			
			| 2556 | 2616 |  		hermon->ibdev[i]->rdma_key = hermon->lkey;
 | 
		
	
		
			
			| 2557 | 2617 |  
 | 
		
	
		
			
			| 2558 | 2618 |  	/* Set up event queue */
 | 
		
	
	
		
			
			|  | @@ -2563,12 +2623,13 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2563 | 2623 |  	if ( ( rc = hermon_configure_special_qps ( hermon ) ) != 0 )
 | 
		
	
		
			
			| 2564 | 2624 |  		goto err_conf_special_qps;
 | 
		
	
		
			
			| 2565 | 2625 |  
 | 
		
	
		
			
			| 2566 |  | -	/* Update MAD parameters */
 | 
		
	
		
			
			| 2567 |  | -	for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ )
 | 
		
	
		
			
			|  | 2626 | +	/* Update IPoIB MAC address */
 | 
		
	
		
			
			|  | 2627 | +	for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
 | 
		
	
		
			
			| 2568 | 2628 |  		ib_smc_update ( hermon->ibdev[i], hermon_mad );
 | 
		
	
		
			
			|  | 2629 | +	}
 | 
		
	
		
			
			| 2569 | 2630 |  
 | 
		
	
		
			
			| 2570 | 2631 |  	/* Register Infiniband devices */
 | 
		
	
		
			
			| 2571 |  | -	for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ ) {
 | 
		
	
		
			
			|  | 2632 | +	for ( i = 0 ; i < hermon->cap.num_ports ; i++ ) {
 | 
		
	
		
			
			| 2572 | 2633 |  		if ( ( rc = register_ibdev ( hermon->ibdev[i] ) ) != 0 ) {
 | 
		
	
		
			
			| 2573 | 2634 |  			DBGC ( hermon, "Hermon %p could not register IB "
 | 
		
	
		
			
			| 2574 | 2635 |  			       "device: %s\n", hermon, strerror ( rc ) );
 | 
		
	
	
		
			
			|  | @@ -2578,9 +2639,9 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2578 | 2639 |  
 | 
		
	
		
			
			| 2579 | 2640 |  	return 0;
 | 
		
	
		
			
			| 2580 | 2641 |  
 | 
		
	
		
			
			| 2581 |  | -	i = HERMON_NUM_PORTS;
 | 
		
	
		
			
			|  | 2642 | +	i = hermon->cap.num_ports;
 | 
		
	
		
			
			| 2582 | 2643 |   err_register_ibdev:
 | 
		
	
		
			
			| 2583 |  | -	for ( i-- ; i >= 0 ; i-- )
 | 
		
	
		
			
			|  | 2644 | +	for ( i-- ; ( signed int ) i >= 0 ; i-- )
 | 
		
	
		
			
			| 2584 | 2645 |  		unregister_ibdev ( hermon->ibdev[i] );
 | 
		
	
		
			
			| 2585 | 2646 |   err_conf_special_qps:
 | 
		
	
		
			
			| 2586 | 2647 |  	hermon_destroy_eq ( hermon );
 | 
		
	
	
		
			
			|  | @@ -2590,6 +2651,10 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2590 | 2651 |   err_init_hca:
 | 
		
	
		
			
			| 2591 | 2652 |  	hermon_free_icm ( hermon );
 | 
		
	
		
			
			| 2592 | 2653 |   err_alloc_icm:
 | 
		
	
		
			
			|  | 2654 | +	i = hermon->cap.num_ports;
 | 
		
	
		
			
			|  | 2655 | + err_alloc_ibdev:
 | 
		
	
		
			
			|  | 2656 | +	for ( i-- ; ( signed int ) i >= 0 ; i-- )
 | 
		
	
		
			
			|  | 2657 | +		ibdev_put ( hermon->ibdev[i] );
 | 
		
	
		
			
			| 2593 | 2658 |   err_get_cap:
 | 
		
	
		
			
			| 2594 | 2659 |  	hermon_stop_firmware ( hermon );
 | 
		
	
		
			
			| 2595 | 2660 |   err_start_firmware:
 | 
		
	
	
		
			
			|  | @@ -2597,10 +2662,6 @@ static int hermon_probe ( struct pci_device *pci,
 | 
		
	
		
			
			| 2597 | 2662 |   err_mailbox_out:
 | 
		
	
		
			
			| 2598 | 2663 |  	free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
 | 
		
	
		
			
			| 2599 | 2664 |   err_mailbox_in:
 | 
		
	
		
			
			| 2600 |  | -	i = HERMON_NUM_PORTS;
 | 
		
	
		
			
			| 2601 |  | - err_alloc_ibdev:
 | 
		
	
		
			
			| 2602 |  | -	for ( i-- ; i >= 0 ; i-- )
 | 
		
	
		
			
			| 2603 |  | -		ibdev_put ( hermon->ibdev[i] );
 | 
		
	
		
			
			| 2604 | 2665 |  	free ( hermon );
 | 
		
	
		
			
			| 2605 | 2666 |   err_alloc_hermon:
 | 
		
	
		
			
			| 2606 | 2667 |  	return rc;
 | 
		
	
	
		
			
			|  | @@ -2615,7 +2676,7 @@ static void hermon_remove ( struct pci_device *pci ) {
 | 
		
	
		
			
			| 2615 | 2676 |  	struct hermon *hermon = pci_get_drvdata ( pci );
 | 
		
	
		
			
			| 2616 | 2677 |  	int i;
 | 
		
	
		
			
			| 2617 | 2678 |  
 | 
		
	
		
			
			| 2618 |  | -	for ( i = ( HERMON_NUM_PORTS - 1 ) ; i >= 0 ; i-- )
 | 
		
	
		
			
			|  | 2679 | +	for ( i = ( hermon->cap.num_ports - 1 ) ; i >= 0 ; i-- )
 | 
		
	
		
			
			| 2619 | 2680 |  		unregister_ibdev ( hermon->ibdev[i] );
 | 
		
	
		
			
			| 2620 | 2681 |  	hermon_destroy_eq ( hermon );
 | 
		
	
		
			
			| 2621 | 2682 |  	hermon_cmd_close_hca ( hermon );
 | 
		
	
	
		
			
			|  | @@ -2624,7 +2685,7 @@ static void hermon_remove ( struct pci_device *pci ) {
 | 
		
	
		
			
			| 2624 | 2685 |  	hermon_stop_firmware ( hermon );
 | 
		
	
		
			
			| 2625 | 2686 |  	free_dma ( hermon->mailbox_out, HERMON_MBOX_SIZE );
 | 
		
	
		
			
			| 2626 | 2687 |  	free_dma ( hermon->mailbox_in, HERMON_MBOX_SIZE );
 | 
		
	
		
			
			| 2627 |  | -	for ( i = ( HERMON_NUM_PORTS - 1 ) ; i >= 0 ; i-- )
 | 
		
	
		
			
			|  | 2688 | +	for ( i = ( hermon->cap.num_ports - 1 ) ; i >= 0 ; i-- )
 | 
		
	
		
			
			| 2628 | 2689 |  		ibdev_put ( hermon->ibdev[i] );
 | 
		
	
		
			
			| 2629 | 2690 |  	free ( hermon );
 | 
		
	
		
			
			| 2630 | 2691 |  }
 |