* [PATCH 0/6] myri10ge updates for 2.6.22
@ 2007-05-07 21:48 Brice Goglin
2007-05-07 21:49 ` [PATCH 1/6] myri10ge: support new firmware counters Brice Goglin
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:48 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Hi Jeff,
Here's some updates of myri10ge for 2.6.22. The good news is that the
aligned-completion whitelist is now gone.
1. support new firmware counters
2. update firmware headers
3. fix restoring of multicast list after reset
4. limit the number of recoveries
5. move the DMA test code into its own function
6. replace the chipset whitelist with firmware autodetection
Thanks!
Brice
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/6] myri10ge: support new firmware counters
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
@ 2007-05-07 21:49 ` Brice Goglin
2007-05-08 5:16 ` Jeff Garzik
2007-05-07 21:49 ` [PATCH 2/6] myri10ge: update firmware headers Brice Goglin
` (4 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:49 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Add dropped_pause, dropped_bad_phy, dropped_bad_crc32,
dropped_unicast_filtered to the set of ethtool counters.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 9 ++++++++-
drivers/net/myri10ge/myri10ge_mcp.h | 6 +++++-
2 files changed, 13 insertions(+), 2 deletions(-)
Index: linux-git/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:14:39.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:20:45.000000000 +0200
@@ -1355,7 +1355,9 @@
"tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt",
"wake_queue", "stop_queue", "watchdog_resets", "tx_linearized",
"link_changes", "link_up", "dropped_link_overflow",
- "dropped_link_error_or_filtered", "dropped_multicast_filtered",
+ "dropped_link_error_or_filtered",
+ "dropped_pause", "dropped_bad_phy", "dropped_bad_crc32",
+ "dropped_unicast_filtered", "dropped_multicast_filtered",
"dropped_runt", "dropped_overrun", "dropped_no_small_buffer",
"dropped_no_big_buffer"
};
@@ -1412,6 +1414,11 @@
data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_link_overflow);
data[i++] =
(unsigned int)ntohl(mgp->fw_stats->dropped_link_error_or_filtered);
+ data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_pause);
+ data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_phy);
+ data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_crc32);
+ data[i++] =
+ (unsigned int)ntohl(mgp->fw_stats->dropped_unicast_filtered);
data[i++] =
(unsigned int)ntohl(mgp->fw_stats->dropped_multicast_filtered);
data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_runt);
Index: linux-git/drivers/net/myri10ge/myri10ge_mcp.h
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge_mcp.h 2007-02-04 19:44:54.000000000 +0100
+++ linux-git/drivers/net/myri10ge/myri10ge_mcp.h 2007-05-07 23:20:45.000000000 +0200
@@ -219,7 +219,11 @@
struct mcp_irq_data {
/* add new counters at the beginning */
- __be32 future_use[5];
+ __be32 future_use[1];
+ __be32 dropped_pause;
+ __be32 dropped_unicast_filtered;
+ __be32 dropped_bad_crc32;
+ __be32 dropped_bad_phy;
__be32 dropped_multicast_filtered;
/* 40 Bytes */
__be32 send_done_count;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/6] myri10ge: update firmware headers
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
2007-05-07 21:49 ` [PATCH 1/6] myri10ge: support new firmware counters Brice Goglin
@ 2007-05-07 21:49 ` Brice Goglin
2007-05-07 21:50 ` [PATCH 3/6] myri10ge: fix restoring of multicast list after reset Brice Goglin
` (3 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:49 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Update myri10ge firmware headers to those of 1.4.16.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge_mcp.h | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
Index: linux-git/drivers/net/myri10ge/myri10ge_mcp.h
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge_mcp.h 2007-05-07 23:20:45.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge_mcp.h 2007-05-07 23:21:11.000000000 +0200
@@ -200,6 +200,13 @@
/* data0, data1 = bus addr,
* data2 = sizeof(struct mcp_irq_data) from driver point of view, allows
* adding new stuff to mcp_irq_data without changing the ABI */
+
+ MXGEFW_CMD_UNALIGNED_TEST,
+ /* same than DMA_TEST (same args) but abort with UNALIGNED on unaligned
+ * chipset */
+
+ MXGEFW_CMD_UNALIGNED_STATUS
+ /* return data = boolean, true if the chipset is known to be unaligned */
};
enum myri10ge_mcp_cmd_status {
@@ -212,7 +219,8 @@
MXGEFW_CMD_ERROR_HASH_ERROR,
MXGEFW_CMD_ERROR_BAD_PORT,
MXGEFW_CMD_ERROR_RESOURCES,
- MXGEFW_CMD_ERROR_MULTICAST
+ MXGEFW_CMD_ERROR_MULTICAST,
+ MXGEFW_CMD_ERROR_UNALIGNED
};
#define MXGEFW_OLD_IRQ_DATA_LEN 40
@@ -228,6 +236,10 @@
/* 40 Bytes */
__be32 send_done_count;
+#define MXGEFW_LINK_DOWN 0
+#define MXGEFW_LINK_UP 1
+#define MXGEFW_LINK_MYRINET 2
+#define MXGEFW_LINK_UNKNOWN 3
__be32 link_up;
__be32 dropped_link_overflow;
__be32 dropped_link_error_or_filtered;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/6] myri10ge: fix restoring of multicast list after reset
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
2007-05-07 21:49 ` [PATCH 1/6] myri10ge: support new firmware counters Brice Goglin
2007-05-07 21:49 ` [PATCH 2/6] myri10ge: update firmware headers Brice Goglin
@ 2007-05-07 21:50 ` Brice Goglin
2007-05-07 21:51 ` [PATCH 4/6] myri10ge: limit the number of recoveries Brice Goglin
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:50 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Don't count on whatever implementation artifact preserves the
multicast list across a reset cmd, and setup multicast filtering
as part of our reset routine.
The setting of allmulti when adopting firmware with the rx-filter
broadcast bug is also moved into the multicast setup routine where
it belongs.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
Index: linux-git/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:20:45.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:27.000000000 +0200
@@ -290,6 +290,8 @@
#define myri10ge_pio_copy(to,from,size) __iowrite64_copy(to,from,size/8)
+static void myri10ge_set_multicast_list(struct net_device *dev);
+
static inline void put_be32(__be32 val, __be32 __iomem * p)
{
__raw_writel((__force __u32) val, (__force void __iomem *)p);
@@ -820,10 +822,8 @@
mgp->rx_done.cnt = 0;
mgp->link_changes = 0;
status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr);
- myri10ge_change_promisc(mgp, 0, 0);
myri10ge_change_pause(mgp, mgp->pause);
- if (mgp->adopted_rx_filter_bug)
- (void)myri10ge_send_cmd(mgp, MXGEFW_ENABLE_ALLMULTI, &cmd, 1);
+ myri10ge_set_multicast_list(mgp->dev);
return status;
}
@@ -2283,7 +2283,7 @@
myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1);
/* This firmware is known to not support multicast */
- if (!mgp->fw_multicast_support || mgp->adopted_rx_filter_bug)
+ if (!mgp->fw_multicast_support)
return;
/* Disable multicast filtering */
@@ -2295,7 +2295,7 @@
goto abort;
}
- if (dev->flags & IFF_ALLMULTI) {
+ if ((dev->flags & IFF_ALLMULTI) || mgp->adopted_rx_filter_bug) {
/* request to disable multicast filtering, so quit here */
return;
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/6] myri10ge: limit the number of recoveries
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
` (2 preceding siblings ...)
2007-05-07 21:50 ` [PATCH 3/6] myri10ge: fix restoring of multicast list after reset Brice Goglin
@ 2007-05-07 21:51 ` Brice Goglin
2007-05-08 5:13 ` Jeff Garzik
2007-05-07 21:51 ` [PATCH 5/6] myri10ge: move the DMA test code into its own function Brice Goglin
2007-05-07 21:52 ` [PATCH 6/6] myri10ge: replace the chipset whitelist with firmware autodetection Brice Goglin
5 siblings, 1 reply; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:51 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Limit the number of recoveries from a NIC hw watchdog reset to
1 by default. This is tweakable via the myri10ge_reset_recover
tunable.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
Index: linux-git/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:27.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:45.000000000 +0200
@@ -279,6 +279,11 @@
module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed\n");
+static int myri10ge_reset_recover = 1;
+module_param(myri10ge_reset_recover, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(myri10ge_reset_recover,
+ "Number of recoveries allowed from NIC hw reset\n");
+
static int myri10ge_wcfifo = 0;
module_param(myri10ge_wcfifo, int, S_IRUGO);
MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled\n");
@@ -2706,8 +2711,14 @@
* For now, just report it */
reboot = myri10ge_read_reboot(mgp);
printk(KERN_ERR
- "myri10ge: %s: NIC rebooted (0x%x), resetting\n",
- mgp->dev->name, reboot);
+ "myri10ge: %s: NIC rebooted (0x%x),%s resetting\n",
+ mgp->dev->name, reboot,
+ myri10ge_reset_recover ? " " : " not");
+ if (myri10ge_reset_recover == 0)
+ return;
+
+ myri10ge_reset_recover--;
+
/*
* A rebooted nic will come back with config space as
* it was after power was applied to PCIe bus.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 5/6] myri10ge: move the DMA test code into its own function
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
` (3 preceding siblings ...)
2007-05-07 21:51 ` [PATCH 4/6] myri10ge: limit the number of recoveries Brice Goglin
@ 2007-05-07 21:51 ` Brice Goglin
2007-05-07 21:52 ` [PATCH 6/6] myri10ge: replace the chipset whitelist with firmware autodetection Brice Goglin
5 siblings, 0 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:51 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Move the DMA test code into its own function.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 121 ++++++++++++++++++++++------------------
1 file changed, 68 insertions(+), 53 deletions(-)
Index: linux-git/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:45.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:52.000000000 +0200
@@ -719,14 +719,78 @@
mgp->dev->name);
}
-static int myri10ge_reset(struct myri10ge_priv *mgp)
+static int myri10ge_dma_test(struct myri10ge_priv *mgp, int test_type)
{
struct myri10ge_cmd cmd;
int status;
- size_t bytes;
u32 len;
struct page *dmatest_page;
dma_addr_t dmatest_bus;
+ char *test = " ";
+
+ dmatest_page = alloc_page(GFP_KERNEL);
+ if (!dmatest_page)
+ return -ENOMEM;
+ dmatest_bus = pci_map_page(mgp->pdev, dmatest_page, 0, PAGE_SIZE,
+ DMA_BIDIRECTIONAL);
+
+ /* Run a small DMA test.
+ * The magic multipliers to the length tell the firmware
+ * to do DMA read, write, or read+write tests. The
+ * results are returned in cmd.data0. The upper 16
+ * bits or the return is the number of transfers completed.
+ * The lower 16 bits is the time in 0.5us ticks that the
+ * transfers took to complete.
+ */
+
+ len = mgp->tx.boundary;
+
+ cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
+ cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
+ cmd.data2 = len * 0x10000;
+ status = myri10ge_send_cmd(mgp, test_type, &cmd, 0);
+ if (status != 0) {
+ test = "read";
+ goto abort;
+ }
+ mgp->read_dma = ((cmd.data0 >> 16) * len * 2) / (cmd.data0 & 0xffff);
+ cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
+ cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
+ cmd.data2 = len * 0x1;
+ status = myri10ge_send_cmd(mgp, test_type, &cmd, 0);
+ if (status != 0) {
+ test = "write";
+ goto abort;
+ }
+ mgp->write_dma = ((cmd.data0 >> 16) * len * 2) / (cmd.data0 & 0xffff);
+
+ cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
+ cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
+ cmd.data2 = len * 0x10001;
+ status = myri10ge_send_cmd(mgp, test_type, &cmd, 0);
+ if (status != 0) {
+ test = "read/write";
+ goto abort;
+ }
+ mgp->read_write_dma = ((cmd.data0 >> 16) * len * 2 * 2) /
+ (cmd.data0 & 0xffff);
+
+abort:
+ pci_unmap_page(mgp->pdev, dmatest_bus, PAGE_SIZE, DMA_BIDIRECTIONAL);
+ put_page(dmatest_page);
+
+ if (status != 0 && test_type != MXGEFW_CMD_UNALIGNED_TEST)
+ dev_warn(&mgp->pdev->dev, "DMA %s benchmark failed: %d\n",
+ test, status);
+
+ return status;
+}
+
+static int myri10ge_reset(struct myri10ge_priv *mgp)
+{
+ struct myri10ge_cmd cmd;
+ int status;
+ size_t bytes;
/* try to send a reset command to the card to see if it
* is alive */
@@ -736,11 +800,8 @@
dev_err(&mgp->pdev->dev, "failed reset\n");
return -ENXIO;
}
- dmatest_page = alloc_page(GFP_KERNEL);
- if (!dmatest_page)
- return -ENOMEM;
- dmatest_bus = pci_map_page(mgp->pdev, dmatest_page, 0, PAGE_SIZE,
- DMA_BIDIRECTIONAL);
+
+ (void)myri10ge_dma_test(mgp, MXGEFW_DMA_TEST);
/* Now exchange information about interrupts */
@@ -768,52 +829,6 @@
}
put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
- /* Run a small DMA test.
- * The magic multipliers to the length tell the firmware
- * to do DMA read, write, or read+write tests. The
- * results are returned in cmd.data0. The upper 16
- * bits or the return is the number of transfers completed.
- * The lower 16 bits is the time in 0.5us ticks that the
- * transfers took to complete.
- */
-
- len = mgp->tx.boundary;
-
- cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
- cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
- cmd.data2 = len * 0x10000;
- status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0);
- if (status == 0)
- mgp->read_dma = ((cmd.data0 >> 16) * len * 2) /
- (cmd.data0 & 0xffff);
- else
- dev_warn(&mgp->pdev->dev, "DMA read benchmark failed: %d\n",
- status);
- cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
- cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
- cmd.data2 = len * 0x1;
- status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0);
- if (status == 0)
- mgp->write_dma = ((cmd.data0 >> 16) * len * 2) /
- (cmd.data0 & 0xffff);
- else
- dev_warn(&mgp->pdev->dev, "DMA write benchmark failed: %d\n",
- status);
-
- cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus);
- cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus);
- cmd.data2 = len * 0x10001;
- status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0);
- if (status == 0)
- mgp->read_write_dma = ((cmd.data0 >> 16) * len * 2 * 2) /
- (cmd.data0 & 0xffff);
- else
- dev_warn(&mgp->pdev->dev,
- "DMA read/write benchmark failed: %d\n", status);
-
- pci_unmap_page(mgp->pdev, dmatest_bus, PAGE_SIZE, DMA_BIDIRECTIONAL);
- put_page(dmatest_page);
-
memset(mgp->rx_done.entry, 0, bytes);
/* reset mcp/driver shared state back to 0 */
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 6/6] myri10ge: replace the chipset whitelist with firmware autodetection
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
` (4 preceding siblings ...)
2007-05-07 21:51 ` [PATCH 5/6] myri10ge: move the DMA test code into its own function Brice Goglin
@ 2007-05-07 21:52 ` Brice Goglin
5 siblings, 0 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-07 21:52 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Remove the aligned-completion whitelist, and replace it by using the 1.4.16
firmware's auto-detection features to choose which firmware to load.
The driver now loads the aligned firmware, performs a MXGEFW_CMD_UNALIGNED_TEST,
and falls back to using the unaligned firmware if:
- The firmware is too old (ie, MXGEFW_CMD_UNALIGNED_TEST is an unknown command).
- The MXGEFW_CMD_UNALIGNED_TEST returns MXGEFW_CMD_ERROR_UNALIGNED, meaning
that it has seen an unaligned completion during the DMA test.
Signed-off-by: Brice Goglin <brice@myri.com>
---
drivers/net/myri10ge/myri10ge.c | 121 +++++++++++++++++++++-------------------
1 file changed, 65 insertions(+), 56 deletions(-)
Index: linux-git/drivers/net/myri10ge/myri10ge.c
===================================================================
--- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:52.000000000 +0200
+++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:59.000000000 +0200
@@ -360,6 +360,8 @@
return 0;
} else if (result == MXGEFW_CMD_UNKNOWN) {
return -ENOSYS;
+ } else if (result == MXGEFW_CMD_ERROR_UNALIGNED) {
+ return -E2BIG;
} else {
dev_err(&mgp->pdev->dev,
"command %d failed, result = %d\n",
@@ -2488,8 +2490,6 @@
err_cap |= PCI_ERR_CAP_ECRC_GENE;
pci_write_config_dword(bridge, cap + PCI_ERR_CAP, err_cap);
dev_info(dev, "Enabled ECRC on upstream bridge %s\n", pci_name(bridge));
- mgp->tx.boundary = 4096;
- mgp->fw_name = myri10ge_fw_aligned;
}
/*
@@ -2511,22 +2511,70 @@
* firmware image, and set tx.boundary to 4KB.
*/
-#define PCI_DEVICE_ID_INTEL_E5000_PCIE23 0x25f7
-#define PCI_DEVICE_ID_INTEL_E5000_PCIE47 0x25fa
-#define PCI_DEVICE_ID_INTEL_6300ESB_PCIEE1 0x3510
-#define PCI_DEVICE_ID_INTEL_6300ESB_PCIEE4 0x351b
-#define PCI_DEVICE_ID_INTEL_E3000_PCIE 0x2779
-#define PCI_DEVICE_ID_INTEL_E3010_PCIE 0x277a
-#define PCI_DEVICE_ID_SERVERWORKS_HT2100_PCIE_FIRST 0x140
-#define PCI_DEVICE_ID_SERVERWORKS_HT2100_PCIE_LAST 0x142
-
-static void myri10ge_select_firmware(struct myri10ge_priv *mgp)
+static void myri10ge_firmware_probe(struct myri10ge_priv *mgp)
{
- struct pci_dev *bridge = mgp->pdev->bus->self;
+ struct pci_dev *pdev = mgp->pdev;
+ struct device *dev = &pdev->dev;
+ int cap, status;
+ u16 val;
+
+ mgp->tx.boundary = 4096;
+ /*
+ * Verify the max read request size was set to 4KB
+ * before trying the test with 4KB.
+ */
+ cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
+ if (cap < 64) {
+ dev_err(dev, "Bad PCI_CAP_ID_EXP location %d\n", cap);
+ goto abort;
+ }
+ status = pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &val);
+ if (status != 0) {
+ dev_err(dev, "Couldn't read max read req size: %d\n", status);
+ goto abort;
+ }
+ if ((val & (5 << 12)) != (5 << 12)) {
+ dev_warn(dev, "Max Read Request size != 4096 (0x%x)\n", val);
+ mgp->tx.boundary = 2048;
+ }
+ /*
+ * load the optimized firmware (which assumes aligned PCIe
+ * completions) in order to see if it works on this host.
+ */
+ mgp->fw_name = myri10ge_fw_aligned;
+ status = myri10ge_load_firmware(mgp);
+ if (status != 0) {
+ goto abort;
+ }
+
+ /*
+ * Enable ECRC if possible
+ */
+ myri10ge_enable_ecrc(mgp);
+ /*
+ * Run a DMA test which watches for unaligned completions and
+ * aborts on the first one seen.
+ */
+
+ status = myri10ge_dma_test(mgp, MXGEFW_CMD_UNALIGNED_TEST);
+ if (status == 0)
+ return; /* keep the aligned firmware */
+
+ if (status != -E2BIG)
+ dev_warn(dev, "DMA test failed: %d\n", status);
+ if (status == -ENOSYS)
+ dev_warn(dev, "Falling back to ethp! "
+ "Please install up to date fw\n");
+abort:
+ /* fall back to using the unaligned firmware */
mgp->tx.boundary = 2048;
mgp->fw_name = myri10ge_fw_unaligned;
+}
+
+static void myri10ge_select_firmware(struct myri10ge_priv *mgp)
+{
if (myri10ge_force_firmware == 0) {
int link_width, exp_cap;
u16 lnk;
@@ -2535,8 +2583,6 @@
pci_read_config_word(mgp->pdev, exp_cap + PCI_EXP_LNKSTA, &lnk);
link_width = (lnk >> 4) & 0x3f;
- myri10ge_enable_ecrc(mgp);
-
/* Check to see if Link is less than 8 or if the
* upstream bridge is known to provide aligned
* completions */
@@ -2545,46 +2591,8 @@
link_width);
mgp->tx.boundary = 4096;
mgp->fw_name = myri10ge_fw_aligned;
- } else if (bridge &&
- /* ServerWorks HT2000/HT1000 */
- ((bridge->vendor == PCI_VENDOR_ID_SERVERWORKS
- && bridge->device ==
- PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE)
- /* ServerWorks HT2100 */
- || (bridge->vendor == PCI_VENDOR_ID_SERVERWORKS
- && bridge->device >=
- PCI_DEVICE_ID_SERVERWORKS_HT2100_PCIE_FIRST
- && bridge->device <=
- PCI_DEVICE_ID_SERVERWORKS_HT2100_PCIE_LAST)
- /* All Intel E3000/E3010 PCIE ports */
- || (bridge->vendor == PCI_VENDOR_ID_INTEL
- && (bridge->device ==
- PCI_DEVICE_ID_INTEL_E3000_PCIE
- || bridge->device ==
- PCI_DEVICE_ID_INTEL_E3010_PCIE))
- /* All Intel 6310/6311/6321ESB PCIE ports */
- || (bridge->vendor == PCI_VENDOR_ID_INTEL
- && bridge->device >=
- PCI_DEVICE_ID_INTEL_6300ESB_PCIEE1
- && bridge->device <=
- PCI_DEVICE_ID_INTEL_6300ESB_PCIEE4)
- /* All Intel E5000 PCIE ports */
- || (bridge->vendor == PCI_VENDOR_ID_INTEL
- && bridge->device >=
- PCI_DEVICE_ID_INTEL_E5000_PCIE23
- && bridge->device <=
- PCI_DEVICE_ID_INTEL_E5000_PCIE47))) {
- dev_info(&mgp->pdev->dev,
- "Assuming aligned completions (0x%x:0x%x)\n",
- bridge->vendor, bridge->device);
- mgp->tx.boundary = 4096;
- mgp->fw_name = myri10ge_fw_aligned;
- } else if (bridge &&
- bridge->vendor == PCI_VENDOR_ID_SGI &&
- bridge->device == 0x4002 /* TIOCE pcie-port */ ) {
- /* this pcie bridge does not support 4K rdma request */
- mgp->tx.boundary = 2048;
- mgp->fw_name = myri10ge_fw_aligned;
+ } else {
+ myri10ge_firmware_probe(mgp);
}
} else {
if (myri10ge_force_firmware == 1) {
@@ -2858,7 +2866,6 @@
status = -ENODEV;
goto abort_with_netdev;
}
- myri10ge_select_firmware(mgp);
/* Find the vendor-specific cap so we can check
* the reboot register later on */
@@ -2952,6 +2959,8 @@
goto abort_with_ioremap;
memset(mgp->rx_done.entry, 0, bytes);
+ myri10ge_select_firmware(mgp);
+
status = myri10ge_load_firmware(mgp);
if (status != 0) {
dev_err(&pdev->dev, "failed to load firmware\n");
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 4/6] myri10ge: limit the number of recoveries
2007-05-07 21:51 ` [PATCH 4/6] myri10ge: limit the number of recoveries Brice Goglin
@ 2007-05-08 5:13 ` Jeff Garzik
2007-05-08 21:10 ` Brice Goglin
0 siblings, 1 reply; 10+ messages in thread
From: Jeff Garzik @ 2007-05-08 5:13 UTC (permalink / raw)
To: Brice Goglin; +Cc: netdev
Brice Goglin wrote:
> Limit the number of recoveries from a NIC hw watchdog reset to
> 1 by default. This is tweakable via the myri10ge_reset_recover
> tunable.
>
> Signed-off-by: Brice Goglin <brice@myri.com>
> ---
> drivers/net/myri10ge/myri10ge.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> Index: linux-git/drivers/net/myri10ge/myri10ge.c
> ===================================================================
> --- linux-git.orig/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:27.000000000 +0200
> +++ linux-git/drivers/net/myri10ge/myri10ge.c 2007-05-07 23:21:45.000000000 +0200
> @@ -279,6 +279,11 @@
> module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR);
> MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed\n");
>
> +static int myri10ge_reset_recover = 1;
> +module_param(myri10ge_reset_recover, int, S_IRUGO | S_IWUSR);
> +MODULE_PARM_DESC(myri10ge_reset_recover,
> + "Number of recoveries allowed from NIC hw reset\n");
> +
> static int myri10ge_wcfifo = 0;
> module_param(myri10ge_wcfifo, int, S_IRUGO);
> MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled\n");
> @@ -2706,8 +2711,14 @@
> * For now, just report it */
> reboot = myri10ge_read_reboot(mgp);
> printk(KERN_ERR
> - "myri10ge: %s: NIC rebooted (0x%x), resetting\n",
> - mgp->dev->name, reboot);
> + "myri10ge: %s: NIC rebooted (0x%x),%s resetting\n",
> + mgp->dev->name, reboot,
> + myri10ge_reset_recover ? " " : " not");
> + if (myri10ge_reset_recover == 0)
> + return;
> +
> + myri10ge_reset_recover--;
NAK. Tunables like this are generally (a) never touched by the vast
majority of users, and (b) have useful values and purposes known only to
Myri employees :)
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/6] myri10ge: support new firmware counters
2007-05-07 21:49 ` [PATCH 1/6] myri10ge: support new firmware counters Brice Goglin
@ 2007-05-08 5:16 ` Jeff Garzik
0 siblings, 0 replies; 10+ messages in thread
From: Jeff Garzik @ 2007-05-08 5:16 UTC (permalink / raw)
To: Brice Goglin; +Cc: netdev
Brice Goglin wrote:
> Add dropped_pause, dropped_bad_phy, dropped_bad_crc32,
> dropped_unicast_filtered to the set of ethtool counters.
>
> Signed-off-by: Brice Goglin <brice@myri.com>
> ---
> drivers/net/myri10ge/myri10ge.c | 9 ++++++++-
> drivers/net/myri10ge/myri10ge_mcp.h | 6 +++++-
> 2 files changed, 13 insertions(+), 2 deletions(-)
applied 1-6, except for the aforementioned patch
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 4/6] myri10ge: limit the number of recoveries
2007-05-08 5:13 ` Jeff Garzik
@ 2007-05-08 21:10 ` Brice Goglin
0 siblings, 0 replies; 10+ messages in thread
From: Brice Goglin @ 2007-05-08 21:10 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
Jeff Garzik wrote:
> Brice Goglin wrote:
>> Limit the number of recoveries from a NIC hw watchdog reset to
>> 1 by default. This is tweakable via the myri10ge_reset_recover
>> tunable.
>
> NAK. Tunables like this are generally (a) never touched by the vast
> majority of users, and (b) have useful values and purposes known only
> to Myri employees :)
Well, actually, it's kind of the opposite. Myri employees won't need to
tune this value since they will be able to replace the NIC with another
one immediately. The whole point of this tunable is to help end-users:
* The default value (set to 1) enables detection of defective NICs
immediately. These memory parity errors are expected to happen very
rarely (less than once per century per NIC). However, a defective NIC
(very rare, fortunately) can see such an error quite often, ie. every
few minutes under high load.
* An increased limit value will still allow people with mission critical
installations to crank up the tunable and recover an INTMAX number of
times while waiting for a downtime window to replace the NIC. The
performance won't be optimal, but at least, it will still work.
Should I resent the patch?
Thanks,
Brice
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2007-05-08 21:11 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-07 21:48 [PATCH 0/6] myri10ge updates for 2.6.22 Brice Goglin
2007-05-07 21:49 ` [PATCH 1/6] myri10ge: support new firmware counters Brice Goglin
2007-05-08 5:16 ` Jeff Garzik
2007-05-07 21:49 ` [PATCH 2/6] myri10ge: update firmware headers Brice Goglin
2007-05-07 21:50 ` [PATCH 3/6] myri10ge: fix restoring of multicast list after reset Brice Goglin
2007-05-07 21:51 ` [PATCH 4/6] myri10ge: limit the number of recoveries Brice Goglin
2007-05-08 5:13 ` Jeff Garzik
2007-05-08 21:10 ` Brice Goglin
2007-05-07 21:51 ` [PATCH 5/6] myri10ge: move the DMA test code into its own function Brice Goglin
2007-05-07 21:52 ` [PATCH 6/6] myri10ge: replace the chipset whitelist with firmware autodetection Brice Goglin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).