aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/myri10ge/myri10ge.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/myri10ge/myri10ge.c')
-rw-r--r--drivers/net/myri10ge/myri10ge.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index 3f871c467ed2..4a65e4155c0f 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -205,6 +205,7 @@ struct myri10ge_priv {
205 int pause; 205 int pause;
206 char *fw_name; 206 char *fw_name;
207 char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; 207 char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE];
208 char *product_code_string;
208 char fw_version[128]; 209 char fw_version[128];
209 int fw_ver_major; 210 int fw_ver_major;
210 int fw_ver_minor; 211 int fw_ver_minor;
@@ -421,6 +422,10 @@ static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp)
421 ptr += 1; 422 ptr += 1;
422 } 423 }
423 } 424 }
425 if (memcmp(ptr, "PC=", 3) == 0) {
426 ptr += 3;
427 mgp->product_code_string = ptr;
428 }
424 if (memcmp((const void *)ptr, "SN=", 3) == 0) { 429 if (memcmp((const void *)ptr, "SN=", 3) == 0) {
425 ptr += 3; 430 ptr += 3;
426 mgp->serial_number = simple_strtoul(ptr, &ptr, 10); 431 mgp->serial_number = simple_strtoul(ptr, &ptr, 10);
@@ -1304,9 +1309,39 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
1304static int 1309static int
1305myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) 1310myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
1306{ 1311{
1312 struct myri10ge_priv *mgp = netdev_priv(netdev);
1313 char *ptr;
1314 int i;
1315
1307 cmd->autoneg = AUTONEG_DISABLE; 1316 cmd->autoneg = AUTONEG_DISABLE;
1308 cmd->speed = SPEED_10000; 1317 cmd->speed = SPEED_10000;
1309 cmd->duplex = DUPLEX_FULL; 1318 cmd->duplex = DUPLEX_FULL;
1319
1320 /*
1321 * parse the product code to deterimine the interface type
1322 * (CX4, XFP, Quad Ribbon Fiber) by looking at the character
1323 * after the 3rd dash in the driver's cached copy of the
1324 * EEPROM's product code string.
1325 */
1326 ptr = mgp->product_code_string;
1327 if (ptr == NULL) {
1328 printk(KERN_ERR "myri10ge: %s: Missing product code\n",
1329 netdev->name);
1330 return 0;
1331 }
1332 for (i = 0; i < 3; i++, ptr++) {
1333 ptr = strchr(ptr, '-');
1334 if (ptr == NULL) {
1335 printk(KERN_ERR "myri10ge: %s: Invalid product "
1336 "code %s\n", netdev->name,
1337 mgp->product_code_string);
1338 return 0;
1339 }
1340 }
1341 if (*ptr == 'R' || *ptr == 'Q') {
1342 /* We've found either an XFP or quad ribbon fiber */
1343 cmd->port = PORT_FIBRE;
1344 }
1310 return 0; 1345 return 0;
1311} 1346}
1312 1347