scsi: lpfc: Add 64G link speed support
The G7 adapter supports 64G link speeds. Add support to the driver. In addition, a small cleanup to replace the odd bitmap logic with a switch case. Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:

committed by
Martin K. Petersen

父節點
c238b9b6ea
當前提交
fbd8a6ba65
@@ -4115,23 +4115,32 @@ lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
|
||||
((val == LPFC_USER_LINK_SPEED_8G) && !(phba->lmt & LMT_8Gb)) ||
|
||||
((val == LPFC_USER_LINK_SPEED_10G) && !(phba->lmt & LMT_10Gb)) ||
|
||||
((val == LPFC_USER_LINK_SPEED_16G) && !(phba->lmt & LMT_16Gb)) ||
|
||||
((val == LPFC_USER_LINK_SPEED_32G) && !(phba->lmt & LMT_32Gb))) {
|
||||
((val == LPFC_USER_LINK_SPEED_32G) && !(phba->lmt & LMT_32Gb)) ||
|
||||
((val == LPFC_USER_LINK_SPEED_64G) && !(phba->lmt & LMT_64Gb))) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"2879 lpfc_link_speed attribute cannot be set "
|
||||
"to %d. Speed is not supported by this port.\n",
|
||||
val);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (val == LPFC_USER_LINK_SPEED_16G &&
|
||||
phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
if (val >= LPFC_USER_LINK_SPEED_16G &&
|
||||
phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"3112 lpfc_link_speed attribute cannot be set "
|
||||
"to %d. Speed is not supported in loop mode.\n",
|
||||
val);
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((val >= 0) && (val <= LPFC_USER_LINK_SPEED_MAX) &&
|
||||
(LPFC_USER_LINK_SPEED_BITMAP & (1 << val))) {
|
||||
|
||||
switch (val) {
|
||||
case LPFC_USER_LINK_SPEED_AUTO:
|
||||
case LPFC_USER_LINK_SPEED_1G:
|
||||
case LPFC_USER_LINK_SPEED_2G:
|
||||
case LPFC_USER_LINK_SPEED_4G:
|
||||
case LPFC_USER_LINK_SPEED_8G:
|
||||
case LPFC_USER_LINK_SPEED_16G:
|
||||
case LPFC_USER_LINK_SPEED_32G:
|
||||
case LPFC_USER_LINK_SPEED_64G:
|
||||
prev_val = phba->cfg_link_speed;
|
||||
phba->cfg_link_speed = val;
|
||||
if (nolip)
|
||||
@@ -4141,13 +4150,18 @@ lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
|
||||
if (err) {
|
||||
phba->cfg_link_speed = prev_val;
|
||||
return -EINVAL;
|
||||
} else
|
||||
return strlen(buf);
|
||||
}
|
||||
return strlen(buf);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"0469 lpfc_link_speed attribute cannot be set to %d, "
|
||||
"allowed values are ["LPFC_LINK_SPEED_STRING"]\n", val);
|
||||
"0469 lpfc_link_speed attribute cannot be set to %d, "
|
||||
"allowed values are [%s]\n",
|
||||
val, LPFC_LINK_SPEED_STRING);
|
||||
return -EINVAL;
|
||||
|
||||
}
|
||||
|
||||
static int lpfc_link_speed = 0;
|
||||
@@ -4174,24 +4188,33 @@ lpfc_param_show(link_speed)
|
||||
static int
|
||||
lpfc_link_speed_init(struct lpfc_hba *phba, int val)
|
||||
{
|
||||
if (val == LPFC_USER_LINK_SPEED_16G && phba->cfg_topology == 4) {
|
||||
if (val >= LPFC_USER_LINK_SPEED_16G && phba->cfg_topology == 4) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"3111 lpfc_link_speed of %d cannot "
|
||||
"support loop mode, setting topology to default.\n",
|
||||
val);
|
||||
phba->cfg_topology = 0;
|
||||
}
|
||||
if ((val >= 0) && (val <= LPFC_USER_LINK_SPEED_MAX) &&
|
||||
(LPFC_USER_LINK_SPEED_BITMAP & (1 << val))) {
|
||||
|
||||
switch (val) {
|
||||
case LPFC_USER_LINK_SPEED_AUTO:
|
||||
case LPFC_USER_LINK_SPEED_1G:
|
||||
case LPFC_USER_LINK_SPEED_2G:
|
||||
case LPFC_USER_LINK_SPEED_4G:
|
||||
case LPFC_USER_LINK_SPEED_8G:
|
||||
case LPFC_USER_LINK_SPEED_16G:
|
||||
case LPFC_USER_LINK_SPEED_32G:
|
||||
case LPFC_USER_LINK_SPEED_64G:
|
||||
phba->cfg_link_speed = val;
|
||||
return 0;
|
||||
default:
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"0405 lpfc_link_speed attribute cannot "
|
||||
"be set to %d, allowed values are "
|
||||
"["LPFC_LINK_SPEED_STRING"]\n", val);
|
||||
phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO;
|
||||
return -EINVAL;
|
||||
}
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"0405 lpfc_link_speed attribute cannot "
|
||||
"be set to %d, allowed values are "
|
||||
"["LPFC_LINK_SPEED_STRING"]\n", val);
|
||||
phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(lpfc_link_speed);
|
||||
@@ -5716,6 +5739,9 @@ lpfc_get_host_speed(struct Scsi_Host *shost)
|
||||
case LPFC_LINK_SPEED_32GHZ:
|
||||
fc_host_speed(shost) = FC_PORTSPEED_32GBIT;
|
||||
break;
|
||||
case LPFC_LINK_SPEED_64GHZ:
|
||||
fc_host_speed(shost) = FC_PORTSPEED_64GBIT;
|
||||
break;
|
||||
default:
|
||||
fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user