return strlen(buf);
 }
 
+static const struct {
+       u16 rate;
+       char *str;
+} port_speed_str[] = {
+       { PORT_SPEED_4GB, "4" },
+       { PORT_SPEED_8GB, "8" },
+       { PORT_SPEED_16GB, "16" },
+       { PORT_SPEED_32GB, "32" },
+       { PORT_SPEED_64GB, "64" },
+       { PORT_SPEED_10GB, "10" },
+};
+
 static ssize_t
 qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr,
     char *buf)
        struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev));
        struct qla_hw_data *ha = vha->hw;
        ssize_t rval;
-       char *spd[7] = {"0", "0", "0", "4", "8", "16", "32"};
+       u16 i;
+       char *speed = "Unknown";
 
        rval = qla2x00_get_data_rate(vha);
        if (rval != QLA_SUCCESS) {
                return -EINVAL;
        }
 
-       return scnprintf(buf, PAGE_SIZE, "%s\n", spd[ha->link_data_rate]);
+       for (i = 0; i < ARRAY_SIZE(port_speed_str); i++) {
+               if (port_speed_str[i].rate != ha->link_data_rate)
+                       continue;
+               speed = port_speed_str[i].str;
+               break;
+       }
+
+       return scnprintf(buf, PAGE_SIZE, "%s\n", speed);
 }
 
 static ssize_t