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

myri10ge: report FIBER in ethtool for XFP based NIC

Make ethtool report FIBER for XFP based NIC's port type.
Don't bother to poke around and try to find out what is in
the XFP cage, since Linux does not have separate media types
for -SR -LR, etc.
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 f8fd57c1
...@@ -205,6 +205,7 @@ struct myri10ge_priv { ...@@ -205,6 +205,7 @@ struct myri10ge_priv {
int pause; int pause;
char *fw_name; char *fw_name;
char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE];
char *product_code_string;
char fw_version[128]; char fw_version[128];
int fw_ver_major; int fw_ver_major;
int fw_ver_minor; int fw_ver_minor;
...@@ -421,6 +422,10 @@ static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp) ...@@ -421,6 +422,10 @@ static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp)
ptr += 1; ptr += 1;
} }
} }
if (memcmp(ptr, "PC=", 3) == 0) {
ptr += 3;
mgp->product_code_string = ptr;
}
if (memcmp((const void *)ptr, "SN=", 3) == 0) { if (memcmp((const void *)ptr, "SN=", 3) == 0) {
ptr += 3; ptr += 3;
mgp->serial_number = simple_strtoul(ptr, &ptr, 10); mgp->serial_number = simple_strtoul(ptr, &ptr, 10);
...@@ -1304,9 +1309,39 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) ...@@ -1304,9 +1309,39 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
static int static int
myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
{ {
struct myri10ge_priv *mgp = netdev_priv(netdev);
char *ptr;
int i;
cmd->autoneg = AUTONEG_DISABLE; cmd->autoneg = AUTONEG_DISABLE;
cmd->speed = SPEED_10000; cmd->speed = SPEED_10000;
cmd->duplex = DUPLEX_FULL; cmd->duplex = DUPLEX_FULL;
/*
* parse the product code to deterimine the interface type
* (CX4, XFP, Quad Ribbon Fiber) by looking at the character
* after the 3rd dash in the driver's cached copy of the
* EEPROM's product code string.
*/
ptr = mgp->product_code_string;
if (ptr == NULL) {
printk(KERN_ERR "myri10ge: %s: Missing product code\n",
netdev->name);
return 0;
}
for (i = 0; i < 3; i++, ptr++) {
ptr = strchr(ptr, '-');
if (ptr == NULL) {
printk(KERN_ERR "myri10ge: %s: Invalid product "
"code %s\n", netdev->name,
mgp->product_code_string);
return 0;
}
}
if (*ptr == 'R' || *ptr == 'Q') {
/* We've found either an XFP or quad ribbon fiber */
cmd->port = PORT_FIBRE;
}
return 0; return 0;
} }
......
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