struct rndis_query_c    *get_c;
                struct rndis_set        *set;
                struct rndis_set_c      *set_c;
+               struct rndis_halt       *halt;
        } u;
        u32                     tmp;
        int                     reply_len;
                                "dev can't take %u byte packets (max %u)\n",
                                dev->hard_mtu, tmp);
                        retval = -EINVAL;
-                       goto fail_and_release;
+                       goto halt_fail_and_release;
                }
                dev->hard_mtu = tmp;
                net->mtu = dev->hard_mtu - net->hard_header_len;
                        48, (void **) &bp, &reply_len);
        if (unlikely(retval< 0)) {
                dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval);
-               goto fail_and_release;
+               goto halt_fail_and_release;
        }
        memcpy(net->dev_addr, bp, ETH_ALEN);
 
        retval = rndis_command(dev, u.header);
        if (unlikely(retval < 0)) {
                dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
-               goto fail_and_release;
+               goto halt_fail_and_release;
        }
 
        retval = 0;
        kfree(u.buf);
        return retval;
 
+halt_fail_and_release:
+       memset(u.halt, 0, sizeof *u.halt);
+       u.halt->msg_type = RNDIS_MSG_HALT;
+       u.halt->msg_len = ccpu2(sizeof *u.halt);
+       (void) rndis_command(dev, (void *)u.halt);
 fail_and_release:
        usb_set_intfdata(info->data, NULL);
        usb_driver_release_interface(driver_of(intf), info->data);