On Thu, Jul 13, 2017 at 14:04 +0200, Mike Belopuhov wrote:
> On Wed, Jul 12, 2017 at 21:04 +0000, Jonathan Armani wrote:
> > Hi,
> > 
> > Thanks I was cooking the same diff.
> > 
> > Ok armani@
> > 
> 
> Hi, thanks! I want to get rid of printfs though and
> return errors (or unhandled status codes) so that we
> don't paper over them. In theory, all error codes that
> I've seen in the ndis.h from the DDK have the MSB set,
> i.e. (rval & 0x80000000) != 0 for those, but doing it
> would be a bit too hackish IMO. However, if we go down
> this road the rval check can be rewritten as:
> 
>       /* Not an error */
>       if ((rval & 0x80000000) == 0)
>               rval = RNDIS_STATUS_SUCCESS;
>       else
>               printf("%s: status 0x%x\n", DEVNAME(sc), rval);
> 
> Is this something we want to do?
> 
> I was also going to add sc_link toggled by those status
> codes and check it in the urndis_start like other USB
> Ethernet drivers do, but decided against it cause this
> would break other devices that don't send this message.
>

Hi,

Since I haven't heard anything from any of you, I'm assuming
that the diff below is the way to go (since that's what Artturi
has tested essentially).  I'll wait another day and check this
in tomorrow (July 19).

Cheers,
Mike

> 
> diff --git sys/dev/usb/if_urndis.c sys/dev/usb/if_urndis.c
> index 4af6b55cf05..956207f73a8 100644
> --- sys/dev/usb/if_urndis.c
> +++ sys/dev/usb/if_urndis.c
> @@ -88,10 +88,12 @@ u_int32_t urndis_ctrl_handle_init(struct urndis_softc *,
>      const struct rndis_comp_hdr *);
>  u_int32_t urndis_ctrl_handle_query(struct urndis_softc *,
>      const struct rndis_comp_hdr *, void **, size_t *);
>  u_int32_t urndis_ctrl_handle_reset(struct urndis_softc *,
>      const struct rndis_comp_hdr *);
> +u_int32_t urndis_ctrl_handle_status(struct urndis_softc *,
> +    const struct rndis_comp_hdr *);
>  
>  u_int32_t urndis_ctrl_init(struct urndis_softc *);
>  u_int32_t urndis_ctrl_halt(struct urndis_softc *);
>  u_int32_t urndis_ctrl_query(struct urndis_softc *, u_int32_t, void *, size_t,
>      void **, size_t *);
> @@ -233,10 +235,14 @@ urndis_ctrl_handle(struct urndis_softc *sc, struct 
> rndis_comp_hdr *hdr,
>               case REMOTE_NDIS_KEEPALIVE_CMPLT:
>               case REMOTE_NDIS_SET_CMPLT:
>                       rval = letoh32(hdr->rm_status);
>                       break;
>  
> +             case REMOTE_NDIS_INDICATE_STATUS_MSG:
> +                     rval = urndis_ctrl_handle_status(sc, hdr);
> +                     break;
> +
>               default:
>                       printf("%s: ctrl message error: unknown event 0x%x\n",
>                           DEVNAME(sc), letoh32(hdr->rm_type));
>                       rval = RNDIS_STATUS_FAILURE;
>       }
> @@ -400,10 +406,42 @@ urndis_ctrl_handle_reset(struct urndis_softc *sc,
>  
>       return rval;
>  }
>  
>  u_int32_t
> +urndis_ctrl_handle_status(struct urndis_softc *sc,
> +    const struct rndis_comp_hdr *hdr)
> +{
> +     const struct rndis_status_msg   *msg;
> +     u_int32_t                        rval;
> +
> +     msg = (struct rndis_status_msg *)hdr;
> +
> +     rval = letoh32(msg->rm_status);
> +
> +     DPRINTF(("%s: urndis_ctrl_handle_status: len %u status 0x%x "
> +         "stbuflen %u\n",
> +         DEVNAME(sc),
> +         letoh32(msg->rm_len),
> +         rval,
> +         letoh32(msg->rm_stbuflen)));
> +
> +     switch (rval) {
> +             case RNDIS_STATUS_MEDIA_CONNECT:
> +             case RNDIS_STATUS_MEDIA_DISCONNECT:
> +             case RNDIS_STATUS_OFFLOAD_CURRENT_CONFIG:
> +                     rval = RNDIS_STATUS_SUCCESS;
> +                     break;
> +
> +             default:
> +                     printf("%s: status 0x%x\n", DEVNAME(sc), rval);
> +     }
> +
> +     return rval;
> +}
> +
> +u_int32_t
>  urndis_ctrl_init(struct urndis_softc *sc)
>  {
>       struct rndis_init_req   *msg;
>       u_int32_t                rval;
>       struct rndis_comp_hdr   *hdr;

Reply via email to