diff options
Diffstat (limited to 'drivers/scsi/bfa')
-rw-r--r-- | drivers/scsi/bfa/lport_api.c | 30 | ||||
-rw-r--r-- | drivers/scsi/bfa/rport_api.c | 11 | ||||
-rw-r--r-- | drivers/scsi/bfa/rport_ftrs.c | 1 |
3 files changed, 30 insertions, 12 deletions
diff --git a/drivers/scsi/bfa/lport_api.c b/drivers/scsi/bfa/lport_api.c index d3907d184e2b..72b3f508d0e9 100644 --- a/drivers/scsi/bfa/lport_api.c +++ b/drivers/scsi/bfa/lport_api.c | |||
@@ -137,6 +137,8 @@ bfa_fcs_port_get_rports(struct bfa_fcs_port_s *port, wwn_t rport_wwns[], | |||
137 | /* | 137 | /* |
138 | * Iterate's through all the rport's in the given port to | 138 | * Iterate's through all the rport's in the given port to |
139 | * determine the maximum operating speed. | 139 | * determine the maximum operating speed. |
140 | * | ||
141 | * To be used in TRL Functionality only | ||
140 | */ | 142 | */ |
141 | enum bfa_pport_speed | 143 | enum bfa_pport_speed |
142 | bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) | 144 | bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) |
@@ -146,7 +148,8 @@ bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) | |||
146 | struct bfa_fcs_s *fcs; | 148 | struct bfa_fcs_s *fcs; |
147 | enum bfa_pport_speed max_speed = 0; | 149 | enum bfa_pport_speed max_speed = 0; |
148 | struct bfa_pport_attr_s pport_attr; | 150 | struct bfa_pport_attr_s pport_attr; |
149 | enum bfa_pport_speed pport_speed; | 151 | enum bfa_pport_speed pport_speed, rport_speed; |
152 | bfa_boolean_t trl_enabled = bfa_fcport_is_ratelim(port->fcs->bfa); | ||
150 | 153 | ||
151 | if (port == NULL) | 154 | if (port == NULL) |
152 | return 0; | 155 | return 0; |
@@ -164,19 +167,28 @@ bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) | |||
164 | qe = bfa_q_first(qh); | 167 | qe = bfa_q_first(qh); |
165 | 168 | ||
166 | while (qe != qh) { | 169 | while (qe != qh) { |
167 | rport = (struct bfa_fcs_rport_s *)qe; | 170 | rport = (struct bfa_fcs_rport_s *) qe; |
168 | if ((bfa_os_ntoh3b(rport->pid) > 0xFFF000) | 171 | if ((bfa_os_ntoh3b(rport->pid) > 0xFFF000) || |
169 | || (bfa_fcs_rport_get_state(rport) == BFA_RPORT_OFFLINE)) { | 172 | (bfa_fcs_rport_get_state(rport) == |
173 | BFA_RPORT_OFFLINE)) { | ||
170 | qe = bfa_q_next(qe); | 174 | qe = bfa_q_next(qe); |
171 | continue; | 175 | continue; |
172 | } | 176 | } |
173 | 177 | ||
174 | if ((rport->rpf.rpsc_speed == BFA_PPORT_SPEED_8GBPS) | 178 | rport_speed = rport->rpf.rpsc_speed; |
175 | || (rport->rpf.rpsc_speed > pport_speed)) { | 179 | if ((trl_enabled) && (rport_speed == |
176 | max_speed = rport->rpf.rpsc_speed; | 180 | BFA_PPORT_SPEED_UNKNOWN)) { |
181 | /* Use default ratelim speed setting */ | ||
182 | rport_speed = | ||
183 | bfa_fcport_get_ratelim_speed(port->fcs->bfa); | ||
184 | } | ||
185 | |||
186 | if ((rport_speed == BFA_PPORT_SPEED_8GBPS) || | ||
187 | (rport_speed > pport_speed)) { | ||
188 | max_speed = rport_speed; | ||
177 | break; | 189 | break; |
178 | } else if (rport->rpf.rpsc_speed > max_speed) { | 190 | } else if (rport_speed > max_speed) { |
179 | max_speed = rport->rpf.rpsc_speed; | 191 | max_speed = rport_speed; |
180 | } | 192 | } |
181 | 193 | ||
182 | qe = bfa_q_next(qe); | 194 | qe = bfa_q_next(qe); |
diff --git a/drivers/scsi/bfa/rport_api.c b/drivers/scsi/bfa/rport_api.c index a441f41d2a64..15e0c470afd9 100644 --- a/drivers/scsi/bfa/rport_api.c +++ b/drivers/scsi/bfa/rport_api.c | |||
@@ -83,6 +83,7 @@ bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, | |||
83 | { | 83 | { |
84 | struct bfa_rport_qos_attr_s qos_attr; | 84 | struct bfa_rport_qos_attr_s qos_attr; |
85 | struct bfa_fcs_port_s *port = rport->port; | 85 | struct bfa_fcs_port_s *port = rport->port; |
86 | enum bfa_pport_speed rport_speed = rport->rpf.rpsc_speed; | ||
86 | 87 | ||
87 | bfa_os_memset(rport_attr, 0, sizeof(struct bfa_rport_attr_s)); | 88 | bfa_os_memset(rport_attr, 0, sizeof(struct bfa_rport_attr_s)); |
88 | 89 | ||
@@ -102,10 +103,14 @@ bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, | |||
102 | rport_attr->qos_attr = qos_attr; | 103 | rport_attr->qos_attr = qos_attr; |
103 | 104 | ||
104 | rport_attr->trl_enforced = BFA_FALSE; | 105 | rport_attr->trl_enforced = BFA_FALSE; |
106 | |||
105 | if (bfa_fcport_is_ratelim(port->fcs->bfa)) { | 107 | if (bfa_fcport_is_ratelim(port->fcs->bfa)) { |
106 | if ((rport->rpf.rpsc_speed == BFA_PPORT_SPEED_UNKNOWN) || | 108 | if (rport_speed == BFA_PPORT_SPEED_UNKNOWN) { |
107 | (rport->rpf.rpsc_speed < | 109 | /* Use default ratelim speed setting */ |
108 | bfa_fcs_port_get_rport_max_speed(port))) | 110 | rport_speed = |
111 | bfa_fcport_get_ratelim_speed(rport->fcs->bfa); | ||
112 | } | ||
113 | if (rport_speed < bfa_fcs_port_get_rport_max_speed(port)) | ||
109 | rport_attr->trl_enforced = BFA_TRUE; | 114 | rport_attr->trl_enforced = BFA_TRUE; |
110 | } | 115 | } |
111 | 116 | ||
diff --git a/drivers/scsi/bfa/rport_ftrs.c b/drivers/scsi/bfa/rport_ftrs.c index acecab83f82f..f2a9361ce9a4 100644 --- a/drivers/scsi/bfa/rport_ftrs.c +++ b/drivers/scsi/bfa/rport_ftrs.c | |||
@@ -274,6 +274,7 @@ void bfa_fcs_rpf_rport_offline(struct bfa_fcs_rport_s *rport) | |||
274 | if (__fcs_min_cfg(rport->port->fcs)) | 274 | if (__fcs_min_cfg(rport->port->fcs)) |
275 | return; | 275 | return; |
276 | 276 | ||
277 | rport->rpf.rpsc_speed = 0; | ||
277 | bfa_sm_send_event(&rport->rpf, RPFSM_EVENT_RPORT_OFFLINE); | 278 | bfa_sm_send_event(&rport->rpf, RPFSM_EVENT_RPORT_OFFLINE); |
278 | } | 279 | } |
279 | 280 | ||