On Mon, 2012-03-26 at 00:07 -0700, Bhanu Prakash Gollapudi wrote:
> On 3/22/2012 12:23 PM, Bhanu Prakash Gollapudi wrote:
> > On 3/22/2012 10:38 AM, Vasu Dev wrote:
> >> On Thu, 2012-03-22 at 11:03 -0700, Bhanu Prakash Gollapudi wrote:
> >>> On 2/14/2012 5:34 PM, Vasu Dev wrote:
> >>>> Currently fc_host mfs is not getting updated in
> >>>> case its changed during FLOGI and that leaves fc_host
> >>>> to show its initial old value in sysfs, so instead
> >>>> have fc_host mfs updated along with updating lport mfs
> >>>> during FLOGI.
> >>>>
> >>>> Also in case of bad mfs during flogi, error out
> >>>> instead of continuing with flogi.
> >>>>
> >>>> Signed-off-by: Vasu Dev<[email protected]>
> >>>> Tested-by: Ross Brattain<[email protected]>
> >>>> ---
> >>>>
> >>>>     drivers/scsi/libfc/fc_lport.c |    9 ++++++++-
> >>>>     1 files changed, 8 insertions(+), 1 deletions(-)
> >>>>
> >>>> diff --git a/drivers/scsi/libfc/fc_lport.c 
> >>>> b/drivers/scsi/libfc/fc_lport.c
> >>>> index 9a0b2a9..a992692 100644
> >>>> --- a/drivers/scsi/libfc/fc_lport.c
> >>>> +++ b/drivers/scsi/libfc/fc_lport.c
> >>>> @@ -1743,8 +1743,15 @@ void fc_lport_flogi_resp(struct fc_seq *sp, 
> >>>> struct fc_frame *fp,
> >>>>          mfs = ntohs(flp->fl_csp.sp_bb_data)&
> >>>>                  FC_SP_BB_DATA_MASK;
> >>>>          if (mfs>= FC_SP_MIN_MAX_PAYLOAD&&
> >>>> -            mfs<    lport->mfs)
> >>>> +            mfs<    lport->mfs) {
> >>>>                  lport->mfs = mfs;
> >>>> +                fc_host_maxframe_size(lport->host) = mfs;
> >>>> +        } else {
> >>>> +                FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response\n", 
> >>>> mfs);
> >>>> +                fc_lport_error(lport, fp);
> >>>> +                goto err;
> >>>> +        }
> >>>> +
> >>>
> >>> Vasu, sorry for not getting back to you on this earlier, but I found
> >>> that this check does not allow the FLOGI to succeed on Broadcom devices.
> >>> We have max frame size set to 2048 even if FLOGI resp indicates 2112.
> >>
> >> Failure with 2112 was due to existing wrong check prio to this check as
> >> mfs<   lport->mfs and that triggered after else condition was added by
> >> this patch. The final updated patch fixed to allow  flogi response with
> >> 2112 also by modifying check as mfs<= lport->mfs and that is the one
> >> applied to the tree by Rob at and that should work:
> >>
> >> http://www.open-fcoe.org/git/?p=fcoe/fcoe-next.git;a=commitdiff;h=4394b32e1728196407af14b4527abaada1b938c2;hp=355dff86cf1c0a7f054c17bf1f9dfed69ec5625e
> >
> > I saw the failure with latest code (with<= change).
> >
> >>
> >>
> >>>
> >>> Even for fcoe driver, with default MTU of 1500, FLOGI is not going to
> >>> succeed.   Probably if we want to retry, we should check only for
> >>> MIN_MAX_PAYLOAD.
> >>
> >> Modified check ensure response not to exceed n-port mfs and that should
> >> work for this case also.
> >
> > During FLOGI we advertise our mfs (Receive data field size). But switch
> > advertised mfs in FLOGI ACC need not match with what we have. It
> > advertises what it supports.  In our case, we advertise mfs as
> > 2K(0x800), and in FLOGI ACC switch sends 2112 (0x840).  The check above
> > fails because of this, but this doesn't mean a bad response.
> >
> > Thanks,
> > Bhanu
> 
> Vasu, This patch should do the checks you intended, and yet works with 
> drivers that can work with mfs lower than the switch advertised value.
> 
> diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
> index 4f7ef76..5ec556e 100644
> --- a/drivers/scsi/libfc/fc_lport.c
> +++ b/drivers/scsi/libfc/fc_lport.c
> @@ -1742,17 +1742,19 @@ void fc_lport_flogi_resp(struct fc_seq *sp, 
> struct fc_fr
> 
>          mfs = ntohs(flp->fl_csp.sp_bb_data) &
>                  FC_SP_BB_DATA_MASK;
> -       if (mfs >= FC_SP_MIN_MAX_PAYLOAD &&
> -           mfs <= lport->mfs) {
> -               lport->mfs = mfs;
> -               fc_host_maxframe_size(lport->host) = mfs;
> -       } else {
> +
> +       if (mfs < FC_SP_MIN_MAX_PAYLOAD && mfs > FC_SP_MAX_MAX_PAYLOAD) {

This check comply to FC-FS-03 sec 15.6.2.6 for "The value shall be a
multiple of four bytes. Values less than 256 or greater than 2 112 are
invalid. An Fx_Port shall support a Data Field size of at least 256
bytes.", so its good though its kind of odd for having MFS 2112 in
response while N_PORT indicated 2048 in your case. I'd expect protocol
to proceed with minimum of two.

>                  FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, "
>                               "lport->mfs:%hu\n", mfs, lport->mfs);
>                  fc_lport_error(lport, fp);
>                  goto err;
>          }
> 
> +       if (mfs <= lport->mfs) {
> +               lport->mfs = mfs;
> +               fc_host_maxframe_size(lport->host) = mfs;
> +       }

Yeap, this would update mfs in case switch sends 2048 in response to
2112 n_port mfs and that is what I wanted.

> +
>          csp_flags = ntohs(flp->fl_csp.sp_features);
>          r_a_tov = ntohl(flp->fl_csp.sp_r_a_tov);
>          e_d_tov = ntohl(flp->fl_csp.sp_e_d_tov);
> 
> Let me know if you have any comments. I'll send a formal patch if this 
> is fine with you.
> 

Good to go  and sorry for late response.
Thanks
Vasu

> Thanks,
> Bhanu
> 
> >
> >>
> >> Thanks
> >> Vasu
> >>
> >>
> >>
> >
> >
> > _______________________________________________
> > devel mailing list
> > [email protected]
> > https://lists.open-fcoe.org/mailman/listinfo/devel
> >
> 
> 
> _______________________________________________
> devel mailing list
> [email protected]
> https://lists.open-fcoe.org/mailman/listinfo/devel


_______________________________________________
devel mailing list
[email protected]
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to