Linux kernel USB_get_intfdata方法后Linux USB驱动程序崩溃

Linux kernel USB_get_intfdata方法后Linux USB驱动程序崩溃,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在为USB设备编写自己的字符驱动程序,该设备需要使用ctrl传输进行简单的写入,使用中断传输进行读取。我的设备有2个接口,对于zero接口,我可以得到中断端点,所以基本上我不需要处理第二个接口,它包含bulk,ISCO,所以当bInterfaceNumber为1时,我从probe函数返回-ENODEV。下面是代码片段 static int USBTestMode_Probe(struct usb_interface *interface, const struct usb_device_id

我正在为USB设备编写自己的字符驱动程序,该设备需要使用ctrl传输进行简单的写入,使用中断传输进行读取。我的设备有2个接口,对于zero接口,我可以得到中断端点,所以基本上我不需要处理第二个接口,它包含bulk,ISCO,所以当bInterfaceNumber为1时,我从probe函数返回-ENODEV。下面是代码片段

static int USBTestMode_Probe(struct usb_interface *interface, const struct usb_device_id *id)
{
    if(interface->cur_altsetting->desc.bInterfaceNumber != 0)
    {   
        return   -ENODEV; 
    }
    struct usb_device *udev = interface_to_usbdev(interface);
    struct usb_test_mode_dev * testModeDev = NULL;

    struct usb_host_interface *iface_desc;
    struct usb_endpoint_descriptor *endpoint;
    int i, int_end_size;
    int retval = -ENODEV;



    TestModeclass.name = "testmode%d";
    TestModeclass.fops = &USBTestModefops;

    testModeDev = kzalloc(sizeof(struct usb_test_mode_dev),GFP_KERNEL);
    strcpy(testModeDev->buffer , "mydata");
    printk("size::%d\n", sizeof(struct usb_test_mode_dev));
    printk("testModeDev size::%d\n", sizeof(testModeDev));
    printk("name :%s\n",testModeDev->buffer);
    if(testModeDev == NULL)
    {
      printk("No Memory ):");
      goto exit;
    }

    testModeDev->udev = usb_get_dev(udev);
    testModeDev->interface = interface;
    iface_desc = interface->cur_altsetting;
    testModeDev->int_in_endpoint = kzalloc(sizeof(struct usb_endpoint_descriptor),GFP_KERNEL);


    for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
        endpoint = &iface_desc->endpoint[i].desc;

        if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
             == USB_DIR_IN)
            && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
                == USB_ENDPOINT_XFER_INT))
            memcpy(testModeDev->int_in_endpoint , endpoint ,sizeof(endpoint));

    }
    if (! testModeDev->int_in_endpoint) {
        printk("could not find interrupt in endpoint");
        goto error;
    }

        printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
        printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);

    int_end_size = le16_to_cpu(testModeDev->int_in_endpoint->wMaxPacketSize);

    testModeDev->int_in_buffer = kzalloc(int_end_size, GFP_KERNEL);

        printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
        printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);

    if (! testModeDev->int_in_buffer) {
        printk("could not allocate int_in_buffer");
        retval = -ENOMEM;
        goto error;
    }

    testModeDev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
    if (! testModeDev->int_in_urb) {
        printk("could not allocate int_in_urb");
        retval = -ENOMEM;
        goto error;
    }

        printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
        printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);


    // Save our data pointer in this interface device. 
    usb_set_intfdata(interface, testModeDev);

        printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
        printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);

    // We can register the device now, as it is ready.
    retval = usb_register_dev(interface, &TestModeclass);
    if (retval) {
        printk("not able to get a minor for this device.");
        usb_set_intfdata(interface, NULL);
        goto error;
    }

    testModeDev->minor = interface->minor;

    printk("TestUSB now attached to /dev/TestMode%d\n",
            interface->minor - 0);


error:
    TestMode_delete(testModeDev);
exit:
    return retval;
return 0;
}
当我试图访问端点中的dev->int\u时,模块崩溃,甚至缓冲区仍然是空的。为什么我的数据结构保存在probe中被覆盖。这是因为我的设备有多个接口。请帮帮我。如果你想要我的字符设备的数据结构,下面是代码

struct usb_test_mode_dev {
       struct usb_device *udev;
       unsigned char *int_in_buffer;
       struct usb_interface *interface;
       struct usb_endpoint_descriptor *int_in_endpoint;
       struct urb *int_in_urb;
       unsigned char    minor;
       char buffer[20];
};
提前谢谢

usb_set_intfdata(interface, testModeDev); is at wrong place , should be called before return in probe method
usb_set_intfdata(interface, testModeDev); is at wrong place , should be called before return in probe method