• Home
  • Raw
  • Download

Lines Matching refs:mgp

184 	struct myri10ge_priv *mgp;  member
389 static void set_fw_name(struct myri10ge_priv *mgp, char *name, bool allocated) in set_fw_name() argument
391 if (mgp->fw_name_allocated) in set_fw_name()
392 kfree(mgp->fw_name); in set_fw_name()
393 mgp->fw_name = name; in set_fw_name()
394 mgp->fw_name_allocated = allocated; in set_fw_name()
398 myri10ge_send_cmd(struct myri10ge_priv *mgp, u32 cmd, in myri10ge_send_cmd() argument
403 struct mcp_cmd_response *response = mgp->cmd; in myri10ge_send_cmd()
404 char __iomem *cmd_addr = mgp->sram + MXGEFW_ETH_CMD; in myri10ge_send_cmd()
415 dma_low = MYRI10GE_LOWPART_TO_U32(mgp->cmd_bus); in myri10ge_send_cmd()
416 dma_high = MYRI10GE_HIGHPART_TO_U32(mgp->cmd_bus); in myri10ge_send_cmd()
466 dev_err(&mgp->pdev->dev, in myri10ge_send_cmd()
473 dev_err(&mgp->pdev->dev, "command %d timed out, result = %d\n", in myri10ge_send_cmd()
485 static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp) in myri10ge_read_mac_addr() argument
490 ptr = mgp->eeprom_strings; in myri10ge_read_mac_addr()
491 limit = mgp->eeprom_strings + MYRI10GE_EEPROM_STRINGS_SIZE; in myri10ge_read_mac_addr()
496 mgp->mac_addr_string = ptr; in myri10ge_read_mac_addr()
500 mgp->mac_addr[i] = in myri10ge_read_mac_addr()
507 mgp->product_code_string = ptr; in myri10ge_read_mac_addr()
511 mgp->serial_number = simple_strtoul(ptr, &ptr, 10); in myri10ge_read_mac_addr()
519 dev_err(&mgp->pdev->dev, "failed to parse eeprom_strings\n"); in myri10ge_read_mac_addr()
528 static void myri10ge_dummy_rdma(struct myri10ge_priv *mgp, int enable) in myri10ge_dummy_rdma() argument
536 mgp->cmd->data = 0; in myri10ge_dummy_rdma()
543 dma_low = MYRI10GE_LOWPART_TO_U32(mgp->cmd_bus); in myri10ge_dummy_rdma()
544 dma_high = MYRI10GE_HIGHPART_TO_U32(mgp->cmd_bus); in myri10ge_dummy_rdma()
553 submit = mgp->sram + MXGEFW_BOOT_DUMMY_RDMA; in myri10ge_dummy_rdma()
556 for (i = 0; mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 20; i++) in myri10ge_dummy_rdma()
558 if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) in myri10ge_dummy_rdma()
559 dev_err(&mgp->pdev->dev, "dummy rdma %s failed\n", in myri10ge_dummy_rdma()
564 myri10ge_validate_firmware(struct myri10ge_priv *mgp, in myri10ge_validate_firmware() argument
567 struct device *dev = &mgp->pdev->dev; in myri10ge_validate_firmware()
576 strncpy(mgp->fw_version, hdr->version, sizeof(mgp->fw_version)); in myri10ge_validate_firmware()
577 mgp->fw_version[sizeof(mgp->fw_version) - 1] = '\0'; in myri10ge_validate_firmware()
579 sscanf(mgp->fw_version, "%d.%d.%d", &mgp->fw_ver_major, in myri10ge_validate_firmware()
580 &mgp->fw_ver_minor, &mgp->fw_ver_tiny); in myri10ge_validate_firmware()
582 if (!(mgp->fw_ver_major == MXGEFW_VERSION_MAJOR && in myri10ge_validate_firmware()
583 mgp->fw_ver_minor == MXGEFW_VERSION_MINOR)) { in myri10ge_validate_firmware()
584 dev_err(dev, "Found firmware version %s\n", mgp->fw_version); in myri10ge_validate_firmware()
592 static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) in myri10ge_load_hotplug_firmware() argument
596 struct device *dev = &mgp->pdev->dev; in myri10ge_load_hotplug_firmware()
603 if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { in myri10ge_load_hotplug_firmware()
605 mgp->fw_name); in myri10ge_load_hotplug_firmware()
612 if (fw->size >= mgp->sram_size - MYRI10GE_FW_OFFSET || in myri10ge_load_hotplug_firmware()
628 status = myri10ge_validate_firmware(mgp, hdr); in myri10ge_load_hotplug_firmware()
634 myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET + i, in myri10ge_load_hotplug_firmware()
638 readb(mgp->sram); in myri10ge_load_hotplug_firmware()
646 memcpy_fromio(fw_readback, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); in myri10ge_load_hotplug_firmware()
664 static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp) in myri10ge_adopt_running_firmware() argument
667 struct device *dev = &mgp->pdev->dev; in myri10ge_adopt_running_firmware()
673 hdr_offset = swab32(readl(mgp->sram + MCP_HEADER_PTR_OFFSET)); in myri10ge_adopt_running_firmware()
675 if ((hdr_offset & 3) || hdr_offset + sizeof(*hdr) > mgp->sram_size) { in myri10ge_adopt_running_firmware()
687 memcpy_fromio(hdr, mgp->sram + hdr_offset, bytes); in myri10ge_adopt_running_firmware()
688 status = myri10ge_validate_firmware(mgp, hdr); in myri10ge_adopt_running_firmware()
694 if (mgp->fw_ver_major == 1 && mgp->fw_ver_minor == 4 && in myri10ge_adopt_running_firmware()
695 mgp->fw_ver_tiny >= 4 && mgp->fw_ver_tiny <= 11) { in myri10ge_adopt_running_firmware()
696 mgp->adopted_rx_filter_bug = 1; in myri10ge_adopt_running_firmware()
699 mgp->fw_ver_major, mgp->fw_ver_minor, in myri10ge_adopt_running_firmware()
700 mgp->fw_ver_tiny); in myri10ge_adopt_running_firmware()
705 static int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp) in myri10ge_get_firmware_capabilities() argument
711 mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; in myri10ge_get_firmware_capabilities()
712 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, in myri10ge_get_firmware_capabilities()
715 mgp->max_tso6 = cmd.data0; in myri10ge_get_firmware_capabilities()
716 mgp->features |= NETIF_F_TSO6; in myri10ge_get_firmware_capabilities()
719 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); in myri10ge_get_firmware_capabilities()
721 dev_err(&mgp->pdev->dev, in myri10ge_get_firmware_capabilities()
726 mgp->max_intr_slots = 2 * (cmd.data0 / sizeof(struct mcp_dma_addr)); in myri10ge_get_firmware_capabilities()
731 static int myri10ge_load_firmware(struct myri10ge_priv *mgp, int adopt) in myri10ge_load_firmware() argument
739 status = myri10ge_load_hotplug_firmware(mgp, &size); in myri10ge_load_firmware()
743 dev_warn(&mgp->pdev->dev, "hotplug firmware loading failed\n"); in myri10ge_load_firmware()
750 status = myri10ge_adopt_running_firmware(mgp); in myri10ge_load_firmware()
752 dev_err(&mgp->pdev->dev, in myri10ge_load_firmware()
756 dev_info(&mgp->pdev->dev, in myri10ge_load_firmware()
758 if (mgp->tx_boundary == 4096) { in myri10ge_load_firmware()
759 dev_warn(&mgp->pdev->dev, in myri10ge_load_firmware()
762 dev_warn(&mgp->pdev->dev, in myri10ge_load_firmware()
765 dev_warn(&mgp->pdev->dev, "via hotplug\n"); in myri10ge_load_firmware()
768 set_fw_name(mgp, "adopted", false); in myri10ge_load_firmware()
769 mgp->tx_boundary = 2048; in myri10ge_load_firmware()
770 myri10ge_dummy_rdma(mgp, 1); in myri10ge_load_firmware()
771 status = myri10ge_get_firmware_capabilities(mgp); in myri10ge_load_firmware()
776 mgp->cmd->data = 0; in myri10ge_load_firmware()
783 dma_low = MYRI10GE_LOWPART_TO_U32(mgp->cmd_bus); in myri10ge_load_firmware()
784 dma_high = MYRI10GE_HIGHPART_TO_U32(mgp->cmd_bus); in myri10ge_load_firmware()
799 submit = mgp->sram + MXGEFW_BOOT_HANDOFF; in myri10ge_load_firmware()
806 while (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 9) { in myri10ge_load_firmware()
810 if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) { in myri10ge_load_firmware()
811 dev_err(&mgp->pdev->dev, "handoff failed\n"); in myri10ge_load_firmware()
814 myri10ge_dummy_rdma(mgp, 1); in myri10ge_load_firmware()
815 status = myri10ge_get_firmware_capabilities(mgp); in myri10ge_load_firmware()
820 static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) in myri10ge_update_mac_address() argument
830 status = myri10ge_send_cmd(mgp, MXGEFW_SET_MAC_ADDRESS, &cmd, 0); in myri10ge_update_mac_address()
834 static int myri10ge_change_pause(struct myri10ge_priv *mgp, int pause) in myri10ge_change_pause() argument
840 status = myri10ge_send_cmd(mgp, ctl, &cmd, 0); in myri10ge_change_pause()
843 netdev_err(mgp->dev, "Failed to set flow control mode\n"); in myri10ge_change_pause()
846 mgp->pause = pause; in myri10ge_change_pause()
851 myri10ge_change_promisc(struct myri10ge_priv *mgp, int promisc, int atomic) in myri10ge_change_promisc() argument
857 status = myri10ge_send_cmd(mgp, ctl, &cmd, atomic); in myri10ge_change_promisc()
859 netdev_err(mgp->dev, "Failed to set promisc mode\n"); in myri10ge_change_promisc()
862 static int myri10ge_dma_test(struct myri10ge_priv *mgp, int test_type) in myri10ge_dma_test() argument
874 dmatest_bus = pci_map_page(mgp->pdev, dmatest_page, 0, PAGE_SIZE, in myri10ge_dma_test()
876 if (unlikely(pci_dma_mapping_error(mgp->pdev, dmatest_bus))) { in myri10ge_dma_test()
890 len = mgp->tx_boundary; in myri10ge_dma_test()
895 status = myri10ge_send_cmd(mgp, test_type, &cmd, 0); in myri10ge_dma_test()
900 mgp->read_dma = ((cmd.data0 >> 16) * len * 2) / (cmd.data0 & 0xffff); in myri10ge_dma_test()
904 status = myri10ge_send_cmd(mgp, test_type, &cmd, 0); in myri10ge_dma_test()
909 mgp->write_dma = ((cmd.data0 >> 16) * len * 2) / (cmd.data0 & 0xffff); in myri10ge_dma_test()
914 status = myri10ge_send_cmd(mgp, test_type, &cmd, 0); in myri10ge_dma_test()
919 mgp->read_write_dma = ((cmd.data0 >> 16) * len * 2 * 2) / in myri10ge_dma_test()
923 pci_unmap_page(mgp->pdev, dmatest_bus, PAGE_SIZE, DMA_BIDIRECTIONAL); in myri10ge_dma_test()
927 dev_warn(&mgp->pdev->dev, "DMA %s benchmark failed: %d\n", in myri10ge_dma_test()
1019 static int myri10ge_reset(struct myri10ge_priv *mgp) in myri10ge_reset() argument
1032 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_RESET, &cmd, 0); in myri10ge_reset()
1034 dev_err(&mgp->pdev->dev, "failed reset\n"); in myri10ge_reset()
1038 (void)myri10ge_dma_test(mgp, MXGEFW_DMA_TEST); in myri10ge_reset()
1046 (void)myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_RSS_MCP_SLOT_TYPE, &cmd, 0); in myri10ge_reset()
1050 bytes = mgp->max_intr_slots * sizeof(*mgp->ss[0].rx_done.entry); in myri10ge_reset()
1052 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); in myri10ge_reset()
1065 if (mgp->num_slices > 1) { in myri10ge_reset()
1068 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_RSS_QUEUES, in myri10ge_reset()
1071 dev_err(&mgp->pdev->dev, in myri10ge_reset()
1080 cmd.data0 = mgp->num_slices; in myri10ge_reset()
1082 if (mgp->dev->real_num_tx_queues > 1) in myri10ge_reset()
1084 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ENABLE_RSS_QUEUES, in myri10ge_reset()
1090 if (status != 0 && mgp->dev->real_num_tx_queues > 1) { in myri10ge_reset()
1091 netif_set_real_num_tx_queues(mgp->dev, 1); in myri10ge_reset()
1092 cmd.data0 = mgp->num_slices; in myri10ge_reset()
1094 status = myri10ge_send_cmd(mgp, in myri10ge_reset()
1100 dev_err(&mgp->pdev->dev, in myri10ge_reset()
1106 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_reset()
1107 ss = &mgp->ss[i]; in myri10ge_reset()
1111 status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_DMA, in myri10ge_reset()
1116 myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); in myri10ge_reset()
1117 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_reset()
1118 ss = &mgp->ss[i]; in myri10ge_reset()
1120 (__iomem __be32 *) (mgp->sram + cmd.data0 + 8 * i); in myri10ge_reset()
1122 status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, in myri10ge_reset()
1124 mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); in myri10ge_reset()
1127 (mgp, MXGEFW_CMD_GET_INTR_COAL_DELAY_OFFSET, &cmd, 0); in myri10ge_reset()
1128 mgp->intr_coal_delay_ptr = (__iomem __be32 *) (mgp->sram + cmd.data0); in myri10ge_reset()
1130 dev_err(&mgp->pdev->dev, "failed set interrupt parameters\n"); in myri10ge_reset()
1133 put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); in myri10ge_reset()
1136 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_DCA_OFFSET, &cmd, 0); in myri10ge_reset()
1138 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_reset()
1139 ss = &mgp->ss[i]; in myri10ge_reset()
1142 (mgp->sram + dca_tag_off + 4 * i); in myri10ge_reset()
1151 mgp->link_changes = 0; in myri10ge_reset()
1152 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_reset()
1153 ss = &mgp->ss[i]; in myri10ge_reset()
1168 status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr); in myri10ge_reset()
1169 myri10ge_change_pause(mgp, mgp->pause); in myri10ge_reset()
1170 myri10ge_set_multicast_list(mgp->dev); in myri10ge_reset()
1204 tag = dca3_get_tag(&ss->mgp->pdev->dev, cpu); in myri10ge_update_dca()
1212 static void myri10ge_setup_dca(struct myri10ge_priv *mgp) in myri10ge_setup_dca() argument
1215 struct pci_dev *pdev = mgp->pdev; in myri10ge_setup_dca()
1217 if (mgp->ss[0].dca_tag == NULL || mgp->dca_enabled) in myri10ge_setup_dca()
1230 mgp->relaxed_order = myri10ge_toggle_relaxed(pdev, 0); in myri10ge_setup_dca()
1231 mgp->dca_enabled = 1; in myri10ge_setup_dca()
1232 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_setup_dca()
1233 mgp->ss[i].cpu = -1; in myri10ge_setup_dca()
1234 mgp->ss[i].cached_dca_tag = -1; in myri10ge_setup_dca()
1235 myri10ge_update_dca(&mgp->ss[i]); in myri10ge_setup_dca()
1239 static void myri10ge_teardown_dca(struct myri10ge_priv *mgp) in myri10ge_teardown_dca() argument
1241 struct pci_dev *pdev = mgp->pdev; in myri10ge_teardown_dca()
1243 if (!mgp->dca_enabled) in myri10ge_teardown_dca()
1245 mgp->dca_enabled = 0; in myri10ge_teardown_dca()
1246 if (mgp->relaxed_order) in myri10ge_teardown_dca()
1253 struct myri10ge_priv *mgp; in myri10ge_notify_dca_device() local
1256 mgp = dev_get_drvdata(dev); in myri10ge_notify_dca_device()
1260 myri10ge_setup_dca(mgp); in myri10ge_notify_dca_device()
1262 myri10ge_teardown_dca(mgp); in myri10ge_notify_dca_device()
1297 myri10ge_alloc_rx_pages(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, in myri10ge_alloc_rx_pages() argument
1327 bus = pci_map_page(mgp->pdev, page, 0, in myri10ge_alloc_rx_pages()
1330 if (unlikely(pci_dma_mapping_error(mgp->pdev, bus))) { in myri10ge_alloc_rx_pages()
1426 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_rx_done() local
1431 struct pci_dev *pdev = mgp->pdev; in myri10ge_rx_done()
1432 struct net_device *dev = mgp->dev; in myri10ge_rx_done()
1436 if (len <= mgp->small_bytes) { in myri10ge_rx_done()
1438 bytes = mgp->small_bytes; in myri10ge_rx_done()
1441 bytes = mgp->big_bytes; in myri10ge_rx_done()
1494 myri10ge_vlan_rx(mgp->dev, va, skb); in myri10ge_rx_done()
1495 skb_record_rx_queue(skb, ss - &mgp->ss[0]); in myri10ge_rx_done()
1525 struct pci_dev *pdev = ss->mgp->pdev; in myri10ge_tx_done()
1562 dev_queue = netdev_get_tx_queue(ss->dev, ss - ss->mgp->ss); in myri10ge_tx_done()
1572 if ((ss->mgp->dev->real_num_tx_queues > 1) && in myri10ge_tx_done()
1586 ss->mgp->running == MYRI10GE_ETH_RUNNING) { in myri10ge_tx_done()
1596 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_clean_rx_done() local
1614 idx = cnt & (mgp->max_intr_slots - 1); in myri10ge_clean_rx_done()
1624 myri10ge_alloc_rx_pages(mgp, &ss->rx_small, in myri10ge_clean_rx_done()
1625 mgp->small_bytes + MXGEFW_PAD, 0); in myri10ge_clean_rx_done()
1627 myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); in myri10ge_clean_rx_done()
1632 static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) in myri10ge_check_statblock() argument
1634 struct mcp_irq_data *stats = mgp->ss[0].fw_stats; in myri10ge_check_statblock()
1638 if (mgp->link_state != link_up) { in myri10ge_check_statblock()
1639 mgp->link_state = link_up; in myri10ge_check_statblock()
1641 if (mgp->link_state == MXGEFW_LINK_UP) { in myri10ge_check_statblock()
1642 netif_info(mgp, link, mgp->dev, "link up\n"); in myri10ge_check_statblock()
1643 netif_carrier_on(mgp->dev); in myri10ge_check_statblock()
1644 mgp->link_changes++; in myri10ge_check_statblock()
1646 netif_info(mgp, link, mgp->dev, "link %s\n", in myri10ge_check_statblock()
1650 netif_carrier_off(mgp->dev); in myri10ge_check_statblock()
1651 mgp->link_changes++; in myri10ge_check_statblock()
1654 if (mgp->rdma_tags_available != in myri10ge_check_statblock()
1656 mgp->rdma_tags_available = in myri10ge_check_statblock()
1658 netdev_warn(mgp->dev, "RDMA timed out! %d tags left\n", in myri10ge_check_statblock()
1659 mgp->rdma_tags_available); in myri10ge_check_statblock()
1661 mgp->down_cnt += stats->link_down; in myri10ge_check_statblock()
1663 wake_up(&mgp->down_wq); in myri10ge_check_statblock()
1674 if (ss->mgp->dca_enabled) in myri10ge_poll()
1697 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_busy_poll() local
1701 if (mgp->link_state != MXGEFW_LINK_UP) in myri10ge_busy_poll()
1723 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_intr() local
1731 if ((mgp->dev->real_num_tx_queues == 1) && (ss != mgp->ss)) { in myri10ge_intr()
1745 if (!mgp->msi_enabled && !mgp->msix_enabled) { in myri10ge_intr()
1746 put_be32(0, mgp->irq_deassert); in myri10ge_intr()
1762 netdev_warn(mgp->dev, "irq stuck?\n"); in myri10ge_intr()
1764 schedule_work(&mgp->watchdog_work); in myri10ge_intr()
1773 if (ss == mgp->ss) in myri10ge_intr()
1774 myri10ge_check_statblock(mgp); in myri10ge_intr()
1783 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_settings() local
1797 ptr = mgp->product_code_string; in myri10ge_get_settings()
1806 mgp->product_code_string); in myri10ge_get_settings()
1831 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_drvinfo() local
1835 strlcpy(info->fw_version, mgp->fw_version, sizeof(info->fw_version)); in myri10ge_get_drvinfo()
1836 strlcpy(info->bus_info, pci_name(mgp->pdev), sizeof(info->bus_info)); in myri10ge_get_drvinfo()
1842 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_coalesce() local
1844 coal->rx_coalesce_usecs = mgp->intr_coal_delay; in myri10ge_get_coalesce()
1851 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_set_coalesce() local
1853 mgp->intr_coal_delay = coal->rx_coalesce_usecs; in myri10ge_set_coalesce()
1854 put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); in myri10ge_set_coalesce()
1862 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_pauseparam() local
1865 pause->rx_pause = mgp->pause; in myri10ge_get_pauseparam()
1866 pause->tx_pause = mgp->pause; in myri10ge_get_pauseparam()
1873 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_set_pauseparam() local
1875 if (pause->tx_pause != mgp->pause) in myri10ge_set_pauseparam()
1876 return myri10ge_change_pause(mgp, pause->tx_pause); in myri10ge_set_pauseparam()
1877 if (pause->rx_pause != mgp->pause) in myri10ge_set_pauseparam()
1878 return myri10ge_change_pause(mgp, pause->rx_pause); in myri10ge_set_pauseparam()
1888 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_ringparam() local
1890 ring->rx_mini_max_pending = mgp->ss[0].rx_small.mask + 1; in myri10ge_get_ringparam()
1891 ring->rx_max_pending = mgp->ss[0].rx_big.mask + 1; in myri10ge_get_ringparam()
1893 ring->tx_max_pending = mgp->ss[0].tx.mask + 1; in myri10ge_get_ringparam()
1940 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_strings() local
1948 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_get_strings()
1959 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_sset_count() local
1964 mgp->num_slices * MYRI10GE_SLICE_STATS_LEN; in myri10ge_get_sset_count()
1974 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_ethtool_stats() local
1986 data[i++] = (unsigned int)mgp->tx_boundary; in myri10ge_get_ethtool_stats()
1987 data[i++] = (unsigned int)mgp->wc_enabled; in myri10ge_get_ethtool_stats()
1988 data[i++] = (unsigned int)mgp->pdev->irq; in myri10ge_get_ethtool_stats()
1989 data[i++] = (unsigned int)mgp->msi_enabled; in myri10ge_get_ethtool_stats()
1990 data[i++] = (unsigned int)mgp->msix_enabled; in myri10ge_get_ethtool_stats()
1991 data[i++] = (unsigned int)mgp->read_dma; in myri10ge_get_ethtool_stats()
1992 data[i++] = (unsigned int)mgp->write_dma; in myri10ge_get_ethtool_stats()
1993 data[i++] = (unsigned int)mgp->read_write_dma; in myri10ge_get_ethtool_stats()
1994 data[i++] = (unsigned int)mgp->serial_number; in myri10ge_get_ethtool_stats()
1995 data[i++] = (unsigned int)mgp->watchdog_resets; in myri10ge_get_ethtool_stats()
1997 data[i++] = (unsigned int)(mgp->ss[0].dca_tag != NULL); in myri10ge_get_ethtool_stats()
1998 data[i++] = (unsigned int)(mgp->dca_enabled); in myri10ge_get_ethtool_stats()
2000 data[i++] = (unsigned int)mgp->link_changes; in myri10ge_get_ethtool_stats()
2003 ss = &mgp->ss[0]; in myri10ge_get_ethtool_stats()
2019 for (slice = 0; slice < mgp->num_slices; slice++) { in myri10ge_get_ethtool_stats()
2020 ss = &mgp->ss[slice]; in myri10ge_get_ethtool_stats()
2042 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_set_msglevel() local
2043 mgp->msg_enable = value; in myri10ge_set_msglevel()
2048 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_get_msglevel() local
2049 return mgp->msg_enable; in myri10ge_get_msglevel()
2057 static int myri10ge_led(struct myri10ge_priv *mgp, int on) in myri10ge_led() argument
2060 struct device *dev = &mgp->pdev->dev; in myri10ge_led()
2065 hdr_off = swab32(readl(mgp->sram + MCP_HEADER_PTR_OFFSET)); in myri10ge_led()
2066 if ((hdr_off & 3) || hdr_off + sizeof(*hdr) > mgp->sram_size) { in myri10ge_led()
2071 hdr_len = swab32(readl(mgp->sram + hdr_off + in myri10ge_led()
2079 pattern = swab32(readl(mgp->sram + pattern_off + 4)); in myri10ge_led()
2080 writel(swab32(pattern), mgp->sram + pattern_off); in myri10ge_led()
2087 struct myri10ge_priv *mgp = netdev_priv(netdev); in myri10ge_phys_id() local
2092 rc = myri10ge_led(mgp, 1); in myri10ge_phys_id()
2096 rc = myri10ge_led(mgp, 0); in myri10ge_phys_id()
2125 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_allocate_rings() local
2127 struct net_device *dev = mgp->dev; in myri10ge_allocate_rings()
2134 slice = ss - mgp->ss; in myri10ge_allocate_rings()
2136 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); in myri10ge_allocate_rings()
2139 status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); in myri10ge_allocate_rings()
2200 if (mgp->small_bytes == 0) { in myri10ge_allocate_rings()
2203 myri10ge_alloc_rx_pages(mgp, &ss->rx_small, in myri10ge_allocate_rings()
2204 mgp->small_bytes + MXGEFW_PAD, 0); in myri10ge_allocate_rings()
2213 myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); in myri10ge_allocate_rings()
2225 myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], in myri10ge_allocate_rings()
2226 mgp->big_bytes); in myri10ge_allocate_rings()
2231 if (mgp->small_bytes == 0) in myri10ge_allocate_rings()
2235 myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], in myri10ge_allocate_rings()
2236 mgp->small_bytes + MXGEFW_PAD); in myri10ge_allocate_rings()
2265 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_free_rings() local
2278 myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], in myri10ge_free_rings()
2279 mgp->big_bytes); in myri10ge_free_rings()
2283 if (mgp->small_bytes == 0) in myri10ge_free_rings()
2290 myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], in myri10ge_free_rings()
2291 mgp->small_bytes + MXGEFW_PAD); in myri10ge_free_rings()
2308 pci_unmap_single(mgp->pdev, in myri10ge_free_rings()
2314 pci_unmap_page(mgp->pdev, in myri10ge_free_rings()
2335 static int myri10ge_request_irq(struct myri10ge_priv *mgp) in myri10ge_request_irq() argument
2337 struct pci_dev *pdev = mgp->pdev; in myri10ge_request_irq()
2339 struct net_device *netdev = mgp->dev; in myri10ge_request_irq()
2343 mgp->msi_enabled = 0; in myri10ge_request_irq()
2344 mgp->msix_enabled = 0; in myri10ge_request_irq()
2347 if (mgp->num_slices > 1) { in myri10ge_request_irq()
2348 status = pci_enable_msix_range(pdev, mgp->msix_vectors, in myri10ge_request_irq()
2349 mgp->num_slices, mgp->num_slices); in myri10ge_request_irq()
2355 mgp->msix_enabled = 1; in myri10ge_request_irq()
2357 if (mgp->msix_enabled == 0) { in myri10ge_request_irq()
2364 mgp->msi_enabled = 1; in myri10ge_request_irq()
2368 if (mgp->msix_enabled) { in myri10ge_request_irq()
2369 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_request_irq()
2370 ss = &mgp->ss[i]; in myri10ge_request_irq()
2373 status = request_irq(mgp->msix_vectors[i].vector, in myri10ge_request_irq()
2381 free_irq(mgp->msix_vectors[i].vector, in myri10ge_request_irq()
2382 &mgp->ss[i]); in myri10ge_request_irq()
2391 mgp->dev->name, &mgp->ss[0]); in myri10ge_request_irq()
2394 if (mgp->msi_enabled) in myri10ge_request_irq()
2401 static void myri10ge_free_irq(struct myri10ge_priv *mgp) in myri10ge_free_irq() argument
2403 struct pci_dev *pdev = mgp->pdev; in myri10ge_free_irq()
2406 if (mgp->msix_enabled) { in myri10ge_free_irq()
2407 for (i = 0; i < mgp->num_slices; i++) in myri10ge_free_irq()
2408 free_irq(mgp->msix_vectors[i].vector, &mgp->ss[i]); in myri10ge_free_irq()
2410 free_irq(pdev->irq, &mgp->ss[0]); in myri10ge_free_irq()
2412 if (mgp->msi_enabled) in myri10ge_free_irq()
2414 if (mgp->msix_enabled) in myri10ge_free_irq()
2418 static int myri10ge_get_txrx(struct myri10ge_priv *mgp, int slice) in myri10ge_get_txrx() argument
2424 ss = &mgp->ss[slice]; in myri10ge_get_txrx()
2426 if (slice == 0 || (mgp->dev->real_num_tx_queues > 1)) { in myri10ge_get_txrx()
2428 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, in myri10ge_get_txrx()
2431 (mgp->sram + cmd.data0); in myri10ge_get_txrx()
2434 status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, in myri10ge_get_txrx()
2437 (mgp->sram + cmd.data0); in myri10ge_get_txrx()
2440 status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd, 0); in myri10ge_get_txrx()
2442 (mgp->sram + cmd.data0); in myri10ge_get_txrx()
2445 (mgp->sram + MXGEFW_ETH_SEND_GO + 64 * slice); in myri10ge_get_txrx()
2447 (mgp->sram + MXGEFW_ETH_SEND_STOP + 64 * slice); in myri10ge_get_txrx()
2452 static int myri10ge_set_stats(struct myri10ge_priv *mgp, int slice) in myri10ge_set_stats() argument
2458 ss = &mgp->ss[slice]; in myri10ge_set_stats()
2462 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd, 0); in myri10ge_set_stats()
2470 status = myri10ge_send_cmd(mgp, in myri10ge_set_stats()
2474 mgp->fw_multicast_support = 0; in myri10ge_set_stats()
2476 mgp->fw_multicast_support = 1; in myri10ge_set_stats()
2484 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_open() local
2489 if (mgp->running != MYRI10GE_ETH_STOPPED) in myri10ge_open()
2492 mgp->running = MYRI10GE_ETH_STARTING; in myri10ge_open()
2493 status = myri10ge_reset(mgp); in myri10ge_open()
2499 if (mgp->num_slices > 1) { in myri10ge_open()
2500 cmd.data0 = mgp->num_slices; in myri10ge_open()
2502 if (mgp->dev->real_num_tx_queues > 1) in myri10ge_open()
2504 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ENABLE_RSS_QUEUES, in myri10ge_open()
2511 cmd.data0 = mgp->num_slices; in myri10ge_open()
2512 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_RSS_TABLE_SIZE, in myri10ge_open()
2515 status |= myri10ge_send_cmd(mgp, in myri10ge_open()
2524 itable = mgp->sram + cmd.data0; in myri10ge_open()
2525 for (i = 0; i < mgp->num_slices; i++) in myri10ge_open()
2530 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_RSS_ENABLE, in myri10ge_open()
2538 status = myri10ge_request_irq(mgp); in myri10ge_open()
2550 mgp->small_bytes = (128 > SMP_CACHE_BYTES) in myri10ge_open()
2555 mgp->small_bytes = VLAN_ETH_FRAME_LEN; in myri10ge_open()
2559 mgp->small_bytes = myri10ge_small_bytes; in myri10ge_open()
2569 mgp->big_bytes = dev->mtu + ETH_HLEN + VLAN_HLEN + MXGEFW_PAD; in myri10ge_open()
2572 mgp->big_bytes = big_pow2; in myri10ge_open()
2576 for (slice = 0; slice < mgp->num_slices; slice++) { in myri10ge_open()
2577 ss = &mgp->ss[slice]; in myri10ge_open()
2579 status = myri10ge_get_txrx(mgp, slice); in myri10ge_open()
2591 if (slice == 0 || mgp->dev->real_num_tx_queues > 1) in myri10ge_open()
2592 status = myri10ge_set_stats(mgp, slice); in myri10ge_open()
2607 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_MTU, &cmd, 0); in myri10ge_open()
2608 cmd.data0 = mgp->small_bytes; in myri10ge_open()
2610 myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_SMALL_BUFFER_SIZE, &cmd, 0); in myri10ge_open()
2613 myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_BIG_BUFFER_SIZE, &cmd, 0); in myri10ge_open()
2625 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_TSO_MODE, &cmd, 0); in myri10ge_open()
2631 mgp->link_state = ~0U; in myri10ge_open()
2632 mgp->rdma_tags_available = 15; in myri10ge_open()
2634 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_UP, &cmd, 0); in myri10ge_open()
2640 mgp->running = MYRI10GE_ETH_RUNNING; in myri10ge_open()
2641 mgp->watchdog_timer.expires = jiffies + myri10ge_watchdog_timeout * HZ; in myri10ge_open()
2642 add_timer(&mgp->watchdog_timer); in myri10ge_open()
2650 napi_disable(&mgp->ss[slice].napi); in myri10ge_open()
2652 for (i = 0; i < mgp->num_slices; i++) in myri10ge_open()
2653 myri10ge_free_rings(&mgp->ss[i]); in myri10ge_open()
2655 myri10ge_free_irq(mgp); in myri10ge_open()
2658 mgp->running = MYRI10GE_ETH_STOPPED; in myri10ge_open()
2664 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_close() local
2669 if (mgp->running != MYRI10GE_ETH_RUNNING) in myri10ge_close()
2672 if (mgp->ss[0].tx.req_bytes == NULL) in myri10ge_close()
2675 del_timer_sync(&mgp->watchdog_timer); in myri10ge_close()
2676 mgp->running = MYRI10GE_ETH_STOPPING; in myri10ge_close()
2678 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_close()
2679 napi_disable(&mgp->ss[i].napi); in myri10ge_close()
2684 while (!myri10ge_ss_lock_napi(&mgp->ss[i])) { in myri10ge_close()
2693 if (mgp->rebooted == 0) { in myri10ge_close()
2694 old_down_cnt = mgp->down_cnt; in myri10ge_close()
2697 myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_DOWN, &cmd, 0); in myri10ge_close()
2701 wait_event_timeout(mgp->down_wq, old_down_cnt != mgp->down_cnt, in myri10ge_close()
2703 if (old_down_cnt == mgp->down_cnt) in myri10ge_close()
2707 myri10ge_free_irq(mgp); in myri10ge_close()
2708 for (i = 0; i < mgp->num_slices; i++) in myri10ge_close()
2709 myri10ge_free_rings(&mgp->ss[i]); in myri10ge_close()
2711 mgp->running = MYRI10GE_ETH_STOPPED; in myri10ge_close()
2782 static void myri10ge_unmap_tx_dma(struct myri10ge_priv *mgp, in myri10ge_unmap_tx_dma() argument
2795 pci_unmap_single(mgp->pdev, in myri10ge_unmap_tx_dma()
2800 pci_unmap_page(mgp->pdev, in myri10ge_unmap_tx_dma()
2824 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_xmit() local
2840 ss = &mgp->ss[queue]; in myri10ge_xmit()
2841 netdev_queue = netdev_get_tx_queue(mgp->dev, queue); in myri10ge_xmit()
2903 if (unlikely(-cum_len > mgp->max_tso6)) in myri10ge_xmit()
2931 bus = pci_map_single(mgp->pdev, skb->data, len, PCI_DMA_TODEVICE); in myri10ge_xmit()
2932 if (unlikely(pci_dma_mapping_error(mgp->pdev, bus))) in myri10ge_xmit()
2976 (low + mgp->tx_boundary) & ~(mgp->tx_boundary - 1); in myri10ge_xmit()
3038 bus = skb_frag_dma_map(&mgp->pdev->dev, frag, 0, len, in myri10ge_xmit()
3040 if (unlikely(pci_dma_mapping_error(mgp->pdev, bus))) { in myri10ge_xmit()
3041 myri10ge_unmap_tx_dma(mgp, tx, idx); in myri10ge_xmit()
3061 if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) { in myri10ge_xmit()
3075 myri10ge_unmap_tx_dma(mgp, tx, idx); in myri10ge_xmit()
3078 netdev_err(mgp->dev, "TSO but wanted to linearize?!?!?\n"); in myri10ge_xmit()
3099 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_sw_tso() local
3127 ss = &mgp->ss[skb_get_queue_mapping(skb)]; in myri10ge_sw_tso()
3136 const struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_get_stats() local
3140 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_get_stats()
3141 slice_stats = &mgp->ss[i].stats; in myri10ge_get_stats()
3154 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_set_multicast_list() local
3162 myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1); in myri10ge_set_multicast_list()
3165 if (!mgp->fw_multicast_support) in myri10ge_set_multicast_list()
3170 err = myri10ge_send_cmd(mgp, MXGEFW_ENABLE_ALLMULTI, &cmd, 1); in myri10ge_set_multicast_list()
3177 if ((dev->flags & IFF_ALLMULTI) || mgp->adopted_rx_filter_bug) { in myri10ge_set_multicast_list()
3184 err = myri10ge_send_cmd(mgp, MXGEFW_LEAVE_ALL_MULTICAST_GROUPS, in myri10ge_set_multicast_list()
3197 err = myri10ge_send_cmd(mgp, MXGEFW_JOIN_MULTICAST_GROUP, in myri10ge_set_multicast_list()
3207 err = myri10ge_send_cmd(mgp, MXGEFW_DISABLE_ALLMULTI, &cmd, 1); in myri10ge_set_multicast_list()
3223 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_set_mac_address() local
3229 status = myri10ge_update_mac_address(mgp, sa->sa_data); in myri10ge_set_mac_address()
3243 struct myri10ge_priv *mgp = netdev_priv(dev); in myri10ge_change_mtu() local
3251 if (mgp->running) { in myri10ge_change_mtu()
3269 static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) in myri10ge_enable_ecrc() argument
3271 struct pci_dev *bridge = mgp->pdev->bus->self; in myri10ge_enable_ecrc()
3272 struct device *dev = &mgp->pdev->dev; in myri10ge_enable_ecrc()
3350 static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) in myri10ge_firmware_probe() argument
3352 struct pci_dev *pdev = mgp->pdev; in myri10ge_firmware_probe()
3356 mgp->tx_boundary = 4096; in myri10ge_firmware_probe()
3368 mgp->tx_boundary = 2048; in myri10ge_firmware_probe()
3374 set_fw_name(mgp, myri10ge_fw_aligned, false); in myri10ge_firmware_probe()
3375 status = myri10ge_load_firmware(mgp, 1); in myri10ge_firmware_probe()
3383 myri10ge_enable_ecrc(mgp); in myri10ge_firmware_probe()
3390 status = myri10ge_dma_test(mgp, MXGEFW_CMD_UNALIGNED_TEST); in myri10ge_firmware_probe()
3401 mgp->tx_boundary = 2048; in myri10ge_firmware_probe()
3402 set_fw_name(mgp, myri10ge_fw_unaligned, false); in myri10ge_firmware_probe()
3405 static void myri10ge_select_firmware(struct myri10ge_priv *mgp) in myri10ge_select_firmware() argument
3413 pcie_capability_read_word(mgp->pdev, PCI_EXP_LNKSTA, &lnk); in myri10ge_select_firmware()
3420 dev_info(&mgp->pdev->dev, "PCIE x%d Link\n", in myri10ge_select_firmware()
3422 mgp->tx_boundary = 4096; in myri10ge_select_firmware()
3423 set_fw_name(mgp, myri10ge_fw_aligned, false); in myri10ge_select_firmware()
3425 myri10ge_firmware_probe(mgp); in myri10ge_select_firmware()
3429 dev_info(&mgp->pdev->dev, in myri10ge_select_firmware()
3431 mgp->tx_boundary = 4096; in myri10ge_select_firmware()
3432 set_fw_name(mgp, myri10ge_fw_aligned, false); in myri10ge_select_firmware()
3434 dev_info(&mgp->pdev->dev, in myri10ge_select_firmware()
3436 mgp->tx_boundary = 2048; in myri10ge_select_firmware()
3437 set_fw_name(mgp, myri10ge_fw_unaligned, false); in myri10ge_select_firmware()
3446 set_fw_name(mgp, fw_name, true); in myri10ge_select_firmware()
3451 if (mgp->board_number < MYRI10GE_MAX_BOARDS && in myri10ge_select_firmware()
3452 myri10ge_fw_names[mgp->board_number] != NULL && in myri10ge_select_firmware()
3453 strlen(myri10ge_fw_names[mgp->board_number])) { in myri10ge_select_firmware()
3454 set_fw_name(mgp, myri10ge_fw_names[mgp->board_number], false); in myri10ge_select_firmware()
3458 dev_info(&mgp->pdev->dev, "overriding firmware to %s\n", in myri10ge_select_firmware()
3459 mgp->fw_name); in myri10ge_select_firmware()
3485 struct myri10ge_priv *mgp; in myri10ge_suspend() local
3488 mgp = pci_get_drvdata(pdev); in myri10ge_suspend()
3489 if (mgp == NULL) in myri10ge_suspend()
3491 netdev = mgp->dev; in myri10ge_suspend()
3500 myri10ge_dummy_rdma(mgp, 0); in myri10ge_suspend()
3509 struct myri10ge_priv *mgp; in myri10ge_resume() local
3514 mgp = pci_get_drvdata(pdev); in myri10ge_resume()
3515 if (mgp == NULL) in myri10ge_resume()
3517 netdev = mgp->dev; in myri10ge_resume()
3520 pci_read_config_word(mgp->pdev, PCI_VENDOR_ID, &vendor); in myri10ge_resume()
3522 netdev_err(mgp->dev, "device disappeared!\n"); in myri10ge_resume()
3536 myri10ge_reset(mgp); in myri10ge_resume()
3537 myri10ge_dummy_rdma(mgp, 1); in myri10ge_resume()
3562 static u32 myri10ge_read_reboot(struct myri10ge_priv *mgp) in myri10ge_read_reboot() argument
3564 struct pci_dev *pdev = mgp->pdev; in myri10ge_read_reboot()
3565 int vs = mgp->vendor_specific_offset; in myri10ge_read_reboot()
3581 struct myri10ge_priv *mgp = ss->mgp; in myri10ge_check_slice() local
3582 int slice = ss - mgp->ss; in myri10ge_check_slice()
3588 if (rx_pause_cnt != mgp->watchdog_pause) { in myri10ge_check_slice()
3590 netdev_warn(mgp->dev, "slice %d: TX paused, " in myri10ge_check_slice()
3593 netdev_warn(mgp->dev, in myri10ge_check_slice()
3598 (int)ntohl(mgp->ss[slice].fw_stats-> in myri10ge_check_slice()
3619 struct myri10ge_priv *mgp = in myri10ge_watchdog() local
3629 mgp->watchdog_resets++; in myri10ge_watchdog()
3630 pci_read_config_word(mgp->pdev, PCI_COMMAND, &cmd); in myri10ge_watchdog()
3636 reboot = myri10ge_read_reboot(mgp); in myri10ge_watchdog()
3637 netdev_err(mgp->dev, "NIC rebooted (0x%x),%s resetting\n", in myri10ge_watchdog()
3642 mgp->rebooted = 1; in myri10ge_watchdog()
3644 myri10ge_close(mgp->dev); in myri10ge_watchdog()
3646 mgp->rebooted = 0; in myri10ge_watchdog()
3654 pci_restore_state(mgp->pdev); in myri10ge_watchdog()
3657 pci_save_state(mgp->pdev); in myri10ge_watchdog()
3664 pci_read_config_word(mgp->pdev, PCI_VENDOR_ID, &vendor); in myri10ge_watchdog()
3666 netdev_err(mgp->dev, "device disappeared!\n"); in myri10ge_watchdog()
3672 rx_pause_cnt = ntohl(mgp->ss[0].fw_stats->dropped_pause); in myri10ge_watchdog()
3673 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_watchdog()
3674 ss = mgp->ss; in myri10ge_watchdog()
3683 netdev_dbg(mgp->dev, "not resetting\n"); in myri10ge_watchdog()
3687 netdev_err(mgp->dev, "device timeout, resetting\n"); in myri10ge_watchdog()
3692 myri10ge_close(mgp->dev); in myri10ge_watchdog()
3694 status = myri10ge_load_firmware(mgp, 1); in myri10ge_watchdog()
3696 netdev_err(mgp->dev, "failed to load firmware\n"); in myri10ge_watchdog()
3698 myri10ge_open(mgp->dev); in myri10ge_watchdog()
3711 struct myri10ge_priv *mgp; in myri10ge_watchdog_timer() local
3717 mgp = (struct myri10ge_priv *)arg; in myri10ge_watchdog_timer()
3719 rx_pause_cnt = ntohl(mgp->ss[0].fw_stats->dropped_pause); in myri10ge_watchdog_timer()
3722 i < mgp->num_slices && reset_needed == 0; ++i) { in myri10ge_watchdog_timer()
3724 ss = &mgp->ss[i]; in myri10ge_watchdog_timer()
3726 myri10ge_alloc_rx_pages(mgp, &ss->rx_small, in myri10ge_watchdog_timer()
3727 mgp->small_bytes + MXGEFW_PAD, in myri10ge_watchdog_timer()
3734 myri10ge_alloc_rx_pages(mgp, &ss->rx_big, in myri10ge_watchdog_timer()
3735 mgp->big_bytes, 1); in myri10ge_watchdog_timer()
3747 pci_read_config_word(mgp->pdev, PCI_COMMAND, &cmd); in myri10ge_watchdog_timer()
3752 mgp->watchdog_pause = rx_pause_cnt; in myri10ge_watchdog_timer()
3755 schedule_work(&mgp->watchdog_work); in myri10ge_watchdog_timer()
3758 mod_timer(&mgp->watchdog_timer, in myri10ge_watchdog_timer()
3763 static void myri10ge_free_slices(struct myri10ge_priv *mgp) in myri10ge_free_slices() argument
3766 struct pci_dev *pdev = mgp->pdev; in myri10ge_free_slices()
3770 if (mgp->ss == NULL) in myri10ge_free_slices()
3773 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_free_slices()
3774 ss = &mgp->ss[i]; in myri10ge_free_slices()
3776 bytes = mgp->max_intr_slots * in myri10ge_free_slices()
3793 kfree(mgp->ss); in myri10ge_free_slices()
3794 mgp->ss = NULL; in myri10ge_free_slices()
3797 static int myri10ge_alloc_slices(struct myri10ge_priv *mgp) in myri10ge_alloc_slices() argument
3800 struct pci_dev *pdev = mgp->pdev; in myri10ge_alloc_slices()
3804 bytes = sizeof(*mgp->ss) * mgp->num_slices; in myri10ge_alloc_slices()
3805 mgp->ss = kzalloc(bytes, GFP_KERNEL); in myri10ge_alloc_slices()
3806 if (mgp->ss == NULL) { in myri10ge_alloc_slices()
3810 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_alloc_slices()
3811 ss = &mgp->ss[i]; in myri10ge_alloc_slices()
3812 bytes = mgp->max_intr_slots * sizeof(*ss->rx_done.entry); in myri10ge_alloc_slices()
3824 ss->mgp = mgp; in myri10ge_alloc_slices()
3825 ss->dev = mgp->dev; in myri10ge_alloc_slices()
3832 myri10ge_free_slices(mgp); in myri10ge_alloc_slices()
3842 static void myri10ge_probe_slices(struct myri10ge_priv *mgp) in myri10ge_probe_slices() argument
3845 struct pci_dev *pdev = mgp->pdev; in myri10ge_probe_slices()
3850 mgp->num_slices = 1; in myri10ge_probe_slices()
3858 old_fw = mgp->fw_name; in myri10ge_probe_slices()
3859 old_allocated = mgp->fw_name_allocated; in myri10ge_probe_slices()
3861 mgp->fw_name_allocated = false; in myri10ge_probe_slices()
3864 dev_info(&mgp->pdev->dev, "overriding rss firmware to %s\n", in myri10ge_probe_slices()
3866 set_fw_name(mgp, myri10ge_fw_name, false); in myri10ge_probe_slices()
3868 set_fw_name(mgp, myri10ge_fw_rss_aligned, false); in myri10ge_probe_slices()
3870 set_fw_name(mgp, myri10ge_fw_rss_unaligned, false); in myri10ge_probe_slices()
3871 status = myri10ge_load_firmware(mgp, 0); in myri10ge_probe_slices()
3881 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_RESET, &cmd, 0); in myri10ge_probe_slices()
3883 dev_err(&mgp->pdev->dev, "failed reset\n"); in myri10ge_probe_slices()
3887 mgp->max_intr_slots = cmd.data0 / sizeof(struct mcp_slot); in myri10ge_probe_slices()
3890 cmd.data0 = mgp->max_intr_slots * sizeof(struct mcp_slot); in myri10ge_probe_slices()
3891 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); in myri10ge_probe_slices()
3893 dev_err(&mgp->pdev->dev, "failed MXGEFW_CMD_SET_INTRQ_SIZE\n"); in myri10ge_probe_slices()
3898 status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_RSS_QUEUES, &cmd, 0); in myri10ge_probe_slices()
3902 mgp->num_slices = cmd.data0; in myri10ge_probe_slices()
3915 if (mgp->num_slices > myri10ge_max_slices) in myri10ge_probe_slices()
3916 mgp->num_slices = myri10ge_max_slices; in myri10ge_probe_slices()
3922 mgp->msix_vectors = kcalloc(mgp->num_slices, sizeof(*mgp->msix_vectors), in myri10ge_probe_slices()
3924 if (mgp->msix_vectors == NULL) in myri10ge_probe_slices()
3926 for (i = 0; i < mgp->num_slices; i++) { in myri10ge_probe_slices()
3927 mgp->msix_vectors[i].entry = i; in myri10ge_probe_slices()
3930 while (mgp->num_slices > 1) { in myri10ge_probe_slices()
3931 mgp->num_slices = rounddown_pow_of_two(mgp->num_slices); in myri10ge_probe_slices()
3932 if (mgp->num_slices == 1) in myri10ge_probe_slices()
3935 mgp->msix_vectors, in myri10ge_probe_slices()
3936 mgp->num_slices, in myri10ge_probe_slices()
3937 mgp->num_slices); in myri10ge_probe_slices()
3943 if (status == mgp->num_slices) { in myri10ge_probe_slices()
3948 mgp->num_slices = status; in myri10ge_probe_slices()
3953 if (mgp->msix_vectors != NULL) { in myri10ge_probe_slices()
3954 kfree(mgp->msix_vectors); in myri10ge_probe_slices()
3955 mgp->msix_vectors = NULL; in myri10ge_probe_slices()
3959 mgp->num_slices = 1; in myri10ge_probe_slices()
3960 set_fw_name(mgp, old_fw, old_allocated); in myri10ge_probe_slices()
3961 myri10ge_load_firmware(mgp, 0); in myri10ge_probe_slices()
3981 struct myri10ge_priv *mgp; in myri10ge_probe() local
3989 netdev = alloc_etherdev_mq(sizeof(*mgp), MYRI10GE_MAX_SLICES); in myri10ge_probe()
3995 mgp = netdev_priv(netdev); in myri10ge_probe()
3996 mgp->dev = netdev; in myri10ge_probe()
3997 mgp->pdev = pdev; in myri10ge_probe()
3998 mgp->pause = myri10ge_flow_control; in myri10ge_probe()
3999 mgp->intr_coal_delay = myri10ge_intr_coal_delay; in myri10ge_probe()
4000 mgp->msg_enable = netif_msg_init(myri10ge_debug, MYRI10GE_MSG_DEFAULT); in myri10ge_probe()
4001 mgp->board_number = board_number; in myri10ge_probe()
4002 init_waitqueue_head(&mgp->down_wq); in myri10ge_probe()
4012 mgp->vendor_specific_offset in myri10ge_probe()
4039 mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd), in myri10ge_probe()
4040 &mgp->cmd_bus, GFP_KERNEL); in myri10ge_probe()
4041 if (mgp->cmd == NULL) in myri10ge_probe()
4044 mgp->board_span = pci_resource_len(pdev, 0); in myri10ge_probe()
4045 mgp->iomem_base = pci_resource_start(pdev, 0); in myri10ge_probe()
4046 mgp->mtrr = -1; in myri10ge_probe()
4047 mgp->wc_enabled = 0; in myri10ge_probe()
4049 mgp->mtrr = mtrr_add(mgp->iomem_base, mgp->board_span, in myri10ge_probe()
4051 if (mgp->mtrr >= 0) in myri10ge_probe()
4052 mgp->wc_enabled = 1; in myri10ge_probe()
4054 mgp->sram = ioremap_wc(mgp->iomem_base, mgp->board_span); in myri10ge_probe()
4055 if (mgp->sram == NULL) { in myri10ge_probe()
4057 mgp->board_span, mgp->iomem_base); in myri10ge_probe()
4062 swab32(readl(mgp->sram + MCP_HEADER_PTR_OFFSET)) & 0xffffc; in myri10ge_probe()
4064 mgp->sram_size = swab32(readl(mgp->sram + ss_offset)); in myri10ge_probe()
4065 if (mgp->sram_size > mgp->board_span || in myri10ge_probe()
4066 mgp->sram_size <= MYRI10GE_FW_OFFSET) { in myri10ge_probe()
4069 mgp->sram_size, mgp->board_span); in myri10ge_probe()
4072 memcpy_fromio(mgp->eeprom_strings, in myri10ge_probe()
4073 mgp->sram + mgp->sram_size, MYRI10GE_EEPROM_STRINGS_SIZE); in myri10ge_probe()
4074 memset(mgp->eeprom_strings + MYRI10GE_EEPROM_STRINGS_SIZE - 2, 0, 2); in myri10ge_probe()
4075 status = myri10ge_read_mac_addr(mgp); in myri10ge_probe()
4080 netdev->dev_addr[i] = mgp->mac_addr[i]; in myri10ge_probe()
4082 myri10ge_select_firmware(mgp); in myri10ge_probe()
4084 status = myri10ge_load_firmware(mgp, 1); in myri10ge_probe()
4089 myri10ge_probe_slices(mgp); in myri10ge_probe()
4090 status = myri10ge_alloc_slices(mgp); in myri10ge_probe()
4095 netif_set_real_num_tx_queues(netdev, mgp->num_slices); in myri10ge_probe()
4096 netif_set_real_num_rx_queues(netdev, mgp->num_slices); in myri10ge_probe()
4097 status = myri10ge_reset(mgp); in myri10ge_probe()
4103 myri10ge_setup_dca(mgp); in myri10ge_probe()
4105 pci_set_drvdata(pdev, mgp); in myri10ge_probe()
4113 netdev->hw_features = mgp->features | NETIF_F_RXCSUM; in myri10ge_probe()
4123 netdev->vlan_features |= mgp->features; in myri10ge_probe()
4124 if (mgp->fw_ver_tiny < 37) in myri10ge_probe()
4126 if (mgp->fw_ver_tiny < 32) in myri10ge_probe()
4131 status = myri10ge_request_irq(mgp); in myri10ge_probe()
4134 myri10ge_free_irq(mgp); in myri10ge_probe()
4141 setup_timer(&mgp->watchdog_timer, myri10ge_watchdog_timer, in myri10ge_probe()
4142 (unsigned long)mgp); in myri10ge_probe()
4145 INIT_WORK(&mgp->watchdog_work, myri10ge_watchdog); in myri10ge_probe()
4151 if (mgp->msix_enabled) in myri10ge_probe()
4153 mgp->num_slices, mgp->tx_boundary, mgp->fw_name, in myri10ge_probe()
4154 (mgp->wc_enabled ? "Enabled" : "Disabled")); in myri10ge_probe()
4157 mgp->msi_enabled ? "MSI" : "xPIC", in myri10ge_probe()
4158 pdev->irq, mgp->tx_boundary, mgp->fw_name, in myri10ge_probe()
4159 (mgp->wc_enabled ? "Enabled" : "Disabled")); in myri10ge_probe()
4168 myri10ge_free_slices(mgp); in myri10ge_probe()
4171 myri10ge_dummy_rdma(mgp, 0); in myri10ge_probe()
4174 if (mgp->mac_addr_string != NULL) in myri10ge_probe()
4177 mgp->mac_addr_string, mgp->serial_number); in myri10ge_probe()
4178 iounmap(mgp->sram); in myri10ge_probe()
4182 if (mgp->mtrr >= 0) in myri10ge_probe()
4183 mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); in myri10ge_probe()
4185 dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), in myri10ge_probe()
4186 mgp->cmd, mgp->cmd_bus); in myri10ge_probe()
4192 set_fw_name(mgp, NULL, false); in myri10ge_probe()
4206 struct myri10ge_priv *mgp; in myri10ge_remove() local
4209 mgp = pci_get_drvdata(pdev); in myri10ge_remove()
4210 if (mgp == NULL) in myri10ge_remove()
4213 cancel_work_sync(&mgp->watchdog_work); in myri10ge_remove()
4214 netdev = mgp->dev; in myri10ge_remove()
4218 myri10ge_teardown_dca(mgp); in myri10ge_remove()
4220 myri10ge_dummy_rdma(mgp, 0); in myri10ge_remove()
4225 iounmap(mgp->sram); in myri10ge_remove()
4228 if (mgp->mtrr >= 0) in myri10ge_remove()
4229 mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); in myri10ge_remove()
4231 myri10ge_free_slices(mgp); in myri10ge_remove()
4232 if (mgp->msix_vectors != NULL) in myri10ge_remove()
4233 kfree(mgp->msix_vectors); in myri10ge_remove()
4234 dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), in myri10ge_remove()
4235 mgp->cmd, mgp->cmd_bus); in myri10ge_remove()
4237 set_fw_name(mgp, NULL, false); in myri10ge_remove()