Skip to content

Commit

Permalink
vxge: Pass correct number of VFs value to pci_sriov_enable().
Browse files Browse the repository at this point in the history
-  max_config_dev loadable parameter is set to 0xFF by default. Pass correct
   number of VFs value to pci_sriov_enable() if max_config_dev is set to its 
   default value.
 
Signed-off-by: Sreenivasa Honnur <sreenivasa.honnur@exar.com>
Signed-off-by: Ramkrishna Vepa <ram.vepa@exar.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sreenivasa Honnur authored and David S. Miller committed Apr 8, 2010
1 parent 9002397 commit cb27ec6
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 12 deletions.
14 changes: 12 additions & 2 deletions drivers/net/vxge/vxge-config.h
Original file line number Diff line number Diff line change
Expand Up @@ -764,10 +764,18 @@ struct vxge_hw_device_hw_info {
#define VXGE_HW_SR_VH_VIRTUAL_FUNCTION 6
#define VXGE_HW_VH_NORMAL_FUNCTION 7
u64 function_mode;
#define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION 0
#define VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION 1
#define VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION 0
#define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION 1
#define VXGE_HW_FUNCTION_MODE_SRIOV 2
#define VXGE_HW_FUNCTION_MODE_MRIOV 3
#define VXGE_HW_FUNCTION_MODE_MRIOV_8 4
#define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_17 5
#define VXGE_HW_FUNCTION_MODE_SRIOV_8 6
#define VXGE_HW_FUNCTION_MODE_SRIOV_4 7
#define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_2 8
#define VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_4 9
#define VXGE_HW_FUNCTION_MODE_MRIOV_4 10

u32 func_id;
u64 vpath_mask;
struct vxge_hw_device_version fw_version;
Expand Down Expand Up @@ -2265,4 +2273,6 @@ enum vxge_hw_status vxge_hw_vpath_rts_rth_set(
struct vxge_hw_rth_hash_types *hash_type,
u16 bucket_size);

enum vxge_hw_status
__vxge_hw_device_is_privilaged(u32 host_type, u32 func_id);
#endif
64 changes: 54 additions & 10 deletions drivers/net/vxge/vxge-main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3965,6 +3965,36 @@ static void vxge_io_resume(struct pci_dev *pdev)
netif_device_attach(netdev);
}

static inline u32 vxge_get_num_vfs(u64 function_mode)
{
u32 num_functions = 0;

switch (function_mode) {
case VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION:
case VXGE_HW_FUNCTION_MODE_SRIOV_8:
num_functions = 8;
break;
case VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION:
num_functions = 1;
break;
case VXGE_HW_FUNCTION_MODE_SRIOV:
case VXGE_HW_FUNCTION_MODE_MRIOV:
case VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_17:
num_functions = 17;
break;
case VXGE_HW_FUNCTION_MODE_SRIOV_4:
num_functions = 4;
break;
case VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION_2:
num_functions = 2;
break;
case VXGE_HW_FUNCTION_MODE_MRIOV_8:
num_functions = 8; /* TODO */
break;
}
return num_functions;
}

/**
* vxge_probe
* @pdev : structure containing the PCI related information of the device.
Expand Down Expand Up @@ -3992,14 +4022,19 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
u8 *macaddr;
struct vxge_mac_addrs *entry;
static int bus = -1, device = -1;
u32 host_type;
u8 new_device = 0;
enum vxge_hw_status is_privileged;
u32 function_mode;
u32 num_vfs = 0;

vxge_debug_entryexit(VXGE_TRACE, "%s:%d", __func__, __LINE__);
attr.pdev = pdev;

if (bus != pdev->bus->number)
new_device = 1;
if (device != PCI_SLOT(pdev->devfn))
/* In SRIOV-17 mode, functions of the same adapter
* can be deployed on different buses */
if ((!pdev->is_virtfn) && ((bus != pdev->bus->number) ||
(device != PCI_SLOT(pdev->devfn))))
new_device = 1;

bus = pdev->bus->number;
Expand Down Expand Up @@ -4133,21 +4168,30 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
"%s:%d Vpath mask = %llx", __func__, __LINE__,
(unsigned long long)vpath_mask);

function_mode = ll_config.device_hw_info.function_mode;
host_type = ll_config.device_hw_info.host_type;
is_privileged = __vxge_hw_device_is_privilaged(host_type,
ll_config.device_hw_info.func_id);

/* Check how many vpaths are available */
for (i = 0; i < VXGE_HW_MAX_VIRTUAL_PATHS; i++) {
if (!((vpath_mask) & vxge_mBIT(i)))
continue;
max_vpath_supported++;
}

if (new_device)
num_vfs = vxge_get_num_vfs(function_mode) - 1;

/* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */
if ((VXGE_HW_FUNCTION_MODE_SRIOV ==
ll_config.device_hw_info.function_mode) &&
(max_config_dev > 1) && (pdev->is_physfn)) {
ret = pci_enable_sriov(pdev, max_config_dev - 1);
if (ret)
vxge_debug_ll_config(VXGE_ERR,
"Failed to enable SRIOV: %d\n", ret);
if (is_sriov(function_mode) && (max_config_dev > 1) &&
(ll_config.intr_type != INTA) &&
(is_privileged == VXGE_HW_OK)) {
ret = pci_enable_sriov(pdev, ((max_config_dev - 1) < num_vfs)
? (max_config_dev - 1) : num_vfs);
if (ret)
vxge_debug_ll_config(VXGE_ERR,
"Failed in enabling SRIOV mode: %d\n", ret);
}

/*
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/vxge/vxge-main.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@

#define VXGE_LL_MAX_FRAME_SIZE(dev) ((dev)->mtu + VXGE_HW_MAC_HEADER_MAX_SIZE)

#define is_sriov(function_mode) \
((function_mode == VXGE_HW_FUNCTION_MODE_SRIOV) || \
(function_mode == VXGE_HW_FUNCTION_MODE_SRIOV_8) || \
(function_mode == VXGE_HW_FUNCTION_MODE_SRIOV_4))

enum vxge_reset_event {
/* reset events */
VXGE_LL_VPATH_RESET = 0,
Expand Down

0 comments on commit cb27ec6

Please sign in to comment.