Commit a085e87c authored by James Smart's avatar James Smart Committed by Martin K. Petersen

lpfc: Use new FDMI speed definitions for 10G, 25G and 40G FCoE.

Use new FDMI speed definitions for 10G, 25G and 40G FCoE.
Signed-off-by: default avatarDick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: default avatarJames Smart <james.smart@avagotech.com>
Reviewed-by: default avatarHannes Reinicke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5afab6bb
...@@ -5255,7 +5255,7 @@ lpfc_get_host_speed(struct Scsi_Host *shost) ...@@ -5255,7 +5255,7 @@ lpfc_get_host_speed(struct Scsi_Host *shost)
spin_lock_irq(shost->host_lock); spin_lock_irq(shost->host_lock);
if (lpfc_is_link_up(phba)) { if ((lpfc_is_link_up(phba)) && (!(phba->hba_flag & HBA_FCOE_MODE))) {
switch(phba->fc_linkspeed) { switch(phba->fc_linkspeed) {
case LPFC_LINK_SPEED_1GHZ: case LPFC_LINK_SPEED_1GHZ:
fc_host_speed(shost) = FC_PORTSPEED_1GBIT; fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
......
...@@ -48,15 +48,26 @@ ...@@ -48,15 +48,26 @@
#include "lpfc_vport.h" #include "lpfc_vport.h"
#include "lpfc_debugfs.h" #include "lpfc_debugfs.h"
/* FDMI Port Speed definitions */ /* FDMI Port Speed definitions - FC-GS-7 */
#define HBA_PORTSPEED_1GBIT 0x0001 /* 1 GBit/sec */ #define HBA_PORTSPEED_1GFC 0x00000001 /* 1G FC */
#define HBA_PORTSPEED_2GBIT 0x0002 /* 2 GBit/sec */ #define HBA_PORTSPEED_2GFC 0x00000002 /* 2G FC */
#define HBA_PORTSPEED_4GBIT 0x0008 /* 4 GBit/sec */ #define HBA_PORTSPEED_4GFC 0x00000008 /* 4G FC */
#define HBA_PORTSPEED_10GBIT 0x0004 /* 10 GBit/sec */ #define HBA_PORTSPEED_10GFC 0x00000004 /* 10G FC */
#define HBA_PORTSPEED_8GBIT 0x0010 /* 8 GBit/sec */ #define HBA_PORTSPEED_8GFC 0x00000010 /* 8G FC */
#define HBA_PORTSPEED_16GBIT 0x0020 /* 16 GBit/sec */ #define HBA_PORTSPEED_16GFC 0x00000020 /* 16G FC */
#define HBA_PORTSPEED_32GBIT 0x0040 /* 32 GBit/sec */ #define HBA_PORTSPEED_32GFC 0x00000040 /* 32G FC */
#define HBA_PORTSPEED_UNKNOWN 0x0800 /* Unknown */ #define HBA_PORTSPEED_20GFC 0x00000080 /* 20G FC */
#define HBA_PORTSPEED_40GFC 0x00000100 /* 40G FC */
#define HBA_PORTSPEED_128GFC 0x00000200 /* 128G FC */
#define HBA_PORTSPEED_64GFC 0x00000400 /* 64G FC */
#define HBA_PORTSPEED_256GFC 0x00000800 /* 256G FC */
#define HBA_PORTSPEED_UNKNOWN 0x00008000 /* Unknown */
#define HBA_PORTSPEED_10GE 0x00010000 /* 10G E */
#define HBA_PORTSPEED_40GE 0x00020000 /* 40G E */
#define HBA_PORTSPEED_100GE 0x00040000 /* 100G E */
#define HBA_PORTSPEED_25GE 0x00080000 /* 25G E */
#define HBA_PORTSPEED_50GE 0x00100000 /* 50G E */
#define HBA_PORTSPEED_400GE 0x00200000 /* 400G E */
#define FOURBYTES 4 #define FOURBYTES 4
...@@ -1921,20 +1932,38 @@ lpfc_fdmi_port_attr_support_speed(struct lpfc_vport *vport, ...@@ -1921,20 +1932,38 @@ lpfc_fdmi_port_attr_support_speed(struct lpfc_vport *vport,
ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue; ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
ae->un.AttrInt = 0; ae->un.AttrInt = 0;
if (phba->lmt & LMT_32Gb) if (!(phba->hba_flag & HBA_FCOE_MODE)) {
ae->un.AttrInt |= HBA_PORTSPEED_32GBIT; if (phba->lmt & LMT_32Gb)
if (phba->lmt & LMT_16Gb) ae->un.AttrInt |= HBA_PORTSPEED_32GFC;
ae->un.AttrInt |= HBA_PORTSPEED_16GBIT; if (phba->lmt & LMT_16Gb)
if (phba->lmt & LMT_10Gb) ae->un.AttrInt |= HBA_PORTSPEED_16GFC;
ae->un.AttrInt |= HBA_PORTSPEED_10GBIT; if (phba->lmt & LMT_10Gb)
if (phba->lmt & LMT_8Gb) ae->un.AttrInt |= HBA_PORTSPEED_10GFC;
ae->un.AttrInt |= HBA_PORTSPEED_8GBIT; if (phba->lmt & LMT_8Gb)
if (phba->lmt & LMT_4Gb) ae->un.AttrInt |= HBA_PORTSPEED_8GFC;
ae->un.AttrInt |= HBA_PORTSPEED_4GBIT; if (phba->lmt & LMT_4Gb)
if (phba->lmt & LMT_2Gb) ae->un.AttrInt |= HBA_PORTSPEED_4GFC;
ae->un.AttrInt |= HBA_PORTSPEED_2GBIT; if (phba->lmt & LMT_2Gb)
if (phba->lmt & LMT_1Gb) ae->un.AttrInt |= HBA_PORTSPEED_2GFC;
ae->un.AttrInt |= HBA_PORTSPEED_1GBIT; if (phba->lmt & LMT_1Gb)
ae->un.AttrInt |= HBA_PORTSPEED_1GFC;
} else {
/* FCoE links support only one speed */
switch (phba->fc_linkspeed) {
case LPFC_ASYNC_LINK_SPEED_10GBPS:
ae->un.AttrInt = HBA_PORTSPEED_10GE;
break;
case LPFC_ASYNC_LINK_SPEED_25GBPS:
ae->un.AttrInt = HBA_PORTSPEED_25GE;
break;
case LPFC_ASYNC_LINK_SPEED_40GBPS:
ae->un.AttrInt = HBA_PORTSPEED_40GE;
break;
case LPFC_ASYNC_LINK_SPEED_100GBPS:
ae->un.AttrInt = HBA_PORTSPEED_100GE;
break;
}
}
ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt); ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
size = FOURBYTES + sizeof(uint32_t); size = FOURBYTES + sizeof(uint32_t);
ad->AttrLen = cpu_to_be16(size); ad->AttrLen = cpu_to_be16(size);
...@@ -1952,32 +1981,53 @@ lpfc_fdmi_port_attr_speed(struct lpfc_vport *vport, ...@@ -1952,32 +1981,53 @@ lpfc_fdmi_port_attr_speed(struct lpfc_vport *vport,
ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue; ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
switch (phba->fc_linkspeed) { if (!(phba->hba_flag & HBA_FCOE_MODE)) {
case LPFC_LINK_SPEED_1GHZ: switch (phba->fc_linkspeed) {
ae->un.AttrInt = HBA_PORTSPEED_1GBIT; case LPFC_LINK_SPEED_1GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_1GFC;
case LPFC_LINK_SPEED_2GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_2GBIT; case LPFC_LINK_SPEED_2GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_2GFC;
case LPFC_LINK_SPEED_4GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_4GBIT; case LPFC_LINK_SPEED_4GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_4GFC;
case LPFC_LINK_SPEED_8GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_8GBIT; case LPFC_LINK_SPEED_8GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_8GFC;
case LPFC_LINK_SPEED_10GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_10GBIT; case LPFC_LINK_SPEED_10GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_10GFC;
case LPFC_LINK_SPEED_16GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_16GBIT; case LPFC_LINK_SPEED_16GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_16GFC;
case LPFC_LINK_SPEED_32GHZ: break;
ae->un.AttrInt = HBA_PORTSPEED_32GBIT; case LPFC_LINK_SPEED_32GHZ:
break; ae->un.AttrInt = HBA_PORTSPEED_32GFC;
default: break;
ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN; default:
break; ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
break;
}
} else {
switch (phba->fc_linkspeed) {
case LPFC_ASYNC_LINK_SPEED_10GBPS:
ae->un.AttrInt = HBA_PORTSPEED_10GE;
break;
case LPFC_ASYNC_LINK_SPEED_25GBPS:
ae->un.AttrInt = HBA_PORTSPEED_25GE;
break;
case LPFC_ASYNC_LINK_SPEED_40GBPS:
ae->un.AttrInt = HBA_PORTSPEED_40GE;
break;
case LPFC_ASYNC_LINK_SPEED_100GBPS:
ae->un.AttrInt = HBA_PORTSPEED_100GE;
break;
default:
ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
break;
}
} }
ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt); ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
size = FOURBYTES + sizeof(uint32_t); size = FOURBYTES + sizeof(uint32_t);
ad->AttrLen = cpu_to_be16(size); ad->AttrLen = cpu_to_be16(size);
......
...@@ -4749,6 +4749,9 @@ lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba) ...@@ -4749,6 +4749,9 @@ lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba)
case LPFC_LINK_SPEED_16GHZ: case LPFC_LINK_SPEED_16GHZ:
rdp_speed = RDP_PS_16GB; rdp_speed = RDP_PS_16GB;
break; break;
case LPFC_LINK_SPEED_32GHZ:
rdp_speed = RDP_PS_32GB;
break;
default: default:
rdp_speed = RDP_PS_UNKNOWN; rdp_speed = RDP_PS_UNKNOWN;
break; break;
......
...@@ -3037,19 +3037,22 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la) ...@@ -3037,19 +3037,22 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
uint32_t fc_flags = 0; uint32_t fc_flags = 0;
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->hbalock);
switch (bf_get(lpfc_mbx_read_top_link_spd, la)) { phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la);
case LPFC_LINK_SPEED_1GHZ:
case LPFC_LINK_SPEED_2GHZ: if (!(phba->hba_flag & HBA_FCOE_MODE)) {
case LPFC_LINK_SPEED_4GHZ: switch (bf_get(lpfc_mbx_read_top_link_spd, la)) {
case LPFC_LINK_SPEED_8GHZ: case LPFC_LINK_SPEED_1GHZ:
case LPFC_LINK_SPEED_10GHZ: case LPFC_LINK_SPEED_2GHZ:
case LPFC_LINK_SPEED_16GHZ: case LPFC_LINK_SPEED_4GHZ:
case LPFC_LINK_SPEED_32GHZ: case LPFC_LINK_SPEED_8GHZ:
phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la); case LPFC_LINK_SPEED_10GHZ:
break; case LPFC_LINK_SPEED_16GHZ:
default: case LPFC_LINK_SPEED_32GHZ:
phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN; break;
break; default:
phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN;
break;
}
} }
if (phba->fc_topology && if (phba->fc_topology &&
......
...@@ -3317,6 +3317,7 @@ struct lpfc_acqe_link { ...@@ -3317,6 +3317,7 @@ struct lpfc_acqe_link {
#define LPFC_ASYNC_LINK_SPEED_20GBPS 0x5 #define LPFC_ASYNC_LINK_SPEED_20GBPS 0x5
#define LPFC_ASYNC_LINK_SPEED_25GBPS 0x6 #define LPFC_ASYNC_LINK_SPEED_25GBPS 0x6
#define LPFC_ASYNC_LINK_SPEED_40GBPS 0x7 #define LPFC_ASYNC_LINK_SPEED_40GBPS 0x7
#define LPFC_ASYNC_LINK_SPEED_100GBPS 0x8
#define lpfc_acqe_link_duplex_SHIFT 16 #define lpfc_acqe_link_duplex_SHIFT 16
#define lpfc_acqe_link_duplex_MASK 0x000000FF #define lpfc_acqe_link_duplex_MASK 0x000000FF
#define lpfc_acqe_link_duplex_WORD word0 #define lpfc_acqe_link_duplex_WORD word0
......
...@@ -3709,49 +3709,6 @@ lpfc_sli4_parse_latt_type(struct lpfc_hba *phba, ...@@ -3709,49 +3709,6 @@ lpfc_sli4_parse_latt_type(struct lpfc_hba *phba,
return att_type; return att_type;
} }
/**
* lpfc_sli4_parse_latt_link_speed - Parse sli4 link-attention link speed
* @phba: pointer to lpfc hba data structure.
* @acqe_link: pointer to the async link completion queue entry.
*
* This routine is to parse the SLI4 link-attention link speed and translate
* it into the base driver's link-attention link speed coding.
*
* Return: Link-attention link speed in terms of base driver's coding.
**/
static uint8_t
lpfc_sli4_parse_latt_link_speed(struct lpfc_hba *phba,
struct lpfc_acqe_link *acqe_link)
{
uint8_t link_speed;
switch (bf_get(lpfc_acqe_link_speed, acqe_link)) {
case LPFC_ASYNC_LINK_SPEED_ZERO:
case LPFC_ASYNC_LINK_SPEED_10MBPS:
case LPFC_ASYNC_LINK_SPEED_100MBPS:
link_speed = LPFC_LINK_SPEED_UNKNOWN;
break;
case LPFC_ASYNC_LINK_SPEED_1GBPS:
link_speed = LPFC_LINK_SPEED_1GHZ;
break;
case LPFC_ASYNC_LINK_SPEED_10GBPS:
link_speed = LPFC_LINK_SPEED_10GHZ;
break;
case LPFC_ASYNC_LINK_SPEED_20GBPS:
case LPFC_ASYNC_LINK_SPEED_25GBPS:
case LPFC_ASYNC_LINK_SPEED_40GBPS:
link_speed = LPFC_LINK_SPEED_UNKNOWN;
break;
default:
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
"0483 Invalid link-attention link speed: x%x\n",
bf_get(lpfc_acqe_link_speed, acqe_link));
link_speed = LPFC_LINK_SPEED_UNKNOWN;
break;
}
return link_speed;
}
/** /**
* lpfc_sli_port_speed_get - Get sli3 link speed code to link speed * lpfc_sli_port_speed_get - Get sli3 link speed code to link speed
* @phba: pointer to lpfc hba data structure. * @phba: pointer to lpfc hba data structure.
...@@ -3768,27 +3725,35 @@ lpfc_sli_port_speed_get(struct lpfc_hba *phba) ...@@ -3768,27 +3725,35 @@ lpfc_sli_port_speed_get(struct lpfc_hba *phba)
if (!lpfc_is_link_up(phba)) if (!lpfc_is_link_up(phba))
return 0; return 0;
switch (phba->fc_linkspeed) { if (phba->sli_rev <= LPFC_SLI_REV3) {
case LPFC_LINK_SPEED_1GHZ: switch (phba->fc_linkspeed) {
link_speed = 1000; case LPFC_LINK_SPEED_1GHZ:
break; link_speed = 1000;
case LPFC_LINK_SPEED_2GHZ: break;
link_speed = 2000; case LPFC_LINK_SPEED_2GHZ:
break; link_speed = 2000;
case LPFC_LINK_SPEED_4GHZ: break;
link_speed = 4000; case LPFC_LINK_SPEED_4GHZ:
break; link_speed = 4000;
case LPFC_LINK_SPEED_8GHZ: break;
link_speed = 8000; case LPFC_LINK_SPEED_8GHZ:
break; link_speed = 8000;
case LPFC_LINK_SPEED_10GHZ: break;
link_speed = 10000; case LPFC_LINK_SPEED_10GHZ:
break; link_speed = 10000;
case LPFC_LINK_SPEED_16GHZ: break;
link_speed = 16000; case LPFC_LINK_SPEED_16GHZ:
break; link_speed = 16000;
default: break;
link_speed = 0; default:
link_speed = 0;
}
} else {
if (phba->sli4_hba.link_state.logical_speed)
link_speed =
phba->sli4_hba.link_state.logical_speed;
else
link_speed = phba->sli4_hba.link_state.speed;
} }
return link_speed; return link_speed;
} }
...@@ -3984,7 +3949,7 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba, ...@@ -3984,7 +3949,7 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
la->eventTag = acqe_link->event_tag; la->eventTag = acqe_link->event_tag;
bf_set(lpfc_mbx_read_top_att_type, la, att_type); bf_set(lpfc_mbx_read_top_att_type, la, att_type);
bf_set(lpfc_mbx_read_top_link_spd, la, bf_set(lpfc_mbx_read_top_link_spd, la,
lpfc_sli4_parse_latt_link_speed(phba, acqe_link)); (bf_get(lpfc_acqe_link_speed, acqe_link)));
/* Fake the the following irrelvant fields */ /* Fake the the following irrelvant fields */
bf_set(lpfc_mbx_read_top_topology, la, LPFC_TOPOLOGY_PT_PT); bf_set(lpfc_mbx_read_top_topology, la, LPFC_TOPOLOGY_PT_PT);
......
...@@ -4461,15 +4461,7 @@ lpfc_info(struct Scsi_Host *host) ...@@ -4461,15 +4461,7 @@ lpfc_info(struct Scsi_Host *host)
phba->Port); phba->Port);
} }
len = strlen(lpfcinfobuf); len = strlen(lpfcinfobuf);
if (phba->sli_rev <= LPFC_SLI_REV3) { link_speed = lpfc_sli_port_speed_get(phba);
link_speed = lpfc_sli_port_speed_get(phba);
} else {
if (phba->sli4_hba.link_state.logical_speed)
link_speed =
phba->sli4_hba.link_state.logical_speed;
else
link_speed = phba->sli4_hba.link_state.speed;
}
if (link_speed != 0) if (link_speed != 0)
snprintf(lpfcinfobuf + len, 384-len, snprintf(lpfcinfobuf + len, 384-len,
" Logical Link Speed: %d Mbps", link_speed); " Logical Link Speed: %d Mbps", link_speed);
......
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