Commit fa0a90d9 authored by Brice Goglin's avatar Brice Goglin Committed by Jeff Garzik

myri10ge: cleanup retrieving of firmware capabilities

Add myri10ge_get_firmware_capabilities() to retrieve TSO6 and
interrupt slots capabilities from the firmware.
Signed-off-by: default avatarBrice Goglin <brice@myri.com>
Signed-off-by: default avatarAndrew Gallatin <gallatin@myri.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent b53bef84
...@@ -194,6 +194,7 @@ struct myri10ge_priv { ...@@ -194,6 +194,7 @@ struct myri10ge_priv {
int csum_flag; /* rx_csums? */ int csum_flag; /* rx_csums? */
int small_bytes; int small_bytes;
int big_bytes; int big_bytes;
int max_intr_slots;
struct net_device *dev; struct net_device *dev;
struct net_device_stats stats; struct net_device_stats stats;
spinlock_t stats_lock; spinlock_t stats_lock;
...@@ -634,13 +635,38 @@ static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp) ...@@ -634,13 +635,38 @@ static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp)
return status; return status;
} }
int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp)
{
struct myri10ge_cmd cmd;
int status;
/* probe for IPv6 TSO support */
mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO;
status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE,
&cmd, 0);
if (status == 0) {
mgp->max_tso6 = cmd.data0;
mgp->features |= NETIF_F_TSO6;
}
status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0);
if (status != 0) {
dev_err(&mgp->pdev->dev,
"failed MXGEFW_CMD_GET_RX_RING_SIZE\n");
return -ENXIO;
}
mgp->max_intr_slots = 2 * (cmd.data0 / sizeof(struct mcp_dma_addr));
return 0;
}
static int myri10ge_load_firmware(struct myri10ge_priv *mgp) static int myri10ge_load_firmware(struct myri10ge_priv *mgp)
{ {
char __iomem *submit; char __iomem *submit;
__be32 buf[16] __attribute__ ((__aligned__(8))); __be32 buf[16] __attribute__ ((__aligned__(8)));
u32 dma_low, dma_high, size; u32 dma_low, dma_high, size;
int status, i; int status, i;
struct myri10ge_cmd cmd;
size = 0; size = 0;
status = myri10ge_load_hotplug_firmware(mgp, &size); status = myri10ge_load_hotplug_firmware(mgp, &size);
...@@ -672,6 +698,8 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) ...@@ -672,6 +698,8 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp)
mgp->fw_name = "adopted"; mgp->fw_name = "adopted";
mgp->tx_boundary = 2048; mgp->tx_boundary = 2048;
myri10ge_dummy_rdma(mgp, 1);
status = myri10ge_get_firmware_capabilities(mgp);
return status; return status;
} }
...@@ -714,18 +742,10 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) ...@@ -714,18 +742,10 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp)
dev_err(&mgp->pdev->dev, "handoff failed\n"); dev_err(&mgp->pdev->dev, "handoff failed\n");
return -ENXIO; return -ENXIO;
} }
dev_info(&mgp->pdev->dev, "handoff confirmed\n");
myri10ge_dummy_rdma(mgp, 1); myri10ge_dummy_rdma(mgp, 1);
status = myri10ge_get_firmware_capabilities(mgp);
/* probe for IPv6 TSO support */ return status;
mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO;
status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE,
&cmd, 0);
if (status == 0) {
mgp->max_tso6 = cmd.data0;
mgp->features |= NETIF_F_TSO6;
}
return 0;
} }
static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment