diff options
Diffstat (limited to 'drivers/net/myri10ge/myri10ge.c')
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 5edcbfe93065..054168faf292 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -194,6 +194,7 @@ struct myri10ge_priv { | |||
194 | int csum_flag; /* rx_csums? */ | 194 | int csum_flag; /* rx_csums? */ |
195 | int small_bytes; | 195 | int small_bytes; |
196 | int big_bytes; | 196 | int big_bytes; |
197 | int max_intr_slots; | ||
197 | struct net_device *dev; | 198 | struct net_device *dev; |
198 | struct net_device_stats stats; | 199 | struct net_device_stats stats; |
199 | spinlock_t stats_lock; | 200 | spinlock_t stats_lock; |
@@ -634,13 +635,38 @@ static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp) | |||
634 | return status; | 635 | return status; |
635 | } | 636 | } |
636 | 637 | ||
638 | int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp) | ||
639 | { | ||
640 | struct myri10ge_cmd cmd; | ||
641 | int status; | ||
642 | |||
643 | /* probe for IPv6 TSO support */ | ||
644 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
645 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
646 | &cmd, 0); | ||
647 | if (status == 0) { | ||
648 | mgp->max_tso6 = cmd.data0; | ||
649 | mgp->features |= NETIF_F_TSO6; | ||
650 | } | ||
651 | |||
652 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | ||
653 | if (status != 0) { | ||
654 | dev_err(&mgp->pdev->dev, | ||
655 | "failed MXGEFW_CMD_GET_RX_RING_SIZE\n"); | ||
656 | return -ENXIO; | ||
657 | } | ||
658 | |||
659 | mgp->max_intr_slots = 2 * (cmd.data0 / sizeof(struct mcp_dma_addr)); | ||
660 | |||
661 | return 0; | ||
662 | } | ||
663 | |||
637 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | 664 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) |
638 | { | 665 | { |
639 | char __iomem *submit; | 666 | char __iomem *submit; |
640 | __be32 buf[16] __attribute__ ((__aligned__(8))); | 667 | __be32 buf[16] __attribute__ ((__aligned__(8))); |
641 | u32 dma_low, dma_high, size; | 668 | u32 dma_low, dma_high, size; |
642 | int status, i; | 669 | int status, i; |
643 | struct myri10ge_cmd cmd; | ||
644 | 670 | ||
645 | size = 0; | 671 | size = 0; |
646 | status = myri10ge_load_hotplug_firmware(mgp, &size); | 672 | status = myri10ge_load_hotplug_firmware(mgp, &size); |
@@ -672,6 +698,8 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
672 | 698 | ||
673 | mgp->fw_name = "adopted"; | 699 | mgp->fw_name = "adopted"; |
674 | mgp->tx_boundary = 2048; | 700 | mgp->tx_boundary = 2048; |
701 | myri10ge_dummy_rdma(mgp, 1); | ||
702 | status = myri10ge_get_firmware_capabilities(mgp); | ||
675 | return status; | 703 | return status; |
676 | } | 704 | } |
677 | 705 | ||
@@ -714,18 +742,10 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
714 | dev_err(&mgp->pdev->dev, "handoff failed\n"); | 742 | dev_err(&mgp->pdev->dev, "handoff failed\n"); |
715 | return -ENXIO; | 743 | return -ENXIO; |
716 | } | 744 | } |
717 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); | ||
718 | myri10ge_dummy_rdma(mgp, 1); | 745 | myri10ge_dummy_rdma(mgp, 1); |
746 | status = myri10ge_get_firmware_capabilities(mgp); | ||
719 | 747 | ||
720 | /* probe for IPv6 TSO support */ | 748 | return status; |
721 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
722 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
723 | &cmd, 0); | ||
724 | if (status == 0) { | ||
725 | mgp->max_tso6 = cmd.data0; | ||
726 | mgp->features |= NETIF_F_TSO6; | ||
727 | } | ||
728 | return 0; | ||
729 | } | 749 | } |
730 | 750 | ||
731 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) | 751 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) |