????Linux USB???????????????
????probe??usb???????????????????????USB?豸???????????????usb?????????production ID??vendor ID?????????豸??class??subclass??protocol???????????豸????????????????probe???????????????skeleton???????skel_probe?????????????????usb_interface *?????struct usb_device_id *??????????????????USB?豸??????????????????豸???0??????y??????????????0??????????????豸ID??????????Vendor ID??Production ID?????probe???????????????????????????????
????dev->udev = usb_get_dev(interface_to_usbdev(interface));
????dev->interface = interface;
?????????????Щ??????????????????????????????——interface_to_usbdev?????uo???usb_interface??????y???????豸???豸?????????????????????usb_device????interface_to_usbdev?????????????????usb_device?????ü???????????????????usb_get_dev????????????????ü?????????????豸???usb_put_dev?????????ü???????????????????????ü????????usb_device????????????????????????????????????kref????????????probe?????г????kref????????kref_init??????????????kref?????????????1?????????????????????kref_put??????kref???????1?????kref????????0?????kref??????kref_put???????????????????????????????????????????????????????kfree???ú?????????????kref????????????????????????????????????????????????????е????????????

 

/**
* kref_put - decrement refcount for object.
* @kref: object.
* @release: pointer to the function that will clean up the object when the
*        last reference to the object is released.
*        This pointer is required?? and it is not acceptable to pass kfree
*        in as this function.
*
* Decrement the refcount?? and if 0?? call release().
* Return 1 if the object was removed?? otherwise return 0.  Beware?? if this
* function returns 0?? you still can not count on the kref from remaining in
* memory.  Only use the return value if you want to see if the kref is now
* gone?? not present.
*/
int kref_put(struct kref *kref?? void (*release)(struct kref *kref))
{
WARN_ON(release == NULL);
WARN_ON(release == (void (*)(struct kref *))kfree);
/*
* if current count is one?? we are the last user and can release object
* right now?? avoiding an atomic operation on 'refcount'
*/
if ((atomic_read(&kref->refcount) == 1) ||
(atomic_dec_and_test(&kref->refcount))) {
release(kref);
return 1;
}
return 0;
}

????????????д?????????????????kref????????????????kref_get??????ɡ????ж?struct kref??????????????????????????