Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] zfcp: Adapt to new FC_PORTSPEED semantics

Commit a9277e7783651d4e0a849f7988340b1c1cf748a4
"[SCSI] scsi_transport_fc: Getting FC Port Speed in sync with FC-GS"
changed the semantics of FC_PORTSPEED defines to
FDMI port attributes of FC-HBA/SM-HBA
which is different from the previous bit reversed
Report Port Speed Capabilities (RPSC) ELS of FC-GS/FC-LS.

Zfcp showed "10 Gbit" instead of "4 Gbit" for supported_speeds.
It now uses explicit bit conversion as the other LLDs already
do, in order to be independent of the kernel bit semantics.
See also http://marc.info/?l=linux-scsi&m=134452926830730&w=2

Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
Reviewed-by: Martin Peschke <mpeschke@linux.vnet.ibm.com>
Cc: <stable@vger.kernel.org> #3.4+
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

authored by

Steffen Maier and committed by
James Bottomley
d2201977 16da05b1

+32 -2
+32 -2
drivers/s390/scsi/zfcp_fsf.c
··· 437 437 } 438 438 } 439 439 440 + #define ZFCP_FSF_PORTSPEED_1GBIT (1 << 0) 441 + #define ZFCP_FSF_PORTSPEED_2GBIT (1 << 1) 442 + #define ZFCP_FSF_PORTSPEED_4GBIT (1 << 2) 443 + #define ZFCP_FSF_PORTSPEED_10GBIT (1 << 3) 444 + #define ZFCP_FSF_PORTSPEED_8GBIT (1 << 4) 445 + #define ZFCP_FSF_PORTSPEED_16GBIT (1 << 5) 446 + #define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15) 447 + 448 + static u32 zfcp_fsf_convert_portspeed(u32 fsf_speed) 449 + { 450 + u32 fdmi_speed = 0; 451 + if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT) 452 + fdmi_speed |= FC_PORTSPEED_1GBIT; 453 + if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT) 454 + fdmi_speed |= FC_PORTSPEED_2GBIT; 455 + if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT) 456 + fdmi_speed |= FC_PORTSPEED_4GBIT; 457 + if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT) 458 + fdmi_speed |= FC_PORTSPEED_10GBIT; 459 + if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT) 460 + fdmi_speed |= FC_PORTSPEED_8GBIT; 461 + if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT) 462 + fdmi_speed |= FC_PORTSPEED_16GBIT; 463 + if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED) 464 + fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED; 465 + return fdmi_speed; 466 + } 467 + 440 468 static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) 441 469 { 442 470 struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config; ··· 484 456 fc_host_port_name(shost) = nsp->fl_wwpn; 485 457 fc_host_node_name(shost) = nsp->fl_wwnn; 486 458 fc_host_port_id(shost) = ntoh24(bottom->s_id); 487 - fc_host_speed(shost) = bottom->fc_link_speed; 459 + fc_host_speed(shost) = 460 + zfcp_fsf_convert_portspeed(bottom->fc_link_speed); 488 461 fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; 489 462 490 463 adapter->hydra_version = bottom->adapter_type; ··· 609 580 } else 610 581 fc_host_permanent_port_name(shost) = fc_host_port_name(shost); 611 582 fc_host_maxframe_size(shost) = bottom->maximum_frame_size; 612 - fc_host_supported_speeds(shost) = bottom->supported_speed; 583 + fc_host_supported_speeds(shost) = 584 + zfcp_fsf_convert_portspeed(bottom->supported_speed); 613 585 memcpy(fc_host_supported_fc4s(shost), bottom->supported_fc4_types, 614 586 FC_FC4_LIST_SIZE); 615 587 memcpy(fc_host_active_fc4s(shost), bottom->active_fc4_types,