Merge remote-tracking branch 'scsi/for-next'
[deliverable/linux.git] / drivers / scsi / fcoe / fcoe_transport.c
index 7028dd37e5dd4bc6ffe27d4f57d7f58336d4412c..c164eec5430860a785423544b30fdddf989d6cd9 100644 (file)
@@ -83,6 +83,41 @@ static struct notifier_block libfcoe_notifier = {
        .notifier_call = libfcoe_device_notification,
 };
 
+static const struct {
+       u32 fc_port_speed;
+#define SPEED_2000     2000
+#define SPEED_4000     4000
+#define SPEED_8000     8000
+#define SPEED_16000    16000
+#define SPEED_32000    32000
+       u32 eth_port_speed;
+} fcoe_port_speed_mapping[] = {
+       { FC_PORTSPEED_1GBIT,   SPEED_1000   },
+       { FC_PORTSPEED_2GBIT,   SPEED_2000   },
+       { FC_PORTSPEED_4GBIT,   SPEED_4000   },
+       { FC_PORTSPEED_8GBIT,   SPEED_8000   },
+       { FC_PORTSPEED_10GBIT,  SPEED_10000  },
+       { FC_PORTSPEED_16GBIT,  SPEED_16000  },
+       { FC_PORTSPEED_20GBIT,  SPEED_20000  },
+       { FC_PORTSPEED_25GBIT,  SPEED_25000  },
+       { FC_PORTSPEED_32GBIT,  SPEED_32000  },
+       { FC_PORTSPEED_40GBIT,  SPEED_40000  },
+       { FC_PORTSPEED_50GBIT,  SPEED_50000  },
+       { FC_PORTSPEED_100GBIT, SPEED_100000 },
+};
+
+static inline u32 eth2fc_speed(u32 eth_port_speed)
+{
+       int i;
+
+       for (i = 0; i <= ARRAY_SIZE(fcoe_port_speed_mapping); i++) {
+               if (fcoe_port_speed_mapping[i].eth_port_speed == eth_port_speed)
+                       return fcoe_port_speed_mapping[i].fc_port_speed;
+       }
+
+       return FC_PORTSPEED_UNKNOWN;
+}
+
 /**
  * fcoe_link_speed_update() - Update the supported and actual link speeds
  * @lport: The local port to update speeds for
@@ -126,23 +161,7 @@ int fcoe_link_speed_update(struct fc_lport *lport)
                            SUPPORTED_40000baseLR4_Full))
                        lport->link_supported_speeds |= FC_PORTSPEED_40GBIT;
 
-               switch (ecmd.base.speed) {
-               case SPEED_1000:
-                       lport->link_speed = FC_PORTSPEED_1GBIT;
-                       break;
-               case SPEED_10000:
-                       lport->link_speed = FC_PORTSPEED_10GBIT;
-                       break;
-               case SPEED_20000:
-                       lport->link_speed = FC_PORTSPEED_20GBIT;
-                       break;
-               case SPEED_40000:
-                       lport->link_speed = FC_PORTSPEED_40GBIT;
-                       break;
-               default:
-                       lport->link_speed = FC_PORTSPEED_UNKNOWN;
-                       break;
-               }
+               lport->link_speed = eth2fc_speed(ecmd.base.speed);
                return 0;
        }
        return -1;
This page took 0.02533 seconds and 5 git commands to generate.